./gprolog-1.3.0/0000777004425400513100000000000010547442376012011 5ustar diazloco./gprolog-1.3.0/PROBLEMS0000644004425400513100000000365410531625030013142 0ustar diazlocosparc/sunos: under SunOs <= 4.1.2 even if the processor is a supersparc, the gcc option -msupersparc cannot be used in CFLAGS_MACHINE. The configure script omits it. Thus integer multiplication and division is very slow... sparc/solaris: you should be able to access as/ld/ar/ranlib maybe you should add /usr/ucb:/usr/ccs/bin/ ar something similar to your PATH variable ix86/win32 with Cygwin: timmings system_time is always 0 and user time = real time buffering not implemented (after setvbuf each read returns EOF) Linedit does not work if CYGWIN=TTY is defined. ix86/win32 with VC++ 6.0 and MinGW (I suppose): sockets not implemented shell/2 and system/2 do not return correct error code (due to command.com bad interpreted) popen/3 does not work (due to command.com) exec/5 does not work (due to command.com) send_signal/2 (does not work apparently) select/5 only implemented with sockets (to be tested more deeply) ix86/win32 with MinGW cannot be compiled with -fomit-frame-pointer (gcc 3.3.1 and 3.3.3) more precisely fails if engine.c compiled with -O2 -fomit-frame-pointer (and only these 3 functions Execute_Directive Call_Prolog Call_Next suffice to fail with -O2 -fomit-frame-pointer) ppc/linux: with no optimization options for gcc do not use global registers (use: ./configure --with-c-flags=debug --disable-regs) ppc/darwin-macosx: for gcc 3.3 do not use global registers (use: ./configure --disable-regs) ix86/OpenBSD: use gmake instead of make ix86/sco: On SCO UnixWare use --host=i586-pc-sco when using ./configure (until autoconf is updated to recognize UnixWare). MacOS: if a Fatal Error: Segmentation Violation occurs it can be due to a C stack overflow. It is possible to change the size of the C stack before starting GNU Prolog. For instance the following command set the C stack size to 8Mb: ulimit -s 8192 (with bash) limit stacksize 8M (with csh) ./gprolog-1.3.0/INSTALL0000644004425400513100000002243310536774205013037 0ustar diazloco INSTALLATION PROCEDURE ---------------------- See file README for a list of currently available ports: The file PROBLEMS contains a list of known problems/limitations depending on the architecure. Please consult it before reporting a problem. Installing the source distribution ********************************** 1) Introduction --------------- ** Win32 preamble ** To compile GNU-Prolog under win32 see file src/WINDOWS. The following tools are required to compile and install the source package: gcc, as, ranlib (if needed), sh, mkdir, cp, rm, sed, test,... The installation process is as follows: cd src go to source directory ./configure [OPTIONS] configure the system make compile locally the package make install or (make install-strip) install the package you can check the result of the local compilation using: make check 2) Installation directories --------------------------- Directories used for the installation are as follows: INSTALL_DIR the root directory for the core package, contains: INSTALL_DIR/bin all binaries (compiler, top-level,...) INSTALL_DIR/lib all libraries and objects INSTALL_DIR/include header files needed to write foreign C code These other directories are optional: LINKS_DIR the directory for links to binaries of INSTALL_DIR/bin DOC_DIR the directory for the documentation (LaTeX, DVI, PostScript,...) HTML_DIR the directory for the HTML documentation EXAMPLES_DIR the directory for the examples, contains: EXAMPLES_DIR/ExamplsPl some classical Prolog examples EXAMPLES_DIR/ExamplesFD some examples using FD constraint solving Default directory values and associated configuration options are as follows: The value of INSTALL_DIR is as follows: - PREFIX/gprolog-VERSION_NUMBER (this is the default) the default value of PREFIX is /usr/local but can be explicitely specified using --prefix=PREFIX - another location can be specified using --with-install-dir=INSTALL_DIR - the source distribution directory (i.e. where reside this INSTALL file) This in-place installation can be specified using --prefix=in-place or --with-install-dir=in-place The value of LINKS_DIR is as follows: - EPREFIX/bin. The value of EPREFIX is the same as PREFIX but can be explicitely specified using --exec-prefix=EPREFIX - another location can be specified --with-links-dir=LINKS_DIR - To prevent the installation of the links use --without-links-dir (this is the default when doing an in-place installation). The default value of DOC_DIR is INSTALL_DIR/doc another location can be specified using --with-doc-dir=DOC_DIR To prevent the installation of documentation --without-doc-dir (this is the default when doing an in-place installation). The default value of HTML_DIR is DOC_DIR/Html another location can be specified using --with-html-dir=HTML_DIR To prevent the installation of the HTML documentation --without-html-dir (this is the default when doing an in-place installation). The default value of EXAMPLES_DIR is INSTALL_DIR another location can be specified using --with-examples-dir=EXAMPLES_DIR To prevent the installation of the examples --without-examples-dir (this is the default when doing an in-place installation). The configure command displays the value of INSTALL_DIR, LINKS_DIR, DOC_DIR, HTML_DIR and EXAMPLES_DIR. To summarize, by default the whole package (+ documentation + HTML + examples) is installed in /usr/local/gprolog-xxx and linked files are installed in /usr/local/bin. 3) Configuration ---------------- GNU Prolog uses autoconf. To configure the package: ./configure [OPTIONS] This script attempts to guess correct values for various system-dependent variables used during compilation. For more detail about autoconf refer to src/AUTOCONF-INFO (try also './configure --help'). The GNU-Prolog specific options are: Options to control the installation directory: --with-install-dir=INSTALL_DIR specify INSTALL_DIR --prefix=PREFIX specify PREFIX (INSTALL_DIR=PREFIX/gprolog-xxx) --prefix=in-place specify an in-place installation Default: --prefix=/usr/local Options to control the location of links to binaries: --with-links-dir=LINKS_DIR specify LINKS_DIR --without-links-dir do not create link to binaries --exec-prefix=EPREFIX specify EPREFIX (LINKS_DIR=EPREFIX/bin) Default: --exec-prefix=PREFIX (links are not installed for an in-place installation). Options to control the location of other components: --with-doc-dir=DOC_DIR specify DOC_DIR --without-doc-dir do not install the documentation --with-html-dir=HTML_DIR specify HTML_DIR --without-thml-dir do not install the HTML documentation --with-examples-dir=EXAMPLES_DIR specify EXAMPLESS_DIR --without-examples-dir do not install the examples Defaults: INSTALL_DIR/doc for DOC_DIR, DOC_DIR/Html for HTML_DIR INSTALL_DIR for EXAMPLES_DIR (these components are not installed for an in-place installation). Options to control C compiler optimization flags: --with-msvc use MSVC++ compiler under Win32 (else use gcc) --without-c-flags do not use any optimization flag --with-c-flags use default C optimization flags --with-c-flags=CFLAGS use CFLAGS (instead of default optimization flags) --with-c-flags=debug use C debug flags (e.g. '-g -Wall' for gcc) Default: --with-c-flags Options to control GNU features to include/exclude: --disable-regs do not use machine registers to optimize speed --enable-ebp use the ebp register on ix86 machines --disable-fast-call do not use fast call mechanism for ix86 processors --disable-linedit do not include line editor facility --disable-piped-consult do not pipe stdin of pl2wam when consult/1 --disable-sockets do not include sockets facility --disable-fd-solver do not include the finite domain constraint solver --disable-gui-console do not use a GUI console (only with MSVC++ or MinGW) Default: all features are included. Some examples of using configure: To configure the package for an installation in the default directory /usr/local and links to binaries in /usr/local/bin: ./configure To configure the package for an installation in the home directory with linked files in ~/bin/i586 use ./configure --prefix=$HOME --with-links-dir=$HOME/bin/i586 To configure the package for an in-place installation: ./configure --prefix=in-place 4) Compiling the package locally -------------------------------- To locally compile the package: make 5) Installing the package ------------------------- To install the package according to options given to ./configure (see 2): make install You can either install stripped versions of the binaries (whose size is then reduced): make install-strip It is possible to re-run './configure' to change the value of some installation directories (see 2) after the local compilation (i.e. the compilation will not be done again). 6) Cleaning ----------- To remove installed files (remove the content of INSTALL_DIR): make uninstall To clean up the local compilation (does not erase configuration files): make clean To fully clean up the local compilation: make distclean Setting up environment variables ******************************** To be able to execute GNU Prolog from anywhere the directory LINKS_DIR should be a part of your PATH environment variable (generally this directory is already in the PATH variable). However, if no links have been creeated (either --without-links-dir has been specified or in case of default in-place installation) you should add the directory INSTALL_DIR/bin to your PATH variable. This can be done as follows (let us suppose INSTALL_DIR is /usr/local/gprolog-xxx): under sh/bash: PATH=$PATH:/usr/local/gprolog-xxx/bin; export PATH under csh/tcsh: setenv PATH ${PATH}:/usr/local/gprolog-xxx/bin GNU Prolog needs to know the value of INSTALL_DIR (to locate its libraries). To do this, it uses its own path at execution-time, expanding symbolic links. So you should not move or copy the executables, but you can create links to them (as done by the installation procedure in LINKS_DIR). However, to prevent this case, GNU Prolog first consults the value of the PL_PATH environment variable. If it is defined GNU Prolog uses this path. If you want to define it, simply set it to the value of INSTALL_DIR as follows: under sh/bash: PL_PATH=/usr/local/gprolog-xxx; export PL_PATH under csh/tcsh: setenv PL_PATH /usr/local/gprolog-xxx To summarize, by default you can avoid to define PATH and PL_PATH. If you need to defines these variables it is a good idea to put them in your shell start-up file ($HOME/.bashrc / .cshrc / .tcshrc depending on the used shell). Problems ******** See file PROBLEMS for more information on architecture-dependent known problems. If your installation does not work (compilation is ok but when running the system fails) you can try to recompile the whole system with --disable-regs (after make distclean). Finally you can use the GNU Prolog mailing lists to ask for help or to report a bug/problem. ./gprolog-1.3.0/ExamplesPl/0000777004425400513100000000000010547442376014063 5ustar diazloco./gprolog-1.3.0/ExamplesPl/meta_qsort.pl0000644004425400513100000000562210547152502016564 0ustar diazloco% generated: 8 March 1990 % option(s): % % meta_qsort % % Ralph M. Haygood % % meta-interpret Warren benchmark qsort % % For any meta-variable ~X~, interpret(~X~) behaves as if % % interpret(~X~):- ~X~. % % Thus, for example, interpret((foo(X), bar(X), !)) behaves as if % % interpret((foo(X), bar(X), !)):- foo(X), bar(X), !. % % Note that though ~X~ may contain cuts, those cuts cannot escape from % interpret(~X~) to effect the parent goal; interpret(!) is equivalent % to true. % % Cuts inside ~X~ are executed according to the rule that conjunction, % disjunction, and if-then-else are transparent to cuts, and any other % form is transparent to cuts if and only if it can be macro-expanded % into a form involving only these three without interpret/1. If-then % and negation are the only such other forms currently recognized; ( A % -> B) is equivalent to ( A -> B ; fail ), and \+ A is equivalent to % ( A -> fail ; true ). meta_qsort(ShowResult) :- interpret(qsort(R)), ( ShowResult = true -> write(R), nl ; true). interpret(Goal):- interpret(Goal, Rest), (nonvar(Rest), !, interpret(Rest) ; true). interpret(G, _):- var(G), !, fail. interpret((A, B), Rest):- !, interpret(A, Rest0), (nonvar(Rest0) -> Rest = (Rest0, B) ; interpret(B, Rest)). interpret((A ; B), Rest):- !, interpret_disjunction(A, B, Rest). interpret((A -> B), Rest):- !, interpret_disjunction((A -> B), fail, Rest). interpret(\+A, Rest):- !, interpret_disjunction((A -> fail), true, Rest). interpret(!, true):- !. interpret(G, _):- integer(G), !, fail. interpret(G, _):- is_built_in(G), !, interpret_built_in(G). interpret(G, _):- define(G, Body), interpret(Body). interpret_disjunction((A -> B), _, Rest):- interpret(A, Rest0), !, (nonvar(Rest0) -> Rest = (Rest0 -> B) ; interpret(B, Rest)). interpret_disjunction((_ -> _), C, Rest):- !, interpret(C, Rest). interpret_disjunction(A, _, Rest):- interpret(A, Rest). interpret_disjunction(_, B, Rest):- interpret(B, Rest). is_built_in(true). is_built_in(_=<_). is_built_in(write(_)). interpret_built_in(true). interpret_built_in(X= write('rewriting...'), nl ; true), rewrite(Wff,NewWff), ( ShowResult = true -> write('proving...'), nl ; true), tautology(NewWff,[],[]). wff(implies(and(implies(X,Y), and(implies(Y,Z), and(implies(Z,U), implies(U,W)))), implies(X,W))) :- X = f(plus(plus(a,b),plus(c,zero))), Y = f(times(times(a,b),plus(c,d))), Z = f(reverse(append(append(a,b),[]))), U = equal(plus(a,b),difference(x,y)), W = lessp(remainder(a,b),member(a,length(b))). tautology(Wff,Tlist,Flist) :- (truep(Wff,Tlist) -> true ;falsep(Wff,Flist) -> fail ;Wff = if(If,Then,Else) -> (truep(If,Tlist) -> tautology(Then,Tlist,Flist) ;falsep(If,Flist) -> tautology(Else,Tlist,Flist) ;tautology(Then,[If|Tlist],Flist), % both must hold tautology(Else,Tlist,[If|Flist]) ) ),!. rewrite(Atom,Atom) :- atomic(Atom),!. rewrite(Old,New) :- functor(Old,F,N), functor(Mid,F,N), rewrite_args(N,Old,Mid), ( equal(Mid,Next), % should be ->, but is compiler smart rewrite(Next,New) % enough to generate cut for -> ? ; New=Mid ),!. rewrite_args(0,_,_) :- !. rewrite_args(N,Old,Mid) :- arg(N,Old,OldArg), arg(N,Mid,MidArg), rewrite(OldArg,MidArg), N1 is N-1, rewrite_args(N1,Old,Mid). truep(t,_) :- !. truep(Wff,Tlist) :- mymemberchk(Wff,Tlist). falsep(f,_) :- !. falsep(Wff,Flist) :- mymemberchk(Wff,Flist). mymemberchk(X,[X|_]) :- !. mymemberchk(X,[_|T]) :- mymemberchk(X,T). equal( and(P,Q), if(P,if(Q,t,f),f) ). equal( append(append(X,Y),Z), append(X,append(Y,Z)) ). equal( assignment(X,append(A,B)), if(assignedp(X,A), assignment(X,A), assignment(X,B)) ). equal( assume_false(Var,Alist), cons(cons(Var,f),Alist) ). equal( assume_true(Var,Alist), cons(cons(Var,t),Alist) ). equal( boolean(X), or(equal(X,t),equal(X,f)) ). equal( car(gopher(X)), if(listp(X), car(flatten(X)), zero) ). equal( compile(Form), reverse(codegen(optimize(Form),[])) ). equal( count_list(Z,sort_lp(X,Y)), plus(count_list(Z,X), count_list(Z,Y)) ). equal( countps_(L,Pred), countps_loop(L,Pred,zero) ). equal( difference(A,B), C ) :- difference(A,B,C). equal( divides(X,Y), zerop(remainder(Y,X)) ). equal( dsort(X), sort2(X) ). equal( eqp(X,Y), equal(fix(X),fix(Y)) ). equal( equal(A,B), C ) :- eq(A,B,C). equal( even1(X), if(zerop(X),t,odd(decr(X))) ). equal( exec(append(X,Y),Pds,Envrn), exec(Y,exec(X,Pds,Envrn),Envrn) ). equal( exp(A,B), C ) :- exp(A,B,C). equal( fact_(I), fact_loop(I,1) ). equal( falsify(X), falsify1(normalize(X),[]) ). equal( fix(X), if(numberp(X),X,zero) ). equal( flatten(cdr(gopher(X))), if(listp(X), cdr(flatten(X)), cons(zero,[])) ). equal( gcd(A,B), C ) :- gcd(A,B,C). equal( get(J,set(I,Val,Mem)), if(eqp(J,I),Val,get(J,Mem)) ). equal( greatereqp(X,Y), not(lessp(X,Y)) ). equal( greatereqpr(X,Y), not(lessp(X,Y)) ). equal( greaterp(X,Y), lessp(Y,X) ). equal( if(if(A,B,C),D,E), if(A,if(B,D,E),if(C,D,E)) ). equal( iff(X,Y), and(implies(X,Y),implies(Y,X)) ). equal( implies(P,Q), if(P,if(Q,t,f),t) ). equal( last(append(A,B)), if(listp(B), last(B), if(listp(A), cons(car(last(A))), B)) ). equal( length(A), B ) :- mylength(A,B). equal( lesseqp(X,Y), not(lessp(Y,X)) ). equal( lessp(A,B), C ) :- lessp(A,B,C). equal( listp(gopher(X)), listp(X) ). equal( mc_flatten(X,Y), append(flatten(X),Y) ). equal( meaning(A,B), C ) :- meaning(A,B,C). equal( member(A,B), C ) :- mymember(A,B,C). equal( not(P), if(P,f,t) ). equal( nth(A,B), C ) :- n_th(A,B,C). equal( numberp(greatest_factor(X,Y)), not(and(or(zerop(Y),equal(Y,1)), not(numberp(X)))) ). equal( or(P,Q), if(P,t,if(Q,t,f),f) ). equal( plus(A,B), C ) :- plus(A,B,C). equal( power_eval(A,B), C ) :- power_eval(A,B,C). equal( prime(X), and(not(zerop(X)), and(not(equal(X,add1(zero))), prime1(X,decr(X)))) ). equal( prime_list(append(X,Y)), and(prime_list(X),prime_list(Y)) ). equal( quotient(A,B), C ) :- quotient(A,B,C). equal( remainder(A,B), C ) :- remainder(A,B,C). equal( reverse_(X), reverse_loop(X,[]) ). equal( reverse(append(A,B)), append(reverse(B),reverse(A)) ). equal( reverse_loop(A,B), C ) :- reverse_loop(A,B,C). equal( samefringe(X,Y), equal(flatten(X),flatten(Y)) ). equal( sigma(zero,I), quotient(times(I,add1(I)),2) ). equal( sort2(delete(X,L)), delete(X,sort2(L)) ). equal( tautology_checker(X), tautologyp(normalize(X),[]) ). equal( times(A,B), C ) :- times(A,B,C). equal( times_list(append(X,Y)), times(times_list(X),times_list(Y)) ). equal( value(normalize(X),A), value(X,A) ). equal( zerop(X), or(equal(X,zero),not(numberp(X))) ). difference(X, X, zero) :- !. difference(plus(X,Y), X, fix(Y)) :- !. difference(plus(Y,X), X, fix(Y)) :- !. difference(plus(X,Y), plus(X,Z), difference(Y,Z)) :- !. difference(plus(B,plus(A,C)), A, plus(B,C)) :- !. difference(add1(plus(Y,Z)), Z, add1(Y)) :- !. difference(add1(add1(X)), 2, fix(X)). eq(plus(A,B), zero, and(zerop(A),zerop(B))) :- !. eq(plus(A,B), plus(A,C), equal(fix(B),fix(C))) :- !. eq(zero, difference(X,Y),not(lessp(Y,X))) :- !. eq(X, difference(X,Y),and(numberp(X), and(or(equal(X,zero), zerop(Y))))) :- !. eq(times(X,Y), zero, or(zerop(X),zerop(Y))) :- !. eq(append(A,B), append(A,C), equal(B,C)) :- !. eq(flatten(X), cons(Y,[]), and(nlistp(X),equal(X,Y))) :- !. eq(greatest_factor(X,Y),zero, and(or(zerop(Y),equal(Y,1)), equal(X,zero))) :- !. eq(greatest_factor(X,_),1, equal(X,1)) :- !. eq(Z, times(W,Z), and(numberp(Z), or(equal(Z,zero), equal(W,1)))) :- !. eq(X, times(X,Y), or(equal(X,zero), and(numberp(X),equal(Y,1)))) :- !. eq(times(A,B), 1, and(not(equal(A,zero)), and(not(equal(B,zero)), and(numberp(A), and(numberp(B), and(equal(decr(A),zero), equal(decr(B),zero))))))) :- !. eq(difference(X,Y), difference(Z,Y),if(lessp(X,Y), not(lessp(Y,Z)), if(lessp(Z,Y), not(lessp(Y,X)), equal(fix(X),fix(Z))))) :- !. eq(lessp(X,Y), Z, if(lessp(X,Y), equal(t,Z), equal(f,Z))). exp(I, plus(J,K), times(exp(I,J),exp(I,K))) :- !. exp(I, times(J,K), exp(exp(I,J),K)). gcd(X, Y, gcd(Y,X)) :- !. gcd(times(X,Z), times(Y,Z), times(Z,gcd(X,Y))). mylength(reverse(X),length(X)). mylength(cons(_,cons(_,cons(_,cons(_,cons(_,cons(_,X7)))))), plus(6,length(X7))). lessp(remainder(_,Y), Y, not(zerop(Y))) :- !. lessp(quotient(I,J), I, and(not(zerop(I)), or(zerop(J), not(equal(J,1))))) :- !. lessp(remainder(X,Y), X, and(not(zerop(Y)), and(not(zerop(X)), not(lessp(X,Y))))) :- !. lessp(plus(X,Y), plus(X,Z), lessp(Y,Z)) :- !. lessp(times(X,Z), times(Y,Z), and(not(zerop(Z)), lessp(X,Y))) :- !. lessp(Y, plus(X,Y), not(zerop(X))) :- !. lessp(length(delete(X,L)), length(L), member(X,L)). meaning(plus_tree(append(X,Y)),A, plus(meaning(plus_tree(X),A), meaning(plus_tree(Y),A))) :- !. meaning(plus_tree(plus_fringe(X)),A, fix(meaning(X,A))) :- !. meaning(plus_tree(delete(X,Y)),A, if(member(X,Y), difference(meaning(plus_tree(Y),A), meaning(X,A)), meaning(plus_tree(Y),A))). mymember(X,append(A,B),or(member(X,A),member(X,B))) :- !. mymember(X,reverse(Y),member(X,Y)) :- !. mymember(A,intersect(B,C),and(member(A,B),member(A,C))). n_th(zero,_,zero). n_th([],I,if(zerop(I),[],zero)). n_th(append(A,B),I,append(nth(A,I),nth(B,difference(I,length(A))))). plus(plus(X,Y),Z, plus(X,plus(Y,Z))) :- !. plus(remainder(X,Y), times(Y,quotient(X,Y)), fix(X)) :- !. plus(X,add1(Y), if(numberp(Y), add1(plus(X,Y)), add1(X))). power_eval(big_plus1(L,I,Base),Base, plus(power_eval(L,Base),I)) :- !. power_eval(power_rep(I,Base),Base, fix(I)) :- !. power_eval(big_plus(X,Y,I,Base),Base, plus(I,plus(power_eval(X,Base), power_eval(Y,Base)))) :- !. power_eval(big_plus(power_rep(I,Base), power_rep(J,Base), zero, Base), Base, plus(I,J)). quotient(plus(X,plus(X,Y)),2,plus(X,quotient(Y,2))). quotient(times(Y,X),Y,if(zerop(Y),zero,fix(X))). remainder(_, 1,zero) :- !. remainder(X, X,zero) :- !. remainder(times(_,Z),Z,zero) :- !. remainder(times(Y,_),Y,zero). reverse_loop(X,Y, append(reverse(X),Y)) :- !. reverse_loop(X,[], reverse(X) ). times(X, plus(Y,Z), plus(times(X,Y),times(X,Z)) ) :- !. times(times(X,Y),Z, times(X,times(Y,Z)) ) :- !. times(X, difference(C,W),difference(times(C,X),times(W,X))) :- !. times(X, add1(Y), if(numberp(Y), plus(X,times(X,Y)), fix(X)) ). % benchmark interface benchmark(ShowResult) :- boyer(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/crypt.pl0000644004425400513100000000402210547152502015540 0ustar diazloco% crypt % % Cryptomultiplication: % Find the unique answer to: % OEE % EE % --- % EOEE % EOE % ---- % OOEE % % where E=even, O=odd. % This program generalizes easily % to any such problem. % Written by Peter Van Roy crypt(ShowResult) :- odd(A), even(B), even(C), even(E), mult([C, B, A], E, [I, H, G, F | X]), lefteven(F), odd(G), even(H), even(I), zero(X), lefteven(D), mult([C, B, A], D, [L, K, J | Y]), lefteven(J), odd(K), even(L), zero(Y), sum2([I, H, G, F], [0, L, K, J], [P, O, N, M | Z]), odd(M), odd(N), even(O), even(P), zero(Z), ( ShowResult = true -> write(' '), write(A), write(B), write(C), nl, write(' '), write(D), write(E), nl, write(F), write(G), write(H), write(I), nl, write(J), write(K), write(L), nl, write(M), write(N), write(O), write(P), nl ; true). % In the usual source this predicate is named sum. However, sum is a % language construct in NU-Prolog, and cannot be defined as a predicate. % If you try, nc comes up with an obscure error message. sum2(AL, BL, CL) :- sum2(AL, BL, 0, CL). sum2([A | AL], [B | BL], Carry, [C | CL]) :- !, X is (A + B + Carry), C is X mod 10, NewCarry is X // 10, sum2(AL, BL, NewCarry, CL). sum2([], BL, 0, BL) :- !. sum2(AL, [], 0, AL) :- !. sum2([], [B | BL], Carry, [C | CL]) :- !, X is B + Carry, NewCarry is X // 10, C is X mod 10, sum2([], BL, NewCarry, CL). sum2([A | AL], [], Carry, [C | CL]) :- !, X is A + Carry, NewCarry is X // 10, C is X mod 10, sum2([], AL, NewCarry, CL). sum2([], [], Carry, [Carry]). mult(AL, D, BL) :- mult(AL, D, 0, BL). mult([], _, Carry, [C, Cend]) :- C is Carry mod 10, Cend is Carry // 10. mult([A | AL], D, Carry, [B | BL] ) :- X is A * D + Carry, B is X mod 10, NewCarry is X // 10, mult(AL, D, NewCarry, BL). zero([]). zero([0 | L]) :- zero(L). odd(1). odd(3). odd(5). odd(7). odd(9). even(0). even(2). even(4). even(6). even(8). lefteven(2). lefteven(4). lefteven(6). lefteven(8). % benchmark interface benchmark(ShowResult) :- crypt(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/queensn.pl0000644004425400513100000000133110547152502016055 0ustar diazloco% naive queens queensn(ShowResult) :- q10(R), ( ShowResult = true -> write(R), nl ; true). q8(R) :- q([1,2,3,4,5,6,7,8], R). q10(R) :- q([1,2,3,4,5,6,7,8,9,10], R). q(L,C):- perm(L,P), pair(L,P,C), safe([],C). perm([],[]). perm(Xs,[Z|Zs]):- sel(Z,Xs,Ys), perm(Ys,Zs). sel(X,[X|Xs],Xs). sel(X,[Y|Ys],[Y|Zs]):- sel(X,Ys,Zs). pair([],[],[]). pair([X|Y],[U|V],[p(X,U)|W]):- pair(Y,V,W). safe(_X,[]). safe(X,[Q|R]):- test(X,Q), safe([Q|X],R). test([],_X). test([R|S],Q):- test(S,Q), nd(R,Q). nd(p(C1,R1),p(C2,R2)):- C is C1-C2, R is R1-R2, C=\=R, NR is R2-R1, C=\=NR. % benchmark interface benchmark(ShowResult) :- queensn(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/nand.pl0000644004425400513100000004777310547152502015343 0ustar diazloco%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % This is a rough approximation to the algorithm presented in: % % "An Algorithm for NAND Decomposition Under Network Constraints," % IEEE Trans. Comp., vol C-18, no. 12, Dec. 1969, p. 1098 % by E. S. Davidson. % % Written by Bruce Holmer % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % I have used the paper's terminology for names used in the program. % % The data structure for representing functions and variables is % function(FunctionNumber, TrueSet, FalseSet, % ConceivableInputs, % ImmediatePredecessors, ImmediateSuccessors, % Predecessors, Successors) % % % Common names used in the program: % % NumVars number of variables (signal inputs) % NumGs current number of variables and functions % Gs list of variable and function data % Gi,Gj,Gk,Gl individual variable or function--letter corresponds to % the subscript in the paper (most of the time) % Vector,V vector from a function's true set % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% nand(ShowResult) :- nand_main(0, ShowResult). nand_main(N, ShowResult) :- init_state(N, NumVars, NumGs, Gs), add_necessary_functions(NumVars, NumGs, Gs, NumGs2, Gs2), test_bounds(NumVars, NumGs2, Gs2), search(NumVars, NumGs2, Gs2, ShowResult). nand_main(_, ShowResult) :- ( ShowResult = true -> write('Search completed'), nl ; true). % Test input % init_state(circuit(NumInputs, NumOutputs, FunctionList)) init_state(0, 2, 3, [ % 2 input xor function(2, [1,2], [0,3], [], [], [], [], []), function(1, [2,3], [0,1], [], [], [], [], []), function(0, [1,3], [0,2], [], [], [], [], []) ]) :- update_bounds(_, 100, _). init_state(1, 3, 4, [ % carry circuit function(3, [3,5,6,7], [0,1,2,4], [], [], [], [], []), function(2, [4,5,6,7], [0,1,2,3], [], [], [], [], []), function(1, [2,3,6,7], [0,1,4,5], [], [], [], [], []), function(0, [1,3,5,7], [0,2,4,6], [], [], [], [], []) ]) :- update_bounds(_, 100, _). init_state(2, 3, 4, [ % example in paper function(3, [1,2,4,6,7], [0,3,5], [], [], [], [], []), function(2, [4,5,6,7], [0,1,2,3], [], [], [], [], []), function(1, [2,3,6,7], [0,1,4,5], [], [], [], [], []), function(0, [1,3,5,7], [0,2,4,6], [], [], [], [], []) ]) :- update_bounds(_, 100, _). init_state(3, 3, 4, [ % sum (3 input xor) function(3, [1,2,4,7], [0,3,5,6], [], [], [], [], []), function(2, [4,5,6,7], [0,1,2,3], [], [], [], [], []), function(1, [2,3,6,7], [0,1,4,5], [], [], [], [], []), function(0, [1,3,5,7], [0,2,4,6], [], [], [], [], []) ]) :- update_bounds(_, 100, _). init_state(4, 3, 5, [ % do sum and carry together function(4, [3,5,6,7], [0,1,2,4], [], [], [], [], []), function(3, [1,2,4,7], [0,3,5,6], [], [], [], [], []), function(2, [4,5,6,7], [0,1,2,3], [], [], [], [], []), function(1, [2,3,6,7], [0,1,4,5], [], [], [], [], []), function(0, [1,3,5,7], [0,2,4,6], [], [], [], [], []) ]) :- update_bounds(_, 100, _). /* commented for XSB, compiler complexity too high on big lists init_state(5, 5, 8, [ % 2 bit full adder function(7, % A2 (output) [1,3,4,6,9,11,12,14,16,18,21,23,24,26,29,31], [0,2,5,7,8,10,13,15,17,19,20,22,25,27,28,30], [], [], [], [], []), function(6, % B2 (output) [2,3,5,6,8,9,12,15,17,18,20,21,24,27,30,31], [0,1,4,7,10,11,13,14,16,19,22,23,25,26,28,29], [], [], [], [], []), function(5, % carry-out (output) [7,10,11,13,14,15,19,22,23,25,26,27,28,29,30,31], [0,1,2,3,4,5,6,8,9,12,16,17,18,20,21,24], [], [], [], [], []), function(4, % carry-in [16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31], [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15], [], [], [], [], []), function(3, % B1 input [8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31], [0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23], [], [], [], [], []), function(2, % B0 input [4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31], [0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27], [], [], [], [], []), function(1, % A1 input [2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31], [0,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29], [], [], [], [], []), function(0, % A0 input [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31], [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30], [], [], [], [], []) ]) :- update_bounds(_, 21, _). */ % Iterate over all the TRUE vectors that need to be covered. % If no vectors remain to be covered (select_vector fails), then % the circuit is complete (printout results, update bounds, and % continue search for a lower cost circuit). search(NumVars, NumGsIn, GsIn, ShowResult) :- select_vector(NumVars, NumGsIn, GsIn, Gj, Vector), !, cover_vector(NumVars, NumGsIn, GsIn, Gj, Vector, NumGs, Gs), add_necessary_functions(NumVars, NumGs, Gs, NumGsOut, GsOut), test_bounds(NumVars, NumGsOut, GsOut), search(NumVars, NumGsOut, GsOut, ShowResult). search(NumVars, NumGs, Gs, ShowResult) :- ( ShowResult = true -> output_results(NumVars, NumGs, Gs) ; true), update_bounds(NumVars, NumGs, Gs), fail. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Given the current solution, pick the best uncovered TRUE vector % for covering next. % The selected vector is specified by its vector number and function. % Select_vector fails if all TRUE vectors are covered. % Select_vector is determinant (gives only one solution). select_vector(NumVars, NumGs, Gs, Gj, Vector) :- select_vector(Gs, NumVars, NumGs, Gs, dummy, 0, nf, 999, Gj, Vector, Type, _), !, \+ unif(Type, cov), \+ unif(Type, nf). unif(X, X). % loop over functions select_vector([Gk|_], NumVars, _, _, Gj, V, Type, N, Gj, V, Type, N) :- function_number(Gk, K), K < NumVars. select_vector([Gk|Gks], NumVars, NumGs, Gs, GjIn, Vin, TypeIn, Nin, GjOut, Vout, TypeOut, Nout) :- function_number(Gk, K), K >= NumVars, true_set(Gk, Tk), select_vector(Tk, Gk, NumVars, NumGs, Gs, GjIn, Vin, TypeIn, Nin, Gj, V, Type, N), select_vector(Gks, NumVars, NumGs, Gs, Gj, V, Type, N, GjOut, Vout, TypeOut, Nout). % loop over vectors select_vector([], _, _, _, _, Gj, V, Type, N, Gj, V, Type, N). select_vector([V|Vs], Gk, NumVars, NumGs, Gs, GjIn, Vin, TypeIn, Nin, GjOut, Vout, TypeOut, Nout) :- vector_cover_type(NumVars, Gs, Gk, V, Type, N), best_vector(GjIn, Vin, TypeIn, Nin, Gk, V, Type, N, Gj2, V2, Type2, N2), select_vector(Vs, Gk, NumVars, NumGs, Gs, Gj2, V2, Type2, N2, GjOut, Vout, TypeOut, Nout). vector_cover_type(NumVars, Gs, Gj, Vector, Type, NumCovers) :- immediate_predecessors(Gj, IPs), conceivable_inputs(Gj, CIs), false_set(Gj, Fj), cover_type1(IPs, Gs, Vector, nf, 0, T, N), cover_type2(CIs, Gs, NumVars, Fj, Vector, T, N, Type, NumCovers). cover_type1([], _, _, T, N, T, N). cover_type1([I|IPs], Gs, V, TypeIn, Nin, TypeOut, Nout) :- function(I, Gs, Gi), true_set(Gi, Ti), \+ set_member(V, Ti), !, false_set(Gi, Fi), (set_member(V, Fi) -> max_type(TypeIn, cov, Type); max_type(TypeIn, exp, Type)), N is Nin + 1, cover_type1(IPs, Gs, V, Type, N, TypeOut, Nout). cover_type1([_|IPs], Gs, V, TypeIn, Nin, TypeOut, Nout) :- cover_type1(IPs, Gs, V, TypeIn, Nin, TypeOut, Nout). cover_type2([], _, _, _, _, T, N, T, N). cover_type2([I|CIs], Gs, NumVars, Fj, V, TypeIn, Nin, TypeOut, Nout) :- I < NumVars, function(I, Gs, Gi), false_set(Gi, Fi), set_member(V, Fi), !, max_type(TypeIn, var, Type), N is Nin + 1, cover_type2(CIs, Gs, NumVars, Fj, V, Type, N, TypeOut, Nout). cover_type2([I|CIs], Gs, NumVars, Fj, V, TypeIn, Nin, TypeOut, Nout) :- I >= NumVars, function(I, Gs, Gi), true_set(Gi, Ti), \+ set_member(V, Ti), !, false_set(Gi, Fi), (set_member(V, Fi) -> (set_subset(Fj, Ti) -> max_type(TypeIn, fcn, Type); max_type(TypeIn, mcf, Type)); (set_subset(Fj, Ti) -> max_type(TypeIn, exf, Type); max_type(TypeIn, exmcf, Type))), N is Nin + 1, cover_type2(CIs, Gs, NumVars, Fj, V, Type, N, TypeOut, Nout). cover_type2([_|CIs], Gs, NumVars, Fj, V, TypeIn, Nin, TypeOut, Nout) :- cover_type2(CIs, Gs, NumVars, Fj, V, TypeIn, Nin, TypeOut, Nout). % The best vector to cover is the one with worst type, or, if types % are equal, with the least number of possible covers. best_vector(dummy, _, _, _, Gj2, V2, Type2, N2, Gj2, V2, Type2, N2) :- !. best_vector(Gj1, V1, Type1, N1, dummy, _, _, _, Gj1, V1, Type1, N1) :- !. best_vector(Gj1, V1, Type, N1, Gj2, _, Type, N2, Gj1, V1, Type, N1) :- function_number(Gj1, J), function_number(Gj2, J), N1 < N2, !. best_vector(Gj1, _, Type, N1, Gj2, V2, Type, N2, Gj2, V2, Type, N2) :- function_number(Gj1, J), function_number(Gj2, J), N1 >= N2, !. best_vector(Gj1, V1, Type, N1, Gj2, _, Type, _, Gj1, V1, Type, N1) :- (Type = exp ; Type = var), function_number(Gj1, J1), function_number(Gj2, J2), J1 > J2, !. best_vector(Gj1, _, Type, _, Gj2, V2, Type, N2, Gj2, V2, Type, N2) :- (Type = exp ; Type = var), function_number(Gj1, J1), function_number(Gj2, J2), J1 < J2, !. best_vector(Gj1, V1, Type, N1, Gj2, _, Type, _, Gj1, V1, Type, N1) :- \+ unif2(Type, exp, var), function_number(Gj1, J1), function_number(Gj2, J2), J1 < J2, !. best_vector(Gj1, _, Type, _, Gj2, V2, Type, N2, Gj2, V2, Type, N2) :- \+ unif2(Type, exp, var), function_number(Gj1, J1), function_number(Gj2, J2), J1 > J2, !. best_vector(Gj1, V1, Type1, N1, _, _, Type2, _, Gj1, V1, Type1, N1) :- type_order(Type2, Type1), !. best_vector(_, _, Type1, _, Gj2, V2, Type2, N2, Gj2, V2, Type2, N2) :- type_order(Type1, Type2), !. unif2(X, X, _). unif2(X, _, X). max_type(T1, T2, T1) :- type_order(T1, T2), !. max_type(T1, T2, T2) :- \+ type_order(T1, T2), !. % Order of types type_order(cov, exp). type_order(cov, var). type_order(cov, fcn). type_order(cov, mcf). type_order(cov, exf). type_order(cov, exmcf). type_order(cov, nf). type_order(exp, var). type_order(exp, fcn). type_order(exp, mcf). type_order(exp, exf). type_order(exp, exmcf). type_order(exp, nf). type_order(var, fcn). type_order(var, mcf). type_order(var, exf). type_order(var, exmcf). type_order(var, nf). type_order(fcn, mcf). type_order(fcn, exf). type_order(fcn, exmcf). type_order(fcn, nf). type_order(mcf, exf). type_order(mcf, exmcf). type_order(mcf, nf). type_order(exf, exmcf). type_order(exf, nf). type_order(exmcf, nf). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cover_vector will cover the specified vector and % generate new circuit information. % Using backtracking, all possible coverings are generated. % The ordering of the possible coverings is approximately that % given in Davidson's paper, but has been simplified. cover_vector(NumVars, NumGsIn, GsIn, Gj, Vector, NumGsOut, GsOut) :- immediate_predecessors(Gj, IPs), conceivable_inputs(Gj, CIs), vector_types(Type), cover_vector(Type, IPs, CIs, Gj, Vector, NumVars, NumGsIn, GsIn, NumGsOut, GsOut). vector_types(var). vector_types(exp). vector_types(fcn). vector_types(mcf). vector_types(exf). vector_types(exmcf). vector_types(nf). cover_vector(exp, [I|_], _, Gj, V, _, NumGs, GsIn, NumGs, GsOut) :- function(I, GsIn, Gi), true_set(Gi, Ti), \+ set_member(V, Ti), update_circuit(GsIn, Gi, Gj, V, GsIn, GsOut). cover_vector(exp, [_|IPs], _, Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut) :- cover_vector(exp, IPs, _, Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut). cover_vector(var, _, [I|_], Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut) :- I < NumVars, function(I, GsIn, Gi), false_set(Gi, Fi), set_member(V, Fi), update_circuit(GsIn, Gi, Gj, V, GsIn, GsOut). cover_vector(var, _, [_|CIs], Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut) :- cover_vector(var, _, CIs, Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut). cover_vector(fcn, _, [I|_], Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut) :- I >= NumVars, function(I, GsIn, Gi), false_set(Gi, Fi), set_member(V, Fi), true_set(Gi, Ti), false_set(Gj, Fj), set_subset(Fj, Ti), update_circuit(GsIn, Gi, Gj, V, GsIn, GsOut). cover_vector(fcn, _, [_|CIs], Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut) :- cover_vector(fcn, _, CIs, Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut). cover_vector(mcf, _, [I|_], Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut) :- I >= NumVars, function(I, GsIn, Gi), false_set(Gi, Fi), set_member(V, Fi), true_set(Gi, Ti), false_set(Gj, Fj), \+ set_subset(Fj, Ti), update_circuit(GsIn, Gi, Gj, V, GsIn, GsOut). cover_vector(mcf, _, [_|CIs], Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut) :- cover_vector(mcf, _, CIs, Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut). cover_vector(exf, _, [I|_], Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut) :- I >= NumVars, function(I, GsIn, Gi), false_set(Gi, Fi), \+ set_member(V, Fi), true_set(Gi, Ti), \+ set_member(V, Ti), false_set(Gj, Fj), set_subset(Fj, Ti), update_circuit(GsIn, Gi, Gj, V, GsIn, GsOut). cover_vector(exf, _, [_|CIs], Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut) :- cover_vector(exf, _, CIs, Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut). cover_vector(exmcf, _, [I|_], Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut) :- I >= NumVars, function(I, GsIn, Gi), false_set(Gi, Fi), \+ set_member(V, Fi), true_set(Gi, Ti), \+ set_member(V, Ti), false_set(Gj, Fj), \+ set_subset(Fj, Ti), update_circuit(GsIn, Gi, Gj, V, GsIn, GsOut). cover_vector(exmcf, _, [_|CIs], Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut) :- cover_vector(exmcf, _, CIs, Gj, V, NumVars, NumGs, GsIn, NumGs, GsOut). cover_vector(nf, _, _, Gj, V, NumVars, NumGsIn, GsIn, NumGsOut, GsOut) :- NumGsOut is NumGsIn + 1, false_set(Gj, Fj), new_function_CIs(GsIn, function(NumGsIn,Fj,[V],[],[],[],[],[]), NumVars, Gs, Gi), update_circuit(Gs, Gi, Gj, V, Gs, GsOut). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% update_circuit([], _, _, _, _, []). update_circuit([function(K,Tk,Fk,CIk,IPk,ISk,Pk,Sk)|GsIn], Gi, Gj, V, Gs, [function(K,Tko,Fko,CIko,IPko,ISko,Pko,Sko)|GsOut]) :- Gi = function(I,_,Fi,_,IPi,ISi,Pi,_), Gj = function(J,_,Fj,_,_,_,_,Sj), set_union([I], Pi, PiI), set_union([J], Sj, SjJ), (K = J -> set_union(Tk, Fi, Tk2); Tk2 = Tk), (K = I -> set_union(Tk2, Fj, Tk3); Tk3 = Tk2), ((set_member(K, IPi); set_member(K, ISi)) -> set_union(Tk3, [V], Tko); Tko = Tk3), (K = I -> set_union(Fk, [V], Fko); Fko = Fk), ((set_member(K, Pi); K = I) -> set_difference(CIk, SjJ, CIk2); CIk2 = CIk), ((set_member(I, CIk), set_member(V, Fk)) -> set_difference(CIk2, [I], CIk3); CIk3 = CIk2), (K = I -> exclude_if_vector_in_false_set(CIk3, Gs, V, CIk4); CIk4 = CIk3), (K = J -> set_difference(CIk4, [I], CIko); CIko = CIk4), (K = J -> set_union(IPk, [I], IPko); IPko = IPk), (K = I -> set_union(ISk, [J], ISko); ISko = ISk), (set_member(K, SjJ) -> set_union(Pk, PiI, Pko); Pko = Pk), (set_member(K, PiI) -> set_union(Sk, SjJ, Sko); Sko = Sk), update_circuit(GsIn, Gi, Gj, V, Gs, GsOut). exclude_if_vector_in_false_set([], _, _, []). exclude_if_vector_in_false_set([K|CIsIn], Gs, V, CIsOut) :- function(K, Gs, Gk), false_set(Gk, Fk), set_member(V, Fk), !, exclude_if_vector_in_false_set(CIsIn, Gs, V, CIsOut). exclude_if_vector_in_false_set([K|CIsIn], Gs, V, [K|CIsOut]) :- exclude_if_vector_in_false_set(CIsIn, Gs, V, CIsOut). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% add_necessary_functions(NumVars, NumGsIn, GsIn, NumGsOut, GsOut) :- add_necessary_functions(NumVars, NumVars, NumGsIn, GsIn, NumGsOut, GsOut). add_necessary_functions(NumGs, _, NumGs, Gs, NumGs, Gs) :- !. add_necessary_functions(K, NumVars, NumGsIn, GsIn, NumGsOut, GsOut) :- function(K, GsIn, Gk), function_type(NumVars, NumGsIn, GsIn, Gk, nf, V), !, false_set(Gk, Fk), new_function_CIs(GsIn, function(NumGsIn,Fk,[V],[],[],[],[],[]), NumVars, Gs, Gl), function(K, Gs, Gk1), update_circuit(Gs, Gl, Gk1, V, Gs, Gs1), NumGs1 is NumGsIn + 1, K1 is K + 1, add_necessary_functions(K1, NumVars, NumGs1, Gs1, NumGsOut, GsOut). add_necessary_functions(K, NumVars, NumGsIn, GsIn, NumGsOut, GsOut) :- K1 is K + 1, add_necessary_functions(K1, NumVars, NumGsIn, GsIn, NumGsOut, GsOut). new_function_CIs(GsIn, function(L,Tl,Fl,_,IPl,ISl,Pl,Sl), NumVars, [GlOut|GsOut], GlOut) :- new_function_CIs(GsIn, L, Fl, NumVars, GsOut, [], CIlo), GlOut = function(L,Tl,Fl,CIlo,IPl,ISl,Pl,Sl). new_function_CIs([], _, _, _, [], CIl, CIl). new_function_CIs([function(K,Tk,Fk,CIk,IPk,ISk,Pk,Sk)|GsIn], L, Fl, NumVars, [function(K,Tk,Fk,CIko,IPk,ISk,Pk,Sk)|GsOut], CIlIn, CIlOut) :- set_intersection(Fl, Fk, []), !, (K >= NumVars -> set_union(CIk, [L], CIko); CIko = CIk), new_function_CIs(GsIn, L, Fl, NumVars, GsOut, [K|CIlIn], CIlOut). new_function_CIs([Gk|GsIn], L, Fl, NumVars, [Gk|GsOut], CIlIn, CIlOut) :- new_function_CIs(GsIn, L, Fl, NumVars, GsOut, CIlIn, CIlOut). function_type(NumVars, NumGs, Gs, Gk, Type, Vector) :- true_set(Gk, Tk), select_vector(Tk, Gk, NumVars, NumGs, Gs, dummy, 0, nf, 999, _, Vector, Type, _). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cost and constraint predicates: % very simple bound for now test_bounds(_, NumGs, _) :- access(bound, Bound), NumGs < Bound. update_bounds(_, NumGs, _) :- set(bound, NumGs). % set and access for systems that don't support them /* Original source set(N, A) :- (recorded(N, _, Ref) -> erase(Ref) ; true), recorda(N, A, _). access(N, A) :- recorded(N, A, _). */ /* bet for GNU Prolog set(N, A) :- g_assign(N, A). access(N, A) :- g_read(N, A). */ /* ISO version */ set(N, A) :- ( access(N, _) -> retract(store_value(N, _)) ; true), asserta(store_value(N, A)). access(N, A) :- clause(store_value(N, A), _). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Output predicates: % for now just dump everything output_results(NumVars, NumGs, Gs) :- NumGates is NumGs - NumVars, write(NumGates), write(' gates'), nl, write_gates(Gs), nl, write('searching for a better solution...'), nl, nl. write_gates([]). write_gates([Gi|Gs]) :- function_number(Gi, I), write('gate #'), write(I), write(' inputs: '), immediate_predecessors(Gi, IPi), write(IPi), nl, write_gates(Gs). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Retrieve the specified function from the function list. % function(FunctionNumber, FunctionList, Function). function(I, [Gi|_], Gi) :- function_number(Gi, I), !. function(I, [_|Gs], Gi) :- function(I, Gs, Gi). function_number( function(I,_,_,_,_,_,_,_), I). true_set( function(_,T,_,_,_,_,_,_), T). false_set( function(_,_,F,_,_,_,_,_), F). conceivable_inputs( function(_,_,_,CI,_,_,_,_), CI). immediate_predecessors( function(_,_,_,_,IP,_,_,_), IP). immediate_successors( function(_,_,_,_,_,IS,_,_), IS). predecessors( function(_,_,_,_,_,_,P,_), P). successors( function(_,_,_,_,_,_,_,S), S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Set operations assume that the sets are represented by an ordered list % of integers. set_union([], [], []). set_union([], [X|L2], [X|L2]). set_union([X|L1], [], [X|L1]). set_union([X|L1], [X|L2], [X|L3]) :- set_union(L1, L2, L3). set_union([X|L1], [Y|L2], [X|L3]) :- X < Y, set_union(L1, [Y|L2], L3). set_union([X|L1], [Y|L2], [Y|L3]) :- X > Y, set_union([X|L1], L2, L3). set_intersection([], [], []). set_intersection([], [_|_], []). set_intersection([_|_], [], []). set_intersection([X|L1], [X|L2], [X|L3]) :- set_intersection(L1, L2, L3). set_intersection([X|L1], [Y|L2], L3) :- X < Y, set_intersection(L1, [Y|L2], L3). set_intersection([X|L1], [Y|L2], L3) :- X > Y, set_intersection([X|L1], L2, L3). set_difference([], [], []). set_difference([], [_|_], []). set_difference([X|L1], [], [X|L1]). set_difference([X|L1], [X|L2], L3) :- set_difference(L1, L2, L3). set_difference([X|L1], [Y|L2], [X|L3]) :- X < Y, set_difference(L1, [Y|L2], L3). set_difference([X|L1], [Y|L2], L3) :- X > Y, set_difference([X|L1], L2, L3). set_subset([], _). set_subset([X|L1], [X|L2]) :- set_subset(L1, L2). set_subset([X|L1], [Y|L2]) :- X > Y, set_subset([X|L1], L2). set_member(X, [X|_]). set_member(X, [Y|T]) :- X > Y, set_member(X, T). % benchmark interface benchmark(ShowResult) :- nand(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/zebra.pl0000644004425400513100000000304410547152502015505 0ustar diazloco% Where does the zebra live? % Puzzle solution written by Claude Sammut. zebra(ShowResult) :- houses(Houses), mymember(house(red, english, _, _, _), Houses), mymember(house(_, spanish, dog, _, _), Houses), mymember(house(green, _, _, coffee, _), Houses), mymember(house(_, ukrainian, _, tea, _), Houses), right_of(house(green,_,_,_,_), house(ivory,_,_,_,_), Houses), mymember(house(_, _, snails, _, winstons), Houses), mymember(house(yellow, _, _, _, kools), Houses), Houses = [_, _, house(_, _, _, milk, _), _,_], Houses = [house(_, norwegian, _, _, _)|_], next_to(house(_,_,_,_,chesterfields), house(_,_,fox,_,_), Houses), next_to(house(_,_,_,_,kools), house(_,_,horse,_,_), Houses), mymember(house(_, _, _, orange_juice, lucky_strikes), Houses), mymember(house(_, japanese, _, _, parliaments), Houses), next_to(house(_,norwegian,_,_,_), house(blue,_,_,_,_), Houses), mymember(house(_, _, zebra, _, _), Houses), mymember(house(_, _, _, water, _), Houses), ( ShowResult = true -> print_houses(Houses) ; true). houses([ house(_, _, _, _, _), house(_, _, _, _, _), house(_, _, _, _, _), house(_, _, _, _, _), house(_, _, _, _, _) ]). right_of(A, B, [B, A | _]). right_of(A, B, [_ | Y]) :- right_of(A, B, Y). next_to(A, B, [A, B | _]). next_to(A, B, [B, A | _]). next_to(A, B, [_ | Y]) :- next_to(A, B, Y). mymember(X, [X|_]). mymember(X, [_|Y]) :- mymember(X, Y). print_houses([]). print_houses([A|B]) :- write(A), nl, print_houses(B). % benchmark interface benchmark(ShowResult) :- zebra(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/sendmore.pl0000644004425400513100000000224510547152502016220 0ustar diazloco % Cryptoaddition: % Find the unique answer to: % SEND % +MORE % ----- % MONEY % where each letter is a distinct digit. sendmore(ShowResult) :- digit(D), digit(E), D=\=E, sumdigit(0, D, E, Y, C1), digit(N), N=\=Y, N=\=E, N=\=D, digit(R), R=\=N, R=\=Y, R=\=E, R=\=D, sumdigit(C1,N, R, E, C2), digit(O), O=\=R, O=\=N, O=\=Y, O=\=E, O=\=D, sumdigit(C2,E, O, N, C3), leftdigit(S), S=\=O, S=\=R, S=\=N, S=\=Y, S=\=E, S=\=D, leftdigit(M), M=\=S, M=\=O, M=\=R, M=\=N, M=\=Y, M=\=E, M=\=D, sumdigit(C3,S, M, O, M), ( ShowResult = true -> write(' '),write(S),write(E),write(N),write(D),nl, write('+'),write(M),write(O),write(R),write(E),nl, write('-----'),nl, write(M),write(O),write(N),write(E),write(Y),nl,nl ; true), fail. sendmore(_). sumdigit(C, A, B, S, D) :- X is (C+A+B), (X<10 -> S=X, D=0 ; S is X-10, D=1 ). digit(0). digit(1). digit(2). digit(3). digit(4). digit(5). digit(6). digit(7). digit(8). digit(9). leftdigit(1). leftdigit(2). leftdigit(3). leftdigit(4). leftdigit(5). leftdigit(6). leftdigit(7). leftdigit(8). leftdigit(9). % benchmark interface benchmark(ShowResult) :- sendmore(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/WAMCC/0000777004425400513100000000000010547442375014714 5ustar diazloco./gprolog-1.3.0/ExamplesPl/WAMCC/MAKE_CLEAN0000755004425400513100000000002707220351116016236 0ustar diazloco#!/bin/sh rm -f [a-z]* ./gprolog-1.3.0/ExamplesPl/WAMCC/HOOK.pl0000644004425400513100000000035210547152502015773 0ustar diazloco% hook file for Wamcc % Count is passed as the first argument get_count(Count) :- unix(argv(L)), L = [ACount|_], name(ACount, LCodes), name(Count, LCodes). get_cpu_time(T) :- statistics(runtime, [T, _]). :- main. :- q, halt. ./gprolog-1.3.0/ExamplesPl/WAMCC/MAKE_PROGS0000755004425400513100000000051207220351116016305 0ustar diazloco#!/bin/sh BENCH_PL=`cat ../PROGS` p=`(cd ..;pwd)` p1=`pwd`; for i in ${*:-$BENCH_PL} do echo $i f=$i.pl sed -e 's/^:- include(common)\.//' $p/$i.pl >$f sed -e 's/^:- include(hook)\.//' $p/common.pl >>$f cat HOOK.pl >>$f wamcc $f w_gcc -s -o $i $i.c -lwamcc rm -f $i.c $i.h $i.usr done ./gprolog-1.3.0/ExamplesPl/cal.pl0000644004425400513100000000565110547152502015147 0ustar diazloco/* Calendar program: This algorithm was published in comp.programming and comes from Andy Lowry, lowry@watson.ibm.com, (914) 784-7925 IBM Research, P.O. Box 704, Yorktown Heights, NY 10598 % Original Prolog version by Peter Ludemann, % optimized for BinProlog by Paul Tarau. */ % Last 10000 FoolsDays arithmetic benchmark: cal(ShowResult):- N = 10000, day_of_week(1993,4,9,Day), ( ShowResult = true -> write('April 9, 1993 is: '), write(Day), write(' fools_days = '), write(N), nl ; true), empty_loop(N), full_loop(N). range(Min,Min,Max):- Min= I1 is M; I1 is I - 1), init(N1,I1,M,Npats,Ipats,Rest). fill(0,L,L) :- !. fill(N,L,[dummy([])|Rest]) :- N1 is N - 1, fill(N1,L,Rest). randomize([],[],_) :- !. randomize(In,[X|Out],Rand) :- my_length(In,Lin), Rand1 is (Rand * 17) mod 251, N is Rand1 mod Lin, split(N,In,X,In1), randomize(In1,Out,Rand1). split(0,[X|Xs],X,Xs) :- !. split(N,[X|Xs],RemovedElt,[X|Ys]) :- N1 is N - 1, split(N1,Xs,RemovedElt,Ys). investigate([],_) :- !. investigate([U|Units],Patterns) :- property(U,pattern,Data), p_investigate(Data,Patterns), investigate(Units,Patterns). get_pats(Npats,Ipats,Result) :- get_pats(Npats,Ipats,Result,Ipats). get_pats(0,_,[],_) :- !. get_pats(N,[X|Xs],[X|Ys],Ipats) :- N1 is N - 1, get_pats(N1,Xs,Ys,Ipats). get_pats(N,[],Ys,Ipats) :- get_pats(N,Ipats,Ys,Ipats). property([],_,_) :- fail. /* do not really need this */ property([Prop|_],P,Val) :- functor(Prop,P,_),!, arg(1,Prop,Val). property([_|RProps],P,Val) :- property(RProps,P,Val). p_investigate([],_). p_investigate([D|Data],Patterns) :- p_match(Patterns,D), p_investigate(Data,Patterns). p_match([],_). p_match([P|Patterns],D) :- (match(D,P),fail; true), p_match(Patterns,D). match([],[]) :- !. match([X|PRest],[Y|SRest]) :- var(Y),!,X = Y, match(PRest,SRest). match(List,[Y|Rest]) :- nonvar(Y),Y = star(X),!, concat(X,SRest,List), match(SRest,Rest). match([X|PRest],[Y|SRest]) :- (atom(X) -> X = Y; match(X,Y)), match(PRest,SRest). concat([],L,L). concat([X|L1],L2,[X|L3]) :- concat(L1,L2,L3). % benchmark interface benchmark(ShowResult) :- browse(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/sdda.pl0000644004425400513100000002663710547152502015332 0ustar diazloco% Sdda3 5-Oct-86 % For use on simulator %% To do: (look for '%%') %% recursion - keep list of call procedures, ignore recursive calls %% problem: doesn't work for typical procedure working on a list, %% since the list is smaller (different) each time. %% possible optimization: "recognize" base case & skip to it %% follow atoms, g is 'any atom', all others unique, does it work? %% stats - write heapused, cputime to files (as comments) %% worst_case - handle ground terms (copy unify, modify atomic) %% handle disjunction - needs worst_case %% add cuts where possible to save space %% fill in rest of built-ins %% how to handle op? %% Handle assert/retract? call? (If given ground terms- ok, vars- no) %% must have ground functor, definite number of args! % Front end for simulator use sdda(ShowResult):- do_sdda(test,_A,_B,_C, ShowResult). % Does the sdda on FileName, instantiates Exitmodes to list of exit modes, % ExitModes structure: [[Funtor/Arity, Activation, Exit], ... ], % e.g. [[a/2, [g,X], [g,g]] do_sdda(_FileName, ExitModes, _BackList, _PredList, ShowResult) :- %%see(FileName), read_procedures(Procs, ExitModes, Entries), % collect all procedures %%seen, ( ShowResult = true -> write('Procedures '), nl, write_list(Procs), nl, write('Entry points '), nl, write_list(Entries), nl, (nonvar(ExitModes) -> % Don't mention there (write('Declared exit modes '), nl, % aren't any write_list(ExitModes), nl) ; true), entry_exit_modes_list(Procs, ExitModes, Entries), write('Exit modes '), nl, write_list(ExitModes), nl ; true). %%% !!! Hard code in read for test: % sdda_entry(c(A,B,C)). % a(X, Y). % a(X, X). % c(A,B,C) :- a(A,B). read_procedures([[a/2,a(_109,_110),a(_148,_148)|_184], [c/3,(c(_191,_192,_193):-a(_191,_192))|_238]|_239], _68,[c(_76,_77,_78)|_102]) :- !. % For each entry point in Entries do sdda, building Known, an unbound-tail list % Known structure: [[Name/Arity, ActivationModes, ExitModes], ...|_], % where ActivationModes and ExitModes are lists of variables and the atom 'g'. % 'g' represents a ground element and variables represent equivalence classes. entry_exit_modes_list(_, _, Entries) :- % Done var(Entries). entry_exit_modes_list(ProcList, Known, [Entry|Entries]) :- Entry =.. [Functor|Act], % Get functor/arity & activation my_length(Act, Arity), % from entry declaration proc_exit_mode(ProcList, Known, [], Functor/Arity, Act, _), % No invoc. entry_exit_modes_list(ProcList, Known, Entries). % Do sdda on procedure Functor/Arity, given activation mode Act. Instantiates % Known to known exit modes and Act to exit modes for Functor/Arity under Act proc_exit_mode(_, _, _, Functor/Arity, Act, Exit) :- built_in(Functor/Arity, Act, Exit). % This is a built-in proc_exit_mode(_, Known, _, Functor/Arity, Act, Exit) :- look_up_act([Functor/Arity, Act, Exit], Known). % Already did this proc_exit_mode(ProcList, Known, Invocations, Functor/Arity, Act, Exit) :- umember([Functor/Arity|Clauses], ProcList), % Look up definition dup(Clauses, ClausesCopy), % Don't munge original clause_exit_modes_list(ProcList, Known, Invocations, ClausesCopy, Act, Exits), (Exits=[] -> fail ; true), % didn't find any => fail worst_case(Exits, Exit), % assume the worst dup(Act, ActCopy), % Need copy because Body add_to_list([Functor/Arity, ActCopy, Exit], Known). % binds Act & Exit proc_exit_mode(_, Known, _, Functor/Arity, Act, Exit) :- write('No such procedure at compile time '), Activation=..[Functor|Act], write(Activation), nl, all_shared(Act, Exit), % return worst possible - all shared add_to_list([Functor/Arity, Act, Exit], Known). my_length(L, N) :- my_length1(L, 0, N). my_length1([], N, N). my_length1([_|L], M, N) :- M1 is M+1, my_length1(L, M1, N). % Analyze all clauses for this procedure, instantiate Exits to all exit modes clause_exit_modes_list(_, _, _, Clauses, _, []) :- var(Clauses), !. % No more clauses => done clause_exit_modes_list(ProcList, Known, Invocations, [Clause|Clauses], Act, Exits) :- eqmember([Clause, Act], Invocations), % This is a recursive write('skipping clause exit mode for '), write(Clause), write(' '), write(Act), nl, clause_exit_modes_list(ProcList, Known, Invocations, % call, ignore Clauses, Act, Exits). % it clause_exit_modes_list(ProcList, Known, Invocations, [Clause|Clauses], Act, [Exit|Exits]) :- dup(Act, Exit), % We'll bind Exit clause_exit_mode(ProcList, Known, [[Clause, Act]|Invocations], Clause, Exit), % Record invocation clause_exit_modes_list(ProcList, Known, Invocations, Clauses, Act, Exits). clause_exit_modes_list(ProcList, Known, Invocations, [_Clause|Clauses], Act, Exits) :- % Unify failed clause_exit_modes_list(ProcList, Known, Invocations, Clauses, Act, Exits). % Given activation modes for this clause, return its exit modes clause_exit_mode(ProcList, Known, Invocations, Clause, Act) :- (Clause = ':-'(Head, Body) ; Clause=Head, Body=true), % Decompose it Head =.. [_|Args], % Bind the head unify(Args, Act), % to activation body_exit_mode(ProcList, Known, Invocations, Body). % do the body body_exit_mode(ProcList, Known, Invocations, ','(Goal, Goals)) :- % Conjunction body_exit_mode(ProcList, Known, Invocations, Goal), % Do 1st body_exit_mode(ProcList, Known, Invocations, Goals). % & rest body_exit_mode(ProcList, Known, Invocation, Goal) :- functor(Goal, Functor, Arity), Goal =.. [Functor|Act], proc_exit_mode(ProcList, Known, Invocation, Functor/Arity, Act, Exit), unify(Act, Exit). % Unifies Left and Right with the special case that the atom 'g' matches % any atom (except []) unify(Left, Left) :- !. % Try standard unify first unify(Left, g) :- % else, is it special case atomic(Left), !, \+ Left=[]. unify(g, Right) :- atomic(Right), !, \+ Right=[]. unify([LeftHead|LeftTail], [RightHead|RightTail]) :- % or list !, unify(LeftHead, RightHead), unify(LeftTail, RightTail). unify(Left, Right) :- % or structure Left =.. [Functor|LeftArgs], Right =.. [Functor|RightArgs], unify(LeftArgs, RightArgs). % Succeed if Left and Right are equivalent, i.e. they are the exact same % with variables renamed equiv(Left, Right) :- equiv(Left, Right, _). equiv(Left, Right, _) :- Left==Right, !. equiv(g, Right, _) :- atomic(Right), !, \+ Right=[]. equiv(Left, g, _) :- atomic(Left), !, \+ Left=[]. equiv(Left, Right, Bindings) :- var(Left), !, var(Right), equiv_vars(Left, Right, Bindings). equiv(Left, Right, Bindings) :- var(Right), !, var(Left), equiv_vars(Left, Right, Bindings). equiv([LeftHead|LeftTail], [RightHead|RightTail], Bindings) :- !, equiv(LeftHead, RightHead, Bindings), equiv(LeftTail, RightTail, Bindings). equiv(Left, Right, Bindings) :- Left=..[Functor|LeftArgs], Right=..[Functor|RightArgs], equiv(LeftArgs, RightArgs, Bindings). equiv_vars(Left, Right, Bindings) :- var(Bindings), !, Bindings=[[Left, Right]|_]. equiv_vars(Left, Right, [[AnyVar, AnyBinding]|_]) :- Left==AnyVar, !, Right==AnyBinding. equiv_vars(Left, Right, [[AnyVar, AnyBinding]|_]) :- Right==AnyBinding, !, Left==AnyVar. equiv_vars(Left, Right, [ _|Bindings]) :- equiv_vars(Left, Right, Bindings). % Make a copy of Orig with new vars. Copy must be a variable. % E.g. dup([A,s(A,B),[B,C]], New) binds New to [X,s(X,Y),[Y,Z]] dup(Orig, Copy) :- dup(Orig, Copy, _). dup(Orig, Copy, Bindings) :- var(Orig), !, dup_var(Orig, Copy, Bindings). dup(Orig, Orig, _) :- % Atoms, including [] atomic(Orig), !. dup([OrigHead|OrigTail], [CopyHead|CopyTail], Bindings) :- !, dup(OrigHead, CopyHead, Bindings), dup(OrigTail, CopyTail, Bindings). dup(Orig, Copy, Bindings) :- Orig=..[Functor|OrigArgs], dup(OrigArgs, CopyArgs, Bindings), Copy=..[Functor|CopyArgs]. dup_var(Orig, Copy, Bindings) :- var(Bindings), !, Bindings=[[Orig, Copy]|_]. dup_var(Orig, Copy, [[AnyVar, Copy]|_]) :- Orig==AnyVar, !. dup_var(Orig, Copy, [_|Bindings]) :- dup_var(Orig, Copy, Bindings). % ----- Built-ins ----- % built_in(true/0, [], []). % No change built_in(fail/0, [], []). % No change built_in((=)/2, [X, Y], [g, g]) :- (atomic(X) ; atomic(Y)). % Ground both if either atomic built_in((=)/2, [X, _Y], [X, X]). % else bind them built_in(/('+',2), [X, Y], [X, Y]). % No change built_in(/('-',2), [X, Y], [X, Y]). % No change built_in(/('*',2), [X, Y], [X, Y]). % No change built_in(/('/',2), [X, Y], [X, Y]). % No change built_in(/('>=',2), [X, Y], [X, Y]). % No change built_in(/('<',2), [X, Y], [X, Y]). % No change built_in((is)/2, [_X, Y], [g, Y]). % Ground result % ----- Utilities ----- % worst_case([], _). %% Doesn't work if any Exits worst_case([Exit|Exits], Worst) :- %% fail to match, e.g. unify(Exit, Worst), %% [[s(1)], [f(1)]]. worst_case(Exits, Worst). look_up_act(_, Known) :- var(Known), !, fail. look_up_act([Functor/Arity, Act, Exit], [[Functor/Arity, KnownAct, Exit]|_]) :- equiv(Act, KnownAct). look_up_act([Functor/Arity, Act, Exit], [_|Known]) :- look_up_act([Functor/Arity, Act, Exit], Known). all_shared(_Act, _Exit) :- %% Wrong fail. % DD: I have put fail since unify/3 does not exist /* all_shared(Act, Exit) :- %% Wrong unify(Act, _, VarModesList), bind_all(_, VarModesList), unify(Act, Exit, VarModesList). bind_all(_, VarModesList) :- var(VarModesList). bind_all(Mode, [[Var, Mode]|VarModesList]) :- var(Mode), bind_all(Mode, VarModesList). bind_all(Mode, [[_, _]|VarModesList]) :- bind_all(Mode, VarModesList). */ % Adds Element to the tail of List, an unbound-tail list add_to_list(Element, List) :- var(List), List=[Element|_]. add_to_list(Element, [_|List]) :- add_to_list(Element, List). % Membership relation for unbound-tail lists umember(_, List) :- var(List), !, fail. umember(Element, [Element|_]). umember(Element, [_|Tail]) :- umember(Element, Tail). /* % Membership relation for standard nil-tail lists member(X, [X|_]). member(X, [_|T]) :- member(X, T). */ % Equiv membership relation for standard nil-tail lists eqmember(X, [Y|_]) :- equiv(X, Y). eqmember(X, [_|T]) :- eqmember(X, T). % Pretty prints unbound-tail lists -- dies on NIL tail lists write_list(List) :- dup(List, NewList), (var(NewList) -> (name_vars(NewList, 0, _), write(NewList)) ; (write('['), write_list2(NewList, 0, _), write('|_].'))), % write('].') to write nil tails nl. write_list2([H|T], NextName, NewNextName) :- name_vars(H, NextName, TempNextName), write(H), (nonvar(T) -> (write(','), nl, write(' '), write_list2(T, TempNextName, NewNextName)) ; NewNextName = TempNextName). name_vars(Term, NextName, NewNextName) :- var(Term), !, make_name(NextName, Term), NewNextName is NextName + 1. name_vars(Term, NextName, NextName) :- atom(Term), !. name_vars([TermHead|TermTail], NextName, NewNextName) :- !, name_vars(TermHead, NextName, TempNextName), name_vars(TermTail, TempNextName, NewNextName). name_vars(Term, NextName, NewNextName) :- Term =.. [_|TermArgs], name_vars(TermArgs, NextName, NewNextName). make_name(IntName, Variable) :- Count is IntName // 26, NewIntName is IntName mod 26 + "A", build_name(Count, NewIntName, Name), name(Variable, Name). build_name(0, IntName, [IntName]) :- !. build_name(Count, IntName, [IntName|Rest]) :- Count>0, NewCount is Count - 1, build_name(NewCount, IntName, Rest). % benchmark interface benchmark(ShowResult) :- sdda(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/reducer.pl0000644004425400513100000002670510547152502016044 0ustar diazloco%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % A Graph Reducer for T-Combinators: % Reduces a T-combinator expression to a final answer. Recognizes % the combinators I,K,S,B,C,S',B',C', cond, apply, arithmetic, tests, % basic list operations, and function definitions in the data base stored % as facts of the form t_def(_func, _args, _expr). % Written by Peter Van Roy % Uses write/1, compare/3, functor/3, arg/3. reducer(ShowResult) :- try(fac(3), _ans1), (ShowResult = true -> write(_ans1), nl ; true), try(quick([3,1,2]), _ans2), (ShowResult = true -> write(_ans2), nl ; true). try(_inpexpr, _anslist) :- listify(_inpexpr, _list), curry(_list, _curry), t_reduce(_curry, _ans), % nl, make_list(_ans, _anslist). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Examples of applicative functions which can be compiled & executed. % This test version compiles them just before each execution. % Factorial function: t_def(fac, [N], cond(N=0, 1, N*fac(N-1))). % Quicksort: t_def(quick, [_l], cond(_l=[], [], cond(tl(_l)=[], _l, quick2(split(hd(_l),tl(_l)))))). t_def(quick2, [_l], append(quick(hd(_l)), quick(tl(_l)))). t_def(split, [_e,_l], cond(_l=[], [[_e]|[]], cond(hd(_l)=<_e, inserthead(hd(_l),split(_e,tl(_l))), inserttail(hd(_l),split(_e,tl(_l)))))). t_def(inserthead, [_e,_l], [[_e|hd(_l)]|tl(_l)]). t_def(inserttail, [_e,_l], [hd(_l)|[_e|tl(_l)]]). t_def(append, [_a,_b], cond(_a=[], _b, [hd(_a)|append(tl(_a),_b)])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Full reduction: % A dot '.' is printed for each reduction step. t_reduce(_expr, _ans) :- atomic(_expr), !, _ans=_expr. % The reduction of '.' must be here to avoid an infinite loop t_reduce([_y,_x|'.'], [_yr,_xr|'.']) :- t_reduce(_x, _xr), !, t_reduce(_y, _yr), !. t_reduce(_expr, _ans) :- t_append(_next, _red, _form, _expr), % write('.'), t_redex(_form, _red), !, t_reduce(_next, _ans), !. t_append(_link, _link, _l, _l). t_append([_a|_l1], _link, _l2, [_a|_l3]) :- t_append(_l1, _link, _l2, _l3). % One step of the reduction: % Combinators: t_redex([_x,_g,_f,_k|sp], [[_xr|_g],[_xr|_f]|_k]) :- t_reduce(_x, _xr). t_redex([_x,_g,_f,_k|bp], [[_x|_g],_f|_k]). t_redex([_x,_g,_f,_k|cp], [_g,[_x|_f]|_k]). t_redex([_x,_g,_f|s], [[_xr|_g]|[_xr|_f]]) :- t_reduce(_x, _xr). t_redex([_x,_g,_f|b], [[_x|_g]|_f]). t_redex([_x,_g,_f|c], [_g,_x|_f]). t_redex([_y,_x|k], _x). t_redex([_x|i], _x). % Conditional: t_redex([_elsepart,_ifpart,_cond|cond], _ifpart) :- t_reduce(_cond, _bool), _bool=true, !. % Does NOT work if _bool is substituted in the call! t_redex([_elsepart,_ifpart,_cond|cond], _elsepart). % Apply: t_redex([_f|apply], _fr) :- t_reduce(_f, _fr). % List operations: t_redex([_arg|hd], _x) :- t_reduce(_arg, [_y,_x|'.']). t_redex([_arg|tl], _y) :- t_reduce(_arg, [_y,_x|'.']). % Arithmetic: t_redex([_y,_x|_op], _res) :- atom(_op), my_member(_op, ['+', '-', '*', '//', 'mod']), t_reduce(_x, _xres), t_reduce(_y, _yres), number(_xres), number(_yres), eval(_op, _res, _xres, _yres). % Tests: t_redex([_y,_x|_test], _res) :- atom(_test), my_member(_test, ['<', '>', '=<', '>=', '=\\=', '=:=']), t_reduce(_x, _xres), t_reduce(_y, _yres), number(_xres), number(_yres), (relop(_test, _xres, _yres) -> _res=true ; _res=false ), !. % Equality: t_redex([_y,_x|=], _res) :- t_reduce(_x, _xres), t_reduce(_y, _yres), (_xres=_yres -> _res=true; _res=false), !. % Arithmetic functions: t_redex([_x|_op], _res) :- atom(_op), my_member(_op, ['-']), t_reduce(_x, _xres), number(_xres), eval1(_op, _t, _xres). % Definitions: % Assumes a fact t_def(_func,_def) in the database for every % defined function. t_redex(_in, _out) :- my_append(_par,_func,_in), atom(_func), t_def(_func, _args, _expr), t(_args, _expr, _def), my_append(_par,_def,_out). % Basic arithmetic and relational operators: eval( '+', C, A, B) :- C is A + B. eval( '-', C, A, B) :- C is A - B. eval( '*', C, A, B) :- C is A * B. eval( '//', C, A, B) :- C is A // B. eval('mod', C, A, B) :- C is A mod B. eval1('-', C, A) :- C is -A. relop( '<', A, B) :- A', A, B) :- A>B. relop( '=<', A, B) :- A==', A, B) :- A>=B. relop('=\\=', A, B) :- A=\=B. relop('=:=', A, B) :- A=:=B. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Scheme T: % A Translation Scheme for T-Combinators % Translate an expression to combinator form % by abstracting out all variables in _argvars: t(_argvars, _expr, _trans) :- listify(_expr, _list), curry(_list, _curry), t_argvars(_argvars, _curry, _trans), !. t_argvars([], _trans, _trans). t_argvars([_x|_argvars], _in, _trans) :- t_argvars(_argvars, _in, _mid), t_vars(_mid, _vars), % calculate variables in each subexpression t_trans(_x, _mid, _vars, _trans). % main translation routine % Curry the original expression: % This converts an applicative expression of any number % of arguments and any depth of nesting into an expression % where all functions are curried, i.e. all function % applications are to one argument and have the form % [_arg|_func] where _func & _arg are also of that form. % Input is a nested function application in list form. % Currying makes t_trans faster. curry(_a, _a) :- (var(_a); atomic(_a)), !. curry([_func|_args], _cargs) :- currylist(_args, _cargs, _func). % Transform [_a1, ..., _aN] to [_cN, ..., _c1|_link]-_link currylist([], _link, _link) :- !. currylist([_a|_args], _cargs, _link) :- curry(_a, _c), currylist(_args, _cargs, [_c|_link]). % Calculate variables in each subexpression: % To any expression a list of the form % [_vexpr, _astr, _fstr] is matched. % If the expression is a variable or an atom % then this list only has the first element. % _vexpr = List of all variables in the expression. % _astr, _fstr = Similar structures for argument & function. t_vars(_v, [[_v]]) :- var(_v), !. t_vars(_a, [[]]) :- atomic(_a), !. t_vars([_func], [[]]) :- atomic(_func), !. t_vars([_arg|_func], [_g,[_g1|_af1],[_g2|_af2]]) :- t_vars(_arg, [_g1|_af1]), t_vars(_func, [_g2|_af2]), unionv(_g1, _g2, _g). % The main translation routine: % trans(_var, _curriedexpr, _varexpr, _result) % The translation scheme T in the article is followed literally. % A good example of Prolog as a specification language. t_trans(_x, _a, _, [_a|k]) :- (atomic(_a); var(_a), _a\==_x), !. t_trans(_x, _y, _, i) :- _x==_y, !. t_trans(_x, _e, [_ve|_], [_e|k]) :- notinv(_x, _ve). t_trans(_x, [_f|_e], [_vef,_sf,_se], _res) :- _sf=[_vf|_], _se=[_ve|_other], (atom(_e); _other=[_,[_ve1|_]], _ve1\==[]), t_rule1(_x, _e, _ve, _se, _f, _vf, _sf, _res). t_trans(_x, [_g|[_f|_e]], [_vefg,_sg,_sef], _res) :- _sg=[_vg|_], _sef=[_vef,_sf,_se], _se=[_ve|_], _sf=[_vf|_], t_rule2(_x, _e, _f, _vf, _sf, _g, _vg, _sg, _res). % First complex rule of translation scheme T: t_rule1(_x, _e, _ve, _se, _f, _vf, _sf, _e) :- notinv(_x, _ve), _x==_f, !. t_rule1(_x, _e, _ve, _se, _f, _vf, _sf, [_resf,_e|b]) :- notinv(_x, _ve), inv(_x, _vf), _x\==_f, !, t_trans(_x, _f, _sf, _resf). t_rule1(_x, _e, _ve, _se, _f, _vf, _sf, [_f,_rese|c]) :- /* inv(_x, _ve), */ notinv(_x, _vf), !, t_trans(_x, _e, _se, _rese). t_rule1(_x, _e, _ve, _se, _f, _vf, _sf, [_resf,_rese|s]) :- /* inv(_x, _ve), inv(_x, _vf), */ t_trans(_x, _e, _se, _rese), t_trans(_x, _f, _sf, _resf). % Second complex rule of translation scheme T: t_rule2(_x, _e, _f, _vf, _sf, _g, _vg, _sg, [_g,_e|c]) :- _x==_f, notinv(_x, _vg), !. t_rule2(_x, _e, _f, _vf, _sf, _g, _vg, _sg, [_resg,_e|s]) :- _x==_f, /* inv(_x, _vg), */ !, t_trans(_x, _g, _sg, _resg). t_rule2(_x, _e, _f, _vf, _sf, _g, _vg, _sg, [_g,_resf,_e|cp]) :- /* _x\==_f, */ inv(_x, _vf), notinv(_x, _vg), !, t_trans(_x, _f, _sf, _resf). t_rule2(_x, _e, _f, _vf, _sf, _g, _vg, _sg, [_resg,_resf,_e|sp]) :- /* _x\==_f, */ inv(_x, _vf), /* inv(_x, _vg), */ !, t_trans(_x, _f, _sf, _resf), t_trans(_x, _g, _sg, _resg). t_rule2(_x, _e, _f, _vf, _sf, _g, _vg, _sg, [_f|_e]) :- /* notinv(_x, _vf), */ _x==_g, !. t_rule2(_x, _e, _f, _vf, _sf, _g, _vg, _sg, [_resg,_f,_e|bp]) :- /* notinv(_x, _vf), inv(_x, _vg), _x\==_g, */ t_trans(_x, _g, _sg, _resg). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % List utilities: % Convert curried list into a regular list: make_list(_a, _a) :- atomic(_a). make_list([_b,_a|'.'], [_a|_rb]) :- make_list(_b, _rb). listify(_X, _X) :- (var(_X); atomic(_X)), !. listify(_Expr, [_Op|_LArgs]) :- functor(_Expr, _Op, N), listify_list(1, N, _Expr, _LArgs). listify_list(I, N, _, []) :- I>N, !. listify_list(I, N, _Expr, [_LA|_LArgs]) :- I=, A, S1, _, S2, S) :- intersectv_2(S2, A, S1, S). intersectv_list([], []). intersectv_list([InS|Sets], OutS) :- intersectv_list(Sets, InS, OutS). /* without DCG */ intersectv_list([], A, A). intersectv_list([A|B], C, D) :- intersectv(A, C, E), intersectv_list(B, E, D). /* PB to compile DCG with CIAO in our general environment intersectv_list([]) --> []. intersectv_list([S|Sets]) --> intersectv(S), intersectv_list(Sets). */ % *** Difference diffv([], _, []). diffv([A|S1], S2, S) :- diffv_2(S2, A, S1, S). diffv_2([], A, S1, [A|S1]). diffv_2([B|S2], A, S1, S) :- compare(Order, A, B), diffv_3(Order, A, S1, B, S2, S). diffv_3(<, A, S1, B, S2, [A|S]) :- diffv(S1, [B|S2], S). diffv_3(=, _A, S1, _, S2, S) :- diffv(S1, S2, S). diffv_3(>, A, S1, _, S2, S) :- diffv_2(S2, A, S1, S). % *** Union unionv([], S2, S2). unionv([A|S1], S2, S) :- unionv_2(S2, A, S1, S). unionv_2([], A, S1, [A|S1]). unionv_2([B|S2], A, S1, S) :- compare(Order, A, B), unionv_3(Order, A, S1, B, S2, S). unionv_3(<, A, S1, B, S2, [A|S]) :- unionv_2(S1, B, S2, S). unionv_3(=, A, S1, _, S2, [A|S]) :- unionv(S1, S2, S). unionv_3(>, A, S1, B, S2, [B|S]) :- unionv_2(S2, A, S1, S). % *** Subset subsetv([], _). subsetv([A|S1], [B|S2]) :- compare(Order, A, B), subsetv_2(Order, A, S1, S2). subsetv_2(=, _, S1, S2) :- subsetv(S1, S2). subsetv_2(>, A, S1, S2) :- subsetv([A|S1], S2). % For unordered lists S1: small_subsetv([], _). small_subsetv([A|S1], S2) :- inv(A, S2), small_subsetv(S1, S2). % *** Membership inv(A, [B|S]) :- compare(Order, A, B), inv_2(Order, A, S). inv_2(=, _, _). inv_2(>, A, S) :- inv(A, S). % *** Non-membership notinv(A, S) :- notinv_2(S, A). notinv_2([], _). notinv_2([B|S], A) :- compare(Order, A, B), notinv_3(Order, A, S). notinv_3(<, _, _). notinv_3(>, A, S) :- notinv_2(S, A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % benchmark interface benchmark(ShowResult) :- reducer(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/poly_10.pl0000644004425400513100000000614210547152502015667 0ustar diazloco% generated: 8 March 1990 % option(s): NO_TERM_COMPARE % % (poly) poly_10 % % Ralph Haygood (based on Prolog version by Rick McGeer % based on Lisp version by R. P. Gabriel) % % raise a polynomial (1+x+y+z) to the 10th power (symbolically) :- op(700,xfx,less_than). poly_10(_ShowResult) :- test_poly(P), poly_exp(10, P, _R). % test polynomial definition test_poly(P) :- poly_add(poly(x,[term(0,1),term(1,1)]),poly(y,[term(1,1)]),Q), poly_add(poly(z,[term(1,1)]),Q,P). % 'less_than'/2 for x, y, z x less_than y. y less_than z. x less_than z. % polynomial addition poly_add(poly(Var,Terms1), poly(Var,Terms2), poly(Var,Terms)) :- !, term_add(Terms1, Terms2, Terms). poly_add(poly(Var1,Terms1), poly(Var2,Terms2), poly(Var1,Terms)) :- Var1 less_than Var2, !, add_to_order_zero_term(Terms1, poly(Var2,Terms2), Terms). poly_add(Poly, poly(Var,Terms2), poly(Var,Terms)) :- !, add_to_order_zero_term(Terms2, Poly, Terms). poly_add(poly(Var,Terms1), C, poly(Var,Terms)) :- !, add_to_order_zero_term(Terms1, C, Terms). poly_add(C1, C2, C) :- C is C1+C2. % term addition term_add([], X, X) :- !. term_add(X, [], X) :- !. term_add([term(E,C1)|Terms1], [term(E,C2)|Terms2], [term(E,C)|Terms]) :- !, poly_add(C1, C2, C), term_add(Terms1, Terms2, Terms). term_add([term(E1,C1)|Terms1], [term(E2,C2)|Terms2], [term(E1,C1)|Terms]) :- E1 < E2, !, term_add(Terms1, [term(E2,C2)|Terms2], Terms). term_add(Terms1, [term(E2,C2)|Terms2], [term(E2,C2)|Terms]) :- term_add(Terms1, Terms2, Terms). add_to_order_zero_term([term(0,C1)|Terms], C2, [term(0,C)|Terms]) :- !, poly_add(C1, C2, C). add_to_order_zero_term(Terms, C, [term(0,C)|Terms]). % polynomial exponentiation poly_exp(0, _, 1) :- !. poly_exp(N, Poly, Result) :- M is N>>1, N is M<<1, !, poly_exp(M, Poly, Part), poly_mul(Part, Part, Result). poly_exp(N, Poly, Result) :- M is N-1, poly_exp(M, Poly, Part), poly_mul(Poly, Part, Result). % polynomial multiplication poly_mul(poly(Var,Terms1), poly(Var,Terms2), poly(Var,Terms)) :- !, term_mul(Terms1, Terms2, Terms). poly_mul(poly(Var1,Terms1), poly(Var2,Terms2), poly(Var1,Terms)) :- Var1 less_than Var2, !, mul_through(Terms1, poly(Var2,Terms2), Terms). poly_mul(P, poly(Var,Terms2), poly(Var,Terms)) :- !, mul_through(Terms2, P, Terms). poly_mul(poly(Var,Terms1), C, poly(Var,Terms)) :- !, mul_through(Terms1, C, Terms). poly_mul(C1, C2, C) :- C is C1*C2. term_mul([], _, []) :- !. term_mul(_, [], []) :- !. term_mul([Term|Terms1], Terms2, Terms) :- single_term_mul(Terms2, Term, PartA), term_mul(Terms1, Terms2, PartB), term_add(PartA, PartB, Terms). single_term_mul([], _, []) :- !. single_term_mul([term(E1,C1)|Terms1], term(E2,C2), [term(E,C)|Terms]) :- E is E1+E2, poly_mul(C1, C2, C), single_term_mul(Terms1, term(E2,C2), Terms). mul_through([], _, []) :- !. mul_through([term(E,Term)|Terms], Poly, [term(E,NewTerm)|NewTerms]) :- poly_mul(Term, Poly, NewTerm), mul_through(Terms, Poly, NewTerms). % benchmark interface benchmark(ShowResult) :- poly_10(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/YAP/0000777004425400513100000000000010547442375014513 5ustar diazloco./gprolog-1.3.0/ExamplesPl/YAP/MAKE_CLEAN0000755004425400513100000000002707220351116016035 0ustar diazloco#!/bin/sh rm -f [a-z]* ./gprolog-1.3.0/ExamplesPl/YAP/HOOK.pl0000644004425400513100000000040710547152502015573 0ustar diazloco% hook file for YAP Prolog % Count is passed on the command line as -- Count get_count(Count) :- unix(argv(L)), L = [ACount|_], atom_codes(ACount, LCodes), number_codes(Count, LCodes). get_cpu_time(T) :- statistics(runtime, [T, _]). :- initialization(q). ./gprolog-1.3.0/ExamplesPl/YAP/MAKE_PROGS0000755004425400513100000000064107220351116016107 0ustar diazloco#!/bin/sh BENCH_PL=`cat ../PROGS` p=`(cd ..;pwd)` p1=`pwd`; for i in ${*:-$BENCH_PL} do echo $i f=$p1/$i.pl echo "#!/bin/sh" >$i echo "sed -e 's/^:- include(common)\.//' $p/$i.pl >$f" >>$i echo "sed -e 's/^:- include(hook)\.//' $p/common.pl >>$f" >>$i echo "cat $p1/HOOK.pl >>$f" >>$i echo "echo \"compile('$f'). \" | yap -- \$* 2>/dev/null" >>$i chmod a+x $i done ./gprolog-1.3.0/ExamplesPl/XSB/0000777004425400513100000000000010547442376014517 5ustar diazloco./gprolog-1.3.0/ExamplesPl/XSB/MAKE_CLEAN0000755004425400513100000000002707220351116016040 0ustar diazloco#!/bin/sh rm -f [a-z]* ./gprolog-1.3.0/ExamplesPl/XSB/HOOK.pl0000644004425400513100000000040210547152502015571 0ustar diazloco% hook file for XSB Prolog % Count is passed using command line argument -e 'assertz(count(Count)).' get_count(Count) :- clause(count(Count),_). get_cpu_time(T) :- cputime(X), T is floor(X*1000). % no initialization, script executes q/0 after consult ./gprolog-1.3.0/ExamplesPl/XSB/MAKE_PROGS0000755004425400513100000000072707220351116016117 0ustar diazloco#!/bin/sh BENCH_PL=`cat ../PROGS` p=`(cd ..;pwd)` p1=`pwd`; for i in ${*:-$BENCH_PL} do echo $i f=$p1/$i.P echo "#!/bin/sh" >$i echo "sed -e 's/^:- include(common)\.//' $p/$i.pl >$f" >>$i echo "sed -e 's/^:- include(hook)\.//' $p/common.pl >>$f" >>$i echo "cat $p1/HOOK.pl >>$f" >>$i echo "echo \"asserta(count(\${1:-1})), ['$f'], q, halt. \" | xsb --noprompt --quietload --nobanner 2>/dev/null" >>$i chmod a+x $i done ./gprolog-1.3.0/ExamplesPl/SWI/0000777004425400513100000000000010547442376014525 5ustar diazloco./gprolog-1.3.0/ExamplesPl/SWI/MAKE_CLEAN0000755004425400513100000000002707220351116016046 0ustar diazloco#!/bin/sh rm -f [a-z]* ./gprolog-1.3.0/ExamplesPl/SWI/HOOK.pl0000644004425400513100000000066210547152502015607 0ustar diazloco% hook file for SWI Prolog % Count is passed on the command line as the last argument (1st is 'pl') get_count(Count) :- unix(argv(L)), get_last(L, ACount), atom_codes(ACount, LCodes), number_codes(Count, LCodes). get_last([Count], Count):- !, sub_atom(Count, 0, 1, _, X), X @>= '0', X @=< '9'. get_last([_|L], Count):- get_last(L, Count). get_cpu_time(T) :- statistics(cputime, X), T is X*1000. :- initialization(q). ./gprolog-1.3.0/ExamplesPl/SWI/MAKE_PROGS0000755004425400513100000000071307220351116016120 0ustar diazloco#!/bin/sh BENCH_PL=`cat ../PROGS` p=`(cd ..;pwd)` p1=`pwd`; for i in ${*:-$BENCH_PL} do echo $i f=$p1/$i.pl echo "#!/bin/sh" >$i echo "sed -e 's/^:- include(common)\.//' $p/$i.pl >$f" >>$i echo "sed -e 's/^:- include(hook)\.//' $p/common.pl >>$f" >>$i echo "cat $p1/HOOK.pl >>$f" >>$i echo "pl -L6000 -G6000 -T6000 -f none -g \"load_files(['$f'],[silent(true)])\" -t halt \$*" >>$i chmod a+x $i done ./gprolog-1.3.0/ExamplesPl/CIAO/0000777004425400513100000000000010547442375014575 5ustar diazloco./gprolog-1.3.0/ExamplesPl/CIAO/MAKE_CLEAN0000755004425400513100000000002707220351116016117 0ustar diazloco#!/bin/sh rm -f [a-z]* ./gprolog-1.3.0/ExamplesPl/CIAO/HOOK.pl0000644004425400513100000000053610547152502015660 0ustar diazloco% hook file for CIAO Prolog :- use_module(library(prolog_sys), [statistics/2]). % Count is passed as first argument get_count(Count) :- current_prolog_flag(argv, L), L = [ACount|_], atom_codes(ACount, LCodes), number_codes(Count, LCodes). get_cpu_time(T) :- statistics(runtime, [T, _]). % main/0 needed by ciaoc main. :- initialization(q). ./gprolog-1.3.0/ExamplesPl/CIAO/MAKE_PROGS0000755004425400513100000000047007220351116016171 0ustar diazloco#!/bin/sh BENCH_PL=`cat ../PROGS` p=`(cd ..;pwd)` p1=`pwd`; for i in ${*:-$BENCH_PL} do echo $i f=$p1/$i.pl sed -e 's/^:- include(common)\.//' $p/$i.pl >$f sed -e 's/^:- include(hook)\.//' $p/common.pl >>$f cat $p1/HOOK.pl >>$f ciaoc $f rm -f $i.itf $i.po done ./gprolog-1.3.0/ExamplesPl/nrev.pl0000644004425400513100000000233310547152502015354 0ustar diazloco/* The naive reverse benchmark */ nrev(ShowResult) :- bench(250, ShowResult). nrev([],[]). nrev([X|Rest],Ans):- nrev(Rest,L), app(L,[X],Ans). app([],L,L). app([X|L1],L2,[X|L3]):- app(L1,L2,L3). /* commented since it is defined in common.pl get_cpu_time(T) :- statistics(runtime,[T|_]). */ bench(Count, ShowResult):- get_cpu_time(T0), dodummy(Count), get_cpu_time(T1), dobench(Count), get_cpu_time(T2), ( ShowResult = true -> report(Count,T0,T1,T2) ; true). dobench(Count):- data(List), repeat(Count), nrev(List,_), fail. dobench(_). dodummy(Count):- data(List), repeat(Count), dummy(List,_), fail. dodummy(_). dummy(_,_). data(X):- data(X,30). data([],0). data([a|Y],N):- N > 0, N1 is N-1, data(Y,N1). repeat(_N). repeat(N):- N > 1, N1 is N-1, repeat(N1). report(Count,T0,T1,T2) :- Time1 is T1-T0, Time2 is T2-T1, Time is Time2-Time1, /* Time spent on nreving lists */ Lips is (496*Count*1000)//Time, write(Lips), write(' lips for '), write(Count), write(' iterations taking '), write(Time), write(' msec ('), write(Time2-Time1), write(')'), nl. % benchmark interface benchmark(ShowResult) :- nrev(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/tak_gvar.pl0000644004425400513100000000162110547152502016177 0ustar diazloco% generated: 17 November 1989 % option(s): SOURCE_TRANSFORM_1 % % tak % % Evan Tick (from Lisp version by R. P. Gabriel) % % (almost) Takeuchi function (recursive arithmetic) % uses global variables to tabulate results tak_gvar(ShowResult) :- init_tak_array, tak(18,12,6,R), ( ShowResult = true -> write(tak(18,12,6)=R), nl ; true). init_tak_array:- g_assign(tak,g_array_auto(20,g_array_auto(20,g_array_auto(20,null)))). tak(X,Y,Z,A):- g_read(tak(X,Y,Z),A1), (integer(A1) -> A=A1 ; tak1(X,Y,Z,A), g_assign(tak(X,Y,Z),A)). tak1(X,Y,Z,A):- X =< Y, Z = A. tak1(X,Y,Z,A):- X > Y, X1 is X - 1, tak(X1,Y,Z,A1), Y1 is Y - 1, tak(Y1,Z,X,A2), Z1 is Z - 1, tak(Z1,X,Y,A3), tak(A1,A2,A3,A). % benchmark interface benchmark(ShowResult) :- tak_gvar(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/SICSTUS/0000777004425400513100000000000010547442375015217 5ustar diazloco./gprolog-1.3.0/ExamplesPl/SICSTUS/MAKE_CLEAN0000755004425400513100000000002707220351116016541 0ustar diazloco#!/bin/sh rm -f [a-z]* ./gprolog-1.3.0/ExamplesPl/SICSTUS/HOOK.pl0000644004425400513100000000043210547152502016275 0ustar diazloco% hook file for SICStus Prolog % Count is passed on the command line as -a Count get_count(Count) :- current_prolog_flag(argv, L), L = [ACount|_], atom_codes(ACount, LCodes), number_codes(Count, LCodes). get_cpu_time(T) :- statistics(runtime, [T, _]). :- initialization(q). ./gprolog-1.3.0/ExamplesPl/SICSTUS/MAKE_PROGS0000755004425400513100000000102207220351116016605 0ustar diazloco#!/bin/sh BENCH_PL=`cat ../PROGS` p=`(cd ..;pwd)` p1=`pwd`; if test "$NATIVE" = ""; then mode=compactcode else mode=fastcode fi for i in ${*:-$BENCH_PL} do echo $i f=$p1/$i.pl echo "#!/bin/sh" >$i echo "sed -e 's/^:- include(common)\.//' $p/$i.pl >$f" >>$i echo "sed -e 's/^:- include(hook)\.//' $p/common.pl >>$f" >>$i echo "cat $p1/HOOK.pl >>$f" >>$i echo "echo \"prolog_flag(compiling,_,$mode), compile('$f'). \" | sicstus -a \$* 2>/dev/null" >>$i chmod a+x $i done ./gprolog-1.3.0/ExamplesPl/qsort.pl0000644004425400513100000000122610547152502015552 0ustar diazloco% qsort % % David H. D. Warren % % quicksort a list of 50 integers qsort(ShowResult) :- qsort([27,74,17,33,94,18,46,83,65,2,32,53,28,85,99,47,28,82,6,11,55,29,39,81,90,37,10,0,66,51,7,21,85,27,31,63,75,4,95,99,11,28,61,74,18,92,40,53,59,8], R, []), ( ShowResult = true -> write(R), nl ; true). qsort([], R, R). qsort([X|L], R, R0) :- partition(L, X, L1, L2), qsort(L2, R1, R0), qsort(L1, R, [X|R1]). partition([],_,[],[]). partition([X|L],Y,[X|L1],L2) :- X =< Y, !, partition(L,Y,L1,L2). partition([X|L],Y,L1,[X|L2]) :- partition(L,Y,L1,L2). % benchmark interface benchmark(ShowResult) :- qsort(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/tak.pl0000644004425400513100000000114310547152502015157 0ustar diazloco% generated: 17 November 1989 % option(s): SOURCE_TRANSFORM_1 % % tak % % Evan Tick (from Lisp version by R. P. Gabriel) % % (almost) Takeuchi function (recursive arithmetic) tak(ShowResult) :- tak(18,12,6,R), ( ShowResult = true -> write(tak(18,12,6)=R), nl ; true). tak(X,Y,Z,A):- X =< Y, Z = A. tak(X,Y,Z,A):- X > Y, X1 is X - 1, tak(X1,Y,Z,A1), Y1 is Y - 1, tak(Y1,Z,X,A2), Z1 is Z - 1, tak(Z1,X,Y,A3), tak(A1,A2,A3,A). % benchmark interface benchmark(ShowResult) :- tak(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/queens.pl0000644004425400513100000000326510547152502015707 0ustar diazloco% generated: 10 November 1989 % option(s): % % (queens) queens_8 % % from Sterling and Shapiro, "The Art of Prolog," page 211. % % This program solves the N queens problem: place N pieces on an N % by N rectangular board so that no two pieces are on the same line % - horizontal, vertical, or diagonal. (N queens so placed on an N % by N chessboard are unable to attack each other in a single move % under the rules of chess.) The strategy is incremental generate- % and-test. % % A solution is specified by a permutation of the list of numbers 1 to % N. The first element of the list is the row number for the queen in % the first column, the second element is the row number for the queen % in the second column, et cetera. This scheme implicitly incorporates % the observation that any solution of the problem has exactly one queen % in each column. % % The program distinguishes symmetric solutions. For example, % % ?- queens(4, Qs). % % produces % % Qs = [3,1,4,2] ; % % Qs = [2,4,1,3] queens(ShowResult) :- queens(16, R), ( ShowResult = true -> write(R), nl ; true). queens(N,Qs):- range(1,N,Ns), queens(Ns,[],Qs). queens([],Qs,Qs). queens(UnplacedQs,SafeQs,Qs):- sel(UnplacedQs,UnplacedQs1,Q), not_attack(SafeQs,Q), queens(UnplacedQs1,[Q|SafeQs],Qs). not_attack(Xs,X):- not_attack(Xs,X,1). not_attack([],_,_). not_attack([Y|Ys],X,N):- X =\= Y+N, X =\= Y-N, N1 is N+1, not_attack(Ys,X,N1). sel([X|Xs],Xs,X). sel([Y|Ys],[Y|Zs],X):- sel(Ys,Zs,X). range(N,N,[N]):- !. range(M,N,[M|Ns]):- M < N, M1 is M+1, range(M1,N,Ns). % benchmark interface benchmark(ShowResult) :- queens(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/query.pl0000644004425400513100000000341710547152502015553 0ustar diazloco% query % % David H. D. Warren % % query population and area database to find countries % of approximately equal population density query(true) :- query_show, fail ; true. query(fail) :- query_silent, fail ; true. query_show :- query1(C1, D1, C2, D2), write([C1-D1, C2-D2]), nl. query_silent :- query1(_C1, _D1, _C2, _D2). query1(C1, D1, C2, D2) :- density(C1, D1), density(C2, D2), D1 > D2, T1 is 20 * D1, T2 is 21 * D2, T1 < T2. density(C, D) :- pop(C, P), area(C, A), D is P * 100 // A. % populations in 100000s pop('china', 8250). pop('india', 5863). pop('ussr', 2521). pop('usa', 2119). pop('indonesia', 1276). pop('japan', 1097). pop('brazil', 1042). pop('bangladesh', 750). pop('pakistan', 682). pop('w_germany', 620). pop('nigeria', 613). pop('mexico', 581). pop('uk', 559). pop('italy', 554). pop('france', 525). pop('philippines', 415). pop('thailand', 410). pop('turkey', 383). pop('egypt', 364). pop('spain', 352). pop('poland', 337). pop('s_korea', 335). pop('iran', 320). pop('ethiopia', 272). pop('argentina', 251). % areas in 1000s of square miles area('china', 3380). area('india', 1139). area('ussr', 8708). area('usa', 3609). area('indonesia', 570). area('japan', 148). area('brazil', 3288). area('bangladesh', 55). area('pakistan', 311). area('w_germany', 96). area('nigeria', 373). area('mexico', 764). area('uk', 86). area('italy', 116). area('france', 213). area('philippines', 90). area('thailand', 200). area('turkey', 296). area('egypt', 386). area('spain', 190). area('poland', 121). area('s_korea', 37). area('iran', 628). area('ethiopia', 350). area('argentina', 1080). % benchmark interface benchmark(ShowResult) :- query(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/hook.pl0000644004425400513100000000035510547152503015345 0ustar diazloco% hook file for GNU Prolog % Count is passed on the command line as the 1st argument get_count(Count) :- argument_value(1, ACount), number_atom(Count, ACount). get_cpu_time(T) :- statistics(runtime, [T, _]). :- initialization(q). ./gprolog-1.3.0/ExamplesPl/ham.pl0000644004425400513100000000176610547152503015161 0ustar diazlocoham(true) :- ham_show, fail ; true. ham(false) :- ham_silent, fail ; true. ham_show :- ham1(X), write(X), nl. ham_silent :- ham1(_). ham1(X):- cycle_ham([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t],X). cycle_ham([X|Y],[X,T|L]):- chain_ham([X|Y],[],[T|L]), edge(T,X). chain_ham([X],L,[X|L]). chain_ham([X|Y],K,L):- del(Z,Y,T), edge(X,Z), chain_ham([Z|T],[X|K],L). del(X,[X|Y],Y). del(X,[U|Y],[U|Z]):- del(X,Y,Z). edge(X,Y):- connect(X,L), el(Y,L). el(X,[X|_]). el(X,[_|L]):- el(X,L). connect(a,[b,j,k]). connect(b,[a,c,p]). connect(c,[b,d,l]). connect(d,[c,e,q]). connect(e,[d,f,m]). connect(f,[e,g,r]). connect(g,[f,h,n]). connect(h,[i,g,s]). connect(i,[j,h,o]). connect(j,[a,i,t]). connect(k,[o,l,a]). connect(l,[k,m,c]). connect(m,[l,n,e]). connect(n,[m,o,g]). connect(o,[n,k,i]). connect(p,[b,q,t]). connect(q,[p,r,d]). connect(r,[q,s,f]). connect(s,[r,t,h]). connect(t,[p,s,j]). % benchmark interface benchmark(ShowResult) :- ham(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/BINPROLOG/0000777004425400513100000000000010547442376015416 5ustar diazloco./gprolog-1.3.0/ExamplesPl/BINPROLOG/MAKE_CLEAN0000755004425400513100000000002707231016010016730 0ustar diazloco#!/bin/sh rm -f [a-z]* ./gprolog-1.3.0/ExamplesPl/BINPROLOG/HOOK.pl0000644004425400513100000000035010547152503016473 0ustar diazloco% hook file for BinProlog % Count is passed as a fact at the end of the source get_count(Count) :- count(Count). get_cpu_time(T) :- statistics(runtime,[_,T]). % no initialization, script executes q/0 after consult main :- q. ./gprolog-1.3.0/ExamplesPl/BINPROLOG/MAKE_PROGS0000755004425400513100000000073707231020642017016 0ustar diazloco#!/bin/sh BENCH_PL=`cat ../PROGS` p=`(cd ..;pwd)` p1=`pwd`; for i in ${*:-$BENCH_PL} do echo $i f=$p1/$i.pl echo "#!/bin/sh" >$i echo "sed -e 's/^:- include(common)\.//' $p/$i.pl >$f" >>$i echo "sed -e 's/^:- include(hook)\.//' $p/common.pl >>$f" >>$i echo "cat $p1/HOOK.pl >>$f" >>$i echo "echo \"count(\${1:-1}). \" >>$f" >>$i echo "echo \"['$f']. \" | bp -h 6000 -t 6000 -s 6000 2>/dev/null" >>$i chmod a+x $i done ./gprolog-1.3.0/ExamplesPl/chat_parser.pl0000644004425400513100000006011510547152503016700 0ustar diazloco% generated: 19 November 1989 % option(s): % % chat_parser % % Fernando C. N. Pereira and David H. D. Warren chat_parser(_) :- chat_parser1. chat_parser1 :- string(X), determinate_say(X,_), fail. chat_parser1. % query set string([what,rivers,are,there,?]). string([does,afghanistan,border,china,?]). string([what,is,the,capital,of,upper_volta,?]). string([where,is,the,largest,country,?]). string([which,country,'`',s,capital,is,london,?]). string([which,countries,are,european,?]). string([how,large,is,the,smallest,american,country,?]). string([what,is,the,ocean,that,borders,african,countries, and,that,borders,asian,countries,?]). string([what,are,the,capitals,of,the,countries,bordering,the,baltic,?]). string([which,countries,are,bordered,by,two,seas,?]). string([how,many,countries,does,the,danube,flow,through,?]). string([what,is,the,total,area,of,countries,south,of,the,equator, and,not,in,australasia,?]). string([what,is,the,average,area,of,the,countries,in,each,continent,?]). string([is,there,more,than,one,country,in,each,continent,?]). string([is,there,some,ocean,that,does,not,border,any,country,?]). string([what,are,the,countries,from,which,a,river,flows, into,the,black_sea,?]). % determinate_say determinate_say(X,Y) :- say(X,Y), !. %----------------------------------------------------------------------------- % % xgrun % %----------------------------------------------------------------------------- terminal(T,S,S,x(_,terminal,T,X),X). terminal(T,[T|S],S,X,X) :- gap(X). gap(x(gap,_,_,_)). gap([]). virtual(NT,x(_,nonterminal,NT,X),X). %---------------------------------------------------------------------------- % % clotab % %---------------------------------------------------------------------------- % normal form masks is_pp(#(1,_,_,_)). is_pred(#(_,1,_,_)). is_tracee(#(_,_,1,_)). is_adv(#(_,_,_,1)). tracee(#(_,_,1,_),#(0,0,0,0)). tracee(#(0,0,1,0)). adv(#(0,0,0,1)). empty(#(0,0,0,0)). np_all(#(1,1,1,0)). s_all(#(1,0,1,1)). np_no_tracee(#(1,1,0,0)). % mask operations myplus(#(B1,B2,B3,B4),#(C1,C2,C3,C4),#(D1,D2,D3,D4)) :- or(B1,C1,D1), or(B2,C2,D2), or(B3,C3,D3), or(B4,C4,D4). minus(#(B1,B2,B3,B4),#(C1,C2,C3,C4),#(D1,D2,D3,D4)) :- anot(B1,C1,D1), anot(B2,C2,D2), anot(B3,C3,D3), anot(B4,C4,D4). or(1,_,1). or(0,1,1). or(0,0,0). anot(X,0,X). anot(_X,1,0). % noun phrase position features role(subj,_,#(1,0,0)). role(compl,_,#(0,_,_)). role(undef,main,#(_,0,_)). role(undef,aux,#(0,_,_)). role(undef,decl,_). role(nil,_,_). subj_case(#(1,0,0)). verb_case(#(0,1,0)). prep_case(#(0,0,1)). compl_case(#(0,_,_)). %---------------------------------------------------------------------------- % % newg % %---------------------------------------------------------------------------- say(X,Y) :- sentence(Y,X,[],[],[]). sentence(B,C,D,E,F) :- declarative(B,C,G,E,H), terminator(.,G,D,H,F). sentence(B,C,D,E,F) :- wh_question(B,C,G,E,H), terminator(?,G,D,H,F). sentence(B,C,D,E,F) :- topic(C,G,E,H), wh_question(B,G,I,H,J), terminator(?,I,D,J,F). sentence(B,C,D,E,F) :- yn_question(B,C,G,E,H), terminator(?,G,D,H,F). sentence(B,C,D,E,F) :- imperative(B,C,G,E,H), terminator(!,G,D,H,F). pp(B,C,D,E,F,F,G,H) :- virtual(pp(B,C,D,E),G,H). pp(pp(B,C),D,E,F,G,H,I,J) :- prep(B,G,K,I,L), prep_case(M), np(C,_N,M,_O,D,E,F,K,H,L,J). topic(B,C,D,x(gap,nonterminal,pp(E,compl,F,G),H)) :- pp(E,compl,F,G,B,I,D,J), opt_comma(I,C,J,H). opt_comma(B,C,D,E) :- '`'(',',B,C,D,E). opt_comma(B,B,C,C). declarative(decl(B),C,D,E,F) :- s(B,_G,C,D,E,F). wh_question(whq(B,C),D,E,F,G) :- variable_q(B,_H,I,J,D,K,F,L), question(I,J,C,K,E,L,G). np(B,C,D,E,F,G,H,I,I,J,K) :- virtual(np(B,C,D,E,F,G,H),J,K). np(np(B,C,[]),B,D,def,_E,F,G,H,I,J,K) :- is_pp(F), pers_pron(C,B,L,H,I,J,K), empty(G), role(L,decl,D). np(np(B,C,D),B,_E,F,G,H,I,J,K,L,M) :- is_pp(H), np_head(C,B,F+N,O,D,J,P,L,Q), np_all(R), np_compls(N,B,G,O,R,I,P,K,Q,M). np(part(B,C),3+D,_E,indef,F,G,H,I,J,K,L) :- is_pp(G), determiner(B,D,indef,I,M,K,N), '`'(of,M,O,N,P), s_all(Q), prep_case(R), np(C,3+plu,R,def,F,Q,H,O,J,P,L). variable_q(B,C,D,E,F,G,H,x(gap,nonterminal,np(I,C,E,_J,_K,L,M),N)) :- whq(B,C,I,D,F,G,H,N), tracee(L,M). variable_q(B,C,compl,D,E,F,G,x(gap,nonterminal,pp(pp(H,I),compl,J,K),L)) :- prep(H,E,M,G,N), whq(B,C,I,_O,M,F,N,L), tracee(J,K), compl_case(D). variable_q(B,C,compl,D,E,F,G,x(gap,nonterminal, adv_phrase(pp(H,np(C,np_head(int_det(B),[],I),[])),J,K),L)) :- context_pron(H,I,E,F,G,L), tracee(J,K), verb_case(D). variable_q(B,_C,compl,D,E,F,G, x(gap,nonterminal,predicate(adj,value(H,wh(B)),I),J)) :- '`'(how,E,K,G,L), adj(quant,H,K,F,L,J), empty(I), verb_case(D). adv_phrase(B,C,D,E,E,F,G) :- virtual(adv_phrase(B,C,D),F,G). adv_phrase(pp(B,C),D,E,F,G,H,I) :- loc_pred(B,F,J,H,K), pp(pp(prep(of),C),compl,D,E,J,G,K,I). predicate(B,C,D,E,E,F,G) :- virtual(predicate(B,C,D),F,G). predicate(_B,C,D,E,F,G,H) :- adj_phrase(C,D,E,F,G,H). predicate(neg,B,C,D,E,F,G) :- s_all(H), pp(B,compl,H,C,D,E,F,G). predicate(_B,C,D,E,F,G,H) :- s_all(I), adv_phrase(C,I,D,E,F,G,H). whq(B,C,D,undef,E,F,G,H) :- int_det(B,C,E,I,G,J), s_all(K), np(D,C,_L,_M,subj,K,_N,I,F,J,H). whq(B,3+C,np(3+C,wh(B),[]),D,E,F,G,H) :- int_pron(D,E,F,G,H). int_det(B,3+C,D,E,F,G) :- whose(B,C,D,E,F,G). int_det(B,3+C,D,E,F,G) :- int_art(B,C,D,E,F,G). gen_marker(B,B,C,D) :- virtual(gen_marker,C,D). gen_marker(B,C,D,E) :- '`'('`',B,F,D,G), an_s(F,C,G,E). whose(B,C,D,E,F,x(nogap,nonterminal,np_head0(wh(B),C,proper), x(nogap,nonterminal,gen_marker,G))) :- '`'(whose,D,E,F,G). question(B,C,D,E,F,G,H) :- subj_question(B), role(subj,_I,C), s(D,_J,E,F,G,H). question(B,C,D,E,F,G,H) :- fronted_verb(B,C,E,I,G,J), s(D,_K,I,F,J,H). det(B,C,D,E,E,F,G) :- virtual(det(B,C,D),F,G). det(det(B),C,D,E,F,G,H) :- terminal(I,E,F,G,H), det(I,C,B,D). det(generic,_B,generic,C,C,D,D). int_art(B,C,D,E,F,x(nogap,nonterminal,det(G,C,def),H)) :- int_art(B,C,G,D,E,F,H). subj_question(subj). subj_question(undef). yn_question(q(B),C,D,E,F) :- fronted_verb(nil,_G,C,H,E,I), s(B,_J,H,D,I,F). verb_form(B,C,D,E,F,F,G,H) :- virtual(verb_form(B,C,D,E),G,H). verb_form(B,C,D,_E,F,G,H,I) :- terminal(J,F,G,H,I), verb_form(J,B,C,D). neg(B,C,D,D,E,F) :- virtual(neg(B,C),E,F). neg(aux+_B,neg,C,D,E,F) :- '`'(not,C,D,E,F). neg(_B,pos,C,C,D,D). fronted_verb(B,C,D,E,F,x(gap,nonterminal,verb_form(G,H,I,J), x(nogap,nonterminal,neg(_K,L),M))) :- verb_form(G,H,I,_N,D,O,F,P), verb_type(G,aux+_Q), role(B,J,C), neg(_R,L,O,E,P,M). imperative(imp(B),C,D,E,F) :- imperative_verb(C,G,E,H), s(B,_I,G,D,H,F). imperative_verb(B,C,D,x(nogap,terminal,you,x(nogap,nonterminal, verb_form(E,imp+fin,2+sin,main),F))) :- verb_form(E,inf,_G,_H,B,C,D,F). s(s(B,C,D,E),F,G,H,I,J) :- subj(B,K,L,G,M,I,N), verb(C,K,L,O,M,P,N,Q), empty(R), s_all(S), verb_args(L,O,D,R,T,P,U,Q,V), minus(S,T,W), myplus(S,T,X), verb_mods(E,W,X,F,U,H,V,J). subj(there,_B,_C+be,D,E,F,G) :- '`'(there,D,E,F,G). subj(B,C,_D,E,F,G,H) :- s_all(I), subj_case(J), np(B,C,J,_K,subj,I,_L,E,F,G,H). np_head(B,C,D,E,F,G,H,I,J) :- np_head0(K,L,M,G,N,I,O), possessive(K,L,M,P,P,B,C,D,E,F,N,H,O,J). np_head0(B,C,D,E,E,F,G) :- virtual(np_head0(B,C,D),F,G). np_head0(name(B),3+sin,def+proper,C,D,E,F) :- name(B,C,D,E,F). np_head0(np_head(B,C,D),3+E,F+common,G,H,I,J) :- determiner(B,E,F,G,K,I,L), adjs(C,K,M,L,N), noun(D,E,M,H,N,J). np_head0(B,C,def+proper,D,E,F,x(nogap,nonterminal,gen_marker,G)) :- poss_pron(B,C,D,E,F,G). np_head0(np_head(B,[],C),3+sin,indef+common,D,E,F,G) :- quantifier_pron(B,C,D,E,F,G). np_compls(proper,_B,_C,[],_D,E,F,F,G,G) :- empty(E). np_compls(common,B,C,D,E,F,G,H,I,J) :- np_all(K), np_mods(B,C,L,D,E,M,K,N,G,O,I,P), relative(B,L,M,N,F,O,H,P,J). possessive(B,C,_D,[],E,F,G,H,I,J,K,L,M,N) :- gen_case(K,O,M,P), np_head0(Q,R,S,O,T,P,U), possessive(Q,R,S,V,[pp(poss,np(C,B,E))|V],F,G,H,I,J,T,L,U,N). possessive(B,C,D,E,F,B,C,D,E,F,G,G,H,H). gen_case(B,C,D,x(nogap,terminal,the,E)) :- gen_marker(B,C,D,E). an_s(B,C,D,E) :- '`'(s,B,C,D,E). an_s(B,B,C,C). determiner(B,C,D,E,F,G,H) :- det(B,C,D,E,F,G,H). determiner(B,C,D,E,F,G,H) :- quant_phrase(B,C,D,E,F,G,H). quant_phrase(quant(B,C),D,E,F,G,H,I) :- quant(B,E,F,J,H,K), number(C,D,J,G,K,I). quant(B,indef,C,D,E,F) :- neg_adv(G,B,C,H,E,I), comp_adv(G,H,J,I,K), '`'(than,J,D,K,F). quant(B,indef,C,D,E,F) :- '`'(at,C,G,E,H), sup_adv(I,G,D,H,F), sup_op(I,B). quant(the,def,B,C,D,E) :- '`'(the,B,C,D,E). quant(same,indef,B,B,C,C). neg_adv(B,not+B,C,D,E,F) :- '`'(not,C,D,E,F). neg_adv(B,B,C,C,D,D). sup_op(least,not+less). sup_op(most,not+more). np_mods(B,C,D,[E|F],G,H,_I,J,K,L,M,N) :- np_mod(B,C,E,G,O,K,P,M,Q), tracee(R), myplus(R,O,S), minus(G,S,T), myplus(O,G,U), np_mods(B,C,D,F,T,H,U,J,P,L,Q,N). np_mods(_B,_C,D,D,E,E,F,F,G,G,H,H). np_mod(_B,C,D,E,F,G,H,I,J) :- pp(D,C,E,F,G,H,I,J). np_mod(B,_C,D,E,F,G,H,I,J) :- reduced_relative(B,D,E,F,G,H,I,J). verb_mods([B|C],D,_E,F,G,H,I,J) :- verb_mod(B,D,K,G,L,I,M), tracee(N), myplus(N,K,O), minus(D,O,P), myplus(K,D,Q), verb_mods(C,P,Q,F,L,H,M,J). verb_mods([],_B,C,C,D,D,E,E). verb_mod(B,C,D,E,F,G,H) :- adv_phrase(B,C,D,E,F,G,H). verb_mod(B,C,D,E,F,G,H) :- is_adv(C), adverb(B,E,F,G,H), empty(D). verb_mod(B,C,D,E,F,G,H) :- pp(B,compl,C,D,E,F,G,H). adjs([B|C],D,E,F,G) :- pre_adj(B,D,H,F,I), adjs(C,H,E,I,G). adjs([],B,B,C,C). pre_adj(B,C,D,E,F) :- adj(_G,B,C,D,E,F). pre_adj(B,C,D,E,F) :- sup_phrase(B,C,D,E,F). sup_phrase(sup(most,B),C,D,E,F) :- sup_adj(B,C,D,E,F). sup_phrase(sup(B,C),D,E,F,G) :- sup_adv(B,D,I,F,J), adj(quant,C,I,E,J,G). comp_phrase(comp(B,C,D),E,F,G,H,I) :- comp(B,C,F,J,H,K), np_no_tracee(L), prep_case(M), np(D,_N,M,_O,compl,L,E,J,G,K,I). comp(B,C,D,E,F,G) :- comp_adv(B,D,H,F,I), adj(quant,C,H,J,I,K), '`'(than,J,E,K,G). comp(more,B,C,D,E,F) :- rel_adj(B,C,G,E,H), '`'(than,G,D,H,F). comp(same,B,C,D,E,F) :- '`'(as,C,G,E,H), adj(quant,B,G,I,H,J), '`'(as,I,D,J,F). relative(B,[C],D,_E,F,G,H,I,J) :- is_pred(D), rel_conj(B,_K,C,F,G,H,I,J). relative(_B,[],_C,D,D,E,E,F,F). rel_conj(B,C,D,E,F,G,H,I) :- rel(B,J,K,F,L,H,M), rel_rest(B,C,J,D,K,E,L,G,M,I). rel_rest(B,C,D,E,_F,G,H,I,J,K) :- conj(C,L,D,M,E,H,N,J,O), rel_conj(B,L,M,G,N,I,O,K). rel_rest(_B,_C,D,D,E,E,F,F,G,G). rel(B,rel(C,D),E,F,G,H,I) :- openn(F,J,H,K), variable(B,C,J,L,K,M), s(D,N,L,O,M,P), tracee(Q), minus(N,Q,E), close(O,G,P,I). variable(B,C,D,E,F,x(gap,nonterminal,np(np(B,wh(C),[]),B,_G,_H,_I,J,K),L)) :- '`'(that,D,E,F,L), tracee(J,K). variable(B,C,D,E,F,x(gap,nonterminal,np(G,H,I,_J,_K,L,M),N)) :- wh(C,B,G,H,I,D,E,F,N), tracee(L,M). variable(B,C,D,E,F,x(gap,nonterminal,pp(pp(G,H),compl,I,J),K)) :- prep(G,D,L,F,M), wh(C,B,H,_N,O,L,E,M,K), tracee(I,J), compl_case(O). wh(B,C,np(C,wh(B),[]),C,D,E,F,G,H) :- rel_pron(I,E,F,G,H), role(I,decl,D). wh(B,C,np(D,E,[pp(F,G)]),D,_H,I,J,K,L) :- np_head0(E,D,_M+common,I,N,K,O), prep(F,N,P,O,Q), wh(B,C,G,_R,_S,P,J,Q,L). wh(B,C,D,E,F,G,H,I,J) :- whose(B,C,G,K,I,L), s_all(M), np(D,E,F,def,subj,M,_N,K,H,L,J). reduced_relative(B,C,D,E,F,G,H,I) :- is_pred(D), reduced_rel_conj(B,_J,C,E,F,G,H,I). reduced_rel_conj(B,C,D,E,F,G,H,I) :- reduced_rel(B,J,K,F,L,H,M), reduced_rel_rest(B,C,J,D,K,E,L,G,M,I). reduced_rel_rest(B,C,D,E,_F,G,H,I,J,K) :- conj(C,L,D,M,E,H,N,J,O), reduced_rel_conj(B,L,M,G,N,I,O,K). reduced_rel_rest(_B,_C,D,D,E,E,F,F,G,G). reduced_rel(B,reduced_rel(C,D),E,F,G,H,I) :- openn(F,J,H,K), reduced_wh(B,C,J,L,K,M), s(D,N,L,O,M,P), tracee(Q), minus(N,Q,E), close(O,G,P,I). reduced_wh(B,C,D,E,F,x(nogap,nonterminal, np(np(B,wh(C),[]),B,G,_H,_I,J,K),x(nogap,nonterminal, verb_form(be,pres+fin,B,main),x(nogap,nonterminal, neg(_L,M),x(nogap,nonterminal,predicate(M,N,O),P))))) :- neg(_Q,M,D,R,F,S), predicate(M,N,O,R,E,S,P), tracee(J,K), subj_case(G). reduced_wh(B,C,D,E,F,x(nogap,nonterminal, np(np(B,wh(C),[]),B,G,_H,_I,J,K),x(nogap,nonterminal, verb(L,_M,N,O),P))) :- participle(L,N,O,D,E,F,P), tracee(J,K), subj_case(G). reduced_wh(B,C,D,E,F,x(nogap,nonterminal, np(G,H,I,J,_K,L,M),x(gap,nonterminal, np(np(B,wh(C),[]),B,N,_O,_P,Q,R),S))) :- s_all(T), subj_case(I), verb_case(N), np(G,H,_U,J,subj,T,_V,D,E,F,S), tracee(L,M), tracee(Q,R). verb(B,C,D,E,F,F,G,H) :- virtual(verb(B,C,D,E),G,H). verb(verb(B,C,D+fin,E,F),G,H,C,I,J,K,L) :- verb_form(M,D+fin,G,N,I,O,K,P), verb_type(M,Q), neg(Q,F,O,R,P,S), rest_verb(N,M,B,C,E,R,J,S,L), verb_type(B,H). rest_verb(aux,have,B,C,[perf|D],E,F,G,H) :- verb_form(I,past+part,_J,_K,E,L,G,M), have(I,B,C,D,L,F,M,H). rest_verb(aux,be,B,C,D,E,F,G,H) :- verb_form(I,J,_K,_L,E,M,G,N), be(J,I,B,C,D,M,F,N,H). rest_verb(aux,do,B,active,[],C,D,E,F) :- verb_form(B,inf,_G,_H,C,D,E,F). rest_verb(main,B,B,active,[],C,C,D,D). have(be,B,C,D,E,F,G,H) :- verb_form(I,J,_K,_L,E,M,G,N), be(J,I,B,C,D,M,F,N,H). have(B,B,active,[],C,C,D,D). be(past+part,B,B,passive,[],C,C,D,D). be(pres+part,B,C,D,[prog],E,F,G,H) :- passive(B,C,D,E,F,G,H). passive(be,B,passive,C,D,E,F) :- verb_form(B,past+part,_G,_H,C,D,E,F), verb_type(B,I), passive(I). passive(B,B,active,C,C,D,D). participle(verb(B,C,inf,D,E),F,C,G,H,I,J) :- neg(_K,E,G,L,I,M), verb_form(B,N,_O,_P,L,H,M,J), participle(N,C,D), verb_type(B,F). passive(_B+trans). passive(_B+ditrans). participle(pres+part,active,[prog]). participle(past+part,passive,[]). close(B,B,C,D) :- virtual(close,C,D). openn(B,B,C,x(gap,nonterminal,close,C)). verb_args(_B+C,D,E,F,G,H,I,J,K) :- advs(E,L,_M,H,N,J,O), verb_args(C,D,L,F,G,N,I,O,K). verb_args(trans,active,[arg(dir,B)],_C,D,E,F,G,H) :- verb_arg(np,B,D,E,F,G,H). verb_args(ditrans,_B,[arg(C,D)|E],_F,G,H,I,J,K) :- verb_arg(np,D,L,H,M,J,N), object(C,E,L,G,M,I,N,K). verb_args(be,_B,[void],C,C,D,E,F,G) :- terminal(there,D,E,F,G). verb_args(be,_B,[arg(predicate,C)],_D,E,F,G,H,I) :- pred_conj(_J,C,E,F,G,H,I). verb_args(be,_B,[arg(dir,C)],_D,E,F,G,H,I) :- verb_arg(np,C,E,F,G,H,I). verb_args(have,active,[arg(dir,B)],_C,D,E,F,G,H) :- verb_arg(np,B,D,E,F,G,H). verb_args(B,_C,[],D,D,E,E,F,F) :- no_args(B). object(B,C,D,E,F,G,H,I) :- adv(J), minus(J,D,K), advs(C,L,K,F,M,H,N), obj(B,L,D,E,M,G,N,I). obj(ind,[arg(dir,B)],_C,D,E,F,G,H) :- verb_arg(np,B,D,E,F,G,H). obj(dir,[],B,B,C,C,D,D). pred_conj(B,C,D,E,F,G,H) :- predicate(_I,J,K,E,L,G,M), pred_rest(B,J,C,K,D,L,F,M,H). pred_rest(B,C,D,_E,F,G,H,I,J) :- conj(B,K,C,L,D,G,M,I,N), pred_conj(K,L,F,M,H,N,J). pred_rest(_B,C,C,D,D,E,E,F,F). verb_arg(np,B,C,D,E,F,G) :- s_all(H), verb_case(I), np(B,_J,I,_K,compl,H,C,D,E,F,G). advs([B|C],D,E,F,G,H,I) :- is_adv(E), adverb(B,F,J,H,K), advs(C,D,E,J,G,K,I). advs(B,B,_C,D,D,E,E). adj_phrase(B,C,D,E,F,G) :- adj(_H,B,D,E,F,G), empty(C). adj_phrase(B,C,D,E,F,G) :- comp_phrase(B,C,D,E,F,G). no_args(trans). no_args(ditrans). no_args(intrans). conj(conj(B,C),conj(B,D),E,F,conj(B,E,F),G,H,I,J) :- conj(B,C,D,G,H,I,J). noun(B,C,D,E,F,G) :- terminal(H,D,E,F,G), noun_form(H,B,C). adj(B,adj(C),D,E,F,G) :- terminal(C,D,E,F,G), adj(C,B). prep(prep(B),C,D,E,F) :- terminal(B,C,D,E,F), prep(B). rel_adj(adj(B),C,D,E,F) :- terminal(G,C,D,E,F), rel_adj(G,B). sup_adj(adj(B),C,D,E,F) :- terminal(G,C,D,E,F), sup_adj(G,B). comp_adv(less,B,C,D,E) :- '`'(less,B,C,D,E). comp_adv(more,B,C,D,E) :- '`'(more,B,C,D,E). sup_adv(least,B,C,D,E) :- '`'(least,B,C,D,E). sup_adv(most,B,C,D,E) :- '`'(most,B,C,D,E). rel_pron(B,C,D,E,F) :- terminal(G,C,D,E,F), rel_pron(G,B). name(B,C,D,E,F) :- opt_the(C,G,E,H), terminal(B,G,D,H,F), name(B). int_art(B,plu,quant(same,wh(B)),C,D,E,F) :- '`'(how,C,G,E,H), '`'(many,G,D,H,F). int_art(B,C,D,E,F,G,H) :- terminal(I,E,F,G,H), int_art(I,B,C,D). int_pron(B,C,D,E,F) :- terminal(G,C,D,E,F), int_pron(G,B). adverb(adv(B),C,D,E,F) :- terminal(B,C,D,E,F), adverb(B). poss_pron(pronoun(B),C+D,E,F,G,H) :- terminal(I,E,F,G,H), poss_pron(I,B,C,D). pers_pron(pronoun(B),C+D,E,F,G,H,I) :- terminal(J,F,G,H,I), pers_pron(J,B,C,D,E). quantifier_pron(B,C,D,E,F,G) :- terminal(H,D,E,F,G), quantifier_pron(H,B,C). context_pron(prep(in),place,B,C,D,E) :- '`'(where,B,C,D,E). context_pron(prep(at),time,B,C,D,E) :- '`'(when,B,C,D,E). number(nb(B),C,D,E,F,G) :- terminal(H,D,E,F,G), number(H,B,C). terminator(B,C,D,E,F) :- terminal(G,C,D,E,F), terminator(G,B). opt_the(B,B,C,C). opt_the(B,C,D,E) :- '`'(the,B,C,D,E). conj(_B,list,list,C,D,E,F) :- terminal(',',C,D,E,F). conj(B,list,'end',C,D,E,F) :- terminal(B,C,D,E,F), conj(B). loc_pred(B,C,D,E,F) :- terminal(G,C,D,E,F), loc_pred(G,B). '`'(B,C,D,E,F) :- terminal(B,C,D,E,F), '`'(B). %---------------------------------------------------------------------------- % % newdic % %---------------------------------------------------------------------------- word(Word) :- '`'(Word). word(Word) :- conj(Word). word(Word) :- adverb(Word). word(Word) :- sup_adj(Word,_). word(Word) :- rel_adj(Word,_). word(Word) :- adj(Word,_). word(Word) :- name(Word). word(Word) :- terminator(Word,_). word(Word) :- pers_pron(Word,_,_,_,_). word(Word) :- poss_pron(Word,_,_,_). word(Word) :- rel_pron(Word,_). word(Word) :- verb_form(Word,_,_,_). word(Word) :- noun_form(Word,_,_). word(Word) :- prep(Word). word(Word) :- quantifier_pron(Word,_,_). word(Word) :- number(Word,_,_). word(Word) :- det(Word,_,_,_). word(Word) :- int_art(Word,_,_,_). word(Word) :- int_pron(Word,_). word(Word) :- loc_pred(Word,_). '`'(how). '`'(whose). '`'(there). '`'(of). '`'('`'). % use ` instead of ' to help assembler '`'(','). '`'(s). '`'(than). '`'(at). '`'(the). '`'(not). '`'(as). '`'(that). '`'(less). '`'(more). '`'(least). '`'(most). '`'(many). '`'(where). '`'(when). conj(and). conj(or). int_pron(what,undef). int_pron(which,undef). int_pron(who,subj). int_pron(whom,compl). int_art(what,X,_,int_det(X)). int_art(which,X,_,int_det(X)). det(the,No,the(No),def). det(a,sin,a,indef). det(an,sin,a,indef). det(every,sin,every,indef). det(some,_,some,indef). det(any,_,any,indef). det(all,plu,all,indef). det(each,sin,each,indef). det(no,_,no,indef). number(W,I,Nb) :- tr_number(W,I), ag_number(I,Nb). tr_number(nb(I),I). tr_number(one,1). tr_number(two,2). tr_number(three,3). tr_number(four,4). tr_number(five,5). tr_number(six,6). tr_number(seven,7). tr_number(eight,8). tr_number(nine,9). tr_number(ten,10). ag_number(1,sin). ag_number(N,plu) :- N>1. quantifier_pron(everybody,every,person). quantifier_pron(everyone,every,person). quantifier_pron(everything,every,thing). quantifier_pron(somebody,some,person). quantifier_pron(someone,some,person). quantifier_pron(something,some,thing). quantifier_pron(anybody,any,person). quantifier_pron(anyone,any,person). quantifier_pron(anything,any,thing). quantifier_pron(nobody,no,person). quantifier_pron(nothing,no,thing). prep(as). prep(at). prep(of). prep(to). prep(by). prep(with). prep(in). prep(on). prep(from). prep(into). prep(through). noun_form(Plu,Sin,plu) :- noun_plu(Plu,Sin). noun_form(Sin,Sin,sin) :- noun_sin(Sin). noun_form(proportion,proportion,_). noun_form(percentage,percentage,_). root_form(1+sin). root_form(2+_). root_form(1+plu). root_form(3+plu). verb_root(be). verb_root(have). verb_root(do). verb_root(border). verb_root(contain). verb_root(drain). verb_root(exceed). verb_root(flow). verb_root(rise). regular_pres(have). regular_pres(do). regular_pres(rise). regular_pres(border). regular_pres(contain). regular_pres(drain). regular_pres(exceed). regular_pres(flow). regular_past(had,have). regular_past(bordered,border). regular_past(contained,contain). regular_past(drained,drain). regular_past(exceeded,exceed). regular_past(flowed,flow). rel_pron(who,subj). rel_pron(whom,compl). rel_pron(which,undef). poss_pron(my,_,1,sin). poss_pron(your,_,2,_). poss_pron(his,masc,3,sin). poss_pron(her,fem,3,sin). poss_pron(its,neut,3,sin). poss_pron(our,_,1,plu). poss_pron(their,_,3,plu). pers_pron(i,_,1,sin,subj). pers_pron(you,_,2,_,_). pers_pron(he,masc,3,sin,subj). pers_pron(she,fem,3,sin,subj). pers_pron(it,neut,3,sin,_). pers_pron(we,_,1,plu,subj). pers_pron(them,_,3,plu,subj). pers_pron(me,_,1,sin,compl(_)). pers_pron(him,masc,3,sin,compl(_)). pers_pron(her,fem,3,sin,compl(_)). pers_pron(us,_,1,plu,compl(_)). pers_pron(them,_,3,plu,compl(_)). terminator(.,_). terminator(?,?). terminator(!,!). name(_). % =========================================================================== % specialised dictionary loc_pred(east,prep(eastof)). loc_pred(west,prep(westof)). loc_pred(north,prep(northof)). loc_pred(south,prep(southof)). adj(minimum,restr). adj(maximum,restr). adj(average,restr). adj(total,restr). adj(african,restr). adj(american,restr). adj(asian,restr). adj(european,restr). adj(great,quant). adj(big,quant). adj(small,quant). adj(large,quant). adj(old,quant). adj(new,quant). adj(populous,quant). rel_adj(greater,great). rel_adj(less,small). rel_adj(bigger,big). rel_adj(smaller,small). rel_adj(larger,large). rel_adj(older,old). rel_adj(newer,new). sup_adj(biggest,big). sup_adj(smallest,small). sup_adj(largest,large). sup_adj(oldest,old). sup_adj(newest,new). noun_sin(average). noun_sin(total). noun_sin(sum). noun_sin(degree). noun_sin(sqmile). noun_sin(ksqmile). noun_sin(thousand). noun_sin(million). noun_sin(time). noun_sin(place). noun_sin(area). noun_sin(capital). noun_sin(city). noun_sin(continent). noun_sin(country). noun_sin(latitude). noun_sin(longitude). noun_sin(ocean). noun_sin(person). noun_sin(population). noun_sin(region). noun_sin(river). noun_sin(sea). noun_sin(seamass). noun_sin(number). noun_plu(averages,average). noun_plu(totals,total). noun_plu(sums,sum). noun_plu(degrees,degree). noun_plu(sqmiles,sqmile). noun_plu(ksqmiles,ksqmile). noun_plu(million,million). noun_plu(thousand,thousand). noun_plu(times,time). noun_plu(places,place). noun_plu(areas,area). noun_plu(capitals,capital). noun_plu(cities,city). noun_plu(continents,continent). noun_plu(countries,country). noun_plu(latitudes,latitude). noun_plu(longitudes,longitude). noun_plu(oceans,ocean). noun_plu(persons,person). noun_plu(people,person). noun_plu(populations,population). noun_plu(regions,region). noun_plu(rivers,river). noun_plu(seas,sea). noun_plu(seamasses,seamass). noun_plu(numbers,number). verb_form(V,V,inf,_) :- verb_root(V). verb_form(V,V,pres+fin,Agmt) :- regular_pres(V), root_form(Agmt), verb_root(V). verb_form(Past,Root,past+_,_) :- regular_past(Past,Root). verb_form(am,be,pres+fin,1+sin). verb_form(are,be,pres+fin,2+sin). verb_form(is,be,pres+fin,3+sin). verb_form(are,be,pres+fin,_+plu). verb_form(was,be,past+fin,1+sin). verb_form(were,be,past+fin,2+sin). verb_form(was,be,past+fin,3+sin). verb_form(were,be,past+fin,_+plu). verb_form(been,be,past+part,_). verb_form(being,be,pres+part,_). verb_form(has,have,pres+fin,3+sin). verb_form(having,have,pres+part,_). verb_form(does,do,pres+fin,3+sin). verb_form(did,do,past+fin,_). verb_form(doing,do,pres+part,_). verb_form(done,do,past+part,_). verb_form(flows,flow,pres+fin,3+sin). verb_form(flowing,flow,pres+part,_). verb_form(rises,rise,pres+fin,3+sin). verb_form(rose,rise,past+fin,_). verb_form(risen,rise,past+part,_). verb_form(borders,border,pres+fin,3+sin). verb_form(bordering,border,pres+part,_). verb_form(contains,contain,pres+fin,3+sin). verb_form(containing,contain,pres+part,_). verb_form(drains,drain,pres+fin,3+sin). verb_form(draining,drain,pres+part,_). verb_form(exceeds,exceed,pres+fin,3+sin). verb_form(exceeding,exceed,pres+part,_). verb_type(have,aux+have). verb_type(be,aux+be). verb_type(do,aux+ditrans). verb_type(rise,main+intrans). verb_type(border,main+trans). verb_type(contain,main+trans). verb_type(drain,main+intrans). verb_type(exceed,main+trans). verb_type(flow,main+intrans). adverb(yesterday). adverb(tomorrow). % benchmark interface benchmark(ShowResult) :- chat_parser(ShowResult). :- include(common). ./gprolog-1.3.0/ExamplesPl/common.pl0000644004425400513100000000132310547152503015671 0ustar diazloco% A generic benchmark interface q :- ( get_count(Count) ; Count = 1 ), !, do_bench(Count). do_bench(Count) :- get_cpu_time(T1), iterate_bench(Count), get_cpu_time(T2), Time is T2-T1, TimeIt is Time // Count, write(TimeIt), write(' msec per iter, '), write(Count), write(' iters, total time : '), write(Time), write(' msec'), nl. iterate_bench(Count) :- rep(Count, Last), ShowResult = Last, exec_bench(ShowResult), Last = true. exec_bench(ShowResult) :- benchmark(ShowResult), !. rep(1, true):- !. rep(_, false). rep(N, Last) :- N1 is N - 1, rep(N1, Last). /* * this file should define: * get_count/1 * get_cpu_time/1 * and launch q/0 */ :- include(hook). ./gprolog-1.3.0/ExamplesPl/README0000644004425400513100000000377007231277402014736 0ustar diazloco GNU PROLOG Benchmarks ===================== This directory contains a set of Prolog benchmarks To compile them with GNU Prolog: make Each benchmark accepts a count (nb of iteration) as command-line argument, e.g: zebra 10 house(yellow,norwegian,fox,water,kools) house(blue,ukrainian,horse,tea,chesterfields) house(red,english,snails,milk,winstons) house(ivory,spanish,dog,orange_juice,lucky_strikes) house(green,japanese,zebra,coffee,parliaments) 17 msec per iter, 10 iters, total time : 170 msec NB: only the last iteration displays the solution. Each bench includes the Prolog file common.pl (part recovering the counter from the command-line and ierating the bench). This file includes itself the Prolog source hook.pl defining the predicats get_count/1 (recover the count form the command-line) and get_cpu_time/1 (user time in msec). This makes it possible to run the benchmarks with different systems (defining a hook.pl file for each system). Each sub-directorie (YAP, WAMCC, SICSTUS, CIAO, BINPROLOG, XSB, SWI) contains 3 files: MAKE_PROGS: a shell-script building the benchmarks MAKE_CLEAN: a shell-script removing build benchmarks HOOK.pl: the hook file needed for the corresponding system To compile the benchmarks with a given system use MAKE_PROGS in the associated directory (e.g. YAP): cd YAP MAKE_PROGS (or MAKE_PROGS BENCH_NAME...) MAKE_PROGS build the list of benchmarks passed as argument. In none, it builds all benchmarks described in the file ../PROGS. Be sure to be in the sub-directory (cd) before doing MAKE_PROGS. NB: under SICSTUS, the compilation mode is byte-code (compactcode), to activate native code (fastcode) define the environment variable NATIVE. The build benchmark act like under GNU Prolog, accepting a count as command-line argument. It is not mandatory to be in sub-directory for the execution. e.g.: ~/.../ExamplesPl/YAP/zebra 10 To clean the benchmarks with a given system use MAKE_CLEAN in the associated directory (e.g. YAP): cd YAP MAKE_CLEAN ./gprolog-1.3.0/VERSION0000644004425400513100000000001610547440354013044 0ustar diazlocogprolog-1.3.0 ./gprolog-1.3.0/ExamplesC/0000777004425400513100000000000010547442376013672 5ustar diazloco./gprolog-1.3.0/ExamplesC/Makefile0000644004425400513100000000037310547152503015317 0ustar diazlocoGPLC = gplc CFLAGS='-Wall -g' EXECS=examp new_main all: $(EXECS) examp: examp.pl examp_c.c $(GPLC) -C $(CFLAGS) examp.pl examp_c.c new_main: new_main.pl new_main_c.c $(GPLC) -C $(CFLAGS) new_main.pl new_main_c.c clean: rm -f $(EXECS) *.exe ./gprolog-1.3.0/ExamplesC/new_main.pl0000644004425400513100000000361610547152503016014 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : foreign facility test * * File : for_main.pl * * Descr.: test file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ parent(bob,mary). parent(jane,mary). parent(mary,peter). parent(paul,peter). parent(peter,john). anc(X,Y):- parent(X,Y). anc(X,Z):- parent(X,Y), anc(Y,Z). ./gprolog-1.3.0/ExamplesC/new_main_c.c0000644004425400513100000000671610547152503016131 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : foreign facility test * * File : for_main_c.c * * Descr.: test file - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ #include #include "gprolog.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * MAIN * * * * See comments in EnginePl/main.c about the use of the wrapper function. * *-------------------------------------------------------------------------*/ static int Main_Wrapper(int argc, char *argv[]) { int func; WamWord arg[10]; char str[100]; char *sol[100]; int i, nb_sol = 0; Bool res; Start_Prolog(argc, argv); func = Find_Atom("anc"); for (;;) { printf("\nEnter a name (or 'end' to finish): "); fflush(stdout); scanf("%s", str); if (strcmp(str, "end") == 0) break; Pl_Query_Begin(TRUE); arg[0] = Mk_Variable(); arg[1] = Mk_String(str); nb_sol = 0; res = Pl_Query_Call(func, 2, arg); while (res) { sol[nb_sol++] = Rd_String(arg[0]); res = Pl_Query_Next_Solution(); } Pl_Query_End(PL_RECOVER); for (i = 0; i < nb_sol; i++) printf(" solution: %s\n", sol[i]); printf("%d solution(s)\n", nb_sol); } Stop_Prolog(); return 0; } int main(int argc, char *argv[]) { return Main_Wrapper(argc, argv); } ./gprolog-1.3.0/ExamplesC/examp_c.c0000644004425400513100000001763510547152503015450 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : foreign facility test * * File : for_ex_c.c * * Descr.: test file - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ #include #include "gprolog.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * FIRST_OCCURRENCE * * * *-------------------------------------------------------------------------*/ Bool first_occurrence(char *str, long c, long *pos) { char *p; p = strchr(str, c); if (p == NULL) /* C does not appear in A */ return FALSE; /* fail */ Pl_Err_System(Create_Atom("something")); *pos = p - str; /* set the output argument */ return TRUE; /* succeed */ } /*-------------------------------------------------------------------------* * OCCURRENCE * * * *-------------------------------------------------------------------------*/ Bool occurrence(char *str, long c, long *pos) { char **info_pos; char *p; info_pos = Get_Choice_Buffer(char **); /* recover the buffer */ if (Get_Choice_Counter() == 0) /* first invocation ? */ *info_pos = str; p = strchr(*info_pos, c); if (p == NULL) /* C does not appear */ { No_More_Choice(); /* remove choice-point */ return FALSE; /* fail */ } *pos = p - str; /* set the output argument */ *info_pos = p + 1; /* update next starting pos */ return TRUE; /* succeed */ } /*-------------------------------------------------------------------------* * OCCURRENCE2 * * * *-------------------------------------------------------------------------*/ Bool occurrence2(char *str, long c, long *pos) { char **info_pos; char *p; info_pos = Get_Choice_Buffer(char **); /* recover the buffer */ if (Get_Choice_Counter() == 0) /* first invocation ? */ { p = strchr(str, c); if (p == NULL) /* C does not appear at all */ { No_More_Choice(); /* remove choice-point */ return FALSE; /* fail */ } *info_pos = p; } /* info_pos = an occurrence */ *pos = *info_pos - str; /* set the output argument */ p = strchr(*info_pos + 1, c); if (p == NULL) /* no more occurrence */ No_More_Choice(); /* remove choice-point */ else *info_pos = p; /* else update next solution */ return TRUE; /* succeed */ } /*-------------------------------------------------------------------------* * CHAR_ASCII * * * *-------------------------------------------------------------------------*/ Bool char_ascii(FIOArg *c, FIOArg *ascii) { if (!c->is_var) /* Char is not a variable */ { ascii->unify = TRUE; /* enforce unif. of Code */ ascii->value.l = c->value.l; /* set Code */ return TRUE; /* succeed */ } if (ascii->is_var) /* Code is also a variable */ Pl_Err_Instantiation(); /* emit instantiation_error */ c->value.l = ascii->value.l; /* set Char */ return TRUE; /* succeed */ } /*-------------------------------------------------------------------------* * CHAR_ASCII2 * * * *-------------------------------------------------------------------------*/ Bool char_ascii2(FIOArg *c, FIOArg *ascii) { if (!c->is_var) { if (!ascii->is_var) return ascii->value.l == c->value.l; ascii->value.l = c->value.l; return TRUE; } if (ascii->is_var) Pl_Err_Instantiation(); c->value.l = ascii->value.l; return TRUE; } /*-------------------------------------------------------------------------* * MY_CALL * * * *-------------------------------------------------------------------------*/ Bool my_call(PlTerm goal) { PlTerm *args; int functor, arity; int result; args = Rd_Callable_Check(goal, &functor, &arity); Pl_Query_Begin(FALSE); result = Pl_Query_Call(functor, arity, args); Pl_Query_End(PL_KEEP_FOR_PROLOG); if (result == PL_EXCEPTION) { PlTerm except = Pl_Get_Exception(); Pl_Exec_Continuation(Find_Atom("throw"), 1, &except); } return result; } /*-------------------------------------------------------------------------* * MY_CALL2 * * * *-------------------------------------------------------------------------*/ Bool my_call2(PlTerm goal) { PlTerm *args; int functor, arity; args = Rd_Callable_Check(goal, &functor, &arity); Pl_Exec_Continuation(functor, arity, args); return TRUE; } /*-------------------------------------------------------------------------* * ALL_OP * * * *-------------------------------------------------------------------------*/ Bool all_op(PlTerm list) { PlTerm op[1024]; PlTerm args[3]; int n = 0; int result; Pl_Query_Begin(TRUE); args[0] = Mk_Variable(); args[1] = Mk_Variable(); args[2] = Mk_Variable(); result = Pl_Query_Call(Find_Atom("current_op"), 3, args); while (result) { op[n++] = Mk_Atom(Rd_Atom(args[2])); /* arg #2 is the name of the op */ result = Pl_Query_Next_Solution(); } Pl_Query_End(PL_RECOVER); return Un_Proper_List_Check(n, op, list); } ./gprolog-1.3.0/ExamplesC/examp.pl0000644004425400513100000000411410547152503015323 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : foreign facility test * * File : for_ex.pl * * Descr.: test file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ :- foreign(first_occurrence(+string,+char,-positive)). :- foreign(occurrence(+string,+char,-positive),[choice_size(1)]). :- foreign(occurrence2(+string,+char,-positive),[choice_size(1)]). :- foreign(char_ascii(?char,?code)). :- foreign(char_ascii2(?char,?code)). :- foreign(my_call(term)). :- foreign(my_call2(term)). :- foreign(all_op(term)). ./gprolog-1.3.0/ExamplesC/README0000644004425400513100000000273310061052704014532 0ustar diazloco Prolog <-> C interface examples This directory contains examples presented in the documentation. To build: make examp.pl / examp_c.c: examples calling C from Prolog and C from Prolog new_main.pl / new_main_c.c: example defining a new main function. WINDOWS ------- In Microsoft Windows if you intend to use the gplc compiler as described in the documentation you need to ascertain the following conditions are met: - for the port compiled with MS Visual C++ (tested with version 6.0) you'll need to have NASM (the Netwide Assembler available at http://nasm.sourceforge.net/) installed and the 'cl' compiler (used mainly as linker by GNU Prolog) available in your session path. - for the ports compiled either with MinGW or Cygwin, the gcc toolchain must be installed and available in your session path. Observing these needs you'll also will be able to do the mixed language programming, as the examples included in the ExamplesC directory. However you'll need to write your own Makefile as the one provided is for gplc calling 'gcc' and the options passed by GNU Prolog will not work, here is an example for nmake and MSVC++ compiler: GPLC = gplc CFLAGS=-c -W4 EXECS=examp.exe new_main.exe .SUFFIXES: .obj .c .wam .pl .pl.obj: $(GPLC) $(CFLAGS) $< .c.obj: $(GPLC) $(CFLAGS) $< all: $(EXECS) examp.exe: examp.obj examp_c.obj $(GPLC) -o $@ $** new_main.exe: new_main.obj new_main_c.obj $(GPLC) -o $@ $** clean: rm -f $(EXECS) *.obj ./gprolog-1.3.0/NEWS0000644004425400513100000002562310547152230012477 0ustar diazlocoChange in GNU Prolog version 1.3.0: * official release (Jan 4 2007) * change error messages emitted by the compiler to follow GNU standards * modify doc (mainly rename manual.xxx to gprolog.xxx) * add DESTDIR variable support in main Makefile for staged installs * fix a bug with Prolog floats in x86_64/linux (bad stack alignment) * port for ix86/darwin (Mac OS X) * add check target to main Makefile * improve Win32 ports (cygwin, MinGW, MSVC 6.0 and 2005 Express Edition) (MSVC port uses MinGW as.exe instead of nasm.exe - named mingw-as.exe provided in the setup.exe) * rename call/2 to call_det/2 * implement call/2-11 as will be defined in the next standard * fix various problems when compiling with gcc 4 (gcc 4.1.1) * emit .note.GNU-stack to mark the stack as no executable in x86_any.c, x86_64_any.c and powerpc_any.c * change the way objects are found (obj_chain.c) using gcc ctors * use Doug Lea malloc for OpenBSD (problem with malloc using mmap) * fix problems in various ports: alpha/linux, powerpc/darwin (Mac OS X), sparc/solaris, ix86/OpenBSD Change in GNU Prolog version 1.2.19: * fix 2 bugs in global variables Change in GNU Prolog version 1.2.18: * fix problem when compiling with gcc 3.4.0 * fix bug in term comparison involving negative integers * add consult, ... and fix minor bugs in the Win32 GUI console menu * fix the stack overflow detection under cygwin * port to ix86/MinGW - many thanks to: Cesar Rabak * fix a problem in the port to x86/OpenBSD * port to sparc/NetBSD and powerpc/NetBSD - many thanks to: Jason Beegan * fix a bug in =../2 involving FD variables * fix a bug in arithmetics (in float_{integer/fractional}_part) * fix a bug in FD solver (wrong union with a singleton) Change in GNU Prolog version 1.2.17: * change configure.in: by default ebp is not used * fix a but with CTRL+C handler not reinstalled * fix a bug with _XXX (re)displayed under the top-level * port to x86_64/linux - many thanks to: Gwenole Beauchesne Change in GNU Prolog version 1.2.16: * official release (Oct 1 2002) * fix bug in predicate_property/2 * add new built-in fork_prolog/1 and create_pipe/2 * fix a bug in atom_concat/3 * fix bug when detecting if a stream can be repositioned Change in GNU Prolog version 1.2.15: * fix bug in output to constant terms (e.g. write_to_atom/2) * include another additional patch for sockets under win32 - due to: Brent Fulgham * fix bug in bagof/3 with FD variables * fix bug with randomize/0 Change in GNU Prolog version 1.2.14: * added min/max to Prolog arithmetics * fix bugs in current_predicate and predicate_property Change in GNU Prolog version 1.2.13: * official release (Jun 14 2002) * port to powerpc/Darwin (Mac OS X) - many thanks to: Lindsey Spratt * fix bug in Win32 GUI console (deal with edit control text limit) * fix bug with in-place installation procedure * fix problem with portray_clause/2 using $VARNAME and $VAR now portray_clause((p(Z):-p('$VARNAME'('A'),Z))) is ok * fix bug with stream buffering (open/4 and set_stream_buffering/2) * add stream mirror facility (see add_stream_mirror/2) Change in GNU Prolog version 1.2.12: * improve global vars (arg. selector, automatic array, new built-ins) * fix two bugs with Ctrl+C reentrency under the top-level * added priority/1 option to write_term to specify starting priority * now under the top-level, _XXX variables are not displayed * fix bug in decompose_file_name/4 (tried to modify read-only string) * now open/4 better detects if a stream can be repositioned * add source reader facility (built-in) - not yet documented * fix current_predicate bug, now current_predicate(nl/0) fails * fix linedit bug in tab pasting and add Esc-Tab function * now linedit goes to EOL at CR to fix bug with multi-line inputs * now linedit avoids to put in history 2 same consecutive lines * remove max_stream limitation (the Prolog flag no longer exists) * the template of get_print_stream/1 is now ?stream * patch to allow more than 64Mb for the stacks under ix86/linux * fix a bug in wam2ma (hexa name creation overflowed malloc buffer) Change in GNU Prolog version 1.2.11: * fix a problem under sparc/solaris using mmap (adding MAP_FIXED) * fix a problem with gcc 3.0.x which always uses ebp in main() * use -march=xxx gcc option instead of -mxxx for ix86 Change in GNU Prolog version 1.2.10: * gplc now passes -L option to ld in the order of apparition * gplc accepts meta-characters %p, %d,... in output file names * include additional patch for sockets under win32 - due to: Brent Fulgham Change in GNU Prolog version 1.2.9: * re-write Windows GUI Console in pure Win32 (no more MFC) * adapt configure.in to work with autoconf 2.52 * add Prolog flag back_quotes and values {atom,chars,codes}_no_escape * use a terminal recusion in FD arithmetic normalization * fix bug in bind_variables/2, reported by: Bowie Owens * modify Ma2Asm mappers to use Y_OFFSET (from ENVIR_STATIC_SIZE) * fix some bugs in the Wam debugger * add several options to the top-level to execute goals * add an environment variable LINEDIT to control linedit options * fix bug in linedit on \b in start of line (using ANSI ESC sequences) * simplify linedit: only apply to stdin * now linedit is reentrant * now linedit works with XFree keyboard encoding * rename built-in get_code_no_echo/1-2 by get_key_no_echo/1-2 * add built-in get_key/1-2 * use get_key/1-2 in the top_level + debugger (thus with echo) * improve the top-level Ctrl+C manager * fix bux on linux configured with --disable-regs * add pipe to pl2wam stdin when called by consult/1 * fix bug in FD: forall is now recognized in .fd files * fix bug in DCG: expand_term((a --> X), Y) is OK * fix X paste problem in linedit * simplify top_comp.c to better control include dirs in devel. mode * specialized functions for create/update/delete choice points * fix a bug in wam2ma (hexa name creation overflowed malloc buffer) * include patch to support basic sockets under win32 - due to: Brent Fulgham * arithmetic functions and inlined built-ins use fast call * specialized functions for switch_on_term_xxx * modify pl2wam to generalize '$call_c' (add options) Change in GNU Prolog version 1.2.8: * official release (Oct 15 2001) * fix bug - delete file created by mkstemp(2), patch from: Salvador Abreu * space_args(true) now displays a space inside {}/1 * space_args(true) now displays a space after a comma (','/2) Change in GNU Prolog version 1.2.7: * add a --foreign-only option to pl2wam * foreign/2 directives are ignored in byte-code mode (no fatal error) * space_args(true) now displays space between operators and arguments * add CVS Id to prolog files * get rid of mktemp and tempnam calls (use mkstemp if available) * fix bug in pl2wam to include break/0, trace/0,... in bip_list.pl * fix a bug in fd_element_var/3 constraint * fix bug in fd headers (fd_to_c.h not installed) * fix a bug with unify_with_occurs_check/2 * fix bug on ix86 using ebp (add -fomit-frame-pointer in CFLAGS_MACHINE) Change in GNU Prolog version 1.2.6: * fix a bug with ! in dynamic code * fix a bug in arithmetics Change in GNU Prolog version 1.2.5: * big modification (1 month) to optimize the execution speed Change in GNU Prolog version 1.2.4: * implement fast call (mainly for WAM functions) * modify C->Prolog foreign interface to recover arguments space * improve dynamic clause management and fix a bug (memory leak) * fix _ symbol prefix problem for Free BSD * no longer use dl_malloc on Linux but prevent MMAP using mallopt Change in GNU Prolog version 1.2.3: * added acos/asin to Prolog arithmetics * full re-indentation of the sources for CVS Change in GNU Prolog version 1.2.2: * port to alpha/linux - many thanks to: Alexander Diemand * port to alpha/OSF1 * port to mips/irix - many thanks to: Alexander Diemand * fix a bug in stty.c (use standard termios if present) Change in GNU Prolog version 1.2.1: * fix a bug in stty.c (use termio by default and else termios) Change in GNU Prolog version 1.2.0: * official release (Jul 28 2000) Change in GNU Prolog version 1.1.7: * port for ix86/NetBSD - many thanks to: Brook Milligan * more customizable configuration/installation procedure Change in GNU Prolog version 1.1.6: * start of native Win32 port * added creation/1 and last_access/1 property to file_property/2 * fix a bug in the compiler about \\ inside quoted atoms * fix a bug in dynamic clause retraction (memory leak) * fix a bug in atom management (existing atoms eat mallocated space) * avoid to establish a connection at start to get the hostname * rename configuration file config.h by gp_config.h Change in GNU Prolog version 1.1.5: * internal version Change in GNU Prolog version 1.1.4: * fix a bug in the byte-code loader (bad realloc computation) * fix a bug in the malloc (used MMAP under linux) Change in GNU Prolog version 1.1.3: * port for ix86/SCO - many thanks to: Clive Cox and Edmund Grimley Evans ) * port for ix86/solaris - many thanks to: Andreas Stolcke * fix a bug in the FD solver for X#\=C (if C is max(X)) * fix a bug with directory_files/2 (too many open files) Change in GNU Prolog version 1.1.2: * official release (Nov 29 1999) * fix a bug in the scanner about 0' * fix a bug in the compiler about \t in quoted atoms Change in GNU Prolog version 1.1.1: * fix bug with popen/3 * update machine.c for struct sigcontext under Linux Change in GNU Prolog version 1.1.0: * official release (Oct 4 1999) * fix a bug in the output of some extended characters in native-compilation Change in GNU Prolog version 1.0.6: * fix a bug in sign/1 for arithmetic evaluation * implementation of call_with_args Change in GNU Prolog version 1.0.5: * fix a bug in foreign C calling Prolog on sparc Change in GNU Prolog version 1.0.4: * fix a bug with sparc compilation Change in GNU Prolog version 1.0.3: * a first final port for cygwin (see PROBLEMS) * fix some bugs in the FD solver * fix some other bugs Change in GNU Prolog version 1.0.2: * fix precision bug on floating constants Change in GNU Prolog version 1.0.1: * add ensure_linked directive * fix known bugs under RedHat 6.0 usgin egcs * port for PowerPC / GNU/Linux Change in GNU Prolog version 1.0.0: * official release (Apr 16 1999) * rewrite DCG in C (unification optimized, avoid ill-balanced conjunctions) * fix known bugs Change in GNU Prolog version 0.9.0: * Calypso becomes GNU Prolog * in-place installation facility * fix compiler bug * rewrite sorts built-in predicates and add in-place sorts predicates * rewrite DCG translation * rewrite all solutions built-in predicates Change in Calypso version 1.0-beta7: * use autoconf * fix known bugs * add :- built_in/0-1 and :- built_in_fd/0-1 directives * complete C foreign interface ./gprolog-1.3.0/ChangeLog0000644004425400513100000004557110547152210013554 0ustar diazlocoThu Jan 4 11:17:12 CET 2007 * change error messages emitted by the compiler to follow GNU standards Fri Dec 22 14:21:26 CET 2006 * modify doc (mainly rename manual.xxx to gprolog.xxx) * add DESTDIR variable support in main Makefile for staged installs Fri Dec 15 17:48:30 CET 2006 * fix a bug with Prolog floats in x86_64/linux (bad stack alignment) * port for ix86/darwin (Mac OS X) Fri Dec 8 16:59:49 CET 2006 * add check target to main Makefile Thu Dec 7 14:59:46 CET 2006 * improve Win32 ports (cygwin, MinGW, MSVC 6.0 and 2005 Express Edition) (MSVC port uses MinGW as.exe instead of nasm.exe - named mingw-as.exe Mon Nov 27 18:38:09 CET 2006 * rename call/2 to call_det/2 * implement call/2-11 as will be defined in the next standard Fri Nov 24 18:38:25 CET 2006 * fix various problems when compiling with gcc 4 (gcc 4.1.1) * emit .note.GNU-stack to mark the stack as no executable in x86_any.c, x86_64_any.c and powerpc_any.c * change the way objects are found (obj_chain.c) using gcc ctors * use Doug Lea malloc for OpenBSD (problem with malloc using mmap) * fix problems in various ports: alpha/linux, powerpc/darwin (Mac OS X), sparc/solaris, ix86/OpenBSD Mon Jun 13 15:46:49 CEST 2005 * fix 2 bugs in global variables Mon Jun 7 15:22:44 CEST 2004 * fix problem when compiling with gcc 3.4.0 Fri Jun 4 15:16:30 CEST 2004 * fix bug in term comparison involving negative integers Thu Mar 11 16:58:43 CET 2004 * add consult, ... and fix minor bugs in the Win32 GUI console menu Tue Mar 2 15:54:37 CET 2004 * fix the stack overflow detection under cygwin * port to ix86/MinGW - many thanks to: Cesar Rabak Mon Feb 9 14:38:43 CET 2004 * fix a bug in the port to sparc/solaris Mon Nov 3 11:13:14 CET 2003 * fix a problem in the port to x86/OpenBSD Tue Sep 23 11:10:09 CEST 2003 * port to sparc/NetBSD and powerpc/NetBSD - many thanks to: Jason Beegan Wed Apr 23 13:19:58 CEST 2003 * fix a bug in =../2 involving FD variables Fri Mar 21 14:09:26 CET 2003 * fix a bug in arithmetics (in float_{integer/fractional}_part) Thu Mar 6 09:28:20 CET 2003 * fix a bug in FD solver (wrong union with a singleton) Tue Feb 25 16:48:12 CET 2003 * fix a bug with the foreign C interface Wed Feb 19 18:10:22 CET 2003 * change configure.in: by default ebp is not used Mon Feb 17 13:45:05 CET 2003 * fix a but with CTRL+C handler not reinstalled Wed Jan 8 15:22:09 CET 2003 * fix a bug with _XXX (re)displayed under the top-level Mon Dec 16 13:00:42 CET 2002 * port to x86_64/linux - many thanks to: Gwenole Beauchesne Mon Sep 30 22:08:41 CEST 2002 * fix bug in predicate_property/2 Wed Sep 25 13:41:46 CEST 2002 * add new built-in fork_prolog/1 and create_pipe/2 Tue Sep 24 19:30:35 CEST 2002 * fix a bug in atom_concat/3 Thu Sep 19 12:53:45 CEST 2002 * fix bug when detecting if a stream can be repositioned Thu Sep 12 18:45:10 CEST 2002 * fix bug in output to constant terms (e.g. write_to_atom/2) * include another additional patch for sockets under win32 - due to: Brent Fulgham * fix bug in bagof/3 with FD variables * fix bug with randomize/0 Fri Jun 21 18:32:06 CEST 2002 * added min/max to Prolog arithmetics Thu Jun 20 15:20:43 CEST 2002 * fix bugs in current_predicate and predicate_property Mon Jun 10 14:25:52 CEST 2002 * port to powerpc/Darwin (Mac OS X) - many thanks to: Lindsey Spratt * fix bug in Win32 GUI console (deal with edit control text limit) * fix bug with in-place installation procedure Wed Apr 24 19:00:03 CEST 2002 * fix problem with portray_clause/2 using $VARNAME and $VAR now portray_clause((p(Z):-p('$VARNAME'('A'),Z))) is ok Tue Apr 23 13:13:18 CEST 2002 * fix bug with stream buffering (open/4 and set_stream_buffering/2) Sat Apr 21 13:09:54 CEST 2002 * add stream mirror facility (see add_stream_mirror/2) Fri Apr 19 15:20:51 CEST 2002 * improve global vars (arg. selector, automatic array, new built-ins) Sun Apr 14 16:35:10 CEST 2002 * fix two bugs with Ctrl+C reentrency under the top-level Thu Apr 11 20:30:16 CEST 2002 * added priority/1 option to write_term to specify starting priority * now under the top-level, _XXX variables are not displayed Wed Apr 10 15:04:23 CEST 2002 * fix bug in decompose_file_name/4 (tried to modify read-only string) * now open/4 better detects if a stream can be repositioned Mon Apr 8 20:08:29 CEST 2002 * add source reader facility (built-in) - not yet documented * fix current_predicate bug, now current_predicate(nl/0) fails Fri Apr 5 12:32:26 CEST 2002 * fix linedit bug in tab pasting and add Esc-Tab function * now linedit goes to EOL at CR to fix bug with multi-line inputs * now linedit avoids to put in history 2 same consecutive lines * remove max_stream limitation (the Prolog flag no longer exists) * the template of get_print_stream/1 is now ?stream Thu Mar 28 00:35:59 CEST 2002 * patch to allow more than 64Mb for the stacks under ix86/linux Mon Mar 25 13:34:52 CEST 2002 * fix a bug in wam2ma (hexa name creation overflowed malloc buffer) Fri Mar 22 11:31:52 CEST 2002 * fix a problem under sparc/solaris using mmap (adding MAP_FIXED) Tue Mar 19 18:51:50 CEST 2002 * fix a problem with gcc 3.0.x which always uses ebp in main() * use -march=xxx gcc option instead of -mxxx for ix86 Tue Jan 15 19:26:26 CEST 2002 * gplc now passes -L option to ld in the order of apparition * gplc accepts meta-characters %p, %d,... in output file names Tue Jan 8 16:51:48 CEST 2002 * include additional patch for sockets under win32 - due to: Brent Fulgham Thu Dec 20 16:17:00 CEST 2001 * re-write Windows GUI Console in pure Win32 (no more MFC) * adapt configure.in to work with autoconf 2.52 Thu Dec 13 12:09:36 CEST 2001 * add Prolog flag back_quotes and values {atom,chars,codes}_no_escape * use a terminal recusion in FD arithmetic normalization Wed Dec 12 11:04:57 CEST 2001 * fix bug in bind_variables/2, reported by: Bowie Owens Tue Dec 11 18:25:19 CEST 2001 * modify Ma2Asm mappers to use Y_OFFSET (from ENVIR_STATIC_SIZE) * fix some bugs in the Wam debugger Fri Dec 7 19:01:02 CEST 2001 * add several options to the top-level to execute goals * add an environment variable LINEDIT to control linedit options * fix bug in linedit on \b in start of line (using ANSI ESC sequence) * now linedit works with XFree keyboard encoding Tue Dec 4 20:29:00 CEST 2001 * simplify linedit: only apply to stdin * now linedit is reentrant * rename built-in get_code_no_echo/1-2 by get_key_no_echo/1-2 * add built-in get_key/1-2 * use get_key/1-2 in the top_level + debugger (thus with echo) * improve the top-level Ctrl+C manager Mon Dec 3 18:13:16 CEST 2001 * fix bux on linux configured with --disable-regs * add pipe to pl2wam stdin when called by consult/1 Mon Nov 5 10:25:29 CEST 2001 * fix bug in FD: forall is now recognized in .fd files * fix bug in DCG: expand_term((a --> X), Y) is OK Wed Oct 31 20:31:04 CEST 2001 * fix X paste problem in linedit Tue Oct 3O 17:31:04 CEST 2001 * simplify top_comp.c to better control include dirs in devel. mode Sun Oct 14 17:12:32 CEST 2001 * specialized functions for create/update/delete choice points Tue Oct 9 12:11:44 CEST 2001 * fix a bug in wam2ma (hexa name creation overflowed malloc buffer) Mon Oct 8 12:33:02 CEST 2001 * include patch to support basic sockets under win32 - due to: Brent Fulgham * arithmetic functions and inlined built-ins use fast call * specialized functions for switch_on_term_xxx * modify pl2wam to generalize '$call_c' (add options) Mon Oct 8 11:33:02 CEST 2001 * fix bug - delete file created by mkstemp(2), patch from: Salvador Abreu Fri Sep 28 17:09:35 CEST 2001 * space_args(true) now displays a space inside {}/1 * space_args(true) now displays a space after a comma (','/2) Sat Sep 15 12:49:19 CET 2001 * add a --foreign-only option to pl2wam * foreign/2 directives are ignored in byte-code mode (no fatal error) Fri Sep 7 09:58:36 CET 2001 * space_args(true) now displays space between operators and arguments * add CVS Id to prolog files * fix bug in pl2wam to include break/0, trace/0,... in bip_list.pl Thu Jul 12 16:03:30 CET 2001 * get rid of mktemp and tempnam calls (use mkstemp if available) Thu Jun 7 20:34:13 CET 2001 * fix a bug in fd_element_var/3 constraint Thu Feb 8 11:25:30 CET 2001 * fix bug in fd headers (fd_to_c.h not installed) Thu Jan 25 21:12:06 CET 2001 * fix a bug with unify_with_occurs_check/2 * fix bug on ix86 using ebp (add -fomit-frame-pointer in CFLAGS_MACHINE) Mon Jan 22 12:41:26 CET 2001 * fix a bug with ! in dynamic code * fix a bug in arithmetics Tue Dec 19 16:32:39 CET 20000 * big modification (1 month) to optimize the execution speed Thu Nov 9 19:06:06 CEST 2000 * implement fast call (mainly for WAM functions) Tue Nov 7 15:12:11 CEST 2000 * modify C->Prolog foreign interface to recover arguments space Mon Nov 6 14:58:07 CEST 2000 * improve dynamic clause management and fix a bug (memory leak) Fri Nov 3 09:17:19 CEST 2000 * fix _ symbol prefix problem for Free BSD Fri Oct 13 17:46:38 CEST 2000 * no longer use dl_malloc on Linux but prevent MMAP using mallopt Tue Sep 12 15:42:48 CEST 2000 * full re-indentation of the sources for CVS Thu Sep 7 18:04:15 CEST 2000 * added acos/asin to Prolog arithmetics Wed Sep 6 20:04:15 CEST 2000 * port to alpha/linux - many thanks to: Alexander Diemand * port to alpha/OSF1 * port to mips/irix - many thanks to: Alexander Diemand * fix a bug in stty.c (use standard termios if present) Mon Jul 31 11:42:44 CEST 2000 * fix a bug in stty.c (use termio by default and else termios) Thu Jul 6 11:38:58 CEST 2000 * more customizable configuration/installation procedure Mon Jun 3 19:57:20 CEST 2000 * port for ix86/NetBSD - many thanks to: Brook Milligan Wed Jun 28 11:38:37 CEST 2000 * rename configuration file config.h by gp_config.h Mon Jun 19 14:24:44 CEST 2000 * avoid to establish a connection at start to get the hostname Tue Jun 6 16:51:48 CEST 2000 * fix a bug in the compiler about \\ inside quoted atoms Thu May 4 17:39:53 CEST 2000 * fix a bug in dynamic clause retraction (memory leak) Wed Apr 26 10:51:53 CEST 2000 * fix a bug in dynamic clause retraction (memory leak) Tue Apr 25 16:32:09 CEST 2000 * fix a bug in atom management (existing atoms eat mallocated space) Tue Apr 18 13:23:02 CEST 2000 * added creation/1 and last_access/1 property to file_property/2 Wed Mar 1 14:23:45 CEST 2000 * start of native Win32 port Mon Feb 14 14:00:46 CET 2000 * port for ix86/FreeBSD - many thanks to: Nicolas Ollinger Tue Jan 18 17:30:25 CET 2000 * fix a bug in the byte-code loader (bad realloc computation) * fix a bug in the malloc (used MMAP under linux) Fri Dec 17 15:54:51 CET 1999 * port for ix86/SCO - many thanks to: Clive Cox and Edmund Grimley Evans * port for ix86/solaris - many thanks to: Andreas Stolcke Thu Dec 16 18:23:13 CET 1999 * fix a bug in the FD solver for X#\=C (if C is max(X)) Thu Dec 2 17:31:31 CET 1999 * fix a bug with directory_files/2 (too many open files) Thu Nov 25 14:27:11 CET 1999 * fix a bug in the compiler about \t in quoted atoms Fri Oct 22 14:59:47 CEST 1999 * fix a bug in the scanner about 0' Mon Oct 18 12:46:59 CEST 1999 * fix bug with popen/3 * update machine.c for struct sigcontext under Linux Fri Oct 8 19:36:59 CEST 1999 * fix a bug with some extended characters in native compilation Tue Sep 28 18:00:44 CEST 1999 * implement call_with_args Mon Sep 27 16:18:55 CEST 1999 * fix a bug in sign/1 for arithmetic evaluation Fri Jul 16 13:26:31 CEST 1999 * fix a bug in foreign C calling Prolog for sparc Thu Jul 15 12:04:38 CEST 1999 * fix a bug for sparc compilation * fix a bug in foreign code under sparc * update pl_config.c to show which version is installed Tue Jul 6 14:47:51 CEST 1999 * add linedit test to avoid to re-echo an already buffered full-line * fix bugs is sort/1 Fri Jun 25 10:04:03 CEST 1999 * fix bug in sleep/1 (incorrect behavior with a float) * finish preliminar port to cygwin (see file src/PROBLEMS) Wed Jun 23 13:49:07 MEST 1999 * fix bug in FD solver (too much trail allocated due to bad vec_size) * fix labeling first-fail to correspond to clp(FD) Fri Jun 18 12:29:03 CEST 1999 * fix message from consult when pl2wam cannot be found Thu Jun 17 16:12:53 MEST 1999 * fix precision bug on floating constants Sun Jun 6 12:05:32 CEST 1999 * port for ix86/cygwin (Win32) (to finish) Fri Jun 4 11:05:37 CEST 1999 * fix bug in throw_c.c (foreign code catch exception) * improve Ma2Asm check.c and FromC/ utilities * port for PowerPC / GNU/Linux (see file src/PROBLEMS) Mon May 31 10:45:35 CEST 1999 * fix bug using egcs-1.1.2 (RedHat 6.0) (add a Stop_Prolog() fct) Fri May 21 15:56:50 MEST 1999 * removed Configure directory (clashes with ./configure under WinXX) * fix Linedit/Makefile.in (CFLAGS added) Fri May 21 11:54:31 MEST 1999 * added :- ensure_linked directive * fix bug in gplc help (-C/-A/-L instead of --C/--A/--L) * fix bug in gplc (with too long command-lines) * fix bug in M_Absolute_Path_Name() (/.automount gave /automount) Wed Apr 21 09:53:00 MEST 1999 * work release 1.0.1 * fix bug --disable-regs works now for solaris Mon Apr 19 19:46:07 MEST 1999 * optimize FD equations (math_supp.c) avoid qsort sometimes * fix bug in installation procedure (Html doc installation) Fri Apr 16 15:49:34 MEST 1999 * official release 1.0.0 * rewrite in C DCG translation: optimize unifications, no more ill-balanced conjunctions * fix bug in bc_supp.c to avoid aux pred name for unknown predicate * fix bug in pl2wam (:- set_prolog_flag(singleton_warning,off)) Thu Apr 8 19:09:40 MEST 1999 * current_prolog/1 conforms to ISO thanks to strict_iso flag * fix bug (type_list instead of instantiation error for Options) * fix bug setof (not sorted when comes down to findall) Tue Apr 6 20:48:32 MEST 1999 * add Prolog flag strict_iso (to relax predicate indicators) * fix number_chars and friends non ISO conforming behavior * modify wam2ma to avoid static arrays (use dynamic allocation) Sun Apr 4 15:28:12 MET 1999 * add in-place installation (modify configure.in and Makefile.in) Wed Mar 31 16:26:10 MET 1999 * add copyright headers in source files Thu Mar 30 17:20:10 MET 1999 * rewrite all solutions built-in predicates (in C) * add in-place sorts Wed Mar 24 10:12:02 MET 1999 * rewrite DCG translations Mon Mar 22 19:42:12 MET 1999 * fix compiler bug in wam2ma (atom using \xHH\ not correctly handled) Fri Mar 19 19:42:12 MET 1999 * rewrite sorts built-in predicates (in C) Mon Mar 15 10:12:02 MET 1999 * Calypso (beta 7) becomes GNU Prolog 0.9.0 change command names (calypso -> gprolog, plcc -> gplc,...) copyright messages (--version),... Fri Mar 12 09:38:24 MET 1999 * fail/0 caused an existence_error under the debugger Wed Mar 10 11:57:25 MET 1999 * user/built_in/built_in_fd not recognized by load/1 Mon Mar 8 20:39:25 MET 1999 * Calypso version 1.0-beta7 ready for internal use ./gprolog-1.3.0/src/0000777004425400513100000000000010547442376012600 5ustar diazloco./gprolog-1.3.0/src/Ma2Asm/0000777004425400513100000000000010547442376013660 5ustar diazloco./gprolog-1.3.0/src/Ma2Asm/INLINED0000644004425400513100000000101607211750062014643 0ustar diazlocoGet_Atom_Tagged Get_Integer_Tagged Get_Float Get_Nil Get_List Get_Structure_Tagged Put_X_Variable Put_Y_Variable Put_Unsafe_Value Put_Atom_Tagged Put_Integer_Tagged Put_Float Put_Nil Put_List Put_Structure_Tagged Unify_Variable Unify_Void Unify_Value Unify_Local_Value Unify_Atom_Tagged Unify_Integer_Tagged Unify_Nil Unify_List Unify_Structure_Tagged Allocate Deallocate Switch_On_Term Switch_On_Atom Switch_On_Integer Switch_On_Structure Load_Cut_Level Cut Create_Choice_Point Update_Choice_Point Delete_Choice_Point ./gprolog-1.3.0/src/Ma2Asm/ma_parser.h0000644004425400513100000000567610547154142016003 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : ma_parser.h * * Descr.: parser - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: ma_parser.h,v 1.10 2007/01/04 10:35:14 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef enum { IDENTIFIER = 256, /* not a type but a token */ INTEGER, FLOAT, MEM, /* not a token but a type */ X_REG, Y_REG, FL_ARRAY, FD_ARRAY, STRING } ArgTyp; typedef struct { char *name; int index; } Mem; typedef struct { ArgTyp type; int adr_of; union { char *str_val; /* for string */ long int_val; /* for integer */ double dbl_val; /* for double */ Mem mem; /* for mem */ int index; /* for X() Y() FL() FD() */ } t; } ArgInf; typedef struct { long int_val; char *label; } SwtInf; typedef enum { NONE, ARRAY_SIZE, INITIAL_VALUE } VType; /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ int Parse_Ma_File(char *file_name_in, int comment); void Syntax_Error(char *s); ./gprolog-1.3.0/src/Ma2Asm/sparc_any.c0000644004425400513100000006662010547154142016000 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : sparc_any.c * * Descr.: translation file for SunOs/Solaris on sparc * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: sparc_any.c,v 1.17 2007/01/04 10:35:14 diaz Exp $ */ #include #include #include /*---------------------------------* * Constants * *---------------------------------*/ #define STRING_PREFIX ".LC" #ifdef M_sparc_sunos #define UN "_" #else #define UN #endif /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ char asm_reg_bank[16]; char asm_reg_e[16]; char asm_reg_b[16]; char asm_reg_cp[16]; int w_label = 0; char *delay_op; char delay_operands[1024]; /* variables for ma_parser.c / ma2asm.c */ #if 0 char *comment_prefix = "#"; /* does not work on solaris 9 */ #else char *comment_prefix = "!"; #endif char *local_symb_prefix = "L"; int strings_need_null = 1; int call_c_reverse_args = 0; char *inline_asm_data[] = { NULL }; /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Delay_Printf(char *op, char *operands, ...); #define LITTLE_INT(int_val) ((unsigned) ((int_val)+4096) < 8192) /*-------------------------------------------------------------------------* * SOURCE_LINE * * * *-------------------------------------------------------------------------*/ void Source_Line(int line_no, char *cmt) { Label_Printf("\t! %6d: %s", line_no, cmt); } /*-------------------------------------------------------------------------* * ASM_START * * * *-------------------------------------------------------------------------*/ void Asm_Start(void) { #ifdef MAP_REG_BANK sprintf(asm_reg_bank, "%%%s", MAP_REG_BANK); #else strcpy(asm_reg_bank, "%l0"); #endif #ifdef MAP_REG_E sprintf(asm_reg_e, "%%%s", MAP_REG_E); #else strcpy(asm_reg_e, "%l1"); #endif #ifdef MAP_REG_B sprintf(asm_reg_b, "%%%s", MAP_REG_B); #else sprintf(asm_reg_b, "[%s+%d]", asm_reg_bank, MAP_OFFSET_B); #endif #ifdef MAP_REG_CP sprintf(asm_reg_cp, "%%%s", MAP_REG_CP); #else sprintf(asm_reg_cp, "[%s+%d]", asm_reg_bank, MAP_OFFSET_CP); #endif Label_Printf(".text"); Label("fail"); Pl_Fail(); } /*-------------------------------------------------------------------------* * ASM_STOP * * * *-------------------------------------------------------------------------*/ void Asm_Stop(void) { } /*-------------------------------------------------------------------------* * CODE_START * * * *-------------------------------------------------------------------------*/ void Code_Start(char *label, int prolog, int global) { Label_Printf(""); Inst_Printf(".align", "4"); #if defined(M_sparc_solaris) || defined(M_sparc_bsd) Inst_Printf(".type", UN "%s,#function", label); #endif Inst_Printf(".proc", "020"); if (global) Inst_Printf(".global", UN "%s", label); Label(label); if (!prolog) Inst_Printf("save", "%%sp,-104,%%sp"); } /*-------------------------------------------------------------------------* * CODE_STOP * * * *-------------------------------------------------------------------------*/ void Code_Stop(void) { } /*-------------------------------------------------------------------------* * LABEL * * * *-------------------------------------------------------------------------*/ void Label(char *label) { Label_Printf("\n" UN "%s:", label); } /*-------------------------------------------------------------------------* * RELOAD_E_IN_REGISTER * * * *-------------------------------------------------------------------------*/ void Reload_E_In_Register(void) { #ifndef MAP_REG_E Inst_Printf("ld", "[%s+%d],%s", asm_reg_bank, MAP_OFFSET_E, asm_reg_e); #endif } /*-------------------------------------------------------------------------* * PL_JUMP * * * *-------------------------------------------------------------------------*/ void Pl_Jump(char *label) { Inst_Printf("call", UN "%s", label); Inst_Printf("nop", ""); /* delay slot */ } /*-------------------------------------------------------------------------* * PREP_CP * * * *-------------------------------------------------------------------------*/ void Prep_CP(void) { Inst_Printf("sethi", "%%hi(.Lcont%d-8),%%g1", w_label); Inst_Printf("or", "%%g1,%%lo(.Lcont%d-8),%%g1", w_label); Inst_Printf("st", "%%g1,%s", asm_reg_cp); } /*-------------------------------------------------------------------------* * HERE_CP * * * *-------------------------------------------------------------------------*/ void Here_CP(void) { Label_Printf(".Lcont%d:", w_label++); } /*-------------------------------------------------------------------------* * PL_CALL * * * *-------------------------------------------------------------------------*/ void Pl_Call(char *label) { Inst_Printf("call", UN "%s,0", label); #ifdef MAP_REG_CP Inst_Printf("mov", "%%o7,%s", asm_reg_cp); /* delay slot */ #else Inst_Printf("st", "%%o7,%s", asm_reg_cp); /* delay slot */ #endif } /*-------------------------------------------------------------------------* * PL_FAIL * * * *-------------------------------------------------------------------------*/ void Pl_Fail(void) { #ifdef MAP_REG_B Inst_Printf("ld", "[%s-4],%%o0", asm_reg_b); #else Inst_Printf("ld", "%s,%%o0", asm_reg_b); Inst_Printf("ld", "[%%o0-4],%%o0"); #endif Inst_Printf("call", "%%o0"); Inst_Printf("nop", ""); /* delay slot */ } /*-------------------------------------------------------------------------* * PL_RET * * * *-------------------------------------------------------------------------*/ void Pl_Ret(void) { #ifdef MAP_REG_CP Inst_Printf("jmp", "%s+8", asm_reg_cp); #else Inst_Printf("ld", "%s,%%o0", asm_reg_cp); Inst_Printf("jmp", "%%o0+8"); #endif Inst_Printf("nop", ""); /* delay slot */ } /*-------------------------------------------------------------------------* * JUMP * * * *-------------------------------------------------------------------------*/ void Jump(char *label) { Inst_Printf("ba", UN "%s", label); Inst_Printf("nop", ""); /* delay slot */ } /*-------------------------------------------------------------------------* * MOVE_FROM_REG_X * * * *-------------------------------------------------------------------------*/ void Move_From_Reg_X(int index) { Inst_Printf("ld", "[%s+%d],%%o0", asm_reg_bank, index * 4); } /*-------------------------------------------------------------------------* * MOVE_FROM_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_From_Reg_Y(int index) { Inst_Printf("ld", "[%s%+d],%%o0", asm_reg_e, Y_OFFSET(index)); } /*-------------------------------------------------------------------------* * MOVE_TO_REG_X * * * *-------------------------------------------------------------------------*/ void Move_To_Reg_X(int index) { Inst_Printf("st", "%%o0,[%s+%d]", asm_reg_bank, index * 4); } /*-------------------------------------------------------------------------* * MOVE_TO_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_To_Reg_Y(int index) { Inst_Printf("st", "%%o0,[%s%+d]", asm_reg_e, Y_OFFSET(index)); } /*-------------------------------------------------------------------------* * CALL_C_START * * * *-------------------------------------------------------------------------*/ void Call_C_Start(char *fct_name, int fc, int nb_args, int nb_args_in_words, char **p_inline) { delay_op = NULL; } #define MAX_ARGS_IN_REGS 6 #define BEFORE_ARG \ { \ char r[4]; \ \ if (offset < MAX_ARGS_IN_REGS) \ sprintf(r, "%%o%d", offset); \ else \ strcpy(r, "%l7"); #define AFTER_ARG \ if (offset >= MAX_ARGS_IN_REGS) \ Delay_Printf("st","%s,[%%sp+%d]", r, \ 92 + (offset - MAX_ARGS_IN_REGS) * 4); \ } /*-------------------------------------------------------------------------* * CALL_C_ARG_INT * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Int(int offset, long int_val) { BEFORE_ARG; if (LITTLE_INT(int_val)) Delay_Printf("mov", "%ld,%s", int_val, r); else { Delay_Printf("sethi", "%%hi(%ld),%s", int_val, r); Delay_Printf("or", "%s,%%lo(%ld),%s", r, int_val, r); } AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_DOUBLE * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Double(int offset, double dbl_val) { int *p = (int *) &dbl_val; BEFORE_ARG; Delay_Printf("sethi", "%%hi(%d),%s", p[0], r); Delay_Printf("or", "%s,%%lo(%d),%s", r, p[0], r); AFTER_ARG; offset++; BEFORE_ARG; Delay_Printf("sethi", "%%hi(%d),%s", p[1], r); Delay_Printf("or", "%s,%%lo(%d),%s", r, p[1], r); AFTER_ARG; return 2; } /*-------------------------------------------------------------------------* * CALL_C_ARG_STRING * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_String(int offset, int str_no) { BEFORE_ARG; Delay_Printf("sethi", "%%hi(%s%d),%s", STRING_PREFIX, str_no, r); Delay_Printf("or", "%s,%%lo(%s%d),%s", r, STRING_PREFIX, str_no, r); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_MEM_L * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Mem_L(int offset, int adr_of, char *name, int index) { BEFORE_ARG; Delay_Printf("sethi", "%%hi(" UN "%s+%d),%s", name, index * 4, r); if (adr_of) Delay_Printf("or", "%s,%%lo(" UN "%s+%d),%s", r, name, index * 4, r); else Delay_Printf("ld", "[%s+%%lo(" UN "%s+%d)],%s", r, name, index * 4, r); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_REG_X * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Reg_X(int offset, int adr_of, int index) { BEFORE_ARG; if (adr_of) Delay_Printf("add", "%s,%d,%s", asm_reg_bank, index * 4, r); else Delay_Printf("ld", "[%s+%d],%s", asm_reg_bank, index * 4, r); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_REG_Y * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Reg_Y(int offset, int adr_of, int index) { BEFORE_ARG; if (adr_of) Delay_Printf("add", "%s,%+d,%s", asm_reg_e, Y_OFFSET(index), r); else Delay_Printf("ld", "[%s%+d],%s", asm_reg_e, Y_OFFSET(index), r); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_FOREIGN_L * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Foreign_L(int offset, int adr_of, int index) { BEFORE_ARG; if (adr_of) Delay_Printf("add", "%%l2,%d,%s", index * 4, r); else Delay_Printf("ld", "[%%l2+%d],%s", index * 4, r); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_FOREIGN_D * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Foreign_D(int offset, int adr_of, int index) { if (adr_of) { BEFORE_ARG; Delay_Printf("add", "%%l3,%d,%s", index * 8, r); AFTER_ARG; return 1; } BEFORE_ARG; Delay_Printf("ld", "[%%l3+%d],%s", index * 8, r); AFTER_ARG; offset++; BEFORE_ARG; Delay_Printf("ld", "[%%l3+%d],%s", index * 8 + 4, r); AFTER_ARG; return 2; } /*-------------------------------------------------------------------------* * CALL_C_INVOKE * * * *-------------------------------------------------------------------------*/ void Call_C_Invoke(char *fct_name, int fc, int nb_args, int nb_args_in_words) { Inst_Printf("call", UN "%s", fct_name); if (delay_op) Inst_Out(delay_op, delay_operands); else Inst_Printf("nop", ""); /* delay slot */ } /*-------------------------------------------------------------------------* * CALL_C_STOP * * * *-------------------------------------------------------------------------*/ void Call_C_Stop(char *fct_name, int nb_args, char **p_inline) { #ifndef MAP_REG_E if (p_inline && INL_ACCESS_INFO(p_inline)) reload_e = 1; #endif } /*-------------------------------------------------------------------------* * JUMP_RET * * * *-------------------------------------------------------------------------*/ void Jump_Ret(void) { Inst_Printf("jmp", "%%o0"); Inst_Printf("nop", ""); /* delay slot */ } /*-------------------------------------------------------------------------* * FAIL_RET * * * *-------------------------------------------------------------------------*/ void Fail_Ret(void) { Inst_Printf("cmp", "%%o0,0"); #if 0 Inst_Printf("be", UN "fail"); Inst_Printf("nop", ""); /* delay slot */ #else Inst_Printf("be", UN "%s+4", "fail"); #ifdef MAP_REG_B Inst_Printf("ld", "[%s-4],%%o0", asm_reg_b); #else Inst_Printf("ld", "%s,%%o0", asm_reg_b); #endif #endif } /*-------------------------------------------------------------------------* * MOVE_RET_TO_MEM_L * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Mem_L(char *name, int index) { Inst_Printf("sethi", "%%hi(" UN "%s+%d),%%o1", name, index * 4); Inst_Printf("st", "%%o0,[%%o1+%%lo(" UN "%s+%d)]", name, index * 4); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_REG_X * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Reg_X(int index) { /* same as Move_To_Reg_X */ Inst_Printf("st", "%%o0,[%s+%d]", asm_reg_bank, index * 4); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Reg_Y(int index) { /* same as Move_To_Reg_Y */ Inst_Printf("st", "%%o0,[%s%+d]", asm_reg_e, Y_OFFSET(index)); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_FOREIGN_L * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Foreign_L(int index) { Inst_Printf("st", "%%o0,[%%l2+%d]", index * 4); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_FOREIGN_D * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Foreign_D(int index) { Inst_Printf("std", "%%f0,[%%l3+%d]", index * 8); } /*-------------------------------------------------------------------------* * CMP_RET_AND_INT * * * *-------------------------------------------------------------------------*/ void Cmp_Ret_And_Int(long int_val) { if (LITTLE_INT(int_val)) Inst_Printf("cmp", "%%o0,%ld", int_val); else { Inst_Printf("sethi", "%%hi(%ld),%%o1", int_val); Inst_Printf("or", "%%o1,%%lo(%ld),%%o1", int_val); Inst_Printf("cmp", "%%o0,%%o1"); } } /*-------------------------------------------------------------------------* * JUMP_IF_EQUAL * * * *-------------------------------------------------------------------------*/ void Jump_If_Equal(char *label) { Inst_Printf("be", UN "%s", label); Inst_Printf("nop", ""); /* delay slot */ } /*-------------------------------------------------------------------------* * JUMP_IF_GREATER * * * *-------------------------------------------------------------------------*/ void Jump_If_Greater(char *label) { Inst_Printf("bg", UN "%s", label); Inst_Printf("nop", ""); /* delay slot */ } /*-------------------------------------------------------------------------* * C_RET * * * *-------------------------------------------------------------------------*/ void C_Ret(void) { Inst_Printf("ret", ""); Inst_Printf("restore", ""); /* delay slot */ } /*-------------------------------------------------------------------------* * DICO_STRING_START * * * *-------------------------------------------------------------------------*/ void Dico_String_Start(int nb_consts) { Inst_Printf(".section", ".rodata"); } /*-------------------------------------------------------------------------* * DICO_STRING * * * *-------------------------------------------------------------------------*/ void Dico_String(int str_no, char *asciiz) { Inst_Printf(".align", "8"); Label_Printf("%s%d:", STRING_PREFIX, str_no); Inst_Printf(".asciz", "%s", asciiz); } /*-------------------------------------------------------------------------* * DICO_STRING_STOP * * * *-------------------------------------------------------------------------*/ void Dico_String_Stop(int nb_consts) { } /*-------------------------------------------------------------------------* * DICO_LONG_START * * * *-------------------------------------------------------------------------*/ void Dico_Long_Start(int nb_longs) { #ifdef M_sparc_sunos Label_Printf(".data"); #else Inst_Printf(".section", "\".data\""); #endif Inst_Printf(".align", "4"); } /*-------------------------------------------------------------------------* * DICO_LONG * * * *-------------------------------------------------------------------------*/ void Dico_Long(char *name, int global, VType vtype, long value) { switch (vtype) { case NONE: value = 1; /* then in case ARRAY_SIZE */ case ARRAY_SIZE: #ifdef M_sparc_sunos if (!global) Inst_Printf(".reserve", UN "%s,%ld,\"bss\",4", name, value * 4); else Inst_Printf(".common", UN "%s,%ld,\"bss\"", name, value * 4); #else if (!global) Inst_Printf(".local", UN "%s", name); Inst_Printf(".common", UN "%s,%ld,4", name, value * 4); #endif break; case INITIAL_VALUE: #if defined(M_sparc_solaris) || defined(M_sparc_bsd) Inst_Printf(".type", UN "%s,#object", name); Inst_Printf(".size", UN "%s,4", name); #endif if (global) Inst_Printf(".global", UN "%s", name); Label_Printf(UN "%s:", name); #ifdef M_sparc_sunos Inst_Printf(".word", "%ld", value); #else Inst_Printf(".uaword", "%ld", value); #endif break; } } /*-------------------------------------------------------------------------* * DICO_LONG_STOP * * * *-------------------------------------------------------------------------*/ void Dico_Long_Stop(int nb_longs) { } /*-------------------------------------------------------------------------* * DATA_START * * * *-------------------------------------------------------------------------*/ void Data_Start(char *initializer_fct) { if (initializer_fct == NULL) return; Inst_Printf(".section", ".ctors,#alloc,#write"); Inst_Printf(".align", "4"); Inst_Printf(".long", UN "%s", initializer_fct); } /*-------------------------------------------------------------------------* * DATA_STOP * * * *-------------------------------------------------------------------------*/ void Data_Stop(char *initializer_fct) { } /*-------------------------------------------------------------------------* * DELAY_PRINTF * * * *-------------------------------------------------------------------------*/ void Delay_Printf(char *op, char *operands, ...) { va_list arg_ptr; if (delay_op) Inst_Out(delay_op, delay_operands); va_start(arg_ptr, operands); delay_op = op; vsprintf(delay_operands, operands, arg_ptr); } ./gprolog-1.3.0/src/Ma2Asm/powerpc_any.c0000644004425400513100000007162610547154142016351 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : powerpc_any.c * * Descr.: translation file for Linux/Darwin (MacOsX) on PowerPC * * Author: Daniel Diaz and Lindsey Spratt * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: powerpc_any.c,v 1.9 2007/01/04 10:35:14 diaz Exp $ */ #include #include /*---------------------------------* * Constants * *---------------------------------*/ #define STRING_PREFIX ".LC" #define DOUBLE_PREFIX ".LCD" #define MAX_C_ARGS_IN_C_CODE 32 #define MAX_DOUBLES_IN_PRED 2048 #if defined(M_powerpc_linux) || defined(M_powerpc_bsd) #define UN #define R(reg) #reg #define F(reg) #reg #define CR(reg) #reg #define HI(adr) #adr "@ha" #define HI_UN(adr) UN #adr "@ha" #define LO(adr) #adr "@l" #define LO_UN(adr) UN #adr "@l" #else #define UN "_" #define R(reg) "r" #reg #define F(reg) "f" #reg #define CR(reg) "cr" #reg #define HI(adr) "ha16(" #adr ")" #define HI_UN(adr) "ha16(" UN #adr ")" #define LO(adr) "lo16(" #adr ")" #define LO_UN(adr) "lo16(" UN #adr ")" #endif /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ double dbl_tbl[MAX_DOUBLES_IN_PRED]; int nb_dbl = 0; int dbl_lc_no = 0; int dbl_reg_no; char asm_reg_bank[16]; char asm_reg_e[16]; char asm_reg_b[16]; char asm_reg_cp[16]; int w_label = 0; /* variables for ma_parser.c / ma2asm.c */ char *comment_prefix = "#"; char *local_symb_prefix = ".L"; int strings_need_null = 0; int call_c_reverse_args = 0; char *inline_asm_data[] = { NULL }; /*---------------------------------* * Function Prototypes * *---------------------------------*/ #define LITTLE_INT(int_val) ((unsigned) ((int_val) + 32768) < 65536) #define IHI(x) ((unsigned) ((unsigned long) x >> 16)) #define ILO(x) ((unsigned) ((unsigned long) x & 0xFFFF)) /*-------------------------------------------------------------------------* * ASM_START * * * *-------------------------------------------------------------------------*/ void Asm_Start(void) { #ifdef MAP_REG_BANK sprintf(asm_reg_bank, R(%s), MAP_REG_BANK); #else strcpy(asm_reg_bank, R(15)); #endif #ifdef MAP_REG_E sprintf(asm_reg_e, R(%s), MAP_REG_E); #else strcpy(asm_reg_e, R(16)); #endif #ifdef MAP_REG_B sprintf(asm_reg_b, R(%s), MAP_REG_B); #else sprintf(asm_reg_b, "%d(%s)", MAP_OFFSET_B, asm_reg_bank); #endif #ifdef MAP_REG_CP sprintf(asm_reg_cp, R(%s), MAP_REG_CP); #else sprintf(asm_reg_cp, "%d(%s)", MAP_OFFSET_CP, asm_reg_bank); #endif Label_Printf(".text"); Label("fail"); Pl_Fail(); } /*-------------------------------------------------------------------------* * ASM_STOP * * * *-------------------------------------------------------------------------*/ void Asm_Stop(void) { #ifdef __ELF__ Inst_Printf(".section", ".note.GNU-stack,\"\",@progbits"); #endif } /*-------------------------------------------------------------------------* * CODE_START * * * *-------------------------------------------------------------------------*/ void Code_Start(char *label, int prolog, int global) { int i; int x = dbl_lc_no - nb_dbl; for (i = 0; i < nb_dbl; i++) { Label_Printf("%s%d:", DOUBLE_PREFIX, x++); Inst_Printf(".double", "0d%1.20e", dbl_tbl[i]); } nb_dbl = 0; Label_Printf(""); Inst_Printf(".align", "2"); #if defined(M_powerpc_linux) || defined(M_powerpc_bsd) Inst_Printf(".type", "%s,@function", label); #endif if (global) Inst_Printf(".globl", UN "%s", label); Label(label); if (!prolog) { Inst_Printf("mr", R(12) "," R(1)); Inst_Printf("addi", R(1) "," R(1) ",-%d", MAX_C_ARGS_IN_C_CODE * 4); Inst_Printf("stw", R(12) ",0(" R(1) ")"); Inst_Printf("mflr", R(0)); Inst_Printf("stw", R(0) ",%d(" R(1) ")", (MAX_C_ARGS_IN_C_CODE + 1) * 4); } } /*-------------------------------------------------------------------------* * CODE_STOP * * * *-------------------------------------------------------------------------*/ void Code_Stop(void) { } /*-------------------------------------------------------------------------* * LABEL * * * *-------------------------------------------------------------------------*/ void Label(char *label) { Label_Printf("\n" UN "%s:", label); } /*-------------------------------------------------------------------------* * RELOAD_E_IN_REGISTER * * * *-------------------------------------------------------------------------*/ void Reload_E_In_Register(void) { #ifndef MAP_REG_E Inst_Printf("lwz", "%s,%d(%s)", asm_reg_e, MAP_OFFSET_E, asm_reg_bank); #endif } /*-------------------------------------------------------------------------* * PL_JUMP * * * *-------------------------------------------------------------------------*/ void Pl_Jump(char *label) { Inst_Printf("b", UN "%s", label); } /*-------------------------------------------------------------------------* * PREP_CP * * * *-------------------------------------------------------------------------*/ void Prep_CP(void) { #ifndef MAP_REG_CP Inst_Printf("addis", R(9) ",0," HI(.Lcont%d), w_label); Inst_Printf("addi", R(9) "," R(9) "," LO(.Lcont%d), w_label); Inst_Printf("stw", R(9) ",%s", asm_reg_cp); #else Inst_Printf("addis", "%s,0," HI(.Lcont%d), asm_reg_cp, w_label); Inst_Printf("addi", "%s,%s," LO(.Lcont%d), asm_reg_cp, asm_reg_cp, w_label); #endif } /*-------------------------------------------------------------------------* * HERE_CP * * * *-------------------------------------------------------------------------*/ void Here_CP(void) { Label_Printf(".Lcont%d:", w_label++); } /*-------------------------------------------------------------------------* * PL_CALL * * * *-------------------------------------------------------------------------*/ void Pl_Call(char *label) { Prep_CP(); Pl_Jump(label); Here_CP(); } /*-------------------------------------------------------------------------* * PL_FAIL * * * *-------------------------------------------------------------------------*/ void Pl_Fail(void) { #ifdef MAP_REG_B Inst_Printf("lwz", R(9) ",-4(%s)", asm_reg_b); #else Inst_Printf("lwz", R(9) ",%s", asm_reg_b); Inst_Printf("lwz", R(9) ",-4(" R(9) ")"); #endif Inst_Printf("mtctr", R(9)); Inst_Printf("bctr", ""); } /*-------------------------------------------------------------------------* * PL_RET * * * *-------------------------------------------------------------------------*/ void Pl_Ret(void) { #ifndef MAP_REG_CP Inst_Printf("lwz", R(0) ",%s", asm_reg_cp); Inst_Printf("mtctr", R(0)); #else Inst_Printf("mtctr", "%s", asm_reg_cp); #endif Inst_Printf("bctr", ""); } /*-------------------------------------------------------------------------* * JUMP * * * *-------------------------------------------------------------------------*/ void Jump(char *label) { Inst_Printf("b", UN "%s", label); } /*-------------------------------------------------------------------------* * MOVE_FROM_REG_X * * * *-------------------------------------------------------------------------*/ void Move_From_Reg_X(int index) { Inst_Printf("lwz", R(0) ",%d(%s)", index * 4, asm_reg_bank); } /*-------------------------------------------------------------------------* * MOVE_FROM_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_From_Reg_Y(int index) { Inst_Printf("lwz", R(0) ",%d(%s)", Y_OFFSET(index), asm_reg_e); } /*-------------------------------------------------------------------------* * MOVE_TO_REG_X * * * *-------------------------------------------------------------------------*/ void Move_To_Reg_X(int index) { Inst_Printf("stw", R(0) ",%d(%s)", index * 4, asm_reg_bank); } /*-------------------------------------------------------------------------* * MOVE_TO_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_To_Reg_Y(int index) { Inst_Printf("stw", R(0) ",%d(%s)", Y_OFFSET(index), asm_reg_e); } /*-------------------------------------------------------------------------* * CALL_C_START * * * *-------------------------------------------------------------------------*/ void Call_C_Start(char *fct_name, int fc, int nb_args, int nb_args_in_words, char **p_inline) { dbl_reg_no = 0; } #if defined(M_powerpc_linux) || defined(M_powerpc_bsd) #define STACK_OFFSET(offset) offset * 4 - 24 #define DBL_RET_WORDS 0 #else #define STACK_OFFSET(offset) offset * 4 + 24 #define DBL_RET_WORDS 2 #endif #define MAX_ARGS_IN_REGS 8 #define BEFORE_ARG \ { \ char r[4]; \ if (offset < MAX_ARGS_IN_REGS) \ sprintf(r, R(%d), offset + 3); \ else \ strcpy(r, R(11)); #define AFTER_ARG \ if (offset >= MAX_ARGS_IN_REGS) \ Inst_Printf("stw", "%s,%d(" R(1) ")", r, STACK_OFFSET(offset)); \ } #if defined(M_powerpc_linux) || defined(M_powerpc_bsd) #define AFTER_ARG_DBL \ } #else #define AFTER_ARG_DBL \ if (offset >= MAX_ARGS_IN_REGS) \ Inst_Printf("stfd", F(%d) ",%d(" R(1) ")", dbl_reg_no, \ offset * 4 + 24); \ } #endif /*-------------------------------------------------------------------------* * CALL_C_ARG_INT * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Int(int offset, long int_val) { BEFORE_ARG; if (LITTLE_INT(int_val)) Inst_Printf("li", "%s,%ld", r, int_val); else { Inst_Printf("lis", "%s,%#x", r, IHI(int_val)); Inst_Printf("ori", "%s,%s,%#x", r, r, ILO(int_val)); } AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_DOUBLE * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Double(int offset, double dbl_val) { BEFORE_ARG; dbl_tbl[nb_dbl++] = dbl_val; Inst_Printf("addis", "%s,0," HI(%s%d), r, DOUBLE_PREFIX, dbl_lc_no); Inst_Printf("lfd", F(%d) "," LO(%s%d) "(%s)", ++dbl_reg_no, DOUBLE_PREFIX, dbl_lc_no++, r); AFTER_ARG_DBL; return DBL_RET_WORDS; } /*-------------------------------------------------------------------------* * CALL_C_ARG_STRING * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_String(int offset, int str_no) { BEFORE_ARG; Inst_Printf("addis", "%s,0," HI(%s%d), r, STRING_PREFIX, str_no); Inst_Printf("addi", "%s,%s," LO(%s%d), r, r, STRING_PREFIX, str_no); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_MEM_L * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Mem_L(int offset, int adr_of, char *name, int index) { BEFORE_ARG; Inst_Printf("addis", "%s,0," HI_UN(%s+%d), r, name, index * 4); if (adr_of) Inst_Printf("addi", "%s,%s," LO_UN(%s+%d), r, r, name, index * 4); else Inst_Printf("lwz", "%s," LO_UN(%s+%d) "(%s)", r, name, index * 4, r); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_REG_X * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Reg_X(int offset, int adr_of, int index) { BEFORE_ARG; if (adr_of) Inst_Printf("addi", "%s,%s,%d", r, asm_reg_bank, index * 4); else Inst_Printf("lwz", "%s,%d(%s)", r, index * 4, asm_reg_bank); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_REG_Y * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Reg_Y(int offset, int adr_of, int index) { BEFORE_ARG; if (adr_of) Inst_Printf("addi", "%s,%s,%d", r, asm_reg_e, Y_OFFSET(index)); else Inst_Printf("lwz", "%s,%d(%s)", r, Y_OFFSET(index), asm_reg_e); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_FOREIGN_L * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Foreign_L(int offset, int adr_of, int index) { BEFORE_ARG; Inst_Printf("addis", "%s,0," HI_UN(foreign_long+%d), r, index * 4); if (adr_of) Inst_Printf("addi", "%s,%s," LO_UN(foreign_long+%d), r, r, index * 4); else Inst_Printf("lwz", "%s," LO_UN(foreign_long+%d) "(%s)", r, index * 4, r); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_FOREIGN_D * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Foreign_D(int offset, int adr_of, int index) { BEFORE_ARG; Inst_Printf("addis", "%s,0," HI_UN(foreign_double+%d), r, #if defined(M_powerpc_linux) || defined(M_powerpc_bsd) index * 4 #else index * 8 #endif ); if (adr_of) { Inst_Printf("addi", "%s,%s," LO_UN(foreign_double+%d), r, r, index * 8); if (offset >= MAX_ARGS_IN_REGS) Inst_Printf("stw", "%s,%d(" R(1) ")", r, offset * 4 + 24); return 1; } Inst_Printf("lfd", F(%d) "," LO_UN(foreign_double+%d) "(%s)", ++dbl_reg_no, index * 8, r); AFTER_ARG_DBL; return DBL_RET_WORDS; } /*-------------------------------------------------------------------------* * CALL_C_INVOKE * * * *-------------------------------------------------------------------------*/ void Call_C_Invoke(char *fct_name, int fc, int nb_args, int nb_args_in_words) { #if 0 /* only useful to call varargs functions - not the case here */ if (dbl_reg_no == 0) Inst_Printf("crxor", "6,6,6"); else Inst_Printf("creqv", "6,6,6"); #endif Inst_Printf("bl", UN "%s", fct_name); } /*-------------------------------------------------------------------------* * CALL_C_STOP * * * *-------------------------------------------------------------------------*/ void Call_C_Stop(char *fct_name, int nb_args, char **p_inline) { #ifndef MAP_REG_E if (p_inline && INL_ACCESS_INFO(p_inline)) reload_e = 1; #endif } /*-------------------------------------------------------------------------* * JUMP_RET * * * *-------------------------------------------------------------------------*/ void Jump_Ret(void) { Inst_Printf("mtctr", R(3)); Inst_Printf("bctr", ""); } /*-------------------------------------------------------------------------* * FAIL_RET * * * *-------------------------------------------------------------------------*/ void Fail_Ret(void) { Inst_Printf("cmpwi", CR(1) "," R(3) ",0"); Inst_Printf("bne", CR(1) ",.Lcont%d", w_label); Inst_Printf("b", UN "fail"); Label_Printf(".Lcont%d:", w_label++); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_MEM_L * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Mem_L(char *name, int index) { Inst_Printf("addis", R(4) ",0," HI_UN(%s+%d), name, index * 4); Inst_Printf("stw", R(3) "," LO_UN(%s+%d) "(" R(4) ")", name, index * 4); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_REG_X * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Reg_X(int index) { /* similar to Move_To_Reg_X */ Inst_Printf("stw", R(3) ",%d(%s)", index * 4, asm_reg_bank); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Reg_Y(int index) { /* similar to Move_To_Reg_Y */ Inst_Printf("stw", R(3) ",%d(%s)", Y_OFFSET(index), asm_reg_e); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_FOREIGN_L * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Foreign_L(int index) { Inst_Printf("addis", R(4) ",0," HI_UN(foreign_long+%d), index * 4); Inst_Printf("stw", R(3) "," LO_UN(foreign_long+%d) "(" R(4) ")", index * 4); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_FOREIGN_D * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Foreign_D(int index) { Inst_Printf("addis", R(4) ",0," HI_UN(foreign_double+%d), index * 8); Inst_Printf("stfd", F(1) "," LO_UN(foreign_double+%d) "(" R(4) ")", index * 8); } /*-------------------------------------------------------------------------* * CMP_RET_AND_INT * * * *-------------------------------------------------------------------------*/ void Cmp_Ret_And_Int(long int_val) { if (LITTLE_INT(int_val)) Inst_Printf("cmpwi", CR(1) "," R(3) ",%ld", int_val); else { Inst_Printf("lis", R(0) ",%#x", IHI(int_val)); Inst_Printf("ori", R(0) "," R(0) ",%#x", ILO(int_val)); Inst_Printf("cmpw", CR(1) "," R(3) "," R(0)); } } /*-------------------------------------------------------------------------* * JUMP_IF_EQUAL * * * *-------------------------------------------------------------------------*/ void Jump_If_Equal(char *label) { Inst_Printf("beq", CR(1) "," UN "%s", label); } /*-------------------------------------------------------------------------* * JUMP_IF_GREATER * * * *-------------------------------------------------------------------------*/ void Jump_If_Greater(char *label) { Inst_Printf("bgt", CR(1) "," UN "%s", label); } /*-------------------------------------------------------------------------* * C_RET * * * *-------------------------------------------------------------------------*/ void C_Ret(void) { Inst_Printf("lwz", R(0) ",%d(" R(1) ")", (MAX_C_ARGS_IN_C_CODE + 1) * 4); Inst_Printf("mtlr", R(0)); Inst_Printf("addi", R(1) "," R(1) ",%d", MAX_C_ARGS_IN_C_CODE * 4); Inst_Printf("blr", ""); } /*-------------------------------------------------------------------------* * DICO_STRING_START * * * *-------------------------------------------------------------------------*/ void Dico_String_Start(int nb_consts) { #if defined(M_powerpc_linux) || defined(M_powerpc_bsd) Label_Printf(".section\t.rodata"); #else Label_Printf(".cstring"); #endif } /*-------------------------------------------------------------------------* * DICO_STRING * * * *-------------------------------------------------------------------------*/ void Dico_String(int str_no, char *asciiz) { Label_Printf("%s%d:", STRING_PREFIX, str_no); #if defined(M_powerpc_linux) || defined(M_powerpc_bsd) Inst_Printf(".string", "%s", asciiz); #else Inst_Printf(".asciz", "%s", asciiz); #endif } /*-------------------------------------------------------------------------* * DICO_STRING_STOP * * * *-------------------------------------------------------------------------*/ void Dico_String_Stop(int nb_consts) { } /*-------------------------------------------------------------------------* * DICO_LONG_START * * * *-------------------------------------------------------------------------*/ void Dico_Long_Start(int nb_longs) { Label_Printf(".data"); Inst_Printf(".align", "4"); } /*-------------------------------------------------------------------------* * DICO_LONG * * * *-------------------------------------------------------------------------*/ void Dico_Long(char *name, int global, VType vtype, long value) { switch (vtype) { case NONE: value = 1; /* then in case ARRAY_SIZE */ case ARRAY_SIZE: #if defined(M_powerpc_linux) || defined(M_powerpc_bsd) if (!global) Inst_Printf(".local", UN "%s", name); Inst_Printf(".comm", UN "%s,%ld,4", name, value * 4); #else if (!global) Inst_Printf(".lcomm", UN "%s,%ld,4", name, value * 4); else Inst_Printf(".comm", UN "%s,%ld", name, value * 4); #endif break; case INITIAL_VALUE: if (global) Inst_Printf(".globl", UN "%s", name); Label_Printf(UN "%s:", name); Inst_Printf(".long", "%ld", value); break; } } /*-------------------------------------------------------------------------* * DICO_LONG_STOP * * * *-------------------------------------------------------------------------*/ void Dico_Long_Stop(int nb_longs) { } /*-------------------------------------------------------------------------* * DATA_START * * * *-------------------------------------------------------------------------*/ void Data_Start(char *initializer_fct) { if (initializer_fct == NULL) return; #ifdef M_powerpc_linux Inst_Printf(".section", ".ctors,\"aw\",@progbits"); Inst_Printf(".align", "2"); Inst_Printf(".long", UN "%s", initializer_fct); #else Label_Printf(".data"); Label_Printf(".mod_init_func"); Inst_Printf(".align", "2"); Inst_Printf(".long", UN "%s", initializer_fct); #endif } /*-------------------------------------------------------------------------* * DATA_STOP * * * *-------------------------------------------------------------------------*/ void Data_Stop(char *initializer_fct) { if (initializer_fct == NULL) return; #if 0 Label_Printf(".data"); Label_Printf(UN "obj_chain_stop:"); Inst_Printf(".long", UN "obj_chain_start"); #endif } ./gprolog-1.3.0/src/Ma2Asm/ix86_any.c0000644004425400513100000010451010547154142015455 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : ix86_any.c * * Descr.: translation file for Linux/Cygwin/mingw32/... on intel x86 * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: ix86_any.c,v 1.22 2007/01/04 10:35:14 diaz Exp $ */ #include #include #include /* For M_ix86_darwin: an important point is the C stack must be aligned * on 16 bytes. It is possible to use gcc option -mstackrealign but * it produces bigger and slower code (and uses %ecx as register). * If this is not done and if the called function performs a movdqa * an error will occur (generally Bus Error). * Just before calling a function %esp is 16bytes aligned, %esp = 0x...0 * (4 low bits = 0). The call instruction pushes the return address, so at * the entry of a function, %esp is 0x...c. Gcc then adjusts (via subl) * %esp to be 0x...0 before calling a function. We mimic the same modifying * Call_Compiled to force %esp to be 0x...0 when arriving in a Prolog code. * So a Prolog code can call C functions safely. * When a Prolog code finishes it returns into C inside Call_Prolog_Success * or Call_Prolog_Fail. In both functions we re-adjust the stack (gcc thinks * %esp = 0x...c while it is 0x...0): after the gcc adjustment code we * force %esp to be 0x...0. * For MA c_code (MA code called by a C function), we have to reserve enough * space in the stack to pass args to C functions. We receive %esp = 0x...c * In addition we have to push 2 registers (%ebp = PB_REG and %esi) * Thus 0x...c - 4 - 4 = 0x...4. We have to sub 4 to %esp and the space for * MAX_C_ARGS_IN_C_CODE*4 (this is OK if MAX_C_ARGS_IN_C_CODE is a multiple * of 4). So we have to reserve: 4 + MAX_C_ARGS_IN_C_CODE * 4. */ /*---------------------------------* * Constants * *---------------------------------*/ #define STRING_PREFIX ".LC" #define MAX_C_ARGS_IN_C_CODE 32 /* must be a multiple of 4 for darwin */ #define RESERVED_STACK_SPACE MAX_C_ARGS_IN_C_CODE * 4 + 4 #if defined(__CYGWIN__) || defined (_WIN32) || defined(M_ix86_darwin) #define UN "_" #else #define UN #endif /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ char asm_reg_e[16]; char asm_reg_b[16]; char asm_reg_cp[16]; int w_label = 0; char *fc_arg_regs[] = FC_SET_OF_REGISTERS; int stack_offset = 0; /* offset wrt esp to store the next argument in the stack */ int fc_reg_no = 0; /* index wrt fc_arg_reg to store the next arg in a FC reg */ int eax_used_as_fc_reg = 0; /* is eax already containing an arg (FC) ? */ /* variables for ma_parser.c / ma2asm.c */ #ifndef M_solaris char *comment_prefix = "#"; #else char *comment_prefix = "/"; #endif #ifdef M_ix86_darwin char *local_symb_prefix = "L"; #else char *local_symb_prefix = ".L"; #endif #ifdef M_ix86_darwin int strings_need_null = 1; #else int strings_need_null = 0; #endif int call_c_reverse_args = 0; char *inline_asm_data[] = { NULL }; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static char *Off_Reg_Bank(int offset); #ifdef M_ix86_darwin #define DARWIN_PB_REG "%ebp" /* PIC BASE (PB) customization */ int load_pb_reg = 0; int pb_label_no = 0; char pb_label[32]; int needs_pre_pass = 1; #include "../Wam2Ma/bt_string.h" BTString bt_stub; BTString bt_non_lazy; void Emit_Non_Lazy(int str_no, char *name); void Emit_Stub(int str_no, char *name); #endif /*-------------------------------------------------------------------------* * ASM_START * * * *-------------------------------------------------------------------------*/ void Asm_Start(void) { #ifdef NO_MACHINE_REG_FOR_REG_BANK #define ASM_REG_BANK UN "reg_bank" #elif defined(MAP_REG_BANK) #define ASM_REG_BANK "%" MAP_REG_BANK #else #define ASM_REG_BANK "%ebx" #endif #ifdef MAP_REG_E sprintf(asm_reg_e, "%%%s", MAP_REG_E); #else strcpy(asm_reg_e, "%edi"); #endif #ifdef MAP_REG_B sprintf(asm_reg_b, "%%%s", MAP_REG_B); #else strcpy(asm_reg_b, Off_Reg_Bank(MAP_OFFSET_B)); #endif #ifdef MAP_REG_CP sprintf(asm_reg_cp, "%%%s", MAP_REG_CP); #else strcpy(asm_reg_cp, Off_Reg_Bank(MAP_OFFSET_CP)); #endif Inst_Printf(".text", ""); Label("fail"); Pl_Fail(); #ifdef M_ix86_darwin BT_String_Init(&bt_stub); BT_String_Init(&bt_non_lazy); #endif } /*-------------------------------------------------------------------------* * OFF_REG_BANK * * * *-------------------------------------------------------------------------*/ static char * Off_Reg_Bank(int offset) { static char str[16]; #ifdef NO_MACHINE_REG_FOR_REG_BANK sprintf(str, ASM_REG_BANK "+%d", offset); #else sprintf(str, "%d(%s)", offset, ASM_REG_BANK); #endif return str; } /*-------------------------------------------------------------------------* * ASM_STOP * * * *-------------------------------------------------------------------------*/ void Asm_Stop(void) { #ifdef __ELF__ Inst_Printf(".section", ".note.GNU-stack,\"\",@progbits"); #endif #ifdef M_ix86_darwin if (bt_non_lazy.nb_elem) { Inst_Printf(".section __IMPORT,__pointers,non_lazy_symbol_pointers", ""); BT_String_List(&bt_non_lazy, Emit_Non_Lazy); } if (bt_stub.nb_elem) { Inst_Printf(".section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5", ""); BT_String_List(&bt_stub, Emit_Stub); } Inst_Printf(".subsections_via_symbols", ""); Inst_Printf(".section", "__TEXT,__textcoal_nt,coalesced,pure_instructions"); Label_Printf(".weak_definition\t___i686.get_pc_thunk.%s", DARWIN_PB_REG + 2); Label_Printf(".private_extern ___i686.get_pc_thunk.%s", DARWIN_PB_REG + 2); Label_Printf("___i686.get_pc_thunk.%s:", DARWIN_PB_REG + 2); Inst_Printf("movl", "(%%esp), %s", DARWIN_PB_REG); Inst_Printf("ret", ""); #endif } #ifdef M_ix86_darwin void Emit_Non_Lazy(int str_no, char *name) { Label_Printf("L_%s$non_lazy_ptr:", name); Label_Printf("\t.indirect_symbol _%s", name); Inst_Printf(".long", "0"); } void Emit_Stub(int str_no, char *name) { Label_Printf("L_%s$stub:", name); Label_Printf(".indirect_symbol _%s", name); Inst_Printf("hlt ; hlt ; hlt ; hlt ; hlt", ""); } void Load_PB_Reg(void) { if (!load_pb_reg) return; int i; Inst_Printf("call", "___i686.get_pc_thunk.%s", DARWIN_PB_REG + 2); i = sprintf(pb_label, "\"L%011d$pb\"", ++pb_label_no); Label_Printf("%s:", pb_label); sprintf(pb_label + i, "(%s)", DARWIN_PB_REG); load_pb_reg = 0; } #endif /*-------------------------------------------------------------------------* * CODE_START * * * *-------------------------------------------------------------------------*/ void Code_Start(char *label, int prolog, int global) { #ifdef M_solaris Inst_Printf(".align", "4"); #elif defined(M_ix86_darwin) #else Inst_Printf(".p2align", "4,,15"); #endif #if defined(M_ix86_linux) || defined(M_ix86_bsd) || defined(M_ix86_sco) Inst_Printf(".type", UN "%s,@function", label); #endif if (global) Label_Printf(".globl " UN "%s", label); Label(label); if (!prolog) { #ifdef M_ix86_darwin Inst_Printf("pushl", "%s", DARWIN_PB_REG); #endif Inst_Printf("pushl", "%%esi"); /* used as r_aux when %eax is a FC reg */ Inst_Printf("subl", "$%d,%%esp", RESERVED_STACK_SPACE); } } /*-------------------------------------------------------------------------* * CODE_STOP * * * *-------------------------------------------------------------------------*/ void Code_Stop(void) { } /*-------------------------------------------------------------------------* * LABEL * * * *-------------------------------------------------------------------------*/ void Label(char *label) { Label_Printf(""); #if 0 Inst_Printf(".align", "4"); #endif Label_Printf(UN "%s:", label); #ifdef M_ix86_darwin load_pb_reg = 1; #endif } /*-------------------------------------------------------------------------* * RELOAD_E_IN_REGISTER * * * *-------------------------------------------------------------------------*/ void Reload_E_In_Register(void) { #ifndef MAP_REG_E Inst_Printf("movl", "%s,%s", Off_Reg_Bank(MAP_OFFSET_E), asm_reg_e); #endif } /*-------------------------------------------------------------------------* * PL_JUMP * * * *-------------------------------------------------------------------------*/ void Pl_Jump(char *label) { #ifdef M_ix86_darwin if (!Is_Code_Defined(label)) { BT_String_Add(&bt_stub, strdup(label)); Inst_Printf("jmp", "L_%s$stub", label); } else #endif Inst_Printf("jmp", UN "%s", label); } /*-------------------------------------------------------------------------* * PREP_CP * * * *-------------------------------------------------------------------------*/ void Prep_CP(void) { #ifdef M_ix86_darwin Load_PB_Reg(); Inst_Printf("leal", "Lcont%d-%s,%%eax", w_label, pb_label); Inst_Printf("movl", "%%eax,%s", asm_reg_cp); #else Inst_Printf("movl", "$.Lcont%d,%s", w_label, asm_reg_cp); #endif } /*-------------------------------------------------------------------------* * HERE_CP * * * *-------------------------------------------------------------------------*/ void Here_CP(void) { Label_Printf("%scont%d:", local_symb_prefix, w_label++); #ifdef M_ix86_darwin load_pb_reg = 1; #endif } /*-------------------------------------------------------------------------* * PL_CALL * * * *-------------------------------------------------------------------------*/ void Pl_Call(char *label) { Prep_CP(); Pl_Jump(label); Here_CP(); } /*-------------------------------------------------------------------------* * PL_FAIL * * * *-------------------------------------------------------------------------*/ void Pl_Fail(void) { #ifdef MAP_REG_B Inst_Printf("jmp", "*-4(%s)", asm_reg_b); #else Inst_Printf("movl", "%s,%%eax", asm_reg_b); Inst_Printf("jmp", "*-4(%%eax)"); #endif } /*-------------------------------------------------------------------------* * PL_RET * * * *-------------------------------------------------------------------------*/ void Pl_Ret(void) { #ifndef MAP_REG_CP Inst_Printf("jmp", "*%s", asm_reg_cp); #else Inst_Printf("jmp", "%s", asm_reg_cp); #endif } /*-------------------------------------------------------------------------* * JUMP * * * *-------------------------------------------------------------------------*/ void Jump(char *label) { Inst_Printf("jmp", UN "%s", label); } /*-------------------------------------------------------------------------* * MOVE_FROM_REG_X * * * *-------------------------------------------------------------------------*/ void Move_From_Reg_X(int index) { Inst_Printf("movl", "%s,%%eax", Off_Reg_Bank(index * 4)); } /*-------------------------------------------------------------------------* * MOVE_FROM_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_From_Reg_Y(int index) { Inst_Printf("movl", "%d(%s),%%eax", Y_OFFSET(index), asm_reg_e); } /*-------------------------------------------------------------------------* * MOVE_TO_REG_X * * * *-------------------------------------------------------------------------*/ void Move_To_Reg_X(int index) { Inst_Printf("movl", "%%eax,%s", Off_Reg_Bank(index * 4)); } /*-------------------------------------------------------------------------* * MOVE_TO_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_To_Reg_Y(int index) { Inst_Printf("movl", "%%eax,%d(%s)", Y_OFFSET(index), asm_reg_e); } /*-------------------------------------------------------------------------* * CALL_C_START * * * *-------------------------------------------------------------------------*/ void Call_C_Start(char *fct_name, int fc, int nb_args, int nb_args_in_words, char **p_inline) { #ifndef FC_USED_TO_COMPILE_CORE if (p_inline == NULL) /* inlined code used a fast call */ fc = 0; #endif stack_offset = 0; if (fc) fc_reg_no = 0; else fc_reg_no = FC_MAX_ARGS_IN_REGS; /* so no more regs left to use */ eax_used_as_fc_reg = 0; } #define BEFORE_ARG \ { \ char r[10], *r_aux; \ int r_eq_r_aux = 0; \ \ if (fc_reg_no < FC_MAX_ARGS_IN_REGS) \ { \ strcpy(r, fc_arg_regs[fc_reg_no++]); \ if (strcmp("%eax", r) == 0) \ eax_used_as_fc_reg = 1; \ r_aux = r; \ r_eq_r_aux = 1; \ } \ else \ { \ sprintf(r, "%d(%%esp)", stack_offset * 4); \ stack_offset++; \ r_aux = (eax_used_as_fc_reg) ? "%esi" : "%eax"; \ } /* In GCC 3, the 3 first args are passed via registers if they are * ints (recall: 1 double = 2 ints). So if the 2 first args are * double (4 ints) nothing is passed in registers. * In GCC 4, the 3 first int args are passed in register whatever * the previous arg types. */ #if __GNUC__ >= 4 || defined(_MSC_VER) #define SKIP_FC_REG #else #define SKIP_FC_REG fc_reg_no++ #endif #define BEFORE_HALF_ARG_DOUBLE \ { \ char r[10], *r_aux; \ \ if (fc_reg_no < FC_MAX_ARGS_IN_REGS) \ SKIP_FC_REG; \ sprintf(r, "%d(%%esp)", stack_offset * 4); \ stack_offset++; \ r_aux = (eax_used_as_fc_reg) ? "%esi" : "%eax"; #define AFTER_ARG \ } /*-------------------------------------------------------------------------* * CALL_C_ARG_INT * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Int(int offset, long int_val) { BEFORE_ARG; Inst_Printf("movl", "$%ld,%s", int_val, r); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_DOUBLE * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Double(int offset, double dbl_val) { int *p = (int *) &dbl_val; BEFORE_HALF_ARG_DOUBLE; Inst_Printf("movl", "$%d,%s", p[0], r); AFTER_ARG; offset++; BEFORE_HALF_ARG_DOUBLE; Inst_Printf("movl", "$%d,%s", p[1], r); AFTER_ARG; return 2; } /*-------------------------------------------------------------------------* * CALL_C_ARG_STRING * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_String(int offset, int str_no) { BEFORE_ARG; #ifdef M_ix86_darwin Load_PB_Reg(); Inst_Printf("leal", "%s%d-%s,%s", STRING_PREFIX, str_no, pb_label, r_aux); if (!r_eq_r_aux) Inst_Printf("movl", "%s,%s", r_aux, r); #else Inst_Printf("movl", "$%s%d,%s", STRING_PREFIX, str_no, r); #endif AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_MEM_L * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Mem_L(int offset, int adr_of, char *name, int index) { #ifdef M_ix86_darwin int global, value; VType vtype; int is_a_long; #endif BEFORE_ARG; #ifdef M_ix86_darwin Load_PB_Reg(); is_a_long = Get_Long_Infos(name, &global, &vtype, &value); if ((is_a_long && global && vtype != INITIAL_VALUE) || (!is_a_long && !Is_Code_Defined(name))) /* external code */ { BT_String_Add(&bt_non_lazy, name); /* strdup done by parser */ Inst_Printf("movl", "L_%s$non_lazy_ptr-%s,%s", name, pb_label, r_aux); if (adr_of) { if (index > 0) Inst_Printf("addl", "$%d,%s", index * 4, r_aux); } else Inst_Printf("movl", "%d(%s),%s", index * 4, r_aux, r_aux); } else { if (adr_of) Inst_Printf("leal", "%d+_%s-%s,%s", index * 4, name, pb_label, r_aux); else Inst_Printf("movl", "%d+_%s-%s,%s", index * 4, name, pb_label, r_aux); } if (!r_eq_r_aux) Inst_Printf("movl", "%s,%s", r_aux, r); #else /* !M_ix86_darwin */ if (adr_of) Inst_Printf("movl", "$" UN "%s+%d,%s", name, index * 4, r); else { Inst_Printf("movl", UN "%s+%d,%s", name, index * 4, r_aux); if (!r_eq_r_aux) Inst_Printf("movl", "%s,%s", r_aux, r); } #endif AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_REG_X * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Reg_X(int offset, int adr_of, int index) { BEFORE_ARG; if (adr_of) { if (!r_eq_r_aux && index == 0) { #ifdef NO_MACHINE_REG_FOR_REG_BANK Inst_Printf("movl", "$%s,%s", ASM_REG_BANK, r); #else Inst_Printf("movl", "%s,%s", ASM_REG_BANK, r); #endif goto finish; } Inst_Printf("leal", "%s,%s", Off_Reg_Bank(index * 4), r_aux); } else Inst_Printf("movl", "%s,%s", Off_Reg_Bank(index * 4), r_aux); if (!r_eq_r_aux) Inst_Printf("movl", "%s,%s", r_aux, r); finish: ; /* gcc3 does not like use of label at end of compound statement */ AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_REG_Y * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Reg_Y(int offset, int adr_of, int index) { BEFORE_ARG; if (adr_of) Inst_Printf("leal", "%d(%s),%s", Y_OFFSET(index), asm_reg_e, r_aux); else Inst_Printf("movl", "%d(%s),%s", Y_OFFSET(index), asm_reg_e, r_aux); if (!r_eq_r_aux) Inst_Printf("movl", "%s,%s", r_aux, r); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_FOREIGN_L * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Foreign_L(int offset, int adr_of, int index) { return Call_C_Arg_Mem_L(offset, adr_of, "foreign_long", index); } /*-------------------------------------------------------------------------* * CALL_C_ARG_FOREIGN_D * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Foreign_D(int offset, int adr_of, int index) { if (adr_of) return Call_C_Arg_Mem_L(offset, adr_of, "foreign_double", index * 2); BEFORE_HALF_ARG_DOUBLE; #ifdef M_ix86_darwin Load_PB_Reg(); Inst_Printf("movl", "L_foreign_double$non_lazy_ptr-%s,%s", pb_label, r_aux); Inst_Printf("movsd", "%d(%s),%%xmm0", index * 8, r_aux); Inst_Printf("movsd", "%%xmm0,%s", r); stack_offset++; #else /* !M_ix86_darwin */ Inst_Printf("movl", UN "foreign_double+%d,%s", index * 8, r_aux); Inst_Printf("movl", "%s,%s", r_aux, r); AFTER_ARG; offset++; BEFORE_HALF_ARG_DOUBLE; Inst_Printf("movl", UN "foreign_double+%d,%%eax", index * 8 + 4); Inst_Printf("movl", "%%eax,%s", r); #endif AFTER_ARG; return 2; } /*-------------------------------------------------------------------------* * CALL_C_INVOKE * * * *-------------------------------------------------------------------------*/ void Call_C_Invoke(char *fct_name, int fc, int nb_args, int nb_args_in_words) { #if defined(_MSC_VER) && FC_MAX_ARGS_IN_REGS > 0 if (fc) { /* under MSVC: __fastcall implies decorated names @fct_name@nb_args_in_word * It also implies the callee pops the args then we have to readjust the stack. * I suppose this removes the benefit of passing args in stack: * by default it is switched off (see file arch_dep.h) */ Inst_Printf("call", "@%s@%d", fct_name, nb_args_in_words * sizeof(int)); if (stack_offset > 0) Inst_Printf("subl", "$%d,%%esp", stack_offset * 4); return; } #endif Inst_Printf("call", UN "%s", fct_name); } /*-------------------------------------------------------------------------* * CALL_C_STOP * * * *-------------------------------------------------------------------------*/ void Call_C_Stop(char *fct_name, int nb_args, char **p_inline) { #ifndef MAP_REG_E if (p_inline && INL_ACCESS_INFO(p_inline)) reload_e = 1; #endif } /*-------------------------------------------------------------------------* * JUMP_RET * * * *-------------------------------------------------------------------------*/ void Jump_Ret(void) { Inst_Printf("jmp", "*%%eax"); } /*-------------------------------------------------------------------------* * FAIL_RET * * * *-------------------------------------------------------------------------*/ void Fail_Ret(void) { Inst_Printf("testl", "%%eax,%%eax"); Inst_Printf("je", UN "fail"); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_MEM_L * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Mem_L(char *name, int index) { Inst_Printf("movl", "%%eax," UN "%s+%d", name, index * 4); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_REG_X * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Reg_X(int index) { /* same as Move_To_Reg_X */ Inst_Printf("movl", "%%eax,%s", Off_Reg_Bank(index * 4)); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Reg_Y(int index) { /* same as Move_To_Reg_Y */ Inst_Printf("movl", "%%eax,%d(%s)", Y_OFFSET(index), asm_reg_e); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_FOREIGN_L * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Foreign_L(int index) { Inst_Printf("movl", "%%eax," UN "foreign_long+%d", index * 4); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_FOREIGN_D * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Foreign_D(int index) { Inst_Printf("fstpl", UN "foreign_double+%d", index * 8); } /*-------------------------------------------------------------------------* * CMP_RET_AND_INT * * * *-------------------------------------------------------------------------*/ void Cmp_Ret_And_Int(long int_val) { if (int_val == 0) Inst_Printf("testl", "%%eax,%%eax"); else Inst_Printf("cmpl", "$%ld,%%eax", int_val); } /*-------------------------------------------------------------------------* * JUMP_IF_EQUAL * * * *-------------------------------------------------------------------------*/ void Jump_If_Equal(char *label) { Inst_Printf("je", UN "%s", label); } /*-------------------------------------------------------------------------* * JUMP_IF_GREATER * * * *-------------------------------------------------------------------------*/ void Jump_If_Greater(char *label) { Inst_Printf("jg", UN "%s", label); } /*-------------------------------------------------------------------------* * C_RET * * * *-------------------------------------------------------------------------*/ void C_Ret(void) { Inst_Printf("addl", "$%d,%%esp", RESERVED_STACK_SPACE); Inst_Printf("popl", "%%esi"); #ifdef M_ix86_darwin Inst_Printf("popl", "%s", DARWIN_PB_REG); #endif Inst_Printf("ret", ""); } /*-------------------------------------------------------------------------* * DICO_STRING_START * * * *-------------------------------------------------------------------------*/ void Dico_String_Start(int nb_consts) { #if defined( __CYGWIN__) || defined (_WIN32) Inst_Printf(".section", ".rdata,\"dr\""); #elif defined(M_solaris) Inst_Printf(".section", ".rodata"); #elif defined(M_ix86_darwin) Inst_Printf(".cstring", ""); #else Inst_Printf(".section", ".rodata.str1.1,\"aMS\",@progbits,1"); #endif } /*-------------------------------------------------------------------------* * DICO_STRING * * * *-------------------------------------------------------------------------*/ void Dico_String(int str_no, char *asciiz) { Label_Printf("%s%d:", STRING_PREFIX, str_no); #ifdef M_ix86_darwin Inst_Printf(".ascii", "%s", asciiz); #else Inst_Printf(".string", "%s", asciiz); #endif } /*-------------------------------------------------------------------------* * DICO_STRING_STOP * * * *-------------------------------------------------------------------------*/ void Dico_String_Stop(int nb_consts) { } /*-------------------------------------------------------------------------* * DICO_LONG_START * * * *-------------------------------------------------------------------------*/ void Dico_Long_Start(int nb_longs) { Inst_Printf(".data", ""); #ifdef M_ix86_darwin Inst_Printf(".align", "2"); #else Inst_Printf(".align", "4"); #endif } /*-------------------------------------------------------------------------* * DICO_LONG * * * *-------------------------------------------------------------------------*/ void Dico_Long(char *name, int global, VType vtype, long value) { switch (vtype) { case NONE: value = 1; /* then in case ARRAY_SIZE */ case ARRAY_SIZE: #if defined(M_ix86_linux) || defined(M_ix86_sco) || \ defined(M_ix86_solaris) || defined(M_ix86_bsd) if (!global) Inst_Printf(".local", UN "%s", name); Inst_Printf(".comm", UN "%s,%ld,4", name, value * 4); #else if (!global) #ifdef M_ix86_darwin Inst_Printf(".lcomm", UN "%s,%ld,2", name, value * 4); #else Inst_Printf(".lcomm", UN "%s,%ld", name, value * 4); #endif else Inst_Printf(".comm", UN "%s,%ld", name, value * 4); #endif break; case INITIAL_VALUE: if (global) Label_Printf(".globl " UN "%s", name); #ifdef M_ix86_darwin Inst_Printf(".align", "2"); #else Inst_Printf(".align", "4"); Inst_Printf(".type", UN "%s,@object", name); Inst_Printf(".size", UN "%s,4", name); #endif Label_Printf(UN "%s:", name); Inst_Printf(".long", "%ld", value); break; } } /*-------------------------------------------------------------------------* * DICO_LONG_STOP * * * *-------------------------------------------------------------------------*/ void Dico_Long_Stop(int nb_longs) { } /*-------------------------------------------------------------------------* * DATA_START * * * *-------------------------------------------------------------------------*/ void Data_Start(char *initializer_fct) { if (initializer_fct == NULL) return; #if defined(M_ix86_darwin) Inst_Printf(".mod_init_func", ""); Inst_Printf(".align", "2"); Inst_Printf(".long", UN "%s", initializer_fct); #else #ifdef _MSC_VER Inst_Printf(".section", ".GPLC$m"); #elif defined( __CYGWIN__) || defined (_WIN32) Inst_Printf(".section", ".ctors,\"aw\""); #else Inst_Printf(".section", ".ctors,\"aw\",@progbits"); #endif Inst_Printf(".align", "4"); Inst_Printf(".long", UN "%s", initializer_fct); #endif /* M_ix86_darwin */ } /*-------------------------------------------------------------------------* * DATA_STOP * * * *-------------------------------------------------------------------------*/ void Data_Stop(char *initializer_fct) { } ./gprolog-1.3.0/src/Ma2Asm/alpha_any.c0000644004425400513100000015532110547154142015752 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : alpha_any.c * * Descr.: translation file for Linux/OSF on alpha * * Author: Alexander Diemand, Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: alpha_any.c,v 1.14 2007/01/04 10:35:14 diaz Exp $ */ #include #include #include #include /*---------------------------------* * Constants * *---------------------------------*/ #define STRING_PREFIX "$LC" #define MAX_C_ARGS_IN_C_CODE 32 /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ char asm_reg_bank[10]; char asm_reg_e[10]; char asm_reg_b[10]; char asm_reg_cp[10]; int w_label = 0; char dbl_arg_buffer[8192] = "\0"; /* a temp buffer for the double arguments */ char act_routine[512] = "\0"; /* remembers the actual routine we are building */ int inPrologCode = 0; /* whether we are currently compiling a prolog code */ /* variables for ma_parser.c / ma2asm.c */ char *comment_prefix = "#"; char *local_symb_prefix = "$"; int strings_need_null = 1; int call_c_reverse_args = 0; char *inline_asm_data[] = { NULL }; /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * INLINED CODE * * * *-------------------------------------------------------------------------*/ /* all %s will be replaced with the function's name * all %d will be replaced with the current nb_inlines */ static long nb_inlines = 0; static char *def_inlines[] = { /* name code */ "Put_X_Variable", " # %s inlined\n\ s8addq $10,0,$0 # Make_Self_Ref(H) \n\ or $0,1,$0 \n\ stq $0,0($10) # Global_Push \n\ addq $10,8,$10 \n", "Put_Y_Variable", " # %s inlined\n\ s8addq $16,0,$0 # Make_Self_Ref(y_adr) \n\ or $0,1,$0 \n\ stq $0,0($16) # save in *y_adr \n", "Put_Atom", " # %s inlined\n\ s8addq $16,0,$0 # Tag_ATM(n) \n\ or $0,3,$0 \n", "Put_Integer", " # %s inlined\n\ s8addq $16,0,$0 # Tag_INT(n) \n", "Put_Float", " # %s inlined\n\ s8addq $10,8,$0 # res_word = Tag_FLT(H) \n\ stt $f16,0($10) # Global_Push_Float(n) \n\ or $0,4,$0 \n\ addq $10,8,$10 \n", "Put_Nil", " # %s inlined\n\ lda $0,14131 \n", "Put_List", " # %s inlined\n\ s8addq $10,0,$0 # Tag_LST(H) \n\ stq $31,2056($9) # S = 0 (WriteMode) \n\ or $0,5,$0 \n", "Put_Structure", " # %s inlined\n\ sll $17,0x10,$17 \n\ addl $17,$16,$17 \n\ s8addq $10,0,$0 \n\ or $0,0x6,$0 \n\ stq $17,0($10) \n\ addq $10,0x8,$10 \n\ stq $31,2056($9) \n", "Load_Cut_Level", " # %s inlined\n\ s8addq $11,0,$1 \n\ stq $1,0($16) \n", "Cut", " # %s inlined\n\ srl $16,3,$11 \n", "Switch_On_Integer", " # %s inlined\n\ ldq $0,0($9) \n\ srl $0,3,$0 \n", "Switch_On_Term", " # %s inlined\n\ ldq $1,0($9) # deref(A(0),word,tag,adr) \n\ mov $1,$2 # word = A(0) \n\ clr $5 # working_adr \n\ %s_1_%d: \n\ and $2,7,$3 # Tag_Of \n\ cmpeq $3,1,$4 # REF? \n\ beq $4,%s_2_%d # no -> break \n\ srl $2,3,$6 # UnTag_REF(word) \n\ cmpeq $5,$6,$4 # working_adr == adr \n\ bne $4,%s_2_%d # yes -> break \n\ ldq $2,0($6) \n\ mov $6,$5 \n\ br %s_1_%d \n\ \n\ %s_2_%d: \n\ stq $2,0($9) # A(0) = word \n\ cmoveq $3,$18,$0 # move c_int to return if tag == (INT = 0)\n\ beq $3,%s_3_%d \n\ subq $3,3,$4 \n\ cmoveq $4,$17,$0 # move c_atm to return if tag == (ATM = 3)\n\ beq $4,%s_3_%d \n\ subq $3,5,$4 \n\ cmoveq $4,$19,$0 # move c_lst to return if tag == (LST = 5)\n\ beq $4,%s_3_%d \n\ subq $3,6,$4 \n\ cmoveq $4,$20,$0 # move c_stc to return if tag == (STC = 6)\n\ beq $4,%s_3_%d \n\ mov $16,$0 # for all the rest \n\ \n\ %s_3_%d: \n\ bne $0,%s_4_%d \n\ ldq $0,-8($11) # return ALTB(B) \n\ %s_4_%d: \n", /* 00000001200d2c40 : 1200d2c40: 11 00 bb 27 ldah gp,17(t12) 1200d2c44: 10 2f bd 23 lda gp,12048(gp) 1200d2c48: 00 00 29 a4 ldq t0,0(s0) 1200d2c4c: 19 30 20 42 addl a1,0x1,t11 1200d2c50: 22 97 20 4b sll t11,0x4,t1 1200d2c54: 81 76 20 48 srl t0,0x3,t0 1200d2c58: 04 04 02 42 addq a0,t1,t3 1200d2c5c: 00 00 61 a4 ldq t2,0(t0) 1200d2c60: 18 04 63 44 mov t2,t10 1200d2c64: 28 b9 7d a7 ldq t12,-18136(gp) 1200d2c68: 9e 6b fb 6a jsr t9,(t12),1200cdae4 1200d2c6c: 11 00 b7 27 ldah gp,17(t9) 1200d2c70: e4 2e bd 23 lda gp,12004(gp) 1200d2c74: 1b 00 7f 43 addl t12,zero,t12 1200d2c78: 3b 97 60 4b sll t12,0x4,t12 1200d2c7c: 02 04 1b 42 addq a0,t12,t1 1200d2c80: 08 00 02 a4 ldq v0,8(t1) 1200d2c84: 0a 00 00 e4 beq v0,1200d2cb0 1200d2c88: 1f 04 ff 47 nop 1200d2c8c: 00 00 e0 2f unop 1200d2c90: 00 00 22 a4 ldq t0,0(t1) 1200d2c94: a1 05 23 40 cmpeq t0,t2,t0 1200d2c98: 05 00 20 f4 bne t0,1200d2cb0 1200d2c9c: 02 14 42 40 addq t1,0x10,t1 1200d2ca0: a1 05 44 40 cmpeq t1,t3,t0 1200d2ca4: c2 04 30 44 cmovne t0,a0,t1 1200d2ca8: 08 00 02 a4 ldq v0,8(t1) 1200d2cac: f8 ff 1f f4 bne v0,1200d2c90 1200d2cb0: 01 00 00 f4 bne v0,1200d2cb8 1200d2cb4: f8 ff 0b a4 ldq v0,-8(s2) 1200d2cb8: 01 80 fa 6b ret zero,(ra),0x1 1200d2cbc: 00 00 e0 2f unop */ /* 00000001200d2ba0 : 1200d2ba0: 11 00 bb 27 ldah gp,17(t12) 1200d2ba4: b0 2f bd 23 lda gp,12208(gp) 1200d2ba8: 00 00 29 a4 ldq t0,0(s0) 1200d2bac: 19 30 20 42 addl a1,0x1,t11 1200d2bb0: 22 97 20 4b sll t11,0x4,t1 1200d2bb4: 81 76 20 48 srl t0,0x3,t0 1200d2bb8: 04 04 02 42 addq a0,t1,t3 1200d2bbc: 23 f6 21 48 zapnot t0,0xf,t2 1200d2bc0: 18 04 63 44 mov t2,t10 1200d2bc4: 28 b9 7d a7 ldq t12,-18136(gp) 1200d2bc8: c6 6b fb 6a jsr t9,(t12),1200cdae4 1200d2bcc: 11 00 b7 27 ldah gp,17(t9) 1200d2bd0: 84 2f bd 23 lda gp,12164(gp) 1200d2bd4: 1b 00 7f 43 addl t12,zero,t12 1200d2bd8: 3b 97 60 4b sll t12,0x4,t12 1200d2bdc: 02 04 1b 42 addq a0,t12,t1 1200d2be0: 08 00 02 a4 ldq v0,8(t1) 1200d2be4: 0a 00 00 e4 beq v0,1200d2c10 1200d2be8: 1f 04 ff 47 nop 1200d2bec: 00 00 e0 2f unop 1200d2bf0: 00 00 22 a4 ldq t0,0(t1) 1200d2bf4: a1 05 23 40 cmpeq t0,t2,t0 1200d2bf8: 05 00 20 f4 bne t0,1200d2c10 1200d2bfc: 02 14 42 40 addq t1,0x10,t1 1200d2c00: a1 05 44 40 cmpeq t1,t3,t0 1200d2c04: c2 04 30 44 cmovne t0,a0,t1 1200d2c08: 08 00 02 a4 ldq v0,8(t1) 1200d2c0c: f8 ff 1f f4 bne v0,1200d2bf0 1200d2c10: 01 00 00 f4 bne v0,1200d2c18 1200d2c14: f8 ff 0b a4 ldq v0,-8(s2) 1200d2c18: 01 80 fa 6b ret zero,(ra),0x1 1200d2c1c: 00 00 e0 2f unop */ "Unify_Variable", " # %s inlined\n\ ldq $0,2056($9) # S == 0 (WriteMode)? \n\ mov $0,$1 \n\ beq $0,%s_1_%d \n\ \n\ # NOT WRITE_MODE \n\ ldq $0,0($1) # word = *S \n\ and $0,7,$2 # tag = Tag_Of(word= *S) \n\ addq $1,8,$1 \n\ stq $1,2056($9) # S++ \n\ \n\ # Make_Copy_Of_Word(tag=$2,word=$0) \n\ cmpeq $2,2,$2 # Dont_Separate_Tag(tag) \n\ beq $2,%s_99_%d # false \n\ \n\ andnot $0,7,$1 # adr=UnTag_Ref(word) \n\ or $1,1,$0 # word=Tag_REF(adr) \n\ \n\ br %s_99_%d \n\ \n\ # WRITE_MODE \n\ %s_1_%d: \n\ s8addq $10,0,$0 # word = Make_Self_Ref(H) \n\ or $0,1,$0 \n\ stq $0,0($10) # Global_Push(word) \n\ addq $10,8,$10 \n\ \n\ %s_99_%d: \n\ # continue \n", "Unify_Void", " # %s inlined\n\ ldq $0,2056($9) # S == 0 (WriteMode)? \n\ mov $0,$1 \n\ beq $0,%s_1_%d \n\ \n\ # NOT WRITE_MODE \n\ s8addq $16,$1,$1 \n\ stq $1,2056($9) # S = S + n \n\ br %s_99_%d \n\ \n\ # WRITE_MODE \n\ %s_1_%d: \n\ s8addq $16,$10,$16 # end_adr = H+n \n\ cmpult $10,$16,$1 \n\ beq $1,%s_99_%d # H < end_adr \n\ %s_2_%d: \n\ s8addq $10,0,$1 \n\ or $1,1,$1 \n\ stq $1,0($10) # ++H \n\ addq $10,8,$10 \n\ cmpult $10,$16,$1 \n\ bne $1,%s_2_%d # H < end_adr \n\ \n\ %s_99_%d: \n\ # continue \n", "Create_Choice_Point", " # %s inlined\n\ cmpule $11,$14,$2 # Local_Top \n\ mov $14,$3 \n\ cmoveq $2,$11,$3 \n\ mov $11,$4 # adr = B \n\ s8addq $17,64,$1 # +CHOICE_STATIC_SIZE+arity \n\ addq $3,$1,$11 # -> B \n\ \n\ stq $16,-8($11) # ALTB(B) = codep_alt \n\ stq $13,-16($11)# CPB(B) = CP \n\ cmpeq $31,$17,$3 # arity == 0? \n\ ldq $1,2072($9) # BCI \n\ stq $1,-24($11) # BCIB(B) = BCI \n\ stq $14,-32($11)# EB(B) = E \n\ stq $4,-40($11) # BB(B) = adr \n\ stq $10,-48($11)# HB(B) = H \n\ stq $12,-56($11)# TRB(B) = TR \n\ clr $2 \n\ ldq $1,2048($9) # CS \n\ lda $4,-9 \n\ stq $1,-64($11) # CSB(B) = CS \n\ bne $3,%s_2_%d # skip \n\ \n\ %s_1_%d: \n\ s8addq $2,$9,$1 \n\ subl $4,$2,$6 \n\ ldq $5,0($1) # A(i) \n\ s8addq $6,$11,$0 \n\ addq $2,1,$2 # i++ \n\ stq $5,0($0) \n\ cmplt $2,$17,$3 # i: 1200d2dc0: 11 00 bb 27 ldah gp,17(t12) 1200d2dc4: 90 2d bd 23 lda gp,11664(gp) 1200d2dc8: 3e 15 c2 43 subq sp,0x10,sp 1200d2dcc: 08 00 fe b5 stq fp,8(sp) 1200d2dd0: 00 00 5e b7 stq ra,0(sp) 1200d2dd4: 0f 04 31 46 mov a1,fp 1200d2dd8: f8 ff 0b b6 stq a0,-8(s2) 1200d2ddc: c8 ff 0b a6 ldq a0,-56(s2) 1200d2de0: 60 b9 7d a7 ldq t12,-18080(gp) 1200d2de4: 46 40 5b 6b jsr ra,(t12),1200d2f00 1200d2de8: 11 00 ba 27 ldah gp,17(ra) 1200d2dec: 68 2d bd 23 lda gp,11624(gp) 1200d2df0: 04 04 ff 47 clr t3 1200d2df4: e8 ff 4b 8d ldt $f10,-24(s2) 1200d2df8: a1 09 ef 43 cmplt zero,fp,t0 1200d2dfc: f0 ff ab a5 ldq s4,-16(s2) 1200d2e00: 18 08 49 9d stt $f10,2072(s0) 1200d2e04: c0 ff 6b 8d ldt $f11,-64(s2) 1200d2e08: e0 ff cb a5 ldq s5,-32(s2) 1200d2e0c: d0 ff 4b a5 ldq s1,-48(s2) 1200d2e10: 00 08 69 9d stt $f11,2048(s0) 1200d2e14: 0a 00 20 e4 beq t0,1200d2e40 1200d2e18: f7 ff bf 20 lda t4,-9(zero) 1200d2e1c: 00 00 e0 2f unop 1200d2e20: 21 01 a4 40 subl t4,t3,t0 1200d2e24: 41 06 2b 40 s8addq t0,s2,t0 1200d2e28: 43 06 89 40 s8addq t3,s0,t2 1200d2e2c: 00 00 41 8d ldt $f10,0(t0) 1200d2e30: 04 30 80 40 addl t3,0x1,t3 1200d2e34: a2 09 8f 40 cmplt t3,fp,t1 1200d2e38: 00 00 43 9d stt $f10,0(t2) 1200d2e3c: f8 ff 5f f4 bne t1,1200d2e20 1200d2e40: 00 00 5e a7 ldq ra,0(sp) 1200d2e44: 08 00 fe a5 ldq fp,8(sp) 1200d2e48: 1e 14 c2 43 addq sp,0x10,sp 1200d2e4c: 01 80 fa 6b ret zero,(ra),0x1 1200d2e50: 1f 04 ff 47 nop */ /* 00000001200d2e60 : 1200d2e60: 11 00 bb 27 ldah gp,17(t12) 1200d2e64: f0 2c bd 23 lda gp,11504(gp) 1200d2e68: 3e 15 c2 43 subq sp,0x10,sp 1200d2e6c: 08 00 fe b5 stq fp,8(sp) 1200d2e70: 00 00 5e b7 stq ra,0(sp) 1200d2e74: 0f 04 10 46 mov a0,fp 1200d2e78: c8 ff 0b a6 ldq a0,-56(s2) 1200d2e7c: 60 b9 7d a7 ldq t12,-18080(gp) 1200d2e80: 1f 40 5b 6b jsr ra,(t12),1200d2f00 1200d2e84: 11 00 ba 27 ldah gp,17(ra) 1200d2e88: cc 2c bd 23 lda gp,11468(gp) 1200d2e8c: 04 04 ff 47 clr t3 1200d2e90: c0 ff 4b 8d ldt $f10,-64(s2) 1200d2e94: a1 09 ef 43 cmplt zero,fp,t0 1200d2e98: f0 ff ab a5 ldq s4,-16(s2) 1200d2e9c: e0 ff cb a5 ldq s5,-32(s2) 1200d2ea0: d0 ff 4b a5 ldq s1,-48(s2) 1200d2ea4: 00 08 49 9d stt $f10,2048(s0) 1200d2ea8: e8 ff 6b 8d ldt $f11,-24(s2) 1200d2eac: 18 08 69 9d stt $f11,2072(s0) 1200d2eb0: 0b 00 20 e4 beq t0,1200d2ee0 1200d2eb4: f7 ff bf 20 lda t4,-9(zero) 1200d2eb8: 1f 04 ff 47 nop 1200d2ebc: 00 00 e0 2f unop 1200d2ec0: 21 01 a4 40 subl t4,t3,t0 1200d2ec4: 41 06 2b 40 s8addq t0,s2,t0 1200d2ec8: 43 06 89 40 s8addq t3,s0,t2 1200d2ecc: 00 00 41 8d ldt $f10,0(t0) 1200d2ed0: 04 30 80 40 addl t3,0x1,t3 1200d2ed4: a2 09 8f 40 cmplt t3,fp,t1 1200d2ed8: 00 00 43 9d stt $f10,0(t2) 1200d2edc: f8 ff 5f f4 bne t1,1200d2ec0 1200d2ee0: 10 08 29 a4 ldq t0,2064(s0) 1200d2ee4: d8 ff 6b a5 ldq s2,-40(s2) 1200d2ee8: 21 35 20 40 subq t0,0x1,t0 1200d2eec: 10 08 29 b4 stq t0,2064(s0) 1200d2ef0: 00 00 5e a7 ldq ra,0(sp) 1200d2ef4: 08 00 fe a5 ldq fp,8(sp) 1200d2ef8: 1e 14 c2 43 addq sp,0x10,sp 1200d2efc: 01 80 fa 6b ret zero,(ra),0x1 */ "Allocate", " # %s inlined\n\ cmpule $11,$14,$1 # Local_Top \n\ mov $14,$2 \n\ cmoveq $1,$11,$2 \n\ mov $14,$3 # adr = E \n\ ldq $4,2072($9) # BCIE(E) = BCI \n\ s8addq $16,24,$16 # +ENVIR_STATIC_SIZE+3 \n\ addq $2,$16,$14 # -> E \n\ \n\ stq $13,-8($14) # CPE(E) = CP \n\ #ldq $4,2072($9) # BCIE(E) = BCI \n\ stq $3,-24($14) # EE(E) = adr \n\ stq $4,-16($14) \n", "Deallocate", " # %s inlined\n\ ldq $13,-8($14) # CP=CPE(E) \n\ ldq $1,-16($14) # BCIE(E) \n\ stq $1,2072($9) # BCI=BCIE(E)($1) \n\ ldq $14,-24($14) # E=EE(E) \n", 0, 0 /* end of list */ }; /*-------------------------------------------------------------------------* * MAKE_INLINE * * * *-------------------------------------------------------------------------*/ /* when it finds a function to inline it will do so immediatly and return 1 * else it fails and returns 0 */ static int make_inline(char *fct_name, int nb_args) { char *fp; int counter; /* user can set an environment variable to control this */ if (!getenv("GPROLOG_ASM_INLINE")) return 0; counter = 0; while (def_inlines[counter]) { if (strcmp(fct_name, def_inlines[counter]) == 0) { /* found code to inline, emit */ fp = def_inlines[++counter]; while (*fp != '\0') { if (*fp == '%' && *(fp + 1) == 's') { String_Out(fct_name); fp++; } else if (*fp == '%' && *(fp + 1) == 'd') { Int_Out(nb_inlines); fp++; } else { Char_Out(*fp); } fp++; } nb_inlines++; return 1; } counter++; } return 0; } /*-------------------------------------------------------------------------* * ASM_START * * * *-------------------------------------------------------------------------*/ void Asm_Start(void) { #ifdef MAP_REG_BANK sprintf(asm_reg_bank, "%s", MAP_REG_BANK); #else strcpy(asm_reg_bank, "$9"); #endif Inst_Printf("# asm_reg_bank ", asm_reg_bank); #ifdef MAP_REG_E sprintf(asm_reg_e, "%s", MAP_REG_E); #else sprintf(asm_reg_e, "%d(%s)", MAP_OFFSET_E, asm_reg_bank); #endif Inst_Printf("# REG_E ", asm_reg_e); #ifdef MAP_REG_B sprintf(asm_reg_b, "%s", MAP_REG_B); #else sprintf(asm_reg_b, "%d(%s)", MAP_OFFSET_B, asm_reg_bank); #endif Inst_Printf("# REG_B ", asm_reg_b); #ifdef MAP_REG_CP sprintf(asm_reg_cp, "%s", MAP_REG_CP); #else sprintf(asm_reg_cp, "%d(%s)", MAP_OFFSET_CP, asm_reg_bank); #endif Inst_Printf("# REG_CP ", asm_reg_cp); Inst_Printf(".set", "noat"); Inst_Printf(".set", "noreorder"); Label_Printf(".text"); } /*-------------------------------------------------------------------------* * ASM_STOP * * * *-------------------------------------------------------------------------*/ void Asm_Stop(void) { /* we are printing the fixed doubles at the end of the file, * they will appear in the data section */ if (dbl_arg_buffer[0] != '\0') { #ifdef M_alpha_linux Label_Printf(".section\t.rodata"); #else Label_Printf(".rdata"); #endif Label_Printf(dbl_arg_buffer); dbl_arg_buffer[0] = '\0'; } } /*-------------------------------------------------------------------------* * CODE_START * * * *-------------------------------------------------------------------------*/ void Code_Start(char *label, int prolog, int global) { if (act_routine[0] != '\0') Code_Stop(); /* we first have to close the previous code */ Inst_Printf(".align", "5"); if (global) Inst_Printf(".globl", "%s", label); Inst_Printf(".ent", "%s", label); Label(label); /* remember this label */ strcpy(act_routine, label); if (prolog) { /* prolog code does not need any stack space */ inPrologCode = 1; Inst_Printf(".frame", "$30,0,$26,0"); Inst_Printf(".mask", "0x4000000,0"); Inst_Printf("ldgp", "$gp,0($27)"); Inst_Printf(".prologue", "1"); } else { /* for c code we need to save some registers */ inPrologCode = 0; Inst_Printf(".frame", "$30,32,$26,0"); Inst_Printf(".mask", "0x4008000,-32"); Inst_Printf("ldgp", "$gp,0($27)"); Inst_Printf("subq", "$30,32,$30"); Inst_Printf("stq", "$26,0($30)"); Inst_Printf("stq", "$15,8($30)"); Inst_Printf(".prologue", "1"); } } /*-------------------------------------------------------------------------* * CODE_STOP * * * *-------------------------------------------------------------------------*/ void Code_Stop(void) { Inst_Printf(".end", "%s", act_routine); act_routine[0] = '\0'; } /*-------------------------------------------------------------------------* * LABEL * * * *-------------------------------------------------------------------------*/ void Label(char *label) { Label_Printf("\n%s:", label); } /*-------------------------------------------------------------------------* * RELOAD_E_IN_REGISTER * * * *-------------------------------------------------------------------------*/ void Reload_E_In_Register(void) { } /*-------------------------------------------------------------------------* * PL_JUMP * * * *-------------------------------------------------------------------------*/ void Pl_Jump(char *label) { #ifdef M_alpha_linux /* also works for OSF but 'as' warns */ Inst_Printf("jmp", "$31,%s", label); /* about macro using $at */ #else Inst_Printf("lda", "$27,%s", label); Inst_Printf("jmp", "$31,($27),%s", label); #endif } /*-------------------------------------------------------------------------* * PREP_CP * * * *-------------------------------------------------------------------------*/ void Prep_CP(void) { #ifdef MAP_REG_CP Inst_Printf("lda", "%s,$Lcont%d", asm_reg_cp, w_label); /* CP = $Lcont%d */ #else Inst_Printf("lda", "$4,$Lcont%d", w_label); /* CP = $Lcont%d */ Inst_Printf("stq", "$4,%s", asm_reg_cp); #endif } /*-------------------------------------------------------------------------* * HERE_CP * * * *-------------------------------------------------------------------------*/ void Here_CP(void) { Label_Printf("$Lcont%d:", w_label++); Inst_Printf("ldgp","$gp,0($27)"); } /*-------------------------------------------------------------------------* * PL_CALL * * * *-------------------------------------------------------------------------*/ void Pl_Call(char *label) { Prep_CP(); Pl_Jump(label); Here_CP(); } /*-------------------------------------------------------------------------* * PL_FAIL * * * *-------------------------------------------------------------------------*/ void Pl_Fail(void) { #ifdef MAP_REG_B Inst_Printf("ldq", "$27,-8(%s)", asm_reg_b); #else Inst_Printf("ldq", "$4,%s", asm_reg_b); Inst_Printf("ldq", "$27,-8($4)"); #endif Inst_Printf("jmp", "$31,($27),0"); } /*-------------------------------------------------------------------------* * PL_RET * * * *-------------------------------------------------------------------------*/ void Pl_Ret(void) { #ifdef MAP_REG_CP Inst_Printf("mov", "%s,$27", asm_reg_cp); /* make a copy of it in $27 */ #else Inst_Printf("ldq", "$27,%s", asm_reg_cp); #endif Inst_Printf("jmp", "$31,($27),0"); /* jump to CP */ } /*-------------------------------------------------------------------------* * JUMP * * * *-------------------------------------------------------------------------*/ void Jump(char *label) { Inst_Printf("lda", "$3,%s", label); Inst_Printf("jmp", "$31,($3),%s", label); } /*-------------------------------------------------------------------------* * MOVE_FROM_REG_X * * * *-------------------------------------------------------------------------*/ void Move_From_Reg_X(int index) { Inst_Printf("ldq", "$1,%d(%s)", 8 * index, asm_reg_bank); } /*-------------------------------------------------------------------------* * MOVE_FROM_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_From_Reg_Y(int index) { #ifdef MAP_REG_E Inst_Printf("ldq", "$1,%d(%s)", Y_OFFSET(index), asm_reg_e); #else Inst_Printf("ldq", "$4,%s", asm_reg_e); Inst_Printf("ldq", "$1,%d($4)", Y_OFFSET(index)); #endif } /*-------------------------------------------------------------------------* * MOVE_TO_REG_X * * * *-------------------------------------------------------------------------*/ void Move_To_Reg_X(int index) { Inst_Printf("stq", "$1,%d(%s)", 8 * index, asm_reg_bank); } /*-------------------------------------------------------------------------* * MOVE_TO_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_To_Reg_Y(int index) { #ifdef MAP_REG_E Inst_Printf("stq", "$1,%d(%s)", Y_OFFSET(index), asm_reg_e); #else Inst_Printf("ldq", "$4,%s", asm_reg_e); Inst_Printf("stq", "$1,%d($4)", Y_OFFSET(index)); #endif } /*-------------------------------------------------------------------------* * CALL_C_START * * * *-------------------------------------------------------------------------*/ void Call_C_Start(char *fct_name, int fc, int nb_args, int nb_args_in_words, char **p_inline) { } /*-------------------------------------------------------------------------* * CALL_C_ARG_INT * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Int(int offset, long int_val) { switch (offset) { case 0: Inst_Printf("lda", "$16,%ld", int_val); break; case 1: Inst_Printf("lda", "$17,%ld", int_val); break; case 2: Inst_Printf("lda", "$18,%ld", int_val); break; case 3: Inst_Printf("lda", "$19,%ld", int_val); break; case 4: Inst_Printf("lda", "$20,%ld", int_val); break; case 5: Inst_Printf("lda", "$21,%ld", int_val); break; default: Inst_Printf("lda", "$1,%ld", int_val); Inst_Printf("stq", "$1,%d($30)", (offset - 6) * 8); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_DOUBLE * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Double(int offset, double dbl_val) { char buf[1024]; sprintf(buf, "\t.align 3\n$LD%d:\n\t.t_floating %1.20e\n", w_label++, dbl_val); strcat(dbl_arg_buffer, buf); Inst_Printf("lda", "$1,$LD%d", (w_label - 1)); switch (offset) { case 0: Inst_Printf("ldt", "$f16,0($1)"); break; case 1: Inst_Printf("ldt", "$f17,0($1)"); break; case 2: Inst_Printf("ldt", "$f18,0($1)"); break; case 3: Inst_Printf("ldt", "$f19,0($1)"); break; case 4: Inst_Printf("ldt", "$f20,0($1)"); break; case 5: Inst_Printf("ldt", "$f21,0($1)"); break; default: Inst_Printf("ldt", "$f1,0($1)"); Inst_Printf("stt", "$f1,%d($30)", (offset - 6) * 8); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_STRING * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_String(int offset, int str_no) { switch (offset) { case 0: Inst_Printf("lda", "$16,%s%d", STRING_PREFIX, str_no); break; case 1: Inst_Printf("lda", "$17,%s%d", STRING_PREFIX, str_no); break; case 2: Inst_Printf("lda", "$18,%s%d", STRING_PREFIX, str_no); break; case 3: Inst_Printf("lda", "$19,%s%d", STRING_PREFIX, str_no); break; case 4: Inst_Printf("lda", "$20,%s%d", STRING_PREFIX, str_no); break; case 5: Inst_Printf("lda", "$21,%s%d", STRING_PREFIX, str_no); break; default: Inst_Printf("lda", "$1,%s%d", STRING_PREFIX, str_no); Inst_Printf("stq", "$1,%d($30)", (offset - 6) * 8); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_MEM_L * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Mem_L(int offset, int adr_of, char *name, int index) { char dest[8]; switch (offset) { case 0: sprintf(dest, "%s", "$16"); break; case 1: sprintf(dest, "%s", "$17"); break; case 2: sprintf(dest, "%s", "$18"); break; case 3: sprintf(dest, "%s", "$19"); break; case 4: sprintf(dest, "%s", "$20"); break; case 5: sprintf(dest, "%s", "$21"); break; default: sprintf(dest, "%s", "$1"); break; } if (!adr_of) { Inst_Printf("lda", "$2,%s", name); Inst_Printf("ldq", "%s,%d($2)", dest, index * 8); } else { Inst_Printf("lda", "%s,%s+%d", dest, name, index * 8); } if (offset > 5) { Inst_Printf("stq", "%s,%d($30)", dest, (offset - 6) * 8); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_REG_X * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Reg_X(int offset, int adr_of, int index) { char dest[8]; switch (offset) { case 0: sprintf(dest, "%s", "$16"); break; case 1: sprintf(dest, "%s", "$17"); break; case 2: sprintf(dest, "%s", "$18"); break; case 3: sprintf(dest, "%s", "$19"); break; case 4: sprintf(dest, "%s", "$20"); break; case 5: sprintf(dest, "%s", "$21"); break; default: sprintf(dest, "%s", "$1"); break; } if (!adr_of) { Inst_Printf("ldq", "%s,%d(%s)", dest, index * 8, asm_reg_bank); } else { if (index == 0) { Inst_Printf("mov", "%s,%s", asm_reg_bank, dest); } else { Inst_Printf("lda", "%s,%d(%s)", dest, index * 8, asm_reg_bank); } } if (offset > 5) { Inst_Printf("stq", "%s,%d($30)", dest, (offset - 6) * 8); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_REG_Y * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Reg_Y(int offset, int adr_of, int index) { char dest[8]; switch (offset) { case 0: sprintf(dest, "%s", "$16"); break; case 1: sprintf(dest, "%s", "$17"); break; case 2: sprintf(dest, "%s", "$18"); break; case 3: sprintf(dest, "%s", "$19"); break; case 4: sprintf(dest, "%s", "$20"); break; case 5: sprintf(dest, "%s", "$21"); break; default: sprintf(dest, "%s", "$1"); break; } if (!adr_of) { #ifdef MAP_REG_E Inst_Printf("ldq", "%s,%d(%s)", dest, Y_OFFSET(index), asm_reg_e); #else Inst_Printf("ldq", "$4,%s", asm_reg_e); Inst_Printf("ldq", "%s,%d($4)", dest, Y_OFFSET(index)); #endif } else { #ifdef MAP_REG_E Inst_Printf("lda", "%s,%d(%s)", dest, Y_OFFSET(index), asm_reg_e); #else Inst_Printf("ldq", "$4,%s", asm_reg_e); Inst_Printf("lda", "%s,%d($4)", dest, Y_OFFSET(index)); #endif } if (offset > 5) { Inst_Printf("stq", "%s,%d($30)", dest, (offset - 6) * 8); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_FOREIGN_L * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Foreign_L(int offset, int adr_of, int index) { char dest[8]; switch (offset) { case 0: sprintf(dest, "%s", "$16"); break; case 1: sprintf(dest, "%s", "$17"); break; case 2: sprintf(dest, "%s", "$18"); break; case 3: sprintf(dest, "%s", "$19"); break; case 4: sprintf(dest, "%s", "$20"); break; case 5: sprintf(dest, "%s", "$21"); break; default: sprintf(dest, "%s", "$1"); break; } Inst_Printf("lda", "$2,foreign_long"); if (!adr_of) { Inst_Printf("ldq", "%s,%d($2)", dest, index * 8); } else { Inst_Printf("lda", "%s,%d($2)", dest, index * 8); } if (offset > 5) { Inst_Printf("stq", "%s,%d($30)", dest, (offset - 6) * 8); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_FOREIGN_D * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Foreign_D(int offset, int adr_of, int index) { char dest[8]; if (adr_of) { switch (offset) { case 0: sprintf(dest, "%s", "$16"); break; case 1: sprintf(dest, "%s", "$17"); break; case 2: sprintf(dest, "%s", "$18"); break; case 3: sprintf(dest, "%s", "$19"); break; case 4: sprintf(dest, "%s", "$20"); break; case 5: sprintf(dest, "%s", "$21"); break; default: sprintf(dest, "%s", "$1"); break; } Inst_Printf("lda", "%s,foreign_double+%d", dest, index * 8); if (offset > 5) { Inst_Printf("stq", "%s,%d($30)", dest, (offset - 6) * 8); } return 1; } else { switch (offset) { case 0: sprintf(dest, "%s", "$f16"); break; case 1: sprintf(dest, "%s", "$f17"); break; case 2: sprintf(dest, "%s", "$f18"); break; case 3: sprintf(dest, "%s", "$f19"); break; case 4: sprintf(dest, "%s", "$f20"); break; case 5: sprintf(dest, "%s", "$f21"); break; default: sprintf(dest, "%s", "$f1"); break; } Inst_Printf("lda", "$1,foreign_double+%d", index * 8); Inst_Printf("ldt", "%s,0($1)", dest); if (offset > 5) { Inst_Printf("stt", "%s,%d($30)", dest, (offset - 6) * 8); } return 1; } } /*-------------------------------------------------------------------------* * CALL_C_INVOKE * * * *-------------------------------------------------------------------------*/ void Call_C_Invoke(char *fct_name, int fc, int nb_args, int nb_args_in_words) { if (!make_inline(fct_name, nb_args)) { Inst_Printf("jsr", "$26,%s", fct_name); Inst_Printf("ldgp", "$gp,0($26)"); } } /*-------------------------------------------------------------------------* * CALL_C_STOP * * * *-------------------------------------------------------------------------*/ void Call_C_Stop(char *fct_name, int nb_args, char **p_inline) { } /*-------------------------------------------------------------------------* * JUMP_RET * * * *-------------------------------------------------------------------------*/ void Jump_Ret(void) { Inst_Printf("mov", "$0,$27"); Inst_Printf("jmp", "$31,($27),0"); } /*-------------------------------------------------------------------------* * FAIL_RET * * * *-------------------------------------------------------------------------*/ void Fail_Ret(void) { Inst_Printf("bne", "$0,$Lcont%d", w_label); Pl_Fail(); Label_Printf("$Lcont%d:", w_label++); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_MEM_L * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Mem_L(char *name, int index) { Inst_Printf("lda", "$1,%s", name); if (index * 8 > 1 << 15) { Inst_Printf("lda", "$2,%d", index * 8); Inst_Printf("addq", "$1,$2,$1"); index = 0; } Inst_Printf("stq", "$0,%d($1)", index * 8); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_REG_X * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Reg_X(int index) { /* same as Move_To_Reg_X */ Inst_Printf("stq", "$0,%d(%s)", index * 8, asm_reg_bank); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Reg_Y(int index) { /* same as Move_To_Reg_Y */ #ifdef MAP_REG_E Inst_Printf("stq", "$0,%d(%s)", Y_OFFSET(index), asm_reg_e); #else Inst_Printf("ldq", "$4,%s", asm_reg_e); Inst_Printf("stq", "$0,%d($4)", Y_OFFSET(index)); #endif } /*-------------------------------------------------------------------------* * MOVE_RET_TO_FOREIGN_L * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Foreign_L(int index) { Inst_Printf("lda", "$1,foreign_long"); Inst_Printf("stq", "$0,%d($1)", index * 8); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_FOREIGN_D * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Foreign_D(int index) { Inst_Printf("lda", "$1,foreign_double"); Inst_Printf("stt", "$f0,%d($1)", index * 8); } /*-------------------------------------------------------------------------* * CMP_RET_AND_INT * * * *-------------------------------------------------------------------------*/ void Cmp_Ret_And_Int(long int_val) { Inst_Printf("lda", "$1,%ld", int_val); Inst_Printf("subq", "$0,$1,$1"); } /*-------------------------------------------------------------------------* * JUMP_IF_EQUAL * * * *-------------------------------------------------------------------------*/ void Jump_If_Equal(char *label) { Inst_Printf("beq", "$1,%s", label); } /*-------------------------------------------------------------------------* * JUMP_IF_GREATER * * * *-------------------------------------------------------------------------*/ void Jump_If_Greater(char *label) { /* this is based on the comparison we did with Cmp_Ret_And_Int */ /* means this is more or less a Jump_If_Not_Equal ! */ Inst_Printf("bgt", "$1,%s", label); } /*-------------------------------------------------------------------------* * C_RET * * * *-------------------------------------------------------------------------*/ void C_Ret(void) { Inst_Printf("ldq", "$26,0($30)"); Inst_Printf("addq", "$30,32,$30"); Inst_Printf("ret", "$31,($26),1"); } /*-------------------------------------------------------------------------* * DICO_STRING_START * * * *-------------------------------------------------------------------------*/ void Dico_String_Start(int nb_consts) { #ifdef M_alpha_linux Label_Printf(".section\t.rodata"); #else Label_Printf(".rdata"); #endif } /*-------------------------------------------------------------------------* * DICO_STRING * * * *-------------------------------------------------------------------------*/ void Dico_String(int str_no, char *asciiz) { Label_Printf("%s%d:", STRING_PREFIX, str_no); Inst_Printf(".ascii", "%s", asciiz); } /*-------------------------------------------------------------------------* * DICO_STRING_STOP * * * *-------------------------------------------------------------------------*/ void Dico_String_Stop(int nb_consts) { } /*-------------------------------------------------------------------------* * DICO_LONG_START * * * *-------------------------------------------------------------------------*/ void Dico_Long_Start(int nb_longs) { #ifdef M_alpha_linux Label_Printf(".section\t.sdata,\"aw\""); #else Label_Printf(".data"); #endif Inst_Printf(".align", "3"); } /*-------------------------------------------------------------------------* * DICO_LONG * * * *-------------------------------------------------------------------------*/ void Dico_Long(char *name, int global, VType vtype, long value) { switch (vtype) { case NONE: value = 1; /* then in case ARRAY_SIZE */ case ARRAY_SIZE: Inst_Printf(".align", "3"); #ifdef M_alpha_linux Label_Printf(".section\t.bss"); #endif if (!global) { #ifdef M_alpha_linux Inst_Printf(".type", "%s,@object", name); Inst_Printf(".size", "%s,%ld", name, value * 8); Inst_Printf(".align", "3"); Label_Printf("%s:", name); Inst_Printf(".zero", "%ld", value * 8); #else Inst_Printf(".lcomm", "%s,%ld", name, value * 8); #endif } else { #ifdef M_alpha_linux Inst_Printf(".comm", "%s,%ld,8", name, value * 8); #else Inst_Printf(".comm", "%s,%ld", name, value * 8); #endif } break; case INITIAL_VALUE: #ifdef M_alpha_linux Label_Printf(".section\t.sdata,\"aw\""); #endif if (global) { Inst_Printf(".globl", "%s", name); Inst_Printf(".align", "3"); #ifdef M_alpha_linux Inst_Printf(".type", "%s,@object", name); Inst_Printf(".size", "%s,8", name); #endif Label_Printf("%s:", name); Inst_Printf(".quad", "%ld", value); } else { Inst_Printf(".align", "3"); #ifdef M_alpha_linux Inst_Printf(".type", "%s,@object", name); Inst_Printf(".size", "%s,8", name); #endif Label_Printf("%s:", name); Inst_Printf(".quad", "%ld", value); } break; } } /*-------------------------------------------------------------------------* * DICO_LONG_STOP * * * *-------------------------------------------------------------------------*/ void Dico_Long_Stop(int nb_longs) { } /*-------------------------------------------------------------------------* * DATA_START * * * *-------------------------------------------------------------------------*/ void Data_Start(char *initializer_fct) { /* last routine has to be closed first */ if (act_routine[0] != '\0') { Inst_Printf("ret", "$31,($26),1"); Inst_Printf(".end", "%s", act_routine); act_routine[0] = '\0'; } if (initializer_fct == NULL) return; Inst_Printf(".section", ".ctors,\"aw\""); Inst_Printf(".quad", "%s", initializer_fct); } /*-------------------------------------------------------------------------* * DATA_STOP * * * *-------------------------------------------------------------------------*/ void Data_Stop(char *initializer_fct) { } ./gprolog-1.3.0/src/Ma2Asm/ma_parser.c0000644004425400513100000004145610547154142015772 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : ma_parser.c * * Descr.: mini-assembler parser * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: ma_parser.c,v 1.15 2007/01/04 10:35:14 diaz Exp $ */ #include #include #include #include #include #include #define MA_PARSER_FILE #include "ma_parser.h" #include "ma_protos.h" /*---------------------------------* * Constants * *---------------------------------*/ #define MAX_LINE_LEN 32767 #define MAX_STR_LEN 2048 #define MAX_ARGS 128 #define MAX_SWITCH_CASES 10240 enum { PL_CODE, PL_JUMP, PREP_CP, HERE_CP, PL_CALL, PL_FAIL, PL_RET, JUMP, MOVE, CALL_C, JUMP_RET, FAIL_RET, MOVE_RET, SWITCH_RET, C_CODE, C_RET, LONG }; /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ int needs_pre_pass; /* can be overwritten by mappers */ char *inst[] = { "pl_code", "pl_jump", "prep_cp", "here_cp", "pl_call", "pl_fail", "pl_ret", "jump", "move", "call_c", "jump_ret", "fail_ret", "move_ret", "switch_ret", "c_code", "c_ret", "long", NULL }; int reload_e; char fct_name[MAX_STR_LEN]; int fc; int nb_args; int nb_args_in_words; /* args counted in words (e.g. 32 bits) */ ArgInf arg[MAX_ARGS]; int nb_swt; SwtInf swt[MAX_SWITCH_CASES]; jmp_buf jumper; /* scanner variables */ int keep_source_lines; FILE *file_in; int cur_line_no; char cur_line_str[MAX_LINE_LEN]; char *cur_line_p; char *beg_last_token; char str_val[MAX_STR_LEN]; long int_val; double dbl_val; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Parser(int pass_no, int nb_passes); static int Read_If_Global(int initializer); static void Read_Function(void); static void Read_Switch(void); static int Read_Index(void); static int Read_Optional_Index(void); static int Read_Token(int what); static int Scanner(void); /*-------------------------------------------------------------------------* * PARSE_MA_FILE * * * *-------------------------------------------------------------------------*/ int Parse_Ma_File(char *file_name_in, int comment) { int ret_val; int i, nb_passes = needs_pre_pass + 1; if (file_name_in == NULL) { file_name_in = "stdin"; file_in = stdin; } else if ((file_in = fopen(file_name_in, "rt")) == NULL) { fprintf(stderr, "cannot open input file %s\n", file_name_in); return 0; } for(i = 1; i <= nb_passes; i++) { if (i == 2 && fseek(file_in, 0, SEEK_SET) == -1) { fprintf(stderr, "cannot reposition file %s (needed for 2 passes)\n", file_name_in); return 0; } keep_source_lines = comment; if ((ret_val = setjmp(jumper)) == 0) Parser(i, nb_passes); if (ret_val != 0) return 0; } if (file_in != stdin) fclose(file_in); return 1; } /*-------------------------------------------------------------------------* * PARSER * * * *-------------------------------------------------------------------------*/ #define Pre_Pass() (pass_no < nb_passes) static void Parser(int pass_no, int nb_passes) { int init_already_read = 0; char **in, *name; int k, i; int global; if (Pre_Pass()) keep_source_lines = 0; cur_line_p = cur_line_str; cur_line_str[0] = '\0'; cur_line_no = 0; for (;;) { k = Scanner(); if (k == 0) /* end of file */ break; if (k != IDENTIFIER) Syntax_Error("miniasm declaration or instruction expected"); for (in = inst; *in; in++) if (strcmp(str_val, *in) == 0) break; k = in - inst; /* ignore it in Pre_Pass() or long decl if Pre_Pass() done before */ if ((Pre_Pass() && k != PL_CODE && k != C_CODE && k != LONG && *in != NULL) || (pass_no > 1 && k == LONG)) { *cur_line_p = '\0'; /* skip rest of line */ continue; } switch (k) { case PL_CODE: global = Read_If_Global(0); Read_Token(IDENTIFIER); if (Pre_Pass()) Decl_Code(strdup(str_val), 1, global); else { Code_Start(str_val, 1, global); reload_e = 1; } break; case PL_JUMP: Read_Token(IDENTIFIER); Pl_Jump(str_val); reload_e = 1; break; case PREP_CP: Prep_CP(); break; case HERE_CP: Here_CP(); break; case PL_CALL: Read_Token(IDENTIFIER); Pl_Call(str_val); reload_e = 1; break; case PL_FAIL: Pl_Fail(); reload_e = 1; break; case PL_RET: Pl_Ret(); reload_e = 1; break; case JUMP: Read_Token(IDENTIFIER); Jump(str_val); reload_e = 1; break; case MOVE: k = Read_Token(X_REG); i = Read_Index(); if (k == X_REG) Move_From_Reg_X(i); else Move_From_Reg_Y(i); Read_Token(','); k = Read_Token(X_REG); i = Read_Index(); if (k == X_REG) Move_To_Reg_X(i); else Move_To_Reg_Y(i); break; case CALL_C: Read_Function(); Call_C(fct_name, fc, nb_args, nb_args_in_words, arg); break; case JUMP_RET: Jump_Ret(); reload_e = 1; break; case FAIL_RET: Fail_Ret(); break; case MOVE_RET: switch ((k = Scanner())) { case IDENTIFIER: Move_Ret_To_Mem_L(str_val, Read_Optional_Index()); break; case X_REG: Move_Ret_To_Reg_X(Read_Index()); break; case Y_REG: Move_Ret_To_Reg_Y(Read_Index()); break; case FL_ARRAY: Move_Ret_To_Foreign_L(Read_Index()); break; case FD_ARRAY: Move_Ret_To_Foreign_D(Read_Index()); break; default: Syntax_Error("identifier, X(...), Y(...), FL(...) or FD(...) expected"); break; } break; case SWITCH_RET: Read_Switch(); Switch_Ret(nb_swt, swt); break; case C_CODE: global = Read_If_Global(!init_already_read); Read_Token(IDENTIFIER); if (global == 2) { init_already_read = 1; global = 0; if (!Pre_Pass()) Declare_Initializer(strdup(str_val)); } if (Pre_Pass()) Decl_Code(strdup(str_val), 0, global); else Code_Start(str_val, 0, global); break; case C_RET: C_Ret(); break; case LONG: global = Read_If_Global(1); Read_Token(IDENTIFIER); name = strdup(str_val); if ((i = Read_Optional_Index()) > 0) /* array */ { Decl_Long(name, global, ARRAY_SIZE, i); break; } while (isspace(*cur_line_p)) cur_line_p++; if (*cur_line_p != '=') { Decl_Long(name, global, NONE, 0); break; } cur_line_p++; /* skip the = */ Read_Token(INTEGER); Decl_Long(name, global, INITIAL_VALUE, int_val); break; default: if (*in == NULL) { Read_Token(':'); if (Pre_Pass()) Decl_Code(strdup(str_val), 1, global); else Label(str_val); } } } } /*-------------------------------------------------------------------------* * READ_IF_GLOBAL * * * *-------------------------------------------------------------------------*/ static int Read_If_Global(int initializer) { if (Scanner() != IDENTIFIER) goto err; if (strcmp(str_val, "local") == 0) return 0; if (strcmp(str_val, "global") == 0) return 1; if (initializer && strcmp(str_val, "initializer") == 0) return 2; err: if (!initializer) Syntax_Error("local / global expected"); else Syntax_Error("local / global / initializer expected"); return 0; } /*-------------------------------------------------------------------------* * READ_FUNCTION * * * *-------------------------------------------------------------------------*/ static void Read_Function(void) { int k; fc = 0; Read_Token(IDENTIFIER); if (strcmp(str_val, "fast") == 0) { fc = 1; Read_Token(IDENTIFIER); } strcpy(fct_name, str_val); nb_args = 0; nb_args_in_words = 0; Read_Token('('); k = Scanner(); if (k == ')') return; for (;;) { arg[nb_args].type = k; arg[nb_args].adr_of = 0; one_arg: switch (k) { case '&': k = Scanner(); if (k != IDENTIFIER && k != X_REG && k != Y_REG && k != FL_ARRAY && k != FD_ARRAY) Syntax_Error("identifier, X(...), Y(...), FL(...) or FD(...) expected"); arg[nb_args].type = k; arg[nb_args].adr_of = 1; goto one_arg; case STRING: arg[nb_args].t.str_val = strdup(str_val); break; case INTEGER: arg[nb_args].t.int_val = int_val; break; case FLOAT: nb_args_in_words++; /* double count 1 word more */ arg[nb_args].t.dbl_val = dbl_val; break; case IDENTIFIER: arg[nb_args].type = MEM; arg[nb_args].t.mem.name = strdup(str_val); arg[nb_args].t.mem.index = Read_Optional_Index(); break; case FD_ARRAY: if (arg[nb_args].adr_of == 0) nb_args_in_words++; /* double count 1 word more */ case FL_ARRAY: case X_REG: case Y_REG: arg[nb_args].t.index = Read_Index(); break; } k = Scanner(); nb_args++; nb_args_in_words++; if (k == ')') break; if (k != ',') Syntax_Error(") or , expected"); k = Scanner(); } } /*-------------------------------------------------------------------------* * READ_SWITCH * * * *-------------------------------------------------------------------------*/ static void Read_Switch(void) { int k; Read_Token('('); nb_swt = 0; for (;;) { if (Scanner() != INTEGER) Syntax_Error("integer expected"); Read_Token('='); Read_Token(IDENTIFIER); swt[nb_swt].int_val = int_val; swt[nb_swt].label = strdup(str_val); nb_swt++; k = Scanner(); if (k == ')') break; if (k != ',') Syntax_Error(") or , expected"); } } /*-------------------------------------------------------------------------* * READ_INDEX * * * *-------------------------------------------------------------------------*/ static int Read_Index(void) { Read_Token('('); Read_Token(INTEGER); Read_Token(')'); return int_val; } /*-------------------------------------------------------------------------* * READ_OPTIONAL_INDEX * * * *-------------------------------------------------------------------------*/ static int Read_Optional_Index(void) { return (*cur_line_p == '(') ? Read_Index() : 0; } /*-------------------------------------------------------------------------* * READ_TOKEN * * * *-------------------------------------------------------------------------*/ static int Read_Token(int what) { char str[80]; int k; k = Scanner(); if (k == what || (what == X_REG && k == Y_REG) || (what == FL_ARRAY && k == FD_ARRAY)) return k; switch (what) { case IDENTIFIER: Syntax_Error("identifier expected"); break; case STRING: Syntax_Error("string expected"); break; case INTEGER: Syntax_Error("integer expected"); break; case FLOAT: Syntax_Error("float expected"); break; case X_REG: Syntax_Error("X(...) or Y(...) expected"); break; case FL_ARRAY: Syntax_Error("FL(...) or FD(...) expected"); break; default: sprintf(str, "%c expected", what); Syntax_Error(str); break; } return k; /* for the compiler */ } /*-------------------------------------------------------------------------* * SCANNER * * * *-------------------------------------------------------------------------*/ static int Scanner(void) { char *p, *p1; long i; double d; double strtod(); for (;;) { while (isspace(*cur_line_p)) cur_line_p++; if (*cur_line_p != '\0' && *cur_line_p != ';') break; fgets(cur_line_str, sizeof(cur_line_str), file_in); if (feof(file_in)) return 0; cur_line_no++; cur_line_p = cur_line_str; if (keep_source_lines) { while (isspace(*cur_line_p)) cur_line_p++; if (*cur_line_p) { p = cur_line_p + strlen(cur_line_p) - 1; if (*p == '\n') *p = '\0'; Label_Printf("\t%s %6d: %s", comment_prefix, cur_line_no, cur_line_p); } } } beg_last_token = cur_line_p; if (*cur_line_p == '"') /* string */ { p = str_val; *p++ = '"'; cur_line_p++; while (*cur_line_p != '"') { if ((*p++ = *cur_line_p++) == '\\') *p++ = *cur_line_p++; } cur_line_p++; if (strings_need_null) { *p++ = '\\'; *p++ = '0'; } *p++ = '"'; *p = '\0'; return STRING; } if (isalpha(*cur_line_p) || *cur_line_p == '_') /* identifier */ { p = str_val; while (isalnum(*cur_line_p) || *cur_line_p == '_') *p++ = *cur_line_p++; *p = '\0'; if (str_val[0] == 'X' && str_val[1] == '\0' && *cur_line_p == '(') return X_REG; if (str_val[0] == 'Y' && str_val[1] == '\0' && *cur_line_p == '(') { if (reload_e) { Reload_E_In_Register(); reload_e = 0; } return Y_REG; } if (strcmp(str_val, "FL") == 0 && *cur_line_p == '(') return FL_ARRAY; if (strcmp(str_val, "FD") == 0 && *cur_line_p == '(') return FD_ARRAY; return IDENTIFIER; } i = strtol(cur_line_p, &p, 0); if (p == cur_line_p) /* not an integer return that character */ return *cur_line_p++; d = strtod(cur_line_p, &p1); if (p1 == p) /* integer */ { int_val = i; cur_line_p = p; return INTEGER; } /* float */ dbl_val = d; cur_line_p = p1; return FLOAT; } /*-------------------------------------------------------------------------* * SYNTAX_ERROR * * * *-------------------------------------------------------------------------*/ void Syntax_Error(char *s) { char *p = cur_line_str + strlen(cur_line_str) - 1; if (*p == '\n') *p = '\0'; fprintf(stderr, "line %d: %s\n", cur_line_no, s); fprintf(stderr, "%s\n", cur_line_str); for (p = cur_line_str; p < beg_last_token; p++) if (!isspace(*p)) *p = ' '; *p = '\0'; fprintf(stderr, "%s^ here\n", cur_line_str); longjmp(jumper, 1); } ./gprolog-1.3.0/src/Ma2Asm/ma_protos.h0000644004425400513100000001327710547154142016031 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : ma_protos.h * * Descr.: code generation - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: ma_protos.h,v 1.16 2007/01/04 10:35:14 diaz Exp $ */ #if 0 #define CHECK_PRINTF_ARGS #endif #ifdef CHECK_PRINTF_ARGS #define GCCPRINTF(x) __attribute__((format(printf, x, x + 1))) #else #define GCCPRINTF(x) #endif /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /* defined in mapper files */ #ifndef MAPPER_FILE extern char *comment_prefix; extern char *local_symb_prefix; extern int strings_need_null; extern int call_c_reverse_args; extern char *inline_asm_data[]; #endif /* defined in ma_parser.c */ #ifndef MA_PARSER_FILE extern int reload_e; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ /* defined in ma2asm.c - used by the parser */ void Declare_Initializer(char *initializer_fct); void Call_C(char *fct_name, int fc, int nb_args, int nb_args_in_words, ArgInf arg[]); void Switch_Ret(int nb_swt, SwtInf swt[]); void Decl_Code(char *name, int prolog, int global); void Decl_Long(char *name, int global, VType vtype, long value); /* defined in ma2asm.c - used by mappers */ int Is_Code_Defined(char *name); int Get_Long_Infos(char *name, int *global, VType *vtype, int *value); void Label_Printf(char *label, ...) GCCPRINTF(1); void Inst_Printf(char *op, char *operands, ...) GCCPRINTF(2); void Inst_Out(char *op, char *operands); void Char_Out(char c); void String_Out(char *s); void Int_Out(int d); /* defined in mapper files */ void Asm_Start(void); void Asm_Stop(void); void Code_Start(char *label, int prolog, int global); void Code_Stop(void); void Label(char *label); void Reload_E_In_Register(void); void Pl_Jump(char *label); void Prep_CP(void); void Here_CP(void); void Pl_Call(char *label); void Pl_Fail(void); void Pl_Ret(void); void Jump(char *label); void Move_From_Reg_X(int index); void Move_From_Reg_Y(int index); void Move_To_Reg_X(int index); void Move_To_Reg_Y(int index); void Call_C_Start(char *fct_name, int fc, int nb_args, int nb_args_in_words, char **p_inline); int Call_C_Arg_Int(int offset, long int_val); int Call_C_Arg_Double(int offset, double dbl_val); int Call_C_Arg_String(int offset, int str_no); int Call_C_Arg_Mem_L(int offset, int adr_of, char *name, int index); int Call_C_Arg_Reg_X(int offset, int adr_of, int index); int Call_C_Arg_Reg_Y(int offset, int adr_of, int index); int Call_C_Arg_Foreign_L(int offset, int adr_of, int index); int Call_C_Arg_Foreign_D(int offset, int adr_of, int index); void Call_C_Invoke(char *fct_name, int fc, int nb_args, int nb_args_in_words); void Call_C_Stop(char *fct_name, int nb_args, char **p_inline); void Call_C_Adjust_Stack(int nb_pushes); void Jump_Ret(void); void Fail_Ret(void); void Move_Ret_To_Mem_L(char *name, int index); void Move_Ret_To_Reg_X(int index); void Move_Ret_To_Reg_Y(int index); void Move_Ret_To_Foreign_L(int index); void Move_Ret_To_Foreign_D(int index); void Cmp_Ret_And_Int(long int_val); void Jump_If_Equal(char *label); void Jump_If_Greater(char *label); void C_Ret(void); void Dico_String_Start(int nb); void Dico_String(int str_no, char *asciiz); void Dico_String_Stop(int nb); void Dico_Long_Start(int nb); void Dico_Long(char *name, int global, VType vtype, long value); void Dico_Long_Stop(int nb); void Data_Start(char *initializer_fct); void Data_Stop(char *initializer_fct); #define INL_ACCESS_NAME(p) (p[0]) #define INL_ACCESS_NEXT(p) (p[1]) #define INL_ACCESS_LEVEL(p) (long) (p[2]) #define INL_ACCESS_INFO(p) (long) (p[3]) #define INL_NEXT ((char *) (0)) #define INL_LEVEL(x) ((char *) (x)) #define INL_INFO(x) ((char *) (x)) #define INL_LABEL(x) ((char *) (x)) #define INL_END_FUNC ((char *) (-1)) ./gprolog-1.3.0/src/Ma2Asm/Makefile.in0000644004425400513100000000403210547152474015715 0ustar diazlocoGPLC = @GPLC@ CC = @CC@ @CFLAGS_MACHINE@ CFLAGS = @CFLAGS@ all: ma2asm@EXE_SUFFIX@ ma_parser@OBJ_SUFFIX@: ma_parser.c ma_parser.h ma_protos.h $(CC) $(CFLAGS) -c ma_parser.c ma2asm@OBJ_SUFFIX@: ma2asm.c ma_protos.h ma_parser.h ../Wam2Ma/bt_string.c \ ../TopComp/copying.c $(CC) $(CFLAGS) -c ma2asm.c ma2asm_inst@OBJ_SUFFIX@: ma2asm_inst.c ma_parser.h ../EnginePl/wam_regs.h \ ix86_any.c powerpc_any.c sparc_any.c \ mips_irix.c alpha_any.c x86_64_any.c $(CC) $(CFLAGS) -c ma2asm_inst.c ma2asm@EXE_SUFFIX@: ma2asm@OBJ_SUFFIX@ ma_parser@OBJ_SUFFIX@ \ ma2asm_inst@OBJ_SUFFIX@ ma2asm_inst.c $(CC) $(CFLAGS) @CC_EXE_NAME_OPT@ma2asm@EXE_SUFFIX@ ma2asm@OBJ_SUFFIX@ ma2asm_inst@OBJ_SUFFIX@ ma_parser@OBJ_SUFFIX@ clean: rm -f *@OBJ_SUFFIX@ ma2asm@EXE_SUFFIX@ distclean: clean clean-chkma clean-extract_asm # for extract_asm extract_asm@EXE_SUFFIX@: extract_asm.c $(CC) $(CFLAGS) @CC_EXE_NAME_OPT@extract_asm@EXE_SUFFIX@ extract_asm.c clean-extract_asm: rm -f extract_asm@EXE_SUFFIX@ check: chkma@EXE_SUFFIX@ ./chkma@EXE_SUFFIX@ clean-check: clean-chkma # for chkma CHKMA_OBJS=chkma@OBJ_SUFFIX@ chkma_ma@OBJ_SUFFIX@ ../EnginePl/engine1@OBJ_SUFFIX@ # use make FC=Y chkma to generate an fc check chkma@OBJ_SUFFIX@: chkma.c if [ "$$FC" = "Y" ]; then FCFLAGS='-DFAST'; fi; \ $(GPLC) --c-compiler "$(CC)" -C "$(CFLAGS) $$FCFLAGS" -c chkma.c chkma_ma@ASM_SUFFIX@: chkma_ma.ma ma2asm@EXE_SUFFIX@ if [ "$$FC" != "Y" ]; then MAFLAGS='--ignore-fast'; fi; \ ./ma2asm --comment $$MAFLAGS chkma_ma.ma chkma_ma@OBJ_SUFFIX@: chkma_ma@ASM_SUFFIX@ $(GPLC) -c chkma_ma@ASM_SUFFIX@ chkma@EXE_SUFFIX@: $(CHKMA_OBJS) $(CC) $(CFLAGS) @CC_EXE_NAME_OPT@chkma@EXE_SUFFIX@ $(CHKMA_OBJS) clean-chkma: rm -f chkma@OBJ_SUFFIX@ chkma_ma@ASM_SUFFIX@ chkma_ma@OBJ_SUFFIX@ chkma@EXE_SUFFIX@ # for test t.wam: t.pl $(GPLC) -W t.pl t.ma: t.wam $(GPLC) -M --comment t.wam t@ASM_SUFFIX@: t.ma $(GPLC) -S --comment t.ma t@EXE_SUFFIX@: t@ASM_SUFFIX@ $(GPLC) -o t@EXE_SUFFIX@ t@ASM_SUFFIX@ --no-fd-lib ./gprolog-1.3.0/src/Ma2Asm/extract_asm.c0000644004425400513100000003250210547154142016323 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : extract_asm.c * * Descr.: utility to write inline assembly code for mappers * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: extract_asm.c,v 1.8 2007/01/04 10:35:14 diaz Exp $ */ #include #include #include #include #include /*---------------------------------* * Constants * *---------------------------------*/ #define MAX_FCT 512 #define MAX_ASM_INST_PER_FCT 1024 #define MAX_LABEL_PER_FCT 1024 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { int label; char code_op[32]; char args[256]; }AsmLine; /*---------------------------------* * Global Variables * *---------------------------------*/ char buff[4096]; char buff1[4096]; int nb_fct; char *fct[MAX_FCT]; int found[MAX_FCT]; int disassemble = 0; AsmLine line[MAX_ASM_INST_PER_FCT]; int nb_line; char *lab[MAX_LABEL_PER_FCT]; int nb_lab; /*---------------------------------* * Function Prototypes * *---------------------------------*/ int Needs_Quote(char *str); char *Read_Line(char *buff, int size, FILE *f_in); void Gen_Inline(FILE *f_in, FILE *f_out, int nb_fct, char *fct[]); void Emit_Fct(int fct_no, char *fct_name, FILE *f_in, FILE *f_out); char *Get_Label(char *str); int Detect_End_Of_Fct(char *buff); /*-------------------------------------------------------------------------* * MAIN * * * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { char *asm_file = NULL; char *c_file = NULL; char *out_file = NULL; char *flags = "-O3 -fomit-frame-pointer"; FILE *f, *f_in, *f_out; int tmp = 0; int i, r; int p_open = 1; *buff1 = '\0'; for(i = 1; i < argc; i++) { if (strcmp(argv[i], "-c") == 0) { c_file = argv[++i]; continue; } if (strcmp(argv[i], "-C") == 0) { flags = argv[++i]; continue; } if (strcmp(argv[i], "-a") == 0) { asm_file = argv[++i]; continue; } if (strcmp(argv[i], "-o") == 0) { out_file = argv[++i]; continue; } if (strcmp(argv[i], "-d") == 0) { disassemble = 1; continue; } if (strcmp(argv[i], "-c") == 0) { disassemble = 0; continue; } if (strcmp(argv[i], "-f") == 0) { if ((f = fopen(argv[++i], "r")) == NULL) { perror(argv[i]); goto error; } while(fscanf(f, "%s", buff) == 1) fct[nb_fct++] = strdup(buff); continue; } if (strcmp(argv[i], "-i") == 0) { sprintf(buff1 + strlen(buff1), " -e 's!^.*%s.*$!IGN!'", argv[++i]); continue; } if (strcmp(argv[i], "-e") == 0) { sprintf(buff1 + strlen(buff1), " -e 's!^.*%s.*$!END!'", argv[++i]); continue; } if (strcmp(argv[i], "-h") == 0) { printf("Usage: extract_asm [OPTION | FCT_NAME...]\n"); printf(" -c FILE specify C file to compile to assembly\n"); printf(" -C FLAGS specify C compiler flags\n"); printf(" -a FILE specify assembly file (input or output if -c)\n"); printf(" -o FILE specify output file (else stdout)\n"); printf(" -f FILE get the list of functions from FILE\n"); printf(" -d simply disassemble\n"); printf(" -c create C data for asm inlining\n"); printf(" -i RE ignore lines containing RE\n"); printf(" -e RE end a function when a line containing RE is read\n"); printf(" -h print this help and exit\n"); return 0; } if (*argv[i] == '-') { fprintf(stderr, "unrecognized option %s\n", argv[i]); goto error; } fct[nb_fct++] = argv[i]; } if (nb_fct == 0 && (c_file == NULL || asm_file == NULL)) { fprintf(stderr, "nothing to do - try extract_asm -h for help\n"); goto error; } if (asm_file == NULL && c_file == NULL) { fprintf(stderr, "either -c or -a option should be used\n"); goto error; } if (c_file) { if (asm_file) printf("generate asm file %s from C file %s\n", asm_file, c_file); if (asm_file == NULL) { if ((asm_file = tmpnam(NULL)) == NULL) { perror("cannot create tmp file name\n"); goto error; } else tmp = 1; } sprintf(buff, "gplc -c -C '%s -S' -o %s %s", flags, asm_file, c_file); r = system(buff); if (r == -1 || r == 127) { fprintf(stderr, "cannot execute %s\n", buff); goto error; } if (r != 0) { fprintf(stderr, "command: %s\n\treturned error code; %d\n", buff, r); goto error; } } if (*buff1) { sprintf(buff, "sed %s %s", buff1, asm_file); f_in = popen(buff, "r"), p_open = 1; } else f_in = fopen(asm_file, "r"); if (f_in == NULL) { perror(asm_file); goto error; } if (out_file == NULL) f_out = stdout; else if ((f_out = fopen(out_file, "w")) == NULL) { perror(out_file); goto error; } fprintf(f_out, "/* command:"); for(i = 0; i < argc; i++) if (Needs_Quote(argv[i])) fprintf(f_out, " '%s'", argv[i]); else fprintf(f_out, " %s", argv[i]); fprintf(f_out, " */\n\n"); Gen_Inline(f_in, f_out, nb_fct, fct); if (tmp) unlink(asm_file); if (p_open) pclose(f_in); else fclose(f_in); if (f_out != stdout) fclose(f_out); return 0; error: if (tmp) unlink(asm_file); return 1; } /*-------------------------------------------------------------------------* * NEEDS_QUOTE * * * *-------------------------------------------------------------------------*/ int Needs_Quote(char *str) { while(*str) { if (!isalnum(*str) && strchr("-_./", *str) == NULL) return 1; str++; } return 0; } /*-------------------------------------------------------------------------* * READ_LINE * * * *-------------------------------------------------------------------------*/ char * Read_Line(char *buff, int size, FILE *f_in) { char *p; do if (fgets(buff, size, f_in) == NULL) return NULL; while(strncmp(buff, "IGN", 3) == 0); for(p = buff+ strlen(buff) - 1; isspace(*p); p--) ; p[1] = '\0'; return buff; } /*-------------------------------------------------------------------------* * GEN_INLINE * * * *-------------------------------------------------------------------------*/ void Gen_Inline(FILE *f_in, FILE *f_out, int nb_fct, char *fct[]) { char *p; static char fct_name[1024]; int i, fct_no = 0; while ((Read_Line(buff, sizeof(buff), f_in)) != NULL) { p = Get_Label(buff); if (p == NULL) continue; strcpy(fct_name, p); #if 0 printf("start line: %s -- fct name (%s)\n", buff, fct_name); #endif for(i = 0; i < nb_fct; i++) if (strcmp(fct_name, fct[i]) == 0 || (*fct_name == '_' && strcmp(fct_name + 1, fct[i]) == 0)) break; if (i == nb_fct || found[i]) continue; #if 0 printf("corresponds to fct %d\n",i); #endif Emit_Fct(fct_no++, fct[i], f_in, f_out); found[i] = 1; if (fct_no == nb_fct) return; } for(i = 0; i < nb_fct; i++) if (!found[i]) fprintf(stderr, "cannot find entry code of %s\n", fct[i]); } /*-------------------------------------------------------------------------* * EMIT_FCT * * * *-------------------------------------------------------------------------*/ void Emit_Fct(int fct_no, char *fct_name, FILE *f_in, FILE *f_out) { char *p; char *start, *end; int i, l, eof; int inline_level, inline_info; nb_line = 0; nb_lab = 0; while ((Read_Line(buff, sizeof(buff), f_in)) != NULL) { eof = Detect_End_Of_Fct(buff); if (eof == 1) break; if (nb_line >= MAX_ASM_INST_PER_FCT) { fprintf(stderr, "function %s has more than %d asm lines\n", fct_name, MAX_ASM_INST_PER_FCT); exit(1); } p = Get_Label(buff); if (p) { if (nb_lab >= MAX_LABEL_PER_FCT) { fprintf(stderr, "function %s has more than %d labes\n", fct_name, MAX_LABEL_PER_FCT); exit(1); } line[nb_line].label = 1; sprintf(line[nb_line].code_op, "%d", nb_lab + 1); strcpy(line[nb_line].args, p); lab[nb_lab++] = line[nb_line].args; } else { line[nb_line].label = 0; for(p = buff; isspace(*p); p++) ; start = p; while(*p && !isspace(*p)) p++; end = p; strncpy(line[nb_line].code_op, start, end - start); line[nb_line].code_op[end - start] = '\0'; while(isspace(*p)) p++; strcpy(line[nb_line].args, p); } nb_line++; if (eof == 2) break; } /* pass 2 : code emission */ if (disassemble) fprintf(f_out, "%s:\n", fct_name); else { if (fct_no == 0) fprintf(f_out, "char *inline_asm_data[] = {\n"); else fprintf(f_out, "\n"); inline_level = 1; inline_info = 1; fprintf(f_out, " \"%s\", INL_NEXT, INL_LEVEL(%d), INL_INFO(%d),\n", fct_name, inline_level, inline_info); } if (disassemble) { for(i = 0; i < nb_line; i++) { if (line[i].label) fprintf(f_out, "%s:\n", line[i].args); else fprintf(f_out, "\t%s\t%s\n", line[i].code_op, line[i].args); } } else { for(i = 0; i < nb_line; i++) { if (line[i].label) fprintf(f_out, " INL_LABEL(%s),\n", line[i].code_op); else { for(l = 0; l < nb_lab; l++) if (strcmp(lab[l], line[i].args) == 0) break; fprintf(f_out, " \"%s\", ", line[i].code_op); if (l < nb_lab) fprintf(f_out, "INL_LABEL(%d),\n", l + 1); else fprintf(f_out, "\"%s\",\n", line[i].args); } } fprintf(f_out, " INL_END_FUNC,\n"); } if (fct_no == nb_fct - 1 && !disassemble) fprintf(f_out, "\n NULL };\n"); } /*-------------------------------------------------------------------------* * GET_LABEL * * * *-------------------------------------------------------------------------*/ char * Get_Label(char *str) { if (isspace(*buff)) return NULL; while(isalnum(*str) || strchr(".$_", *str)) str++; if (*str != ':' || str[1] != '\0') return NULL; *str = '\0'; return buff; } /*-------------------------------------------------------------------------* * DETECT_END_OF_FCT * * * * returns 0 if not the end, 1 if the end, 2 if the last * *-------------------------------------------------------------------------*/ int Detect_End_Of_Fct(char *buff) { if (strncmp(buff, "END", 3) == 0) return 1; #if defined(__i386__) if (strncmp(buff, ".Lfe", 4) == 0) return 1; #elif defined(__alpha__) if (strncmp(buff, "\t.end", 5) == 0) return 1; #elif defined(__sparc__) if (strncmp(buff, "\trestore", 8) == 0) return 2; #else { static int i=0; if (i == 0) { fprintf(stderr, "warning, Detect_End_Of_Fct() not customized" "for this architecture\n)"); i++; } } #endif return 0; } ./gprolog-1.3.0/src/Ma2Asm/chkma_ma.ma0000644004425400513100000001305510547152474015734 0ustar diazloco;/*------------------------------------------------------------------------*/ ;/* GNU Prolog */ ;/* */ ;/* Part : mini-assembler to assembler translator */ ;/* File : chkma_ma.ma */ ;/* Descr.: test file for MA translation */ ;/* Author: Daniel Diaz */ ;/* */ ;/* Copyright (C) 1999-2007 Daniel Diaz */ ;/* */ ;/* GNU Prolog is free software; you can redistribute it and/or modify it */ ;/* under the terms of the GNU General Public License as published by the */ ;/* Free Software Foundation; either version 2, or any later version. */ ;/* */ ;/* GNU Prolog is distributed in the hope that it will be useful, but */ ;/* WITHOUT ANY WARRANTY; without even the implied warranty of */ ;/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU */ ;/* General Public License for more details. */ ;/* */ ;/* You should have received a copy of the GNU General Public License along*/ ;/* with this program; if not, write to the Free Software Foundation, Inc. */ ;/* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ ;/*------------------------------------------------------------------------*/ ; maybe comment this if something goes wrong from start ; (maybe it is call_c which does not work !) c_code initializer Object_Initializer call_c Initializer() c_ret pl_code global ma_test_pl_jump_and_pl_ret ; call_c Write_Long(&X(0)) pl_jump ma_test_ret pl_code global ma_test_ret pl_ret pl_code global ma_test_pl_call_and_pl_ret_and_pl_fail pl_call ma_test_pl_jump_and_pl_ret pl_fail pl_code global ma_test_prep_cp_and_here_cp call_c Save_CP() prep_cp pl_jump ma_test_ret pl_fail here_cp call_c Restore_CP() pl_ret c_code global ma_test_jump_and_c_ret jump lab1 pl_fail lab1: jump lab2 pl_fail lab2: c_ret pl_code global ma_test_call_c call_c fast test_call_c1() pl_ret pl_code global ma_test_move_x_y call_c fast Allocate(1) move X(0),Y(3) move X(10),Y(0) move X(255),Y(15) pl_ret pl_code global ma_test_move_y_x call_c fast Allocate(1) move Y(0),X(0) move Y(10),X(31) move Y(23),X(12) pl_ret pl_code global ma_test_arg_int call_c fast test_arg_int1(12,-1,4095,123456789) pl_ret pl_code global ma_test_arg_double call_c fast test_arg_double1(12.456,-1.3e-102,-3.141593) pl_ret pl_code global ma_test_arg_string call_c fast test_arg_string1("a string","abcd\01489d\37711ef\n\r") pl_ret pl_code global ma_test_arg_mem_l call_c fast test_arg_mem_l1(ma_local_var2,ma_global_var2,&test_arg_mem_l,ma_array(0),ma_array(4097),&ma_array(4500)) pl_ret pl_code global ma_test_arg_x call_c fast test_arg_x1(X(0),&X(0),X(255),&X(128)) pl_ret pl_code global ma_test_arg_y call_c fast Allocate(1) call_c fast test_arg_y1(Y(0),&Y(0),Y(12),&Y(6)) pl_ret pl_code global ma_test_arg_fl_array call_c fast Allocate(1) call_c fast test_arg_fl_array1(FL(0),FL(10),&FL(0),&FL(56)) pl_ret pl_code global ma_test_arg_fd_array call_c fast Allocate(1) call_c fast test_arg_fd_array1(FD(0),FD(47),&FD(0),&FD(127)) pl_ret pl_code global ma_test_call_c_lot_args call_c fast Allocate(1) call_c fast test_call_c_lot_args1(0,0,0,0,0,0,&test_call_c_lot_args,ma_local_var2,4095,123456789,-3.141593,"abcd\01489def\n\r",X(0),&X(0),X(255),&X(128),Y(0),&Y(0),Y(12),&Y(6), 1.23456) pl_ret pl_code global ma_test_jump_ret call_c fast test_jump_ret1(&ma_test_jump_ret1) jump_ret pl_ret pl_code global ma_test_jump_ret1 call_c fast test_jump_ret2() pl_ret pl_code global ma_test_fail_ret call_c fast test_fail_ret1() fail_ret pl_ret pl_code global ma_test_move_ret_mem call_c fast test_move_ret_mem1() move_ret ma_global_var1 call_c fast test_move_ret_mem1() move_ret ma_array(64) call_c fast test_move_ret_mem1() move_ret ma_array(4097) pl_ret pl_code global ma_test_move_ret_x call_c fast test_move_ret_x1() move_ret X(0) call_c fast test_move_ret_x1() move_ret X(255) pl_ret pl_code global ma_test_move_ret_y call_c fast Allocate(1) call_c fast test_move_ret_y1() move_ret Y(0) call_c fast test_move_ret_y1() move_ret Y(11) pl_ret pl_code global ma_test_move_ret_fl call_c fast Allocate(1) call_c fast test_move_ret_fl1() move_ret FL(0) call_c fast test_move_ret_fl1() move_ret FL(11) pl_ret pl_code global ma_test_move_ret_fd call_c fast Allocate(1) call_c fast test_move_ret_fd1() move_ret FD(0) call_c fast test_move_ret_fd1() move_ret FD(11) pl_ret pl_code global ma_test_switch_ret call_c fast test_switch_ret1() switch_ret (0=sl0,4=sl1,15=sl2,4095=sl3,123456=sl4,2456789=sl5) sl0: call_c fast test_switch_ret2(0) pl_ret sl1: call_c fast test_switch_ret2(1) pl_ret sl2: call_c fast test_switch_ret2(2) pl_ret sl3: call_c fast test_switch_ret2(3) pl_ret sl4: call_c fast test_switch_ret2(4) pl_ret sl5: call_c fast test_switch_ret2(5) pl_ret ; ma_array must be just before ma_global_var1 (in alphabetic order) long global ma_array(5000) long global ma_global_var1 long global ma_global_var2 = 12345 long local ma_local_var1 long local ma_local_var2 = 128 ./gprolog-1.3.0/src/Ma2Asm/mips_irix.c0000644004425400513100000010621510547154142016017 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : mips_irix.c * * Descr.: translation file for IRIX on MIPS * * Author: Alexander Diemand, Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: mips_irix.c,v 1.10 2007/01/04 10:35:14 diaz Exp $ */ #include #include #include #include /*---------------------------------* * Constants * *---------------------------------*/ #define STRING_PREFIX ".LC" #define MAX_C_ARGS_IN_C_CODE 32 /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ char asm_reg_bank[16]; char asm_reg_e[16]; char asm_reg_b[16]; char asm_reg_cp[16]; int w_label = 0; static char dbl_arg_buffer[8192] = "\0"; /* a temp buffer for the double arguments */ char act_routine[512] = "\0"; /* remembers the actual routine we are building */ int inPrologCode = 0; /* whether we are currently compiling a prolog code */ /* variables for ma_parser.c / ma2asm.c */ char *comment_prefix = "#"; char *local_symb_prefix = ".L"; int strings_need_null = 1; int call_c_reverse_args = 0; char *inline_asm_data[] = { NULL }; /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * INLINED CODE * * * *-------------------------------------------------------------------------*/ /* all %s will be replaced with the function's name * all %d will be replaced with the current nb_inlines */ static long nb_inlines = 0; static char *def_inlines[] = { /* name code */ 0, 0 /* end of list */ }; /*-------------------------------------------------------------------------* * MAKE_INLINE * * * *-------------------------------------------------------------------------*/ /* when it finds a function to inline it will do so immediatly and return 1 * else it fails and returns 0 */ static int make_inline(char *fct_name, int nb_args) { char *fp; int counter; return 0; /* not yet */ /* user can set an environment variable to control this */ if (!getenv("GPROLOG_ASM_INLINE")) return 0; counter = 0; while (def_inlines[counter]) { if (strcmp(fct_name, def_inlines[counter]) == 0) { /* found code to inline, emit */ fp = def_inlines[++counter]; while (*fp != '\0') { if (*fp == '%' && *(fp + 1) == 's') { String_Out(fct_name); fp++; } else if (*fp == '%' && *(fp + 1) == 'd') { Int_Out(nb_inlines); fp++; } else { Char_Out(*fp); } fp++; } nb_inlines++; return 1; } counter++; } return 0; } /*-------------------------------------------------------------------------* * ASM_START * * * *-------------------------------------------------------------------------*/ void Asm_Start(void) { #ifdef MAP_REG_BANK sprintf(asm_reg_bank, "%s", MAP_REG_BANK); #else strcpy(asm_reg_bank, "$16"); #endif #ifdef MAP_REG_E sprintf(asm_reg_e, "%s", MAP_REG_E); #else /* strcpy(asm_reg_e,"$21"); */ sprintf(asm_reg_e, "%d(%s)", MAP_OFFSET_E, asm_reg_bank); #endif #ifdef MAP_REG_B sprintf(asm_reg_b, "%s", MAP_REG_B); #else /* sprintf(asm_reg_b,"$18"); */ sprintf(asm_reg_b, "%d(%s)", MAP_OFFSET_B, asm_reg_bank); #endif #ifdef MAP_REG_CP sprintf(asm_reg_cp, "%s", MAP_REG_CP); #else /* sprintf(asm_reg_cp,"$20"); */ sprintf(asm_reg_cp, "%d(%s)", MAP_OFFSET_CP, asm_reg_bank); #endif Inst_Printf(".option", "pic2"); /* gcc uses this */ Inst_Printf("#.set", "noat"); Inst_Printf("#.set", "noreorder"); /* let the assembler reorder instructions */ Inst_Printf("# asm_reg_bank ", asm_reg_bank); Inst_Printf("# asm_reg_e ", asm_reg_e); Inst_Printf("# asm_reg_b ", asm_reg_b); Inst_Printf("# asm_reg_cp ", asm_reg_cp); Label_Printf("\t.section\t.text"); } /*-------------------------------------------------------------------------* * ASM_STOP * * * *-------------------------------------------------------------------------*/ void Asm_Stop(void) { /* we are printing the fixed doubles at the end of the file, * they will appear in the data section */ if (dbl_arg_buffer[0] != '\0') { Label_Printf(".section\t.rodata"); Label_Printf(dbl_arg_buffer); dbl_arg_buffer[0] = '\0'; } } /*-------------------------------------------------------------------------* * CODE_START * * * *-------------------------------------------------------------------------*/ void Code_Start(char *label, int prolog, int global) { if (act_routine[0] != '\0') Code_Stop(); /* we first have to close the previous code */ Inst_Printf(".text", ""); Inst_Printf(".align", "2"); Inst_Printf(".ent", "%s", label); if (global) Inst_Printf(".globl", "%s", label); Label(label); /* remember this label */ strcpy(act_routine, label); if (prolog) { /* prolog code does not need any stack space */ inPrologCode = 1; Inst_Printf(".frame", "$sp,0,$31"); Inst_Printf(".mask", "0x00000000,0"); Inst_Printf(".fmask", "0x00000000,0"); } else { /* for c code we need to save some registers */ inPrologCode = 0; /* */ Inst_Printf(".frame", "$sp,%d,$31", MAX_C_ARGS_IN_C_CODE * 8 + 16); Inst_Printf(".mask", "0x10000000,-16"); Inst_Printf(".fmask", "0x00000000,0"); Inst_Printf("subu", "$sp,$sp,%d", MAX_C_ARGS_IN_C_CODE * 8 + 16); Inst_Printf("sd", "$gp,%d($sp)", MAX_C_ARGS_IN_C_CODE * 8 + 8); Inst_Printf("sd", "$31,%d($sp)", MAX_C_ARGS_IN_C_CODE * 8 + 0); } } /*-------------------------------------------------------------------------* * CODE_STOP * * * *-------------------------------------------------------------------------*/ void Code_Stop(void) { Inst_Printf(".end", "%s", act_routine); act_routine[0] = '\0'; } /*-------------------------------------------------------------------------* * LABEL * * * *-------------------------------------------------------------------------*/ void Label(char *label) { Label_Printf("\n%s:", label); } /*-------------------------------------------------------------------------* * RELOAD_E_IN_REGISTER * * * *-------------------------------------------------------------------------*/ void Reload_E_In_Register(void) { } /*-------------------------------------------------------------------------* * PL_JUMP * * * *-------------------------------------------------------------------------*/ void Pl_Jump(char *label) { Inst_Printf("la", "$25,%s", label); Inst_Printf("j", "$25"); } /*-------------------------------------------------------------------------* * PREP_CP * * * *-------------------------------------------------------------------------*/ void Prep_CP(void) { #ifdef MAP_REG_CP Inst_Printf("la", "%s,.Lcont%d", asm_reg_cp, w_label); /* CP = .Lcont%d */ #else Inst_Printf("la", "$13,.Lcont%d", w_label); Inst_Printf("sw", "$13,%s", asm_reg_cp); /* CP = .Lcont%d */ #endif } /*-------------------------------------------------------------------------* * HERE_CP * * * *-------------------------------------------------------------------------*/ void Here_CP(void) { Label_Printf(".Lcont%d:", w_label++); } /*-------------------------------------------------------------------------* * PL_CALL * * * *-------------------------------------------------------------------------*/ void Pl_Call(char *label) { Prep_CP(); Pl_Jump(label); Here_CP(); } /*-------------------------------------------------------------------------* * PL_FAIL * * * *-------------------------------------------------------------------------*/ void Pl_Fail(void) { #ifdef MAP_REG_B Inst_Printf("lw", "$25,-4(%s)", asm_reg_b); #else Inst_Printf("lw", "$13,%s", asm_reg_b); Inst_Printf("lw", "$25,-4($13)"); #endif Inst_Printf("j", "$25"); } /*-------------------------------------------------------------------------* * PL_RET * * * *-------------------------------------------------------------------------*/ void Pl_Ret(void) { Inst_Printf(".align", "3"); Inst_Printf("# nop", ""); /* I don't really know why, but it helps ;-) */ #ifdef MAP_REG_CP Inst_Printf("move", "$25,%s", asm_reg_cp); #else Inst_Printf("lw", "$25,%s", asm_reg_cp); #endif Inst_Printf("j", "$25"); } /*-------------------------------------------------------------------------* * JUMP * * * *-------------------------------------------------------------------------*/ void Jump(char *label) { Inst_Printf("la", "$25,%s", label); Inst_Printf("j", "$25"); } /*-------------------------------------------------------------------------* * MOVE_FROM_REG_X * * * *-------------------------------------------------------------------------*/ void Move_From_Reg_X(int index) { Inst_Printf("lw", "$24,%d(%s)", 4 * index, asm_reg_bank); /* asm_reg_bank */ } /*-------------------------------------------------------------------------* * MOVE_FROM_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_From_Reg_Y(int index) { #ifdef MAP_REG_E Inst_Printf("lw", "$24,%d(%s)", Y_OFFSET(index), asm_reg_e); #else Inst_Printf("lw", "$13,%s", asm_reg_e); Inst_Printf("lw", "$24,%d($13)", Y_OFFSET(index)); #endif } /*-------------------------------------------------------------------------* * MOVE_TO_REG_X * * * *-------------------------------------------------------------------------*/ void Move_To_Reg_X(int index) { Inst_Printf("sw", "$24,%d(%s)", 4 * index, asm_reg_bank); } /*-------------------------------------------------------------------------* * MOVE_TO_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_To_Reg_Y(int index) { #ifdef MAP_REG_E Inst_Printf("sw", "$24,%d(%s)", Y_OFFSET(index), asm_reg_e); #else Inst_Printf("lw", "$13,%s", asm_reg_e); Inst_Printf("sw", "$24,%d($13)", Y_OFFSET(index)); #endif } /*-------------------------------------------------------------------------* * CALL_C_START * * * *-------------------------------------------------------------------------*/ void Call_C_Start(char *fct_name, int fc, int nb_args, int nb_args_in_words, char **p_inline) { } /*-------------------------------------------------------------------------* * CALL_C_ARG_INT * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Int(int offset, long int_val) { switch (offset) { case 0: Inst_Printf("li", "$4,%d", int_val); break; case 1: Inst_Printf("li", "$5,%d", int_val); break; case 2: Inst_Printf("li", "$6,%d", int_val); break; case 3: Inst_Printf("li", "$7,%d", int_val); break; case 4: Inst_Printf("li", "$8,%d", int_val); break; case 5: Inst_Printf("li", "$9,%d", int_val); break; case 6: Inst_Printf("li", "$10,%d", int_val); break; case 7: Inst_Printf("li", "$11,%d", int_val); break; default: Inst_Printf("li", "$24,%d", int_val); Inst_Printf("sw", "$24,%d($sp)", (offset - 8) * 8 + 4); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_DOUBLE * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Double(int offset, double dbl_val) { char buf[1024]; sprintf(buf, "\t.align 3\n.LD%d:\n\t.double %1.20e\n", w_label++, dbl_val); strcat(dbl_arg_buffer, buf); Inst_Printf("la", "$24,.LD%d", (w_label - 1)); switch (offset) { case 0: Inst_Printf("l.d", "$f12,($24)"); break; case 1: Inst_Printf("l.d", "$f13,($24)"); break; case 2: Inst_Printf("l.d", "$f14,($24)"); break; case 3: Inst_Printf("l.d", "$f15,($24)"); break; case 4: Inst_Printf("l.d", "$f16,($24)"); break; case 5: Inst_Printf("l.d", "$f17,($24)"); break; case 6: Inst_Printf("l.d", "$f18,($24)"); break; case 7: Inst_Printf("l.d", "$f19,($24)"); break; default: Inst_Printf("l.d", "$f1,($24)"); Inst_Printf("s.d", "$f1,%d($sp)", (offset - 8) * 8); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_STRING * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_String(int offset, int str_no) { switch (offset) { case 0: Inst_Printf("la", "$4,%s%d", STRING_PREFIX, str_no); break; case 1: Inst_Printf("la", "$5,%s%d", STRING_PREFIX, str_no); break; case 2: Inst_Printf("la", "$6,%s%d", STRING_PREFIX, str_no); break; case 3: Inst_Printf("la", "$7,%s%d", STRING_PREFIX, str_no); break; case 4: Inst_Printf("la", "$8,%s%d", STRING_PREFIX, str_no); break; case 5: Inst_Printf("la", "$9,%s%d", STRING_PREFIX, str_no); break; case 6: Inst_Printf("la", "$10,%s%d", STRING_PREFIX, str_no); break; case 7: Inst_Printf("la", "$11,%s%d", STRING_PREFIX, str_no); break; default: Inst_Printf("la", "$24,%s%d", STRING_PREFIX, str_no); Inst_Printf("sw", "$24,%d($sp)", (offset - 8) * 8 + 4); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_MEM_L * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Mem_L(int offset, int adr_of, char *name, int index) { char dest[8]; switch (offset) { case 0: sprintf(dest, "%s", "$4"); break; case 1: sprintf(dest, "%s", "$5"); break; case 2: sprintf(dest, "%s", "$6"); break; case 3: sprintf(dest, "%s", "$7"); break; case 4: sprintf(dest, "%s", "$8"); break; case 5: sprintf(dest, "%s", "$9"); break; case 6: sprintf(dest, "%s", "$10"); break; case 7: sprintf(dest, "%s", "$11"); break; default: sprintf(dest, "%s", "$24"); break; } if (!adr_of) { Inst_Printf("la", "$25,%s", name); Inst_Printf("lw", "%s,%d($25)", dest, index * 4); } else { Inst_Printf("la", "%s,%s+%d", dest, name, index * 4); } if (offset > 7) { Inst_Printf("sw", "%s,%d($sp)", dest, (offset - 8) * 8 + 4); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_REG_X * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Reg_X(int offset, int adr_of, int index) { char dest[8]; switch (offset) { case 0: sprintf(dest, "%s", "$4"); break; case 1: sprintf(dest, "%s", "$5"); break; case 2: sprintf(dest, "%s", "$6"); break; case 3: sprintf(dest, "%s", "$7"); break; case 4: sprintf(dest, "%s", "$8"); break; case 5: sprintf(dest, "%s", "$9"); break; case 6: sprintf(dest, "%s", "$10"); break; case 7: sprintf(dest, "%s", "$11"); break; default: sprintf(dest, "%s", "$24"); break; } if (!adr_of) { Inst_Printf("lw", "%s,%d(%s)", dest, index * 4, asm_reg_bank); } else { if (index == 0) { Inst_Printf("move", "%s,%s", dest, asm_reg_bank); } else { Inst_Printf("la", "%s,%d(%s)", dest, index * 4, asm_reg_bank); } } if (offset > 7) { Inst_Printf("sw", "%s,%d($sp)", dest, (offset - 8) * 8 + 4); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_REG_Y * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Reg_Y(int offset, int adr_of, int index) { char dest[8]; switch (offset) { case 0: sprintf(dest, "%s", "$4"); break; case 1: sprintf(dest, "%s", "$5"); break; case 2: sprintf(dest, "%s", "$6"); break; case 3: sprintf(dest, "%s", "$7"); break; case 4: sprintf(dest, "%s", "$8"); break; case 5: sprintf(dest, "%s", "$9"); break; case 6: sprintf(dest, "%s", "$10"); break; case 7: sprintf(dest, "%s", "$11"); break; default: sprintf(dest, "%s", "$24"); break; } if (!adr_of) { #ifdef MAP_REG_E Inst_Printf("lw", "%s,%d(%s)", dest, Y_OFFSET(index), asm_reg_e); #else Inst_Printf("lw", "$12,%s", asm_reg_e); Inst_Printf("lw", "%s,%d($12)", dest, Y_OFFSET(index)); #endif } else { #ifdef MAP_REG_E Inst_Printf("la", "%s,%d(%s)", dest, Y_OFFSET(index), asm_reg_e); #else Inst_Printf("lw", "$12,%s", asm_reg_e); Inst_Printf("la", "%s,%d($12)", dest, Y_OFFSET(index)); #endif } if (offset > 7) { Inst_Printf("sw", "%s,%d($sp)", dest, (offset - 8) * 8 + 4); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_FOREIGN_L * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Foreign_L(int offset, int adr_of, int index) { char dest[8]; switch (offset) { case 0: sprintf(dest, "%s", "$4"); break; case 1: sprintf(dest, "%s", "$5"); break; case 2: sprintf(dest, "%s", "$6"); break; case 3: sprintf(dest, "%s", "$7"); break; case 4: sprintf(dest, "%s", "$8"); break; case 5: sprintf(dest, "%s", "$9"); break; case 6: sprintf(dest, "%s", "$10"); break; case 7: sprintf(dest, "%s", "$11"); break; default: sprintf(dest, "%s", "$24"); break; } Inst_Printf("la", "$2,foreign_long"); if (!adr_of) { Inst_Printf("lw", "%s,%d($2)", dest, index * 4); } else { Inst_Printf("la", "%s,%d($2)", dest, index * 4); } if (offset > 7) { Inst_Printf("sw", "%s,%d($sp)", dest, (offset - 8) * 8 + 4); } return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_FOREIGN_D * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Foreign_D(int offset, int adr_of, int index) { char dest[8]; if (adr_of) { switch (offset) { case 0: sprintf(dest, "%s", "$4"); break; case 1: sprintf(dest, "%s", "$5"); break; case 2: sprintf(dest, "%s", "$6"); break; case 3: sprintf(dest, "%s", "$7"); break; case 4: sprintf(dest, "%s", "$8"); break; case 5: sprintf(dest, "%s", "$9"); break; case 6: sprintf(dest, "%s", "$10"); break; case 7: sprintf(dest, "%s", "$11"); break; default: sprintf(dest, "%s", "$24"); break; } Inst_Printf("la", "%s,foreign_double", dest); Inst_Printf("addu", "%s,%s,%d", dest, dest, index * 8); if (offset > 7) { Inst_Printf("sw", "%s,%d($sp)", dest, (offset - 8) * 8); } return 1; } else { switch (offset) { case 0: sprintf(dest, "%s", "$f12"); break; case 1: sprintf(dest, "%s", "$f13"); break; case 2: sprintf(dest, "%s", "$f14"); break; case 3: sprintf(dest, "%s", "$f15"); break; case 4: sprintf(dest, "%s", "$f16"); break; case 5: sprintf(dest, "%s", "$f17"); break; case 6: sprintf(dest, "%s", "$f18"); break; case 7: sprintf(dest, "%s", "$f19"); break; default: sprintf(dest, "%s", "$f1"); break; } Inst_Printf("la", "$25,foreign_double"); Inst_Printf("l.d", "%s,%d($25)", dest, index * 8); if (offset > 7) { Inst_Printf("s.d", "%s,%d($sp)", dest, (offset - 8) * 8); } return 1; } } /*-------------------------------------------------------------------------* * CALL_C_INVOKE * * * *-------------------------------------------------------------------------*/ void Call_C_Invoke(char *fct_name, int fc, int nb_args, int nb_args_in_words) { /* if (!make_inline (fct_name, nb_args)) { */ Inst_Printf("sd", "$gp,%d($sp)", MAX_C_ARGS_IN_C_CODE * 8 + 8); Inst_Printf("sd", "$31,%d($sp)", MAX_C_ARGS_IN_C_CODE * 8); Inst_Printf("la", "$25,%s", fct_name); Inst_Printf("jal", "$25"); Inst_Printf("ld", "$gp,%d($sp)", MAX_C_ARGS_IN_C_CODE * 8 + 8); Inst_Printf("ld", "$31,%d($sp)", MAX_C_ARGS_IN_C_CODE * 8); /* } */ } /*-------------------------------------------------------------------------* * CALL_C_STOP * * * *-------------------------------------------------------------------------*/ void Call_C_Stop(char *fct_name, int nb_args, char **p_inline) { } /*-------------------------------------------------------------------------* * JUMP_RET * * * *-------------------------------------------------------------------------*/ void Jump_Ret(void) { Inst_Printf("move", "$25,$2"); Inst_Printf("j", "$25"); } /*-------------------------------------------------------------------------* * FAIL_RET * * * *-------------------------------------------------------------------------*/ void Fail_Ret(void) { Inst_Printf("bne", "$2,$0,.Lcont%d", w_label); Pl_Fail(); Label_Printf(".Lcont%d:", w_label++); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_MEM_L * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Mem_L(char *name, int index) { Inst_Printf("la", "$13,%s", name); Inst_Printf("sw", "$2,%d($13)", index * 4); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_REG_X * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Reg_X(int index) { /* same as Move_To_Reg_X */ Inst_Printf("sw", "$2,%d(%s)", index * 4, asm_reg_bank); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Reg_Y(int index) { /* same as Move_To_Reg_Y */ #ifdef MAP_REG_E Inst_Printf("sw", "$2,%d(%s)", Y_OFFSET(index), asm_reg_e); #else Inst_Printf("lw", "$13,%s", asm_reg_e); Inst_Printf("sw", "$2,%d($13)", Y_OFFSET(index)); #endif } /*-------------------------------------------------------------------------* * MOVE_RET_TO_FOREIGN_L * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Foreign_L(int index) { Inst_Printf("la", "$13,foreign_long"); Inst_Printf("sw", "$2,%d($13)", index * 4); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_FOREIGN_D * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Foreign_D(int index) { Inst_Printf("la", "$13,foreign_double"); Inst_Printf("s.d", "$f0,%d($13)", index * 8); } /*-------------------------------------------------------------------------* * CMP_RET_AND_INT * * * *-------------------------------------------------------------------------*/ void Cmp_Ret_And_Int(long int_val) { Inst_Printf("li", "$24,%d", int_val); Inst_Printf("sub", "$12,$2,$24"); /* $2 - $24 -> $12 */ } /*-------------------------------------------------------------------------* * JUMP_IF_EQUAL * * * *-------------------------------------------------------------------------*/ void Jump_If_Equal(char *label) { Inst_Printf("beqz", "$12,%s", label); /* $2 == 0 */ } /*-------------------------------------------------------------------------* * JUMP_IF_GREATER * * * *-------------------------------------------------------------------------*/ void Jump_If_Greater(char *label) { /* this is based on the comparison we did with Cmp_Ret_And_Int */ /* means this is more or less a Jump_If_Not_Equal ! */ Inst_Printf("bgtz", "$12,%s", label); /* $3 == 1 */ } /*-------------------------------------------------------------------------* * C_RET * * * *-------------------------------------------------------------------------*/ void C_Ret(void) { Inst_Printf("ld", "$gp,%d($sp)", MAX_C_ARGS_IN_C_CODE * 8 + 8); Inst_Printf("ld", "$31,%d($sp)", MAX_C_ARGS_IN_C_CODE * 8 + 0); Inst_Printf("addiu", "$sp,$sp,%d", MAX_C_ARGS_IN_C_CODE * 8 + 16); Inst_Printf("j", "$31"); } /*-------------------------------------------------------------------------* * DICO_STRING_START * * * *-------------------------------------------------------------------------*/ void Dico_String_Start(int nb_consts) { Label_Printf(".section\t.rodata"); Inst_Printf(".align", "3"); } /*-------------------------------------------------------------------------* * DICO_STRING * * * *-------------------------------------------------------------------------*/ void Dico_String(int str_no, char *asciiz) { Label_Printf("%s%d:", STRING_PREFIX, str_no); Inst_Printf(".ascii", "%s", asciiz); } /*-------------------------------------------------------------------------* * DICO_STRING_STOP * * * *-------------------------------------------------------------------------*/ void Dico_String_Stop(int nb_consts) { } /*-------------------------------------------------------------------------* * DICO_LONG_START * * * *-------------------------------------------------------------------------*/ void Dico_Long_Start(int nb_longs) { Label_Printf(".section\t.sdata"); Inst_Printf(".align", "3"); } /*-------------------------------------------------------------------------* * DICO_LONG * * * *-------------------------------------------------------------------------*/ void Dico_Long(char *name, int global, VType vtype, long value) { switch (vtype) { case NONE: value = 1; /* then in case ARRAY_SIZE */ case ARRAY_SIZE: Label_Printf(".section\t.bss"); if (!global) { Label_Printf("%s:", name); Inst_Printf(".align", "3"); Inst_Printf(".space", "%d", value * 4); /* Inst_Printf(".popsection",""); */ } else { Inst_Printf(".comm", "%s,%d", name, value * 4); } break; case INITIAL_VALUE: Label_Printf(".section\t.rodata"); if (global) { Inst_Printf(".globl", "%s", name); Inst_Printf(".align", "3"); Inst_Printf(".size", "%s,4", name); Label_Printf("%s:", name); Inst_Printf(".word", "%d", value); } else { Inst_Printf(".align", "3"); Inst_Printf(".size", "%s,4", name); Label_Printf("%s:", name); Inst_Printf(".word", "%d", value); } break; } } /*-------------------------------------------------------------------------* * DICO_LONG_STOP * * * *-------------------------------------------------------------------------*/ void Dico_Long_Stop(int nb_longs) { } /*-------------------------------------------------------------------------* * DATA_START * * * *-------------------------------------------------------------------------*/ void Data_Start(char *initializer_fct) { /* last routine has to be closed first */ if (act_routine[0] != '\0') { Inst_Printf("j", "$31"); Inst_Printf(".end", "%s", act_routine); act_routine[0] = '\0'; } if (initializer_fct == NULL) return; Inst_Printf(".section", ".ctors,\"aw\",@progbits"); Inst_Printf(".word", "%s", initializer_fct); } /*-------------------------------------------------------------------------* * DATA_STOP * * * *-------------------------------------------------------------------------*/ void Data_Stop(char *initializer_fct) { } ./gprolog-1.3.0/src/Ma2Asm/MA_SYNTAX0000644004425400513100000000317107461774024015203 0ustar diazlocoma::= code... code::= prolog_code | c_code | decl | comment comment::= ';' ... '\n' prolog_code::= 'pl_code' ( 'local' | 'global' ) label inst... c_code::= 'c_code' ( 'initializer' | 'local' | 'global' ) label inst... inst::= 'pl_jump' pl_label Prolog jump to a predicate 'pl_call' pl_label Prolog call a predicate 'pl_fail' Prolog fail 'pl_ret' Prolog return label ':' declare a label 'jump' label jump to a label 'move' reg1 ',' reg2 move wam reg1 to reg2 'prep_cp' save in CP address of next here_cp 'here_cp' define the address of prev prep_cp 'call_c' [ 'fast' ] fct_name '(' fct_arg ','...')' call a C function (fc = fast call) 'jump_ret' jump at the returned value 'fail_ret' if returned value==0 then 'pl_fail' 'move_ret' ( mem | reg | f_array ) move returned value 'switch_ret' '(' swt_arg '=' label ',' ...) switch on returned value else 'pl_fail' 'c_ret' C return decl::= 'long' ( 'local' | 'global' ) ident [ '=' integer | '(' integer ')' ] fct_arg::= integer | float | string | & label NB: & label = special case of & mem | [ '&' ] mem | [ '&' ] reg | [ '&' ] f_array swt_arg::= mem | integer fct_name::= ident label ::= ident pl_label::= ident mem ::= ident [ '(' integer ')' ] *** Tokens *** ident ::= C identifier integer ::= C int float ::= C double string ::= C string reg ::= ( 'X' | 'Y' ) '(' integer ')' WAM X/Y reg f_array ::= ( 'FL' | 'FD' ) '(' integer ')' foreign long/double array element ./gprolog-1.3.0/src/Ma2Asm/x86_64_any.c0000644004425400513100000007144710547152474015637 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : x86_64_any.c * * Descr.: translation file for Linux on AMD x86-64 * * Author: Gwenole Beauchesne * * * * Copyright (C) 2002 Gwenole Beauchesne * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: x86_64_any.c,v 1.5 2006/12/15 16:11:29 diaz Exp $ */ #include #include #include #include /* For M_x86_64_linux: an important point is that C stack must be aligned * on 16 bytes else some problems occurs with double. * If this is not done and if the called function performs a movaps %xmm0,xx * an error will occur. * Just before calling a function %rsp is 16bytes aligned, %rsp = 0x...0 * (4 low bits = 0). The callq instruction pushes the return address, so at * the entry of a function, %rsp is 0x...8. Gcc then adjusts (via subq) * %rsp to be 0x...0 before calling a function. We mimic the same modifying * Call_Compiled to force %rsp to be 0x...0 when arriving in a Prolog code. * So a Prolog code can call C functions safely. * When a Prolog code finishes it returns into C inside Call_Prolog_Success * or Call_Prolog_Fail. In both functions we re-adjust the stack (gcc thinks * %rsp = 0x...8 while it is 0x...0): after the gcc adjustment code we * force %rsp to be 0x...0. * For MA c_code (MA code called by a C function), we have to reserve enough * space in the stack to pass args to C functions. We receive %rsp = 0x...c * In addition we have to push 1 register (%rbx) * Thus 0x...8 - 8 = 0x...0 : OK ! We have to sub to %rsp the space for * MAX_C_ARGS_IN_C_CODE*8 (this is OK if MAX_C_ARGS_IN_C_CODE is a multiple * of 2). So we have to reserve: MAX_C_ARGS_IN_C_CODE * 8. */ /*---------------------------------* * Constants * *---------------------------------*/ #define STRING_PREFIX ".LC" #define DOUBLE_PREFIX ".LCD" #define MAX_C_ARGS_IN_C_CODE 32 /* must be a multiple of 2 */ #define RESERVED_STACK_SPACE MAX_C_ARGS_IN_C_CODE * 8 #define MAX_DOUBLES_IN_PRED 2048 /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static double dbl_tbl[MAX_DOUBLES_IN_PRED]; static int nb_dbl = 0; static int dbl_lc_no = 0; char asm_reg_e[16]; char asm_reg_b[16]; char asm_reg_cp[16]; int w_label = 0; #define MAX_GPR_ARGS 6 static int gpr_arg_no; static const char *gpr_arg[MAX_GPR_ARGS] = { "%rdi", "%rsi", "%rdx", "%rcx", "%r8", "%r9" }; #define MAX_FPR_ARGS 8 static int fpr_arg_no; static const char *fpr_arg[MAX_FPR_ARGS] = { "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7" }; /* variables for ma_parser.c / ma2asm.c */ char *comment_prefix = "#"; char *local_symb_prefix = ".L"; int strings_need_null = 0; int call_c_reverse_args = 0; char *inline_asm_data[] = { NULL }; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static char *Off_Reg_Bank(int offset); #define LITTLE_INT(X) ((X) >= INT_MIN && (X) <= INT_MAX) /*-------------------------------------------------------------------------* * ASM_START * * * *-------------------------------------------------------------------------*/ void Asm_Start(void) { #ifdef NO_MACHINE_REG_FOR_REG_BANK #define ASM_REG_BANK "reg_bank" #elif defined(MAP_REG_BANK) #define ASM_REG_BANK "%" MAP_REG_BANK #else #define ASM_REG_BANK "%r12" #endif #ifdef MAP_REG_E sprintf(asm_reg_e, "%%%s", MAP_REG_E); #else strcpy(asm_reg_e, "%rbx"); #endif #ifdef MAP_REG_B sprintf(asm_reg_b, "%%%s", MAP_REG_B); #else strcpy(asm_reg_b, Off_Reg_Bank(MAP_OFFSET_B)); #endif #ifdef MAP_REG_CP sprintf(asm_reg_cp, "%%%s", MAP_REG_CP); #else strcpy(asm_reg_cp, Off_Reg_Bank(MAP_OFFSET_CP)); #endif Label_Printf(".text"); Label("fail"); Pl_Fail(); } /*-------------------------------------------------------------------------* * OFF_REG_BANK * * * *-------------------------------------------------------------------------*/ static char * Off_Reg_Bank(int offset) { static char str[16]; #ifdef NO_MACHINE_REG_FOR_REG_BANK sprintf(str, ASM_REG_BANK "+%d", offset); #else sprintf(str, "%d(%s)", offset, ASM_REG_BANK); #endif return str; } /*-------------------------------------------------------------------------* * ASM_STOP * * * *-------------------------------------------------------------------------*/ void Asm_Stop(void) { #ifdef __ELF__ Inst_Printf(".section", ".note.GNU-stack,\"\",@progbits"); #endif } /*-------------------------------------------------------------------------* * CODE_START * * * *-------------------------------------------------------------------------*/ void Code_Start(char *label, int prolog, int global) { int i; int x = dbl_lc_no - nb_dbl; for (i = 0; i < nb_dbl; i++) { union { double d; unsigned int w[2]; } dbl = { .d = dbl_tbl[i] }; Label_Printf("%s%d:", DOUBLE_PREFIX, x++); Inst_Printf(".long", "%d", dbl.w[0]); Inst_Printf(".long", "%d", dbl.w[1]); } nb_dbl = 0; Label_Printf(""); Inst_Printf(".align", "16"); Inst_Printf(".type", "%s,@function", label); if (global) Inst_Printf(".globl", "%s", label); Label(label); if (!prolog) { /* Save callee-saved registers. However, don't explicitly preserve %r12-%r15 since they are already handled as global -ffixed ones. */ Inst_Printf("pushq", "%%rbx"); Inst_Printf("subq", "$%d,%%rsp", RESERVED_STACK_SPACE); } } /*-------------------------------------------------------------------------* * CODE_STOP * * * *-------------------------------------------------------------------------*/ void Code_Stop(void) { } /*-------------------------------------------------------------------------* * LABEL * * * *-------------------------------------------------------------------------*/ void Label(char *label) { Label_Printf(""); Label_Printf("%s:", label); } /*-------------------------------------------------------------------------* * RELOAD_E_IN_REGISTER * * * *-------------------------------------------------------------------------*/ void Reload_E_In_Register(void) { #ifndef MAP_REG_E Inst_Printf("movq", "%s,%s", Off_Reg_Bank(MAP_OFFSET_E), asm_reg_e); #endif } /*-------------------------------------------------------------------------* * PL_JUMP * * * *-------------------------------------------------------------------------*/ void Pl_Jump(char *label) { Inst_Printf("jmp", "%s", label); } /*-------------------------------------------------------------------------* * PREP_CP * * * *-------------------------------------------------------------------------*/ void Prep_CP(void) { Inst_Printf("movq", "$.Lcont%d,%s", w_label, asm_reg_cp); } /*-------------------------------------------------------------------------* * HERE_CP * * * *-------------------------------------------------------------------------*/ void Here_CP(void) { Label_Printf(".Lcont%d:", w_label++); } /*-------------------------------------------------------------------------* * PL_CALL * * * *-------------------------------------------------------------------------*/ void Pl_Call(char *label) { Prep_CP(); Pl_Jump(label); Here_CP(); } /*-------------------------------------------------------------------------* * PL_FAIL * * * *-------------------------------------------------------------------------*/ void Pl_Fail(void) { #ifdef MAP_REG_B Inst_Printf("jmp", "*-8(%s)", asm_reg_b); #else Inst_Printf("movq", "%s,%%rdx", asm_reg_b); Inst_Printf("jmp", "*-8(%%rdx)"); #endif } /*-------------------------------------------------------------------------* * PL_RET * * * *-------------------------------------------------------------------------*/ void Pl_Ret(void) { #ifndef MAP_REG_CP Inst_Printf("jmp", "*%s", asm_reg_cp); #else Inst_Printf("jmp", "%s", asm_reg_cp); #endif } /*-------------------------------------------------------------------------* * JUMP * * * *-------------------------------------------------------------------------*/ void Jump(char *label) { Inst_Printf("jmp", "%s", label); } /*-------------------------------------------------------------------------* * MOVE_FROM_REG_X * * * *-------------------------------------------------------------------------*/ void Move_From_Reg_X(int index) { Inst_Printf("movq", "%s,%%rdx", Off_Reg_Bank(index * 8)); } /*-------------------------------------------------------------------------* * MOVE_FROM_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_From_Reg_Y(int index) { Inst_Printf("movq", "%d(%s),%%rdx", Y_OFFSET(index), asm_reg_e); } /*-------------------------------------------------------------------------* * MOVE_TO_REG_X * * * *-------------------------------------------------------------------------*/ void Move_To_Reg_X(int index) { Inst_Printf("movq", "%%rdx,%s", Off_Reg_Bank(index * 8)); } /*-------------------------------------------------------------------------* * MOVE_TO_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_To_Reg_Y(int index) { Inst_Printf("movq", "%%rdx,%d(%s)", Y_OFFSET(index), asm_reg_e); } /*-------------------------------------------------------------------------* * CALL_C_START * * * *-------------------------------------------------------------------------*/ void Call_C_Start(char *fct_name, int fc, int nb_args, int nb_args_in_words, char **p_inline) { gpr_arg_no = 0; fpr_arg_no = 0; } #define BEFORE_ARG \ { \ char r[10], *r_aux; \ int r_eq_r_aux = 0; \ \ if (gpr_arg_no < MAX_GPR_ARGS) \ { \ strcpy(r, gpr_arg[gpr_arg_no++]); \ r_aux = r; \ r_eq_r_aux = 1; \ } \ else \ { \ int nwords = offset - gpr_arg_no - fpr_arg_no; \ \ sprintf(r, "%d(%%rsp)", nwords * 8); \ r_aux = "%rax"; \ } #define AFTER_ARG \ } #define BEFORE_FPR_ARG \ { \ char r[10], *r_aux; \ int r_eq_r_aux = 0; \ \ if (fpr_arg_no < MAX_FPR_ARGS) \ { \ strcpy(r, fpr_arg[fpr_arg_no++]); \ r_aux = r; \ r_eq_r_aux = 1; \ } \ else \ { \ int nwords = offset - gpr_arg_no - fpr_arg_no; \ \ sprintf(r, "%d(%%rsp)", nwords * 8); \ r_aux = "%xmm8"; \ } #define AFTER_FPR_ARG \ } /*-------------------------------------------------------------------------* * CALL_C_ARG_INT * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Int(int offset, long int_val) { BEFORE_ARG; if (LITTLE_INT(int_val)) Inst_Printf("movq", "$%ld,%s", int_val, r); else { Inst_Printf("movabsq", "$%ld,%s", int_val, r_aux); if (!r_eq_r_aux) Inst_Printf("movq", "%s,%s", r_aux, r); } AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_DOUBLE * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Double(int offset, double dbl_val) { BEFORE_FPR_ARG; dbl_tbl[nb_dbl++] = dbl_val; Inst_Printf("movsd", "%s%d(%%rip),%s", DOUBLE_PREFIX, dbl_lc_no++, r); AFTER_FPR_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_STRING * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_String(int offset, int str_no) { BEFORE_ARG; Inst_Printf("movq", "$%s%d,%s", STRING_PREFIX, str_no, r); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_MEM_L * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Mem_L(int offset, int adr_of, char *name, int index) { BEFORE_ARG; if (adr_of) Inst_Printf("movq", "$%s+%d,%s", name, index * 8, r); else { Inst_Printf("movq", "%s+%d(%%rip),%s", name, index * 8, r_aux); if (!r_eq_r_aux) Inst_Printf("movq", "%s,%s", r_aux, r); } AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_REG_X * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Reg_X(int offset, int adr_of, int index) { BEFORE_ARG; if (adr_of) { if (!r_eq_r_aux && index == 0) { #ifdef NO_MACHINE_REG_FOR_REG_BANK Inst_Printf("movq", "$%s,%s", ASM_REG_BANK, r); #else Inst_Printf("movq", "%s,%s", ASM_REG_BANK, r); #endif goto finish; } Inst_Printf("leaq", "%s,%s", Off_Reg_Bank(index * 8), r_aux); } else Inst_Printf("movq", "%s,%s", Off_Reg_Bank(index * 8), r_aux); if (!r_eq_r_aux) Inst_Printf("movq", "%s,%s", r_aux, r); finish: ; /* gcc3 does not like use of label at end of compound statement */ AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_REG_Y * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Reg_Y(int offset, int adr_of, int index) { BEFORE_ARG; if (adr_of) Inst_Printf("leaq", "%d(%s),%s", Y_OFFSET(index), asm_reg_e, r_aux); else Inst_Printf("movq", "%d(%s),%s", Y_OFFSET(index), asm_reg_e, r_aux); if (!r_eq_r_aux) Inst_Printf("movq", "%s,%s", r_aux, r); AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_FOREIGN_L * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Foreign_L(int offset, int adr_of, int index) { BEFORE_ARG; if (adr_of) Inst_Printf("movq", "$foreign_long+%d, %s", index * 8, r); else { Inst_Printf("movq", "foreign_long+%d(%%rip),%s", index * 8, r_aux); if (!r_eq_r_aux) Inst_Printf("movq", "%s, %s", r_aux, r); } AFTER_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_ARG_FOREIGN_D * * * *-------------------------------------------------------------------------*/ int Call_C_Arg_Foreign_D(int offset, int adr_of, int index) { if (adr_of) { BEFORE_ARG; Inst_Printf("movq", "$foreign_double+%d, %s", index * 8, r); AFTER_ARG; return 1; } BEFORE_FPR_ARG; Inst_Printf("movsd", "foreign_double+%d(%%rip),%s", index * 8, r_aux); if (!r_eq_r_aux) Inst_Printf("movsd", "%s, %s", r_aux, r); AFTER_FPR_ARG; return 1; } /*-------------------------------------------------------------------------* * CALL_C_INVOKE * * * *-------------------------------------------------------------------------*/ void Call_C_Invoke(char *fct_name, int fc, int nb_args, int nb_args_in_words) { Inst_Printf("call", "%s", fct_name); } /*-------------------------------------------------------------------------* * CALL_C_STOP * * * *-------------------------------------------------------------------------*/ void Call_C_Stop(char *fct_name, int nb_args, char **p_inline) { #ifndef MAP_REG_E if (p_inline && INL_ACCESS_INFO(p_inline)) reload_e = 1; #endif } /*-------------------------------------------------------------------------* * JUMP_RET * * * *-------------------------------------------------------------------------*/ void Jump_Ret(void) { Inst_Printf("jmp", "*%%rax"); } /*-------------------------------------------------------------------------* * FAIL_RET * * * *-------------------------------------------------------------------------*/ void Fail_Ret(void) { Inst_Printf("test", "%%rax,%%rax"); Inst_Printf("je", "fail"); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_MEM_L * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Mem_L(char *name, int index) { Inst_Printf("movq", "%%rax,%s+%d(%%rip)", name, index * 8); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_REG_X * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Reg_X(int index) { /* similar to Move_To_Reg_X */ Inst_Printf("movq", "%%rax,%s", Off_Reg_Bank(index * 8)); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_REG_Y * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Reg_Y(int index) { /* similar to Move_To_Reg_Y */ Inst_Printf("movq", "%%rax,%d(%s)", Y_OFFSET(index), asm_reg_e); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_FOREIGN_L * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Foreign_L(int index) { Inst_Printf("movq", "%%rax, foreign_long+%d(%%rip)", index * 8); } /*-------------------------------------------------------------------------* * MOVE_RET_TO_FOREIGN_D * * * *-------------------------------------------------------------------------*/ void Move_Ret_To_Foreign_D(int index) { Inst_Printf("movsd", "%%xmm0, foreign_double+%d(%%rip)", index * 8); } /*-------------------------------------------------------------------------* * CMP_RET_AND_INT * * * *-------------------------------------------------------------------------*/ void Cmp_Ret_And_Int(long int_val) { if (int_val == 0) Inst_Printf("testq", "%%rax,%%rax"); else if (LITTLE_INT(int_val)) Inst_Printf("cmpq", "$%ld,%%rax", int_val); else { /* %rdx is second integral return value. At this stage, it is bound to be dead since we only deal with primitive object types. */ Inst_Printf("movabsq", "$%ld,%%rdx", int_val); Inst_Printf("cmpq", "%%rdx,%%rax", int_val); } } /*-------------------------------------------------------------------------* * JUMP_IF_EQUAL * * * *-------------------------------------------------------------------------*/ void Jump_If_Equal(char *label) { Inst_Printf("je", "%s", label); } /*-------------------------------------------------------------------------* * JUMP_IF_GREATER * * * *-------------------------------------------------------------------------*/ void Jump_If_Greater(char *label) { Inst_Printf("jg", "%s", label); } /*-------------------------------------------------------------------------* * C_RET * * * *-------------------------------------------------------------------------*/ void C_Ret(void) { Inst_Printf("addq", "$%d,%%rsp", RESERVED_STACK_SPACE); Inst_Printf("popq", "%%rbx"); Inst_Printf("ret", ""); } /*-------------------------------------------------------------------------* * DICO_STRING_START * * * *-------------------------------------------------------------------------*/ void Dico_String_Start(int nb_consts) { Label_Printf(".section\t.rodata"); } /*-------------------------------------------------------------------------* * DICO_STRING * * * *-------------------------------------------------------------------------*/ void Dico_String(int str_no, char *asciiz) { Label_Printf("%s%d:", STRING_PREFIX, str_no); Inst_Printf(".string", "%s", asciiz); } /*-------------------------------------------------------------------------* * DICO_STRING_STOP * * * *-------------------------------------------------------------------------*/ void Dico_String_Stop(int nb_consts) { } /*-------------------------------------------------------------------------* * DICO_LONG_START * * * *-------------------------------------------------------------------------*/ void Dico_Long_Start(int nb_longs) { Label_Printf(".data"); Inst_Printf(".align", "16"); } /*-------------------------------------------------------------------------* * DICO_LONG * * * *-------------------------------------------------------------------------*/ void Dico_Long(char *name, int global, VType vtype, long value) { switch (vtype) { case NONE: value = 1; /* then in case ARRAY_SIZE */ case ARRAY_SIZE: if (!global) Inst_Printf(".local", "%s", name); Inst_Printf(".comm", "%s,%ld,8", name, value * 8); break; case INITIAL_VALUE: if (global) Inst_Printf(".globl", "%s", name); Label_Printf("%s:", name); Inst_Printf(".quad", "%ld", value); break; } } /*-------------------------------------------------------------------------* * DICO_LONG_STOP * * * *-------------------------------------------------------------------------*/ void Dico_Long_Stop(int nb_longs) { } /*-------------------------------------------------------------------------* * DATA_START * * * *-------------------------------------------------------------------------*/ void Data_Start(char *initializer_fct) { if (initializer_fct == NULL) return; Inst_Printf(".section", ".ctors,\"aw\",@progbits"); Inst_Printf(".align", "8"); Inst_Printf(".quad", "%s", initializer_fct); } /*-------------------------------------------------------------------------* * DATA_STOP * * * *-------------------------------------------------------------------------*/ void Data_Stop(char *initializer_fct) { } ./gprolog-1.3.0/src/Ma2Asm/ma2asm.c0000644004425400513100000004777410547154142015212 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : ma2asm.c * * Descr.: code generation * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: ma2asm.c,v 1.15 2007/01/04 10:35:14 diaz Exp $ */ #include #include #include #include #include "ma_parser.h" #include "ma_protos.h" #include "../EnginePl/gp_config.h" #include "../Wam2Ma/bt_string.c" #include "../TopComp/copying.c" /*---------------------------------* * Constants * *---------------------------------*/ #define DEFAULT_OUTPUT_SUFFIX ASM_SUFFIX #define MASK_LONG_GLOBAL 1 #define MASK_LONG_INITIALIZED 2 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { int global; VType vtype; /* NONE, INITIAL_VALUE, ARRAY_SZIE */ long value; } LongInf; typedef struct { int prolog; int global; } CodeInf; /*---------------------------------* * Global Variables * *---------------------------------*/ char *file_name_in; char *file_name_out; int inline_asm; int ignore_fc; int comment; FILE *file_out; int work_label = 0; BTString bt_string; BTString bt_code; BTString bt_long; char *initializer_fct = NULL; /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Invoke_Dico_Long(int unused_no, char *name, LongInf *p); void Init_Inline_Data(void); char **Find_Inline_Data(char *fct_name); void Emit_Inline_Data(char **p_inline); void Switch_Rec(int start, int stop, SwtInf swt[]); void Switch_Equal(SwtInf *c); int Switch_Cmp_Int(SwtInf *c1, SwtInf *c2); void Label_Printf(char *label, ...); void Inst_Printf(char *op, char *operands, ...); void Inst_Out(char *op, char *operands); void Char_Out(char c); void String_Out(char *s); void Int_Out(int d); void Parse_Arguments(int argc, char *argv[]); void Display_Help(void); #define Check_Arg(i, str) (strncmp(argv[i], str, strlen(argv[i])) == 0) /*-------------------------------------------------------------------------* * MAIN * * * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { int n; Parse_Arguments(argc, argv); if (file_name_out == NULL) file_out = stdout; else if ((file_out = fopen(file_name_out, "wt")) == NULL) { fprintf(stderr, "cannot open output file %s\n", file_name_out); exit(1); } Init_Inline_Data(); BT_String_Init(&bt_string); BT_String_Init(&bt_code); /* only fill if Pre_Pass is asked */ BT_String_Init(&bt_long); Asm_Start(); if (!Parse_Ma_File(file_name_in, comment)) { fprintf(stderr, "Translation aborted\n"); exit(1); } Data_Start(initializer_fct); n = bt_string.nb_elem; if (n) { Dico_String_Start(n); BT_String_List(&bt_string, Dico_String); Dico_String_Stop(n); } n = bt_long.nb_elem; if (n) { Dico_Long_Start(n); BT_String_List(&bt_long, Invoke_Dico_Long); Dico_Long_Stop(n); } Data_Stop(initializer_fct); Asm_Stop(); if (file_out != stdout) fclose(file_out); exit(0); } /*-------------------------------------------------------------------------* * INVOKE_DICO_LONG * * * *-------------------------------------------------------------------------*/ void Invoke_Dico_Long(int unused_no, char *name, LongInf *p) { Dico_Long(name, p->global, p->vtype, p->value); } /*-------------------------------------------------------------------------* * DECLARE_INITIALIZER * * * *-------------------------------------------------------------------------*/ void Declare_Initializer(char *init_fct) { /* init_fct: strdup done by the parser */ initializer_fct = init_fct; } /*-------------------------------------------------------------------------* * CALL_C * * * *-------------------------------------------------------------------------*/ void Call_C(char *fct_name, int fc, int nb_args, int nb_args_in_words, ArgInf arg[]) { unsigned i; /* unsigned is important for the loop */ int inc; int offset = 0; int no; char **p_inline; p_inline = Find_Inline_Data(fct_name); #if 0 /* to only inline a nth call (for debug) */ { static int nth_inline = 0; if (p_inline && ++nth_inline != 1) p_inline = NULL; } #endif if (ignore_fc) fc = 0; Call_C_Start(fct_name, fc, nb_args, nb_args_in_words, p_inline); if (!call_c_reverse_args) i = 0, inc = 1; else i = nb_args - 1, inc = -1; for (; i < (unsigned) nb_args; i += inc) { switch (arg[i].type) { case INTEGER: offset += Call_C_Arg_Int(offset, arg[i].t.int_val); break; case FLOAT: offset += Call_C_Arg_Double(offset, arg[i].t.dbl_val); break; case STRING: no = BT_String_Add(&bt_string, arg[i].t.str_val)->no; offset += Call_C_Arg_String(offset, no); break; case MEM: offset += Call_C_Arg_Mem_L(offset, arg[i].adr_of, arg[i].t.mem.name, arg[i].t.mem.index); break; case X_REG: offset += Call_C_Arg_Reg_X(offset, arg[i].adr_of, arg[i].t.index); break; case Y_REG: offset += Call_C_Arg_Reg_Y(offset, arg[i].adr_of, arg[i].t.index); break; case FL_ARRAY: offset += Call_C_Arg_Foreign_L(offset, arg[i].adr_of, arg[i].t.index); break; case FD_ARRAY: offset += Call_C_Arg_Foreign_D(offset, arg[i].adr_of, arg[i].t.index); break; default: /* for the compiler */ ; } } if (p_inline) { if (comment) Label_Printf("\t\t%s inlining %s", comment_prefix, fct_name); Emit_Inline_Data(p_inline); } else Call_C_Invoke(fct_name, fc, nb_args, nb_args_in_words); if (p_inline && comment) Label_Printf("\t\t%s code after inlining (Call_C_Stop)", comment_prefix); Call_C_Stop(fct_name, nb_args, p_inline); } /*-------------------------------------------------------------------------* * INIT_INLINE_DATA * * * *-------------------------------------------------------------------------*/ void Init_Inline_Data(void) { char **p, **q; if (inline_asm == 0) return; p = inline_asm_data; while(*p) { q = &INL_ACCESS_NEXT(p); for(p += 4; *p != INL_END_FUNC; p++) ; p++; *q = (char *) p; } } /*-------------------------------------------------------------------------* * FIND_INLINE_DATA * * * *-------------------------------------------------------------------------*/ char ** Find_Inline_Data(char *fct_name) { char **p; if (inline_asm) { p = inline_asm_data; while(*p && strcmp(*p, fct_name) != 0) p = (char **) INL_ACCESS_NEXT(p); if (*p && INL_ACCESS_LEVEL(p) <= inline_asm) return p; } return NULL; } /*-------------------------------------------------------------------------* * EMIT_INLINE_DATA * * * *-------------------------------------------------------------------------*/ void Emit_Inline_Data(char **p_inline) { char **p = p_inline; unsigned long l; static int nb_inlined = 0; /* a global variable */ nb_inlined++; for(p += 4; *p != INL_END_FUNC; p++) { l = (unsigned long) *p; if (l < 1024) /* label definition */ Label_Printf("%s%d_%d:", local_symb_prefix, nb_inlined, l); else { l = (unsigned long) p[1]; if (l < 1024) Inst_Printf(p[0], "%s%d_%d", local_symb_prefix, nb_inlined, l); else Inst_Printf(p[0], "%s", p[1]); p++; } } } /*-------------------------------------------------------------------------* * SWITCH_RET * * * *-------------------------------------------------------------------------*/ void Switch_Ret(int nb_swt, SwtInf swt[]) { qsort((void *) swt, nb_swt, sizeof(SwtInf), (int (*)(const void *, const void *)) Switch_Cmp_Int); Switch_Rec(0, nb_swt - 1, swt); } /*-------------------------------------------------------------------------* * SWITCH_REC * * * *-------------------------------------------------------------------------*/ void Switch_Rec(int start, int stop, SwtInf swt[]) { int mid; char str[32]; switch (stop - start + 1) /* nb elements */ { case 1: Switch_Equal(swt + start); Pl_Fail(); break; case 2: Switch_Equal(swt + start); Switch_Equal(swt + stop); Pl_Fail(); break; case 3: Switch_Equal(swt + start); Switch_Equal(swt + start + 1); Switch_Equal(swt + stop); Pl_Fail(); break; default: mid = (start + stop) / 2; Switch_Equal(swt + mid); sprintf(str, "Lwork%d", work_label++); Jump_If_Greater(str); Switch_Rec(start, mid - 1, swt); Label(str); Switch_Rec(mid + 1, stop, swt); } } /*-------------------------------------------------------------------------* * SWITCH_EQUAL * * * *-------------------------------------------------------------------------*/ void Switch_Equal(SwtInf *c) { Cmp_Ret_And_Int(c->int_val); Jump_If_Equal(c->label); } /*-------------------------------------------------------------------------* * SWITCH_CMP_INT * * * *-------------------------------------------------------------------------*/ int Switch_Cmp_Int(SwtInf *c1, SwtInf *c2) { return c1->int_val - c2->int_val; } /*-------------------------------------------------------------------------* * DECL_LONG * * * *-------------------------------------------------------------------------*/ void Decl_Long(char *name, int global, VType vtype, long value) { LongInf *p; /* name: strdup done by the parser */ p = (LongInf *) BT_String_Add(&bt_long, name)->info; p->global = global; p->vtype = vtype; p->value = value; } /*-------------------------------------------------------------------------* * DECL_CODE * * * *-------------------------------------------------------------------------*/ void /* called by Pre_Pass */ Decl_Code(char *name, int prolog, int global) { CodeInf *p; /* name: strdup done by the parser */ p = (CodeInf *) BT_String_Add(&bt_code, name)->info; p->prolog = prolog; p->global = global; } /*-------------------------------------------------------------------------* * IS_CODE_DEFINED * * * *-------------------------------------------------------------------------*/ int Is_Code_Defined(char *name) { return (BT_String_Lookup(&bt_code, name) != NULL); } /*-------------------------------------------------------------------------* * GET_LONG_INFOS * * * *-------------------------------------------------------------------------*/ int Get_Long_Infos(char *name, int *global, VType *vtype, int *value) { BTNode *b = BT_String_Lookup(&bt_long, name); LongInf *p; if (b == NULL) return 0; p = (LongInf *) b->info; *global = p->global; *vtype = p->vtype; *value = p->value; return 1; } /*-------------------------------------------------------------------------* * LABEL_PRINTF * * * *-------------------------------------------------------------------------*/ void Label_Printf(char *label, ...) { va_list arg_ptr; va_start(arg_ptr, label); vfprintf(file_out, label, arg_ptr); va_end(arg_ptr); fputc('\n', file_out); } /*-------------------------------------------------------------------------* * INST_PRINTF * * * *-------------------------------------------------------------------------*/ void Inst_Printf(char *op, char *operands, ...) { va_list arg_ptr; va_start(arg_ptr, operands); fprintf(file_out, "\t%s\t", op); vfprintf(file_out, operands, arg_ptr); va_end(arg_ptr); fputc('\n', file_out); } /*-------------------------------------------------------------------------* * INST_OUT * * * *-------------------------------------------------------------------------*/ void Inst_Out(char *op, char *operands) { fprintf(file_out, "\t%s\t%s\n", op, operands); } /*-------------------------------------------------------------------------* * CHAR_OUT * * * * Only needed by mappers inlining assembly code. * *-------------------------------------------------------------------------*/ void Char_Out(char c) { fprintf(file_out, "%c", c); } /*-------------------------------------------------------------------------* * STRING_OUT * * * * Only needed by mappers inlining assembly code. * *-------------------------------------------------------------------------*/ void String_Out(char *s) { fprintf(file_out, "%s", s); } /*-------------------------------------------------------------------------* * INT_OUT * * * * Only needed by mappers inlining assembly code. * *-------------------------------------------------------------------------*/ void Int_Out(int d) { fprintf(file_out, "%d", d); } /*-------------------------------------------------------------------------* * PARSE_ARGUMENTS * * * *-------------------------------------------------------------------------*/ void Parse_Arguments(int argc, char *argv[]) { static char str[1024]; int i; file_name_in = file_name_out = NULL; inline_asm = 0; ignore_fc = 0; comment = 0; for (i = 1; i < argc; i++) { if (*argv[i] == '-' && argv[i][1] != '\0') { if (Check_Arg(i, "-o") || Check_Arg(i, "--output")) { if (++i >= argc) { fprintf(stderr, "FILE missing after %s option\n", argv[i - 1]); exit(1); } file_name_out = argv[i]; continue; } if (Check_Arg(i, "--inline-asm")) { inline_asm = 1; continue; } if (Check_Arg(i, "--full-inline-asm")) { inline_asm = 2; continue; } if (Check_Arg(i, "--ignore-fast")) { ignore_fc = 1; continue; } if (Check_Arg(i, "--comment")) { comment = 1; continue; } if (Check_Arg(i, "--version")) { Display_Copying("Mini-Assembly to Assembly Compiler"); exit(0); } if (Check_Arg(i, "-h") || Check_Arg(i, "--help")) { Display_Help(); exit(0); } fprintf(stderr, "unknown option %s - try ma2asm --help\n", argv[i]); exit(1); } if (file_name_in != NULL) { fprintf(stderr, "input file already specified (%s)\n", file_name_in); exit(1); } file_name_in = argv[i]; } if (file_name_in != NULL && strcmp(file_name_in, "-") == 0) file_name_in = NULL; if (file_name_out == NULL && file_name_in != NULL) { strcpy(str, file_name_in); i = strlen(str); if (strcmp(str + i - 3, ".ma") == 0) strcpy(str + i - 3, DEFAULT_OUTPUT_SUFFIX); else strcpy(str + i, DEFAULT_OUTPUT_SUFFIX); file_name_out = str; } if (file_name_out != NULL && strcmp(file_name_out, "-") == 0) file_name_out = NULL; } /*-------------------------------------------------------------------------* * DISPLAY_HELP * * * *-------------------------------------------------------------------------*/ void Display_Help(void) #define L(msg) fprintf(stderr, "%s\n", msg) { L("Usage: ma2asm [option...] file"); L(""); L("Options:"); L(" -o FILE, --output FILE set output file name"); L(" --inline-asm inline some C calls as asm instructions"); L(" --full-inline-asm inline most C calls as asm instructions"); L(" --ignore-fast ignore fast call (FC) declarations"); L(" --comment include comments in the output file"); L(" -h, --help print this help and exit"); L(" --version print version number and exit"); L(""); L("'-' can be given as for the standard input/output"); L(""); L("Report bugs to bug-prolog@gnu.org."); } #undef L ./gprolog-1.3.0/src/Ma2Asm/FromC/0000777004425400513100000000000010547442376014666 5ustar diazloco./gprolog-1.3.0/src/Ma2Asm/FromC/Makefile0000644004425400513100000000046210547440355016317 0ustar diazlocoGPLC = gplc CC = gcc CFLAGS = -g -Wall # other local variables #CFLAGS = -O3 #CFLAGS = -O3 -fverbose-asm -fomit-frame-pointer CFLAGS = -O3 -fverbose-asm -fomit-frame-pointer -fno-defer-pop #CFLAGS= /Ox /Oy opt: $(CC) -S $(CFLAGS) asm_inst.c no: $(CC) -S asm_inst.c clean: -rm *.s ./gprolog-1.3.0/src/Ma2Asm/FromC/mach.h0000644004425400513100000000544610547152474015751 0ustar diazloco/*-------------------------------------------------------------------------* * Prolog To Wam Compiler INRIA Rocquencourt - CLoE Project * * C Run-time Daniel Diaz - 1994 * * * * Machine Dependent Features - Header file * * * * machine.h * *-------------------------------------------------------------------------*/ /*---------------------------------* * Asm Labels, Symbols and Gotos * *---------------------------------*/ #if defined(M_sony_news) || defined(M_ultrix_dec) || defined(M_alpha_osf) ||\ defined(M_ix86_linux) || defined(M_ix86_sco) || defined(M_ix86_bsd) ||\ defined(M_x86_64_linux) || \ defined(M_powerpc_bsd) || defined(M_sparc_bsd) || defined(__ELF__) # define M_Asm_Symbol1(name) #name # define M_Asm_Symbol(name) M_Asm_Symbol1(name) #elif defined (M_ix86_win32) # define M_Asm_Symbol1(name) _##name # define M_Asm_Symbol(name) M_Asm_Symbol1(name) #else # define M_Asm_Symbol1(name) "_"#name # define M_Asm_Symbol(name) M_Asm_Symbol1(name) #endif #if defined(M_ix86_win32) #define M_Indirect_Goto(p_lab) {register long adr=(long) p_lab; _asm jmp adr} #else #define M_Indirect_Goto(p_lab) {goto *(void*) p_lab;} #endif #if defined(M_sparc_sunos) || defined(M_ultrix_dec) || \ defined(M_sony_news) || defined(M_hppa_NeXT) # define M_Direct_Goto(lab) {lab(); return;} #elif defined(M_alpha_osf) # define M_Direct_Goto(lab) {asm("lda $28," M_Asm_Symbol(lab)); \ asm("jmp $31,($28)," M_Asm_Symbol(lab));\ return;} #elif defined(M_ix86) && defined(__GNUC__) # define M_Direct_Goto(lab) {asm("jmp " M_Asm_Symbol(lab)); return;} #elif defined(_MSC_VER) # define M_Direct_Goto(lab) {_asm {jmp M_Asm_Symbol(lab)}; return;} #elif defined(M_x86_64_linux) # define M_Direct_Goto(lab) {asm("jmp " M_Asm_Symbol(lab)); return;} #elif defined(M_powerpc_linux) || defined(M_powerpc_bsd) # define M_Direct_Goto(lab) {asm("b " M_Asm_Symbol(lab)); return;} #elif defined(M_m68k_NeXT) # define M_Direct_Goto(lab) {asm("jmp " M_Asm_Symbol(lab)); return;} #endif /*---------------------------------* * WAM * *---------------------------------*/ #if 0 #if defined(M_ix86) register WamWord *reg_bank asm("ebx"); #elif defined(M_powerpc) register WamWord *reg_bank asm("r31"); #elif defined(M_x86_64_linux) register WamWord *reg_bank asm("r12"); #else WamWord *reg_bank; #endif #endif ./gprolog-1.3.0/src/Ma2Asm/FromC/Makefile.in0000644004425400513100000000046510547152474016731 0ustar diazlocoGPLC = @GPLC@ CC = @CC@ CFLAGS = @CFLAGS@ # other local variables #CFLAGS = -O3 #CFLAGS = -O3 -fverbose-asm -fomit-frame-pointer CFLAGS = -O3 -fverbose-asm -fomit-frame-pointer -fno-defer-pop #CFLAGS= /Ox /Oy opt: $(CC) -S $(CFLAGS) asm_inst.c no: $(CC) -S asm_inst.c clean: -rm *.s ./gprolog-1.3.0/src/Ma2Asm/FromC/asm_inst.c0000644004425400513100000001253110547152474016642 0ustar diazloco#include #include #define OBJ_INIT initializer_fct #include "../../EnginePl/gp_config.h" #include "../../EnginePl/pl_params.h" #if 1 /* #if 0, cp ../../EnginePl/wam_archi.h . and customize it if needed */ #include "../../EnginePl/wam_archi.h" #else #include "wam_archi.h" #endif #include "../../EnginePl/machine.h" #include "../../EnginePl/obj_chain.h" #include "../../EnginePl/wam_inst.h" #include "mach.h" #define YY(k) Y(E,k) extern unsigned var; extern void *label; long v1[100]; static long v2[100]; extern long v3[100]; void foo(); void foo1(); void pl_call1(); int x, y; extern long foreign_long[]; extern double foreign_double[]; /* to define Asm_Start() */ /* to define Code_Start() (global/not global) and Code_Stop() */ void TRANS_code_start_global() { } static void TRANS_code_start_non_global() { } /* to define Pl_Jump() */ void TRANS_pl_jump() { M_Direct_Goto(foo1); _foo1:; } /* to define Pl_Call() */ void TRANS_pl_call() { #ifdef __GNUC__ CP = (CodePtr) &&cont; M_Direct_Goto(foo); cont: #else CP = (CodePtr) pl_call1; M_Direct_Goto(foo); _foo:; #endif dummy(CP); } void TRNAS_pl_call_another() { CP = (CodePtr) &&cont; foo(); cont: CP = (CodePtr) &var; dummy(CP); cont2: CP = (CodePtr) &&cont2; dummy(var); } /* to define Pl_Fail() */ void TRANS_pl_fail() { M_Indirect_Goto(ALTB(B)); } /* to define Pl_Ret() */ void TRANS_pl_ret() { M_Indirect_Goto(CP); } /* to define Prep_CP() and Here_CP() */ void TRANS_prep_cp_here_cp() { CP = &&a; if (x<3) { bar(x); } a:; } /* to define Jump() */ void TRANS_jump() { if (x < 3) { bar(x); goto a; } x++; a:; } /* to define Move_From/To_Reg_X/Y() */ void TRANS_move_x_to_x() { X(3) = X(5); } void TRANS_move_x_to_y() { YY(10) = X(2); } void TRANS_move_y_to_x() { X(0) = YY(3); } void TRANS_move_y_to_y() { YY(2) = YY(4); } /* to define Call_C_Start() + Call_C_Arg()... + Call_C_Stop() */ void TRANS_call_c(void) { /* &label,var,int, double, string */ bar(foo, var, 12, 4098, -4095, (double) 1.20e-10, "this is a string", "a\14b"); /* v(index) */ bar1(v1[2], v1[0], &v1[12], v2[2], v2[0], &v2[4]); bar1(v3[4], &v3[2], v3[0]); /* regs / ®s */ bar2(X(0), &X(4), YY(0), &YY(12)); } void TRANS_call_c_lot_of_args(void) { /* &label,var,int, double, string */ bar(3, 4, 5, 6, 7, 8, 9, 10, foo, var, 12, 4098, -4095, (double) 1.20e-10, "this is a string", "a\14b"); /* regs / ®s */ bar1(0, 0, 0, 0, 0, 0, X(2), &X(4), YY(0), &YY(12)); } void TRANS_call_c_foreign(void) { bar(foreign_long[0], foreign_long[4], &foreign_long[0], &foreign_long[8]); bar(foreign_double[0], foreign_double[4], &foreign_double[0], &foreign_double[8]); } /* to define Jump_Ret() */ void TRANS_jump_ret() { #if defined(M_ix86_win32) register long adr = (long) bar(12, "toto"); _asm { jmp adr} #else goto *bar(12, "toto"); #endif } /* to define Fail_Ret() */ void TRANS_fail_ret() { if (test(1, 2, 3) == 0) goto a; x++; a:; } /* to define Move_Ret_To_Mem() */ void TRANS_move_ret_to_mem() { var = bar(3); v1[4096] = bar(15); } /* to define Move_Ret_To_Reg_X() */ void TRANS_move_ret_to_reg_x() { X(4) = bar(3); } /* to define Move_Ret_To_Reg_Y() */ void TRANS_move_ret_to_reg_y() { YY(2) = bar(3); } /* to define Move_Ret_To_Foreign_L() */ void TRANS_move_ret_to_foreign_l() { foreign_long[123] = bar(3); } /* to define Move_Ret_To_Foreign_D() */ void TRANS_move_ret_to_foreign_d() { double bard(void); foreign_double[123] = bard(); } /* to define Cmp_Ret_And_Int() */ void TRANS_cmp_ret_and_int() { if (bar(foo) == 0) /* case ret = 0 */ goto a; if (bar(foo) == 12345678) /* case ret !- 0 */ goto a; x++; a:; } /* to define Jump_If_Equal() */ void TRANS_jump_if_equal() { if (x == y) goto a; x++; a:; } /* to define Jump_If_Greater() */ /* maybe the C compiler does not generate a jg but a jl, reverse if needed */ void TRANS_jump_if_greater() { if (x > 12) goto a; if (y > x) goto a; x++; a: foo(1); } /* to define C_Ret() */ void TRANS_c_ret() { } /* to define Dico_String_Start() + Dico_String() + Dico_String_Stop() */ /* see definitions of strings in the asm file produced */ void TRANS_dico_string() { bar("str1", "str2", "str3", "str\r\tend\n", "str\019toto"); } /* to define Dico_Long_Start() + Dico_Long() + Dico_Long_Stop() */ /* see definitions of longs in the asm file produced (global/not global)*/ static long var_long_static_uninit; static long var_long_static_init0; static long var_long_static_init100 = 100; long var_long_common_unint; long var_long_common_init128 = 128; static long var_array_static128[128]; long var_array_common128[128]; /* to define Data_Start() + Data_Stop */ /* between obj_chain_start and obj_chain_stop */ static void initializer_fct() { /* the following printf to ensure gcc does not remove unused static vars */ printf("%ld %ld %ld %ld\n", var_long_static_uninit, var_long_static_init0, var_long_static_init100, var_array_static128); } # if 0 /* this should not be useful */ int see_switch() { int y; int x = bar(); if (x == 10) y += 11; if (x > 10) y += 12; if (x < 10) y += 13; if (x == 0) y += 1; if (x > 0) y += 2; if (x < 0) y += 3; return y; } #endif ./gprolog-1.3.0/src/Ma2Asm/FromC/wam_archi.h0000644004425400513100000002356410547152474016774 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : wam_archi.def (gives rise to wam_archi.h) * * Descr.: Wam architecture definition - description file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /*---------------------------------* * Register Descriptions * *---------------------------------*/ typedef long WamWord; /* a wamword is a long (32/64 bits) */ typedef void (*CodePtr) (); /* a code pointer is a ptr to fct */ typedef CodePtr WamCont; /* a continuation is a code pointer */ #ifndef ONLY_TAG_PART #define X(x) (reg_bank[x]) #define A(a) (reg_bank[a]) typedef WamWord *WamWordP; /*--- Begin Register Generation ---*/ #define TR (((WamWordP *) reg_bank)[NB_OF_X_REGS+0]) #define B (((WamWordP *) reg_bank)[NB_OF_X_REGS+1]) #define H (((WamWordP *) reg_bank)[NB_OF_X_REGS+2]) #define HB1 (((WamWordP *) reg_bank)[NB_OF_X_REGS+3]) #define CP (((WamCont *) reg_bank)[NB_OF_X_REGS+4]) #define E (((WamWordP *) reg_bank)[NB_OF_X_REGS+5]) #define CS (((WamWordP *) reg_bank)[NB_OF_X_REGS+6]) #define S (((WamWordP *) reg_bank)[NB_OF_X_REGS+7]) #define STAMP (((WamWord *) reg_bank)[NB_OF_X_REGS+8]) #define BCI (((WamWord *) reg_bank)[NB_OF_X_REGS+9]) #define LSSA (((WamWordP *) reg_bank)[NB_OF_X_REGS+10]) #define NB_OF_REGS 11 #define NB_OF_ALLOC_REGS 0 #define NB_OF_NOT_ALLOC_REGS 11 #define REG_BANK_SIZE (NB_OF_X_REGS+NB_OF_NOT_ALLOC_REGS) #define NB_OF_USED_MACHINE_REGS 0 register WamWord *reg_bank asm("%ebx"); #ifdef ENGINE_FILE char *reg_tbl[] = { "TR", "B", "H", "HB1", "CP", "E", "CS", "S", "STAMP", "BCI", "LSSA"}; #else extern char *reg_tbl[]; #endif #define Init_Reg_Bank(x) #define Reg(i) (((i)==0) ? (WamWord) TR : \ ((i)==1) ? (WamWord) B : \ ((i)==2) ? (WamWord) H : \ ((i)==3) ? (WamWord) HB1 : \ ((i)==4) ? (WamWord) CP : \ ((i)==5) ? (WamWord) E : \ ((i)==6) ? (WamWord) CS : \ ((i)==7) ? (WamWord) S : \ ((i)==8) ? (WamWord) STAMP : \ ((i)==9) ? (WamWord) BCI : \ (WamWord) LSSA) #define Save_All_Regs(buff_save) \ do { \ buff_save[0] = (WamWord) TR; \ buff_save[1] = (WamWord) B; \ buff_save[2] = (WamWord) H; \ buff_save[3] = (WamWord) HB1; \ buff_save[4] = (WamWord) CP; \ buff_save[5] = (WamWord) E; \ buff_save[6] = (WamWord) CS; \ buff_save[7] = (WamWord) S; \ buff_save[8] = (WamWord) STAMP; \ buff_save[9] = (WamWord) BCI; \ buff_save[10] = (WamWord) LSSA; \ } while(0) #define Restore_All_Regs(buff_save) \ do { \ TR = (WamWordP) buff_save[0]; \ B = (WamWordP) buff_save[1]; \ H = (WamWordP) buff_save[2]; \ HB1 = (WamWordP) buff_save[3]; \ CP = (WamCont ) buff_save[4]; \ E = (WamWordP) buff_save[5]; \ CS = (WamWordP) buff_save[6]; \ S = (WamWordP) buff_save[7]; \ STAMP = (WamWord ) buff_save[8]; \ BCI = (WamWord ) buff_save[9]; \ LSSA = (WamWordP) buff_save[10]; \ } while(0) #define Save_Machine_Regs(buff_save) \ do { \ } while(0) #define Restore_Machine_Regs(buff_save) \ do { \ } while(0) #define Start_Protect_Regs_For_Signal #define Stop_Protect_Regs_For_Signal #define Restore_Protect_Regs_For_Signal /*--- End Register Generation ---*/ #endif /*---------------------------------* * Tag Descriptions * *---------------------------------*/ /*--- Begin Tag Generation ---*/ #define TAG_SIZE 3 #define TAG_SIZE_LOW 2 #define TAG_SIZE_HIGH 1 #define VALUE_SIZE 29 #define TAG_MASK 0x80000003UL #define VALUE_MASK 0x7ffffffcUL #define Tag_Mask_Of(w) ((unsigned long) (w) & (TAG_MASK)) #define Tag_From_Tag_Mask(w) (((unsigned long) (w) >> 29) | ((w) & 3)) #define Tag_Of(w) ((((unsigned long) (w) >> 31) << 2) | ((w) & 3)) #define TAG_REF_MASK 0UL #define TAG_LST_MASK 0x1UL #define TAG_STC_MASK 0x2UL #define TAG_ATM_MASK 0x3UL #define TAG_FLT_MASK 0x80000000UL #define TAG_FDV_MASK 0x80000001UL #define TAG_INT_MASK 0x80000003UL #define NB_OF_TAGS 7 #define REF 0 #define LST 1 #define STC 2 #define ATM 3 #define FLT 4 #define FDV 5 #define INT 7 /* General Tag/UnTag macros */ #define Tag_Long_Int(tm, v) ((((unsigned long) ((v) << 3)) >> 1) | (tm)) #define Tag_Short_Uns(tm, v) (((unsigned long) (v) << 2) + (tm)) #define Tag_Address(tm, v) ((unsigned long) (v) + (tm)) #define UnTag_Long_Int(w) ((long) ((w) << 1) >> 3) #define UnTag_Short_Uns(w) UnTag_Long_Int(w) #define UnTag_Address(w) ((WamWord *) ((w) & VALUE_MASK)) /* Specialized Tag/UnTag macros */ #define Tag_REF(v) Tag_Address(TAG_REF_MASK, v) #define Tag_LST(v) Tag_Address(TAG_LST_MASK, v) #define Tag_STC(v) Tag_Address(TAG_STC_MASK, v) #define Tag_ATM(v) Tag_Short_Uns(TAG_ATM_MASK, v) #define Tag_FLT(v) Tag_Address(TAG_FLT_MASK, v) #define Tag_FDV(v) Tag_Address(TAG_FDV_MASK, v) #define Tag_INT(v) (((unsigned long) (v) << 2) | TAG_MASK) #define UnTag_REF(w) ((WamWord *) (w)) #define UnTag_LST(w) UnTag_Address(w) #define UnTag_STC(w) UnTag_Address(w) #define UnTag_ATM(w) ((unsigned long) (w) >> 2) #define UnTag_FLT(w) UnTag_Address(w) #define UnTag_FDV(w) UnTag_Address(w) #define UnTag_INT(w) UnTag_Long_Int(w) #define Tag_Is_REF(w) (Tag_Mask_Of(w) == TAG_REF_MASK) #define Tag_Is_LST(w) (Tag_Mask_Of(w) == TAG_LST_MASK) #define Tag_Is_STC(w) (Tag_Mask_Of(w) == TAG_STC_MASK) #define Tag_Is_ATM(w) (Tag_Mask_Of(w) == TAG_ATM_MASK) #define Tag_Is_FLT(w) (Tag_Mask_Of(w) == TAG_FLT_MASK) #define Tag_Is_FDV(w) (Tag_Mask_Of(w) == TAG_FDV_MASK) #define Tag_Is_INT(w) (Tag_Mask_Of(w) == TAG_INT_MASK) typedef enum { LONG_INT, SHORT_UNS, ADDRESS }TypTag; typedef struct { char *name; TypTag type; int value; long tag_mask; }InfTag; #ifdef ENGINE_FILE InfTag tag_tbl[] = { { "REF", ADDRESS, 0, 0UL }, { "LST", ADDRESS, 1, 0x1UL }, { "STC", ADDRESS, 2, 0x2UL }, { "ATM", SHORT_UNS, 3, 0x3UL }, { "FLT", ADDRESS, 4, 0x80000000UL }, { "FDV", ADDRESS, 5, 0x80000001UL }, { "INT", LONG_INT, 7, 0x80000003UL } }; #else extern InfTag tag_tbl[]; #endif /*--- End Tag Generation ---*/ /*---------------------------------* * Stack Descriptions * *---------------------------------*/ #ifndef ONLY_TAG_PART #define KBytes_To_Wam_Words(kb) ((1024 * kb + sizeof(WamWord) - 1) / sizeof(WamWord)) #define Wam_Words_To_KBytes(ww) (ww * sizeof(WamWord) / 1024) #define Local_Top ((B >= E) ? B : E) /*--- Begin Stack Generation ---*/ #define NB_OF_STACKS 4 #define Trail_Stack (stk_tbl[0].stack) #define Trail_Size (stk_tbl[0].size) #define Trail_Offset(adr) ((WamWord *)(adr) - Trail_Stack) #define Trail_Used_Size Trail_Offset(TR) #define Cstr_Stack (stk_tbl[1].stack) #define Cstr_Size (stk_tbl[1].size) #define Cstr_Offset(adr) ((WamWord *)(adr) - Cstr_Stack) #define Cstr_Used_Size Cstr_Offset(CS) #define Global_Stack (stk_tbl[2].stack) #define Global_Size (stk_tbl[2].size) #define Global_Offset(adr) ((WamWord *)(adr) - Global_Stack) #define Global_Used_Size Global_Offset(H) #define Local_Stack (stk_tbl[3].stack) #define Local_Size (stk_tbl[3].size) #define Local_Offset(adr) ((WamWord *)(adr) - Local_Stack) #define Local_Used_Size Local_Offset(Local_Top) #define Stack_Top(s) (((s) == 0) ? TR : ((s) == 1) ? CS : ((s) == 2) ? H : Local_Top) typedef struct { char *name; char *env_var_name; long *p_def_size; int default_size; /* in WamWords */ int size; /* in WamWords */ WamWord *stack; }InfStack; #ifdef ENGINE_FILE /* these variables can be overwritten by top_comp.c (see stack size file) */ long def_trail_size; long def_cstr_size; long def_global_size; long def_local_size; long fixed_sizes; InfStack stk_tbl[] = { { "trail", "TRAILSZ", &def_trail_size, 786432, 0, NULL }, { "cstr", "CSTRSZ", &def_cstr_size, 786432, 0, NULL }, { "global", "GLOBALSZ", &def_global_size, 2097152, 0, NULL }, { "local", "LOCALSZ", &def_local_size, 1048576, 0, NULL } }; #else extern long def_trail_size; extern long def_cstr_size; extern long def_global_size; extern long def_local_size; extern long fixed_sizes; extern InfStack stk_tbl[]; #endif /*--- End Stack Generation ---*/ #endif ./gprolog-1.3.0/src/Ma2Asm/chkma.c0000644004425400513100000004042610547154142015100 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : chkma.c * * Descr.: test file for MA translation * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: chkma.c,v 1.5 2007/01/04 10:35:14 diaz Exp $ */ #include #include #ifndef FAST /* see Makefile */ #define FC /* define FC to force arch_dep.h to no use FC */ #endif #define IF_NO_FD_FILE //#include "engine_pl.h" #include "../EnginePl/engine.c" #if !defined(FC_USED_TO_COMPILE_CORE) && defined(FAST) /* see Makefile */ #error FAST defined but cannot compile for FC #endif /*---------------------------------* * Constants * *---------------------------------*/ #if 1 #define MA_ARRAY ma_array #define MA_GLOBAL_VAR1 ma_global_var1 #define MA_GLOBAL_VAR2 ma_global_var2 #else #define MA_ARRAY _ma_array #define MA_GLOBAL_VAR1 _ma_global_var1 #define MA_GLOBAL_VAR2 _ma_global_var2 #define MA_LOCAL_VAR2 _ma_local_var2 #endif /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /* these 4 lines are get from foreign_supp.c */ long foreign_long[NB_OF_X_REGS]; double foreign_double[NB_OF_X_REGS]; long *base_fl = foreign_long; /* overwrite var of engine.c */ double *base_fd = foreign_double; /* overwrite var of engine.c */ WamWord stack[4096]; int initialised = 0; long x; long ret; long swt[] = { 0, 4, 15, 4095, 123456, 2456789, -1 }; long i; long MA_ARRAY[5000]; long MA_GLOBAL_VAR1; long MA_GLOBAL_VAR2; long MA_LOCAL_VAR2; /* should not be the same as in check_ma.ma */ #if !defined(NO_USE_REGS) && NB_OF_USED_MACHINE_REGS > 0 static WamWord init_buff_regs[NB_OF_USED_MACHINE_REGS]; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ void test_initializer(void); void test_declaration(void); void test_pl_jump_and_pl_ret(void); void ma_test_pl_jump_and_pl_ret(void); void test_pl_call_and_pl_ret_and_pl_fail(void); void ma_test_pl_call_and_pl_ret_and_pl_fail(void); void test_prep_cp_and_here_cp(void); void ma_test_prep_cp_and_here_cp(void); void test_jump_and_c_ret(void); void ma_test_jump_and_c_ret(void); void test_call_c(void); void ma_test_call_c(void); void test_move_x_y(void); void ma_test_move_x_y(void); void test_move_y_x(void); void ma_test_move_y_x(void); void test_arg_int(void); void ma_test_arg_int(void); void test_arg_double(void); void ma_test_arg_double(void); void test_arg_string(void); void ma_test_arg_string(void); void test_arg_mem_l(void); void ma_test_arg_mem_l(void); void test_arg_x(void); void ma_test_arg_x(void); void test_arg_y(void); void ma_test_arg_y(void); void test_arg_fl_array(void); void ma_test_arg_fl_array(void); void test_arg_fd_array(void); void ma_test_arg_fd_array(void); void test_call_c_lot_args(void); void ma_test_call_c_lot_args(void); void test_jump_ret(void); void ma_test_jump_ret(void); void test_fail_ret(void); void ma_test_fail_ret(void); void test_move_ret_mem(void); void ma_test_move_ret_mem(void); void test_move_ret_x(void); void ma_test_move_ret_x(void); void test_move_ret_y(void); void ma_test_move_ret_y(void); void test_move_ret_fl(void); void ma_test_move_ret_fl(void); void test_move_ret_fd(void); void ma_test_move_ret_fd(void); void test_switch_ret(void); void ma_test_switch_ret(void); void (*tbl[]) () = { test_initializer, test_declaration, test_pl_jump_and_pl_ret, test_pl_call_and_pl_ret_and_pl_fail, test_prep_cp_and_here_cp, test_jump_and_c_ret, test_call_c, test_move_x_y, test_move_y_x, test_arg_int, test_arg_double, test_arg_string, test_arg_mem_l, test_arg_x, test_arg_y, test_arg_fl_array, test_arg_fd_array, test_call_c_lot_args, test_jump_ret, test_fail_ret, test_move_ret_mem, test_move_ret_x, test_move_ret_y, test_move_ret_fl, test_move_ret_fd, test_switch_ret, NULL }; /*-------------------------------------------------------------------------* * MAIN * * * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { int i = 0; #if defined(FC_USED_TO_COMPILE_CORE) #ifdef FAST printf("check running with FC (fast call)\n"); #else printf("check running without FC (NO fast call)\n"); #endif #elif !defined(FC_USED_TO_COMPILE_CORE) #error FAST defined but cannot compile for FC #else #warning WITH FC #endif #ifdef _WIN32 setbuf(stdout, NULL); setbuf(stderr, NULL); #endif #if 1 foreign_double[0] = 1.2e30; foreign_double[47] = -1.234567; #endif Save_Machine_Regs(init_buff_regs); #ifndef NO_MACHINE_REG_FOR_REG_BANK reg_bank = stack; B = stack + NB_OF_X_REGS + 100; #else B = stack; #endif E = B + 1024; printf("reg_bank=&X(0):%#lx B:%#lx E:%#lx &Y(0):%#lx\n", (long) reg_bank, (long) B, (long) E, (long) &Y(E, 0)); printf("stack:%#lx\n", (long) stack); while (tbl[i++]) { printf("test %d: ", i); (*tbl[i - 1]) (); printf("test %d OK\n", i); } Restore_Machine_Regs(init_buff_regs); printf("MA checks suceeded\n"); return 0; } void Init_CP(WamCont p) { CP = Adjust_CP(p); } /* can be called by MA code to print a long */ void Write_Long(long x) { printf("\nValue x: %#lx\n", x); } void FC Allocate(int x) /* only to update the register for E */ { } WamCont save_CP; void Save_CP() { save_CP = CP; } void Restore_CP() { CP = save_CP; } void error(void) { Restore_Machine_Regs(init_buff_regs); printf("*** ERROR ***\n"); fflush(NULL); exit(1); } void Call_Pl(void (*code) (), int must_succeed) { int ok = Call_Prolog(code); if (ok != must_succeed) error(); } void Initializer(void) { initialised = 1; } void test_initializer(void) { #ifdef _MSC_VER printf("c_code intializer (ignored)...\n"); #else printf("c_code intializer...\n"); if (!initialised) error(); #endif } void test_declaration(void) { long *adr = MA_ARRAY + 5000; int i; printf("long local/global ...\n"); if (&MA_GLOBAL_VAR1 >= MA_ARRAY && &MA_GLOBAL_VAR1 < adr) error(); for (i = 0; i < 5000; i++) MA_ARRAY[i] = i; if (MA_GLOBAL_VAR2 != 12345) error(); if (MA_LOCAL_VAR2 != 0) error(); } void test_pl_jump_and_pl_ret(void) { printf("pl_jump/pl_ret...\n"); Call_Pl(ma_test_pl_jump_and_pl_ret, 1); } void test_pl_call_and_pl_ret_and_pl_fail(void) { printf("pl_call/pl_ret/pl_fail...\n"); Call_Pl(ma_test_pl_call_and_pl_ret_and_pl_fail, 0); } #if 1 void test_prep_cp_and_here_cp(void) { printf("prep_cp/here_cp...\n"); Call_Pl(ma_test_prep_cp_and_here_cp, 1); } void test_jump_and_c_ret(void) { printf("jump/c_ret...\n"); ALTB(B) = (WamCont) error; Init_CP(error); ma_test_jump_and_c_ret(); } void test_call_c(void) { printf("call_c(void)...\n"); x = 0; Call_Pl(ma_test_call_c, 1); if (x != 1) error(); } void FC test_call_c1(void) { x++; } void test_move_x_y(void) { printf("move X(i) to Y(j)...\n"); X(0) = 24680; X(10) = 13579; X(255) = 123456789; Y(E, 0) = -1; Y(E, 9) = -1; Y(E, 15) = -1; Call_Pl(ma_test_move_x_y, 1); if (Y(E, 3) != 24680 || Y(E, 0) != 13579 || Y(E, 15) != 123456789) error(); } void test_move_y_x(void) { printf("move Y(i) to X(j)...\n"); Y(E, 0) = 24680; Y(E, 10) = 13579; Y(E, 23) = 123456789; X(0) = -1; X(12) = -1; X(31) = -1; Call_Pl(ma_test_move_y_x, 1); if (X(0) != 24680 || X(31) != 13579 || X(12) != 123456789) error(); } void test_arg_int(void) { printf("call_c(int)...\n"); x = 0; Call_Pl(ma_test_arg_int, 1); if (x != 1) error(); } void FC test_arg_int1(int a, int b, int c, int d) { if (a != 12 || b != -1 || c != 4095 || d != 123456789) error(); x++; } void test_arg_double(void) { printf("call_c(double)...\n"); x = 0; Call_Pl(ma_test_arg_double, 1); if (x != 1) error(); } void FC test_arg_double1(double a, double b, double c) { if (a != 12.456 || b != -1.3e-102 || c != -3.141593) error(); x++; } void test_arg_string(void) { printf("call_c(string)...\n"); x = 0; Call_Pl(ma_test_arg_string, 1); if (x != 1) error(); } void FC test_arg_string1(char *a, char *b) { #ifdef DEBUG printf("b:<%s>\n", a); printf("a:<%s>\n", b); #endif if (strcmp(a, "a string") || strcmp(b, "abcd\01489d\37711ef\n\r")) error(); x++; } void test_arg_mem_l(void) { printf("call_c(mem,&label,mem(...),&mem(...))...\n"); x = 0; Call_Pl(ma_test_arg_mem_l, 1); if (x != 1) error(); } void FC test_arg_mem_l1(long a, long b, long *c, long d, long e, long *f) { if (a != 128 || b != 12345 || c != (long *) test_arg_mem_l || d != MA_ARRAY[0] || e != MA_ARRAY[4097] || f != &MA_ARRAY[4500]) error(); x++; } void test_arg_x(void) { printf("call_c(X())...\n"); x = 0; X(0) = 123987; X(255) = 987654321; Call_Pl(ma_test_arg_x, 1); if (x != 1) error(); } void FC test_arg_x1(WamWord a, WamWord *b, WamWord c, WamWord *d) { if (a != 123987 || b != &X(0) || c != 987654321 || d != &X(128)) error(); x++; } void test_arg_y(void) { printf("call_c(Y())...\n"); x = 0; Y(E, 0) = 1928374; Y(E, 12) = 456789; Call_Pl(ma_test_arg_y, 1); if (x != 1) error(); } void FC test_arg_y1(WamWord a, WamWord *b, WamWord c, WamWord *d) { if (a != 1928374 || b != &Y(E, 0) || c != 456789 || d != &Y(E, 6)) error(); x++; } void test_arg_fl_array(void) { printf("call_c(FL())...\n"); x = 0; foreign_long[0] = 12; foreign_long[10] = 14; Call_Pl(ma_test_arg_fl_array, 1); if (x != 1) error(); } void FC test_arg_fl_array1(long a, long b, long *c, long *d) { #ifdef DEBUG printf("a=%d b=%d c=%x e=%x (fl=%x fl+56=%x)\n", a, b, c, d, foreign_long, foreign_long + 56); #endif if (a != 12 || b != 14 || c != foreign_long || d != foreign_long + 56) error(); x++; } void test_arg_fd_array(void) { printf("call_c(FD())...\n"); x = 0; foreign_double[0] = 1.2e30; foreign_double[47] = -1.234567; Call_Pl(ma_test_arg_fd_array, 1); if (x != 1) error(); } void FC test_arg_fd_array1(double a, double b, double *c, double *d) { if (a != 1.2e30 || b != -1.234567 || c != foreign_double || d != foreign_double + 127) error(); x++; } void test_call_c_lot_args(void) { printf("call_c(lot_of_args)...\n"); x = 0; X(0) = 123987; X(255) = 987654321; Y(E, 0) = 1928374; Y(E, 12) = 456789; //#ifndef M_powerpc_linux Call_Pl(ma_test_call_c_lot_args, 1); if (x != 1) error(); //#endif } void FC test_call_c_lot_args1(WamWord n0, WamWord n1, WamWord n2, WamWord n3, WamWord n4, WamWord n5, void (*a) (), long b, int c, int d, double e, char *f, WamWord g, WamWord *h, WamWord i, WamWord *j, WamWord k, WamWord *l, WamWord m, WamWord *n, double o) { if (n0 != 0 || n1 != 0 || n2 != 0 || n3 != 0 || n4 != 0 || n5 != 0 || a != test_call_c_lot_args || b != 128 || c != 4095 || d != 123456789 || e != -3.141593 || strcmp(f, "abcd\01489def\n\r") || g != 123987 || h != &X(0) || i != 987654321 || j != &X(128) || k != 1928374 || l != &Y(E, 0) || m != 456789 || n != &Y(E, 6) || o != 1.23456) error(); x++; } void test_jump_ret(void) { printf("call_c()+jump_ret...\n"); x = 0; Call_Pl(ma_test_jump_ret, 1); if (x != 2) error(); } long FC test_jump_ret1(long addr) { #ifdef DEBUG extern void ma_test_jump_ret1(); printf("%x %x\n", addr, ma_test_jump_ret1); #endif x++; return addr; } void FC test_jump_ret2(void) { #ifdef DEBUG printf("in test jump_ret2\n"); #endif x++; } void test_fail_ret(void) { printf("call_c()+fail_ret...\n"); x = 0; ret = 1; Call_Pl(ma_test_fail_ret, 1); if (x != 1) error(); ret = 0; Call_Pl(ma_test_fail_ret, 0); } int FC test_fail_ret1(void) { x++; return ret; } void test_move_ret_mem(void) { printf("call_c()+move_ret mem...\n"); x = 0; Call_Pl(ma_test_move_ret_mem, 1); if (x != 3) error(); if (MA_GLOBAL_VAR1 != 123456789 || MA_ARRAY[64] != 123456789 || MA_ARRAY[4097] != 123456789) error(); } long FC test_move_ret_mem1(void) { x++; return 123456789; } void test_move_ret_x(void) { printf("call_c()+move_ret X()...\n"); x = 0; X(0) = -1; X(255) = -1; Call_Pl(ma_test_move_ret_x, 1); if (x != 2) error(); if (X(0) != 1234987 || X(255) != 45678) error(); } long FC test_move_ret_x1(void) { x++; return (x == 1) ? 1234987 : 45678; } void test_move_ret_y(void) { printf("call_c()+move_ret Y()...\n"); x = 0; Y(E, 0) = -1; Y(E, 11) = -1; Call_Pl(ma_test_move_ret_y, 1); if (x != 2) error(); if (Y(E, 0) != 1234987 || Y(E, 11) != 45678) error(); } long FC test_move_ret_y1(void) { x++; return (x == 1) ? 1234987 : 45678; } void test_move_ret_fl(void) { printf("call_c()+move_ret FL()...\n"); x = 0; foreign_long[0] = -1; foreign_long[11] = -1; Call_Pl(ma_test_move_ret_fl, 1); if (x != 2) error(); if (foreign_long[0] != 1234987 || foreign_long[11] != 45678) error(); } long FC test_move_ret_fl1(void) { x++; return (x == 1) ? 1234987 : 45678; } void test_move_ret_fd(void) { printf("call_c()+move_ret FD()...\n"); x = 0; foreign_double[0] = -1.0; foreign_double[11] = -1; Call_Pl(ma_test_move_ret_fd, 1); if (x != 2) error(); if (foreign_double[0] != 1.234987 || foreign_double[11] != -3.141593) error(); } double FC test_move_ret_fd1(void) { x++; return (x == 1) ? 1.234987 : -3.141593; } void test_switch_ret(void) { printf("call_c()+switch_ret...\n"); ALTB(B) = (WamCont) error; for (i = 0; swt[i] >= 0; i++) Call_Pl(ma_test_switch_ret, 1); Call_Pl(ma_test_switch_ret, 0); /* here swt[i]= -1 switch should fail */ } long FC test_switch_ret1(void) { return swt[i]; } void FC test_switch_ret2(int k) { if (k != i) error(); } #endif /*--- dummy functions needed by engine.c ---*/ void Init_Atom(void) { } void Init_Oper(void) { } void Init_Pred(void) { } void Init_Machine(void) { } void Find_Linked_Objects(void) { } void Fd_Init_Engine(void) { } int FC Create_Atom(char *name) { return 1; } PredInf * FC Lookup_Pred(int func, int arity) { return NULL; } void M_Allocate_Stacks(void) { } AtomInf atom_tbl[1]; void FC Create_Choice_Point(CodePtr codep_alt, int arity) { } void Fd_Init_Solver(void) { } void Fd_Reset_Solver(void) { } void SIGSEGV_Handler(void) { } int Is_Win32_SEGV(void *exp) { return 0; } #if defined(_WIN32) || defined(__CYGWIN__) EXCEPT_DISPOSITION Win32_SEH_Handler(EXCEPTION_RECORD *excp_rec, void *establisher_frame, CONTEXT *context_rec, void *dispatcher_cxt) { return 0; } #endif ./gprolog-1.3.0/src/Ma2Asm/ma2asm_inst.c0000644004425400513100000000516110547154142016227 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : mini-assembler to assembler translator * * File : ma2asm_inst.c * * Descr.: translation file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: ma2asm_inst.c,v 1.16 2007/01/04 10:35:14 diaz Exp $ */ #define MAPPER_FILE #include "ma_parser.h" #include "ma_protos.h" #include "../EnginePl/gp_config.h" #include "../EnginePl/wam_regs.h" #define FRAMES_ONLY #include "../EnginePl/wam_inst.h" #include "../EnginePl/machine.h" #include "../EnginePl/pl_params.h" #include "../EnginePl/obj_chain.h" #define Y_OFFSET(index) ((- ENVIR_STATIC_SIZE - 1 - index) * sizeof(long)) #if 0 /* to force the inclusion of a mapper */ #define M_ix86_darwin #include "ix86_any.c" #else /* include machine-dependent mapper file */ #if defined(M_ix86) #include "ix86_any.c" #elif defined(M_sparc) #include "sparc_any.c" #elif defined(M_alpha) #include "alpha_any.c" #elif defined(M_mips_irix) #include "mips_irix.c" #elif defined(M_powerpc) #include "powerpc_any.c" #elif defined(M_x86_64) #include "x86_64_any.c" #endif #endif ./gprolog-1.3.0/src/configure0000755004425400513100000061430310547440350014500 0ustar diazloco#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for gprolog 1.3.0. # # Report bugs to . # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='gprolog' PACKAGE_TARNAME='gprolog' PACKAGE_VERSION='1.3.0' PACKAGE_STRING='gprolog 1.3.0' PACKAGE_BUGREPORT='bug-prolog@gnu.org' ac_unique_file="SETVARS" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias PROLOG_NAME1 PROLOG_NAME PROLOG_VERSION PROLOG_DATE PROLOG_COPYRIGHT TOP_LEVEL GPLC HEXGPLC ENV_VARIABLE TOP_LEVEL_FLAGS CFLAGS_PREFIX_REG CFLAGS_MACHINE CFLAGS_UNSIGNED_CHAR LDLIBS LDGUILIBS ASM_SUFFIX OBJ_SUFFIX EXE_SUFFIX CC_OBJ_NAME_OPT CC_EXE_NAME_OPT AR_RC AR_SEP AS STRIP RC RCFLAGS RC_OUT_NAME_OPT LD LD_OUT_NAME_OPT LD_DLL_NAME_OPT ROOT_DIR ROOT_DIR1 PKG_NAME INSTALL_DIR LINKS_DIR DOC_DIR HTML_DIR EXAMPLES_DIR WIN_TMP_DIR WIN_CONF_OPT TXT_FILES BIN_FILES OBJ_FILES LIB_FILES INC_FILES DOC_FILES HTML_FILES EXPL_FILES EXC_FILES EXFD_FILES MAKE_LE_DIRS MAKE_W32GC_DIRS MAKE_FD_DIRS MAKE_LE_INTERF_OBJS MAKE_SOCKETS_OBJS DLL_W32GUICONS LIB_LINEDIT LIB_ENGINE_PL LIB_BIPS_PL LIB_ENGINE_FD LIB_BIPS_FD CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT MINGWAS RANLIB SET_MAKE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S build build_cpu build_vendor build_os host host_cpu host_vendor host_os CPP GREP EGREP LIBOBJS LTLIBOBJS' ac_subst_files='' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gprolog 1.3.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/gprolog] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gprolog 1.3.0:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-regs do not use machine registers --enable-ebp use the ebp register on ix86 machines --disable-fast-call do not use fast call on ix86 --disable-linedit do not include line editor facility --disable-piped-consult do not pipe stdin of pl2wam when consult/1 --disable-gui-console do not use the Win32 GUI console --disable-sockets do not include sockets facility --disable-fd-solver do not include the FD constraint solver Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-install-dir=DIR specify INSTALL_DIR --with-links-dir=DIR specify LINKS_DIR --with-doc-dir=DIR specify DOC_DIR --with-html-dir=DIR specify HTML_DIR --with-examples-dir=DIR specify EXAMPLES_DIR --with-msvc use MS VC++ --with-c-flags[=FLAGS] specify C flags Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gprolog configure 1.3.0 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gprolog $as_me 1.3.0, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # AC_CONFIG_AUX_DIR(ConfUtils) to do... # *************************** # * initial variable values * # *************************** PROLOG_NAME='GNU Prolog' PROLOG_NAME1='gprolog' PROLOG_VERSION='1.3.0' PROLOG_DATE='Jan 4 2007' PROLOG_COPYRIGHT='Copyright (C) 1999-2007 Daniel Diaz' TOP_LEVEL=$PROLOG_NAME1 GPLC=gplc HEXGPLC=hexgplc ENV_VARIABLE=PL_PATH USE_EBP=no USE_LINEDIT=yes USE_GUI_CONSOLE=yes USE_SOCKETS=yes USE_FD_SOLVER=yes DLL_W32GUICONS=w32guicons LIB_LINEDIT=liblinedit LIB_ENGINE_PL=libengine_pl LIB_BIPS_PL=libbips_pl LIB_ENGINE_FD=libengine_fd LIB_BIPS_FD=libbips_fd # ****************** # * variable names * # ****************** # ******************* # * package options * # ******************* # Check whether --with-install-dir was given. if test "${with_install_dir+set}" = set; then withval=$with_install_dir; WITH_INSTALL_DIR="$withval" fi # Check whether --with-links-dir was given. if test "${with_links_dir+set}" = set; then withval=$with_links_dir; WITH_LINKS_DIR="$withval" fi # Check whether --with-doc-dir was given. if test "${with_doc_dir+set}" = set; then withval=$with_doc_dir; WITH_DOC_DIR="$withval" fi # Check whether --with-html-dir was given. if test "${with_html_dir+set}" = set; then withval=$with_html_dir; WITH_HTML_DIR="$withval" fi # Check whether --with-examples-dir was given. if test "${with_examples_dir+set}" = set; then withval=$with_examples_dir; WITH_EXAMPLES_DIR="$withval" fi # Check whether --with-msvc was given. if test "${with_msvc+set}" = set; then withval=$with_msvc; WITH_MSVC="$withval" else WITH_MSVC=no fi # Check whether --with-c-flags was given. if test "${with_c_flags+set}" = set; then withval=$with_c_flags; WITH_C_FLAGS="$withval" else WITH_C_FLAGS=yes fi # Check whether --enable-regs was given. if test "${enable_regs+set}" = set; then enableval=$enable_regs; case "$enableval" in no) cat >>confdefs.h <<\_ACEOF #define NO_USE_REGS 1 _ACEOF ;; *) ;; esac fi # Check whether --enable-ebp was given. if test "${enable_ebp+set}" = set; then enableval=$enable_ebp; case "$enableval" in yes) USE_EBP=yes;; *) ;; esac fi # Check whether --enable-fast-call was given. if test "${enable_fast_call+set}" = set; then enableval=$enable_fast_call; case "$enableval" in no) cat >>confdefs.h <<\_ACEOF #define NO_USE_FAST_CALL 1 _ACEOF ;; *) ;; esac fi # Check whether --enable-linedit was given. if test "${enable_linedit+set}" = set; then enableval=$enable_linedit; case "$enableval" in no) cat >>confdefs.h <<\_ACEOF #define NO_USE_LINEDIT 1 _ACEOF USE_LINEDIT=no;; *) ;; esac fi # Check whether --enable-piped-consult was given. if test "${enable_piped_consult+set}" = set; then enableval=$enable_piped_consult; case "$enableval" in no) cat >>confdefs.h <<\_ACEOF #define NO_USE_PIPED_STDIN_FOR_CONSULT 1 _ACEOF ;; *) ;; esac fi # Check whether --enable-gui-console was given. if test "${enable_gui_console+set}" = set; then enableval=$enable_gui_console; case "$enableval" in no) cat >>confdefs.h <<\_ACEOF #define NO_USE_GUI_CONSOLE 1 _ACEOF USE_GUI_CONSOLE=no;; *) USE_GUI_CONSOLE=yes;; esac fi # Check whether --enable-sockets was given. if test "${enable_sockets+set}" = set; then enableval=$enable_sockets; case "$enableval" in no) cat >>confdefs.h <<\_ACEOF #define NO_USE_SOCKETS 1 _ACEOF USE_SOCKETS=no;; *) ;; esac fi # Check whether --enable-fd-solver was given. if test "${enable_fd_solver+set}" = set; then enableval=$enable_fd_solver; case "$enableval" in no) cat >>confdefs.h <<\_ACEOF #define NO_USE_FD_SOLVER 1 _ACEOF USE_FD_SOLVER=no;; *) ;; esac fi if test "$USE_EBP" = no; then cat >>confdefs.h <<\_ACEOF #define NO_USE_EBP 1 _ACEOF fi # *********************** # * checks for programs * # *********************** if test "$WITH_MSVC" != no; then echo "using MSVC++ as C compiler" CC=cl WIN_CONF_OPT=--with-msvc fi # should be always done to correctly set EXEEXT (CC is set to cl for MSVC) # cannot be put in the then and the else part !!! so repeat the test ! ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } if test -z "$ac_file"; then echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6; } { echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "$WITH_MSVC" != no; then ASM_SUFFIX='.s' OBJ_SUFFIX='.obj' LIB_SUFFIX='.lib' CC_OBJ_NAME_OPT='-Fo' CC_EXE_NAME_OPT='-Fe' for ac_prog in mingw-as do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_MINGWAS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$MINGWAS"; then ac_cv_prog_MINGWAS="$MINGWAS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MINGWAS="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MINGWAS=$ac_cv_prog_MINGWAS if test -n "$MINGWAS"; then { echo "$as_me:$LINENO: result: $MINGWAS" >&5 echo "${ECHO_T}$MINGWAS" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$MINGWAS" && break done test -n "$MINGWAS" || MINGWAS="no" if test "$MINGWAS" = no; then { { echo "$as_me:$LINENO: error: mingw-as.exe (MinGW as.exe) is required with MSVC++ - A version can be found at gprolog.univ-paris1.fr/download/mingw-as.exe" >&5 echo "$as_me: error: mingw-as.exe (MinGW as.exe) is required with MSVC++ - A version can be found at gprolog.univ-paris1.fr/download/mingw-as.exe" >&2;} { (exit 1); exit 1; }; } fi AS=mingw-as AR_RC='lib -nologo -out:' AR_SEP='' STRIP=: RANLIB=: RC=rc RCFLAGS='' RC_OUT_NAME_OPT='-fo' LD=link LD_OUT_NAME_OPT='-out:' LD_DLL_NAME_OPT='-dll' else if test "$GCC" != yes; then { { echo "$as_me:$LINENO: error: gcc is required (or MSVC++ under win32)" >&5 echo "$as_me: error: gcc is required (or MSVC++ under win32)" >&2;} { (exit 1); exit 1; }; } fi AS=as if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi ASM_SUFFIX='.s' OBJ_SUFFIX='.o' LIB_SUFFIX='.a' CC_OBJ_NAME_OPT='-o ' CC_EXE_NAME_OPT='-o ' RC='windres' RCFLAGS='-O coff' RC_OUT_NAME_OPT='-o ' LD=gcc LD_OUT_NAME_OPT='-o ' LD_DLL_NAME_OPT='-shared' AR_RC='ar rc ' AR_SEP=' ' STRIP=strip fi EXE_SUFFIX=$EXEEXT { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6; } fi DLL_W32GUICONS=$DLL_W32GUICONS.dll LIB_LINEDIT=$LIB_LINEDIT$LIB_SUFFIX LIB_ENGINE_PL=$LIB_ENGINE_PL$LIB_SUFFIX LIB_BIPS_PL=$LIB_BIPS_PL$LIB_SUFFIX LIB_ENGINE_FD=$LIB_ENGINE_FD$LIB_SUFFIX LIB_BIPS_FD=$LIB_BIPS_FD$LIB_SUFFIX # ******************************* # * host detection and features * # ******************************* # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} { (exit 1); exit 1; }; } { echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6; } if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 echo "$as_me: error: invalid value of canonical build" >&2;} { (exit 1); exit 1; }; };; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6; } if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} { (exit 1); exit 1; }; } fi fi { echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 echo "$as_me: error: invalid value of canonical host" >&2;} { (exit 1); exit 1; }; };; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # determine windows path associated to posix path /tmp case "$host_os" in cygwin*) WIN_TMP_DIR=`cygpath -d -a /tmp`;; mingw*) WIN_TMP_DIR=`cd /tmp;pwd -W|sed -e 's:/:\\\:g'`;; esac if test "$WITH_MSVC" != no; then cat >>confdefs.h <<\_ACEOF #define M_ix86 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define M_win32 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define M_ix86_win32 1 _ACEOF host_vendor=Microsoft host_os=win32 WIN32=yes else WIN32=no case "$host_cpu" in mips*) cat >>confdefs.h <<\_ACEOF #define M_mips 1 _ACEOF ;; alpha*) cat >>confdefs.h <<\_ACEOF #define M_alpha 1 _ACEOF ;; sparc*) cat >>confdefs.h <<\_ACEOF #define M_sparc 1 _ACEOF ;; x86_64) cat >>confdefs.h <<\_ACEOF #define M_x86_64 1 _ACEOF ;; i*86) cat >>confdefs.h <<\_ACEOF #define M_ix86 1 _ACEOF ;; powerpc*|ppc*) cat >>confdefs.h <<\_ACEOF #define M_powerpc 1 _ACEOF ;; esac case "$host_os" in *osf*) cat >>confdefs.h <<\_ACEOF #define M_osf 1 _ACEOF ;; irix*) cat >>confdefs.h <<\_ACEOF #define M_irix 1 _ACEOF ;; sunos*) cat >>confdefs.h <<\_ACEOF #define M_sunos 1 _ACEOF ;; solaris*) cat >>confdefs.h <<\_ACEOF #define M_solaris 1 _ACEOF ;; linux*) cat >>confdefs.h <<\_ACEOF #define M_linux 1 _ACEOF ;; cygwin*) cat >>confdefs.h <<\_ACEOF #define M_cygwin 1 _ACEOF ;; mingw*) cat >>confdefs.h <<\_ACEOF #define M_mingw 1 _ACEOF MINGW=yes; WIN32=yes;; *sco*) cat >>confdefs.h <<\_ACEOF #define M_sco 1 _ACEOF ;; *bsd*) cat >>confdefs.h <<\_ACEOF #define M_bsd 1 _ACEOF ;; *darwin*) cat >>confdefs.h <<\_ACEOF #define M_bsd 1 _ACEOF ;; esac case "$host" in mips*irix*) cat >>confdefs.h <<\_ACEOF #define M_mips_irix 1 _ACEOF ;; sparc*sunos*) cat >>confdefs.h <<\_ACEOF #define M_sparc_sunos 1 _ACEOF ;; sparc*solaris*) cat >>confdefs.h <<\_ACEOF #define M_sparc_solaris 1 _ACEOF ;; sparc*bsd*) cat >>confdefs.h <<\_ACEOF #define M_sparc_bsd 1 _ACEOF ;; alpha*osf*) cat >>confdefs.h <<\_ACEOF #define M_alpha_osf 1 _ACEOF ;; alpha*linux*) cat >>confdefs.h <<\_ACEOF #define M_alpha_linux 1 _ACEOF ;; x86_64*linux*) cat >>confdefs.h <<\_ACEOF #define M_x86_64_linux 1 _ACEOF ;; i*86*linux*) cat >>confdefs.h <<\_ACEOF #define M_ix86_linux 1 _ACEOF ;; i*86*solaris*) cat >>confdefs.h <<\_ACEOF #define M_ix86_solaris 1 _ACEOF ;; i*86*sco*) cat >>confdefs.h <<\_ACEOF #define M_ix86_sco 1 _ACEOF ;; i*86*bsd*) cat >>confdefs.h <<\_ACEOF #define M_ix86_bsd 1 _ACEOF ;; i*86*cygwin*) cat >>confdefs.h <<\_ACEOF #define M_ix86_cygwin 1 _ACEOF ;; i*86*mingw*) cat >>confdefs.h <<\_ACEOF #define M_ix86_mingw 1 _ACEOF ;; i*86*darwin*) cat >>confdefs.h <<\_ACEOF #define M_ix86_darwin 1 _ACEOF ;; powerpc*linux*) cat >>confdefs.h <<\_ACEOF #define M_powerpc_linux 1 _ACEOF ;; powerpc*darwin*) cat >>confdefs.h <<\_ACEOF #define M_powerpc_darwin 1 _ACEOF ;; powerpc*bsd*) cat >>confdefs.h <<\_ACEOF #define M_powerpc_bsd 1 _ACEOF ;; *) { { echo "$as_me:$LINENO: error: unsupported architecture" >&5 echo "$as_me: error: unsupported architecture" >&2;} { (exit 1); exit 1; }; } esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Extract the first word of "grep ggrep" to use in msg output if test -z "$GREP"; then set dummy grep ggrep; ac_prog_name=$2 if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS fi GREP="$ac_cv_path_GREP" if test -z "$GREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 echo "${ECHO_T}$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else # Extract the first word of "egrep" to use in msg output if test -z "$EGREP"; then set dummy egrep; ac_prog_name=$2 if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS fi EGREP="$ac_cv_path_EGREP" if test -z "$EGREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { echo "$as_me:$LINENO: checking for long" >&5 echo $ECHO_N "checking for long... $ECHO_C" >&6; } if test "${ac_cv_type_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_long=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_long=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 echo "${ECHO_T}$ac_cv_type_long" >&6; } # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { echo "$as_me:$LINENO: checking size of long" >&5 echo $ECHO_N "checking size of long... $ECHO_C" >&6; } if test "${ac_cv_sizeof_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_long=$ac_lo;; '') if test "$ac_cv_type_long" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (long) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_long=0 fi ;; esac else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_sizeof_; static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (((long int) (sizeof (ac__type_sizeof_))) < 0) { long int i = longval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%ld\n", i); } else { unsigned long int i = ulongval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%lu\n", i); } return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_long=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) if test "$ac_cv_type_long" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (long) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_long=0 fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.val fi { echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 echo "${ECHO_T}$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF for ac_header in sys/ioctl_compat.h termios.h malloc.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## --------------------------------- ## ## Report this to bug-prolog@gnu.org ## ## --------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in stdlib.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## --------------------------------- ## ## Report this to bug-prolog@gnu.org ## ## --------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { echo "$as_me:$LINENO: checking for working mmap" >&5 echo $ECHO_N "checking for working mmap... $ECHO_C" >&6; } if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_mmap_fixed_mapped=no else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE /* Assume that all systems that can run configure have sys/param.h. */ # ifndef HAVE_SYS_PARAM_H # define HAVE_SYS_PARAM_H 1 # endif # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; int i, pagesize; int fd; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 1; if (write (fd, data, pagesize) != pagesize) return 1; close (fd); /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 1; data2 = (char *) malloc (2 * pagesize); if (!data2) return 1; data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1); if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 1; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 1; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 1; if (read (fd, data3, pagesize) != pagesize) return 1; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 1; close (fd); return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_mmap_fixed_mapped=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5 echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_MMAP 1 _ACEOF fi rm -f conftest.mmap for ac_func in mprotect mallopt fgetc do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { echo "$as_me:$LINENO: checking for socklen_t" >&5 echo $ECHO_N "checking for socklen_t... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include socklen_t x; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int accept(int, struct sockaddr *, size_t *); int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then { echo "$as_me:$LINENO: result: size_t" >&5 echo "${ECHO_T}size_t" >&6; } cat >>confdefs.h <<\_ACEOF #define socklen_t size_t _ACEOF else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { echo "$as_me:$LINENO: result: int" >&5 echo "${ECHO_T}int" >&6; } cat >>confdefs.h <<\_ACEOF #define socklen_t int _ACEOF fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # ******************** # * C compiler flags * # ******************** CFLAGS_MACHINE= CFLAGS_PREFIX_REG= { echo "$as_me:$LINENO: checking for inline" >&5 echo $ECHO_N "checking for inline... $ECHO_C" >&6; } if test "${ac_cv_c_inline+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_inline=$ac_kw else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 echo "${ECHO_T}$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac if test "$WITH_MSVC" != no; then case "$WITH_C_FLAGS" in debug) CFLAGS='-W3 -ZI -EHsc';; no) CFLAGS='';; yes) CFLAGS='-O2 -EHsc';; *) CFLAGS="$WITH_C_FLAGS";; esac CFLAGS_UNSIGNED_CHAR='-J' CFLAGS_MACHINE='-nologo -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE' else case "$WITH_C_FLAGS" in debug) CFLAGS='-g -Wall';; no) CFLAGS='';; yes) CFLAGS='-O3 -fomit-frame-pointer';; *) CFLAGS="$WITH_C_FLAGS";; esac # -fomit-frame-pointer does not work on MinGW (tested with gcc 3.3.3) if test "$MINGW-$WITH_C_FLAGS" = yes-yes; then CFLAGS='-O3' fi CFLAGS_PREFIX_REG='-ffixed-%s' CFLAGS_UNSIGNED_CHAR='-funsigned-char' CFLAGS_MACHINE= case "$host" in mips*irix*) CFLAGS_MACHINE='-march=4000';; *sparc*sunos4.1.3) CFLAGS_MACHINE='-msupersparc';; *sparc*solaris) CFLAGS_MACHINE='-msupersparc';; i686*) CFLAGS_MACHINE='-march=pentiumpro';; i586*) CFLAGS_MACHINE='-march=pentium';; i*86*) CFLAGS_MACHINE='-march=i486';; powerpc*darwin*) CFLAGS_MACHINE='-mpowerpc -no-cpp-precomp';; esac case "$host" in i*86*) if test "$USE_EBP" != no; then CF1=`echo $CFLAGS | sed -e 's/\(.*\)-fomit-frame-pointer\(.*\)/\1\2/'` if test "$CF1" != "$CFLAGS"; then echo use ebp and move -fomit-frame-pointer to CFLAGS_MACHINE CFLAGS=$CF1 CFLAGS_MACHINE="$CFLAGS_MACHINE -fomit-frame-pointer" else echo do not use ebp since -fomit-frame-pointer is not specified in CFLAGS USE_EBP=no cat >>confdefs.h <<\_ACEOF #define NO_USE_EBP 1 _ACEOF fi fi;; esac # case "$host" in # i*86*) CFLAGS_MACHINE="$CFLAGS_MACHINE -malign-loops=2 -malign-jumps=2 -malign-functions=2";; # esac # For MacOsX - try to avoid this (activate only for fast library fix) # case "$host" in # powerpc*darwin*) RANLIB="$RANLIB -c";; # esac fi # ******************** # * libraries to add * # ******************** if test "$WITH_MSVC" != no; then LDFLAGS='-nologo -F8000000' fi make_lib_list() { list='' if test $CC = cl -o $CC = lc; then for i; do list="$list $i.lib"; done else for i; do list="$list -l$i"; done fi echo $list } if test $WIN32 = yes; then LIB='advapi32 user32' GUILIB='kernel32 user32 gdi32 comdlg32 advapi32 comctl32 shell32 ole32 htmlhelp' # other libs: winspool.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib if test "$USE_SOCKETS" = yes; then LIB="$LIB ws2_32" fi else LIB='m' GUILIB='' if test "$USE_SOCKETS" = yes; then { echo "$as_me:$LINENO: checking for socket" >&5 echo $ECHO_N "checking for socket... $ECHO_C" >&6; } if test "${ac_cv_func_socket+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define socket to an innocuous variant, in case declares socket. For example, HP-UX 11i declares gettimeofday. */ #define socket innocuous_socket /* System header to define __stub macros and hopefully few prototypes, which can conflict with char socket (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef socket /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_socket || defined __stub___socket choke me #endif int main () { return socket (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_socket=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_socket=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_socket" >&5 echo "${ECHO_T}$ac_cv_func_socket" >&6; } if test $ac_cv_func_socket = yes; then : else { echo "$as_me:$LINENO: checking for socket in -lsocket" >&5 echo $ECHO_N "checking for socket in -lsocket... $ECHO_C" >&6; } if test "${ac_cv_lib_socket_socket+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_socket_socket=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_socket_socket=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5 echo "${ECHO_T}$ac_cv_lib_socket_socket" >&6; } if test $ac_cv_lib_socket_socket = yes; then LIB="$LIB socket" else { { echo "$as_me:$LINENO: error: cannot find socket library" >&5 echo "$as_me: error: cannot find socket library" >&2;} { (exit 1); exit 1; }; } fi fi { echo "$as_me:$LINENO: checking for gethostbyname" >&5 echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6; } if test "${ac_cv_func_gethostbyname+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define gethostbyname to an innocuous variant, in case declares gethostbyname. For example, HP-UX 11i declares gettimeofday. */ #define gethostbyname innocuous_gethostbyname /* System header to define __stub macros and hopefully few prototypes, which can conflict with char gethostbyname (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef gethostbyname /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_gethostbyname || defined __stub___gethostbyname choke me #endif int main () { return gethostbyname (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_gethostbyname=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6; } if test $ac_cv_func_gethostbyname = yes; then : else { echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6; } if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_nsl_gethostbyname=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6; } if test $ac_cv_lib_nsl_gethostbyname = yes; then LIB="$LIB nsl" fi fi # (No error here; just assume gethostbyname is in -lsocket.) fi fi LDLIBS=`make_lib_list $LIB` LDGUILIBS=`make_lib_list $GUILIB` # *********************** # * gp_config.h defines * # *********************** cat >>confdefs.h <<_ACEOF #define PROLOG_NAME "$PROLOG_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PROLOG_NAME1 "$PROLOG_NAME1" _ACEOF cat >>confdefs.h <<_ACEOF #define PROLOG_VERSION "$PROLOG_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PROLOG_DATE "$PROLOG_DATE" _ACEOF cat >>confdefs.h <<_ACEOF #define PROLOG_COPYRIGHT "$PROLOG_COPYRIGHT" _ACEOF cat >>confdefs.h <<_ACEOF #define TOP_LEVEL "$TOP_LEVEL" _ACEOF cat >>confdefs.h <<_ACEOF #define GPLC "$GPLC" _ACEOF cat >>confdefs.h <<_ACEOF #define HEXGPLC "$HEXGPLC" _ACEOF cat >>confdefs.h <<_ACEOF #define ENV_VARIABLE "$ENV_VARIABLE" _ACEOF cat >>confdefs.h <<_ACEOF #define M_CPU "$host_cpu" _ACEOF cat >>confdefs.h <<_ACEOF #define M_VENDOR "$host_vendor" _ACEOF cat >>confdefs.h <<_ACEOF #define M_OS "$host_os" _ACEOF cat >>confdefs.h <<_ACEOF #define CC "$CC" _ACEOF cat >>confdefs.h <<_ACEOF #define CFLAGS_PREFIX_REG "$CFLAGS_PREFIX_REG" _ACEOF cat >>confdefs.h <<_ACEOF #define CFLAGS "$CFLAGS" _ACEOF cat >>confdefs.h <<_ACEOF #define CFLAGS_MACHINE "$CFLAGS_MACHINE" _ACEOF cat >>confdefs.h <<_ACEOF #define LDFLAGS "$LDFLAGS" _ACEOF cat >>confdefs.h <<_ACEOF #define LDLIBS "$LDLIBS" _ACEOF cat >>confdefs.h <<_ACEOF #define AS "$AS" _ACEOF cat >>confdefs.h <<_ACEOF #define STRIP "$STRIP" _ACEOF cat >>confdefs.h <<_ACEOF #define ASM_SUFFIX "$ASM_SUFFIX" _ACEOF cat >>confdefs.h <<_ACEOF #define OBJ_SUFFIX "$OBJ_SUFFIX" _ACEOF cat >>confdefs.h <<_ACEOF #define EXE_SUFFIX "$EXE_SUFFIX" _ACEOF cat >>confdefs.h <<_ACEOF #define CC_OBJ_NAME_OPT "$CC_OBJ_NAME_OPT" _ACEOF cat >>confdefs.h <<_ACEOF #define CC_EXE_NAME_OPT "$CC_EXE_NAME_OPT" _ACEOF cat >>confdefs.h <<_ACEOF #define DLL_W32GUICONS "$DLL_W32GUICONS" _ACEOF cat >>confdefs.h <<_ACEOF #define LIB_LINEDIT "$LIB_LINEDIT" _ACEOF cat >>confdefs.h <<_ACEOF #define LIB_ENGINE_PL "$LIB_ENGINE_PL" _ACEOF cat >>confdefs.h <<_ACEOF #define LIB_BIPS_PL "$LIB_BIPS_PL" _ACEOF cat >>confdefs.h <<_ACEOF #define LIB_ENGINE_FD "$LIB_ENGINE_FD" _ACEOF cat >>confdefs.h <<_ACEOF #define LIB_BIPS_FD "$LIB_BIPS_FD" _ACEOF # *************** # * directories * # *************** # a function to compare 2 directories (avoid diff with trailing /) # does not take into account symlinks... same_directory() { f1=`dirname $1`/`basename $1` f2=`dirname $2`/`basename $2` test $f1 = $f2 } ROOT_DIR=`(cd .. ; pwd)` if test -x /bin/cygpath.exe; then ROOT_DIR1=`cygpath -a -w ..` else ROOT_DIR1=$ROOT_DIR fi test "$prefix" = NONE && prefix=/usr/local test "$exec_prefix" = NONE && exec_prefix=$prefix PKG_NAME=$PROLOG_NAME1-$PROLOG_VERSION # *-------------* # * INSTALL_DIR * # *-------------* if test "$prefix" = in-place -o "$WITH_INSTALL_DIR" = in-place; then IN_PLACE=yes INSTALL_DIR=$ROOT_DIR test -z "$WITH_LINKS_DIR" && WITH_LINKS_DIR=no else IN_PLACE=no if test -z "$WITH_INSTALL_DIR"; then INSTALL_DIR=$prefix/$PKG_NAME else INSTALL_DIR=$WITH_INSTALL_DIR fi fi # *-----------* # * LINKS_DIR * # *-----------* case "$WITH_LINKS_DIR" in no) LINKS_DIR=none;; '') LINKS_DIR=$exec_prefix/bin;; *) LINKS_DIR=$WITH_LINKS_DIR;; esac # *---------* # * DOC_DIR * # *---------* case "$WITH_DOC_DIR" in no) DOC_DIR=none; test -z "$WITH_HTML_DIR" && WITH_HTML_DIR=$INSTALL_DIR/doc/html_node;; '') DOC_DIR=$INSTALL_DIR/doc;; *) DOC_DIR=$WITH_DOC_DIR;; esac if same_directory "$DOC_DIR" $ROOT_DIR/doc; then DOC_DIR=none fi # *----------* # * HTML_DIR * # *----------* case "$WITH_HTML_DIR" in no) HTML_DIR=none;; '') if test "$DOC_DIR" = none; then WITH_HTML_DIR=no; HTML_DIR=none else HTML_DIR=$DOC_DIR/html_node fi;; *) HTML_DIR=$WITH_HTML_DIR;; esac if same_directory "$HTML_DIR" $ROOT_DIR/doc/html_node; then HTML_DIR=none fi # *--------------* # * EXAMPLES_DIR * # *--------------* case "$WITH_EXAMPLES_DIR" in no) EXAMPLES_DIR=none;; '') EXAMPLES_DIR=$INSTALL_DIR;; *) EXAMPLES_DIR=$WITH_EXAMPLES_DIR;; esac if same_directory "$EXAMPLES_DIR" $ROOT_DIR; then EXAMPLES_DIR=none fi # *---------* # * Summary * # *---------* echo 'DIRECTORIES' echo "--> Installation: $INSTALL_DIR" echo "--> Link to binaries: $LINKS_DIR" echo "--> Documentation: $DOC_DIR" echo "--> HTML documentation: $HTML_DIR" echo "--> Examples: $EXAMPLES_DIR" # ****************** # * sub-components * # ****************** if test "$IN_PLACE" = no; then TXT_FILES='COPYING VERSION NEWS ChangeLog' else TXT_FILES= fi BIN_FILES= OBJ_FILES= LIB_FILES= INC_FILES="$PROLOG_NAME1.h fd_to_c.h" DOC_FILES='???*.dvi ???*.ps ???*.pdf ???*.chm ???*.eps ???*.html ???*.gif' HTML_FILES='???*.html ???*.gif ???*.css' EXPL_FILES='Makefile README PROGS ??*.pl' EXC_FILES='Makefile README ??*.pl ??*_c.c' EXFD_FILES='Makefile ??*.pl ??*.fd' B="$GPLC $HEXGPLC $TOP_LEVEL pl2wam wam2ma ma2asm" O="top_level all_pl_bips debugger" L="$LIB_ENGINE_PL $LIB_BIPS_PL" if test "$USE_GUI_CONSOLE" = yes -a \( "$USE_LINEDIT" = no -o "$WIN32" = no \) then cat >>confdefs.h <<\_ACEOF #define NO_USE_GUI_CONSOLE 1 _ACEOF USE_GUI_CONSOLE=no fi if test "$USE_LINEDIT" = yes; then MAKE_LE_DIRS='$(LE_DIRS)' MAKE_LE_INTERF_OBJS='$(LE_INTERF_OBJS)' L="$L $LIB_LINEDIT" else MAKE_LE_DIRS= MAKE_LE_INTERF_OBJS='$(NO_LE_INTERF_OBJS)' fi if test "$USE_GUI_CONSOLE" = yes; then TOP_LEVEL_FLAGS=--gui-console MAKE_W32GC_DIRS='$(W32GC_DIRS)' O="$O w32gc_interf" BIN_FILES="$DLL_W32GUICONS" else TOP_LEVEL_FLAGS= MAKE_W32GC_DIRS= fi if test "$USE_SOCKETS" = yes; then MAKE_SOCKETS_OBJS='$(SOCKETS_OBJS)' else MAKE_SOCKETS_OBJS='$(NO_SOCKETS_OBJS)' fi if test "$USE_FD_SOLVER" = yes; then MAKE_FD_DIRS='$(FD_DIRS)' B="$B fd2c" L="$L $LIB_ENGINE_FD $LIB_BIPS_FD" O="$O all_fd_bips" else MAKE_FD_DIRS= fi for i in $B; do BIN_FILES="$BIN_FILES $i$EXE_SUFFIX" done for i in $O; do OBJ_FILES="$OBJ_FILES $i$OBJ_SUFFIX" done LIB_FILES=$L # *********************** # * Version & Copyright * # *********************** echo "$PKG_NAME" >VERSION echo "$PKG_NAME" >../VERSION echo "$PROLOG_VERSION" >/tmp/version_no.tex if diff /tmp/version_no.tex ../doc/version_no.tex >/dev/null 2>&1; then rm /tmp/version_no.tex else mv /tmp/version_no.tex ../doc/version_no.tex fi echo "$PROLOG_COPYRIGHT" >/tmp/copyright.tex if diff /tmp/copyright.tex ../doc/copyright.tex >/dev/null 2>&1; then rm /tmp/copyright.tex else mv /tmp/copyright.tex ../doc/copyright.tex fi # ******************** # * Files generation * # ******************** OTHER_MAKEFILES= for i in TestsPl/Makefile DevUtils/Makefile Ma2Asm/FromC/Makefile Win32/Makefile Win32/gp-setup.iss do if test -f $i.in; then OTHER_MAKEFILES="$OTHER_MAKEFILES $i" fi done ac_config_headers="$ac_config_headers EnginePl/gp_config.h" ac_config_files="$ac_config_files Makefile TopComp/Makefile Pl2Wam/Makefile Wam2Ma/Makefile Ma2Asm/Makefile Fd2C/Makefile Linedit/Makefile W32GUICons/Makefile EnginePl/Makefile BipsPl/Makefile EngineFD/Makefile BipsFD/Makefile $OTHER_MAKEFILES" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gprolog $as_me 1.3.0, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ gprolog config.status 1.3.0 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "EnginePl/gp_config.h") CONFIG_HEADERS="$CONFIG_HEADERS EnginePl/gp_config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "TopComp/Makefile") CONFIG_FILES="$CONFIG_FILES TopComp/Makefile" ;; "Pl2Wam/Makefile") CONFIG_FILES="$CONFIG_FILES Pl2Wam/Makefile" ;; "Wam2Ma/Makefile") CONFIG_FILES="$CONFIG_FILES Wam2Ma/Makefile" ;; "Ma2Asm/Makefile") CONFIG_FILES="$CONFIG_FILES Ma2Asm/Makefile" ;; "Fd2C/Makefile") CONFIG_FILES="$CONFIG_FILES Fd2C/Makefile" ;; "Linedit/Makefile") CONFIG_FILES="$CONFIG_FILES Linedit/Makefile" ;; "W32GUICons/Makefile") CONFIG_FILES="$CONFIG_FILES W32GUICons/Makefile" ;; "EnginePl/Makefile") CONFIG_FILES="$CONFIG_FILES EnginePl/Makefile" ;; "BipsPl/Makefile") CONFIG_FILES="$CONFIG_FILES BipsPl/Makefile" ;; "EngineFD/Makefile") CONFIG_FILES="$CONFIG_FILES EngineFD/Makefile" ;; "BipsFD/Makefile") CONFIG_FILES="$CONFIG_FILES BipsFD/Makefile" ;; "$OTHER_MAKEFILES") CONFIG_FILES="$CONFIG_FILES $OTHER_MAKEFILES" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim PROLOG_NAME1!$PROLOG_NAME1$ac_delim PROLOG_NAME!$PROLOG_NAME$ac_delim PROLOG_VERSION!$PROLOG_VERSION$ac_delim PROLOG_DATE!$PROLOG_DATE$ac_delim PROLOG_COPYRIGHT!$PROLOG_COPYRIGHT$ac_delim TOP_LEVEL!$TOP_LEVEL$ac_delim GPLC!$GPLC$ac_delim HEXGPLC!$HEXGPLC$ac_delim ENV_VARIABLE!$ENV_VARIABLE$ac_delim TOP_LEVEL_FLAGS!$TOP_LEVEL_FLAGS$ac_delim CFLAGS_PREFIX_REG!$CFLAGS_PREFIX_REG$ac_delim CFLAGS_MACHINE!$CFLAGS_MACHINE$ac_delim CFLAGS_UNSIGNED_CHAR!$CFLAGS_UNSIGNED_CHAR$ac_delim LDLIBS!$LDLIBS$ac_delim LDGUILIBS!$LDGUILIBS$ac_delim ASM_SUFFIX!$ASM_SUFFIX$ac_delim OBJ_SUFFIX!$OBJ_SUFFIX$ac_delim EXE_SUFFIX!$EXE_SUFFIX$ac_delim CC_OBJ_NAME_OPT!$CC_OBJ_NAME_OPT$ac_delim CC_EXE_NAME_OPT!$CC_EXE_NAME_OPT$ac_delim AR_RC!$AR_RC$ac_delim AR_SEP!$AR_SEP$ac_delim AS!$AS$ac_delim STRIP!$STRIP$ac_delim RC!$RC$ac_delim RCFLAGS!$RCFLAGS$ac_delim RC_OUT_NAME_OPT!$RC_OUT_NAME_OPT$ac_delim LD!$LD$ac_delim LD_OUT_NAME_OPT!$LD_OUT_NAME_OPT$ac_delim LD_DLL_NAME_OPT!$LD_DLL_NAME_OPT$ac_delim ROOT_DIR!$ROOT_DIR$ac_delim ROOT_DIR1!$ROOT_DIR1$ac_delim PKG_NAME!$PKG_NAME$ac_delim INSTALL_DIR!$INSTALL_DIR$ac_delim LINKS_DIR!$LINKS_DIR$ac_delim DOC_DIR!$DOC_DIR$ac_delim HTML_DIR!$HTML_DIR$ac_delim EXAMPLES_DIR!$EXAMPLES_DIR$ac_delim WIN_TMP_DIR!$WIN_TMP_DIR$ac_delim WIN_CONF_OPT!$WIN_CONF_OPT$ac_delim TXT_FILES!$TXT_FILES$ac_delim BIN_FILES!$BIN_FILES$ac_delim OBJ_FILES!$OBJ_FILES$ac_delim LIB_FILES!$LIB_FILES$ac_delim INC_FILES!$INC_FILES$ac_delim DOC_FILES!$DOC_FILES$ac_delim HTML_FILES!$HTML_FILES$ac_delim EXPL_FILES!$EXPL_FILES$ac_delim EXC_FILES!$EXC_FILES$ac_delim EXFD_FILES!$EXFD_FILES$ac_delim MAKE_LE_DIRS!$MAKE_LE_DIRS$ac_delim MAKE_W32GC_DIRS!$MAKE_W32GC_DIRS$ac_delim MAKE_FD_DIRS!$MAKE_FD_DIRS$ac_delim MAKE_LE_INTERF_OBJS!$MAKE_LE_INTERF_OBJS$ac_delim MAKE_SOCKETS_OBJS!$MAKE_SOCKETS_OBJS$ac_delim DLL_W32GUICONS!$DLL_W32GUICONS$ac_delim LIB_LINEDIT!$LIB_LINEDIT$ac_delim LIB_ENGINE_PL!$LIB_ENGINE_PL$ac_delim LIB_BIPS_PL!$LIB_BIPS_PL$ac_delim LIB_ENGINE_FD!$LIB_ENGINE_FD$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF CEOF$ac_eof _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF LIB_BIPS_FD!$LIB_BIPS_FD$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CC!$ac_ct_CC$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim MINGWAS!$MINGWAS$ac_delim RANLIB!$RANLIB$ac_delim SET_MAKE!$SET_MAKE$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim LN_S!$LN_S$ac_delim build!$build$ac_delim build_cpu!$build_cpu$ac_delim build_vendor!$build_vendor$ac_delim build_os!$build_os$ac_delim host!$host$ac_delim host_cpu!$host_cpu$ac_delim host_vendor!$host_vendor$ac_delim host_os!$host_os$ac_delim CPP!$CPP$ac_delim GREP!$GREP$ac_delim EGREP!$EGREP$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 28; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$ac_file_inputs $ac_f" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input="Generated from "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; :H) # # CONFIG_HEADER # _ACEOF # Transform confdefs.h into a sed script `conftest.defines', that # substitutes the proper values into config.h.in to produce config.h. rm -f conftest.defines conftest.tail # First, append a space to every undef/define line, to ease matching. echo 's/$/ /' >conftest.defines # Then, protect against being on the right side of a sed subst, or in # an unquoted here document, in config.status. If some macros were # called several times there might be several #defines for the same # symbol, which is useless. But do not sort them, since the last # AC_DEFINE must be honored. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* # These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where # NAME is the cpp macro being defined, VALUE is the value it is being given. # PARAMS is the parameter list in the macro definition--in most cases, it's # just an empty string. ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' ac_dB='\\)[ (].*,\\1define\\2' ac_dC=' ' ac_dD=' ,' uniq confdefs.h | sed -n ' t rset :rset s/^[ ]*#[ ]*define[ ][ ]*// t ok d :ok s/[\\&,]/\\&/g s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p ' >>conftest.defines # Remove the space that was appended to ease matching. # Then replace #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. # (The regexp can be short, since the line contains either #define or #undef.) echo 's/ $// s,^[ #]*u.*,/* & */,' >>conftest.defines # Break up conftest.defines: ac_max_sed_lines=50 # First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" # Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" # Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" # et cetera. ac_in='$ac_file_inputs' ac_out='"$tmp/out1"' ac_nxt='"$tmp/out2"' while : do # Write a here document: cat >>$CONFIG_STATUS <<_ACEOF # First, check the format of the line: cat >"\$tmp/defines.sed" <<\\CEOF /^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def /^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def b :def _ACEOF sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail grep . conftest.tail >/dev/null || break rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines conftest.tail echo "ac_result=$ac_in" >>$CONFIG_STATUS cat >>$CONFIG_STATUS <<\_ACEOF if test x"$ac_file" != x-; then echo "/* $configure_input */" >"$tmp/config.h" cat "$ac_result" >>"$tmp/config.h" if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else rm -f $ac_file mv "$tmp/config.h" $ac_file fi else echo "/* $configure_input */" cat "$ac_result" fi rm -f "$tmp/out12" ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi ./gprolog-1.3.0/src/Win32/0000777004425400513100000000000010547442376013502 5ustar diazloco./gprolog-1.3.0/src/Win32/gp-setup.iss.in0000755004425400513100000000525010547171332016363 0ustar diazloco; GNU Prolog WIN32 installation script for Inno Setup 4 [Setup] AppName=GNU Prolog AppVerName=GNU Prolog version @PROLOG_VERSION@ AppVersion=@PROLOG_VERSION@ AppPublisher=Daniel Diaz AppPublisherURL=http://www.gprolog.org AppSupportURL=http://www.gprolog.org AppUpdatesURL=http://www.gprolog.org DefaultDirName={sd}\GNU-Prolog DefaultGroupName=GNU Prolog AllowNoIcons=yes SourceDir=@WIN_TMP_DIR@\gprolog_win32 OutputDir=@WIN_TMP_DIR@ OutputBaseFileName=setup-gprolog-@PROLOG_VERSION@ ; TO DO: create an association for .pl and .pro files ; ChangesAssociations=yes ; uncomment the following line if you want your installation to run on NT 3.51 too. ; MinVersion=4,3.51 [Tasks] Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"; MinVersion: 4,4 [Files] Source: "*.*"; DestDir: "{app}"; Flags: ignoreversion Source: "bin\*.*"; DestDir: "{app}\bin"; Flags: ignoreversion Source: "lib\*.*"; DestDir: "{app}\lib"; Flags: ignoreversion Source: "lib\*.dll"; DestDir: "{app}\bin"; Flags: ignoreversion skipifsourcedoesntexist Source: "include\*.*"; DestDir: "{app}\include"; Flags: ignoreversion Source: "doc\*.*"; DestDir: "{app}\doc"; Flags: ignoreversion Source: "doc\html_node\*.*"; DestDir: "{app}\doc\html_node"; Flags: ignoreversion Source: "ExamplesPl\*.*"; DestDir: "{app}\ExamplesPl"; Flags: ignoreversion Source: "ExamplesFD\*.*"; DestDir: "{app}\ExamplesFD"; Flags: ignoreversion Source: "ExamplesC\*.*"; DestDir: "{app}\ExamplesC"; Flags: ignoreversion [INI] Filename: "{app}\gprolog.url"; Section: "InternetShortcut"; Key: "URL"; String: "http://www.gprolog.org" [Icons] Name: "{group}\GNU Prolog"; Filename: "{app}\bin\gprolog.exe" Name: "{group}\Help"; Filename: "{app}\doc\manual.chm" Name: "{group}\Html Manual"; Filename: "{app}\doc\html_node\index.html" Name: "{group}\The GNU Prolog Web Site"; Filename: "{app}\gprolog.url" Name: "{group}\Uninstall GNU Prolog"; Filename: "{uninstallexe}" Name: "{userdesktop}\GNU Prolog"; Filename: "{app}\bin\gprolog.exe"; MinVersion: 4,4; Tasks: desktopicon [Registry] Root: HKCU; Subkey: "Software\GnuProlog"; ValueType: string; ValueName: "Version"; ValueData: "@PROLOG_VERSION@" Root: HKCU; Subkey: "Software\GnuProlog"; ValueType: string; ValueName: "RootPath"; ValueData: "{app}" [Run] Filename: "{app}\bin\create_bat.exe"; Parameters: """{sd}"" ""{app}"" install"; Description: "Create {sd}\gprologvars.bat and update autoexec.bat" Filename: "{app}\bin\gprolog.exe"; Description: "Launch GNU Prolog"; Flags: nowait postinstall skipifsilent [UninstallRun] Filename: "{app}\bin\create_bat.exe"; Parameters: """{sd}"" ""{app}"" uninstall" [UninstallDelete] Type: files; Name: "{app}\gprolog.url" ./gprolog-1.3.0/src/Win32/compile_install0000755004425400513100000000046410046717202016571 0ustar diazloco#!/bin/sh # compile_install CONFOPT SRCPATH DSTPATH confopt="$1" src="$2" dst="$3" cd $src || exit 1 ( if test -d ../doc; then cd ../doc; else cd ../../doc; fi; \ make chm ) || exit 1 ./configure $confopt --with-install-dir=$dst --without-links-dir || exit 1 make || exit 1 make install ./gprolog-1.3.0/src/Win32/create_bat.c0000644004425400513100000001137710547154143015734 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Win32 installation * * File : create_bat.c * * Descr.: gprologvars.bat creation (for command-line mode) * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: create_bat.c,v 1.8 2007/01/04 10:35:15 diaz Exp $ */ #include #include #include #include #include #if defined(__unix__) || defined(__CYGWIN__) #include #endif #define L(msg) fprintf(f, "%s\n", msg) /*-------------------------------------------------------------------------* * MAIN * * * * argv[1]: the system drive * * argv[2]: the GNU Prolog root path * * argv[3]: i(nstall) or u(ninstall) * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { char buff[1024]; char call[1024]; int install; FILE *f; int fd, l; int file_size, size; char *data, *p, *q; char *newline; if (argc != 4) { fprintf(stderr, "Usage: %s SYSTEM_DRIVE GPROLOG_PATH INSTALL/UNINSTALL\n", argv[0]); return 1; } install = (argv[3][0] == 'i' || argv[3][0] == 'I'); sprintf(buff, "%s\\gprologvars.bat", argv[1]); sprintf(call, "call %s", buff); l = strlen(call); if (install) { if ((f = fopen(buff, "wt")) == NULL) { perror(buff); fprintf(stderr, "If needed, add %s\\bin to your PATH - press RETURN\n", argv[2]); fflush(stderr); gets(buff); return 1; } L("@echo off"); L("echo Setting environment for using GNU Prolog"); sprintf(buff, "PATH=%%PATH%%;\"%s\\bin\"", argv[2]); L(buff); fclose(f); } else if (access(buff, 0) == 0 && unlink(buff) != 0) return 1; sprintf(buff, "%s\\autoexec.bat", argv[1]); if ((fd = open(buff, O_RDONLY | O_BINARY)) < 0) return 0; file_size = (int) lseek(fd, 0, SEEK_END); lseek(fd, 0, SEEK_SET); data = (char *) malloc(file_size + l + 32); if (data == NULL) return 1; if (read(fd, data, file_size) != file_size) return 1; close(fd); data[file_size] = '\0'; q = strchr(data, '\r'); if (q != NULL && q[1] == '\n') newline = "\r\n"; else newline = "\n"; if (data[file_size - 1] != '\n') strcpy(data + file_size, newline); p = data; for(;;) { if (strnicmp(p, call, l) != 0) { next_line: p = strchr(p, '\n'); if (p == NULL) break; p++; continue; } q = p + l; while(*q == ' ' || *q == '\t' || *q == '\r') q++; if (*q != '\n') goto next_line; /* here the call line is found */ if (install) return 0; q++; memmove(p, q, strlen(q) + 1); /* remove the line */ /* reconsider this line */ } size = strlen(data); if (install) { sprintf(data + size, "%s%s", call, newline); size += l + strlen(newline); } if (file_size == size) return 0; if ((fd = open(buff, O_WRONLY | O_BINARY | O_TRUNC)) < 0) return 1; if (write(fd, data, size) < 0) return 1; return close(fd) != 0; } ./gprolog-1.3.0/src/Win32/Makefile.in0000755004425400513100000000200310547152474015536 0ustar diazlocoNAME = @PROLOG_NAME1@ VERSION = @PROLOG_VERSION@ PKG_NAME = @PKG_NAME@ CC = @CC@ @CFLAGS_MACHINE@ CFLAGS = @CFLAGS@ WIN_TMP_DIR = @WIN_TMP_DIR@ WIN_CONF_OPT = @WIN_CONF_OPT@ ISCC = iscc.exe AS = @AS@ # the name gprolog_win32 is also used inside gp-setup.iss.in TMPDIR=/tmp/gprolog_win32 create_bat@EXE_SUFFIX@: create_bat.c $(CC) $(CFLAGS) @CC_EXE_NAME_OPT@create_bat@EXE_SUFFIX@ create_bat.c compile: ../$(PKG_NAME).tar.gz cp ../$(PKG_NAME).tar.gz /tmp (cd /tmp; tar xfz $(PKG_NAME).tar.gz) compile_install "$(WIN_CONF_OPT)" /tmp/$(PKG_NAME)/src $(TMPDIR) compile-link: compile_install "$(WIN_CONF_OPT)" .. $(TMPDIR) setup: compile create-setup setup-link: compile-link create-setup create-setup: create_bat.exe cp `which $(AS)` $(TMPDIR)/bin cp create_bat.exe $(TMPDIR)/bin $(ISCC) gp-setup.iss ../$(PKG_NAME).tar.gz: (cd ..; make dist) clean: rm -rf create_bat@OBJ_SUFFIX@ create_bat@EXE_SUFFIX@ /tmp/$(PKG_NAME).tar.gz /tmp/$(PKG_NAME) $(TMPDIR) ./gprolog-1.3.0/src/Win32/create-initial.iss0000755004425400513100000000120310055117261017071 0ustar diazloco#!/bin/sh # create-initial.iss [SRCFILE] [DSTFILE] # this script recreates gp-setup.iss.in from a gp-setup.iss # useful when modifying gp-setup.iss under Inno Setup interactive compiler # simply replace version number by @VERSION@ src=${1:-gp-setup.iss} dst=${2:-gp-setup.iss.in} set -x tmp=`grep OutputDir $src | cut --delimiter== --fields=2 | \ sed s!\\\\\\\\!\\\\\\\\\\\\\\\\!g` echo "tmp = <$tmp>" if [ "$tmp" = "" ]; then echo "CANNOT FIND WIN_TMP_DIR in $src" exit 1 fi sed -e 's![0-9]\{1,2\}\.[0-9]\{1,2\}\.[0-9]\{1,2\}!@PROLOG_VERSION@!g' \ -e "s!$tmp!@WIN_TMP_DIR@!g" \ $src >$dst ./gprolog-1.3.0/src/Win32/README0000644004425400513100000000252310535526653014356 0ustar diazloco Building GNU-Prolog Win32 Setup ------------------------------- Auto-extract installation files are created with Inno Setup (version > 5.0). Refer to http://www.jrsoftware.org/ for more information. Note: this works under cygwin or MSYS. Under MSYS it is necessary to first create the distrib under cygwin using make dist (because mingw does not support links). Then simply do (under mingw) make setup (setup-link will NOT work). 1) Building a setup classically ------------------------------- To build a setup for GNU-Prolog: make setup The stages executed are: 1- build a distribution file (gprolog-VERSION.tar.gz) if needed using 'make dist' in the src (parent) directory. 2- copy it under the /tmp 3- uncompres it 4- configure 5- compile locally 6- install it in /tmp/gprolog_win32 7- build the setup auto-extract file The setup file is created in /tmp and called setup-gprolog-VERSION.exe 2) Building a setup fastly -------------------------- If you have locally compiled GNU-Prolog (using './configure' followed by 'make' in the src (parent) directory) you can avoid stages 1, 2, 3, and 5 described above using: make setup-link This will do a ./configure in src (parent) directory to specify /tmp/gprolog_win32 as install dir, then make and make install. The setup file is created similarly. ./gprolog-1.3.0/src/Wam2Ma/0000777004425400513100000000000010547442376013664 5ustar diazloco./gprolog-1.3.0/src/Wam2Ma/bt_string.c0000644004425400513100000001233610547154143016014 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : WAM to mini-assembler translator * * File : bt_string.c * * Descr.: string dico management (file included by wam2ma.c and ma2asm.c) * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: bt_string.c,v 1.11 2007/01/04 10:35:15 diaz Exp $ */ #include "bt_string.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void BT_String_List_Rec(BTNode *bt_node, void (*fct) ()); /*-------------------------------------------------------------------------* * BT_STRING_INIT * * * *-------------------------------------------------------------------------*/ void BT_String_Init(BTString *bt_str) { bt_str->tree = NULL; bt_str->nb_elem = 0; } /*-------------------------------------------------------------------------* * BT_STRING_ADD * * * *-------------------------------------------------------------------------*/ BTNode * BT_String_Add(BTString *bt_str, char *str) { BTNode **pbt_node = &bt_str->tree; BTNode *bt_node; int cmp; while(*pbt_node) { bt_node = *pbt_node; cmp = strcmp(str, bt_node->str); if (cmp == 0) return bt_node; pbt_node = (cmp < 0) ? &(bt_node->left) : &(bt_node->right); } if ((bt_node = (BTNode *) malloc(sizeof(BTNode))) == NULL) { fprintf(stderr, "Cannot allocate memory for BT string: %s\n", str); exit(1); } bt_node->str = str; bt_node->no = (bt_str->nb_elem)++; memset(bt_node->info, 0, sizeof(bt_node)->info); bt_node->left = bt_node->right = NULL; *pbt_node = bt_node; return bt_node; } /*-------------------------------------------------------------------------* * BT_STRING_LOOKUP * * * *-------------------------------------------------------------------------*/ BTNode * BT_String_Lookup(BTString *bt_str, char *str) { BTNode *bt_node = bt_str->tree; int cmp; while(bt_node) { cmp = strcmp(str, bt_node->str); if (cmp == 0) return bt_node; bt_node = (cmp < 0) ? bt_node->left : bt_node->right; } return NULL; } /*-------------------------------------------------------------------------* * BT_STRING_LIST * * * *-------------------------------------------------------------------------*/ void BT_String_List(BTString *bt_str, void (*fct) ()) { BT_String_List_Rec(bt_str->tree, fct); } /*-------------------------------------------------------------------------* * BT_STRING_LIST_REC * * * *-------------------------------------------------------------------------*/ void BT_String_List_Rec(BTNode *bt_node, void (*fct) ()) { if (bt_node == NULL) return; BT_String_List_Rec(bt_node->left, fct); (*fct) (bt_node->no, bt_node->str, bt_node->info); BT_String_List_Rec(bt_node->right, fct); } ./gprolog-1.3.0/src/Wam2Ma/bt_string.h0000644004425400513100000000527010547154143016020 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : WAM to mini-assembler translator * * File : bt_string.h * * Descr.: string dico management - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: bt_string.h,v 1.10 2007/01/04 10:35:15 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct btnode *PBTNode; typedef struct btnode { char *str; int no; char info[32]; /* a buffer to store some information */ PBTNode left; PBTNode right; } BTNode; typedef struct { BTNode *tree; int nb_elem; } BTString; /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ void BT_String_Init(BTString *bt_str); BTNode *BT_String_Add(BTString *bt_str, char *str); BTNode *BT_String_Lookup(BTString *bt_str, char *str); void BT_String_List(BTString *bt_str, void (*fct) ()); ./gprolog-1.3.0/src/Wam2Ma/wam_parser.c0000644004425400513100000004551710547154143016170 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : WAM to mini-assembler translator * * File : wam_parser.c * * Descr.: parser * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: wam_parser.c,v 1.13 2007/01/04 10:35:15 diaz Exp $ */ #include #include #include #include #include #include #include #include "wam_parser.h" #include "wam_protos.h" /*---------------------------------* * Constants * *---------------------------------*/ #define MAX_FCT_ARITY 10 #define MAX_LINE_LEN 32767 #define MAX_STR_LEN 4096 #define MAX_ARGS 4096 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { char *keyword; void (*fct) (); int nb_args; ArgTyp arg_type[MAX_FCT_ARITY]; } InstInf; /*---------------------------------* * Global Variables * *---------------------------------*/ InstInf inst[] = { {"get_variable", F_get_variable, 2, {X_Y, INTEGER}}, {"get_value", F_get_value, 2, {X_Y, INTEGER}}, {"get_atom", F_get_atom, 2, {ATOM, INTEGER}}, {"get_integer", F_get_integer, 2, {INTEGER, INTEGER}}, {"get_float", F_get_float, 2, {FLOAT, INTEGER}}, {"get_nil", F_get_nil, 1, {INTEGER}}, {"get_list", F_get_list, 1, {INTEGER}}, {"get_structure", F_get_structure, 2, {F_N, INTEGER,}}, {"put_variable", F_put_variable, 2, {X_Y, INTEGER}}, {"put_void", F_put_void, 1, {INTEGER}}, {"put_value", F_put_value, 2, {X_Y, INTEGER}}, {"put_unsafe_value", F_put_unsafe_value, 2, {X_Y, INTEGER}}, {"put_atom", F_put_atom, 2, {ATOM, INTEGER}}, {"put_integer", F_put_integer, 2, {INTEGER, INTEGER}}, {"put_float", F_put_float, 2, {FLOAT, INTEGER}}, {"put_nil", F_put_nil, 1, {INTEGER}}, {"put_list", F_put_list, 1, {INTEGER}}, {"put_structure", F_put_structure, 2, {F_N, INTEGER,}}, {"math_load_value", F_math_load_value, 2, {X_Y, INTEGER}}, {"math_fast_load_value", F_math_fast_load_value, 2, {X_Y, INTEGER}}, {"unify_variable", F_unify_variable, 1, {X_Y}}, {"unify_void", F_unify_void, 1, {INTEGER}}, {"unify_value", F_unify_value, 1, {X_Y}}, {"unify_local_value", F_unify_local_value, 1, {X_Y}}, {"unify_atom", F_unify_atom, 1, {ATOM}}, {"unify_integer", F_unify_integer, 1, {INTEGER}}, {"unify_nil", F_unify_nil, 0, {0}}, {"unify_list", F_unify_list, 0, {0}}, {"unify_structure", F_unify_structure, 1, {F_N}}, {"allocate", F_allocate, 1, {INTEGER}}, {"deallocate", F_deallocate, 0, {0}}, {"call", F_call, 1, {F_N,}}, {"execute", F_execute, 1, {F_N,}}, {"proceed", F_proceed, 0, {0}}, {"fail", F_fail, 0, {0}}, {"label", F_label, 1, {INTEGER}}, {"switch_on_term", F_switch_on_term, 5, {LABEL, LABEL, LABEL, LABEL, LABEL}}, {"switch_on_atom", F_switch_on_atom, 1, {L2(ATOM, INTEGER)}}, {"switch_on_integer", F_switch_on_integer, 1, {L2(INTEGER, INTEGER)}}, {"switch_on_structure", F_switch_on_structure, 1, {L2(F_N, INTEGER)}}, {"try_me_else", F_try_me_else, 1, {INTEGER}}, {"retry_me_else", F_retry_me_else, 1, {INTEGER}}, {"trust_me_else_fail", F_trust_me_else_fail, 0, {0}}, {"try", F_try, 1, {INTEGER}}, {"retry", F_retry, 1, {INTEGER}}, {"trust", F_trust, 1, {INTEGER}}, {"load_cut_level", F_load_cut_level, 1, {INTEGER}}, {"cut", F_cut, 1, {X_Y}}, {"call_c", F_call_c, 3, {ATOM, L1(ANY), L1(ANY)}}, {"foreign_call_c", F_foreign_call_c, 5, {ATOM, ATOM, F_N, INTEGER, L2(ATOM, ATOM)}}, {NULL, NULL, 0, {0}} }; ArgVal arg[MAX_ARGS]; jmp_buf jumper; /* scanner variables */ int keep_source_lines; FILE *file_in; int cur_line_no; char cur_line_str[MAX_LINE_LEN]; char *cur_line_p; char *beg_last_token; char str_val[MAX_STR_LEN]; long int_val; double dbl_val; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Parser(void); static void Read_Instruction(void); static void Read_Argument(ArgTyp arg_type, ArgVal **top); static void Read_Token(int what); static int Scanner(int complex_atom); static char Peek_Char(int skip_spaces); /*-------------------------------------------------------------------------* * PARSE_MAM_FILE * * * *-------------------------------------------------------------------------*/ int Parse_Wam_File(char *file_name_in, int comment) { int ret_val; keep_source_lines = comment; if (file_name_in == NULL) file_in = stdin; else if ((file_in = fopen(file_name_in, "rt")) == NULL) { fprintf(stderr, "cannot open input file %s\n", file_name_in); return 0; } cur_line_p = cur_line_str; cur_line_str[0] = '\0'; cur_line_no = 0; if ((ret_val = setjmp(jumper)) == 0) Parser(); if (file_in != stdin) fclose(file_in); return ret_val == 0; } /*-------------------------------------------------------------------------* * PARSER * * * *-------------------------------------------------------------------------*/ static void Parser(void) { int k; char *name; int arity; int inside_directive; int dynamic, public, built_in, built_in_fd; int system; ArgVal *top; while ((k = Scanner(0)) != 0) /* end of file */ { if (k != ATOM) { top_error: Syntax_Error("file_name, predicate, directive " "or ensure_linked expected"); } if (strcmp(str_val, "file_name") == 0) { Read_Token('('); Read_Token(ATOM); Read_Token(')'); Read_Token('.'); Prolog_File_Name(strdup(str_val)); continue; } if (strcmp(str_val, "ensure_linked") == 0) { top = arg; Read_Token('('); Read_Argument(L1(F_N), &top); Read_Token(')'); Read_Token('.'); Ensure_Linked(arg); continue; } inside_directive = system = dynamic = public = built_in = built_in_fd = 0; if (strcmp(str_val, "directive") == 0) inside_directive = 1; else if (strcmp(str_val, "predicate") != 0) goto top_error; Read_Token('('); if (!inside_directive) { Read_Token(ATOM); Read_Token('/'), Read_Token(INTEGER); name = strdup(str_val); arity = int_val; Read_Token(','); Read_Token(INTEGER); /* pl_line */ Read_Token(','); Read_Token(ATOM); if (strcmp(str_val, "dynamic") == 0) dynamic = 1; else if (strcmp(str_val, "static") != 0) Syntax_Error("static or dynamic expected"); Read_Token(','); Read_Token(ATOM); if (strcmp(str_val, "public") == 0) public = 1; else if (strcmp(str_val, "private") != 0) Syntax_Error("public or private expected"); Read_Token(','); Read_Token(ATOM); if (strcmp(str_val, "built_in") == 0) built_in = 1; else if (strcmp(str_val, "built_in_fd") == 0) built_in_fd = 1; else if (strcmp(str_val, "user") != 0) Syntax_Error("user, built_in or built_in_fd expected"); Read_Token(','); New_Predicate(name, arity, int_val, dynamic, public, built_in, built_in_fd); } else { Read_Token(INTEGER); /* pl_line */ Read_Token(','); Read_Token(ATOM); if (strcmp(str_val, "system") == 0) system = 1; else if (strcmp(str_val, "user") != 0) Syntax_Error("user or system expected"); Read_Token(','); New_Directive(int_val, system); } Read_Token('['); for (;;) { Read_Instruction(); k = Scanner(0); if (k == ']') break; if (k != ',') Syntax_Error("] or , expected"); } Read_Token(')'); Read_Token('.'); } } /*-------------------------------------------------------------------------* * READ_INSTRUCTION * * * *-------------------------------------------------------------------------*/ static void Read_Instruction(void) { InstInf *in; ArgVal *top = arg; int i; if (Scanner(0) != ATOM) Syntax_Error("wam instruction expected"); for (in = inst; in->keyword; in++) if (strcmp(str_val, in->keyword) == 0) break; if (in->keyword == NULL) Syntax_Error("unknown wam instruction"); if (in->nb_args) { Read_Token('('); for (i = 0; i < in->nb_args; i++) { if (i > 0) Read_Token(','); Read_Argument(in->arg_type[i], &top); } Read_Token(')'); } (*in->fct) (arg); } /*-------------------------------------------------------------------------* * READ_ARGUMENT * * * * arguments are loaded in the array 'arg' as follows: * * * * ATOM : the (char *) pointing to a copy of the associated string * * INTEGER : the associated (int) * * FLOAT : the associated (double) * * X_Y : the (int) associated to the var no (Y vars from 5000) * * F_N : the loading of ATOM (F) and the loading of INTEGER (N) * * LABEL : the associated (int) or -1 for 'fail' * * ANY : the type of the arg (an INTEGER) and the loading of arg * * L1(T) : an (int) n associated to the number of elements and * * n * the loading of T * * L2(T1, T2): an (int) n associated to the number of elements and * * n * (the loading of T1 followed by the loading of T2) * *-------------------------------------------------------------------------*/ static void Read_Argument(ArgTyp arg_type, ArgVal **top) { int k, n; ArgVal *top1; ArgTyp t1, t2; switch (arg_type) { case ATOM: Read_Token(ATOM); Add_Arg(*top, char *, strdup(str_val)); return; case INTEGER: Read_Token(INTEGER); load_integer: Add_Arg(*top, long, int_val); return; case FLOAT: Read_Token(FLOAT); load_float: Add_Arg(*top, double, dbl_val); return; case X_Y: if (Scanner(0) != ATOM || (*str_val != 'x' && *str_val != 'y') || str_val[1] != '\0') Syntax_Error("x(...) or y(...) expected"); load_x_y: Read_Token('('); Read_Token(INTEGER); Read_Token(')'); if (*str_val == 'x') Add_Arg(*top, long, int_val); else Add_Arg(*top, long, 5000 + int_val); return; case F_N: Read_Argument(ATOM, top); Read_Token('/'); Read_Argument(INTEGER, top); return; case LABEL: k = Scanner(0); if (k != INTEGER) { if (k != ATOM || strcmp(str_val, "fail") != 0) Syntax_Error("label or fail expected"); else int_val = -1; } Add_Arg(*top, long, int_val); return; case ANY: t1 = Scanner(1); top1 = *top; /* to update type if needed */ Add_Arg(*top, long, t1); if (t1 == INTEGER) goto load_integer; if (t1 == FLOAT) goto load_float; if (t1 != ATOM) Syntax_Error("x(...), y(...), atom, integer or float expected"); /* t1 is an ATOM */ if ((*str_val == 'x' || *str_val == 'y') && str_val[1] == '\0' && Peek_Char(0) == '(') { Add_Arg(top1, long, X_Y); goto load_x_y; } Add_Arg(*top, char *, strdup(str_val)); /* load the atom */ if (Peek_Char(1) == '/') { Read_Token('/'); Read_Argument(INTEGER, top); Add_Arg(top1, long, F_N); } return; } /* arg_type is a list L1(t) or L2(t1, t2) */ DECODE_L2(arg_type, t1, t2); top1 = *top; Add_Arg(*top, long, 0); /* reserve space for counter */ n = 0; k = Scanner(1); if (k == ATOM && strcmp(str_val, "[]") == 0) /* empty list */ return; if (k != '[') Syntax_Error("[] or [ expected"); for (;;) { n++; if (t2 == 0) /* case L1(t1) */ Read_Argument(t1, top); else /* case L2(t1, t2) */ { Read_Token('('); Read_Argument(t1, top); Read_Token(','); Read_Argument(t2, top); Read_Token(')'); } k = Scanner(0); if (k == ']') break; if (k != ',') Syntax_Error("] or , expected"); } Add_Arg(top1, long, n); } /*-------------------------------------------------------------------------* * READ_TOKEN * * * *-------------------------------------------------------------------------*/ static void Read_Token(int what) { char str[80]; int k; k = Scanner(what == ATOM); if (k == what) return; if (what >= 256 && k == '(') { Read_Token(what); /* maybe ( what ) (useful for operators) */ Read_Token(')'); return; } switch (what) { case ATOM: Syntax_Error("atom expected"); break; case INTEGER: Syntax_Error("integer expected"); break; case FLOAT: Syntax_Error("float expected"); break; default: sprintf(str, "%c expected", what); Syntax_Error(str); break; } } /*-------------------------------------------------------------------------* * SCANNER * * * *-------------------------------------------------------------------------*/ static int Scanner(int complex_atom) { char *p, *p1; long i; double d; double strtod(); for (;;) { while (isspace(*cur_line_p)) cur_line_p++; if (*cur_line_p != '\0' && *cur_line_p != '%') break; fgets(cur_line_str, sizeof(cur_line_str), file_in); if (feof(file_in)) return 0; cur_line_no++; cur_line_p = cur_line_str; if (keep_source_lines) { while (isspace(*cur_line_p)) cur_line_p++; if (*cur_line_p) { p = cur_line_p + strlen(cur_line_p) - 1; if (*p == '\n') *p = '\0'; Source_Line(cur_line_no, cur_line_p); } } } beg_last_token = cur_line_p; if (*cur_line_p == '\'') /* quoted atom */ { p = str_val; cur_line_p++; while (*cur_line_p != '\'' || cur_line_p[1] == '\'') { if (*cur_line_p == '\'') { *p++ = '\''; cur_line_p += 2; continue; } if (*cur_line_p == '\"') { *p++ = '\\'; *p++ = '"'; cur_line_p++; continue; } if ((*p++ = *cur_line_p++) == '\\') { if (*cur_line_p == '\\' || /* \\ */ strchr("abfnrtv", *cur_line_p)) /* \a \b \f \n \r \t \v */ *p++ = *cur_line_p++; else { if (*cur_line_p == 'x') { cur_line_p++; i = 16; } else i = 8; i = strtol(cur_line_p, &p1, i); /* stop on the closing \ */ cur_line_p = p1 + 1; sprintf(p, "%03lo", i); p += 3; } } } cur_line_p++; *p = '\0'; return ATOM; } if (isalpha(*cur_line_p) || *cur_line_p == '_') /* atom */ { p = str_val; while (isalnum(*cur_line_p) || *cur_line_p == '_') *p++ = *cur_line_p++; *p = '\0'; return ATOM; } if (complex_atom) { if ((cur_line_p[0] == '[' && cur_line_p[1] == ']') || /* [] and {} */ (cur_line_p[0] == '{' && cur_line_p[1] == '}')) { str_val[0] = *cur_line_p++; str_val[1] = *cur_line_p++; str_val[2] = '\0'; return ATOM; } if (strchr("#$&*+-./:<=>?@\\^~", *cur_line_p)) /* symbol char */ { p = str_val; do { if (*cur_line_p == '"' || *cur_line_p == '\\') *p++ = '\\'; *p++ = *cur_line_p++; } while (strchr("#$&*+-./:<=>?@\\^~", *cur_line_p)); *p = '\0'; return ATOM; } if (strchr("!;,", *cur_line_p)) /* solo char */ { str_val[0] = *cur_line_p++; str_val[1] = '\0'; return ATOM; } } i = strtol(cur_line_p, &p, 0); if (p == cur_line_p) /* not an integer return that character */ return *cur_line_p++; d = strtod(cur_line_p, &p1); if (p1 == p) /* integer */ { int_val = i; cur_line_p = p; return INTEGER; } /* float */ dbl_val = d; cur_line_p = p1; return FLOAT; } /*-------------------------------------------------------------------------* * PEEK_CHAR * * * *-------------------------------------------------------------------------*/ static char Peek_Char(int skip_spaces) { char *p = cur_line_p; if (skip_spaces) while(isspace(*p)) p++; return *p; } /*-------------------------------------------------------------------------* * SYNTAX_ERROR * * * *-------------------------------------------------------------------------*/ void Syntax_Error(char *s) { char *p = cur_line_str + strlen(cur_line_str) - 1; if (*p == '\n') *p = '\0'; fprintf(stderr, "line %d: %s\n", cur_line_no, s); fprintf(stderr, "%s\n", cur_line_str); for (p = cur_line_str; p < beg_last_token; p++) if (!isspace(*p)) *p = ' '; *p = '\0'; fprintf(stderr, "%s^ here\n", cur_line_str); longjmp(jumper, 1); } ./gprolog-1.3.0/src/Wam2Ma/wam_protos.h0000644004425400513100000001035110547154143016213 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : WAM to mini-assembler translator * * File : wam_protos.h * * Descr.: code generation - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: wam_protos.h,v 1.10 2007/01/04 10:35:15 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Source_Line(int line_no, char *cmt); void Prolog_File_Name(char *pl_file); void New_Predicate(char *functor, int arity, int pl_line, int dynamic, int public, int built_in, int built_in_fd); void New_Directive(int pl_line, int system); void Ensure_Linked(ArgVal arg[]); void F_get_variable(ArgVal arg[]); void F_get_value(ArgVal arg[]); void F_get_atom(ArgVal arg[]); void F_get_integer(ArgVal arg[]); void F_get_float(ArgVal arg[]); void F_get_nil(ArgVal arg[]); void F_get_list(ArgVal arg[]); void F_get_structure(ArgVal arg[]); void F_put_variable(ArgVal arg[]); void F_put_void(ArgVal arg[]); void F_put_value(ArgVal arg[]); void F_put_unsafe_value(ArgVal arg[]); void F_put_atom(ArgVal arg[]); void F_put_integer(ArgVal arg[]); void F_put_float(ArgVal arg[]); void F_put_nil(ArgVal arg[]); void F_put_list(ArgVal arg[]); void F_put_structure(ArgVal arg[]); void F_math_load_value(ArgVal arg[]); void F_math_fast_load_value(ArgVal arg[]); void F_unify_variable(ArgVal arg[]); void F_unify_void(ArgVal arg[]); void F_unify_value(ArgVal arg[]); void F_unify_local_value(ArgVal arg[]); void F_unify_atom(ArgVal arg[]); void F_unify_integer(ArgVal arg[]); void F_unify_nil(ArgVal arg[]); void F_unify_list(ArgVal arg[]); void F_unify_structure(ArgVal arg[]); void F_allocate(ArgVal arg[]); void F_deallocate(ArgVal arg[]); void F_call(ArgVal arg[]); void F_execute(ArgVal arg[]); void F_proceed(ArgVal arg[]); void F_fail(ArgVal arg[]); void F_label(ArgVal arg[]); void F_switch_on_term(ArgVal arg[]); void F_switch_on_atom(ArgVal arg[]); void F_switch_on_integer(ArgVal arg[]); void F_switch_on_structure(ArgVal arg[]); void F_try_me_else(ArgVal arg[]); void F_retry_me_else(ArgVal arg[]); void F_trust_me_else_fail(ArgVal arg[]); void F_try(ArgVal arg[]); void F_retry(ArgVal arg[]); void F_trust(ArgVal arg[]); void F_load_cut_level(ArgVal arg[]); void F_cut(ArgVal arg[]); void F_function(ArgVal arg[]); void F_call_c(ArgVal arg[]); void F_foreign_call_c(ArgVal arg[]); ./gprolog-1.3.0/src/Wam2Ma/Makefile.in0000644004425400513100000000076710547152474015734 0ustar diazlocoCC = @CC@ @CFLAGS_MACHINE@ CFLAGS = @CFLAGS@ all: wam2ma@EXE_SUFFIX@ wam_parser@OBJ_SUFFIX@: wam_parser.c wam_parser.h wam_protos.h $(CC) $(CFLAGS) -c wam_parser.c wam2ma@OBJ_SUFFIX@: wam2ma.c wam_parser.h bt_string.c ../TopComp/copying.c $(CC) $(CFLAGS) -c wam2ma.c wam2ma@EXE_SUFFIX@: wam2ma@OBJ_SUFFIX@ wam_parser@OBJ_SUFFIX@ $(CC) $(CFLAGS) @CC_EXE_NAME_OPT@wam2ma@EXE_SUFFIX@ wam2ma@OBJ_SUFFIX@ wam_parser@OBJ_SUFFIX@ clean: rm -f *@OBJ_SUFFIX@ wam2ma@EXE_SUFFIX@ distclean: clean ./gprolog-1.3.0/src/Wam2Ma/wam2ma.c0000644004425400513100000017143510547154143015213 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : WAM to mini-assembler translator * * File : wam2ma.c * * Descr.: code generation * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: wam2ma.c,v 1.18 2007/01/04 10:35:15 diaz Exp $ */ #include #include #include #include #include #include "../EnginePl/gp_config.h" #include "../EnginePl/arch_dep.h" #define ONLY_TAG_PART #include "../EnginePl/wam_archi.h" #include "../EnginePl/pl_params.h" #include "../BipsPl/pred_supp.h" #include "wam_parser.h" #include "wam_protos.h" #include "bt_string.c" #include "../TopComp/copying.c" #ifdef FC_USED_TO_COMPILE_CORE #define FAST "fast " #else #define FAST #endif #if 1 #define USE_TAGGED_CALLS_FOR_WAM_FCTS #endif #if 0 #define CHECK_PRINTF_ARGS #endif #ifdef CHECK_PRINTF_ARGS #define GCCPRINTF(x) __attribute__((format(printf, x, x + 1))) #else #define GCCPRINTF(x) #endif /*---------------------------------* * Constants * *---------------------------------*/ #define DEFAULT_OUTPUT_SUFFIX ".ma" #define MAX_PRED_NAME_LENGTH 2048 #define MAX_HEXA_LENGTH MAX_PRED_NAME_LENGTH * 2 + 2 + 16 #define MAX_LABEL_LENGTH 32 #define ANY_SIZE 1 #define FOREIGN_TYPE_INTEGER 0 #define FOREIGN_TYPE_POSITIVE 1 #define FOREIGN_TYPE_FLOAT 2 #define FOREIGN_TYPE_NUMBER 3 #define FOREIGN_TYPE_ATOM 4 #define FOREIGN_TYPE_BOOLEAN 5 #define FOREIGN_TYPE_CHAR 6 #define FOREIGN_TYPE_IN_CHAR 7 #define FOREIGN_TYPE_CODE 8 #define FOREIGN_TYPE_IN_CODE 9 #define FOREIGN_TYPE_BYTE 10 #define FOREIGN_TYPE_IN_BYTE 11 #define FOREIGN_TYPE_STRING 12 #define FOREIGN_TYPE_CHARS 13 #define FOREIGN_TYPE_CODES 14 #define FOREIGN_TYPE_TERM 15 #define FOREIGN_TBL_SIZE 16 #define FOREIGN_MODE_IN 0 #define FOREIGN_MODE_OUT 1 #define FOREIGN_MODE_IN_OUT 2 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct swt_elt { BTNode *atom; long n; long label; } SwtElt; typedef struct swt_tbl *PSwtTbl; typedef struct swt_tbl { enum { TBL_ATM, /* key: atom */ TBL_INT, /* key: n (used if SWT_INT_NO_OPT) */ TBL_STC /* key: atom/n */ } type; int tbl_no; /* sequential no of the table */ PSwtTbl next; /* next table */ int nb_elem; /* number of elements */ SwtElt elem[ANY_SIZE]; /* table of switch elements */ } SwtTbl; typedef struct predinf *PredP; typedef struct predinf { BTNode *functor; int arity; int line_no; int prop; BTNode *pl_file; int pl_line; SwtTbl *swt_tbl[3]; PredP next; } Pred; typedef struct directinf *DirectP; typedef struct directinf { BTNode *pl_file; int pl_line; int system; DirectP next; } Direct; /*---------------------------------* * Global Variables * *---------------------------------*/ char *file_name_in; char *file_name_out; int comment; FILE *file_out; BTString bt_atom; BTString bt_tagged_atom; BTString bt_tagged_f_n; BTNode *cur_pl_file; char buff_hexa[MAX_HEXA_LENGTH]; Pred dummy_pred_start; Pred *pred_end = &dummy_pred_start; Direct dummy_direct_start; Direct *direct_end = &dummy_direct_start; int nb_swt_tbl = 0; Pred *cur_pred; int cur_pred_no = 0; int cur_arity; long cur_sub_label; int cur_direct_no = 0; char *foreign_tbl[FOREIGN_TBL_SIZE]; /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Init_Foreign_Table(void); void Parse_Arguments(int argc, char *argv[]); void Display_Help(void); char *Compute_Hexa(char *str, char *hexa); void Make_Native_Hexa_Symbol(Pred *p, char *buff); void Emit_Obj_Initializer(void); void Emit_Exec_Directives(void); void Emit_One_Atom(int no, char *str); void Emit_One_Atom_Tagged(int no, char *str); int Add_F_N_Tagged(char *atom, int n); void Emit_One_F_N_Tagged(int no, char *str); void Label_Printf(char *label, ...) GCCPRINTF(1); void Inst_Printf(char *op, char *operands, ...) GCCPRINTF(2); SwtTbl *Create_Switch_Table(int type, int nb_elem); #define Check_Arg(i, str) (strncmp(argv[i], str, strlen(argv[i]))==0) #define DEF_STR(str) char *str #define DEF_ATOM(atom) BTNode *atom; char *str_##atom #define DEF_PRED(hexa) char *hexa = buff_hexa; char *str_##hexa #define DEF_INTEGER(n) long n #define DEF_FLOAT(n) double n #define DEF_X_Y(xy) long xy; char c #define DEF_F_N_0(atom, n) DEF_ATOM(atom); DEF_INTEGER(n) #define DEF_F_N_1(atom, n) DEF_STR(str_##atom); DEF_INTEGER(n); int f_n_no #ifdef USE_TAGGED_CALLS_FOR_WAM_FCTS #define DEF_F_N(atom, n) DEF_F_N_1(atom, n) #else #define DEF_F_N(atom, n) DEF_F_N_0(atom, n) #endif #define DEF_P_N(hexa, n) DEF_PRED(hexa); DEF_INTEGER(n) #define DEF_LABEL(l) char l[MAX_LABEL_LENGTH]; long val_##l #define LOAD_STR(str) Get_Arg(top, char *, str) #define LOAD_ATOM_T(atom, t) Get_Arg(top, char *, str_##atom); \ atom = BT_String_Add(&t, str_##atom) #define LOAD_ATOM_0(atom) LOAD_ATOM_T(atom, bt_atom) #define LOAD_ATOM_1(atom) LOAD_ATOM_T(atom, bt_tagged_atom) #ifdef USE_TAGGED_CALLS_FOR_WAM_FCTS #define LOAD_ATOM(atom) LOAD_ATOM_1(atom) #else #define LOAD_ATOM(atom) LOAD_ATOM_0(atom) #endif #define LOAD_PRED(hexa) Get_Arg(top, char *, str_##hexa); \ Compute_Hexa(str_##hexa, buff_hexa) #define LOAD_INTEGER(n) Get_Arg(top, long, n) #define LOAD_FLOAT(n) Get_Arg(top, double, n) #define LOAD_X_Y(xy) Get_Arg(top, long, xy); \ if (xy < 5000) c = 'X'; else xy -= 5000, c='Y' #define LOAD_F_N_0(atom, n) LOAD_ATOM_0(atom); LOAD_INTEGER(n) #define LOAD_F_N_1(atom, n) LOAD_STR(str_##atom); LOAD_INTEGER(n);\ f_n_no = Add_F_N_Tagged(str_##atom, n) #ifdef USE_TAGGED_CALLS_FOR_WAM_FCTS #define LOAD_F_N(atom, n) LOAD_F_N_1(atom, n) #else #define LOAD_F_N(atom, n) LOAD_F_N_0(atom, n) #endif #define LOAD_P_N(hexa, n) LOAD_PRED(hexa); LOAD_INTEGER(n) #define LOAD_LABEL(l) Get_Arg(top, long, val_##l); \ if (val_##l==-1) strcpy(l, "0"); \ else sprintf(l, FORMAT_LABEL(val_##l)) #define Args0 ArgVal *top=arg #define Args1(a1) ArgVal *top=arg; DEF_##a1; \ LOAD_##a1 #define Args2(a1, a2) ArgVal *top=arg; DEF_##a1; DEF_##a2; \ LOAD_##a1; LOAD_##a2 #define Args3(a1, a2, a3) ArgVal *top=arg; DEF_##a1; DEF_##a2; DEF_##a3;\ LOAD_##a1; LOAD_##a2; LOAD_##a3 #define Args4(a1, a2, a3, a4) ArgVal *top=arg; \ DEF_##a1; DEF_##a2; DEF_##a3; DEF_##a4; \ LOAD_##a1; LOAD_##a2; LOAD_##a3; LOAD_##a4 #define Args5(a1, a2, a3, a4, a5) \ ArgVal *top=arg; \ DEF_##a1; DEF_##a2; DEF_##a3; DEF_##a4; DEF_##a5; \ LOAD_##a1; LOAD_##a2; LOAD_##a3; LOAD_##a4; LOAD_##a5 #define Args6(a1, a2, a3, a4, a5, a6) \ ArgVal *top=arg; \ DEF_##a1; DEF_##a2; DEF_##a3; DEF_##a4; DEF_##a5; DEF_##a6; \ LOAD_##a1; LOAD_##a2; LOAD_##a3; LOAD_##a4; LOAD_##a5; LOAD_##a6 #define FORMAT_LABEL(l) "Lpred%d_%ld", cur_pred_no, (l) #define FORMAT_SUB_LABEL(sl) "Lpred%d_sub_%ld", cur_pred_no, (sl) #define CREATE_CHOICE_INST(l) \ if (cur_arity >= 1 && cur_arity <= 4) \ Inst_Printf("call_c", FAST "Create_Choice_Point%d(&%s)", cur_arity, l); \ else \ Inst_Printf("call_c", FAST "Create_Choice_Point(&%s,%d)", l, cur_arity) #define UPDATE_CHOICE_INST(l) \ if (cur_arity >= 1 && cur_arity <= 4) \ Inst_Printf("call_c", FAST "Update_Choice_Point%d(&%s)", cur_arity, l); \ else \ Inst_Printf("call_c", FAST "Update_Choice_Point(&%s,%d)", l, cur_arity) #define DELETE_CHOICE_INST \ if (cur_arity >= 1 && cur_arity <= 4) \ Inst_Printf("call_c", FAST "Delete_Choice_Point%d()", cur_arity); \ else \ Inst_Printf("call_c", FAST "Delete_Choice_Point(%d)", cur_arity) /*-------------------------------------------------------------------------* * MAIN * * * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { Parse_Arguments(argc, argv); setlocale (LC_ALL, ""); setlocale (LC_NUMERIC, "C"); /* make sure floats come out right... */ if (file_name_out == NULL) file_out = stdout; else if ((file_out = fopen(file_name_out, "wt")) == NULL) { fprintf(stderr, "cannot open output file %s\n", file_name_out); exit(1); } BT_String_Init(&bt_atom); BT_String_Init(&bt_tagged_atom); BT_String_Init(&bt_tagged_f_n); Init_Foreign_Table(); dummy_pred_start.next = NULL; dummy_direct_start.next = NULL; if (!Parse_Wam_File(file_name_in, comment)) { fprintf(stderr, "Translation aborted\n"); exit(1); } Emit_Obj_Initializer(); Emit_Exec_Directives(); if (file_out != stdout) fclose(file_out); exit(0); } /*-------------------------------------------------------------------------* * COMPUTE_HEXA * * * *-------------------------------------------------------------------------*/ char * Compute_Hexa(char *str, char *hexa) { *hexa++ = 'X'; while (*str) { sprintf(hexa, "%02X", (unsigned) (unsigned char) *str); str++; hexa += 2; } *hexa = '\0'; return hexa; } /*-------------------------------------------------------------------------* * MAKE_NATIVE_HEXA_SYMBOL * * * *-------------------------------------------------------------------------*/ void Make_Native_Hexa_Symbol(Pred *p, char *buff) { buff = Compute_Hexa(p->functor->str, buff); sprintf(buff, "_%d", p->arity); } /*-------------------------------------------------------------------------* * EMIT_OBJ_INITIALIZER * * * *-------------------------------------------------------------------------*/ void Emit_Obj_Initializer(void) { SwtTbl *t; Pred *p; int i, j; char l[MAX_LABEL_LENGTH]; char *q; Label_Printf("\n"); if (bt_atom.nb_elem) Label_Printf("long local at(%d)", bt_atom.nb_elem); if (bt_tagged_atom.nb_elem) Label_Printf("long local ta(%d)", bt_tagged_atom.nb_elem); if (bt_tagged_f_n.nb_elem) Label_Printf("long local fn(%d)", bt_tagged_f_n.nb_elem); if (nb_swt_tbl) Label_Printf("long local st(%d)", nb_swt_tbl); Label_Printf("\n"); Label_Printf("c_code initializer Object_Initializer\n"); Inst_Printf("call_c", "New_Object(&Prolog_Object_Initializer,&System_Directives,&User_Directives)"); Inst_Printf("c_ret", ""); Label_Printf("\n"); Label_Printf("c_code local Prolog_Object_Initializer\n"); #ifdef DEBUG Inst_Printf("call_c", "printf(\"executing init obj of %s\\n\")", file_name_in); #endif BT_String_List(&bt_atom, Emit_One_Atom); BT_String_List(&bt_tagged_atom, Emit_One_Atom_Tagged); BT_String_List(&bt_tagged_f_n, Emit_One_F_N_Tagged); cur_pred_no = 0; for (p = dummy_pred_start.next; p; p = p->next) { fputc('\n', file_out); if (!(p->prop & MASK_PRED_DYNAMIC)) { q = buff_hexa; *q++ = '&'; Make_Native_Hexa_Symbol(p, q); } else strcpy(buff_hexa, "0"); Inst_Printf("call_c", FAST "Create_Pred(at(%d),%d,at(%d),%d,%d,%s)", p->functor->no, p->arity, p->pl_file->no, p->pl_line, p->prop, buff_hexa); cur_pred_no++; /* for FORMAT_LABEL */ for (i = 0; i < 3; i++) for (t = p->swt_tbl[i]; t != NULL; t = t->next) { Inst_Printf("call_c", FAST "Create_Swt_Table(%d)", t->nb_elem); Inst_Printf("move_ret", "st(%d)", t->tbl_no); switch (i) { case TBL_ATM: for (j = 0; j < t->nb_elem; j++) { sprintf(l, FORMAT_LABEL(t->elem[j].label)); Inst_Printf("call_c", FAST "Create_Swt_Atm_Element(st(%d),%d,at(%d),&%s)", t->tbl_no, t->nb_elem, (t->elem[j].atom)->no, l); } break; #ifdef SWT_INT_NO_OPT case TBL_INT: for (j = 0; j < t->nb_elem; j++) { sprintf(l, FORMAT_LABEL(t->elem[j].label)); Inst_Printf("call_c", FAST "Create_Swt_Int_Element(st(%d),%d,%ld,&%s)", t->tbl_no, t->nb_elem, t->elem[j].n, l); } break; #endif default: for (j = 0; j < t->nb_elem; j++) { sprintf(l, FORMAT_LABEL(t->elem[j].label)); Inst_Printf("call_c", FAST "Create_Swt_Stc_Element(st(%d),%d,at(%d),%ld,&%s)", t->tbl_no, t->nb_elem, (t->elem[j].atom)->no, t->elem[j].n, l); } } } } Inst_Printf("c_ret", ""); } /*-------------------------------------------------------------------------* * EMIT_EXEC_DIRECTIVES * * * *-------------------------------------------------------------------------*/ void Emit_Exec_Directives(void) { int i; Direct *p; fputc('\n', file_out); Label_Printf("c_code local System_Directives\n"); i = 0; for (p = dummy_direct_start.next; p; p = p->next) { i++; if (!p->system) continue; #ifdef DEBUG { static int flag = 0; if (!flag) Inst_Printf("call_c", "printf(\"executing syst directives of %s\\n\")", file_name_in); flag = 1; } #endif Inst_Printf("call_c", "Execute_Directive(at(%d),%d,%d,&directive_%d)", p->pl_file->no, p->pl_line, 1, i); } Inst_Printf("c_ret", ""); fputc('\n', file_out); Label_Printf("c_code local User_Directives\n"); i = 0; for (p = dummy_direct_start.next; p; p = p->next) { i++; if (p->system) continue; #ifdef DEBUG { static int flag = 0; if (!flag) Inst_Printf("call_c", "printf(\"executing user directives of %s\\n\")", file_name_in); flag = 1; } #endif Inst_Printf("call_c", "Execute_Directive(at(%d),%d,%d,&directive_%d)", p->pl_file->no, p->pl_line, 0, i); } Inst_Printf("c_ret", ""); } /*-------------------------------------------------------------------------* * EMIT_ONE_ATOM * * * *-------------------------------------------------------------------------*/ void Emit_One_Atom(int no, char *str) { Inst_Printf("call_c", FAST "Create_Atom(\"%s\")", str); Inst_Printf("move_ret", "at(%d)", no); } /*-------------------------------------------------------------------------* * EMIT_ONE_ATOM_TAGGED * * * *-------------------------------------------------------------------------*/ void Emit_One_Atom_Tagged(int no, char *str) { Inst_Printf("call_c", FAST "Create_Atom_Tagged(\"%s\")", str); Inst_Printf("move_ret", "ta(%d)", no); } /*-------------------------------------------------------------------------* * ADD_F_N_TAGGED * * * *-------------------------------------------------------------------------*/ int Add_F_N_Tagged(char *atom, int n) { int l = strlen(atom); atom = (char *) realloc(atom, l + 5 + 1); sprintf(atom + l, "/%d", n); return BT_String_Add(&bt_tagged_f_n, atom)->no; } /*-------------------------------------------------------------------------* * EMIT_ONE_F_N_TAGGED * * * *-------------------------------------------------------------------------*/ void Emit_One_F_N_Tagged(int no, char *str) { int n; char *p = str + strlen(str) - 1; for(p = str + strlen(str) - 1; *p != '/'; p--) ; n = atoi(p+1); *p = '\0'; Inst_Printf("call_c", FAST "Create_Functor_Arity_Tagged(\"%s\",%d)", str, n); Inst_Printf("move_ret", "fn(%d)", no); } /*-------------------------------------------------------------------------* * SOURCE_LINE * * * *-------------------------------------------------------------------------*/ void Source_Line(int line_no, char *cmt) { Label_Printf("\t; %6d: %s", line_no, cmt); } /*-------------------------------------------------------------------------* * PROLOG_FILE_NAME * * * *-------------------------------------------------------------------------*/ void Prolog_File_Name(char *pl_file) { cur_pl_file = BT_String_Add(&bt_atom, pl_file); } /*-------------------------------------------------------------------------* * NEW_PREDICATE * * * *-------------------------------------------------------------------------*/ void New_Predicate(char *functor, int arity, int pl_line, int dynamic, int public, int built_in, int built_in_fd) { BTNode *atom; int prop; atom = BT_String_Add(&bt_atom, functor); cur_arity = arity; cur_sub_label = 0; if (dynamic) prop = MASK_PRED_DYNAMIC; else prop = MASK_PRED_NATIVE_CODE; if (public) prop |= MASK_PRED_PUBLIC; if (built_in) prop |= MASK_PRED_BUILTIN; if (built_in_fd) prop |= MASK_PRED_BUILTIN_FD; cur_pred_no++; cur_pred = (Pred *) malloc(sizeof(Pred)); if (cur_pred == NULL) { fprintf(stderr, "Cannot allocate memory for predicate #%d\n", cur_pred_no); exit(1); } cur_pred->functor = atom; cur_pred->arity = arity; cur_pred->pl_file = cur_pl_file; cur_pred->pl_line = pl_line; cur_pred->prop = prop; cur_pred->swt_tbl[0] = NULL; cur_pred->swt_tbl[1] = NULL; cur_pred->swt_tbl[2] = NULL; cur_pred->next = NULL; pred_end->next = cur_pred; pred_end = cur_pred; if (comment) Label_Printf("\n\n; *** Predicate: %s/%d (%s:%d)", functor, arity, cur_pl_file->str, pl_line); Make_Native_Hexa_Symbol(cur_pred, buff_hexa); Label_Printf("\n\npl_code global %s", buff_hexa); } /*-------------------------------------------------------------------------* * NEW_DIRECTIVE * * * *-------------------------------------------------------------------------*/ void New_Directive(int pl_line, int system) { Direct *p; cur_direct_no++; p = (Direct *) malloc(sizeof(Direct)); if (p == NULL) { fprintf(stderr, "Cannot allocate memory for directive #%d\n", cur_direct_no); exit(1); } p->pl_file = cur_pl_file; p->pl_line = pl_line; p->system = system; p->next = NULL; direct_end->next = p; direct_end = p; if (comment) Label_Printf("\n\n; *** %s Directive (%s:%d)", (system) ? "System" : "User", cur_pl_file->str, pl_line); Label_Printf("\n\npl_code local directive_%d", cur_direct_no); } /*-------------------------------------------------------------------------* * ENSURE_LINKED * * * *-------------------------------------------------------------------------*/ void Ensure_Linked(ArgVal arg[]) { DEF_PRED(hexa); DEF_INTEGER(n); Args1(INTEGER(nb_elem)); Label_Printf("\n\npl_code local ensure_linked"); while (nb_elem--) { LOAD_PRED(hexa); LOAD_INTEGER(n); Inst_Printf("pl_jump", "%s_%ld", hexa, n); } } /*-------------------------------------------------------------------------* * LABEL_PRINTF * * * *-------------------------------------------------------------------------*/ void Label_Printf(char *label, ...) { va_list arg_ptr; va_start(arg_ptr, label); vfprintf(file_out, label, arg_ptr); va_end(arg_ptr); fputc('\n', file_out); } /*-------------------------------------------------------------------------* * INST_PRINTF * * * *-------------------------------------------------------------------------*/ void Inst_Printf(char *op, char *operands, ...) { va_list arg_ptr; va_start(arg_ptr, operands); fprintf(file_out, "\t%-10s ", op); if (operands) { vfprintf(file_out, operands, arg_ptr); fputc('\n', file_out); } va_end(arg_ptr); } /*-------------------------------------------------------------------------* * F_GET_VARIABLE * * * *-------------------------------------------------------------------------*/ void F_get_variable(ArgVal arg[]) { Args2(X_Y(xy), INTEGER(a)); Inst_Printf("move", "X(%ld),%c(%ld)", a, c, xy); } /*-------------------------------------------------------------------------* * F_GET_VALUE * * * *-------------------------------------------------------------------------*/ void F_get_value(ArgVal arg[]) { Args2(X_Y(xy), INTEGER(a)); Inst_Printf("call_c", FAST "Unify(%c(%ld),X(%ld))", c, xy, a); Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_GET_ATOM * * * *-------------------------------------------------------------------------*/ void F_get_atom(ArgVal arg[]) { Args2(ATOM(atom), INTEGER(a)); #ifdef USE_TAGGED_CALLS_FOR_WAM_FCTS Inst_Printf("call_c", FAST "Get_Atom_Tagged(ta(%d),X(%ld))", atom->no, a); #else Inst_Printf("call_c", FAST "Get_Atom(at(%d),X(%ld))", atom->no, a); #endif Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_GET_INTEGER * * * *-------------------------------------------------------------------------*/ void F_get_integer(ArgVal arg[]) { Args2(INTEGER(n), INTEGER(a)); #ifdef USE_TAGGED_CALLS_FOR_WAM_FCTS Inst_Printf("call_c", FAST "Get_Integer_Tagged(%ld,X(%ld))", Tag_INT(n), a); #else Inst_Printf("call_c", FAST "Get_Integer(%ld,X(%ld))", n, a); #endif Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_GET_FLOAT * * * *-------------------------------------------------------------------------*/ void F_get_float(ArgVal arg[]) { Args2(FLOAT(n), INTEGER(a)); Inst_Printf("call_c", FAST "Get_Float(%1.20e,X(%ld))", n, a); Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_GET_NIL * * * *-------------------------------------------------------------------------*/ void F_get_nil(ArgVal arg[]) { Args1(INTEGER(a)); Inst_Printf("call_c", FAST "Get_Nil(X(%ld))", a); Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_GET_LIST * * * *-------------------------------------------------------------------------*/ void F_get_list(ArgVal arg[]) { Args1(INTEGER(a)); Inst_Printf("call_c", FAST "Get_List(X(%ld))", a); Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_GET_STRUCTURE * * * *-------------------------------------------------------------------------*/ void F_get_structure(ArgVal arg[]) { Args2(F_N(atom, n), INTEGER(a)); #ifdef USE_TAGGED_CALLS_FOR_WAM_FCTS Inst_Printf("call_c", FAST "Get_Structure_Tagged(fn(%d),X(%ld))", f_n_no, a); #else Inst_Printf("call_c", FAST "Get_Structure(at(%d),%ld,X(%ld))", atom->no, n, a); #endif Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_PUT_VARIABLE * * * *-------------------------------------------------------------------------*/ void F_put_variable(ArgVal arg[]) { Args2(X_Y(xy), INTEGER(a)); if (c == 'X') { Inst_Printf("call_c", FAST "Put_X_Variable()"); Inst_Printf("move_ret", "X(%ld)", a); Inst_Printf("move", "X(%ld),X(%ld)", a, xy); } else { Inst_Printf("call_c", FAST "Put_Y_Variable(&Y(%ld))", xy); Inst_Printf("move_ret", "X(%ld)", a); } } /*-------------------------------------------------------------------------* * F_PUT_VOID * * * *-------------------------------------------------------------------------*/ void F_put_void(ArgVal arg[]) { Args1(INTEGER(a)); Inst_Printf("call_c", FAST "Put_X_Variable()"); Inst_Printf("move_ret", "X(%ld)", a); } /*-------------------------------------------------------------------------* * F_PUT_VALUE * * * *-------------------------------------------------------------------------*/ void F_put_value(ArgVal arg[]) { Args2(X_Y(xy), INTEGER(a)); Inst_Printf("move", "%c(%ld),X(%ld)", c, xy, a); } /*-------------------------------------------------------------------------* * F_PUT_UNSAFE_VALUE * * * *-------------------------------------------------------------------------*/ void F_put_unsafe_value(ArgVal arg[]) { Args2(X_Y(xy), INTEGER(a)); Inst_Printf("call_c", FAST "Put_Unsafe_Value(%c(%ld))", c, xy); Inst_Printf("move_ret", "X(%ld)", a); } /*-------------------------------------------------------------------------* * F_PUT_ATOM * * * *-------------------------------------------------------------------------*/ void F_put_atom(ArgVal arg[]) { Args2(ATOM(atom), INTEGER(a)); #ifdef USE_TAGGED_CALLS_FOR_WAM_FCTS Inst_Printf("call_c", FAST "Put_Atom_Tagged(ta(%d))", atom->no); #else Inst_Printf("call_c", FAST "Put_Atom(at(%d))", atom->no); #endif Inst_Printf("move_ret", "X(%ld)", a); } /*-------------------------------------------------------------------------* * F_PUT_INTEGER * * * *-------------------------------------------------------------------------*/ void F_put_integer(ArgVal arg[]) { Args2(INTEGER(n), INTEGER(a)); #ifdef USE_TAGGED_CALLS_FOR_WAM_FCTS Inst_Printf("call_c", FAST "Put_Integer_Tagged(%ld)", Tag_INT(n)); #else Inst_Printf("call_c", FAST "Put_Integer(%ld)", n); #endif Inst_Printf("move_ret", "X(%ld)", a); } /*-------------------------------------------------------------------------* * F_PUT_FLOAT * * * *-------------------------------------------------------------------------*/ void F_put_float(ArgVal arg[]) { Args2(FLOAT(n), INTEGER(a)); Inst_Printf("call_c", FAST "Put_Float(%1.20e)", n); Inst_Printf("move_ret", "X(%ld)", a); } /*-------------------------------------------------------------------------* * F_PUT_NIL * * * *-------------------------------------------------------------------------*/ void F_put_nil(ArgVal arg[]) { Args1(INTEGER(a)); Inst_Printf("call_c", FAST "Put_Nil()"); Inst_Printf("move_ret", "X(%ld)", a); } /*-------------------------------------------------------------------------* * F_PUT_LIST * * * *-------------------------------------------------------------------------*/ void F_put_list(ArgVal arg[]) { Args1(INTEGER(a)); Inst_Printf("call_c", FAST "Put_List()"); Inst_Printf("move_ret", "X(%ld)", a); } /*-------------------------------------------------------------------------* * F_PUT_STRUCTURE * * * *-------------------------------------------------------------------------*/ void F_put_structure(ArgVal arg[]) { Args2(F_N(atom, n), INTEGER(a)); #ifdef USE_TAGGED_CALLS_FOR_WAM_FCTS Inst_Printf("call_c", FAST "Put_Structure_Tagged(fn(%d))", f_n_no); #else Inst_Printf("call_c", FAST "Put_Structure(at(%d),%ld)", atom->no, n); #endif Inst_Printf("move_ret", "X(%ld)", a); } /*-------------------------------------------------------------------------* * F_MATH_LOAD_VALUE * * * *-------------------------------------------------------------------------*/ void F_math_load_value(ArgVal arg[]) { Args2(X_Y(xy), INTEGER(a)); Inst_Printf("call_c", FAST "Math_Load_Value(%c(%ld),&X(%ld))", c, xy, a); } /*-------------------------------------------------------------------------* * F_MATH_FAST_LOAD_VALUE * * * *-------------------------------------------------------------------------*/ void F_math_fast_load_value(ArgVal arg[]) { Args2(X_Y(xy), INTEGER(a)); Inst_Printf("call_c", FAST "Math_Fast_Load_Value(%c(%ld),&X(%ld))", c, xy, a); } /*-------------------------------------------------------------------------* * F_UNIFY_VARIABLE * * * *-------------------------------------------------------------------------*/ void F_unify_variable(ArgVal arg[]) { Args1(X_Y(xy)); Inst_Printf("call_c", FAST "Unify_Variable()"); Inst_Printf("move_ret", "%c(%ld)", c, xy); } /*-------------------------------------------------------------------------* * F_UNIFY_VOID * * * *-------------------------------------------------------------------------*/ void F_unify_void(ArgVal arg[]) { Args1(INTEGER(n)); Inst_Printf("call_c", FAST "Unify_Void(%ld)", n); } /*-------------------------------------------------------------------------* * F_UNIFY_VALUE * * * *-------------------------------------------------------------------------*/ void F_unify_value(ArgVal arg[]) { Args1(X_Y(xy)); Inst_Printf("call_c", FAST "Unify_Value(%c(%ld))", c, xy); Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_UNIFY_LOCAL_VALUE * * * *-------------------------------------------------------------------------*/ void F_unify_local_value(ArgVal arg[]) { Args1(X_Y(xy)); Inst_Printf("call_c", FAST "Unify_Local_Value(%c(%ld))", c, xy); Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_UNIFY_ATOM * * * *-------------------------------------------------------------------------*/ void F_unify_atom(ArgVal arg[]) { Args1(ATOM(atom)); #ifdef USE_TAGGED_CALLS_FOR_WAM_FCTS Inst_Printf("call_c", FAST "Unify_Atom_Tagged(ta(%d))", atom->no); #else Inst_Printf("call_c", FAST "Unify_Atom(at(%d))", atom->no); #endif Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_UNIFY_INTEGER * * * *-------------------------------------------------------------------------*/ void F_unify_integer(ArgVal arg[]) { Args1(INTEGER(n)); #ifdef USE_TAGGED_CALLS_FOR_WAM_FCTS Inst_Printf("call_c", FAST "Unify_Integer_Tagged(%ld)", Tag_INT(n)); #else Inst_Printf("call_c", FAST "Unify_Integer(%ld)", n); #endif Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_UNIFY_NIL * * * *-------------------------------------------------------------------------*/ void F_unify_nil(ArgVal arg[]) { Inst_Printf("call_c", FAST "Unify_Nil()"); Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_UNIFY_LIST * * * *-------------------------------------------------------------------------*/ void F_unify_list(ArgVal arg[]) { Inst_Printf("call_c", FAST "Unify_List()"); Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_UNIFY_STRUCTURE * * * *-------------------------------------------------------------------------*/ void F_unify_structure(ArgVal arg[]) { Args1(F_N(atom, n)); #ifdef USE_TAGGED_CALLS_FOR_WAM_FCTS Inst_Printf("call_c", FAST "Unify_Structure_Tagged(fn(%d))", f_n_no); #else Inst_Printf("call_c", FAST "Unify_Structure(at(%d),%ld)", atom->no, n); #endif Inst_Printf("fail_ret", ""); } /*-------------------------------------------------------------------------* * F_ALLOCATE * * * *-------------------------------------------------------------------------*/ void F_allocate(ArgVal arg[]) { Args1(INTEGER(n)); Inst_Printf("call_c", FAST "Allocate(%ld)", n); } /*-------------------------------------------------------------------------* * F_DEALLOCATE * * * *-------------------------------------------------------------------------*/ void F_deallocate(ArgVal arg[]) { Inst_Printf("call_c", FAST "Deallocate()"); } /*-------------------------------------------------------------------------* * F_CALL * * * *-------------------------------------------------------------------------*/ void F_call(ArgVal arg[]) { Args1(P_N(hexa, n)); Inst_Printf("pl_call", "%s_%ld", hexa, n); } /*-------------------------------------------------------------------------* * F_EXECUTE * * * *-------------------------------------------------------------------------*/ void F_execute(ArgVal arg[]) { Args1(P_N(hexa, n)); Inst_Printf("pl_jump", "%s_%ld", hexa, n); } /*-------------------------------------------------------------------------* * F_PROCEED * * * *-------------------------------------------------------------------------*/ void F_proceed(ArgVal arg[]) { Inst_Printf("pl_ret", ""); } /*-------------------------------------------------------------------------* * F_FAIL * * * *-------------------------------------------------------------------------*/ void F_fail(ArgVal arg[]) { Inst_Printf("pl_fail", ""); } /*-------------------------------------------------------------------------* * F_LABEL * * * *-------------------------------------------------------------------------*/ void F_label(ArgVal arg[]) { Args1(LABEL(l)); Label_Printf("\n%s:", l); } /*-------------------------------------------------------------------------* * F_SWITCH_ON_TERM * * * *-------------------------------------------------------------------------*/ void F_switch_on_term(ArgVal arg[]) { #define NB_SWT_LIST 5 #define LVAR 1 #define LATM 2 #define LINT 4 #define LLST 8 #define LSTC 16 Args0; DEF_INTEGER(val_label); static char l[NB_SWT_LIST][MAX_LABEL_LENGTH]; int mask = 0, i; for (i = 0; i < NB_SWT_LIST; i++) { LOAD_INTEGER(val_label); if (val_label == -1) strcpy(l[i], "0"); else { sprintf(l[i], "&" FORMAT_LABEL(val_label)); mask |= (1 << i); } } switch(mask) /* some specialized functions */ { case LVAR | LATM: Inst_Printf("call_c", FAST "Switch_On_Term_Var_Atm(%s,%s)", l[0], l[1]); break; case LVAR | LSTC: Inst_Printf("call_c", FAST "Switch_On_Term_Var_Stc(%s,%s)", l[0], l[4]); break; case LVAR | LATM | LLST: Inst_Printf("call_c", FAST "Switch_On_Term_Var_Atm_Lst(%s,%s,%s)", l[0], l[1], l[3]); break; case LVAR | LATM | LSTC: Inst_Printf("call_c", FAST "Switch_On_Term_Var_Atm_Stc(%s,%s,%s)", l[0], l[1], l[4]); break; default: Inst_Printf("call_c", FAST "Switch_On_Term(%s,%s,%s,%s,%s)", l[0], l[1], l[2], l[3], l[4]); break; } Inst_Printf("jump_ret", ""); } /*-------------------------------------------------------------------------* * CREATE_SWITCH_TABLE * * * *-------------------------------------------------------------------------*/ SwtTbl * Create_Switch_Table(int type, int nb_elem) { SwtTbl *t; t = (SwtTbl *) malloc(sizeof(SwtTbl) + sizeof(SwtElt) * (nb_elem - 1)); if (t == NULL) { fprintf(stderr, "Cannot allocate memory for switch table\n"); exit(1); } t->type = type; t->tbl_no = nb_swt_tbl++; t->next = cur_pred->swt_tbl[type]; t->nb_elem = nb_elem; cur_pred->swt_tbl[type] = t; return t; } /*-------------------------------------------------------------------------* * F_SWITCH_ON_ATOM * * * *-------------------------------------------------------------------------*/ void F_switch_on_atom(ArgVal arg[]) { SwtTbl *t; SwtElt *elem; DEF_STR(str); DEF_INTEGER(label); Args1(INTEGER(nb_elem)); t = Create_Switch_Table(TBL_ATM, nb_elem); for (elem = t->elem; nb_elem--; elem++) { LOAD_STR(str); LOAD_INTEGER(label); elem->atom = BT_String_Add(&bt_atom, str); elem->label = label; } Inst_Printf("call_c", FAST "Switch_On_Atom(st(%d),%d)", nb_swt_tbl - 1, t->nb_elem); Inst_Printf("jump_ret", ""); } /*-------------------------------------------------------------------------* * F_SWITCH_ON_INTEGER * * * *-------------------------------------------------------------------------*/ void F_switch_on_integer(ArgVal arg[]) { #ifdef SWT_INT_NO_OPT SwtTbl *t; SwtElt *elem; DEF_INTEGER(n); DEF_INTEGER(label); Args1(INTEGER(nb_elem)); t = Create_Switch_Table(TBL_INT, nb_elem); for (elem = t->elem; nb_elem--; elem++) { LOAD_INTEGER(n); LOAD_INTEGER(label); elem->n = n; elem->label = label; } Inst_Printf("call_c", FAST "Switch_On_Integer(st(%d),%d)", nb_swt_tbl - 1, t->nb_elem); Inst_Printf("jump_ret", ""); #else char c; DEF_INTEGER(n); DEF_LABEL(l); Args1(INTEGER(nb_elem)); Inst_Printf("call_c", FAST "Switch_On_Integer()"); Inst_Printf("switch_ret", NULL); /* NULL to avoid newline */ c = '('; while (nb_elem--) { LOAD_INTEGER(n); LOAD_LABEL(l); fprintf(file_out, "%c%ld=%s", c, n, l); c = ','; } fprintf(file_out, ")\n"); #endif } /*-------------------------------------------------------------------------* * F_SWITCH_ON_STRUCTURE * * * *-------------------------------------------------------------------------*/ void F_switch_on_structure(ArgVal arg[]) { SwtTbl *t; SwtElt *elem; DEF_STR(str); DEF_INTEGER(arity); DEF_INTEGER(label); Args1(INTEGER(nb_elem)); t = Create_Switch_Table(TBL_STC, nb_elem); for (elem = t->elem; nb_elem--; elem++) { LOAD_STR(str); LOAD_INTEGER(arity); LOAD_INTEGER(label); elem->atom = BT_String_Add(&bt_atom, str); elem->n = arity; elem->label = label; } Inst_Printf("call_c", FAST "Switch_On_Structure(st(%d),%d)", nb_swt_tbl - 1, t->nb_elem); Inst_Printf("jump_ret", ""); } /*-------------------------------------------------------------------------* * F_TRY_ME_ELSE * * * *-------------------------------------------------------------------------*/ void F_try_me_else(ArgVal arg[]) { Args1(LABEL(l)); CREATE_CHOICE_INST(l); } /*-------------------------------------------------------------------------* * F_RETRY_ME_ELSE * * * *-------------------------------------------------------------------------*/ void F_retry_me_else(ArgVal arg[]) { Args1(LABEL(l)); UPDATE_CHOICE_INST(l); } /*-------------------------------------------------------------------------* * F_TRUST_ME_ELSE_FAIL * * * *-------------------------------------------------------------------------*/ void F_trust_me_else_fail(ArgVal arg[]) { DELETE_CHOICE_INST; } /*-------------------------------------------------------------------------* * F_TRY * * * *-------------------------------------------------------------------------*/ void F_try(ArgVal arg[]) { char sl[MAX_LABEL_LENGTH]; Args1(LABEL(l)); sprintf(sl, FORMAT_SUB_LABEL(cur_sub_label++)); CREATE_CHOICE_INST(sl); Inst_Printf("jump", "%s", l); Label_Printf("%s:", sl); } /*-------------------------------------------------------------------------* * F_RETRY * * * *-------------------------------------------------------------------------*/ void F_retry(ArgVal arg[]) { char sl[MAX_LABEL_LENGTH]; Args1(LABEL(l)); sprintf(sl, FORMAT_SUB_LABEL(cur_sub_label++)); UPDATE_CHOICE_INST(sl); Inst_Printf("jump", "%s", l); Label_Printf("%s:", sl); } /*-------------------------------------------------------------------------* * F_TRUST * * * *-------------------------------------------------------------------------*/ void F_trust(ArgVal arg[]) { Args1(LABEL(l)); DELETE_CHOICE_INST; Inst_Printf("jump", "%s", l); } /*-------------------------------------------------------------------------* * F_LOAD_CUT_LEVEL * * * *-------------------------------------------------------------------------*/ void F_load_cut_level(ArgVal arg[]) { Args1(INTEGER(a)); Inst_Printf("call_c", FAST "Load_Cut_Level(&X(%ld))", a); cur_arity = a + 1; /* to save X(a) in choice-points */ } /*-------------------------------------------------------------------------* * F_CUT * * * *-------------------------------------------------------------------------*/ void F_cut(ArgVal arg[]) { Args1(X_Y(xy)); Inst_Printf("call_c", FAST "Cut(%c(%ld))", c, xy); } /*-------------------------------------------------------------------------* * F_CALL_C * * * * call_c(F, [T,...], [W,...]) * * F=FctName, T=option only these options are relevant: * * - jump/boolean/x(X) (jump at / test / move returned value) * * - set_cp (set CP before the call at the next instruction) * * - fast_call (use a fact call convention) * * - tagged (use tagged calls for atoms, integers and F/N) * * W= atom or integer or double or x(X) or y(Y) or &,x(X) or &,y(Y) * *-------------------------------------------------------------------------*/ void F_call_c(ArgVal arg[]) { int ret = 0; /* 1: boolean, 2: jump, 3: move */ int fast_call = 0; int tagged = 0; int set_cp = 0; char *str; int adr_of_xy; long ret_xy; char ret_c; int i; DEF_STR(c_option); DEF_INTEGER(arg_type); DEF_ATOM(atom); DEF_INTEGER(n); DEF_FLOAT(n1); DEF_X_Y(xy); Args2(STR(fct_name), INTEGER(nb_elem)); for (i = 0; i < nb_elem; i++) { LOAD_INTEGER(arg_type); if (arg_type == X_Y) /* move_ret x(X) (or y(Y) but not used) */ { LOAD_X_Y(xy); ret = 3; ret_xy = xy; ret_c = c; continue; } /* else should be ATOM */ LOAD_STR(c_option); if (strcmp(c_option, "boolean") == 0) ret = 1; else if (strcmp(c_option, "jump") == 0) ret = 2; else if (strcmp(c_option, "fast_call") == 0) fast_call = 1; else if (strcmp(c_option, "tagged") == 0) tagged = 1; else if (strcmp(c_option, "set_cp") == 0) set_cp = 1; } LOAD_INTEGER(nb_elem); if (set_cp) Inst_Printf("prep_cp", ""); Inst_Printf("call_c", NULL); if (fast_call) fputs(FAST "", file_out); fprintf(file_out, "%s(", fct_name); i = 0; adr_of_xy = 0; goto write_a_arg; while(i < nb_elem) { fputc(',', file_out); write_a_arg: LOAD_INTEGER(arg_type); switch(arg_type) { case ATOM: /* detect & x(X) or & y(Y) */ str = *((char **) top); if (*str == '&' && str[1] == '\0' && i < nb_elem - 1 && *(long *) (top+1) == X_Y) { adr_of_xy = 1; i++; top++; goto write_a_arg; } if (tagged) { LOAD_ATOM_1(atom); fprintf(file_out, "ta(%d)", atom->no); } else { LOAD_ATOM_0(atom); fprintf(file_out, "at(%d)", atom->no); } break; case INTEGER: LOAD_INTEGER(n); fprintf(file_out, "%ld", (tagged) ? Tag_INT(n) : n); break; case FLOAT: LOAD_FLOAT(n1); fprintf(file_out, "%1.20e", n1); break; case X_Y: LOAD_X_Y(xy); if (adr_of_xy) { fprintf(file_out, "&"); adr_of_xy = 0; } fprintf(file_out, "%c(%ld)", c, xy); break; case F_N: if (tagged) { DEF_F_N_1(atom, n); LOAD_F_N_1(atom, n); fprintf(file_out, "fn(%d)", f_n_no); } else { DEF_F_N_0(atom, n); LOAD_F_N_0(atom, n); fprintf(file_out, "at(%d),%ld", atom->no, n); } break; } i++; } fprintf(file_out, ")\n"); if (ret == 1) Inst_Printf("fail_ret", ""); else if (ret == 2) Inst_Printf("jump_ret", ""); else if (ret == 3) Inst_Printf("move_ret", "%c(%ld)", ret_c, ret_xy); if (set_cp) Inst_Printf("here_cp", ""); } /*-------------------------------------------------------------------------* * INIT_FOREIGN_TABLE * * * *-------------------------------------------------------------------------*/ void Init_Foreign_Table(void) { foreign_tbl[FOREIGN_TYPE_INTEGER] = "Integer"; foreign_tbl[FOREIGN_TYPE_POSITIVE] = "Positive"; foreign_tbl[FOREIGN_TYPE_FLOAT] = "Float"; foreign_tbl[FOREIGN_TYPE_NUMBER] = "Number"; foreign_tbl[FOREIGN_TYPE_ATOM] = "Atom"; foreign_tbl[FOREIGN_TYPE_BOOLEAN] = "Boolean"; foreign_tbl[FOREIGN_TYPE_CHAR] = "Char"; foreign_tbl[FOREIGN_TYPE_IN_CHAR] = "In_Char"; foreign_tbl[FOREIGN_TYPE_CODE] = "Code"; foreign_tbl[FOREIGN_TYPE_IN_CODE] = "In_Code"; foreign_tbl[FOREIGN_TYPE_BYTE] = "Byte"; foreign_tbl[FOREIGN_TYPE_IN_BYTE] = "In_Byte"; foreign_tbl[FOREIGN_TYPE_STRING] = "String"; foreign_tbl[FOREIGN_TYPE_CHARS] = "Chars"; foreign_tbl[FOREIGN_TYPE_CODES] = "Codes"; foreign_tbl[FOREIGN_TYPE_TERM] = "Term"; } /*-------------------------------------------------------------------------* * F_FOREIGN_CALL_C * * * * foreign_call_c(F, T0, P/N, K, [(M1, T1),...]) * * F=FctName, T0=Return, P/N=BipName/BipArity, K=ChcSize * * Mi=mode (in/out/in_out), Ti=type * *-------------------------------------------------------------------------*/ void F_foreign_call_c(ArgVal arg[]) #define F_Double(t) ((t)==FOREIGN_TYPE_FLOAT || (t)==FOREIGN_TYPE_NUMBER) #define F_Array_Letter(t) (F_Double(t) ? 'D' : 'L') { static int mode[NB_OF_X_REGS], type[NB_OF_X_REGS]; int i, j, n, fio_arg_index = 0, nb_c_str = 0, s_dup, complex_jump_ret = 0; char c; char l[MAX_LABEL_LENGTH]; DEF_STR(str_mode); DEF_STR(str_type); Args6(STR(fct_name), STR(ret_mode), STR(bip_name), INTEGER(bip_arity), INTEGER(chc_size), INTEGER(nb_elem)); for (i = 0; i < nb_elem; i++) { LOAD_STR(str_mode); LOAD_STR(str_type); if (strcmp(str_mode, "in") == 0) mode[i] = FOREIGN_MODE_IN; else if (strcmp(str_mode, "out") == 0) mode[i] = FOREIGN_MODE_OUT; else if (strcmp(str_mode, "in_out") == 0) mode[i] = FOREIGN_MODE_IN_OUT; j = 0; for (;;) if (strcasecmp(foreign_tbl[j], str_type) == 0) break; else if (++j >= FOREIGN_TBL_SIZE) { fprintf(stderr, "invalid foreign type:%s\n", str_type); exit(1); } type[i] = j; if ((mode[i] == FOREIGN_MODE_IN || mode[i] == FOREIGN_MODE_IN_OUT) && (j == FOREIGN_TYPE_CHARS || j == FOREIGN_TYPE_CODES)) nb_c_str++; } if (chc_size >= 0) { sprintf(l, FORMAT_LABEL(1L)); Inst_Printf("call_c", "Foreign_Create_Choice(&%s,%d,%ld)", l, cur_arity, chc_size); Label_Printf("%s:", l); Inst_Printf("call_c", "Foreign_Update_Choice(&%s,%d,%ld)", l, cur_arity, chc_size); } if (*bip_name || bip_arity != -2) Inst_Printf("call_c", FAST "Set_C_Bip_Name(\"%s\",%ld)", bip_name, bip_arity); for (i = 0; i < nb_elem; i++) { n = type[i]; c = F_Array_Letter(n); s_dup = (mode[i] == FOREIGN_MODE_IN || FOREIGN_MODE_IN_OUT) && (n == FOREIGN_TYPE_CHARS || n == FOREIGN_TYPE_CODES) && --nb_c_str != 0; switch (mode[i]) { case FOREIGN_MODE_IN: if (n != FOREIGN_TYPE_TERM) { Inst_Printf("call_c", "Rd_%s_Check(X(%d))", foreign_tbl[n], i); Inst_Printf("move_ret", "F%c(%d)", c, i); if (s_dup) { Inst_Printf("call_c", "Strdup_Check(FL(%d),\"call generated by %s\",%d)", i, __FILE__, __LINE__); Inst_Printf("move_ret", "FL(%d)", i); } } break; case FOREIGN_MODE_OUT: complex_jump_ret = 1; /* arg to unif. complex jump_ret */ if (n != FOREIGN_TYPE_TERM) Inst_Printf("call_c", "Check_For_Un_%s(X(%d))", foreign_tbl[n], i); break; case FOREIGN_MODE_IN_OUT: complex_jump_ret = 1; /* arg to unif. complex jump_ret */ if (n != FOREIGN_TYPE_TERM) Inst_Printf("call_c", "Foreign_Rd_IO_Arg(%d,X(%d)," "&Rd_%s_Check,%d)", (c == 'L') + s_dup, /* 0,1 or 2 if strdup */ i, foreign_tbl[n], fio_arg_index++); else Inst_Printf("call_c", "Foreign_Rd_IO_Arg(1,X(%d),0,%d)", i, fio_arg_index++); Inst_Printf("move_ret", "FL(%d)", i); break; } } Inst_Printf("call_c", NULL); fprintf(file_out, "%s(", fct_name); for (i = 0; i < nb_elem; i++) { n = type[i]; c = (mode[i] == FOREIGN_MODE_IN_OUT) ? 'L' : F_Array_Letter(n); if (i > 0) fputc(',', file_out); if (mode[i] == FOREIGN_MODE_OUT) fprintf(file_out, "&"); if (n == FOREIGN_TYPE_TERM && mode[i] == FOREIGN_MODE_IN) fprintf(file_out, "X(%d)", i); else fprintf(file_out, "F%c(%d)", c, i); } fprintf(file_out, ")\n"); if (strcmp(ret_mode, "jump") == 0) { if (!complex_jump_ret) Inst_Printf("jump_ret", ""); else Inst_Printf("move_ret", "FL(%d)", NB_OF_X_REGS - 1); } else { complex_jump_ret = 0; if (strcmp(ret_mode, "boolean") == 0) Inst_Printf("fail_ret", ""); } for (i = 0; i < nb_elem; i++) { n = type[i]; c = F_Array_Letter(type[i]); switch (mode[i]) { case FOREIGN_MODE_OUT: if (n != FOREIGN_TYPE_TERM) Inst_Printf("call_c", "Un_%s(F%c(%d),X(%d))", foreign_tbl[n], c, i, i); else Inst_Printf("call_c", FAST "Unify(X(%d),FL(%d))", i, i); Inst_Printf("fail_ret", ""); break; case FOREIGN_MODE_IN_OUT: Inst_Printf("call_c", "Foreign_Un_IO_Arg(%d,&Un_%s,FL(%d)," "X(%d))", c == 'L', foreign_tbl[n], i, i); Inst_Printf("fail_ret", ""); break; } } if (complex_jump_ret) { Inst_Printf("call_c", "Foreign_Jump_Ret(FL(%d))", NB_OF_X_REGS - 1); Inst_Printf("jump_ret", ""); } } /*-------------------------------------------------------------------------* * PARSE_ARGUMENTS * * * *-------------------------------------------------------------------------*/ void Parse_Arguments(int argc, char *argv[]) { static char str[1024]; int i; file_name_in = file_name_out = NULL; comment = 0; for (i = 1; i < argc; i++) { if (*argv[i] == '-' && argv[i][1] != '\0') { if (Check_Arg(i, "-o") || Check_Arg(i, "--output")) { if (++i >= argc) { fprintf(stderr, "FILE missing after %s option\n", argv[i - 1]); exit(1); } file_name_out = argv[i]; continue; } if (Check_Arg(i, "--comment")) { comment = 1; continue; } if (Check_Arg(i, "--version")) { Display_Copying("WAM to Mini-Assembly Compiler"); exit(0); } if (Check_Arg(i, "-h") || Check_Arg(i, "--help")) { Display_Help(); exit(0); } fprintf(stderr, "unknown option %s - try wam2ma --help\n", argv[i]); exit(1); } if (file_name_in != NULL) { fprintf(stderr, "input file already specified (%s)\n", file_name_in); exit(1); } file_name_in = argv[i]; } if (file_name_in != NULL && strcmp(file_name_in, "-") == 0) file_name_in = NULL; if (file_name_out == NULL && file_name_in != NULL) { strcpy(str, file_name_in); i = strlen(str); if (strcmp(str + i - 4, ".wam") == 0) strcpy(str + i - 4, DEFAULT_OUTPUT_SUFFIX); else strcpy(str + i, DEFAULT_OUTPUT_SUFFIX); file_name_out = str; } if (file_name_out != NULL && strcmp(file_name_out, "-") == 0) file_name_out = NULL; } /*-------------------------------------------------------------------------* * DISPLAY_HELP * * * *-------------------------------------------------------------------------*/ void Display_Help(void) #define L(msg) fprintf(stderr, "%s\n", msg) { L("Usage: wam2ma [OPTION...] FILE"); L(""); L("Options:"); L(" -o FILE, --output FILE set output file name"); L(" --comment include comments in the output file"); L(" -h, --help print this help and exit"); L(" --version print version number and exit"); L(""); L("'-' can be given as FILE for the standard input/output"); L(""); L("Report bugs to bug-prolog@gnu.org."); } #undef L ./gprolog-1.3.0/src/Wam2Ma/wam_parser.h0000644004425400513100000000574110547154143016170 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : WAM to mini-assembler translator * * File : wam_parser.h * * Descr.: parser - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: wam_parser.h,v 1.11 2007/01/04 10:35:15 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef enum { /* skip 256 to specify a given char */ ATOM = 256, /* an atom */ INTEGER, /* an integer */ FLOAT, /* a double */ X_Y, /* x(X) or y(Y) */ F_N, /* a ATOM / INTEGER */ LABEL, /* a label */ ANY /* ATOM or INTEGER or F_N or FLOAT or X_Y */ } ArgTyp; #define L1(t) L2(t, 0) #define L2(t1, t2) ((t1 << 16) | (t2)) #define DECODE_L2(a, t1, t2) t1 = (a) >> 16; t2 = (a) & ((1 << 16) - 1) typedef double ArgVal; /* to ensure double alignment */ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ int Parse_Wam_File(char *file_name_in, int comment); void Syntax_Error(char *s); #define Add_Arg(ptr, type, val) (*((type *) (ptr)) = (val) , (ptr)++) #define Get_Arg(ptr, type, val) ((val) = *((type *) (ptr)) , (ptr)++) ./gprolog-1.3.0/src/VERSION0000644004425400513100000000001610547440354013633 0ustar diazlocogprolog-1.3.0 ./gprolog-1.3.0/src/EngineFD/0000777004425400513100000000000010547442376014217 5ustar diazloco./gprolog-1.3.0/src/EngineFD/fd_inst.c0000644004425400513100000010215510547154141015777 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver * * File : fd_inst.c * * Descr.: FD instruction implementation * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_inst.c,v 1.14 2007/01/04 10:35:13 diaz Exp $ */ #include #include #define FD_INST_FILE #include "engine_pl.h" #include "engine_fd.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ #define MSG_VECTOR_TOO_SMALL "Warning: Vector too small - maybe lost solutions (FD Var:_%d)\n" /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static WamWord dummy_fd_var[FD_VARIABLE_FRAME_SIZE]; static unsigned long always_date = -1; /* must be always > DATE */ static unsigned long never_date = 0; /* must be always < DATE */ void (*fd_init_solver) () = Fd_Init_Solver0; /* overwrite var of if_no_fd.c */ void (*fd_reset_solver) () = Fd_Reset_Solver0; /* overwrite var of if_no_fd.c */ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void All_Propagations(WamWord *fdv_adr, int propag); /*---------------------------------* * Auxiliary engine macros * *---------------------------------*/ #define Trail_Fd_Int_Variable_If_Necessary(fdv_adr) \ do \ { \ if (Word_Needs_Trailing(&FD_Tag_Value(fdv_adr))) \ { \ Trail_OV(&FD_Tag_Value(fdv_adr)); \ Trail_OV(&FD_INT_Date(fdv_adr)); \ Trail_Range_If_Necessary(fdv_adr); \ } \ } \ while (0) #define Trail_Range_If_Necessary(fdv_adr) \ do \ { \ if (Range_Stamp(fdv_adr) != STAMP) \ { \ Trail_MV(fdv_adr + OFFSET_RANGE, RANGE_SIZE); \ if (Is_Sparse(Range (fdv_adr))) \ Trail_MV((WamWord *) Vec(fdv_adr), vec_size); \ \ Range_Stamp(fdv_adr) = STAMP; \ } \ } \ while (0) #define Trail_Chains_If_Necessary(fdv_adr) \ do \ { \ if (Chains_Stamp(fdv_adr) != STAMP) \ { \ Trail_MV(fdv_adr + OFFSET_CHAINS, CHAINS_SIZE); \ Chains_Stamp(fdv_adr) = STAMP; \ } \ } \ while (0) #define Update_Range_From_Int(fdv_adr, n, propag) \ do \ { \ propag = MASK_EMPTY; \ \ Trail_Fd_Int_Variable_If_Necessary(fdv_adr); \ Nb_Elem(fdv_adr) = 1; \ \ Set_Min_Max_Mask(propag); \ Set_Dom_Mask(propag); \ Set_Val_Mask(propag); \ \ if (Min(fdv_adr) != n) \ { \ Min(fdv_adr) = n; \ Set_Min_Mask(propag); \ } \ \ if (Max(fdv_adr) != n) \ { \ Max(fdv_adr) = n; \ Set_Max_Mask(propag); \ } \ \ Vec(fdv_adr) = NULL; \ FD_Tag_Value(fdv_adr) = Tag_INT(n); \ FD_INT_Date(fdv_adr) = DATE; \ } \ while (0) #define Update_Interval_From_Interval(fdv_adr, nb_elem, min, max, propag) \ do \ { \ propag = MASK_EMPTY; \ \ if (Nb_Elem(fdv_adr) != nb_elem) \ { \ Trail_Range_If_Necessary(fdv_adr); \ Nb_Elem(fdv_adr) = nb_elem; \ \ Set_Min_Max_Mask(propag); \ Set_Dom_Mask(propag); \ \ if (Min(fdv_adr) != min) \ { \ Min(fdv_adr) = min; \ Set_Min_Mask(propag); \ } \ \ if (Max(fdv_adr) != max) \ { \ Max(fdv_adr) = max; \ Set_Max_Mask(propag); \ } \ } \ } \ while (0) #define FD_Word_Needs_Trailing(adr) ((adr) < CSB(B)) #define FD_Bind_OV(adr, word) \ do \ { \ if (FD_Word_Needs_Trailing(adr)) \ Trail_OV(adr); \ *(adr) = (word); \ } \ while (0) #define Update_Range_From_Range(fdv_adr, nb_elem, range, propag) \ do \ { \ Range *r = Range (fdv_adr); \ \ propag = MASK_EMPTY; \ \ if (Min(fdv_adr) != (range)->min) \ { \ Set_Min_Mask(propag); \ Set_Min_Max_Mask(propag); \ } \ \ if (Max(fdv_adr) != (range)->max) \ { \ Set_Max_Mask(propag); \ Set_Min_Max_Mask(propag); \ } \ \ if (Nb_Elem(fdv_adr) != nb_elem) \ Set_Dom_Mask(propag); \ \ if (propag || (Is_Interval(r) && Is_Sparse(range))) \ { \ Trail_Range_If_Necessary(fdv_adr); \ Nb_Elem(fdv_adr) = nb_elem; \ Range_Copy(r, range); \ } \ else if (r->extra_cstr != (range)->extra_cstr) \ { \ FD_Bind_OV((WamWord *) &(r->extra_cstr), (range->extra_cstr)); \ Set_Dom_Mask(propag); \ } \ } \ while (0) /*-------------------------------------------------------------------------* * FD_INIT_SOLVER0 * * * *-------------------------------------------------------------------------*/ void Fd_Init_Solver0(void) { char *p; int max_val; p = (char *) getenv(ENV_VAR_VECTOR_MAX); if (p && *p) sscanf(p, "%d", &max_val); else max_val = DEFAULT_VECTOR_MAX; Define_Vector_Size(max_val); Fd_Reset_Solver0(); fd_unify_with_integer = Fd_Unify_With_Integer0; fd_unify_with_fd_var = Fd_Unify_With_Fd_Var0; fd_variable_size = Fd_Variable_Size0; fd_copy_variable = Fd_Copy_Variable0; fd_variable_to_string = Fd_Variable_To_String0; } /*-------------------------------------------------------------------------* * FD_RESET_SOLVER0 * * * *-------------------------------------------------------------------------*/ void Fd_Reset_Solver0(void) { STAMP = DATE = 0; } /*-------------------------------------------------------------------------* * FD_PROLOG_TO_FD_VAR * * * *-------------------------------------------------------------------------*/ WamWord * Fd_Prolog_To_Fd_Var(WamWord arg_word, Bool pl_var_ok) { WamWord word, tag_mask; WamWord *adr, *fdv_adr; DEREF(arg_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) { if (!pl_var_ok) Pl_Err_Instantiation(); adr = UnTag_REF(word); fdv_adr = Fd_New_Variable(); Bind_UV(adr, Tag_REF(fdv_adr)); return fdv_adr; } if (tag_mask == TAG_INT_MASK) return Fd_New_Int_Variable(UnTag_INT(word)); if (tag_mask == TAG_FDV_MASK) return UnTag_FDV(word); Pl_Err_Type(type_fd_variable, word); return NULL; } /*-------------------------------------------------------------------------* * FD_PROLOG_TO_RANGE * * * *-------------------------------------------------------------------------*/ Range * Fd_Prolog_To_Range(WamWord list_word) { Range *range; range = (Range *) CS; CS += sizeof(Range) / sizeof(WamWord); range->vec = NULL; Fd_List_Int_To_Range(range, list_word); return range; } /*-------------------------------------------------------------------------* * FD_PROLOG_TO_VALUE * * * *-------------------------------------------------------------------------*/ int Fd_Prolog_To_Value(WamWord arg_word) { WamWord word, tag_mask; DEREF(arg_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_INT_MASK) Pl_Err_Type(type_integer, word); return UnTag_INT(word); } /*-------------------------------------------------------------------------* * FD_LIST_INT_TO_RANGE * * * *-------------------------------------------------------------------------*/ void Fd_List_Int_To_Range(Range *range, WamWord list_word) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr; WamWord val; int n = 0; save_list_word = list_word; range->extra_cstr = FALSE; Vector_Allocate_If_Necessary(range->vec); Vector_Empty(range->vec); for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_INT_MASK) Pl_Err_Type(type_integer, word); val = UnTag_INT(word); if ((unsigned) val > (unsigned) vec_max_integer) range->extra_cstr = TRUE; else { Vector_Set_Value(range->vec, val); n++; } list_word = Cdr(lst_adr); } if (n == 0) Set_To_Empty(range); else Range_From_Vector(range); } /*-------------------------------------------------------------------------* * FD_PROLOG_TO_ARRAY_INT * * * *-------------------------------------------------------------------------*/ WamWord * Fd_Prolog_To_Array_Int(WamWord list_word) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr; WamWord val; int n = 0; WamWord *array; WamWord *save_array; array = CS; save_list_word = list_word; save_array = array; array++; /* +1 for the nb of elems */ for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_INT_MASK) Pl_Err_Type(type_integer, word); val = UnTag_INT(word); *array++ = val; n++; list_word = Cdr(lst_adr); } *save_array = n; CS = array; return save_array; } /*-------------------------------------------------------------------------* * FD_PROLOG_TO_ARRAY_ANY * * * *-------------------------------------------------------------------------*/ WamWord * Fd_Prolog_To_Array_Any(WamWord list_word) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr; int n = 0; WamWord *array; WamWord *save_array; array = CS; save_list_word = list_word; save_array = array; array++; /* +1 for the nb of elems */ for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); *array++ = Car(lst_adr); n++; list_word = Cdr(lst_adr); } *save_array = n; CS = array; return save_array; } /*-------------------------------------------------------------------------* * FD_PROLOG_TO_ARRAY_FDV * * * *-------------------------------------------------------------------------*/ WamWord * Fd_Prolog_To_Array_Fdv(WamWord list_word, Bool pl_var_ok) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr; int n = 0; WamWord *save_array; WamWord *array; /* compute the length of the list to */ /* reserve space in the heap for the */ /* array before pushing new FD vars. */ save_list_word = list_word; for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask != TAG_LST_MASK) break; lst_adr = UnTag_LST(word); n++; list_word = Cdr(lst_adr); } array = CS; CS = CS + n + 1; list_word = save_list_word; save_array = array; array++; /* +1 for the nb of elems */ for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); *array++ = (WamWord) Fd_Prolog_To_Fd_Var(Car(lst_adr), pl_var_ok); list_word = Cdr(lst_adr); } *save_array = n; return save_array; } /*-------------------------------------------------------------------------* * FD_CREATE_C_FRAME * * * *-------------------------------------------------------------------------*/ WamWord * Fd_Create_C_Frame(long (*cstr_fct) (), WamWord *AF, WamWord *fdv_adr, Bool optim2) { WamWord *CF = CS; AF_Pointer(CF) = AF; Optim_Pointer(CF) = (optim2 && fdv_adr) ? &FD_INT_Date(fdv_adr) : (WamWord *) &always_date; Cstr_Address(CF) = cstr_fct; /* if ground Nb_Cstr not allocated (Fd_Int_Frame) */ if (fdv_adr && !Fd_Variable_Is_Ground(fdv_adr)) Nb_Cstr(fdv_adr)++; CS += CONSTRAINT_FRAME_SIZE; return CF; } /*-------------------------------------------------------------------------* * FD_ADD_DEPENDENCY * * * *-------------------------------------------------------------------------*/ void Fd_Add_Dependency(WamWord *fdv_adr, int chain_nb, WamWord *CF) { WamWord **chain_adr; if (Fd_Variable_Is_Ground(fdv_adr)) return; Trail_Chains_If_Necessary(fdv_adr); Chains_Mask(fdv_adr) |= (1 << chain_nb); chain_adr = (WamWord **) (&Chain_Min(fdv_adr) + chain_nb); CF_Pointer(CS) = CF; Next_Chain(CS) = *chain_adr; *chain_adr = CS; CS += CHAIN_RECORD_FRAME_SIZE; } /*-------------------------------------------------------------------------* * FD_ADD_LIST_DEPENDENCY * * * *-------------------------------------------------------------------------*/ void Fd_Add_List_Dependency(WamWord *array, int chain_nb, WamWord *CF) { int n = *array++; while (n--) Fd_Add_Dependency((WamWord *) (*array++), chain_nb, CF); } /*-------------------------------------------------------------------------* * FD_NEW_VARIABLE * * * *-------------------------------------------------------------------------*/ WamWord * Fd_New_Variable(void) { WamWord *fdv_adr = CS; FD_Tag_Value(fdv_adr) = Tag_FDV(fdv_adr); FD_INT_Date(fdv_adr) = always_date; /* must be>DATE while tag==FDV */ Queue_Date_At_Push(fdv_adr) = 0; Queue_Propag_Mask(fdv_adr) = 0; Queue_Next_Fdv_Adr(fdv_adr) = (WamWord) NULL; Range_Stamp(fdv_adr) = STAMP; Nb_Elem(fdv_adr) = INTERVAL_MAX_INTEGER + 1; Range_Init_Interval(Range(fdv_adr), 0, INTERVAL_MAX_INTEGER); Chains_Stamp(fdv_adr) = STAMP; Nb_Cstr(fdv_adr) = 0; Chains_Mask(fdv_adr) = MASK_EMPTY; Chain_Min(fdv_adr) = Chain_Max(fdv_adr) = Chain_Min_Max(fdv_adr) = (WamWord) NULL; Chain_Dom(fdv_adr) = Chain_Val(fdv_adr) = (WamWord) NULL; CS += FD_VARIABLE_FRAME_SIZE; return fdv_adr; } /*-------------------------------------------------------------------------* * FD_NEW_BOOL_VARIABLE * * * *-------------------------------------------------------------------------*/ WamWord * Fd_New_Bool_Variable(void) { WamWord *fdv_adr = Fd_New_Variable(); Nb_Elem(fdv_adr) = 2; Min(fdv_adr) = 0; Max(fdv_adr) = 1; return fdv_adr; } /*-------------------------------------------------------------------------* * FD_NEW_INT_VARIABLE * * * *-------------------------------------------------------------------------*/ WamWord * Fd_New_Int_Variable(int n) { WamWord *fdv_adr = CS; FD_Tag_Value(fdv_adr) = Tag_INT(n); FD_INT_Date(fdv_adr) = DATE; /* put a great value to have an exact optim #2 */ Queue_Date_At_Push(fdv_adr) = 0; Queue_Propag_Mask(fdv_adr) = 0; Queue_Next_Fdv_Adr(fdv_adr) = (WamWord) NULL; Range_Stamp(fdv_adr) = STAMP; Nb_Elem(fdv_adr) = 1; Range_Init_Interval(Range(fdv_adr), n, n); CS += FD_INT_VARIABLE_FRAME_SIZE; return fdv_adr; } /*-------------------------------------------------------------------------* * FD_BEFORE_ADD_CSTR * * * *-------------------------------------------------------------------------*/ void Fd_Before_Add_Cstr(void) { TP = dummy_fd_var; DATE++; } /*-------------------------------------------------------------------------* * FD_TELL_VALUE * * * *-------------------------------------------------------------------------*/ Bool Fd_Tell_Value(WamWord *fdv_adr, int n) { int propag; if (!Range_Test_Value(Range(fdv_adr), n)) { if (Extra_Cstr(fdv_adr) && n > vec_max_integer) Fd_Display_Extra_Cstr(fdv_adr); return FALSE; } if (Fd_Variable_Is_Ground(fdv_adr)) return TRUE; Update_Range_From_Int(fdv_adr, n, propag); All_Propagations(fdv_adr, propag); return TRUE; } /*-------------------------------------------------------------------------* * FD_TELL_NOT_VALUE * * * *-------------------------------------------------------------------------*/ Bool Fd_Tell_Not_Value(WamWord *fdv_adr, int n) { Range *r; int min, max; int propag; start: r = Range(fdv_adr); if (!Range_Test_Value(r, n)) return TRUE; if (Fd_Variable_Is_Ground(fdv_adr)) { if (Extra_Cstr(fdv_adr)) Fd_Display_Extra_Cstr(fdv_adr); return FALSE; } min = r->min; max = r->max; if (Is_Interval(r) && n != min && n != max) { if (min > vec_max_integer) { Fd_Display_Extra_Cstr(fdv_adr); return FALSE; } if (min == vec_max_integer) { Fd_Display_Extra_Cstr(fdv_adr); Update_Range_From_Int(fdv_adr, min, propag); All_Propagations(fdv_adr, propag); return TRUE; } Trail_Range_If_Necessary(fdv_adr); Range_Becomes_Sparse(r); Nb_Elem(fdv_adr) = r->max - r->min + 1; if (r->extra_cstr) /* the max has been changed */ { propag = MASK_EMPTY; Set_Max_Mask(propag); Set_Min_Max_Mask(propag); Set_Dom_Mask(propag); All_Propagations(fdv_adr, propag); } goto start; } if (Nb_Elem(fdv_adr) == 2) { if (n == min) min = max; Update_Range_From_Int(fdv_adr, min, propag); goto do_propag; } /* here if sparse OR n==min OR n==max */ Trail_Range_If_Necessary(fdv_adr); propag = MASK_EMPTY; Set_Dom_Mask(propag); if (Is_Sparse(r)) Vector_Reset_Value(r->vec, n); Nb_Elem(fdv_adr)--; if (n == min) { Set_Min_Mask(propag); Set_Min_Max_Mask(propag); r->min = (Is_Interval(r)) ? n + 1 : Vector_Next_After(r->vec, n); goto do_propag; } if (n == max) { Set_Max_Mask(propag); Set_Min_Max_Mask(propag); r->max = (Is_Interval(r)) ? n - 1 : Vector_Next_Before(r->vec, n); goto do_propag; } do_propag: All_Propagations(fdv_adr, propag); return TRUE; } /*-------------------------------------------------------------------------* * FD_TELL_INT_RANGE * * * *-------------------------------------------------------------------------*/ Bool Fd_Tell_Int_Range(WamWord *fdv_adr, Range *range) { int n = Min(fdv_adr); if (!Range_Test_Value(range, n)) { if (n > vec_max_integer && range->extra_cstr) Fd_Display_Extra_Cstr(fdv_adr); return FALSE; } return TRUE; } /*-------------------------------------------------------------------------* * FD_TELL_INTERV_INTERV * * * *-------------------------------------------------------------------------*/ Bool Fd_Tell_Interv_Interv(WamWord *fdv_adr, int min, int max) { int nb_elem; int propag; int min1, max1; min1 = Min(fdv_adr); max1 = Max(fdv_adr); min = math_max(min, min1); max = math_min(max, max1); if (min > max) /* detects also if the initial */ return FALSE; /* interval (min, max) was empty */ if (min == max) Update_Range_From_Int(fdv_adr, min, propag); else { nb_elem = max - min + 1; Update_Interval_From_Interval(fdv_adr, nb_elem, min, max, propag); } if (propag) All_Propagations(fdv_adr, propag); return TRUE; } /*-------------------------------------------------------------------------* * FD_TELL_RANGE_RANGE * * * *-------------------------------------------------------------------------*/ Bool Fd_Tell_Range_Range(WamWord *fdv_adr, Range *range) { int nb_elem; int propag; WamWord *save_CS = CS; if (range->vec) CS = (WamWord *) range->vec; CS += vec_size; Range_Inter(range, Range(fdv_adr)); CS = save_CS; if (Is_Empty(range)) { if (range->extra_cstr) Fd_Display_Extra_Cstr(fdv_adr); return FALSE; } if (range->min == range->max) { if (range->extra_cstr) Fd_Display_Extra_Cstr(fdv_adr); Update_Range_From_Int(fdv_adr, range->min, propag); } else { nb_elem = Range_Nb_Elem(range); Update_Range_From_Range(fdv_adr, nb_elem, range, propag); } if (propag) All_Propagations(fdv_adr, propag); return TRUE; } /*-------------------------------------------------------------------------* * ALL_PROPAGATIONS * * * *-------------------------------------------------------------------------*/ static void All_Propagations(WamWord *fdv_adr, int propag) { if (propag &= Chains_Mask(fdv_adr)) { if (Queue_Date_At_Push(fdv_adr) < DATE) /* not yet in the queue */ { Queue_Date_At_Push(fdv_adr) = DATE; Queue_Propag_Mask(fdv_adr) = propag; Queue_Next_Fdv_Adr(TP) = (WamWord) fdv_adr; TP = fdv_adr; } else /* already in the queue */ Queue_Propag_Mask(fdv_adr) |= propag; } } /*-------------------------------------------------------------------------* * FD_AFTER_ADD_CSTR * * * *-------------------------------------------------------------------------*/ Bool Fd_After_Add_Cstr(void) { WamWord *fdv_adr; WamWord propag; WamWord *record_adr; WamWord *chain_adr; WamWord *CF; WamWord *BP; unsigned long date = DATE; unsigned long *pdate; WamWord *AF; long (*fct) (); if (TP == dummy_fd_var) return TRUE; BP = dummy_fd_var; BP = (WamWord *) Queue_Next_Fdv_Adr(BP); for (;;) { fdv_adr = (WamWord *) BP; propag = Queue_Propag_Mask(fdv_adr); Queue_Propag_Mask(fdv_adr) = 0; chain_adr = &Chain_Min(fdv_adr); for (; propag; propag >>= 1, chain_adr++) if (propag & 1) { record_adr = (WamWord *) (*chain_adr); do { CF = CF_Pointer(record_adr); #if 1 /* optim #2 */ pdate = (unsigned long *) Optim_Pointer(CF); if (*pdate < date) continue; #endif fct = Cstr_Address(CF); AF = AF_Pointer(CF); fct = (long (*)()) (*fct) (AF); if (fct == (long (*)()) FALSE) return FALSE; #if 1 /* FD switch */ if (fct != (long (*)()) TRUE) /* FD switch case triggered */ { if ((*fct) (AF) == FALSE) return FALSE; Fd_Stop_Constraint(CF); } #endif } while ((record_adr = Next_Chain(record_adr)) != NULL); } if (Queue_Propag_Mask(fdv_adr) == 0) { if (BP == TP) break; BP = (WamWord *) Queue_Next_Fdv_Adr(BP); Queue_Date_At_Push(fdv_adr) = 0; } } return TRUE; } /*-------------------------------------------------------------------------* * FD_STOP_CONSTRAINT * * * *-------------------------------------------------------------------------*/ void Fd_Stop_Constraint(WamWord *CF) { FD_Bind_OV((WamWord *) (CF + OFFSET_OF_OPTIM_POINTER), (WamWord) (&never_date)); } /*-------------------------------------------------------------------------* * FD_ASSIGN_VALUE * * * * fdv_adr is a FDV and n belongs to the range of the FD var * * like Fd_Unify_With_Integer0 but specialized Fd_Tell_Value without * * useless tests (ie. groundness and Range_Test_Value()) * * Used by labeling predicates. * *-------------------------------------------------------------------------*/ Bool Fd_Assign_Value(WamWord *fdv_adr, int n) { int propag; /* Unify(X,n) == X in n..n */ Fd_Before_Add_Cstr(); Update_Range_From_Int(fdv_adr, n, propag); All_Propagations(fdv_adr, propag); return Fd_After_Add_Cstr(); } /*-------------------------------------------------------------------------* * FD_UNIFY_WITH_INTEGER0 * * * *-------------------------------------------------------------------------*/ Bool Fd_Unify_With_Integer0(WamWord *fdv_adr, int n) { /* Unify(X,n) == X in n..n */ Fd_Before_Add_Cstr(); return Fd_Tell_Value(fdv_adr, n) && Fd_After_Add_Cstr(); } /*-------------------------------------------------------------------------* * FD_UNIFY_WITH_FD_VAR0 * * * *-------------------------------------------------------------------------*/ Bool Fd_Unify_With_Fd_Var0(WamWord *fdv_adr1, WamWord *fdv_adr2) { Bool unify_x_y(WamWord x, WamWord y); /* defined in fd_unify.fd as a constraint */ return unify_x_y(Tag_REF(fdv_adr1), Tag_REF(fdv_adr2)); } /*-------------------------------------------------------------------------* * FD_USE_VECTOR * * * *-------------------------------------------------------------------------*/ Bool Fd_Use_Vector(WamWord *fdv_adr) { Range range; if (Is_Sparse(Range(fdv_adr))) return TRUE; Fd_Before_Add_Cstr(); { WamWord *save_CS=CS; /* code of fd_allocate (from fd_to_c.h) */ CS+=vec_size; Range_Init_Interval(&range, 0, INTERVAL_MAX_INTEGER); Range_Becomes_Sparse(&range); CS=save_CS; /* code of fd_deallocate (from fd_to_c.h) */ } return Fd_Tell_Range_Range(fdv_adr, &range) && Fd_After_Add_Cstr(); } /*-------------------------------------------------------------------------* * FD_CHECK_FOR_BOOL_VAR * * * *-------------------------------------------------------------------------*/ Bool Fd_Check_For_Bool_Var(WamWord x_word) { WamWord word, tag_mask; WamWord *adr, *fdv_adr; Range range; DEREF(x_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) { adr = UnTag_REF(word); fdv_adr = Fd_New_Bool_Variable(); Bind_UV(adr, Tag_REF(fdv_adr)); return TRUE; } if (tag_mask == TAG_INT_MASK) return (unsigned long) (UnTag_INT(word)) <= 1; if (tag_mask != TAG_FDV_MASK) Pl_Err_Type(type_fd_variable, word); fdv_adr = UnTag_FDV(word); if (Min(fdv_adr) > 1) return FALSE; if (Max(fdv_adr) <= 1) return TRUE; /* here max > 1 */ if (Min(fdv_adr) == 1) return Fd_Unify_With_Integer0(fdv_adr, 1); /* here min == 0 */ if (!Range_Test_Value(Range(fdv_adr), 1)) return Fd_Unify_With_Integer0(fdv_adr, 0); /* Check Bool == X in 0..1 */ Fd_Before_Add_Cstr(); if (Is_Sparse(Range(fdv_adr))) { Range_Init_Interval(&range, 0, 1); if (!Fd_Tell_Range_Range(fdv_adr, &range)) return FALSE; } else if (!Fd_Tell_Interv_Interv(fdv_adr, 0, 1)) return FALSE; return Fd_After_Add_Cstr(); } /*-------------------------------------------------------------------------* * FD_VARIABLE_SIZE0 * * * *-------------------------------------------------------------------------*/ int Fd_Variable_Size0(WamWord *fdv_adr) { int size = FD_VARIABLE_FRAME_SIZE; if (Is_Sparse(Range(fdv_adr))) size += vec_size; return size; } /*-------------------------------------------------------------------------* * FD_COPY_VARIABLE0 * * * * returns the size of the created fd var. * *-------------------------------------------------------------------------*/ int Fd_Copy_Variable0(WamWord *dst_adr, WamWord *fdv_adr) { WamWord *save_CS; int size; save_CS = CS; CS = dst_adr; Fd_New_Variable(); /* we know that it is pushed at CS (=dst_adr) */ Nb_Elem(dst_adr) = Nb_Elem(fdv_adr); Range_Copy(Range(dst_adr), Range(fdv_adr)); size = CS - dst_adr; CS = save_CS; return size; } /*-------------------------------------------------------------------------* * FD_VARIABLE_TO_STRING0 * * * *-------------------------------------------------------------------------*/ char * Fd_Variable_To_String0(WamWord *fdv_adr) { return Range_To_String(Range(fdv_adr)); } /*-------------------------------------------------------------------------* * FD_DISPLAY_EXTRA_CSTR * * * *-------------------------------------------------------------------------*/ void Fd_Display_Extra_Cstr(WamWord *fdv_adr) { Stream_Printf(stm_tbl[stm_stdout], MSG_VECTOR_TOO_SMALL, Cstr_Offset(fdv_adr)); } ./gprolog-1.3.0/src/EngineFD/fd_to_c.h0000644004425400513100000003253010547154141015752 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver * * File : fd_to_c.h * * Descr.: FD to C macros - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_to_c.h,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ #include #if 0 #include "engine_pl.h" #include "engine_fd.h" #else #include "gprolog.h" #endif /*---------------------------------* * Constants * *---------------------------------*/ /* Environment Frame */ #define Frame_Variable(fv) ((WamWord *)(AF[fv])) #define Frame_Range_Parameter(fp) ((Range *) (AF[fp])) #define Frame_Term_Parameter(fp) ((int) (AF[fp])) #define Frame_List_Parameter(fp) ((WamWord *)(AF[fp])) #define chain_min CHAIN_NB_MIN #define chain_max CHAIN_NB_MAX #define chain_min_max CHAIN_NB_MIN_MAX #define chain_dom CHAIN_NB_DOM #define chain_val CHAIN_NB_VAL /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*---------------------------------* * Auxiliary engine macros * *---------------------------------*/ #define DivDn(x, y) ((x) / (y)) #define DivUp(x, y) (((x) + (y) - 1) / (y)) #define R(r_no) rr##r_no /* Interface with Prolog clauses instructions */ #define fd_create_a_frame(nb_arg) \ AF = CS; \ CS += nb_arg; #define fd_int_in_a_frame(arg, offset) \ AF[offset] = (WamWord) Fd_Prolog_To_Value(fd_##arg); #define fd_range_in_a_frame(arg, offset) \ AF[offset] = (WamWord) Fd_Prolog_To_Range(fd_##arg); #define fd_fdv_in_a_frame(arg, offset) \ AF[offset] = (WamWord) Fd_Prolog_To_Fd_Var(fd_##arg, TRUE); #define fd_fdv_in_a_frame(arg, offset) \ AF[offset] = (WamWord) Fd_Prolog_To_Fd_Var(fd_##arg, TRUE); #define fd_any_in_a_frame(arg, offset) \ AF[offset] = (WamWord) fd_##arg; #define fd_l_int_in_a_frame(arg, offset) \ AF[offset] = (WamWord) Fd_Prolog_To_Array_Int(fd_##arg); #define fd_l_range_in_a_frame(arg, offset) \ printf("fd_l_range_in_a_frame not yet implemented...\n"); #define fd_l_fdv_in_a_frame(arg, offset) \ AF[offset] = (WamWord) Fd_Prolog_To_Array_Fdv(fd_##arg, TRUE); #define fd_l_any_in_a_frame(arg, offset) \ AF[offset] = (WamWord) Fd_Prolog_To_Array_Any(fd_##arg); #define fd_cf_in_a_frame(offset) \ AF[offset] = (WamWord) CF; #define fd_call_internal(fct_name) \ if (!fct_name(AF)) \ { \ ret_val = FALSE; \ goto lab_exit; \ } #define fd_call_internal_and_test_switch_simple(fct_name) \ { \ long (*fct) () = (long (*)()) fct_name(AF); \ \ if (fct == (long (*)()) FALSE) \ { \ ret_val = FALSE; \ goto lab_exit; \ } \ if (fct != (long (*)()) TRUE) /* FD switch case triggered */ \ { \ if ((*fct) (AF) == FALSE) \ { \ ret_val = FALSE; \ goto lab_exit; \ } \ } \ } #define fd_call_internal_and_test_switch(fct_name) \ { \ long (*fct) () = (long (*)()) fct_name(AF); \ \ if (fct == (long (*)()) FALSE) \ { \ ret_val = FALSE; \ goto lab_exit; \ } \ if (fct != (long (*)()) TRUE) /* FD switch case triggered */ \ { \ if ((*fct) (AF) == FALSE) \ { \ ret_val = FALSE; \ goto lab_exit; \ } \ \ Fd_Stop_Constraint(CF); \ } \ } #define fd_stop_constraint(offset) \ if (AF[offset]) \ Fd_Stop_Constraint((WamWord *) (AF[offset])); /* Install instructions */ #define fd_create_c_frame(fct_name, tell_fv, optim2) \ CF = Fd_Create_C_Frame(fct_name, AF, \ (tell_fv == -1) ? NULL : Frame_Variable(tell_fv), \ optim2); #define fd_add_dependency(fv, ch) \ Fd_Add_Dependency(Frame_Variable(fv), chain_##ch, CF); #define fd_add_list_dependency(fv, ch) \ Fd_Add_List_Dependency(Frame_Variable(fv), chain_##ch, CF); /* Constraint instructions */ #define fd_before_add_constraint \ Fd_Before_Add_Cstr(); #define fd_after_add_constraint \ if (!Fd_After_Add_Cstr()) \ { \ ret_val = FALSE; \ goto lab_exit; \ } #define fd_allocate \ { \ WamWord *save_CS = CS; \ CS += vec_size; #define fd_deallocate \ CS = save_CS; \ } #define fd_tell_value(fv, t) \ { \ fdv_adr = Frame_Variable(fv); \ if (!Fd_Tell_Value(fdv_adr, t)) \ { \ ret_val = FALSE; \ goto lab_exit; \ } \ } #define fd_tell_not_value(fv, t) \ { \ fdv_adr = Frame_Variable(fv); \ if (!Fd_Tell_Not_Value(fdv_adr, t)) \ { \ ret_val = FALSE; \ goto lab_exit; \ } \ } #define fd_tell_interval(fv, t_min, t_max) \ { \ fdv_adr = Frame_Variable(fv); \ if (Fd_Variable_Is_Ground(fdv_adr)) \ { \ int n = Min(fdv_adr); \ \ if (n < (int) (t_min) || n > (int) (t_max)) \ { /* also detects if initial range is empty */ \ ret_val = FALSE; \ goto lab_exit; \ } \ } \ else if (Is_Sparse(Range (fdv_adr))) \ { \ Range range; \ \ Range_Init_Interval(&range, t_min, t_max); \ \ if (!Fd_Tell_Range_Range(fdv_adr, &range)) \ { \ ret_val = FALSE; \ goto lab_exit; \ } \ } \ else if (!Fd_Tell_Interv_Interv(fdv_adr, t_min, t_max)) \ { \ ret_val = FALSE; \ goto lab_exit; \ } \ } #define fd_tell_range(fv, r) \ { \ fdv_adr = Frame_Variable(fv); \ if (Fd_Variable_Is_Ground(fdv_adr)) \ { \ if (!Fd_Tell_Int_Range(fdv_adr, &R(r))) \ { \ ret_val = FALSE; \ goto lab_exit; \ } \ } \ else if (!Fd_Tell_Range_Range(fdv_adr, &R(r))) \ { \ ret_val = FALSE; \ goto lab_exit; \ } \ } #define fd_check_fct(fct) \ if (!fct) \ { \ ret_val = FALSE; \ goto lab_exit; \ } /* Tests */ #define fd_test_exit_condition(t) \ if (t) \ goto lab_exit; #define fd_test_fail_condition(t) \ if (!t) \ { \ ret_val = FALSE; \ goto lab_exit; \ } #define fd_test_switch_condition(t, fct_name) \ if (t) \ { \ ret_val = (long) fct_name; \ goto lab_exit; \ } /* Range */ #define fd_range_interval(r, t_min, t_max) \ Range_Init_Interval(&R(r), t_min, t_max); #define fd_load_range(r, fp) \ R(r).vec = NULL; \ Range_Copy(&R(r), Frame_Range_Parameter(fp)); #define fd_load_dom(r, fv) \ fdv_adr = Frame_Variable(fv); \ R(r).vec = NULL; \ Range_Copy(&R(r), Range(fdv_adr)); #define fd_range_union(r, r1) \ Range_Union(&R(r), &R(r1)); #define fd_range_inter(r, r1) \ Range_Inter(&R(r), &R(r1)); #define fd_range_compl(r) \ Range_Compl(&R(r)); #define fd_range_empty(r) \ R(r).vec = NULL; \ Set_To_Empty(&R(r)); #define fd_range_full(r) \ Range_Init_Interval(&R(r), 0, INTERVAL_MAX_INTEGER); #define fd_range_set_value(r, t) \ Range_Set_Value(&R(r), t); #define fd_range_reset_value(r, t) \ Range_Reset_Value(&R(r), t); #define fd_range_add_range(r, r1) \ Range_Add_Range(&R(r), &R(r1)); #define fd_range_sub_range(r, r1) \ Range_Sub_Range(&R(r), &R(r1)); #define fd_range_mul_range(r, r1) \ Range_Mul_Range(&R(r), &R(r1)); #define fd_range_div_range(r, r1) \ Range_Div_Range(&R(r), &R(r1)); #define fd_range_mod_range(r, r1) \ Range_Mod_Range(&R(r), &R(r1)); #define fd_range_add_value(r, t) \ Range_Add_Value(&R(r), t); #define fd_range_sub_value(r, t) \ Range_Add_Value(&R(r), -(t)); #define fd_range_mul_value(r, t) \ Range_Mul_Value(&R(r), t); #define fd_range_div_value(r, t) \ Range_Div_Value(&R(r), t); #define fd_range_mod_value(r, t) \ Range_Mod_Value(&R(r), t); #define fd_range_copy(r, r1) \ R(r).vec = NULL; \ Range_Copy(&R(r), &R(r1)); #define fd_range_fct(fct_name, r, args) \ { \ void fct_name(); \ R(r).vec = NULL; \ fct_name(&R(r), args); \ } /* term */ #define fd_load_int(var_name, fp) \ var_name = Frame_Term_Parameter(fp); #define fd_load_min(var_name, fv) \ fdv_adr = Frame_Variable(fv); \ var_name = Min(fdv_adr); #define fd_load_max(var_name, fv) \ fdv_adr = Frame_Variable(fv); \ var_name = Max(fdv_adr); #define fd_load_min_max(var_name_min, var_name_max, fv) \ fdv_adr = Frame_Variable(fv); \ var_name_min = Min(fdv_adr); \ var_name_max = Max(fdv_adr); #define fd_load_val(var_name, fv) \ fdv_adr = Frame_Variable(fv); \ if (Fd_Variable_Is_Ground(fdv_adr)) \ var_name = Min(fdv_adr); \ else \ goto lab_exit; #define fd_min_of_range(var_name, r) \ var_name = R(r).min; #define fd_max_of_range(var_name, r) \ var_name = R(r).max; #define fd_value_copy(t, t1) \ (t) = (t1); #define fd_load_l_int(var_name, fp) \ var_name = Frame_List_Parameter(fp); #define fd_load_l_fdv(var_name, fp) \ var_name = Frame_List_Parameter(fp); #define fd_load_l_any(var_name, fp) \ var_name = Frame_List_Parameter(fp); #define arg_1(a1) a1 #define arg_2(a1, a2) a1, a2 #define arg_3(a1, a2, a3) a1, a2, a3 #define arg_4(a1, a2, a3, a4) a1, a2, a3, a4 #define arg_5(a1, a2, a3, a4, a5) a1, a2, a3, a4, a5 #define arg_6(a1, a2, a3, a4, a5, a6) a1, a2, a3, a4, a5, a6 #define arg_7(a1, a2, a3, a4, a5, a6, a7) a1, a2, a3, a4, a5, a6, a7 #define arg_8(a1, a2, a3, a4, a5, a6, a7, a8) a1, a2, a3, a4, a5, a6, a7, a8 #define arg_9(a1, a2, a3, a4, a5, a6, a7, a8, a9) a1, a2, a3, a4, a5, a6, a7, a8, a9 #define range_arg(r) &R(r) /* by address */ /*---------------------------------* * Interface with C files * *---------------------------------*/ #define max_integer INTERVAL_MAX_INTEGER #define FdArg(arg) WamWord fd_##arg #define fd_begin_user_constraint(name_args) \ Bool \ name_args \ { \ WamWord *AF; \ long ret_val = TRUE; #define fd_end_user_constraint \ } #define fd_begin_internal(fct_name) \ static long \ fct_name(WamWord *AF) \ { \ long ret_val = TRUE; #define fd_end_internal \ } #define fd_exit_point \ lab_exit: #define fd_return \ return ret_val; #define fd_local_value_var(var_name) \ int var_name; #define fd_local_range_var(r) \ Range R(r); /* = {FALSE, 0, 0, NULL} init should be useless */ #define fd_local_l_int_var(var_name) \ WamWord *var_name; #define fd_local_l_fdv_var(var_name) \ WamWord *var_name; #define fd_local_l_any_var(var_name) \ WamWord *var_name; #define fd_local_cf_pointer \ WamWord *CF; #ifdef __GNUC__ #define fd_local_fdv_adr \ WamWord *fdv_adr __attribute__((unused)); #else #define fd_local_fdv_adr \ WamWord *fdv_adr; #endif #define fd_init_local_value_var(var_name, term) \ var_name = (term); #define fd_forall(fv, l_fv) \ { \ int n = *l_fv++; \ while (n--) \ { \ AF[fv] = *l_fv++; #define fd_forall_end \ } \ } ./gprolog-1.3.0/src/EngineFD/engine_fd.h0000644004425400513100000000352510547154141016275 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver * * File : engine_fd.h * * Descr.: general header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: engine_fd.h,v 1.9 2007/01/04 10:35:13 diaz Exp $ */ #include "fd_range.h" #include "fd_inst.h" ./gprolog-1.3.0/src/EngineFD/fd_range.h0000644004425400513100000001666010547154141016130 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver * * File : fd_range.h * * Descr.: FD Range Implementation - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_range.h,v 1.10 2007/01/04 10:35:13 diaz Exp $ */ #include "bool.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef unsigned long VecWord; typedef VecWord *Vector; typedef struct /* Ranges are always handled through pointers */ { Bool extra_cstr; int min; int max; Vector vec; } Range; /*---------------------------------* * Global Variables * *---------------------------------*/ #include "fd_hook_range.h" /* Default definitions (if not defined in fd_hook_range.h) */ #ifndef WORD_SIZE # define WORD_SIZE 32 #endif #if WORD_SIZE == 32 # define WORD_SIZE_BITS 5 #else # define WORD_SIZE_BITS 6 #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ int Least_Significant_Bit(VecWord x); int Most_Significant_Bit(VecWord x); void Define_Vector_Size(int max_val); void Vector_From_Interval(Vector vec, int min, int max); int Vector_Nb_Elem(Vector vec); int Vector_Ith_Elem(Vector vec, int n); int Vector_Next_After(Vector vec, int n); int Vector_Next_Before(Vector vec, int n); void Vector_Empty(Vector vec); void Vector_Full(Vector vec); Bool Vector_Test_Null_Inter(Vector vec, Vector vec1); void Vector_Copy(Vector vec, Vector vec1); void Vector_Union(Vector vec, Vector vec1); void Vector_Inter(Vector vec, Vector vec1); void Vector_Compl(Vector vec); void Vector_Add_Vector(Vector vec, Vector vec1); void Vector_Sub_Vector(Vector vec, Vector vec1); void Vector_Mul_Vector(Vector vec, Vector vec1); void Vector_Div_Vector(Vector vec, Vector vec1); void Vector_Mod_Vector(Vector vec, Vector vec1); void Vector_Add_Value(Vector vec, int n); void Vector_Mul_Value(Vector vec, int n); void Vector_Div_Value(Vector vec, int n); void Vector_Mod_Value(Vector vec, int n); Bool Range_Test_Value(Range *range, int n); Bool Range_Test_Null_Inter(Range *range, Range *range1); void Range_Copy(Range *range, Range *range1); int Range_Nb_Elem(Range *range); int Range_Ith_Elem(Range *range, int n); int Range_Next_After(Range *range, int n); int Range_Next_Before(Range *range, int n); void Range_Set_Value(Range *range, int n); void Range_Reset_Value(Range *range, int n); void Range_Becomes_Sparse(Range *range); void Range_From_Vector(Range *range); void Range_Union(Range *range, Range *range1); void Range_Inter(Range *range, Range *range1); void Range_Compl(Range *range); void Range_Add_Range(Range *range, Range *range1); void Range_Sub_Range(Range *range, Range *range1); void Range_Mul_Range(Range *range, Range *range1); void Range_Div_Range(Range *range, Range *range1); void Range_Mod_Range(Range *range, Range *range1); void Range_Add_Value(Range *range, int n); void Range_Mul_Value(Range *range, int n); void Range_Div_Value(Range *range, int n); void Range_Mod_Value(Range *range, int n); char *Range_To_String(Range *range); /*---------------------------------* * Vector Management Macros * *---------------------------------*/ #define Word_No_And_Bit_No(w, b) (((VecWord) (w) << WORD_SIZE_BITS)|\ (VecWord) (b)) #define Word_No(n) ((VecWord) (n) >> WORD_SIZE_BITS) #define Bit_No(n) ((n) & (((VecWord) 1 << WORD_SIZE_BITS)-1)) #define Vector_Test_Value(vec, n) ((vec[Word_No(n)] & ((VecWord) 1 << Bit_No(n))) != 0) #define Vector_Set_Value(vec, n) (vec[Word_No(n)] |= ((VecWord) 1 << Bit_No(n))) #define Vector_Reset_Value(vec, n) (vec[Word_No(n)] &= ~((VecWord) 1 << Bit_No(n))) #define Vector_Allocate_If_Necessary(vec) \ do \ { \ if (vec == NULL) \ Vector_Allocate(vec); \ } \ while (0) #define Vector_Allocate(vec) \ do \ { \ vec = (Vector) RANGE_TOP_STACK; \ RANGE_TOP_STACK += vec_size; \ } \ while (0) /* To enumerate a vector use VECTOR_BEGIN_ENUM / VECTOR_END_ENUM * * macros as follows: * * ... * * VECTOR_BEGIN_ENUM(the_vector,vec_elem) * * your code (vec_elem contains the current range element) * * VECTOR_END_ENUM */ #define VECTOR_BEGIN_ENUM(vec, vec_elem) \ { \ Vector enum_end = vec + vec_size, enum_i = vec; \ int enum_j; \ VecWord enum_word; \ \ vec_elem = 0; \ do \ { \ enum_word = *enum_i; \ for (enum_j = 0; enum_j++ < WORD_SIZE; enum_word >>= 1, vec_elem++) \ { \ if (enum_word & 1) \ { #define VECTOR_END_ENUM \ } \ } \ } \ while (++enum_i < enum_end); \ } /*---------------------------------* * Range Management Macros * *---------------------------------*/ #define Is_Interval(range) ((range)->vec == NULL) #define Is_Sparse(range) ((range)->vec != NULL) #define Is_Empty(range) ((range)->min > (range)->max) #define Is_Not_Empty(range) ((range)->max >= (range)->min) #define Set_To_Empty(range) (range)->max = (int)(1 << (sizeof(int) * 8 - 1)) #define Range_Init_Interval(range, r_min, r_max) \ do \ { \ (range)->extra_cstr = FALSE; \ (range)->min = (r_min); \ (range)->max = (r_max); \ (range)->vec = NULL; \ } \ while (0) ./gprolog-1.3.0/src/EngineFD/Makefile.in0000644004425400513100000000136710547152474016264 0ustar diazlocoLIB_ENGINE_FD = @LIB_ENGINE_FD@ GPLC = @GPLC@ CC = @CC@ @CFLAGS_MACHINE@ CFLAGS = @CFLAGS@ AR_RC = @AR_RC@ RANLIB = @RANLIB@ LIBNAME = $(LIB_ENGINE_FD) OBJLIB = fd_inst@OBJ_SUFFIX@ fd_range@OBJ_SUFFIX@ fd_unify@OBJ_SUFFIX@ .SUFFIXES: .SUFFIXES: @OBJ_SUFFIX@ .c .fd $(SUFFIXES) $(LIBNAME): $(OBJLIB) rm -f $(LIBNAME) $(AR_RC)@AR_SEP@$(LIBNAME) $(OBJLIB) $(RANLIB) $(LIBNAME) .fd@OBJ_SUFFIX@: $(GPLC) -c -C '$(CFLAGS)' $*.fd .c@OBJ_SUFFIX@: $(GPLC) -c -C '$(CFLAGS)' $*.c fd_inst@OBJ_SUFFIX@: fd_inst.h fd_inst.c fd_range.h fd_hook_range.h fd_range@OBJ_SUFFIX@: fd_range.h fd_hook_range.h fd_range.c fd_unify@OBJ_SUFFIX@: fd_unify.fd clean: rm -f *@OBJ_SUFFIX@ $(LIBNAME) distclean: clean ./gprolog-1.3.0/src/EngineFD/fd_inst.h0000644004425400513100000002011110547154141015773 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver * * File : fd_inst.h * * Descr.: FD instruction implementation - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_inst.h,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /* FD Variable Frame */ #define FD_VARIABLE_FRAME_SIZE (OFFSET_RANGE+RANGE_SIZE+CHAINS_SIZE) #define FD_INT_VARIABLE_FRAME_SIZE (OFFSET_RANGE+RANGE_SIZE) #define OFFSET_RANGE 5 #define RANGE_SIZE (2+(sizeof(Range)/sizeof(WamWord))) #define OFFSET_CHAINS (OFFSET_RANGE+RANGE_SIZE) #define CHAINS_SIZE 8 #define FD_Tag_Value(fdv_adr) (((WamWord *) fdv_adr)[0]) #define FD_INT_Date(fdv_adr) (((WamWord *) fdv_adr)[1]) #define Queue_Date_At_Push(fdv_adr)(((WamWord *) fdv_adr)[2]) #define Queue_Propag_Mask(fdv_adr) (((WamWord *) fdv_adr)[3]) #define Queue_Next_Fdv_Adr(fdv_adr)(((WamWord *) fdv_adr)[4]) #define Range_Stamp(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_RANGE]) #define Nb_Elem(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_RANGE+1]) #define Range(fdv_adr) ((Range *) ((WamWord *) fdv_adr+OFFSET_RANGE+2)) #define Chains_Stamp(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS]) #define Nb_Cstr(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+1]) #define Chains_Mask(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+2]) #define Chain_Min(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+3]) #define Chain_Max(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+4]) #define Chain_Min_Max(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+5]) #define Chain_Dom(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+6]) #define Chain_Val(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+7]) /* Shorthands for Range(fdv_adr)'s fields */ #define Extra_Cstr(fdv_adr) (Range(fdv_adr)->extra_cstr) #define Min(fdv_adr) (Range(fdv_adr)->min) #define Max(fdv_adr) (Range(fdv_adr)->max) #define Vec(fdv_adr) (Range(fdv_adr)->vec) /* Chain / Propagation Mask */ #define CHAIN_NB_MIN 0 #define CHAIN_NB_MAX 1 #define CHAIN_NB_MIN_MAX 2 #define CHAIN_NB_DOM 3 #define CHAIN_NB_VAL 4 #define MASK_EMPTY 0 #define MASK_MIN 1 #define MASK_MAX 2 #define MASK_MIN_MAX 4 #define MASK_DOM 8 #define MASK_VAL 16 #define Has_Min_Mask(mask) ((mask) & MASK_MIN) #define Has_Max_Mask(mask) ((mask) & MASK_MAX) #define Has_Min_Max_Mask(mask) ((mask) & MASK_MIN_MAX) #define Has_Dom_Mask(mask) ((mask) & MASK_DOM) #define Has_Val_Mask(mask) ((mask) & MASK_VAL) #define Set_Min_Mask(mask) ((mask) |= MASK_MIN) #define Set_Max_Mask(mask) ((mask) |= MASK_MAX) #define Set_Min_Max_Mask(mask) ((mask) |= MASK_MIN_MAX) #define Set_Dom_Mask(mask) ((mask) |= MASK_DOM) #define Set_Val_Mask(mask) ((mask) |= MASK_VAL) /* Chain Record Frame */ #define CHAIN_RECORD_FRAME_SIZE 2 #define CF_Pointer(rec_adr) (*(WamWord **) &(rec_adr[0])) #define Next_Chain(rec_adr) (*(WamWord **) &(rec_adr[1])) /* Constraint Frame */ #define CONSTRAINT_FRAME_SIZE 3 #define OFFSET_OF_OPTIM_POINTER 1 /* this offset must corresponds to */ #define AF_Pointer(cf) (*(WamWord **) &(cf[0])) #define Optim_Pointer(cf) (*(WamWord **) &(cf[1])) /* this cell */ #define Cstr_Address(cf) (*(long (**)()) &(cf[2])) /* Miscellaneous */ #define ENV_VAR_VECTOR_MAX "VECTORMAX" #define DEFAULT_VECTOR_MAX 127 #define Fd_Variable_Is_Ground(fdv_adr) (Tag_Of(FD_Tag_Value(fdv_adr))==INT) #define math_min(x, y) ((x) <= (y) ? (x) : (y)) #define math_max(x, y) ((x) >= (y) ? (x) : (y)) /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef FD_INST_FILE WamWord DATE; WamWord *TP; WamWord vec_size; WamWord vec_max_integer; #else extern WamWord DATE; extern WamWord *TP; extern WamWord vec_size; extern WamWord vec_max_integer; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ WamWord *Fd_Prolog_To_Fd_Var(WamWord arg_word, Bool pl_var_ok); Range *Fd_Prolog_To_Range(WamWord list_word); int Fd_Prolog_To_Value(WamWord arg_word); WamWord *Fd_Prolog_To_Array_Int(WamWord list_word); WamWord *Fd_Prolog_To_Array_Any(WamWord list_word); WamWord *Fd_Prolog_To_Array_Fdv(WamWord list_word, Bool pl_var_ok); void Fd_List_Int_To_Range(Range *range, WamWord list_word); WamWord *Fd_New_Variable(void); WamWord *Fd_New_Bool_Variable(void); WamWord *Fd_New_Int_Variable(int n); WamWord *Fd_Create_C_Frame(long (*cstr_fct) (), WamWord *AF, WamWord *fdv_adr, Bool optim2); void Fd_Add_Dependency(WamWord *fdv_adr, int chain_nb, WamWord *CF); void Fd_Add_List_Dependency(WamWord *array, int chain_nb, WamWord *CF); void Fd_Before_Add_Cstr(void); Bool Fd_After_Add_Cstr(void); void Fd_Stop_Constraint(WamWord *CF); Bool Fd_Tell_Value(WamWord *fdv_adr, int n); Bool Fd_Tell_Not_Value(WamWord *fdv_adr, int n); Bool Fd_Tell_Int_Range(WamWord *fdv_adr, Range *range); Bool Fd_Tell_Interv_Interv(WamWord *fdv_adr, int min, int max); Bool Fd_Tell_Range_Range(WamWord *fdv_adr, Range *range); void Fd_Display_Extra_Cstr(WamWord *fdv_adr); void Fd_Init_Solver0(void); void Fd_Reset_Solver0(void); Bool Fd_Assign_Value(WamWord *fdv_adr, int n); Bool Fd_Unify_With_Integer0(WamWord *fdv_adr, int n); Bool Fd_Unify_With_Fd_Var0(WamWord *fdv_adr1, WamWord *fdv_adr2); Bool Fd_Use_Vector(WamWord *fdv_adr); Bool Fd_Check_For_Bool_Var(WamWord x_word); int Fd_Variable_Size0(WamWord *fdv_adr); int Fd_Copy_Variable0(WamWord *dst_adr, WamWord *fdv_adr); char *Fd_Variable_To_String0(WamWord *fdv_adr); #define Fd_Deref_Check_Fd_Var(fdv_word, word, tag_mask) \ DEREF(fdv_word, word, tag_mask); \ if (tag_mask == TAG_REF_MASK) \ Pl_Err_Instantiation(); \ \ if (tag_mask != TAG_INT_MASK && tag_mask != TAG_FDV_MASK) \ Pl_Err_Type(type_fd_variable, word) ./gprolog-1.3.0/src/EngineFD/fd_unify.fd0000644004425400513100000000152110547152474016325 0ustar diazloco/*-------------------------------------------------------------------------*/ /* C Run-Time (FD Solver) Daniel Diaz - 1998 */ /* FD instruction implementation (unification) - FD part */ /* */ /* fd_unify.fd Copyright (C) 1998, INRIA France */ /*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/ /* UNIFICATION */ /* */ /*-------------------------------------------------------------------------*/ unify_x_y(fdv X,fdv Y) { start X in dom(Y) start Y in dom(X) } ./gprolog-1.3.0/src/EngineFD/fd_range.c0000644004425400513100000012770710547154141016130 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver * * File : fd_range.c * * Descr.: FD Range Implementation * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_range.c,v 1.14 2007/01/04 10:35:13 diaz Exp $ */ #include #include #include "bool.h" #define FD_RANGE_FILE #include "engine_pl.h" #include "engine_fd.h" /*-------------------------------------------------------------------------* * The file fd_hook_range.h must contains the definition of: * * * * INTERVAL_MAX_INTEGER: an integer constant corresponding to the greatest * * value for intervals (i.e. 0..INTERVAL_MAX_INTEGER)* * * * vec_max_integer : an integer variable corresponding to the greatest * * value for vectors (i.e. 0..vec_max_integer). * * vec_size : an integer variable corresponding to the size of a* * vector in words (i.e. vec_max_integer/WORD_SIZE) * * (see Define_Vector_Size() function). * * * * RANGE_TOP_STACK : a long * variable corresponding to the top of the * * stack where are allocated the bit-vectors. * * The user must handle the (re)initialization of * * this pointer to a valid (read/write) memory area. * * Allocated vectors are never recovered, so the user* * should take care of reinitializations (GC) of the * * top of stack if needed. * * * * The following macros can be redefined: * * * * WORD_SIZE : a constant defining sizeof(long) in bits (32/64). * *-------------------------------------------------------------------------*/ /*---------------------------------* * Constants * *---------------------------------*/ #define ALL_1 ((VecWord) -1) #define WRITE_BEGIN_RANGE "" #define WRITE_END_RANGE "" #define WRITE_LIMITS_SEPARATOR ".." #define WRITE_INTERVALS_SEPARATOR ":" #define WRITE_EXTRA_CSTR_SYMBOL "@" /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*---------------------------------* * Auxiliary macros * *---------------------------------*/ #define math_min(x, y) ((x) <= (y) ? (x) : (y)) #define math_max(x, y) ((x) >= (y) ? (x) : (y)) /*-------------------------------------------------------------------------* * LEAST_SIGNIFICANT_BIT * * * *-------------------------------------------------------------------------*/ int Least_Significant_Bit(VecWord x) { int bit = 0; #if WORD_SIZE == 64 if (x << 32 == 0) bit += 32, x >>= 32; #endif if (x << (WORD_SIZE - 32 + 16) == 0) bit += 16, x >>= 16; if (x << (WORD_SIZE - 32 + 16 + 8) == 0) bit += 8, x >>= 8; if (x << (WORD_SIZE - 32 + 16 + 8 + 4) == 0) bit += 4, x >>= 4; if (x << (WORD_SIZE - 32 + 16 + 8 + 4 + 2) == 0) bit += 2, x >>= 2; if (x << (WORD_SIZE - 32 + 16 + 8 + 4 + 2 + 1) == 0) bit += 1; return bit; } /*-------------------------------------------------------------------------* * MOST_SIGNIFICANT_BIT * * * *-------------------------------------------------------------------------*/ int Most_Significant_Bit(VecWord x) { int bit = WORD_SIZE - 1; #if WORD_SIZE == 64 if (x >> 32 == 0) bit -= 32, x <<= 32; #endif if (x >> (WORD_SIZE - 32 + 16) == 0) bit -= 16, x <<= 16; if (x >> (WORD_SIZE - 32 + 16 + 8) == 0) bit -= 8, x <<= 8; if (x >> (WORD_SIZE - 32 + 16 + 8 + 4) == 0) bit -= 4, x <<= 4; if (x >> (WORD_SIZE - 32 + 16 + 8 + 4 + 2) == 0) bit -= 2, x <<= 2; if (x >> (WORD_SIZE - 32 + 16 + 8 + 4 + 2 + 1) == 0) bit -= 1; return bit; } /*-------------------------------------------------------------------------* * DEFINE_VECTOR_SIZE * * * *-------------------------------------------------------------------------*/ void Define_Vector_Size(int max_val) { vec_size = max_val / WORD_SIZE + 1; vec_max_integer = vec_size * WORD_SIZE - 1; } /*-------------------------------------------------------------------------* * VECTOR_FROM_INTERVAL * * * *-------------------------------------------------------------------------*/ void Vector_From_Interval(Vector vec, int min, int max) { Vector w_min = vec + Word_No(min); Vector w_max = vec + Word_No(max); Vector end = vec + vec_size; for (;;) if (vec == w_min) break; else *vec++ = 0; for (;;) if (vec > w_max) break; else *vec++ = ALL_1; for (;;) if (vec == end) break; else *vec++ = 0; *w_min &= ALL_1 << Bit_No(min); *w_max &= ALL_1 >> (WORD_SIZE - 1 - Bit_No(max)); } /*-------------------------------------------------------------------------* * VECTOR_NB_ELEM * * * *-------------------------------------------------------------------------*/ int Vector_Nb_Elem(Vector vec) { static int nb_bits_in_byte[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 }; register Vector end = vec + vec_size; register VecWord vec_word; register int nb_elem = 0; do { vec_word = *vec; nb_elem += nb_bits_in_byte[vec_word & 0xFF]; nb_elem += nb_bits_in_byte[(vec_word >> 8) & 0xFF]; nb_elem += nb_bits_in_byte[(vec_word >> 16) & 0xFF]; nb_elem += nb_bits_in_byte[(vec_word >> 24) & 0xFF]; #if WORD_SIZE == 64 nb_elem += nb_bits_in_byte[(vec_word >> 32) & 0xFF]; nb_elem += nb_bits_in_byte[(vec_word >> 40) & 0xFF]; nb_elem += nb_bits_in_byte[(vec_word >> 48) & 0xFF]; nb_elem += nb_bits_in_byte[(vec_word >> 56) & 0xFF]; #endif vec++; } while (vec < end); return nb_elem; } /*-------------------------------------------------------------------------* * VECTOR_ITH_ELEM * * * *-------------------------------------------------------------------------*/ int Vector_Ith_Elem(Vector vec, int i) { int vec_elem; if (i > 0) /* 1 <= i <= nb_elem */ { VECTOR_BEGIN_ENUM(vec, vec_elem); if (--i == 0) return vec_elem; VECTOR_END_ENUM; } return -1; } /*-------------------------------------------------------------------------* * VECTOR_NEXT_AFTER * * * *-------------------------------------------------------------------------*/ int Vector_Next_After(Vector vec, int n) { int word_no; int bit_no; Vector start; Vector end; VecWord word; int bit; if (n >= 0) /* n >= 0 find next */ { if (n > vec_max_integer) return -1; word_no = Word_No(n); bit_no = Bit_No(n) + 1; start = vec + word_no; word = (bit_no == WORD_SIZE) ? 0 : *start & ~((1 << bit_no) - 1); } else /* n < 0 find first */ { start = vec; word = *start; } end = vec + vec_size; while (word == 0) { if (++start >= end) return -1; word = *start; } bit = Least_Significant_Bit(word); n = Word_No_And_Bit_No(start - vec, bit); return n; } /*-------------------------------------------------------------------------* * VECTOR_NEXT_BEFORE * * * *-------------------------------------------------------------------------*/ int Vector_Next_Before(Vector vec, int n) { int word_no; int bit_no; Vector start; Vector end; VecWord word; int bit; if (n <= vec_max_integer) /* n <= vec_max_integer find previous */ { if (n < 0) return -1; word_no = Word_No(n); bit_no = Bit_No(n); end = vec + word_no; word = *end & ((1 << bit_no) - 1); } else /* n > vec_max_integer find last */ { end = vec + vec_size - 1; word = *end; } start = vec; while (word == 0) { if (--end < start) return -1; word = *end; } bit = Most_Significant_Bit(word); n = Word_No_And_Bit_No(end - vec, bit); return n; } /*-------------------------------------------------------------------------* * VECTOR_EMPTY * * * *-------------------------------------------------------------------------*/ void Vector_Empty(Vector vec) { Vector end = vec + vec_size; do *vec++ = 0; while (vec < end); } /*-------------------------------------------------------------------------* * VECTOR_FULL * * * *-------------------------------------------------------------------------*/ void Vector_Full(Vector vec) { Vector end = vec + vec_size; do *vec++ = ALL_1; while (vec < end); } /*-------------------------------------------------------------------------* * VECTOR_TEST_NULL_INTER * * * *-------------------------------------------------------------------------*/ Bool Vector_Test_Null_Inter(Vector vec, Vector vec1) { Vector end = vec + vec_size; do if (*vec++ & *vec1++) return FALSE; while (vec < end); return TRUE; } /*-------------------------------------------------------------------------* * VECTOR_COPY * * * *-------------------------------------------------------------------------*/ void Vector_Copy(Vector vec, Vector vec1) { Vector end = vec + vec_size; do *vec++ = *vec1++; while (vec < end); } /*-------------------------------------------------------------------------* * VECTOR_UNION * * * *-------------------------------------------------------------------------*/ void Vector_Union(Vector vec, Vector vec1) { Vector end = vec + vec_size; do *vec++ |= *vec1++; while (vec < end); } /*-------------------------------------------------------------------------* * VECTOR_INTER * * * *-------------------------------------------------------------------------*/ void Vector_Inter(Vector vec, Vector vec1) { Vector end = vec + vec_size; do *vec++ &= *vec1++; while (vec < end); } /*-------------------------------------------------------------------------* * VECTOR_COMPL * * * *-------------------------------------------------------------------------*/ void Vector_Compl(Vector vec) { Vector end = vec + vec_size; do *vec = ~(*vec), vec++; while (vec < end); } /*-------------------------------------------------------------------------* * VECTOR_ADD_VECTOR * * * *-------------------------------------------------------------------------*/ void Vector_Add_Vector(Vector vec, Vector vec1) { Vector aux_vec; int vec_elem, vec_elem1; int x; Vector_Allocate(aux_vec); Vector_Copy(aux_vec, vec); Vector_Empty(vec); VECTOR_BEGIN_ENUM(aux_vec, vec_elem); VECTOR_BEGIN_ENUM(vec1, vec_elem1); x = vec_elem + vec_elem1; if (x > vec_max_integer) goto loop1; Vector_Set_Value(vec, x); VECTOR_END_ENUM; loop1:; VECTOR_END_ENUM; } /*-------------------------------------------------------------------------* * VECTOR_SUB_VECTOR * * * *-------------------------------------------------------------------------*/ void Vector_Sub_Vector(Vector vec, Vector vec1) { Vector aux_vec; int vec_elem, vec_elem1; int x; Vector_Allocate(aux_vec); Vector_Copy(aux_vec, vec); Vector_Empty(vec); VECTOR_BEGIN_ENUM(aux_vec, vec_elem); VECTOR_BEGIN_ENUM(vec1, vec_elem1); x = vec_elem - vec_elem1; if (x < 0) goto loop1; Vector_Set_Value(vec, x); VECTOR_END_ENUM; loop1:; VECTOR_END_ENUM; } /*-------------------------------------------------------------------------* * VECTOR_MUL_VECTOR * * * *-------------------------------------------------------------------------*/ void Vector_Mul_Vector(Vector vec, Vector vec1) { Vector aux_vec; int vec_elem, vec_elem1; int x; Vector_Allocate(aux_vec); Vector_Copy(aux_vec, vec); Vector_Empty(vec); VECTOR_BEGIN_ENUM(aux_vec, vec_elem); VECTOR_BEGIN_ENUM(vec1, vec_elem1); x = vec_elem * vec_elem1; if (x > vec_max_integer) goto loop1; Vector_Set_Value(vec, x); VECTOR_END_ENUM; loop1:; VECTOR_END_ENUM; } /*-------------------------------------------------------------------------* * VECTOR_DIV_VECTOR * * * *-------------------------------------------------------------------------*/ void Vector_Div_Vector(Vector vec, Vector vec1) { Vector aux_vec; int vec_elem, vec_elem1; int x; Vector_Allocate(aux_vec); Vector_Copy(aux_vec, vec); Vector_Empty(vec); VECTOR_BEGIN_ENUM(aux_vec, vec_elem); if (vec_elem == 0) Vector_Set_Value(vec, 0); else { VECTOR_BEGIN_ENUM(vec1, vec_elem1); if (vec_elem1 != 0 && vec_elem % vec_elem1 == 0) { x = vec_elem / vec_elem1; Vector_Set_Value(vec, x); } VECTOR_END_ENUM; } VECTOR_END_ENUM; } /*-------------------------------------------------------------------------* * VECTOR_MOD_VECTOR * * * *-------------------------------------------------------------------------*/ void Vector_Mod_Vector(Vector vec, Vector vec1) { Vector aux_vec; int vec_elem, vec_elem1; int x; Vector_Allocate(aux_vec); Vector_Copy(aux_vec, vec); Vector_Empty(vec); VECTOR_BEGIN_ENUM(aux_vec, vec_elem); VECTOR_BEGIN_ENUM(vec1, vec_elem1); if (vec_elem1 != 0) { x = vec_elem % vec_elem1; Vector_Set_Value(vec, x); } VECTOR_END_ENUM; VECTOR_END_ENUM; } /*-------------------------------------------------------------------------* * VECTOR_ADD_VALUE * * * *-------------------------------------------------------------------------*/ void Vector_Add_Value(Vector vec, int n) { int word_no; int bit_no; VecWord rem, rem1; int i, j; if (n >= 0) { word_no = Word_No(n); bit_no = Bit_No(n); if (word_no) { i = vec_size - 1; j = vec_size - 1 - word_no; while (j >= 0) vec[i--] = vec[j--]; while (i >= 0) vec[i--] = 0; } if (bit_no) { rem = 0; for (i = word_no; i < vec_size; i++) { rem1 = vec[i] >> (WORD_SIZE - bit_no); vec[i] = (vec[i] << bit_no) | rem; rem = rem1; } } } else { word_no = Word_No(-n); bit_no = Bit_No(-n); if (word_no) { i = 0; j = word_no; while (j < vec_size) vec[i++] = vec[j++]; while (i < vec_size) vec[i++] = 0; } if (bit_no) { rem = 0; for (i = vec_size - 1 - word_no; i >= 0; i--) { rem1 = vec[i] << (WORD_SIZE - bit_no); vec[i] = (vec[i] >> bit_no) | rem; rem = rem1; } } } } /*-------------------------------------------------------------------------* * VECTOR_MUL_VALUE * * * *-------------------------------------------------------------------------*/ void Vector_Mul_Value(Vector vec, int n) { Vector aux_vec; int vec_elem; int x; Vector_Allocate(aux_vec); Vector_Copy(aux_vec, vec); Vector_Empty(vec); VECTOR_BEGIN_ENUM(aux_vec, vec_elem); x = vec_elem * n; if ((unsigned) x > (unsigned) vec_max_integer) return; Vector_Set_Value(vec, x); VECTOR_END_ENUM; } /*-------------------------------------------------------------------------* * VECTOR_DIV_VALUE * * * *-------------------------------------------------------------------------*/ void Vector_Div_Value(Vector vec, int n) { Vector aux_vec; int vec_elem; int x; Vector_Allocate(aux_vec); Vector_Copy(aux_vec, vec); Vector_Empty(vec); if (n == 0) return; VECTOR_BEGIN_ENUM(aux_vec, vec_elem); if (vec_elem % n == 0) { x = vec_elem / n; Vector_Set_Value(vec, x); } VECTOR_END_ENUM; } /*-------------------------------------------------------------------------* * VECTOR_MOD_VALUE * * * *-------------------------------------------------------------------------*/ void Vector_Mod_Value(Vector vec, int n) { Vector aux_vec; int vec_elem; int x; Vector_Allocate(aux_vec); Vector_Copy(aux_vec, vec); Vector_Empty(vec); if (n == 0) return; VECTOR_BEGIN_ENUM(aux_vec, vec_elem); x = vec_elem % n; if ((unsigned) x <= (unsigned) vec_max_integer) Vector_Set_Value(vec, x); VECTOR_END_ENUM; } /*-------------------------------------------------------------------------* * RANGE_TEST_VALUE * * * *-------------------------------------------------------------------------*/ Bool Range_Test_Value(Range *range, int n) { int min = range->min; int max = range->max; if (n < min || n > max) return FALSE; if (Is_Interval(range) || n == min || n == max) return TRUE; return Vector_Test_Value(range->vec, n); } /*-------------------------------------------------------------------------* * RANGE_TEST_NULL_INTER * * * *-------------------------------------------------------------------------*/ Bool Range_Test_Null_Inter(Range *range, Range *range1) { int swt, i; if (range->min > range1->max || range1->min > range->max) return TRUE; if (range->min == range1->min || range->min == range1->max || range->max == range1->min || range->max == range1->max) return FALSE; swt = (Is_Sparse(range) << 1) + Is_Sparse(range1); if (swt == 3) /* Sparse with Sparse */ return Vector_Test_Null_Inter(range1->vec, range->vec); if ((range->min >= range1->min && range->max >= range1->max) || (range1->min >= range->min && range1->max >= range->max)) return FALSE; if (swt == 0) /* Interval with Interval */ return FALSE; if (swt == 2) /* Sparse with Interval */ return Range_Test_Null_Inter(range1, range); /* Interval with Sparse */ if (range->min <= range1->min) return FALSE; for (i = range->min; i <= range->max; i++) if (Vector_Test_Value(range1->vec, i)) return FALSE; return TRUE; } /*-------------------------------------------------------------------------* * RANGE_COPY * * * *-------------------------------------------------------------------------*/ void Range_Copy(Range *range, Range *range1) { range->extra_cstr = range1->extra_cstr; range->min = range1->min; range->max = range1->max; if (Is_Interval(range1)) range->vec = NULL; else { Vector_Allocate_If_Necessary(range->vec); Vector_Copy(range->vec, range1->vec); } } /*-------------------------------------------------------------------------* * RANGE_NB_ELEM * * * *-------------------------------------------------------------------------*/ int Range_Nb_Elem(Range *range) { if (Is_Interval(range)) /* here range is not empty */ return range->max - range->min + 1; return Vector_Nb_Elem(range->vec); } /*-------------------------------------------------------------------------* * RANGE_ITH_ELEM * * * *-------------------------------------------------------------------------*/ int Range_Ith_Elem(Range *range, int i) { int n; if (Is_Empty(range)) return -1; if (Is_Interval(range)) /* here range is not empty */ { /* 1 <= i <= nb_elem */ n = range->min + i - 1; return n < range->min || n > range->max ? -1 : n; } return Vector_Ith_Elem(range->vec, i); } /*-------------------------------------------------------------------------* * RANGE_NEXT_AFTER * * * *-------------------------------------------------------------------------*/ int Range_Next_After(Range *range, int n) { if (Is_Empty(range)) return -1; if (Is_Interval(range)) /* here range is not empty */ { /* 1 <= i <= nb_elem */ if (n >= range->max) return -1; n++; if (n < range->min) n = range->min; return n; } return Vector_Next_After(range->vec, n); } /*-------------------------------------------------------------------------* * RANGE_NEXT_BEFORE * * * *-------------------------------------------------------------------------*/ int Range_Next_Before(Range *range, int n) { if (Is_Empty(range)) return -1; if (Is_Interval(range)) /* here range is not empty */ { /* 1 <= i <= nb_elem */ if (n <= range->min) return -1; n--; if (n > range->max) n = range->max; return n; } return Vector_Next_Before(range->vec, n); } /*-------------------------------------------------------------------------* * RANGE_BECOMES_SPARSE * * * *-------------------------------------------------------------------------*/ void Range_Becomes_Sparse(Range *range) { Vector_Allocate_If_Necessary(range->vec); if (range->min < 0) range->min = 0; if ((range->extra_cstr = (range->max > vec_max_integer))) range->max = vec_max_integer; if (Is_Not_Empty(range)) Vector_From_Interval(range->vec, range->min, range->max); } /*-------------------------------------------------------------------------* * RANGE_FROM_VECTOR * * * *-------------------------------------------------------------------------*/ void Range_From_Vector(Range *range) { Vector start; Vector end; int bit; start = range->vec - 1; end = range->vec + vec_size; for (;;) if (*++start) break; else if (start >= end) { Set_To_Empty(range); return; } for (;;) if (*--end) break; bit = Least_Significant_Bit(*start); range->min = Word_No_And_Bit_No(start - range->vec, bit); bit = Most_Significant_Bit(*end); range->max = Word_No_And_Bit_No(end - range->vec, bit); } /*-------------------------------------------------------------------------* * RANGE_SET_VALUE * * * *-------------------------------------------------------------------------*/ void Range_Set_Value(Range *range, int n) { if (Is_Empty(range)) { Range_Init_Interval(range, n, n); return; } if (Is_Interval(range)) { if (n >= range->min && n <= range->max) return; if (n == range->min - 1) { range->min--; return; } if (n == range->max + 1) { range->max++; return; } Range_Becomes_Sparse(range); if ((unsigned) n <= (unsigned) vec_max_integer) { Vector_Set_Value(range->vec, n); Range_From_Vector(range); } else range->extra_cstr = TRUE; return; } if ((unsigned) n > (unsigned) vec_max_integer) { range->extra_cstr = TRUE; return; } Vector_Set_Value(range->vec, n); if (n < range->min || n > range->max) Range_From_Vector(range); } /*-------------------------------------------------------------------------* * RANGE_RESET_VALUE * * * *-------------------------------------------------------------------------*/ void Range_Reset_Value(Range *range, int n) { if (Is_Empty(range) || n < range->min || n > range->max) return; if (range->min == range->max) { Set_To_Empty(range); return; } if (Is_Interval(range)) { if (n == range->min) { range->min++; return; } if (n == range->max) { range->max--; return; } Range_Becomes_Sparse(range); if ((unsigned) n <= (unsigned) vec_max_integer) Vector_Reset_Value(range->vec, n); return; } if ((unsigned) n > (unsigned) vec_max_integer) return; Vector_Reset_Value(range->vec, n); if (n == range->min || n == range->max) Range_From_Vector(range); } /*-------------------------------------------------------------------------* * RANGE_UNION * * * *-------------------------------------------------------------------------*/ void Range_Union(Range *range, Range *range1) { int swt = (Is_Sparse(range) << 1) + Is_Sparse(range1); Range r; Bool extra_cstr; if (swt == 0) /* Interval with Interval */ { if (Is_Not_Empty(range) && Is_Not_Empty(range1) && range1->min <= range->max + 1 && range->min <= range1->max + 1) { /* range->extra_cstr=FALSE; */ range->min = math_min(range->min, range1->min); range->max = math_max(range->max, range1->max); return; } Range_Becomes_Sparse(range); Range_Copy(&r, range1); /* we cannot modify range1 */ range1 = &r; Range_Becomes_Sparse(range1); } else if (swt == 1) /* Interval with Sparse */ Range_Becomes_Sparse(range); else if (swt == 2) /* Sparse with Interval */ { Range_Copy(&r, range1); /* we cannot modify range1 */ range1 = &r; Range_Becomes_Sparse(range1); } /* Sparse with Sparse */ extra_cstr = range->extra_cstr | range1->extra_cstr; if (Is_Empty(range)) { Range_Copy(range, range1); range->extra_cstr = extra_cstr; return; } range->extra_cstr = extra_cstr; if (Is_Empty(range1)) return; range->min = math_min(range->min, range1->min); range->max = math_max(range->max, range1->max); Vector_Union(range->vec, range1->vec); } /*-------------------------------------------------------------------------* * RANGE_INTER * * * *-------------------------------------------------------------------------*/ void Range_Inter(Range *range, Range *range1) { int swt = (Is_Sparse(range) << 1) + Is_Sparse(range1); Range r; if (swt == 0) /* Interval with Interval */ { /* range->extra_cstr=FALSE; */ range->min = math_max(range->min, range1->min); range->max = math_min(range->max, range1->max); return; } if (swt == 1) /* Interval with Sparse */ Range_Becomes_Sparse(range); else if (swt == 2) /* Sparse with Interval */ { Range_Copy(&r, range1); /* we cannot modify range1 */ range1 = &r; Range_Becomes_Sparse(range1); } /* Sparse with Sparse */ range->extra_cstr &= range1->extra_cstr; if (Is_Empty(range)) return; if (Is_Empty(range1)) { Set_To_Empty(range); return; } Vector_Inter(range->vec, range1->vec); Range_From_Vector(range); /* adjust min and max */ } /*-------------------------------------------------------------------------* * RANGE_COMPL * * * *-------------------------------------------------------------------------*/ void Range_Compl(Range *range) { if (Is_Interval(range)) /* Interval */ { if (Is_Empty(range)) { range->min = 0; range->max = INTERVAL_MAX_INTEGER; return; } if (range->min <= 0) { if (range->max >= INTERVAL_MAX_INTEGER) Set_To_Empty(range); else { range->min = range->max + 1; range->max = INTERVAL_MAX_INTEGER; } return; } if (range->max >= INTERVAL_MAX_INTEGER) { range->max = range->min - 1; range->min = 0; return; } Range_Becomes_Sparse(range); } /* Sparse */ range->extra_cstr = TRUE; if (Is_Empty(range)) { range->min = 0; range->max = vec_max_integer; Vector_Full(range->vec); } else { Vector_Compl(range->vec); Range_From_Vector(range); } } /*-------------------------------------------------------------------------* * RANGE_ADD_RANGE * * * *-------------------------------------------------------------------------*/ void Range_Add_Range(Range *range, Range *range1) { int swt = (Is_Sparse(range) << 1) + Is_Sparse(range1); Range r; if (Is_Empty(range)) return; if (Is_Empty(range1)) { Set_To_Empty(range); return; } if (swt == 0) /* Interval with Interval */ { /* range->extra_cstr=FALSE; */ range->min += range1->min; range->max += range1->max; return; } else if (swt == 1) /* Interval with Sparse */ Range_Becomes_Sparse(range); else if (swt == 2) /* Sparse with Interval */ { Range_Copy(&r, range1); /* we cannot modify range1 */ range1 = &r; Range_Becomes_Sparse(range1); } /* Sparse with Sparse */ Vector_Add_Vector(range->vec, range1->vec); range->min += range1->min; range->max += range1->max; range->extra_cstr |= (range1->extra_cstr | (range->max > vec_max_integer)); if (range->extra_cstr || range->min < 0) Range_From_Vector(range); } /*-------------------------------------------------------------------------* * RANGE_SUB_RANGE * * * *-------------------------------------------------------------------------*/ void Range_Sub_Range(Range *range, Range *range1) { int swt = (Is_Sparse(range) << 1) + Is_Sparse(range1); Range r; if (Is_Empty(range)) return; if (Is_Empty(range1)) { Set_To_Empty(range); return; } if (swt == 0) /* Interval with Interval */ { /* range->extra_cstr=FALSE; */ range->min -= range1->max; range->max -= range1->min; return; } else if (swt == 1) /* Interval with Sparse */ Range_Becomes_Sparse(range); else if (swt == 2) /* Sparse with Interval */ { Range_Copy(&r, range1); /* we cannot modify range1 */ range1 = &r; Range_Becomes_Sparse(range1); } /* Sparse with Sparse */ Vector_Sub_Vector(range->vec, range1->vec); range->min -= range1->max; range->max -= range1->min; range->extra_cstr |= range1->extra_cstr; if (range->extra_cstr || range->min < 0) Range_From_Vector(range); } /*-------------------------------------------------------------------------* * RANGE_MUL_RANGE * * * *-------------------------------------------------------------------------*/ void Range_Mul_Range(Range *range, Range *range1) { Range r; if (Is_Empty(range)) return; if (Is_Empty(range1)) { Set_To_Empty(range); return; } if (Is_Interval(range)) Range_Becomes_Sparse(range); if (Is_Interval(range1)) { r.vec = NULL; Range_Copy(&r, range1); /* we cannot modify range1 */ range1 = &r; Range_Becomes_Sparse(range1); } /* Sparse with Sparse */ Vector_Mul_Vector(range->vec, range1->vec); range->extra_cstr |= range1->extra_cstr; Range_From_Vector(range); } /*-------------------------------------------------------------------------* * RANGE_DIV_RANGE * * * *-------------------------------------------------------------------------*/ void Range_Div_Range(Range *range, Range *range1) { Range r; if (Is_Empty(range)) return; if (Is_Empty(range1)) { Set_To_Empty(range); return; } if (Is_Interval(range)) Range_Becomes_Sparse(range); if (Is_Interval(range1)) { r.vec = NULL; Range_Copy(&r, range1); /* we cannot modify range1 */ range1 = &r; Range_Becomes_Sparse(range1); } /* Sparse with Sparse */ Vector_Div_Vector(range->vec, range1->vec); range->extra_cstr |= range1->extra_cstr; Range_From_Vector(range); } /*-------------------------------------------------------------------------* * RANGE_MOD_RANGE * * * *-------------------------------------------------------------------------*/ void Range_Mod_Range(Range *range, Range *range1) { Range r; if (Is_Empty(range)) return; if (Is_Empty(range1)) { Set_To_Empty(range); return; } if (Is_Interval(range)) Range_Becomes_Sparse(range); if (Is_Interval(range1)) { r.vec = NULL; Range_Copy(&r, range1); /* we cannot modify range1 */ range1 = &r; Range_Becomes_Sparse(range1); } /* Sparse with Sparse */ Vector_Mod_Vector(range->vec, range1->vec); range->extra_cstr |= range1->extra_cstr; Range_From_Vector(range); } /*-------------------------------------------------------------------------* * RANGE_ADD_VALUE * * * *-------------------------------------------------------------------------*/ void Range_Add_Value(Range *range, int n) { if (n == 0 || Is_Empty(range)) return; if (Is_Interval(range)) /* Interval */ { range->min += n; range->max += n; return; } /* Sparse */ Vector_Add_Value(range->vec, n); range->min += n; range->max += n; range->extra_cstr |= (range->max > vec_max_integer); if (range->extra_cstr || range->min < 0) Range_From_Vector(range); } /*-------------------------------------------------------------------------* * RANGE_MUL_VALUE * * * *-------------------------------------------------------------------------*/ void Range_Mul_Value(Range *range, int n) { if (n == 1 || Is_Empty(range)) return; if (Is_Interval(range)) /* Interval */ Range_Becomes_Sparse(range); /* Sparse */ Vector_Mul_Value(range->vec, n); range->min = range->min * n; range->max = range->max * n; range->extra_cstr |= (range->max > vec_max_integer); if (range->extra_cstr) Range_From_Vector(range); } /*-------------------------------------------------------------------------* * RANGE_DIV_VALUE * * * *-------------------------------------------------------------------------*/ void Range_Div_Value(Range *range, int n) { if (n == 1 || Is_Empty(range)) return; if (Is_Interval(range)) /* Interval */ Range_Becomes_Sparse(range); /* Sparse */ Vector_Div_Value(range->vec, n); range->min = (range->min + n - 1) / n; range->max = range->max / n; range->extra_cstr |= (range->max > vec_max_integer); if (range->extra_cstr) Range_From_Vector(range); } /*-------------------------------------------------------------------------* * RANGE_MOD_VALUE * * * *-------------------------------------------------------------------------*/ void Range_Mod_Value(Range *range, int n) { Range aux; if (Is_Empty(range)) return; if (n < 0) n = -n; if (Is_Interval(range)) /* Interval */ { if (range->min >= 0) { if (range->max - range->min + 1 >= n) { range->min = 0; range->max = n - 1; return; } range->min = range->min % n; range->max = range->max % n; if (range->min > range->max) { Range_Init_Interval(&aux, 0, range->max); range->max = n - 1; Range_Union(range, &aux); } return; } if (range->max <= 0) { if (range->max - range->min + 1 >= n) { range->min = -(n - 1); range->max = 0; return; } range->min = range->min % n; range->max = range->max % n; if (range->min > range->max) /* Only 0 will remain in the */ { /* range due to the changeover */ /* from Interval to Sparse */ Range_Init_Interval(&aux, -(n - 1), range->max); range->max = 0; Range_Union(range, &aux); } return; } /* Here range->min < 0 and range->max > 0 */ range->min = math_max(range->min, -n + 1); range->max = math_min(range->max, n - 1); return; } /* Sparse */ Vector_Mod_Value(range->vec, n); Range_From_Vector(range); } /*-------------------------------------------------------------------------* * RANGE_TO_STRING * * * *-------------------------------------------------------------------------*/ char * Range_To_String(Range *range) { int vec_elem; int limit1 = -1; int limit2; static char buff[4096]; if (Is_Empty(range)) { strcpy(buff, ""); return buff; } if (range->min == range->max) { sprintf(buff, "{%d}", range->min); return buff; } if (Is_Interval(range)) { sprintf(buff, "%s%d%s%d%s", WRITE_BEGIN_RANGE, range->min, WRITE_LIMITS_SEPARATOR, range->max, WRITE_END_RANGE); return buff; } sprintf(buff, "%s", WRITE_BEGIN_RANGE); VECTOR_BEGIN_ENUM(range->vec, vec_elem); if (limit1 == -1) limit1 = limit2 = vec_elem; else if (vec_elem == limit2 + 1) limit2 = vec_elem; else { if (limit2 == limit1) sprintf(buff + strlen(buff), "%d%s", limit1, WRITE_INTERVALS_SEPARATOR); else sprintf(buff + strlen(buff), "%d%s%d%s", limit1, WRITE_LIMITS_SEPARATOR, limit2, WRITE_INTERVALS_SEPARATOR); limit1 = limit2 = vec_elem; } VECTOR_END_ENUM; if (limit1 != -1) { if (limit2 == limit1) sprintf(buff + strlen(buff), "%d%s", limit1, WRITE_END_RANGE); else sprintf(buff + strlen(buff), "%d%s%d%s", limit1, WRITE_LIMITS_SEPARATOR, limit2, WRITE_END_RANGE); } if (range->extra_cstr) sprintf(buff + strlen(buff), "%s", WRITE_EXTRA_CSTR_SYMBOL); return buff; } ./gprolog-1.3.0/src/EngineFD/fd_hook_range.h0000644004425400513100000000403510547154141017141 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver * * File : fd_hook_range.h * * Descr.: FD Range Implementation - customizable header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_hook_range.h,v 1.10 2007/01/04 10:35:13 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ #define RANGE_TOP_STACK CS #define INTERVAL_MAX_INTEGER ((int)((1L<<(32-TAG_SIZE-1))-1)) /* only 32 bits */ ./gprolog-1.3.0/src/DEVELOPMENT0000644004425400513100000000207606705654114014302 0ustar diazlocoInformation for developers If you want to update/modify GNU-Prolog without having to install each working (intermediate) version simply use: % cd src % . ./SETVARS (under sh/bash) % source ./CSHSETVARS (under csh/tcsh) This updates the PATH variable and makes it possible to invoke gplc (and gprolog) which resides in src/TopComp. gplc then detects that it is in a development mode (use gplc -v to check this) and will use the libraries residing in src/EnginePl, src/BipsPl, src/EngineFD, src/BipsFD, src/Linedit (i.e the current development libraries and objects). To test a new (pure) Prolog feature, define a file t.pl and t_c.c (maybe empty) in BipsPl: % cd BipsPl % modify t.pl and t_c.c % make t % ./t to test There is an entry in the Makefile that reconstruct t from t.pl and t_c.c. Similarly, to test a new Prolog+FD feature, use t.pl, t_c.c and t_fd.fd in BipsFD: % cd BipsFD % modify t.pl and/or t_c.c and/or t_fd.fd % make t % ./t (to test) There is an entry in the Makefile that reconstruct t from t.pl, t_c.c and t_fd.fd. ./gprolog-1.3.0/src/mkinstalldirs0000755004425400513100000000132207157456504015401 0ustar diazloco#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.2 2000/09/12 16:43:48 diaz Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here ./gprolog-1.3.0/src/DISTRIB_FILES0000644004425400513100000000527710542513532014540 0ustar diazlocoREADME INSTALL COPYING ChangeLog NEWS PROBLEMS VERSION doc/README doc/Makefile doc/do_latex doc/[a-z][a-z-]?*.tex doc/[a-z][a-z]?*.sty doc/[a-z][a-z]?*.hva doc/[a-z][a-z]?*.fig doc/[a-z][a-z]?*.gif doc/[a-z][a-z]?*.eps doc/[a-z][a-z]?*.dvi doc/[a-z][a-z]?*.ps doc/[a-z][a-z]?*.pdf doc/[a-z][a-z]?*.chm doc/[a-z][a-z]?*.html doc/html_node/[a-z][a-z]?*.html doc/html_node/[a-z][a-z]?*.gif doc/html_node/[a-z][a-z]?*.hh[ckp] doc/html_node/[a-z][a-z]?*.tex doc/html_node/[a-z][a-z]?*.css doc/html_node/README doc/html_node/hh_do_hhc_hhk ExamplesPl/Makefile ExamplesPl/README ExamplesPl/PROGS ExamplesPl/??*.pl ExamplesPl/YAP/[A-B,D-Z]* ExamplesPl/WAMCC/[A-B,D-Z]* ExamplesPl/SICSTUS/[A-B,D-Z]* ExamplesPl/CIAO/[A-B,D-Z]* ExamplesPl/BINPROLOG/[A-B,D-Z]* ExamplesPl/XSB/[A-B,D-Z]* ExamplesPl/SWI/[A-B,D-Z]* ExamplesC/README ExamplesC/Makefile ExamplesC/??*.pl ExamplesC/??*_c.c ExamplesFD/Makefile ExamplesFD/*.pl ExamplesFD/*.fd src/.indent.pro src/Makefile.in src/DISTRIB_FILES src/SETVARS src/CSHSETVARS src/DOSSETVARS.BAT src/WINDOWS src/README src/AUTOCONF-INFO src/DEVELOPMENT src/PORTING src/VERSION src/config.guess src/config.sub src/configure src/configure.in src/install-sh src/mkinstalldirs src/RPM/Makefile src/RPM/README src/RPM/build_spec_file src/RPM/make_rpm_tree src/RPM/try_rpm src/RPM/rpm_env.spec src/RPM/initial.spec src/RPM/gprolog.spec src/Win32/Makefile.in src/Win32/README src/Win32/compile_install src/Win32/create-initial.iss src/Win32/create_bat.c src/Win32/gp-setup.iss.in src/debian/README.Debian src/debian/all-packages src/debian/[b-z]* src/TopComp/Makefile.in src/TopComp/[a-z][a-z]?*.[ch] src/Pl2Wam/Makefile.in src/Pl2Wam/OTHER_PL src/Pl2Wam/boot_cp src/Pl2Wam/check_boot src/Pl2Wam/[a-z][a-z]?*.pl src/Pl2Wam/[a-z][a-z]?*.wam src/Pl2Wam/swi_pl2wam src/Pl2Wam/sics_pl2wam src/Wam2Ma/Makefile.in src/Wam2Ma/[a-z][a-z]?*.[ch] src/Ma2Asm/MA_SYNTAX src/Ma2Asm/INLINED src/Ma2Asm/Makefile.in src/Ma2Asm/[a-z][a-z0-9]?*.[ch] src/Ma2Asm/[a-z][a-z0-9]?*.ma src/Ma2Asm/FromC/Makefile src/Ma2Asm/FromC/Makefile.in src/Ma2Asm/FromC/[a-z][a-z]?*.[ch] src/Fd2C/FD_SYNTAX src/Fd2C/Makefile.in src/Fd2C/[a-z][a-z]?*.pl src/Linedit/Makefile.in src/Linedit/[a-z][a-z]?*.[ch] src/W32GUICons/Makefile.in src/W32GUICons/[a-z][a-z0-9]?*.[ch] src/W32GUICons/[a-z][a-z0-9]?*.rc src/EnginePl/Makefile.in src/EnginePl/gp_config.h.in src/EnginePl/[a-z][a-z]?*.[ch] src/EnginePl/[a-z][a-z]?*.def src/EnginePl/*SIGSEGV.c src/EngineFD/Makefile.in src/EngineFD/[a-z][a-z]?*.[ch] src/EngineFD/[a-z][a-z]?*.fd src/BipsPl/Makefile.in src/BipsPl/BYTE_CODE src/BipsPl/[a-z]??*.pl src/BipsPl/[a-z]??*.wam src/BipsPl/[a-z]??*.[ch] src/BipsFD/Makefile.in src/BipsFD/[a-z][a-z]?*.pl src/BipsFD/[a-z][a-z]?*.fd src/BipsFD/[a-z][a-z]?*.[ch] ./gprolog-1.3.0/src/.indent.pro0000644004425400513100000001004307410447156014647 0ustar diazloco-gnu /* GNU coding style */ -bad /* blank line after every block of declarations */ -bap /* blank line after every procedure body */ -npcs /* no space between the name of the function and ( */ -cs /* space after cast operator */ -l76 /* normal line length */ -lc80 /* comment line length */ /* types */ -T time_t -T size_t -T fd_set -T FILE -T AliasInf -T ArgInf -T ArgTyp -T ArgVal -T ArithInf -T AtomInf -T AtomProp -T BCCodOp -T BCWord -T Bool -T BTNode -T BTString -T CmdInf -T CmpFct -T CodePtr -T CompNode -T CPT -T CPTCell -T CPTList -T CPTMatch -T CPTNode -T CPTStat -T CPTTree -T DblInt -T DblUns -T Direct -T DirectP -T DSwtInf -T DynCInf -T DynCInfP -T DynPInf -T DynPInfP -T DynScan -T DynStamp -T Elem -T ExeInf -T FctPtr -T FileInf -T FIOArg -T GmListElement -T GVarElt -T HashNode -T HashScan -T HistCell -T InfCmd -T InfLong -T InfLongP -T InfSig -T InfStack -T InfTag -T InfVar -T InstInf -T LineInf -T mbinptr -T mchunkptr -T Mem -T Monom -T NonLin -T ObjChain -T ObjInf -T OneSol -T OneSolP -T OperInf -T PbStk -T PBTNode -T PObjChain -T Poly -T Pred -T PredInf -T PredP -T PrefInf -T PSwtTbl -T PtrUns -T Range -T RegInf -T ScanFct -T SFOp -T StackInf -T StmFct -T StmInf -T StmProp -T StrSInf -T SwtElt -T SwtInf -T SwtTbl -T TagInf -T TermIO -T TermSInf -T TokInf -T TTYInf -T TypTag -T TypTok -T UsedFile -T Vector -T VecWord -T VType -T WamCont -T WamWord -T WamWordP -T Fct -T ABORTPROC -T ACMDRIVERENUMCB -T ACMDRIVERPROC -T ACMFILTERCHOOSEHOOKPROC -T ACMFILTERENUMCB -T ACMFILTERTAGENUMCB -T ACMFORMATCHOOSEHOOKPROC -T ACMFORMATENUMCB -T ACMFORMATTAGENUMCB -T APPLET_PROC -T ATOM -T BOOL -T BOOLEAN -T BYTE -T CALINFO_ENUMPROC -T CALLBACK -T CHAR -T COLORREF -T CONST -T CRITICAL_SECTION -T CTRYID -T DATEFMT_ENUMPROC -T DESKTOPENUMPROC -T DLGPROC -T DRAWSTATEPROC -T DWORD -T EDITWORDBREAKPROC -T ENHMFENUMPROC -T ENUMRESLANGPROC -T ENUMRESNAMEPROC -T ENUMRESTYPEPROC -T FARPROC -T FLOAT -T FILE_SEGMENT_ELEMENT -T FONTENUMPROC -T GOBJENUMPROC -T GRAYSTRINGPROC -T HACCEL -T HANDLE -T HBITMAP -T HBRUSH -T HCOLORSPACE -T HCONV -T HCONVLIST -T HCURSOR -T HDC -T HDDEDATA -T HDESK -T HDROP -T HDWP -T HENHMETAFILE -T HFILE -T HFONT -T HGDIOBJ -T HGLOBAL -T HHOOK -T HICON -T HIMAGELIST -T HIMC -T HINSTANCE -T HKEY -T HKL -T HLOCAL -T HMENU -T HMETAFILE -T HMODULE -T HMONITOR -T HOOKPROC -T CallWndProc -T CallWndRetProc -T CBTProc -T DebugProc -T ForegroundIdleProc -T GetMsgProc -T JournalPlaybackProc -T JournalRecordProc -T KeyboardProc -T LowLevelKeyboardProc -T LowLevelMouseProc -T MessageProc -T MouseProc -T ShellProc -T SysMsgProc -T HPALETTE -T HPEN -T HRGN -T HRSRC -T HSZ -T HTREEITEM -T HWINSTA -T HWND -T INT -T IPADDR -T LANGID -T LCID -T LCSCSTYPE -T LCSGAMUTMATCH -T LCTYPE -T LINEDDAPROC -T LOCALE_ENUMPROC -T LONG -T LONGLONG -T LPARAM -T LPBOOL -T LPBYTE -T LPCCHOOKPROC -T LPCFHOOKPROC -T LPCOLORREF -T LPCRITICAL_SECTION -T LPCSTR -T LPCTSTR -T LPCVOID -T LPCWSTR -T LPDWORD -T LPFIBER_START_ROUTINE -T LPFRHOOKPROC -T LPHANDLE -T LPHANDLER_FUNCTION -T LPINT -T LPLONG -T LPOFNHOOKPROC -T LPPAGEPAINTHOOK -T LPPAGESETUPHOOK -T LPPRINTHOOKPROC -T LPPROGRESS_ROUTINE -T LPSETUPHOOKPROC -T LPSTR -T LPSTREAM -T LPTHREAD_START_ROUTINE -T LPTSTR -T LPVOID -T LPWORD -T LPWSTR -T LRESULT -T LUID -T PBOOL -T PBOOLEAN -T PBYTE -T PCHAR -T PCRITICAL_SECTION -T PCSTR -T PCTSTR -T PCWCH -T PCWSTR -T PDWORD -T PFLOAT -T PFNCALLBACK -T PHANDLE -T PHANDLER_ROUTINE -T PHKEY -T PINT -T PLCID -T PLONG -T PLUID -T PROPENUMPROC -T PROPENUMPROCEX -T PSHORT -T PSTR -T PTBYTE -T PTCHAR -T PTIMERAPCROUTINE -T PTSTR -T PUCHAR -T PUINT -T PULONG -T PUSHORT -T PVOID -T PWCHAR -T PWORD -T PWSTR -T REGISTERWORDENUMPROC -T REGSAM -T SC_HANDLE -T SC_LOCK -T SENDASYNCPROC -T SERVICE_STATUS_HANDLE -T SHORT -T TBYTE -T TCHAR -T TIMEFMT_ENUMPROC -T TIMERPROC -T UCHAR -T UINT -T ULONG -T ULONGLONG -T UNSIGNED -T USHORT -T VOID -T WCHAR -T WINAPI -T WINSTAENUMPROC -T WNDENUMPROC -T EnumChildProc -T EnumThreadWndProc -T EnumWindowsProc -T WNDPROC -T WORD -T WPARAM -T YIELDPROC -T LOGFONT -T CHOOSEFONT -T WNDCLASS -T RECT -T PAINTSTRUCT -T HH_AKLINK -T LPMALLOC -T BROWSEINFO -T LPITEMIDLIST ./gprolog-1.3.0/src/CSHSETVARS0000644004425400513100000000022107410447156014173 0ustar diazlocoset a=`pwd` setenv PATH $a/TopComp:$a/EnginePl:$a/Pl2Wam:$a/Wam2Ma:$a/Ma2Asm:$a/Fd2C:$a/DevUtils:$a/W32GUICons:"$PATH":/usr/ucb/:/usr/ccs/bin/ ./gprolog-1.3.0/src/BipsFD/0000777004425400513100000000000010547442376013707 5ustar diazloco./gprolog-1.3.0/src/BipsFD/fd_values_fd.fd0000644004425400513100000000362310547154130016627 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_values_fd.fd * * Descr.: FD variable values management - FD part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_values_fd.fd,v 1.9 2007/01/04 10:35:04 diaz Exp $ */ fd_domain(fdv X,int L,int U) { start X in L .. U } fd_domain_r(fdv X,range R) { start X in R } ./gprolog-1.3.0/src/BipsFD/all_fd_bips.pl0000644004425400513100000000373210547154127016475 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : all_fd_bips.pl * * Descr.: all bips (to force the linker) * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: all_fd_bips.pl,v 1.11 2007/01/04 10:35:03 diaz Exp $ */ '$use_all_fd_bips' :- '$use_fd_infos', '$use_fd_values', '$use_fd_math', '$use_fd_bool', '$use_fd_prime', '$use_fd_symbolic', '$use_fd_optim'. ./gprolog-1.3.0/src/BipsFD/fd_prime_fd.fd0000644004425400513100000000362710547154127016456 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_prime_fd.fd * * Descr.: Prime constraint management - FD part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_prime_fd.fd,v 1.9 2007/01/04 10:35:03 diaz Exp $ */ prime_x(fdv X) { start X in Prime_Range(0) } not_prime_x(fdv X) { start X in Not_Prime_Range(0) } ./gprolog-1.3.0/src/BipsFD/math_supp.c0000644004425400513100000011176310547154130016044 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : math_supp.c * * Descr.: mathematical support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: math_supp.c,v 1.11 2007/01/04 10:35:04 diaz Exp $ */ #include #include #include #define OBJ_INIT Math_Supp_Initializer #define MATH_SUPP_FILE #include "engine_pl.h" #include "bips_pl.h" #include "engine_fd.h" #include "bips_fd.h" #if 1 #define DEVELOP_TIMES_2 #endif /*---------------------------------* * Constants * *---------------------------------*/ #define DELAY_CSTR_STACK_SIZE 128 #define VARS_STACK_SIZE 1024 #define MAX_MONOMS 1024 #define MAX_COEF_FOR_SORT 100 #define PLUS_1 0 #define PLUS_2 1 #define MINUS_1 2 #define MINUS_2 3 #define TIMES_2 4 #define DIV_2 5 #define POWER_2 6 #define MIN_2 7 #define MAX_2 8 #define DIST_2 9 #define QUOT_2 10 #define REM_2 11 #define QUOT_REM_3 12 #define NB_OF_OP 13 #define DC_X2_EQ_Y 0 #define DC_XY_EQ_Z 1 #define DC_DIV_A_Y_EQ_Z 2 #define DC_DIV_X_A_EQ_Z 3 #define DC_DIV_X_Y_EQ_Z 4 #define DC_ZERO_POWER_N_EQ_Y 5 #define DC_A_POWER_N_EQ_Y 6 #define DC_X_POWER_A_EQ_Y 7 #define DC_MIN_X_A_EQ_Z 8 #define DC_MIN_X_Y_EQ_Z 9 #define DC_MAX_X_A_EQ_Z 10 #define DC_MAX_X_Y_EQ_Z 11 #define DC_ABS_X_MINUS_A_EQ_Z 12 #define DC_ABS_X_MINUS_Y_EQ_Z 13 #define DC_QUOT_REM_A_Y_R_EQ_Z 14 #define DC_QUOT_REM_X_A_R_EQ_Z 15 #define DC_QUOT_REM_X_Y_R_EQ_Z 16 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct /* Monomial term information */ { /* ------------------------------ */ long a; /* coefficient */ WamWord x_word; /* variable a tagged */ } Monom; typedef struct /* Polynomial term information */ { /* ------------------------------ */ long c; /* the constant */ int nb_monom; /* nb of monomial terms */ Monom m[MAX_MONOMS]; /* table of monomial terms */ } Poly; typedef struct /* Non linear constr information */ { /* ------------------------------ */ int cstr; /* DC_X2_EQ_Y, DC_XY_EQ_Z,... */ WamWord a1, a2, a3; /* arguments (input) */ WamWord res; /* argument (result) */ } NonLin; /*---------------------------------* * Global Variables * *---------------------------------*/ static WamWord arith_tbl[NB_OF_OP]; static NonLin delay_cstr_stack[DELAY_CSTR_STACK_SIZE]; static NonLin *delay_sp; static WamWord vars_tbl[VARS_STACK_SIZE]; static WamWord *vars_sp; static Bool sort; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static Bool Load_Left_Right_Rec(Bool optim_eq, WamWord le_word, WamWord re_word, int *mask, WamWord *c_word, WamWord *l_word, WamWord *r_word); static int Compar_Monom(Monom *m1, Monom *m2); static Bool Load_Term_Into_Word(WamWord e_word, WamWord *load_word); static WamWord Push_Delayed_Cstr(int cstr, WamWord a1, WamWord a2, WamWord a3); static void Add_Monom(Poly *p, int sign, long a, WamWord x_word); #ifdef DEVELOP_TIMES_2 static Bool Add_Multiply_Monom(Poly *p, int sign, Monom *m1, Monom *m2); #endif static Bool Normalize(WamWord e_word, int sign, Poly *p); static Bool Load_Poly(int nb_monom, Monom *m, WamWord pref_load_word, WamWord *load_word); static Bool Load_Poly_Rec(int nb_monom, Monom *m, WamWord load_word); static Bool Load_Delay_Cstr_Part(void); #ifdef DEBUG void Write_1(WamWord term_word); #endif #define New_Tagged_Fd_Variable (Tag_REF(Fd_New_Variable())) #define New_Poly(p) ((p).c = (p).nb_monom = 0) #define Add_Cst_To_Poly(p, s, w) (p->c += s * w) /*-------------------------------------------------------------------------* * MATH_SUPP_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Math_Supp_Initializer(void) { arith_tbl[PLUS_1] = Functor_Arity(ATOM_CHAR('+'), 1); arith_tbl[PLUS_2] = Functor_Arity(ATOM_CHAR('+'), 2); arith_tbl[MINUS_1] = Functor_Arity(ATOM_CHAR('-'), 1); arith_tbl[MINUS_2] = Functor_Arity(ATOM_CHAR('-'), 2); arith_tbl[TIMES_2] = Functor_Arity(ATOM_CHAR('*'), 2); arith_tbl[POWER_2] = Functor_Arity(Create_Atom("**"), 2); arith_tbl[DIV_2] = Functor_Arity(ATOM_CHAR('/'), 2); arith_tbl[MIN_2] = Functor_Arity(Create_Atom("min"), 2); arith_tbl[MAX_2] = Functor_Arity(Create_Atom("max"), 2); arith_tbl[DIST_2] = Functor_Arity(Create_Atom("dist"), 2); arith_tbl[QUOT_2] = Functor_Arity(Create_Atom("//"), 2); arith_tbl[REM_2] = Functor_Arity(Create_Atom("rem"), 2); arith_tbl[QUOT_REM_3] = Functor_Arity(Create_Atom("quot_rem"), 3); } /*-------------------------------------------------------------------------* * LOAD_LEFT_RIGHT * * * * This function loads the left and right term of a constraint into (new) * * variables. * * Input: * * optim_eq: is used to optimize loadings of a term1 #= term2 constraint* * when the constant is zero. * * le_word : left term of the constraint * * re_word : right term of the constraint * * * * Output: * * mask : indicates if l_word and r_word are used (see MASK_... cst) * * c : the general (signed) constant * * l_word : the variable containing the left part (tagged ) * * r_word : the variable containing the right part (tagged ) * *-------------------------------------------------------------------------*/ Bool Load_Left_Right(Bool optim_eq, WamWord le_word, WamWord re_word, int *mask, long *c, WamWord *l_word, WamWord *r_word) { #ifdef DEBUG DBGPRINTF("\n*** Math constraint : "); Write_1(le_word); DBGPRINTF(" %s ", cur_op); Write_1(re_word); DBGPRINTF("\n"); #endif delay_sp = delay_cstr_stack; vars_sp = vars_tbl; return Load_Left_Right_Rec(optim_eq, le_word, re_word, mask, c, l_word, r_word); } /*-------------------------------------------------------------------------* * TERM_MATH_LOADING * * * *-------------------------------------------------------------------------*/ Bool Term_Math_Loading(WamWord l_word, WamWord r_word) { WamWord word, tag_mask; WamWord *adr, *fdv_adr; if (delay_sp != delay_cstr_stack) { #ifdef DEBUG DBGPRINTF("\nnon Linear part\n"); #endif if (!Load_Delay_Cstr_Part()) return FALSE; } while (--vars_sp >= vars_tbl) { DEREF(*vars_sp, word, tag_mask); if (tag_mask == TAG_REF_MASK && word != l_word && word != r_word) { adr = UnTag_REF(word); fdv_adr = Fd_New_Variable(); Bind_UV(adr, Tag_REF(fdv_adr)); } } return TRUE; } /*-------------------------------------------------------------------------* * LOAD_LEFT_RIGHT_REC * * * * This function can be called with re_word == NOT_A_WAM_WORD by the fct * * Load_Term_Into_Word(). In that case, re_word is simply ignored. * *-------------------------------------------------------------------------*/ static Bool Load_Left_Right_Rec(Bool optim_eq, WamWord le_word, WamWord re_word, int *mask, long *c, WamWord *l_word, WamWord *r_word) { Poly p; Monom *l_m, *r_m; Monom *cur, *pos, *neg, *end; int l_nb_monom, r_nb_monom; WamWord pref_load_word; /* to optimize equalities (#=) */ int i; sort = FALSE; New_Poly(p); if (!Normalize(le_word, +1, &p)) return FALSE; if (re_word != NOT_A_WAM_WORD && !Normalize(re_word, -1, &p)) return FALSE; if (sort || p.nb_monom > MAX_MONOMS / 2) { qsort(p.m, p.nb_monom, sizeof(Monom), (int (*)(const void *, const void *)) Compar_Monom); for (i = 0; i < p.nb_monom; i++) /* find left monomial terms */ if (p.m[i].a <= 0) break; l_m = p.m; l_nb_monom = i; for (; i < p.nb_monom; i++) /* find right monomial terms */ if (p.m[i].a >= 0) break; else p.m[i].a = -p.m[i].a; /* only positive coefs now */ r_m = l_m + l_nb_monom; r_nb_monom = i - l_nb_monom; } else { pos = p.m; end = pos + p.nb_monom; neg = end; for (cur = pos; cur < end; cur++) { if (cur->a < 0) { neg->a = -cur->a; neg->x_word = cur->x_word; neg++; continue; } if (cur->a > 0) { if (cur != pos) *pos = *cur; pos++; } } l_m = p.m; l_nb_monom = pos - l_m; r_m = end; r_nb_monom = neg - r_m; #ifdef DEBUG DBGPRINTF("l_nb_monom:%d r_nb_monom:%d\n", l_nb_monom, r_nb_monom); #endif } #ifdef DEBUG DBGPRINTF("normalization: "); for (i = 0; i < l_nb_monom; i++) { DBGPRINTF("%ld*", l_m[i].a); Write_1(l_m[i].x_word); DBGPRINTF(" + "); } if (p.c > 0) DBGPRINTF("%ld + ", p.c); else if (l_nb_monom == 0) DBGPRINTF("0 + "); DBGPRINTF("\b\b%s ", (re_word != NOT_A_WAM_WORD) ? cur_op : "="); for (i = 0; i < r_nb_monom; i++) { DBGPRINTF("%ld*", r_m[i].a); Write_1(r_m[i].x_word); DBGPRINTF(" + "); } if (p.c < 0) DBGPRINTF("%ld + ", -p.c); else if (r_nb_monom == 0 && re_word != NOT_A_WAM_WORD) DBGPRINTF("0 + "); if (re_word == NOT_A_WAM_WORD) DBGPRINTF("loaded + "); DBGPRINTF("\b\b \n\n"); #endif pref_load_word = NOT_A_WAM_WORD; *mask = MASK_EMPTY; if (l_nb_monom) { *mask |= MASK_LEFT; if (optim_eq && p.c == 0 && r_nb_monom == 1 && r_m[0].a == 1) pref_load_word = r_m[0].x_word; if (!Load_Poly(l_nb_monom, l_m, pref_load_word, l_word)) return FALSE; } if (r_nb_monom) { *mask |= MASK_RIGHT; if (pref_load_word == NOT_A_WAM_WORD) { if (optim_eq && p.c == 0 && l_nb_monom) pref_load_word = *l_word; if (!Load_Poly(r_nb_monom, r_m, pref_load_word, r_word)) return FALSE; } } *c = p.c; return TRUE; } /*-------------------------------------------------------------------------* * LOAD_TERM_INTO_WORD * * * * This function loads a term into a (tagged) word. * * Input: * * e_word : term to load * * * * Output: * * load_word: the tagged word containing the loading of the term: * * can be a if there is no variable or a ) * * * * This functions acts like T #= NewVar. However, if T is just an integer * * it avoids the creation of a useless FD NewVar. * *-------------------------------------------------------------------------*/ static Bool Load_Term_Into_Word(WamWord e_word, WamWord *load_word) { int mask; WamWord l_word, r_word, word; long c; if (!Load_Left_Right_Rec(FALSE, e_word, NOT_A_WAM_WORD, &mask, &c, &l_word, &r_word)) return FALSE; if (mask == MASK_EMPTY) { if (c < 0) return FALSE; *load_word = Tag_INT(c); return TRUE; } if (mask == MASK_LEFT && c == 0) { *load_word = l_word; return TRUE; } *load_word = New_Tagged_Fd_Variable; switch (mask) { case MASK_LEFT: /* here c != 0 */ if (c > 0) MATH_CSTR_3(x_plus_c_eq_y, l_word, Tag_INT(c), *load_word); else MATH_CSTR_3(x_plus_c_eq_y, *load_word, Tag_INT(-c), l_word); return TRUE; case MASK_RIGHT: if (c < 0) return FALSE; word = New_Tagged_Fd_Variable; MATH_CSTR_3(x_plus_y_eq_z, r_word, *load_word, word); PRIM_CSTR_2(x_eq_c, word, Tag_INT(c)); return TRUE; } if (c == 0) { MATH_CSTR_3(x_plus_y_eq_z, r_word, *load_word, l_word); return TRUE; } word = New_Tagged_Fd_Variable; MATH_CSTR_3(x_plus_y_eq_z, r_word, *load_word, word); if (c > 0) MATH_CSTR_3(x_plus_c_eq_y, l_word, Tag_INT(c), word); else MATH_CSTR_3(x_plus_c_eq_y, word, Tag_INT(-c), l_word); return TRUE; } /*-------------------------------------------------------------------------* * COMPAR_MONOM * * * * This function is called by qsort to order a polynomial term. It compares* * 2 monomial terms according to the following sequence: * * * * positive coefficients (from greatest to smallest) * * negative coefficients (from smallest to greatest) * * (ie. from |greatest| to |smallest|) * * null coefficients * *-------------------------------------------------------------------------*/ static int Compar_Monom(Monom *m1, Monom *m2) { long cmp; if (m1->a > 0) cmp = (m2->a > 0) ? m2->a - m1->a : -1; else cmp = (m2->a > 0) ? +1 : m1->a - m2->a; return (cmp > 0) ? 1 : (cmp == 0) ? 0 : -1; } /*-------------------------------------------------------------------------* * PUSH_DELAYED_CSTR * * * *-------------------------------------------------------------------------*/ static WamWord Push_Delayed_Cstr(int cstr, WamWord a1, WamWord a2, WamWord a3) { WamWord res_word; res_word = Make_Self_Ref(H); Global_Push(res_word); if (delay_sp - delay_cstr_stack == DELAY_CSTR_STACK_SIZE) Pl_Err_Resource(resource_too_big_fd_constraint); delay_sp->cstr = cstr; delay_sp->a1 = a1; delay_sp->a2 = a2; delay_sp->a3 = a3; delay_sp->res = res_word; delay_sp++; return res_word; } /*-------------------------------------------------------------------------* * ADD_MONOM * * * *-------------------------------------------------------------------------*/ static void Add_Monom(Poly *p, int sign, long a, WamWord x_word) { int i; if (a == 0) return; if (sign < 0) a = -a; for (i = 0; i < p->nb_monom; i++) if (p->m[i].x_word == x_word) { p->m[i].a += a; return; } if (p->nb_monom >= MAX_MONOMS) Pl_Err_Resource(resource_too_big_fd_constraint); p->m[p->nb_monom].a = a; p->m[p->nb_monom].x_word = x_word; p->nb_monom++; } #ifdef DEVELOP_TIMES_2 /*-------------------------------------------------------------------------* * ADD_MULTIPLY_MONOM * * * *-------------------------------------------------------------------------*/ static Bool Add_Multiply_Monom(Poly *p, int sign, Monom *m1, Monom *m2) { long a; WamWord x_word; a = m1->a * m2->a; if (a == 0) return TRUE; x_word = (m1->x_word == m2->x_word) ? Push_Delayed_Cstr(DC_X2_EQ_Y, m1->x_word, 0, 0) : Push_Delayed_Cstr(DC_XY_EQ_Z, m1->x_word, m2->x_word, 0); Add_Monom(p, sign, a, x_word); return TRUE; } #endif /*-------------------------------------------------------------------------* * NORMALIZE * * * * This functions normalizes a term. * * Input: * * e_word: term to normalize * * sign : current sign of the term (-1 or +1) * * * * Output: * * p : the associated polynomial term * * * * Normalizes the term and loads it into p. * * Non-Linear operations are simplified and loaded into a stack to be * * executed later. * * * * T1*T2 : T1 and T2 are normalized to give the polynomials p1 and p2, with* * p1 = c1 + a1X1 + a2X2 + ... + anXn * * p2 = c2 + b1X1 + b2X2 + ... + bmXm * * and replaced by c1*c2 + * * a1X1 * c2 + a1X1 * b1X1 + ... + a1X1 * bmXm * * ... * * anX1 * c2 + anXn * b1X1 + ... + anXn * bmXm * * * * T1**T2: T1 and T2 are loaded into 2 new words word1 and word2 that can * * be integers or variables (tagged words). The code emitted * * depends on 3 possibilities (var**var is not allowed) * * (+ optim 1**T2, 0**T2, T1**0, T1**1), NB 0**0=1 * *-------------------------------------------------------------------------*/ static Bool Normalize(WamWord e_word, int sign, Poly *p) { WamWord word, tag_mask; WamWord *adr; WamWord *fdv_adr; WamWord word1, word2, word3; WamWord f_n, le_word, re_word; int i; long n1, n2, n3; terminal_rec: DEREF(e_word, word, tag_mask); if (tag_mask == TAG_FDV_MASK) { fdv_adr = UnTag_FDV(word); Add_Monom(p, sign, 1, Tag_REF(fdv_adr)); return TRUE; } if (tag_mask == TAG_INT_MASK) { n1 = UnTag_INT(word); if (n1 > MAX_COEF_FOR_SORT) sort = TRUE; Add_Cst_To_Poly(p, sign, n1); return TRUE; } if (tag_mask == TAG_REF_MASK) { if (vars_sp - vars_tbl == VARS_STACK_SIZE) Pl_Err_Resource(resource_too_big_fd_constraint); *vars_sp++ = word; Add_Monom(p, sign, 1, word); return TRUE; } if (tag_mask == TAG_ATM_MASK) { word = Put_Structure(ATOM_CHAR('/'), 2); Unify_Value(e_word); Unify_Integer(0); type_error: Pl_Err_Type(type_fd_evaluable, word); } if (tag_mask != TAG_STC_MASK) goto type_error; adr = UnTag_STC(word); f_n = Functor_And_Arity(adr); for (i = 0; i < NB_OF_OP; i++) if (arith_tbl[i] == f_n) break; le_word = Arg(adr, 0); re_word = Arg(adr, 1); switch (i) { case PLUS_1: e_word = le_word; goto terminal_rec; case PLUS_2: if (!Normalize(le_word, sign, p)) return FALSE; e_word = re_word; goto terminal_rec; case MINUS_2: if (!Normalize(le_word, sign, p)) return FALSE; e_word = re_word; sign = -sign; goto terminal_rec; case MINUS_1: e_word = le_word; sign = -sign; goto terminal_rec; case TIMES_2: #ifdef DEVELOP_TIMES_2 #if 1 /* optimize frequent use: INT*VAR */ DEREF(le_word, word, tag_mask); if (tag_mask != TAG_INT_MASK) goto any; n1 = UnTag_INT(word); if (n1 > MAX_COEF_FOR_SORT) sort = TRUE; DEREF(re_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) { if (tag_mask != TAG_FDV_MASK) goto any; else { fdv_adr = UnTag_FDV(word); word = Tag_REF(fdv_adr); } } Add_Monom(p, sign, n1, word); return TRUE; any: #endif { Poly p1, p2; int i1, i2; New_Poly(p1); New_Poly(p2); if (!Normalize(le_word, 1, &p1) || !Normalize(re_word, 1, &p2)) return FALSE; Add_Cst_To_Poly(p, sign, p1.c * p2.c); for (i1 = 0; i1 < p1.nb_monom; i1++) { Add_Monom(p, sign, p1.m[i1].a * p2.c, p1.m[i1].x_word); for (i2 = 0; i2 < p2.nb_monom; i2++) if (!Add_Multiply_Monom(p, sign, p1.m + i1, p2.m + i2)) return FALSE; } for (i2 = 0; i2 < p2.nb_monom; i2++) Add_Monom(p, sign, p2.m[i2].a * p1.c, p2.m[i2].x_word); return TRUE; } #else if (!Load_Term_Into_Word(le_word, &word1) || !Load_Term_Into_Word(re_word, &word2)) return FALSE; if (Tag_Is_INT(word1)) { n1 = UnTag_INT(word1); if (Tag_Is_INT(word2)) { n2 = UnTag_INT(word2); n1 = n1 * n2; Add_Cst_To_Poly(p, sign, n1); return TRUE; } Add_Monom(p, sign, n1, word2); return TRUE; } if (Tag_Is_INT(word2)) { n2 = UnTag_INT(word2); Add_Monom(p, sign, n2, word1); return TRUE; } word1 = (word1 == word2) ? Push_Delayed_Cstr(DC_X2_EQ_Y, word1, 0, 0) : Push_Delayed_Cstr(DC_XY_EQ_Z, word1, word2, 0); Add_Monom(p, sign, 1, word1); return TRUE; #endif case POWER_2: if (!Load_Term_Into_Word(le_word, &word1) || !Load_Term_Into_Word(re_word, &word2)) return FALSE; if (Tag_Is_INT(word1)) { n1 = UnTag_INT(word1); if (Tag_Is_INT(word2)) { n2 = UnTag_INT(word2); if ((n1 = Power(n1, n2)) < 0) return FALSE; Add_Cst_To_Poly(p, sign, n1); return TRUE; } if (n1 == 1) { Add_Cst_To_Poly(p, sign, 1); return TRUE; } word = (n1 == 0) ? Push_Delayed_Cstr(DC_ZERO_POWER_N_EQ_Y, word2, 0, 0) : Push_Delayed_Cstr(DC_A_POWER_N_EQ_Y, word1, word2, 0); goto end_power; } if (Tag_Mask_Of(word2) != TAG_INT_MASK) Pl_Err_Instantiation(); else { n2 = UnTag_INT(word2); if (n2 == 0) { Add_Cst_To_Poly(p, sign, 1); return TRUE; } word = (n2 == 1) ? word1 : (n2 == 2) ? Push_Delayed_Cstr(DC_X2_EQ_Y, word1, 0, 0) : Push_Delayed_Cstr(DC_X_POWER_A_EQ_Y, word1, word2, 0); } end_power: Add_Monom(p, sign, 1, word); return TRUE; case MIN_2: if (!Load_Term_Into_Word(le_word, &word1) || !Load_Term_Into_Word(re_word, &word2)) return FALSE; if (Tag_Is_INT(word1)) { n1 = UnTag_INT(word1); if (Tag_Is_INT(word2)) { n2 = UnTag_INT(word2); n1 = math_min(n1, n2); Add_Cst_To_Poly(p, sign, n1); return TRUE; } word = Push_Delayed_Cstr(DC_MIN_X_A_EQ_Z, word2, word1, 0); goto end_min; } if (Tag_Is_INT(word2)) word = Push_Delayed_Cstr(DC_MIN_X_A_EQ_Z, word1, word2, 0); else word = Push_Delayed_Cstr(DC_MIN_X_Y_EQ_Z, word1, word2, 0); end_min: Add_Monom(p, sign, 1, word); return TRUE; case MAX_2: if (!Load_Term_Into_Word(le_word, &word1) || !Load_Term_Into_Word(re_word, &word2)) return FALSE; if (Tag_Is_INT(word1)) { n1 = UnTag_INT(word1); if (Tag_Is_INT(word2)) { n2 = UnTag_INT(word2); n1 = math_max(n1, n2); Add_Cst_To_Poly(p, sign, n1); return TRUE; } word = Push_Delayed_Cstr(DC_MAX_X_A_EQ_Z, word2, word1, 0); goto end_max; } if (Tag_Is_INT(word2)) word = Push_Delayed_Cstr(DC_MAX_X_A_EQ_Z, word1, word2, 0); else word = Push_Delayed_Cstr(DC_MAX_X_Y_EQ_Z, word1, word2, 0); end_max: Add_Monom(p, sign, 1, word); return TRUE; case DIST_2: if (!Load_Term_Into_Word(le_word, &word1) || !Load_Term_Into_Word(re_word, &word2)) return FALSE; if (Tag_Is_INT(word1)) { n1 = UnTag_INT(word1); if (Tag_Is_INT(word2)) { n2 = UnTag_INT(word2); n1 = (n1 >= n2) ? n1 - n2 : n2 - n1; Add_Cst_To_Poly(p, sign, n1); return TRUE; } word = Push_Delayed_Cstr(DC_ABS_X_MINUS_A_EQ_Z, word2, word1, 0); goto end_dist; } if (Tag_Is_INT(word2)) word = Push_Delayed_Cstr(DC_ABS_X_MINUS_A_EQ_Z, word1, word2, 0); else word = Push_Delayed_Cstr(DC_ABS_X_MINUS_Y_EQ_Z, word1, word2, 0); end_dist: Add_Monom(p, sign, 1, word); return TRUE; case QUOT_2: word3 = Make_Self_Ref(H); /* word3 = remainder */ Global_Push(word3); goto quot_rem; case REM_2: word3 = Make_Self_Ref(H); /* word3 = remainder */ Global_Push(word3); goto quot_rem; case QUOT_REM_3: quot_rem: if (!Load_Term_Into_Word(le_word, &word1) || !Load_Term_Into_Word(re_word, &word2) || (i == QUOT_REM_3 && !Load_Term_Into_Word(Arg(adr, 2), &word3))) return FALSE; if (Tag_Is_INT(word1)) { n1 = UnTag_INT(word1); if (Tag_Is_INT(word2)) { n2 = UnTag_INT(word2); if (n2 == 0) return FALSE; n3 = n1 % n2; if (i == QUOT_2 || i == QUOT_REM_3) { if (i == QUOT_REM_3) PRIM_CSTR_2(x_eq_c, word3, word); else H--; /* recover word3 space */ n3 = n1 / n2; } Add_Cst_To_Poly(p, sign, n3); return TRUE; } word = Push_Delayed_Cstr(DC_QUOT_REM_A_Y_R_EQ_Z, word1, word2, word3); goto end_quot_rem; } if (Tag_Is_INT(word2)) word = Push_Delayed_Cstr(DC_QUOT_REM_X_A_R_EQ_Z, word1, word2, word3); else word = Push_Delayed_Cstr(DC_QUOT_REM_X_Y_R_EQ_Z, word1, word2, word3); end_quot_rem: Add_Monom(p, sign, 1, (i == REM_2) ? word3 : word); return TRUE; case DIV_2: if (!Load_Term_Into_Word(le_word, &word1) || !Load_Term_Into_Word(re_word, &word2)) return FALSE; if (Tag_Is_INT(word1)) { n1 = UnTag_INT(word1); if (Tag_Is_INT(word2)) { n2 = UnTag_INT(word2); if (n2 == 0 || n1 % n2 != 0) return FALSE; n1 /= n2; Add_Cst_To_Poly(p, sign, n1); return TRUE; } word = Push_Delayed_Cstr(DC_DIV_A_Y_EQ_Z, word1, word2, 0); goto end_div; } if (Tag_Is_INT(word2)) word = Push_Delayed_Cstr(DC_DIV_X_A_EQ_Z, word1, word2, 0); else word = Push_Delayed_Cstr(DC_DIV_X_Y_EQ_Z, word1, word2, 0); end_div: Add_Monom(p, sign, 1, word); return TRUE; default: word = Put_Structure(ATOM_CHAR('/'), 2); Unify_Atom(Functor(adr)); Unify_Integer(Arity(adr)); goto type_error; } return TRUE; } /*-------------------------------------------------------------------------* * LOAD_POLY * * * * This function loads a polynomial term (without constant) into a word. * * Input: * * nb_monom : nb of monomial terms (nb_monom > 0) * * m : array of monomial terms * * pref_load_word: wanted load_word (or NOT_A_WAM_WORD) * * * * Output: * * load_word : the word containing the loading ie.: * * * * This functions does not take into account constants. * *-------------------------------------------------------------------------*/ static Bool Load_Poly(int nb_monom, Monom *m, WamWord pref_load_word, WamWord *load_word) { if (nb_monom == 1 && m[0].a == 1) { if (pref_load_word != NOT_A_WAM_WORD) { if (!Fd_Math_Unify_X_Y(m[0].x_word, pref_load_word)) return FALSE; *load_word = pref_load_word; return TRUE; } *load_word = m[0].x_word; return TRUE; } if (pref_load_word != NOT_A_WAM_WORD) *load_word = pref_load_word; else *load_word = New_Tagged_Fd_Variable; return Load_Poly_Rec(nb_monom, m, *load_word); } /*-------------------------------------------------------------------------* * LOAD_POLY_REC * * * * This function recursively loads a polynomial term into a word. * * Input: * * nb_monom : nb of monomial terms (nb_monom > 0) * * m : array of monomial terms * * load_word : the word where the term must be loaded * * * * At the entry, if nb_monom==1 then the coefficient of the monomial term * * is > 1 (see call from Load_Poly() and recursive call). * *-------------------------------------------------------------------------*/ static Bool Load_Poly_Rec(int nb_monom, Monom *m, WamWord load_word) { WamWord load_word1; if (nb_monom == 1) { /* here m[0].a != 1 */ MATH_CSTR_3(ax_eq_y, Tag_INT(m[0].a), m[0].x_word, load_word); return TRUE; } if (nb_monom == 2) { if (m[0].a == 1) { if (m[1].a == 1) MATH_CSTR_3(x_plus_y_eq_z, m[0].x_word, m[1].x_word, load_word); else MATH_CSTR_4(ax_plus_y_eq_z, Tag_INT(m[1].a), m[1].x_word, m[0].x_word, load_word); } else if (m[1].a == 1) MATH_CSTR_4(ax_plus_y_eq_z, Tag_INT(m[0].a), m[0].x_word, m[1].x_word, load_word); else MATH_CSTR_5(ax_plus_by_eq_z, Tag_INT(m[0].a), m[0].x_word, Tag_INT(m[1].a), m[1].x_word, load_word); return TRUE; } if (nb_monom == 3 && m[2].a == 1) load_word1 = m[2].x_word; else load_word1 = New_Tagged_Fd_Variable; if (m[0].a == 1) { if (m[1].a == 1) MATH_CSTR_4(x_plus_y_plus_z_eq_t, m[0].x_word, m[1].x_word, load_word1, load_word); else MATH_CSTR_5(ax_plus_y_plus_z_eq_t, Tag_INT(m[1].a), m[1].x_word, m[0].x_word, load_word1, load_word); } else if (m[1].a == 1) MATH_CSTR_5(ax_plus_y_plus_z_eq_t, Tag_INT(m[0].a), m[0].x_word, m[1].x_word, load_word1, load_word); else PRIM_CSTR_6(ax_plus_by_plus_z_eq_t, Tag_INT(m[0].a), m[0].x_word, Tag_INT(m[1].a), m[1].x_word, load_word1, load_word); if (!(nb_monom == 3 && m[2].a == 1)) return Load_Poly_Rec(nb_monom - 2, m + 2, load_word1); return TRUE; } /*-------------------------------------------------------------------------* * LOAD_DELAY_CSTR_PART * * * *-------------------------------------------------------------------------*/ static Bool Load_Delay_Cstr_Part(void) { NonLin *i; for (i = delay_cstr_stack; i < delay_sp; i++) { switch (i->cstr) { case DC_X2_EQ_Y: MATH_CSTR_2(x2_eq_y, i->a1, i->res); break; case DC_XY_EQ_Z: MATH_CSTR_3(xy_eq_z, i->a1, i->a2, i->res); break; case DC_DIV_A_Y_EQ_Z: PRIM_CSTR_2(x_gte_c, i->a2, Tag_INT(1)); MATH_CSTR_3(xy_eq_z, i->res, i->a2, i->a1); break; case DC_DIV_X_A_EQ_Z: MATH_CSTR_3(ax_eq_y, i->a2, i->res, i->a1); break; case DC_DIV_X_Y_EQ_Z: PRIM_CSTR_2(x_gte_c, i->a2, Tag_INT(1)); MATH_CSTR_3(xy_eq_z, i->res, i->a2, i->a1); break; case DC_ZERO_POWER_N_EQ_Y: PRIM_CSTR_2(zero_power_n_eq_y, i->a1, i->res); break; case DC_A_POWER_N_EQ_Y: MATH_CSTR_3(a_power_n_eq_y, i->a1, i->a2, i->res); break; case DC_X_POWER_A_EQ_Y: MATH_CSTR_3(x_power_a_eq_y, i->a1, i->a2, i->res); break; case DC_MIN_X_A_EQ_Z: MATH_CSTR_3(min_x_a_eq_z, i->a1, i->a2, i->res); break; case DC_MIN_X_Y_EQ_Z: MATH_CSTR_3(min_x_y_eq_z, i->a1, i->a2, i->res); break; case DC_MAX_X_A_EQ_Z: MATH_CSTR_3(max_x_a_eq_z, i->a1, i->a2, i->res); break; case DC_MAX_X_Y_EQ_Z: MATH_CSTR_3(max_x_y_eq_z, i->a1, i->a2, i->res); break; case DC_ABS_X_MINUS_A_EQ_Z: MATH_CSTR_3(abs_x_minus_a_eq_z, i->a1, i->a2, i->res); break; case DC_ABS_X_MINUS_Y_EQ_Z: MATH_CSTR_3(abs_x_minus_y_eq_z, i->a1, i->a2, i->res); break; case DC_QUOT_REM_A_Y_R_EQ_Z: MATH_CSTR_4(quot_rem_a_y_r_eq_z, i->a1, i->a2, i->a3, i->res); break; case DC_QUOT_REM_X_A_R_EQ_Z: MATH_CSTR_4(quot_rem_x_a_r_eq_z, i->a1, i->a2, i->a3, i->res); break; case DC_QUOT_REM_X_Y_R_EQ_Z: MATH_CSTR_4(quot_rem_x_y_r_eq_z, i->a1, i->a2, i->a3, i->res); break; } } delay_sp = delay_cstr_stack; return TRUE; } /*-------------------------------------------------------------------------* * FD_MATH_UNIFY_X_Y * * * *-------------------------------------------------------------------------*/ Bool Fd_Math_Unify_X_Y(WamWord x, WamWord y) { WamWord x_word, x_tag; WamWord y_word, y_tag; DEREF(x, x_word, x_tag); DEREF(y, y_word, y_tag); if (x_tag == TAG_FDV_MASK && y_tag == TAG_FDV_MASK) { MATH_CSTR_2(x_eq_y, x, y); return TRUE; } #ifdef DEBUG DBGPRINTF("Prolog Unif: "); Write_1(x_word); DBGPRINTF(" = "); Write_1(y_word); DBGPRINTF("\n"); #endif return Unify(x_word, y_word); } /*-------------------------------------------------------------------------* * X_EQ_C * * * * Defined here instead in fd_math_fd.fd to avoid A frame creation. * *-------------------------------------------------------------------------*/ Bool x_eq_c(WamWord x, WamWord c) { return Get_Integer_Tagged(c, x); } #ifdef DEBUG /*-------------------------------------------------------------------------* * DEBUG_DISPLAY * * * *-------------------------------------------------------------------------*/ void Debug_Display(char *fct, int n, ...) { va_list arg_ptr; WamWord word; int i; char *s1[] = { "plus", "eq", "neq", "lte", "lt", "gte", "gt", NULL }; char *s2[] = { "+", "=", "\\=", "<=", "<", ">=", ">" }; char **s; char *p; va_start(arg_ptr, n); DBGPRINTF("'"); for (p = fct; *p; p++) { if (*p == '_') { for (s = s1; *s; s++) { i = strlen(*s); if (strncmp(*s, p + 1, i) == 0) break; } if (*s && p[1 + i] == '_') { p += 1 + i; DBGPRINTF(s2[s - s1]); continue; } } DBGPRINTF("%c", *p); } DBGPRINTF("'("); for (i = 0; i < n; i++) { word = va_arg(arg_ptr, WamWord); Write_1(word); DBGPRINTF("%c", (i < n - 1) ? ',' : ')'); } va_end(arg_ptr); DBGPRINTF("\n"); } #endif ./gprolog-1.3.0/src/BipsFD/fd_prime_c.c0000644004425400513100000001112010547154127016123 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_prime_c.c * * Descr.: prime constraint management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_prime_c.c,v 1.9 2007/01/04 10:35:03 diaz Exp $ */ #include #include "engine_pl.h" #include "bips_pl.h" #include "engine_fd.h" #include "bips_fd.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static int prime_vec_size; static Range prime_range; static Range not_prime_range; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Compute_Prime_Range(void); /*-------------------------------------------------------------------------* * PRIME_RANGE * * * *-------------------------------------------------------------------------*/ void Prime_Range(Range *r) { if (prime_vec_size != vec_size) Compute_Prime_Range(); Range_Copy(r, &prime_range); } /*-------------------------------------------------------------------------* * NOT_PRIME_RANGE * * * *-------------------------------------------------------------------------*/ void Not_Prime_Range(Range *r) { if (prime_vec_size != vec_size) Compute_Prime_Range(); Range_Copy(r, ¬_prime_range); } /*-------------------------------------------------------------------------* * COMPUTE_PRIME_RANGE * * * *-------------------------------------------------------------------------*/ static void Compute_Prime_Range(void) { int i, j; Vector vec, nvec, end; if (prime_range.vec) { Free(prime_range.vec); Free(not_prime_range.vec); } prime_range.vec = vec = (Vector) Malloc(vec_size * sizeof(VecWord)); not_prime_range.vec = nvec = (Vector) Malloc(vec_size * sizeof(VecWord)); Vector_Full(vec); Vector_Reset_Value(vec, 0); Vector_Reset_Value(vec, 1); i = 2; do { j = i; while ((j += i) <= vec_max_integer) Vector_Reset_Value(vec, j); j = i; i = Vector_Next_After(vec, i); } while (i > 0); prime_range.extra_cstr = TRUE; prime_range.min = 2; prime_range.max = j; not_prime_range.extra_cstr = TRUE; not_prime_range.min = 0; not_prime_range.max = (j < vec_max_integer) ? vec_max_integer : vec_max_integer - 1; end = vec + vec_size; do { *nvec = ~(*vec); vec++; nvec++; } while (vec < end); prime_vec_size = vec_size; } ./gprolog-1.3.0/src/BipsFD/fd_math_fd.fd0000644004425400513100000005517010547154127016273 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_math_fd.fd * * Descr.: mathematical predicate management - FD part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_math_fd.fd,v 1.9 2007/01/04 10:35:03 diaz Exp $ */ %{ #include "bips_fd.h" #define ite(i,t,e) ((i) ? (t) : (e)) %} /*-------------------------------------------------------------------------* * EQUAL (LINEAR) * * * * NB: x_eq_c(fdv X,int C) is defined as a function in math_supp.c to avoid* * A Frame creation. * *-------------------------------------------------------------------------*/ /*------------* * Partial AC * *------------*/ x_eq_y(fdv X,fdv Y) { start X in min(Y) .. max(Y) start Y in min(X) .. max(X) } x_plus_c_eq_y(fdv X,int C,fdv Y) { start X in min(Y) - C .. max(Y) - C start Y in min(X) + C .. max(X) + C } /*------------* * Full AC * *------------*/ x_eq_y_F(fdv X,fdv Y) { start X in dom(Y) start Y in dom(X) } x_plus_c_eq_y_F(fdv X,int C,fdv Y) { start X in dom(Y) - C start Y in dom(X) + C } /*-------------------------------------------------------------------------* * DIFFERENT (LINEAR) * * * *-------------------------------------------------------------------------*/ /*------------* * Partial AC * *------------*/ x_neq_c(fdv X,int C) { start X in ~{C} } x_neq_y(fdv X,fdv Y) { start X in ~{val(Y)} start Y in ~{val(X)} } x_plus_c_neq_y(fdv X,int C,fdv Y) { start X in ~{val(Y) - C} start Y in ~{val(X) + C} } /*-------------------------------------------------------------------------* * LESS THAN (LINEAR) * * * *-------------------------------------------------------------------------*/ /*------------* * Partial AC * *------------*/ x_lt_y(fdv X,fdv Y) { start X in 0 .. max(Y) - 1 start Y in min(X) + 1 .. max_integer } /*-------------------------------------------------------------------------* * LESS THAN OR EQUAL TO (LINEAR) * * * *-------------------------------------------------------------------------*/ /*------------* * Partial AC * *------------*/ x_lte_c(fdv X,int C) { start X in 0 .. C } x_lte_y(fdv X,fdv Y) { start X in 0 .. max(Y) start Y in min(X) .. max_integer } x_plus_c_lte_y(fdv X,int C,fdv Y) { start X in 0 .. max(Y) - C start Y in min(X) + C .. max_integer } /*-------------------------------------------------------------------------* * GREATER THAN OR EQUAL TO (LINEAR) * * * *-------------------------------------------------------------------------*/ /*------------* * Partial AC * *------------*/ x_gte_c(fdv X,int C) { start X in C .. max_integer } x_plus_c_gte_y(fdv X,int C,fdv Y) { start X in min(Y) - C .. max_integer start Y in 0 .. max(X) + C } /*-------------------------------------------------------------------------* * OTHER EQUAL (LINEAR) * * * * NB: used to split large equations introducing intermediate variables. * *-------------------------------------------------------------------------*/ /*------------* * Partial AC * *------------*/ ax_eq_y(int A,fdv X,fdv Y) { start X in (min(Y)) /> A .. (max(Y)) /< A start Y in A*min(X) .. A*max(X) } x_plus_y_eq_z(fdv X,fdv Y,fdv Z) { start X in min(Z) - max(Y) .. max(Z) - min(Y) start Y in min(Z) - max(X) .. max(Z) - min(X) start Z in min(X) + min(Y) .. max(X) + max(Y) } ax_plus_y_eq_z(int A,fdv X,fdv Y,fdv Z) { start X in (min(Z) - max(Y)) /> A .. (max(Z) - min(Y)) /< A start Y in min(Z) - A*max(X) .. max(Z) - A*min(X) start Z in A*min(X) + min(Y) .. A*max(X) + max(Y) } ax_plus_by_eq_z(int A,fdv X,int B,fdv Y,fdv Z) { start X in (min(Z) - B*max(Y)) /> A .. (max(Z) - B*min(Y)) /< A start Y in (min(Z) - A*max(X)) /> B .. (max(Z) - A*min(X)) /< B start Z in A*min(X) + B*min(Y) .. A*max(X) + B*max(Y) } x_plus_y_plus_z_eq_t(fdv X,fdv Y,fdv Z,fdv T) { start X in min(T) - max(Y) - max(Z) .. max(T) - min(Y) - min(Z) start Y in min(T) - max(X) - max(Z) .. max(T) - min(X) - min(Z) start Z in min(T) - max(X) - max(Y) .. max(T) - min(X) - min(Y) start T in min(X) + min(Y) + min(Z) .. max(X) + max(Y) + max(Z) } ax_plus_y_plus_z_eq_t(int A,fdv X,fdv Y,fdv Z,fdv T) { start X in (min(T) - max(Y) - max(Z)) /> A .. (max(T) - min(Y) - min(Z)) /< A start Y in min(T) - A*max(X) - max(Z) .. max(T) - A*min(X) - min(Z) start Z in min(T) - A*max(X) - max(Y) .. max(T) - A*min(X) - min(Y) start T in A*min(X) + min(Y) + min(Z) .. A*max(X) + max(Y) + max(Z) } ax_plus_by_plus_z_eq_t(int A,fdv X,int B,fdv Y,fdv Z,fdv T) { start X in (min(T) - B*max(Y) - max(Z)) /> A .. (max(T) - B*min(Y) - min(Z)) /< A start Y in (min(T) - A*max(X) - max(Z)) /> B .. (max(T) - A*min(X) - min(Z)) /< B start Z in min(T) - A*max(X) - B*max(Y) .. max(T) - A*min(X) - B*min(Y) start T in A*min(X) + B*min(Y) + min(Z) .. A*max(X) + B*max(Y) + max(Z) } /*------------* * Full AC * *------------*/ ax_eq_y_F(int A,fdv X,fdv Y) { start X in (dom(Y)) / A start Y in dom(X)*A } x_plus_y_eq_z_F(fdv X,fdv Y,fdv Z) { start X in dom(Z) -- dom(Y) start Y in dom(Z) -- dom(X) start Z in dom(X) ++ dom(Y) } ax_plus_y_eq_z_F(int A,fdv X,fdv Y,fdv Z) { start X in (dom(Z) -- dom(Y)) / A start Y in dom(Z) -- dom(X)*A start Z in dom(X)*A ++ dom(Y) } ax_plus_by_eq_z_F(int A,fdv X,int B,fdv Y,fdv Z) { start X in (dom(Z) -- dom(Y)*B) / A start Y in (dom(Z) -- dom(X)*A) / B start Z in dom(X)*A ++ dom(Y)*B } x_plus_y_plus_z_eq_t_F(fdv X,fdv Y,fdv Z,fdv T) { start X in dom(T) -- dom(Y) -- dom(Z) start Y in dom(T) -- dom(X) -- dom(Z) start Z in dom(T) -- dom(X) -- dom(Y) start T in dom(X) ++ dom(Y) ++ dom(Z) } ax_plus_y_plus_z_eq_t_F(int A,fdv X,fdv Y,fdv Z,fdv T) { start X in (dom(T) -- dom(Y) -- dom(Z)) / A start Y in dom(T) -- dom(X)*A -- dom(Z) start Z in dom(T) -- dom(X)*A -- dom(Y) start T in dom(X)*A ++ dom(Y) ++ dom(Z) } ax_plus_by_plus_z_eq_t_F(int A,fdv X,int B,fdv Y,fdv Z,fdv T) { start X in (dom(T) -- dom(Y)*B -- dom(Z)) / A start Y in (dom(T) -- dom(X)*A -- dom(Z)) / B start Z in dom(T) -- dom(X)*A -- dom(Y)*B start T in dom(X)*A ++ dom(Y)*B ++ dom(Z) } /*-------------------------------------------------------------------------* * POWER and X * Y * * * *-------------------------------------------------------------------------*/ /*------------* * Partial AC * *------------*/ zero_power_n_eq_y(fdv N,fdv Y) { start Y in ite(max(N)==0,1,0)..ite(min(N)==0,1,0) start N in ite(max(Y)==0,1,0)..ite(min(Y)==0,max_integer,0) } a_power_n_eq_y(int A,fdv N,fdv Y) /* here A >= 2 */ { start Y in Power(A,min(N))..Power(A,max(N)) /* before to ensure Y>=1 */ start N in Find_Expon_Up(A,min(Y))..Find_Expon_Dn(A,max(Y)) } x_power_a_eq_y(fdv X,int A,fdv Y) /* here A > 2 */ { start Y in Power(min(X),A)..Power(max(X),A) start X in Nth_Root_Up(min(Y),A)..Nth_Root_Dn(max(Y),A) } x2_eq_y(fdv X,fdv Y) { start X in Sqrt_Up(min(Y))..Sqrt_Dn(max(Y)) start Y in min(X)*min(X)..max(X)*max(X) } xy_eq_z(fdv X,fdv Y,fdv Z) { start X in ite(max(Y)==0,0,min(Z)/>max(Y)) .. ite(min(Y)==0,max_integer,max(Z)/max(X)) .. ite(min(X)==0,max_integer,max(Z)/= 2 */ { start Y in Full_Coeff_Power_Var(A,dom(N)) /* to ensure Y 2 */ { start Y in Full_Var_Power_Coeff(dom(X),A) /* to ensure Y0 start Y in 1..max_integer start X in dom(Z)//dom(Y) start Y in dom(Z)//dom(X) case max(Z)==0 && min(Y)>0 start X in { 0 } case max(Z)==0 && min(X)>0 start Y in { 0 } } /*-------------------------------------------------------------------------* * MINIMUM * * * *-------------------------------------------------------------------------*/ /*------------* * Partial AC * *------------*/ min_x_y_eq_z(fdv X,fdv Y,fdv Z) { start (c1) Z in math_min(min(X),min(Y)) .. max_integer /* Z >= min(X,Y) */ start (c2) Z in 0 .. max(X) /* Z <= X */ start (c3) X in min(Z) .. max_integer start (c4) Z in 0 .. max(Y) /* Z <= Y */ start (c5) Y in min(Z) .. max_integer wait_switch case min(Y)>max(Z) /* case : Y != Z */ stop c1 stop c2 stop c3 stop c4 stop c5 start Z in min(X) .. max(X) /* Z = X */ start X in min(Z) .. max(Z) case min(X)>max(Z) /* case : X != Z */ stop c1 stop c2 stop c3 stop c4 stop c5 start Z in min(Y) .. max(Y) /* Z = Y */ start Y in min(Z) .. max(Z) } min_x_a_eq_z(fdv X,int A,fdv Z) { start (c1) Z in math_min(min(X),A) .. max_integer /* Z >= min(X,A) */ start (c2) Z in 0 .. max(X) /* Z <= X */ start (c3) X in min(Z) .. max_integer start Z in 0 .. A /* Z <= A */ wait_switch case A>max(Z) /* case : A != Z */ stop c1 stop c2 stop c3 start Z in min(X) .. max(X) /* Z = X */ start X in min(Z) .. max(Z) } /*------------* * Full AC * *------------*/ min_x_y_eq_z_F(fdv X,fdv Y,fdv Z) { start (c1) Z in dom(X) : dom(Y) /* Z = X or Z = Y */ start (c2) Z in 0 .. max(X) /* Z <= X */ start (c3) X in min(Z) .. max_integer start (c4) Z in 0 .. max(Y) /* Z <= Y */ start (c5) Y in min(Z) .. max_integer wait_switch case Range_Test_Null_Inter(dom(Y),dom(Z)) /* case : Y != Z */ stop c1 stop c2 stop c3 stop c4 stop c5 start Z in dom(X) /* Z = X */ start X in dom(Z) case Range_Test_Null_Inter(dom(X),dom(Z)) /* case : X != Z */ stop c1 stop c2 stop c3 stop c4 stop c5 start Z in dom(Y) /* Z = Y */ start Y in dom(Z) } min_x_a_eq_z_F(fdv X,int A,fdv Z) { start (c1) Z in dom(X) : {A} /* Z = X or Z = A */ start (c2) Z in 0 .. max(X) /* Z <= X */ start (c3) X in min(Z) .. max_integer start Z in 0 .. A /* Z <= A */ wait_switch case A>max(Z) /* case : A != Z */ stop c1 stop c2 stop c3 start Z in dom(X) /* Z = X */ start X in dom(Z) } /*-------------------------------------------------------------------------* * MAXIMUM * * * *-------------------------------------------------------------------------*/ /*------------* * Partial AC * *------------*/ max_x_y_eq_z(fdv X,fdv Y,fdv Z) { start (c1) Z in 0 .. math_max(max(X),max(Y)) /* Z <= max(X,Y) */ start (c2) Z in min(X) .. max_integer /* Z >= X */ start (c3) X in 0 .. max(Z) start (c4) Z in min(Y) .. max_integer /* Z >= Y */ start (c5) Y in 0 .. max(Z) wait_switch case max(Y)= X */ start (c3) X in 0 .. max(Z) start Z in A .. max_integer /* Z >= A */ wait_switch case A= X */ start (c3) X in 0 .. max(Z) start (c4) Z in min(Y) .. max_integer /* Z >= Y */ start (c5) Y in 0 .. max(Z) wait_switch case Range_Test_Null_Inter(dom(Y),dom(Z)) /* case : Y != Z */ stop c1 stop c2 stop c3 stop c4 stop c5 start Z in dom(X) /* Z = X */ start X in dom(Z) case Range_Test_Null_Inter(dom(X),dom(Z)) /* case : X != Z */ stop c1 stop c2 stop c3 stop c4 stop c5 start Z in dom(Y) /* Z = Y */ start Y in dom(Z) } max_x_a_eq_z_F(fdv X,int A,fdv Z) { start (c1) Z in dom(X) : {A} /* Z = X or Z = A */ start (c2) Z in min(X) .. max_integer /* Z >= X */ start (c3) X in 0 .. max(Z) start Z in A .. max_integer /* Z >= A */ wait_switch case A= max(Y) /* case : X >= Y */ stop c1 stop c2 stop c3 start X in min(Y) + min(Z) .. max(Y) + max(Z) start Y in min(X) - max(Z) .. max(X) - min(Z) start Z in min(X) - max(Y) .. max(X) - min(Y) case min(Y) >= max(X) /* case : Y >= X */ stop c1 stop c2 stop c3 start X in min(Y) - max(Z) .. max(Y) - min(Z) start Y in min(X) + min(Z) .. max(X) + max(Z) start Z in min(Y) - max(X) .. max(Y) - min(X) } /*------------* * Full AC * *------------*/ abs_x_minus_a_eq_z(fdv X,int A,fdv Z) { start (c1) X in A + min(Z) .. A + max(Z) : A - max(Z) .. A - min(Z) start (c2) Z in min(X) - A .. max(X) - A : A - max(X) .. A - min(X) wait_switch case min(X) >= A /* case : X >= A */ stop c1 stop c2 start X in A + min(Z) .. A + max(Z) start Z in min(X) - A .. max(X) - A case A >= max(X) /* case : A >= X */ stop c1 stop c2 start X in A - max(Z) .. A - min(Z) start Z in A - max(X) .. A - min(X) } abs_x_minus_y_eq_z_F(fdv X,fdv Y,fdv Z) { start (c1) X in dom(Y) ++ dom(Z) : dom(Y) -- dom(Z) start (c2) Y in dom(X) ++ dom(Z) : dom(X) -- dom(Z) start (c3) Z in dom(X) -- dom(Y) : dom(Y) -- dom(X) wait_switch case min(X) >= max(Y) /* case : X >= Y */ stop c1 stop c2 stop c3 start X in dom(Y) ++ dom(Z) start Y in dom(X) -- dom(Z) start Z in dom(X) -- dom(Y) case min(Y) >= max(X) /* case : Y >= X */ stop c1 stop c2 stop c3 start X in dom(Y) -- dom(Z) start Y in dom(X) ++ dom(Z) start Z in dom(Y) -- dom(X) } abs_x_minus_a_eq_z_F(fdv X,int A,fdv Z) { start (c1) X in dom(Z) + A : { A } -- dom(Z) start (c2) Z in dom(X) - A : { A } -- dom(X) wait_switch case min(X) >= A /* case : X >= A */ stop c1 stop c2 start X in dom(Z) + A start Z in dom(X) - A case A >= max(X) /* case : A >= X */ stop c1 stop c2 start X in { A } -- dom(Z) start Z in { A } -- dom(X) } /*-------------------------------------------------------------------------* * EUCLIDIAN DIVISION WITH REMAINDER * * * *-------------------------------------------------------------------------*/ /*------------* * Partial AC * *------------*/ quot_rem_x_y_r_eq_z(fdv X,fdv Y,fdv R,fdv Z) /* X = Z*Y+R */ { start Y in min(R)+1 .. max_integer /* R < Y */ start R in 0 .. max(Y)-1 start Z in (min(X)-max(R)) /> max(Y) .. (max(X)-min(R)) /< min(Y) start R in min(X)-(max(Z)*max(Y)) .. max(X)-(min(Z)*min(Y)) start X in min(Z)*min(Y)+min(R) .. max(Z)*max(Y)+max(R) start Y in (min(X)/<(max(Z)+1))+1..max_integer /* Y > X/(Z+1) */ start X in 0..(max(Z)+1)*max(Y)-1 wait_switch case min(Z)>0 start Y in (min(X)-max(R)) /> max(Z).. (max(X)-min(R)) /< min(Z) } quot_rem_a_y_r_eq_z(int A,fdv Y,fdv R,fdv Z) /* A = Z*Y+R */ { start Y in min(R)+1 .. max_integer /* R < Y */ start R in 0 .. max(Y)-1 start Y in (A/<(max(Z)+1))+1..max_integer /* Y > A/(Z+1) */ start Z in (A-max(R)) /> max(Y) .. (A-min(R)) /< min(Y) start R in A-(max(Z)*max(Y)) .. A-(min(Z)*min(Y)) wait_switch case min(Z)>0 start Y in (A-max(R)) /> max(Z)..(A-min(R)) /< min(Z) } quot_rem_x_a_r_eq_z(fdv X,int A,fdv R,fdv Z) /* X = Z*A+R */ { start R in 0 .. A-1 /* R < A */ start Z in (min(X)-max(R)) /> A .. (max(X)-min(R)) /< A start R in min(X)-(max(Z)*A) .. max(X)-(min(Z)*A) start X in min(Z)*A+min(R) .. max(Z)*A+max(R) start X in 0..(max(Z)+1)*A-1 /* X < (Z+1)*A */ } /*------------* * Full AC * *------------*/ quot_rem_x_y_r_eq_z_F(fdv X,fdv Y,fdv R,fdv Z) /* X = Z*Y+R */ { start Y in min(R)+1 .. max_integer /* R < Y */ start R in 0 .. max(Y)-1 start Z in (dom(X)--dom(R))//dom(Y) start R in dom(X)--(dom(Z)**dom(Y)) start X in dom(Z)**dom(Y)++dom(R) start Y in (min(X)/<(max(Z)+1))+1..max_integer /* Y > X/(Z+1) */ start X in 0..(max(Z)+1)*max(Y)-1 wait_switch case min(Z)>0 start Y in (dom(X)--dom(R)) // dom(Z) } quot_rem_a_y_r_eq_z_F(int A,fdv Y,fdv R,fdv Z) /* A = Z*Y+R */ { start Y in min(R)+1 .. max_integer /* R < Y */ start R in 0 .. max(Y)-1 start Y in (A/<(max(Z)+1))+1..max_integer /* Y > A/(Z+1) */ start Z in ({ A }--dom(R))//dom(Y) start R in { A }--(dom(Z)**dom(Y)) wait_switch case min(Z)>0 start Y in ({ A }--dom(R)) // dom(Z) } quot_rem_x_a_r_eq_z_F(fdv X,int A,fdv R,fdv Z) /* X = Z*A+R */ { start R in 0 .. A-1 /* R < A */ start Z in (dom(X)--dom(R))/A start R in dom(X)--(dom(Z)*A) start X in (dom(Z)*A)++dom(R) start X in 0..(max(Z)+1)*A-1 /* X < (Z+1)*A */ } ./gprolog-1.3.0/src/BipsFD/fd_infos.pl0000644004425400513100000000547310547154127016032 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_infos.pl * * Descr.: FD variable information management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_infos.pl,v 1.11 2007/01/04 10:35:03 diaz Exp $ */ :- built_in_fd. '$use_fd_infos'. fd_vector_max(Max) :- set_bip_name(fd_vector_max, 1), '$call_c_test'('Fd_Vector_Max_1'(Max)). fd_set_vector_max(Max) :- set_bip_name(fd_set_vector_max, 1), '$call_c'('Fd_Set_Vector_Max_1'(Max)). fd_max_integer(Inf) :- set_bip_name(fd_max_integer, 1), '$call_c_test'('Fd_Max_Integer_1'(Inf)). fd_min(Fdv, Min) :- set_bip_name(fd_min, 2), '$call_c_test'('Fd_Min_2'(Fdv, Min)). fd_max(Fdv, Max) :- set_bip_name(fd_max, 2), '$call_c_test'('Fd_Max_2'(Fdv, Max)). fd_dom(Fdv, List) :- set_bip_name(fd_domain, 2), '$call_c_test'('Fd_Dom_2'(Fdv, List)). fd_size(Fdv, Size) :- set_bip_name(fd_size, 2), '$call_c_test'('Fd_Size_2'(Fdv, Size)). fd_has_extra_cstr(Fdv) :- set_bip_name(fd_has_extra_cstr, 1), '$call_c_test'('Fd_Has_Extra_Cstr_1'(Fdv)). fd_has_vector(Fdv) :- set_bip_name(fd_has_vector, 1), '$call_c_test'('Fd_Has_Vector_1'(Fdv)). fd_use_vector(Fdv) :- set_bip_name(fd_use_vector, 1), '$call_c_test'('Fd_Use_Vector_1'(Fdv)). ./gprolog-1.3.0/src/BipsFD/oper_supp.c0000644004425400513100000003732010547154130016054 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : oper_supp.c * * Descr.: FD Operation support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: oper_supp.c,v 1.9 2007/01/04 10:35:04 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" #include "engine_fd.h" #include "bips_fd.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static unsigned Find_Expon_General(unsigned x, unsigned y, unsigned *pxn); /*-------------------------------------------------------------------------* * POWER * * * *-------------------------------------------------------------------------*/ unsigned Power(unsigned x, unsigned n) { unsigned xn, xp; if (n == 0 || x == 1) return 1; if (x == 0) return 0; if (n >= sizeof(unsigned) * 8) return INTERVAL_MAX_INTEGER; xn = 1; xp = x; while (n) { if (n & 1) xn *= xp; xp *= xp; n >>= 1; } return ((long) xn > 0 && (long) xn <= INTERVAL_MAX_INTEGER) ? xn : INTERVAL_MAX_INTEGER; } /*-------------------------------------------------------------------------* * NTH_ROOT_DN * * * *-------------------------------------------------------------------------*/ unsigned Nth_Root_Dn(unsigned y, unsigned n) { unsigned old, new; unsigned n1 = n - 1; unsigned oldn1; int bit, nb; if (y == 0) return 0; if (n == 0) return INTERVAL_MAX_INTEGER; if (n >= sizeof(unsigned) * 8) return 1; bit = Most_Significant_Bit(y); if ((unsigned) (bit + 1) < n) return 1; nb = bit / n; new = 1 << nb; old = new; oldn1 = Power(old, n1); new = (n1 * old + y / oldn1) / n; do { old = new; oldn1 = Power(old, n1); new = (n1 * old + y / oldn1) / n; } while (new < old); return old; } /*-------------------------------------------------------------------------* * NTH_ROOT_UP * * * *-------------------------------------------------------------------------*/ unsigned Nth_Root_Up(unsigned y, unsigned n) { unsigned x; if (y == 0) return 0; if (n == 0) return 0; x = Nth_Root_Dn(y, n); if (Power(x, n) != y) x++; return x; } /*-------------------------------------------------------------------------* * NTH_ROOT_EXACT * * * *-------------------------------------------------------------------------*/ unsigned Nth_Root_Exact(unsigned y, unsigned n) { unsigned x; if (y == 0) return 0; x = Nth_Root_Dn(y, n); if (Power(x, n) != y) return (unsigned) -1; return x; } /*-------------------------------------------------------------------------* * SQRT_DN * * * *-------------------------------------------------------------------------*/ unsigned Sqrt_Dn(unsigned y) { unsigned old, new; if (y == 0) return 0; new = y; do { old = new; new = (old + y / old) >> 1; } while (new < old); return old; } /*-------------------------------------------------------------------------* * SQRT_UP * * * *-------------------------------------------------------------------------*/ unsigned Sqrt_Up(unsigned y) { unsigned x; x = Sqrt_Dn(y); if (x * x != y) x++; return x; } /*-------------------------------------------------------------------------* * SQRT_EXACT * * * *-------------------------------------------------------------------------*/ unsigned Sqrt_Exact(unsigned y) { unsigned x; x = Sqrt_Dn(y); if (x * x != y) return (unsigned) -1; return x; } /*-------------------------------------------------------------------------* * FIND_EXPON_DN * * * *-------------------------------------------------------------------------*/ unsigned Find_Expon_Dn(unsigned x, unsigned y) { unsigned n; unsigned xn; if (x <= 1 || y == 0) return INTERVAL_MAX_INTEGER; n = Find_Expon_General(x, y, &xn); return n; } /*-------------------------------------------------------------------------* * FIND_EXPON_UP * * * * X must be > 1 and Y must be > 0 * *-------------------------------------------------------------------------*/ unsigned Find_Expon_Up(unsigned x, unsigned y) { unsigned n; unsigned xn; if (x <= 1 || y == 0) return INTERVAL_MAX_INTEGER; n = Find_Expon_General(x, y, &xn); return n + (y != xn); } /*-------------------------------------------------------------------------* * FIND_EXPON_EXACT * * * * X must be > 1 and Y must be > 0 * *-------------------------------------------------------------------------*/ unsigned Find_Expon_Exact(unsigned x, unsigned y) { unsigned n; unsigned xn; if (x <= 1 || y == 0) return INTERVAL_MAX_INTEGER; n = Find_Expon_General(x, y, &xn); if (y != xn) return (unsigned) -1; return n; } /*-------------------------------------------------------------------------* * FIND_EXPON_GENERAL * * * * X must be >1 and Y must be >0 * *-------------------------------------------------------------------------*/ static unsigned Find_Expon_General(unsigned x, unsigned y, unsigned *pxn) { static unsigned txp[sizeof(unsigned) * 8]; unsigned *p = txp; unsigned xp; unsigned prod; unsigned n; unsigned xn; p = txp; xp = x; prod = 1; while (prod < y && (long) xp > 0) { *p++ = xp; prod *= xp; xp *= xp; } n = 0; xn = 1; while (--p >= txp) { xp = *p; n <<= 1; if (y >= xp) { y /= xp; xn *= xp; n |= 1; } } *pxn = xn; return n; } /*-------------------------------------------------------------------------* * FULL_COEFF_POWER_VAR * * * *-------------------------------------------------------------------------*/ void Full_Coeff_Power_Var(Range *y, int a, Range *n) { unsigned an, an0; int i, vec_elem; an = Power(a, n->min); Vector_Allocate(y->vec); if (an > (unsigned) vec_max_integer) { y->extra_cstr = TRUE; Set_To_Empty(y); return; } Vector_Empty(y->vec); y->extra_cstr = FALSE; y->min = an; if (Is_Interval(n)) /* N is Interval */ { an0 = an; for (i = n->min; i <= n->max; i++) { if (an0 > (unsigned) vec_max_integer) goto end_loop; an = an0; Vector_Set_Value(y->vec, an); an0 *= a; } } else /* N is Sparse */ { y->extra_cstr = n->extra_cstr; VECTOR_BEGIN_ENUM(n->vec, vec_elem); an = Power(a, vec_elem); if (an > (unsigned) vec_max_integer) goto end_loop; Vector_Set_Value(y->vec, an); VECTOR_END_ENUM; } end_loop: y->max = an; } /*-------------------------------------------------------------------------* * FULL_FIND_EXPON * * * * Here A>=2 then Y>=1 * *-------------------------------------------------------------------------*/ void Full_Find_Expon(Range *n, int a, Range *y) { int e, min; int i, vec_elem; Vector_Allocate(n->vec); Vector_Empty(n->vec); n->extra_cstr = y->extra_cstr; min = -1; if (Is_Interval(y)) /* Y is Interval */ { for (i = y->min; i <= y->max; i++) { e = Find_Expon_Exact(a, i); if (e >= 0) { if (min < 0) min = e; Vector_Set_Value(n->vec, e); } } } else /* Y is Sparse */ { VECTOR_BEGIN_ENUM(y->vec, vec_elem); e = Find_Expon_Exact(a, vec_elem); if (e >= 0) { if (min < 0) min = e; Vector_Set_Value(n->vec, e); } VECTOR_END_ENUM; } n->min = min; n->max = e; } /*-------------------------------------------------------------------------* * FULL_VAR_POWER_COEFF * * * *-------------------------------------------------------------------------*/ void Full_Var_Power_Coeff(Range *y, Range *x, int a) { unsigned xa; int i, vec_elem; xa = Power(x->min, a); Vector_Allocate(y->vec); if (xa > (unsigned) vec_max_integer) { y->extra_cstr = TRUE; Set_To_Empty(y); return; } Vector_Empty(y->vec); y->extra_cstr = FALSE; y->min = xa; if (Is_Interval(x)) /* X is Interval */ { for (i = x->min; i <= x->max; i++) { xa = Power(i, a); if (xa > (unsigned) vec_max_integer) goto end_loop; Vector_Set_Value(y->vec, xa); } } else /* X is Sparse */ { y->extra_cstr = x->extra_cstr; VECTOR_BEGIN_ENUM(x->vec, vec_elem); xa = Power(vec_elem, a); if (xa > (unsigned) vec_max_integer) goto end_loop; Vector_Set_Value(y->vec, xa); VECTOR_END_ENUM; } end_loop: y->max = xa; } /*-------------------------------------------------------------------------* * FULL_NTH_ROOT * * * *-------------------------------------------------------------------------*/ void Full_Nth_Root(Range *x, Range *y, int a) { int e, min; int i, vec_elem; Vector_Allocate(x->vec); Vector_Empty(x->vec); x->extra_cstr = y->extra_cstr; min = -1; if (Is_Interval(y)) /* Y is Interval */ { for (i = y->min; i <= y->max; i++) { e = Nth_Root_Exact(i, a); if (e >= 0) { if (min < 0) min = e; Vector_Set_Value(x->vec, e); } } } else /* Y is Sparse */ { VECTOR_BEGIN_ENUM(y->vec, vec_elem); e = Nth_Root_Exact(vec_elem, a); if (e >= 0) { if (min < 0) min = e; Vector_Set_Value(x->vec, e); } VECTOR_END_ENUM; } x->min = min; x->max = e; } /*-------------------------------------------------------------------------* * FULL_VAR_POWER_2 * * * *-------------------------------------------------------------------------*/ void Full_Var_Power_2(Range *y, Range *x) { unsigned x2; int i, vec_elem; x2 = x->min * x->min; Vector_Allocate(y->vec); if (x2 > (unsigned) vec_max_integer) { y->extra_cstr = TRUE; Set_To_Empty(y); return; } Vector_Empty(y->vec); y->extra_cstr = FALSE; y->min = x2; if (Is_Interval(x)) /* X is Interval */ { for (i = x->min; i <= x->max; i++) { x2 = i * i; if (x2 > (unsigned) vec_max_integer) goto end_loop; Vector_Set_Value(y->vec, x2); } } else /* X is Sparse */ { y->extra_cstr = x->extra_cstr; VECTOR_BEGIN_ENUM(x->vec, vec_elem); x2 = vec_elem * vec_elem; if (x2 > (unsigned) vec_max_integer) goto end_loop; Vector_Set_Value(y->vec, x2); VECTOR_END_ENUM; } end_loop: y->max = x2; } /*-------------------------------------------------------------------------* * FULL_SQRT_VAR * * * *-------------------------------------------------------------------------*/ void Full_Sqrt_Var(Range *x, Range *y) { int e, min; int i, vec_elem; Vector_Allocate(x->vec); Vector_Empty(x->vec); x->extra_cstr = y->extra_cstr; min = -1; if (Is_Interval(y)) /* Y is Interval */ { for (i = y->min; i <= y->max; i++) { e = Sqrt_Exact(i); if (e >= 0) { if (min < 0) min = e; Vector_Set_Value(x->vec, e); } } } else /* Y is Sparse */ { VECTOR_BEGIN_ENUM(y->vec, vec_elem); e = Sqrt_Exact(vec_elem); if (e >= 0) { if (min < 0) min = e; Vector_Set_Value(x->vec, e); } VECTOR_END_ENUM; } x->min = min; x->max = e; } /*-------------------------------------------------------------------------* * FULL_VAR_DIV_VAR * * * *-------------------------------------------------------------------------*/ void Full_Var_Div_Var(Range *x, Range *z, Range *y) { if (y->min == 0) { Range_Init_Interval(x, 0, INTERVAL_MAX_INTEGER); return; } Range_Copy(x, z); Range_Div_Range(x, y); } ./gprolog-1.3.0/src/BipsFD/fd_prime.pl0000644004425400513100000000376710547154127016034 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_prime.pl * * Descr.: prime constraint management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_prime.pl,v 1.11 2007/01/04 10:35:03 diaz Exp $ */ :- built_in_fd. '$use_fd_prime'. fd_prime(X) :- set_bip_name(fd_prime, 1), fd_tell(prime_x(X)). fd_not_prime(X) :- set_bip_name(fd_not_prime, 1), fd_tell(not_prime_x(X)). ./gprolog-1.3.0/src/BipsFD/fd_symbolic_c.c0000644004425400513100000002711310547154127016641 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_symbolic_c.c * * Descr.: symbolic constraints management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_symbolic_c.c,v 1.12 2007/01/04 10:35:03 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" #include "engine_fd.h" #include "bips_fd.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static Bool Fd_All_Different_Rec(WamWord list_word, long x_tag, WamWord x_word, WamWord save_list_word); /*-------------------------------------------------------------------------* * FD_ALL_DIFFERENT_1 * * * *-------------------------------------------------------------------------*/ Bool Fd_All_Different_1(WamWord list_word, WamWord save_list_word) { WamWord word, tag_mask; WamWord *lst_adr; DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) return TRUE; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); if (tag_mask != TAG_REF_MASK && tag_mask != TAG_INT_MASK && tag_mask != TAG_FDV_MASK) Pl_Err_Type(type_fd_variable, word); return Fd_All_Different_Rec(Cdr(lst_adr), tag_mask, word, save_list_word) && Fd_All_Different_1(Cdr(lst_adr), save_list_word); } /*-------------------------------------------------------------------------* * FD_ALL_DIFFERENT_REC * * * *-------------------------------------------------------------------------*/ static Bool Fd_All_Different_Rec(WamWord list_word, long x_tag, WamWord x_word, WamWord save_list_word) { WamWord word, tag_mask; WamWord *lst_adr; int ret; DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) return TRUE; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); if (tag_mask != TAG_REF_MASK && tag_mask != TAG_INT_MASK && tag_mask != TAG_FDV_MASK) Pl_Err_Type(type_fd_variable, word); if (x_tag == TAG_INT_MASK) ret = (tag_mask == TAG_INT_MASK) ? x_word != word : x_neq_c(word, x_word); else ret = (tag_mask == TAG_INT_MASK) ? x_neq_c(x_word, word) : x_neq_y(x_word, word); return ret && Fd_All_Different_Rec(Cdr(lst_adr), x_tag, x_word, save_list_word); } /*-------------------------------------------------------------------------* * FD_ELEMENT_I * * * *-------------------------------------------------------------------------*/ void Fd_Element_I(Range *i, WamWord *l) { int n = *l; /* I in 1..N in sparse mode */ Range_Init_Interval(i, 1, n); Range_Becomes_Sparse(i); } /*-------------------------------------------------------------------------* * FD_ELEMENT_I_TO_V * * * *-------------------------------------------------------------------------*/ void Fd_Element_I_To_V(Range *v, Range *i, WamWord *l) { int val; int j; /* when I changes -> update V */ Vector_Allocate(v->vec); Vector_Empty(v->vec); if (i->min == i->max || Is_Interval(i)) { for (j = i->min; j <= i->max; j++) { val = l[j]; Vector_Set_Value(v->vec, val); } } else { VECTOR_BEGIN_ENUM(i->vec, j); val = l[j]; Vector_Set_Value(v->vec, val); VECTOR_END_ENUM; } Range_From_Vector(v); } /*-------------------------------------------------------------------------* * FD_ELEMENT_V_TO_I * * * *-------------------------------------------------------------------------*/ void Fd_Element_V_To_I(Range *i, Range *v, WamWord *l) { int val; int n; int j; /* when V changes -> update I */ Vector_Allocate(i->vec); Vector_Empty(i->vec); n = *l; for (j = 1; j <= n; j++) { val = l[j]; /* val=Lj */ if (Range_Test_Value(v, val)) Vector_Set_Value(i->vec, j); } Range_From_Vector(i); } /*-------------------------------------------------------------------------* * FD_ELEMENT_VAR_I * * * *-------------------------------------------------------------------------*/ void Fd_Element_Var_I(Range *i, WamWord *l) { int n = *l; /* I in 1..N in sparse mode */ Range_Init_Interval(i, 1, n); Range_Becomes_Sparse(i); } /*-------------------------------------------------------------------------* * FD_ELEMENT_VAR_I_TO_V * * * *-------------------------------------------------------------------------*/ void Fd_Element_Var_I_To_V(Range *v, Range *i, WamWord **l) { WamWord *fdv_adr; int j; v->extra_cstr = FALSE; v->vec = 0; Set_To_Empty(v); /* when I or L changes -> update V */ if (i->min == i->max || Is_Interval(i)) { for (j = i->min; j <= i->max; j++) { fdv_adr = l[j]; Range_Union(v, Range(fdv_adr)); } } else { VECTOR_BEGIN_ENUM(i->vec, j); fdv_adr = l[j]; Range_Union(v, Range(fdv_adr)); VECTOR_END_ENUM; } } /*-------------------------------------------------------------------------* * FD_ELEMENT_VAR_V_TO_I * * * *-------------------------------------------------------------------------*/ void Fd_Element_Var_V_To_I(Range *i, Range *v, WamWord **l) { WamWord *fdv_adr; long n; int j; Vector_Allocate(i->vec); Vector_Empty(i->vec); /* when V or L changes -> update I */ n = (long) *l; for (j = 1; j <= n; j++) { fdv_adr = l[j]; if (!Range_Test_Null_Inter(Range(fdv_adr), v)) Vector_Set_Value(i->vec, j); } Range_From_Vector(i); } /*-------------------------------------------------------------------------* * FD_ELEMENT_V_TO_XI * * * *-------------------------------------------------------------------------*/ Bool Fd_Element_V_To_Xi(int i, WamWord **array, Range *v) { WamWord *fdv_adr = array[i]; if (Fd_Variable_Is_Ground(fdv_adr)) return Fd_Tell_Int_Range(fdv_adr, v); return Fd_Tell_Range_Range(fdv_adr, v); } /*-------------------------------------------------------------------------* * FD_ATMOST * * * *-------------------------------------------------------------------------*/ Bool Fd_Atmost(int n, WamWord **array, int v) { WamWord **p; WamWord word = Tag_INT(v); long size = (long) array[0]; int nb = 0; int i; array++; p = array; for (i = 0; i < size; i++) { if (FD_Tag_Value(*p) == word) nb++; p++; } if (nb > n) return FALSE; if (nb == n) { p = array; for (i = 0; i < size; i++) { if (!Fd_Variable_Is_Ground(*p)) if (!Fd_Tell_Not_Value(*p, v)) return FALSE; p++; } } return TRUE; } /*-------------------------------------------------------------------------* * FD_ATLEAST * * * *-------------------------------------------------------------------------*/ Bool Fd_Atleast(int n, WamWord **array, int v) { WamWord **p; long size = (long) array[0]; int nb = size; int i; array++; p = array; for (i = 0; i < size; i++) { if (!Range_Test_Value(Range(*p), v)) nb--; p++; } if (nb < n) return FALSE; if (nb == n) { p = array; for (i = 0; i < size; i++) { if (Range_Test_Value(Range(*p), v)) if (!Fd_Tell_Value(*p, v)) return FALSE; p++; } } return TRUE; } /*-------------------------------------------------------------------------* * FD_EXACTLY * * * *-------------------------------------------------------------------------*/ Bool Fd_Exactly(int n, WamWord **array, int v) { WamWord **p; WamWord word = Tag_INT(v); long size = (long) array[0]; int nb1 = 0, nb2 = size; int i; array++; p = array; for (i = 0; i < size; i++) { if (FD_Tag_Value(*p) == word) nb1++; else if (!Range_Test_Value(Range(*p), v)) nb2--; p++; } if (nb1 > n || nb2 < n) return FALSE; if (nb1 == n) { p = array; for (i = 0; i < size; i++) { if (!Fd_Variable_Is_Ground(*p)) if (!Fd_Tell_Not_Value(*p, v)) return FALSE; p++; } return TRUE; } if (nb2 == n) { p = array; for (i = 0; i < size; i++) { if (Range_Test_Value(Range(*p), v)) if (!Fd_Tell_Value(*p, v)) return FALSE; p++; } } return TRUE; } ./gprolog-1.3.0/src/BipsFD/bips_fd.h0000644004425400513100000000352610547154127015462 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : bips_fd.h * * Descr.: general header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: bips_fd.h,v 1.9 2007/01/04 10:35:03 diaz Exp $ */ #include "math_supp.h" #include "oper_supp.h" ./gprolog-1.3.0/src/BipsFD/fd_values_c.c0000644004425400513100000006156110547154130016316 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_values_c.c * * Descr.: FD variable values management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_values_c.c,v 1.12 2007/01/04 10:35:04 diaz Exp $ */ #include #include "engine_pl.h" #include "bips_pl.h" #include "engine_fd.h" #include "bips_fd.h" /*---------------------------------* * Constants * *---------------------------------*/ #define METHOD_MIN 0 #define METHOD_MAX 1 #define METHOD_MIDDLE 2 #define METHOD_LIMITS 3 #define METHOD_RANDOM_V 4 #define METHOD_STANDARD 0 #define METHOD_FIRST_FAIL 1 #define METHOD_MOST_CONSTRAINED 2 #define METHOD_SMALLEST 3 #define METHOD_LARGEST 4 #define METHOD_MAX_REGRET 5 #define METHOD_RANDOM 6 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef Bool (*CmpFct) (); /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static Bool Indomain_Min(WamWord *fdv_adr); static Bool Indomain_Max(WamWord *fdv_adr); static Bool Indomain_Middle(WamWord *fdv_adr); static Bool Indomain_Limits(WamWord *fdv_adr); static Bool Indomain_Random(WamWord *fdv_adr); static Bool Cmp_First_Fail(WamWord *last_fdv_adr, WamWord *new_fdv_adr); static Bool Cmp_Most_Constrained(WamWord *last_fdv_adr, WamWord *new_fdv_adr); static Bool Cmp_Smallest(WamWord *last_fdv_adr, WamWord *new_fdv_adr); static Bool Cmp_Largest(WamWord *last_fdv_adr, WamWord *new_fdv_adr); static Bool Cmp_Max_Regret(WamWord *last_fdv_adr, WamWord *new_fdv_adr); #define INDOMAIN_MIN_ALT X24696E646F6D61696E5F6D696E5F616C74 #define INDOMAIN_MAX_ALT X24696E646F6D61696E5F6D61785F616C74 #define INDOMAIN_MIDDLE_ALT X24696E646F6D61696E5F6D6964646C655F616C74 #define INDOMAIN_LIMITS_ALT X24696E646F6D61696E5F6C696D6974735F616C74 #define INDOMAIN_RANDOM_ALT X24696E646F6D61696E5F72616E646F6D5F616C74 #define EXTRA_CSTR_ALT X2465787472615F637374725F616C74 Prolog_Prototype(INDOMAIN_MIN_ALT, 0); Prolog_Prototype(INDOMAIN_MAX_ALT, 0); Prolog_Prototype(INDOMAIN_MIDDLE_ALT, 0); Prolog_Prototype(INDOMAIN_LIMITS_ALT, 0); Prolog_Prototype(INDOMAIN_RANDOM_ALT, 0); Prolog_Prototype(EXTRA_CSTR_ALT, 0); /* defined in fd_values_fd.fd */ Bool fd_domain(WamWord list_word, WamWord l_word, WamWord u_word); Bool fd_domain_r(WamWord list_word, WamWord r_word); /*-------------------------------------------------------------------------* * FD_DOMAIN_BOOL_1 * * * *-------------------------------------------------------------------------*/ Bool Fd_Domain_Bool_1(WamWord list_word) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr; DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK || tag_mask == TAG_INT_MASK || tag_mask == TAG_FDV_MASK) return Fd_Check_For_Bool_Var(word); save_list_word = list_word; for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); if (!Fd_Check_For_Bool_Var(Car(lst_adr))) return FALSE; list_word = Cdr(lst_adr); } return TRUE; } /*-------------------------------------------------------------------------* * FD_DOMAIN_2 * * * *-------------------------------------------------------------------------*/ Bool Fd_Domain_2(WamWord list_word, WamWord r_word) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr; DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK || tag_mask == TAG_INT_MASK || tag_mask == TAG_FDV_MASK) return fd_domain_r(word, r_word); save_list_word = list_word; for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); if (!fd_domain_r(Car(lst_adr), r_word)) return FALSE; list_word = Cdr(lst_adr); } return TRUE; } /*-------------------------------------------------------------------------* * FD_DOMAIN_3 * * * *-------------------------------------------------------------------------*/ Bool Fd_Domain_3(WamWord list_word, WamWord l_word, WamWord u_word) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr; if (l_word == Tag_INT(0) && u_word == Tag_INT(1)) return Fd_Domain_Bool_1(list_word); DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK || tag_mask == TAG_INT_MASK || tag_mask == TAG_FDV_MASK) return fd_domain(word, l_word, u_word); save_list_word = list_word; for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); if (!fd_domain(Car(lst_adr), l_word, u_word)) return FALSE; list_word = Cdr(lst_adr); } return TRUE; } /*-------------------------------------------------------------------------* * INDOMAIN_2 * * * *-------------------------------------------------------------------------*/ Bool Indomain_2(WamWord fdv_word, WamWord method_word) { WamWord word, tag_mask; WamWord *fdv_adr; Fd_Deref_Check_Fd_Var(fdv_word, word, tag_mask); if (tag_mask == TAG_INT_MASK) return TRUE; fdv_adr = UnTag_FDV(word); switch (Rd_Integer_Check(method_word)) { case METHOD_MIN: return Indomain_Min(fdv_adr); case METHOD_MAX: return Indomain_Max(fdv_adr); case METHOD_MIDDLE: return Indomain_Middle(fdv_adr); case METHOD_LIMITS: return Indomain_Limits(fdv_adr); case METHOD_RANDOM_V: return Indomain_Random(fdv_adr); } return TRUE; } /*-------------------------------------------------------------------------* * INDOMAIN_MIN * * * *-------------------------------------------------------------------------*/ static Bool Indomain_Min(WamWord *fdv_adr) { Range *range; int cur, end; range = Range(fdv_adr); end = Max(fdv_adr); cur = Min(fdv_adr); A(0) = (WamWord) fdv_adr; A(1) = (WamWord) range; A(2) = end; A(3) = cur; Create_Choice_Point((CodePtr) Prolog_Predicate(INDOMAIN_MIN_ALT, 0), 4); return Fd_Assign_Value(fdv_adr, cur); } /*-------------------------------------------------------------------------* * INDOMAIN_MIN_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Indomain_Min_Alt_0(void) { WamWord *fdv_adr; Range *range; int cur, end; Update_Choice_Point((CodePtr) Prolog_Predicate(INDOMAIN_MIN_ALT, 0), 0); fdv_adr = (WamWord *) AB(B, 0); range = (Range *) AB(B, 1); end = AB(B, 2); cur = AB(B, 3); cur = Range_Next_After(range, cur); SYS_VAR_FD_BCKTS++; if (cur != end) { #if 0 /* the following data is unchanged */ AB(B, 0) = (WamWord) fdv_adr; AB(B, 1) = (WamWord) range; AB(B, 2) = end; #endif AB(B, 3) = cur; } else if (Extra_Cstr(fdv_adr)) Update_Choice_Point((CodePtr) Prolog_Predicate(EXTRA_CSTR_ALT, 0), 0); else Delete_Choice_Point(0); return Fd_Assign_Value(fdv_adr, cur); } /*-------------------------------------------------------------------------* * INDOMAIN_MAX * * * *-------------------------------------------------------------------------*/ static Bool Indomain_Max(WamWord *fdv_adr) { Range *range; int cur, end; range = Range(fdv_adr); end = Min(fdv_adr); cur = Max(fdv_adr); A(0) = (WamWord) fdv_adr; A(1) = (WamWord) range; A(2) = end; A(3) = cur; Create_Choice_Point((CodePtr) Prolog_Predicate(INDOMAIN_MAX_ALT, 0), 4); return Fd_Assign_Value(fdv_adr, cur); } /*-------------------------------------------------------------------------* * INDOMAIN_MAX_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Indomain_Max_Alt_0(void) { WamWord *fdv_adr; Range *range; int cur, end; Update_Choice_Point((CodePtr) Prolog_Predicate(INDOMAIN_MAX_ALT, 0), 0); fdv_adr = (WamWord *) AB(B, 0); range = (Range *) AB(B, 1); end = AB(B, 2); cur = AB(B, 3); cur = Range_Next_Before(range, cur); SYS_VAR_FD_BCKTS++; if (cur != end) { #if 0 /* the following data is unchanged */ AB(B, 0) = (WamWord) fdv_adr; AB(B, 1) = (WamWord) range; AB(B, 2) = end; #endif AB(B, 3) = cur; } else if (Extra_Cstr(fdv_adr)) Update_Choice_Point((CodePtr) Prolog_Predicate(EXTRA_CSTR_ALT, 0), 0); else Delete_Choice_Point(0); return Fd_Assign_Value(fdv_adr, cur); } /*-------------------------------------------------------------------------* * INDOMAIN_MIDDLE * * * *-------------------------------------------------------------------------*/ static Bool Indomain_Middle(WamWord *fdv_adr) { Range *range; int end, cur; int cur_left, cur_right; Bool is_right; int i; range = Range(fdv_adr); end = Max(fdv_adr); i = (Nb_Elem(fdv_adr) + 1) / 2; cur = Range_Ith_Elem(range, i); cur_left = cur_right = cur; is_right = Nb_Elem(fdv_adr) % 2; /* is_rigth if nb of elements is odd */ A(0) = (WamWord) fdv_adr; A(1) = (WamWord) range; A(2) = end; A(3) = cur_left; A(4) = cur_right; A(5) = (WamWord) is_right; Create_Choice_Point((CodePtr) Prolog_Predicate(INDOMAIN_MIDDLE_ALT, 0), 6); return Fd_Assign_Value(fdv_adr, cur); } /*-------------------------------------------------------------------------* * INDOMAIN_MIDDLE_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Indomain_Middle_Alt_0(void) { WamWord *fdv_adr; Range *range; int end, cur; int cur_left, cur_right; Bool is_right; Update_Choice_Point((CodePtr) Prolog_Predicate(INDOMAIN_MIDDLE_ALT, 0), 0); fdv_adr = (WamWord *) AB(B, 0); range = (Range *) AB(B, 1); end = AB(B, 2); cur_left = AB(B, 3); cur_right = AB(B, 4); is_right = (Bool) AB(B, 5); if (is_right) { cur_left = Range_Next_Before(range, cur_left); cur = cur_left; is_right = FALSE; } else { cur_right = Range_Next_After(range, cur_right); cur = cur_right; is_right = TRUE; } SYS_VAR_FD_BCKTS++; if (cur != end) { #if 0 /* the following data is unchanged */ AB(B, 0) = (WamWord) fdv_adr; AB(B, 1) = (WamWord) range; AB(B, 2) = end; #endif AB(B, 3) = cur_left; AB(B, 4) = cur_right; AB(B, 5) = is_right; } else if (Extra_Cstr(fdv_adr)) ALTB(B) = (CodePtr) Prolog_Predicate(EXTRA_CSTR_ALT, 0); else Delete_Last_Choice_Point(); return Fd_Assign_Value(fdv_adr, cur); } /*-------------------------------------------------------------------------* * INDOMAIN_LIMITS * * * *-------------------------------------------------------------------------*/ static Bool Indomain_Limits(WamWord *fdv_adr) { Range *range; int end, cur; int cur_left, cur_right; Bool is_right; int i; range = Range(fdv_adr); i = Nb_Elem(fdv_adr) / 2 + 1; end = Range_Ith_Elem(range, i); cur = Min(fdv_adr); cur_left = cur; cur_right = -1; is_right = FALSE; A(0) = (WamWord) fdv_adr; A(1) = (WamWord) range; A(2) = end; A(3) = cur_left; A(4) = cur_right; A(5) = (WamWord) is_right; Create_Choice_Point((CodePtr) Prolog_Predicate(INDOMAIN_LIMITS_ALT, 0), 6); return Fd_Assign_Value(fdv_adr, cur); } /*-------------------------------------------------------------------------* * INDOMAIN_LIMITS_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Indomain_Limits_Alt_0(void) { WamWord *fdv_adr; Range *range; int end, cur; int cur_left, cur_right; Bool is_right; Update_Choice_Point((CodePtr) Prolog_Predicate(INDOMAIN_LIMITS_ALT, 0), 0); fdv_adr = (WamWord *) AB(B, 0); range = (Range *) AB(B, 1); end = AB(B, 2); cur_left = AB(B, 3); cur_right = AB(B, 4); is_right = (Bool) AB(B, 5); if (is_right) { cur_left = Range_Next_After(range, cur_left); cur = cur_left; is_right = FALSE; } else { cur_right = (cur_right >= 0) ? Range_Next_Before(range, cur_right) : Max(fdv_adr); cur = cur_right; is_right = TRUE; } SYS_VAR_FD_BCKTS++; if (cur != end) { #if 0 /* the following data is unchanged */ AB(B, 0) = (WamWord) fdv_adr; AB(B, 1) = (WamWord) range; AB(B, 2) = end; #endif AB(B, 3) = cur_left; AB(B, 4) = cur_right; AB(B, 5) = is_right; } else if (Extra_Cstr(fdv_adr)) ALTB(B) = (CodePtr) Prolog_Predicate(EXTRA_CSTR_ALT, 0); else Delete_Last_Choice_Point(); return Fd_Assign_Value(fdv_adr, cur); } /*-------------------------------------------------------------------------* * INDOMAIN_RANDOM * * * *-------------------------------------------------------------------------*/ static Bool Indomain_Random(WamWord *fdv_adr) { Vector vec; int n, cur; if (!Fd_Use_Vector(fdv_adr)) return FALSE; n = Nb_Elem(fdv_adr); A(0) = (WamWord) fdv_adr; A(1) = n; Create_Choice_Point((CodePtr) Prolog_Predicate(INDOMAIN_RANDOM_ALT, 0), 2 + vec_size); vec = (Vector) &AB(B, 2 - 1 + vec_size); Vector_Copy(vec, Vec(fdv_adr)); cur = Vector_Ith_Elem(vec, M_Random_Integer(n) + 1); Vector_Reset_Value(vec, cur); return Fd_Assign_Value(fdv_adr, cur); } /*-------------------------------------------------------------------------* * INDOMAIN_RANDOM_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Indomain_Random_Alt_0(void) { WamWord *fdv_adr; Vector vec; int n, cur; Update_Choice_Point((CodePtr) Prolog_Predicate(INDOMAIN_RANDOM_ALT, 0), 0); fdv_adr = (WamWord *) AB(B, 0); n = AB(B, 1); vec = (Vector) (&AB(B, 2 - 1 + vec_size)); SYS_VAR_FD_BCKTS++; n--; if (n > 1) { #if 0 /* the following data is unchanged */ AB(B, 0) = (WamWord) fdv_adr; #endif AB(B, 1) = n; #if 0 /* the following data is changed below */ AB(B,2...2-1+vecsize) = ... #endif } else if (Extra_Cstr(fdv_adr)) ALTB(B) = (CodePtr) Prolog_Predicate(EXTRA_CSTR_ALT, 0); else Delete_Last_Choice_Point(); cur = Vector_Ith_Elem(vec, M_Random_Integer(n) + 1); Vector_Reset_Value(vec, cur); return Fd_Assign_Value(fdv_adr, cur); } /*-------------------------------------------------------------------------* * EXTRA_CSTR_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Extra_Cstr_Alt_0(void) { WamWord *fdv_adr; fdv_adr = (WamWord *) AB(B, 0); Delete_Choice_Point(0); Fd_Display_Extra_Cstr(fdv_adr); return FALSE; } /*-------------------------------------------------------------------------* * FD_SEL_ARRAY_FROM_LIST_2 * * * *-------------------------------------------------------------------------*/ Bool Fd_Sel_Array_From_List_2(WamWord list_word, WamWord sel_array_word) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr; int n = 0; WamWord *fdv_adr; WamWord *array; WamWord *save_array; array = CS; save_list_word = list_word; save_array = array; array++; /* +1 for the nb of elems */ for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_FDV_MASK && tag_mask != TAG_INT_MASK) Pl_Err_Type(type_fd_variable, word); if (tag_mask == TAG_FDV_MASK) { fdv_adr = UnTag_FDV(word); *array++ = (WamWord) fdv_adr; n++; } list_word = Cdr(lst_adr); } *save_array = n; CS = array; return Get_Integer(Cstr_Offset(save_array), sel_array_word); } /*-------------------------------------------------------------------------* * FD_SEL_ARRAY_PICK_VAR_4 * * * *-------------------------------------------------------------------------*/ Bool Fd_Sel_Array_Pick_Var_4(WamWord sel_array_word, WamWord method_word, WamWord reorder_word, WamWord fdv_word) #if 1 #define PACK_ARRAY #endif { WamWord **array; WamWord **p, **end; CmpFct cmp_meth; long n; int i; WamWord *fdv_adr; WamWord **res_elem = NULL; Bool reorder; #ifdef PACK_ARRAY WamWord **q; int nb_ground = 0; #endif array = (WamWord **) (Cstr_Stack + Rd_Integer_Check(sel_array_word)); n = (long) array[0]; if (n == 0) return FALSE; array++; end = array + n; reorder = Rd_Integer_Check(reorder_word); switch (Rd_Integer_Check(method_word)) { case METHOD_FIRST_FAIL: cmp_meth = Cmp_First_Fail; break; case METHOD_MOST_CONSTRAINED: cmp_meth = Cmp_Most_Constrained; break; case METHOD_SMALLEST: cmp_meth = Cmp_Smallest; break; case METHOD_LARGEST: cmp_meth = Cmp_Largest; break; case METHOD_MAX_REGRET: cmp_meth = Cmp_Max_Regret; break; case METHOD_RANDOM: for (;;) { i = M_Random_Integer(n); end--; n--; fdv_adr = array[i]; array[i] = *end; *end = fdv_adr; if (!Fd_Variable_Is_Ground(fdv_adr)) { Trail_OV(array - 1); array[-1] = (WamWord *) n; goto finish; } if (n == 0) return FALSE; } } for (p = array; p < end; p++) { fdv_adr = *p; if (!Fd_Variable_Is_Ground(fdv_adr)) { if (res_elem == NULL) res_elem = p; else if ((*cmp_meth) (*res_elem, fdv_adr)) { if (reorder) { *p = *res_elem; *res_elem = fdv_adr; } else res_elem = p; } } #ifdef PACK_ARRAY else nb_ground++; #endif } if (res_elem == NULL) return FALSE; #ifdef PACK_ARRAY if (n > 50 && nb_ground >= n / 2) { n = n - nb_ground; Trail_MV(array - 1, n + 1); array[-1] = (WamWord *) n; for (p = q = array; n; p++) { fdv_adr = *p; if (!Fd_Variable_Is_Ground(fdv_adr)) { *q++ = *p; n--; } } } #endif fdv_adr = *res_elem; finish: return Unify(Tag_REF(fdv_adr), fdv_word); } /*-------------------------------------------------------------------------* * CMP_FIRST_FAIL * * * *-------------------------------------------------------------------------*/ static Bool Cmp_First_Fail(WamWord *last_fdv_adr, WamWord *new_fdv_adr) { return Nb_Elem(new_fdv_adr) < Nb_Elem(last_fdv_adr); } /*-------------------------------------------------------------------------* * CMP_MOST_CONSTRAINED * * * *-------------------------------------------------------------------------*/ static Bool Cmp_Most_Constrained(WamWord *last_fdv_adr, WamWord *new_fdv_adr) { int l_nb = Nb_Elem(last_fdv_adr); int n_nb = Nb_Elem(new_fdv_adr); return n_nb < l_nb || (n_nb == l_nb && Nb_Cstr(new_fdv_adr) > Nb_Cstr(last_fdv_adr)); } /*-------------------------------------------------------------------------* * CMP_SMALLEST * * * *-------------------------------------------------------------------------*/ static Bool Cmp_Smallest(WamWord *last_fdv_adr, WamWord *new_fdv_adr) { int l_min = Min(last_fdv_adr); int n_min = Min(new_fdv_adr); return n_min < l_min || (n_min == l_min && Nb_Cstr(new_fdv_adr) > Nb_Cstr(last_fdv_adr)); } /*-------------------------------------------------------------------------* * CMP_LARGEST * * * *-------------------------------------------------------------------------*/ static Bool Cmp_Largest(WamWord *last_fdv_adr, WamWord *new_fdv_adr) { int l_max = Max(last_fdv_adr); int n_max = Max(new_fdv_adr); return n_max > l_max || (n_max == l_max && Nb_Cstr(new_fdv_adr) > Nb_Cstr(last_fdv_adr)); } /*-------------------------------------------------------------------------* * CMP_MAX_REGRET * * * *-------------------------------------------------------------------------*/ static Bool Cmp_Max_Regret(WamWord *last_fdv_adr, WamWord *new_fdv_adr) { int l_diff; int n_diff; int min; min = Min(last_fdv_adr); l_diff = Range_Next_After(Range(last_fdv_adr), min) - min; min = Min(new_fdv_adr); n_diff = Range_Next_After(Range(new_fdv_adr), min) - min; return n_diff > l_diff || (n_diff == l_diff && Nb_Cstr(new_fdv_adr) > Nb_Cstr(last_fdv_adr)); } ./gprolog-1.3.0/src/BipsFD/Makefile.in0000644004425400513100000000322210547152475015745 0ustar diazlocoLIB_BIPS_FD = @LIB_BIPS_FD@ LIB_ENGINE_FD = @LIB_ENGINE_FD@ GPLC = @GPLC@ CC = @CC@ @CFLAGS_MACHINE@ CFLAGS = @CFLAGS@ AR_RC = @AR_RC@ RANLIB = @RANLIB@ LIBNAME = $(LIB_BIPS_FD) OBJLIB = fd_infos@OBJ_SUFFIX@ fd_infos_c@OBJ_SUFFIX@ \ fd_values@OBJ_SUFFIX@ fd_values_c@OBJ_SUFFIX@ fd_values_fd@OBJ_SUFFIX@ \ fd_math@OBJ_SUFFIX@ fd_math_c@OBJ_SUFFIX@ fd_math_fd@OBJ_SUFFIX@ \ fd_bool@OBJ_SUFFIX@ fd_bool_c@OBJ_SUFFIX@ fd_bool_fd@OBJ_SUFFIX@ \ fd_prime@OBJ_SUFFIX@ fd_prime_c@OBJ_SUFFIX@ fd_prime_fd@OBJ_SUFFIX@ \ fd_symbolic@OBJ_SUFFIX@ fd_symbolic_c@OBJ_SUFFIX@ fd_symbolic_fd@OBJ_SUFFIX@ \ fd_optim@OBJ_SUFFIX@ \ math_supp@OBJ_SUFFIX@ \ oper_supp@OBJ_SUFFIX@ \ all_fd_bips@OBJ_SUFFIX@ .SUFFIXES: .SUFFIXES: @OBJ_SUFFIX@ .c .fd .pl $(SUFFIXES) .pl@OBJ_SUFFIX@: $(GPLC) -c $(GPLCFLAGS) --no-redef-error $*.pl .fd@OBJ_SUFFIX@: $(GPLC) -c -C '$(CFLAGS) $(CLFAGS_UNSIGNED_CHAR)' $*.fd .c@OBJ_SUFFIX@: $(GPLC) -c -C '$(CFLAGS) $(CLFAGS_UNSIGNED_CHAR)' $*.c $(LIBNAME): $(OBJLIB) rm -f $(LIBNAME) $(AR_RC)@AR_SEP@$(LIBNAME) $(OBJLIB) $(RANLIB) $(LIBNAME) clean: rm -f *@OBJ_SUFFIX@ $(LIBNAME) distclean: clean # for test t_fd.c: t_fd.fd ../Fd2C/fd2c $(GPLC) --fd-to-c t_fd.fd t@EXE_SUFFIX@: t@OBJ_SUFFIX@ t_fd@OBJ_SUFFIX@ t_c@OBJ_SUFFIX@ ../EngineFD/$(LIB_ENGINE_FD) \ ../EngineFD/fd_to_c.h $(LIBNAME) $(GPLC) -o t@EXE_SUFFIX@ t@OBJ_SUFFIX@ t_fd@OBJ_SUFFIX@ t_c@OBJ_SUFFIX@ # depending on math_supp.h math_supp@OBJ_SUFFIX@: math_supp.h fd_math_c@OBJ_SUFFIX@: math_supp.h fd_bool_c@OBJ_SUFFIX@: math_supp.h ./gprolog-1.3.0/src/BipsFD/fd_bool.pl0000644004425400513100000000717510547154127015650 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_bool.pl * * Descr.: boolean and Meta-constraint predicate management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_bool.pl,v 1.12 2007/01/04 10:35:03 diaz Exp $ */ :- built_in_fd. '$use_fd_bool'. '$truth_of'(Cstr, B) :- '$call_c_test'('Fd_Bool_Meta_3'(Cstr, B, 1)). #\ LE :- set_bip_name(#\, 1), '$call_c_test'('Fd_Bool_Meta_3'(LE, 0, 0)). LE #<=> RE :- set_bip_name(#<=>, 2), '$call_c_test'('Fd_Bool_Meta_3'(LE, RE, 1)). LE #\<=> RE :- set_bip_name(#\<=>, 2), '$call_c_test'('Fd_Bool_Meta_3'(LE, RE, 2)). LE ## RE :- set_bip_name(#, 2), '$call_c_test'('Fd_Bool_Meta_3'(LE, RE, 2)). LE #==> RE :- set_bip_name(#==>, 2), '$call_c_test'('Fd_Bool_Meta_3'(LE, RE, 3)). LE #\==> RE :- set_bip_name(#\==>, 2), '$call_c_test'('Fd_Bool_Meta_3'(LE, RE, 4)). LE #/\ RE :- set_bip_name(#/\, 2), '$call_c_test'('Fd_Bool_Meta_3'(LE, RE, 5)). LE #\/\ RE :- set_bip_name(#\/\, 2), '$call_c_test'('Fd_Bool_Meta_3'(LE, RE, 6)). LE #\/ RE :- set_bip_name(#\/, 2), '$call_c_test'('Fd_Bool_Meta_3'(LE, RE, 7)). LE #\\/ RE :- set_bip_name(#\\/, 2), '$call_c_test'('Fd_Bool_Meta_3'(LE, RE, 8)). % Symbolic boolean constraints fd_cardinality(List, Count) :- fd_max_integer(Inf), set_bip_name(fd_cardinality, 2), '$fd_domain'(Count, 0, Inf), % to check type of Count '$fd_cardinality'(List, Count). '$fd_cardinality'(List, Count) :- '$check_list'(List), '$fd_cardinality1'(List, Count). '$fd_cardinality1'([], 0). '$fd_cardinality1'([C|List], Count1) :- '$fd_cardinality1'(List, Count), '$truth_of'(C, B), Count1 #= Count + B. fd_cardinality(L, List, U) :- set_bip_name(fd_cardinality, 3), '$fd_domain'(Count, L, U), '$fd_cardinality'(List, Count). fd_at_least_one(List) :- set_bip_name(fd_at_least_one, 1), '$fd_cardinality'(List, Count), Count #>= 1 . fd_at_most_one(List) :- set_bip_name(fd_at_most_one, 1), '$fd_cardinality'(List, Count), Count #=< 1 . fd_only_one(List) :- set_bip_name(fd_only_one, 1), '$fd_cardinality'(List, 1). ./gprolog-1.3.0/src/BipsFD/fd_math.pl0000644004425400513100000000626110547154127015641 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_math.pl * * Descr.: mathematical predicate management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_math.pl,v 1.11 2007/01/04 10:35:03 diaz Exp $ */ :- built_in_fd. '$use_fd_math'. LE #= RE :- set_bip_name(#=, 2), '$call_c'('Fd_Set_Full_Ac_Flag_1'(0)), '$call_c_test'('Fd_Eq_2'(LE, RE)). LE #\= RE :- set_bip_name(#\=, 2), '$call_c'('Fd_Set_Full_Ac_Flag_1'(0)), '$call_c_test'('Fd_Neq_2'(LE, RE)). LE #< RE :- set_bip_name(#<, 2), '$call_c'('Fd_Set_Full_Ac_Flag_1'(0)), '$call_c_test'('Fd_Lt_2'(LE, RE)). LE #=< RE :- set_bip_name(#=<, 2), '$call_c'('Fd_Set_Full_Ac_Flag_1'(0)), '$call_c_test'('Fd_Lte_2'(LE, RE)). LE #> RE :- set_bip_name(#>, 2), '$call_c'('Fd_Set_Full_Ac_Flag_1'(0)), '$call_c_test'('Fd_Lt_2'(RE, LE)). LE #>= RE :- set_bip_name(#>=, 2), '$call_c'('Fd_Set_Full_Ac_Flag_1'(0)), '$call_c_test'('Fd_Lte_2'(RE, LE)). LE #=# RE :- set_bip_name(#=, 2), '$call_c'('Fd_Set_Full_Ac_Flag_1'(1)), '$call_c_test'('Fd_Eq_2'(LE, RE)). LE #\=# RE :- set_bip_name(#\=, 2), '$call_c'('Fd_Set_Full_Ac_Flag_1'(1)), '$call_c_test'('Fd_Neq_2'(LE, RE)). LE #<# RE :- set_bip_name(#<, 2), '$call_c'('Fd_Set_Full_Ac_Flag_1'(1)), '$call_c_test'('Fd_Lt_2'(LE, RE)). LE #=<# RE :- set_bip_name(#=<, 2), '$call_c'('Fd_Set_Full_Ac_Flag_1'(1)), '$call_c_test'('Fd_Lte_2'(LE, RE)). LE #># RE :- set_bip_name(#>, 2), '$call_c'('Fd_Set_Full_Ac_Flag_1'(1)), '$call_c_test'('Fd_Lt_2'(RE, LE)). LE #>=# RE :- set_bip_name(#>=, 2), '$call_c'('Fd_Set_Full_Ac_Flag_1'(1)), '$call_c_test'('Fd_Lte_2'(RE, LE)). ./gprolog-1.3.0/src/BipsFD/fd_bool_c.c0000644004425400513100000011464110547154127015756 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_bool_c.c * * Descr.: boolean and Meta-constraint predicate management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_bool_c.c,v 1.12 2007/01/04 10:35:03 diaz Exp $ */ #define OBJ_INIT Fd_Bool_Initializer #include "engine_pl.h" #include "bips_pl.h" #include "engine_fd.h" #include "bips_fd.h" /*---------------------------------* * Constants * *---------------------------------*/ #define BOOL_STACK_SIZE 1024 #define VARS_STACK_SIZE 1024 #define NOT 0 #define EQUIV 1 #define NEQUIV 2 #define IMPLY 3 #define NIMPLY 4 #define AND 5 #define NAND 6 #define OR 7 #define NOR 8 #define EQ 9 /* warning EQ must have same */ #define NEQ 10 /* parity than EQ_F and ZERO */ #define LT 11 #define GTE 12 #define GT 13 #define LTE 14 #define EQ_F 15 #define NEQ_F 16 #define LT_F 17 #define GTE_F 18 #define GT_F 19 #define LTE_F 20 #define ZERO 21 #define ONE 22 /* must be last */ #define IsVar(op) ((op)>=ONE) #define NB_OF_OP ZERO /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static WamWord bool_tbl[NB_OF_OP]; static WamWord bool_xor; static WamWord stack[BOOL_STACK_SIZE]; static WamWord *sp; static WamWord vars_tbl[VARS_STACK_SIZE]; static WamWord *vars_sp; static Bool (*func_tbl[NB_OF_OP + 2]) (); /*---------------------------------* * Function Prototypes * *---------------------------------*/ static WamWord *Simplify(int sign, WamWord e_word); static void Add_Fd_Variables(WamWord e_word); static Bool Load_Bool_Into_Word(WamWord *exp, int result, WamWord *load_word); static Bool Set_Var(WamWord *exp, int result, WamWord *load_word); static Bool Set_Not(WamWord *exp, int result, WamWord *load_word); static Bool Set_Equiv(WamWord *exp, int result, WamWord *load_word); static Bool Set_Nequiv(WamWord *exp, int result, WamWord *load_word); static Bool Set_Imply(WamWord *exp, int result, WamWord *load_word); static Bool Set_Nimply(WamWord *exp, int result, WamWord *load_word); static Bool Set_And(WamWord *exp, int result, WamWord *load_word); static Bool Set_Nand(WamWord *exp, int result, WamWord *load_word); static Bool Set_Or(WamWord *exp, int result, WamWord *load_word); static Bool Set_Nor(WamWord *exp, int result, WamWord *load_word); static Bool Set_Eq(WamWord *exp, int result, WamWord *load_word); static Bool Set_Neq(WamWord *exp, int result, WamWord *load_word); static Bool Set_Lt(WamWord *exp, int result, WamWord *load_word); static Bool Set_Lte(WamWord *exp, int result, WamWord *load_word); static Bool Set_Zero(WamWord *exp, int result, WamWord *load_word); static Bool Set_One(WamWord *exp, int result, WamWord *load_word); #ifdef DEBUG static void Display_Stack(WamWord *exp); void Write_1(WamWord term_word); #endif /* defined in fd_math_c.c */ Bool Fd_Eq_2(WamWord le_word, WamWord re_word); Bool Fd_Neq_2(WamWord le_word, WamWord re_word); Bool Fd_Lt_2(WamWord le_word, WamWord re_word); Bool Fd_Lte_2(WamWord le_word, WamWord re_word); #define BOOL_CSTR_2(f, a1, a2) \ do \ { \ if (!Fd_Check_For_Bool_Var(a1)) \ return FALSE; \ if (!Fd_Check_For_Bool_Var(a2)) \ return FALSE; \ PRIM_CSTR_2(f, a1, a2); \ } \ while (0) #define BOOL_CSTR_3(f, a1, a2, a3) \ do \ { \ if (!Fd_Check_For_Bool_Var(a1)) \ return FALSE; \ if (!Fd_Check_For_Bool_Var(a2)) \ return FALSE; \ /* a3 is OK */ \ PRIM_CSTR_3(f, a1, a2, a3); \ } \ while (0) /*-------------------------------------------------------------------------* * FD_BOOL_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Fd_Bool_Initializer(void) { bool_tbl[NOT] = Functor_Arity(Create_Atom("#\\"), 1); bool_tbl[EQUIV] = Functor_Arity(Create_Atom("#<=>"), 2); bool_tbl[NEQUIV] = Functor_Arity(Create_Atom("#\\<=>"), 2); bool_tbl[IMPLY] = Functor_Arity(Create_Atom("#==>"), 2); bool_tbl[NIMPLY] = Functor_Arity(Create_Atom("#\\==>"), 2); bool_tbl[AND] = Functor_Arity(Create_Atom("#/\\"), 2); bool_tbl[NAND] = Functor_Arity(Create_Atom("#\\/\\"), 2); bool_tbl[OR] = Functor_Arity(Create_Atom("#\\/"), 2); bool_tbl[NOR] = Functor_Arity(Create_Atom("#\\\\/"), 2); bool_tbl[EQ] = Functor_Arity(Create_Atom("#="), 2); bool_tbl[NEQ] = Functor_Arity(Create_Atom("#\\="), 2); bool_tbl[LT] = Functor_Arity(Create_Atom("#<"), 2); bool_tbl[GTE] = Functor_Arity(Create_Atom("#>="), 2); bool_tbl[GT] = Functor_Arity(Create_Atom("#>"), 2); bool_tbl[LTE] = Functor_Arity(Create_Atom("#=<"), 2); bool_tbl[EQ_F] = Functor_Arity(Create_Atom("#=#"), 2); bool_tbl[NEQ_F] = Functor_Arity(Create_Atom("#\\=#"), 2); bool_tbl[LT_F] = Functor_Arity(Create_Atom("#<#"), 2); bool_tbl[GTE_F] = Functor_Arity(Create_Atom("#>=#"), 2); bool_tbl[GT_F] = Functor_Arity(Create_Atom("#>#"), 2); bool_tbl[LTE_F] = Functor_Arity(Create_Atom("#=<#"), 2); bool_xor = Functor_Arity(Create_Atom("##"), 2); func_tbl[NOT] = Set_Not; func_tbl[EQUIV] = Set_Equiv; func_tbl[NEQUIV] = Set_Nequiv; func_tbl[IMPLY] = Set_Imply; func_tbl[NIMPLY] = Set_Nimply; func_tbl[AND] = Set_And; func_tbl[NAND] = Set_Nand; func_tbl[OR] = Set_Or; func_tbl[NOR] = Set_Nor; func_tbl[EQ] = Set_Eq; func_tbl[NEQ] = Set_Neq; func_tbl[LT] = Set_Lt; func_tbl[GTE] = NULL; func_tbl[GT] = NULL; func_tbl[LTE] = Set_Lte; func_tbl[EQ_F] = NULL; func_tbl[NEQ_F] = NULL; func_tbl[LT_F] = NULL; func_tbl[GTE_F] = NULL; func_tbl[GT_F] = NULL; func_tbl[LTE_F] = NULL; func_tbl[ZERO] = Set_Zero; func_tbl[ONE] = Set_One; } /*-------------------------------------------------------------------------* * FD_BOOL_META_3 * * * *-------------------------------------------------------------------------*/ Bool Fd_Bool_Meta_3(WamWord le_word, WamWord re_word, WamWord op_word) { WamWord word, tag_mask; WamWord *adr, *fdv_adr; WamWord *exp; int op; DEREF(op_word, word, tag_mask); op = UnTag_INT(op_word); H[0] = bool_tbl[op]; /* also works for NOT/1 */ H[1] = le_word; H[2] = re_word; sp = stack; vars_sp = vars_tbl; exp = Simplify(1, Tag_STC(H)); #ifdef DEBUG Display_Stack(exp); DBGPRINTF("\n"); #endif if (!Load_Bool_Into_Word(exp, 1, NULL)) return FALSE; while (--vars_sp >= vars_tbl) if (*vars_sp-- == 0) /* bool var */ { if (!Fd_Check_For_Bool_Var(*vars_sp)) return FALSE; } else /* FD var */ { DEREF(*vars_sp, word, tag_mask); if (tag_mask == TAG_REF_MASK) { adr = UnTag_REF(word); fdv_adr = Fd_New_Variable(); Bind_UV(adr, Tag_REF(fdv_adr)); } } return TRUE; } /*-------------------------------------------------------------------------* * SIMPLIFY * * * * This function returns the result of the simplified boolean expression * * given in e_word. NOT operators are only applied to variables. * * * * Input: * * sign : current sign of the boolean term (-1 (inside a ~) or +1) * * e_word: boolean term to simplify * * * * Output: * * The returned result is a pointer to a node of the following form: * * * * for binary boolean not operator (~): * * [1]: variable involved (tagged word) * * [0]: operator NOT * * * * for unary boolean operators (<=> ~<=> ==> ~==> /\ ~/\ \/ ~\/): * * [2]: right boolean exp (pointer to node) * * [1]: left boolean exp (pointer to node) * * [0]: operator (EQUIV, NEQUIV, IMPLY, NIMPLY, AND, NAND, OR, NOR) * * * * for boolean false value (0): * * [0]: ZERO * * * * for boolean true value (1): * * [0]: ONE * * * * for boolean variable: * * [0]: tagged word * * * * for binary math operators (= \= < >= > <=) (partial / full AC): * * [2]: right math exp (tagged word) * * [1]: left math exp (tagged word) * * [0]: operator (EQ, NEQ, LT, LTE, EQ_F, NEQ_F, LT_F, LTE_F) * * (GT, GTE, GT_F, and GTE_F becomes LT, LTE, GT_F and GTE_F) * * * * These nodes are stored in a hybrid stack. NB: XOR same as NEQUIV * *-------------------------------------------------------------------------*/ static WamWord * Simplify(int sign, WamWord e_word) { WamWord word, tag_mask; WamWord *adr; WamWord f_n, le_word, re_word; int op, n; WamWord *exp, l, r; exp = sp; if (sp - stack > BOOL_STACK_SIZE - 5) Pl_Err_Resource(resource_too_big_fd_constraint); DEREF(e_word, word, tag_mask); if (tag_mask == TAG_REF_MASK || tag_mask == TAG_FDV_MASK) { adr = UnTag_Address(word); if (vars_sp - vars_tbl == VARS_STACK_SIZE) Pl_Err_Resource(resource_too_big_fd_constraint); *vars_sp++ = word; *vars_sp++ = 0; /* bool var */ if (sign != 1) *sp++ = NOT; *sp++ = Tag_REF(adr); return exp; } if (tag_mask == TAG_INT_MASK) { n = UnTag_INT(word); if ((unsigned) n > 1) goto type_error; *sp++ = ZERO + ((sign == 1) ? n : 1 - n); return exp; } if (tag_mask == TAG_ATM_MASK) { word = Put_Structure(ATOM_CHAR('/'), 2); Unify_Value(e_word); Unify_Integer(0); type_error: Pl_Err_Type(type_fd_bool_evaluable, word); } if (tag_mask != TAG_STC_MASK) goto type_error; adr = UnTag_STC(word); f_n = Functor_And_Arity(adr); if (bool_xor == f_n) op = NEQUIV; else { for (op = 0; op < NB_OF_OP; op++) if (bool_tbl[op] == f_n) break; if (op == NB_OF_OP) { word = Put_Structure(ATOM_CHAR('/'), 2); Unify_Atom(Functor(adr)); Unify_Integer(Arity(adr)); goto type_error; } } le_word = Arg(adr, 0); re_word = Arg(adr, 1); if (op == NOT) return Simplify(-sign, le_word); if (sign != 1) op = (op % 2 == EQ % 2) ? op + 1 : op - 1; if (op >= EQ && op <= LTE_F) { Add_Fd_Variables(le_word); Add_Fd_Variables(re_word); n = (op == GT || op == GT_F) ? op - 2 : (op == GTE || op == GTE_F) ? op + 2 : op; *sp++ = n; *sp++ = (n == op) ? le_word : re_word; *sp++ = (n == op) ? re_word : le_word; return exp; } sp += 3; exp[0] = op; exp[1] = (WamWord) Simplify(1, le_word); exp[2] = (WamWord) Simplify(1, re_word); l = *(WamWord *) (exp[1]); r = *(WamWord *) (exp[2]); switch (op) { case EQUIV: if (l == ZERO) /* 0 <=> R is ~R */ return sp = exp, Simplify(-1, re_word); if (l == ONE) /* 1 <=> R is R */ return (WamWord *) exp[2]; if (r == ZERO) /* L <=> 0 is ~L */ return sp = exp, Simplify(-1, le_word); if (r == ONE) /* L <=> 1 is L */ return (WamWord *) exp[1]; if (l == NOT) /* ~X <=> R is X <=> ~R */ { exp[1] += sizeof(WamWord); exp[2] = (WamWord) Simplify(-1, re_word); break; } if (r == NOT) /* L <=> ~X is ~L <=> X */ { exp[1] = (WamWord) Simplify(-1, le_word); exp[2] += sizeof(WamWord); break; } break; case NEQUIV: if (l == ZERO) /* 0 ~<=> R is R */ return (WamWord *) exp[2]; if (l == ONE) /* 1 ~<=> R is ~R */ return sp = exp, Simplify(-1, re_word); if (r == ZERO) /* L ~<=> 0 is L */ return (WamWord *) exp[1]; if (r == ONE) /* L ~<=> 1 is ~L */ return sp = exp, Simplify(-1, le_word); if (l == NOT) /* ~X ~<=> R is X <=> R */ { exp[0] = EQUIV; exp[1] += sizeof(WamWord); break; } if (r == NOT) /* L ~<=> ~X is L <=> X */ { exp[0] = EQUIV; exp[2] += sizeof(WamWord); break; } if (IsVar(l) && !IsVar(r)) /* X ~<=> R is X <=> ~R */ { exp[0] = EQUIV; exp[2] = (WamWord) Simplify(-1, re_word); break; } if (IsVar(r) && !IsVar(l)) /* L ~<=> X is L <=> ~X */ { exp[0] = EQUIV; exp[1] = (WamWord) Simplify(-1, le_word); break; } break; case IMPLY: if (l == ZERO || r == ONE) /* 0 ==> R is 1 , L ==> 1 is 1 */ { sp = exp; *sp++ = ONE; break; } if (l == ONE) /* 1 ==> R is R */ return (WamWord *) exp[2]; if (r == ZERO) /* L ==> 0 is ~L */ return sp = exp, Simplify(-1, le_word); if (l == NOT) /* ~X ==> R is X \/ R */ { exp[0] = OR; exp[1] += sizeof(WamWord); break; } if (r == NOT) /* L ==> ~X is X ==> ~L */ { exp[1] = exp[2] + sizeof(WamWord); exp[2] = (WamWord) Simplify(-1, le_word); break; } break; case NIMPLY: if (l == ZERO || r == ONE) /* 0 ~==> R is 0 , L ~==> 1 is 0 */ { sp = exp; *sp++ = ZERO; break; } if (l == ONE) /* 1 ~==> R is ~R */ return sp = exp, Simplify(-1, re_word); if (r == ZERO) /* L ~==> 0 is L */ return (WamWord *) exp[1]; if (l == NOT) /* ~X ~==> R is X ~\/ R */ { exp[0] = NOR; exp[1] += sizeof(WamWord); break; } if (r == NOT) /* L ~==> ~X is L /\ X */ { exp[0] = AND; exp[2] += sizeof(WamWord); break; } break; case AND: if (l == ZERO || r == ZERO) /* 0 /\ R is 0 , L /\ 0 is 0 */ { sp = exp; *sp++ = ZERO; break; } if (l == ONE) /* 1 /\ R is R */ return (WamWord *) exp[2]; if (r == ONE) /* L /\ 1 is L */ return (WamWord *) exp[1]; if (l == NOT) /* ~X /\ R is R ~==> X */ { exp[0] = NIMPLY; word = exp[1]; exp[1] = exp[2]; exp[2] = word + sizeof(WamWord); break; } if (r == NOT) /* L /\ ~X is L ~==> X */ { exp[0] = NIMPLY; exp[2] += sizeof(WamWord); break; } break; case NAND: if (l == ZERO || r == ZERO) /* 0 ~/\ R is 1 , L ~/\ 0 is 1 */ { sp = exp; *sp++ = ONE; break; } if (l == ONE) /* 1 ~/\ R is ~R */ return sp = exp, Simplify(-1, re_word); if (r == ONE) /* L ~/\ 1 is ~L */ return sp = exp, Simplify(-1, le_word); if (l == NOT) /* ~X ~/\ R is R ==> X */ { exp[0] = IMPLY; word = exp[1]; exp[1] = exp[2]; exp[2] = word + sizeof(WamWord); break; } if (r == NOT) /* L ~/\ ~X is L ==> X */ { exp[0] = IMPLY; exp[2] += sizeof(WamWord); break; } break; case OR: if (l == ONE || r == ONE) /* 1 \/ R is 1 , L \/ 1 is 1 */ { sp = exp; *sp++ = ONE; break; } if (l == ZERO) /* 0 \/ R is R */ return (WamWord *) exp[2]; if (r == ZERO) /* L \/ 0 is L */ return (WamWord *) exp[1]; if (l == NOT) /* ~X \/ R is X ==> R */ { exp[0] = IMPLY; exp[1] += sizeof(WamWord); break; } if (r == NOT) /* L \/ ~X is X ==> L */ { exp[0] = IMPLY; word = exp[1]; exp[1] = exp[2] + sizeof(WamWord); exp[2] = word; break; } break; case NOR: if (l == ONE || r == ONE) /* 1 ~\/ R is 0 , L ~\/ 1 is 0 */ { sp = exp; *sp++ = ZERO; break; } if (l == ZERO) /* 0 ~\/ R is ~R */ return sp = exp, Simplify(-1, re_word); if (r == ZERO) /* L ~\/ 0 is ~L */ return sp = exp, Simplify(-1, le_word); if (l == NOT) /* ~X ~\/ R is X ~==> R */ { exp[0] = NIMPLY; exp[1] += sizeof(WamWord); break; } if (r == NOT) /* L ~\/ ~X is X ~==> L */ { exp[0] = NIMPLY; word = exp[1]; exp[1] = exp[2] + sizeof(WamWord); exp[2] = word; break; } break; } return exp; } #ifdef DEBUG /*-------------------------------------------------------------------------* * DISPLAY_STACK * * * *-------------------------------------------------------------------------*/ static void Display_Stack(WamWord *exp) { int op = exp[0]; WamWord *le = (WamWord *) (exp[1]); WamWord *re = (WamWord *) (exp[2]); switch (op) { case NOT: DBGPRINTF("%s", atom_tbl[Functor_Of(bool_tbl[op])].name); DBGPRINTF(" "); Write_1(exp[1]); break; case EQUIV: case NEQUIV: case IMPLY: case NIMPLY: case AND: case NAND: case OR: case NOR: DBGPRINTF("("); Display_Stack(le); DBGPRINTF(" "); DBGPRINTF("%s", atom_tbl[Functor_Of(bool_tbl[op])].name); DBGPRINTF(" "); Display_Stack(re); DBGPRINTF(")"); break; case EQ: case NEQ: case LT: case LTE: case GT: case GTE: case EQ_F: case NEQ_F: case LT_F: case LTE_F: case GT_F: case GTE_F: Write_1(exp[1]); DBGPRINTF(" "); DBGPRINTF("%s", atom_tbl[Functor_Of(bool_tbl[op])].name); DBGPRINTF(" "); Write_1(exp[2]); break; case ZERO: DBGPRINTF("0"); break; case ONE: DBGPRINTF("1"); break; default: Write_1(*exp); } } #endif /*-------------------------------------------------------------------------* * ADD_FD_VARIABLES * * * *-------------------------------------------------------------------------*/ static void Add_Fd_Variables(WamWord e_word) { WamWord word, tag_mask; WamWord *adr; int i; DEREF(e_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) { if (vars_sp - vars_tbl == VARS_STACK_SIZE) Pl_Err_Resource(resource_too_big_fd_constraint); *vars_sp++ = word; *vars_sp++ = 1; /* FD var */ return; } if (tag_mask == TAG_LST_MASK) { adr = UnTag_LST(word); Add_Fd_Variables(Car(adr)); Add_Fd_Variables(Cdr(adr)); } if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(word); i = Arity(adr); do Add_Fd_Variables(Arg(adr, --i)); while (i); } } /*-------------------------------------------------------------------------* * LOAD_BOOL_INTO_WORD * * * * This loads a boolean term into a tagged word. * * Input: * * exp : boolean term to load * * result : which result is expected: * * 0=false, 1=true, * * 2=result into the word pointed by load_word. * * * * Output: * * load_word: if result=2 it will contain the tagged word of the term: * * a or a * *-------------------------------------------------------------------------*/ static Bool Load_Bool_Into_Word(WamWord *exp, int result, WamWord *load_word) { unsigned long op = *exp; if (op >= EQ_F && op <= LTE_F) { full_ac = 1; op = op - EQ_F + EQ; } else full_ac = 0; return (*((op <= ONE) ? func_tbl[op] : Set_Var)) (exp, result, load_word); } /*-------------------------------------------------------------------------* * SET_ZERO * * * *-------------------------------------------------------------------------*/ static Bool Set_Zero(WamWord *exp, int result, WamWord *load_word) { if (result == 0) /* 0 is false */ return TRUE; if (result == 1) /* 0 is true */ return FALSE; /* 0 = B */ return Get_Integer(0, *load_word); } /*-------------------------------------------------------------------------* * SET_ONE * * * *-------------------------------------------------------------------------*/ static Bool Set_One(WamWord *exp, int result, WamWord *load_word) { if (result == 0) /* 1 is false */ return FALSE; if (result == 1) /* 1 is true */ return TRUE; /* 1 = B */ return Get_Integer(1, *load_word); } /*-------------------------------------------------------------------------* * SET_VAR * * * *-------------------------------------------------------------------------*/ static Bool Set_Var(WamWord *exp, int result, WamWord *load_word) { if (result == 0) /* X is false */ return Get_Integer(0, *exp); if (result == 1) /* X is true */ return Get_Integer(1, *exp); *load_word = *exp; /* X = B */ return TRUE; } /*-------------------------------------------------------------------------* * SET_NOT * * * *-------------------------------------------------------------------------*/ static Bool Set_Not(WamWord *exp, int result, WamWord *load_word) { if (result == 0) /* ~X is false */ return Get_Integer(1, exp[1]); if (result == 1) /* ~X is true */ return Get_Integer(0, exp[1]); /* ~X=B */ *load_word = Tag_REF(Fd_New_Bool_Variable()); BOOL_CSTR_2(not_x_eq_b, exp[1], *load_word); return TRUE; } /*-------------------------------------------------------------------------* * SET_EQUIV * * * *-------------------------------------------------------------------------*/ static Bool Set_Equiv(WamWord *exp, int result, WamWord *load_word) { WamWord load_l, load_r; if (!Load_Bool_Into_Word((WamWord *) (exp[1]), 2, &load_l) || !Load_Bool_Into_Word((WamWord *) (exp[2]), 2, &load_r)) return FALSE; if (result == 0) /* L <=> R is false */ { BOOL_CSTR_2(not_x_eq_b, load_l, load_r); return TRUE; } if (result == 1) /* L <=> R is true */ return Fd_Math_Unify_X_Y(load_l, load_r); /* L <=> R = B */ *load_word = Tag_REF(Fd_New_Bool_Variable()); BOOL_CSTR_3(x_equiv_y_eq_b, load_l, load_r, *load_word); return TRUE; } /*-------------------------------------------------------------------------* * SET_NEQUIV * * * *-------------------------------------------------------------------------*/ static Bool Set_Nequiv(WamWord *exp, int result, WamWord *load_word) { WamWord load_l, load_r; if (result <= 1) /* L ~<=> R is true or false */ return Set_Equiv(exp, 1 - result, load_word); if (!Load_Bool_Into_Word((WamWord *) (exp[1]), 2, &load_l) || !Load_Bool_Into_Word((WamWord *) (exp[2]), 2, &load_r)) return FALSE; /* L ~<=> R = B */ *load_word = Tag_REF(Fd_New_Bool_Variable()); BOOL_CSTR_3(x_nequiv_y_eq_b, load_l, load_r, *load_word); return TRUE; } /*-------------------------------------------------------------------------* * SET_IMPLY * * * *-------------------------------------------------------------------------*/ static Bool Set_Imply(WamWord *exp, int result, WamWord *load_word) { WamWord load_l, load_r; if (result == 0) /* L ==> R is false */ return Load_Bool_Into_Word((WamWord *) (exp[1]), 1, &load_l) && Load_Bool_Into_Word((WamWord *) (exp[2]), 0, &load_r); if (!Load_Bool_Into_Word((WamWord *) (exp[1]), 2, &load_l) || !Load_Bool_Into_Word((WamWord *) (exp[2]), 2, &load_r)) return FALSE; if (result == 1) /* L ==> R is true */ { BOOL_CSTR_2(x_imply_y_eq_1, load_l, load_r); return TRUE; } /* L ==> R = B */ *load_word = Tag_REF(Fd_New_Bool_Variable()); BOOL_CSTR_3(x_imply_y_eq_b, load_l, load_r, *load_word); return TRUE; } /*-------------------------------------------------------------------------* * SET_NIMPLY * * * *-------------------------------------------------------------------------*/ static Bool Set_Nimply(WamWord *exp, int result, WamWord *load_word) { WamWord load_l, load_r; if (result <= 1) /* L ~==> R is true or false */ return Set_Imply(exp, 1 - result, load_word); if (!Load_Bool_Into_Word((WamWord *) (exp[1]), 2, &load_l) || !Load_Bool_Into_Word((WamWord *) (exp[2]), 2, &load_r)) return FALSE; /* L ~==> R = B */ *load_word = Tag_REF(Fd_New_Bool_Variable()); BOOL_CSTR_3(x_nimply_y_eq_b, load_l, load_r, *load_word); return TRUE; } /*-------------------------------------------------------------------------* * SET_AND * * * *-------------------------------------------------------------------------*/ static Bool Set_And(WamWord *exp, int result, WamWord *load_word) { WamWord load_l, load_r; if (result == 1) /* L /\ R is true */ return Load_Bool_Into_Word((WamWord *) (exp[1]), 1, NULL) && Load_Bool_Into_Word((WamWord *) (exp[2]), 1, NULL); if (!Load_Bool_Into_Word((WamWord *) (exp[1]), 2, &load_l) || !Load_Bool_Into_Word((WamWord *) (exp[2]), 2, &load_r)) return FALSE; if (result == 0) /* L /\ R is false */ { BOOL_CSTR_2(x_and_y_eq_0, load_l, load_r); return TRUE; } /* L /\ R = B */ *load_word = Tag_REF(Fd_New_Bool_Variable()); BOOL_CSTR_3(x_and_y_eq_b, load_l, load_r, *load_word); return TRUE; } /*-------------------------------------------------------------------------* * SET_NAND * * * *-------------------------------------------------------------------------*/ static Bool Set_Nand(WamWord *exp, int result, WamWord *load_word) { WamWord load_l, load_r; if (result <= 1) /* L ~/\ R is true or false */ return Set_And(exp, 1 - result, load_word); if (!Load_Bool_Into_Word((WamWord *) (exp[1]), 2, &load_l) || !Load_Bool_Into_Word((WamWord *) (exp[2]), 2, &load_r)) return FALSE; /* L ~/\ R = B */ *load_word = Tag_REF(Fd_New_Bool_Variable()); BOOL_CSTR_3(x_nand_y_eq_b, load_l, load_r, *load_word); return TRUE; } /*-------------------------------------------------------------------------* * SET_OR * * * *-------------------------------------------------------------------------*/ static Bool Set_Or(WamWord *exp, int result, WamWord *load_word) { WamWord load_l, load_r; if (result == 0) /* L \/ R is false */ return Load_Bool_Into_Word((WamWord *) (exp[1]), 0, NULL) && Load_Bool_Into_Word((WamWord *) (exp[2]), 0, NULL); if (!Load_Bool_Into_Word((WamWord *) (exp[1]), 2, &load_l) || !Load_Bool_Into_Word((WamWord *) (exp[2]), 2, &load_r)) return FALSE; if (result == 1) /* L \/ R is true */ { BOOL_CSTR_2(x_or_y_eq_1, load_l, load_r); return TRUE; } /* L \/ R = B */ *load_word = Tag_REF(Fd_New_Bool_Variable()); BOOL_CSTR_3(x_or_y_eq_b, load_l, load_r, *load_word); return TRUE; } /*-------------------------------------------------------------------------* * SET_NOR * * * *-------------------------------------------------------------------------*/ static Bool Set_Nor(WamWord *exp, int result, WamWord *load_word) { WamWord load_l, load_r; if (result <= 1) /* L ~\/ R is true or false */ return Set_Or(exp, 1 - result, load_word); if (!Load_Bool_Into_Word((WamWord *) (exp[1]), 2, &load_l) || !Load_Bool_Into_Word((WamWord *) (exp[2]), 2, &load_r)) return FALSE; /* L ~\/ R = B */ *load_word = Tag_REF(Fd_New_Bool_Variable()); BOOL_CSTR_3(x_nor_y_eq_b, load_l, load_r, *load_word); return TRUE; } /*-------------------------------------------------------------------------* * SET_EQ * * * *-------------------------------------------------------------------------*/ static Bool Set_Eq(WamWord *exp, int result, WamWord *load_word) { WamWord le_word, re_word; int mask; WamWord l_word, r_word; long c; le_word = exp[1]; re_word = exp[2]; if (result == 0) /* L = R is false */ return Fd_Neq_2(le_word, re_word); if (result == 1) /* L = R is true */ return Fd_Eq_2(le_word, re_word); *load_word = Tag_REF(Fd_New_Bool_Variable()); #ifdef DEBUG cur_op = (full_ac) ? "truth#=#" : "truth#="; #endif if (!Load_Left_Right(FALSE, le_word, re_word, &mask, &c, &l_word, &r_word) || !Term_Math_Loading(l_word, r_word)) return FALSE; switch (mask) { case MASK_EMPTY: return Get_Integer(c == 0, *load_word); case MASK_LEFT: if (c > 0) return Get_Integer(0, *load_word); MATH_CSTR_3(truth_x_eq_c, l_word, Tag_INT(-c), *load_word); return TRUE; case MASK_RIGHT: if (c < 0) return Get_Integer(0, *load_word); MATH_CSTR_3(truth_x_eq_c, r_word, Tag_INT(c), *load_word); return TRUE; } if (c > 0) { MATH_CSTR_4(truth_x_plus_c_eq_y, l_word, Tag_INT(c), r_word, *load_word); return TRUE; } if (c < 0) { MATH_CSTR_4(truth_x_plus_c_eq_y, r_word, Tag_INT(-c), l_word, *load_word); return TRUE; } MATH_CSTR_3(truth_x_eq_y, l_word, r_word, *load_word); return TRUE; } /*-------------------------------------------------------------------------* * SET_NEQ * * * *-------------------------------------------------------------------------*/ static Bool Set_Neq(WamWord *exp, int result, WamWord *load_word) { WamWord le_word, re_word; int mask; WamWord l_word, r_word; long c; le_word = exp[1]; re_word = exp[2]; if (result == 0) /* L \= R is false */ return Fd_Eq_2(le_word, re_word); if (result == 1) /* L \= R is true */ return Fd_Neq_2(le_word, re_word); *load_word = Tag_REF(Fd_New_Bool_Variable()); #ifdef DEBUG cur_op = (full_ac) ? "truth#\\=#" : "truth#\\="; #endif if (!Load_Left_Right(FALSE, le_word, re_word, &mask, &c, &l_word, &r_word) || !Term_Math_Loading(l_word, r_word)) return FALSE; switch (mask) { case MASK_EMPTY: return Get_Integer(c != 0, *load_word); case MASK_LEFT: if (c > 0) return Get_Integer(1, *load_word); MATH_CSTR_3(truth_x_neq_c, l_word, Tag_INT(-c), *load_word); return TRUE; case MASK_RIGHT: if (c < 0) return Get_Integer(1, *load_word); MATH_CSTR_3(truth_x_neq_c, r_word, Tag_INT(c), *load_word); return TRUE; } if (c > 0) { MATH_CSTR_4(truth_x_plus_c_neq_y, l_word, Tag_INT(c), r_word, *load_word); return TRUE; } if (c < 0) { MATH_CSTR_4(truth_x_plus_c_neq_y, r_word, Tag_INT(-c), l_word, *load_word); return TRUE; } MATH_CSTR_3(truth_x_neq_y, l_word, r_word, *load_word); return TRUE; } /*-------------------------------------------------------------------------* * SET_LT * * * *-------------------------------------------------------------------------*/ static Bool Set_Lt(WamWord *exp, int result, WamWord *load_word) { WamWord le_word, re_word; int mask; WamWord l_word, r_word; long c; le_word = exp[1]; re_word = exp[2]; if (result == 0) /* L < R is false */ return Fd_Lte_2(re_word, le_word); if (result == 1) /* L < R is true */ return Fd_Lt_2(le_word, re_word); *load_word = Tag_REF(Fd_New_Bool_Variable()); #ifdef DEBUG cur_op = (full_ac) ? "truth#<#" : "truth#<"; #endif if (!Load_Left_Right(FALSE, le_word, re_word, &mask, &c, &l_word, &r_word) || !Term_Math_Loading(l_word, r_word)) return FALSE; switch (mask) { case MASK_EMPTY: return Get_Integer(c < 0, *load_word); case MASK_LEFT: if (c >= 0) return Get_Integer(0, *load_word); PRIM_CSTR_3(truth_x_lte_c, l_word, Tag_INT(-c - 1), *load_word); return TRUE; case MASK_RIGHT: if (c < 0) return Get_Integer(1, *load_word); PRIM_CSTR_3(truth_x_gte_c, r_word, Tag_INT(c + 1), *load_word); return TRUE; } if (c > 0) { PRIM_CSTR_4(truth_x_plus_c_lte_y, l_word, Tag_INT(c + 1), r_word, *load_word); return TRUE; } if (c < 0) { PRIM_CSTR_4(truth_x_plus_c_gte_y, r_word, Tag_INT(-c - 1), l_word, *load_word); return TRUE; } PRIM_CSTR_3(truth_x_lt_y, l_word, r_word, *load_word); return TRUE; } /*-------------------------------------------------------------------------* * SET_LTE * * * *-------------------------------------------------------------------------*/ static Bool Set_Lte(WamWord *exp, int result, WamWord *load_word) { WamWord le_word, re_word; int mask; WamWord l_word, r_word; long c; le_word = exp[1]; re_word = exp[2]; if (result == 0) /* L <= R is false */ return Fd_Lt_2(re_word, le_word); if (result == 1) /* L <= R is true */ return Fd_Lte_2(le_word, re_word); *load_word = Tag_REF(Fd_New_Bool_Variable()); #ifdef DEBUG cur_op = (full_ac) ? "truth#=<#" : "truth#=<"; #endif if (!Load_Left_Right(FALSE, le_word, re_word, &mask, &c, &l_word, &r_word) || !Term_Math_Loading(l_word, r_word)) return FALSE; switch (mask) { case MASK_EMPTY: return Get_Integer(c <= 0, *load_word); case MASK_LEFT: if (c > 0) return Get_Integer(0, *load_word); PRIM_CSTR_3(truth_x_lte_c, l_word, Tag_INT(-c), *load_word); return TRUE; case MASK_RIGHT: if (c <= 0) return Get_Integer(1, *load_word); PRIM_CSTR_3(truth_x_gte_c, r_word, Tag_INT(c), *load_word); return TRUE; } if (c > 0) { PRIM_CSTR_4(truth_x_plus_c_lte_y, l_word, Tag_INT(c), r_word, *load_word); return TRUE; } if (c < 0) { PRIM_CSTR_4(truth_x_plus_c_gte_y, r_word, Tag_INT(-c), l_word, *load_word); return TRUE; } PRIM_CSTR_3(truth_x_lte_y, l_word, r_word, *load_word); return TRUE; } ./gprolog-1.3.0/src/BipsFD/fd_symbolic.pl0000644004425400513100000000645010547154127016531 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_symbolic.pl * * Descr.: symbolic constraints management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_symbolic.pl,v 1.11 2007/01/04 10:35:03 diaz Exp $ */ :- built_in_fd. '$use_fd_symbolic'. fd_all_different(L) :- set_bip_name(fd_all_different, 1), '$call_c_test'('Fd_All_Different_1'(L, L)). fd_element(I, List, V) :- set_bip_name(fd_element, 3), '$fd_element'(I, List, V). '$fd_element'(I, List, V) :- fd_tell(fd_element(I, List, V)). fd_element_var(I, List, V) :- set_bip_name(fd_element_var, 3), fd_tell(fd_element_var(I, List, V)). fd_atmost(N, List, V) :- set_bip_name(fd_atmost, 3), fd_tell(fd_atmost(N, List, V)). fd_atleast(N, List, V) :- set_bip_name(fd_atleast, 3), fd_tell(fd_atleast(N, List, V)). fd_exactly(N, List, V) :- set_bip_name(fd_exactly, 3), fd_tell(fd_exactly(N, List, V)). fd_relation(Tuples, Vars) :- set_bip_name(fd_relation, 2), '$check_list'(Tuples), '$check_list_or_partial_list'(Vars), '$lines_to_columns'(Tuples, CTuples), '$fd_relationc1'(CTuples, Vars, _). fd_relationc(CTuples, Vars) :- set_bip_name(fd_relationc, 2), '$check_list'(CTuples), '$check_list_or_partial_list'(Vars), '$fd_relationc1'(CTuples, Vars, _). '$fd_relationc1'([], [], _). '$fd_relationc1'([C|CTuples], [X|Vars], R) :- '$fd_element'(R, C, X), '$fd_relationc1'(CTuples, Vars, R). '$lines_to_columns'([[]|_], []) :- !. '$lines_to_columns'(Tuples, [Column|Columns]) :- '$create_column'(Tuples, Column, Tuples1), '$lines_to_columns'(Tuples1, Columns). '$create_column'([], [], []). '$create_column'([[X|L]|Tuples], [X|Column], [L|Tuples1]) :- '$create_column'(Tuples, Column, Tuples1). ./gprolog-1.3.0/src/BipsFD/math_supp.h0000644004425400513100000002444210547154130016046 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : math_supp.h * * Descr.: mathematical support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: math_supp.h,v 1.11 2007/01/04 10:35:04 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ #define MASK_EMPTY 0 #define MASK_LEFT 1 #define MASK_RIGHT 2 #if 0 #define DEBUG #endif /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef MATH_SUPP_FILE Bool full_ac; #ifdef DEBUG char *cur_op; #endif #else #ifdef DEBUG char *cur_op; #endif extern Bool full_ac; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ Bool Load_Left_Right(Bool optim_eq, WamWord le_word, WamWord re_word, int *mask, long *c, WamWord *l_word, WamWord *r_word); Bool Term_Math_Loading(WamWord l_word, WamWord r_word); Bool Fd_Math_Unify_X_Y(WamWord x, WamWord y); #ifdef DEBUG void Debug_Display(char *fct, int n, ...); #endif /* defined in fd_math_fd.fd */ Bool x_eq_c(WamWord x, WamWord c); /* in math_supp.c */ Bool x_eq_y(WamWord x, WamWord y); Bool x_plus_c_eq_y(WamWord x, WamWord c, WamWord y); Bool x_eq_y_F(WamWord x, WamWord y); Bool x_plus_c_eq_y_F(WamWord x, WamWord c, WamWord y); Bool x_neq_c(WamWord x, WamWord c); Bool x_neq_y(WamWord x, WamWord y); Bool x_plus_c_neq_y(WamWord x, WamWord c, WamWord y); Bool x_lt_y(WamWord x, WamWord y); Bool x_lte_c(WamWord x, WamWord c); Bool x_lte_y(WamWord x, WamWord y); Bool x_plus_c_lte_y(WamWord x, WamWord c, WamWord y); Bool x_gte_c(WamWord x, WamWord c); Bool x_plus_c_gte_y(WamWord x, WamWord c, WamWord y); Bool ax_eq_y(WamWord a, WamWord x, WamWord y); Bool x_plus_y_eq_z(WamWord x, WamWord y, WamWord z); Bool ax_plus_y_eq_z(WamWord a, WamWord x, WamWord y, WamWord z); Bool ax_plus_by_eq_z(WamWord a, WamWord x, WamWord b, WamWord y, WamWord z); Bool x_plus_y_plus_z_eq_t(WamWord x, WamWord y, WamWord z, WamWord t); Bool ax_plus_y_plus_z_eq_t(WamWord a, WamWord x, WamWord y, WamWord z, WamWord t); Bool ax_plus_by_plus_z_eq_t(WamWord a, WamWord x, WamWord b, WamWord y, WamWord z, WamWord t); Bool ax_eq_y_F(WamWord a, WamWord x, WamWord y); Bool x_plus_y_eq_z_F(WamWord x, WamWord y, WamWord z); Bool ax_plus_y_eq_z_F(WamWord a, WamWord x, WamWord y, WamWord z); Bool ax_plus_by_eq_z_F(WamWord a, WamWord x, WamWord b, WamWord y, WamWord z); Bool x_plus_y_plus_z_eq_t_F(WamWord x, WamWord y, WamWord z, WamWord t); Bool ax_plus_y_plus_z_eq_t_F(WamWord a, WamWord x, WamWord y, WamWord z, WamWord t); Bool ax_plus_by_plus_z_eq_t_F(WamWord a, WamWord x, WamWord b, WamWord y, WamWord z, WamWord t); Bool zero_power_n_eq_y(WamWord n, WamWord y); Bool a_power_n_eq_y(WamWord a, WamWord n, WamWord y); Bool x_power_a_eq_y(WamWord x, WamWord a, WamWord y); Bool x2_eq_y(WamWord x, WamWord y); Bool xy_eq_z(WamWord x, WamWord y, WamWord z); Bool a_power_n_eq_y_F(WamWord a, WamWord n, WamWord y); Bool x_power_a_eq_y_F(WamWord x, WamWord a, WamWord y); Bool x2_eq_y_F(WamWord x, WamWord y); Bool xy_eq_z_F(WamWord x, WamWord y, WamWord z); Bool min_x_a_eq_z(WamWord x, WamWord a, WamWord z); Bool min_x_y_eq_z(WamWord x, WamWord y, WamWord z); Bool min_x_a_eq_z_F(WamWord x, WamWord a, WamWord z); Bool min_x_y_eq_z_F(WamWord x, WamWord y, WamWord z); Bool max_x_a_eq_z(WamWord x, WamWord a, WamWord z); Bool max_x_y_eq_z(WamWord x, WamWord y, WamWord z); Bool max_x_a_eq_z_F(WamWord x, WamWord a, WamWord z); Bool max_x_y_eq_z_F(WamWord x, WamWord y, WamWord z); Bool abs_x_minus_a_eq_z(WamWord x, WamWord a, WamWord z); Bool abs_x_minus_y_eq_z(WamWord x, WamWord y, WamWord z); Bool abs_x_minus_a_eq_z_F(WamWord x, WamWord a, WamWord z); Bool abs_x_minus_y_eq_z_F(WamWord x, WamWord y, WamWord z); Bool quot_rem_a_y_r_eq_z(WamWord a, WamWord y, WamWord r, WamWord z); Bool quot_rem_x_a_r_eq_z(WamWord x, WamWord a, WamWord r, WamWord z); Bool quot_rem_x_y_r_eq_z(WamWord x, WamWord y, WamWord r, WamWord z); Bool quot_rem_a_y_r_eq_z_F(WamWord a, WamWord y, WamWord r, WamWord z); Bool quot_rem_x_a_r_eq_z_F(WamWord x, WamWord a, WamWord r, WamWord z); Bool quot_rem_x_y_r_eq_z_F(WamWord x, WamWord y, WamWord r, WamWord z); /* defined in fd_bool_fd.fd */ Bool not_x_eq_b(WamWord x, WamWord b); Bool x_equiv_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_nequiv_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_imply_y_eq_1(WamWord x, WamWord y); Bool x_imply_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_nimply_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_and_y_eq_0(WamWord x, WamWord y); Bool x_and_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_nand_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_or_y_eq_1(WamWord x, WamWord y); Bool x_or_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_nor_y_eq_b(WamWord x, WamWord y, WamWord b); Bool truth_x_eq_c(WamWord x, WamWord c, WamWord b); Bool truth_x_eq_y(WamWord x, WamWord y, WamWord b); Bool truth_x_plus_c_eq_y(WamWord x, WamWord c, WamWord y, WamWord b); Bool truth_x_eq_c_F(WamWord x, WamWord c, WamWord b); Bool truth_x_eq_y_F(WamWord x, WamWord y, WamWord b); Bool truth_x_plus_c_eq_y_F(WamWord x, WamWord c, WamWord y, WamWord b); Bool truth_x_neq_c(WamWord x, WamWord c, WamWord b); Bool truth_x_neq_y(WamWord x, WamWord y, WamWord b); Bool truth_x_plus_c_neq_y(WamWord x, WamWord c, WamWord y, WamWord b); Bool truth_x_neq_c_F(WamWord x, WamWord c, WamWord b); Bool truth_x_neq_y_F(WamWord x, WamWord y, WamWord b); Bool truth_x_plus_c_neq_y_F(WamWord x, WamWord c, WamWord y, WamWord b); Bool truth_x_lt_y(WamWord x, WamWord y, WamWord b); Bool truth_x_lte_c(WamWord x, WamWord c, WamWord b); Bool truth_x_lte_y(WamWord x, WamWord y, WamWord b); Bool truth_x_plus_c_lte_y(WamWord x, WamWord c, WamWord y, WamWord b); Bool truth_x_gte_c(WamWord x, WamWord c, WamWord b); Bool truth_x_plus_c_gte_y(WamWord x, WamWord c, WamWord y, WamWord b); #ifdef DEBUG #define DEBUG_2(f, a1, a2) Debug_Display(#f, 2, a1, a2) #define DEBUG_3(f, a1, a2, a3) Debug_Display(#f, 3, a1, a2, a3) #define DEBUG_4(f, a1, a2, a3, a4) Debug_Display(#f, 4, a1, a2, a3, a4) #define DEBUG_5(f, a1, a2, a3, a4, a5) Debug_Display(#f, 5, a1, a2, a3, a4, a5) #define DEBUG_6(f, a1, a2, a3, a4, a5, a6) Debug_Display(#f, 6, a1, a2, a3, a4, a5, a6) #else #define DEBUG_2(f, a1, a2) #define DEBUG_3(f, a1, a2, a3) #define DEBUG_4(f, a1, a2, a3, a4) #define DEBUG_5(f, a1, a2, a3, a4, a5) #define DEBUG_6(f, a1, a2, a3, a4, a5, a6) #endif #define PRIM_CSTR_2(f, a1, a2) \ do \ { \ DEBUG_2(f, a1, a2); \ if (!f(a1, a2)) \ return FALSE; \ } \ while (0) #define PRIM_CSTR_3(f, a1, a2, a3) \ do \ { \ DEBUG_3(f, a1, a2, a3); \ if (!f(a1, a2, a3)) \ return FALSE; \ } \ while (0) #define PRIM_CSTR_4(f, a1, a2, a3, a4) \ do \ { \ DEBUG_4(f, a1, a2, a3, a4); \ if (!f(a1, a2, a3, a4)) \ return FALSE; \ } \ while (0) #define PRIM_CSTR_5(f, a1, a2, a3, a4, a5) \ do \ { \ DEBUG_5(f, a1, a2, a3, a4, a5); \ if (!f(a1, a2, a3, a4, a5)) \ return FALSE; \ } \ while (0) #define PRIM_CSTR_6(f, a1, a2, a3, a4, a5, a6) \ do \ { \ DEBUG_6(f, a1, a2, a3, a4, a5, a6); \ if (!f(a1, a2, a3, a4, a5, a6)) \ return FALSE; \ } \ while (0) #define MATH_CSTR_2(f, a1, a2) \ do \ { \ if (full_ac == FALSE) \ PRIM_CSTR_2(f, a1, a2); \ else \ PRIM_CSTR_2(f##_F, a1, a2); \ } \ while (0) #define MATH_CSTR_3(f, a1, a2, a3) \ do \ { \ if (full_ac == FALSE) \ PRIM_CSTR_3(f, a1, a2, a3); \ else \ PRIM_CSTR_3(f##_F, a1, a2, a3); \ } \ while (0) #define MATH_CSTR_4(f, a1, a2, a3, a4) \ do \ { \ if (full_ac == FALSE) \ PRIM_CSTR_4(f, a1, a2, a3, a4); \ else \ PRIM_CSTR_4(f##_F, a1, a2, a3, a4); \ } \ while (0) #define MATH_CSTR_5(f, a1, a2, a3, a4, a5) \ do \ { \ if (full_ac == FALSE) \ PRIM_CSTR_5(f, a1, a2, a3, a4, a5); \ else \ PRIM_CSTR_5(f##_F, a1, a2, a3, a4, a5); \ } \ while (0) #define MATH_CSTR_6(f, a1, a2, a3, a4, a5, a6) \ do \ { \ if (full_ac == FALSE) \ PRIM_CSTR_6(f, a1, a2, a3, a4, a5, a6); \ else \ PRIM_CSTR_6(f##_F, a1, a2, a3, a4, a5, a6); \ } \ while (0) ./gprolog-1.3.0/src/BipsFD/fd_optim.pl0000644004425400513100000000506310547154127016037 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_optim.pl * * Descr.: optimization predicate management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_optim.pl,v 1.11 2007/01/04 10:35:03 diaz Exp $ */ :- built_in_fd. '$use_fd_optim'. fd_minimize(Goal, Var) :- fd_max_integer(Inf), g_assign('$cur_min', Inf), repeat, g_read('$cur_min', B), B1 is B - 1, set_bip_name(fd_minimize, 2), ( '$fd_domain'(Var, 0, B1), '$call'(Goal, fd_minimize, 2, true) -> fd_min(Var, C), g_assign('$cur_min', C), fail ; !, Var = B, '$call'(Goal, fd_minimize, 2, true) ). fd_maximize(Goal, Var) :- fd_max_integer(Inf), g_assign('$cur_max', 0), repeat, g_read('$cur_max', B), B1 is B + 1, set_bip_name(fd_maximize, 2), ( '$fd_domain'(Var, B1, Inf), '$call'(Goal, fd_maximize, 2, true) -> fd_max(Var, C), g_assign('$cur_max', C), fail ; !, Var = B, '$call'(Goal, fd_maximize, 2, true) ). ./gprolog-1.3.0/src/BipsFD/fd_values.pl0000644004425400513100000001445610547154130016206 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_values.pl * * Descr.: FD variable values management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_values.pl,v 1.11 2007/01/04 10:35:04 diaz Exp $ */ :- built_in_fd. '$use_fd_values'. fd_domain(List, R) :- set_bip_name(fd_domain, 2), '$call_c_test'('Fd_Domain_2'(List, R)). fd_domain(List, L, U) :- set_bip_name(fd_domain, 3), '$call_c_test'('Fd_Domain_3'(List, L, U)). '$fd_domain'(X, L, U) :- % for fd builtins (exact errors) fd_tell(fd_domain(X, L, U)). fd_domain_bool(List) :- set_bip_name(fd_domain_bool, 1), '$call_c_test'('Fd_Domain_Bool_1'(List)). fd_labeling(List) :- set_bip_name(fd_labeling, 1), '$fd_labeling'(List, []). fd_labelingff(List) :- set_bip_name(fd_labelingff, 1), '$fd_labeling'(List, [variable_method(first_fail)]). fd_labeling(List, Options) :- set_bip_name(fd_labeling, 2), '$fd_labeling'(List, Options). '$fd_labeling'(List, Options) :- '$set_labeling_defaults', '$get_labeling_options'(Options, Bckts), '$sys_var_read'(0, VarMethod), '$sys_var_read'(1, ValMethod), '$sys_var_read'(2, Reorder), '$sys_var_write'(3, 0), % bckts counter ( ( fd_var(List) ; integer(List) ) -> '$indomain'(List, ValMethod) ; '$check_list'(List), '$fd_labeling1'(List, VarMethod, ValMethod, Reorder) ), '$sys_var_read'(3, Bckts), '$sys_var_write'(3, 0). '$set_labeling_defaults' :- '$sys_var_write'(0, 0), '$sys_var_write'(1, 0), '$sys_var_write'(2, 1). '$get_labeling_options'(Options, Bckts) :- '$check_list'(Options), g_link('$backtracks', _), '$get_labeling_options1'(Options), g_read('$backtracks', Bckts). '$get_labeling_options1'([]). '$get_labeling_options1'([X|Options]) :- '$get_labeling_options2'(X), !, '$get_labeling_options1'(Options). '$get_labeling_options2'(X) :- var(X), '$pl_err_instantiation'. '$get_labeling_options2'(variable_method(X)) :- nonvar(X), % same order as in fd_values_c.c ( X = standard, '$sys_var_write'(0, 0) ; X = first_fail, '$sys_var_write'(0, 1) ; X = ff, '$sys_var_write'(0, 1) ; X = most_constrained, '$sys_var_write'(0, 2) ; X = smallest, '$sys_var_write'(0, 3) ; X = largest, '$sys_var_write'(0, 4) ; X = max_regret, '$sys_var_write'(0, 5) ; X = random, '$sys_var_write'(0, 6) ). '$get_labeling_options2'(value_method(X)) :- nonvar(X), % same order as in fd_values_c.c ( X = min, '$sys_var_write'(1, 0) ; X = max, '$sys_var_write'(1, 1) ; X = middle, '$sys_var_write'(1, 2) ; X = limits, '$sys_var_write'(1, 3) ; X = random, '$sys_var_write'(1, 4) ). '$get_labeling_options2'(reorder(X)) :- nonvar(X), ( X = false, '$sys_var_write'(2, 0) ; X = true, '$sys_var_write'(2, 1) ). '$get_labeling_options2'(backtracks(Bckts)) :- g_link('$backtracks', Bckts). '$get_labeling_options2'(X) :- '$pl_err_domain'(fd_labeling_option, X). '$fd_labeling1'(List, 0, ValMethod, _) :- % standard !, '$fd_labeling_std'(List, ValMethod). '$fd_labeling1'(List, VarMethod, ValMethod, Reorder) :- '$fd_sel_array_from_list'(List, SelArray), '$fd_labeling_mth'(SelArray, VarMethod, ValMethod, Reorder). '$fd_labeling_std'([], _). '$fd_labeling_std'([X|List], ValMethod) :- '$indomain'(X, ValMethod), '$fd_labeling_std'(List, ValMethod). '$fd_labeling_mth'(SelArray, VarMethod, ValMethod, Reorder) :- '$fd_sel_array_pick_var'(SelArray, VarMethod, Reorder, X), !, '$indomain'(X, ValMethod), '$fd_labeling_mth'(SelArray, VarMethod, ValMethod, Reorder). '$fd_labeling_mth'(_, _, _, _). '$fd_sel_array_from_list'(List, SelArray) :- '$call_c_test'('Fd_Sel_Array_From_List_2'(List, SelArray)). '$fd_sel_array_pick_var'(SelArray, Method, Reorder, Fdv) :- '$call_c_test'('Fd_Sel_Array_Pick_Var_4'(SelArray, Method, Reorder, Fdv)). '$indomain'(X, ValMethod) :- '$call_c_test'('Indomain_2'(X, ValMethod)). '$indomain_min_alt' :- % used by C code to create a choice-point '$call_c_test'('Indomain_Min_Alt_0'). '$indomain_max_alt' :- % used by C code to create a choice-point '$call_c_test'('Indomain_Max_Alt_0'). '$indomain_middle_alt' :- % used by C code to create a choice-point '$call_c_test'('Indomain_Middle_Alt_0'). '$indomain_limits_alt' :- % used by C code to create a choice-point '$call_c_test'('Indomain_Limits_Alt_0'). '$indomain_random_alt' :- % used by C code to create a choice-point '$call_c_test'('Indomain_Random_Alt_0'). '$extra_cstr_alt' :- % used by C code to create a choice-point '$call_c_test'('Extra_Cstr_Alt_0'). ./gprolog-1.3.0/src/BipsFD/fd_math_c.c0000644004425400513100000001751010547154127015751 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_math_c.c * * Descr.: mathematical predicate management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_math_c.c,v 1.10 2007/01/04 10:35:03 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" #include "engine_fd.h" #include "bips_fd.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * FD_SET_FULL_AC_FLAG_1 * * * *-------------------------------------------------------------------------*/ void Fd_Set_Full_Ac_Flag_1(WamWord full_ac_word) { full_ac = Rd_Integer(full_ac_word); } /*-------------------------------------------------------------------------* * FD_EQ_2 * * * *-------------------------------------------------------------------------*/ Bool Fd_Eq_2(WamWord le_word, WamWord re_word) { int mask; WamWord l_word, r_word; long c; #ifdef DEBUG cur_op = (full_ac) ? "#=#" : "#="; #endif if (!Load_Left_Right(TRUE, le_word, re_word, &mask, &c, &l_word, &r_word)) return FALSE; switch (mask) { case MASK_EMPTY: if (c != 0) return FALSE; goto term_load; case MASK_LEFT: if (c > 0) return FALSE; PRIM_CSTR_2(x_eq_c, l_word, Tag_INT(-c)); goto term_load; case MASK_RIGHT: if (c < 0) return FALSE; PRIM_CSTR_2(x_eq_c, r_word, Tag_INT(c)); goto term_load; } if (c > 0) { MATH_CSTR_3(x_plus_c_eq_y, l_word, Tag_INT(c), r_word); goto term_load; } if (c < 0) { MATH_CSTR_3(x_plus_c_eq_y, r_word, Tag_INT(-c), l_word); goto term_load; } /* if c == 0 nothing to do since preference via pref_load_word */ term_load: return Term_Math_Loading(l_word, r_word); } /*-------------------------------------------------------------------------* * FD_NEQ_2 * * * *-------------------------------------------------------------------------*/ Bool Fd_Neq_2(WamWord le_word, WamWord re_word) { int mask; WamWord l_word, r_word; long c; #ifdef DEBUG cur_op = (full_ac) ? "#\\=#" : "#\\="; #endif if (!Load_Left_Right(FALSE, le_word, re_word, &mask, &c, &l_word, &r_word)) return FALSE; switch (mask) { case MASK_EMPTY: if (c == 0) return FALSE; goto term_load; case MASK_LEFT: if (c > 0) { Fd_Prolog_To_Fd_Var(l_word, TRUE); goto term_load; } PRIM_CSTR_2(x_neq_c, l_word, Tag_INT(-c)); goto term_load; case MASK_RIGHT: if (c < 0) { Fd_Prolog_To_Fd_Var(r_word, TRUE); goto term_load; } PRIM_CSTR_2(x_neq_c, r_word, Tag_INT(c)); goto term_load; } if (c > 0) { PRIM_CSTR_3(x_plus_c_neq_y, l_word, Tag_INT(c), r_word); goto term_load; } if (c < 0) { PRIM_CSTR_3(x_plus_c_neq_y, r_word, Tag_INT(-c), l_word); goto term_load; } PRIM_CSTR_2(x_neq_y, l_word, r_word); term_load: return Term_Math_Loading(l_word, r_word); } /*-------------------------------------------------------------------------* * FD_LT_2 * * * *-------------------------------------------------------------------------*/ Bool Fd_Lt_2(WamWord le_word, WamWord re_word) { int mask; WamWord l_word, r_word; long c; #ifdef DEBUG cur_op = (full_ac) ? "#<#" : "#<"; #endif if (!Load_Left_Right(FALSE, le_word, re_word, &mask, &c, &l_word, &r_word)) return FALSE; switch (mask) { case MASK_EMPTY: if (c >= 0) return FALSE; goto term_load; case MASK_LEFT: if (c >= 0) return FALSE; PRIM_CSTR_2(x_lte_c, l_word, Tag_INT(-c - 1)); goto term_load; case MASK_RIGHT: if (c < 0) { Fd_Prolog_To_Fd_Var(r_word, TRUE); goto term_load; } PRIM_CSTR_2(x_gte_c, r_word, Tag_INT(c + 1)); goto term_load; } if (c > 0) { PRIM_CSTR_3(x_plus_c_lte_y, l_word, Tag_INT(c + 1), r_word); goto term_load; } if (c < 0) { PRIM_CSTR_3(x_plus_c_gte_y, r_word, Tag_INT(-c - 1), l_word); goto term_load; } PRIM_CSTR_2(x_lt_y, l_word, r_word); term_load: return Term_Math_Loading(l_word, r_word); } /*-------------------------------------------------------------------------* * FD_LTE_2 * * * *-------------------------------------------------------------------------*/ Bool Fd_Lte_2(WamWord le_word, WamWord re_word) { int mask; WamWord l_word, r_word; long c; #ifdef DEBUG cur_op = (full_ac) ? "#=<#" : "#=<"; #endif if (!Load_Left_Right(FALSE, le_word, re_word, &mask, &c, &l_word, &r_word)) return FALSE; switch (mask) { case MASK_EMPTY: if (c > 0) return FALSE; goto term_load; case MASK_LEFT: if (c > 0) return FALSE; PRIM_CSTR_2(x_lte_c, l_word, Tag_INT(-c)); goto term_load; case MASK_RIGHT: if (c <= 0) { Fd_Prolog_To_Fd_Var(r_word, TRUE); goto term_load; } PRIM_CSTR_2(x_gte_c, r_word, Tag_INT(c)); goto term_load; } if (c > 0) { PRIM_CSTR_3(x_plus_c_lte_y, l_word, Tag_INT(c), r_word); goto term_load; } if (c < 0) { PRIM_CSTR_3(x_plus_c_gte_y, r_word, Tag_INT(-c), l_word); goto term_load; } PRIM_CSTR_2(x_lte_y, l_word, r_word); term_load: return Term_Math_Loading(l_word, r_word); } ./gprolog-1.3.0/src/BipsFD/fd_infos_c.c0000644004425400513100000001765210547154127016145 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_infos_c.c * * Descr.: FD variable information management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_infos_c.c,v 1.11 2007/01/04 10:35:03 diaz Exp $ */ #include "engine_pl.h" #include "engine_fd.h" #include "bips_pl.h" #include "bips_fd.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * FD_VECTOR_MAX_1 * * * *-------------------------------------------------------------------------*/ Bool Fd_Vector_Max_1(WamWord max_word) { return Un_Integer_Check(vec_max_integer, max_word); } /*-------------------------------------------------------------------------* * FD_SET_VECTOR_MAX_1 * * * *-------------------------------------------------------------------------*/ void Fd_Set_Vector_Max_1(WamWord max_word) { Define_Vector_Size(Rd_Positive_Check(max_word)); } /*-------------------------------------------------------------------------* * FD_MAX_INTEGER_1 * * * *-------------------------------------------------------------------------*/ Bool Fd_Max_Integer_1(WamWord inf_word) { return Un_Integer_Check(INTERVAL_MAX_INTEGER, inf_word); } /*-------------------------------------------------------------------------* * FD_MIN_2 * * * *-------------------------------------------------------------------------*/ Bool Fd_Min_2(WamWord fdv_word, WamWord min_word) { WamWord word, tag_mask; int n; Fd_Deref_Check_Fd_Var(fdv_word, word, tag_mask); if (tag_mask == TAG_INT_MASK) n = UnTag_INT(word); else n = Min(UnTag_FDV(word)); return Un_Integer_Check(n, min_word); } /*-------------------------------------------------------------------------* * FD_MAX_2 * * * *-------------------------------------------------------------------------*/ Bool Fd_Max_2(WamWord fdv_word, WamWord max_word) { WamWord word, tag_mask; int n; Fd_Deref_Check_Fd_Var(fdv_word, word, tag_mask); if (tag_mask == TAG_INT_MASK) n = UnTag_INT(word); else n = Max(UnTag_FDV(word)); return Un_Integer_Check(n, max_word); } /*-------------------------------------------------------------------------* * FD_DOM_2 * * * *-------------------------------------------------------------------------*/ Bool Fd_Dom_2(WamWord fdv_word, WamWord list_word) { WamWord word, tag_mask; WamWord *fdv_adr; int x, end; int vec_elem; Check_For_Un_List(list_word); Fd_Deref_Check_Fd_Var(fdv_word, word, tag_mask); if (tag_mask == TAG_INT_MASK) { x = UnTag_INT(word); if (!Get_List(list_word) || !Unify_Integer(x)) return FALSE; list_word = Unify_Variable(); } else { fdv_adr = UnTag_FDV(word); if (Is_Interval(Range(fdv_adr))) { end = Max(fdv_adr); for (x = Min(fdv_adr); x <= end; x++) { if (!Get_List(list_word) || !Unify_Integer(x)) return FALSE; list_word = Unify_Variable(); } } else { VECTOR_BEGIN_ENUM(Vec(fdv_adr), vec_elem); if (!Get_List(list_word) || !Unify_Integer(vec_elem)) return FALSE; list_word = Unify_Variable(); VECTOR_END_ENUM; } } return Get_Nil(list_word); } /*-------------------------------------------------------------------------* * FD_SIZE_2 * * * *-------------------------------------------------------------------------*/ Bool Fd_Size_2(WamWord fdv_word, WamWord size_word) { WamWord word, tag_mask; int n; Fd_Deref_Check_Fd_Var(fdv_word, word, tag_mask); if (tag_mask == TAG_INT_MASK) n = 1; else n = Nb_Elem(UnTag_FDV(word)); return Un_Integer_Check(n, size_word); } /*-------------------------------------------------------------------------* * FD_HAS_EXTRA_CSTR_1 * * * *-------------------------------------------------------------------------*/ Bool Fd_Has_Extra_Cstr_1(WamWord fdv_word) { WamWord word, tag_mask; Fd_Deref_Check_Fd_Var(fdv_word, word, tag_mask); return tag_mask == TAG_FDV_MASK && Extra_Cstr(UnTag_FDV(word)); } /*-------------------------------------------------------------------------* * FD_HAS_VECTOR_1 * * * *-------------------------------------------------------------------------*/ Bool Fd_Has_Vector_1(WamWord fdv_word) { WamWord word, tag_mask; Fd_Deref_Check_Fd_Var(fdv_word, word, tag_mask); return tag_mask == TAG_FDV_MASK && Is_Sparse(Range(UnTag_FDV(word))); } /*-------------------------------------------------------------------------* * FD_USE_VECTOR_1 * * * *-------------------------------------------------------------------------*/ Bool Fd_Use_Vector_1(WamWord fdv_word) { WamWord word, tag_mask; Fd_Deref_Check_Fd_Var(fdv_word, word, tag_mask); return tag_mask == TAG_INT_MASK || Fd_Use_Vector(UnTag_FDV(word)); } ./gprolog-1.3.0/src/BipsFD/oper_supp.h0000644004425400513100000000572210547154130016062 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : oper_supp.h * * Descr.: FD Operation support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: oper_supp.h,v 1.9 2007/01/04 10:35:04 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ unsigned Power(unsigned x, unsigned n); unsigned Nth_Root_Dn(unsigned y, unsigned n); unsigned Nth_Root_Up(unsigned y, unsigned n); unsigned Nth_Root_Exact(unsigned y, unsigned n); unsigned Sqrt_Dn(unsigned y); unsigned Sqrt_Up(unsigned y); unsigned Sqrt_Exact(unsigned y); unsigned Find_Expon_Dn(unsigned x, unsigned y); unsigned Find_Expon_Up(unsigned x, unsigned y); unsigned Find_Expon_Exact(unsigned x, unsigned y); void Full_Coeff_Power_Var(Range *y, int a, Range *n); void Full_Find_Expon(Range *n, int a, Range *y); void Full_Var_Power_Coeff(Range *y, Range *x, int a); void Full_Nth_Root(Range *x, Range *y, int a); void Full_Max_Cst_Var(Range *z, int a, Range *x); void Full_Min_Cst_Var(Range *z, int a, Range *x); ./gprolog-1.3.0/src/BipsFD/fd_symbolic_fd.fd0000644004425400513100000000523110547154127017154 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_symbolic_fd.fd * * Descr.: symbolic constraints management - FD part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_symbolic_fd.fd,v 1.9 2007/01/04 10:35:03 diaz Exp $ */ %{ Bool Fd_Element_V_To_Xi(int i,WamWord *array,Range *v); Bool Fd_Atmost(int n,WamWord *array,int v); Bool Fd_Atleast(int n,WamWord *array,int v); Bool Fd_Exactly(int n,WamWord *array,int v); %} fd_element(fdv I,l_int L,fdv V) { start I in Fd_Element_I(L) start V in Fd_Element_I_To_V(dom(I),L) start I in Fd_Element_V_To_I(dom(V),L) } fd_element_var(fdv I,l_fdv L,fdv V) { start I in Fd_Element_Var_I(L) start V in Fd_Element_Var_I_To_V(dom(I),L) trigger also on dom(L) start I in Fd_Element_Var_V_To_I(dom(V),L) trigger also on dom(L) start Fd_Element_V_To_Xi(val(I),L,dom(V)) } fd_atmost(int N,l_fdv L,int V) { start Fd_Atmost(N,L,V) trigger on dom(L) always } fd_atleast(int N,l_fdv L,int V) { start Fd_Atleast(N,L,V) trigger on dom(L) always } fd_exactly(int N,l_fdv L,int V) { start Fd_Exactly(N,L,V) trigger on dom(L) always } ./gprolog-1.3.0/src/BipsFD/fd_bool_fd.fd0000644004425400513100000004736710547154127016306 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint solver buit-in predicates * * File : fd_bool_fd.fd * * Descr.: boolean and meta-constraint predicate management - FD part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd_bool_fd.fd,v 1.11 2007/01/04 10:35:03 diaz Exp $ */ %{ #define not(x) (1 - (x)) #define and(x,y) ((x) & (y)) #define or(x,y) ((x) | (y)) #define xor(x,y) ((x) ^ (y)) #define eqv(x,y) (not(xor(x,y))) #define impl(x,y)(not(x) | (y)) %} /*-------------------------------------------------------------------------* * How are written the boolean primitive constraints. * * * * I- When a variable X can only be determined when all other variables are* * instantiated, we use: * * * * X in { true_formula } * * * * where true_formula is the formula when X is true. * * The value of the other variables are get with val() to avoid useless * * reevaluation of the constraint. * * * * Ex: #~ X <=> B * * * * var true_formula X B * * --- ------------ --- * * B ~X 0 1 * * X ~B 1 0 * * * * X in { not(val(B)) } * * B in { not(val(X)) } * * * * * * II- When a variable X can be determined thanks to a subset of other * * variables, we use: * * * * X in true_formula .. not_false_formula * * * * where true_formula is the formula when X is true and not_false_formula * * is the negation of the formula when X is false. To find when a variable * * is true (resp. false) look at the truth table of THAT VARIABLE (the one * * determining that variable from all combinations of the other variables).* * Combinations when the variable can be 0 or 1 (undefined) are ignored. * * * * NB: for functions, true_formula = not_false_formula but it is not the * * case for surjective mappings. The value of the other variables are get * * with min() in the lower bound of the constraint (or inside a not in the * * upper bound and with max in the upper bound of the constraint (or inside* * a not in the lower bound). * * * * Ex: X ==> Y <=> B * * * * var true_formula false_formula not_false_formula X Y B * * --- ------------ ------------- ----------------- ----- * * B ~X \/ Y X /\ ~Y ~X \/ Y 0 0 1 * * X ~B B /\ ~Y ~B \/ Y 0 1 1 * * Y X /\ B ~B B 1 0 0 * * 1 1 1 * * B in or(not(max(X)),min(Y)) .. or(not(min(X)),max(Y)) * * X in not(max(B)) .. or(not(min(B)),max(Y)) * * Y in and(min(B),min(X)) .. max(B) * * * * The obtained formula is simplified if possible. For instance in * * X /\ Y <=> B the true_formula for X is Y /\ B, However, B ==> Y, then * * the formula becomes: B (since if B is false, Y /\ B is false and if B is* * true, Y is also true (since B==>Y) then Y /\ B is also true). * *-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------* * NOT * * * *-------------------------------------------------------------------------*/ not_x_eq_b(fdv X,fdv B) { start X in { not(val(B)) } start B in { not(val(X)) } } /*-------------------------------------------------------------------------* * EQUIVALENT * * * *-------------------------------------------------------------------------*/ x_equiv_y_eq_b(fdv X,fdv Y,fdv B) { start B in { eqv(val(X),val(Y)) } start X in { eqv(val(Y),val(B)) } start Y in { eqv(val(X),val(B)) } } /*-------------------------------------------------------------------------* * NOT EQUIVALENT (ie. XOR) * * * *-------------------------------------------------------------------------*/ x_nequiv_y_eq_b(fdv X,fdv Y,fdv B) { start B in { xor(val(X),val(Y)) } start X in { xor(val(Y),val(B)) } start Y in { xor(val(X),val(B)) } } /*-------------------------------------------------------------------------* * IMPLY * * * *-------------------------------------------------------------------------*/ x_imply_y_eq_b(fdv X,fdv Y,fdv B) { start B in or(not(max(X)),min(Y)) .. or(not(min(X)),max(Y)) start X in not(max(B)) .. or(not(min(B)),max(Y)) start Y in and(min(B),min(X)) .. max(B) } x_imply_y_eq_1(fdv X,fdv Y) { start X in 0 .. max(Y) start Y in min(X) .. 1 } /*-------------------------------------------------------------------------* * NOT IMLPY * * * *-------------------------------------------------------------------------*/ x_nimply_y_eq_b(fdv X,fdv Y,fdv B) { start B in and(min(X),not(max(Y))) .. and(max(X),not(min(Y))) start X in min(B) .. or(max(B),max(Y)) start Y in and(not(max(B)),min(X)) .. not(min(B)) } /*-------------------------------------------------------------------------* * AND * * * *-------------------------------------------------------------------------*/ x_and_y_eq_b(fdv X,fdv Y,fdv B) { start B in and(min(X),min(Y)) .. and(max(X),max(Y)) start X in min(B) .. or(max(B),not(min(Y))) start Y in min(B) .. or(max(B),not(min(X))) } x_and_y_eq_0(fdv X,fdv Y) { start X in 0 .. not(min(Y)) start Y in 0 .. not(min(X)) } /*-------------------------------------------------------------------------* * NOT AND * * * *-------------------------------------------------------------------------*/ x_nand_y_eq_b(fdv X,fdv Y,fdv B) { start B in or(not(max(X)),not(max(Y))) .. or(not(min(X)),not(min(Y))) start X in not(max(B)) .. or(not(min(B)),not(min(Y))) start Y in not(max(B)) .. or(not(min(B)),not(min(X))) } /*-------------------------------------------------------------------------* * OR * * * *-------------------------------------------------------------------------*/ x_or_y_eq_b(fdv X,fdv Y,fdv B) { start B in or(min(X),min(Y)) .. or(max(X),max(Y)) start X in and(min(B),not(max(Y))) .. max(B) start Y in and(min(B),not(max(X))) .. max(B) } x_or_y_eq_1(fdv X,fdv Y) { start X in not(max(Y)) .. 1 start Y in not(max(X)) .. 1 } /*-------------------------------------------------------------------------* * NOR * * * *-------------------------------------------------------------------------*/ x_nor_y_eq_b(fdv X,fdv Y,fdv B) { start B in and(not(max(X)),not(max(Y))) .. and(not(min(X)),not(min(Y))) start X in and(not(max(B)),not(max(Y))) .. not(min(B)) start Y in and(not(max(B)),not(max(X))) .. not(min(B)) } /*-------------------------------------------------------------------------* * TRUTH OF EQUAL (LINEAR) * * * *-------------------------------------------------------------------------*/ /*------------* * Partial AC * *------------*/ truth_x_eq_c(fdv X,int C,fdv B) { wait_switch case max(B)==0 start X in ~{ C } case min(B)==1 start X in { C } case min(X)>C || max(X)max(Y) || max(X)max(Y) || max(X)+CC || max(X)max(Y) || max(X)max(Y) || max(X)+C=max(Y) start B in { 0 } case max(X)C start B in { 0 } case max(X)<=C start B in { 1 } } truth_x_lte_y(fdv X,fdv Y,fdv B) { wait_switch case max(B)==0 start X in min(Y)+1 .. max_integer start Y in 0 .. max(X)-1 case min(B)==1 start X in 0 .. max(Y) start Y in min(X) .. max_integer case min(X)>max(Y) start B in { 0 } case max(X)<=min(Y) start B in { 1 } } truth_x_plus_c_lte_y(fdv X,int C,fdv Y,fdv B) { wait_switch case max(B)==0 start X in min(Y)-C+1 .. max_integer start Y in 0 .. max(X)+C-1 case min(B)==1 start X in 0 .. max(Y)-C start Y in min(X)+C .. max_integer case min(X)+C>max(Y) start B in { 0 } case max(X)+C<=min(Y) start B in { 1 } } /*-------------------------------------------------------------------------* * TRUTH OF GREATER THAN OR EQUAL TO (LINEAR) * * * *-------------------------------------------------------------------------*/ /*------------* * Partial AC * *------------*/ truth_x_gte_c(fdv X,int C,fdv B) { wait_switch case max(B)==0 start X in 0 .. C-1 case min(B)==1 start X in C .. max_integer case max(X)=C start B in { 1 } } truth_x_plus_c_gte_y(fdv X,int C,fdv Y,fdv B) { wait_switch case max(B)==0 start X in 0 .. max(Y)-C-1 start Y in min(X)+C+1 .. max_integer case min(B)==1 start X in min(Y)-C .. max_integer start Y in 0 .. max(X)+C case max(X)+C=max(Y) start B in { 1 } } ./gprolog-1.3.0/src/RPM/0000777004425400513100000000000010547442376013236 5ustar diazloco./gprolog-1.3.0/src/RPM/Makefile0000644004425400513100000000166510547152475014700 0ustar diazlocoNAME=$(shell cut -d - -f 1 ../VERSION) PKG_NAME=$(shell cat ../VERSION) SPEC=$(NAME).spec SPEC_LINK=$(NAME)-link.spec RPMBUILD=rpmbuild TARGET=$(shell ../config.guess) RPM_FLAGS --target=$(TARGET) rpm: ../$(PKG_NAME).tar.gz $(SPEC) $(RPMBUILD) -bb $(RPM_FLAGS) $(SPEC) $(SPEC): initial.spec ../VERSION ./build_spec_file rpm-link: $(SPEC_LINK) $(RPMBUILD) -bb $(RPM_FLAGS) $(SPEC_LINK) $(SPEC_LINK): initial.spec ../VERSION ./build_spec_file link srpm: ../$(PKG_NAME).tar.gz $(SPEC) $(RPMBUILD) -bs $(SPEC) ../$(PKG_NAME).tar.gz: (cd ..; make dist) rm $(SPEC) clean: -rm $(NAME)*.spec rpm_env: $(RPMBUILD) $(RPM_FLAGS) -bp rpm_env.spec >/dev/null 2>&1 NAMES_FILE=/tmp/rpm_names names: rpm_env @echo '# file generated by src/RPM/Makefile' >$(NAMES_FILE) @(source /tmp/rpm_env; \ echo RPM=$$RPM_RPMS_DIR/$$ARCH/$(PKG_NAME)-1.$$ARCH.rpm >>$(NAMES_FILE); \ echo SRPM=$$RPM_SRPMS_DIR/$(PKG_NAME)-1.src.rpm >>$(NAMES_FILE)) ./gprolog-1.3.0/src/RPM/build_spec_file0000755004425400513100000000245310026312574016260 0ustar diazloco#!/bin/sh ROOT_DIR=`cd ../..;pwd` NAME=`cut -d - -f 1 ../VERSION` VERSION=`cut -d - -f 2 ../VERSION` PKG_NAME=$NAME-$VERSION RPMBUILD=rpmbuild BUILD_ROOT=/var/tmp/$NAME-build-rpm PREFIX=/usr PKG_DIR=$PREFIX/lib/$PKG_NAME DOC_DIR=$PREFIX/doc/$PKG_NAME BIN_DIR=$PREFIX/bin SRC_LNK=../lib/$PKG_NAME/bin # more complex :-) # X=`echo $BIN_DIR | sed -e "s#$PREFIX##" -e 's!/[^/]\{1,\}!../!g'` # Y=`echo $PKG_DIR | sed -e "s#$PREFIX##"` # SRC_LNK=$X$Y/bin # running a dummy rpm to find RPM environment # if you find better solution email me $RPMBUILD -bp rpm_env.spec >/dev/null 2>&1 source /tmp/rpm_env cp ../$PKG_NAME.tar.gz $RPM_SOURCES_DIR || exit 1 if test "$1" = link; then keep=@LINK@ remove=@REAL@ specfile=$NAME-link.spec else keep=@REAL@ remove=@LINK@ specfile=$NAME.spec fi sed -e "s!@ROOT_DIR@!$ROOT_DIR!g" \ -e "s!@NAME@!$NAME!g" \ -e "s!@VERSION@!$VERSION!g" \ -e "s!@PKG_NAME@!$PKG_NAME!g" \ -e "s!@BUILD_ROOT@!$BUILD_ROOT!g" \ -e "s!@PREFIX@!$PREFIX!g" \ -e "s!@PKG_DIR@!$PKG_DIR!g" \ -e "s!@BIN_DIR@!$BIN_DIR!g" \ -e "s!@DOC_DIR@!$DOC_DIR!g" \ -e "s!@SRC_LNK@!$SRC_LNK!g" \ -e "s!$keep !!" \ -e "/^$remove.*/d" \ initial.spec > $specfile echo Spec file $specfile created test -d $RPM_SPECS_DIR && cp $specfile $RPM_SPECS_DIR exit 0 ./gprolog-1.3.0/src/RPM/rpm_env.spec0000644004425400513100000000107010542225511015533 0ustar diazlocoSummary: dummy RPM Name: dummy Version: 1 Release: 1 License: GPL Group: Development/Languages %description dummy RPM to get RPM environment variables (BUILD and SRC) %prep file=/tmp/rpm_env echo '# this file is generated by using rpm -bp rpm_env.spec' >$file echo RPM_BUILD_DIR=%{_builddir} >>$file echo RPM_RPMS_DIR=%{_rpmdir} >>$file echo RPM_SOURCES_DIR=%{_sourcedir} >>$file echo RPM_SPECS_DIR=%{_specdir} >>$file echo RPM_SRPMS_DIR=%{_srcrpmdir} >>$file echo RPM_DOC_DIR=%{_docdir} >>$file echo ARCH=%{_target_cpu} >>$file ./gprolog-1.3.0/src/RPM/try_rpm0000755004425400513100000000112507441417354014650 0ustar diazloco#!/bin/sh -x if test $# != 1; then echo usage $0 RPM exit 1 fi default_db_dir=/var/lib/rpm if [ ! -f $default_db_dir/Packages ]; then echo "cannot find the RPM database path (I tried $default_db_dir)" exit 1 fi dummy_dir=/tmp/try_rpm/ rpmdb_dir=$dummy_dir/rpmdb/ install_dir=$dummy_dir/prefix/ rm -rf $dummy_dir mkdir -p $rpmdb_dir mkdir -p $install_dir cp -r $default_db_dir/* $rpmdb_dir rpm --nodeps -Uvh --prefix $install_dir --dbpath $rpmdb_dir $1 echo rpm --nodeps -Uvh --prefix $install_dir --dbpath $rpmdb_dir $1 echo "RPM installed in $install_dir (can be removed safely)" ./gprolog-1.3.0/src/RPM/gprolog.spec0000644004425400513100000000356210542230327015547 0ustar diazlocoSummary: GNU Prolog is a free Prolog compiler with constraint solving over Finite Domains Name: gprolog Version: 1.3.0 Release: 1 License: GPL Group: Development/Languages Source: ftp://gprolog.univ-paris1.fr/pub/gprolog/gprolog-1.3.0.tar.gz URL: http://www.gprolog.org/ Packager: Daniel Diaz Vendor: Daniel Diaz (University of Paris 1 & INRIA Rocquencourt) Prefix: /usr Buildroot: /var/tmp/gprolog-build-rpm %description GNU Prolog is a native Prolog compiler with constraint solving over finite domains (FD) developed by Daniel Diaz (http://loco.inria.fr/~diaz). GNU Prolog is a very efficient native compiler producing (small) stand-alone executables. GNU-Prolog also offers a classical top-level+debugger. GNU Prolog conforms to the ISO standard for Prolog but also includes a lot of extensions (global variables, DCG, sockets, OS interface,...). GNU Prolog also includes a powerful constraint solver over finite domains with many predefined constraints+heuristics. More information can be found at http://www.gnu.org/software/prolog or better at http://www.gprolog.org. %prep %setup %build cd src ./configure --with-install-dir=$RPM_BUILD_ROOT//usr/lib/gprolog-1.3.0 \ --without-links-dir --without-examples-dir \ --with-doc-dir=$RPM_BUILD_ROOT//usr/doc/gprolog-1.3.0 make %install rm -rf $RPM_BUILD_ROOT cd src make install-strip mkdir $RPM_BUILD_ROOT//usr/bin cd $RPM_BUILD_ROOT//usr/lib/gprolog-1.3.0/bin for i in *; do ln -s ../lib/gprolog-1.3.0/bin/$i $RPM_BUILD_ROOT//usr/bin/$i done cd $RPM_BUILD_DIR/gprolog-1.3.0 cp README COPYING ChangeLog NEWS $RPM_BUILD_ROOT//usr/doc/gprolog-1.3.0 %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc /usr/doc/gprolog-1.3.0/* /usr/bin/* /usr/lib/gprolog-1.3.0* %changelog * Tue Jul 25 2000 Daniel Diaz - initial specfile ./gprolog-1.3.0/src/RPM/make_rpm_tree0000755004425400513100000000066107137275336015776 0ustar diazloco#!/bin/sh if test $# != 1; then echo usage $0 RPM_PREFIX_PATH exit 1 fi p=$1 mkdir -p $p/RPM/SOURCES mkdir $p/RPM/SPECS mkdir $p/RPM/BUILD mkdir $p/RPM/SRPMS mkdir -p $p/RPM/RPMS/i386 mkdir $p/RPM/RPMS/i486 mkdir $p/RPM/RPMS/i586 mkdir $p/RPM/RPMS/i686 mkdir $p/RPM/RPMS/i786 mkdir $p/RPM/RPMS/i886 mkdir $p/RPM/RPMS/i986 echo Updating your $HOME/.rpmmacros echo "%_topdir $p/RPM" >>$HOME/.rpmmacros ./gprolog-1.3.0/src/RPM/initial.spec0000644004425400513100000000370210542227532015527 0ustar diazlocoSummary: GNU Prolog is a free Prolog compiler with constraint solving over Finite Domains Name: @NAME@ Version: @VERSION@ Release: 1 License: GPL Group: Development/Languages Source: ftp://gprolog.univ-paris1.fr/pub/gprolog/@PKG_NAME@.tar.gz URL: http://www.gprolog.org/ Packager: Daniel Diaz Vendor: Daniel Diaz (University of Paris 1 & INRIA Rocquencourt) Prefix: @PREFIX@ Buildroot: @BUILD_ROOT@ %description GNU Prolog is a native Prolog compiler with constraint solving over finite domains (FD) developed by Daniel Diaz (http://loco.inria.fr/~diaz). GNU Prolog is a very efficient native compiler producing (small) stand-alone executables. GNU-Prolog also offers a classical top-level+debugger. GNU Prolog conforms to the ISO standard for Prolog but also includes a lot of extensions (global variables, DCG, sockets, OS interface,...). GNU Prolog also includes a powerful constraint solver over finite domains with many predefined constraints+heuristics. More information can be found at http://www.gnu.org/software/prolog or better at http://www.gprolog.org. %prep @REAL@ %setup @LINK@ rm -rf $RPM_BUILD_DIR/@PKG_NAME@ @LINK@ ln -s @ROOT_DIR@ $RPM_BUILD_DIR/@PKG_NAME@ %build @LINK@ cd $RPM_BUILD_DIR/@PKG_NAME@ cd src ./configure --with-install-dir=$RPM_BUILD_ROOT/@PKG_DIR@ \ --without-links-dir --without-examples-dir \ --with-doc-dir=$RPM_BUILD_ROOT/@DOC_DIR@ @REAL@ make %install @LINK@ cd $RPM_BUILD_DIR/@PKG_NAME@ rm -rf $RPM_BUILD_ROOT cd src make install-strip mkdir $RPM_BUILD_ROOT/@BIN_DIR@ cd $RPM_BUILD_ROOT/@PKG_DIR@/bin for i in *; do ln -s @SRC_LNK@/$i $RPM_BUILD_ROOT/@BIN_DIR@/$i done cd $RPM_BUILD_DIR/@PKG_NAME@ cp README COPYING ChangeLog NEWS $RPM_BUILD_ROOT/@DOC_DIR@ %clean @REAL@ rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc @DOC_DIR@/* @BIN_DIR@/* @PKG_DIR@* %changelog * Tue Jul 25 2000 Daniel Diaz - initial specfile ./gprolog-1.3.0/src/RPM/README0000644004425400513100000000567010004245541014101 0ustar diazloco Building GNU-Prolog RPM(s) -------------------------- Refer to http://www.rpm.org/ for more information about the Red Hat Package Manager. A version 4.0 or higher is required. 1) Building a RPM classically ----------------------------- To build RPM for GNU-Prolog: make rpm The stages executed are: 1- build a distribution file (gprolog-VERSION.tar.gz) if needed using 'make dist' in the src (parent) directory. 2- copy it under the RPM SOURCES directory (done by build_spec_file) 3- uncompressing it (%setup in the %prep target of the spec file) 4- configure (./configure in the %build target) 5- compile locally (make in the %build target) 6- install it in the build root directory (%install target) 7- build the .rpm file The RPM spec file created is called: gprolog.spec (it is also copied in the SPECS directory of the RPM tree). The RPM file is created in the RPMS directory of the RPM tree (rpm displays this information). 2) Building a RPM fastly ------------------------ If you have locally compiled GNU-Prolog (using './configure' followed by 'make' in the src (parent) directory) you can avoid stages 1, 2, 3, and 5 described above using: make rpm-link This will only create a symlink in the RPM BUILD directory refering the current tree. The RPM spec file created is called: gprolog-link.spec (it is also copied in the SPECS directory of the RPM tree). NB: ./configure and make must have been done previously 3) Using a local RPM tree ------------------------- You do not need to be root to build a RPM but you must be able to write in the RPM tree structure (/usr/src/RPM/... /usr/src/redhat or similar). You can use symlinks or build your own structure in a place you can write using the make_rpm_tree script passing the prefix of the wanted tree as argument). For instance to build a tree under your HOME directory use: ./make_rpm_tree $HOME This will update your $HOME/.rpmmacros to inform rpm to use your own local RPM tree. 4) Testing your RPM ------------------- To test a RPM you can install it as usual using 'rpm -U RPM_FILE' (this file is created in the RPMS directory of the RPM tree) and remove it when finished using 'rpm -e gprolog'. However, 1) you need to be root, 2) you uselessly modify the RPM database (since at the end the RPM is removed). Point 1) can be overcome using the --prefix option of rpm since the RPM is relocatable. Point 2) can be overcome using the --dbpath option to specifying a dummy RPM data base path. This is exaclty what does the try_rpm script. To use: try_rpm RPM_FILE This installs the RPM in a temporary directory (under /tmp/try_rpm/prefix) that can be safely removed using rm -rf /tmp/try_rpm since the installation does not affect the RPM database. 5) Building a source RPM ------------------------ To build a source RPM for GNU-Prolog: make srpm The SRPM file is created in the SRPMS directory of the RPM tree (rpm displays this information). ./gprolog-1.3.0/src/SETVARS0000644004425400513100000000021707410447160013635 0ustar diazlocoa=`pwd` PATH=$a/TopComp:$a/EnginePl:$a/Pl2Wam:$a/Wam2Ma:$a/Ma2Asm:$a/Fd2C:$a/DevUtils:$a/W32GUICons:$PATH:/usr/ucb/:/usr/ccs/bin/ export PATH ./gprolog-1.3.0/src/AUTOCONF-INFO0000644004425400513100000001723006732375376014477 0ustar diazlocoBasic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. ./gprolog-1.3.0/src/Makefile.in0000644004425400513100000001443710547152475014650 0ustar diazloco# MAIN MAKEFILE # ------------- ROOT_DIR = @ROOT_DIR@ PKG_NAME = @PKG_NAME@ INSTALL_DIR = $(DESTDIR)@INSTALL_DIR@ LINKS_DIR = $(DESTDIR)@LINKS_DIR@ DOC_DIR = $(DESTDIR)@DOC_DIR@ HTML_DIR = $(DESTDIR)@HTML_DIR@ EXAMPLES_DIR = $(DESTDIR)@EXAMPLES_DIR@ TXT_FILES = @TXT_FILES@ BIN_FILES = @BIN_FILES@ OBJ_FILES = @OBJ_FILES@ LIB_FILES = @LIB_FILES@ INC_FILES = @INC_FILES@ DOC_FILES = @DOC_FILES@ HTML_FILES = @HTML_FILES@ EXPL_FILES = @EXPL_FILES@ EXC_FILES = @EXC_FILES@ EXFD_FILES = @EXFD_FILES@ INSTALL = @INSTALL@ INSTALL_PROGRAM= @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ TOP_LEVEL = @TOP_LEVEL@ LN_S = @LN_S@ RANLIB = @RANLIB@ LE_DIRS = Linedit W32GC_DIRS = W32GUICons FD_DIRS = Fd2C EngineFD BipsFD SUB_DIRS = TopComp EnginePl Wam2Ma Ma2Asm @MAKE_LE_DIRS@ @MAKE_W32GC_DIRS@ \ BipsPl Pl2Wam @MAKE_FD_DIRS@ SUB_DIRS_ALL = TopComp EnginePl Wam2Ma Ma2Asm $(LE_DIRS) $(W32GC_DIRS) \ BipsPl Pl2Wam $(FD_DIRS) # --- COMPILE --- # all: (cd EnginePl; $(MAKE) config) . ./SETVARS;for i in $(SUB_DIRS);do (cd $$i; $(MAKE)) || exit 1; done;\ (cd TopComp; $(MAKE) $(TOP_LEVEL)@EXE_SUFFIX@) # --- INSTALL --- # install-strip: $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install install: install-system install-doc install-html install-examples install-links install-system: ./mkinstalldirs $(INSTALL_DIR) $(INSTALL_DIR)/bin \ $(INSTALL_DIR)/include $(INSTALL_DIR)/lib for i in $(TXT_FILES); do $(INSTALL_DATA) ../$$i $(INSTALL_DIR); done for i in $(BIN_FILES); do $(INSTALL_PROGRAM) */$$i $(INSTALL_DIR)/bin; done for i in $(OBJ_FILES); do $(INSTALL_DATA) */$$i $(INSTALL_DIR)/lib; done for i in $(LIB_FILES); do $(INSTALL_DATA) */$$i $(INSTALL_DIR)/lib; done for i in $(INC_FILES); do $(INSTALL_DATA) */$$i $(INSTALL_DIR)/include; done for i in $(INSTALL_DIR)/lib/*.a; do $(RANLIB) $$i; done uninstall: uninstall-links uninstall-html uninstall-doc uninstall-examples for i in $(BIN_FILES); do rm -f $(INSTALL_DIR)/bin/$$i; done rmdir -p $(INSTALL_DIR)/bin 2>/dev/null || exit 0 for i in $(LIB_FILES) $(OBJ_FILES); do rm -f $(INSTALL_DIR)/lib/$$i; done rmdir -p $(INSTALL_DIR)/lib 2>/dev/null || exit 0 for i in $(INC_FILES); do rm -f $(INSTALL_DIR)/include/$$i; done rmdir -p $(INSTALL_DIR)/include 2>/dev/null || exit 0 for i in $(TXT_FILES); do rm -f $(INSTALL_DIR)/$$i; done rmdir $(INSTALL_DIR) 2>/dev/null || exit 0 # --- Links --- # install-links: uninstall-links if test $(LINKS_DIR) != none; then \ ./mkinstalldirs $(LINKS_DIR); \ (cd $(LINKS_DIR) ; $(LN_S) $(INSTALL_DIR)/bin/* .); \ fi uninstall-links: -if test $(LINKS_DIR) != none; then \ (cd $(LINKS_DIR) 2>/dev/null && rm -f $(BIN_FILES)); \ rmdir $(LINKS_DIR) 2>/dev/null; \ fi || exit 0; # --- Documentation --- # install-doc: if test $(DOC_DIR) != none; then \ ./mkinstalldirs $(DOC_DIR); \ (F=`cd ../doc; echo $(DOC_FILES)`; \ for i in $$F; do $(INSTALL_DATA) ../doc/$$i $(DOC_DIR); done); \ fi uninstall-doc: -if test $(DOC_DIR) != none; then \ (cd $(DOC_DIR); rm -f $(DOC_FILES)); \ rmdir $(DOC_DIR) 2>/dev/null; \ fi || exit 0; # --- HTML --- # install-html: if test $(HTML_DIR) != none; then \ ./mkinstalldirs $(HTML_DIR); \ (F=`cd ../doc/html_node; echo $(HTML_FILES)`; \ for i in $$F; do $(INSTALL_DATA) ../doc/html_node/$$i $(HTML_DIR); done); \ fi uninstall-html: -if test $(HTML_DIR) != none; then \ (cd $(HTML_DIR); rm -f $(HTML_FILES)); \ rmdir $(HTML_DIR) 2>/dev/null; \ fi || exit 0; # --- Examples --- # install-examples: if test $(EXAMPLES_DIR) != none; then \ ./mkinstalldirs $(EXAMPLES_DIR)/ExamplesPl; \ (F=`cd ../ExamplesPl; echo $(EXPL_FILES)`; \ for i in $$F; do $(INSTALL_DATA) ../ExamplesPl/$$i $(EXAMPLES_DIR)/ExamplesPl; done); \ ./mkinstalldirs $(EXAMPLES_DIR)/ExamplesC; \ (F=`cd ../ExamplesC; echo $(EXC_FILES)`; \ for i in $$F; do $(INSTALL_DATA) ../ExamplesC/$$i $(EXAMPLES_DIR)/ExamplesC; done); \ ./mkinstalldirs $(EXAMPLES_DIR)/ExamplesFD; \ (F=`cd ../ExamplesFD; echo $(EXFD_FILES)`; \ for i in $$F; do $(INSTALL_DATA) ../ExamplesFD/$$i $(EXAMPLES_DIR)/ExamplesFD; done); \ fi uninstall-examples: rm -rf $(EXAMPLES_DIR)/ExamplesPl rm -rf $(EXAMPLES_DIR)/ExamplesC rm -rf $(EXAMPLES_DIR)/ExamplesFD -rmdir $(EXAMPLES_DIR) 2>/dev/null || exit 0 # --- CHECKS --- # check: (cd EnginePl; make check) && \ (cd Ma2Asm; make check) && \ (cd Pl2Wam; make check) && \ (cd BipsPl; make check) && \ echo All tests succeeded # --- CLEAN --- # RUN_PL_DIRS = EnginePl BipsPl RUN_FD_DIRS = EngineFD BipsFD RUN_SUB_DIRS= $(RUN_PL_DIRS) $(RUN_PL_DIRS) clean: for i in $(SUB_DIRS_ALL); do (cd $$i; $(MAKE) clean); done clean-pl: for i in $(RUN_PL_DIRS); do (cd $$i; $(MAKE) clean); done clean-fd: for i in $(RUN_FD_DIRS); do (cd $$i; $(MAKE) clean); done clean-pl-fd: clean-pl clean-fd distclean: rm -rf config.status config.log config.cache autom4te.cache for i in $(SUB_DIRS_ALL); do (cd $$i; $(MAKE) distclean); done # --- DISTRIBUTION --- # distdir=./$(PKG_NAME) dist: check_doc $(PKG_NAME).tar.gz check_doc: (cd ../doc; make all) $(PKG_NAME).tar.gz: -rm -rf $(distdir) mkdir $(distdir) -chmod 777 $(distdir) (while read f; do \ if [ x$$f != x ]; then \ subdir=`dirname $$f`; \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ chmod 777 $(distdir)/$$subdir; \ fi; \ cp -pr ../$$f $(distdir)/$$subdir; \ fi; \ done . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ./gprolog-1.3.0/src/EnginePl/0000777004425400513100000000000010547442376014301 5ustar diazloco./gprolog-1.3.0/src/EnginePl/wam_inst.c0000644004425400513100000011662510547154141016263 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : wam_inst.c * * Descr.: WAM instruction implementation * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: wam_inst.c,v 1.16 2007/01/04 10:35:13 diaz Exp $ */ #include #include #include "engine_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef union { double d; WamWord i[2]; } DblInt; /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static SwtInf *Locate_Swt_Element(SwtTbl t, int size, long key); /*-------------------------------------------------------------------------* * CREATE_FUNCTOR_ARITY_TAGGED * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Create_Functor_Arity_Tagged(char *func_str, int arity) { int func = Create_Atom(func_str); return Functor_Arity(func, arity); } /*-------------------------------------------------------------------------* * CREATE_SWT_TABLE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ SwtTbl FC Create_Swt_Table(int size) { SwtTbl t; size++; /* +1 to ensure that one free cell exists */ t = (SwtTbl) Calloc(size, sizeof(SwtInf)); return t; } /*-------------------------------------------------------------------------* * CREATE_SWT_ATM_ELEMENT * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void FC Create_Swt_Atm_Element(SwtTbl t, int size, int atom, CodePtr codep) { SwtInf *swt = Locate_Swt_Element(t, size, atom); swt->key = atom; swt->codep = codep; } /*-------------------------------------------------------------------------* * CREATE_SWT_STC_ELEMENT * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void FC Create_Swt_Stc_Element(SwtTbl t, int size, int func, int arity, CodePtr codep) { long key = Functor_Arity(func, arity); SwtInf *swt = Locate_Swt_Element(t, size, key); swt->key = key; swt->codep = codep; } /*-------------------------------------------------------------------------* * LOCATE_SWT_ELEMENT * * * *-------------------------------------------------------------------------*/ static SwtInf * Locate_Swt_Element(SwtTbl t, int size, long key) { int n; SwtInf *swt, *endt; size++; /* +1 to ensure that one free cell exists */ #if 1 n = key % size; #else n = (key ^ ((unsigned long) key >> 16)) % size; #endif /* here either the key is in the table */ /* or there is at least one free cell. */ swt = t + n; endt = t + size; while (swt->codep && swt->key != key) { swt++; if (swt == endt) swt = t; } return swt; } /*-------------------------------------------------------------------------* * GET_ATOM_TAGGED * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Get_Atom_Tagged(WamWord w, WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) { Bind_UV(UnTag_REF(word), w); return TRUE; } return (word == w); } /*-------------------------------------------------------------------------* * GET_ATOM * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Get_Atom(int atom, WamWord start_word) { return Get_Atom_Tagged(Tag_ATM(atom), start_word); } /*-------------------------------------------------------------------------* * GET_INTEGER_TAGGED * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Get_Integer_Tagged(WamWord w, WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) { Bind_UV(UnTag_REF(word), w); return TRUE; } #ifndef NO_USE_FD_SOLVER if (tag_mask == TAG_FDV_MASK) return Fd_Unify_With_Integer(UnTag_FDV(word), UnTag_INT(w)); #endif return (word == w); } /*-------------------------------------------------------------------------* * GET_INTEGER * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Get_Integer(long n, WamWord start_word) { return Get_Integer_Tagged(Tag_INT(n), start_word); } /*-------------------------------------------------------------------------* * GET_FLOAT * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Get_Float(double n, WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) { Bind_UV(UnTag_REF(word), Tag_FLT(H)); Global_Push_Float(n); return TRUE; } return (tag_mask == TAG_FLT_MASK && Obtain_Float(UnTag_FLT(word)) == n); } /*-------------------------------------------------------------------------* * GET_NIL * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Get_Nil(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) { Bind_UV(UnTag_REF(word), NIL_WORD); return TRUE; } return (word == NIL_WORD); } /*-------------------------------------------------------------------------* * GET_LIST * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Get_List(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) { Bind_UV(UnTag_REF(word), Tag_LST(H)); S = WRITE_MODE; return TRUE; } if (tag_mask == TAG_LST_MASK) { S = UnTag_LST(word) + OFFSET_CAR; return TRUE; } return FALSE; } /*-------------------------------------------------------------------------* * GET_STRUCTURE_TAGGED * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Get_Structure_Tagged(WamWord w, WamWord start_word) { WamWord word, tag_mask; WamWord *adr; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) { WamWord *cur_H = H; *cur_H = w; H++; S = WRITE_MODE; Bind_UV(UnTag_REF(word), Tag_STC(cur_H)); return TRUE; } if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(word); if (Functor_And_Arity(adr) != w) return FALSE; S = adr + OFFSET_ARG; return TRUE; } return FALSE; } /*-------------------------------------------------------------------------* * GET_STRUCTURE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Get_Structure(int func, int arity, WamWord start_word) { return Get_Structure_Tagged(Functor_Arity(func, arity), start_word); } /*-------------------------------------------------------------------------* * PUT_X_VARIABLE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Put_X_Variable(void) { WamWord res_word; WamWord *cur_H = H; res_word = Make_Self_Ref(cur_H); *cur_H = res_word; H++; return res_word; } /*-------------------------------------------------------------------------* * PUT_Y_VARIABLE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Put_Y_Variable(WamWord *y_adr) { return *y_adr = Make_Self_Ref(y_adr); } /*-------------------------------------------------------------------------* * PUT_UNSAFE_VALUE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Put_Unsafe_Value(WamWord start_word) { WamWord word, tag_mask; WamWord *adr; WamWord res_word; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK && (adr = UnTag_REF(word)) >= (WamWord *) EE(E)) { Globalize_Local_Unbound_Var(adr, res_word); return res_word; } Do_Copy_Of_Word(tag_mask, word); return word; } /*-------------------------------------------------------------------------* * PUT_ATOM_TAGGED * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Put_Atom_Tagged(WamWord w) { return w; } /*-------------------------------------------------------------------------* * PUT_ATOM * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Put_Atom(int atom) { return Tag_ATM(atom); } /*-------------------------------------------------------------------------* * PUT_INTEGER_TAGGED * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Put_Integer_Tagged(WamWord w) { return w; } /*-------------------------------------------------------------------------* * PUT_INTEGER * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Put_Integer(long n) { return Tag_INT(n); } /*-------------------------------------------------------------------------* * PUT_FLOAT * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Put_Float(double n) { WamWord res_word; res_word = Tag_FLT(H); Global_Push_Float(n); return res_word; } /*-------------------------------------------------------------------------* * PUT_NIL * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Put_Nil(void) { return NIL_WORD; } /*-------------------------------------------------------------------------* * PUT_LIST * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Put_List(void) { S = WRITE_MODE; return Tag_LST(H); } /*-------------------------------------------------------------------------* * PUT_STRUCTURE_TAGGED * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Put_Structure_Tagged(WamWord w) { WamWord *cur_H = H; *cur_H = w; H++; S = WRITE_MODE; return Tag_STC(cur_H); } /*-------------------------------------------------------------------------* * PUT_STRUCTURE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Put_Structure(int func, int arity) { return Put_Structure_Tagged(Functor_Arity(func, arity)); } /*-------------------------------------------------------------------------* * UNIFY_VARIABLE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Unify_Variable(void) { WamWord tag_mask, word; WamWord res_word; WamWord *cur_H; if (S != WRITE_MODE) { word = *S++; tag_mask = Tag_Mask_Of(word); Do_Copy_Of_Word(tag_mask, word); return word; } cur_H = H; res_word = Make_Self_Ref(cur_H); *cur_H = res_word; H++; return res_word; } /*-------------------------------------------------------------------------* * UNIFY_VOID * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void FC Unify_Void(int n) { WamWord *cur_H; if (S != WRITE_MODE) { S += n; return; } cur_H = H; H += n; do { *cur_H = Make_Self_Ref(cur_H); cur_H++; } while(--n > 0); } /*-------------------------------------------------------------------------* * UNIFY_VALUE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Unify_Value(WamWord start_word) { if (S != WRITE_MODE) return Unify(start_word, *S++); Global_Push(start_word); return TRUE; } /*-------------------------------------------------------------------------* * UNIFY_LOCAL_VALUE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Unify_Local_Value(WamWord start_word) { WamWord word, tag_mask; WamWord *adr; if (S != WRITE_MODE) return Unify(start_word, *S++); DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK && Is_A_Local_Adr(adr = UnTag_REF(word))) Globalize_Local_Unbound_Var(adr, word); else { Do_Copy_Of_Word(tag_mask, word); Global_Push(word); } return TRUE; } /*-------------------------------------------------------------------------* * UNIFY_ATOM_TAGGED * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Unify_Atom_Tagged(WamWord w) { WamWord word, tag_mask; if (S != WRITE_MODE) { DEREF(*S, word, tag_mask); S++; if (tag_mask == TAG_REF_MASK) { Bind_UV(UnTag_REF(word), w); return TRUE; } return (word == w); } Global_Push(w); return TRUE; } /*-------------------------------------------------------------------------* * UNIFY_ATOM * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Unify_Atom(int atom) { return Unify_Atom_Tagged(Tag_ATM(atom)); } /*-------------------------------------------------------------------------* * UNIFY_INTEGER_TAGGED * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Unify_Integer_Tagged(WamWord w) { WamWord word, tag_mask; if (S != WRITE_MODE) { DEREF(*S, word, tag_mask); S++; if (tag_mask == TAG_REF_MASK) { Bind_UV(UnTag_REF(word), w); return TRUE; } #ifndef NO_USE_FD_SOLVER if (tag_mask == TAG_FDV_MASK) return Fd_Unify_With_Integer(UnTag_FDV(word), UnTag_INT(w)); #endif return (word == w); } Global_Push(w); return TRUE; } /*-------------------------------------------------------------------------* * UNIFY_INTEGER * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Unify_Integer(long n) { return Unify_Integer_Tagged(Tag_INT(n)); } /*-------------------------------------------------------------------------* * UNIFY_NIL * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Unify_Nil(void) { WamWord word, tag_mask; if (S != WRITE_MODE) { DEREF(*S, word, tag_mask); S++; if (tag_mask == TAG_REF_MASK) { Bind_UV(UnTag_REF(word), NIL_WORD); return TRUE; } return (word == NIL_WORD); } Global_Push(NIL_WORD); return TRUE; } /*-------------------------------------------------------------------------* * UNIFY_LIST * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Unify_List(void) { WamWord *cur_H; if (S != WRITE_MODE) return Get_List(*S); cur_H = H; *cur_H = Tag_LST(cur_H + 1); H++; return TRUE; } /*-------------------------------------------------------------------------* * UNIFY_STRUCTURE_TAGGED * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Unify_Structure_Tagged(WamWord w) { WamWord *cur_H; if (S != WRITE_MODE) return Get_Structure_Tagged(w, *S); cur_H = H; *cur_H = Tag_STC(cur_H + 1); cur_H[1] = w; H += 2; return TRUE; } /*-------------------------------------------------------------------------* * UNIFY_STRUCTURE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ Bool FC Unify_Structure(int func, int arity) { return Unify_Structure_Tagged(Functor_Arity(func, arity)); } /*-------------------------------------------------------------------------* * GLOBALIZE_IF_IN_LOCAL * * * *-------------------------------------------------------------------------*/ WamWord FC Globalize_If_In_Local(WamWord start_word) { WamWord word, tag_mask; WamWord *adr; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) { adr = UnTag_REF(word); if (Is_A_Local_Adr(adr)) Globalize_Local_Unbound_Var(adr, start_word); } return start_word; } /*-------------------------------------------------------------------------* * ALLOCATE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void FC Allocate(int n) { WamWord *old_E = E; WamWord *cur_E = Local_Top + ENVIR_STATIC_SIZE + n; E = cur_E; CPE(cur_E) = (WamCont) CP; BCIE(cur_E) = BCI; EE(cur_E) = (WamWord *) old_E; #ifdef GARBAGE_COLLECTOR NBYE(cur_E) = n; cur_E = &Y(cur_E, 0); while(n-- > 0) { *cur_E = Make_Self_Ref(cur_E); cur_E--; } #endif } /*-------------------------------------------------------------------------* * DEALLOCATE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void FC Deallocate(void) { WamWord *cur_E = E; CP = CPE(cur_E); BCI = BCIE(cur_E); E = EE(cur_E); } /*-------------------------------------------------------------------------* * SWITCH_ON_TERM and specialized versions * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ CodePtr FC Switch_On_Term(CodePtr c_var, CodePtr c_atm, CodePtr c_int, CodePtr c_lst, CodePtr c_stc) { WamWord word, tag_mask; CodePtr codep; DEREF(A(0), word, tag_mask); A(0) = word; if (tag_mask == TAG_INT_MASK) codep = c_int; else if (tag_mask == TAG_ATM_MASK) codep = c_atm; else if (tag_mask == TAG_LST_MASK) codep = c_lst; else if (tag_mask == TAG_STC_MASK) codep = c_stc; else /* REF or FDV */ codep = c_var; return (codep) ? codep : ALTB(B); } CodePtr FC Switch_On_Term_Var_Atm(CodePtr c_var, CodePtr c_atm) { WamWord word, tag_mask; DEREF(A(0), word, tag_mask); A(0) = word; if (tag_mask == TAG_ATM_MASK) return c_atm; if (tag_mask == TAG_REF_MASK #ifndef NO_USE_FD_SOLVER || tag_mask == TAG_FDV_MASK #endif ) return c_var; return ALTB(B); } CodePtr FC Switch_On_Term_Var_Stc(CodePtr c_var, CodePtr c_stc) { WamWord word, tag_mask; DEREF(A(0), word, tag_mask); A(0) = word; if (tag_mask == TAG_STC_MASK) return c_stc; if (tag_mask == TAG_REF_MASK #ifndef NO_USE_FD_SOLVER || tag_mask == TAG_FDV_MASK #endif ) return c_var; return ALTB(B); } CodePtr FC Switch_On_Term_Var_Atm_Lst(CodePtr c_var, CodePtr c_atm, CodePtr c_lst) { WamWord word, tag_mask; DEREF(A(0), word, tag_mask); A(0) = word; if (tag_mask == TAG_LST_MASK) return c_lst; if (tag_mask == TAG_ATM_MASK) return c_atm; if (tag_mask == TAG_REF_MASK #ifndef NO_USE_FD_SOLVER || tag_mask == TAG_FDV_MASK #endif ) return c_var; return ALTB(B); } CodePtr FC Switch_On_Term_Var_Atm_Stc(CodePtr c_var, CodePtr c_atm, CodePtr c_stc) { WamWord word, tag_mask; DEREF(A(0), word, tag_mask); A(0) = word; if (tag_mask == TAG_STC_MASK) return c_stc; if (tag_mask == TAG_ATM_MASK) return c_atm; if (tag_mask == TAG_REF_MASK #ifndef NO_USE_FD_SOLVER || tag_mask == TAG_FDV_MASK #endif ) return c_var; return ALTB(B); } /*-------------------------------------------------------------------------* * SWITCH_ON_ATOM * * * * switch_on_atom always occurs after a switch_on_term, thus A(0) is * * dereferenced and has been updated with its deref word. * * Look in the hash table t and return the adr of the corresponding code. * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ CodePtr FC Switch_On_Atom(SwtTbl t, int size) { SwtInf *swt; swt = Locate_Swt_Element(t, size, (long) UnTag_ATM(A(0))); return (swt->codep) ? swt->codep : ALTB(B); } /*-------------------------------------------------------------------------* * SWITCH_ON_INTEGER * * * * switch_on_integer always occurs after a switch_on_term, thus A(0) is * * dereferenced and has been updated with its deref word. * * Simply return the integer since the switch is done by the assembly code.* * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ long FC Switch_On_Integer(void) { return UnTag_INT(A(0)); } /*-------------------------------------------------------------------------* * SWITCH_ON_STRUCTURE * * * * switch_on_structure always occurs after a switch_on_term, thus A(0) is * * dereferenced and has been updated with its deref word. * * Look in the hash table t and return the adr of the corresponding code. * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ CodePtr FC Switch_On_Structure(SwtTbl t, int size) { SwtInf *swt; swt = Locate_Swt_Element(t, size, Functor_And_Arity(UnTag_STC(A(0)))); return (swt->codep) ? swt->codep : ALTB(B); } /*-------------------------------------------------------------------------* * LOAD_CUT_LEVEL * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void FC Load_Cut_Level(WamWord *word_adr) { *word_adr = From_B_To_WamWord(B); } /*-------------------------------------------------------------------------* * CUT * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void FC Cut(WamWord b_word) { Assign_B(From_WamWord_To_B(b_word)); } /* Auxiliary Functions */ /*-------------------------------------------------------------------------* * GLOBAL_PUSH_FLOAT * * * *-------------------------------------------------------------------------*/ void FC Global_Push_Float(double n) { DblInt di; di.d = n; *H++ = di.i[0]; #if WORD_SIZE == 32 *H++ = di.i[1]; #endif } /*-------------------------------------------------------------------------* * OBTAIN_FLOAT * * * *-------------------------------------------------------------------------*/ double FC Obtain_Float(WamWord *adr) { DblInt di; di.i[0] = adr[0]; #if WORD_SIZE == 32 di.i[1] = adr[1]; #endif return di.d; } /*-------------------------------------------------------------------------* * CREATE_CHOICE_POINT and specialized versions * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ #define CREATE_CHOICE_COMMON_PART(arity) \ WamWord *old_B = B; \ WamWord *cur_B = Local_Top + CHOICE_STATIC_SIZE + arity; \ \ B = cur_B; \ \ ALTB(cur_B) = codep_alt; \ CPB(cur_B) = CP; \ BCIB(cur_B) = BCI; \ EB(cur_B) = E; \ BB(cur_B) = old_B; \ HB(cur_B) = HB1 = H; \ TRB(cur_B) = TR; \ CSB(cur_B) = CS; \ \ STAMP++ /* common part for update/delete */ /* restore registers except B and HB1 */ #define UPDATE_DELETE_COMMON_PART \ WamWord *cur_B = B; \ \ Untrail(TRB(cur_B)); \ \ CP = CPB(cur_B); \ BCI = BCIB(cur_B); \ H = HB(cur_B); \ E = EB(cur_B); \ CS = CSB(cur_B) /* update ALTB, restore HB1 */ #define UPDATE_CHOICE_COMMON_PART \ UPDATE_DELETE_COMMON_PART; \ ALTB(cur_B) = codep_alt; \ HB1 = H /* restore B (and HB1), update STAMP */ #define DELETE_CHOICE_COMMON_PART \ UPDATE_DELETE_COMMON_PART; \ Assign_B(BB(cur_B)); \ STAMP-- void FC Create_Choice_Point(CodePtr codep_alt, int arity) { int i; CREATE_CHOICE_COMMON_PART(arity); for (i = 0; i < arity; i++) AB(cur_B, i) = A(i); } void FC Create_Choice_Point1(CodePtr codep_alt) { CREATE_CHOICE_COMMON_PART(1); AB(cur_B, 0) = A(0); } void FC Create_Choice_Point2(CodePtr codep_alt) { CREATE_CHOICE_COMMON_PART(2); AB(cur_B, 0) = A(0); AB(cur_B, 1) = A(1); } void FC Create_Choice_Point3(CodePtr codep_alt) { CREATE_CHOICE_COMMON_PART(3); AB(cur_B, 0) = A(0); AB(cur_B, 1) = A(1); AB(cur_B, 2) = A(2); } void FC Create_Choice_Point4(CodePtr codep_alt) { CREATE_CHOICE_COMMON_PART(4); AB(cur_B, 0) = A(0); AB(cur_B, 1) = A(1); AB(cur_B, 2) = A(2); AB(cur_B, 3) = A(3); } /*-------------------------------------------------------------------------* * UPDATE_CHOICE_POINT and specialized versions * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void FC Update_Choice_Point(CodePtr codep_alt, int arity) { int i; UPDATE_CHOICE_COMMON_PART; for (i = 0; i < arity; i++) A(i) = AB(cur_B, i); } void FC Update_Choice_Point1(CodePtr codep_alt) { UPDATE_CHOICE_COMMON_PART; A(0) = AB(cur_B, 0); } void FC Update_Choice_Point2(CodePtr codep_alt) { UPDATE_CHOICE_COMMON_PART; A(0) = AB(cur_B, 0); A(1) = AB(cur_B, 1); } void FC Update_Choice_Point3(CodePtr codep_alt) { UPDATE_CHOICE_COMMON_PART; A(0) = AB(cur_B, 0); A(1) = AB(cur_B, 1); A(2) = AB(cur_B, 2); } void FC Update_Choice_Point4(CodePtr codep_alt) { UPDATE_CHOICE_COMMON_PART; A(0) = AB(cur_B, 0); A(1) = AB(cur_B, 1); A(2) = AB(cur_B, 2); A(3) = AB(cur_B, 3); } /*-------------------------------------------------------------------------* * DELETE_CHOICE_POINT * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void FC Delete_Choice_Point(int arity) { int i; DELETE_CHOICE_COMMON_PART; for (i = 0; i < arity; i++) A(i) = AB(cur_B, i); } void FC Delete_Choice_Point1(void) { DELETE_CHOICE_COMMON_PART; A(0) = AB(cur_B, 0); } void FC Delete_Choice_Point2(void) { DELETE_CHOICE_COMMON_PART; A(0) = AB(cur_B, 0); A(1) = AB(cur_B, 1); } void FC Delete_Choice_Point3(void) { DELETE_CHOICE_COMMON_PART; A(0) = AB(cur_B, 0); A(1) = AB(cur_B, 1); A(2) = AB(cur_B, 2); } void FC Delete_Choice_Point4(void) { DELETE_CHOICE_COMMON_PART; A(0) = AB(cur_B, 0); A(1) = AB(cur_B, 1); A(2) = AB(cur_B, 2); A(3) = AB(cur_B, 3); } /*-------------------------------------------------------------------------* * UNTRAIL * * * *-------------------------------------------------------------------------*/ void FC Untrail(WamWord *low_adr) { WamWord word; WamWord *adr; int nb; while (TR > low_adr) { word = Trail_Pop; adr = (WamWord *) (Trail_Value_Of(word)); switch (Trail_Tag_Of(word)) { case TUV: *adr = Make_Self_Ref(adr); break; case TOV: *adr = Trail_Pop; break; case TMV: nb = Trail_Pop; TR -= nb; Mem_Word_Cpy(adr, TR, nb); break; default: /* TFC */ adr = (WamWord *) Trail_Pop; /* fct adr no longer word aligned */ nb = Trail_Pop; TR -= nb; (*((int (*)()) adr)) (nb, TR); } } } /*-------------------------------------------------------------------------* * UNIFY * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ #define UNIFY_FCT_NAME Unify #include "unify.c" /*-------------------------------------------------------------------------* * UNIFY_OCCURS_CHECK * * * *-------------------------------------------------------------------------*/ #undef UNIFY_FCT_NAME #define UNIFY_FCT_NAME Unify_Occurs_Check #define OCCURS_CHECK #include "unify.c" ./gprolog-1.3.0/src/EnginePl/machine.c0000644004425400513100000007220110547154141016035 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : machine.c * * Descr.: machine dependent features * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: machine.c,v 1.24 2007/01/04 10:35:13 diaz Exp $ */ #include #include #include #include #include #include #include #include #include #include #include "gp_config.h" /* ensure __unix__ defined if not Win32 */ #if defined(_WIN32) || defined(__CYGWIN__) #include /* warning: windows.h defines _WIN32 */ #endif #if defined(__unix__) || defined(__CYGWIN__) #include #include #include #include #include #ifdef __CYGWIN__ #include #endif #else /* _WIN32 */ #include #include #endif #include "engine_pl.h" /* before netdb.h which declares a function */ /* gcc cannot define a global reg var after a fct */ #ifdef HAVE_MALLOC_H #include #endif #ifndef NO_USE_SOCKETS # if defined(__unix__) || defined(__CYGWIN__) #include #include #include #include # endif #define INET_MANAGEMENT #endif #if 0 #define DEBUG #endif /*---------------------------------* * Constants * *---------------------------------*/ #define M_MAGIC1 0x12345678 #define M_MAGIC2 0xdeadbeef #define UNKOWN_SYS_ERRNO "Unknown error (%d)" /* Error Messages */ #define ERR_STACKS_ALLOCATION "Memory allocation fault" #define ERR_CANNOT_OPEN_DEV0 "Cannot open /dev/zero : %s" #define ERR_CANNOT_UNMAP "unmap failed : %s" #define ERR_CANNOT_FREE "VirtualFree failed : %lu" #define ERR_CANNOT_PROTECT "VirtualProtect failed : %lu" #define ERR_CANNOT_EXEC_GETCWD "cannot execute getcwd" #define ERR_STACK_OVERFLOW_ENV "%s stack overflow (size: %d Kb, environment variable used: %s)" #define ERR_STACK_OVERFLOW_NO_ENV "%s stack overflow (size: %d Kb - fixed size)" /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static long start_user_time = 0; static long start_system_time = 0; static long start_real_time = 0; static int cur_seed = 1; static int page_size; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void SIGSEGV_Handler(); static char *Stack_Overflow_Err_Msg(int stk_nb); #ifdef INET_MANAGEMENT static char *Host_Name_From_Alias(struct hostent *host_entry); #endif #define Round_Up(x, y) (((x) + (y) - 1) / (y) * (y)) #define Round_Down(x, y) ((x) / (y) * (y)) /*-------------------------------------------------------------------------* * INIT_MACHINE * * * *-------------------------------------------------------------------------*/ void Init_Machine(void) { tzset(); start_user_time = M_User_Time(); start_system_time = M_System_Time(); start_real_time = M_Real_Time(); #if defined(HAVE_MALLOPT) && defined(M_MMAP_MAX) mallopt(M_MMAP_MAX, 0); #endif Init_Machine1(); } #if defined(_WIN32) && !defined(__CYGWIN__) /*-------------------------------------------------------------------------* * GETPAGESIZE * * * *-------------------------------------------------------------------------*/ int getpagesize(void) { SYSTEM_INFO si; GetSystemInfo(&si); return si.dwPageSize; } #endif #if HAVE_MMAP && !defined(_WIN32) && !defined(__CYGWIN__) #include #if !defined(MAP_ANON) && defined(MAP_ANONYMOUS) #define MAP_ANON MAP_ANONYMOUS #endif #endif /*-------------------------------------------------------------------------* * VIRTUAL_MEM_ALLOC * * * *-------------------------------------------------------------------------*/ static WamWord * Virtual_Mem_Alloc(WamWord *addr, int length) { #if defined(_WIN32) || defined(__CYGWIN__) addr = (WamWord *) VirtualAlloc(addr, length, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); #elif defined(HAVE_MMAP) #ifndef MAP_ANON static int fd = -1; if (fd == -1) fd = open("/dev/zero", 0); if (fd == -1) Fatal_Error(ERR_CANNOT_OPEN_DEV0, M_Sys_Err_String(errno)); #endif /* !MAP_ANON */ addr = (WamWord *) mmap((void *) addr, length, PROT_READ | PROT_WRITE, MAP_PRIVATE #ifdef MMAP_NEEDS_FIXED | MAP_FIXED #endif #ifdef MAP_ANON | MAP_ANON, -1, #else , fd, #endif /* !MAP_ANON */ 0); if (addr == (WamWord *) -1) addr = NULL; #else addr = (WamWord *) Calloc(length, 1); #endif return addr; } /*-------------------------------------------------------------------------* * VIRTUAL_MEM_FREE * * * *-------------------------------------------------------------------------*/ static void Virtual_Mem_Free(WamWord *addr, int length) { #if defined(_WIN32) || defined(__CYGWIN__) if (!VirtualFree(addr, 0, MEM_RELEASE)) Fatal_Error(ERR_CANNOT_FREE, GetLastError()); #elif defined(HAVE_MMAP) if (munmap((void *) addr, length) == -1) Fatal_Error(ERR_CANNOT_UNMAP, M_Sys_Err_String(errno)); #else Free(addr); #endif } /*-------------------------------------------------------------------------* * VIRTUAL_MEM_PROTECT * * * *-------------------------------------------------------------------------*/ static void Virtual_Mem_Protect(WamWord *addr, int length) { #if defined(_WIN32) || defined(__CYGWIN__) DWORD old_prot; if (!VirtualProtect(addr, length, PAGE_NOACCESS, &old_prot)) Fatal_Error(ERR_CANNOT_PROTECT, GetLastError()); #elif defined(HAVE_MMAP) #ifdef HAVE_MPROTECT if (mprotect((void *) addr, length, PROT_NONE) == -1) #endif if (munmap((void *) addr, length) == -1) Fatal_Error(ERR_CANNOT_UNMAP, M_Sys_Err_String(errno)); #else addr[0] = M_MAGIC1; addr[1] = M_MAGIC2; /* and rest (addr[1...]) should be 0 */ #endif } /*-------------------------------------------------------------------------* * M_ALLOCATE_STACKS * * * *-------------------------------------------------------------------------*/ void M_Allocate_Stacks(void) { unsigned length = 0; WamWord *addr; int i; WamWord *addr_to_try[] = { #ifndef MMAP_NEEDS_FIXED NULL, #endif #ifdef M_MMAP_HIGH_ADR1 (WamWord *) M_MMAP_HIGH_ADR1, #endif #ifdef M_MMAP_HIGH_ADR2 (WamWord *) M_MMAP_HIGH_ADR2, #endif #ifdef M_MMAP_HIGH_ADR3 (WamWord *) M_MMAP_HIGH_ADR3, #endif (WamWord *) -1 }; page_size = getpagesize() / sizeof(WamWord); for (i = 0; i < NB_OF_STACKS; i++) { stk_tbl[i].size = Round_Up(stk_tbl[i].size, page_size); length += stk_tbl[i].size + page_size; } length *= sizeof(WamWord); addr = NULL; for(i = 0; addr == NULL && addr_to_try[i] != (WamWord *) -1; i++) { addr = addr_to_try[i]; #ifdef DEBUG DBGPRINTF("trying at high addr: %p --> ", addr); #endif if (addr) { addr = (WamWord *) Round_Down((long) addr, getpagesize()); addr -= length; } #ifdef DEBUG DBGPRINTF("base: %p length: %d\n", addr, length); #endif addr = Virtual_Mem_Alloc(addr, length); #ifdef DEBUG DBGPRINTF("obtaining: %p\n", addr); #endif #if TAG_SIZE_HIGH > 0 if (addr && (((unsigned long) (addr) + length) >> (WORD_SIZE - TAG_SIZE_HIGH)) != 0) { #ifdef DEBUG DBGPRINTF(" -> invalid high bits addr\n"); #endif Virtual_Mem_Free(addr, length); addr = NULL; } #endif /* TAG_SIZE_HIGH > 0 */ } if (addr == NULL) Fatal_Error(ERR_STACKS_ALLOCATION); for (i = 0; i < NB_OF_STACKS; i++) { stk_tbl[i].stack = addr; addr += stk_tbl[i].size; Virtual_Mem_Protect(addr, page_size); addr += page_size; } #if defined(M_sparc_solaris) || defined(M_ix86_solaris) || \ defined(M_ix86_sco) || defined(M_x86_64_linux) { struct sigaction act; act.sa_sigaction = (void (*)()) SIGSEGV_Handler; sigemptyset(&act.sa_mask); act.sa_flags = SA_SIGINFO; sigaction(SIGSEGV, &act, NULL); } #elif !defined(_WIN32) && !defined(__CYGWIN__) signal(SIGSEGV, (void (*)()) SIGSEGV_Handler); #endif } #if defined(_WIN32) || defined(__CYGWIN__) /*-------------------------------------------------------------------------* * WIN32_SEH_HANDLER * * * *-------------------------------------------------------------------------*/ EXCEPT_DISPOSITION Win32_SEH_Handler(EXCEPTION_RECORD *excp_rec, void *establisher_frame, CONTEXT *context_rec, void *dispatcher_cxt) { WamWord *addr; if (excp_rec->ExceptionFlags) return ExceptContinueSearch; /* unwind and others */ if (excp_rec->ExceptionCode != EXCEPTION_ACCESS_VIOLATION) return ExceptContinueSearch; addr = (WamWord *) excp_rec->ExceptionInformation[1]; SIGSEGV_Handler(addr); return ExceptContinueExecution; } #endif /*-------------------------------------------------------------------------* * SIGSEGV_HANDLER * * * *-------------------------------------------------------------------------*/ #if defined(M_sparc_sunos) static void SIGSEGV_Handler(int sig, int code, int scp, WamWord *addr) #elif defined(M_sparc_solaris) || defined(M_ix86_solaris) void SIGSEGV_Handler(int sig, siginfo_t * sip) #elif defined(M_alpha_osf) static void SIGSEGV_Handler(int sig, int code, struct sigcontext *scp) #elif defined(M_ix86_linux) || defined(M_powerpc_linux) || \ defined(M_alpha_linux) #include #if 0 /* old linux */ static void SIGSEGV_Handler(int sig, struct sigcontext_struct scp) #else static void SIGSEGV_Handler(int sig, struct sigcontext scp) #endif #elif defined(M_ix86_sco) #define _XOPEN_SOURCE_EXTENDED #include #include static void SIGSEGV_Handler(int sig, siginfo_t * si) #elif defined(M_ix86_bsd) || defined(M_powerpc_bsd) || defined(M_sparc_bsd) static void SIGSEGV_Handler(int sig, int code, struct sigcontext *scp) #elif defined(_WIN32) || defined(__CYGWIN__) void SIGSEGV_Handler(WamWord *addr) #elif defined(M_mips_irix) #include void SIGSEGV_Handler(int sig, int code, struct sigcontext *scp) #elif defined(M_x86_64_linux) void SIGSEGV_Handler(int sig, siginfo_t *sip, void *scp) #else static void SIGSEGV_Handler(int sig) #endif { #if defined(M_alpha_osf) WamWord *addr = (WamWord *) (scp->sc_traparg_a0); #elif defined(M_alpha_linux) WamWord *addr = (WamWord *) (scp.sc_fp_trigger_inst); /* why this one? */ /* WamWord *addr=(WamWord *) (scp.sc_traparg_a0); */ #elif defined(M_sparc_solaris) || defined(M_ix86_solaris) WamWord *addr = (WamWord *) sip->si_addr; #elif defined(M_ix86_linux) WamWord *addr = (WamWord *) scp.cr2; #elif defined(M_x86_64_linux) WamWord *addr = (WamWord *) sip->si_addr; #elif defined(M_ix86_sco) WamWord *addr = (WamWord *) si->si_addr; #elif defined(M_ix86_bsd) WamWord *addr = (WamWord *) scp->sc_err; #elif defined(M_powerpc_linux) WamWord *addr = (WamWord *) scp.regs->dar; #elif defined(M_mips_irix) WamWord *addr = scp->sc_regs[16]; #elif defined(_WIN32) /* addr passed as argument */ #else /* cannot detect fault addr */ #warning SIGSEGV_Handler does not know how to detect fault addr - use magic numbers #define M_USE_MAGIC_NB_TO_DETECT_STACK_NAME #endif #ifdef M_USE_MAGIC_NB_TO_DETECT_STACK_NAME M_Check_Magic_Words(); #else /* !M_USE_MAGIC_NB_TO_DETECT_STACK_NAME */ int i; #ifdef DEBUG DBGPRINTF("BAD ADDRESS:%lx\n", (long) addr); #endif i = NB_OF_STACKS - 1; if (addr < stk_tbl[i].stack + stk_tbl[i].size + page_size) while (i >= 0) { #ifdef DEBUG DBGPRINTF("STACK[%d].stack + size: %lx\n", i, (long) (stk_tbl[i].stack + stk_tbl[i].size)); #endif if (addr >= stk_tbl[i].stack + stk_tbl[i].size) Fatal_Error(Stack_Overflow_Err_Msg(i)); i--; } #endif /* !M_USE_MAGIC_NB_TO_DETECT_STACK_NAME */ Fatal_Error("Segmentation Violation"); } #ifdef M_USE_MAGIC_NB_TO_DETECT_STACK_NAME #ifndef NO_USE_LINEDIT #include "../Linedit/linedit.h" #endif /*-------------------------------------------------------------------------* * M_CHECK_MAGIC_WORDS * * * *-------------------------------------------------------------------------*/ void M_Check_Magic_Words(void) { int i, err = 0; WamWord *end, *top; char *msg; for (i = 0; i < NB_OF_STACKS; i++) { if (stk_tbl[i].size == 0) continue; end = stk_tbl[i].stack + stk_tbl[i].size; #ifdef DEBUG DBGPRINTF("stack: %s start: %p end: %p top: %p\n", stk_tbl[i].name, stk_tbl[i].stack, end, Stack_Top(i)); #endif if ((end[0] != M_MAGIC1 || end[1] != M_MAGIC2 || end[8] != 0) || (top = Stack_Top(i)) >= end) { err++; msg = Stack_Overflow_Err_Msg(i); #ifndef NO_USE_LINEDIT if (le_hook_message_box) (*le_hook_message_box)("Possible Error", msg, 0); else #endif fprintf(stderr, "Possible Error: %s\n", msg); } } if (err) Exit_With_Value(1); } #endif /*-------------------------------------------------------------------------* * STACK_OVERFLOW_ERR_MSG * * * *-------------------------------------------------------------------------*/ static char * Stack_Overflow_Err_Msg(int stk_nb) { InfStack *s = stk_tbl + stk_nb; char *var = s->env_var_name; int size = s->size; static char msg[256]; if (s->stack == Global_Stack) size += REG_BANK_SIZE; /* see Init_Engine */ size = Wam_Words_To_KBytes(size); if (fixed_sizes || var[0] == '\0') sprintf(msg, ERR_STACK_OVERFLOW_NO_ENV, s->name, size); else sprintf(msg, ERR_STACK_OVERFLOW_ENV, s->name, size, var); return msg; } /*-------------------------------------------------------------------------* * M_SYS_ERR_STRING * * * *-------------------------------------------------------------------------*/ char * M_Sys_Err_String(int err_no) { #ifdef M_sparc_sunos extern char *sys_errlist[]; extern int sys_nerr; #endif char *str; static char buff[32]; #if defined(M_sparc_sunos) str = (err_no >= 0 && err_no < sys_nerr) ? sys_errlist[err_no] : NULL; #else str = strerror(err_no); #endif if (str) return str; sprintf(buff, UNKOWN_SYS_ERRNO, err_no); return buff; } #if 0 #define ULL unsigned long long #else #define ULL unsigned __int64 #endif /*-------------------------------------------------------------------------*/ /* M_USER_TIME */ /* */ /* returns the user time used since the start of the process (in ms). */ /*-------------------------------------------------------------------------*/ long M_User_Time(void) { long user_time; #if defined(__unix__) && !defined(__CYGWIN__) struct rusage rsr_usage; getrusage(RUSAGE_SELF, &rsr_usage); user_time = (rsr_usage.ru_utime.tv_sec * 1000) + (rsr_usage.ru_utime.tv_usec / 1000); #elif defined(_WIN32) || defined(__CYGWIN__) FILETIME creat_t, exit_t, kernel_t, user_t; /* Success on Windows NT */ if (GetProcessTimes(GetCurrentProcess(), &creat_t, &exit_t, &kernel_t, &user_t)) user_time = (long) (((ULL) user_t.dwHighDateTime << 32) + (ULL) user_t.dwLowDateTime) / 10000; else /* not implemented on Windows 95/98 */ user_time = (long) ((double) clock() * 1000 / CLOCKS_PER_SEC); #else Fatal_Error("user time not available"); return 0; #endif return user_time - start_user_time; } /*-------------------------------------------------------------------------* * M_SYSTEM_TIME * * * * returns the system time used since the start of the process (in ms). * *-------------------------------------------------------------------------*/ long M_System_Time(void) { long system_time; #if defined(__unix__) && !defined(__CYGWIN__) struct rusage rsr_usage; getrusage(RUSAGE_SELF, &rsr_usage); system_time = (rsr_usage.ru_stime.tv_sec * 1000) + (rsr_usage.ru_stime.tv_usec / 1000); #elif defined(_WIN32) || defined(__CYGWIN__) FILETIME creat_t, exit_t, kernel_t, user_t; /* Success on Windows NT */ if (GetProcessTimes(GetCurrentProcess(), &creat_t, &exit_t, &kernel_t, &user_t)) system_time = (long) (((ULL) kernel_t.dwHighDateTime << 32) + (ULL) kernel_t.dwLowDateTime) / 10000; else /* not implemented on Windows 95/98 */ system_time = 0; #else Fatal_Error("system time not available"); return 0; #endif return system_time - start_system_time; } /*-------------------------------------------------------------------------* * M_REAL_TIME * * * * returns the real time used since the start of the process (in ms). * *-------------------------------------------------------------------------*/ long M_Real_Time(void) { long real_time; #if defined(__unix__) && !defined(__CYGWIN__) struct timeval tv; gettimeofday(&tv, NULL); real_time = (tv.tv_sec * 1000) + (tv.tv_usec / 1000); #elif defined(_WIN32) || defined(__CYGWIN__) real_time = (long) ((double) clock() * 1000 / CLOCKS_PER_SEC); #else Fatal_Error("real time not available"); return 0; #endif return real_time - start_real_time; } #ifndef RAND_MAX #define RAND_MAX (((unsigned) -1) >> 1) #endif /*-------------------------------------------------------------------------* * M_RANDOMIZE * * * *-------------------------------------------------------------------------*/ void M_Randomize(void) { #if defined(_WIN32) || defined(__CYGWIN__) int seed = GetTickCount(); #else struct timeval tv; int seed; gettimeofday(&tv, NULL); seed = ((tv.tv_sec * 1000) + (tv.tv_usec / 1000)); #endif seed = (seed ^ getpid()) & 0xFFFFFF; M_Set_Seed(seed); } /*-------------------------------------------------------------------------* * M_SET_SEED * * * *-------------------------------------------------------------------------*/ void M_Set_Seed(int n) { cur_seed = n; srand(cur_seed); } /*-------------------------------------------------------------------------* * M_GET_SEED * * * *-------------------------------------------------------------------------*/ int M_Get_Seed(void) { return cur_seed; } /*-------------------------------------------------------------------------* * M_RANDOM_INTEGER * * * * return an integer x s.t. 0 <= x < n * *-------------------------------------------------------------------------*/ int M_Random_Integer(int n) { return (int) ((double) n * rand() / (RAND_MAX + 1.0)); } /*-------------------------------------------------------------------------* * M_RANDOM_FLOAT * * * * return a double x s.t. 0 <= x < n * *-------------------------------------------------------------------------*/ double M_Random_Float(double n) { return n * rand() / (RAND_MAX + 1.0); } /*-------------------------------------------------------------------------* * M_HOST_NAME_FROM_NAME * * * * if host_name==NULL use current host name. * *-------------------------------------------------------------------------*/ char * M_Host_Name_From_Name(char *host_name) { static char buff[4096]; #ifdef INET_MANAGEMENT struct hostent *host_entry; #endif if (host_name == NULL) { long length = sizeof(buff); host_name = buff; #if defined(_WIN32) && !defined(__CYGWIN__) && defined(NO_USE_SOCKETS) if (GetComputerName(buff, &length) == 0) #else if (gethostname(buff, length)) #endif { strcpy(buff, "unknown host name"); goto finish; } } if (strchr(host_name, '.') != NULL) /* qualified name */ goto finish; #ifdef INET_MANAGEMENT host_entry = gethostbyname(host_name); /* use name server */ if (host_entry == NULL) goto finish; host_name = Host_Name_From_Alias(host_entry); #endif finish: return host_name; } /*-------------------------------------------------------------------------* * M_HOST_NAME_FROM_ADR * * * *-------------------------------------------------------------------------*/ char * M_Host_Name_From_Adr(char *host_address) { #ifdef INET_MANAGEMENT struct hostent *host_entry; struct in_addr iadr; #if defined(M_sparc_sunos) || defined(M_sparc_solaris) || \ defined(M_ix86_cygwin) || defined(M_ix86_solaris) || \ defined(_WIN32) if ((iadr.s_addr = inet_addr(host_address)) == -1) #else if (inet_aton(host_address, &iadr) == 0) #endif return FALSE; host_entry = gethostbyaddr((char *) &iadr, sizeof(iadr), AF_INET); if (host_entry == NULL) return NULL; return Host_Name_From_Alias(host_entry); #else return NULL; #endif } #ifdef INET_MANAGEMENT /*-------------------------------------------------------------------------* * HOST_NAME_FROM_ALIAS * * * *-------------------------------------------------------------------------*/ static char * Host_Name_From_Alias(struct hostent *host_entry) { char *name; char **alias; char *p; name = (char *) host_entry->h_name; alias = host_entry->h_aliases; while ((p = strchr(name, '.')) == NULL && *alias) name = *alias++; if (p) return name; return (char *) host_entry->h_name; } #endif /*-------------------------------------------------------------------------* * M_SET_WORKING_DIR * * * * must preserve errno if fails (used in os_interf_c.c) * *-------------------------------------------------------------------------*/ Bool M_Set_Working_Dir(char *path) { char *new_path = M_Absolute_Path_Name(path); return (new_path != NULL && chdir(new_path) == 0); } /*-------------------------------------------------------------------------* * M_GET_WORKING_DIR * * * *-------------------------------------------------------------------------*/ char * M_Get_Working_Dir(void) { static char cur_work_dir[MAXPATHLEN]; getcwd(cur_work_dir, sizeof(cur_work_dir) - 1); return cur_work_dir; } /*-------------------------------------------------------------------------* * M_ABSOLUTE_PATH_NAME * * * * returns an absolute file name. * *-------------------------------------------------------------------------*/ char * M_Absolute_Path_Name(char *src) { static char buff[2][MAXPATHLEN]; int res = 0; char *dst; char *p, *q; char c; dst = buff[res]; while ((*dst++ = *src)) /* expand $VARNAME and %VARNAME% (Win32) */ { c = *src++; if (c == '$' #if defined(_WIN32) || defined(__CYGWIN__) || c == '%' #endif ) { p = dst; while (isalnum(*src)) *dst++ = *src++; #if defined(_WIN32) || defined(__CYGWIN__) if (c == '%' && *src != '%') continue; #endif *dst = '\0'; q = getenv(p); if (q) { p--; strcpy(p, q); dst = p + strlen(p); #if defined(_WIN32) || defined(__CYGWIN__) if (c == '%') src++; #endif } #if defined(_WIN32) || defined(__CYGWIN__) else if (c == '%') *dst++ = *src++; #endif } } *dst = '\0'; if (buff[res][0] == '~') { if (buff[res][1] == DIR_SEP_C || buff[res][1] == '\0') /* ~/... cf $HOME */ { if ((p = getenv("HOME")) == NULL && (p = getenv("HOMEPATH")) == NULL) return NULL; sprintf(buff[1 - res], "%s/%s", p, buff[res] + 1); res = 1 - res; } #if defined(__unix__) || defined(__CYGWIN__) else /* ~user/... read passwd */ { struct passwd *pw; p = buff[res] + 1; while (*p && *p != DIR_SEP_C) p++; buff[res][0] = *p; *p = '\0'; if ((pw = getpwnam(buff[res] + 1)) == NULL) return NULL; *p = buff[res][0]; sprintf(buff[1 - res], "%s/%s", pw->pw_dir, p); res = 1 - res; } #endif } if (strcmp(buff[res], "user") == 0) /* prolog special file 'user' */ return buff[res]; #ifdef __CYGWIN__ cygwin_conv_to_full_posix_path(buff[res], buff[1 - res]); res = 1 - res; #endif #if defined(_WIN32) || defined(__CYGWIN__) for (src = buff[res]; *src; src++) /* \ becomes / */ if (*src == '\\') *src = '/'; #endif #if defined(_WIN32) && !defined(__CYGWIN__) if (_fullpath(buff[1 - res], buff[res], MAXPATHLEN) == NULL) return NULL; res = 1 - res; #else /* unix */ if (buff[res][0] != DIR_SEP_C) /* add current directory */ { sprintf(buff[1 - res], "%s/%s", M_Get_Working_Dir(), buff[res]); res = 1 - res; } #endif src = buff[res]; res = 1 - res; dst = buff[res]; while ((*dst++ = *src)) { if (*src++ != DIR_SEP_C) continue; collapse: while (*src == DIR_SEP_C) /* collapse /////... as / */ src++; if (*src != '.') continue; if (src[1] == DIR_SEP_C || src[1] == '\0') /* /./ removed */ { src++; goto collapse; } if (src[1] != '.' || (src[2] != DIR_SEP_C && src[2] != '\0')) continue; /* case /../ */ src += 2; p = dst - 2; while (p >= buff[res] && *p != DIR_SEP_C) p--; if (p < buff[res]) return NULL; dst = p; } if (dst[-2] == DIR_SEP_C) dst[-2] = '\0'; /* remove last / */ return buff[res]; } ./gprolog-1.3.0/src/EnginePl/pred.h0000644004425400513100000000567310547154141015401 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : pred.h * * Descr.: predicate table management - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: pred.h,v 1.12 2007/01/04 10:35:13 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct /* Predicate information */ { /* ------------------------------ */ long f_n; /* key is */ int pl_file; /* atom pl file of its definiton */ int pl_line; /* pl file line of its definition */ int prop; /* predicate props (cf BipsPl) */ long *codep; /* compiled code */ long *dyn; /* dynamic info (cf BipsPl) */ } PredInf; /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef PRED_FILE char *pred_tbl; #else extern char *pred_tbl; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Init_Pred(void); PredInf * FC Create_Pred(int func, int arity, int pl_file, int pl_line, int prop, long *codep); PredInf * FC Lookup_Pred(int func, int arity); void FC Delete_Pred(int func, int arity); ./gprolog-1.3.0/src/EnginePl/dl_malloc.c0000644004425400513100000053746510547152475016411 0ustar diazloco/* This is a version (aka dlmalloc) of malloc/free/realloc written by Doug Lea and released to the public domain, as explained at http://creativecommons.org/licenses/publicdomain. Send questions, comments, complaints, performance data, etc to dl@cs.oswego.edu * Version 2.8.3 Thu Sep 22 11:16:15 2005 Doug Lea (dl at gee) Note: There may be an updated version of this malloc obtainable at ftp://gee.cs.oswego.edu/pub/misc/malloc.c Check before installing! * Quickstart This library is all in one file to simplify the most common usage: ftp it, compile it (-O3), and link it into another program. All of the compile-time options default to reasonable values for use on most platforms. You might later want to step through various compile-time and dynamic tuning options. For convenience, an include file for code using this malloc is at: ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h You don't really need this .h file unless you call functions not defined in your system include files. The .h file contains only the excerpts from this file needed for using this malloc on ANSI C/C++ systems, so long as you haven't changed compile-time options about naming and tuning parameters. If you do, then you can create your own malloc.h that does include all settings by cutting at the point indicated below. Note that you may already by default be using a C library containing a malloc that is based on some version of this malloc (for example in linux). You might still want to use the one in this file to customize settings or to avoid overheads associated with library versions. * Vital statistics: Supported pointer/size_t representation: 4 or 8 bytes size_t MUST be an unsigned type of the same width as pointers. (If you are using an ancient system that declares size_t as a signed type, or need it to be a different width than pointers, you can use a previous release of this malloc (e.g. 2.7.2) supporting these.) Alignment: 8 bytes (default) This suffices for nearly all current machines and C compilers. However, you can define MALLOC_ALIGNMENT to be wider than this if necessary (up to 128bytes), at the expense of using more space. Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) 8 or 16 bytes (if 8byte sizes) Each malloced chunk has a hidden word of overhead holding size and status information, and additional cross-check word if FOOTERS is defined. Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) 8-byte ptrs: 32 bytes (including overhead) Even a request for zero bytes (i.e., malloc(0)) returns a pointer to something of the minimum allocatable size. The maximum overhead wastage (i.e., number of extra bytes allocated than were requested in malloc) is less than or equal to the minimum size, except for requests >= mmap_threshold that are serviced via mmap(), where the worst case wastage is about 32 bytes plus the remainder from a system page (the minimal mmap unit); typically 4096 or 8192 bytes. Security: static-safe; optionally more or less The "security" of malloc refers to the ability of malicious code to accentuate the effects of errors (for example, freeing space that is not currently malloc'ed or overwriting past the ends of chunks) in code that calls malloc. This malloc guarantees not to modify any memory locations below the base of heap, i.e., static variables, even in the presence of usage errors. The routines additionally detect most improper frees and reallocs. All this holds as long as the static bookkeeping for malloc itself is not corrupted by some other means. This is only one aspect of security -- these checks do not, and cannot, detect all possible programming errors. If FOOTERS is defined nonzero, then each allocated chunk carries an additional check word to verify that it was malloced from its space. These check words are the same within each execution of a program using malloc, but differ across executions, so externally crafted fake chunks cannot be freed. This improves security by rejecting frees/reallocs that could corrupt heap memory, in addition to the checks preventing writes to statics that are always on. This may further improve security at the expense of time and space overhead. (Note that FOOTERS may also be worth using with MSPACES.) By default detected errors cause the program to abort (calling "abort()"). You can override this to instead proceed past errors by defining PROCEED_ON_ERROR. In this case, a bad free has no effect, and a malloc that encounters a bad address caused by user overwrites will ignore the bad address by dropping pointers and indices to all known memory. This may be appropriate for programs that should continue if at all possible in the face of programming errors, although they may run out of memory because dropped memory is never reclaimed. If you don't like either of these options, you can define CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything else. And if if you are sure that your program using malloc has no errors or vulnerabilities, you can define INSECURE to 1, which might (or might not) provide a small performance improvement. Thread-safety: NOT thread-safe unless USE_LOCKS defined When USE_LOCKS is defined, each public call to malloc, free, etc is surrounded with either a pthread mutex or a win32 spinlock (depending on WIN32). This is not especially fast, and can be a major bottleneck. It is designed only to provide minimal protection in concurrent environments, and to provide a basis for extensions. If you are using malloc in a concurrent program, consider instead using ptmalloc, which is derived from a version of this malloc. (See http://www.malloc.de). System requirements: Any combination of MORECORE and/or MMAP/MUNMAP This malloc can use unix sbrk or any emulation (invoked using the CALL_MORECORE macro) and/or mmap/munmap or any emulation (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system memory. On most unix systems, it tends to work best if both MORECORE and MMAP are enabled. On Win32, it uses emulations based on VirtualAlloc. It also uses common C library functions like memset. Compliance: I believe it is compliant with the Single Unix Specification (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably others as well. * Overview of algorithms This is not the fastest, most space-conserving, most portable, or most tunable malloc ever written. However it is among the fastest while also being among the most space-conserving, portable and tunable. Consistent balance across these factors results in a good general-purpose allocator for malloc-intensive programs. In most ways, this malloc is a best-fit allocator. Generally, it chooses the best-fitting existing chunk for a request, with ties broken in approximately least-recently-used order. (This strategy normally maintains low fragmentation.) However, for requests less than 256bytes, it deviates from best-fit when there is not an exactly fitting available chunk by preferring to use space adjacent to that used for the previous small request, as well as by breaking ties in approximately most-recently-used order. (These enhance locality of series of small allocations.) And for very large requests (>= 256Kb by default), it relies on system memory mapping facilities, if supported. (This helps avoid carrying around and possibly fragmenting memory used only for large chunks.) All operations (except malloc_stats and mallinfo) have execution times that are bounded by a constant factor of the number of bits in a size_t, not counting any clearing in calloc or copying in realloc, or actions surrounding MORECORE and MMAP that have times proportional to the number of non-contiguous regions returned by system allocation routines, which is often just 1. The implementation is not very modular and seriously overuses macros. Perhaps someday all C compilers will do as good a job inlining modular code as can now be done by brute-force expansion, but now, enough of them seem not to. Some compilers issue a lot of warnings about code that is dead/unreachable only on some platforms, and also about intentional uses of negation on unsigned types. All known cases of each can be ignored. For a longer but out of date high-level description, see http://gee.cs.oswego.edu/dl/html/malloc.html * MSPACES If MSPACES is defined, then in addition to malloc, free, etc., this file also defines mspace_malloc, mspace_free, etc. These are versions of malloc routines that take an "mspace" argument obtained using create_mspace, to control all internal bookkeeping. If ONLY_MSPACES is defined, only these versions are compiled. So if you would like to use this allocator for only some allocations, and your system malloc for others, you can compile with ONLY_MSPACES and then do something like... static mspace mymspace = create_mspace(0,0); // for example #define mymalloc(bytes) mspace_malloc(mymspace, bytes) (Note: If you only need one instance of an mspace, you can instead use "USE_DL_PREFIX" to relabel the global malloc.) You can similarly create thread-local allocators by storing mspaces as thread-locals. For example: static __thread mspace tlms = 0; void* tlmalloc(size_t bytes) { if (tlms == 0) tlms = create_mspace(0, 0); return mspace_malloc(tlms, bytes); } void tlfree(void* mem) { mspace_free(tlms, mem); } Unless FOOTERS is defined, each mspace is completely independent. You cannot allocate from one and free to another (although conformance is only weakly checked, so usage errors are not always caught). If FOOTERS is defined, then each chunk carries around a tag indicating its originating mspace, and frees are directed to their originating spaces. ------------------------- Compile-time options --------------------------- Be careful in setting #define values for numerical constants of type size_t. On some systems, literal values are not automatically extended to size_t precision unless they are explicitly casted. WIN32 default: defined if _WIN32 defined Defining WIN32 sets up defaults for MS environment and compilers. Otherwise defaults are for unix. MALLOC_ALIGNMENT default: (size_t)8 Controls the minimum alignment for malloc'ed chunks. It must be a power of two and at least 8, even on machines for which smaller alignments would suffice. It may be defined as larger than this though. Note however that code and data structures are optimized for the case of 8-byte alignment. MSPACES default: 0 (false) If true, compile in support for independent allocation spaces. This is only supported if HAVE_MMAP is true. ONLY_MSPACES default: 0 (false) If true, only compile in mspace versions, not regular versions. USE_LOCKS default: 0 (false) Causes each call to each public routine to be surrounded with pthread or WIN32 mutex lock/unlock. (If set true, this can be overridden on a per-mspace basis for mspace versions.) FOOTERS default: 0 If true, provide extra checking and dispatching by placing information in the footers of allocated chunks. This adds space and time overhead. INSECURE default: 0 If true, omit checks for usage errors and heap space overwrites. USE_DL_PREFIX default: NOT defined Causes compiler to prefix all public routines with the string 'dl'. This can be useful when you only want to use this malloc in one part of a program, using your regular system malloc elsewhere. ABORT default: defined as abort() Defines how to abort on failed checks. On most systems, a failed check cannot die with an "assert" or even print an informative message, because the underlying print routines in turn call malloc, which will fail again. Generally, the best policy is to simply call abort(). It's not very useful to do more than this because many errors due to overwriting will show up as address faults (null, odd addresses etc) rather than malloc-triggered checks, so will also abort. Also, most compilers know that abort() does not return, so can better optimize code conditionally calling it. PROCEED_ON_ERROR default: defined as 0 (false) Controls whether detected bad addresses cause them to bypassed rather than aborting. If set, detected bad arguments to free and realloc are ignored. And all bookkeeping information is zeroed out upon a detected overwrite of freed heap space, thus losing the ability to ever return it from malloc again, but enabling the application to proceed. If PROCEED_ON_ERROR is defined, the static variable malloc_corruption_error_count is compiled in and can be examined to see if errors have occurred. This option generates slower code than the default abort policy. DEBUG default: NOT defined The DEBUG setting is mainly intended for people trying to modify this code or diagnose problems when porting to new platforms. However, it may also be able to better isolate user errors than just using runtime checks. The assertions in the check routines spell out in more detail the assumptions and invariants underlying the algorithms. The checking is fairly extensive, and will slow down execution noticeably. Calling malloc_stats or mallinfo with DEBUG set will attempt to check every non-mmapped allocated and free chunk in the course of computing the summaries. ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) Debugging assertion failures can be nearly impossible if your version of the assert macro causes malloc to be called, which will lead to a cascade of further failures, blowing the runtime stack. ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), which will usually make debugging easier. MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 The action to take before "return 0" when malloc fails to be able to return memory because there is none available. HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES True if this system supports sbrk or an emulation of it. MORECORE default: sbrk The name of the sbrk-style system routine to call to obtain more memory. See below for guidance on writing custom MORECORE functions. The type of the argument to sbrk/MORECORE varies across systems. It cannot be size_t, because it supports negative arguments, so it is normally the signed type of the same width as size_t (sometimes declared as "intptr_t"). It doesn't much matter though. Internally, we only call it with arguments less than half the max value of a size_t, which should work across all reasonable possibilities, although sometimes generating compiler warnings. See near the end of this file for guidelines for creating a custom version of MORECORE. MORECORE_CONTIGUOUS default: 1 (true) If true, take advantage of fact that consecutive calls to MORECORE with positive arguments always return contiguous increasing addresses. This is true of unix sbrk. It does not hurt too much to set it true anyway, since malloc copes with non-contiguities. Setting it false when definitely non-contiguous saves time and possibly wasted space it would take to discover this though. MORECORE_CANNOT_TRIM default: NOT defined True if MORECORE cannot release space back to the system when given negative arguments. This is generally necessary only if you are using a hand-crafted MORECORE function that cannot handle negative arguments. HAVE_MMAP default: 1 (true) True if this system supports mmap or an emulation of it. If so, and HAVE_MORECORE is not true, MMAP is used for all system allocation. If set and HAVE_MORECORE is true as well, MMAP is primarily used to directly allocate very large blocks. It is also used as a backup strategy in cases where MORECORE fails to provide space from system. Note: A single call to MUNMAP is assumed to be able to unmap memory that may have be allocated using multiple calls to MMAP, so long as they are adjacent. HAVE_MREMAP default: 1 on linux, else 0 If true realloc() uses mremap() to re-allocate large blocks and extend or shrink allocation spaces. MMAP_CLEARS default: 1 on unix True if mmap clears memory so calloc doesn't need to. This is true for standard unix mmap using /dev/zero. USE_BUILTIN_FFS default: 0 (i.e., not used) Causes malloc to use the builtin ffs() function to compute indices. Some compilers may recognize and intrinsify ffs to be faster than the supplied C version. Also, the case of x86 using gcc is special-cased to an asm instruction, so is already as fast as it can be, and so this setting has no effect. (On most x86s, the asm version is only slightly faster than the C version.) malloc_getpagesize default: derive from system includes, or 4096. The system page size. To the extent possible, this malloc manages memory from the system in page-size units. This may be (and usually is) a function rather than a constant. This is ignored if WIN32, where page size is determined using getSystemInfo during initialization. USE_DEV_RANDOM default: 0 (i.e., not used) Causes malloc to use /dev/random to initialize secure magic seed for stamping footers. Otherwise, the current time is used. NO_MALLINFO default: 0 If defined, don't compile "mallinfo". This can be a simple way of dealing with mismatches between system declarations and those in this file. MALLINFO_FIELD_TYPE default: size_t The type of the fields in the mallinfo struct. This was originally defined as "int" in SVID etc, but is more usefully defined as size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set REALLOC_ZERO_BYTES_FREES default: not defined This should be set if a call to realloc with zero bytes should be the same as a call to free. Some people think it should. Otherwise, since this malloc returns a unique pointer for malloc(0), so does realloc(p, 0). LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H LACKS_STDLIB_H default: NOT defined unless on WIN32 Define these if your system does not have these header files. You might need to manually insert some of the declarations they provide. DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, system_info.dwAllocationGranularity in WIN32, otherwise 64K. Also settable using mallopt(M_GRANULARITY, x) The unit for allocating and deallocating memory from the system. On most systems with contiguous MORECORE, there is no reason to make this more than a page. However, systems with MMAP tend to either require or encourage larger granularities. You can increase this value to prevent system allocation functions to be called so often, especially if they are slow. The value must be at least one page and must be a power of two. Setting to 0 causes initialization to either page size or win32 region size. (Note: In previous versions of malloc, the equivalent of this option was called "TOP_PAD") DEFAULT_TRIM_THRESHOLD default: 2MB Also settable using mallopt(M_TRIM_THRESHOLD, x) The maximum amount of unused top-most memory to keep before releasing via malloc_trim in free(). Automatic trimming is mainly useful in long-lived programs using contiguous MORECORE. Because trimming via sbrk can be slow on some systems, and can sometimes be wasteful (in cases where programs immediately afterward allocate more large chunks) the value should be high enough so that your overall system performance would improve by releasing this much memory. As a rough guide, you might set to a value close to the average size of a process (program) running on your system. Releasing this much memory would allow such a process to run in memory. Generally, it is worth tuning trim thresholds when a program undergoes phases where several large chunks are allocated and released in ways that can reuse each other's storage, perhaps mixed with phases where there are no such chunks at all. The trim value must be greater than page size to have any useful effect. To disable trimming completely, you can set to MAX_SIZE_T. Note that the trick some people use of mallocing a huge space and then freeing it at program startup, in an attempt to reserve system memory, doesn't have the intended effect under automatic trimming, since that memory will immediately be returned to the system. DEFAULT_MMAP_THRESHOLD default: 256K Also settable using mallopt(M_MMAP_THRESHOLD, x) The request size threshold for using MMAP to directly service a request. Requests of at least this size that cannot be allocated using already-existing space will be serviced via mmap. (If enough normal freed space already exists it is used instead.) Using mmap segregates relatively large chunks of memory so that they can be individually obtained and released from the host system. A request serviced through mmap is never reused by any other request (at least not directly; the system may just so happen to remap successive requests to the same locations). Segregating space in this way has the benefits that: Mmapped space can always be individually released back to the system, which helps keep the system level memory demands of a long-lived program low. Also, mapped memory doesn't become `locked' between other chunks, as can happen with normally allocated chunks, which means that even trimming via malloc_trim would not release them. However, it has the disadvantage that the space cannot be reclaimed, consolidated, and then used to service later requests, as happens with normal chunks. The advantages of mmap nearly always outweigh disadvantages for "large" chunks, but the value of "large" may vary across systems. The default is an empirically derived value that works well in most systems. You can disable mmap by setting to MAX_SIZE_T. */ #ifndef WIN32 #ifdef _WIN32 #define WIN32 1 #endif /* _WIN32 */ #endif /* WIN32 */ #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include #define HAVE_MMAP 1 #define HAVE_MORECORE 0 #define LACKS_UNISTD_H #define LACKS_SYS_PARAM_H #define LACKS_SYS_MMAN_H #define LACKS_STRING_H #define LACKS_STRINGS_H #define LACKS_SYS_TYPES_H #define LACKS_ERRNO_H #define MALLOC_FAILURE_ACTION #define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */ #endif /* WIN32 */ #if defined(DARWIN) || defined(_DARWIN) /* Mac OSX docs advise not to use sbrk; it seems better to use mmap */ #ifndef HAVE_MORECORE #define HAVE_MORECORE 0 #define HAVE_MMAP 1 #endif /* HAVE_MORECORE */ #endif /* DARWIN */ #ifndef LACKS_SYS_TYPES_H #include /* For size_t */ #endif /* LACKS_SYS_TYPES_H */ /* The maximum possible size_t value has all bits set */ #define MAX_SIZE_T (~(size_t)0) #ifndef ONLY_MSPACES #define ONLY_MSPACES 0 #endif /* ONLY_MSPACES */ #ifndef MSPACES #if ONLY_MSPACES #define MSPACES 1 #else /* ONLY_MSPACES */ #define MSPACES 0 #endif /* ONLY_MSPACES */ #endif /* MSPACES */ #ifndef MALLOC_ALIGNMENT #define MALLOC_ALIGNMENT ((size_t)8U) #endif /* MALLOC_ALIGNMENT */ #ifndef FOOTERS #define FOOTERS 0 #endif /* FOOTERS */ #ifndef ABORT #define ABORT abort() #endif /* ABORT */ #ifndef ABORT_ON_ASSERT_FAILURE #define ABORT_ON_ASSERT_FAILURE 1 #endif /* ABORT_ON_ASSERT_FAILURE */ #ifndef PROCEED_ON_ERROR #define PROCEED_ON_ERROR 0 #endif /* PROCEED_ON_ERROR */ #ifndef USE_LOCKS #define USE_LOCKS 0 #endif /* USE_LOCKS */ #ifndef INSECURE #define INSECURE 0 #endif /* INSECURE */ #ifndef HAVE_MMAP #define HAVE_MMAP 1 #endif /* HAVE_MMAP */ #ifndef MMAP_CLEARS #define MMAP_CLEARS 1 #endif /* MMAP_CLEARS */ #ifndef HAVE_MREMAP #ifdef linux #define HAVE_MREMAP 1 #else /* linux */ #define HAVE_MREMAP 0 #endif /* linux */ #endif /* HAVE_MREMAP */ #ifndef MALLOC_FAILURE_ACTION #define MALLOC_FAILURE_ACTION errno = ENOMEM; #endif /* MALLOC_FAILURE_ACTION */ #ifndef HAVE_MORECORE #if ONLY_MSPACES #define HAVE_MORECORE 0 #else /* ONLY_MSPACES */ #define HAVE_MORECORE 1 #endif /* ONLY_MSPACES */ #endif /* HAVE_MORECORE */ #if !HAVE_MORECORE #define MORECORE_CONTIGUOUS 0 #else /* !HAVE_MORECORE */ #ifndef MORECORE #define MORECORE sbrk #endif /* MORECORE */ #ifndef MORECORE_CONTIGUOUS #define MORECORE_CONTIGUOUS 1 #endif /* MORECORE_CONTIGUOUS */ #endif /* HAVE_MORECORE */ #ifndef DEFAULT_GRANULARITY #if MORECORE_CONTIGUOUS #define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ #else /* MORECORE_CONTIGUOUS */ #define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U) #endif /* MORECORE_CONTIGUOUS */ #endif /* DEFAULT_GRANULARITY */ #ifndef DEFAULT_TRIM_THRESHOLD #ifndef MORECORE_CANNOT_TRIM #define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) #else /* MORECORE_CANNOT_TRIM */ #define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T #endif /* MORECORE_CANNOT_TRIM */ #endif /* DEFAULT_TRIM_THRESHOLD */ #ifndef DEFAULT_MMAP_THRESHOLD #if HAVE_MMAP #define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) #else /* HAVE_MMAP */ #define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T #endif /* HAVE_MMAP */ #endif /* DEFAULT_MMAP_THRESHOLD */ #ifndef USE_BUILTIN_FFS #define USE_BUILTIN_FFS 0 #endif /* USE_BUILTIN_FFS */ #ifndef USE_DEV_RANDOM #define USE_DEV_RANDOM 0 #endif /* USE_DEV_RANDOM */ #ifndef NO_MALLINFO #define NO_MALLINFO 0 #endif /* NO_MALLINFO */ #ifndef MALLINFO_FIELD_TYPE #define MALLINFO_FIELD_TYPE size_t #endif /* MALLINFO_FIELD_TYPE */ /* mallopt tuning options. SVID/XPG defines four standard parameter numbers for mallopt, normally defined in malloc.h. None of these are used in this malloc, so setting them has no effect. But this malloc does support the following options. */ #define M_TRIM_THRESHOLD (-1) #define M_GRANULARITY (-2) #define M_MMAP_THRESHOLD (-3) /* ------------------------ Mallinfo declarations ------------------------ */ #if !NO_MALLINFO /* This version of malloc supports the standard SVID/XPG mallinfo routine that returns a struct containing usage properties and statistics. It should work on any system that has a /usr/include/malloc.h defining struct mallinfo. The main declaration needed is the mallinfo struct that is returned (by-copy) by mallinfo(). The malloinfo struct contains a bunch of fields that are not even meaningful in this version of malloc. These fields are are instead filled by mallinfo() with other numbers that might be of interest. HAVE_USR_INCLUDE_MALLOC_H should be set if you have a /usr/include/malloc.h file that includes a declaration of struct mallinfo. If so, it is included; else a compliant version is declared below. These must be precisely the same for mallinfo() to work. The original SVID version of this struct, defined on most systems with mallinfo, declares all fields as ints. But some others define as unsigned long. If your system defines the fields using a type of different width than listed here, you MUST #include your system version and #define HAVE_USR_INCLUDE_MALLOC_H. */ /* #define HAVE_USR_INCLUDE_MALLOC_H */ #ifdef HAVE_USR_INCLUDE_MALLOC_H #include "/usr/include/malloc.h" #else /* HAVE_USR_INCLUDE_MALLOC_H */ struct mallinfo { MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ MALLINFO_FIELD_TYPE smblks; /* always 0 */ MALLINFO_FIELD_TYPE hblks; /* always 0 */ MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ MALLINFO_FIELD_TYPE fordblks; /* total free space */ MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ }; #endif /* HAVE_USR_INCLUDE_MALLOC_H */ #endif /* NO_MALLINFO */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #if !ONLY_MSPACES /* ------------------- Declarations of public routines ------------------- */ #ifndef USE_DL_PREFIX #define dlcalloc calloc #define dlfree free #define dlmalloc malloc #define dlmemalign memalign #define dlrealloc realloc #define dlvalloc valloc #define dlpvalloc pvalloc #define dlmallinfo mallinfo #define dlmallopt mallopt #define dlmalloc_trim malloc_trim #define dlmalloc_stats malloc_stats #define dlmalloc_usable_size malloc_usable_size #define dlmalloc_footprint malloc_footprint #define dlmalloc_max_footprint malloc_max_footprint #define dlindependent_calloc independent_calloc #define dlindependent_comalloc independent_comalloc #endif /* USE_DL_PREFIX */ /* malloc(size_t n) Returns a pointer to a newly allocated chunk of at least n bytes, or null if no space is available, in which case errno is set to ENOMEM on ANSI C systems. If n is zero, malloc returns a minimum-sized chunk. (The minimum size is 16 bytes on most 32bit systems, and 32 bytes on 64bit systems.) Note that size_t is an unsigned type, so calls with arguments that would be negative if signed are interpreted as requests for huge amounts of space, which will often fail. The maximum supported value of n differs across systems, but is in all cases less than the maximum representable value of a size_t. */ void* dlmalloc(size_t); /* free(void* p) Releases the chunk of memory pointed to by p, that had been previously allocated using malloc or a related routine such as realloc. It has no effect if p is null. If p was not malloced or already freed, free(p) will by default cause the current program to abort. */ void dlfree(void*); /* calloc(size_t n_elements, size_t element_size); Returns a pointer to n_elements * element_size bytes, with all locations set to zero. */ void* dlcalloc(size_t, size_t); /* realloc(void* p, size_t n) Returns a pointer to a chunk of size n that contains the same data as does chunk p up to the minimum of (n, p's size) bytes, or null if no space is available. The returned pointer may or may not be the same as p. The algorithm prefers extending p in most cases when possible, otherwise it employs the equivalent of a malloc-copy-free sequence. If p is null, realloc is equivalent to malloc. If space is not available, realloc returns null, errno is set (if on ANSI) and p is NOT freed. if n is for fewer bytes than already held by p, the newly unused space is lopped off and freed if possible. realloc with a size argument of zero (re)allocates a minimum-sized chunk. The old unix realloc convention of allowing the last-free'd chunk to be used as an argument to realloc is not supported. */ void* dlrealloc(void*, size_t); /* memalign(size_t alignment, size_t n); Returns a pointer to a newly allocated chunk of n bytes, aligned in accord with the alignment argument. The alignment argument should be a power of two. If the argument is not a power of two, the nearest greater power is used. 8-byte alignment is guaranteed by normal malloc calls, so don't bother calling memalign with an argument of 8 or less. Overreliance on memalign is a sure way to fragment space. */ void* dlmemalign(size_t, size_t); /* valloc(size_t n); Equivalent to memalign(pagesize, n), where pagesize is the page size of the system. If the pagesize is unknown, 4096 is used. */ void* dlvalloc(size_t); /* mallopt(int parameter_number, int parameter_value) Sets tunable parameters The format is to provide a (parameter-number, parameter-value) pair. mallopt then sets the corresponding parameter to the argument value if it can (i.e., so long as the value is meaningful), and returns 1 if successful else 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, normally defined in malloc.h. None of these are use in this malloc, so setting them has no effect. But this malloc also supports other options in mallopt. See below for details. Briefly, supported parameters are as follows (listed defaults are for "typical" configurations). Symbol param # default allowed param values M_TRIM_THRESHOLD -1 2*1024*1024 any (MAX_SIZE_T disables) M_GRANULARITY -2 page size any power of 2 >= page size M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) */ int dlmallopt(int, int); /* malloc_footprint(); Returns the number of bytes obtained from the system. The total number of bytes allocated by malloc, realloc etc., is less than this value. Unlike mallinfo, this function returns only a precomputed result, so can be called frequently to monitor memory consumption. Even if locks are otherwise defined, this function does not use them, so results might not be up to date. */ size_t dlmalloc_footprint(void); /* malloc_max_footprint(); Returns the maximum number of bytes obtained from the system. This value will be greater than current footprint if deallocated space has been reclaimed by the system. The peak number of bytes allocated by malloc, realloc etc., is less than this value. Unlike mallinfo, this function returns only a precomputed result, so can be called frequently to monitor memory consumption. Even if locks are otherwise defined, this function does not use them, so results might not be up to date. */ size_t dlmalloc_max_footprint(void); #if !NO_MALLINFO /* mallinfo() Returns (by copy) a struct containing various summary statistics: arena: current total non-mmapped bytes allocated from system ordblks: the number of free chunks smblks: always zero. hblks: current number of mmapped regions hblkhd: total bytes held in mmapped regions usmblks: the maximum total allocated space. This will be greater than current total if trimming has occurred. fsmblks: always zero uordblks: current total allocated space (normal or mmapped) fordblks: total free space keepcost: the maximum number of bytes that could ideally be released back to system via malloc_trim. ("ideally" means that it ignores page restrictions etc.) Because these fields are ints, but internal bookkeeping may be kept as longs, the reported values may wrap around zero and thus be inaccurate. */ struct mallinfo dlmallinfo(void); #endif /* NO_MALLINFO */ /* independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); independent_calloc is similar to calloc, but instead of returning a single cleared space, it returns an array of pointers to n_elements independent elements that can hold contents of size elem_size, each of which starts out cleared, and can be independently freed, realloc'ed etc. The elements are guaranteed to be adjacently allocated (this is not guaranteed to occur with multiple callocs or mallocs), which may also improve cache locality in some applications. The "chunks" argument is optional (i.e., may be null, which is probably the most typical usage). If it is null, the returned array is itself dynamically allocated and should also be freed when it is no longer needed. Otherwise, the chunks array must be of at least n_elements in length. It is filled in with the pointers to the chunks. In either case, independent_calloc returns this pointer array, or null if the allocation failed. If n_elements is zero and "chunks" is null, it returns a chunk representing an array with zero elements (which should be freed if not wanted). Each element must be individually freed when it is no longer needed. If you'd like to instead be able to free all at once, you should instead use regular calloc and assign pointers into this space to represent elements. (In this case though, you cannot independently free elements.) independent_calloc simplifies and speeds up implementations of many kinds of pools. It may also be useful when constructing large data structures that initially have a fixed number of fixed-sized nodes, but the number is not known at compile time, and some of the nodes may later need to be freed. For example: struct Node { int item; struct Node* next; }; struct Node* build_list() { struct Node** pool; int n = read_number_of_nodes_needed(); if (n <= 0) return 0; pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); if (pool == 0) die(); // organize into a linked list... struct Node* first = pool[0]; for (i = 0; i < n-1; ++i) pool[i]->next = pool[i+1]; free(pool); // Can now free the array (or not, if it is needed later) return first; } */ void** dlindependent_calloc(size_t, size_t, void**); /* independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); independent_comalloc allocates, all at once, a set of n_elements chunks with sizes indicated in the "sizes" array. It returns an array of pointers to these elements, each of which can be independently freed, realloc'ed etc. The elements are guaranteed to be adjacently allocated (this is not guaranteed to occur with multiple callocs or mallocs), which may also improve cache locality in some applications. The "chunks" argument is optional (i.e., may be null). If it is null the returned array is itself dynamically allocated and should also be freed when it is no longer needed. Otherwise, the chunks array must be of at least n_elements in length. It is filled in with the pointers to the chunks. In either case, independent_comalloc returns this pointer array, or null if the allocation failed. If n_elements is zero and chunks is null, it returns a chunk representing an array with zero elements (which should be freed if not wanted). Each element must be individually freed when it is no longer needed. If you'd like to instead be able to free all at once, you should instead use a single regular malloc, and assign pointers at particular offsets in the aggregate space. (In this case though, you cannot independently free elements.) independent_comallac differs from independent_calloc in that each element may have a different size, and also that it does not automatically clear elements. independent_comalloc can be used to speed up allocation in cases where several structs or objects must always be allocated at the same time. For example: struct Head { ... } struct Foot { ... } void send_message(char* msg) { int msglen = strlen(msg); size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; void* chunks[3]; if (independent_comalloc(3, sizes, chunks) == 0) die(); struct Head* head = (struct Head*)(chunks[0]); char* body = (char*)(chunks[1]); struct Foot* foot = (struct Foot*)(chunks[2]); // ... } In general though, independent_comalloc is worth using only for larger values of n_elements. For small values, you probably won't detect enough difference from series of malloc calls to bother. Overuse of independent_comalloc can increase overall memory usage, since it cannot reuse existing noncontiguous small chunks that might be available for some of the elements. */ void** dlindependent_comalloc(size_t, size_t*, void**); /* pvalloc(size_t n); Equivalent to valloc(minimum-page-that-holds(n)), that is, round up n to nearest pagesize. */ void* dlpvalloc(size_t); /* malloc_trim(size_t pad); If possible, gives memory back to the system (via negative arguments to sbrk) if there is unused memory at the `high' end of the malloc pool or in unused MMAP segments. You can call this after freeing large blocks of memory to potentially reduce the system-level memory requirements of a program. However, it cannot guarantee to reduce memory. Under some allocation patterns, some large free blocks of memory will be locked between two used chunks, so they cannot be given back to the system. The `pad' argument to malloc_trim represents the amount of free trailing space to leave untrimmed. If this argument is zero, only the minimum amount of memory to maintain internal data structures will be left. Non-zero arguments can be supplied to maintain enough trailing space to service future expected allocations without having to re-obtain memory from the system. Malloc_trim returns 1 if it actually released any memory, else 0. */ int dlmalloc_trim(size_t); /* malloc_usable_size(void* p); Returns the number of bytes you can actually use in an allocated chunk, which may be more than you requested (although often not) due to alignment and minimum size constraints. You can use this many bytes without worrying about overwriting other allocated objects. This is not a particularly great programming practice. malloc_usable_size can be more useful in debugging and assertions, for example: p = malloc(n); assert(malloc_usable_size(p) >= 256); */ size_t dlmalloc_usable_size(void*); /* malloc_stats(); Prints on stderr the amount of space obtained from the system (both via sbrk and mmap), the maximum amount (which may be more than current if malloc_trim and/or munmap got called), and the current number of bytes allocated via malloc (or realloc, etc) but not yet freed. Note that this is the number of bytes allocated, not the number requested. It will be larger than the number requested because of alignment and bookkeeping overhead. Because it includes alignment wastage as being in use, this figure may be greater than zero even when no user-level chunks are allocated. The reported current and maximum system memory can be inaccurate if a program makes other calls to system memory allocation functions (normally sbrk) outside of malloc. malloc_stats prints only the most commonly interesting statistics. More information can be obtained by calling mallinfo. */ void dlmalloc_stats(void); #endif /* ONLY_MSPACES */ #if MSPACES /* mspace is an opaque type representing an independent region of space that supports mspace_malloc, etc. */ typedef void* mspace; /* create_mspace creates and returns a new independent space with the given initial capacity, or, if 0, the default granularity size. It returns null if there is no system memory available to create the space. If argument locked is non-zero, the space uses a separate lock to control access. The capacity of the space will grow dynamically as needed to service mspace_malloc requests. You can control the sizes of incremental increases of this space by compiling with a different DEFAULT_GRANULARITY or dynamically setting with mallopt(M_GRANULARITY, value). */ mspace create_mspace(size_t capacity, int locked); /* destroy_mspace destroys the given space, and attempts to return all of its memory back to the system, returning the total number of bytes freed. After destruction, the results of access to all memory used by the space become undefined. */ size_t destroy_mspace(mspace msp); /* create_mspace_with_base uses the memory supplied as the initial base of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this space is used for bookkeeping, so the capacity must be at least this large. (Otherwise 0 is returned.) When this initial space is exhausted, additional memory will be obtained from the system. Destroying this space will deallocate all additionally allocated space (if possible) but not the initial base. */ mspace create_mspace_with_base(void* base, size_t capacity, int locked); /* mspace_malloc behaves as malloc, but operates within the given space. */ void* mspace_malloc(mspace msp, size_t bytes); /* mspace_free behaves as free, but operates within the given space. If compiled with FOOTERS==1, mspace_free is not actually needed. free may be called instead of mspace_free because freed chunks from any space are handled by their originating spaces. */ void mspace_free(mspace msp, void* mem); /* mspace_realloc behaves as realloc, but operates within the given space. If compiled with FOOTERS==1, mspace_realloc is not actually needed. realloc may be called instead of mspace_realloc because realloced chunks from any space are handled by their originating spaces. */ void* mspace_realloc(mspace msp, void* mem, size_t newsize); /* mspace_calloc behaves as calloc, but operates within the given space. */ void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); /* mspace_memalign behaves as memalign, but operates within the given space. */ void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); /* mspace_independent_calloc behaves as independent_calloc, but operates within the given space. */ void** mspace_independent_calloc(mspace msp, size_t n_elements, size_t elem_size, void* chunks[]); /* mspace_independent_comalloc behaves as independent_comalloc, but operates within the given space. */ void** mspace_independent_comalloc(mspace msp, size_t n_elements, size_t sizes[], void* chunks[]); /* mspace_footprint() returns the number of bytes obtained from the system for this space. */ size_t mspace_footprint(mspace msp); /* mspace_max_footprint() returns the peak number of bytes obtained from the system for this space. */ size_t mspace_max_footprint(mspace msp); #if !NO_MALLINFO /* mspace_mallinfo behaves as mallinfo, but reports properties of the given space. */ struct mallinfo mspace_mallinfo(mspace msp); #endif /* NO_MALLINFO */ /* mspace_malloc_stats behaves as malloc_stats, but reports properties of the given space. */ void mspace_malloc_stats(mspace msp); /* mspace_trim behaves as malloc_trim, but operates within the given space. */ int mspace_trim(mspace msp, size_t pad); /* An alias for mallopt. */ int mspace_mallopt(int, int); #endif /* MSPACES */ #ifdef __cplusplus }; /* end of extern "C" */ #endif /* __cplusplus */ /* ======================================================================== To make a fully customizable malloc.h header file, cut everything above this line, put into file malloc.h, edit to suit, and #include it on the next line, as well as in programs that use this malloc. ======================================================================== */ /* #include "malloc.h" */ /*------------------------------ internal #includes ---------------------- */ #ifdef WIN32 #pragma warning( disable : 4146 ) /* no "unsigned" warnings */ #endif /* WIN32 */ #include /* for printing in malloc_stats */ #ifndef LACKS_ERRNO_H #include /* for MALLOC_FAILURE_ACTION */ #endif /* LACKS_ERRNO_H */ #if FOOTERS #include /* for magic initialization */ #endif /* FOOTERS */ #ifndef LACKS_STDLIB_H #include /* for abort() */ #endif /* LACKS_STDLIB_H */ #ifdef DEBUG #if ABORT_ON_ASSERT_FAILURE #define assert(x) if(!(x)) ABORT #else /* ABORT_ON_ASSERT_FAILURE */ #include #endif /* ABORT_ON_ASSERT_FAILURE */ #else /* DEBUG */ #define assert(x) #endif /* DEBUG */ #ifndef LACKS_STRING_H #include /* for memset etc */ #endif /* LACKS_STRING_H */ #if USE_BUILTIN_FFS #ifndef LACKS_STRINGS_H #include /* for ffs */ #endif /* LACKS_STRINGS_H */ #endif /* USE_BUILTIN_FFS */ #if HAVE_MMAP #ifndef LACKS_SYS_MMAN_H #include /* for mmap */ #endif /* LACKS_SYS_MMAN_H */ #ifndef LACKS_FCNTL_H #include #endif /* LACKS_FCNTL_H */ #endif /* HAVE_MMAP */ #if HAVE_MORECORE #ifndef LACKS_UNISTD_H #include /* for sbrk */ #else /* LACKS_UNISTD_H */ #if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) extern void* sbrk(ptrdiff_t); #endif /* FreeBSD etc */ #endif /* LACKS_UNISTD_H */ #endif /* HAVE_MMAP */ #ifndef WIN32 #ifndef malloc_getpagesize # ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ # ifndef _SC_PAGE_SIZE # define _SC_PAGE_SIZE _SC_PAGESIZE # endif # endif # ifdef _SC_PAGE_SIZE # define malloc_getpagesize sysconf(_SC_PAGE_SIZE) # else # if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) extern size_t getpagesize(); # define malloc_getpagesize getpagesize() # else # ifdef WIN32 /* use supplied emulation of getpagesize */ # define malloc_getpagesize getpagesize() # else # ifndef LACKS_SYS_PARAM_H # include # endif # ifdef EXEC_PAGESIZE # define malloc_getpagesize EXEC_PAGESIZE # else # ifdef NBPG # ifndef CLSIZE # define malloc_getpagesize NBPG # else # define malloc_getpagesize (NBPG * CLSIZE) # endif # else # ifdef NBPC # define malloc_getpagesize NBPC # else # ifdef PAGESIZE # define malloc_getpagesize PAGESIZE # else /* just guess */ # define malloc_getpagesize ((size_t)4096U) # endif # endif # endif # endif # endif # endif # endif #endif #endif /* ------------------- size_t and alignment properties -------------------- */ /* The byte and bit size of a size_t */ #define SIZE_T_SIZE (sizeof(size_t)) #define SIZE_T_BITSIZE (sizeof(size_t) << 3) /* Some constants coerced to size_t */ /* Annoying but necessary to avoid errors on some plaftorms */ #define SIZE_T_ZERO ((size_t)0) #define SIZE_T_ONE ((size_t)1) #define SIZE_T_TWO ((size_t)2) #define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) #define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) #define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) #define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) /* The bit mask value corresponding to MALLOC_ALIGNMENT */ #define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) /* True if address a has acceptable alignment */ #define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) /* the number of bytes to offset an address to align it */ #define align_offset(A)\ ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) /* -------------------------- MMAP preliminaries ------------------------- */ /* If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and checks to fail so compiler optimizer can delete code rather than using so many "#if"s. */ /* MORECORE and MMAP must return MFAIL on failure */ #define MFAIL ((void*)(MAX_SIZE_T)) #define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ #if !HAVE_MMAP #define IS_MMAPPED_BIT (SIZE_T_ZERO) #define USE_MMAP_BIT (SIZE_T_ZERO) #define CALL_MMAP(s) MFAIL #define CALL_MUNMAP(a, s) (-1) #define DIRECT_MMAP(s) MFAIL #else /* HAVE_MMAP */ #define IS_MMAPPED_BIT (SIZE_T_ONE) #define USE_MMAP_BIT (SIZE_T_ONE) #ifndef WIN32 #define CALL_MUNMAP(a, s) munmap((a), (s)) #define MMAP_PROT (PROT_READ|PROT_WRITE) #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) #define MAP_ANONYMOUS MAP_ANON #endif /* MAP_ANON */ #ifdef MAP_ANONYMOUS #define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) #define CALL_MMAP(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) #else /* MAP_ANONYMOUS */ /* Nearly all versions of mmap support MAP_ANONYMOUS, so the following is unlikely to be needed, but is supplied just in case. */ #define MMAP_FLAGS (MAP_PRIVATE) static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ #define CALL_MMAP(s) ((dev_zero_fd < 0) ? \ (dev_zero_fd = open("/dev/zero", O_RDWR), \ mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) #endif /* MAP_ANONYMOUS */ #define DIRECT_MMAP(s) CALL_MMAP(s) #else /* WIN32 */ /* Win32 MMAP via VirtualAlloc */ static void* win32mmap(size_t size) { void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); return (ptr != 0)? ptr: MFAIL; } /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ static void* win32direct_mmap(size_t size) { void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, PAGE_READWRITE); return (ptr != 0)? ptr: MFAIL; } /* This function supports releasing coalesed segments */ static int win32munmap(void* ptr, size_t size) { MEMORY_BASIC_INFORMATION minfo; char* cptr = ptr; while (size) { if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) return -1; if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || minfo.State != MEM_COMMIT || minfo.RegionSize > size) return -1; if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) return -1; cptr += minfo.RegionSize; size -= minfo.RegionSize; } return 0; } #define CALL_MMAP(s) win32mmap(s) #define CALL_MUNMAP(a, s) win32munmap((a), (s)) #define DIRECT_MMAP(s) win32direct_mmap(s) #endif /* WIN32 */ #endif /* HAVE_MMAP */ #if HAVE_MMAP && HAVE_MREMAP #define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) #else /* HAVE_MMAP && HAVE_MREMAP */ #define CALL_MREMAP(addr, osz, nsz, mv) MFAIL #endif /* HAVE_MMAP && HAVE_MREMAP */ #if HAVE_MORECORE #define CALL_MORECORE(S) MORECORE(S) #else /* HAVE_MORECORE */ #define CALL_MORECORE(S) MFAIL #endif /* HAVE_MORECORE */ /* mstate bit set if continguous morecore disabled or failed */ #define USE_NONCONTIGUOUS_BIT (4U) /* segment bit set in create_mspace_with_base */ #define EXTERN_BIT (8U) /* --------------------------- Lock preliminaries ------------------------ */ #if USE_LOCKS /* When locks are defined, there are up to two global locks: * If HAVE_MORECORE, morecore_mutex protects sequences of calls to MORECORE. In many cases sys_alloc requires two calls, that should not be interleaved with calls by other threads. This does not protect against direct calls to MORECORE by other threads not using this lock, so there is still code to cope the best we can on interference. * magic_init_mutex ensures that mparams.magic and other unique mparams values are initialized only once. */ #ifndef WIN32 /* By default use posix locks */ #include #define MLOCK_T pthread_mutex_t #define INITIAL_LOCK(l) pthread_mutex_init(l, NULL) #define ACQUIRE_LOCK(l) pthread_mutex_lock(l) #define RELEASE_LOCK(l) pthread_mutex_unlock(l) #if HAVE_MORECORE static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER; #endif /* HAVE_MORECORE */ static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER; #else /* WIN32 */ /* Because lock-protected regions have bounded times, and there are no recursive lock calls, we can use simple spinlocks. */ #define MLOCK_T long static int win32_acquire_lock (MLOCK_T *sl) { for (;;) { #ifdef InterlockedCompareExchangePointer if (!InterlockedCompareExchange(sl, 1, 0)) return 0; #else /* Use older void* version */ if (!InterlockedCompareExchange((void**)sl, (void*)1, (void*)0)) return 0; #endif /* InterlockedCompareExchangePointer */ Sleep (0); } } static void win32_release_lock (MLOCK_T *sl) { InterlockedExchange (sl, 0); } #define INITIAL_LOCK(l) *(l)=0 #define ACQUIRE_LOCK(l) win32_acquire_lock(l) #define RELEASE_LOCK(l) win32_release_lock(l) #if HAVE_MORECORE static MLOCK_T morecore_mutex; #endif /* HAVE_MORECORE */ static MLOCK_T magic_init_mutex; #endif /* WIN32 */ #define USE_LOCK_BIT (2U) #else /* USE_LOCKS */ #define USE_LOCK_BIT (0U) #define INITIAL_LOCK(l) #endif /* USE_LOCKS */ #if USE_LOCKS && HAVE_MORECORE #define ACQUIRE_MORECORE_LOCK() ACQUIRE_LOCK(&morecore_mutex); #define RELEASE_MORECORE_LOCK() RELEASE_LOCK(&morecore_mutex); #else /* USE_LOCKS && HAVE_MORECORE */ #define ACQUIRE_MORECORE_LOCK() #define RELEASE_MORECORE_LOCK() #endif /* USE_LOCKS && HAVE_MORECORE */ #if USE_LOCKS #define ACQUIRE_MAGIC_INIT_LOCK() ACQUIRE_LOCK(&magic_init_mutex); #define RELEASE_MAGIC_INIT_LOCK() RELEASE_LOCK(&magic_init_mutex); #else /* USE_LOCKS */ #define ACQUIRE_MAGIC_INIT_LOCK() #define RELEASE_MAGIC_INIT_LOCK() #endif /* USE_LOCKS */ /* ----------------------- Chunk representations ------------------------ */ /* (The following includes lightly edited explanations by Colin Plumb.) The malloc_chunk declaration below is misleading (but accurate and necessary). It declares a "view" into memory allowing access to necessary fields at known offsets from a given base. Chunks of memory are maintained using a `boundary tag' method as originally described by Knuth. (See the paper by Paul Wilson ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such techniques.) Sizes of free chunks are stored both in the front of each chunk and at the end. This makes consolidating fragmented chunks into bigger chunks fast. The head fields also hold bits representing whether chunks are free or in use. Here are some pictures to make it clearer. They are "exploded" to show that the state of a chunk can be thought of as extending from the high 31 bits of the head field of its header through the prev_foot and PINUSE_BIT bit of the following chunk header. A chunk that's in use looks like: chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of previous chunk (if P = 1) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| | Size of this chunk 1| +-+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | +- -+ | | +- -+ | : +- size - sizeof(size_t) available payload bytes -+ : | chunk-> +- -+ | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| | Size of next chunk (may or may not be in use) | +-+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ And if it's free, it looks like this: chunk-> +- -+ | User payload (must be in use, or we would have merged!) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| | Size of this chunk 0| +-+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Next pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Prev pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | : +- size - sizeof(struct chunk) unused bytes -+ : | chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of this chunk | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| | Size of next chunk (must be in use, or we would have merged)| +-+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | : +- User payload -+ : | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| +-+ Note that since we always merge adjacent free chunks, the chunks adjacent to a free chunk must be in use. Given a pointer to a chunk (which can be derived trivially from the payload pointer) we can, in O(1) time, find out whether the adjacent chunks are free, and if so, unlink them from the lists that they are on and merge them with the current chunk. Chunks always begin on even word boundaries, so the mem portion (which is returned to the user) is also on an even word boundary, and thus at least double-word aligned. The P (PINUSE_BIT) bit, stored in the unused low-order bit of the chunk size (which is always a multiple of two words), is an in-use bit for the *previous* chunk. If that bit is *clear*, then the word before the current chunk size contains the previous chunk size, and can be used to find the front of the previous chunk. The very first chunk allocated always has this bit set, preventing access to non-existent (or non-owned) memory. If pinuse is set for any given chunk, then you CANNOT determine the size of the previous chunk, and might even get a memory addressing fault when trying to do so. The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of the chunk size redundantly records whether the current chunk is inuse. This redundancy enables usage checks within free and realloc, and reduces indirection when freeing and consolidating chunks. Each freshly allocated chunk must have both cinuse and pinuse set. That is, each allocated chunk borders either a previously allocated and still in-use chunk, or the base of its memory arena. This is ensured by making all allocations from the the `lowest' part of any found chunk. Further, no free chunk physically borders another one, so each free chunk is known to be preceded and followed by either inuse chunks or the ends of memory. Note that the `foot' of the current chunk is actually represented as the prev_foot of the NEXT chunk. This makes it easier to deal with alignments etc but can be very confusing when trying to extend or adapt this code. The exceptions to all this are 1. The special chunk `top' is the top-most available chunk (i.e., the one bordering the end of available memory). It is treated specially. Top is never included in any bin, is used only if no other chunk is available, and is released back to the system if it is very large (see M_TRIM_THRESHOLD). In effect, the top chunk is treated as larger (and thus less well fitting) than any other available chunk. The top chunk doesn't update its trailing size field since there is no next contiguous chunk that would have to index off it. However, space is still allocated for it (TOP_FOOT_SIZE) to enable separation or merging when space is extended. 3. Chunks allocated via mmap, which have the lowest-order bit (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set PINUSE_BIT in their head fields. Because they are allocated one-by-one, each must carry its own prev_foot field, which is also used to hold the offset this chunk has within its mmapped region, which is needed to preserve alignment. Each mmapped chunk is trailed by the first two fields of a fake next-chunk for sake of usage checks. */ struct malloc_chunk { size_t prev_foot; /* Size of previous chunk (if free). */ size_t head; /* Size and inuse bits. */ struct malloc_chunk* fd; /* double links -- used only if free. */ struct malloc_chunk* bk; }; typedef struct malloc_chunk mchunk; typedef struct malloc_chunk* mchunkptr; typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ typedef unsigned int bindex_t; /* Described below */ typedef unsigned int binmap_t; /* Described below */ typedef unsigned int flag_t; /* The type of various bit flag sets */ /* ------------------- Chunks sizes and alignments ----------------------- */ #define MCHUNK_SIZE (sizeof(mchunk)) #if FOOTERS #define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) #else /* FOOTERS */ #define CHUNK_OVERHEAD (SIZE_T_SIZE) #endif /* FOOTERS */ /* MMapped chunks need a second word of overhead ... */ #define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) /* ... and additional padding for fake next-chunk at foot */ #define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) /* The smallest size we can malloc is an aligned minimal chunk */ #define MIN_CHUNK_SIZE\ ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) /* conversion from malloc headers to user pointers, and back */ #define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) #define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) /* chunk associated with aligned address A */ #define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) /* Bounds on request (not chunk) sizes. */ #define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) #define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) /* pad request bytes into a usable size */ #define pad_request(req) \ (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) /* pad request, checking for minimum (but not maximum) */ #define request2size(req) \ (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) /* ------------------ Operations on head and foot fields ----------------- */ /* The head field of a chunk is or'ed with PINUSE_BIT when previous adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in use. If the chunk was obtained with mmap, the prev_foot field has IS_MMAPPED_BIT set, otherwise holding the offset of the base of the mmapped region to the base of the chunk. */ #define PINUSE_BIT (SIZE_T_ONE) #define CINUSE_BIT (SIZE_T_TWO) #define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) /* Head value for fenceposts */ #define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) /* extraction of fields from head words */ #define cinuse(p) ((p)->head & CINUSE_BIT) #define pinuse(p) ((p)->head & PINUSE_BIT) #define chunksize(p) ((p)->head & ~(INUSE_BITS)) #define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) #define clear_cinuse(p) ((p)->head &= ~CINUSE_BIT) /* Treat space at ptr +/- offset as a chunk */ #define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) #define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) /* Ptr to next or previous physical malloc_chunk. */ #define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS))) #define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) /* extract next chunk's pinuse bit */ #define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) /* Get/set size at footer */ #define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) #define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) /* Set size, pinuse bit, and foot */ #define set_size_and_pinuse_of_free_chunk(p, s)\ ((p)->head = (s|PINUSE_BIT), set_foot(p, s)) /* Set size, pinuse bit, foot, and clear next pinuse */ #define set_free_with_pinuse(p, s, n)\ (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) #define is_mmapped(p)\ (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT)) /* Get the internal overhead associated with chunk p */ #define overhead_for(p)\ (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) /* Return true if malloced space is not necessarily cleared */ #if MMAP_CLEARS #define calloc_must_clear(p) (!is_mmapped(p)) #else /* MMAP_CLEARS */ #define calloc_must_clear(p) (1) #endif /* MMAP_CLEARS */ /* ---------------------- Overlaid data structures ----------------------- */ /* When chunks are not in use, they are treated as nodes of either lists or trees. "Small" chunks are stored in circular doubly-linked lists, and look like this: chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of previous chunk | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ `head:' | Size of chunk, in bytes |P| mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Forward pointer to next chunk in list | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Back pointer to previous chunk in list | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Unused space (may be 0 bytes long) . . . . | nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ `foot:' | Size of chunk, in bytes | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Larger chunks are kept in a form of bitwise digital trees (aka tries) keyed on chunksizes. Because malloc_tree_chunks are only for free chunks greater than 256 bytes, their size doesn't impose any constraints on user chunk sizes. Each node looks like: chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of previous chunk | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ `head:' | Size of chunk, in bytes |P| mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Forward pointer to next chunk of same size | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Back pointer to previous chunk of same size | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Pointer to left child (child[0]) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Pointer to right child (child[1]) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Pointer to parent | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | bin index of this chunk | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Unused space . . | nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ `foot:' | Size of chunk, in bytes | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Each tree holding treenodes is a tree of unique chunk sizes. Chunks of the same size are arranged in a circularly-linked list, with only the oldest chunk (the next to be used, in our FIFO ordering) actually in the tree. (Tree members are distinguished by a non-null parent pointer.) If a chunk with the same size an an existing node is inserted, it is linked off the existing node using pointers that work in the same way as fd/bk pointers of small chunks. Each tree contains a power of 2 sized range of chunk sizes (the smallest is 0x100 <= x < 0x180), which is is divided in half at each tree level, with the chunks in the smaller half of the range (0x100 <= x < 0x140 for the top nose) in the left subtree and the larger half (0x140 <= x < 0x180) in the right subtree. This is, of course, done by inspecting individual bits. Using these rules, each node's left subtree contains all smaller sizes than its right subtree. However, the node at the root of each subtree has no particular ordering relationship to either. (The dividing line between the subtree sizes is based on trie relation.) If we remove the last chunk of a given size from the interior of the tree, we need to replace it with a leaf node. The tree ordering rules permit a node to be replaced by any leaf below it. The smallest chunk in a tree (a common operation in a best-fit allocator) can be found by walking a path to the leftmost leaf in the tree. Unlike a usual binary tree, where we follow left child pointers until we reach a null, here we follow the right child pointer any time the left one is null, until we reach a leaf with both child pointers null. The smallest chunk in the tree will be somewhere along that path. The worst case number of steps to add, find, or remove a node is bounded by the number of bits differentiating chunks within bins. Under current bin calculations, this ranges from 6 up to 21 (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case is of course much better. */ struct malloc_tree_chunk { /* The first four fields must be compatible with malloc_chunk */ size_t prev_foot; size_t head; struct malloc_tree_chunk* fd; struct malloc_tree_chunk* bk; struct malloc_tree_chunk* child[2]; struct malloc_tree_chunk* parent; bindex_t index; }; typedef struct malloc_tree_chunk tchunk; typedef struct malloc_tree_chunk* tchunkptr; typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ /* A little helper macro for trees */ #define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) /* ----------------------------- Segments -------------------------------- */ /* Each malloc space may include non-contiguous segments, held in a list headed by an embedded malloc_segment record representing the top-most space. Segments also include flags holding properties of the space. Large chunks that are directly allocated by mmap are not included in this list. They are instead independently created and destroyed without otherwise keeping track of them. Segment management mainly comes into play for spaces allocated by MMAP. Any call to MMAP might or might not return memory that is adjacent to an existing segment. MORECORE normally contiguously extends the current space, so this space is almost always adjacent, which is simpler and faster to deal with. (This is why MORECORE is used preferentially to MMAP when both are available -- see sys_alloc.) When allocating using MMAP, we don't use any of the hinting mechanisms (inconsistently) supported in various implementations of unix mmap, or distinguish reserving from committing memory. Instead, we just ask for space, and exploit contiguity when we get it. It is probably possible to do better than this on some systems, but no general scheme seems to be significantly better. Management entails a simpler variant of the consolidation scheme used for chunks to reduce fragmentation -- new adjacent memory is normally prepended or appended to an existing segment. However, there are limitations compared to chunk consolidation that mostly reflect the fact that segment processing is relatively infrequent (occurring only when getting memory from system) and that we don't expect to have huge numbers of segments: * Segments are not indexed, so traversal requires linear scans. (It would be possible to index these, but is not worth the extra overhead and complexity for most programs on most platforms.) * New segments are only appended to old ones when holding top-most memory; if they cannot be prepended to others, they are held in different segments. Except for the top-most segment of an mstate, each segment record is kept at the tail of its segment. Segments are added by pushing segment records onto the list headed by &mstate.seg for the containing mstate. Segment flags control allocation/merge/deallocation policies: * If EXTERN_BIT set, then we did not allocate this segment, and so should not try to deallocate or merge with others. (This currently holds only for the initial segment passed into create_mspace_with_base.) * If IS_MMAPPED_BIT set, the segment may be merged with other surrounding mmapped segments and trimmed/de-allocated using munmap. * If neither bit is set, then the segment was obtained using MORECORE so can be merged with surrounding MORECORE'd segments and deallocated/trimmed using MORECORE with negative arguments. */ struct malloc_segment { char* base; /* base address */ size_t size; /* allocated size */ struct malloc_segment* next; /* ptr to next segment */ flag_t sflags; /* mmap and extern flag */ }; #define is_mmapped_segment(S) ((S)->sflags & IS_MMAPPED_BIT) #define is_extern_segment(S) ((S)->sflags & EXTERN_BIT) typedef struct malloc_segment msegment; typedef struct malloc_segment* msegmentptr; /* ---------------------------- malloc_state ----------------------------- */ /* A malloc_state holds all of the bookkeeping for a space. The main fields are: Top The topmost chunk of the currently active segment. Its size is cached in topsize. The actual size of topmost space is topsize+TOP_FOOT_SIZE, which includes space reserved for adding fenceposts and segment records if necessary when getting more space from the system. The size at which to autotrim top is cached from mparams in trim_check, except that it is disabled if an autotrim fails. Designated victim (dv) This is the preferred chunk for servicing small requests that don't have exact fits. It is normally the chunk split off most recently to service another small request. Its size is cached in dvsize. The link fields of this chunk are not maintained since it is not kept in a bin. SmallBins An array of bin headers for free chunks. These bins hold chunks with sizes less than MIN_LARGE_SIZE bytes. Each bin contains chunks of all the same size, spaced 8 bytes apart. To simplify use in double-linked lists, each bin header acts as a malloc_chunk pointing to the real first node, if it exists (else pointing to itself). This avoids special-casing for headers. But to avoid waste, we allocate only the fd/bk pointers of bins, and then use repositioning tricks to treat these as the fields of a chunk. TreeBins Treebins are pointers to the roots of trees holding a range of sizes. There are 2 equally spaced treebins for each power of two from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything larger. Bin maps There is one bit map for small bins ("smallmap") and one for treebins ("treemap). Each bin sets its bit when non-empty, and clears the bit when empty. Bit operations are then used to avoid bin-by-bin searching -- nearly all "search" is done without ever looking at bins that won't be selected. The bit maps conservatively use 32 bits per map word, even if on 64bit system. For a good description of some of the bit-based techniques used here, see Henry S. Warren Jr's book "Hacker's Delight" (and supplement at http://hackersdelight.org/). Many of these are intended to reduce the branchiness of paths through malloc etc, as well as to reduce the number of memory locations read or written. Segments A list of segments headed by an embedded malloc_segment record representing the initial space. Address check support The least_addr field is the least address ever obtained from MORECORE or MMAP. Attempted frees and reallocs of any address less than this are trapped (unless INSECURE is defined). Magic tag A cross-check field that should always hold same value as mparams.magic. Flags Bits recording whether to use MMAP, locks, or contiguous MORECORE Statistics Each space keeps track of current and maximum system memory obtained via MORECORE or MMAP. Locking If USE_LOCKS is defined, the "mutex" lock is acquired and released around every public call using this mspace. */ /* Bin types, widths and sizes */ #define NSMALLBINS (32U) #define NTREEBINS (32U) #define SMALLBIN_SHIFT (3U) #define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) #define TREEBIN_SHIFT (8U) #define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) #define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) #define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) struct malloc_state { binmap_t smallmap; binmap_t treemap; size_t dvsize; size_t topsize; char* least_addr; mchunkptr dv; mchunkptr top; size_t trim_check; size_t magic; mchunkptr smallbins[(NSMALLBINS+1)*2]; tbinptr treebins[NTREEBINS]; size_t footprint; size_t max_footprint; flag_t mflags; #if USE_LOCKS MLOCK_T mutex; /* locate lock among fields that rarely change */ #endif /* USE_LOCKS */ msegment seg; }; typedef struct malloc_state* mstate; /* ------------- Global malloc_state and malloc_params ------------------- */ /* malloc_params holds global properties, including those that can be dynamically set using mallopt. There is a single instance, mparams, initialized in init_mparams. */ struct malloc_params { size_t magic; size_t page_size; size_t granularity; size_t mmap_threshold; size_t trim_threshold; flag_t default_mflags; }; static struct malloc_params mparams; /* The global malloc_state used for all non-"mspace" calls */ static struct malloc_state _gm_; #define gm (&_gm_) #define is_global(M) ((M) == &_gm_) #define is_initialized(M) ((M)->top != 0) /* -------------------------- system alloc setup ------------------------- */ /* Operations on mflags */ #define use_lock(M) ((M)->mflags & USE_LOCK_BIT) #define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) #define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) #define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) #define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) #define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) #define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) #define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) #define set_lock(M,L)\ ((M)->mflags = (L)?\ ((M)->mflags | USE_LOCK_BIT) :\ ((M)->mflags & ~USE_LOCK_BIT)) /* page-align a size */ #define page_align(S)\ (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE)) /* granularity-align a size */ #define granularity_align(S)\ (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE)) #define is_page_aligned(S)\ (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) #define is_granularity_aligned(S)\ (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) /* True if segment S holds address A */ #define segment_holds(S, A)\ ((char*)(A) >= S->base && (char*)(A) < S->base + S->size) /* Return segment holding given address */ static msegmentptr segment_holding(mstate m, char* addr) { msegmentptr sp = &m->seg; for (;;) { if (addr >= sp->base && addr < sp->base + sp->size) return sp; if ((sp = sp->next) == 0) return 0; } } /* Return true if segment contains a segment link */ static int has_segment_link(mstate m, msegmentptr ss) { msegmentptr sp = &m->seg; for (;;) { if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) return 1; if ((sp = sp->next) == 0) return 0; } } #ifndef MORECORE_CANNOT_TRIM #define should_trim(M,s) ((s) > (M)->trim_check) #else /* MORECORE_CANNOT_TRIM */ #define should_trim(M,s) (0) #endif /* MORECORE_CANNOT_TRIM */ /* TOP_FOOT_SIZE is padding at the end of a segment, including space that may be needed to place segment records and fenceposts when new noncontiguous segments are added. */ #define TOP_FOOT_SIZE\ (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) /* ------------------------------- Hooks -------------------------------- */ /* PREACTION should be defined to return 0 on success, and nonzero on failure. If you are not using locking, you can redefine these to do anything you like. */ #if USE_LOCKS /* Ensure locks are initialized */ #define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams()) #define PREACTION(M) ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) #define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } #else /* USE_LOCKS */ #ifndef PREACTION #define PREACTION(M) (0) #endif /* PREACTION */ #ifndef POSTACTION #define POSTACTION(M) #endif /* POSTACTION */ #endif /* USE_LOCKS */ /* CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. USAGE_ERROR_ACTION is triggered on detected bad frees and reallocs. The argument p is an address that might have triggered the fault. It is ignored by the two predefined actions, but might be useful in custom actions that try to help diagnose errors. */ #if PROCEED_ON_ERROR /* A count of the number of corruption errors causing resets */ int malloc_corruption_error_count; /* default corruption action */ static void reset_on_error(mstate m); #define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) #define USAGE_ERROR_ACTION(m, p) #else /* PROCEED_ON_ERROR */ #ifndef CORRUPTION_ERROR_ACTION #define CORRUPTION_ERROR_ACTION(m) ABORT #endif /* CORRUPTION_ERROR_ACTION */ #ifndef USAGE_ERROR_ACTION #define USAGE_ERROR_ACTION(m,p) ABORT #endif /* USAGE_ERROR_ACTION */ #endif /* PROCEED_ON_ERROR */ /* -------------------------- Debugging setup ---------------------------- */ #if ! DEBUG #define check_free_chunk(M,P) #define check_inuse_chunk(M,P) #define check_malloced_chunk(M,P,N) #define check_mmapped_chunk(M,P) #define check_malloc_state(M) #define check_top_chunk(M,P) #else /* DEBUG */ #define check_free_chunk(M,P) do_check_free_chunk(M,P) #define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) #define check_top_chunk(M,P) do_check_top_chunk(M,P) #define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) #define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) #define check_malloc_state(M) do_check_malloc_state(M) static void do_check_any_chunk(mstate m, mchunkptr p); static void do_check_top_chunk(mstate m, mchunkptr p); static void do_check_mmapped_chunk(mstate m, mchunkptr p); static void do_check_inuse_chunk(mstate m, mchunkptr p); static void do_check_free_chunk(mstate m, mchunkptr p); static void do_check_malloced_chunk(mstate m, void* mem, size_t s); static void do_check_tree(mstate m, tchunkptr t); static void do_check_treebin(mstate m, bindex_t i); static void do_check_smallbin(mstate m, bindex_t i); static void do_check_malloc_state(mstate m); static int bin_find(mstate m, mchunkptr x); static size_t traverse_and_check(mstate m); #endif /* DEBUG */ /* ---------------------------- Indexing Bins ---------------------------- */ #define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) #define small_index(s) ((s) >> SMALLBIN_SHIFT) #define small_index2size(i) ((i) << SMALLBIN_SHIFT) #define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) /* addressing by index. See above about smallbin repositioning */ #define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) #define treebin_at(M,i) (&((M)->treebins[i])) /* assign tree index for size S to variable I */ #if defined(__GNUC__) && defined(i386) #define compute_tree_index(S, I)\ {\ size_t X = S >> TREEBIN_SHIFT;\ if (X == 0)\ I = 0;\ else if (X > 0xFFFF)\ I = NTREEBINS-1;\ else {\ unsigned int K;\ __asm__("bsrl %1,%0\n\t" : "=r" (K) : "rm" (X));\ I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ }\ } #else /* GNUC */ #define compute_tree_index(S, I)\ {\ size_t X = S >> TREEBIN_SHIFT;\ if (X == 0)\ I = 0;\ else if (X > 0xFFFF)\ I = NTREEBINS-1;\ else {\ unsigned int Y = (unsigned int)X;\ unsigned int N = ((Y - 0x100) >> 16) & 8;\ unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ N += K;\ N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ K = 14 - N + ((Y <<= K) >> 15);\ I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ }\ } #endif /* GNUC */ /* Bit representing maximum resolved size in a treebin at i */ #define bit_for_tree_index(i) \ (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) /* Shift placing maximum resolved bit in a treebin at i as sign bit */ #define leftshift_for_tree_index(i) \ ((i == NTREEBINS-1)? 0 : \ ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) /* The size of the smallest chunk held in bin with index i */ #define minsize_for_tree_index(i) \ ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) /* ------------------------ Operations on bin maps ----------------------- */ /* bit corresponding to given index */ #define idx2bit(i) ((binmap_t)(1) << (i)) /* Mark/Clear bits with given index */ #define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) #define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) #define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) #define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) #define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) #define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) /* index corresponding to given bit */ #if defined(__GNUC__) && defined(i386) #define compute_bit2idx(X, I)\ {\ unsigned int J;\ __asm__("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\ I = (bindex_t)J;\ } #else /* GNUC */ #if USE_BUILTIN_FFS #define compute_bit2idx(X, I) I = ffs(X)-1 #else /* USE_BUILTIN_FFS */ #define compute_bit2idx(X, I)\ {\ unsigned int Y = X - 1;\ unsigned int K = Y >> (16-4) & 16;\ unsigned int N = K; Y >>= K;\ N += K = Y >> (8-3) & 8; Y >>= K;\ N += K = Y >> (4-2) & 4; Y >>= K;\ N += K = Y >> (2-1) & 2; Y >>= K;\ N += K = Y >> (1-0) & 1; Y >>= K;\ I = (bindex_t)(N + Y);\ } #endif /* USE_BUILTIN_FFS */ #endif /* GNUC */ /* isolate the least set bit of a bitmap */ #define least_bit(x) ((x) & -(x)) /* mask with all bits to left of least bit of x on */ #define left_bits(x) ((x<<1) | -(x<<1)) /* mask with all bits to left of or equal to least bit of x on */ #define same_or_left_bits(x) ((x) | -(x)) /* ----------------------- Runtime Check Support ------------------------- */ /* For security, the main invariant is that malloc/free/etc never writes to a static address other than malloc_state, unless static malloc_state itself has been corrupted, which cannot occur via malloc (because of these checks). In essence this means that we believe all pointers, sizes, maps etc held in malloc_state, but check all of those linked or offsetted from other embedded data structures. These checks are interspersed with main code in a way that tends to minimize their run-time cost. When FOOTERS is defined, in addition to range checking, we also verify footer fields of inuse chunks, which can be used guarantee that the mstate controlling malloc/free is intact. This is a streamlined version of the approach described by William Robertson et al in "Run-time Detection of Heap-based Overflows" LISA'03 http://www.usenix.org/events/lisa03/tech/robertson.html The footer of an inuse chunk holds the xor of its mstate and a random seed, that is checked upon calls to free() and realloc(). This is (probablistically) unguessable from outside the program, but can be computed by any code successfully malloc'ing any chunk, so does not itself provide protection against code that has already broken security through some other means. Unlike Robertson et al, we always dynamically check addresses of all offset chunks (previous, next, etc). This turns out to be cheaper than relying on hashes. */ #if !INSECURE /* Check if address a is at least as high as any from MORECORE or MMAP */ #define ok_address(M, a) ((char*)(a) >= (M)->least_addr) /* Check if address of next chunk n is higher than base chunk p */ #define ok_next(p, n) ((char*)(p) < (char*)(n)) /* Check if p has its cinuse bit on */ #define ok_cinuse(p) cinuse(p) /* Check if p has its pinuse bit on */ #define ok_pinuse(p) pinuse(p) #else /* !INSECURE */ #define ok_address(M, a) (1) #define ok_next(b, n) (1) #define ok_cinuse(p) (1) #define ok_pinuse(p) (1) #endif /* !INSECURE */ #if (FOOTERS && !INSECURE) /* Check if (alleged) mstate m has expected magic field */ #define ok_magic(M) ((M)->magic == mparams.magic) #else /* (FOOTERS && !INSECURE) */ #define ok_magic(M) (1) #endif /* (FOOTERS && !INSECURE) */ /* In gcc, use __builtin_expect to minimize impact of checks */ #if !INSECURE #if defined(__GNUC__) && __GNUC__ >= 3 #define RTCHECK(e) __builtin_expect(e, 1) #else /* GNUC */ #define RTCHECK(e) (e) #endif /* GNUC */ #else /* !INSECURE */ #define RTCHECK(e) (1) #endif /* !INSECURE */ /* macros to set up inuse chunks with or without footers */ #if !FOOTERS #define mark_inuse_foot(M,p,s) /* Set cinuse bit and pinuse bit of next chunk */ #define set_inuse(M,p,s)\ ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) /* Set cinuse and pinuse of this chunk and pinuse of next chunk */ #define set_inuse_and_pinuse(M,p,s)\ ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) /* Set size, cinuse and pinuse bit of this chunk */ #define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ ((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) #else /* FOOTERS */ /* Set foot of inuse chunk to be xor of mstate and seed */ #define mark_inuse_foot(M,p,s)\ (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) #define get_mstate_for(p)\ ((mstate)(((mchunkptr)((char*)(p) +\ (chunksize(p))))->prev_foot ^ mparams.magic)) #define set_inuse(M,p,s)\ ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ mark_inuse_foot(M,p,s)) #define set_inuse_and_pinuse(M,p,s)\ ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ mark_inuse_foot(M,p,s)) #define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ mark_inuse_foot(M, p, s)) #endif /* !FOOTERS */ /* ---------------------------- setting mparams -------------------------- */ /* Initialize mparams */ static int init_mparams(void) { if (mparams.page_size == 0) { size_t s; mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; #if MORECORE_CONTIGUOUS mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; #else /* MORECORE_CONTIGUOUS */ mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; #endif /* MORECORE_CONTIGUOUS */ #if (FOOTERS && !INSECURE) { #if USE_DEV_RANDOM int fd; unsigned char buf[sizeof(size_t)]; /* Try to use /dev/urandom, else fall back on using time */ if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && read(fd, buf, sizeof(buf)) == sizeof(buf)) { s = *((size_t *) buf); close(fd); } else #endif /* USE_DEV_RANDOM */ s = (size_t)(time(0) ^ (size_t)0x55555555U); s |= (size_t)8U; /* ensure nonzero */ s &= ~(size_t)7U; /* improve chances of fault for bad values */ } #else /* (FOOTERS && !INSECURE) */ s = (size_t)0x58585858U; #endif /* (FOOTERS && !INSECURE) */ ACQUIRE_MAGIC_INIT_LOCK(); if (mparams.magic == 0) { mparams.magic = s; /* Set up lock for main malloc area */ INITIAL_LOCK(&gm->mutex); gm->mflags = mparams.default_mflags; } RELEASE_MAGIC_INIT_LOCK(); #ifndef WIN32 mparams.page_size = malloc_getpagesize; mparams.granularity = ((DEFAULT_GRANULARITY != 0)? DEFAULT_GRANULARITY : mparams.page_size); #else /* WIN32 */ { SYSTEM_INFO system_info; GetSystemInfo(&system_info); mparams.page_size = system_info.dwPageSize; mparams.granularity = system_info.dwAllocationGranularity; } #endif /* WIN32 */ /* Sanity-check configuration: size_t must be unsigned and as wide as pointer type. ints must be at least 4 bytes. alignment must be at least 8. Alignment, min chunk size, and page size must all be powers of 2. */ if ((sizeof(size_t) != sizeof(char*)) || (MAX_SIZE_T < MIN_CHUNK_SIZE) || (sizeof(int) < 4) || (MALLOC_ALIGNMENT < (size_t)8U) || ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || ((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) || ((mparams.page_size & (mparams.page_size-SIZE_T_ONE)) != 0)) ABORT; } return 0; } /* support for mallopt */ static int change_mparam(int param_number, int value) { size_t val = (size_t)value; init_mparams(); switch(param_number) { case M_TRIM_THRESHOLD: mparams.trim_threshold = val; return 1; case M_GRANULARITY: if (val >= mparams.page_size && ((val & (val-1)) == 0)) { mparams.granularity = val; return 1; } else return 0; case M_MMAP_THRESHOLD: mparams.mmap_threshold = val; return 1; default: return 0; } } #if DEBUG /* ------------------------- Debugging Support --------------------------- */ /* Check properties of any chunk, whether free, inuse, mmapped etc */ static void do_check_any_chunk(mstate m, mchunkptr p) { assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); assert(ok_address(m, p)); } /* Check properties of top chunk */ static void do_check_top_chunk(mstate m, mchunkptr p) { msegmentptr sp = segment_holding(m, (char*)p); size_t sz = chunksize(p); assert(sp != 0); assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); assert(ok_address(m, p)); assert(sz == m->topsize); assert(sz > 0); assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); assert(pinuse(p)); assert(!next_pinuse(p)); } /* Check properties of (inuse) mmapped chunks */ static void do_check_mmapped_chunk(mstate m, mchunkptr p) { size_t sz = chunksize(p); size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD); assert(is_mmapped(p)); assert(use_mmap(m)); assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); assert(ok_address(m, p)); assert(!is_small(sz)); assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); } /* Check properties of inuse chunks */ static void do_check_inuse_chunk(mstate m, mchunkptr p) { do_check_any_chunk(m, p); assert(cinuse(p)); assert(next_pinuse(p)); /* If not pinuse and not mmapped, previous chunk has OK offset */ assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); if (is_mmapped(p)) do_check_mmapped_chunk(m, p); } /* Check properties of free chunks */ static void do_check_free_chunk(mstate m, mchunkptr p) { size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); mchunkptr next = chunk_plus_offset(p, sz); do_check_any_chunk(m, p); assert(!cinuse(p)); assert(!next_pinuse(p)); assert (!is_mmapped(p)); if (p != m->dv && p != m->top) { if (sz >= MIN_CHUNK_SIZE) { assert((sz & CHUNK_ALIGN_MASK) == 0); assert(is_aligned(chunk2mem(p))); assert(next->prev_foot == sz); assert(pinuse(p)); assert (next == m->top || cinuse(next)); assert(p->fd->bk == p); assert(p->bk->fd == p); } else /* markers are always of size SIZE_T_SIZE */ assert(sz == SIZE_T_SIZE); } } /* Check properties of malloced chunks at the point they are malloced */ static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { if (mem != 0) { mchunkptr p = mem2chunk(mem); size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); do_check_inuse_chunk(m, p); assert((sz & CHUNK_ALIGN_MASK) == 0); assert(sz >= MIN_CHUNK_SIZE); assert(sz >= s); /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); } } /* Check a tree and its subtrees. */ static void do_check_tree(mstate m, tchunkptr t) { tchunkptr head = 0; tchunkptr u = t; bindex_t tindex = t->index; size_t tsize = chunksize(t); bindex_t idx; compute_tree_index(tsize, idx); assert(tindex == idx); assert(tsize >= MIN_LARGE_SIZE); assert(tsize >= minsize_for_tree_index(idx)); assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); do { /* traverse through chain of same-sized nodes */ do_check_any_chunk(m, ((mchunkptr)u)); assert(u->index == tindex); assert(chunksize(u) == tsize); assert(!cinuse(u)); assert(!next_pinuse(u)); assert(u->fd->bk == u); assert(u->bk->fd == u); if (u->parent == 0) { assert(u->child[0] == 0); assert(u->child[1] == 0); } else { assert(head == 0); /* only one node on chain has parent */ head = u; assert(u->parent != u); assert (u->parent->child[0] == u || u->parent->child[1] == u || *((tbinptr*)(u->parent)) == u); if (u->child[0] != 0) { assert(u->child[0]->parent == u); assert(u->child[0] != u); do_check_tree(m, u->child[0]); } if (u->child[1] != 0) { assert(u->child[1]->parent == u); assert(u->child[1] != u); do_check_tree(m, u->child[1]); } if (u->child[0] != 0 && u->child[1] != 0) { assert(chunksize(u->child[0]) < chunksize(u->child[1])); } } u = u->fd; } while (u != t); assert(head != 0); } /* Check all the chunks in a treebin. */ static void do_check_treebin(mstate m, bindex_t i) { tbinptr* tb = treebin_at(m, i); tchunkptr t = *tb; int empty = (m->treemap & (1U << i)) == 0; if (t == 0) assert(empty); if (!empty) do_check_tree(m, t); } /* Check all the chunks in a smallbin. */ static void do_check_smallbin(mstate m, bindex_t i) { sbinptr b = smallbin_at(m, i); mchunkptr p = b->bk; unsigned int empty = (m->smallmap & (1U << i)) == 0; if (p == b) assert(empty); if (!empty) { for (; p != b; p = p->bk) { size_t size = chunksize(p); mchunkptr q; /* each chunk claims to be free */ do_check_free_chunk(m, p); /* chunk belongs in bin */ assert(small_index(size) == i); assert(p->bk == b || chunksize(p->bk) == chunksize(p)); /* chunk is followed by an inuse chunk */ q = next_chunk(p); if (q->head != FENCEPOST_HEAD) do_check_inuse_chunk(m, q); } } } /* Find x in a bin. Used in other check functions. */ static int bin_find(mstate m, mchunkptr x) { size_t size = chunksize(x); if (is_small(size)) { bindex_t sidx = small_index(size); sbinptr b = smallbin_at(m, sidx); if (smallmap_is_marked(m, sidx)) { mchunkptr p = b; do { if (p == x) return 1; } while ((p = p->fd) != b); } } else { bindex_t tidx; compute_tree_index(size, tidx); if (treemap_is_marked(m, tidx)) { tchunkptr t = *treebin_at(m, tidx); size_t sizebits = size << leftshift_for_tree_index(tidx); while (t != 0 && chunksize(t) != size) { t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; sizebits <<= 1; } if (t != 0) { tchunkptr u = t; do { if (u == (tchunkptr)x) return 1; } while ((u = u->fd) != t); } } } return 0; } /* Traverse each chunk and check it; return total */ static size_t traverse_and_check(mstate m) { size_t sum = 0; if (is_initialized(m)) { msegmentptr s = &m->seg; sum += m->topsize + TOP_FOOT_SIZE; while (s != 0) { mchunkptr q = align_as_chunk(s->base); mchunkptr lastq = 0; assert(pinuse(q)); while (segment_holds(s, q) && q != m->top && q->head != FENCEPOST_HEAD) { sum += chunksize(q); if (cinuse(q)) { assert(!bin_find(m, q)); do_check_inuse_chunk(m, q); } else { assert(q == m->dv || bin_find(m, q)); assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */ do_check_free_chunk(m, q); } lastq = q; q = next_chunk(q); } s = s->next; } } return sum; } /* Check all properties of malloc_state. */ static void do_check_malloc_state(mstate m) { bindex_t i; size_t total; /* check bins */ for (i = 0; i < NSMALLBINS; ++i) do_check_smallbin(m, i); for (i = 0; i < NTREEBINS; ++i) do_check_treebin(m, i); if (m->dvsize != 0) { /* check dv chunk */ do_check_any_chunk(m, m->dv); assert(m->dvsize == chunksize(m->dv)); assert(m->dvsize >= MIN_CHUNK_SIZE); assert(bin_find(m, m->dv) == 0); } if (m->top != 0) { /* check top chunk */ do_check_top_chunk(m, m->top); assert(m->topsize == chunksize(m->top)); assert(m->topsize > 0); assert(bin_find(m, m->top) == 0); } total = traverse_and_check(m); assert(total <= m->footprint); assert(m->footprint <= m->max_footprint); } #endif /* DEBUG */ /* ----------------------------- statistics ------------------------------ */ #if !NO_MALLINFO static struct mallinfo internal_mallinfo(mstate m) { struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (!PREACTION(m)) { check_malloc_state(m); if (is_initialized(m)) { size_t nfree = SIZE_T_ONE; /* top always free */ size_t mfree = m->topsize + TOP_FOOT_SIZE; size_t sum = mfree; msegmentptr s = &m->seg; while (s != 0) { mchunkptr q = align_as_chunk(s->base); while (segment_holds(s, q) && q != m->top && q->head != FENCEPOST_HEAD) { size_t sz = chunksize(q); sum += sz; if (!cinuse(q)) { mfree += sz; ++nfree; } q = next_chunk(q); } s = s->next; } nm.arena = sum; nm.ordblks = nfree; nm.hblkhd = m->footprint - sum; nm.usmblks = m->max_footprint; nm.uordblks = m->footprint - mfree; nm.fordblks = mfree; nm.keepcost = m->topsize; } POSTACTION(m); } return nm; } #endif /* !NO_MALLINFO */ static void internal_malloc_stats(mstate m) { if (!PREACTION(m)) { size_t maxfp = 0; size_t fp = 0; size_t used = 0; check_malloc_state(m); if (is_initialized(m)) { msegmentptr s = &m->seg; maxfp = m->max_footprint; fp = m->footprint; used = fp - (m->topsize + TOP_FOOT_SIZE); while (s != 0) { mchunkptr q = align_as_chunk(s->base); while (segment_holds(s, q) && q != m->top && q->head != FENCEPOST_HEAD) { if (!cinuse(q)) used -= chunksize(q); q = next_chunk(q); } s = s->next; } } fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); POSTACTION(m); } } /* ----------------------- Operations on smallbins ----------------------- */ /* Various forms of linking and unlinking are defined as macros. Even the ones for trees, which are very long but have very short typical paths. This is ugly but reduces reliance on inlining support of compilers. */ /* Link a free chunk into a smallbin */ #define insert_small_chunk(M, P, S) {\ bindex_t I = small_index(S);\ mchunkptr B = smallbin_at(M, I);\ mchunkptr F = B;\ assert(S >= MIN_CHUNK_SIZE);\ if (!smallmap_is_marked(M, I))\ mark_smallmap(M, I);\ else if (RTCHECK(ok_address(M, B->fd)))\ F = B->fd;\ else {\ CORRUPTION_ERROR_ACTION(M);\ }\ B->fd = P;\ F->bk = P;\ P->fd = F;\ P->bk = B;\ } /* Unlink a chunk from a smallbin */ #define unlink_small_chunk(M, P, S) {\ mchunkptr F = P->fd;\ mchunkptr B = P->bk;\ bindex_t I = small_index(S);\ assert(P != B);\ assert(P != F);\ assert(chunksize(P) == small_index2size(I));\ if (F == B)\ clear_smallmap(M, I);\ else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\ (B == smallbin_at(M,I) || ok_address(M, B)))) {\ F->bk = B;\ B->fd = F;\ }\ else {\ CORRUPTION_ERROR_ACTION(M);\ }\ } /* Unlink the first chunk from a smallbin */ #define unlink_first_small_chunk(M, B, P, I) {\ mchunkptr F = P->fd;\ assert(P != B);\ assert(P != F);\ assert(chunksize(P) == small_index2size(I));\ if (B == F)\ clear_smallmap(M, I);\ else if (RTCHECK(ok_address(M, F))) {\ B->fd = F;\ F->bk = B;\ }\ else {\ CORRUPTION_ERROR_ACTION(M);\ }\ } /* Replace dv node, binning the old one */ /* Used only when dvsize known to be small */ #define replace_dv(M, P, S) {\ size_t DVS = M->dvsize;\ if (DVS != 0) {\ mchunkptr DV = M->dv;\ assert(is_small(DVS));\ insert_small_chunk(M, DV, DVS);\ }\ M->dvsize = S;\ M->dv = P;\ } /* ------------------------- Operations on trees ------------------------- */ /* Insert chunk into tree */ #define insert_large_chunk(M, X, S) {\ tbinptr* H;\ bindex_t I;\ compute_tree_index(S, I);\ H = treebin_at(M, I);\ X->index = I;\ X->child[0] = X->child[1] = 0;\ if (!treemap_is_marked(M, I)) {\ mark_treemap(M, I);\ *H = X;\ X->parent = (tchunkptr)H;\ X->fd = X->bk = X;\ }\ else {\ tchunkptr T = *H;\ size_t K = S << leftshift_for_tree_index(I);\ for (;;) {\ if (chunksize(T) != S) {\ tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ K <<= 1;\ if (*C != 0)\ T = *C;\ else if (RTCHECK(ok_address(M, C))) {\ *C = X;\ X->parent = T;\ X->fd = X->bk = X;\ break;\ }\ else {\ CORRUPTION_ERROR_ACTION(M);\ break;\ }\ }\ else {\ tchunkptr F = T->fd;\ if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ T->fd = F->bk = X;\ X->fd = F;\ X->bk = T;\ X->parent = 0;\ break;\ }\ else {\ CORRUPTION_ERROR_ACTION(M);\ break;\ }\ }\ }\ }\ } /* Unlink steps: 1. If x is a chained node, unlink it from its same-sized fd/bk links and choose its bk node as its replacement. 2. If x was the last node of its size, but not a leaf node, it must be replaced with a leaf node (not merely one with an open left or right), to make sure that lefts and rights of descendents correspond properly to bit masks. We use the rightmost descendent of x. We could use any other leaf, but this is easy to locate and tends to counteract removal of leftmosts elsewhere, and so keeps paths shorter than minimally guaranteed. This doesn't loop much because on average a node in a tree is near the bottom. 3. If x is the base of a chain (i.e., has parent links) relink x's parent and children to x's replacement (or null if none). */ #define unlink_large_chunk(M, X) {\ tchunkptr XP = X->parent;\ tchunkptr R;\ if (X->bk != X) {\ tchunkptr F = X->fd;\ R = X->bk;\ if (RTCHECK(ok_address(M, F))) {\ F->bk = R;\ R->fd = F;\ }\ else {\ CORRUPTION_ERROR_ACTION(M);\ }\ }\ else {\ tchunkptr* RP;\ if (((R = *(RP = &(X->child[1]))) != 0) ||\ ((R = *(RP = &(X->child[0]))) != 0)) {\ tchunkptr* CP;\ while ((*(CP = &(R->child[1])) != 0) ||\ (*(CP = &(R->child[0])) != 0)) {\ R = *(RP = CP);\ }\ if (RTCHECK(ok_address(M, RP)))\ *RP = 0;\ else {\ CORRUPTION_ERROR_ACTION(M);\ }\ }\ }\ if (XP != 0) {\ tbinptr* H = treebin_at(M, X->index);\ if (X == *H) {\ if ((*H = R) == 0) \ clear_treemap(M, X->index);\ }\ else if (RTCHECK(ok_address(M, XP))) {\ if (XP->child[0] == X) \ XP->child[0] = R;\ else \ XP->child[1] = R;\ }\ else\ CORRUPTION_ERROR_ACTION(M);\ if (R != 0) {\ if (RTCHECK(ok_address(M, R))) {\ tchunkptr C0, C1;\ R->parent = XP;\ if ((C0 = X->child[0]) != 0) {\ if (RTCHECK(ok_address(M, C0))) {\ R->child[0] = C0;\ C0->parent = R;\ }\ else\ CORRUPTION_ERROR_ACTION(M);\ }\ if ((C1 = X->child[1]) != 0) {\ if (RTCHECK(ok_address(M, C1))) {\ R->child[1] = C1;\ C1->parent = R;\ }\ else\ CORRUPTION_ERROR_ACTION(M);\ }\ }\ else\ CORRUPTION_ERROR_ACTION(M);\ }\ }\ } /* Relays to large vs small bin operations */ #define insert_chunk(M, P, S)\ if (is_small(S)) insert_small_chunk(M, P, S)\ else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } #define unlink_chunk(M, P, S)\ if (is_small(S)) unlink_small_chunk(M, P, S)\ else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } /* Relays to internal calls to malloc/free from realloc, memalign etc */ #if ONLY_MSPACES #define internal_malloc(m, b) mspace_malloc(m, b) #define internal_free(m, mem) mspace_free(m,mem); #else /* ONLY_MSPACES */ #if MSPACES #define internal_malloc(m, b)\ (m == gm)? dlmalloc(b) : mspace_malloc(m, b) #define internal_free(m, mem)\ if (m == gm) dlfree(mem); else mspace_free(m,mem); #else /* MSPACES */ #define internal_malloc(m, b) dlmalloc(b) #define internal_free(m, mem) dlfree(mem) #endif /* MSPACES */ #endif /* ONLY_MSPACES */ /* ----------------------- Direct-mmapping chunks ----------------------- */ /* Directly mmapped chunks are set up with an offset to the start of the mmapped region stored in the prev_foot field of the chunk. This allows reconstruction of the required argument to MUNMAP when freed, and also allows adjustment of the returned chunk to meet alignment requirements (especially in memalign). There is also enough space allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain the PINUSE bit so frees can be checked. */ /* Malloc using mmap */ static void* mmap_alloc(mstate m, size_t nb) { size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); if (mmsize > nb) { /* Check for wrap around 0 */ char* mm = (char*)(DIRECT_MMAP(mmsize)); if (mm != CMFAIL) { size_t offset = align_offset(chunk2mem(mm)); size_t psize = mmsize - offset - MMAP_FOOT_PAD; mchunkptr p = (mchunkptr)(mm + offset); p->prev_foot = offset | IS_MMAPPED_BIT; (p)->head = (psize|CINUSE_BIT); mark_inuse_foot(m, p, psize); chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; if (mm < m->least_addr) m->least_addr = mm; if ((m->footprint += mmsize) > m->max_footprint) m->max_footprint = m->footprint; assert(is_aligned(chunk2mem(p))); check_mmapped_chunk(m, p); return chunk2mem(p); } } return 0; } /* Realloc using mmap */ static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { size_t oldsize = chunksize(oldp); if (is_small(nb)) /* Can't shrink mmap regions below small size */ return 0; /* Keep old chunk if big enough but not too big */ if (oldsize >= nb + SIZE_T_SIZE && (oldsize - nb) <= (mparams.granularity << 1)) return oldp; else { size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT; size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); char* cp = (char*)CALL_MREMAP((char*)oldp - offset, oldmmsize, newmmsize, 1); if (cp != CMFAIL) { mchunkptr newp = (mchunkptr)(cp + offset); size_t psize = newmmsize - offset - MMAP_FOOT_PAD; newp->head = (psize|CINUSE_BIT); mark_inuse_foot(m, newp, psize); chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; if (cp < m->least_addr) m->least_addr = cp; if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) m->max_footprint = m->footprint; check_mmapped_chunk(m, newp); return newp; } } return 0; } /* -------------------------- mspace management -------------------------- */ /* Initialize top chunk and its size */ static void init_top(mstate m, mchunkptr p, size_t psize) { /* Ensure alignment */ size_t offset = align_offset(chunk2mem(p)); p = (mchunkptr)((char*)p + offset); psize -= offset; m->top = p; m->topsize = psize; p->head = psize | PINUSE_BIT; /* set size of fake trailing chunk holding overhead space only once */ chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; m->trim_check = mparams.trim_threshold; /* reset on each update */ } /* Initialize bins for a new mstate that is otherwise zeroed out */ static void init_bins(mstate m) { /* Establish circular links for smallbins */ bindex_t i; for (i = 0; i < NSMALLBINS; ++i) { sbinptr bin = smallbin_at(m,i); bin->fd = bin->bk = bin; } } #if PROCEED_ON_ERROR /* default corruption action */ static void reset_on_error(mstate m) { int i; ++malloc_corruption_error_count; /* Reinitialize fields to forget about all memory */ m->smallbins = m->treebins = 0; m->dvsize = m->topsize = 0; m->seg.base = 0; m->seg.size = 0; m->seg.next = 0; m->top = m->dv = 0; for (i = 0; i < NTREEBINS; ++i) *treebin_at(m, i) = 0; init_bins(m); } #endif /* PROCEED_ON_ERROR */ /* Allocate chunk and prepend remainder with chunk in successor base. */ static void* prepend_alloc(mstate m, char* newbase, char* oldbase, size_t nb) { mchunkptr p = align_as_chunk(newbase); mchunkptr oldfirst = align_as_chunk(oldbase); size_t psize = (char*)oldfirst - (char*)p; mchunkptr q = chunk_plus_offset(p, nb); size_t qsize = psize - nb; set_size_and_pinuse_of_inuse_chunk(m, p, nb); assert((char*)oldfirst > (char*)q); assert(pinuse(oldfirst)); assert(qsize >= MIN_CHUNK_SIZE); /* consolidate remainder with first chunk of old base */ if (oldfirst == m->top) { size_t tsize = m->topsize += qsize; m->top = q; q->head = tsize | PINUSE_BIT; check_top_chunk(m, q); } else if (oldfirst == m->dv) { size_t dsize = m->dvsize += qsize; m->dv = q; set_size_and_pinuse_of_free_chunk(q, dsize); } else { if (!cinuse(oldfirst)) { size_t nsize = chunksize(oldfirst); unlink_chunk(m, oldfirst, nsize); oldfirst = chunk_plus_offset(oldfirst, nsize); qsize += nsize; } set_free_with_pinuse(q, qsize, oldfirst); insert_chunk(m, q, qsize); check_free_chunk(m, q); } check_malloced_chunk(m, chunk2mem(p), nb); return chunk2mem(p); } /* Add a segment to hold a new noncontiguous region */ static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { /* Determine locations and sizes of segment, fenceposts, old top */ char* old_top = (char*)m->top; msegmentptr oldsp = segment_holding(m, old_top); char* old_end = oldsp->base + oldsp->size; size_t ssize = pad_request(sizeof(struct malloc_segment)); char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); size_t offset = align_offset(chunk2mem(rawsp)); char* asp = rawsp + offset; char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; mchunkptr sp = (mchunkptr)csp; msegmentptr ss = (msegmentptr)(chunk2mem(sp)); mchunkptr tnext = chunk_plus_offset(sp, ssize); mchunkptr p = tnext; int nfences = 0; /* reset top to new space */ init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); /* Set up segment record */ assert(is_aligned(ss)); set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); *ss = m->seg; /* Push current record */ m->seg.base = tbase; m->seg.size = tsize; m->seg.sflags = mmapped; m->seg.next = ss; /* Insert trailing fenceposts */ for (;;) { mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); p->head = FENCEPOST_HEAD; ++nfences; if ((char*)(&(nextp->head)) < old_end) p = nextp; else break; } assert(nfences >= 2); /* Insert the rest of old top into a bin as an ordinary free chunk */ if (csp != old_top) { mchunkptr q = (mchunkptr)old_top; size_t psize = csp - old_top; mchunkptr tn = chunk_plus_offset(q, psize); set_free_with_pinuse(q, psize, tn); insert_chunk(m, q, psize); } check_top_chunk(m, m->top); } /* -------------------------- System allocation -------------------------- */ /* Get memory from system using MORECORE or MMAP */ static void* sys_alloc(mstate m, size_t nb) { char* tbase = CMFAIL; size_t tsize = 0; flag_t mmap_flag = 0; init_mparams(); /* Directly map large chunks */ if (use_mmap(m) && nb >= mparams.mmap_threshold) { void* mem = mmap_alloc(m, nb); if (mem != 0) return mem; } /* Try getting memory in any of three ways (in most-preferred to least-preferred order): 1. A call to MORECORE that can normally contiguously extend memory. (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or or main space is mmapped or a previous contiguous call failed) 2. A call to MMAP new space (disabled if not HAVE_MMAP). Note that under the default settings, if MORECORE is unable to fulfill a request, and HAVE_MMAP is true, then mmap is used as a noncontiguous system allocator. This is a useful backup strategy for systems with holes in address spaces -- in this case sbrk cannot contiguously expand the heap, but mmap may be able to find space. 3. A call to MORECORE that cannot usually contiguously extend memory. (disabled if not HAVE_MORECORE) */ if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { char* br = CMFAIL; msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); size_t asize = 0; ACQUIRE_MORECORE_LOCK(); if (ss == 0) { /* First time through or recovery */ char* base = (char*)CALL_MORECORE(0); if (base != CMFAIL) { asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); /* Adjust to end on a page boundary */ if (!is_page_aligned(base)) asize += (page_align((size_t)base) - (size_t)base); /* Can't call MORECORE if size is negative when treated as signed */ if (asize < HALF_MAX_SIZE_T && (br = (char*)(CALL_MORECORE(asize))) == base) { tbase = base; tsize = asize; } } } else { /* Subtract out existing available top space from MORECORE request. */ asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE); /* Use mem here only if it did continuously extend old space */ if (asize < HALF_MAX_SIZE_T && (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { tbase = br; tsize = asize; } } if (tbase == CMFAIL) { /* Cope with partial failure */ if (br != CMFAIL) { /* Try to use/extend the space we did get */ if (asize < HALF_MAX_SIZE_T && asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) { size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize); if (esize < HALF_MAX_SIZE_T) { char* end = (char*)CALL_MORECORE(esize); if (end != CMFAIL) asize += esize; else { /* Can't use; try to release */ CALL_MORECORE(-asize); br = CMFAIL; } } } } if (br != CMFAIL) { /* Use the space we did get */ tbase = br; tsize = asize; } else disable_contiguous(m); /* Don't try contiguous path in the future */ } RELEASE_MORECORE_LOCK(); } if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; size_t rsize = granularity_align(req); if (rsize > nb) { /* Fail if wraps around zero */ char* mp = (char*)(CALL_MMAP(rsize)); if (mp != CMFAIL) { tbase = mp; tsize = rsize; mmap_flag = IS_MMAPPED_BIT; } } } if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); if (asize < HALF_MAX_SIZE_T) { char* br = CMFAIL; char* end = CMFAIL; ACQUIRE_MORECORE_LOCK(); br = (char*)(CALL_MORECORE(asize)); end = (char*)(CALL_MORECORE(0)); RELEASE_MORECORE_LOCK(); if (br != CMFAIL && end != CMFAIL && br < end) { size_t ssize = end - br; if (ssize > nb + TOP_FOOT_SIZE) { tbase = br; tsize = ssize; } } } } if (tbase != CMFAIL) { if ((m->footprint += tsize) > m->max_footprint) m->max_footprint = m->footprint; if (!is_initialized(m)) { /* first-time initialization */ m->seg.base = m->least_addr = tbase; m->seg.size = tsize; m->seg.sflags = mmap_flag; m->magic = mparams.magic; init_bins(m); if (is_global(m)) init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); else { /* Offset top by embedded malloc_state */ mchunkptr mn = next_chunk(mem2chunk(m)); init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); } } else { /* Try to merge with an existing segment */ msegmentptr sp = &m->seg; while (sp != 0 && tbase != sp->base + sp->size) sp = sp->next; if (sp != 0 && !is_extern_segment(sp) && (sp->sflags & IS_MMAPPED_BIT) == mmap_flag && segment_holds(sp, m->top)) { /* append */ sp->size += tsize; init_top(m, m->top, m->topsize + tsize); } else { if (tbase < m->least_addr) m->least_addr = tbase; sp = &m->seg; while (sp != 0 && sp->base != tbase + tsize) sp = sp->next; if (sp != 0 && !is_extern_segment(sp) && (sp->sflags & IS_MMAPPED_BIT) == mmap_flag) { char* oldbase = sp->base; sp->base = tbase; sp->size += tsize; return prepend_alloc(m, tbase, oldbase, nb); } else add_segment(m, tbase, tsize, mmap_flag); } } if (nb < m->topsize) { /* Allocate from new or extended top space */ size_t rsize = m->topsize -= nb; mchunkptr p = m->top; mchunkptr r = m->top = chunk_plus_offset(p, nb); r->head = rsize | PINUSE_BIT; set_size_and_pinuse_of_inuse_chunk(m, p, nb); check_top_chunk(m, m->top); check_malloced_chunk(m, chunk2mem(p), nb); return chunk2mem(p); } } MALLOC_FAILURE_ACTION; return 0; } /* ----------------------- system deallocation -------------------------- */ /* Unmap and unlink any mmapped segments that don't contain used chunks */ static size_t release_unused_segments(mstate m) { size_t released = 0; msegmentptr pred = &m->seg; msegmentptr sp = pred->next; while (sp != 0) { char* base = sp->base; size_t size = sp->size; msegmentptr next = sp->next; if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { mchunkptr p = align_as_chunk(base); size_t psize = chunksize(p); /* Can unmap if first chunk holds entire segment and not pinned */ if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { tchunkptr tp = (tchunkptr)p; assert(segment_holds(sp, (char*)sp)); if (p == m->dv) { m->dv = 0; m->dvsize = 0; } else { unlink_large_chunk(m, tp); } if (CALL_MUNMAP(base, size) == 0) { released += size; m->footprint -= size; /* unlink obsoleted record */ sp = pred; sp->next = next; } else { /* back out if cannot unmap */ insert_large_chunk(m, tp, psize); } } } pred = sp; sp = next; } return released; } static int sys_trim(mstate m, size_t pad) { size_t released = 0; if (pad < MAX_REQUEST && is_initialized(m)) { pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ if (m->topsize > pad) { /* Shrink top space in granularity-size units, keeping at least one */ size_t unit = mparams.granularity; size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - SIZE_T_ONE) * unit; msegmentptr sp = segment_holding(m, (char*)m->top); if (!is_extern_segment(sp)) { if (is_mmapped_segment(sp)) { if (HAVE_MMAP && sp->size >= extra && !has_segment_link(m, sp)) { /* can't shrink if pinned */ size_t newsize = sp->size - extra; /* Prefer mremap, fall back to munmap */ if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { released = extra; } } } else if (HAVE_MORECORE) { if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; ACQUIRE_MORECORE_LOCK(); { /* Make sure end of memory is where we last set it. */ char* old_br = (char*)(CALL_MORECORE(0)); if (old_br == sp->base + sp->size) { char* rel_br = (char*)(CALL_MORECORE(-extra)); char* new_br = (char*)(CALL_MORECORE(0)); if (rel_br != CMFAIL && new_br < old_br) released = old_br - new_br; } } RELEASE_MORECORE_LOCK(); } } if (released != 0) { sp->size -= released; m->footprint -= released; init_top(m, m->top, m->topsize - released); check_top_chunk(m, m->top); } } /* Unmap any unused mmapped segments */ if (HAVE_MMAP) released += release_unused_segments(m); /* On failure, disable autotrim to avoid repeated failed future calls */ if (released == 0) m->trim_check = MAX_SIZE_T; } return (released != 0)? 1 : 0; } /* ---------------------------- malloc support --------------------------- */ /* allocate a large request from the best fitting chunk in a treebin */ static void* tmalloc_large(mstate m, size_t nb) { tchunkptr v = 0; size_t rsize = -nb; /* Unsigned negation */ tchunkptr t; bindex_t idx; compute_tree_index(nb, idx); if ((t = *treebin_at(m, idx)) != 0) { /* Traverse tree for this bin looking for node with size == nb */ size_t sizebits = nb << leftshift_for_tree_index(idx); tchunkptr rst = 0; /* The deepest untaken right subtree */ for (;;) { tchunkptr rt; size_t trem = chunksize(t) - nb; if (trem < rsize) { v = t; if ((rsize = trem) == 0) break; } rt = t->child[1]; t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; if (rt != 0 && rt != t) rst = rt; if (t == 0) { t = rst; /* set t to least subtree holding sizes > nb */ break; } sizebits <<= 1; } } if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; if (leftbits != 0) { bindex_t i; binmap_t leastbit = least_bit(leftbits); compute_bit2idx(leastbit, i); t = *treebin_at(m, i); } } while (t != 0) { /* find smallest of tree or subtree */ size_t trem = chunksize(t) - nb; if (trem < rsize) { rsize = trem; v = t; } t = leftmost_child(t); } /* If dv is a better fit, return 0 so malloc will use it */ if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { if (RTCHECK(ok_address(m, v))) { /* split */ mchunkptr r = chunk_plus_offset(v, nb); assert(chunksize(v) == rsize + nb); if (RTCHECK(ok_next(v, r))) { unlink_large_chunk(m, v); if (rsize < MIN_CHUNK_SIZE) set_inuse_and_pinuse(m, v, (rsize + nb)); else { set_size_and_pinuse_of_inuse_chunk(m, v, nb); set_size_and_pinuse_of_free_chunk(r, rsize); insert_chunk(m, r, rsize); } return chunk2mem(v); } } CORRUPTION_ERROR_ACTION(m); } return 0; } /* allocate a small request from the best fitting chunk in a treebin */ static void* tmalloc_small(mstate m, size_t nb) { tchunkptr t, v; size_t rsize; bindex_t i; binmap_t leastbit = least_bit(m->treemap); compute_bit2idx(leastbit, i); v = t = *treebin_at(m, i); rsize = chunksize(t) - nb; while ((t = leftmost_child(t)) != 0) { size_t trem = chunksize(t) - nb; if (trem < rsize) { rsize = trem; v = t; } } if (RTCHECK(ok_address(m, v))) { mchunkptr r = chunk_plus_offset(v, nb); assert(chunksize(v) == rsize + nb); if (RTCHECK(ok_next(v, r))) { unlink_large_chunk(m, v); if (rsize < MIN_CHUNK_SIZE) set_inuse_and_pinuse(m, v, (rsize + nb)); else { set_size_and_pinuse_of_inuse_chunk(m, v, nb); set_size_and_pinuse_of_free_chunk(r, rsize); replace_dv(m, r, rsize); } return chunk2mem(v); } } CORRUPTION_ERROR_ACTION(m); return 0; } /* --------------------------- realloc support --------------------------- */ static void* internal_realloc(mstate m, void* oldmem, size_t bytes) { if (bytes >= MAX_REQUEST) { MALLOC_FAILURE_ACTION; return 0; } if (!PREACTION(m)) { mchunkptr oldp = mem2chunk(oldmem); size_t oldsize = chunksize(oldp); mchunkptr next = chunk_plus_offset(oldp, oldsize); mchunkptr newp = 0; void* extra = 0; /* Try to either shrink or extend into top. Else malloc-copy-free */ if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) && ok_next(oldp, next) && ok_pinuse(next))) { size_t nb = request2size(bytes); if (is_mmapped(oldp)) newp = mmap_resize(m, oldp, nb); else if (oldsize >= nb) { /* already big enough */ size_t rsize = oldsize - nb; newp = oldp; if (rsize >= MIN_CHUNK_SIZE) { mchunkptr remainder = chunk_plus_offset(newp, nb); set_inuse(m, newp, nb); set_inuse(m, remainder, rsize); extra = chunk2mem(remainder); } } else if (next == m->top && oldsize + m->topsize > nb) { /* Expand into top */ size_t newsize = oldsize + m->topsize; size_t newtopsize = newsize - nb; mchunkptr newtop = chunk_plus_offset(oldp, nb); set_inuse(m, oldp, nb); newtop->head = newtopsize |PINUSE_BIT; m->top = newtop; m->topsize = newtopsize; newp = oldp; } } else { USAGE_ERROR_ACTION(m, oldmem); POSTACTION(m); return 0; } POSTACTION(m); if (newp != 0) { if (extra != 0) { internal_free(m, extra); } check_inuse_chunk(m, newp); return chunk2mem(newp); } else { void* newmem = internal_malloc(m, bytes); if (newmem != 0) { size_t oc = oldsize - overhead_for(oldp); memcpy(newmem, oldmem, (oc < bytes)? oc : bytes); internal_free(m, oldmem); } return newmem; } } return 0; } /* --------------------------- memalign support -------------------------- */ static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { if (alignment <= MALLOC_ALIGNMENT) /* Can just use malloc */ return internal_malloc(m, bytes); if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ alignment = MIN_CHUNK_SIZE; if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ size_t a = MALLOC_ALIGNMENT << 1; while (a < alignment) a <<= 1; alignment = a; } if (bytes >= MAX_REQUEST - alignment) { if (m != 0) { /* Test isn't needed but avoids compiler warning */ MALLOC_FAILURE_ACTION; } } else { size_t nb = request2size(bytes); size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; char* mem = (char*)internal_malloc(m, req); if (mem != 0) { void* leader = 0; void* trailer = 0; mchunkptr p = mem2chunk(mem); if (PREACTION(m)) return 0; if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */ /* Find an aligned spot inside chunk. Since we need to give back leading space in a chunk of at least MIN_CHUNK_SIZE, if the first calculation places us at a spot with less than MIN_CHUNK_SIZE leader, we can move to the next aligned spot. We've allocated enough total room so that this is always possible. */ char* br = (char*)mem2chunk((size_t)(((size_t)(mem + alignment - SIZE_T_ONE)) & -alignment)); char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? br : br+alignment; mchunkptr newp = (mchunkptr)pos; size_t leadsize = pos - (char*)(p); size_t newsize = chunksize(p) - leadsize; if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ newp->prev_foot = p->prev_foot + leadsize; newp->head = (newsize|CINUSE_BIT); } else { /* Otherwise, give back leader, use the rest */ set_inuse(m, newp, newsize); set_inuse(m, p, leadsize); leader = chunk2mem(p); } p = newp; } /* Give back spare room at the end */ if (!is_mmapped(p)) { size_t size = chunksize(p); if (size > nb + MIN_CHUNK_SIZE) { size_t remainder_size = size - nb; mchunkptr remainder = chunk_plus_offset(p, nb); set_inuse(m, p, nb); set_inuse(m, remainder, remainder_size); trailer = chunk2mem(remainder); } } assert (chunksize(p) >= nb); assert((((size_t)(chunk2mem(p))) % alignment) == 0); check_inuse_chunk(m, p); POSTACTION(m); if (leader != 0) { internal_free(m, leader); } if (trailer != 0) { internal_free(m, trailer); } return chunk2mem(p); } } return 0; } /* ------------------------ comalloc/coalloc support --------------------- */ static void** ialloc(mstate m, size_t n_elements, size_t* sizes, int opts, void* chunks[]) { /* This provides common support for independent_X routines, handling all of the combinations that can result. The opts arg has: bit 0 set if all elements are same size (using sizes[0]) bit 1 set if elements should be zeroed */ size_t element_size; /* chunksize of each element, if all same */ size_t contents_size; /* total size of elements */ size_t array_size; /* request size of pointer array */ void* mem; /* malloced aggregate space */ mchunkptr p; /* corresponding chunk */ size_t remainder_size; /* remaining bytes while splitting */ void** marray; /* either "chunks" or malloced ptr array */ mchunkptr array_chunk; /* chunk for malloced ptr array */ flag_t was_enabled; /* to disable mmap */ size_t size; size_t i; /* compute array length, if needed */ if (chunks != 0) { if (n_elements == 0) return chunks; /* nothing to do */ marray = chunks; array_size = 0; } else { /* if empty req, must still return chunk representing empty array */ if (n_elements == 0) return (void**)internal_malloc(m, 0); marray = 0; array_size = request2size(n_elements * (sizeof(void*))); } /* compute total element size */ if (opts & 0x1) { /* all-same-size */ element_size = request2size(*sizes); contents_size = n_elements * element_size; } else { /* add up all the sizes */ element_size = 0; contents_size = 0; for (i = 0; i != n_elements; ++i) contents_size += request2size(sizes[i]); } size = contents_size + array_size; /* Allocate the aggregate chunk. First disable direct-mmapping so malloc won't use it, since we would not be able to later free/realloc space internal to a segregated mmap region. */ was_enabled = use_mmap(m); disable_mmap(m); mem = internal_malloc(m, size - CHUNK_OVERHEAD); if (was_enabled) enable_mmap(m); if (mem == 0) return 0; if (PREACTION(m)) return 0; p = mem2chunk(mem); remainder_size = chunksize(p); assert(!is_mmapped(p)); if (opts & 0x2) { /* optionally clear the elements */ memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); } /* If not provided, allocate the pointer array as final part of chunk */ if (marray == 0) { size_t array_chunk_size; array_chunk = chunk_plus_offset(p, contents_size); array_chunk_size = remainder_size - contents_size; marray = (void**) (chunk2mem(array_chunk)); set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); remainder_size = contents_size; } /* split out elements */ for (i = 0; ; ++i) { marray[i] = chunk2mem(p); if (i != n_elements-1) { if (element_size != 0) size = element_size; else size = request2size(sizes[i]); remainder_size -= size; set_size_and_pinuse_of_inuse_chunk(m, p, size); p = chunk_plus_offset(p, size); } else { /* the final element absorbs any overallocation slop */ set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); break; } } #if DEBUG if (marray != chunks) { /* final element must have exactly exhausted chunk */ if (element_size != 0) { assert(remainder_size == element_size); } else { assert(remainder_size == request2size(sizes[i])); } check_inuse_chunk(m, mem2chunk(marray)); } for (i = 0; i != n_elements; ++i) check_inuse_chunk(m, mem2chunk(marray[i])); #endif /* DEBUG */ POSTACTION(m); return marray; } /* -------------------------- public routines ---------------------------- */ #if !ONLY_MSPACES void* dlmalloc(size_t bytes) { /* Basic algorithm: If a small request (< 256 bytes minus per-chunk overhead): 1. If one exists, use a remainderless chunk in associated smallbin. (Remainderless means that there are too few excess bytes to represent as a chunk.) 2. If it is big enough, use the dv chunk, which is normally the chunk adjacent to the one used for the most recent small request. 3. If one exists, split the smallest available chunk in a bin, saving remainder in dv. 4. If it is big enough, use the top chunk. 5. If available, get memory from system and use it Otherwise, for a large request: 1. Find the smallest available binned chunk that fits, and use it if it is better fitting than dv chunk, splitting if necessary. 2. If better fitting than any binned chunk, use the dv chunk. 3. If it is big enough, use the top chunk. 4. If request size >= mmap threshold, try to directly mmap this chunk. 5. If available, get memory from system and use it The ugly goto's here ensure that postaction occurs along all paths. */ if (!PREACTION(gm)) { void* mem; size_t nb; if (bytes <= MAX_SMALL_REQUEST) { bindex_t idx; binmap_t smallbits; nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); idx = small_index(nb); smallbits = gm->smallmap >> idx; if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ mchunkptr b, p; idx += ~smallbits & 1; /* Uses next bin if idx empty */ b = smallbin_at(gm, idx); p = b->fd; assert(chunksize(p) == small_index2size(idx)); unlink_first_small_chunk(gm, b, p, idx); set_inuse_and_pinuse(gm, p, small_index2size(idx)); mem = chunk2mem(p); check_malloced_chunk(gm, mem, nb); goto postaction; } else if (nb > gm->dvsize) { if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ mchunkptr b, p, r; size_t rsize; bindex_t i; binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); binmap_t leastbit = least_bit(leftbits); compute_bit2idx(leastbit, i); b = smallbin_at(gm, i); p = b->fd; assert(chunksize(p) == small_index2size(i)); unlink_first_small_chunk(gm, b, p, i); rsize = small_index2size(i) - nb; /* Fit here cannot be remainderless if 4byte sizes */ if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) set_inuse_and_pinuse(gm, p, small_index2size(i)); else { set_size_and_pinuse_of_inuse_chunk(gm, p, nb); r = chunk_plus_offset(p, nb); set_size_and_pinuse_of_free_chunk(r, rsize); replace_dv(gm, r, rsize); } mem = chunk2mem(p); check_malloced_chunk(gm, mem, nb); goto postaction; } else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { check_malloced_chunk(gm, mem, nb); goto postaction; } } } else if (bytes >= MAX_REQUEST) nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ else { nb = pad_request(bytes); if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { check_malloced_chunk(gm, mem, nb); goto postaction; } } if (nb <= gm->dvsize) { size_t rsize = gm->dvsize - nb; mchunkptr p = gm->dv; if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ mchunkptr r = gm->dv = chunk_plus_offset(p, nb); gm->dvsize = rsize; set_size_and_pinuse_of_free_chunk(r, rsize); set_size_and_pinuse_of_inuse_chunk(gm, p, nb); } else { /* exhaust dv */ size_t dvs = gm->dvsize; gm->dvsize = 0; gm->dv = 0; set_inuse_and_pinuse(gm, p, dvs); } mem = chunk2mem(p); check_malloced_chunk(gm, mem, nb); goto postaction; } else if (nb < gm->topsize) { /* Split top */ size_t rsize = gm->topsize -= nb; mchunkptr p = gm->top; mchunkptr r = gm->top = chunk_plus_offset(p, nb); r->head = rsize | PINUSE_BIT; set_size_and_pinuse_of_inuse_chunk(gm, p, nb); mem = chunk2mem(p); check_top_chunk(gm, gm->top); check_malloced_chunk(gm, mem, nb); goto postaction; } mem = sys_alloc(gm, nb); postaction: POSTACTION(gm); return mem; } return 0; } void dlfree(void* mem) { /* Consolidate freed chunks with preceeding or succeeding bordering free chunks, if they exist, and then place in a bin. Intermixed with special cases for top, dv, mmapped chunks, and usage errors. */ if (mem != 0) { mchunkptr p = mem2chunk(mem); #if FOOTERS mstate fm = get_mstate_for(p); if (!ok_magic(fm)) { USAGE_ERROR_ACTION(fm, p); return; } #else /* FOOTERS */ #define fm gm #endif /* FOOTERS */ if (!PREACTION(fm)) { check_inuse_chunk(fm, p); if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { size_t psize = chunksize(p); mchunkptr next = chunk_plus_offset(p, psize); if (!pinuse(p)) { size_t prevsize = p->prev_foot; if ((prevsize & IS_MMAPPED_BIT) != 0) { prevsize &= ~IS_MMAPPED_BIT; psize += prevsize + MMAP_FOOT_PAD; if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) fm->footprint -= psize; goto postaction; } else { mchunkptr prev = chunk_minus_offset(p, prevsize); psize += prevsize; p = prev; if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ if (p != fm->dv) { unlink_chunk(fm, p, prevsize); } else if ((next->head & INUSE_BITS) == INUSE_BITS) { fm->dvsize = psize; set_free_with_pinuse(p, psize, next); goto postaction; } } else goto erroraction; } } if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { if (!cinuse(next)) { /* consolidate forward */ if (next == fm->top) { size_t tsize = fm->topsize += psize; fm->top = p; p->head = tsize | PINUSE_BIT; if (p == fm->dv) { fm->dv = 0; fm->dvsize = 0; } if (should_trim(fm, tsize)) sys_trim(fm, 0); goto postaction; } else if (next == fm->dv) { size_t dsize = fm->dvsize += psize; fm->dv = p; set_size_and_pinuse_of_free_chunk(p, dsize); goto postaction; } else { size_t nsize = chunksize(next); psize += nsize; unlink_chunk(fm, next, nsize); set_size_and_pinuse_of_free_chunk(p, psize); if (p == fm->dv) { fm->dvsize = psize; goto postaction; } } } else set_free_with_pinuse(p, psize, next); insert_chunk(fm, p, psize); check_free_chunk(fm, p); goto postaction; } } erroraction: USAGE_ERROR_ACTION(fm, p); postaction: POSTACTION(fm); } } #if !FOOTERS #undef fm #endif /* FOOTERS */ } void* dlcalloc(size_t n_elements, size_t elem_size) { void* mem; size_t req = 0; if (n_elements != 0) { req = n_elements * elem_size; if (((n_elements | elem_size) & ~(size_t)0xffff) && (req / n_elements != elem_size)) req = MAX_SIZE_T; /* force downstream failure on overflow */ } mem = dlmalloc(req); if (mem != 0 && calloc_must_clear(mem2chunk(mem))) memset(mem, 0, req); return mem; } void* dlrealloc(void* oldmem, size_t bytes) { if (oldmem == 0) return dlmalloc(bytes); #ifdef REALLOC_ZERO_BYTES_FREES if (bytes == 0) { dlfree(oldmem); return 0; } #endif /* REALLOC_ZERO_BYTES_FREES */ else { #if ! FOOTERS mstate m = gm; #else /* FOOTERS */ mstate m = get_mstate_for(mem2chunk(oldmem)); if (!ok_magic(m)) { USAGE_ERROR_ACTION(m, oldmem); return 0; } #endif /* FOOTERS */ return internal_realloc(m, oldmem, bytes); } } void* dlmemalign(size_t alignment, size_t bytes) { return internal_memalign(gm, alignment, bytes); } void** dlindependent_calloc(size_t n_elements, size_t elem_size, void* chunks[]) { size_t sz = elem_size; /* serves as 1-element array */ return ialloc(gm, n_elements, &sz, 3, chunks); } void** dlindependent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]) { return ialloc(gm, n_elements, sizes, 0, chunks); } void* dlvalloc(size_t bytes) { size_t pagesz; init_mparams(); pagesz = mparams.page_size; return dlmemalign(pagesz, bytes); } void* dlpvalloc(size_t bytes) { size_t pagesz; init_mparams(); pagesz = mparams.page_size; return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); } int dlmalloc_trim(size_t pad) { int result = 0; if (!PREACTION(gm)) { result = sys_trim(gm, pad); POSTACTION(gm); } return result; } size_t dlmalloc_footprint(void) { return gm->footprint; } size_t dlmalloc_max_footprint(void) { return gm->max_footprint; } #if !NO_MALLINFO struct mallinfo dlmallinfo(void) { return internal_mallinfo(gm); } #endif /* NO_MALLINFO */ void dlmalloc_stats() { internal_malloc_stats(gm); } size_t dlmalloc_usable_size(void* mem) { if (mem != 0) { mchunkptr p = mem2chunk(mem); if (cinuse(p)) return chunksize(p) - overhead_for(p); } return 0; } int dlmallopt(int param_number, int value) { return change_mparam(param_number, value); } #endif /* !ONLY_MSPACES */ /* ----------------------------- user mspaces ---------------------------- */ #if MSPACES static mstate init_user_mstate(char* tbase, size_t tsize) { size_t msize = pad_request(sizeof(struct malloc_state)); mchunkptr mn; mchunkptr msp = align_as_chunk(tbase); mstate m = (mstate)(chunk2mem(msp)); memset(m, 0, msize); INITIAL_LOCK(&m->mutex); msp->head = (msize|PINUSE_BIT|CINUSE_BIT); m->seg.base = m->least_addr = tbase; m->seg.size = m->footprint = m->max_footprint = tsize; m->magic = mparams.magic; m->mflags = mparams.default_mflags; disable_contiguous(m); init_bins(m); mn = next_chunk(mem2chunk(m)); init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); check_top_chunk(m, m->top); return m; } mspace create_mspace(size_t capacity, int locked) { mstate m = 0; size_t msize = pad_request(sizeof(struct malloc_state)); init_mparams(); /* Ensure pagesize etc initialized */ if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { size_t rs = ((capacity == 0)? mparams.granularity : (capacity + TOP_FOOT_SIZE + msize)); size_t tsize = granularity_align(rs); char* tbase = (char*)(CALL_MMAP(tsize)); if (tbase != CMFAIL) { m = init_user_mstate(tbase, tsize); m->seg.sflags = IS_MMAPPED_BIT; set_lock(m, locked); } } return (mspace)m; } mspace create_mspace_with_base(void* base, size_t capacity, int locked) { mstate m = 0; size_t msize = pad_request(sizeof(struct malloc_state)); init_mparams(); /* Ensure pagesize etc initialized */ if (capacity > msize + TOP_FOOT_SIZE && capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { m = init_user_mstate((char*)base, capacity); m->seg.sflags = EXTERN_BIT; set_lock(m, locked); } return (mspace)m; } size_t destroy_mspace(mspace msp) { size_t freed = 0; mstate ms = (mstate)msp; if (ok_magic(ms)) { msegmentptr sp = &ms->seg; while (sp != 0) { char* base = sp->base; size_t size = sp->size; flag_t flag = sp->sflags; sp = sp->next; if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) && CALL_MUNMAP(base, size) == 0) freed += size; } } else { USAGE_ERROR_ACTION(ms,ms); } return freed; } /* mspace versions of routines are near-clones of the global versions. This is not so nice but better than the alternatives. */ void* mspace_malloc(mspace msp, size_t bytes) { mstate ms = (mstate)msp; if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); return 0; } if (!PREACTION(ms)) { void* mem; size_t nb; if (bytes <= MAX_SMALL_REQUEST) { bindex_t idx; binmap_t smallbits; nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); idx = small_index(nb); smallbits = ms->smallmap >> idx; if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ mchunkptr b, p; idx += ~smallbits & 1; /* Uses next bin if idx empty */ b = smallbin_at(ms, idx); p = b->fd; assert(chunksize(p) == small_index2size(idx)); unlink_first_small_chunk(ms, b, p, idx); set_inuse_and_pinuse(ms, p, small_index2size(idx)); mem = chunk2mem(p); check_malloced_chunk(ms, mem, nb); goto postaction; } else if (nb > ms->dvsize) { if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ mchunkptr b, p, r; size_t rsize; bindex_t i; binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); binmap_t leastbit = least_bit(leftbits); compute_bit2idx(leastbit, i); b = smallbin_at(ms, i); p = b->fd; assert(chunksize(p) == small_index2size(i)); unlink_first_small_chunk(ms, b, p, i); rsize = small_index2size(i) - nb; /* Fit here cannot be remainderless if 4byte sizes */ if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) set_inuse_and_pinuse(ms, p, small_index2size(i)); else { set_size_and_pinuse_of_inuse_chunk(ms, p, nb); r = chunk_plus_offset(p, nb); set_size_and_pinuse_of_free_chunk(r, rsize); replace_dv(ms, r, rsize); } mem = chunk2mem(p); check_malloced_chunk(ms, mem, nb); goto postaction; } else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { check_malloced_chunk(ms, mem, nb); goto postaction; } } } else if (bytes >= MAX_REQUEST) nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ else { nb = pad_request(bytes); if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { check_malloced_chunk(ms, mem, nb); goto postaction; } } if (nb <= ms->dvsize) { size_t rsize = ms->dvsize - nb; mchunkptr p = ms->dv; if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ mchunkptr r = ms->dv = chunk_plus_offset(p, nb); ms->dvsize = rsize; set_size_and_pinuse_of_free_chunk(r, rsize); set_size_and_pinuse_of_inuse_chunk(ms, p, nb); } else { /* exhaust dv */ size_t dvs = ms->dvsize; ms->dvsize = 0; ms->dv = 0; set_inuse_and_pinuse(ms, p, dvs); } mem = chunk2mem(p); check_malloced_chunk(ms, mem, nb); goto postaction; } else if (nb < ms->topsize) { /* Split top */ size_t rsize = ms->topsize -= nb; mchunkptr p = ms->top; mchunkptr r = ms->top = chunk_plus_offset(p, nb); r->head = rsize | PINUSE_BIT; set_size_and_pinuse_of_inuse_chunk(ms, p, nb); mem = chunk2mem(p); check_top_chunk(ms, ms->top); check_malloced_chunk(ms, mem, nb); goto postaction; } mem = sys_alloc(ms, nb); postaction: POSTACTION(ms); return mem; } return 0; } void mspace_free(mspace msp, void* mem) { if (mem != 0) { mchunkptr p = mem2chunk(mem); #if FOOTERS mstate fm = get_mstate_for(p); #else /* FOOTERS */ mstate fm = (mstate)msp; #endif /* FOOTERS */ if (!ok_magic(fm)) { USAGE_ERROR_ACTION(fm, p); return; } if (!PREACTION(fm)) { check_inuse_chunk(fm, p); if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { size_t psize = chunksize(p); mchunkptr next = chunk_plus_offset(p, psize); if (!pinuse(p)) { size_t prevsize = p->prev_foot; if ((prevsize & IS_MMAPPED_BIT) != 0) { prevsize &= ~IS_MMAPPED_BIT; psize += prevsize + MMAP_FOOT_PAD; if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) fm->footprint -= psize; goto postaction; } else { mchunkptr prev = chunk_minus_offset(p, prevsize); psize += prevsize; p = prev; if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ if (p != fm->dv) { unlink_chunk(fm, p, prevsize); } else if ((next->head & INUSE_BITS) == INUSE_BITS) { fm->dvsize = psize; set_free_with_pinuse(p, psize, next); goto postaction; } } else goto erroraction; } } if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { if (!cinuse(next)) { /* consolidate forward */ if (next == fm->top) { size_t tsize = fm->topsize += psize; fm->top = p; p->head = tsize | PINUSE_BIT; if (p == fm->dv) { fm->dv = 0; fm->dvsize = 0; } if (should_trim(fm, tsize)) sys_trim(fm, 0); goto postaction; } else if (next == fm->dv) { size_t dsize = fm->dvsize += psize; fm->dv = p; set_size_and_pinuse_of_free_chunk(p, dsize); goto postaction; } else { size_t nsize = chunksize(next); psize += nsize; unlink_chunk(fm, next, nsize); set_size_and_pinuse_of_free_chunk(p, psize); if (p == fm->dv) { fm->dvsize = psize; goto postaction; } } } else set_free_with_pinuse(p, psize, next); insert_chunk(fm, p, psize); check_free_chunk(fm, p); goto postaction; } } erroraction: USAGE_ERROR_ACTION(fm, p); postaction: POSTACTION(fm); } } } void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { void* mem; size_t req = 0; mstate ms = (mstate)msp; if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); return 0; } if (n_elements != 0) { req = n_elements * elem_size; if (((n_elements | elem_size) & ~(size_t)0xffff) && (req / n_elements != elem_size)) req = MAX_SIZE_T; /* force downstream failure on overflow */ } mem = internal_malloc(ms, req); if (mem != 0 && calloc_must_clear(mem2chunk(mem))) memset(mem, 0, req); return mem; } void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) { if (oldmem == 0) return mspace_malloc(msp, bytes); #ifdef REALLOC_ZERO_BYTES_FREES if (bytes == 0) { mspace_free(msp, oldmem); return 0; } #endif /* REALLOC_ZERO_BYTES_FREES */ else { #if FOOTERS mchunkptr p = mem2chunk(oldmem); mstate ms = get_mstate_for(p); #else /* FOOTERS */ mstate ms = (mstate)msp; #endif /* FOOTERS */ if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); return 0; } return internal_realloc(ms, oldmem, bytes); } } void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) { mstate ms = (mstate)msp; if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); return 0; } return internal_memalign(ms, alignment, bytes); } void** mspace_independent_calloc(mspace msp, size_t n_elements, size_t elem_size, void* chunks[]) { size_t sz = elem_size; /* serves as 1-element array */ mstate ms = (mstate)msp; if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); return 0; } return ialloc(ms, n_elements, &sz, 3, chunks); } void** mspace_independent_comalloc(mspace msp, size_t n_elements, size_t sizes[], void* chunks[]) { mstate ms = (mstate)msp; if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); return 0; } return ialloc(ms, n_elements, sizes, 0, chunks); } int mspace_trim(mspace msp, size_t pad) { int result = 0; mstate ms = (mstate)msp; if (ok_magic(ms)) { if (!PREACTION(ms)) { result = sys_trim(ms, pad); POSTACTION(ms); } } else { USAGE_ERROR_ACTION(ms,ms); } return result; } void mspace_malloc_stats(mspace msp) { mstate ms = (mstate)msp; if (ok_magic(ms)) { internal_malloc_stats(ms); } else { USAGE_ERROR_ACTION(ms,ms); } } size_t mspace_footprint(mspace msp) { size_t result; mstate ms = (mstate)msp; if (ok_magic(ms)) { result = ms->footprint; } USAGE_ERROR_ACTION(ms,ms); return result; } size_t mspace_max_footprint(mspace msp) { size_t result; mstate ms = (mstate)msp; if (ok_magic(ms)) { result = ms->max_footprint; } USAGE_ERROR_ACTION(ms,ms); return result; } #if !NO_MALLINFO struct mallinfo mspace_mallinfo(mspace msp) { mstate ms = (mstate)msp; if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); } return internal_mallinfo(ms); } #endif /* NO_MALLINFO */ int mspace_mallopt(int param_number, int value) { return change_mparam(param_number, value); } #endif /* MSPACES */ /* -------------------- Alternative MORECORE functions ------------------- */ /* Guidelines for creating a custom version of MORECORE: * For best performance, MORECORE should allocate in multiples of pagesize. * MORECORE may allocate more memory than requested. (Or even less, but this will usually result in a malloc failure.) * MORECORE must not allocate memory when given argument zero, but instead return one past the end address of memory from previous nonzero call. * For best performance, consecutive calls to MORECORE with positive arguments should return increasing addresses, indicating that space has been contiguously extended. * Even though consecutive calls to MORECORE need not return contiguous addresses, it must be OK for malloc'ed chunks to span multiple regions in those cases where they do happen to be contiguous. * MORECORE need not handle negative arguments -- it may instead just return MFAIL when given negative arguments. Negative arguments are always multiples of pagesize. MORECORE must not misinterpret negative args as large positive unsigned args. You can suppress all such calls from even occurring by defining MORECORE_CANNOT_TRIM, As an example alternative MORECORE, here is a custom allocator kindly contributed for pre-OSX macOS. It uses virtually but not necessarily physically contiguous non-paged memory (locked in, present and won't get swapped out). You can use it by uncommenting this section, adding some #includes, and setting up the appropriate defines above: #define MORECORE osMoreCore There is also a shutdown routine that should somehow be called for cleanup upon program exit. #define MAX_POOL_ENTRIES 100 #define MINIMUM_MORECORE_SIZE (64 * 1024U) static int next_os_pool; void *our_os_pools[MAX_POOL_ENTRIES]; void *osMoreCore(int size) { void *ptr = 0; static void *sbrk_top = 0; if (size > 0) { if (size < MINIMUM_MORECORE_SIZE) size = MINIMUM_MORECORE_SIZE; if (CurrentExecutionLevel() == kTaskLevel) ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); if (ptr == 0) { return (void *) MFAIL; } // save ptrs so they can be freed during cleanup our_os_pools[next_os_pool] = ptr; next_os_pool++; ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); sbrk_top = (char *) ptr + size; return ptr; } else if (size < 0) { // we don't currently support shrink behavior return (void *) MFAIL; } else { return sbrk_top; } } // cleanup any allocated memory pools // called as last thing before shutting down driver void osCleanupMem(void) { void **ptr; for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) if (*ptr) { PoolDeallocate(*ptr); *ptr = 0; } } */ /* ----------------------------------------------------------------------- History: V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) * Add max_footprint functions * Ensure all appropriate literals are size_t * Fix conditional compilation problem for some #define settings * Avoid concatenating segments with the one provided in create_mspace_with_base * Rename some variables to avoid compiler shadowing warnings * Use explicit lock initialization. * Better handling of sbrk interference. * Simplify and fix segment insertion, trimming and mspace_destroy * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x * Thanks especially to Dennis Flanagan for help on these. V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) * Fix memalign brace error. V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) * Fix improper #endif nesting in C++ * Add explicit casts needed for C++ V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) * Use trees for large bins * Support mspaces * Use segments to unify sbrk-based and mmap-based system allocation, removing need for emulation on most platforms without sbrk. * Default safety checks * Optional footer checks. Thanks to William Robertson for the idea. * Internal code refactoring * Incorporate suggestions and platform-specific changes. Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, Aaron Bachmann, Emery Berger, and others. * Speed up non-fastbin processing enough to remove fastbins. * Remove useless cfree() to avoid conflicts with other apps. * Remove internal memcpy, memset. Compilers handle builtins better. * Remove some options that no one ever used and rename others. V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) * Fix malloc_state bitmap array misdeclaration V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) * Allow tuning of FIRST_SORTED_BIN_SIZE * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. * Better detection and support for non-contiguousness of MORECORE. Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger * Bypass most of malloc if no frees. Thanks To Emery Berger. * Fix freeing of old top non-contiguous chunk im sysmalloc. * Raised default trim and map thresholds to 256K. * Fix mmap-related #defines. Thanks to Lubos Lunak. * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. * Branch-free bin calculation * Default trim and mmap thresholds now 256K. V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) * Introduce independent_comalloc and independent_calloc. Thanks to Michael Pachos for motivation and help. * Make optional .h file available * Allow > 2GB requests on 32bit systems. * new WIN32 sbrk, mmap, munmap, lock code from . Thanks also to Andreas Mueller , and Anonymous. * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for helping test this.) * memalign: check alignment arg * realloc: don't try to shift chunks backwards, since this leads to more fragmentation in some programs and doesn't seem to help in any others. * Collect all cases in malloc requiring system memory into sysmalloc * Use mmap as backup to sbrk * Place all internal state in malloc_state * Introduce fastbins (although similar to 2.5.1) * Many minor tunings and cosmetic improvements * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS Thanks to Tony E. Bennett and others. * Include errno.h to support default failure action. V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) * return null for negative arguments * Added Several WIN32 cleanups from Martin C. Fong * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' (e.g. WIN32 platforms) * Cleanup header file inclusion for WIN32 platforms * Cleanup code to avoid Microsoft Visual C++ compiler complaints * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing memory allocation routines * Set 'malloc_getpagesize' for WIN32 platforms (needs more work) * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to usage of 'assert' in non-WIN32 code * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to avoid infinite loop * Always call 'fREe()' rather than 'free()' V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) * Fixed ordering problem with boundary-stamping V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) * Added pvalloc, as recommended by H.J. Liu * Added 64bit pointer support mainly from Wolfram Gloger * Added anonymously donated WIN32 sbrk emulation * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen * malloc_extend_top: fix mask error that caused wastage after foreign sbrks * Add linux mremap support code from HJ Liu V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) * Integrated most documentation with the code. * Add support for mmap, with help from Wolfram Gloger (Gloger@lrz.uni-muenchen.de). * Use last_remainder in more cases. * Pack bins using idea from colin@nyx10.cs.du.edu * Use ordered bins instead of best-fit threshhold * Eliminate block-local decls to simplify tracing and debugging. * Support another case of realloc via move into top * Fix error occuring when initial sbrk_base not word-aligned. * Rely on page size for units instead of SBRK_UNIT to avoid surprises about sbrk alignment conventions. * Add mallinfo, mallopt. Thanks to Raymond Nijssen (raymond@es.ele.tue.nl) for the suggestion. * Add `pad' argument to malloc_trim and top_pad mallopt parameter. * More precautions for cases where other routines call sbrk, courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). * Added macros etc., allowing use in linux libc from H.J. Lu (hjl@gnu.ai.mit.edu) * Inverted this history list V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) * Re-tuned and fixed to behave more nicely with V2.6.0 changes. * Removed all preallocation code since under current scheme the work required to undo bad preallocations exceeds the work saved in good cases for most test programs. * No longer use return list or unconsolidated bins since no scheme using them consistently outperforms those that don't given above changes. * Use best fit for very large chunks to prevent some worst-cases. * Added some support for debugging V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) * Removed footers when chunks are in use. Thanks to Paul Wilson (wilson@cs.texas.edu) for the suggestion. V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) * Added malloc_trim, with help from Wolfram Gloger (wmglo@Dent.MED.Uni-Muenchen.DE). V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) * realloc: try to expand in both directions * malloc: swap order of clean-bin strategy; * realloc: only conditionally expand backwards * Try not to scavenge used bins * Use bin counts as a guide to preallocation * Occasionally bin return list chunks in first scan * Add a few optimizations from colin@nyx10.cs.du.edu V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) * faster bin computation & slightly different binning * merged all consolidations to one part of malloc proper (eliminating old malloc_find_space & malloc_clean_bin) * Scan 2 returns chunks (not just 1) * Propagate failure in realloc if malloc returns 0 * Add stuff to allow compilation on non-ANSI compilers from kpv@research.att.com V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) * removed potential for odd address access in prev_chunk * removed dependency on getpagesize.h * misc cosmetics and a bit more internal documentation * anticosmetics: mangled names in macros to evade debugger strangeness * tested on sparc, hp-700, dec-mips, rs6000 with gcc & native cc (hp, dec only) allowing Detlefs & Zorn comparison study (in SIGPLAN Notices.) Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) * Based loosely on libg++-1.2X malloc. (It retains some of the overall structure of old version, but most details differ.) */ ./gprolog-1.3.0/src/EnginePl/if_no_fd.h0000644004425400513100000000624410547154141016205 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : if_no_fd.h * * Descr.: FD interface for Prolog engine - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: if_no_fd.h,v 1.10 2007/01/04 10:35:13 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef IF_NO_FD_FILE void (*fd_init_solver) (); /* overwritten by FD if present */ void (*fd_reset_solver) (); Bool (*fd_unify_with_integer) (); Bool (*fd_unify_with_fd_var) (); int (*fd_variable_size) (); int (*fd_copy_variable) (); char *(*fd_variable_to_string) (); #else extern void (*fd_init_solver) (); extern void (*fd_reset_solver) (); extern Bool (*fd_unify_with_integer) (); extern Bool (*fd_unify_with_fd_var) (); extern int (*fd_variable_size) (); extern int (*fd_copy_variable) (); extern char *(*fd_variable_to_string) (); #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Fd_Init_Solver(void); void Fd_Reset_Solver(void); #define Fd_Unify_With_Integer(f, n) ((*fd_unify_with_integer)(f, n)) #define Fd_Unify_With_Fd_Var(f1, f2)((*fd_unify_with_fd_var)(f1, f2)) #define Fd_Variable_Size(f) ((*fd_variable_size)(f)) #define Fd_Copy_Variable(dst_adr, f)((*fd_copy_variable)(dst_adr, f)) #define Fd_Variable_To_String(f) ((*fd_variable_to_string)(f)) ./gprolog-1.3.0/src/EnginePl/unify.c0000644004425400513100000001422310547154141015563 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : unify.c * * Descr.: unification part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: unify.c,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ static Bool Check_If_Var_Occurs(WamWord *var_adr, WamWord term_word); /*-------------------------------------------------------------------------* * This file is not compiled separately but included twice by wam_inst.c: * * - to define the Unify function (classical unification). * * - to define the Unify_Occurs_Check function (+ occurs check). * *-------------------------------------------------------------------------*/ Bool FC UNIFY_FCT_NAME(WamWord start_u_word, WamWord start_v_word) { WamWord u_word, u_tag_mask; WamWord v_word, v_tag_mask; WamWord *u_adr, *v_adr; int i; terminal_rec: DEREF(start_u_word, u_word, u_tag_mask); DEREF(start_v_word, v_word, v_tag_mask); if (u_tag_mask == TAG_REF_MASK) { u_adr = UnTag_REF(u_word); if (v_tag_mask == TAG_REF_MASK) { v_adr = UnTag_REF(v_word); if (u_adr > v_adr) Bind_UV(u_adr, Tag_REF(v_adr)); else if (v_adr > u_adr) Bind_UV(v_adr, Tag_REF(u_adr)); } else { #ifdef OCCURS_CHECK if (!Is_A_Local_Adr(u_adr) && /* no binding from heap to local */ Check_If_Var_Occurs(u_adr, v_word)) return FALSE; #endif Do_Copy_Of_Word(v_tag_mask, v_word); Bind_UV(u_adr, v_word); } return TRUE; } if (v_tag_mask == TAG_REF_MASK) { v_adr = UnTag_REF(v_word); #ifdef OCCURS_CHECK if (!Is_A_Local_Adr(v_adr) && /* no binding from heap to local */ Check_If_Var_Occurs(v_adr, u_word)) return FALSE; #endif Do_Copy_Of_Word(u_tag_mask, u_word); Bind_UV(v_adr, u_word); return TRUE; } if (u_word == v_word) return TRUE; if (v_tag_mask == TAG_LST_MASK) { if (u_tag_mask != v_tag_mask) return FALSE; u_adr = UnTag_LST(u_word); v_adr = UnTag_LST(v_word); u_adr = &Car(u_adr); v_adr = &Car(v_adr); if (!UNIFY_FCT_NAME(*u_adr++, *v_adr++)) return FALSE; start_u_word = *u_adr; start_v_word = *v_adr; goto terminal_rec; } if (v_tag_mask == TAG_STC_MASK) { if (u_tag_mask != v_tag_mask) return FALSE; u_adr = UnTag_STC(u_word); v_adr = UnTag_STC(v_word); if (Functor_And_Arity(u_adr) != Functor_And_Arity(v_adr)) return FALSE; i = Arity(u_adr); u_adr = &Arg(u_adr, 0); v_adr = &Arg(v_adr, 0); while (--i) if (!UNIFY_FCT_NAME(*u_adr++, *v_adr++)) return FALSE; start_u_word = *u_adr; start_v_word = *v_adr; goto terminal_rec; } #ifndef NO_USE_FD_SOLVER if (v_tag_mask == TAG_INT_MASK && u_tag_mask == TAG_FDV_MASK) return Fd_Unify_With_Integer(UnTag_FDV(u_word), UnTag_INT(v_word)); if (v_tag_mask == TAG_FDV_MASK) { v_adr = UnTag_FDV(v_word); if (u_tag_mask == TAG_INT_MASK) return Fd_Unify_With_Integer(v_adr, UnTag_INT(u_word)); if (u_tag_mask != v_tag_mask) /* i.e. TAG_FDV_MASK */ return FALSE; return Fd_Unify_With_Fd_Var(UnTag_FDV(u_word), v_adr); } #endif if (v_tag_mask == TAG_FLT_MASK) return (u_tag_mask == v_tag_mask && Obtain_Float(UnTag_FLT(u_word)) == Obtain_Float(UnTag_FLT(v_word))); return FALSE; } #ifdef OCCURS_CHECK /*-------------------------------------------------------------------------* * CHECK_IF_VAR_OCCURS * * * * Only called if var_adr resides in the heap since a var residing in the * * local stack cannot appear in a term (there is no binding from the heap * * to the local stack in the WAM). * *-------------------------------------------------------------------------*/ static Bool Check_If_Var_Occurs(WamWord *var_adr, WamWord term_word) { WamWord word, tag_mask; WamWord *adr; int i; terminal_rec: DEREF(term_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) return UnTag_REF(word) == var_adr; if (tag_mask == TAG_LST_MASK) { adr = UnTag_LST(word); adr = &Car(adr); if (Check_If_Var_Occurs(var_adr, *adr++)) return TRUE; term_word = *adr; goto terminal_rec; } if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(word); i = Arity(adr); adr = &Arg(adr, 0); while (--i) if (Check_If_Var_Occurs(var_adr, *adr++)) return TRUE; term_word = *adr; goto terminal_rec; } return FALSE; } #endif ./gprolog-1.3.0/src/EnginePl/engine.h0000644004425400513100000000663110547154141015707 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : engine.h * * Descr.: general engine - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: engine.h,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ #ifdef NO_STACK_TEST # undef M_Check_Stacks() # define M_Check_Stacks() #endif /*---------------------------------* * Constants * *---------------------------------*/ #define cpp_recurs(p, n) p##_##n #define Prolog_Predicate(p, n) cpp_recurs(p, n) #define Prolog_Prototype(p, n) void Prolog_Predicate(p, n)() /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef ENGINE_FILE int os_argc; char **os_argv; char glob_buff[10240]; long *base_fl; /* overwritten by foreign if present */ double *base_fd; /* overwritten by foreign if present */ int use_gui; #else extern int os_argc; extern char **os_argv; extern char glob_buff[]; extern long *base_fl; extern double *base_fd; extern int use_gui; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ int Start_Prolog(int argc, char *argv[]); void Stop_Prolog(void); void Reset_Prolog(void); void Reset_Prolog_In_Signal(void); void Set_Heap_Actual_Start(WamWord *heap_actual_start); void Execute_Directive(int pl_file, int pl_line, Bool is_system, CodePtr proc); Bool Try_Execute_Top_Level(void); Bool Call_Prolog(CodePtr codep); Bool Call_Prolog_Next_Sol(WamWord *query_b); void Keep_Rest_For_Prolog(WamWord *query_b); void Exit_With_Exception(void); void Execute_A_Continuation(CodePtr codep); #define Goto_Predicate(p, n) ((*Prolog_Predicate(p, n))()) ./gprolog-1.3.0/src/EnginePl/hash.c0000644004425400513100000003613710547154141015364 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : hash.c * * Descr.: hash table management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: hash.c,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ #include #include #include #if 0 #define USE_ALONE #endif #ifdef USE_ALONE #include "hash.h" #define Malloc(size) malloc(size) #define Calloc(nb, size) calloc(nb, size) #define Realloc(ptr, size) realloc(ptr, size) #define Free(ptr) free(ptr) #else #include "engine_pl.h" #endif /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct hash_node *HashNode; struct hash_node { HashNode next; long key; /* the rest of the elem comes here */ }; /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static HashNode *Hash_Locate(HashNode *t, int tbl_size, long key); #define HASH_STATIC_SIZE 3 #define Tbl_Size(t) (((int *)(t))[0]) #define Elem_Size(t) (((int *)(t))[1]) #define Nb_Elem(t) (((int *)(t))[2]) #define Hsh_Table(t) (((HashNode *) (t)) + HASH_STATIC_SIZE) #define Hash_Function(k, size) ((unsigned long) (k) % (size)) /*-------------------------------------------------------------------------* * A hash table consists of a header (tbl_size, elem_size, nb_elem) and a * * table of tbl_size pointers to nodes. * * Each node records a pointer to the next node, and a user element whose * * size is elem_size. Each element must begin with the key (a long). * *-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------* * HASH_ALLOC_TABLE * * * *-------------------------------------------------------------------------*/ char * Hash_Alloc_Table(int tbl_size, int elem_size) { char *tbl; tbl = (char *) Calloc(HASH_STATIC_SIZE + tbl_size, sizeof(HashNode)); #ifdef USE_ALONE if (tbl == NULL) return NULL; #endif if (tbl_size < 1) tbl_size = 1; /* at least one cell in a table */ Tbl_Size(tbl) = tbl_size; Elem_Size(tbl) = elem_size; Nb_Elem(tbl) = 0; return tbl; } /*-------------------------------------------------------------------------* * HASH_REALLOC_TABLE * * * * NB: user information is not moved elsewhere * *-------------------------------------------------------------------------*/ char * Hash_Realloc_Table(char *tbl, int new_tbl_size) { int tbl_size = Tbl_Size(tbl); int elem_size = Elem_Size(tbl); HashNode *t = Hsh_Table(tbl); HashNode *endt = t + tbl_size; HashNode p, p1; HashNode *prev; char *new_tbl; HashNode *new_t; if ((new_tbl = Hash_Alloc_Table(new_tbl_size, elem_size)) == NULL) return NULL; Nb_Elem(new_tbl) = Nb_Elem(tbl); new_t = Hsh_Table(new_tbl); do { p = *t; while (p) { /* here *prev==NULL */ prev = Hash_Locate(new_t, new_tbl_size, p->key); p1 = p; p = p->next; *prev = p1; p1->next = NULL; } } while (++t < endt); Free(tbl); return new_tbl; } /*-------------------------------------------------------------------------* * HASH_FREE_TABLE * * * *-------------------------------------------------------------------------*/ void Hash_Free_Table(char *tbl) { int tbl_size = Tbl_Size(tbl); HashNode *t = Hsh_Table(tbl); HashNode *endt = t + tbl_size; HashNode p, p1; do { p = *t; while (p) { p1 = p; p = p->next; Free(p1); } } while (++t < endt); Free(tbl); } /*-------------------------------------------------------------------------* * HASH_DELETE_ALL * * * *-------------------------------------------------------------------------*/ void Hash_Delete_All(char *tbl) { int tbl_size = Tbl_Size(tbl); HashNode *t = Hsh_Table(tbl); HashNode *endt = t + tbl_size; HashNode p, p1; do { p = *t; while (p) { p1 = p; p = p->next; Free(p1); } *t = NULL; } while (++t < endt); Nb_Elem(tbl) = 0; } /*-------------------------------------------------------------------------* * HASH_UPDATE * * * *-------------------------------------------------------------------------*/ char * Hash_Insert(char *tbl, char *elem, int replace) { int tbl_size = Tbl_Size(tbl); int elem_size = Elem_Size(tbl); HashNode *t = Hsh_Table(tbl); long key = *(long *) elem; HashNode *prev; HashNode p; prev = Hash_Locate(t, tbl_size, key); p = *prev; if (p == NULL) /* the key does not exist */ { p = (HashNode) Malloc(sizeof(struct hash_node) - sizeof(long) + elem_size); #ifdef USE_ALONE if (p == NULL) return NULL; #endif p->next = NULL; Nb_Elem(tbl)++; *prev = p; } else if (!replace) goto finish; memcpy((char *) (&(p->key)), elem, elem_size); finish: return (char *) (&(p->key)); } /*-------------------------------------------------------------------------* * HASH_FIND * * * *-------------------------------------------------------------------------*/ char * Hash_Find(char *tbl, long key) { int tbl_size = Tbl_Size(tbl); HashNode *t = Hsh_Table(tbl); HashNode *prev; HashNode p; prev = Hash_Locate(t, tbl_size, key); p = *prev; if (p == NULL) /* the key does not exist */ return NULL; return (char *) (&(p->key)); } /*-------------------------------------------------------------------------* * HASH_DELETE * * * *-------------------------------------------------------------------------*/ char * Hash_Delete(char *tbl, long key) { int tbl_size = Tbl_Size(tbl); HashNode *t = Hsh_Table(tbl); HashNode *prev; HashNode p; prev = Hash_Locate(t, tbl_size, key); p = *prev; if (p == NULL) /* the key does not exist */ return NULL; *prev = p->next; Free(p); Nb_Elem(tbl)--; return tbl; } /*-------------------------------------------------------------------------* * HASH_LOCATE * * * * This function returns the address of the pointer to the node associated * * to the key (if the pointer is NULL the key is not in the table). * *-------------------------------------------------------------------------*/ static HashNode * Hash_Locate(HashNode *t, int tbl_size, long key) { int n = Hash_Function(key, tbl_size); HashNode p; t += n; for (p = *t; p; p = p->next) { if (p->key == key) break; t = &p->next; } return t; } /*-------------------------------------------------------------------------* * HASH_FIRST * * * * Hash_First and Hash_Next make it possible to scan a hash table. * * Example of use: * * * * HashScan scan; * * char *buff_ptr; * * * * for(buff_ptr=Hash_First(tbl,&scan);buff_ptr;buff_ptr=Hash_Next(&scan))* * Display_Element(buff_ptr); * *-------------------------------------------------------------------------*/ char * Hash_First(char *tbl, HashScan *scan) { int tbl_size = Tbl_Size(tbl); HashNode *t = Hsh_Table(tbl); HashNode *endt = t + tbl_size; scan->endt = (char *) endt; scan->cur_t = (char *) t; scan->cur_p = (char *) (*t); return Hash_Next(scan); } /*-------------------------------------------------------------------------* * HASH_NEXT * * * *-------------------------------------------------------------------------*/ char * Hash_Next(HashScan *scan) { HashNode *t; HashNode *endt; HashNode p; p = (HashNode) (scan->cur_p); if (p) { scan->cur_p = (char *) (p->next); return (char *) (&(p->key)); } t = (HashNode *) (scan->cur_t); endt = (HashNode *) (scan->endt); while (++t < endt) { p = *t; if (p) { scan->cur_t = (char *) t; scan->cur_p = (char *) (p->next); return (char *) (&(p->key)); } } return NULL; } /*-------------------------------------------------------------------------* * HASH_TABLE_SIZE * * * *-------------------------------------------------------------------------*/ int Hash_Table_Size(char *tbl) { return Tbl_Size(tbl); } /*-------------------------------------------------------------------------* * HASH_NB_ELEMENTS * * * *-------------------------------------------------------------------------*/ int Hash_Nb_Elements(char *tbl) { return Nb_Elem(tbl); } #ifdef USE_ALONE /*-------------------------------------------------------------------------* * HASH_CHECK_TABLE * * * *-------------------------------------------------------------------------*/ void Hash_Check_Table(char *tbl) { int tbl_size = Tbl_Size(tbl); HashNode *t = Hsh_Table(tbl); HashNode *endt = t + tbl_size; HashNode p; int i = 0; do { printf("Hash Code:%d\n", t - Hsh_Table(tbl)); for (p = *t; p; p = p->next, i++) printf("\tadr:%#x key:%ld\n", (int) p, p->key); } while (++t < endt); if (i != Nb_Elem(tbl)) printf("Nb_Elem counter erroneous = %d insted of %d\n", Nb_Elem(tbl), i); } typedef struct { long key; int info1; int info2; } Elem; /*-------------------------------------------------------------------------* * MAIN * * * * to compile alone active USE_ALONE and simply compile this file. * *-------------------------------------------------------------------------*/ int main(void) { char *t; int size; long key; Elem elem, *p; HashScan scan; int c; int i = -1; int k; setbuf(stdout, NULL); printf("initial size: "); scanf("%d", &size); getchar(); t = Hash_Alloc_Table(size, sizeof(Elem)); if (t == NULL) printf("Cannot allocate the table\n"); for (;;) { printf ("\n1-Add/No Replace 2-Add/Replace 3-Find 4-Delete 5-DeleteAll\n"); printf("6-Scan Table 7-Exend Table 8-Check Integrity 9-End:"); scanf("%d", &c); getchar(); if (c == 9) break; if (c <= 4) { printf("Key:"); scanf("%ld", &key); getchar(); elem.key = key; } i = -i; switch (c) { case 1: case 2: elem.info1 = key * i * 10; elem.info2 = key * i * 100; printf("passed value: Key:%ld Info1:%d Info2:%d\n", elem.key, elem.info1, elem.info2); p = (Elem *) Hash_Insert(t, (char *) &elem, c - 1); break; break; case 3: p = (Elem *) Hash_Find(t, key); break; case 4: p = (Elem *) Hash_Delete(t, key); break; case 5: Hash_Delete_All(t); break; case 6: k = 0; for (p = (Elem *) Hash_First(t, &scan); p; p = (Elem *) Hash_Next(&scan)) { printf("adr: %#lx (Key:%ld Info1:%d Info2:%d)\n", (long) p, p->key, p->info1, p->info2); k++; } if (k != Hash_Nb_Elements(t)) printf("# displayed elements: %d <> %d\n", k, Hash_Nb_Elements(t)); break; case 7: printf("new size: "); scanf("%d", &size); getchar(); t = Hash_Realloc_Table(t, size); if (t == NULL) printf("Cannot extend the table\n"); break; case 8: Hash_Check_Table(t); break; } if (c < 5) { if (p == NULL) printf("returned value: NULL\n"); else printf("returned value: %#lx (Key:%ld Info1:%d Info2:%d)\n", (long) p, p->key, p->info1, p->info2); } printf("Nb Elements:%d\n", Hash_Nb_Elements(t)); } return 0; } #endif /* USE_ALONE */ ./gprolog-1.3.0/src/EnginePl/obj_chain.h0000644004425400513100000000571310547154141016356 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : obj_chain.h * * Descr.: object chaining management - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: obj_chain.h,v 1.12 2007/01/04 10:35:13 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Find_Linked_Objects(void); void New_Object(void (*fct_obj_init)(), void (*fct_exec_system) (), void (*fct_exec_user) ()); #ifdef OBJ_INIT static void OBJ_INIT(void); #define CPP_CAT1(x, y) x ## y #define CPP_CAT(x, y) CPP_CAT1(x, y) #define OBJ_CTOR CPP_CAT(OBJ_INIT,_ctor) #ifdef __GNUC__ static void __attribute__ ((constructor)) OBJ_CTOR(void) { New_Object(OBJ_INIT, NULL, NULL); } #else /* _MSC_VER */ static void OBJ_CTOR(void) { New_Object(OBJ_INIT, NULL, NULL); } #pragma data_seg(".GPLC$m") static long obj_chain_start = (long) OBJ_CTOR; #pragma data_seg() #endif /* _MSC_VER */ #endif /* OBJ_INIT */ #if defined(_MSC_VER) || defined(M_ix86_darwin) #define OBJ_CHAIN_REVERSE_ORDER #endif ./gprolog-1.3.0/src/EnginePl/engine.c0000644004425400513100000003632410547154141015704 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : engine.c * * Descr.: general engine * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: engine.c,v 1.16 2007/01/04 10:35:13 diaz Exp $ */ #include #include #include #include #include #include "gp_config.h" #if defined(_WIN32) || defined(__CYGWIN__) #include #endif #define ENGINE_FILE #include "engine_pl.h" #ifndef NO_USE_LINEDIT #include "../Linedit/linedit.h" #endif /*---------------------------------* * Constants * *---------------------------------*/ #define ERR_DIRECTIVE_FAILED "warning: %s:%d: %s directive failed\n" /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ void (*init_stream_supp)(); /* overwritten by foreign if present */ #if !defined(NO_USE_REGS) && NB_OF_USED_MACHINE_REGS > 0 static WamWord init_buff_regs[NB_OF_USED_MACHINE_REGS]; #endif static WamWord *heap_actual_start; static int nb_user_directives = 0; static jmp_buf *p_jumper; static WamWord *p_buff_save; static CodePtr cont_jmp; /* we use a global var to support DEC alpha */ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Call_Prolog_Fail(void); static void Call_Prolog_Success(void); static Bool Call_Next(CodePtr codep); void Call_Compiled(CodePtr codep); /* defined in engine1.c */ /*-------------------------------------------------------------------------* * START_PROLOG * * * *-------------------------------------------------------------------------*/ int Start_Prolog(int argc, char *argv[]) { int i, x; char *p; setlocale(LC_ALL, ""); setlocale(LC_NUMERIC, "C"); /* make sure floats come out right... */ Init_Machine(); os_argc = argc; os_argv = argv; Set_Line_Buf(stdout); Set_Line_Buf(stderr); for (i = 0; i < NB_OF_STACKS; i++) { if (fd_init_solver == NULL && strcmp(stk_tbl[i].name, "cstr") == 0) { /* FD solver not linked */ stk_tbl[i].size = 0; continue; } if ((stk_tbl[i].size = KBytes_To_Wam_Words(*(stk_tbl[i].p_def_size))) == 0) stk_tbl[i].size = stk_tbl[i].default_size; if (!fixed_sizes && *stk_tbl[i].env_var_name) { p = (char *) getenv(stk_tbl[i].env_var_name); if (p && *p) { sscanf(p, "%d", &x); stk_tbl[i].size = KBytes_To_Wam_Words(x); } } } M_Allocate_Stacks(); Save_Machine_Regs(init_buff_regs); #ifndef NO_MACHINE_REG_FOR_REG_BANK Init_Reg_Bank(Global_Stack); /* allocated X regs + other non alloc regs */ Global_Stack += REG_BANK_SIZE; /* at the beginning of the heap */ Global_Size -= REG_BANK_SIZE; #endif /* must be changed to store global info (see the debugger) */ heap_actual_start = Global_Stack; Init_Atom(); Init_Pred(); Init_Oper(); #ifndef NO_USE_LINEDIT if (le_initialize != NULL) use_gui = (*le_initialize)(); else #endif use_gui = 0; if (init_stream_supp) (*init_stream_supp)(); Reset_Prolog(); Fd_Init_Solver(); Find_Linked_Objects(); return nb_user_directives; } /*-------------------------------------------------------------------------* * STOP_PROLOG * * * *-------------------------------------------------------------------------*/ void Stop_Prolog(void) { #ifdef DEREF_STATS double d = (double) chain_len / (double) nb_deref; fprintf(stderr, "Deref: nb: %ld avg len = %g\n", nb_deref, d); #endif Restore_Machine_Regs(init_buff_regs); } /*-------------------------------------------------------------------------* * RESET_PROLOG * * * * Reset top stack pointers and create first choice point (for Call_Prolog)* *-------------------------------------------------------------------------*/ void Reset_Prolog(void) { E = B = LSSA = Local_Stack; H = heap_actual_start; /* restart after needed global terms */ TR = Trail_Stack; CP = NULL; STAMP = 0; CS = Cstr_Stack; BCI = 0; /* BCI only needed for byte-code (cf. bips prolog) */ Create_Choice_Point(Call_Prolog_Fail, 0); /* 1st choice point */ Fd_Reset_Solver(); } /*-------------------------------------------------------------------------* * RESET_PROLOG_IN_SIGNAL * * * *-------------------------------------------------------------------------*/ void Reset_Prolog_In_Signal(void) { Restore_Protect_Regs_For_Signal; } /*-------------------------------------------------------------------------* * SET_HEAP_ACTUAL_START * * * * Called to store permanent terms (cf. debugger). * *-------------------------------------------------------------------------*/ void Set_Heap_Actual_Start(WamWord *new_heap_actual_start) { heap_actual_start = new_heap_actual_start; } /*-------------------------------------------------------------------------* * EXECUTE_DIRECTIVE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void Execute_Directive(int pl_file, int pl_line, Bool is_system, CodePtr proc) { Reset_Prolog(); if (!is_system) nb_user_directives++; if (!Call_Prolog(proc)) fprintf(stderr, ERR_DIRECTIVE_FAILED, atom_tbl[pl_file].name, pl_line, (is_system) ? "system" : "user"); Reset_Prolog(); } /*-------------------------------------------------------------------------* * TRY_EXECUTE_TOP_LEVEL * * * *-------------------------------------------------------------------------*/ Bool Try_Execute_Top_Level(void) { PredInf *pred; Reset_Prolog(); pred = Lookup_Pred(Create_Atom("top_level"), 0); if (pred != NULL) { Call_Prolog((CodePtr) (pred->codep)); return TRUE; } Reset_Prolog(); return FALSE; } /*-------------------------------------------------------------------------* * CALL_PROLOG * * * * Call_Prolog runs the execution of one prolog goal. * * The current choice point is updated to set ALTB to Call_Prolog_Fail and * * CP is set to Call_Prolog_Success. At the end ALTB and CP are restored. * * To ensure that a choice point always exists before invoking Call_Prolog,* * Start_Prolog reserve the space for a feint choice point, i.e ALTB can be* * safely modified. * * * * Call_Prolog returns TRUE if the predicate has succeed, FALSE otherwise. * * The called predicate can be non-deterministic. * *-------------------------------------------------------------------------*/ Bool Call_Prolog(CodePtr codep) { WamWord *query_b = B; WamCont save_CP = CP; WamCont save_ALTB = ALTB(query_b); Bool ok; ALTB(query_b) = (CodePtr) Call_Prolog_Fail; /* modify choice point */ CP = Adjust_CP(Call_Prolog_Success); #if defined(_WIN32) || defined(__CYGWIN__) SEH_PUSH(Win32_SEH_Handler); #endif ok = Call_Next(codep); #if defined(_WIN32) || defined(__CYGWIN__) SEH_POP; #endif CP = save_CP; /* restore continuation */ ALTB(query_b) = save_ALTB; /* restore choice point */ return ok; } /*-------------------------------------------------------------------------* * CALL_PROLOG_NEXT_SOL * * * * Call_Prolog_Next_Sol bactracks over the next solution. * *-------------------------------------------------------------------------*/ Bool Call_Prolog_Next_Sol(WamWord *query_b) { WamCont save_CP = CP; WamCont save_ALTB = ALTB(query_b); Bool ok; ALTB(query_b) = (CodePtr) Call_Prolog_Fail; /* modify choice point */ CP = Adjust_CP(Call_Prolog_Success); /* should be useless since */ /* alternative will restore CP */ ok = Call_Next(ALTB(B)); CP = save_CP; /* restore continuation */ ALTB(query_b) = save_ALTB; /* restore choice point */ return ok; } /*-------------------------------------------------------------------------* * KEEP_REST_FOR_PROLOG * * * * Update CP in choices points to be used by classical Prolog engine * * (some CPB(b) have been set to Call_Prolog_Success due to Call_Prolog). * *-------------------------------------------------------------------------*/ void Keep_Rest_For_Prolog(WamWord *query_b) { WamWord *b, *e, *query_e; for (b = B; b > query_b; b = BB(b)) if (CPB(b) == Adjust_CP(Call_Prolog_Success)) CPB(b) = CP; query_e = EB(query_b); for (e = EB(B); e > query_e; e = EE(e)) if (CPE(e) == Adjust_CP(Call_Prolog_Success)) CPE(e) = CP; } /*-------------------------------------------------------------------------* * CALL_NEXT * * * * Call_Next saves the context with setjmp. Since Call_Prolog can be nested* * we handle a stack of jumpers (i.e. contexts) directely in the C stack. * * The global variables p_jumper is the top of the stack and points to the * * current jumper. Similarly for the stack of machine register save buffers* *-------------------------------------------------------------------------*/ static Bool Call_Next(CodePtr codep) { int jmp_val; jmp_buf *old_jumper = p_jumper; jmp_buf new_jumper; WamWord *old_buff_save = p_buff_save; WamWord buff_save_machine_regs[NB_OF_USED_MACHINE_REGS + 1]; /* +1 if = 0 */ #if 0 WamWord buff_save_all_regs[NB_OF_REGS]; #endif p_jumper = &new_jumper; p_buff_save = buff_save_machine_regs; #if 0 Save_All_Regs(buff_save_all_regs); #endif Save_Machine_Regs(buff_save_machine_regs); jmp_val = setjmp(*p_jumper); Restore_Machine_Regs(buff_save_machine_regs); if (jmp_val == 0) /* normal call to codep */ Call_Compiled(codep); if (jmp_val == 3) /* return with a continuation in jmp_val */ Call_Compiled(cont_jmp); /* normal return */ p_jumper = old_jumper; p_buff_save = old_buff_save; if (jmp_val < 0) /* false: restore WAM registers */ { #if 0 Restore_All_Regs(buff_save_all_regs); #endif return FALSE; } return jmp_val; /* 1 (TRUE) or 3 (exception) */ } /*------------------------------------------------------------* * Call_Prolog_Fail: Prolog continuation after failure. * * Return in Call_Next with a longjmp (value -1) * *------------------------------------------------------------*/ static void Call_Prolog_Fail(void) { #ifdef M_ix86_darwin /* see comment in Ma2Asm/ix86_any.c */ asm("subl $4,%esp"); #elif defined(M_x86_64_linux) /* see comment in Ma2Asm/x86_64_any.c */ asm("subq $8,%rsp"); #endif Save_Machine_Regs(p_buff_save); longjmp(*p_jumper, -1); } /*------------------------------------------------------------* * Call_Prolog_Success: Prolog continuation after success. * * Return in Call_Next with a longjmp (value 1) * *------------------------------------------------------------*/ static void Call_Prolog_Success(void) { #ifdef M_ix86_darwin /* see comment in Ma2Asm/ix86_any.c */ asm("subl $4,%esp"); #elif defined(M_x86_64_linux) /* see comment in Ma2Asm/x86_64_any.c */ asm("subq $8,%rsp"); #endif Save_Machine_Regs(p_buff_save); longjmp(*p_jumper, 1); } /*------------------------------------------------------------* * Exit_With_Exception: * * Similar to a success but Call_Prolog returns 2 instead of 1* * (i.e. TRUE) * * Return in Call_Next with a longjmp (value 2) * *------------------------------------------------------------*/ void Exit_With_Exception(void) { Save_Machine_Regs(p_buff_save); longjmp(*p_jumper, 2); } /*------------------------------------------------------------* * Execute_A_Continuation: * * Similar to a nested Call_Prolog but faster, and if a fail * * occurs it is normally handled by the prolog engine, i.e. * * the last choice point is reconsidered. * * Return in Call_Next with a longjmp (value 3 cont_jmp=codep)* *------------------------------------------------------------*/ void Execute_A_Continuation(CodePtr codep) { Save_Machine_Regs(p_buff_save); cont_jmp = codep; longjmp(*p_jumper, 3); } ./gprolog-1.3.0/src/EnginePl/engine1.c0000644004425400513100000001236210547154141015761 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : engine1.c * * Descr.: general engine * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: engine1.c,v 1.17 2007/01/04 10:35:13 diaz Exp $ */ #include "engine_pl.h" WamWord *ensure_reserved; /*-------------------------------------------------------------------------* * Call_Compiled invokes a Prolog code. * * reserved_stack_space is only used to reserve some space in the stack and* * should not be removed by the compiler. This allows prolog compiled code * * to use this space to pass the arguments to C run-time functions, without* * having to decrement $sp (ie. push/pop) (e.g. on ix86). * * Note finally that since this function is called inside Call_Next, we are* * sure that $sp at longjmp will be more recent (ie. <) than $sp at setjmp.* * Certain implementations of setjmp/longjmp requires this. * * * * Warning: do not use nested { ... } blocs to declare register variables * * The C compiler "forgets" them after the bloc (e.g. solaris 2.6). * * * * This functions is in a separate file for historical reasons. In versions* * <= 1.2.4, this file was compiled without any C compiler optimization to * * ensure reserved_stack_space was not removed but the C compiler. In order* * to use ebp under ix86 it must be compiled with -fomit-frame-pointer. The* * simpliest way was to use the same C compiler invocation but adding a * * global variable to ensure the stack is not removed. * *-------------------------------------------------------------------------*/ void Call_Compiled(CodePtr codep) { WamWord reserved_stack_space[1024]; #if defined(M_sparc) && !defined(M_sparc_bsd) register long * __attribute__ ((unused)) rfl asm("%l2") = base_fl; register double * __attribute__ ((unused)) rfd asm("%l3") = base_fd; ensure_reserved = (WamWord *) rfl + (long) rfd; /* to avoid gcc remove 2 previous inits ! */ #endif #if !defined(NO_MACHINE_REG_FOR_REG_BANK) && !defined(MAP_REG_BANK) #if defined(M_ix86_linux) || \ defined(M_ix86_cygwin) || defined(M_ix86_mingw) || \ defined(M_ix86_sco) || defined(M_ix86_bsd) register WamWord *rb asm("%ebx") = reg_bank; ensure_reserved = (WamWord *) rb; /* to avoid gcc warning */ #elif defined(_MSC_VER) _asm mov ebx, reg_bank #elif defined(M_mips_irix) register WamWord *rb asm("$16") = reg_bank; ensure_reserved = (WamWord *) rb; /* to avoid gcc warning */ #elif defined(M_alpha_linux) || defined(M_alpha_osf) register WamWord *rb asm("$9") = reg_bank; ensure_reserved = (WamWord *) rb; /* to avoid gcc warning */ #elif defined(M_powerpc_linux) register WamWord *rb asm("15") = reg_bank; ensure_reserved = (WamWord *) rb; /* to avoid gcc warning */ #elif defined(M_powerpc_darwin) register WamWord *rb asm("r15") = reg_bank; ensure_reserved = (WamWord *) rb; /* to avoid gcc warning */ #elif defined(M_sparc) register WamWord *rb asm("%l0") = reg_bank; ensure_reserved = (WamWord *) rb; /* to avoid gcc warning */ #elif defined(M_x86_64_linux) register WamWord *rb asm("%r12") = reg_bank; ensure_reserved = (WamWord *) rb; /* to avoid gcc warning */ #endif #endif ensure_reserved = reserved_stack_space; #if defined(M_ix86_darwin) /* see comment in Ma2Asm/ix86_any.c */ asm("andl $0xfffffff0,%esp"); asm("addl $4,%esp"); #elif defined(M_x86_64_linux) /* see comment in Ma2Asm/x86_64_any.c */ asm("andq $0xfffffffffffffff0,%rsp"); asm("addq $8,%rsp"); #endif (*codep) (); } ./gprolog-1.3.0/src/EnginePl/headers.h0000644004425400513100000000406110547154141016050 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : headers.h * * Descr.: GNU Prolog - general header file (for users) * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: headers.h,v 1.10 2007/01/04 10:35:13 diaz Exp $ */ #ifndef _GPROLOG_H #define _GPROLOG_H #ifdef __cplusplus extern "C" { #endif #include "engine_pl.h" #include "bips_pl.h" #ifndef NO_USE_FD_SOLVER #include "engine_fd.h" #include "bips_fd.h" #endif /* NO_USE_FD_SOLVER */ #ifdef __cplusplus } #endif #endif ./gprolog-1.3.0/src/EnginePl/wam_inst.h0000644004425400513100000003246210547154141016264 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : wam_inst.h * * Descr.: WAM instruction implementation - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: wam_inst.h,v 1.18 2007/01/04 10:35:13 diaz Exp $ */ #if 0 #define GARBAGE_COLLECTOR #endif /*---------------------------------* * Constants * *---------------------------------*/ #define NOT_A_WAM_WORD Tag_REF(0) #define NIL_WORD Tag_ATM(ATOM_NIL) /* Read/Write Modes */ /* if S==NULL iff we are in the write mode */ #define WRITE_MODE NULL /* Environment Frame */ #ifdef GARBAGE_COLLECTOR #define ENVIR_STATIC_SIZE 4 #define CPE(e) (*(WamCont *) &(e[-1])) #define BCIE(e) (*(WamWord *) &(e[-2])) #define EE(e) (*(WamWord **) &(e[-3])) #define NBYE(e) (*(WamWord *) &(e[-4])) #define Y(e, y) (*(WamWord *) &(e[-5 - (y)])) #define ENVIR_NAMES {"CPE", "BCIE", "EE", "NBYE"} #else #define ENVIR_STATIC_SIZE 3 #define CPE(e) (*(WamCont *) &(e[-1])) #define BCIE(e) (*(WamWord *) &(e[-2])) #define EE(e) (*(WamWord **) &(e[-3])) #define Y(e, y) (*(WamWord *) &(e[-4 - (y)])) #define ENVIR_NAMES {"CPE", "BCIE", "EE"} #endif /* Choice Point Frame */ #define CHOICE_STATIC_SIZE 8 #define ALTB(b) (*(CodePtr *) &(b[-1])) #define CPB(b) (*(WamCont *) &(b[-2])) #define BCIB(b) (*(WamWord *) &(b[-3])) #define EB(b) (*(WamWord **) &(b[-4])) #define BB(b) (*(WamWord **) &(b[-5])) #define HB(b) (*(WamWord **) &(b[-6])) #define TRB(b) (*(WamWord **) &(b[-7])) #define CSB(b) (*(WamWord **) &(b[-8])) #define AB(b, a) (*(WamWord *) &(b[-9 - (a)])) #define CHOICE_NAMES {"ALTB", "CPB", "BCIB", "EB", "BB", \ "HB", "TRB", "CSB"} /* Wam Objects Manipulation */ /* Trail Tags */ #define NB_OF_TRAIL_TAGS 4 #define TUV 0 /* Trail Unbound Variable */ #define TOV 1 /* Trail One Value */ #define TMV 2 /* Trail Multiple Values */ #define TFC 3 /* Trail for Function Call */ #define TRAIL_TAG_NAMES {"TUV", "TOV", "TMV", "TFC"} #define Trail_Tag_Value(t, v) ((unsigned long) (v) | (t)) #define Trail_Tag_Of(w) ((unsigned long) (w) & 0x3) #define Trail_Value_Of(w) ((unsigned long) (w) & (~0x3)) /* Functor/arity */ #define Functor_Arity(f, n) (((n) << ATOM_SIZE) + (f)) #define Functor_Of(word) ((word) & (MAX_ATOM - 1)) #define Arity_Of(word) ((word) >> ATOM_SIZE) #ifndef NO_USE_FD_SOLVER #define Dont_Separate_Tag(tag_mask) ((tag_mask) == TAG_FDV_MASK) #else #define Dont_Separate_Tag(tag_mask) (0) #endif #define Do_Copy_Of_Word(tag_mask, word) \ if (Dont_Separate_Tag(tag_mask)) \ word = Tag_REF(UnTag_Address(word)) /* Unbound Variables */ #define Make_Self_Ref(adr) (Tag_REF(adr)) /* Atom */ /* Integer */ #define INT_GREATEST_VALUE ((long) ((1L<<(WORD_SIZE-TAG_SIZE-1))-1)) #define INT_LOWEST_VALUE ((long) ((-INT_GREATEST_VALUE)-1)) /* List */ #define OFFSET_CAR 0 #define Car(adr) (((WamWord *) adr)[OFFSET_CAR]) #define Cdr(adr) (((WamWord *) adr)[OFFSET_CAR+1]) /* Structure */ #define OFFSET_ARG 1 #define Functor(adr) (Functor_Of(Functor_And_Arity(adr))) #define Arity(adr) (Arity_Of(Functor_And_Arity(adr))) #define Functor_And_Arity(adr) (((WamWord *) (adr))[0]) #define Arg(adr, i) (((WamWord *) (adr))[OFFSET_ARG+i]) /* i in 0..arity-1 */ /* Stacks */ #define Global_Push(word) (*H++ = (WamWord) (word)) #define Global_Pop (*--H) #define Trail_Push(word) (*TR++ = (WamWord) (word)) #define Trail_Pop (*--TR) #define Is_A_Local_Adr(adr) ((adr) >= LSSA) /* Cut Management */ #define From_B_To_WamWord(b) (Tag_INT((b) - LSSA)) #define From_WamWord_To_B(word) (LSSA + UnTag_INT(word)) /* CP management */ #ifdef M_sparc #define Adjust_CP(cp) ((WamCont) ((unsigned long) (cp) - 8)) #define UnAdjust_CP(cp) ((WamCont) ((unsigned long) (cp) + 8)) #else #define Adjust_CP(p) ((WamCont) (p)) #define UnAdjust_CP(cp) (cp) #endif #ifndef FRAMES_ONLY /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct /* Switch item information */ { /* ------------------------------- */ long key; /* key: atm, int (if no_opt), f/n */ CodePtr codep; /* compiled code pointer if static */ } SwtInf; typedef SwtInf *SwtTbl; /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ WamWord FC Create_Functor_Arity_Tagged(char *func_str, int arity); SwtTbl FC Create_Swt_Table(int size); void FC Create_Swt_Atm_Element(SwtTbl t, int size, int atom, CodePtr codep); void FC Create_Swt_Stc_Element(SwtTbl t, int size, int func, int arity, CodePtr codep); Bool FC Get_Atom_Tagged(WamWord w, WamWord start_word); Bool FC Get_Atom(int atom, WamWord start_word); Bool FC Get_Integer_Tagged(WamWord w, WamWord start_word); Bool FC Get_Integer(long n, WamWord start_word); Bool FC Get_Float(double n, WamWord start_word); Bool FC Get_Nil(WamWord start_word); Bool FC Get_List(WamWord start_word); Bool FC Get_Structure_Tagged(WamWord w, WamWord start_word); Bool FC Get_Structure(int func, int arity, WamWord start_word); WamWord FC Put_X_Variable(void); WamWord FC Put_Y_Variable(WamWord *y_adr); WamWord FC Put_Unsafe_Value(WamWord start_word); WamWord FC Put_Atom_Tagged(WamWord w); WamWord FC Put_Atom(int atom); WamWord FC Put_Integer_Tagged(WamWord w); WamWord FC Put_Integer(long n); WamWord FC Put_Float(double n); WamWord FC Put_Nil(void); WamWord FC Put_List(void); WamWord FC Put_Structure_Tagged(WamWord w); WamWord FC Put_Structure(int func, int arity); WamWord FC Unify_Variable(void); void FC Unify_Void(int n); Bool FC Unify_Value(WamWord start_word); Bool FC Unify_Local_Value(WamWord start_word); Bool FC Unify_Atom_Tagged(WamWord w); Bool FC Unify_Atom(int atom); Bool FC Unify_Integer_Tagged(WamWord w); Bool FC Unify_Integer(long n); Bool FC Unify_Nil(void); Bool FC Unify_List(void); Bool FC Unify_Structure_Tagged(WamWord w); Bool FC Unify_Structure(int func, int arity); WamWord FC Globalize_If_In_Local(WamWord start_word); void FC Allocate(int n); void FC Deallocate(void); CodePtr FC Switch_On_Term(CodePtr c_var, CodePtr c_atm, CodePtr c_int, CodePtr c_lst, CodePtr c_stc); CodePtr FC Switch_On_Term_Var_Atm(CodePtr c_var, CodePtr c_atm); CodePtr FC Switch_On_Term_Var_Stc(CodePtr c_var, CodePtr c_stc); CodePtr FC Switch_On_Term_Var_Atm_Lst(CodePtr c_var, CodePtr c_atm, CodePtr c_lst); CodePtr FC Switch_On_Term_Var_Atm_Stc(CodePtr c_var, CodePtr c_atm, CodePtr c_stc); CodePtr FC Switch_On_Atom(SwtTbl t, int size); long FC Switch_On_Integer(void); CodePtr FC Switch_On_Structure(SwtTbl t, int size); void FC Load_Cut_Level(WamWord *word_adr); void FC Cut(WamWord b_word); void FC Global_Push_Float(double n); double FC Obtain_Float(WamWord *adr); void FC Create_Choice_Point(CodePtr codep_alt, int arity); void FC Create_Choice_Point1(CodePtr codep_alt); void FC Create_Choice_Point2(CodePtr codep_alt); void FC Create_Choice_Point3(CodePtr codep_alt); void FC Create_Choice_Point4(CodePtr codep_alt); void FC Update_Choice_Point(CodePtr codep_alt, int arity); void FC Update_Choice_Point1(CodePtr codep_alt); void FC Update_Choice_Point2(CodePtr codep_alt); void FC Update_Choice_Point3(CodePtr codep_alt); void FC Update_Choice_Point4(CodePtr codep_alt); void FC Delete_Choice_Point(int arity); void FC Delete_Choice_Point1(void); void FC Delete_Choice_Point2(void); void FC Delete_Choice_Point3(void); void FC Delete_Choice_Point4(void); void FC Untrail(WamWord *low_adr); Bool FC Unify(WamWord start_u_word, WamWord start_v_word); Bool FC Unify_Occurs_Check(WamWord start_u_word, WamWord start_v_word); #endif /* FRAME_ONLY */ /*---------------------------------* * Auxiliary engine macros * *---------------------------------*/ /*---------------------------------------------------------------* * DEREF dereferences the word start_word and sets : * * word : dereferenced word * * tag_mask: dereferenced word's tag mask * *---------------------------------------------------------------*/ #if 0 #define DEREF_STATS #endif #ifdef DEREF_STATS long nb_deref; long chain_len; #define DEREF_COUNT(x) x++ #else #define DEREF_COUNT(x) #endif #define DEREF(start_word, word, tag_mask) \ do \ { \ WamWord deref_last_word; \ \ word = start_word; \ \ DEREF_COUNT(nb_deref); \ do \ { \ DEREF_COUNT(chain_len); \ deref_last_word = word; \ tag_mask = Tag_Mask_Of(word); \ if (tag_mask != TAG_REF_MASK) \ break; \ word = *(UnTag_REF(word)); \ } \ while (word != deref_last_word); \ } \ while (0) /* Trail Stack Management */ #define Word_Needs_Trailing(adr) \ ((adr) < HB1 || (Is_A_Local_Adr(adr) && (adr) < B)) #define Bind_UV(adr, word) \ do \ { \ if (Word_Needs_Trailing(adr)) \ Trail_UV(adr); \ *(adr) = (word); \ } \ while (0) #define Bind_OV(adr, word) \ do \ { \ if (Word_Needs_Trailing(adr)) \ Trail_OV(adr); \ *(adr) = (word); \ } \ while (0) #define Bind_MV(adr, nb, real_adr) \ do \ { \ if (Word_Needs_Trailing(adr)) \ Trail_MV(adr, nb); \ Mem_Word_Cpy(adr, real_adr, nb); \ } \ while (0) #define Trail_UV(adr) \ Trail_Push(Trail_Tag_Value(TUV, adr)) #define Trail_OV(adr) \ do \ { \ Trail_Push(*(adr)); \ Trail_Push(Trail_Tag_Value(TOV, adr)); \ } \ while (0) #define Trail_MV(adr, nb) \ do \ { \ Mem_Word_Cpy(TR, adr, nb); \ TR += nb; \ Trail_Push(nb); \ Trail_Push(Trail_Tag_Value(TMV, adr)); \ } \ while (0) #define Trail_FC(fct, nb, arg) \ do \ { \ Mem_Word_Cpy(TR, arg, nb); \ TR += nb; \ Trail_Push(nb); \ Trail_Push(fct); /*fct adr not aligned*/ \ Trail_Push(Trail_Tag_Value(TFC, 0)); \ } \ while (0) #define Assign_B(newB) (B = (newB), HB1 = HB(B)) #define Delete_Last_Choice_Point() Assign_B(BB(B)) /* Globalization */ #define Globalize_Local_Unbound_Var(adr, res_word) \ do \ { \ WamWord *cur_H = H; \ \ res_word = Make_Self_Ref(cur_H); \ *cur_H = res_word; \ H++; \ Bind_UV(adr, res_word); \ } \ while (0) #define Mem_Word_Cpy(dst, src, nb) \ do \ { \ register long *s = (long *) (src); \ register long *d = (long *) (dst); \ register int counter = (nb); \ \ do \ *d++ = *s++; \ while (--counter); \ } \ while (0) ./gprolog-1.3.0/src/EnginePl/obj_chain.c0000644004425400513100000001661710547154141016356 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : obj_chain.c * * Descr.: object chaining management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: obj_chain.c,v 1.14 2007/01/04 10:35:13 diaz Exp $ */ #include #include "pl_params.h" #include "arch_dep.h" #include "gp_config.h" #include "obj_chain.h" #define DBGPRINTF printf #if 0 #define DEBUG #endif void Fatal_Error(char *format, ...); /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { void (*fct_obj_init) (); void (*fct_exec_system) (); void (*fct_exec_user) (); } ObjInf; /*---------------------------------* * Global Variables * *---------------------------------*/ static ObjInf obj_tbl[MAX_OBJECT]; static int nb_obj = 0; /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * Under WIN32 with MSVC++ 6.0 * * * * We use the possibility to define user sections in objects. We group the * * address of each initialization function in a same section (named .GPLC).* * We use 2 markers: obj_chain_begin and obj_chain_end whose address (&) * * delimit the start and the end of the initializer function address table.* * To know the start and end address in this section we cannot assume the * * (MS) linker fits the section in the order it finds the objects. However,* * if a section name contains a $ in it, the $ and all everything that * * follows will be stripped off in the executable file. Before the linker * * strips down the name, it combines the sections with names that match up * * to the $. The name portion after the $ is used in arranging the OBJ * * sections in the executable. These sections are sorted alphabetically, * * based on the portion of the name after the $. For example, 3 sections * * called .GPLC$m, .GPLC$a and .GPLC$z will be combined into a single * * section called .GPLC in the executable. The data in this section will * * start with .GPLC$a's data, continue with .GPLC$m's data and end with * * .GPLC$z's data. Inside a same (sub)section the order is unknown. * * We use $a for obj_chain_begin, $z for obj_chain_end, $m for initializers* * WARNING: when linking do not use any superflous flag (e.g. debugging), * * I have spent a lot of time to find that /ZI causes troubles (the .GPLC * * section contains much more information and then it is not correct to use* * its whole content between &obj_chain_begin and &obj_begin_stop). * *-------------------------------------------------------------------------*/ #ifdef _MSC_VER #pragma data_seg(".GPLC$a") static long obj_chain_begin = 1; #pragma data_seg(".GPLC$z") static long obj_chain_end = 1; #pragma data_seg() static void Accumulate_Objects(void); #endif #ifndef OBJ_CHAIN_REVERSE_ORDER #define FOR_EACH_OBJ for(i = 0; i < nb_obj; i++) #else #define FOR_EACH_OBJ for(i = nb_obj; --i >= 0; ) #endif /*-------------------------------------------------------------------------* * FIND_LINKED_OBJECTS * * * *-------------------------------------------------------------------------*/ void Find_Linked_Objects(void) { int i; #ifdef _MSC_VER Accumulate_Objects(); #endif FOR_EACH_OBJ /* call Obj Init functions */ { if (obj_tbl[i].fct_obj_init != NULL) { #ifdef DEBUG DBGPRINTF("\n+++ Executing Obj Init Function at: %p\n", (obj_tbl[i].fct_obj_init)); #endif (*(obj_tbl[i].fct_obj_init)) (); } } FOR_EACH_OBJ /* call Exec System functions */ { if (obj_tbl[i].fct_exec_system != NULL) { #ifdef DEBUG DBGPRINTF("\n+++ Executing Exec System Function at: %p\n", (obj_tbl[i].fct_exec_system)); #endif (*(obj_tbl[i].fct_exec_system)) (); } } FOR_EACH_OBJ /* call Exec User functions */ { if (obj_tbl[i].fct_exec_user != NULL) { #ifdef DEBUG DBGPRINTF("\n+++ Executing Exec User Function at: %p\n", (obj_tbl[i].fct_exec_user)); #endif (*(obj_tbl[i].fct_exec_user)) (); } } } /*-------------------------------------------------------------------------* * ACCUMULATE_OBJECTS * * * *-------------------------------------------------------------------------*/ #ifdef _MSC_VER static void Accumulate_Objects(void) { long *p; void (*q) (); #ifdef DEBUG DBGPRINTF("ObjChain: chain begin: %p\n", &obj_chain_begin); DBGPRINTF("ObjChain: chain end : %p\n", &obj_chain_end); #endif p = &obj_chain_begin; while (++p < &obj_chain_end) { q = (void (*)()) *p; if (q) { #ifdef DEBUG DBGPRINTF("\n*** Obj Found addr: %p Initializer: %p\n", p, q); #endif (*q) (); } } } #endif /* MSC_VER */ /*-------------------------------------------------------------------------* * NEW_OBJECT * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void New_Object(void (*fct_obj_init)(), void (*fct_exec_system) (), void (*fct_exec_user) ()) { obj_tbl[nb_obj].fct_obj_init = fct_obj_init; obj_tbl[nb_obj].fct_exec_system = fct_exec_system; obj_tbl[nb_obj].fct_exec_user = fct_exec_user; nb_obj++; } ./gprolog-1.3.0/src/EnginePl/pl_config.c0000644004425400513100000006741410547154141016403 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : configuration * * File : pl_config.c * * Descr.: C Compiler options and WAM Configuration * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: pl_config.c,v 1.14 2007/01/04 10:35:13 diaz Exp $ */ #include #include #include #include #include #include "gp_config.h" #include "machine.h" /*---------------------------------* * Constants * *---------------------------------*/ #define STR_LENGTH 512 #define FILE_WAM_REGS_H "wam_regs.h" #define FILE_WAM_ARCHI_DEF "wam_archi.def" #define FILE_WAM_ARCHI_H "wam_archi.h" /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { char type[32]; char name[32]; } RegInf; typedef enum { SHORT_UNS, LONG_INT, ADDRESS } TypTag; typedef struct { char name[32]; TypTag type; int value; } TagInf; typedef struct { char name[32]; int def_size; char top_macro[128]; } StackInf; /*---------------------------------* * Global Variables * *---------------------------------*/ char save_str[STR_LENGTH]; FILE *fw_r; /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Write_C_Compiler_Info(int nb_of_used_regs); int Generate_Archi(void); char *Read_Identifier(char *s, int fail_if_error, char **end); int Read_Integer(char *s, char **end); int Generate_Regs(FILE *f, FILE *g); void Generate_Tags(FILE *f, FILE *g); void Generate_Stacks(FILE *f, FILE *g); void Fatal_Error(char *format, ...); /*-------------------------------------------------------------------------* * MAIN * * * *-------------------------------------------------------------------------*/ int main(void) { int nb_of_used_regs; #ifndef NO_USE_REGS char *used_regs[] = M_USED_REGS; int i; #endif if (*M_CPU == '?') { printf("*** This architecture is not supported ***\n"); return 1; } if (WORD_SIZE != (sizeof(long) * 8)) { printf("Bad Value of WORD_SIZE - should be %d\n", (int) (sizeof(long) * 8)); return 1; } if ((fw_r = fopen(FILE_WAM_REGS_H, "wb")) == NULL) Fatal_Error("cannot open %s", FILE_WAM_REGS_H); fprintf(fw_r, "/* this file is automatically generated by pl_config.c */\n"); fprintf(fw_r, "\n#include \"gp_config.h\"\n\n"); printf("\n"); printf("\t-------------------------------\n"); printf("\t--- GNU PROLOG INSTALLATION ---\n"); printf("\t-------------------------------\n\n"); printf("GNU Prolog version: %s (%s)\n", PROLOG_VERSION, PROLOG_DATE); printf("Operating system : %s\n", M_OS); printf("Processor : %s\n", M_CPU); printf("Size of a word : %d bits\n", (int) WORD_SIZE); printf("C compiler : %s\n", CC); printf("C flags : %s\n", CFLAGS); printf("C flags machine : %s\n", CFLAGS_MACHINE); printf("Loader flags : %s\n", LDFLAGS); printf("Loader libraries : %s\n", LDLIBS); printf("Use line editor : %s\n", #ifndef NO_USE_LINEDIT "Yes" #else "No" #endif ); printf("Use piped consult : %s\n", #ifndef NO_USE_PIPED_STDIN_FOR_CONSULT "Yes" #else "No" #endif ); #ifdef _WIN32 printf("Use GUI console : %s\n", #ifdef W32_GUI_CONSOLE "Yes" #else "No" #endif ); #endif printf("Use sockets : %s\n", #ifndef NO_USE_SOCKETS "Yes" #else "No" #endif ); printf("Use FD solver : %s\n", #ifndef NO_USE_FD_SOLVER "Yes" #else "No" #endif ); #ifdef COULD_COMPILE_FOR_FC printf("Use fast call : %s\n", #ifndef NO_USE_FAST_CALL "Yes" #else "No" #endif ); #endif printf("Use machine regs. : %s\n", #ifndef NO_USE_REGS "Yes" #else "No" #endif ); nb_of_used_regs = Generate_Archi(); Write_C_Compiler_Info(nb_of_used_regs); fclose(fw_r); #ifndef NO_USE_REGS printf("Used register(s) : "); for (i = 0; i < nb_of_used_regs; i++) printf("%s ", used_regs[i]); printf("\n"); #endif printf("\n"); printf("\t------------------------------\n\n"); return 0; } /*-------------------------------------------------------------------------* * WRITE_C_COMPILER_INFO * * * *-------------------------------------------------------------------------*/ void Write_C_Compiler_Info(int nb_of_used_regs) { char *used_regs[] = M_USED_REGS; int i; fputc('\n', fw_r); fprintf(fw_r, "#define CFLAGS_REGS\t\t\""); for (i = 0; i < nb_of_used_regs; i++) { fprintf(fw_r, CFLAGS_PREFIX_REG, used_regs[i]); fputc(' ', fw_r); } fputs("\"\n", fw_r); } /*-------------------------------------------------------------------------* * GENERATE_ARCHI * * * *-------------------------------------------------------------------------*/ int Generate_Archi(void) { FILE *f, *g; char str[STR_LENGTH]; char *p1, *p2; int nb_of_used_regs = 0; if ((f = fopen(FILE_WAM_ARCHI_DEF, "rt")) == NULL) Fatal_Error("cannot open %s", FILE_WAM_ARCHI_DEF); if ((g = fopen(FILE_WAM_ARCHI_H, "wb")) == NULL) Fatal_Error("cannot open %s", FILE_WAM_ARCHI_H); while (!feof(f) && fgets(str, sizeof(str), f)) { if (*str != '@') { fputs(str, g); continue; } strcpy(save_str, str); p1 = Read_Identifier(str + 1, 1, &p2); if (strcmp(p1, "begin") != 0) Fatal_Error("Syntax error: incorrect @ declaration in: %s", save_str); p1 = Read_Identifier(p2 + 1, 1, &p2); if (strcmp(p1, "regs") == 0) { nb_of_used_regs = Generate_Regs(f, g); continue; } if (strcmp(p1, "tags") == 0) { Generate_Tags(f, g); continue; } if (strcmp(p1, "stacks") == 0) { Generate_Stacks(f, g); continue; } Fatal_Error("Syntax error: unknown section in: %s", save_str); } fclose(f); fclose(g); return nb_of_used_regs; } /*-------------------------------------------------------------------------* * READ_IDENTIFIER * * * *-------------------------------------------------------------------------*/ char * Read_Identifier(char *s, int fail_if_error, char **end) { while (isspace(*s)) s++; *end = s; if (!isalpha(**end)) { if (fail_if_error) Fatal_Error("Syntax error: identifier expected in: %s", save_str); else return NULL; } do (*end)++; while (isalnum(**end) || **end == '_'); if (!isspace(**end)) Fatal_Error("Syntax error: space expected after identifier in: %s", save_str); **end = '\0'; return s; } /*-------------------------------------------------------------------------* * READ_INTEGER * * * *-------------------------------------------------------------------------*/ int Read_Integer(char *s, char **end) { int x = 0; while (isspace(*s)) s++; *end = s; if (!isdigit(**end)) Fatal_Error("Syntax error: integer expected in: %s", save_str); do { x = x * 10 + **end - '0'; (*end)++; } while (isdigit(**end) || **end == '_'); if (!isspace(**end)) Fatal_Error("Syntax error: space expected after identifier in: %s", save_str); **end = '\0'; return x; } /*-------------------------------------------------------------------------* * GENERATE_REGS * * * * initial filler description * * @filler size * * * * register description: * * @reg priority type name * * priority: 1-9 (1:high, 9:low) * * type must be machine word castable (ex int unsigned pointer...) * * * *-------------------------------------------------------------------------*/ int Generate_Regs(FILE *f, FILE *g) { char *p1, *p2; char str[STR_LENGTH]; char str_base[32] = ""; char *used_regs[] = M_USED_REGS; int nb_of_used_regs = 0; RegInf reg[10][50]; int nb_reg[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; RegInf *dp; char **p; int total_nb_reg = 0; int nb_not_alloc = 0; int regs_to_save_for_signal; int i, j, k; #ifdef NO_USE_REGS used_regs[0] = NULL; #endif for (;;) { if (feof(f) || !fgets(str, sizeof(str), f)) Fatal_Error("Syntax error: end expected for @begin reg"); if (*str != '@') { if (*str != '\n') fputs(str, g); continue; } strcpy(save_str, str); p1 = Read_Identifier(str + 1, 1, &p2); if (strcmp(p1, "end") == 0) break; if (strcmp(p1, "filler") == 0) { p1 = Read_Identifier(p2 + 1, 0, &p2); if (!p1) { i = Read_Integer(p2, &p2); p1 = str; sprintf(p1, "%d", i); } sprintf(str_base + strlen(str_base), "%s+", p1); continue; } if (strcmp(p1, "reg") == 0) { i = Read_Integer(p2 + 1, &p2); strcpy(reg[i][nb_reg[i]].type, Read_Identifier(p2 + 1, 1, &p2)); strcpy(reg[i][nb_reg[i]].name, Read_Identifier(p2 + 1, 1, &p2)); nb_reg[i]++; continue; } Fatal_Error("Syntax error: incorrect @ declaration in: %s", save_str); } fprintf(g, "\n\n /*--- Begin Register Generation ---*/\n\n"); p = used_regs; #ifndef NO_MACHINE_REG_FOR_REG_BANK if (*p) { nb_of_used_regs++; fprintf(g, "register WamWord \t\t*reg_bank asm (\"%s\");\n\n", *p); fprintf(fw_r, "#define MAP_REG_BANK\t\t\"%s\"\n\n", *p++); } else { fprintf(g, "#ifdef ENGINE_FILE\n\n"); fprintf(g, " WamWord \t\t\t*reg_bank;\n"); fprintf(g, "\n#else\n\n"); fprintf(g, "extern WamWord \t\t\t*reg_bank;\n"); fprintf(g, "\n#endif\n\n"); } #endif for (i = 0; i < 10; i++) for (j = 0, total_nb_reg += nb_reg[i]; j < nb_reg[i]; j++) { dp = ®[i][j]; if (*p) { nb_of_used_regs++; fprintf(g, "register %s\t\t%-3s asm (\"%s\");\n", dp->type, dp->name, *p); fprintf(fw_r, "#define MAP_REG_%-10s\t\"%s\"\n", dp->name, *p++); if (!*p) fprintf(g, "\n\n"); } else { fprintf(g, "#define %s\t\t\t(((%-8s *) reg_bank)[%s%d])\n", dp->name, dp->type, str_base, nb_not_alloc); fprintf(fw_r, "#define MAP_OFFSET_%-6s\t((%s%d)*%d)\n", dp->name, str_base, nb_not_alloc++, (int) sizeof(long)); } } fprintf(g, "\n\n"); fprintf(g, "#define NB_OF_REGS \t%d\n", total_nb_reg); fprintf(g, "#define NB_OF_ALLOC_REGS \t%d\n", total_nb_reg - nb_not_alloc); fprintf(g, "#define NB_OF_NOT_ALLOC_REGS\t%d\n", nb_not_alloc); fprintf(g, "#define REG_BANK_SIZE \t(%sNB_OF_NOT_ALLOC_REGS)\n", str_base); fprintf(g, "\n\n\n\n#define NB_OF_USED_MACHINE_REGS %d\n", nb_of_used_regs); /* same as NB_OF_ALLOC_REGS :-) ? */ #ifndef NO_MACHINE_REG_FOR_REG_BANK /* reg_bank restored anyway */ regs_to_save_for_signal = (nb_of_used_regs > 1); #else regs_to_save_for_signal = (nb_of_used_regs >= 1); #endif fprintf(g, "\n"); fprintf(g, "#ifdef ENGINE_FILE\n\n"); #ifdef NO_MACHINE_REG_FOR_REG_BANK fprintf(g, "WamWord reg_bank[REG_BANK_SIZE];\n"); #else fprintf(g, "WamWord *save_reg_bank;\n\n"); #endif if (regs_to_save_for_signal) fprintf(g, "WamWord buff_signal_reg[NB_OF_USED_MACHINE_REGS + 1];\n\n"); fprintf(g, "char *reg_tbl[] = { "); k = 0; for (i = 0; i < 10; i++) for (j = 0; j < nb_reg[i]; j++) { dp = ®[i][j]; fprintf(g, "\"%s\"%s", dp->name, k < total_nb_reg - 1 ? ", " : "};\n"); k++; } fprintf(g, "\n#else\n\n"); #ifdef NO_MACHINE_REG_FOR_REG_BANK fprintf(g, "extern WamWord reg_bank[];\n"); #else fprintf(g, "extern WamWord *save_reg_bank;\n\n"); #endif if (regs_to_save_for_signal) fprintf(g, "extern WamWord buff_signal_reg[];\n\n"); fprintf(g, "extern char *reg_tbl[];\n"); fprintf(g, "\n#endif\n\n"); #ifndef NO_MACHINE_REG_FOR_REG_BANK fprintf(g, "#define Init_Reg_Bank(x) save_reg_bank = reg_bank = x\n"); #else fprintf(g, "#define Init_Reg_Bank(x)\n"); #endif fprintf(g, "\n\n"); fprintf(g, "#define Reg(i)\t\t\t("); k = 0; for (i = 0; i < 10; i++) for (j = 0; j < nb_reg[i]; j++) { dp = ®[i][j]; if (k < total_nb_reg - 1) fprintf(g, "((i)==%d) ? (WamWord) %-3s\t: \\\n\t\t\t\t ", k++, dp->name); else fprintf(g, " (WamWord) %s)\n", dp->name); } fprintf(g, "\n\n\n\n#define Save_All_Regs(buff_save) \\\n"); fprintf(g, " do { \\\n"); k = 0; for (i = 0; i < 10; i++) for (j = 0; j < nb_reg[i]; j++) { dp = ®[i][j]; fprintf(g, " buff_save[%d] = (WamWord) %s; \\\n", k, dp->name); k++; } fprintf(g, " } while(0)\n"); fprintf(g, "\n\n\n\n#define Restore_All_Regs(buff_save) \\\n"); fprintf(g, " do { \\\n"); k = 0; for (i = 0; i < 10; i++) for (j = 0; j < nb_reg[i]; j++) { dp = ®[i][j]; fprintf(g, " %-6s = (%-8s) buff_save[%d]; \\\n", dp->name, dp->type, k); k++; } fprintf(g, " } while(0)\n"); fprintf(g, "\n\n\n\n#define Save_Machine_Regs(buff_save) \\\n"); fprintf(g, " do { \\\n"); for (i = 0; i < nb_of_used_regs; i++) fprintf(g, " register long reg%d asm (\"%s\"); \\\n", i, used_regs[i]); for (i = 0; i < nb_of_used_regs; i++) fprintf(g, " buff_save[%d] = reg%d; \\\n", i, i); fprintf(g, " } while(0)\n"); fprintf(g, "\n\n#define Restore_Machine_Regs(buff_save) \\\n"); fprintf(g, " do { \\\n"); for (i = 0; i < nb_of_used_regs; i++) fprintf(g, " register long reg%d asm (\"%s\"); \\\n", i, used_regs[i]); for (i = 0; i < nb_of_used_regs; i++) fprintf(g, " reg%d = buff_save[%d]; \\\n", i, i); fprintf(g, " } while(0)\n"); if (regs_to_save_for_signal) { fprintf(g, "\n\n\n\n#define Start_Protect_Regs_For_Signal \\\n"); fprintf(g, " do { \\\n"); fprintf(g, " Save_Machine_Regs(buff_signal_reg); \\\n"); fprintf(g, " buff_signal_reg[NB_OF_USED_MACHINE_REGS] = 1; \\\n"); fprintf(g, " } while(0)\n"); fprintf(g, "\n\n#define Stop_Protect_Regs_For_Signal \\\n"); fprintf(g, " buff_signal_reg[NB_OF_USED_MACHINE_REGS] = 0; \\\n"); fprintf(g, "\n\n#define Restore_Protect_Regs_For_Signal \\\n"); fprintf(g, " do { \\\n"); fprintf(g, " if (buff_signal_reg[NB_OF_USED_MACHINE_REGS]) { \\\n"); fprintf(g, " Restore_Machine_Regs(buff_signal_reg); \\\n"); fprintf(g, " Stop_Protect_Regs_For_Signal; \\\n"); fprintf(g, " } \\\n"); #ifndef NO_MACHINE_REG_FOR_REG_BANK fprintf(g, " reg_bank = save_reg_bank; \\\n"); #endif fprintf(g, " } while(0)\n"); } else { fprintf(g, "\n\n\n\n#define Start_Protect_Regs_For_Signal\n"); fprintf(g, "\n\n#define Stop_Protect_Regs_For_Signal\n"); fprintf(g, "\n\n#define Restore_Protect_Regs_For_Signal\n"); } fprintf(g, "\n\n /*--- End Register Generation ---*/\n\n"); return nb_of_used_regs; } /*-------------------------------------------------------------------------* * GENERATE_TAGS * * * * tag description: * * @tag name type value * * type: long_int/short_uns/address * * value: >= 0 * *-------------------------------------------------------------------------*/ void Generate_Tags(FILE *f, FILE *g) { char str[STR_LENGTH]; char *p1, *p2; TagInf tag[128]; int nb_tag = 0; int tag_size, tag_size_low, tag_size_high, value_size; int max_value = 0; unsigned long tag_mask; int i; for (;;) { if (feof(f) || !fgets(str, sizeof(str), f)) Fatal_Error("Syntax error: end expected for @begin tag"); if (*str != '@') { if (*str != '\n') fputs(str, g); continue; } strcpy(save_str, str); p1 = Read_Identifier(str + 1, 1, &p2); if (strcmp(p1, "end") == 0) break; if (strcmp(p1, "tag") == 0) { strcpy(tag[nb_tag].name, Read_Identifier(p2 + 1, 1, &p2)); p1 = Read_Identifier(p2 + 1, 1, &p2); if (strcmp(p1, "long_int") == 0) tag[nb_tag].type = LONG_INT; else if (strcmp(p1, "short_uns") == 0) tag[nb_tag].type = SHORT_UNS; else if (strcmp(p1, "address") == 0) tag[nb_tag].type = ADDRESS; else Fatal_Error("Syntax error: wrong tag type in: %s", save_str); tag[nb_tag].value = Read_Integer(p2 + 1, &p2); if (tag[nb_tag].value > max_value) max_value = tag[nb_tag].value; nb_tag++; continue; } Fatal_Error("Syntax error: incorrect @ declaration in: %s", save_str); } fprintf(g, "\n\n /*--- Begin Tag Generation ---*/\n\n"); #define Mk_Tag_Mask(x) ((((unsigned long) (x) >> tag_size_low) << (value_size + tag_size_low)) | ((x) & ((1 << tag_size_low) - 1))) #if 0 tag_size = 4; #else max_value++; if (max_value < nb_tag) Fatal_Error("There is an invalid tag value (repetition ?)\n"); for (tag_size = 0; (1 << tag_size) < max_value; tag_size++) ; #endif #if WORD_SIZE == 32 tag_size_low = 2; #else tag_size_low = 3; #endif tag_size_high = tag_size - tag_size_low; value_size = WORD_SIZE - tag_size; tag_mask = Mk_Tag_Mask((1 << tag_size) - 1); fprintf(g, "#define TAG_SIZE \t\t%d\n", tag_size); fprintf(g, "#define TAG_SIZE_LOW \t\t%d\n", tag_size_low); fprintf(g, "#define TAG_SIZE_HIGH\t\t%d\n", tag_size_high); fprintf(g, "#define VALUE_SIZE \t\t%d\n", value_size); fprintf(g, "#define TAG_MASK \t\t%#lxUL\n", tag_mask); fprintf(g, "#define VALUE_MASK \t\t%#lxUL\n", ~tag_mask); fprintf(g, "#define Tag_Mask_Of(w)\t\t((unsigned long) (w) & (TAG_MASK))\n"); fprintf(g, "#define Tag_From_Tag_Mask(w) \t(((unsigned long) (w) >> %d) | ((w) & %d))\n", value_size, (1 << tag_size_low) -1); if (tag_size_high > 0) fprintf(g, "#define Tag_Of(w) \t\t((((unsigned long) (w) >> %d) << %d) | ((w) & %d))\n", WORD_SIZE-tag_size_high, tag_size_low, (1 << tag_size_low) -1); else fprintf(g, "#define Tag_Of(w) \t\tTag_Mask_Of(w)\n"); for (i = 0; i < nb_tag; i++) fprintf(g, "#define TAG_%s_MASK\t\t%#lxUL\n", tag[i].name, Mk_Tag_Mask(tag[i].value)); fprintf(g, "\n"); fprintf(g, "#define NB_OF_TAGS \t%d\n", nb_tag); for (i = 0; i < nb_tag; i++) fprintf(g, "#define %-10s \t\t%-2d\n", tag[i].name, tag[i].value); fprintf(g, "\n"); fprintf(g, "\t/* General Tag/UnTag macros */\n\n"); fprintf(g, "#define Tag_Long_Int(tm, v) \t((((unsigned long) ((v) << %d)) >> %d) | (tm))\n", tag_size, tag_size_high); fprintf(g, "#define Tag_Short_Uns(tm, v)\t(((unsigned long) (v) << %d) + (tm))\n", tag_size_low); /* For Tag_Address the + (tm) is better than | (tm) since the C compiler can * optimizes things like Tag_Address(2, H + 1) with only 1 instruction (+ 6) * instead of 2 (1 for + 4, 1 for | TAG_STC_MASK) */ fprintf(g, "#define Tag_Address(tm, v) \t((unsigned long) (v) + (tm))\n"); fprintf(g, "\n"); fprintf(g, "#define UnTag_Long_Int(w) \t((long) ((w) << %d) >> %d)\n", tag_size_high, tag_size); fprintf(g, "#define UnTag_Short_Uns(w)\tUnTag_Long_Int(w)\n"); fprintf(g, "#define UnTag_Address(w) \t((WamWord *) ((w) & VALUE_MASK))\n"); fprintf(g, "\n"); fprintf(g, "\n"); fprintf(g, "\t/* Specialized Tag/UnTag macros */\n\n"); fprintf(g, "\n"); for (i = 0; i < nb_tag; i++) { fprintf(g, "#define Tag_%s(v) \t\t", tag[i].name); switch(tag[i].type) { case LONG_INT: if (tag[i].value == 0) fprintf(g, "(((unsigned long) (v) << %d) & VALUE_MASK)\n", tag_size_low); /* testing if high bits are 1 should suffice below - TO DO */ else if (tag[i].value == (1 << tag_size) - 1) fprintf(g, "(((unsigned long) (v) << %d) | TAG_MASK)\n", tag_size_low); else fprintf(g, "Tag_Long_Int(TAG_%s_MASK, v)\n", tag[i].name); break; case SHORT_UNS: fprintf(g, "Tag_Short_Uns(TAG_%s_MASK, v)\n", tag[i].name); break; case ADDRESS: fprintf(g, "Tag_Address(TAG_%s_MASK, v)\n", tag[i].name); break; } } fprintf(g, "\n"); for (i = 0; i < nb_tag; i++) { fprintf(g, "#define UnTag_%s(w) \t\t", tag[i].name); switch(tag[i].type) { case LONG_INT: fprintf(g, "UnTag_Long_Int(w)\n"); break; case SHORT_UNS: if (tag[i].value <= 3) fprintf(g, "((unsigned long) (w) >> %d)\n", tag_size_low); else fprintf(g, "UnTag_Short_Uns(w)\n"); break; case ADDRESS: if (tag[i].value == 0) fprintf(g, "((WamWord *) (w))\n"); else fprintf(g, "UnTag_Address(w)\n"); break; } } fprintf(g, "\n"); for (i = 0; i < nb_tag; i++) { fprintf(g, "#define Tag_Is_%s(w) \t\t(Tag_Mask_Of(w) == TAG_%s_MASK)\n", tag[i].name, tag[i].name); } fprintf(g, "\ntypedef enum\n"); fprintf(g, "{\n"); fprintf(g, " LONG_INT,\n"); fprintf(g, " SHORT_UNS,\n"); fprintf(g, " ADDRESS\n"); fprintf(g, "}TypTag;\n"); fprintf(g, "\ntypedef struct\n"); fprintf(g, "{\n"); fprintf(g, " char *name;\n"); fprintf(g, " TypTag type;\n"); fprintf(g, " int value;\n"); fprintf(g, " long tag_mask;\n"); fprintf(g, "}InfTag;\n\n\n"); fprintf(g, "#ifdef ENGINE_FILE\n\n"); fprintf(g, "InfTag tag_tbl[] =\n{\n"); for (i = 0; i < nb_tag; i++) { fprintf(g, " { \"%s\", %s, %d, %#lxUL }%s", tag[i].name, (tag[i].type == LONG_INT) ? "LONG_INT" : (tag[i].type == SHORT_UNS) ? "SHORT_UNS" : "ADDRESS", tag[i].value, Mk_Tag_Mask(tag[i].value), (i < nb_tag - 1) ? ",\n" : "\n};\n"); } fprintf(g, "\n#else\n\n"); fprintf(g, "extern InfTag tag_tbl[];\n"); fprintf(g, "\n#endif\n"); fprintf(g, "\n\n /*--- End Tag Generation ---*/\n\n"); } /*-------------------------------------------------------------------------* * GENERATE_STACKS * * * * stack description: * * @stack name default_size stack_top_macro * *-------------------------------------------------------------------------*/ void Generate_Stacks(FILE *f, FILE *g) { char str[STR_LENGTH]; char *p1, *p2; int i; StackInf stack[128]; int nb_stack = 0; for (;;) { if (feof(f) || !fgets(str, sizeof(str), f)) Fatal_Error("Syntax error: end expected for @begin stack"); if (*str != '@') { if (*str != '\n') fputs(str, g); continue; } strcpy(save_str, str); p1 = Read_Identifier(str + 1, 1, &p2); if (strcmp(p1, "end") == 0) break; if (strcmp(p1, "stack") == 0) { strcpy(stack[nb_stack].name, Read_Identifier(p2 + 1, 1, &p2)); i = Read_Integer(p2 + 1, &p2); stack[nb_stack].def_size = i * 1024 / sizeof(long); strcpy(stack[nb_stack].top_macro, Read_Identifier(p2 + 1, 1, &p2)); nb_stack++; continue; } Fatal_Error("Syntax error: incorrect @ declaration in: %s", save_str); } fprintf(g, "\n\n /*--- Begin Stack Generation ---*/\n\n"); fprintf(g, "#define NB_OF_STACKS \t\t%d\n\n", nb_stack); for (i = 0; i < nb_stack; i++) { strcpy(str, stack[i].name); *str = toupper(*str); fprintf(g, "#define %s_Stack \t(stk_tbl[%d].stack)\n", str, i); fprintf(g, "#define %s_Size \t(stk_tbl[%d].size)\n", str, i); fprintf(g, "#define %s_Offset(adr) \t((WamWord *)(adr) - %s_Stack)\n", str, str); fprintf(g, "#define %s_Used_Size \t%s_Offset(%s)\n\n", str, str, stack[i].top_macro); } fprintf(g, "\n#define Stack_Top(s) \t("); for (i = 0; i < nb_stack - 1; i++) fprintf(g, "((s) == %d) ? %s : ", i, stack[i].top_macro); fprintf(g, "%s)\n", stack[nb_stack - 1].top_macro); fprintf(g, "\ntypedef struct\n"); fprintf(g, "{\n"); fprintf(g, " char *name;\n"); fprintf(g, " char *env_var_name;\n"); fprintf(g, " long *p_def_size;\n"); fprintf(g, " int default_size; \t/* in WamWords */\n"); fprintf(g, " int size; \t/* in WamWords */\n"); fprintf(g, " WamWord *stack;\n"); fprintf(g, "}InfStack;\n\n\n"); fprintf(g, "#ifdef ENGINE_FILE\n\n"); fprintf(g, " /* these variables can be overwritten by top_comp.c (see stack size file) */\n"); for (i = 0; i < nb_stack; i++) fprintf(g, "long def_%s_size;\n", stack[i].name); fprintf(g, "long fixed_sizes;\n\n"); fprintf(g, "InfStack stk_tbl[] =\n{\n"); for (i = 0; i < nb_stack; i++) { strcpy(str, stack[i].name); for (p1 = str; *p1; p1++) *p1 = toupper(*p1); fprintf(g, " { \"%s\", \"%sSZ\", &def_%s_size, %d, 0, NULL }%s", stack[i].name, str, stack[i].name, stack[i].def_size, (i < nb_stack - 1) ? ",\n" : "\n};\n"); } fprintf(g, "\n#else\n\n"); for (i = 0; i < nb_stack; i++) fprintf(g, "extern long def_%s_size;\n", stack[i].name); fprintf(g, "extern long fixed_sizes;\n\n\n"); fprintf(g, "extern InfStack stk_tbl[];\n"); fprintf(g, "\n#endif\n"); fprintf(g, "\n\n /*--- End Stack Generation ---*/\n\n"); } /*-------------------------------------------------------------------------* * FATAL_ERROR * * * *-------------------------------------------------------------------------*/ void Fatal_Error(char *format, ...) { va_list arg_ptr; va_start(arg_ptr, format); vfprintf(stderr, format, arg_ptr); va_end(arg_ptr); fprintf(stderr, "\n"); exit(1); } ./gprolog-1.3.0/src/EnginePl/arch_dep.h0000644004425400513100000001646010547154141016210 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : configuration * * File : arch_dep.h * * Descr.: architecture dependent features - Header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: arch_dep.h,v 1.14 2007/01/04 10:35:13 diaz Exp $ */ #ifndef _ARCH_DEP_H #define _ARCH_DEP_H #if defined(_WIN32) && !defined(__CYGWIN__) /* There are 2 kinds of MSVC warning C4996 one wants to remove: * 1) XXX was declared deprecated ... This function or variable may be unsafe * solution: #define _CRT_SECURE_NO_DEPRECATE 1 * 2) The POSIX name for this item is deprecated * solution: #define _CRT_NONSTDC_NO_DEPRECATE 1 * However, these defines only work if they are before any #include <...> * So: pass to cl: -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE * or deactivate the warning with the following pragma. We do both ! */ #ifdef _MSC_VER #pragma warning(disable : 4996) #endif #define MAXPATHLEN 1024 #define SIGQUIT SIGTERM #define fdopen _fdopen #define dup _dup #define dup2 _dup2 #define getcwd _getcwd #define chdir _chdir #define close _close #define pclose _pclose #define popen _popen #define pclose _pclose #define getpid _getpid #define strcasecmp stricmp #define strncasecmp strnicmp #define unlink _unlink #define tzset _tzset #define access _access #ifndef F_OK #define F_OK 00 #define W_OK 02 #define R_OK 04 #define X_OK F_OK #endif #ifndef S_ISDIR #define S_ISDIR(m) (((m)&_S_IFMT) == _S_IFDIR) #define S_ISCHR(m) (((m)&_S_IFMT) == _S_IFCHR) #define S_ISFIFO(m) (((m)&_S_IFMT) == _S_IFIFO) #define S_ISREG(m) (((m)&_S_IFMT) == _S_IFREG) #endif #ifndef S_IRUSR #define S_IRUSR _S_IREAD #define S_IWUSR _S_IWRITE #define S_IXUSR _S_IEXEC #endif #define DIR_SEP_S "\\" #define DIR_SEP_C '\\' #else #define DIR_SEP_S "/" #define DIR_SEP_C '/' #endif /* defined(_WIN32) && !defined(__CYGWIN__) */ #if defined(M_ix86_cygwin) || defined(M_ix86_sco) #define Set_Line_Buf(s) setvbuf(s, NULL, _IOLBF, 0) #elif defined(_WIN32) #define Set_Line_Buf(s) setbuf(s, NULL) #else #define Set_Line_Buf(s) setlinebuf(s) #endif #ifndef NO_USE_GUI_CONSOLE #define W32_GUI_CONSOLE #endif #ifdef M_sparc_sunos #define __USE_FIXED_PROTOTYPES__ #endif #if defined(M_ix86_sco) #ifndef MAXPATHLEN #define MAXPATHLEN 1024 #endif #endif #if !defined(_WIN32) && !defined(__unix__) #define __unix__ #endif #ifndef HAVE_FGETC #define fgetc getc #endif /* Fast call macros */ #if defined(M_ix86) /* FC_MAX_ARGS_IN_REGS can be decreased (0, 1, 2) - but the inline_asm_data * is compiled with 3, if changed, change inlined code in mapper */ #define COULD_COMPILE_FOR_FC #ifdef __GNUC__ #define FC_MAX_ARGS_IN_REGS 3 #define FC_SET_OF_REGISTERS { "%eax", "%edx", "%ecx" }; #define FC_ATTRIB __attribute__((regparm(FC_MAX_ARGS_IN_REGS))) #elif 0 /* under MSVC++ we can use __fastcall convention (#elif 1 if wanted) */ /* see file ix86_any.c to see why it is not selected by default */ #define FC_MAX_ARGS_IN_REGS 2 #define FC_SET_OF_REGISTERS { "%ecx", "%edx" }; #define FC_ATTRIB __fastcall #else #define FC_MAX_ARGS_IN_REGS 0 #define FC_SET_OF_REGISTERS { NULL }; #define FC_ATTRIB #endif #endif #if !defined(NO_USE_FAST_CALL) && defined(FC_ATTRIB) #define FC_USED_TO_COMPILE_CORE #ifndef FC /* to compile Ma2Asm/check.c without FC */ #define FC FC_ATTRIB #endif #else #define FC #endif /* Win32 SEH macros */ #if defined(_WIN32) || defined(__CYGWIN__) /* from MSVC++ windows.h + renaming */ typedef enum { ExceptContinueExecution, ExceptContinueSearch, ExceptNestedException, ExceptCollidedUnwind } EXCEPT_DISPOSITION; typedef struct _excp_lst { struct _excp_lst *chain; EXCEPT_DISPOSITION (*handler)(); } excp_lst; #ifdef __GNUC__ # define SEH_PUSH(new_handler) \ { \ excp_lst e; \ EXCEPT_DISPOSITION new_handler(); \ e.handler = new_handler; \ asm("movl %%fs:0,%0" : "=r" (e.chain)); \ asm("movl %0,%%fs:0" : : "r" (&e)); # define SEH_POP \ asm("movl %0,%%fs:0" : : "r" (e.chain)); \ } #elif defined(_MSC_VER) # define SEH_PUSH(new_handler) \ { \ excp_lst e; \ EXCEPT_DISPOSITION new_handler(); \ e.handler = new_handler; \ __asm push eax \ __asm mov eax,dword ptr fs:[0] \ __asm mov dword ptr [e.chain],eax \ __asm lea eax,[e] \ __asm mov dword ptr fs:[0],eax \ __asm pop eax # define SEH_POP \ __asm push eax \ __asm mov eax,dword ptr [e.chain] \ __asm mov dword ptr fs:[0],eax \ __asm pop eax \ } #elif defined(__LCC__) /* below in movl %eax,%e and movel %e,%eax %e should be %e.chain the lcc asm does not support it. Here %e works since chain is the 1st field */ # define SEH_PUSH(new_handler) \ { \ excp_lst e; \ EXCEPT_DISPOSITION new_handler(); \ e.handler = new_handler; \ _asm("pushl %eax"); \ _asm("movl %fs:0,%eax"); \ _asm("movl %eax,%e"); \ _asm("leal %e,%eax"); \ _asm("movl %eax,%fs:0"); \ _asm("popl %eax"); # define SEH_POP \ _asm("pushl %eax"); \ _asm("movl %e,%eax"); \ _asm("movl %eax,%fs:0"); \ _asm("popl %eax"); \ } #else # error macros SEH_PUSH/POP undefined for this compiler #endif #endif /* defined(_WIN32) || defined(__CYGWIN__) */ #endif /* !_ARCH_DEP_H */ ./gprolog-1.3.0/src/EnginePl/machine1.c0000644004425400513100000007006310547154141016122 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine + Compiler * * File : machine1.c * * Descr.: machine dependent features * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: machine1.c,v 1.18 2007/01/04 10:35:13 diaz Exp $ */ #include #include #include #include #include #include "gp_config.h" #include "bool.h" #if 0 #define USE_ALONE #define DEBUG #if 0 #define USE_W32_GUI_CONSOLE #endif #endif #if defined(__unix__) || defined(__CYGWIN__) #include #include #include #include #include #include #include #else #include #include #include #include #endif #ifdef __CYGWIN__ #include #endif #define MACHINE1_FILE #include "machine1.h" #ifdef USE_W32_GUI_CONSOLE #include "../Linedit/linedit.h" #define printf LE_Printf #endif /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ #if defined(_WIN32) && !defined(CYGWIN) static Bool Get_Windows_OS_Name(char *buff); #endif /*-------------------------------------------------------------------------* * INIT_MACHINE1 * * * *-------------------------------------------------------------------------*/ void Init_Machine1(void) { #if defined(__unix__) || defined(__CYGWIN__) struct utsname uname_info; m_os_type = M_OS_UNIX; if (uname(&uname_info) < 0) { strcpy(m_architecture, "unknown architecture"); strcpy(m_os_version, "unknown OS version"); return; } strcpy(m_architecture, uname_info.machine); sprintf(m_os_version, "%s %s", uname_info.sysname, uname_info.release); #else SYSTEM_INFO si; GetSystemInfo(&si); if (si.wProcessorLevel >= 3 && si.wProcessorLevel < 10) sprintf(m_architecture, "i%c86", si.wProcessorLevel + '0'); else sprintf(m_architecture, "i%ld", si.dwProcessorType); m_os_type = M_OS_WINDOWS; if (!Get_Windows_OS_Name(m_os_version)) strcpy(m_os_version, "unknown OS version"); #endif } #if defined(_WIN32) && !defined(__CYGWIN__) /*-------------------------------------------------------------------------* * GET_WINDOWS_OS_NAME * * * * code obtained from * * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ * * sysinfo/base/getting_the_system_version.asp * * then: * * 1) indent (with .indent.pro in src or with -gnu -bap -npcs) * * 2) replace "int main()" by "static Bool Get_Windows_OS_Name(char *buff)"* * 3) replace "printf(" by "buff += sprintf(buff, " * * 4) replace "\n" by "" * * 5) after "case VER_PLATFORM_WIN32_NT:" add * * m_os_type = M_OS_WINDOWS_NT; * * 6) fix warnings %d -> %ld * *-------------------------------------------------------------------------*/ static Bool Get_Windows_OS_Name(char *buff) { OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; // Try calling GetVersionEx using the OSVERSIONINFOEX structure. // If that fails, try using the OSVERSIONINFO structure. ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *) & osvi))) { osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (!GetVersionEx((OSVERSIONINFO *) & osvi)) return FALSE; } switch (osvi.dwPlatformId) { // Test for the Windows NT product family. case VER_PLATFORM_WIN32_NT: m_os_type = M_OS_WINDOWS_NT; // Test for the specific product family. if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) buff += sprintf(buff, "Microsoft Windows Server 2003 family, "); if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) buff += sprintf(buff, "Microsoft Windows XP "); if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) buff += sprintf(buff, "Microsoft Windows 2000 "); if (osvi.dwMajorVersion <= 4) buff += sprintf(buff, "Microsoft Windows NT "); #ifdef VER_SUITE_BLADE /* for old Win32 headers */ // Test for specific product on Windows NT 4.0 SP6 and later. if (bOsVersionInfoEx) { // Test for the workstation type. if (osvi.wProductType == VER_NT_WORKSTATION) { if (osvi.dwMajorVersion == 4) buff += sprintf(buff, "Workstation 4.0 "); else if (osvi.wSuiteMask & VER_SUITE_PERSONAL) buff += sprintf(buff, "Home Edition "); else buff += sprintf(buff, "Professional "); } // Test for the server type. else if (osvi.wProductType == VER_NT_SERVER) { if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) { if (osvi.wSuiteMask & VER_SUITE_DATACENTER) buff += sprintf(buff, "Datacenter Edition "); else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) buff += sprintf(buff, "Enterprise Edition "); else if (osvi.wSuiteMask == VER_SUITE_BLADE) buff += sprintf(buff, "Web Edition "); else buff += sprintf(buff, "Standard Edition "); } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) { if (osvi.wSuiteMask & VER_SUITE_DATACENTER) buff += sprintf(buff, "Datacenter Server "); else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) buff += sprintf(buff, "Advanced Server "); else buff += sprintf(buff, "Server "); } else // Windows NT 4.0 { if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) buff += sprintf(buff, "Server 4.0, Enterprise Edition "); else buff += sprintf(buff, "Server 4.0 "); } } } else // Test for specific product on Windows NT 4.0 SP5 and earlier { #define BUFSIZE 80 HKEY hKey; char szProductType[BUFSIZE]; DWORD dwBufLen = BUFSIZE; LONG lRet; lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &hKey); if (lRet != ERROR_SUCCESS) return FALSE; lRet = RegQueryValueEx(hKey, "ProductType", NULL, NULL, (LPBYTE) szProductType, &dwBufLen); if ((lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE)) return FALSE; RegCloseKey(hKey); if (lstrcmpi("WINNT", szProductType) == 0) buff += sprintf(buff, "Workstation "); if (lstrcmpi("LANMANNT", szProductType) == 0) buff += sprintf(buff, "Server "); if (lstrcmpi("SERVERNT", szProductType) == 0) buff += sprintf(buff, "Advanced Server "); buff += sprintf(buff, "%ld.%ld ", osvi.dwMajorVersion, osvi.dwMinorVersion); } #endif // Display service pack (if any) and build number. if (osvi.dwMajorVersion == 4 && lstrcmpi(osvi.szCSDVersion, "Service Pack 6") == 0) { HKEY hKey; LONG lRet; // Test for SP6 versus SP6a. lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009", 0, KEY_QUERY_VALUE, &hKey); if (lRet == ERROR_SUCCESS) buff += sprintf(buff, "Service Pack 6a (Build %ld)", osvi.dwBuildNumber & 0xFFFF); else // Windows NT 4.0 prior to SP6a { buff += sprintf(buff, "%s (Build %ld)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF); } RegCloseKey(hKey); } else // Windows NT 3.51 and earlier or Windows 2000 and later { buff += sprintf(buff, "%s (Build %ld)", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF); } break; // Test for the Windows 95 product family. case VER_PLATFORM_WIN32_WINDOWS: if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) { buff += sprintf(buff, "Microsoft Windows 95 "); if (osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B') buff += sprintf(buff, "OSR2 "); } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) { buff += sprintf(buff, "Microsoft Windows 98 "); if (osvi.szCSDVersion[1] == 'A') buff += sprintf(buff, "SE "); } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) { buff += sprintf(buff, "Microsoft Windows Millennium Edition"); } break; case VER_PLATFORM_WIN32s: buff += sprintf(buff, "Microsoft Win32s"); break; } return TRUE; } #endif /*-------------------------------------------------------------------------* * M_CREATE_SHELL_COMMAND * * * * Create a shell command if != NULL (or else a shell invocation) * *-------------------------------------------------------------------------*/ char ** M_Create_Shell_Command(char *cmd) { static char *arg[4]; char *p; #if defined(__unix__) || defined(__CYGWIN__) arg[0] = ((p = getenv("SHELL")) != NULL) ? p : "/bin/sh"; arg[1] = "-c"; #else arg[0] = ((p = getenv("COMSPEC")) != NULL) ? p : (m_os_type == M_OS_WINDOWS_NT) ? "cmd.exe" : "c:\\command.com"; arg[1] = "/c"; #endif if (cmd) { arg[2] = cmd; arg[3] = NULL; } else arg[1] = NULL; return arg; } /*-------------------------------------------------------------------------* * M_CMD_LINE_TO_ARGV * * * *-------------------------------------------------------------------------*/ char ** M_Cmd_Line_To_Argv(char *cmd, int *argc) { static char **arg = NULL; static int nb_arg = 0; char *p = cmd; int i = 0; for (;;) { while (*p == ' ' || *p == '\t') p++; if (*p == '\0') break; if (i >= nb_arg) { nb_arg += 64; arg = (arg == NULL) ? malloc(nb_arg * sizeof(char *)) : realloc(arg, nb_arg * sizeof(char *)); } arg[i++] = p; while (*p != ' ' && *p != '\t' && *p != '\0') { if (*p == '"') { do p++; while (*p != '"' && *p != '\0'); if (*p == '"') p++; } else p++; } if (*p == '\0') break; *p++ = '\0'; } arg[i] = NULL; if (argc != NULL) *argc = i; return arg; } /*-------------------------------------------------------------------------* * M_SHELL * * * * Invoke a shell (eventually passing a cmd if != NULL) * *-------------------------------------------------------------------------*/ int M_Shell(char *cmd) { return M_Spawn(M_Create_Shell_Command(cmd)); } /*-------------------------------------------------------------------------* * M_SPAWN * * * * Execute a command with arguments in arg[], (arg[0]=the name of the cmd) * * a NULL must follow the last argument. * * if arg[1]==(char *) 1 then arg[0] is considered as a command-line. * * return the status or -1 if cannot execute (errno is set) or -2 else * * (errno is not set). * *-------------------------------------------------------------------------*/ int M_Spawn(char *arg[]) { #if defined(__unix__) int pid; fflush(stdout); fflush(stderr); if (arg[1] == (char *) 1) arg = M_Cmd_Line_To_Argv(arg[0], NULL); pid = fork(); if (pid == -1) return -1; if (pid == 0) /* child process */ { execvp(arg[0], arg); /* only returns on error */ exit((errno == ENOENT || errno == ENOTDIR) ? 126 : 127); } return M_Get_Status(pid); #else #if defined(_MSC_VER) _flushall(); #endif if (arg[1] == (char *) 1) arg = M_Cmd_Line_To_Argv(arg[0], NULL); return spawnvp(_P_WAIT, arg[0], (const char *const *) arg); #endif } /*-------------------------------------------------------------------------* * M_SPAWN_REDIRECT * * * * Execute a command with arguments in arg[], (arg[0]=the name of the cmd) * * a NULL must follow the last argument. * * if arg[1]==(char *) 1 then arg[0] is considered as a command-line. * * detach: 1 for a detached process (cannot obtain its status then). * * f_in, f_out, f_err: ptrs to FILE * vars. if NULL not redirected, * * f_out==f_err the 2 output streams are merged in f_out. * * In case of error return -1 if errno is set or else -2. * * In case of success, return 0 if detached or the pid else (the function * * M_Get_Status() should be called later to avoid zombie processes). * *-------------------------------------------------------------------------*/ int M_Spawn_Redirect(char *arg[], int detach, FILE **f_in, FILE **f_out, FILE **f_err) { #if defined(__unix__ ) || defined(__CYGWIN__) int pipe_in[2], pipe_out[2], pipe_err[2]; int pid, status; fflush(stdout); fflush(stderr); if (arg[1] == (char *) 1) arg = M_Cmd_Line_To_Argv(arg[0], NULL); if ((f_in && pipe(pipe_in)) || (f_out && pipe(pipe_out)) || (f_err && f_err != f_out && pipe(pipe_err))) goto err; pid = (int) fork(); if (pid == -1) goto err; if (pid == 0) /* the child process */ { if (!detach || fork() == 0) /* pid needed ? */ { /* nested fork to detach exec process to avoid zombie process */ if (f_in && (close(pipe_in[1]) || (pipe_in[0] != 0 && (dup2(pipe_in[0], 0) == -1 || close(pipe_in[0]))))) goto err; if (f_out && (close(pipe_out[0]) || (pipe_out[1] != 1 && (dup2(pipe_out[1], 1) == -1 || close(pipe_out[1]))))) goto err; if (f_err) { if (f_err != f_out) { if (close(pipe_err[0]) || (pipe_err[1] != 2 && (dup2(pipe_err[1], 2) == -1 || close(pipe_err[1])))) goto err; } else if (dup2(1, 2) == -1) goto err; } execvp(arg[0], arg); /* only returns on error */ #ifdef DEBUG DBGPRINTF("ERROR EXEC errno=%d\n", errno); #endif exit((errno == ENOENT || errno == ENOTDIR) ? 126 : 127); } else exit(0); /* detatch: terminate child */ } if (detach) /* wait child termination */ { if (waitpid(pid, &status, 0) < 0) goto err; pid = 0; } if (f_in && (close(pipe_in[0]) || (*f_in = fdopen(pipe_in[1], "wt")) == NULL)) goto err; if (f_out && (close(pipe_out[1]) || (*f_out = fdopen(pipe_out[0], "rt")) == NULL)) goto err; if (f_err && f_err != f_out && (close(pipe_err[1]) || (*f_err = fdopen(pipe_err[0], "rt")) == NULL)) goto err; return pid; /* NB: if detach: pid = 0 */ err: return -1; #else int status; SECURITY_ATTRIBUTES sa = { 0 }; STARTUPINFO si = { 0 }; PROCESS_INFORMATION pi = { 0 }; HANDLE pipe_in_r = NULL; HANDLE pipe_in_w = NULL; HANDLE pipe_out_r = NULL; HANDLE pipe_out_w = NULL; HANDLE pipe_err_r = NULL; HANDLE pipe_err_w = NULL; static char buff[4096]; char *cmd, *p; static char delim[2] = { '\0', '\0' }; int i, n; sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; if ((f_in && !CreatePipe(&pipe_in_r, &pipe_in_w, &sa, 0)) || (f_out && !CreatePipe(&pipe_out_r, &pipe_out_w, &sa, 0)) || (f_err && f_err != f_out && !CreatePipe(&pipe_err_r, &pipe_err_w, &sa, 0))) goto unknown_err; si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; si.hStdInput = (f_in) ? pipe_in_r : GetStdHandle(STD_INPUT_HANDLE); si.hStdOutput = (f_out) ? pipe_out_w : GetStdHandle(STD_OUTPUT_HANDLE); si.hStdError = (f_err) ? ((f_err == f_out) ? pipe_out_w : pipe_err_w) : GetStdHandle(STD_ERROR_HANDLE); if (arg[1] == NULL || arg[1] == (char *) 1) cmd = arg[0]; else { for (n = i = 0; arg[i]; i++) { *delim = '\0'; for (p = arg[i]; *p; p++) if (*p == ' ' || *p == '\t') { *delim = '"'; break; } n += sprintf(buff + n, "%s%s%s ", delim, arg[i], delim); } buff[n - 1] = '\0'; cmd = buff; } #ifdef DEBUG DBGPRINTF(" cmd=<%s>\n", cmd); #endif if (!CreateProcess(NULL, cmd, NULL, NULL, TRUE, (detach) ? DETACHED_PROCESS : 0, NULL, NULL, &si, &pi)) { status = GetLastError(); #ifdef DEBUG DBGPRINTF("ERROR from Create_Process=%d\n", status); #endif if (status == ERROR_FILE_NOT_FOUND || status == ERROR_PATH_NOT_FOUND) { errno = ENOENT; goto err; } goto unknown_err; } if ((f_in && !CloseHandle(pipe_in_r)) || (f_out && !CloseHandle(pipe_out_w)) || (f_err && f_err != f_out && !CloseHandle(pipe_err_w))) goto unknown_err; if (f_in && (*f_in = fdopen(_open_osfhandle((long) pipe_in_w, _O_TEXT), "wt")) == NULL) goto err; if (f_out && (*f_out = fdopen(_open_osfhandle((long) pipe_out_r, _O_TEXT), "rt")) == NULL) goto err; if (f_err && f_err != f_out && (*f_err = fdopen(_open_osfhandle((long) pipe_err_r, _O_TEXT), "rt")) == NULL) goto err; return (detach) ? 0 : (int) pi.hProcess; err: return -1; unknown_err: return -2; #endif } /*-------------------------------------------------------------------------* * M_GET_STATUS * * * *-------------------------------------------------------------------------*/ int M_Get_Status(int pid) { int status; #if defined(__unix__) || defined(__CYGWIN__) if (waitpid(pid, &status, 0) < 0) return -1; if (WIFEXITED(status)) { status = WEXITSTATUS(status); if (status == 127) status = -2; else if (status == 126) { status = -1; errno = ENOENT; } } #elif defined(_WIN32) WaitForSingleObject((HANDLE) pid, INFINITE); if (!GetExitCodeProcess((HANDLE) pid, (LPDWORD) &status)) status = -2; CloseHandle((HANDLE) pid); #endif return status; } /*-------------------------------------------------------------------------* * M_MKTEMP * * * *-------------------------------------------------------------------------*/ char * M_Mktemp(char *tmpl) { /* redefined to avoid link warning */ #if defined(__unix__) || defined(__CYGWIN__) /* this code comes from glibc */ int len; char *XXXXXX; static unsigned long value; int count; struct stat buf; static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; #ifndef TMP_MAX #define TMP_MAX 238328 #endif len = strlen (tmpl); if (len < 6 || strcmp(&tmpl[len - 6], "XXXXXX")) { errno = EINVAL; return NULL; } /* This is where the Xs start. */ XXXXXX = &tmpl[len - 6]; value += (unsigned long) time(NULL) ^ getpid(); for (count = 0; count < TMP_MAX; value += 7777, ++count) { unsigned long v = value; /* Fill in the random bits. */ XXXXXX[0] = letters[v % 62]; v /= 62; XXXXXX[1] = letters[v % 62]; v /= 62; XXXXXX[2] = letters[v % 62]; v /= 62; XXXXXX[3] = letters[v % 62]; v /= 62; XXXXXX[4] = letters[v % 62]; v /= 62; XXXXXX[5] = letters[v % 62]; if (lstat(tmpl, &buf) < 0) { if (errno == ENOENT) { errno = 0; return tmpl; } else /* Give up now. */ return NULL; } } /* We got out of the loop because we ran out of combinations to try. */ errno = EEXIST; return NULL; #else errno = 0; return mktemp(tmpl); #endif } /*-------------------------------------------------------------------------* * M_TEMPNAM * * * *-------------------------------------------------------------------------*/ char * M_Tempnam(char *dir, char *pfx) { #if defined(__unix__) || defined(__CYGWIN__) /* this code comes from glibc */ char tmpl[MAXPATHLEN]; char *d; int dlen, plen; struct stat buf; #ifndef P_tmpdir #define P_tmpdir "/tmp" #endif #define Dir_Exists(dir) (stat(dir, &buf) == 0 && S_ISDIR (buf.st_mode)) if (!pfx || !pfx[0]) { pfx = "file"; plen = 4; } else { plen = strlen(pfx); if (plen > 5) plen = 5; } d = getenv("TMPDIR"); if (d != NULL && Dir_Exists(d)) dir = d; else if (dir != NULL && Dir_Exists(dir)) /* nothing */ ; else dir = NULL; if (dir == NULL) { if (Dir_Exists(P_tmpdir)) dir = P_tmpdir; else if (strcmp(P_tmpdir, "/tmp") != 0 && Dir_Exists("/tmp")) dir = "/tmp"; else { errno = ENOENT; return NULL; } } dlen = strlen(dir); while (dlen > 1 && dir[dlen - 1] == '/') dlen--; /* remove trailing slashes */ /* check we have room for "${dir}/${pfx}XXXXXX\0" */ if (MAXPATHLEN < dlen + 1 + plen + 6 + 1) { errno = EINVAL; return NULL; } sprintf(tmpl, "%.*s/%.*sXXXXXX", dlen, dir, plen, pfx); d = M_Mktemp(tmpl); if (d) d = strdup(d); return d; #else errno = 0; return tempnam(dir, pfx); #endif } #ifdef USE_ALONE /*-------------------------------------------------------------------------* * MAIN * * * * to compile alone active USE_ALONE and simply compile this file. * * Under Win32 to also test with the GUI Console active USE_W32_GUI_CONSOLE* * and compile with gplc machine1.c or gplc machine1.c --gui-console * * WIN32 WARNING: it seems that the executable file name must be at least 2* * characters long (e.g. x.exe is not OK but xx.exe yes). * *-------------------------------------------------------------------------*/ #if defined(__unix__) || defined(__CYGWIN__) #define PREFIX_DIR #else #define PREFIX_DIR "c:\\cygwin\\bin\\" #endif #define READ(str, f) \ { \ char buff[1024]; \ \ DBGPRINTF("\n Reading redirected %s\n", str); \ while (fgets(buff, sizeof(buff), f)) \ { \ if (buff[strlen(buff) - 1] == '\n') \ buff[strlen(buff) - 1] = '\0'; \ DBGPRINTF(" <%s>\n", buff); \ if (feof(f)) \ break; \ } \ fclose(f); \ DBGPRINTF(" End reading redirected %s\n", str); \ } #define CHECK(pid) \ { \ if (pid == -1) \ { \ DBGPRINTF(" ERROR executing Spawn: errno=%d\n", errno); \ exit(1); \ } \ if (pid == -2) \ { \ DBGPRINTF("ERROR executing Spawn: unknown error\n"); \ exit(1); \ } \ DBGPRINTF(" pid=%d (%x)\n", pid, pid); \ } #define STAT(pid) \ { \ int status = M_Get_Status(pid); \ STATUS(status) \ } #define STATUS(status) \ { \ DBGPRINTF(" status=%d", status); \ if (status == -1) \ DBGPRINTF(" errno=%d", errno); \ DBGPRINTF("\n\n"); \ } #if 1 #define COMMAND \ strcpy(buff, PREFIX_DIR "bc --q"); /* should be modifiable */ \ arg[0] = buff; \ arg[1] = (char *) 1; #else #define COMMAND arg[0]=PREFIX_DIR "bc"; \ arg[1]="-q"; \ arg[2]=NULL; #endif #define CDE_STRING "1+255\n$foo\n2^10\nquit\n" #define CDE_INPUT fprintf(i, CDE_STRING); fclose(i); #if 0 #define POLL #include #endif #ifdef POLL { int fd = fileno(i); struct pollfd ufd = { fd, 7, 0 }; int r = poll(&ufd, 1, 100); DBGPRINTF("poll ret:%d on fd %d returned events :%x\n", r, fd, ufd.revents); return 0; } #endif int main(int argc, char *argv[]) { FILE *i, *o, *e; int pid, status; char *arg[10]; char buff[256]; Init_Machine1(); printf("OS used:%s\n", m_os_version); #if defined(_MSC_VER) setbuf(stdout, NULL); setbuf(stderr, NULL); #endif #ifdef USE_W32_GUI_CONSOLE { char buff[100]; DBGPRINTF("HELLO World\n"); LE_Gets(buff); } #endif #if 1 if (argc > 1) { DBGPRINTF("1- Executing from argv[1]...=%s... no redirect\n", argv[1]); pid = M_Spawn_Redirect(argv + 1, 0, NULL, NULL, NULL); CHECK(pid); STAT(pid); DBGPRINTF("1b- Executing from argv[1]...=%s... Spawn\n", argv[1]); status = M_Spawn(argv + 1); STATUS(status); } else DBGPRINTF("1- Executing from argv[1] - ignored\n"); #endif #if 1 DBGPRINTF("2- Executing uname -a with redirected output\n"); strcpy(buff, PREFIX_DIR "uname -a"); /* should be modifiable */ arg[0] = buff; arg[1] = (char *) 1; pid = M_Spawn_Redirect(arg, 0, NULL, &o, NULL); CHECK(pid); READ("output", o); STAT(pid); #endif COMMAND; DBGPRINTF("Command is: %s with following input:\n" CDE_STRING, arg[0]); DBGPRINTF("--- end of input\n"); #if 1 DBGPRINTF("3- command with redirected input\n"); COMMAND; pid = M_Spawn_Redirect(arg, 0, &i, NULL, NULL); CHECK(pid); CDE_INPUT; STAT(pid); #endif #if 1 DBGPRINTF("4- command with redirected input and output\n"); COMMAND; pid = M_Spawn_Redirect(arg, 0, &i, &o, NULL); CHECK(pid); CDE_INPUT; READ("output", o); STAT(pid); #endif #if 1 DBGPRINTF("5- command with redirected input output and error\n"); COMMAND; pid = M_Spawn_Redirect(arg, 0, &i, &o, &e); CHECK(pid); CDE_INPUT; READ("output", o); READ("error", e); STAT(pid); #endif #if 1 DBGPRINTF("6- command with redirected input and output=error\n"); COMMAND; pid = M_Spawn_Redirect(arg, 0, &i, &o, &o); CHECK(pid); CDE_INPUT; READ("output/error", o); STAT(pid); #endif #ifdef USE_W32_GUI_CONSOLE { /* for W32GUICons */ char buff[100]; DBGPRINTF("Terminated - press ENTER\n"); LE_Gets(buff); } #endif return 0; } #endif /* USE_ALONE */ ./gprolog-1.3.0/src/EnginePl/oper.h0000644004425400513100000000674710547154141015417 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : oper.h * * Descr.: operator table management - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: oper.h,v 1.10 2007/01/04 10:35:13 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ #define MAX_PREC 1200 #define MAX_ARG_OF_FUNCTOR_PREC 999 #define Make_Oper_Key(a, t) (((unsigned long) (a) << 2) | (t)) #define Atom_Of_Oper(k) ((unsigned long) (k) >> 2) #define Type_Of_Oper(k) ((unsigned long) (k) & 3) /* operator type */ #define PREFIX 0 #define POSTFIX 1 #define INFIX 2 #define Make_Op_Mask(type) (1<<(type)) /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct /* Operator information */ { /* ------------------------------ */ long a_t; /* key is */ int prec; /* precedence of the operator */ int left; /* precedence of the operator lhs */ int right; /* precedence of the operator rhs */ } OperInf; /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef OPER_FILE char *oper_tbl; #else extern char *oper_tbl; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Init_Oper(void); OperInf *Create_Oper(int atom_op, int type, int prec, int left, int right); OperInf *Lookup_Oper(int atom_op, int type); OperInf *Lookup_Oper_Any_Type(int atom_op); OperInf *Delete_Oper(int atom_op, int type); #define Check_Oper(atom_op, type) \ (atom_tbl[(atom_op)].prop.op_mask & Make_Op_Mask(type)) #define Check_Oper_Any_Type(atom_op) \ (atom_tbl[(atom_op)].prop.op_mask) ./gprolog-1.3.0/src/EnginePl/atom.c0000644004425400513100000003462010547154141015374 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : atom.c * * Descr.: atom table management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: atom.c,v 1.13 2007/01/04 10:35:13 diaz Exp $ */ #include #include #include #include #include #define ATOM_FILE #include "engine_pl.h" #ifndef NO_USE_LINEDIT #include "linedit.h" #endif #if 0 #define DEBUG #endif /*---------------------------------* * Constants * *---------------------------------*/ #define ERR_ATOM_TBL_FULL "Atom table full" #define ERR_ATOM_NIL_INVALID "atom: invalid ATOM_NIL (should be %d)" #define RADIX 67 #define INV_RADIX_MOD_MAX_ATOM 19563 /* see prog. euclide.c */ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ int char_type[256] = { /* nul soh stx etx eot enq ack bel bs ht nl vt np cr so si */ LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, /* dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us */ LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, LA, /* spc ! " # $ % & ' ( ) * + , - . / */ LA, SC, DQ, GR, GR, CM, GR, QT, PC, PC, GR, GR, SC, GR, GR, GR, /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ DI, DI, DI, DI, DI, DI, DI, DI, DI, DI, GR, SC, GR, GR, GR, GR, /* @ A B C D E F G H I J K L M N O */ GR, CL, CL, CL, CL, CL, CL, CL, CL, CL, CL, CL, CL, CL, CL, CL, /* P Q R S T U V W X Y Z [ \ ] ^ _ */ CL, CL, CL, CL, CL, CL, CL, CL, CL, CL, CL, PC, GR, PC, GR, UL, /* ` a b c d e f g h i j k l m n o */ BQ, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, /* p q r s t u v w x y z { | } ~ del */ SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, PC, PC, PC, GR, LA /* 0x80 ... 0xff = EX (set by Init_Atom)" */ }; char escape_symbol[] = "abfnrtv"; char escape_char[] = "\a\b\f\n\r\t\v"; static char str_char[256][2]; static int hash_weight_tbl[256]; static int hash_inv_tbl[RADIX]; static char gen_sym_buff[1024]; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static AtomInf *Locate_Atom(char *name); static int Hash_String(char *str); static char *Gen_Sym(char *prefix, int gen_sym_hash); /*-------------------------------------------------------------------------* * INIT_ATOM * * * *-------------------------------------------------------------------------*/ void Init_Atom(void) { int i, c; for (i = 0; i < 256; i++) hash_weight_tbl[i] = i % RADIX; for (i = 0; i < 10; i++) { hash_weight_tbl[i + '0'] = i; hash_inv_tbl[i] = i + '0'; } for (i = 0; i < 26; i++) { hash_weight_tbl[i + 'A'] = i + 10; hash_inv_tbl[i + 10] = i + 'A'; } for (i = 0; i < 26; i++) { hash_weight_tbl[i + 'a'] = i + 10 + 26; hash_inv_tbl[i + 10 + 26] = i + 'a'; } i = 10 + 26 + 26; hash_weight_tbl['#'] = i; hash_inv_tbl[i] = '#'; i++; hash_weight_tbl['$'] = i; hash_inv_tbl[i] = '$'; i++; hash_weight_tbl['&'] = i; hash_inv_tbl[i] = '&'; i++; hash_weight_tbl['_'] = i; hash_inv_tbl[i] = '_'; i++; hash_weight_tbl['@'] = i; hash_inv_tbl[i] = '@'; for (c = 128; c < 256; c++) { if (isalpha (c)) { i++; char_type[c] = islower(c)? SL: CL; hash_weight_tbl[c] = i; hash_inv_tbl[i] = c; } else { char_type[c] = EX; /* extended char set */ } } for (i = 0; i < 256; i++) /* initial conv mapping = identity */ char_conv[i] = i; nb_atom = 0; for (i = 0; i < 256; i++) { str_char[i][0] = i; str_char[i][1] = '\0'; #ifndef OPTIM_1_CHAR_ATOM atom_char[i] = #endif Create_Atom(str_char[i]); } i = Create_Atom("[]"); if (i != ATOM_NIL) Fatal_Error(ERR_ATOM_NIL_INVALID, i); atom_void = Create_Atom(""); atom_curly_brackets = Create_Atom("{}"); atom_false = Create_Atom("false"); atom_true = Create_Atom("true"); atom_end_of_file = Create_Atom("end_of_file"); } /*-------------------------------------------------------------------------* * CREATE_ALLOCATE_ATOM * * * *-------------------------------------------------------------------------*/ int FC Create_Allocate_Atom(char *name) { AtomInf *patom; char *name1; patom = Locate_Atom(name); if (patom == NULL) Fatal_Error(ERR_ATOM_TBL_FULL); if (patom->name != NULL) return patom - atom_tbl; /* already exists */ name1 = Strdup(name); return Create_Atom(name1); } /*-------------------------------------------------------------------------* * CREATE_ATOM * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ int FC Create_Atom(char *name) { AtomInf *patom; AtomProp prop; char *p; int c_type; int lg; Bool identifier; Bool graphic; patom = Locate_Atom(name); if (patom == NULL) Fatal_Error(ERR_ATOM_TBL_FULL); if (patom->name != NULL) return patom - atom_tbl; /* already exists */ nb_atom++; patom->name = name; prop.needs_scan = FALSE; identifier = graphic = (*name != '\0'); for (p = name; *p; p++) { c_type = char_type[(unsigned char) *p]; if ((c_type & (UL | CL | SL | DI)) == 0) identifier = FALSE; if (c_type != GR) graphic = FALSE; if ((*p != ' ' && (c_type & (QT | EX | LA))) || *p == '\\') prop.needs_scan = TRUE; } prop.length = lg = p - name; #ifndef NO_USE_LINEDIT if (lg > 1 && identifier) LE_Compl_Add_Word(name, lg); #endif if (char_type[(unsigned char) *name] != SL) /* small letter */ identifier = FALSE; if (identifier) { prop.type = IDENTIFIER_ATOM; prop.needs_quote = FALSE; goto finish; } if (graphic) { prop.type = GRAPHIC_ATOM; prop.needs_quote = (lg == 1 && *name == '.'); goto finish; } if (lg == 1 && char_type[(unsigned char) *name] == SC) { prop.type = SOLO_ATOM; prop.needs_quote = (*name == ','); goto finish; } prop.type = OTHER_ATOM; prop.needs_quote = prop.needs_scan || !(lg == 2 && ((name[0] == '[' && name[1] == ']') || (name[0] == '{' && name[1] == '}'))); finish: prop.op_mask = 0; patom->prop = prop; return patom - atom_tbl; } /*-------------------------------------------------------------------------* * CREATE_ATOM * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ WamWord FC Create_Atom_Tagged(char *name) { return Tag_ATM(Create_Atom(name)); } /*-------------------------------------------------------------------------* * FIND_ATOM * * * * return the atom key or -1 if not exist. * *-------------------------------------------------------------------------*/ int FC Find_Atom(char *name) { AtomInf *patom; patom = Locate_Atom(name); return (patom == NULL || patom->name == NULL) ? -1 : patom - atom_tbl; } /*-------------------------------------------------------------------------* * LOCATE_ATOM * * * * We use a specific hash table for atoms that cannot be extended but which* * provides a unique integer (in 0..MAX_ATOM-1) that could be used in the * * future for tagged ATM words (and for structures). * * * * return the address of the found atom (if exists) * * the address of the corresponding free cell (if not exist) * * NULL if the table is full * *-------------------------------------------------------------------------*/ static AtomInf * Locate_Atom(char *name) { int n; AtomInf *patom, *endt; if (nb_atom == MAX_ATOM) return NULL; n = Hash_String(name); /* here either the atom is in the table */ /* or there is at least one free cell. */ patom = atom_tbl + n; endt = atom_tbl + MAX_ATOM; while (patom->name && strcmp(patom->name, name) != 0) { patom++; if (patom == endt) patom = atom_tbl; } return patom; } /*-------------------------------------------------------------------------* * HASH_STRING * * * * This function computes a hash key from a string. If you modify MAX_ATOM * * or RADIX modify INV_RADIX_MOD_MAX_ATOM (see prog. euclide.c). MAX_ATOM * * must be > 255. RADIX must be a prime number <256, the current value (67)* * does not need to be modified (or else update hash_weight_tbl and * * hash_inv_tbl to control characters produced by Gen_Sym()). * *-------------------------------------------------------------------------*/ static int Hash_String(char *str) { int l = strlen(str); char *p = str + l; unsigned n = 0; #ifdef OPTIM_1_CHAR_ATOM if (l == 1) /* for 1 char strings: key = char */ return (int) ((unsigned char) (*str)); #endif while (--p >= str) n = n * RADIX + hash_weight_tbl[(unsigned char) *p]; n %= MAX_ATOM; return n; } /*-------------------------------------------------------------------------* * GEN_NEW_ATOM * * * * Find a new atom (gensym) beginning by a given prefix. * * hash<0 for any input or the index of the free atom to produce. * *-------------------------------------------------------------------------*/ int FC Gen_New_Atom(char *prefix, int hash) { AtomInf *patom; if (nb_atom == MAX_ATOM) Fatal_Error(ERR_ATOM_TBL_FULL); if (hash < 0) { patom = atom_tbl; while (patom->name) patom++; hash = patom - atom_tbl; } return Create_Allocate_Atom(Gen_Sym(prefix, hash)); } /*-------------------------------------------------------------------------* * GEN_SYM * * * * returns a string beginning by a prefix st. its hash code is gen_sym_hash* *-------------------------------------------------------------------------*/ static char * Gen_Sym(char *prefix, int gen_sym_hash) { unsigned pl = strlen(prefix); unsigned hp = Hash_String(prefix); unsigned x, i; unsigned radix_p; char *str; strcpy(gen_sym_buff, prefix); str = gen_sym_buff + pl; x = (gen_sym_hash - hp) % MAX_ATOM; radix_p = 1; /* compute 1/RADIX**pl = (1/RADIX)**pl */ for (i = 0; i < pl; i++) radix_p *= INV_RADIX_MOD_MAX_ATOM; radix_p %= MAX_ATOM; x *= radix_p; /* x = x/(RADIX**pl) */ x %= MAX_ATOM; /* decompose x wrt radix RADIX */ do { *str++ = hash_inv_tbl[x % RADIX]; x /= RADIX; } while (x); *str = '\0'; #ifdef DEBUG if (Hash_String(gen_sym_buff) != gen_sym_hash) { DBGPRINTF("Gensym prefix: (%s) wanted hash: %d\n", prefix, gen_sym_hash); DBGPRINTF(" new string: (%s) new hash: %d\n", gen_sym_buff, Hash_String(gen_sym_buff)); } #endif return gen_sym_buff; } /*-------------------------------------------------------------------------* * FIND_NEXT_ATOM * * * * returns the atom next after 'last_atom' (-1 to start) or -1 at the end * *-------------------------------------------------------------------------*/ int FC Find_Next_Atom(int last_atom) { while (++last_atom < MAX_ATOM) { if (atom_tbl[last_atom].name) return last_atom; } return -1; } ./gprolog-1.3.0/src/EnginePl/gp_config.h.in0000644004425400513100000001450610547152475017012 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : configuration * * File : gp_config.h.in * * Descr.: general configuration file (handled by autoconf) - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ #ifndef _GP_CONFIG_H #define _GP_CONFIG_H /* Define if you have sys/ioctl_compat.h */ #undef HAVE_SYS_IOCTL_COMPAT_H /* Define if you have termios.h */ #undef HAVE_TERMIOS_H /* Define if you have termio.h */ #undef HAVE_TERMIO_H /* Define if you have malloc.h */ #undef HAVE_MALLOC_H /* Define if you have a working mmap system call */ #undef HAVE_MMAP /* Define if you have a working mprotect system call */ #undef HAVE_MPROTECT /* Define if you have a mallopt function */ #undef HAVE_MALLOPT /* Define inline keyword */ #undef inline /* Define if you don't want to use machine registers */ #undef NO_USE_REGS /* Define if you don't want to use the ebp register on ix86 */ #undef NO_USE_EBP /* Define if you don't want to fast call on ix86 */ #undef NO_USE_FAST_CALL /* Define if you don't want to include line editor facility */ #undef NO_USE_LINEDIT /* Define if you don't want consult/1 launches pl2wam with pipe on its input */ #undef NO_USE_PIPED_STDIN_FOR_CONSULT /* Define if you don't want to use the win32 GUI console */ #undef NO_USE_GUI_CONSOLE /* Define if you don't want to include sockets facility */ #undef NO_USE_SOCKETS /* Define if you don't want to include the FD constraint solver */ #undef NO_USE_FD_SOLVER /* Define if the cpu is a mips */ #undef M_mips /* Define if the cpu is an alpha */ #undef M_alpha /* Define if the cpu is a sparc */ #undef M_sparc /* Define if the cpu is a ix86 */ #undef M_ix86 /* Define if the cpu is a powerpc */ #undef M_powerpc /* Define if the cpu is a x86-64 */ #undef M_x86_64 /* Define if the OS is an SGI IRIX */ #undef M_irix /* Define if the OS is an DEC OSF1 */ #undef M_osf /* Define if the OS is a sunos */ #undef M_sunos /* Define if the OS is a solaris */ #undef M_solaris /* Define if the OS is a linux */ #undef M_linux /* Define if the OS is a WinXX based on Cygwin */ #undef M_cygwin /* Define if the OS is a WIN32 */ #undef M_win32 /* Define if the OS is a SCO */ #undef M_sco /* Define if the OS is a (Free/Open/Net)BSD */ #undef M_bsd /* Define if the system is an mips/irix */ #undef M_mips_irix /* Define if the system is an alpha/linux */ #undef M_alpha_linux /* Define if the system is an alpha/OSF1 */ #undef M_alpha_osf /* Define if the system is a ix86/linux */ #undef M_ix86_linux /* Define if the system is a ix86/sco */ #undef M_ix86_sco /* Define if the system is a ix86/freebsd or openbsd or netbsd */ #undef M_ix86_bsd /* Define if the system is a ix86/cygwin */ #undef M_ix86_cygwin /* Define if the system is a ix86/mingw */ #undef M_ix86_mingw /* Define if the system is a ix86/win32 */ #undef M_ix86_win32 /* Define if the system is a ix86/darwin */ #undef M_ix86_darwin /* Define if the system is a ix86/solaris */ #undef M_ix86_solaris /* Define if the system is a sparc/solaris */ #undef M_sparc_solaris /* Define if the system is a sparc/sunos */ #undef M_sparc_sunos /* Define if the system is a sparc/bsd */ #undef M_sparc_bsd /* Define if the system is a powerpc/linux */ #undef M_powerpc_linux /* Define if the system is a powerpc/darwin */ #undef M_powerpc_darwin /* Define if the system is a powerpc/bsd */ #undef M_powerpc_bsd /* Define if the system is a x86-64/linux */ #undef M_x86_64_linux /* Constant definitions */ #define PROLOG_NAME1 any #define PROLOG_NAME any #define PROLOG_VERSION any #define PROLOG_DATE any #define PROLOG_COPYRIGHT any #define TOP_LEVEL any #define GPLC any #define HEXGPLC any #define ENV_VARIABLE any #define M_VENDOR any #define M_CPU any #define M_OS any #define CC any #define CFLAGS_PREFIX_REG any #define CFLAGS any #define CFLAGS_MACHINE any #define LDFLAGS any #define LDLIBS any #define AS any #define STRIP any #define ASM_SUFFIX any #define OBJ_SUFFIX any #define EXE_SUFFIX any #define CC_OBJ_NAME_OPT any #define CC_EXE_NAME_OPT any #define DLL_W32GUICONS any #define LIB_LINEDIT any #define LIB_ENGINE_PL any #define LIB_BIPS_PL any #define LIB_ENGINE_FD any #define LIB_BIPS_FD any #define SIZEOF_LONG any #define WORD_SIZE (8 * SIZEOF_LONG) /* Define if socklen_t is not defined */ #undef socklen_t #include "arch_dep.h" #endif /* !_GP_CONFIG_H */ ./gprolog-1.3.0/src/EnginePl/test_oc_defs.h0000644004425400513100000000137610547152475017114 0ustar diazloco#include #include #define OBJ_INIT Init_Tables #include "obj_chain.h" static char name[32]; int no; int previous; static void Init_Tables() { if (previous == 0) previous = 10000000; if (no == 0 && OBJ_NO == 1) { printf("error: objects are initialised from 1st to last (should be from last to 1st)\n" #ifdef OBJ_CHAIN_REVERSE_ORDER "un" #endif "define constant OBJ_CHAIN_REVERSE_ORDER in obj_chain.h\n"); exit(1); } if (OBJ_NO >= previous) printf("warning: object %d found after object %d - it seems order of objects is not predictible\n", OBJ_NO, previous); previous = no; no = OBJ_NO; sprintf(name, "object #%d", OBJ_NO); printf("object <%s> found &name:%p\n", name, &name); } ./gprolog-1.3.0/src/EnginePl/cpt_string.c0000644004425400513100000005723310547154141016615 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Common tool * * File : cpt_string.c * * Descr.: (longest) common prefix tree management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: cpt_string.c,v 1.10 2007/01/04 10:35:13 diaz Exp $ */ #include #include #include #if 1 #define USE_ALONE #endif #ifdef USE_ALONE #define Malloc(size) malloc(size) #define Calloc(nb, size) calloc(nb, size) #define Realloc(ptr, size) realloc(ptr, size) #define Free(ptr) free(ptr) #else #include "engine_pl.h" #endif /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct cptnode *CPTTree; typedef struct cptcell *CPTList; typedef struct cptcell { CPTTree tree; CPTList next; } CPTCell; typedef struct cptnode { char *str; int length; int end; CPTList list; } CPTNode; typedef CPTTree CPT; typedef struct { CPTTree tree; char *buff; int length; int (*fct) (); } CPTMatch; typedef struct { int nb_word; int nb_node; int nb_node2; int nb_branch; int max_branch_size; int sum_branch_size_word; int sum_branch_size; int max_word_length; int sum_word_length; int max_swrd_length; int fst_list_size; int max_list_size; int max2_list_size; int sum_list_size; } CPTStat; /*---------------------------------* * Global Variables * *---------------------------------*/ static CPTMatch match; static CPTStat stat; /*---------------------------------* * Function Prototypes * *---------------------------------*/ CPT CPT_Init(void); int CPT_Add_Word(CPT cpt, char *word, int length); static int Common_Prefix_Length(char *str1, int l1, char *str2, int l2); static CPTTree Create_Node(char *word, int length, int end, CPTList list); static CPTList Create_Cell(CPTTree tree, CPTList next); int CPT_Search_Word(CPT tree, char *word, int length); CPTMatch *CPT_Init_Match(CPT tree, char *prefix, int prefix_length, char *buff, int (*fct) ()); int CPT_Do_Match(CPTMatch *match); static int Do_Match_Rec(CPTTree tree, char *buff, int length, int (*fct) (), int no, int *cont); char *CPT_Match_Info(CPTMatch *match, int *prefix_length, int *nb_words, int *max_length); static int Match_Info_Rec(CPTTree tree, int length, int *max_length); CPTStat *CPT_Statistics(CPT tree); static void Statistics_Rec(CPT tree, int depth, int prefix_length); /*-------------------------------------------------------------------------* * CPT_INIT * * * *-------------------------------------------------------------------------*/ CPT CPT_Init(void) { /* to ensure initial tree is never NULL */ return Create_Node(NULL, 0, 0, NULL); } /*-------------------------------------------------------------------------* * CPT_ADD_WORD * * * *-------------------------------------------------------------------------*/ int CPT_Add_Word(CPT tree, char *word, int length) { int l; CPTTree *ptree, tree1; CPTList *p; for (;;) { l = Common_Prefix_Length(word, length, tree->str, tree->length); if (l == length && l == tree->length) { /* both the word and the prefix are fully consumed */ word_consumed: if (tree->end) return 1; tree->end = 1; return 0; } word += l; length -= l; if (l < tree->length) /* the stored prefix is not fully consumed */ { /* update the stored prefix: */ /* create a node with begin and a son with end */ tree1 = Create_Node(tree->str, l, 0, Create_Cell(tree, NULL)); tree->str += l; tree->length -= l; *ptree = tree = tree1; } if (length == 0) /* the word is fully consumed */ goto word_consumed; /* create a node for the rest of the word */ tree1 = Create_Node(word, length, 1, NULL); /* find the appropriate son in the sorted list */ for (p = &(tree->list); *p && (*p)->tree->str[0] < *word; p = &((*p)->next)) ; /* no existing son - create a new cell */ if (*p == NULL || (*p)->tree->str[0] > *word) { *p = Create_Cell(tree1, *p); return 0; } /* an existing entry matches */ ptree = &((*p)->tree); tree = *ptree; } } /*-------------------------------------------------------------------------* * COMMON_PREFIX_LENGTH * * * *-------------------------------------------------------------------------*/ static int Common_Prefix_Length(char *str1, int l1, char *str2, int l2) { if (l1 < l2) /* l2 is the min of l1 and l2 */ l2 = l1; l1 = 0; while (l1 < l2 && *str1 == *str2) { str1++; str2++; l1++; } return l1; } /*-------------------------------------------------------------------------* * CREATE_NODE * * * *-------------------------------------------------------------------------*/ static CPTTree Create_Node(char *word, int length, int end, CPTList list) { CPTTree tree = (CPTTree) Malloc(sizeof(CPTNode)); tree->str = word; tree->length = length; tree->end = end; tree->list = list; return tree; } /*-------------------------------------------------------------------------* * CREATE_CELL * * * *-------------------------------------------------------------------------*/ static CPTList Create_Cell(CPTTree tree, CPTList next) { CPTList list = (CPTList) Malloc(sizeof(CPTCell)); list->tree = tree; list->next = next; return list; } /*-------------------------------------------------------------------------* * CPT_REMOVE_WORD * * * *-------------------------------------------------------------------------*/ int CPT_Remove_Word(CPTTree tree, char *word, int length) { CPTList *p0, *p, list; int l; if (length == 0) /* do not free first node - i.e. empty word */ { if (!tree->end) return 0; tree->end = 0; return 1; } p = p0 = NULL; for (;;) { if (length < tree->length || memcmp(word, tree->str, tree->length) != 0) return 0; word += tree->length; length -= tree->length; if (length == 0) { if (!tree->end) return 0; if (tree->list) /* at least 1 son */ tree->end = 0; else { /* no son */ Free(tree); list = *p; *p = list->next; Free(list); if (p0 == NULL) return 1; p = p0; /* tree is the parent tree */ tree = (*p)->tree; } if (tree->list && tree->list->next == NULL && !tree->end) { /* only 1 son - collapse */ l = tree->length; (*p)->tree = tree->list->tree; Free(tree); tree = (*p)->tree; tree->str -= l; tree->length += l; } return 1; } p0 = p; for (p = &(tree->list); *p && (*p)->tree->str[0] < *word; p = &((*p)->next)) ; if (*p == NULL || (*p)->tree->str[0] != *word) return 0; /* an existing entry matches */ tree = (*p)->tree; } } /*-------------------------------------------------------------------------* * CPT_SEARCH_WORD * * * *-------------------------------------------------------------------------*/ int CPT_Search_Word(CPT tree, char *word, int length) { CPTList list; for (;;) { if (length < tree->length || memcmp(word, tree->str, tree->length) != 0) return 0; word += tree->length; length -= tree->length; if (length == 0) return tree->end; for (list = tree->list; list && list->tree->str[0] < *word; list = list->next) ; if (list == NULL || list->tree->str[0] != *word) return 0; tree = list->tree; } } /*-------------------------------------------------------------------------* * CPT_GENSYM * * * *-------------------------------------------------------------------------*/ int CPT_Gensym(CPTTree tree, char *prefix, int prefix_length, char *buff) #if 1 #define GENSYM_CHARS "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" #else #define GENSYM_CHARS "abc" #endif { CPTList list; int c; char *save_buff; static char gensym_chars[] = GENSYM_CHARS; if (buff != prefix) { memcpy(buff, prefix, prefix_length); prefix = buff; } save_buff = buff; buff += prefix_length; #if 1 c = rand() % (sizeof(gensym_chars) - 1); *buff++ = gensym_chars[c]; prefix_length++; #endif for (;;) { if (prefix_length < tree->length || memcmp(prefix, tree->str, tree->length) != 0) { prefix_is_ok: *buff = '\0'; return buff - save_buff; } if (prefix_length == tree->length) { if (!tree->end) goto prefix_is_ok; c = rand() % (sizeof(gensym_chars) - 1); *buff++ = gensym_chars[c]; prefix_length++; } prefix += tree->length; prefix_length -= tree->length; for (list = tree->list; list && list->tree->str[0] < *prefix; list = list->next) ; if (list == NULL || list->tree->str[0] != *prefix) goto prefix_is_ok; tree = list->tree; } } /*-------------------------------------------------------------------------* * CPT_INIT_MATCH * * * *-------------------------------------------------------------------------*/ CPTMatch * CPT_Init_Match(CPTTree tree, char *prefix, int prefix_length, char *buff, int (*fct) ()) { CPTList list; int l; match.buff = buff; for (;;) { l = Common_Prefix_Length(prefix, prefix_length, tree->str, tree->length); if (l == prefix_length) { match.tree = tree; memcpy(buff, tree->str, tree->length); buff += tree->length; *buff = '\0'; match.length = buff - match.buff; match.fct = fct; return &match; } if (l < tree->length) return NULL; prefix += l; prefix_length -= l; for (list = tree->list; list && list->tree->str[0] < *prefix; list = list->next) ; if (list == NULL || list->tree->str[0] != *prefix) return NULL; memcpy(buff, tree->str, tree->length); buff += tree->length; tree = list->tree; } } /*-------------------------------------------------------------------------* * CPT_DO_MATCH * * * *-------------------------------------------------------------------------*/ int CPT_Do_Match(CPTMatch *match) { CPTTree tree = match->tree; int cont = 1; if (tree == NULL) /* should not occur */ return 0; return Do_Match_Rec(tree, match->buff, match->length, match->fct, 0, &cont); } /*-------------------------------------------------------------------------* * DO_MATCH_REC * * * *-------------------------------------------------------------------------*/ static int Do_Match_Rec(CPTTree tree, char *buff, int length, int (*fct) (), int no, int *cont) { CPTList list; char *p = buff + length; if (tree->end) { *cont = (*fct) (buff, length, no); no++; } for (list = tree->list; *cont && list; list = list->next) { tree = list->tree; memcpy(p, tree->str, tree->length); p[tree->length] = '\0'; no = Do_Match_Rec(tree, buff, length + tree->length, fct, no, cont); } return no; } /*-------------------------------------------------------------------------* * CPT_MATCH_INFO * * * *-------------------------------------------------------------------------*/ char * CPT_Match_Info(CPTMatch *match, int *prefix_length, int *nb_words, int *max_length) { CPTTree tree = match->tree; if (tree == NULL) return NULL; *prefix_length = match->length; *max_length = 0; *nb_words = Match_Info_Rec(tree, match->length, max_length); return match->buff; } /*-------------------------------------------------------------------------* * MATCH_INFO_REC * * * *-------------------------------------------------------------------------*/ static int Match_Info_Rec(CPTTree tree, int length, int *max_length) { int nb_word = 0; CPTList list; if (tree->end) { nb_word = 1; if (length > *max_length) *max_length = length; } else nb_word = 0; for (list = tree->list; list; list = list->next) { tree = list->tree; nb_word += Match_Info_Rec(tree, length + tree->length, max_length); } return nb_word; } /*-------------------------------------------------------------------------* * CPT_STATISTICS * * * *-------------------------------------------------------------------------*/ CPTStat * CPT_Statistics(CPT tree) { memset((void *) &stat, 0, sizeof(CPTStat)); Statistics_Rec(tree, 0, 0); return &stat; } /*-------------------------------------------------------------------------* * STATISTICS_REC * * * *-------------------------------------------------------------------------*/ static void Statistics_Rec(CPT tree, int depth, int length) { int n; CPTList list; stat.nb_node++; depth++; if (depth > stat.max_branch_size) stat.max_branch_size = depth; length += tree->length; if (tree->list && tree->length > stat.max_swrd_length) stat.max_swrd_length = tree->length; if (tree->end) { stat.sum_branch_size_word += depth; stat.nb_word++; stat.sum_word_length += length; if (length > stat.max_word_length) stat.max_word_length = length; } for (n = 0, list = tree->list; list; list = list->next, n++) Statistics_Rec(list->tree, depth, length); if (n == 0) { stat.nb_branch++; stat.sum_branch_size += depth; } else stat.nb_node2++; if (depth == 1) stat.fst_list_size = n; stat.sum_list_size += n; if (n > stat.max_list_size) stat.max_list_size = n; if (depth > 1 && n > stat.max2_list_size) stat.max2_list_size = n; } #ifdef USE_ALONE #define BUFF_SIZE 1024 void Show_Words(CPT tree); void Show_Words_Rec(CPT tree, char *prefix, int length); void Show_Tree(CPT tree, int level); int Display_Completion(char *str, int length, int no); int Read_String(FILE *f, char *str); /*-------------------------------------------------------------------------* * SHOW_TREE * * * *-------------------------------------------------------------------------*/ void Show_Tree(CPT tree, int level) { CPTList list; printf("%*s<%.*s> %s\n", level, "", tree->length, tree->str, (tree->end) ? "X" : ""); for (list = tree->list; list; list = list->next) Show_Tree(list->tree, level + 3); } /*-------------------------------------------------------------------------* * SHOW_WORDS * * * *-------------------------------------------------------------------------*/ void Show_Words(CPT tree) { char buff[BUFF_SIZE]; Show_Words_Rec(tree, buff, 0); } /*-------------------------------------------------------------------------* * SHOW_WORDS_REC * * * *-------------------------------------------------------------------------*/ void Show_Words_Rec(CPT tree, char *prefix, int length) { CPTList list; memcpy(prefix + length, tree->str, tree->length); length += tree->length; if (tree->end) printf("%.*s\n", length, prefix); for (list = tree->list; list; list = list->next) Show_Words_Rec(list->tree, prefix, length); } /*-------------------------------------------------------------------------* * DISPLAY_COMPLETION * * * *-------------------------------------------------------------------------*/ int Display_Completion(char *str, int length, int no) { printf("match %6d :<%s> len=%d\n", no, str, length); #if 0 return no < 5 - 1 #else return 1; #endif } /*-------------------------------------------------------------------------* * READ_STRING * * * *-------------------------------------------------------------------------*/ int Read_String(FILE *f, char *str) { int l; if (fgets(str, BUFF_SIZE, f) == NULL) return -1; l = strlen(str) - 1; /* remove trailing '\n' */ str[l] = '\0'; return l; } /*-------------------------------------------------------------------------* * MAIN * * * * to compile alone active USE_ALONE and simply compile this file. * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { CPT cpt; CPTMatch *match; CPTStat *stat; int c, l, n, m; char str[BUFF_SIZE]; char buff[BUFF_SIZE]; FILE *f; setbuf(stdout, NULL); /* for MS VC++ compiler */ cpt = CPT_Init(); if (argc > 1 && (f = fopen(argv[1], "rt")) != NULL) { int n = 0; int d = 0; int length = 0; printf("adding words from file: %s\n", argv[1]); while ((l = Read_String(f, str)) >= 0) { d += CPT_Add_Word(cpt, strdup(str), l); n++; length += l; } fclose(f); printf("Added %d words-%d duplicates=%d - sum length=%d\n", n, d, n - d, length); } for (;;) { printf("1-Add 2-Remove 3-Search 4-Completion 5-GenSym\n"); printf("6-Words 7-Tree 8-Stats 9-end: "); scanf("%d", &c); getchar(); if (c == 9) break; switch (c) { case 1: printf("word: "); l = Read_String(stdin, str); if (CPT_Add_Word(cpt, strdup(str), l)) printf("already inserted\n"); break; case 2: printf("word: "); l = Read_String(stdin, str); if (!CPT_Remove_Word(cpt, str, l)) printf("does not exist\n"); break; case 3: printf("word: "); l = Read_String(stdin, str); if (CPT_Search_Word(cpt, str, l)) printf("found\n"); else printf("not found\n"); break; case 4: printf("prefix: "); l = Read_String(stdin, str); if ( (match = CPT_Init_Match(cpt, str, l, buff, Display_Completion))) { CPT_Match_Info(match, &l, &n, &m); printf("longest prefix:<%s> length=%d" " nb words=%d longest word=%d\n", buff, l, n, m); printf("Nb displayed:%d\n", CPT_Do_Match(match)); } else printf("No matching\n"); break; case 5: printf("prefix: "); l = Read_String(stdin, str); l = CPT_Gensym(cpt, str, l, buff); printf("new symbol:<%s> length=%d\n", buff, l); if (CPT_Add_Word(cpt, strdup(buff), l)) printf("ERROR - %s already inserted\n", buff); break; case 6: Show_Words(cpt); break; case 7: Show_Tree(cpt, 0); break; case 8: stat = CPT_Statistics(cpt); printf("\nGeneral\n"); printf("nb words = %d\n", stat->nb_word); printf("nb nodes = %d\n", stat->nb_node); printf("nb nodes prefix = %d\n", stat->nb_node2); printf("nb branches = %d\n", stat->nb_branch); printf("\nBanch sizes\n"); printf("longest = %d\n", stat->max_branch_size); printf("sum sizes = %d\n", stat->sum_branch_size); printf("avg size = %g\n", (double) stat->sum_branch_size / stat->nb_branch); printf("sum size / word = %d\n", stat->sum_branch_size_word); printf("avg size / word = %g\n", (double) stat->sum_branch_size_word / stat->nb_word); printf("\nWord lengths\n"); printf("longest = %d\n", stat->max_word_length); printf("longest sub-word= %d\n", stat->max_swrd_length); printf("sum lengths = %d\n", stat->sum_word_length); printf("avg length = %g\n", (double) stat->sum_word_length / stat->nb_word); printf("\nList sizes\n"); printf("longest = %d\n", stat->max_list_size); printf("sum sizes = %d\n", stat->sum_list_size); printf("avg size = %g\n", (double) stat->sum_list_size / stat->nb_node2); printf("first list size = %d\n", stat->fst_list_size); printf(" excepting first list (ie. first node):\n"); printf("longest = %d\n", stat->max2_list_size); printf("sum' sizes = %d\n", stat->sum_list_size - stat->fst_list_size); printf("avg' size = %g\n", (double) (stat->sum_list_size - stat->fst_list_size) / (stat->nb_node2 - 1)); break; } } return 0; } #endif /* USE_ALONE */ ./gprolog-1.3.0/src/EnginePl/cpp_headers.c0000644004425400513100000001330110547154141016702 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : installation * * File : cpp_headers.c * * Descr.: General GNU Prolog header file maker * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: cpp_headers.c,v 1.10 2007/01/04 10:35:13 diaz Exp $ */ #include #include #include #include #include "gp_config.h" #define DO_NOT_ADD_COMMENTS #define REMOVE_COMMENTS #define REMOVE_BLANK_LINES /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { char *name; char *parent; int line; } UsedFile; /*---------------------------------* * Global Variables * *---------------------------------*/ char **dir; FILE *fout; char buff[4096]; UsedFile used[1024]; int nb_used = 0; /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Cpp_File(char *name, int skip_comment); /*-------------------------------------------------------------------------* * MAIN * * * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { if (argc < 4) { fprintf(stderr, "Usage cpp_headers in_file.h out_file.h search_dir...\n"); return 1; } dir = argv + 3; if ((fout = fopen(argv[2], "w")) == NULL) { perror(argv[2]); return 1; } fprintf(fout, "/* %s generated from %s using cpp_headers */\n", argv[2], argv[1]); Cpp_File(argv[1], 0); fclose(fout); return 0; } #define SKIP_SPACE(p) while(isspace(*p)) p++; /*-------------------------------------------------------------------------* * CPP_FILE * * * *-------------------------------------------------------------------------*/ void Cpp_File(char *name, int skip_comment) { char **d; int i; FILE *fin; char *p, *q; int line = 0; char name1[1024]; #ifdef REMOVE_COMMENTS int inside_comment = 0; #endif #ifdef REMOVE_BLANK_LINES int can_be_removed = 1; #endif for (d = dir; *d; d++) { sprintf(buff, "%s/%s", *d, name); if ((fin = fopen(buff, "r")) != NULL) break; } if (*d == NULL) { fprintf(stderr, "Cannot find the location of %s\n", name); exit(1); } while (fgets(buff, sizeof(buff), fin)) { line++; #ifdef REMOVE_COMMENTS if (skip_comment) { if (!inside_comment) { for(p = buff; isspace(*p); p++) ; if (*p == '/' && p[1] == '*') { if (strstr(p, "*/") == NULL) inside_comment = 1; continue; } } else { if (strstr(p, "*/") != NULL) inside_comment = 0; continue; } } #endif if (*buff != '#') goto reflect_line; p = buff + 1; SKIP_SPACE(p); if (strncmp(p, "include", 7)) goto reflect_line; p += 7; SKIP_SPACE(p); if (*p != '"') goto reflect_line; p++; q = p + strlen(p); while (*q != '"') q--; *q = '\0'; strcpy(name1, p); #ifndef DO_NOT_ADD_COMMENTS fprintf(fout, "/* %s:%d includes %s */\n", name, line, name1); #endif for (i = 0; i < nb_used; i++) if (strcmp(used[i].name, name1) == 0) break; if (i >= nb_used) { used[nb_used].name = strdup(name1); used[nb_used].parent = strdup(name); used[nb_used].line = line; nb_used++; Cpp_File(name1, 1); } #ifndef DO_NOT_ADD_COMMENTS else fprintf(fout, "/* already included by %s:%d */\n", used[i].parent, used[i].line); #endif continue; reflect_line: #ifdef REMOVE_BLANK_LINES if (can_be_removed) { p = buff; SKIP_SPACE(p); if (*p == '\0') continue; } p = buff + strlen(buff) - 1; while (isspace(*p)) p--; can_be_removed = (*p != '\\'); #endif fputs(buff, fout); } fclose(fin); } ./gprolog-1.3.0/src/EnginePl/Makefile.in0000644004425400513100000000547710547152475016355 0ustar diazlocoROOT_DIR1 = @ROOT_DIR1@ TOP_LEVEL = @TOP_LEVEL@ LIB_ENGINE_PL = @LIB_ENGINE_PL@ GPLC = @GPLC@ CC = @CC@ @CFLAGS_MACHINE@ CFLAGS = @CFLAGS@ AR_RC = @AR_RC@ RANLIB = @RANLIB@ LIBNAME = $(LIB_ENGINE_PL) OBJLIB = machine@OBJ_SUFFIX@ machine1@OBJ_SUFFIX@ mem_alloc@OBJ_SUFFIX@ \ misc@OBJ_SUFFIX@ hash@OBJ_SUFFIX@ obj_chain@OBJ_SUFFIX@ \ engine@OBJ_SUFFIX@ engine1@OBJ_SUFFIX@ wam_inst@OBJ_SUFFIX@ \ atom@OBJ_SUFFIX@ pred@OBJ_SUFFIX@ oper@OBJ_SUFFIX@ \ if_no_fd@OBJ_SUFFIX@ main@OBJ_SUFFIX@ all: wam_regs.h $(TOP_LEVEL).h $(LIBNAME) $(LIBNAME): $(OBJLIB) rm -f $(LIBNAME) $(AR_RC)@AR_SEP@$(LIBNAME) $(OBJLIB) $(RANLIB) $(LIBNAME) .SUFFIXES: .SUFFIXES: @OBJ_SUFFIX@ .c $(SUFFIXES) .c@OBJ_SUFFIX@: $(GPLC) -c -C '$(CFLAGS)' $*.c # Configuration config: pl_config@EXE_SUFFIX@ wam_regs.h pl_config@EXE_SUFFIX@: pl_config.c gp_config.h machine.h wam_archi.def $(CC) $(CFLAGS) $(LFLAGS) @CC_EXE_NAME_OPT@pl_config@EXE_SUFFIX@ pl_config.c wam_regs.h: pl_config@EXE_SUFFIX@ machine.h wam_archi.def ./pl_config@EXE_SUFFIX@ (cd ../TopComp; $(MAKE) $(GPLC)@EXE_SUFFIX@) gp_config.h: echo '*** run ./configure before make please ***' exit 1 cpp_headers@EXE_SUFFIX@: cpp_headers.c $(CC) $(CFLAGS) $(LFLAGS) @CC_EXE_NAME_OPT@cpp_headers@EXE_SUFFIX@ cpp_headers.c $(TOP_LEVEL).h: headers.h cpp_headers@EXE_SUFFIX@ D=`(cd ..;for i in *;do test -d $$i && X="$$X $(ROOT_DIR1)/src/$$i";done;echo $$X)`; ./cpp_headers headers.h $(TOP_LEVEL).h $$D # General core machine@OBJ_SUFFIX@: machine.h machine.c gp_config.h wam_regs.h mem_alloc@OBJ_SUFFIX@: mem_alloc.c misc@OBJ_SUFFIX@: misc.h misc.c machine.h hash@OBJ_SUFFIX@: hash.h hash.c main@OBJ_SUFFIX@: main.c obj_chain@OBJ_SUFFIX@: obj_chain.h obj_chain.c # Prolog engine # engine1 should be compiled without optimizations engine1@OBJ_SUFFIX@: engine1.c $(GPLC) -c engine1.c engine@OBJ_SUFFIX@: engine.h engine.c wam_inst@OBJ_SUFFIX@: wam_archi.h wam_inst.h wam_inst.c unify.c atom@OBJ_SUFFIX@: atom.h atom.c gp_config.h pred@OBJ_SUFFIX@: pred.h pred.c oper@OBJ_SUFFIX@: oper.h oper.c if_no_fd@OBJ_SUFFIX@: if_no_fd.h if_no_fd.c clean: rm -f pl_config@EXE_SUFFIX@ cpp_headers@EXE_SUFFIX@ *@OBJ_SUFFIX@ $(LIBNAME) distclean: clean clean-test_oc rm -f wam_archi.h wam_regs.h $(TOP_LEVEL).h gp_config.h check: test_oc@EXE_SUFFIX@ ./test_oc@EXE_SUFFIX@ clean-check: clean-test_oc # test obj chain utility TEST_OC_SRC=obj_chain.c test_oc.c test_oc@EXE_SUFFIX@: obj_chain.c obj_chain.h test_oc.c test_oc_defs.h for i in 1 2 3 4 5; do echo -e "#define OBJ_NO $$i\\n#include \"test_oc_defs.h\"" >/tmp/test_oc_m$$i.c; done $(CC) $(CFLAGS) @CC_EXE_NAME_OPT@test_oc@EXE_SUFFIX@ test_oc.c obj_chain.c -I. /tmp/test_oc_m[1-5].c rm -f /tmp/test_oc_m[1-5].c clean-test_oc: rm -f test_oc@EXE_SUFFIX@ ./gprolog-1.3.0/src/EnginePl/oper.c0000644004425400513100000001663210547154141015404 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : oper.c * * Descr.: operator table management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: oper.c,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ #include #include #define OPER_FILE #include "engine_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ #define T_FX(p) PREFIX, p, 0 , p-1 #define T_FY(p) PREFIX, p, 0 , p #define T_XF(p) POSTFIX, p, p-1, 0 #define T_YF(p) POSTFIX, p, p, 0 #define T_XFX(p) INFIX, p, p-1, p-1 #define T_XFY(p) INFIX, p, p-1, p #define T_YFX(p) INFIX, p, p, p-1 #define ADD_OPER(prec, type, name) Create_Oper(Create_Atom(name), T_##type(prec)) /*-------------------------------------------------------------------------* * INIT_OPER * * * *-------------------------------------------------------------------------*/ void Init_Oper(void) { oper_tbl = Hash_Alloc_Table(START_OPER_TBL_SIZE, sizeof(OperInf)); ADD_OPER(1200, XFX, ":-"); ADD_OPER(1200, XFX, "-->"); ADD_OPER(1200, FX, ":-"); ADD_OPER(1100, XFY, ";"); ADD_OPER(1050, XFY, "->"); ADD_OPER(1000, XFY, ","); ADD_OPER(900, FY, "\\+"); ADD_OPER(700, XFX, "="); ADD_OPER(700, XFX, "\\="); ADD_OPER(700, XFX, "=="); ADD_OPER(700, XFX, "\\=="); ADD_OPER(700, XFX, "@<"); ADD_OPER(700, XFX, "@>"); ADD_OPER(700, XFX, "@=<"); ADD_OPER(700, XFX, "@>="); ADD_OPER(700, XFX, "=.."); ADD_OPER(700, XFX, "is"); ADD_OPER(700, XFX, "=:="); ADD_OPER(700, XFX, "=\\="); ADD_OPER(700, XFX, "<"); ADD_OPER(700, XFX, "=<"); ADD_OPER(700, XFX, ">"); ADD_OPER(700, XFX, ">="); ADD_OPER(600, XFY, ":"); ADD_OPER(500, YFX, "+"); ADD_OPER(500, YFX, "-"); ADD_OPER(500, YFX, "/\\"); ADD_OPER(500, YFX, "\\/"); ADD_OPER(400, YFX, "*"); ADD_OPER(400, YFX, "/"); ADD_OPER(400, YFX, "//"); ADD_OPER(400, YFX, "rem"); ADD_OPER(400, YFX, "mod"); ADD_OPER(400, YFX, "<<"); ADD_OPER(400, YFX, ">>"); ADD_OPER(200, XFY, "**"); ADD_OPER(200, XFY, "^"); ADD_OPER(200, FY, "+"); ADD_OPER(200, FY, "-"); ADD_OPER(200, FY, "\\"); /* FD Operators */ ADD_OPER(750, XFY, "#<=>"); ADD_OPER(750, XFY, "#\\<=>"); ADD_OPER(740, XFY, "#==>"); ADD_OPER(740, XFY, "#\\==>"); ADD_OPER(730, XFY, "##"); ADD_OPER(730, YFX, "#\\/"); ADD_OPER(730, YFX, "#\\\\/"); ADD_OPER(720, YFX, "#/\\"); ADD_OPER(720, YFX, "#\\/\\"); ADD_OPER(710, FY, "#\\"); ADD_OPER(700, XFX, "#="); ADD_OPER(700, XFX, "#\\="); ADD_OPER(700, XFX, "#<"); ADD_OPER(700, XFX, "#=<"); ADD_OPER(700, XFX, "#>"); ADD_OPER(700, XFX, "#>="); ADD_OPER(700, XFX, "#=#"); ADD_OPER(700, XFX, "#\\=#"); ADD_OPER(700, XFX, "#<#"); ADD_OPER(700, XFX, "#=<#"); ADD_OPER(700, XFX, "#>#"); ADD_OPER(700, XFX, "#>=#"); } /*-------------------------------------------------------------------------* * CREATE_OPER * * * *-------------------------------------------------------------------------*/ OperInf * Create_Oper(int atom_op, int type, int prec, int left, int right) { OperInf oper_info; OperInf *oper; Extend_Table_If_Needed(&oper_tbl); oper_info.a_t = Make_Oper_Key(atom_op, type); oper_info.prec = prec; oper_info.left = left; oper_info.right = right; oper = (OperInf *) Hash_Insert(oper_tbl, (char *) &oper_info, TRUE); atom_tbl[atom_op].prop.op_mask |= Make_Op_Mask(type); return oper; } /*-------------------------------------------------------------------------* * LOOKUP_OPER * * * *-------------------------------------------------------------------------*/ OperInf * Lookup_Oper(int atom_op, int type) { if (!Check_Oper(atom_op, type)) return NULL; return (OperInf *) Hash_Find(oper_tbl, Make_Oper_Key(atom_op, type)); } /*-------------------------------------------------------------------------* * LOOKUP_OPER_ANY_TYPE * * * *-------------------------------------------------------------------------*/ OperInf * Lookup_Oper_Any_Type(int atom_op) { int op_mask = atom_tbl[atom_op].prop.op_mask; if (op_mask & Make_Op_Mask(PREFIX)) return (OperInf *) Hash_Find(oper_tbl, Make_Oper_Key(atom_op, PREFIX)); if (op_mask & Make_Op_Mask(INFIX)) return (OperInf *) Hash_Find(oper_tbl, Make_Oper_Key(atom_op, INFIX)); if (op_mask & Make_Op_Mask(POSTFIX)) return (OperInf *) Hash_Find(oper_tbl, Make_Oper_Key(atom_op, POSTFIX)); return NULL; } /*-------------------------------------------------------------------------* * DELETE_OPER * * * *-------------------------------------------------------------------------*/ OperInf * Delete_Oper(int atom_op, int type) { long key = Make_Oper_Key(atom_op, type); atom_tbl[atom_op].prop.op_mask &= ~Make_Op_Mask(type); return (OperInf *) Hash_Delete(oper_tbl, key); } ./gprolog-1.3.0/src/EnginePl/euclide.c0000644004425400513100000001150610547154141016044 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : development tool * * File : euclide.c * * Descr.: compute inverse * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: euclide.c,v 1.9 2007/01/04 10:35:13 diaz Exp $ */ #include #include /*-------------------------------------------------------------------------* * This program takes 2 numbers N1 and N2 (relatively prime) and computes * * N3 s.t. N1*N3 % N2 = 1. * * It uses the Euclide algorithm, by successive divisions of n1 by n2 until* * n2==0 maintaining u1 v1 and u2 v2 s.t., at each step, we have * * * * n1=u1*N1 + v1*N2 * * n2=u2*N1 + v2*N2 * * * * At the end, n2=0, n1 is the gdb of N1 and N2 and u1 is the wanted nb. * * * * This program is used to compute the constant INV_RADIX_MOD_MAX_ATOM in * * atom.c. Indeed, it is the result of euclide RADIX MAX_ATOM, ie. actually* * RADIX=67 and MAX_ATOM=65536 thus INV_RADIX_MOD_MAX_ATOM=19563. * * If MAX_ATOM is changed, INV_RADIX_MOD_MAX_ATOM must be changed too. * *-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------* * EUCLIDE * * * *-------------------------------------------------------------------------*/ unsigned Euclide(unsigned N1, unsigned N2) { unsigned q, r; int u2, v2; int u1, v1; int t; unsigned n1 = N1; unsigned n2 = N2; /* v1 and v2 are not used actually */ u1 = 1; v1 = 0; u2 = 0; v2 = 1; while (n2) { q = n1 / n2; /* gcd part */ r = n1 % n2; n1 = n2; n2 = r; t = u1 - q * u2; /* maintaining u1 and u2 */ u1 = u2; u2 = t; t = v1 - q * v2; /* maintaining v1 and v2 */ v1 = v2; v2 = t; } if (u1 < 0) u1 += N2; return u1; } /*-------------------------------------------------------------------------* * MAIN * * * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { unsigned n1; unsigned n2; unsigned inv_n1_mod_n2; if (argc != 3) { printf("Usage: %s nb_to_invert modulo\n", argv[0]); printf(" nb_to_invert and modulo must be relatively prime\n"); return 1; } n1 = atoi(argv[1]); n2 = atoi(argv[2]); inv_n1_mod_n2 = Euclide(n1, n2); printf("Res: %-10u i.e. (1/%u) %% %u = %u\n", inv_n1_mod_n2, n1, n2, inv_n1_mod_n2); printf(" %-10s i.e. (%u*%u) %% %u = 1\n", "", n1, inv_n1_mod_n2, n2); if ((unsigned) ((n1 * inv_n1_mod_n2) % n2) != 1) printf("\n*** CHECK ERROR %u instead of 1\n", (n1 * inv_n1_mod_n2) % n2); return 0; } ./gprolog-1.3.0/src/EnginePl/WIN32_all_SIGSEGV.c0000755004425400513100000001024210547152475017262 0ustar diazloco#include #include #include #if defined(__GNUC__) || defined(__LCC__) typedef enum { ExceptionContinueExecution, ExceptionContinueSearch, ExceptionNestedException, ExceptionCollidedUnwind } EXCEPTION_DISPOSITION; #endif typedef struct _excp_lst { struct _excp_lst *chain; EXCEPTION_DISPOSITION (*handler)(); } excp_lst; #ifdef __GNUC__ # define SEH_PUSH(new_handler) \ { \ excp_lst e; \ e.handler = new_handler; \ asm("movl %%fs:0,%0" : "=r" (e.chain)); \ asm("movl %0,%%fs:0" : : "r" (&e)); # define SEH_POP \ asm("movl %0,%%fs:0" : : "r" (e.chain)); \ } #elif defined(_MSC_VER) # define SEH_PUSH(new_handler) \ { \ excp_lst e; \ e.handler = new_handler; \ __asm push eax \ __asm mov eax,dword ptr fs:[0] \ __asm mov dword ptr [e.chain],eax \ __asm lea eax,[e] \ __asm mov dword ptr fs:[0],eax \ __asm pop eax # define SEH_POP \ __asm push eax \ __asm mov eax,dword ptr [e.chain] \ __asm mov dword ptr fs:[0],eax \ __asm pop eax \ } #elif defined(__LCC__) /* below in movl %eax,%e and movel %e,%eax %e should be %e.chain the lcc asm does not support it. Here %e works since chain is the 1st field */ # define SEH_PUSH(new_handler) \ { \ excp_lst e; \ e.handler = new_handler; \ _asm("pushl %eax"); \ _asm("movl %fs:0,%eax"); \ _asm("movl %eax,%e"); \ _asm("leal %e,%eax"); \ _asm("movl %eax,%fs:0"); \ _asm("popl %eax"); # define SEH_POP \ _asm("pushl %eax"); \ _asm("movl %e,%eax"); \ _asm("movl %eax,%fs:0"); \ _asm("popl %eax"); \ } #else # error macros SEH_PUSH/POP undefined for this compiler #endif long *fault_addr; EXCEPTION_DISPOSITION ExceptionWrapper(EXCEPTION_RECORD *excp_rec, void *establisher_frame, CONTEXT *context_rec, void *dispatcher_cxt) { if (excp_rec->ExceptionFlags) return ExceptionContinueSearch; /* unwind and others */ if (excp_rec->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) fault_addr = (long *) excp_rec->ExceptionInformation[1]; printf("addr:%p\n", fault_addr); /* exit(1); */ return ExceptionContinueSearch; } int SIGSEGV_Handler(int sig) { printf("Segmentation Violation at: %p\n", fault_addr); exit(1); } EXCEPTION_DISPOSITION ExceptionHandler(EXCEPTION_RECORD *excp_rec, void *establisher_frame, CONTEXT *context_rec, void *dispatcher_cxt) { char *addr; DWORD old_prot; if (excp_rec->ExceptionFlags) return ExceptionContinueSearch; /* unwind and others */ if (excp_rec->ExceptionCode != EXCEPTION_ACCESS_VIOLATION) return ExceptionContinueSearch; addr = (char *) excp_rec->ExceptionInformation[1]; printf("access violation at addr:%p - unprotect this page and retry\n", addr); if (!VirtualProtect(addr, 4096, PAGE_READWRITE, &old_prot)) { printf("In Handler VirtualProtect failed: %lu", GetLastError()); return ExceptionContinueSearch; } return ExceptionContinueExecution; } int bar=1; int main() { #if 0 long *x; SEH_PUSH(ExceptionWrapper); signal(SIGSEGV, (void (*)(int)) SIGSEGV_Handler); x = (long *) 0xffff040; *x = 12 / bar; /* set bar to 1 to test div by 0 exception */ SEH_POP; #else char *addr; int page_size, i; DWORD old_prot; page_size = 4096; addr = (char *) VirtualAlloc(0, 8192, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); if (addr == NULL) { printf("VirtualAlloc failed : %lu", GetLastError()); return 1; } if (!VirtualProtect(addr + 4096, page_size, PAGE_NOACCESS, &old_prot)) { printf("VirtualProtect failed : %lu", GetLastError()); return 1; } SEH_PUSH(ExceptionHandler); printf("One page allocated at:%p no access at: %p\n", addr, addr + 4096); for(i = 0; i < 8192; i++) addr[i] = i & 0x7f; printf("seem OK, checking...\n"); for(i = 0; i < 8192; i++) if (addr[i] != (i & 0x7f)) { printf("ERROR AT %p\n", addr + i); return 1; } printf("OK !\n"); SEH_POP; #endif return 0; } ./gprolog-1.3.0/src/EnginePl/machine.h0000644004425400513100000001125110547154141016040 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : machine.h * * Descr.: machine dependent features - Header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: machine.h,v 1.18 2007/01/04 10:35:13 diaz Exp $ */ #ifndef _MACHINE_H #define _MACHINE_H #include "bool.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Init_Machine(void); void M_Allocate_Stacks(void); char *M_Sys_Err_String(int err_no); long M_User_Time(void); long M_System_Time(void); long M_Real_Time(void); void M_Randomize(void); void M_Set_Seed(int n); int M_Get_Seed(void); int M_Random_Integer(int n); double M_Random_Float(double n); char *M_Host_Name_From_Name(char *host_name); char *M_Host_Name_From_Adr(char *host_address); char *M_Get_Working_Dir(void); Bool M_Set_Working_Dir(char *path); char *M_Absolute_Path_Name(char *src); #if defined(_WIN32) && !defined(__CYGWIN__) int getpagesize(void); #endif void M_Check_Magic_Words(void); /* not compiled if not needed */ /*---------------------------------* * Register Definitions * *---------------------------------*/ #if defined(M_sparc) # define M_USED_REGS {"g6", "g7", 0} #elif defined(M_mips) #define M_USED_REGS {"$16", "$17", "$18", "$19", "$20", \ "$21", "$22", "$23", 0} #elif defined(M_alpha) # define M_USED_REGS {"$9", "$10", "$11", "$12", "$13", "$14", 0} /* on M_ix86_darwin : %ebx is used by gcc for pic base */ #elif defined(M_ix86) && !defined(_MSC_VER) && !defined(M_ix86_darwin) #ifdef NO_USE_EBP # define M_USED_REGS {"ebx", 0} #else # define M_USED_REGS {"ebx", "ebp", 0} #endif #elif defined(M_powerpc) # define M_USED_REGS {"15", "20", 0} #elif defined(M_x86_64) # define M_USED_REGS {"r12", "r13", "r14", "r15", 0} #else # define M_USED_REGS {0} #endif #if defined(M_ix86) && !defined(_WIN32) && !defined(NO_USE_REGS) #define NO_MACHINE_REG_FOR_REG_BANK #endif /*---------------------------------* * Stacks Management * *---------------------------------*/ #if WORD_SIZE == 32 # define M_MMAP_HIGH_ADR1 0x0ffffff0 # define M_MMAP_HIGH_ADR2 0x3ffffff0 # define M_MMAP_HIGH_ADR3 0x7ffffff0 #elif defined(M_alpha_osf) || defined(M_alpha_linux) # define M_MMAP_HIGH_ADR1 0x3f800000000ULL #elif defined(M_x86_64_linux) # define M_MMAP_HIGH_ADR1 0x4000000000ULL #endif #if defined(M_sunos) || defined(M_solaris) # define MMAP_NEEDS_FIXED #endif /*---------------------------------* * Malloc Management * *---------------------------------*/ #ifdef __OpenBSD__ #define USE_DL_MALLOC #endif #endif ./gprolog-1.3.0/src/EnginePl/atom.h0000644004425400513100000001274110547154141015401 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : atom.h * * Descr.: atom table management - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: atom.h,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ #if 1 #define OPTIM_1_CHAR_ATOM #endif /*---------------------------------* * Constants * *---------------------------------*/ /* Character Classification */ #define LA 1 /* layout character */ #define SC 2 /* solo character */ #define QT 4 /* quote */ #define DQ 8 /* double quote */ #define BQ 16 /* back quote */ #define GR 32 /* graphic char */ #define PC 64 /* punctuation character */ #define DI 128 /* digit */ #define UL 256 /* underline */ #define CL 512 /* capital letter */ #define SL 1024 /* small letter */ #define CM 2048 /* comment character (%) */ #define EX 4096 /* extended character */ #define ATOM_NIL 1766 /* Atom Type */ #define IDENTIFIER_ATOM 0 #define GRAPHIC_ATOM 1 #define SOLO_ATOM 2 #define OTHER_ATOM 3 #define Is_Valid_Code(c) ((unsigned) (c)-1 <256-1) /* 1<= c <256 */ #define Is_Valid_Byte(c) ((unsigned) (c) <256) /* 0=< c <256 */ #define Is_Valid_Atom(a) ((a)>=0 && (a) (the string) */ AtomProp prop; /* associated properties */ } AtomInf; /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef ATOM_FILE AtomInf atom_tbl[MAX_ATOM]; int nb_atom; int atom_void; int atom_curly_brackets; int atom_false; int atom_true; int atom_end_of_file; #ifndef OPTIM_1_CHAR_ATOM int atom_char[256]; #endif /* int char_type[256]; see definition in atom.c */ char char_conv[256]; /* char escape_symbol[]; see definition in atom.c */ /* char escape_char []; see definition in atom.c */ #else extern AtomInf atom_tbl[]; extern int nb_atom; extern int atom_void; extern int atom_curly_brackets; extern int atom_false; extern int atom_true; extern int atom_end_of_file; #ifndef OPTIM_1_CHAR_ATOM extern int atom_char[]; #endif extern char char_conv[]; extern int char_type[]; extern char escape_symbol[]; extern char escape_char[]; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Init_Atom(void); int FC Create_Allocate_Atom(char *name); int FC Create_Atom(char *name); WamWord FC Create_Atom_Tagged(char *name); int FC Find_Atom(char *name); int FC Gen_New_Atom(char *prefix, int hash); int FC Find_Next_Atom(int last_atom); #ifdef OPTIM_1_CHAR_ATOM #define ATOM_CHAR(c) ((int) (unsigned char) (c)) #else #define ATOM_CHAR(c) (atom_char[(int) (unsigned char) (c)]) #endif ./gprolog-1.3.0/src/EnginePl/test_oc.c0000644004425400513100000000070310547152475016077 0ustar diazloco#include #include #include "obj_chain.h" int no; void Fatal_Error(char *msg) { fprintf(stderr, msg); fprintf(stderr, "\n"); exit(1); } int main() { #ifdef _MSC_VER setbuf(stdout, NULL); setbuf(stderr, NULL); #endif puts("starting..."); Find_Linked_Objects(); if (no != 1) { printf("error: all objects are not found (last #: %d instead of 1)", no); exit(1); } puts("finished - OK !"); return 0; } ./gprolog-1.3.0/src/EnginePl/bool.h0000644004425400513100000000421210547154141015366 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : configuration * * File : bool.h * * Descr.: boolean type definition - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: bool.h,v 1.10 2007/01/04 10:35:13 diaz Exp $ */ #ifndef _BOOL_H #define _BOOL_H #ifdef FALSE # if FALSE != 0 # error "FALSE already defined with a value != 0" # endif #else #define FALSE 0 #endif #ifdef TRUE # if TRUE != 1 # error "TRUE already defined with a value != 1" # endif #else #define TRUE 1 #endif #ifndef Bool typedef int Bool; #endif #endif /* !_BOOL_H */ ./gprolog-1.3.0/src/EnginePl/hash.h0000644004425400513100000000547410547154141015371 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : hash.h * * Descr.: hash table management - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: hash.h,v 1.9 2007/01/04 10:35:13 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { char *endt; char *cur_t; char *cur_p; } HashScan; /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ char *Hash_Alloc_Table(int tbl_size, int elem_size); void Hash_Free_Table(char *tbl); char *Hash_Realloc_Table(char *tbl, int new_tbl_size); void Hash_Delete_All(char *tbl); char *Hash_Insert(char *tbl, char *elem, int replace); char *Hash_Find(char *tbl, long key); char *Hash_Delete(char *tbl, long key); char *Hash_First(char *tbl, HashScan *scan); char *Hash_Next(HashScan *scan); int Hash_Table_Size(char *tbl); int Hash_Nb_Elements(char *tbl); #ifdef DEBUG void Hash_Check_Table(char *tbl); #endif ./gprolog-1.3.0/src/EnginePl/mem_alloc.c0000644004425400513100000000455010547154141016363 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : mem_alloc.c * * Descr.: customized memory allocator * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: mem_alloc.c,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ #include "gp_config.h" /*-------------------------------------------------------------------------* * If needed for some machine: redefine here malloc/calloc/realloc/free by * * inserting an appropriate file. * *-------------------------------------------------------------------------*/ /* this is no longer used for linux, see mallopt initial call in machine.c */ #if 0 && defined(M_linux) #ifdef HAVE_MMAP #undef HAVE_MMAP #endif #define HAVE_MMAP 0 /* do not use mmap for big blocks */ #include "dl_malloc.c" #endif ./gprolog-1.3.0/src/EnginePl/wam_archi.h0000644004425400513100000002464710547440357016412 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : wam_archi.def (gives rise to wam_archi.h) * * Descr.: Wam architecture definition - description file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /*---------------------------------* * Register Descriptions * *---------------------------------*/ typedef long WamWord; /* a wamword is a long (32/64 bits) */ typedef void (*CodePtr) (); /* a code pointer is a ptr to fct */ typedef CodePtr WamCont; /* a continuation is a code pointer */ #ifndef ONLY_TAG_PART #define X(x) (reg_bank[x]) #define A(a) (reg_bank[a]) typedef WamWord *WamWordP; /*--- Begin Register Generation ---*/ register WamWordP TR asm ("ebx"); #define B (((WamWordP *) reg_bank)[NB_OF_X_REGS+0]) #define H (((WamWordP *) reg_bank)[NB_OF_X_REGS+1]) #define HB1 (((WamWordP *) reg_bank)[NB_OF_X_REGS+2]) #define CP (((WamCont *) reg_bank)[NB_OF_X_REGS+3]) #define E (((WamWordP *) reg_bank)[NB_OF_X_REGS+4]) #define CS (((WamWordP *) reg_bank)[NB_OF_X_REGS+5]) #define S (((WamWordP *) reg_bank)[NB_OF_X_REGS+6]) #define STAMP (((WamWord *) reg_bank)[NB_OF_X_REGS+7]) #define BCI (((WamWord *) reg_bank)[NB_OF_X_REGS+8]) #define LSSA (((WamWordP *) reg_bank)[NB_OF_X_REGS+9]) #define NB_OF_REGS 11 #define NB_OF_ALLOC_REGS 1 #define NB_OF_NOT_ALLOC_REGS 10 #define REG_BANK_SIZE (NB_OF_X_REGS+NB_OF_NOT_ALLOC_REGS) #define NB_OF_USED_MACHINE_REGS 1 #ifdef ENGINE_FILE WamWord reg_bank[REG_BANK_SIZE]; WamWord buff_signal_reg[NB_OF_USED_MACHINE_REGS + 1]; char *reg_tbl[] = { "TR", "B", "H", "HB1", "CP", "E", "CS", "S", "STAMP", "BCI", "LSSA"}; #else extern WamWord reg_bank[]; extern WamWord buff_signal_reg[]; extern char *reg_tbl[]; #endif #define Init_Reg_Bank(x) #define Reg(i) (((i)==0) ? (WamWord) TR : \ ((i)==1) ? (WamWord) B : \ ((i)==2) ? (WamWord) H : \ ((i)==3) ? (WamWord) HB1 : \ ((i)==4) ? (WamWord) CP : \ ((i)==5) ? (WamWord) E : \ ((i)==6) ? (WamWord) CS : \ ((i)==7) ? (WamWord) S : \ ((i)==8) ? (WamWord) STAMP : \ ((i)==9) ? (WamWord) BCI : \ (WamWord) LSSA) #define Save_All_Regs(buff_save) \ do { \ buff_save[0] = (WamWord) TR; \ buff_save[1] = (WamWord) B; \ buff_save[2] = (WamWord) H; \ buff_save[3] = (WamWord) HB1; \ buff_save[4] = (WamWord) CP; \ buff_save[5] = (WamWord) E; \ buff_save[6] = (WamWord) CS; \ buff_save[7] = (WamWord) S; \ buff_save[8] = (WamWord) STAMP; \ buff_save[9] = (WamWord) BCI; \ buff_save[10] = (WamWord) LSSA; \ } while(0) #define Restore_All_Regs(buff_save) \ do { \ TR = (WamWordP) buff_save[0]; \ B = (WamWordP) buff_save[1]; \ H = (WamWordP) buff_save[2]; \ HB1 = (WamWordP) buff_save[3]; \ CP = (WamCont ) buff_save[4]; \ E = (WamWordP) buff_save[5]; \ CS = (WamWordP) buff_save[6]; \ S = (WamWordP) buff_save[7]; \ STAMP = (WamWord ) buff_save[8]; \ BCI = (WamWord ) buff_save[9]; \ LSSA = (WamWordP) buff_save[10]; \ } while(0) #define Save_Machine_Regs(buff_save) \ do { \ register long reg0 asm ("ebx"); \ buff_save[0] = reg0; \ } while(0) #define Restore_Machine_Regs(buff_save) \ do { \ register long reg0 asm ("ebx"); \ reg0 = buff_save[0]; \ } while(0) #define Start_Protect_Regs_For_Signal \ do { \ Save_Machine_Regs(buff_signal_reg); \ buff_signal_reg[NB_OF_USED_MACHINE_REGS] = 1; \ } while(0) #define Stop_Protect_Regs_For_Signal \ buff_signal_reg[NB_OF_USED_MACHINE_REGS] = 0; \ #define Restore_Protect_Regs_For_Signal \ do { \ if (buff_signal_reg[NB_OF_USED_MACHINE_REGS]) { \ Restore_Machine_Regs(buff_signal_reg); \ Stop_Protect_Regs_For_Signal; \ } \ } while(0) /*--- End Register Generation ---*/ #endif /*---------------------------------* * Tag Descriptions * *---------------------------------*/ /*--- Begin Tag Generation ---*/ #define TAG_SIZE 3 #define TAG_SIZE_LOW 2 #define TAG_SIZE_HIGH 1 #define VALUE_SIZE 29 #define TAG_MASK 0x80000003UL #define VALUE_MASK 0x7ffffffcUL #define Tag_Mask_Of(w) ((unsigned long) (w) & (TAG_MASK)) #define Tag_From_Tag_Mask(w) (((unsigned long) (w) >> 29) | ((w) & 3)) #define Tag_Of(w) ((((unsigned long) (w) >> 31) << 2) | ((w) & 3)) #define TAG_REF_MASK 0UL #define TAG_LST_MASK 0x1UL #define TAG_STC_MASK 0x2UL #define TAG_ATM_MASK 0x3UL #define TAG_FLT_MASK 0x80000000UL #define TAG_FDV_MASK 0x80000001UL #define TAG_INT_MASK 0x80000003UL #define NB_OF_TAGS 7 #define REF 0 #define LST 1 #define STC 2 #define ATM 3 #define FLT 4 #define FDV 5 #define INT 7 /* General Tag/UnTag macros */ #define Tag_Long_Int(tm, v) ((((unsigned long) ((v) << 3)) >> 1) | (tm)) #define Tag_Short_Uns(tm, v) (((unsigned long) (v) << 2) + (tm)) #define Tag_Address(tm, v) ((unsigned long) (v) + (tm)) #define UnTag_Long_Int(w) ((long) ((w) << 1) >> 3) #define UnTag_Short_Uns(w) UnTag_Long_Int(w) #define UnTag_Address(w) ((WamWord *) ((w) & VALUE_MASK)) /* Specialized Tag/UnTag macros */ #define Tag_REF(v) Tag_Address(TAG_REF_MASK, v) #define Tag_LST(v) Tag_Address(TAG_LST_MASK, v) #define Tag_STC(v) Tag_Address(TAG_STC_MASK, v) #define Tag_ATM(v) Tag_Short_Uns(TAG_ATM_MASK, v) #define Tag_FLT(v) Tag_Address(TAG_FLT_MASK, v) #define Tag_FDV(v) Tag_Address(TAG_FDV_MASK, v) #define Tag_INT(v) (((unsigned long) (v) << 2) | TAG_MASK) #define UnTag_REF(w) ((WamWord *) (w)) #define UnTag_LST(w) UnTag_Address(w) #define UnTag_STC(w) UnTag_Address(w) #define UnTag_ATM(w) ((unsigned long) (w) >> 2) #define UnTag_FLT(w) UnTag_Address(w) #define UnTag_FDV(w) UnTag_Address(w) #define UnTag_INT(w) UnTag_Long_Int(w) #define Tag_Is_REF(w) (Tag_Mask_Of(w) == TAG_REF_MASK) #define Tag_Is_LST(w) (Tag_Mask_Of(w) == TAG_LST_MASK) #define Tag_Is_STC(w) (Tag_Mask_Of(w) == TAG_STC_MASK) #define Tag_Is_ATM(w) (Tag_Mask_Of(w) == TAG_ATM_MASK) #define Tag_Is_FLT(w) (Tag_Mask_Of(w) == TAG_FLT_MASK) #define Tag_Is_FDV(w) (Tag_Mask_Of(w) == TAG_FDV_MASK) #define Tag_Is_INT(w) (Tag_Mask_Of(w) == TAG_INT_MASK) typedef enum { LONG_INT, SHORT_UNS, ADDRESS }TypTag; typedef struct { char *name; TypTag type; int value; long tag_mask; }InfTag; #ifdef ENGINE_FILE InfTag tag_tbl[] = { { "REF", ADDRESS, 0, 0UL }, { "LST", ADDRESS, 1, 0x1UL }, { "STC", ADDRESS, 2, 0x2UL }, { "ATM", SHORT_UNS, 3, 0x3UL }, { "FLT", ADDRESS, 4, 0x80000000UL }, { "FDV", ADDRESS, 5, 0x80000001UL }, { "INT", LONG_INT, 7, 0x80000003UL } }; #else extern InfTag tag_tbl[]; #endif /*--- End Tag Generation ---*/ /*---------------------------------* * Stack Descriptions * *---------------------------------*/ #ifndef ONLY_TAG_PART #define KBytes_To_Wam_Words(kb) ((1024 * kb + sizeof(WamWord) - 1) / sizeof(WamWord)) #define Wam_Words_To_KBytes(ww) (ww * sizeof(WamWord) / 1024) #define Local_Top ((B >= E) ? B : E) /*--- Begin Stack Generation ---*/ #define NB_OF_STACKS 4 #define Trail_Stack (stk_tbl[0].stack) #define Trail_Size (stk_tbl[0].size) #define Trail_Offset(adr) ((WamWord *)(adr) - Trail_Stack) #define Trail_Used_Size Trail_Offset(TR) #define Cstr_Stack (stk_tbl[1].stack) #define Cstr_Size (stk_tbl[1].size) #define Cstr_Offset(adr) ((WamWord *)(adr) - Cstr_Stack) #define Cstr_Used_Size Cstr_Offset(CS) #define Global_Stack (stk_tbl[2].stack) #define Global_Size (stk_tbl[2].size) #define Global_Offset(adr) ((WamWord *)(adr) - Global_Stack) #define Global_Used_Size Global_Offset(H) #define Local_Stack (stk_tbl[3].stack) #define Local_Size (stk_tbl[3].size) #define Local_Offset(adr) ((WamWord *)(adr) - Local_Stack) #define Local_Used_Size Local_Offset(Local_Top) #define Stack_Top(s) (((s) == 0) ? TR : ((s) == 1) ? CS : ((s) == 2) ? H : Local_Top) typedef struct { char *name; char *env_var_name; long *p_def_size; int default_size; /* in WamWords */ int size; /* in WamWords */ WamWord *stack; }InfStack; #ifdef ENGINE_FILE /* these variables can be overwritten by top_comp.c (see stack size file) */ long def_trail_size; long def_cstr_size; long def_global_size; long def_local_size; long fixed_sizes; InfStack stk_tbl[] = { { "trail", "TRAILSZ", &def_trail_size, 786432, 0, NULL }, { "cstr", "CSTRSZ", &def_cstr_size, 786432, 0, NULL }, { "global", "GLOBALSZ", &def_global_size, 2097152, 0, NULL }, { "local", "LOCALSZ", &def_local_size, 1048576, 0, NULL } }; #else extern long def_trail_size; extern long def_cstr_size; extern long def_global_size; extern long def_local_size; extern long fixed_sizes; extern InfStack stk_tbl[]; #endif /*--- End Stack Generation ---*/ #endif ./gprolog-1.3.0/src/EnginePl/misc.h0000644004425400513100000000603610547154141015374 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : misc.h * * Descr.: miscellaneous operations - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: misc.h,v 1.12 2007/01/04 10:35:13 diaz Exp $ */ #include /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ char *Malloc_Check(unsigned size, char *src_file, int src_line); char *Calloc_Check(unsigned nb, unsigned size, char *src_file, int src_line); char *Realloc_Check(char *ptr, unsigned size, char *src_file, int src_line); char *Strdup_Check(char *str, char *src_file, int src_line); #define Malloc(size) Malloc_Check(size, __FILE__, __LINE__) #define Calloc(nb, size) Calloc_Check(nb, size, __FILE__, __LINE__) #define Realloc(ptr, size) Realloc_Check(ptr, size, __FILE__, __LINE__) #define Free(ptr) free(ptr) #define Strdup(str) Strdup_Check(str, __FILE__, __LINE__) void Extend_Table_If_Needed(char **hash_tbl); void Extend_Array(char **ptbl, int *nb_elem, int elem_size, Bool bzero); void Exit_With_Value(int ret_val); void Fatal_Error(char *format, ...); ./gprolog-1.3.0/src/EnginePl/gprolog.h0000644004425400513100000027075310547441210016117 0ustar diazloco/* gprolog.h generated from headers.h using cpp_headers */ /*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : headers.h * * Descr.: GNU Prolog - general header file (for users) * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: gprolog.h,v 1.77 2007/01/05 12:20:24 diaz Exp $ */ #ifndef _GPROLOG_H #define _GPROLOG_H #ifdef __cplusplus extern "C" { #endif #ifndef _GP_CONFIG_H #define _GP_CONFIG_H #define HAVE_TERMIOS_H 1 #define HAVE_MALLOC_H 1 #define HAVE_MMAP 1 #define HAVE_MPROTECT 1 #define HAVE_MALLOPT 1 #define NO_USE_EBP 1 #define NO_USE_GUI_CONSOLE 1 #define M_ix86 1 #define M_linux 1 #define M_ix86_linux 1 #define PROLOG_NAME1 "gprolog" #define PROLOG_NAME "GNU Prolog" #define PROLOG_VERSION "1.3.0" #define PROLOG_DATE "Jan 4 2007" #define PROLOG_COPYRIGHT "Copyright (C) 1999-2007 Daniel Diaz" #define TOP_LEVEL "gprolog" #define GPLC "gplc" #define HEXGPLC "hexgplc" #define ENV_VARIABLE "PL_PATH" #define M_VENDOR "pc" #define M_CPU "i686" #define M_OS "linux-gnu" #define CC "gcc" #define CFLAGS_PREFIX_REG "-ffixed-%s" #define CFLAGS "-g -Wall" #define CFLAGS_MACHINE "-march=pentiumpro" #define LDFLAGS "" #define LDLIBS "-lm" #define AS "as" #define STRIP "strip" #define ASM_SUFFIX ".s" #define OBJ_SUFFIX ".o" #define EXE_SUFFIX "" #define CC_OBJ_NAME_OPT "-o " #define CC_EXE_NAME_OPT "-o " #define DLL_W32GUICONS "w32guicons.dll" #define LIB_LINEDIT "liblinedit.a" #define LIB_ENGINE_PL "libengine_pl.a" #define LIB_BIPS_PL "libbips_pl.a" #define LIB_ENGINE_FD "libengine_fd.a" #define LIB_BIPS_FD "libbips_fd.a" #define SIZEOF_LONG 4 #define WORD_SIZE (8 * SIZEOF_LONG) #ifndef _ARCH_DEP_H #define _ARCH_DEP_H #if defined(_WIN32) && !defined(__CYGWIN__) #ifdef _MSC_VER #pragma warning(disable : 4996) #endif #define MAXPATHLEN 1024 #define SIGQUIT SIGTERM #define fdopen _fdopen #define dup _dup #define dup2 _dup2 #define getcwd _getcwd #define chdir _chdir #define close _close #define pclose _pclose #define popen _popen #define pclose _pclose #define getpid _getpid #define strcasecmp stricmp #define strncasecmp strnicmp #define unlink _unlink #define tzset _tzset #define access _access #ifndef F_OK #define F_OK 00 #define W_OK 02 #define R_OK 04 #define X_OK F_OK #endif #ifndef S_ISDIR #define S_ISDIR(m) (((m)&_S_IFMT) == _S_IFDIR) #define S_ISCHR(m) (((m)&_S_IFMT) == _S_IFCHR) #define S_ISFIFO(m) (((m)&_S_IFMT) == _S_IFIFO) #define S_ISREG(m) (((m)&_S_IFMT) == _S_IFREG) #endif #ifndef S_IRUSR #define S_IRUSR _S_IREAD #define S_IWUSR _S_IWRITE #define S_IXUSR _S_IEXEC #endif #define DIR_SEP_S "\\" #define DIR_SEP_C '\\' #else #define DIR_SEP_S "/" #define DIR_SEP_C '/' #endif /* defined(_WIN32) && !defined(__CYGWIN__) */ #if defined(M_ix86_cygwin) || defined(M_ix86_sco) #define Set_Line_Buf(s) setvbuf(s, NULL, _IOLBF, 0) #elif defined(_WIN32) #define Set_Line_Buf(s) setbuf(s, NULL) #else #define Set_Line_Buf(s) setlinebuf(s) #endif #ifndef NO_USE_GUI_CONSOLE #define W32_GUI_CONSOLE #endif #ifdef M_sparc_sunos #define __USE_FIXED_PROTOTYPES__ #endif #if defined(M_ix86_sco) #ifndef MAXPATHLEN #define MAXPATHLEN 1024 #endif #endif #if !defined(_WIN32) && !defined(__unix__) #define __unix__ #endif #ifndef HAVE_FGETC #define fgetc getc #endif #if defined(M_ix86) #define COULD_COMPILE_FOR_FC #ifdef __GNUC__ #define FC_MAX_ARGS_IN_REGS 3 #define FC_SET_OF_REGISTERS { "%eax", "%edx", "%ecx" }; #define FC_ATTRIB __attribute__((regparm(FC_MAX_ARGS_IN_REGS))) #elif 0 /* under MSVC++ we can use __fastcall convention (#elif 1 if wanted) */ #define FC_MAX_ARGS_IN_REGS 2 #define FC_SET_OF_REGISTERS { "%ecx", "%edx" }; #define FC_ATTRIB __fastcall #else #define FC_MAX_ARGS_IN_REGS 0 #define FC_SET_OF_REGISTERS { NULL }; #define FC_ATTRIB #endif #endif #if !defined(NO_USE_FAST_CALL) && defined(FC_ATTRIB) #define FC_USED_TO_COMPILE_CORE #ifndef FC /* to compile Ma2Asm/check.c without FC */ #define FC FC_ATTRIB #endif #else #define FC #endif #if defined(_WIN32) || defined(__CYGWIN__) typedef enum { ExceptContinueExecution, ExceptContinueSearch, ExceptNestedException, ExceptCollidedUnwind } EXCEPT_DISPOSITION; typedef struct _excp_lst { struct _excp_lst *chain; EXCEPT_DISPOSITION (*handler)(); } excp_lst; #ifdef __GNUC__ # define SEH_PUSH(new_handler) \ { \ excp_lst e; \ EXCEPT_DISPOSITION new_handler(); \ e.handler = new_handler; \ asm("movl %%fs:0,%0" : "=r" (e.chain)); \ asm("movl %0,%%fs:0" : : "r" (&e)); # define SEH_POP \ asm("movl %0,%%fs:0" : : "r" (e.chain)); \ } #elif defined(_MSC_VER) # define SEH_PUSH(new_handler) \ { \ excp_lst e; \ EXCEPT_DISPOSITION new_handler(); \ e.handler = new_handler; \ __asm push eax \ __asm mov eax,dword ptr fs:[0] \ __asm mov dword ptr [e.chain],eax \ __asm lea eax,[e] \ __asm mov dword ptr fs:[0],eax \ __asm pop eax # define SEH_POP \ __asm push eax \ __asm mov eax,dword ptr [e.chain] \ __asm mov dword ptr fs:[0],eax \ __asm pop eax \ } #elif defined(__LCC__) # define SEH_PUSH(new_handler) \ { \ excp_lst e; \ EXCEPT_DISPOSITION new_handler(); \ e.handler = new_handler; \ _asm("pushl %eax"); \ _asm("movl %fs:0,%eax"); \ _asm("movl %eax,%e"); \ _asm("leal %e,%eax"); \ _asm("movl %eax,%fs:0"); \ _asm("popl %eax"); # define SEH_POP \ _asm("pushl %eax"); \ _asm("movl %e,%eax"); \ _asm("movl %eax,%fs:0"); \ _asm("popl %eax"); \ } #else # error macros SEH_PUSH/POP undefined for this compiler #endif #endif /* defined(_WIN32) || defined(__CYGWIN__) */ #endif /* !_ARCH_DEP_H */ #endif /* !_GP_CONFIG_H */ #define MAX_OBJECT 1024 #define START_PRED_TBL_SIZE 4096 #define START_OPER_TBL_SIZE 1024 #define ATOM_SIZE 16 #define MAX_ATOM (1 << ATOM_SIZE) /* number of elements */ #define NB_OF_X_REGS 256 #define MAX_ARITY (NB_OF_X_REGS - 1) typedef struct { char *endt; char *cur_t; char *cur_p; } HashScan; char *Hash_Alloc_Table(int tbl_size, int elem_size); void Hash_Free_Table(char *tbl); char *Hash_Realloc_Table(char *tbl, int new_tbl_size); void Hash_Delete_All(char *tbl); char *Hash_Insert(char *tbl, char *elem, int replace); char *Hash_Find(char *tbl, long key); char *Hash_Delete(char *tbl, long key); char *Hash_First(char *tbl, HashScan *scan); char *Hash_Next(HashScan *scan); int Hash_Table_Size(char *tbl); int Hash_Nb_Elements(char *tbl); #ifdef DEBUG void Hash_Check_Table(char *tbl); #endif #ifndef _BOOL_H #define _BOOL_H #ifdef FALSE # if FALSE != 0 # error "FALSE already defined with a value != 0" # endif #else #define FALSE 0 #endif #ifdef TRUE # if TRUE != 1 # error "TRUE already defined with a value != 1" # endif #else #define TRUE 1 #endif #ifndef Bool typedef int Bool; #endif #endif /* !_BOOL_H */ #define MAP_REG_TR "ebx" #define MAP_OFFSET_B ((NB_OF_X_REGS+0)*4) #define MAP_OFFSET_H ((NB_OF_X_REGS+1)*4) #define MAP_OFFSET_HB1 ((NB_OF_X_REGS+2)*4) #define MAP_OFFSET_CP ((NB_OF_X_REGS+3)*4) #define MAP_OFFSET_E ((NB_OF_X_REGS+4)*4) #define MAP_OFFSET_CS ((NB_OF_X_REGS+5)*4) #define MAP_OFFSET_S ((NB_OF_X_REGS+6)*4) #define MAP_OFFSET_STAMP ((NB_OF_X_REGS+7)*4) #define MAP_OFFSET_BCI ((NB_OF_X_REGS+8)*4) #define MAP_OFFSET_LSSA ((NB_OF_X_REGS+9)*4) #define CFLAGS_REGS "-ffixed-ebx " typedef long WamWord; /* a wamword is a long (32/64 bits) */ typedef void (*CodePtr) (); /* a code pointer is a ptr to fct */ typedef CodePtr WamCont; /* a continuation is a code pointer */ #ifndef ONLY_TAG_PART #define X(x) (reg_bank[x]) #define A(a) (reg_bank[a]) typedef WamWord *WamWordP; register WamWordP TR asm ("ebx"); #define B (((WamWordP *) reg_bank)[NB_OF_X_REGS+0]) #define H (((WamWordP *) reg_bank)[NB_OF_X_REGS+1]) #define HB1 (((WamWordP *) reg_bank)[NB_OF_X_REGS+2]) #define CP (((WamCont *) reg_bank)[NB_OF_X_REGS+3]) #define E (((WamWordP *) reg_bank)[NB_OF_X_REGS+4]) #define CS (((WamWordP *) reg_bank)[NB_OF_X_REGS+5]) #define S (((WamWordP *) reg_bank)[NB_OF_X_REGS+6]) #define STAMP (((WamWord *) reg_bank)[NB_OF_X_REGS+7]) #define BCI (((WamWord *) reg_bank)[NB_OF_X_REGS+8]) #define LSSA (((WamWordP *) reg_bank)[NB_OF_X_REGS+9]) #define NB_OF_REGS 11 #define NB_OF_ALLOC_REGS 1 #define NB_OF_NOT_ALLOC_REGS 10 #define REG_BANK_SIZE (NB_OF_X_REGS+NB_OF_NOT_ALLOC_REGS) #define NB_OF_USED_MACHINE_REGS 1 #ifdef ENGINE_FILE WamWord reg_bank[REG_BANK_SIZE]; WamWord buff_signal_reg[NB_OF_USED_MACHINE_REGS + 1]; char *reg_tbl[] = { "TR", "B", "H", "HB1", "CP", "E", "CS", "S", "STAMP", "BCI", "LSSA"}; #else extern WamWord reg_bank[]; extern WamWord buff_signal_reg[]; extern char *reg_tbl[]; #endif #define Init_Reg_Bank(x) #define Reg(i) (((i)==0) ? (WamWord) TR : \ ((i)==1) ? (WamWord) B : \ ((i)==2) ? (WamWord) H : \ ((i)==3) ? (WamWord) HB1 : \ ((i)==4) ? (WamWord) CP : \ ((i)==5) ? (WamWord) E : \ ((i)==6) ? (WamWord) CS : \ ((i)==7) ? (WamWord) S : \ ((i)==8) ? (WamWord) STAMP : \ ((i)==9) ? (WamWord) BCI : \ (WamWord) LSSA) #define Save_All_Regs(buff_save) \ do { \ buff_save[0] = (WamWord) TR; \ buff_save[1] = (WamWord) B; \ buff_save[2] = (WamWord) H; \ buff_save[3] = (WamWord) HB1; \ buff_save[4] = (WamWord) CP; \ buff_save[5] = (WamWord) E; \ buff_save[6] = (WamWord) CS; \ buff_save[7] = (WamWord) S; \ buff_save[8] = (WamWord) STAMP; \ buff_save[9] = (WamWord) BCI; \ buff_save[10] = (WamWord) LSSA; \ } while(0) #define Restore_All_Regs(buff_save) \ do { \ TR = (WamWordP) buff_save[0]; \ B = (WamWordP) buff_save[1]; \ H = (WamWordP) buff_save[2]; \ HB1 = (WamWordP) buff_save[3]; \ CP = (WamCont ) buff_save[4]; \ E = (WamWordP) buff_save[5]; \ CS = (WamWordP) buff_save[6]; \ S = (WamWordP) buff_save[7]; \ STAMP = (WamWord ) buff_save[8]; \ BCI = (WamWord ) buff_save[9]; \ LSSA = (WamWordP) buff_save[10]; \ } while(0) #define Save_Machine_Regs(buff_save) \ do { \ register long reg0 asm ("ebx"); \ buff_save[0] = reg0; \ } while(0) #define Restore_Machine_Regs(buff_save) \ do { \ register long reg0 asm ("ebx"); \ reg0 = buff_save[0]; \ } while(0) #define Start_Protect_Regs_For_Signal \ do { \ Save_Machine_Regs(buff_signal_reg); \ buff_signal_reg[NB_OF_USED_MACHINE_REGS] = 1; \ } while(0) #define Stop_Protect_Regs_For_Signal \ buff_signal_reg[NB_OF_USED_MACHINE_REGS] = 0; \ #define Restore_Protect_Regs_For_Signal \ do { \ if (buff_signal_reg[NB_OF_USED_MACHINE_REGS]) { \ Restore_Machine_Regs(buff_signal_reg); \ Stop_Protect_Regs_For_Signal; \ } \ } while(0) #endif #define TAG_SIZE 3 #define TAG_SIZE_LOW 2 #define TAG_SIZE_HIGH 1 #define VALUE_SIZE 29 #define TAG_MASK 0x80000003UL #define VALUE_MASK 0x7ffffffcUL #define Tag_Mask_Of(w) ((unsigned long) (w) & (TAG_MASK)) #define Tag_From_Tag_Mask(w) (((unsigned long) (w) >> 29) | ((w) & 3)) #define Tag_Of(w) ((((unsigned long) (w) >> 31) << 2) | ((w) & 3)) #define TAG_REF_MASK 0UL #define TAG_LST_MASK 0x1UL #define TAG_STC_MASK 0x2UL #define TAG_ATM_MASK 0x3UL #define TAG_FLT_MASK 0x80000000UL #define TAG_FDV_MASK 0x80000001UL #define TAG_INT_MASK 0x80000003UL #define NB_OF_TAGS 7 #define REF 0 #define LST 1 #define STC 2 #define ATM 3 #define FLT 4 #define FDV 5 #define INT 7 #define Tag_Long_Int(tm, v) ((((unsigned long) ((v) << 3)) >> 1) | (tm)) #define Tag_Short_Uns(tm, v) (((unsigned long) (v) << 2) + (tm)) #define Tag_Address(tm, v) ((unsigned long) (v) + (tm)) #define UnTag_Long_Int(w) ((long) ((w) << 1) >> 3) #define UnTag_Short_Uns(w) UnTag_Long_Int(w) #define UnTag_Address(w) ((WamWord *) ((w) & VALUE_MASK)) #define Tag_REF(v) Tag_Address(TAG_REF_MASK, v) #define Tag_LST(v) Tag_Address(TAG_LST_MASK, v) #define Tag_STC(v) Tag_Address(TAG_STC_MASK, v) #define Tag_ATM(v) Tag_Short_Uns(TAG_ATM_MASK, v) #define Tag_FLT(v) Tag_Address(TAG_FLT_MASK, v) #define Tag_FDV(v) Tag_Address(TAG_FDV_MASK, v) #define Tag_INT(v) (((unsigned long) (v) << 2) | TAG_MASK) #define UnTag_REF(w) ((WamWord *) (w)) #define UnTag_LST(w) UnTag_Address(w) #define UnTag_STC(w) UnTag_Address(w) #define UnTag_ATM(w) ((unsigned long) (w) >> 2) #define UnTag_FLT(w) UnTag_Address(w) #define UnTag_FDV(w) UnTag_Address(w) #define UnTag_INT(w) UnTag_Long_Int(w) #define Tag_Is_REF(w) (Tag_Mask_Of(w) == TAG_REF_MASK) #define Tag_Is_LST(w) (Tag_Mask_Of(w) == TAG_LST_MASK) #define Tag_Is_STC(w) (Tag_Mask_Of(w) == TAG_STC_MASK) #define Tag_Is_ATM(w) (Tag_Mask_Of(w) == TAG_ATM_MASK) #define Tag_Is_FLT(w) (Tag_Mask_Of(w) == TAG_FLT_MASK) #define Tag_Is_FDV(w) (Tag_Mask_Of(w) == TAG_FDV_MASK) #define Tag_Is_INT(w) (Tag_Mask_Of(w) == TAG_INT_MASK) typedef enum { LONG_INT, SHORT_UNS, ADDRESS }TypTag; typedef struct { char *name; TypTag type; int value; long tag_mask; }InfTag; #ifdef ENGINE_FILE InfTag tag_tbl[] = { { "REF", ADDRESS, 0, 0UL }, { "LST", ADDRESS, 1, 0x1UL }, { "STC", ADDRESS, 2, 0x2UL }, { "ATM", SHORT_UNS, 3, 0x3UL }, { "FLT", ADDRESS, 4, 0x80000000UL }, { "FDV", ADDRESS, 5, 0x80000001UL }, { "INT", LONG_INT, 7, 0x80000003UL } }; #else extern InfTag tag_tbl[]; #endif #ifndef ONLY_TAG_PART #define KBytes_To_Wam_Words(kb) ((1024 * kb + sizeof(WamWord) - 1) / sizeof(WamWord)) #define Wam_Words_To_KBytes(ww) (ww * sizeof(WamWord) / 1024) #define Local_Top ((B >= E) ? B : E) #define NB_OF_STACKS 4 #define Trail_Stack (stk_tbl[0].stack) #define Trail_Size (stk_tbl[0].size) #define Trail_Offset(adr) ((WamWord *)(adr) - Trail_Stack) #define Trail_Used_Size Trail_Offset(TR) #define Cstr_Stack (stk_tbl[1].stack) #define Cstr_Size (stk_tbl[1].size) #define Cstr_Offset(adr) ((WamWord *)(adr) - Cstr_Stack) #define Cstr_Used_Size Cstr_Offset(CS) #define Global_Stack (stk_tbl[2].stack) #define Global_Size (stk_tbl[2].size) #define Global_Offset(adr) ((WamWord *)(adr) - Global_Stack) #define Global_Used_Size Global_Offset(H) #define Local_Stack (stk_tbl[3].stack) #define Local_Size (stk_tbl[3].size) #define Local_Offset(adr) ((WamWord *)(adr) - Local_Stack) #define Local_Used_Size Local_Offset(Local_Top) #define Stack_Top(s) (((s) == 0) ? TR : ((s) == 1) ? CS : ((s) == 2) ? H : Local_Top) typedef struct { char *name; char *env_var_name; long *p_def_size; int default_size; /* in WamWords */ int size; /* in WamWords */ WamWord *stack; }InfStack; #ifdef ENGINE_FILE long def_trail_size; long def_cstr_size; long def_global_size; long def_local_size; long fixed_sizes; InfStack stk_tbl[] = { { "trail", "TRAILSZ", &def_trail_size, 786432, 0, NULL }, { "cstr", "CSTRSZ", &def_cstr_size, 786432, 0, NULL }, { "global", "GLOBALSZ", &def_global_size, 2097152, 0, NULL }, { "local", "LOCALSZ", &def_local_size, 1048576, 0, NULL } }; #else extern long def_trail_size; extern long def_cstr_size; extern long def_global_size; extern long def_local_size; extern long fixed_sizes; extern InfStack stk_tbl[]; #endif #endif #ifdef NO_STACK_TEST # undef M_Check_Stacks() # define M_Check_Stacks() #endif #define cpp_recurs(p, n) p##_##n #define Prolog_Predicate(p, n) cpp_recurs(p, n) #define Prolog_Prototype(p, n) void Prolog_Predicate(p, n)() #ifdef ENGINE_FILE int os_argc; char **os_argv; char glob_buff[10240]; long *base_fl; /* overwritten by foreign if present */ double *base_fd; /* overwritten by foreign if present */ int use_gui; #else extern int os_argc; extern char **os_argv; extern char glob_buff[]; extern long *base_fl; extern double *base_fd; extern int use_gui; #endif int Start_Prolog(int argc, char *argv[]); void Stop_Prolog(void); void Reset_Prolog(void); void Reset_Prolog_In_Signal(void); void Set_Heap_Actual_Start(WamWord *heap_actual_start); void Execute_Directive(int pl_file, int pl_line, Bool is_system, CodePtr proc); Bool Try_Execute_Top_Level(void); Bool Call_Prolog(CodePtr codep); Bool Call_Prolog_Next_Sol(WamWord *query_b); void Keep_Rest_For_Prolog(WamWord *query_b); void Exit_With_Exception(void); void Execute_A_Continuation(CodePtr codep); #define Goto_Predicate(p, n) ((*Prolog_Predicate(p, n))()) #if 1 #define OPTIM_1_CHAR_ATOM #endif #define LA 1 /* layout character */ #define SC 2 /* solo character */ #define QT 4 /* quote */ #define DQ 8 /* double quote */ #define BQ 16 /* back quote */ #define GR 32 /* graphic char */ #define PC 64 /* punctuation character */ #define DI 128 /* digit */ #define UL 256 /* underline */ #define CL 512 /* capital letter */ #define SL 1024 /* small letter */ #define CM 2048 /* comment character (%) */ #define EX 4096 /* extended character */ #define ATOM_NIL 1766 #define IDENTIFIER_ATOM 0 #define GRAPHIC_ATOM 1 #define SOLO_ATOM 2 #define OTHER_ATOM 3 #define Is_Valid_Code(c) ((unsigned) (c)-1 <256-1) /* 1<= c <256 */ #define Is_Valid_Byte(c) ((unsigned) (c) <256) /* 0=< c <256 */ #define Is_Valid_Atom(a) ((a)>=0 && (a) (the string) */ AtomProp prop; /* associated properties */ } AtomInf; #ifdef ATOM_FILE AtomInf atom_tbl[MAX_ATOM]; int nb_atom; int atom_void; int atom_curly_brackets; int atom_false; int atom_true; int atom_end_of_file; #ifndef OPTIM_1_CHAR_ATOM int atom_char[256]; #endif char char_conv[256]; #else extern AtomInf atom_tbl[]; extern int nb_atom; extern int atom_void; extern int atom_curly_brackets; extern int atom_false; extern int atom_true; extern int atom_end_of_file; #ifndef OPTIM_1_CHAR_ATOM extern int atom_char[]; #endif extern char char_conv[]; extern int char_type[]; extern char escape_symbol[]; extern char escape_char[]; #endif void Init_Atom(void); int FC Create_Allocate_Atom(char *name); int FC Create_Atom(char *name); WamWord FC Create_Atom_Tagged(char *name); int FC Find_Atom(char *name); int FC Gen_New_Atom(char *prefix, int hash); int FC Find_Next_Atom(int last_atom); #ifdef OPTIM_1_CHAR_ATOM #define ATOM_CHAR(c) ((int) (unsigned char) (c)) #else #define ATOM_CHAR(c) (atom_char[(int) (unsigned char) (c)]) #endif typedef struct /* Predicate information */ { /* ------------------------------ */ long f_n; /* key is */ int pl_file; /* atom pl file of its definiton */ int pl_line; /* pl file line of its definition */ int prop; /* predicate props (cf BipsPl) */ long *codep; /* compiled code */ long *dyn; /* dynamic info (cf BipsPl) */ } PredInf; #ifdef PRED_FILE char *pred_tbl; #else extern char *pred_tbl; #endif void Init_Pred(void); PredInf * FC Create_Pred(int func, int arity, int pl_file, int pl_line, int prop, long *codep); PredInf * FC Lookup_Pred(int func, int arity); void FC Delete_Pred(int func, int arity); #include char *Malloc_Check(unsigned size, char *src_file, int src_line); char *Calloc_Check(unsigned nb, unsigned size, char *src_file, int src_line); char *Realloc_Check(char *ptr, unsigned size, char *src_file, int src_line); char *Strdup_Check(char *str, char *src_file, int src_line); #define Malloc(size) Malloc_Check(size, __FILE__, __LINE__) #define Calloc(nb, size) Calloc_Check(nb, size, __FILE__, __LINE__) #define Realloc(ptr, size) Realloc_Check(ptr, size, __FILE__, __LINE__) #define Free(ptr) free(ptr) #define Strdup(str) Strdup_Check(str, __FILE__, __LINE__) void Extend_Table_If_Needed(char **hash_tbl); void Extend_Array(char **ptbl, int *nb_elem, int elem_size, Bool bzero); void Exit_With_Value(int ret_val); void Fatal_Error(char *format, ...); #define MAX_PREC 1200 #define MAX_ARG_OF_FUNCTOR_PREC 999 #define Make_Oper_Key(a, t) (((unsigned long) (a) << 2) | (t)) #define Atom_Of_Oper(k) ((unsigned long) (k) >> 2) #define Type_Of_Oper(k) ((unsigned long) (k) & 3) #define PREFIX 0 #define POSTFIX 1 #define INFIX 2 #define Make_Op_Mask(type) (1<<(type)) typedef struct /* Operator information */ { /* ------------------------------ */ long a_t; /* key is */ int prec; /* precedence of the operator */ int left; /* precedence of the operator lhs */ int right; /* precedence of the operator rhs */ } OperInf; #ifdef OPER_FILE char *oper_tbl; #else extern char *oper_tbl; #endif void Init_Oper(void); OperInf *Create_Oper(int atom_op, int type, int prec, int left, int right); OperInf *Lookup_Oper(int atom_op, int type); OperInf *Lookup_Oper_Any_Type(int atom_op); OperInf *Delete_Oper(int atom_op, int type); #define Check_Oper(atom_op, type) \ (atom_tbl[(atom_op)].prop.op_mask & Make_Op_Mask(type)) #define Check_Oper_Any_Type(atom_op) \ (atom_tbl[(atom_op)].prop.op_mask) #include #define M_OS_UNIX 0 #define M_OS_WINDOWS 1 #define M_OS_WINDOWS_NT 2 #ifdef MACHINE1_FILE int m_os_type; char m_architecture[32]; char m_os_version[256]; #else extern int m_os_type; extern char m_architecture[]; extern char m_os_version[]; #endif void Init_Machine1(void); char **M_Create_Shell_Command(char *cmd); char **M_Cmd_Line_To_Argv(char *cmd, int *argc); int M_Shell(char *cmd); int M_Spawn(char *arg[]); int M_Spawn_Redirect(char *arg[], int detach, FILE **f_in, FILE **f_out, FILE **f_err); int M_Get_Status(int pid); char *M_Mktemp(char *tmp_template); char *M_Tempnam(char *dir, char *pfx); #define DBGPRINTF printf #ifndef _MACHINE_H #define _MACHINE_H void Init_Machine(void); void M_Allocate_Stacks(void); char *M_Sys_Err_String(int err_no); long M_User_Time(void); long M_System_Time(void); long M_Real_Time(void); void M_Randomize(void); void M_Set_Seed(int n); int M_Get_Seed(void); int M_Random_Integer(int n); double M_Random_Float(double n); char *M_Host_Name_From_Name(char *host_name); char *M_Host_Name_From_Adr(char *host_address); char *M_Get_Working_Dir(void); Bool M_Set_Working_Dir(char *path); char *M_Absolute_Path_Name(char *src); #if defined(_WIN32) && !defined(__CYGWIN__) int getpagesize(void); #endif void M_Check_Magic_Words(void); /* not compiled if not needed */ #if defined(M_sparc) # define M_USED_REGS {"g6", "g7", 0} #elif defined(M_mips) #define M_USED_REGS {"$16", "$17", "$18", "$19", "$20", \ "$21", "$22", "$23", 0} #elif defined(M_alpha) # define M_USED_REGS {"$9", "$10", "$11", "$12", "$13", "$14", 0} #elif defined(M_ix86) && !defined(_MSC_VER) && !defined(M_ix86_darwin) #ifdef NO_USE_EBP # define M_USED_REGS {"ebx", 0} #else # define M_USED_REGS {"ebx", "ebp", 0} #endif #elif defined(M_powerpc) # define M_USED_REGS {"15", "20", 0} #elif defined(M_x86_64) # define M_USED_REGS {"r12", "r13", "r14", "r15", 0} #else # define M_USED_REGS {0} #endif #if defined(M_ix86) && !defined(_WIN32) && !defined(NO_USE_REGS) #define NO_MACHINE_REG_FOR_REG_BANK #endif #if WORD_SIZE == 32 # define M_MMAP_HIGH_ADR1 0x0ffffff0 # define M_MMAP_HIGH_ADR2 0x3ffffff0 # define M_MMAP_HIGH_ADR3 0x7ffffff0 #elif defined(M_alpha_osf) || defined(M_alpha_linux) # define M_MMAP_HIGH_ADR1 0x3f800000000ULL #elif defined(M_x86_64_linux) # define M_MMAP_HIGH_ADR1 0x4000000000ULL #endif #if defined(M_sunos) || defined(M_solaris) # define MMAP_NEEDS_FIXED #endif #ifdef __OpenBSD__ #define USE_DL_MALLOC #endif #endif void Find_Linked_Objects(void); void New_Object(void (*fct_obj_init)(), void (*fct_exec_system) (), void (*fct_exec_user) ()); #ifdef OBJ_INIT static void OBJ_INIT(void); #define CPP_CAT1(x, y) x ## y #define CPP_CAT(x, y) CPP_CAT1(x, y) #define OBJ_CTOR CPP_CAT(OBJ_INIT,_ctor) #ifdef __GNUC__ static void __attribute__ ((constructor)) OBJ_CTOR(void) { New_Object(OBJ_INIT, NULL, NULL); } #else /* _MSC_VER */ static void OBJ_CTOR(void) { New_Object(OBJ_INIT, NULL, NULL); } #pragma data_seg(".GPLC$m") static long obj_chain_start = (long) OBJ_CTOR; #pragma data_seg() #endif /* _MSC_VER */ #endif /* OBJ_INIT */ #if defined(_MSC_VER) || defined(M_ix86_darwin) #define OBJ_CHAIN_REVERSE_ORDER #endif #if 0 #define GARBAGE_COLLECTOR #endif #define NOT_A_WAM_WORD Tag_REF(0) #define NIL_WORD Tag_ATM(ATOM_NIL) #define WRITE_MODE NULL #ifdef GARBAGE_COLLECTOR #define ENVIR_STATIC_SIZE 4 #define CPE(e) (*(WamCont *) &(e[-1])) #define BCIE(e) (*(WamWord *) &(e[-2])) #define EE(e) (*(WamWord **) &(e[-3])) #define NBYE(e) (*(WamWord *) &(e[-4])) #define Y(e, y) (*(WamWord *) &(e[-5 - (y)])) #define ENVIR_NAMES {"CPE", "BCIE", "EE", "NBYE"} #else #define ENVIR_STATIC_SIZE 3 #define CPE(e) (*(WamCont *) &(e[-1])) #define BCIE(e) (*(WamWord *) &(e[-2])) #define EE(e) (*(WamWord **) &(e[-3])) #define Y(e, y) (*(WamWord *) &(e[-4 - (y)])) #define ENVIR_NAMES {"CPE", "BCIE", "EE"} #endif #define CHOICE_STATIC_SIZE 8 #define ALTB(b) (*(CodePtr *) &(b[-1])) #define CPB(b) (*(WamCont *) &(b[-2])) #define BCIB(b) (*(WamWord *) &(b[-3])) #define EB(b) (*(WamWord **) &(b[-4])) #define BB(b) (*(WamWord **) &(b[-5])) #define HB(b) (*(WamWord **) &(b[-6])) #define TRB(b) (*(WamWord **) &(b[-7])) #define CSB(b) (*(WamWord **) &(b[-8])) #define AB(b, a) (*(WamWord *) &(b[-9 - (a)])) #define CHOICE_NAMES {"ALTB", "CPB", "BCIB", "EB", "BB", \ "HB", "TRB", "CSB"} #define NB_OF_TRAIL_TAGS 4 #define TUV 0 /* Trail Unbound Variable */ #define TOV 1 /* Trail One Value */ #define TMV 2 /* Trail Multiple Values */ #define TFC 3 /* Trail for Function Call */ #define TRAIL_TAG_NAMES {"TUV", "TOV", "TMV", "TFC"} #define Trail_Tag_Value(t, v) ((unsigned long) (v) | (t)) #define Trail_Tag_Of(w) ((unsigned long) (w) & 0x3) #define Trail_Value_Of(w) ((unsigned long) (w) & (~0x3)) #define Functor_Arity(f, n) (((n) << ATOM_SIZE) + (f)) #define Functor_Of(word) ((word) & (MAX_ATOM - 1)) #define Arity_Of(word) ((word) >> ATOM_SIZE) #ifndef NO_USE_FD_SOLVER #define Dont_Separate_Tag(tag_mask) ((tag_mask) == TAG_FDV_MASK) #else #define Dont_Separate_Tag(tag_mask) (0) #endif #define Do_Copy_Of_Word(tag_mask, word) \ if (Dont_Separate_Tag(tag_mask)) \ word = Tag_REF(UnTag_Address(word)) #define Make_Self_Ref(adr) (Tag_REF(adr)) #define INT_GREATEST_VALUE ((long) ((1L<<(WORD_SIZE-TAG_SIZE-1))-1)) #define INT_LOWEST_VALUE ((long) ((-INT_GREATEST_VALUE)-1)) #define OFFSET_CAR 0 #define Car(adr) (((WamWord *) adr)[OFFSET_CAR]) #define Cdr(adr) (((WamWord *) adr)[OFFSET_CAR+1]) #define OFFSET_ARG 1 #define Functor(adr) (Functor_Of(Functor_And_Arity(adr))) #define Arity(adr) (Arity_Of(Functor_And_Arity(adr))) #define Functor_And_Arity(adr) (((WamWord *) (adr))[0]) #define Arg(adr, i) (((WamWord *) (adr))[OFFSET_ARG+i]) #define Global_Push(word) (*H++ = (WamWord) (word)) #define Global_Pop (*--H) #define Trail_Push(word) (*TR++ = (WamWord) (word)) #define Trail_Pop (*--TR) #define Is_A_Local_Adr(adr) ((adr) >= LSSA) #define From_B_To_WamWord(b) (Tag_INT((b) - LSSA)) #define From_WamWord_To_B(word) (LSSA + UnTag_INT(word)) #ifdef M_sparc #define Adjust_CP(cp) ((WamCont) ((unsigned long) (cp) - 8)) #define UnAdjust_CP(cp) ((WamCont) ((unsigned long) (cp) + 8)) #else #define Adjust_CP(p) ((WamCont) (p)) #define UnAdjust_CP(cp) (cp) #endif #ifndef FRAMES_ONLY typedef struct /* Switch item information */ { /* ------------------------------- */ long key; /* key: atm, int (if no_opt), f/n */ CodePtr codep; /* compiled code pointer if static */ } SwtInf; typedef SwtInf *SwtTbl; WamWord FC Create_Functor_Arity_Tagged(char *func_str, int arity); SwtTbl FC Create_Swt_Table(int size); void FC Create_Swt_Atm_Element(SwtTbl t, int size, int atom, CodePtr codep); void FC Create_Swt_Stc_Element(SwtTbl t, int size, int func, int arity, CodePtr codep); Bool FC Get_Atom_Tagged(WamWord w, WamWord start_word); Bool FC Get_Atom(int atom, WamWord start_word); Bool FC Get_Integer_Tagged(WamWord w, WamWord start_word); Bool FC Get_Integer(long n, WamWord start_word); Bool FC Get_Float(double n, WamWord start_word); Bool FC Get_Nil(WamWord start_word); Bool FC Get_List(WamWord start_word); Bool FC Get_Structure_Tagged(WamWord w, WamWord start_word); Bool FC Get_Structure(int func, int arity, WamWord start_word); WamWord FC Put_X_Variable(void); WamWord FC Put_Y_Variable(WamWord *y_adr); WamWord FC Put_Unsafe_Value(WamWord start_word); WamWord FC Put_Atom_Tagged(WamWord w); WamWord FC Put_Atom(int atom); WamWord FC Put_Integer_Tagged(WamWord w); WamWord FC Put_Integer(long n); WamWord FC Put_Float(double n); WamWord FC Put_Nil(void); WamWord FC Put_List(void); WamWord FC Put_Structure_Tagged(WamWord w); WamWord FC Put_Structure(int func, int arity); WamWord FC Unify_Variable(void); void FC Unify_Void(int n); Bool FC Unify_Value(WamWord start_word); Bool FC Unify_Local_Value(WamWord start_word); Bool FC Unify_Atom_Tagged(WamWord w); Bool FC Unify_Atom(int atom); Bool FC Unify_Integer_Tagged(WamWord w); Bool FC Unify_Integer(long n); Bool FC Unify_Nil(void); Bool FC Unify_List(void); Bool FC Unify_Structure_Tagged(WamWord w); Bool FC Unify_Structure(int func, int arity); WamWord FC Globalize_If_In_Local(WamWord start_word); void FC Allocate(int n); void FC Deallocate(void); CodePtr FC Switch_On_Term(CodePtr c_var, CodePtr c_atm, CodePtr c_int, CodePtr c_lst, CodePtr c_stc); CodePtr FC Switch_On_Term_Var_Atm(CodePtr c_var, CodePtr c_atm); CodePtr FC Switch_On_Term_Var_Stc(CodePtr c_var, CodePtr c_stc); CodePtr FC Switch_On_Term_Var_Atm_Lst(CodePtr c_var, CodePtr c_atm, CodePtr c_lst); CodePtr FC Switch_On_Term_Var_Atm_Stc(CodePtr c_var, CodePtr c_atm, CodePtr c_stc); CodePtr FC Switch_On_Atom(SwtTbl t, int size); long FC Switch_On_Integer(void); CodePtr FC Switch_On_Structure(SwtTbl t, int size); void FC Load_Cut_Level(WamWord *word_adr); void FC Cut(WamWord b_word); void FC Global_Push_Float(double n); double FC Obtain_Float(WamWord *adr); void FC Create_Choice_Point(CodePtr codep_alt, int arity); void FC Create_Choice_Point1(CodePtr codep_alt); void FC Create_Choice_Point2(CodePtr codep_alt); void FC Create_Choice_Point3(CodePtr codep_alt); void FC Create_Choice_Point4(CodePtr codep_alt); void FC Update_Choice_Point(CodePtr codep_alt, int arity); void FC Update_Choice_Point1(CodePtr codep_alt); void FC Update_Choice_Point2(CodePtr codep_alt); void FC Update_Choice_Point3(CodePtr codep_alt); void FC Update_Choice_Point4(CodePtr codep_alt); void FC Delete_Choice_Point(int arity); void FC Delete_Choice_Point1(void); void FC Delete_Choice_Point2(void); void FC Delete_Choice_Point3(void); void FC Delete_Choice_Point4(void); void FC Untrail(WamWord *low_adr); Bool FC Unify(WamWord start_u_word, WamWord start_v_word); Bool FC Unify_Occurs_Check(WamWord start_u_word, WamWord start_v_word); #endif /* FRAME_ONLY */ #if 0 #define DEREF_STATS #endif #ifdef DEREF_STATS long nb_deref; long chain_len; #define DEREF_COUNT(x) x++ #else #define DEREF_COUNT(x) #endif #define DEREF(start_word, word, tag_mask) \ do \ { \ WamWord deref_last_word; \ \ word = start_word; \ \ DEREF_COUNT(nb_deref); \ do \ { \ DEREF_COUNT(chain_len); \ deref_last_word = word; \ tag_mask = Tag_Mask_Of(word); \ if (tag_mask != TAG_REF_MASK) \ break; \ word = *(UnTag_REF(word)); \ } \ while (word != deref_last_word); \ } \ while (0) #define Word_Needs_Trailing(adr) \ ((adr) < HB1 || (Is_A_Local_Adr(adr) && (adr) < B)) #define Bind_UV(adr, word) \ do \ { \ if (Word_Needs_Trailing(adr)) \ Trail_UV(adr); \ *(adr) = (word); \ } \ while (0) #define Bind_OV(adr, word) \ do \ { \ if (Word_Needs_Trailing(adr)) \ Trail_OV(adr); \ *(adr) = (word); \ } \ while (0) #define Bind_MV(adr, nb, real_adr) \ do \ { \ if (Word_Needs_Trailing(adr)) \ Trail_MV(adr, nb); \ Mem_Word_Cpy(adr, real_adr, nb); \ } \ while (0) #define Trail_UV(adr) \ Trail_Push(Trail_Tag_Value(TUV, adr)) #define Trail_OV(adr) \ do \ { \ Trail_Push(*(adr)); \ Trail_Push(Trail_Tag_Value(TOV, adr)); \ } \ while (0) #define Trail_MV(adr, nb) \ do \ { \ Mem_Word_Cpy(TR, adr, nb); \ TR += nb; \ Trail_Push(nb); \ Trail_Push(Trail_Tag_Value(TMV, adr)); \ } \ while (0) #define Trail_FC(fct, nb, arg) \ do \ { \ Mem_Word_Cpy(TR, arg, nb); \ TR += nb; \ Trail_Push(nb); \ Trail_Push(fct); /*fct adr not aligned*/ \ Trail_Push(Trail_Tag_Value(TFC, 0)); \ } \ while (0) #define Assign_B(newB) (B = (newB), HB1 = HB(B)) #define Delete_Last_Choice_Point() Assign_B(BB(B)) #define Globalize_Local_Unbound_Var(adr, res_word) \ do \ { \ WamWord *cur_H = H; \ \ res_word = Make_Self_Ref(cur_H); \ *cur_H = res_word; \ H++; \ Bind_UV(adr, res_word); \ } \ while (0) #define Mem_Word_Cpy(dst, src, nb) \ do \ { \ register long *s = (long *) (src); \ register long *d = (long *) (dst); \ register int counter = (nb); \ \ do \ *d++ = *s++; \ while (--counter); \ } \ while (0) #ifdef IF_NO_FD_FILE void (*fd_init_solver) (); /* overwritten by FD if present */ void (*fd_reset_solver) (); Bool (*fd_unify_with_integer) (); Bool (*fd_unify_with_fd_var) (); int (*fd_variable_size) (); int (*fd_copy_variable) (); char *(*fd_variable_to_string) (); #else extern void (*fd_init_solver) (); extern void (*fd_reset_solver) (); extern Bool (*fd_unify_with_integer) (); extern Bool (*fd_unify_with_fd_var) (); extern int (*fd_variable_size) (); extern int (*fd_copy_variable) (); extern char *(*fd_variable_to_string) (); #endif void Fd_Init_Solver(void); void Fd_Reset_Solver(void); #define Fd_Unify_With_Integer(f, n) ((*fd_unify_with_integer)(f, n)) #define Fd_Unify_With_Fd_Var(f1, f2)((*fd_unify_with_fd_var)(f1, f2)) #define Fd_Variable_Size(f) ((*fd_variable_size)(f)) #define Fd_Copy_Variable(dst_adr, f)((*fd_copy_variable)(dst_adr, f)) #define Fd_Variable_To_String(f) ((*fd_variable_to_string)(f)) #define MAX_VAR_NAME_LENGTH 256 #define MAX_VAR_IN_TERM 2048 #define MAX_SYS_VARS 256 Bool FC Blt_Var(WamWord x); Bool FC Blt_Non_Var(WamWord x); Bool FC Blt_Atom(WamWord x); Bool FC Blt_Integer(WamWord x); Bool FC Blt_Float(WamWord x); Bool FC Blt_Number(WamWord x); Bool FC Blt_Atomic(WamWord x); Bool FC Blt_Compound(WamWord x); Bool FC Blt_Callable(WamWord x); Bool FC Blt_Fd_Var(WamWord x); Bool FC Blt_Non_Fd_Var(WamWord x); Bool FC Blt_Generic_Var(WamWord x); Bool FC Blt_Non_Generic_Var(WamWord x); Bool FC Blt_List(WamWord x); Bool FC Blt_Partial_List(WamWord x); Bool FC Blt_List_Or_Partial_List(WamWord x); Bool FC Blt_Term_Eq(WamWord x, WamWord y); Bool FC Blt_Term_Neq(WamWord x, WamWord y); Bool FC Blt_Term_Lt(WamWord x, WamWord y); Bool FC Blt_Term_Lte(WamWord x, WamWord y); Bool FC Blt_Term_Gt(WamWord x, WamWord y); Bool FC Blt_Term_Gte(WamWord x, WamWord y); Bool FC Blt_Compare(WamWord cmp_word, WamWord x, WamWord y); Bool FC Blt_Arg(WamWord arg_no_word, WamWord term_word, WamWord sub_term_word); Bool FC Blt_Functor(WamWord term_word, WamWord functor_word, WamWord arity_word); Bool FC Blt_Univ(WamWord term_word, WamWord list_word); void FC Blt_G_Assign(WamWord x, WamWord y); void FC Blt_G_Assignb(WamWord x, WamWord y); void FC Blt_G_Link(WamWord x, WamWord y); Bool FC Blt_G_Read(WamWord x, WamWord y); Bool FC Blt_G_Array_Size(WamWord x, WamWord y); void FC Blt_G_Inc(WamWord x); Bool FC Blt_G_Inco(WamWord x, WamWord y); Bool FC Blt_G_Inc_2(WamWord x, WamWord y); Bool FC Blt_G_Inc_3(WamWord x, WamWord y, WamWord z); void FC Blt_G_Dec(WamWord x); Bool FC Blt_G_Deco(WamWord x, WamWord y); Bool FC Blt_G_Dec_2(WamWord x, WamWord y); Bool FC Blt_G_Dec_3(WamWord x, WamWord y, WamWord z); void FC Blt_G_Set_Bit(WamWord x, WamWord y); void FC Blt_G_Reset_Bit(WamWord x, WamWord y); Bool FC Blt_G_Test_Set_Bit(WamWord x, WamWord y); Bool FC Blt_G_Test_Reset_Bit(WamWord x, WamWord y); void FC Math_Fast_Load_Value(WamWord start_word, WamWord *word_adr); void FC Math_Load_Value(WamWord start_word, WamWord *word_adr); WamWord FC Fct_Fast_Neg(WamWord x); WamWord FC Fct_Fast_Inc(WamWord x); WamWord FC Fct_Fast_Dec(WamWord x); WamWord FC Fct_Fast_Add(WamWord x, WamWord y); WamWord FC Fct_Fast_Sub(WamWord x, WamWord y); WamWord FC Fct_Fast_Mul(WamWord x, WamWord y); WamWord FC Fct_Fast_Div(WamWord x, WamWord y); WamWord FC Fct_Fast_Rem(WamWord x, WamWord y); WamWord FC Fct_Fast_Mod(WamWord x, WamWord y); WamWord FC Fct_Fast_And(WamWord x, WamWord y); WamWord FC Fct_Fast_Or(WamWord x, WamWord y); WamWord FC Fct_Fast_Xor(WamWord x, WamWord y); WamWord FC Fct_Fast_Not(WamWord x); WamWord FC Fct_Fast_Shl(WamWord x, WamWord y); WamWord FC Fct_Fast_Shr(WamWord x, WamWord y); WamWord FC Fct_Fast_Abs(WamWord x); WamWord FC Fct_Fast_Sign(WamWord x); WamWord FC Fct_Neg(WamWord x); WamWord FC Fct_Inc(WamWord x); WamWord FC Fct_Dec(WamWord x); WamWord FC Fct_Add(WamWord x, WamWord y); WamWord FC Fct_Sub(WamWord x, WamWord y); WamWord FC Fct_Mul(WamWord x, WamWord y); WamWord FC Fct_Div(WamWord x, WamWord y); WamWord FC Fct_Float_Div(WamWord x, WamWord y); WamWord FC Fct_Rem(WamWord x, WamWord y); WamWord FC Fct_Mod(WamWord x, WamWord y); WamWord FC Fct_And(WamWord x, WamWord y); WamWord FC Fct_Or(WamWord x, WamWord y); WamWord FC Fct_Xor(WamWord x, WamWord y); WamWord FC Fct_Not(WamWord x); WamWord FC Fct_Shl(WamWord x, WamWord y); WamWord FC Fct_Shr(WamWord x, WamWord y); WamWord FC Fct_Abs(WamWord x); WamWord FC Fct_Sign(WamWord x); WamWord FC Fct_Min(WamWord x, WamWord y); WamWord FC Fct_Max(WamWord x, WamWord y); WamWord FC Fct_Pow(WamWord x, WamWord y); WamWord FC Fct_Sqrt(WamWord x); WamWord FC Fct_Atan(WamWord x); WamWord FC Fct_Cos(WamWord x); WamWord FC Fct_Acos(WamWord x); WamWord FC Fct_Sin(WamWord x); WamWord FC Fct_Asin(WamWord x); WamWord FC Fct_Exp(WamWord x); WamWord FC Fct_Log(WamWord x); WamWord FC Fct_Float(WamWord x); WamWord FC Fct_Ceiling(WamWord x); WamWord FC Fct_Floor(WamWord x); WamWord FC Fct_Round(WamWord x); WamWord FC Fct_Truncate(WamWord x); WamWord FC Fct_Float_Fract_Part(WamWord x); WamWord FC Fct_Float_Integ_Part(WamWord x); WamWord FC Fct_Identity(WamWord x); Bool FC Blt_Fast_Eq(WamWord x, WamWord y); Bool FC Blt_Fast_Neq(WamWord x, WamWord y); Bool FC Blt_Fast_Lt(WamWord x, WamWord y); Bool FC Blt_Fast_Lte(WamWord x, WamWord y); Bool FC Blt_Fast_Gt(WamWord x, WamWord y); Bool FC Blt_Fast_Gte(WamWord x, WamWord y); Bool FC Blt_Eq(WamWord x, WamWord y); Bool FC Blt_Neq(WamWord x, WamWord y); Bool FC Blt_Lt(WamWord x, WamWord y); Bool FC Blt_Lte(WamWord x, WamWord y); Bool FC Blt_Gt(WamWord x, WamWord y); Bool FC Blt_Gte(WamWord x, WamWord y); long Rd_Integer_Check(WamWord start_word); long Rd_Integer(WamWord start_word); long Rd_Positive_Check(WamWord start_word); long Rd_Positive(WamWord start_word); double Rd_Float_Check(WamWord start_word); double Rd_Float(WamWord start_word); double Rd_Number_Check(WamWord start_word); double Rd_Number(WamWord start_word); int Rd_Atom_Check(WamWord start_word); int Rd_Atom(WamWord start_word); int Rd_Boolean_Check(WamWord start_word); int Rd_Boolean(WamWord start_word); int Rd_Char_Check(WamWord start_word); int Rd_Char(WamWord start_word); int Rd_In_Char_Check(WamWord start_word); int Rd_In_Char(WamWord start_word); int Rd_Code_Check(WamWord start_word); int Rd_Code(WamWord start_word); int Rd_In_Code_Check(WamWord start_word); int Rd_In_Code(WamWord start_word); int Rd_Byte_Check(WamWord start_word); int Rd_Byte(WamWord start_word); int Rd_In_Byte_Check(WamWord start_word); int Rd_In_Byte(WamWord start_word); char *Rd_String_Check(WamWord start_word); char *Rd_String(WamWord start_word); char *Rd_Chars_Check(WamWord start_word); char *Rd_Chars(WamWord start_word); char *Rd_Codes_Check(WamWord start_word); char *Rd_Codes(WamWord start_word); int Rd_Chars_Str_Check(WamWord start_word, char *str); int Rd_Chars_Str(WamWord start_word, char *str); int Rd_Codes_Str_Check(WamWord start_word, char *str); int Rd_Codes_Str(WamWord start_word, char *str); WamWord *Rd_List_Check(WamWord start_word); WamWord *Rd_List(WamWord start_word); int Rd_Proper_List_Check(WamWord start_word, WamWord *arg); int Rd_Proper_List(WamWord start_word, WamWord *arg); WamWord *Rd_Compound_Check(WamWord start_word, int *func, int *arity); WamWord *Rd_Compound(WamWord start_word, int *func, int *arity); WamWord *Rd_Callable_Check(WamWord start_word, int *func, int *arity); WamWord *Rd_Callable(WamWord start_word, int *func, int *arity); void Check_For_Un_Integer(WamWord start_word); void Check_For_Un_Positive(WamWord start_word); void Check_For_Un_Float(WamWord start_word); void Check_For_Un_Number(WamWord start_word); void Check_For_Un_Atom(WamWord start_word); void Check_For_Un_Boolean(WamWord start_word); void Check_For_Un_Char(WamWord start_word); void Check_For_Un_In_Char(WamWord start_word); void Check_For_Un_Code(WamWord start_word); void Check_For_Un_In_Code(WamWord start_word); void Check_For_Un_Byte(WamWord start_word); void Check_For_Un_In_Byte(WamWord start_word); void Check_For_Un_String(WamWord start_word); void Check_For_Un_Chars(WamWord start_word); void Check_For_Un_Codes(WamWord start_word); void Check_For_Un_List(WamWord start_word); void Check_For_Un_Compound(WamWord start_word); void Check_For_Un_Callable(WamWord start_word); void Check_For_Un_Variable(WamWord start_word); Bool Un_Integer_Check(long value, WamWord start_word); Bool Un_Integer(long value, WamWord start_word); Bool Un_Positive_Check(long value, WamWord start_word); Bool Un_Positive(long value, WamWord start_word); Bool Un_Float_Check(double value, WamWord start_word); Bool Un_Float(double value, WamWord start_word); Bool Un_Number_Check(double value, WamWord start_word); Bool Un_Number(double value, WamWord start_word); Bool Un_Atom_Check(int value, WamWord start_word); Bool Un_Atom(int value, WamWord start_word); Bool Un_Boolean_Check(int value, WamWord start_word); Bool Un_Boolean(int value, WamWord start_word); Bool Un_Char_Check(int value, WamWord start_word); Bool Un_Char(int value, WamWord start_word); Bool Un_In_Char_Check(int value, WamWord start_word); Bool Un_In_Char(int value, WamWord start_word); Bool Un_Code_Check(int value, WamWord start_word); Bool Un_Code(int value, WamWord start_word); Bool Un_In_Code_Check(int value, WamWord start_word); Bool Un_In_Code(int value, WamWord start_word); Bool Un_Byte_Check(int value, WamWord start_word); Bool Un_Byte(int value, WamWord start_word); Bool Un_In_Byte_Check(int value, WamWord start_word); Bool Un_In_Byte(int value, WamWord start_word); Bool Un_String_Check(char *value, WamWord start_word); Bool Un_String(char *value, WamWord start_word); Bool Un_Chars_Check(char *value, WamWord start_word); Bool Un_Chars(char *value, WamWord start_word); Bool Un_Codes_Check(char *value, WamWord start_word); Bool Un_Codes(char *value, WamWord start_word); Bool Un_List_Check(WamWord *arg, WamWord start_word); Bool Un_List(WamWord *arg, WamWord start_word); Bool Un_Proper_List_Check(int n, WamWord *arg, WamWord start_word); Bool Un_Proper_List(int n, WamWord *arg, WamWord start_word); Bool Un_Compound_Check(int func, int arity, WamWord *arg, WamWord start_word); Bool Un_Compound(int func, int arity, WamWord *arg, WamWord start_word); Bool Un_Callable_Check(int func, int arity, WamWord *arg, WamWord start_word); Bool Un_Callable(int func, int arity, WamWord *arg, WamWord start_word); Bool Un_Term(WamWord term_word, WamWord start_word); WamWord Mk_Integer(long value); WamWord Mk_Positive(long value); WamWord Mk_Float(double value); WamWord Mk_Number(double value); WamWord Mk_Atom(int value); WamWord Mk_Boolean(int value); WamWord Mk_Char(int value); WamWord Mk_In_Char(int value); WamWord Mk_Code(int value); WamWord Mk_In_Code(int value); WamWord Mk_Byte(int value); WamWord Mk_In_Byte(int value); WamWord Mk_String(char *value); WamWord Mk_Chars(char *value); WamWord Mk_Codes(char *value); WamWord Mk_List(WamWord *arg); WamWord Mk_Proper_List(int n, WamWord *arg); WamWord Mk_Compound(int func, int arity, WamWord *arg); WamWord Mk_Callable(int func, int arity, WamWord *arg); WamWord Mk_Variable(void); #define PL_RECOVER 0 #define PL_CUT 1 #define PL_KEEP_FOR_PROLOG 2 #define PL_FAILURE FALSE #define PL_SUCCESS TRUE #define PL_EXCEPTION 2 typedef struct { Bool is_var; Bool unify; union { long l; char *s; double d; } value; } FIOArg; #ifdef FOREIGN_SUPP_FILE int foreign_bkt_counter; char *foreign_bkt_buffer; #else extern int foreign_bkt_counter; extern char *foreign_bkt_buffer; #endif void Foreign_Create_Choice(CodePtr codep_alt, int arity, int choice_size); void Foreign_Update_Choice(CodePtr codep_alt, int arity, int choice_size); CodePtr Foreign_Jump_Ret(CodePtr codep); FIOArg *Foreign_Rd_IO_Arg(int arg_long, WamWord start_word, long (*rd_fct) (), int fio_arg_index); Bool Foreign_Un_IO_Arg(int arg_long, Bool (*un_fct) (), FIOArg *fa, WamWord start_word); void Emit_Syntax_Error(char *file_name, int err_line, int err_col, char *err_msg); int Type_Of_Term(WamWord start_word); void Pl_Exec_Continuation(int func, int arity, WamWord *arg_adr); void Pl_Query_Begin(Bool recoverable); int Pl_Query_Call(int func, int arity, WamWord *arg_adr); #define Pl_Query_Start(func, arity, arg_adr, recoverable) \ (Pl_Query_Begin(recoverable), Pl_Query_Call(func, arity, arg_adr)) int Pl_Query_Next_Solution(void); void Pl_Query_End(int op); WamWord Pl_Get_Exception(void); #define Get_Choice_Counter() foreign_bkt_counter #define Get_Choice_Buffer(t) ((t) foreign_bkt_buffer) #define No_More_Choice() Delete_Last_Choice_Point() #define PlTerm WamWord #define PLV REF #define Atom_Name(a) (atom_tbl[(a)].name) #define Atom_Length(a) (atom_tbl[(a)].prop.length) #define Atom_Needs_Quote(a) (atom_tbl[(a)].prop.needs_quote) #define Atom_Needs_Scan(a) (atom_tbl[(a)].prop.needs_scan) #define atom_nil ATOM_NIL #define Stream_Pointer(s) (stm_tbl + (s)) #define MASK_PRED_NATIVE_CODE 1 #define MASK_PRED_DYNAMIC 2 #define MASK_PRED_PUBLIC 4 #define MASK_PRED_BUILTIN 8 #define MASK_PRED_BUILTIN_FD 16 #define MASK_PRED_ANY_BUILTIN (MASK_PRED_BUILTIN | MASK_PRED_BUILTIN_FD) char *Detect_If_Aux_Name(int func); int Father_Pred_Of_Aux(int func, int *father_arity); int Pred_Without_Aux(int func, int arity, int *arity1); int Make_Aux_Name(int func, int arity, int aux_nb); #ifdef TERM_SUPP_FILE WamWord pi_name_word; WamWord pi_arity_word; long glob_dico_var[MAX_VAR_IN_TERM]; /* a general purpose dico */ #else extern WamWord pi_name_word; extern WamWord pi_arity_word; extern long glob_dico_var[]; #endif long Term_Compare(WamWord start_u_word, WamWord start_v_word); Bool Is_List(WamWord start_word); Bool Is_Partial_List(WamWord start_word); Bool Is_List_Or_Partial(WamWord start_word); void Treat_Vars_Of_Term(WamWord start_word, Bool generic_var, void (*fct) ()); int List_Length(WamWord start_word); int Term_Size(WamWord start_word); void Copy_Term(WamWord *dst_adr, WamWord *src_adr); void Copy_Contiguous_Term(WamWord *dst_adr, WamWord *src_adr); int Get_Pred_Indicator(WamWord pred_indic_word, Bool must_be_ground, int *arity); #include #define STREAM_PB_SIZE 8 /* push back buffer size */ #define STREAM_MODE_READ 0 #define STREAM_MODE_WRITE 1 #define STREAM_MODE_APPEND 2 #define STREAM_EOF_ACTION_ERROR 0 #define STREAM_EOF_ACTION_EOF_CODE 1 #define STREAM_EOF_ACTION_RESET 2 #define STREAM_BUFFERING_NONE 0 #define STREAM_BUFFERING_LINE 1 #define STREAM_BUFFERING_BLOCK 2 #define STREAM_EOF_NOT 0 #define STREAM_EOF_AT 1 #define STREAM_EOF_PAST 2 #define STREAM_CHECK_VALID 0 /* simply a valid stream */ #define STREAM_CHECK_EXIST 1 /* valid and exist */ #define STREAM_CHECK_INPUT 2 /* valid, exist and mode=input */ #define STREAM_CHECK_OUTPUT 3 /* valid, exist and mode=output */ #define STREAM_FCT_UNDEFINED ((StmFct) (-1)) /* for optional fct */ #define TERM_STREAM_ATOM 1 /* values also used in stream.pl */ #define TERM_STREAM_CHARS 2 #define TERM_STREAM_CODES 3 typedef struct /* Stream properties */ { /* ------------------------------ */ unsigned mode:2; /* see STREAM_MODE_xxx defs */ unsigned input:1; /* is it an input stream ? */ unsigned output:1; /* is it an output stream ? */ unsigned text:1; /* is it a text stream . (or bin) */ unsigned reposition:1; /* can it be repositioned ? */ unsigned eof_action:2; /* see STREAM_EOF_ACTION_xxx defs */ unsigned buffering:2; /* see STREAM_BUFFERING_xxx defs */ unsigned special_close:1; /* does it need a special close ? */ unsigned other:8; /* other prop (1,2,3=term_streams */ } /* 4=socket_stream) */ StmProp; typedef struct /* Push Back stack */ { /* ------------------------------ */ int buff[STREAM_PB_SIZE]; /* the buffer */ int *ptr; /* pointer into the buffer */ int nb_elems; /* # of elements in the buffer */ } PbStk; typedef int (*StmFct) (); /* generic type for file fctions */ typedef struct stm_lst *PStmLst; typedef struct stm_lst /* Chained stream list */ { /* ------------------------------ */ int stm; /* the stream */ PStmLst next; /* next entry */ } StmLst; typedef struct stm_inf /* Stream information */ { /* ------------------------------ */ int atom_file_name; /* atom associated to filename */ long file; /* accessor (FILE *,TTYInf *) != 0*/ StmProp prop; /* assoctiated properties */ StmLst *mirror; /* mirror streams */ StmLst *mirror_of; /* streams this stream as mirror */ StmFct fct_getc; /* get char function (mandatory) */ StmFct fct_putc; /* put char function (mandatory) */ StmFct fct_flush; /* flush function (optional) */ StmFct fct_close; /* close function (optional) */ StmFct fct_tell; /* tell function (optional) */ StmFct fct_seek; /* seek function (optional) */ StmFct fct_clearerr; /* clearerr function (optional) */ Bool eof_reached; /* has eof char been read ? */ PbStk pb_char; /* character push back stack */ int char_count; /* character read count */ int line_count; /* line read count */ int line_pos; /* line position */ PbStk pb_line_pos; /* line position push back stack */ } StmInf; typedef struct /* Alias information */ { /* ------------------------------ */ long atom; /* atom of the alias (the key) */ int stm; /* associated stream */ } AliasInf; typedef struct /* String Stream information */ { /* ------------------------------ */ char *buff; /* the I/O buffer */ char *ptr; /* current position into the buff */ Bool buff_alloc_size; /* mallocated size (iff output) */ } StrSInf; #ifdef STREAM_SUPP_FILE StmInf **stm_tbl; int stm_tbl_size; int stm_last_used; char *alias_tbl; WamWord last_input_sora; WamWord last_output_sora; int stm_stdin; int stm_stdout; int stm_input; int stm_output; int stm_top_level_input; int stm_top_level_output; int stm_debugger_input; int stm_debugger_output; char *le_prompt; int use_le_prompt; int atom_stream; int atom_user_input; int atom_user_output; int atom_top_level_input; int atom_top_level_output; int atom_debugger_input; int atom_debugger_output; int atom_read; int atom_write; int atom_append; int atom_reposition; int atom_stream_position; int atom_text; int atom_binary; int atom_error; int atom_eof_code; int atom_reset; int atom_none; int atom_line; int atom_block; int atom_not; int atom_at; int atom_past; int atom_bof; int atom_current; int atom_eof; #else extern StmInf **stm_tbl; extern int stm_tbl_size; extern int stm_last_used; extern char *alias_tbl; extern WamWord last_input_sora; extern WamWord last_output_sora; extern int stm_stdin; extern int stm_stdout; extern int stm_input; extern int stm_output; extern int stm_top_level_input; extern int stm_top_level_output; extern int stm_debugger_input; extern int stm_debugger_output; extern char *le_prompt; extern int use_le_prompt; extern int atom_stream; extern int atom_user_input; extern int atom_user_output; extern int atom_top_level_input; extern int atom_top_level_output; extern int atom_debugger_input; extern int atom_debugger_output; extern int atom_read; extern int atom_write; extern int atom_append; extern int atom_reposition; extern int atom_stream_position; extern int atom_text; extern int atom_binary; extern int atom_error; extern int atom_eof_code; extern int atom_reset; extern int atom_none; extern int atom_line; extern int atom_block; extern int atom_not; extern int atom_at; extern int atom_past; extern int atom_bof; extern int atom_current; extern int atom_eof; #endif int Add_Stream(int atom_file_name, long file, StmProp prop, StmFct fct_getc, StmFct fct_putc, StmFct fct_flush, StmFct fct_close, StmFct fct_tell, StmFct fct_seek, StmFct fct_clearerr); int Add_Stream_For_Stdio_Desc(FILE *f, int atom_path, int mode, int text); int Add_Stream_For_Stdio_File(char *path, int mode, Bool text); void Delete_Stream(int stm); int Find_Stream_By_Alias(int atom_alias); Bool Add_Alias_To_Stream(int atom_alias, int stm); void Reassign_Alias(int atom_alias, int stm); void Add_Mirror_To_Stream(int stm, int m_stm); Bool Del_Mirror_From_Stream(int stm, int m_stm); int Find_Stream_From_PStm(StmInf *pstm); void Flush_All_Streams(void); void Set_Stream_Buffering(int stm); int Get_Stream_Or_Alias(WamWord sora_word, int test_mask); void Check_Stream_Type(int stm, Bool check_text, Bool for_input); WamWord Make_Stream_Tagged_Word(int stm); Bool Stdio_Is_Repositionable(FILE *f); void Stdio_Set_Buffering(FILE *f, int buffering); FILE *Stdio_Desc_Of_Stream(int stm); int Io_Fileno_Of_Stream(int stm); int Stream_Getc(StmInf *pstm); int Stream_Get_Key(StmInf *pstm, Bool echo, Bool catch_ctrl_c); void Stream_Ungetc(int c, StmInf *pstm); int Stream_Peekc(StmInf *pstm); char *Stream_Gets(char *str, int size, StmInf *pstm); char *Stream_Gets_Prompt(char *prompt, StmInf *pstm_o, char *str, int size, StmInf *pstm_i); void Stream_Putc(int c, StmInf *pstm); int Stream_Puts(char *str, StmInf *pstm); int Stream_Printf(StmInf *pstm, char *format, ...); void Stream_Flush(StmInf *pstm); int Stream_Close(StmInf *pstm); int Stream_End_Of_Stream(StmInf *pstm); void Stream_Get_Position(StmInf *pstm, int *offset, int *char_count, int *line_count, int *line_pos); int Stream_Set_Position(StmInf *pstm, int whence, int offset, int char_count, int line_count, int line_pos); int Stream_Set_Position_LC(StmInf *pstm, int line_count, int line_pos); int Add_Str_Stream(char *buff, int prop_other); void Delete_Str_Stream(int stm); char *Term_Write_Str_Stream(int stm); void Close_Stm(int stm, Bool force); /* from close_c.c */ #define PB_Init(pb) pb.ptr = pb.buff, pb.nb_elems = 0; #define PB_Is_Empty(pb) (pb.nb_elems == 0) #define PB_Push(pb, elem) \ do \ { \ *(pb.ptr) = (elem); \ if (pb.ptr != pb.buff + STREAM_PB_SIZE - 1) \ pb.ptr++; \ else \ pb.ptr = pb.buff; \ if (pb.nb_elems < STREAM_PB_SIZE) \ pb.nb_elems++; \ } \ while (0) #define PB_Pop(pb, elem) \ do \ { \ if (pb.ptr != pb.buff) \ pb.ptr--; \ else \ pb.ptr = pb.buff + STREAM_PB_SIZE - 1; \ (elem) = *pb.ptr; \ pb.nb_elems--; \ } \ while (0) #define PB_Top(pb, elem) \ do \ { \ if (pb.ptr != pb.buff) \ (elem) = pb.ptr[-1]; \ else \ (elem) = pb.buff[STREAM_PB_SIZE - 1]; \ } \ while (0) #ifdef ERROR_SUPP_FILE int type_atom; int type_atomic; int type_byte; int type_callable; int type_character; int type_compound; int type_evaluable; int type_float; /* for arithmetic */ int type_boolean; /* for setarg/4 */ int type_in_byte; int type_in_character; int type_integer; int type_list; int type_number; int type_predicate_indicator; int type_variable; int type_fd_variable; /* for FD */ int type_fd_evaluable; /* for FD */ int type_fd_bool_evaluable; /* for FD */ int domain_character_code_list; int domain_close_option; int domain_flag_value; int domain_io_mode; int domain_non_empty_list; int domain_not_less_than_zero; int domain_operator_priority; int domain_operator_specifier; int domain_prolog_flag; int domain_read_option; int domain_source_sink; int domain_stream; int domain_stream_option; int domain_stream_or_alias; int domain_stream_position; int domain_stream_property; int domain_write_option; int domain_term_stream_or_alias; /* for term_streams */ int domain_g_array_index; /* for g_vars */ int domain_g_argument_selector; /* for g_vars */ int domain_stream_seek_method; /* for seek/4 */ int domain_format_control_sequence; /* for format/2-3 */ int domain_os_path; /* for absolute_file_name/2 */ int domain_os_file_permission; /* for file_permission/2 */ int domain_selectable_item; /* for select_read/3 */ int domain_date_time; /* for os_interf */ #ifndef NO_USE_SOCKETS int domain_socket_domain; /* for sockets */ int domain_socket_address; /* for sockets */ #endif int existence_procedure; int existence_source_sink; int existence_stream; int existence_sr_descriptor; /* for source reader */ int permission_operation_access; int permission_operation_close; int permission_operation_create; int permission_operation_input; int permission_operation_modify; int permission_operation_open; int permission_operation_output; int permission_operation_reposition; int permission_type_binary_stream; int permission_type_flag; int permission_type_operator; int permission_type_past_end_of_stream; int permission_type_private_procedure; int permission_type_static_procedure; int permission_type_source_sink; int permission_type_stream; int permission_type_text_stream; int representation_character; int representation_character_code; int representation_in_character_code; int representation_max_arity; int representation_max_integer; int representation_min_integer; int representation_too_many_variables; int evluation_float_overflow; int evluation_int_overflow; int evluation_undefined; int evluation_underflow; int evluation_zero_divisor; int resource_print_object_not_linked; /* for print and format */ int resource_too_big_fd_constraint; /* for FD */ #else extern int type_atom; extern int type_atomic; extern int type_byte; extern int type_callable; extern int type_character; extern int type_compound; extern int type_evaluable; extern int type_float; /* for arithmetic */ extern int type_boolean; /* for setarg/4 */ extern int type_in_byte; extern int type_in_character; extern int type_integer; extern int type_list; extern int type_number; extern int type_predicate_indicator; extern int type_variable; extern int type_fd_variable; /* for FD */ extern int type_fd_evaluable; /* for FD */ extern int type_fd_bool_evaluable; /* for FD */ extern int domain_character_code_list; extern int domain_close_option; extern int domain_flag_value; extern int domain_io_mode; extern int domain_non_empty_list; extern int domain_not_less_than_zero; extern int domain_operator_priority; extern int domain_operator_specifier; extern int domain_prolog_flag; extern int domain_read_option; extern int domain_source_sink; extern int domain_stream; extern int domain_stream_option; extern int domain_stream_or_alias; extern int domain_stream_position; extern int domain_stream_property; extern int domain_write_option; extern int domain_term_stream_or_alias; /* for term_streams */ extern int domain_g_array_index; /* for g_vars */ extern int domain_g_argument_selector; /* for g_vars */ extern int domain_stream_seek_method; /* for seek/4 */ extern int domain_format_control_sequence; /* for format/2-3 */ extern int domain_os_path; /* for absolute_file_name/2 */ extern int domain_os_file_permission; /* for file_permission/2 */ extern int domain_selectable_item; /* for select_read/3 */ extern int domain_date_time; /* for os_interf */ #ifndef NO_USE_SOCKETS extern int domain_socket_domain; /* for sockets */ extern int domain_socket_address; /* for sockets */ #endif extern int existence_procedure; extern int existence_source_sink; extern int existence_stream; extern int existence_sr_descriptor; /* for source reader */ extern int permission_operation_access; extern int permission_operation_close; extern int permission_operation_create; extern int permission_operation_input; extern int permission_operation_modify; extern int permission_operation_open; extern int permission_operation_output; extern int permission_operation_reposition; extern int permission_type_binary_stream; extern int permission_type_flag; extern int permission_type_operator; extern int permission_type_past_end_of_stream; extern int permission_type_private_procedure; extern int permission_type_static_procedure; extern int permission_type_source_sink; extern int permission_type_stream; extern int permission_type_text_stream; extern int representation_character; extern int representation_character_code; extern int representation_in_character_code; extern int representation_max_arity; extern int representation_max_integer; extern int representation_min_integer; extern int representation_too_many_variables; extern int evluation_float_overflow; extern int evluation_int_overflow; extern int evluation_undefined; extern int evluation_underflow; extern int evluation_zero_divisor; extern int resource_too_many_open_streams; /* for streams */ extern int resource_print_object_not_linked; /* for print and format */ extern int resource_too_big_fd_constraint; /* for FD */ #endif void Set_Bip_Name_2(WamWord func_word, WamWord arity_word); void FC Set_C_Bip_Name(char *func_str, int arity); void Unset_C_Bip_Name(void); int Get_Current_Bip(int *arity); void Set_Last_Syntax_Error(char *file_name, int err_line, int err_col, char *err_msg); void Syntax_Error(int flag_value); void Unknown_Pred_Error(int func, int arity); void Os_Error(void); void Pl_Err_Instantiation(void); void Pl_Err_Type(int atom_type, WamWord term); void Pl_Err_Domain(int atom_domain, WamWord term); void Pl_Err_Existence(int atom_object, WamWord term); void Pl_Err_Permission(int atom_oper, int atom_perm, WamWord term); void Pl_Err_Representation(int atom_flag); void Pl_Err_Evaluation(int atom_error); void Pl_Err_Resource(int atom_resource); void Pl_Err_Syntax(int atom_error); void Pl_Err_System(int atom_error); #define Os_Test_Error(tst) \ do { if (tst) { Os_Error(); return FALSE; } } while(0) #define SCAN_BIG_BUFFER 10240 typedef enum { TOKEN_VARIABLE, TOKEN_INTEGER, TOKEN_FLOAT, TOKEN_NAME, TOKEN_STRING, TOKEN_BACK_QUOTED, TOKEN_PUNCTUATION, TOKEN_IMMEDIAT_OPEN, TOKEN_FULL_STOP, TOKEN_END_OF_FILE, TOKEN_EXTENDED } TypTok; typedef struct { TypTok type; char name[SCAN_BIG_BUFFER]; /* for VARIABLE NAME STRING BACK_QUOTED */ int punct; /* for PUNCTUATION */ long int_num; /* for INTEGER */ double float_num; /* for FLOAT */ int line; /* source line of the token */ int col; /* source column of the token */ } TokInf; #ifdef SCAN_SUPP_FILE TokInf token; #else extern TokInf token; #endif int Scan_Peek_Char(StmInf *pstm, Bool convert); char *Scan_Token(StmInf *pstm, Bool comma_is_punct); void Recover_After_Error(StmInf *pstm); char *Scan_Next_Atom(StmInf *pstm); char *Scan_Next_Number(StmInf *pstm, Bool integer_only); #define PARSE_END_OF_TERM_DOT 0 #define PARSE_END_OF_TERM_EOF 1 typedef struct /* Parsed variable information */ { /* ------------------------------ */ char name[MAX_VAR_NAME_LENGTH]; /* variable name */ WamWord word; /* associated WAM word */ Bool named; /* has it a name ? */ int nb_of_uses; /* occurrence counter */ } InfVar; #ifdef PARSE_SUPP_FILE InfVar parse_dico_var[MAX_VAR_IN_TERM]; int parse_nb_var; #else extern InfVar parse_dico_var[]; extern int parse_nb_var; #endif int last_read_line; int last_read_col; WamWord Read_Term(StmInf *pstm, int parse_end_of_term); WamWord Read_Atom(StmInf *pstm); WamWord Read_Integer(StmInf *pstm); WamWord Read_Number(StmInf *pstm); WamWord Read_Token(StmInf *pstm); #define WRITE_QUOTED 1 #define WRITE_IGNORE_OP 2 #define WRITE_NUMBER_VARS 4 #define WRITE_NAME_VARS 8 #define WRITE_SPACE_ARGS 16 #define WRITE_PORTRAYED 32 #ifdef WRITE_SUPP_FILE int last_writing; #else extern int last_writing; #endif void Write_Term(StmInf *pstm, int depth, int prec, int mask, WamWord term_word); void Write_Simple(WamWord term_word); void Write_A_Char(StmInf *pstm, int c); char *Float_To_String(double d); int Get_Print_Stm(void); enum { FLAG_BOUNDED, FLAG_MAX_INTEGER, FLAG_MIN_INTEGER, FLAG_ROUNDING_FCT, FLAG_CHAR_CONVERSION, FLAG_DEBUG, FLAG_MAX_ARITY, FLAG_UNKNOWN, FLAG_DOUBLE_QUOTES, FLAG_BACK_QUOTES, FLAG_SYNTAX_ERROR, FLAG_OS_ERROR, FLAG_MAX_ATOM, FLAG_MAX_UNGET, FLAG_SINGLETON_WARNING, FLAG_STRICT_ISO, FLAG_PROLOG_NAME, FLAG_PROLOG_VERSION, FLAG_PROLOG_DATE, FLAG_PROLOG_COPYRIGHT, NB_OF_FLAGS /* this gives us the number of used flags */ }; #define FLAG_VALUE_ERROR 0 /* same order as in read.pl */ #define FLAG_VALUE_WARNING 1 #define FLAG_VALUE_FAIL 2 #define FLAG_AS_CODES 0 /* bit 2 is set if no_escape */ #define FLAG_AS_CHARS 1 #define FLAG_AS_ATOM 2 #define FLAG_NO_ESCAPE_BIT 2 #define FLAG_AS_PART_MASK ((1 << FLAG_NO_ESCAPE_BIT) - 1) #define FLAG_NO_ESCAPE_MASK (1 << FLAG_NO_ESCAPE_BIT) #define Char_Conversion(c) ((Flag_Value(FLAG_CHAR_CONVERSION) && \ Is_Valid_Code(c)) ? char_conv[c] : (c)) #define SYS_VAR_OPTION_MASK (sys_var[0]) #define SYS_VAR_WRITE_DEPTH (sys_var[1]) #define SYS_VAR_SYNTAX_ERROR_ACTON (sys_var[1]) #define SYS_VAR_WRITE_PREC (sys_var[2]) #define SYS_VAR_FD_BCKTS (sys_var[3]) #define SYS_VAR_TOP_LEVEL (sys_var[10]) #define SYS_VAR_LINEDIT (sys_var[12]) #define SYS_VAR_DEBUGGER (sys_var[13]) #define SYS_VAR_SAY_GETC (sys_var[20]) #define CHAR_TO_EMIT_WHEN_CHAR '\1' #define Flag_Value(flag) (sys_var[200 + (flag)]) #ifdef FLAG_C_FILE long sys_var[MAX_SYS_VARS]; #else extern long sys_var[]; #endif Bool Read_Pl_State_File(WamWord file_word); Bool Write_Pl_State_File(WamWord file_word); #define DYN_ALT_FCT_FOR_TEST 0 #define DYN_ALT_FCT_FOR_JUMP 1 typedef long (*ScanFct) (); typedef unsigned long DynStamp; typedef struct dynpinf *DynPInfP; typedef struct dyncinf *DynCInfP; typedef struct /* Dobly-linked chain header */ { /* ----------------------------- */ DynCInfP first; /* first clause (or NULL) */ DynCInfP last; /* last clause (or NULL) */ }D2ChHdr; typedef struct /* Dobly-linked chain cell */ { /* ----------------------------- */ DynCInfP next; /* next clause (or NULL) */ DynCInfP prev; /* previous clause (or NULL) */ }D2ChCell; typedef struct dyncinf /* Dynamic clause information */ { /* ------------------------------ */ D2ChCell seq_chain; /* sequential chain */ D2ChCell ind_chain; /* indexical chain */ DynPInfP dyn; /* back ptr to associated dyn inf */ D2ChHdr *p_ind_hdr; /* back ptr to ind_chain header */ char **p_ind_htbl; /* back ptr to ind htbl (or NULL) */ int cl_no; /* clause number */ DynStamp erase_stamp; /* FFF...F if not erased or stamp */ DynCInfP next_erased_cl; /* pointer to next erased clause */ unsigned *byte_code; /* bc pointer (NULL=interpreted) */ int term_size; /* size of the term of the clause */ WamWord term_word; /* clause [Head|Body]= */ WamWord head_word; /* adr+1 = Car = clause term Head */ WamWord body_word; /* adr+2 = Cdr = clause term Body */ } DynCInf; typedef struct /* Dynamic switch item info */ { /* ------------------------------ */ long key; /* key: atm, int, f/n */ D2ChHdr ind_chain; /* indexical chain */ } DSwtInf; typedef struct dynpinf /* Dynamic predicate information */ { /* ------------------------------ */ D2ChHdr seq_chain; /* sequential chain */ D2ChHdr var_ind_chain; /* index if 1st arg=VAR (chain) */ char *atm_htbl; /* index if 1st arg=ATM (htable) */ char *int_htbl; /* index if 1st arg=INT (htable) */ D2ChHdr lst_ind_chain; /* index if 1st arg=LST (chain) */ char *stc_htbl; /* index if 1st arg=STC (htable) */ int arity; /* arity (redundant but faster) */ int count_a; /* next clause nb for asserta */ int count_z; /* next clause nb for assertz */ DynCInfP first_erased_cl; /* 1st erased clause NULL if none */ DynPInfP next_dyn_with_erase; /* next dyn with erased clauses */ } DynPInf; DynCInf *Add_Dynamic_Clause(WamWord head_word, WamWord body_word, Bool asserta, Bool check_perm); void Delete_Dynamic_Clause(DynCInf *clause); PredInf *Update_Dynamic_Pred(int func, int arity, int what_to_do); DynCInf *Scan_Dynamic_Pred(int owner_func, int owner_arity, DynPInf *dyn, WamWord first_arg_word, ScanFct alt_fct, int alt_fct_type, int alt_info_size, WamWord *alt_info); int Scan_Choice_Point_Pred(WamWord *b, int *arity); void Copy_Clause_To_Heap(DynCInf *clause, WamWord *head_word, WamWord *body_word); void Call_Info_Bip_Name_1(WamWord call_info_word); #define Call_Info(f, a, dc) ((Functor_Arity(f, a) << 1) | dc) #ifdef BC_SUPP_FILE int byte_len; #else extern int byte_len; #endif unsigned *byte_code; WamCont BC_Emulate_Pred(int func, DynPInf *dyn); #ifndef NO_USE_FD_SOLVER typedef unsigned long VecWord; typedef VecWord *Vector; typedef struct /* Ranges are always handled through pointers */ { Bool extra_cstr; int min; int max; Vector vec; } Range; #define RANGE_TOP_STACK CS #define INTERVAL_MAX_INTEGER ((int)((1L<<(32-TAG_SIZE-1))-1)) /* only 32 bits */ #ifndef WORD_SIZE # define WORD_SIZE 32 #endif #if WORD_SIZE == 32 # define WORD_SIZE_BITS 5 #else # define WORD_SIZE_BITS 6 #endif int Least_Significant_Bit(VecWord x); int Most_Significant_Bit(VecWord x); void Define_Vector_Size(int max_val); void Vector_From_Interval(Vector vec, int min, int max); int Vector_Nb_Elem(Vector vec); int Vector_Ith_Elem(Vector vec, int n); int Vector_Next_After(Vector vec, int n); int Vector_Next_Before(Vector vec, int n); void Vector_Empty(Vector vec); void Vector_Full(Vector vec); Bool Vector_Test_Null_Inter(Vector vec, Vector vec1); void Vector_Copy(Vector vec, Vector vec1); void Vector_Union(Vector vec, Vector vec1); void Vector_Inter(Vector vec, Vector vec1); void Vector_Compl(Vector vec); void Vector_Add_Vector(Vector vec, Vector vec1); void Vector_Sub_Vector(Vector vec, Vector vec1); void Vector_Mul_Vector(Vector vec, Vector vec1); void Vector_Div_Vector(Vector vec, Vector vec1); void Vector_Mod_Vector(Vector vec, Vector vec1); void Vector_Add_Value(Vector vec, int n); void Vector_Mul_Value(Vector vec, int n); void Vector_Div_Value(Vector vec, int n); void Vector_Mod_Value(Vector vec, int n); Bool Range_Test_Value(Range *range, int n); Bool Range_Test_Null_Inter(Range *range, Range *range1); void Range_Copy(Range *range, Range *range1); int Range_Nb_Elem(Range *range); int Range_Ith_Elem(Range *range, int n); int Range_Next_After(Range *range, int n); int Range_Next_Before(Range *range, int n); void Range_Set_Value(Range *range, int n); void Range_Reset_Value(Range *range, int n); void Range_Becomes_Sparse(Range *range); void Range_From_Vector(Range *range); void Range_Union(Range *range, Range *range1); void Range_Inter(Range *range, Range *range1); void Range_Compl(Range *range); void Range_Add_Range(Range *range, Range *range1); void Range_Sub_Range(Range *range, Range *range1); void Range_Mul_Range(Range *range, Range *range1); void Range_Div_Range(Range *range, Range *range1); void Range_Mod_Range(Range *range, Range *range1); void Range_Add_Value(Range *range, int n); void Range_Mul_Value(Range *range, int n); void Range_Div_Value(Range *range, int n); void Range_Mod_Value(Range *range, int n); char *Range_To_String(Range *range); #define Word_No_And_Bit_No(w, b) (((VecWord) (w) << WORD_SIZE_BITS)|\ (VecWord) (b)) #define Word_No(n) ((VecWord) (n) >> WORD_SIZE_BITS) #define Bit_No(n) ((n) & (((VecWord) 1 << WORD_SIZE_BITS)-1)) #define Vector_Test_Value(vec, n) ((vec[Word_No(n)] & ((VecWord) 1 << Bit_No(n))) != 0) #define Vector_Set_Value(vec, n) (vec[Word_No(n)] |= ((VecWord) 1 << Bit_No(n))) #define Vector_Reset_Value(vec, n) (vec[Word_No(n)] &= ~((VecWord) 1 << Bit_No(n))) #define Vector_Allocate_If_Necessary(vec) \ do \ { \ if (vec == NULL) \ Vector_Allocate(vec); \ } \ while (0) #define Vector_Allocate(vec) \ do \ { \ vec = (Vector) RANGE_TOP_STACK; \ RANGE_TOP_STACK += vec_size; \ } \ while (0) #define VECTOR_BEGIN_ENUM(vec, vec_elem) \ { \ Vector enum_end = vec + vec_size, enum_i = vec; \ int enum_j; \ VecWord enum_word; \ \ vec_elem = 0; \ do \ { \ enum_word = *enum_i; \ for (enum_j = 0; enum_j++ < WORD_SIZE; enum_word >>= 1, vec_elem++) \ { \ if (enum_word & 1) \ { #define VECTOR_END_ENUM \ } \ } \ } \ while (++enum_i < enum_end); \ } #define Is_Interval(range) ((range)->vec == NULL) #define Is_Sparse(range) ((range)->vec != NULL) #define Is_Empty(range) ((range)->min > (range)->max) #define Is_Not_Empty(range) ((range)->max >= (range)->min) #define Set_To_Empty(range) (range)->max = (int)(1 << (sizeof(int) * 8 - 1)) #define Range_Init_Interval(range, r_min, r_max) \ do \ { \ (range)->extra_cstr = FALSE; \ (range)->min = (r_min); \ (range)->max = (r_max); \ (range)->vec = NULL; \ } \ while (0) #define FD_VARIABLE_FRAME_SIZE (OFFSET_RANGE+RANGE_SIZE+CHAINS_SIZE) #define FD_INT_VARIABLE_FRAME_SIZE (OFFSET_RANGE+RANGE_SIZE) #define OFFSET_RANGE 5 #define RANGE_SIZE (2+(sizeof(Range)/sizeof(WamWord))) #define OFFSET_CHAINS (OFFSET_RANGE+RANGE_SIZE) #define CHAINS_SIZE 8 #define FD_Tag_Value(fdv_adr) (((WamWord *) fdv_adr)[0]) #define FD_INT_Date(fdv_adr) (((WamWord *) fdv_adr)[1]) #define Queue_Date_At_Push(fdv_adr)(((WamWord *) fdv_adr)[2]) #define Queue_Propag_Mask(fdv_adr) (((WamWord *) fdv_adr)[3]) #define Queue_Next_Fdv_Adr(fdv_adr)(((WamWord *) fdv_adr)[4]) #define Range_Stamp(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_RANGE]) #define Nb_Elem(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_RANGE+1]) #define Range(fdv_adr) ((Range *) ((WamWord *) fdv_adr+OFFSET_RANGE+2)) #define Chains_Stamp(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS]) #define Nb_Cstr(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+1]) #define Chains_Mask(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+2]) #define Chain_Min(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+3]) #define Chain_Max(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+4]) #define Chain_Min_Max(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+5]) #define Chain_Dom(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+6]) #define Chain_Val(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS+7]) #define Extra_Cstr(fdv_adr) (Range(fdv_adr)->extra_cstr) #define Min(fdv_adr) (Range(fdv_adr)->min) #define Max(fdv_adr) (Range(fdv_adr)->max) #define Vec(fdv_adr) (Range(fdv_adr)->vec) #define CHAIN_NB_MIN 0 #define CHAIN_NB_MAX 1 #define CHAIN_NB_MIN_MAX 2 #define CHAIN_NB_DOM 3 #define CHAIN_NB_VAL 4 #define MASK_EMPTY 0 #define MASK_MIN 1 #define MASK_MAX 2 #define MASK_MIN_MAX 4 #define MASK_DOM 8 #define MASK_VAL 16 #define Has_Min_Mask(mask) ((mask) & MASK_MIN) #define Has_Max_Mask(mask) ((mask) & MASK_MAX) #define Has_Min_Max_Mask(mask) ((mask) & MASK_MIN_MAX) #define Has_Dom_Mask(mask) ((mask) & MASK_DOM) #define Has_Val_Mask(mask) ((mask) & MASK_VAL) #define Set_Min_Mask(mask) ((mask) |= MASK_MIN) #define Set_Max_Mask(mask) ((mask) |= MASK_MAX) #define Set_Min_Max_Mask(mask) ((mask) |= MASK_MIN_MAX) #define Set_Dom_Mask(mask) ((mask) |= MASK_DOM) #define Set_Val_Mask(mask) ((mask) |= MASK_VAL) #define CHAIN_RECORD_FRAME_SIZE 2 #define CF_Pointer(rec_adr) (*(WamWord **) &(rec_adr[0])) #define Next_Chain(rec_adr) (*(WamWord **) &(rec_adr[1])) #define CONSTRAINT_FRAME_SIZE 3 #define OFFSET_OF_OPTIM_POINTER 1 /* this offset must corresponds to */ #define AF_Pointer(cf) (*(WamWord **) &(cf[0])) #define Optim_Pointer(cf) (*(WamWord **) &(cf[1])) /* this cell */ #define Cstr_Address(cf) (*(long (**)()) &(cf[2])) #define ENV_VAR_VECTOR_MAX "VECTORMAX" #define DEFAULT_VECTOR_MAX 127 #define Fd_Variable_Is_Ground(fdv_adr) (Tag_Of(FD_Tag_Value(fdv_adr))==INT) #define math_min(x, y) ((x) <= (y) ? (x) : (y)) #define math_max(x, y) ((x) >= (y) ? (x) : (y)) #ifdef FD_INST_FILE WamWord DATE; WamWord *TP; WamWord vec_size; WamWord vec_max_integer; #else extern WamWord DATE; extern WamWord *TP; extern WamWord vec_size; extern WamWord vec_max_integer; #endif WamWord *Fd_Prolog_To_Fd_Var(WamWord arg_word, Bool pl_var_ok); Range *Fd_Prolog_To_Range(WamWord list_word); int Fd_Prolog_To_Value(WamWord arg_word); WamWord *Fd_Prolog_To_Array_Int(WamWord list_word); WamWord *Fd_Prolog_To_Array_Any(WamWord list_word); WamWord *Fd_Prolog_To_Array_Fdv(WamWord list_word, Bool pl_var_ok); void Fd_List_Int_To_Range(Range *range, WamWord list_word); WamWord *Fd_New_Variable(void); WamWord *Fd_New_Bool_Variable(void); WamWord *Fd_New_Int_Variable(int n); WamWord *Fd_Create_C_Frame(long (*cstr_fct) (), WamWord *AF, WamWord *fdv_adr, Bool optim2); void Fd_Add_Dependency(WamWord *fdv_adr, int chain_nb, WamWord *CF); void Fd_Add_List_Dependency(WamWord *array, int chain_nb, WamWord *CF); void Fd_Before_Add_Cstr(void); Bool Fd_After_Add_Cstr(void); void Fd_Stop_Constraint(WamWord *CF); Bool Fd_Tell_Value(WamWord *fdv_adr, int n); Bool Fd_Tell_Not_Value(WamWord *fdv_adr, int n); Bool Fd_Tell_Int_Range(WamWord *fdv_adr, Range *range); Bool Fd_Tell_Interv_Interv(WamWord *fdv_adr, int min, int max); Bool Fd_Tell_Range_Range(WamWord *fdv_adr, Range *range); void Fd_Display_Extra_Cstr(WamWord *fdv_adr); void Fd_Init_Solver0(void); void Fd_Reset_Solver0(void); Bool Fd_Assign_Value(WamWord *fdv_adr, int n); Bool Fd_Unify_With_Integer0(WamWord *fdv_adr, int n); Bool Fd_Unify_With_Fd_Var0(WamWord *fdv_adr1, WamWord *fdv_adr2); Bool Fd_Use_Vector(WamWord *fdv_adr); Bool Fd_Check_For_Bool_Var(WamWord x_word); int Fd_Variable_Size0(WamWord *fdv_adr); int Fd_Copy_Variable0(WamWord *dst_adr, WamWord *fdv_adr); char *Fd_Variable_To_String0(WamWord *fdv_adr); #define Fd_Deref_Check_Fd_Var(fdv_word, word, tag_mask) \ DEREF(fdv_word, word, tag_mask); \ if (tag_mask == TAG_REF_MASK) \ Pl_Err_Instantiation(); \ \ if (tag_mask != TAG_INT_MASK && tag_mask != TAG_FDV_MASK) \ Pl_Err_Type(type_fd_variable, word) #define MASK_EMPTY 0 #define MASK_LEFT 1 #define MASK_RIGHT 2 #if 0 #define DEBUG #endif #ifdef MATH_SUPP_FILE Bool full_ac; #ifdef DEBUG char *cur_op; #endif #else #ifdef DEBUG char *cur_op; #endif extern Bool full_ac; #endif Bool Load_Left_Right(Bool optim_eq, WamWord le_word, WamWord re_word, int *mask, long *c, WamWord *l_word, WamWord *r_word); Bool Term_Math_Loading(WamWord l_word, WamWord r_word); Bool Fd_Math_Unify_X_Y(WamWord x, WamWord y); #ifdef DEBUG void Debug_Display(char *fct, int n, ...); #endif Bool x_eq_c(WamWord x, WamWord c); /* in math_supp.c */ Bool x_eq_y(WamWord x, WamWord y); Bool x_plus_c_eq_y(WamWord x, WamWord c, WamWord y); Bool x_eq_y_F(WamWord x, WamWord y); Bool x_plus_c_eq_y_F(WamWord x, WamWord c, WamWord y); Bool x_neq_c(WamWord x, WamWord c); Bool x_neq_y(WamWord x, WamWord y); Bool x_plus_c_neq_y(WamWord x, WamWord c, WamWord y); Bool x_lt_y(WamWord x, WamWord y); Bool x_lte_c(WamWord x, WamWord c); Bool x_lte_y(WamWord x, WamWord y); Bool x_plus_c_lte_y(WamWord x, WamWord c, WamWord y); Bool x_gte_c(WamWord x, WamWord c); Bool x_plus_c_gte_y(WamWord x, WamWord c, WamWord y); Bool ax_eq_y(WamWord a, WamWord x, WamWord y); Bool x_plus_y_eq_z(WamWord x, WamWord y, WamWord z); Bool ax_plus_y_eq_z(WamWord a, WamWord x, WamWord y, WamWord z); Bool ax_plus_by_eq_z(WamWord a, WamWord x, WamWord b, WamWord y, WamWord z); Bool x_plus_y_plus_z_eq_t(WamWord x, WamWord y, WamWord z, WamWord t); Bool ax_plus_y_plus_z_eq_t(WamWord a, WamWord x, WamWord y, WamWord z, WamWord t); Bool ax_plus_by_plus_z_eq_t(WamWord a, WamWord x, WamWord b, WamWord y, WamWord z, WamWord t); Bool ax_eq_y_F(WamWord a, WamWord x, WamWord y); Bool x_plus_y_eq_z_F(WamWord x, WamWord y, WamWord z); Bool ax_plus_y_eq_z_F(WamWord a, WamWord x, WamWord y, WamWord z); Bool ax_plus_by_eq_z_F(WamWord a, WamWord x, WamWord b, WamWord y, WamWord z); Bool x_plus_y_plus_z_eq_t_F(WamWord x, WamWord y, WamWord z, WamWord t); Bool ax_plus_y_plus_z_eq_t_F(WamWord a, WamWord x, WamWord y, WamWord z, WamWord t); Bool ax_plus_by_plus_z_eq_t_F(WamWord a, WamWord x, WamWord b, WamWord y, WamWord z, WamWord t); Bool zero_power_n_eq_y(WamWord n, WamWord y); Bool a_power_n_eq_y(WamWord a, WamWord n, WamWord y); Bool x_power_a_eq_y(WamWord x, WamWord a, WamWord y); Bool x2_eq_y(WamWord x, WamWord y); Bool xy_eq_z(WamWord x, WamWord y, WamWord z); Bool a_power_n_eq_y_F(WamWord a, WamWord n, WamWord y); Bool x_power_a_eq_y_F(WamWord x, WamWord a, WamWord y); Bool x2_eq_y_F(WamWord x, WamWord y); Bool xy_eq_z_F(WamWord x, WamWord y, WamWord z); Bool min_x_a_eq_z(WamWord x, WamWord a, WamWord z); Bool min_x_y_eq_z(WamWord x, WamWord y, WamWord z); Bool min_x_a_eq_z_F(WamWord x, WamWord a, WamWord z); Bool min_x_y_eq_z_F(WamWord x, WamWord y, WamWord z); Bool max_x_a_eq_z(WamWord x, WamWord a, WamWord z); Bool max_x_y_eq_z(WamWord x, WamWord y, WamWord z); Bool max_x_a_eq_z_F(WamWord x, WamWord a, WamWord z); Bool max_x_y_eq_z_F(WamWord x, WamWord y, WamWord z); Bool abs_x_minus_a_eq_z(WamWord x, WamWord a, WamWord z); Bool abs_x_minus_y_eq_z(WamWord x, WamWord y, WamWord z); Bool abs_x_minus_a_eq_z_F(WamWord x, WamWord a, WamWord z); Bool abs_x_minus_y_eq_z_F(WamWord x, WamWord y, WamWord z); Bool quot_rem_a_y_r_eq_z(WamWord a, WamWord y, WamWord r, WamWord z); Bool quot_rem_x_a_r_eq_z(WamWord x, WamWord a, WamWord r, WamWord z); Bool quot_rem_x_y_r_eq_z(WamWord x, WamWord y, WamWord r, WamWord z); Bool quot_rem_a_y_r_eq_z_F(WamWord a, WamWord y, WamWord r, WamWord z); Bool quot_rem_x_a_r_eq_z_F(WamWord x, WamWord a, WamWord r, WamWord z); Bool quot_rem_x_y_r_eq_z_F(WamWord x, WamWord y, WamWord r, WamWord z); Bool not_x_eq_b(WamWord x, WamWord b); Bool x_equiv_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_nequiv_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_imply_y_eq_1(WamWord x, WamWord y); Bool x_imply_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_nimply_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_and_y_eq_0(WamWord x, WamWord y); Bool x_and_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_nand_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_or_y_eq_1(WamWord x, WamWord y); Bool x_or_y_eq_b(WamWord x, WamWord y, WamWord b); Bool x_nor_y_eq_b(WamWord x, WamWord y, WamWord b); Bool truth_x_eq_c(WamWord x, WamWord c, WamWord b); Bool truth_x_eq_y(WamWord x, WamWord y, WamWord b); Bool truth_x_plus_c_eq_y(WamWord x, WamWord c, WamWord y, WamWord b); Bool truth_x_eq_c_F(WamWord x, WamWord c, WamWord b); Bool truth_x_eq_y_F(WamWord x, WamWord y, WamWord b); Bool truth_x_plus_c_eq_y_F(WamWord x, WamWord c, WamWord y, WamWord b); Bool truth_x_neq_c(WamWord x, WamWord c, WamWord b); Bool truth_x_neq_y(WamWord x, WamWord y, WamWord b); Bool truth_x_plus_c_neq_y(WamWord x, WamWord c, WamWord y, WamWord b); Bool truth_x_neq_c_F(WamWord x, WamWord c, WamWord b); Bool truth_x_neq_y_F(WamWord x, WamWord y, WamWord b); Bool truth_x_plus_c_neq_y_F(WamWord x, WamWord c, WamWord y, WamWord b); Bool truth_x_lt_y(WamWord x, WamWord y, WamWord b); Bool truth_x_lte_c(WamWord x, WamWord c, WamWord b); Bool truth_x_lte_y(WamWord x, WamWord y, WamWord b); Bool truth_x_plus_c_lte_y(WamWord x, WamWord c, WamWord y, WamWord b); Bool truth_x_gte_c(WamWord x, WamWord c, WamWord b); Bool truth_x_plus_c_gte_y(WamWord x, WamWord c, WamWord y, WamWord b); #ifdef DEBUG #define DEBUG_2(f, a1, a2) Debug_Display(#f, 2, a1, a2) #define DEBUG_3(f, a1, a2, a3) Debug_Display(#f, 3, a1, a2, a3) #define DEBUG_4(f, a1, a2, a3, a4) Debug_Display(#f, 4, a1, a2, a3, a4) #define DEBUG_5(f, a1, a2, a3, a4, a5) Debug_Display(#f, 5, a1, a2, a3, a4, a5) #define DEBUG_6(f, a1, a2, a3, a4, a5, a6) Debug_Display(#f, 6, a1, a2, a3, a4, a5, a6) #else #define DEBUG_2(f, a1, a2) #define DEBUG_3(f, a1, a2, a3) #define DEBUG_4(f, a1, a2, a3, a4) #define DEBUG_5(f, a1, a2, a3, a4, a5) #define DEBUG_6(f, a1, a2, a3, a4, a5, a6) #endif #define PRIM_CSTR_2(f, a1, a2) \ do \ { \ DEBUG_2(f, a1, a2); \ if (!f(a1, a2)) \ return FALSE; \ } \ while (0) #define PRIM_CSTR_3(f, a1, a2, a3) \ do \ { \ DEBUG_3(f, a1, a2, a3); \ if (!f(a1, a2, a3)) \ return FALSE; \ } \ while (0) #define PRIM_CSTR_4(f, a1, a2, a3, a4) \ do \ { \ DEBUG_4(f, a1, a2, a3, a4); \ if (!f(a1, a2, a3, a4)) \ return FALSE; \ } \ while (0) #define PRIM_CSTR_5(f, a1, a2, a3, a4, a5) \ do \ { \ DEBUG_5(f, a1, a2, a3, a4, a5); \ if (!f(a1, a2, a3, a4, a5)) \ return FALSE; \ } \ while (0) #define PRIM_CSTR_6(f, a1, a2, a3, a4, a5, a6) \ do \ { \ DEBUG_6(f, a1, a2, a3, a4, a5, a6); \ if (!f(a1, a2, a3, a4, a5, a6)) \ return FALSE; \ } \ while (0) #define MATH_CSTR_2(f, a1, a2) \ do \ { \ if (full_ac == FALSE) \ PRIM_CSTR_2(f, a1, a2); \ else \ PRIM_CSTR_2(f##_F, a1, a2); \ } \ while (0) #define MATH_CSTR_3(f, a1, a2, a3) \ do \ { \ if (full_ac == FALSE) \ PRIM_CSTR_3(f, a1, a2, a3); \ else \ PRIM_CSTR_3(f##_F, a1, a2, a3); \ } \ while (0) #define MATH_CSTR_4(f, a1, a2, a3, a4) \ do \ { \ if (full_ac == FALSE) \ PRIM_CSTR_4(f, a1, a2, a3, a4); \ else \ PRIM_CSTR_4(f##_F, a1, a2, a3, a4); \ } \ while (0) #define MATH_CSTR_5(f, a1, a2, a3, a4, a5) \ do \ { \ if (full_ac == FALSE) \ PRIM_CSTR_5(f, a1, a2, a3, a4, a5); \ else \ PRIM_CSTR_5(f##_F, a1, a2, a3, a4, a5); \ } \ while (0) #define MATH_CSTR_6(f, a1, a2, a3, a4, a5, a6) \ do \ { \ if (full_ac == FALSE) \ PRIM_CSTR_6(f, a1, a2, a3, a4, a5, a6); \ else \ PRIM_CSTR_6(f##_F, a1, a2, a3, a4, a5, a6); \ } \ while (0) unsigned Power(unsigned x, unsigned n); unsigned Nth_Root_Dn(unsigned y, unsigned n); unsigned Nth_Root_Up(unsigned y, unsigned n); unsigned Nth_Root_Exact(unsigned y, unsigned n); unsigned Sqrt_Dn(unsigned y); unsigned Sqrt_Up(unsigned y); unsigned Sqrt_Exact(unsigned y); unsigned Find_Expon_Dn(unsigned x, unsigned y); unsigned Find_Expon_Up(unsigned x, unsigned y); unsigned Find_Expon_Exact(unsigned x, unsigned y); void Full_Coeff_Power_Var(Range *y, int a, Range *n); void Full_Find_Expon(Range *n, int a, Range *y); void Full_Var_Power_Coeff(Range *y, Range *x, int a); void Full_Nth_Root(Range *x, Range *y, int a); void Full_Max_Cst_Var(Range *z, int a, Range *x); void Full_Min_Cst_Var(Range *z, int a, Range *x); #endif /* NO_USE_FD_SOLVER */ #ifdef __cplusplus } #endif #endif ./gprolog-1.3.0/src/EnginePl/wam_archi.def0000644004425400513100000000732110547152476016711 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : wam_archi.def (gives rise to wam_archi.h) * * Descr.: Wam architecture definition - description file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /*---------------------------------* * Register Descriptions * *---------------------------------*/ typedef long WamWord; /* a wamword is a long (32/64 bits) */ typedef void (*CodePtr) (); /* a code pointer is a ptr to fct */ typedef CodePtr WamCont; /* a continuation is a code pointer */ #ifndef ONLY_TAG_PART #define X(x) (reg_bank[x]) #define A(a) (reg_bank[a]) typedef WamWord *WamWordP; @begin regs @filler NB_OF_X_REGS @reg 4 WamCont CP /* Continuation pointer */ @reg 4 WamWordP E /* Last environment pointer */ @reg 2 WamWordP B /* Last choice point pointer */ @reg 3 WamWordP H /* Top of the heap */ @reg 3 WamWordP HB1 /* copy of HB(B) */ @reg 1 WamWordP TR /* Top of the trail */ @reg 5 WamWordP S /* Unification pointer */ @reg 9 WamWord STAMP /* Choice point stamp (for FD) */ @reg 4 WamWordP CS /* Top of the constraint stack */ @reg 9 WamWord BCI /* Byte-code info */ @reg 9 WamWordP LSSA /* Local stack start address */ @end regs #endif /*---------------------------------* * Tag Descriptions * *---------------------------------*/ @begin tags @tag REF address 0 /* Reference */ @tag LST address 1 /* List */ @tag STC address 2 /* Structure */ @tag ATM short_uns 3 /* Atom */ @tag FLT address 4 /* Float */ @tag FDV address 5 /* Finite Domain Variable */ @tag INT long_int 7 /* Integer */ @end tags /*---------------------------------* * Stack Descriptions * *---------------------------------*/ #ifndef ONLY_TAG_PART #define KBytes_To_Wam_Words(kb) ((1024 * kb + sizeof(WamWord) - 1) / sizeof(WamWord)) #define Wam_Words_To_KBytes(ww) (ww * sizeof(WamWord) / 1024) #define Local_Top ((B >= E) ? B : E) @begin stacks @stack trail 3072 TR /* Trail stack */ @stack cstr 3072 CS /* Constraint stack */ @stack global 8192 H /* Global stack */ @stack local 4096 Local_Top /* Local stack (after global) */ @end stacks #endif ./gprolog-1.3.0/src/EnginePl/PPC_SIGSEGV.c0000644004425400513100000000265410547152476016260 0ustar diazloco#include #include typedef long WamWord; #if 0 void SIGSEGV_Handler(int sig) { /* LINUX: recovering the bad address... */ /* There is no documented way to get the address that has */ /* caused SIGSEGV. I have looked at the sources of the kernel */ /* (files from /usr/src/linux/arch/i386/) */ /* */ /* mm/fault.c:104: current->tss.cr2 = address; */ /* a bad address is found by the memory manager. */ /* */ /* kernel/signal.c:203: put_user(current->tss.cr2, frame+23); */ /* a context pointed by 'frame' is created in the stack, */ /* it contains the bad addess at +23. */ /* Inside the handler SIGSEGV_Handler(int sig) the context */ /* (frame) can be found at &sig-1. */ long *frame = (long *) &sig - 1; WamWord *addr = (WamWord *) (frame[+23]); printf("Segmentation Violation at: %lx\n", addr); exit(1); } #else #include void SIGSEGV_Handler(int sig, struct sigcontext_struct scp) { WamWord *addr = (WamWord *) scp.regs->dar; printf("Segmentation Violation at: %lx\n", addr); exit(1); } #endif main() { long *x; signal(SIGSEGV, (void (*)()) SIGSEGV_Handler); x = (long *) 0xffff040; *x = 12; } ./gprolog-1.3.0/src/EnginePl/wam_regs.h0000644004425400513100000000115710547440357016253 0ustar diazloco/* this file is automatically generated by pl_config.c */ #include "gp_config.h" #define MAP_REG_TR "ebx" #define MAP_OFFSET_B ((NB_OF_X_REGS+0)*4) #define MAP_OFFSET_H ((NB_OF_X_REGS+1)*4) #define MAP_OFFSET_HB1 ((NB_OF_X_REGS+2)*4) #define MAP_OFFSET_CP ((NB_OF_X_REGS+3)*4) #define MAP_OFFSET_E ((NB_OF_X_REGS+4)*4) #define MAP_OFFSET_CS ((NB_OF_X_REGS+5)*4) #define MAP_OFFSET_S ((NB_OF_X_REGS+6)*4) #define MAP_OFFSET_STAMP ((NB_OF_X_REGS+7)*4) #define MAP_OFFSET_BCI ((NB_OF_X_REGS+8)*4) #define MAP_OFFSET_LSSA ((NB_OF_X_REGS+9)*4) #define CFLAGS_REGS "-ffixed-ebx " ./gprolog-1.3.0/src/EnginePl/gp_config.h0000644004425400513100000001455410547440355016405 0ustar diazloco/* EnginePl/gp_config.h. Generated from gp_config.h.in by configure. */ /*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : configuration * * File : gp_config.h.in * * Descr.: general configuration file (handled by autoconf) - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ #ifndef _GP_CONFIG_H #define _GP_CONFIG_H /* Define if you have sys/ioctl_compat.h */ /* #undef HAVE_SYS_IOCTL_COMPAT_H */ /* Define if you have termios.h */ #define HAVE_TERMIOS_H 1 /* Define if you have termio.h */ /* #undef HAVE_TERMIO_H */ /* Define if you have malloc.h */ #define HAVE_MALLOC_H 1 /* Define if you have a working mmap system call */ #define HAVE_MMAP 1 /* Define if you have a working mprotect system call */ #define HAVE_MPROTECT 1 /* Define if you have a mallopt function */ #define HAVE_MALLOPT 1 /* Define inline keyword */ /* #undef inline */ /* Define if you don't want to use machine registers */ /* #undef NO_USE_REGS */ /* Define if you don't want to use the ebp register on ix86 */ #define NO_USE_EBP 1 /* Define if you don't want to fast call on ix86 */ /* #undef NO_USE_FAST_CALL */ /* Define if you don't want to include line editor facility */ /* #undef NO_USE_LINEDIT */ /* Define if you don't want consult/1 launches pl2wam with pipe on its input */ /* #undef NO_USE_PIPED_STDIN_FOR_CONSULT */ /* Define if you don't want to use the win32 GUI console */ #define NO_USE_GUI_CONSOLE 1 /* Define if you don't want to include sockets facility */ /* #undef NO_USE_SOCKETS */ /* Define if you don't want to include the FD constraint solver */ /* #undef NO_USE_FD_SOLVER */ /* Define if the cpu is a mips */ /* #undef M_mips */ /* Define if the cpu is an alpha */ /* #undef M_alpha */ /* Define if the cpu is a sparc */ /* #undef M_sparc */ /* Define if the cpu is a ix86 */ #define M_ix86 1 /* Define if the cpu is a powerpc */ /* #undef M_powerpc */ /* Define if the cpu is a x86-64 */ /* #undef M_x86_64 */ /* Define if the OS is an SGI IRIX */ /* #undef M_irix */ /* Define if the OS is an DEC OSF1 */ /* #undef M_osf */ /* Define if the OS is a sunos */ /* #undef M_sunos */ /* Define if the OS is a solaris */ /* #undef M_solaris */ /* Define if the OS is a linux */ #define M_linux 1 /* Define if the OS is a WinXX based on Cygwin */ /* #undef M_cygwin */ /* Define if the OS is a WIN32 */ /* #undef M_win32 */ /* Define if the OS is a SCO */ /* #undef M_sco */ /* Define if the OS is a (Free/Open/Net)BSD */ /* #undef M_bsd */ /* Define if the system is an mips/irix */ /* #undef M_mips_irix */ /* Define if the system is an alpha/linux */ /* #undef M_alpha_linux */ /* Define if the system is an alpha/OSF1 */ /* #undef M_alpha_osf */ /* Define if the system is a ix86/linux */ #define M_ix86_linux 1 /* Define if the system is a ix86/sco */ /* #undef M_ix86_sco */ /* Define if the system is a ix86/freebsd or openbsd or netbsd */ /* #undef M_ix86_bsd */ /* Define if the system is a ix86/cygwin */ /* #undef M_ix86_cygwin */ /* Define if the system is a ix86/mingw */ /* #undef M_ix86_mingw */ /* Define if the system is a ix86/win32 */ /* #undef M_ix86_win32 */ /* Define if the system is a ix86/darwin */ /* #undef M_ix86_darwin */ /* Define if the system is a ix86/solaris */ /* #undef M_ix86_solaris */ /* Define if the system is a sparc/solaris */ /* #undef M_sparc_solaris */ /* Define if the system is a sparc/sunos */ /* #undef M_sparc_sunos */ /* Define if the system is a sparc/bsd */ /* #undef M_sparc_bsd */ /* Define if the system is a powerpc/linux */ /* #undef M_powerpc_linux */ /* Define if the system is a powerpc/darwin */ /* #undef M_powerpc_darwin */ /* Define if the system is a powerpc/bsd */ /* #undef M_powerpc_bsd */ /* Define if the system is a x86-64/linux */ /* #undef M_x86_64_linux */ /* Constant definitions */ #define PROLOG_NAME1 "gprolog" #define PROLOG_NAME "GNU Prolog" #define PROLOG_VERSION "1.3.0" #define PROLOG_DATE "Jan 4 2007" #define PROLOG_COPYRIGHT "Copyright (C) 1999-2007 Daniel Diaz" #define TOP_LEVEL "gprolog" #define GPLC "gplc" #define HEXGPLC "hexgplc" #define ENV_VARIABLE "PL_PATH" #define M_VENDOR "pc" #define M_CPU "i686" #define M_OS "linux-gnu" #define CC "gcc" #define CFLAGS_PREFIX_REG "-ffixed-%s" #define CFLAGS "-g -Wall" #define CFLAGS_MACHINE "-march=pentiumpro" #define LDFLAGS "" #define LDLIBS "-lm" #define AS "as" #define STRIP "strip" #define ASM_SUFFIX ".s" #define OBJ_SUFFIX ".o" #define EXE_SUFFIX "" #define CC_OBJ_NAME_OPT "-o " #define CC_EXE_NAME_OPT "-o " #define DLL_W32GUICONS "w32guicons.dll" #define LIB_LINEDIT "liblinedit.a" #define LIB_ENGINE_PL "libengine_pl.a" #define LIB_BIPS_PL "libbips_pl.a" #define LIB_ENGINE_FD "libengine_fd.a" #define LIB_BIPS_FD "libbips_fd.a" #define SIZEOF_LONG 4 #define WORD_SIZE (8 * SIZEOF_LONG) /* Define if socklen_t is not defined */ /* #undef socklen_t */ #include "arch_dep.h" #endif /* !_GP_CONFIG_H */ ./gprolog-1.3.0/src/EnginePl/misc.c0000644004425400513100000001566710547154141015401 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : misc.c * * Descr.: malloc with checks + other miscellaneous operations * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: misc.c,v 1.12 2007/01/04 10:35:13 diaz Exp $ */ #include "machine.h" #ifdef USE_DL_MALLOC #include "dl_malloc.c" static void __attribute__((constructor)) Init_Dl_Malloc(void) { mallopt(M_MMAP_THRESHOLD, 0xFFFFFFF); /* big value to no use mmap */ } #endif #include #include #include #include #include "engine_pl.h" #ifndef NO_USE_LINEDIT #include "../Linedit/linedit.h" #endif /*---------------------------------* * Constants * *---------------------------------*/ #define ERR_ALLOC_FAULT "Memory allocation fault (%s) in %s:%d" /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * MALLOC_CHECK * * * *-------------------------------------------------------------------------*/ char * Malloc_Check(unsigned size, char *src_file, int src_line) { char *m = malloc(size); if (m == NULL) Fatal_Error(ERR_ALLOC_FAULT, "malloc", src_file, src_line); return m; } /*-------------------------------------------------------------------------* * CALLOC_CHECK * * * *-------------------------------------------------------------------------*/ char * Calloc_Check(unsigned nb, unsigned size, char *src_file, int src_line) { char *m = calloc(nb, size); if (m == NULL) Fatal_Error(ERR_ALLOC_FAULT, "calloc", src_file, src_line); return m; } /*-------------------------------------------------------------------------* * REALLOC_CHECK * * * *-------------------------------------------------------------------------*/ char * Realloc_Check(char *ptr, unsigned size, char *src_file, int src_line) { char *m = realloc(ptr, size); if (m == NULL) Fatal_Error(ERR_ALLOC_FAULT, "realloc", src_file, src_line); return m; } /*-------------------------------------------------------------------------* * STRDUP_CHECK * * * *-------------------------------------------------------------------------*/ char * Strdup_Check(char *str, char *src_file, int src_line) { char *s = strdup(str); if (s == NULL) Fatal_Error(ERR_ALLOC_FAULT, "strdup", src_file, src_line); return s; } /*-------------------------------------------------------------------------* * EXTEND_TABLE_IF_NEEDED * * * *-------------------------------------------------------------------------*/ void Extend_Table_If_Needed(char **hash_tbl) { int size = Hash_Table_Size(*hash_tbl); if (Hash_Nb_Elements(*hash_tbl) >= size) *hash_tbl = Hash_Realloc_Table(*hash_tbl, size * 2); } /*-------------------------------------------------------------------------* * EXTEND_ARRAY * * * *-------------------------------------------------------------------------*/ void Extend_Array(char **ptbl, int *nb_elem, int elem_size, Bool bzero) { int old_nb_elem = *nb_elem; int new_nb_elem = old_nb_elem * 2; char *new_tbl; new_tbl = Realloc(*ptbl, new_nb_elem * elem_size); if (bzero) memset(new_tbl + (old_nb_elem * elem_size), 0, (new_nb_elem - old_nb_elem) * elem_size); *ptbl = new_tbl; *nb_elem = new_nb_elem; } /*-------------------------------------------------------------------------* * EXIT_WITH_VALUE * * * *-------------------------------------------------------------------------*/ void Exit_With_Value(int ret_val) { #ifndef NO_USE_LINEDIT if (le_hook_exit_process) (*le_hook_exit_process)(); #endif exit(ret_val); } /*-------------------------------------------------------------------------* * FATAL_ERROR * * * *-------------------------------------------------------------------------*/ void Fatal_Error(char *format, ...) { va_list arg_ptr; char buff[1024]; va_start(arg_ptr, format); vsprintf(buff, format, arg_ptr); va_end(arg_ptr); #ifndef NO_USE_LINEDIT if (le_hook_message_box) (*le_hook_message_box)("Fatal Error", buff, 0); else #endif fprintf(stderr, "\nFatal Error: %s\n", buff); Exit_With_Value(1); } ./gprolog-1.3.0/src/EnginePl/pl_params.h0000644004425400513100000000434410547154141016417 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : pl_params.h * * Descr.: parameter header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: pl_params.h,v 1.10 2007/01/04 10:35:13 diaz Exp $ */ #define MAX_OBJECT 1024 #define START_PRED_TBL_SIZE 4096 #define START_OPER_TBL_SIZE 1024 #define ATOM_SIZE 16 #define MAX_ATOM (1 << ATOM_SIZE) /* number of elements */ #define NB_OF_X_REGS 256 #define MAX_ARITY (NB_OF_X_REGS - 1) /* NB: if NB_OF_X_REGS is changed it is necessary to modify ma2asm but also the byte code management */ ./gprolog-1.3.0/src/EnginePl/LINUX_SIGSEGV.c0000644004425400513100000000277110547152476016535 0ustar diazloco#include #include typedef long WamWord; #if 0 void SIGSEGV_Handler(int sig) { /* LINUX: recovering the bad address... */ /* There is no documented way to get the address that has */ /* caused SIGSEGV. I have looked at the sources of the kernel */ /* (files from /usr/src/linux/arch/i386/) */ /* */ /* mm/fault.c:104: current->tss.cr2 = address; */ /* a bad address is found by the memory manager. */ /* */ /* kernel/signal.c:203: put_user(current->tss.cr2, frame+23); */ /* a context pointed by 'frame' is created in the stack, */ /* it contains the bad addess at +23. */ /* Inside the handler SIGSEGV_Handler(int sig) the context */ /* (frame) can be found at &sig-1. */ long *frame = (long *) &sig - 1; WamWord *addr = (WamWord *) (frame[+23]); printf("Segmentation Violation at: %lx\n", addr); exit(1); } #else #include #if 0 void SIGSEGV_Handler(int sig, struct sigcontext_struct scp) #else void SIGSEGV_Handler(int sig, struct sigcontext scp) #endif { #if 1 WamWord *addr = (WamWord *) scp.cr2; printf("Segmentation Violation at: %lx\n", addr); #endif exit(1); } #endif main() { long *x; signal(SIGSEGV, (void (*)()) SIGSEGV_Handler); x = (long *) 0xffff040; *x = 12; } ./gprolog-1.3.0/src/EnginePl/WIN32_SIGSEGV.c0000644004425400513100000000310110547152476016424 0ustar diazloco#include #include #include int getpagesize(void) { SYSTEM_INFO si; GetSystemInfo(&si); return si.dwPageSize; } long *fault_addr; int Is_Win32_SEGV(LPEXCEPTION_POINTERS err) { PEXCEPTION_RECORD per = err->ExceptionRecord; if (per->ExceptionCode != EXCEPTION_ACCESS_VIOLATION) return EXCEPTION_CONTINUE_SEARCH; fault_addr = (long *) (per->ExceptionInformation[1]); return EXCEPTION_EXECUTE_HANDLER; } main(int argc, char *argv[]) { long *addr = NULL; int i; DWORD old_prot; setbuf(stdout, NULL); printf("Page Size:%d bytes\n", getpagesize()); if (argc > 1) addr = (long *) strtoul(argv[1], NULL, 16); printf("TRYING at %#x\n", addr); addr = VirtualAlloc(addr, 4096 * 2, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); if (addr == NULL) { printf("ERROR Alloc %lu\n", GetLastError()); exit(1); } if (!VirtualProtect(addr + 1024, 4096, PAGE_NOACCESS, &old_prot)) { printf("ERROR protect %lu\n", GetLastError()); exit(1); } printf("ALLOC at %#x\n", addr); _try { long *a = (long *) 0x12345678; *a = 12; } _except(Is_Win32_SEGV(GetExceptionInformation())) { printf("ACCESS VIOLATION at addr=%#x\n", fault_addr); } _try { for (i = 0; i < 1025; i++) addr[i] = i; for (i = 0; i < 1024; i++) if (addr[i] != i) printf("ERROR at [%d]=%d\n", i, addr[i]); } _except(Is_Win32_SEGV(GetExceptionInformation())) { printf("ACCESS VIOLATION at [%d] addr=%#x (%#x)\n", i, fault_addr, addr + i); } printf("FINISHED\n"); } ./gprolog-1.3.0/src/EnginePl/machine1.h0000644004425400513100000000571710547154141016133 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine + Compiler * * File : machine1.h * * Descr.: machine dependent features - Header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: machine1.h,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ #include /*---------------------------------* * Constants * *---------------------------------*/ #define M_OS_UNIX 0 #define M_OS_WINDOWS 1 #define M_OS_WINDOWS_NT 2 /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef MACHINE1_FILE int m_os_type; char m_architecture[32]; char m_os_version[256]; #else extern int m_os_type; extern char m_architecture[]; extern char m_os_version[]; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Init_Machine1(void); char **M_Create_Shell_Command(char *cmd); char **M_Cmd_Line_To_Argv(char *cmd, int *argc); int M_Shell(char *cmd); int M_Spawn(char *arg[]); int M_Spawn_Redirect(char *arg[], int detach, FILE **f_in, FILE **f_out, FILE **f_err); int M_Get_Status(int pid); char *M_Mktemp(char *tmp_template); char *M_Tempnam(char *dir, char *pfx); #define DBGPRINTF printf ./gprolog-1.3.0/src/EnginePl/SOLARIS_SIGSEGV.c0000644004425400513100000000105010547152476016737 0ustar diazloco#include #include typedef long WamWord; void SIGSEGV_Handler(int sig, siginfo_t * sip) { WamWord *addr = (WamWord *) sip->si_addr; printf("Segmentation Violation at: %lx\n", addr); exit(1); } main() { long *x; #if 0 signal(SIGSEGV, (void (*)()) SIGSEGV_Handler); #else struct sigaction act; act.sa_handler = NULL; act.sa_sigaction = (void (*)()) SIGSEGV_Handler; sigemptyset(&act.sa_mask); act.sa_flags = SA_SIGINFO; sigaction(SIGSEGV, &act, NULL); #endif x = (long *) 0xFEA4F124; *x = 12; } ./gprolog-1.3.0/src/EnginePl/if_no_fd.c0000644004425400513100000000774110547154141016203 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : if_no_fd.c * * Descr.: FD interface for Prolog engine * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: if_no_fd.c,v 1.9 2007/01/04 10:35:13 diaz Exp $ */ #include #define IF_NO_FD_FILE #include "engine_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /* Errors Messages */ #define ERR_FD_SOLVER_MISSING __FILE__ ": FD Solver not linked" /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Fd_Solver_Missing(void); /*-------------------------------------------------------------------------* * FD_INIT_SOLVER * * * *-------------------------------------------------------------------------*/ void Fd_Init_Solver(void) { if (fd_init_solver == NULL) /* FD solver not linked */ { fd_unify_with_integer = (Bool (*)()) Fd_Solver_Missing; fd_unify_with_fd_var = (Bool (*)()) Fd_Solver_Missing; fd_variable_size = (int (*)()) Fd_Solver_Missing; fd_copy_variable = (int (*)()) Fd_Solver_Missing; fd_variable_to_string = (char *(*)()) Fd_Solver_Missing; return; } (*fd_init_solver) (); } /*-------------------------------------------------------------------------* * FD_RESET_SOLVER * * * *-------------------------------------------------------------------------*/ void Fd_Reset_Solver(void) { if (fd_reset_solver == NULL) /* FD solver not linked */ return; (*fd_reset_solver) (); } /*-------------------------------------------------------------------------* * FD_SOLVER_MISSING * * * *-------------------------------------------------------------------------*/ void Fd_Solver_Missing(void) { Fatal_Error(ERR_FD_SOLVER_MISSING); } ./gprolog-1.3.0/src/EnginePl/main.c0000644004425400513100000001053010547154141015352 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : main.c * * Descr.: main * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: main.c,v 1.14 2007/01/04 10:35:13 diaz Exp $ */ #include #include #include "engine_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * MAIN * * * * A problem appeared in GCC 3.0.x under Linux/ix86: * * the main() function always use a frame (and thus ebp). This causes a bug* * if ebp is used by gcc between Start_Prolog() and Stop_Prolog() (e.g. to * * access argv/argc or local variables) since ebp contains a WAM register. * * Note that after Stop_Prolog() all registers are restored and ebp is * * correct when returning in main(). * * * * To solve we can use an intermediate function Main_Wrapper() called by * * the main() function. * * * * Another solution consists in passing -mpreferred-stack-boundary=2 to gcc* * since it gcc uses ebp to ensure the stack alignment (to 4). * * * * This main function uses the wrapper even if ebp is not really used * * between Start_Prolog() and Stop_Prolog() but to serve as model. * *-------------------------------------------------------------------------*/ static int Main_Wrapper(int argc, char *argv[]) { int nb_user_directive; Bool top_level; nb_user_directive = Start_Prolog(argc, argv); top_level = Try_Execute_Top_Level(); Stop_Prolog(); if (top_level || nb_user_directive) return 0; fprintf(stderr, "Warning: no initial goal executed\n" " use a directive :- initialization(Goal)\n" " or remove the link option --no-top-level" " (or --min-bips or --min-size)\n"); return 1; } int main(int argc, char *argv[]) { Exit_With_Value(Main_Wrapper(argc, argv)); return 0; /* anything for the compiler */ } ./gprolog-1.3.0/src/EnginePl/engine_pl.h0000644004425400513100000000416410547154141016401 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : engine_pl.h * * Descr.: general header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: engine_pl.h,v 1.10 2007/01/04 10:35:13 diaz Exp $ */ #include "gp_config.h" #include "pl_params.h" #include "hash.h" #include "bool.h" #include "wam_regs.h" #include "wam_archi.h" #include "engine.h" #include "atom.h" #include "pred.h" #include "misc.h" #include "oper.h" #include "machine1.h" #include "machine.h" #include "obj_chain.h" #include "wam_inst.h" #include "if_no_fd.h" ./gprolog-1.3.0/src/EnginePl/pred.c0000644004425400513100000001114010547154141015356 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog engine * * File : pred.c * * Descr.: predicate table management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: pred.c,v 1.10 2007/01/04 10:35:13 diaz Exp $ */ #include #include #define PRED_FILE #include "engine_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * INIT_PRED * * * *-------------------------------------------------------------------------*/ void Init_Pred(void) { pred_tbl = Hash_Alloc_Table(START_PRED_TBL_SIZE, sizeof(PredInf)); } /*-------------------------------------------------------------------------* * CREATE_PRED * * * * Called by compiled prolog code, by dynamic predicate support and by * * byte-code support. * *-------------------------------------------------------------------------*/ PredInf * FC Create_Pred(int func, int arity, int pl_file, int pl_line, int prop, long *codep) { PredInf pred_info; PredInf *pred; long key = Functor_Arity(func, arity); #ifdef DEBUG DBGPRINTF("Create pred: %s/%d prop: %x\n", atom_tbl[func].name, arity, prop); #endif pred_info.f_n = key; pred_info.prop = prop; pred_info.pl_file = pl_file; pred_info.pl_line = pl_line; pred_info.codep = codep; pred_info.dyn = NULL; Extend_Table_If_Needed(&pred_tbl); pred = (PredInf *) Hash_Insert(pred_tbl, (char *) &pred_info, FALSE); return pred; } /*-------------------------------------------------------------------------* * LOOKUP_PRED * * * *-------------------------------------------------------------------------*/ PredInf * FC Lookup_Pred(int func, int arity) { long key = Functor_Arity(func, arity); return (PredInf *) Hash_Find(pred_tbl, key); } /*-------------------------------------------------------------------------* * DELETE_PRED * * * *-------------------------------------------------------------------------*/ void FC Delete_Pred(int func, int arity) { long key = Functor_Arity(func, arity); Hash_Delete(pred_tbl, key); } ./gprolog-1.3.0/src/Fd2C/0000777004425400513100000000000010547442376013316 5ustar diazloco./gprolog-1.3.0/src/Fd2C/FD_SYNTAX0000644004425400513100000000352607026207416014632 0ustar diazlocouser_cstr::= head body head::= c_ident '(' decl... ')' decl::= type var ',' type::= int | fdv | any | l_int | l_fdv | l_any body::= bloc_lst wait_swt wait_swt::= 'wait_switch' case... | empty case::= 'case' cond stop... bloc... stop::= 'stop' c_ident bloc_lst::= bloc... | empty bloc::= 'start' bloc_name elem... forall last_elem trig always bloc_name::= '(' c_ident ')' | empty elem::= type var type = int / range | 'fail' 'if' cond | 'exit' 'if' cond | var '=' term type = int | var '=' range type = range | empty forall::= 'forall' var 'of' var 'do' | empty last_elem::= x_in_r | c_fct x_in_r::= var 'in' range range::= term '..' term | '{' term,... '}' | var type = range | 'dom' '(' var ')' type = fdv | range ':' range | range '&' range | '~' range | range '++' range | range '--' range | range '**' range | range '//' range | range '%%' range | range '+' term | range '-' term | range '*' term | range '/' term | range '%' term | c_fct trig::= 'trigger' [ 'also' ] 'on' trig_elem... | empty trig_elem::= 'min' '(' var ')' type = fdv / l_fdv | 'max' '(' var ')' type = fdv / l_fdv | 'val' '(' var ')' type = fdv / l_fdv | 'dom' '(' var ')' type = fdv / l_fdv always::= 'always' | empty cond::= term term::= integer | 'max_integer' | var type = int | 'min' '(' var ')' type = fdv | 'max' '(' var ')' type = fdv | 'val' '(' var ')' type = fdv | term '+' term | term '-' term | term '*' term | term '/<' term | term '/>' term | term 'mod' term | other C expressions (using &&, ||, ==, !=, <, <=, >, >=) | c_fct type::= 'int' | 'range' | 'fdv' | 'any' | 'l_fdv' | 'l_int' 'l_any' c_fct::= c_ident '(' arg... ')' arg::= term | range | var type = all | '&' arg c_ident::= [A-Z][a-zA-Z_0-9]* cannot be a keyword ./gprolog-1.3.0/src/Fd2C/read_file.pl0000644004425400513100000001121510547154141015547 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint definition file to C code compiler * * File : read_file.pl * * Descr.: source file reading * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: read_file.pl,v 1.10 2007/01/04 10:35:13 diaz Exp $ */ file_to_token_lst(LToken) :- get_code(stream_fd, C), file_to_token_lst1(C, LToken). file_to_token_lst1(-1, []) :- !. file_to_token_lst1(C, LToken) :- C =< 32, !, get_code(stream_fd, C1), file_to_token_lst1(C1, LToken). file_to_token_lst1(47, LToken) :- peek_code(stream_fd, 42), !, get_code(stream_fd, _), skip_until(42, 47, f), get_code(stream_fd, C1), file_to_token_lst1(C1, LToken). file_to_token_lst1(37, LToken) :- peek_code(stream_fd, 123), !, get_code(stream_fd, _), stream_line_column(stream_fd, Line1, _), format(stream_c, '~n/* line:~d begin included code */~n', [Line1]), skip_until(37, 125, t), stream_line_column(stream_fd, Line2, _), format(stream_c, '~n/* line:~d end included code */~n', [Line2]), get_code(stream_fd, C1), file_to_token_lst1(C1, LToken). file_to_token_lst1(C, [t(Token, Line, Col1)|LToken]) :- stream_line_column(stream_fd, Line, Col), Col1 is Col - 1, one_token(C, Token, C1), file_to_token_lst1(C1, LToken). skip_until(C1, C2, Echo) :- g_assign(next, C1), repeat, g_read(next, Next), get_code(stream_fd, C), skip1(C, Next, C1, C2, Echo), !. skip1(-1, _, C1, C2, _) :- error('EOF reached before ~c~c found', [C1, C2]). skip1(Next, Next, _, Next, _) :- !. skip1(Next, Next, Next, C2, _) :- !, g_assign(next, C2), fail. skip1(C, Next, C1, Next, Echo) :- !, ( Echo = t -> put_code(stream_c, C1), put_code(stream_c, C) ; true ), g_assign(next, C1), fail. skip1(C, _, _, _, Echo) :- ( Echo = t -> put_code(stream_c, C) ; true ), fail. one_token(C, Token, C2) :- ( C >= 97, C =< 122, C1 = C ; C >= 65, C =< 90, C1 is C + 97 - 65 ; C = 39, C1 = C ), !, unget_code(stream_fd, C1), read_atom(stream_fd, Token1), ( C >= 65, C =< 90 -> sub_atom(Token1, 1, _, 0, A), char_code(AC, C), atom_concat(AC, A, Token2) ; Token2 = Token1 ), ( keyword(Token2) -> Token = Token2 ; Token = ident(Token2) ), get_code(stream_fd, C2). one_token(C, Token, C1) :- C >= 48, C =< 57, !, unget_code(stream_fd, C), read_integer(stream_fd, Token), get_code(stream_fd, C1). one_token(C, Token, C2) :- get_code(stream_fd, C1), char_code(A1, C), char_code(A2, C1), atom_concat(A1, A2, A), ( member(A, [/<, />, ==, '!=', <=, >=, &&, '||', .., ++, --, **, //, '%%', '|<', '|>']) -> get_code(stream_fd, C2), Token = A ; Token = A1, C2 = C1 ). keyword(min). keyword(max). keyword(dom). keyword(val). keyword(int). keyword(range). keyword(fdv). keyword(any). keyword(l_int). keyword(l_range). keyword(l_fdv). keyword(l_any). keyword(when). keyword(wait_switch). keyword(case). keyword(start). keyword(trigger). keyword(also). keyword(on). keyword(always). keyword(fail). keyword(exit). keyword(if). keyword(stop). keyword(forall). keyword(of). keyword(do). keyword(in). keyword(max_integer). ./gprolog-1.3.0/src/Fd2C/fd2c.pl0000644004425400513100000001354710547154141014465 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint definition file to C code compiler * * File : fd2c.pl * * Descr.: main file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: fd2c.pl,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ fd2c(Args) :- catch(fd2c1(Args), Err, exception(Err)). fd2c1(Args) :- cmd_line_args(Args, FdFile0, CFile0), fd_file(FdFile0, FdFile), c_file(CFile0, FdFile, CFile), open(FdFile, read, _, [alias(stream_fd)]), open(CFile, write, _, [alias(stream_c)]), emit_code_init(FdFile), file_to_token_lst(LToken), close(stream_fd), parse_and_emit(LToken), close(stream_c). parse_and_emit([]). parse_and_emit(LToken) :- ( LToken = [] -> true ; parse_user_cstr(Cstr, LToken, LToken1), emit_user_cstr(Cstr), parse_and_emit(LToken1) ). fd_file(FdFile, FdFile1) :- decompose_file_name(FdFile, _, _, Suffix), ( Suffix \== '' -> FdFile1 = FdFile ; atom_concat(FdFile, '.fd', FdFile1) ). c_file('', FdFile, CFile) :- !, decompose_file_name(FdFile, _, Prefix, _), atom_concat(Prefix, '.c', CFile). c_file(CFile, _, CFile). % Command-line options reading cmd_line_args(Args, FdFile, CFile) :- g_assign(fdfile, ''), g_assign(cfile, ''), cmd_line_args(Args), g_read(fdfile, FdFile), ( FdFile = '' -> write('no input file'), nl, abort ; true ), g_read(cfile, CFile). cmd_line_args([]). cmd_line_args([Arg|LArg]) :- cmd_line_arg1(Arg, LArg, LArg1), !, cmd_line_args(LArg1). cmd_line_arg1('-o', LArg, LArg1) :- cmd_line_arg1('--output', LArg, LArg1). cmd_line_arg1('--output', LArg, LArg1) :- ( LArg = [CFile|LArg1], sub_atom(CFile, 0, 1, _, Prefix), Prefix \== (-) ; format('FILE missing after --output option~n', []), abort ), g_read(cfile, CFile0), ( CFile0 = '' -> true ; format('output file already specified (~a)~n', [CFile0]), abort ), g_assign(cfile, CFile). cmd_line_arg1('--version', LArg, LArg) :- display_copying, stop. cmd_line_arg1('-h', LArg, LArg1) :- cmd_line_arg1('--help', LArg, LArg1). cmd_line_arg1('--help', LArg, LArg) :- ( h(L), write(L), nl, fail ; nl, write('Report bugs to bug-prolog@gnu.org.'), nl, stop ). cmd_line_arg1(Arg, _, _) :- sub_atom(Arg, 0, 1, _, -), format('unknown option ~a - try fd2c --help~n', [Arg]), abort. cmd_line_arg1(FdFile, LArg, LArg) :- g_read(fdfile, FdFile0), ( FdFile0 = '' -> true ; format('input file already specified (~a)~n', [FdFile0]), abort ), g_assign(fdfile, FdFile). % Copying display_copying :- current_prolog_flag(prolog_name, Name), current_prolog_flag(prolog_version, Version), current_prolog_flag(prolog_copyright, Copyright), format('FD Constraints to C Compiler (~a) ~a~n', [Name, Version]), format('By Daniel Diaz~n', []), write(Copyright), nl, format('~a comes with ABSOLUTELY NO WARRANTY.~n', [Name]), format('You may redistribute copies of ~a~n', [Name]), format('under the terms of the GNU General Public License.~n', []), format('For more information about these matters, see the files named COPYING.~n', []). % Help h('Usage: fd2c [OPTION...] FILE'). h(''). h('Options:'). h(' -o FILE, --output FILE set output file name'). h(' --help print this help and exit'). h(' --version print version number and exit'). h(''). h('''user'' can be given as FILE for the standard input/output'). % Exception recovery exception(error(syntax_error(_), _)) :- !, syntax_error_info(_, Line, Char, Msg), error('~d syntax error: ~a (char:~d)', [Line, Msg, Char]). exception(error(existence_error(source_sink, File), _)) :- !, error('cannot open file ~w - does not exist', [File]). exception(error(permission_error(open, source_sink, File), _)) :- !, error('cannot open file ~w - permission error', [File]). exception(Err) :- error('exception raised: ~w', [Err]). error(Msg, Args) :- g_read(fdfile, FdFile), format(user_output, 'error: ~a:', [FdFile]), format(user_output, Msg, Args), nl(user_output), abort. warn(Msg, Args) :- g_read(fdfile, FdFile), format(user_output, 'warning: ~a:', [FdFile]), format(user_output, Msg, Args), nl(user_output). % Starting directive go :- argument_list(L), fd2c(L). :- initialization(go). ./gprolog-1.3.0/src/Fd2C/parse.pl0000644004425400513100000004530210547154141014753 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint definition file to C code compiler * * File : parse.pl * * Descr.: parsing and some code emission * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: parse.pl,v 1.12 2007/01/04 10:35:13 diaz Exp $ */ parse_user_cstr(uc(Name, AFSize, LHVar, Body)) --> head(Name, NbHVar, LHVar), terminal_check('{'), { g_assign(afsize, NbHVar), retractall(hvar(_)), asserta(hvar(LHVar)), retractall(bname(_, _)) }, body(Body), terminal_check('}'), !, { g_read(afsize, AFSize), close_list(LHVar) }. head(Name, NbHVar, LHVar) --> ident_check(Name), terminal_check('('), decl_lst(0, NbHVar, LHVar), terminal_check(')'), !. decl_lst(I, NbHVar, [HVar|LHVar]) --> decl_one(I, HVar), { I1 is I + 1 }, decl_rest_lst(I1, NbHVar, LHVar). decl_rest_lst(I, NbHVar, LHVar) --> terminal(','), !, decl_lst(I, NbHVar, LHVar). decl_rest_lst(I, I, _) --> []. decl_one(I, v(V, T, I)) --> type(T), a_var(V), !. decl_one(_, _) --> syn_error('variable declaration'). type(int) --> terminal(int). type(range) --> terminal(range). type(fdv) --> terminal(fdv). type(any) --> terminal(any). type(l_int) --> terminal(l_int). type(l_range) --> terminal(l_range). type(l_fdv) --> terminal(l_fdv). type(l_any) --> terminal(l_any). body(by(LBloc, WaitSwt)) --> bloc_lst(LBloc), wait_swt(WaitSwt), !. body(_) --> syn_error(body). wait_swt(ws(LUse, LCase)) --> terminal(wait_switch), !, { clause(hvar(LVar), _) }, case_lst(LVar, LUse, LCase), { close_list(LUse) }. wait_swt(no_wait_switch) --> []. case_lst(LVar, LUse, [Case|LCase]) --> case_one(LVar, LUse, Case), case_rest_lst(LVar, LUse, LCase). case_rest_lst(LVar, LUse, LCase) --> case_lst(LVar, LUse, LCase), !. case_rest_lst(_, _, []) --> []. case_one(LVar, LUse, ca(co(Term, LWNext, LWInst), LBNoStop, LBloc)) --> terminal(case), term(LVar, LUse, Term, LWNext, LWInst), stop_lst(LBNoStop), bloc_lst(LBloc). stop_lst([BNoStop|LBNoStop]) --> stop_one(BNoStop), stop_lst(LBNoStop). stop_lst([]) --> []. stop_one(BNoStop) --> terminal(stop), !, ident_check(BName), ( { clause(bname(BName, BNoStop), _) } -> { true } ; sem_error('undeclared bloc name "~a"', [BName]) ). bloc_lst([Bloc|LBloc]) --> bloc_one(Bloc), bloc_lst(LBloc). bloc_lst([]) --> []. bloc_one(bl(BNo, LDep, LUse, LWInst, TellFdv, Always)) --> { clause(hvar(LVar), _) }, terminal(start), bloc_name(BNo), elem_lst(LVar, LUse, LWInst1, LWInst), forall(LVar, LUse, LWInst2, LWInst1, HasForAll), last_elem(LVar, LUse, TellFdv, LWInst3, LWInst2), { HasForAll = t -> LWInst3 = [fd_forall_end] ; LWInst3 = [] }, trig(LVar, LUse, LDep), always(Always), { close_list(LDep), close_list(LUse) }. bloc_name(BNo) --> terminal('('), !, ident_check(BName), ( { clause(bname(BName, _), _) } -> sem_error('bloc name already used "~a"', [BName]) ; { g_read(afsize, BNo), AFSize is BNo + 1, g_assign(afsize, AFSize), assertz(bname(BName, BNo)) } ), terminal_check(')'). bloc_name(-1) --> []. trig(LVar, LUse, LDep) --> terminal(trigger), terminal(also), !, terminal_check(on), trig_lst(LVar, LDep), { add_use_to_dep(LUse, LDep) }. trig(LVar, _, LDep) --> terminal(trigger), !, terminal_check(on), trig_lst(LVar, LDep). trig(_, LUse, LDep) --> { add_use_to_dep(LUse, LDep) }. trig_lst(LVar, LDep) --> trig_one(LVar, LDep), trig_rest_lst(LVar, LDep). trig_rest_lst(LVar, LDep) --> terminal(','), trig_lst(LVar, LDep), !. trig_rest_lst(_, _) --> []. trig_one(LVar, LDep) --> terminal(What), { What = min ; What = max ; What = dom ; What = val }, !, terminal_check('('), a_var(V), terminal_check(')'), { get_typeof(LVar, V, T, I), (T \== fdv, T \== l_fdv -> var_check_type(LVar, V, fdv, _, _, _) % type error ; true), (What = dom -> What1 = dom(_) ; What1 = What), add_marked_var(LDep, V, T, I, What1) }. always(always) --> terminal(always), !. always(optimized) --> []. elem_lst(LVar, LUse, LWNext, LWInst) --> elem_one(LVar, LUse, LWInst1, LWInst), elem_lst(LVar, LUse, LWNext, LWInst1). elem_lst(_, _, LWNext, LWNext) --> []. elem_one(LVar, LUse, LWNext, LWInst) --> type(T), a_var(V), !, check_type_int_or_range(T), { add_local_var(LVar, v(V, T, I)) }, local_var_assign(LVar, LUse, V, T, I, LWNext, LWInst). elem_one(LVar, LUse, LWNext, LWInst) --> a_var(V), terminal(=), !, { get_typeof(LVar, V, T, I) }, check_type_int_or_range(T), assign_right_value(LVar, LUse, V, T, I, LWNext, LWInst). elem_one(LVar, LUse, LWNext, LWInst) --> terminal(fail), !, terminal_check(if), term(LVar, LUse, Term, LWInst1, LWInst), { LWInst1 = [fd_test_fail_condition(Term)|LWNext] }. elem_one(LVar, LUse, LWNext, LWInst) --> terminal(exit), !, terminal_check(if), term(LVar, LUse, Term, LWInst1, LWInst), { LWInst1 = [fd_test_exit_condition(Term)|LWNext] }. check_type_int_or_range(int) --> !. check_type_int_or_range(range) --> !. check_type_int_or_range(_) --> syn_error('int or range type'). local_var_assign(LVar, LUse, V, T, I, LWNext, LWInst) --> terminal(=), !, assign_right_value(LVar, LUse, V, T, I, LWNext, LWInst). local_var_assign(_, _, _, _, _, LWNext, LWNext) --> []. assign_right_value(LVar, LUse, V, int, I, LWNext, LWInst) --> { atom_concat(int, V, X), add_marked_var(LUse, V, int, I, _) }, term(LVar, LUse, Term, LWInst, LWInst1), !, { LWInst1 = [fd_init_local_value_var(X, Term)|LWNext] }. assign_right_value(LVar, LUse, V, range, I, LWNext, LWInst) --> { add_marked_var(LUse, V, range, I, range(Range)) }, range(LVar, LUse, Range, LWNext, LWInst), !. assign_right_value(_, _, _, _, _, _, _) --> syn_error('right value'). forall(LVar, LUse, LWNext, LWInst, t) --> terminal(forall), !, var_check_new(LVar, V), terminal_check(of), var_check_type(LVar, VL, l_fdv, IL), terminal_check(do), { add_marked_var(LUse, VL, l_fdv, IL, _), g_read(afsize, I), AFSize is I + 1, g_assign(afsize, AFSize), add_local_var(LVar, v(V, fdv, I)), atom_concat(l_fdv, VL, VL1), LWInst = [fd_forall(I, VL1)|LWNext] }. forall(_, _, LWNext, LWNext, f) --> []. last_elem(LVar, LUse, -1, LWNext, LWInst) --> c_fct(LVar, LUse, Head, LArg, LWInst1, LWInst), { Term =.. [Head|LArg], LWInst1 = [fd_check_fct(Term)|LWNext] }. last_elem(LVar, LUse, TellFdv, LWNext, LWInst) --> x_in_r(LVar, LUse, TellFdv, LWNext, LWInst), !. x_in_r(LVar, LUse, I, LWNext, LWInst) --> var_check_type(LVar, _, fdv, I), terminal_check(in), range(LVar, LUse, Range, LWInst1, LWInst), { LWInst1 = [fd_tell_range(I, Range)|LWNext] }. range(LVar, LUse, Range, LWNext, LWInst) --> r_add(LVar, LUse, Range, LWInst1, LWInst), r_rest_add(LVar, LUse, Range, LWNext, LWInst1). r_rest_add(LVar, LUse, Range, LWNext, LWInst) --> terminal(:), !, r_add(LVar, LUse, Range1, LWInst1, LWInst), { LWInst1 = [fd_range_union(Range, Range1)|LWInst2] }, r_rest_add(LVar, LUse, Range, LWNext, LWInst2). r_rest_add(_, _, _, LWNext, LWNext) --> []. r_add(LVar, LUse, Range, LWNext, LWInst) --> r_mul(LVar, LUse, Range, LWInst1, LWInst), r_rest_mul(LVar, LUse, Range, LWNext, LWInst1). r_rest_mul(LVar, LUse, Range, LWNext, LWInst) --> terminal(&), !, r_mul(LVar, LUse, Range1, LWInst1, LWInst), { LWInst1 = [fd_range_inter(Range, Range1)|LWInst2] }, r_rest_mul(LVar, LUse, Range, LWNext, LWInst2). r_rest_mul(_, _, _, LWNext, LWNext) --> []. r_mul(LVar, LUse, Range, LWNext, LWInst) --> r_add2(LVar, LUse, Range, LWInst1, LWInst), r_rest_add2(LVar, LUse, Range, LWNext, LWInst1). r_rest_add2(LVar, LUse, Range, LWNext, LWInst) --> terminal(Op), { memberchk(Op, [++, --]) }, !, r_add2(LVar, LUse, Range1, LWInst1, LWInst), { make_inst(Range, Op, Range1, WInst), LWInst1 = [WInst|LWInst2] }, r_rest_add2(LVar, LUse, Range, LWNext, LWInst2). r_rest_add2(_, _, _, LWNext, LWNext) --> []. r_add2(LVar, LUse, Range, LWNext, LWInst) --> r_mul2(LVar, LUse, Range, LWInst1, LWInst), r_rest_mul2(LVar, LUse, Range, LWNext, LWInst1). r_rest_mul2(LVar, LUse, Range, LWNext, LWInst) --> terminal(Op), { memberchk(Op, [**, //, '%%']) }, !, r_mul2(LVar, LUse, Range1, LWInst1, LWInst), { make_inst(Range, Op, Range1, WInst), LWInst1 = [WInst|LWInst2] }, r_rest_mul2(LVar, LUse, Range, LWNext, LWInst2). r_rest_mul2(_, _, _, LWNext, LWNext) --> []. r_mul2(LVar, LUse, Range, LWNext, LWInst) --> r_prim(LVar, LUse, Range, LWInst1, LWInst), r_rest_prim(LVar, LUse, Range, LWNext, LWInst1). r_rest_prim(LVar, LUse, Range, LWNext, LWInst) --> terminal(Op), { memberchk(Op, [+, -, *, /, '%']) }, !, term(LVar, LUse, Term, LWInst1, LWInst), { make_inst(Range, Op, Term, WInst), LWInst1 = [WInst|LWInst2] }, r_rest_prim(LVar, LUse, Range, LWNext, LWInst2). r_rest_prim(_, _, _, LWNext, LWNext) --> []. r_prim(LVar, LUse, Range, LWNext, LWInst) --> terminal(~), !, r_prim(LVar, LUse, Range, LWInst1, LWInst), { LWInst1 = [fd_range_compl(Range)|LWNext] }. r_prim(LVar, LUse, Range, LWNext, LWInst) --> term(LVar, LUse, Term1, LWInst1, LWInst), terminal(..), !, term(LVar, LUse, Term2, LWInst2, LWInst1), { LWInst2 = [fd_range_interval(Range, Term1, Term2)|LWNext] }. r_prim(LVar, LUse, Range, LWNext, LWInst) --> terminal('{'), !, term_lst(LVar, LUse, LTerm, LWInst1, LWInst), terminal_check('}'), { compile_term_lst(LTerm, Range, LWNext, LWInst1) }. r_prim(LVar, LUse, Range, LWNext, LWInst) --> terminal(dom), terminal_check('('), var_check_type(LVar, V, fdv, I), terminal_check(')'), !, { add_marked_var(LUse, V, fdv, I, dom(Range1)) }, { LWInst = [fd_range_copy(Range, Range1)|LWNext] }. r_prim(LVar, LUse, Range, LWNext, LWInst) --> a_var(V), { get_typeof(LVar, V, range, I), !, add_marked_var(LUse, V, range, I, range(Range1)) }, { LWInst = [fd_range_copy(Range, Range1)|LWNext] }. r_prim(LVar, LUse, Range, LWNext, LWInst) --> c_fct(LVar, LUse, Head, LArg, LWInst1, LWInst), !, { length(LArg, N), number_atom(N, NA), atom_concat(arg_, NA, NA1), Args =.. [NA1|LArg], LWInst1 = [fd_range_fct(Head, Range, Args)|LWNext] }. r_prim(LVar, LUse, Range, LWNext, LWInst) --> terminal('('), range(LVar, LUse, Range, LWNext, LWInst), terminal(')'). term_lst(LVar, LUse, [Term|LTerm], LWNext, LWInst) --> term(LVar, LUse, Term, LWInst1, LWInst), !, term_lst_rest(LVar, LUse, LTerm, LWNext, LWInst1). term_lst(_, _, [], LWNext, LWNext) --> []. term_lst_rest(LVar, LUse, [Term|LTerm], LWNext, LWInst) --> terminal(','), !, term(LVar, LUse, Term, LWInst1, LWInst), term_lst_rest(LVar, LUse, LTerm, LWNext, LWInst1). term_lst_rest(_, _, [], LWNext, LWNext) --> []. compile_term_lst(LTerm, Range, LWNext, LWInst) :- LWInst = [fd_range_empty(Range)|LWInst1], compile_term_lst1(LTerm, Range, LWNext, LWInst1). compile_term_lst1([], _, LWNext, LWNext). compile_term_lst1([Term|LTerm], R, LWNext, [fd_range_set_value(R, Term)|LWInst]) :- compile_term_lst1(LTerm, R, LWNext, LWInst). term(LVar, LUse, Term1, LWNext, LWInst) --> t_log(LVar, LUse, Term, LWInst1, LWInst), t_rest_log(LVar, LUse, Term, Term1, LWNext, LWInst1). t_rest_log(LVar, LUse, Term1, Term4, LWNext, LWInst) --> terminal(Op), { memberchk(Op, [&&, '||']) }, !, t_log(LVar, LUse, Term2, LWInst1, LWInst), { make_term(Term1, Op, Term2, Term3) }, t_rest_log(LVar, LUse, Term3, Term4, LWNext, LWInst1). t_rest_log(_, _, Term, Term, LWNext, LWNext) --> []. t_log(LVar, LUse, Term1, LWNext, LWInst) --> t_cmp(LVar, LUse, Term, LWInst1, LWInst), t_rest_cmp(LVar, LUse, Term, Term1, LWNext, LWInst1). t_rest_cmp(LVar, LUse, Term1, Term3, LWNext, LWInst) --> terminal(Op), { memberchk(Op, [=, ==, '!=', \=, <, <=, >, >=]) }, !, t_cmp(LVar, LUse, Term2, LWNext, LWInst), { make_term(Term1, Op, Term2, Term3) }. t_rest_cmp(_, _, Term, Term, LWNext, LWNext) --> []. t_cmp(LVar, LUse, Term1, LWNext, LWInst) --> t_add(LVar, LUse, Term, LWInst1, LWInst), t_rest_add(LVar, LUse, Term, Term1, LWNext, LWInst1). t_rest_add(LVar, LUse, Term1, Term4, LWNext, LWInst) --> terminal(Op), { memberchk(Op, [+, -]) }, !, t_add(LVar, LUse, Term2, LWInst1, LWInst), { make_term(Term1, Op, Term2, Term3) }, t_rest_add(LVar, LUse, Term3, Term4, LWNext, LWInst1). t_rest_add(_, _, Term, Term, LWNext, LWNext) --> []. t_add(LVar, LUse, Term1, LWNext, LWInst) --> t_mul(LVar, LUse, Term, LWInst1, LWInst), t_rest_mul(LVar, LUse, Term, Term1, LWNext, LWInst1). t_rest_mul(LVar, LUse, Term1, Term4, LWNext, LWInst) --> terminal(Op), { memberchk(Op, [*, /<, />, mod]) }, !, t_mul(LVar, LUse, Term2, LWInst1, LWInst), { make_term(Term1, Op, Term2, Term3) }, t_rest_mul(LVar, LUse, Term3, Term4, LWNext, LWInst1). t_rest_mul(_, _, Term, Term, LWNext, LWNext) --> []. t_mul(LVar, LUse, - Term, LWNext, LWInst) --> terminal(-), !, t_mul(LVar, LUse, Term, LWNext, LWInst). t_mul(_, _, Term, LWNext, LWNext) --> int(Term), !. t_mul(_, _, max_integer, LWNext, LWNext) --> terminal(max_integer), !. t_mul(LVar, LUse, Term, LWNext, LWNext) --> terminal(What), { What = min ; What = max ; What = val }, terminal_check('('), var_check_type(LVar, V, fdv, I), terminal_check(')'), !, { atom_concat(What, V, Term), add_marked_var(LUse, V, fdv, I, What) }. t_mul(LVar, LUse, Term, LWNext, LWNext) --> a_var(V), { get_typeof(LVar, V, int, I), !, atom_concat(int, V, Term), add_marked_var(LUse, V, int, I, _) }. t_mul(LVar, LUse, Term, LWNext, LWInst) --> c_fct(LVar, LUse, Head, LArg, LWNext, LWInst), !, { Term =.. [Head|LArg] }. t_mul(LVar, LUse, Term, LWNext, LWInst) --> terminal('('), term(LVar, LUse, Term, LWNext, LWInst), terminal(')'). c_fct(_, _, Head, [], LWNext, LWNext) --> ident(Head), terminal('('), terminal(')'), !. c_fct(LVar, LUse, Head, LArg, LWNext, LWInst) --> ident(Head), terminal('('), parm_lst(LVar, LUse, LArg, LWNext, LWInst), terminal_check(')'), !. parm_lst(LVar, LUse, [Arg|LArg], LWNext, LWInst) --> parm_one(LVar, LUse, Arg, LWInst1, LWInst), !, parm_rest_lst(LVar, LUse, LArg, LWNext, LWInst1). parm_lst(_, _, _, _, _) --> syn_error('C fct parameter'). parm_rest_lst(LVar, LUse, LArg, LWNext, LWInst) --> terminal(','), !, parm_lst(LVar, LUse, LArg, LWNext, LWInst). parm_rest_lst(_, _, [], LWNext, LWNext) --> []. parm_one(LVar, LUse, Arg, LWNext, LWInst) --> term(LVar, LUse, Arg, LWNext, LWInst), ( terminal(..) -> { fail } ; { true } ). parm_one(LVar, LUse, range_arg(Range), LWNext, LWInst) --> range(LVar, LUse, Range, LWNext, LWInst). parm_one(LVar, LUse, Arg, LWNext, LWNext) --> a_var(V), % local var { get_typeof(LVar, V, T, I), atom_concat(T, V, Arg), add_marked_var(LUse, V, T, I, _) }. parm_one(LVar, LUse, &(Arg), LWNext, LWInst) --> terminal(&), % adr of parm_one(LVar, LUse, Arg, LWNext, LWInst). var_check_type(LVar, V, T, I) --> a_var(V), ( { get_typeof(LVar, V, T1, I) } -> ( { T = T1 } -> { true } ; sem_error('variable ~a declared as ~a used as ~a', [V, T1, T]) ) ; sem_error('undeclared variable ~a', [V]) ). var_check_new(LVar, V) --> a_var(V), ( { get_typeof(LVar, V, T, _) } -> sem_error('variable ~a already declared as ~a', [V, T]) ; { true } ). a_var(V) --> ident(V). ident(X) --> terminal(ident(X)). ident_check(X) --> ident(X), !. ident_check(_) --> syn_error(identifier). int(X) --> terminal(X), { integer(X) }. terminal(X) --> [t(X, _, _)]. terminal_check(X) --> terminal(X), !. terminal_check(X) --> syn_error(X). syn_error(Expected) --> [t(T, L, C)], { error('~d: syntax error : ~w expected at "~w" (char:~d)', [L, Expected, T, C]) }. sem_error(Msg, Args) --> [t(_, L, C)], { append([L, Msg|Args], [C], M), error('~d: ~? (char:~d)', M) }. % Utilities add_use_to_dep(LUse, _) :- var(LUse), !. add_use_to_dep([Use|LUse], LDep) :- arg(2, Use, T), ( T \== fdv, T \== l_fdv -> true ; member(Use, LDep) ), !, add_use_to_dep(LUse, LDep). make_term(T1, Op, T2, T3) :- convert(Op, Op1), !, functor(T3, Op1, 2), arg(1, T3, T1), arg(2, T3, T2). convert(/<, 'DivDn'). convert(/>, 'DivUp'). convert(mod, '%'). convert(=, ==). convert(\=, '!='). convert(X, X). make_inst(Arg1, Op, Arg2, WInst) :- inst_name(Op, F), !, functor(WInst, F, 2), arg(1, WInst, Arg1), arg(2, WInst, Arg2). inst_name(++, fd_range_add_range). inst_name(--, fd_range_sub_range). inst_name(**, fd_range_mul_range). inst_name(//, fd_range_div_range). inst_name('%%', fd_range_mod_range). inst_name(+, fd_range_add_value). inst_name(-, fd_range_sub_value). inst_name(*, fd_range_mul_value). inst_name(/, fd_range_div_value). inst_name('%', fd_range_mod_value). get_typeof(LVar, V, T, I) :- memb(v(V, T, I), LVar). memb(X, Y) :- nonvar(Y), Y = [H|T], ( H = X, ! ; memb(X, T) ). add_local_var(LVar, Decl) :- member(Decl, LVar), !. add_marked_var([m(V, T, I, Mark)|_], V, T, I, What) :- !, ( ( T = fdv ; T = l_fdv ), nonvar(What) -> ( What = min, Mark = i(t, _, _, _) ; What = max, Mark = i(_, t, _, _) ; What = dom(R), Mark = i(_, _, t(R), _) ; What = val, Mark = i(_, _, _, t) ), ! ; Mark = What ). add_marked_var([_|LUse], V, T, I, What) :- add_marked_var(LUse, V, T, I, What). close_list([]) :- !. close_list([_|L]) :- close_list(L). ./gprolog-1.3.0/src/Fd2C/Makefile.in0000644004425400513100000000062110547152476015355 0ustar diazlocoGPLC = @GPLC@ GPLCFLAGS = --fast-math OBJS = fd2c@OBJ_SUFFIX@ read_file@OBJ_SUFFIX@ parse@OBJ_SUFFIX@ \ compile@OBJ_SUFFIX@ .SUFFIXES: .SUFFIXES: @OBJ_SUFFIX@ .pl $(SUFFIXES) .pl@OBJ_SUFFIX@: $(GPLC) -c $(GPLCFLAGS) $*.pl fd2c@EXE_SUFFIX@: $(OBJS) $(GPLC) -o fd2c@EXE_SUFFIX@ --no-fd-lib --min-bips $(OBJS) clean: rm -f *@OBJ_SUFFIX@ fd2c@EXE_SUFFIX@ distclean: clean ./gprolog-1.3.0/src/Fd2C/compile.pl0000644004425400513100000004021110547154141015263 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : FD constraint definition file to C code compiler * * File : compile.pl * * Descr.: final compilation and emission * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: compile.pl,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ % to correctly write C expressions :- op(750, yfx, [&&, '||']). :- op(700, xfx, [==, '!=', <=]). :- op(400, yfx, [/<, />, '%']). :- op(300, fy, [&]). emit_code_init(FdFile) :- absolute_file_name(FdFile, FdFile1), format(stream_c, '/* C file generated for ~w */~n~n', [FdFile1]), format(stream_c, '#include "fd_to_c.h"~n', []). emit_user_cstr(uc(Name, AFSize, LHVar, Body)) :- g_assign(name, Name), g_assign(bloc, 1), atom_length(Name, X), X1 is X + 19, format(stream_c, '~n\t/*~*c*/~n', [X1, 45]), format(stream_c, '\t/* User constraint: ~a */~n', [Name]), format(stream_c, '\t/*~*c*/~n', [X1, 45]), e_body(Body, LFctName), format(stream_c, '~n~n\t/* Entry point for ~a */~n', [Name]), format(stream_c, '~nfd_begin_user_constraint(~a', [Name]), e_head_vars(LHVar, '('), format(stream_c, '))~n~n', []), format(stream_c, ' fd_create_a_frame(~d)~n', [AFSize]), e_load_env(LHVar), nl(stream_c), format(stream_c, ' fd_before_add_constraint~n', []), e_call_fct_lst(LFctName), format(stream_c, ' fd_after_add_constraint~n', []), format(stream_c, ' fd_exit_point~n', []), format(stream_c, ' fd_return~n', []), format(stream_c, '~nfd_end_user_constraint~n~n', []). e_head_vars([], _). e_head_vars([v(V, _, _)|LHVar], Car) :- format(stream_c, '~aFdArg(~a)', [Car, V]), e_head_vars(LHVar, ','). e_load_env([]). e_load_env([v(V, T, I)|LHVar]) :- format(stream_c, ' fd_~a_in_a_frame(~a,~d)~n', [T, V, I]), e_load_env(LHVar). e_call_fct_lst([]). e_call_fct_lst([FctName|LFctName]) :- e_call_internal(FctName, f), e_call_fct_lst(LFctName). e_call_internal(FctName, CallerHasCFrame) :- ( sub_atom(FctName, _, _, _, '_switch_') -> ( CallerHasCFrame = t -> Inst = fd_call_internal_and_test_switch ; Inst = fd_call_internal_and_test_switch_simple ) ; Inst = fd_call_internal ), format(stream_c, ' ~a(~a)~n', [Inst, FctName]). e_body(by(LBloc, WaitSwt), LFctName1) :- e_bloc_lst(LBloc, LFctName), ( WaitSwt = ws(LUse, LCase) -> e_wait_swt(LUse, LCase, FctName1), e_fct_install_triggers(-1, LUse, -1, always, FctName1, FctName), append(LFctName, [FctName], LFctName1) ; LFctName1 = LFctName ). e_wait_swt(LUse, LCase, FctName) :- e_case_lst(LCase, 1, LFctName0), internal_fct_name(switch, 1, FctName), e_bloc_load_use(LUse, LCVarUsed, LWInst1, LWInst), e_test_case_lst(LCase, LFctName0, LWInst1), alloc_and_emit_fct_code(FctName, LCVarUsed, LWInst, t). e_case_lst([], _, []). e_case_lst([ca(_, LBNoStop, LBloc)|LCase], I, [FctName|LFctName]) :- e_bloc_lst(LBloc, LFctName0), ( LFctName0 = [FctName], LBNoStop = [] -> true ; e_case_group(LFctName0, LBNoStop, I, FctName) ), I1 is I + 1, e_case_lst(LCase, I1, LFctName). e_case_group(LFctName, LBNoStop, I, FctName) :- internal_fct_name(case_group, I, FctName), format(stream_c, '~n~n\t/* Group of case #~d */~n', [I]), format(stream_c, '~nfd_begin_internal(~a)~n~n', [FctName]), e_stop_lst(LBNoStop), e_call_fct_lst(LFctName), format(stream_c, ' fd_exit_point~n', []), format(stream_c, ' fd_return~n', []), format(stream_c, '~nfd_end_internal~n', []). e_stop_lst([]). e_stop_lst([BNoStop|LBNoStop]) :- format(stream_c, ' fd_stop_constraint(~d)~n', [BNoStop]), e_stop_lst(LBNoStop). e_test_case_lst([], [], []). e_test_case_lst([ca(co(Term, LWNext, LWInst), _, _)|LCase], [FctName|LFctName], LWInst) :- LWNext = [fd_test_switch_condition(Term, FctName)|LWInst1], e_test_case_lst(LCase, LFctName, LWInst1). e_bloc_lst([], []). e_bloc_lst([Bloc|LBloc], [FctName|LFctName]) :- g_read(bloc, BlNo), format(stream_c, '~n~n\t/* Bloc #~d */~n', [BlNo]), e_bloc_one(Bloc, FctName), BlNo1 is BlNo + 1, g_assign(bloc, BlNo1), e_bloc_lst(LBloc, LFctName). e_bloc_one(bl(BNo, LDep, LUse, LWInst, TellFdv, Always), FctName1) :- e_bloc(LUse, LWInst, FctName), e_fct_install_triggers(BNo, LDep, TellFdv, Always, FctName, FctName1). e_bloc(LUse, LWInst1, FctName) :- g_read(bloc, BlNo), BlNo1 is BlNo + 1, g_assign(bloc, BlNo1), internal_fct_name(bloc, BlNo, FctName), e_bloc_load_use(LUse, LCVarUsed, LWInst1, LWInst), close_list(LCVarUsed), simplif_code(LWInst, LWSimpl), alloc_and_emit_fct_code(FctName, LCVarUsed, LWSimpl, t). e_fct_install_triggers(BNo, LDep, TellFdv, Always, FctName, FctName1) :- e_has_dependencies(LDep), !, ( Always = always -> Optim = 0 ; Optim = 1 ), atom_concat(FctName, '_inst', FctName1), format(stream_c, '~nfd_begin_internal(~a)~n~n', [FctName1]), format(stream_c, ' fd_local_cf_pointer~n', []), format(stream_c, ' fd_create_c_frame(~a,~d,~d)~n', [FctName, TellFdv, Optim]), ( BNo = -1 -> true ; format(stream_c, ' fd_cf_in_a_frame(~d)~n', [BNo]) ), e_install_trig(LDep), e_call_internal(FctName, t), format(stream_c, ' fd_exit_point~n', []), format(stream_c, ' fd_return~n', []), format(stream_c, '~nfd_end_internal~n', []). e_fct_install_triggers(_, _, _, _, FctName, FctName). e_install_trig([]). e_install_trig([m(_, fdv, I, i(Min, Max, Dom, Val))|LDep]) :- e_compute_dep_chain(Min, Max, Dom, Val, Chain), !, format(stream_c, ' fd_add_dependency(~d,~a)~n', [I, Chain]), e_install_trig(LDep). e_install_trig([m(_, l_fdv, I, i(Min, Max, Dom, Val))|LDep]) :- e_compute_dep_chain(Min, Max, Dom, Val, Chain), !, format(stream_c, ' fd_add_list_dependency(~d,~a)~n', [I, Chain]), e_install_trig(LDep). e_install_trig([_|LDep]) :- e_install_trig(LDep). e_has_dependencies([m(_, T, _, i(Min, Max, Dom, Val))|_]) :- ( T = fdv ; T = l_fdv ), e_compute_dep_chain(Min, Max, Dom, Val, _), !. e_has_dependencies([_|LDep]) :- e_has_dependencies(LDep). e_bloc_load_use([], _, LWNext, LWNext) :- !. e_bloc_load_use([m(V, T, I, Mark)|LUse], LCVarUsed, LWNext, LWInst) :- e_bloc_load_one(T, V, I, Mark, LCVarUsed, LWInst1, LWInst), e_bloc_load_use(LUse, LCVarUsed, LWNext, LWInst1). e_bloc_load_one(fdv, V, I, Mark, LCVarUsed, LWNext, LWInst) :- !, Mark = i(Min, Max, Dom, Val), e_compute_dep_chain(Min, Max, Dom, Val, Chain), e_bloc_load_fdv(Chain, Min, Max, Dom, Val, V, I, LCVarUsed, LWNext, LWInst). e_bloc_load_one(range, _, I, range(R), _, LWNext, LWInst) :- !, ( nonvar(I) -> LWInst = [fd_load_range(R, I)|LWNext] ; LWInst = LWNext ). e_bloc_load_one(T, V, I, _, LCVarUsed, LWNext, [WInst|LWNext]) :- nonvar(I), !, atom_concat(fd_load_, T, F), use_c_var(T, V, LCVarUsed, A), WInst =.. [F, A, I]. e_bloc_load_one(T, V, _, _, LCVarUsed, LWNext, LWNext) :- use_c_var(T, V, LCVarUsed, _). use_c_var(T, V, LCVarUsed, A) :- atom_concat(T, V, A), memberchk(cv(T, A), LCVarUsed). e_bloc_load_fdv(val, Min, Max, Dom, _, V, I, LCVarUsed, LWNext, LWInst) :- use_c_var(val, V, LCVarUsed, AVal), LWInst = [fd_load_val(AVal, I)|LWInst1], ( nonvar(Dom) -> Dom = t(R), LWInst1 = [fd_range_interval(R, AVal, AVal)|LWInst2] ; LWInst1 = LWInst2 ), ( nonvar(Min) -> use_c_var(min, V, LCVarUsed, AMin), LWInst2 = [fd_value_copy(AMin, AVal)|LWInst3] ; LWInst2 = LWInst3 ), ( nonvar(Max) -> use_c_var(max, V, LCVarUsed, AMax), LWInst3 = [fd_value_copy(AMax, AVal)|LWNext] ; LWInst3 = LWNext ). e_bloc_load_fdv(dom, Min, Max, t(R), _, V, I, LCVarUsed, LWNext, LWInst) :- LWInst = [fd_load_dom(R, I)|LWInst1], ( nonvar(Min) -> use_c_var(min, V, LCVarUsed, AMin), LWInst1 = [fd_min_of_range(AMin, R)|LWInst2] ; LWInst1 = LWInst2 ), ( nonvar(Max) -> use_c_var(max, V, LCVarUsed, AMax), LWInst2 = [fd_max_of_range(AMax, R)|LWNext] ; LWInst2 = LWNext ). e_bloc_load_fdv(min_max, _, _, _, _, V, I, LCVarUsed, LWNext, LWInst) :- use_c_var(min, V, LCVarUsed, AMin), use_c_var(max, V, LCVarUsed, AMax), LWInst = [fd_load_min_max(AMin, AMax, I)|LWNext]. e_bloc_load_fdv(min, _, _, _, _, V, I, LCVarUsed, LWNext, LWInst) :- use_c_var(min, V, LCVarUsed, AMin), LWInst = [fd_load_min(AMin, I)|LWNext]. e_bloc_load_fdv(max, _, _, _, _, V, I, LCVarUsed, LWNext, LWInst) :- use_c_var(max, V, LCVarUsed, AMax), LWInst = [fd_load_max(AMax, I)|LWNext]. e_compute_dep_chain(_, _, _, Val, val) :- nonvar(Val), % val used !. e_compute_dep_chain(_, _, Dom, _, dom) :- nonvar(Dom), % dom used !. e_compute_dep_chain(Min, Max, _, _, min) :- nonvar(Min), var(Max), % only min used !. e_compute_dep_chain(Min, Max, _, _, max) :- var(Min), nonvar(Max), % only max used !. e_compute_dep_chain(Min, Max, _, _, min_max) :- % min and max used nonvar(Min), nonvar(Max). simplif_code([], []). simplif_code([fd_range_compl(R1), fd_range_compl(R2)|LWInst], LWSimpl) :- R1 == R2, !, simplif_code(LWInst, LWSimpl). simplif_code([fd_range_interval(R1, T1, T2), fd_tell_range(I, R2)|LWInst], LWSimpl) :- R1 == R2, !, simplif_code([fd_tell_interval(I, T1, T2)|LWInst], LWSimpl). simplif_code([fd_tell_interval(I, T1, T2)|LWInst], LWSimpl) :- T1 == T2, !, simplif_code([fd_tell_value(I, T1)|LWInst], LWSimpl). simplif_code([fd_range_full(R1), fd_range_reset_value(R2, T), fd_tell_range(I, R3)|LWInst], LWSimpl) :- R1 == R2, R1 == R3, !, simplif_code([fd_tell_not_value(I, T)|LWInst], LWSimpl). simplif_code([fd_range_empty(R1)|LWInst], LWSimpl1) :- simpl_get_lst(LWInst, R1, LWReset, LWInst1), simplif_code(LWInst1, LWInst2), ( LWInst2 = [fd_range_compl(R2)|LWInst3], % compl of list R1 == R2, append([fd_range_full(R1)|LWReset], LWInst3, LWSimpl) ; LWReset = [WReset], % only one element arg(2, WReset, Term), LWSimpl = [fd_range_interval(R1, Term, Term)|LWInst2] ), !, simplif_code(LWSimpl, LWSimpl1). simplif_code([fd_range_interval(R1, T1, T2), fd_range_union(R2, R3)|LWInst], LWSimpl1) :- T1 == T2, % R union {value} = set value in R R1 == R3, LWSimpl = [fd_range_set_value(R2, T1)|LWInst], simplif_code(LWSimpl, LWSimpl1). simplif_code([WInst|LWInst], [WInst|LWInst1]) :- simplif_code(LWInst, LWInst1). simpl_get_lst([fd_range_set_value(R2, Term)|LWInst], R1, [WReset|LWReset], LWInst1) :- R1 == R2, !, functor(WReset, fd_range_reset_value, 2), arg(1, WReset, R2), arg(2, WReset, Term), simpl_get_lst(LWInst, R1, LWReset, LWInst1). simpl_get_lst(LWInst, _, [], LWInst). internal_fct_name(Kind, No, FctName) :- g_read(name, Name), number_atom(No, ANo), atom_concat(Name, '_', X1), atom_concat(X1, Kind, X2), atom_concat(X2, '_', X3), atom_concat(X3, ANo, FctName). alloc_and_emit_fct_code(FctName, LCVarUsed, LWInst, LocalFdvAdr) :- format(stream_c, '~nfd_begin_internal(~a)~n~n', [FctName]), allocate_registers(LWInst, MaxUsedReg), ( LocalFdvAdr = t -> format(stream_c, ' fd_local_fdv_adr~n', []) ; true ), emit_c_vars_lst(LCVarUsed), emit_used_regs_lst(MaxUsedReg), nl(stream_c), ( MaxUsedReg >= 0 -> format(stream_c, ' fd_allocate~n', []), Alloc = t ; Alloc = f ), emit_inst_lst(LWInst, Alloc), format(stream_c, '~nfd_end_internal~n', []). emit_c_vars_lst([]). emit_c_vars_lst([cv(T, A)|LCVarUsed]) :- ( ( T = int ; T = val ; T = min ; T = max ) -> I1 = value ; I1 = T ), format(stream_c, ' fd_local_~a_var(~a)~n', [I1, A]), emit_c_vars_lst(LCVarUsed). emit_used_regs_lst(MaxUsedReg) :- for(I, 0, MaxUsedReg), format(stream_c, ' fd_local_range_var(~d)~n', [I]), fail. emit_used_regs_lst(_). emit_inst_lst([], Alloc) :- format(stream_c, ' fd_exit_point~n', []), ( Alloc = t -> format(stream_c, ' fd_deallocate~n', []) ; true ), format(stream_c, ' fd_return~n', []). emit_inst_lst([WInst|LWInst], Alloc) :- dummy_instruction(WInst), !, emit_inst_lst(LWInst, Alloc). emit_inst_lst([WInst|LWInst], t) :- functor(WInst, F, _), ( sub_atom(F, 0, _, _, fd_tell_) ; sub_atom(F, 0, _, _, fd_check_fct) ), !, format(stream_c, ' fd_deallocate~n', []), format(stream_c, ' ~w~n', [WInst]), emit_inst_lst(LWInst, already). emit_inst_lst([WInst|LWInst], Alloc) :- Alloc \== f, functor(WInst, F, _), sub_atom(F, 0, _, _, fd_forall_end), !, format(stream_c, ' fd_allocate~n', []), format(stream_c, ' ~w~n', [WInst]), emit_inst_lst(LWInst, f). emit_inst_lst([WInst|LWInst], Alloc) :- format(stream_c, ' ~w~n', [WInst]), emit_inst_lst(LWInst, Alloc). :- include('../Pl2Wam/reg_alloc.pl'). % alias stopping instructions alias_stop_instruction(_) :- fail. % instruction codification codification(WamInst, LCode) :- codif(WamInst, LCode), !. % FD instructions using Ranges codif(fd_tell_range(_, RR), [r(RR)]). codif(fd_load_range(RR, _), [w(RR)]). codif(fd_load_dom(RR, _), [w(RR)]). codif(fd_min_of_range(_, RR), [r(RR)]). codif(fd_max_of_range(_, RR), [r(RR)]). codif(fd_range_interval(RR, _, _), [w(RR)]). codif(fd_range_union(RR, RR1), [r(RR), r(RR1), w(RR)]). codif(fd_range_inter(RR, RR1), [r(RR), r(RR1), w(RR)]). codif(fd_range_compl(RR), [r(RR), w(RR)]). codif(fd_range_empty(RR), [w(RR)]). codif(fd_range_set_value(RR, _), [r(RR), w(RR)]). codif(fd_range_full(RR), [w(RR)]). codif(fd_range_reset_value(RR, _), [r(RR), w(RR)]). codif(fd_range_add_range(RR, RR1), [r(RR), r(RR1), w(RR)]). codif(fd_range_sub_range(RR, RR1), [r(RR), r(RR1), w(RR)]). codif(fd_range_mul_range(RR, RR1), [r(RR), r(RR1), w(RR)]). codif(fd_range_div_range(RR, RR1), [r(RR), r(RR1), w(RR)]). codif(fd_range_mod_range(RR, RR1), [r(RR), r(RR1), w(RR)]). codif(fd_range_add_value(RR, _), [r(RR), w(RR)]). codif(fd_range_sub_value(RR, _), [r(RR), w(RR)]). codif(fd_range_mul_value(RR, _), [r(RR), w(RR)]). codif(fd_range_div_value(RR, _), [r(RR), w(RR)]). codif(fd_range_mod_value(RR, _), [r(RR), w(RR)]). codif(fd_range_copy(RR, RR1), [c(RR1, RR)]). codif(fd_range_fct(_, RR, FdArg), [w(RR)|LCode]) :- FdArg =.. [_|FdLstArg], create_r_code_lst(FdLstArg, [], LCode). codif(X, LCode) :- create_r_code_lst(X, [], LCode). create_r_code_lst(range_arg(RR), LNext, [r(RR)|LNext]) :- !. create_r_code_lst(T, LNext, LNext) :- atomic(T), !. create_r_code_lst(T, LNext, LCode) :- compound(T), !, functor(T, _, A), create_r_code_lst1(0, A, T, LNext, LCode). create_r_code_lst1(I, A, T, LNext, LCode) :- ( I = A -> LCode = LNext ; I1 is I + 1, arg(I1, T, T1), create_r_code_lst(T1, LCode1, LCode), create_r_code_lst1(I1, A, T, LNext, LCode1) ). % dummy instructions dummy_instruction(fd_range_copy(R, R)). ./gprolog-1.3.0/src/PORTING0000644004425400513100000001057610537003134013632 0ustar diazlocoHere are some help to port GNU Prolog. 1) I suppose you are in ROOT_DIR/src: . ./SETVARS (or source CSHSETVARS if you are under csh) ./configure --with-c-flags=debug --with-c-flags=debug is a "good" option to allow you to use the C debugger, you can always use this until a final point is reached. This allows you to execute the locally compiled version (see file DEVELOPMENT for more info). 2) Modify the following files to create an entry M__ configure.in (+CFLAGS and others) EnginePl/gp_config.h.in (M__) EnginePl/machine.h (+regs) eventually look at EnginePl/arch_dep.h 3) you must be able to compile the following: % cd EnginePl ; make engine.o engine1.o 4) Create the translation file (in the Ma2Asm/ directory). GNU Prolog compiles a Prolog source to a low-level machine independent language called mini-assembly. You have to write a translator for the target machine (mini-asm to assembly). You can use an existing translation file as example and/or look at the assembly produced by gcc. For that you can do: % cd Ma2Asm/FromC % make This will create a file asm_inst.s from asm_inst.c. The study of both files can help you to write the translater (in Ma2Asm/). You can check your translation using the chkma program (in Ma2Asm/): % make chkma % ./chkma You should obtain something like: reg_bank=&X(0):0x8052a00 B:0x8053ac0 E:0x8054ac0 &Y(0):0x8054ab0 stack:0x8053ac0 test 1: c_code intializer... test 1 OK test 2: long local/global ... test 2 OK test 3: pl_jump/pl_ret... test 3 OK test 4: pl_call/pl_ret/pl_fail... test 4 OK test 5: prep_cp/here_cp... test 5 OK test 6: jump/c_ret... test 6 OK test 7: call_c(void)... test 7 OK test 8: move X(i) to Y(j)... test 8 OK test 9: move Y(i) to X(j)... test 9 OK test 10: call_c(int)... test 10 OK test 11: call_c(double)... test 11 OK test 12: call_c(string)... test 12 OK test 13: call_c(mem,&label,mem(...),&mem(...))... test 13 OK test 14: call_c(X())... test 14 OK test 15: call_c(Y())... test 15 OK test 16: call_c(FL())... test 16 OK test 17: call_c(FD())... test 17 OK test 18: call_c(lot_of_args)... test 18 OK test 19: call_c()+jump_ret... test 19 OK test 20: call_c()+fail_ret... test 20 OK test 21: call_c()+move_ret mem... test 21 OK test 22: call_c()+move_ret X()... test 22 OK test 23: call_c()+move_ret Y()... test 23 OK test 24: call_c()+move_ret FL()... test 24 OK test 25: call_c()+move_ret FD()... test 25 OK test 26: call_c()+switch_ret... test 26 OK MA checks suceeded (you can use make clean-chkma to erase chkma objects/execs) All tests must be OK else you have an error in the corresponding tested point. At this point you should discover which part is not OK. 5) Check that ObjChain works: ObjChain is a way to find at run-time which Prolog modules are linked (to then initialize them). Normally this should be OK but you can test it. % cd EnginePl % make test_oc % ./test_oc This will find 5 modules and display somthing like: starting... object found &name:0x804c200 object found &name:0x804c1e0 object found &name:0x804c1c0 object found &name:0x804c1a0 object found &name:0x804c180 finished - OK ! The important point to check is if 5 modules are found and peferably in reverse order. If not you have to debug the file EnginePl/obj_chain.c. Since 1.3.0 we use gcc __atribute__((constructor)). (you can use make clean-test_oc to erase test objects/execs) 6) When this is OK (i.e. a Prolog program can be compiled and executed) you will have to check if the stack overflow detection is ok. See file EnginePl/machine.c (function SIGSEGV_Handler). The important point here is to obtain the address which caused the SIGSEGV (the rest of the function detects which stack is involved from that addresss). look at the files EnginePl/*_SIGSEGV.C other things to do when porting: ma2asm (use chkma) (call_c needs at least 7 args) test with all combinations of mapped registers machine.c: SIGSEGV_Handler engine1.c: what to do #ifndef MAP_REG_BANK things to test: linedit floats (e.g. write(1.23),...) statistics os stuffs random ctrl/c (prg TEST_CTRLC.c) 7) Once all compile fine and pl2wam and gprolog executables are created you can check the bootstraping by: % cd Pl2Wam % make check Bootstrap Prolog Compiler OK the same for Built-ins; % cd ../BipsPl % make check Bootstrap Prolog Bips OK ./gprolog-1.3.0/src/Linedit/0000777004425400513100000000000010547442376014170 5ustar diazloco./gprolog-1.3.0/src/Linedit/linedit.h0000644004425400513100000001147110547154142015760 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : line-edit library * * File : linedit.h * * Descr.: line editor - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: linedit.h,v 1.12 2007/01/04 10:35:14 diaz Exp $ */ /* Windows uses 2 codepages (which give the meaning of 0x80..0xFF chars): * "OEM codepages" for console programs and "ANSI codepages" for GUI programs. * For instance 'é' (\'e) is returned as 130 in OEM (with codepage 850) and * as 233 in ANSI. The problem is that isalpha(130) is false... * I use 2 Win32 functions: OemToChar() (when reading) and CharToOem() * (when writing)... */ #if 1 #define WIN32_CONVERT_OEM_ASCII #endif /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /* overwritten if needed to customize linedit */ void (*le_hook_start) (); /* is it mandatory to define a hook ? */ void (*le_hook_put_char) (); /* mandatory */ int (*le_hook_get_char0) (); /* mandatory */ void (*le_hook_emit_beep) (); void (*le_hook_ins_mode) (); void (*le_hook_screen_size) (); /* mandatory */ int (*le_hook_kbd_is_not_empty) (); /* mandatory */ void (*le_hook_backd) (); void (*le_hook_forwd) (); void (*le_hook_displ) (); void (*le_hook_displ_str) (); void (*le_hook_erase) (); /* functions not used by linedit itself */ void (*le_hook_set_line_buffering) (); int (*le_hook_get_line_buffering) (); void (*le_hook_flush) (); int (*le_hook_confirm_box) (); void (*le_hook_message_box) (); void (*le_hook_exit_process) (); #ifdef LE_DEFINE_HOOK_MACROS #define EMIT_BEEP ((*le_hook_emit_beep)()) #define PUT_CHAR(c) ((*le_hook_put_char)(c)) #define GET_CHAR0 ((*le_hook_get_char0)()) #define INS_MODE(ins_mode) ((*le_hook_ins_mode)(ins_mode)) #define SCREEN_SIZE(r, c) ((*le_hook_screen_size)(r, c)) #define KBD_IS_NOT_EMPTY ((*le_hook_kbd_is_not_empty)()) #define BACKD(n) ((*le_hook_backd)(n)) #define FORWD(n, str) ((*le_hook_forwd)(n, str)) #define DISPL(n, str) ((*le_hook_displ)(n, str)) #define DISPL_STR(str) ((*le_hook_displ_str)(str)) #define ERASE(n) ((*le_hook_erase)(n)) #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ int LE_Initialize(void); char *LE_Gets(char *str); char *LE_FGets(char *str, int size, char *prompt, int display_prompt); long LE_Get_Ctrl_C_Return_Value(void); #define LE_Interrupted_By_Ctrl_C(r) ((long) r == -2L) int LE_Get_Prompt_Length(void); int LE_Get_Current_Position(void); void LE_Get_Current_Word(char *word); char *LE_Get_Separators(void); char *LE_Set_Separators(char *sep_str); char *LE_Compl_Add_Word(char *word, int word_length); char *LE_Compl_Del_Word(char *word); char *LE_Compl_Init_Match(char *prefix, int *nb_match, int *max_lg); char *LE_Compl_Find_Match(int *is_last); int LE_Get_Key(int echo, int catch_ctrl_c); int LE_Printf(char *format, ...); #ifdef TERMINAL_FILE int (*le_initialize)() = LE_Initialize; #else int (*le_initialize)(); #endif ./gprolog-1.3.0/src/Linedit/ctrl_c.h0000644004425400513100000000447010547154142015577 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : line-edit library * * File : ctrl_c.c * * Descr.: Ctrl+C management - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: ctrl_c.h,v 1.9 2007/01/04 10:35:14 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Install_Ctrl_C_Handler(long (*handler) (int)); long Emit_Ctrl_C(void); ./gprolog-1.3.0/src/Linedit/test_linedit.c0000644004425400513100000001401710547154142017011 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : line-edit library * * File : test_linedit.c * * Descr.: test file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: test_linedit.c,v 1.15 2007/01/04 10:35:14 diaz Exp $ */ #include #include #include #include #include #include "../EnginePl/gp_config.h" #if defined(__unix__) || defined(__CYGWIN__) #include #else #include #include #endif #include "ctrl_c.h" #include "linedit.h" #define printf LE_Printf /*---------------------------------* * Constants * *---------------------------------*/ #define MAX_SIZE 500000 /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * CTRL_C_MANAGER * * * *-------------------------------------------------------------------------*/ long Ctrl_C_Manager(int from_callback) { int c; char prefix[100]; char *str; int nb, max_lg, is_last; printf("\nCATCHING CTRL+C prompt length: %d current pos: %d\n", LE_Get_Prompt_Length(), LE_Get_Current_Position()); printf("e: exit, c: continue, C: completions, w: current word: "); fflush(stdout); c = LE_Get_Key(1, 1); printf("\n"); switch (c) { case 'e': exit(0); case 'w': LE_Get_Current_Word(prefix); printf("current word=<%s>\n", prefix); break; case 'C': printf("Enter a prefix:"); LE_Gets(prefix); if ((str = LE_Compl_Init_Match(prefix, &nb, &max_lg)) == NULL) printf("no matching\n"); else { printf("common=<%s> nb=%d max_lg=%d\n", str, nb, max_lg); while ((str = LE_Compl_Find_Match(&is_last)) != NULL) printf("matching: <%s>\n", str); } break; } return 0; } /*-------------------------------------------------------------------------* * SET_TEST_LOCALE * * * *-------------------------------------------------------------------------*/ void Set_Test_Locale(void) { time_t ltime; struct tm *thetime; unsigned char str[100]; setlocale(LC_ALL, ""); time(<ime); thetime = gmtime(<ime); strftime(str, 100, "%d (%A) %m (%B) %Y", thetime); printf("Date in current locale with strftime: %s\n", str); } /*-------------------------------------------------------------------------* * MAIN * * * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { static char line[MAX_SIZE]; char *p; char sep[100]; int ret_val; int tempo = 0; #if defined(_WIN32) && !defined(__CYGWIN__) setbuf(stdout, NULL); setbuf(stderr, NULL); #endif #if 1 Install_Ctrl_C_Handler(Ctrl_C_Manager); #endif Set_Test_Locale(); if (argc > 1) tempo = atoi(argv[1]); sep[0] = '\n'; strcpy(sep + 1, LE_Get_Separators()); printf("enter lines (EOF to finish)\n"); #if 0 { /* test space overflow in WIN32 GUI console */ int i; char buf[256]; for (i = 0; i < 280; i++) { sprintf(buf, "line %3d tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt\n", i); printf(buf); } } #endif for (;;) { #ifdef __unix__ if (tempo) { printf("tempo %d secs to allow you to buffer some chars:\n"); sleep(tempo); } #endif #if 0 printf("enter a line:"); if (LE_Gets(line) == NULL) #else if (LE_FGets(line, MAX_SIZE, "enter a line:", 1) == NULL) #endif break; printf("Line:(%s) len:%d\n", line, strlen(line)); for (p = line; (p = strtok(p, sep)) != NULL; p = NULL) { printf("adding word (%s) for completion\n", p); LE_Compl_Add_Word(strdup(p), strlen(p)); } } printf("End of testing\n"); ret_val = 12; if (le_hook_exit_process) (*le_hook_exit_process) (ret_val); return ret_val; } ./gprolog-1.3.0/src/Linedit/ctrl_c.c0000644004425400513100000001260310547154141015566 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : line-edit library * * File : ctrl_c.c * * Descr.: Ctrl+C management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: ctrl_c.c,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ #include "../EnginePl/gp_config.h" #include #include #if defined(__unix__) || defined(__CYGWIN__) #include #endif #if defined(_WIN32) && !defined(__CYGWIN__) #define WIN32_CONSOLE_CTRL_HANDLER #endif #ifdef WIN32_CONSOLE_CTRL_HANDLER #include #endif /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static long (*ctrl_c_handler) (); static int from_callback; static long ret_val; static int inside_ctrl_c; #ifdef WIN32_CONSOLE_CTRL_HANDLER static HANDLE event_ctrl_handler_exited; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * WRAPPER_HANDLER * * * *-------------------------------------------------------------------------*/ #ifdef WIN32_CONSOLE_CTRL_HANDLER static BOOL WINAPI Wrapper_Handler(DWORD sig) #else static void Wrapper_Handler(int sig) #endif { #if defined(__unix__) || defined(__CYGWIN__) sigset_t set; #endif int from_callback1; #if defined(__unix__) || defined(__CYGWIN__) sigemptyset(&set); sigaddset(&set, sig); sigprocmask(SIG_UNBLOCK, &set, NULL); #elif !defined(WIN32_CONSOLE_CTRL_HANDLER) signal(sig, Wrapper_Handler); #endif if (inside_ctrl_c) { printf("Already in a Ctrl+C handler - ignored\n"); fflush(stdout); ret_val = 0; } else { inside_ctrl_c = from_callback; /* only 1 if from_callback */ from_callback1 = from_callback; from_callback = 0; ret_val = (*ctrl_c_handler) (from_callback1); } inside_ctrl_c = 0; #ifdef WIN32_CONSOLE_CTRL_HANDLER SetEvent(event_ctrl_handler_exited); return TRUE; #endif } /*-------------------------------------------------------------------------* * EMIT_CTRL_C * * * *-------------------------------------------------------------------------*/ long Emit_Ctrl_C(void) { from_callback = 1; #if 1 #if defined(__unix__) || defined(__CYGWIN__) kill(getpid(), SIGINT); #elif defined(_WIN32) && !defined(WIN32_CONSOLE_CTRL_HANDLER) raise(SIGINT); #elif defined(WIN32_CONSOLE_CTRL_HANDLER) if (!inside_ctrl_c) { GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); WaitForSingleObject(event_ctrl_handler_exited, INFINITE); } #else printf("don't know how to send a Ctrl+C\n"); #endif return ret_val; #else /* pb: CTRL+C under linedit does not generate a signal * i.e. problem under gdb to debug */ return (*ctrl_c_handler)(1); #endif } /*-------------------------------------------------------------------------* * INSTALL_CTRL_C_HANDLER * * * *-------------------------------------------------------------------------*/ void Install_Ctrl_C_Handler(long (*handler) (int)) { ctrl_c_handler = handler; #ifdef WIN32_CONSOLE_CTRL_HANDLER event_ctrl_handler_exited = CreateEvent(NULL, FALSE, FALSE, NULL); SetConsoleCtrlHandler(Wrapper_Handler, TRUE); #else signal(SIGINT, Wrapper_Handler); #endif } ./gprolog-1.3.0/src/Linedit/Makefile.in0000644004425400513100000000266610547152476016242 0ustar diazlocoLIB_LINEDIT = @LIB_LINEDIT@ CC = @CC@ @CFLAGS_MACHINE@ CFLAGS = @CFLAGS@ LDLIBS = @LDLIBS@ AR_RC = @AR_RC@ RANLIB = @RANLIB@ LIBNAME = $(LIB_LINEDIT) OBJLIB = linedit@OBJ_SUFFIX@ terminal@OBJ_SUFFIX@ ctrl_c@OBJ_SUFFIX@ .SUFFIXES: .SUFFIXES: @OBJ_SUFFIX@ .c $(SUFFIXES) .c@OBJ_SUFFIX@: $(CC) -c $(CFLAGS) $*.c $(LIBNAME): $(OBJLIB) rm -f $(LIBNAME) $(AR_RC)@AR_SEP@$(LIBNAME) $(OBJLIB) $(RANLIB) $(LIBNAME) clean: rm -f *@OBJ_SUFFIX@ $(LIBNAME) distclean: clean rm -f test_linedit@EXE_SUFFIX@ test_noecho@EXE_SUFFIX@ # test files # under win32: use make W=Y test_linedit.exe (or test_noecho.exe) to # link the GUI console # You can also use gplc test_linedit.c and gplc --gui-console test_linedit.c # even linking the GUI console you can set the env var NO_LE_HOOK to avoid it W32LNK=..\W32GUICons\w32gc_interf@OBJ_SUFFIX@ # /link /subsystem:windows (remove the console, obsolete now) test_linedit@EXE_SUFFIX@: test_linedit@OBJ_SUFFIX@ $(LIBNAME) if [ "$$W" != "Y" ]; then W=''; else W="$(W32LNK)"; fi; \ $(CC) @CC_EXE_NAME_OPT@test_linedit@EXE_SUFFIX@ test_linedit@OBJ_SUFFIX@ $(LIBNAME) $(LDLIBS) $$W test_noecho@EXE_SUFFIX@: test_noecho@OBJ_SUFFIX@ $(LIBNAME) if [ "$$W" != "Y" ]; then W=''; else W="$(W32LNK)"; fi; \ $(CC) @CC_EXE_NAME_OPT@test_noecho@EXE_SUFFIX@ test_noecho@OBJ_SUFFIX@ $(LIBNAME) $(LDLIBS) $$W clean-test: rm -f test*@OBJ_SUFFIX@ test_linedit@EXE_SUFFIX@ test_noecho@EXE_SUFFIX@ ./gprolog-1.3.0/src/Linedit/linedit.c0000644004425400513100000010245410547154142015755 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : line-edit library * * File : linedit.c * * Descr.: line editor * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: linedit.c,v 1.14 2007/01/04 10:35:14 diaz Exp $ */ #include #include #include #include #include #include #include #include #include "../EnginePl/gp_config.h" #define LE_DEFINE_HOOK_MACROS #include "terminal.h" #include "ctrl_c.h" #include "linedit.h" #if defined(__unix__) || defined(__CYGWIN__) #include #include #elif defined(_WIN32) #include #endif #if 1 #define TREAT_BUFFERED_CHARS /* treat buffered chars at start (X paste) */ #endif #if 1 #define NO_DUP_IN_HISTORY /* do not put in history line == the last */ #endif #if 1 #define IGNORE_QUOTED_PART /* ingore quoted item in bracket matching */ #endif #if 0 #define NO_USE_SELECT /* no use select(2) for temporisation */ #endif /*---------------------------------* * Constants * *---------------------------------*/ #define LINEDIT_VERSION "2.5" #define MAX_HISTORY_LINES 64 #define MAX_SEPARATORS 256 #define NB_TAB_BEFORE_LIST 1 #define DEFAULT_SEPARATORS " ,;:-'\"!@$#^&()-+*/\\[]|<=>`~{}" #define NB_MATCH_LINES_BEFORE_ASK 20 #define OPEN_BRACKET "([{" #define CLOSE_BRACKET ")]}" #ifdef NO_USE_SELECT #define BRACKET_TIMMING 300000 /* in microseconds */ #else #define BRACKET_TIMMING 900000 /* in microseconds */ #endif /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { int buff_length; int line_length; char *line; } HistCell; typedef struct comp_node CompNode; struct comp_node { char *word; int word_length; CompNode *next; }; /*---------------------------------* * Global Variables * *---------------------------------*/ static char separators[MAX_SEPARATORS] = DEFAULT_SEPARATORS; static int ins_mode = 1; static char *global_str; static char *global_pos; static char *global_end; static int prompt_length; static long ctrl_c_ret_val; static char clipboard[4096] = ""; static HistCell hist_tbl[MAX_HISTORY_LINES]; static int hist_start = 0; static int hist_end = 0; static CompNode *comp_start = NULL; static CompNode *comp_first_match; static CompNode *comp_last_match; static int comp_nb_match; static int comp_match_max_lg; static CompNode *comp_cur_match; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static int New_Char(int c, char *str, int size, char **p_pos, char **p_end); static char *Skip(char *from, char *limit, int res_sep_cmp, int direction); static int Is_A_Separator(char c); static int Tab_To_Spaces(int p); static void History_Add_Line(char *line, int length); static void History_Update_Line(char *line, int length, int hist_no); static int History_Get_Line(char *str, int hist_no); static char *Completion_Do_Match(char *prefix, int prefix_length, int *rest_length); static void Completion_Print_All(void); static void Display_Help(void); #define NewLn() { PUT_CHAR('\n'); } #define Hist_Inc(n) { if (++(n) >= MAX_HISTORY_LINES) (n) = 0; } #define Hist_Dec(n) { if (--(n) < 0) (n) = MAX_HISTORY_LINES - 1; } #define Hist_First(n) { (n) = Hist_Start_Entry(); } #define Hist_Last(n) { (n) = Hist_End_Entry(); } #define Hist_Start_Entry() (hist_start) #define Hist_End_Entry() (hist_end) #define Hist_Is_Empty() (hist_start == hist_end) #define RE_DISPLAY_LINE \ do { \ if (prompt && display_prompt) \ DISPL_STR(prompt); \ \ DISPL(end - str, str); \ BACKD(end - pos); \ } while(0) /*-------------------------------------------------------------------------* * LE_GETS * * * *-------------------------------------------------------------------------*/ char * LE_Gets(char *str) { int l; int big_size = ((unsigned) -1) >> 1; if ((str = LE_FGets(str, big_size, NULL, 0)) != NULL) { l = strlen(str) - 1; /* for gets remove last \n */ if (l >= 0 && str[l] == '\n') str[l] = '\0'; } return str; } /*-------------------------------------------------------------------------* * LE_FGETS * * * *-------------------------------------------------------------------------*/ char * LE_FGets(char *str, int size, char *prompt, int display_prompt) { char *pos = str; char *end = str; char *mark = NULL; char *p, *q, *start, *stop; char w; int c, n; int last_was_eof = 0; int h_no = Hist_End_Entry(); int rest_length; int tab_count = 0; int count_bracket[3]; LE_Initialize(); size--; /* -1 for '\0' */ prompt_length = (prompt && display_prompt) ? strlen(prompt) : 0; LE_Open_Terminal(); global_str = str; #ifdef TREAT_BUFFERED_CHARS /* treat buffered lines (for paste) */ while (KBD_IS_NOT_EMPTY) { if (end - str >= size || ((c = LE_Get_Char()) == '\n') || c == '\r') { RE_DISPLAY_LINE; goto return_is_read; } if (c == '\t') /* '\t' on output would cause trouble */ for(n = Tab_To_Spaces(end - str); n; n--) *end++ = ' '; else *end++ = c; } if (end != str) { pos = end; goto re_display_line; } #endif if (prompt && display_prompt) DISPL_STR(prompt); for (;;) { global_pos = pos; global_end = end; c = LE_Get_Char(); one_char: *end = ' '; /* to allow for separator test */ if (LE_Is_Interrupt_Key(c)) { /* save global vars for reentrancy */ int save_prompt_length = prompt_length; FORWD(end - pos, pos); /* go to EOL to avoid multi-line */ /* truncation on the output */ LE_Close_Terminal(); c = *end; *end = '\0'; /* to allow the handler to use/test str */ if ((ctrl_c_ret_val = Emit_Ctrl_C()) != 0) return (char *) -2; LE_Open_Terminal(); *end = c; global_str = str; /* restore global vars for reentrancy */ prompt_length = save_prompt_length; re_display_line: /* display prompt + full line */ RE_DISPLAY_LINE; continue; } if (KEY_IS_EOF(c)) /* to avoid EOF when typing too much ^D */ { if (end == str) { if (c == KEY_CTRL('D') && last_was_eof) goto error; else { str = NULL; goto finish; } } last_was_eof = (c == KEY_CTRL('D')); } else last_was_eof = 0; if (c != '\t') tab_count = 0; switch (c) { case KEY_CTRL('A'): /* go to begin of line */ case KEY_EXT_HOME: BACKD(pos - str); pos = str; continue; case KEY_CTRL('E'): /* go to end of line */ case KEY_EXT_END: FORWD(end - pos, pos); pos = end; continue; case KEY_CTRL('B'): /* go to 1 char backward */ case KEY_EXT_LEFT: if (pos == str) goto error; BACKD(1); pos--; continue; case KEY_CTRL('F'): /* go to 1 char forward */ case KEY_EXT_RIGHT: if (pos == end) goto error; FORWD(1, pos); pos++; continue; case KEY_BACKSPACE: /* erase previous char */ case KEY_DELETE: if (pos == str) goto error; del_last: for (p = pos; p < end; p++) p[-1] = *p; BACKD(1); pos--; end--; DISPL(end - pos, pos); ERASE(1); BACKD(end - pos); continue; case KEY_CTRL('D'): /* erase current char */ case KEY_EXT_DELETE: if (pos == end) goto error; /* simply equivalent to ^F + BACKSPACE */ FORWD(1, pos); pos++; goto del_last; case KEY_CTRL('U'): /* erase begin of line */ case KEY_CTRL_EXT_HOME: q = clipboard; p = str; while (p < pos) /* add deleted part to clipboard */ *q++ = *p++; *q = '\0'; n = pos - str; for (p = pos; p < end; p++) p[-n] = *p; pos = str; end -= n; BACKD(n); DISPL(end - pos, pos); ERASE(n); BACKD(end - pos); continue; case KEY_CTRL('K'): /* erase end of line */ case KEY_CTRL_EXT_END: q = clipboard; p = pos; while (p < end) /* add deleted part to clipboard */ *q++ = *p++; *q = '\0'; ERASE(end - pos); end = pos; continue; case KEY_CTRL('Y'): /* paste from clipboard */ for (p = clipboard; *p; p++) if (!New_Char(*p, str, size, &pos, &end)) goto error; continue; case KEY_CTRL(' '): /* mark begin selection */ mark = pos; continue; case KEY_ESC('W'): /* copy (from mark) to clipboard */ case KEY_CTRL('W'): /* cut (from mark) to clipboard */ if (mark == NULL) goto error; if (mark < pos) { start = mark; stop = pos; } else { start = pos; stop = mark; } q = clipboard; p = start; while (p < stop) *q++ = *p++; *q = '\0'; if (c == KEY_ESC('W')) continue; n = stop - start; for (p = stop; p < end; p++) p[-n] = *p; if (mark < pos) BACKD(n); pos = start; end -= n; DISPL(end - pos, pos); ERASE(n); BACKD(end - pos); continue; case KEY_ESC('B'): /* go to previous word */ case KEY_CTRL_EXT_LEFT: p = (pos == str) ? pos : pos - 1; /* to avoid start of a word */ p = Skip(p, str, 1, -1); /* skip separators */ p = Skip(p, str, 0, -1); /* skip non separators */ p = Skip(p, end, 1, +1); /* skip separators */ BACKD(pos - p); pos = p; continue; case KEY_ESC('F'): /* go to next word */ case KEY_CTRL_EXT_RIGHT: p = pos; p = Skip(p, end, 0, +1); /* skip non separators */ p = Skip(p, end, 1, +1); /* skip separators */ FORWD(p - pos, pos); pos = p; continue; case KEY_ESC('C'): /* capitalize word */ p = pos; p = Skip(p, end, 1, +1); /* skip separators */ if (islower(*p)) *p = *p - 'a' + 'A'; p = Skip(p, end, 0, +1); /* skip non separators */ DISPL(p - pos, pos); pos = p; continue; case KEY_ESC('L'): /* convert to lower case */ p = pos; p = Skip(p, end, 1, +1); /* skip separators */ for (; p < end && !Is_A_Separator(*p); p++) *p = tolower(*p); DISPL(p - pos, pos); pos = p; continue; case KEY_ESC('U'): /* convert to upper case */ p = pos; p = Skip(p, end, 1, +1); /* skip separators */ for (; p < end && !Is_A_Separator(*p); p++) *p = toupper(*p); DISPL(p - pos, pos); pos = p; continue; case '\t': /* TAB: completion */ if (tab_count != 0) /* already a TAB */ { if (++tab_count > NB_TAB_BEFORE_LIST) { NewLn(); Completion_Print_All(); goto re_display_line; } goto error; } p = (pos == str) ? pos : pos - 1; /* to avoid start of a word */ p = Skip(p, str, 0, -1); /* skip non separators */ p = Skip(p, end, 1, +1); /* skip separators */ w = *pos; /* prefix from p to pos */ *pos = '\0'; p = Completion_Do_Match(p, pos - p, &rest_length); *pos = w; if (p == NULL) goto error; while (rest_length--) if (!New_Char(*p++, str, size, &pos, &end)) goto error; if (comp_first_match != comp_last_match) { tab_count = 1; goto error; /* for the beep */ } tab_count = 0; continue; case KEY_ESC('\t'): /* transform a tab to spaces */ for (n = Tab_To_Spaces(pos - str); n; n--) if (!New_Char(' ', str, size, &pos, &end)) goto error; continue; case KEY_CTRL('V'): /* switch insert mode (on/off) */ case KEY_EXT_INSERT: ins_mode = 1 - ins_mode; INS_MODE(ins_mode); continue; case KEY_CTRL('T'): /* swap last and current char */ if (pos == str || pos == end) goto error; w = pos[0]; pos[0] = pos[-1]; pos[-1] = w; BACKD(1); DISPL(2, pos - 1); pos++; continue; case '\n': case '\r': return_is_read: FORWD(end - pos, pos); /* go to EOL to avoid multi-line */ /* truncation on the output */ *end = '\0'; History_Add_Line(str, end - str); if (end - str < size) /* '\n' can be added */ *end++ = '\n'; *end = '\0'; goto finish; case KEY_CTRL('P'): /* history: recall previous line */ case KEY_EXT_UP: if (Hist_Is_Empty() || h_no == Hist_Start_Entry()) goto error; *end = '\0'; History_Update_Line(str, end - str, h_no); Hist_Dec(h_no); write_hist_line: p = end; end = str + History_Get_Line(str, h_no); BACKD(pos - str); DISPL(end - str, str); if (end < p) ERASE(p - end); pos = end; continue; case KEY_CTRL('N'): /* history: recall next line */ case KEY_EXT_DOWN: if (Hist_Is_Empty() || h_no == Hist_End_Entry()) goto error; *end = '\0'; History_Update_Line(str, end - str, h_no); Hist_Inc(h_no); goto write_hist_line; case KEY_ESC('P'): /* history: recall previous matching line */ if (Hist_Is_Empty() || pos == str) goto error; *end = '\0'; History_Update_Line(str, end - str, h_no); try_previous: if (h_no == Hist_Start_Entry()) goto error; Hist_Dec(h_no); if (hist_tbl[h_no].line == NULL || strncmp(str, hist_tbl[h_no].line, pos - str) != 0) goto try_previous; write_hist_match_line: p = end; end = str + History_Get_Line(str, h_no); DISPL(end - pos, pos); if (end < p) ERASE(p - end); BACKD(end - pos); continue; case KEY_ESC('N'): /* history: recall next matching line */ if (Hist_Is_Empty() || pos == str) goto error; *end = '\0'; History_Update_Line(str, end - str, h_no); try_next: if (Hist_Is_Empty() || h_no == Hist_End_Entry()) goto error; Hist_Inc(h_no); if (hist_tbl[h_no].line == NULL || strncmp(str, hist_tbl[h_no].line, pos - str) != 0) goto try_next; goto write_hist_match_line; case KEY_ESC('<'): /* history: recall first line */ case KEY_EXT_PAGE_UP: if (Hist_Is_Empty() || h_no == Hist_Start_Entry()) goto error; *end = '\0'; History_Update_Line(str, end - str, h_no); Hist_First(h_no); goto write_hist_line; case KEY_ESC('>'): /* history: recall last line */ case KEY_EXT_PAGE_DOWN: if (Hist_Is_Empty() || h_no == Hist_End_Entry()) goto error; *end = '\0'; History_Update_Line(str, end - str, h_no); Hist_Last(h_no); goto write_hist_line; case KEY_ESC('?'): /* display help */ display_help: NewLn(); Display_Help(); goto re_display_line; default: if ((unsigned) c > 255 || !isprint(c)) { n = c; EMIT_BEEP; c = LE_Get_Char(); if (c != n) goto one_char; goto display_help; } if (!New_Char(c, str, size, &pos, &end)) goto error; /* brackets ([{ }]): matching */ if (KBD_IS_NOT_EMPTY || (q = strchr(CLOSE_BRACKET, c)) == NULL) continue; n = q - CLOSE_BRACKET; count_bracket[0] = count_bracket[1] = count_bracket[2] = 0; count_bracket[n]--; p = pos - 1; for (; count_bracket[n] != 0;) { if (--p < str) goto bracket_exit; c = *p; if ((q = strchr(CLOSE_BRACKET, c)) != NULL) { count_bracket[q - CLOSE_BRACKET]--; continue; } if ((q = strchr(OPEN_BRACKET, c)) != NULL) if (++count_bracket[q - OPEN_BRACKET] > 0) goto bracket_exit; #ifdef IGNORE_QUOTED_PART if (p > str && (c == '\'' || c == '"') && p[-1] != '\\') { /* ignore quoted part */ while (--p > str && (*p != c || p[-1] == '\\')) ; } #endif } if (KBD_IS_NOT_EMPTY) continue; n = pos - p; q = pos; BACKD(n); #if defined(_WIN32) && !defined(__CYGWIN__) { long t0 = clock(), t1; do t1 = clock(); while (!KBD_IS_NOT_EMPTY && (t1 - t0) * 1000000 / CLOCKS_PER_SEC < BRACKET_TIMMING); } #elif !defined(NO_USE_SELECT) { fd_set set; struct timeval t; t.tv_sec = 0; t.tv_usec = BRACKET_TIMMING; FD_ZERO(&set); FD_SET(0, &set); select(1, &set, NULL, NULL, &t); } #else usleep(BRACKET_TIMMING); #endif pos = p; FORWD(n, pos); pos = q; bracket_exit: continue; } error: EMIT_BEEP; } finish: NewLn(); LE_Close_Terminal(); return str; } /*-------------------------------------------------------------------------* * NEW_CHAR * * * *-------------------------------------------------------------------------*/ static int New_Char(int c, char *str, int size, char **p_pos, char **p_end) { char *pos = *p_pos; char *end = *p_end; char *p; if ((ins_mode || pos == end) && end - str >= size) return 0; if (!ins_mode) { *pos = (char) c; if (++pos > end) end = pos; PUT_CHAR(c); } else { for (p = end; p > pos; p--) *p = p[-1]; *pos = (char) c; end++; DISPL(end - pos, pos); pos++; BACKD(end - pos); } *p_pos = pos; *p_end = end; return 1; } /*-------------------------------------------------------------------------* * LE_GET_PROMPT_LENGTH * * * *-------------------------------------------------------------------------*/ int LE_Get_Prompt_Length(void) { return prompt_length; } /*-------------------------------------------------------------------------* * LE_GET_CURRENT_POSITION * * * *-------------------------------------------------------------------------*/ int LE_Get_Current_Position(void) { return global_pos - global_str; } /*-------------------------------------------------------------------------* * LE_GET_CURRENT_WORD * * * *-------------------------------------------------------------------------*/ void LE_Get_Current_Word(char *word) { char *str = global_str; char *pos = global_pos; char *end = global_end; char *p, *q; p = Skip(pos, str, 0, -1); /* skip non separators */ if (Is_A_Separator(*p)) p++; q = Skip(pos, end, 0, +1); /* skip non separators */ while (p < q) *word++ = *p++; *word = '\0'; } /*-------------------------------------------------------------------------* * LE_GET_SEPARATORS * * * *-------------------------------------------------------------------------*/ char * LE_Get_Separators(void) { return separators; } /*-------------------------------------------------------------------------* * LE_SET_SEPARATORS * * * *-------------------------------------------------------------------------*/ char * LE_Set_Separators(char *sep_str) { return strcpy(separators, sep_str); } /*-------------------------------------------------------------------------* * LE_GET_CTRL_C_RETURN_VALUE * * * *-------------------------------------------------------------------------*/ long LE_Get_Ctrl_C_Return_Value(void) { return ctrl_c_ret_val; } /*-------------------------------------------------------------------------* * SKIP * * * *-------------------------------------------------------------------------*/ static char * Skip(char *from, char *limit, int res_sep_cmp, int direction) { while (from != limit) { if (Is_A_Separator(*from) != res_sep_cmp) break; /* exit since *from does not satisfy res_sep_cmp */ from = from + direction; } return from; } /*-------------------------------------------------------------------------* * IS_A_SEPARATOR * * * *-------------------------------------------------------------------------*/ static int Is_A_Separator(char c) { char *p; /* like strchr(separators,c) but does not take into account '\0' */ for (p = separators; *p; p++) if (*p == c) return 1; return 0; } /*-------------------------------------------------------------------------* * TAB_TO_SPACES * * * *-------------------------------------------------------------------------*/ static int Tab_To_Spaces(int p) { p += prompt_length; p = 8 - (p % 8); return p; } /*-------------------------------------------------------------------------* * HISTORY_ADD_LINE * * * *-------------------------------------------------------------------------*/ static void History_Add_Line(char *line, int length) { char *p = line; while (*p == ' ') p++; if (*p == '\0') /* do not add an empty line */ return; #ifdef NO_DUP_IN_HISTORY if (hist_end > 0 && strcmp(line, hist_tbl[hist_end - 1].line) == 0) return; #endif History_Update_Line(line, length, hist_end); Hist_Inc(hist_end); if (hist_end == hist_start) Hist_Inc(hist_start); } /*-------------------------------------------------------------------------* * HISTORY_UPDATE_LINE * * * *-------------------------------------------------------------------------*/ static void History_Update_Line(char *line, int length, int hist_no) { HistCell *h; h = hist_tbl + hist_no; if (h->line != NULL && h->buff_length < length) { free(h->line); h->line = NULL; /* to ensure future malloc */ } if (h->line == NULL) /* not yet allocated */ { if ((h->line = (char *) malloc(length + 1)) == NULL) exit(1); h->buff_length = length; } strcpy(h->line, line); h->line_length = length; } /*-------------------------------------------------------------------------* * HISTORY_GET_LINE * * * *-------------------------------------------------------------------------*/ static int History_Get_Line(char *str, int hist_no) { HistCell *h = hist_tbl + hist_no; strcpy(str, h->line); return h->line_length; } /*-------------------------------------------------------------------------* * LE_COMPL_ADD_WORD * * * *-------------------------------------------------------------------------*/ char * LE_Compl_Add_Word(char *word, int word_length) { CompNode **p; CompNode *q; int cmp; for (p = &comp_start; *p; p = &(*p)->next) { cmp = strcmp((*p)->word, word); if (cmp == 0) return word; if (cmp > 0) break; } if ((q = (CompNode *) malloc(sizeof(CompNode))) == NULL) exit(1); q->word = word; q->word_length = word_length; q->next = *p; *p = q; return word; } /*-------------------------------------------------------------------------* * LE_COMPL_DEL_WORD * * * *-------------------------------------------------------------------------*/ char * LE_Compl_Del_Word(char *word) { CompNode **p; CompNode *q; int cmp; for (p = &comp_start; *p; p = &(*p)->next) { cmp = strcmp((*p)->word, word); if (cmp == 0) break; if (cmp > 0) return NULL; } q = *p; *p = q->next; free(q); return word; } /*-------------------------------------------------------------------------* * LE_COMPL_INIT_MATCH * * * *-------------------------------------------------------------------------*/ char * LE_Compl_Init_Match(char *prefix, int *nb_match, int *max_lg) { int prefix_length, rest_length; char *str; prefix_length = strlen(prefix); if (Completion_Do_Match(prefix, prefix_length, &rest_length) == NULL) return NULL; if ((str = (char *) malloc(prefix_length + rest_length + 1)) == NULL) exit(1); *nb_match = comp_nb_match; *max_lg = comp_match_max_lg; comp_cur_match = comp_first_match; strncpy(str, comp_first_match->word, prefix_length + rest_length); str[prefix_length + rest_length] = '\0'; return str; } /*-------------------------------------------------------------------------* * LE_COMPL_FIND_MATCH * * * *-------------------------------------------------------------------------*/ char * LE_Compl_Find_Match(int *is_last) { char *str; if (comp_cur_match == NULL) return NULL; str = comp_cur_match->word; if (comp_cur_match != comp_last_match) { comp_cur_match = comp_cur_match->next; *is_last = 0; } else { comp_cur_match = NULL; *is_last = 1; } return str; } /*-------------------------------------------------------------------------* * COMPLETION_DO_MATCH * * * *-------------------------------------------------------------------------*/ static char * Completion_Do_Match(char *prefix, int prefix_length, int *rest_length) { CompNode *p; int cmp; int l; char w; comp_first_match = NULL; comp_nb_match = 0; comp_match_max_lg = 0; for (p = comp_start; p; p = p->next) { cmp = strncmp(p->word, prefix, prefix_length); if (cmp == 0) { if (comp_first_match == NULL) comp_first_match = p; comp_last_match = p; comp_nb_match++; if (p->word_length > comp_match_max_lg) comp_match_max_lg = p->word_length; } else if (cmp > 0) break; } if (comp_first_match == NULL) return NULL; if (comp_first_match == comp_last_match) *rest_length = comp_first_match->word_length - prefix_length; else { /* determine longest common suffix */ l = prefix_length; for (;;) { w = comp_first_match->word[l]; p = comp_first_match->next; for (;;) { if (p->word[l] != w) /* also deals with '\0' */ goto diff_found; if (p == comp_last_match) break; p = p->next; } l++; } diff_found: *rest_length = l - prefix_length; } return comp_first_match->word + prefix_length; } /*-------------------------------------------------------------------------* * COMPLETION_PRINT_ALL * * * *-------------------------------------------------------------------------*/ static void Completion_Print_All(void) { CompNode *p, *p1; int row, col; int nb_in_a_line, nb_lines; int nb_in_last_line, nb_miss_in_last_line; int spaces, skip; int k; char buff[512]; int l, c; SCREEN_SIZE(&row, &col); nb_in_a_line = col / (comp_match_max_lg + 2); /* at least 2 chars to separate */ if (nb_in_a_line <= 1) nb_in_a_line = 1; nb_lines = (comp_nb_match + nb_in_a_line - 1) / nb_in_a_line; nb_in_last_line = ((comp_nb_match - 1) % nb_in_a_line) + 1; nb_miss_in_last_line = nb_in_a_line - nb_in_last_line; spaces = (nb_in_a_line == 1) ? 0 : (col - nb_in_a_line * comp_match_max_lg) / nb_in_a_line; if (nb_lines > NB_MATCH_LINES_BEFORE_ASK) /* too many matchings ? */ { sprintf(buff, "Show all %d possibilities (y/n) ? ", comp_nb_match); DISPL_STR(buff); c = LE_Get_Char(); NewLn(); if (c != 'y') return; } p = comp_first_match; l = 0; for (;;) { p1 = p; c = 0; for (;;) { DISPL_STR(p1->word); if (++c == ((l < nb_lines - 1) ? nb_in_a_line : nb_in_last_line)) break; sprintf(buff, "%*s", comp_match_max_lg - p1->word_length + spaces, ""); DISPL_STR(buff); skip = nb_lines; if (c > nb_in_a_line - nb_miss_in_last_line) skip--; for (k = 0; k < skip; k++) p1 = p1->next; } NewLn(); if (++l == nb_lines) break; p = p->next; } } /*-------------------------------------------------------------------------* * DISPLAY_HELP * * * *-------------------------------------------------------------------------*/ static void Display_Help(void) #define L(msg) DISPL_STR(msg); NewLn() { char buff[80]; L(""); sprintf(buff, " linedit %-25s Copyright (C) 1999-2007 Daniel Diaz", LINEDIT_VERSION); L(buff); L(""); L(" Moving"); L(" Ctl-B previous char Ctl-F next char"); L(" Esc-B previous word Esc-F next word"); L(" Ctl-A begin of line Ctl-E end of line"); L(""); L(" Deleting"); L(" Ctl-U delete begin of line Ctl-K delete end of line"); L(" Ctl-H delete previous char Ctl-D delete current char"); L(""); L(" Changing"); L(" Esc-L downcase word Esc-U upcase word"); L(" Esc-C capitalize word Ctl-T reverse last two chars"); L(""); L(" History"); L(" Esc-< first line Esc-> last line"); L(" Ctl-P previous line Ctl-N next line"); L(" Esc-P previous matching line Esc-N next matching line"); L(""); L(" Selection"); L(" Ctl-spc mark selection Ctl-W cut selection"); L(" Esc-W copy selection Ctl-Y past selection"); L(""); L(" Miscellaneous"); L(" Ctl-V insert mode switch Ctl-I completion (twice = all)"); L(" Esc-? display this help Esc-Ctl-I insert spaces for tab"); L(""); } #undef L /*-------------------------------------------------------------------------* * LE_GET_KEY * * * *-------------------------------------------------------------------------*/ int LE_Get_Key(int echo, int catch_ctrl_c) { int c; LE_Initialize(); prompt_length = 0; start: LE_Open_Terminal(); c = LE_Get_Char(); if (catch_ctrl_c && LE_Is_Interrupt_Key(c)) { LE_Close_Terminal(); if ((ctrl_c_ret_val = Emit_Ctrl_C()) != 0) return -2; goto start; } if (KEY_IS_EOF(c)) c = EOF; if (echo && (unsigned) c <= 255 && isprint(c)) PUT_CHAR(c); LE_Close_Terminal(); return c; } /*-------------------------------------------------------------------------* * LE_PRINTF * * * *-------------------------------------------------------------------------*/ int LE_Printf(char *format, ...) { va_list arg_ptr; char buff[1024]; int ret; LE_Initialize(); va_start(arg_ptr, format); ret = vsprintf(buff, format, arg_ptr); DISPL_STR(buff); va_end(arg_ptr); return ret; } ./gprolog-1.3.0/src/Linedit/test_noecho.c0000644004425400513100000000631210547154142016633 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : line-edit library * * File : test_noecho.c * * Descr.: test file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: test_noecho.c,v 1.10 2007/01/04 10:35:14 diaz Exp $ */ #include #include #include #include #include "linedit.h" #define printf LE_Printf /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * MAIN * * * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { int c; setlocale(LC_ALL, ""); while ((c = LE_FGetc_No_Echo(0, 1)) != EOF) { printf("Read Char (%d)", c); if (isprint(c)) printf(" = %c", c); if (isalpha(c)) printf(" isalpha"); if (isascii(c)) printf(" isascii"); if (isupper(c)) printf(" isupper"); if (islower(c)) printf(" islower"); if (isspace(c)) printf(" isspace"); if (isprint(c)) printf(" isprint"); if (isgraph(c)) printf(" isgraph"); printf("\n"); } return 0; } ./gprolog-1.3.0/src/Linedit/terminal.c0000644004425400513100000004444510547154142016145 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : line-edit library * * File : terminal.c * * Descr.: basic terminal operations * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: terminal.c,v 1.10 2007/01/04 10:35:14 diaz Exp $ */ #include #include #include #include #include #include "../EnginePl/gp_config.h" #if defined(__unix__) || defined(__CYGWIN__) #include #include #include #include #if defined(HAVE_SYS_IOCTL_COMPAT_H) #include #endif #if defined(HAVE_TERMIOS_H) #include typedef struct termios TermIO; #define Gtty(fd, s) tcgetattr(fd, s) #define Stty(fd, s) tcsetattr(fd, TCSANOW, s) #else #include typedef struct termio TermIO; #define Gtty(fd, s) ioctl(fd, TCGETA, s) #define Stty(fd, s) ioctl(fd, TCSETA, s) #endif /* !HAVE_TERMIOS_H */ #elif defined(_WIN32) #include #include #include #endif #define LE_DEFINE_HOOK_MACROS #define TERMINAL_FILE #include "terminal.h" #include "linedit.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static int use_gui = 1; static int use_ansi = 1; static int fd_in = 0; /* not changed */ static int fd_out = -1; #if defined(__unix__) || defined(__CYGWIN__) static int is_tty_in; static int is_tty_out; static TermIO old_stty_in; static TermIO new_stty_in; static TermIO old_stty_out; static TermIO new_stty_out; static int nb_rows, nb_cols; static int pos; #elif defined(_WIN32) static HANDLE h_stdin; static HANDLE h_stdout; static DWORD im; #endif static int interrupt_key; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Parse_Env_Var(void); #if defined(__unix__) || defined(__CYGWIN__) static void Choose_Fd_Out(void); static void Set_TTY_Mode(TermIO *old, TermIO *new); #endif static int LE_Get_Char0(void); static void Backd(int n); static void Forwd(int n, char *str); static void Displ(int n, char *str); static void Displ_Str(char *s); static void Erase(int n); /*-------------------------------------------------------------------------* * LE_INITIALIZE * * * *-------------------------------------------------------------------------*/ int LE_Initialize(void) { static int initialized = 0; static int le_hook_present = 0; /* ie. gui is present */ if (initialized) return le_hook_present; initialized = 1; Parse_Env_Var(); #if defined(__unix__) || defined(__CYGWIN__) Choose_Fd_Out(); #endif if (le_hook_start && use_gui == 1) (*le_hook_start) (); if (le_hook_put_char != NULL && le_hook_get_char0 != NULL && le_hook_kbd_is_not_empty != NULL && le_hook_screen_size != NULL) le_hook_present = 1; else { le_hook_put_char = NULL; le_hook_get_char0 = NULL; le_hook_kbd_is_not_empty = NULL; le_hook_screen_size = NULL; } #define INIT_FCT(hook, def) if (hook == NULL) hook = def /* inside terminal.c */ INIT_FCT(le_hook_screen_size, LE_Screen_Size); INIT_FCT(le_hook_kbd_is_not_empty, LE_Kbd_Is_Not_Empty); INIT_FCT(le_hook_put_char, LE_Put_Char); INIT_FCT(le_hook_get_char0, LE_Get_Char0); INIT_FCT(le_hook_ins_mode, LE_Ins_Mode); INIT_FCT(le_hook_emit_beep, LE_Emit_Beep); /* inside linedit.c */ INIT_FCT(le_hook_backd, Backd); INIT_FCT(le_hook_forwd, Forwd); INIT_FCT(le_hook_displ, Displ); INIT_FCT(le_hook_erase, Erase); INIT_FCT(le_hook_displ_str, Displ_Str); #if defined(__unix__) || defined(__CYGWIN__) #elif defined(_WIN32) if (le_hook_put_char == LE_Put_Char) /* DOS console mode */ { h_stdin = GetStdHandle(STD_INPUT_HANDLE); h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); } interrupt_key = KEY_CTRL('C'); /* WIN32: interrupt = CTRL+C */ #endif return le_hook_present; } /*-------------------------------------------------------------------------* * PARSE_ENV_VAR * * * *-------------------------------------------------------------------------*/ static void Parse_Env_Var(void) { char *p = getenv("LINEDIT"); if (p == NULL) return; if (strstr(p, "gui=no") != NULL) use_gui = 0; if (strstr(p, "ansi=no") != NULL) use_ansi = 0; if ((p = strstr(p, "out=")) != NULL) { p += 4; if (isdigit(*p)) fd_out = strtol(p, NULL, 10); else { char buff[1024]; char *q = buff; while(*p && isprint(*p) && !isspace(*p)) *q++ = *p++; *q = '\0'; fd_out = open(buff, O_WRONLY); /* on error fd_out = -1 */ } } } #if defined(__unix__) || defined(__CYGWIN__) /*-------------------------------------------------------------------------* * CHOOSE_FD_OUT * * * *-------------------------------------------------------------------------*/ static void Choose_Fd_Out(void) { int fd[3] = { 1, 0, 2 }; /* order fd list to try to find a tty */ int i, try; int mask; char *p; for(i = 0; i < 3 && fd_out < 0; i++) { try = fd[i]; if (!isatty(try)) continue; mask = fcntl(try, F_GETFL); if ((mask & O_WRONLY) == O_WRONLY || (mask & O_RDWR) == O_RDWR) { fd_out = try; break; } if ((p = ttyname(try)) != NULL) fd_out = open(p, O_WRONLY); } if (fd_out < 0) fd_out = 1; } #endif /*-------------------------------------------------------------------------* * LE_OPEN_TERMINAL * * * *-------------------------------------------------------------------------*/ void LE_Open_Terminal(void) { fflush(stdout); fflush(stderr); #if defined(__unix__) || defined(__CYGWIN__) /* Mode cbreak (raw mode) */ is_tty_in = !Gtty(fd_in, &old_stty_in); is_tty_out = !Gtty(fd_out, &old_stty_out); if (is_tty_in) { interrupt_key = old_stty_in.c_cc[VINTR]; Set_TTY_Mode(&old_stty_in, &new_stty_in); Stty(fd_in, &new_stty_in); } else interrupt_key = KEY_CTRL('C'); if (is_tty_out) { Set_TTY_Mode(&old_stty_out, &new_stty_out); Stty(fd_out, &new_stty_out); } LE_Screen_Size(&nb_rows, &nb_cols); pos = 0; #elif defined(_WIN32) if (le_hook_put_char == LE_Put_Char) /* DOS console mode */ { h_stdin = GetStdHandle(STD_INPUT_HANDLE); h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleMode(h_stdin, &im); SetConsoleMode(h_stdin, im & ~ENABLE_PROCESSED_INPUT); } interrupt_key = KEY_CTRL('C'); /* WIN32: interrupt = CTRL+C */ #endif } /*-------------------------------------------------------------------------* * LE_CLOSE_TERMINAL * * * *-------------------------------------------------------------------------*/ void LE_Close_Terminal(void) { #if defined(__unix__) || defined(__CYGWIN__) /* Initial mode (cooked mode) */ if (is_tty_in) Stty(fd_in, &old_stty_in); if (is_tty_out) Stty(fd_out, &old_stty_out); #elif defined(_WIN32) if (le_hook_put_char == LE_Put_Char) /* DOS console mode */ SetConsoleMode(h_stdin, im); #endif } #if defined(__unix__) || defined(__CYGWIN__) /*-------------------------------------------------------------------------* * SET_TTY_MODE * * * * Mode cbreak (raw mode). * *-------------------------------------------------------------------------*/ static void Set_TTY_Mode(TermIO *old, TermIO *new) { *new = *old; new->c_iflag &= ~(INLCR | IGNCR | ICRNL | IXON | IXOFF); new->c_oflag = OPOST | ONLCR; new->c_lflag &= ~(ICANON | ECHO | ECHONL); new->c_cc[VMIN] = 1; /* MIN # of chars */ new->c_cc[VTIME] = 1; /* TIME */ new->c_cc[VINTR] = -1; /* deactivate SIGINT signal */ } #endif /*-------------------------------------------------------------------------* * LE_SCREEN_SIZE * * * *-------------------------------------------------------------------------*/ void LE_Screen_Size(int *row, int *col) { #if defined(__unix__) || defined(__CYGWIN__) struct winsize ws; if (!is_tty_out) { row = col = 0; return; } ioctl(fd_out, TIOCGWINSZ, &ws); nb_rows = *row = ws.ws_row; nb_cols = *col = ws.ws_col; #elif defined(_WIN32) CONSOLE_SCREEN_BUFFER_INFO csbi; if (GetConsoleScreenBufferInfo(h_stdout, &csbi)) { *row = csbi.dwSize.Y; *col = csbi.dwSize.X; } else { *row = 25; *col = 80; } #endif } /*-------------------------------------------------------------------------* * LE_IS_INTERRUPT_KEY * * * *-------------------------------------------------------------------------*/ int LE_Is_Interrupt_Key(int c) { return (c == interrupt_key); } /*-------------------------------------------------------------------------* * LE_KBD_IS_NOT_EMPTY * * * *-------------------------------------------------------------------------*/ int LE_Kbd_Is_Not_Empty(void) { #if defined(__unix__) || defined(__CYGWIN__) #ifdef FIONREAD int nb_not_read; ioctl(fd_in, FIONREAD, &nb_not_read); return nb_not_read != 0; #else return 0; #endif #elif defined(_WIN32) return kbhit(); #endif } /*-------------------------------------------------------------------------* * LE_INS_MODE * * * *-------------------------------------------------------------------------*/ void LE_Ins_Mode(int ins_mode) { #if defined(_WIN32) && !defined(__CYGWIN__) CONSOLE_CURSOR_INFO cci; if (!GetConsoleCursorInfo(h_stdout, &cci)) return; cci.dwSize = (ins_mode) ? 5 : 50; SetConsoleCursorInfo(h_stdout, &cci); #endif } /*-------------------------------------------------------------------------* * LE_EMIT_BEEP * * * *-------------------------------------------------------------------------*/ void LE_Emit_Beep(void) { #if defined(__unix__) || defined(__CYGWIN__) LE_Put_Char('\a'); #else Beep(800, 220); #endif } /* * Character I/O */ /*-------------------------------------------------------------------------* * LE_PUT_CHAR * * * *-------------------------------------------------------------------------*/ void LE_Put_Char(int c) { #if defined(__unix__) || defined(__CYGWIN__) char c0 = c; if (use_ansi) { char buf[20]; switch(c) { case '\b': if (pos == 0) { pos = nb_cols - 1; sprintf(buf, "\033[A\033[%dC", pos); write(fd_out, buf, strlen(buf)); return; } pos--; break; case '\a': break; case '\n': pos = 0; break; default: if (++pos > nb_cols) pos = 1; } } c0 = c; write(fd_out, &c0, 1); #elif defined(_WIN32) CONSOLE_SCREEN_BUFFER_INFO csbi; if (c != '\b') { #ifdef WIN32_CONVERT_OEM_ASCII unsigned char buff[2]; buff[0] = c; buff[1] = '\0'; CharToOem(buff, buff); c = buff[0]; #endif putch(c); return; } GetConsoleScreenBufferInfo(h_stdout, &csbi); if (csbi.dwCursorPosition.X == 0) { csbi.dwCursorPosition.X = csbi.dwSize.X - 1; csbi.dwCursorPosition.Y--; } else csbi.dwCursorPosition.X--; SetConsoleCursorPosition(h_stdout, csbi.dwCursorPosition); #endif } /*-------------------------------------------------------------------------* * LE_GET_CHAR * * * *-------------------------------------------------------------------------*/ int LE_Get_Char(void) { int c; c = GET_CHAR0; if (c == 0x1b) { int esc_c; esc_c = GET_CHAR0; #if defined(__unix__) || defined(__CYGWIN__) if (esc_c == '[' || esc_c == 'O') /* keyboard ANSI ESC sequence */ { if ((c = GET_CHAR0) == '[') c = GET_CHAR0; if (isdigit(c)) { esc_c = c; c = 0; while (esc_c != '~') { c = c * 10 + esc_c - '0'; esc_c = GET_CHAR0; } } c = (1 << 8) | c; } else #endif c = KEY_ESC(esc_c); } return c; } /*-------------------------------------------------------------------------* * LE_GET_CHAR0 * * * *-------------------------------------------------------------------------*/ static int LE_Get_Char0(void) { #if defined(__unix__) || defined(__CYGWIN__) unsigned char c; if (read(fd_in, &c, 1) != 1) return KEY_CTRL('D'); return (int) c; #elif defined(_WIN32) INPUT_RECORD ir; DWORD nb; int c; read_char: if (!ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &ir, 1, &nb)) return -1; switch (ir.EventType) { case KEY_EVENT: if (!ir.Event.KeyEvent.bKeyDown) goto read_char; c = ir.Event.KeyEvent.uChar.AsciiChar & 0xff; if (c == 0 || c == 0xe0) { c = ir.Event.KeyEvent.wVirtualKeyCode; if (c < 0x15 || c > 0x87) /* e.g. CTRL key alone */ goto read_char; if (ir.Event.KeyEvent.dwControlKeyState & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED)) c = (2 << 8) | c; else c = (1 << 8) | c; } #ifdef WIN32_CONVERT_OEM_ASCII else { unsigned char buff[2]; buff[0] = c; buff[1] = '\0'; OemToChar(buff, buff); c = buff[0]; } #endif break; case MOUSE_EVENT: case WINDOW_BUFFER_SIZE_EVENT: case MENU_EVENT: case FOCUS_EVENT: goto read_char; break; } return c; #endif } /*-------------------------------------------------------------------------* * BACKD * * * *-------------------------------------------------------------------------*/ static void Backd(int n) { while (n--) PUT_CHAR('\b'); } /*-------------------------------------------------------------------------* * FORWD * * * *-------------------------------------------------------------------------*/ static void Forwd(int n, char *str) { while (n--) PUT_CHAR(*str++); } /*-------------------------------------------------------------------------* * DISPL * * * *-------------------------------------------------------------------------*/ static void Displ(int n, char *str) { while (n--) PUT_CHAR(*str++); } /*-------------------------------------------------------------------------* * ERASE * * * *-------------------------------------------------------------------------*/ static void Erase(int n) { int n0 = n; while (n--) PUT_CHAR(' '); BACKD(n0); } /*-------------------------------------------------------------------------* * DISPL_STR * * * *-------------------------------------------------------------------------*/ static void Displ_Str(char *str) { while (*str) PUT_CHAR(*str++); } ./gprolog-1.3.0/src/Linedit/terminal.h0000644004425400513100000001430310547154142016140 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : line-edit library * * File : stty.h * * Descr.: basic terminal operations - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: terminal.h,v 1.9 2007/01/04 10:35:14 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ #define KEY_CTRL(x) ((x) & 0x1f) #define KEY_ESC(x) ((2<<8) | ((x)|0x20)) #define KEY_BACKSPACE '\b' #define KEY_DELETE 0x7f #if defined(__unix__) || defined(__CYGWIN__) /* Unix */ #define KEY_EXT_FCT_1 ((1<<8) | 11) #define KEY_EXT_FCT_2 ((1<<8) | 12) #define KEY_EXT_FCT_3 ((1<<8) | 13) #define KEY_EXT_FCT_4 ((1<<8) | 14) #define KEY_EXT_FCT_5 ((1<<8) | 15) #define KEY_EXT_FCT_6 ((1<<8) | 17) #define KEY_EXT_FCT_7 ((1<<8) | 18) #define KEY_EXT_FCT_8 ((1<<8) | 19) #define KEY_EXT_FCT_9 ((1<<8) | 20) #define KEY_EXT_FCT_10 ((1<<8) | 21) #define KEY_EXT_FCT_11 ((1<<8) | 23) #define KEY_EXT_FCT_12 ((1<<8) | 24) #define KEY_EXT_UP ((1<<8) | 'A') #define KEY_EXT_DOWN ((1<<8) | 'B') #define KEY_EXT_RIGHT ((1<<8) | 'C') #define KEY_EXT_LEFT ((1<<8) | 'D') #define KEY_EXT_HOME ((1<<8) | 'H') #define KEY_EXT_END ((1<<8) | 'F') #define KEY_EXT_PAGE_UP ((1<<8) | 5) #define KEY_EXT_PAGE_DOWN ((1<<8) | 6) #define KEY_EXT_INSERT ((1<<8) | 2) #define KEY_EXT_DELETE ((1<<8) | 3) #define KEY_CTRL_EXT_UP ((1<<8) | 'a') #define KEY_CTRL_EXT_DOWN ((1<<8) | 'b') #define KEY_CTRL_EXT_RIGHT ((1<<8) | 'c') #define KEY_CTRL_EXT_LEFT ((1<<8) | 'd') #define KEY_CTRL_EXT_HOME ((1<<8) | 'e') #define KEY_CTRL_EXT_END ((1<<8) | 'f') #define KEY_CTRL_EXT_PAGE_UP ((1<<8) | 'g') #define KEY_CTRL_EXT_PAGE_DOWN ((1<<8) | 'h') #define KEY_CTRL_EXT_INSERT ((1<<8) | 'i') #define KEY_CTRL_EXT_DELETE ((1<<8) | 'j') #elif defined(_WIN32) /* Win32 */ #include #define KEY_EXT_FCT_1 ((1<<8) | VK_F1) #define KEY_EXT_FCT_2 ((1<<8) | VK_F2) #define KEY_EXT_FCT_3 ((1<<8) | VK_F3) #define KEY_EXT_FCT_4 ((1<<8) | VK_F4) #define KEY_EXT_FCT_5 ((1<<8) | VK_F5) #define KEY_EXT_FCT_6 ((1<<8) | VK_F6) #define KEY_EXT_FCT_7 ((1<<8) | VK_F7) #define KEY_EXT_FCT_8 ((1<<8) | VK_F8) #define KEY_EXT_FCT_9 ((1<<8) | VK_F9) #define KEY_EXT_FCT_10 ((1<<8) | VK_F10) #define KEY_EXT_FCT_11 ((1<<8) | VK_F11) #define KEY_EXT_FCT_12 ((1<<8) | VK_F12) #define KEY_EXT_UP ((1<<8) | VK_UP) #define KEY_EXT_DOWN ((1<<8) | VK_DOWN) #define KEY_EXT_RIGHT ((1<<8) | VK_RIGHT) #define KEY_EXT_LEFT ((1<<8) | VK_LEFT) #define KEY_EXT_HOME ((1<<8) | VK_HOME) #define KEY_EXT_END ((1<<8) | VK_END) #define KEY_EXT_PAGE_UP ((1<<8) | VK_PRIOR) #define KEY_EXT_PAGE_DOWN ((1<<8) | VK_NEXT) #define KEY_EXT_INSERT ((1<<8) | VK_INSERT) #define KEY_EXT_DELETE ((1<<8) | VK_DELETE) #define KEY_CTRL_EXT_UP ((2<<8) | VK_UP) #define KEY_CTRL_EXT_DOWN ((2<<8) | VK_DOWN) #define KEY_CTRL_EXT_RIGHT ((2<<8) | VK_RIGHT) #define KEY_CTRL_EXT_LEFT ((2<<8) | VK_LEFT) #define KEY_CTRL_EXT_HOME ((2<<8) | VK_HOME) #define KEY_CTRL_EXT_END ((2<<8) | VK_END) #define KEY_CTRL_EXT_PAGE_UP ((2<<8) | VK_PRIOR) #define KEY_CTRL_EXT_PAGE_DOWN ((2<<8) | VK_NEXT) #define KEY_CTRL_EXT_INSERT ((2<<8) | VK_INSERT) #define KEY_CTRL_EXT_DELETE ((2<<8) | VK_DELETE) #endif #if defined(_WIN32) #define KEY_IS_EOF(c) ((c) == KEY_CTRL('D') || (c) == KEY_CTRL('Z')) #else #define KEY_IS_EOF(c) ((c) == KEY_CTRL('D')) #endif /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ void LE_Open_Terminal(void); void LE_Close_Terminal(void); void LE_Screen_Size(int *row, int *col); void LE_Ins_Mode(int ins_mode); int LE_Kbd_Is_Not_Empty(void); int LE_Is_Interrupt_Key(int c); void LE_Emit_Beep(void); void LE_Put_Char(int c); int LE_Get_Char(void); ./gprolog-1.3.0/src/config.guess0000755004425400513100000012647310532545437015125 0ustar diazloco#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2006-11-15' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; x86:Interix*:[3456]*) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T:Interix*:[3456]* | authenticamd:Interix*:[3456]*) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ./gprolog-1.3.0/src/debian/0000777004425400513100000000000010547442376014022 5ustar diazloco./gprolog-1.3.0/src/debian/README.Debian0000644004425400513100000000146307734003270016051 0ustar diazloco== GNU Prolog for Debian ====================================================== -- Packaging notes: ----------------------------------------------------------- - The .orig.tar.gz file was obtained from the CVS archive after removing *all* CVS subdirectories, doing a "make clean-full" in the "doc/" directory and removing all configure-generated Makefiles in "src/". The "src/src/debian" (also found as a link at the top level dir) has also been removed. - The icon is the usual "Logic Programming motto" :-) -- Acknowledgements: ---------------------------------------------------------- Thanks are due to Milan Zamazal for the initial packaging and to Gergely Nagy for his help in debugging previous versions of these packages. ../salvador Abreu ./gprolog-1.3.0/src/debian/manpage0000644004425400513100000000361607357013542015351 0ustar diazloco.\" Hey, Emacs! This is an -*- nroff -*- source file. .\" .\" Copyright (C) 2000 Milan Zamazal .\" .\" This is free software; you can redistribute it and/or modify it under .\" the terms of the GNU General Public License as published by the Free .\" Software Foundation; either version 2, or (at your option) any later .\" version. .\" .\" This is distributed in the hope that it will be useful, but WITHOUT .\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or .\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License .\" for more details. .\" .\" You should have received a copy of the GNU General Public License with .\" your Debian GNU/Linux system, in /usr/share/common-licenses/GPL, or with .\" the dpkg source package as the file COPYING. If not, write to the Free .\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. .\" .\" This manpage is created thanks to: .\" Kai Henningsen , .\" Ian Jackson , .\" David H. Silber & .\" Carl Streeter . .\" Erick Branderhorst .\" .TH GPROLOG 1 "September 2001" "Debian Project" "Debian GNU/Linux" .SH NAME GNU Prolog \- Prolog compiler, includes CLP(FD). .SH SYNOPSIS .B gprolog .br .B gplc .br .B hexgplc .br .B pl2wam .br .B wam2ma .br .B ma2asm .br .B fd2c .SH DESCRIPTION This program does not have a useful manpage. .PP If you install the .B gprolog-doc package, you will find GNU Prolog documentation in the file /usr/share/doc/gprolog-doc/manual.pdf or you can read it in HTML format starting with the file /usr/share/doc/gprolog-doc/gprolog.html/index.html or at the URL .B http://localhost/doc/gprolog-doc/gprolog.html/ .SH AUTHOR Milan Zamazal . .br Salvador Abreu . .SH THANKS Kai Henningsen, Ian Jackson, David H. Silber, Carl Streeter, Erick Branderhorst. ./gprolog-1.3.0/src/debian/menu0000644004425400513100000000134107357013542014676 0ustar diazloco?package(gprolog):needs="text" section="Apps/Programming" \ title="GNU Prolog interactive shell" \ longtitle="Start a GNU Prolog top-level interpreter in a terminal" \ command="/usr/bin/gprolog" \ description=\ "\ GNU Prolog is a free Prolog compiler with constraint solving \ over finite domains. GNU Prolog accepts a Prolog+constraint \ program and produces a native binary (like gcc does from a \ C source). The obtained executable is then stand-alone. The \ size of this executable can be quite small, since GNU Prolog \ can avoid linking the code of most unused built-in predicates. \ The performance of GNU Prolog is very encouraging (comparable \ to commercial systems.) \ "\ icon="/usr/share/icons/gprolog.xpm" ./gprolog-1.3.0/src/debian/copyright0000644004425400513100000000166510547152476015760 0ustar diazlocoThis Package is now in Debian form in the main CVS repository. This package was initially debianized by Milan Zamazal . It is presently being maintained by Salvador Abreu . It was made from a snapshot of the GNU Prolog CVS archive on sourceforge.net, taken slightly before the package itself was made. Copyright: Copyright (C) 1999-2007 Daniel Diaz GNU Prolog is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or any later version. GNU Prolog is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. On Debian systems, you can find the GNU General Public License in the file /usr/share/common-licenses/GPL. ./gprolog-1.3.0/src/debian/dhelp.gprolog-doc0000644004425400513100000000026707357013542017247 0ustar diazloco programming GNU Prolog gprolog.html/index.html This is the HTML version of the GNU Prolog reference manual. ./gprolog-1.3.0/src/debian/control0000644004425400513100000000217007734003270015407 0ustar diazlocoSource: gprolog Section: devel Priority: optional Maintainer: Salvador Abreu Standards-Version: 3.5.8.0 Build-Depends: imagemagick, tetex-bin, tetex-extra, gsfonts, hevea (>= 1.06), texinfo, debhelper (>= 3.0), autoconf (>= 2.52) Package: gprolog Architecture: i386 sparc mips alpha powerpc Depends: ${shlibs:Depends} Suggests: gprolog-doc Conflicts: Description: GNU Prolog compiler GNU Prolog is a free Prolog compiler with constraint solving over finite domains (FD) developed at INRIA by Daniel Diaz. GNU Prolog is based on two systems developed by the same author (with lot of code rewriting and a lot of new extensions): wamcc and clp(FD). Much work has been devoted to make it ISO compatible, full compliance being one of its goals. Package: gprolog-doc Architecture: all Section: doc Conflicts: gprolog (<< 1.2.7) Recommends: pdf-viewer, www-browser Description: Documentation for the GNU Prolog compiler GNU Prolog is a free Prolog compiler with constraint solving over finite domains (FD) developed at INRIA by Daniel Diaz. . This package contains the documentation (both PDF and HTML) for GNU Prolog. ./gprolog-1.3.0/src/debian/all-packages0000755004425400513100000000040207734003270016252 0ustar diazloco#! /bin/sh -x fakeroot debian/rules clean dpkg-buildpackage \ -rfakeroot \ -m"Salvador Abreu " \ -e"Salvador Abreu " \ -sgpg -k0x95A4F1D6 \ -i'.*/CVS/.*|.*/\.cvsignore|.*/TAGS|.*/debian/.*-packages$|.*/\.#.*' \ $@ ./gprolog-1.3.0/src/debian/changelog0000644004425400513100000001655007734003270015665 0ustar diazlocogprolog (1.2.17-2) unstable; urgency=low * src/src/configure.in, src/src/config.{sub,guess}: adapt to latest versions and recognize wider range of designation for supported architectures. * debian/rules: in "clean" target: run autoconf when needed! * src/src/TopComp/prolog_path.c: Search_Path(): look in PROLOG_BINDIR first! * debian/rules: *really* make sure we're using the locally generated gplc & friends: it's critical when rebuilding the system... * debian/rules: new target "config". -- Salvador Abreu Mon, 17 Feb 2003 00:37:17 +0000 gprolog (1.2.17-1) unstable; urgency=low * New upstream release * Updated Standards-Version to 3.5.8 * Restrict binary packages to known working architectures (i386, sparc, mips, alpha, powerpc) * Fixed postinst and prerm scripts to look for executables in the right place. * machine1.c: modified execvp() calls to try library directory first. * configure.in, gp_config.h.in: added PROLOG_BINDIR and PROLOG_LIBDIR constants (for above). * top_comp.c: use PROLOG_LIBDIR to locate *.o files. * Fixed library locations introduced in version 1.2.11-4, to adhere to the scheme /usr/lib/gprolog-VARIANT/. For now, VARIANT is only "iso" but the "cx" (Contextual Logic Programming) packages are on the way... * Lintian 1.22.6 approved :) -- Salvador Abreu Thu, 13 Feb 2003 09:31:28 +0000 gprolog (1.2.13-1) unstable; urgency=low * new upstream version. -- Salvador Abreu Sat, 4 May 2002 23:40:14 +0100 gprolog (1.2.11-4) unstable; urgency=low * new executable file locate in order to prepare to host several variants of gprolog (eg. gprolog-cx) simultaneously. * gprolog.postinst, gprolog.prerm: put #DEBHELPER# line AT THE END, just in case things like update-menus, etc. fail. -- Salvador Abreu Fri, 3 May 2002 11:22:11 +0100 gprolog (1.2.11-3) unstable; urgency=medium * merged fixes from upstream 1.2.12: allow for much larger memory sizes, user settable via GLOBALSZ=NNN, etc. NNN are Kbytes; see docs. * configure for minimal hardware requirements (closes: #143406). -- Salvador Abreu Thu, 18 Apr 2002 13:36:18 +0100 gprolog (1.2.11-2) unstable; urgency=low * REALLY fixed watermark code, this time! * configure --with-c-flags=... instead of specifying in the `make' command line: configure would think it could use machine registers that, in fact, it shouldn't. -- Salvador Abreu Tue, 26 Mar 2002 17:57:56 +0000 gprolog (1.2.11-1) unstable; urgency=low * new upstream version. * doc/Makefile: hh_do_hhc_hhk is to be found here. Patch courtesy of Neal H Walfield (closes: #139643) * added build-dependencies on tetex-extra and gsfonts (closes: #139639) * fix problem with watermark code introduced in 1.2.9. * use autoconf >= 2.52. -- Salvador Abreu Mon, 25 Mar 2002 13:47:05 +0000 gprolog (1.2.9-3) unstable; urgency=low * use M-q instead of C-u M-q in control (closes: #135231 >-) * incorporate top_comp.c changes from 1.2.10. -- Salvador Abreu Thu, 28 Feb 2002 22:21:08 +0000 gprolog (1.2.9-2) unstable; urgency=low * remove alternatives upon package deletion (closes: #127035) -- Salvador Abreu Thu, 3 Jan 2002 16:34:19 +0000 gprolog (1.2.9-1) unstable; urgency=low * new upstream version. * added --enable-watermark to provide for external destructors on choicepoint deletion. * wam2ma: fixed weirdness: dmalloc is no longer a build dependency. fix went upstream also. (closes: #126343) * gprolog-doc: make sure *.html goes in the right place. -- Salvador Abreu Mon, 24 Dec 2001 18:55:15 +0000 gprolog (1.2.7-3) unstable; urgency=low * clean up after calling mkstemp(2). moved upstream into the CVS archive. (closes: #114529) -- Salvador Abreu Sun, 7 Oct 2001 14:46:17 +0100 gprolog (1.2.7-2) unstable; urgency=low * gprolog-doc is now in the "doc" distribution section. * reworked doc-base stuff to properly deal with binary and documentation packages. (closes: #114220) -- Salvador Abreu Tue, 2 Oct 2001 21:17:42 +0100 gprolog (1.2.7-1) unstable; urgency=low * New maintainer. (closes: #71675) * New upstream release. * Added a menu entry and an icon. * Split into two binary packages (gprolog and gprolog-doc). * Complete rewrite of debian/rules. * Fully rebuild docs everytime, produce HTML and PDF versions. * Updated manpages. * Linking wam2ma with dmalloc as regular mallocs seem to cause grief. * New function Update_Water_Mark/2 in EnginePl/wam_inst.c, needed to create external nondeterminate predicates which need to release resources when a choice-point is deleted. * lintian 1.20.14 approved. -- Salvador Abreu Mon, 24 Sep 2001 15:57:15 +0100 gprolog (1.2.1-1) unstable; urgency=low * New upstream release. (Closes:Bug#98347) * Use doc-base. (Closes:Bug#96025) * Added a menu entry. (Closes:Bug#83493) -- Brent A. Fulgham Mon, 24 Sep 2001 20:44:41 -0700 gprolog (1.2.0-3) unstable; urgency=low * Orphaned. -- Milan Zamazal Wed, 29 Aug 2001 10:58:15 +0200 gprolog (1.2.0-2) unstable; urgency=low * Call update-alternatives in prerm, not in postrm; closes: #74558. prolog (1.2.0-1) unstable; urgency=low * New upstream version. -- Milan Zamazal Sun, 30 Jul 2000 20:46:56 +0200 gprolog (1.1.2-1) unstable; urgency=low * New upstream version. * Use .gz extension in links to the main manpage. * Lintian 1.11.2 satisfied. -- Milan Zamazal Sun, 23 Jul 2000 12:16:49 +0200 gprolog (1.1.0-4) frozen unstable; urgency=low * Broken links to man pages in alternatives install fixed; closes: #57238. * Do not install DVI version of the manual. * Very simple man page created. -- Milan Zamazal Wed, 9 Feb 2000 20:48:06 +0100 gprolog (1.1.0-3) unstable; urgency=low * Standards 3.1.1. * Build dependencies introduced. * Download location fixed. * Reference to GPL location on Debian fixed. * Copyright updated. -- Milan Zamazal Sun, 5 Dec 1999 10:32:24 +0100 gprolog (1.1.0-2) unstable; urgency=low * Grr, move include and lib files to the proper location again; closes: #48702. -- Milan Zamazal Sun, 31 Oct 1999 18:43:47 +0100 gprolog (1.1.0-1) unstable; urgency=low * New upstream version. * More cleanups when cleaning. * Lintian 1.10 satisfied. -- Milan Zamazal Sun, 24 Oct 1999 19:48:48 +0200 gprolog (1.0.5-1) unstable; urgency=low * New upstream version. (This is a development version, but the 1.0.0 version does not compile with gcc 2.95 and glibc 2.1 and the development version is suggested for glibc 2.1 systems.) * Moved to FHS. * Compiled with glibc 2.1. * Standards 3.0.1. * Lintian 1.9.2 satisfied. -- Milan Zamazal Fri, 1 Oct 1999 21:31:19 +0200 gprolog (1.0.0-2) unstable; urgency=low * All GIFs removed from the binary package to avoid problems with bad ideas. -- Milan Zamazal Mon, 30 Aug 1999 21:06:56 +0200 gprolog (1.0.0-1) unstable; urgency=low * Initial Release. * Lintian 1.1 satisfied. -- Milan Zamazal Sun, 25 Apr 1999 16:07:35 +0200 ./gprolog-1.3.0/src/debian/gprolog.docs0000644004425400513100000000004107734003270016322 0ustar diazlocosrc/NEWS src/README src/PROBLEMS ./gprolog-1.3.0/src/debian/rules0000755004425400513100000002024607734003270015070 0ustar diazloco#! /usr/bin/make -f # $Id: rules,v 1.9 2003/03/22 10:12:21 spa Exp $ # ============================================================================= # debian/rules for the GNU Prolog packages: # architecture-dependant package (gprolog-doc), # architecture-independent package (gprolog). # # Written by Salvador Abreu based on the template in # /usr/share/doc/debhelper/examples/rules.multi, with the following header: # ============================================================================= # # Sample debian/rules that uses debhelper. # This file is public domain software, originally written by Joey Hess. # # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # This is the debhelper compatibility version to use. export DH_COMPAT=3 # may be iso, cx... variant=iso LIBDIR=/usr/lib/gprolog-$(variant) ifeq ($(variant),iso) PACKAGE = gprolog DOCDIR = /usr/share/doc/gprolog-doc else PACKAGE = gprolog-$(variant) DOCDIR = /usr/share/doc/gprolog-$(variant)-doc endif version=$(shell pwd | sed -e 's;.*/;;' -e 's;gprolog-;;') SRCDIR=src/src # ============================================================================= CPPFLAGS = \ -DDEBIAN CONFOPTIONS = \ --prefix=/usr \ --bindir=$(LIBDIR)/bin \ --libdir=$(LIBDIR) \ --includedir=$(LIBDIR)/include \ --with-doc-dir=$(DOCDIR) \ --with-html-dir=$(DOCDIR)/gprolog.html \ --with-examples-dir=$(DOCDIR)/examples \ --with-c-flags="-O3 -fomit-frame-pointer -Wall -DDEBIAN" \ --without-links \ --enable-watermark INSTALLDIRS = \ INSTALL_DIR=debian/$(PACKAGE)$(LIBDIR) \ INSTALL_BIN=debian/$(PACKAGE)$(LIBDIR)/bin \ INSTALL_LIB=debian/$(PACKAGE)$(LIBDIR) \ INSTALL_INC=debian/$(PACKAGE)$(LIBDIR)/include \ DOC_DIR=debian/$(PACKAGE)-doc$(DOCDIR) \ HTML_DIR=debian/$(PACKAGE)-doc$(DOCDIR)/gprolog.html \ EXAMPLES_DIR=debian/$(PACKAGE)-doc$(DOCDIR)/examples ROOT = $(shell pwd) SRCPATH = $(ROOT)/src/src SRCXDIRS = TopComp EnginePl Pl2Wam Wam2Ma Ma2Asm Fd2C DevUtils SRCXPATH := $(foreach dir,$(SRCXDIRS),$(SRCPATH)/$(dir):) SRCXPATH := $(shell echo $(SRCXPATH) | tr -d ' ') PATH = $(SRCXPATH):/usr/bin:/bin # == build binaries and documentation ========================================= build: build-indep build-arch config: config-stamp dh_testdir # ----------------------------------------------------------------------------- ( PATH=${PATH}; \ if [ ! -f $(SRCDIR)/Makefile -o \ ! -f $(SRCDIR)/configure -o \ $(SRCDIR)/Makefile.in -nt $(SRCDIR)/Makefile ]; then \ cd $(SRCDIR); \ autoconf && \ CPPFLAGS="${CPPFLAGS}" ./configure $(CONFOPTIONS); fi ) # ----------------------------------------------------------------------------- touch config-stamp build-indep: build-indep-stamp build-indep-stamp: config-stamp dh_testdir # -- commands to configure and build the package ------------------------------ PATH=${PATH} make -C doc pdf html # ----------------------------------------------------------------------------- touch build-indep-stamp build-arch: build-arch-stamp build-arch-stamp: config-stamp dh_testdir # -- commands to configure and build the package ------------------------------ PATH=${PATH} PL_PATH=$$PWD/${SRCDIR} make -C $(SRCDIR) # ----------------------------------------------------------------------------- touch build-arch-stamp # == clean up everything ====================================================== clean: clean: config-stamp dh_testdir dh_testroot rm -f build-arch-stamp build-indep-stamp config-stamp # -- commands to clean up after the build process ----------------------------- set -e; PATH=${PATH} make -C $(SRCDIR) distclean rm -rf $(SRCDIR)/autom4te.cache # -- now, get rid of some more generated files -------------------------------- set -e; \ find -name Makefile -o -name configure | \ while read FILE; do \ if [ -f "$$FILE.in" ]; then rm -f "$$FILE"; fi; done find src -name VERSION | xargs -r rm -f rm -rf src/autom4te.cache # -- clean up docs ------------------------------------------------------------ make -C doc clean-full find doc -name \*.pdf | xargs -r rm -f find doc -name \*.hh[ck] | xargs -r rm -f find doc -name \*.hrf | xargs -r rm -f find doc -name \*.fp | xargs -r rm -f find doc -name manual\*.html | xargs -r rm -f rm -f debian/doc-base # -- clean up examples -------------------------------------------------------- ls -d src/Examples* | while read DIR; do \ if [ -f $$DIR/Makefile ]; then \ make -C "$$DIR" clean; \ fi; \ done # ----------------------------------------------------------------------------- dh_clean # == arch-dependent installation ============================================== install-arch: install-arch: build-arch dh_testdir dh_testroot dh_clean -k dh_installdirs -A # -- install the package into the staging area -------------------------------- make -C $(SRCDIR) $(INSTALLDIRS) install-system # -- create gprolog-$(variant) etc, links in /usr/bin ------------------------- mkdir -p debian/$(PACKAGE)/usr/bin/ for PROG in gplc gprolog hexgplc; do \ ln -sf ../lib/gprolog-$(variant)/bin/$$PROG \ debian/$(PACKAGE)/usr/bin/$$PROG-$(variant); \ done # -- Install manpages --------------------------------------------------------- mkdir -p debian/$(PACKAGE)/usr/share/man/man1/ cat debian/manpage | \ sed -e "s/@PACKAGE@/$(PACKAGE)/g" | \ gzip -9 > debian/$(PACKAGE)/usr/share/man/man1/$(PACKAGE).1.gz for CMD in gplc hexgplc pl2wam wam2ma ma2asm fd2c; do \ ln -sf $(PACKAGE).1.gz \ debian/$(PACKAGE)/usr/share/man/man1/$$CMD.1.gz; \ done for CMD in gplc gprolog hexgplc; do \ ln -sf $(PACKAGE).1.gz \ debian/$(PACKAGE)/usr/share/man/man1/$$CMD-$(variant).1.gz; \ done # -- Install auxiliary stuff -------------------------------------------------- mkdir -p debian/$(PACKAGE)/usr/share/icons/ install -c -m 444 debian/$(PACKAGE).xpm \ debian/$(PACKAGE)/usr/share/icons/ # ----------------------------------------------------------------------------- # dh_movefiles # == arch-independent installation ============================================ install-indep: install-indep: build-indep dh_testdir dh_testroot dh_clean -k dh_installdirs -A # -- commands to install the package into the staging area -------------------- make -C $(SRCDIR) $(INSTALLDIRS) \ install-doc install-html install-examples # -- remove stray PDFs -------------------------------------------------------- find debian/$(PACKAGE)-doc -name compil-scheme.pdf\* | xargs -r rm -f find debian/$(PACKAGE)-doc -name debug-box.pdf\* | xargs -r rm -f # -- add doc-base support ----------------------------------------------------- # mkdir -p debian/$(PACKAGE)-doc/usr/share/doc-base # cp -a debian/autodocs/$(package)-doc \ # debian/$(PACKAGE)-doc/usr/share/doc-base # ----------------------------------------------------------------------------- # dh_movefiles # == build architecture-independent files ===================================== binary-indep: build-indep install-indep dh_testdir -i dh_testroot -i # dh_installdebconf -i # ln -sf autodocs/$(package)-doc debian/doc-base dh_installdocs -pgprolog-doc dh_installexamples -i # dh_installmenu -i dh_installemacsen -i # dh_installman -i dh_installinfo -i dh_installchangelogs -i dh_link -i dh_compress -i dh_fixperms -i dh_installdeb -i dh_gencontrol -i dh_md5sums -i dh_builddeb -i # Build architecture-dependent files here. binary-arch: build-arch install-arch dh_testdir -a dh_testroot -a # dh_installdebconf -a ln -sf autodocs/gprolog debian/doc-base dh_installdocs # dh_installexamples -a dh_installmenu -a dh_installman -a # dh_installinfo -a dh_installchangelogs src/ChangeLog dh_link -a dh_strip -a dh_compress -a dh_fixperms -a # dh_makeshlibs -a for CTLFILE in postinst prerm; do \ ( echo "# -- Prolog variant ---------"; \ echo LIB=/usr/lib/gprolog-${variant}; \ echo VARIANT=${variant}; \ echo "# ---------------------------" ) \ >> debian/$(PACKAGE).$$CTLFILE.debhelper; \ done dh_installdeb -a dh_shlibdeps -a dh_gencontrol -a dh_md5sums -a dh_builddeb -a binary: binary-indep binary-arch .PHONY: build build-arch build-indep clean binary-indep binary-arch binary install ./gprolog-1.3.0/src/debian/gprolog.prerm0000755004425400513100000000025507734003270016531 0ustar diazloco#!/bin/sh -e #DEBHELPER# case "$1" in remove) update-alternatives --remove gprolog ${LIB}/bin/gprolog update-alternatives --remove prolog ${LIB}/bin/gprolog ;; esac ./gprolog-1.3.0/src/debian/files.gprolog-doc0000644004425400513100000000015107357013542017245 0ustar diazlocousr/share/doc/gprolog-doc/gprolog.html usr/share/doc/gprolog-doc/examples usr/share/doc-base/gprolog-doc ./gprolog-1.3.0/src/debian/src-packages0000755004425400513100000000005307357013542016277 0ustar diazloco#! /bin/sh -x exec ${0%/*}/all-packages -S ./gprolog-1.3.0/src/debian/gprolog-doc.postinst0000755004425400513100000000003207357013542020027 0ustar diazloco#!/bin/sh -e #DEBHELPER# ./gprolog-1.3.0/src/debian/gprolog.postinst0000755004425400513100000000125707734003270017272 0ustar diazloco#!/bin/sh -e #DEBHELPER# case "$1" in configure) # -- setup the regular "gprolog" alternatives -------------------------- update-alternatives \ --install /usr/bin/gprolog gprolog ${LIB}/bin/gprolog 10 \ --slave /usr/bin/gplc gplc ${LIB}/bin/gplc \ --slave /usr/bin/hexgplc hexgplc ${LIB}/bin/hexgplc \ --slave /usr/include/gprolog gprolog-inc ${LIB}/include # -- create a plain "prolog" command alternative ----------------------- update-alternatives \ --install /usr/bin/prolog prolog ${LIB}/bin/gprolog 10 \ --slave \ /usr/share/man/man1/prolog.1.gz prolog.1.gz \ /usr/share/man/man1/gprolog.1.gz ;; esac ./gprolog-1.3.0/src/debian/gprolog.xpm0000644004425400513100000000255207734003270016207 0ustar diazloco/* XPM */ static char * gprolog_xpm[] = { "32 32 12 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #191919", "# c #7F7F7F", "$ c #333333", "% c #4C4C4C", "& c #CCCCCC", "* c #666667", "= c #B2B2B2", "- c #999999", "; c #E5E5E5", " ", " ........ ", " .............. ", " ................ ", " .................... ", " ...................... ", " ........................ ", " ........................ ", " .......................... ", " ..++-@.....#++++++@@++-@.... ", " ..++=$@....#++++++%@++=$@... ", " ..++;=####.%==&&&&*$++&%@... ", " ...++++++++$@$%%%%%$@++=%@.... ", " ...++++++++*@@.@@@@@.++&%@.... ", "....++&-####*-++++++@@++++++++$ ", "....++&*$$@$@#++++++*@++++++++* ", "....++;=####@%-=&=&=*$++;&&=&&# ", "....++++++++$@$%%*%%$@++&#*%%%% ", " ...++++++++*$.@@@@@@.++&%@@@.@ ", " ...++&####**-++++++@@++&%@.... ", " ...++&*$$$@@#++++++%@++&%@.... ", " ..++&%@....#++++++#$++=%@... ", " ..@%*$@....@$*###**@@**$@... ", " .@@$@......@$@$@$@.@@$@... ", " ........................ ", " ........................ ", " ...................... ", " .................... ", " ................ ", " .............. ", " .......... ", " "}; ./gprolog-1.3.0/src/debian/gprolog.doc-base0000644004425400513100000000111107673341364017061 0ustar diazlocoDocument: gprolog Title: GNU Prolog compiler Author: Daniel Diaz Abstract: GNU Prolog is a free Prolog compiler with constraint solving over finite domains (FD) developed by Daniel Diaz. GNU Prolog is based on two systems developed by the same author (with lot of code rewriting and a lot of new extensions): wamcc and clp(FD). A lot of work has been devoted to the ISO compatibility, GNU Prolog is very close to the ISO standard. Section: Apps/Programming Format: text Files: /usr/share/doc/gprolog/README.gz /usr/share/doc/gprolog/NEWS.gz /usr/share/doc/gprolog/README.Debian ./gprolog-1.3.0/src/debian/gprolog-doc.doc-base0000644004425400513100000000123107673341364017627 0ustar diazlocoDocument: gprolog-doc Title: Online docs for GNU Prolog compiler Author: Daniel Diaz Abstract: GNU Prolog is a free Prolog compiler with constraint solving over finite domains (FD) developed by Daniel Diaz. GNU Prolog is based on two systems developed by the same author (with lot of code rewriting and a lot of new extensions): wamcc and clp(FD). A lot of work has been devoted to the ISO compatibility, GNU Prolog is very close to the ISO standard. Section: Apps/Programming Format: PDF Files: /usr/share/doc/gprolog-doc/manual.pdf.gz Format: HTML Index: /usr/share/doc/gprolog-doc/gprolog.html/index.html Files: /usr/share/doc/gprolog-doc/gprolog.html/* ./gprolog-1.3.0/src/install-sh0000755004425400513100000001273606726442612014606 0ustar diazloco#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 ./gprolog-1.3.0/src/BipsPl/0000777004425400513100000000000010547442376013771 5ustar diazloco./gprolog-1.3.0/src/BipsPl/oper.wam0000644004425400513100000000374410547440331015435 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : oper.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/oper.pl'). predicate('$use_oper'/0,29,static,private,built_in,[ proceed]). predicate(op/3,31,static,private,built_in,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(op,0), put_integer(3,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(2),0), call('$check_atom_or_atom_list'/1), put_value(y(2),0), put_value(y(0),1), put_value(y(1),2), deallocate, execute('$op/3_$aux1'/3)]). predicate('$op/3_$aux1'/3,31,static,private,built_in,[ load_cut_level(3), try_me_else(1), get_variable(x(4),2), get_variable(x(2),0), call_c('Blt_Atom',[fast_call,boolean],[x(2)]), cut(x(3)), put_value(x(1),0), put_value(x(4),1), execute('$op2'/3), label(1), trust_me_else_fail, get_variable(x(3),2), get_variable(x(2),1), put_value(x(3),1), execute('$op1'/3)]). predicate('$op1'/3,40,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(3), get_variable(y(1),1), get_variable(y(2),2), get_list(0), unify_variable(x(2)), unify_variable(y(0)), put_value(y(2),0), put_value(y(1),1), call('$op2'/3), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute('$op1'/3)]). predicate('$op2'/3,47,static,private,built_in,[ call_c('Op_3',[],[x(0),x(1),x(2)]), proceed]). predicate(current_op/3,53,static,private,built_in,[ put_atom(current_op,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('Current_Op_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate('$current_op_alt'/0,58,static,private,built_in,[ call_c('Current_Op_Alt_0',[boolean],[]), proceed]). ./gprolog-1.3.0/src/BipsPl/all_pl_bips.wam0000644004425400513100000000230010547440332016734 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : all_pl_bips.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/all_pl_bips.pl'). predicate('$use_all_pl_bips'/0,27,static,private,user,[ allocate(0), call('$use_control'/0), call('$use_call'/0), call('$use_call_args'/0), call('$use_catch'/0), call('$use_throw'/0), call('$use_unify'/0), call('$use_arith_inl'/0), call('$use_assert'/0), call('$use_all_solut'/0), call('$use_sort'/0), call('$use_list'/0), call('$use_stream'/0), call('$use_le_interf'/0), call('$use_file'/0), call('$use_char_io'/0), call('$use_read'/0), call('$use_write'/0), call('$use_print'/0), call('$use_const_io'/0), call('$use_oper'/0), call('$use_pred'/0), call('$use_atom'/0), call('$use_flag'/0), call('$use_term_inl'/0), call('$use_type_inl'/0), call('$use_g_var_inl'/0), call('$use_stat'/0), call('$use_dec10io'/0), call('$use_format'/0), call('$use_os_interf'/0), call('$use_expand'/0), call('$use_pretty'/0), call('$use_random'/0), call('$use_sockets'/0), deallocate, execute('$use_src_rdr'/0)]). ./gprolog-1.3.0/src/BipsPl/list.wam0000644004425400513100000002576610547440332015454 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : list.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/list.pl'). predicate('$use_list'/0,29,static,private,built_in,[ proceed]). predicate(append/3,32,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(2),1), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_variable(x(3)), unify_variable(x(0)), get_list(2), unify_value(x(3)), unify_variable(x(2)), execute(append/3)]). predicate(member/2,40,static,private,built_in,[ get_list(1), unify_variable(x(1)), unify_variable(x(2)), execute('$member/2_$aux1'/3)]). predicate('$member/2_$aux1'/3,40,static,private,built_in,[ try_me_else(1), get_value(x(1),0), proceed, label(1), trust_me_else_fail, put_value(x(2),1), execute(member/2)]). predicate(memberchk/2,46,static,private,built_in,[ load_cut_level(2), get_list(1), unify_variable(x(1)), unify_variable(x(3)), execute('$memberchk/2_$aux1'/4)]). predicate('$memberchk/2_$aux1'/4,46,static,private,built_in,[ try_me_else(1), get_value(x(1),0), cut(x(2)), proceed, label(1), trust_me_else_fail, put_value(x(3),1), execute(memberchk/2)]). predicate(reverse/2,54,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_variable(x(3)), unify_variable(x(0)), put_list(2), unify_value(x(3)), unify_nil, execute('$reverse1'/3)]). predicate('$reverse1'/3,60,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(2),1), proceed, label(3), trust_me_else_fail, label(4), get_variable(x(3),2), get_list(0), unify_variable(x(4)), unify_variable(x(0)), put_list(2), unify_value(x(4)), unify_local_value(x(3)), execute('$reverse1'/3)]). predicate(delete/3,68,static,private,built_in,[ load_cut_level(3), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_nil(2), proceed, label(4), retry_me_else(6), label(5), get_list(0), unify_variable(x(4)), unify_variable(x(0)), call_c('Blt_Term_Eq',[fast_call,boolean],[x(4),x(1)]), cut(x(3)), execute(delete/3), label(6), trust_me_else_fail, label(7), get_list(0), unify_variable(x(3)), unify_variable(x(0)), get_list(2), unify_value(x(3)), unify_variable(x(2)), execute(delete/3)]). predicate(select/3,81,static,private,built_in,[ try_me_else(1), get_list(1), unify_local_value(x(0)), unify_local_value(x(2)), proceed, label(1), trust_me_else_fail, get_list(1), unify_variable(x(3)), unify_variable(x(1)), get_list(2), unify_value(x(3)), unify_variable(x(2)), execute(select/3)]). predicate(permutation/2,90,static,private,built_in,[ try_me_else(1), get_nil(0), get_nil(1), proceed, label(1), trust_me_else_fail, allocate(2), get_variable(x(2),0), get_list(1), unify_variable(x(0)), unify_variable(y(0)), put_value(x(2),1), put_variable(y(1),2), call(select/3), put_unsafe_value(y(1),0), put_value(y(0),1), deallocate, execute(permutation/2)]). predicate(prefix/2,100,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_variable(x(2)), unify_variable(x(0)), get_list(1), unify_value(x(2)), unify_variable(x(1)), execute(prefix/2)]). predicate(suffix/2,108,static,private,built_in,[ try_me_else(1), get_value(x(1),0), proceed, label(1), trust_me_else_fail, get_list(1), unify_void(1), unify_variable(x(1)), execute(suffix/2)]). predicate(sublist/2,116,static,private,built_in,[ try_me_else(1), get_value(x(1),0), proceed, label(1), trust_me_else_fail, get_variable(x(2),0), get_list(1), unify_variable(x(1)), unify_variable(x(0)), execute('$sublist1'/3)]). predicate('$sublist1'/3,122,static,private,built_in,[ try_me_else(1), get_value(x(2),0), proceed, label(1), trust_me_else_fail, switch_on_term(3,fail,fail,2,fail), label(2), try(4), trust(6), label(3), try_me_else(5), label(4), get_list(0), unify_variable(x(1)), unify_variable(x(0)), execute('$sublist1'/3), label(5), trust_me_else_fail, label(6), get_variable(x(3),1), get_list(0), unify_variable(x(1)), unify_variable(x(0)), get_list(2), unify_local_value(x(3)), unify_variable(x(2)), execute('$sublist1'/3)]). predicate(last/2,133,static,private,built_in,[ get_variable(x(2),1), get_list(0), unify_variable(x(1)), unify_variable(x(0)), execute('$last1'/3)]). predicate('$last1'/3,136,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(2),1), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_variable(x(1)), unify_variable(x(0)), execute('$last1'/3)]). predicate(length/2,145,static,private,built_in,[ load_cut_level(2), try_me_else(1), get_variable(x(3),1), get_variable(x(1),0), call_c('Blt_Integer',[fast_call,boolean],[x(3)]), cut(x(2)), put_atom(>=,0), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(0),x(2)]), math_load_value(x(3),0), put_integer(0,2), call_c('Blt_Gte',[fast_call,boolean],[x(0),x(2)]), put_value(x(3),0), execute('$make_list'/2), label(1), trust_me_else_fail, put_value(x(1),2), put_integer(0,1), execute('$length'/3)]). predicate('$length'/3,154,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(2),1), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_void(1), unify_variable(x(0)), put_atom(is,3), put_integer(2,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), math_load_value(x(1),1), call_c('Fct_Inc',[fast_call,x(1)],[x(1)]), execute('$length'/3)]). predicate('$make_list'/2,163,static,private,built_in,[ load_cut_level(2), try_me_else(1), get_integer(0,0), get_nil(1), cut(x(2)), proceed, label(1), trust_me_else_fail, get_list(1), unify_void(1), unify_variable(x(1)), put_atom(is,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), math_load_value(x(0),0), call_c('Fct_Dec',[fast_call,x(0)],[x(0)]), execute('$make_list'/2)]). predicate(nth/3,173,static,private,built_in,[ load_cut_level(3), try_me_else(1), call_c('Blt_Integer',[fast_call,boolean],[x(0)]), cut(x(3)), put_atom(>=,3), put_integer(2,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), math_load_value(x(0),3), put_integer(1,4), call_c('Blt_Gte',[fast_call,boolean],[x(3),x(4)]), execute('$nth1'/3), label(1), trust_me_else_fail, get_variable(x(3),0), call_c('Blt_Var',[fast_call,boolean],[x(3)]), put_value(x(1),0), put_value(x(2),1), put_integer(1,2), execute('$nth2'/4)]). predicate('$nth1'/3,183,static,private,built_in,[ load_cut_level(3), try_me_else(1), get_integer(1,0), get_list(1), unify_local_value(x(2)), unify_void(1), cut(x(3)), proceed, label(1), trust_me_else_fail, get_list(1), unify_void(1), unify_variable(x(1)), put_atom(is,3), put_integer(2,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), math_load_value(x(0),0), call_c('Fct_Dec',[fast_call,x(0)],[x(0)]), execute('$nth1'/3)]). predicate('$nth2'/4,191,static,private,built_in,[ switch_on_term(2,fail,fail,1,fail), label(1), try(3), trust(5), label(2), try_me_else(4), label(3), get_value(x(3),2), get_list(0), unify_local_value(x(1)), unify_void(1), proceed, label(4), trust_me_else_fail, label(5), get_list(0), unify_void(1), unify_variable(x(0)), put_atom(is,4), put_integer(2,5), call_c('Set_Bip_Name_2',[],[x(4),x(5)]), math_load_value(x(2),2), call_c('Fct_Inc',[fast_call,x(2)],[x(2)]), execute('$nth2'/4)]). predicate(max_list/2,200,static,private,built_in,[ get_variable(x(2),1), get_list(0), unify_variable(x(1)), unify_variable(x(0)), execute('$max_list1'/3)]). predicate('$max_list1'/3,203,static,private,built_in,[ load_cut_level(3), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_value(x(2),1), proceed, label(4), retry_me_else(6), label(5), get_list(0), unify_variable(x(4)), unify_variable(x(0)), put_atom(=<,5), put_integer(2,6), call_c('Set_Bip_Name_2',[],[x(5),x(6)]), math_load_value(x(4),4), math_load_value(x(1),5), call_c('Blt_Lte',[fast_call,boolean],[x(4),x(5)]), cut(x(3)), execute('$max_list1'/3), label(6), trust_me_else_fail, label(7), get_list(0), unify_variable(x(1)), unify_variable(x(0)), execute('$max_list1'/3)]). predicate(min_list/2,215,static,private,built_in,[ get_variable(x(2),1), get_list(0), unify_variable(x(1)), unify_variable(x(0)), execute('$min_list1'/3)]). predicate('$min_list1'/3,218,static,private,built_in,[ load_cut_level(3), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_value(x(2),1), proceed, label(4), retry_me_else(6), label(5), get_list(0), unify_variable(x(4)), unify_variable(x(0)), put_atom(>=,5), put_integer(2,6), call_c('Set_Bip_Name_2',[],[x(5),x(6)]), math_load_value(x(4),4), math_load_value(x(1),5), call_c('Blt_Gte',[fast_call,boolean],[x(4),x(5)]), cut(x(3)), execute('$min_list1'/3), label(6), trust_me_else_fail, label(7), get_list(0), unify_variable(x(1)), unify_variable(x(0)), execute('$min_list1'/3)]). predicate(sum_list/2,231,static,private,built_in,[ put_value(x(1),2), put_integer(0,1), execute('$sum_list1'/3)]). predicate('$sum_list1'/3,234,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(2),1), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_variable(x(3)), unify_variable(x(0)), put_atom(is,4), put_integer(2,5), call_c('Set_Bip_Name_2',[],[x(4),x(5)]), math_load_value(x(3),3), math_load_value(x(1),1), call_c('Fct_Add',[fast_call,x(1)],[x(3),x(1)]), execute('$sum_list1'/3)]). ./gprolog-1.3.0/src/BipsPl/top_level.pl0000644004425400513100000002072710547162354016316 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : top_level.pl * * Descr.: top Level * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: top_level.pl,v 1.15 2007/01/04 10:35:12 diaz Exp $ */ :- built_in. :- ensure_linked([consult / 1, load / 1]). top_level :- current_prolog_flag(prolog_name, Name), current_prolog_flag(prolog_version, Version), current_prolog_flag(prolog_copyright, Copyright), format(top_level_output, '~N~a ~a~n', [Name, Version]), write(top_level_output, 'By Daniel Diaz'), nl, format(top_level_output, '~a~n', [Copyright]), break. break :- '$call_c'('Set_Ctrl_C_Handler_0'), '$sys_var_read'(10, Level), '$sys_var_read'(11, B), g_read('$all_solutions', All), ( Level > 0 -> format(top_level_output, '~N{Break Level ~d}~n', [Level]) ; true ), '$sys_var_inc'(10), g_read('$cmd_line_entry_goal', LGoal), '$exec_cmd_line_entry_goals'(LGoal), g_assign('$cmd_line_entry_goal', []), '$top_level1', '$sys_var_dec'(10), '$sys_var_write'(11, B), g_assign('$all_solutions', All), ( Level > 0 -> format(top_level_output, '~N{End Break}~n', [Level]) ; true ). '$top_level1' :- repeat, '$catch_internal'('$top_level2', X, '$top_level_exception'(X), false), !. '$top_level_abort' :- '$reinit_after_exception', '$sys_var_read'(11, B), format(top_level_output, 'execution aborted~n', []), '$catch_sync_for_fail_at'(B). '$top_level_stop' :- '$reinit_after_exception', '$sys_var_read'(11, B), '$catch_sync_for_fail_at'(B). '$top_level_exception'(X) :- '$reinit_after_exception', format(top_level_output, '~Nuncaught exception: ', []), write_term(top_level_output, X, [quoted(true), numbervars(false)]), nl(top_level_output), fail. '$reinit_after_exception' :- % g_read('$char_conv', CharConv), % set_prolog_flag(char_conversion, CharConv), ( '$sys_var_read'(12, 1) -> g_read('$user_prompt', UserPrompt), '$set_linedit_prompt'(UserPrompt) ; true ). '$top_level2' :- repeat, '$get_current_B'(B), '$sys_var_write'(11, B), '$write_indicator', % current_prolog_flag(char_conversion, CharConv), % g_assign('$char_conv', CharConv), % set_prolog_flag(char_conversion, off), Prompt = '| ?- ', ( '$sys_var_read'(12, 1) -> '$get_linedit_prompt'(UserPrompt), g_assign('$user_prompt', UserPrompt), '$set_linedit_prompt'(Prompt) ; write(top_level_output, Prompt) ), flush_output(top_level_output), '$read_query'(X, QueryVars), ( '$sys_var_read'(12, 1) -> '$set_linedit_prompt'(UserPrompt) ; true ), % set_prolog_flag(char_conversion, CharConv), sort(QueryVars, QueryVars1), ( X == end_of_file -> nl(top_level_output), ! ; user_time(Time0), ( '$exec_query'(X, QueryVars1) -> Ok = yes ; Ok = no ), user_time(Time1), Time is Time1 - Time0, format(top_level_output, '~N~n', []), ( Time = 0 -> true ; format(top_level_output, '(~d ms) ', [Time]) ), format(top_level_output, '~a~n', [Ok]), fail ). '$write_indicator' :- g_read('$debug_mode', DebugMode), '$dbg_indicator'(DebugMode, A), '$sys_var_read'(10, Level), ( Level > 1 -> Level1 is Level - 1, ( A = '' -> format(top_level_output, '{~d}~n', [Level1]) ; format(top_level_output, '{~a,~d}~n', [A, Level1]) ) ; A = '' -> true ; format(top_level_output, '{~a}~n', [A]) ), fail. '$write_indicator'. '$dbg_indicator'(trace, trace). '$dbg_indicator'(debug, debug). '$dbg_indicator'(nodebug, ''). '$read_query'(X, QueryVars) :- '$sys_var_read'(10, 1), % comment to execute in nested top-levels g_read('$cmd_line_query_goal', [Goal|LGoal]), g_assign('$cmd_line_query_goal', LGoal), !, Prompt = '| ?- ', ( '$sys_var_read'(12, 1) -> write(top_level_output, Prompt) ; true), format(top_level_output, '~a.~n', [Goal]), read_term_from_atom(Goal, X, [end_of_term(eof), variable_names(QueryVars)]). '$read_query'(X, QueryVars) :- read_term(top_level_input, X, [variable_names(QueryVars)]). '$exec_query'(X, QueryVars) :- g_read('$debug_mode', DebugMode), g_assign('$debug_next', DebugMode), g_assign('$all_solutions', f), '$get_current_B'(B), '$call'(X, top_level, 0, true), '$get_current_B'(B1), format(top_level_output, '~N', []), '$set_query_vars_names'(QueryVars, ToDispVars), ( fail, % do not activate 'alt if vars' ToDispVars = [] -> true % no alt if only anonymous vars ; '$write_solution'(ToDispVars, B1, B), ( B1 > B -> g_read('$all_solutions', f), % fail for previous 'a' write(top_level_output, ' ? '), '$read_return' % fail for ';' and 'a' ; true ) ). '$set_query_vars_names'(QueryVars, ToDispVars1) :- name_query_vars(QueryVars, ToDispVars), '$remove_underscore_vars'(ToDispVars, ToDispVars1), name_singleton_vars(ToDispVars1), bind_variables(ToDispVars1, [exclude(QueryVars), namevars]). '$remove_underscore_vars'([], []). '$remove_underscore_vars'([Name = Term|ToDispVars], ToDispVars1) :- ( sub_atom(Name, 0, 1, _, '_') ; Term = '$VARNAME'(Name1), sub_atom(Name1, 0, 1, _, '_')), !, '$remove_underscore_vars'(ToDispVars, ToDispVars1). '$remove_underscore_vars'([X|ToDispVars], [X|ToDispVars1]) :- '$remove_underscore_vars'(ToDispVars, ToDispVars1). '$write_solution'([], B1, B) :- !, ( B1 > B -> format(top_level_output, '~ntrue', []) ; true ). '$write_solution'(ToDispVars, _, _) :- '$write_solution1'(ToDispVars). '$write_solution1'([]). '$write_solution1'([Name = Value|ToDispVars]) :- format(top_level_output, '~n~a = ', [Name]), write_term(top_level_output, Value, [quoted(true), numbervars(false)]), '$write_solution1'(ToDispVars). '$read_return' :- flush_output(top_level_output), get_key(top_level_input, X), '$read_return'(X), !. '$read_return'(10). '$read_return'(13). '$read_return'(97) :- g_assign('$all_solutions', t), !, fail. '$read_return'(59) :- format(top_level_output, '~N', []), !, fail. '$read_return'(_) :- nl(top_level_output), write(top_level_output, 'Action (; for next solution, a for all solutions, RET to stop) ? '), '$read_return'. /* interface with command-line options executing goals */ '$exec_cmd_line_entry_goals'([Goal|LGoal]):- !, '$exec_cmd_line_goal'(Goal), '$exec_cmd_line_entry_goals'(LGoal). '$exec_cmd_line_entry_goals'(_). % can be another term than [] '$exec_cmd_line_goal'(Goal) :- % called by top_level.c ( '$catch'('$exec_cmd1'(Goal), Err, '$exec_cmd_err'(Goal, Err), 'command-line', -1, false) -> true ; format('~Nwarning: command-line goal ~q failed~n', [Goal])). '$exec_cmd1'(Goal) :- read_term_from_atom(Goal, TermGoal, [end_of_term(eof)]), '$call'(TermGoal, 'command-line', -1, false). '$exec_cmd_err'(Goal, Err) :- format('~Nwarning: command-line goal ~q caused exception: ~q~n', [Goal, Err]). ./gprolog-1.3.0/src/BipsPl/top_level.wam0000644004425400513100000005311710547440332016461 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : top_level.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/top_level.pl'). predicate(top_level/0,32,static,private,built_in,[ allocate(3), put_atom(prolog_name,0), put_variable(y(0),1), call(current_prolog_flag/2), put_atom(prolog_version,0), put_variable(y(1),1), call(current_prolog_flag/2), put_atom(prolog_copyright,0), put_variable(y(2),1), call(current_prolog_flag/2), put_atom(top_level_output,0), put_atom('~N~a ~a~n',1), put_list(2), unify_local_value(y(0)), unify_list, unify_local_value(y(1)), unify_nil, call(format/3), put_atom(top_level_output,0), put_atom('By Daniel Diaz',1), call(write/2), call(nl/0), put_atom(top_level_output,0), put_atom('~a~n',1), put_list(2), unify_local_value(y(2)), unify_nil, call(format/3), deallocate, execute(break/0)]). predicate(break/0,45,static,private,built_in,[ allocate(3), call_c('Set_Ctrl_C_Handler_0',[],[]), put_integer(10,0), put_variable(y(0),1), call('$sys_var_read'/2), put_integer(11,0), put_variable(y(1),1), call('$sys_var_read'/2), put_atom('$all_solutions',0), put_variable(y(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), call('$break/0_$aux1'/1), put_integer(10,0), call('$sys_var_inc'/1), put_atom('$cmd_line_entry_goal',1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), call('$exec_cmd_line_entry_goals'/1), put_atom('$cmd_line_entry_goal',0), put_nil(1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), call('$top_level1'/0), put_integer(10,0), call('$sys_var_dec'/1), put_integer(11,0), put_value(y(1),1), call('$sys_var_write'/2), put_atom('$all_solutions',0), put_unsafe_value(y(2),1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_unsafe_value(y(0),0), deallocate, execute('$break/0_$aux2'/1)]). predicate('$break/0_$aux2'/1,45,static,private,built_in,[ load_cut_level(1), try_me_else(1), put_atom(>,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), math_load_value(x(0),2), put_integer(0,3), call_c('Blt_Gt',[fast_call,boolean],[x(2),x(3)]), cut(x(1)), put_list(2), unify_local_value(x(0)), unify_nil, put_atom(top_level_output,0), put_atom('~N{End Break}~n',1), execute(format/3), label(1), trust_me_else_fail, proceed]). predicate('$break/0_$aux1'/1,45,static,private,built_in,[ load_cut_level(1), try_me_else(1), put_atom(>,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), math_load_value(x(0),2), put_integer(0,3), call_c('Blt_Gt',[fast_call,boolean],[x(2),x(3)]), cut(x(1)), put_list(2), unify_local_value(x(0)), unify_nil, put_atom(top_level_output,0), put_atom('~N{Break Level ~d}~n',1), execute(format/3), label(1), trust_me_else_fail, proceed]). predicate('$top_level1'/0,70,static,private,built_in,[ load_cut_level(0), allocate(1), get_variable(y(0),0), call(repeat/0), put_structure('$top_level_exception'/1,2), unify_variable(x(1)), put_atom('$top_level2',0), put_atom(false,3), call('$catch_internal'/4), cut(y(0)), deallocate, proceed]). predicate('$top_level_abort'/0,77,static,private,built_in,[ allocate(1), call('$reinit_after_exception'/0), put_integer(11,0), put_variable(y(0),1), call('$sys_var_read'/2), put_atom(top_level_output,0), put_atom('execution aborted~n',1), put_nil(2), call(format/3), put_unsafe_value(y(0),0), deallocate, execute('$catch_sync_for_fail_at'/1)]). predicate('$top_level_stop'/0,86,static,private,built_in,[ allocate(1), call('$reinit_after_exception'/0), put_integer(11,0), put_variable(y(0),1), call('$sys_var_read'/2), put_unsafe_value(y(0),0), deallocate, execute('$catch_sync_for_fail_at'/1)]). predicate('$top_level_exception'/1,94,static,private,built_in,[ allocate(1), get_variable(y(0),0), call('$reinit_after_exception'/0), put_atom(top_level_output,0), put_atom('~Nuncaught exception: ',1), put_nil(2), call(format/3), put_atom(top_level_output,0), put_value(y(0),1), put_structure(quoted/1,4), unify_atom(true), put_structure(numbervars/1,3), unify_atom(false), put_list(2), unify_value(x(4)), unify_list, unify_value(x(3)), unify_nil, call(write_term/3), put_atom(top_level_output,0), call(nl/1), fail]). predicate('$reinit_after_exception'/0,103,static,private,built_in,[ execute('$$reinit_after_exception/0_$aux1'/0)]). predicate('$$reinit_after_exception/0_$aux1'/0,103,static,private,built_in,[ load_cut_level(0), try_me_else(1), allocate(1), get_variable(y(0),0), put_integer(12,0), put_integer(1,1), call('$sys_var_read'/2), cut(y(0)), put_atom('$user_prompt',1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), deallocate, execute('$set_linedit_prompt'/1), label(1), trust_me_else_fail, proceed]). predicate('$top_level2'/0,115,static,private,built_in,[ load_cut_level(0), allocate(6), get_variable(y(0),0), call(repeat/0), put_variable(y(1),0), call('$get_current_B'/1), put_integer(11,0), put_value(y(1),1), call('$sys_var_write'/2), call('$write_indicator'/0), put_atom('| ?- ',1), put_variable(y(2),0), call('$$top_level2/0_$aux1'/2), put_atom(top_level_output,0), call(flush_output/1), put_variable(y(3),0), put_variable(y(4),1), call('$read_query'/2), put_value(y(2),0), call('$$top_level2/0_$aux2'/1), put_value(y(4),0), put_variable(y(5),1), call(sort/2), put_unsafe_value(y(3),0), put_value(y(0),1), put_unsafe_value(y(5),2), deallocate, execute('$$top_level2/0_$aux3'/3)]). predicate('$$top_level2/0_$aux3'/3,115,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(1), get_variable(y(0),1), put_atom(end_of_file,1), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(1)]), cut(x(3)), put_atom(top_level_output,0), call(nl/1), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, allocate(6), get_variable(y(0),0), get_variable(y(1),2), put_variable(y(2),0), call(user_time/1), put_value(y(0),0), put_value(y(1),1), put_variable(y(3),2), call('$$top_level2/0_$aux4'/3), put_variable(y(4),0), call(user_time/1), put_atom(is,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), math_load_value(y(4),0), math_load_value(y(2),1), call_c('Fct_Sub',[fast_call,x(0)],[x(0),x(1)]), get_variable(y(5),0), put_atom(top_level_output,0), put_atom('~N~n',1), put_nil(2), call(format/3), put_value(y(5),0), call('$$top_level2/0_$aux5'/1), put_atom(top_level_output,0), put_atom('~a~n',1), put_list(2), unify_local_value(y(3)), unify_nil, call(format/3), fail]). predicate('$$top_level2/0_$aux5'/1,115,static,private,built_in,[ load_cut_level(1), try_me_else(1), get_integer(0,0), cut(x(1)), proceed, label(1), trust_me_else_fail, put_list(2), unify_local_value(x(0)), unify_nil, put_atom(top_level_output,0), put_atom('(~d ms) ',1), execute(format/3)]). predicate('$$top_level2/0_$aux4'/3,115,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(2), get_variable(y(0),2), get_variable(y(1),3), call('$exec_query'/2), cut(y(1)), put_value(y(0),0), get_atom(yes,0), deallocate, proceed, label(1), trust_me_else_fail, get_atom(no,2), proceed]). predicate('$$top_level2/0_$aux2'/1,115,static,private,built_in,[ load_cut_level(1), try_me_else(1), allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_integer(12,0), put_integer(1,1), call('$sys_var_read'/2), cut(y(1)), put_value(y(0),0), deallocate, execute('$set_linedit_prompt'/1), label(1), trust_me_else_fail, proceed]). predicate('$$top_level2/0_$aux1'/2,115,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_integer(12,0), put_integer(1,1), call('$sys_var_read'/2), cut(y(2)), put_value(y(0),0), call('$get_linedit_prompt'/1), put_atom('$user_prompt',0), put_value(y(0),1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(1),0), deallocate, execute('$set_linedit_prompt'/1), label(1), trust_me_else_fail, put_atom(top_level_output,0), execute(write/2)]). predicate('$write_indicator'/0,158,static,private,built_in,[ try_me_else(1), allocate(2), put_atom('$debug_mode',1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), put_variable(y(0),1), call('$dbg_indicator'/2), put_integer(10,0), put_variable(y(1),1), call('$sys_var_read'/2), put_value(y(1),0), put_value(y(0),1), call('$$write_indicator/0_$aux1'/2), fail, label(1), trust_me_else_fail, proceed]). predicate('$$write_indicator/0_$aux1'/2,158,static,private,built_in,[ load_cut_level(2), try_me_else(1), get_variable(x(3),1), put_atom(>,1), put_integer(2,4), call_c('Set_Bip_Name_2',[],[x(1),x(4)]), math_load_value(x(0),1), put_integer(1,4), call_c('Blt_Gt',[fast_call,boolean],[x(1),x(4)]), cut(x(2)), put_atom(is,1), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), math_load_value(x(0),0), call_c('Fct_Dec',[fast_call,x(1)],[x(0)]), put_value(x(3),0), execute('$$write_indicator/0_$aux2'/2), label(1), retry_me_else(2), get_atom('',1), cut(x(2)), proceed, label(2), trust_me_else_fail, put_list(2), unify_local_value(x(1)), unify_nil, put_atom(top_level_output,0), put_atom('{~a}~n',1), execute(format/3)]). predicate('$$write_indicator/0_$aux2'/2,158,static,private,built_in,[ load_cut_level(2), try_me_else(1), get_atom('',0), cut(x(2)), put_list(2), unify_local_value(x(1)), unify_nil, put_atom(top_level_output,0), put_atom('{~d}~n',1), execute(format/3), label(1), trust_me_else_fail, put_list(2), unify_local_value(x(0)), unify_list, unify_local_value(x(1)), unify_nil, put_atom(top_level_output,0), put_atom('{~a,~d}~n',1), execute(format/3)]). predicate('$dbg_indicator'/2,179,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(trace,3),(debug,5),(nodebug,7)]), label(2), try_me_else(4), label(3), get_atom(trace,0), get_atom(trace,1), proceed, label(4), retry_me_else(6), label(5), get_atom(debug,0), get_atom(debug,1), proceed, label(6), trust_me_else_fail, label(7), get_atom(nodebug,0), get_atom('',1), proceed]). predicate('$read_query'/2,188,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_integer(10,0), put_integer(1,1), call('$sys_var_read'/2), put_atom('$cmd_line_query_goal',0), put_list(2), unify_variable(y(3)), unify_variable(x(1)), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(2)]), put_atom('$cmd_line_query_goal',0), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), cut(y(2)), put_atom('| ?- ',0), call('$$read_query/2_$aux1'/1), put_atom(top_level_output,0), put_atom('~a.~n',1), put_list(2), unify_value(y(3)), unify_nil, call(format/3), put_value(y(3),0), put_value(y(0),1), put_structure(end_of_term/1,4), unify_atom(eof), put_structure(variable_names/1,3), unify_local_value(y(1)), put_list(2), unify_value(x(4)), unify_list, unify_value(x(3)), unify_nil, deallocate, execute(read_term_from_atom/3), label(1), trust_me_else_fail, put_structure(variable_names/1,3), unify_local_value(x(1)), put_list(2), unify_value(x(3)), unify_nil, put_value(x(0),1), put_atom(top_level_input,0), execute(read_term/3)]). predicate('$$read_query/2_$aux1'/1,188,static,private,built_in,[ load_cut_level(1), try_me_else(1), allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_integer(12,0), put_integer(1,1), call('$sys_var_read'/2), cut(y(1)), put_atom(top_level_output,0), put_value(y(0),1), deallocate, execute(write/2), label(1), trust_me_else_fail, proceed]). predicate('$exec_query'/2,206,static,private,built_in,[ allocate(5), get_variable(y(0),0), get_variable(y(1),1), put_atom('$debug_mode',0), put_variable(x(1),2), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(2)]), put_atom('$debug_next',0), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom('$all_solutions',0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_variable(y(2),0), call('$get_current_B'/1), put_value(y(0),0), put_atom(top_level,1), put_integer(0,2), put_atom(true,3), call('$call'/4), put_variable(y(3),0), call('$get_current_B'/1), put_atom(top_level_output,0), put_atom('~N',1), put_nil(2), call(format/3), put_value(y(1),0), put_variable(y(4),1), call('$set_query_vars_names'/2), put_unsafe_value(y(4),0), put_unsafe_value(y(3),1), put_unsafe_value(y(2),2), deallocate, execute('$$exec_query/2_$aux1'/3)]). predicate('$$exec_query/2_$aux1'/3,206,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(2), get_variable(y(0),0), get_variable(y(1),3), fail, label(1), trust_me_else_fail, allocate(2), get_variable(y(0),1), get_variable(y(1),2), put_value(y(0),1), put_value(y(1),2), call('$write_solution'/3), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$$exec_query/2_$aux2'/2)]). predicate('$$exec_query/2_$aux2'/2,206,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(0), put_atom(>,3), put_integer(2,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), math_load_value(x(0),0), math_load_value(x(1),1), call_c('Blt_Gt',[fast_call,boolean],[x(0),x(1)]), cut(x(2)), put_atom('$all_solutions',0), put_atom(f,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(top_level_output,0), put_atom(' ? ',1), call(write/2), deallocate, execute('$read_return'/0), label(1), trust_me_else_fail, proceed]). predicate('$set_query_vars_names'/2,231,static,private,built_in,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), put_value(y(0),0), put_variable(y(2),1), call(name_query_vars/2), put_value(y(2),0), put_value(y(1),1), call('$remove_underscore_vars'/2), put_value(y(1),0), call(name_singleton_vars/1), put_value(y(1),0), put_structure(exclude/1,2), unify_local_value(y(0)), put_list(1), unify_value(x(2)), unify_list, unify_atom(namevars), unify_nil, deallocate, execute(bind_variables/2)]). predicate('$remove_underscore_vars'/2,240,static,private,built_in,[ load_cut_level(2), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_nil(1), proceed, label(4), retry_me_else(6), label(5), allocate(3), get_variable(y(1),1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_structure((=)/2,0), unify_variable(x(0)), unify_variable(x(1)), get_variable(y(2),2), call('$$remove_underscore_vars/2_$aux1'/2), cut(y(2)), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$remove_underscore_vars'/2), label(6), trust_me_else_fail, label(7), get_list(0), unify_variable(x(2)), unify_variable(x(0)), get_list(1), unify_value(x(2)), unify_variable(x(1)), execute('$remove_underscore_vars'/2)]). predicate('$$remove_underscore_vars/2_$aux1'/2,242,static,private,built_in,[ try_me_else(1), put_integer(0,1), put_integer(1,2), put_void(3), put_atom('_',4), execute(sub_atom/5), label(1), trust_me_else_fail, get_structure('$VARNAME'/1,1), unify_variable(x(0)), put_integer(0,1), put_integer(1,2), put_void(3), put_atom('_',4), execute(sub_atom/5)]). predicate('$write_solution'/3,255,static,private,built_in,[ load_cut_level(3), try_me_else(1), get_nil(0), cut(x(3)), put_value(x(1),0), put_value(x(2),1), execute('$$write_solution/3_$aux1'/2), label(1), trust_me_else_fail, execute('$write_solution1'/1)]). predicate('$$write_solution/3_$aux1'/2,255,static,private,built_in,[ load_cut_level(2), try_me_else(1), put_atom(>,3), put_integer(2,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), math_load_value(x(0),0), math_load_value(x(1),1), call_c('Blt_Gt',[fast_call,boolean],[x(0),x(1)]), cut(x(2)), put_atom(top_level_output,0), put_atom('~ntrue',1), put_nil(2), execute(format/3), label(1), trust_me_else_fail, proceed]). predicate('$write_solution1'/1,266,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_list(0), unify_variable(x(0)), unify_variable(y(1)), get_structure((=)/2,0), unify_variable(x(0)), unify_variable(y(0)), put_list(2), unify_value(x(0)), unify_nil, put_atom(top_level_output,0), put_atom('~n~a = ',1), call(format/3), put_atom(top_level_output,0), put_value(y(0),1), put_structure(quoted/1,4), unify_atom(true), put_structure(numbervars/1,3), unify_atom(false), put_list(2), unify_value(x(4)), unify_list, unify_value(x(3)), unify_nil, call(write_term/3), put_value(y(1),0), deallocate, execute('$write_solution1'/1)]). predicate('$read_return'/0,276,static,private,built_in,[ load_cut_level(0), allocate(2), get_variable(y(0),0), put_atom(top_level_output,0), call(flush_output/1), put_atom(top_level_input,0), put_variable(y(1),1), call(get_key/2), put_value(y(1),0), call('$read_return'/1), cut(y(0)), deallocate, proceed]). predicate('$read_return'/1,284,static,private,built_in,[ load_cut_level(1), try_me_else(10), switch_on_term(2,fail,1,fail,fail), label(1), switch_on_integer([(10,3),(13,5),(97,7),(59,9)]), label(2), try_me_else(4), label(3), get_integer(10,0), proceed, label(4), retry_me_else(6), label(5), get_integer(13,0), proceed, label(6), retry_me_else(8), label(7), get_integer(97,0), put_atom('$all_solutions',0), put_atom(t,2), call_c('Blt_G_Assign',[fast_call],[x(0),x(2)]), cut(x(1)), fail, label(8), trust_me_else_fail, label(9), allocate(1), get_integer(59,0), get_variable(y(0),1), put_atom(top_level_output,0), put_atom('~N',1), put_nil(2), call(format/3), cut(y(0)), fail, label(10), trust_me_else_fail, allocate(0), put_atom(top_level_output,0), call(nl/1), put_atom(top_level_output,0), put_atom('Action (; for next solution, a for all solutions, RET to stop) ? ',1), call(write/2), deallocate, execute('$read_return'/0)]). predicate('$exec_cmd_line_entry_goals'/1,305,static,private,built_in,[ load_cut_level(1), try_me_else(1), allocate(1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), cut(x(1)), call('$exec_cmd_line_goal'/1), put_value(y(0),0), deallocate, execute('$exec_cmd_line_entry_goals'/1), label(1), trust_me_else_fail, proceed]). predicate('$exec_cmd_line_goal'/1,315,static,private,built_in,[ execute('$$exec_cmd_line_goal/1_$aux1'/1)]). predicate('$$exec_cmd_line_goal/1_$aux1'/1,315,static,private,built_in,[ load_cut_level(1), try_me_else(1), allocate(1), get_variable(x(3),0), get_variable(y(0),1), put_structure('$exec_cmd1'/1,0), unify_local_value(x(3)), put_structure('$exec_cmd_err'/2,2), unify_local_value(x(3)), unify_variable(x(1)), put_atom('command-line',3), put_integer(-1,4), put_atom(false,5), call('$catch'/6), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, put_list(1), unify_local_value(x(0)), unify_nil, put_atom('~Nwarning: command-line goal ~q failed~n',0), execute(format/2)]). predicate('$exec_cmd1'/1,321,static,private,built_in,[ allocate(1), put_variable(y(0),1), put_structure(end_of_term/1,3), unify_atom(eof), put_list(2), unify_value(x(3)), unify_nil, call(read_term_from_atom/3), put_unsafe_value(y(0),0), put_atom('command-line',1), put_integer(-1,2), put_atom(false,3), deallocate, execute('$call'/4)]). predicate('$exec_cmd_err'/2,326,static,private,built_in,[ get_variable(x(2),1), put_list(1), unify_local_value(x(0)), unify_list, unify_local_value(x(2)), unify_nil, put_atom('~Nwarning: command-line goal ~q caused exception: ~q~n',0), execute(format/2)]). ensure_linked([consult/1,load/1]). ./gprolog-1.3.0/src/BipsPl/parse_supp.c0000644004425400513100000005414610547154063016315 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : parse_supp.c * * Descr.: parser support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: parse_supp.c,v 1.13 2007/01/04 10:34:27 diaz Exp $ */ #include #include #include #include #define OBJ_INIT Parse_Supp_Initializer #define PARSE_SUPP_FILE #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ #define COMMA_ANY FALSE #define GENERAL_TERM 0 #define TRYING_PREFIX 1 #define INSIDE_ANY_OP 2 /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static StmInf *pstm_i; static Bool tok_present; static jmp_buf jumper; #if !defined(NO_USE_REGS) && NB_OF_USED_MACHINE_REGS>0 static WamWord buff_save_machine_regs[NB_OF_USED_MACHINE_REGS]; #endif static int atom_var; static int atom_string; static int atom_punct; static int atom_atom; static int atom_back_quotes; static int atom_full_stop; static int atom_extend; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Read_Next_Token(Bool comma_is_punct); static WamWord Parse_Term(int cur_prec, int context, Bool comma_is_punct); static WamWord Parse_Args_Of_Functor(int atom); static WamWord Parse_Bracketed_Term(void); static WamWord Parse_List(Bool can_be_empty); static WamWord Create_Structure(int func, int arity, WamWord *arg); static int Lookup_In_Dico_Var(char *name); static void Parse_Error(char *err_msg); #define Unget_Token tok_present = TRUE #define Update_Last_Read_Position \ { \ last_read_line = token.line; \ last_read_col = token.col; \ } /*-------------------------------------------------------------------------* * PARSE_SUPP_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Parse_Supp_Initializer(void) { atom_var = Create_Atom("var"); atom_string = Create_Atom("string"); atom_punct = Create_Atom("punct"); atom_atom = Create_Atom("atom"); atom_back_quotes = Create_Atom("back_quotes"); atom_full_stop = Create_Atom("full_stop"); atom_extend = Create_Atom("extend"); } /*-------------------------------------------------------------------------* * READ_NEXT_TOKEN * * * *-------------------------------------------------------------------------*/ static void Read_Next_Token(Bool comma_is_punct) { char *err_msg; if (tok_present) tok_present = FALSE; else if ((err_msg = Scan_Token(pstm_i, comma_is_punct)) != NULL) Parse_Error(err_msg); } /*-------------------------------------------------------------------------* * READ_TERM * * * * Returns a Prolog term as a WAM word or NOT_A_WAM_WORD on syntax error. * * parse_end_of_term controls the end of term (see parse_supp.h). * * Uses the value of: FLAG_DOUBLE_QUOTES, FLAG_BACK_QUOTES * *-------------------------------------------------------------------------*/ WamWord Read_Term(StmInf *pstm, int parse_end_of_term) { int jmp_val; WamWord term; int save_use_le_prompt = use_le_prompt; use_le_prompt = 1; parse_nb_var = 0; last_read_line = -1; pstm_i = pstm; tok_present = FALSE; Save_Machine_Regs(buff_save_machine_regs); jmp_val = setjmp(jumper); Restore_Machine_Regs(buff_save_machine_regs); if (jmp_val == 0) { term = Parse_Term(MAX_PREC, GENERAL_TERM, COMMA_ANY); Read_Next_Token(COMMA_ANY); if (term == NOT_A_WAM_WORD) { if (token.type == TOKEN_END_OF_FILE) { term = Put_Atom(atom_end_of_file); goto finish; } else Parse_Error("expression expected"); } if (parse_end_of_term == PARSE_END_OF_TERM_DOT) { if (token.type == TOKEN_FULL_STOP) goto finish; else { Unget_Token; Parse_Error(". or operator expected after expression"); } } /* parse_end_of_term == PARSE_END_OF_TERM_EOF */ if (token.type == TOKEN_END_OF_FILE) goto finish; else { Unget_Token; Parse_Error("eof or operator expected after expression"); } } else /* Syntax Error (Restore) */ { Restore_Machine_Regs(buff_save_machine_regs); term = NOT_A_WAM_WORD; } finish: use_le_prompt = save_use_le_prompt; return term; } /*-------------------------------------------------------------------------* * PARSE_TERM * * * * Recursively parses a term whose precedence is <=cur_prec and returns a * * WamWord associated to the term. If a syntax error is encountered the * * parser returns NOT_A_WAM_WORD and update syntax error information * * (see Set_Last_Syntax_Error_Info() in error_supp.c). * * The flag comma_is_punct specifies if an eventual ',' following the term * * must be considered as a punctuation (separator of args of compound term * * or of a list) or as an atom. The value COMMA_ANY is used when this flag * * is not relevant (only for comprehensivity). * * Since the Scan_Token() only consumes necessary characters, the function * * Stream_Peekc() returns the character immediately after the token. * * This feature is used to detect negative numbers and open bracket * * (thus the next call to Scan_Token() will return TOKEN_IMMEDIAT_OPEN). * * We use Scan_Peek_Char() instead of Stream_Peekc() only to deal with * * character conversion. * *-------------------------------------------------------------------------*/ static WamWord Parse_Term(int cur_prec, int context, Bool comma_is_punct) { Bool bracket; int atom; OperInf *oper; Bool infix_op; int cur_left = 0; int i; int flag_value; WamWord term, term1; WamWord w[2]; Bool left_is_op = FALSE; Read_Next_Token(context != TRYING_PREFIX || comma_is_punct); if (last_read_line == -1) Update_Last_Read_Position; switch (token.type) { case TOKEN_VARIABLE: i = Lookup_In_Dico_Var(token.name); if (++parse_dico_var[i].nb_of_uses == 1) /* first occurence */ { term = Put_X_Variable(); parse_dico_var[i].word = term; } else /* other occurence */ term = parse_dico_var[i].word; break; case TOKEN_INTEGER: term = Put_Integer(token.int_num); break; case TOKEN_FLOAT: term = Put_Float(token.float_num); break; case TOKEN_STRING: case TOKEN_BACK_QUOTED: /* undefined in ISO */ flag_value = (token.type == TOKEN_STRING) ? Flag_Value(FLAG_DOUBLE_QUOTES) : Flag_Value(FLAG_BACK_QUOTES); flag_value &= FLAG_AS_PART_MASK; if (flag_value == FLAG_AS_ATOM) { atom = Create_Allocate_Atom(token.name); goto a_name; } i = strlen(token.name); term = NIL_WORD; /* faster than Put_Nil() */ while (i--) { term1 = Put_List(); if (flag_value == FLAG_AS_CODES) Unify_Integer(token.name[i]); else Unify_Atom(ATOM_CHAR(token.name[i])); Unify_Value(term); term = term1; } break; case TOKEN_IMMEDIAT_OPEN: token.punct = '('; /* and then like TOKEN_PUNCTUATION */ case TOKEN_PUNCTUATION: if (!strchr("({[", token.punct)) { term = NOT_A_WAM_WORD; goto finish; } atom = (token.punct == '{') ? atom_curly_brackets : ATOM_NIL; term = Parse_Bracketed_Term(); if (term == NOT_A_WAM_WORD) /* name: {} or [] */ goto a_name; break; case TOKEN_NAME: atom = Create_Allocate_Atom(token.name); a_name: bracket = (Scan_Peek_Char(pstm_i, TRUE) == '('); if (bracket) { term = Parse_Args_Of_Functor(atom); break; } /* maybe a prefix operator */ if ((oper = Lookup_Oper(atom, PREFIX)) && cur_prec >= oper->prec) { /* negative number */ if (token.name[0] == '-' && token.name[1] == '\0' && isdigit(Scan_Peek_Char(pstm_i, TRUE))) { Read_Next_Token(COMMA_ANY); term = (token.type == TOKEN_INTEGER) ? Put_Integer(-token.int_num) : Put_Float(-token.float_num); break; } /* try a prefix operator */ cur_left = oper->prec; term = Parse_Term(oper->right, TRYING_PREFIX, comma_is_punct); if (term != NOT_A_WAM_WORD) { term = Create_Structure(atom, 1, &term); break; } /* prefix operator as a name */ if (context != GENERAL_TERM) Parse_Error("expression expected or previous operator needs brackets"); } left_is_op = (Check_Oper_Any_Type(atom)); if (left_is_op && context != GENERAL_TERM) /* in operator context */ { if (Check_Oper(atom, INFIX) || Check_Oper(atom, POSTFIX)) Parse_Error("current or previous operator needs brackets"); else Parse_Error("current operator needs brackets"); } term = Put_Atom(atom); break; default: /* TOKEN_END_OF_FILE, TOKEN_FULL_STOP, TOKEN_EXTENDED */ term = NOT_A_WAM_WORD; goto finish; } for (;;) { Read_Next_Token(comma_is_punct); if (token.type != TOKEN_NAME) break; atom = Create_Allocate_Atom(token.name); if ((oper = Lookup_Oper(atom, INFIX))) infix_op = TRUE; else if ((oper = Lookup_Oper(atom, POSTFIX))) infix_op = FALSE; else break; if (left_is_op) Parse_Error("previous operator needs brackets"); if (cur_prec < oper->prec || cur_left > oper->left) break; if (infix_op) /* infix operator */ { w[0] = term; w[1] = Parse_Term(oper->right, INSIDE_ANY_OP, comma_is_punct); if (w[1] == NOT_A_WAM_WORD) Parse_Error("right operand expected for infix operator"); if (atom == ATOM_CHAR('.')) { term = Put_List(); Unify_Value(w[0]); Unify_Value(w[1]); } else term = Create_Structure(atom, 2, w); } else term = Create_Structure(atom, 1, &term); /* postfix operator */ cur_left = oper->prec; } finish: Unget_Token; return term; } /*-------------------------------------------------------------------------* * PARSE_ARGS_OF_FUNCTOR * * * *-------------------------------------------------------------------------*/ static WamWord Parse_Args_Of_Functor(int atom) { WamWord w[NB_OF_X_REGS]; int i; Read_Next_Token(COMMA_ANY); /* the immediate ( */ i = 0; do { if (i >= MAX_ARITY) Parse_Error("too big compound term (exceeds max_arity)"); w[i] = Parse_Term(MAX_ARG_OF_FUNCTOR_PREC, GENERAL_TERM, TRUE); if (w[i++] == NOT_A_WAM_WORD) Parse_Error("expression expected"); Read_Next_Token(TRUE); } while (token.type == TOKEN_PUNCTUATION && token.punct == ','); if (token.type != TOKEN_PUNCTUATION || token.punct != ')') Parse_Error(", or ) expected"); return Create_Structure(atom, i, w); } /*-------------------------------------------------------------------------* * PARSE_BRACKETED_TERM * * * *-------------------------------------------------------------------------*/ static WamWord Parse_Bracketed_Term(void) { WamWord term; switch (token.punct) { case '(': term = Parse_Term(MAX_PREC, GENERAL_TERM, COMMA_ANY); if (term == NOT_A_WAM_WORD) Parse_Error("expression expected"); Read_Next_Token(COMMA_ANY); if (token.type != TOKEN_PUNCTUATION || token.punct != ')') Parse_Error(") or operator expected"); break; case '{': term = Parse_Term(MAX_PREC, GENERAL_TERM, COMMA_ANY); Read_Next_Token(COMMA_ANY); if (token.type != TOKEN_PUNCTUATION || token.punct != '}') Parse_Error("} or operator expected"); if (term != NOT_A_WAM_WORD) /* term == NOT_A_WAM_WORD if {} */ term = Create_Structure(atom_curly_brackets, 1, &term); break; case '[': term = Parse_List(TRUE); /* term == NOT_A_WAM_WORD if [] */ break; } return term; } /*-------------------------------------------------------------------------* * PARSE_LIST * * * *-------------------------------------------------------------------------*/ static WamWord Parse_List(Bool can_be_empty) { WamWord term; WamWord car_word, cdr_word; car_word = Parse_Term(MAX_ARG_OF_FUNCTOR_PREC, GENERAL_TERM, TRUE); Read_Next_Token(TRUE); if (car_word == NOT_A_WAM_WORD) { if (!can_be_empty) Parse_Error("expression expected in list"); else if (token.type != TOKEN_PUNCTUATION || token.punct != ']') Parse_Error("expression or ] expected in list"); return NOT_A_WAM_WORD; } if (token.type != TOKEN_PUNCTUATION || !strchr(",|]", token.punct)) Parse_Error(", | ] or operator expected in list"); switch (token.punct) { case ',': /* [X,[...]] */ cdr_word = Parse_List(FALSE); break; case '|': /* [X|Y] */ cdr_word = Parse_Term(MAX_ARG_OF_FUNCTOR_PREC, GENERAL_TERM, COMMA_ANY); if (cdr_word == NOT_A_WAM_WORD) Parse_Error("expression expected in list"); Read_Next_Token(TRUE); if (token.type != TOKEN_PUNCTUATION || token.punct != ']') Parse_Error("] or operator expected in list"); break; case ']': /* [X] */ cdr_word = NIL_WORD; /* faster than Put_Nil() */ break; } term = Put_List(); Unify_Value(car_word); Unify_Value(cdr_word); return term; } /*-------------------------------------------------------------------------* * CREATE_STRUCTURE * * * * like Mk_Compound but simplified since we know arity != 0 and arg != NULL* *-------------------------------------------------------------------------*/ static WamWord Create_Structure(int func, int arity, WamWord *arg) { WamWord res_word; int i; if (arity == 2 && func == ATOM_CHAR('.')) { res_word = Put_List(); Unify_Value(arg[0]); Unify_Value(arg[1]); } else { res_word = Put_Structure(func, arity); for (i = 0; i < arity; i++) Unify_Value(arg[i]); } return res_word; } /*-------------------------------------------------------------------------* * LOOKUP_IN_DICO_VAR * * * *-------------------------------------------------------------------------*/ static int Lookup_In_Dico_Var(char *name) { int i; Bool named; if (name[0] != '_' || name[1] != '\0') { named = TRUE; for (i = 0; i < parse_nb_var && strcmp(name, parse_dico_var[i].name) != 0; i++) ; } else { named = FALSE; i = parse_nb_var; } if (i == parse_nb_var) { if (parse_nb_var >= MAX_VAR_IN_TERM) Parse_Error("too many variables in a term"); strcpy(parse_dico_var[parse_nb_var].name, name); parse_dico_var[parse_nb_var].word = NOT_A_WAM_WORD; parse_dico_var[parse_nb_var].named = named; parse_dico_var[parse_nb_var].nb_of_uses = 0; parse_nb_var++; } return i; } /*-------------------------------------------------------------------------* * PARSE_ERROR * * * *-------------------------------------------------------------------------*/ static void Parse_Error(char *err_msg) { Set_Last_Syntax_Error(atom_tbl[pstm_i->atom_file_name].name, token.line, token.col, err_msg); Recover_After_Error(pstm_i); Save_Machine_Regs(buff_save_machine_regs); longjmp(jumper, 1); } /* Other facilities */ /*-------------------------------------------------------------------------* * READ_ATOM * * * * Returns a Prolog atom as a WAM word or NOT_A_WAM_WORD on syntax error. * *-------------------------------------------------------------------------*/ WamWord Read_Atom(StmInf *pstm) { char *err_msg; if ((err_msg = Scan_Next_Atom(pstm)) != NULL) { Set_Last_Syntax_Error(atom_tbl[pstm->atom_file_name].name, token.line, token.col, err_msg); return NOT_A_WAM_WORD; } Update_Last_Read_Position; return Put_Atom(Create_Allocate_Atom(token.name)); } /*-------------------------------------------------------------------------* * READ_INTEGER * * * * Returns a Prolog integer as a WAM word or NOT_A_WAM_WORD on syntax error* *-------------------------------------------------------------------------*/ WamWord Read_Integer(StmInf *pstm) { char *err_msg; if ((err_msg = Scan_Next_Number(pstm, TRUE)) != NULL) { Set_Last_Syntax_Error(atom_tbl[pstm->atom_file_name].name, token.line, token.col, err_msg); return NOT_A_WAM_WORD; } Update_Last_Read_Position; return Put_Integer(token.int_num); } /*-------------------------------------------------------------------------* * READ_NUMBER * * * * Returns a Prolog number as a WAM word or NOT_A_WAM_WORD on syntax error.* *-------------------------------------------------------------------------*/ WamWord Read_Number(StmInf *pstm) { char *err_msg; if ((err_msg = Scan_Next_Number(pstm, FALSE)) != NULL) { Set_Last_Syntax_Error(atom_tbl[pstm->atom_file_name].name, token.line, token.col, err_msg); return NOT_A_WAM_WORD; } Update_Last_Read_Position; return (token.type == TOKEN_INTEGER) ? Put_Integer(token.int_num) : Put_Float(token.float_num); } /*-------------------------------------------------------------------------* * READ_TOKEN * * * * Returns a Prolog token as a WAM word or NOT_A_WAM_WORD on syntax error. * *-------------------------------------------------------------------------*/ WamWord Read_Token(StmInf *pstm) { WamWord term, arg; int func, atom; char *err_msg; if ((err_msg = Scan_Token(pstm, FALSE)) != NULL) { Set_Last_Syntax_Error(atom_tbl[pstm->atom_file_name].name, token.line, token.col, err_msg); return NOT_A_WAM_WORD; } Update_Last_Read_Position; term = NOT_A_WAM_WORD; switch (token.type) { case TOKEN_VARIABLE: func = atom_var; arg_of_struct: atom = Create_Allocate_Atom(token.name); arg = Put_Atom(atom); break; case TOKEN_INTEGER: term = Put_Integer(token.int_num); break; case TOKEN_FLOAT: term = Put_Float(token.float_num); break; case TOKEN_STRING: func = atom_string; goto arg_of_struct; case TOKEN_IMMEDIAT_OPEN: token.punct = '('; /* and then like TOKEN_PUNCTUATION */ case TOKEN_PUNCTUATION: func = atom_punct; atom = ATOM_CHAR(token.punct); arg = Put_Atom(atom); break; case TOKEN_NAME: atom = Create_Allocate_Atom(token.name); term = Put_Atom(atom); break; case TOKEN_BACK_QUOTED: /* undefined in ISO */ func = atom_back_quotes; goto arg_of_struct; case TOKEN_FULL_STOP: func = atom_punct; arg = Put_Atom(atom_full_stop); break; case TOKEN_END_OF_FILE: func = atom_punct; arg = Put_Atom(atom_end_of_file); break; case TOKEN_EXTENDED: func = atom_extend; goto arg_of_struct; } if (term == NOT_A_WAM_WORD) { term = Put_Structure(func, 1); Unify_Value(arg); } return term; } ./gprolog-1.3.0/src/BipsPl/os_interf.pl0000644004425400513100000001741510547162353016314 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : os_interf.pl * * Descr.: operating system interface management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: os_interf.pl,v 1.12 2007/01/04 10:35:11 diaz Exp $ */ :- built_in. '$use_os_interf'. make_directory(PathName) :- set_bip_name(make_directory, 1), '$call_c_test'('Make_Directory_1'(PathName)). delete_directory(PathName) :- set_bip_name(delete_directory, 2), '$call_c_test'('Delete_Directory_1'(PathName)). working_directory(Path) :- set_bip_name(working_directory, 1), '$call_c_test'('Working_Directory_1'(Path)). change_directory(Path) :- set_bip_name(change_directory, 1), '$call_c_test'('Change_Directory_1'(Path)). directory_files(PathName, List) :- set_bip_name(directory_files, 2), '$call_c_test'('Directory_Files_2'(PathName, List)). rename_file(PathName1, PathName2) :- set_bip_name(rename_file, 2), '$call_c_test'('Rename_File_2'(PathName1, PathName2)). unlink(PathName) :- set_bip_name(unlink, 2), '$call_c'('Unlink_1'(PathName)). delete_file(PathName) :- set_bip_name(delete_file, 2), '$call_c_test'('Delete_File_1'(PathName)). file_exists(PathName) :- set_bip_name(file_exists, 1), '$call_c_test'('File_Exists_1'(PathName)). file_permission(PathName, PermList) :- set_bip_name(file_permission, 2), '$call_c_test'('File_Permission_2'(PathName, PermList)). file_property(PathName, Property) :- set_bip_name(file_property, 2), '$check_file_prop'(Property), !, '$file_prop'(Property, PathName). '$check_file_prop'(Property) :- var(Property). '$check_file_prop'(absolute_file_name(_)). '$check_file_prop'(real_file_name(_)). '$check_file_prop'(type(_)). '$check_file_prop'(size(_)). '$check_file_prop'(permission(_)). '$check_file_prop'(creation(_)). '$check_file_prop'(last_access(_)). '$check_file_prop'(last_modification(_)). '$check_file_prop'(Property) :- '$pl_err_domain'(os_file_property, Property). '$file_prop'(absolute_file_name(AbsolutePathName), PathName) :- '$call_c_test'('File_Prop_Absolute_File_Name_2'(AbsolutePathName, PathName)). '$file_prop'(real_file_name(RealPathName), PathName) :- '$call_c_test'('File_Prop_Real_File_Name_2'(RealPathName, PathName)). '$file_prop'(type(Type), PathName) :- '$call_c_test'('File_Prop_Type_2'(Type, PathName)). '$file_prop'(size(Size), PathName) :- '$call_c_test'('File_Prop_Size_2'(Size, PathName)). '$file_prop'(permission(Perm), PathName) :- '$call_c_test'('Check_Prop_Perm_And_File_2'(Perm, PathName)), '$file_prop_perm'(Perm, PathName). '$file_prop'(creation(DateTime), PathName) :- '$sys_var_write'(0, 0), '$call_c_test'('File_Prop_Date_2'(DateTime, PathName)). '$file_prop'(last_access(DateTime), PathName) :- '$sys_var_write'(0, 1), '$call_c_test'('File_Prop_Date_2'(DateTime, PathName)). '$file_prop'(last_modification(DateTime), PathName) :- '$sys_var_write'(0, 2), '$call_c_test'('File_Prop_Date_2'(DateTime, PathName)). '$file_prop_perm'(read, PathName) :- file_permission(PathName, read). '$file_prop_perm'(write, PathName) :- file_permission(PathName, write). '$file_prop_perm'(execute, PathName) :- file_permission(PathName, execute). '$file_prop_perm'(search, PathName) :- file_permission(PathName, search). temporary_name(Template, PathName) :- set_bip_name(temporary_name, 2), '$call_c_test'('Temporary_Name_2'(Template, PathName)). temporary_file(Dir, Prefix, PathName) :- set_bip_name(temporary_file, 3), '$call_c_test'('Temporary_File_3'(Dir, Prefix, PathName)). date_time(DateTime) :- set_bip_name(date_time, 1), '$call_c_test'('Date_Time_1'(DateTime)). host_name(HostName) :- set_bip_name(host_name, 1), '$call_c_test'('Host_Name_1'(HostName)). os_version(OsVersion) :- set_bip_name(os_version, 1), '$call_c_test'('Os_Version_1'(OsVersion)). architecture(Architecture) :- set_bip_name(architecture, 1), '$call_c_test'('Architecture_1'(Architecture)). shell :- set_bip_name(shell, 0), '$call_c_test'('Shell_2'('', 0)). shell(Cmd) :- set_bip_name(shell, 1), '$call_c_test'('Shell_2'(Cmd, 0)). shell(Cmd, Status) :- set_bip_name(shell, 2), '$call_c_test'('Shell_2'(Cmd, Status)). system(Cmd) :- set_bip_name(system, 1), '$call_c_test'('System_2'(Cmd, 0)). system(Cmd, Status) :- set_bip_name(system, 2), '$call_c_test'('System_2'(Cmd, Status)). spawn(Cmd, LArg) :- set_bip_name(spawn, 2), '$call_c_test'('Spawn_3'(Cmd, LArg, 0)). spawn(Cmd, LArg, Status) :- set_bip_name(spawn, 3), '$call_c_test'('Spawn_3'(Cmd, LArg, Status)). sleep(Seconds) :- set_bip_name(sleep, 1), '$call_c'('Sleep_1'(Seconds)). popen(Cmd, Mode, Stream) :- set_bip_name(popen, 3), '$get_open_stm'(Stream, Stm), '$call_c_test'('Popen_3'(Cmd, Mode, Stm)). % exec mask in sys_var[0]: % b0 % 0/1 % Pid used exec(Cmd, StreamIn, StreamOut, StreamErr, Pid) :- set_bip_name(exec, 5), ( nonvar(Pid) -> '$pl_err_type'(variable, Pid) ; true ), '$sys_var_write'(0, 0), '$sys_var_set_bit'(0, 0), '$exec'(Cmd, StreamIn, StreamOut, StreamErr, Pid). exec(Cmd, StreamIn, StreamOut, StreamErr) :- set_bip_name(exec, 4), '$sys_var_write'(0, 0), '$exec'(Cmd, StreamIn, StreamOut, StreamErr, 0). '$exec'(Cmd, StreamIn, StreamOut, StreamErr, Pid) :- '$get_open_stm'(StreamIn, StmIn), '$get_open_stm'(StreamOut, StmOut), '$get_open_stm'(StreamErr, StmErr), '$call_c_test'('Exec_5'(Cmd, StmIn, StmOut, StmErr, Pid)). create_pipe(StreamIn, StreamOut) :- set_bip_name(create_pipe, 2), '$get_open_stm'(StreamIn, StmIn), '$get_open_stm'(StreamOut, StmOut), '$call_c_test'('Create_Pipe_2'(StmIn, StmOut)). fork_prolog(Pid) :- set_bip_name(fork_prolog, 1), ( nonvar(Pid) -> '$pl_err_type'(variable, Pid) ; true ), '$call_c_test'('Fork_Prolog_1'(Pid)). select(Reads, ReadyReads, Writes, ReadyWrites, TimeOut) :- set_bip_name(select, 5), '$call_c_test'('Select_5'(Reads, ReadyReads, Writes, ReadyWrites, TimeOut)). prolog_pid(PrologPid) :- set_bip_name(prolog_pid, 1), '$call_c_test'('Prolog_Pid_1'(PrologPid)). send_signal(Pid, Signal) :- set_bip_name(send_signal, 2), '$call_c_test'('Send_Signal_2'(Pid, Signal)). wait(Pid, Status) :- set_bip_name(wait, 2), '$call_c_test'('Wait_2'(Pid, Status)). ./gprolog-1.3.0/src/BipsPl/control_c.c0000644004425400513100000001230510547154135016105 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : control_c.c * * Descr.: control management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: control_c.c,v 1.12 2007/01/04 10:35:09 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ #define FOR_ALT X24666F725F616C74 Prolog_Prototype(FOR_ALT, 0); /*-------------------------------------------------------------------------* * HALT_IF_NO_TOP_LEVEL_1 * * * *-------------------------------------------------------------------------*/ WamCont Halt_If_No_Top_Level_1(WamWord exit_code_word) { PredInf *pred; int x; x = Rd_Integer_Check(exit_code_word); if (SYS_VAR_TOP_LEVEL == 0) /* no top level running */ Exit_With_Value(x); pred = Lookup_Pred(Create_Atom((x) ? "$top_level_abort" : "$top_level_stop"), 0); if (pred == NULL) /* should not occur */ Exit_With_Value(x); return (WamCont) (pred->codep); } /*-------------------------------------------------------------------------* * HALT_1 * * * *-------------------------------------------------------------------------*/ void Halt_1(WamWord exit_code_word) { Exit_With_Value(Rd_Integer_Check(exit_code_word)); } /*-------------------------------------------------------------------------* * FOR_3 * * * *-------------------------------------------------------------------------*/ Bool For_3(WamWord i_word, WamWord l_word, WamWord u_word) { WamWord word, tag_mask; int i, l, u; l = Rd_Integer_Check(l_word); u = Rd_Integer_Check(u_word); DEREF(i_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) { i = Rd_Integer_Check(word); return i >= l && i <= u; } i_word = word; if (l > u) return FALSE; /* here i_word is a variable */ if (l < u) /* non deterministic case */ { A(0) = i_word; A(1) = l + 1; A(2) = u; Create_Choice_Point((CodePtr) Prolog_Predicate(FOR_ALT, 0), 3); } return Get_Integer(l, i_word); /* always TRUE */ } /*-------------------------------------------------------------------------* * FOR_ALT_0 * * * *-------------------------------------------------------------------------*/ void For_Alt_0(void) { WamWord i_word; int l, u; Update_Choice_Point((CodePtr) Prolog_Predicate(FOR_ALT, 0), 0); i_word = AB(B, 0); l = AB(B, 1); u = AB(B, 2); /* here i_word is a variable */ if (l == u) Delete_Last_Choice_Point(); else /* non deterministic case */ { #if 0 /* the following data is unchanged */ AB(B,0)=i_word; #endif AB(B, 1) = l + 1; #if 0 /* the following data is unchanged */ AB(B,2)=u; #endif } Get_Integer(l, i_word); /* always TRUE */ } ./gprolog-1.3.0/src/BipsPl/expand_c.c0000644004425400513100000002671610547154135015717 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : expand_c.c * * Descr.: expand term management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: expand_c.c,v 1.13 2007/01/04 10:35:09 diaz Exp $ */ #include #define OBJ_INIT Expand_Initializer #include "engine_pl.h" #include "bips_pl.h" #ifndef _WIN32 #include #include #endif /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static WamWord *top; static Bool opt_term_unif; static int atom_clause; static int atom_phrase; static int atom_if; static WamWord dcg_2; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static WamWord Dcg_Head(WamWord dcg_head_word, WamWord *in_word, WamWord *out_word, WamWord **end_lst_adr); static WamWord Dcg_Body(WamWord dcg_body_word, Bool for_alt, WamWord in_word, WamWord out_word, WamWord *end_lst_adr); static void Dcg_Body_On_Stack(WamWord dcg_body_word, WamWord in_word, WamWord out_word); static void Dcg_Term_List_On_Stack(WamWord *lst_adr, WamWord in_word, WamWord out_word); static WamWord Dcg_Compound2(int func, WamWord w1, WamWord w2); /*-------------------------------------------------------------------------* * EXPAND_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Expand_Initializer(void) { int atom_dcg; atom_dcg = Create_Atom("-->"); atom_clause = Create_Atom(":-"); atom_phrase = Create_Atom("phrase"); atom_if = Create_Atom("->"); dcg_2 = Functor_Arity(atom_dcg, 2); } /*-------------------------------------------------------------------------* * DCG_TRANS_RULE_2 * * * *-------------------------------------------------------------------------*/ Bool Dcg_Trans_Rule_2(WamWord rule_word, WamWord clause_word) { WamWord word, tag_mask; WamWord *adr; WamWord in_word, out_word; WamWord head_word, body_word; WamWord *end_lst_adr; DEREF(rule_word, word, tag_mask); adr = UnTag_STC(word); if (tag_mask != TAG_STC_MASK || Functor_And_Arity(adr) != dcg_2) return FALSE; top = Local_Top; /* use local stack for the stack */ opt_term_unif = TRUE; head_word = Dcg_Head(Arg(adr, 0), &in_word, &out_word, &end_lst_adr); body_word = Dcg_Body(Arg(adr, 1), FALSE, in_word, out_word, end_lst_adr); Get_Structure(atom_clause, 2, clause_word); Unify_Value(head_word); Unify_Value(body_word); return TRUE; } /*-------------------------------------------------------------------------* * DCG_TRANS_BODY_4 * * * *-------------------------------------------------------------------------*/ Bool Dcg_Trans_Body_4(WamWord dcg_body_word, WamWord in_word, WamWord out_word, WamWord body_word) { top = Local_Top; /* use local stack for the stack */ opt_term_unif = TRUE; in_word = Globalize_If_In_Local(in_word); out_word = Globalize_If_In_Local(out_word); return Unify(body_word, Dcg_Body(dcg_body_word, FALSE, in_word, out_word, NULL)); } /*-------------------------------------------------------------------------* * DCG_HEAD * * * *-------------------------------------------------------------------------*/ static WamWord Dcg_Head(WamWord dcg_head_word, WamWord *in_word, WamWord *out_word, WamWord **end_lst_adr) { WamWord word, tag_mask; WamWord *adr; WamWord *save_H, *p; int func, arity; Bool first; first = TRUE; *end_lst_adr = NULL; start: adr = Rd_Callable_Check(dcg_head_word, &func, &arity); if (first && arity == 2 && func == ATOM_CHAR(',')) { first = FALSE; dcg_head_word = *adr++; DEREF(*adr, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word != NIL_WORD) { if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, word); *end_lst_adr = UnTag_LST(word); } goto start; } p = save_H = H; *p++ = Functor_Arity(func, arity + 2); while (arity--) *p++ = *adr++; adr = p; *p++ = *in_word = Make_Self_Ref(adr); adr = p; *p++ = *out_word = Make_Self_Ref(adr); H = p; return Tag_STC(save_H); } /*-------------------------------------------------------------------------* * DCG_BODY * * * *-------------------------------------------------------------------------*/ static WamWord Dcg_Body(WamWord dcg_body_word, Bool in_alt, WamWord in_word, WamWord out_word, WamWord *end_lst_adr) { WamWord new_out_word, word; WamWord *save_H, *p; WamWord *save_top = top; Bool save_opt_term_unif = opt_term_unif; WamWord *base; if (end_lst_adr) goto new_out_var; if (in_alt) { top++; new_out_var: new_out_word = Mk_Variable(); } else new_out_word = out_word; base = top; Dcg_Body_On_Stack(dcg_body_word, in_word, new_out_word); if (end_lst_adr) Dcg_Term_List_On_Stack(end_lst_adr, out_word, new_out_word); else if (in_alt) { if (Blt_Term_Eq(in_word, new_out_word)) *--base = Dcg_Compound2(ATOM_CHAR('='), new_out_word, out_word); else Unify(new_out_word, out_word); } if (top == base) { word = Tag_ATM(atom_true); goto finish; } word = *--top; while (top > base) { p = save_H = H; *p++ = Functor_Arity(ATOM_CHAR(','), 2); *p++ = *--top; *p++ = word; H = p; word = Tag_STC(save_H); } finish: top = save_top; opt_term_unif = save_opt_term_unif; return word; } /*-------------------------------------------------------------------------* * DCG_BODY_ON_STACK * * * *-------------------------------------------------------------------------*/ static void Dcg_Body_On_Stack(WamWord dcg_body_word, WamWord in_word, WamWord out_word) { WamWord word, tag_mask; WamWord *adr; WamWord w1, w2; WamWord *save_H, *p; int func, arity; DEREF(dcg_body_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) { adr = UnTag_REF(word); func = atom_phrase; arity = 1; goto non_term; } if (word == NIL_WORD) { in_is_out: Unify(in_word, out_word); return; } if (tag_mask == TAG_LST_MASK) { Dcg_Term_List_On_Stack(UnTag_LST(word), in_word, out_word); return; } adr = Rd_Callable_Check(word, &func, &arity); if (arity != 2 || func != ATOM_CHAR(',')) opt_term_unif = FALSE; if (arity == 2) { if (func == ATOM_CHAR(',')) { word = Mk_Variable(); Dcg_Body_On_Stack(*adr++, in_word, word); Dcg_Body_On_Stack(*adr, word, out_word); return; } if (func == atom_if) { word = Mk_Variable(); w1 = Dcg_Body(*adr++, FALSE, in_word, word, NULL); w2 = Dcg_Body(*adr, FALSE, word, out_word, NULL); *top++ = Dcg_Compound2(func, w1, w2); return; } if (func == ATOM_CHAR(';')) { w1 = Dcg_Body(*adr++, TRUE, in_word, out_word, NULL); w2 = Dcg_Body(*adr, TRUE, in_word, out_word, NULL); *top++ = Dcg_Compound2(func, w1, w2); return; } } if (arity == 0 && func == ATOM_CHAR('!')) { *top++ = dcg_body_word; goto in_is_out; } if (arity == 1 && func == atom_curly_brackets) { *top++ = *adr; goto in_is_out; } /* other callable term = non terminal */ non_term: p = save_H = H; *p++ = Functor_Arity(func, arity + 2); while (arity--) *p++ = *adr++; *p++ = in_word; *p++ = out_word; H = p; *top++ = Tag_STC(save_H); } /*-------------------------------------------------------------------------* * DCG_TERM_LIST_ON_STACK * * * *-------------------------------------------------------------------------*/ static void Dcg_Term_List_On_Stack(WamWord *lst_adr, WamWord in_word, WamWord out_word) { WamWord word, tag_mask; WamWord *adr; WamWord *save_lst_adr = lst_adr; WamWord *save_H, *p; p = save_H = H; for (;;) { *p++ = Car(lst_adr); DEREF(Cdr(lst_adr), word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, Tag_LST(save_lst_adr)); lst_adr = UnTag_LST(word); adr = p + 1; *p++ = Tag_LST(adr); } *p++ = out_word; H = p; word = Tag_LST(save_H); if (opt_term_unif) Unify(in_word, word); else { opt_term_unif = TRUE; *top++ = Dcg_Compound2(ATOM_CHAR('='), in_word, word); } } /*-------------------------------------------------------------------------* * DCG_COMPOUND2 * * * *-------------------------------------------------------------------------*/ static WamWord Dcg_Compound2(int func, WamWord w1, WamWord w2) { WamWord *save_H, *p; p = save_H = H; *p++ = Functor_Arity(func, 2); *p++ = w1; *p++ = w2; H = p; return Tag_STC(save_H); } ./gprolog-1.3.0/src/BipsPl/g_var_inl_c.c0000644004425400513100000011651410547154136016375 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : g_var_inl_c.c * * Descr.: global variable (inline) management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: g_var_inl_c.c,v 1.14 2007/01/04 10:35:10 diaz Exp $ */ #include #define OBJ_INIT G_Var_Initializer #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ #define G_INITIAL_VALUE Tag_INT(0) #define G_ARRAY 0 #define G_ARRAY_AUTO 1 #define G_ARRAY_EXTEND 2 #define G_IMPOSSIBLE_SIZE ((unsigned int) -1 >> 1) #define MAX_AUTO_SIZE (1 << 20) /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct gundo *PGUndo; typedef struct /* Global variable element */ { /* ------------------------------ */ int size; /* <0:-array dim, 0:link, >0:copy */ WamWord val; /* ptr to GVarElt or term or adr */ PGUndo undo; /* ptr to 1st undo for this elem */ } GVarElt; typedef struct gundo /* Undo record */ { /* ------------------------------ */ GVarElt *g_elem; /* elem to restore (NULL=invalid) */ int save_size; /* size to restore */ WamWord save_val; /* value to restore */ PGUndo next; /* chain to next undo entry */ PGUndo prev; /* chain to previous undo entry */ } GUndo; typedef struct /* Target designator record */ { /* ------------------------------ */ GVarElt *g_elem; /* element */ WamWord *g_arg; /* ptr to sub-term (or NULL) */ } GTarget; /*---------------------------------* * Global Variables * *---------------------------------*/ static GVarElt *g_var_tbl[MAX_ATOM]; static GTarget g_target; static int atom_g_array; static int atom_g_array_auto; static int atom_g_array_extend; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void G_Assign(WamWord gvar_word, WamWord gval_word, Bool backtrack, Bool copy); static void G_Assign_Element(GVarElt *g_elem, WamWord gval_word, Bool backtrack, Bool copy); static void G_Assign_Arg(GVarElt *g_elem, WamWord *g_arg, WamWord word); static void G_Assign_Array(GVarElt *g_elem, WamWord *stc_adr, int array_op, Bool backtrack, Bool copy); static GVarElt *G_Alloc_Array(GVarElt *g_elem, int new_size, Bool backtrack); static GTarget *Get_Target_From_Gvar(WamWord gvar_word); static GTarget *Get_Target_From_Selector(WamWord *stc_adr); static WamWord *Get_Term_Addr_From_Target(GTarget *gt); static WamWord *Get_Int_Addr_From_Gvar(WamWord gvar_word); static long Get_Int_From_Gvar(WamWord gvar_word); static long Get_Int_From_Word(WamWord start_word); static void G_Free_Element(GVarElt *g_elem, Bool reinit_undo); static void G_Copy_Element(GVarElt *dst_g_elem, GVarElt *src_g_elem); static void G_Trail_For_Backtrack(GVarElt *g_elem, int save_size, WamWord save_val); static void G_Untrail(int n, WamWord *arg_frame); static Bool G_Read(WamWord gvar_word, WamWord gval_word); static Bool G_Read_Element(GVarElt *g_elem, WamWord gval_word); static Bool G_Array_Size(WamWord gvar_word, WamWord size_word); static Bool G_Inc_Dec(WamWord gvar_word, int inc, WamWord old_word, WamWord new_word); static void G_Set_Bit(WamWord gvar_word, WamWord bit_word); static void G_Reset_Bit(WamWord gvar_word, WamWord bit_word); static Bool G_Test_Set_Bit(WamWord gvar_word, WamWord bit_word); static Bool G_Test_Reset_Bit(WamWord gvar_word, WamWord bit_word); /*-------------------------------------------------------------------------* * G_VAR_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void G_Var_Initializer(void) { atom_g_array = Create_Atom("g_array"); atom_g_array_auto = Create_Atom("g_array_auto"); atom_g_array_extend = Create_Atom("g_array_extend"); } /*-------------------------------------------------------------------------* * BLT_G_ASSIGN * * * *-------------------------------------------------------------------------*/ void FC Blt_G_Assign(WamWord x, WamWord y) { Set_C_Bip_Name("g_assign", 2); G_Assign(x, y, FALSE, TRUE); Unset_C_Bip_Name(); } /*-------------------------------------------------------------------------* * BLT_G_ASSIGNB * * * *-------------------------------------------------------------------------*/ void FC Blt_G_Assignb(WamWord x, WamWord y) { Set_C_Bip_Name("g_assignb", 2); G_Assign(x, y, TRUE, TRUE); Unset_C_Bip_Name(); } /*-------------------------------------------------------------------------* * BLT_G_LINK * * * *-------------------------------------------------------------------------*/ void FC Blt_G_Link(WamWord x, WamWord y) { Set_C_Bip_Name("g_link", 2); G_Assign(x, y, TRUE, FALSE); Unset_C_Bip_Name(); } /*-------------------------------------------------------------------------* * BLT_G_READ * * * *-------------------------------------------------------------------------*/ Bool FC Blt_G_Read(WamWord x, WamWord y) { Bool res; Set_C_Bip_Name("g_read", 2); res = G_Read(x, y); Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * BLT_G_ARRAY_SIZE * * * *-------------------------------------------------------------------------*/ Bool FC Blt_G_Array_Size(WamWord x, WamWord y) { Bool res; Set_C_Bip_Name("g_array_size", 2); res = G_Array_Size(x, y); Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * BLT_G_INC * * * *-------------------------------------------------------------------------*/ void FC Blt_G_Inc(WamWord x) { Set_C_Bip_Name("g_inc", 1); G_Inc_Dec(x, 1, NOT_A_WAM_WORD, NOT_A_WAM_WORD); Unset_C_Bip_Name(); } /*-------------------------------------------------------------------------* * BLT_G_INCO * * * *-------------------------------------------------------------------------*/ Bool FC Blt_G_Inco(WamWord x, WamWord y) { Bool res; Set_C_Bip_Name("g_inco", 2); res = G_Inc_Dec(x, 1, y, NOT_A_WAM_WORD); Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * BLT_G_INC_2 * * * *-------------------------------------------------------------------------*/ Bool FC Blt_G_Inc_2(WamWord x, WamWord y) { Bool res; Set_C_Bip_Name("g_inc", 2); res = G_Inc_Dec(x, 1, NOT_A_WAM_WORD, y); Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * BLT_G_INC_3 * * * *-------------------------------------------------------------------------*/ Bool FC Blt_G_Inc_3(WamWord x, WamWord y, WamWord z) { Bool res; Set_C_Bip_Name("g_inc", 3); res = G_Inc_Dec(x, 1, y, z); Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * BLT_G_DEC * * * *-------------------------------------------------------------------------*/ void FC Blt_G_Dec(WamWord x) { Set_C_Bip_Name("g_dec", 1); G_Inc_Dec(x, -1, NOT_A_WAM_WORD, NOT_A_WAM_WORD); Unset_C_Bip_Name(); } /*-------------------------------------------------------------------------* * BLT_G_DECO * * * *-------------------------------------------------------------------------*/ Bool FC Blt_G_Deco(WamWord x, WamWord y) { Bool res; Set_C_Bip_Name("g_deco", 2); res = G_Inc_Dec(x, -1, y, NOT_A_WAM_WORD); Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * BLT_G_DEC_2 * * * *-------------------------------------------------------------------------*/ Bool FC Blt_G_Dec_2(WamWord x, WamWord y) { Bool res; Set_C_Bip_Name("g_dec", 2); res = G_Inc_Dec(x, -1, NOT_A_WAM_WORD, y); Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * BLT_G_DEC_3 * * * *-------------------------------------------------------------------------*/ Bool FC Blt_G_Dec_3(WamWord x, WamWord y, WamWord z) { Bool res; Set_C_Bip_Name("g_dec", 3); res = G_Inc_Dec(x, -1, y, z); Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * BLT_G_SET_BIT * * * *-------------------------------------------------------------------------*/ void FC Blt_G_Set_Bit(WamWord x, WamWord y) { Set_C_Bip_Name("g_set_bit", 2); G_Set_Bit(x, y); Unset_C_Bip_Name(); } /*-------------------------------------------------------------------------* * BLT_G_RESET_BIT * * * *-------------------------------------------------------------------------*/ void FC Blt_G_Reset_Bit(WamWord x, WamWord y) { Set_C_Bip_Name("g_reset_bit", 2); G_Reset_Bit(x, y); Unset_C_Bip_Name(); } /*-------------------------------------------------------------------------* * BLT_G_TEST_SET_BIT * * * *-------------------------------------------------------------------------*/ Bool FC Blt_G_Test_Set_Bit(WamWord x, WamWord y) { Bool res; Set_C_Bip_Name("g_test_set_bit", 2); res = G_Test_Set_Bit(x, y); Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * BLT_G_TEST_RESET_BIT * * * *-------------------------------------------------------------------------*/ Bool FC Blt_G_Test_Reset_Bit(WamWord x, WamWord y) { Bool res; Set_C_Bip_Name("g_test_reset_bit", 2); res = G_Test_Reset_Bit(x, y); Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * Global variable management * * * * A global variable allows the user to associate an information to an atom* * There are 3 types of information (2 basic types + 1 constructor): * * * * - copy of a term, builtin: g_assign[b](Gvar, Term) * * - link to a term, builtin: g_link(Gvar, Term) * * - array of k infos, builtin: g_{assign[b]/link}(Gvar, g_array(...)) * * * * The assignments can be backtrackble (g_assignb/g_link) or not (g_assign)* * (backtrackable = assignments are undone when backtracking occurs). * * * * Internal represention: * * * * An information has a type GVarElt which is a structure with 3 fields * * 'size' (indicating the type of the element), 'val' and 'undo': * * * * size<0: an array of -size + 1 elements, * * val (GVarElt *) points the first element. * * after the -size elements there is an additional elem whose size:* * = G_IMPOSSIBLE_SIZE to indicate a non-auto extendible array * * != G_IMPOSSIBLE_SIZE indicate the elem to initialize new elems * * * * size=0: a link to a term, * * val (WamWord) is the staring word of the term. * * * * size>0: a copy of a term whose size is 'size', * * val (WamWord *) is the address of the copy of the term * * (space for the copy obtained by malloc). * * * * 'undo': points to an undo record which will be activated at backtracking* * when untrail occurs. Basically an undo record contains the * * address of the GVarElt to restore and the data to restore * * (size and val). Since several undo operation can be attached to * * a GVarElt, the undo records are chained (dobly linked chain). * * When an undo entry becomes invalid, the address of the GVarElt * * to restore is set to NULL, e.g: * * g_assign(t,1), g_assignb(t,2), g_assign(t,3). * * after g_assignb(t,2) there is an undo record for t which is * * invalidated when g_assign(t,3) occurs. * * The undo records are mallocated but could be put in the TRAIL * * as the frame argument for the function call (TFC). * *-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------* * G_ASSIGN * * * *-------------------------------------------------------------------------*/ static void G_Assign(WamWord gvar_word, WamWord gval_word, Bool backtrack, Bool copy) { GTarget *gt = Get_Target_From_Gvar(gvar_word); GVarElt *g_elem = gt->g_elem; WamWord *g_arg = gt->g_arg; if (g_arg != NULL) /* arg selector given */ { if (backtrack) Pl_Err_Domain(domain_g_argument_selector, gvar_word); G_Assign_Arg(g_elem, g_arg, gval_word); } else G_Assign_Element(g_elem, gval_word, backtrack, copy); } /*-------------------------------------------------------------------------* * G_ASSIGN_ELEMENT * * * *-------------------------------------------------------------------------*/ static void G_Assign_Element(GVarElt *g_elem, WamWord gval_word, Bool backtrack, Bool copy) { WamWord word, tag_mask; WamWord *adr; int size; int atom; int save_size; WamWord save_val; int array_op; save_size = g_elem->size; save_val = g_elem->val; DEREF(gval_word, word, tag_mask); if (tag_mask != TAG_STC_MASK) goto not_an_array; adr = UnTag_STC(word); atom = Functor(adr); if (atom == atom_g_array) array_op = G_ARRAY; else if (atom == atom_g_array_auto) array_op = G_ARRAY_AUTO; else if (atom == atom_g_array_extend) array_op = G_ARRAY_EXTEND; else goto not_an_array; /* an array */ G_Assign_Array(g_elem, adr, array_op, backtrack, copy); goto finish; not_an_array: if (!backtrack) G_Free_Element(g_elem, TRUE); if (!copy || tag_mask == TAG_ATM_MASK || tag_mask == TAG_INT_MASK) { /* a link */ if (tag_mask == TAG_REF_MASK && Is_A_Local_Adr(adr = UnTag_REF(word))) Globalize_Local_Unbound_Var(adr, word); g_elem->size = 0; Do_Copy_Of_Word(tag_mask, word); g_elem->val = word; goto finish; } /* a copy */ size = Term_Size(word); adr = (WamWord *) Malloc(size * sizeof(WamWord)); g_elem->size = size; g_elem->val = (WamWord) adr; Copy_Term(adr, &word); finish: if (backtrack) G_Trail_For_Backtrack(g_elem, save_size, save_val); } /*-------------------------------------------------------------------------* * G_ASSIGN_ARG * * * *-------------------------------------------------------------------------*/ static void G_Assign_Arg(GVarElt *g_elem, WamWord *g_arg, WamWord word) { WamWord *adr; int size; GUndo *u; if (Term_Size(*g_arg) == 1 && Term_Size(word) == 1) { Copy_Term(g_arg, &word); /* simulate the G_Free_Element */ for(u = g_elem->undo; u; u = u->next) u->g_elem = NULL; /* invalidate this entry */ g_elem->undo = NULL; return; } /* similar to g_read + g_assign */ *g_arg = word; /* set the argument */ Copy_Term(H, (WamWord *) g_elem->val); G_Free_Element(g_elem, TRUE); size = Term_Size(*H); adr = (WamWord *) Malloc(size * sizeof(WamWord)); g_elem->size = size; g_elem->val = (WamWord) adr; Copy_Contiguous_Term(adr, H); } /*-------------------------------------------------------------------------* * G_ASSIGN_ARRAY * * * *-------------------------------------------------------------------------*/ static void G_Assign_Array(GVarElt *g_elem, WamWord *stc_adr, int array_op, Bool backtrack, Bool copy) { WamWord word, tag_mask; int arity; Bool same_init_value; WamWord init_word; WamWord lst_word; int new_size, size; GVarElt *p; int i; arity = Arity(stc_adr); DEREF(Arg(stc_adr, 0), word, tag_mask); new_size = (tag_mask == TAG_LST_MASK) ? List_Length(word) : UnTag_INT(word); if (!(new_size > 0 && ((tag_mask == TAG_INT_MASK && arity <= 2) || (tag_mask == TAG_LST_MASK && arity == 1)))) Pl_Err_Domain(domain_g_array_index, Tag_STC(stc_adr)); if (tag_mask == TAG_INT_MASK) { same_init_value = TRUE; init_word = (arity == 1) ? G_INITIAL_VALUE : Arg(stc_adr, 1); } else { same_init_value = FALSE; lst_word = word; } if (array_op == G_ARRAY_EXTEND && g_elem->size >= 0) array_op = G_ARRAY; if (array_op != G_ARRAY_EXTEND && !backtrack) { G_Free_Element(g_elem, TRUE); g_elem->size = 0; } size = -g_elem->size; p = G_Alloc_Array(g_elem, new_size, backtrack); if (array_op == G_ARRAY_EXTEND) { if (!same_init_value) for(i = 0; i < size; i++) /* skip size 1st elems of list */ { Get_List(lst_word); init_word = Unify_Variable(); lst_word = Unify_Variable(); } i = size; p += size; } else i = 0; for (; i < new_size; i++) { if (!same_init_value) { Get_List(lst_word); init_word = Unify_Variable(); lst_word = Unify_Variable(); } p->size = 0; p->val = G_INITIAL_VALUE; p->undo = NULL; G_Assign_Element(p++, init_word, FALSE, copy); } if (array_op == G_ARRAY_AUTO) { if (!same_init_value) init_word = G_INITIAL_VALUE; p->size = 0; p->val = G_INITIAL_VALUE; p->undo = NULL; G_Assign_Element(p, init_word, FALSE, copy); } } /*-------------------------------------------------------------------------* * G_ALLOC_ARRAY * * * * Set in g_elem an array for new_size elements. * * If g_elem does not already contain an array a space is mallocated and * * the last elem is initilized with G_IMPOSSIBLE_SIZE. * * * * If g_elem containts an array, its values should be reflected to the new * * array. In absence of backtrackable assignment we perform a realloc else * * a malloc + copy. In both cases the last element is set (copy of old one)* * In case of backtrable assignment (i.e. malloc+copy), the new elements * * should not have undo records (G_Copy_Element sets them to NULL). * * While in case of realloc, the undo records have to been adjusted to * * point to new cells (realloc can return a different starting address). * *-------------------------------------------------------------------------*/ static GVarElt * G_Alloc_Array(GVarElt *g_elem, int new_size, Bool backtrack) { GVarElt *p, *p_new_end, *src, *dst; GUndo *u; int old_size, i; old_size = -g_elem->size; src = (GVarElt *) g_elem->val; if (old_size <= 0 || backtrack) p = (GVarElt *) Malloc((new_size + 1) * sizeof(GVarElt)); else p = (GVarElt *) Realloc((char *) src, (new_size + 1) * sizeof(GVarElt)); p_new_end = p + new_size; if (old_size <= 0) { /* init last elem */ p_new_end->size = G_IMPOSSIBLE_SIZE; p_new_end->val = (WamWord) NULL; p_new_end->undo = NULL; goto finish; } /* there is an array at *src */ if (backtrack) { dst = p; for (i = 0; i < old_size; i++) G_Copy_Element(dst++, src++); /* copy last elem */ if (src->size != G_IMPOSSIBLE_SIZE) G_Copy_Element(p_new_end, src); else *p_new_end = *src; goto finish; } /* a realloc */ dst = p; for (i = 0; i < old_size; i++) { for (u = dst->undo; u; u = u->next) u->g_elem = dst; dst++; } *p_new_end = *dst; /* copy last elem */ finish: g_elem->size = -new_size; g_elem->val = (WamWord) p; return p; } /*-------------------------------------------------------------------------* * GET_TARGET_FROM_GVAR * * * *-------------------------------------------------------------------------*/ static GTarget * Get_Target_From_Gvar(WamWord gvar_word) { WamWord word, tag_mask; WamWord word1; int atom; int arity; WamWord *arg_adr, *g_arg; GVarElt *g_elem, *g_end; GVarElt *p; int i, j, size; int new_size; int index; GTarget *gt = &g_target; g_arg = NULL; arg_adr = Rd_Callable_Check(gvar_word, &atom, &arity); if (atom == ATOM_CHAR('-') && arity == 2) return Get_Target_From_Selector(arg_adr - OFFSET_ARG); g_elem = g_var_tbl[atom]; if (g_elem == NULL) { g_elem = (GVarElt *) Malloc(sizeof(GVarElt)); /* NB: never recovered */ g_elem->size = 0; g_elem->val = G_INITIAL_VALUE; g_elem->undo = NULL; g_var_tbl[atom] = g_elem; } if (arity > 0 && g_elem->size >= 0) { error: Pl_Err_Domain(domain_g_array_index, gvar_word); } for (i = 0; i < arity; i++) { size = g_elem->size; word1 = *arg_adr; DEREF(word1, word, tag_mask); if (tag_mask != TAG_INT_MASK) /* follow the indirection */ word = *Get_Int_Addr_From_Gvar(word); index = UnTag_INT(word); if (size >= 0 || index < 0) goto error; size = -size; if (index >= size) { p = (GVarElt *) (g_elem->val); g_end = p + size; if (g_end->size == G_IMPOSSIBLE_SIZE || index > MAX_AUTO_SIZE) goto error; /* auto expand */ for(new_size = 1; new_size <= index; new_size <<= 1) ; p = G_Alloc_Array(g_elem, new_size, FALSE); g_end = p + new_size; p += size; for (j = size; j < new_size; j++) /* init new cells */ G_Copy_Element(p++, g_end); } g_elem = (GVarElt *) (g_elem->val) + index; arg_adr++; } gt->g_elem = g_elem; gt->g_arg = NULL; return gt; } /*-------------------------------------------------------------------------* * GET_TARGET_FROM_SELECTOR * * * *-------------------------------------------------------------------------*/ static GTarget * Get_Target_From_Selector(WamWord *stc_adr) { WamWord word, tag_mask; WamWord *adr, word1; int arg_no; GTarget *gt; gt = Get_Target_From_Gvar(Arg(stc_adr, 0)); arg_no = Get_Int_From_Word(Arg(stc_adr, 1)); adr = Get_Term_Addr_From_Target(gt); if (adr == NULL) /* an array */ goto error; word1 = *adr; DEREF(word1, word, tag_mask); if (tag_mask == STC) { adr = UnTag_STC(word); if (arg_no < 1 || arg_no > Arity(adr)) goto error; gt->g_arg = &Arg(adr, arg_no - 1); } else if (tag_mask == LST) { adr = UnTag_LST(word); if (arg_no < 0) goto error; while(--arg_no) { DEREF(Cdr(adr), word, tag_mask); if (tag_mask != LST) goto error; adr = UnTag_LST(word); } gt->g_arg = &Car(adr); } else { error: Pl_Err_Domain(domain_g_argument_selector, Tag_STC(stc_adr)); } return gt; } /*-------------------------------------------------------------------------* * GET_TERM_ADDR_FROM_TARGET * * * *-------------------------------------------------------------------------*/ static WamWord * Get_Term_Addr_From_Target(GTarget *gt) { GVarElt *g_elem = gt->g_elem; if (gt->g_arg) return gt->g_arg; if (g_elem->size < 0) return NULL; if (g_elem->size == 0) return (WamWord *) &g_elem->val; return (WamWord *) g_elem->val; } /*-------------------------------------------------------------------------* * GET_INT_ADDR_FROM_GVAR * * * *-------------------------------------------------------------------------*/ static WamWord * Get_Int_Addr_From_Gvar(WamWord gvar_word) { GTarget save_g_target = g_target; /* save for cross-recursion */ GTarget *gt = Get_Target_From_Gvar(gvar_word); WamWord *adr = Get_Term_Addr_From_Target(gt); g_target = save_g_target; /* should be dereferenced */ if (adr == NULL) /* an array */ Pl_Err_Type(type_integer, Tag_ATM(atom_g_array)); if (Tag_Mask_Of(*adr) != TAG_INT_MASK) Pl_Err_Type(type_integer, *adr); return adr; } /*-------------------------------------------------------------------------* * GET_INT_FROM_GVAR * * * *-------------------------------------------------------------------------*/ static long Get_Int_From_Gvar(WamWord gvar_word) { return *Get_Int_Addr_From_Gvar(gvar_word); } /*-------------------------------------------------------------------------* * GET_INT_FROM_WORD * * * *-------------------------------------------------------------------------*/ static long Get_Int_From_Word(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask != TAG_INT_MASK) /* follow the indirection */ word = *Get_Int_Addr_From_Gvar(word); return UnTag_INT(word); } /*-------------------------------------------------------------------------* * G_FREE_ELEMENT * * * *-------------------------------------------------------------------------*/ static void G_Free_Element(GVarElt *g_elem, Bool reinit_undo) { int size; GVarElt *p; GUndo *u; int i; if (reinit_undo) { for(u = g_elem->undo; u; u = u->next) u->g_elem = NULL; /* invalidate this entry */ g_elem->undo = NULL; } size = g_elem->size; if (size == 0) /* a link: nothing */ return; if (size < 0) /* an array: recursively free elts */ { size = -size; p = (GVarElt *) (g_elem->val); for (i = 0; i < size; i++) G_Free_Element(p++, reinit_undo); if (p->size != G_IMPOSSIBLE_SIZE) /* last elem */ G_Free_Element(p, reinit_undo); } /* a copy or an array: free */ Free((char *) g_elem->val); } /*-------------------------------------------------------------------------* * G_COPY_ELEMENT * * * *-------------------------------------------------------------------------*/ static void G_Copy_Element(GVarElt *dst_g_elem, GVarElt *src_g_elem) { WamWord *adr; GVarElt *p; int size; int i; size = dst_g_elem->size = src_g_elem->size; dst_g_elem->undo = NULL; if (size == 0) /* a link: copy */ { dst_g_elem->val = src_g_elem->val; return; } if (size < 0) /* an array: alloc + recursively copy elts */ { size = -size; p = (GVarElt *) Malloc((size + 1) * sizeof(GVarElt)); dst_g_elem->val = (WamWord) p; dst_g_elem = p; src_g_elem = (GVarElt *) (src_g_elem->val); for (i = 0; i < size; i++) G_Copy_Element(dst_g_elem++, src_g_elem++); if (src_g_elem->size == G_IMPOSSIBLE_SIZE) /* last elem */ *dst_g_elem = *src_g_elem; else G_Copy_Element(dst_g_elem, src_g_elem); return; } /* a copy: alloc + copy */ adr = (WamWord *) Malloc(size * sizeof(WamWord)); dst_g_elem->val = (WamWord) adr; Copy_Contiguous_Term(adr, (WamWord *) src_g_elem->val); } /*-------------------------------------------------------------------------* * G_TRAIL_FOR_BACKTRACK * * * *-------------------------------------------------------------------------*/ static void G_Trail_For_Backtrack(GVarElt *g_elem, int save_size, WamWord save_val) { WamWord arg_frame[1]; GUndo *u = (GUndo *) Malloc(sizeof(GUndo)); u->g_elem = g_elem; u->save_size = save_size; u->save_val = save_val; u->next = g_elem->undo; u->prev = NULL; if (u->next) u->next->prev = u; g_elem->undo = u; arg_frame[0] = (WamWord) u; Trail_FC(G_Untrail, 1, arg_frame); } /*-------------------------------------------------------------------------* * G_UNTRAIL * * * *-------------------------------------------------------------------------*/ static void G_Untrail(int n, WamWord *arg_frame) { GUndo *u = (GUndo *) arg_frame[0]; GVarElt *g_elem = u->g_elem; if (g_elem) /* valid entry ? */ { G_Free_Element(g_elem, FALSE); g_elem->size = u->save_size; g_elem->val = u->save_val; } /* remove undo record */ if (u->next) u->next->prev = u->prev; if (u->prev) u->prev->next = u->next; else if (g_elem) g_elem->undo = u->next; Free(u); } /*-------------------------------------------------------------------------* * G_READ * * * *-------------------------------------------------------------------------*/ static Bool G_Read(WamWord gvar_word, WamWord gval_word) { GTarget *gt = Get_Target_From_Gvar(gvar_word); GVarElt *g_elem = gt->g_elem; WamWord *g_arg = gt->g_arg; WamWord word; if (g_arg != NULL) { Copy_Term(H, g_arg); word = *H; H += Term_Size(word); return Unify(word, gval_word); } return G_Read_Element(g_elem, gval_word); } /*-------------------------------------------------------------------------* * G_READ_ELEMENT * * * *-------------------------------------------------------------------------*/ static Bool G_Read_Element(GVarElt *g_elem, WamWord gval_word) { WamWord word; int size = g_elem->size; GVarElt *p; int i; if (size == 0) /* a link: unify */ return Unify(g_elem->val, gval_word); if (size > 0) /* a copy: copy+unify */ { Copy_Contiguous_Term(H, (WamWord *) g_elem->val); word = *H; H += size; return Unify(word, gval_word); } /* an array: unify with g_array([elt,...]) */ size = -size; p = (GVarElt *) g_elem->val; if (!Get_Structure(atom_g_array, 1, gval_word)) return FALSE; gval_word = Unify_Variable(); for (i = 0; i < size; i++) { if (!Get_List(gval_word)) return FALSE; word = Unify_Variable(); gval_word = Unify_Variable(); if (!G_Read_Element(p++, word)) return FALSE; } return Get_Nil(gval_word); } /*-------------------------------------------------------------------------* * G_ARRAY_SIZE * * * *-------------------------------------------------------------------------*/ static Bool G_Array_Size(WamWord gvar_word, WamWord size_word) { GTarget *gt = Get_Target_From_Gvar(gvar_word); GVarElt *g_elem = gt->g_elem; WamWord *g_arg = gt->g_arg; int size; Check_For_Un_Integer(size_word); size = g_elem->size; return g_arg == NULL && size < 0 && Get_Integer(-size, size_word); } /*-------------------------------------------------------------------------* * G_INC_DEC * * * *-------------------------------------------------------------------------*/ static Bool G_Inc_Dec(WamWord gvar_word, int inc, WamWord old_word, WamWord new_word) { WamWord *adr; long old, new; if (old_word != NOT_A_WAM_WORD) Check_For_Un_Integer(old_word); if (new_word != NOT_A_WAM_WORD) Check_For_Un_Integer(new_word); adr = Get_Int_Addr_From_Gvar(gvar_word); old = UnTag_INT(*adr); new = old + inc; if (old_word != NOT_A_WAM_WORD && !Get_Integer(old, old_word)) return FALSE; *adr = Tag_INT(new); /* increment now - cf specif in doc */ if (new_word != NOT_A_WAM_WORD && !Get_Integer(new, new_word)) return FALSE; return TRUE; } /*-------------------------------------------------------------------------* * G_SET_BIT * * * *-------------------------------------------------------------------------*/ static void G_Set_Bit(WamWord gvar_word, WamWord bit_word) { WamWord *adr; int bit = Rd_Positive_Check(bit_word) % VALUE_SIZE; unsigned long mask; adr = Get_Int_Addr_From_Gvar(gvar_word); mask = 1 << (bit + TAG_SIZE_LOW); *adr |= mask; } /*-------------------------------------------------------------------------* * G_RESET_BIT * * * *-------------------------------------------------------------------------*/ static void G_Reset_Bit(WamWord gvar_word, WamWord bit_word) { WamWord *adr; int bit = Rd_Positive_Check(bit_word) % VALUE_SIZE; unsigned long mask; adr = Get_Int_Addr_From_Gvar(gvar_word); mask = 1 << (bit + TAG_SIZE_LOW); *adr &= ~mask; } /*-------------------------------------------------------------------------* * G_TEST_SET_BIT * * * *-------------------------------------------------------------------------*/ static Bool G_Test_Set_Bit(WamWord gvar_word, WamWord bit_word) { int bit = Rd_Positive_Check(bit_word) % VALUE_SIZE; unsigned long val, mask; val = Get_Int_From_Gvar(gvar_word); mask = 1 << (bit + TAG_SIZE_LOW); return (val & mask) != 0; } /*-------------------------------------------------------------------------* * G_TEST_RESET_BIT * * * *-------------------------------------------------------------------------*/ static Bool G_Test_Reset_Bit(WamWord gvar_word, WamWord bit_word) { int bit = Rd_Positive_Check(bit_word) % VALUE_SIZE; unsigned long mask, val; val = Get_Int_From_Gvar(gvar_word); mask = 1 << (bit + TAG_SIZE_LOW); return (val & mask) == 0; } ./gprolog-1.3.0/src/BipsPl/pl_error.wam0000644004425400513100000000557610547440331016321 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : pl_error.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/pl_error.pl'). predicate(set_bip_name/2,30,static,private,built_in,[ call_c('Set_Bip_Name_2',[],[x(0),x(1)]), proceed]). predicate(current_bip_name/2,33,static,private,built_in,[ call_c('Current_Bip_Name_2',[boolean],[x(0),x(1)]), proceed]). predicate('$pl_err_instantiation'/0,39,static,private,built_in,[ put_atom(instantiation_error,0), execute('$pl_error'/1)]). predicate('$pl_err_type'/2,42,static,private,built_in,[ get_variable(x(2),0), put_structure(type_error/2,0), unify_local_value(x(2)), unify_local_value(x(1)), execute('$pl_error'/1)]). predicate('$pl_err_domain'/2,45,static,private,built_in,[ get_variable(x(2),0), put_structure(domain_error/2,0), unify_local_value(x(2)), unify_local_value(x(1)), execute('$pl_error'/1)]). predicate('$pl_err_existence'/2,48,static,private,built_in,[ get_variable(x(2),0), put_structure(existence_error/2,0), unify_local_value(x(2)), unify_local_value(x(1)), execute('$pl_error'/1)]). predicate('$pl_err_permission'/3,51,static,private,built_in,[ get_variable(x(3),0), put_structure(permission_error/3,0), unify_local_value(x(3)), unify_local_value(x(1)), unify_local_value(x(2)), execute('$pl_error'/1)]). predicate('$pl_err_representation'/1,54,static,private,built_in,[ get_variable(x(1),0), put_structure(representation_error/1,0), unify_local_value(x(1)), execute('$pl_error'/1)]). predicate('$pl_err_evaluation'/1,57,static,private,built_in,[ get_variable(x(1),0), put_structure(evaluation_error/1,0), unify_local_value(x(1)), execute('$pl_error'/1)]). predicate('$pl_err_resource'/1,60,static,private,built_in,[ get_variable(x(1),0), put_structure(resource_error/1,0), unify_local_value(x(1)), execute('$pl_error'/1)]). predicate('$pl_err_syntax'/1,63,static,private,built_in,[ get_variable(x(1),0), put_structure(syntax_error/1,0), unify_local_value(x(1)), execute('$pl_error'/1)]). predicate('$pl_err_system'/1,66,static,private,built_in,[ get_variable(x(1),0), put_structure(system_error/1,0), unify_local_value(x(1)), execute('$pl_error'/1)]). predicate('$pl_error'/1,73,static,private,built_in,[ get_variable(x(2),0), put_variable(x(1),0), call_c('Context_Error_1',[],[x(0)]), put_structure(error/2,0), unify_local_value(x(2)), unify_value(x(1)), put_atom('$pl_error',1), put_integer(1,2), put_atom(true,3), execute('$throw'/4)]). predicate(syntax_error_info/4,80,static,private,built_in,[ put_atom(syntax_error_info,4), put_integer(4,5), call_c('Set_Bip_Name_2',[],[x(4),x(5)]), call_c('Syntax_Error_Info_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). ./gprolog-1.3.0/src/BipsPl/os_interf.wam0000644004425400513100000003477610547440332016472 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : os_interf.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/os_interf.pl'). predicate('$use_os_interf'/0,29,static,private,built_in,[ proceed]). predicate(make_directory/1,32,static,private,built_in,[ put_atom(make_directory,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Make_Directory_1',[boolean],[x(0)]), proceed]). predicate(delete_directory/1,39,static,private,built_in,[ put_atom(delete_directory,1), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Delete_Directory_1',[boolean],[x(0)]), proceed]). predicate(working_directory/1,46,static,private,built_in,[ put_atom(working_directory,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Working_Directory_1',[boolean],[x(0)]), proceed]). predicate(change_directory/1,53,static,private,built_in,[ put_atom(change_directory,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Change_Directory_1',[boolean],[x(0)]), proceed]). predicate(directory_files/2,59,static,private,built_in,[ put_atom(directory_files,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Directory_Files_2',[boolean],[x(0),x(1)]), proceed]). predicate(rename_file/2,66,static,private,built_in,[ put_atom(rename_file,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Rename_File_2',[boolean],[x(0),x(1)]), proceed]). predicate(unlink/1,73,static,private,built_in,[ put_atom(unlink,1), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Unlink_1',[],[x(0)]), proceed]). predicate(delete_file/1,80,static,private,built_in,[ put_atom(delete_file,1), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Delete_File_1',[boolean],[x(0)]), proceed]). predicate(file_exists/1,87,static,private,built_in,[ put_atom(file_exists,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('File_Exists_1',[boolean],[x(0)]), proceed]). predicate(file_permission/2,92,static,private,built_in,[ put_atom(file_permission,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('File_Permission_2',[boolean],[x(0),x(1)]), proceed]). predicate(file_property/2,99,static,private,built_in,[ load_cut_level(2), allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(file_property,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(1),0), call('$check_file_prop'/1), cut(y(2)), put_value(y(1),0), put_value(y(0),1), deallocate, execute('$file_prop'/2)]). predicate('$check_file_prop'/1,107,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), proceed, label(1), retry_me_else(19), switch_on_term(3,fail,fail,fail,2), label(2), switch_on_structure([(absolute_file_name/1,4),(real_file_name/1,6),(type/1,8),(size/1,10),(permission/1,12),(creation/1,14),(last_access/1,16),(last_modification/1,18)]), label(3), try_me_else(5), label(4), get_structure(absolute_file_name/1,0), unify_void(1), proceed, label(5), retry_me_else(7), label(6), get_structure(real_file_name/1,0), unify_void(1), proceed, label(7), retry_me_else(9), label(8), get_structure(type/1,0), unify_void(1), proceed, label(9), retry_me_else(11), label(10), get_structure(size/1,0), unify_void(1), proceed, label(11), retry_me_else(13), label(12), get_structure(permission/1,0), unify_void(1), proceed, label(13), retry_me_else(15), label(14), get_structure(creation/1,0), unify_void(1), proceed, label(15), retry_me_else(17), label(16), get_structure(last_access/1,0), unify_void(1), proceed, label(17), trust_me_else_fail, label(18), get_structure(last_modification/1,0), unify_void(1), proceed, label(19), trust_me_else_fail, put_value(x(0),1), put_atom(os_file_property,0), execute('$pl_err_domain'/2)]). predicate('$file_prop'/2,132,static,private,built_in,[ switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(absolute_file_name/1,3),(real_file_name/1,5),(type/1,7),(size/1,9),(permission/1,11),(creation/1,13),(last_access/1,15),(last_modification/1,17)]), label(2), try_me_else(4), label(3), get_structure(absolute_file_name/1,0), unify_variable(x(0)), call_c('File_Prop_Absolute_File_Name_2',[boolean],[x(0),x(1)]), proceed, label(4), retry_me_else(6), label(5), get_structure(real_file_name/1,0), unify_variable(x(0)), call_c('File_Prop_Real_File_Name_2',[boolean],[x(0),x(1)]), proceed, label(6), retry_me_else(8), label(7), get_structure(type/1,0), unify_variable(x(0)), call_c('File_Prop_Type_2',[boolean],[x(0),x(1)]), proceed, label(8), retry_me_else(10), label(9), get_structure(size/1,0), unify_variable(x(0)), call_c('File_Prop_Size_2',[boolean],[x(0),x(1)]), proceed, label(10), retry_me_else(12), label(11), get_structure(permission/1,0), unify_variable(x(0)), call_c('Check_Prop_Perm_And_File_2',[boolean],[x(0),x(1)]), execute('$file_prop_perm'/2), label(12), retry_me_else(14), label(13), allocate(2), get_structure(creation/1,0), unify_variable(y(0)), get_variable(y(1),1), put_integer(0,0), put_integer(0,1), call('$sys_var_write'/2), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('File_Prop_Date_2',[boolean],[x(0),x(1)]), proceed, label(14), retry_me_else(16), label(15), allocate(2), get_structure(last_access/1,0), unify_variable(y(0)), get_variable(y(1),1), put_integer(0,0), put_integer(1,1), call('$sys_var_write'/2), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('File_Prop_Date_2',[boolean],[x(0),x(1)]), proceed, label(16), trust_me_else_fail, label(17), allocate(2), get_structure(last_modification/1,0), unify_variable(y(0)), get_variable(y(1),1), put_integer(0,0), put_integer(2,1), call('$sys_var_write'/2), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('File_Prop_Date_2',[boolean],[x(0),x(1)]), proceed]). predicate('$file_prop_perm'/2,161,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(read,3),(write,5),(execute,7),(search,9)]), label(2), try_me_else(4), label(3), get_atom(read,0), put_value(x(1),0), put_atom(read,1), execute(file_permission/2), label(4), retry_me_else(6), label(5), get_atom(write,0), put_value(x(1),0), put_atom(write,1), execute(file_permission/2), label(6), retry_me_else(8), label(7), get_atom(execute,0), put_value(x(1),0), put_atom(execute,1), execute(file_permission/2), label(8), trust_me_else_fail, label(9), get_atom(search,0), put_value(x(1),0), put_atom(search,1), execute(file_permission/2)]). predicate(temporary_name/2,176,static,private,built_in,[ put_atom(temporary_name,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Temporary_Name_2',[boolean],[x(0),x(1)]), proceed]). predicate(temporary_file/3,183,static,private,built_in,[ put_atom(temporary_file,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('Temporary_File_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(date_time/1,190,static,private,built_in,[ put_atom(date_time,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Date_Time_1',[boolean],[x(0)]), proceed]). predicate(host_name/1,197,static,private,built_in,[ put_atom(host_name,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Host_Name_1',[boolean],[x(0)]), proceed]). predicate(os_version/1,204,static,private,built_in,[ put_atom(os_version,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Os_Version_1',[boolean],[x(0)]), proceed]). predicate(architecture/1,211,static,private,built_in,[ put_atom(architecture,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Architecture_1',[boolean],[x(0)]), proceed]). predicate(shell/0,218,static,private,built_in,[ put_atom(shell,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_atom('',0), put_integer(0,1), call_c('Shell_2',[boolean],[x(0),x(1)]), proceed]). predicate(shell/1,222,static,private,built_in,[ put_atom(shell,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_integer(0,1), call_c('Shell_2',[boolean],[x(0),x(1)]), proceed]). predicate(shell/2,226,static,private,built_in,[ put_atom(shell,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Shell_2',[boolean],[x(0),x(1)]), proceed]). predicate(system/1,233,static,private,built_in,[ put_atom(system,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_integer(0,1), call_c('System_2',[boolean],[x(0),x(1)]), proceed]). predicate(system/2,237,static,private,built_in,[ put_atom(system,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('System_2',[boolean],[x(0),x(1)]), proceed]). predicate(spawn/2,244,static,private,built_in,[ put_atom(spawn,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), put_integer(0,2), call_c('Spawn_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(spawn/3,248,static,private,built_in,[ put_atom(spawn,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('Spawn_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(sleep/1,255,static,private,built_in,[ put_atom(sleep,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Sleep_1',[],[x(0)]), proceed]). predicate(popen/3,262,static,private,built_in,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), put_atom(popen,0), put_integer(3,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(x(2),0), put_variable(y(2),1), call('$get_open_stm'/2), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(2),2), deallocate, call_c('Popen_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(exec/5,274,static,private,built_in,[ allocate(5), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), put_atom(exec,0), put_integer(5,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(4),0), call('$exec/5_$aux1'/1), put_integer(0,0), put_integer(0,1), call('$sys_var_write'/2), put_integer(0,0), put_integer(0,1), call('$sys_var_set_bit'/2), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), put_value(y(4),4), deallocate, execute('$exec'/5)]). predicate('$exec/5_$aux1'/1,274,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), cut(x(1)), put_value(x(0),1), put_atom(variable,0), execute('$pl_err_type'/2), label(1), trust_me_else_fail, proceed]). predicate(exec/4,286,static,private,built_in,[ allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_atom(exec,0), put_integer(4,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(0,1), call('$sys_var_write'/2), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), put_integer(0,4), deallocate, execute('$exec'/5)]). predicate('$exec'/5,294,static,private,built_in,[ allocate(7), get_variable(y(0),0), get_variable(y(1),2), get_variable(y(2),3), get_variable(y(3),4), put_value(x(1),0), put_variable(y(4),1), call('$get_open_stm'/2), put_value(y(1),0), put_variable(y(5),1), call('$get_open_stm'/2), put_value(y(2),0), put_variable(y(6),1), call('$get_open_stm'/2), put_value(y(0),0), put_unsafe_value(y(4),1), put_unsafe_value(y(5),2), put_unsafe_value(y(6),3), put_value(y(3),4), deallocate, call_c('Exec_5',[boolean],[x(0),x(1),x(2),x(3),x(4)]), proceed]). predicate(create_pipe/2,304,static,private,built_in,[ allocate(3), get_variable(y(0),1), put_atom(create_pipe,1), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(1),1), call('$get_open_stm'/2), put_value(y(0),0), put_variable(y(2),1), call('$get_open_stm'/2), put_unsafe_value(y(1),0), put_unsafe_value(y(2),1), deallocate, call_c('Create_Pipe_2',[boolean],[x(0),x(1)]), proceed]). predicate(fork_prolog/1,313,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(fork_prolog,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), call('$fork_prolog/1_$aux1'/1), put_value(y(0),0), deallocate, call_c('Fork_Prolog_1',[boolean],[x(0)]), proceed]). predicate('$fork_prolog/1_$aux1'/1,313,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), cut(x(1)), put_value(x(0),1), put_atom(variable,0), execute('$pl_err_type'/2), label(1), trust_me_else_fail, proceed]). predicate(select/5,324,static,private,built_in,[ put_atom(select,5), put_integer(5,6), call_c('Set_Bip_Name_2',[],[x(5),x(6)]), call_c('Select_5',[boolean],[x(0),x(1),x(2),x(3),x(4)]), proceed]). predicate(prolog_pid/1,331,static,private,built_in,[ put_atom(prolog_pid,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Prolog_Pid_1',[boolean],[x(0)]), proceed]). predicate(send_signal/2,338,static,private,built_in,[ put_atom(send_signal,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Send_Signal_2',[boolean],[x(0),x(1)]), proceed]). predicate(wait/2,345,static,private,built_in,[ put_atom(wait,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Wait_2',[boolean],[x(0),x(1)]), proceed]). ./gprolog-1.3.0/src/BipsPl/stream_c.c0000644004425400513100000012076410547154140015725 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : stream_c.c * * Descr.: stream selection and control management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: stream_c.c,v 1.16 2007/01/04 10:35:12 diaz Exp $ */ #include #include #include #include #include #include "engine_pl.h" #include "bips_pl.h" #ifndef NO_USE_LINEDIT #include "linedit.h" #endif #if defined(_WIN32) || defined(__CYGWIN__) #include #endif #ifndef _WIN32 #include #include #endif /*---------------------------------* * Constants * *---------------------------------*/ #define TERM_STREAM_WRITE_BLOCK 1024 /* Error Messages */ #define ERR_NEEDS_SPECIAL_CLOSE "special stream: needs appropriate close predicate" #define ERR_CANNOT_CLOSE_STREAM "cannot close stream" /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { int buff_size; Bool buff_is_alloc; char *buff; char *ptr; } TermSInf; /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ #define CURRENT_STREAM_ALT X2463757272656E745F73747265616D5F616C74 #define CURRENT_ALIAS_ALT X2463757272656E745F616C6961735F616C74 #define CURRENT_MIRROR_ALT X2463757272656E745F6D6972726F725F616C74 Prolog_Prototype(CURRENT_STREAM_ALT, 0); Prolog_Prototype(CURRENT_ALIAS_ALT, 0); Prolog_Prototype(CURRENT_MIRROR_ALT, 0); /*-------------------------------------------------------------------------* * CURRENT_INPUT_1 * * * *-------------------------------------------------------------------------*/ Bool Current_Input_1(WamWord stm_word) { return Get_Integer(stm_input, stm_word); } /*-------------------------------------------------------------------------* * CURRENT_OUTPUT_1 * * * *-------------------------------------------------------------------------*/ Bool Current_Output_1(WamWord stm_word) { return Get_Integer(stm_output, stm_word); } /*-------------------------------------------------------------------------* * SET_INPUT_1 * * * *-------------------------------------------------------------------------*/ void Set_Input_1(WamWord sora_word) { stm_input = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); } /*-------------------------------------------------------------------------* * SET_OUTPUT_1 * * * *-------------------------------------------------------------------------*/ void Set_Output_1(WamWord sora_word) { stm_output = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_OUTPUT); } /*-------------------------------------------------------------------------* * SET_TOP_LEVEL_STREAMS_2 * * * *-------------------------------------------------------------------------*/ void Set_Top_Level_Streams_2(WamWord sora_in_word, WamWord sora_out_word) { stm_top_level_input = Get_Stream_Or_Alias(sora_in_word, STREAM_CHECK_INPUT); stm_top_level_output = Get_Stream_Or_Alias(sora_out_word, STREAM_CHECK_OUTPUT); Reassign_Alias(atom_top_level_input, stm_top_level_input); Reassign_Alias(atom_top_level_output, stm_top_level_output); } /*-------------------------------------------------------------------------* * SET_DEBUGGER_STREAMS_2 * * * *-------------------------------------------------------------------------*/ void Set_Debugger_Streams_2(WamWord sora_in_word, WamWord sora_out_word) { stm_debugger_input = Get_Stream_Or_Alias(sora_in_word, STREAM_CHECK_INPUT); stm_debugger_output = Get_Stream_Or_Alias(sora_out_word, STREAM_CHECK_OUTPUT); Reassign_Alias(atom_debugger_input, stm_debugger_input); Reassign_Alias(atom_debugger_output, stm_debugger_output); } /*-------------------------------------------------------------------------* * OPEN_3 * * * *-------------------------------------------------------------------------*/ void Open_3(WamWord source_sink_word, WamWord mode_word, WamWord stm_word) { WamWord word, tag_mask; int atom; int mode; Bool text; StmProp prop; char *path; int atom_file_name; int stm; FILE *f; int mask = SYS_VAR_OPTION_MASK; Bool reposition; DEREF(source_sink_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_ATM_MASK) Pl_Err_Domain(domain_source_sink, source_sink_word); atom_file_name = UnTag_ATM(word); path = atom_tbl[atom_file_name].name; if ((path = M_Absolute_Path_Name(path)) == NULL) Pl_Err_Existence(existence_source_sink, source_sink_word); text = mask & 1; mask >>= 1; atom = Rd_Atom_Check(mode_word); if (atom == atom_read) mode = STREAM_MODE_READ; else if (atom == atom_write) mode = STREAM_MODE_WRITE; else if (atom == atom_append) mode = STREAM_MODE_APPEND; else Pl_Err_Domain(domain_io_mode, mode_word); stm = Add_Stream_For_Stdio_File(path, mode, text); if (stm < 0) { if (errno == ENOENT || errno == ENOTDIR) Pl_Err_Existence(existence_source_sink, source_sink_word); else Pl_Err_Permission(permission_operation_open, permission_type_source_sink, source_sink_word); } prop = stm_tbl[stm]->prop; f = (FILE *) stm_tbl[stm]->file; /* change properties wrt to specified ones */ if ((mask & 2) != 0) /* reposition specified */ { reposition = mask & 1; if (reposition && !prop.reposition) { fclose(f); word = Put_Structure(atom_reposition, 1); Unify_Atom(atom_true); Pl_Err_Permission(permission_operation_open, permission_type_source_sink, word); } prop.reposition = reposition; } mask >>= 2; if ((mask & 4) != 0) /* eof_action specified */ prop.eof_action = mask & 3; mask >>= 3; if ((mask & 4) != 0) /* buffering specified */ if (prop.buffering != (unsigned) (mask & 3)) /* cast for MSVC warning */ { prop.buffering = mask & 3; Stdio_Set_Buffering(f, prop.buffering); } mask >>= 3; stm_tbl[stm]->atom_file_name = atom_file_name; stm_tbl[stm]->prop = prop; Get_Integer(stm, stm_word); } /*-------------------------------------------------------------------------* * TEST_ALIAS_NOT_ASSIGNED_1 * * * *-------------------------------------------------------------------------*/ Bool Test_Alias_Not_Assigned_1(WamWord alias_word) { return Find_Stream_By_Alias(Rd_Atom_Check(alias_word)) < 0; } /*-------------------------------------------------------------------------* * FROM_ALIAS_TO_STREAM_2 * * * *-------------------------------------------------------------------------*/ Bool From_Alias_To_Stream_2(WamWord alias_word, WamWord stm_word) { int stm; stm = Find_Stream_By_Alias(Rd_Atom_Check(alias_word)); return stm >= 0 && Get_Integer(stm, stm_word); } /*-------------------------------------------------------------------------* * ADD_STREAM_ALIAS_2 * * * *-------------------------------------------------------------------------*/ Bool Add_Stream_Alias_2(WamWord sora_word, WamWord alias_word) { int stm; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); return Add_Alias_To_Stream(Rd_Atom_Check(alias_word), stm); } /*-------------------------------------------------------------------------* * CHECK_VALID_MIRROR_1 * * * *-------------------------------------------------------------------------*/ void Check_Valid_Mirror_1(WamWord mirror_word) { Get_Stream_Or_Alias(mirror_word, STREAM_CHECK_OUTPUT); } /*-------------------------------------------------------------------------* * ADD_STREAM_MIRROR_2 * * * *-------------------------------------------------------------------------*/ void Add_Stream_Mirror_2(WamWord sora_word, WamWord mirror_word) { int stm; int m_stm; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); m_stm = Get_Stream_Or_Alias(mirror_word, STREAM_CHECK_OUTPUT); Add_Mirror_To_Stream(stm, m_stm); } /*-------------------------------------------------------------------------* * REMOVE_STREAM_MIRROR_2 * * * *-------------------------------------------------------------------------*/ Bool Remove_Stream_Mirror_2(WamWord sora_word, WamWord mirror_word) { int stm; int m_stm; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); m_stm = Get_Stream_Or_Alias(mirror_word, STREAM_CHECK_EXIST); return Del_Mirror_From_Stream(stm, m_stm); } /*-------------------------------------------------------------------------* * SET_STREAM_TYPE_2 * * * *-------------------------------------------------------------------------*/ void Set_Stream_Type_2(WamWord sora_word, WamWord is_text_word) { int stm; StmInf *pstm; int text; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; text = Rd_Integer_Check(is_text_word); if ((unsigned) text == pstm->prop.text) return; if (pstm->char_count) Pl_Err_Permission(permission_operation_modify, permission_type_stream, sora_word); pstm->prop.text = text; #if defined(_WIN32) || defined(__CYGWIN__) { FILE *f; f = Stdio_Desc_Of_Stream(stm); if (f == NULL) return; setmode(fileno(f), (text) ? O_TEXT : O_BINARY); } #endif } /*-------------------------------------------------------------------------* * SET_STREAM_EOF_ACTION_2 * * * *-------------------------------------------------------------------------*/ void Set_Stream_Eof_Action_2(WamWord sora_word, WamWord action_word) { int stm; StmInf *pstm; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; if (pstm->prop.output) Pl_Err_Permission(permission_operation_modify, permission_type_stream, sora_word); pstm->prop.eof_action = Rd_Integer_Check(action_word); } /*-------------------------------------------------------------------------* * SET_STREAM_BUFFERING_2 * * * *-------------------------------------------------------------------------*/ void Set_Stream_Buffering_2(WamWord sora_word, WamWord buff_mode_word) { int stm; StmInf *pstm; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; pstm->prop.buffering = Rd_Integer_Check(buff_mode_word); Set_Stream_Buffering(stm); } /*-------------------------------------------------------------------------* * CLOSE_1 * * * *-------------------------------------------------------------------------*/ void Close_1(WamWord sora_word) { int stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); Close_Stm(stm, SYS_VAR_OPTION_MASK & 1); } /*-------------------------------------------------------------------------* * CLOSE_STM * * * *-------------------------------------------------------------------------*/ void Close_Stm(int stm, Bool force) { StmInf *pstm = stm_tbl[stm]; int fd = 0; Stream_Flush(pstm); if (stm == stm_stdin || stm == stm_stdout) return; if (stm == stm_top_level_input || stm == stm_top_level_output) return; if (stm == stm_debugger_input || stm == stm_debugger_output) return; if (stm == stm_input) stm_input = stm_stdin; else if (stm == stm_output) stm_output = stm_stdout; if (pstm->prop.special_close) Pl_Err_System(Create_Atom(ERR_NEEDS_SPECIAL_CLOSE)); if (pstm->fct_close == fclose) fd = fileno((FILE *) (pstm->file)); if (Stream_Close(pstm) != 0) { if (force == 0) Pl_Err_System(Create_Atom(ERR_CANNOT_CLOSE_STREAM)); /* else force close */ if (fd > 2) close(fd); } Delete_Stream(stm); } /*-------------------------------------------------------------------------* * FLUSH_OUTPUT_1 * * * *-------------------------------------------------------------------------*/ void Flush_Output_1(WamWord sora_word) { int stm; stm = (sora_word == NOT_A_WAM_WORD) ? stm_output : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_OUTPUT); last_output_sora = sora_word; Stream_Flush(stm_tbl[stm]); } /*-------------------------------------------------------------------------* * FLUSH_OUTPUT_0 * * * *-------------------------------------------------------------------------*/ void Flush_Output_0(void) { Flush_Output_1(NOT_A_WAM_WORD); } /*-------------------------------------------------------------------------* * CURRENT_STREAM_1 * * * *-------------------------------------------------------------------------*/ Bool Current_Stream_1(WamWord stm_word) { WamWord word, tag_mask; int stm = 0; DEREF(stm_word, word, tag_mask); /* either an INT or a REF */ if (tag_mask == TAG_INT_MASK) { stm = UnTag_INT(word); return (stm >= 0 && stm <= stm_last_used && stm_tbl[stm] != NULL); } for (; stm <= stm_last_used; stm++) if (stm_tbl[stm]) break; if (stm >= stm_last_used) { if (stm > stm_last_used) return FALSE; } else /* non deterministic case */ { A(0) = stm_word; A(1) = stm + 1; Create_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_STREAM_ALT, 0), 2); } return Get_Integer(stm, stm_word); } /*-------------------------------------------------------------------------* * CURRENT_STREAM_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Current_Stream_Alt_0(void) { WamWord stm_word; int stm; Update_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_STREAM_ALT, 0), 0); stm_word = AB(B, 0); stm = AB(B, 1); for (; stm <= stm_last_used; stm++) if (stm_tbl[stm]) break; if (stm >= stm_last_used) { Delete_Last_Choice_Point(); if (stm > stm_last_used) return FALSE; } else /* non deterministic case */ { #if 0 /* the following data is unchanged */ AB(B, 0) = stm_word; #endif AB(B, 1) = stm + 1; } return Get_Integer(stm, stm_word); } /*-------------------------------------------------------------------------* * STREAM_PROP_FILE_NAME_2 * * * *-------------------------------------------------------------------------*/ Bool Stream_Prop_File_Name_2(WamWord file_name_word, WamWord stm_word) { int stm; stm = Rd_Integer_Check(stm_word); /* stm is a valid stream entry */ return Un_Atom_Check(stm_tbl[stm]->atom_file_name, file_name_word); } /*-------------------------------------------------------------------------* * STREAM_PROP_MODE_2 * * * *-------------------------------------------------------------------------*/ Bool Stream_Prop_Mode_2(WamWord mode_word, WamWord stm_word) { int stm; int atom; stm = Rd_Integer_Check(stm_word); /* stm is a valid stream entry */ switch (stm_tbl[stm]->prop.mode) { case STREAM_MODE_READ: atom = atom_read; break; case STREAM_MODE_WRITE: atom = atom_write; break; case STREAM_MODE_APPEND: atom = atom_append; break; } return Un_Atom_Check(atom, mode_word); } /*-------------------------------------------------------------------------* * STREAM_PROP_INPUT_1 * * * *-------------------------------------------------------------------------*/ Bool Stream_Prop_Input_1(WamWord stm_word) { int stm; stm = Rd_Integer_Check(stm_word); /* stm is a valid stream entry */ return stm_tbl[stm]->prop.input; } /*-------------------------------------------------------------------------* * STREAM_PROP_OUTPUT_1 * * * *-------------------------------------------------------------------------*/ Bool Stream_Prop_Output_1(WamWord stm_word) { int stm; stm = Rd_Integer_Check(stm_word); /* stm is a valid stream entry */ return stm_tbl[stm]->prop.output; } /*-------------------------------------------------------------------------* * STREAM_PROP_TYPE_2 * * * *-------------------------------------------------------------------------*/ Bool Stream_Prop_Type_2(WamWord type_word, WamWord stm_word) { int stm; int atom; stm = Rd_Integer_Check(stm_word); /* stm is a valid stream entry */ atom = (stm_tbl[stm]->prop.text) ? atom_text : atom_binary; return Un_Atom_Check(atom, type_word); } /*-------------------------------------------------------------------------* * STREAM_PROP_REPOSITION_2 * * * *-------------------------------------------------------------------------*/ Bool Stream_Prop_Reposition_2(WamWord reposition_word, WamWord stm_word) { int stm; int atom; stm = Rd_Integer_Check(stm_word); /* stm is a valid stream entry */ atom = (stm_tbl[stm]->prop.reposition) ? atom_true : atom_false; return Un_Atom_Check(atom, reposition_word); } /*-------------------------------------------------------------------------* * STREAM_PROP_EOF_ACTION_2 * * * *-------------------------------------------------------------------------*/ Bool Stream_Prop_Eof_Action_2(WamWord eof_action_word, WamWord stm_word) { int stm; int atom; stm = Rd_Integer_Check(stm_word); /* stm is a valid stream entry */ switch (stm_tbl[stm]->prop.eof_action) { case STREAM_EOF_ACTION_ERROR: atom = atom_error; break; case STREAM_EOF_ACTION_EOF_CODE: atom = atom_eof_code; break; case STREAM_EOF_ACTION_RESET: atom = atom_reset; break; } return Un_Atom_Check(atom, eof_action_word); } /*-------------------------------------------------------------------------* * STREAM_PROP_BUFFERING_2 * * * *-------------------------------------------------------------------------*/ Bool Stream_Prop_Buffering_2(WamWord buffering_word, WamWord stm_word) { int stm; int atom; stm = Rd_Integer_Check(stm_word); /* stm is a valid stream entry */ #ifndef NO_USE_LINEDIT /* if use_gui == 1 */ if (stm_tbl[stm]->file == (long) stdout && le_hook_get_line_buffering) { if ((*le_hook_get_line_buffering)()) stm_tbl[stm]->prop.buffering = STREAM_BUFFERING_LINE; else stm_tbl[stm]->prop.buffering = STREAM_BUFFERING_NONE; } #endif switch (stm_tbl[stm]->prop.buffering) { case STREAM_BUFFERING_NONE: atom = atom_none; break; case STREAM_BUFFERING_LINE: atom = atom_line; break; case STREAM_BUFFERING_BLOCK: atom = atom_block; break; } return Un_Atom_Check(atom, buffering_word); } /*-------------------------------------------------------------------------* * STREAM_PROP_END_OF_STREAM_2 * * * *-------------------------------------------------------------------------*/ Bool Stream_Prop_End_Of_Stream_2(WamWord end_of_stream_word, WamWord stm_word) { int stm; int atom; stm = Rd_Integer_Check(stm_word); /* stm is a valid stream entry */ switch (Stream_End_Of_Stream(stm_tbl[stm])) { case STREAM_EOF_NOT: atom = atom_not; break; case STREAM_EOF_AT: atom = atom_at; break; case STREAM_EOF_PAST: atom = atom_past; break; } return Un_Atom_Check(atom, end_of_stream_word); } /*-------------------------------------------------------------------------* * AT_END_OF_STREAM_1 * * * *-------------------------------------------------------------------------*/ Bool At_End_Of_Stream_1(WamWord sora_word) { int stm; stm = (sora_word == NOT_A_WAM_WORD) ? stm_input : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); return Stream_End_Of_Stream(stm_tbl[stm]) != STREAM_EOF_NOT; } /*-------------------------------------------------------------------------* * AT_END_OF_STREAM_0 * * * *-------------------------------------------------------------------------*/ Bool At_End_Of_Stream_0(void) { return At_End_Of_Stream_1(NOT_A_WAM_WORD); } /*-------------------------------------------------------------------------* * CURRENT_ALIAS_2 * * * *-------------------------------------------------------------------------*/ Bool Current_Alias_2(WamWord stm_word, WamWord alias_word) { WamWord word, tag_mask; int stm; HashScan scan; AliasInf *alias; AliasInf *save_alias; stm = Rd_Integer_Check(stm_word); /* stm is a valid stream entry */ DEREF(alias_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) return Find_Stream_By_Alias(Rd_Atom_Check(word)) == stm; for (alias = (AliasInf *) Hash_First(alias_tbl, &scan); alias; alias = (AliasInf *) Hash_Next(&scan)) if (alias->stm == stm) break; if (alias == NULL) return FALSE; save_alias = alias; for (;;) { alias = (AliasInf *) Hash_Next(&scan); if (alias == NULL || alias->stm == stm) break; } if (alias) /* non deterministic case */ { A(0) = stm; A(1) = alias_word; A(2) = (WamWord) scan.endt; A(3) = (WamWord) scan.cur_t; A(4) = (WamWord) scan.cur_p; A(5) = (WamWord) alias; Create_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_ALIAS_ALT, 0), 6); } Get_Atom(save_alias->atom, alias_word); return TRUE; } /*-------------------------------------------------------------------------* * CURRENT_ALIAS_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Current_Alias_Alt_0(void) { int stm; WamWord alias_word; HashScan scan; AliasInf *alias; AliasInf *save_alias; Update_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_ALIAS_ALT, 0), 0); stm = AB(B, 0); alias_word = AB(B, 1); scan.endt = (char *) AB(B, 2); scan.cur_t = (char *) AB(B, 3); scan.cur_p = (char *) AB(B, 4); alias = (AliasInf *) AB(B, 5); save_alias = alias; for (;;) { alias = (AliasInf *) Hash_Next(&scan); if (alias == NULL || alias->stm == stm) break; } if (alias) /* non deterministic case */ { #if 0 /* the following data is unchanged */ AB(B, 0) = stm; AB(B, 1) = alias_word; AB(B, 2) = (WamWord) scan.endt; #endif AB(B, 3) = (WamWord) scan.cur_t; AB(B, 4) = (WamWord) scan.cur_p; AB(B, 5) = (WamWord) alias; } else Delete_Last_Choice_Point(); Get_Atom(save_alias->atom, alias_word); return TRUE; } /*-------------------------------------------------------------------------* * CURRENT_MIRROR_2 * * * *-------------------------------------------------------------------------*/ Bool Current_Mirror_2(WamWord stm_word, WamWord m_stm_word) { int stm = Rd_Integer_Check(stm_word); /* stm is a valid stream entry */ StmInf *pstm = stm_tbl[stm]; StmLst *m = pstm->mirror; /* From here, the code also works with */ /* m = m_pstm->mirror_of. Could be used */ /* if m_stm_word is given and not stm_word */ if (m == NULL) return FALSE; if (m->next != NULL) /* non deterministic case */ { A(0) = stm; A(1) = m_stm_word; A(2) = (WamWord) m->next; Create_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_MIRROR_ALT, 0), 3); } return Get_Integer(m->stm, m_stm_word); } /*-------------------------------------------------------------------------* * CURRENT_MIRROR_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Current_Mirror_Alt_0(void) { int stm; WamWord m_stm_word; StmLst *m; Update_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_MIRROR_ALT, 0), 0); stm = AB(B, 0); m_stm_word = AB(B, 1); m = (StmLst *) AB(B, 2); if (m->next) /* non deterministic case */ { #if 0 /* the following data is unchanged */ AB(B, 0) = stm; AB(B, 1) = m_stm_word; #endif AB(B, 2) = (WamWord) m->next; } else Delete_Last_Choice_Point(); return Get_Integer(m->stm, m_stm_word); } /*-------------------------------------------------------------------------* * STREAM_POSITION_2 * * * *-------------------------------------------------------------------------*/ Bool Stream_Position_2(WamWord sora_word, WamWord position_word) { WamWord word, tag_mask; WamWord p_word[4]; int p[4]; int i; int stm; StmInf *pstm; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; Stream_Get_Position(pstm, p, p + 1, p + 2, p + 3); if (!Get_Structure(atom_stream_position, 4, position_word)) dom_error: Pl_Err_Domain(domain_stream_position, position_word); for (i = 0; i < 4; i++) { p_word[i] = Unify_Variable(); DEREF(p_word[i], word, tag_mask); if (tag_mask != TAG_REF_MASK && tag_mask != TAG_INT_MASK) goto dom_error; } for (i = 0; i < 4; i++) if (!Get_Integer(p[i], p_word[i])) return FALSE; return TRUE; } /*-------------------------------------------------------------------------* * SET_STREAM_POSITION_2 * * * *-------------------------------------------------------------------------*/ Bool Set_Stream_Position_2(WamWord sora_word, WamWord position_word) { WamWord word, tag_mask; WamWord p_word[4]; int p[4]; int i; int stm; StmInf *pstm; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; if (!pstm->prop.reposition) Pl_Err_Permission(permission_operation_reposition, permission_type_stream, sora_word); DEREF(position_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (!Get_Structure(atom_stream_position, 4, position_word)) dom_error: Pl_Err_Domain(domain_stream_position, position_word); for (i = 0; i < 4; i++) { p_word[i] = Unify_Variable(); DEREF(p_word[i], word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_INT_MASK) goto dom_error; p[i] = UnTag_INT(word); } return Stream_Set_Position(pstm, SEEK_SET, p[0], p[1], p[2], p[3]) == 0; } /*-------------------------------------------------------------------------* * SEEK_4 * * * *-------------------------------------------------------------------------*/ Bool Seek_4(WamWord sora_word, WamWord whence_word, WamWord offset_word, WamWord new_loc_word) { int stm; StmInf *pstm; int whence; int offset; int atom; int p[4]; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; if (!pstm->prop.reposition) Pl_Err_Permission(permission_operation_reposition, permission_type_stream, sora_word); if (pstm->prop.text) Pl_Err_Permission(permission_operation_reposition, permission_type_text_stream, sora_word); atom = Rd_Atom_Check(whence_word); if (atom == atom_bof) whence = SEEK_SET; else if (atom == atom_current) whence = SEEK_CUR; else if (atom == atom_eof) whence = SEEK_END; else Pl_Err_Domain(domain_stream_seek_method, whence_word); offset = Rd_Integer_Check(offset_word); Check_For_Un_Integer(new_loc_word); if (Stream_Set_Position(pstm, whence, offset, offset, 0, 0) != 0) return FALSE; Stream_Get_Position(pstm, &offset, p + 1, p + 2, p + 3); return Get_Integer(offset, new_loc_word); } /*-------------------------------------------------------------------------* * CHARACTER_COUNT_2 * * * *-------------------------------------------------------------------------*/ Bool Character_Count_2(WamWord sora_word, WamWord count_word) { int stm; StmInf *pstm; int offset, char_count, line_count, line_pos; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; Stream_Get_Position(pstm, &offset, &char_count, &line_count, &line_pos); return Un_Integer_Check(char_count, count_word); } /*-------------------------------------------------------------------------* * LINE_COUNT_2 * * * *-------------------------------------------------------------------------*/ Bool Line_Count_2(WamWord sora_word, WamWord count_word) { int stm; StmInf *pstm; int offset, char_count, line_count, line_pos; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; if (!pstm->prop.text) Pl_Err_Permission(permission_operation_access, permission_type_binary_stream, sora_word); Stream_Get_Position(pstm, &offset, &char_count, &line_count, &line_pos); return Un_Integer_Check(line_count, count_word); } /*-------------------------------------------------------------------------* * LINE_POSITION_2 * * * *-------------------------------------------------------------------------*/ Bool Line_Position_2(WamWord sora_word, WamWord count_word) { int stm; StmInf *pstm; int offset, char_count, line_count, line_pos; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; if (!pstm->prop.text) Pl_Err_Permission(permission_operation_access, permission_type_binary_stream, sora_word); Stream_Get_Position(pstm, &offset, &char_count, &line_count, &line_pos); return Un_Integer_Check(line_pos, count_word); } /*-------------------------------------------------------------------------* * STREAM_LINE_COLUMN_3 * * * *-------------------------------------------------------------------------*/ Bool Stream_Line_Column_3(WamWord sora_word, WamWord line_word, WamWord col_word) { int stm; StmInf *pstm; int offset, char_count, line_count, line_pos; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; if (!pstm->prop.text) Pl_Err_Permission(permission_operation_access, permission_type_binary_stream, sora_word); Stream_Get_Position(pstm, &offset, &char_count, &line_count, &line_pos); return Un_Integer_Check(line_count + 1, line_word) && Un_Integer_Check(line_pos + 1, col_word); } /*-------------------------------------------------------------------------* * SET_STREAM_LINE_COLUMN_3 * * * *-------------------------------------------------------------------------*/ Bool Set_Stream_Line_Column_3(WamWord sora_word, WamWord line_word, WamWord col_word) { int stm; StmInf *pstm; int line_count, line_pos; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; if (!pstm->prop.reposition) Pl_Err_Permission(permission_operation_reposition, permission_type_stream, sora_word); if (!pstm->prop.text) Pl_Err_Permission(permission_operation_reposition, permission_type_binary_stream, sora_word); line_count = Rd_Integer_Check(line_word) - 1; line_pos = Rd_Integer_Check(col_word) - 1; return line_count >= 0 && line_pos >= 0 && Stream_Set_Position_LC(pstm, line_count, line_pos) == 0; } /*-------------------------------------------------------------------------* * Operations on term_streams * * * *-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------* * OPEN_INPUT_TERM_STREAM_2 * * * *-------------------------------------------------------------------------*/ void Open_Input_Term_Stream_2(WamWord sink_term_word, WamWord stm_word) { char *str; int stm; int n; if (SYS_VAR_OPTION_MASK == TERM_STREAM_ATOM) str = atom_tbl[Rd_Atom_Check(sink_term_word)].name; else { n = List_Length(sink_term_word); /* -1 if not a list */ if (n >= 0) str = Malloc(n + 1); /* +1 for \0 */ else str = glob_buff; if (SYS_VAR_OPTION_MASK == TERM_STREAM_CHARS) Rd_Chars_Str_Check(sink_term_word, str); else Rd_Codes_Str_Check(sink_term_word, str); } stm = Add_Str_Stream(str, SYS_VAR_OPTION_MASK); Get_Integer(stm, stm_word); } /*-------------------------------------------------------------------------* * CLOSE_INPUT_TERM_STREAM_1 * * * *-------------------------------------------------------------------------*/ void Close_Input_Term_Stream_1(WamWord sora_word) { int stm; StmInf *pstm; StrSInf *str_stream; int type; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; type = pstm->prop.other; if (type < 1 || type > 3) Pl_Err_Domain(domain_term_stream_or_alias, sora_word); if (pstm->prop.output) Pl_Err_Permission(permission_operation_close, permission_type_stream, sora_word); if (type != TERM_STREAM_ATOM) { str_stream = (StrSInf *) (pstm->file); Free(str_stream->buff); } Delete_Str_Stream(stm); } /*-------------------------------------------------------------------------* * OPEN_OUTPUT_TERM_STREAM_1 * * * *-------------------------------------------------------------------------*/ void Open_Output_Term_Stream_1(WamWord stm_word) { int stm; stm = Add_Str_Stream(NULL, SYS_VAR_OPTION_MASK); Get_Integer(stm, stm_word); } /*-------------------------------------------------------------------------* * CLOSE_OUTPUT_TERM_STREAM_2 * * * *-------------------------------------------------------------------------*/ Bool Close_Output_Term_Stream_2(WamWord sora_word, WamWord sink_term_word) { int stm; StmInf *pstm; int type; char *str; stm = Get_Stream_Or_Alias(sora_word, STREAM_CHECK_EXIST); pstm = stm_tbl[stm]; type = pstm->prop.other; if (type < 1 || type > 3) Pl_Err_Domain(domain_term_stream_or_alias, sora_word); if (pstm->prop.input) Pl_Err_Permission(permission_operation_close, permission_type_stream, sora_word); str = Term_Write_Str_Stream(stm); switch (SYS_VAR_OPTION_MASK) { case TERM_STREAM_ATOM: if (!Un_String_Check(str, sink_term_word)) return FALSE; break; case TERM_STREAM_CHARS: if (!Un_Chars_Check(str, sink_term_word)) return FALSE; break; case TERM_STREAM_CODES: if (!Un_Codes_Check(str, sink_term_word)) return FALSE; break; } Delete_Str_Stream(stm); return TRUE; } ./gprolog-1.3.0/src/BipsPl/random_c.c0000644004425400513100000001041210547154137015704 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : random_c.c * * Descr.: random number generator management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: random_c.c,v 1.9 2007/01/04 10:35:11 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * SET_SEED_1 * * * *-------------------------------------------------------------------------*/ void Set_Seed_1(WamWord seed_word) { M_Set_Seed(Rd_Positive_Check(seed_word)); } /*-------------------------------------------------------------------------* * GET_SEED_1 * * * *-------------------------------------------------------------------------*/ Bool Get_Seed_1(WamWord seed_word) { return Un_Positive_Check(M_Get_Seed(), seed_word); } /*-------------------------------------------------------------------------* * RANDOM_1 * * * *-------------------------------------------------------------------------*/ void Random_1(WamWord n_word) { Check_For_Un_Variable(n_word); Get_Float(M_Random_Float(1.0), n_word); } /*-------------------------------------------------------------------------* * RANDOM_3 * * * *-------------------------------------------------------------------------*/ Bool Random_3(WamWord l_word, WamWord u_word, WamWord n_word) { double l, u; long l1, u1; long i; double d; l = Rd_Number_Check(l_word); u = Rd_Number_Check(u_word); Check_For_Un_Variable(n_word); if (l >= u) return FALSE; l1 = (long) l; u1 = (long) u; if (l1 == l && u1 == u) { i = l1 + M_Random_Integer(u1 - l1); Get_Integer(i, n_word); } else { d = l + M_Random_Float(u - l); Get_Float(d, n_word); } return TRUE; } ./gprolog-1.3.0/src/BipsPl/pretty.wam0000644004425400513100000001607710547440332016023 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : pretty.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/pretty.pl'). predicate('$use_pretty'/0,29,static,private,built_in,[ proceed]). predicate(portray_clause/1,32,static,private,built_in,[ try_me_else(1), allocate(1), get_variable(y(0),0), put_value(y(0),0), put_integer(1,1), call('$portray_clause'/2), put_value(y(0),0), call_c('Portray_Clause_1',[],[x(0)]), fail, label(1), trust_me_else_fail, proceed]). predicate(portray_clause/2,42,static,private,built_in,[ try_me_else(1), allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_value(y(1),0), put_integer(2,1), call('$portray_clause'/2), put_value(y(0),0), put_value(y(1),1), call_c('Portray_Clause_2',[],[x(0),x(1)]), fail, label(1), trust_me_else_fail, proceed]). predicate('$portray_clause'/2,52,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(portray_clause,0), put_value(y(1),1), call(set_bip_name/2), put_value(y(0),0), call('$$portray_clause/2_$aux1'/1), put_value(y(0),0), call('$$portray_clause/2_$aux2'/1), put_value(y(0),0), call(name_singleton_vars/1), put_value(y(0),0), put_structure(exclude/1,2), unify_list, unify_local_value(y(0)), unify_nil, put_list(1), unify_value(x(2)), unify_nil, call(bind_variables/2), put_atom(portray_clause,0), put_value(y(1),1), deallocate, execute(set_bip_name/2)]). predicate('$$portray_clause/2_$aux2'/1,52,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Callable',[fast_call,boolean],[x(0)]), cut(x(1)), proceed, label(1), trust_me_else_fail, put_value(x(0),1), put_atom(callable,0), execute('$pl_err_type'/2)]). predicate('$$portray_clause/2_$aux1'/1,52,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$pl_err_instantiation'/0), label(1), trust_me_else_fail, proceed]). predicate(name_singleton_vars/1,69,static,private,built_in,[ put_atom(name_singleton_vars,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Name_Singleton_Vars_1',[],[x(0)]), proceed]). predicate(name_query_vars/2,76,static,private,built_in,[ put_atom(name_query_vars,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Name_Query_Vars_2',[boolean],[x(0),x(1)]), proceed]). predicate(bind_variables/2,85,static,private,built_in,[ allocate(5), get_variable(y(0),0), get_variable(y(1),1), put_atom(bind_variables,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_bind_variables_defaults'/0), put_value(y(1),0), put_variable(y(2),1), put_variable(y(3),2), put_variable(y(4),3), call('$get_bind_variables_options'/4), put_value(y(0),0), put_unsafe_value(y(2),1), put_unsafe_value(y(3),2), put_unsafe_value(y(4),3), deallocate, execute('$bind_variables'/4)]). predicate('$bind_variables'/4,92,static,private,built_in,[ call_c('Bind_Variables_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). predicate('$set_bind_variables_defaults'/0,98,static,private,built_in,[ put_integer(0,0), put_integer(0,1), execute('$sys_var_write'/2)]). predicate('$get_bind_variables_options'/4,104,static,private,built_in,[ allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_value(y(0),0), call('$check_list'/1), put_atom('$bind_exclude',0), put_nil(1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom('$bind_from',0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom('$bind_next',0), put_void(1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(0),0), call('$get_bind_variables_options1'/1), put_atom('$bind_exclude',0), put_value(y(1),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom('$bind_from',0), put_value(y(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom('$bind_next',0), put_value(y(3),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), deallocate, proceed]). predicate('$get_bind_variables_options1'/1,115,static,private,built_in,[ load_cut_level(1), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_variable(y(1),1), call('$get_bind_variables_options2'/1), cut(y(1)), put_value(y(0),0), deallocate, execute('$get_bind_variables_options1'/1)]). predicate('$get_bind_variables_options2'/1,122,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), execute('$pl_err_instantiation'/0), label(1), retry_me_else(14), switch_on_term(4,2,fail,fail,3), label(2), switch_on_atom([(numbervars,11),(namevars,13)]), label(3), switch_on_structure([(exclude/1,5),(from/1,7),(next/1,9)]), label(4), try_me_else(6), label(5), get_structure(exclude/1,0), unify_variable(x(1)), put_atom('$bind_exclude',0), call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), proceed, label(6), retry_me_else(8), label(7), get_structure(from/1,0), unify_variable(x(1)), put_atom('$bind_from',0), call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), proceed, label(8), retry_me_else(10), label(9), get_structure(next/1,0), unify_variable(x(1)), put_atom('$bind_next',0), call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), proceed, label(10), retry_me_else(12), label(11), get_atom(numbervars,0), put_integer(0,0), put_integer(0,1), execute('$sys_var_write'/2), label(12), trust_me_else_fail, label(13), get_atom(namevars,0), put_integer(0,0), put_integer(1,1), execute('$sys_var_write'/2), label(14), trust_me_else_fail, put_value(x(0),1), put_atom(var_binding_option,0), execute('$pl_err_domain'/2)]). predicate(numbervars/1,147,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(numbervars,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_bind_variables_defaults'/0), put_value(y(0),0), put_nil(1), put_integer(0,2), put_void(3), deallocate, execute('$bind_variables'/4)]). predicate(numbervars/3,153,static,private,built_in,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(numbervars,0), put_integer(3,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_bind_variables_defaults'/0), put_value(y(0),0), put_nil(1), put_value(y(1),2), put_value(y(2),3), deallocate, execute('$bind_variables'/4)]). ./gprolog-1.3.0/src/BipsPl/arith_inl.pl0000644004425400513100000000405210547162351016264 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : arith_inl.pl * * Descr.: arithmetic (inline) management - defs for meta-call * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: arith_inl.pl,v 1.11 2007/01/04 10:35:06 diaz Exp $ */ :- built_in. '$use_arith_inl'. X is Y :- X is Y. X =:= Y :- X =:= Y. X =\= Y :- X =\= Y. X < Y :- X < Y. X =< Y :- X =< Y. X > Y :- X > Y. X >= Y :- X >= Y. '$arith_eval'(X, Y) :- '$call_c'('Arith_Eval_2'(X, Y)). ./gprolog-1.3.0/src/BipsPl/throw.pl0000644004425400513100000000464210547162354015466 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : throw.pl * * Descr.: exception management (throw) * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: throw.pl,v 1.11 2007/01/04 10:35:12 diaz Exp $ */ :- built_in. '$use_throw'. '$throw'(Ball, Func, Arity, DebugCall) :- '$call_c'('Save_Call_Info_3'(Func, Arity, DebugCall)), '$throw1'(Ball, 0). '$throw1'(Ball, CallInfo) :- '$call_c'('Load_Call_Info_Arg_1'(1)), % to ensure CallInfo is deref '$throw_internal'(Ball, CallInfo). '$throw_internal'(Ball, CallInfo) :- ( var(Ball) -> '$call_c'('Call_Info_Bip_Name_1'(CallInfo)), '$pl_err_instantiation' ; true ), '$sys_var_put'(8, Ball), '$unwind'(Ball). '$unwind'(Ball) :- '$sys_var_read'(7, Handler), '$call_c'('Throw_2'(Ball, Handler)), % mainly does a cut fail. ./gprolog-1.3.0/src/BipsPl/error_supp.h0000644004425400513100000002211410547154135016327 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : error_supp.h * * Descr.: Prolog errors support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: error_supp.h,v 1.13 2007/01/04 10:35:09 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef ERROR_SUPP_FILE int type_atom; int type_atomic; int type_byte; int type_callable; int type_character; int type_compound; int type_evaluable; int type_float; /* for arithmetic */ int type_boolean; /* for setarg/4 */ int type_in_byte; int type_in_character; int type_integer; int type_list; int type_number; int type_predicate_indicator; int type_variable; int type_fd_variable; /* for FD */ int type_fd_evaluable; /* for FD */ int type_fd_bool_evaluable; /* for FD */ int domain_character_code_list; int domain_close_option; int domain_flag_value; int domain_io_mode; int domain_non_empty_list; int domain_not_less_than_zero; int domain_operator_priority; int domain_operator_specifier; int domain_prolog_flag; int domain_read_option; int domain_source_sink; int domain_stream; int domain_stream_option; int domain_stream_or_alias; int domain_stream_position; int domain_stream_property; int domain_write_option; int domain_term_stream_or_alias; /* for term_streams */ int domain_g_array_index; /* for g_vars */ int domain_g_argument_selector; /* for g_vars */ int domain_stream_seek_method; /* for seek/4 */ int domain_format_control_sequence; /* for format/2-3 */ int domain_os_path; /* for absolute_file_name/2 */ int domain_os_file_permission; /* for file_permission/2 */ int domain_selectable_item; /* for select_read/3 */ int domain_date_time; /* for os_interf */ #ifndef NO_USE_SOCKETS int domain_socket_domain; /* for sockets */ int domain_socket_address; /* for sockets */ #endif int existence_procedure; int existence_source_sink; int existence_stream; int existence_sr_descriptor; /* for source reader */ int permission_operation_access; int permission_operation_close; int permission_operation_create; int permission_operation_input; int permission_operation_modify; int permission_operation_open; int permission_operation_output; int permission_operation_reposition; int permission_type_binary_stream; int permission_type_flag; int permission_type_operator; int permission_type_past_end_of_stream; int permission_type_private_procedure; int permission_type_static_procedure; int permission_type_source_sink; int permission_type_stream; int permission_type_text_stream; int representation_character; int representation_character_code; int representation_in_character_code; int representation_max_arity; int representation_max_integer; int representation_min_integer; int representation_too_many_variables; /* for Copy_Term(),... */ int evluation_float_overflow; int evluation_int_overflow; int evluation_undefined; int evluation_underflow; int evluation_zero_divisor; int resource_print_object_not_linked; /* for print and format */ int resource_too_big_fd_constraint; /* for FD */ #else extern int type_atom; extern int type_atomic; extern int type_byte; extern int type_callable; extern int type_character; extern int type_compound; extern int type_evaluable; extern int type_float; /* for arithmetic */ extern int type_boolean; /* for setarg/4 */ extern int type_in_byte; extern int type_in_character; extern int type_integer; extern int type_list; extern int type_number; extern int type_predicate_indicator; extern int type_variable; extern int type_fd_variable; /* for FD */ extern int type_fd_evaluable; /* for FD */ extern int type_fd_bool_evaluable; /* for FD */ extern int domain_character_code_list; extern int domain_close_option; extern int domain_flag_value; extern int domain_io_mode; extern int domain_non_empty_list; extern int domain_not_less_than_zero; extern int domain_operator_priority; extern int domain_operator_specifier; extern int domain_prolog_flag; extern int domain_read_option; extern int domain_source_sink; extern int domain_stream; extern int domain_stream_option; extern int domain_stream_or_alias; extern int domain_stream_position; extern int domain_stream_property; extern int domain_write_option; extern int domain_term_stream_or_alias; /* for term_streams */ extern int domain_g_array_index; /* for g_vars */ extern int domain_g_argument_selector; /* for g_vars */ extern int domain_stream_seek_method; /* for seek/4 */ extern int domain_format_control_sequence; /* for format/2-3 */ extern int domain_os_path; /* for absolute_file_name/2 */ extern int domain_os_file_permission; /* for file_permission/2 */ extern int domain_selectable_item; /* for select_read/3 */ extern int domain_date_time; /* for os_interf */ #ifndef NO_USE_SOCKETS extern int domain_socket_domain; /* for sockets */ extern int domain_socket_address; /* for sockets */ #endif extern int existence_procedure; extern int existence_source_sink; extern int existence_stream; extern int existence_sr_descriptor; /* for source reader */ extern int permission_operation_access; extern int permission_operation_close; extern int permission_operation_create; extern int permission_operation_input; extern int permission_operation_modify; extern int permission_operation_open; extern int permission_operation_output; extern int permission_operation_reposition; extern int permission_type_binary_stream; extern int permission_type_flag; extern int permission_type_operator; extern int permission_type_past_end_of_stream; extern int permission_type_private_procedure; extern int permission_type_static_procedure; extern int permission_type_source_sink; extern int permission_type_stream; extern int permission_type_text_stream; extern int representation_character; extern int representation_character_code; extern int representation_in_character_code; extern int representation_max_arity; extern int representation_max_integer; extern int representation_min_integer; extern int representation_too_many_variables; /* for Copy_Term(),... */ extern int evluation_float_overflow; extern int evluation_int_overflow; extern int evluation_undefined; extern int evluation_underflow; extern int evluation_zero_divisor; extern int resource_too_many_open_streams; /* for streams */ extern int resource_print_object_not_linked; /* for print and format */ extern int resource_too_big_fd_constraint; /* for FD */ #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Set_Bip_Name_2(WamWord func_word, WamWord arity_word); void FC Set_C_Bip_Name(char *func_str, int arity); void Unset_C_Bip_Name(void); int Get_Current_Bip(int *arity); void Set_Last_Syntax_Error(char *file_name, int err_line, int err_col, char *err_msg); void Syntax_Error(int flag_value); void Unknown_Pred_Error(int func, int arity); void Os_Error(void); void Pl_Err_Instantiation(void); void Pl_Err_Type(int atom_type, WamWord term); void Pl_Err_Domain(int atom_domain, WamWord term); void Pl_Err_Existence(int atom_object, WamWord term); void Pl_Err_Permission(int atom_oper, int atom_perm, WamWord term); void Pl_Err_Representation(int atom_flag); void Pl_Err_Evaluation(int atom_error); void Pl_Err_Resource(int atom_resource); void Pl_Err_Syntax(int atom_error); void Pl_Err_System(int atom_error); #define Os_Test_Error(tst) \ do { if (tst) { Os_Error(); return FALSE; } } while(0) ./gprolog-1.3.0/src/BipsPl/random.wam0000644004425400513100000000215210547440332015741 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : random.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/random.pl'). predicate('$use_random'/0,29,static,private,built_in,[ proceed]). predicate(randomize/0,33,static,private,built_in,[ call_c('M_Randomize',[],[]), proceed]). predicate(set_seed/1,39,static,private,built_in,[ put_atom(set_seed,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Set_Seed_1',[],[x(0)]), proceed]). predicate(get_seed/1,46,static,private,built_in,[ put_atom(get_seed,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Get_Seed_1',[boolean],[x(0)]), proceed]). predicate(random/1,53,static,private,built_in,[ put_atom(random,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Random_1',[],[x(0)]), proceed]). predicate(random/3,60,static,private,built_in,[ put_atom(random,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('Random_3',[boolean],[x(0),x(1),x(2)]), proceed]). ./gprolog-1.3.0/src/BipsPl/atom.wam0000644004425400513100000002052710547440331015426 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : atom.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/atom.pl'). predicate('$use_atom'/0,29,static,private,built_in,[ proceed]). predicate(atom_length/2,32,static,private,built_in,[ put_atom(atom_length,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Atom_Length_2',[boolean],[x(0),x(1)]), proceed]). predicate(atom_concat/3,39,static,private,built_in,[ put_atom(atom_concat,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('Atom_Concat_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate('$atom_concat_alt'/0,43,static,private,built_in,[ call_c('Atom_Concat_Alt_0',[boolean],[]), proceed]). predicate(sub_atom/5,48,static,private,built_in,[ put_atom(sub_atom,5), put_integer(5,6), call_c('Set_Bip_Name_2',[],[x(5),x(6)]), call_c('Sub_Atom_5',[boolean],[x(0),x(1),x(2),x(3),x(4)]), proceed]). predicate('$sub_atom_alt'/0,53,static,private,built_in,[ call_c('Sub_Atom_Alt_0',[boolean],[]), proceed]). predicate(atom_chars/2,59,static,private,built_in,[ put_atom(atom_chars,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Atom_Chars_2',[boolean],[x(0),x(1)]), proceed]). predicate(atom_codes/2,66,static,private,built_in,[ put_atom(atom_codes,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Atom_Codes_2',[boolean],[x(0),x(1)]), proceed]). predicate(number_atom/2,73,static,private,built_in,[ put_atom(number_atom,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Number_Atom_2',[boolean],[x(0),x(1)]), proceed]). predicate(number_chars/2,80,static,private,built_in,[ put_atom(number_chars,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Number_Chars_2',[boolean],[x(0),x(1)]), proceed]). predicate(number_codes/2,87,static,private,built_in,[ put_atom(number_codes,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Number_Codes_2',[boolean],[x(0),x(1)]), proceed]). predicate(char_code/2,94,static,private,built_in,[ put_atom(char_code,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Char_Code_2',[boolean],[x(0),x(1)]), proceed]). predicate(name/2,101,static,private,built_in,[ put_atom(name,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Name_2',[boolean],[x(0),x(1)]), proceed]). predicate(lower_upper/2,108,static,private,built_in,[ put_atom(lower_upper,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Lower_Upper_2',[boolean],[x(0),x(1)]), proceed]). predicate(atom_hash/2,115,static,private,built_in,[ put_atom(atom_hash,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Atom_Hash_2',[boolean],[x(0),x(1)]), proceed]). predicate(current_atom/1,122,static,private,built_in,[ put_atom(current_atom,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), execute('$current_atom'/1)]). predicate('$current_atom'/1,127,static,private,built_in,[ put_integer(1,1), call_c('Current_Atom_2',[boolean],[x(0),x(1)]), proceed]). predicate('$current_atom_any'/1,130,static,private,built_in,[ put_integer(0,1), call_c('Current_Atom_2',[boolean],[x(0),x(1)]), proceed]). predicate('$current_atom_alt'/0,134,static,private,built_in,[ call_c('Current_Atom_Alt_0',[boolean],[]), proceed]). predicate(atom_property/2,141,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(atom_property,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), call('$current_atom'/1), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$atom_property1'/2)]). predicate('$atom_property_any'/2,146,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_value(y(0),0), call('$current_atom_any'/1), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$atom_property1'/2)]). predicate('$atom_property1'/2,153,static,private,built_in,[ load_cut_level(2), allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_value(y(1),0), call('$check_atom_prop'/1), cut(y(2)), put_value(y(0),0), put_variable(x(2),1), put_variable(x(3),7), put_variable(x(4),8), put_variable(x(5),9), put_variable(x(6),10), call_c('Atom_Property_6',[],[x(0),x(1),x(7),x(8),x(9),x(10)]), put_value(y(1),0), put_value(y(0),1), deallocate, execute('$atom_property2'/7)]). predicate('$check_atom_prop'/1,160,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), proceed, label(1), retry_me_else(18), switch_on_term(4,2,fail,fail,3), label(2), switch_on_atom([(prefix_op,9),(infix_op,11),(postfix_op,13),(needs_quotes,15),(needs_scan,17)]), label(3), switch_on_structure([(length/1,5),(hash/1,7)]), label(4), try_me_else(6), label(5), get_structure(length/1,0), unify_void(1), proceed, label(6), retry_me_else(8), label(7), get_structure(hash/1,0), unify_void(1), proceed, label(8), retry_me_else(10), label(9), get_atom(prefix_op,0), proceed, label(10), retry_me_else(12), label(11), get_atom(infix_op,0), proceed, label(12), retry_me_else(14), label(13), get_atom(postfix_op,0), proceed, label(14), retry_me_else(16), label(15), get_atom(needs_quotes,0), proceed, label(16), trust_me_else_fail, label(17), get_atom(needs_scan,0), proceed, label(18), trust_me_else_fail, put_value(x(0),1), put_atom(atom_property,0), execute('$pl_err_domain'/2)]). predicate('$atom_property2'/7,183,static,private,built_in,[ switch_on_term(3,1,fail,fail,2), label(1), switch_on_atom([(prefix_op,8),(infix_op,10),(postfix_op,12),(needs_quotes,14),(needs_scan,16)]), label(2), switch_on_structure([(length/1,4),(hash/1,6)]), label(3), try_me_else(5), label(4), get_structure(length/1,0), unify_variable(x(0)), call_c('Atom_Length_2',[boolean],[x(1),x(0)]), proceed, label(5), retry_me_else(7), label(6), get_structure(hash/1,0), unify_variable(x(0)), call_c('Atom_Hash_2',[boolean],[x(1),x(0)]), proceed, label(7), retry_me_else(9), label(8), get_atom(prefix_op,0), get_integer(1,2), proceed, label(9), retry_me_else(11), label(10), get_atom(infix_op,0), get_integer(1,3), proceed, label(11), retry_me_else(13), label(12), get_atom(postfix_op,0), get_integer(1,4), proceed, label(13), retry_me_else(15), label(14), get_atom(needs_quotes,0), get_integer(1,5), proceed, label(15), trust_me_else_fail, label(16), get_atom(needs_scan,0), get_integer(1,6), proceed]). predicate(new_atom/1,202,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(new_atom,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(0,1), call('$sys_var_write'/2), put_atom(atom_,0), put_integer(0,1), put_value(y(0),2), deallocate, call_c('New_Atom_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(new_atom/2,207,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(new_atom,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(0,1), call('$sys_var_write'/2), put_value(y(0),0), put_integer(0,1), put_value(y(1),2), deallocate, call_c('New_Atom_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(new_atom/3,212,static,private,built_in,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(new_atom,0), put_integer(3,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(1,1), call('$sys_var_write'/2), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, call_c('New_Atom_3',[boolean],[x(0),x(1),x(2)]), proceed]). ./gprolog-1.3.0/src/BipsPl/char_io_c.c0000644004425400513100000004252510547154134016037 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : char_io_c.c * * Descr.: character input-output management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: char_io_c.c,v 1.11 2007/01/04 10:35:08 diaz Exp $ */ #include #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * GET_KEY_2 * * * *-------------------------------------------------------------------------*/ Bool Get_Key_2(WamWord sora_word, WamWord code_word) { int stm; int c; stm = (sora_word == NOT_A_WAM_WORD) ? stm_input : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); last_input_sora = sora_word; Check_Stream_Type(stm, TRUE, TRUE); Check_For_Un_Integer(code_word); c = Stream_Get_Key(stm_tbl[stm], TRUE, TRUE); if (c == EOF) c = -1; return Get_Integer(c, code_word); } /*-------------------------------------------------------------------------* * GET_KEY_1 * * * *-------------------------------------------------------------------------*/ Bool Get_Key_1(WamWord code_word) { return Get_Key_2(NOT_A_WAM_WORD, code_word); } /*-------------------------------------------------------------------------* * GET_KEY_NO_ECHO_2 * * * *-------------------------------------------------------------------------*/ Bool Get_Key_No_Echo_2(WamWord sora_word, WamWord code_word) { int stm; int c; stm = (sora_word == NOT_A_WAM_WORD) ? stm_input : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); last_input_sora = sora_word; Check_Stream_Type(stm, TRUE, TRUE); Check_For_Un_Integer(code_word); c = Stream_Get_Key(stm_tbl[stm], FALSE, TRUE); if (c == EOF) c = -1; return Get_Integer(c, code_word); } /*-------------------------------------------------------------------------* * GET_KEY_NO_ECHO_1 * * * *-------------------------------------------------------------------------*/ Bool Get_Key_No_Echo_1(WamWord code_word) { return Get_Key_No_Echo_2(NOT_A_WAM_WORD, code_word); } /*-------------------------------------------------------------------------* * GET_CHAR_2 * * * *-------------------------------------------------------------------------*/ Bool Get_Char_2(WamWord sora_word, WamWord char_word) { int stm; int c; stm = (sora_word == NOT_A_WAM_WORD) ? stm_input : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); last_input_sora = sora_word; Check_Stream_Type(stm, TRUE, TRUE); Check_For_Un_In_Char(char_word); c = Stream_Getc(stm_tbl[stm]); if (c != EOF && !Is_Valid_Code(c)) Pl_Err_Representation(representation_character); return Get_Atom((c == EOF) ? atom_end_of_file : ATOM_CHAR(c), char_word); } /*-------------------------------------------------------------------------* * GET_CHAR_1 * * * *-------------------------------------------------------------------------*/ Bool Get_Char_1(WamWord char_word) { return Get_Char_2(NOT_A_WAM_WORD, char_word); } /*-------------------------------------------------------------------------* * GET_CODE_2 * * * *-------------------------------------------------------------------------*/ Bool Get_Code_2(WamWord sora_word, WamWord code_word) { int stm; int c; stm = (sora_word == NOT_A_WAM_WORD) ? stm_input : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); last_input_sora = sora_word; Check_Stream_Type(stm, TRUE, TRUE); Check_For_Un_In_Code(code_word); c = Stream_Getc(stm_tbl[stm]); if (c != EOF && !Is_Valid_Code(c)) Pl_Err_Representation(representation_character); if (c == EOF) c = -1; return Get_Integer(c, code_word); } /*-------------------------------------------------------------------------* * GET_CODE_1 * * * *-------------------------------------------------------------------------*/ Bool Get_Code_1(WamWord code_word) { return Get_Code_2(NOT_A_WAM_WORD, code_word); } /*-------------------------------------------------------------------------* * GET_BYTE_2 * * * *-------------------------------------------------------------------------*/ Bool Get_Byte_2(WamWord sora_word, WamWord byte_word) { int stm; int c; stm = (sora_word == NOT_A_WAM_WORD) ? stm_input : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); last_input_sora = sora_word; Check_Stream_Type(stm, FALSE, TRUE); Check_For_Un_In_Byte(byte_word); c = Stream_Getc(stm_tbl[stm]); if (c == EOF) c = -1; return Get_Integer(c, byte_word); } /*-------------------------------------------------------------------------* * GET_BYTE_1 * * * *-------------------------------------------------------------------------*/ Bool Get_Byte_1(WamWord byte_word) { return Get_Byte_2(NOT_A_WAM_WORD, byte_word); } /*-------------------------------------------------------------------------* * UNGET_CHAR_2 * * * *-------------------------------------------------------------------------*/ void Unget_Char_2(WamWord sora_word, WamWord char_word) { int stm; stm = (sora_word == NOT_A_WAM_WORD) ? stm_input : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); last_input_sora = sora_word; Check_Stream_Type(stm, TRUE, TRUE); Stream_Ungetc(Rd_Char_Check(char_word), stm_tbl[stm]); } /*-------------------------------------------------------------------------* * UNGET_CHAR_1 * * * *-------------------------------------------------------------------------*/ void Unget_Char_1(WamWord char_word) { Unget_Char_2(NOT_A_WAM_WORD, char_word); } /*-------------------------------------------------------------------------* * UNGET_CODE_2 * * * *-------------------------------------------------------------------------*/ void Unget_Code_2(WamWord sora_word, WamWord code_word) { int stm; stm = (sora_word == NOT_A_WAM_WORD) ? stm_input : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); last_input_sora = sora_word; Check_Stream_Type(stm, TRUE, TRUE); Stream_Ungetc(Rd_Code_Check(code_word), stm_tbl[stm]); } /*-------------------------------------------------------------------------* * UNGET_CODE_1 * * * *-------------------------------------------------------------------------*/ void Unget_Code_1(WamWord code_word) { Unget_Code_2(NOT_A_WAM_WORD, code_word); } /*-------------------------------------------------------------------------* * UNGET_BYTE_2 * * * *-------------------------------------------------------------------------*/ void Unget_Byte_2(WamWord sora_word, WamWord byte_word) { int stm; stm = (sora_word == NOT_A_WAM_WORD) ? stm_input : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); last_input_sora = sora_word; Check_Stream_Type(stm, FALSE, TRUE); Stream_Ungetc(Rd_Byte_Check(byte_word), stm_tbl[stm]); } /*-------------------------------------------------------------------------* * UNGET_BYTE_1 * * * *-------------------------------------------------------------------------*/ void Unget_Byte_1(WamWord byte_word) { Unget_Byte_2(NOT_A_WAM_WORD, byte_word); } /*-------------------------------------------------------------------------* * PEEK_CHAR_2 * * * *-------------------------------------------------------------------------*/ Bool Peek_Char_2(WamWord sora_word, WamWord char_word) { int stm; int c; stm = (sora_word == NOT_A_WAM_WORD) ? stm_input : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); last_input_sora = sora_word; Check_Stream_Type(stm, TRUE, TRUE); Check_For_Un_In_Char(char_word); c = Stream_Peekc(stm_tbl[stm]); if (c != EOF && !Is_Valid_Code(c)) Pl_Err_Representation(representation_character); return Get_Atom((c == EOF) ? atom_end_of_file : ATOM_CHAR(c), char_word); } /*-------------------------------------------------------------------------* * PEEK_CHAR_1 * * * *-------------------------------------------------------------------------*/ Bool Peek_Char_1(WamWord char_word) { return Peek_Char_2(NOT_A_WAM_WORD, char_word); } /*-------------------------------------------------------------------------* * PEEK_CODE_2 * * * *-------------------------------------------------------------------------*/ Bool Peek_Code_2(WamWord sora_word, WamWord code_word) { int stm; int c; stm = (sora_word == NOT_A_WAM_WORD) ? stm_input : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); last_input_sora = sora_word; Check_Stream_Type(stm, TRUE, TRUE); Check_For_Un_In_Code(code_word); c = Stream_Peekc(stm_tbl[stm]); if (c != EOF && !Is_Valid_Code(c)) Pl_Err_Representation(representation_character); if (c == EOF) c = -1; return Get_Integer(c, code_word); } /*-------------------------------------------------------------------------* * PEEK_CODE_1 * * * *-------------------------------------------------------------------------*/ Bool Peek_Code_1(WamWord code_word) { return Peek_Code_2(NOT_A_WAM_WORD, code_word); } /*-------------------------------------------------------------------------* * PEEK_BYTE_2 * * * *-------------------------------------------------------------------------*/ Bool Peek_Byte_2(WamWord sora_word, WamWord byte_word) { int stm; int c; stm = (sora_word == NOT_A_WAM_WORD) ? stm_input : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); last_input_sora = sora_word; Check_Stream_Type(stm, FALSE, TRUE); Check_For_Un_In_Byte(byte_word); c = Stream_Peekc(stm_tbl[stm]); if (c == EOF) c = -1; return Get_Integer(c, byte_word); } /*-------------------------------------------------------------------------* * PEEK_BYTE_1 * * * *-------------------------------------------------------------------------*/ Bool Peek_Byte_1(WamWord byte_word) { return Peek_Byte_2(NOT_A_WAM_WORD, byte_word); } /*-------------------------------------------------------------------------* * PUT_CHAR_2 * * * *-------------------------------------------------------------------------*/ void Put_Char_2(WamWord sora_word, WamWord char_word) { int stm; stm = (sora_word == NOT_A_WAM_WORD) ? stm_output : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_OUTPUT); last_output_sora = sora_word; Check_Stream_Type(stm, TRUE, FALSE); Stream_Putc(Rd_Char_Check(char_word), stm_tbl[stm]); } /*-------------------------------------------------------------------------* * PUT_CHAR_1 * * * *-------------------------------------------------------------------------*/ void Put_Char_1(WamWord char_word) { Put_Char_2(NOT_A_WAM_WORD, char_word); } /*-------------------------------------------------------------------------* * PUT_CODE_2 * * * *-------------------------------------------------------------------------*/ void Put_Code_2(WamWord sora_word, WamWord code_word) { int stm; stm = (sora_word == NOT_A_WAM_WORD) ? stm_output : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_OUTPUT); last_output_sora = sora_word; Check_Stream_Type(stm, TRUE, FALSE); Stream_Putc(Rd_Code_Check(code_word), stm_tbl[stm]); } /*-------------------------------------------------------------------------* * PUT_CODE_1 * * * *-------------------------------------------------------------------------*/ void Put_Code_1(WamWord code_word) { Put_Code_2(NOT_A_WAM_WORD, code_word); } /*-------------------------------------------------------------------------* * PUT_BYTE_2 * * * *-------------------------------------------------------------------------*/ void Put_Byte_2(WamWord sora_word, WamWord byte_word) { int stm; stm = (sora_word == NOT_A_WAM_WORD) ? stm_output : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_OUTPUT); last_output_sora = sora_word; Check_Stream_Type(stm, FALSE, FALSE); Stream_Putc(Rd_Byte_Check(byte_word), stm_tbl[stm]); } /*-------------------------------------------------------------------------* * PUT_BYTE_1 * * * *-------------------------------------------------------------------------*/ void Put_Byte_1(WamWord byte_word) { Put_Byte_2(NOT_A_WAM_WORD, byte_word); } ./gprolog-1.3.0/src/BipsPl/stat_c.c0000644004425400513100000002642010547154140015377 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : stat_c.c * * Descr.: statistics predicate management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: stat_c.c,v 1.10 2007/01/04 10:35:12 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static long last_user_time = 0; static long last_system_time = 0; static long last_cpu_time = 0; static long last_real_time = 0; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Stack_Size(int stack_nb, int *used, int *free); /*-------------------------------------------------------------------------* * STATISTICS_0 * * * *-------------------------------------------------------------------------*/ void Statistics_0(void) { StmInf *pstm = stm_tbl[stm_stdout]; int used, free; long t[4], l[4]; static char *n[4] = { "user", "system", "cpu", "real" }; int i; Stream_Printf(pstm, "Stacks size in use free\n\n"); for (i = 0; i < NB_OF_STACKS; i++) { Stack_Size(i, &used, &free); if (used + free == 0) /* ie. size=0 (e.g. cstr_stack) */ continue; used /= 1024; free /= 1024; Stream_Printf(pstm, " %-6s stack %10d Kb %10d Kb %10d Kb\n", stk_tbl[i].name, used + free, used, free); } t[0] = M_User_Time(); l[0] = t[0] - last_user_time; t[1] = M_System_Time(); l[1] = t[1] - last_system_time; t[2] = t[0] + t[1]; l[2] = t[2] - last_cpu_time; t[3] = M_Real_Time(); l[3] = t[3] - last_real_time; last_user_time = t[0]; last_system_time = t[1]; last_cpu_time = t[2]; last_real_time = t[3]; Stream_Printf(pstm, "\nTimes since start since last\n\n"); for (i = 0; i < 4; i++) Stream_Printf(pstm, " %-6s time %11.3f sec %11.3f sec\n", n[i], (double) t[i] / 1000.0, (double) l[i] / 1000.0); } /*-------------------------------------------------------------------------* * STATISTICS_USER_TIME_2 * * * *-------------------------------------------------------------------------*/ Bool Statistics_User_Time_2(WamWord since_start_word, WamWord since_last_word) { long user_time; int since_start, since_last; user_time = M_User_Time(); since_start = user_time; since_last = user_time - last_user_time; last_user_time = user_time; return Un_Integer_Check(since_start, since_start_word) && Un_Integer_Check(since_last, since_last_word); } /*-------------------------------------------------------------------------* * STATISTICS_SYSTEM_TIME_2 * * * *-------------------------------------------------------------------------*/ Bool Statistics_System_Time_2(WamWord since_start_word, WamWord since_last_word) { long system_time; int since_start, since_last; system_time = M_System_Time(); since_start = system_time; since_last = system_time - last_system_time; last_system_time = system_time; return Un_Integer_Check(since_start, since_start_word) && Un_Integer_Check(since_last, since_last_word); } /*-------------------------------------------------------------------------* * STATISTICS_CPU_TIME_2 * * * *-------------------------------------------------------------------------*/ Bool Statistics_Cpu_Time_2(WamWord since_start_word, WamWord since_last_word) { long cpu_time; int since_start, since_last; cpu_time = M_User_Time() + M_System_Time(); since_start = cpu_time; since_last = cpu_time - last_cpu_time; last_cpu_time = cpu_time; return Un_Integer_Check(since_start, since_start_word) && Un_Integer_Check(since_last, since_last_word); } /*-------------------------------------------------------------------------* * STATISTICS_REAL_TIME_2 * * * *-------------------------------------------------------------------------*/ Bool Statistics_Real_Time_2(WamWord since_start_word, WamWord since_last_word) { long real_time; int since_start, since_last; real_time = M_Real_Time(); since_start = real_time; since_last = real_time - last_real_time; last_real_time = real_time; return Un_Integer_Check(since_start, since_start_word) && Un_Integer_Check(since_last, since_last_word); } /*-------------------------------------------------------------------------* * STATISTICS_LOCAL_STACK_2 * * * *-------------------------------------------------------------------------*/ Bool Statistics_Local_Stack_2(WamWord used_word, WamWord free_word) { int i, used, free; for (i = 0; i < NB_OF_STACKS; i++) if (stk_tbl[i].stack == Local_Stack) Stack_Size(i, &used, &free); return Un_Integer_Check(used, used_word) && Un_Integer_Check(free, free_word); } /*-------------------------------------------------------------------------* * STATISTICS_GLOBAL_STACK_2 * * * *-------------------------------------------------------------------------*/ Bool Statistics_Global_Stack_2(WamWord used_word, WamWord free_word) { int i, used, free; for (i = 0; i < NB_OF_STACKS; i++) if (stk_tbl[i].stack == Global_Stack) Stack_Size(i, &used, &free); return Un_Integer_Check(used, used_word) && Un_Integer_Check(free, free_word); } /*-------------------------------------------------------------------------* * STATISTICS_TRAIL_STACK_2 * * * *-------------------------------------------------------------------------*/ Bool Statistics_Trail_Stack_2(WamWord used_word, WamWord free_word) { int i, used, free; for (i = 0; i < NB_OF_STACKS; i++) if (stk_tbl[i].stack == Trail_Stack) Stack_Size(i, &used, &free); return Un_Integer_Check(used, used_word) && Un_Integer_Check(free, free_word); } /*-------------------------------------------------------------------------* * STATISTICS_CSTR_STACK_2 * * * *-------------------------------------------------------------------------*/ Bool Statistics_Cstr_Stack_2(WamWord used_word, WamWord free_word) { int i, used, free; for (i = 0; i < NB_OF_STACKS; i++) if (stk_tbl[i].stack == Cstr_Stack) Stack_Size(i, &used, &free); return Un_Integer_Check(used, used_word) && Un_Integer_Check(free, free_word); } /*-------------------------------------------------------------------------* * STACK_SIZE * * * *-------------------------------------------------------------------------*/ static void Stack_Size(int stack_nb, int *used, int *free) { *used = Stack_Top(stack_nb) - stk_tbl[stack_nb].stack; *free = stk_tbl[stack_nb].size - *used; if (stk_tbl[stack_nb].stack == Global_Stack) /* see Init_Wam_Engine */ *used += REG_BANK_SIZE; *used *= sizeof(WamWord); *free *= sizeof(WamWord); } /*-------------------------------------------------------------------------* * USER_TIME_1 * * * *-------------------------------------------------------------------------*/ Bool User_Time_1(WamWord since_start_word) { return Un_Integer_Check(M_User_Time(), since_start_word); } /*-------------------------------------------------------------------------* * SYSTEM_TIME_1 * * * *-------------------------------------------------------------------------*/ Bool System_Time_1(WamWord since_start_word) { return Un_Integer_Check(M_System_Time(), since_start_word); } /*-------------------------------------------------------------------------* * CPU_TIME_1 * * * *-------------------------------------------------------------------------*/ Bool Cpu_Time_1(WamWord since_start_word) { return Un_Integer_Check(M_User_Time() + M_System_Time(), since_start_word); } /*-------------------------------------------------------------------------* * REAL_TIME_1 * * * *-------------------------------------------------------------------------*/ Bool Real_Time_1(WamWord since_start_word) { return Un_Integer_Check(M_Real_Time(), since_start_word); } ./gprolog-1.3.0/src/BipsPl/sort.pl0000644004425400513100000000546310547162353015313 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : sort.pl * * Descr.: sort management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: sort.pl,v 1.12 2007/01/04 10:35:11 diaz Exp $ */ :- built_in. '$use_sort'. sort(List1, List2) :- set_bip_name(sort, 2), '$sys_var_write'(0, 0), % 0 = sort '$call_c_test'('Sort_List_2'(List1, List2)). sort0(List1, List2) :- set_bip_name(sort0, 2), '$sys_var_write'(0, 1), % 1 = sort0 '$call_c_test'('Sort_List_2'(List1, List2)). keysort(List1, List2) :- set_bip_name(keysort, 2), '$sys_var_write'(0, 2), % 2 = keysort '$call_c_test'('Sort_List_2'(List1, List2)). % sort in-place predicates sort(List) :- set_bip_name(sort, 1), '$sys_var_write'(0, 0), % 0 = sort '$call_c'('Sort_List_1'(List)). sort0(List) :- set_bip_name(sort0, 1), '$sys_var_write'(0, 1), % 1 = sort0 '$call_c'('Sort_List_1'(List)). keysort(List) :- set_bip_name(keysort, 1), '$sys_var_write'(0, 2), % 2 = keysort '$call_c'('Sort_List_1'(List)). ./gprolog-1.3.0/src/BipsPl/type_inl.wam0000644004425400513100000000424210547440332016306 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : type_inl.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/type_inl.pl'). predicate('$use_type_inl'/0,29,static,private,built_in,[ proceed]). predicate(var/1,32,static,private,built_in,[ call_c('Blt_Var',[fast_call,boolean],[x(0)]), proceed]). predicate(nonvar/1,35,static,private,built_in,[ call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), proceed]). predicate(atom/1,38,static,private,built_in,[ call_c('Blt_Atom',[fast_call,boolean],[x(0)]), proceed]). predicate(integer/1,41,static,private,built_in,[ call_c('Blt_Integer',[fast_call,boolean],[x(0)]), proceed]). predicate(float/1,44,static,private,built_in,[ call_c('Blt_Float',[fast_call,boolean],[x(0)]), proceed]). predicate(number/1,47,static,private,built_in,[ call_c('Blt_Number',[fast_call,boolean],[x(0)]), proceed]). predicate(atomic/1,50,static,private,built_in,[ call_c('Blt_Atomic',[fast_call,boolean],[x(0)]), proceed]). predicate(compound/1,53,static,private,built_in,[ call_c('Blt_Compound',[fast_call,boolean],[x(0)]), proceed]). predicate(callable/1,56,static,private,built_in,[ call_c('Blt_Callable',[fast_call,boolean],[x(0)]), proceed]). predicate(list/1,59,static,private,built_in,[ call_c('Blt_List',[fast_call,boolean],[x(0)]), proceed]). predicate(partial_list/1,62,static,private,built_in,[ call_c('Blt_Partial_List',[fast_call,boolean],[x(0)]), proceed]). predicate(list_or_partial_list/1,65,static,private,built_in,[ call_c('Blt_List_Or_Partial_List',[fast_call,boolean],[x(0)]), proceed]). predicate(fd_var/1,71,static,private,built_in_fd,[ call_c('Blt_Fd_Var',[fast_call,boolean],[x(0)]), proceed]). predicate(non_fd_var/1,74,static,private,built_in_fd,[ call_c('Blt_Non_Fd_Var',[fast_call,boolean],[x(0)]), proceed]). predicate(generic_var/1,77,static,private,built_in_fd,[ call_c('Blt_Generic_Var',[fast_call,boolean],[x(0)]), proceed]). predicate(non_generic_var/1,80,static,private,built_in_fd,[ call_c('Blt_Non_Generic_Var',[fast_call,boolean],[x(0)]), proceed]). ./gprolog-1.3.0/src/BipsPl/sockets_c.c0000644004425400513100000003726110547154137016112 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : sockets_c.c * * Descr.: sockets management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: sockets_c.c,v 1.16 2007/01/04 10:35:11 diaz Exp $ */ #include "gp_config.h" #include #include #include #include #ifndef _WIN32 #include #include #else #include #include #include #define SO_OPENTYPE 0x7008 #define SO_SYNCHRONOUS_NONALERT 0x20 #endif /* old versions of CYGWIN do not support AF_UNIX - modify next line */ #if defined(__unix__) || defined(__CYGWIN__) #define SUPPORT_AF_UNIX #endif #ifdef SUPPORT_AF_UNIX #include #endif #ifndef _WIN32 #include #include #include #endif #define OBJ_INIT Socket_Initializer #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef SUPPORT_AF_UNIX static int atom_AF_UNIX; #endif static int atom_AF_INET; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static Bool Create_Socket_Streams(int sock, char *stream_name, int *stm_in, int *stm_out); /*-------------------------------------------------------------------------* * SOCKET_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Socket_Initializer(void) { #ifdef _WIN32 WORD versReqstd = MAKEWORD( 2, 2); // Current Winsock 2 DLL's WSADATA wsaData; int err; int optionValue = SO_SYNCHRONOUS_NONALERT; #endif #ifdef SUPPORT_AF_UNIX atom_AF_UNIX = Create_Atom("AF_UNIX"); #endif atom_AF_INET = Create_Atom("AF_INET"); #ifdef _WIN32 if ((err = WSAStartup(versReqstd, &wsaData)) != 0 || wsaData.wVersion != versReqstd) { Stream_Printf(stm_tbl[stm_top_level_output], "warning: cannot find a usable WinSock DLL\n"); if (err == 0) WSACleanup(); } /* Allow Windows sockets to act as filehandles */ if (setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (char *)&optionValue, sizeof(optionValue)) == SOCKET_ERROR) Os_Error(); #endif } /*-------------------------------------------------------------------------* * SOCKET_2 * * * *-------------------------------------------------------------------------*/ Bool Socket_2(WamWord domain_word, WamWord socket_word) { int domain; #ifdef _WIN32 SOCKET sock; int proto = IPPROTO_TCP; #else int sock; int proto = 0; #endif domain = Rd_Atom_Check(domain_word); if ( #ifdef SUPPORT_AF_UNIX domain != atom_AF_UNIX && #endif domain != atom_AF_INET) Pl_Err_Domain(domain_socket_domain, domain_word); Check_For_Un_Variable(socket_word); #ifdef SUPPORT_AF_UNIX if (domain == atom_AF_UNIX) sock = socket(AF_UNIX, SOCK_STREAM, proto); else #endif sock = socket(AF_INET, SOCK_STREAM, proto); #ifdef _WIN32 Os_Test_Error(sock == INVALID_SOCKET); /* * Windows (by default) causes sockets to be inherited * by child processes. Turn this off. */ SetHandleInformation((HANDLE) sock, HANDLE_FLAG_INHERIT, 0); #else Os_Test_Error(sock == -1); #endif return Get_Integer(sock, socket_word); } /*-------------------------------------------------------------------------* * SOCKET_CLOSE_1 * * * *-------------------------------------------------------------------------*/ Bool Socket_Close_1(WamWord socket_word) { #ifndef _WIN32 int sock; #else SOCKET sock; #endif sock = Rd_Integer_Check(socket_word); if (sock < 2) { errno = EBADF; Os_Test_Error(1); } else #ifndef _WIN32 Os_Test_Error(close(sock)); #else Os_Test_Error(closesocket(sock)); #endif return TRUE; } /*-------------------------------------------------------------------------* * SOCKET_BIND_2 * * * *-------------------------------------------------------------------------*/ Bool Socket_Bind_2(WamWord socket_word, WamWord address_word) { WamWord word, tag_mask; WamWord *stc_adr; int dom; int sock; int port; socklen_t l; #ifdef SUPPORT_AF_UNIX char *path_name; struct sockaddr_un adr_un; #endif struct sockaddr_in adr_in; static int atom_host_name = -1; /* not created in an init since */ /* establishes a connection */ sock = Rd_Integer_Check(socket_word); DEREF(address_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_STC_MASK) { err_domain: Pl_Err_Domain(domain_socket_address, word); } stc_adr = UnTag_STC(word); #ifdef SUPPORT_AF_UNIX if (Functor_Arity(atom_AF_UNIX, 1) == Functor_And_Arity(stc_adr)) dom = AF_UNIX; else #endif if (Functor_Arity(atom_AF_INET, 2) == Functor_And_Arity(stc_adr)) dom = AF_INET; else goto err_domain; #ifdef SUPPORT_AF_UNIX if (dom == AF_UNIX) { path_name = Rd_String_Check(Arg(stc_adr, 0)); if ((path_name = M_Absolute_Path_Name(path_name)) == NULL) Pl_Err_Domain(domain_os_path, Arg(stc_adr, 0)); adr_un.sun_family = AF_UNIX; strcpy(adr_un.sun_path, path_name); unlink(path_name); Os_Test_Error(bind(sock, (struct sockaddr *) &adr_un, sizeof(adr_un)) == -1); return TRUE; } #endif /* case AF_INET */ DEREF(Arg(stc_adr, 0), word, tag_mask); if (tag_mask == TAG_REF_MASK) { if (atom_host_name < 0) atom_host_name = Create_Allocate_Atom(M_Host_Name_From_Name(NULL)); Get_Atom(atom_host_name, word); } else Rd_Atom_Check(word); /* only to test the type */ port = 0; DEREF(Arg(stc_adr, 1), word, tag_mask); if (tag_mask != TAG_REF_MASK) port = Rd_Integer_Check(word); adr_in.sin_port = htons((unsigned short) port); adr_in.sin_family = AF_INET; adr_in.sin_addr.s_addr = INADDR_ANY; Os_Test_Error(bind(sock, (struct sockaddr *) &adr_in, sizeof(adr_in))); if (tag_mask == TAG_INT_MASK) return TRUE; l = sizeof(adr_in); Os_Test_Error(getsockname(sock, (struct sockaddr *) &adr_in, &l)); port = ntohs(adr_in.sin_port); return Get_Integer(port, word); } /*-------------------------------------------------------------------------* * SOCKET_CONNECT_4 * * * *-------------------------------------------------------------------------*/ Bool Socket_Connect_4(WamWord socket_word, WamWord address_word, WamWord stm_in_word, WamWord stm_out_word) { WamWord word, tag_mask; WamWord *stc_adr; int dom; int sock; int port; char *host_name; #ifdef SUPPORT_AF_UNIX char *path_name; struct sockaddr_un adr_un; #endif struct sockaddr_in adr_in; struct hostent *host_entry; int stm_in, stm_out; char stream_name[256]; sock = Rd_Integer_Check(socket_word); DEREF(address_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_STC_MASK) { err_domain: Pl_Err_Domain(domain_socket_address, word); } stc_adr = UnTag_STC(word); #ifdef SUPPORT_AF_UNIX if (Functor_Arity(atom_AF_UNIX, 1) == Functor_And_Arity(stc_adr)) dom = AF_UNIX; else #endif if (Functor_Arity(atom_AF_INET, 2) == Functor_And_Arity(stc_adr)) dom = AF_INET; else goto err_domain; #ifdef SUPPORT_AF_UNIX if (dom == AF_UNIX) { path_name = Rd_String_Check(Arg(stc_adr, 0)); if ((path_name = M_Absolute_Path_Name(path_name)) == NULL) Pl_Err_Domain(domain_os_path, Arg(stc_adr, 0)); adr_un.sun_family = AF_UNIX; strcpy(adr_un.sun_path, path_name); Os_Test_Error(connect (sock, (struct sockaddr *) &adr_un, sizeof(adr_un))); sprintf(stream_name, "socket_stream(connect('AF_UNIX'('%s')),%d)", path_name, sock); #ifdef _WIN32 /* Check for in-progress connection */ Os_Test_Error( send(sock, "", 0, 0) ); #endif goto create_streams; } #endif /* case AF_INET */ host_name = Rd_String_Check(Arg(stc_adr, 0)); port = Rd_Integer_Check(Arg(stc_adr, 1)); host_entry = gethostbyname(host_name); if (host_entry == NULL) return FALSE; adr_in.sin_family = AF_INET; adr_in.sin_port = htons((unsigned short) port); memcpy(&adr_in.sin_addr, host_entry->h_addr_list[0], host_entry->h_length); Os_Test_Error(connect(sock, (struct sockaddr *) &adr_in, sizeof(adr_in))); sprintf(stream_name, "socket_stream(connect('AF_INET'('%s',%d)),%d)", host_name, port, sock); #ifdef SUPPORT_AF_UNIX create_streams: #endif if (!Create_Socket_Streams(sock, stream_name, &stm_in, &stm_out)) return FALSE; Get_Integer(stm_in, stm_in_word); Get_Integer(stm_out, stm_out_word); return TRUE; } /*-------------------------------------------------------------------------* * SOCKET_LISTEN_2 * * * *-------------------------------------------------------------------------*/ Bool Socket_Listen_2(WamWord socket_word, WamWord length_word) { int sock; int length; sock = Rd_Integer_Check(socket_word); length = Rd_Integer_Check(length_word); Os_Test_Error(listen(sock, length)); return TRUE; } /*-------------------------------------------------------------------------* * SOCKET_ACCEPT_4 * * * *-------------------------------------------------------------------------*/ Bool Socket_Accept_4(WamWord socket_word, WamWord client_word, WamWord stm_in_word, WamWord stm_out_word) { int sock, cli_sock; socklen_t l; struct sockaddr_in adr_in; int stm_in, stm_out; char *cli_ip_adr = "AF_UNIX"; char stream_name[256]; l = sizeof(adr_in); sock = Rd_Integer_Check(socket_word); cli_sock = accept(sock, (struct sockaddr *) &adr_in, &l); Os_Test_Error(cli_sock < 0); if (adr_in.sin_family == AF_INET) { cli_ip_adr = inet_ntoa(adr_in.sin_addr); if (cli_ip_adr == NULL) return FALSE; Get_Atom(Create_Allocate_Atom(cli_ip_adr), client_word); } sprintf(stream_name, "socket_stream(accept('%s'),%d)", cli_ip_adr, cli_sock); if (!Create_Socket_Streams(cli_sock, stream_name, &stm_in, &stm_out)) return FALSE; Get_Integer(stm_in, stm_in_word); Get_Integer(stm_out, stm_out_word); return TRUE; } /*-------------------------------------------------------------------------* * ASSOC_SOCKET_STREAMS_3 * * * *-------------------------------------------------------------------------*/ Bool Assoc_Socket_Streams_3(WamWord socket_word, WamWord stm_in_word, WamWord stm_out_word) { int stm_in, stm_out; char stream_name[256]; int sock = Rd_Integer_Check(socket_word); sprintf(stream_name, "socket_stream(assoc(%d))", sock); if (!Create_Socket_Streams(sock, stream_name, &stm_in, &stm_out)) return FALSE; Get_Integer(stm_in, stm_in_word); Get_Integer(stm_out, stm_out_word); return TRUE; } /*-------------------------------------------------------------------------* * CREATE_SOCKET_STREAMS * * * *-------------------------------------------------------------------------*/ static Bool Create_Socket_Streams(int sock, char *stream_name, int *stm_in, int *stm_out) { int fd; FILE *f_in, *f_out; int atom; int stm; #ifdef _WIN32 int r; Os_Test_Error((fd = _open_osfhandle(sock, _O_BINARY | _O_RDWR | _O_BINARY)) == -1); Os_Test_Error((r = dup(fd)) == -1); Os_Test_Error((f_out = fdopen(fd, "w")) == NULL); Os_Test_Error((f_in = fdopen(r, "r")) == NULL); #else Os_Test_Error((fd = dup(sock)) < 0); Os_Test_Error((f_in = fdopen(sock, "rt")) == NULL); Os_Test_Error((f_out = fdopen(fd, "wt")) == NULL); #endif atom = Create_Allocate_Atom(stream_name); stm = Add_Stream_For_Stdio_Desc(f_in, atom, STREAM_MODE_READ, TRUE); stm_tbl[stm]->prop.eof_action = STREAM_EOF_ACTION_RESET; stm_tbl[stm]->prop.other = 4; *stm_in = stm; stm = Add_Stream_For_Stdio_Desc(f_out, atom, STREAM_MODE_WRITE, TRUE); stm_tbl[stm]->prop.other = 4; *stm_out = stm; return TRUE; } /*-------------------------------------------------------------------------* * HOSTNAME_ADDRESS_2 * * * *-------------------------------------------------------------------------*/ Bool Hostname_Address_2(WamWord host_name_word, WamWord host_address_word) { WamWord word, tag_mask; char *host_name; char *host_address; struct hostent *host_entry; struct in_addr iadr; DEREF(host_name_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) { host_address = Rd_String_Check(host_address_word); host_name = M_Host_Name_From_Adr(host_address); return host_name && Un_String_Check(host_name, host_name_word); } host_name = Rd_String_Check(word); Check_For_Un_Atom(host_address_word); host_entry = gethostbyname(host_name); if (host_entry == NULL) return FALSE; memcpy(&iadr.s_addr, host_entry->h_addr_list[0], host_entry->h_length); host_address = inet_ntoa(iadr); return Un_String_Check(host_address, host_address_word); } ./gprolog-1.3.0/src/BipsPl/b_params.h0000644004425400513100000000364210547154133015716 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : b_params.h * * Descr.: parameter header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: b_params.h,v 1.10 2007/01/04 10:35:07 diaz Exp $ */ #define MAX_VAR_NAME_LENGTH 256 #define MAX_VAR_IN_TERM 2048 #define MAX_SYS_VARS 256 ./gprolog-1.3.0/src/BipsPl/arith_inl.wam0000644004425400513100000000412610547440331016434 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : arith_inl.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/arith_inl.pl'). predicate('$use_arith_inl'/0,29,static,private,built_in,[ proceed]). predicate((is)/2,32,static,private,built_in,[ put_atom(is,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), math_load_value(x(1),1), get_value(x(0),1), proceed]). predicate((=:=)/2,35,static,private,built_in,[ put_atom(=:=,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), math_load_value(x(0),0), math_load_value(x(1),1), call_c('Blt_Eq',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate((=\=)/2,38,static,private,built_in,[ put_atom(=\=,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), math_load_value(x(0),0), math_load_value(x(1),1), call_c('Blt_Neq',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate((<)/2,41,static,private,built_in,[ put_atom(<,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), math_load_value(x(0),0), math_load_value(x(1),1), call_c('Blt_Lt',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate((=<)/2,44,static,private,built_in,[ put_atom(=<,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), math_load_value(x(0),0), math_load_value(x(1),1), call_c('Blt_Lte',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate((>)/2,47,static,private,built_in,[ put_atom(>,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), math_load_value(x(0),0), math_load_value(x(1),1), call_c('Blt_Gt',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate((>=)/2,50,static,private,built_in,[ put_atom(>=,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), math_load_value(x(0),0), math_load_value(x(1),1), call_c('Blt_Gte',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate('$arith_eval'/2,54,static,private,built_in,[ call_c('Arith_Eval_2',[],[x(0),x(1)]), proceed]). ./gprolog-1.3.0/src/BipsPl/atom.pl0000644004425400513100000001274610547162351015264 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : atom.pl * * Descr.: atom manipulation management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: atom.pl,v 1.11 2007/01/04 10:35:07 diaz Exp $ */ :- built_in. '$use_atom'. atom_length(Atom, Length) :- set_bip_name(atom_length, 2), '$call_c_test'('Atom_Length_2'(Atom, Length)). atom_concat(Atom1, Atom2, Atom3) :- set_bip_name(atom_concat, 3), '$call_c_test'('Atom_Concat_3'(Atom1, Atom2, Atom3)). '$atom_concat_alt' :- % used by C code to create a choice-point '$call_c_test'('Atom_Concat_Alt_0'). sub_atom(Atom, Before, Length, After, SubAtom) :- set_bip_name(sub_atom, 5), '$call_c_test'('Sub_Atom_5'(Atom, Before, Length, After, SubAtom)). '$sub_atom_alt' :- % used by C code to create a choice-point '$call_c_test'('Sub_Atom_Alt_0'). atom_chars(Atom, Chars) :- set_bip_name(atom_chars, 2), '$call_c_test'('Atom_Chars_2'(Atom, Chars)). atom_codes(Atom, Codes) :- set_bip_name(atom_codes, 2), '$call_c_test'('Atom_Codes_2'(Atom, Codes)). number_atom(Number, Atom) :- set_bip_name(number_atom, 2), '$call_c_test'('Number_Atom_2'(Number, Atom)). number_chars(Number, Chars) :- set_bip_name(number_chars, 2), '$call_c_test'('Number_Chars_2'(Number, Chars)). number_codes(Number, Codes) :- set_bip_name(number_codes, 2), '$call_c_test'('Number_Codes_2'(Number, Codes)). char_code(Char, Code) :- set_bip_name(char_code, 2), '$call_c_test'('Char_Code_2'(Char, Code)). name(Atomic, Codes) :- set_bip_name(name, 2), '$call_c_test'('Name_2'(Atomic, Codes)). lower_upper(Lower, Upper) :- set_bip_name(lower_upper, 2), '$call_c_test'('Lower_Upper_2'(Lower, Upper)). atom_hash(Atom, Hash) :- set_bip_name(atom_hash, 2), '$call_c_test'('Atom_Hash_2'(Atom, Hash)). current_atom(X) :- set_bip_name(current_atom, 1), '$current_atom'(X). '$current_atom'(X) :- '$call_c_test'('Current_Atom_2'(X, 1)). '$current_atom_any'(X) :- '$call_c_test'('Current_Atom_2'(X, 0)). '$current_atom_alt' :- % used by C code to create a choice-point '$call_c_test'('Current_Atom_Alt_0'). atom_property(Atom, Property) :- set_bip_name(atom_property, 2), '$current_atom'(Atom), '$atom_property1'(Atom, Property). '$atom_property_any'(Atom, Property) :- '$current_atom_any'(Atom), '$atom_property1'(Atom, Property). '$atom_property1'(Atom, Property) :- '$check_atom_prop'(Property), !, '$call_c'('Atom_Property_6'(Atom, PrefixOp, InfixOp, PostfixOp, NeedsQuotes, NeedsScan)), '$atom_property2'(Property, Atom, PrefixOp, InfixOp, PostfixOp, NeedsQuotes, NeedsScan). '$check_atom_prop'(Property) :- var(Property). '$check_atom_prop'(length(_)). '$check_atom_prop'(hash(_)). '$check_atom_prop'(prefix_op). '$check_atom_prop'(infix_op). '$check_atom_prop'(postfix_op). '$check_atom_prop'(needs_quotes). '$check_atom_prop'(needs_scan). '$check_atom_prop'(Property) :- '$pl_err_domain'(atom_property, Property). '$atom_property2'(length(Length), Atom, _, _, _, _, _) :- '$call_c_test'('Atom_Length_2'(Atom, Length)). '$atom_property2'(hash(Hash), Atom, _, _, _, _, _) :- '$call_c_test'('Atom_Hash_2'(Atom, Hash)). '$atom_property2'(prefix_op, _, 1, _, _, _, _). '$atom_property2'(infix_op, _, _, 1, _, _, _). '$atom_property2'(postfix_op, _, _, _, 1, _, _). '$atom_property2'(needs_quotes, _, _, _, _, 1, _). '$atom_property2'(needs_scan, _, _, _, _, _, 1). new_atom(X) :- set_bip_name(new_atom, 1), '$sys_var_write'(0, 0), % hash not specified '$call_c_test'('New_Atom_3'(atom_, 0, X)). new_atom(Prefix, X) :- set_bip_name(new_atom, 2), '$sys_var_write'(0, 0), % hash not specified '$call_c_test'('New_Atom_3'(Prefix, 0, X)). new_atom(Prefix, Hash, X) :- set_bip_name(new_atom, 3), '$sys_var_write'(0, 1), % hash specified '$call_c_test'('New_Atom_3'(Prefix, Hash, X)). ./gprolog-1.3.0/src/BipsPl/file.wam0000644004425400513100000000166410547440332015407 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : file.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/file.pl'). predicate('$use_file'/0,29,static,private,built_in,[ proceed]). predicate(absolute_file_name/2,32,static,private,built_in,[ put_atom(absolute_file_name,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Absolute_File_Name_2',[boolean],[x(0),x(1)]), proceed]). predicate(decompose_file_name/4,39,static,private,built_in,[ put_atom(decompose_file_name,4), put_integer(4,5), call_c('Set_Bip_Name_2',[],[x(4),x(5)]), call_c('Decompose_File_Name_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). predicate(prolog_file_name/2,46,static,private,built_in,[ put_atom(prolog_file_name,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Prolog_File_Name_2',[boolean],[x(0),x(1)]), proceed]). ./gprolog-1.3.0/src/BipsPl/dynam_supp.h0000644004425400513100000001234210547154135016310 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : dynam_supp.h * * Descr.: dynamic predicate support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: dynam_supp.h,v 1.10 2007/01/04 10:35:09 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ #define DYN_ALT_FCT_FOR_TEST 0 #define DYN_ALT_FCT_FOR_JUMP 1 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef long (*ScanFct) (); typedef unsigned long DynStamp; typedef struct dynpinf *DynPInfP; typedef struct dyncinf *DynCInfP; typedef struct /* Dobly-linked chain header */ { /* ----------------------------- */ DynCInfP first; /* first clause (or NULL) */ DynCInfP last; /* last clause (or NULL) */ }D2ChHdr; typedef struct /* Dobly-linked chain cell */ { /* ----------------------------- */ DynCInfP next; /* next clause (or NULL) */ DynCInfP prev; /* previous clause (or NULL) */ }D2ChCell; typedef struct dyncinf /* Dynamic clause information */ { /* ------------------------------ */ D2ChCell seq_chain; /* sequential chain */ D2ChCell ind_chain; /* indexical chain */ DynPInfP dyn; /* back ptr to associated dyn inf */ D2ChHdr *p_ind_hdr; /* back ptr to ind_chain header */ char **p_ind_htbl; /* back ptr to ind htbl (or NULL) */ int cl_no; /* clause number */ DynStamp erase_stamp; /* FFF...F if not erased or stamp */ DynCInfP next_erased_cl; /* pointer to next erased clause */ unsigned *byte_code; /* bc pointer (NULL=interpreted) */ int term_size; /* size of the term of the clause */ WamWord term_word; /* clause [Head|Body]= */ WamWord head_word; /* adr+1 = Car = clause term Head */ WamWord body_word; /* adr+2 = Cdr = clause term Body */ } DynCInf; typedef struct /* Dynamic switch item info */ { /* ------------------------------ */ long key; /* key: atm, int, f/n */ D2ChHdr ind_chain; /* indexical chain */ } DSwtInf; typedef struct dynpinf /* Dynamic predicate information */ { /* ------------------------------ */ D2ChHdr seq_chain; /* sequential chain */ D2ChHdr var_ind_chain; /* index if 1st arg=VAR (chain) */ char *atm_htbl; /* index if 1st arg=ATM (htable) */ char *int_htbl; /* index if 1st arg=INT (htable) */ D2ChHdr lst_ind_chain; /* index if 1st arg=LST (chain) */ char *stc_htbl; /* index if 1st arg=STC (htable) */ int arity; /* arity (redundant but faster) */ int count_a; /* next clause nb for asserta */ int count_z; /* next clause nb for assertz */ DynCInfP first_erased_cl; /* 1st erased clause NULL if none */ DynPInfP next_dyn_with_erase; /* next dyn with erased clauses */ } DynPInf; /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ DynCInf *Add_Dynamic_Clause(WamWord head_word, WamWord body_word, Bool asserta, Bool check_perm); void Delete_Dynamic_Clause(DynCInf *clause); PredInf *Update_Dynamic_Pred(int func, int arity, int what_to_do); DynCInf *Scan_Dynamic_Pred(int owner_func, int owner_arity, DynPInf *dyn, WamWord first_arg_word, ScanFct alt_fct, int alt_fct_type, int alt_info_size, WamWord *alt_info); int Scan_Choice_Point_Pred(WamWord *b, int *arity); void Copy_Clause_To_Heap(DynCInf *clause, WamWord *head_word, WamWord *body_word); ./gprolog-1.3.0/src/BipsPl/c_supp.c0000644004425400513100000021274410547154133015423 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : c_supp.c * * Descr.: C interface support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: c_supp.c,v 1.11 2007/01/04 10:35:07 diaz Exp $ */ #include #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ #define CHECK_FOR_UN_VARIABLE \ WamWord word, tag_mask; \ \ DEREF(start_word, word, tag_mask); \ if (tag_mask != TAG_REF_MASK) \ Pl_Err_Type(type_variable, word) #define CHECK_FOR_UN_INTEGER \ WamWord word, tag_mask; \ \ DEREF(start_word, word, tag_mask); \ if (tag_mask != TAG_REF_MASK && tag_mask != TAG_INT_MASK) \ Pl_Err_Type(type_integer, word) #define CHECK_FOR_UN_POSITIVE \ WamWord word, tag_mask; \ \ DEREF(start_word, word, tag_mask); \ if (tag_mask != TAG_REF_MASK && tag_mask != TAG_INT_MASK) \ Pl_Err_Type(type_integer, word); \ if (tag_mask == TAG_INT_MASK && UnTag_INT(word)<0) \ Pl_Err_Domain(domain_not_less_than_zero, word) #define CHECK_FOR_UN_FLOAT \ WamWord word, tag_mask; \ \ DEREF(start_word, word, tag_mask); \ if (tag_mask != TAG_REF_MASK && tag_mask != TAG_FLT_MASK) \ Pl_Err_Type(type_float, word) #define CHECK_FOR_UN_NUMBER \ WamWord word, tag_mask; \ \ DEREF(start_word, word, tag_mask); \ if (tag_mask != TAG_REF_MASK && tag_mask != TAG_INT_MASK && \ tag_mask != TAG_FLT_MASK) \ Pl_Err_Type(type_number, word) #define CHECK_FOR_UN_ATOM \ WamWord word, tag_mask; \ \ DEREF(start_word, word, tag_mask); \ if (tag_mask != TAG_REF_MASK && tag_mask != TAG_ATM_MASK) \ Pl_Err_Type(type_atom, word) #define CHECK_FOR_UN_BOOLEAN \ WamWord word, tag_mask; \ int atom; \ \ DEREF(start_word, word, tag_mask); \ atom = UnTag_ATM(word); \ if (tag_mask != TAG_REF_MASK && (tag_mask != TAG_ATM_MASK || \ (atom != atom_true && atom != atom_false))) \ Pl_Err_Type(type_boolean, word) #define CHECK_FOR_UN_CHAR \ WamWord word, tag_mask; \ int atom; \ \ DEREF(start_word, word, tag_mask); \ atom = UnTag_ATM(word); \ if (tag_mask != TAG_REF_MASK && (tag_mask != TAG_ATM_MASK || \ atom_tbl[atom].prop.length != 1)) \ Pl_Err_Type(type_character, word) #define CHECK_FOR_UN_IN_CHAR \ WamWord word, tag_mask; \ int atom; \ \ DEREF(start_word, word, tag_mask); \ atom = UnTag_ATM(word); \ if (tag_mask != TAG_REF_MASK && (tag_mask != TAG_ATM_MASK || \ (atom != atom_end_of_file && atom_tbl[atom].prop.length != 1))) \ Pl_Err_Type(type_in_character, word) #define CHECK_FOR_UN_CODE \ WamWord word, tag_mask; \ int c; \ \ DEREF(start_word, word, tag_mask); \ if (tag_mask != TAG_REF_MASK && tag_mask != TAG_INT_MASK) \ Pl_Err_Type(type_integer, word); \ c = UnTag_INT(word); \ if (tag_mask == TAG_INT_MASK && !Is_Valid_Code(c)) \ Pl_Err_Representation(representation_character_code) #define CHECK_FOR_UN_IN_CODE \ WamWord word, tag_mask; \ int c; \ \ DEREF(start_word, word, tag_mask); \ if (tag_mask != TAG_REF_MASK && tag_mask != TAG_INT_MASK) \ Pl_Err_Type(type_integer, word); \ c = UnTag_INT(word); \ if (tag_mask == TAG_INT_MASK && c != -1 && !Is_Valid_Code(c)) \ Pl_Err_Representation(representation_in_character_code) #define CHECK_FOR_UN_BYTE \ WamWord word, tag_mask; \ int c; \ \ DEREF(start_word, word, tag_mask); \ c = UnTag_INT(word); \ if (tag_mask != TAG_REF_MASK && (tag_mask != TAG_INT_MASK || \ !Is_Valid_Byte(c))) \ Pl_Err_Type(type_byte, word) #define CHECK_FOR_UN_IN_BYTE \ WamWord word, tag_mask; \ int c; \ \ DEREF(start_word, word, tag_mask); \ c = UnTag_INT(word); \ if (tag_mask != TAG_REF_MASK && (tag_mask != TAG_INT_MASK || \ (c != -1 && !Is_Valid_Byte(c)))) \ Pl_Err_Type(type_in_byte, word) #define CHECK_FOR_UN_COMPOUND \ WamWord word, tag_mask; \ \ DEREF(start_word, word, tag_mask); \ if (tag_mask != TAG_REF_MASK && tag_mask != TAG_LST_MASK && \ tag_mask != TAG_STC_MASK) \ Pl_Err_Type(type_compound, word) #define CHECK_FOR_UN_CALLABLE \ WamWord word, tag_mask; \ \ DEREF(start_word, word, tag_mask); \ if (tag_mask != TAG_REF_MASK && tag_mask != TAG_ATM_MASK && \ tag_mask != TAG_LST_MASK && tag_mask != TAG_STC_MASK) \ Pl_Err_Type(type_callable, word) /*-------------------------------------------------------------------------* * RD_INTEGER_CHECK * * * *-------------------------------------------------------------------------*/ long Rd_Integer_Check(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_INT_MASK) Pl_Err_Type(type_integer, word); return UnTag_INT(word); } /*-------------------------------------------------------------------------* * RD_INTEGER * * * *-------------------------------------------------------------------------*/ long Rd_Integer(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); return UnTag_INT(word); } /*-------------------------------------------------------------------------* * RD_POSITIVE_CHECK * * * *-------------------------------------------------------------------------*/ long Rd_Positive_Check(WamWord start_word) { long n = Rd_Integer_Check(start_word); if (n < 0) Pl_Err_Domain(domain_not_less_than_zero, start_word); return n; } /*-------------------------------------------------------------------------* * RD_POSITIVE * * * *-------------------------------------------------------------------------*/ long Rd_Positive(WamWord start_word) { return Rd_Integer(start_word); } /*-------------------------------------------------------------------------* * RD_FLOAT_CHECK * * * *-------------------------------------------------------------------------*/ double Rd_Float_Check(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_FLT_MASK) Pl_Err_Type(type_float, word); return Obtain_Float(UnTag_FLT(word)); } /*-------------------------------------------------------------------------* * RD_FLOAT * * * *-------------------------------------------------------------------------*/ double Rd_Float(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); return Obtain_Float(UnTag_FLT(word)); } /*-------------------------------------------------------------------------* * RD_NUMBER_CHECK * * * *-------------------------------------------------------------------------*/ double Rd_Number_Check(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_FLT_MASK && tag_mask != TAG_INT_MASK) Pl_Err_Type(type_number, word); if (tag_mask == TAG_INT_MASK) return (double) UnTag_INT(word); return Obtain_Float(UnTag_FLT(word)); } /*-------------------------------------------------------------------------* * RD_NUMBER * * * *-------------------------------------------------------------------------*/ double Rd_Number(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_INT_MASK) return (double) UnTag_INT(word); return Obtain_Float(UnTag_FLT(word)); } /*-------------------------------------------------------------------------* * RD_ATOM_CHECK * * * *-------------------------------------------------------------------------*/ int Rd_Atom_Check(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_ATM_MASK) Pl_Err_Type(type_atom, word); return UnTag_ATM(word); } /*-------------------------------------------------------------------------* * RD_ATOM * * * *-------------------------------------------------------------------------*/ int Rd_Atom(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); return UnTag_ATM(word); } /*-------------------------------------------------------------------------* * RD_BOOLEAN_CHECK * * * *-------------------------------------------------------------------------*/ int Rd_Boolean_Check(WamWord start_word) { WamWord word, tag_mask; int atom; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); atom = UnTag_ATM(word); if (tag_mask != TAG_ATM_MASK || (atom != atom_true && atom != atom_false)) Pl_Err_Type(type_boolean, word); return atom != atom_false; } /*-------------------------------------------------------------------------* * RD_BOOLEAN * * * *-------------------------------------------------------------------------*/ int Rd_Boolean(WamWord start_word) { WamWord word, tag_mask; int atom; DEREF(start_word, word, tag_mask); atom = UnTag_ATM(word); return atom != atom_false; } /*-------------------------------------------------------------------------* * RD_CHAR_CHECK * * * *-------------------------------------------------------------------------*/ int Rd_Char_Check(WamWord start_word) { WamWord word, tag_mask; int atom; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); atom = UnTag_ATM(word); if (tag_mask != TAG_ATM_MASK || atom_tbl[atom].prop.length != 1) Pl_Err_Type(type_character, word); return atom_tbl[atom].name[0]; } /*-------------------------------------------------------------------------* * RD_CHAR * * * *-------------------------------------------------------------------------*/ int Rd_Char(WamWord start_word) { WamWord word, tag_mask; int atom; DEREF(start_word, word, tag_mask); atom = UnTag_ATM(word); return atom_tbl[atom].name[0]; } /*-------------------------------------------------------------------------* * RD_IN_CHAR_CHECK * * * *-------------------------------------------------------------------------*/ int Rd_In_Char_Check(WamWord start_word) { WamWord word, tag_mask; int atom; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); atom = UnTag_ATM(word); if (tag_mask != TAG_ATM_MASK || (atom != atom_end_of_file && atom_tbl[atom].prop.length != 1)) Pl_Err_Type(type_in_character, word); return (atom != atom_end_of_file) ? atom_tbl[atom].name[0] : -1; } /*-------------------------------------------------------------------------* * RD_IN_CHAR * * * *-------------------------------------------------------------------------*/ int Rd_In_Char(WamWord start_word) { WamWord word, tag_mask; int atom; DEREF(start_word, word, tag_mask); atom = UnTag_ATM(word); return (atom != atom_end_of_file) ? atom_tbl[atom].name[0] : -1; } /*-------------------------------------------------------------------------* * RD_CODE_CHECK * * * *-------------------------------------------------------------------------*/ int Rd_Code_Check(WamWord start_word) { int c; c = Rd_Integer_Check(start_word); if (!Is_Valid_Code(c)) Pl_Err_Representation(representation_character_code); return c; } /*-------------------------------------------------------------------------* * RD_CODE * * * *-------------------------------------------------------------------------*/ int Rd_Code(WamWord start_word) { return Rd_Integer(start_word); } /*-------------------------------------------------------------------------* * RD_IN_CODE_CHECK * * * *-------------------------------------------------------------------------*/ int Rd_In_Code_Check(WamWord start_word) { int c; c = Rd_Integer_Check(start_word); if (c != -1 && !Is_Valid_Code(c)) Pl_Err_Representation(representation_in_character_code); return c; } /*-------------------------------------------------------------------------* * RD_IN_CODE * * * *-------------------------------------------------------------------------*/ int Rd_In_Code(WamWord start_word) { return Rd_Integer(start_word); } /*-------------------------------------------------------------------------* * RD_BYTE_CHECK * * * *-------------------------------------------------------------------------*/ int Rd_Byte_Check(WamWord start_word) { WamWord word, tag_mask; int c; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); c = UnTag_INT(word); if (tag_mask != TAG_INT_MASK || !Is_Valid_Byte(c)) Pl_Err_Type(type_byte, word); return c; } /*-------------------------------------------------------------------------* * RD_BYTE * * * *-------------------------------------------------------------------------*/ int Rd_Byte(WamWord start_word) { return Rd_Integer(start_word); } /*-------------------------------------------------------------------------* * RD_IN_BYTE_CHECK * * * *-------------------------------------------------------------------------*/ int Rd_In_Byte_Check(WamWord start_word) { WamWord word, tag_mask; int c; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); c = UnTag_INT(word); if (tag_mask != TAG_INT_MASK || (c != -1 && !Is_Valid_Byte(c))) Pl_Err_Type(type_in_byte, word); return c; } /*-------------------------------------------------------------------------* * RD_IN_BYTE * * * *-------------------------------------------------------------------------*/ int Rd_In_Byte(WamWord start_word) { return Rd_Integer(start_word); } /*-------------------------------------------------------------------------* * RD_STRING_CHECK * * * *-------------------------------------------------------------------------*/ char * Rd_String_Check(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_ATM_MASK) Pl_Err_Type(type_atom, word); return atom_tbl[UnTag_ATM(word)].name; } /*-------------------------------------------------------------------------* * RD_STRING * * * *-------------------------------------------------------------------------*/ char * Rd_String(WamWord start_word) { return atom_tbl[Rd_Atom(start_word)].name; } /*-------------------------------------------------------------------------* * RD_CHARS_CHECK * * * *-------------------------------------------------------------------------*/ char * Rd_Chars_Check(WamWord start_word) { Rd_Chars_Str_Check(start_word, glob_buff); return glob_buff; } /*-------------------------------------------------------------------------* * RD_CHARS * * * *-------------------------------------------------------------------------*/ char * Rd_Chars(WamWord start_word) { Rd_Chars_Str(start_word, glob_buff); return glob_buff; } /*-------------------------------------------------------------------------* * RD_CODES_CHECK * * * *-------------------------------------------------------------------------*/ char * Rd_Codes_Check(WamWord start_word) { Rd_Codes_Str_Check(start_word, glob_buff); return glob_buff; } /*-------------------------------------------------------------------------* * RD_CODES * * * *-------------------------------------------------------------------------*/ char * Rd_Codes(WamWord start_word) { Rd_Codes_Str(start_word, glob_buff); return glob_buff; } /*-------------------------------------------------------------------------* * RD_CHARS_STR_CHECK * * * *-------------------------------------------------------------------------*/ int Rd_Chars_Str_Check(WamWord start_word, char *str) { WamWord word, tag_mask; WamWord save_start_word; WamWord *lst_adr; int n = 0; save_start_word = start_word; for (;;) { DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_start_word); lst_adr = UnTag_LST(word); *str++ = Rd_Char_Check(Car(lst_adr)); n++; start_word = Cdr(lst_adr); } *str = '\0'; return n; } /*-------------------------------------------------------------------------* * RD_CHARS_STR * * * *-------------------------------------------------------------------------*/ int Rd_Chars_Str(WamWord start_word, char *str) { WamWord word, tag_mask; WamWord save_start_word; WamWord *lst_adr; int n = 0; save_start_word = start_word; for (;;) { DEREF(start_word, word, tag_mask); if (word == NIL_WORD) break; lst_adr = UnTag_LST(word); *str++ = Rd_Char_Check(Car(lst_adr)); n++; start_word = Cdr(lst_adr); } *str = '\0'; return n; } /*-------------------------------------------------------------------------* * RD_CODES_STR_CHECK * * * *-------------------------------------------------------------------------*/ int Rd_Codes_Str_Check(WamWord start_word, char *str) { WamWord word, tag_mask; WamWord save_start_word; WamWord *lst_adr; int n = 0; save_start_word = start_word; for (;;) { DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_start_word); lst_adr = UnTag_LST(word); *str++ = Rd_Code_Check(Car(lst_adr)); n++; start_word = Cdr(lst_adr); } *str = '\0'; return n; } /*-------------------------------------------------------------------------* * RD_CODES_STR * * * *-------------------------------------------------------------------------*/ int Rd_Codes_Str(WamWord start_word, char *str) { WamWord word, tag_mask; WamWord save_start_word; WamWord *lst_adr; int n = 0; save_start_word = start_word; for (;;) { DEREF(start_word, word, tag_mask); if (word == NIL_WORD) break; lst_adr = UnTag_LST(word); *str++ = Rd_Code_Check(Car(lst_adr)); n++; start_word = Cdr(lst_adr); } *str = '\0'; return n; } /*-------------------------------------------------------------------------* * RD_LIST_CHECK * * * *-------------------------------------------------------------------------*/ WamWord * Rd_List_Check(WamWord start_word) { WamWord word, tag_mask; WamWord *lst_adr; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) return NULL; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, start_word); lst_adr = UnTag_LST(word); return &Car(lst_adr); } /*-------------------------------------------------------------------------* * RD_LIST * * * *-------------------------------------------------------------------------*/ WamWord * Rd_List(WamWord start_word) { WamWord word, tag_mask; WamWord *lst_adr; DEREF(start_word, word, tag_mask); if (word == NIL_WORD) return NULL; lst_adr = UnTag_LST(word); return &Car(lst_adr); } /*-------------------------------------------------------------------------* * RD_PROPER_LIST_CHECK * * * *-------------------------------------------------------------------------*/ int Rd_Proper_List_Check(WamWord start_word, WamWord *arg) { WamWord word, tag_mask; WamWord save_start_word; WamWord *lst_adr; int n = 0; save_start_word = start_word; for (;;) { DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_start_word); lst_adr = UnTag_LST(word); *arg++ = Car(lst_adr); n++; start_word = Cdr(lst_adr); } return n; } /*-------------------------------------------------------------------------* * RD_PROPER_LIST * * * *-------------------------------------------------------------------------*/ int Rd_Proper_List(WamWord start_word, WamWord *arg) { WamWord word, tag_mask; WamWord save_start_word; WamWord *lst_adr; int n = 0; save_start_word = start_word; for (;;) { DEREF(start_word, word, tag_mask); if (word == NIL_WORD) break; lst_adr = UnTag_LST(word); *arg++ = Car(lst_adr); n++; start_word = Cdr(lst_adr); } return n; } /*-------------------------------------------------------------------------* * RD_COMPOUND_CHECK * * * *-------------------------------------------------------------------------*/ WamWord * Rd_Compound_Check(WamWord start_word, int *func, int *arity) { WamWord word, tag_mask; WamWord *adr; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask == TAG_LST_MASK) { adr = UnTag_LST(word); *func = ATOM_CHAR('.'); *arity = 2; return &Car(adr); } if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(word); *func = Functor(adr); *arity = Arity(adr); return &Arg(adr, 0); } Pl_Err_Type(type_compound, start_word); return NULL; } /*-------------------------------------------------------------------------* * RD_COMPOUND * * * *-------------------------------------------------------------------------*/ WamWord * Rd_Compound(WamWord start_word, int *func, int *arity) { WamWord word, tag_mask; WamWord *adr; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_LST_MASK) { adr = UnTag_LST(word); *func = ATOM_CHAR('.'); *arity = 2; return &Car(adr); } if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(word); *func = Functor(adr); *arity = Arity(adr); return &Arg(adr, 0); } return NULL; } /*-------------------------------------------------------------------------* * RD_CALLABLE_CHECK * * * *-------------------------------------------------------------------------*/ WamWord * Rd_Callable_Check(WamWord start_word, int *func, int *arity) { WamWord word, tag_mask; WamWord *adr; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask == TAG_ATM_MASK) { *func = UnTag_ATM(word); *arity = 0; return NULL; } if (tag_mask == TAG_LST_MASK) { adr = UnTag_LST(word); *func = ATOM_CHAR('.'); *arity = 2; return &Car(adr); } if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(word); *func = Functor(adr); *arity = Arity(adr); return &Arg(adr, 0); } Pl_Err_Type(type_callable, start_word); return NULL; } /*-------------------------------------------------------------------------* * RD_CALLABLE * * * *-------------------------------------------------------------------------*/ WamWord * Rd_Callable(WamWord start_word, int *func, int *arity) { WamWord word, tag_mask; WamWord *adr; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_ATM_MASK) { *func = UnTag_ATM(word); *arity = 0; return (WamWord *) arity; /* anything except NULL */ } if (tag_mask == TAG_LST_MASK) { adr = UnTag_LST(word); *func = ATOM_CHAR('.'); *arity = 2; return &Car(adr); } if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(word); *func = Functor(adr); *arity = Arity(adr); return &Arg(adr, 0); } return NULL; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_INTEGER * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Integer(WamWord start_word) { CHECK_FOR_UN_INTEGER; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_POSITIVE * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Positive(WamWord start_word) { CHECK_FOR_UN_POSITIVE; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_FLOAT * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Float(WamWord start_word) { CHECK_FOR_UN_FLOAT; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_NUMBER * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Number(WamWord start_word) { CHECK_FOR_UN_NUMBER; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_ATOM * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Atom(WamWord start_word) { CHECK_FOR_UN_ATOM; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_BOOLEAN * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Boolean(WamWord start_word) { CHECK_FOR_UN_BOOLEAN; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_CHAR * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Char(WamWord start_word) { CHECK_FOR_UN_CHAR; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_IN_CHAR * * * *-------------------------------------------------------------------------*/ void Check_For_Un_In_Char(WamWord start_word) { CHECK_FOR_UN_IN_CHAR; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_CODE * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Code(WamWord start_word) { CHECK_FOR_UN_CODE; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_IN_CODE * * * *-------------------------------------------------------------------------*/ void Check_For_Un_In_Code(WamWord start_word) { CHECK_FOR_UN_IN_CODE; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_BYTE * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Byte(WamWord start_word) { CHECK_FOR_UN_BYTE; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_IN_BYTE * * * *-------------------------------------------------------------------------*/ void Check_For_Un_In_Byte(WamWord start_word) { CHECK_FOR_UN_IN_BYTE; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_CHARS * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Chars(WamWord start_word) { Check_For_Un_List(start_word); } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_STRING * * * *-------------------------------------------------------------------------*/ void Check_For_Un_String(WamWord start_word) { Check_For_Un_Atom(start_word); } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_CODES * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Codes(WamWord start_word) { Check_For_Un_List(start_word); } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_LIST * * * *-------------------------------------------------------------------------*/ void Check_For_Un_List(WamWord start_word) { if (!Blt_List_Or_Partial_List(start_word)) Pl_Err_Type(type_list, start_word); } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_COMPOUND * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Compound(WamWord start_word) { CHECK_FOR_UN_COMPOUND; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_CALLABLE * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Callable(WamWord start_word) { CHECK_FOR_UN_CALLABLE; } /*-------------------------------------------------------------------------* * CHECK_FOR_UN_VARIABLE * * * *-------------------------------------------------------------------------*/ void Check_For_Un_Variable(WamWord start_word) { CHECK_FOR_UN_VARIABLE; } /*-------------------------------------------------------------------------* * UN_INTEGER_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Integer_Check(long value, WamWord start_word) { CHECK_FOR_UN_INTEGER; return Get_Integer(value, word); } /*-------------------------------------------------------------------------* * UN_INTEGER * * * *-------------------------------------------------------------------------*/ Bool Un_Integer(long value, WamWord start_word) { return Get_Integer(value, start_word); } /*-------------------------------------------------------------------------* * UN_POSITIVE_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Positive_Check(long value, WamWord start_word) { CHECK_FOR_UN_POSITIVE; return Get_Integer(value, word); } /*-------------------------------------------------------------------------* * UN_POSITIVE * * * *-------------------------------------------------------------------------*/ Bool Un_Positive(long value, WamWord start_word) { return Get_Integer(value, start_word); } /*-------------------------------------------------------------------------* * UN_FLOAT_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Float_Check(double value, WamWord start_word) { CHECK_FOR_UN_FLOAT; return Get_Float(value, word); } /*-------------------------------------------------------------------------* * UN_FLOAT * * * *-------------------------------------------------------------------------*/ Bool Un_Float(double value, WamWord start_word) { return Get_Float(value, start_word); } /*-------------------------------------------------------------------------* * UN_NUMBER_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Number_Check(double value, WamWord start_word) { long n; CHECK_FOR_UN_NUMBER; n = (long) value; return (n == value) ? Get_Integer(n, word) : Get_Float(value, word); } /*-------------------------------------------------------------------------* * UN_NUMBER * * * *-------------------------------------------------------------------------*/ Bool Un_Number(double value, WamWord start_word) { long n; n = (long) value; return (n == value) ? Get_Integer(n, start_word) : Get_Float(value, start_word); } /*-------------------------------------------------------------------------* * UN_ATOM_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Atom_Check(int value, WamWord start_word) { CHECK_FOR_UN_ATOM; return Get_Atom(value, word); } /*-------------------------------------------------------------------------* * UN_ATOM * * * *-------------------------------------------------------------------------*/ Bool Un_Atom(int value, WamWord start_word) { return Get_Atom(value, start_word); } /*-------------------------------------------------------------------------* * UN_BOOLEAN_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Boolean_Check(int value, WamWord start_word) { CHECK_FOR_UN_BOOLEAN; return Get_Atom(value ? atom_true : atom_false, word); } /*-------------------------------------------------------------------------* * UN_BOOLEAN * * * *-------------------------------------------------------------------------*/ Bool Un_Boolean(int value, WamWord start_word) { return Get_Atom(value ? atom_true : atom_false, start_word); } /*-------------------------------------------------------------------------* * UN_CHAR_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Char_Check(int value, WamWord start_word) { CHECK_FOR_UN_CHAR; return Get_Atom(ATOM_CHAR(value), word); } /*-------------------------------------------------------------------------* * UN_CHAR * * * *-------------------------------------------------------------------------*/ Bool Un_Char(int value, WamWord start_word) { return Get_Atom(ATOM_CHAR(value), start_word); } /*-------------------------------------------------------------------------* * UN_IN_CHAR_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_In_Char_Check(int value, WamWord start_word) { CHECK_FOR_UN_IN_CHAR; return Get_Atom((value == -1) ? atom_end_of_file : ATOM_CHAR(value), word); } /*-------------------------------------------------------------------------* * UN_IN_CHAR * * * *-------------------------------------------------------------------------*/ Bool Un_In_Char(int value, WamWord start_word) { return Get_Atom((value == -1) ? atom_end_of_file : ATOM_CHAR(value), start_word); } /*-------------------------------------------------------------------------* * UN_CODE_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Code_Check(int value, WamWord start_word) { CHECK_FOR_UN_CODE; return Get_Integer(value, word); } /*-------------------------------------------------------------------------* * UN_CODE * * * *-------------------------------------------------------------------------*/ Bool Un_Code(int value, WamWord start_word) { return Get_Integer(value, start_word); } /*-------------------------------------------------------------------------* * UN_IN_CODE_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_In_Code_Check(int value, WamWord start_word) { CHECK_FOR_UN_IN_CODE; return Get_Integer(value, word); } /*-------------------------------------------------------------------------* * UN_IN_CODE * * * *-------------------------------------------------------------------------*/ Bool Un_In_Code(int value, WamWord start_word) { return Get_Integer(value, start_word); } /*-------------------------------------------------------------------------* * UN_BYTE_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Byte_Check(int value, WamWord start_word) { CHECK_FOR_UN_BYTE; return Get_Integer(value, word); } /*-------------------------------------------------------------------------* * UN_BYTE * * * *-------------------------------------------------------------------------*/ Bool Un_Byte(int value, WamWord start_word) { return Get_Integer(value, start_word); } /*-------------------------------------------------------------------------* * UN_IN_BYTE_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_In_Byte_Check(int value, WamWord start_word) { CHECK_FOR_UN_IN_BYTE; return Get_Integer(value, word); } /*-------------------------------------------------------------------------* * UN_IN_BYTE * * * *-------------------------------------------------------------------------*/ Bool Un_In_Byte(int value, WamWord start_word) { return Get_Integer(value, start_word); } /*-------------------------------------------------------------------------* * UN_STRING_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_String_Check(char *value, WamWord start_word) { CHECK_FOR_UN_ATOM; return Get_Atom(Create_Allocate_Atom(value), word); } /*-------------------------------------------------------------------------* * UN_STRING * * * *-------------------------------------------------------------------------*/ Bool Un_String(char *value, WamWord start_word) { return Get_Atom(Create_Allocate_Atom(value), start_word); } /*-------------------------------------------------------------------------* * UN_CHARS_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Chars_Check(char *str, WamWord start_word) { Check_For_Un_List(start_word); return Un_Chars(str, start_word); } /*-------------------------------------------------------------------------* * UN_CHARS * * * *-------------------------------------------------------------------------*/ Bool Un_Chars(char *str, WamWord start_word) { for (; *str; str++) { if (!Get_List(start_word) || !Unify_Atom(ATOM_CHAR(*str))) return FALSE; start_word = Unify_Variable(); } return Get_Nil(start_word); } /*-------------------------------------------------------------------------* * UN_CODES_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Codes_Check(char *str, WamWord start_word) { Check_For_Un_List(start_word); return Un_Codes(str, start_word); } /*-------------------------------------------------------------------------* * UN_CODES * * * *-------------------------------------------------------------------------*/ Bool Un_Codes(char *str, WamWord start_word) { for (; *str; str++) { if (!Get_List(start_word) || !Unify_Integer(*str)) return FALSE; start_word = Unify_Variable(); } return Get_Nil(start_word); } /*-------------------------------------------------------------------------* * UN_LIST_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_List_Check(WamWord *arg, WamWord start_word) { WamWord word, tag_mask; if (arg == NULL) { if (Get_Nil(start_word)) return TRUE; check_type: DEREF(start_word, word, tag_mask); if (word != NIL_WORD && tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, start_word); return FALSE; } if (!Get_List(start_word)) goto check_type; return Unify_Value(arg[0]) && Unify_Value(arg[1]); } /*-------------------------------------------------------------------------* * UN_LIST * * * *-------------------------------------------------------------------------*/ Bool Un_List(WamWord *arg, WamWord start_word) { if (arg == NULL) return Get_Nil(start_word); return Get_List(start_word) && Unify_Value(arg[0]) && Unify_Value(arg[1]); } /*-------------------------------------------------------------------------* * UN_PROPER_LIST_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Proper_List_Check(int n, WamWord *arg, WamWord start_word) { Check_For_Un_List(start_word); return Un_Proper_List(n, arg, start_word); } /*-------------------------------------------------------------------------* * UN_PROPER_LIST * * * *-------------------------------------------------------------------------*/ Bool Un_Proper_List(int n, WamWord *arg, WamWord start_word) { if (n < 0 || arg == NULL) n = 0; while (n--) { if (!Get_List(start_word) || !Unify_Value(*arg++)) return FALSE; start_word = Unify_Variable(); } return Get_Nil(start_word); } /*-------------------------------------------------------------------------* * UN_COMPOUND_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Compound_Check(int func, int arity, WamWord *arg, WamWord start_word) { int i; if (arity == 0) return Un_Atom_Check(func, start_word); if (arity == 2 && func == ATOM_CHAR('.')) return Un_List_Check(arg, start_word); if (!Get_Structure(func, arity, start_word)) { if (!Blt_Compound(start_word)) Pl_Err_Type(type_compound, start_word); return FALSE; } for (i = 0; i < arity; i++) if (!Unify_Value(arg[i])) return FALSE; return TRUE; } /*-------------------------------------------------------------------------* * UN_COMPOUND * * * *-------------------------------------------------------------------------*/ Bool Un_Compound(int func, int arity, WamWord *arg, WamWord start_word) { int i; if (arity == 0) return Un_Atom_Check(func, start_word); if (arity == 2 && func == ATOM_CHAR('.')) return Un_List(arg, start_word); if (!Get_Structure(func, arity, start_word)) return FALSE; for (i = 0; i < arity; i++) if (!Unify_Value(arg[i])) return FALSE; return TRUE; } /*-------------------------------------------------------------------------* * UN_CALLABLE_CHECK * * * *-------------------------------------------------------------------------*/ Bool Un_Callable_Check(int func, int arity, WamWord *arg, WamWord start_word) { int i; if (arity == 0) return Un_Atom_Check(func, start_word); if (arity == 2 && func == ATOM_CHAR('.')) return Un_List_Check(arg, start_word); if (!Get_Structure(func, arity, start_word)) { if (!Blt_Callable(start_word)) Pl_Err_Type(type_callable, start_word); return FALSE; } for (i = 0; i < arity; i++) if (!Unify_Value(arg[i])) return FALSE; return TRUE; } /*-------------------------------------------------------------------------* * UN_CALLABLE * * * *-------------------------------------------------------------------------*/ Bool Un_Callable(int func, int arity, WamWord *arg, WamWord start_word) { return Un_Compound(func, arity, arg, start_word); } /*-------------------------------------------------------------------------* * UN_TERM * * * *-------------------------------------------------------------------------*/ Bool Un_Term(WamWord term_word, WamWord start_word) { /* used because Unify is FC convention */ return Unify(term_word, start_word); } /*-------------------------------------------------------------------------* * MK_INTEGER * * * *-------------------------------------------------------------------------*/ WamWord Mk_Integer(long value) { return Put_Integer(value); } /*-------------------------------------------------------------------------* * MK_POSITIVE * * * *-------------------------------------------------------------------------*/ WamWord Mk_Positive(long value) { return Put_Integer(value); } /*-------------------------------------------------------------------------* * MK_FLOAT * * * *-------------------------------------------------------------------------*/ WamWord Mk_Float(double value) { return Put_Float(value); } /*-------------------------------------------------------------------------* * MK_NUMBER * * * *-------------------------------------------------------------------------*/ WamWord Mk_Number(double value) { int n; n = (long) value; if (n == value) return Put_Integer(n); return Put_Float(value); } /*-------------------------------------------------------------------------* * MK_ATOM * * * *-------------------------------------------------------------------------*/ WamWord Mk_Atom(int value) { return Put_Atom(value); } /*-------------------------------------------------------------------------* * MK_BOOLEAN * * * *-------------------------------------------------------------------------*/ WamWord Mk_Boolean(int value) { return Put_Atom(value ? atom_true : atom_false); } /*-------------------------------------------------------------------------* * MK_CHAR * * * *-------------------------------------------------------------------------*/ WamWord Mk_Char(int value) { return Put_Atom(ATOM_CHAR(value)); } /*-------------------------------------------------------------------------* * MK_IN_CHAR * * * *-------------------------------------------------------------------------*/ WamWord Mk_In_Char(int value) { return Put_Atom((value == -1) ? atom_end_of_file : ATOM_CHAR(value)); } /*-------------------------------------------------------------------------* * MK_CODE * * * *-------------------------------------------------------------------------*/ WamWord Mk_Code(int value) { return Put_Integer(value); } /*-------------------------------------------------------------------------* * MK_IN_CODE * * * *-------------------------------------------------------------------------*/ WamWord Mk_In_Code(int value) { return Put_Integer(value); } /*-------------------------------------------------------------------------* * MK_BYTE * * * *-------------------------------------------------------------------------*/ WamWord Mk_Byte(int value) { return Put_Integer(value); } /*-------------------------------------------------------------------------* * MK_IN_BYTE * * * *-------------------------------------------------------------------------*/ WamWord Mk_In_Byte(int value) { return Put_Integer(value); } /*-------------------------------------------------------------------------* * MK_STRING * * * *-------------------------------------------------------------------------*/ WamWord Mk_String(char *value) { return Put_Atom(Create_Allocate_Atom(value)); } /*-------------------------------------------------------------------------* * MK_CHARS * * * *-------------------------------------------------------------------------*/ WamWord Mk_Chars(char *str) { WamWord res_word; if (*str == '\0') return NIL_WORD; res_word = Put_List(); for (;;) { Unify_Atom(ATOM_CHAR(*str)); str++; if (*str == '\0') break; Unify_List(); } Unify_Nil(); return res_word; } /*-------------------------------------------------------------------------* * MK_CODES * * * *-------------------------------------------------------------------------*/ WamWord Mk_Codes(char *str) { WamWord res_word; if (*str == '\0') return NIL_WORD; res_word = Put_List(); for (;;) { Unify_Integer(*str); str++; if (*str == '\0') break; Unify_List(); } Unify_Nil(); return res_word; } /*-------------------------------------------------------------------------* * MK_LIST * * * *-------------------------------------------------------------------------*/ WamWord Mk_List(WamWord *arg) { WamWord res_word; if (arg == NULL) return NIL_WORD; res_word = Put_List(); Unify_Value(arg[0]); Unify_Value(arg[1]); return res_word; } /*-------------------------------------------------------------------------* * MK_PROPER_LIST * * * * This function transform an array of n WamWords located at arg into a * * Prolog list (pushed at the top of the heap) and returns the resulting * * list word. * * Note: arg can be equal to H to tranform an array into a list in-place. * * The resulting list uses 2*n WamWord from the top of the heap. * *-------------------------------------------------------------------------*/ WamWord Mk_Proper_List(int n, WamWord *arg) { WamWord *src, *dst, *p; if (n <= 0 || arg == NULL) return NIL_WORD; src = arg + n; /* copy from end to start to make possible */ dst = H = H + 2 * n; /* in-place array->list transformation */ *--dst = NIL_WORD; goto entry; do { p = dst--; *dst = Tag_LST(p); entry: *--dst = *--src; } while (--n); return Tag_LST(dst); } /*-------------------------------------------------------------------------* * MK_COMPOUND * * * *-------------------------------------------------------------------------*/ WamWord Mk_Compound(int func, int arity, WamWord *arg) { WamWord res_word; int i; if (arity == 0) return Put_Atom(func); if (arity == 2 && func == ATOM_CHAR('.')) return Mk_List(arg); res_word = Put_Structure(func, arity); for (i = 0; i < arity; i++) Unify_Value(arg[i]); return res_word; } /*-------------------------------------------------------------------------* * MK_CALLABLE * * * *-------------------------------------------------------------------------*/ WamWord Mk_Callable(int func, int arity, WamWord *arg) { return Mk_Compound(func, arity, arg); } /*-------------------------------------------------------------------------* * MK_VARIABLE * * * *-------------------------------------------------------------------------*/ WamWord Mk_Variable(void) { return Put_X_Variable(); } ./gprolog-1.3.0/src/BipsPl/flag_c.c0000644004425400513100000006254610547154136015353 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : flag_c.c * * Descr.: Prolog flag and system variable management - C Part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: flag_c.c,v 1.16 2007/01/04 10:35:10 diaz Exp $ */ #include #include #include #define OBJ_INIT Flag_Initializer #define FLAG_C_FILE #include "engine_pl.h" #include "bips_pl.h" #ifndef _WIN32 #include extern char **environ; #endif /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { int type; int prec; int left; int right; int length; } SFOp; /*---------------------------------* * Global Variables * *---------------------------------*/ static int atom_flag_tbl[NB_OF_FLAGS]; static int atom_down; static int atom_toward_zero; static int atom_on; static int atom_off; /* atom_error is already defined in the set of often used atoms */ static int atom_warning; static int atom_fail; static int atom_chars; static int atom_codes; static int atom_atom; static int atom_chars_no_escape; static int atom_codes_no_escape; static int atom_atom_no_escape; static int atom_prolog[4]; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static Bool Unif_Flag(int i, WamWord value_word); #define CURRENT_PROLOG_FLAG_ALT X2463757272656E745F70726F6C6F675F666C61675F616C74 #define ENVIRON_ALT X24656E7669726F6E5F616C74 Prolog_Prototype(CURRENT_PROLOG_FLAG_ALT, 0); Prolog_Prototype(ENVIRON_ALT, 0); /*-------------------------------------------------------------------------* * FLAG_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Flag_Initializer(void) { atom_flag_tbl[FLAG_BOUNDED] = Create_Atom("bounded"); atom_flag_tbl[FLAG_MAX_INTEGER] = Create_Atom("max_integer"); atom_flag_tbl[FLAG_MIN_INTEGER] = Create_Atom("min_integer"); atom_flag_tbl[FLAG_ROUNDING_FCT] = Create_Atom("integer_rounding_function"); atom_flag_tbl[FLAG_CHAR_CONVERSION] = Create_Atom("char_conversion"); atom_flag_tbl[FLAG_DEBUG] = Create_Atom("debug"); atom_flag_tbl[FLAG_MAX_ARITY] = Create_Atom("max_arity"); atom_flag_tbl[FLAG_UNKNOWN] = Create_Atom("unknown"); atom_flag_tbl[FLAG_DOUBLE_QUOTES] = Create_Atom("double_quotes"); atom_flag_tbl[FLAG_BACK_QUOTES] = Create_Atom("back_quotes"); atom_flag_tbl[FLAG_SYNTAX_ERROR] = Create_Atom("syntax_error"); atom_flag_tbl[FLAG_OS_ERROR] = Create_Atom("os_error"); atom_flag_tbl[FLAG_MAX_ATOM] = Create_Atom("max_atom"); atom_flag_tbl[FLAG_MAX_UNGET] = Create_Atom("max_unget"); atom_flag_tbl[FLAG_SINGLETON_WARNING] = Create_Atom("singleton_warning"); atom_flag_tbl[FLAG_STRICT_ISO] = Create_Atom("strict_iso"); atom_flag_tbl[FLAG_PROLOG_NAME] = Create_Atom("prolog_name"); atom_flag_tbl[FLAG_PROLOG_VERSION] = Create_Atom("prolog_version"); atom_flag_tbl[FLAG_PROLOG_DATE] = Create_Atom("prolog_date"); atom_flag_tbl[FLAG_PROLOG_COPYRIGHT] = Create_Atom("prolog_copyright"); atom_down = Create_Atom("down"); atom_toward_zero = Create_Atom("toward_zero"); atom_on = Create_Atom("on"); atom_off = Create_Atom("off"); atom_warning = Create_Atom("warning"); atom_fail = Create_Atom("fail"); atom_chars = Create_Atom("chars"); atom_codes = Create_Atom("codes"); atom_atom = Create_Atom("atom"); atom_chars_no_escape = Create_Atom("chars_no_escape"); atom_codes_no_escape = Create_Atom("codes_no_escape"); atom_atom_no_escape = Create_Atom("atom_no_escape"); atom_prolog[0] = Create_Atom(PROLOG_NAME); atom_prolog[1] = Create_Atom(PROLOG_VERSION); atom_prolog[2] = Create_Atom(PROLOG_DATE); atom_prolog[3] = Create_Atom(PROLOG_COPYRIGHT); Flag_Value(FLAG_SINGLETON_WARNING) = 1; Flag_Value(FLAG_STRICT_ISO) = 1; Flag_Value(FLAG_DOUBLE_QUOTES) = FLAG_AS_CODES; Flag_Value(FLAG_BACK_QUOTES) = FLAG_AS_ATOM | FLAG_NO_ESCAPE_MASK; #ifndef NO_USE_LINEDIT SYS_VAR_LINEDIT = 1; #else SYS_VAR_LINEDIT = 0; #endif } /*-------------------------------------------------------------------------* * SET_PROLOG_FLAG_2 * * * *-------------------------------------------------------------------------*/ Bool Set_Prolog_Flag_2(WamWord flag_word, WamWord value_word) { WamWord word, tag_mask; WamWord term; int atom; int i; PredInf *pred; atom = Rd_Atom_Check(flag_word); for (i = 0; i < NB_OF_FLAGS; i++) if (atom_flag_tbl[i] == atom) break; if (i >= NB_OF_FLAGS) Pl_Err_Domain(domain_prolog_flag, flag_word); DEREF(value_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); atom = UnTag_ATM(word); switch (i) { case FLAG_BOUNDED: if (tag_mask != TAG_ATM_MASK || (atom != atom_true && atom != atom_false)) goto err_value; goto err_perm; case FLAG_MAX_INTEGER: case FLAG_MIN_INTEGER: case FLAG_MAX_ARITY: case FLAG_MAX_ATOM: case FLAG_MAX_UNGET: if (tag_mask != TAG_INT_MASK) goto err_value; goto err_perm; case FLAG_ROUNDING_FCT: if (tag_mask != TAG_ATM_MASK || (atom != atom_down && atom != atom_toward_zero)) goto err_value; goto err_perm; case FLAG_CHAR_CONVERSION: case FLAG_DEBUG: case FLAG_SINGLETON_WARNING: case FLAG_STRICT_ISO: if (tag_mask != TAG_ATM_MASK || (atom != atom_on && atom != atom_off)) goto err_value; if (i != FLAG_DEBUG) { Flag_Value(i) = atom == atom_on; break; } /* if no debugger the flag must be off */ if (!SYS_VAR_DEBUGGER) return atom == atom_off; Flag_Value(i) = atom == atom_on; pred = Lookup_Pred(Create_Atom((atom == atom_on) ? "debug" : "nodebug"), 0); if (pred != NULL) Call_Prolog((CodePtr) (pred->codep)); else Flag_Value(i) = FALSE; /* should not occurs */ break; case FLAG_UNKNOWN: case FLAG_SYNTAX_ERROR: case FLAG_OS_ERROR: if (tag_mask != TAG_ATM_MASK) goto err_value; if (atom == atom_error) Flag_Value(i) = FLAG_VALUE_ERROR; else if (atom == atom_warning) Flag_Value(i) = FLAG_VALUE_WARNING; else if (atom == atom_fail) Flag_Value(i) = FLAG_VALUE_FAIL; else goto err_value; break; case FLAG_DOUBLE_QUOTES: case FLAG_BACK_QUOTES: if (tag_mask != TAG_ATM_MASK) goto err_value; if (atom == atom_codes) Flag_Value(i) = FLAG_AS_CODES; else if (atom == atom_codes_no_escape) Flag_Value(i) = FLAG_AS_CODES | FLAG_NO_ESCAPE_MASK; else if (atom == atom_chars) Flag_Value(i) = FLAG_AS_CHARS; else if (atom == atom_chars_no_escape) Flag_Value(i) = FLAG_AS_CHARS | FLAG_NO_ESCAPE_MASK; else if (atom == atom_atom) Flag_Value(i) = FLAG_AS_ATOM; else if (atom == atom_atom_no_escape) Flag_Value(i) = FLAG_AS_ATOM | FLAG_NO_ESCAPE_MASK; else goto err_value; break; case FLAG_PROLOG_NAME: case FLAG_PROLOG_VERSION: case FLAG_PROLOG_DATE: case FLAG_PROLOG_COPYRIGHT: if (tag_mask != TAG_ATM_MASK) goto err_value; goto err_perm; } return TRUE; err_value: term = Put_Structure(ATOM_CHAR('+'), 2); Unify_Value(flag_word); Unify_Value(value_word); Pl_Err_Domain(domain_flag_value, term); err_perm: Pl_Err_Permission(permission_operation_modify, permission_type_flag, flag_word); return FALSE; } /*-------------------------------------------------------------------------* * CURRENT_PROLOG_FLAG_2 * * * *-------------------------------------------------------------------------*/ Bool Current_Prolog_Flag_2(WamWord flag_word, WamWord value_word) { WamWord word, tag_mask; int i; int atom; DEREF(flag_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) { atom = Rd_Atom_Check(word); for (i = 0; i < NB_OF_FLAGS; i++) if (atom_flag_tbl[i] == atom) break; if (i >= NB_OF_FLAGS) Pl_Err_Domain(domain_prolog_flag, flag_word); return Unif_Flag(i, value_word); } /* non deterministic case */ i = 0; A(0) = flag_word; A(1) = value_word; A(2) = i + 1; Create_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_PROLOG_FLAG_ALT, 0), 3); Get_Atom(atom_flag_tbl[i], flag_word); return Unif_Flag(i, value_word); } /*-------------------------------------------------------------------------* * CURRENT_PROLOG_FLAG_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Current_Prolog_Flag_Alt_0(void) { WamWord flag_word, value_word; int i; Update_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_PROLOG_FLAG_ALT, 0), 0); flag_word = AB(B, 0); value_word = AB(B, 1); i = AB(B, 2); if (i + 1 == NB_OF_FLAGS) Delete_Last_Choice_Point(); else /* non deterministic case */ { #if 0 /* the following data is unchanged */ AB(B, 0) = flag_word; AB(B, 1) = value_word; #endif AB(B, 2) = i + 1; } Get_Atom(atom_flag_tbl[i], flag_word); return Unif_Flag(i, value_word); } /*-------------------------------------------------------------------------* * UNIF_FLAG * * * *-------------------------------------------------------------------------*/ static Bool Unif_Flag(int i, WamWord value_word) { int atom = -1; long n; switch (i) { case FLAG_BOUNDED: atom = atom_true; break; case FLAG_MAX_INTEGER: n = INT_GREATEST_VALUE; break; case FLAG_MIN_INTEGER: n = INT_LOWEST_VALUE; break; case FLAG_ROUNDING_FCT: atom = ((-3 / 2) == -1) ? atom_toward_zero : atom_down; break; case FLAG_CHAR_CONVERSION: case FLAG_DEBUG: case FLAG_SINGLETON_WARNING: case FLAG_STRICT_ISO: atom = (Flag_Value(i)) ? atom_on : atom_off; break; case FLAG_MAX_ARITY: n = MAX_ARITY; break; case FLAG_UNKNOWN: case FLAG_SYNTAX_ERROR: case FLAG_OS_ERROR: switch (Flag_Value(i)) { case FLAG_VALUE_ERROR: atom = atom_error; break; case FLAG_VALUE_WARNING: atom = atom_warning; break; case FLAG_VALUE_FAIL: atom = atom_fail; break; } break; case FLAG_DOUBLE_QUOTES: case FLAG_BACK_QUOTES: switch (Flag_Value(i)) { case FLAG_AS_CODES: atom = atom_codes; break; case FLAG_AS_CODES | FLAG_NO_ESCAPE_MASK: atom = atom_codes_no_escape; break; case FLAG_AS_CHARS: atom = atom_chars; break; case FLAG_AS_CHARS | FLAG_NO_ESCAPE_MASK: atom = atom_chars_no_escape; break; case FLAG_AS_ATOM: atom = atom_atom; break; case FLAG_AS_ATOM | FLAG_NO_ESCAPE_MASK: atom = atom_atom_no_escape; break; } break; case FLAG_PROLOG_NAME: case FLAG_PROLOG_VERSION: case FLAG_PROLOG_DATE: case FLAG_PROLOG_COPYRIGHT: atom = atom_prolog[i - FLAG_PROLOG_NAME]; break; case FLAG_MAX_ATOM: n = MAX_ATOM; break; case FLAG_MAX_UNGET: n = STREAM_PB_SIZE; break; } if (atom < 0) return Get_Integer(n, value_word); return Get_Atom(atom, value_word); } /*-------------------------------------------------------------------------* * SYS_VAR_WRITE_2 * * * *-------------------------------------------------------------------------*/ void Sys_Var_Write_2(WamWord var_word, WamWord n_word) { sys_var[Rd_Integer(var_word)] = Rd_Integer(n_word); } /*-------------------------------------------------------------------------* * SYS_VAR_READ_2 * * * *-------------------------------------------------------------------------*/ Bool Sys_Var_Read_2(WamWord var_word, WamWord n_word) { return Get_Integer(sys_var[Rd_Integer(var_word)], n_word); } /*-------------------------------------------------------------------------* * SYS_VAR_INC_1 * * * *-------------------------------------------------------------------------*/ void Sys_Var_Inc_1(WamWord var_word) { sys_var[Rd_Integer(var_word)]++; } /*-------------------------------------------------------------------------* * SYS_VAR_DEC_1 * * * *-------------------------------------------------------------------------*/ void Sys_Var_Dec_1(WamWord var_word) { sys_var[Rd_Integer(var_word)]--; } /*-------------------------------------------------------------------------* * SYS_VAR_SET_BIT_2 * * * *-------------------------------------------------------------------------*/ void Sys_Var_Set_Bit_2(WamWord var_word, WamWord bit_word) { sys_var[Rd_Integer(var_word)] |= (1 << Rd_Integer(bit_word)); } /*-------------------------------------------------------------------------* * SYS_VAR_RESET_BIT_2 * * * *-------------------------------------------------------------------------*/ void Sys_Var_Reset_Bit_2(WamWord var_word, WamWord bit_word) { sys_var[Rd_Integer(var_word)] &= ~(1 << Rd_Integer(bit_word)); } /*-------------------------------------------------------------------------* * SYS_VAR_SET_BIT_2 * * * *-------------------------------------------------------------------------*/ Bool Sys_Var_Get_Bit_3(WamWord var_word, WamWord bit_word, WamWord value_word) { unsigned x; x = (sys_var[Rd_Integer(var_word)] >> Rd_Integer(bit_word)) & 1; return Un_Integer(x, value_word); } /*-------------------------------------------------------------------------* * SYS_VAR_PUT_2 * * * *-------------------------------------------------------------------------*/ void Sys_Var_Put_2(WamWord var_word, WamWord term_word) { WamWord word, tag_mask; WamWord *adr; int sv; int size; sv = Rd_Integer(var_word); DEREF(term_word, word, tag_mask); if (tag_mask == TAG_ATM_MASK || tag_mask == TAG_INT_MASK) { sys_var[sv] = word; return; } size = Term_Size(word); adr = (WamWord *) Malloc(size * sizeof(WamWord)); /* never recovered */ Copy_Term(adr, &word); sys_var[sv] = Tag_REF(adr); } /*-------------------------------------------------------------------------* * SYS_VAR_GET_2 * * * *-------------------------------------------------------------------------*/ Bool Sys_Var_Get_2(WamWord var_word, WamWord term_word) { WamWord word; WamWord *adr; int size; word = sys_var[Rd_Integer(var_word)]; if (Tag_Mask_Of(word) == TAG_REF_MASK) { adr = UnTag_REF(word); size = Term_Size(*adr); Copy_Contiguous_Term(H, adr); word = *H; H += size; } return Unify(word, term_word); } /*-------------------------------------------------------------------------* * GET_CURRENT_B_1 * * * *-------------------------------------------------------------------------*/ void Get_Current_B_1(WamWord b_word) { WamWord word; Load_Cut_Level(&word); Unify(word, b_word); } /*-------------------------------------------------------------------------* * SET_CURRENT_B_1 * * * *-------------------------------------------------------------------------*/ void Set_Current_B_1(WamWord b_word) { WamWord word, tag_mask; DEREF(b_word, word, tag_mask); Cut(word); } /*-------------------------------------------------------------------------* * WRITE_PL_STATE_FILE * * * *-------------------------------------------------------------------------*/ Bool Write_Pl_State_File(WamWord file_word) { char *file; FILE *f; int i; HashScan scan; OperInf *oper; SFOp sf_op; int c; /* 'static' is because gcc allocates a frame even with -fomit-frame-pointer. * This corrupts ebp on ix86 */ static char cv[2]; file = atom_tbl[Rd_Atom_Check(file_word)].name; file = M_Absolute_Path_Name(file); f = fopen(file, "wb"); Os_Test_Error(f == NULL); i = Hash_Nb_Elements(oper_tbl); fwrite(&i, sizeof(i), 1, f); for (oper = (OperInf *) Hash_First(oper_tbl, &scan); oper; oper = (OperInf *) Hash_Next(&scan)) { sf_op.type = Type_Of_Oper(oper->a_t); sf_op.prec = oper->prec; sf_op.left = oper->left; sf_op.right = oper->right; sf_op.length = atom_tbl[Atom_Of_Oper(oper->a_t)].prop.length; fwrite(&sf_op, sizeof(sf_op), 1, f); fwrite(atom_tbl[Atom_Of_Oper(oper->a_t)].name, sf_op.length, 1, f); } i = Flag_Value(FLAG_DOUBLE_QUOTES); fwrite(&i, sizeof(i), 1, f); i = Flag_Value(FLAG_BACK_QUOTES); fwrite(&i, sizeof(i), 1, f); i = Flag_Value(FLAG_CHAR_CONVERSION); fwrite(&i, sizeof(i), 1, f); i = Flag_Value(FLAG_SINGLETON_WARNING); fwrite(&i, sizeof(i), 1, f); i = SYS_VAR_SAY_GETC; fwrite(&i, sizeof(i), 1, f); for (c = 0; c < 256; c++) if (char_conv[c] != c) { cv[0] = c; cv[1] = char_conv[c]; fwrite(&cv, 2, 1, f); } cv[0] = 0; cv[1] = 0; fwrite(&cv, 2, 1, f); fclose(f); return TRUE; } /*-------------------------------------------------------------------------* * READ_PL_STATE_FILE * * * *-------------------------------------------------------------------------*/ Bool Read_Pl_State_File(WamWord file_word) { char *file; FILE *f; int i; SFOp sf_op; int c; char cv[2]; file = atom_tbl[Rd_Atom_Check(file_word)].name; file = M_Absolute_Path_Name(file); f = fopen(file, "rb"); Os_Test_Error(f == NULL); Hash_Delete_All(oper_tbl); fread(&i, sizeof(i), 1, f); while (i--) { fread(&sf_op, sizeof(sf_op), 1, f); fread(glob_buff, sf_op.length, 1, f); glob_buff[sf_op.length] = '\0'; Create_Oper(Create_Allocate_Atom(glob_buff), sf_op.type, sf_op.prec, sf_op.left, sf_op.right); } fread(&i, sizeof(i), 1, f); Flag_Value(FLAG_DOUBLE_QUOTES) = i; fread(&i, sizeof(i), 1, f); Flag_Value(FLAG_BACK_QUOTES) = i; fread(&i, sizeof(i), 1, f); Flag_Value(FLAG_CHAR_CONVERSION) = i; fread(&i, sizeof(i), 1, f); Flag_Value(FLAG_SINGLETON_WARNING) = i; fread(&i, sizeof(i), 1, f); SYS_VAR_SAY_GETC = i; for (;;) { fread(&cv, 2, 1, f); c = cv[0]; if (c == 0 && cv[1] == 0) break; char_conv[c] = cv[1]; } fclose(f); return TRUE; } /*-------------------------------------------------------------------------* * ARGUMENT_COUNTER_1 * * * *-------------------------------------------------------------------------*/ Bool Argument_Counter_1(WamWord n_word) { return Un_Integer_Check(os_argc, n_word); } /*-------------------------------------------------------------------------* * ARGUMENT_VALUE_2 * * * *-------------------------------------------------------------------------*/ Bool Argument_Value_2(WamWord i_word, WamWord a_word) { int i; i = Rd_Positive_Check(i_word); if (i >= os_argc) return FALSE; return Un_Atom_Check(Create_Atom(os_argv[i]), a_word); } /*-------------------------------------------------------------------------* * ARGUMENT_LIST_1 * * * *-------------------------------------------------------------------------*/ Bool Argument_List_1(WamWord list_word) { int i; Check_For_Un_List(list_word); for (i = 1; i < os_argc; i++) { if (!Get_List(list_word) || !Unify_Atom(Create_Atom(os_argv[i]))) return FALSE; list_word = Unify_Variable(); } return Get_Nil(list_word); } /*-------------------------------------------------------------------------* * ENVIRON_2 * * * *-------------------------------------------------------------------------*/ Bool Environ_2(WamWord var_name_word, WamWord value_word) { WamWord word, tag_mask; char *var_name; char *value; char **cur_env; char *one_env; int lg; Check_For_Un_Atom(value_word); DEREF(var_name_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) { var_name = Rd_String_Check(word); value = (char *) getenv(var_name); return value && Un_String_Check(value, value_word); } /* non deterministic case */ cur_env = environ; one_env = *cur_env++; if (one_env == NULL) return FALSE; if (*cur_env) { A(0) = var_name_word; A(1) = value_word; A(2) = (WamWord) cur_env; Create_Choice_Point((CodePtr) Prolog_Predicate(ENVIRON_ALT, 0), 3); } value = strchr(one_env, '='); lg = value - one_env; var_name = glob_buff; strncpy(var_name, one_env, lg); var_name[lg] = '\0'; value++; /* skip = */ return Un_String_Check(var_name, var_name_word) && Get_Atom(Create_Atom(value), value_word); } /*-------------------------------------------------------------------------* * ENVIRON_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Environ_Alt_0(void) { WamWord var_name_word, value_word; char *var_name; char *value; char **cur_env; char *one_env; int lg; Update_Choice_Point((CodePtr) Prolog_Predicate(ENVIRON_ALT, 0), 0); var_name_word = AB(B, 0); value_word = AB(B, 1); cur_env = (char **) AB(B, 2); one_env = *cur_env++; if (*cur_env == NULL) Delete_Last_Choice_Point(); else /* non deterministic case */ { #if 0 /* the following data is unchanged */ AB(B,0)=var_name_word; AB(B,1)=value_word; #endif AB(B, 2) = (WamWord) cur_env; } value = strchr(one_env, '='); lg = value - one_env; var_name = glob_buff; strncpy(var_name, one_env, lg); var_name[lg] = '\0'; value++; /* skip = */ return Un_String_Check(var_name, var_name_word) && Get_Atom(Create_Atom(value), value_word); } ./gprolog-1.3.0/src/BipsPl/atom_c.c0000644004425400513100000006611110547154133015367 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : atom_c.c * * Descr.: atom manipulation management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: atom_c.c,v 1.15 2007/01/04 10:35:07 diaz Exp $ */ #include #include #include #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static Bool Compute_Next_BLA(int mask, AtomInf *patom, AtomInf *psub_atom, int b, int l, int a, int *b1, int *l1, int *a1); static int Create_Malloc_Atom(char *str); static Bool String_To_Number(char *str, WamWord number_word); #define ATOM_CONCAT_ALT X2461746F6D5F636F6E6361745F616C74 #define SUB_ATOM_ALT X247375625F61746F6D5F616C74 #define CURRENT_ATOM_ALT X2463757272656E745F61746F6D5F616C74 Prolog_Prototype(ATOM_CONCAT_ALT, 0); Prolog_Prototype(SUB_ATOM_ALT, 0); Prolog_Prototype(CURRENT_ATOM_ALT, 0); #define MALLOC_STR(n) \ if (n<0) \ return FALSE; \ str = (char *) Malloc(n + 1) /*-------------------------------------------------------------------------* * ATOM_LENGTH_2 * * * *-------------------------------------------------------------------------*/ Bool Atom_Length_2(WamWord atom_word, WamWord length_word) { int atom; atom = Rd_Atom_Check(atom_word); return Un_Positive_Check(atom_tbl[atom].prop.length, length_word); } /*-------------------------------------------------------------------------* * ATOM_CONCAT_3 * * * *-------------------------------------------------------------------------*/ Bool Atom_Concat_3(WamWord atom1_word, WamWord atom2_word, WamWord atom3_word) { WamWord word, tag_mask; int tag1, tag2, tag3; AtomInf *patom1, *patom2, *patom3; char *str; int l; DEREF(atom1_word, word, tag_mask); if (tag_mask != TAG_REF_MASK && tag_mask != TAG_ATM_MASK) Pl_Err_Type(type_atom, atom1_word); tag1 = tag_mask; atom1_word = word; DEREF(atom2_word, word, tag_mask); if (tag_mask != TAG_REF_MASK && tag_mask != TAG_ATM_MASK) Pl_Err_Type(type_atom, atom2_word); tag2 = tag_mask; atom2_word = word; DEREF(atom3_word, word, tag_mask); if (tag_mask != TAG_REF_MASK && tag_mask != TAG_ATM_MASK) Pl_Err_Type(type_atom, atom3_word); tag3 = tag_mask; atom3_word = word; if (tag3 == TAG_REF_MASK && (tag1 == TAG_REF_MASK || tag2 == TAG_REF_MASK)) Pl_Err_Instantiation(); if (tag1 == TAG_ATM_MASK) { patom1 = atom_tbl + UnTag_ATM(atom1_word); if (tag2 == TAG_ATM_MASK) { patom2 = atom_tbl + UnTag_ATM(atom2_word); l = patom1->prop.length + patom2->prop.length; MALLOC_STR(l); strcpy(str, patom1->name); strcpy(str + patom1->prop.length, patom2->name); return Get_Atom(Create_Malloc_Atom(str), atom3_word); } patom3 = atom_tbl + UnTag_ATM(atom3_word); l = patom3->prop.length - patom1->prop.length; MALLOC_STR(l); strcpy(str, patom3->name + patom1->prop.length); return strncmp(patom1->name, patom3->name, patom1->prop.length) == 0 && Get_Atom(Create_Malloc_Atom(str), atom2_word); } if (tag2 == TAG_ATM_MASK) /* here tag1 == REF */ { patom2 = atom_tbl + UnTag_ATM(atom2_word); patom3 = atom_tbl + UnTag_ATM(atom3_word); l = patom3->prop.length - patom2->prop.length; MALLOC_STR(l); strncpy(str, patom3->name, l); str[l] = '\0'; return strncmp(patom2->name, patom3->name + l, patom2->prop.length) == 0 && Get_Atom(Create_Malloc_Atom(str), atom1_word); } /* A1 and A2 are variables: non deterministic case */ patom3 = atom_tbl + UnTag_ATM(atom3_word); if (patom3->prop.length > 0) { A(0) = atom1_word; A(1) = atom2_word; A(2) = (WamWord) patom3; A(3) = (WamWord) (patom3->name + 1); Create_Choice_Point((CodePtr) Prolog_Predicate(ATOM_CONCAT_ALT, 0), 4); } return Get_Atom(atom_void, atom1_word) && Get_Atom_Tagged(atom3_word, atom2_word); } /*-------------------------------------------------------------------------* * ATOM_CONCAT_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Atom_Concat_Alt_0(void) { WamWord atom1_word, atom2_word; AtomInf *patom3; char *name; char *p; char *str; int l; Update_Choice_Point((CodePtr) Prolog_Predicate(ATOM_CONCAT_ALT, 0), 0); atom1_word = AB(B, 0); atom2_word = AB(B, 1); patom3 = (AtomInf *) AB(B, 2); p = (char *) AB(B, 3); if (*p == '\0') Delete_Last_Choice_Point(); else /* non deterministic case */ { #if 0 /* the following data is unchanged */ AB(B, 0) = atom1_word; AB(B, 1) = atom2_word; AB(B, 2) = (WamWord) patom3; #endif AB(B, 3) = (WamWord) (p + 1); } name = patom3->name; l = p - name; MALLOC_STR(l); strncpy(str, name, l + 1); str[l] = '\0'; if (!Get_Atom(Create_Malloc_Atom(str), atom1_word)) return FALSE; l = patom3->prop.length - l; MALLOC_STR(l); strcpy(str, p); return Get_Atom(Create_Malloc_Atom(str), atom2_word); } #define DEREF_LG(lg_word, lg) \ DEREF(lg_word, word, tag_mask); \ mask <<= 1; \ if (tag_mask == TAG_INT_MASK) \ { \ if ((lg = UnTag_INT(word)) < 0) \ Pl_Err_Domain(domain_not_less_than_zero, word); \ mask |= 1; \ } \ else \ { \ lg = 0; \ if (tag_mask != TAG_REF_MASK) \ Pl_Err_Type(type_integer, word); \ } \ lg_word = word /*-------------------------------------------------------------------------* * SUB_ATOM_5 * * * *-------------------------------------------------------------------------*/ Bool Sub_Atom_5(WamWord atom_word, WamWord before_word, WamWord length_word, WamWord after_word, WamWord sub_atom_word) { WamWord word, tag_mask; AtomInf *patom; AtomInf *psub_atom = NULL; /* only for the compiler */ int length; int b, l, a; int b1, l1, a1; Bool nondet; int mask = 0; char *str; patom = atom_tbl + Rd_Atom_Check(atom_word); length = patom->prop.length; DEREF_LG(before_word, b); DEREF_LG(length_word, l); DEREF_LG(after_word, a); DEREF(sub_atom_word, word, tag_mask); if (tag_mask != TAG_REF_MASK && tag_mask != TAG_ATM_MASK) Pl_Err_Type(type_atom, word); sub_atom_word = word; if (tag_mask == TAG_ATM_MASK) { psub_atom = atom_tbl + UnTag_ATM(word); l = psub_atom->prop.length; if (!Get_Integer(l, length_word)) return FALSE; if ((mask & 5) == 5 && length != b + l + a) /* B and A fixed */ return FALSE; if (mask & 4) /* B fixed */ { a = length - b - l; return strncmp(patom->name + b, psub_atom->name, l) == 0 && Get_Integer(a, after_word); } if (mask & 1) /* A fixed */ { b = length - l - a; return strncmp(patom->name + b, psub_atom->name, l) == 0 && Get_Integer(b, before_word); } mask = 8; /* set sub_atom as fixed */ } switch (mask) /* mask <= 7, B L A (1: fixed, 0: var) */ { case 0: /* nothing fixed */ case 2: /* L fixed */ case 4: /* B fixed */ a = length - b - l; nondet = TRUE; break; case 1: /* A fixed */ l = length - b - a; nondet = TRUE; break; case 3: /* L A fixed */ b = length - l - a; nondet = FALSE; break; case 5: /* B A fixed */ l = length - b - a; nondet = FALSE; break; case 6: /* B L fixed */ case 7: /* B L A fixed */ a = length - b - l; nondet = FALSE; break; default: /* sub_atom fixed */ if ((str = strstr(patom->name + b, psub_atom->name)) == NULL) return FALSE; b = str - patom->name; a = length - b - l; nondet = TRUE; break; } if (b < 0 || l < 0 || a < 0) return FALSE; if (nondet && Compute_Next_BLA(mask, patom, psub_atom, b, l, a, &b1, &l1, &a1)) { /* non deterministic case */ A(0) = before_word; A(1) = length_word; A(2) = after_word; A(3) = sub_atom_word; A(4) = (WamWord) patom; A(5) = (WamWord) psub_atom; A(6) = mask; A(7) = b1; A(8) = l1; A(9) = a1; Create_Choice_Point((CodePtr) Prolog_Predicate(SUB_ATOM_ALT, 0), 10); } if (mask <= 7) { MALLOC_STR(l); strncpy(str, patom->name + b, l); str[l] = '\0'; Get_Atom(Create_Malloc_Atom(str), sub_atom_word); Get_Integer(l, length_word); } return Get_Integer(b, before_word) && Get_Integer(a, after_word); } /*-------------------------------------------------------------------------* * SUB_ATOM_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Sub_Atom_Alt_0(void) { WamWord before_word, length_word, after_word, sub_atom_word; AtomInf *patom; AtomInf *psub_atom; int b, l, a; int b1, l1, a1; int mask; char *str; Update_Choice_Point((CodePtr) Prolog_Predicate(SUB_ATOM_ALT, 0), 0); before_word = AB(B, 0); length_word = AB(B, 1); after_word = AB(B, 2); sub_atom_word = AB(B, 3); patom = (AtomInf *) AB(B, 4); psub_atom = (AtomInf *) AB(B, 5); mask = AB(B, 6); b = AB(B, 7); l = AB(B, 8); a = AB(B, 9); if (!Compute_Next_BLA(mask, patom, psub_atom, b, l, a, &b1, &l1, &a1)) Delete_Last_Choice_Point(); else /* non deterministic case */ { #if 0 /* the following data is unchanged */ AB(B, 0) = before_word; AB(B, 1) = length_word; AB(B, 2) = after_word; AB(B, 3) = sub_atom_word; AB(B, 4) = (WamWord) patom; AB(B, 5) = (WamWord) psub_atom; AB(B, 6) = mask; #endif AB(B, 7) = b1; AB(B, 8) = l1; AB(B, 9) = a1; } if (mask <= 7) { MALLOC_STR(l); strncpy(str, patom->name + b, l); str[l] = '\0'; Get_Atom(Create_Malloc_Atom(str), sub_atom_word); Get_Integer(l, length_word); } return Get_Integer(b, before_word) && Get_Integer(a, after_word); } /*-------------------------------------------------------------------------* * COMPUTE_NEXT_BLA * * * *-------------------------------------------------------------------------*/ static Bool Compute_Next_BLA(int mask, AtomInf *patom, AtomInf *psub_atom, int b, int l, int a, int *b1, int *l1, int *a1) { int length = patom->prop.length; char *str; switch (mask) /* mask B L A (1: fixed, 0: var) */ { case 0: /* nothing fixed */ if (++l > length - b) { l = 0; if (++b > length) return FALSE; } a = length - b - l; break; case 1: /* A fixed */ if (++b > length - a) return FALSE; l = length - b - a; break; case 2: /* L fixed */ if (++b > length - l) return FALSE; a = length - b - l; break; case 4: /* B fixed */ if (++l > length - b) return FALSE; a = length - b - l; break; default: /* sub_atom fixed */ if (++b > length - l) return FALSE; if ((str = strstr(patom->name + b, psub_atom->name)) == NULL) return FALSE; b = str - patom->name; a = length - b - l; break; } *b1 = b; *l1 = l; *a1 = a; return TRUE; } /*-------------------------------------------------------------------------* * CREATE_MALLOC_ATOM * * * *-------------------------------------------------------------------------*/ static int Create_Malloc_Atom(char *str) { int atom; int nb = nb_atom; atom = Create_Atom(str); if (nb == nb_atom) Free(str); return atom; } /*-------------------------------------------------------------------------* * ATOM_CHARS_2 * * * *-------------------------------------------------------------------------*/ Bool Atom_Chars_2(WamWord atom_word, WamWord chars_word) { WamWord word, tag_mask; DEREF(atom_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) return Un_Chars_Check(Rd_String_Check(word), chars_word); return Un_String_Check(Rd_Chars_Check(chars_word), atom_word); } /*-------------------------------------------------------------------------* * ATOM_CODES_2 * * * *-------------------------------------------------------------------------*/ Bool Atom_Codes_2(WamWord atom_word, WamWord codes_word) { WamWord word, tag_mask; DEREF(atom_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) return Un_Codes_Check(Rd_String_Check(word), codes_word); return Un_String_Check(Rd_Codes_Check(codes_word), atom_word); } /*-------------------------------------------------------------------------* * NUMBER_ATOM_2 * * * *-------------------------------------------------------------------------*/ Bool Number_Atom_2(WamWord number_word, WamWord atom_word) { WamWord word, tag_mask; char *str; DEREF(atom_word, word, tag_mask); if (tag_mask == TAG_ATM_MASK) return String_To_Number(atom_tbl[UnTag_ATM(word)].name, number_word); if (tag_mask != TAG_REF_MASK) Pl_Err_Type(type_atom, word); DEREF(number_word, word, tag_mask); if (tag_mask == TAG_INT_MASK) { sprintf(glob_buff, "%ld", UnTag_INT(word)); return Un_String_Check(glob_buff, atom_word); } str = Float_To_String(Rd_Number_Check(word)); return Un_String_Check(str, atom_word); } /*-------------------------------------------------------------------------* * NUMBER_CHARS_2 * * * *-------------------------------------------------------------------------*/ Bool Number_Chars_2(WamWord number_word, WamWord chars_word) { WamWord word, tag_mask; WamWord *lst_adr, list_word; char *str = glob_buff; int atom; list_word = chars_word; for (;;) { DEREF(list_word, word, tag_mask); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) goto from_nb; lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); atom = UnTag_ATM(word); if (tag_mask != TAG_ATM_MASK || atom_tbl[atom].prop.length != 1) goto from_nb; *str++ = atom_tbl[atom].name[0]; list_word = Cdr(lst_adr); } *str = '\0'; return String_To_Number(glob_buff, number_word); from_nb: DEREF(number_word, word, tag_mask); if (tag_mask == TAG_INT_MASK) { sprintf(glob_buff, "%ld", UnTag_INT(word)); return Un_Chars(glob_buff, chars_word); } if (tag_mask != TAG_REF_MASK) { str = Float_To_String(Rd_Number_Check(word)); return Un_Chars(str, chars_word); } Rd_Chars_Check(chars_word); /* only to raise the correct error */ return FALSE; } /*-------------------------------------------------------------------------* * NUMBER_CODES_2 * * * *-------------------------------------------------------------------------*/ Bool Number_Codes_2(WamWord number_word, WamWord codes_word) { WamWord word, tag_mask; WamWord *lst_adr, list_word; char *str = glob_buff; int c; list_word = codes_word; for (;;) { DEREF(list_word, word, tag_mask); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) goto from_nb; lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); c = UnTag_INT(word); if (tag_mask != TAG_INT_MASK || !Is_Valid_Code(c)) goto from_nb; *str++ = c; list_word = Cdr(lst_adr); } *str = '\0'; return String_To_Number(glob_buff, number_word); from_nb: DEREF(number_word, word, tag_mask); if (tag_mask == TAG_INT_MASK) { sprintf(glob_buff, "%ld", UnTag_INT(word)); return Un_Codes(glob_buff, codes_word); } if (tag_mask != TAG_REF_MASK) { str = Float_To_String(Rd_Number_Check(word)); return Un_Codes(str, codes_word); } Rd_Codes_Check(codes_word); /* only to raise the correct error */ return FALSE; } /*-------------------------------------------------------------------------* * CHAR_CODE_2 * * * *-------------------------------------------------------------------------*/ Bool Char_Code_2(WamWord char_word, WamWord code_word) { WamWord word, tag_mask; DEREF(char_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) return Un_Code_Check(Rd_Char_Check(word), code_word); return Un_Char_Check(Rd_Code_Check(code_word), char_word); } /*-------------------------------------------------------------------------* * NAME_2 * * * *-------------------------------------------------------------------------*/ Bool Name_2(WamWord atomic_word, WamWord codes_word) { WamWord word, tag_mask; int syn_flag; Bool is_number; char *str; DEREF(atomic_word, word, tag_mask); if (tag_mask == TAG_ATM_MASK) return Atom_Codes_2(word, codes_word); if (tag_mask == TAG_INT_MASK || tag_mask == TAG_FLT_MASK) return Number_Codes_2(word, codes_word); if (tag_mask != TAG_REF_MASK) Pl_Err_Type(type_atomic, word); str = Rd_Codes_Check(codes_word); syn_flag = Flag_Value(FLAG_SYNTAX_ERROR); Flag_Value(FLAG_SYNTAX_ERROR) = FLAG_VALUE_FAIL; is_number = String_To_Number(str, word); /* only fails on syn err */ Flag_Value(FLAG_SYNTAX_ERROR) = syn_flag; if (is_number) return TRUE; return Un_String(str, word); } /*-------------------------------------------------------------------------* * LOWER_UPPER_2 * * * *-------------------------------------------------------------------------*/ Bool Lower_Upper_2(WamWord lower_word, WamWord upper_word) { WamWord word, tag_mask; DEREF(lower_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) return Un_Char_Check(toupper(Rd_Char_Check(word)), upper_word); return Un_Char_Check(tolower(Rd_Char_Check(upper_word)), lower_word); } /*-------------------------------------------------------------------------* * STRING_TO_NUMBER * * * *-------------------------------------------------------------------------*/ static Bool String_To_Number(char *str, WamWord number_word) { WamWord word; int stm; StmInf *pstm; Bool eof; Check_For_Un_Number(number_word); /* #if 0 since layout leading chars allowed in ISO cf. number_chars */ #if 0 if (!isdigit(*str) && *str != '-') { Set_Last_Syntax_Error("", 1, 1, "non numeric character"); goto err; } #endif stm = Add_Str_Stream(str, TERM_STREAM_ATOM); pstm = stm_tbl[stm]; word = Read_Number(pstm); eof = (Stream_Peekc(pstm) == EOF); if (word == NOT_A_WAM_WORD || !eof) Set_Last_Syntax_Error(atom_tbl[pstm->atom_file_name].name, pstm->line_count + 1, pstm->line_pos + 1, "non numeric character"); Delete_Str_Stream(stm); if (word == NOT_A_WAM_WORD || !eof) { #if 0 err: #endif Syntax_Error(Flag_Value(FLAG_SYNTAX_ERROR)); return FALSE; } return Unify(word, number_word); } /*-------------------------------------------------------------------------* * ATOM_HASH_2 * * * *-------------------------------------------------------------------------*/ Bool Atom_Hash_2(WamWord atom_word, WamWord hash_word) { WamWord word, tag_mask; int hash; DEREF(atom_word, word, tag_mask); atom_word = word; if (tag_mask != TAG_REF_MASK) return Un_Positive_Check(Rd_Atom_Check(word), hash_word); hash = Rd_Positive_Check(hash_word); return Is_Valid_Atom(hash) && Un_Atom_Check(hash, atom_word); } /*-------------------------------------------------------------------------* * CURRENT_ATOM_2 * * * *-------------------------------------------------------------------------*/ Bool Current_Atom_2(WamWord atom_word, WamWord hide_word) { WamWord word, tag_mask; Bool hide; int atom; hide = Rd_Integer_Check(hide_word); DEREF(atom_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) return *Rd_String_Check(word) != '$' || !hide; atom = -1; for (;;) { atom = Find_Next_Atom(atom); if (atom == -1) return FALSE; if (!hide || atom_tbl[atom].name[0] != '$') break; } /* non deterministic case */ A(0) = atom_word; A(1) = hide; A(2) = atom; Create_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_ATOM_ALT, 0), 3); return Get_Atom(atom, atom_word); } /*-------------------------------------------------------------------------* * CURRENT_ATOM_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Current_Atom_Alt_0(void) { WamWord atom_word; Bool hide; int atom; Update_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_ATOM_ALT, 0), 0); atom_word = AB(B, 0); hide = AB(B, 1); atom = AB(B, 2); for (;;) { atom = Find_Next_Atom(atom); if (atom == -1) { Delete_Last_Choice_Point(); return FALSE; } if (!hide || atom_tbl[atom].name[0] != '$') break; } /* non deterministic case */ #if 0 /* the following data is unchanged */ AB(B, 0) = atom_word; AB(B, 1) = hide; #endif AB(B, 2) = atom; return Get_Atom(atom, atom_word); } /*-------------------------------------------------------------------------* * ATOM_PROPERTY_6 * * * *-------------------------------------------------------------------------*/ void Atom_Property_6(WamWord atom_word, WamWord prefix_op_word, WamWord infix_op_word, WamWord postfix_op_word, WamWord needs_quote_word, WamWord needs_scan_word) { WamWord word, tag_mask; int atom; AtomInf *patom; DEREF(atom_word, word, tag_mask); atom = UnTag_ATM(word); patom = atom_tbl + atom; Get_Integer(Check_Oper(atom, PREFIX) != 0, prefix_op_word); Get_Integer(Check_Oper(atom, INFIX) != 0, infix_op_word); Get_Integer(Check_Oper(atom, POSTFIX) != 0, postfix_op_word); Get_Integer(atom_tbl[atom].prop.needs_quote, needs_quote_word); Get_Integer(atom_tbl[atom].prop.needs_scan, needs_scan_word); } /*-------------------------------------------------------------------------* * NEW_ATOM_3 * * * *-------------------------------------------------------------------------*/ Bool New_Atom_3(WamWord prefix_word, WamWord hash_word, WamWord atom_word) { int atom; int hash = -1; atom = Rd_Atom_Check(prefix_word); Check_For_Un_Variable(atom_word); if (SYS_VAR_OPTION_MASK) { hash = Rd_Positive_Check(hash_word); if (Is_Valid_Atom(hash) || hash >= MAX_ATOM) return FALSE; } return Get_Atom(Gen_New_Atom(atom_tbl[atom].name, hash), atom_word); } ./gprolog-1.3.0/src/BipsPl/format_c.c0000644004425400513100000002664610547154136015733 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : format_c.c * * Descr.: formatted output management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: format_c.c,v 1.12 2007/01/04 10:35:10 diaz Exp $ */ #include #include #include #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Format(StmInf *pstm, char *format, WamWord *lst_adr); static WamWord Read_Arg(WamWord **lst_adr); static char *Arg_Atom(WamWord **lst_adr); static long Arg_Integer(WamWord **lst_adr); static double Arg_Float(WamWord **lst_adr); /*-------------------------------------------------------------------------* * FORMAT_3 * * * *-------------------------------------------------------------------------*/ void Format_3(WamWord sora_word, WamWord format_word, WamWord args_word) { WamWord word, tag_mask; int stm; StmInf *pstm; char *str; char buff[2048]; stm = (sora_word == NOT_A_WAM_WORD) ? stm_output : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_OUTPUT); pstm = stm_tbl[stm]; last_output_sora = sora_word; Check_Stream_Type(stm, TRUE, FALSE); DEREF(format_word, word, tag_mask); if (tag_mask == TAG_ATM_MASK && word != NIL_WORD) str = atom_tbl[UnTag_ATM(word)].name; else { strcpy(buff, Rd_Codes_Check(format_word)); str = buff; } Format(stm_tbl[stm], str, &args_word); } /*-------------------------------------------------------------------------* * FORMAT_2 * * * *-------------------------------------------------------------------------*/ void Format_2(WamWord format_word, WamWord args_word) { Format_3(NOT_A_WAM_WORD, format_word, args_word); } /*-------------------------------------------------------------------------* * FORMAT * * * *-------------------------------------------------------------------------*/ static void Format(StmInf *pstm, char *format, WamWord *lst_adr) #define IMPOSS -12345678 { WamWord word; Bool has_n; long generic; long n, n1; char *p; long x; double d; int lg, stop; int i, k; char *format_stack[256]; char **top_stack = format_stack; char buff[2048]; *top_stack++ = format; do { format = *--top_stack; while (*format) { if (*format == '%') /* C printf format */ { if (format[1] == '%') { Stream_Putc('%', pstm); format += 2; continue; } p = buff; n = n1 = IMPOSS; do if ((*p++ = *format++) == '*') { if (n == IMPOSS) n = Arg_Integer(&lst_adr); else n1 = Arg_Integer(&lst_adr); } while ((char *) strchr("diouxXpnceEfgGs", p[-1]) == NULL); *p = '\0'; if (strchr("eEfgG", p[-1]) == NULL) { generic = (p[-1] == 's') ? (long) Arg_Atom(&lst_adr) : Arg_Integer(&lst_adr); if (n != IMPOSS) { if (n1 != IMPOSS) Stream_Printf(pstm, buff, n, n1, generic); else Stream_Printf(pstm, buff, n, generic); } else Stream_Printf(pstm, buff, generic); } else { d = Arg_Float(&lst_adr); if (n != IMPOSS) { if (n1 != IMPOSS) Stream_Printf(pstm, buff, n, n1, d); else Stream_Printf(pstm, buff, n, d); } else Stream_Printf(pstm, buff, d); } continue; } if (*format != '~') { Stream_Putc(*format, pstm); format++; continue; } if (*++format == '*') { n = Arg_Integer(&lst_adr); format++; has_n = TRUE; } else { p = format; n = strtol(format, &format, 10); has_n = (format != p); } switch (*format) { case 'a': p = Arg_Atom(&lst_adr); if (has_n) Stream_Printf(pstm, "%*s", -n, p); else Stream_Puts(p, pstm); break; case 'c': x = Arg_Integer(&lst_adr); if (!Is_Valid_Code(x)) Pl_Err_Representation(representation_character_code); do Stream_Putc(x, pstm); while (--n > 0); break; case 'e': case 'E': case 'f': case 'g': case 'G': x = *format; d = Arg_Float(&lst_adr); if (has_n) sprintf(buff, "%%.%ld%c", n, (char) x); else sprintf(buff, "%%%c", (char) x); Stream_Printf(pstm, buff, d); break; case 'd': case 'D': x = Arg_Integer(&lst_adr); if (n == 0 && *format == 'd') { Stream_Printf(pstm, "%ld", x); break; } if (x < 0) { Stream_Putc('-', pstm); x = -x; } sprintf(buff, "%ld", x); lg = strlen(buff) - n; if (lg <= 0) { Stream_Puts("0.", pstm); for (i = 0; i < -lg; i++) Stream_Putc('0', pstm); Stream_Printf(pstm, "%ld", x); break; } stop = (*format == 'D') ? lg % 3 : -1; if (stop == 0) stop = 3; for (p = buff, i = 0; *p; p++, i++) { if (i == lg) Stream_Putc('.', pstm), stop = -1; if (i == stop) Stream_Putc(',', pstm), stop += 3; Stream_Putc(*p, pstm); } break; case 'r': case 'R': x = Arg_Integer(&lst_adr); if (!has_n || n < 2 || n > 36) n = 8; k = ((*format == 'r') ? 'a' : 'A') - 10; if (x < 0) { Stream_Putc('-', pstm); x = -x; } p = buff + sizeof(buff) - 1; *p = '\0'; do { i = x % n; x = x / n; --p; *p = (i < 10) ? i + '0' : i + k; } while (x); Stream_Puts(p, pstm); break; case 's': case 'S': word = Read_Arg(&lst_adr); if (*format == 's') p = Rd_Codes_Check(word); else p = Rd_Chars_Check(word); if (has_n) Stream_Printf(pstm, "%-*.*s", n, n, p); else Stream_Printf(pstm, "%s", p); break; case 'i': do Read_Arg(&lst_adr); while (--n > 0); break; case 'k': word = Read_Arg(&lst_adr); Write_Term(pstm, -1, MAX_PREC, WRITE_IGNORE_OP | WRITE_QUOTED, word); break; case 'q': word = Read_Arg(&lst_adr); Write_Term(pstm, -1, MAX_PREC, WRITE_NUMBER_VARS | WRITE_NAME_VARS | WRITE_QUOTED, word); break; case 'p': /* only work if print.pl is linked */ word = Read_Arg(&lst_adr); Write_Term(pstm, -1, MAX_PREC, WRITE_NUMBER_VARS | WRITE_NAME_VARS | WRITE_PORTRAYED, word); break; case 'w': word = Read_Arg(&lst_adr); Write_Term(pstm, -1, MAX_PREC, WRITE_NUMBER_VARS | WRITE_NAME_VARS, word); break; case '~': Stream_Putc('~', pstm); break; case 'N': if (pstm->line_pos == 0) break; case 'n': do Stream_Putc('\n', pstm); while (--n > 0); break; case '?': if (format[1]) *top_stack++ = format + 1; format = Arg_Atom(&lst_adr); continue; default: Pl_Err_Domain(domain_format_control_sequence, Tag_ATM(ATOM_CHAR(*format))); } format++; } } while (top_stack > format_stack); } /*-------------------------------------------------------------------------* * READ_ARG * * * *-------------------------------------------------------------------------*/ static WamWord Read_Arg(WamWord **lst_adr) { WamWord word, tag_mask; WamWord *adr; WamWord car_word; DEREF(**lst_adr, word, tag_mask); if (tag_mask != TAG_LST_MASK) { if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) Pl_Err_Domain(domain_non_empty_list, word); Pl_Err_Type(type_list, word); } adr = UnTag_LST(word); car_word = Car(adr); *lst_adr = &Cdr(adr); DEREF(car_word, word, tag_mask); return word; } /*-------------------------------------------------------------------------* * ARG_ATOM * * * *-------------------------------------------------------------------------*/ static char * Arg_Atom(WamWord **lst_adr) { WamWord word; word = Read_Arg(lst_adr); return atom_tbl[Rd_Atom_Check(word)].name; } /*-------------------------------------------------------------------------* * ARG_INTEGER * * * *-------------------------------------------------------------------------*/ static long Arg_Integer(WamWord **lst_adr) { WamWord word; word = Read_Arg(lst_adr); Math_Load_Value(word, &word); return Rd_Integer_Check(word); } /*-------------------------------------------------------------------------* * ARG_FLOAT * * * *-------------------------------------------------------------------------*/ static double Arg_Float(WamWord **lst_adr) { WamWord word; word = Read_Arg(lst_adr); Math_Load_Value(word, &word); return Rd_Number_Check(word); } ./gprolog-1.3.0/src/BipsPl/utils.wam0000644004425400513100000001506110547440331015623 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : utils.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/utils.pl'). predicate('$term_to_goal'/3,30,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(1), get_variable(y(0),3), put_atom('$call_call_info',3), call_c('Blt_G_Assign',[fast_call],[x(3),x(1)]), put_atom('$new_term',1), put_atom(f,3), call_c('Blt_G_Assign',[fast_call],[x(1),x(3)]), put_value(x(2),1), call('$term_to_goal1'/2), put_atom('$new_term',0), put_atom(t,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, get_value(x(2),0), proceed]). predicate('$term_to_goal1'/2,40,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(1), get_variable(y(0),2), call('$term_to_goal2'/2), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, put_value(x(0),1), put_atom(callable,0), execute('$pl_err_type'/2)]). predicate('$term_to_goal2'/2,47,static,private,built_in,[ load_cut_level(2), try_me_else(1), get_variable(x(3),0), call_c('Blt_Var',[fast_call,boolean],[x(3)]), cut(x(2)), put_atom('$call_call_info',2), put_variable(x(0),4), call_c('Blt_G_Read',[fast_call,boolean],[x(2),x(4)]), put_atom('$new_term',2), put_atom(t,4), call_c('Blt_G_Assign',[fast_call],[x(2),x(4)]), put_value(x(3),2), execute('$$term_to_goal2/2_$aux1'/3), label(1), retry_me_else(9), switch_on_term(3,fail,fail,fail,2), label(2), switch_on_structure([((->)/2,4),((',')/2,6),((;)/2,8)]), label(3), try_me_else(5), label(4), allocate(2), get_structure((->)/2,0), unify_variable(x(0)), unify_variable(y(0)), get_structure((->)/2,1), unify_variable(x(1)), unify_variable(y(1)), cut(x(2)), call('$term_to_goal2'/2), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$term_to_goal2'/2), label(5), retry_me_else(7), label(6), allocate(2), get_structure((',')/2,0), unify_variable(x(0)), unify_variable(y(0)), get_structure((',')/2,1), unify_variable(x(1)), unify_variable(y(1)), cut(x(2)), call('$term_to_goal2'/2), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$term_to_goal2'/2), label(7), trust_me_else_fail, label(8), allocate(2), get_structure((;)/2,0), unify_variable(x(0)), unify_variable(y(0)), get_structure((;)/2,1), unify_variable(x(1)), unify_variable(y(1)), cut(x(2)), call('$term_to_goal2'/2), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$term_to_goal2'/2), label(9), trust_me_else_fail, get_value(x(1),0), call_c('Blt_Callable',[fast_call,boolean],[x(1)]), proceed]). predicate('$$term_to_goal2/2_$aux1'/3,47,static,private,built_in,[ load_cut_level(3), try_me_else(1), get_atom(none,0), cut(x(3)), get_structure(call/1,1), unify_local_value(x(2)), proceed, label(1), trust_me_else_fail, get_structure('$call_internal'/2,1), unify_local_value(x(2)), unify_local_value(x(0)), proceed]). predicate('$check_list'/1,81,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_List',[fast_call,boolean],[x(0)]), cut(x(1)), proceed, label(1), retry_me_else(2), call_c('Blt_List_Or_Partial_List',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$pl_err_instantiation'/0), label(2), trust_me_else_fail, put_value(x(0),1), put_atom(list,0), execute('$pl_err_type'/2)]). predicate('$check_list_or_partial_list'/1,94,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_List_Or_Partial_List',[fast_call,boolean],[x(0)]), cut(x(1)), proceed, label(1), trust_me_else_fail, put_value(x(0),1), put_atom(list,0), execute('$pl_err_type'/2)]). predicate('$check_atom_or_atom_list'/1,103,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), cut(x(1)), proceed, label(1), trust_me_else_fail, allocate(1), get_variable(y(0),1), call('$check_atom_or_atom_list1'/1), cut(y(0)), deallocate, proceed]). predicate('$check_atom_or_atom_list1'/1,110,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), execute('$pl_err_instantiation'/0), label(1), retry_me_else(6), switch_on_term(2,3,fail,5,fail), label(2), try_me_else(4), label(3), get_nil(0), proceed, label(4), trust_me_else_fail, label(5), allocate(1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), call('$check_atom_or_atom_list2'/1), put_value(y(0),0), deallocate, execute('$check_atom_or_atom_list1'/1), label(6), trust_me_else_fail, put_value(x(0),1), put_atom(list,0), execute('$pl_err_type'/2)]). predicate('$check_atom_or_atom_list2'/1,124,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), cut(x(1)), proceed, label(1), retry_me_else(2), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$pl_err_instantiation'/0), label(2), trust_me_else_fail, put_value(x(0),1), put_atom(atom,0), execute('$pl_err_type'/2)]). predicate('$get_head_and_body'/3,137,static,private,built_in,[ load_cut_level(3), try_me_else(1), get_structure((:-)/2,0), unify_local_value(x(1)), unify_local_value(x(2)), cut(x(3)), put_value(x(1),0), execute('$check_head'/1), label(1), trust_me_else_fail, get_atom(true,2), get_value(x(1),0), put_value(x(1),0), execute('$check_head'/1)]). predicate('$check_head'/1,147,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$pl_err_instantiation'/0), label(1), trust_me_else_fail, execute('$$check_head/1_$aux1'/1)]). predicate('$$check_head/1_$aux1'/1,151,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Callable',[fast_call,boolean],[x(0)]), cut(x(1)), proceed, label(1), trust_me_else_fail, put_value(x(0),1), put_atom(callable,0), execute('$pl_err_type'/2)]). predicate('$get_pred_indic'/3,160,static,private,built_in,[ call_c('Get_Pred_Indic_3',[boolean],[x(0),x(1),x(2)]), proceed]). ./gprolog-1.3.0/src/BipsPl/file_c.c0000644004425400513100000001315310547154135015346 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : file_c.c * * Descr.: file name management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: file_c.c,v 1.10 2007/01/04 10:35:09 diaz Exp $ */ #include #include "engine_pl.h" #include "bips_pl.h" #ifdef _WIN32 #include #else #include #include #endif /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * ABSOLUTE_FILE_NAME_2 * * * *-------------------------------------------------------------------------*/ Bool Absolute_File_Name_2(WamWord f1_word, WamWord f2_word) { char *f1, *f2; f1 = atom_tbl[Rd_Atom_Check(f1_word)].name; f2 = M_Absolute_Path_Name(f1); if (f2 == NULL) Pl_Err_Domain(domain_os_path, f1_word); return Un_String_Check(f2, f2_word); } /*-------------------------------------------------------------------------* * DECOMPOSE_FILE_NAME_4 * * * *-------------------------------------------------------------------------*/ Bool Decompose_File_Name_4(WamWord path_word, WamWord dir_word, WamWord prefix_word, WamWord suffix_word) { char *path; char *p; int atom; char c; strcpy(glob_buff, atom_tbl[Rd_Atom_Check(path_word)].name); path = glob_buff; Check_For_Un_Atom(dir_word); Check_For_Un_Atom(prefix_word); Check_For_Un_Atom(suffix_word); p = strrchr(path, DIR_SEP_C); #ifdef _WIN32 { char *q = strrchr(path, '/'); if (p == NULL || p > q) p = q; } #endif if (p != NULL) { p++; c = *p; *p = '\0'; atom = Create_Allocate_Atom(path); *p = c; path = p; } else atom = atom_void; if (!Get_Atom(atom, dir_word)) return FALSE; p = strrchr(path, '.'); if (p != NULL) { *p = '\0'; atom = Create_Allocate_Atom(path); *p = '.'; path = p; } else atom = Create_Allocate_Atom(path); if (!Get_Atom(atom, prefix_word)) return FALSE; if (p != NULL) atom = Create_Allocate_Atom(path); else atom = atom_void; return Get_Atom(atom, suffix_word); } /*-------------------------------------------------------------------------* * PROLOG_FILE_NAME_2 * * * *-------------------------------------------------------------------------*/ Bool Prolog_File_Name_2(WamWord f1_word, WamWord f2_word) { int atom; char *f1; int len; char *p; Bool suffix_pl; atom = Rd_Atom_Check(f1_word); f1 = atom_tbl[atom].name; f1 = M_Absolute_Path_Name(f1); if (f1 == NULL) Pl_Err_Domain(domain_os_path, f1_word); if (strcmp(f1, "user") == 0) { same: return Un_Atom_Check(atom, f2_word); } p = strrchr(f1, DIR_SEP_C); #ifdef _WIN32 { char *q = strrchr(f1, '/'); if (p == NULL || p > q) p = q; } #endif if (strchr((p) ? p : f1, '.')) goto same; strcpy(glob_buff, f1); len = strlen(f1); strcpy(glob_buff + len, ".pl"); suffix_pl = TRUE; if (access(glob_buff, F_OK)) /* f1.pl does not exist */ { strcpy(glob_buff + len, ".pro"); suffix_pl = FALSE; if (access(glob_buff, F_OK)) /* f1.pro does not exist */ suffix_pl = TRUE; } sprintf(glob_buff, "%s%s", atom_tbl[atom].name, (suffix_pl) ? ".pl" : ".pro"); return Un_String_Check(glob_buff, f2_word); } ./gprolog-1.3.0/src/BipsPl/g_var_inl.wam0000644004425400513100000000445610547440332016432 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : g_var_inl.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/g_var_inl.pl'). predicate('$use_g_var_inl'/0,29,static,private,built_in,[ proceed]). predicate(g_assign/2,32,static,private,built_in,[ call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed]). predicate(g_assignb/2,38,static,private,built_in,[ call_c('Blt_G_Assignb',[fast_call],[x(0),x(1)]), proceed]). predicate(g_link/2,44,static,private,built_in,[ call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), proceed]). predicate(g_read/2,50,static,private,built_in,[ call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate(g_array_size/2,56,static,private,built_in,[ call_c('Blt_G_Array_Size',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate(g_inc/1,61,static,private,built_in,[ call_c('Blt_G_Inc',[fast_call],[x(0)]), proceed]). predicate(g_inco/2,65,static,private,built_in,[ call_c('Blt_G_Inco',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate(g_inc/2,69,static,private,built_in,[ call_c('Blt_G_Inc_2',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate(g_inc/3,73,static,private,built_in,[ call_c('Blt_G_Inc_3',[fast_call,boolean],[x(0),x(1),x(2)]), proceed]). predicate(g_dec/1,79,static,private,built_in,[ call_c('Blt_G_Dec',[fast_call],[x(0)]), proceed]). predicate(g_deco/2,83,static,private,built_in,[ call_c('Blt_G_Deco',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate(g_dec/2,87,static,private,built_in,[ call_c('Blt_G_Dec_2',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate(g_dec/3,91,static,private,built_in,[ call_c('Blt_G_Dec_3',[fast_call,boolean],[x(0),x(1),x(2)]), proceed]). predicate(g_set_bit/2,97,static,private,built_in,[ call_c('Blt_G_Set_Bit',[fast_call],[x(0),x(1)]), proceed]). predicate(g_reset_bit/2,103,static,private,built_in,[ call_c('Blt_G_Reset_Bit',[fast_call],[x(0),x(1)]), proceed]). predicate(g_test_set_bit/2,109,static,private,built_in,[ call_c('Blt_G_Test_Set_Bit',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate(g_test_reset_bit/2,115,static,private,built_in,[ call_c('Blt_G_Test_Reset_Bit',[fast_call,boolean],[x(0),x(1)]), proceed]). ./gprolog-1.3.0/src/BipsPl/consult.wam0000644004425400513100000004175510547440332016164 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : consult.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/consult.pl'). predicate('$use_consult'/0,29,static,private,built_in,[ proceed]). predicate('.'/2,32,static,private,built_in,[ get_variable(x(2),0), put_list(0), unify_local_value(x(2)), unify_local_value(x(1)), execute(consult/1)]). predicate(consult/1,38,static,private,built_in,[ load_cut_level(1), allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(consult,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), call('$check_atom_or_atom_list'/1), cut(y(1)), put_value(y(0),0), deallocate, execute('$consult/1_$aux1'/1)]). predicate('$consult/1_$aux1'/1,38,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), put_nil(2), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(2)]), cut(x(1)), execute('$consult2'/1), label(1), trust_me_else_fail, execute('$consult1'/1)]). predicate('$consult1'/1,48,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), call('$consult2'/1), put_value(y(0),0), deallocate, execute('$consult1'/1)]). predicate('$consult2'/1,55,static,private,built_in,[ allocate(2), get_variable(x(1),0), put_variable(x(0),2), call_c('Prolog_File_Name_2',[boolean],[x(1),x(2)]), put_variable(y(0),1), call('$$consult2/1_$aux1'/2), put_atom('',0), put_atom(gplc,1), put_variable(y(1),2), call(temporary_file/3), put_atom(consult,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_unsafe_value(y(1),0), put_unsafe_value(y(0),1), deallocate, execute('$$consult2/1_$aux2'/2)]). predicate('$$consult2/1_$aux2'/2,55,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(2), get_variable(y(0),0), get_variable(y(1),2), put_value(y(0),0), call('$consult3'/2), cut(y(1)), put_value(y(0),0), call('$load_file'/1), put_value(y(0),0), deallocate, execute(unlink/1), label(1), trust_me_else_fail, allocate(0), call(unlink/1), put_atom(top_level_output,0), put_atom('compilation failed~n',1), put_nil(2), call(format/3), fail]). predicate('$$consult2/1_$aux1'/2,55,static,private,built_in,[ load_cut_level(2), try_me_else(1), get_atom(user,0), cut(x(2)), get_value(x(0),1), proceed, label(1), trust_me_else_fail, get_variable(x(2),1), get_variable(x(1),0), call_c('Absolute_File_Name_2',[boolean],[x(1),x(2)]), put_value(x(2),0), execute('$$consult2/1_$aux3'/2)]). predicate('$$consult2/1_$aux3'/2,55,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(1), get_variable(y(0),2), call(file_exists/1), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, put_atom(consult,0), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(0),x(2)]), put_atom(source_sink,0), execute('$pl_err_existence'/2)]). predicate('$consult3'/2,79,static,private,built_in,[ call_c('Consult_2',[boolean],[x(0),x(1)]), proceed]). predicate('$load_file'/1,96,static,private,built_in,[ load_cut_level(1), allocate(3), get_variable(y(0),1), put_atom(read,1), put_variable(y(1),2), call(open/3), call(repeat/0), put_value(y(1),0), put_variable(y(2),1), call(read/2), put_value(y(2),0), put_value(y(0),1), put_value(y(1),2), call('$$load_file/1_$aux1'/3), put_unsafe_value(y(1),0), deallocate, execute(close/1)]). predicate('$$load_file/1_$aux1'/3,96,static,private,built_in,[ load_cut_level(3), try_me_else(1), get_atom(end_of_file,0), cut(x(3)), cut(x(1)), proceed, label(1), trust_me_else_fail, allocate(0), put_value(x(2),1), call('$load_pred'/2), fail]). predicate('$load_pred'/2,110,static,private,built_in,[ load_cut_level(2), switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(file_name/1,3),(directive/3,5),(predicate/6,7)]), label(2), try_me_else(4), label(3), get_structure(file_name/1,0), unify_variable(x(1)), put_atom('$pl_file',0), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(4), retry_me_else(6), label(5), get_structure(directive/3,0), unify_variable(x(1)), unify_variable(x(2)), unify_variable(x(0)), execute('$$load_pred/2_$aux1'/3), label(6), trust_me_else_fail, label(7), allocate(9), get_structure(predicate/6,0), unify_variable(y(0)), unify_variable(y(1)), unify_variable(y(2)), unify_variable(y(3)), unify_variable(y(4)), unify_variable(y(5)), get_variable(y(6),1), get_variable(y(7),2), put_atom('$pl_file',0), put_variable(y(8),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), put_value(y(8),1), put_value(y(1),2), call('$check_pred_type'/3), put_value(y(0),0), put_value(y(8),1), put_value(y(1),2), call('$check_owner_files'/3), put_value(y(0),0), get_structure((/)/2,0), unify_variable(x(0)), unify_variable(x(1)), put_value(y(8),2), put_value(y(1),3), put_value(y(2),4), put_value(y(3),5), put_value(y(4),6), call('$bc_start_pred'/7), put_atom('$ctr',0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), call(repeat/0), put_atom('$ctr',1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), put_atom(is,1), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), math_load_value(x(0),1), call_c('Fct_Inc',[fast_call,x(2)],[x(1)]), put_atom('$ctr',1), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_value(y(5),1), put_value(y(6),2), call('$$load_pred/2_$aux2'/3), cut(y(7)), deallocate, proceed]). predicate('$$load_pred/2_$aux2'/3,121,static,private,built_in,[ load_cut_level(3), try_me_else(1), get_value(x(1),0), cut(x(3)), proceed, label(1), trust_me_else_fail, allocate(2), put_value(x(2),0), put_structure(clause/2,1), unify_variable(y(0)), unify_variable(y(1)), call(read/2), put_value(y(0),0), put_value(y(1),1), call('$add_clause_term_and_bc'/2), fail]). predicate('$$load_pred/2_$aux1'/3,113,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(1), get_variable(x(4),2), get_variable(x(5),1), get_variable(y(0),3), put_structure('$load_directive_exception'/3,2), unify_variable(x(1)), unify_local_value(x(5)), unify_local_value(x(4)), put_atom(load,3), put_integer(1,4), put_atom(true,5), call('$catch'/6), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, get_variable(x(0),2), put_atom('$pl_file',2), put_variable(x(3),4), call_c('Blt_G_Read',[fast_call,boolean],[x(2),x(4)]), put_list(2), unify_value(x(3)), unify_list, unify_local_value(x(1)), unify_list, unify_local_value(x(0)), unify_nil, put_atom(top_level_output,0), put_atom('~Nwarning: ~a:~d: ~a directive failed~n',1), execute(format/3)]). predicate('$load_directive_exception'/3,143,static,private,built_in,[ get_variable(x(3),2), put_atom('$pl_file',2), put_variable(x(4),5), call_c('Blt_G_Read',[fast_call,boolean],[x(2),x(5)]), put_list(2), unify_value(x(4)), unify_list, unify_local_value(x(1)), unify_list, unify_local_value(x(3)), unify_list, unify_local_value(x(0)), unify_nil, put_atom(top_level_output,0), put_atom('~Nwarning: ~a:~d: ~a directive caused exception: ~q~n',1), execute(format/3)]). predicate('$check_pred_type'/3,150,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_value(y(0),0), put_atom(native_code,1), call('$predicate_property_any'/2), cut(y(3)), put_value(y(0),0), get_structure((/)/2,0), unify_variable(x(0)), unify_void(1), put_value(y(1),1), put_value(y(2),2), put_value(y(0),3), call('$$check_pred_type/3_$aux1'/4), fail, label(1), trust_me_else_fail, proceed]). predicate('$$check_pred_type/3_$aux1'/4,150,static,private,built_in,[ load_cut_level(4), try_me_else(1), allocate(1), get_variable(y(0),4), call('$aux_name'/1), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, get_variable(x(0),2), put_list(2), unify_local_value(x(1)), unify_list, unify_local_value(x(0)), unify_list, unify_local_value(x(3)), unify_nil, put_atom(top_level_output,0), put_atom('error: ~a:~d: native code procedure ~q cannot be redefined (ignored)~n',1), execute(format/3)]). predicate('$check_owner_files'/3,164,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_value(y(0),0), put_variable(y(4),1), put_variable(y(5),2), call('$get_predicate_file_info'/3), put_value(y(1),0), put_unsafe_value(y(4),1), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), cut(y(3)), put_value(y(0),0), get_structure((/)/2,0), unify_variable(x(0)), unify_void(1), put_value(y(1),1), put_value(y(2),2), put_value(y(0),3), put_unsafe_value(y(4),4), put_unsafe_value(y(5),5), deallocate, execute('$$check_owner_files/3_$aux1'/6), label(1), trust_me_else_fail, proceed]). predicate('$$check_owner_files/3_$aux1'/6,164,static,private,built_in,[ load_cut_level(6), try_me_else(1), allocate(1), get_variable(y(0),6), call('$aux_name'/1), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, allocate(2), get_variable(y(0),4), get_variable(y(1),5), get_variable(x(0),2), put_list(2), unify_local_value(x(1)), unify_list, unify_local_value(x(0)), unify_list, unify_local_value(x(3)), unify_nil, put_atom(top_level_output,0), put_atom('warning: ~a:~d: redefining procedure ~q~n',1), call(format/3), put_atom(top_level_output,0), put_atom(' ~a:~d: previous definition~n',1), put_list(2), unify_local_value(y(0)), unify_list, unify_local_value(y(1)), unify_nil, deallocate, execute(format/3)]). predicate(load/1,179,static,private,built_in,[ load_cut_level(1), allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(load,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), call('$check_atom_or_atom_list'/1), cut(y(1)), put_value(y(0),0), deallocate, execute('$load/1_$aux1'/1)]). predicate('$load/1_$aux1'/1,179,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), put_nil(2), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(2)]), cut(x(1)), execute('$load2'/1), label(1), trust_me_else_fail, execute('$load1'/1)]). predicate('$load1'/1,189,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), call('$load2'/1), put_value(y(0),0), deallocate, execute('$load1'/1)]). predicate('$load2'/1,196,static,private,built_in,[ allocate(3), get_variable(y(0),0), put_value(y(0),0), put_void(1), put_void(2), put_variable(y(1),3), call(decompose_file_name/4), put_value(y(1),0), put_value(y(0),1), put_variable(y(2),2), call('$$load2/1_$aux1'/3), put_value(y(2),1), put_variable(x(0),2), call_c('Absolute_File_Name_2',[boolean],[x(1),x(2)]), put_value(y(2),1), call('$$load2/1_$aux2'/2), put_atom(load,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_unsafe_value(y(2),0), deallocate, execute('$load_file'/1)]). predicate('$$load2/1_$aux2'/2,196,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(1), get_variable(y(0),2), call(file_exists/1), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, put_atom(load,0), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(0),x(2)]), put_atom(source_sink,0), execute('$pl_err_existence'/2)]). predicate('$$load2/1_$aux1'/3,196,static,private,built_in,[ load_cut_level(3), try_me_else(1), get_atom('',0), cut(x(3)), put_value(x(1),0), put_atom('.wbc',1), execute(atom_concat/3), label(1), trust_me_else_fail, get_value(x(1),2), proceed]). predicate('$bc_start_pred'/7,214,static,private,built_in,[ call_c('BC_Start_Pred_7',[],[x(0),x(1),x(2),x(3),x(4),x(5),x(6)]), proceed]). predicate('$bc_start_emit'/0,218,static,private,built_in,[ call_c('BC_Start_Emit_0',[],[]), proceed]). predicate('$bc_stop_emit'/0,221,static,private,built_in,[ call_c('BC_Stop_Emit_0',[],[]), proceed]). predicate('$bc_emit'/1,224,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), call('$bc_emit_inst'/1), put_value(y(0),0), deallocate, execute('$bc_emit'/1)]). predicate('$bc_emit_inst'/1,230,static,private,built_in,[ call_c('BC_Emit_Inst_1',[],[x(0)]), proceed]). predicate('$bc_emulate_cont'/0,236,static,private,built_in,[ call_c('BC_Emulate_Cont_0',[jump],[]), proceed]). predicate('$add_clause_term'/1,242,static,private,built_in,[ put_integer(0,1), put_integer(0,2), execute('$assert'/3)]). predicate('$add_clause_term_and_bc'/2,248,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), call('$bc_start_emit'/0), put_value(y(1),0), call('$bc_emit'/1), call('$bc_stop_emit'/0), put_value(y(0),0), deallocate, execute('$add_clause_term'/1)]). predicate(listing/0,261,static,private,built_in,[ put_atom(listing,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_void(0), execute('$listing_all'/1)]). predicate(listing/1,267,static,private,built_in,[ load_cut_level(1), try_me_else(1), put_atom(listing,2), put_integer(1,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$pl_err_instantiation'/0), label(1), retry_me_else(2), get_variable(x(2),0), call_c('Blt_Atom',[fast_call,boolean],[x(2)]), cut(x(1)), put_structure((/)/2,0), unify_local_value(x(2)), unify_void(1), execute('$listing_all'/1), label(2), trust_me_else_fail, execute('$listing_all'/1)]). predicate('$listing_all'/1,282,static,private,built_in,[ allocate(2), get_variable(y(0),0), put_atom(strict_iso,0), put_variable(y(1),1), call(current_prolog_flag/2), put_value(y(0),0), put_unsafe_value(y(1),1), deallocate, execute('$$listing_all/1_$aux1'/2)]). predicate('$$listing_all/1_$aux1'/2,282,static,private,built_in,[ try_me_else(1), allocate(1), get_variable(y(0),0), put_atom(strict_iso,0), put_atom(off,1), call(set_prolog_flag/2), put_value(y(0),0), call('$current_predicate'/1), put_value(y(0),0), call('$listing_one'/1), fail, label(1), trust_me_else_fail, put_atom(strict_iso,0), execute(set_prolog_flag/2)]). predicate('$listing_one'/1,294,static,private,built_in,[ load_cut_level(1), try_me_else(1), allocate(1), get_variable(y(0),1), put_atom(native_code,1), call('$predicate_property_any'/2), cut(y(0)), deallocate, proceed, label(1), retry_me_else(2), allocate(4), put_variable(y(0),1), put_variable(y(1),2), call('$get_pred_indic'/3), put_variable(y(2),0), put_value(y(0),1), put_value(y(1),2), call_c('Blt_Functor',[fast_call,boolean],[x(0),x(1),x(2)]), put_atom(top_level_output,0), call(nl/1), put_value(y(2),0), put_variable(y(3),1), put_integer(2,2), call('$clause'/3), put_atom(top_level_output,0), put_structure((:-)/2,1), unify_local_value(y(2)), unify_local_value(y(3)), call(portray_clause/2), put_atom(top_level_output,0), call(nl/1), fail, label(2), trust_me_else_fail, proceed]). ./gprolog-1.3.0/src/BipsPl/print.pl0000644004425400513100000000466610547162353015464 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : print.pl * * Descr.: term print management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: print.pl,v 1.13 2007/01/04 10:35:11 diaz Exp $ */ :- built_in. '$use_print'. print(Term) :- set_bip_name(print, 1), '$call_c'('Print_1'(Term)). print(SorA, Term) :- set_bip_name(print, 2), '$call_c'('Print_2'(SorA, Term)). '$try_portray'(Term) :- '$current_predicate'(portray / 1), g_assign('$portray_ok', 0), '$catch'((portray(Term), !), Err, (format(top_level_output, 'exception from portray/1: ~q~n', [Err]), fail), portray, 1, false), g_assign('$portray_ok', 1), fail. '$try_portray'(_) :- g_read('$portray_ok', 1). get_print_stream(Stream) :- set_bip_name(get_print_stream, 1), '$check_stream_or_var'(Stream, Stm), '$call_c'('Get_Print_Stm_1'(Stm)). ./gprolog-1.3.0/src/BipsPl/const_io.wam0000644004425400513100000002412310547440331016277 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : const_io.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/const_io.pl'). predicate('$use_const_io'/0,29,static,private,built_in,[ proceed]). predicate(write_to_atom/2,34,static,private,built_in,[ put_atom(write_to_atom,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Write_To_Atom_2',[boolean],[x(0),x(1)]), proceed]). predicate(write_to_chars/2,38,static,private,built_in,[ put_atom(write_to_chars,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Write_To_Chars_2',[boolean],[x(0),x(1)]), proceed]). predicate(write_to_codes/2,42,static,private,built_in,[ put_atom(write_to_codes,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Write_To_Codes_2',[boolean],[x(0),x(1)]), proceed]). predicate(writeq_to_atom/2,49,static,private,built_in,[ put_atom(writeq_to_atom,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Writeq_To_Atom_2',[boolean],[x(0),x(1)]), proceed]). predicate(writeq_to_chars/2,53,static,private,built_in,[ put_atom(writeq_to_chars,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Writeq_To_Chars_2',[boolean],[x(0),x(1)]), proceed]). predicate(writeq_to_codes/2,57,static,private,built_in,[ put_atom(writeq_to_codes,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Writeq_To_Codes_2',[boolean],[x(0),x(1)]), proceed]). predicate(write_canonical_to_atom/2,64,static,private,built_in,[ put_atom(write_canonical_to_atom,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Write_Canonical_To_Atom_2',[boolean],[x(0),x(1)]), proceed]). predicate(write_canonical_to_chars/2,68,static,private,built_in,[ put_atom(write_canonical_to_chars,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Write_Canonical_To_Chars_2',[boolean],[x(0),x(1)]), proceed]). predicate(write_canonical_to_codes/2,72,static,private,built_in,[ put_atom(write_canonical_to_codes,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Write_Canonical_To_Codes_2',[boolean],[x(0),x(1)]), proceed]). predicate(display_to_atom/2,79,static,private,built_in,[ put_atom(display_to_atom,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Display_To_Atom_2',[boolean],[x(0),x(1)]), proceed]). predicate(display_to_chars/2,83,static,private,built_in,[ put_atom(display_to_chars,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Display_To_Chars_2',[boolean],[x(0),x(1)]), proceed]). predicate(display_to_codes/2,87,static,private,built_in,[ put_atom(display_to_codes,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Display_To_Codes_2',[boolean],[x(0),x(1)]), proceed]). predicate(print_to_atom/2,94,static,private,built_in,[ put_atom(print_to_atom,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Print_To_Atom_2',[boolean],[x(0),x(1)]), proceed]). predicate(print_to_chars/2,98,static,private,built_in,[ put_atom(print_to_chars,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Print_To_Chars_2',[boolean],[x(0),x(1)]), proceed]). predicate(print_to_codes/2,102,static,private,built_in,[ put_atom(print_to_codes,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Print_To_Codes_2',[boolean],[x(0),x(1)]), proceed]). predicate(write_term_to_atom/3,109,static,private,built_in,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(write_term_to_atom,0), put_integer(3,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_write_defaults'/0), put_value(y(2),0), call('$get_write_options'/1), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Write_Term_To_Atom_2',[],[x(0),x(1)]), proceed]). predicate(write_term_to_chars/3,115,static,private,built_in,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(write_term_to_chars,0), put_integer(3,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_write_defaults'/0), put_value(y(2),0), call('$get_write_options'/1), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Write_Term_To_Chars_2',[],[x(0),x(1)]), proceed]). predicate(write_term_to_codes/3,121,static,private,built_in,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(write_term_to_codes,0), put_integer(3,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_write_defaults'/0), put_value(y(2),0), call('$get_write_options'/1), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Write_Term_To_Codes_2',[],[x(0),x(1)]), proceed]). predicate(format_to_atom/3,130,static,private,built_in,[ put_atom(format_to_atom,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('Format_To_Atom_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(format_to_chars/3,134,static,private,built_in,[ put_atom(format_to_chars,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('Format_To_Chars_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(format_to_codes/3,138,static,private,built_in,[ put_atom(format_to_codes,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('Format_To_Codes_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(read_from_atom/2,145,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(read_from_atom,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Read_From_Atom_2',[boolean],[x(0),x(1)]), proceed]). predicate(read_from_chars/2,150,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(read_from_chars,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Read_From_Chars_2',[boolean],[x(0),x(1)]), proceed]). predicate(read_from_codes/2,155,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(read_from_codes,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Read_From_Codes_2',[boolean],[x(0),x(1)]), proceed]). predicate(read_term_from_atom/3,163,static,private,built_in,[ allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(read_term_from_atom,0), put_integer(3,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(2),0), put_variable(y(3),1), put_variable(y(4),2), put_variable(y(5),3), call('$get_read_options'/4), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(3),2), put_unsafe_value(y(4),3), put_unsafe_value(y(5),4), deallocate, call_c('Read_Term_From_Atom_5',[boolean],[x(0),x(1),x(2),x(3),x(4)]), proceed]). predicate(read_term_from_chars/3,169,static,private,built_in,[ allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(read_term_from_chars,0), put_integer(3,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(2),0), put_variable(y(3),1), put_variable(y(4),2), put_variable(y(5),3), call('$get_read_options'/4), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(3),2), put_unsafe_value(y(4),3), put_unsafe_value(y(5),4), deallocate, call_c('Read_Term_From_Chars_5',[boolean],[x(0),x(1),x(2),x(3),x(4)]), proceed]). predicate(read_term_from_codes/3,175,static,private,built_in,[ allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(read_term_from_codes,0), put_integer(3,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(2),0), put_variable(y(3),1), put_variable(y(4),2), put_variable(y(5),3), call('$get_read_options'/4), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(3),2), put_unsafe_value(y(4),3), put_unsafe_value(y(5),4), deallocate, call_c('Read_Term_From_Codes_5',[boolean],[x(0),x(1),x(2),x(3),x(4)]), proceed]). predicate(read_token_from_atom/2,184,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(read_token_from_atom,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Read_Token_From_Atom_2',[boolean],[x(0),x(1)]), proceed]). predicate(read_token_from_chars/2,189,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(read_token_from_chars,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Read_Token_From_Chars_2',[boolean],[x(0),x(1)]), proceed]). predicate(read_token_from_codes/2,194,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(read_token_from_codes,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Read_Token_From_Codes_2',[boolean],[x(0),x(1)]), proceed]). ./gprolog-1.3.0/src/BipsPl/const_io_c.c0000644004425400513100000005354410547154134016253 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : const_io_c.c * * Descr.: input/output from/to constant term management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: const_io_c.c,v 1.12 2007/01/04 10:35:08 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /* from write_c.c */ void Write_Term_2(WamWord sora_word, WamWord term_word); void Write_2(WamWord sora_word, WamWord term_word); void Writeq_2(WamWord sora_word, WamWord term_word); void Write_Canonical_2(WamWord sora_word, WamWord term_word); void Display_2(WamWord sora_word, WamWord term_word); void Print_2(WamWord sora_word, WamWord term_word); /* from format_c.c */ void Format_3(WamWord sora_word, WamWord format_word, WamWord args_word); /* from read_c.c */ Bool Read_Term_5(WamWord sora_word, WamWord term_word, WamWord vars_word, WamWord var_names_word, WamWord sing_names_word); Bool Read_Token_2(WamWord sora_word, WamWord token_word); /*-------------------------------------------------------------------------* * WRITE_TO_ATOM_2 * * * *-------------------------------------------------------------------------*/ Bool Write_To_Atom_2(WamWord atom_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_ATOM); Write_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_String_Check(str, atom_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * WRITE_TO_CHARS_2 * * * *-------------------------------------------------------------------------*/ Bool Write_To_Chars_2(WamWord chars_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CHARS); Write_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_Chars_Check(str, chars_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * WRITE_TO_CODES_2 * * * *-------------------------------------------------------------------------*/ Bool Write_To_Codes_2(WamWord codes_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CODES); Write_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_Codes_Check(str, codes_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * WRITEQ_TO_ATOM_2 * * * *-------------------------------------------------------------------------*/ Bool Writeq_To_Atom_2(WamWord atom_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_ATOM); Writeq_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_String_Check(str, atom_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * WRITEQ_TO_CHARS_2 * * * *-------------------------------------------------------------------------*/ Bool Writeq_To_Chars_2(WamWord chars_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CHARS); Writeq_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_Chars_Check(str, chars_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * WRITEQ_TO_CODES_2 * * * *-------------------------------------------------------------------------*/ Bool Writeq_To_Codes_2(WamWord codes_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CODES); Writeq_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_Codes_Check(str, codes_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * WRITE_CANONICAL_TO_ATOM_2 * * * *-------------------------------------------------------------------------*/ Bool Write_Canonical_To_Atom_2(WamWord atom_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_ATOM); Write_Canonical_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_String_Check(str, atom_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * WRITE_CANONICAL_TO_CHARS_2 * * * *-------------------------------------------------------------------------*/ Bool Write_Canonical_To_Chars_2(WamWord chars_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CHARS); Write_Canonical_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_Chars_Check(str, chars_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * WRITE_CANONICAL_TO_CODES_2 * * * *-------------------------------------------------------------------------*/ Bool Write_Canonical_To_Codes_2(WamWord codes_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CODES); Write_Canonical_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_Codes_Check(str, codes_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * DISPLAY_TO_ATOM_2 * * * *-------------------------------------------------------------------------*/ Bool Display_To_Atom_2(WamWord atom_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_ATOM); Display_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_String_Check(str, atom_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * DISPLAY_TO_CHARS_2 * * * *-------------------------------------------------------------------------*/ Bool Display_To_Chars_2(WamWord chars_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CHARS); Display_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_Chars_Check(str, chars_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * DISPLAY_TO_CODES_2 * * * *-------------------------------------------------------------------------*/ Bool Display_To_Codes_2(WamWord codes_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CODES); Display_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_Codes_Check(str, codes_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * PRINT_TO_ATOM_2 * * * *-------------------------------------------------------------------------*/ Bool Print_To_Atom_2(WamWord atom_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_ATOM); Print_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_String_Check(str, atom_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * PRINT_TO_CHARS_2 * * * *-------------------------------------------------------------------------*/ Bool Print_To_Chars_2(WamWord chars_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CHARS); Print_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_Chars_Check(str, chars_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * PRINT_TO_CODES_2 * * * *-------------------------------------------------------------------------*/ Bool Print_To_Codes_2(WamWord codes_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CODES); Print_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_Codes_Check(str, codes_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * WRITE_TERM_TO_ATOM_2 * * * *-------------------------------------------------------------------------*/ Bool Write_Term_To_Atom_2(WamWord atom_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_ATOM); Write_Term_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_String_Check(str, atom_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * WRITE_TERM_TO_CHARS_2 * * * *-------------------------------------------------------------------------*/ Bool Write_Term_To_Chars_2(WamWord chars_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CHARS); Write_Term_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_Chars_Check(str, chars_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * WRITE_TERM_TO_CODES_2 * * * *-------------------------------------------------------------------------*/ Bool Write_Term_To_Codes_2(WamWord codes_word, WamWord term_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CODES); Write_Term_2(Make_Stream_Tagged_Word(stm), term_word); str = Term_Write_Str_Stream(stm); ret = Un_Codes_Check(str, codes_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * FORMAT_TO_ATOM_3 * * * *-------------------------------------------------------------------------*/ Bool Format_To_Atom_3(WamWord atom_word, WamWord format_word, WamWord args_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_ATOM); Format_3(Make_Stream_Tagged_Word(stm), format_word, args_word); str = Term_Write_Str_Stream(stm); ret = Un_String_Check(str, atom_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * FORMAT_TO_CHARS_3 * * * *-------------------------------------------------------------------------*/ Bool Format_To_Chars_3(WamWord chars_word, WamWord format_word, WamWord args_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CHARS); Format_3(Make_Stream_Tagged_Word(stm), format_word, args_word); str = Term_Write_Str_Stream(stm); ret = Un_Chars_Check(str, chars_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * FORMAT_TO_CODES_3 * * * *-------------------------------------------------------------------------*/ Bool Format_To_Codes_3(WamWord codes_word, WamWord format_word, WamWord args_word) { int stm; char *str; Bool ret; stm = Add_Str_Stream(NULL, TERM_STREAM_CODES); Format_3(Make_Stream_Tagged_Word(stm), format_word, args_word); str = Term_Write_Str_Stream(stm); ret = Un_Codes_Check(str, codes_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * READ_FROM_ATOM_2 * * * *-------------------------------------------------------------------------*/ Bool Read_From_Atom_2(WamWord atom_word, WamWord term_word) { int stm; char *str; Bool ret; str = atom_tbl[Rd_Atom_Check(atom_word)].name; stm = Add_Str_Stream(str, TERM_STREAM_ATOM); ret = Read_Term_5(Make_Stream_Tagged_Word(stm), term_word, 0, 0, 0); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * READ_FROM_CHARS_2 * * * *-------------------------------------------------------------------------*/ Bool Read_From_Chars_2(WamWord chars_word, WamWord term_word) { int stm; Bool ret; stm = Add_Str_Stream(Rd_Chars_Check(chars_word), TERM_STREAM_CHARS); ret = Read_Term_5(Make_Stream_Tagged_Word(stm), term_word, 0, 0, 0); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * READ_FROM_CODES_2 * * * *-------------------------------------------------------------------------*/ Bool Read_From_Codes_2(WamWord codes_word, WamWord term_word) { int stm; Bool ret; stm = Add_Str_Stream(Rd_Codes_Check(codes_word), TERM_STREAM_CODES); ret = Read_Term_5(Make_Stream_Tagged_Word(stm), term_word, 0, 0, 0); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * READ_TERM_FROM_ATOM_5 * * * *-------------------------------------------------------------------------*/ Bool Read_Term_From_Atom_5(WamWord atom_word, WamWord term_word, WamWord vars_word, WamWord var_names_word, WamWord sing_names_word) { int stm; char *str; Bool ret; str = atom_tbl[Rd_Atom_Check(atom_word)].name; stm = Add_Str_Stream(str, TERM_STREAM_ATOM); ret = Read_Term_5(Make_Stream_Tagged_Word(stm), term_word, vars_word, var_names_word, sing_names_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * READ_TERM_FROM_CHARS_5 * * * *-------------------------------------------------------------------------*/ Bool Read_Term_From_Chars_5(WamWord chars_word, WamWord term_word, WamWord vars_word, WamWord var_names_word, WamWord sing_names_word) { int stm; Bool ret; stm = Add_Str_Stream(Rd_Chars_Check(chars_word), TERM_STREAM_CHARS); ret = Read_Term_5(Make_Stream_Tagged_Word(stm), term_word, vars_word, var_names_word, sing_names_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * READ_TERM_FROM_CODES_5 * * * *-------------------------------------------------------------------------*/ Bool Read_Term_From_Codes_5(WamWord codes_word, WamWord term_word, WamWord vars_word, WamWord var_names_word, WamWord sing_names_word) { int stm; Bool ret; stm = Add_Str_Stream(Rd_Codes_Check(codes_word), TERM_STREAM_CODES); ret = Read_Term_5(Make_Stream_Tagged_Word(stm), term_word, vars_word, var_names_word, sing_names_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * READ_TOKEN_FROM_ATOM_2 * * * *-------------------------------------------------------------------------*/ Bool Read_Token_From_Atom_2(WamWord atom_word, WamWord token_word) { int stm; char *str; Bool ret; str = atom_tbl[Rd_Atom_Check(atom_word)].name; stm = Add_Str_Stream(str, TERM_STREAM_ATOM); ret = Read_Token_2(Make_Stream_Tagged_Word(stm), token_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * READ_TOKEN_FROM_CHARS_2 * * * *-------------------------------------------------------------------------*/ Bool Read_Token_From_Chars_2(WamWord chars_word, WamWord token_word) { int stm; Bool ret; stm = Add_Str_Stream(Rd_Chars_Check(chars_word), TERM_STREAM_CHARS); ret = Read_Token_2(Make_Stream_Tagged_Word(stm), token_word); Delete_Str_Stream(stm); return ret; } /*-------------------------------------------------------------------------* * READ_TOKEN_FROM_CODES_2 * * * *-------------------------------------------------------------------------*/ Bool Read_Token_From_Codes_2(WamWord codes_word, WamWord token_word) { int stm; Bool ret; stm = Add_Str_Stream(Rd_Codes_Check(codes_word), TERM_STREAM_CODES); ret = Read_Token_2(Make_Stream_Tagged_Word(stm), token_word); Delete_Str_Stream(stm); return ret; } ./gprolog-1.3.0/src/BipsPl/assert_c.c0000644004425400513100000002725710547154133015740 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : assert_c.c * * Descr.: dynamic predicate management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: assert_c.c,v 1.10 2007/01/04 10:35:07 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static DynCInf *last_clause; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static Bool Clause_Alt(DynCInf *clause, WamWord *w); static Bool Retract_Alt(DynCInf *clause, WamWord *w); /*-------------------------------------------------------------------------* * ASSERT_4 * * * *-------------------------------------------------------------------------*/ void Assert_4(WamWord head_word, WamWord body_word, WamWord asserta_word, WamWord check_perm_word) { Bool asserta = Rd_Integer(asserta_word); Bool check_perm = Rd_Integer(check_perm_word); last_clause = Add_Dynamic_Clause(head_word, body_word, asserta, check_perm); } /*-------------------------------------------------------------------------* * CLAUSE_3 * * * * for_what=0 for clause/2 (ie. error if not public) * * 2 for listing/1 (no check if public) * * listing/1 tests before that it is not a native_code pred.* *-------------------------------------------------------------------------*/ Bool Clause_3(WamWord head_word, WamWord body_word, WamWord for_what_word) { WamWord word, tag_mask; WamWord *first_arg_adr; WamWord head_word1, body_word1; int func, arity; int for_what; PredInf *pred; DynPInf *dyn; DynCInf *clause; WamWord w[2]; first_arg_adr = Rd_Callable_Check(head_word, &func, &arity); DEREF(body_word, word, tag_mask); body_word = word; if (tag_mask != TAG_REF_MASK && tag_mask != TAG_ATM_MASK && tag_mask != TAG_LST_MASK && tag_mask != TAG_STC_MASK) Pl_Err_Type(type_callable, body_word); for_what = Rd_Integer_Check(for_what_word); #ifdef DEBUG DBGPRINTF("clause/2: arity: %d", arity); if (arity > 0) { DBGPRINTF("\tfirst arg: "); Write_Simple(*first_arg_adr); } DBGPRINTF("\n"); #endif if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; if ((for_what == 0 && !(pred->prop & MASK_PRED_PUBLIC)) || (for_what == 2 && (pred->prop & MASK_PRED_NATIVE_CODE))) { word = Put_Structure(ATOM_CHAR('/'), 2); Unify_Atom(func); Unify_Integer(arity); Pl_Err_Permission(permission_operation_access, permission_type_private_procedure, word); } dyn = (DynPInf *) (pred->dyn); if (dyn == NULL) /* no dynamic info */ return FALSE; if (arity > 0) word = *first_arg_adr; w[0] = head_word; w[1] = body_word; clause = Scan_Dynamic_Pred(-1, 0, (DynPInf *) (pred->dyn), word, (ScanFct) Clause_Alt, DYN_ALT_FCT_FOR_TEST, 2, w); if (clause == NULL) return FALSE; Copy_Clause_To_Heap(clause, &head_word1, &body_word1); last_clause = clause; return Unify(head_word, head_word1) && Unify(body_word, body_word1); } /*-------------------------------------------------------------------------* * CLAUSE_ALT * * * *-------------------------------------------------------------------------*/ static Bool Clause_Alt(DynCInf *clause, WamWord *w) { WamWord head_word1, body_word1; Copy_Clause_To_Heap(clause, &head_word1, &body_word1); last_clause = clause; return Unify(head_word1, w[0]) && Unify(body_word1, w[1]); } /*-------------------------------------------------------------------------* * RETRACT_2 * * * *-------------------------------------------------------------------------*/ Bool Retract_2(WamWord head_word, WamWord body_word) { WamWord word, tag_mask; WamWord *first_arg_adr; WamWord head_word1, body_word1; int func, arity; PredInf *pred; DynPInf *dyn; DynCInf *clause; WamWord w[2]; first_arg_adr = Rd_Callable_Check(head_word, &func, &arity); DEREF(body_word, word, tag_mask); body_word = word; if (tag_mask != TAG_REF_MASK && tag_mask != TAG_ATM_MASK && tag_mask != TAG_LST_MASK && tag_mask != TAG_STC_MASK) Pl_Err_Type(type_callable, body_word); #ifdef DEBUG DBGPRINTF("retract/2: arity: %d", arity); if (arity > 0) { DBGPRINTF("\tfirst arg: "); Write_Simple(*first_arg_adr); } DBGPRINTF("\n"); #endif if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; if (!(pred->prop & MASK_PRED_DYNAMIC)) { word = Put_Structure(ATOM_CHAR('/'), 2); Unify_Atom(func); Unify_Integer(arity); Pl_Err_Permission(permission_operation_modify, permission_type_static_procedure, word); } dyn = (DynPInf *) (pred->dyn); if (dyn == NULL) /* no dynamic info */ return FALSE; if (arity > 0) word = *first_arg_adr; w[0] = head_word; w[1] = body_word; clause = Scan_Dynamic_Pred(-1, 0, (DynPInf *) (pred->dyn), word, (ScanFct) Retract_Alt, DYN_ALT_FCT_FOR_TEST, 2, w); if (clause == NULL) return FALSE; Copy_Clause_To_Heap(clause, &head_word1, &body_word1); if (!Unify(head_word, head_word1) || !Unify(body_word, body_word1)) return FALSE; Delete_Dynamic_Clause(clause); return TRUE; } /*-------------------------------------------------------------------------* * RETRACT_ALT * * * *-------------------------------------------------------------------------*/ static Bool Retract_Alt(DynCInf *clause, WamWord *w) { WamWord head_word1, body_word1; Copy_Clause_To_Heap(clause, &head_word1, &body_word1); if (!Unify(head_word1, w[0]) || !Unify(body_word1, w[1])) return FALSE; Delete_Dynamic_Clause(clause); return TRUE; } /*-------------------------------------------------------------------------* * RETRACT_LAST_FOUND_0 * * * *-------------------------------------------------------------------------*/ void Retract_Last_Found_0(void) { Delete_Dynamic_Clause(last_clause); } /*-------------------------------------------------------------------------* * SETARG_Of_LAST_FOUND_2 * * * * update in place the ArgNo th argument of last_clause. NewValue must be * * a 1-tagged word data (atom, integer). * *-------------------------------------------------------------------------*/ void Setarg_Of_Last_Found_2(WamWord arg_no_word, WamWord new_value_word) { WamWord word, tag_mask; WamWord *adr; int arg_no; arg_no = Rd_Integer(arg_no_word) - 1; DEREF(last_clause->head_word, word, tag_mask); adr = UnTag_Address(word); DEREF(new_value_word, word, tag_mask); Arg(adr, arg_no) = word; } /*-------------------------------------------------------------------------* * RETRACTALL_IF_EMPTY_HEAD_1 * * * *-------------------------------------------------------------------------*/ Bool Retractall_If_Empty_Head_1(WamWord head_word) { WamWord word, tag_mask; WamWord *adr; WamWord *arg_adr; int func, arity; PredInf *pred; WamWord *ref_adr[MAX_ARITY]; int i, j; Bool ret; arg_adr = Rd_Callable_Check(head_word, &func, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return TRUE; if (!(pred->prop & MASK_PRED_DYNAMIC)) { word = Put_Structure(ATOM_CHAR('/'), 2); Unify_Atom(func); Unify_Integer(arity); Pl_Err_Permission(permission_operation_modify, permission_type_static_procedure, word); } ret = TRUE; /* check if all args are singletons variables */ for (i = 0; i < arity; i++) { DEREF(*arg_adr, word, tag_mask); if (tag_mask != TAG_REF_MASK) { ret = FALSE; /* not a var */ break; } adr = UnTag_REF(word); ref_adr[i] = adr; *adr = Tag_INT(0); /* patch the argument to an INT */ arg_adr++; } j = i; for (i = 0; i < j; i++) /* restore the args */ { adr = ref_adr[i]; *adr = Make_Self_Ref(adr); } if (ret) Update_Dynamic_Pred(func, arity, 1); return ret; } /*-------------------------------------------------------------------------* * ABOLISH_1 * * * *-------------------------------------------------------------------------*/ void Abolish_1(WamWord pred_indic_word) { int func, arity; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); Update_Dynamic_Pred(func, arity, 3); } /*-------------------------------------------------------------------------* * REMOVE_PREDICATE_2 * * * *-------------------------------------------------------------------------*/ void Remove_Predicate_2(WamWord name_word, WamWord arity_word) { int func, arity; func = Rd_Atom_Check(name_word); arity = Rd_Integer_Check(arity_word); Update_Dynamic_Pred(func, arity, 2); } ./gprolog-1.3.0/src/BipsPl/term_inl.wam0000644004425400513100000000445010547440332016275 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : term_inl.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/term_inl.pl'). predicate('$use_term_inl'/0,29,static,private,built_in,[ proceed]). predicate(compare/3,32,static,private,built_in,[ call_c('Blt_Compare',[fast_call,boolean],[x(0),x(1),x(2)]), proceed]). predicate((==)/2,36,static,private,built_in,[ call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate((\==)/2,39,static,private,built_in,[ call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate((@<)/2,42,static,private,built_in,[ call_c('Blt_Term_Lt',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate((@=<)/2,45,static,private,built_in,[ call_c('Blt_Term_Lte',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate((@>)/2,48,static,private,built_in,[ call_c('Blt_Term_Gt',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate((@>=)/2,51,static,private,built_in,[ call_c('Blt_Term_Gte',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate(arg/3,57,static,private,built_in,[ call_c('Blt_Arg',[fast_call,boolean],[x(0),x(1),x(2)]), proceed]). predicate(functor/3,63,static,private,built_in,[ call_c('Blt_Functor',[fast_call,boolean],[x(0),x(1),x(2)]), proceed]). predicate((=..)/2,69,static,private,built_in,[ call_c('Blt_Univ',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate(copy_term/2,75,static,private,built_in,[ put_atom(copy_term,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Copy_Term_2',[boolean],[x(0),x(1)]), proceed]). predicate(setarg/3,82,static,private,built_in,[ put_atom(setarg,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), put_atom(true,3), call_c('Setarg_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). predicate(setarg/4,87,static,private,built_in,[ put_atom(setarg,4), put_integer(4,5), call_c('Set_Bip_Name_2',[],[x(4),x(5)]), call_c('Setarg_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). predicate(term_ref/2,94,static,private,built_in,[ put_atom(term_ref,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Term_Ref_2',[boolean],[x(0),x(1)]), proceed]). ./gprolog-1.3.0/src/BipsPl/call_args_c.c0000644004425400513100000001433010547154134016353 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : call_args_c.c * * Descr.: meta call management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: call_args_c.c,v 1.10 2007/01/04 10:35:08 diaz Exp $ */ #define OBJ_INIT Call_Args_Initializer #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static int atom_call_with_args; static int atom_call; /*---------------------------------* * Function Prototypes * *---------------------------------*/ #define CALL_INTERNAL X2463616C6C5F696E7465726E616C Prolog_Prototype(CALL_INTERNAL, 2); /*-------------------------------------------------------------------------* * CALL_ARGS_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Call_Args_Initializer(void) { atom_call_with_args = Create_Atom("call_with_args"); atom_call = Create_Atom("call"); } /*-------------------------------------------------------------------------* * CALL_CLOSURE * * * *-------------------------------------------------------------------------*/ static WamCont Call_Closure(int atom_bip, int arity_rest) { int call_info; int func, arity0, arity; WamWord *arg_adr; PredInf *pred; WamWord *w; int i; Set_C_Bip_Name(atom_tbl[atom_bip].name, 1 + arity_rest); if (atom_bip == atom_call_with_args) { func = Rd_Atom_Check(A(0)); arity0 = 0; } else { arg_adr = Rd_Callable_Check(A(0), &func, &arity0); } arity = arity0 + arity_rest; if (arity > MAX_ARITY) Pl_Err_Representation(representation_max_arity); call_info = Call_Info(func, arity, 1); if ((pred = Lookup_Pred(func, arity)) == NULL) { if (arity > 0) { w = H; A(0) = Tag_STC(w); *w++ = Functor_Arity(func, arity); while(arity0-- > 0) *w++ = *arg_adr++; for (i = 1; i <= arity_rest; i++) *w++ = A(i); H = w; } A(1) = Tag_INT(Call_Info(atom_bip, arity_rest + 1, 1)); return (CodePtr) Prolog_Predicate(CALL_INTERNAL, 2); } w = &A(0); while(arity0-- > 0) *w++ = *arg_adr++; for (i = 1; i <= arity_rest; i++) *w++ = A(i); if (pred->prop & MASK_PRED_NATIVE_CODE) /* native code */ return (WamCont) (pred->codep); return BC_Emulate_Pred(func, (DynPInf *) (pred->dyn)); } /*-------------------------------------------------------------------------* * CALL_WITH_ARGS_... * * * *-------------------------------------------------------------------------*/ WamCont Call_With_Args_1(void) { return Call_Closure(atom_call_with_args, 0); } WamCont Call_With_Args_2(void) { return Call_Closure(atom_call_with_args, 1); } WamCont Call_With_Args_3(void) { return Call_Closure(atom_call_with_args, 2); } WamCont Call_With_Args_4(void) { return Call_Closure(atom_call_with_args, 3); } WamCont Call_With_Args_5(void) { return Call_Closure(atom_call_with_args, 4); } WamCont Call_With_Args_6(void) { return Call_Closure(atom_call_with_args, 5); } WamCont Call_With_Args_7(void) { return Call_Closure(atom_call_with_args, 6); } WamCont Call_With_Args_8(void) { return Call_Closure(atom_call_with_args, 7); } WamCont Call_With_Args_9(void) { return Call_Closure(atom_call_with_args, 8); } WamCont Call_With_Args_10(void) { return Call_Closure(atom_call_with_args, 9); } WamCont Call_With_Args_11(void) { return Call_Closure(atom_call_with_args, 10); } WamCont Call_2(void) { return Call_Closure(atom_call, 1); } WamCont Call_3(void) { return Call_Closure(atom_call, 2); } WamCont Call_4(void) { return Call_Closure(atom_call, 3); } WamCont Call_5(void) { return Call_Closure(atom_call, 4); } WamCont Call_6(void) { return Call_Closure(atom_call, 5); } WamCont Call_7(void) { return Call_Closure(atom_call, 6); } WamCont Call_8(void) { return Call_Closure(atom_call, 7); } WamCont Call_9(void) { return Call_Closure(atom_call, 8); } WamCont Call_10(void) { return Call_Closure(atom_call, 9); } WamCont Call_11(void) { return Call_Closure(atom_call, 10); } ./gprolog-1.3.0/src/BipsPl/foreign.wam0000644004425400513100000000055610547440331016117 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : foreign.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/foreign.pl'). predicate('$force_foreign_link'/0,33,static,private,built_in,[ proceed]). predicate('$pl_query_recover_alt'/0,38,static,private,built_in,[ call_c('Pl_Query_Recover_Alt_0',[],[]), fail]). ./gprolog-1.3.0/src/BipsPl/arith_inl_c.c0000644004425400513100000004362510547154133016405 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : arith_inl_c.c * * Descr.: arithmetic (inline) management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: arith_inl_c.c,v 1.17 2007/01/04 10:35:07 diaz Exp $ */ #include #include #include #define OBJ_INIT Arith_Initializer #include "engine_pl.h" #include "bips_pl.h" #ifdef M_ix86_win32 #define rint(x) (floor((x) + (double) 0.5)) #endif /*---------------------------------* * Constants * *---------------------------------*/ #define START_ARITH_TBL_SIZE 64 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { WamWord f_n; WamWord (FC *fct) (); } ArithInf; /*---------------------------------* * Global Variables * *---------------------------------*/ static char *arith_tbl; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static WamWord Make_Tagged_Float(double d); static double To_Double(WamWord x); static WamWord Load_Math_Expression(WamWord exp); #define ADD_ARITH_OPER(atom_str, arity, f) \ arith_info.f_n = Functor_Arity(Create_Atom(atom_str), arity); \ arith_info.fct = f; \ Hash_Insert(arith_tbl, (char *) &arith_info, FALSE) /*-------------------------------------------------------------------------* * ARITH_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Arith_Initializer(void) { ArithInf arith_info; arith_tbl = Hash_Alloc_Table(START_ARITH_TBL_SIZE, sizeof(ArithInf)); ADD_ARITH_OPER("+", 1, Fct_Identity); ADD_ARITH_OPER("-", 1, Fct_Neg); ADD_ARITH_OPER("inc", 1, Fct_Inc); ADD_ARITH_OPER("dec", 1, Fct_Dec); ADD_ARITH_OPER("+", 2, Fct_Add); ADD_ARITH_OPER("-", 2, Fct_Sub); ADD_ARITH_OPER("*", 2, Fct_Mul); ADD_ARITH_OPER("//", 2, Fct_Div); ADD_ARITH_OPER("/", 2, Fct_Float_Div); ADD_ARITH_OPER("mod", 2, Fct_Mod); ADD_ARITH_OPER("/\\", 2, Fct_And); ADD_ARITH_OPER("\\/", 2, Fct_Or); ADD_ARITH_OPER("^", 2, Fct_Xor); ADD_ARITH_OPER("\\", 1, Fct_Not); ADD_ARITH_OPER("<<", 2, Fct_Shl); ADD_ARITH_OPER(">>", 2, Fct_Shr); ADD_ARITH_OPER("abs", 1, Fct_Abs); ADD_ARITH_OPER("sign", 1, Fct_Sign); ADD_ARITH_OPER("min", 2, Fct_Min); ADD_ARITH_OPER("max", 2, Fct_Max); ADD_ARITH_OPER("**", 2, Fct_Pow); ADD_ARITH_OPER("sqrt", 1, Fct_Sqrt); ADD_ARITH_OPER("atan", 1, Fct_Atan); ADD_ARITH_OPER("cos", 1, Fct_Cos); ADD_ARITH_OPER("acos", 1, Fct_Acos); ADD_ARITH_OPER("sin", 1, Fct_Sin); ADD_ARITH_OPER("asin", 1, Fct_Asin); ADD_ARITH_OPER("exp", 1, Fct_Exp); ADD_ARITH_OPER("log", 1, Fct_Log); ADD_ARITH_OPER("float", 1, Fct_Float); ADD_ARITH_OPER("ceiling", 1, Fct_Ceiling); ADD_ARITH_OPER("floor", 1, Fct_Floor); ADD_ARITH_OPER("round", 1, Fct_Round); ADD_ARITH_OPER("truncate", 1, Fct_Truncate); ADD_ARITH_OPER("float_fractional_part", 1, Fct_Float_Fract_Part); ADD_ARITH_OPER("float_integer_part", 1, Fct_Float_Integ_Part); ADD_ARITH_OPER("rem", 2, Fct_Rem); } /*-------------------------------------------------------------------------* * DEFINE_MATH_BIP_2 * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void Define_Math_Bip_2(WamWord func_word, WamWord arity_word) { char *cur_bip_func; int cur_bip_arity; cur_bip_func = Rd_String_Check(func_word); cur_bip_arity = Rd_Integer_Check(arity_word); Set_C_Bip_Name(cur_bip_func, cur_bip_arity); } /*-------------------------------------------------------------------------* * MATH_LOAD_VALUE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void FC Math_Load_Value(WamWord start_word, WamWord *word_adr) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); if (tag_mask != TAG_INT_MASK && tag_mask != TAG_FLT_MASK) word = Load_Math_Expression(word); *word_adr = word; } /*-------------------------------------------------------------------------* * MATH_FAST_LOAD_VALUE * * * * Called by compiled prolog code. * *-------------------------------------------------------------------------*/ void FC Math_Fast_Load_Value(WamWord start_word, WamWord *word_adr) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); *word_adr = word; } /*-------------------------------------------------------------------------* * MAKE_TAGGED_FLOAT * * * *-------------------------------------------------------------------------*/ static WamWord Make_Tagged_Float(double d) { WamWord x = Tag_FLT(H); Global_Push_Float(d); return x; } /*-------------------------------------------------------------------------* * TO_DOUBLE * * * *-------------------------------------------------------------------------*/ static double To_Double(WamWord x) { return (Tag_Is_INT(x)) ? (double) (UnTag_INT(x)) : Obtain_Float(UnTag_FLT(x)); } /*-------------------------------------------------------------------------* * LOAD_MATH_EXPRESSION * * * *-------------------------------------------------------------------------*/ static WamWord Load_Math_Expression(WamWord exp) { WamWord word, tag_mask; WamWord *adr; WamWord *lst_adr; ArithInf *arith; DEREF(exp, word, tag_mask); if (tag_mask == TAG_INT_MASK || tag_mask == TAG_FLT_MASK) return word; if (tag_mask == TAG_LST_MASK) { lst_adr = UnTag_LST(word); DEREF(Cdr(lst_adr), word, tag_mask); if (word != NIL_WORD) { word = Put_Structure(ATOM_CHAR('/'), 2); Unify_Atom(ATOM_CHAR('.')); Unify_Integer(2); Pl_Err_Type(type_evaluable, word); } return Load_Math_Expression(Car(lst_adr)); } if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(word); arith = (ArithInf *) Hash_Find(arith_tbl, Functor_And_Arity(adr)); if (arith == NULL) { word = Put_Structure(ATOM_CHAR('/'), 2); Unify_Atom(Functor(adr)); Unify_Integer(Arity(adr)); Pl_Err_Type(type_evaluable, word); } if (Arity(adr) == 1) return (*(arith->fct)) (Load_Math_Expression(Arg(adr, 0))); return (*(arith->fct)) (Load_Math_Expression(Arg(adr, 0)), Load_Math_Expression(Arg(adr, 1))); } if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask == TAG_ATM_MASK) { word = Put_Structure(ATOM_CHAR('/'), 2); Unify_Value(exp); Unify_Integer(0); /* then type_error */ } Pl_Err_Type(type_evaluable, word); return word; } /*-------------------------------------------------------------------------* * ARITH_EVAL_2 * * * *-------------------------------------------------------------------------*/ Bool Arith_Eval_2(WamWord exp_word, WamWord x_word) { return Unify(Load_Math_Expression(exp_word), x_word); } /* Mathematic Operations */ #define C_Neg(x) (- (x)) #define C_Add(x, y) ((x) + (y)) #define C_Sub(x, y) ((x) - (y)) #define C_Mul(x, y) ((x) * (y)) #define C_Div(x, y) ((y) != 0 ? (x) / (y) : (Pl_Err_Evaluation(evluation_zero_divisor), 0)) #define Identity(x) (x) #define DInc(x) ((x) + 1) #define DDec(x) ((x) - 1) #define DSign(x) ((x) < 0.0 ? -1.0 : (x) > 0.0 ? 1.0 : 0.0) #define DInteg(x) (((x) > 0) ? floor(x) : ceil(x)) #define DFract(x) ((x) - DInteg(x)) #define X_and_Y_are_INT(x, y) Tag_Is_INT(x & y) #define IFxIFtoIF(x, y, c_op, fast_op) \ return (X_and_Y_are_INT(x, y)) \ ? fast_op(x, y) \ : Make_Tagged_Float(c_op(To_Double(x), To_Double(y))) #define IFxIFtoF(x, y, c_op) \ return Make_Tagged_Float(c_op(To_Double(x), To_Double(y))) #define IxItoI(x, y, fast_op) \ if (Tag_Is_FLT(x)) /* error case */ \ Pl_Err_Type(type_integer, x); \ if (Tag_Is_FLT(y)) /* error case */ \ Pl_Err_Type(type_integer, y); \ return fast_op(x, y) #define IFtoIF(x, c_op, fast_op) \ return (Tag_Is_INT(x)) ? fast_op(x) : \ Make_Tagged_Float(c_op(To_Double(x))) #define ItoI(x, fast_op) \ if (Tag_Is_FLT(x)) /* error case */ \ Pl_Err_Type(type_integer, x); \ return fast_op(x) #define IFtoF(x, c_op) \ return Make_Tagged_Float(c_op(To_Double(x))) #define FtoI(x, c_op) \ double d; \ if (Tag_Is_INT(x)) /* error case */ \ Pl_Err_Type(type_float, x); \ else \ d = Obtain_Float(UnTag_FLT(x)); \ return Tag_INT((long) c_op(d)) #define FtoF(x, c_op) \ double d; \ if (Tag_Is_INT(x)) /* error case */ \ Pl_Err_Type(type_float, x); \ else \ d = Obtain_Float(UnTag_FLT(x)); \ return Make_Tagged_Float(c_op(d)) /* fast-math version */ WamWord FC Fct_Fast_Neg(WamWord x) { long vx = UnTag_INT(x); return Tag_INT(-vx); } WamWord FC Fct_Fast_Inc(WamWord x) { long vx = UnTag_INT(x); return Tag_INT(vx + 1); } WamWord FC Fct_Fast_Dec(WamWord x) { long vx = UnTag_INT(x); return Tag_INT(vx - 1); } WamWord FC Fct_Fast_Add(WamWord x, WamWord y) { long vx = UnTag_INT(x); long vy = UnTag_INT(y); return Tag_INT(vx + vy); } WamWord FC Fct_Fast_Sub(WamWord x, WamWord y) { long vx = UnTag_INT(x); long vy = UnTag_INT(y); return Tag_INT(vx - vy); } WamWord FC Fct_Fast_Mul(WamWord x, WamWord y) { long vx = UnTag_INT(x); long vy = UnTag_INT(y); return Tag_INT(vx * vy); } WamWord FC Fct_Fast_Div(WamWord x, WamWord y) { long vx = UnTag_INT(x); long vy = UnTag_INT(y); if (vy == 0) Pl_Err_Evaluation(evluation_zero_divisor); return Tag_INT(vx / vy); } WamWord FC Fct_Fast_Rem(WamWord x, WamWord y) { long vx = UnTag_INT(x); long vy = UnTag_INT(y); if (vy == 0) Pl_Err_Evaluation(evluation_zero_divisor); return Tag_INT(vx % vy); } WamWord FC Fct_Fast_Mod(WamWord x, WamWord y) { long vx = UnTag_INT(x); long vy = UnTag_INT(y); long m; if (vy == 0) Pl_Err_Evaluation(evluation_zero_divisor); m = vx % vy; if ((m ^ vy) < 0) /* have m and vy different signs ? */ m += vy; return Tag_INT(m); } WamWord FC Fct_Fast_And(WamWord x, WamWord y) { return x & y; } WamWord FC Fct_Fast_Or(WamWord x, WamWord y) { return x | y; } WamWord FC Fct_Fast_Xor(WamWord x, WamWord y) { return (x ^ y) | TAG_INT_MASK; } WamWord FC Fct_Fast_Not(WamWord x) { long vx = UnTag_INT(x); return Tag_INT(~vx); } WamWord FC Fct_Fast_Shl(WamWord x, WamWord y) { long vx = UnTag_INT(x); long vy = UnTag_INT(y); return Tag_INT(vx << vy); } WamWord FC Fct_Fast_Shr(WamWord x, WamWord y) { long vx = UnTag_INT(x); long vy = UnTag_INT(y); return Tag_INT(vx >> vy); } WamWord FC Fct_Fast_Abs(WamWord x) { long vx = UnTag_INT(x); return (vx < 0) ? Tag_INT(-vx) : x; } WamWord FC Fct_Fast_Sign(WamWord x) { long vx = UnTag_INT(x); return (vx < 0) ? Tag_INT(-1) : (vx == 0) ? Tag_INT(0) : Tag_INT(1); } /* standard version */ WamWord FC Fct_Neg(WamWord x) { IFtoIF(x, C_Neg, Fct_Fast_Neg); } WamWord FC Fct_Inc(WamWord x) { IFtoIF(x, DInc, Fct_Fast_Inc); } WamWord FC Fct_Dec(WamWord x) { IFtoIF(x, DDec, Fct_Fast_Dec); } WamWord FC Fct_Add(WamWord x, WamWord y) { IFxIFtoIF(x, y, C_Add, Fct_Fast_Add); } WamWord FC Fct_Sub(WamWord x, WamWord y) { IFxIFtoIF(x, y, C_Sub, Fct_Fast_Sub); } WamWord FC Fct_Mul(WamWord x, WamWord y) { IFxIFtoIF(x, y, C_Mul, Fct_Fast_Mul); } WamWord FC Fct_Div(WamWord x, WamWord y) { IxItoI(x, y, Fct_Fast_Div); } WamWord FC Fct_Float_Div(WamWord x, WamWord y) { IFxIFtoF(x, y, C_Div); } WamWord FC Fct_Rem(WamWord x, WamWord y) { IxItoI(x, y, Fct_Fast_Rem); } WamWord FC Fct_Mod(WamWord x, WamWord y) { IxItoI(x, y, Fct_Fast_Mod); } WamWord FC Fct_And(WamWord x, WamWord y) { IxItoI(x, y, Fct_Fast_And); } WamWord FC Fct_Or(WamWord x, WamWord y) { IxItoI(x, y, Fct_Fast_Or); } WamWord FC Fct_Xor(WamWord x, WamWord y) { IxItoI(x, y, Fct_Fast_Xor); } WamWord FC Fct_Not(WamWord x) { ItoI(x, Fct_Fast_Not); } WamWord FC Fct_Shl(WamWord x, WamWord y) { IxItoI(x, y, Fct_Fast_Shl); } WamWord FC Fct_Shr(WamWord x, WamWord y) { IxItoI(x, y, Fct_Fast_Shr); } WamWord FC Fct_Abs(WamWord x) { IFtoIF(x, fabs, Fct_Fast_Abs); } WamWord FC Fct_Sign(WamWord x) { IFtoIF(x, DSign, Fct_Fast_Sign); } WamWord FC Fct_Min(WamWord x, WamWord y) { double dx = To_Double(x); double dy = To_Double(y); if (dx < dy) return x; if (dx > dy) return y; return Tag_Is_INT(x) ? x : y; } WamWord FC Fct_Max(WamWord x, WamWord y) { double dx = To_Double(x); double dy = To_Double(y); if (dx > dy) return x; if (dx < dy) return y; return Tag_Is_INT(x) ? x : y; } WamWord FC Fct_Pow(WamWord x, WamWord y) { IFxIFtoF(x, y, pow); } WamWord FC Fct_Sqrt(WamWord x) { IFtoF(x, sqrt); } WamWord FC Fct_Atan(WamWord x) { IFtoF(x, atan); } WamWord FC Fct_Cos(WamWord x) { IFtoF(x, cos); } WamWord FC Fct_Acos(WamWord x) { IFtoF(x, acos); } WamWord FC Fct_Sin(WamWord x) { IFtoF(x, sin); } WamWord FC Fct_Asin(WamWord x) { IFtoF(x, asin); } WamWord FC Fct_Exp(WamWord x) { IFtoF(x, exp); } WamWord FC Fct_Log(WamWord x) { IFtoF(x, log); } WamWord FC Fct_Float(WamWord x) { IFtoF(x, Identity); } WamWord FC Fct_Ceiling(WamWord x) { FtoI(x, ceil); } WamWord FC Fct_Floor(WamWord x) { FtoI(x, floor); } WamWord FC Fct_Round(WamWord x) { FtoI(x, rint); } WamWord FC Fct_Truncate(WamWord x) { FtoI(x, Identity); } WamWord FC Fct_Float_Fract_Part(WamWord x) { FtoF(x, DFract); } WamWord FC Fct_Float_Integ_Part(WamWord x) { FtoF(x, DInteg); } WamWord FC Fct_Identity(WamWord x) { return x; } /* for meta-call */ /* Mathematic Comparisons */ #define Cmp_IFxIF(x, y, c_op, fast_op) \ return (X_and_Y_are_INT(x, y)) \ ? fast_op(x, y) \ : (To_Double(x) c_op To_Double(y)) /* fast-math version */ Bool FC Blt_Fast_Eq(WamWord x, WamWord y) { return x == y; } Bool FC Blt_Fast_Neq(WamWord x, WamWord y) { return x != y; } Bool FC Blt_Fast_Lt(WamWord x, WamWord y) { long vx = UnTag_INT(x); long vy = UnTag_INT(y); return vx < vy; } Bool FC Blt_Fast_Lte(WamWord x, WamWord y) { long vx = UnTag_INT(x); long vy = UnTag_INT(y); return vx <= vy; } Bool FC Blt_Fast_Gt(WamWord x, WamWord y) { long vx = UnTag_INT(x); long vy = UnTag_INT(y); return vx > vy; } Bool FC Blt_Fast_Gte(WamWord x, WamWord y) { long vx = UnTag_INT(x); long vy = UnTag_INT(y); return vx >= vy; } /* standard version */ Bool FC Blt_Eq(WamWord x, WamWord y) { Cmp_IFxIF(x, y, ==, Blt_Fast_Eq); } Bool FC Blt_Neq(WamWord x, WamWord y) { Cmp_IFxIF(x, y, !=, Blt_Fast_Neq); } Bool FC Blt_Lt(WamWord x, WamWord y) { Cmp_IFxIF(x, y, <, Blt_Fast_Lt); } Bool FC Blt_Lte(WamWord x, WamWord y) { Cmp_IFxIF(x, y, <=, Blt_Fast_Lte); } Bool FC Blt_Gt(WamWord x, WamWord y) { Cmp_IFxIF(x, y, >, Blt_Fast_Gt); } Bool FC Blt_Gte(WamWord x, WamWord y) { Cmp_IFxIF(x, y, >=, Blt_Fast_Gte); } ./gprolog-1.3.0/src/BipsPl/type_inl_c.c0000644004425400513100000001370510547154140016251 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : type_inl_c.c * * Descr.: type testing (inline) management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: type_inl_c.c,v 1.12 2007/01/04 10:35:12 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /* Type tests */ #define Tag_Is_Var(t) (t == TAG_REF_MASK) #define Tag_Is_Nonvar(t) (!Tag_Is_Var(t)) #define Tag_Is_Atom(t) (t == TAG_ATM_MASK) #define Tag_Is_Integer(t) (t == TAG_INT_MASK) #define Tag_Is_Float(t) (t == TAG_FLT_MASK) #define Tag_Is_Number(t) (Tag_Is_Integer(t) || Tag_Is_Float(t)) #define Tag_Is_Atomic(t) (Tag_Is_Atom(t) || Tag_Is_Number(t)) #define Tag_Is_Compound(t) (t == TAG_STC_MASK || t == TAG_LST_MASK) #define Tag_Is_Callable(t) (Tag_Is_Atom(t) || Tag_Is_Compound(t)) #ifndef NO_USE_FD_SOLVER #define Tag_Is_Fd_Var(t) (t == TAG_FDV_MASK) #else #define Tag_Is_Fd_Var(t) (FALSE) #endif #define Tag_Is_Non_Fd_Var(t) (!Tag_Is_Fd_Var(t)) #define Tag_Is_Generic_Var(t) (Tag_Is_Var(t) || Tag_Is_Fd_Var(t)) #define Tag_Is_Non_Generic_Var(t) (!Tag_Is_Generic_Var(t)) #define Type_Test(test, x) \ WamWord word, tag_mask; \ DEREF(x, word, tag_mask); \ return test(tag_mask) Bool FC Blt_Var(WamWord x) { Type_Test(Tag_Is_Var, x); } Bool FC Blt_Non_Var(WamWord x) { Type_Test(Tag_Is_Nonvar, x); } Bool FC Blt_Atom(WamWord x) { Type_Test(Tag_Is_Atom, x); } Bool FC Blt_Integer(WamWord x) { Type_Test(Tag_Is_Integer, x); } Bool FC Blt_Float(WamWord x) { Type_Test(Tag_Is_Float, x); } Bool FC Blt_Number(WamWord x) { Type_Test(Tag_Is_Number, x); } Bool FC Blt_Atomic(WamWord x) { Type_Test(Tag_Is_Atomic, x); } Bool FC Blt_Compound(WamWord x) { Type_Test(Tag_Is_Compound, x); } Bool FC Blt_Callable(WamWord x) { Type_Test(Tag_Is_Callable, x); } Bool FC Blt_Fd_Var(WamWord x) { Type_Test(Tag_Is_Fd_Var, x); } Bool FC Blt_Non_Fd_Var(WamWord x) { Type_Test(Tag_Is_Non_Fd_Var, x); } Bool FC Blt_Generic_Var(WamWord x) { Type_Test(Tag_Is_Generic_Var, x); } Bool FC Blt_Non_Generic_Var(WamWord x) { Type_Test(Tag_Is_Non_Generic_Var, x); } /*-------------------------------------------------------------------------* * BLT_LIST * * * *-------------------------------------------------------------------------*/ Bool FC Blt_List(WamWord start_word) { WamWord word, tag_mask; for (;;) { DEREF(start_word, word, tag_mask); if (word == NIL_WORD) return TRUE; if (tag_mask != TAG_LST_MASK) return FALSE; start_word = Cdr(UnTag_LST(word)); } } /*-------------------------------------------------------------------------* * BLT_PARTIAL_LIST * * * *-------------------------------------------------------------------------*/ Bool FC Blt_Partial_List(WamWord start_word) { WamWord word, tag_mask; for (;;) { DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) return TRUE; if (tag_mask != TAG_LST_MASK) return FALSE; start_word = Cdr(UnTag_LST(word)); } } /*-------------------------------------------------------------------------* * BLT_LIST_OR_PARTIAL_LIST * * * *-------------------------------------------------------------------------*/ Bool FC Blt_List_Or_Partial_List(WamWord start_word) { WamWord word, tag_mask; for (;;) { DEREF(start_word, word, tag_mask); if (tag_mask == TAG_REF_MASK || word == NIL_WORD) return TRUE; if (tag_mask != TAG_LST_MASK) return FALSE; start_word = Cdr(UnTag_LST(word)); } } ./gprolog-1.3.0/src/BipsPl/error_supp.c0000644004425400513100000005257310547154135016336 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : error_supp.c * * Descr.: Prolog errors support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: error_supp.c,v 1.14 2007/01/04 10:35:09 diaz Exp $ */ #include #include #define OBJ_INIT Error_Supp_Initializer #define ERROR_SUPP_FILE #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static int cur_bip_func; static int cur_bip_arity; static char *c_bip_func_str; static int c_bip_arity; static char *last_err_file = NULL; static int last_err_line; static int last_err_col; static char *last_err_msg; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Update_Cur_From_C_Bip(void); static char *Context_Error_String(void); #define PL_ERR_INSTANTIATION X24706C5F6572725F696E7374616E74696174696F6E #define PL_ERR_TYPE X24706C5F6572725F74797065 #define PL_ERR_DOMAIN X24706C5F6572725F646F6D61696E #define PL_ERR_EXISTENCE X24706C5F6572725F6578697374656E6365 #define PL_ERR_PERMISSION X24706C5F6572725F7065726D697373696F6E #define PL_ERR_REPRESENTATION X24706C5F6572725F726570726573656E746174696F6E #define PL_ERR_EVALUATION X24706C5F6572725F6576616C756174696F6E #define PL_ERR_RESOURCE X24706C5F6572725F7265736F75726365 #define PL_ERR_SYNTAX X24706C5F6572725F73796E746178 #define PL_ERR_SYSTEM X24706C5F6572725F73797374656D Prolog_Prototype(PL_ERR_INSTANTIATION, 0); Prolog_Prototype(PL_ERR_TYPE, 2); Prolog_Prototype(PL_ERR_DOMAIN, 2); Prolog_Prototype(PL_ERR_EXISTENCE, 2); Prolog_Prototype(PL_ERR_PERMISSION, 3); Prolog_Prototype(PL_ERR_REPRESENTATION, 1); Prolog_Prototype(PL_ERR_EVALUATION, 1); Prolog_Prototype(PL_ERR_RESOURCE, 1); Prolog_Prototype(PL_ERR_SYNTAX, 1); Prolog_Prototype(PL_ERR_SYSTEM, 1); /*-------------------------------------------------------------------------* * ERROR_SUPP_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Error_Supp_Initializer(void) { type_atom = Create_Atom("atom"); type_atomic = Create_Atom("atomic"); type_byte = Create_Atom("byte"); type_callable = Create_Atom("callable"); type_character = Create_Atom("character"); type_compound = Create_Atom("compound"); type_evaluable = Create_Atom("evaluable"); type_float = Create_Atom("float"); /* for arithmetic */ type_boolean = Create_Atom("boolean"); /* for setarg/4 */ type_in_byte = Create_Atom("in_byte"); type_in_character = Create_Atom("in_character"); type_integer = Create_Atom("integer"); type_list = Create_Atom("list"); type_number = Create_Atom("number"); type_predicate_indicator = Create_Atom("predicate_indicator"); type_variable = Create_Atom("variable"); if (fd_init_solver) /* FD solver linked */ { type_fd_variable = Create_Atom("fd_variable"); /* for FD */ type_fd_evaluable = Create_Atom("fd_evaluable"); /* for FD */ type_fd_bool_evaluable = Create_Atom("fd_bool_evaluable"); /* for FD */ } domain_character_code_list = Create_Atom("character_code_list"); domain_close_option = Create_Atom("close_option"); domain_flag_value = Create_Atom("flag_value"); domain_io_mode = Create_Atom("io_mode"); domain_non_empty_list = Create_Atom("non_empty_list"); domain_not_less_than_zero = Create_Atom("not_less_than_zero"); domain_operator_priority = Create_Atom("operator_priority"); domain_operator_specifier = Create_Atom("operator_specifier"); domain_prolog_flag = Create_Atom("prolog_flag"); domain_read_option = Create_Atom("read_option"); domain_source_sink = Create_Atom("source_sink"); domain_stream = Create_Atom("stream"); domain_stream_option = Create_Atom("stream_option"); domain_stream_or_alias = Create_Atom("stream_or_alias"); domain_stream_position = Create_Atom("stream_position"); domain_stream_property = Create_Atom("stream_property"); domain_write_option = Create_Atom("write_option"); domain_term_stream_or_alias = Create_Atom("term_stream_or_alias"); /* for term_streams */ domain_g_array_index = Create_Atom("g_array_index");/* for g_vars */ domain_g_argument_selector = Create_Atom("g_argument_selector"); /* for g_vars */ domain_stream_seek_method = Create_Atom("stream_seek_method"); /* for seek/4 */ domain_format_control_sequence = Create_Atom("format_control_sequence"); /* for format/2-3 */ domain_os_path = Create_Atom("os_path");/* for absolute_file_name/2 */ domain_os_file_permission = Create_Atom("os_file_permission"); /* for file_permission/2 */ domain_date_time = Create_Atom("date_time");/* for os_interf */ domain_selectable_item = Create_Atom("selectable_item"); /* for select_read/3 */ #ifndef NO_USE_SOCKETS domain_socket_domain = Create_Atom("socket_domain"); /* for sockets */ domain_socket_address = Create_Atom("socket_address"); /* for sockets */ #endif existence_procedure = Create_Atom("procedure"); existence_source_sink = Create_Atom("source_sink"); existence_stream = Create_Atom("stream"); existence_sr_descriptor = Create_Atom("sr_descriptor"); /* for source reader */ permission_operation_access = Create_Atom("access"); permission_operation_close = Create_Atom("close"); permission_operation_create = Create_Atom("create"); permission_operation_input = Create_Atom("input"); permission_operation_modify = Create_Atom("modify"); permission_operation_open = Create_Atom("open"); permission_operation_output = Create_Atom("output"); permission_operation_reposition = Create_Atom("reposition"); permission_type_binary_stream = Create_Atom("binary_stream"); permission_type_flag = Create_Atom("flag"); permission_type_operator = Create_Atom("operator"); permission_type_past_end_of_stream = Create_Atom("past_end_of_stream"); permission_type_private_procedure = Create_Atom("private_procedure"); permission_type_static_procedure = Create_Atom("static_procedure"); permission_type_source_sink = Create_Atom("source_sink"); permission_type_stream = Create_Atom("stream"); permission_type_text_stream = Create_Atom("text_stream"); representation_character = Create_Atom("character"); representation_character_code = Create_Atom("character_code"); representation_in_character_code = Create_Atom("in_character_code"); representation_max_arity = Create_Atom("max_arity"); representation_max_integer = Create_Atom("max_integer"); representation_min_integer = Create_Atom("min_integer"); representation_too_many_variables = Create_Atom("too_many_variables"); /* for Copy_Term(),... */ evluation_float_overflow = Create_Atom("float_overflow"); evluation_int_overflow = Create_Atom("int_overflow"); evluation_undefined = Create_Atom("undefined"); evluation_underflow = Create_Atom("underflow"); evluation_zero_divisor = Create_Atom("zero_divisor"); resource_print_object_not_linked = Create_Atom("print_object_not_linked"); /* for print and format */ if (fd_init_solver) /* FD solver linked */ { resource_too_big_fd_constraint = Create_Atom("too_big_fd_constraint"); /* for FD */ } } /*-------------------------------------------------------------------------* * SET_BIP_NAME_2 * * * *-------------------------------------------------------------------------*/ void Set_Bip_Name_2(WamWord func_word, WamWord arity_word) { Set_C_Bip_Name("set_bip_name", 2); cur_bip_func = Rd_Atom_Check(func_word); cur_bip_arity = Rd_Integer_Check(arity_word); Unset_C_Bip_Name(); c_bip_func_str = NULL; } /*-------------------------------------------------------------------------* * CURRENT_BIP_NAME_2 * * * *-------------------------------------------------------------------------*/ Bool Current_Bip_Name_2(WamWord func_word, WamWord arity_word) { Bool res; Set_C_Bip_Name("current_bip_name", 2); res = Un_Atom_Check(cur_bip_func, func_word) && Un_Integer_Check(cur_bip_arity, arity_word); Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * SET_C_BIP_NAME * * * *-------------------------------------------------------------------------*/ void FC Set_C_Bip_Name(char *func_str, int arity) { c_bip_func_str = func_str; c_bip_arity = arity; } /*-------------------------------------------------------------------------* * UNSET_C_BIP_NAME * * * *-------------------------------------------------------------------------*/ void Unset_C_Bip_Name(void) { c_bip_func_str = NULL; } /*-------------------------------------------------------------------------* * GET_CURRENT_BIP * * * * returns func and initializes arity of the current bip. * *-------------------------------------------------------------------------*/ int Get_Current_Bip(int *arity) { Update_Cur_From_C_Bip(); *arity = cur_bip_arity; return cur_bip_func; } /*-------------------------------------------------------------------------* * UPDATE_CUR_FROM_C_BIP * * * *-------------------------------------------------------------------------*/ static void Update_Cur_From_C_Bip(void) { if (c_bip_func_str) { cur_bip_func = Create_Allocate_Atom(c_bip_func_str); cur_bip_arity = c_bip_arity; } } /*-------------------------------------------------------------------------* * CONTEXT_ERROR_1 * * * *-------------------------------------------------------------------------*/ void Context_Error_1(WamWord err_word) { if (cur_bip_arity >= 0) { Get_Structure(ATOM_CHAR('/'), 2, err_word); Unify_Atom(cur_bip_func); Unify_Integer(cur_bip_arity); } else Get_Atom(cur_bip_func, err_word); } /*-------------------------------------------------------------------------* * CONTEXT_ERROR_STRING * * * *-------------------------------------------------------------------------*/ static char * Context_Error_String(void) { static char buff[256]; sprintf(buff, "%s", atom_tbl[cur_bip_func].name); if (cur_bip_arity >= 0) sprintf(buff + strlen(buff), "/%d", cur_bip_arity); return buff; } /*-------------------------------------------------------------------------* * SET_LAST_SYNTAX_ERROR * * * *-------------------------------------------------------------------------*/ void Set_Last_Syntax_Error(char *file_name, int err_line, int err_col, char *err_msg) { last_err_file = file_name; last_err_line = err_line; last_err_col = err_col; last_err_msg = err_msg; } /*-------------------------------------------------------------------------* * SYNTAX_ERROR_INFO_4 * * * *-------------------------------------------------------------------------*/ Bool Syntax_Error_Info_4(WamWord file_name_word, WamWord line_word, WamWord char_word, WamWord msg_word) { Check_For_Un_Atom(file_name_word); Check_For_Un_Integer(line_word); Check_For_Un_Integer(char_word); Check_For_Un_Atom(msg_word); return last_err_file && Un_String(last_err_file, file_name_word) && Un_Integer(last_err_line, line_word) && Un_Integer(last_err_col, char_word) && Un_String(last_err_msg, msg_word); } /*-------------------------------------------------------------------------* * SYNTAX_ERROR * * * *-------------------------------------------------------------------------*/ void Syntax_Error(int flag_value) { char str[512]; if (last_err_file == NULL || *last_err_file == '\0') sprintf(str, "(char:%d) %s", last_err_col, last_err_msg); else sprintf(str, "%s:%d (char:%d) %s", last_err_file, last_err_line, last_err_col, last_err_msg); if (flag_value == FLAG_VALUE_ERROR) Pl_Err_Syntax(Create_Allocate_Atom(str)); Update_Cur_From_C_Bip(); if (flag_value == FLAG_VALUE_WARNING) Stream_Printf(stm_tbl[stm_top_level_output], "warning: syntax error: %s (from %s)\n", str, Context_Error_String()); } /*-------------------------------------------------------------------------* * UNKNOWN_PRED_ERROR * * * *-------------------------------------------------------------------------*/ void Unknown_Pred_Error(int func, int arity) { WamWord term; if (Flag_Value(FLAG_UNKNOWN) == FLAG_VALUE_ERROR) { term = Put_Structure(ATOM_CHAR('/'), 2); Unify_Atom(func); Unify_Integer(arity); Pl_Err_Existence(existence_procedure, term); } Update_Cur_From_C_Bip(); if (Flag_Value(FLAG_UNKNOWN) == FLAG_VALUE_WARNING) Stream_Printf(stm_tbl[stm_top_level_output], "warning: unknown procedure %s/%d (from %s)\n", atom_tbl[func].name, arity, Context_Error_String()); } /*-------------------------------------------------------------------------* * OS_ERROR * * * *-------------------------------------------------------------------------*/ void Os_Error(void) { char *err_str = M_Sys_Err_String(errno); if (Flag_Value(FLAG_OS_ERROR) == FLAG_VALUE_ERROR) Pl_Err_System(Create_Allocate_Atom(err_str)); Update_Cur_From_C_Bip(); if (Flag_Value(FLAG_OS_ERROR) == FLAG_VALUE_WARNING) Stream_Printf(stm_tbl[stm_top_level_output], "warning: OS error: %s (from %s)\n", err_str, Context_Error_String()); } /*-------------------------------------------------------------------------* * PL_ERR_INSTANTIATION * * * *-------------------------------------------------------------------------*/ void Pl_Err_Instantiation(void) { Update_Cur_From_C_Bip(); Execute_A_Continuation(Prolog_Predicate(PL_ERR_INSTANTIATION, 0)); } /*-------------------------------------------------------------------------* * PL_ERR_TYPE * * * *-------------------------------------------------------------------------*/ void Pl_Err_Type(int atom_type, WamWord term) { Update_Cur_From_C_Bip(); A(0) = Tag_ATM(atom_type); A(1) = term; Execute_A_Continuation(Prolog_Predicate(PL_ERR_TYPE, 2)); } /*-------------------------------------------------------------------------* * PL_ERR_DOMAIN * * * *-------------------------------------------------------------------------*/ void Pl_Err_Domain(int atom_domain, WamWord term) { Update_Cur_From_C_Bip(); A(0) = Tag_ATM(atom_domain); A(1) = term; Execute_A_Continuation(Prolog_Predicate(PL_ERR_DOMAIN, 2)); } /*-------------------------------------------------------------------------* * PL_ERR_EXISTENCE * * * *-------------------------------------------------------------------------*/ void Pl_Err_Existence(int atom_object, WamWord term) { Update_Cur_From_C_Bip(); A(0) = Tag_ATM(atom_object); A(1) = term; Execute_A_Continuation(Prolog_Predicate(PL_ERR_EXISTENCE, 2)); } /*-------------------------------------------------------------------------* * PL_ERR_PERMISSION * * * *-------------------------------------------------------------------------*/ void Pl_Err_Permission(int atom_oper, int atom_perm, WamWord term) { Update_Cur_From_C_Bip(); A(0) = Tag_ATM(atom_oper); A(1) = Tag_ATM(atom_perm); A(2) = term; Execute_A_Continuation(Prolog_Predicate(PL_ERR_PERMISSION, 3)); } /*-------------------------------------------------------------------------* * PL_ERR_REPRESENTATION * * * *-------------------------------------------------------------------------*/ void Pl_Err_Representation(int atom_flag) { Update_Cur_From_C_Bip(); A(0) = Tag_ATM(atom_flag); Execute_A_Continuation(Prolog_Predicate(PL_ERR_REPRESENTATION, 1)); } /*-------------------------------------------------------------------------* * PL_ERR_EVALUATION * * * *-------------------------------------------------------------------------*/ void Pl_Err_Evaluation(int atom_error) { Update_Cur_From_C_Bip(); A(0) = Tag_ATM(atom_error); Execute_A_Continuation(Prolog_Predicate(PL_ERR_EVALUATION, 1)); } /*-------------------------------------------------------------------------* * PL_ERR_RESOURCE * * * *-------------------------------------------------------------------------*/ void Pl_Err_Resource(int atom_resource) { Update_Cur_From_C_Bip(); A(0) = Tag_ATM(atom_resource); Execute_A_Continuation(Prolog_Predicate(PL_ERR_RESOURCE, 1)); } /*-------------------------------------------------------------------------* * PL_ERR_SYNTAX * * * *-------------------------------------------------------------------------*/ void Pl_Err_Syntax(int atom_error) { Update_Cur_From_C_Bip(); A(0) = Tag_ATM(atom_error); Execute_A_Continuation(Prolog_Predicate(PL_ERR_SYNTAX, 1)); } /*-------------------------------------------------------------------------* * PL_ERR_SYSTEM * * * *-------------------------------------------------------------------------*/ void Pl_Err_System(int atom_error) { Update_Cur_From_C_Bip(); A(0) = Tag_ATM(atom_error); Execute_A_Continuation(Prolog_Predicate(PL_ERR_SYSTEM, 1)); } ./gprolog-1.3.0/src/BipsPl/const_io.pl0000644004425400513100000001434610547162351016137 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : const_io.pl * * Descr.: input/output from/to constant term management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: const_io.pl,v 1.11 2007/01/04 10:35:08 diaz Exp $ */ :- built_in. '$use_const_io'. write_to_atom(Atom, Term) :- set_bip_name(write_to_atom, 2), '$call_c_test'('Write_To_Atom_2'(Atom, Term)). write_to_chars(Chars, Term) :- set_bip_name(write_to_chars, 2), '$call_c_test'('Write_To_Chars_2'(Chars, Term)). write_to_codes(Codes, Term) :- set_bip_name(write_to_codes, 2), '$call_c_test'('Write_To_Codes_2'(Codes, Term)). writeq_to_atom(Atom, Term) :- set_bip_name(writeq_to_atom, 2), '$call_c_test'('Writeq_To_Atom_2'(Atom, Term)). writeq_to_chars(Chars, Term) :- set_bip_name(writeq_to_chars, 2), '$call_c_test'('Writeq_To_Chars_2'(Chars, Term)). writeq_to_codes(Codes, Term) :- set_bip_name(writeq_to_codes, 2), '$call_c_test'('Writeq_To_Codes_2'(Codes, Term)). write_canonical_to_atom(Atom, Term) :- set_bip_name(write_canonical_to_atom, 2), '$call_c_test'('Write_Canonical_To_Atom_2'(Atom, Term)). write_canonical_to_chars(Chars, Term) :- set_bip_name(write_canonical_to_chars, 2), '$call_c_test'('Write_Canonical_To_Chars_2'(Chars, Term)). write_canonical_to_codes(Codes, Term) :- set_bip_name(write_canonical_to_codes, 2), '$call_c_test'('Write_Canonical_To_Codes_2'(Codes, Term)). display_to_atom(Atom, Term) :- set_bip_name(display_to_atom, 2), '$call_c_test'('Display_To_Atom_2'(Atom, Term)). display_to_chars(Chars, Term) :- set_bip_name(display_to_chars, 2), '$call_c_test'('Display_To_Chars_2'(Chars, Term)). display_to_codes(Codes, Term) :- set_bip_name(display_to_codes, 2), '$call_c_test'('Display_To_Codes_2'(Codes, Term)). print_to_atom(Atom, Term) :- set_bip_name(print_to_atom, 2), '$call_c_test'('Print_To_Atom_2'(Atom, Term)). print_to_chars(Chars, Term) :- set_bip_name(print_to_chars, 2), '$call_c_test'('Print_To_Chars_2'(Chars, Term)). print_to_codes(Codes, Term) :- set_bip_name(print_to_codes, 2), '$call_c_test'('Print_To_Codes_2'(Codes, Term)). write_term_to_atom(Atom, Term, Options) :- set_bip_name(write_term_to_atom, 3), '$set_write_defaults', '$get_write_options'(Options), '$call_c'('Write_Term_To_Atom_2'(Atom, Term)). write_term_to_chars(Chars, Term, Options) :- set_bip_name(write_term_to_chars, 3), '$set_write_defaults', '$get_write_options'(Options), '$call_c'('Write_Term_To_Chars_2'(Chars, Term)). write_term_to_codes(Codes, Term, Options) :- set_bip_name(write_term_to_codes, 3), '$set_write_defaults', '$get_write_options'(Options), '$call_c'('Write_Term_To_Codes_2'(Codes, Term)). format_to_atom(Atom, Format, Args) :- set_bip_name(format_to_atom, 3), '$call_c_test'('Format_To_Atom_3'(Atom, Format, Args)). format_to_chars(Chars, Format, Args) :- set_bip_name(format_to_chars, 3), '$call_c_test'('Format_To_Chars_3'(Chars, Format, Args)). format_to_codes(Codes, Format, Args) :- set_bip_name(format_to_codes, 3), '$call_c_test'('Format_To_Codes_3'(Codes, Format, Args)). read_from_atom(Atom, Term) :- set_bip_name(read_from_atom, 2), '$set_read_defaults', '$call_c_test'('Read_From_Atom_2'(Atom, Term)). read_from_chars(Chars, Term) :- set_bip_name(read_from_chars, 2), '$set_read_defaults', '$call_c_test'('Read_From_Chars_2'(Chars, Term)). read_from_codes(Codes, Term) :- set_bip_name(read_from_codes, 2), '$set_read_defaults', '$call_c_test'('Read_From_Codes_2'(Codes, Term)). read_term_from_atom(Atom, Term, Options) :- set_bip_name(read_term_from_atom, 3), '$set_read_defaults', '$get_read_options'(Options, Vars, VarNames, SinglNames), '$call_c_test'('Read_Term_From_Atom_5'(Atom, Term, Vars, VarNames, SinglNames)). read_term_from_chars(Chars, Term, Options) :- set_bip_name(read_term_from_chars, 3), '$set_read_defaults', '$get_read_options'(Options, Vars, VarNames, SinglNames), '$call_c_test'('Read_Term_From_Chars_5'(Chars, Term, Vars, VarNames, SinglNames)). read_term_from_codes(Codes, Term, Options) :- set_bip_name(read_term_from_codes, 3), '$set_read_defaults', '$get_read_options'(Options, Vars, VarNames, SinglNames), '$call_c_test'('Read_Term_From_Codes_5'(Codes, Term, Vars, VarNames, SinglNames)). read_token_from_atom(Atom, Token) :- set_bip_name(read_token_from_atom, 2), '$set_read_defaults', '$call_c_test'('Read_Token_From_Atom_2'(Atom, Token)). read_token_from_chars(Chars, Token) :- set_bip_name(read_token_from_chars, 2), '$set_read_defaults', '$call_c_test'('Read_Token_From_Chars_2'(Chars, Token)). read_token_from_codes(Codes, Token) :- set_bip_name(read_token_from_codes, 2), '$set_read_defaults', '$call_c_test'('Read_Token_From_Codes_2'(Codes, Token)). ./gprolog-1.3.0/src/BipsPl/oper.pl0000644004425400513100000000465710547162353015275 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : oper.pl * * Descr.: operator management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: oper.pl,v 1.11 2007/01/04 10:35:10 diaz Exp $ */ :- built_in. '$use_oper'. op(Prec, Specif, Oper) :- set_bip_name(op, 3), '$check_atom_or_atom_list'(Oper), ( atom(Oper) -> '$op2'(Prec, Specif, Oper) ; '$op1'(Oper, Specif, Prec) ). '$op1'([], _, _). '$op1'([Oper|LOper], Specif, Prec) :- '$op2'(Prec, Specif, Oper), '$op1'(LOper, Specif, Prec). '$op2'(Prec, Specif, Oper) :- '$call_c'('Op_3'(Prec, Specif, Oper)). current_op(Prec, Specif, Oper) :- set_bip_name(current_op, 3), '$call_c_test'('Current_Op_3'(Prec, Specif, Oper)). '$current_op_alt' :- % used by C code to create a choice-point '$call_c_test'('Current_Op_Alt_0'). ./gprolog-1.3.0/src/BipsPl/stream.pl0000644004425400513100000003705510547162353015621 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : stream.pl * * Descr.: stream selection and control management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: stream.pl,v 1.14 2007/01/04 10:35:12 diaz Exp $ */ :- built_in. '$use_stream'. current_input(Stream) :- set_bip_name(current_input, 1), '$check_stream_or_var'(Stream, S), '$call_c_test'('Current_Input_1'(S)). current_output(Stream) :- set_bip_name(current_output, 1), '$check_stream_or_var'(Stream, S), '$call_c_test'('Current_Output_1'(S)). '$check_stream_or_var'('$stream'(S), S) :- ( var(S) ; integer(S) ), !. '$check_stream_or_var'(Stream, _) :- '$pl_err_domain'(stream, Stream). set_input(SorA) :- set_bip_name(set_input, 1), '$call_c'('Set_Input_1'(SorA)). set_output(SorA) :- set_bip_name(set_output, 1), '$call_c'('Set_Output_1'(SorA)). '$set_top_level_streams'(SorAIn, SorAOut) :- '$call_c'('Set_Top_Level_Streams_2'(SorAIn, SorAOut)). '$set_debugger_streams'(SorAIn, SorAOut) :- '$call_c'('Set_Debugger_Streams_2'(SorAIn, SorAOut)). % open mask in sys_var[0]: % % b8 b7 b6 b5 b4 b3 b2 b1 b0 % 0/1 0/1/2 0/1 0/1/2 0/1 0/1 0/1 % buffering eof_action reposition text % b8=specified b5=specified b2=specified 0=text % b7/6=if specif b4/3=if specif b1=if specified 1=binary % buffering eof action reposition % 0=none 0=error 0=false % 1=line 1=eof_code 1=true % 2=block 2=reset open(SourceSink, Mode, Stream) :- set_bip_name(open, 3), '$open'(SourceSink, Mode, Stream, []). open(SourceSink, Mode, Stream, Options) :- set_bip_name(open, 4), '$open'(SourceSink, Mode, Stream, Options). '$open'(SourceSink, Mode, Stream, Options) :- '$set_open_defaults', '$get_open_stm'(Stream, Stm), g_link('$open_aliases', LAlias), g_link('$open_mirrors', LMirror), '$get_open_options'(Options), g_read('$open_aliases', []), % close the list g_read('$open_mirrors', []), % close the list '$call_c'('Open_3'(SourceSink, Mode, Stm)), '$add_aliases_to_stream'(LAlias, Stream), '$add_mirrors_to_stream'(LMirror, Stream). '$set_open_defaults' :- '$sys_var_write'(0, 1). '$get_open_stm'(Stream, Stm) :- ( nonvar(Stream) -> '$pl_err_type'(variable, Stream) ; Stream = '$stream'(Stm) ). '$get_open_options'(Options) :- '$check_list'(Options), '$get_open_options1'(Options). '$get_open_options1'([]). '$get_open_options1'([X|Options]) :- '$get_open_options2'(X), !, '$get_open_options1'(Options). '$get_open_options2'(X) :- var(X), '$pl_err_instantiation'. '$get_open_options2'(type(X)) :- nonvar(X), ( X = text, '$sys_var_set_bit'(0, 0) ; X = binary, '$sys_var_reset_bit'(0, 0) ). '$get_open_options2'(reposition(X)) :- nonvar(X), ( X = false, '$sys_var_reset_bit'(0, 1) ; X = true, '$sys_var_set_bit'(0, 1) ), '$sys_var_set_bit'(0, 2). '$get_open_options2'(eof_action(X)) :- nonvar(X), ( X = error, '$sys_var_reset_bit'(0, 4), '$sys_var_reset_bit'(0, 3) ; X = eof_code, '$sys_var_reset_bit'(0, 4), '$sys_var_set_bit'(0, 3) ; X = reset, '$sys_var_set_bit'(0, 4), '$sys_var_reset_bit'(0, 3) ), '$sys_var_set_bit'(0, 5). '$get_open_options2'(buffering(X)) :- nonvar(X), ( X = none, '$sys_var_reset_bit'(0, 7), '$sys_var_reset_bit'(0, 6) ; X = line, '$sys_var_reset_bit'(0, 7), '$sys_var_set_bit'(0, 6) ; X = block, '$sys_var_set_bit'(0, 7), '$sys_var_reset_bit'(0, 6) ), '$sys_var_set_bit'(0, 8). '$get_open_options2'(alias(X)) :- atom(X), !, ( '$call_c_test'('Test_Alias_Not_Assigned_1'(X)) -> g_read('$open_aliases', [X|End]), g_link('$open_aliases', End) % write new end variable ; '$pl_err_permission'(open, source_sink, alias(X)) ). '$get_open_options2'(mirror(X)) :- nonvar(X), (X = '$stream'(MStm), integer(MStm) ; atom(X)), !, '$call_c'('Check_Valid_Mirror_1'(X)), g_read('$open_mirrors', [X|End]), g_link('$open_mirrors', End). % write new end variable '$get_open_options2'(X) :- '$pl_err_domain'(stream_option, X). '$add_aliases_to_stream'([], _). '$add_aliases_to_stream'([Alias|LAlias], Stream) :- '$call_c'('Add_Stream_Alias_2'(Stream, Alias)), '$add_aliases_to_stream'(LAlias, Stream). '$add_mirrors_to_stream'([], _). '$add_mirrors_to_stream'([Mirror|LMirror], Stream) :- '$call_c'('Add_Stream_Mirror_2'(Stream, Mirror)), '$add_mirrors_to_stream'(LMirror, Stream). % close mask in sys_var[0]: % % b0 % 0/1 % force % 0=false % 1=true close(SorA) :- set_bip_name(close, 1), '$close'(SorA, []). close(SorA, Options) :- set_bip_name(close, 2), '$close'(SorA, Options). '$close'(SorA, Options) :- '$sys_var_write'(0, 0), % default mask '$get_close_options'(Options), '$call_c'('Close_1'(SorA)). '$get_close_options'(Options) :- '$check_list'(Options), '$get_close_options1'(Options). '$get_close_options1'([]). '$get_close_options1'([X|Options]) :- '$get_close_options2'(X), !, '$get_close_options1'(Options). '$get_close_options2'(X) :- var(X), '$pl_err_instantiation'. '$get_close_options2'(force(X)) :- nonvar(X), ( X = false, '$sys_var_reset_bit'(0, 0) ; X = true, '$sys_var_set_bit'(0, 0) ). '$get_close_options2'(X) :- '$pl_err_domain'(close_option, X). add_stream_alias(SorA, Alias) :- set_bip_name(add_stream_alias, 2), '$call_c_test'('Add_Stream_Alias_2'(SorA, Alias)), !. add_stream_alias(_, Alias) :- '$pl_err_permission'(add_alias, source_sink, alias(Alias)). add_stream_mirror(SorA, Mirror) :- set_bip_name(add_stream_mirror, 2), '$call_c'('Add_Stream_Mirror_2'(SorA, Mirror)). remove_stream_mirror(SorA, Mirror) :- set_bip_name(remove_stream_mirror, 2), '$call_c_test'('Remove_Stream_Mirror_2'(SorA, Mirror)). set_stream_type(SorA, Type) :- set_bip_name(set_stream_type, 2), ( var(Type) -> '$pl_err_instantiation' ; true ), ( Type = text, IsText = 1 ; Type = binary, IsText = 0 ), !, '$call_c'('Set_Stream_Type_2'(SorA, IsText)). set_stream_type(_, Type) :- '$pl_err_domain'(stream_type, Type). set_stream_eof_action(SorA, EofAction) :- set_bip_name(set_stream_eof_action, 2), ( var(EofAction) -> '$pl_err_instantiation' ; true ), ( EofAction = error, Action = 0 ; EofAction = eof_code, Action = 1 ; EofAction = reset, Action = 2 ), !, '$call_c'('Set_Stream_Eof_Action_2'(SorA, Action)). set_stream_eof_action(_, EofAction) :- '$pl_err_domain'(eof_action, EofAction). set_stream_buffering(SorA, Buffering) :- set_bip_name(set_stream_buffering, 2), ( var(Buffering) -> '$pl_err_instantiation' ; true ), ( Buffering = none, BuffMode = 0 ; Buffering = line, BuffMode = 1 ; Buffering = block, BuffMode = 2 ), !, '$call_c'('Set_Stream_Buffering_2'(SorA, BuffMode)). set_stream_buffering(_, Buffering) :- '$pl_err_domain'(buffering_mode, Buffering). flush_output :- set_bip_name(flush_output, 0), '$call_c'('Flush_Output_0'). flush_output(SorA) :- set_bip_name(flush_output, 1), '$call_c'('Flush_Output_1'(SorA)). current_stream(Stream) :- set_bip_name(current_stream, 1), '$check_stream_or_var'(Stream, S), '$current_stream'(S). '$current_stream'(S) :- '$call_c_test'('Current_Stream_1'(S)). '$current_stream_alt' :- % used by C code to create a choice-point '$call_c_test'('Current_Stream_Alt_0'). stream_property(Stream, Property) :- set_bip_name(stream_property, 2), '$check_stream_or_var'(Stream, S), ( nonvar(Property), Property = alias(Alias), atom(Alias) -> '$call_c_test'('From_Alias_To_Stream_2'(Alias, S)) ; '$check_stream_prop'(Property), !, '$current_stream'(S), '$stream_property1'(Property, S) ). '$check_stream_prop'(Property) :- var(Property). '$check_stream_prop'(file_name(_)). '$check_stream_prop'(mode(_)). '$check_stream_prop'(input). '$check_stream_prop'(output). '$check_stream_prop'(alias(_)). '$check_stream_prop'(mirror(_)). '$check_stream_prop'(type(_)). '$check_stream_prop'(reposition(_)). '$check_stream_prop'(eof_action(_)). '$check_stream_prop'(buffering(_)). '$check_stream_prop'(end_of_stream(_)). '$check_stream_prop'(position(_)). '$check_stream_prop'(Property) :- '$pl_err_domain'(stream_property, Property). '$stream_property1'(file_name(File), S) :- '$call_c_test'('Stream_Prop_File_Name_2'(File, S)). '$stream_property1'(mode(Mode), S) :- '$call_c_test'('Stream_Prop_Mode_2'(Mode, S)). '$stream_property1'(input, S) :- '$call_c_test'('Stream_Prop_Input_1'(S)). '$stream_property1'(output, S) :- '$call_c_test'('Stream_Prop_Output_1'(S)). '$stream_property1'(alias(Alias), S) :- '$current_alias'(S, Alias). '$stream_property1'(mirror(MS), S) :- '$current_mirror'(S, MStm), MS = '$stream'(MStm). '$stream_property1'(type(Type), S) :- '$call_c_test'('Stream_Prop_Type_2'(Type, S)). '$stream_property1'(reposition(Reposition), S) :- '$call_c_test'('Stream_Prop_Reposition_2'(Reposition, S)). '$stream_property1'(eof_action(EofAction), S) :- '$call_c_test'('Stream_Prop_Eof_Action_2'(EofAction, S)). '$stream_property1'(buffering(Buffering), S) :- '$call_c_test'('Stream_Prop_Buffering_2'(Buffering, S)). '$stream_property1'(position(Position), S) :- '$stream_position'('$stream'(S), Position). '$stream_property1'(end_of_stream(EndOfStream), S) :- '$call_c_test'('Stream_Prop_End_Of_Stream_2'(EndOfStream, S)). at_end_of_stream :- set_bip_name(at_end_of_stream, 0), '$call_c_test'('At_End_Of_Stream_0'). at_end_of_stream(SorA) :- set_bip_name(at_end_of_stream, 1), '$call_c_test'('At_End_Of_Stream_1'(SorA)). current_alias(Stream, Alias) :- set_bip_name(current_alias, 2), '$check_stream_or_var'(Stream, S), ( atom(Alias) -> '$call_c_test'('From_Alias_To_Stream_2'(Alias, S)) ; '$current_stream'(S), '$current_alias'(S, Alias) ). '$current_alias'(S, Alias) :- '$call_c_test'('Current_Alias_2'(S, Alias)). '$current_alias_alt' :- % used by C code to create a choice-point '$call_c_test'('Current_Alias_Alt_0'). current_mirror(Stream, MStream) :- set_bip_name(current_mirror, 2), '$check_stream_or_var'(Stream, S), '$check_stream_or_var'(MStream, MStm), '$current_stream'(S), '$current_mirror'(S, MStm). '$current_mirror'(S, MStm) :- '$call_c_test'('Current_Mirror_2'(S, MStm)). '$current_mirror_alt' :- % used by C code to create a choice-point '$call_c_test'('Current_Mirror_Alt_0'). stream_position(SorA, Position) :- set_bip_name(stream_position, 2), '$stream_position'(SorA, Position). '$stream_position'(SorA, Position) :- '$call_c_test'('Stream_Position_2'(SorA, Position)). set_stream_position(SorA, Position) :- set_bip_name(set_stream_position, 2), '$call_c_test'('Set_Stream_Position_2'(SorA, Position)). seek(SorA, Whence, Offset, NewLoc) :- set_bip_name(seek, 4), '$call_c_test'('Seek_4'(SorA, Whence, Offset, NewLoc)). character_count(SorA, Count) :- set_bip_name(character_count, 2), '$call_c_test'('Character_Count_2'(SorA, Count)). line_count(SorA, Count) :- set_bip_name(line_count, 2), '$call_c_test'('Line_Count_2'(SorA, Count)). line_position(SorA, Count) :- set_bip_name(line_position, 2), '$call_c_test'('Line_Position_2'(SorA, Count)). stream_line_column(SorA, Line, Col) :- set_bip_name(stream_line_column, 3), '$call_c_test'('Stream_Line_Column_3'(SorA, Line, Col)). set_stream_line_column(SorA, Line, Col) :- set_bip_name(set_stream_line_column, 3), '$call_c_test'('Set_Stream_Line_Column_3'(SorA, Line, Col)). % term_stream operations % term type (open_[input/output]_xxxx_stream/2) in sys_var[0]: % 1=atom, 2=chars, 3=codes open_input_atom_stream(SinkAtom, Stream) :- set_bip_name(open_input_atom_stream, 2), '$get_open_stm'(Stream, Stm), '$sys_var_write'(0, 1), '$call_c'('Open_Input_Term_Stream_2'(SinkAtom, Stm)). open_input_chars_stream(SinkChars, Stream) :- set_bip_name(open_input_chars_stream, 2), '$get_open_stm'(Stream, Stm), '$sys_var_write'(0, 2), '$call_c'('Open_Input_Term_Stream_2'(SinkChars, Stm)). open_input_codes_stream(SinkCodes, Stream) :- set_bip_name(open_input_codes_stream, 2), '$get_open_stm'(Stream, Stm), '$sys_var_write'(0, 3), '$call_c'('Open_Input_Term_Stream_2'(SinkCodes, Stm)). close_input_atom_stream(SorA) :- set_bip_name(close_input_atom_stream, 1), '$sys_var_write'(0, 1), '$call_c'('Close_Input_Term_Stream_1'(SorA)). close_input_chars_stream(SorA) :- set_bip_name(close_input_chars_stream, 1), '$sys_var_write'(0, 2), '$call_c'('Close_Input_Term_Stream_1'(SorA)). close_input_codes_stream(SorA) :- set_bip_name(close_input_codes_stream, 1), '$sys_var_write'(0, 3), '$call_c'('Close_Input_Term_Stream_1'(SorA)). open_output_atom_stream(Stream) :- set_bip_name(open_output_atom_stream, 1), '$get_open_stm'(Stream, Stm), '$sys_var_write'(0, 1), '$call_c'('Open_Output_Term_Stream_1'(Stm)). open_output_chars_stream(Stream) :- set_bip_name(open_output_chars_stream, 1), '$get_open_stm'(Stream, Stm), '$sys_var_write'(0, 2), '$call_c'('Open_Output_Term_Stream_1'(Stm)). open_output_codes_stream(Stream) :- set_bip_name(open_output_codes_stream, 1), '$get_open_stm'(Stream, Stm), '$sys_var_write'(0, 3), '$call_c'('Open_Output_Term_Stream_1'(Stm)). close_output_atom_stream(SorA, SinkAtom) :- set_bip_name(close_output_atom_stream, 2), '$sys_var_write'(0, 1), '$call_c_test'('Close_Output_Term_Stream_2'(SorA, SinkAtom)). close_output_chars_stream(SorA, SinkChars) :- set_bip_name(close_output_chars_stream, 2), '$sys_var_write'(0, 2), '$call_c_test'('Close_Output_Term_Stream_2'(SorA, SinkChars)). close_output_codes_stream(SorA, SinkCodes) :- set_bip_name(close_output_codes_stream, 2), '$sys_var_write'(0, 3), '$call_c_test'('Close_Output_Term_Stream_2'(SorA, SinkCodes)). ./gprolog-1.3.0/src/BipsPl/le_interf.wam0000644004425400513100000000310510547440332016427 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : le_interf.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/le_interf.pl'). predicate('$use_le_interf'/0,29,static,private,built_in,[ proceed]). predicate(get_linedit_prompt/1,32,static,private,built_in,[ put_atom(get_linedit_prompt,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Get_Linedit_Prompt_1',[boolean],[x(0)]), proceed]). predicate('$get_linedit_prompt'/1,39,static,private,built_in,[ call_c('Get_Linedit_Prompt_1',[boolean],[x(0)]), proceed]). predicate(set_linedit_prompt/1,45,static,private,built_in,[ put_atom(set_linedit_prompt,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Set_Linedit_Prompt_1',[],[x(0)]), proceed]). predicate('$set_linedit_prompt'/1,52,static,private,built_in,[ call_c('Set_Linedit_Prompt_1',[],[x(0)]), proceed]). predicate(add_linedit_completion/1,58,static,private,built_in,[ put_atom(add_linedit_completion,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Add_Linedit_Completion_1',[boolean],[x(0)]), proceed]). predicate(find_linedit_completion/2,65,static,private,built_in,[ put_atom(find_linedit_completion,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Find_Linedit_Completion_2',[boolean],[x(0),x(1)]), proceed]). predicate('$find_linedit_completion_alt'/0,71,static,private,built_in,[ call_c('Find_Linedit_Completion_Alt_0',[boolean],[]), proceed]). ./gprolog-1.3.0/src/BipsPl/parse_supp.h0000644004425400513100000000627210547154137016321 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : parse_supp.h * * Descr.: parser support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: parse_supp.h,v 1.12 2007/01/04 10:35:11 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ #define PARSE_END_OF_TERM_DOT 0 #define PARSE_END_OF_TERM_EOF 1 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct /* Parsed variable information */ { /* ------------------------------ */ char name[MAX_VAR_NAME_LENGTH]; /* variable name */ WamWord word; /* associated WAM word */ Bool named; /* has it a name ? */ int nb_of_uses; /* occurrence counter */ } InfVar; /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef PARSE_SUPP_FILE InfVar parse_dico_var[MAX_VAR_IN_TERM]; int parse_nb_var; #else extern InfVar parse_dico_var[]; extern int parse_nb_var; #endif /* defined as this to avoid to force the */ /* inclusion of parse_supp.o if not needed */ /* (stream_supp.c uses last_read_line/col) */ int last_read_line; int last_read_col; /*---------------------------------* * Function Prototypes * *---------------------------------*/ WamWord Read_Term(StmInf *pstm, int parse_end_of_term); WamWord Read_Atom(StmInf *pstm); WamWord Read_Integer(StmInf *pstm); WamWord Read_Number(StmInf *pstm); WamWord Read_Token(StmInf *pstm); ./gprolog-1.3.0/src/BipsPl/assert.wam0000644004425400513100000000700510547440331015763 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : assert.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/assert.pl'). predicate('$use_assert'/0,29,static,private,built_in,[ proceed]). predicate(asserta/1,32,static,private,built_in,[ put_atom(asserta,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_integer(1,1), put_integer(1,2), execute('$assert'/3)]). predicate(assertz/1,39,static,private,built_in,[ put_atom(assertz,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_integer(0,1), put_integer(1,2), execute('$assert'/3)]). predicate('$assert'/3,46,static,private,built_in,[ try_me_else(1), allocate(5), get_variable(y(0),1), get_variable(y(1),2), put_variable(y(2),1), put_variable(y(3),2), call('$get_head_and_body'/3), put_value(y(3),0), put_atom(none,1), put_variable(y(4),2), call('$term_to_goal'/3), put_unsafe_value(y(2),0), put_unsafe_value(y(4),1), put_value(y(0),2), put_value(y(1),3), call_c('Assert_4',[],[x(0),x(1),x(2),x(3)]), fail, label(1), trust_me_else_fail, proceed]). predicate(retract/1,57,static,private,built_in,[ allocate(2), put_atom(retract,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(0),1), put_variable(y(1),2), call('$get_head_and_body'/3), put_unsafe_value(y(0),0), put_unsafe_value(y(1),1), deallocate, execute('$retract'/2)]). predicate('$retract'/2,63,static,private,built_in,[ call_c('Retract_2',[boolean],[x(0),x(1)]), proceed]). predicate(retractall/1,69,static,private,built_in,[ load_cut_level(1), try_me_else(1), put_atom(retractall,2), put_integer(1,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Retractall_If_Empty_Head_1',[boolean],[x(0)]), cut(x(1)), proceed, label(1), retry_me_else(2), allocate(0), put_void(1), call('$retract'/2), fail, label(2), trust_me_else_fail, proceed]). predicate('$retract_last_found'/0,82,static,private,built_in,[ call_c('Retract_Last_Found_0',[],[]), proceed]). predicate(clause/2,87,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(clause,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), call('$check_head'/1), put_value(y(0),0), put_value(y(1),1), put_integer(0,2), deallocate, execute('$clause'/3)]). predicate('$clause'/3,93,static,private,built_in,[ call_c('Clause_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate('$instance_for_setarg'/2,99,static,private,built_in,[ put_integer(0,2), call_c('Clause_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate('$setarg_in_last_found'/2,102,static,private,built_in,[ call_c('Setarg_Of_Last_Found_2',[],[x(0),x(1)]), proceed]). predicate(abolish/1,107,static,private,built_in,[ put_atom(abolish,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Abolish_1',[],[x(0)]), proceed]). predicate('$remove_predicate'/2,114,static,private,built_in,[ call_c('Remove_Predicate_2',[],[x(0),x(1)]), proceed]). predicate('$scan_dyn_test_alt'/0,120,static,private,built_in,[ call_c('Scan_Dynamic_Pred_Alt_0',[boolean],[]), proceed]). predicate('$scan_dyn_jump_alt'/0,123,static,private,built_in,[ call_c('Scan_Dynamic_Pred_Alt_0',[jump],[]), proceed]). ./gprolog-1.3.0/src/BipsPl/pred_c.c0000644004425400513100000003756110547154137015374 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : pred_c.c * * Descr.: predicate manipulation management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: pred_c.c,v 1.14 2007/01/04 10:35:11 diaz Exp $ */ #include #include #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ #define CURRENT_PREDICATE_ALT X2463757272656E745F7072656469636174655F616C74 Prolog_Prototype(CURRENT_PREDICATE_ALT, 0); /*-------------------------------------------------------------------------* * CURRENT_PREDICATE_2 * * * *-------------------------------------------------------------------------*/ Bool Current_Predicate_2(WamWord pred_indic_word, WamWord which_preds_word) { WamWord name_word, arity_word; HashScan scan; PredInf *pred; int func, arity; int func1, arity1; int which_preds; /* 0=user, 1=user+bips, 2=user+bips+system */ Bool all; func = Get_Pred_Indicator(pred_indic_word, FALSE, &arity); name_word = pi_name_word; arity_word = pi_arity_word; which_preds = Rd_Integer(which_preds_word); if (which_preds == 0 && !Flag_Value(FLAG_STRICT_ISO)) which_preds = 1; #define Pred_Is_Ok(pred, func, which_preds) \ (which_preds == 2 || (atom_tbl[func].name[0] != '$' && \ (which_preds == 1 || !(pred->prop & MASK_PRED_ANY_BUILTIN)))) if (func >= 0 && arity >= 0) { pred = Lookup_Pred(func, arity); return pred && Pred_Is_Ok(pred, func, which_preds); } /* here func or arity == -1 (or both) */ all = (func == -1 && arity == -1); pred = (PredInf *) Hash_First(pred_tbl, &scan); for (;;) { if (pred == NULL) return FALSE; func1 = Functor_Of(pred->f_n); arity1 = Arity_Of(pred->f_n); if ((all || func == func1 || arity == arity1) && Pred_Is_Ok(pred, func1, which_preds)) break; pred = (PredInf *) Hash_Next(&scan); } /* non deterministic case */ A(0) = name_word; A(1) = arity_word; A(2) = which_preds; A(3) = (WamWord) scan.endt; A(4) = (WamWord) scan.cur_t; A(5) = (WamWord) scan.cur_p; Create_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_PREDICATE_ALT, 0), 6); return Get_Atom(Functor_Of(pred->f_n), name_word) && Get_Integer(Arity_Of(pred->f_n), arity_word); /* return Un_Atom_Check(Functor_Of(pred->f_n), name_word) && Un_Integer_Check(Arity_Of(pred->f_n), arity_word); */ } /*-------------------------------------------------------------------------* * CURRENT_PREDICATE_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Current_Predicate_Alt_0(void) { WamWord name_word, arity_word; HashScan scan; PredInf *pred; int which_preds; int func, arity; int func1, arity1; Bool all; Update_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_PREDICATE_ALT, 0), 0); name_word = AB(B, 0); arity_word = AB(B, 1); which_preds = AB(B, 2); scan.endt = (char *) AB(B, 3); scan.cur_t = (char *) AB(B, 4); scan.cur_p = (char *) AB(B, 5); func = Tag_Mask_Of(name_word) == TAG_REF_MASK ? -1 : UnTag_ATM(name_word); arity = Tag_Mask_Of(arity_word) == TAG_REF_MASK ? -1 : UnTag_INT(arity_word); /* here func or arity == -1 (or both) */ all = (func == -1 && arity == -1); for (;;) { pred = (PredInf *) Hash_Next(&scan); if (pred == NULL) { Delete_Last_Choice_Point(); return FALSE; } func1 = Functor_Of(pred->f_n); arity1 = Arity_Of(pred->f_n); if ((all || func == func1 || arity == arity1) && Pred_Is_Ok(pred, func1, which_preds)) break; } /* non deterministic case */ #if 0 /* the following data is unchanged */ AB(B, 0) = name_word; AB(B, 1) = arity_word; AB(B, 2) = which_preds; AB(B, 3) = (WamWord) scan.endt; #endif AB(B, 4) = (WamWord) scan.cur_t; AB(B, 5) = (WamWord) scan.cur_p; return Get_Atom(Functor_Of(pred->f_n), name_word) && Get_Integer(Arity_Of(pred->f_n), arity_word); } /*-------------------------------------------------------------------------* * PRED_PROP_STATIC_1 * * * *-------------------------------------------------------------------------*/ Bool Pred_Prop_Static_1(WamWord pred_indic_word) { int func, arity; PredInf *pred; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; return (pred->prop & MASK_PRED_DYNAMIC) == 0; } /*-------------------------------------------------------------------------* * PRED_PROP_DYNAMIC_1 * * * *-------------------------------------------------------------------------*/ Bool Pred_Prop_Dynamic_1(WamWord pred_indic_word) { int func, arity; PredInf *pred; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; return (pred->prop & MASK_PRED_DYNAMIC) != 0; } /*-------------------------------------------------------------------------* * PRED_PROP_PRIVATE_1 * * * *-------------------------------------------------------------------------*/ Bool Pred_Prop_Private_1(WamWord pred_indic_word) { int func, arity; PredInf *pred; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; return (pred->prop & MASK_PRED_PUBLIC) == 0; } /*-------------------------------------------------------------------------* * PRED_PROP_PUBLIC_1 * * * *-------------------------------------------------------------------------*/ Bool Pred_Prop_Public_1(WamWord pred_indic_word) { int func, arity; PredInf *pred; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; return (pred->prop & MASK_PRED_PUBLIC) != 0; } /*-------------------------------------------------------------------------* * PRED_PROP_USER_1 * * * *-------------------------------------------------------------------------*/ Bool Pred_Prop_User_1(WamWord pred_indic_word) { int func, arity; PredInf *pred; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; return (pred->prop & MASK_PRED_ANY_BUILTIN) == 0; } /*-------------------------------------------------------------------------* * PRED_PROP_BUILT_IN_1 * * * *-------------------------------------------------------------------------*/ Bool Pred_Prop_Built_In_1(WamWord pred_indic_word) { int func, arity; PredInf *pred; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; return (pred->prop & MASK_PRED_BUILTIN) != 0; } /*-------------------------------------------------------------------------* * PRED_PROP_BUILT_IN_FD_1 * * * *-------------------------------------------------------------------------*/ Bool Pred_Prop_Built_In_Fd_1(WamWord pred_indic_word) { int func, arity; PredInf *pred; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; return (pred->prop & MASK_PRED_BUILTIN_FD) != 0; } /*-------------------------------------------------------------------------* * PRED_PROP_NATIVE_CODE_1 * * * *-------------------------------------------------------------------------*/ Bool Pred_Prop_Native_Code_1(WamWord pred_indic_word) { int func, arity; PredInf *pred; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; return (pred->prop & MASK_PRED_NATIVE_CODE) != 0; } /*-------------------------------------------------------------------------* * PRED_PROP_PROLOG_FILE_2 * * * *-------------------------------------------------------------------------*/ Bool Pred_Prop_Prolog_File_2(WamWord pred_indic_word, WamWord pl_file_word) { int func, arity; PredInf *pred; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; return Un_Atom_Check(pred->pl_file, pl_file_word); } /*-------------------------------------------------------------------------* * PRED_PROP_PROLOG_LINE_2 * * * *-------------------------------------------------------------------------*/ Bool Pred_Prop_Prolog_Line_2(WamWord pred_indic_word, WamWord pl_line_word) { int func, arity; PredInf *pred; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; return Un_Integer_Check(pred->pl_line, pl_line_word); } /*-------------------------------------------------------------------------* * GET_PREDICATE_FILE_INFO_3 * * * *-------------------------------------------------------------------------*/ Bool Get_Predicate_File_Info_3(WamWord pred_indic_word, WamWord pl_file_word, WamWord pl_line_word) { int func, arity; PredInf *pred; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; if (pred->pl_file == atom_void || pred->pl_line == 0) return FALSE; return Un_Atom_Check(pred->pl_file, pl_file_word) && Un_Integer_Check(pred->pl_line, pl_line_word); } /*-------------------------------------------------------------------------* * SET_PREDICATE_FILE_INFO_3 * * * *-------------------------------------------------------------------------*/ Bool Set_Predicate_File_Info_3(WamWord pred_indic_word, WamWord pl_file_word, WamWord pl_line_word) { int func, arity; int pl_file, pl_line; PredInf *pred; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); if ((pred = Lookup_Pred(func, arity)) == NULL) return FALSE; pl_file = Rd_Atom_Check(pl_file_word); pl_line = Rd_Integer_Check(pl_line_word); if (pl_line < 0) return FALSE; pred->pl_file = pl_file; pred->pl_line = pl_line; return TRUE; } /*-------------------------------------------------------------------------* * AUX_NAME_1 * * * *-------------------------------------------------------------------------*/ Bool Aux_Name_1(WamWord name_word) { int func; func = Rd_Atom_Check(name_word); return Detect_If_Aux_Name(func) != NULL; } /*-------------------------------------------------------------------------* * FATHER_OF_AUX_NAME_3 * * * *-------------------------------------------------------------------------*/ Bool Father_Of_Aux_Name_3(WamWord name_word, WamWord father_name_word, WamWord father_arity_word) { int func, father_func, father_arity; func = Rd_Atom_Check(name_word); father_func = Father_Pred_Of_Aux(func, &father_arity); if (father_func < 0) return FALSE; return Un_Atom_Check(father_func, father_name_word) && Un_Integer_Check(father_arity, father_arity_word); } /*-------------------------------------------------------------------------* * PRED_WITHOUT_AUX_4 * * * *-------------------------------------------------------------------------*/ Bool Pred_Without_Aux_4(WamWord name_word, WamWord arity_word, WamWord name1_word, WamWord arity1_word) { int func, arity; int func1, arity1; func = Rd_Atom_Check(name_word); arity = Rd_Integer_Check(arity_word); func1 = Pred_Without_Aux(func, arity, &arity1); return Un_Atom_Check(func1, name1_word) && Un_Integer_Check(arity1, arity1_word); } /*-------------------------------------------------------------------------* * MAKE_AUX_NAME_4 * * * *-------------------------------------------------------------------------*/ Bool Make_Aux_Name_4(WamWord name_word, WamWord arity_word, WamWord aux_nb_word, WamWord aux_name_word) { int func, arity; int aux_nb; int aux_name; func = Rd_Atom_Check(name_word); arity = Rd_Integer_Check(arity_word); aux_nb = Rd_Integer_Check(aux_nb_word); aux_name = Make_Aux_Name(func, arity, aux_nb); return Un_Atom_Check(aux_name, aux_name_word); } ./gprolog-1.3.0/src/BipsPl/scan_supp.h0000644004425400513100000000634310547154137016132 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : scan_supp.h * * Descr.: scanner support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: scan_supp.h,v 1.9 2007/01/04 10:35:11 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ #define SCAN_BIG_BUFFER 10240 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef enum { TOKEN_VARIABLE, TOKEN_INTEGER, TOKEN_FLOAT, TOKEN_NAME, TOKEN_STRING, TOKEN_BACK_QUOTED, TOKEN_PUNCTUATION, TOKEN_IMMEDIAT_OPEN, TOKEN_FULL_STOP, TOKEN_END_OF_FILE, TOKEN_EXTENDED } TypTok; typedef struct { TypTok type; char name[SCAN_BIG_BUFFER]; /* for VARIABLE NAME STRING BACK_QUOTED */ int punct; /* for PUNCTUATION */ long int_num; /* for INTEGER */ double float_num; /* for FLOAT */ int line; /* source line of the token */ int col; /* source column of the token */ } TokInf; /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef SCAN_SUPP_FILE TokInf token; #else extern TokInf token; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ int Scan_Peek_Char(StmInf *pstm, Bool convert); char *Scan_Token(StmInf *pstm, Bool comma_is_punct); void Recover_After_Error(StmInf *pstm); char *Scan_Next_Atom(StmInf *pstm); char *Scan_Next_Number(StmInf *pstm, Bool integer_only); ./gprolog-1.3.0/src/BipsPl/all_solut.pl0000644004425400513100000000717410547162351016321 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : all_solut.pl * * Descr.: all solution collector management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: all_solut.pl,v 1.11 2007/01/04 10:35:06 diaz Exp $ */ :- built_in. '$use_all_solut'. findall(Template, Generator, Instances) :- '$findall'(Template, Generator, Instances, findall). '$findall'(Template, Generator, Instances, Func) :- '$check_list_arg'(Instances, Func), '$store_solutions'(Template, Generator, Stop, Func), '$call_c_test'('Recover_Solutions_2'(Stop, 0, Instances)). setof(Template, Goal, Instances) :- '$check_list_arg'(Instances, setof), '$bagof'(Template, Goal, Instances, setof). % sort(Instances). bagof(Template, Generator, Instances) :- '$check_list_arg'(Instances, bagof), '$bagof'(Template, Generator, Instances, bagof). '$bagof'(Template, Generator, Instances, Func) :- '$call_c_test'('Free_Variables_4'(Template, Generator, Generator1, Key)), !, '$store_solutions'(Key - Template, Generator1, Stop, Func), set_bip_name(Func, 3), % for error too_many_variables in C function '$call_c_test'('Recover_Solutions_2'(Stop, 1, AllInstances)), ( Func = bagof -> keysort(AllInstances) ; sort(AllInstances) ), '$group_solutions'(AllInstances, Key, Instances). '$bagof'(Template, _, Instances, Func) :- '$call_c'('Recover_Generator_1'(Generator)), '$findall'(Template, Generator, Instances, Func), Instances \== [], ( Func = bagof -> true ; sort(Instances) ). '$store_solutions'(Template, Generator, Stop, Func) :- '$call_c'('Stop_Mark_1'(Stop)), ( '$call'(Generator, Func, 3, true), '$call_c'('Store_Solution_1'(Template)), fail ; true ). '$group_solutions'(AllInstances1, Key, Instances) :- '$call_c_test'('Group_Solutions_3'(AllInstances1, Key, Instances)). '$group_solutions_alt' :- % used by C code to create a choice-point '$call_c_test'('Group_Solutions_Alt_0'). % Args testing '$check_list_arg'(List, Func) :- set_bip_name(Func, 3), '$check_list_or_partial_list'(List). ./gprolog-1.3.0/src/BipsPl/le_interf_c.c0000644004425400513100000001301210547154136016371 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : le_interf_c.c * * Descr.: linedit interface management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: le_interf_c.c,v 1.10 2007/01/04 10:35:10 diaz Exp $ */ #include #include "engine_pl.h" #include "bips_pl.h" #include "linedit.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ #define FIND_LINEDIT_COMPLETION_ALT X2466696E645F6C696E656469745F636F6D706C6574696F6E5F616C74 Prolog_Prototype(FIND_LINEDIT_COMPLETION_ALT, 0); /*-------------------------------------------------------------------------* * GET_LINEDIT_PROMPT_1 * * * *-------------------------------------------------------------------------*/ Bool Get_Linedit_Prompt_1(WamWord prompt_word) { return Un_String_Check(le_prompt, prompt_word); } /*-------------------------------------------------------------------------* * SET_LINEDIT_PROMPT_1 * * * *-------------------------------------------------------------------------*/ void Set_Linedit_Prompt_1(WamWord prompt_word) { le_prompt = atom_tbl[Rd_Atom_Check(prompt_word)].name; } /*-------------------------------------------------------------------------* * ADD_LINEDIT_COMPLETION_1 * * * *-------------------------------------------------------------------------*/ Bool Add_Linedit_Completion_1(WamWord compl_word) { int atom; AtomProp prop; char *p; atom = Rd_Atom_Check(compl_word); prop = atom_tbl[atom].prop; if (prop.length == 0) return FALSE; if (prop.type != IDENTIFIER_ATOM) { for (p = atom_tbl[atom].name; *p; p++) if (!isalnum(*p) && *p != '_') return FALSE; } LE_Compl_Add_Word(atom_tbl[atom].name, prop.length); return TRUE; } /*-------------------------------------------------------------------------* * FIND_LINEDIT_COMPLETION_2 * * * *-------------------------------------------------------------------------*/ Bool Find_Linedit_Completion_2(WamWord prefix_word, WamWord compl_word) { char *prefix = Rd_String_Check(prefix_word); int nb_match, max_lg, is_last; char *compl; Check_For_Un_Atom(compl_word); if (LE_Compl_Init_Match(prefix, &nb_match, &max_lg) == NULL) return FALSE; compl = LE_Compl_Find_Match(&is_last); if (!is_last) /* non deterministic case */ { A(0) = compl_word; Create_Choice_Point((CodePtr) Prolog_Predicate(FIND_LINEDIT_COMPLETION_ALT, 0), 1); } return Get_Atom(Create_Atom(compl), compl_word); } /*-------------------------------------------------------------------------* * FIND_LINEDIT_COMPLETION_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Find_Linedit_Completion_Alt_0(void) { WamWord compl_word; int is_last; char *compl; Update_Choice_Point((CodePtr) Prolog_Predicate(FIND_LINEDIT_COMPLETION_ALT, 0), 0); compl_word = AB(B, 0); compl = LE_Compl_Find_Match(&is_last); if (is_last) Delete_Last_Choice_Point(); return Get_Atom(Create_Atom(compl), compl_word); } ./gprolog-1.3.0/src/BipsPl/pred.wam0000644004425400513100000001407310547440331015417 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : pred.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/pred.pl'). predicate('$use_pred'/0,29,static,private,built_in,[ proceed]). predicate(current_predicate/1,32,static,private,built_in,[ put_atom(current_predicate,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), execute('$current_predicate'/1)]). predicate('$current_predicate'/1,36,static,private,built_in,[ put_integer(0,1), call_c('Current_Predicate_2',[boolean],[x(0),x(1)]), proceed]). predicate('$current_predicate_bips'/1,40,static,private,built_in,[ put_integer(1,1), call_c('Current_Predicate_2',[boolean],[x(0),x(1)]), proceed]). predicate('$current_predicate_any'/1,44,static,private,built_in,[ put_integer(2,1), call_c('Current_Predicate_2',[boolean],[x(0),x(1)]), proceed]). predicate('$current_predicate_alt'/0,48,static,private,built_in,[ call_c('Current_Predicate_Alt_0',[boolean],[]), proceed]). predicate(predicate_property/2,54,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(predicate_property,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), call('$current_predicate_bips'/1), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$predicate_property1'/2)]). predicate('$predicate_property_any'/2,60,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_value(y(0),0), call('$current_predicate_any'/1), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$predicate_property1'/2)]). predicate('$predicate_property1'/2,67,static,private,built_in,[ load_cut_level(2), allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_value(y(1),0), call('$check_pred_prop'/1), cut(y(2)), put_value(y(1),0), put_value(y(0),1), deallocate, execute('$predicate_property2'/2)]). predicate('$check_pred_prop'/1,74,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), proceed, label(1), retry_me_else(24), switch_on_term(4,2,fail,fail,3), label(2), switch_on_atom([(static,5),(dynamic,7),(private,9),(public,11),(user,13),(built_in,15),(built_in_fd,17),(native_code,19)]), label(3), switch_on_structure([(prolog_file/1,21),(prolog_line/1,23)]), label(4), try_me_else(6), label(5), get_atom(static,0), proceed, label(6), retry_me_else(8), label(7), get_atom(dynamic,0), proceed, label(8), retry_me_else(10), label(9), get_atom(private,0), proceed, label(10), retry_me_else(12), label(11), get_atom(public,0), proceed, label(12), retry_me_else(14), label(13), get_atom(user,0), proceed, label(14), retry_me_else(16), label(15), get_atom(built_in,0), proceed, label(16), retry_me_else(18), label(17), get_atom(built_in_fd,0), proceed, label(18), retry_me_else(20), label(19), get_atom(native_code,0), proceed, label(20), retry_me_else(22), label(21), get_structure(prolog_file/1,0), unify_void(1), proceed, label(22), trust_me_else_fail, label(23), get_structure(prolog_line/1,0), unify_void(1), proceed, label(24), trust_me_else_fail, put_value(x(0),1), put_atom(predicate_property,0), execute('$pl_err_domain'/2)]). predicate('$predicate_property2'/2,103,static,private,built_in,[ switch_on_term(3,1,fail,fail,2), label(1), switch_on_atom([(static,4),(dynamic,6),(private,8),(public,10),(user,12),(built_in,14),(built_in_fd,16),(native_code,18)]), label(2), switch_on_structure([(prolog_file/1,20),(prolog_line/1,22)]), label(3), try_me_else(5), label(4), get_atom(static,0), call_c('Pred_Prop_Static_1',[boolean],[x(1)]), proceed, label(5), retry_me_else(7), label(6), get_atom(dynamic,0), call_c('Pred_Prop_Dynamic_1',[boolean],[x(1)]), proceed, label(7), retry_me_else(9), label(8), get_atom(private,0), call_c('Pred_Prop_Private_1',[boolean],[x(1)]), proceed, label(9), retry_me_else(11), label(10), get_atom(public,0), call_c('Pred_Prop_Public_1',[boolean],[x(1)]), proceed, label(11), retry_me_else(13), label(12), get_atom(user,0), call_c('Pred_Prop_User_1',[boolean],[x(1)]), proceed, label(13), retry_me_else(15), label(14), get_atom(built_in,0), call_c('Pred_Prop_Built_In_1',[boolean],[x(1)]), proceed, label(15), retry_me_else(17), label(16), get_atom(built_in_fd,0), call_c('Pred_Prop_Built_In_Fd_1',[boolean],[x(1)]), proceed, label(17), retry_me_else(19), label(18), get_atom(native_code,0), call_c('Pred_Prop_Native_Code_1',[boolean],[x(1)]), proceed, label(19), retry_me_else(21), label(20), get_structure(prolog_file/1,0), unify_variable(x(0)), call_c('Pred_Prop_Prolog_File_2',[boolean],[x(1),x(0)]), proceed, label(21), trust_me_else_fail, label(22), get_structure(prolog_line/1,0), unify_variable(x(0)), call_c('Pred_Prop_Prolog_Line_2',[boolean],[x(1),x(0)]), proceed]). predicate('$get_predicate_file_info'/3,136,static,private,built_in,[ call_c('Get_Predicate_File_Info_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate('$set_predicate_file_info'/3,142,static,private,built_in,[ call_c('Set_Predicate_File_Info_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate('$aux_name'/1,148,static,private,built_in,[ call_c('Aux_Name_1',[boolean],[x(0)]), proceed]). predicate('$father_of_aux_name'/3,154,static,private,built_in,[ call_c('Father_Of_Aux_Name_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate('$pred_without_aux'/4,160,static,private,built_in,[ call_c('Pred_Without_Aux_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). predicate('$make_aux_name'/4,166,static,private,built_in,[ call_c('Make_Aux_Name_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). ./gprolog-1.3.0/src/BipsPl/top_level_c.c0000644004425400513100000001151310547154140016412 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : top_level_c.c * * Descr.: top Level - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: top_level_c.c,v 1.14 2007/01/04 10:35:12 diaz Exp $ */ #include "gp_config.h" #ifndef NO_USE_LINEDIT #include "ctrl_c.h" #else #include "../Linedit/ctrl_c.c" /* must be included before other .h... */ #endif #include "engine_pl.h" #include "bips_pl.h" #include #include #include /*---------------------------------* * Constants * *---------------------------------*/ /* Error Messages */ #define ERR_DEBUGGER_NOT_FOUND "top_level_c: debug/trace not found" /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ #define ABORT X61626F7274 #define BREAK X627265616B Prolog_Prototype(ABORT, 0); Prolog_Prototype(BREAK, 0); static long Ctrl_C_Manager(int from_callback); /*-------------------------------------------------------------------------* * SET_CTRL_C_HANDLER_0 * * * *-------------------------------------------------------------------------*/ void Set_Ctrl_C_Handler_0(void) { Install_Ctrl_C_Handler(Ctrl_C_Manager); } /*-------------------------------------------------------------------------* * CTRL_C_MANAGER * * * *-------------------------------------------------------------------------*/ static long Ctrl_C_Manager(int from_callback) { StmInf *pstm = stm_tbl[stm_top_level_output]; PredInf *pred; int c; CodePtr to_execute; Reset_Prolog_In_Signal(); start: Stream_Printf(pstm, "\nProlog interruption (h for help) ? "); Stream_Flush(pstm); c = Stream_Get_Key(stm_tbl[stm_top_level_input], TRUE, FALSE); Stream_Putc('\n', pstm); switch (c) { case 'a': /* abort */ to_execute = Prolog_Predicate(ABORT, 0); if (from_callback) return (long) to_execute; Execute_A_Continuation(to_execute); break; case 'b': /* break */ Call_Prolog(Prolog_Predicate(BREAK, 0)); goto start; break; case 'c': /* continue */ break; case 'e': /* exit */ Exit_With_Value(0); case 't': /* trace */ case 'd': /* debug */ if (SYS_VAR_DEBUGGER) { pred = Lookup_Pred(Create_Atom((c == 't') ? "trace" : "debug"), 0); if (pred == NULL) Fatal_Error(ERR_DEBUGGER_NOT_FOUND); /* should not occur */ Call_Prolog((CodePtr) pred->codep); break; } default: /* help */ Stream_Printf(pstm, " a abort b break\n"); Stream_Printf(pstm, " c continue e exit\n"); if (SYS_VAR_DEBUGGER) Stream_Printf(pstm, " d debug t trace\n"); Stream_Printf(pstm, " h/? help\n"); goto start; } return 0; } ./gprolog-1.3.0/src/BipsPl/call_args.wam0000644004425400513100000000500510547440331016407 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : call_args.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/call_args.pl'). predicate('$use_call_args'/0,29,static,private,built_in,[ proceed]). predicate(call_with_args/1,34,static,private,built_in,[ call_c('Call_With_Args_1',[jump],[]), proceed]). predicate(call_with_args/2,37,static,private,built_in,[ call_c('Call_With_Args_2',[jump],[]), proceed]). predicate(call_with_args/3,40,static,private,built_in,[ call_c('Call_With_Args_3',[jump],[]), proceed]). predicate(call_with_args/4,43,static,private,built_in,[ call_c('Call_With_Args_4',[jump],[]), proceed]). predicate(call_with_args/5,46,static,private,built_in,[ call_c('Call_With_Args_5',[jump],[]), proceed]). predicate(call_with_args/6,49,static,private,built_in,[ call_c('Call_With_Args_6',[jump],[]), proceed]). predicate(call_with_args/7,52,static,private,built_in,[ call_c('Call_With_Args_7',[jump],[]), proceed]). predicate(call_with_args/8,55,static,private,built_in,[ call_c('Call_With_Args_8',[jump],[]), proceed]). predicate(call_with_args/9,58,static,private,built_in,[ call_c('Call_With_Args_9',[jump],[]), proceed]). predicate(call_with_args/10,61,static,private,built_in,[ call_c('Call_With_Args_10',[jump],[]), proceed]). predicate(call_with_args/11,64,static,private,built_in,[ call_c('Call_With_Args_11',[jump],[]), proceed]). predicate(call/2,69,static,private,built_in,[ call_c('Call_2',[jump],[]), proceed]). predicate(call/3,72,static,private,built_in,[ call_c('Call_3',[jump],[]), proceed]). predicate(call/4,75,static,private,built_in,[ call_c('Call_4',[jump],[]), proceed]). predicate(call/5,78,static,private,built_in,[ try_me_else(1), call_c('Call_5',[jump],[]), proceed, label(1), trust_me_else_fail, call_c('Call_5',[jump],[]), proceed]). predicate(call/6,84,static,private,built_in,[ call_c('Call_6',[jump],[]), proceed]). predicate(call/7,87,static,private,built_in,[ call_c('Call_7',[jump],[]), proceed]). predicate(call/8,90,static,private,built_in,[ call_c('Call_8',[jump],[]), proceed]). predicate(call/9,93,static,private,built_in,[ call_c('Call_9',[jump],[]), proceed]). predicate(call/10,96,static,private,built_in,[ call_c('Call_10',[jump],[]), proceed]). predicate(call/11,99,static,private,built_in,[ call_c('Call_11',[jump],[]), proceed]). ./gprolog-1.3.0/src/BipsPl/unify.wam0000644004425400513100000000120610547440331015611 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : unify.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/unify.pl'). predicate('$use_unify'/0,29,static,private,built_in,[ proceed]). predicate((=)/2,32,static,private,built_in,[ get_value(x(1),0), proceed]). predicate(unify_with_occurs_check/2,37,static,private,built_in,[ call_c('Unify_Occurs_Check',[boolean,fast_call],[x(0),x(1)]), proceed]). predicate((\=)/2,43,static,private,built_in,[ get_variable(x(2),0), put_structure((=)/2,0), unify_local_value(x(2)), unify_local_value(x(1)), execute((\+)/1)]). ./gprolog-1.3.0/src/BipsPl/stat.wam0000644004425400513100000001324010547440332015434 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : stat.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/stat.pl'). predicate('$use_stat'/0,29,static,private,built_in,[ proceed]). predicate(statistics/0,32,static,private,built_in,[ put_atom(statistics,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call_c('Statistics_0',[],[]), proceed]). predicate(statistics/2,37,static,private,built_in,[ load_cut_level(2), allocate(5), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(statistics,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), call('$check_stat_key'/1), cut(y(2)), put_value(y(1),0), put_variable(y(3),1), put_variable(y(4),2), call('$statistics/2_$aux1'/3), put_value(y(0),0), put_unsafe_value(y(3),1), put_unsafe_value(y(4),2), deallocate, execute('$stat'/3)]). predicate('$statistics/2_$aux1'/3,37,static,private,built_in,[ load_cut_level(3), try_me_else(1), get_list(0), unify_local_value(x(1)), unify_list, unify_local_value(x(2)), unify_nil, cut(x(3)), proceed, label(1), trust_me_else_fail, put_value(x(0),1), put_atom(statistics_value,0), execute('$pl_err_domain'/2)]). predicate('$check_stat_key'/1,49,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), proceed, label(1), retry_me_else(21), switch_on_term(3,2,fail,fail,fail), label(2), switch_on_atom([(user_time,4),(runtime,6),(system_time,8),(cpu_time,10),(real_time,12),(local_stack,14),(global_stack,16),(trail_stack,18),(cstr_stack,20)]), label(3), try_me_else(5), label(4), get_atom(user_time,0), proceed, label(5), retry_me_else(7), label(6), get_atom(runtime,0), proceed, label(7), retry_me_else(9), label(8), get_atom(system_time,0), proceed, label(9), retry_me_else(11), label(10), get_atom(cpu_time,0), proceed, label(11), retry_me_else(13), label(12), get_atom(real_time,0), proceed, label(13), retry_me_else(15), label(14), get_atom(local_stack,0), proceed, label(15), retry_me_else(17), label(16), get_atom(global_stack,0), proceed, label(17), retry_me_else(19), label(18), get_atom(trail_stack,0), proceed, label(19), trust_me_else_fail, label(20), get_atom(cstr_stack,0), proceed, label(21), trust_me_else_fail, put_value(x(0),1), put_atom(statistics_key,0), execute('$pl_err_domain'/2)]). predicate('$stat'/3,75,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(2), get_variable(y(0),1), get_variable(y(1),2), put_value(x(3),1), call('$$stat/3_$aux1'/2), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Statistics_User_Time_2',[boolean],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, switch_on_term(3,2,fail,fail,fail), label(2), switch_on_atom([(system_time,4),(cpu_time,6),(real_time,8),(local_stack,10),(global_stack,12),(trail_stack,14),(cstr_stack,16)]), label(3), try_me_else(5), label(4), get_atom(system_time,0), call_c('Statistics_System_Time_2',[boolean],[x(1),x(2)]), proceed, label(5), retry_me_else(7), label(6), get_atom(cpu_time,0), call_c('Statistics_Cpu_Time_2',[boolean],[x(1),x(2)]), proceed, label(7), retry_me_else(9), label(8), get_atom(real_time,0), call_c('Statistics_Real_Time_2',[boolean],[x(1),x(2)]), proceed, label(9), retry_me_else(11), label(10), get_atom(local_stack,0), call_c('Statistics_Local_Stack_2',[boolean],[x(1),x(2)]), proceed, label(11), retry_me_else(13), label(12), get_atom(global_stack,0), call_c('Statistics_Global_Stack_2',[boolean],[x(1),x(2)]), proceed, label(13), retry_me_else(15), label(14), get_atom(trail_stack,0), call_c('Statistics_Trail_Stack_2',[boolean],[x(1),x(2)]), proceed, label(15), trust_me_else_fail, label(16), get_atom(cstr_stack,0), call_c('Statistics_Cstr_Stack_2',[boolean],[x(1),x(2)]), proceed]). predicate('$$stat/3_$aux1'/2,75,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(1), get_variable(y(0),1), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), cut(x(2)), call('$$stat/3_$aux2'/1), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, get_atom(user_time,0), proceed]). predicate('$$stat/3_$aux2'/1,75,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(user_time,3),(runtime,5)]), label(2), try_me_else(4), label(3), get_atom(user_time,0), proceed, label(4), trust_me_else_fail, label(5), get_atom(runtime,0), proceed]). predicate(user_time/1,108,static,private,built_in,[ put_atom(user_time,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('User_Time_1',[boolean],[x(0)]), proceed]). predicate(system_time/1,115,static,private,built_in,[ put_atom(system_time,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('System_Time_1',[boolean],[x(0)]), proceed]). predicate(cpu_time/1,122,static,private,built_in,[ put_atom(cpu_time,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Cpu_Time_1',[boolean],[x(0)]), proceed]). predicate(real_time/1,129,static,private,built_in,[ put_atom(real_time,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Real_Time_1',[boolean],[x(0)]), proceed]). ./gprolog-1.3.0/src/BipsPl/catch.pl0000644004425400513100000000767210547162351015410 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : catch.pl * * Descr.: exception management (catch) * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: catch.pl,v 1.13 2007/01/04 10:35:08 diaz Exp $ */ :- built_in. '$use_catch'. % Warning the name '$catch_internal1' is tested by the debugger '$catch'(Goal, Catch, Recovery, Func, Arity, DebugCall) :- '$call_c'('Save_Call_Info_3'(Func, Arity, DebugCall)), '$catch1'(Goal, Catch, Recovery, 0). '$catch1'(Goal, Catch, Recovery, CallInfo) :- '$call_c'('Load_Call_Info_Arg_1'(3)), % to ensure CallInfo is deref '$catch_internal'(Goal, Catch, Recovery, CallInfo). '$catch_internal'(Goal, Catch, Recovery, CallInfo) :- '$sys_var_read'(7, Handler), '$sys_var_put'(8, '$no_ball$'), '$catch_internal1'(Goal, Catch, Recovery, CallInfo, Handler). '$catch_internal1'(Goal, _Catch, _Recovery, CallInfo, Handler) :- '$get_current_B'(B), '$sys_var_write'(7, B), % for debug % format('~N*** ~d for catch(~w,~w,~w)~n', [B, Goal, _Catch, _Recovery]), '$call_internal'(Goal, CallInfo), '$get_current_B'(B1), ( B1 > B -> '$trail_handler'(B) ; ! ), '$sys_var_write'(7, Handler). % for debug %'$catch_internal1'(_, _, _, _, _):- % '$get_current_B'(B), % '$sys_var_get'(8,Ball), % format('~N*** ~d catching throw(~w)~n', [B, Ball]), % fail. '$catch_internal1'(_, Catch, Recovery, CallInfo, Handler) :- '$sys_var_write'(7, Handler), % after throw or fail '$sys_var_get'(8, Ball), Ball \== '$no_ball$', '$catch_a_throw'(Ball, Catch, Recovery, CallInfo, Handler). '$catch_a_throw'(Ball, _, _, _, Handler) :- % for abort nonvar(Ball), Ball = '$catch_sync'(B), !, ( Handler > B -> '$unwind'('$catch_sync'(B)) ; '$catch_fail_now'(B) ). '$catch_a_throw'(Ball, Ball, Recovery, CallInfo, _) :- % normal throw - unifies !, '$sys_var_put'(8, '$no_ball$'), '$call_internal'(Recovery, CallInfo). '$catch_a_throw'(Ball, _, _, _, _) :- % normal throw - does not unify '$unwind'(Ball). '$trail_handler'(_). '$trail_handler'(Handler) :- '$sys_var_write'(7, Handler), fail. '$catch_sync_for_fail_at'(B) :- '$sys_var_read'(7, Handler), ( Handler > B -> throw('$catch_sync'(B)) ; '$catch_fail_now'(B) ). '$catch_fail_now'(B) :- '$set_current_B'(B), fail. ./gprolog-1.3.0/src/BipsPl/flag_supp.h0000644004425400513100000001323210547154136016111 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : flag_supp.h * * Descr.: Prolog flag and system variable support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: flag_supp.h,v 1.13 2007/01/04 10:35:10 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ enum { FLAG_BOUNDED, FLAG_MAX_INTEGER, FLAG_MIN_INTEGER, FLAG_ROUNDING_FCT, FLAG_CHAR_CONVERSION, FLAG_DEBUG, FLAG_MAX_ARITY, FLAG_UNKNOWN, FLAG_DOUBLE_QUOTES, FLAG_BACK_QUOTES, FLAG_SYNTAX_ERROR, FLAG_OS_ERROR, FLAG_MAX_ATOM, FLAG_MAX_UNGET, FLAG_SINGLETON_WARNING, FLAG_STRICT_ISO, FLAG_PROLOG_NAME, FLAG_PROLOG_VERSION, FLAG_PROLOG_DATE, FLAG_PROLOG_COPYRIGHT, NB_OF_FLAGS /* this gives us the number of used flags */ }; #define FLAG_VALUE_ERROR 0 /* same order as in read.pl */ #define FLAG_VALUE_WARNING 1 #define FLAG_VALUE_FAIL 2 /* values for double_quotes and back_quotes */ #define FLAG_AS_CODES 0 /* bit 2 is set if no_escape */ #define FLAG_AS_CHARS 1 #define FLAG_AS_ATOM 2 #define FLAG_NO_ESCAPE_BIT 2 #define FLAG_AS_PART_MASK ((1 << FLAG_NO_ESCAPE_BIT) - 1) #define FLAG_NO_ESCAPE_MASK (1 << FLAG_NO_ESCAPE_BIT) #define Char_Conversion(c) ((Flag_Value(FLAG_CHAR_CONVERSION) && \ Is_Valid_Code(c)) ? char_conv[c] : (c)) #define SYS_VAR_OPTION_MASK (sys_var[0]) #define SYS_VAR_WRITE_DEPTH (sys_var[1]) #define SYS_VAR_SYNTAX_ERROR_ACTON (sys_var[1]) #define SYS_VAR_WRITE_PREC (sys_var[2]) #define SYS_VAR_FD_BCKTS (sys_var[3]) #define SYS_VAR_TOP_LEVEL (sys_var[10]) #define SYS_VAR_LINEDIT (sys_var[12]) #define SYS_VAR_DEBUGGER (sys_var[13]) #define SYS_VAR_SAY_GETC (sys_var[20]) #define CHAR_TO_EMIT_WHEN_CHAR '\1' #define Flag_Value(flag) (sys_var[200 + (flag)]) /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef FLAG_C_FILE long sys_var[MAX_SYS_VARS]; #else extern long sys_var[]; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ Bool Read_Pl_State_File(WamWord file_word); Bool Write_Pl_State_File(WamWord file_word); /*-------------------------------------------------------------------------* * System variables (C and Prolog) - bank description * * * * 0: temporary (e.g. masks for option lists (open/read/write)). * * 1: temporary (e.g. depth in write). * * 2: temporary (e.g. reorder in FD labeling). * * 3: temporary (e.g. backtracks counter in FD labeling). * * * * 7: permanent catch handler. * * 8: permanent catch ball. * * * * 10: permanent top level depth (for top-level and stop/abort). * * 11: permanent top level handler (B level) for abort and stop. * * 12: permanent: is linedit present ? * * 13: permanent: is the debugger present ? * * * * 20: permanent: should stream fcts emit a char before calling fgetc ? * * * * 100..199: free for users (who know sys_var[] exists !) * * 200..: some prolog flag values. * *-------------------------------------------------------------------------*/ ./gprolog-1.3.0/src/BipsPl/bc_supp.c0000644004425400513100000007206310547154133015563 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : bc_supp.c * * Descr.: byte-code support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: bc_supp.c,v 1.13 2007/01/04 10:35:07 diaz Exp $ */ #include #include #define OBJ_INIT Byte_Code_Initializer #define BC_SUPP_FILE #include "engine_pl.h" #include "bips_pl.h" #if 0 #define DEBUG #endif /*---------------------------------* * Constants * *---------------------------------*/ #define MAX_OP 256 #define BC_BLOCK_SIZE 1024 #define ERR_UNKNOWN_INSTRUCTION "bc_supp: Unknown wam instruction: %s" /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef enum { GET_X_VARIABLE, GET_Y_VARIABLE, GET_X_VALUE, GET_Y_VALUE, GET_ATOM, GET_INTEGER, GET_INTEGER_BIG, GET_FLOAT, GET_NIL, GET_LIST, GET_STRUCTURE, PUT_X_VARIABLE, PUT_Y_VARIABLE, PUT_VOID, PUT_X_VALUE, PUT_Y_VALUE, PUT_Y_UNSAFE_VALUE, PUT_ATOM, PUT_INTEGER, PUT_INTEGER_BIG, PUT_FLOAT, PUT_NIL, PUT_LIST, PUT_STRUCTURE, MATH_LOAD_X_VALUE, MATH_LOAD_Y_VALUE, UNIFY_X_VARIABLE, UNIFY_Y_VARIABLE, UNIFY_VOID, UNIFY_X_VALUE, UNIFY_Y_VALUE, UNIFY_X_LOCAL_VALUE, UNIFY_Y_LOCAL_VALUE, UNIFY_ATOM, UNIFY_INTEGER, UNIFY_INTEGER_BIG, UNIFY_NIL, UNIFY_LIST, UNIFY_STRUCTURE, ALLOCATE, DEALLOCATE, CALL, CALL_NATIVE, EXECUTE, EXECUTE_NATIVE, PROCEED, FAIL, CUT_X, CUT_Y } BCCodOp; typedef union { struct { unsigned code_op:8; unsigned i8:8; unsigned i16:16; } t1; struct { unsigned code_op:8; unsigned i24:24; } t2; unsigned word; } BCWord; typedef union { double d; unsigned u[2]; } DblUns; #if WORD_SIZE == 64 typedef union { int *p; unsigned u[2]; } PtrUns; #endif /*---------------------------------* * Global Variables * *---------------------------------*/ static BCWord op_tbl[MAX_OP]; static int nb_op; static BCWord *bc; static BCWord *bc_sp; static int bc_nb_block; static int atom_dynamic; static int atom_public; static int atom_built_in; static int atom_built_in_fd; static int atom_fail; static int caller_func; static int caller_arity; static int glob_func; static DynPInf *glob_dyn; static Bool debug_call; WamCont debug_call_code; /* overwritten by debugger_c.c */ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static int Find_Inst_Code_Op(int inst); static int Compar_Inst_Code_Op(BCWord *w1, BCWord *w2); static int BC_Arg_X_Or_Y(WamWord arg_word, int *op); static int BC_Arg_Func_Arity(WamWord arg_word, int *arity); WamCont BC_Emulate_Pred(int func, DynPInf *dyn); static WamCont BC_Emulate_Pred_Alt(DynCInf *clause, WamWord *w); static WamCont BC_Emulate_Clause(DynCInf *clause); static WamCont BC_Emulate_Byte_Code(BCWord *bc); static void Prep_Debug_Call(int func, int arity, int caller_func, int caller_arity); #define BC_EMULATE_CONT X2462635F656D756C6174655F636F6E74 #define CALL_INTERNAL_WITH_CUT X2463616C6C5F696E7465726E616C5F776974685F637574 Prolog_Prototype(BC_EMULATE_CONT, 0); Prolog_Prototype(CALL_INTERNAL_WITH_CUT, 3); #define BC_Op(w) ((w).t1.code_op) #define BC_X0(w) ((w).t1.i8) #define BC_Ari(w) ((w).t1.i8) #define BC_XY(w) ((w).t1.i16) #define BC_X(w) ((w).t1.i16) #define BC_Y(w) ((w).t1.i16) #define BC_Atm(w) ((w).t1.i16) #define BC_Int(w) ((w).t1.i16) #define BC_Fun(w) ((w).t1.i16) #define BC_Adr(w) ((w).t2.i24) #define Fit_In_16bits(n) ((unsigned) (n) < (1<<16)) #define Fit_In_24bits(n) ((unsigned) (n) < (1<<24)) #define Op_In_Tbl(str, op) BC_Op(*p)=op; BC_Atm(*p) = Create_Atom(str); p++ #if WORD_SIZE == 32 #define Compute_Branch_Adr(bc, codep) \ { \ codep = (WamCont) (bc->word); bc++; \ } #else #define Compute_Branch_Adr(bc, codep) \ { \ PtrUns pu; \ pu.u[0] = (unsigned) (bc->word); bc++; \ pu.u[1] = (unsigned) (bc->word); bc++; \ codep = (WamCont) (pu.p); \ } #endif /*-------------------------------------------------------------------------* * BYTE_CODE_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Byte_Code_Initializer(void) { BCWord *p = op_tbl; Op_In_Tbl("get_variable", GET_X_VARIABLE); Op_In_Tbl("get_value", GET_X_VALUE); Op_In_Tbl("get_atom", GET_ATOM); Op_In_Tbl("get_integer", GET_INTEGER); Op_In_Tbl("get_float", GET_FLOAT); Op_In_Tbl("get_nil", GET_NIL); Op_In_Tbl("get_list", GET_LIST); Op_In_Tbl("get_structure", GET_STRUCTURE); Op_In_Tbl("put_variable", PUT_X_VARIABLE); Op_In_Tbl("put_void", PUT_VOID); Op_In_Tbl("put_value", PUT_X_VALUE); Op_In_Tbl("put_unsafe_value", PUT_Y_UNSAFE_VALUE - 1); Op_In_Tbl("put_atom", PUT_ATOM); Op_In_Tbl("put_integer", PUT_INTEGER); Op_In_Tbl("put_float", PUT_FLOAT); Op_In_Tbl("put_nil", PUT_NIL); Op_In_Tbl("put_list", PUT_LIST); Op_In_Tbl("put_structure", PUT_STRUCTURE); Op_In_Tbl("math_load_value", MATH_LOAD_X_VALUE); Op_In_Tbl("unify_variable", UNIFY_X_VARIABLE); Op_In_Tbl("unify_void", UNIFY_VOID); Op_In_Tbl("unify_value", UNIFY_X_VALUE); Op_In_Tbl("unify_local_value", UNIFY_X_LOCAL_VALUE); Op_In_Tbl("unify_atom", UNIFY_ATOM); Op_In_Tbl("unify_integer", UNIFY_INTEGER); Op_In_Tbl("unify_nil", UNIFY_NIL); Op_In_Tbl("unify_list", UNIFY_LIST); Op_In_Tbl("unify_structure", UNIFY_STRUCTURE); Op_In_Tbl("allocate", ALLOCATE); Op_In_Tbl("deallocate", DEALLOCATE); Op_In_Tbl("call", CALL); Op_In_Tbl("execute", EXECUTE); Op_In_Tbl("proceed", PROCEED); Op_In_Tbl("fail", FAIL); Op_In_Tbl("cut", CUT_X); nb_op = p - op_tbl; qsort(op_tbl, nb_op, sizeof(op_tbl[0]), (int (*)(const void *, const void *)) Compar_Inst_Code_Op); bc_nb_block = 1; bc = (BCWord *) Malloc(bc_nb_block * BC_BLOCK_SIZE * sizeof(BCWord)); atom_dynamic = Create_Atom("dynamic"); atom_public = Create_Atom("public"); atom_built_in = Create_Atom("built_in"); atom_built_in_fd = Create_Atom("built_in_fd"); atom_fail = Create_Atom("fail"); } /*-------------------------------------------------------------------------* * Part I. Byte-Code creation. * * * *-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------* * FIND_INST_CODE_OP * * * *-------------------------------------------------------------------------*/ static int Find_Inst_Code_Op(int inst) { BCWord *p; BCWord w; BC_Atm(w) = inst; p = (BCWord *) bsearch(&w, op_tbl, nb_op, sizeof(op_tbl[0]), (int (*)(const void *, const void *)) Compar_Inst_Code_Op); if (p == NULL) Fatal_Error(ERR_UNKNOWN_INSTRUCTION, atom_tbl[inst].name); return BC_Op(*p); } /*-------------------------------------------------------------------------* * COMPAR_INST_CODE_OP * * * *-------------------------------------------------------------------------*/ static int Compar_Inst_Code_Op(BCWord *p1, BCWord *p2) { return BC_Atm(*p1) - BC_Atm(*p2); } /*-------------------------------------------------------------------------* * BC_START_PRED_7 * * * *-------------------------------------------------------------------------*/ void BC_Start_Pred_7(WamWord func_word, WamWord arity_word, WamWord pl_file_word, WamWord pl_line_word, WamWord sta_dyn_word, WamWord pub_priv_word, WamWord us_blp_bfd_word) { int func, arity; int pl_file, pl_line; int prop = 0; int atom; PredInf *pred; func = Rd_Atom_Check(func_word); arity = Rd_Integer_Check(arity_word); pl_file = Rd_Atom_Check(pl_file_word); pl_line = Rd_Integer_Check(pl_line_word); if (Rd_Atom_Check(sta_dyn_word) == atom_dynamic) prop = MASK_PRED_DYNAMIC | MASK_PRED_PUBLIC; else if (Rd_Atom_Check(pub_priv_word) == atom_public) prop = MASK_PRED_PUBLIC; atom = Rd_Atom_Check(us_blp_bfd_word); if (atom == atom_built_in) prop |= MASK_PRED_BUILTIN; else if (atom == atom_built_in_fd) prop |= MASK_PRED_BUILTIN_FD; pred = Update_Dynamic_Pred(func, arity, 0); if (pred == NULL) pred = Create_Pred(func, arity, pl_file, pl_line, prop, NULL); else { pred->pl_file = pl_file; pred->pl_line = pl_line; pred->prop = prop; } #if 1 caller_func = Pred_Without_Aux(func, arity, &caller_arity); #else caller_func = func; caller_arity = arity; #endif #ifdef DEBUG DBGPRINTF("BC start %s/%d\n", atom_tbl[func].name, arity); #endif } /*-------------------------------------------------------------------------* * BC_START_EMIT_0 * * * *-------------------------------------------------------------------------*/ void BC_Start_Emit_0(void) { bc_sp = bc; } /*-------------------------------------------------------------------------* * BC_STOP_EMIT_0 * * * *-------------------------------------------------------------------------*/ void BC_Stop_Emit_0(void) { int i; byte_len = bc_sp - bc; #ifdef DEBUG DBGPRINTF("byte-code size:%d\n", byte_len); #endif byte_code = (unsigned *) Malloc(byte_len * sizeof(BCWord)); for (i = 0; i < byte_len; i++) byte_code[i] = bc[i].word; } /*-------------------------------------------------------------------------* * BC_EMIT_INST_1 * * * *-------------------------------------------------------------------------*/ void BC_Emit_Inst_1(WamWord inst_word) { int func, arity; WamWord *arg_adr; int op; int size_bc; BCWord w; unsigned w1, w2; int nb_word; DblUns du; #if WORD_SIZE == 64 PtrUns pu; #endif PredInf *pred; arg_adr = Rd_Callable_Check(inst_word, &func, &arity); op = Find_Inst_Code_Op(func); size_bc = bc_sp - bc; if (size_bc + 3 >= bc_nb_block * BC_BLOCK_SIZE) { bc_nb_block++; bc = (BCWord *) Realloc((char *) bc, bc_nb_block * BC_BLOCK_SIZE * sizeof(BCWord)); bc_sp = bc + size_bc; } w.word = 0; nb_word = 1; switch (op) { case GET_X_VARIABLE: case GET_X_VALUE: case PUT_X_VARIABLE: case PUT_X_VALUE: case PUT_Y_UNSAFE_VALUE - 1: case MATH_LOAD_X_VALUE: BC_XY(w) = BC_Arg_X_Or_Y(*arg_adr++, &op); BC_X0(w) = Rd_Integer(*arg_adr); break; case GET_ATOM: case PUT_ATOM: BC_Atm(w) = Rd_Atom(*arg_adr++); BC_X0(w) = Rd_Integer(*arg_adr); break; case GET_INTEGER: case PUT_INTEGER: w1 = Rd_Integer(*arg_adr++); if (Fit_In_16bits(w1)) BC_Int(w) = w1; else { op++; nb_word = 2; } BC_X0(w) = Rd_Integer(*arg_adr); break; case GET_FLOAT: case PUT_FLOAT: nb_word = 3; du.d = Rd_Float(*arg_adr++); BC_X0(w) = Rd_Integer(*arg_adr); w1 = du.u[0]; w2 = du.u[1]; break; case GET_NIL: case GET_LIST: case PUT_NIL: case PUT_LIST: BC_X0(w) = Rd_Integer(*arg_adr); break; case GET_STRUCTURE: case PUT_STRUCTURE: nb_word = 2; BC_Fun(w) = BC_Arg_Func_Arity(*arg_adr++, (int *) &w1); BC_X0(w) = Rd_Integer(*arg_adr); break; case PUT_VOID: BC_X0(w) = Rd_Integer(*arg_adr); break; case UNIFY_X_VARIABLE: case UNIFY_X_VALUE: case UNIFY_X_LOCAL_VALUE: case CUT_X: BC_XY(w) = BC_Arg_X_Or_Y(*arg_adr, &op); break; case UNIFY_ATOM: BC_Atm(w) = Rd_Atom(*arg_adr); break; case UNIFY_INTEGER: w1 = Rd_Integer(*arg_adr++); if (Fit_In_16bits(w1)) BC_Int(w) = w1; else { op++; nb_word = 2; } break; case UNIFY_STRUCTURE: BC_Fun(w) = BC_Arg_Func_Arity(*arg_adr++, (int *) &w1); BC_Ari(w) = w1; break; case UNIFY_VOID: case ALLOCATE: BC_Int(w) = Rd_Integer(*arg_adr); break; case CALL: case EXECUTE: BC_Fun(w) = func = BC_Arg_Func_Arity(*arg_adr++, &arity); BC_Ari(w) = arity; pred = Lookup_Pred(func, arity); if (pred && (pred->prop & MASK_PRED_NATIVE_CODE)) { op++; #if WORD_SIZE == 32 nb_word = 2; w1 = (unsigned) (pred->codep); #else nb_word = 3; pu.p = (int *) (pred->codep); w1 = pu.u[0]; w2 = pu.u[1]; #endif } else { nb_word = 2; w1 = (unsigned) Functor_Arity(caller_func, caller_arity); } break; } BC_Op(w) = op; *bc_sp++ = w; if (nb_word >= 2) { bc_sp->word = w1; bc_sp++; if (nb_word >= 3) { bc_sp->word = w2; bc_sp++; } } #ifdef DEBUG DBGPRINTF(" op: %3d bc: %10.10x ", op, w.word); if (nb_word >= 2) DBGPRINTF("%10.10x ", w1); else DBGPRINTF(" "); if (nb_word >= 3) DBGPRINTF("%10.10x ", w2); else DBGPRINTF(" "); Write_Simple(inst_word); DBGPRINTF("\n"); #endif } /*-------------------------------------------------------------------------* * BC_ARG_X_OR_Y * * * *-------------------------------------------------------------------------*/ static int BC_Arg_X_Or_Y(WamWord arg_word, int *op) { WamWord word, tag_mask; WamWord *adr; DEREF(arg_word, word, tag_mask); adr = UnTag_STC(word); if (Functor(adr) != ATOM_CHAR('x')) (*op)++; /* +1 for op when Y is involved */ return Rd_Integer(Arg(adr, 0)); } /*-------------------------------------------------------------------------* * BC_ARG_FUNC_ARITY * * * *-------------------------------------------------------------------------*/ static int BC_Arg_Func_Arity(WamWord arg_word, int *arity) { WamWord word, tag_mask; WamWord *stc_adr; DEREF(arg_word, word, tag_mask); /* functor/arity */ stc_adr = UnTag_STC(word); DEREF(Arg(stc_adr, 1), word, tag_mask); /* arity */ *arity = UnTag_INT(word); DEREF(Arg(stc_adr, 0), word, tag_mask); /* functor */ return UnTag_ATM(word); } /*-------------------------------------------------------------------------* * Part II. Byte-Code emulation * * * *-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------* * BC_CALL_TERMINAL_PRED_3 * * * *-------------------------------------------------------------------------*/ WamCont BC_Call_Terminal_Pred_3(WamWord pred_word, WamWord call_info_word, WamWord first_call_word) { int func, arity; WamWord *arg_adr; PredInf *pred; int i; arg_adr = Rd_Callable_Check(pred_word, &func, &arity); debug_call = (call_info_word & (1 << TAG_SIZE_LOW)) != 0; if (debug_call_code != NULL && debug_call && (first_call_word & (1 << TAG_SIZE_LOW))) { A(0) = pred_word; A(1) = call_info_word; return debug_call_code; } pred = Lookup_Pred(func, arity); if (pred == NULL) { /* case: fail/0 from '$call_from_debugger' */ if (func != atom_fail || arity != 0) { Call_Info_Bip_Name_1(call_info_word); Unknown_Pred_Error(func, arity); } return ALTB(B); /* i.e. fail */ } for (i = 0; i < arity; i++) A(i) = *arg_adr++; if (pred->prop & MASK_PRED_NATIVE_CODE) /* native code */ return (WamCont) (pred->codep); return BC_Emulate_Pred(func, (DynPInf *) (pred->dyn)); } /*-------------------------------------------------------------------------* * BC_EMULATE_PRED * * * *-------------------------------------------------------------------------*/ WamCont BC_Emulate_Pred(int func, DynPInf *dyn) { DynCInf *clause; WamCont codep; int arity; start: if (dyn == NULL) goto fail; arity = dyn->arity; Load_Cut_Level(&A(arity)); /* init cut register */ A(arity + 1) = debug_call; clause = Scan_Dynamic_Pred(func, arity, dyn, A(0), (long (*)()) BC_Emulate_Pred_Alt, DYN_ALT_FCT_FOR_JUMP, arity + 2, &A(0)); if (clause == NULL) goto fail; codep = BC_Emulate_Clause(clause); if (codep) return (codep); func = glob_func; dyn = glob_dyn; goto start; fail: return ALTB(B); } /*-------------------------------------------------------------------------* * BC_EMULATE_PRED_ALT * * * *-------------------------------------------------------------------------*/ static WamCont BC_Emulate_Pred_Alt(DynCInf *clause, WamWord *w) { DynPInf *dyn; int arity; WamCont codep; WamWord *adr; dyn = clause->dyn; arity = dyn->arity; adr = &A(0); do *adr++ = *w++; while (--arity >= 0); /* >=0 to also restore cut register */ debug_call = *w; codep = BC_Emulate_Clause(clause); return (codep) ? codep : BC_Emulate_Pred(glob_func, glob_dyn); } /*-------------------------------------------------------------------------* * BC_EMULATE_CLAUSE * * * *-------------------------------------------------------------------------*/ static WamCont BC_Emulate_Clause(DynCInf *clause) { WamWord head_word, body_word; WamWord *arg_adr; BCWord *bc; int func, arity; int i; bc = (BCWord *) clause->byte_code; if (bc) /* emulated code */ return BC_Emulate_Byte_Code(bc); /* interpreted code */ Copy_Clause_To_Heap(clause, &head_word, &body_word); arg_adr = Rd_Callable_Check(head_word, &func, &arity); for (i = 0; i < arity; i++) /* head unification */ if (!Unify(A(i), *arg_adr++)) goto fail; A(2) = A(arity); /* before since pb with cut if arity <= 1 */ A(0) = body_word; A(1) = Tag_INT(Call_Info(func, arity, debug_call)); return (CodePtr) Prolog_Predicate(CALL_INTERNAL_WITH_CUT, 3); fail: return ALTB(B); } /*-------------------------------------------------------------------------* * BC_EMULATE_BYTE_CODE * * * *-------------------------------------------------------------------------*/ static WamCont BC_Emulate_Byte_Code(BCWord *bc) { BCWord w; int x0, x, y; int w1; WamCont codep; int func, arity; PredInf *pred; DblUns du; bc_loop: w = *bc++; switch (BC_Op(w)) { case GET_X_VARIABLE: x0 = BC_X0(w); x = BC_XY(w); X(x) = X(x0); goto bc_loop; case GET_Y_VARIABLE: x0 = BC_X0(w); y = BC_XY(w); Y(E, y) = X(x0); goto bc_loop; case GET_X_VALUE: x0 = BC_X0(w); x = BC_XY(w); if (!Unify(X(x), X(x0))) goto fail; goto bc_loop; case GET_Y_VALUE: x0 = BC_X0(w); y = BC_XY(w); if (!Unify(Y(E, y), X(x0))) goto fail; goto bc_loop; case GET_ATOM: x0 = BC_X0(w); if (!Get_Atom(BC_Atm(w), X(x0))) goto fail; goto bc_loop; case GET_INTEGER: x0 = BC_X0(w); if (!Get_Integer(BC_Int(w), X(x0))) goto fail; goto bc_loop; case GET_INTEGER_BIG: x0 = BC_X0(w); w1 = bc->word; bc++; if (!Get_Integer(w1, X(x0))) goto fail; goto bc_loop; case GET_FLOAT: x0 = BC_X0(w); du.u[0] = bc->word; bc++; du.u[1] = bc->word; bc++; if (!Get_Float(du.d, X(x0))) goto fail; goto bc_loop; case GET_NIL: x0 = BC_X0(w); if (!Get_Nil(X(x0))) goto fail; goto bc_loop; case GET_LIST: x0 = BC_X0(w); if (!Get_List(X(x0))) goto fail; goto bc_loop; case GET_STRUCTURE: x0 = BC_X0(w); func = BC_Fun(w); arity = bc->word; bc++; if (!Get_Structure(func, arity, X(x0))) goto fail; goto bc_loop; case PUT_X_VARIABLE: x0 = BC_X0(w); x = BC_XY(w); X(x) = X(x0) = Put_X_Variable(); goto bc_loop; case PUT_Y_VARIABLE: x0 = BC_X0(w); y = BC_XY(w); X(x0) = Put_Y_Variable(&Y(E, y)); goto bc_loop; case PUT_VOID: x0 = BC_X0(w); X(x0) = Put_X_Variable(); goto bc_loop; case PUT_X_VALUE: x0 = BC_X0(w); x = BC_XY(w); X(x0) = X(x); goto bc_loop; case PUT_Y_VALUE: x0 = BC_X0(w); y = BC_XY(w); X(x0) = Y(E, y); goto bc_loop; case PUT_Y_UNSAFE_VALUE: x0 = BC_X0(w); y = BC_XY(w); X(x0) = Put_Unsafe_Value(Y(E, y)); goto bc_loop; case PUT_ATOM: x0 = BC_X0(w); X(x0) = Put_Atom(BC_Atm(w)); goto bc_loop; case PUT_INTEGER: x0 = BC_X0(w); X(x0) = Put_Integer(BC_Int(w)); goto bc_loop; case PUT_INTEGER_BIG: x0 = BC_X0(w); w1 = bc->word; bc++; X(x0) = Put_Integer(w1); goto bc_loop; case PUT_FLOAT: x0 = BC_X0(w); du.u[0] = bc->word; bc++; du.u[1] = bc->word; bc++; X(x0) = Put_Float(du.d); goto bc_loop; case PUT_NIL: x0 = BC_X0(w); X(x0) = NIL_WORD; /* faster than Put_Nil() */ goto bc_loop; case PUT_LIST: x0 = BC_X0(w); X(x0) = Put_List(); goto bc_loop; case PUT_STRUCTURE: x0 = BC_X0(w); func = BC_Fun(w); arity = bc->word; bc++; X(x0) = Put_Structure(func, arity); goto bc_loop; case MATH_LOAD_X_VALUE: x0 = BC_X0(w); x = BC_XY(w); Math_Load_Value(X(x), &X(x0)); goto bc_loop; case MATH_LOAD_Y_VALUE: x0 = BC_X0(w); y = BC_XY(w); Math_Load_Value(Y(E, y), &X(x0)); goto bc_loop; case UNIFY_X_VARIABLE: x = BC_XY(w); X(x) = Unify_Variable(); goto bc_loop; case UNIFY_Y_VARIABLE: y = BC_XY(w); Y(E, y) = Unify_Variable(); goto bc_loop; case UNIFY_VOID: Unify_Void(BC_Int(w)); goto bc_loop; case UNIFY_X_VALUE: x = BC_XY(w); if (!Unify_Value(X(x))) goto fail; goto bc_loop; case UNIFY_Y_VALUE: y = BC_XY(w); if (!Unify_Value(Y(E, y))) goto fail; goto bc_loop; case UNIFY_X_LOCAL_VALUE: x = BC_XY(w); if (!Unify_Local_Value(X(x))) goto fail; goto bc_loop; case UNIFY_Y_LOCAL_VALUE: y = BC_XY(w); if (!Unify_Local_Value(Y(E, y))) goto fail; goto bc_loop; case UNIFY_ATOM: if (!Unify_Atom(BC_Atm(w))) goto fail; goto bc_loop; case UNIFY_INTEGER: if (!Unify_Integer(BC_Int(w))) goto fail; goto bc_loop; case UNIFY_INTEGER_BIG: w1 = bc->word; bc++; if (!Unify_Integer(w1)) goto fail; goto bc_loop; case UNIFY_NIL: if (!Unify_Nil()) goto fail; goto bc_loop; case UNIFY_LIST: if (!Unify_List()) goto fail; goto bc_loop; case UNIFY_STRUCTURE: func = BC_Fun(w); arity = BC_Ari(w); if (!Unify_Structure(func, arity)) goto fail; goto bc_loop; case ALLOCATE: Allocate(BC_Int(w)); goto bc_loop; case DEALLOCATE: Deallocate(); goto bc_loop; case CALL: BCI = (WamWord) (bc + 1) | debug_call; /* use low bit of adr */ CP = Adjust_CP(Prolog_Predicate(BC_EMULATE_CONT, 0)); case EXECUTE: func = BC_Fun(w); arity = BC_Ari(w); if (debug_call_code != NULL && debug_call && Detect_If_Aux_Name(func) == NULL) { w1 = bc->word; caller_func = Functor_Of(w1); caller_arity = Arity_Of(w1); Prep_Debug_Call(func, arity, caller_func, caller_arity); return debug_call_code; } if ((pred = Lookup_Pred(func, arity)) == NULL) { w1 = bc->word; caller_func = Functor_Of(w1); caller_arity = Arity_Of(w1); Set_Bip_Name_2(Tag_ATM(caller_func), Tag_INT(caller_arity)); Unknown_Pred_Error(func, arity); goto fail; } #if 0 bc++; /* useless since CP already set */ #endif glob_func = func; glob_dyn = (DynPInf *) (pred->dyn); return NULL; /* to then call BC_Emulate_Pred */ case CALL_NATIVE: Compute_Branch_Adr(bc, codep); BCI = (WamWord) bc | debug_call; CP = Adjust_CP(Prolog_Predicate(BC_EMULATE_CONT, 0)); if (debug_call_code != NULL && debug_call) { func = BC_Fun(w); arity = BC_Ari(w); Prep_Debug_Call(func, arity, 0, 0); return debug_call_code; } return codep; case EXECUTE_NATIVE: Compute_Branch_Adr(bc, codep); if (debug_call_code != NULL && debug_call) { func = BC_Fun(w); arity = BC_Ari(w); Prep_Debug_Call(func, arity, 0, 0); return debug_call_code; } return codep; case PROCEED: return UnAdjust_CP(CP); case FAIL: if (debug_call_code != NULL && debug_call) { /* invoke the debugger that will then call fail/0 */ Prep_Debug_Call(atom_fail, 0, 0, 0); return debug_call_code; } goto fail; case CUT_X: x = BC_XY(w); Cut(X(x)); goto bc_loop; case CUT_Y: y = BC_XY(w); Cut(Y(E, y)); goto bc_loop; } fail: return ALTB(B); } /*-------------------------------------------------------------------------* * BC_EMULATE_CONT_0 * * * *-------------------------------------------------------------------------*/ WamCont BC_Emulate_Cont_0(void) { WamCont codep; BCWord *bc; debug_call = BCI & 1; bc = (BCWord *) ((BCI >> 1) << 1); codep = BC_Emulate_Byte_Code(bc); return (codep) ? codep : BC_Emulate_Pred(glob_func, glob_dyn); } /*-------------------------------------------------------------------------* * PREP_DEBUG_CALL * * * *-------------------------------------------------------------------------*/ static void Prep_Debug_Call(int func, int arity, int caller_func, int caller_arity) { int i; WamWord word; if (arity == 0) A(0) = Tag_ATM(func); else { word = Tag_STC(H); Global_Push(Functor_Arity(func, arity)); for (i = 0; i < arity; i++) Global_Push(A(i)); A(0) = word; } A(1) = Tag_INT(Call_Info(caller_func, caller_arity, debug_call)); } ./gprolog-1.3.0/src/BipsPl/write_supp.h0000644004425400513100000000541610547154141016333 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : write_supp.h * * Descr.: term writing support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: write_supp.h,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ #define WRITE_QUOTED 1 #define WRITE_IGNORE_OP 2 #define WRITE_NUMBER_VARS 4 #define WRITE_NAME_VARS 8 #define WRITE_SPACE_ARGS 16 #define WRITE_PORTRAYED 32 /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef WRITE_SUPP_FILE int last_writing; #else extern int last_writing; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Write_Term(StmInf *pstm, int depth, int prec, int mask, WamWord term_word); void Write_Simple(WamWord term_word); void Write_A_Char(StmInf *pstm, int c); char *Float_To_String(double d); int Get_Print_Stm(void); ./gprolog-1.3.0/src/BipsPl/term_supp.h0000644004425400513100000000601410547154140016142 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : term_supp.h * * Descr.: term support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: term_supp.h,v 1.11 2007/01/04 10:35:12 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef TERM_SUPP_FILE WamWord pi_name_word; WamWord pi_arity_word; long glob_dico_var[MAX_VAR_IN_TERM]; /* a general purpose dico */ #else extern WamWord pi_name_word; extern WamWord pi_arity_word; extern long glob_dico_var[]; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ long Term_Compare(WamWord start_u_word, WamWord start_v_word); Bool Is_List(WamWord start_word); Bool Is_Partial_List(WamWord start_word); Bool Is_List_Or_Partial(WamWord start_word); void Treat_Vars_Of_Term(WamWord start_word, Bool generic_var, void (*fct) ()); int List_Length(WamWord start_word); int Term_Size(WamWord start_word); void Copy_Term(WamWord *dst_adr, WamWord *src_adr); void Copy_Contiguous_Term(WamWord *dst_adr, WamWord *src_adr); int Get_Pred_Indicator(WamWord pred_indic_word, Bool must_be_ground, int *arity); ./gprolog-1.3.0/src/BipsPl/call_args.pl0000644004425400513100000000706510547162351016251 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : call_args.pl * * Descr.: meta call management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: call_args.pl,v 1.11 2007/01/04 10:35:08 diaz Exp $ */ :- built_in. '$use_call_args'. call_with_args(_F) :- '$call_c_jump'('Call_With_Args_1'). call_with_args(_F, _A1) :- '$call_c_jump'('Call_With_Args_2'). call_with_args(_F, _A1, _A2) :- '$call_c_jump'('Call_With_Args_3'). call_with_args(_F, _A1, _A2, _A3) :- '$call_c_jump'('Call_With_Args_4'). call_with_args(_F, _A1, _A2, _A3, _A4) :- '$call_c_jump'('Call_With_Args_5'). call_with_args(_F, _A1, _A2, _A3, _A4, _A5) :- '$call_c_jump'('Call_With_Args_6'). call_with_args(_F, _A1, _A2, _A3, _A4, _A5, _A6) :- '$call_c_jump'('Call_With_Args_7'). call_with_args(_F, _A1, _A2, _A3, _A4, _A5, _A6, _A7) :- '$call_c_jump'('Call_With_Args_8'). call_with_args(_F, _A1, _A2, _A3, _A4, _A5, _A6, _A7, _A8) :- '$call_c_jump'('Call_With_Args_9'). call_with_args(_F, _A1, _A2, _A3, _A4, _A5, _A6, _A7, _A8, _A9) :- '$call_c_jump'('Call_With_Args_10'). call_with_args(_F, _A1, _A2, _A3, _A4, _A5, _A6, _A7, _A8, _A9, _A10) :- '$call_c_jump'('Call_With_Args_11'). call(_Closure, _A1) :- '$call_c_jump'('Call_2'). call(_Closure, _A1, _A2) :- '$call_c_jump'('Call_3'). call(_Closure, _A1, _A2, _A3) :- '$call_c_jump'('Call_4'). call(_Closure, _A1, _A2, _A3, _A4) :- '$call_c_jump'('Call_5'). call(_Closure, _A1, _A2, _A3, _A4) :- '$call_c_jump'('Call_5'). call(_Closure, _A1, _A2, _A3, _A4, _A5) :- '$call_c_jump'('Call_6'). call(_Closure, _A1, _A2, _A3, _A4, _A5, _A6) :- '$call_c_jump'('Call_7'). call(_Closure, _A1, _A2, _A3, _A4, _A5, _A6, _A7) :- '$call_c_jump'('Call_8'). call(_Closure, _A1, _A2, _A3, _A4, _A5, _A6, _A7, _A8) :- '$call_c_jump'('Call_9'). call(_Closure, _A1, _A2, _A3, _A4, _A5, _A6, _A7, _A8, _A9) :- '$call_c_jump'('Call_10'). call(_Closure, _A1, _A2, _A3, _A4, _A5, _A6, _A7, _A8, _A9, _A10) :- '$call_c_jump'('Call_11'). ./gprolog-1.3.0/src/BipsPl/sockets.pl0000644004425400513100000000661310547162353015775 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : sockets.pl * * Descr.: sockets management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: sockets.pl,v 1.11 2007/01/04 10:35:11 diaz Exp $ */ :- built_in. '$use_sockets'. socket(Domain, Socket) :- set_bip_name(socket, 2), '$call_c_test'('Socket_2'(Domain, Socket)). socket_close(Socket) :- set_bip_name(socket_close, 1), '$call_c_test'('Socket_Close_1'(Socket)). socket_bind(Socket, Address) :- set_bip_name(socket_bind, 2), '$call_c_test'('Socket_Bind_2'(Socket, Address)). socket_connect(Socket, Address, StreamIn, StreamOut) :- set_bip_name(socket_connect, 4), '$get_open_stm'(StreamIn, StmIn), '$get_open_stm'(StreamOut, StmOut), '$call_c_test'('Socket_Connect_4'(Socket, Address, StmIn, StmOut)). socket_listen(Socket, Length) :- set_bip_name(socket_listen, 2), '$call_c_test'('Socket_Listen_2'(Socket, Length)). socket_accept(Socket, StreamIn, StreamOut) :- set_bip_name(socket_accept, 3), '$get_open_stm'(StreamIn, StmIn), '$get_open_stm'(StreamOut, StmOut), '$call_c_test'('Socket_Accept_4'(Socket, _, StmIn, StmOut)). socket_accept(Socket, Client, StreamIn, StreamOut) :- set_bip_name(socket_accept, 4), ( var(Client) -> true ; '$pl_err_type'(variable, Client) ), '$get_open_stm'(StreamIn, StmIn), '$get_open_stm'(StreamOut, StmOut), '$call_c_test'('Socket_Accept_4'(Socket, Client, StmIn, StmOut)). '$assoc_socket_streams'(Socket, StreamIn, StreamOut) :- set_bip_name('$assoc_socket_streams', 3), '$get_open_stm'(StreamIn, StmIn), '$get_open_stm'(StreamOut, StmOut), '$call_c_test'('Assoc_Socket_Streams_3'(Socket, StmIn, StmOut)). hostname_address(HostName, HostAddress) :- set_bip_name(hostname_address, 2), '$call_c_test'('Hostname_Address_2'(HostName, HostAddress)). ./gprolog-1.3.0/src/BipsPl/char_io.pl0000644004425400513100000001075610547162351015727 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : char_io.pl * * Descr.: character input-output management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: char_io.pl,v 1.12 2007/01/04 10:35:08 diaz Exp $ */ :- built_in. '$use_char_io'. get_key(Code) :- set_bip_name(get_key, 1), '$call_c_test'('Get_Key_1'(Code)). get_key(SorA, Code) :- set_bip_name(get_key, 2), '$call_c_test'('Get_Key_2'(SorA, Code)). get_key_no_echo(Code) :- set_bip_name(get_key_no_echo, 1), '$call_c_test'('Get_Key_No_Echo_1'(Code)). get_key_no_echo(SorA, Code) :- set_bip_name(get_key_no_echo, 2), '$call_c_test'('Get_Key_No_Echo_2'(SorA, Code)). % get predicates get_char(Char) :- set_bip_name(get_char, 1), '$call_c_test'('Get_Char_1'(Char)). get_char(SorA, Char) :- set_bip_name(get_char, 2), '$call_c_test'('Get_Char_2'(SorA, Char)). get_code(Code) :- set_bip_name(get_code, 1), '$call_c_test'('Get_Code_1'(Code)). get_code(SorA, Code) :- set_bip_name(get_code, 2), '$call_c_test'('Get_Code_2'(SorA, Code)). get_byte(Byte) :- set_bip_name(get_byte, 1), '$call_c_test'('Get_Byte_1'(Byte)). get_byte(SorA, Byte) :- set_bip_name(get_byte, 2), '$call_c_test'('Get_Byte_2'(SorA, Byte)). % unget predicates unget_char(Char) :- set_bip_name(unget_char, 1), '$call_c'('Unget_Char_1'(Char)). unget_char(SorA, Char) :- set_bip_name(unget_char, 2), '$call_c'('Unget_Char_2'(SorA, Char)). unget_code(Code) :- set_bip_name(unget_code, 1), '$call_c'('Unget_Code_1'(Code)). unget_code(SorA, Code) :- set_bip_name(unget_code, 2), '$call_c'('Unget_Code_2'(SorA, Code)). unget_byte(Byte) :- set_bip_name(unget_byte, 1), '$call_c'('Unget_Byte_1'(Byte)). unget_byte(SorA, Byte) :- set_bip_name(unget_byte, 2), '$call_c'('Unget_Byte_2'(SorA, Byte)). % peek predicates peek_char(Char) :- set_bip_name(peek_char, 1), '$call_c_test'('Peek_Char_1'(Char)). peek_char(SorA, Char) :- set_bip_name(peek_char, 2), '$call_c_test'('Peek_Char_2'(SorA, Char)). peek_code(Code) :- set_bip_name(peek_code, 1), '$call_c_test'('Peek_Code_1'(Code)). peek_code(SorA, Code) :- set_bip_name(peek_code, 2), '$call_c_test'('Peek_Code_2'(SorA, Code)). peek_byte(Byte) :- set_bip_name(peek_byte, 1), '$call_c_test'('Peek_Byte_1'(Byte)). peek_byte(SorA, Byte) :- set_bip_name(peek_byte, 2), '$call_c_test'('Peek_Byte_2'(SorA, Byte)). % put predicates put_char(Char) :- set_bip_name(put_char, 1), '$call_c'('Put_Char_1'(Char)). put_char(SorA, Char) :- set_bip_name(put_char, 2), '$call_c'('Put_Char_2'(SorA, Char)). put_code(Code) :- set_bip_name(put_code, 1), '$call_c'('Put_Code_1'(Code)). put_code(SorA, Code) :- set_bip_name(put_code, 2), '$call_c'('Put_Code_2'(SorA, Code)). put_byte(Byte) :- set_bip_name(put_byte, 1), '$call_c'('Put_Byte_1'(Byte)). put_byte(SorA, Byte) :- set_bip_name(put_byte, 2), '$call_c'('Put_Byte_2'(SorA, Byte)). ./gprolog-1.3.0/src/BipsPl/write_supp.c0000644004425400513100000005626510547154141016336 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : write_supp.c * * Descr.: write term support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: write_supp.c,v 1.15 2007/01/04 10:35:13 diaz Exp $ */ #include #include #define OBJ_INIT Write_Supp_Initializer #define WRITE_SUPP_FILE #include "engine_pl.h" #include "bips_pl.h" /* spaces for non-assoc op (fx, xfx, xf) */ #if 0 #define SPACE_ARGS_RESTRICTED #endif /* spaces around the | inside lists */ #if 0 #define SPACE_ARGS_FOR_LIST_PIPE #endif /*---------------------------------* * Constants * *---------------------------------*/ #define W_NOTHING 0 /* for last_writing */ #define W_NUMBER 1 #define W_IDENTIFIER 2 #define W_QUOTED 3 #define W_GRAPHIC 4 #define W_NO_PREFIX_OP 0 /* for last_prefix_op */ #define W_PREFIX_OP_ANY 1 #define W_PREFIX_OP_MINUS 2 #define GENERAL_TERM 0 #define INSIDE_LEFT_ASSOC_OP 2 #define INSIDE_ANY_OP 1 /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static WamWord curly_brackets_1; static WamWord dollar_var_1; static WamWord dollar_varname_1; static int atom_dots; static StmInf *pstm_o; static Bool quoted; static Bool ignore_op; static Bool number_vars; static Bool name_vars; static Bool space_args; static Bool portrayed; static int last_prefix_op = W_NO_PREFIX_OP; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Need_Space(int c); static void Out_Space(void); static void Out_Char(int c); static void Out_String(char *str); static void Show_Term(int depth, int prec, int context, WamWord term_word); static void Show_Global_Var(WamWord *adr); static void Show_Atom(int context, int atom); static void Show_Integer(long x); #ifndef NO_USE_FD_SOLVER static void Show_Fd_Variable(WamWord *fdv_adr); #endif static void Show_Float(double x); static void Show_List_Arg(int depth, WamWord *lst_adr); static void Show_Structure(int depth, int prec, int context, WamWord *stc_adr); static Bool Try_Portray(WamWord word); /*-------------------------------------------------------------------------* * WRITE_SUPP_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Write_Supp_Initializer(void) { atom_dots = Create_Atom("..."); curly_brackets_1 = Functor_Arity(atom_curly_brackets, 1); dollar_var_1 = Functor_Arity(Create_Atom("$VAR"), 1); dollar_varname_1 = Functor_Arity(Create_Atom("$VARNAME"), 1); } /*-------------------------------------------------------------------------* * WRITE_TERM * * * *-------------------------------------------------------------------------*/ void Write_Term(StmInf *pstm, int depth, int prec, int mask, WamWord term_word) { pstm_o = pstm; quoted = mask & WRITE_QUOTED; ignore_op = mask & WRITE_IGNORE_OP; number_vars = mask & WRITE_NUMBER_VARS; name_vars = mask & WRITE_NAME_VARS; space_args = mask & WRITE_SPACE_ARGS; portrayed = mask & WRITE_PORTRAYED; last_writing = W_NOTHING; Show_Term(depth, prec, GENERAL_TERM, term_word); } /*-------------------------------------------------------------------------* * WRITE_SIMPLE * * * *-------------------------------------------------------------------------*/ void Write_Simple(WamWord term_word) { StmInf *pstm = stm_tbl[stm_output]; Write_Term(pstm, -1, MAX_PREC, WRITE_NUMBER_VARS | WRITE_NAME_VARS, term_word); /* like write/1 */ } /*-------------------------------------------------------------------------* * OUT_SPACE * * * *-------------------------------------------------------------------------*/ static void Out_Space(void) { Stream_Putc(' ', pstm_o); last_writing = W_NOTHING; } /*-------------------------------------------------------------------------* * OUT_CHAR * * * *-------------------------------------------------------------------------*/ static void Out_Char(int c) { Need_Space(c); Stream_Putc(c, pstm_o); } /*-------------------------------------------------------------------------* * OUT_STRING * * * *-------------------------------------------------------------------------*/ static void Out_String(char *str) { Need_Space(*str); Stream_Puts(str, pstm_o); } /*-------------------------------------------------------------------------* * NEED_SPACE * * * *-------------------------------------------------------------------------*/ static void Need_Space(int c) { int c_type = char_type[c]; int space; switch (last_writing) { case W_NUMBER: space = (c_type & (UL | CL | SL | DI)) || c == '.'; break; case W_IDENTIFIER: space = (c_type & (UL | CL | SL | DI)) || c == '[' || c == '{'; break; case W_QUOTED: space = (c_type == QT); break; case W_GRAPHIC: space = (c_type == GR); break; default: space = FALSE; } if (space || (c == '(' && last_prefix_op) || (c_type == DI && last_prefix_op == W_PREFIX_OP_MINUS)) Stream_Putc(' ', pstm_o); last_prefix_op = W_NO_PREFIX_OP; last_writing = W_NOTHING; } /*-------------------------------------------------------------------------* * WRITE_A_CHAR * * * *-------------------------------------------------------------------------*/ void Write_A_Char(StmInf *pstm, int c) { pstm_o = pstm; Out_Char(c); } /*-------------------------------------------------------------------------* * FLOAT_TO_STRING * * * *-------------------------------------------------------------------------*/ char * Float_To_String(double d) { char *p, *q, *e; static char buff[32]; sprintf(buff, "%#.17g", d); /* a . with 16 significant digits */ p = buff; /* skip leading blanks */ while (*p == ' ') p++; if (p != buff) /* remove leading blanks */ { q = buff; while ((*q++ = *p++)) ; } p = strchr(buff, '.'); if (p == NULL) /* if p==NULL then NaN or +/-inf (ignore) */ return buff; if (p[1] == '\0') /* a dot but no decimal numbers */ { strcat(buff, "0"); return buff; } e = strchr(buff, 'e'); /* search exposant part */ if (e == NULL) e = buff + strlen(buff); p = e - 1; while (*p == '0') p--; q = (*p == '.') ? p + 2 : p + 1; /* but keep at least one 0 */ if (q != e) while ((*q++ = *e++)) /* move exposant part */ ; return buff; } /*-------------------------------------------------------------------------* * SHOW_TERM * * * *-------------------------------------------------------------------------*/ static void Show_Term(int depth, int prec, int context, WamWord term_word) { WamWord word, tag_mask; WamWord *adr; if (depth == 0) { Show_Atom(GENERAL_TERM, atom_dots); return; } DEREF(term_word, word, tag_mask); if (tag_mask != TAG_REF_MASK && Try_Portray(word)) return; switch (Tag_From_Tag_Mask(tag_mask)) { case REF: adr = UnTag_REF(word); if (Is_A_Local_Adr(adr)) { Globalize_Local_Unbound_Var(adr, word); adr = UnTag_REF(word); } Show_Global_Var(adr); break; case ATM: Show_Atom(context, UnTag_ATM(word)); break; #ifndef NO_USE_FD_SOLVER case FDV: Show_Fd_Variable(UnTag_FDV(word)); break; #endif case INT: Show_Integer(UnTag_INT(word)); break; case FLT: Show_Float(Obtain_Float(UnTag_FLT(word))); break; case LST: adr = UnTag_LST(word); if (ignore_op) { Out_String("'.'("); Show_Term(depth - 1, MAX_ARG_OF_FUNCTOR_PREC, GENERAL_TERM, Car(adr)); Out_Char(','); Show_Term(depth - 1, MAX_ARG_OF_FUNCTOR_PREC, GENERAL_TERM, Cdr(adr)); Out_Char(')'); } else { Out_Char('['); Show_List_Arg(depth, adr); Out_Char(']'); } break; case STC: adr = UnTag_STC(word); Show_Structure(depth, prec, context, adr); break; } } /*-------------------------------------------------------------------------* * SHOW_GLOBAL_VAR * * * *-------------------------------------------------------------------------*/ static void Show_Global_Var(WamWord *adr) { char str[32]; sprintf(str, "_%d", (int) Global_Offset(adr)); Out_String(str); last_writing = W_IDENTIFIER; } /*-------------------------------------------------------------------------* * SHOW_ATOM * * * *-------------------------------------------------------------------------*/ static void Show_Atom(int context, int atom) { char *p, *q; char str[32]; Bool bracket = FALSE; int c, c_type; AtomProp prop; prop = atom_tbl[atom].prop; if (context != GENERAL_TERM && Check_Oper_Any_Type(atom)) { Out_Char('('); bracket = TRUE; } if (!quoted || !prop.needs_quote) { Out_String(atom_tbl[atom].name); switch (prop.type) { case IDENTIFIER_ATOM: last_writing = W_IDENTIFIER; break; case GRAPHIC_ATOM: last_writing = W_GRAPHIC; break; case SOLO_ATOM: last_writing = W_NOTHING; break; case OTHER_ATOM: c = atom_tbl[atom].name[prop.length - 1]; c_type = char_type[c]; if (c_type & (UL | CL | SL | DI)) last_writing = W_IDENTIFIER; else if (c == '\'') last_writing = W_QUOTED; else if (c_type == GR) last_writing = W_GRAPHIC; else last_writing = W_NOTHING; } } else { Out_Char('\''); if (prop.needs_scan) { for (p = atom_tbl[atom].name; *p; p++) if ((q = (char *) strchr(escape_char, *p))) { Out_Char('\\'); Out_Char(escape_symbol[q - escape_char]); } else if (*p == '\'' || *p == '\\') /* display twice */ { Out_Char(*p); Out_Char(*p); } else if (!isprint(*p)) { sprintf(str, "\\x%x\\", (unsigned) (unsigned char) *p); Out_String(str); } else Out_Char(*p); } else Out_String(atom_tbl[atom].name); Out_Char('\''); last_writing = W_QUOTED; } if (bracket) Out_Char(')'); } /*-------------------------------------------------------------------------* * SHOW_INTEGER * * * *-------------------------------------------------------------------------*/ static void Show_Integer(long x) { char str[32]; sprintf(str, "%ld", x); Out_String(str); last_writing = W_NUMBER; } #ifndef NO_USE_FD_SOLVER /*-------------------------------------------------------------------------* * SHOW_FD_VARIABLE * * * *-------------------------------------------------------------------------*/ static void Show_Fd_Variable(WamWord *fdv_adr) { char str[32]; sprintf(str, "_#%d(", (int) Cstr_Offset(fdv_adr)); Out_String(str); Out_String(Fd_Variable_To_String(fdv_adr)); Out_Char(')'); last_writing = W_IDENTIFIER; } #endif /*-------------------------------------------------------------------------* * SHOW_FLOAT * * * *-------------------------------------------------------------------------*/ static void Show_Float(double x) { Out_String(Float_To_String(x)); last_writing = W_NUMBER; } /*-------------------------------------------------------------------------* * SHOW_LIST_ARG * * * *-------------------------------------------------------------------------*/ #ifdef SPACE_ARGS_FOR_LIST_PIPE #define SHOW_LIST_PIPE if (space_args) Out_String(" | "); else Out_Char('|') #else #define SHOW_LIST_PIPE Out_Char('|') #endif static void Show_List_Arg(int depth, WamWord *lst_adr) { WamWord word, tag_mask; terminal_rec: depth--; Show_Term(depth, MAX_ARG_OF_FUNCTOR_PREC, GENERAL_TERM, Car(lst_adr)); if (depth == 0) /* dots already written by Show_Term */ return; DEREF(Cdr(lst_adr), word, tag_mask); switch (Tag_From_Tag_Mask(tag_mask)) { case REF: SHOW_LIST_PIPE; Show_Global_Var(UnTag_REF(word)); break; case ATM: if (word != NIL_WORD) { SHOW_LIST_PIPE; if (Try_Portray(word)) return; Show_Atom(GENERAL_TERM, UnTag_ATM(word)); } break; #ifndef NO_USE_FD_SOLVER case FDV: SHOW_LIST_PIPE; if (Try_Portray(word)) return; Show_Fd_Variable(UnTag_FDV(word)); break; #endif case INT: SHOW_LIST_PIPE; if (Try_Portray(word)) return; Show_Integer(UnTag_INT(word)); break; case FLT: SHOW_LIST_PIPE; if (Try_Portray(word)) return; Show_Float(Obtain_Float(UnTag_FLT(word))); break; case LST: Out_Char(','); if (space_args) Out_Space(); lst_adr = UnTag_LST(word); goto terminal_rec; break; case STC: SHOW_LIST_PIPE; if (Try_Portray(word)) return; Show_Structure(depth, MAX_ARG_OF_FUNCTOR_PREC, GENERAL_TERM, UnTag_STC(word)); break; } } /*-------------------------------------------------------------------------* * SHOW_STRUCTURE * * * *-------------------------------------------------------------------------*/ static void Show_Structure(int depth, int prec, int context, WamWord *stc_adr) { WamWord word, tag_mask; WamWord *adr; WamWord f_n = Functor_And_Arity(stc_adr); int functor = Functor(stc_adr); int arity = Arity(stc_adr); OperInf *oper; int nb_args_to_disp; int i, j, n; char str[32]; Bool bracket; Bool surround_space; depth--; if (name_vars && f_n == dollar_varname_1) { DEREF(Arg(stc_adr, 0), word, tag_mask); if (tag_mask == TAG_ATM_MASK) { Out_String(atom_tbl[UnTag_ATM(word)].name); last_writing = W_IDENTIFIER; return; } } if (number_vars && f_n == dollar_var_1) { DEREF(Arg(stc_adr, 0), word, tag_mask); if (tag_mask == TAG_INT_MASK && (n = UnTag_INT(word)) >= 0) { i = n % 26; j = n / 26; Out_Char('A' + i); if (j) { sprintf(str, "%d", j); Out_String(str); } last_writing = W_IDENTIFIER; return; } } if (ignore_op || arity > 2) goto functional; if (f_n == curly_brackets_1) { Out_Char('{'); if (space_args) Out_Space(); Show_Term(depth, MAX_PREC, GENERAL_TERM, Arg(stc_adr, 0)); if (space_args) Out_Space(); Out_Char('}'); return; } bracket = FALSE; if (arity == 1 && (oper = Lookup_Oper(functor, PREFIX))) { #if 1 /* Koen de Bosschere says "in case of ambiguity : */ /* select the associative operator over the nonassociative */ /* select prefix over postfix". */ OperInf *oper1; if (oper->prec > oper->right && (oper1 = Lookup_Oper(functor, POSTFIX)) && oper1->left == oper1->prec) { oper = oper1; goto postfix; } #endif if (oper->prec > prec || (context == INSIDE_LEFT_ASSOC_OP && (oper->prec == oper->right && oper->prec == prec))) { /* prevent also the case: fy T yf(x) */ Out_Char('('); bracket = TRUE; } Show_Atom(GENERAL_TERM, functor); last_prefix_op = W_PREFIX_OP_ANY; if (space_args #if SPACE_ARGS_RESTRICTED /* space_args -> space after fx operator */ && oper->prec > oper->right #endif ) Out_Space(); else if (strcmp(atom_tbl[functor].name, "-") == 0) last_prefix_op = W_PREFIX_OP_MINUS; Show_Term(depth, oper->right, INSIDE_ANY_OP, Arg(stc_adr, 0)); last_prefix_op = W_NO_PREFIX_OP; if (bracket) Out_Char(')'); return; } if (arity == 1 && (oper = Lookup_Oper(functor, POSTFIX))) { postfix: if (oper->prec > prec) { Out_Char('('); bracket = TRUE; } context = (oper->left == oper->prec) ? INSIDE_LEFT_ASSOC_OP : INSIDE_ANY_OP; Show_Term(depth, oper->left, context, Arg(stc_adr, 0)); if (space_args #if SPACE_ARGS_RESTRICTED /* space_args -> space before xf operator */ && oper->prec > oper->left #endif ) Out_Space(); Show_Atom(GENERAL_TERM, functor); if (bracket) Out_Char(')'); return; } if (arity == 2 && (oper = Lookup_Oper(functor, INFIX))) { if (oper->prec > prec || (context == INSIDE_LEFT_ASSOC_OP && (oper->prec == oper->right && oper->prec == prec))) { /* prevent also the case: T xfy U yf(x) */ Out_Char('('); bracket = TRUE; } context = (oper->left == oper->prec) ? INSIDE_LEFT_ASSOC_OP : INSIDE_ANY_OP; Show_Term(depth, oper->left, context, Arg(stc_adr, 0)); if (functor == ATOM_CHAR(',')) { Out_Char(','); if (space_args) Out_Space(); } else { surround_space = FALSE; if (atom_tbl[functor].prop.type == IDENTIFIER_ATOM || atom_tbl[functor].prop.type == OTHER_ATOM || (space_args #ifdef SPACE_ARGS_RESTRICTED /* space_args -> space around xfx operators */ && oper->left != oper->prec && oper->right != oper->prec #endif )) { surround_space = TRUE; Out_Space(); } Show_Atom(GENERAL_TERM, functor); if (surround_space) Out_Space(); } Show_Term(depth, oper->right, INSIDE_ANY_OP, Arg(stc_adr, 1)); if (bracket) Out_Char(')'); return; } functional: /* functional notation */ Show_Atom(GENERAL_TERM, functor); Out_Char('('); nb_args_to_disp = i = (arity < depth + 1 || depth < 0) ? arity : depth + 1; adr = &Arg(stc_adr, 0); goto start_display; do { Out_Char(','); if (space_args) Out_Space(); start_display: Show_Term(depth, MAX_ARG_OF_FUNCTOR_PREC, GENERAL_TERM, *adr++); } while (--i); if (arity != nb_args_to_disp) { Out_Char(','); if (space_args) Out_Space(); Show_Atom(GENERAL_TERM, atom_dots); } Out_Char(')'); } /*-------------------------------------------------------------------------* * TRY_PORTRAY * * * *-------------------------------------------------------------------------*/ static Bool Try_Portray(WamWord word) { #ifdef FOR_EXTERNAL_USE return FALSE; #else PredInf *pred; StmInf *print_pstm_o; Bool print_quoted; Bool print_ignore_op; Bool print_number_vars; Bool print_name_vars; Bool print_space_args; Bool print_portrayed; Bool print_ok; static CodePtr try_portray_code = NULL; if (!portrayed) return FALSE; if (try_portray_code == NULL) { pred = Lookup_Pred(Create_Atom("$try_portray"), 1); if (pred == NULL || pred->codep == NULL) Pl_Err_Resource(resource_print_object_not_linked); try_portray_code = (CodePtr) (pred->codep); } print_pstm_o = pstm_o; print_quoted = quoted; print_ignore_op = ignore_op; print_number_vars = number_vars; print_name_vars = name_vars; print_space_args = space_args; print_portrayed = portrayed; A(0) = word; print_ok = Call_Prolog(try_portray_code); pstm_o = print_pstm_o; quoted = print_quoted; ignore_op = print_ignore_op; number_vars = print_number_vars; name_vars = print_name_vars; space_args = print_space_args; portrayed = print_portrayed; return print_ok; #endif } /*-------------------------------------------------------------------------* * GET_PRINT_STM_1 * * * *-------------------------------------------------------------------------*/ Bool Get_Print_Stm_1(WamWord stm_word) { int stm = Find_Stream_From_PStm(pstm_o); if (stm < 0) stm = stm_output; return Get_Integer(stm, stm_word); } ./gprolog-1.3.0/src/BipsPl/no_le_interf.pl0000644004425400513100000000363410547162352016764 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : no_le_interf.pl * * Descr.: no linedit interface management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: no_le_interf.pl,v 1.11 2007/01/04 10:35:10 diaz Exp $ */ :- built_in. '$use_le_interf'. '$get_linedit_prompt'(_). '$set_linedit_prompt'(_). ./gprolog-1.3.0/src/BipsPl/src_rdr_c.c0000644004425400513100000011640510547154140016065 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : src_rdr_c.c * * Descr.: Prolog source file reader - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: src_rdr_c.c,v 1.8 2007/01/04 10:35:12 diaz Exp $ */ #include #include #include #include "gp_config.h" #ifndef _WIN32 #include #else #include #endif #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ #define DO 0 #define UNDO 1 #define REREAD_MASK (1 << 16) #define REFLECT_EOF_MASK (1 << 17) #define UNDO_DIRECTIVES_MASK (1 << 18) /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef enum { OP, SET_PROLOG_FLAG, CHAR_CONVERSION } SRDirType; typedef struct sr_one_direct *PSROneDirect; typedef struct sr_one_direct { SRDirType type; /* directive type */ WamWord a[2][3]; /* arguments: a[DO][...] and a[UNDO][...] */ PSROneDirect next; /* forward link (or NULL if last) */ PSROneDirect prev; /* backward link (or NULL if first) */ } SROneDirect; typedef struct { SROneDirect *first; /* first directive or NULL */ SROneDirect *last; /* last directive or NULL */ } SRDirect; typedef struct sr_file *PSRFile; typedef struct sr_file { int atom_file_name; /* file name atom */ int stm; /* associated stream */ Bool reposition; /* is it repositionable ? */ char *tmp_path; /* tmp used for reread when !reposition */ int tmp_stm; /* stm of the tmp file */ PSRFile next; /* link to next file */ /* --- include stack information --- */ Bool eof_reached; /* is the EOF reached for this file ? */ int include_line; /* line # this file includes a child file */ PSRFile parent_file; /* link to the parent file (includer) */ } SRFile; typedef struct sr_module *PSRModule; typedef struct sr_module { int atom_module_name; /* module atom */ int i_atom_file_def; /* interface: file name of definition */ int i_line_def; /* interface: line # of definition */ int b_atom_file_def; /* body: file name of current body (or -1) */ int b_line_def; /* body: line # of current body */ SRDirect direct_lst; /* list of directives (interface + body) */ PSRModule next; /* next module */ } SRModule; typedef struct { Bool in_use; /* open ? */ Bool close_master_at_end; /* close master at sr_close/1 ? */ int mask; /* see src_rdr.pl */ SRFile *file_first; /* queue of all files - first */ SRFile *file_last; /* queue of all files - last */ SRFile *file_top; /* stack of open files (top = current) */ SRFile *next_to_reread; /* NULL: in pass 1 or no more to reread */ int cur_l1, cur_l2; /* position (lines) of last read term */ int char_count; /* nb chars read in processed files */ int line_count; /* nb lines read in processed files */ int error_count; /* nb of errors emitted */ int warning_count; /* nb of warnings emitted */ int out_sora_word; /* SorA for writing (or NOT_A_WAM_WORD) */ SRDirect direct_lst; /* list of directives */ SRModule *module_lst; /* list of defined modules */ SRModule *cur_module; /* NULL or current module */ Bool interface; /* in interface or body of current module */ } SRInf; /*---------------------------------* * Global Variables * *---------------------------------*/ static SRInf *sr_tbl = NULL; /* table (mallocated) */ static int sr_tbl_size = 0; /* allocated size */ static int sr_last_used = -1; /* last sr used */ static SRInf *cur_sr; /* the current sr entry used */ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Common_Clean(SRInf *sr, Bool for_reread); static SRInf *Get_Descriptor(WamWord desc_word, Bool accept_none); static void Do_Directives(SRDirect *direct); static void Undo_Directives(SRDirect *direct); static void Exec_One_Directive(SROneDirect *o, int do_undo); static void Close_Current_Module(void); static StmInf *Write_Location(WamWord sora_word, WamWord list_word, int atom_file_name, int l1, int l2c); static void Write_Message_Text(StmInf *pstm, WamWord sora_word, WamWord type_word, WamWord format_word, WamWord args_word); /* from oper_c.c */ void Op_3(WamWord prec_word, WamWord specif_word, WamWord oper_word); /* form flag_c.c */ Bool Set_Prolog_Flag_2(WamWord flag_word, WamWord value_word); /* from read_c.c */ void Char_Conversion_2(WamWord in_char_word, WamWord out_char_word); /* from write_c.c */ void Write_2(WamWord sora_word, WamWord term_word); /* from format_c.c */ void Format_3(WamWord sora_word, WamWord format_word, WamWord args_word); #define Interf_Body(interf) ((interf) ? "module" : "body") #define SR_CURRENT_DESC_ALT X2473725F63757272656E745F64657363726970746F725F616C74 Prolog_Prototype(SR_CURRENT_DESC_ALT, 0); /* TODO: * - use a table of pointers SRInf *[] + Malloc + Free * - do not use a dup of !repositionable stream but * change the mirror before the read_term and restore after * ??????????????????????????????????????????????????????????????????????? */ /*-------------------------------------------------------------------------* * SR_INIT_OPEN_2 * * * *-------------------------------------------------------------------------*/ void SR_Init_Open_2(WamWord desc_word, WamWord out_sora_word) { SRInf *sr; int desc; if (sr_tbl == NULL) /* first allocation */ { sr_tbl_size = 8; sr_last_used = -1; sr_tbl = (SRInf *) Calloc(sr_tbl_size, sizeof(SRInf)); } for(desc = 0; desc < sr_tbl_size; desc++) if (!sr_tbl[desc].in_use) break; if (desc == sr_tbl_size) Extend_Array((char **) &sr_tbl, &sr_tbl_size, sizeof(SRInf), TRUE); if (desc > sr_last_used) sr_last_used = desc; sr = cur_sr = sr_tbl + desc; if (sr->file_top) /* to due a previous aborted sr_open/3 */ { Free(sr->file_top); sr->file_top = NULL; } sr->mask = SYS_VAR_OPTION_MASK; sr->file_first = NULL; sr->file_last = NULL; sr->next_to_reread = NULL; /* 1st read mode */ sr->cur_l1 = sr->cur_l2 = 0; sr->char_count = 0; sr->line_count = 0; sr->error_count = 0; sr->warning_count = 0; if (sys_var[1]) { Get_Stream_Or_Alias(out_sora_word, STREAM_CHECK_VALID); sr->out_sora_word = out_sora_word; } else sr->out_sora_word = NOT_A_WAM_WORD; sr->direct_lst.first = NULL; sr->direct_lst.last = NULL; sr->module_lst = NULL; sr->cur_module = NULL; sr->interface = FALSE; Get_Integer(desc, desc_word); } /*-------------------------------------------------------------------------* * SR_OPEN_FILE_2 * * * *-------------------------------------------------------------------------*/ void SR_Open_File_2(WamWord file_name_word, WamWord from_stream_word) { SRInf *sr = cur_sr; int atom_file_name; int stm; SRFile *file; Bool from_stream = Rd_Boolean(from_stream_word); Bool master_file = (sr->file_top == NULL); StmInf *pstm, *pstm_tmp; if (sr->next_to_reread == NULL) { if (from_stream) { stm = Get_Stream_Or_Alias(file_name_word, STREAM_CHECK_INPUT); Check_Stream_Type(stm, TRUE, TRUE); atom_file_name = stm_tbl[stm]->atom_file_name; } else { atom_file_name = Rd_Atom(file_name_word); if (strcmp(atom_tbl[atom_file_name].name, "user") == 0) #if 0 stm = stm_input; #else { stm = Add_Stream(0, (long) 0, stm_tbl[stm_input]->prop, NULL, NULL, NULL, NULL, NULL, NULL, NULL); *stm_tbl[stm] = *stm_tbl[stm_input]; } #endif else { stm = Add_Stream_For_Stdio_File(atom_tbl[atom_file_name].name, STREAM_MODE_READ, TRUE); if (stm < 0) { if (errno == ENOENT || errno == ENOTDIR) Pl_Err_Existence(existence_source_sink, file_name_word); else Pl_Err_Permission(permission_operation_open, permission_type_source_sink, file_name_word); } } } pstm = stm_tbl[stm]; file = (SRFile *) Malloc(sizeof(SRFile)); file->atom_file_name = atom_file_name; file->stm = stm; file->reposition = pstm->prop.reposition; if (!file->reposition) { file->tmp_path = M_Tempnam(NULL, NULL); file->tmp_stm = Add_Stream_For_Stdio_File(file->tmp_path, STREAM_MODE_WRITE, TRUE); if (file->tmp_stm < 0) Fatal_Error("cannot create tmp file %s in %s:%d", file->tmp_path, __FILE__, __LINE__); /* try to be similar to original file */ pstm_tmp = stm_tbl[file->tmp_stm]; pstm_tmp->atom_file_name = atom_file_name; pstm_tmp->prop.eof_action = pstm->prop.eof_action; if (pstm_tmp->prop.buffering != pstm->prop.buffering) { pstm_tmp->prop.buffering = pstm->prop.buffering; Stdio_Set_Buffering((FILE *) pstm_tmp->file, pstm_tmp->prop.buffering); } Add_Mirror_To_Stream(stm, file->tmp_stm); } else { file->tmp_path = NULL; file->tmp_stm = -1; } file->next = NULL; if (sr->file_first == NULL) sr->file_first = file; else sr->file_last->next = file; sr->file_last = file; } else file = sr->next_to_reread; file->eof_reached = FALSE; file->parent_file = sr->file_top; if (sr->file_top) sr->file_top->include_line = sr->cur_l1; sr->file_top = file; if (master_file) /* we see here the master file */ { sr->close_master_at_end = !from_stream; sr->in_use = TRUE; } } /*-------------------------------------------------------------------------* * SR_CLOSE_1 * * * *-------------------------------------------------------------------------*/ void SR_Close_1(WamWord desc_word) { SRInf *sr = Get_Descriptor(desc_word, FALSE); SRFile *file, *file1; file = sr->file_first; if (!sr->close_master_at_end && file->tmp_path == NULL) goto skip_first; do { Close_Stm(file->stm, TRUE); if (file->tmp_path) unlink(file->tmp_path); skip_first: file1 = file; file = file->next; Free(file1); } while(file); sr->file_top = NULL; Common_Clean(sr, FALSE); sr->in_use = FALSE; while(sr_last_used >= 0 && !sr_tbl[sr_last_used].in_use) sr_last_used--; } /*-------------------------------------------------------------------------* * COMMON_CLEAN * * * *-------------------------------------------------------------------------*/ static void Common_Clean(SRInf *sr, Bool for_reread) { SROneDirect *o, *o1; SRModule *m, *m1; if (for_reread || (sr->mask & UNDO_DIRECTIVES_MASK) != 0) { if (sr->cur_module) Undo_Directives(&sr->cur_module->direct_lst); Undo_Directives(&sr->direct_lst); } o = sr->direct_lst.first; while(o) { o1 = o; o = o->next; Free(o1); } m = sr->module_lst; while(m) { o = m->direct_lst.first; while(o) { o1 = o; o = o->next; Free(o1); } m1 = m; m = m->next; Free(m); } if (for_reread) { sr->cur_l1 = sr->cur_l2 = 0; sr->char_count = 0; sr->line_count = 0; sr->error_count = 0; sr->warning_count = 0; sr->direct_lst.first = NULL; sr->direct_lst.last = NULL; sr->module_lst = NULL; sr->cur_module = NULL; sr->interface = FALSE; } } /*-------------------------------------------------------------------------* * SR_NEW_PASS_1 * * * *-------------------------------------------------------------------------*/ Bool SR_New_Pass_1(WamWord desc_word) { SRInf *sr = Get_Descriptor(desc_word, FALSE); StmInf *pstm; SRFile *file; if ((sr->mask & REREAD_MASK) == 0) return FALSE; if (!sr->file_last->reposition && !sr->file_top->eof_reached) { pstm = stm_tbl[sr->file_top->stm]; while(Stream_Getc(pstm) != EOF) /* read until EOF for mirror */ ; } sr->next_to_reread = sr->file_first->next; for(file = sr->file_first; file; file = file->next) { if (file->reposition) Stream_Set_Position(stm_tbl[file->stm], SEEK_SET, 0, 0, 0, 0); else { if (file != sr->file_first || sr->close_master_at_end) Close_Stm(file->stm, TRUE); Close_Stm(file->tmp_stm, TRUE); /* close mirror file */ file->stm = Add_Stream_For_Stdio_File(file->tmp_path, STREAM_MODE_READ, TRUE); file->reposition = TRUE; } } sr->file_top = sr->file_first; sr->file_top->eof_reached = FALSE; Common_Clean(sr, TRUE); return TRUE; } /*-------------------------------------------------------------------------* * SR_ADD_DIRECTIVE_7 * * * *-------------------------------------------------------------------------*/ void SR_Add_Directive_7(WamWord type_word, WamWord d1_word, WamWord d2_word, WamWord d3_word, WamWord u1_word, WamWord u2_word, WamWord u3_word) { SRInf *sr = cur_sr; SRDirect *d; SROneDirect one, *o; WamWord word, tag_mask; if (sr->cur_module == NULL) d = &sr->direct_lst; else d = &(sr->cur_module->direct_lst); o = &one; o->type = Rd_Integer(type_word); DEREF(d1_word, word, tag_mask); o->a[0][0] = word; DEREF(d2_word, word, tag_mask); o->a[0][1] = word; DEREF(d3_word, word, tag_mask); o->a[0][2] = word; DEREF(u1_word, word, tag_mask); o->a[1][0] = word; DEREF(u2_word, word, tag_mask); o->a[1][1] = word; DEREF(u3_word, word, tag_mask); o->a[1][2] = word; o->next = NULL; o->prev = d->last; Exec_One_Directive(o, DO); /* if exec OK, allocate and add it in lst */ o = (SROneDirect *) Malloc(sizeof(SROneDirect)); *o = one; if (d->first == NULL) d->first = o; else d->last->next = o; d->last = o; } /*-------------------------------------------------------------------------* * DO_DIRECTIVES * * * *-------------------------------------------------------------------------*/ static void Do_Directives(SRDirect *direct) { SROneDirect *o; for (o = direct->first; o; o = o->next) Exec_One_Directive(o, DO); } /*-------------------------------------------------------------------------* * UNDO_DIRECTIVES * * * *-------------------------------------------------------------------------*/ static void Undo_Directives(SRDirect *direct) { SROneDirect *o; for (o = direct->last; o; o = o->prev) Exec_One_Directive(o, UNDO); } /*-------------------------------------------------------------------------* * EXEC_ONE_DIRECTIVE * * * *-------------------------------------------------------------------------*/ static void Exec_One_Directive(SROneDirect *o, int do_undo) { switch(o->type) { case OP: Op_3(o->a[do_undo][0], o->a[do_undo][1], o->a[do_undo][2]); break; case SET_PROLOG_FLAG: Set_Prolog_Flag_2(o->a[do_undo][0], o->a[do_undo][1]); break; case CHAR_CONVERSION: Char_Conversion_2(o->a[do_undo][0], o->a[do_undo][1]); break; } } /*-------------------------------------------------------------------------* * SR_CHANGE_OPTIONS_0 * * * *-------------------------------------------------------------------------*/ void SR_Change_Options_0(void) { SRInf *sr = cur_sr; int reread_mask = sr->mask & REREAD_MASK; sr->mask = (SYS_VAR_OPTION_MASK & (~REREAD_MASK)) | reread_mask; } /*-------------------------------------------------------------------------* * SR_GET_STM__FOR_READ_TERM_1 * * * *-------------------------------------------------------------------------*/ void SR_Get_Stm_For_Read_Term_1(WamWord stm_word) { SRInf *sr = cur_sr; SRFile *file; for(;;) { file = sr->file_top; if (!file->eof_reached) break; /* a EOF is reached */ if (file->parent_file == NULL) break; sr->char_count += stm_tbl[file->stm]->char_count; sr->line_count += stm_tbl[file->stm]->line_count; sr->file_top = file->parent_file; } Get_Integer(sr->file_top->stm, stm_word); } /*-------------------------------------------------------------------------* * SR_EOF_REACHED_1 * * * *-------------------------------------------------------------------------*/ Bool SR_EOF_Reached_1(WamWord err_word) { SRInf *sr = cur_sr; sr->file_top->eof_reached = TRUE; /* delay close at next read */ if (sr->file_top->parent_file == NULL) { if (sr->cur_module) { sprintf(glob_buff, "end_%s(%s) not encoutered - assumed found", Interf_Body(sr->interface), atom_tbl[sr->cur_module->atom_module_name].name); Close_Current_Module(); Un_String(glob_buff, err_word); } return TRUE; /* always reflect EOF for master file */ } return (sr->mask & REFLECT_EOF_MASK); } /*-------------------------------------------------------------------------* * SR_UPDATE_POSITION_0 * * * *-------------------------------------------------------------------------*/ void SR_Update_Position_0(void) { SRInf *sr = cur_sr; sr->cur_l1 = last_read_line; sr->cur_l2 = stm_tbl[sr->file_top->stm]->line_count; if (stm_tbl[sr->file_top->stm]->line_pos > 0) sr->cur_l2++; } /*-------------------------------------------------------------------------* * SR_START_MODULE_3 * * * *-------------------------------------------------------------------------*/ void SR_Start_Module_3(WamWord module_name_word, WamWord interface_word, WamWord err_word) { SRInf *sr = cur_sr; int atom_module_name = Rd_Atom_Check(module_name_word); Bool interface = Rd_Boolean(interface_word); SRModule *m; *glob_buff = '\0'; for(m = sr->module_lst; m; m = m->next) if (m->atom_module_name == atom_module_name) break; if (m == NULL) { if (!interface) { sprintf(glob_buff, "module(%s) not encoutered - interface assumed empty", atom_tbl[atom_module_name].name); } m = (SRModule *) Malloc(sizeof(SRModule)); m->atom_module_name = atom_module_name; m->i_atom_file_def = sr->file_top->atom_file_name; m->i_line_def = sr->cur_l1; m->b_atom_file_def = -1; m->b_line_def = 0; m->direct_lst.first = NULL; m->direct_lst.last = NULL; m->next = sr->module_lst; sr->module_lst = m; } else { if (interface) { sprintf(glob_buff, "module(%s) already found at %s:%d - directive ignored", atom_tbl[atom_module_name].name, atom_tbl[m->i_atom_file_def].name, m->i_line_def); goto error; } } if (sr->cur_module) { sprintf(glob_buff, "end_%s(%s) not encoutered - assumed found", Interf_Body(sr->interface), atom_tbl[sr->cur_module->atom_module_name].name); Close_Current_Module(); } if (!interface) { m->b_atom_file_def = sr->file_top->atom_file_name; m->b_line_def = sr->cur_l1; } sr->cur_module = m; sr->interface = interface; Do_Directives(&m->direct_lst); if (*glob_buff) { error: Un_String(glob_buff, err_word); } } /*-------------------------------------------------------------------------* * SR_STOP_MODULE_3 * * * *-------------------------------------------------------------------------*/ void SR_Stop_Module_3(WamWord module_name_word, WamWord interface_word, WamWord err_word) { SRInf *sr = cur_sr; int atom_module_name = Rd_Atom_Check(module_name_word); Bool interface = Rd_Boolean(interface_word); SRModule *m = sr->cur_module; *glob_buff = '\0'; if (m == NULL) { sprintf(glob_buff, "corresponding directive %s(%s) not found - directive ignored", Interf_Body(interface), atom_tbl[atom_module_name].name); goto error; } if (interface != sr->interface || atom_module_name != m->atom_module_name) { sprintf(glob_buff, "directive mismatch wrt %s:%d - replaced by end_%s(%s)", (sr->interface) ? atom_tbl[m->i_atom_file_def].name : atom_tbl[m->b_atom_file_def].name, (sr->interface) ? m->i_line_def : m->b_line_def, Interf_Body(sr->interface), atom_tbl[m->atom_module_name].name); } Close_Current_Module(); if (*glob_buff) { error: Un_String(glob_buff, err_word); } } /*-------------------------------------------------------------------------* * CLOSE_CURRENT_MODULE * * * *-------------------------------------------------------------------------*/ static void Close_Current_Module(void) { SRInf *sr = cur_sr; Undo_Directives(&sr->cur_module->direct_lst); sr->cur_module = NULL; } /*-------------------------------------------------------------------------* * SR_CURRENT_DESCRIPTOR_1 * * * *-------------------------------------------------------------------------*/ Bool SR_Current_Descriptor_1(WamWord desc_word) { WamWord word, tag_mask; int desc = 0; DEREF(desc_word, word, tag_mask); if (tag_mask == TAG_INT_MASK) { desc = UnTag_INT(word); return (desc >= 0 && desc <= sr_last_used && sr_tbl[desc].in_use); } if (tag_mask != TAG_REF_MASK) Pl_Err_Type(type_integer, word); for (; desc <= sr_last_used; desc++) if (sr_tbl[desc].in_use) break; if (desc >= sr_last_used) { if (desc > sr_last_used) return FALSE; } else /* non deterministic case */ { A(0) = desc_word; A(1) = desc + 1; Create_Choice_Point((CodePtr) Prolog_Predicate(SR_CURRENT_DESC_ALT, 0), 2); } return Get_Integer(desc, desc_word); } /*-------------------------------------------------------------------------* * SR_CURRENT_DESCRIPTOR_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool SR_Current_Descriptor_Alt_0(void) { WamWord desc_word; int desc; Update_Choice_Point((CodePtr) Prolog_Predicate(SR_CURRENT_DESC_ALT, 0), 0); desc_word = AB(B, 0); desc = AB(B, 1); for (; desc <= sr_last_used; desc++) if (sr_tbl[desc].in_use) break; if (desc >= sr_last_used) { Delete_Last_Choice_Point(); if (desc > sr_last_used) return FALSE; } else /* non deterministic case */ { #if 0 /* the following data is unchanged */ AB(B, 0) = desc_word; #endif AB(B, 1) = desc + 1; } return Get_Integer(desc, desc_word); } /*-------------------------------------------------------------------------* * SR_IS_BIT_SET_1 * * * *-------------------------------------------------------------------------*/ Bool SR_Is_Bit_Set_1(WamWord bit_word) { return cur_sr->mask & (1 << Rd_Integer(bit_word)); } /*-------------------------------------------------------------------------* * SR_GET_STM_2 * * * *-------------------------------------------------------------------------*/ Bool SR_Get_Stm_2(WamWord desc_word, WamWord stm_word) { SRInf *sr = Get_Descriptor(desc_word, FALSE); return Get_Integer(sr->file_top->stm, stm_word); } /*-------------------------------------------------------------------------* * SR_GET_MODULE_3 * * * *-------------------------------------------------------------------------*/ Bool SR_Get_Module_3(WamWord desc_word, WamWord module_name_word, WamWord interface_word) { SRInf *sr = Get_Descriptor(desc_word, FALSE); SRModule *m = sr->cur_module; Check_For_Un_Atom(module_name_word); Check_For_Un_Atom(interface_word); if (m == NULL) return FALSE; if (!Get_Atom(m->atom_module_name, module_name_word)) return FALSE; if (sr->interface) return Un_String("interface", interface_word); return Un_String("body", interface_word); } /*-------------------------------------------------------------------------* * SR_GET_FILE_NAME_2 * * * *-------------------------------------------------------------------------*/ Bool SR_Get_File_Name_2(WamWord desc_word, WamWord file_name_word) { SRInf *sr = Get_Descriptor(desc_word, FALSE); return Un_Atom_Check(sr->file_top->atom_file_name, file_name_word); } /*-------------------------------------------------------------------------* * SR_GET_POSITION_3 * * * *-------------------------------------------------------------------------*/ Bool SR_Get_Position_3(WamWord desc_word, WamWord l1_word, WamWord l2_word) { SRInf *sr = Get_Descriptor(desc_word, FALSE); Check_For_Un_Integer(l1_word); Check_For_Un_Integer(l2_word); return Get_Integer(sr->cur_l1, l1_word) && Get_Integer(sr->cur_l2, l2_word); } /*-------------------------------------------------------------------------* * SR_GET_INCLUDE_LIST_2 * * * *-------------------------------------------------------------------------*/ Bool SR_Get_Include_List_2(WamWord desc_word, WamWord list_word) { SRInf *sr = Get_Descriptor(desc_word, FALSE); SRFile *file; WamWord word; Check_For_Un_List(list_word); /* skip 1st file (current) */ for(file = sr->file_top->parent_file; file; file = file->parent_file) { word = Put_Structure(ATOM_CHAR(':'), 2); Unify_Atom(file->atom_file_name); Unify_Integer(file->include_line); if (!Get_List(list_word) || !Unify_Value(word)) return FALSE; list_word = Unify_Variable(); } return Get_Nil(list_word); } /*-------------------------------------------------------------------------* * SR_GET_INCLUDE_STREAM_LIST_2 * * * *-------------------------------------------------------------------------*/ Bool SR_Get_Include_Stream_List_2(WamWord desc_word, WamWord list_word) { SRInf *sr = Get_Descriptor(desc_word, FALSE); SRFile *file; WamWord word; Check_For_Un_List(list_word); /* skip 1st file (current) */ for(file = sr->file_top->parent_file; file; file = file->parent_file) { word = Put_Structure(atom_stream, 1); Unify_Integer(file->stm); if (!Get_List(list_word) || !Unify_Value(word)) return FALSE; list_word = Unify_Variable(); } return Get_Nil(list_word); } /*-------------------------------------------------------------------------* * SR_GET_SIZE_COUNTERS_3 * * * *-------------------------------------------------------------------------*/ Bool SR_Get_Size_Counters_3(WamWord desc_word, WamWord chars_word, WamWord lines_word) { SRInf *sr = Get_Descriptor(desc_word, FALSE); SRFile *file; int char_count, line_count; Check_For_Un_Integer(chars_word); Check_For_Un_Integer(lines_word); char_count = sr->char_count; line_count = sr->line_count; for(file = sr->file_top; file; file = file->parent_file) { char_count += stm_tbl[file->stm]->char_count; line_count += stm_tbl[file->stm]->line_count; } return Get_Integer(char_count, chars_word) && Get_Integer(line_count, lines_word); } /*-------------------------------------------------------------------------* * SR_GET_ERROR_COUNTERS_3 * * * *-------------------------------------------------------------------------*/ Bool SR_Get_Error_Counters_3(WamWord desc_word, WamWord errors_word, WamWord warnings_word) { SRInf *sr = Get_Descriptor(desc_word, FALSE); Check_For_Un_Integer(errors_word); Check_For_Un_Integer(warnings_word); return Get_Integer(sr->error_count, errors_word) && Get_Integer(sr->warning_count, warnings_word); } /*-------------------------------------------------------------------------* * SR_SET_ERROR_COUNTERS_3 * * * *-------------------------------------------------------------------------*/ void SR_Set_Error_Counters_3(WamWord desc_word, WamWord errors_word, WamWord warnings_word) { SRInf *sr = Get_Descriptor(desc_word, FALSE); int errors = Rd_Integer_Check(errors_word); int warnings = Rd_Integer_Check(warnings_word); sr->error_count = errors; sr->warning_count = warnings; } /*-------------------------------------------------------------------------* * SR_CHECK_DESCRIPTOR_1 * * * *-------------------------------------------------------------------------*/ void SR_Check_Descriptor_1(WamWord desc_word) { Get_Descriptor(desc_word, FALSE); } /*-------------------------------------------------------------------------* * GET_DESCRIPTOR * * * *-------------------------------------------------------------------------*/ static SRInf * Get_Descriptor(WamWord desc_word, Bool accept_none) { WamWord word, tag_mask; int desc; int atom; if (accept_none) { DEREF(desc_word, word, tag_mask); atom = UnTag_ATM(word); if (tag_mask == TAG_ATM_MASK && strcmp(atom_tbl[atom].name, "none") == 0) { cur_sr = NULL; return cur_sr; } } desc = Rd_Integer_Check(desc_word); if (desc < 0 || desc > sr_last_used || !sr_tbl[desc].in_use) Pl_Err_Existence(existence_sr_descriptor, desc_word); cur_sr = sr_tbl + desc; SYS_VAR_OPTION_MASK = cur_sr->mask; return cur_sr; } /*-------------------------------------------------------------------------* * SR_WRITE_MESSAGE_4 * * * *-------------------------------------------------------------------------*/ void SR_Write_Message_4(WamWord desc_word, WamWord type_word, WamWord format_word, WamWord args_word) { SRInf *sr = Get_Descriptor(desc_word, TRUE); StmInf *pstm; int atom_file_name; int l1, l2c; WamWord sora_word; if (sr) { sora_word = sr->out_sora_word; atom_file_name = sr->file_top->atom_file_name; l1 = sr->cur_l1; l2c = sr->cur_l2; } else { sora_word = NOT_A_WAM_WORD; atom_file_name = atom_void; l1 = 0; l2c = 0; } pstm = Write_Location(sora_word, NOT_A_WAM_WORD, atom_file_name, l1, l2c); Write_Message_Text(pstm, sora_word, type_word, format_word, args_word); } /*-------------------------------------------------------------------------* * SR_WRITE_MESSAGE_6 * * * *-------------------------------------------------------------------------*/ void SR_Write_Message_6(WamWord desc_word, WamWord l1_word, WamWord l2c_word, WamWord type_word, WamWord format_word, WamWord args_word) { SRInf *sr = Get_Descriptor(desc_word, TRUE); StmInf *pstm; int atom_file_name; int l1, l2c; WamWord sora_word; if (sr) { sora_word = sr->out_sora_word; atom_file_name = sr->file_top->atom_file_name; } else { sora_word = NOT_A_WAM_WORD; atom_file_name = atom_void; } l1 = Rd_Integer_Check(l1_word); l2c = Rd_Integer_Check(l2c_word); pstm = Write_Location(sora_word, NOT_A_WAM_WORD, atom_file_name, l1, l2c); Write_Message_Text(pstm, sora_word, type_word, format_word, args_word); } /*-------------------------------------------------------------------------* * SR_WRITE_MESSAGE_8 * * * *-------------------------------------------------------------------------*/ void SR_Write_Message_8(WamWord desc_word, WamWord list_word, WamWord file_name_word, WamWord l1_word, WamWord l2c_word, WamWord type_word, WamWord format_word, WamWord args_word) { SRInf *sr = Get_Descriptor(desc_word, TRUE); StmInf *pstm; int atom_file_name; int l1, l2c; WamWord sora_word; if (!Blt_List(list_word)) Pl_Err_Type(type_list, list_word); if (sr) { sora_word = sr->out_sora_word; } else { sora_word = NOT_A_WAM_WORD; } sora_word = sr->out_sora_word; atom_file_name = Rd_Atom_Check(file_name_word); l1 = Rd_Integer_Check(l1_word); l2c = Rd_Integer_Check(l2c_word); pstm = Write_Location(sora_word, list_word, atom_file_name, l1, l2c); Write_Message_Text(pstm, sora_word, type_word, format_word, args_word); } /*-------------------------------------------------------------------------* * WRITE_LOCATION * * * *-------------------------------------------------------------------------*/ static StmInf * Write_Location(WamWord sora_word, WamWord list_word, int atom_file_name, int l1, int l2c) { WamWord word, tag_mask; int stm; StmInf *pstm; WamWord *lst_adr; Bool first; SRInf *sr = cur_sr; SRFile *file = NULL; int char_count; stm = (sora_word == NOT_A_WAM_WORD) ? stm_output : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_OUTPUT); pstm = stm_tbl[stm]; last_output_sora = sora_word; Check_Stream_Type(stm, TRUE, FALSE); if (list_word == NOT_A_WAM_WORD && sr != NULL) file = sr->file_top->parent_file; for (first = TRUE; ; first = FALSE) { if (list_word != NOT_A_WAM_WORD) { DEREF(list_word, word, tag_mask); if (word == NIL_WORD) break; } else if (file == NULL) break; if (first) { if (pstm->line_pos != 0) Stream_Putc('\n', pstm); Stream_Puts("In file included from ", pstm); } else Stream_Printf(pstm, ",\n%*s from ", 16, ""); if (list_word != NOT_A_WAM_WORD) { lst_adr = UnTag_LST(word); /* accepts sora_word = NOT_A_WAM_WORD */ Write_2(sora_word, Car(lst_adr)); list_word = Cdr(lst_adr); } else { Stream_Printf(pstm, "%s:%d", atom_tbl[file->atom_file_name].name, file->include_line); file = file->parent_file; } } if (!first) Stream_Puts(":\n", pstm); char_count = pstm->char_count; if (atom_file_name != atom_void) Stream_Puts(atom_tbl[atom_file_name].name, pstm); if (l1 > 0) { Stream_Printf(pstm, ":%d", l1); if (l2c != l1) { if (l2c > 0) Stream_Printf(pstm, "--%d", l2c); else Stream_Printf(pstm, ":%d", -l2c); } } if (char_count != pstm->char_count) Stream_Puts(": ", pstm); return pstm; } /*-------------------------------------------------------------------------* * WRITE_MESSAGE_TEXT * * * *-------------------------------------------------------------------------*/ static void Write_Message_Text(StmInf *pstm, WamWord sora_word, WamWord type_word, WamWord format_word, WamWord args_word) { SRInf *sr = cur_sr; char *type = Rd_String_Check(type_word); if (*type) { Stream_Printf(pstm, "%s: ", type); if (sr) { if (strstr(type, "error") || strstr(type, "exception")) sr->error_count++; else if (strstr(type, "warning")) sr->warning_count++; } } /* accepts sora_word = NOT_A_WAM_WORD */ Format_3(sora_word, format_word, args_word); } ./gprolog-1.3.0/src/BipsPl/list.pl0000644004425400513100000001003410547162352015264 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : list.pl * * Descr.: list library * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: list.pl,v 1.11 2007/01/04 10:35:10 diaz Exp $ */ :- built_in. '$use_list'. append([], L, L). append([H|T1], List, [H|T2]) :- append(T1, List, T2). member(X, [H|T]) :- ( X = H ; member(X, T) ). memberchk(X, [H|T]) :- ( X = H, ! ; memberchk(X, T) ). reverse([], []). reverse([H|T], L) :- '$reverse1'(T, L, [H]). '$reverse1'([], L, L). '$reverse1'([H|T], L, L1) :- '$reverse1'(T, L, [H|L1]). delete([], _, []). delete([H|T], X, L) :- H == X, !, delete(T, X, L). delete([H|T], X, [H|L]) :- delete(T, X, L). select(X, [X|T], T). select(X, [H|T1], [H|T2]) :- select(X, T1, T2). permutation([], []). permutation(L, [H|T]) :- select(H, L, Rest), permutation(Rest, T). prefix([], _). prefix([X|T], [X|T1]) :- prefix(T, T1). suffix(L, L). suffix(X, [_|T]) :- suffix(X, T). sublist(L, L). sublist(Sub, [H|T]) :- '$sublist1'(T, H, Sub). '$sublist1'(Sub, _, Sub). '$sublist1'([H|T], _, Sub) :- '$sublist1'(T, H, Sub). '$sublist1'([H|T], X, [X|Sub]) :- '$sublist1'(T, H, Sub). last([H|T], X) :- '$last1'(T, H, X). '$last1'([], X, X). '$last1'([H|T], _, X) :- '$last1'(T, H, X). length(L, N) :- integer(N), !, N >= 0, '$make_list'(N, L). length(L, N) :- '$length'(L, 0, N). '$length'([], N, N). '$length'([_|L], M, N) :- M1 is M + 1, '$length'(L, M1, N). '$make_list'(0, []) :- !. '$make_list'(N, [_|L]) :- N1 is N - 1, '$make_list'(N1, L). nth(N, L, X) :- integer(N), !, N >= 1, '$nth1'(N, L, X). nth(N, L, X) :- var(N), '$nth2'(L, X, 1, N). '$nth1'(1, [X|_], X) :- !. '$nth1'(N, [_|T], X) :- N1 is N - 1, '$nth1'(N1, T, X). '$nth2'([X|_], X, N, N). '$nth2'([_|T], X, I, N) :- I1 is I + 1, '$nth2'(T, X, I1, N). max_list([H|T], Max) :- '$max_list1'(T, H, Max). '$max_list1'([], Max, Max). '$max_list1'([H|T], X, Max) :- H =< X, !, '$max_list1'(T, X, Max). '$max_list1'([H|T], _, Max) :- '$max_list1'(T, H, Max). min_list([H|T], Min) :- '$min_list1'(T, H, Min). '$min_list1'([], Min, Min). '$min_list1'([H|T], X, Min) :- H >= X, !, '$min_list1'(T, X, Min). '$min_list1'([H|T], _, Min) :- '$min_list1'(T, H, Min). sum_list(L, Sum) :- '$sum_list1'(L, 0, Sum). '$sum_list1'([], Sum, Sum). '$sum_list1'([H|T], Sum0, Sum) :- Sum1 is H + Sum0, '$sum_list1'(T, Sum1, Sum). ./gprolog-1.3.0/src/BipsPl/inl_protos.h0000644004425400513100000001565010547154136016327 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : inl_protos.h * * Descr.: inline predicate prototypes - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: inl_protos.h,v 1.15 2007/01/04 10:35:10 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /* from type_inl_c.c */ Bool FC Blt_Var(WamWord x); Bool FC Blt_Non_Var(WamWord x); Bool FC Blt_Atom(WamWord x); Bool FC Blt_Integer(WamWord x); Bool FC Blt_Float(WamWord x); Bool FC Blt_Number(WamWord x); Bool FC Blt_Atomic(WamWord x); Bool FC Blt_Compound(WamWord x); Bool FC Blt_Callable(WamWord x); Bool FC Blt_Fd_Var(WamWord x); Bool FC Blt_Non_Fd_Var(WamWord x); Bool FC Blt_Generic_Var(WamWord x); Bool FC Blt_Non_Generic_Var(WamWord x); Bool FC Blt_List(WamWord x); Bool FC Blt_Partial_List(WamWord x); Bool FC Blt_List_Or_Partial_List(WamWord x); /* from term_inl_c.c */ Bool FC Blt_Term_Eq(WamWord x, WamWord y); Bool FC Blt_Term_Neq(WamWord x, WamWord y); Bool FC Blt_Term_Lt(WamWord x, WamWord y); Bool FC Blt_Term_Lte(WamWord x, WamWord y); Bool FC Blt_Term_Gt(WamWord x, WamWord y); Bool FC Blt_Term_Gte(WamWord x, WamWord y); Bool FC Blt_Compare(WamWord cmp_word, WamWord x, WamWord y); Bool FC Blt_Arg(WamWord arg_no_word, WamWord term_word, WamWord sub_term_word); Bool FC Blt_Functor(WamWord term_word, WamWord functor_word, WamWord arity_word); Bool FC Blt_Univ(WamWord term_word, WamWord list_word); /* from g_var_inl_c.c */ void FC Blt_G_Assign(WamWord x, WamWord y); void FC Blt_G_Assignb(WamWord x, WamWord y); void FC Blt_G_Link(WamWord x, WamWord y); Bool FC Blt_G_Read(WamWord x, WamWord y); Bool FC Blt_G_Array_Size(WamWord x, WamWord y); void FC Blt_G_Inc(WamWord x); Bool FC Blt_G_Inco(WamWord x, WamWord y); Bool FC Blt_G_Inc_2(WamWord x, WamWord y); Bool FC Blt_G_Inc_3(WamWord x, WamWord y, WamWord z); void FC Blt_G_Dec(WamWord x); Bool FC Blt_G_Deco(WamWord x, WamWord y); Bool FC Blt_G_Dec_2(WamWord x, WamWord y); Bool FC Blt_G_Dec_3(WamWord x, WamWord y, WamWord z); void FC Blt_G_Set_Bit(WamWord x, WamWord y); void FC Blt_G_Reset_Bit(WamWord x, WamWord y); Bool FC Blt_G_Test_Set_Bit(WamWord x, WamWord y); Bool FC Blt_G_Test_Reset_Bit(WamWord x, WamWord y); /* from arith_inl_c.c */ void FC Math_Fast_Load_Value(WamWord start_word, WamWord *word_adr); void FC Math_Load_Value(WamWord start_word, WamWord *word_adr); WamWord FC Fct_Fast_Neg(WamWord x); WamWord FC Fct_Fast_Inc(WamWord x); WamWord FC Fct_Fast_Dec(WamWord x); WamWord FC Fct_Fast_Add(WamWord x, WamWord y); WamWord FC Fct_Fast_Sub(WamWord x, WamWord y); WamWord FC Fct_Fast_Mul(WamWord x, WamWord y); WamWord FC Fct_Fast_Div(WamWord x, WamWord y); WamWord FC Fct_Fast_Rem(WamWord x, WamWord y); WamWord FC Fct_Fast_Mod(WamWord x, WamWord y); WamWord FC Fct_Fast_And(WamWord x, WamWord y); WamWord FC Fct_Fast_Or(WamWord x, WamWord y); WamWord FC Fct_Fast_Xor(WamWord x, WamWord y); WamWord FC Fct_Fast_Not(WamWord x); WamWord FC Fct_Fast_Shl(WamWord x, WamWord y); WamWord FC Fct_Fast_Shr(WamWord x, WamWord y); WamWord FC Fct_Fast_Abs(WamWord x); WamWord FC Fct_Fast_Sign(WamWord x); WamWord FC Fct_Neg(WamWord x); WamWord FC Fct_Inc(WamWord x); WamWord FC Fct_Dec(WamWord x); WamWord FC Fct_Add(WamWord x, WamWord y); WamWord FC Fct_Sub(WamWord x, WamWord y); WamWord FC Fct_Mul(WamWord x, WamWord y); WamWord FC Fct_Div(WamWord x, WamWord y); WamWord FC Fct_Float_Div(WamWord x, WamWord y); WamWord FC Fct_Rem(WamWord x, WamWord y); WamWord FC Fct_Mod(WamWord x, WamWord y); WamWord FC Fct_And(WamWord x, WamWord y); WamWord FC Fct_Or(WamWord x, WamWord y); WamWord FC Fct_Xor(WamWord x, WamWord y); WamWord FC Fct_Not(WamWord x); WamWord FC Fct_Shl(WamWord x, WamWord y); WamWord FC Fct_Shr(WamWord x, WamWord y); WamWord FC Fct_Abs(WamWord x); WamWord FC Fct_Sign(WamWord x); WamWord FC Fct_Min(WamWord x, WamWord y); WamWord FC Fct_Max(WamWord x, WamWord y); WamWord FC Fct_Pow(WamWord x, WamWord y); WamWord FC Fct_Sqrt(WamWord x); WamWord FC Fct_Atan(WamWord x); WamWord FC Fct_Cos(WamWord x); WamWord FC Fct_Acos(WamWord x); WamWord FC Fct_Sin(WamWord x); WamWord FC Fct_Asin(WamWord x); WamWord FC Fct_Exp(WamWord x); WamWord FC Fct_Log(WamWord x); WamWord FC Fct_Float(WamWord x); WamWord FC Fct_Ceiling(WamWord x); WamWord FC Fct_Floor(WamWord x); WamWord FC Fct_Round(WamWord x); WamWord FC Fct_Truncate(WamWord x); WamWord FC Fct_Float_Fract_Part(WamWord x); WamWord FC Fct_Float_Integ_Part(WamWord x); WamWord FC Fct_Identity(WamWord x); Bool FC Blt_Fast_Eq(WamWord x, WamWord y); Bool FC Blt_Fast_Neq(WamWord x, WamWord y); Bool FC Blt_Fast_Lt(WamWord x, WamWord y); Bool FC Blt_Fast_Lte(WamWord x, WamWord y); Bool FC Blt_Fast_Gt(WamWord x, WamWord y); Bool FC Blt_Fast_Gte(WamWord x, WamWord y); Bool FC Blt_Eq(WamWord x, WamWord y); Bool FC Blt_Neq(WamWord x, WamWord y); Bool FC Blt_Lt(WamWord x, WamWord y); Bool FC Blt_Lte(WamWord x, WamWord y); Bool FC Blt_Gt(WamWord x, WamWord y); Bool FC Blt_Gte(WamWord x, WamWord y); ./gprolog-1.3.0/src/BipsPl/control.wam0000644004425400513100000000231510547440331016141 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : control.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/control.pl'). predicate('$use_control'/0,29,static,private,built_in,[ proceed]). predicate(repeat/0,34,static,private,built_in,[ try_me_else(1), proceed, label(1), trust_me_else_fail, execute(repeat/0)]). predicate(abort/0,42,static,private,built_in,[ put_integer(1,0), call_c('Halt_If_No_Top_Level_1',[jump],[x(0)]), proceed]). predicate(stop/0,46,static,private,built_in,[ put_integer(0,0), call_c('Halt_If_No_Top_Level_1',[jump],[x(0)]), proceed]). predicate(halt/0,53,static,private,built_in,[ put_integer(0,0), execute(halt/1)]). predicate(halt/1,59,static,private,built_in,[ put_atom(halt,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Halt_1',[],[x(0)]), proceed]). predicate(for/3,67,static,private,built_in,[ put_atom(for,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('For_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate('$for_alt'/0,72,static,private,built_in,[ call_c('For_Alt_0',[],[]), proceed]). ./gprolog-1.3.0/src/BipsPl/foreign_supp.c0000644004425400513100000003101710547154136016625 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : foreign_supp.c * * Descr.: foreign interface support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: foreign_supp.c,v 1.12 2007/01/04 10:35:10 diaz Exp $ */ #include #define OBJ_INIT Foreign_Initializer #define FOREIGN_SUPP_FILE #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ #define QUERY_STACK_SIZE 128 /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ long foreign_long[NB_OF_X_REGS]; double foreign_double[NB_OF_X_REGS]; long *base_fl = foreign_long; /* overwrite var of engine.c */ double *base_fd = foreign_double; /* overwrite var of engine.c */ static FIOArg fio_arg_array[NB_OF_X_REGS]; static WamWord *query_stack[QUERY_STACK_SIZE]; static WamWord **query_stack_top = query_stack; static WamWord *goal_H; WamWord *query_top_b; /* overwrite var of throw_c.c */ WamWord query_exception; /* overwrite var of throw_c.c */ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static CodePtr Prepare_Call(int func, int arity, WamWord *arg_adr); #define CALL_INTERNAL X2463616C6C5F696E7465726E616C #define PL_QUERY_RECOVER_ALT X24706C5F71756572795F7265636F7665725F616C74 Prolog_Prototype(PL_QUERY_RECOVER_ALT, 0); Prolog_Prototype(CALL_INTERNAL, 2); /*-------------------------------------------------------------------------* * FOREIGN_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Foreign_Initializer(void) { goal_H = H; H = H + MAX_ARITY + 1; Set_Heap_Actual_Start(H); /* reserve space for meta-call goal */ } /*-------------------------------------------------------------------------* * FOREIGN_CREATE_CHOICE * * * *-------------------------------------------------------------------------*/ void Foreign_Create_Choice(CodePtr codep_alt, int arity, int choice_size) { A(arity) = -1; /* bkt_counter */ Create_Choice_Point(codep_alt, arity + 1 + choice_size); } /*-------------------------------------------------------------------------* * FOREIGN_UPDATE_CHOICE * * * *-------------------------------------------------------------------------*/ void Foreign_Update_Choice(CodePtr codep_alt, int arity, int choice_size) { foreign_bkt_counter = AB(B, arity) + 1; AB(B, arity) = foreign_bkt_counter; foreign_bkt_buffer = (char *) (&(AB(B, arity + choice_size))); if (foreign_bkt_counter > 0) { Update_Choice_Point(codep_alt, arity); } } /*-------------------------------------------------------------------------* * FOREIGN_JUMP_RET * * * *-------------------------------------------------------------------------*/ CodePtr Foreign_Jump_Ret(CodePtr codep) { return codep; } /*-------------------------------------------------------------------------* * FOREIGN_RD_IO_ARG * * * *-------------------------------------------------------------------------*/ FIOArg * Foreign_Rd_IO_Arg(int arg_long, WamWord start_word, long (*rd_fct) (), int fio_arg_index) { WamWord word, tag_mask; FIOArg *fa = fio_arg_array + fio_arg_index; DEREF(start_word, word, tag_mask); fa->is_var = fa->unify = (tag_mask == TAG_REF_MASK); if (rd_fct == NULL) fa->value.l = (long) word; else if (!fa->is_var) { if (arg_long) { fa->value.l = (*rd_fct) (word); if (arg_long == 2) /* strdup needed */ fa->value.s = Strdup(fa->value.s); } else fa->value.d = (*(double (*)()) rd_fct) (word); } return fa; } /*-------------------------------------------------------------------------* * FOREIGN_UN_IO_ARG * * * *-------------------------------------------------------------------------*/ Bool Foreign_Un_IO_Arg(int arg_long, Bool (*un_fct) (), FIOArg *fa, WamWord start_word) { if (!fa->unify) return TRUE; if (arg_long) return (*un_fct) (fa->value.l, start_word); return (*un_fct) (fa->value.d, start_word); } /*-------------------------------------------------------------------------* * EMIT_SYNTAX_ERROR * * * *-------------------------------------------------------------------------*/ void Emit_Syntax_Error(char *file_name, int err_line, int err_col, char *err_msg) { Set_Last_Syntax_Error(file_name, err_line, err_col, err_msg); Syntax_Error(Flag_Value(FLAG_SYNTAX_ERROR)); } /*-------------------------------------------------------------------------* * TYPE_OF_TERM * * * *-------------------------------------------------------------------------*/ int Type_Of_Term(WamWord start_word) { WamWord word, tag_mask; DEREF(start_word, word, tag_mask); return Tag_From_Tag_Mask(tag_mask); } /*-------------------------------------------------------------------------* * PREPARE_CALL * * * *-------------------------------------------------------------------------*/ static CodePtr Prepare_Call(int func, int arity, WamWord *arg_adr) { PredInf *pred; WamWord *w; int i; int bip_func, bip_arity; pred = Lookup_Pred(func, arity); if (pred == NULL || !(pred->prop & MASK_PRED_NATIVE_CODE)) { if (arity == 0) A(0) = Tag_ATM(func); else { w = goal_H; A(0) = Tag_STC(w); *w++ = Functor_Arity(func, arity); for (i = 0; i < arity; i++) *w++ = *arg_adr++; } bip_func = Get_Current_Bip(&bip_arity); A(1) = Tag_INT(Call_Info(bip_func, bip_arity, 0)); return (CodePtr) Prolog_Predicate(CALL_INTERNAL, 2); } for (i = 0; i < arity; i++) A(i) = *arg_adr++; return (CodePtr) (pred->codep); } /*-------------------------------------------------------------------------* * PL_EXEC_CONTINUATION * * * *-------------------------------------------------------------------------*/ void Pl_Exec_Continuation(int func, int arity, WamWord *arg_adr) { Execute_A_Continuation(Prepare_Call(func, arity, arg_adr)); } /*-------------------------------------------------------------------------* * PL_QUERY_BEGIN * * * *-------------------------------------------------------------------------*/ void Pl_Query_Begin(Bool recoverable) { if (query_stack_top - query_stack >= QUERY_STACK_SIZE) Fatal_Error("too many nested Pl_Query_Start() (max: %d)", QUERY_STACK_SIZE); if (recoverable) Create_Choice_Point(Prolog_Predicate(PL_QUERY_RECOVER_ALT, 0), 0); } /*-------------------------------------------------------------------------* * PL_QUERY_CALL * * * *-------------------------------------------------------------------------*/ int Pl_Query_Call(int func, int arity, WamWord *arg_adr) { *query_stack_top++ = query_top_b = B; query_exception = atom_void; return Call_Prolog(Prepare_Call(func, arity, arg_adr)); } /*-------------------------------------------------------------------------* * PL_QUERY_RECOVER_ALT_0 * * * * NB: This choice-point is invoked when PL_KEEP_FOR_PROLOG is used * *-------------------------------------------------------------------------*/ void Pl_Query_Recover_Alt_0(void) { Delete_Choice_Point(0); /* remove recover choice-point */ } /*-------------------------------------------------------------------------* * PL_QUERY_NEXT_SOLUTION * * * *-------------------------------------------------------------------------*/ int Pl_Query_Next_Solution(void) { if (query_stack_top == query_stack) Fatal_Error("Pl_Query_Next_Solution() but no query remaining"); query_exception = atom_void; return Call_Prolog_Next_Sol(query_top_b); } /*-------------------------------------------------------------------------* * PL_QUERY_END * * * *-------------------------------------------------------------------------*/ void Pl_Query_End(int op) { WamWord *query_b, *prev_b, *b; Bool recoverable; if (query_stack_top == query_stack) Fatal_Error("Pl_Query_End() but no query remaining"); query_b = *--query_stack_top; query_top_b = query_stack_top[-1]; recoverable = (ALTB(query_b) == Prolog_Predicate(PL_QUERY_RECOVER_ALT, 0)); prev_b = BB(query_b); switch (op) { case PL_RECOVER: Assign_B(query_b); if (!recoverable) Fatal_Error("Pl_Query_End(PL_RECOVER) but unrecoverable query"); Delete_Choice_Point(0); /* remove recover chc-point */ break; case PL_CUT: Assign_B((recoverable) ? prev_b : query_b); break; default: /* case PL_KEEP_FOR_PROLOG */ if (recoverable) { if (B == query_b) Assign_B(prev_b); else for (b = B; b > query_b; b = BB(b)) /* unlink recover chc-point */ if (BB(b) == query_b) BB(b) = prev_b; } Keep_Rest_For_Prolog(query_b); } } /*-------------------------------------------------------------------------* * PL_GET_EXCEPTION * * * *-------------------------------------------------------------------------*/ WamWord Pl_Get_Exception(void) { return query_exception; } ./gprolog-1.3.0/src/BipsPl/read.pl0000644004425400513100000001417710547162353015241 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : read.pl * * Descr.: term input (read/1 and friends) management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: read.pl,v 1.14 2007/01/04 10:35:11 diaz Exp $ */ :- built_in. '$use_read'. /* warning: if you change this file check also definitions in const_io.pl */ read(Term) :- set_bip_name(read, 1), '$set_read_defaults', '$call_c_test'('Read_1'(Term)). read(SorA, Term) :- set_bip_name(read, 2), '$set_read_defaults', '$call_c_test'('Read_2'(SorA, Term)). % option mask in sys_var[0]: % % b3 b2 b1 b0 % 0/1 0/1 0/1 0/1 % end_of_term singletons var_names vars % 0=dot 0=false 0=false 0=false % 1=eof 1=true 1=true 1=true % % syntax error action in sys_var[1]: % % -1=not specified % 0=error raise an error (iso) % 1=waning display a message and fail % 2=fail quietly fail read_term(Term, Options) :- set_bip_name(read_term, 2), '$set_read_defaults', '$get_read_options'(Options, Vars, VarNames, SinglNames), '$call_c_test'('Read_Term_4'(Term, Vars, VarNames, SinglNames)). read_term(SorA, Term, Options) :- set_bip_name(read_term, 3), '$read_term'(SorA, Term, Options). '$read_term'(SorA, Term, Options) :- '$set_read_defaults', '$get_read_options'(Options, Vars, VarNames, SinglNames), '$call_c_test'('Read_Term_5'(SorA, Term, Vars, VarNames, SinglNames)). '$set_read_defaults' :- '$sys_var_write'(0, 0), % default mask '$sys_var_write'(1, -1). '$get_read_options'(Options, Vars, VarNames, SinglNames) :- '$check_list'(Options), g_assign('$read_variables', []), g_assign('$read_variable_names', []), g_assign('$read_singletons', []), '$get_read_options1'(Options), g_read('$read_variables', Vars), g_read('$read_variable_names', VarNames), g_read('$read_singletons', SinglNames). '$get_read_options1'([]). '$get_read_options1'([X|Options]) :- '$get_read_options2'(X), !, '$get_read_options1'(Options). '$get_read_options2'(X) :- var(X), '$pl_err_instantiation'. '$get_read_options2'(variables(Vars)) :- g_link('$read_variables', Vars), '$sys_var_set_bit'(0, 0). '$get_read_options2'(variable_names(VarNames)) :- g_link('$read_variable_names', VarNames), '$sys_var_set_bit'(0, 1). '$get_read_options2'(singletons(SinglNames)) :- g_link('$read_singletons', SinglNames), '$sys_var_set_bit'(0, 2). '$get_read_options2'(syntax_error(X)) :- nonvar(X), ( X = error, '$sys_var_write'(1, 0) % same order as in flag_supp.h ; X = warning, '$sys_var_write'(1, 1) ; X = fail, '$sys_var_write'(1, 2) ). '$get_read_options2'(end_of_term(X)) :- nonvar(X), % same order as in parse_supp.h ( X = dot, '$sys_var_reset_bit'(0, 3) ; X = eof, '$sys_var_set_bit'(0, 3) ). '$get_read_options2'(X) :- '$pl_err_domain'(read_option, X). read_atom(Atom) :- set_bip_name(read_atom, 1), '$set_read_defaults', '$call_c_test'('Read_Atom_1'(Atom)). read_atom(SorA, Atom) :- set_bip_name(read_atom, 2), '$set_read_defaults', '$call_c_test'('Read_Atom_2'(SorA, Atom)). read_integer(Integer) :- set_bip_name(read_integer, 1), '$set_read_defaults', '$call_c_test'('Read_Integer_1'(Integer)). read_integer(SorA, Integer) :- set_bip_name(read_integer, 2), '$set_read_defaults', '$call_c_test'('Read_Integer_2'(SorA, Integer)). read_number(Number) :- set_bip_name(read_number, 1), '$set_read_defaults', '$call_c_test'('Read_Number_1'(Number)). read_number(SorA, Number) :- set_bip_name(read_number, 2), '$set_read_defaults', '$call_c_test'('Read_Number_2'(SorA, Number)). read_token(Token) :- set_bip_name(read_token, 1), '$call_c_test'('Read_Token_1'(Token)). read_token(SorA, Token) :- set_bip_name(read_token, 2), '$call_c_test'('Read_Token_2'(SorA, Token)). last_read_start_line_column(Line, Col) :- set_bip_name(last_read_start_line_column, 2), '$call_c_test'('Last_Read_Start_Line_Column_2'(Line, Col)). char_conversion(InChar, OutChar) :- set_bip_name(char_conversion, 2), '$call_c'('Char_Conversion_2'(InChar, OutChar)). current_char_conversion(InChar, OutChar) :- set_bip_name(current_char_conversion, 2), '$call_c_test'('Current_Char_Conversion_2'(InChar, OutChar)). '$current_char_conversion_alt' :- % used by C code to create a choice-point '$call_c_test'('Current_Char_Conversion_Alt_0'). ./gprolog-1.3.0/src/BipsPl/le_interf.pl0000644004425400513100000000522010547162352016261 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : le_interf.pl * * Descr.: linedit interface management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: le_interf.pl,v 1.11 2007/01/04 10:35:10 diaz Exp $ */ :- built_in. '$use_le_interf'. get_linedit_prompt(Prompt) :- set_bip_name(get_linedit_prompt, 1), '$call_c_test'('Get_Linedit_Prompt_1'(Prompt)). '$get_linedit_prompt'(Prompt) :- '$call_c_test'('Get_Linedit_Prompt_1'(Prompt)). set_linedit_prompt(Prompt) :- set_bip_name(set_linedit_prompt, 1), '$call_c'('Set_Linedit_Prompt_1'(Prompt)). '$set_linedit_prompt'(Prompt) :- '$call_c'('Set_Linedit_Prompt_1'(Prompt)). add_linedit_completion(Compl) :- set_bip_name(add_linedit_completion, 1), '$call_c_test'('Add_Linedit_Completion_1'(Compl)). find_linedit_completion(Prefix, Compl) :- set_bip_name(find_linedit_completion, 2), '$call_c_test'('Find_Linedit_Completion_2'(Prefix, Compl)). '$find_linedit_completion_alt' :- % used by C code to create a choice-point '$call_c_test'('Find_Linedit_Completion_Alt_0'). ./gprolog-1.3.0/src/BipsPl/pred.pl0000644004425400513100000001120410547162353015244 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : pred.pl * * Descr.: predicate manipulation management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: pred.pl,v 1.13 2007/01/04 10:35:11 diaz Exp $ */ :- built_in. '$use_pred'. current_predicate(PI) :- set_bip_name(current_predicate, 1), '$current_predicate'(PI). '$current_predicate'(PI) :- '$call_c_test'('Current_Predicate_2'(PI, 0)). '$current_predicate_bips'(PI) :- '$call_c_test'('Current_Predicate_2'(PI, 1)). '$current_predicate_any'(PI) :- '$call_c_test'('Current_Predicate_2'(PI, 2)). '$current_predicate_alt' :- % used by C code to create a choice-point '$call_c_test'('Current_Predicate_Alt_0'). predicate_property(PI, Property) :- set_bip_name(predicate_property, 2), '$current_predicate_bips'(PI), '$predicate_property1'(PI, Property). '$predicate_property_any'(PI, Property) :- '$current_predicate_any'(PI), '$predicate_property1'(PI, Property). '$predicate_property1'(PI, Property) :- '$check_pred_prop'(Property), !, '$predicate_property2'(Property, PI). '$check_pred_prop'(Property) :- var(Property). '$check_pred_prop'(static). '$check_pred_prop'(dynamic). '$check_pred_prop'(private). '$check_pred_prop'(public). '$check_pred_prop'(user). '$check_pred_prop'(built_in). '$check_pred_prop'(built_in_fd). '$check_pred_prop'(native_code). '$check_pred_prop'(prolog_file(_)). '$check_pred_prop'(prolog_line(_)). '$check_pred_prop'(Property) :- '$pl_err_domain'(predicate_property, Property). '$predicate_property2'(static, PI) :- '$call_c_test'('Pred_Prop_Static_1'(PI)). '$predicate_property2'(dynamic, PI) :- '$call_c_test'('Pred_Prop_Dynamic_1'(PI)). '$predicate_property2'(private, PI) :- '$call_c_test'('Pred_Prop_Private_1'(PI)). '$predicate_property2'(public, PI) :- '$call_c_test'('Pred_Prop_Public_1'(PI)). '$predicate_property2'(user, PI) :- '$call_c_test'('Pred_Prop_User_1'(PI)). '$predicate_property2'(built_in, PI) :- '$call_c_test'('Pred_Prop_Built_In_1'(PI)). '$predicate_property2'(built_in_fd, PI) :- '$call_c_test'('Pred_Prop_Built_In_Fd_1'(PI)). '$predicate_property2'(native_code, PI) :- '$call_c_test'('Pred_Prop_Native_Code_1'(PI)). '$predicate_property2'(prolog_file(PlFile), PI) :- '$call_c_test'('Pred_Prop_Prolog_File_2'(PI, PlFile)). '$predicate_property2'(prolog_line(PlLine), PI) :- '$call_c_test'('Pred_Prop_Prolog_Line_2'(PI, PlLine)). '$get_predicate_file_info'(PI, PlFile, PlLine) :- '$call_c_test'('Get_Predicate_File_Info_3'(PI, PlFile, PlLine)). '$set_predicate_file_info'(PI, PlFile, PlLine) :- '$call_c_test'('Set_Predicate_File_Info_3'(PI, PlFile, PlLine)). '$aux_name'(Name) :- '$call_c_test'('Aux_Name_1'(Name)). '$father_of_aux_name'(Name, FatherName, FatherArity) :- '$call_c_test'('Father_Of_Aux_Name_3'(Name, FatherName, FatherArity)). '$pred_without_aux'(Name, Arity, Name1, Arity1) :- '$call_c_test'('Pred_Without_Aux_4'(Name, Arity, Name1, Arity1)). '$make_aux_name'(Name, Arity, AuxNb, AuxName) :- '$call_c_test'('Make_Aux_Name_4'(Name, Arity, AuxNb, AuxName)). ./gprolog-1.3.0/src/BipsPl/pred_supp.c0000644004425400513100000001175510547154137016136 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : pred_supp.c * * Descr.: predicate management support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: pred_supp.c,v 1.9 2007/01/04 10:35:11 diaz Exp $ */ #include #include #include #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ #define AUX_STR "_$aux" /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * DETECT_IF_AUX_NAME * * * * returns NULL if not an aux name or a pointer to / before the arity of * * the father. * *-------------------------------------------------------------------------*/ char * Detect_If_Aux_Name(int func) { char *str = atom_tbl[func].name; char *p, *q; if (*str != '$' || (p = strstr(str, AUX_STR)) == NULL) return NULL; q = p + sizeof(AUX_STR) - 1; if (!isdigit(*q)) return NULL; while (isdigit(*++q)) ; if (*q != '\0') return NULL; while (isdigit(*--p) && p > str) ; if (*p != '/') return NULL; return p; } /*-------------------------------------------------------------------------* * FATHER_PRED_OF_AUX * * * * returns -1 if it is not an aux predicate name. * *-------------------------------------------------------------------------*/ int Father_Pred_Of_Aux(int func, int *father_arity) { char *p; int l; p = Detect_If_Aux_Name(func); if (p == NULL) return -1; l = p - atom_tbl[func].name; *father_arity = strtol(p + 1, NULL, 10); strcpy(glob_buff, atom_tbl[func].name + 1); /* skip 1st $ */ glob_buff[l - 1] = '\0'; return Create_Allocate_Atom(glob_buff); } /*-------------------------------------------------------------------------* * PRED_WITHOUT_AUX * * * *-------------------------------------------------------------------------*/ int Pred_Without_Aux(int func, int arity, int *arity1) { int func1; func1 = Father_Pred_Of_Aux(func, arity1); if (func1 < 0) { *arity1 = arity; func1 = func; } return func1; } /*-------------------------------------------------------------------------* * MAKE_AUX_NAME * * * *-------------------------------------------------------------------------*/ int Make_Aux_Name(int func, int arity, int aux_nb) { func = Pred_Without_Aux(func, arity, &arity); sprintf(glob_buff, "$%s/%d%s%d", atom_tbl[func].name, arity, AUX_STR, aux_nb); return Create_Allocate_Atom(glob_buff); } ./gprolog-1.3.0/src/BipsPl/Makefile.in0000644004425400513100000001347310547152500016025 0ustar diazlocoMAKE_SOCKETS_OBJS = @MAKE_SOCKETS_OBJS@ MAKE_LE_INTERF_OBJS = @MAKE_LE_INTERF_OBJS@ LIB_BIPS_PL = @LIB_BIPS_PL@ LIB_ENGINE_PL = @LIB_ENGINE_PL@ LIB_LINEDIT = @LIB_LINEDIT@ GPLC = @GPLC@ CC = @CC@ @CFLAGS_MACHINE@ CFLAGS = @CFLAGS@ CFLAGS_UNSIGNED_CHAR = @CFLAGS_UNSIGNED_CHAR@ AR_RC = @AR_RC@ RANLIB = @RANLIB@ SOCKETS_OBJS = sockets@OBJ_SUFFIX@ sockets_c@OBJ_SUFFIX@ NO_SOCKETS_OBJS = no_sockets@OBJ_SUFFIX@ LE_INTERF_OBJS = le_interf@OBJ_SUFFIX@ le_interf_c@OBJ_SUFFIX@ NO_LE_INTERF_OBJS = no_le_interf@OBJ_SUFFIX@ LIBNAME = $(LIB_BIPS_PL) OBJLIB = error_supp@OBJ_SUFFIX@ \ c_supp@OBJ_SUFFIX@ \ foreign_supp@OBJ_SUFFIX@ \ pred_supp@OBJ_SUFFIX@ \ term_supp@OBJ_SUFFIX@ \ stream_supp@OBJ_SUFFIX@ \ scan_supp@OBJ_SUFFIX@ \ parse_supp@OBJ_SUFFIX@ \ write_supp@OBJ_SUFFIX@ \ dynam_supp@OBJ_SUFFIX@ \ callinf_supp@OBJ_SUFFIX@ \ bc_supp@OBJ_SUFFIX@ \ foreign@OBJ_SUFFIX@ \ pl_error@OBJ_SUFFIX@ \ utils@OBJ_SUFFIX@ \ unify@OBJ_SUFFIX@ \ assert@OBJ_SUFFIX@ assert_c@OBJ_SUFFIX@ \ read@OBJ_SUFFIX@ read_c@OBJ_SUFFIX@ \ write@OBJ_SUFFIX@ write_c@OBJ_SUFFIX@ print@OBJ_SUFFIX@ \ const_io@OBJ_SUFFIX@ const_io_c@OBJ_SUFFIX@ \ oper@OBJ_SUFFIX@ oper_c@OBJ_SUFFIX@ \ pred@OBJ_SUFFIX@ pred_c@OBJ_SUFFIX@ \ atom@OBJ_SUFFIX@ atom_c@OBJ_SUFFIX@ \ control@OBJ_SUFFIX@ control_c@OBJ_SUFFIX@ \ call@OBJ_SUFFIX@ \ call_args@OBJ_SUFFIX@ call_args_c@OBJ_SUFFIX@ \ catch@OBJ_SUFFIX@ throw@OBJ_SUFFIX@ throw_c@OBJ_SUFFIX@ \ flag@OBJ_SUFFIX@ flag_c@OBJ_SUFFIX@ \ arith_inl@OBJ_SUFFIX@ arith_inl_c@OBJ_SUFFIX@ \ type_inl@OBJ_SUFFIX@ type_inl_c@OBJ_SUFFIX@ \ term_inl@OBJ_SUFFIX@ term_inl_c@OBJ_SUFFIX@ \ g_var_inl@OBJ_SUFFIX@ g_var_inl_c@OBJ_SUFFIX@ \ all_solut@OBJ_SUFFIX@ all_solut_c@OBJ_SUFFIX@ \ sort@OBJ_SUFFIX@ sort_c@OBJ_SUFFIX@ \ list@OBJ_SUFFIX@ \ stat@OBJ_SUFFIX@ stat_c@OBJ_SUFFIX@ \ stream@OBJ_SUFFIX@ stream_c@OBJ_SUFFIX@ \ file@OBJ_SUFFIX@ file_c@OBJ_SUFFIX@ \ char_io@OBJ_SUFFIX@ char_io_c@OBJ_SUFFIX@ \ dec10io@OBJ_SUFFIX@ \ format@OBJ_SUFFIX@ format_c@OBJ_SUFFIX@ \ os_interf@OBJ_SUFFIX@ os_interf_c@OBJ_SUFFIX@ \ expand@OBJ_SUFFIX@ expand_c@OBJ_SUFFIX@ \ consult@OBJ_SUFFIX@ consult_c@OBJ_SUFFIX@ \ pretty@OBJ_SUFFIX@ pretty_c@OBJ_SUFFIX@ \ random@OBJ_SUFFIX@ random_c@OBJ_SUFFIX@ \ top_level@OBJ_SUFFIX@ top_level_c@OBJ_SUFFIX@ \ debugger@OBJ_SUFFIX@ debugger_c@OBJ_SUFFIX@ \ src_rdr@OBJ_SUFFIX@ src_rdr_c@OBJ_SUFFIX@ \ all_pl_bips@OBJ_SUFFIX@ \ $(MAKE_SOCKETS_OBJS) \ $(MAKE_LE_INTERF_OBJS) .SUFFIXES: .SUFFIXES: @OBJ_SUFFIX@ .c .wam .pl $(SUFFIXES) .pl.wam: $(GPLC) -W $(GPLCFLAGS) --no-redef-error $*.pl .wam@OBJ_SUFFIX@: $(GPLC) -c $*.wam .c@OBJ_SUFFIX@: $(GPLC) -c -C '$(CFLAGS) $(CFLAGS_UNSIGNED_CHAR)' $*.c $(LIBNAME): $(OBJLIB) no_sockets.wam sockets.wam \ no_le_interf.wam le_interf.wam rm -f $(LIBNAME) $(AR_RC)@AR_SEP@$(LIBNAME) $(OBJLIB) $(RANLIB) $(LIBNAME) clean: rm -f *@OBJ_SUFFIX@ $(LIBNAME) distclean: clean # for test t.wam: t.pl t@EXE_SUFFIX@: t@OBJ_SUFFIX@ t_c@OBJ_SUFFIX@ ../EnginePl/$(LIB_ENGINE_PL) $(LIBNAME) \ ../Linedit/$(LIB_LINEDIT) $(GPLC) -o t@EXE_SUFFIX@ t@OBJ_SUFFIX@ t_c@OBJ_SUFFIX@ --no-fd-lib # depending on ../EnginePl/gp_config.h error_supp@OBJ_SUFFIX@: ../EnginePl/gp_config.h stream_supp@OBJ_SUFFIX@: ../EnginePl/gp_config.h flag_c@OBJ_SUFFIX@: ../EnginePl/gp_config.h # depending on dynam_supp.h dynam_supp@OBJ_SUFFIX@: dynam_supp.h bc_supp@OBJ_SUFFIX@: dynam_supp.h assert_c@OBJ_SUFFIX@: dynam_supp.h stream_supp@OBJ_SUFFIX@: flag_supp.h consult_c@OBJ_SUFFIX@: flag_supp.h foreign.wam: foreign.pl all_pl_bips.wam: all_pl_bips.pl all_solut.wam: all_solut.pl arith_inl.wam: arith_inl.pl assert.wam: assert.pl atom.wam: atom.pl call.wam: call.pl call_args.wam: call_args.pl catch.wam: catch.pl char_io.wam: char_io.pl const_io.wam: const_io.pl consult.wam: consult.pl control.wam: control.pl expand.wam: expand.pl debugger.wam: debugger.pl $(GPLC) -W $(GPLCFLAGS) --no-redef-error --fast-math debugger.pl dec10io.wam: dec10io.pl file.wam: file.pl flag.wam: flag.pl format.wam: format.pl g_var_inl.wam: g_var_inl.pl le_interf.wam: le_interf.pl list.wam: list.pl stat.wam: stat.pl no_le_interf.wam:no_le_interf.pl no_sockets.wam: no_sockets.pl oper.wam: oper.pl os_interf.wam: os_interf.pl pl_error.wam: pl_error.pl pred.wam: pred.pl pretty.wam: pretty.pl random.wam: random.pl print.wam: print.pl read.wam: read.pl reg_alloc.wam: reg_alloc.pl sockets.wam: sockets.pl sort.wam: sort.pl stream.wam: stream.pl term_inl.wam: term_inl.pl throw.wam: throw.pl top_level.wam: top_level.pl type_inl.wam: type_inl.pl unify.wam: unify.pl utils.wam: utils.pl write.wam: write.pl src_rdr.wam: src_rdr.pl PLS=$(shell echo [a-z][a-z]*.pl) WAMS=$(PLS:.pl=.wam) check: ../Pl2Wam/check_boot -a && echo Bootstrap Prolog Bips OK # test: read alone RCFLAGS=$(CFLAGS) -I../EnginePl -DFOR_EXTERNAL_USE ROBJS=scan_supp.o parse_supp.o /tmp/stream_supp.o /tmp/write_supp.o /tmp/stream_supp.o: stream_supp.c $(GPLC) -C "$(RCFLAGS)" -c stream_supp.c -o /tmp/stream_supp.o /tmp/write_supp.o: write_supp.c $(GPLC) -C "$(RCFLAGS)" -c write_supp.c -o /tmp/write_supp.o r: r.o $(ROBJS) ../EnginePl/$(LIB_ENGINE_PL) $(GPLC) -o r r.o $(ROBJS) --no-pl-lib ./gprolog-1.3.0/src/BipsPl/read_c.c0000644004425400513100000003341510547154137015347 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : read_c.c * * Descr.: read/1 and friends - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: read_c.c,v 1.15 2007/01/04 10:35:11 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ #define CURRENT_CHAR_CONVERSION_ALT X2463757272656E745F636861725F636F6E76657273696F6E5F616C74 Prolog_Prototype(CURRENT_CHAR_CONVERSION_ALT, 0); #define CHECK_STREAM_AND_GET_STM(sora_word, stm) \ stm = (sora_word == NOT_A_WAM_WORD) \ ? stm_input : \ Get_Stream_Or_Alias(sora_word, STREAM_CHECK_INPUT); \ \ last_input_sora = sora_word; \ Check_Stream_Type(stm, TRUE, TRUE) #define CHECK_RESULT_AND_UNIFY(returned_word, term_word) \ if (returned_word == NOT_A_WAM_WORD) \ { \ Syntax_Error((SYS_VAR_SYNTAX_ERROR_ACTON < 0) \ ? Flag_Value(FLAG_SYNTAX_ERROR) \ : SYS_VAR_SYNTAX_ERROR_ACTON); \ return FALSE; \ } \ \ if (!Unify(word, term_word)) \ return FALSE /*-------------------------------------------------------------------------* * READ_TERM_5 * * * *-------------------------------------------------------------------------*/ Bool Read_Term_5(WamWord sora_word, WamWord term_word, WamWord vars_word, WamWord var_names_word, WamWord sing_names_word) { WamWord word; int stm; int i; int parse_end_of_term = (SYS_VAR_OPTION_MASK >> 3) & 1; CHECK_STREAM_AND_GET_STM(sora_word, stm); word = Read_Term(stm_tbl[stm], parse_end_of_term); CHECK_RESULT_AND_UNIFY(word, term_word); /* list of variables (i.e. [Var,...]) */ if (SYS_VAR_OPTION_MASK & 1) { for (i = 0; i < parse_nb_var; i++) { if (!Get_List(vars_word) || !Unify_Value(parse_dico_var[i].word)) return FALSE; vars_word = Unify_Variable(); } if (!Get_Nil(vars_word)) return FALSE; } /* list of variable names (i.e. ['Name'=Var,...]) */ if (SYS_VAR_OPTION_MASK & 2) { for (i = 0; i < parse_nb_var; i++) { if (!parse_dico_var[i].named) continue; /* glob_dico_var: variable names (atoms) */ glob_dico_var[i] = Create_Allocate_Atom(parse_dico_var[i].name); word = Put_Structure(ATOM_CHAR('='), 2); Unify_Atom(glob_dico_var[i]); Unify_Value(parse_dico_var[i].word); if (!Get_List(var_names_word) || !Unify_Value(word)) return FALSE; var_names_word = Unify_Variable(); } if (!Get_Nil(var_names_word)) return FALSE; } /* list of singletons (i.e. ['Name'=Var,...]) */ if (SYS_VAR_OPTION_MASK & 4) { for (i = 0; i < parse_nb_var; i++) { if (!parse_dico_var[i].named || parse_dico_var[i].nb_of_uses > 1) continue; if ((SYS_VAR_OPTION_MASK & 2) == 0) /* not yet allocated */ glob_dico_var[i] = Create_Allocate_Atom(parse_dico_var[i].name); word = Put_Structure(ATOM_CHAR('='), 2); Unify_Atom(glob_dico_var[i]); Unify_Value(parse_dico_var[i].word); if (!Get_List(sing_names_word) || !Unify_Value(word)) return FALSE; sing_names_word = Unify_Variable(); } if (!Get_Nil(sing_names_word)) return FALSE; } return TRUE; } /*-------------------------------------------------------------------------* * READ_TERM_4 * * * *-------------------------------------------------------------------------*/ Bool Read_Term_4(WamWord term_word, WamWord vars_word, WamWord var_names_word, WamWord sing_names_word) { return Read_Term_5(NOT_A_WAM_WORD, term_word, vars_word, var_names_word, sing_names_word); } /*-------------------------------------------------------------------------* * READ_1 * * * *-------------------------------------------------------------------------*/ Bool Read_1(WamWord term_word) { return Read_Term_5(NOT_A_WAM_WORD, term_word, 0, 0, 0); } /*-------------------------------------------------------------------------* * READ_2 * * * *-------------------------------------------------------------------------*/ Bool Read_2(WamWord sora_word, WamWord term_word) { return Read_Term_5(sora_word, term_word, 0, 0, 0); } /*-------------------------------------------------------------------------* * READ_ATOM_2 * * * *-------------------------------------------------------------------------*/ Bool Read_Atom_2(WamWord sora_word, WamWord atom_word) { WamWord word; int stm; Check_For_Un_Atom(atom_word); CHECK_STREAM_AND_GET_STM(sora_word, stm); word = Read_Atom(stm_tbl[stm]); CHECK_RESULT_AND_UNIFY(word, atom_word); return TRUE; } /*-------------------------------------------------------------------------* * READ_ATOM_1 * * * *-------------------------------------------------------------------------*/ Bool Read_Atom_1(WamWord atom_word) { return Read_Atom_2(NOT_A_WAM_WORD, atom_word); } /*-------------------------------------------------------------------------* * READ_INTEGER_2 * * * *-------------------------------------------------------------------------*/ Bool Read_Integer_2(WamWord sora_word, WamWord integer_word) { WamWord word; int stm; Check_For_Un_Integer(integer_word); CHECK_STREAM_AND_GET_STM(sora_word, stm); word = Read_Integer(stm_tbl[stm]); CHECK_RESULT_AND_UNIFY(word, integer_word); return TRUE; } /*-------------------------------------------------------------------------* * READ_INTEGER_1 * * * *-------------------------------------------------------------------------*/ Bool Read_Integer_1(WamWord integer_word) { return Read_Integer_2(NOT_A_WAM_WORD, integer_word); } /*-------------------------------------------------------------------------* * READ_NUMBER_2 * * * *-------------------------------------------------------------------------*/ Bool Read_Number_2(WamWord sora_word, WamWord number_word) { WamWord word; int stm; Check_For_Un_Number(number_word); CHECK_STREAM_AND_GET_STM(sora_word, stm); word = Read_Number(stm_tbl[stm]); CHECK_RESULT_AND_UNIFY(word, number_word); return TRUE; } /*-------------------------------------------------------------------------* * READ_NUMBER_1 * * * *-------------------------------------------------------------------------*/ Bool Read_Number_1(WamWord number_word) { return Read_Number_2(NOT_A_WAM_WORD, number_word); } /*-------------------------------------------------------------------------* * READ_TOKEN_2 * * * *-------------------------------------------------------------------------*/ Bool Read_Token_2(WamWord sora_word, WamWord token_word) { WamWord word; int stm; CHECK_STREAM_AND_GET_STM(sora_word, stm); word = Read_Token(stm_tbl[stm]); CHECK_RESULT_AND_UNIFY(word, token_word); return TRUE; } /*-------------------------------------------------------------------------* * READ_TOKEN_1 * * * *-------------------------------------------------------------------------*/ Bool Read_Token_1(WamWord token_word) { return Read_Token_2(NOT_A_WAM_WORD, token_word); } /*-------------------------------------------------------------------------* * LAST_READ_START_LINE_COLUMN_2 * * * *-------------------------------------------------------------------------*/ Bool Last_Read_Start_Line_Column_2(WamWord line_word, WamWord col_word) { return Un_Integer_Check(last_read_line, line_word) && Un_Integer_Check(last_read_col, col_word); } /*-------------------------------------------------------------------------* * CHAR_CONVERSION_2 * * * *-------------------------------------------------------------------------*/ void Char_Conversion_2(WamWord in_char_word, WamWord out_char_word) { int c_in, c_out; c_in = Rd_Char_Check(in_char_word); c_out = Rd_Char_Check(out_char_word); char_conv[c_in] = c_out; } #define Find_Next_Char_Conversion(c_in, c_out) \ while (++c_in < 256) \ { \ c_out = char_conv[c_in]; \ if (c_in != c_out) \ break; \ } /*-------------------------------------------------------------------------* * CURRENT_CHAR_CONVERSION_2 * * * *-------------------------------------------------------------------------*/ Bool Current_Char_Conversion_2(WamWord in_char_word, WamWord out_char_word) { WamWord word, tag_mask; int c_in, c_out; int c_in1, c_out1; Check_For_Un_Char(out_char_word); DEREF(in_char_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) { c_in = Rd_Char_Check(word); c_out = char_conv[c_in]; return c_in != c_out && Un_Char_Check(c_out, out_char_word); } c_in = -1; Find_Next_Char_Conversion(c_in, c_out); if (c_in >= 256) return FALSE; c_in1 = c_in; Find_Next_Char_Conversion(c_in1, c_out1); if (c_in1 < 256) /* non deterministic case */ { A(0) = in_char_word; A(1) = out_char_word; A(2) = c_in1; A(3) = c_out1; Create_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_CHAR_CONVERSION_ALT, 0), 4); } return Get_Atom(ATOM_CHAR(c_in), in_char_word) && Get_Atom(ATOM_CHAR(c_out), out_char_word); } /*-------------------------------------------------------------------------* * CURRENT_CHAR_CONVERSION_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Current_Char_Conversion_Alt_0(void) { WamWord in_char_word, out_char_word; int c_in, c_out; int c_in1, c_out1; Update_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_CHAR_CONVERSION_ALT, 0), 0); in_char_word = AB(B, 0); out_char_word = AB(B, 1); c_in = AB(B, 2); c_out = AB(B, 3); c_in1 = c_in; Find_Next_Char_Conversion(c_in1, c_out1); if (c_in1 >= 256) Delete_Last_Choice_Point(); else /* non deterministic case */ { #if 0 /* the following data is unchanged */ AB(B, 0) = in_char_word; AB(B, 1) = out_char_word; #endif AB(B, 2) = c_in1; AB(B, 3) = c_out1; } return Get_Atom(ATOM_CHAR(c_in), in_char_word) && Get_Atom(ATOM_CHAR(c_out), out_char_word); } ./gprolog-1.3.0/src/BipsPl/g_var_inl.pl0000644004425400513100000000504010547162352016252 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : g_var_inl.pl * * Descr.: global variable (inline) management - defs for meta-call * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: g_var_inl.pl,v 1.12 2007/01/04 10:35:10 diaz Exp $ */ :- built_in. '$use_g_var_inl'. g_assign(Var, Value) :- g_assign(Var, Value). g_assignb(Var, Value) :- g_assignb(Var, Value). g_link(Var, Value) :- g_link(Var, Value). g_read(Var, Value) :- g_read(Var, Value). g_array_size(Var, Type) :- g_array_size(Var, Type). g_inc(X) :- g_inc(X). g_inco(X, Y) :- g_inco(X, Y). g_inc(X, Y) :- g_inc(X, Y). g_inc(X, Y, Z) :- g_inc(X, Y, Z). g_dec(X) :- g_dec(X). g_deco(X, Y) :- g_deco(X, Y). g_dec(X, Y) :- g_dec(X, Y). g_dec(X, Y, Z) :- g_dec(X, Y, Z). g_set_bit(X, Y) :- g_set_bit(X, Y). g_reset_bit(X, Y) :- g_reset_bit(X, Y). g_test_set_bit(X, Y) :- g_test_set_bit(X, Y). g_test_reset_bit(X, Y) :- g_test_reset_bit(X, Y). ./gprolog-1.3.0/src/BipsPl/dec10io.wam0000644004425400513100000002630110547440332015707 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : dec10io.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/dec10io.pl'). predicate('$use_dec10io'/0,29,static,private,built_in,[ proceed]). predicate('$find_existing_stream'/3,33,static,private,built_in,[ load_cut_level(3), try_me_else(11), switch_on_term(3,1,fail,fail,fail), label(1), switch_on_atom([(user,2),(user_input,6),(user_output,10)]), label(2), try(4), trust(8), label(3), try_me_else(5), label(4), get_atom(user,0), get_structure('$stream'/1,1), unify_integer(0), get_atom(input,2), proceed, label(5), retry_me_else(7), label(6), get_atom(user_input,0), get_structure('$stream'/1,1), unify_integer(0), get_atom(input,2), proceed, label(7), retry_me_else(9), label(8), get_atom(user,0), get_structure('$stream'/1,1), unify_integer(1), get_atom(output,2), proceed, label(9), trust_me_else_fail, label(10), get_atom(user_output,0), get_structure('$stream'/1,1), unify_integer(1), get_atom(output,2), proceed, label(11), retry_me_else(12), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_structure('$dec10_stream'/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_local_value(y(2)), put_void(1), call(clause/2), cut(y(3)), put_value(y(1),0), put_value(y(0),1), put_value(y(2),2), deallocate, execute('$$find_existing_stream/3_$aux1'/3), label(12), trust_me_else_fail, allocate(2), get_variable(y(0),0), get_value(y(0),1), get_variable(y(1),2), put_value(y(0),0), get_structure('$stream'/1,0), unify_variable(x(0)), call_c('Blt_Integer',[fast_call,boolean],[x(0)]), put_value(y(0),0), call(current_stream/1), put_value(y(0),0), put_value(y(1),1), deallocate, execute(stream_property/2)]). predicate('$$find_existing_stream/3_$aux1'/3,41,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_value(y(0),0), call(current_stream/1), put_value(y(0),0), put_structure(file_name/1,1), unify_local_value(y(1)), call(stream_property/2), put_value(y(0),0), put_value(y(2),1), call(stream_property/2), cut(y(3)), deallocate, proceed, label(1), trust_me_else_fail, allocate(0), get_variable(x(3),0), put_structure('$dec10_stream'/3,0), unify_local_value(x(1)), unify_local_value(x(3)), unify_local_value(x(2)), call(retract/1), fail]). predicate(see/1,61,static,private,built_in,[ load_cut_level(1), try_me_else(1), allocate(2), get_variable(y(0),1), put_atom(see,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), cut(y(0)), put_variable(y(1),1), call('$see/1_$aux1'/2), cut(y(0)), put_unsafe_value(y(1),0), deallocate, execute(set_input/1), label(1), trust_me_else_fail, execute('$pl_err_instantiation'/0)]). predicate('$see/1_$aux1'/2,61,static,private,built_in,[ try_me_else(1), put_atom(input,2), execute('$find_existing_stream'/3), label(1), trust_me_else_fail, allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(see,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), put_atom(read,1), put_value(y(1),2), put_nil(3), call('$open'/4), put_structure('$dec10_stream'/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_atom(input), deallocate, execute(assertz/1)]). predicate(seeing/1,77,static,private,built_in,[ load_cut_level(1), allocate(3), get_variable(y(0),0), get_variable(y(1),1), put_atom(seeing,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_variable(y(2),0), call(current_input/1), put_value(y(0),0), put_value(y(2),1), put_atom(input,2), call('$find_existing_stream'/3), cut(y(1)), deallocate, proceed]). predicate(seen/0,85,static,private,built_in,[ load_cut_level(0), allocate(2), get_variable(y(0),0), put_atom(seen,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_variable(y(1),0), call(current_input/1), put_value(y(1),0), call(close/1), put_value(y(1),0), call('$seen/0_$aux1'/1), cut(y(0)), deallocate, proceed]). predicate('$seen/0_$aux1'/1,85,static,private,built_in,[ try_me_else(1), put_value(x(0),1), put_void(0), put_atom(input,2), execute('$find_existing_stream'/3), label(1), trust_me_else_fail, proceed]). predicate(tell/1,95,static,private,built_in,[ load_cut_level(1), try_me_else(1), allocate(2), get_variable(y(0),1), put_atom(tell,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), cut(y(0)), put_variable(y(1),1), call('$tell/1_$aux1'/2), cut(y(0)), put_unsafe_value(y(1),0), deallocate, execute(set_output/1), label(1), trust_me_else_fail, execute('$pl_err_instantiation'/0)]). predicate('$tell/1_$aux1'/2,95,static,private,built_in,[ try_me_else(1), put_atom(output,2), execute('$find_existing_stream'/3), label(1), trust_me_else_fail, allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(tell,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), put_atom(write,1), put_value(y(1),2), put_nil(3), call('$open'/4), put_structure('$dec10_stream'/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_atom(output), deallocate, execute(assertz/1)]). predicate(telling/1,111,static,private,built_in,[ load_cut_level(1), allocate(3), get_variable(y(0),0), get_variable(y(1),1), put_atom(telling,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_variable(y(2),0), call(current_output/1), put_value(y(0),0), put_value(y(2),1), put_atom(output,2), call('$find_existing_stream'/3), cut(y(1)), deallocate, proceed]). predicate(told/0,119,static,private,built_in,[ load_cut_level(0), allocate(2), get_variable(y(0),0), put_atom(told,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_variable(y(1),0), call(current_output/1), put_value(y(1),0), call(close/1), put_value(y(1),0), call('$told/0_$aux1'/1), cut(y(0)), deallocate, proceed]). predicate('$told/0_$aux1'/1,119,static,private,built_in,[ try_me_else(1), put_value(x(0),1), put_void(0), put_atom(output,2), execute('$find_existing_stream'/3), label(1), trust_me_else_fail, proceed]). predicate(append/1,128,static,private,built_in,[ load_cut_level(1), try_me_else(1), allocate(2), get_variable(y(0),1), put_atom(append,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), cut(y(0)), put_variable(y(1),1), call('$append/1_$aux1'/2), cut(y(0)), put_unsafe_value(y(1),0), deallocate, execute(set_output/1), label(1), trust_me_else_fail, execute('$pl_err_instantiation'/0)]). predicate('$append/1_$aux1'/2,128,static,private,built_in,[ try_me_else(1), put_atom(output,2), execute('$find_existing_stream'/3), label(1), trust_me_else_fail, allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(append,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), put_atom(append,1), put_value(y(1),2), put_nil(3), call('$open'/4), put_structure('$dec10_stream'/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_atom(output), deallocate, execute(assertz/1)]). predicate(get0/1,144,static,private,built_in,[ put_atom(get0,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Get_Code_1',[boolean],[x(0)]), proceed]). predicate(get/1,150,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(get,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), call('$check_in_character_code'/1), put_variable(x(0),1), call_c('Get_Code_1',[boolean],[x(1)]), put_value(y(0),1), deallocate, execute('$get/1_$aux1'/2)]). predicate('$get/1_$aux1'/2,150,static,private,built_in,[ load_cut_level(2), try_me_else(1), put_atom(=<,3), put_integer(2,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), math_load_value(x(0),0), put_integer(32,3), call_c('Blt_Lte',[fast_call,boolean],[x(0),x(3)]), cut(x(2)), put_value(x(1),0), execute(get/1), label(1), trust_me_else_fail, get_value(x(0),1), proceed]). predicate(put/1,159,static,private,built_in,[ put_atom(put,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Put_Code_1',[],[x(0)]), proceed]). predicate(skip/1,164,static,private,built_in,[ load_cut_level(1), allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(skip,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), call('$check_in_character_code'/1), call(repeat/0), put_variable(x(0),1), call_c('Get_Code_1',[boolean],[x(1)]), get_value(y(0),0), cut(y(1)), deallocate, proceed]). predicate('$check_in_character_code'/1,174,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), proceed, label(1), retry_me_else(2), call_c('Blt_Integer',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$$check_in_character_code/1_$aux1'/1), label(2), trust_me_else_fail, put_value(x(0),1), put_atom(integer,0), execute('$pl_err_type'/2)]). predicate('$$check_in_character_code/1_$aux1'/1,177,static,private,built_in,[ load_cut_level(1), try_me_else(1), put_atom(>=,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), math_load_value(x(0),2), put_integer(-1,3), call_c('Blt_Gte',[fast_call,boolean],[x(2),x(3)]), put_atom(=<,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), math_load_value(x(0),0), put_integer(255,2), call_c('Blt_Lte',[fast_call,boolean],[x(0),x(2)]), cut(x(1)), proceed, label(1), trust_me_else_fail, put_atom(in_character_code,0), execute('$pl_err_representation'/1)]). predicate(tab/1,189,static,private,built_in,[ try_me_else(1), allocate(1), put_atom(tab,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(0),1), call('$arith_eval'/2), put_void(0), put_integer(1,1), put_value(y(0),2), call(for/3), put_atom(' ',0), call(put_char/1), fail, label(1), trust_me_else_fail, proceed]). ./gprolog-1.3.0/src/BipsPl/os_interf_c.c0000644004425400513100000011347710547154137016433 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : os_interf_c.c * * Descr.: operating system interface management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: os_interf_c.c,v 1.19 2007/01/04 10:35:11 diaz Exp $ */ #include #include #include #include #include #include #include #include #include #include "gp_config.h" #ifdef _WIN32 #include #include #include #include #include #else #define _XOPEN_SOURCE_EXTENDED /* for alpha/OSF (usleep prototype) */ #include #include #include #include #include #endif #define OBJ_INIT Os_Interf_Initializer #include "engine_pl.h" #include "bips_pl.h" #if 0 #define DEBUG #endif /*---------------------------------* * Constants * *---------------------------------*/ #define MAX_SIGNALS 255 #define MAX_SPAWN_ARGS 1024 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { int atom; int sig; } InfSig; /*---------------------------------* * Global Variables * *---------------------------------*/ static int atom_dt; /* atom_write is already defined in the set of often used atoms */ static int atom_execute; static int atom_search; static int atom_regular; static int atom_directory; static int atom_fifo; static int atom_socket; static int atom_character_device; static int atom_block_device; static int atom_unknown; static InfSig tsig[MAX_SIGNALS]; static int nb_sig; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static int Flag_Of_Permission(WamWord perm_word, Bool is_a_directory); static char *Get_Path_Name(WamWord path_name_word); static Bool Date_Time_To_Prolog(time_t *t, WamWord date_time_word); static int Select_Init_Set(WamWord list_word, fd_set *set, int check); static Bool Select_Init_Ready_List(WamWord list_word, fd_set *set, WamWord ready_list_word); /*-------------------------------------------------------------------------* * OS_INTERF_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Os_Interf_Initializer(void) { atom_dt = Create_Atom("dt"); atom_execute = Create_Atom("execute"); atom_search = Create_Atom("search"); atom_regular = Create_Atom("regular"); atom_directory = Create_Atom("directory"); atom_fifo = Create_Atom("fifo"); atom_socket = Create_Atom("socket"); atom_character_device = Create_Atom("character_device"); atom_block_device = Create_Atom("block_device"); atom_unknown = Create_Atom("unknown"); nb_sig = 0; #if defined(__unix__) || defined(__CYGWIN__) tsig[nb_sig].atom = Create_Atom("SIGHUP"); tsig[nb_sig++].sig = SIGHUP; tsig[nb_sig].atom = Create_Atom("SIGINT"); tsig[nb_sig++].sig = SIGINT; tsig[nb_sig].atom = Create_Atom("SIGQUIT"); tsig[nb_sig++].sig = SIGQUIT; tsig[nb_sig].atom = Create_Atom("SIGILL"); tsig[nb_sig++].sig = SIGILL; tsig[nb_sig].atom = Create_Atom("SIGTRAP"); tsig[nb_sig++].sig = SIGTRAP; tsig[nb_sig].atom = Create_Atom("SIGABRT"); tsig[nb_sig++].sig = SIGABRT; #ifndef M_ix86_cygwin tsig[nb_sig].atom = Create_Atom("SIGIOT"); tsig[nb_sig++].sig = SIGIOT; #endif tsig[nb_sig].atom = Create_Atom("SIGBUS"); tsig[nb_sig++].sig = SIGBUS; tsig[nb_sig].atom = Create_Atom("SIGFPE"); tsig[nb_sig++].sig = SIGFPE; tsig[nb_sig].atom = Create_Atom("SIGKILL"); tsig[nb_sig++].sig = SIGKILL; tsig[nb_sig].atom = Create_Atom("SIGUSR1"); tsig[nb_sig++].sig = SIGUSR1; tsig[nb_sig].atom = Create_Atom("SIGSEGV"); tsig[nb_sig++].sig = SIGSEGV; tsig[nb_sig].atom = Create_Atom("SIGUSR2"); tsig[nb_sig++].sig = SIGUSR2; tsig[nb_sig].atom = Create_Atom("SIGPIPE"); tsig[nb_sig++].sig = SIGPIPE; tsig[nb_sig].atom = Create_Atom("SIGALRM"); tsig[nb_sig++].sig = SIGALRM; tsig[nb_sig].atom = Create_Atom("SIGTERM"); tsig[nb_sig++].sig = SIGTERM; tsig[nb_sig].atom = Create_Atom("SIGCHLD"); tsig[nb_sig++].sig = SIGCHLD; tsig[nb_sig].atom = Create_Atom("SIGCONT"); tsig[nb_sig++].sig = SIGCONT; tsig[nb_sig].atom = Create_Atom("SIGSTOP"); tsig[nb_sig++].sig = SIGSTOP; tsig[nb_sig].atom = Create_Atom("SIGTSTP"); tsig[nb_sig++].sig = SIGTSTP; tsig[nb_sig].atom = Create_Atom("SIGTTIN"); tsig[nb_sig++].sig = SIGTTIN; tsig[nb_sig].atom = Create_Atom("SIGTTOU"); tsig[nb_sig++].sig = SIGTTOU; tsig[nb_sig].atom = Create_Atom("SIGURG"); tsig[nb_sig++].sig = SIGURG; tsig[nb_sig].atom = Create_Atom("SIGXCPU"); tsig[nb_sig++].sig = SIGXCPU; tsig[nb_sig].atom = Create_Atom("SIGXFSZ"); tsig[nb_sig++].sig = SIGXFSZ; tsig[nb_sig].atom = Create_Atom("SIGVTALRM"); tsig[nb_sig++].sig = SIGVTALRM; tsig[nb_sig].atom = Create_Atom("SIGPROF"); tsig[nb_sig++].sig = SIGPROF; tsig[nb_sig].atom = Create_Atom("SIGWINCH"); tsig[nb_sig++].sig = SIGWINCH; #ifndef M_ix86_sco tsig[nb_sig].atom = Create_Atom("SIGIO"); tsig[nb_sig++].sig = SIGIO; #endif #if !defined(M_bsd) && !defined(M_darwin) tsig[nb_sig].atom = Create_Atom("SIGPOLL"); tsig[nb_sig++].sig = SIGPOLL; #endif #endif #if defined(__unix__) || defined(__CYGWIN__) signal(SIGPIPE, SIG_IGN); #endif } /*-------------------------------------------------------------------------* * MAKE_DIRECTORY_1 * * * *-------------------------------------------------------------------------*/ Bool Make_Directory_1(WamWord path_name_word) { char *path_name; path_name = Get_Path_Name(path_name_word); #ifdef _WIN32 Os_Test_Error(_mkdir(path_name)); #else Os_Test_Error(mkdir(path_name, 0777)); #endif return TRUE; } /*-------------------------------------------------------------------------* * DELETE_DIRECTORY_1 * * * *-------------------------------------------------------------------------*/ Bool Delete_Directory_1(WamWord path_name_word) { char *path_name; path_name = Get_Path_Name(path_name_word); Os_Test_Error(rmdir(path_name)); return TRUE; } /*-------------------------------------------------------------------------* * WORKING_DIRECTORY_1 * * * *-------------------------------------------------------------------------*/ Bool Working_Directory_1(WamWord path_name_word) { char *path_name; path_name = M_Get_Working_Dir(); return Un_String_Check(path_name, path_name_word); } /*-------------------------------------------------------------------------* * CHANGE_DIRECTORY_1 * * * *-------------------------------------------------------------------------*/ Bool Change_Directory_1(WamWord path_name_word) { char *path_name; path_name = Get_Path_Name(path_name_word); errno = -1; Os_Test_Error(!M_Set_Working_Dir(path_name)); return TRUE; } /*-------------------------------------------------------------------------* * DIRECTORY_FILES_2 * * * *-------------------------------------------------------------------------*/ Bool Directory_Files_2(WamWord path_name_word, WamWord list_word) { char *path_name; Bool res; char *name; #ifdef _WIN32 long h; struct _finddata_t d; static char buff[MAXPATHLEN]; #else DIR *dir; struct dirent *cur_entry; #endif Check_For_Un_List(list_word); path_name = Get_Path_Name(path_name_word); #ifdef _WIN32 sprintf(buff, "%s\\*.*", path_name); h = _findfirst(buff, &d); /* instead of Win32 FindFirstFile since uses errno */ Os_Test_Error(h == -1); #else dir = opendir(path_name); Os_Test_Error(dir == NULL); #endif #ifdef _WIN32 do { name = d.name; #else while ((cur_entry = readdir(dir)) != NULL) { name = cur_entry->d_name; #endif if (!Get_List(list_word) || !Unify_Atom(Create_Allocate_Atom(name))) { res = FALSE; goto finish; } list_word = Unify_Variable(); } #ifdef _WIN32 while (_findnext(h, &d) == 0); #endif res = Get_Nil(list_word); finish: #ifdef _WIN32 _findclose(h); #else closedir(dir); #endif return res; } /*-------------------------------------------------------------------------* * RENAME_FILE_2 * * * *-------------------------------------------------------------------------*/ Bool Rename_File_2(WamWord path_name1_word, WamWord path_name2_word) { char path_name1[MAXPATHLEN]; char *path_name2; strcpy(path_name1, Get_Path_Name(path_name1_word)); path_name2 = Get_Path_Name(path_name2_word); Os_Test_Error(rename(path_name1, path_name2)); return TRUE; } /*-------------------------------------------------------------------------* * UNLINK_1 * * * *-------------------------------------------------------------------------*/ void Unlink_1(WamWord path_name_word) { char *path_name; path_name = Get_Path_Name(path_name_word); unlink(path_name); } /*-------------------------------------------------------------------------* * DELETE_FILE_1 * * * *-------------------------------------------------------------------------*/ Bool Delete_File_1(WamWord path_name_word) { char *path_name; path_name = Get_Path_Name(path_name_word); Os_Test_Error(unlink(path_name)); return TRUE; } /*-------------------------------------------------------------------------* * FILE_EXISTS_1 * * * *-------------------------------------------------------------------------*/ Bool File_Exists_1(WamWord path_name_word) { char *path_name; path_name = Get_Path_Name(path_name_word); if (access(path_name, F_OK)) { if (errno == ENOENT || errno == ENOTDIR) return FALSE; Os_Test_Error(1); } return TRUE; } /*-------------------------------------------------------------------------* * FILE_PERMISSION_2 * * * *-------------------------------------------------------------------------*/ Bool File_Permission_2(WamWord path_name_word, WamWord perm_list_word) { WamWord word, tag_mask; WamWord save_perm_list_word; WamWord *lst_adr; char *path_name; int mode, perm = 0; struct stat file_info; int res; Bool is_a_directory; path_name = Get_Path_Name(path_name_word); res = stat(path_name, &file_info); if (res == -1 && errno != ENOENT && errno != ENOTDIR) Os_Test_Error(1); mode = file_info.st_mode; is_a_directory = (res == 0) && S_ISDIR(mode); DEREF(perm_list_word, word, tag_mask); if (tag_mask == TAG_ATM_MASK && word != NIL_WORD) perm |= Flag_Of_Permission(word, is_a_directory); else { save_perm_list_word = perm_list_word; for (;;) { DEREF(perm_list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_perm_list_word); lst_adr = UnTag_LST(word); perm |= Flag_Of_Permission(Car(lst_adr), is_a_directory); perm_list_word = Cdr(lst_adr); } } return (res == 0) && perm > 0 && ((mode | perm) == mode); } /*-------------------------------------------------------------------------* * FLAG_OF_PERMISSION * * * *-------------------------------------------------------------------------*/ static int Flag_Of_Permission(WamWord perm_word, Bool is_a_directory) { int atom; atom = Rd_Atom_Check(perm_word); if (atom == atom_read) return S_IRUSR; if (atom == atom_write) return S_IWUSR; if (atom == atom_execute) return (is_a_directory) ? -1 : S_IXUSR; if (atom == atom_search) return (is_a_directory) ? S_IXUSR : -1; Pl_Err_Domain(domain_os_file_permission, perm_word); return 0; /* anything for the compiler */ } /*-------------------------------------------------------------------------* * FILE_PROP_ABSOLUTE_FILE_NAME_2 * * * *-------------------------------------------------------------------------*/ Bool File_Prop_Absolute_File_Name_2(WamWord absolute_path_name_word, WamWord path_name_word) { char *path_name; path_name = Get_Path_Name(path_name_word); Os_Test_Error(access(path_name, F_OK)); /* test if file exists */ return Un_String_Check(path_name, absolute_path_name_word); } /*-------------------------------------------------------------------------* * FILE_PROP_REAL_FILE_NAME_2 * * * *-------------------------------------------------------------------------*/ Bool File_Prop_Real_File_Name_2(WamWord real_path_name_word, WamWord path_name_word) { char *path_name = Get_Path_Name(path_name_word); #ifndef _WIN32 char real_path_name[MAXPATHLEN]; Os_Test_Error(realpath(path_name, real_path_name) == NULL); #else char *real_path_name = path_name; #endif return Un_String_Check(real_path_name, real_path_name_word); } /*-------------------------------------------------------------------------* * FILE_PROP_TYPE_2 * * * *-------------------------------------------------------------------------*/ Bool File_Prop_Type_2(WamWord type_word, WamWord path_name_word) { char *path_name; struct stat file_info; int atom; path_name = Get_Path_Name(path_name_word); Os_Test_Error(stat(path_name, &file_info)); if (S_ISREG(file_info.st_mode)) atom = atom_regular; else if (S_ISDIR(file_info.st_mode)) atom = atom_directory; #ifdef S_ISFIFO else if (S_ISFIFO(file_info.st_mode)) atom = atom_fifo; #endif #ifdef S_ISSOCK else if (S_ISSOCK(file_info.st_mode)) atom = atom_socket; #endif #ifdef S_ISCHR else if (S_ISCHR(file_info.st_mode)) atom = atom_character_device; #endif #ifdef S_ISBLK else if (S_ISBLK(file_info.st_mode)) atom = atom_block_device; #endif else atom = atom_unknown; return Un_Atom_Check(atom, type_word); } /*-------------------------------------------------------------------------* * FILE_PROP_SIZE_2 * * * *-------------------------------------------------------------------------*/ Bool File_Prop_Size_2(WamWord size_word, WamWord path_name_word) { char *path_name; struct stat file_info; path_name = Get_Path_Name(path_name_word); Os_Test_Error(stat(path_name, &file_info)); return Un_Positive_Check((int) file_info.st_size, size_word); } /*-------------------------------------------------------------------------* * CHECK_PROP_PERM_AND_FILE_2 * * * *-------------------------------------------------------------------------*/ Bool Check_Prop_Perm_And_File_2(WamWord perm_word, WamWord path_name_word) { WamWord word, tag_mask; char *path_name; path_name = Get_Path_Name(path_name_word); DEREF(perm_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) Flag_Of_Permission(perm_word, FALSE); /* to check perm validity */ Os_Test_Error(access(path_name, F_OK)); /* to check file existence */ return TRUE; } /*-------------------------------------------------------------------------* * FILE_PROP_DATE_2 * * * *-------------------------------------------------------------------------*/ Bool File_Prop_Date_2(WamWord date_time_word, WamWord path_name_word) { char *path_name; struct stat file_info; time_t *t; path_name = Get_Path_Name(path_name_word); Os_Test_Error(stat(path_name, &file_info)); switch (sys_var[0]) { case 0: t = &(file_info.st_ctime); break; case 1: t = &(file_info.st_atime); break; default: t = &(file_info.st_mtime); break; } return Date_Time_To_Prolog(t, date_time_word); } /*-------------------------------------------------------------------------* * TEMPORARY_NAME_2 * * * *-------------------------------------------------------------------------*/ Bool Temporary_Name_2(WamWord template_word, WamWord path_name_word) { char *template; char *path_name; template = Get_Path_Name(template_word); path_name = M_Mktemp(template); Os_Test_Error(path_name == NULL); return path_name && Un_String_Check(path_name, path_name_word); } /*-------------------------------------------------------------------------* * TEMPORARY_FILE_3 * * * *-------------------------------------------------------------------------*/ Bool Temporary_File_3(WamWord dir_word, WamWord prefix_word, WamWord path_name_word) { char *dir; char *prefix; char *path_name; dir = Rd_String_Check(dir_word); if (*dir == '\0') dir = NULL; else dir = Get_Path_Name(dir_word); prefix = Rd_String_Check(prefix_word); if (*prefix == '\0') prefix = NULL; path_name = M_Tempnam(dir, prefix); Os_Test_Error(path_name == NULL); return path_name && Un_String_Check(path_name, path_name_word); } /*-------------------------------------------------------------------------* * DATE_TIME_1 * * * *-------------------------------------------------------------------------*/ Bool Date_Time_1(WamWord date_time_word) { time_t t; t = time(NULL); return Date_Time_To_Prolog(&t, date_time_word); } /*-------------------------------------------------------------------------* * HOST_NAME_1 * * * *-------------------------------------------------------------------------*/ Bool Host_Name_1(WamWord host_name_word) { WamWord word, tag_mask; int atom; static int atom_host_name = -1; /* not created in an init since */ /* establishes a connection */ /* (ifndef NO_USE_SOCKETS) */ if (atom_host_name < 0) atom_host_name = Create_Allocate_Atom(M_Host_Name_From_Name(NULL)); DEREF(host_name_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) return Get_Atom(atom_host_name, host_name_word); atom = Rd_Atom_Check(word); return atom == atom_host_name || strcmp(M_Host_Name_From_Name(atom_tbl[atom].name), atom_tbl[atom_host_name].name) == 0; } /*-------------------------------------------------------------------------* * OS_VERSION_1 * * * *-------------------------------------------------------------------------*/ Bool Os_Version_1(WamWord os_version_word) { return Un_String_Check(m_os_version, os_version_word); } /*-------------------------------------------------------------------------* * ARCHITECTURE_1 * * * *-------------------------------------------------------------------------*/ Bool Architecture_1(WamWord architecture_word) { return Un_String_Check(m_architecture, architecture_word); } /*-------------------------------------------------------------------------* * SLEEP_1 * * * *-------------------------------------------------------------------------*/ void Sleep_1(WamWord seconds_word) { #ifdef _WIN32 DWORD ms; ms = (DWORD) (Rd_Number_Check(seconds_word) * 1000); if (ms < 0) Pl_Err_Domain(domain_not_less_than_zero, seconds_word); Sleep(ms); #else long us; us = (long) (Rd_Number_Check(seconds_word) * 1000000); if (us < 0) Pl_Err_Domain(domain_not_less_than_zero, seconds_word); usleep(us); #endif } /*-------------------------------------------------------------------------* * SHELL_2 * * * *-------------------------------------------------------------------------*/ Bool Shell_2(WamWord cmd_word, WamWord status_word) { char *cmd; int status; cmd = Rd_String_Check(cmd_word); if (*cmd == '\0') cmd = NULL; Check_For_Un_Integer(status_word); Flush_All_Streams(); status = M_Shell(cmd); return Get_Integer(status, status_word); } /*-------------------------------------------------------------------------* * SYSTEM_2 * * * *-------------------------------------------------------------------------*/ Bool System_2(WamWord cmd_word, WamWord status_word) { char *cmd; int status; cmd = Rd_String_Check(cmd_word); Check_For_Un_Integer(status_word); #ifdef _WIN32 _flushall(); #endif Flush_All_Streams(); status = system(cmd); return Get_Integer(status, status_word); } /*-------------------------------------------------------------------------* * SPAWN_3 * * * *-------------------------------------------------------------------------*/ Bool Spawn_3(WamWord cmd_word, WamWord list_word, WamWord status_word) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr; char *arg[MAX_SPAWN_ARGS]; char **p = arg; char err[64]; int status; save_list_word = list_word; *p++ = Rd_String_Check(cmd_word); for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); *p++ = Rd_String_Check(Car(lst_adr)); list_word = Cdr(lst_adr); } *p = NULL; Check_For_Un_Integer(status_word); Flush_All_Streams(); status = M_Spawn(arg); Os_Test_Error(status == -1); if (status == -2) { sprintf(err, "error trying to execute %s", arg[0]); Pl_Err_System(Create_Allocate_Atom(err)); return FALSE; } return Get_Integer(status, status_word); } /*-------------------------------------------------------------------------* * POPEN_3 * * * *-------------------------------------------------------------------------*/ Bool Popen_3(WamWord cmd_word, WamWord mode_word, WamWord stm_word) { char *cmd; int atom; int mode; int stm; FILE *f; char open_str[10]; cmd = Rd_String_Check(cmd_word); atom = Rd_Atom_Check(mode_word); if (atom == atom_read) { mode = STREAM_MODE_READ; strcpy(open_str, "r"); } else if (atom == atom_write) { mode = STREAM_MODE_WRITE; strcpy(open_str, "w"); } else Pl_Err_Domain(domain_io_mode, mode_word); Flush_All_Streams(); f = popen(cmd, open_str); Os_Test_Error(f == NULL); sprintf(glob_buff, "popen_stream('%.1024s')", cmd); atom = Create_Allocate_Atom(glob_buff); stm = Add_Stream_For_Stdio_Desc(f, atom, mode, TRUE); stm_tbl[stm]->fct_close = (StmFct) pclose; return Get_Integer(stm, stm_word); } /*-------------------------------------------------------------------------* * EXEC_5 * * * *-------------------------------------------------------------------------*/ Bool Exec_5(WamWord cmd_word, WamWord stm_in_word, WamWord stm_out_word, WamWord stm_err_word, WamWord pid_word) { char *cmd; char **arg; int stm; FILE *f_in, *f_out, *f_err; int pid; int mask = SYS_VAR_OPTION_MASK; int atom; char err[64]; cmd = Rd_String_Check(cmd_word); arg = M_Create_Shell_Command(cmd); Flush_All_Streams(); pid = M_Spawn_Redirect(arg, (mask & 1) == 0, &f_in, &f_out, &f_err); Os_Test_Error(pid == -1); if (pid == -2) { sprintf(err, "error trying to execute %s", cmd); Pl_Err_System(Create_Allocate_Atom(err)); return FALSE; } if (mask & 1) /* pid needed ? */ Get_Integer(pid, pid_word); sprintf(glob_buff, "exec_stream('%.1024s')", cmd); atom = Create_Allocate_Atom(glob_buff); stm = Add_Stream_For_Stdio_Desc(f_in, atom, STREAM_MODE_WRITE, TRUE); Get_Integer(stm, stm_in_word); #ifdef DEBUG DBGPRINTF("Added Stream Input: %d\n", stm); #endif stm = Add_Stream_For_Stdio_Desc(f_out, atom, STREAM_MODE_READ, TRUE); stm_tbl[stm]->prop.eof_action = STREAM_EOF_ACTION_RESET; Get_Integer(stm, stm_out_word); #ifdef DEBUG DBGPRINTF("Added Stream Output: %d\n", stm); #endif stm = Add_Stream_For_Stdio_Desc(f_err, atom, STREAM_MODE_READ, TRUE); stm_tbl[stm]->prop.eof_action = STREAM_EOF_ACTION_RESET; Get_Integer(stm, stm_err_word); #ifdef DEBUG DBGPRINTF("Added Stream Error: %d\n", stm); #endif return TRUE; } /*-------------------------------------------------------------------------* * CREATE_PIPE_2 * * * *-------------------------------------------------------------------------*/ Bool Create_Pipe_2(WamWord stm_in_word, WamWord stm_out_word) { int p[2]; int stm; FILE *f_in, *f_out; int atom; #ifdef _WIN32 Os_Test_Error(_pipe(p, 4096, O_TEXT)); #else Os_Test_Error(pipe(p)); #endif Os_Test_Error((f_in = fdopen(p[0], "rt")) == NULL); sprintf(glob_buff, "pipe_stream_in"); atom = Create_Allocate_Atom(glob_buff); stm = Add_Stream_For_Stdio_Desc(f_in, atom, STREAM_MODE_READ, TRUE); stm_tbl[stm]->prop.eof_action = STREAM_EOF_ACTION_RESET; Get_Integer(stm, stm_in_word); Os_Test_Error((f_out = fdopen(p[1], "wt")) == NULL); sprintf(glob_buff, "pipe_stream_out"); atom = Create_Allocate_Atom(glob_buff); stm = Add_Stream_For_Stdio_Desc(f_out, atom, STREAM_MODE_WRITE, TRUE); Get_Integer(stm, stm_out_word); return TRUE; } /*-------------------------------------------------------------------------* * FORK_PROLOG_1 * * * *-------------------------------------------------------------------------*/ Bool Fork_Prolog_1(WamWord pid_word) { #ifdef _WIN32 Pl_Err_Resource(Create_Atom("not implemented")); return FALSE; #else int pid; pid = fork(); Os_Test_Error(pid == -1); return Get_Integer(pid, pid_word); #endif } /*-------------------------------------------------------------------------* * SELECT_5 * * * *-------------------------------------------------------------------------*/ Bool Select_5(WamWord reads_word, WamWord ready_reads_word, WamWord writes_word, WamWord ready_writes_word, WamWord time_out_word) { #if defined(_WIN32) && defined(NO_USE_SOCKETS) Pl_Err_Resource(Create_Atom("not implemented")); return FALSE; #else double time_out; struct timeval *p, t; fd_set read_set, write_set; int max, n; max = Select_Init_Set(reads_word, &read_set, STREAM_CHECK_INPUT); Check_For_Un_List(ready_reads_word); n = Select_Init_Set(writes_word, &write_set, STREAM_CHECK_OUTPUT); if (n > max) max = n; Check_For_Un_List(ready_writes_word); time_out = Rd_Number_Check(time_out_word); if (time_out <= 0) p = NULL; else { t.tv_sec = (long) (time_out / 1000); t.tv_usec = (long) (fmod(time_out, 1000) * 1000); p = &t; } Os_Test_Error(select(max + 1, &read_set, &write_set, NULL, p) < 0); return Select_Init_Ready_List(reads_word, &read_set, ready_reads_word) && Select_Init_Ready_List(writes_word, &write_set, ready_writes_word); #endif } /*-------------------------------------------------------------------------* * SELECT_INIT_SET * * * *-------------------------------------------------------------------------*/ static int Select_Init_Set(WamWord list_word, fd_set *set, int check) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr; int stm; int fd, max = 0; FD_ZERO(set); save_list_word = list_word; for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); if (tag_mask == TAG_INT_MASK) fd = Rd_Positive_Check(word); else { stm = Get_Stream_Or_Alias(word, check); fd = Io_Fileno_Of_Stream(stm); if (fd < 0) Pl_Err_Domain(domain_selectable_item, word); } #ifdef FD_SETSIZE if (fd >= FD_SETSIZE) { errno = EBADF; Os_Test_Error(1); } #endif FD_SET(fd, set); if (fd > max) max = fd; list_word = Cdr(lst_adr); } return max; } /*-------------------------------------------------------------------------* * SELECT_INIT_READY_LIST * * * *-------------------------------------------------------------------------*/ static Bool Select_Init_Ready_List(WamWord list_word, fd_set *set, WamWord ready_list_word) { WamWord word, tag_mask; WamWord *lst_adr; int stm; int fd; for (;;) { DEREF(list_word, word, tag_mask); if (word == NIL_WORD) break; lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); if (tag_mask == TAG_INT_MASK) fd = UnTag_INT(word); else { stm = Get_Stream_Or_Alias(word, STREAM_CHECK_VALID); fd = (stm < 0) ? -1 : Io_Fileno_Of_Stream(stm); } if (FD_ISSET(fd, set)) { if (!Get_List(ready_list_word) || !Unify_Value(word)) return FALSE; ready_list_word = Unify_Variable(); } list_word = Cdr(lst_adr); } return Get_Nil(ready_list_word); } /*-------------------------------------------------------------------------* * PROLOG_PID_1 * * * *-------------------------------------------------------------------------*/ Bool Prolog_Pid_1(WamWord prolog_pid_word) { int prolog_pid; prolog_pid = (int) getpid(); return Un_Integer_Check(prolog_pid, prolog_pid_word); } /*-------------------------------------------------------------------------* * SEND_SIGNAL_2 * * * *-------------------------------------------------------------------------*/ Bool Send_Signal_2(WamWord pid_word, WamWord signal_word) { WamWord word, tag_mask; int pid; int sig; int atom; int i; pid = Rd_Integer_Check(pid_word); DEREF(signal_word, word, tag_mask); if (tag_mask == TAG_ATM_MASK) { atom = UnTag_ATM(word); sig = -1; for (i = 0; i < nb_sig; i++) if (tsig[i].atom == atom) { sig = tsig[i].sig; break; } } else sig = Rd_Integer_Check(word); #ifdef _WIN32 { int ret; if (pid != _getpid()) { errno = EINVAL; ret = 1; } else { errno = 0; ret = raise(sig); } Os_Test_Error(ret); } #else Os_Test_Error(kill(pid, sig)); #endif return TRUE; } /*-------------------------------------------------------------------------* * WAIT_2 * * * *-------------------------------------------------------------------------*/ Bool Wait_2(WamWord pid_word, WamWord status_word) { int pid; int status; pid = Rd_Integer_Check(pid_word); Check_For_Un_Integer(status_word); #ifdef _WIN32 Os_Test_Error(_cwait(&status, pid, _WAIT_CHILD) == -1); #else Os_Test_Error(waitpid(pid, &status, 0) == -1); if (WIFEXITED(status)) status = WEXITSTATUS(status); #endif return Get_Integer(status, status_word); } /*-------------------------------------------------------------------------* * GET_PATH_NAME * * * *-------------------------------------------------------------------------*/ static char * Get_Path_Name(WamWord path_name_word) { char *path_name; path_name = Rd_String_Check(path_name_word); if ((path_name = M_Absolute_Path_Name(path_name)) == NULL) Pl_Err_Domain(domain_os_path, path_name_word); return path_name; } /*-------------------------------------------------------------------------* * DATE_TIME_TO_PROLOG * * * *-------------------------------------------------------------------------*/ static Bool Date_Time_To_Prolog(time_t *t, WamWord date_time_word) { WamWord word, tag_mask; WamWord year_word, month_word, day_word; WamWord hour_word, minute_word, second_word; struct tm *tm; int day, month, year; int hour, minute, second; tm = localtime(t); year = tm->tm_year + 1900; month = tm->tm_mon + 1; day = tm->tm_mday; hour = tm->tm_hour; minute = tm->tm_min; second = tm->tm_sec; DEREF(date_time_word, word, tag_mask); if (tag_mask != TAG_REF_MASK && tag_mask != TAG_LST_MASK && tag_mask != TAG_STC_MASK) Pl_Err_Type(type_compound, word); if (!Get_Structure(atom_dt, 6, word)) Pl_Err_Domain(domain_date_time, word); year_word = Unify_Variable(); month_word = Unify_Variable(); day_word = Unify_Variable(); hour_word = Unify_Variable(); minute_word = Unify_Variable(); second_word = Unify_Variable(); Check_For_Un_Integer(year_word); Check_For_Un_Integer(month_word); Check_For_Un_Integer(day_word); Check_For_Un_Integer(hour_word); Check_For_Un_Integer(minute_word); Check_For_Un_Integer(second_word); return Get_Integer(year, year_word) && Get_Integer(month, month_word) && Get_Integer(day, day_word) && Get_Integer(hour, hour_word) && Get_Integer(minute, minute_word) && Get_Integer(second, second_word); } ./gprolog-1.3.0/src/BipsPl/format.pl0000644004425400513100000000403610547162352015606 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : format.pl * * Descr.: formatted output management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: format.pl,v 1.11 2007/01/04 10:35:10 diaz Exp $ */ :- built_in. '$use_format'. format(Format, Args) :- set_bip_name(format, 2), '$call_c'('Format_2'(Format, Args)). format(SorA, Format, Args) :- set_bip_name(format, 3), '$call_c'('Format_3'(SorA, Format, Args)). ./gprolog-1.3.0/src/BipsPl/pl_error.pl0000644004425400513100000000563110547162353016145 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : pl_error.pl * * Descr.: Prolog error management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: pl_error.pl,v 1.11 2007/01/04 10:35:11 diaz Exp $ */ :- built_in. set_bip_name(Name, Arity) :- '$call_c'('Set_Bip_Name_2'(Name, Arity)). current_bip_name(Name, Arity) :- '$call_c_test'('Current_Bip_Name_2'(Name, Arity)). '$pl_err_instantiation' :- '$pl_error'(instantiation_error). '$pl_err_type'(Type, T) :- '$pl_error'(type_error(Type, T)). '$pl_err_domain'(Dom, T) :- '$pl_error'(domain_error(Dom, T)). '$pl_err_existence'(Object, T) :- '$pl_error'(existence_error(Object, T)). '$pl_err_permission'(Oper, Perm, T) :- '$pl_error'(permission_error(Oper, Perm, T)). '$pl_err_representation'(Flag) :- '$pl_error'(representation_error(Flag)). '$pl_err_evaluation'(Error) :- '$pl_error'(evaluation_error(Error)). '$pl_err_resource'(Flag) :- '$pl_error'(resource_error(Flag)). '$pl_err_syntax'(T) :- '$pl_error'(syntax_error(T)). '$pl_err_system'(T) :- '$pl_error'(system_error(T)). '$pl_error'(Msg) :- '$call_c'('Context_Error_1'(ContextAtom)), throw(error(Msg, ContextAtom)). syntax_error_info(FileName, Line, Char, Msg) :- set_bip_name(syntax_error_info, 4), '$call_c_test'('Syntax_Error_Info_4'(FileName, Line, Char, Msg)). ./gprolog-1.3.0/src/BipsPl/term_inl.pl0000644004425400513100000000506410547162354016133 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : term_inl.pl * * Descr.: term (inline) management - defs for meta-call * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: term_inl.pl,v 1.11 2007/01/04 10:35:12 diaz Exp $ */ :- built_in. '$use_term_inl'. compare(C, T1, T2) :- compare(C, T1, T2). X == Y :- X == Y. X \== Y :- X \== Y. X @< Y :- X @< Y. X @=< Y :- X @=< Y. X @> Y :- X @> Y. X @>= Y :- X @>= Y. arg(N, T, A) :- arg(N, T, A). functor(T, F, N) :- functor(T, F, N). Term =.. List :- Term =.. List. copy_term(T1, T2) :- set_bip_name(copy_term, 2), '$call_c_test'('Copy_Term_2'(T1, T2)). setarg(ArgNo, Term, NewValue) :- set_bip_name(setarg, 3), '$call_c_test'('Setarg_4'(ArgNo, Term, NewValue, true)). setarg(ArgNo, Term, NewValue, Undo) :- set_bip_name(setarg, 4), '$call_c_test'('Setarg_4'(ArgNo, Term, NewValue, Undo)). term_ref(Term, Ref) :- set_bip_name(term_ref, 2), '$call_c_test'('Term_Ref_2'(Term, Ref)). ./gprolog-1.3.0/src/BipsPl/sort.wam0000644004425400513100000000470010547440332015451 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : sort.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/sort.pl'). predicate('$use_sort'/0,29,static,private,built_in,[ proceed]). predicate(sort/2,32,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(sort,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(0,1), call('$sys_var_write'/2), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Sort_List_2',[boolean],[x(0),x(1)]), proceed]). predicate(sort0/2,40,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(sort0,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(1,1), call('$sys_var_write'/2), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Sort_List_2',[boolean],[x(0),x(1)]), proceed]). predicate(keysort/2,48,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(keysort,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(2,1), call('$sys_var_write'/2), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Sort_List_2',[boolean],[x(0),x(1)]), proceed]). predicate(sort/1,56,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(sort,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(0,1), call('$sys_var_write'/2), put_value(y(0),0), deallocate, call_c('Sort_List_1',[],[x(0)]), proceed]). predicate(sort0/1,64,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(sort0,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(1,1), call('$sys_var_write'/2), put_value(y(0),0), deallocate, call_c('Sort_List_1',[],[x(0)]), proceed]). predicate(keysort/1,72,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(keysort,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(2,1), call('$sys_var_write'/2), put_value(y(0),0), deallocate, call_c('Sort_List_1',[],[x(0)]), proceed]). ./gprolog-1.3.0/src/BipsPl/sockets.wam0000644004425400513100000000776610547440332016154 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : sockets.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/sockets.pl'). predicate('$use_sockets'/0,29,static,private,built_in,[ proceed]). predicate(socket/2,32,static,private,built_in,[ put_atom(socket,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Socket_2',[boolean],[x(0),x(1)]), proceed]). predicate(socket_close/1,39,static,private,built_in,[ put_atom(socket_close,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Socket_Close_1',[boolean],[x(0)]), proceed]). predicate(socket_bind/2,46,static,private,built_in,[ put_atom(socket_bind,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Socket_Bind_2',[boolean],[x(0),x(1)]), proceed]). predicate(socket_connect/4,53,static,private,built_in,[ allocate(5), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),3), put_atom(socket_connect,0), put_integer(4,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(x(2),0), put_variable(y(3),1), call('$get_open_stm'/2), put_value(y(2),0), put_variable(y(4),1), call('$get_open_stm'/2), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(3),2), put_unsafe_value(y(4),3), deallocate, call_c('Socket_Connect_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). predicate(socket_listen/2,62,static,private,built_in,[ put_atom(socket_listen,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Socket_Listen_2',[boolean],[x(0),x(1)]), proceed]). predicate(socket_accept/3,69,static,private,built_in,[ allocate(4), get_variable(y(0),0), get_variable(y(1),2), put_atom(socket_accept,0), put_integer(3,2), call_c('Set_Bip_Name_2',[],[x(0),x(2)]), put_value(x(1),0), put_variable(y(2),1), call('$get_open_stm'/2), put_value(y(1),0), put_variable(y(3),1), call('$get_open_stm'/2), put_value(y(0),0), put_void(1), put_unsafe_value(y(2),2), put_unsafe_value(y(3),3), deallocate, call_c('Socket_Accept_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). predicate(socket_accept/4,76,static,private,built_in,[ allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_atom(socket_accept,0), put_integer(4,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(1),0), call('$socket_accept/4_$aux1'/1), put_value(y(2),0), put_variable(y(4),1), call('$get_open_stm'/2), put_value(y(3),0), put_variable(y(5),1), call('$get_open_stm'/2), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(4),2), put_unsafe_value(y(5),3), deallocate, call_c('Socket_Accept_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). predicate('$socket_accept/4_$aux1'/1,76,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), proceed, label(1), trust_me_else_fail, put_value(x(0),1), put_atom(variable,0), execute('$pl_err_type'/2)]). predicate('$assoc_socket_streams'/3,89,static,private,built_in,[ allocate(4), get_variable(y(0),0), get_variable(y(1),2), put_atom('$assoc_socket_streams',0), put_integer(3,2), call_c('Set_Bip_Name_2',[],[x(0),x(2)]), put_value(x(1),0), put_variable(y(2),1), call('$get_open_stm'/2), put_value(y(1),0), put_variable(y(3),1), call('$get_open_stm'/2), put_value(y(0),0), put_unsafe_value(y(2),1), put_unsafe_value(y(3),2), deallocate, call_c('Assoc_Socket_Streams_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(hostname_address/2,98,static,private,built_in,[ put_atom(hostname_address,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Hostname_Address_2',[boolean],[x(0),x(1)]), proceed]). ./gprolog-1.3.0/src/BipsPl/t_c.c0000755004425400513100000001042610547152500014667 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : t_c.c * * Descr.: test - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: t_c.c,v 1.14 2002/05/07 17:45:47 diaz Exp $ */ #if 0 #include "engine_pl.h" #include "bips_pl.h" #endif /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * * * * *-------------------------------------------------------------------------*/ #if 0 #include #include Bool segfault( char *in, PlTerm out ) { if( strcmp(in,"yes") == 0 ) { printf("Calling system error\n"); Pl_Err_System(Create_Atom("segfault_system_error_test")); printf("return\n"); return FALSE; } else { printf("unifying\n"); Un_String_Check("Hello, World!", out); printf("return\n"); return TRUE; } return FALSE; } #endif #if 0 #include "gprolog.h" int i=0; Bool malloc_test(int size) { void * tmp; i++; tmp = malloc(size); if (tmp == NULL) { printf("FAILED AT %d MB\n", i); exit(1); } printf("OK at: %lx\n", tmp); return TRUE; } #endif #if 0 #include "gprolog.h" int i=0; Bool malloc_test(int size) { void * tmp; i++; tmp = malloc(size); if (tmp == NULL) { Pl_Err_System(Create_Atom("malloc_test exception")); } printf("OK at: %p\n", tmp); return TRUE; } #endif #if 0 int i=0; Bool malloc_test(int size) { Pl_Err_System(Create_Atom("malloc_test exception")); return TRUE; } #endif #include #include "gprolog.h" Bool calling_c(PlTerm In,PlTerm* Out) { PlTerm arg[2]; int i; for(i=0;i<2;i++) arg[i]=X(1); Pl_Query_Begin(TRUE); Pl_Query_Call(Find_Atom("write"),1,&In); Pl_Query_End(PL_RECOVER); for(i=0;i<2;i++) X(1)=arg[i]; *Out = Mk_Atom(atom_nil); return PL_SUCCESS; } Bool Is_Kbd_Empty(void) { /* to put in stream_supp.c if (tty_ptr != NULL && *tty_ptr != '\0') return FALSE; */ int result = !LE_Kbd_Is_Not_Empty(); printf("result: %d\n", result); return result; } ./gprolog-1.3.0/src/BipsPl/debugger.pl0000644004425400513100000005673610547162352016120 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : debugger.pl * * Descr.: debugger * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: debugger.pl,v 1.13 2007/01/04 10:35:09 diaz Exp $ */ :- built_in. '$init_debugger' :- % called by Debug_Initializer() '$sys_var_write'(13, 1), % debugger is present DebugInfo = d(0, []), g_link('$debug_info', DebugInfo), '$debug_switch_off'. '$debug_switch_off' :- g_assign('$debug_mode', nodebug), g_assign('$debug_next', nodebug), g_assign('$debug_leash', 31), g_assign('$debug_depth', 10), '$call_c'('Reset_Debug_Call_Code_0'). '$debug_switch_on'(DebugMode) :- g_assign('$debug_mode', DebugMode), g_assign('$debug_next', DebugMode), g_read('$debug_info', DebugInfo), setarg(1, DebugInfo, 0, false), setarg(2, DebugInfo, [], false), '$call_c'('Set_Debug_Call_Code_0'). % Debugger built-in predicates wam_debug :- set_bip_name(wam_debug, 0), '$call_c'('Debug_Wam'). notrace :- set_bip_name(notrace, 0), nodebug. nodebug :- set_bip_name(nodebug, 0), '$debug_switch_off', '$show_debugger_mode'. trace :- set_bip_name(trace, 0), '$debug_switch_on'(trace), '$show_debugger_mode'. debug :- set_bip_name(debug, 0), '$debug_switch_on'(debug), '$show_debugger_mode'. '$show_debugger_mode' :- g_read('$debug_mode', DebugMode), '$show_debugger_mode1'(DebugMode), nl(debugger_output). '$show_debugger_mode1'(nodebug) :- write(debugger_output, 'The debugger is switched off'). '$show_debugger_mode1'(trace) :- write(debugger_output, 'The debugger will first creep -- '), write(debugger_output, 'showing everything (trace)'). '$show_debugger_mode1'(debug) :- write(debugger_output, 'The debugger will first leap -- '), write(debugger_output, 'showing spypoints (debug)'). debugging :- set_bip_name(debugging, 0), '$show_debugger_mode', '$show_leashing_info', '$show_undefined_action', '$show_spy_points'. leash(L) :- set_bip_name(leash, 1), var(L), !, '$pl_err_instantiation'. leash(full) :- !, leash([call, exit, redo, fail, exception]). leash(half) :- !, leash([call, redo]). leash(loose) :- !, leash([call]). leash(none) :- !, leash([]). leash(tight) :- !, leash([call, redo, fail, exception]). leash(L) :- '$leash_make_mask'(L, LeashMask), !, g_assign('$debug_leash', LeashMask), '$show_leashing_info'. leash(L) :- '$pl_err_domain'(leash_ports, L). '$leash_make_mask'([], 0). '$leash_make_mask'([Port|L], LeashMask1) :- '$leash_make_mask'(L, LeashMask), '$debug_port_mask'(Port, Mask), LeashMask1 is LeashMask \/ Mask. '$show_leashing_info' :- g_read('$debug_leash', LeashMask), '$show_leashing_info1'(LeashMask), nl(debugger_output). '$show_leashing_info1'(0) :- !, write(debugger_output, 'No leashing'). '$show_leashing_info1'(LeashMask) :- write(debugger_output, 'Using leashing stopping at '), g_assign('$debug_work', 91), '$show_leashing_info2'(LeashMask), write(debugger_output, '] ports'). '$show_leashing_info2'(LeashMask) :- '$debug_port_mask'(Port, Mask), LeashMask /\ Mask > 0, g_read('$debug_work', C), g_assign('$debug_work', 44), format(debugger_output, '~c~a', [C, Port]), fail. '$show_leashing_info2'(_). '$debug_is_not_leashed'(Port) :- g_read('$debug_leash', LeashMask), '$debug_port_mask'(Port, Mask), Mask /\ LeashMask =:= 0 . '$debug_port_mask'(call, 1). '$debug_port_mask'(exit, 2). '$debug_port_mask'(redo, 4). '$debug_port_mask'(fail, 8). '$debug_port_mask'(exception, 16). '$show_undefined_action' :- current_prolog_flag(unknown, Action), write(debugger_output, 'Undefined predicates will '), '$show_undefined_action1'(Action), nl(debugger_output). '$show_undefined_action1'(error) :- write(debugger_output, 'raise an existence_error'). '$show_undefined_action1'(warning) :- write(debugger_output, 'display a warning message and fail'). '$show_undefined_action1'(fail) :- write(debugger_output, fail). spypoint_condition(Goal, _, _) :- set_bip_name(spypoint_condition, 3), var(Goal), !, '$pl_err_instantiation'. spypoint_condition(Goal, Port, Test) :- callable(Goal), !, '$spypoint_condition1'(Goal, Port, Test). spypoint_condition(Goal, _, _) :- '$pl_err_type'(callable, Goal). '$spypoint_condition1'(Goal, Port, Test) :- functor(Goal, N, A), ( '$current_predicate_any'(N / A) -> '$debug_spy_set'([N / A], c(Goal, Port, Test)), g_read('$debug_mode', nodebug), debug ; format(debugger_output, 'Warning: The predicate ~a/~d is undefined~n', [N, A]) ), fail. '$spypoint_condition1'(_, _, _). spy(Spec) :- set_bip_name(spy, 1), '$debug_list_of_pred'(Spec, L), '$debug_spy_set'(L, _), L \== [], g_read('$debug_mode', nodebug), debug, fail. spy(_). nospy(Spec) :- set_bip_name(nospy, 1), '$debug_list_of_pred'(Spec, L), '$debug_spy_reset'(L), fail. nospy(_). nospyall :- set_bip_name(nospyall, 0), retractall('$debug_spy_point'(_, _, _)), write(debugger_output, 'All spypoints removed'), nl(debugger_output), fail. nospyall. '$debug_spy_set'([], _). '$debug_spy_set'([N / A|L], Cond) :- ( retract('$debug_spy_point'(N, A, _)) -> Msg = 'There is already a spypoint on' ; Msg = 'Spypoint placed on' ), assertz('$debug_spy_point'(N, A, Cond)), format(debugger_output, '~a ~a/~d~n', [Msg, N, A]), !, '$debug_spy_set'(L, Cond). '$debug_spy_reset'([]). '$debug_spy_reset'([N / A|L]) :- ( retract('$debug_spy_point'(N, A, _)) -> Msg = 'Spypoint removed from' ; Msg = 'There is no spypoint on' ), format(debugger_output, '~a ~a/~d~n', [Msg, N, A]), !, '$debug_spy_reset'(L). '$has_spy_point'(Goal, Cond) :- functor(Goal, N, A), clause('$debug_spy_point'(N, A, Cond), _), !. '$has_no_spy_point'(Goal) :- functor(Goal, N, A), clause('$debug_spy_point'(N, A, _), _), !, fail. '$has_no_spy_point'(_). '$spy_test_condition'(Goal, Port, c(Goal, Port, Test)) :- ( var(Test) -> true ; '$call'(Test, spy_conditional, 1, false), ! ). '$show_spy_points' :- write(debugger_output, 'Spypoints:'), nl(debugger_output), clause('$debug_spy_point'(N, A, _), _), format(debugger_output, ' ~a/~d~n', [N, A]), fail. '$show_spy_points'. '$debug_list_of_pred'(Spec, _) :- var(Spec), !, '$pl_err_instantiation'. '$debug_list_of_pred'([], []) :- !. '$debug_list_of_pred'([Spec1|Spec2], L) :- !, '$debug_list_of_pred'(Spec1, L1), '$debug_list_of_pred'(Spec2, L2), append(L1, L2, L). '$debug_list_of_pred'(N / A1 - A2, L) :- '$debug_list_of_pred1'(N, A1, A2, L), !. '$debug_list_of_pred'(N, L) :- atom(N), !, current_prolog_flag(max_arity, Max), '$debug_list_of_pred1'(N, 0, Max, L), !. '$debug_list_of_pred'(PI, L) :- '$get_pred_indic'(PI, N, A), '$debug_list_of_pred1'(N, A, A, L). '$debug_list_of_pred1'(N, _, _, _) :- var(N), !, '$pl_err_instantiation'. '$debug_list_of_pred1'(_, A1, _, _) :- var(A1), !, '$pl_err_instantiation'. '$debug_list_of_pred1'(_, _, A2, _) :- var(A2), !, '$pl_err_instantiation'. '$debug_list_of_pred1'(N, A1, A2, L) :- atom(N), current_prolog_flag(max_arity, Max), integer(A1), integer(A2), A1 >= 0, A1 =< Max, A2 >= 0, A2 =< Max, g_assign('$debug_work', []), ( '$current_predicate_any'(N / A), A >= A1, A =< A2, g_read('$debug_work', X), g_assign('$debug_work', [N / A|X]), fail ; g_read('$debug_work', L) ), ( L = [], ( A1 = A2, Z = A1 ; A1 = 0, A2 = Max, Z = any ; Z = A1 - A2 ), format(debugger_output, 'Warning: spy ~a/~w - no matching predicate~n', [N, Z]) ; true ). % The debugger: % % '$debug_call'/2 is called by meta-call (cf Call_2()) when the % debugger is active, ie. Set_Debug_Call_Code() has been called '$debug_call'(notrace, _) :- !, notrace. '$debug_call'(nodebug, _) :- !, nodebug. '$debug_call'(trace, _) :- !, trace. '$debug_call'(debug, _) :- !, debug. '$debug_call'(debugging, _) :- !, debugging. '$debug_call'(leash(L), _) :- !, leash(L). '$debug_call'(spy(Spec), _) :- !, spy(Spec). '$debug_call'(spypoint_condition(Goal, Port, Test), _) :- !, spypoint_condition(Goal, Port, Test). '$debug_call'(nospy(Spec), _) :- !, nospy(Spec). '$debug_call'(nospyall, _) :- !, nospyall. '$debug_call'(Goal, CallInfo) :- g_read('$debug_info', DebugInfo), DebugInfo = d(Invoc, OldAncLst), ( OldAncLst = [] -> Index = 0 ; OldAncLst = [a(_, _, Index, _)|_] ), Invoc1 is Invoc + 1, Index1 is Index + 1, '$get_current_B'(B), NewAncLst = [a(Goal, Invoc1, Index1, B)|OldAncLst], setarg(1, DebugInfo, Invoc1), setarg(2, DebugInfo, NewAncLst), % format('starting of call:~w',[Goal]), disp_B(''), '$debug_call1'(Goal, CallInfo, Invoc1, Index1, NewAncLst, DebugInfo, Invoc, OldAncLst). %disp_B(Msg):- %'$get_current_B'(B), %format(' ~w B:%#x\n',[Msg,B]). '$debug_call1'(Goal, CallInfo, Invoc1, Index1, NewAncLst, DebugInfo, _, OldAncLst) :- % format('Goal:~w Call Info:~w~n',[Goal,CallInfo]), '$get_current_B'(B), '$catch_internal'('$debug_call_port'(Goal, CallInfo, Invoc1, Index1, NewAncLst), Ball, '$debug_exception_port'(Goal, Invoc1, Index1, NewAncLst, Ball), 0), '$get_current_B'(B1), % format(' after effective call: ~w B(start):%#x B1(end):%#x~n',[Goal,B,B1]), % disp_B('before end call'), '$debug_end_call'(Goal, Invoc1, Index1, NewAncLst, DebugInfo, OldAncLst), % disp_B('after end call and before test determin'), ( B1 =< B, ! ; true ). %disp_B('after cut if determin'). '$debug_call1'(Goal, _, Invoc1, Index1, NewAncLst, _, _, _) :- '$debug_port'(Goal, Invoc1, Index1, NewAncLst, fail), fail. '$debug_call1'(Goal, CallInfo, Invoc1, _, _, DebugInfo, Invoc, OldAncLst) :- g_read('$debug_next', retry(X)), X >= Invoc1, setarg(1, DebugInfo, Invoc), setarg(2, DebugInfo, OldAncLst), g_assign('$debug_next', trace), '$debug_call'(Goal, CallInfo). '$debug_call_port'(Goal, CallInfo, Invoc, Index, AncLst) :- g_assign('$debug_unify', ''), '$debug_port'(Goal, Invoc, Index, AncLst, call), g_read('$debug_unify', DebugUnify), ( DebugUnify == '' -> '$call_from_debugger'(Goal, CallInfo) ; Goal = DebugUnify ). '$debug_end_call'(Goal, Invoc1, Index1, AncLst, DebugInfo, OldAncLst) :- '$debug_port'(Goal, Invoc1, Index1, AncLst, exit), setarg(2, DebugInfo, OldAncLst). '$debug_end_call'(Goal, Invoc1, Index1, AncLst, _, _) :- '$debug_port'(Goal, Invoc1, Index1, AncLst, redo), fail. '$debug_exception_port'(Goal, Invoc, Index, AncLst, Ball) :- g_assign('$debug_ball', Ball), '$debug_port'(Goal, Invoc, Index, AncLst, exception), throw(Ball). % debug_port '$debug_port'(Goal, Invoc, Index, AncLst, Port) :- '$get_current_B'(B), '$debug_port1'(Goal, Invoc, Index, AncLst, Port, B). '$debug_port1'(Goal, Invoc, Index, AncLst, Port, B) :- '$debug_port2'(Goal, Invoc, Index, AncLst, Port, B), fail. '$debug_port1'(_, _, _, _, _, _) :- g_read('$debug_next', DebugNext), % fail for 'r' and 'f' atom(DebugNext). '$debug_port2'(Goal, Invoc, _, _, Port, _) :- g_read('$debug_next', DebugNext), '$debug_port_ignore'(DebugNext, Goal, Invoc, Port), !. '$debug_port2'(Goal, Invoc, Index, AncLst, Port, B) :- '$debug_port_prompt'(Goal, Invoc, Index, AncLst, Port, B). '$debug_port_ignore'(nodebug, _, _, _). '$debug_port_ignore'(debug, Goal, _, _) :- '$has_no_spy_point'(Goal). '$debug_port_ignore'(debug, Goal, _, Port) :- '$has_spy_point'(Goal, Cond), ( '$spy_test_condition'(Goal, Port, Cond) -> fail ; true ). '$debug_port_ignore'(skip, _, Invoc, Port) :- g_read('$debug_skip', s(Invoc1, Mask1)), '$debug_port_mask'(Port, Mask), ( Invoc = Invoc1, Mask /\ Mask1 > 0 -> fail ; ! ). '$debug_port_ignore'(fail(Invoc1), _, Invoc, Port) :- ( Invoc > Invoc1 ; Port \== fail ), !. '$debug_port_ignore'(retry(_), _, _, _). '$debug_port_prompt'(Goal, Invoc, Index, AncLst, Port, B) :- repeat, g_assign('$debug_next', trace), '$debug_write_goal'(Goal, Invoc, Index, Port), ( '$has_no_spy_point'(Goal), '$debug_is_not_leashed'(Port) -> nl(debugger_output) ; '$debug_read_cmd'(C), '$debug_exec_cmd'(C, Goal, Invoc, AncLst, Port, B) ), !. '$debug_read_cmd'(C) :- write(debugger_output, ' ? '), flush_output(debugger_output), get_key(debugger_input, X), X >= 0, X < 255, char_code(C, X), format(debugger_output, '~N', []). '$debug_read_integer'(X) :- read_integer(debugger_input, X), repeat, get_code(debugger_input, 10), % the last '\n' !. '$debug_exec_cmd'(C, _, _, _, _, _) :- char_code(C, X), X >= 10, X =< 13, '$debug_exec_cmd'(c, _, _, _, _, _). '$debug_exec_cmd'(c, _, _, _, _, _) :- % creep g_assign('$debug_next', trace). '$debug_exec_cmd'(l, _, _, _, _, _) :- % leap g_assign('$debug_next', debug). '$debug_exec_cmd'(s, _, _, _, Port, _) :- % skip ( Port = exit ; Port = fail ; Port = exception ), !, '$debug_exec_cmd'(c, _, _, _, _, _). '$debug_exec_cmd'(s, _, Invoc, _, _, _) :- % skip g_assign('$debug_next', skip), '$debug_port_mask'(exit, Mask1), '$debug_port_mask'(fail, Mask2), '$debug_port_mask'(exception, Mask3), Mask is Mask1 \/ Mask2 \/ Mask3, g_assign('$debug_skip', s(Invoc, Mask)). '$debug_exec_cmd'('G', _, _, _, _, _) :- % goto write(debugger_output, 'Inovcation nb: '), '$debug_read_integer'(Invoc), g_assign('$debug_next', skip), g_assign('$debug_skip', s(Invoc, 31)). '$debug_exec_cmd'(r, _, _, _, call, _) :- % retry !, fail. '$debug_exec_cmd'(r, _, Invoc, _, _, _) :- % retry g_assign('$debug_next', retry(Invoc)). '$debug_exec_cmd'(f, _, _, _, fail, _) :- % fail !, fail. '$debug_exec_cmd'(f, _, Invoc, _, _, _) :- % fail g_assign('$debug_next', fail(Invoc)). '$debug_exec_cmd'(w, Goal, _, _, _, _) :- % write write(debugger_output, ' '), write(debugger_output, Goal), nl(debugger_output), !, fail. '$debug_exec_cmd'(d, Goal, _, _, _, _) :- % display write(debugger_output, ' '), display(debugger_output, Goal), nl(debugger_output), !, fail. '$debug_exec_cmd'(p, Goal, _, _, _, _) :- % print write(debugger_output, ' '), print(debugger_output, Goal), nl(debugger_output), !, fail. '$debug_exec_cmd'(e, _, _, _, Port, _) :- % exception ( Port = exception -> g_read('$debug_ball', Ball), format(debugger_output, 'Exception raised: ~q~n', [Ball]) ; write(debugger_output, 'Option not applicable at this port'), nl(debugger_output) ), !, fail. '$debug_exec_cmd'(g, _, _, AncLst, _, _) :- % ancestors '$debug_disp_anc_lst'(AncLst), !, fail. '$debug_exec_cmd'('A', _, _, AncLst, _, B) :- % alternatives '$debug_disp_alternatives'(AncLst, B), !, fail. '$debug_exec_cmd'(u, _, _, _, Port, _) :- % unify ( Port = call -> write(debugger_output, 'Head: '), read(debugger_input, DebugUnify), g_assign('$debug_unify', DebugUnify) ; write(debugger_output, 'Option not applicable at this port'), nl(debugger_output), !, fail ). '$debug_exec_cmd'(n, _, _, _, _, _) :- % nodebug '$debug_switch_off'. '$debug_exec_cmd'(=, _, _, _, _, _) :- % debugging debugging, !, fail. '$debug_exec_cmd'('.', Goal, _, _, _, _) :- % father file !, functor(Goal, N, A), ( '$get_predicate_file_info'(N / A, PlFile, PlLine) -> format(debugger_output, '~a/~d defined in ~a:~d~n', [N, A, PlFile, PlLine]) ; format(debugger_output, 'no file information for ~a/~d~n', [N, A]) ), fail. '$debug_exec_cmd'(+, Goal, _, _, _, _) :- % spy this functor(Goal, N, A), spy(N / A), !, fail. '$debug_exec_cmd'(*, Goal, _, _, _, _) :- % spy conditionally repeat, write(debugger_output, 'Goal,Port,Test: '), read(debugger_input, (Goal1, Port1, Test1)), callable(Goal1), functor(Goal, N, A), functor(Goal1, N, A), spypoint_condition(Goal1, Port1, Test1), !, fail. '$debug_exec_cmd'(-, Goal, _, _, _, _) :- % nospy this functor(Goal, N, A), nospy(N / A), !, fail. '$debug_exec_cmd'('L', Goal, _, _, _, _) :- % listing !, functor(Goal, N, A), PI = N / A, ( '$current_predicate_any'(PI) -> ( '$predicate_property_any'(PI, native_code) -> format(debugger_output, 'native code predicate ~a/~d~n', [N, A]) ; listing(PI), nl(debugger_output) ) ; format(debugger_output, 'cannot find any info on ~a/~d~n', [N, A]) ), fail. '$debug_exec_cmd'(a, _, _, _, _, _) :- % abort abort. '$debug_exec_cmd'(b, _, _, _, _, _) :- % break break, !, fail. '$debug_exec_cmd'(@, _, _, _, _, _) :- % command write(debugger_output, 'Command: '), read(debugger_input, Command), ( '$catch'(Command, Err, format(debugger_output, 'Warning: ~w - exception raised ~w~n', [Command, Err]), debugger_exec_cmd, 1, false) -> true ; format(debugger_output, 'Warning: ~w - goal failed~n', [Command]) ), !, fail. '$debug_exec_cmd'(<, _, _, _, _, _) :- % print depth write(debugger_output, 'Print Depth: '), '$debug_read_integer'(Depth), g_assign('$debug_depth', Depth), !, fail. '$debug_exec_cmd'(?, _, _, _, _, _) :- % help '$debug_disp_help', !, fail. '$debug_exec_cmd'(h, _, _, _, _, _) :- % help '$debug_disp_help', !, fail. '$debug_exec_cmd'('W', _, _, _, _, _) :- % WAM debugger wam_debug, !, fail. '$debug_exec_cmd'(_, _, _, _, _, _) :- % error write(debugger_output, 'Unknown command (type h for help)'), nl(debugger_output), fail. '$debug_write_goal'(Goal, Invoc, Index, Port) :- g_read('$debug_depth', Depth), ( '$has_no_spy_point'(Goal) -> Indic = ' ' ; Indic = (+) ), '$debug_port_pretty'(Port, Port1), format(debugger_output, '~N ~a %4d %4d ~a', [Indic, Invoc, Index, Port1]), write_term(debugger_output, Goal, [quoted(true), max_depth(Depth)]). '$debug_port_pretty'(call, 'Call: '). '$debug_port_pretty'(redo, 'Redo: '). '$debug_port_pretty'(fail, 'Fail: '). '$debug_port_pretty'(exit, 'Exit: '). '$debug_port_pretty'(exception, 'Exception: '). '$debug_port_pretty'(no_port, ''). '$debug_disp_anc_lst'([a(_, _, _, _)|AncLst]) :- write(debugger_output, 'Ancestors:'), nl(debugger_output), '$debug_disp_anc_lst1'(AncLst). '$debug_disp_anc_lst1'([]). '$debug_disp_anc_lst1'([a(Goal, Invoc, Index, _)|AncLst]) :- '$debug_disp_anc_lst1'(AncLst), '$debug_write_goal'(Goal, Invoc, Index, no_port). '$debug_disp_alternatives'(AncLst, B) :- write(debugger_output, 'Alternatives:'), nl(debugger_output), '$debug_disp_alternatives1'(AncLst, B), format(debugger_output, '~N--------------~n', []). '$debug_disp_alternatives1'([], _). '$debug_disp_alternatives1'([a(Goal, Invoc, Index, B1)|AncLst], B2) :- '$debug_disp_alternatives1'(AncLst, B1), '$debug_write_goal'(Goal, Invoc, Index, no_port), '$debug_disp_alt'(B2, B1). '$debug_disp_alt'(B, B) :- !. '$debug_disp_alt'(BFrom, BTo) :- '$choice_point_info'(BFrom, N, A, B1), '$debug_disp_alt'(B1, BTo), '$pred_without_aux'(N, A, N1, A1), '$debug_disp_alt1'(N1, A1, BFrom), !. '$debug_disp_alt1'(N, _, _) :- % hide debug alternatives '$debug_is_debug_predicate'(N). '$debug_disp_alt1'(_, _, B) :- % clause selection ? '$call_c_test'('Scan_Choice_Point_Info_3'(B, N, A)), % fail if not '$pred_without_aux'(N, A, N1, A1), '$debug_disp_alt2'(N1 / A1). '$debug_disp_alt1'('$catch_internal1', 5, B) :- % hide debug catch '$choice_point_arg'(B, 1, Goal), functor(Goal, N, _), '$debug_is_debug_predicate'(N). '$debug_disp_alt1'('$trail_handler', 1, _). '$debug_disp_alt1'(N, A, _) :- % detect system predicate sub_atom(N, 0, 1, _, $), '$predicate_property_any'(N / A, native_code), ( ( sub_atom(N, 1, _, 4, N1), '$debug_check_bip'(N1, A1) ; sub_atom(N, 1, _, 1, N1), '$debug_check_bip'(N1, A1) ) -> '$debug_disp_alt2'(N1 / A1) ; '$debug_disp_alt2'('system predicate'(N / A)) ). '$debug_disp_alt1'(N, A, _) :- % normal predicate '$debug_disp_alt2'(N / A). '$debug_disp_alt2'(X) :- format(debugger_output, '~N 1 choice-point for ~w~n', [X]). '$debug_is_debug_predicate'(N) :- sub_atom(N, 0, 7, _, '$debug_'). '$debug_check_bip'(N1, A1) :- predicate_property(N1 / A1, built_in), !. '$debug_check_bip'(N1, A1) :- predicate_property(N1 / A1, built_in_fd). '$debug_disp_help' :- format(debugger_output, 'Debugging commands:~n~n', []), format(debugger_output, 'RET/c creep l leap ~n', []), format(debugger_output, ' s skip G goto~n', []), format(debugger_output, ' r retry f fail~n', []), format(debugger_output, ' w write d display~n', []), format(debugger_output, ' p print e exception~n', []), format(debugger_output, ' g ancestors A alternatives~n', []), format(debugger_output, ' u unify . father file~n', []), format(debugger_output, ' n nodebug = debugging~n', []), format(debugger_output, ' + spy this * spy conditionally~n', []), format(debugger_output, ' - nospy this L listing~n', []), format(debugger_output, ' a abort b break~n', []), format(debugger_output, ' @ command < set printdepth~n', []), format(debugger_output, ' h/? help W WAM debugger~n', []), nl(debugger_output). '$choice_point_info'(B, N, A, LastB) :- '$call_c'('Choice_Point_Info_4'(B, N, A, LastB)). '$choice_point_arg'(B, I, Arg) :- '$call_c'('Choice_Point_Arg_3'(B, I, Arg)). ./gprolog-1.3.0/src/BipsPl/consult_c.c0000644004425400513100000001106010547154134016110 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : consult_c.c * * Descr.: file consulting - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: consult_c.c,v 1.14 2007/01/04 10:35:08 diaz Exp $ */ #include #include "engine_pl.h" #include "bips_pl.h" #include "linedit.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ #if 1 /*-------------------------------------------------------------------------* * CONSULT_2 * * * *-------------------------------------------------------------------------*/ Bool Consult_2(WamWord tmp_file_word, WamWord pl_file_word) { char *tmp_file = Rd_String_Check(tmp_file_word); char *pl_file = Rd_String_Check(pl_file_word); char *singl_warn = (Flag_Value(FLAG_SINGLETON_WARNING)) ? NULL : "--no-singl-warn"; StmInf *pstm_o = stm_tbl[stm_top_level_output]; StmInf *pstm_i = stm_tbl[stm_top_level_input]; int pid; FILE *f_out, *f_in; FILE **pf_in; long save; unsigned char *p = NULL; int status, c; int save_use_le_prompt; char *arg[] = { "pl2wam", "-w", "--compile-msg", "--no-redef-error", "--pl-state", tmp_file, "-o", tmp_file, pl_file, singl_warn, NULL }; save = SYS_VAR_SAY_GETC; #ifndef NO_USE_PIPED_STDIN_FOR_CONSULT SYS_VAR_SAY_GETC = 1; pf_in = &f_in; #else f_in = NULL; pf_in = NULL; #endif Write_Pl_State_File(tmp_file_word); SYS_VAR_SAY_GETC = save; Flush_All_Streams(); pid = M_Spawn_Redirect(arg, 0, pf_in, &f_out, &f_out); Os_Test_Error(pid == -1); if (pid == -2) { error_pl2wam: Pl_Err_System(Create_Atom("error trying to execute pl2wam " "(maybe not found)")); return FALSE; } save_use_le_prompt = use_le_prompt; use_le_prompt = 0; for (;;) { #if 1 c = fgetc(f_out); #else char c0; c = (read(fileno(f_out), &c0, 1) == 1) ? c0 : EOF; #endif if (c == EOF) break; #ifndef NO_USE_PIPED_STDIN_FOR_CONSULT if (c == CHAR_TO_EMIT_WHEN_CHAR) { if (p == NULL) { c = Stream_Getc(pstm_i); if (c == EOF) { eof_reached: p = (unsigned char *) "end_of_file.\n"; c = *p++; } } else { if (*p == '\0') goto eof_reached; else c = *p++; } fputc(c, f_in); fflush(f_in); continue; } #endif Stream_Putc(c, pstm_o); } use_le_prompt = save_use_le_prompt; if (f_in) fclose(f_in); fclose(f_out); status = M_Get_Status(pid); if (status < 0) goto error_pl2wam; return status == 0; } #endif ./gprolog-1.3.0/src/BipsPl/utils.pl0000644004425400513100000001007710547162354015462 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : utils.pl * * Descr.: utilities * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: utils.pl,v 1.12 2007/01/04 10:35:12 diaz Exp $ */ :- built_in. '$term_to_goal'(P, CallInfo, P1) :- g_assign('$call_call_info', CallInfo), g_assign('$new_term', f), '$term_to_goal1'(P, P1), g_read('$new_term', t), % GC: case P=P1 !. '$term_to_goal'(P, _, P). '$term_to_goal1'(P, P1) :- '$term_to_goal2'(P, P1), !. '$term_to_goal1'(P, _) :- '$pl_err_type'(callable, P). '$term_to_goal2'(P, P1) :- var(P), !, g_read('$call_call_info', CallInfo), g_assign('$new_term', t), ( CallInfo = none -> P1 = call(P) ; P1 = '$call_internal'(P, CallInfo) ). '$term_to_goal2'((P -> Q), (P1 -> Q1)) :- !, '$term_to_goal2'(P, P1), '$term_to_goal2'(Q, Q1). '$term_to_goal2'((P, Q), (P1, Q1)) :- !, '$term_to_goal2'(P, P1), '$term_to_goal2'(Q, Q1). '$term_to_goal2'((P ; Q), (P1 ; Q1)) :- !, '$term_to_goal2'(P, P1), '$term_to_goal2'(Q, Q1). /* ISO: (\+)/1 is no longer a control construct '$term_to_goal2'((\+ P),(\+ P1)):- !, '$term_to_goal2'(P,P1). */ '$term_to_goal2'(P, P) :- callable(P). '$check_list'(List) :- list(List), !. '$check_list'(List) :- list_or_partial_list(List), !, '$pl_err_instantiation'. '$check_list'(List) :- '$pl_err_type'(list, List). '$check_list_or_partial_list'(List) :- list_or_partial_list(List), !. '$check_list_or_partial_list'(List) :- '$pl_err_type'(list, List). '$check_atom_or_atom_list'(List) :- atom(List), !. '$check_atom_or_atom_list'(List) :- '$check_atom_or_atom_list1'(List), !. '$check_atom_or_atom_list1'(List) :- var(List), '$pl_err_instantiation'. '$check_atom_or_atom_list1'([]). '$check_atom_or_atom_list1'([X|List]) :- '$check_atom_or_atom_list2'(X), '$check_atom_or_atom_list1'(List). '$check_atom_or_atom_list1'(List) :- '$pl_err_type'(list, List). '$check_atom_or_atom_list2'(X) :- atom(X), !. '$check_atom_or_atom_list2'(X) :- var(X), !, '$pl_err_instantiation'. '$check_atom_or_atom_list2'(X) :- '$pl_err_type'(atom, X). '$get_head_and_body'((H :- B), H, B) :- !, '$check_head'(H). '$get_head_and_body'(H, H, true) :- '$check_head'(H). '$check_head'(H) :- var(H), !, '$pl_err_instantiation'. '$check_head'(H) :- ( callable(H) -> true ; '$pl_err_type'(callable, H) ). '$get_pred_indic'(PI, N, A) :- '$call_c_test'('Get_Pred_Indic_3'(PI, N, A)). ./gprolog-1.3.0/src/BipsPl/sort_c.c0000644004425400513100000001632510547154137015424 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : sort_c.c * * Descr.: sort management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: sort_c.c,v 1.10 2007/01/04 10:35:11 diaz Exp $ */ #define OBJ_INIT Sort_Initializer #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static WamWord minus_2; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static long Keysort_Cmp(WamWord u_word, WamWord v_word); static int Merge_Sort(WamWord *base, WamWord *aux, int n, Bool keep_dup, long (*cmp) ()); /*-------------------------------------------------------------------------* * SORT_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Sort_Initializer(void) { minus_2 = Functor_Arity(ATOM_CHAR('-'), 2); } /*-------------------------------------------------------------------------* * SORT_LIST_2 * * * *-------------------------------------------------------------------------*/ Bool Sort_List_2(WamWord list1_word, WamWord list2_word) { WamWord *arg; int n; int sort_type; sort_type = SYS_VAR_OPTION_MASK; /* 0=sort/2, 1=sort0/2, 2=keysort/2 */ Check_For_Un_List(list2_word); arg = H; /* array in the heap */ n = Rd_Proper_List_Check(list1_word, arg); if (n == 0) return Un_Atom(atom_nil, list2_word); if (n == 1) return Unify(list1_word, list2_word); n = Merge_Sort(arg, arg + n, n, sort_type, (sort_type != 2) ? Term_Compare : Keysort_Cmp); /* n can have changed here (if dup removed) */ return Unify(Mk_Proper_List(n, arg), list2_word); } /*-------------------------------------------------------------------------* * SORT_LIST_1 * * * *-------------------------------------------------------------------------*/ void Sort_List_1(WamWord list_word) { WamWord word, tag_mask; WamWord *adr, *arg, *prev; int n; int sort_type; sort_type = SYS_VAR_OPTION_MASK; /* 0=sort/1, 1=sort0/1, 2=keysort/1 */ arg = H; n = Rd_Proper_List_Check(list_word, arg); if (n <= 1) return; n = Merge_Sort(arg, arg + n, n, sort_type, (sort_type != 2) ? Term_Compare : Keysort_Cmp); /* n can have changed here (if dup removed) */ /* update in-place the list */ do { DEREF(list_word, word, tag_mask); adr = UnTag_LST(word); Car(adr) = *arg++; prev = &Cdr(adr); list_word = Cdr(adr); } while (--n); *prev = NIL_WORD; } /*-------------------------------------------------------------------------* * KEYSORT_CMP * * * *-------------------------------------------------------------------------*/ static long Keysort_Cmp(WamWord u_word, WamWord v_word) { WamWord word, tag_mask; WamWord *adr; DEREF(u_word, word, tag_mask); u_word = word; if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(u_word); if (Functor_And_Arity(adr) == minus_2) u_word = Arg(adr, 0); } DEREF(v_word, word, tag_mask); v_word = word; if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(v_word); if (Functor_And_Arity(adr) == minus_2) v_word = Arg(adr, 0); } return Term_Compare(u_word, v_word); } /*-------------------------------------------------------------------------* * MERGE_SORT * * * * Merge sort on an array on n WamWords starting at base using an auxiliary* * array for the merge at aux. The comparaison function cmp will receive 2 * * elements of the array (2 WamWords) and classically returns <0, 0, >0. * *-------------------------------------------------------------------------*/ static int Merge_Sort(WamWord *base, WamWord *aux, int n, Bool keep_dup, long (*cmp) ()) { WamWord *l1, *l2; int n1, n2; WamWord *p; if (n <= 1) return n; n1 = n / 2; n2 = n - n1; l1 = base; l2 = base + n1; n1 = Merge_Sort(l1, aux, n1, keep_dup, cmp); n2 = Merge_Sort(l2, aux, n2, keep_dup, cmp); n = n1 + n2; p = aux; while (n1 > 0 && n2 > 0) { if ((*cmp) (*l1, *l2) <= 0) /* copy smaller element to aux */ { *p++ = *l1++; n1--; } else { *p++ = *l2++; n2--; } } while (n1-- > 0) /* copy n1 elements to aux */ *p++ = *l1++; if (keep_dup) { n1 = n - n2; /* there are n2 elements already in place */ p = aux; while (n1-- > 0) /* copy n-n2 elemens to base */ *base++ = *p++; return n; } while (n2-- > 0) /* copy n2 elements to aux (needed for test dup) */ *p++ = *l2++; p = aux; *base = *p++; /* copy 1st element to base (init test dup) */ n1 = n - 1; while (n1-- > 0) /* copy n-1 elemens to base + test dup */ { if (cmp(*base, *p) < 0) *++base = *p++; else { n--; p++; } } return n; } ./gprolog-1.3.0/src/BipsPl/no_sockets.wam0000644004425400513100000000036210547440332016631 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : no_sockets.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/no_sockets.pl'). predicate('$use_sockets'/0,29,static,private,built_in,[ proceed]). ./gprolog-1.3.0/src/BipsPl/dec10io.pl0000644004425400513100000001166710547162352015552 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : dec10io.pl * * Descr.: DEC-10 I/O compatibility library * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: dec10io.pl,v 1.11 2007/01/04 10:35:09 diaz Exp $ */ :- built_in. '$use_dec10io'. '$find_existing_stream'(user, '$stream'(0), input). '$find_existing_stream'(user_input, '$stream'(0), input). '$find_existing_stream'(user, '$stream'(1), output). '$find_existing_stream'(user_output, '$stream'(1), output). '$find_existing_stream'(File, Stream, Mode) :- clause('$dec10_stream'(File, Stream, Mode), _), !, ( current_stream(Stream), % test if it still exists stream_property(Stream, file_name(File)), % (with correct name) stream_property(Stream, Mode) % (and correct mode) -> true ; retract('$dec10_stream'(File, Stream, Mode)), % no, retract fail ). '$find_existing_stream'(Stream, Stream, Mode) :- Stream = '$stream'(S), % test if it is a stream integer(S), current_stream(Stream), stream_property(Stream, Mode). see(File) :- set_bip_name(see, 1), nonvar(File), !, ( '$find_existing_stream'(File, Stream, input) ; set_bip_name(see, 1), '$open'(File, read, Stream, []), assertz('$dec10_stream'(File, Stream, input)) ), !, set_input(Stream). see(_) :- '$pl_err_instantiation'. seeing(File) :- set_bip_name(seeing, 1), current_input(Stream), '$find_existing_stream'(File, Stream, input), !. seen :- set_bip_name(seen, 0), current_input(Stream), close(Stream), % before find_existing to retract ( '$find_existing_stream'(_, Stream, input) ; true ), !. tell(File) :- set_bip_name(tell, 1), nonvar(File), !, ( '$find_existing_stream'(File, Stream, output) ; set_bip_name(tell, 1), '$open'(File, write, Stream, []), assertz('$dec10_stream'(File, Stream, output)) ), !, set_output(Stream). tell(_) :- '$pl_err_instantiation'. telling(File) :- set_bip_name(telling, 1), current_output(Stream), '$find_existing_stream'(File, Stream, output), !. told :- set_bip_name(told, 0), current_output(Stream), close(Stream), % before find_existing to retract ( '$find_existing_stream'(_, Stream, output) ; true ), !. append(File) :- set_bip_name(append, 1), nonvar(File), !, ( '$find_existing_stream'(File, Stream, output) ; set_bip_name(append, 1), '$open'(File, append, Stream, []), assertz('$dec10_stream'(File, Stream, output)) ), !, set_output(Stream). append(_) :- '$pl_err_instantiation'. get0(X) :- set_bip_name(get0, 1), '$call_c_test'('Get_Code_1'(X)). get(X) :- set_bip_name(get, 1), '$check_in_character_code'(X), '$call_c_test'('Get_Code_1'(X0)), ( X0 =< 32 -> get(X) ; X = X0 ). put(X) :- set_bip_name(put, 1), '$call_c'('Put_Code_1'(X)). skip(X) :- set_bip_name(skip, 1), '$check_in_character_code'(X), repeat, '$call_c_test'('Get_Code_1'(X0)), X0 = X, !. '$check_in_character_code'(X) :- var(X), !. '$check_in_character_code'(X) :- integer(X), !, ( X >= -1, X =< 255 -> true ; '$pl_err_representation'(in_character_code) ). '$check_in_character_code'(X) :- '$pl_err_type'(integer, X). tab(Exp) :- set_bip_name(tab, 1), '$arith_eval'(Exp, N), for(_, 1, N), put_char(' '), fail. tab(_). ./gprolog-1.3.0/src/BipsPl/oper_c.c0000644004425400513100000002303010547154137015371 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : oper_c.c * * Descr.: operator management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: oper_c.c,v 1.11 2007/01/04 10:35:11 diaz Exp $ */ #include #define OBJ_INIT Oper_Initializer #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ #define FX 0 #define FY 1 #define XF 2 #define YF 3 #define XFX 4 #define XFY 5 #define YFX 6 /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static int atom_specif_tbl[7]; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static int Detect_Oper_Specif(OperInf *oper); #define CURRENT_OP_ALT X2463757272656E745F6F705F616C74 Prolog_Prototype(CURRENT_OP_ALT, 0); /*-------------------------------------------------------------------------* * OPER_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Oper_Initializer(void) { char *a[7] = { "fx", "fy", "xf", "yf", "xfx", "xfy", "yfx" }; int i; for (i = 0; i < 7; i++) atom_specif_tbl[i] = Create_Atom(a[i]); } /*-------------------------------------------------------------------------* * OP_3 * * * *-------------------------------------------------------------------------*/ void Op_3(WamWord prec_word, WamWord specif_word, WamWord oper_word) { int atom_op; int prec; int atom_specif; int i; int type, left, right; atom_op = Rd_Atom_Check(oper_word); prec = Rd_Integer_Check(prec_word); if (prec < 0 || prec > MAX_PREC) Pl_Err_Domain(domain_operator_priority, prec_word); atom_specif = Rd_Atom_Check(specif_word); for (i = 0; i < 7 && atom_specif != atom_specif_tbl[i]; i++) ; switch (i) { case FX: case FY: type = PREFIX; left = 0; right = (i == FX) ? prec - 1 : prec; break; case XF: case YF: type = POSTFIX; left = (i == XF) ? prec - 1 : prec; right = 0; break; case XFX: case XFY: case YFX: type = INFIX; left = (i == XFX || i == XFY) ? prec - 1 : prec; right = (i == XFX || i == YFX) ? prec - 1 : prec; break; default: Pl_Err_Domain(domain_operator_specifier, specif_word); type = left = right = 0; /* only for the compiler */ } if (type != PREFIX && Check_Oper(atom_op, (type == POSTFIX) ? INFIX : POSTFIX)) Pl_Err_Permission(permission_operation_create, permission_type_operator, oper_word); if (atom_op == ATOM_CHAR(',')) Pl_Err_Permission(permission_operation_modify, permission_type_operator, oper_word); if (prec > 0) Create_Oper(atom_op, type, prec, left, right); else Delete_Oper(atom_op, type); } /*-------------------------------------------------------------------------* * CURRENT_OP_3 * * * *-------------------------------------------------------------------------*/ Bool Current_Op_3(WamWord prec_word, WamWord specif_word, WamWord oper_word) { WamWord word, tag_mask; HashScan scan; int prec; int atom_specif; OperInf *oper; int atom; int op_mask; int i; DEREF(oper_word, word, tag_mask); if (tag_mask != TAG_REF_MASK && tag_mask != TAG_ATM_MASK) Pl_Err_Type(type_atom, word); oper_word = word; DEREF(prec_word, word, tag_mask); prec = UnTag_INT(word); if (tag_mask != TAG_REF_MASK && (tag_mask != TAG_INT_MASK || prec < 0 || prec > MAX_PREC)) Pl_Err_Domain(domain_operator_priority, word); prec_word = word; DEREF(specif_word, word, tag_mask); if (tag_mask == TAG_ATM_MASK) { atom_specif = UnTag_ATM(word); for (i = 0; i < 7 && atom_specif != atom_specif_tbl[i]; i++) ; } if (tag_mask != TAG_REF_MASK && (tag_mask != TAG_ATM_MASK || i >= 7)) Pl_Err_Domain(domain_operator_specifier, specif_word); specif_word = word; if (Tag_Mask_Of(oper_word) == TAG_ATM_MASK) { atom = UnTag_ATM(oper_word); op_mask = atom_tbl[atom].prop.op_mask; if (op_mask == 0) return FALSE; for (i = PREFIX; i <= POSTFIX; i++) if (op_mask & Make_Op_Mask(i)) break; op_mask &= ~Make_Op_Mask(i); if (op_mask) /* non deterministic case */ { A(0) = prec_word; A(1) = specif_word; A(2) = oper_word; A(3) = op_mask; Create_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_OP_ALT, 0), 4); } oper = Lookup_Oper(atom, i); } else { oper = (OperInf *) Hash_First(oper_tbl, &scan); if (oper == NULL) return FALSE; /* non deterministic case */ A(0) = prec_word; A(1) = specif_word; A(2) = oper_word; A(3) = (WamWord) scan.endt; A(4) = (WamWord) scan.cur_t; A(5) = (WamWord) scan.cur_p; Create_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_OP_ALT, 0), 6); } return Get_Integer(oper->prec, prec_word) && Get_Atom(Detect_Oper_Specif(oper), specif_word) && Get_Atom(Atom_Of_Oper(oper->a_t), oper_word); } /*-------------------------------------------------------------------------* * CURRENT_OP_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Current_Op_Alt_0(void) { WamWord prec_word, specif_word, oper_word; HashScan scan; OperInf *oper; int atom; int op_mask; int i; Update_Choice_Point((CodePtr) Prolog_Predicate(CURRENT_OP_ALT, 0), 0); prec_word = AB(B, 0); specif_word = AB(B, 1); oper_word = AB(B, 2); if (Tag_Mask_Of(oper_word) == TAG_ATM_MASK) { atom = UnTag_ATM(oper_word); op_mask = AB(B, 3); for (i = PREFIX; i <= POSTFIX; i++) if (op_mask & Make_Op_Mask(i)) break; oper = Lookup_Oper(atom, i); Delete_Last_Choice_Point(); } else { scan.endt = (char *) AB(B, 3); scan.cur_t = (char *) AB(B, 4); scan.cur_p = (char *) AB(B, 5); oper = (OperInf *) Hash_Next(&scan); if (oper == NULL) { Delete_Last_Choice_Point(); return FALSE; } #if 0 /* the following data is unchanged */ AB(B, 0) = prec_word; AB(B, 1) = specif_word; AB(B, 2) = oper_word; AB(B, 3) = (WamWord) scan.endt; #endif AB(B, 4) = (WamWord) scan.cur_t; AB(B, 5) = (WamWord) scan.cur_p; } return Get_Integer(oper->prec, prec_word) && Get_Atom(Detect_Oper_Specif(oper), specif_word) && Get_Atom(Atom_Of_Oper(oper->a_t), oper_word); } /*-------------------------------------------------------------------------* * DETECT_OPER_SPECIF * * * *-------------------------------------------------------------------------*/ static int Detect_Oper_Specif(OperInf *oper) { int prec = oper->prec; int i; switch (Type_Of_Oper(oper->a_t)) { case PREFIX: i = (oper->right) < prec ? FX : FY; break; case POSTFIX: i = (oper->left) < prec ? XF : YF; break; default: /* i.e INFIX: */ i = (oper->left) < prec ? ((oper->right) < prec ? XFX : XFY) : YFX; break; } return atom_specif_tbl[i]; } ./gprolog-1.3.0/src/BipsPl/callinf_supp.c0000644004425400513100000000764110547154134016610 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : callinf_supp.c * * Descr.: meta call info support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: callinf_supp.c,v 1.10 2007/01/04 10:35:08 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static int save_call_info; /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * SAVE_CALL_INFO_3 * * * *-------------------------------------------------------------------------*/ void Save_Call_Info_3(WamWord func_word, WamWord arity_word, WamWord debug_call_word) { int func, arity; Bool debug_call; func = Rd_Atom(func_word); arity = Rd_Integer(arity_word); debug_call = *Rd_String(debug_call_word) == 't'; save_call_info = Call_Info(func, arity, debug_call); } /*-------------------------------------------------------------------------* * LOAD_CALL_INFO_ARG_1 * * * *-------------------------------------------------------------------------*/ void Load_Call_Info_Arg_1(WamWord arg_no_word) { int arg_no; arg_no = Rd_Integer(arg_no_word); A(arg_no) = Tag_INT(save_call_info); } /*-------------------------------------------------------------------------* * CALL_INFO_BIP_NAME_1 * * * *-------------------------------------------------------------------------*/ void Call_Info_Bip_Name_1(WamWord call_info_word) { long call_info; int func, arity; call_info = UnTag_INT(call_info_word) >> 1; func = Functor_Of(call_info); arity = Arity_Of(call_info); Set_Bip_Name_2(Tag_ATM(func), Tag_INT(arity)); } ./gprolog-1.3.0/src/BipsPl/all_solut.wam0000644004425400513100000001074510547440332016466 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : all_solut.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/all_solut.pl'). predicate('$use_all_solut'/0,29,static,private,built_in,[ proceed]). predicate(findall/3,32,static,private,built_in,[ put_atom(findall,3), execute('$findall'/4)]). predicate('$findall'/4,35,static,private,built_in,[ allocate(5), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_value(y(2),0), put_value(y(3),1), call('$check_list_arg'/2), put_value(y(0),0), put_value(y(1),1), put_variable(y(4),2), put_value(y(3),3), call('$store_solutions'/4), put_unsafe_value(y(4),0), put_integer(0,1), put_value(y(2),2), deallocate, call_c('Recover_Solutions_2',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(setof/3,43,static,private,built_in,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_value(y(2),0), put_atom(setof,1), call('$check_list_arg'/2), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_atom(setof,3), deallocate, execute('$bagof'/4)]). predicate(bagof/3,51,static,private,built_in,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_value(y(2),0), put_atom(bagof,1), call('$check_list_arg'/2), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_atom(bagof,3), deallocate, execute('$bagof'/4)]). predicate('$bagof'/4,56,static,private,built_in,[ load_cut_level(4), try_me_else(1), allocate(5), get_variable(y(0),2), get_variable(y(1),3), get_variable(x(3),1), get_variable(x(2),0), put_variable(x(1),0), put_variable(y(2),5), call_c('Free_Variables_4',[boolean],[x(2),x(3),x(0),x(5)]), cut(x(4)), put_structure((-)/2,0), unify_local_value(y(2)), unify_local_value(x(2)), put_variable(y(3),2), put_value(y(1),3), call('$store_solutions'/4), put_value(y(1),0), put_integer(3,1), call(set_bip_name/2), put_value(y(3),0), put_integer(1,1), put_variable(y(4),2), call_c('Recover_Solutions_2',[boolean],[x(0),x(1),x(2)]), put_value(y(1),0), put_value(y(4),1), call('$$bagof/4_$aux1'/2), put_unsafe_value(y(4),0), put_unsafe_value(y(2),1), put_value(y(0),2), deallocate, execute('$group_solutions'/3), label(1), trust_me_else_fail, allocate(2), get_variable(y(0),2), get_variable(y(1),3), put_variable(x(1),2), call_c('Recover_Generator_1',[],[x(2)]), put_value(y(0),2), put_value(y(1),3), call('$findall'/4), put_value(y(0),0), put_nil(1), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), put_value(y(1),0), put_value(y(0),1), deallocate, execute('$$bagof/4_$aux2'/2)]). predicate('$$bagof/4_$aux2'/2,67,static,private,built_in,[ load_cut_level(2), try_me_else(1), get_atom(bagof,0), cut(x(2)), proceed, label(1), trust_me_else_fail, put_value(x(1),0), execute(sort/1)]). predicate('$$bagof/4_$aux1'/2,56,static,private,built_in,[ load_cut_level(2), try_me_else(1), get_atom(bagof,0), cut(x(2)), put_value(x(1),0), execute(keysort/1), label(1), trust_me_else_fail, put_value(x(1),0), execute(sort/1)]). predicate('$store_solutions'/4,79,static,private,built_in,[ get_variable(x(4),2), get_variable(x(2),0), call_c('Stop_Mark_1',[],[x(4)]), put_value(x(1),0), put_value(x(3),1), execute('$$store_solutions/4_$aux1'/3)]). predicate('$$store_solutions/4_$aux1'/3,79,static,private,built_in,[ try_me_else(1), allocate(1), get_variable(y(0),2), put_integer(3,2), put_atom(true,3), call('$call'/4), put_value(y(0),0), call_c('Store_Solution_1',[],[x(0)]), fail, label(1), trust_me_else_fail, proceed]). predicate('$group_solutions'/3,90,static,private,built_in,[ call_c('Group_Solutions_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate('$group_solutions_alt'/0,93,static,private,built_in,[ call_c('Group_Solutions_Alt_0',[boolean],[]), proceed]). predicate('$check_list_arg'/2,101,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_value(x(1),0), put_integer(3,1), call(set_bip_name/2), put_value(y(0),0), deallocate, execute('$check_list_or_partial_list'/1)]). ./gprolog-1.3.0/src/BipsPl/format.wam0000644004425400513100000000116410547440332015753 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : format.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/format.pl'). predicate('$use_format'/0,29,static,private,built_in,[ proceed]). predicate(format/2,32,static,private,built_in,[ put_atom(format,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Format_2',[],[x(0),x(1)]), proceed]). predicate(format/3,39,static,private,built_in,[ put_atom(format,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('Format_3',[],[x(0),x(1),x(2)]), proceed]). ./gprolog-1.3.0/src/BipsPl/print.wam0000644004425400513100000000376210547440331015624 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : print.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/print.pl'). predicate('$use_print'/0,29,static,private,built_in,[ proceed]). predicate(print/1,32,static,private,built_in,[ put_atom(print,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Print_1',[],[x(0)]), proceed]). predicate(print/2,36,static,private,built_in,[ put_atom(print,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Print_2',[],[x(0),x(1)]), proceed]). predicate('$try_portray'/1,43,static,private,built_in,[ try_me_else(1), allocate(1), get_variable(y(0),0), put_structure((/)/2,0), unify_atom(portray), unify_integer(1), call('$current_predicate'/1), put_atom('$portray_ok',0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_structure(format/3,0), unify_atom(top_level_output), unify_atom('exception from portray/1: ~q~n'), unify_list, unify_variable(x(1)), unify_nil, put_structure((',')/2,2), unify_value(x(0)), unify_atom(fail), put_structure(portray/1,3), unify_local_value(y(0)), put_structure((',')/2,0), unify_value(x(3)), unify_atom(!), put_atom(portray,3), put_integer(1,4), put_atom(false,5), call('$catch'/6), put_atom('$portray_ok',0), put_integer(1,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), fail, label(1), trust_me_else_fail, put_atom('$portray_ok',0), put_integer(1,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate(get_print_stream/1,56,static,private,built_in,[ allocate(1), put_atom(get_print_stream,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(0),1), call('$check_stream_or_var'/2), put_unsafe_value(y(0),0), deallocate, call_c('Get_Print_Stm_1',[],[x(0)]), proceed]). ./gprolog-1.3.0/src/BipsPl/catch.wam0000644004425400513100000001221110547440331015537 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : catch.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/catch.pl'). predicate('$use_catch'/0,29,static,private,built_in,[ proceed]). predicate('$catch'/6,35,static,private,built_in,[ call_c('Save_Call_Info_3',[],[x(3),x(4),x(5)]), put_integer(0,3), execute('$catch1'/4)]). predicate('$catch1'/4,39,static,private,built_in,[ put_integer(3,4), call_c('Load_Call_Info_Arg_1',[],[x(4)]), execute('$catch_internal'/4)]). predicate('$catch_internal'/4,44,static,private,built_in,[ allocate(5), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_integer(7,0), put_variable(y(4),1), call('$sys_var_read'/2), put_integer(8,0), put_atom('$no_ball$',1), call('$sys_var_put'/2), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), put_unsafe_value(y(4),4), deallocate, execute('$catch_internal1'/5)]). predicate('$catch_internal1'/5,50,static,private,built_in,[ load_cut_level(5), try_me_else(1), allocate(6), get_variable(y(0),0), get_variable(y(1),3), get_variable(y(2),4), get_variable(y(3),5), put_variable(y(4),0), call('$get_current_B'/1), put_integer(7,0), put_value(y(4),1), call('$sys_var_write'/2), put_value(y(0),0), put_value(y(1),1), call('$call_internal'/2), put_variable(y(5),0), call('$get_current_B'/1), put_value(y(5),0), put_value(y(4),1), put_value(y(3),2), call('$$catch_internal1/5_$aux1'/3), put_integer(7,0), put_value(y(2),1), deallocate, execute('$sys_var_write'/2), label(1), trust_me_else_fail, allocate(5), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), get_variable(y(3),4), put_integer(7,0), put_value(y(3),1), call('$sys_var_write'/2), put_integer(8,0), put_variable(y(4),1), call('$sys_var_get'/2), put_unsafe_value(y(4),0), put_atom('$no_ball$',1), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), put_unsafe_value(y(4),0), put_value(y(0),1), put_value(y(1),2), put_value(y(2),3), put_value(y(3),4), deallocate, execute('$catch_a_throw'/5)]). predicate('$$catch_internal1/5_$aux1'/3,50,static,private,built_in,[ load_cut_level(3), try_me_else(1), put_atom(>,2), put_integer(2,4), call_c('Set_Bip_Name_2',[],[x(2),x(4)]), math_load_value(x(0),0), math_load_value(x(1),2), call_c('Blt_Gt',[fast_call,boolean],[x(0),x(2)]), cut(x(3)), put_value(x(1),0), execute('$trail_handler'/1), label(1), trust_me_else_fail, cut(x(2)), proceed]). predicate('$catch_a_throw'/5,79,static,private,built_in,[ load_cut_level(5), try_me_else(1), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), get_structure('$catch_sync'/1,0), unify_variable(x(1)), cut(x(5)), put_value(x(4),0), execute('$$catch_a_throw/5_$aux1'/2), label(1), retry_me_else(2), allocate(2), get_variable(y(0),2), get_variable(y(1),3), get_value(x(1),0), cut(x(5)), put_integer(8,0), put_atom('$no_ball$',1), call('$sys_var_put'/2), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$call_internal'/2), label(2), trust_me_else_fail, execute('$unwind'/1)]). predicate('$$catch_a_throw/5_$aux1'/2,79,static,private,built_in,[ load_cut_level(2), try_me_else(1), put_atom(>,3), put_integer(2,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), math_load_value(x(0),0), math_load_value(x(1),3), call_c('Blt_Gt',[fast_call,boolean],[x(0),x(3)]), cut(x(2)), put_structure('$catch_sync'/1,0), unify_local_value(x(1)), execute('$unwind'/1), label(1), trust_me_else_fail, put_value(x(1),0), execute('$catch_fail_now'/1)]). predicate('$trail_handler'/1,99,static,private,built_in,[ try_me_else(1), proceed, label(1), trust_me_else_fail, allocate(0), put_value(x(0),1), put_integer(7,0), call('$sys_var_write'/2), fail]). predicate('$catch_sync_for_fail_at'/1,108,static,private,built_in,[ allocate(2), get_variable(y(0),0), put_integer(7,0), put_variable(y(1),1), call('$sys_var_read'/2), put_unsafe_value(y(1),0), put_value(y(0),1), deallocate, execute('$$catch_sync_for_fail_at/1_$aux1'/2)]). predicate('$$catch_sync_for_fail_at/1_$aux1'/2,108,static,private,built_in,[ load_cut_level(2), try_me_else(1), put_atom(>,3), put_integer(2,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), math_load_value(x(0),0), math_load_value(x(1),3), call_c('Blt_Gt',[fast_call,boolean],[x(0),x(3)]), cut(x(2)), put_structure('$catch_sync'/1,0), unify_local_value(x(1)), put_atom('$catch_sync_for_fail_at',1), put_integer(1,2), put_atom(true,3), execute('$throw'/4), label(1), trust_me_else_fail, put_value(x(1),0), execute('$catch_fail_now'/1)]). predicate('$catch_fail_now'/1,118,static,private,built_in,[ allocate(0), call('$set_current_B'/1), fail]). ./gprolog-1.3.0/src/BipsPl/write_c.c0000644004425400513100000002310310547154141015552 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : write_c.c * * Descr.: term output (write/1 and friends) management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: write_c.c,v 1.11 2007/01/04 10:35:13 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * WRITE_TERM_2 * * * *-------------------------------------------------------------------------*/ void Write_Term_2(WamWord sora_word, WamWord term_word) { int stm; StmInf *pstm; stm = (sora_word == NOT_A_WAM_WORD) ? stm_output : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_OUTPUT); pstm = stm_tbl[stm]; last_output_sora = sora_word; Check_Stream_Type(stm, TRUE, FALSE); Write_Term(pstm, SYS_VAR_WRITE_DEPTH, SYS_VAR_WRITE_PREC, SYS_VAR_OPTION_MASK, term_word); } /*-------------------------------------------------------------------------* * WRITE_TERM_1 * * * *-------------------------------------------------------------------------*/ void Write_Term_1(WamWord term_word) { Write_Term_2(NOT_A_WAM_WORD, term_word); } /*-------------------------------------------------------------------------* * WRITE_1 * * * *-------------------------------------------------------------------------*/ void Write_1(WamWord term_word) { SYS_VAR_OPTION_MASK = WRITE_NUMBER_VARS | WRITE_NAME_VARS; SYS_VAR_WRITE_DEPTH = -1; SYS_VAR_WRITE_PREC = MAX_PREC; Write_Term_2(NOT_A_WAM_WORD, term_word); } /*-------------------------------------------------------------------------* * WRITE_2 * * * *-------------------------------------------------------------------------*/ void Write_2(WamWord sora_word, WamWord term_word) { SYS_VAR_OPTION_MASK = WRITE_NUMBER_VARS | WRITE_NAME_VARS; SYS_VAR_WRITE_DEPTH = -1; SYS_VAR_WRITE_PREC = MAX_PREC; Write_Term_2(sora_word, term_word); } /*-------------------------------------------------------------------------* * WRITEQ_1 * * * *-------------------------------------------------------------------------*/ void Writeq_1(WamWord term_word) { SYS_VAR_OPTION_MASK = WRITE_NUMBER_VARS | WRITE_NAME_VARS | WRITE_QUOTED; SYS_VAR_WRITE_DEPTH = -1; SYS_VAR_WRITE_PREC = MAX_PREC; Write_Term_2(NOT_A_WAM_WORD, term_word); } /*-------------------------------------------------------------------------* * WRITEQ_2 * * * *-------------------------------------------------------------------------*/ void Writeq_2(WamWord sora_word, WamWord term_word) { SYS_VAR_OPTION_MASK = WRITE_NUMBER_VARS | WRITE_NAME_VARS | WRITE_QUOTED; SYS_VAR_WRITE_DEPTH = -1; SYS_VAR_WRITE_PREC = MAX_PREC; Write_Term_2(sora_word, term_word); } /*-------------------------------------------------------------------------* * WRITE_CANONICAL_1 * * * *-------------------------------------------------------------------------*/ void Write_Canonical_1(WamWord term_word) { SYS_VAR_OPTION_MASK = WRITE_IGNORE_OP | WRITE_QUOTED; SYS_VAR_WRITE_DEPTH = -1; SYS_VAR_WRITE_PREC = MAX_PREC; Write_Term_2(NOT_A_WAM_WORD, term_word); } /*-------------------------------------------------------------------------* * WRITE_CANONICAL_2 * * * *-------------------------------------------------------------------------*/ void Write_Canonical_2(WamWord sora_word, WamWord term_word) { SYS_VAR_OPTION_MASK = WRITE_IGNORE_OP | WRITE_QUOTED; SYS_VAR_WRITE_DEPTH = -1; SYS_VAR_WRITE_PREC = MAX_PREC; Write_Term_2(sora_word, term_word); } /*-------------------------------------------------------------------------* * DISPLAY_1 * * * *-------------------------------------------------------------------------*/ void Display_1(WamWord term_word) { SYS_VAR_OPTION_MASK = WRITE_IGNORE_OP; SYS_VAR_WRITE_DEPTH = -1; SYS_VAR_WRITE_PREC = MAX_PREC; Write_Term_2(NOT_A_WAM_WORD, term_word); } /*-------------------------------------------------------------------------* * DISPLAY_2 * * * *-------------------------------------------------------------------------*/ void Display_2(WamWord sora_word, WamWord term_word) { SYS_VAR_OPTION_MASK = WRITE_IGNORE_OP; SYS_VAR_WRITE_DEPTH = -1; SYS_VAR_WRITE_PREC = MAX_PREC; Write_Term_2(sora_word, term_word); } /*-------------------------------------------------------------------------* * PRINT_1 * * * * NB: the definition of the predicate print/1-2 is in the file print.pl * * to avoid to link call/1 if print is not used. * *-------------------------------------------------------------------------*/ void Print_1(WamWord term_word) { SYS_VAR_OPTION_MASK = WRITE_NUMBER_VARS | WRITE_NAME_VARS | WRITE_PORTRAYED; SYS_VAR_WRITE_DEPTH = -1; SYS_VAR_WRITE_PREC = MAX_PREC; Write_Term_2(NOT_A_WAM_WORD, term_word); } /*-------------------------------------------------------------------------* * PRINT_2 * * * *-------------------------------------------------------------------------*/ void Print_2(WamWord sora_word, WamWord term_word) { SYS_VAR_OPTION_MASK = WRITE_NUMBER_VARS | WRITE_NAME_VARS | WRITE_PORTRAYED; SYS_VAR_WRITE_DEPTH = -1; SYS_VAR_WRITE_PREC = MAX_PREC; Write_Term_2(sora_word, term_word); } /*-------------------------------------------------------------------------* * NL_1 * * * *-------------------------------------------------------------------------*/ void Nl_1(WamWord sora_word) { int stm; stm = (sora_word == NOT_A_WAM_WORD) ? stm_output : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_OUTPUT); last_output_sora = sora_word; Check_Stream_Type(stm, TRUE, FALSE); Stream_Putc('\n', stm_tbl[stm]); } /*-------------------------------------------------------------------------* * NL_0 * * * *-------------------------------------------------------------------------*/ void Nl_0(void) { Nl_1(NOT_A_WAM_WORD); } ./gprolog-1.3.0/src/BipsPl/dynam_supp.c0000644004425400513100000010235010547154135016302 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : dynam_supp.c * * Descr.: dynamic predicate support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: dynam_supp.c,v 1.12 2007/01/04 10:35:09 diaz Exp $ */ #include #include "engine_pl.h" #include "bips_pl.h" #if 0 #define DEBUG #endif #if 0 #define DEBUG1 #endif /*---------------------------------* * Constants * *---------------------------------*/ #define DYN_STAMP_NONE ((DynStamp) -1) #define ALL_MUST_BE_ERASED (DynCInf *) 2 /* bit 0 used for mark */ #define MAX_KBYTES_BEFORE_CLEAN 512 #define MAX_SIZE_BEFORE_CLEAN (MAX_KBYTES_BEFORE_CLEAN*1024/sizeof(WamWord)) #define START_DYNAMIC_SWT_SIZE 32 #define NO_INDEX 0 #define VAR_INDEX 1 #define ATM_INDEX 2 #define INT_INDEX 3 #define LST_INDEX 4 #define STC_INDEX 5 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct /* Dynamic clause scanning info */ { /* --------- input data --------- */ ScanFct alt_fct; /* fct to call for each clause */ int alt_size_info; /* user alt info size */ int owner_func; /* func of the owner (for dbg) */ int owner_arity; /* arity of the owner (for dbg) */ DynPInf *dyn; /* associated dyn info */ int stop_cl_no; /* clause # to reach to stop scan */ DynStamp erase_stamp; /* max stamp to perform a retract */ Bool xxx_is_seq_chain; /* scan all clauses ? */ DynCInf *xxx_ind_chain; /* current assoc idx (->clause) */ DynCInf *var_ind_chain; /* current var idx (->clause) */ DynCInf *clause; /* current clause */ } DynScan; /*---------------------------------* * Global Variables * *---------------------------------*/ static DynStamp erase_stamp = 1; static DynPInf *first_dyn_with_erase = NULL; static int size_of_erased = 0; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static DynPInf *Alloc_Init_Dyn_Info(PredInf *pred, int arity); static int Index_From_First_Arg(WamWord first_arg_word, long *key); static void Add_To_2Chain(D2ChHdr *hdr, DynCInf *clause, Bool in_seq_chain, Bool asserta); static void Remove_From_2Chain(D2ChHdr *hdr, DynCInf *clause, Bool in_seq_chain); static void Erase_All(DynPInf *dyn); static void Clean_Erased_Clauses(void); static void Unlink_Clause(DynCInf *clause); static void Free_Clause(DynCInf *clause); static DynScan *Get_Scan_Choice_Point(WamWord *b); static DynCInf *Scan_Dynamic_Pred_Next(DynScan *scan); #if defined(DEBUG) || defined(DEBUG1) static void Check_Dynamic_Clauses(DynPInf *dyn); static void Check_Hash(char *t, int index_no); static void Check_Chain(D2ChHdr *p, int index_no); #endif #define SCAN_DYN_TEST_ALT X247363616E5F64796E5F746573745F616C74 #define SCAN_DYN_JUMP_ALT X247363616E5F64796E5F6A756D705F616C74 Prolog_Prototype(SCAN_DYN_TEST_ALT, 0); Prolog_Prototype(SCAN_DYN_JUMP_ALT, 0); /*-------------------------------------------------------------------------* * Dynamic clause management * * * * Dynamic clauses are stored in clause frames allocated by malloc. * * The frame consists of: * * * * - a number (<0 if asserta >=0 if assertz) to order them. * * - a forward sequential chain (chronological chain). * * - a backward sequential chain (chronological chain). * * - a forward indexing chain * * - a backward indexing chain * * - the clause number * * - the erase stamp (only if the clause is reased, DYN_STAMP_NONE else) * * - the pointer to the next erased clause (only if the clause is erased)* * - the pointer to the byte-code (or NULL if the clause is interpreted) * * - the size of the Prolog term * * - the corresponding Prolog term of the form [Head|Body] for Head:-Body* * * * For a dynamic predicate the structure DynPInfo has 6 entry-points for * * clause chaining (2-link chains, with next of last = NULL): * * 1 for the sequential chain, 5 for indexing chains, depending on the * * first argument of the Head: * * * * - seq_chain : a chain to the first clause * * - var_ind_chain: a chain to the first clause with a var as 1st arg * * - atm_htbl : a hash table: key=atm/info=chain to the first clause * * - int_htbl : a hash table: key=int/info=chain to the first clause * * - lst_ind_chain: a chain to the first clause with a list as 1st arg * * - stc_htbl : a hash table: key=f_n/info=chain to the first clause * * * * This clause management uses the logical database update view, ie. the * * different altenatives of a predicate are not influenced by subsequent * * actions. When a predicate must be scanned (cf. Scan_Dynamic_Pred) we * * must ensure that subsequent retracted clause must be selected and all * * subsequent added clause must be ignored. * * For added clause we use the count_z value when the selection starts (cf.* * stop_cl_no). A clause is ignored it its clause number (cl_no) is >= to * * stop_cl_no. * * For retracted clause we use a stamp incremented at each selection. When * * a clause is retracted its erase_stamp is set to the current stamp. Then * * an erased clause ignored for a selection if its stamp is <= to the stamp* * of the selection. * * All erased clause of a predicate are linked (first_erased_cl / * * next_erased_cl). * * All dynamic predicates with at least one erased clause are linked * * (first_dyn_with_erase / next_dyn_with_erase). * * Erased clauses are physically cleaned when MAX_KBYTES_BEFORE_CLEAN are * * reached. Then the local stack is scanned to detect all predicates with * * selections and to mark them. All erased clauses of a predicate which is * * not marked are physically destroyed (free). * *-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------* * ADD_DYNAMIC_CLAUSE * * * *-------------------------------------------------------------------------*/ DynCInf * Add_Dynamic_Clause(WamWord head_word, WamWord body_word, Bool asserta, Bool check_perm) { WamWord word; WamWord *first_arg_adr; int func, arity; PredInf *pred; int index_no; long key; DynCInf *clause; DynPInf *dyn; char **p_ind_htbl; D2ChHdr *p_ind_hdr; DSwtInf swt_info; DSwtInf *swt; int size; WamWord lst_h_b; first_arg_adr = Rd_Callable_Check(head_word, &func, &arity); #ifdef DEBUG DBGPRINTF("\tarity: %d", arity); if (arity > 0) { DBGPRINTF("\tfirst arg: "); Write_Simple(*first_arg_adr); } DBGPRINTF("\n"); #endif if ((pred = Lookup_Pred(func, arity)) == NULL) pred = Create_Pred(func, arity, atom_user_input, stm_tbl[stm_stdin]->line_count, MASK_PRED_DYNAMIC | MASK_PRED_PUBLIC, NULL); else if (check_perm && !(pred->prop & MASK_PRED_DYNAMIC)) { word = Put_Structure(ATOM_CHAR('/'), 2); Unify_Atom(func); Unify_Integer(arity); Pl_Err_Permission(permission_operation_modify, permission_type_static_procedure, word); } dyn = (DynPInf *) (pred->dyn); if (dyn == NULL) /* dynamic info not yet allocated ? */ dyn = Alloc_Init_Dyn_Info(pred, arity); index_no = (dyn->arity) ? Index_From_First_Arg(*first_arg_adr, &key) : NO_INDEX; #ifdef DEBUG DBGPRINTF("\n"); DBGPRINTF("asserta: %d Clause: ", asserta); DBGPRINTF("\thead: "); Write_Simple(head_word); DBGPRINTF("\tbody: "); Write_Simple(body_word); DBGPRINTF("\nByte Code at :%p\n", (long) byte_code); #endif lst_h_b = Tag_LST(H); H[0] = head_word; H[1] = body_word; size = Term_Size(lst_h_b); clause = (DynCInf *) Malloc(sizeof(DynCInf) - 3 * sizeof(WamWord) + size * sizeof(WamWord)); Add_To_2Chain(&dyn->seq_chain, clause, TRUE, asserta); clause->dyn = dyn; clause->cl_no = (asserta) ? dyn->count_a-- : dyn->count_z++; clause->erase_stamp = DYN_STAMP_NONE; clause->next_erased_cl = NULL; clause->term_size = size; Copy_Term(&clause->term_word, &lst_h_b); clause->byte_code = byte_code; byte_code = NULL; switch(index_no) { case NO_INDEX: clause->ind_chain.next = NULL; clause->ind_chain.prev = NULL; p_ind_hdr = NULL; p_ind_htbl = NULL; break; case VAR_INDEX: p_ind_hdr = &(dyn->var_ind_chain); p_ind_htbl = NULL; break; case LST_INDEX: p_ind_hdr = &(dyn->lst_ind_chain); p_ind_htbl = NULL; break; case ATM_INDEX: p_ind_htbl = &(dyn->atm_htbl); break; case INT_INDEX: p_ind_htbl = &(dyn->int_htbl); break; case STC_INDEX: p_ind_htbl = &(dyn->stc_htbl); break; } clause->p_ind_htbl = p_ind_htbl; if (p_ind_htbl) { if (*p_ind_htbl == NULL) *p_ind_htbl = Hash_Alloc_Table(START_DYNAMIC_SWT_SIZE, sizeof(DSwtInf)); swt_info.key = key; swt_info.ind_chain.first = swt_info.ind_chain.last = NULL; Extend_Table_If_Needed(p_ind_htbl); swt = (DSwtInf *) Hash_Insert(*p_ind_htbl, (char *) &swt_info, FALSE); p_ind_hdr = &(swt->ind_chain); } clause->p_ind_hdr = p_ind_hdr; if (p_ind_hdr) Add_To_2Chain(p_ind_hdr, clause, FALSE, asserta); #ifdef DEBUG Check_Dynamic_Clauses(dyn); #endif return clause; } /*-------------------------------------------------------------------------* * ALLOC_INIT_DYN_INFO * * * *-------------------------------------------------------------------------*/ static DynPInf * Alloc_Init_Dyn_Info(PredInf *pred, int arity) { DynPInf *dyn; dyn = (DynPInf *) Malloc(sizeof(DynPInf)); dyn->seq_chain.first = dyn->seq_chain.last = NULL; dyn->var_ind_chain.first = dyn->var_ind_chain.last = NULL; dyn->lst_ind_chain.first = dyn->lst_ind_chain.last = NULL; dyn->atm_htbl = dyn->int_htbl = dyn->stc_htbl = NULL; dyn->arity = arity; dyn->count_a = -1; dyn->count_z = 0; dyn->first_erased_cl = NULL; dyn->next_dyn_with_erase = NULL; pred->dyn = (long *) dyn; return dyn; } /*-------------------------------------------------------------------------* * INDEX_FROM_FIRST_ARG * * * *-------------------------------------------------------------------------*/ static int Index_From_First_Arg(WamWord first_arg_word, long *key) { WamWord word, tag_mask; int index_no; DEREF(first_arg_word, word, tag_mask); switch (Tag_From_Tag_Mask(tag_mask)) { case REF: #ifndef NO_USE_FD_SOLVER case FDV: #endif index_no = VAR_INDEX; break; case INT: index_no = INT_INDEX; *key = UnTag_INT(word); break; case ATM: index_no = ATM_INDEX; *key = (long) UnTag_ATM(word); break; case FLT: index_no = NO_INDEX; break; case LST: index_no = LST_INDEX; break; default: /* tag==STC */ index_no = STC_INDEX; *key = (long) Functor_And_Arity(UnTag_STC(word)); break; } return index_no; } /*-------------------------------------------------------------------------* * ADD_TO_2CHAIN * * * *-------------------------------------------------------------------------*/ static void Add_To_2Chain(D2ChHdr *hdr, DynCInf *clause, Bool in_seq_chain, Bool asserta) { D2ChCell *cell = (in_seq_chain) ? &clause->seq_chain : &clause->ind_chain; if (hdr->first == NULL) /* empty chain ? */ { hdr->first = hdr->last = clause; cell->next = cell->prev = NULL; return; } if (asserta) { cell->next = hdr->first; cell->prev = NULL; hdr->first = clause; if (in_seq_chain) cell->next->seq_chain.prev = clause; else cell->next->ind_chain.prev = clause; } else { if (in_seq_chain) hdr->last->seq_chain.next = clause; else hdr->last->ind_chain.next = clause; cell->next = NULL; cell->prev = hdr->last; hdr->last = clause; } } /*-------------------------------------------------------------------------* * REMOVE_FROM_2CHAIN * * * *-------------------------------------------------------------------------*/ static void Remove_From_2Chain(D2ChHdr *hdr, DynCInf *clause, Bool in_seq_chain) { D2ChCell *cell = (in_seq_chain) ? &clause->seq_chain : &clause->ind_chain; DynCInf *prev = cell->prev; DynCInf *next = cell->next; if (prev == NULL) /* first cell ? */ hdr->first = next; else { if (in_seq_chain) prev->seq_chain.next = next; else prev->ind_chain.next = next; } if (next == NULL) /* last cell ? */ hdr->last = prev; else { if (in_seq_chain) next->seq_chain.prev = prev; else next->ind_chain.prev = prev; } } /*-------------------------------------------------------------------------* * DELETE_DYNAMIC_CLAUSE * * * * This comes down to erase the clause, ie. set it to current erase_stamp * *-------------------------------------------------------------------------*/ void Delete_Dynamic_Clause(DynCInf *clause) { DynPInf *dyn; Bool first; dyn = clause->dyn; first = (dyn->first_erased_cl == NULL); clause->erase_stamp = erase_stamp; clause->next_erased_cl = dyn->first_erased_cl; dyn->first_erased_cl = clause; if (first) { dyn->next_dyn_with_erase = first_dyn_with_erase; first_dyn_with_erase = dyn; } size_of_erased += clause->term_size; Clean_Erased_Clauses(); #ifdef DEBUG Check_Dynamic_Clauses(dyn); #endif } /*-------------------------------------------------------------------------* * ERASE_ALL * * * * This function is called to erase all clauses and, when possible, to free* * dyn with all associated info (hash tables,...) * *-------------------------------------------------------------------------*/ static void Erase_All(DynPInf *dyn) { Bool first; DynCInf *clause; if (dyn == NULL) return; first = (dyn->first_erased_cl == NULL); dyn->first_erased_cl = ALL_MUST_BE_ERASED; if (first) { dyn->next_dyn_with_erase = first_dyn_with_erase; first_dyn_with_erase = dyn; } for (clause = dyn->seq_chain.first; clause; clause = clause->seq_chain.next) { if (clause->erase_stamp == DYN_STAMP_NONE) size_of_erased += clause->term_size; } Clean_Erased_Clauses(); } /*-------------------------------------------------------------------------* * CLEAN_ERASED_CLAUSES * * * *-------------------------------------------------------------------------*/ static void Clean_Erased_Clauses(void) { WamWord *b, *base; DynScan *scan; DynPInf *dyn, *dyn1, **prev; DynCInf *clause, *clause1; if (size_of_erased <= MAX_SIZE_BEFORE_CLEAN) return; base = Local_Stack; for (b = B; b > base; b = BB(b)) { scan = Get_Scan_Choice_Point(b); if (scan == NULL) continue; dyn = scan->dyn; if (dyn->first_erased_cl) /* we must keep it - free impossible */ dyn->first_erased_cl = (DynCInf *) ((unsigned long) (dyn->first_erased_cl) | 1); /* mark it */ } prev = &first_dyn_with_erase; for (dyn = first_dyn_with_erase; dyn; dyn = dyn1) { dyn1 = dyn->next_dyn_with_erase; if ((long) (dyn->first_erased_cl) & 1) /* marked ? */ { /* cannot free it */ dyn->first_erased_cl = (DynCInf *) ((unsigned long) (dyn->first_erased_cl) & (~1)); prev = &(dyn->next_dyn_with_erase); continue; } /* not marked - can be cleaned */ *prev = dyn->next_dyn_with_erase; if (dyn->first_erased_cl == ALL_MUST_BE_ERASED) /* clean all ? */ { for (clause = dyn->seq_chain.first; clause; clause = clause1) { clause1 = clause->seq_chain.next; size_of_erased -= clause->term_size; Free_Clause(clause); } if (dyn->atm_htbl) Hash_Free_Table(dyn->atm_htbl); if (dyn->int_htbl) Hash_Free_Table(dyn->int_htbl); if (dyn->stc_htbl) Hash_Free_Table(dyn->stc_htbl); Free(dyn); continue; } for (clause = dyn->first_erased_cl; clause; clause = clause1) { clause1 = clause->next_erased_cl; size_of_erased -= clause->term_size; Unlink_Clause(clause); Free_Clause(clause); } dyn->first_erased_cl = NULL; dyn->next_dyn_with_erase = NULL; if (dyn->seq_chain.first == NULL) /* no more clauses */ { if (dyn->atm_htbl) Hash_Free_Table(dyn->atm_htbl); if (dyn->int_htbl) Hash_Free_Table(dyn->int_htbl); if (dyn->stc_htbl) Hash_Free_Table(dyn->stc_htbl); dyn->atm_htbl = dyn->int_htbl = dyn->stc_htbl = NULL; dyn->count_a = -1; dyn->count_z = 0; } #ifdef DEBUG1 Check_Dynamic_Clauses(dyn); #endif } } /*-------------------------------------------------------------------------* * UNLINK_CLAUSE * * * *-------------------------------------------------------------------------*/ static void Unlink_Clause(DynCInf *clause) { DynPInf *dyn = clause->dyn; long *p_key; DSwtInf swt_info; Remove_From_2Chain(&dyn->seq_chain, clause, TRUE); if (clause->p_ind_hdr) Remove_From_2Chain(clause->p_ind_hdr, clause, FALSE); if (clause->p_ind_htbl && clause->ind_chain.prev == NULL && clause->ind_chain.next == NULL) { p_key = (long *) ((char *) clause->p_ind_hdr - ((char *) &(swt_info.ind_chain) - (char *) &(swt_info.key))); #ifdef DEBUG1 DBGPRINTF("Removing last ind key in a hash table (%ld)\n", *p_key); #endif Hash_Delete(*clause->p_ind_htbl, *p_key); } } /*-------------------------------------------------------------------------* * FREE_CLAUSE * * * *-------------------------------------------------------------------------*/ static void Free_Clause(DynCInf *clause) { if (clause->byte_code) Free(clause->byte_code); Free(clause); } /*-------------------------------------------------------------------------* * UPDATE_DYNAMIC_PRED * * * * what_to_do: bit 0: with check dynamic ? * * bit 1: also predicate definition ? * * examples : 0 for consult/1 * * 1 for retractall/1 * * 2 for '$remove_predicate'/2 * * 3 for abolish/1 * * * * returns a pointer to associated pred or NULL if it does not exist. * *-------------------------------------------------------------------------*/ PredInf * Update_Dynamic_Pred(int func, int arity, int what_to_do) { WamWord word; PredInf *pred; pred = Lookup_Pred(func, arity); if (pred == NULL) return NULL; if ((what_to_do & 1) && !(pred->prop & MASK_PRED_DYNAMIC)) { word = Put_Structure(ATOM_CHAR('/'), 2); Unify_Atom(func); Unify_Integer(arity); Pl_Err_Permission(permission_operation_modify, permission_type_static_procedure, word); } Erase_All((DynPInf *) (pred->dyn)); pred->dyn = NULL; if ((what_to_do & 2)) { Delete_Pred(func, arity); return NULL; } return pred; } /*-------------------------------------------------------------------------* * GET_SCAN_CHOICE_POINT * * * *-------------------------------------------------------------------------*/ static DynScan * Get_Scan_Choice_Point(WamWord *b) { DynScan *scan; int i; if (ALTB(b) != (CodePtr) Prolog_Predicate(SCAN_DYN_TEST_ALT, 0) && ALTB(b) != (CodePtr) Prolog_Predicate(SCAN_DYN_JUMP_ALT, 0)) return NULL; i = sizeof(DynScan) / sizeof(WamWord) - 1; scan = (DynScan *) &AB(b, i); return scan; } /*-------------------------------------------------------------------------* * SCAN_DYNAMIC_PRED * * * *-------------------------------------------------------------------------*/ DynCInf * Scan_Dynamic_Pred(int owner_func, int owner_arity, DynPInf *dyn, WamWord first_arg_word, ScanFct alt_fct, int alt_fct_type, int alt_info_size, WamWord *alt_info) { int index_no; long key; char **p_ind_htbl; DSwtInf *swt; DynScan scan; DynCInf *clause; WamWord *adr; int i; CodePtr scan_alt; if (owner_func < 0) owner_func = Get_Current_Bip(&owner_arity); index_no = (dyn->arity) ? Index_From_First_Arg(first_arg_word, &key) : NO_INDEX; scan.alt_fct = alt_fct; scan.alt_size_info = alt_info_size; scan.owner_func = owner_func; scan.owner_arity = owner_arity; scan.dyn = dyn; scan.stop_cl_no = dyn->count_z; scan.erase_stamp = erase_stamp++; switch (index_no) { case NO_INDEX: case VAR_INDEX: scan.xxx_is_seq_chain = TRUE; scan.xxx_ind_chain = dyn->seq_chain.first; p_ind_htbl = NULL; break; case LST_INDEX: scan.xxx_is_seq_chain = FALSE; scan.xxx_ind_chain = dyn->lst_ind_chain.first; p_ind_htbl = NULL; break; case ATM_INDEX: p_ind_htbl = &(dyn->atm_htbl); break; case INT_INDEX: p_ind_htbl = &(dyn->int_htbl); break; case STC_INDEX: p_ind_htbl = &(dyn->stc_htbl); break; } if (p_ind_htbl) { scan.xxx_is_seq_chain = FALSE; if (*p_ind_htbl && (swt = (DSwtInf *) Hash_Find(*p_ind_htbl, key)) != NULL) scan.xxx_ind_chain = swt->ind_chain.first; else scan.xxx_ind_chain = NULL; } if (scan.xxx_is_seq_chain) scan.var_ind_chain = NULL; else scan.var_ind_chain = dyn->var_ind_chain.first; clause = Scan_Dynamic_Pred_Next(&scan); if (clause == NULL) return NULL; if (Scan_Dynamic_Pred_Next(&scan) != NULL) /* non deterministic case */ { i = (sizeof(DynScan) + sizeof(WamWord) - 1) / sizeof(WamWord) + alt_info_size; if (alt_fct_type == DYN_ALT_FCT_FOR_TEST) scan_alt = (CodePtr) Prolog_Predicate(SCAN_DYN_TEST_ALT, 0); else scan_alt = (CodePtr) Prolog_Predicate(SCAN_DYN_JUMP_ALT, 0); Create_Choice_Point(scan_alt, i); adr = &AB(B, i) + 1; i = alt_info_size; while (i--) *adr++ = *alt_info++; *(DynScan *) adr = scan; } return clause; } /*-------------------------------------------------------------------------* * SCAN_DYNAMIC_PRED_NEXT * * * *-------------------------------------------------------------------------*/ static DynCInf * Scan_Dynamic_Pred_Next(DynScan *scan) { DynCInf *xxx_ind_chain, *var_ind_chain; DynCInf *xxx_clause, *var_clause; long xxx_nb, var_nb; DynCInf *clause; #ifdef DEBUG DBGPRINTF("Looking for next clause stamp:%ld", (long) (scan->erase_stamp)); Check_Dynamic_Clauses(scan->dyn); #endif scan->clause = NULL; start: xxx_ind_chain = scan->xxx_ind_chain; if (xxx_ind_chain) { xxx_clause = xxx_ind_chain; xxx_nb = xxx_clause->cl_no; } else xxx_nb = INT_GREATEST_VALUE; var_ind_chain = scan->var_ind_chain; if (var_ind_chain) { var_clause = var_ind_chain; var_nb = var_clause->cl_no; } else var_nb = INT_GREATEST_VALUE; if (xxx_nb <= var_nb) { if (xxx_nb == INT_GREATEST_VALUE) return NULL; clause = xxx_clause; if (scan->xxx_is_seq_chain) scan->xxx_ind_chain = xxx_ind_chain->seq_chain.next; else scan->xxx_ind_chain = xxx_ind_chain->ind_chain.next; } else { clause = var_clause; scan->var_ind_chain = var_ind_chain->ind_chain.next; } if (clause->cl_no >= scan->stop_cl_no) return NULL; if (clause->erase_stamp <= scan->erase_stamp) goto start; scan->clause = clause; return clause; } /*-------------------------------------------------------------------------* * SCAN_DYNAMIC_PRED_ALT_0 * * * *-------------------------------------------------------------------------*/ long Scan_Dynamic_Pred_Alt_0(void) { WamWord *alt_info; DynScan *scan; DynCInf *clause; Bool is_last; WamWord *adr; int i; CodePtr scan_alt; scan_alt = ALTB(B); Update_Choice_Point(scan_alt, 0); i = (sizeof(DynScan) + sizeof(WamWord) - 1) / sizeof(WamWord) - 1; scan = (DynScan *) &AB(B, i); adr = (WamWord *) scan; alt_info = (WamWord *) (adr - scan->alt_size_info); clause = scan->clause; is_last = (Scan_Dynamic_Pred_Next(scan) == NULL); if (is_last) Delete_Last_Choice_Point(); return (*scan->alt_fct) (clause, alt_info, is_last); } /*-------------------------------------------------------------------------* * SCAN_CHOICE_POINT_PRED * * * * returns the functor and initializes the arity of the scan choice point b* * or -1 if b is not a scan choice point. * *-------------------------------------------------------------------------*/ int Scan_Choice_Point_Pred(WamWord *b, int *arity) { DynScan *scan; scan = Get_Scan_Choice_Point(b); if (scan == NULL) return -1; *arity = scan->owner_arity; return scan->owner_func; } /*-------------------------------------------------------------------------* * COPY_CLAUSE_TO_HEAP * * * *-------------------------------------------------------------------------*/ void Copy_Clause_To_Heap(DynCInf *clause, WamWord *head_word, WamWord *body_word) { Copy_Contiguous_Term(H, &clause->term_word); /* *H= */ *head_word = H[1]; *body_word = H[2]; H += clause->term_size; } #if defined(DEBUG) || defined(DEBUG1) /*-------------------------------------------------------------------------* * CHECK_DYNAMIC_CLAUSES * * * * (debug function) * *-------------------------------------------------------------------------*/ static void Check_Dynamic_Clauses(DynPInf *dyn) { DBGPRINTF("\nFirst dyn with erase:%p\n", (long) first_dyn_with_erase); DBGPRINTF("Dyn:%p arity:%d count_a:%d count_z:%d " "1st erased:%p next dyn with erase:%p\n", (long) dyn, dyn->arity, dyn->count_a, dyn->count_z, (long) dyn->first_erased_cl, (long) dyn->next_dyn_with_erase); Check_Chain(&dyn->seq_chain, NO_INDEX); Check_Chain(&dyn->var_ind_chain, VAR_INDEX); Check_Hash(dyn->atm_htbl, ATM_INDEX); Check_Hash(dyn->int_htbl, INT_INDEX); Check_Chain(&dyn->lst_ind_chain, LST_INDEX); Check_Hash(dyn->stc_htbl, STC_INDEX); } /*-------------------------------------------------------------------------* * CHECK_HASH * * * * (debug function) * *-------------------------------------------------------------------------*/ static void Check_Hash(char *t, int index_no) { DSwtInf *swt; HashScan scan; if (t == NULL) return; switch (index_no) { case ATM_INDEX: DBGPRINTF("\nAtom\n"); break; case INT_INDEX: DBGPRINTF("\nInteger\n"); break; case STC_INDEX: DBGPRINTF("\nStructure\n"); break; } for (swt = (DSwtInf *) Hash_First(t, &scan); swt; swt = (DSwtInf *) Hash_Next(&scan)) { if (index_no == ATM_INDEX) DBGPRINTF("val <%s>\n", atom_tbl[swt->key].name); if (index_no == INT_INDEX) DBGPRINTF("val <%ld>\n", swt->key); if (index_no == STC_INDEX) DBGPRINTF("val <%s/%d>\n", atom_tbl[Functor_Of(swt->key)].name, (int) Arity_Of(swt->key)); Check_Chain(&swt->ind_chain, index_no); } } /*-------------------------------------------------------------------------* * CHECK_LIST * * * * (debug function) * *-------------------------------------------------------------------------*/ static void Check_Chain(D2ChHdr *hdr, int index_no) { DynCInf *clause, *clause_b, *clause_f; if (hdr->first == NULL) return; switch (index_no) { case NO_INDEX: DBGPRINTF("\nSequential\n"); break; case VAR_INDEX: DBGPRINTF("\nVariable\n"); break; case LST_INDEX: DBGPRINTF("\nList\n"); break; } for(clause = hdr->first; clause; clause = clause_f) { clause_f = clause_b = NULL; if (index_no == NO_INDEX) { clause_f = clause->seq_chain.next; clause_b = clause->seq_chain.prev; } else { clause_f = clause->ind_chain.next; clause_b = clause->ind_chain.prev; } DBGPRINTF(" %3d %3d %p %p <-> %p ", clause->cl_no, clause->term_size, (long) clause, (long) clause_b, (long) clause_f); Write_Simple(clause->head_word); DBGPRINTF(":-"); Write_Simple(clause->body_word); if (clause->erase_stamp != DYN_STAMP_NONE) DBGPRINTF(" erased at:%ld next erased: %p", clause->erase_stamp, (long) (clause->next_erased_cl)); DBGPRINTF("\n"); } } #endif ./gprolog-1.3.0/src/BipsPl/file.pl0000644004425400513100000000436610547162352015243 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : file.pl * * Descr.: file name management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: file.pl,v 1.11 2007/01/04 10:35:09 diaz Exp $ */ :- built_in. '$use_file'. absolute_file_name(F1, F2) :- set_bip_name(absolute_file_name, 2), '$call_c_test'('Absolute_File_Name_2'(F1, F2)). decompose_file_name(Path, Dir, Prefix, Suffix) :- set_bip_name(decompose_file_name, 4), '$call_c_test'('Decompose_File_Name_4'(Path, Dir, Prefix, Suffix)). prolog_file_name(PlFile, PlFile1) :- set_bip_name(prolog_file_name, 2), '$call_c_test'('Prolog_File_Name_2'(PlFile, PlFile1)). ./gprolog-1.3.0/src/BipsPl/bips_pl.h0000644004425400513100000000421210547154133015554 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : bips_pl.h * * Descr.: general header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: bips_pl.h,v 1.9 2007/01/04 10:35:07 diaz Exp $ */ #include "b_params.h" #include "inl_protos.h" #include "c_supp.h" #include "foreign_supp.h" #include "pred_supp.h" #include "term_supp.h" #include "stream_supp.h" #include "error_supp.h" #include "scan_supp.h" #include "parse_supp.h" #include "write_supp.h" #include "flag_supp.h" #include "dynam_supp.h" #include "callinf_supp.h" #include "bc_supp.h" ./gprolog-1.3.0/src/BipsPl/expand.wam0000644004425400513100000000531410547440332015743 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : expand.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/expand.pl'). predicate('$use_expand'/0,29,static,private,built_in,[ proceed]). predicate(expand_term/2,32,static,private,built_in,[ allocate(2), get_variable(y(0),1), put_variable(y(1),1), call('$expand_term1'/2), put_unsafe_value(y(1),0), get_value(y(0),0), deallocate, proceed]). predicate('$expand_term1'/2,36,static,private,built_in,[ load_cut_level(2), allocate(1), get_variable(y(0),2), call('$$expand_term1/2_$aux1'/2), cut(y(0)), deallocate, proceed]). predicate('$$expand_term1/2_$aux1'/2,36,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), get_value(x(0),1), proceed, label(1), retry_me_else(2), execute('$call_term_expansion'/2), label(2), retry_me_else(3), put_atom(expand_term,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), execute('$dcg_trans_rule'/2), label(3), trust_me_else_fail, get_value(x(0),1), proceed]). predicate('$call_term_expansion'/2,48,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_structure((/)/2,0), unify_atom(term_expansion), unify_integer(2), call(current_predicate/1), put_structure(term_expansion/2,0), unify_local_value(y(0)), unify_local_value(y(1)), put_atom('$call_term_expansion',1), put_integer(2,2), put_atom(true,3), deallocate, execute('$call'/4)]). predicate(phrase/2,55,static,private,built_in,[ put_nil(2), put_integer(2,3), execute('$phrase'/4)]). predicate(phrase/3,61,static,private,built_in,[ put_integer(3,3), execute('$phrase'/4)]). predicate('$phrase'/4,67,static,private,built_in,[ allocate(5), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_atom(phrase,0), put_value(y(3),1), call(set_bip_name/2), put_value(y(1),0), call('$check_list_or_partial_list'/1), put_value(y(2),0), call('$check_list_or_partial_list'/1), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_variable(y(4),3), call('$dcg_trans_body'/4), put_unsafe_value(y(4),0), put_atom(phrase,1), put_value(y(3),2), put_atom(true,3), deallocate, execute('$call'/4)]). predicate('$dcg_trans_rule'/2,77,static,private,built_in,[ call_c('Dcg_Trans_Rule_2',[boolean],[x(0),x(1)]), proceed]). predicate('$dcg_trans_body'/4,83,static,private,built_in,[ call_c('Dcg_Trans_Body_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). ./gprolog-1.3.0/src/BipsPl/src_rdr.wam0000644004425400513100000010052610547440332016123 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : src_rdr.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/src_rdr.pl'). predicate('$use_src_rdr'/0,29,static,private,built_in,[ proceed]). predicate(sr_open/3,58,static,private,built_in,[ allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(sr_open,0), put_integer(3,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_sr_defaults'/0), put_value(y(2),0), put_variable(y(3),1), call('$get_sr_options'/2), put_value(y(1),0), call('$sr_open/3_$aux1'/1), put_value(y(1),0), put_unsafe_value(y(3),1), call_c('SR_Init_Open_2',[],[x(0),x(1)]), put_value(y(0),0), deallocate, execute('$sr_open/3_$aux2'/1)]). predicate('$sr_open/3_$aux2'/1,58,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), get_structure('$stream'/1,0), unify_void(1), cut(x(1)), put_atom(true,1), call_c('SR_Open_File_2',[],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, execute('$sr_open_new_prolog_file'/1)]). predicate('$sr_open/3_$aux1'/1,58,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), proceed, label(1), trust_me_else_fail, put_value(x(0),1), put_atom(variable,0), execute('$pl_err_type'/2)]). predicate('$set_sr_defaults'/0,91,static,private,built_in,[ allocate(0), put_integer(0,0), put_integer(1022,1), call('$sys_var_write'/2), put_integer(0,0), put_integer(19,1), call('$sys_var_set_bit'/2), put_integer(1,0), put_integer(0,1), deallocate, execute('$sys_var_write'/2)]). predicate('$get_sr_options'/2,97,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_value(y(0),0), call('$check_list'/1), put_atom('$sr_output_stream',0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(0),0), call('$get_sr_options1'/1), put_atom('$sr_output_stream',0), put_value(y(1),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), deallocate, proceed]). predicate('$get_sr_options1'/1,104,static,private,built_in,[ load_cut_level(1), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_variable(y(1),1), call('$get_sr_options2'/1), cut(y(1)), put_value(y(0),0), deallocate, execute('$get_sr_options1'/1)]). predicate('$get_sr_options2'/1,111,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), execute('$pl_err_instantiation'/0), label(1), retry_me_else(2), allocate(2), get_variable(x(2),0), put_variable(x(0),1), put_integer(1,3), call_c('Blt_Functor',[fast_call,boolean],[x(2),x(1),x(3)]), put_integer(1,1), put_variable(y(0),3), call_c('Blt_Arg',[fast_call,boolean],[x(1),x(2),x(3)]), put_value(y(0),1), call_c('Blt_Non_Var',[fast_call,boolean],[x(1)]), put_void(1), put_variable(y(1),2), call('$sr_treat_pass_no'/3), put_atom(is,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), math_load_value(y(1),0), put_integer(2,1), call_c('Fct_Mul',[fast_call,x(1)],[x(0),x(1)]), put_atom(is,0), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(0),x(2)]), math_load_value(x(1),0), call_c('Fct_Inc',[fast_call,x(2)],[x(0)]), put_atom(sr_open,0), put_integer(3,3), call_c('Set_Bip_Name_2',[],[x(0),x(3)]), put_unsafe_value(y(0),0), deallocate, execute('$sr_set_treat_pass_bits'/3), label(2), retry_me_else(14), switch_on_term(4,fail,fail,fail,3), label(3), switch_on_structure([(restart/1,5),(reflect_eof/1,7),(undo_directives/1,9),(write_error/1,11),(output_stream/1,13)]), label(4), try_me_else(6), label(5), get_structure(restart/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_sr_options2/1_$aux1'/1), label(6), retry_me_else(8), label(7), get_structure(reflect_eof/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_sr_options2/1_$aux2'/1), label(8), retry_me_else(10), label(9), get_structure(undo_directives/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_sr_options2/1_$aux3'/1), label(10), retry_me_else(12), label(11), get_structure(write_error/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_sr_options2/1_$aux4'/1), label(12), trust_me_else_fail, label(13), get_structure(output_stream/1,0), unify_variable(x(1)), put_atom('$sr_output_stream',0), call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), put_integer(1,0), put_integer(1,1), execute('$sys_var_write'/2), label(14), trust_me_else_fail, put_value(x(0),1), put_atom(sr_option,0), execute('$pl_err_domain'/2)]). predicate('$$get_sr_options2/1_$aux4'/1,149,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(false,3),(true,5)]), label(2), try_me_else(4), label(3), get_atom(false,0), put_integer(0,0), put_integer(19,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(true,0), put_integer(0,0), put_integer(19,1), execute('$sys_var_set_bit'/2)]). predicate('$$get_sr_options2/1_$aux3'/1,141,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(false,3),(true,5)]), label(2), try_me_else(4), label(3), get_atom(false,0), put_integer(0,0), put_integer(18,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(true,0), put_integer(0,0), put_integer(18,1), execute('$sys_var_set_bit'/2)]). predicate('$$get_sr_options2/1_$aux2'/1,133,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(false,3),(true,5)]), label(2), try_me_else(4), label(3), get_atom(false,0), put_integer(0,0), put_integer(17,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(true,0), put_integer(0,0), put_integer(17,1), execute('$sys_var_set_bit'/2)]). predicate('$$get_sr_options2/1_$aux1'/1,125,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(false,3),(true,5)]), label(2), try_me_else(4), label(3), get_atom(false,0), put_integer(0,0), put_integer(16,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(true,0), put_integer(0,0), put_integer(16,1), execute('$sys_var_set_bit'/2)]). predicate('$sr_treat_pass_no'/3,169,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(include,3),(op,5),(set_prolog_flag,7),(char_conversion,9),(module,11),(end_module,13),(body,15),(end_body,17)]), label(2), try_me_else(4), label(3), get_atom(include,0), get_integer(1,1), get_integer(0,2), proceed, label(4), retry_me_else(6), label(5), get_atom(op,0), get_integer(3,1), get_integer(1,2), proceed, label(6), retry_me_else(8), label(7), get_atom(set_prolog_flag,0), get_integer(2,1), get_integer(2,2), proceed, label(8), retry_me_else(10), label(9), get_atom(char_conversion,0), get_integer(2,1), get_integer(3,2), proceed, label(10), retry_me_else(12), label(11), get_atom(module,0), get_integer(1,1), get_integer(4,2), proceed, label(12), retry_me_else(14), label(13), get_atom(end_module,0), get_integer(1,1), get_integer(4,2), proceed, label(14), retry_me_else(16), label(15), get_atom(body,0), get_integer(1,1), get_integer(4,2), proceed, label(16), trust_me_else_fail, label(17), get_atom(end_body,0), get_integer(1,1), get_integer(4,2), proceed]). predicate('$sr_set_treat_pass_bits'/3,181,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(kill,3),(ignore,5),(hide,7),(reflect,9)]), label(2), try_me_else(4), label(3), allocate(1), get_atom(kill,0), get_variable(y(0),2), put_integer(0,0), call('$sys_var_reset_bit'/2), put_integer(0,0), put_value(y(0),1), deallocate, execute('$sys_var_reset_bit'/2), label(4), retry_me_else(6), label(5), allocate(1), get_atom(ignore,0), get_variable(y(0),2), put_integer(0,0), call('$sys_var_set_bit'/2), put_integer(0,0), put_value(y(0),1), deallocate, execute('$sys_var_reset_bit'/2), label(6), retry_me_else(8), label(7), allocate(1), get_atom(hide,0), get_variable(y(0),2), put_integer(0,0), call('$sys_var_reset_bit'/2), put_integer(0,0), put_value(y(0),1), deallocate, execute('$sys_var_set_bit'/2), label(8), trust_me_else_fail, label(9), allocate(1), get_atom(reflect,0), get_variable(y(0),2), put_integer(0,0), call('$sys_var_set_bit'/2), put_integer(0,0), put_value(y(0),1), deallocate, execute('$sys_var_set_bit'/2)]). predicate('$sr_open_new_prolog_file'/1,200,static,private,built_in,[ put_variable(x(1),2), call_c('Prolog_File_Name_2',[],[x(0),x(2)]), put_atom(false,0), call_c('SR_Open_File_2',[],[x(1),x(0)]), proceed]). predicate(sr_change_options/2,212,static,private,built_in,[ allocate(0), put_atom(sr_change_options,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('SR_Check_Descriptor_1',[],[x(0)]), put_value(x(1),0), call('$get_sr_options1'/1), deallocate, call_c('SR_Change_Options_0',[],[]), proceed]). predicate(sr_close/1,221,static,private,built_in,[ put_atom(sr_close,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('SR_Close_1',[],[x(0)]), proceed]). predicate(sr_new_pass/1,227,static,private,built_in,[ put_atom(sr_new_pass,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), execute('$sr_new_pass/1_$aux1'/1)]). predicate('$sr_new_pass/1_$aux1'/1,227,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('SR_New_Pass_1',[boolean],[x(0)]), cut(x(1)), proceed, label(1), trust_me_else_fail, put_value(x(0),2), put_atom(new_pass,0), put_atom(one_pass_reader,1), execute('$pl_err_permission'/3)]). predicate(sr_read_term/4,237,static,private,built_in,[ load_cut_level(4), allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), put_value(y(0),0), call_c('SR_Check_Descriptor_1',[],[x(0)]), call(repeat/0), put_variable(x(0),1), call_c('SR_Get_Stm_For_Read_Term_1',[],[x(1)]), put_structure('$stream'/1,1), unify_value(x(0)), put_atom(sr_read_term,0), put_integer(3,2), call_c('Set_Bip_Name_2',[],[x(0),x(2)]), put_structure('$read_term'/3,0), unify_value(x(1)), unify_local_value(y(1)), unify_local_value(y(2)), put_variable(y(5),1), put_atom(true,2), put_atom(sr_read_term,3), put_integer(3,4), put_atom(false,5), call('$catch'/6), call_c('SR_Update_Position_0',[],[]), put_value(y(5),0), put_value(y(1),1), put_value(y(3),2), call('$sr_read_term/4_$aux1'/3), put_value(y(3),0), put_value(y(0),1), call('$sr_read_term/4_$aux2'/2), cut(y(4)), deallocate, proceed]). predicate('$sr_read_term/4_$aux2'/2,237,static,private,built_in,[ load_cut_level(2), try_me_else(1), get_variable(x(3),1), get_variable(x(1),0), get_structure(sr_error/2,1), unify_void(2), put_integer(19,0), call_c('SR_Is_Bit_Set_1',[boolean],[x(0)]), cut(x(2)), put_value(x(3),0), execute(sr_write_error/2), label(1), trust_me_else_fail, proceed]). predicate('$sr_read_term/4_$aux1'/3,237,static,private,built_in,[ load_cut_level(3), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(3)), put_value(x(1),0), put_value(x(2),1), execute('$sr_treat_term'/2), label(1), trust_me_else_fail, get_atom('$sr_read_term_error',1), put_value(x(2),1), execute('$sr_error_from_exception'/2)]). predicate('$sr_treat_term'/2,264,static,private,built_in,[ load_cut_level(2), try_me_else(1), put_atom(end_of_file,3), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(3)]), cut(x(2)), put_variable(x(0),2), call_c('SR_EOF_Reached_1',[boolean],[x(2)]), execute('$$sr_treat_term/2_$aux1'/2), label(1), retry_me_else(2), allocate(6), get_variable(y(0),1), get_variable(y(1),2), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), get_structure((:-)/1,0), unify_variable(y(2)), put_value(y(2),0), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), put_value(y(2),2), put_variable(x(0),3), put_variable(x(1),4), call_c('Blt_Functor',[fast_call,boolean],[x(2),x(3),x(4)]), put_variable(y(3),2), call('$sr_treat_pass_no'/3), cut(y(1)), put_atom(is,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), math_load_value(y(3),0), put_integer(2,1), call_c('Fct_Mul',[fast_call,x(0)],[x(0),x(1)]), get_variable(y(4),0), put_atom(is,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), math_load_value(y(4),0), call_c('Fct_Inc',[fast_call,x(0)],[x(0)]), put_value(y(2),1), put_value(y(0),2), put_variable(y(5),3), call('$$sr_treat_term/2_$aux2'/4), put_unsafe_value(y(5),0), put_value(y(4),1), deallocate, execute('$$sr_treat_term/2_$aux3'/2), label(2), trust_me_else_fail, get_atom(sr_ok,1), proceed]). predicate('$$sr_treat_term/2_$aux3'/2,272,static,private,built_in,[ load_cut_level(2), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(2)), call_c('SR_Is_Bit_Set_1',[boolean],[x(1)]), proceed, label(1), trust_me_else_fail, proceed]). predicate('$$sr_treat_term/2_$aux2'/4,272,static,private,built_in,[ load_cut_level(4), try_me_else(1), get_variable(x(5),2), call_c('SR_Is_Bit_Set_1',[boolean],[x(0)]), cut(x(4)), put_structure('$sr_exec_directive'/2,0), unify_local_value(x(1)), unify_local_value(x(5)), put_structure('$sr_error_from_exception'/2,2), unify_local_value(x(3)), unify_local_value(x(5)), put_value(x(3),1), put_atom(any,3), put_integer(0,4), put_atom(false,5), execute('$catch'/6), label(1), trust_me_else_fail, proceed]). predicate('$$sr_treat_term/2_$aux1'/2,264,static,private,built_in,[ load_cut_level(2), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(2)), get_atom(sr_ok,1), proceed, label(1), trust_me_else_fail, get_structure(sr_error/2,1), unify_atom(warning), unify_local_value(x(0)), proceed]). predicate('$sr_exec_directive'/2,297,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(1), get_variable(y(0),2), call('$sr_directive1'/2), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, get_structure(sr_error/2,1), unify_atom(warning), unify_atom('directive failed'), proceed]). predicate('$sr_directive1'/2,307,static,private,built_in,[ switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(include/1,3),(op/3,5),(set_prolog_flag/2,7),(char_conversion/2,9),(module/1,11),(body/1,13),(end_module/1,15),(end_body/1,17)]), label(2), try_me_else(4), label(3), get_atom(sr_ok,1), get_structure(include/1,0), unify_variable(x(0)), execute('$sr_open_new_prolog_file'/1), label(4), retry_me_else(6), label(5), allocate(5), get_structure(op/3,0), unify_variable(y(0)), unify_variable(y(1)), unify_variable(y(2)), get_atom(sr_ok,1), put_value(y(1),0), put_value(y(2),1), put_variable(y(3),2), put_variable(y(4),3), call('$$sr_directive1/2_$aux1'/4), put_integer(0,0), put_value(y(0),1), put_value(y(1),2), put_value(y(2),3), put_unsafe_value(y(3),4), put_unsafe_value(y(4),5), put_value(y(2),6), deallocate, call_c('SR_Add_Directive_7',[],[x(0),x(1),x(2),x(3),x(4),x(5),x(6)]), proceed, label(6), retry_me_else(8), label(7), allocate(3), get_structure(set_prolog_flag/2,0), unify_variable(y(0)), unify_variable(y(1)), get_atom(sr_ok,1), put_value(y(0),0), put_variable(y(2),1), call('$$sr_directive1/2_$aux2'/2), put_integer(1,0), put_value(y(0),1), put_value(y(1),2), put_integer(0,3), put_value(y(0),4), put_unsafe_value(y(2),5), put_integer(0,6), deallocate, call_c('SR_Add_Directive_7',[],[x(0),x(1),x(2),x(3),x(4),x(5),x(6)]), proceed, label(8), retry_me_else(10), label(9), allocate(3), get_structure(char_conversion/2,0), unify_variable(y(0)), unify_variable(y(1)), get_atom(sr_ok,1), put_value(y(0),0), put_variable(y(2),1), call('$$sr_directive1/2_$aux3'/2), put_integer(2,0), put_value(y(0),1), put_value(y(1),2), put_integer(0,3), put_value(y(0),4), put_unsafe_value(y(2),5), put_integer(0,6), deallocate, call_c('SR_Add_Directive_7',[],[x(0),x(1),x(2),x(3),x(4),x(5),x(6)]), proceed, label(10), retry_me_else(12), label(11), get_structure(module/1,0), unify_variable(x(0)), put_value(x(1),2), put_atom(true,1), execute('$sr_start_module'/3), label(12), retry_me_else(14), label(13), get_structure(body/1,0), unify_variable(x(0)), put_value(x(1),2), put_atom(false,1), execute('$sr_start_module'/3), label(14), retry_me_else(16), label(15), get_structure(end_module/1,0), unify_variable(x(0)), put_value(x(1),2), put_atom(true,1), execute('$sr_stop_module'/3), label(16), trust_me_else_fail, label(17), get_structure(end_body/1,0), unify_variable(x(0)), put_value(x(1),2), put_atom(false,1), execute('$sr_stop_module'/3)]). predicate('$$sr_directive1/2_$aux3'/2,333,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(1), get_variable(y(0),2), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), call(current_char_conversion/2), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, get_value(x(0),1), proceed]). predicate('$$sr_directive1/2_$aux2'/2,324,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(1), get_variable(y(0),2), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), call(current_prolog_flag/2), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, proceed]). predicate('$$sr_directive1/2_$aux1'/4,310,static,private,built_in,[ load_cut_level(4), try_me_else(1), allocate(5), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), get_variable(y(3),4), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), put_value(y(0),1), call_c('Blt_Non_Var',[fast_call,boolean],[x(1)]), put_variable(y(4),1), call('$sr_op_type'/2), put_value(y(1),0), put_value(y(2),1), put_value(y(0),2), call(current_op/3), put_value(y(2),0), put_value(y(4),1), call('$sr_op_type'/2), cut(y(3)), deallocate, proceed, label(1), trust_me_else_fail, get_integer(0,2), get_value(x(0),3), proceed]). predicate('$sr_op_type'/2,357,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(fx,3),(fy,5),(xfx,7),(yfx,9),(xfy,11),(xf,13),(yf,15)]), label(2), try_me_else(4), label(3), get_atom(fx,0), get_atom(prefix,1), proceed, label(4), retry_me_else(6), label(5), get_atom(fy,0), get_atom(prefix,1), proceed, label(6), retry_me_else(8), label(7), get_atom(xfx,0), get_atom(infix,1), proceed, label(8), retry_me_else(10), label(9), get_atom(yfx,0), get_atom(infix,1), proceed, label(10), retry_me_else(12), label(11), get_atom(xfy,0), get_atom(infix,1), proceed, label(12), retry_me_else(14), label(13), get_atom(xf,0), get_atom(postfix,1), proceed, label(14), trust_me_else_fail, label(15), get_atom(yf,0), get_atom(postfix,1), proceed]). predicate('$sr_start_module'/3,368,static,private,built_in,[ get_variable(x(3),0), put_variable(x(0),4), call_c('SR_Start_Module_3',[],[x(3),x(1),x(4)]), put_value(x(2),1), execute('$$sr_start_module/3_$aux1'/2)]). predicate('$$sr_start_module/3_$aux1'/2,368,static,private,built_in,[ load_cut_level(2), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(2)), get_atom(sr_ok,1), proceed, label(1), trust_me_else_fail, get_structure(sr_error/2,1), unify_atom(warning), unify_local_value(x(0)), proceed]). predicate('$sr_stop_module'/3,377,static,private,built_in,[ get_variable(x(3),0), put_variable(x(0),4), call_c('SR_Stop_Module_3',[],[x(3),x(1),x(4)]), put_value(x(2),1), execute('$$sr_stop_module/3_$aux1'/2)]). predicate('$$sr_stop_module/3_$aux1'/2,377,static,private,built_in,[ load_cut_level(2), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(2)), get_atom(sr_ok,1), proceed, label(1), trust_me_else_fail, get_structure(sr_error/2,1), unify_atom(warning), unify_local_value(x(0)), proceed]). predicate(sr_current_descriptor/1,386,static,private,built_in,[ put_atom(sr_current_descriptor,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('SR_Current_Descriptor_1',[boolean],[x(0)]), proceed]). predicate('$sr_current_descriptor_alt'/0,393,static,private,built_in,[ call_c('SR_Current_Descriptor_Alt_0',[boolean],[]), proceed]). predicate(sr_get_stream/2,399,static,private,built_in,[ allocate(2), get_variable(y(0),0), put_atom(sr_get_stream,0), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(0),x(2)]), put_value(x(1),0), put_variable(y(1),1), call('$check_stream_or_var'/2), put_value(y(0),0), put_unsafe_value(y(1),1), deallocate, call_c('SR_Get_Stm_2',[boolean],[x(0),x(1)]), proceed]). predicate(sr_get_module/3,407,static,private,built_in,[ put_atom(sr_get_module,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('SR_Get_Module_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(sr_get_file_name/2,414,static,private,built_in,[ put_atom(sr_get_file_name,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('SR_Get_File_Name_2',[boolean],[x(0),x(1)]), proceed]). predicate(sr_get_position/3,421,static,private,built_in,[ put_atom(sr_get_position,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('SR_Get_Position_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(sr_get_include_list/2,428,static,private,built_in,[ put_atom(sr_get_include_list,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('SR_Get_Include_List_2',[boolean],[x(0),x(1)]), proceed]). predicate(sr_get_include_stream_list/2,435,static,private,built_in,[ put_atom(sr_get_include_stream_list,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('SR_Get_Include_Stream_List_2',[boolean],[x(0),x(1)]), proceed]). predicate(sr_get_size_counters/3,442,static,private,built_in,[ put_atom(sr_get_size_counters,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('SR_Get_Size_Counters_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(sr_get_error_counters/3,449,static,private,built_in,[ put_atom(sr_get_error_counters,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('SR_Get_Error_Counters_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(sr_set_error_counters/3,456,static,private,built_in,[ put_atom(sr_set_error_counters,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('SR_Set_Error_Counters_3',[],[x(0),x(1),x(2)]), proceed]). predicate(sr_write_message/4,463,static,private,built_in,[ put_atom(sr_write_message,4), put_integer(4,5), call_c('Set_Bip_Name_2',[],[x(4),x(5)]), call_c('SR_Write_Message_4',[],[x(0),x(1),x(2),x(3)]), proceed]). predicate(sr_write_message/6,470,static,private,built_in,[ put_atom(sr_write_message,6), put_integer(6,7), call_c('Set_Bip_Name_2',[],[x(6),x(7)]), call_c('SR_Write_Message_6',[],[x(0),x(1),x(2),x(3),x(4),x(5)]), proceed]). predicate(sr_write_message/8,477,static,private,built_in,[ put_atom(sr_write_message,8), put_integer(8,9), call_c('Set_Bip_Name_2',[],[x(8),x(9)]), call_c('SR_Write_Message_8',[],[x(0),x(1),x(2),x(3),x(4),x(5),x(6),x(7)]), proceed]). predicate(sr_write_error/2,484,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(7), get_variable(y(0),0), get_variable(y(1),2), put_atom(sr_write_error,0), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(0),x(2)]), put_value(x(1),0), put_variable(y(2),1), put_variable(y(3),2), put_variable(y(4),3), put_variable(y(5),4), put_variable(y(6),5), call('$sr_get_format_args_error'/6), put_value(y(2),0), put_value(y(0),1), put_value(y(4),2), put_value(y(5),3), put_value(y(6),4), put_value(y(3),5), call('$sr_write_error/2_$aux1'/6), cut(y(1)), deallocate, proceed, label(1), trust_me_else_fail, proceed]). predicate('$sr_write_error/2_$aux1'/6,484,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), call_c('SR_Write_Message_4',[],[x(1),x(2),x(3),x(4)]), proceed, label(1), trust_me_else_fail, call_c('SR_Write_Message_6',[],[x(1),x(0),x(5),x(2),x(3),x(4)]), proceed]). predicate(sr_write_error/4,498,static,private,built_in,[ load_cut_level(4), try_me_else(1), allocate(9), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),4), put_atom(sr_write_error,0), put_integer(4,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(x(3),0), put_variable(y(4),1), put_variable(y(5),2), put_variable(y(6),3), put_variable(y(7),4), put_variable(y(8),5), call('$sr_get_format_args_error'/6), put_value(y(1),0), put_value(y(4),1), put_value(y(2),2), put_value(y(5),3), call('$sr_write_error/4_$aux1'/4), put_value(y(0),0), put_unsafe_value(y(4),1), put_unsafe_value(y(5),2), put_unsafe_value(y(6),3), put_unsafe_value(y(7),4), put_unsafe_value(y(8),5), call_c('SR_Write_Message_6',[],[x(0),x(1),x(2),x(3),x(4),x(5)]), cut(y(3)), deallocate, proceed, label(1), trust_me_else_fail, proceed]). predicate('$sr_write_error/4_$aux1'/4,498,static,private,built_in,[ try_me_else(1), get_value(x(1),0), get_value(x(3),2), proceed, label(1), trust_me_else_fail, proceed]). predicate(sr_write_error/6,509,static,private,built_in,[ load_cut_level(6), try_me_else(1), allocate(11), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), get_variable(y(5),6), put_atom(sr_write_error,0), put_integer(6,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(x(5),0), put_variable(y(6),1), put_variable(y(7),2), put_variable(y(8),3), put_variable(y(9),4), put_variable(y(10),5), call('$sr_get_format_args_error'/6), put_value(y(3),0), put_value(y(6),1), put_value(y(4),2), put_value(y(7),3), call('$sr_write_error/6_$aux1'/4), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_unsafe_value(y(6),3), put_unsafe_value(y(7),4), put_unsafe_value(y(8),5), put_unsafe_value(y(9),6), put_unsafe_value(y(10),7), call_c('SR_Write_Message_8',[],[x(0),x(1),x(2),x(3),x(4),x(5),x(6),x(7)]), cut(y(5)), deallocate, proceed, label(1), trust_me_else_fail, proceed]). predicate('$sr_write_error/6_$aux1'/4,509,static,private,built_in,[ try_me_else(1), get_value(x(1),0), get_value(x(3),2), proceed, label(1), trust_me_else_fail, proceed]). predicate('$sr_get_format_args_error'/6,521,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), execute('$pl_err_instantiation'/0), label(1), trust_me_else_fail, get_structure(sr_error/2,0), unify_local_value(x(3)), unify_variable(x(0)), put_value(x(4),3), put_value(x(5),4), execute('$sr_simpl_error'/5)]). predicate('$sr_simpl_error'/5,532,static,private,built_in,[ load_cut_level(5), try_me_else(8), switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(syntax/3,3),(existence_error/2,5),(permission_error/3,7)]), label(2), try_me_else(4), label(3), get_structure(syntax/3,0), unify_local_value(x(1)), unify_variable(x(1)), unify_variable(x(0)), cut(x(5)), put_atom(is,5), put_integer(2,6), call_c('Set_Bip_Name_2',[],[x(5),x(6)]), math_load_value(x(1),1), call_c('Fct_Neg',[fast_call,x(1)],[x(1)]), get_value(x(2),1), get_atom('~a~n',3), get_list(4), unify_value(x(0)), unify_nil, proceed, label(4), retry_me_else(6), label(5), get_structure(existence_error/2,0), unify_atom(source_sink), unify_variable(x(0)), cut(x(5)), get_atom('cannot open file ~a - does not exist~n',3), get_list(4), unify_value(x(0)), unify_nil, proceed, label(6), trust_me_else_fail, label(7), get_structure(permission_error/3,0), unify_atom(open), unify_atom(source_sink), unify_variable(x(0)), cut(x(5)), get_atom('cannot open file ~a - permission error~n',3), get_list(4), unify_value(x(0)), unify_nil, proceed, label(8), trust_me_else_fail, get_atom('~w~n',3), get_list(4), unify_local_value(x(0)), unify_nil, proceed]). predicate(sr_error_from_exception/2,555,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(sr_error_from_exception,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(0),0), call('$sr_error_from_exception/2_$aux1'/1), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$sr_error_from_exception'/2)]). predicate('$sr_error_from_exception/2_$aux1'/1,555,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$pl_err_instantiation'/0), label(1), trust_me_else_fail, proceed]). predicate('$sr_error_from_exception'/2,564,static,private,built_in,[ load_cut_level(2), try_me_else(7), switch_on_term(3,fail,fail,fail,1), label(1), switch_on_structure([(error/2,2)]), label(2), try(4), trust(6), label(3), try_me_else(5), label(4), allocate(4), get_structure(error/2,0), unify_variable(x(0)), unify_void(1), get_structure(syntax_error/1,0), unify_void(1), get_variable(y(0),1), cut(x(2)), put_void(0), put_variable(y(1),1), put_variable(y(2),2), put_variable(y(3),3), call(syntax_error_info/4), put_value(y(0),0), get_structure(sr_error/2,0), unify_atom(error), unify_structure(syntax/3), unify_local_value(y(1)), unify_local_value(y(2)), unify_local_value(y(3)), deallocate, proceed, label(5), trust_me_else_fail, label(6), get_structure(error/2,0), unify_variable(x(0)), unify_void(1), get_structure(sr_error/2,1), unify_atom(error), unify_value(x(0)), cut(x(2)), proceed, label(7), trust_me_else_fail, get_structure(sr_error/2,1), unify_atom(exception), unify_local_value(x(0)), proceed]). ./gprolog-1.3.0/src/BipsPl/stream_supp.c0000644004425400513100000014122210547154140016462 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : stream_supp.c * * Descr.: stream support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: stream_supp.c,v 1.20 2007/01/04 10:35:12 diaz Exp $ */ #include #include #include #include #include #include #include #ifdef clearerr /* prevent the case clearerr is (also) a macro */ #undef clearerr extern void clearerr(FILE *stream); #endif #if defined(FOR_EXTERNAL_USE) && defined(W32_GUI_CONSOLE) #undef W32_GUI_CONSOLE #endif #define STREAM_SUPP_FILE #include "engine_pl.h" #include "bips_pl.h" #ifndef NO_USE_LINEDIT #include "linedit.h" #endif #ifdef _WIN32 #include #else #include #endif /*---------------------------------* * Constants * *---------------------------------*/ #define START_ALIAS_TBL_SIZE 128 #define STR_STREAM_WRITE_BLOCK 1024 #define TTY_BUFFER_SIZE 1024 #define BIG_BUFFER 2048 /* Error Messages */ #define ERR_TELL_OR_SEEK_UNDEFINED "fct tell or seek undefined\n" /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static void Init_Stream_Supp(); void (*init_stream_supp)() = Init_Stream_Supp; /* overwrite var of engine.c */ static int atom_constant_term_stream; static WamWord stream_1; static WamWord word_current_input_stream; static WamWord word_current_output_stream; static StrSInf static_str_stream_rd = { NULL, NULL, 0 }; /* input */ static StrSInf static_str_stream_wr = { NULL, NULL, 0 }; /* output */ #ifndef NO_USE_LINEDIT static char tty_first_buff[TTY_BUFFER_SIZE]; /* current buffer (end with '\0') */ static char *tty_buff; static char *tty_ptr = NULL; /* current pointer into the buff */ #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ static int Find_Free_Stream(void); static void Del_Aliases_Of_Stream(int stm); static void Update_Mirrors_To_Del_Stream(int stm); static Bool Remove_In_Stream_List(int stm, StmLst **p_start); #ifndef NO_USE_LINEDIT static int TTY_Getc(void); static int TTY_Get_Key(Bool echo, Bool catch_ctrl_c); static void TTY_Clearerr(void); #endif static int Basic_Call_Fct_Getc(StmInf *pstm); static void Basic_Call_Fct_Putc(int c, StmInf *pstm); static int Str_Stream_Getc(StrSInf *str_stream); static void Str_Stream_Putc(int c, StrSInf *str_stream); /*-------------------------------------------------------------------------* * INIT_STREAM_SUPP * * * * no declared as other initializers, since we must be sure it has been * * initialized before others. * *-------------------------------------------------------------------------*/ static void Init_Stream_Supp(void) { #ifndef NO_USE_LINEDIT StmInf *pstm; #endif stm_tbl_size = 32; stm_tbl = (StmInf **) Calloc(stm_tbl_size, sizeof(StmInf *)); stm_last_used = -1; alias_tbl = Hash_Alloc_Table(START_ALIAS_TBL_SIZE, sizeof(AliasInf)); atom_stream = Create_Atom("$stream"); stream_1 = Functor_Arity(atom_stream, 1); atom_constant_term_stream = Create_Atom("constant term stream"); word_current_input_stream = Tag_ATM(Create_Atom("current_input_stream")); word_current_output_stream = Tag_ATM(Create_Atom("current_output_stream")); atom_user_input = Create_Atom("user_input"); atom_user_output = Create_Atom("user_output"); atom_top_level_input = Create_Atom("top_level_input"); atom_top_level_output = Create_Atom("top_level_output"); atom_debugger_input = Create_Atom("debugger_input"); atom_debugger_output = Create_Atom("debugger_output"); atom_read = Create_Atom("read"); atom_write = Create_Atom("write"); atom_append = Create_Atom("append"); atom_reposition = Create_Atom("reposition"); atom_stream_position = Create_Atom("$stream_position"); atom_text = Create_Atom("text"); atom_binary = Create_Atom("binary"); atom_error = Create_Atom("error"); atom_eof_code = Create_Atom("eof_code"); atom_reset = Create_Atom("reset"); atom_none = Create_Atom("none"); atom_line = Create_Atom("line"); atom_block = Create_Atom("block"); atom_not = Create_Atom("not"); atom_at = Create_Atom("at"); atom_past = Create_Atom("past"); atom_bof = Create_Atom("bof"); atom_current = Create_Atom("current"); atom_eof = Create_Atom("eof"); le_prompt = ""; use_le_prompt = TRUE; stm_stdin = Add_Stream_For_Stdio_Desc(stdin, atom_user_input, STREAM_MODE_READ, TRUE); #ifndef NO_USE_LINEDIT if ((use_gui) || isatty(0)) { pstm = stm_tbl[stm_stdin]; pstm->fct_getc = (StmFct) TTY_Getc; pstm->fct_putc = STREAM_FCT_UNDEFINED; pstm->fct_flush = STREAM_FCT_UNDEFINED; pstm->fct_close = STREAM_FCT_UNDEFINED; pstm->fct_tell = STREAM_FCT_UNDEFINED; pstm->fct_seek = STREAM_FCT_UNDEFINED; pstm->fct_clearerr = (StmFct) TTY_Clearerr; } #endif Add_Alias_To_Stream(atom_user_input, stm_stdin); stm_input = stm_stdin; stm_stdout = Add_Stream_For_Stdio_Desc(stdout, atom_user_output, STREAM_MODE_WRITE, TRUE); #if !defined(NO_USE_LINEDIT) && defined(_WIN32) /* ok for both GUI and console EOM<->ANSI conversion */ pstm = stm_tbl[stm_stdout]; pstm->prop.buffering = STREAM_BUFFERING_LINE; if (le_hook_put_char && isatty(1)) pstm->fct_putc = (StmFct) le_hook_put_char; if (le_hook_flush && isatty(1)) pstm->fct_flush = (StmFct) le_hook_flush; #endif Add_Alias_To_Stream(atom_user_output, stm_stdout); stm_output = stm_stdout; stm_top_level_input = stm_debugger_input = stm_input; stm_top_level_output = stm_debugger_output = stm_output; Add_Alias_To_Stream(atom_top_level_input, stm_top_level_input); Add_Alias_To_Stream(atom_top_level_output, stm_top_level_output); Add_Alias_To_Stream(atom_debugger_input, stm_debugger_input); Add_Alias_To_Stream(atom_debugger_output, stm_debugger_output); } #ifndef FOR_EXTERNAL_USE /*-------------------------------------------------------------------------* * PROP_AND_STDIO_MODE * * * *-------------------------------------------------------------------------*/ StmProp Prop_And_Stdio_Mode(int mode, Bool text, char *open_str) { StmProp prop; prop.mode = mode; switch(mode) { case STREAM_MODE_READ: prop.input = TRUE; prop.output = FALSE; *open_str++ = 'r'; break; case STREAM_MODE_WRITE: prop.input = FALSE; prop.output = TRUE; *open_str++ = 'w'; break; case STREAM_MODE_APPEND: prop.input = FALSE; prop.output = TRUE; *open_str++ = 'a'; } prop.text = text; prop.reposition = TRUE; prop.eof_action = STREAM_EOF_ACTION_EOF_CODE; prop.buffering = STREAM_BUFFERING_BLOCK; prop.special_close = FALSE; prop.other = 0; *open_str++ = (text) ? 't' : 'b'; *open_str = '\0'; return prop; } /*-------------------------------------------------------------------------* * ADD_STREAM_FOR_STDIO_DESC * * * *-------------------------------------------------------------------------*/ int Add_Stream_For_Stdio_Desc(FILE *f, int atom_path, int mode, int text) { char open_str[10]; StmProp prop = Prop_And_Stdio_Mode(mode, text, open_str); prop.reposition = Stdio_Is_Repositionable(f); prop.buffering = (prop.reposition) ? STREAM_BUFFERING_BLOCK : STREAM_BUFFERING_LINE; Stdio_Set_Buffering(f, prop.buffering); if (isatty(fileno(f))) prop.eof_action = STREAM_EOF_ACTION_RESET; return Add_Stream(atom_path, (long) f, prop, NULL, NULL, NULL, NULL, NULL, NULL, NULL); } /*-------------------------------------------------------------------------* * ADD_STREAM_FOR_STDIO_FILE * * * *-------------------------------------------------------------------------*/ int Add_Stream_For_Stdio_File(char *path, int mode, Bool text) { FILE *f; char open_str[10]; int atom_path; Prop_And_Stdio_Mode(mode, text, open_str); /* only for open_str */ if ((f = fopen(path, open_str)) == NULL) return -1; atom_path = Create_Allocate_Atom(path); return Add_Stream_For_Stdio_Desc(f, atom_path, mode, text); } #endif /* !FOR_EXTERNAL_USE */ /*-------------------------------------------------------------------------* * INIT_STREAM_STRUCT * * * *-------------------------------------------------------------------------*/ static void Init_Stream_Struct(int atom_file_name, long file, StmProp prop, StmFct fct_getc, StmFct fct_putc, StmFct fct_flush, StmFct fct_close, StmFct fct_tell, StmFct fct_seek, StmFct fct_clearerr, StmInf *pstm) { pstm->atom_file_name = atom_file_name; pstm->file = file; pstm->prop = prop; pstm->mirror = NULL; pstm->mirror_of = NULL; #define INIT_FCT(f, d) pstm->f = (f) ? f : (StmFct) d INIT_FCT(fct_getc, fgetc); INIT_FCT(fct_putc, fputc); INIT_FCT(fct_flush, fflush); INIT_FCT(fct_close, fclose); INIT_FCT(fct_tell, ftell); INIT_FCT(fct_seek, fseek); INIT_FCT(fct_clearerr, clearerr); /* Works only because putc will be called with c as 1st arg and flush's arg is ignored */ pstm->eof_reached = FALSE; PB_Init(pstm->pb_char); pstm->char_count = 0; pstm->line_count = 0; pstm->line_pos = 0; PB_Init(pstm->pb_line_pos); } /*-------------------------------------------------------------------------* * ADD_STREAM * * * *-------------------------------------------------------------------------*/ int Add_Stream(int atom_file_name, long file, StmProp prop, StmFct fct_getc, StmFct fct_putc, StmFct fct_flush, StmFct fct_close, StmFct fct_tell, StmFct fct_seek, StmFct fct_clearerr) { int stm; StmInf *pstm; stm = Find_Free_Stream(); if (prop.reposition && (fct_tell == STREAM_FCT_UNDEFINED || fct_seek == STREAM_FCT_UNDEFINED)) Fatal_Error(ERR_TELL_OR_SEEK_UNDEFINED); pstm = stm_tbl[stm]; Init_Stream_Struct(atom_file_name, file, prop, fct_getc, fct_putc, fct_flush, fct_close, fct_tell, fct_seek, fct_clearerr, pstm); return stm; } /*-------------------------------------------------------------------------* * REMOVE_STREAM * * * *-------------------------------------------------------------------------*/ void Delete_Stream(int stm) { Del_Aliases_Of_Stream(stm); Update_Mirrors_To_Del_Stream(stm); Free(stm_tbl[stm]); stm_tbl[stm] = NULL; while(stm_tbl[stm_last_used] == NULL) stm_last_used--; } /*-------------------------------------------------------------------------* * FIND_FREE_STREAM * * * *-------------------------------------------------------------------------*/ static int Find_Free_Stream(void) { int stm; for (stm = 0; stm < stm_tbl_size; stm++) if (stm_tbl[stm] == NULL) break; if (stm == stm_tbl_size) Extend_Array((char **) &stm_tbl, &stm_tbl_size, sizeof(StmInf *), TRUE); stm_tbl[stm] = (StmInf *) Malloc(sizeof(StmInf)); if (stm > stm_last_used) stm_last_used = stm; return stm; } /*-------------------------------------------------------------------------* * FIND_STREAM_BY_ALIAS * * * *-------------------------------------------------------------------------*/ int Find_Stream_By_Alias(int atom_alias) { AliasInf *alias; alias = (AliasInf *) Hash_Find(alias_tbl, atom_alias); return (alias == NULL) ? -1 : alias->stm; } /*-------------------------------------------------------------------------* * ADD_ALIAS_TO_STREAM * * * *-------------------------------------------------------------------------*/ Bool Add_Alias_To_Stream(int atom_alias, int stm) { AliasInf *alias; AliasInf alias_info; alias = (AliasInf *) Hash_Find(alias_tbl, atom_alias); if (alias != NULL) return alias->stm == stm; /* fail if assigned to another stream */ Extend_Table_If_Needed(&alias_tbl); alias_info.atom = atom_alias; alias_info.stm = stm; alias = (AliasInf *) Hash_Insert(alias_tbl, (char *) &alias_info, FALSE); return TRUE; } /*-------------------------------------------------------------------------* * REASSIGN_ALIAS * * * *-------------------------------------------------------------------------*/ void Reassign_Alias(int atom_alias, int stm) { AliasInf *alias; alias = (AliasInf *) Hash_Find(alias_tbl, atom_alias); if (alias != NULL) alias->stm = stm; } /*-------------------------------------------------------------------------* * DEL_ALIASES_OF_STREAM * * * *-------------------------------------------------------------------------*/ void Del_Aliases_Of_Stream(int stm) { HashScan scan; AliasInf *alias; for (alias = (AliasInf *) Hash_First(alias_tbl, &scan); alias; alias = (AliasInf *) Hash_Next(&scan)) if (alias->stm == stm) Hash_Delete(alias_tbl, alias->atom); } /*-------------------------------------------------------------------------* * ADD_MIRROR_TO_STREAM * * * *-------------------------------------------------------------------------*/ void Add_Mirror_To_Stream(int stm, int m_stm) { StmInf *pstm = stm_tbl[stm]; StmInf *m_pstm = stm_tbl[m_stm]; StmLst *m; if (stm == m_stm) return; for(m = pstm->mirror; m ; m = m->next) if (m->stm == m_stm) /* already present */ return; m = (StmLst *) Malloc(sizeof(StmLst)); m->stm = m_stm; m->next = pstm->mirror; pstm->mirror = m; m = (StmLst *) Malloc(sizeof(StmLst)); m->stm = stm; m->next = m_pstm->mirror_of; m_pstm->mirror_of = m; } /*-------------------------------------------------------------------------* * DEL_MIRROR_FROM_STREAM * * * *-------------------------------------------------------------------------*/ Bool Del_Mirror_From_Stream(int stm, int m_stm) { StmInf *pstm = stm_tbl[stm]; StmInf *m_pstm = stm_tbl[m_stm]; if (!Remove_In_Stream_List(m_stm, &pstm->mirror)) return FALSE; /* not found */ Remove_In_Stream_List(stm, &m_pstm->mirror_of); return TRUE; } /*-------------------------------------------------------------------------* * UPDATE_MIRRORS_TO_DEL_STREAM * * * *-------------------------------------------------------------------------*/ static void Update_Mirrors_To_Del_Stream(int stm) { StmInf *pstm = stm_tbl[stm]; StmInf *m_pstm; StmLst *m, *m1; m = pstm->mirror; while(m) { m1 = m; m_pstm = stm_tbl[m->stm]; m = m->next; Free(m1); Remove_In_Stream_List(stm, &m_pstm->mirror_of); } m = pstm->mirror_of; while(m) { m1 = m; m_pstm = stm_tbl[m->stm]; m = m->next; Free(m1); Remove_In_Stream_List(stm, &m_pstm->mirror); } } /*-------------------------------------------------------------------------* * REMOVE_IN_STREAM_LIST * * * *-------------------------------------------------------------------------*/ static Bool Remove_In_Stream_List(int stm, StmLst **p_start) { StmLst *m; for(;;) { m = *p_start; if (m == NULL) break; if (m->stm == stm) /* found */ { *p_start = m->next; Free(m); return TRUE; } p_start = &m->next; } return FALSE; /* not found */ } /*-------------------------------------------------------------------------* * FIND_STREAM_FROM_PSTM * * * *-------------------------------------------------------------------------*/ int Find_Stream_From_PStm(StmInf *pstm) { int stm; for (stm = 0; stm <= stm_last_used; stm++) if (stm_tbl[stm] == pstm) return stm; return -1; } /*-------------------------------------------------------------------------* * FLUSH_ALL_STREAMS * * * *-------------------------------------------------------------------------*/ void Flush_All_Streams(void) { int stm; for (stm = 0; stm <= stm_last_used ; stm++) if (stm_tbl[stm]) Stream_Flush(stm_tbl[stm]); } /*-------------------------------------------------------------------------* * SET_STREAM_BUFFERING * * * *-------------------------------------------------------------------------*/ void Set_Stream_Buffering(int stm) { StmInf *pstm = stm_tbl[stm]; FILE *f; f = Stdio_Desc_Of_Stream(stm); if (f == NULL) { pstm->prop.buffering = STREAM_BUFFERING_NONE; return; } #ifndef NO_USE_LINEDIT /* if use_gui == 1 */ if (pstm->file == (long) stdout && le_hook_set_line_buffering) (*le_hook_set_line_buffering)(pstm->prop.buffering != STREAM_BUFFERING_NONE); else #endif Stdio_Set_Buffering(f, pstm->prop.buffering); } #ifndef FOR_EXTERNAL_USE /*-------------------------------------------------------------------------* * GET_STREAM_OR_ALIAS * * * * return the associated stm or -1 if not exist (test==STREAM_CHECK_VALID) * *-------------------------------------------------------------------------*/ int Get_Stream_Or_Alias(WamWord sora_word, int test) { WamWord word, tag_mask, tag_mask1; int atom; WamWord *stc_adr; int stm = 0; /* only for the compiler */ int perm_oper; DEREF(sora_word, word, tag_mask); if (tag_mask == TAG_ATM_MASK) /* alias ? */ { atom = UnTag_ATM(word); stm = Find_Stream_By_Alias(atom); goto next_test; } if (tag_mask == TAG_STC_MASK) /* stream ? */ { stc_adr = UnTag_STC(word); DEREF(Arg(stc_adr, 0), word, tag_mask1); stm = UnTag_INT(word); if (Functor_And_Arity(stc_adr) == stream_1 && tag_mask1 == TAG_INT_MASK) goto next_test; } if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); Pl_Err_Domain(domain_stream_or_alias, sora_word); next_test: if ((unsigned) stm > stm_last_used || stm_tbl[stm] == NULL) { if (test == STREAM_CHECK_VALID) return -1; Pl_Err_Existence(existence_stream, sora_word); } if (test == STREAM_CHECK_VALID || test == STREAM_CHECK_EXIST) goto ok; if (test == STREAM_CHECK_INPUT) { if (stm_tbl[stm]->prop.input) goto ok; perm_oper = permission_operation_input; } else /* test == STREAM_CHECK_OUTPUT */ { if (stm_tbl[stm]->prop.output) goto ok; perm_oper = permission_operation_output; } Pl_Err_Permission(perm_oper, permission_type_stream, sora_word); ok: return stm; } /*-------------------------------------------------------------------------* * CHECK_STREAM_TYPE * * * *-------------------------------------------------------------------------*/ void Check_Stream_Type(int stm, Bool check_text, Bool for_input) { int perm_oper; int perm_type; WamWord sora_word; if (check_text) { if (stm_tbl[stm]->prop.text) return; perm_type = permission_type_binary_stream; } else /* check binary */ { if (!stm_tbl[stm]->prop.text) return; perm_type = permission_type_text_stream; } /* here there is an error */ if (for_input) { perm_oper = permission_operation_input; sora_word = (last_input_sora == NOT_A_WAM_WORD) ? word_current_input_stream : last_input_sora; } else /* for output */ { perm_oper = permission_operation_output; sora_word = (last_output_sora == NOT_A_WAM_WORD) ? word_current_output_stream : last_output_sora; } Pl_Err_Permission(perm_oper, perm_type, sora_word); } #endif /* !FOR_EXTERNAL_USE */ /*-------------------------------------------------------------------------* * MAKE_STREAM_TAGGED_WORD * * * *-------------------------------------------------------------------------*/ WamWord Make_Stream_Tagged_Word(int stm) { static WamWord h[2]; h[0] = stream_1; h[1] = Tag_INT(stm); return Tag_STC(h); } /*-------------------------------------------------------------------------* * STDIO_IS_REPOSITIONABLE * * * *-------------------------------------------------------------------------*/ Bool Stdio_Is_Repositionable(FILE *f) { int fd = fileno(f); return !isatty(fd) && lseek(fd, 0, SEEK_CUR) >= 0; } /*-------------------------------------------------------------------------* * STDIO_SET_BUFFERING * * * *-------------------------------------------------------------------------*/ void Stdio_Set_Buffering(FILE *f, int buffering) { int buff_flag; switch (buffering) { case STREAM_BUFFERING_NONE: buff_flag = _IONBF; break; case STREAM_BUFFERING_LINE: buff_flag = _IOLBF; #ifdef _WIN32 if (!use_gui) /* in Win32 console app, line buff = full */ buff_flag = _IONBF; /* I prefer no buffering */ #endif break; case STREAM_BUFFERING_BLOCK: buff_flag = _IOFBF; break; } setvbuf(f, NULL, buff_flag, BUFSIZ); } /*-------------------------------------------------------------------------* * STDIO_DESC_OF_STREAM * * * * return a FILE * of a stream or NULL if it is not a stdio stream. * *-------------------------------------------------------------------------*/ FILE * Stdio_Desc_Of_Stream(int stm) { StmInf *pstm = stm_tbl[stm]; if (stm == stm_stdin) /* works also for stdin with linedit */ return stdin; if (pstm->fct_getc == (StmFct) fgetc) return (FILE *) (pstm->file); return NULL; } /*-------------------------------------------------------------------------* * IO_FILENO_OF_STREAM * * * * return the fileno of a stream or -1 if this stream has not a fileno. * *-------------------------------------------------------------------------*/ int Io_Fileno_Of_Stream(int stm) { FILE *f; f = Stdio_Desc_Of_Stream(stm); if (f) return fileno(f); return -1; } /*-------------------------------------------------------------------------* * The following functions replaces standard fgetc/... on stdin if a TTY. * * It uses linedit to provide a more comfortable interface. * * These functions should not be used directly but via the common interface* * provided by the Stream_Getc/... functions (see below). * *-------------------------------------------------------------------------*/ #ifndef NO_USE_LINEDIT #define SAVE_FOR_REENTRANCY \ { \ int save_sys_var_option_mask = SYS_VAR_OPTION_MASK; \ int save_last_read_line = last_read_line; \ int save_last_read_col = last_read_col; #define RESTORE_FOR_REENTRANCY \ SYS_VAR_OPTION_MASK = save_sys_var_option_mask; \ last_read_line = save_last_read_line; \ last_read_col = save_last_read_col; \ } /*-------------------------------------------------------------------------* * TTY_GETC * * * * we must take care to reentrancy: e.g. top_level calls TTY_Getc which * * calls LE_FGets + Ctrl_C + b(reak) + new top_level + TTY_Getc... * *-------------------------------------------------------------------------*/ static int TTY_Getc(void) { int c; StmInf *pstm; static int tty_linedit_depth = 0; if (tty_ptr == NULL) { if (tty_linedit_depth++ == 0) tty_buff = tty_first_buff; else tty_buff = (char *) Malloc(TTY_BUFFER_SIZE); /* tty_ptr must remain NULL for reentrancy */ SAVE_FOR_REENTRANCY; tty_buff = LE_FGets(tty_buff, TTY_BUFFER_SIZE, le_prompt, use_le_prompt); use_le_prompt = 0; RESTORE_FOR_REENTRANCY; tty_linedit_depth--; if (LE_Interrupted_By_Ctrl_C(tty_buff)) Execute_A_Continuation((CodePtr) LE_Get_Ctrl_C_Return_Value()); if (tty_buff == NULL) { c = EOF; goto test_free_buff; } tty_ptr = tty_buff; /* simulate the echo (+ '\n') on output */ pstm = stm_tbl[stm_stdout]; pstm->char_count += strlen(tty_buff); pstm->line_count++; pstm->line_pos = 0; } c = *tty_ptr++; if (*tty_ptr == '\0') { test_free_buff: if (tty_buff != tty_first_buff) Free(tty_buff); tty_ptr = NULL; } return c; } /*-------------------------------------------------------------------------* * TTY_GET_KEY * * * *-------------------------------------------------------------------------*/ static int TTY_Get_Key(Bool echo, Bool catch_ctrl_c) { int c; if (tty_ptr != NULL) { c = *tty_ptr++; if (*tty_ptr == '\0') { if (tty_buff != tty_first_buff) Free(tty_buff); tty_ptr = NULL; } return c; } SAVE_FOR_REENTRANCY; c = LE_Get_Key(echo, catch_ctrl_c); RESTORE_FOR_REENTRANCY; if (LE_Interrupted_By_Ctrl_C(c)) Execute_A_Continuation((CodePtr) LE_Get_Ctrl_C_Return_Value()); return c; } /*-------------------------------------------------------------------------* * TTY_CLEARERR * * * *-------------------------------------------------------------------------*/ static void TTY_Clearerr(void) { clearerr(stdin); } #endif /* NO_USE_LINEDIT */ /*-------------------------------------------------------------------------* * Only the following functions should be used to read/write a stream. * *-------------------------------------------------------------------------*/ #ifdef FOR_EXTERNAL_USE #define Before_Reading(pstm, file) #else #define Before_Reading(pstm, file) \ { \ if (pstm->eof_reached) \ { \ if (pstm->prop.eof_action == STREAM_EOF_ACTION_ERROR) \ Pl_Err_Permission(permission_operation_input, \ permission_type_past_end_of_stream, \ (last_input_sora == NOT_A_WAM_WORD) \ ? word_current_input_stream : last_input_sora); \ \ if (pstm->prop.eof_action == STREAM_EOF_ACTION_EOF_CODE) \ return EOF; \ \ /* here: eof_action == STREAM_EOF_ACTION_RESET */ \ pstm->eof_reached = FALSE; \ if (pstm->prop.reposition) \ Stream_Set_Position(pstm, SEEK_SET, 0, 0, 0, 0); \ if (pstm->fct_clearerr != STREAM_FCT_UNDEFINED) \ (*pstm->fct_clearerr) (file); \ } \ } #endif /* FOR_EXTERNAL_USE */ #define Update_Counters(pstm, c) \ if (c != EOF) \ pstm->char_count++; \ if (c == '\n') \ { \ pstm->line_count++; \ pstm->line_pos = 0; \ } \ else \ pstm->line_pos++ /*-------------------------------------------------------------------------* * BASIC_CALL_FCT_GETC * * * *-------------------------------------------------------------------------*/ static int Basic_Call_Fct_Getc(StmInf *pstm) { int c; StmLst *m; #ifndef NO_USE_PIPED_STDIN_FOR_CONSULT if (SYS_VAR_SAY_GETC && pstm->file == (long) stdin) /* could also test pstm->fct_getc == fgetc */ { putchar(CHAR_TO_EMIT_WHEN_CHAR); fflush(stdout); } #endif c = (*pstm->fct_getc) (pstm->file); if (c != EOF) for (m = pstm->mirror; m ; m = m->next) Stream_Putc(c, stm_tbl[m->stm]); return c; } /*-------------------------------------------------------------------------* * BASIC_CALL_FCT_PUTC * * * *-------------------------------------------------------------------------*/ static void Basic_Call_Fct_Putc(int c, StmInf *pstm) { StmLst *m; (*pstm->fct_putc) (c, pstm->file); for (m = pstm->mirror; m ; m = m->next) Stream_Putc(c, stm_tbl[m->stm]); } /*-------------------------------------------------------------------------* * STREAM_GET_KEY * * * *-------------------------------------------------------------------------*/ int Stream_Get_Key(StmInf *pstm, int echo, int catch_ctrl_c) { int c; long file = pstm->file; Bool simulate; #ifndef NO_USE_LINEDIT if (pstm == stm_tbl[stm_stdin]) /* the stdin stream used with linedit */ simulate = FALSE; else #endif simulate = TRUE; Before_Reading(pstm, file); if (!PB_Is_Empty(pstm->pb_char)) { PB_Pop(pstm->pb_char, c); } else { Start_Protect_Regs_For_Signal; if (simulate) c = Basic_Call_Fct_Getc(pstm); #ifndef NO_USE_LINEDIT else c = TTY_Get_Key(echo, catch_ctrl_c); #endif Stop_Protect_Regs_For_Signal; } if (simulate && c != '\n') { while (Basic_Call_Fct_Getc(pstm) >= ' ') ; Update_Counters(stm_tbl[stm_stdout], '\n'); /* reflect \n */ } if (c == EOF) pstm->eof_reached = TRUE; if (c == '\n') PB_Push(pstm->pb_line_pos, pstm->line_pos); Update_Counters(pstm, c); return c; } /*-------------------------------------------------------------------------* * STREAM_GETC * * * *-------------------------------------------------------------------------*/ int Stream_Getc(StmInf *pstm) { int c; long file = pstm->file; Before_Reading(pstm, file); if (!PB_Is_Empty(pstm->pb_char)) { PB_Pop(pstm->pb_char, c); } else { Start_Protect_Regs_For_Signal; c = Basic_Call_Fct_Getc(pstm); Stop_Protect_Regs_For_Signal; } if (c == EOF) pstm->eof_reached = TRUE; if (c == '\n') PB_Push(pstm->pb_line_pos, pstm->line_pos); Update_Counters(pstm, c); return c; } /*-------------------------------------------------------------------------* * STREAM_UNGETC * * * * Several issues should not occur except if more '\n' are unget than read * * (when a Stream_Set_Position() is used the number of read '\n' is 0). * *-------------------------------------------------------------------------*/ void Stream_Ungetc(int c, StmInf *pstm) { PB_Push(pstm->pb_char, c); pstm->eof_reached = FALSE; if (pstm->char_count > 0) /* test should be useless */ pstm->char_count--; if (c == '\n') { if (pstm->line_count > 0) /* test should be useless */ pstm->line_count--; if (!PB_Is_Empty(pstm->pb_line_pos)) PB_Pop(pstm->pb_line_pos, pstm->line_pos); else pstm->line_pos = 0; /* should not occur */ } else if (pstm->line_pos > 0) /* test should be useless */ pstm->line_pos--; } /*-------------------------------------------------------------------------* * STREAM_PEEKC * * * *-------------------------------------------------------------------------*/ int Stream_Peekc(StmInf *pstm) { int c; long file = pstm->file; Before_Reading(pstm, file); if (!PB_Is_Empty(pstm->pb_char)) PB_Top(pstm->pb_char, c); else { c = Basic_Call_Fct_Getc(pstm); PB_Push(pstm->pb_char, c); } return c; } /*-------------------------------------------------------------------------* * STREAM_GETS * * * *-------------------------------------------------------------------------*/ char * Stream_Gets(char *str, int size, StmInf *pstm) { int c; char *p = str; for (;;) { if (p - str >= size) break; c = Stream_Getc(pstm); if (c == EOF) break; *p++ = c; if (c == '\n') break; } if (c == EOF && p == str) return NULL; *p = '\0'; return str; } /*-------------------------------------------------------------------------* * STREAM_GET_LINE * * * *-------------------------------------------------------------------------*/ char * Stream_Gets_Prompt(char *prompt, StmInf *pstm_o, char *str, int size, StmInf *pstm_i) { #ifndef NO_USE_LINEDIT char *save_le_prompt = le_prompt; int save_use_le_prompt = use_le_prompt; le_prompt = prompt; use_le_prompt = 1; if (pstm_i->fct_getc != TTY_Getc) #endif Stream_Printf(pstm_o, prompt); str = Stream_Gets(str, size, pstm_i); #ifndef NO_USE_LINEDIT use_le_prompt = save_use_le_prompt; le_prompt = save_le_prompt; #endif return str; } /*-------------------------------------------------------------------------* * STREAM_PUTC * * * *-------------------------------------------------------------------------*/ void Stream_Putc(int c, StmInf *pstm) { Basic_Call_Fct_Putc(c, pstm); Update_Counters(pstm, c); } /*-------------------------------------------------------------------------* * STREAM_PUTS * * * *-------------------------------------------------------------------------*/ int Stream_Puts(char *str, StmInf *pstm) { char *p; int c; for (p = str; *p; p++) { c = *p; Basic_Call_Fct_Putc(c, pstm); /* like Stream_Putc */ Update_Counters(pstm, c); } return p - str; } /*-------------------------------------------------------------------------* * STREAM_PRINTF * * * *-------------------------------------------------------------------------*/ int Stream_Printf(StmInf *pstm, char *format, ...) { va_list arg_ptr; static char str[BIG_BUFFER]; char *p; int c; va_start(arg_ptr, format); vsprintf(str, format, arg_ptr); va_end(arg_ptr); for (p = str; *p; p++) { c = *p; Basic_Call_Fct_Putc(c, pstm); /* like Stream_Putc */ Update_Counters(pstm, c); } return p - str; } /*-------------------------------------------------------------------------* * STREAM_FLUSH * * * *-------------------------------------------------------------------------*/ void Stream_Flush(StmInf *pstm) { long file = pstm->file; if (pstm->prop.output && pstm->fct_flush != STREAM_FCT_UNDEFINED) (*pstm->fct_flush) (file); } /*-------------------------------------------------------------------------* * STREAM_CLOSE * * * *-------------------------------------------------------------------------*/ int Stream_Close(StmInf *pstm) { long file = pstm->file; int ret = 0; if (pstm->fct_close != STREAM_FCT_UNDEFINED) ret = (*pstm->fct_close) (file); return 0; } /*-------------------------------------------------------------------------* * STREAM_END_OF_STREAM * * * *-------------------------------------------------------------------------*/ int Stream_End_Of_Stream(StmInf *pstm) { int c; if (pstm->prop.eof_action == STREAM_EOF_ACTION_RESET || !pstm->prop.input) return STREAM_EOF_NOT; if (pstm->eof_reached) return STREAM_EOF_PAST; c = Stream_Peekc(pstm); if (c == EOF) return STREAM_EOF_AT; return STREAM_EOF_NOT; } /*-------------------------------------------------------------------------* * STREAM_GET_POSITION * * * *-------------------------------------------------------------------------*/ void Stream_Get_Position(StmInf *pstm, int *offset, int *char_count, int *line_count, int *line_pos) { long file = pstm->file; *offset = 0; if (pstm->prop.reposition && pstm->fct_tell != STREAM_FCT_UNDEFINED) { if ((*offset = (*pstm->fct_tell) (file)) < 0) *offset = 0; else { *offset = *offset - pstm->pb_char.nb_elems; if (*offset < 0) *offset = 0; } } *char_count = pstm->char_count; if (pstm->prop.text) { *line_count = pstm->line_count; *line_pos = pstm->line_pos; } else { *line_count = 0; *line_pos = 0; } } /*-------------------------------------------------------------------------* * STREAM_SET_POSITION * * * *-------------------------------------------------------------------------*/ int Stream_Set_Position(StmInf *pstm, int whence, int offset, int char_count, int line_count, int line_pos) { long file = pstm->file; int x; x = (*pstm->fct_seek) (file, (long) offset, whence); if (x != 0) return x; pstm->char_count = char_count; if (pstm->prop.text) { pstm->line_count = line_count; pstm->line_pos = line_pos; } if (pstm->eof_reached) { pstm->eof_reached = FALSE; if (pstm->fct_clearerr != STREAM_FCT_UNDEFINED) (*pstm->fct_clearerr) (file); } PB_Init(pstm->pb_char); PB_Init(pstm->pb_line_pos); return 0; } /*-------------------------------------------------------------------------* * STREAM_SET_POSITION_LC * * * * Only the line count and the line position are given. * *-------------------------------------------------------------------------*/ int Stream_Set_Position_LC(StmInf *pstm, int line_count, int line_pos) { long file = pstm->file; int x; int *p; int c; int offset; Bool save_eof_reached; int save_char_count, save_line_count, save_line_pos; int save_char_nb_elems; offset = (*pstm->fct_tell) (file); if (offset < 0) return offset; x = (*pstm->fct_seek) (file, (long) 0, SEEK_SET); if (x != 0) return x; save_eof_reached = pstm->eof_reached; save_char_count = pstm->char_count; save_line_count = pstm->line_count; save_line_pos = pstm->line_pos; save_char_nb_elems = pstm->pb_char.nb_elems; pstm->char_count = 0; pstm->line_count = 0; pstm->line_pos = 0; pstm->pb_char.nb_elems = 0; if (pstm->eof_reached) { pstm->eof_reached = FALSE; if (pstm->fct_clearerr != STREAM_FCT_UNDEFINED) (*pstm->fct_clearerr) (file); } p = &(pstm->line_count); while (*p < line_count) if (Stream_Getc(pstm) == EOF) goto err; p = &(pstm->line_pos); while (*p < line_pos) { if ((c = Stream_Getc(pstm)) == EOF) goto err; if (c == '\n') goto err; } PB_Init(pstm->pb_char); PB_Init(pstm->pb_line_pos); return 0; err: pstm->eof_reached = save_eof_reached; pstm->char_count = save_char_count; pstm->line_count = save_line_count; pstm->line_pos = save_line_pos; pstm->pb_char.nb_elems = save_char_nb_elems; x = (*pstm->fct_seek) (file, (long) offset, SEEK_SET); if (x != 0) return x; return -2; } /*-------------------------------------------------------------------------* * The following functions allows the user to handle streams on C strings * * Any stream can be a string stream. To avoid unnecessary malloc/free, we * * use as long as possible 2 str stream statically allocated (1 for input, * * 1 for output). This optimizes the use of preds like write_to_atom/2,... * * NB: The buff of the output static str stream is reused (no free on it). * * A dynamic str stream is allocated when it is not possible to use static * * ones. Such a str stream is freed at the close. * *-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------* * ADD_STR_STREAM * * * * buff == NULL means output stream mode (str_stream->buff_alloc_size != 0)* *-------------------------------------------------------------------------*/ int Add_Str_Stream(char *buff, int prop_other) { int stm; StmInf *pstm; StmProp prop; StrSInf *str_stream; str_stream = (buff) ? &static_str_stream_rd : &static_str_stream_wr; if (str_stream->ptr != NULL) /* in use ? */ { str_stream = (StrSInf *) Malloc(sizeof(StrSInf)); str_stream->buff_alloc_size = 0; } if (buff) { str_stream->buff = buff; prop.mode = STREAM_MODE_READ; prop.input = TRUE; prop.output = FALSE; } else { if (str_stream->buff_alloc_size == 0) { str_stream->buff = (char *) Malloc(STR_STREAM_WRITE_BLOCK); str_stream->buff_alloc_size = STR_STREAM_WRITE_BLOCK; } prop.mode = STREAM_MODE_WRITE; prop.input = FALSE; prop.output = TRUE; } str_stream->ptr = str_stream->buff; /* ptr != NULL <=> in use for global */ prop.text = 1; prop.reposition = FALSE; prop.buffering = STREAM_BUFFERING_NONE; prop.eof_action = STREAM_EOF_ACTION_EOF_CODE; prop.special_close = TRUE; prop.other = prop_other; stm = Find_Free_Stream(); pstm = stm_tbl[stm]; Init_Stream_Struct(atom_constant_term_stream, (long) str_stream, prop, (StmFct) Str_Stream_Getc, (StmFct) Str_Stream_Putc, STREAM_FCT_UNDEFINED, STREAM_FCT_UNDEFINED, STREAM_FCT_UNDEFINED, STREAM_FCT_UNDEFINED, STREAM_FCT_UNDEFINED, pstm); return stm; } /*-------------------------------------------------------------------------* * REMOVE_STR_STREAM * * * *-------------------------------------------------------------------------*/ void Delete_Str_Stream(int stm) { StrSInf *str_stream = (StrSInf *) (stm_tbl[stm]->file); if (str_stream == &static_str_stream_rd || str_stream == &static_str_stream_wr) { str_stream->ptr = NULL; /* not in use */ } else { if (str_stream->buff_alloc_size) Free(str_stream->buff); Free(str_stream); } Delete_Stream(stm); } /*-------------------------------------------------------------------------* * TERM_WRITE_STR_STREAM * * * * only needed for output string stream. * *-------------------------------------------------------------------------*/ char * Term_Write_Str_Stream(int stm) { StrSInf *str_stream; str_stream = (StrSInf *) (stm_tbl[stm]->file); *(str_stream->ptr) = '\0'; return str_stream->buff; } /*-------------------------------------------------------------------------* * STR_STREAM_GETC * * * *-------------------------------------------------------------------------*/ static int Str_Stream_Getc(StrSInf *str_stream) { int c; c = *(str_stream->ptr); if (c == '\0') return EOF; (str_stream->ptr)++; return c; } /*-------------------------------------------------------------------------* * STR_STREAM_PUTC * * * *-------------------------------------------------------------------------*/ static void Str_Stream_Putc(int c, StrSInf *str_stream) { int size = str_stream->ptr - str_stream->buff; int new_size; if (size >= str_stream->buff_alloc_size - 1) /* -1 for last '\0' */ { new_size = str_stream->buff_alloc_size + STR_STREAM_WRITE_BLOCK; str_stream->buff = Realloc(str_stream->buff, new_size); str_stream->buff_alloc_size = new_size; str_stream->ptr = str_stream->buff + size; } *(str_stream->ptr)++ = c; } ./gprolog-1.3.0/src/BipsPl/pred_supp.h0000644004425400513100000000535610547154137016143 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : pred_supp.h * * Descr.: predicate management support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: pred_supp.h,v 1.9 2007/01/04 10:35:11 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /* if modified -> modif wam2ma.c */ #define MASK_PRED_NATIVE_CODE 1 #define MASK_PRED_DYNAMIC 2 #define MASK_PRED_PUBLIC 4 #define MASK_PRED_BUILTIN 8 #define MASK_PRED_BUILTIN_FD 16 #define MASK_PRED_ANY_BUILTIN (MASK_PRED_BUILTIN | MASK_PRED_BUILTIN_FD) /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ char *Detect_If_Aux_Name(int func); int Father_Pred_Of_Aux(int func, int *father_arity); int Pred_Without_Aux(int func, int arity, int *arity1); int Make_Aux_Name(int func, int arity, int aux_nb); ./gprolog-1.3.0/src/BipsPl/term_inl_c.c0000644004425400513100000003400010547154140016226 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : term_inl_c.c * * Descr.: term (inline) management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: term_inl_c.c,v 1.12 2007/01/04 10:35:12 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /* Term comparison inlines */ /*-------------------------------------------------------------------------* * BLT_TERM_EQ * * * *-------------------------------------------------------------------------*/ Bool FC Blt_Term_Eq(WamWord x, WamWord y) { return Term_Compare(x, y) == 0; } /*-------------------------------------------------------------------------* * BLT_TERM_NEQ * * * *-------------------------------------------------------------------------*/ Bool FC Blt_Term_Neq(WamWord x, WamWord y) { return Term_Compare(x, y) != 0; } /*-------------------------------------------------------------------------* * BLT_TERM_LT * * * *-------------------------------------------------------------------------*/ Bool FC Blt_Term_Lt(WamWord x, WamWord y) { return Term_Compare(x, y) < 0; } /*-------------------------------------------------------------------------* * BLT_TERM_LTE * * * *-------------------------------------------------------------------------*/ Bool FC Blt_Term_Lte(WamWord x, WamWord y) { return Term_Compare(x, y) <= 0; } /*-------------------------------------------------------------------------* * BLT_TERM_GT * * * *-------------------------------------------------------------------------*/ Bool FC Blt_Term_Gt(WamWord x, WamWord y) { return Term_Compare(x, y) > 0; } /*-------------------------------------------------------------------------* * BLT_TERM_GTE * * * *-------------------------------------------------------------------------*/ Bool FC Blt_Term_Gte(WamWord x, WamWord y) { return Term_Compare(x, y) >= 0; } /*-------------------------------------------------------------------------* * BLT_COMPARE * * * *-------------------------------------------------------------------------*/ Bool FC Blt_Compare(WamWord cmp_word, WamWord x, WamWord y) { int cmp; char c; Bool res; Set_C_Bip_Name("compare", 3); cmp = Term_Compare(x, y); c = (cmp < 0) ? '<' : (cmp == 0) ? '=' : '>'; res = Un_Atom_Check(ATOM_CHAR(c), cmp_word); Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * BLT_ARG * * * *-------------------------------------------------------------------------*/ Bool FC Blt_Arg(WamWord arg_no_word, WamWord term_word, WamWord sub_term_word) { WamWord *arg_adr; int func, arity; int arg_no; Set_C_Bip_Name("arg", 3); arg_no = Rd_Positive_Check(arg_no_word) - 1; arg_adr = Rd_Compound_Check(term_word, &func, &arity); Unset_C_Bip_Name(); return (unsigned) arg_no < (unsigned) arity && Unify(sub_term_word, arg_adr[arg_no]); } /*-------------------------------------------------------------------------* * BLT_FUNCTOR * * * *-------------------------------------------------------------------------*/ Bool FC Blt_Functor(WamWord term_word, WamWord functor_word, WamWord arity_word) { WamWord word, tag_mask; WamWord *adr; WamWord tag_functor; int arity; Bool res; Set_C_Bip_Name("functor", 3); DEREF(term_word, word, tag_mask); if (tag_mask != TAG_REF_MASK) { if (tag_mask == TAG_LST_MASK) res = Un_Atom_Check(ATOM_CHAR('.'), functor_word) && Un_Integer_Check(2, arity_word); else if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(word); res = Un_Atom_Check(Functor(adr), functor_word) && Un_Integer_Check(Arity(adr), arity_word); } else res = Unify(word, functor_word) && Un_Integer_Check(0, arity_word); goto finish; } /* tag_mask == TAG_REF_MASK */ DEREF(functor_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_ATM_MASK && tag_mask != TAG_INT_MASK && tag_mask != TAG_FLT_MASK) Pl_Err_Type(type_atomic, functor_word); tag_functor = tag_mask; functor_word = word; arity = Rd_Positive_Check(arity_word); if (arity > MAX_ARITY) Pl_Err_Representation(representation_max_arity); if (tag_functor == TAG_ATM_MASK && UnTag_ATM(functor_word) == ATOM_CHAR('.') && arity == 2) { res = (Get_List(term_word)) ? Unify_Void(2), TRUE : FALSE; goto finish; } if (tag_functor == TAG_ATM_MASK && arity > 0) { res = (Get_Structure(UnTag_ATM(functor_word), arity, term_word)) ? Unify_Void(arity), TRUE : FALSE; goto finish; } if (arity != 0) Pl_Err_Type(type_atom, functor_word); res = Unify(functor_word, term_word); finish: Unset_C_Bip_Name(); return res; } /*-------------------------------------------------------------------------* * BLT_UNIV * * * *-------------------------------------------------------------------------*/ Bool FC Blt_Univ(WamWord term_word, WamWord list_word) { WamWord word, tag_mask; WamWord *adr; WamWord car_word; int lst_length; WamWord *arg1_adr; WamWord *term_adr, *lst_adr, *stc_adr; WamWord functor_word, functor_tag; int functor; int arity; Set_C_Bip_Name("=..", 2); DEREF(term_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) goto list_to_term; /* from term to list functor+args */ if (tag_mask == TAG_LST_MASK) { adr = UnTag_LST(word); car_word = Tag_ATM(ATOM_CHAR('.')); lst_length = 1 + 2; arg1_adr = &Car(adr); } else if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(word); car_word = Tag_ATM(Functor(adr)); lst_length = 1 + Arity(adr); arg1_adr = &Arg(adr, 0); } #ifndef NO_USE_FD_SOLVER else if (tag_mask == TAG_FDV_MASK) { adr = UnTag_FDV(word); car_word = Tag_REF(adr); /* since Dont_Separate_Tag */ lst_length = 1 + 0; } #endif else /* TAG_ATM/INT/FLT_MASK */ { car_word = word; lst_length = 1 + 0; } Check_For_Un_List(list_word); Unset_C_Bip_Name(); for (;;) { if (!Get_List(list_word) || !Unify_Value(car_word)) return FALSE; list_word = Unify_Variable(); if (--lst_length == 0) break; car_word = *arg1_adr++; } return Get_Nil(list_word); /* from list functor+args to term */ list_to_term: term_adr = UnTag_REF(word); DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) Pl_Err_Domain(domain_non_empty_list, list_word); if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, list_word); lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), functor_word, functor_tag); if (functor_tag == TAG_REF_MASK) Pl_Err_Instantiation(); DEREF(Cdr(lst_adr), word, tag_mask); if (word == NIL_WORD) { if (functor_tag != TAG_ATM_MASK && functor_tag != TAG_INT_MASK && functor_tag != TAG_FLT_MASK) Pl_Err_Type(type_atomic, functor_word); term_word = functor_word; goto finish; } if (functor_tag != TAG_ATM_MASK) Pl_Err_Type(type_atom, functor_word); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, list_word); functor = UnTag_ATM(functor_word); stc_adr = H; H++; /* space for f/n maybe lost if a list */ arity = 0; for (;;) { arity++; lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); Do_Copy_Of_Word(tag_mask, word); /* since Dont_Separate_Tag */ Global_Push(word); DEREF(Cdr(lst_adr), word, tag_mask); if (word == NIL_WORD) break; if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, list_word); } if (arity > MAX_ARITY) Pl_Err_Representation(representation_max_arity); if (functor == ATOM_CHAR('.') && arity == 2) /* a list */ term_word = Tag_LST(stc_adr + 1); else { *stc_adr = Functor_Arity(functor, arity); term_word = Tag_STC(stc_adr); } finish: Bind_UV(term_adr, term_word); Unset_C_Bip_Name(); return TRUE; } /*-------------------------------------------------------------------------* * COPY_TERM_2 * * * *-------------------------------------------------------------------------*/ Bool Copy_Term_2(WamWord u_word, WamWord v_word) { WamWord word; int size; /* fix_bug is because when gcc sees &xxx where xxx is a fct argument variable * it allocates a frame even with -fomit-frame-pointer. * This corrupts ebp on ix86 */ static WamWord fix_bug; size = Term_Size(u_word); fix_bug = u_word; Copy_Term(H, &fix_bug); word = *H; H += size; return Unify(word, v_word); } /*-------------------------------------------------------------------------* * SETARG_4 * * * *-------------------------------------------------------------------------*/ Bool Setarg_4(WamWord arg_no_word, WamWord term_word, WamWord new_value_word, WamWord undo_word) { WamWord word, tag_mask; int func, arity; int undo; WamWord *arg_adr; int arg_no; arg_adr = Rd_Compound_Check(term_word, &func, &arity); arg_no = Rd_Positive_Check(arg_no_word) - 1; undo = Rd_Boolean_Check(undo_word); DEREF(new_value_word, word, tag_mask); if (!undo && tag_mask != TAG_ATM_MASK && tag_mask != TAG_INT_MASK) Pl_Err_Type(type_atomic, word); /* type_atomic but float not allowed */ if ((unsigned) arg_no >= (unsigned) arity) return FALSE; if (undo) Bind_OV((arg_adr + arg_no), word); else arg_adr[arg_no] = word; return TRUE; } /*-------------------------------------------------------------------------* * TERM_REF_2 * * * *-------------------------------------------------------------------------*/ Bool Term_Ref_2(WamWord term_word, WamWord ref_word) { WamWord word, tag_mask; WamWord word1, *adr; int ref; /* my own DEREF here to get the address */ adr = NULL; /* added this */ word = term_word; do { word1 = word; tag_mask = Tag_Mask_Of(word); if (tag_mask != TAG_REF_MASK) break; adr = UnTag_REF(word); /* added this */ word = *adr; } while (word != word1); if (tag_mask == TAG_REF_MASK) { ref = Rd_Positive_Check(ref_word); adr = Global_Stack + ref; return Unify(word, *adr); } if (adr < Global_Stack || adr > H) { adr = H; Global_Push(word); } ref = Global_Offset(adr); return Un_Positive_Check(ref, ref_word); } ./gprolog-1.3.0/src/BipsPl/unify.pl0000644004425400513100000000373710547162354015461 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : unify.pl * * Descr.: unification management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: unify.pl,v 1.12 2007/01/04 10:35:12 diaz Exp $ */ :- built_in. '$use_unify'. X = X. unify_with_occurs_check(X, Y) :- '$call_c'('Unify_Occurs_Check'(X, Y), [boolean, fast_call]). X \= Y :- \+ X = Y. ./gprolog-1.3.0/src/BipsPl/control.pl0000644004425400513100000000430010547162352015770 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : control.pl * * Descr.: control management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: control.pl,v 1.11 2007/01/04 10:35:09 diaz Exp $ */ :- built_in. '$use_control'. repeat. repeat :- repeat. abort :- '$call_c_jump'('Halt_If_No_Top_Level_1'(1)). stop :- '$call_c_jump'('Halt_If_No_Top_Level_1'(0)). halt :- halt(0). halt(X) :- set_bip_name(halt, 1), '$call_c'('Halt_1'(X)). for(I, L, U) :- set_bip_name(for, 3), '$call_c_test'('For_3'(I, L, U)). '$for_alt' :- '$call_c'('For_Alt_0'). ./gprolog-1.3.0/src/BipsPl/all_pl_bips.pl0000644004425400513100000000462010547162351016574 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : all_pl_bips.pl * * Descr.: all bips (to force the linker) * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: all_pl_bips.pl,v 1.12 2007/01/04 10:35:06 diaz Exp $ */ '$use_all_pl_bips' :- '$use_control', '$use_call', '$use_call_args', '$use_catch', '$use_throw', '$use_unify', '$use_arith_inl', '$use_assert', '$use_all_solut', '$use_sort', '$use_list', '$use_stream', '$use_le_interf', '$use_file', '$use_char_io', '$use_read', '$use_write', '$use_print', '$use_const_io', '$use_oper', '$use_pred', '$use_atom', '$use_flag', '$use_term_inl', '$use_type_inl', '$use_g_var_inl', '$use_stat', '$use_dec10io', '$use_format', '$use_os_interf', '$use_expand', '$use_pretty', '$use_random', '$use_sockets', '$use_src_rdr'. ./gprolog-1.3.0/src/BipsPl/expand.pl0000644004425400513100000000542210547162352015575 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : expand.pl * * Descr.: term expansion management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: expand.pl,v 1.11 2007/01/04 10:35:09 diaz Exp $ */ :- built_in. '$use_expand'. expand_term(T1, T3) :- % must be steadfast '$expand_term1'(T1, T2), T2 = T3. '$expand_term1'(T1, T2) :- ( var(T1), T2 = T1 ; '$call_term_expansion'(T1, T2) ; set_bip_name(expand_term, 2), '$dcg_trans_rule'(T1, T2) ; T2 = T1 ), !. '$call_term_expansion'(T1, T2) :- current_predicate(term_expansion / 2), call(term_expansion(T1, T2)). phrase(DcgBody, In) :- '$phrase'(DcgBody, In, [], 2). phrase(DcgBody, In, Out) :- '$phrase'(DcgBody, In, Out, 3). '$phrase'(DcgBody, In, Out, Arity) :- set_bip_name(phrase, Arity), '$check_list_or_partial_list'(In), '$check_list_or_partial_list'(Out), '$dcg_trans_body'(DcgBody, In, Out, Body), '$call'(Body, phrase, Arity, true). '$dcg_trans_rule'(Dcg, Clause) :- '$call_c_test'('Dcg_Trans_Rule_2'(Dcg, Clause)). '$dcg_trans_body'(DcgBody, In, Out, Body) :- '$call_c_test'('Dcg_Trans_Body_4'(DcgBody, In, Out, Body)). ./gprolog-1.3.0/src/BipsPl/flag.pl0000644004425400513100000000733610547162352015235 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : flag.pl * * Descr.: Prolog flag and system variable management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: flag.pl,v 1.12 2007/01/04 10:35:09 diaz Exp $ */ :- built_in. '$use_flag'. set_prolog_flag(Flag, Value) :- set_bip_name(set_prolog_flag, 2), '$call_c_test'('Set_Prolog_Flag_2'(Flag, Value)). current_prolog_flag(Flag, Value) :- set_bip_name(current_prolog_flag, 2), '$call_c_test'('Current_Prolog_Flag_2'(Flag, Value)). '$current_prolog_flag_alt' :- % used by C code to create a choice-point '$call_c_test'('Current_Prolog_Flag_Alt_0'). '$sys_var_write'(Var, N) :- '$call_c'('Sys_Var_Write_2'(Var, N)). '$sys_var_read'(Var, N) :- '$call_c_test'('Sys_Var_Read_2'(Var, N)). '$sys_var_inc'(Var) :- '$call_c'('Sys_Var_Inc_1'(Var)). '$sys_var_dec'(Var) :- '$call_c'('Sys_Var_Dec_1'(Var)). '$sys_var_set_bit'(Var, Bit) :- '$call_c'('Sys_Var_Set_Bit_2'(Var, Bit)). '$sys_var_reset_bit'(Var, Bit) :- '$call_c'('Sys_Var_Reset_Bit_2'(Var, Bit)). '$sys_var_get_bit'(Var, Bit, Value) :- '$call_c_test'('Sys_Var_Get_Bit_3'(Var, Bit, Value)). '$sys_var_put'(Var, Term) :- '$call_c'('Sys_Var_Put_2'(Var, Term)). '$sys_var_get'(Var, Term) :- '$call_c_test'('Sys_Var_Get_2'(Var, Term)). '$get_current_B'(X) :- '$call_c'('Get_Current_B_1'(X)). '$set_current_B'(X) :- '$call_c'('Set_Current_B_1'(X)). write_pl_state_file(File) :- set_bip_name(write_pl_state_file, 1), '$call_c_test'('Write_Pl_State_File'(File)). read_pl_state_file(File) :- set_bip_name(read_pl_state_file, 1), '$call_c_test'('Read_Pl_State_File'(File)). argument_counter(N) :- set_bip_name(argument_counter, 1), '$call_c_test'('Argument_Counter_1'(N)). argument_value(I, A) :- set_bip_name(argument_value, 2), '$call_c_test'('Argument_Value_2'(I, A)). argument_list(List) :- set_bip_name(argument_list, 1), '$call_c_test'('Argument_List_1'(List)). environ(VarName, Value) :- set_bip_name(environ, 2), '$call_c_test'('Environ_2'(VarName, Value)). '$environ_alt' :- % used by C code to create a choice-point '$call_c_test'('Environ_Alt_0'). ./gprolog-1.3.0/src/BipsPl/foreign_supp.h0000644004425400513100000001033010547154136016625 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : foreign_supp.h * * Descr.: foreign interface support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: foreign_supp.h,v 1.11 2007/01/04 10:35:10 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ #define PL_RECOVER 0 #define PL_CUT 1 #define PL_KEEP_FOR_PROLOG 2 #define PL_FAILURE FALSE #define PL_SUCCESS TRUE #define PL_EXCEPTION 2 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { Bool is_var; Bool unify; union { long l; char *s; double d; } value; } FIOArg; /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef FOREIGN_SUPP_FILE int foreign_bkt_counter; char *foreign_bkt_buffer; #else extern int foreign_bkt_counter; extern char *foreign_bkt_buffer; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Foreign_Create_Choice(CodePtr codep_alt, int arity, int choice_size); void Foreign_Update_Choice(CodePtr codep_alt, int arity, int choice_size); CodePtr Foreign_Jump_Ret(CodePtr codep); FIOArg *Foreign_Rd_IO_Arg(int arg_long, WamWord start_word, long (*rd_fct) (), int fio_arg_index); Bool Foreign_Un_IO_Arg(int arg_long, Bool (*un_fct) (), FIOArg *fa, WamWord start_word); void Emit_Syntax_Error(char *file_name, int err_line, int err_col, char *err_msg); int Type_Of_Term(WamWord start_word); void Pl_Exec_Continuation(int func, int arity, WamWord *arg_adr); void Pl_Query_Begin(Bool recoverable); int Pl_Query_Call(int func, int arity, WamWord *arg_adr); #define Pl_Query_Start(func, arity, arg_adr, recoverable) \ (Pl_Query_Begin(recoverable), Pl_Query_Call(func, arity, arg_adr)) int Pl_Query_Next_Solution(void); void Pl_Query_End(int op); WamWord Pl_Get_Exception(void); #define Get_Choice_Counter() foreign_bkt_counter #define Get_Choice_Buffer(t) ((t) foreign_bkt_buffer) #define No_More_Choice() Delete_Last_Choice_Point() #define PlTerm WamWord #define PLV REF #define Atom_Name(a) (atom_tbl[(a)].name) #define Atom_Length(a) (atom_tbl[(a)].prop.length) #define Atom_Needs_Quote(a) (atom_tbl[(a)].prop.needs_quote) #define Atom_Needs_Scan(a) (atom_tbl[(a)].prop.needs_scan) #define atom_nil ATOM_NIL #define Stream_Pointer(s) (stm_tbl + (s)) ./gprolog-1.3.0/src/BipsPl/BYTE_CODE0000644004425400513100000000443106560375434015247 0ustar diazloco GET_X_VARIABLE | x | x | op | GET_Y_VARIABLE | y | x | op | GET_X_VALUE | x | x | op | GET_Y_VALUE | y | x | op | GET_ATOM | cst16 | x | op | GET_INTEGER | int16 | x | op | GET_INTEGER_BIG | ------- | x | op | | int32 | GET_FLOAT | ------- | x | op | | dbl64-1 | | dbl64-2 | GET_NIL | ------- | x | op | GET_LIST | ------- | x | op | GET_STRUCTURE | fun16 | x | op | | ari8 | PUT_X_VARIABLE | x | x | op | PUT_Y_VARIABLE | y | x | op | PUT_VOID | ------- | x | op | PUT_X_VALUE | x | x | op | PUT_Y_VALUE | y | x | op | PUT_Y_UNSAFE_VALUE | y | x | op | PUT_ATOM | cst16 | x | op | PUT_INTEGER | int16 | x | op | PUT_INTEGER_BIG | ------- | x | op | | int32 | PUT_FLOAT | ------- | x | op | | dbl64-1 | | dbl64-2 | PUT_NIL | ------- | x | op | PUT_LIST | ------- | x | op | PUT_STRUCTURE | fun16 | x | op | | ari8 | MATH_LOAD_X_VALUE | x | x | op | MATH_LOAD_Y_VALUE | y | x | op | UNIFY_X_VARIABLE | x | -- | op | UNIFY_Y_VARIABLE | y | -- | op | UNIFY_VOID | int16 | -- | op | UNIFY_X_VALUE | x | -- | op | UNIFY_Y_VALUE | y | -- | op | UNIFY_X_LOCAL_VALUE | x | -- | op | UNIFY_Y_LOCAL_VALUE | y | -- | op | UNIFY_ATOM | cst16 | -- | op | UNIFY_INTEGER | int16 | -- | op | | int32 | UNIFY_INTEGER_BIG | ------------ | op | | int32 | UNIFY_NIL | ------------ | op | UNIFY_LIST | ------------ | op | UNIFY_STRUCTURE | fun16 | ar8| op | ALLOCATE | int16 | -- | op | DEALLOCATE | ------------ | op | CALL | fun16 | ar8| op | | f/n | of the caller CALL_NATIVE | fun16 | ar8| op | | adr32/64| EXECUTE | fun16 | ar8| op | | f/n | of the caller EXECUTE_NATIVE | fun16 | ar8| op | | adr32/64| PROCEED | ------------ | op | FAIL | ------------ | op | CUT_X | x | -- | op | CUT_Y | y | -- | op | ./gprolog-1.3.0/src/BipsPl/no_le_interf.wam0000644004425400513100000000063010547440332017123 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : no_le_interf.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/no_le_interf.pl'). predicate('$use_le_interf'/0,29,static,private,built_in,[ proceed]). predicate('$get_linedit_prompt'/1,32,static,private,built_in,[ proceed]). predicate('$set_linedit_prompt'/1,34,static,private,built_in,[ proceed]). ./gprolog-1.3.0/src/BipsPl/assert.pl0000644004425400513100000000667610547162351015632 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : assert.pl * * Descr.: dynamic predicate management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: assert.pl,v 1.11 2007/01/04 10:35:07 diaz Exp $ */ :- built_in. '$use_assert'. asserta(C) :- set_bip_name(asserta, 1), '$assert'(C, 1, 1). assertz(C) :- set_bip_name(assertz, 1), '$assert'(C, 0, 1). '$assert'(C, Asserta, CheckPerm) :- '$get_head_and_body'(C, H, B), '$term_to_goal'(B, none, B1), '$call_c'('Assert_4'(H, B1, Asserta, CheckPerm)), fail. '$assert'(_, _, _). retract(C) :- set_bip_name(retract, 1), '$get_head_and_body'(C, H, B), '$retract'(H, B). '$retract'(H, B) :- % call_c must be alone (inline) CP cannot be changed '$call_c_test'('Retract_2'(H, B)). retractall(H) :- set_bip_name(retractall, 1), '$call_c_test'('Retractall_If_Empty_Head_1'(H)), !. retractall(H) :- % here only if Retractall_If_Empty_Head_1 fails '$retract'(H, _), fail. retractall(_). '$retract_last_found' :- '$call_c'('Retract_Last_Found_0'). clause(H, B) :- set_bip_name(clause, 2), '$check_head'(H), '$clause'(H, B, 0). '$clause'(H, B, ForWhat) :- % call_c must be alone (inline) CP cannot be changed '$call_c_test'('Clause_3'(H, B, ForWhat)). '$instance_for_setarg'(H, B) :- '$call_c_test'('Clause_3'(H, B, 0)). '$setarg_in_last_found'(ArgNo, NewValue) :- '$call_c'('Setarg_Of_Last_Found_2'(ArgNo, NewValue)). abolish(PI) :- set_bip_name(abolish, 1), '$call_c'('Abolish_1'(PI)). '$remove_predicate'(Name, Arity) :- '$call_c'('Remove_Predicate_2'(Name, Arity)). '$scan_dyn_test_alt' :- % used by C code to create a choice-point '$call_c_test'('Scan_Dynamic_Pred_Alt_0'). '$scan_dyn_jump_alt' :- % used by C code to create a choice-point '$call_c_jump'('Scan_Dynamic_Pred_Alt_0'). ./gprolog-1.3.0/src/BipsPl/src_rdr.pl0000644004425400513100000003515410547162353015762 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : src_rdr.pl * * Descr.: Prolog source file reader * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: src_rdr.pl,v 1.9 2007/01/04 10:35:11 diaz Exp $ */ :- built_in. '$use_src_rdr'. /* API set_prolog_flag(strict_iso, off), setof(Y:X,(predicate_property(X, prolog_file(F)), decompose_file_name(F, _, src_rdr, '.pl'), predicate_property(X, prolog_line(Y))), L), member(_:A, L), write(A), nl, fail. sr_open/3 sr_change_options/2 sr_close/1 sr_read_term/4 sr_current_descriptor/1 sr_get_stream/2 sr_get_module/3 sr_get_file_name/2 sr_get_position/3 sr_get_include_list/2 sr_get_include_stream_list/2 sr_get_size_counters/3 sr_get_error_counters/3 sr_set_error_counters/3 sr_write_message/4 sr_write_message/6 sr_write_message/8 sr_write_error/2 sr_write_error/4 sr_write_error/6 sr_error_from_exception/2 */ sr_open(FileOrStream, D, Options) :- set_bip_name(sr_open, 3), '$set_sr_defaults', '$get_sr_options'(Options, OutSorA), ( var(D) -> true ; '$pl_err_type'(variable, D) ), '$call_c'('SR_Init_Open_2'(D, OutSorA)), ( nonvar(FileOrStream), FileOrStream = '$stream'(_) -> '$call_c'('SR_Open_File_2'(FileOrStream, true)) ; '$sr_open_new_prolog_file'(FileOrStream) ). % option mask in sys_var[0]: % % include in b1/b0 treat/pass % op in b3/b2 0 / 0 = kill % set_prolog_flag in b5/b4 code: 0 / 1 = ignore % char_conversion in b7/b6 1 / 0 = hide % module in b9/b8 1 / 1 = reflect % % restart in b16 (0/1) % reflect_eof in b17 (0/1) % undo_directives in b18 (0/1) % write_error in b19 (0/1) % % in sys_var[1]: is output stream specified ? '$set_sr_defaults' :- '$sys_var_write'(0, 0b1111111110), % default mask '$sys_var_set_bit'(0, 19), '$sys_var_write'(1, 0). '$get_sr_options'(Options, OutSorA) :- '$check_list'(Options), g_assign('$sr_output_stream', 0), '$get_sr_options1'(Options), g_read('$sr_output_stream', OutSorA). '$get_sr_options1'([]). '$get_sr_options1'([X|Options]) :- '$get_sr_options2'(X), !, '$get_sr_options1'(Options). '$get_sr_options2'(X) :- var(X), '$pl_err_instantiation'. '$get_sr_options2'(T) :- functor(T, F, 1), arg(1, T, A), nonvar(A), '$sr_treat_pass_no'(F, _, SubMaskPos), BitPass is SubMaskPos * 2, BitTreat is BitPass + 1, set_bip_name(sr_open, 3), % due to the use of is/2 '$sr_set_treat_pass_bits'(A, BitPass, BitTreat). '$get_sr_options2'(restart(X)) :- nonvar(X), ( X = false, '$sys_var_reset_bit'(0, 16) ; X = true, '$sys_var_set_bit'(0, 16) ). '$get_sr_options2'(reflect_eof(X)) :- nonvar(X), ( X = false, '$sys_var_reset_bit'(0, 17) ; X = true, '$sys_var_set_bit'(0, 17) ). '$get_sr_options2'(undo_directives(X)) :- nonvar(X), ( X = false, '$sys_var_reset_bit'(0, 18) ; X = true, '$sys_var_set_bit'(0, 18) ). '$get_sr_options2'(write_error(X)) :- nonvar(X), ( X = false, '$sys_var_reset_bit'(0, 19) ; X = true, '$sys_var_set_bit'(0, 19) ). '$get_sr_options2'(output_stream(SorA)) :- g_link('$sr_output_stream', SorA), '$sys_var_write'(1, 1). '$get_sr_options2'(X) :- '$pl_err_domain'(sr_option, X). % '$sr_treat_pass_no'(Name, Arity, SubMaskPos) '$sr_treat_pass_no'(include, 1, 0). '$sr_treat_pass_no'(op, 3, 1). '$sr_treat_pass_no'(set_prolog_flag, 2, 2). '$sr_treat_pass_no'(char_conversion, 2, 3). '$sr_treat_pass_no'(module, 1, 4). '$sr_treat_pass_no'(end_module, 1, 4). '$sr_treat_pass_no'(body, 1, 4). '$sr_treat_pass_no'(end_body, 1, 4). '$sr_set_treat_pass_bits'(kill, BitPass, BitTreat) :- '$sys_var_reset_bit'(0, BitPass), '$sys_var_reset_bit'(0, BitTreat). '$sr_set_treat_pass_bits'(ignore, BitPass, BitTreat) :- '$sys_var_set_bit'(0, BitPass), '$sys_var_reset_bit'(0, BitTreat). '$sr_set_treat_pass_bits'(hide, BitPass, BitTreat) :- '$sys_var_reset_bit'(0, BitPass), '$sys_var_set_bit'(0, BitTreat). '$sr_set_treat_pass_bits'(reflect, BitPass, BitTreat) :- '$sys_var_set_bit'(0, BitPass), '$sys_var_set_bit'(0, BitTreat). '$sr_open_new_prolog_file'(File) :- '$call_c'('Prolog_File_Name_2'(File, File1)), '$call_c'('SR_Open_File_2'(File1, false)). /* ( '$call_c_test'('File_Permission_2'(File, [read])) -> File1 = File ; '$call_c'('Prolog_File_Name_2'(File, File1)) ), */ sr_change_options(D, Options) :- set_bip_name(sr_change_options, 2), '$call_c'('SR_Check_Descriptor_1'(D)), % also init sys_var[0] '$get_sr_options1'(Options), '$call_c'('SR_Change_Options_0'). sr_close(D) :- set_bip_name(sr_close, 1), '$call_c'('SR_Close_1'(D)). sr_new_pass(D) :- set_bip_name(sr_new_pass, 1), ( '$call_c_test'('SR_New_Pass_1'(D)) -> true ; '$pl_err_permission'(new_pass, one_pass_reader, D) ). sr_read_term(D, Term, Options, SRError) :- '$call_c'('SR_Check_Descriptor_1'(D)), repeat, '$call_c'('SR_Get_Stm_For_Read_Term_1'(Stm)), Stream = '$stream'(Stm), set_bip_name(sr_read_term, 3), '$catch'('$read_term'(Stream, Term, Options), Excep, true, sr_read_term, 3, false), '$call_c'('SR_Update_Position_0'), ( var(Excep) -> '$sr_treat_term'(Term, SRError) ; Term = '$sr_read_term_error', '$sr_error_from_exception'(Excep, SRError) ), ( SRError = sr_error(_, _), '$call_c_test'('SR_Is_Bit_Set_1'(19)) -> sr_write_error(D, SRError) ; true ), !. % cut to remove repeat choice-point %% '$sr_treat_term'(Term, SRError) handles a read term %% It can fail to enforce backtracking and next term reading. %% Warning: Term can be a variable - should not be altered. '$sr_treat_term'(Term, SRError) :- Term == end_of_file, !, % cut to backtrack to repeat '$call_c_test'('SR_EOF_Reached_1'(Err)), % this one can fail ( var(Err) -> SRError = sr_ok ; SRError = sr_error(warning, Err)). '$sr_treat_term'(Term, SRError) :- nonvar(Term), Term = (:- Directive), nonvar(Directive), functor(Directive, F, A), '$sr_treat_pass_no'(F, A, SubMaskPos), !, % cut to backtrack to repeat BitPass is SubMaskPos * 2, BitTreat is BitPass + 1, ( '$call_c_test'('SR_Is_Bit_Set_1'(BitTreat)) -> '$catch'('$sr_exec_directive'(Directive, SRError), Excep, '$sr_error_from_exception'(Excep, SRError), any, 0, false) ; true), ( var(Excep) -> '$call_c_test'('SR_Is_Bit_Set_1'(BitPass)) % can fail ; true). '$sr_treat_term'(_, sr_ok). '$sr_exec_directive'(Directive, SRError) :- '$sr_directive1'(Directive, SRError), !. '$sr_exec_directive'(_, SRError) :- SRError = sr_error(warning, 'directive failed'). '$sr_directive1'(include(File), sr_ok) :- '$sr_open_new_prolog_file'(File). '$sr_directive1'(op(Prec, Specif, Oper), sr_ok) :- ( nonvar(Specif), nonvar(Oper), '$sr_op_type'(Specif, OpType), current_op(OldPrec, OldSpecif, Oper), '$sr_op_type'(OldSpecif, OpType) -> true ; OldPrec = 0, OldSpecif = Specif ), '$call_c'('SR_Add_Directive_7'(0, Prec, Specif, Oper, OldPrec, OldSpecif, Oper)). '$sr_directive1'(set_prolog_flag(Flag, Value), sr_ok) :- ( nonvar(Flag), current_prolog_flag(Flag, OldValue) -> true ; true ), '$call_c'('SR_Add_Directive_7'(1, Flag, Value, 0, Flag, OldValue, 0)). '$sr_directive1'(char_conversion(InChar, OutChar), sr_ok) :- ( nonvar(InChar), current_char_conversion(InChar, OldOutChar) -> true ; OldOutChar = InChar ), '$call_c'('SR_Add_Directive_7'(2, InChar, OutChar, 0, InChar, OldOutChar, 0)). '$sr_directive1'(module(ModuleName), SRError) :- '$sr_start_module'(ModuleName, true, SRError). '$sr_directive1'(body(ModuleName), SRError) :- '$sr_start_module'(ModuleName, false, SRError). '$sr_directive1'(end_module(ModuleName), SRError) :- '$sr_stop_module'(ModuleName, true, SRError). '$sr_directive1'(end_body(ModuleName), SRError) :- '$sr_stop_module'(ModuleName, false, SRError). '$sr_op_type'(fx, prefix). '$sr_op_type'(fy, prefix). '$sr_op_type'(xfx, infix). '$sr_op_type'(yfx, infix). '$sr_op_type'(xfy, infix). '$sr_op_type'(xf, postfix). '$sr_op_type'(yf, postfix). '$sr_start_module'(ModuleName, ModulePart, SRError) :- '$call_c'('SR_Start_Module_3'(ModuleName, ModulePart, Err)), ( var(Err) -> SRError = sr_ok ; SRError = sr_error(warning, Err)). '$sr_stop_module'(ModuleName, ModulePart, SRError) :- '$call_c'('SR_Stop_Module_3'(ModuleName, ModulePart, Err)), ( var(Err) -> SRError = sr_ok ; SRError = sr_error(warning, Err)). sr_current_descriptor(D) :- set_bip_name(sr_current_descriptor, 1), '$call_c_test'('SR_Current_Descriptor_1'(D)). '$sr_current_descriptor_alt' :- % used by C code to create a choice-point '$call_c_test'('SR_Current_Descriptor_Alt_0'). sr_get_stream(D, Stream) :- set_bip_name(sr_get_stream, 2), '$check_stream_or_var'(Stream, Stm), '$call_c_test'('SR_Get_Stm_2'(D, Stm)). sr_get_module(D, ModuleName, ModulePart) :- set_bip_name(sr_get_module, 3), '$call_c_test'('SR_Get_Module_3'(D, ModuleName, ModulePart)). sr_get_file_name(D, File) :- set_bip_name(sr_get_file_name, 2), '$call_c_test'('SR_Get_File_Name_2'(D, File)). sr_get_position(D, L1, L2) :- set_bip_name(sr_get_position, 3), '$call_c_test'('SR_Get_Position_3'(D, L1, L2)). sr_get_include_list(D, IncList) :- set_bip_name(sr_get_include_list, 2), '$call_c_test'('SR_Get_Include_List_2'(D, IncList)). sr_get_include_stream_list(D, IncStreamList) :- set_bip_name(sr_get_include_stream_list, 2), '$call_c_test'('SR_Get_Include_Stream_List_2'(D, IncStreamList)). sr_get_size_counters(D, Chars, Lines) :- set_bip_name(sr_get_size_counters, 3), '$call_c_test'('SR_Get_Size_Counters_3'(D, Chars, Lines)). sr_get_error_counters(D, Errors, Warnings) :- set_bip_name(sr_get_error_counters, 3), '$call_c_test'('SR_Get_Error_Counters_3'(D, Errors, Warnings)). sr_set_error_counters(D, Errors, Warnings) :- set_bip_name(sr_set_error_counters, 3), '$call_c'('SR_Set_Error_Counters_3'(D, Errors, Warnings)). sr_write_message(D, Type, Format, Args) :- set_bip_name(sr_write_message, 4), '$call_c'('SR_Write_Message_4'(D, Type, Format, Args)). sr_write_message(D, L1, L2C, Type, Format, Args) :- set_bip_name(sr_write_message, 6), '$call_c'('SR_Write_Message_6'(D, L1, L2C, Type, Format, Args)). sr_write_message(D, IncList, File, L1, L2C, Type, Format, Args) :- set_bip_name(sr_write_message, 8), '$call_c'('SR_Write_Message_8'(D, IncList, File, L1, L2C, Type, Format, Args)). sr_write_error(D, SRError) :- set_bip_name(sr_write_error, 2), '$sr_get_format_args_error'(SRError, L1, L2C, Type, Format, Args), ( var(L1), '$call_c'('SR_Write_Message_4'(D, Type, Format, Args)) ; '$call_c'('SR_Write_Message_6'(D, L1, L2C, Type, Format, Args)) ), !. sr_write_error(_, _). % succes - nothing written for sr_ok sr_write_error(D, L1, L2C, SRError) :- set_bip_name(sr_write_error, 4), '$sr_get_format_args_error'(SRError, EL1, EL2C, Type, Format, Args), ( L1 = EL1, L2C = EL2C ; true ), '$call_c'('SR_Write_Message_6'(D, EL1, EL2C, Type, Format, Args)), !. sr_write_error(_, _, _, _). % succes - nothing written for sr_ok sr_write_error(D, IncList, File, L1, L2C, SRError) :- set_bip_name(sr_write_error, 6), '$sr_get_format_args_error'(SRError, EL1, EL2C, Type, Format, Args), ( L1 = EL1, L2C = EL2C ; true ), '$call_c'('SR_Write_Message_8'(D, IncList, File, EL1, EL2C, Type, Format, Args)), !. sr_write_error(_, _, _, _, _, _). % succes - nothing written for sr_ok '$sr_get_format_args_error'(SRError, _, _, _, _, _) :- var(SRError), '$pl_err_instantiation'. '$sr_get_format_args_error'(SRError, L1, L2C, Type, Format, Args) :- SRError = sr_error(Type, Error), % fail for sr_ok '$sr_simpl_error'(Error, L1, L2C, Format, Args). '$sr_simpl_error'(syntax(Line, Char, Error), Line, L2C, Format, Args) :- !, L2C is -Char, Format = '~a~n', Args = [Error]. '$sr_simpl_error'(existence_error(source_sink, F), _, _, Format, Args) :- !, Format = 'cannot open file ~a - does not exist~n', Args = [F]. '$sr_simpl_error'(permission_error(open, source_sink, F), _, _, Format, Args) :- !, Format = 'cannot open file ~a - permission error~n', Args = [F]. '$sr_simpl_error'(Error, _, _, Format, Args) :- Format = '~w~n', Args = [Error]. sr_error_from_exception(Excep, SRError) :- set_bip_name(sr_error_from_exception, 2), ( var(Excep) -> '$pl_err_instantiation' ; true ), '$sr_error_from_exception'(Excep, SRError). '$sr_error_from_exception'(error(syntax_error(_), _), SRError) :- !, syntax_error_info(_, Line, Char, Error), SRError = sr_error(error, syntax(Line, Char, Error)). '$sr_error_from_exception'(error(Excep, _), sr_error(error, Excep)) :- !. '$sr_error_from_exception'(Excep, sr_error(exception, Excep)). ./gprolog-1.3.0/src/BipsPl/stat.pl0000644004425400513100000000744610547162353015302 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : stat.pl * * Descr.: statistics predicate management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: stat.pl,v 1.11 2007/01/04 10:35:12 diaz Exp $ */ :- built_in. '$use_stat'. statistics :- set_bip_name(statistics, 0), '$call_c'('Statistics_0'). statistics(Key, Values) :- set_bip_name(statistics, 2), '$check_stat_key'(Key), !, ( Values = [Val1, Val2] -> true ; '$pl_err_domain'(statistics_value, Values) ), '$stat'(Key, Val1, Val2). '$check_stat_key'(Key) :- var(Key). '$check_stat_key'(user_time). '$check_stat_key'(runtime). '$check_stat_key'(system_time). '$check_stat_key'(cpu_time). '$check_stat_key'(real_time). '$check_stat_key'(local_stack). '$check_stat_key'(global_stack). '$check_stat_key'(trail_stack). '$check_stat_key'(cstr_stack). '$check_stat_key'(Key) :- '$pl_err_domain'(statistics_key, Key). '$stat'(X, SinceStart, SinceLast) :- ( atom(X) -> ( X = user_time ; X = runtime ), ! ; X = user_time ), '$call_c_test'('Statistics_User_Time_2'(SinceStart, SinceLast)). '$stat'(system_time, SinceStart, SinceLast) :- '$call_c_test'('Statistics_System_Time_2'(SinceStart, SinceLast)). '$stat'(cpu_time, SinceStart, SinceLast) :- '$call_c_test'('Statistics_Cpu_Time_2'(SinceStart, SinceLast)). '$stat'(real_time, SinceStart, SinceLast) :- '$call_c_test'('Statistics_Real_Time_2'(SinceStart, SinceLast)). '$stat'(local_stack, Used, Free) :- '$call_c_test'('Statistics_Local_Stack_2'(Used, Free)). '$stat'(global_stack, Used, Free) :- '$call_c_test'('Statistics_Global_Stack_2'(Used, Free)). '$stat'(trail_stack, Used, Free) :- '$call_c_test'('Statistics_Trail_Stack_2'(Used, Free)). '$stat'(cstr_stack, Used, Free) :- '$call_c_test'('Statistics_Cstr_Stack_2'(Used, Free)). user_time(SinceStart) :- set_bip_name(user_time, 1), '$call_c_test'('User_Time_1'(SinceStart)). system_time(SinceStart) :- set_bip_name(system_time, 1), '$call_c_test'('System_Time_1'(SinceStart)). cpu_time(SinceStart) :- set_bip_name(cpu_time, 1), '$call_c_test'('Cpu_Time_1'(SinceStart)). real_time(SinceStart) :- set_bip_name(real_time, 1), '$call_c_test'('Real_Time_1'(SinceStart)). ./gprolog-1.3.0/src/BipsPl/stream.wam0000644004425400513100000010644710547440332015770 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : stream.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/stream.pl'). predicate('$use_stream'/0,29,static,private,built_in,[ proceed]). predicate(current_input/1,32,static,private,built_in,[ allocate(1), put_atom(current_input,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(0),1), call('$check_stream_or_var'/2), put_unsafe_value(y(0),0), deallocate, call_c('Current_Input_1',[boolean],[x(0)]), proceed]). predicate(current_output/1,40,static,private,built_in,[ allocate(1), put_atom(current_output,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(0),1), call('$check_stream_or_var'/2), put_unsafe_value(y(0),0), deallocate, call_c('Current_Output_1',[boolean],[x(0)]), proceed]). predicate('$check_stream_or_var'/2,48,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(1), get_structure('$stream'/1,0), unify_local_value(x(1)), get_variable(y(0),2), put_value(x(1),0), call('$$check_stream_or_var/2_$aux1'/1), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, put_value(x(0),1), put_atom(stream,0), execute('$pl_err_domain'/2)]). predicate('$$check_stream_or_var/2_$aux1'/1,48,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), proceed, label(1), trust_me_else_fail, call_c('Blt_Integer',[fast_call,boolean],[x(0)]), proceed]). predicate(set_input/1,59,static,private,built_in,[ put_atom(set_input,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Set_Input_1',[],[x(0)]), proceed]). predicate(set_output/1,66,static,private,built_in,[ put_atom(set_output,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Set_Output_1',[],[x(0)]), proceed]). predicate('$set_top_level_streams'/2,73,static,private,built_in,[ call_c('Set_Top_Level_Streams_2',[],[x(0),x(1)]), proceed]). predicate('$set_debugger_streams'/2,79,static,private,built_in,[ call_c('Set_Debugger_Streams_2',[],[x(0),x(1)]), proceed]). predicate(open/3,98,static,private,built_in,[ put_atom(open,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), put_nil(3), execute('$open'/4)]). predicate(open/4,103,static,private,built_in,[ put_atom(open,4), put_integer(4,5), call_c('Set_Bip_Name_2',[],[x(4),x(5)]), execute('$open'/4)]). predicate('$open'/4,108,static,private,built_in,[ allocate(7), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), call('$set_open_defaults'/0), put_value(y(2),0), put_variable(y(4),1), call('$get_open_stm'/2), put_atom('$open_aliases',0), put_variable(y(5),1), call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), put_atom('$open_mirrors',0), put_variable(y(6),1), call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), put_value(y(3),0), call('$get_open_options'/1), put_atom('$open_aliases',0), put_nil(1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom('$open_mirrors',0), put_nil(1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), put_value(y(1),1), put_value(y(4),2), call_c('Open_3',[],[x(0),x(1),x(2)]), put_value(y(5),0), put_value(y(2),1), call('$add_aliases_to_stream'/2), put_unsafe_value(y(6),0), put_value(y(2),1), deallocate, execute('$add_mirrors_to_stream'/2)]). predicate('$set_open_defaults'/0,123,static,private,built_in,[ put_integer(0,0), put_integer(1,1), execute('$sys_var_write'/2)]). predicate('$get_open_stm'/2,129,static,private,built_in,[ execute('$$get_open_stm/2_$aux1'/2)]). predicate('$$get_open_stm/2_$aux1'/2,129,static,private,built_in,[ load_cut_level(2), try_me_else(1), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), cut(x(2)), put_value(x(0),1), put_atom(variable,0), execute('$pl_err_type'/2), label(1), trust_me_else_fail, get_structure('$stream'/1,0), unify_local_value(x(1)), proceed]). predicate('$get_open_options'/1,138,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_value(y(0),0), call('$check_list'/1), put_value(y(0),0), deallocate, execute('$get_open_options1'/1)]). predicate('$get_open_options1'/1,143,static,private,built_in,[ load_cut_level(1), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_variable(y(1),1), call('$get_open_options2'/1), cut(y(1)), put_value(y(0),0), deallocate, execute('$get_open_options1'/1)]). predicate('$get_open_options2'/1,150,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), execute('$pl_err_instantiation'/0), label(1), retry_me_else(15), switch_on_term(3,fail,fail,fail,2), label(2), switch_on_structure([(type/1,4),(reposition/1,6),(eof_action/1,8),(buffering/1,10),(alias/1,12),(mirror/1,14)]), label(3), try_me_else(5), label(4), get_structure(type/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_open_options2/1_$aux1'/1), label(5), retry_me_else(7), label(6), allocate(0), get_structure(reposition/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), call('$$get_open_options2/1_$aux2'/1), put_integer(0,0), put_integer(2,1), deallocate, execute('$sys_var_set_bit'/2), label(7), retry_me_else(9), label(8), allocate(0), get_structure(eof_action/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), call('$$get_open_options2/1_$aux3'/1), put_integer(0,0), put_integer(5,1), deallocate, execute('$sys_var_set_bit'/2), label(9), retry_me_else(11), label(10), allocate(0), get_structure(buffering/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), call('$$get_open_options2/1_$aux4'/1), put_integer(0,0), put_integer(8,1), deallocate, execute('$sys_var_set_bit'/2), label(11), retry_me_else(13), label(12), get_structure(alias/1,0), unify_variable(x(0)), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$$get_open_options2/1_$aux5'/1), label(13), trust_me_else_fail, label(14), allocate(2), get_structure(mirror/1,0), unify_variable(y(0)), get_variable(y(1),1), put_value(y(0),0), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), put_value(y(0),0), call('$$get_open_options2/1_$aux6'/1), cut(y(1)), put_value(y(0),0), call_c('Check_Valid_Mirror_1',[],[x(0)]), put_atom('$open_mirrors',0), put_list(2), unify_value(y(0)), unify_variable(x(1)), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(2)]), put_atom('$open_mirrors',0), call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), deallocate, proceed, label(15), trust_me_else_fail, put_value(x(0),1), put_atom(stream_option,0), execute('$pl_err_domain'/2)]). predicate('$$get_open_options2/1_$aux6'/1,207,static,private,built_in,[ try_me_else(1), get_structure('$stream'/1,0), unify_variable(x(0)), call_c('Blt_Integer',[fast_call,boolean],[x(0)]), proceed, label(1), trust_me_else_fail, call_c('Blt_Atom',[fast_call,boolean],[x(0)]), proceed]). predicate('$$get_open_options2/1_$aux5'/1,199,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Test_Alias_Not_Assigned_1',[boolean],[x(0)]), cut(x(1)), put_atom('$open_aliases',2), put_list(3), unify_local_value(x(0)), unify_variable(x(1)), call_c('Blt_G_Read',[fast_call,boolean],[x(2),x(3)]), put_atom('$open_aliases',0), call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, put_structure(alias/1,2), unify_local_value(x(0)), put_atom(open,0), put_atom(source_sink,1), execute('$pl_err_permission'/3)]). predicate('$$get_open_options2/1_$aux4'/1,185,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(none,3),(line,5),(block,7)]), label(2), try_me_else(4), label(3), allocate(0), get_atom(none,0), put_integer(0,0), put_integer(7,1), call('$sys_var_reset_bit'/2), put_integer(0,0), put_integer(6,1), deallocate, execute('$sys_var_reset_bit'/2), label(4), retry_me_else(6), label(5), allocate(0), get_atom(line,0), put_integer(0,0), put_integer(7,1), call('$sys_var_reset_bit'/2), put_integer(0,0), put_integer(6,1), deallocate, execute('$sys_var_set_bit'/2), label(6), trust_me_else_fail, label(7), allocate(0), get_atom(block,0), put_integer(0,0), put_integer(7,1), call('$sys_var_set_bit'/2), put_integer(0,0), put_integer(6,1), deallocate, execute('$sys_var_reset_bit'/2)]). predicate('$$get_open_options2/1_$aux3'/1,171,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(error,3),(eof_code,5),(reset,7)]), label(2), try_me_else(4), label(3), allocate(0), get_atom(error,0), put_integer(0,0), put_integer(4,1), call('$sys_var_reset_bit'/2), put_integer(0,0), put_integer(3,1), deallocate, execute('$sys_var_reset_bit'/2), label(4), retry_me_else(6), label(5), allocate(0), get_atom(eof_code,0), put_integer(0,0), put_integer(4,1), call('$sys_var_reset_bit'/2), put_integer(0,0), put_integer(3,1), deallocate, execute('$sys_var_set_bit'/2), label(6), trust_me_else_fail, label(7), allocate(0), get_atom(reset,0), put_integer(0,0), put_integer(4,1), call('$sys_var_set_bit'/2), put_integer(0,0), put_integer(3,1), deallocate, execute('$sys_var_reset_bit'/2)]). predicate('$$get_open_options2/1_$aux2'/1,162,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(false,3),(true,5)]), label(2), try_me_else(4), label(3), get_atom(false,0), put_integer(0,0), put_integer(1,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(true,0), put_integer(0,0), put_integer(1,1), execute('$sys_var_set_bit'/2)]). predicate('$$get_open_options2/1_$aux1'/1,154,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(text,3),(binary,5)]), label(2), try_me_else(4), label(3), get_atom(text,0), put_integer(0,0), put_integer(0,1), execute('$sys_var_set_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(binary,0), put_integer(0,0), put_integer(0,1), execute('$sys_var_reset_bit'/2)]). predicate('$add_aliases_to_stream'/2,221,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_variable(x(2)), unify_variable(x(0)), call_c('Add_Stream_Alias_2',[],[x(1),x(2)]), execute('$add_aliases_to_stream'/2)]). predicate('$add_mirrors_to_stream'/2,229,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_variable(x(2)), unify_variable(x(0)), call_c('Add_Stream_Mirror_2',[],[x(1),x(2)]), execute('$add_mirrors_to_stream'/2)]). predicate(close/1,247,static,private,built_in,[ put_atom(close,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_nil(1), execute('$close'/2)]). predicate(close/2,251,static,private,built_in,[ put_atom(close,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), execute('$close'/2)]). predicate('$close'/2,256,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_integer(0,0), put_integer(0,1), call('$sys_var_write'/2), put_value(y(1),0), call('$get_close_options'/1), put_value(y(0),0), deallocate, call_c('Close_1',[],[x(0)]), proceed]). predicate('$get_close_options'/1,264,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_value(y(0),0), call('$check_list'/1), put_value(y(0),0), deallocate, execute('$get_close_options1'/1)]). predicate('$get_close_options1'/1,269,static,private,built_in,[ load_cut_level(1), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_variable(y(1),1), call('$get_close_options2'/1), cut(y(1)), put_value(y(0),0), deallocate, execute('$get_close_options1'/1)]). predicate('$get_close_options2'/1,276,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), execute('$pl_err_instantiation'/0), label(1), retry_me_else(2), get_structure(force/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_close_options2/1_$aux1'/1), label(2), trust_me_else_fail, put_value(x(0),1), put_atom(close_option,0), execute('$pl_err_domain'/2)]). predicate('$$get_close_options2/1_$aux1'/1,280,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(false,3),(true,5)]), label(2), try_me_else(4), label(3), get_atom(false,0), put_integer(0,0), put_integer(0,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(true,0), put_integer(0,0), put_integer(0,1), execute('$sys_var_set_bit'/2)]). predicate(add_stream_alias/2,294,static,private,built_in,[ load_cut_level(2), try_me_else(1), put_atom(add_stream_alias,3), put_integer(2,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('Add_Stream_Alias_2',[boolean],[x(0),x(1)]), cut(x(2)), proceed, label(1), trust_me_else_fail, put_structure(alias/1,2), unify_local_value(x(1)), put_atom(add_alias,0), put_atom(source_sink,1), execute('$pl_err_permission'/3)]). predicate(add_stream_mirror/2,304,static,private,built_in,[ put_atom(add_stream_mirror,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Add_Stream_Mirror_2',[],[x(0),x(1)]), proceed]). predicate(remove_stream_mirror/2,311,static,private,built_in,[ put_atom(remove_stream_mirror,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Remove_Stream_Mirror_2',[boolean],[x(0),x(1)]), proceed]). predicate(set_stream_type/2,318,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(set_stream_type,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(1),0), call('$set_stream_type/2_$aux1'/1), put_value(y(1),0), put_variable(y(3),1), call('$set_stream_type/2_$aux2'/2), cut(y(2)), put_value(y(0),0), put_unsafe_value(y(3),1), deallocate, call_c('Set_Stream_Type_2',[],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, put_atom(stream_type,0), execute('$pl_err_domain'/2)]). predicate('$set_stream_type/2_$aux2'/2,318,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(text,3),(binary,5)]), label(2), try_me_else(4), label(3), get_atom(text,0), get_integer(1,1), proceed, label(4), trust_me_else_fail, label(5), get_atom(binary,0), get_integer(0,1), proceed]). predicate('$set_stream_type/2_$aux1'/1,318,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$pl_err_instantiation'/0), label(1), trust_me_else_fail, proceed]). predicate(set_stream_eof_action/2,337,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(set_stream_eof_action,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(1),0), call('$set_stream_eof_action/2_$aux1'/1), put_value(y(1),0), put_variable(y(3),1), call('$set_stream_eof_action/2_$aux2'/2), cut(y(2)), put_value(y(0),0), put_unsafe_value(y(3),1), deallocate, call_c('Set_Stream_Eof_Action_2',[],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, put_atom(eof_action,0), execute('$pl_err_domain'/2)]). predicate('$set_stream_eof_action/2_$aux2'/2,337,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(error,3),(eof_code,5),(reset,7)]), label(2), try_me_else(4), label(3), get_atom(error,0), get_integer(0,1), proceed, label(4), retry_me_else(6), label(5), get_atom(eof_code,0), get_integer(1,1), proceed, label(6), trust_me_else_fail, label(7), get_atom(reset,0), get_integer(2,1), proceed]). predicate('$set_stream_eof_action/2_$aux1'/1,337,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$pl_err_instantiation'/0), label(1), trust_me_else_fail, proceed]). predicate(set_stream_buffering/2,358,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(set_stream_buffering,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_value(y(1),0), call('$set_stream_buffering/2_$aux1'/1), put_value(y(1),0), put_variable(y(3),1), call('$set_stream_buffering/2_$aux2'/2), cut(y(2)), put_value(y(0),0), put_unsafe_value(y(3),1), deallocate, call_c('Set_Stream_Buffering_2',[],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, put_atom(buffering_mode,0), execute('$pl_err_domain'/2)]). predicate('$set_stream_buffering/2_$aux2'/2,358,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(none,3),(line,5),(block,7)]), label(2), try_me_else(4), label(3), get_atom(none,0), get_integer(0,1), proceed, label(4), retry_me_else(6), label(5), get_atom(line,0), get_integer(1,1), proceed, label(6), trust_me_else_fail, label(7), get_atom(block,0), get_integer(2,1), proceed]). predicate('$set_stream_buffering/2_$aux1'/1,358,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$pl_err_instantiation'/0), label(1), trust_me_else_fail, proceed]). predicate(flush_output/0,379,static,private,built_in,[ put_atom(flush_output,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call_c('Flush_Output_0',[],[]), proceed]). predicate(flush_output/1,383,static,private,built_in,[ put_atom(flush_output,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Flush_Output_1',[],[x(0)]), proceed]). predicate(current_stream/1,390,static,private,built_in,[ allocate(1), put_atom(current_stream,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(0),1), call('$check_stream_or_var'/2), put_unsafe_value(y(0),0), deallocate, execute('$current_stream'/1)]). predicate('$current_stream'/1,398,static,private,built_in,[ call_c('Current_Stream_1',[boolean],[x(0)]), proceed]). predicate('$current_stream_alt'/0,402,static,private,built_in,[ call_c('Current_Stream_Alt_0',[boolean],[]), proceed]). predicate(stream_property/2,408,static,private,built_in,[ load_cut_level(2), allocate(3), get_variable(y(0),1), get_variable(y(1),2), put_atom(stream_property,1), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(2),1), call('$check_stream_or_var'/2), put_value(y(0),0), put_unsafe_value(y(2),1), put_value(y(1),2), deallocate, execute('$stream_property/2_$aux1'/3)]). predicate('$stream_property/2_$aux1'/3,408,static,private,built_in,[ load_cut_level(3), try_me_else(1), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), get_structure(alias/1,0), unify_variable(x(0)), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), cut(x(3)), call_c('From_Alias_To_Stream_2',[boolean],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_value(y(0),0), call('$check_stream_prop'/1), cut(y(2)), put_value(y(1),0), call('$current_stream'/1), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$stream_property1'/2)]). predicate('$check_stream_prop'/1,423,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), proceed, label(1), retry_me_else(28), switch_on_term(4,2,fail,fail,3), label(2), switch_on_atom([(input,9),(output,11)]), label(3), switch_on_structure([(file_name/1,5),(mode/1,7),(alias/1,13),(mirror/1,15),(type/1,17),(reposition/1,19),(eof_action/1,21),(buffering/1,23),(end_of_stream/1,25),(position/1,27)]), label(4), try_me_else(6), label(5), get_structure(file_name/1,0), unify_void(1), proceed, label(6), retry_me_else(8), label(7), get_structure(mode/1,0), unify_void(1), proceed, label(8), retry_me_else(10), label(9), get_atom(input,0), proceed, label(10), retry_me_else(12), label(11), get_atom(output,0), proceed, label(12), retry_me_else(14), label(13), get_structure(alias/1,0), unify_void(1), proceed, label(14), retry_me_else(16), label(15), get_structure(mirror/1,0), unify_void(1), proceed, label(16), retry_me_else(18), label(17), get_structure(type/1,0), unify_void(1), proceed, label(18), retry_me_else(20), label(19), get_structure(reposition/1,0), unify_void(1), proceed, label(20), retry_me_else(22), label(21), get_structure(eof_action/1,0), unify_void(1), proceed, label(22), retry_me_else(24), label(23), get_structure(buffering/1,0), unify_void(1), proceed, label(24), retry_me_else(26), label(25), get_structure(end_of_stream/1,0), unify_void(1), proceed, label(26), trust_me_else_fail, label(27), get_structure(position/1,0), unify_void(1), proceed, label(28), trust_me_else_fail, put_value(x(0),1), put_atom(stream_property,0), execute('$pl_err_domain'/2)]). predicate('$stream_property1'/2,456,static,private,built_in,[ switch_on_term(3,1,fail,fail,2), label(1), switch_on_atom([(input,8),(output,10)]), label(2), switch_on_structure([(file_name/1,4),(mode/1,6),(alias/1,12),(mirror/1,14),(type/1,16),(reposition/1,18),(eof_action/1,20),(buffering/1,22),(position/1,24),(end_of_stream/1,26)]), label(3), try_me_else(5), label(4), get_structure(file_name/1,0), unify_variable(x(0)), call_c('Stream_Prop_File_Name_2',[boolean],[x(0),x(1)]), proceed, label(5), retry_me_else(7), label(6), get_structure(mode/1,0), unify_variable(x(0)), call_c('Stream_Prop_Mode_2',[boolean],[x(0),x(1)]), proceed, label(7), retry_me_else(9), label(8), get_atom(input,0), call_c('Stream_Prop_Input_1',[boolean],[x(1)]), proceed, label(9), retry_me_else(11), label(10), get_atom(output,0), call_c('Stream_Prop_Output_1',[boolean],[x(1)]), proceed, label(11), retry_me_else(13), label(12), get_variable(x(2),1), get_structure(alias/1,0), unify_variable(x(1)), put_value(x(2),0), execute('$current_alias'/2), label(13), retry_me_else(15), label(14), allocate(2), get_structure(mirror/1,0), unify_variable(y(0)), put_value(x(1),0), put_variable(y(1),1), call('$current_mirror'/2), put_value(y(0),0), get_structure('$stream'/1,0), unify_local_value(y(1)), deallocate, proceed, label(15), retry_me_else(17), label(16), get_structure(type/1,0), unify_variable(x(0)), call_c('Stream_Prop_Type_2',[boolean],[x(0),x(1)]), proceed, label(17), retry_me_else(19), label(18), get_structure(reposition/1,0), unify_variable(x(0)), call_c('Stream_Prop_Reposition_2',[boolean],[x(0),x(1)]), proceed, label(19), retry_me_else(21), label(20), get_structure(eof_action/1,0), unify_variable(x(0)), call_c('Stream_Prop_Eof_Action_2',[boolean],[x(0),x(1)]), proceed, label(21), retry_me_else(23), label(22), get_structure(buffering/1,0), unify_variable(x(0)), call_c('Stream_Prop_Buffering_2',[boolean],[x(0),x(1)]), proceed, label(23), retry_me_else(25), label(24), get_variable(x(2),1), get_structure(position/1,0), unify_variable(x(1)), put_structure('$stream'/1,0), unify_local_value(x(2)), execute('$stream_position'/2), label(25), trust_me_else_fail, label(26), get_structure(end_of_stream/1,0), unify_variable(x(0)), call_c('Stream_Prop_End_Of_Stream_2',[boolean],[x(0),x(1)]), proceed]). predicate(at_end_of_stream/0,497,static,private,built_in,[ put_atom(at_end_of_stream,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call_c('At_End_Of_Stream_0',[boolean],[]), proceed]). predicate(at_end_of_stream/1,501,static,private,built_in,[ put_atom(at_end_of_stream,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('At_End_Of_Stream_1',[boolean],[x(0)]), proceed]). predicate(current_alias/2,508,static,private,built_in,[ allocate(2), get_variable(y(0),1), put_atom(current_alias,1), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(1),1), call('$check_stream_or_var'/2), put_value(y(0),0), put_unsafe_value(y(1),1), deallocate, execute('$current_alias/2_$aux1'/2)]). predicate('$current_alias/2_$aux1'/2,508,static,private,built_in,[ load_cut_level(2), try_me_else(1), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), cut(x(2)), call_c('From_Alias_To_Stream_2',[boolean],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_value(y(1),0), call('$current_stream'/1), put_value(y(1),0), put_value(y(0),1), deallocate, execute('$current_alias'/2)]). predicate('$current_alias'/2,520,static,private,built_in,[ call_c('Current_Alias_2',[boolean],[x(0),x(1)]), proceed]). predicate('$current_alias_alt'/0,523,static,private,built_in,[ call_c('Current_Alias_Alt_0',[boolean],[]), proceed]). predicate(current_mirror/2,529,static,private,built_in,[ allocate(3), get_variable(y(0),1), put_atom(current_mirror,1), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(1),1), call('$check_stream_or_var'/2), put_value(y(0),0), put_variable(y(2),1), call('$check_stream_or_var'/2), put_value(y(1),0), call('$current_stream'/1), put_unsafe_value(y(1),0), put_unsafe_value(y(2),1), deallocate, execute('$current_mirror'/2)]). predicate('$current_mirror'/2,539,static,private,built_in,[ call_c('Current_Mirror_2',[boolean],[x(0),x(1)]), proceed]). predicate('$current_mirror_alt'/0,542,static,private,built_in,[ call_c('Current_Mirror_Alt_0',[boolean],[]), proceed]). predicate(stream_position/2,548,static,private,built_in,[ put_atom(stream_position,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), execute('$stream_position'/2)]). predicate('$stream_position'/2,553,static,private,built_in,[ call_c('Stream_Position_2',[boolean],[x(0),x(1)]), proceed]). predicate(set_stream_position/2,559,static,private,built_in,[ put_atom(set_stream_position,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Set_Stream_Position_2',[boolean],[x(0),x(1)]), proceed]). predicate(seek/4,566,static,private,built_in,[ put_atom(seek,4), put_integer(4,5), call_c('Set_Bip_Name_2',[],[x(4),x(5)]), call_c('Seek_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). predicate(character_count/2,573,static,private,built_in,[ put_atom(character_count,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Character_Count_2',[boolean],[x(0),x(1)]), proceed]). predicate(line_count/2,580,static,private,built_in,[ put_atom(line_count,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Line_Count_2',[boolean],[x(0),x(1)]), proceed]). predicate(line_position/2,587,static,private,built_in,[ put_atom(line_position,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Line_Position_2',[boolean],[x(0),x(1)]), proceed]). predicate(stream_line_column/3,594,static,private,built_in,[ put_atom(stream_line_column,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('Stream_Line_Column_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(set_stream_line_column/3,601,static,private,built_in,[ put_atom(set_stream_line_column,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), call_c('Set_Stream_Line_Column_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate(open_input_atom_stream/2,614,static,private,built_in,[ allocate(2), get_variable(y(0),0), put_atom(open_input_atom_stream,0), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(0),x(2)]), put_value(x(1),0), put_variable(y(1),1), call('$get_open_stm'/2), put_integer(0,0), put_integer(1,1), call('$sys_var_write'/2), put_value(y(0),0), put_unsafe_value(y(1),1), deallocate, call_c('Open_Input_Term_Stream_2',[],[x(0),x(1)]), proceed]). predicate(open_input_chars_stream/2,623,static,private,built_in,[ allocate(2), get_variable(y(0),0), put_atom(open_input_chars_stream,0), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(0),x(2)]), put_value(x(1),0), put_variable(y(1),1), call('$get_open_stm'/2), put_integer(0,0), put_integer(2,1), call('$sys_var_write'/2), put_value(y(0),0), put_unsafe_value(y(1),1), deallocate, call_c('Open_Input_Term_Stream_2',[],[x(0),x(1)]), proceed]). predicate(open_input_codes_stream/2,632,static,private,built_in,[ allocate(2), get_variable(y(0),0), put_atom(open_input_codes_stream,0), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(0),x(2)]), put_value(x(1),0), put_variable(y(1),1), call('$get_open_stm'/2), put_integer(0,0), put_integer(3,1), call('$sys_var_write'/2), put_value(y(0),0), put_unsafe_value(y(1),1), deallocate, call_c('Open_Input_Term_Stream_2',[],[x(0),x(1)]), proceed]). predicate(close_input_atom_stream/1,641,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(close_input_atom_stream,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(1,1), call('$sys_var_write'/2), put_value(y(0),0), deallocate, call_c('Close_Input_Term_Stream_1',[],[x(0)]), proceed]). predicate(close_input_chars_stream/1,649,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(close_input_chars_stream,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(2,1), call('$sys_var_write'/2), put_value(y(0),0), deallocate, call_c('Close_Input_Term_Stream_1',[],[x(0)]), proceed]). predicate(close_input_codes_stream/1,657,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(close_input_codes_stream,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(3,1), call('$sys_var_write'/2), put_value(y(0),0), deallocate, call_c('Close_Input_Term_Stream_1',[],[x(0)]), proceed]). predicate(open_output_atom_stream/1,665,static,private,built_in,[ allocate(1), put_atom(open_output_atom_stream,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(0),1), call('$get_open_stm'/2), put_integer(0,0), put_integer(1,1), call('$sys_var_write'/2), put_unsafe_value(y(0),0), deallocate, call_c('Open_Output_Term_Stream_1',[],[x(0)]), proceed]). predicate(open_output_chars_stream/1,674,static,private,built_in,[ allocate(1), put_atom(open_output_chars_stream,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(0),1), call('$get_open_stm'/2), put_integer(0,0), put_integer(2,1), call('$sys_var_write'/2), put_unsafe_value(y(0),0), deallocate, call_c('Open_Output_Term_Stream_1',[],[x(0)]), proceed]). predicate(open_output_codes_stream/1,683,static,private,built_in,[ allocate(1), put_atom(open_output_codes_stream,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(0),1), call('$get_open_stm'/2), put_integer(0,0), put_integer(3,1), call('$sys_var_write'/2), put_unsafe_value(y(0),0), deallocate, call_c('Open_Output_Term_Stream_1',[],[x(0)]), proceed]). predicate(close_output_atom_stream/2,692,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(close_output_atom_stream,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(1,1), call('$sys_var_write'/2), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Close_Output_Term_Stream_2',[boolean],[x(0),x(1)]), proceed]). predicate(close_output_chars_stream/2,700,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(close_output_chars_stream,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(2,1), call('$sys_var_write'/2), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Close_Output_Term_Stream_2',[boolean],[x(0),x(1)]), proceed]). predicate(close_output_codes_stream/2,708,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(close_output_codes_stream,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_integer(0,0), put_integer(3,1), call('$sys_var_write'/2), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Close_Output_Term_Stream_2',[boolean],[x(0),x(1)]), proceed]). ./gprolog-1.3.0/src/BipsPl/call.pl0000644004425400513100000001107710547162351015233 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : call.pl * * Descr.: meta call management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: call.pl,v 1.12 2007/01/04 10:35:08 diaz Exp $ */ :- built_in. '$use_call'. once(Goal) :- call(Goal), !. \+ Goal :- ( call(Goal) -> fail ; true ). call_det(Goal, Deterministic) :- ( nonvar(Deterministic), Deterministic \== false, Deterministic \== true -> set_bip_name(call, 2), '$pl_err_type'(boolean, Deterministic) ; true ), '$get_current_B'(B), call(Goal), '$get_current_B'(B1), ( B1 > B -> Deterministic = false ; Deterministic = true ). '$call'(Goal, Func, Arity, DebugCall) :- '$call_c'('Save_Call_Info_3'(Func, Arity, DebugCall)), '$call1'(Goal, 0). '$call1'(Goal, CallInfo) :- '$call_c'('Load_Call_Info_Arg_1'(1)), % to ensure CallInfo is deref '$call_internal'(Goal, CallInfo). '$call_internal'(Goal, CallInfo) :- '$call_c'('Call_Info_Bip_Name_1'(CallInfo)), ( var(Goal) -> '$pl_err_instantiation' ; true ), '$term_to_goal'(Goal, CallInfo, Goal1), '$call_internal1'(Goal1, CallInfo). '$call_internal1'(Goal, CallInfo) :- '$get_cut_level'(VarCut), % must be the first goal (A(2)=cut) '$call_internal_with_cut'(Goal, CallInfo, VarCut). % also called by C code BC_Emulate_Clause '$call_internal_with_cut'((P, Q), CallInfo, VarCut) :- !, '$call_internal_with_cut'(P, CallInfo, VarCut), '$call_internal_with_cut'(Q, CallInfo, VarCut). '$call_internal_with_cut'((P ; Q), CallInfo, VarCut) :- !, '$call_internal_or'(P, Q, CallInfo, VarCut). '$call_internal_with_cut'(!, _CallInfo, VarCut) :- % !, this cut is useless because '$cut'/1 '$cut'(VarCut). '$call_internal_with_cut'((P -> Q), CallInfo, VarCut) :- !, '$call_internal'(P, CallInfo), !, '$call_internal_with_cut'(Q, CallInfo, VarCut). '$call_internal_with_cut'(fail, _CallInfo, _VarCut) :- !, fail. '$call_internal_with_cut'(true, _CallInfo, _VarCut) :- !. '$call_internal_with_cut'(call(Goal), CallInfo, _VarCut) :- !, '$call_internal'(Goal, CallInfo). '$call_internal_with_cut'(catch(Goal, Catch, Recovery), CallInfo, _VarCut) :- !, '$catch_internal'(Goal, Catch, Recovery, CallInfo). '$call_internal_with_cut'(throw(Ball), CallInfo, _VarCut) :- !, '$throw_internal'(Ball, CallInfo). '$call_internal_with_cut'(P, CallInfo, _VarCut) :- '$call_c_jump'('BC_Call_Terminal_Pred_3'(P, CallInfo, 1)). '$call_internal_or'((P -> Q), R, CallInfo, VarCut) :- !, ( '$call_internal'(P, CallInfo), !, '$call_internal_with_cut'(Q, CallInfo, VarCut) ; '$call_internal_with_cut'(R, CallInfo, VarCut) ). '$call_internal_or'(P, _, CallInfo, VarCut) :- '$call_internal_with_cut'(P, CallInfo, VarCut). '$call_internal_or'(_, Q, CallInfo, VarCut) :- '$call_internal_with_cut'(Q, CallInfo, VarCut). '$call_from_debugger'(Goal, CallInfo) :- '$call_c_jump'('BC_Call_Terminal_Pred_3'(Goal, CallInfo, 0)). ./gprolog-1.3.0/src/BipsPl/scan_supp.c0000644004425400513100000004331510547154137016125 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : scan_supp.c * * Descr.: scanner support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: scan_supp.c,v 1.11 2007/01/04 10:35:11 diaz Exp $ */ #include #include #include #include #include #include #define SCAN_SUPP_FILE #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static int c_orig, c; /* for read */ static int c_type; static char *err_msg; /* parser variables */ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static int Read_Next_Char(StmInf *pstm, Bool convert); static void Scan_Number(StmInf *pstm, Bool integer_only); static void Scan_Quoted(StmInf *pstm); static int Scan_Quoted_Char(StmInf *pstm, Bool convert, int c0, Bool no_escape); #define Unget_Last_Char Stream_Ungetc(c_orig, pstm) /*-------------------------------------------------------------------------* * SCAN_PEEK_CHAR * * * *-------------------------------------------------------------------------*/ int Scan_Peek_Char(StmInf *pstm, Bool convert) { int c_look; c_look = Stream_Peekc(pstm); if (convert) c_look = Char_Conversion(c_look); return c_look; } /*-------------------------------------------------------------------------* * READ_NEXT_CHAR * * * *-------------------------------------------------------------------------*/ static int Read_Next_Char(StmInf *pstm, Bool convert) { c_orig = c = Stream_Getc(pstm); if (c == EOF) c_type = 0; else { if (convert) c = Char_Conversion(c); c_type = char_type[c]; } return c; } /*-------------------------------------------------------------------------* * SCAN_TOKEN * * * * Scan the next token. The flag comma_is_punct specifies if ',' must be * * considered as a punctuation (e.g. separator of args of compound term or * * of a list) or as an atom. * * The scanner only consumes the needed characters of the token, calling * * Unget_Last_Char if necessary (see Scan_Number). Thus after a token has * * been read Stream_Peekc() will return the character directly following * * this token. * *-------------------------------------------------------------------------*/ char * Scan_Token(StmInf *pstm, Bool comma_is_punct) { int c0; char *s; Bool layout_before = FALSE; err_msg = NULL; start_scan: for (;;) { Read_Next_Char(pstm, TRUE); if (c_type != LA) /* layout character */ break; layout_before = TRUE; } token.line = pstm->line_count + 1; token.col = pstm->line_pos; if (c == EOF) { token.type = TOKEN_END_OF_FILE; return err_msg; } switch (c_type) { case SL: /* small letter */ case UL: /* underline */ case CL: /* capital letter */ token.type = (c_type == SL) ? TOKEN_NAME : TOKEN_VARIABLE; s = token.name; do { *s++ = c; Read_Next_Char(pstm, TRUE); } while (c_type & (UL | CL | SL | DI)); *s = '\0'; Unget_Last_Char; break; case DI: /* digit */ Scan_Number(pstm, FALSE); break; case QT: /* quote */ case DQ: /* double quote */ case BQ: /* back quote */ Scan_Quoted(pstm); break; case GR: /* graphic */ c0 = c; Read_Next_Char(pstm, TRUE); if (c0 == '.' && (c == EOF || (c_type & (LA | CM)))) { if (c_type == CM) Unget_Last_Char; token.type = TOKEN_FULL_STOP; break; } if (c0 == '/' && c == '*') /* comment */ { Read_Next_Char(pstm, TRUE); if (c != EOF) do { c0 = c; Read_Next_Char(pstm, TRUE); } while (c != EOF && (c0 != '*' || c != '/')); if (c == EOF) { token.type = TOKEN_END_OF_FILE; token.line = pstm->line_count + 1; token.col = pstm->line_pos; err_msg = "*/ expected here for /*...*/ comment"; break; } layout_before = TRUE; goto start_scan; } token.type = TOKEN_NAME; s = token.name; *s++ = c0; while (c_type == GR) { *s++ = c; Read_Next_Char(pstm, TRUE); } *s = '\0'; Unget_Last_Char; break; case CM: /* comment character */ do Read_Next_Char(pstm, TRUE); while (c != '\n' && c != EOF); if (c == EOF) { token.type = TOKEN_END_OF_FILE; token.line = pstm->line_count + 1; token.col = pstm->line_pos; err_msg = "new-line expected here for %%... comment"; break; } layout_before = TRUE; goto start_scan; case PC: /* punctuation character */ if (c == '(' && !layout_before) { token.type = TOKEN_IMMEDIAT_OPEN; break; } token.type = TOKEN_PUNCTUATION; token.punct = c; break; case SC: /* solo character */ if (c == ',' && comma_is_punct) { token.type = TOKEN_PUNCTUATION; token.punct = c; break; } token.type = TOKEN_NAME; token.name[0] = c; token.name[1] = '\0'; break; case EX: /* extended character */ token.type = TOKEN_EXTENDED; token.name[0] = c; token.name[1] = '\0'; break; } return err_msg; } /*-------------------------------------------------------------------------* * SCAN_NUMBER * * * *-------------------------------------------------------------------------*/ static void Scan_Number(StmInf *pstm, Bool integer_only) { int lg; int radix, i; char *p, *f; int c_orig0; p = token.name; do { *p++ = c; Read_Next_Char(pstm, TRUE); } while (c_type == DI); lg = p - token.name; if (!integer_only && /* float if . and digit */ c == '.' && isdigit(Scan_Peek_Char(pstm, TRUE))) goto is_a_float; /* integer number */ token.type = TOKEN_INTEGER; *p++ = '\0'; sscanf(token.name, "%ld", &token.int_num); if (lg != 1 || token.int_num != 0 || strchr("'bBoOxX", c) == NULL) goto push_back; if (c == '\'') /* 0' */ { c = Scan_Quoted_Char(pstm, TRUE, '\'', FALSE); if (c == -1) /* is ' */ { token.line = pstm->line_count + 1; token.col = pstm->line_pos + 1; err_msg = "quote character expected here"; } if (c == -2 || c == -3) { Unget_Last_Char; token.line = pstm->line_count + 1; token.col = pstm->line_pos + 1; err_msg = "character expected here"; } token.int_num = c; return; } radix = (c == 'b' || c == 'B') ? (f = "01", 2) : (c == 'o' || c == 'O') ? (f = "01234567", 8) : (f = "0123456789abcdefABCDEF", 16); p = token.name; Read_Next_Char(pstm, TRUE); token.int_num = 0; while ((p = strchr(f, c)) != NULL) { i = p - f; if (i >= 16) i -= 6; token.int_num = token.int_num * radix + i; Read_Next_Char(pstm, TRUE); } goto push_back; is_a_float: /* float number */ token.type = TOKEN_FLOAT; *p++ = '.'; Read_Next_Char(pstm, TRUE); while (c_type == DI) { *p++ = c; Read_Next_Char(pstm, TRUE); } if (c == 'e' || c == 'E') { c_orig0 = c_orig; Read_Next_Char(pstm, TRUE); if (!(c_type == DI || ((c == '+' || c == '-') && isdigit(Scan_Peek_Char(pstm, TRUE))))) { Unget_Last_Char; c_orig = c_orig0; goto end_float; } *p++ = 'e'; *p++ = c; Read_Next_Char(pstm, TRUE); while (c_type == DI) { *p++ = c; Read_Next_Char(pstm, TRUE); } } end_float: *p = '\0'; sscanf(token.name, "%lf", &token.float_num); push_back: Unget_Last_Char; } /*-------------------------------------------------------------------------* * SCAN_QUOTED * * * *-------------------------------------------------------------------------*/ static void Scan_Quoted(StmInf *pstm) { int c0; char *s; Bool convert = (c_orig != '\''); Bool no_escape; int i = 0; if (c_type == QT) { token.type = TOKEN_NAME; i = 0; } else if (c_type == DQ) { token.type = TOKEN_STRING; i = Flag_Value(FLAG_DOUBLE_QUOTES); } else { token.type = TOKEN_BACK_QUOTED; i = Flag_Value(FLAG_BACK_QUOTES); } s = token.name; c0 = c; no_escape = i >> FLAG_NO_ESCAPE_BIT; for (;;) { c = Scan_Quoted_Char(pstm, convert, c0, no_escape); if (c == -1) { *s = '\0'; return; } if (c == -2) /* EOF or \n */ break; if (c == -3) /* \ followed by \n */ continue; *s++ = c; } /* error */ *s = '\0'; if (err_msg) return; Unget_Last_Char; token.line = pstm->line_count + 1; token.col = pstm->line_pos + 1; switch (token.type) { case TOKEN_NAME: err_msg = "quote character expected here"; break; case TOKEN_BACK_QUOTED: err_msg = "back quote character expected here"; break; case TOKEN_STRING: err_msg = "double quote character expected here"; break; default: /* to avoid compiler warning */ ; } } /*-------------------------------------------------------------------------* * SCAN_QUOTED_CHAR * * * *-------------------------------------------------------------------------*/ static int Scan_Quoted_Char(StmInf *pstm, Bool convert, int c0, Bool no_escape) { int radix; char *p, *f; int x, i; Read_Next_Char(pstm, convert); if (c == c0) { if (Scan_Peek_Char(pstm, convert) != c0) /* '' or "" or `` */ return -1; Read_Next_Char(pstm, convert); return c; } if (c == EOF || c == '\n') return -2; if (c != '\\' || no_escape) return c; /* escape sequence */ Read_Next_Char(pstm, convert); if (c == '\n') /* \ followed by \n */ return -3; if (strchr("\\'\"`", c)) /* \\ or \' or \" or \` */ return c; if ((p = (char *) strchr(escape_symbol, c))) /* \a \b \f \n \r \t \v */ return escape_char[p - escape_symbol]; if (c == 'x' || ('0' <= c && c <= '7')) /* \xnn\ \nn\ */ { if (c == 'x') { radix = 16; f = "0123456789abcdefABCDEF"; x = 0; } else { radix = 8; f = "01234567"; x = c - '0'; } Read_Next_Char(pstm, convert); while ((p = strchr(f, c)) != NULL) { i = p - f; if (i >= 16) i -= 6; x = x * radix + i; Read_Next_Char(pstm, convert); } if (!Is_Valid_Code(x) && err_msg == NULL) { token.line = pstm->line_count + 1; token.col = pstm->line_pos; err_msg = "invalid character code in \\constant\\ sequence"; } if (c != '\\') { if (err_msg == NULL) { token.line = pstm->line_count + 1; token.col = pstm->line_pos; err_msg = "\\ expected in \\constant\\ sequence"; } Unget_Last_Char; } return (int) (unsigned char) x; } if (err_msg == NULL) { token.line = pstm->line_count + 1; token.col = pstm->line_pos; err_msg = "unknown escape sequence"; } return 0; } /*-------------------------------------------------------------------------* * RECOVER_AFTER_ERROR * * * * Finds the next full stop (to restart after an error) * *-------------------------------------------------------------------------*/ void Recover_After_Error(StmInf *pstm) #define Next_Char Read_Next_Char(pstm, convert); if (c == EOF) return { int c0; Bool convert; if (pstm->eof_reached) return; for (;;) { loop: convert = FALSE; Next_Char; if (c == '.') { Next_Char; if (c_type & (LA | CM)) return; /* full stop found */ } if ((c_type & (QT | DQ | BQ)) == 0) continue; /* quoted token */ c0 = c; convert = (c_orig != '\''); for (;;) { Next_Char; if (c == c0) /* detect end of token - also for '' or "" or `` */ break; if (c != '\\') continue; /* escape sequence */ Next_Char; if (c == '\n') /* \ followed by \n */ continue; if (strchr("\\'\"`", c)) /* \\ or \' or \" or \` " */ continue; if (strchr(escape_symbol, c)) /* \a \b \f \n \r \t \v */ continue; if (c != 'x' && (c < '0' || c > '7')) continue; for (;;) /* \xnn\ \nn\ */ { /* simply find terminal \ */ Next_Char; if (c == c0) goto loop; if (c == '\\' || !isxdigit(c)) break; } } } } /* Other Scanner facilities */ /*-------------------------------------------------------------------------* * SCAN_NEXT_ATOM * * * * Scan the next atom. * *-------------------------------------------------------------------------*/ char * Scan_Next_Atom(StmInf *pstm) { char *s; do Read_Next_Char(pstm, TRUE); while (c_type == LA); /* layout character */ token.line = pstm->line_count + 1; token.col = pstm->line_pos; switch (c_type) { case SL: /* small letter */ s = token.name; do { *s++ = c; Read_Next_Char(pstm, TRUE); } while (c_type & (UL | CL | SL | DI)); *s = '\0'; Unget_Last_Char; break; case DQ: /* double quote */ if ((Flag_Value(FLAG_DOUBLE_QUOTES) & FLAG_AS_PART_MASK) != FLAG_AS_ATOM) goto error; goto do_scan_quoted; case BQ: /* back quote */ if ((Flag_Value(FLAG_BACK_QUOTES) & FLAG_AS_PART_MASK) != FLAG_AS_ATOM) goto error; case QT: /* quote */ do_scan_quoted: err_msg = NULL; Scan_Quoted(pstm); if (err_msg) return err_msg; break; case GR: /* graphic */ s = token.name; while (c_type == GR) { *s++ = c; Read_Next_Char(pstm, TRUE); } *s = '\0'; Unget_Last_Char; break; case SC: /* solo character */ token.name[0] = c; token.name[1] = '\0'; break; default: error: Unget_Last_Char; return "cannot start an atom (use quotes ?)"; } token.type = TOKEN_NAME; return NULL; } /*-------------------------------------------------------------------------* * SCAN_NEXT_NUMBER * * * * Scan the next number (integer if integer_only is TRUE). * *-------------------------------------------------------------------------*/ char * Scan_Next_Number(StmInf *pstm, Bool integer_only) { Bool minus_op = FALSE; for (;;) { Read_Next_Char(pstm, TRUE); if (c_type != LA) /* layout character */ break; } token.line = pstm->line_count + 1; token.col = pstm->line_pos; if (c == '-' && isdigit(Scan_Peek_Char(pstm, FALSE))) /* negative number */ { Read_Next_Char(pstm, TRUE); minus_op = TRUE; } if (c_type != DI) { Unget_Last_Char; return "cannot start a number"; } Scan_Number(pstm, integer_only); if (minus_op) { if (token.type == TOKEN_INTEGER) token.int_num = -token.int_num; else token.float_num = -token.float_num; } return NULL; } ./gprolog-1.3.0/src/BipsPl/c_supp.h0000644004425400513100000001736110547154134015427 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : c_supp.h * * Descr.: C interface support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: c_supp.h,v 1.10 2007/01/04 10:35:08 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ long Rd_Integer_Check(WamWord start_word); long Rd_Integer(WamWord start_word); long Rd_Positive_Check(WamWord start_word); long Rd_Positive(WamWord start_word); double Rd_Float_Check(WamWord start_word); double Rd_Float(WamWord start_word); double Rd_Number_Check(WamWord start_word); double Rd_Number(WamWord start_word); int Rd_Atom_Check(WamWord start_word); int Rd_Atom(WamWord start_word); int Rd_Boolean_Check(WamWord start_word); int Rd_Boolean(WamWord start_word); int Rd_Char_Check(WamWord start_word); int Rd_Char(WamWord start_word); int Rd_In_Char_Check(WamWord start_word); int Rd_In_Char(WamWord start_word); int Rd_Code_Check(WamWord start_word); int Rd_Code(WamWord start_word); int Rd_In_Code_Check(WamWord start_word); int Rd_In_Code(WamWord start_word); int Rd_Byte_Check(WamWord start_word); int Rd_Byte(WamWord start_word); int Rd_In_Byte_Check(WamWord start_word); int Rd_In_Byte(WamWord start_word); char *Rd_String_Check(WamWord start_word); char *Rd_String(WamWord start_word); char *Rd_Chars_Check(WamWord start_word); char *Rd_Chars(WamWord start_word); char *Rd_Codes_Check(WamWord start_word); char *Rd_Codes(WamWord start_word); int Rd_Chars_Str_Check(WamWord start_word, char *str); int Rd_Chars_Str(WamWord start_word, char *str); int Rd_Codes_Str_Check(WamWord start_word, char *str); int Rd_Codes_Str(WamWord start_word, char *str); WamWord *Rd_List_Check(WamWord start_word); WamWord *Rd_List(WamWord start_word); int Rd_Proper_List_Check(WamWord start_word, WamWord *arg); int Rd_Proper_List(WamWord start_word, WamWord *arg); WamWord *Rd_Compound_Check(WamWord start_word, int *func, int *arity); WamWord *Rd_Compound(WamWord start_word, int *func, int *arity); WamWord *Rd_Callable_Check(WamWord start_word, int *func, int *arity); WamWord *Rd_Callable(WamWord start_word, int *func, int *arity); void Check_For_Un_Integer(WamWord start_word); void Check_For_Un_Positive(WamWord start_word); void Check_For_Un_Float(WamWord start_word); void Check_For_Un_Number(WamWord start_word); void Check_For_Un_Atom(WamWord start_word); void Check_For_Un_Boolean(WamWord start_word); void Check_For_Un_Char(WamWord start_word); void Check_For_Un_In_Char(WamWord start_word); void Check_For_Un_Code(WamWord start_word); void Check_For_Un_In_Code(WamWord start_word); void Check_For_Un_Byte(WamWord start_word); void Check_For_Un_In_Byte(WamWord start_word); void Check_For_Un_String(WamWord start_word); void Check_For_Un_Chars(WamWord start_word); void Check_For_Un_Codes(WamWord start_word); void Check_For_Un_List(WamWord start_word); void Check_For_Un_Compound(WamWord start_word); void Check_For_Un_Callable(WamWord start_word); void Check_For_Un_Variable(WamWord start_word); Bool Un_Integer_Check(long value, WamWord start_word); Bool Un_Integer(long value, WamWord start_word); Bool Un_Positive_Check(long value, WamWord start_word); Bool Un_Positive(long value, WamWord start_word); Bool Un_Float_Check(double value, WamWord start_word); Bool Un_Float(double value, WamWord start_word); Bool Un_Number_Check(double value, WamWord start_word); Bool Un_Number(double value, WamWord start_word); Bool Un_Atom_Check(int value, WamWord start_word); Bool Un_Atom(int value, WamWord start_word); Bool Un_Boolean_Check(int value, WamWord start_word); Bool Un_Boolean(int value, WamWord start_word); Bool Un_Char_Check(int value, WamWord start_word); Bool Un_Char(int value, WamWord start_word); Bool Un_In_Char_Check(int value, WamWord start_word); Bool Un_In_Char(int value, WamWord start_word); Bool Un_Code_Check(int value, WamWord start_word); Bool Un_Code(int value, WamWord start_word); Bool Un_In_Code_Check(int value, WamWord start_word); Bool Un_In_Code(int value, WamWord start_word); Bool Un_Byte_Check(int value, WamWord start_word); Bool Un_Byte(int value, WamWord start_word); Bool Un_In_Byte_Check(int value, WamWord start_word); Bool Un_In_Byte(int value, WamWord start_word); Bool Un_String_Check(char *value, WamWord start_word); Bool Un_String(char *value, WamWord start_word); Bool Un_Chars_Check(char *value, WamWord start_word); Bool Un_Chars(char *value, WamWord start_word); Bool Un_Codes_Check(char *value, WamWord start_word); Bool Un_Codes(char *value, WamWord start_word); Bool Un_List_Check(WamWord *arg, WamWord start_word); Bool Un_List(WamWord *arg, WamWord start_word); Bool Un_Proper_List_Check(int n, WamWord *arg, WamWord start_word); Bool Un_Proper_List(int n, WamWord *arg, WamWord start_word); Bool Un_Compound_Check(int func, int arity, WamWord *arg, WamWord start_word); Bool Un_Compound(int func, int arity, WamWord *arg, WamWord start_word); Bool Un_Callable_Check(int func, int arity, WamWord *arg, WamWord start_word); Bool Un_Callable(int func, int arity, WamWord *arg, WamWord start_word); Bool Un_Term(WamWord term_word, WamWord start_word); WamWord Mk_Integer(long value); WamWord Mk_Positive(long value); WamWord Mk_Float(double value); WamWord Mk_Number(double value); WamWord Mk_Atom(int value); WamWord Mk_Boolean(int value); WamWord Mk_Char(int value); WamWord Mk_In_Char(int value); WamWord Mk_Code(int value); WamWord Mk_In_Code(int value); WamWord Mk_Byte(int value); WamWord Mk_In_Byte(int value); WamWord Mk_String(char *value); WamWord Mk_Chars(char *value); WamWord Mk_Codes(char *value); WamWord Mk_List(WamWord *arg); WamWord Mk_Proper_List(int n, WamWord *arg); WamWord Mk_Compound(int func, int arity, WamWord *arg); WamWord Mk_Callable(int func, int arity, WamWord *arg); WamWord Mk_Variable(void); ./gprolog-1.3.0/src/BipsPl/throw.wam0000644004425400513100000000263610547440331015632 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : throw.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/throw.pl'). predicate('$use_throw'/0,29,static,private,built_in,[ proceed]). predicate('$throw'/4,32,static,private,built_in,[ call_c('Save_Call_Info_3',[],[x(1),x(2),x(3)]), put_integer(0,1), execute('$throw1'/2)]). predicate('$throw1'/2,37,static,private,built_in,[ put_integer(1,2), call_c('Load_Call_Info_Arg_1',[],[x(2)]), execute('$throw_internal'/2)]). predicate('$throw_internal'/2,42,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_value(y(0),0), call('$$throw_internal/2_$aux1'/2), put_integer(8,0), put_value(y(0),1), call('$sys_var_put'/2), put_value(y(0),0), deallocate, execute('$unwind'/1)]). predicate('$$throw_internal/2_$aux1'/2,42,static,private,built_in,[ load_cut_level(2), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(2)), call_c('Call_Info_Bip_Name_1',[],[x(1)]), execute('$pl_err_instantiation'/0), label(1), trust_me_else_fail, proceed]). predicate('$unwind'/1,54,static,private,built_in,[ allocate(2), get_variable(y(0),0), put_integer(7,0), put_variable(y(1),1), call('$sys_var_read'/2), put_value(y(0),0), put_unsafe_value(y(1),1), call_c('Throw_2',[],[x(0),x(1)]), fail]). ./gprolog-1.3.0/src/BipsPl/foreign.pl0000644004425400513100000000430210547162352015743 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : foreign.pl * * Descr.: foreign interface * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: foreign.pl,v 1.11 2007/01/04 10:35:10 diaz Exp $ */ :- built_in. % $force_foreign_link is used by pl2wam to force the link of % foreign.o and then foreign_supp.o needed by Ma2Asm for translations % using foreign_long[] and foreign_double[] indirectly via registers '$force_foreign_link'. '$pl_query_recover_alt' :- % used by C code to create a choice-point '$call_c'('Pl_Query_Recover_Alt_0'), fail. ./gprolog-1.3.0/src/BipsPl/no_sockets.pl0000644004425400513100000000354110547162352016465 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : no_sockets.pl * * Descr.: no Sockets management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: no_sockets.pl,v 1.11 2007/01/04 10:35:10 diaz Exp $ */ :- built_in. '$use_sockets'. ./gprolog-1.3.0/src/BipsPl/write.pl0000644004425400513100000001217510547162354015455 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : write.pl * * Descr.: term output (write/1 and friends) management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: write.pl,v 1.13 2007/01/04 10:35:12 diaz Exp $ */ :- built_in. '$use_write'. /* warning: if you change this file check also definitions in const_io.pl */ write(Term) :- set_bip_name(write, 1), '$call_c'('Write_1'(Term)). write(SorA, Term) :- set_bip_name(write, 2), '$call_c'('Write_2'(SorA, Term)). writeq(Term) :- set_bip_name(writeq, 1), '$call_c'('Writeq_1'(Term)). writeq(SorA, Term) :- set_bip_name(writeq, 2), '$call_c'('Writeq_2'(SorA, Term)). write_canonical(Term) :- set_bip_name(write_canonical, 1), '$call_c'('Write_Canonical_1'(Term)). write_canonical(SorA, Term) :- set_bip_name(write_canonical, 2), '$call_c'('Write_Canonical_2'(SorA, Term)). display(Term) :- set_bip_name(display, 1), '$call_c'('Display_1'(Term)). display(SorA, Term) :- set_bip_name(display, 2), '$call_c'('Display_2'(SorA, Term)). % see file print.pl for the definition of print/1-2 % option mask in sys_var[0]: (see write_supp.h) % % b5 b4 b3 b2 b1 b0 % 0/1 0/1 0/1 0/1 0/1 0/1 % portrayed space_args namevars numbervars ignore_ops quoted % 0=false 0=false 0=false 0=false 0=false 0=false % 1=true 1=true 1=true 1=true 1=true 1=true % % max_depth in sys_var[1] % priority in sys_var[2] write_term(Term, Options) :- set_bip_name(write_term, 2), '$set_write_defaults', '$get_write_options'(Options), '$call_c'('Write_Term_1'(Term)). write_term(SorA, Term, Options) :- set_bip_name(write_term, 3), '$set_write_defaults', '$get_write_options'(Options), '$call_c'('Write_Term_2'(SorA, Term)). '$set_write_defaults' :- '$sys_var_write'(0, 12), % default mask '$sys_var_write'(1, -1), '$sys_var_write'(2, 1200). '$get_write_options'(Options) :- '$check_list'(Options), '$get_write_options1'(Options). '$get_write_options1'([]). '$get_write_options1'([X|Options]) :- '$get_write_options2'(X), !, '$get_write_options1'(Options). '$get_write_options2'(X) :- var(X), '$pl_err_instantiation'. '$get_write_options2'(quoted(X)) :- nonvar(X), ( X = false, '$sys_var_reset_bit'(0, 0) ; X = true, '$sys_var_set_bit'(0, 0) ). '$get_write_options2'(ignore_ops(X)) :- nonvar(X), ( X = false, '$sys_var_reset_bit'(0, 1) ; X = true, '$sys_var_set_bit'(0, 1) ). '$get_write_options2'(numbervars(X)) :- nonvar(X), ( X = false, '$sys_var_reset_bit'(0, 2) ; X = true, '$sys_var_set_bit'(0, 2) ). '$get_write_options2'(namevars(X)) :- nonvar(X), ( X = false, '$sys_var_reset_bit'(0, 3) ; X = true, '$sys_var_set_bit'(0, 3) ). '$get_write_options2'(space_args(X)) :- nonvar(X), ( X = false, '$sys_var_reset_bit'(0, 4) ; X = true, '$sys_var_set_bit'(0, 4) ). '$get_write_options2'(portrayed(X)) :- nonvar(X), ( X = false, '$sys_var_reset_bit'(0, 5) ; X = true, '$sys_var_set_bit'(0, 5) ). '$get_write_options2'(max_depth(X)) :- integer(X), '$sys_var_write'(1, X). '$get_write_options2'(priority(X)) :- integer(X), '$sys_var_write'(2, X). '$get_write_options2'(X) :- '$pl_err_domain'(write_option, X). nl :- set_bip_name(nl, 0), '$call_c'('Nl_0'). nl(SorA) :- set_bip_name(nl, 1), '$call_c'('Nl_1'(SorA)). ./gprolog-1.3.0/src/BipsPl/debugger_c.c0000644004425400513100000007727510547154135016232 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : debugger_c.c * * Descr.: debugger - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: debugger_c.c,v 1.13 2007/01/04 10:35:09 diaz Exp $ */ #include #include #include #include #if defined(_WIN32) || defined(__CYGWIN__) #include #endif #define OBJ_INIT Debug_Initializer #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ #define BANK_NAME_OFFSET_LENGTH 15 #if WORD_SIZE == 32 #define HEXADECIMAL_LENGTH 10 #define DECIMAL_LENGTH 11 #else #define HEXADECIMAL_LENGTH 20 #define DECIMAL_LENGTH 21 #endif #define VALUE_PART_LENGTH BANK_NAME_OFFSET_LENGTH #define SEPARATOR_LIST " ,[]\n" /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef Bool (*FctPtr) (); typedef struct { char *name; FctPtr fct; } InfCmd; /*---------------------------------* * Global Variables * *---------------------------------*/ WamCont debug_call_code; static int nb_read_arg; static char read_arg[30][80]; static char *envir_name[] = ENVIR_NAMES; static char *choice_name[] = CHOICE_NAMES; static char *trail_tag_name[] = TRAIL_TAG_NAMES; static WamWord reg_copy[NB_OF_REGS]; static StmInf *pstm_i; static StmInf *pstm_o; static jmp_buf dbg_jumper; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void My_System_Directives(void); static void Scan_Command(char *source_str); static FctPtr Find_Function(void); static Bool Write_Data_Modify(void); static Bool Where(void); static Bool What(void); static Bool Dereference(void); static Bool Environment(void); static Bool Backtrack(void); static WamWord *Read_Bank_Adr(Bool only_stack, int arg_nb, char **bank_name); static long Read_An_Integer(int arg_nb); static void Print_Bank_Name_Offset(char *prefix, char *bank_name, int offset); static void Print_Wam_Word(WamWord *word_adr); static void Modify_Wam_Word(WamWord *word_adr); static WamWord *Detect_Stack(WamWord *adr, char **stack_name); static PredInf *Detect_Pred_From_Code(long *codep); static Bool Help(void); #define INIT_DEBUGGER X24696E69745F6465627567676572 #define DEBUG_CALL X2464656275675F63616C6C Prolog_Prototype(INIT_DEBUGGER, 0); Prolog_Prototype(DEBUG_CALL, 2); /*-------------------------------------------------------------------------* * DEBUG_INITIALIZER * * * * Calls '$init_debugger' and reset the heap actual start (cf. engine.c). * * '$init_debugger' is not called via a directive :- initialize to avoid to* * count it in Exec_Directive() (cf engine.c). However, it cannot be called* * directly since we do not know if the initializer of g_var_inl_c.c has * * been executed ('$init_debugger' uses g_assign). * * We thus act like a Prolog object, calling New_Object. * *-------------------------------------------------------------------------*/ static void Debug_Initializer(void) { New_Object(NULL, My_System_Directives, NULL); } static void My_System_Directives(void) { Call_Prolog(Prolog_Predicate(INIT_DEBUGGER, 0)); Set_Heap_Actual_Start(H); /* changed to store global info */ } /*-------------------------------------------------------------------------* * SET_DEBUG_CALL_CODE_0 * * * *-------------------------------------------------------------------------*/ void Set_Debug_Call_Code_0(void) { debug_call_code = Prolog_Predicate(DEBUG_CALL, 2); Flag_Value(FLAG_DEBUG) = TRUE; } /*-------------------------------------------------------------------------* * RESET_DEBUG_CALL_CODE_0 * * * *-------------------------------------------------------------------------*/ void Reset_Debug_Call_Code_0(void) { debug_call_code = NULL; Flag_Value(FLAG_DEBUG) = FALSE; } /*-------------------------------------------------------------------------* * REMOVE_ONE_CHOICE_POINT_1 * * * *-------------------------------------------------------------------------*/ void Remove_One_Choice_Point_1(WamWord b_word) { WamWord word, tag_mask; WamWord *b; DEREF(b_word, word, tag_mask); b = From_WamWord_To_B(word); Assign_B(BB(b)); } /*-------------------------------------------------------------------------* * CHOICE_POINT_INFO_4 * * * *-------------------------------------------------------------------------*/ void Choice_Point_Info_4(WamWord b_word, WamWord name_word, WamWord arity_word, WamWord lastb_word) { WamWord word, tag_mask; WamWord *b; HashScan scan; PredInf *pred; PredInf *last_pred; WamCont code, code1; WamCont last_code = 0; int func, arity; DEREF(b_word, word, tag_mask); b = From_WamWord_To_B(word); code = (WamCont) ALTB(b); for (pred = (PredInf *) Hash_First(pred_tbl, &scan); pred; pred = (PredInf *) Hash_Next(&scan)) { code1 = (WamCont) (pred->codep); if (code >= code1 && code1 >= last_code) { last_pred = pred; last_code = code1; } } func = Functor_Of(last_pred->f_n); arity = Arity_Of(last_pred->f_n); Get_Atom(func, name_word); Get_Integer(arity, arity_word); Unify(From_B_To_WamWord(BB(b)), lastb_word); } /*-------------------------------------------------------------------------* * SCAN_CHOICE_POINT_INFO_3 * * * *-------------------------------------------------------------------------*/ Bool Scan_Choice_Point_Info_3(WamWord b_word, WamWord name_word, WamWord arity_word) { WamWord word, tag_mask; WamWord *b; int func, arity; DEREF(b_word, word, tag_mask); b = From_WamWord_To_B(word); func = Scan_Choice_Point_Pred(b, &arity); if (func < 0) return FALSE; Get_Atom(func, name_word); Get_Integer(arity, arity_word); return TRUE; } /*-------------------------------------------------------------------------* * CHOICE_POINT_ARG_3 * * * *-------------------------------------------------------------------------*/ void Choice_Point_Arg_3(WamWord b_word, WamWord i_word, WamWord arg_word) { WamWord word, tag_mask; WamWord *b; int i; DEREF(b_word, word, tag_mask); b = From_WamWord_To_B(word); DEREF(i_word, word, tag_mask); i = UnTag_INT(word) - 1; Unify(arg_word, AB(b, i)); } #if defined(_WIN32) || defined(__CYGWIN__) /*-------------------------------------------------------------------------* * DEBUGGER_SEH_HANDLER * * * *-------------------------------------------------------------------------*/ static EXCEPT_DISPOSITION Debugger_SEH_Handler(EXCEPTION_RECORD *excp_rec, void *establisher_frame, CONTEXT *context_rec, void *dispatcher_cxt) { if (excp_rec->ExceptionFlags) return ExceptContinueSearch; /* unwind and others */ longjmp(dbg_jumper, excp_rec->ExceptionCode); } #else /*-------------------------------------------------------------------------* * DEBUGGER_SIGNAL_HANDLER * * * *-------------------------------------------------------------------------*/ static void Debugger_Signal_Handler(int sig) { longjmp(dbg_jumper, sig); } #endif /*-------------------------------------------------------------------------* * DEBUG_WAM * * * *-------------------------------------------------------------------------*/ void Debug_Wam(void) { FctPtr command; char str[80] = ""; char *prompt = "(wam debug) "; int ret; pstm_i = stm_tbl[stm_debugger_input]; pstm_o = stm_tbl[stm_debugger_output]; Stream_Printf(pstm_o, "Welcome to the WAM debugger - experts only\n"); #if defined(_WIN32) || defined(__CYGWIN__) SEH_PUSH(Debugger_SEH_Handler); #endif ret = setjmp(dbg_jumper); if (ret == 0) { #if !(defined(_WIN32) || defined(__CYGWIN__)) signal(SIGSEGV, Debugger_Signal_Handler); #endif } else { Stream_Printf(pstm_o, "ERROR from handler: %d (%#x)\n", ret, ret); } for (;;) { if (Stream_Gets_Prompt(prompt, pstm_o, str, sizeof(str), pstm_i) == NULL) break; Scan_Command(str); command = Find_Function(); if (command == (FctPtr) -1) break; if (command) (*command) (); } #if defined(_WIN32) || defined(__CYGWIN__) SEH_POP; #endif } /*-------------------------------------------------------------------------* * SCAN_COMMAND * * * *-------------------------------------------------------------------------*/ static void Scan_Command(char *source_str) { char str[80]; char *p, *q; strcpy(str, source_str); nb_read_arg = 0; p = (char *) strtok(str, SEPARATOR_LIST); while (p) { q = p; p = (char *) strtok(NULL, SEPARATOR_LIST); strcpy(read_arg[nb_read_arg++], q); } } /*-------------------------------------------------------------------------* * FIND_FUNCTION * * * *-------------------------------------------------------------------------*/ static FctPtr Find_Function(void) { int lg; int i; static InfCmd cmd[] = { {"write", Write_Data_Modify}, {"data", Write_Data_Modify}, {"modify", Write_Data_Modify}, {"where", Where}, {"what", What}, {"deref", Dereference}, {"envir", Environment}, {"backtrack", Backtrack}, {"quit", (FctPtr) -1}, {"help", Help} }; if (nb_read_arg == 0) return NULL; lg = strlen(read_arg[0]); for (i = 0; i < sizeof(cmd) / sizeof(InfCmd); i++) if (strncmp(cmd[i].name, read_arg[0], lg) == 0) return cmd[i].fct; Stream_Printf(pstm_o, "Unknown command - try help\n"); return NULL; } /*-------------------------------------------------------------------------* * WRITE_DATA_MODIFY * * * *-------------------------------------------------------------------------*/ static Bool Write_Data_Modify(void) { WamWord *adr; char *bank_name; int offset; int nb; int incr = 1; if ((adr = Read_Bank_Adr(FALSE, 1, &bank_name)) != NULL) { offset = (nb_read_arg < 3) ? 0 : Read_An_Integer(2); nb = (nb_read_arg < 4) ? 1 : Read_An_Integer(3); if (adr == reg_copy) { if (offset >= NB_OF_REGS) offset = 0; if (nb_read_arg < 4 && *read_arg[0] != 'm') nb = NB_OF_REGS - offset; else if (nb > NB_OF_REGS - offset) nb = NB_OF_REGS - offset; } else if (strcmp(bank_name, "y") == 0 || strcmp(bank_name, "ab") == 0) incr = -1; while (nb--) { Print_Bank_Name_Offset((adr == reg_copy) ? reg_tbl[offset] : "", bank_name, offset); Stream_Printf(pstm_o, ":"); if (*read_arg[0] == 'w') Write_Term(pstm_o, -1, MAX_PREC, WRITE_NUMBER_VARS | WRITE_NAME_VARS, adr[offset]); else { Print_Wam_Word(adr + offset); if (*read_arg[0] == 'm') Modify_Wam_Word(adr + offset); } Stream_Printf(pstm_o, "\n"); offset += incr; } } if (adr == reg_copy) /* saved by Read_Bank_Adr */ Restore_All_Regs(reg_copy); return FALSE; } /*-------------------------------------------------------------------------* * WHAT * * * *-------------------------------------------------------------------------*/ static Bool What(void) { long *adr; WamWord *adr1; char *stack_name; PredInf *pred; int func, arity; if (nb_read_arg < 2) { Stream_Printf(pstm_o, "integer expected\n"); return FALSE; } adr = (long *) Read_An_Integer(1); Stream_Printf(pstm_o, " %#lx = ", (long) adr); if ((adr1 = Detect_Stack(adr, &stack_name)) != NULL) { Print_Bank_Name_Offset("", stack_name, adr - adr1); Stream_Printf(pstm_o, "\n"); return FALSE; } if ((pred = Detect_Pred_From_Code(adr)) != NULL) { func = Functor_Of(pred->f_n); arity = Arity_Of(pred->f_n); Stream_Printf(pstm_o, "%s/%d", atom_tbl[func].name, arity); if (adr > pred->codep) Stream_Printf(pstm_o, "+%d", (char *) adr - (char *) (pred->codep)); Stream_Printf(pstm_o, "\n"); return FALSE; } Stream_Printf(pstm_o, "???\n"); return FALSE; } /*-------------------------------------------------------------------------* * WHERE * * * *-------------------------------------------------------------------------*/ static Bool Where(void) { char *bank_name; int offset; WamWord *adr; if ((adr = Read_Bank_Adr(FALSE, 1, &bank_name)) != NULL) { offset = (nb_read_arg < 3) ? 0 : Read_An_Integer(2); if (strcmp(bank_name, "y") == 0 || strcmp(bank_name, "ab") == 0) offset = -offset; Print_Bank_Name_Offset((adr == reg_copy) ? reg_tbl[offset] : "", bank_name, offset); Stream_Printf(pstm_o, " at %#lx\n", (long) (adr + offset)); } return FALSE; } /*-------------------------------------------------------------------------* * DEREFERENCE * * * *-------------------------------------------------------------------------*/ static Bool Dereference(void) { char *bank_name; char *stack_name; int offset; WamWord word, tag_mask; WamWord word1, *d_adr; WamWord *adr; if ((adr = Read_Bank_Adr(FALSE, 1, &bank_name)) != NULL) { offset = (nb_read_arg < 3) ? 0 : Read_An_Integer(2); if (strcmp(bank_name, "y") == 0 || strcmp(bank_name, "ab") == 0) offset = -offset; /* my own DEREF here to get the address */ d_adr = NULL; /* added this */ word = adr[offset]; do { word1 = word; tag_mask = Tag_Mask_Of(word); if (tag_mask != TAG_REF_MASK) break; d_adr = UnTag_REF(word); /* added this */ word = *d_adr; } while (word != word1); Print_Bank_Name_Offset((adr == reg_copy) ? reg_tbl[offset] : "", bank_name, offset); Stream_Printf(pstm_o, ":"); if (d_adr && (adr = Detect_Stack(d_adr, &stack_name)) != NULL) { Stream_Printf(pstm_o, " --> \n"); Print_Bank_Name_Offset("", stack_name, d_adr - adr); Stream_Printf(pstm_o, ":"); } Print_Wam_Word(d_adr ? d_adr : adr + offset); Stream_Printf(pstm_o, "\n"); } return FALSE; } /*-------------------------------------------------------------------------* * ENVIRONMENT * * * *-------------------------------------------------------------------------*/ static Bool Environment(void) { WamWord *adr; int offset; char *stack_name; int i; if (nb_read_arg == 1) { adr = Detect_Stack(E, &stack_name); offset = E - adr; adr = E; } else { if ((adr = Read_Bank_Adr(TRUE, 1, &stack_name)) == NULL) return FALSE; offset = (nb_read_arg < 3) ? 0 : Read_An_Integer(2); adr += offset; } for (i = ENVIR_STATIC_SIZE; i > 0; i--) { Print_Bank_Name_Offset(envir_name[i - 1], stack_name, offset - i); Stream_Printf(pstm_o, ":"); Print_Wam_Word(adr - i); Stream_Printf(pstm_o, "\n"); } return FALSE; } /*-------------------------------------------------------------------------* * BACKTRACK * * * *-------------------------------------------------------------------------*/ static Bool Backtrack(void) { WamWord *adr; int offset; char *stack_name; int i; PredInf *pred; int func, arity; if (nb_read_arg == 2 && strncmp(read_arg[1], "all", strlen(read_arg[1])) == 0) { Detect_Stack(B, &stack_name); for (adr = B; adr > Local_Stack + 10; adr = BB(adr)) { pred = Detect_Pred_From_Code((long *) ALTB(adr)); func = Functor_Of(pred->f_n); arity = Arity_Of(pred->f_n); Print_Bank_Name_Offset("", stack_name, adr - Local_Stack); Stream_Printf(pstm_o, ": %s/%d", atom_tbl[func].name, arity); if (arity == 0 && strcmp(atom_tbl[func].name, "$clause_alt") == 0) { Stream_Printf(pstm_o, " for "); Write_Term(pstm_o, -1, MAX_PREC, WRITE_NUMBER_VARS | WRITE_NAME_VARS, AB(adr, 0)); } Stream_Printf(pstm_o, "\n"); } return FALSE; } if (nb_read_arg == 1) { adr = Detect_Stack(B, &stack_name); offset = B - adr; adr = B; } else { if ((adr = Read_Bank_Adr(TRUE, 1, &stack_name)) == NULL) return FALSE; offset = (nb_read_arg < 3) ? 0 : Read_An_Integer(2); adr += offset; } pred = Detect_Pred_From_Code((long *) ALTB(adr)); func = Functor_Of(pred->f_n); arity = Arity_Of(pred->f_n); Stream_Printf(pstm_o, "Created by %s/%d", atom_tbl[func].name, arity); if (arity == 0 && strcmp(atom_tbl[func].name, "$clause_alt") == 0) { Stream_Printf(pstm_o, " for "); Write_Term(pstm_o, -1, MAX_PREC, WRITE_NUMBER_VARS | WRITE_NAME_VARS, AB(adr, 0)); } Stream_Printf(pstm_o, "\n"); for (i = CHOICE_STATIC_SIZE; i > 0; i--) { Print_Bank_Name_Offset(choice_name[i - 1], stack_name, offset - i); Stream_Printf(pstm_o, ":"); Print_Wam_Word(adr - i); Stream_Printf(pstm_o, "\n"); } return FALSE; } /*-------------------------------------------------------------------------* * READ_BANK_ADR * * * *-------------------------------------------------------------------------*/ static WamWord * Read_Bank_Adr(Bool only_stack, int arg_nb, char **bank_name) { int lg; int i; if (nb_read_arg < arg_nb + 1) { Stream_Printf(pstm_o, "%s name expected\n", (only_stack) ? "Stack" : "Bank"); return NULL; } lg = strlen(read_arg[arg_nb]); if (!only_stack) { if (read_arg[arg_nb][0] == 'x' && lg == 1) { *bank_name = "x"; return &X(0); } if (read_arg[arg_nb][0] == 'y' && lg == 1) { *bank_name = "y"; return &Y(E, 0); } if (strncmp("ab", read_arg[arg_nb], lg) == 0) { *bank_name = "ab"; return &AB(B, 0); } if (strncmp("reg", read_arg[arg_nb], lg) == 0) { *bank_name = "reg"; Save_All_Regs(reg_copy); return reg_copy; } } for (i = 0; i < NB_OF_STACKS; i++) if (strncmp(stk_tbl[i].name, read_arg[arg_nb], lg) == 0) { *bank_name = stk_tbl[i].name; return stk_tbl[i].stack; } Stream_Printf(pstm_o, "Incorrect %s name\n", (only_stack) ? "stack" : "bank"); return NULL; } /*-------------------------------------------------------------------------* * READ_AN_INTEGER * * * *-------------------------------------------------------------------------*/ static long Read_An_Integer(int arg_nb) { char *p; long val = 0; val = strtol(read_arg[arg_nb], &p, 0); if (*p) Stream_Printf(pstm_o, "Incorrect integer\n"); return val; } /*-------------------------------------------------------------------------* * PRINT_BANK_NAME_OFFSET * * * *-------------------------------------------------------------------------*/ static void Print_Bank_Name_Offset(char *prefix, char *bank_name, int offset) { char str[80]; int lg = strlen(prefix); if (lg) Stream_Printf(pstm_o, "%s", prefix); sprintf(str, "%s[%d]", bank_name, offset); lg += strlen(str); if (lg > BANK_NAME_OFFSET_LENGTH) lg = BANK_NAME_OFFSET_LENGTH; Stream_Printf(pstm_o, "%*s%s", BANK_NAME_OFFSET_LENGTH - lg, "", str); } /*-------------------------------------------------------------------------* * PRINT_WAM_WORD * * * *-------------------------------------------------------------------------*/ static void Print_Wam_Word(WamWord *word_adr) { WamWord word = *word_adr; WamWord tag; WamWord value; char *stack_name; WamWord *adr; int functor; int arity; int i; Stream_Printf(pstm_o, "%#*lx %*ld ", HEXADECIMAL_LENGTH, (long) word, DECIMAL_LENGTH, (long) word); if ((adr = Detect_Stack((WamWord *) word, &stack_name)) != NULL) Print_Bank_Name_Offset("", stack_name, (WamWord *) word - adr); else Stream_Printf(pstm_o, "%*s", BANK_NAME_OFFSET_LENGTH, "?[?]"); Stream_Printf(pstm_o, " "); tag = Tag_Of(word); for (i = 0; i < NB_OF_TAGS; i++) if (tag_tbl[i].value == tag) break; if (i < NB_OF_TAGS) switch (tag_tbl[i].type) { case LONG_INT: value = (WamWord) UnTag_Long_Int(word); Stream_Printf(pstm_o, "%s,%*ld", tag_tbl[i].name, VALUE_PART_LENGTH, (long) value); break; case SHORT_UNS: value = (WamWord) UnTag_Short_Uns(word); if (tag == ATM && value >= 0 && value < MAX_ATOM && atom_tbl[value].name != NULL) Stream_Printf(pstm_o, "ATM,%*s (%ld)", VALUE_PART_LENGTH, atom_tbl[value].name, (long) value); else if (tag == ATM) tag = -1; else Stream_Printf(pstm_o, "%s,%*lu", tag_tbl[i].name, VALUE_PART_LENGTH, (long) value); break; case ADDRESS: value = (WamWord) UnTag_Address(word); if ((adr = Detect_Stack((WamWord *) value, &stack_name)) != NULL) { Stream_Printf(pstm_o, "%s,", tag_tbl[i].name); Print_Bank_Name_Offset("", stack_name, (WamWord *) value - adr); } else tag = -1; break; } else tag = -1; if (tag == -1) Stream_Printf(pstm_o, "???,%*s", VALUE_PART_LENGTH, "?"); Stream_Printf(pstm_o, " "); if (word_adr >= Trail_Stack && word_adr < Trail_Stack + Trail_Size) { tag = Trail_Tag_Of(word); value = Trail_Value_Of(word); if (tag == TFC) Stream_Printf(pstm_o, "%s,%#*lx", trail_tag_name[tag], VALUE_PART_LENGTH, (long) value); else if (tag < NB_OF_TRAIL_TAGS && (adr = Detect_Stack((WamWord *) value, &stack_name)) != NULL && *stack_name != 't') { Stream_Printf(pstm_o, "%s,", trail_tag_name[tag]); Print_Bank_Name_Offset("", stack_name, (WamWord *) value - adr); } else Stream_Printf(pstm_o, "???,%*s", VALUE_PART_LENGTH, "?"); Stream_Printf(pstm_o, " "); } functor = Functor_Of(word); arity = Arity_Of(word); if (functor >= 0 && functor < MAX_ATOM && atom_tbl[functor].name != NULL && arity >= 0 && arity <= MAX_ARITY) Stream_Printf(pstm_o, "%12s/%-3d", atom_tbl[functor].name, arity); } /*-------------------------------------------------------------------------* * MODIFY_WAM_WORD * * * *-------------------------------------------------------------------------*/ static void Modify_Wam_Word(WamWord *word_adr) { WamWord word; char *bank_name; WamWord *adr; int offset; char str[80]; char *comma; char *slash; char *p; int i, j; for (;;) { Stream_Printf(pstm_o, "\n"); if (Stream_Gets_Prompt("New value: ", pstm_o, str, sizeof(str), pstm_i) == NULL || *str == '\0' || *str == '\n') break; Scan_Command(str); if ((comma = (char *) strchr(str, ',')) != NULL) goto tag_value; if ((slash = (char *) strchr(read_arg[0], '/')) != NULL) goto functor_arity; /* integer */ if (nb_read_arg == 1 && *read_arg[0] >= '0' && *read_arg[0] <= '9') { word = strtol(read_arg[0], &p, 0); if (*p == '\0') { *word_adr = word; return; } else goto err; } /* stack address */ if ((adr = Read_Bank_Adr(TRUE, 0, &bank_name)) != NULL) { offset = (nb_read_arg < 2) ? 0 : Read_An_Integer(1); *word_adr = (WamWord) (adr + offset); return; } goto err; /* tag,value */ tag_value: for (i = 0; i < NB_OF_TAGS; i++) if (strcmp(tag_tbl[i].name, read_arg[0]) == 0) break; if (i < NB_OF_TAGS) { switch (tag_tbl[i].type) { case LONG_INT: word = strtol(read_arg[1], &p, 0); if (*p != '\0') goto err; *word_adr = Tag_Long_Int(tag_tbl[i].tag_mask, Read_An_Integer(1)); return; case SHORT_UNS: word = strtol(read_arg[1], &p, 0); if (*p == '\0') j = Read_An_Integer(1); else if (strcmp(read_arg[0], "ATM") == 0) j = Create_Allocate_Atom(comma + 1); else goto err; *word_adr = Tag_Short_Uns(tag_tbl[i].tag_mask, j); return; case ADDRESS: if ((adr = Read_Bank_Adr(TRUE, 1, &bank_name)) != NULL) { offset = (nb_read_arg < 3) ? 0 : Read_An_Integer(2); *word_adr = Tag_Address(tag_tbl[i].tag_mask, adr + offset); return; } goto err; } } /* trail_tag,value */ for (i = 0; i < NB_OF_TRAIL_TAGS; i++) if (strcmp(trail_tag_name[i], read_arg[0]) == 0) if ((adr = Read_Bank_Adr(TRUE, 1, &bank_name)) != NULL) { offset = (nb_read_arg < 3) ? 0 : Read_An_Integer(2); *word_adr = Trail_Tag_Value(i, adr + offset); return; } goto err; /* functor/arity */ functor_arity: *slash = '\0'; i = strtol(slash + 1, &p, 0); if (*p != '\0' || i < 1 || i > MAX_ARITY) goto err; word = strtol(read_arg[0], &p, 0); if (*p != '\0') word = (long) Create_Allocate_Atom(read_arg[0]); else if (word < 0 || word >= MAX_ATOM) goto err; *word_adr = Functor_Arity(word, i); Stream_Printf(pstm_o, "--> %s/%d", atom_tbl[word].name, i); return; err: Stream_Printf(pstm_o, "Error..."); } } /*-------------------------------------------------------------------------* * DETECT_STACK * * * *-------------------------------------------------------------------------*/ static WamWord * Detect_Stack(WamWord *adr, char **stack_name) { int i; for (i = 0; i < NB_OF_STACKS; i++) if (adr >= stk_tbl[i].stack && adr < stk_tbl[i].stack + stk_tbl[i].size) { *stack_name = stk_tbl[i].name; return stk_tbl[i].stack; } return NULL; } /*-------------------------------------------------------------------------* * DETECT_PRED_FROM_CODE * * * *-------------------------------------------------------------------------*/ static PredInf * Detect_Pred_From_Code(long *codep) { HashScan scan; PredInf *pred; PredInf *last_pred = NULL; long dist, d; for (pred = (PredInf *) Hash_First(pred_tbl, &scan); pred; pred = (PredInf *) Hash_Next(&scan)) { d = codep - pred->codep; if ((pred->prop & MASK_PRED_DYNAMIC) || d < 0) continue; if (last_pred == NULL || d < dist) { last_pred = pred; dist = d; } } return last_pred; } /*-------------------------------------------------------------------------* * HELP * * * *-------------------------------------------------------------------------*/ static Bool Help(void) { int i; #define L(str) Stream_Printf(pstm_o, "%s\n", str) L("Wam debugging options:"); L(""); L(" write A [N] write N (or 1) Prolog terms starting at A"); L(" data A [N] display N (or 1) words starting at A"); L(" modify A [N] display and modify N (or 1) words starting at A"); L(" where A display the real address corresponding to SA"); L(" what RA display what corresponds to the real address RA"); L(" deref A display the dereferenced word starting at A"); L(" envir [SA] display an environment located at SA (or current)"); L(" backtrack [SA] display a choice point located at SA (or current)"); L(" backtrack all display all choice points"); L(" quit return to Prolog debugger"); L(""); L("A WAM address (A) has the following syntax: bank_name [N]"); L(" bank_name is either reg/x/y/ab/stack_name (see below)"); L(" N is an optional index (default 0)"); Stream_Printf(pstm_o, " stack_name is either:"); for (i = 0; i < NB_OF_STACKS; i++) Stream_Printf(pstm_o, " %s", stk_tbl[i].name); Stream_Printf(pstm_o, "\n"); L(""); L("A WAM stack address (SA) has the following syntax: stack_name [N]"); L(""); L("A real address (RA) is a C integer (0x... notation is allowed)"); return FALSE; } ./gprolog-1.3.0/src/BipsPl/call.wam0000644004425400513100000001616710547440331015406 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : call.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/call.pl'). predicate('$use_call'/0,29,static,private,built_in,[ proceed]). predicate(once/1,33,static,private,built_in,[ load_cut_level(1), allocate(1), get_variable(y(0),1), put_atom(once,1), put_integer(1,2), put_atom(true,3), call('$call'/4), cut(y(0)), deallocate, proceed]). predicate((\+)/1,37,static,private,built_in,[ execute('$\\+/1_$aux1'/1)]). predicate('$\\+/1_$aux1'/1,37,static,private,built_in,[ load_cut_level(1), try_me_else(1), allocate(1), get_variable(y(0),1), put_atom(\+,1), put_integer(1,2), put_atom(true,3), call('$call'/4), cut(y(0)), fail, label(1), trust_me_else_fail, proceed]). predicate(call_det/2,46,static,private,built_in,[ allocate(4), get_variable(y(0),0), get_variable(y(1),1), put_value(y(1),0), call('$call_det/2_$aux1'/1), put_variable(y(2),0), call('$get_current_B'/1), put_value(y(0),0), put_atom(call_det,1), put_integer(2,2), put_atom(true,3), call('$call'/4), put_variable(y(3),0), call('$get_current_B'/1), put_unsafe_value(y(3),0), put_unsafe_value(y(2),1), put_value(y(1),2), deallocate, execute('$call_det/2_$aux2'/3)]). predicate('$call_det/2_$aux2'/3,46,static,private,built_in,[ load_cut_level(3), try_me_else(1), put_atom(>,4), put_integer(2,5), call_c('Set_Bip_Name_2',[],[x(4),x(5)]), math_load_value(x(0),0), math_load_value(x(1),1), call_c('Blt_Gt',[fast_call,boolean],[x(0),x(1)]), cut(x(3)), get_atom(false,2), proceed, label(1), trust_me_else_fail, get_atom(true,2), proceed]). predicate('$call_det/2_$aux1'/1,46,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), put_atom(false,2), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(2)]), put_atom(true,2), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(2)]), cut(x(1)), put_atom(call,1), put_integer(2,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_value(x(0),1), put_atom(boolean,0), execute('$pl_err_type'/2), label(1), trust_me_else_fail, proceed]). predicate('$call'/4,65,static,private,built_in,[ call_c('Save_Call_Info_3',[],[x(1),x(2),x(3)]), put_integer(0,1), execute('$call1'/2)]). predicate('$call1'/2,69,static,private,built_in,[ put_integer(1,2), call_c('Load_Call_Info_Arg_1',[],[x(2)]), execute('$call_internal'/2)]). predicate('$call_internal'/2,73,static,private,built_in,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), put_value(y(1),0), call_c('Call_Info_Bip_Name_1',[],[x(0)]), put_value(y(0),0), call('$$call_internal/2_$aux1'/1), put_value(y(0),0), put_value(y(1),1), put_variable(y(2),2), call('$term_to_goal'/3), put_unsafe_value(y(2),0), put_value(y(1),1), deallocate, execute('$call_internal1'/2)]). predicate('$$call_internal/2_$aux1'/1,73,static,private,built_in,[ load_cut_level(1), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$pl_err_instantiation'/0), label(1), trust_me_else_fail, proceed]). predicate('$call_internal1'/2,83,static,private,built_in,[ load_cut_level(2), execute('$call_internal_with_cut'/3)]). predicate('$call_internal_with_cut'/3,90,static,private,built_in,[ load_cut_level(3), try_me_else(21), switch_on_term(3,1,fail,fail,2), label(1), switch_on_atom([(!,8),(fail,12),(true,14)]), label(2), switch_on_structure([((',')/2,4),((;)/2,6),((->)/2,10),(call/1,16),(catch/3,18),(throw/1,20)]), label(3), try_me_else(5), label(4), allocate(3), get_variable(y(1),1), get_variable(y(2),2), get_structure((',')/2,0), unify_variable(x(0)), unify_variable(y(0)), cut(x(3)), put_value(y(1),1), put_value(y(2),2), call('$call_internal_with_cut'/3), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute('$call_internal_with_cut'/3), label(5), retry_me_else(7), label(6), get_variable(x(4),2), get_variable(x(2),1), get_structure((;)/2,0), unify_variable(x(0)), unify_variable(x(1)), cut(x(3)), put_value(x(4),3), execute('$call_internal_or'/4), label(7), retry_me_else(9), label(8), get_atom(!,0), cut(x(2)), proceed, label(9), retry_me_else(11), label(10), allocate(4), get_variable(y(1),1), get_variable(y(2),2), get_structure((->)/2,0), unify_variable(x(0)), unify_variable(y(0)), get_variable(y(3),3), cut(y(3)), put_value(y(1),1), call('$call_internal'/2), cut(y(3)), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute('$call_internal_with_cut'/3), label(11), retry_me_else(13), label(12), get_atom(fail,0), cut(x(3)), fail, label(13), retry_me_else(15), label(14), get_atom(true,0), cut(x(3)), proceed, label(15), retry_me_else(17), label(16), get_structure(call/1,0), unify_variable(x(0)), cut(x(3)), execute('$call_internal'/2), label(17), retry_me_else(19), label(18), get_variable(x(4),1), get_structure(catch/3,0), unify_variable(x(0)), unify_variable(x(1)), unify_variable(x(2)), cut(x(3)), put_value(x(4),3), execute('$catch_internal'/4), label(19), trust_me_else_fail, label(20), get_structure(throw/1,0), unify_variable(x(0)), cut(x(3)), execute('$throw_internal'/2), label(21), trust_me_else_fail, put_integer(1,2), call_c('BC_Call_Terminal_Pred_3',[jump],[x(0),x(1),x(2)]), proceed]). predicate('$call_internal_or'/4,133,static,private,built_in,[ load_cut_level(4), try_me_else(1), get_variable(x(6),3), get_variable(x(5),1), get_structure((->)/2,0), unify_variable(x(0)), unify_variable(x(3)), cut(x(4)), put_value(x(2),1), put_value(x(4),2), put_value(x(6),4), execute('$$call_internal_or/4_$aux1'/6), label(1), retry_me_else(2), put_value(x(2),1), put_value(x(3),2), execute('$call_internal_with_cut'/3), label(2), trust_me_else_fail, put_value(x(1),0), put_value(x(2),1), put_value(x(3),2), execute('$call_internal_with_cut'/3)]). predicate('$$call_internal_or/4_$aux1'/6,133,static,private,built_in,[ try_me_else(1), allocate(4), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), get_variable(y(3),4), put_value(y(0),1), call('$call_internal'/2), cut(y(1)), put_value(y(2),0), put_value(y(0),1), put_value(y(3),2), deallocate, execute('$call_internal_with_cut'/3), label(1), trust_me_else_fail, put_value(x(5),0), put_value(x(4),2), execute('$call_internal_with_cut'/3)]). predicate('$call_from_debugger'/2,149,static,private,built_in,[ put_integer(0,2), call_c('BC_Call_Terminal_Pred_3',[jump],[x(0),x(1),x(2)]), proceed]). ./gprolog-1.3.0/src/BipsPl/bc_supp.h0000644004425400513100000000502610547154133015563 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : bc_supp.h * * Descr.: byte-Code support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: bc_supp.h,v 1.10 2007/01/04 10:35:07 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef BC_SUPP_FILE int byte_len; #else extern int byte_len; #endif /* defined as this to avoid to force the */ /* inclusion of bc_supp.o if not needed */ /* (dynam_supp.c uses byte_code) */ unsigned *byte_code; /*---------------------------------* * Function Prototypes * *---------------------------------*/ WamCont BC_Emulate_Pred(int func, DynPInf *dyn); ./gprolog-1.3.0/src/BipsPl/read.wam0000644004425400513100000002371210547440331015400 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : read.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/read.pl'). predicate('$use_read'/0,29,static,private,built_in,[ proceed]). predicate(read/1,37,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(read,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), deallocate, call_c('Read_1',[boolean],[x(0)]), proceed]). predicate(read/2,42,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(read,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Read_2',[boolean],[x(0),x(1)]), proceed]). predicate(read_term/2,64,static,private,built_in,[ allocate(5), get_variable(y(0),0), get_variable(y(1),1), put_atom(read_term,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(1),0), put_variable(y(2),1), put_variable(y(3),2), put_variable(y(4),3), call('$get_read_options'/4), put_value(y(0),0), put_unsafe_value(y(2),1), put_unsafe_value(y(3),2), put_unsafe_value(y(4),3), deallocate, call_c('Read_Term_4',[boolean],[x(0),x(1),x(2),x(3)]), proceed]). predicate(read_term/3,71,static,private,built_in,[ put_atom(read_term,3), put_integer(3,4), call_c('Set_Bip_Name_2',[],[x(3),x(4)]), execute('$read_term'/3)]). predicate('$read_term'/3,75,static,private,built_in,[ allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), call('$set_read_defaults'/0), put_value(y(2),0), put_variable(y(3),1), put_variable(y(4),2), put_variable(y(5),3), call('$get_read_options'/4), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(3),2), put_unsafe_value(y(4),3), put_unsafe_value(y(5),4), deallocate, call_c('Read_Term_5',[boolean],[x(0),x(1),x(2),x(3),x(4)]), proceed]). predicate('$set_read_defaults'/0,83,static,private,built_in,[ allocate(0), put_integer(0,0), put_integer(0,1), call('$sys_var_write'/2), put_integer(1,0), put_integer(-1,1), deallocate, execute('$sys_var_write'/2)]). predicate('$get_read_options'/4,90,static,private,built_in,[ allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_value(y(0),0), call('$check_list'/1), put_atom('$read_variables',0), put_nil(1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom('$read_variable_names',0), put_nil(1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom('$read_singletons',0), put_nil(1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(0),0), call('$get_read_options1'/1), put_atom('$read_variables',0), put_value(y(1),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom('$read_variable_names',0), put_value(y(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom('$read_singletons',0), put_value(y(3),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), deallocate, proceed]). predicate('$get_read_options1'/1,101,static,private,built_in,[ load_cut_level(1), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_variable(y(1),1), call('$get_read_options2'/1), cut(y(1)), put_value(y(0),0), deallocate, execute('$get_read_options1'/1)]). predicate('$get_read_options2'/1,108,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), execute('$pl_err_instantiation'/0), label(1), retry_me_else(13), switch_on_term(3,fail,fail,fail,2), label(2), switch_on_structure([(variables/1,4),(variable_names/1,6),(singletons/1,8),(syntax_error/1,10),(end_of_term/1,12)]), label(3), try_me_else(5), label(4), get_structure(variables/1,0), unify_variable(x(1)), put_atom('$read_variables',0), call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), put_integer(0,0), put_integer(0,1), execute('$sys_var_set_bit'/2), label(5), retry_me_else(7), label(6), get_structure(variable_names/1,0), unify_variable(x(1)), put_atom('$read_variable_names',0), call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), put_integer(0,0), put_integer(1,1), execute('$sys_var_set_bit'/2), label(7), retry_me_else(9), label(8), get_structure(singletons/1,0), unify_variable(x(1)), put_atom('$read_singletons',0), call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), put_integer(0,0), put_integer(2,1), execute('$sys_var_set_bit'/2), label(9), retry_me_else(11), label(10), get_structure(syntax_error/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_read_options2/1_$aux1'/1), label(11), trust_me_else_fail, label(12), get_structure(end_of_term/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_read_options2/1_$aux2'/1), label(13), trust_me_else_fail, put_value(x(0),1), put_atom(read_option,0), execute('$pl_err_domain'/2)]). predicate('$$get_read_options2/1_$aux2'/1,134,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(dot,3),(eof,5)]), label(2), try_me_else(4), label(3), get_atom(dot,0), put_integer(0,0), put_integer(3,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(eof,0), put_integer(0,0), put_integer(3,1), execute('$sys_var_set_bit'/2)]). predicate('$$get_read_options2/1_$aux1'/1,124,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(error,3),(warning,5),(fail,7)]), label(2), try_me_else(4), label(3), get_atom(error,0), put_integer(1,0), put_integer(0,1), execute('$sys_var_write'/2), label(4), retry_me_else(6), label(5), get_atom(warning,0), put_integer(1,0), put_integer(1,1), execute('$sys_var_write'/2), label(6), trust_me_else_fail, label(7), get_atom(fail,0), put_integer(1,0), put_integer(2,1), execute('$sys_var_write'/2)]). predicate(read_atom/1,148,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(read_atom,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), deallocate, call_c('Read_Atom_1',[boolean],[x(0)]), proceed]). predicate(read_atom/2,154,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(read_atom,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Read_Atom_2',[boolean],[x(0),x(1)]), proceed]). predicate(read_integer/1,162,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(read_integer,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), deallocate, call_c('Read_Integer_1',[boolean],[x(0)]), proceed]). predicate(read_integer/2,168,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(read_integer,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Read_Integer_2',[boolean],[x(0),x(1)]), proceed]). predicate(read_number/1,176,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_atom(read_number,0), put_integer(1,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), deallocate, call_c('Read_Number_1',[boolean],[x(0)]), proceed]). predicate(read_number/2,182,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(read_number,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_read_defaults'/0), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Read_Number_2',[boolean],[x(0),x(1)]), proceed]). predicate(read_token/1,190,static,private,built_in,[ put_atom(read_token,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Read_Token_1',[boolean],[x(0)]), proceed]). predicate(read_token/2,194,static,private,built_in,[ put_atom(read_token,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Read_Token_2',[boolean],[x(0),x(1)]), proceed]). predicate(last_read_start_line_column/2,200,static,private,built_in,[ put_atom(last_read_start_line_column,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Last_Read_Start_Line_Column_2',[boolean],[x(0),x(1)]), proceed]). predicate(char_conversion/2,207,static,private,built_in,[ put_atom(char_conversion,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Char_Conversion_2',[],[x(0),x(1)]), proceed]). predicate(current_char_conversion/2,214,static,private,built_in,[ put_atom(current_char_conversion,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Current_Char_Conversion_2',[boolean],[x(0),x(1)]), proceed]). predicate('$current_char_conversion_alt'/0,221,static,private,built_in,[ call_c('Current_Char_Conversion_Alt_0',[boolean],[]), proceed]). ./gprolog-1.3.0/src/BipsPl/random.pl0000644004425400513100000000431510547162353015577 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : random.pl * * Descr.: random number generator management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: random.pl,v 1.11 2007/01/04 10:35:11 diaz Exp $ */ :- built_in. '$use_random'. randomize :- '$call_c'('M_Randomize'). set_seed(Seed) :- set_bip_name(set_seed, 1), '$call_c'('Set_Seed_1'(Seed)). get_seed(Seed) :- set_bip_name(get_seed, 1), '$call_c_test'('Get_Seed_1'(Seed)). random(N) :- set_bip_name(random, 1), '$call_c'('Random_1'(N)). random(L, U, N) :- set_bip_name(random, 3), '$call_c_test'('Random_3'(L, U, N)). ./gprolog-1.3.0/src/BipsPl/all_solut_c.c0000644004425400513100000004526510547154132016433 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : all_solut_c.c * * Descr.: all solution collector management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: all_solut_c.c,v 1.12 2007/01/04 10:35:06 diaz Exp $ */ #include #define OBJ_INIT All_Solut_Initializer #include "engine_pl.h" #include "bips_pl.h" #ifndef _WIN32 #include #include #endif /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct onesol *OneSolP; typedef struct onesol { OneSolP prev; int sol_no; int term_size; WamWord term_word; } OneSol; /*---------------------------------* * Global Variables * *---------------------------------*/ static WamWord exist_2; static WamWord new_gen_word; static long *bound_var_ptr; static WamWord *free_var_base; static OneSol dummy = { NULL, 0, 0 }; static OneSol *sol = &dummy; static long *key_var_ptr; static long *save_key_var_ptr; static long *next_key_var_ptr; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Bound_Var(WamWord *adr); static WamWord Existential_Variables(WamWord start_word); static void Free_Var(WamWord *adr); static void Handle_Key_Variables(WamWord start_word); static void Link_Key_Var(WamWord *adr); static WamWord Group(WamWord all_sol_word, WamWord gl_key_word, WamWord *key_adr); #define GROUP_SOLUTIONS_ALT X2467726F75705F736F6C7574696F6E735F616C74 Prolog_Prototype(GROUP_SOLUTIONS_ALT, 0); /*-------------------------------------------------------------------------* * ALL_SOLUT_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void All_Solut_Initializer(void) { exist_2 = Functor_Arity(ATOM_CHAR('^'), 2); } /*-------------------------------------------------------------------------* * This part collects all free variables, i.e. variables appearing in the * * generator but neither in the template nor in the set of existentially * * qualified variables. * * - collect variables of the template (bound variables) * * - collect existentially qualified variables of the generator * * btw: compute the unqualified generator * * - make in the heap the array of free variables of the unqualified * * generator * * - create a Prolog term (gl_key) with the free variables. * *-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------* * FREE_VARIABLES_4 * * * * Fail if no free variables. * *-------------------------------------------------------------------------*/ Bool Free_Variables_4(WamWord templ_word, WamWord gen_word, WamWord gen1_word, WamWord key_word) { WamWord gl_key_word; WamWord *save_H, *arg; int nb_free_var = 0; bound_var_ptr = glob_dico_var; /* glob_dico_var: stores bound vars */ Treat_Vars_Of_Term(templ_word, TRUE, Bound_Var); new_gen_word = Existential_Variables(gen_word); save_H = H++; /* one more word for f/n is possible */ arg = free_var_base = H; /* array is in the heap */ Treat_Vars_Of_Term(new_gen_word, TRUE, Free_Var); nb_free_var = H - arg; if (nb_free_var == 0) return FALSE; if (nb_free_var <= MAX_ARITY) { *save_H = Functor_Arity(ATOM_CHAR('.'), nb_free_var); gl_key_word = Tag_STC(save_H); } else { H = free_var_base; gl_key_word = Mk_Proper_List(nb_free_var, arg); } Unify(new_gen_word, gen1_word); return Unify(gl_key_word, key_word); } /*-------------------------------------------------------------------------* * RECOVER_GENERATOR_1 * * * *-------------------------------------------------------------------------*/ void Recover_Generator_1(WamWord gen1_word) { Unify(new_gen_word, gen1_word); } /*-------------------------------------------------------------------------* * BOUND_VAR * * * *-------------------------------------------------------------------------*/ static void Bound_Var(WamWord *adr) { long *p; for (p = glob_dico_var; p < bound_var_ptr; p++) if (*p == (long) adr) return; if (bound_var_ptr - glob_dico_var >= MAX_VAR_IN_TERM) Pl_Err_Representation(representation_too_many_variables); *bound_var_ptr++ = (long) adr; } /*-------------------------------------------------------------------------* * EXISTENTIAL_VARIABLES * * * *-------------------------------------------------------------------------*/ static WamWord Existential_Variables(WamWord start_word) { WamWord word, tag_mask; WamWord *adr; DEREF(start_word, word, tag_mask); if (tag_mask == TAG_STC_MASK) { adr = UnTag_STC(word); if (Functor_And_Arity(adr) == exist_2) { Treat_Vars_Of_Term(Arg(adr, 0), TRUE, Bound_Var); word = Existential_Variables(Arg(adr, 1)); } } return word; } /*-------------------------------------------------------------------------* * FREE_VAR * * * *-------------------------------------------------------------------------*/ static void Free_Var(WamWord *adr) { long *p; WamWord word; for (p = glob_dico_var; p < bound_var_ptr; p++) if (*p == (long) adr) return; word = Tag_REF(adr); /* if an FDV for a Dont_Separate_Tag */ for (p = free_var_base; p < H; p++) if (*p == word) return; *H++ = word; } /*-------------------------------------------------------------------------* * This part saves and restores all solutions found. A stack of solutions * * is used (each solution is copied to a Mallocated memory area). To handle* * nested findall and al, each solution receive a sequential number. At the* * start, the number of the solution on the top of the stack serves as a * * stop mark. * * * * Recovering the solutions: a space for the list of (nb_sol) solutions is * * reserved on the top of the heap (nb_sol*2 WamWords) then each term is * * poped from the stack and copied to the heap (the list of solutions is * * constructed from last to first (since we handle a stack). * * * * There is a special treatment for bagof/3. Each solution is a term of * * the form Key-Value. In order to group solutions by Key we use a keysort * * (done in Prolog) + Group_Solutions_3 (written in C). However, keysort/2 * * tests a term equality (==) while a structural equality is needed. * * * * Structural equality: T1 and T2 are structurally equal if their tree * * representation is equivalent (we say that T1 and T2 are variant). Namely* * there is a a bijection f from the variable of T1 to the variables of T2 * * such that T2 == f(T1). * * For instance f(A,g(B),A) is a variant of f(C,g(D),C) but f(A,B) is not a* * variant of f(C,D). * * * * Since we use keysort we have to first transform two keys K1 and K2 that * * are variants to a same term K. This can be done by unifying (linking) * * each (unbound) variable of K1 with a unique term, similarly for K2. * * The unique term used is a free variable (in fact a variable of K1). * * The function Handle_Key_Variables performs that. A set of used variables* * is maintained (a stack). Treatment of a key: * * * * - save_key_var_ptr=key_var_ptr (save current top of stack) * * - next_key_var_ptr=base of the stack * * - for each variable V of Key: * * - if V is in the stack do nothing * * - if next_key_var_ptrsol_no, stop_word); } /*-------------------------------------------------------------------------* * STORE_SOLUTION_1 * * * *-------------------------------------------------------------------------*/ void Store_Solution_1(WamWord term_word) { OneSol *s; int size; /* fix_bug is because when gcc sees &xxx where xxx is a fct argument variable * it allocates a frame even with -fomit-frame-pointer. * This corrupts ebp on ix86 */ static WamWord fix_bug; size = Term_Size(term_word); s = (OneSol *) Malloc(sizeof(OneSol) - sizeof(WamWord) + size * sizeof(WamWord)); s->prev = sol; s->sol_no = sol->sol_no + 1; s->term_size = size; fix_bug = term_word; Copy_Term(&s->term_word, &fix_bug); sol = s; } /*-------------------------------------------------------------------------* * RECOVER_SOLUTIONS_2 * * * *-------------------------------------------------------------------------*/ Bool Recover_Solutions_2(WamWord stop_word, WamWord handle_key_word, WamWord list_word) { int stop; int nb_sol; WamWord *p, *q; OneSol *s; Bool handle_key; stop = Rd_Integer(stop_word); nb_sol = sol->sol_no - stop; if (nb_sol == 0) return Get_Nil(list_word); handle_key = Rd_Integer(handle_key_word); key_var_ptr = glob_dico_var; /* glob_dico_var: key vars */ H += 2 * nb_sol; p = q = H; while (nb_sol--) { p--; *p = Tag_LST(p + 1); *--p = Tag_REF(H); Copy_Contiguous_Term(H, &sol->term_word); if (handle_key) Handle_Key_Variables(*H); H += sol->term_size; s = sol; sol = sol->prev; Free(s); } q[-1] = NIL_WORD; return Unify(Tag_LST(p), list_word); } /*-------------------------------------------------------------------------* * HANDLE_KEY_VARIABLES * * * *-------------------------------------------------------------------------*/ static void Handle_Key_Variables(WamWord start_word) { WamWord word, tag_mask; WamWord *adr; save_key_var_ptr = key_var_ptr; next_key_var_ptr = glob_dico_var; DEREF(start_word, word, tag_mask); adr = UnTag_STC(word); Treat_Vars_Of_Term(Arg(adr, 0), TRUE, Link_Key_Var); } /*-------------------------------------------------------------------------* * LINK_KEY_VAR * * * *-------------------------------------------------------------------------*/ static void Link_Key_Var(WamWord *adr) { long *p; for (p = glob_dico_var; p < key_var_ptr; p++) if (*p == (long) adr) return; if (next_key_var_ptr < save_key_var_ptr) { /* same as Unify(Tag_REF(adr), *next_key_var_ptr++) */ *adr = *(WamWord *) (*next_key_var_ptr); next_key_var_ptr++; return; } if (key_var_ptr - glob_dico_var >= MAX_VAR_IN_TERM) Pl_Err_Representation(representation_too_many_variables); *key_var_ptr++ = (long) adr; } /*-------------------------------------------------------------------------* * This part goups the solutions according to their Key. The list of all * * solutions is keysorted (form [Key-Val,...]). This function could be * * written in Prolog but we perform an update-in-place of the list saving * * thus memory space. * *-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------* * GROUP_SOLUTIONS_3 * * * *-------------------------------------------------------------------------*/ Bool Group_Solutions_3(WamWord all_sol_word, WamWord gl_key_word, WamWord sol_word) { WamWord word, tag_mask; WamWord key_word; DEREF(all_sol_word, word, tag_mask); if (word == NIL_WORD) return FALSE; word = Group(all_sol_word, gl_key_word, &key_word); if (word != NOT_A_WAM_WORD) { A(0) = word; A(1) = gl_key_word; A(2) = sol_word; Create_Choice_Point((CodePtr) Prolog_Predicate(GROUP_SOLUTIONS_ALT, 0), 3); } Unify(key_word, gl_key_word); return Unify(sol_word, all_sol_word); } /*-------------------------------------------------------------------------* * GROUP_SOLUTIONS_ALT_0 * * * *-------------------------------------------------------------------------*/ Bool Group_Solutions_Alt_0(void) { WamWord all_sol_word, gl_key_word, sol_word; WamWord word; WamWord key_word; Update_Choice_Point((CodePtr) Prolog_Predicate(GROUP_SOLUTIONS_ALT, 0), 0); all_sol_word = AB(B, 0); gl_key_word = AB(B, 1); sol_word = AB(B, 2); word = Group(all_sol_word, gl_key_word, &key_word); if (word == NOT_A_WAM_WORD) Delete_Last_Choice_Point(); else /* non deterministic case */ { AB(B, 0) = word; #if 0 /* the following data is unchanged */ AB(B, 1) = gl_key_word; AB(B, 2) = sol_word; #endif } Unify(key_word, gl_key_word); return Unify(sol_word, all_sol_word); } /*-------------------------------------------------------------------------* * GROUP * * * *-------------------------------------------------------------------------*/ static WamWord Group(WamWord all_sol_word, WamWord gl_key_word, WamWord *key_adr) { WamWord word, tag_mask; WamWord *adr; WamWord *lst_adr, *prev_lst_adr; WamWord key_word, key_word1; DEREF(all_sol_word, word, tag_mask); lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); /* term of the form Key-Value */ adr = UnTag_STC(word); *key_adr = key_word = Arg(adr, 0); for (;;) { /* Arg(adr,1) cannot be a Dont_Separate_Tag */ Car(lst_adr) = Arg(adr, 1); prev_lst_adr = lst_adr; DEREF(Cdr(lst_adr), word, tag_mask); if (word == NIL_WORD) return NOT_A_WAM_WORD; prev_lst_adr = lst_adr; lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); /* term of the form Key-Value */ adr = UnTag_STC(word); key_word1 = Arg(adr, 0); if (Term_Compare(key_word, key_word1) != 0) break; } all_sol_word = Cdr(prev_lst_adr); Cdr(prev_lst_adr) = NIL_WORD; return all_sol_word; } ./gprolog-1.3.0/src/BipsPl/debugger.wam0000644004425400513100000020220410547440332016245 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : debugger.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/debugger.pl'). predicate('$init_debugger'/0,29,static,private,built_in,[ allocate(0), put_integer(13,0), put_integer(1,1), call('$sys_var_write'/2), put_structure(d/2,1), unify_integer(0), unify_nil, put_atom('$debug_info',0), call_c('Blt_G_Link',[fast_call],[x(0),x(1)]), deallocate, execute('$debug_switch_off'/0)]). predicate('$debug_switch_off'/0,38,static,private,built_in,[ put_atom('$debug_mode',0), put_atom(nodebug,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom('$debug_next',0), put_atom(nodebug,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom('$debug_leash',0), put_integer(31,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom('$debug_depth',0), put_integer(10,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), call_c('Reset_Debug_Call_Code_0',[],[]), proceed]). predicate('$debug_switch_on'/1,47,static,private,built_in,[ allocate(1), put_atom('$debug_mode',1), call_c('Blt_G_Assign',[fast_call],[x(1),x(0)]), put_atom('$debug_next',1), call_c('Blt_G_Assign',[fast_call],[x(1),x(0)]), put_atom('$debug_info',0), put_variable(y(0),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_integer(1,0), put_value(y(0),1), put_integer(0,2), put_atom(false,3), call(setarg/4), put_integer(2,0), put_value(y(0),1), put_nil(2), put_atom(false,3), call(setarg/4), deallocate, call_c('Set_Debug_Call_Code_0',[],[]), proceed]). predicate(wam_debug/0,60,static,private,built_in,[ put_atom(wam_debug,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call_c('Debug_Wam',[],[]), proceed]). predicate(notrace/0,67,static,private,built_in,[ put_atom(notrace,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), execute(nodebug/0)]). predicate(nodebug/0,74,static,private,built_in,[ allocate(0), put_atom(nodebug,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$debug_switch_off'/0), deallocate, execute('$show_debugger_mode'/0)]). predicate(trace/0,80,static,private,built_in,[ allocate(0), put_atom(trace,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_atom(trace,0), call('$debug_switch_on'/1), deallocate, execute('$show_debugger_mode'/0)]). predicate(debug/0,86,static,private,built_in,[ allocate(0), put_atom(debug,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_atom(debug,0), call('$debug_switch_on'/1), deallocate, execute('$show_debugger_mode'/0)]). predicate('$show_debugger_mode'/0,94,static,private,built_in,[ allocate(0), put_atom('$debug_mode',1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), call('$show_debugger_mode1'/1), put_atom(debugger_output,0), deallocate, execute(nl/1)]). predicate('$show_debugger_mode1'/1,100,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(nodebug,3),(trace,5),(debug,7)]), label(2), try_me_else(4), label(3), get_atom(nodebug,0), put_atom(debugger_output,0), put_atom('The debugger is switched off',1), execute(write/2), label(4), retry_me_else(6), label(5), allocate(0), get_atom(trace,0), put_atom(debugger_output,0), put_atom('The debugger will first creep -- ',1), call(write/2), put_atom(debugger_output,0), put_atom('showing everything (trace)',1), deallocate, execute(write/2), label(6), trust_me_else_fail, label(7), allocate(0), get_atom(debug,0), put_atom(debugger_output,0), put_atom('The debugger will first leap -- ',1), call(write/2), put_atom(debugger_output,0), put_atom('showing spypoints (debug)',1), deallocate, execute(write/2)]). predicate(debugging/0,114,static,private,built_in,[ allocate(0), put_atom(debugging,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$show_debugger_mode'/0), call('$show_leashing_info'/0), call('$show_undefined_action'/0), deallocate, execute('$show_spy_points'/0)]). predicate(leash/1,124,static,private,built_in,[ load_cut_level(1), try_me_else(1), put_atom(leash,2), put_integer(1,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), execute('$pl_err_instantiation'/0), label(1), retry_me_else(13), switch_on_term(3,2,fail,fail,fail), label(2), switch_on_atom([(full,4),(half,6),(loose,8),(none,10),(tight,12)]), label(3), try_me_else(5), label(4), get_atom(full,0), cut(x(1)), put_list(0), unify_atom(call), unify_list, unify_atom(exit), unify_list, unify_atom(redo), unify_list, unify_atom(fail), unify_list, unify_atom(exception), unify_nil, execute(leash/1), label(5), retry_me_else(7), label(6), get_atom(half,0), cut(x(1)), put_list(0), unify_atom(call), unify_list, unify_atom(redo), unify_nil, execute(leash/1), label(7), retry_me_else(9), label(8), get_atom(loose,0), cut(x(1)), put_list(0), unify_atom(call), unify_nil, execute(leash/1), label(9), retry_me_else(11), label(10), get_atom(none,0), cut(x(1)), put_nil(0), execute(leash/1), label(11), trust_me_else_fail, label(12), get_atom(tight,0), cut(x(1)), put_list(0), unify_atom(call), unify_list, unify_atom(redo), unify_list, unify_atom(fail), unify_list, unify_atom(exception), unify_nil, execute(leash/1), label(13), retry_me_else(14), allocate(2), get_variable(y(0),1), put_variable(y(1),1), call('$leash_make_mask'/2), cut(y(0)), put_atom('$debug_leash',0), put_unsafe_value(y(1),1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), deallocate, execute('$show_leashing_info'/0), label(14), trust_me_else_fail, put_value(x(0),1), put_atom(leash_ports,0), execute('$pl_err_domain'/2)]). predicate('$leash_make_mask'/2,157,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_integer(0,1), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_variable(y(1),1), get_list(0), unify_variable(y(0)), unify_variable(x(0)), put_variable(y(2),1), call('$leash_make_mask'/2), put_value(y(0),0), put_variable(y(3),1), call('$debug_port_mask'/2), math_fast_load_value(y(2),0), math_fast_load_value(y(3),1), call_c('Fct_Fast_Or',[fast_call,x(0)],[x(0),x(1)]), get_value(y(1),0), deallocate, proceed]). predicate('$show_leashing_info'/0,167,static,private,built_in,[ allocate(0), put_atom('$debug_leash',1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), call('$show_leashing_info1'/1), put_atom(debugger_output,0), deallocate, execute(nl/1)]). predicate('$show_leashing_info1'/1,173,static,private,built_in,[ load_cut_level(1), try_me_else(1), get_integer(0,0), cut(x(1)), put_atom(debugger_output,0), put_atom('No leashing',1), execute(write/2), label(1), trust_me_else_fail, allocate(1), get_variable(y(0),0), put_atom(debugger_output,0), put_atom('Using leashing stopping at ',1), call(write/2), put_atom('$debug_work',0), put_integer(91,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(0),0), call('$show_leashing_info2'/1), put_atom(debugger_output,0), put_atom('] ports',1), deallocate, execute(write/2)]). predicate('$show_leashing_info2'/1,184,static,private,built_in,[ try_me_else(1), allocate(3), get_variable(y(0),0), put_variable(y(1),0), put_variable(y(2),1), call('$debug_port_mask'/2), math_fast_load_value(y(0),0), math_fast_load_value(y(2),1), call_c('Fct_Fast_And',[fast_call,x(0)],[x(0),x(1)]), put_integer(0,1), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(0),x(1)]), put_atom('$debug_work',1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), put_atom('$debug_work',1), put_integer(44,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_list(2), unify_value(x(0)), unify_list, unify_local_value(y(1)), unify_nil, put_atom(debugger_output,0), put_atom('~c~a',1), call(format/3), fail, label(1), trust_me_else_fail, proceed]). predicate('$debug_is_not_leashed'/1,197,static,private,built_in,[ allocate(2), put_atom('$debug_leash',1), put_variable(y(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), put_variable(y(1),1), call('$debug_port_mask'/2), math_fast_load_value(y(1),0), math_fast_load_value(y(0),1), call_c('Fct_Fast_And',[fast_call,x(0)],[x(0),x(1)]), put_integer(0,1), call_c('Blt_Fast_Eq',[fast_call,boolean],[x(0),x(1)]), deallocate, proceed]). predicate('$debug_port_mask'/2,205,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(call,3),(exit,5),(redo,7),(fail,9),(exception,11)]), label(2), try_me_else(4), label(3), get_atom(call,0), get_integer(1,1), proceed, label(4), retry_me_else(6), label(5), get_atom(exit,0), get_integer(2,1), proceed, label(6), retry_me_else(8), label(7), get_atom(redo,0), get_integer(4,1), proceed, label(8), retry_me_else(10), label(9), get_atom(fail,0), get_integer(8,1), proceed, label(10), trust_me_else_fail, label(11), get_atom(exception,0), get_integer(16,1), proceed]). predicate('$show_undefined_action'/0,218,static,private,built_in,[ allocate(1), put_atom(unknown,0), put_variable(y(0),1), call(current_prolog_flag/2), put_atom(debugger_output,0), put_atom('Undefined predicates will ',1), call(write/2), put_value(y(0),0), call('$show_undefined_action1'/1), put_atom(debugger_output,0), deallocate, execute(nl/1)]). predicate('$show_undefined_action1'/1,225,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(error,3),(warning,5),(fail,7)]), label(2), try_me_else(4), label(3), get_atom(error,0), put_atom(debugger_output,0), put_atom('raise an existence_error',1), execute(write/2), label(4), retry_me_else(6), label(5), get_atom(warning,0), put_atom(debugger_output,0), put_atom('display a warning message and fail',1), execute(write/2), label(6), trust_me_else_fail, label(7), get_atom(fail,0), put_atom(debugger_output,0), put_atom(fail,1), execute(write/2)]). predicate(spypoint_condition/3,237,static,private,built_in,[ load_cut_level(3), try_me_else(1), put_atom(spypoint_condition,1), put_integer(3,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(3)), execute('$pl_err_instantiation'/0), label(1), retry_me_else(2), call_c('Blt_Callable',[fast_call,boolean],[x(0)]), cut(x(3)), execute('$spypoint_condition1'/3), label(2), trust_me_else_fail, put_value(x(0),1), put_atom(callable,0), execute('$pl_err_type'/2)]). predicate('$spypoint_condition1'/3,250,static,private,built_in,[ try_me_else(1), allocate(0), get_variable(x(4),2), get_variable(x(3),1), get_variable(x(2),0), put_variable(x(0),5), put_variable(x(1),6), call_c('Blt_Functor',[fast_call,boolean],[x(2),x(5),x(6)]), call('$$spypoint_condition1/3_$aux1'/5), fail, label(1), trust_me_else_fail, proceed]). predicate('$$spypoint_condition1/3_$aux1'/5,250,static,private,built_in,[ load_cut_level(5), try_me_else(1), allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), get_variable(y(5),5), put_structure((/)/2,0), unify_local_value(y(0)), unify_local_value(y(1)), call('$current_predicate_any'/1), cut(y(5)), put_structure((/)/2,1), unify_local_value(y(0)), unify_local_value(y(1)), put_list(0), unify_value(x(1)), unify_nil, put_structure(c/3,1), unify_local_value(y(2)), unify_local_value(y(3)), unify_local_value(y(4)), call('$debug_spy_set'/2), put_atom('$debug_mode',0), put_atom(nodebug,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), deallocate, execute(debug/0), label(1), trust_me_else_fail, put_list(2), unify_local_value(x(0)), unify_list, unify_local_value(x(1)), unify_nil, put_atom(debugger_output,0), put_atom('Warning: The predicate ~a/~d is undefined~n',1), execute(format/3)]). predicate(spy/1,266,static,private,built_in,[ try_me_else(1), allocate(1), put_atom(spy,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(0),1), call('$debug_list_of_pred'/2), put_value(y(0),0), put_void(1), call('$debug_spy_set'/2), put_value(y(0),0), put_nil(1), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), put_atom('$debug_mode',0), put_atom(nodebug,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), call(debug/0), fail, label(1), trust_me_else_fail, proceed]). predicate(nospy/1,280,static,private,built_in,[ try_me_else(1), allocate(1), put_atom(nospy,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), put_variable(y(0),1), call('$debug_list_of_pred'/2), put_value(y(0),0), call('$debug_spy_reset'/1), fail, label(1), trust_me_else_fail, proceed]). predicate(nospyall/0,291,static,private,built_in,[ try_me_else(1), allocate(0), put_atom(nospyall,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), put_structure('$debug_spy_point'/3,0), unify_void(3), call(retractall/1), put_atom(debugger_output,0), put_atom('All spypoints removed',1), call(write/2), put_atom(debugger_output,0), call(nl/1), fail, label(1), trust_me_else_fail, proceed]). predicate('$debug_spy_set'/2,303,static,private,built_in,[ load_cut_level(2), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(6), get_list(0), unify_variable(x(0)), unify_variable(y(2)), get_structure((/)/2,0), unify_variable(y(0)), unify_variable(y(1)), get_variable(y(3),1), get_variable(y(4),2), put_value(y(0),0), put_value(y(1),1), put_variable(y(5),2), call('$$debug_spy_set/2_$aux1'/3), put_structure('$debug_spy_point'/3,0), unify_value(y(0)), unify_value(y(1)), unify_local_value(y(3)), call(assertz/1), put_atom(debugger_output,0), put_atom('~a ~a/~d~n',1), put_list(2), unify_local_value(y(5)), unify_list, unify_value(y(0)), unify_list, unify_value(y(1)), unify_nil, call(format/3), cut(y(4)), put_value(y(2),0), put_value(y(3),1), deallocate, execute('$debug_spy_set'/2)]). predicate('$$debug_spy_set/2_$aux1'/3,305,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(2), get_variable(y(0),2), get_variable(x(2),0), get_variable(y(1),3), put_structure('$debug_spy_point'/3,0), unify_local_value(x(2)), unify_local_value(x(1)), unify_void(1), call(retract/1), cut(y(1)), put_value(y(0),0), get_atom('There is already a spypoint on',0), deallocate, proceed, label(1), trust_me_else_fail, get_atom('Spypoint placed on',2), proceed]). predicate('$debug_spy_reset'/1,317,static,private,built_in,[ load_cut_level(1), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(5), get_list(0), unify_variable(x(0)), unify_variable(y(2)), get_structure((/)/2,0), unify_variable(y(0)), unify_variable(y(1)), get_variable(y(3),1), put_value(y(0),0), put_value(y(1),1), put_variable(y(4),2), call('$$debug_spy_reset/1_$aux1'/3), put_atom(debugger_output,0), put_atom('~a ~a/~d~n',1), put_list(2), unify_local_value(y(4)), unify_list, unify_value(y(0)), unify_list, unify_value(y(1)), unify_nil, call(format/3), cut(y(3)), put_value(y(2),0), deallocate, execute('$debug_spy_reset'/1)]). predicate('$$debug_spy_reset/1_$aux1'/3,319,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(2), get_variable(y(0),2), get_variable(x(2),0), get_variable(y(1),3), put_structure('$debug_spy_point'/3,0), unify_local_value(x(2)), unify_local_value(x(1)), unify_void(1), call(retract/1), cut(y(1)), put_value(y(0),0), get_atom('Spypoint removed from',0), deallocate, proceed, label(1), trust_me_else_fail, get_atom('There is no spypoint on',2), proceed]). predicate('$has_spy_point'/2,330,static,private,built_in,[ load_cut_level(2), allocate(1), get_variable(y(0),2), put_variable(x(3),4), put_variable(x(2),5), call_c('Blt_Functor',[fast_call,boolean],[x(0),x(4),x(5)]), put_structure('$debug_spy_point'/3,0), unify_value(x(3)), unify_value(x(2)), unify_local_value(x(1)), put_void(1), call(clause/2), cut(y(0)), deallocate, proceed]). predicate('$has_no_spy_point'/1,335,static,private,built_in,[ load_cut_level(1), try_me_else(1), allocate(1), get_variable(y(0),1), put_variable(x(2),3), put_variable(x(1),4), call_c('Blt_Functor',[fast_call,boolean],[x(0),x(3),x(4)]), put_structure('$debug_spy_point'/3,0), unify_value(x(2)), unify_value(x(1)), unify_void(1), put_void(1), call(clause/2), cut(y(0)), fail, label(1), trust_me_else_fail, proceed]). predicate('$spy_test_condition'/3,345,static,private,built_in,[ load_cut_level(3), get_structure(c/3,2), unify_local_value(x(0)), unify_local_value(x(1)), unify_variable(x(0)), put_value(x(3),1), execute('$$spy_test_condition/3_$aux1'/2)]). predicate('$$spy_test_condition/3_$aux1'/2,345,static,private,built_in,[ load_cut_level(2), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(2)), proceed, label(1), trust_me_else_fail, allocate(1), get_variable(y(0),1), put_atom(spy_conditional,1), put_integer(1,2), put_atom(false,3), call('$call'/4), cut(y(0)), deallocate, proceed]). predicate('$show_spy_points'/0,354,static,private,built_in,[ try_me_else(1), allocate(2), put_atom(debugger_output,0), put_atom('Spypoints:',1), call(write/2), put_atom(debugger_output,0), call(nl/1), put_structure('$debug_spy_point'/3,0), unify_variable(y(0)), unify_variable(y(1)), unify_void(1), put_void(1), call(clause/2), put_atom(debugger_output,0), put_atom(' ~a/~d~n',1), put_list(2), unify_value(y(0)), unify_list, unify_value(y(1)), unify_nil, call(format/3), fail, label(1), trust_me_else_fail, proceed]). predicate('$debug_list_of_pred'/2,366,static,private,built_in,[ load_cut_level(2), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(2)), execute('$pl_err_instantiation'/0), label(1), retry_me_else(8), switch_on_term(2,3,fail,5,7), label(2), try_me_else(4), label(3), get_nil(0), get_nil(1), cut(x(2)), proceed, label(4), retry_me_else(6), label(5), allocate(4), get_variable(y(1),1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), cut(x(2)), put_variable(y(2),1), call('$debug_list_of_pred'/2), put_value(y(0),0), put_variable(y(3),1), call('$debug_list_of_pred'/2), put_unsafe_value(y(2),0), put_unsafe_value(y(3),1), put_value(y(1),2), deallocate, execute(append/3), label(6), trust_me_else_fail, label(7), allocate(1), get_variable(x(3),1), get_structure((-)/2,0), unify_variable(x(0)), unify_variable(x(4)), get_structure((/)/2,0), unify_variable(x(0)), unify_variable(x(1)), get_variable(y(0),2), put_value(x(4),2), call('$debug_list_of_pred1'/4), cut(y(0)), deallocate, proceed, label(8), retry_me_else(9), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_value(y(0),0), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), cut(y(2)), put_atom(max_arity,0), put_variable(y(3),1), call(current_prolog_flag/2), put_value(y(0),0), put_integer(0,1), put_value(y(3),2), put_value(y(1),3), call('$debug_list_of_pred1'/4), cut(y(2)), deallocate, proceed, label(9), trust_me_else_fail, allocate(3), get_variable(y(0),1), put_variable(y(1),1), put_variable(y(2),2), call('$get_pred_indic'/3), put_unsafe_value(y(1),0), put_unsafe_value(y(2),1), put_unsafe_value(y(2),2), put_value(y(0),3), deallocate, execute('$debug_list_of_pred1'/4)]). predicate('$debug_list_of_pred1'/4,394,static,private,built_in,[ load_cut_level(4), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(4)), execute('$pl_err_instantiation'/0), label(1), retry_me_else(2), call_c('Blt_Var',[fast_call,boolean],[x(1)]), cut(x(4)), execute('$pl_err_instantiation'/0), label(2), retry_me_else(3), call_c('Blt_Var',[fast_call,boolean],[x(2)]), cut(x(4)), execute('$pl_err_instantiation'/0), label(3), trust_me_else_fail, allocate(5), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_value(y(0),0), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), put_atom(max_arity,0), put_variable(y(4),1), call(current_prolog_flag/2), put_value(y(1),0), call_c('Blt_Integer',[fast_call,boolean],[x(0)]), put_value(y(2),0), call_c('Blt_Integer',[fast_call,boolean],[x(0)]), math_fast_load_value(y(1),0), put_integer(0,1), call_c('Blt_Fast_Gte',[fast_call,boolean],[x(0),x(1)]), math_fast_load_value(y(1),0), math_fast_load_value(y(4),1), call_c('Blt_Fast_Lte',[fast_call,boolean],[x(0),x(1)]), math_fast_load_value(y(2),0), put_integer(0,1), call_c('Blt_Fast_Gte',[fast_call,boolean],[x(0),x(1)]), math_fast_load_value(y(2),0), math_fast_load_value(y(4),1), call_c('Blt_Fast_Lte',[fast_call,boolean],[x(0),x(1)]), put_atom('$debug_work',0), put_nil(1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), call('$$debug_list_of_pred1/4_$aux1'/4), put_value(y(3),0), put_value(y(1),1), put_value(y(2),2), put_unsafe_value(y(4),3), put_value(y(0),4), deallocate, execute('$$debug_list_of_pred1/4_$aux2'/5)]). predicate('$$debug_list_of_pred1/4_$aux2'/5,406,static,private,built_in,[ try_me_else(1), allocate(2), get_variable(y(0),4), get_nil(0), put_value(x(1),0), put_value(x(2),1), put_variable(y(1),2), call('$$debug_list_of_pred1/4_$aux3'/4), put_atom(debugger_output,0), put_atom('Warning: spy ~a/~w - no matching predicate~n',1), put_list(2), unify_local_value(y(0)), unify_list, unify_local_value(y(1)), unify_nil, deallocate, execute(format/3), label(1), trust_me_else_fail, proceed]). predicate('$$debug_list_of_pred1/4_$aux3'/4,406,static,private,built_in,[ try_me_else(1), get_value(x(1),0), get_value(x(0),2), proceed, label(1), retry_me_else(2), get_integer(0,0), get_value(x(3),1), get_atom(any,2), proceed, label(2), trust_me_else_fail, get_structure((-)/2,2), unify_local_value(x(0)), unify_local_value(x(1)), proceed]). predicate('$$debug_list_of_pred1/4_$aux1'/4,406,static,private,built_in,[ try_me_else(1), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_structure((/)/2,0), unify_local_value(y(0)), unify_variable(y(3)), call('$current_predicate_any'/1), math_fast_load_value(y(3),0), math_fast_load_value(y(1),1), call_c('Blt_Fast_Gte',[fast_call,boolean],[x(0),x(1)]), math_fast_load_value(y(3),0), math_fast_load_value(y(2),1), call_c('Blt_Fast_Lte',[fast_call,boolean],[x(0),x(1)]), put_atom('$debug_work',0), put_variable(x(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom('$debug_work',0), put_structure((/)/2,3), unify_local_value(y(0)), unify_value(y(3)), put_list(1), unify_value(x(3)), unify_value(x(2)), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), fail, label(1), trust_me_else_fail, put_atom('$debug_work',0), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(3)]), proceed]). predicate('$debug_call'/2,444,static,private,built_in,[ load_cut_level(2), try_me_else(23), switch_on_term(3,1,fail,fail,2), label(1), switch_on_atom([(notrace,4),(nodebug,6),(trace,8),(debug,10),(debugging,12),(nospyall,22)]), label(2), switch_on_structure([(leash/1,14),(spy/1,16),(spypoint_condition/3,18),(nospy/1,20)]), label(3), try_me_else(5), label(4), get_atom(notrace,0), cut(x(2)), execute(notrace/0), label(5), retry_me_else(7), label(6), get_atom(nodebug,0), cut(x(2)), execute(nodebug/0), label(7), retry_me_else(9), label(8), get_atom(trace,0), cut(x(2)), execute(trace/0), label(9), retry_me_else(11), label(10), get_atom(debug,0), cut(x(2)), execute(debug/0), label(11), retry_me_else(13), label(12), get_atom(debugging,0), cut(x(2)), execute(debugging/0), label(13), retry_me_else(15), label(14), get_structure(leash/1,0), unify_variable(x(0)), cut(x(2)), execute(leash/1), label(15), retry_me_else(17), label(16), get_structure(spy/1,0), unify_variable(x(0)), cut(x(2)), execute(spy/1), label(17), retry_me_else(19), label(18), get_structure(spypoint_condition/3,0), unify_variable(x(0)), unify_variable(x(1)), unify_variable(x(3)), cut(x(2)), put_value(x(3),2), execute(spypoint_condition/3), label(19), retry_me_else(21), label(20), get_structure(nospy/1,0), unify_variable(x(0)), cut(x(2)), execute(nospy/1), label(21), trust_me_else_fail, label(22), get_atom(nospyall,0), cut(x(2)), execute(nospyall/0), label(23), trust_me_else_fail, allocate(10), get_variable(y(0),0), get_variable(y(1),1), put_atom('$debug_info',0), put_variable(y(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(2),0), get_structure(d/2,0), unify_variable(y(3)), unify_variable(y(4)), put_value(y(4),0), put_variable(y(5),1), call('$$debug_call/2_$aux1'/2), math_fast_load_value(y(3),0), call_c('Fct_Fast_Inc',[fast_call,x(0)],[x(0)]), get_variable(y(6),0), math_fast_load_value(y(5),0), call_c('Fct_Fast_Inc',[fast_call,x(0)],[x(0)]), get_variable(y(7),0), put_variable(y(8),0), call('$get_current_B'/1), put_variable(y(9),0), get_list(0), unify_variable(x(0)), unify_value(y(4)), get_structure(a/4,0), unify_local_value(y(0)), unify_local_value(y(6)), unify_local_value(y(7)), unify_local_value(y(8)), put_integer(1,0), put_value(y(2),1), put_value(y(6),2), call(setarg/3), put_integer(2,0), put_value(y(2),1), put_value(y(9),2), call(setarg/3), put_value(y(0),0), put_value(y(1),1), put_value(y(6),2), put_value(y(7),3), put_unsafe_value(y(9),4), put_unsafe_value(y(2),5), put_value(y(3),6), put_value(y(4),7), deallocate, execute('$debug_call1'/8)]). predicate('$$debug_call/2_$aux1'/2,476,static,private,built_in,[ load_cut_level(2), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), cut(x(2)), get_integer(0,1), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_variable(x(0)), unify_void(1), get_structure(a/4,0), unify_void(2), unify_local_value(x(1)), unify_void(1), proceed]). predicate('$debug_call1'/8,499,static,private,built_in,[ load_cut_level(8), try_me_else(1), allocate(10), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), get_variable(y(5),5), get_variable(y(6),7), get_variable(y(7),8), put_variable(y(8),0), call('$get_current_B'/1), put_structure('$debug_exception_port'/5,2), unify_local_value(y(0)), unify_local_value(y(2)), unify_local_value(y(3)), unify_local_value(y(4)), unify_variable(x(1)), put_structure('$debug_call_port'/5,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_local_value(y(2)), unify_local_value(y(3)), unify_local_value(y(4)), put_integer(0,3), call('$catch_internal'/4), put_variable(y(9),0), call('$get_current_B'/1), put_value(y(0),0), put_value(y(2),1), put_value(y(3),2), put_value(y(4),3), put_value(y(5),4), put_value(y(6),5), call('$debug_end_call'/6), put_unsafe_value(y(9),0), put_unsafe_value(y(8),1), put_value(y(7),2), deallocate, execute('$$debug_call1/8_$aux1'/3), label(1), retry_me_else(2), allocate(0), put_value(x(2),1), put_value(x(3),2), put_value(x(4),3), put_atom(fail,4), call('$debug_port'/5), fail, label(2), trust_me_else_fail, allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),5), get_variable(y(3),7), put_atom('$debug_next',1), put_structure(retry/1,3), unify_variable(x(0)), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(3)]), math_fast_load_value(x(0),0), math_fast_load_value(x(2),1), call_c('Blt_Fast_Gte',[fast_call,boolean],[x(0),x(1)]), put_value(x(6),2), put_integer(1,0), put_value(y(2),1), call(setarg/3), put_integer(2,0), put_value(y(2),1), put_value(y(3),2), call(setarg/3), put_atom('$debug_next',0), put_atom(trace,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$debug_call'/2)]). predicate('$$debug_call1/8_$aux1'/3,499,static,private,built_in,[ try_me_else(1), math_fast_load_value(x(0),0), math_fast_load_value(x(1),1), call_c('Blt_Fast_Lte',[fast_call,boolean],[x(0),x(1)]), cut(x(2)), proceed, label(1), trust_me_else_fail, proceed]). predicate('$debug_call_port'/5,529,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom('$debug_unify',0), put_atom('',1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(x(2),1), put_value(x(3),2), put_value(x(4),3), put_value(y(0),0), put_atom(call,4), call('$debug_port'/5), put_atom('$debug_unify',1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), put_value(y(0),1), put_value(y(1),2), deallocate, execute('$$debug_call_port/5_$aux1'/3)]). predicate('$$debug_call_port/5_$aux1'/3,529,static,private,built_in,[ load_cut_level(3), try_me_else(1), put_atom('',4), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(4)]), cut(x(3)), put_value(x(1),0), put_value(x(2),1), execute('$call_from_debugger'/2), label(1), trust_me_else_fail, get_value(x(0),1), proceed]). predicate('$debug_end_call'/6,541,static,private,built_in,[ try_me_else(1), allocate(2), get_variable(y(0),4), get_variable(y(1),5), put_atom(exit,4), call('$debug_port'/5), put_integer(2,0), put_value(y(0),1), put_value(y(1),2), deallocate, execute(setarg/3), label(1), trust_me_else_fail, allocate(0), put_atom(redo,4), call('$debug_port'/5), fail]). predicate('$debug_exception_port'/5,552,static,private,built_in,[ allocate(1), get_variable(y(0),4), put_atom('$debug_ball',4), put_value(y(0),5), call_c('Blt_G_Assign',[fast_call],[x(4),x(5)]), put_atom(exception,4), call('$debug_port'/5), put_value(y(0),0), put_atom('$debug_exception_port',1), put_integer(5,2), put_atom(true,3), deallocate, execute('$throw'/4)]). predicate('$debug_port'/5,562,static,private,built_in,[ allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), put_variable(y(5),0), call('$get_current_B'/1), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), put_value(y(4),4), put_unsafe_value(y(5),5), deallocate, execute('$debug_port1'/6)]). predicate('$debug_port1'/6,567,static,private,built_in,[ try_me_else(1), allocate(0), call('$debug_port2'/6), fail, label(1), trust_me_else_fail, put_atom('$debug_next',1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), proceed]). predicate('$debug_port2'/6,578,static,private,built_in,[ load_cut_level(6), try_me_else(1), allocate(1), get_variable(x(2),1), get_variable(x(1),0), get_variable(y(0),6), put_atom('$debug_next',3), put_variable(x(0),5), call_c('Blt_G_Read',[fast_call,boolean],[x(3),x(5)]), put_value(x(4),3), call('$debug_port_ignore'/4), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, execute('$debug_port_prompt'/6)]). predicate('$debug_port_ignore'/4,588,static,private,built_in,[ load_cut_level(4), switch_on_term(4,1,fail,fail,3), label(1), switch_on_atom([(nodebug,5),(debug,2),(skip,11)]), label(2), try(7), trust(9), label(3), switch_on_structure([(fail/1,13),(retry/1,15)]), label(4), try_me_else(6), label(5), get_atom(nodebug,0), proceed, label(6), retry_me_else(8), label(7), get_atom(debug,0), put_value(x(1),0), execute('$has_no_spy_point'/1), label(8), retry_me_else(10), label(9), allocate(3), get_atom(debug,0), get_variable(y(0),1), get_variable(y(1),3), put_value(y(0),0), put_variable(y(2),1), call('$has_spy_point'/2), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(2),2), deallocate, execute('$$debug_port_ignore/4_$aux1'/3), label(10), retry_me_else(12), label(11), allocate(5), get_atom(skip,0), get_variable(y(0),2), get_variable(y(1),4), put_atom('$debug_skip',0), put_structure(s/2,1), unify_variable(y(2)), unify_variable(y(3)), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(x(3),0), put_variable(y(4),1), call('$debug_port_mask'/2), put_value(y(0),0), put_value(y(2),1), put_unsafe_value(y(4),2), put_value(y(3),3), put_value(y(1),4), deallocate, execute('$$debug_port_ignore/4_$aux2'/5), label(12), retry_me_else(14), label(13), allocate(1), get_structure(fail/1,0), unify_variable(x(1)), get_variable(y(0),4), put_value(x(2),0), put_value(x(3),2), call('$$debug_port_ignore/4_$aux3'/3), cut(y(0)), deallocate, proceed, label(14), trust_me_else_fail, label(15), get_structure(retry/1,0), unify_void(1), proceed]). predicate('$$debug_port_ignore/4_$aux3'/3,609,static,private,built_in,[ try_me_else(1), math_fast_load_value(x(0),0), math_fast_load_value(x(1),1), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, put_atom(fail,0), call_c('Blt_Term_Neq',[fast_call,boolean],[x(2),x(0)]), proceed]). predicate('$$debug_port_ignore/4_$aux2'/5,600,static,private,built_in,[ load_cut_level(5), try_me_else(1), get_value(x(1),0), math_fast_load_value(x(2),0), math_fast_load_value(x(3),1), call_c('Fct_Fast_And',[fast_call,x(0)],[x(0),x(1)]), put_integer(0,1), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(0),x(1)]), cut(x(5)), fail, label(1), trust_me_else_fail, cut(x(4)), proceed]). predicate('$$debug_port_ignore/4_$aux1'/3,593,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(1), get_variable(y(0),3), call('$spy_test_condition'/3), cut(y(0)), fail, label(1), trust_me_else_fail, proceed]). predicate('$debug_port_prompt'/6,619,static,private,built_in,[ load_cut_level(6), allocate(7), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), get_variable(y(5),5), get_variable(y(6),6), call(repeat/0), put_atom('$debug_next',0), put_atom(trace,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(4),3), call('$debug_write_goal'/4), put_value(y(0),0), put_value(y(4),1), put_value(y(1),2), put_value(y(3),3), put_value(y(5),4), call('$$debug_port_prompt/6_$aux1'/5), cut(y(6)), deallocate, proceed]). predicate('$$debug_port_prompt/6_$aux1'/5,619,static,private,built_in,[ load_cut_level(5), try_me_else(1), allocate(2), get_variable(y(0),1), get_variable(y(1),5), call('$has_no_spy_point'/1), put_value(y(0),0), call('$debug_is_not_leashed'/1), cut(y(1)), put_atom(debugger_output,0), deallocate, execute(nl/1), label(1), trust_me_else_fail, allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), put_variable(y(5),0), call('$debug_read_cmd'/1), put_unsafe_value(y(5),0), put_value(y(0),1), put_value(y(2),2), put_value(y(3),3), put_value(y(1),4), put_value(y(4),5), deallocate, execute('$debug_exec_cmd'/6)]). predicate('$debug_read_cmd'/1,633,static,private,built_in,[ allocate(2), get_variable(y(0),0), put_atom(debugger_output,0), put_atom(' ? ',1), call(write/2), put_atom(debugger_output,0), call(flush_output/1), put_atom(debugger_input,0), put_variable(y(1),1), call(get_key/2), math_fast_load_value(y(1),0), put_integer(0,1), call_c('Blt_Fast_Gte',[fast_call,boolean],[x(0),x(1)]), math_fast_load_value(y(1),0), put_integer(255,1), call_c('Blt_Fast_Lt',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), put_value(y(1),1), call(char_code/2), put_atom(debugger_output,0), put_atom('~N',1), put_nil(2), deallocate, execute(format/3)]). predicate('$debug_read_integer'/1,645,static,private,built_in,[ load_cut_level(1), allocate(1), get_variable(y(0),1), put_value(x(0),1), put_atom(debugger_input,0), call(read_integer/2), call(repeat/0), put_atom(debugger_input,0), put_integer(10,1), call(get_code/2), cut(y(0)), deallocate, proceed]). predicate('$debug_exec_cmd'/6,653,static,private,built_in,[ load_cut_level(6), try_me_else(1), allocate(1), put_variable(y(0),1), call(char_code/2), math_fast_load_value(y(0),0), put_integer(10,1), call_c('Blt_Fast_Gte',[fast_call,boolean],[x(0),x(1)]), math_fast_load_value(y(0),0), put_integer(13,1), call_c('Blt_Fast_Lte',[fast_call,boolean],[x(0),x(1)]), put_atom(c,0), put_void(1), put_void(2), put_void(3), put_void(4), put_void(5), deallocate, execute('$debug_exec_cmd'/6), label(1), retry_me_else(66), switch_on_term(6,2,fail,fail,fail), label(2), switch_on_atom([(c,7),(l,9),(s,3),('G',15),(r,4),(f,5),(w,25),(d,27),(p,29),(e,31),(g,33),('A',35),(u,37),(n,39),((=),41),('.',43),((+),45),((*),47),((-),49),('L',51),(a,53),(b,55),(@,57),((<),59),((?),61),(h,63),('W',65)]), label(3), try(11), trust(13), label(4), try(17), trust(19), label(5), try(21), trust(23), label(6), try_me_else(8), label(7), get_atom(c,0), put_atom('$debug_next',0), put_atom(trace,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(8), retry_me_else(10), label(9), get_atom(l,0), put_atom('$debug_next',0), put_atom(debug,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(10), retry_me_else(12), label(11), allocate(1), get_atom(s,0), get_variable(y(0),6), put_value(x(4),0), call('$$debug_exec_cmd/6_$aux1'/1), cut(y(0)), put_atom(c,0), put_void(1), put_void(2), put_void(3), put_void(4), put_void(5), deallocate, execute('$debug_exec_cmd'/6), label(12), retry_me_else(14), label(13), allocate(4), get_atom(s,0), get_variable(y(0),2), put_atom('$debug_next',0), put_atom(skip,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(exit,0), put_variable(y(1),1), call('$debug_port_mask'/2), put_atom(fail,0), put_variable(y(2),1), call('$debug_port_mask'/2), put_atom(exception,0), put_variable(y(3),1), call('$debug_port_mask'/2), math_fast_load_value(y(1),0), math_fast_load_value(y(2),1), call_c('Fct_Fast_Or',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(3),1), call_c('Fct_Fast_Or',[fast_call,x(2)],[x(0),x(1)]), put_atom('$debug_skip',0), put_structure(s/2,1), unify_local_value(y(0)), unify_local_value(x(2)), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), deallocate, proceed, label(14), retry_me_else(16), label(15), allocate(1), get_atom('G',0), put_atom(debugger_output,0), put_atom('Inovcation nb: ',1), call(write/2), put_variable(y(0),0), call('$debug_read_integer'/1), put_atom('$debug_next',0), put_atom(skip,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom('$debug_skip',0), put_structure(s/2,1), unify_local_value(y(0)), unify_integer(31), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), deallocate, proceed, label(16), retry_me_else(18), label(17), get_atom(r,0), get_atom(call,4), cut(x(6)), fail, label(18), retry_me_else(20), label(19), get_atom(r,0), put_atom('$debug_next',0), put_structure(retry/1,1), unify_local_value(x(2)), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(20), retry_me_else(22), label(21), get_atom(f,0), get_atom(fail,4), cut(x(6)), fail, label(22), retry_me_else(24), label(23), get_atom(f,0), put_atom('$debug_next',0), put_structure(fail/1,1), unify_local_value(x(2)), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(24), retry_me_else(26), label(25), allocate(2), get_atom(w,0), get_variable(y(0),1), get_variable(y(1),6), put_atom(debugger_output,0), put_atom(' ',1), call(write/2), put_atom(debugger_output,0), put_value(y(0),1), call(write/2), put_atom(debugger_output,0), call(nl/1), cut(y(1)), fail, label(26), retry_me_else(28), label(27), allocate(2), get_atom(d,0), get_variable(y(0),1), get_variable(y(1),6), put_atom(debugger_output,0), put_atom(' ',1), call(write/2), put_atom(debugger_output,0), put_value(y(0),1), call(display/2), put_atom(debugger_output,0), call(nl/1), cut(y(1)), fail, label(28), retry_me_else(30), label(29), allocate(2), get_atom(p,0), get_variable(y(0),1), get_variable(y(1),6), put_atom(debugger_output,0), put_atom(' ',1), call(write/2), put_atom(debugger_output,0), put_value(y(0),1), call(print/2), put_atom(debugger_output,0), call(nl/1), cut(y(1)), fail, label(30), retry_me_else(32), label(31), allocate(1), get_atom(e,0), get_variable(y(0),6), put_value(x(4),0), call('$$debug_exec_cmd/6_$aux2'/1), cut(y(0)), fail, label(32), retry_me_else(34), label(33), allocate(1), get_atom(g,0), get_variable(y(0),6), put_value(x(3),0), call('$debug_disp_anc_lst'/1), cut(y(0)), fail, label(34), retry_me_else(36), label(35), allocate(1), get_atom('A',0), get_variable(y(0),6), put_value(x(3),0), put_value(x(5),1), call('$debug_disp_alternatives'/2), cut(y(0)), fail, label(36), retry_me_else(38), label(37), get_atom(u,0), put_value(x(4),0), put_value(x(6),1), execute('$$debug_exec_cmd/6_$aux3'/2), label(38), retry_me_else(40), label(39), get_atom(n,0), execute('$debug_switch_off'/0), label(40), retry_me_else(42), label(41), allocate(1), get_atom(=,0), get_variable(y(0),6), call(debugging/0), cut(y(0)), fail, label(42), retry_me_else(44), label(43), allocate(0), get_atom('.',0), get_variable(x(2),1), cut(x(6)), put_variable(x(0),3), put_variable(x(1),4), call_c('Blt_Functor',[fast_call,boolean],[x(2),x(3),x(4)]), call('$$debug_exec_cmd/6_$aux4'/2), fail, label(44), retry_me_else(46), label(45), allocate(1), get_atom(+,0), get_variable(y(0),6), put_variable(x(3),0), put_variable(x(2),4), call_c('Blt_Functor',[fast_call,boolean],[x(1),x(0),x(4)]), put_structure((/)/2,0), unify_value(x(3)), unify_value(x(2)), call(spy/1), cut(y(0)), fail, label(46), retry_me_else(48), label(47), allocate(5), get_atom(*,0), get_variable(y(0),1), get_variable(y(1),6), call(repeat/0), put_atom(debugger_output,0), put_atom('Goal,Port,Test: ',1), call(write/2), put_atom(debugger_input,0), put_structure((',')/2,1), unify_variable(y(2)), unify_structure((',')/2), unify_variable(y(3)), unify_variable(y(4)), call(read/2), put_value(y(2),0), call_c('Blt_Callable',[fast_call,boolean],[x(0)]), put_value(y(0),0), put_variable(x(1),3), put_variable(x(2),4), call_c('Blt_Functor',[fast_call,boolean],[x(0),x(3),x(4)]), put_value(y(2),0), call_c('Blt_Functor',[fast_call,boolean],[x(0),x(1),x(2)]), put_value(y(2),0), put_value(y(3),1), put_value(y(4),2), call(spypoint_condition/3), cut(y(1)), fail, label(48), retry_me_else(50), label(49), allocate(1), get_atom(-,0), get_variable(y(0),6), put_variable(x(3),0), put_variable(x(2),4), call_c('Blt_Functor',[fast_call,boolean],[x(1),x(0),x(4)]), put_structure((/)/2,0), unify_value(x(3)), unify_value(x(2)), call(nospy/1), cut(y(0)), fail, label(50), retry_me_else(52), label(51), allocate(0), get_atom('L',0), get_variable(x(0),1), cut(x(6)), put_variable(x(1),3), put_variable(x(2),4), call_c('Blt_Functor',[fast_call,boolean],[x(0),x(3),x(4)]), put_structure((/)/2,0), unify_value(x(1)), unify_value(x(2)), call('$$debug_exec_cmd/6_$aux5'/3), fail, label(52), retry_me_else(54), label(53), get_atom(a,0), execute(abort/0), label(54), retry_me_else(56), label(55), allocate(1), get_atom(b,0), get_variable(y(0),6), call(break/0), cut(y(0)), fail, label(56), retry_me_else(58), label(57), allocate(2), get_atom(@,0), get_variable(y(0),6), put_atom(debugger_output,0), put_atom('Command: ',1), call(write/2), put_atom(debugger_input,0), put_variable(y(1),1), call(read/2), put_value(y(1),0), call('$$debug_exec_cmd/6_$aux6'/1), cut(y(0)), fail, label(58), retry_me_else(60), label(59), allocate(2), get_atom(<,0), get_variable(y(0),6), put_atom(debugger_output,0), put_atom('Print Depth: ',1), call(write/2), put_variable(y(1),0), call('$debug_read_integer'/1), put_atom('$debug_depth',0), put_unsafe_value(y(1),1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), cut(y(0)), fail, label(60), retry_me_else(62), label(61), allocate(1), get_atom(?,0), get_variable(y(0),6), call('$debug_disp_help'/0), cut(y(0)), fail, label(62), retry_me_else(64), label(63), allocate(1), get_atom(h,0), get_variable(y(0),6), call('$debug_disp_help'/0), cut(y(0)), fail, label(64), trust_me_else_fail, label(65), allocate(1), get_atom('W',0), get_variable(y(0),6), call(wam_debug/0), cut(y(0)), fail, label(66), trust_me_else_fail, allocate(0), put_atom(debugger_output,0), put_atom('Unknown command (type h for help)',1), call(write/2), put_atom(debugger_output,0), call(nl/1), fail]). predicate('$$debug_exec_cmd/6_$aux6'/1,802,static,private,built_in,[ load_cut_level(1), try_me_else(1), allocate(1), get_variable(y(0),1), put_structure(format/3,2), unify_atom(debugger_output), unify_atom('Warning: ~w - exception raised ~w~n'), unify_list, unify_local_value(x(0)), unify_list, unify_variable(x(1)), unify_nil, put_atom(debugger_exec_cmd,3), put_integer(1,4), put_atom(false,5), call('$catch'/6), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, put_list(2), unify_local_value(x(0)), unify_nil, put_atom(debugger_output,0), put_atom('Warning: ~w - goal failed~n',1), execute(format/3)]). predicate('$$debug_exec_cmd/6_$aux5'/3,781,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_value(y(0),0), call('$current_predicate_any'/1), cut(y(3)), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute('$$debug_exec_cmd/6_$aux7'/3), label(1), trust_me_else_fail, get_variable(x(0),2), put_list(2), unify_local_value(x(1)), unify_list, unify_local_value(x(0)), unify_nil, put_atom(debugger_output,0), put_atom('cannot find any info on ~a/~d~n',1), execute(format/3)]). predicate('$$debug_exec_cmd/6_$aux7'/3,781,static,private,built_in,[ load_cut_level(3), try_me_else(1), allocate(3), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), put_atom(native_code,1), call('$predicate_property_any'/2), cut(y(2)), put_atom(debugger_output,0), put_atom('native code predicate ~a/~d~n',1), put_list(2), unify_local_value(y(0)), unify_list, unify_local_value(y(1)), unify_nil, deallocate, execute(format/3), label(1), trust_me_else_fail, allocate(0), call(listing/1), put_atom(debugger_output,0), deallocate, execute(nl/1)]). predicate('$$debug_exec_cmd/6_$aux4'/2,752,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(5), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_structure((/)/2,0), unify_local_value(y(0)), unify_local_value(y(1)), put_variable(y(3),1), put_variable(y(4),2), call('$get_predicate_file_info'/3), cut(y(2)), put_atom(debugger_output,0), put_atom('~a/~d defined in ~a:~d~n',1), put_list(2), unify_local_value(y(0)), unify_list, unify_local_value(y(1)), unify_list, unify_local_value(y(3)), unify_list, unify_local_value(y(4)), unify_nil, deallocate, execute(format/3), label(1), trust_me_else_fail, put_list(2), unify_local_value(x(0)), unify_list, unify_local_value(x(1)), unify_nil, put_atom(debugger_output,0), put_atom('no file information for ~a/~d~n',1), execute(format/3)]). predicate('$$debug_exec_cmd/6_$aux3'/2,735,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(1), get_atom(call,0), cut(x(2)), put_atom(debugger_output,0), put_atom('Head: ',1), call(write/2), put_atom(debugger_input,0), put_variable(y(0),1), call(read/2), put_atom('$debug_unify',0), put_unsafe_value(y(0),1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), deallocate, proceed, label(1), trust_me_else_fail, allocate(1), get_variable(y(0),1), put_atom(debugger_output,0), put_atom('Option not applicable at this port',1), call(write/2), put_atom(debugger_output,0), call(nl/1), cut(y(0)), fail]). predicate('$$debug_exec_cmd/6_$aux2'/1,718,static,private,built_in,[ load_cut_level(1), try_me_else(1), get_atom(exception,0), cut(x(1)), put_atom('$debug_ball',1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), put_list(2), unify_value(x(0)), unify_nil, put_atom(debugger_output,0), put_atom('Exception raised: ~q~n',1), execute(format/3), label(1), trust_me_else_fail, allocate(0), put_atom(debugger_output,0), put_atom('Option not applicable at this port',1), call(write/2), put_atom(debugger_output,0), deallocate, execute(nl/1)]). predicate('$$debug_exec_cmd/6_$aux1'/1,665,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(exit,3),(fail,5),(exception,7)]), label(2), try_me_else(4), label(3), get_atom(exit,0), proceed, label(4), retry_me_else(6), label(5), get_atom(fail,0), proceed, label(6), trust_me_else_fail, label(7), get_atom(exception,0), proceed]). predicate('$debug_write_goal'/4,841,static,private,built_in,[ allocate(7), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_atom('$debug_depth',0), put_variable(y(4),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), put_variable(y(5),1), call('$$debug_write_goal/4_$aux1'/2), put_value(y(3),0), put_variable(y(6),1), call('$debug_port_pretty'/2), put_atom(debugger_output,0), put_atom('~N ~a %4d %4d ~a',1), put_list(2), unify_local_value(y(5)), unify_list, unify_local_value(y(1)), unify_list, unify_local_value(y(2)), unify_list, unify_local_value(y(6)), unify_nil, call(format/3), put_atom(debugger_output,0), put_value(y(0),1), put_structure(quoted/1,4), unify_atom(true), put_structure(max_depth/1,3), unify_local_value(y(4)), put_list(2), unify_value(x(4)), unify_list, unify_value(x(3)), unify_nil, deallocate, execute(write_term/3)]). predicate('$$debug_write_goal/4_$aux1'/2,841,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(2), get_variable(y(0),1), get_variable(y(1),2), call('$has_no_spy_point'/1), cut(y(1)), put_value(y(0),0), get_atom(' ',0), deallocate, proceed, label(1), trust_me_else_fail, get_atom(+,1), proceed]). predicate('$debug_port_pretty'/2,855,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(call,3),(redo,5),(fail,7),(exit,9),(exception,11),(no_port,13)]), label(2), try_me_else(4), label(3), get_atom(call,0), get_atom('Call: ',1), proceed, label(4), retry_me_else(6), label(5), get_atom(redo,0), get_atom('Redo: ',1), proceed, label(6), retry_me_else(8), label(7), get_atom(fail,0), get_atom('Fail: ',1), proceed, label(8), retry_me_else(10), label(9), get_atom(exit,0), get_atom('Exit: ',1), proceed, label(10), retry_me_else(12), label(11), get_atom(exception,0), get_atom('Exception: ',1), proceed, label(12), trust_me_else_fail, label(13), get_atom(no_port,0), get_atom('',1), proceed]). predicate('$debug_disp_anc_lst'/1,870,static,private,built_in,[ allocate(1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_structure(a/4,0), unify_void(4), put_atom(debugger_output,0), put_atom('Ancestors:',1), call(write/2), put_atom(debugger_output,0), call(nl/1), put_value(y(0),0), deallocate, execute('$debug_disp_anc_lst1'/1)]). predicate('$debug_disp_anc_lst1'/1,876,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(3), get_list(0), unify_variable(x(1)), unify_variable(x(0)), get_structure(a/4,1), unify_variable(y(0)), unify_variable(y(1)), unify_variable(y(2)), unify_void(1), call('$debug_disp_anc_lst1'/1), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_atom(no_port,3), deallocate, execute('$debug_write_goal'/4)]). predicate('$debug_disp_alternatives'/2,885,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(debugger_output,0), put_atom('Alternatives:',1), call(write/2), put_atom(debugger_output,0), call(nl/1), put_value(y(0),0), put_value(y(1),1), call('$debug_disp_alternatives1'/2), put_atom(debugger_output,0), put_atom('~N--------------~n',1), put_nil(2), deallocate, execute(format/3)]). predicate('$debug_disp_alternatives1'/2,892,static,private,built_in,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(5), get_variable(y(4),1), get_list(0), unify_variable(x(1)), unify_variable(x(0)), get_structure(a/4,1), unify_variable(y(0)), unify_variable(y(1)), unify_variable(y(2)), unify_variable(y(3)), put_value(y(3),1), call('$debug_disp_alternatives1'/2), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_atom(no_port,3), call('$debug_write_goal'/4), put_value(y(4),0), put_value(y(3),1), deallocate, execute('$debug_disp_alt'/2)]). predicate('$debug_disp_alt'/2,900,static,private,built_in,[ load_cut_level(2), try_me_else(1), get_value(x(1),0), cut(x(2)), proceed, label(1), trust_me_else_fail, allocate(8), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_value(y(0),0), put_variable(y(3),1), put_variable(y(4),2), put_variable(y(5),3), call('$choice_point_info'/4), put_value(y(5),0), put_value(y(1),1), call('$debug_disp_alt'/2), put_value(y(3),0), put_value(y(4),1), put_variable(y(6),2), put_variable(y(7),3), call('$pred_without_aux'/4), put_value(y(6),0), put_value(y(7),1), put_value(y(0),2), call('$debug_disp_alt1'/3), cut(y(2)), deallocate, proceed]). predicate('$debug_disp_alt1'/3,910,static,private,built_in,[ try_me_else(1), execute('$debug_is_debug_predicate'/1), label(1), retry_me_else(2), allocate(2), put_variable(x(0),3), put_variable(x(1),4), call_c('Scan_Choice_Point_Info_3',[boolean],[x(2),x(3),x(4)]), put_variable(y(0),2), put_variable(y(1),3), call('$pred_without_aux'/4), put_structure((/)/2,0), unify_local_value(y(0)), unify_local_value(y(1)), deallocate, execute('$debug_disp_alt2'/1), label(2), retry_me_else(8), switch_on_term(4,3,fail,fail,fail), label(3), switch_on_atom([('$catch_internal1',5),('$trail_handler',7)]), label(4), try_me_else(6), label(5), allocate(1), get_atom('$catch_internal1',0), get_integer(5,1), put_value(x(2),0), put_integer(1,1), put_variable(y(0),2), call('$choice_point_arg'/3), put_unsafe_value(y(0),1), put_variable(x(0),2), put_void(3), call_c('Blt_Functor',[fast_call,boolean],[x(1),x(2),x(3)]), deallocate, execute('$debug_is_debug_predicate'/1), label(6), trust_me_else_fail, label(7), get_atom('$trail_handler',0), get_integer(1,1), proceed, label(8), retry_me_else(9), allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_value(y(0),0), put_integer(0,1), put_integer(1,2), put_void(3), put_atom($,4), call(sub_atom/5), put_structure((/)/2,0), unify_local_value(y(0)), unify_local_value(y(1)), put_atom(native_code,1), call('$predicate_property_any'/2), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$$debug_disp_alt1/3_$aux1'/2), label(9), trust_me_else_fail, get_variable(x(2),0), put_structure((/)/2,0), unify_local_value(x(2)), unify_local_value(x(1)), execute('$debug_disp_alt2'/1)]). predicate('$$debug_disp_alt1/3_$aux1'/2,925,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(3), get_variable(y(0),2), put_variable(y(1),1), put_variable(y(2),2), call('$$debug_disp_alt1/3_$aux2'/3), cut(y(0)), put_structure((/)/2,0), unify_local_value(y(1)), unify_local_value(y(2)), deallocate, execute('$debug_disp_alt2'/1), label(1), trust_me_else_fail, get_variable(x(2),0), put_structure('system predicate'/1,0), unify_structure((/)/2), unify_local_value(x(2)), unify_local_value(x(1)), execute('$debug_disp_alt2'/1)]). predicate('$$debug_disp_alt1/3_$aux2'/3,925,static,private,built_in,[ try_me_else(1), allocate(2), get_variable(y(0),1), get_variable(y(1),2), put_integer(1,1), put_void(2), put_integer(4,3), put_value(y(0),4), call(sub_atom/5), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$debug_check_bip'/2), label(1), trust_me_else_fail, allocate(2), get_variable(y(0),1), get_variable(y(1),2), put_integer(1,1), put_void(2), put_integer(1,3), put_value(y(0),4), call(sub_atom/5), put_value(y(0),0), put_value(y(1),1), deallocate, execute('$debug_check_bip'/2)]). predicate('$debug_disp_alt2'/1,941,static,private,built_in,[ put_list(2), unify_local_value(x(0)), unify_nil, put_atom(debugger_output,0), put_atom('~N 1 choice-point for ~w~n',1), execute(format/3)]). predicate('$debug_is_debug_predicate'/1,947,static,private,built_in,[ put_integer(0,1), put_integer(7,2), put_void(3), put_atom('$debug_',4), execute(sub_atom/5)]). predicate('$debug_check_bip'/2,953,static,private,built_in,[ load_cut_level(2), try_me_else(1), allocate(1), get_variable(x(3),0), get_variable(y(0),2), put_structure((/)/2,0), unify_local_value(x(3)), unify_local_value(x(1)), put_atom(built_in,1), call(predicate_property/2), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, get_variable(x(2),0), put_structure((/)/2,0), unify_local_value(x(2)), unify_local_value(x(1)), put_atom(built_in_fd,1), execute(predicate_property/2)]). predicate('$debug_disp_help'/0,962,static,private,built_in,[ allocate(0), put_atom(debugger_output,0), put_atom('Debugging commands:~n~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom('RET/c creep l leap ~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom(' s skip G goto~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom(' r retry f fail~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom(' w write d display~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom(' p print e exception~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom(' g ancestors A alternatives~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom(' u unify . father file~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom(' n nodebug = debugging~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom(' + spy this * spy conditionally~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom(' - nospy this L listing~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom(' a abort b break~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom(' @ command < set printdepth~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), put_atom(' h/? help W WAM debugger~n',1), put_nil(2), call(format/3), put_atom(debugger_output,0), deallocate, execute(nl/1)]). predicate('$choice_point_info'/4,983,static,private,built_in,[ call_c('Choice_Point_Info_4',[],[x(0),x(1),x(2),x(3)]), proceed]). predicate('$choice_point_arg'/3,987,static,private,built_in,[ call_c('Choice_Point_Arg_3',[],[x(0),x(1),x(2)]), proceed]). ./gprolog-1.3.0/src/BipsPl/throw_c.c0000644004425400513100000000654110547154140015571 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : throw_c.c * * Descr.: exception management (throw) - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: throw_c.c,v 1.11 2007/01/04 10:35:12 diaz Exp $ */ #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ WamWord *query_top_b; /* overwritten by foreign_supp if present */ WamWord query_exception; /* overwritten by foreign_supp if present */ /*---------------------------------* * Function Prototypes * *---------------------------------*/ /*-------------------------------------------------------------------------* * THROW_2 * * * *-------------------------------------------------------------------------*/ void Throw_2(WamWord ball_word, WamWord b_word) { WamWord word, tag_mask; WamWord *b; StmInf *pstm; DEREF(b_word, word, tag_mask); b = From_WamWord_To_B(word); if (b <= query_top_b && query_top_b != NULL) { Assign_B(query_top_b); query_exception = ball_word; Exit_With_Exception(); } if (b == LSSA) { pstm = stm_tbl[stm_top_level_output]; Stream_Printf(pstm, "\nsystem_error(cannot_catch_throw("); Write_Term(pstm, -1, MAX_PREC, WRITE_NUMBER_VARS | WRITE_NAME_VARS | WRITE_QUOTED, ball_word); Stream_Printf(pstm, "))\n"); return; } Cut(b_word); } ./gprolog-1.3.0/src/BipsPl/char_io.wam0000644004425400513100000001357410547440332016077 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : char_io.pl % date : 1 5 2007 % time : 13:13:14 file_name('/home/diaz/GP/src/src/BipsPl/char_io.pl'). predicate('$use_char_io'/0,29,static,private,built_in,[ proceed]). predicate(get_key/1,32,static,private,built_in,[ put_atom(get_key,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Get_Key_1',[boolean],[x(0)]), proceed]). predicate(get_key/2,36,static,private,built_in,[ put_atom(get_key,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Get_Key_2',[boolean],[x(0),x(1)]), proceed]). predicate(get_key_no_echo/1,41,static,private,built_in,[ put_atom(get_key_no_echo,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Get_Key_No_Echo_1',[boolean],[x(0)]), proceed]). predicate(get_key_no_echo/2,45,static,private,built_in,[ put_atom(get_key_no_echo,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Get_Key_No_Echo_2',[boolean],[x(0),x(1)]), proceed]). predicate(get_char/1,54,static,private,built_in,[ put_atom(get_char,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Get_Char_1',[boolean],[x(0)]), proceed]). predicate(get_char/2,58,static,private,built_in,[ put_atom(get_char,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Get_Char_2',[boolean],[x(0),x(1)]), proceed]). predicate(get_code/1,65,static,private,built_in,[ put_atom(get_code,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Get_Code_1',[boolean],[x(0)]), proceed]). predicate(get_code/2,69,static,private,built_in,[ put_atom(get_code,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Get_Code_2',[boolean],[x(0),x(1)]), proceed]). predicate(get_byte/1,76,static,private,built_in,[ put_atom(get_byte,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Get_Byte_1',[boolean],[x(0)]), proceed]). predicate(get_byte/2,80,static,private,built_in,[ put_atom(get_byte,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Get_Byte_2',[boolean],[x(0),x(1)]), proceed]). predicate(unget_char/1,90,static,private,built_in,[ put_atom(unget_char,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Unget_Char_1',[],[x(0)]), proceed]). predicate(unget_char/2,94,static,private,built_in,[ put_atom(unget_char,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Unget_Char_2',[],[x(0),x(1)]), proceed]). predicate(unget_code/1,101,static,private,built_in,[ put_atom(unget_code,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Unget_Code_1',[],[x(0)]), proceed]). predicate(unget_code/2,105,static,private,built_in,[ put_atom(unget_code,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Unget_Code_2',[],[x(0),x(1)]), proceed]). predicate(unget_byte/1,112,static,private,built_in,[ put_atom(unget_byte,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Unget_Byte_1',[],[x(0)]), proceed]). predicate(unget_byte/2,116,static,private,built_in,[ put_atom(unget_byte,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Unget_Byte_2',[],[x(0),x(1)]), proceed]). predicate(peek_char/1,125,static,private,built_in,[ put_atom(peek_char,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Peek_Char_1',[boolean],[x(0)]), proceed]). predicate(peek_char/2,129,static,private,built_in,[ put_atom(peek_char,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Peek_Char_2',[boolean],[x(0),x(1)]), proceed]). predicate(peek_code/1,136,static,private,built_in,[ put_atom(peek_code,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Peek_Code_1',[boolean],[x(0)]), proceed]). predicate(peek_code/2,140,static,private,built_in,[ put_atom(peek_code,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Peek_Code_2',[boolean],[x(0),x(1)]), proceed]). predicate(peek_byte/1,147,static,private,built_in,[ put_atom(peek_byte,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Peek_Byte_1',[boolean],[x(0)]), proceed]). predicate(peek_byte/2,151,static,private,built_in,[ put_atom(peek_byte,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Peek_Byte_2',[boolean],[x(0),x(1)]), proceed]). predicate(put_char/1,160,static,private,built_in,[ put_atom(put_char,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Put_Char_1',[],[x(0)]), proceed]). predicate(put_char/2,164,static,private,built_in,[ put_atom(put_char,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Put_Char_2',[],[x(0),x(1)]), proceed]). predicate(put_code/1,171,static,private,built_in,[ put_atom(put_code,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Put_Code_1',[],[x(0)]), proceed]). predicate(put_code/2,175,static,private,built_in,[ put_atom(put_code,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Put_Code_2',[],[x(0),x(1)]), proceed]). predicate(put_byte/1,182,static,private,built_in,[ put_atom(put_byte,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Put_Byte_1',[],[x(0)]), proceed]). predicate(put_byte/2,186,static,private,built_in,[ put_atom(put_byte,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Put_Byte_2',[],[x(0),x(1)]), proceed]). ./gprolog-1.3.0/src/BipsPl/consult.pl0000644004425400513100000001602010547162351016000 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : consult.pl * * Descr.: file consulting * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: consult.pl,v 1.12 2007/01/04 10:35:08 diaz Exp $ */ :- built_in. '$use_consult'. [File|Files] :- consult([File|Files]). consult(File) :- set_bip_name(consult, 1), '$check_atom_or_atom_list'(File), !, ( atom(File), File \== [] -> '$consult2'(File) ; '$consult1'(File) ). '$consult1'([]). '$consult1'([File|Files]) :- '$consult2'(File), '$consult1'(Files). '$consult2'(File) :- '$call_c_test'('Prolog_File_Name_2'(File, File1)), ( File1 = user -> File2 = File1 ; '$call_c_test'('Absolute_File_Name_2'(File1, File2)), ( file_exists(File2) -> true ; set_bip_name(consult, 1), '$pl_err_existence'(source_sink, File1) ) ), temporary_file('', gplc, TmpFile), set_bip_name(consult, 1), ( '$consult3'(TmpFile, File2) -> '$load_file'(TmpFile), unlink(TmpFile) ; unlink(TmpFile), format(top_level_output, 'compilation failed~n', []), fail ). '$consult3'(TmpFile, PlFile) :- '$call_c_test'('Consult_2'(TmpFile, PlFile)). /* '$consult3'(TmpFile,PlFile):- write_pl_state_file(TmpFile), Args=['-w','--compile-msg','--pl-state',TmpFile,'-o',TmpFile,PlFile |End], (current_prolog_flag(singleton_warning,on) -> End=[] ; End=['--no-singl-warn']), spawn(pl2wam,Args,0). */ '$load_file'(BCFile) :- open(BCFile, read, Stream), repeat, read(Stream, P), ( P = end_of_file -> ! ; '$load_pred'(P, Stream), fail ), close(Stream). '$load_pred'(file_name(PlFile), _) :- g_assign('$pl_file', PlFile). '$load_pred'(directive(PlLine, Type, Goal), _) :- ( '$catch'(Goal, CallErr, '$load_directive_exception'(CallErr, PlLine, Type), load, 1, true) -> true ; g_read('$pl_file', PlFile), format(top_level_output, '~Nwarning: ~a:~d: ~a directive failed~n', [PlFile, PlLine, Type]) ). '$load_pred'(predicate(PI, PlLine, StaDyn, PubPriv, UsBplBfd, NbCl), Stream) :- g_read('$pl_file', PlFile), '$check_pred_type'(PI, PlFile, PlLine), '$check_owner_files'(PI, PlFile, PlLine), PI = Pred / N, '$bc_start_pred'(Pred, N, PlFile, PlLine, StaDyn, PubPriv, UsBplBfd), g_assign('$ctr', 0), repeat, g_read('$ctr', Ctr), Ctr1 is Ctr + 1, g_assign('$ctr', Ctr1), ( Ctr = NbCl -> true ; read(Stream, clause(Cl, WamCl)), '$add_clause_term_and_bc'(Cl, WamCl), fail ), !. '$load_directive_exception'(CallErr, PlLine, Type) :- g_read('$pl_file', PlFile), format(top_level_output, '~Nwarning: ~a:~d: ~a directive caused exception: ~q~n', [PlFile, PlLine, Type, CallErr]). '$check_pred_type'(PI, PlFile, PlLine) :- '$predicate_property_any'(PI, native_code), !, PI = Name / _, ( '$aux_name'(Name) -> true ; format(top_level_output, 'error: ~a:~d: native code procedure ~q cannot be redefined (ignored)~n', [PlFile, PlLine, PI]) ), fail. '$check_pred_type'(_, _, _). '$check_owner_files'(PI, PlFile, PlLine) :- '$get_predicate_file_info'(PI, PlFile1, PlLine1), PlFile \== PlFile1, !, PI = Name / _, ( '$aux_name'(Name) -> true ; format(top_level_output, 'warning: ~a:~d: redefining procedure ~q~n', [PlFile, PlLine, PI]), format(top_level_output, ' ~a:~d: previous definition~n', [PlFile1, PlLine1]) ). '$check_owner_files'(_, _, _). load(File) :- set_bip_name(load, 1), '$check_atom_or_atom_list'(File), !, ( atom(File), File \== [] -> '$load2'(File) ; '$load1'(File) ). '$load1'([]). '$load1'([File|Files]) :- '$load2'(File), '$load1'(Files). '$load2'(File) :- decompose_file_name(File, _Dir, _Prefix, Suffix), ( Suffix = '' -> atom_concat(File, '.wbc', File1) ; File1 = File ), '$call_c_test'('Absolute_File_Name_2'(File1, File2)), ( file_exists(File2) -> true ; set_bip_name(load, 1), '$pl_err_existence'(source_sink, File1) ), set_bip_name(load, 1), '$load_file'(File1). '$bc_start_pred'(Pred, N, PlFile, PlLine, StaDyn, PubPriv, UsBplBfd) :- '$call_c'('BC_Start_Pred_7'(Pred, N, PlFile, PlLine, StaDyn, PubPriv, UsBplBfd)). '$bc_start_emit' :- '$call_c'('BC_Start_Emit_0'). '$bc_stop_emit' :- '$call_c'('BC_Stop_Emit_0'). '$bc_emit'([]). '$bc_emit'([WamInst|WamCode]) :- '$bc_emit_inst'(WamInst), '$bc_emit'(WamCode). '$bc_emit_inst'(WamInst) :- '$call_c'('BC_Emit_Inst_1'(WamInst)). '$bc_emulate_cont' :- % used by C code to set a continuation '$call_c_jump'('BC_Emulate_Cont_0'). '$add_clause_term'(Cl) :- '$assert'(Cl, 0, 0). '$add_clause_term_and_bc'(Cl, WamCl) :- '$bc_start_emit', '$bc_emit'(WamCl), '$bc_stop_emit', '$add_clause_term'(Cl). % Listing listing :- set_bip_name(listing, 0), '$listing_all'(_). listing(PI) :- set_bip_name(listing, 1), var(PI), !, '$pl_err_instantiation'. listing(N) :- atom(N), !, '$listing_all'(N / _). listing(PI) :- '$listing_all'(PI). '$listing_all'(PI) :- current_prolog_flag(strict_iso, SI), ( set_prolog_flag(strict_iso, off), '$current_predicate'(PI), '$listing_one'(PI), fail ; set_prolog_flag(strict_iso, SI) ). '$listing_one'(PI) :- '$predicate_property_any'(PI, native_code), !, true. '$listing_one'(PI) :- '$get_pred_indic'(PI, N, A), functor(H, N, A), nl(top_level_output), '$clause'(H, B, 2), portray_clause(top_level_output, (H :- B)), nl(top_level_output), fail. '$listing_one'(_). ./gprolog-1.3.0/src/BipsPl/pretty_c.c0000644004425400513100000004455110547154137015766 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : pretty_c.c * * Descr.: pretty print clause management - C part * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: pretty_c.c,v 1.13 2007/01/04 10:35:11 diaz Exp $ */ #define OBJ_INIT Pretty_Initializer #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ #define GENERAL_BODY 0 #define LEFT_AND 1 #define RIGHT_AND 2 #define LEFT_OR 3 #define RIGHT_OR 4 #define LEFT_IF 5 #define RIGHT_IF 6 /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static int atom_clause; static int atom_dcg; static int atom_if; static int atom_dollar_var; static int atom_dollar_varname; static WamWord dollar_var_1; static WamWord dollar_varname_1; static WamWord equal_2; static long *singl_var_ptr; static int nb_singl_var; static int nb_to_try; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Portray_Clause(StmInf *pstm, WamWord term_word); static Bool Check_Structure(WamWord term_word, int func, int arity, WamWord arg_word[]); static Bool Is_Cut(WamWord body_word); static void Show_Body(StmInf *pstm, int level, int context, WamWord body_word); static void Start_Line(StmInf *pstm, int level, char c_before); static void Collect_Singleton(WamWord *adr); static int Var_Name_To_Var_Number(int atom); static void Exclude_A_Var_Number(int n); static void Collect_Excluded_Rec(WamWord start_word); static void Bind_Variable(WamWord *adr, WamWord word); /*-------------------------------------------------------------------------* * PRETTY_INITIALIZER * * * *-------------------------------------------------------------------------*/ static void Pretty_Initializer(void) { atom_clause = Create_Atom(":-"); atom_dcg = Create_Atom("-->"); atom_if = Create_Atom("->"); atom_dollar_var = Create_Atom("$VAR"); atom_dollar_varname = Create_Atom("$VARNAME"); dollar_var_1 = Functor_Arity(atom_dollar_var, 1); dollar_varname_1 = Functor_Arity(atom_dollar_varname, 1); equal_2 = Functor_Arity(ATOM_CHAR('='), 2); } /*-------------------------------------------------------------------------* * PORTRAY_CLAUSE_2 * * * *-------------------------------------------------------------------------*/ void Portray_Clause_2(WamWord sora_word, WamWord term_word) { int stm; StmInf *pstm; stm = (sora_word == NOT_A_WAM_WORD) ? stm_output : Get_Stream_Or_Alias(sora_word, STREAM_CHECK_OUTPUT); pstm = stm_tbl[stm]; last_output_sora = sora_word; Check_Stream_Type(stm, TRUE, FALSE); Portray_Clause(pstm, term_word); } /*-------------------------------------------------------------------------* * PORTRAY_CLAUSE_1 * * * *-------------------------------------------------------------------------*/ void Portray_Clause_1(WamWord term_word) { Portray_Clause_2(NOT_A_WAM_WORD, term_word); } #define WRITE_MASK (WRITE_NUMBER_VARS | WRITE_NAME_VARS | \ WRITE_QUOTED | WRITE_SPACE_ARGS) /*-------------------------------------------------------------------------* * PORTRAY_CLAUSE * * * *-------------------------------------------------------------------------*/ static void Portray_Clause(StmInf *pstm, WamWord term_word) { WamWord word, tag_mask; WamWord arg_word[2]; int atom; if (Check_Structure(term_word, atom_clause, 2, arg_word)) { Write_Term(pstm, -1, 1200 - 1, WRITE_MASK, arg_word[0]); DEREF(arg_word[1], word, tag_mask); atom = UnTag_ATM(word); if (tag_mask != TAG_ATM_MASK || atom != atom_true) { Stream_Puts(" :-", pstm); Start_Line(pstm, 0, ' '); Show_Body(pstm, 0, GENERAL_BODY, arg_word[1]); } Write_A_Char(pstm, '.'); return; } if (Check_Structure(term_word, atom_dcg, 2, arg_word)) { Write_Term(pstm, -1, 1200 - 1, WRITE_MASK, arg_word[0]); DEREF(arg_word[1], word, tag_mask); atom = UnTag_ATM(word); if (tag_mask != TAG_ATM_MASK || atom != atom_true) { Stream_Puts(" -->", pstm); Start_Line(pstm, 0, ' '); Show_Body(pstm, 0, GENERAL_BODY, arg_word[1]); } Write_A_Char(pstm, '.'); return; } if (Check_Structure(term_word, atom_clause, 1, arg_word)) { Stream_Puts(":-\t", pstm); Show_Body(pstm, 0, GENERAL_BODY, arg_word[0]); Write_A_Char(pstm, '.'); return; } Write_Term(pstm, -1, MAX_PREC, WRITE_MASK, term_word); Write_A_Char(pstm, '.'); } /*-------------------------------------------------------------------------* * CHECK_STRUCTURE * * * *-------------------------------------------------------------------------*/ static Bool Check_Structure(WamWord term_word, int func, int arity, WamWord arg_word[]) { WamWord word, tag_mask; WamWord *adr; int i; DEREF(term_word, word, tag_mask); if (tag_mask != TAG_STC_MASK) return FALSE; adr = UnTag_STC(word); if (Functor_And_Arity(adr) != Functor_Arity(func, arity)) return FALSE; for (i = 0; i < arity; i++) arg_word[i] = Arg(adr, i); return TRUE; } /*-------------------------------------------------------------------------* * IS_CUT * * * *-------------------------------------------------------------------------*/ static Bool Is_Cut(WamWord body_word) { WamWord word, tag_mask; WamWord arg_word[2]; while (Check_Structure(body_word, ATOM_CHAR(','), 2, arg_word)) body_word = arg_word[0]; DEREF(body_word, word, tag_mask); return (word == Tag_ATM(ATOM_CHAR('!'))); } /*-------------------------------------------------------------------------* * SHOW_BODY * * * *-------------------------------------------------------------------------*/ static void Show_Body(StmInf *pstm, int level, int context, WamWord body_word) { WamWord arg_word[2]; static int prec[] = { 1200 - 1, 1000 - 1, 1000, 1100 - 1, 1100, 1050 - 1, 1050 }; if (Check_Structure(body_word, ATOM_CHAR(','), 2, arg_word)) { Show_Body(pstm, level, LEFT_AND, arg_word[0]); Stream_Putc(',', pstm); if (Is_Cut(arg_word[1])) Stream_Putc(' ', pstm); else Start_Line(pstm, level, ' '); Show_Body(pstm, level, RIGHT_AND, arg_word[1]); return; } if (Check_Structure(body_word, ATOM_CHAR(';'), 2, arg_word)) { if (context != RIGHT_OR) { Stream_Puts("( ", pstm); level++; } Show_Body(pstm, level, LEFT_OR, arg_word[0]); Start_Line(pstm, level, ';'); Show_Body(pstm, level, RIGHT_OR, arg_word[1]); if (context != RIGHT_OR) { Start_Line(pstm, level - 1, ' '); Stream_Putc(')', pstm); } return; } if (Check_Structure(body_word, atom_if, 2, arg_word)) { if (context != LEFT_OR && context != RIGHT_OR) { Stream_Puts("( ", pstm); level++; } Show_Body(pstm, level, LEFT_IF, arg_word[0]); Stream_Puts(" ->", pstm); Start_Line(pstm, level, ' '); Show_Body(pstm, level, RIGHT_IF, arg_word[1]); if (context != LEFT_OR && context != RIGHT_OR) { Start_Line(pstm, level - 1, ' '); Stream_Putc(')', pstm); } return; } Write_Term(pstm, -1, prec[context], WRITE_MASK, body_word); } /*-------------------------------------------------------------------------* * START_LINE * * * *-------------------------------------------------------------------------*/ static void Start_Line(StmInf *pstm, int level, char c_before) { char *p = glob_buff; int i; *p++ = '\n'; *p++ = '\t'; for (i = 0; i < 4 * (level - 1); i++) *p++ = ' '; if (level != 0) { *p++ = c_before; *p++ = ' '; *p++ = ' '; *p++ = ' '; } *p = '\0'; Stream_Puts(glob_buff, pstm); last_writing = 0; /* ie. W_NOTHING */ } /*-------------------------------------------------------------------------* * NAME_SINGLETON_VARS_1 * * * *-------------------------------------------------------------------------*/ void Name_Singleton_Vars_1(WamWord start_word) { WamWord word; singl_var_ptr = glob_dico_var; /* glob_dico_var: stores singletons */ nb_singl_var = 0; Treat_Vars_Of_Term(start_word, FALSE, Collect_Singleton); if (nb_singl_var == 0) return; word = Put_Structure(atom_dollar_varname, 1); Unify_Atom(ATOM_CHAR('_')); /* bind to '$VARNAME'('_') */ while (--singl_var_ptr >= glob_dico_var) { if (*singl_var_ptr & 1) /* marked - not a singleton */ continue; Bind_UV((WamWord *) *singl_var_ptr, word); } } /*-------------------------------------------------------------------------* * COLLECT_SINGLETON * * * *-------------------------------------------------------------------------*/ static void Collect_Singleton(WamWord *adr) { long *p; for (p = glob_dico_var; p < singl_var_ptr; p++) if ((*p & ~1) == (long) adr) /* not a singleton */ { if ((*p & 1) == 0) /* not yet marked - mark it */ { *p |= 1; nb_singl_var--; } return; } if (singl_var_ptr - glob_dico_var >= MAX_VAR_IN_TERM) Pl_Err_Representation(representation_too_many_variables); *singl_var_ptr++ = (long) adr; nb_singl_var++; } /*-------------------------------------------------------------------------* * NAME_QUERY_VARS_2 * * * *-------------------------------------------------------------------------*/ Bool Name_Query_Vars_2(WamWord query_list_word, WamWord rest_list_word) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr, *stc_adr; save_list_word = query_list_word; Check_For_Un_List(rest_list_word); for (;;) { DEREF(query_list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); stc_adr = UnTag_STC(word); if (tag_mask == TAG_STC_MASK && Functor_And_Arity(stc_adr) == equal_2) { /* form: Name=Value */ DEREF(Arg(stc_adr, 0), word, tag_mask); if (tag_mask != TAG_ATM_MASK) goto unchanged; /* Value is a variable */ DEREF(Arg(stc_adr, 1), word, tag_mask); if (tag_mask != TAG_REF_MASK) goto unchanged; /* Value is a variable */ Get_Structure(atom_dollar_varname, 1, word); Unify_Value(Arg(stc_adr, 0)); /* bind Value to '$VARNAME'(Name) */ } else { unchanged: if (!Get_List(rest_list_word) || !Unify_Value(Car(lst_adr))) return FALSE; rest_list_word = Unify_Variable(); } query_list_word = Cdr(lst_adr); } return Get_Nil(rest_list_word); } #define BIND_WITH_NUMBERVAR (sys_var[0] == 0) /*-------------------------------------------------------------------------* * BIND_VARIABLES_4 * * * *-------------------------------------------------------------------------*/ Bool Bind_Variables_4(WamWord term_word, WamWord exclude_list_word, WamWord from_word, WamWord next_word) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr, *stc_adr; int i; for (i = 0; i < MAX_VAR_IN_TERM; i++) glob_dico_var[i] = 0; /* glob_dico_var: excluded var ? (0/1) */ nb_to_try = Rd_Positive_Check(from_word); save_list_word = exclude_list_word; for (;;) { DEREF(exclude_list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(type_list, save_list_word); lst_adr = UnTag_LST(word); DEREF(Car(lst_adr), word, tag_mask); Collect_Excluded_Rec(word); stc_adr = UnTag_STC(word); if (tag_mask == TAG_STC_MASK && Functor_And_Arity(stc_adr) == equal_2) { /* form: Name=Value */ DEREF(Arg(stc_adr, 0), word, tag_mask); if (tag_mask == TAG_ATM_MASK) Exclude_A_Var_Number(Var_Name_To_Var_Number(UnTag_ATM(word))); } exclude_list_word = Cdr(lst_adr); } Treat_Vars_Of_Term(term_word, FALSE, Bind_Variable); return Un_Integer_Check(nb_to_try, next_word); } /*-------------------------------------------------------------------------* * VAR_NAME_TO_VAR_NUMBER * * * *-------------------------------------------------------------------------*/ static int Var_Name_To_Var_Number(int atom) { char *p, *q; int n; p = atom_tbl[atom].name; if (*p < 'A' || *p > 'Z') return -1; n = strtol(p + 1, &q, 10); if (*q) return -1; n = n * 26 + *p - 'A'; return n; } /*-------------------------------------------------------------------------* * EXCLUDE_A_VAR_NUMBER * * * *-------------------------------------------------------------------------*/ static void Exclude_A_Var_Number(int n) { if (n >= 0 && n < MAX_VAR_IN_TERM) glob_dico_var[n] = 1; } /*-------------------------------------------------------------------------* * COLLECT_EXCLUDED_REC * * * *-------------------------------------------------------------------------*/ static void Collect_Excluded_Rec(WamWord start_word) { WamWord word, tag_mask; WamWord *adr; WamWord *stc_adr; int i; terminal_rec: DEREF(start_word, word, tag_mask); if (tag_mask == TAG_LST_MASK) { adr = UnTag_LST(word); adr = &Car(adr); Collect_Excluded_Rec(*adr++); start_word = *adr; goto terminal_rec; } if (tag_mask != TAG_STC_MASK) return; stc_adr = UnTag_STC(word); if (Functor_And_Arity(stc_adr) == dollar_var_1) { DEREF(Arg(stc_adr, 0), word, tag_mask); if (tag_mask != TAG_INT_MASK) goto normal_compound; Exclude_A_Var_Number(UnTag_INT(word)); return; } if (Functor_And_Arity(stc_adr) == dollar_varname_1) { DEREF(Arg(stc_adr, 0), word, tag_mask); if (tag_mask != TAG_ATM_MASK) goto normal_compound; Exclude_A_Var_Number(Var_Name_To_Var_Number(UnTag_ATM(word))); return; } normal_compound: i = Arity(stc_adr); adr = &Arg(stc_adr, 0); while (--i) Collect_Excluded_Rec(*adr++); start_word = *adr; goto terminal_rec; } /*-------------------------------------------------------------------------* * BIND_VARIABLE * * * *-------------------------------------------------------------------------*/ static void Bind_Variable(WamWord *adr, WamWord word) { int i, j; char buff[16]; while (glob_dico_var[nb_to_try] && nb_to_try < MAX_VAR_IN_TERM) nb_to_try++; if (BIND_WITH_NUMBERVAR) { Get_Structure(atom_dollar_var, 1, word); Unify_Integer(nb_to_try++); return; } i = nb_to_try % 26; j = nb_to_try / 26; nb_to_try++; buff[0] = 'A' + i; if (j) sprintf(buff + 1, "%d", j); else buff[1] = '\0'; Get_Structure(atom_dollar_varname, 1, word); Unify_Atom(Create_Allocate_Atom(buff)); } ./gprolog-1.3.0/src/BipsPl/stream_supp.h0000644004425400513100000002632610547154140016476 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : stream_supp.h * * Descr.: stream support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: stream_supp.h,v 1.15 2007/01/04 10:35:12 diaz Exp $ */ #include /*---------------------------------* * Constants * *---------------------------------*/ #define STREAM_PB_SIZE 8 /* push back buffer size */ #define STREAM_MODE_READ 0 #define STREAM_MODE_WRITE 1 #define STREAM_MODE_APPEND 2 #define STREAM_EOF_ACTION_ERROR 0 #define STREAM_EOF_ACTION_EOF_CODE 1 #define STREAM_EOF_ACTION_RESET 2 #define STREAM_BUFFERING_NONE 0 #define STREAM_BUFFERING_LINE 1 #define STREAM_BUFFERING_BLOCK 2 #define STREAM_EOF_NOT 0 #define STREAM_EOF_AT 1 #define STREAM_EOF_PAST 2 /* values for Get_Stream_Or_Alias */ #define STREAM_CHECK_VALID 0 /* simply a valid stream */ #define STREAM_CHECK_EXIST 1 /* valid and exist */ #define STREAM_CHECK_INPUT 2 /* valid, exist and mode=input */ #define STREAM_CHECK_OUTPUT 3 /* valid, exist and mode=output */ #define STREAM_FCT_UNDEFINED ((StmFct) (-1)) /* for optional fct */ /* Constant term streams (prop.other) */ #define TERM_STREAM_ATOM 1 /* values also used in stream.pl */ #define TERM_STREAM_CHARS 2 #define TERM_STREAM_CODES 3 /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct /* Stream properties */ { /* ------------------------------ */ unsigned mode:2; /* see STREAM_MODE_xxx defs */ unsigned input:1; /* is it an input stream ? */ unsigned output:1; /* is it an output stream ? */ unsigned text:1; /* is it a text stream . (or bin) */ unsigned reposition:1; /* can it be repositioned ? */ unsigned eof_action:2; /* see STREAM_EOF_ACTION_xxx defs */ unsigned buffering:2; /* see STREAM_BUFFERING_xxx defs */ unsigned special_close:1; /* does it need a special close ? */ unsigned other:8; /* other prop (1,2,3=term_streams */ } /* 4=socket_stream) */ StmProp; typedef struct /* Push Back stack */ { /* ------------------------------ */ int buff[STREAM_PB_SIZE]; /* the buffer */ int *ptr; /* pointer into the buffer */ int nb_elems; /* # of elements in the buffer */ } PbStk; typedef int (*StmFct) (); /* generic type for file fctions */ typedef struct stm_lst *PStmLst; typedef struct stm_lst /* Chained stream list */ { /* ------------------------------ */ int stm; /* the stream */ PStmLst next; /* next entry */ } StmLst; typedef struct stm_inf /* Stream information */ { /* ------------------------------ */ int atom_file_name; /* atom associated to filename */ long file; /* accessor (FILE *,TTYInf *) != 0*/ StmProp prop; /* assoctiated properties */ StmLst *mirror; /* mirror streams */ StmLst *mirror_of; /* streams this stream as mirror */ /* ----- Basic I/O functions ---- */ StmFct fct_getc; /* get char function (mandatory) */ StmFct fct_putc; /* put char function (mandatory) */ StmFct fct_flush; /* flush function (optional) */ StmFct fct_close; /* close function (optional) */ StmFct fct_tell; /* tell function (optional) */ StmFct fct_seek; /* seek function (optional) */ StmFct fct_clearerr; /* clearerr function (optional) */ /* ------ Read information ----- */ Bool eof_reached; /* has eof char been read ? */ PbStk pb_char; /* character push back stack */ /* ---- Position information --- */ int char_count; /* character read count */ int line_count; /* line read count */ int line_pos; /* line position */ PbStk pb_line_pos; /* line position push back stack */ } StmInf; typedef struct /* Alias information */ { /* ------------------------------ */ long atom; /* atom of the alias (the key) */ int stm; /* associated stream */ } AliasInf; typedef struct /* String Stream information */ { /* ------------------------------ */ char *buff; /* the I/O buffer */ char *ptr; /* current position into the buff */ Bool buff_alloc_size; /* mallocated size (iff output) */ } StrSInf; /*---------------------------------* * Global Variables * *---------------------------------*/ #ifdef STREAM_SUPP_FILE StmInf **stm_tbl; int stm_tbl_size; int stm_last_used; char *alias_tbl; WamWord last_input_sora; WamWord last_output_sora; int stm_stdin; int stm_stdout; int stm_input; int stm_output; int stm_top_level_input; int stm_top_level_output; int stm_debugger_input; int stm_debugger_output; char *le_prompt; int use_le_prompt; int atom_stream; int atom_user_input; int atom_user_output; int atom_top_level_input; int atom_top_level_output; int atom_debugger_input; int atom_debugger_output; int atom_read; int atom_write; int atom_append; int atom_reposition; int atom_stream_position; int atom_text; int atom_binary; int atom_error; int atom_eof_code; int atom_reset; int atom_none; int atom_line; int atom_block; int atom_not; int atom_at; int atom_past; int atom_bof; int atom_current; int atom_eof; #else extern StmInf **stm_tbl; extern int stm_tbl_size; extern int stm_last_used; extern char *alias_tbl; extern WamWord last_input_sora; extern WamWord last_output_sora; extern int stm_stdin; extern int stm_stdout; extern int stm_input; extern int stm_output; extern int stm_top_level_input; extern int stm_top_level_output; extern int stm_debugger_input; extern int stm_debugger_output; extern char *le_prompt; extern int use_le_prompt; extern int atom_stream; extern int atom_user_input; extern int atom_user_output; extern int atom_top_level_input; extern int atom_top_level_output; extern int atom_debugger_input; extern int atom_debugger_output; extern int atom_read; extern int atom_write; extern int atom_append; extern int atom_reposition; extern int atom_stream_position; extern int atom_text; extern int atom_binary; extern int atom_error; extern int atom_eof_code; extern int atom_reset; extern int atom_none; extern int atom_line; extern int atom_block; extern int atom_not; extern int atom_at; extern int atom_past; extern int atom_bof; extern int atom_current; extern int atom_eof; #endif /*---------------------------------* * Function Prototypes * *---------------------------------*/ int Add_Stream(int atom_file_name, long file, StmProp prop, StmFct fct_getc, StmFct fct_putc, StmFct fct_flush, StmFct fct_close, StmFct fct_tell, StmFct fct_seek, StmFct fct_clearerr); int Add_Stream_For_Stdio_Desc(FILE *f, int atom_path, int mode, int text); int Add_Stream_For_Stdio_File(char *path, int mode, Bool text); void Delete_Stream(int stm); int Find_Stream_By_Alias(int atom_alias); Bool Add_Alias_To_Stream(int atom_alias, int stm); void Reassign_Alias(int atom_alias, int stm); void Add_Mirror_To_Stream(int stm, int m_stm); Bool Del_Mirror_From_Stream(int stm, int m_stm); int Find_Stream_From_PStm(StmInf *pstm); void Flush_All_Streams(void); void Set_Stream_Buffering(int stm); int Get_Stream_Or_Alias(WamWord sora_word, int test_mask); void Check_Stream_Type(int stm, Bool check_text, Bool for_input); WamWord Make_Stream_Tagged_Word(int stm); Bool Stdio_Is_Repositionable(FILE *f); void Stdio_Set_Buffering(FILE *f, int buffering); FILE *Stdio_Desc_Of_Stream(int stm); int Io_Fileno_Of_Stream(int stm); int Stream_Getc(StmInf *pstm); int Stream_Get_Key(StmInf *pstm, Bool echo, Bool catch_ctrl_c); void Stream_Ungetc(int c, StmInf *pstm); int Stream_Peekc(StmInf *pstm); char *Stream_Gets(char *str, int size, StmInf *pstm); char *Stream_Gets_Prompt(char *prompt, StmInf *pstm_o, char *str, int size, StmInf *pstm_i); void Stream_Putc(int c, StmInf *pstm); int Stream_Puts(char *str, StmInf *pstm); int Stream_Printf(StmInf *pstm, char *format, ...); void Stream_Flush(StmInf *pstm); int Stream_Close(StmInf *pstm); int Stream_End_Of_Stream(StmInf *pstm); void Stream_Get_Position(StmInf *pstm, int *offset, int *char_count, int *line_count, int *line_pos); int Stream_Set_Position(StmInf *pstm, int whence, int offset, int char_count, int line_count, int line_pos); int Stream_Set_Position_LC(StmInf *pstm, int line_count, int line_pos); int Add_Str_Stream(char *buff, int prop_other); void Delete_Str_Stream(int stm); char *Term_Write_Str_Stream(int stm); void Close_Stm(int stm, Bool force); /* from close_c.c */ #define PB_Init(pb) pb.ptr = pb.buff, pb.nb_elems = 0; #define PB_Is_Empty(pb) (pb.nb_elems == 0) #define PB_Push(pb, elem) \ do \ { \ *(pb.ptr) = (elem); \ if (pb.ptr != pb.buff + STREAM_PB_SIZE - 1) \ pb.ptr++; \ else \ pb.ptr = pb.buff; \ if (pb.nb_elems < STREAM_PB_SIZE) \ pb.nb_elems++; \ } \ while (0) #define PB_Pop(pb, elem) \ do \ { \ if (pb.ptr != pb.buff) \ pb.ptr--; \ else \ pb.ptr = pb.buff + STREAM_PB_SIZE - 1; \ (elem) = *pb.ptr; \ pb.nb_elems--; \ } \ while (0) #define PB_Top(pb, elem) \ do \ { \ if (pb.ptr != pb.buff) \ (elem) = pb.ptr[-1]; \ else \ (elem) = pb.buff[STREAM_PB_SIZE - 1]; \ } \ while (0) ./gprolog-1.3.0/src/BipsPl/type_inl.pl0000644004425400513100000000463310547162354016146 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : type_inl.pl * * Descr.: type testing (inline) management - defs for meta-call * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: type_inl.pl,v 1.11 2007/01/04 10:35:12 diaz Exp $ */ :- built_in. '$use_type_inl'. var(X) :- var(X). nonvar(X) :- nonvar(X). atom(X) :- atom(X). integer(X) :- integer(X). float(X) :- float(X). number(X) :- number(X). atomic(X) :- atomic(X). compound(X) :- compound(X). callable(X) :- callable(X). list(X) :- list(X). partial_list(X) :- partial_list(X). list_or_partial_list(X) :- list_or_partial_list(X). :- built_in_fd(fd_var / 1, non_fd_var / 1, generic_var / 1, non_generic_var / 1). fd_var(X) :- fd_var(X). non_fd_var(X) :- non_fd_var(X). generic_var(X) :- generic_var(X). non_generic_var(X) :- non_generic_var(X). ./gprolog-1.3.0/src/BipsPl/term_supp.c0000644004425400513100000003667310547154140016153 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : term_supp.c * * Descr.: term support * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: term_supp.c,v 1.14 2007/01/04 10:35:12 diaz Exp $ */ #include #define TERM_SUPP_FILE #include "engine_pl.h" #include "bips_pl.h" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /* copy term variables */ static WamWord *base_copy; static WamWord vars[MAX_VAR_IN_TERM * 2]; /* needs 2 words for a variable */ static WamWord *end_vars = vars + MAX_VAR_IN_TERM * 2; static WamWord *top_vars; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Copy_Term_Rec(WamWord *dst_adr, WamWord *src_adr, WamWord **p); /*-------------------------------------------------------------------------* * TERM_COMPARE * * * *-------------------------------------------------------------------------*/ long Term_Compare(WamWord start_u_word, WamWord start_v_word) { WamWord u_word, u_tag_mask; WamWord v_word, v_tag_mask; WamWord u_tag, v_tag; int u_func, u_arity; WamWord *u_arg_adr; int v_func, v_arity; WamWord *v_arg_adr; int i, x; double d1, d2; DEREF(start_u_word, u_word, u_tag_mask); DEREF(start_v_word, v_word, v_tag_mask); u_tag = Tag_From_Tag_Mask(u_tag_mask); v_tag = Tag_From_Tag_Mask(v_tag_mask); switch (u_tag) { case REF: return (v_tag != REF) ? -1 : UnTag_REF(u_word) - UnTag_REF(v_word); #ifndef NO_USE_FD_SOLVER case FDV: if (v_tag == REF) return 1; return (v_tag != FDV) ? -1 : UnTag_FDV(u_word) - UnTag_FDV(v_word); #endif case FLT: if (v_tag == REF #ifndef NO_USE_FD_SOLVER || v_tag == FDV #endif ) return 1; if (v_tag != FLT) return -1; d1 = Obtain_Float(UnTag_FLT(u_word)); d2 = Obtain_Float(UnTag_FLT(v_word)); return (d1 < d2) ? -1 : (d1 == d2) ? 0 : 1; case INT: if (v_tag == REF || #ifndef NO_USE_FD_SOLVER v_tag == FDV || #endif v_tag == FLT) return 1; return (v_tag != INT) ? -1 : UnTag_INT(u_word) - UnTag_INT(v_word); case ATM: if (v_tag == REF || #ifndef NO_USE_FD_SOLVER v_tag == FDV || #endif v_tag == FLT || v_tag == INT) return 1; return (v_tag != ATM) ? -1 : strcmp(atom_tbl[UnTag_ATM(u_word)].name, atom_tbl[UnTag_ATM(v_word)].name); } /* u_tag == LST / STC */ v_arg_adr = Rd_Compound(v_word, &v_func, &v_arity); if (v_arg_adr == NULL) /* v_tag != LST / STC */ return 1; u_arg_adr = Rd_Compound(u_word, &u_func, &u_arity); if (u_arity != v_arity) return u_arity - v_arity; if (u_func != v_func) return strcmp(atom_tbl[u_func].name, atom_tbl[v_func].name); for (i = 0; i < u_arity; i++) if ((x = Term_Compare(*u_arg_adr++, *v_arg_adr++)) != 0) return x; return 0; } /*-------------------------------------------------------------------------* * TREAT_VARS_OF_TERM * * * * Call fct for each variable found in a term. * *-------------------------------------------------------------------------*/ void Treat_Vars_Of_Term(WamWord start_word, Bool generic_var, void (*fct) ()) { WamWord word, tag_mask; WamWord *adr; int i; terminal_rec: DEREF(start_word, word, tag_mask); switch (Tag_Of(word)) { case REF: (*fct) (UnTag_REF(word), word); break; #ifndef NO_USE_FD_SOLVER case FDV: if (generic_var) (*fct) (UnTag_FDV(word), word); break; #endif case LST: adr = UnTag_LST(word); adr = &Car(adr); Treat_Vars_Of_Term(*adr++, generic_var, fct); start_word = *adr; goto terminal_rec; case STC: adr = UnTag_STC(word); i = Arity(adr); adr = &Arg(adr, 0); while (--i) Treat_Vars_Of_Term(*adr++, generic_var, fct); start_word = *adr; goto terminal_rec; } } /*-------------------------------------------------------------------------* * LIST_LENGTH * * * * returns the length of a list or < 0 if not a list: * * -1: instantation error * * -2: type error (type_list) * *-------------------------------------------------------------------------*/ int List_Length(WamWord start_word) { WamWord word, tag_mask; int n = 0; for (;;) { DEREF(start_word, word, tag_mask); if (word == NIL_WORD) return n; if (tag_mask == TAG_REF_MASK) return -1; if (tag_mask != TAG_LST_MASK) return -2; n++; start_word = Cdr(UnTag_LST(word)); } } /*-------------------------------------------------------------------------* * TERM_SIZE * * * *-------------------------------------------------------------------------*/ int Term_Size(WamWord start_word) { WamWord word, tag_mask; WamWord *adr; int i; int n = 0; /* init to zero for terminal_rec */ terminal_rec: DEREF(start_word, word, tag_mask); switch (Tag_From_Tag_Mask(tag_mask)) { #ifndef NO_USE_FD_SOLVER case FDV: /* 1+ for fdv_adr> since Dont_Separate_Tag */ return n + 1 + Fd_Variable_Size(UnTag_FDV(word)); #endif case FLT: #if WORD_SIZE == 32 return n + 1 + 2; #else return n + 1 + 1; #endif case LST: adr = UnTag_LST(word); adr = &Car(adr); n += 1 + Term_Size(*adr++); start_word = *adr; goto terminal_rec; case STC: adr = UnTag_STC(word); n += 2; /* tagged word + f_n */ i = Arity(adr); adr = &Arg(adr, 0); while (--i) n += Term_Size(*adr++); start_word = *adr; goto terminal_rec; default: return n + 1; } } /*-------------------------------------------------------------------------* * COPY_TERM * * * * Copy a non contiguous term, the result is a contiguous term. * *-------------------------------------------------------------------------*/ void Copy_Term(WamWord *dst_adr, WamWord *src_adr) { WamWord *qtop, *base; WamWord *p; /* fix_bug is because when gcc sees &xxx where xxx is a fct argument variable * it allocates a frame even with -fomit-frame-pointer. * This corrupts ebp on ix86 */ static WamWord *fix_bug; base_copy = dst_adr++; base = top_vars = vars; fix_bug = dst_adr; Copy_Term_Rec(base_copy, src_adr, &fix_bug); /* restore original self references */ qtop = top_vars; while (qtop != base) { p = (WamWord *) (*--qtop); /* address to restore */ *p = *--qtop; /* word to restore */ } } /*-------------------------------------------------------------------------* * COPY_TERM_REC * * * * p is the next address to use to store the rest of a term. * *-------------------------------------------------------------------------*/ static void Copy_Term_Rec(WamWord *dst_adr, WamWord *src_adr, WamWord **p) { WamWord word, tag_mask; WamWord *adr; WamWord *q; int i; terminal_rec: DEREF(*src_adr, word, tag_mask); switch (Tag_From_Tag_Mask(tag_mask)) { case REF: adr = UnTag_REF(word); q = *p; if (adr < q && adr >= base_copy) /* already a copy */ { *dst_adr = word; return; } if (top_vars >= end_vars) Pl_Err_Representation(representation_too_many_variables); *top_vars++ = word; /* word to restore */ *top_vars++ = (WamWord) adr; /* address to restore */ *adr = *dst_adr = Tag_REF(dst_adr); /* bind to a new copy */ return; #ifndef NO_USE_FD_SOLVER case FDV: adr = UnTag_FDV(word); q = *p; if (adr < q && adr >= base_copy) /* already a copy */ { *dst_adr = Tag_REF(adr); /* since Dont_Separate_Tag */ return; } if (top_vars >= end_vars) Pl_Err_Representation(representation_too_many_variables); *top_vars++ = word; /* word to restore */ *top_vars++ = (WamWord) adr; /* address to restore */ q = *p; *p = q + Fd_Copy_Variable(q, adr); *adr = *dst_adr = Tag_REF(q); /* bind to a new copy */ return; #endif case FLT: adr = UnTag_FLT(word); q = *p; q[0] = adr[0]; #if WORD_SIZE == 32 q[1] = adr[1]; *p = q + 2; #else *p = q + 1; #endif *dst_adr = Tag_FLT(q); return; case LST: adr = UnTag_LST(word); q = *p; *dst_adr = Tag_LST(q); *p = &Cdr(q) + 1; q = &Car(q); adr = &Car(adr); Copy_Term_Rec(q++, adr++, p); dst_adr = q; src_adr = adr; goto terminal_rec; case STC: adr = UnTag_STC(word); q = *p; *dst_adr = Tag_STC(q); Functor_And_Arity(q) = Functor_And_Arity(adr); i = Arity(adr); *p = &Arg(q, i - 1) + 1; q = &Arg(q, 0); adr = &Arg(adr, 0); while (--i) Copy_Term_Rec(q++, adr++, p); dst_adr = q; src_adr = adr; goto terminal_rec; default: *dst_adr = word; return; } } /*-------------------------------------------------------------------------* * COPY_CONTIGUOUS_TERM * * * * Copy a contiguous term (dereferenced), the result is a contiguous term. * *-------------------------------------------------------------------------*/ void Copy_Contiguous_Term(WamWord *dst_adr, WamWord *src_adr) #define Old_Adr_To_New_Adr(adr) ((dst_adr)+((adr)-(src_adr))) { WamWord word, *adr; WamWord *q; int i; terminal_rec: word = *src_adr; switch (Tag_Of(word)) { case REF: adr = UnTag_REF(word); q = Old_Adr_To_New_Adr(adr); *dst_adr = Tag_REF(q); if (adr > src_adr) /* only useful for Dont_Separate_Tag */ Copy_Contiguous_Term(q, adr); return; #ifndef NO_USE_FD_SOLVER case FDV: adr = UnTag_FDV(word); Fd_Copy_Variable(dst_adr, adr); return; #endif case FLT: adr = UnTag_FLT(word); q = Old_Adr_To_New_Adr(adr); q[0] = adr[0]; #if WORD_SIZE == 32 q[1] = adr[1]; #endif *dst_adr = Tag_FLT(q); return; case LST: adr = UnTag_LST(word); q = Old_Adr_To_New_Adr(adr); *dst_adr = Tag_LST(q); q = &Car(q); adr = &Car(adr); Copy_Contiguous_Term(q++, adr++); dst_adr = q; src_adr = adr; goto terminal_rec; case STC: adr = UnTag_STC(word); q = Old_Adr_To_New_Adr(adr); *dst_adr = Tag_STC(q); Functor_And_Arity(q) = Functor_And_Arity(adr); i = Arity(adr); q = &Arg(q, 0); adr = &Arg(adr, 0); while (--i) Copy_Contiguous_Term(q++, adr++); dst_adr = q; src_adr = adr; goto terminal_rec; default: *dst_adr = word; return; } } /*-------------------------------------------------------------------------* * GET_PRED_INDICATOR * * * * returns the functor and initializes the arity of the predicate indicator* * func= -1 if it is a variable, arity= -1 if it is a variable * *-------------------------------------------------------------------------*/ int Get_Pred_Indicator(WamWord pred_indic_word, Bool must_be_ground, int *arity) { WamWord word, tag_mask; int func; DEREF(pred_indic_word, word, tag_mask); if (tag_mask == TAG_REF_MASK && must_be_ground) Pl_Err_Instantiation(); if (!Get_Structure(ATOM_CHAR('/'), 2, pred_indic_word)) { if (!Flag_Value(FLAG_STRICT_ISO) && Rd_Callable(word, &func, arity) != NULL) return func; Pl_Err_Type(type_predicate_indicator, pred_indic_word); } pi_name_word = Unify_Variable(); pi_arity_word = Unify_Variable(); if (must_be_ground) func = Rd_Atom_Check(pi_name_word); else { DEREF(pi_name_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) func = -1; else func = Rd_Atom_Check(pi_name_word); } if (must_be_ground) { *arity = Rd_Positive_Check(pi_arity_word); if (*arity > MAX_ARITY) Pl_Err_Representation(representation_max_arity); } else { DEREF(pi_arity_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) *arity = -1; else { *arity = Rd_Positive_Check(pi_arity_word); if (*arity > MAX_ARITY) Pl_Err_Representation(representation_max_arity); } } return func; } /*-------------------------------------------------------------------------* * GET_PRED_INDIC_3 * * * *-------------------------------------------------------------------------*/ Bool Get_Pred_Indic_3(WamWord pred_indic_word, WamWord func_word, WamWord arity_word) { int func, arity; func = Get_Pred_Indicator(pred_indic_word, TRUE, &arity); return Get_Atom(func, func_word) && Get_Integer(arity, arity_word); } ./gprolog-1.3.0/src/BipsPl/write.wam0000644004425400513100000002156610547440331015624 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : write.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/write.pl'). predicate('$use_write'/0,29,static,private,built_in,[ proceed]). predicate(write/1,37,static,private,built_in,[ put_atom(write,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Write_1',[],[x(0)]), proceed]). predicate(write/2,41,static,private,built_in,[ put_atom(write,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Write_2',[],[x(0),x(1)]), proceed]). predicate(writeq/1,48,static,private,built_in,[ put_atom(writeq,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Writeq_1',[],[x(0)]), proceed]). predicate(writeq/2,52,static,private,built_in,[ put_atom(writeq,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Writeq_2',[],[x(0),x(1)]), proceed]). predicate(write_canonical/1,59,static,private,built_in,[ put_atom(write_canonical,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Write_Canonical_1',[],[x(0)]), proceed]). predicate(write_canonical/2,63,static,private,built_in,[ put_atom(write_canonical,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Write_Canonical_2',[],[x(0),x(1)]), proceed]). predicate(display/1,70,static,private,built_in,[ put_atom(display,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Display_1',[],[x(0)]), proceed]). predicate(display/2,74,static,private,built_in,[ put_atom(display,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Display_2',[],[x(0),x(1)]), proceed]). predicate(write_term/2,98,static,private,built_in,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_atom(write_term,0), put_integer(2,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_write_defaults'/0), put_value(y(1),0), call('$get_write_options'/1), put_value(y(0),0), deallocate, call_c('Write_Term_1',[],[x(0)]), proceed]). predicate(write_term/3,105,static,private,built_in,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(write_term,0), put_integer(3,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call('$set_write_defaults'/0), put_value(y(2),0), call('$get_write_options'/1), put_value(y(0),0), put_value(y(1),1), deallocate, call_c('Write_Term_2',[],[x(0),x(1)]), proceed]). predicate('$set_write_defaults'/0,114,static,private,built_in,[ allocate(0), put_integer(0,0), put_integer(12,1), call('$sys_var_write'/2), put_integer(1,0), put_integer(-1,1), call('$sys_var_write'/2), put_integer(2,0), put_integer(1200,1), deallocate, execute('$sys_var_write'/2)]). predicate('$get_write_options'/1,122,static,private,built_in,[ allocate(1), get_variable(y(0),0), put_value(y(0),0), call('$check_list'/1), put_value(y(0),0), deallocate, execute('$get_write_options1'/1)]). predicate('$get_write_options1'/1,127,static,private,built_in,[ load_cut_level(1), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_variable(y(1),1), call('$get_write_options2'/1), cut(y(1)), put_value(y(0),0), deallocate, execute('$get_write_options1'/1)]). predicate('$get_write_options2'/1,134,static,private,built_in,[ try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), execute('$pl_err_instantiation'/0), label(1), retry_me_else(19), switch_on_term(3,fail,fail,fail,2), label(2), switch_on_structure([(quoted/1,4),(ignore_ops/1,6),(numbervars/1,8),(namevars/1,10),(space_args/1,12),(portrayed/1,14),(max_depth/1,16),(priority/1,18)]), label(3), try_me_else(5), label(4), get_structure(quoted/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_write_options2/1_$aux1'/1), label(5), retry_me_else(7), label(6), get_structure(ignore_ops/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_write_options2/1_$aux2'/1), label(7), retry_me_else(9), label(8), get_structure(numbervars/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_write_options2/1_$aux3'/1), label(9), retry_me_else(11), label(10), get_structure(namevars/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_write_options2/1_$aux4'/1), label(11), retry_me_else(13), label(12), get_structure(space_args/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_write_options2/1_$aux5'/1), label(13), retry_me_else(15), label(14), get_structure(portrayed/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), execute('$$get_write_options2/1_$aux6'/1), label(15), retry_me_else(17), label(16), get_structure(max_depth/1,0), unify_variable(x(1)), call_c('Blt_Integer',[fast_call,boolean],[x(1)]), put_integer(1,0), execute('$sys_var_write'/2), label(17), trust_me_else_fail, label(18), get_structure(priority/1,0), unify_variable(x(1)), call_c('Blt_Integer',[fast_call,boolean],[x(1)]), put_integer(2,0), execute('$sys_var_write'/2), label(19), trust_me_else_fail, put_value(x(0),1), put_atom(write_option,0), execute('$pl_err_domain'/2)]). predicate('$$get_write_options2/1_$aux6'/1,178,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(false,3),(true,5)]), label(2), try_me_else(4), label(3), get_atom(false,0), put_integer(0,0), put_integer(5,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(true,0), put_integer(0,0), put_integer(5,1), execute('$sys_var_set_bit'/2)]). predicate('$$get_write_options2/1_$aux5'/1,170,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(false,3),(true,5)]), label(2), try_me_else(4), label(3), get_atom(false,0), put_integer(0,0), put_integer(4,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(true,0), put_integer(0,0), put_integer(4,1), execute('$sys_var_set_bit'/2)]). predicate('$$get_write_options2/1_$aux4'/1,162,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(false,3),(true,5)]), label(2), try_me_else(4), label(3), get_atom(false,0), put_integer(0,0), put_integer(3,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(true,0), put_integer(0,0), put_integer(3,1), execute('$sys_var_set_bit'/2)]). predicate('$$get_write_options2/1_$aux3'/1,154,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(false,3),(true,5)]), label(2), try_me_else(4), label(3), get_atom(false,0), put_integer(0,0), put_integer(2,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(true,0), put_integer(0,0), put_integer(2,1), execute('$sys_var_set_bit'/2)]). predicate('$$get_write_options2/1_$aux2'/1,146,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(false,3),(true,5)]), label(2), try_me_else(4), label(3), get_atom(false,0), put_integer(0,0), put_integer(1,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(true,0), put_integer(0,0), put_integer(1,1), execute('$sys_var_set_bit'/2)]). predicate('$$get_write_options2/1_$aux1'/1,138,static,private,built_in,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(false,3),(true,5)]), label(2), try_me_else(4), label(3), get_atom(false,0), put_integer(0,0), put_integer(0,1), execute('$sys_var_reset_bit'/2), label(4), trust_me_else_fail, label(5), get_atom(true,0), put_integer(0,0), put_integer(0,1), execute('$sys_var_set_bit'/2)]). predicate(nl/0,200,static,private,built_in,[ put_atom(nl,0), put_integer(0,1), call_c('Set_Bip_Name_2',[],[x(0),x(1)]), call_c('Nl_0',[],[]), proceed]). predicate(nl/1,204,static,private,built_in,[ put_atom(nl,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Nl_1',[],[x(0)]), proceed]). ./gprolog-1.3.0/src/BipsPl/flag.wam0000644004425400513100000000706210547440331015376 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : flag.pl % date : 1 5 2007 % time : 13:13:13 file_name('/home/diaz/GP/src/src/BipsPl/flag.pl'). predicate('$use_flag'/0,29,static,private,built_in,[ proceed]). predicate(set_prolog_flag/2,32,static,private,built_in,[ put_atom(set_prolog_flag,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Set_Prolog_Flag_2',[boolean],[x(0),x(1)]), proceed]). predicate(current_prolog_flag/2,39,static,private,built_in,[ put_atom(current_prolog_flag,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Current_Prolog_Flag_2',[boolean],[x(0),x(1)]), proceed]). predicate('$current_prolog_flag_alt'/0,46,static,private,built_in,[ call_c('Current_Prolog_Flag_Alt_0',[boolean],[]), proceed]). predicate('$sys_var_write'/2,52,static,private,built_in,[ call_c('Sys_Var_Write_2',[],[x(0),x(1)]), proceed]). predicate('$sys_var_read'/2,55,static,private,built_in,[ call_c('Sys_Var_Read_2',[boolean],[x(0),x(1)]), proceed]). predicate('$sys_var_inc'/1,62,static,private,built_in,[ call_c('Sys_Var_Inc_1',[],[x(0)]), proceed]). predicate('$sys_var_dec'/1,65,static,private,built_in,[ call_c('Sys_Var_Dec_1',[],[x(0)]), proceed]). predicate('$sys_var_set_bit'/2,71,static,private,built_in,[ call_c('Sys_Var_Set_Bit_2',[],[x(0),x(1)]), proceed]). predicate('$sys_var_reset_bit'/2,74,static,private,built_in,[ call_c('Sys_Var_Reset_Bit_2',[],[x(0),x(1)]), proceed]). predicate('$sys_var_get_bit'/3,77,static,private,built_in,[ call_c('Sys_Var_Get_Bit_3',[boolean],[x(0),x(1),x(2)]), proceed]). predicate('$sys_var_put'/2,83,static,private,built_in,[ call_c('Sys_Var_Put_2',[],[x(0),x(1)]), proceed]). predicate('$sys_var_get'/2,86,static,private,built_in,[ call_c('Sys_Var_Get_2',[boolean],[x(0),x(1)]), proceed]). predicate('$get_current_B'/1,92,static,private,built_in,[ call_c('Get_Current_B_1',[],[x(0)]), proceed]). predicate('$set_current_B'/1,95,static,private,built_in,[ call_c('Set_Current_B_1',[],[x(0)]), proceed]). predicate(write_pl_state_file/1,101,static,private,built_in,[ put_atom(write_pl_state_file,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Write_Pl_State_File',[boolean],[x(0)]), proceed]). predicate(read_pl_state_file/1,108,static,private,built_in,[ put_atom(read_pl_state_file,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Read_Pl_State_File',[boolean],[x(0)]), proceed]). predicate(argument_counter/1,115,static,private,built_in,[ put_atom(argument_counter,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Argument_Counter_1',[boolean],[x(0)]), proceed]). predicate(argument_value/2,122,static,private,built_in,[ put_atom(argument_value,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Argument_Value_2',[boolean],[x(0),x(1)]), proceed]). predicate(argument_list/1,129,static,private,built_in,[ put_atom(argument_list,1), put_integer(1,2), call_c('Set_Bip_Name_2',[],[x(1),x(2)]), call_c('Argument_List_1',[boolean],[x(0)]), proceed]). predicate(environ/2,134,static,private,built_in,[ put_atom(environ,2), put_integer(2,3), call_c('Set_Bip_Name_2',[],[x(2),x(3)]), call_c('Environ_2',[boolean],[x(0),x(1)]), proceed]). predicate('$environ_alt'/0,139,static,private,built_in,[ call_c('Environ_Alt_0',[boolean],[]), proceed]). ./gprolog-1.3.0/src/BipsPl/callinf_supp.h0000644004425400513100000000455310547154134016614 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : callinf_supp.h * * Descr.: meta call info support - header file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: callinf_supp.h,v 1.10 2007/01/04 10:35:08 diaz Exp $ */ /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ void Call_Info_Bip_Name_1(WamWord call_info_word); #define Call_Info(f, a, dc) ((Functor_Arity(f, a) << 1) | dc) ./gprolog-1.3.0/src/BipsPl/pretty.pl0000644004425400513100000001054710547162353015652 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog buit-in predicates * * File : pretty.pl * * Descr.: pretty print clause management * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: pretty.pl,v 1.13 2007/01/04 10:35:11 diaz Exp $ */ :- built_in. '$use_pretty'. portray_clause(Term) :- '$portray_clause'(Term, 1), '$call_c'('Portray_Clause_1'(Term)), fail. portray_clause(_). portray_clause(SorA, Term) :- '$portray_clause'(Term, 2), '$call_c'('Portray_Clause_2'(SorA, Term)), fail. portray_clause(_, _). '$portray_clause'(Term, Arity) :- set_bip_name(portray_clause, Arity), ( var(Term) -> '$pl_err_instantiation' ; true ), ( callable(Term) -> true ; '$pl_err_type'(callable, Term) ), name_singleton_vars(Term), bind_variables(Term, [exclude([Term])]), set_bip_name(portray_clause, Arity). name_singleton_vars(Term) :- set_bip_name(name_singleton_vars, 1), '$call_c'('Name_Singleton_Vars_1'(Term)). name_query_vars(QueryVars, RestVars) :- set_bip_name(name_query_vars, 2), '$call_c_test'('Name_Query_Vars_2'(QueryVars, RestVars)). % sys_var[0]:0 if numbervars bindings, 1 if namevars bindings bind_variables(Term, Options) :- set_bip_name(bind_variables, 2), '$set_bind_variables_defaults', '$get_bind_variables_options'(Options, Exclude, From, Next), '$bind_variables'(Term, Exclude, From, Next). '$bind_variables'(Term, Exclude, From, Next) :- '$call_c_test'('Bind_Variables_4'(Term, Exclude, From, Next)). '$set_bind_variables_defaults' :- '$sys_var_write'(0, 0). '$get_bind_variables_options'(Options, Exclude, From, Next) :- '$check_list'(Options), g_assign('$bind_exclude', []), g_assign('$bind_from', 0), g_assign('$bind_next', _), '$get_bind_variables_options1'(Options), g_read('$bind_exclude', Exclude), g_read('$bind_from', From), g_read('$bind_next', Next). '$get_bind_variables_options1'([]). '$get_bind_variables_options1'([X|Options]) :- '$get_bind_variables_options2'(X), !, '$get_bind_variables_options1'(Options). '$get_bind_variables_options2'(X) :- var(X), '$pl_err_instantiation'. '$get_bind_variables_options2'(exclude(Exclude)) :- g_link('$bind_exclude', Exclude). '$get_bind_variables_options2'(from(From)) :- g_link('$bind_from', From). '$get_bind_variables_options2'(next(Next)) :- g_link('$bind_next', Next). '$get_bind_variables_options2'(numbervars) :- '$sys_var_write'(0, 0). '$get_bind_variables_options2'(namevars) :- '$sys_var_write'(0, 1). '$get_bind_variables_options2'(X) :- '$pl_err_domain'(var_binding_option, X). numbervars(Term) :- set_bip_name(numbervars, 1), '$set_bind_variables_defaults', '$bind_variables'(Term, [], 0, _). numbervars(Term, From, Next) :- set_bip_name(numbervars, 3), '$set_bind_variables_defaults', '$bind_variables'(Term, [], From, Next). ./gprolog-1.3.0/src/configure.in0000644004425400513100000004715010547152500015077 0ustar diazloco# ********************************* # * autoconf configuration script * # ********************************* # if you change here the version also change it in PROLOG_VERSION below AC_INIT(gprolog, 1.3.0, bug-prolog@gnu.org) AC_PREREQ(2.52) # AC_CONFIG_AUX_DIR(ConfUtils) to do... AC_CONFIG_SRCDIR(SETVARS) # *************************** # * initial variable values * # *************************** PROLOG_NAME='GNU Prolog' PROLOG_NAME1='gprolog' PROLOG_VERSION='1.3.0' PROLOG_DATE='Jan 4 2007' PROLOG_COPYRIGHT='Copyright (C) 1999-2007 Daniel Diaz' TOP_LEVEL=$PROLOG_NAME1 GPLC=gplc HEXGPLC=hexgplc ENV_VARIABLE=PL_PATH USE_EBP=no USE_LINEDIT=yes USE_GUI_CONSOLE=yes USE_SOCKETS=yes USE_FD_SOLVER=yes DLL_W32GUICONS=w32guicons LIB_LINEDIT=liblinedit LIB_ENGINE_PL=libengine_pl LIB_BIPS_PL=libbips_pl LIB_ENGINE_FD=libengine_fd LIB_BIPS_FD=libbips_fd # ****************** # * variable names * # ****************** AC_SUBST(PROLOG_NAME1) AC_SUBST(PROLOG_NAME) AC_SUBST(PROLOG_VERSION) AC_SUBST(PROLOG_DATE) AC_SUBST(PROLOG_COPYRIGHT) AC_SUBST(TOP_LEVEL) AC_SUBST(GPLC) AC_SUBST(HEXGPLC) AC_SUBST(ENV_VARIABLE) AC_SUBST(TOP_LEVEL_FLAGS) AC_SUBST(CFLAGS_PREFIX_REG) AC_SUBST(CFLAGS_MACHINE) AC_SUBST(CFLAGS_UNSIGNED_CHAR) AC_SUBST(LDLIBS) AC_SUBST(LDGUILIBS) AC_SUBST(ASM_SUFFIX) AC_SUBST(OBJ_SUFFIX) AC_SUBST(EXE_SUFFIX) AC_SUBST(CC_OBJ_NAME_OPT) AC_SUBST(CC_EXE_NAME_OPT) AC_SUBST(AR_RC) AC_SUBST(AR_SEP) AC_SUBST(AS) AC_SUBST(STRIP) AC_SUBST(RC) AC_SUBST(RCFLAGS) AC_SUBST(RC_OUT_NAME_OPT) AC_SUBST(LD) AC_SUBST(LD_OUT_NAME_OPT) AC_SUBST(LD_DLL_NAME_OPT) AC_SUBST(ROOT_DIR) AC_SUBST(ROOT_DIR1) AC_SUBST(PKG_NAME) AC_SUBST(INSTALL_DIR) AC_SUBST(LINKS_DIR) AC_SUBST(DOC_DIR) AC_SUBST(HTML_DIR) AC_SUBST(EXAMPLES_DIR) AC_SUBST(WIN_TMP_DIR) AC_SUBST(WIN_CONF_OPT) AC_SUBST(TXT_FILES) AC_SUBST(BIN_FILES) AC_SUBST(OBJ_FILES) AC_SUBST(LIB_FILES) AC_SUBST(INC_FILES) AC_SUBST(DOC_FILES) AC_SUBST(HTML_FILES) AC_SUBST(EXPL_FILES) AC_SUBST(EXC_FILES) AC_SUBST(EXFD_FILES) AC_SUBST(MAKE_LE_DIRS) AC_SUBST(MAKE_W32GC_DIRS) AC_SUBST(MAKE_FD_DIRS) AC_SUBST(MAKE_LE_INTERF_OBJS) AC_SUBST(MAKE_SOCKETS_OBJS) AC_SUBST(DLL_W32GUICONS) AC_SUBST(LIB_LINEDIT) AC_SUBST(LIB_ENGINE_PL) AC_SUBST(LIB_BIPS_PL) AC_SUBST(LIB_ENGINE_FD) AC_SUBST(LIB_BIPS_FD) # ******************* # * package options * # ******************* AC_ARG_WITH(install-dir, [ --with-install-dir=DIR specify INSTALL_DIR], [WITH_INSTALL_DIR="$withval"]) AC_ARG_WITH(links-dir, [ --with-links-dir=DIR specify LINKS_DIR], [WITH_LINKS_DIR="$withval"]) AC_ARG_WITH(doc-dir, [ --with-doc-dir=DIR specify DOC_DIR], [WITH_DOC_DIR="$withval"]) AC_ARG_WITH(html-dir, [ --with-html-dir=DIR specify HTML_DIR], [WITH_HTML_DIR="$withval"]) AC_ARG_WITH(examples-dir,[ --with-examples-dir=DIR specify EXAMPLES_DIR], [WITH_EXAMPLES_DIR="$withval"]) AC_ARG_WITH(msvc, [ --with-msvc use MS VC++], [WITH_MSVC="$withval"], [WITH_MSVC=no]) AC_ARG_WITH(c-flags, [[ --with-c-flags[=FLAGS] specify C flags]], [WITH_C_FLAGS="$withval"], [WITH_C_FLAGS=yes]) AC_ARG_ENABLE(regs, [ --disable-regs do not use machine registers], [case "$enableval" in no) AC_DEFINE(NO_USE_REGS);; *) ;; esac]) AC_ARG_ENABLE(ebp, [ --enable-ebp use the ebp register on ix86 machines], [case "$enableval" in yes) USE_EBP=yes;; *) ;; esac]) AC_ARG_ENABLE(fast-call, [ --disable-fast-call do not use fast call on ix86], [case "$enableval" in no) AC_DEFINE(NO_USE_FAST_CALL);; *) ;; esac]) AC_ARG_ENABLE(linedit, [ --disable-linedit do not include line editor facility], [case "$enableval" in no) AC_DEFINE(NO_USE_LINEDIT) USE_LINEDIT=no;; *) ;; esac]) AC_ARG_ENABLE(piped-consult, [ --disable-piped-consult do not pipe stdin of pl2wam when consult/1], [case "$enableval" in no) AC_DEFINE(NO_USE_PIPED_STDIN_FOR_CONSULT);; *) ;; esac]) AC_ARG_ENABLE(gui-console,[ --disable-gui-console do not use the Win32 GUI console], [case "$enableval" in no) AC_DEFINE(NO_USE_GUI_CONSOLE) USE_GUI_CONSOLE=no;; *) USE_GUI_CONSOLE=yes;; esac]) AC_ARG_ENABLE(sockets, [ --disable-sockets do not include sockets facility], [case "$enableval" in no) AC_DEFINE(NO_USE_SOCKETS) USE_SOCKETS=no;; *) ;; esac]) AC_ARG_ENABLE(fd-solver, [ --disable-fd-solver do not include the FD constraint solver], [case "$enableval" in no) AC_DEFINE(NO_USE_FD_SOLVER) USE_FD_SOLVER=no;; *) ;; esac]) if test "$USE_EBP" = no; then AC_DEFINE(NO_USE_EBP) fi # *********************** # * checks for programs * # *********************** if test "$WITH_MSVC" != no; then echo "using MSVC++ as C compiler" CC=cl WIN_CONF_OPT=--with-msvc fi # should be always done to correctly set EXEEXT (CC is set to cl for MSVC) # cannot be put in the then and the else part !!! so repeat the test ! AC_PROG_CC if test "$WITH_MSVC" != no; then ASM_SUFFIX='.s' OBJ_SUFFIX='.obj' LIB_SUFFIX='.lib' CC_OBJ_NAME_OPT='-Fo' CC_EXE_NAME_OPT='-Fe' AC_CHECK_PROGS(MINGWAS, mingw-as,no) if test "$MINGWAS" = no; then AC_MSG_ERROR([mingw-as.exe (MinGW as.exe) is required with MSVC++ - A version can be found at gprolog.univ-paris1.fr/download/mingw-as.exe]) fi AS=mingw-as AR_RC='lib -nologo -out:' AR_SEP='' STRIP=: RANLIB=: RC=rc RCFLAGS='' RC_OUT_NAME_OPT='-fo' LD=link LD_OUT_NAME_OPT='-out:' LD_DLL_NAME_OPT='-dll' else if test "$GCC" != yes; then AC_MSG_ERROR([gcc is required (or MSVC++ under win32)]) fi AS=as AC_PROG_RANLIB ASM_SUFFIX='.s' OBJ_SUFFIX='.o' LIB_SUFFIX='.a' CC_OBJ_NAME_OPT='-o ' CC_EXE_NAME_OPT='-o ' RC='windres' RCFLAGS='-O coff' RC_OUT_NAME_OPT='-o ' LD=gcc LD_OUT_NAME_OPT='-o ' LD_DLL_NAME_OPT='-shared' AR_RC='ar rc ' AR_SEP=' ' STRIP=strip fi EXE_SUFFIX=$EXEEXT AC_PROG_MAKE_SET AC_PROG_INSTALL AC_PROG_LN_S DLL_W32GUICONS=$DLL_W32GUICONS.dll LIB_LINEDIT=$LIB_LINEDIT$LIB_SUFFIX LIB_ENGINE_PL=$LIB_ENGINE_PL$LIB_SUFFIX LIB_BIPS_PL=$LIB_BIPS_PL$LIB_SUFFIX LIB_ENGINE_FD=$LIB_ENGINE_FD$LIB_SUFFIX LIB_BIPS_FD=$LIB_BIPS_FD$LIB_SUFFIX # ******************************* # * host detection and features * # ******************************* AC_CANONICAL_HOST # determine windows path associated to posix path /tmp case "$host_os" in cygwin*) WIN_TMP_DIR=`cygpath -d -a /tmp`;; mingw*) WIN_TMP_DIR=`cd /tmp;pwd -W|sed -e 's:/:\\\:g'`;; esac if test "$WITH_MSVC" != no; then AC_DEFINE(M_ix86) AC_DEFINE(M_win32) AC_DEFINE(M_ix86_win32) host_vendor=Microsoft host_os=win32 WIN32=yes else WIN32=no case "$host_cpu" in mips*) AC_DEFINE(M_mips);; alpha*) AC_DEFINE(M_alpha);; sparc*) AC_DEFINE(M_sparc);; x86_64) AC_DEFINE(M_x86_64);; i*86) AC_DEFINE(M_ix86);; powerpc*|ppc*) AC_DEFINE(M_powerpc);; esac case "$host_os" in *osf*) AC_DEFINE(M_osf);; irix*) AC_DEFINE(M_irix);; sunos*) AC_DEFINE(M_sunos);; solaris*) AC_DEFINE(M_solaris);; linux*) AC_DEFINE(M_linux);; cygwin*) AC_DEFINE(M_cygwin);; mingw*) AC_DEFINE(M_mingw) MINGW=yes; WIN32=yes;; *sco*) AC_DEFINE(M_sco);; *bsd*) AC_DEFINE(M_bsd);; *darwin*) AC_DEFINE(M_bsd);; esac case "$host" in mips*irix*) AC_DEFINE(M_mips_irix);; sparc*sunos*) AC_DEFINE(M_sparc_sunos);; sparc*solaris*) AC_DEFINE(M_sparc_solaris);; sparc*bsd*) AC_DEFINE(M_sparc_bsd);; alpha*osf*) AC_DEFINE(M_alpha_osf);; alpha*linux*) AC_DEFINE(M_alpha_linux);; x86_64*linux*) AC_DEFINE(M_x86_64_linux);; i*86*linux*) AC_DEFINE(M_ix86_linux);; i*86*solaris*) AC_DEFINE(M_ix86_solaris);; i*86*sco*) AC_DEFINE(M_ix86_sco);; i*86*bsd*) AC_DEFINE(M_ix86_bsd);; i*86*cygwin*) AC_DEFINE(M_ix86_cygwin);; i*86*mingw*) AC_DEFINE(M_ix86_mingw);; i*86*darwin*) AC_DEFINE(M_ix86_darwin);; powerpc*linux*) AC_DEFINE(M_powerpc_linux);; powerpc*darwin*) AC_DEFINE(M_powerpc_darwin);; powerpc*bsd*) AC_DEFINE(M_powerpc_bsd);; *) AC_MSG_ERROR(unsupported architecture) esac fi AC_CHECK_SIZEOF(long) AC_CHECK_HEADERS(sys/ioctl_compat.h termios.h malloc.h) AC_FUNC_MMAP AC_CHECK_FUNCS(mprotect mallopt fgetc) dnl ------------------- dnl Check for socklen_t dnl ------------------- dnl AC_MSG_CHECKING(for socklen_t) AC_TRY_COMPILE([#include #include socklen_t x; ], [], [AC_MSG_RESULT(yes)], [ AC_TRY_COMPILE([#include #include int accept(int, struct sockaddr *, size_t *); ], [], [ AC_MSG_RESULT(size_t) AC_DEFINE(socklen_t, size_t)], [ AC_MSG_RESULT(int) AC_DEFINE(socklen_t, int)])]) # ******************** # * C compiler flags * # ******************** CFLAGS_MACHINE= CFLAGS_PREFIX_REG= AC_C_INLINE if test "$WITH_MSVC" != no; then case "$WITH_C_FLAGS" in debug) CFLAGS='-W3 -ZI -EHsc';; no) CFLAGS='';; yes) CFLAGS='-O2 -EHsc';; *) CFLAGS="$WITH_C_FLAGS";; esac CFLAGS_UNSIGNED_CHAR='-J' CFLAGS_MACHINE='-nologo -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE' else case "$WITH_C_FLAGS" in debug) CFLAGS='-g -Wall';; no) CFLAGS='';; yes) CFLAGS='-O3 -fomit-frame-pointer';; *) CFLAGS="$WITH_C_FLAGS";; esac # -fomit-frame-pointer does not work on MinGW (tested with gcc 3.3.3) if test "$MINGW-$WITH_C_FLAGS" = yes-yes; then CFLAGS='-O3' fi CFLAGS_PREFIX_REG='-ffixed-%s' CFLAGS_UNSIGNED_CHAR='-funsigned-char' CFLAGS_MACHINE= case "$host" in mips*irix*) CFLAGS_MACHINE='-march=4000';; *sparc*sunos4.1.3) CFLAGS_MACHINE='-msupersparc';; *sparc*solaris) CFLAGS_MACHINE='-msupersparc';; i686*) CFLAGS_MACHINE='-march=pentiumpro';; i586*) CFLAGS_MACHINE='-march=pentium';; i*86*) CFLAGS_MACHINE='-march=i486';; powerpc*darwin*) CFLAGS_MACHINE='-mpowerpc -no-cpp-precomp';; esac case "$host" in i*86*) if test "$USE_EBP" != no; then CF1=`echo $CFLAGS | sed -e 's/\(.*\)-fomit-frame-pointer\(.*\)/\1\2/'` if test "$CF1" != "$CFLAGS"; then echo use ebp and move -fomit-frame-pointer to CFLAGS_MACHINE CFLAGS=$CF1 CFLAGS_MACHINE="$CFLAGS_MACHINE -fomit-frame-pointer" else echo do not use ebp since -fomit-frame-pointer is not specified in CFLAGS USE_EBP=no AC_DEFINE(NO_USE_EBP) fi fi;; esac # case "$host" in # i*86*) CFLAGS_MACHINE="$CFLAGS_MACHINE -malign-loops=2 -malign-jumps=2 -malign-functions=2";; # esac # For MacOsX - try to avoid this (activate only for fast library fix) # case "$host" in # powerpc*darwin*) RANLIB="$RANLIB -c";; # esac fi # ******************** # * libraries to add * # ******************** if test "$WITH_MSVC" != no; then LDFLAGS='-nologo -F8000000' fi make_lib_list() { list='' if test $CC = cl -o $CC = lc; then for i; do list="$list $i.lib"; done else for i; do list="$list -l$i"; done fi echo $list } if test $WIN32 = yes; then LIB='advapi32 user32' GUILIB='kernel32 user32 gdi32 comdlg32 advapi32 comctl32 shell32 ole32 htmlhelp' # other libs: winspool.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib if test "$USE_SOCKETS" = yes; then LIB="$LIB ws2_32" fi else LIB='m' GUILIB='' if test "$USE_SOCKETS" = yes; then AC_CHECK_FUNC(socket,[], AC_CHECK_LIB(socket,socket,LIB="$LIB socket", AC_MSG_ERROR(cannot find socket library))) AC_CHECK_FUNC(gethostbyname,[], AC_CHECK_LIB(nsl,gethostbyname,LIB="$LIB nsl")) # (No error here; just assume gethostbyname is in -lsocket.) fi fi LDLIBS=`make_lib_list $LIB` LDGUILIBS=`make_lib_list $GUILIB` # *********************** # * gp_config.h defines * # *********************** AC_DEFINE_UNQUOTED(PROLOG_NAME, "$PROLOG_NAME") AC_DEFINE_UNQUOTED(PROLOG_NAME1, "$PROLOG_NAME1") AC_DEFINE_UNQUOTED(PROLOG_VERSION, "$PROLOG_VERSION") AC_DEFINE_UNQUOTED(PROLOG_DATE, "$PROLOG_DATE") AC_DEFINE_UNQUOTED(PROLOG_COPYRIGHT, "$PROLOG_COPYRIGHT") AC_DEFINE_UNQUOTED(TOP_LEVEL, "$TOP_LEVEL") AC_DEFINE_UNQUOTED(GPLC, "$GPLC") AC_DEFINE_UNQUOTED(HEXGPLC, "$HEXGPLC") AC_DEFINE_UNQUOTED(ENV_VARIABLE, "$ENV_VARIABLE") AC_DEFINE_UNQUOTED(M_CPU, "$host_cpu") AC_DEFINE_UNQUOTED(M_VENDOR, "$host_vendor") AC_DEFINE_UNQUOTED(M_OS, "$host_os") AC_DEFINE_UNQUOTED(CC, "$CC") AC_DEFINE_UNQUOTED(CFLAGS_PREFIX_REG,"$CFLAGS_PREFIX_REG") AC_DEFINE_UNQUOTED(CFLAGS, "$CFLAGS") AC_DEFINE_UNQUOTED(CFLAGS_MACHINE, "$CFLAGS_MACHINE") AC_DEFINE_UNQUOTED(LDFLAGS, "$LDFLAGS") AC_DEFINE_UNQUOTED(LDLIBS, "$LDLIBS") AC_DEFINE_UNQUOTED(AS, "$AS") AC_DEFINE_UNQUOTED(STRIP, "$STRIP") AC_DEFINE_UNQUOTED(ASM_SUFFIX, "$ASM_SUFFIX") AC_DEFINE_UNQUOTED(OBJ_SUFFIX, "$OBJ_SUFFIX") AC_DEFINE_UNQUOTED(EXE_SUFFIX, "$EXE_SUFFIX") AC_DEFINE_UNQUOTED(CC_OBJ_NAME_OPT, "$CC_OBJ_NAME_OPT") AC_DEFINE_UNQUOTED(CC_EXE_NAME_OPT, "$CC_EXE_NAME_OPT") AC_DEFINE_UNQUOTED(DLL_W32GUICONS, "$DLL_W32GUICONS") AC_DEFINE_UNQUOTED(LIB_LINEDIT, "$LIB_LINEDIT") AC_DEFINE_UNQUOTED(LIB_ENGINE_PL, "$LIB_ENGINE_PL") AC_DEFINE_UNQUOTED(LIB_BIPS_PL, "$LIB_BIPS_PL") AC_DEFINE_UNQUOTED(LIB_ENGINE_FD, "$LIB_ENGINE_FD") AC_DEFINE_UNQUOTED(LIB_BIPS_FD, "$LIB_BIPS_FD") # *************** # * directories * # *************** # a function to compare 2 directories (avoid diff with trailing /) # does not take into account symlinks... same_directory() { f1=`dirname $1`/`basename $1` f2=`dirname $2`/`basename $2` test $f1 = $f2 } ROOT_DIR=`(cd .. ; pwd)` if test -x /bin/cygpath.exe; then ROOT_DIR1=`cygpath -a -w ..` else ROOT_DIR1=$ROOT_DIR fi test "$prefix" = NONE && prefix=/usr/local test "$exec_prefix" = NONE && exec_prefix=$prefix PKG_NAME=$PROLOG_NAME1-$PROLOG_VERSION # *-------------* # * INSTALL_DIR * # *-------------* if test "$prefix" = in-place -o "$WITH_INSTALL_DIR" = in-place; then IN_PLACE=yes INSTALL_DIR=$ROOT_DIR test -z "$WITH_LINKS_DIR" && WITH_LINKS_DIR=no else IN_PLACE=no if test -z "$WITH_INSTALL_DIR"; then INSTALL_DIR=$prefix/$PKG_NAME else INSTALL_DIR=$WITH_INSTALL_DIR fi fi # *-----------* # * LINKS_DIR * # *-----------* case "$WITH_LINKS_DIR" in no) LINKS_DIR=none;; '') LINKS_DIR=$exec_prefix/bin;; *) LINKS_DIR=$WITH_LINKS_DIR;; esac # *---------* # * DOC_DIR * # *---------* case "$WITH_DOC_DIR" in no) DOC_DIR=none; test -z "$WITH_HTML_DIR" && WITH_HTML_DIR=$INSTALL_DIR/doc/html_node;; '') DOC_DIR=$INSTALL_DIR/doc;; *) DOC_DIR=$WITH_DOC_DIR;; esac if same_directory "$DOC_DIR" $ROOT_DIR/doc; then DOC_DIR=none fi # *----------* # * HTML_DIR * # *----------* case "$WITH_HTML_DIR" in no) HTML_DIR=none;; '') if test "$DOC_DIR" = none; then WITH_HTML_DIR=no; HTML_DIR=none else HTML_DIR=$DOC_DIR/html_node fi;; *) HTML_DIR=$WITH_HTML_DIR;; esac if same_directory "$HTML_DIR" $ROOT_DIR/doc/html_node; then HTML_DIR=none fi # *--------------* # * EXAMPLES_DIR * # *--------------* case "$WITH_EXAMPLES_DIR" in no) EXAMPLES_DIR=none;; '') EXAMPLES_DIR=$INSTALL_DIR;; *) EXAMPLES_DIR=$WITH_EXAMPLES_DIR;; esac if same_directory "$EXAMPLES_DIR" $ROOT_DIR; then EXAMPLES_DIR=none fi # *---------* # * Summary * # *---------* echo 'DIRECTORIES' echo "--> Installation: $INSTALL_DIR" echo "--> Link to binaries: $LINKS_DIR" echo "--> Documentation: $DOC_DIR" echo "--> HTML documentation: $HTML_DIR" echo "--> Examples: $EXAMPLES_DIR" # ****************** # * sub-components * # ****************** if test "$IN_PLACE" = no; then TXT_FILES='COPYING VERSION NEWS ChangeLog' else TXT_FILES= fi BIN_FILES= OBJ_FILES= LIB_FILES= INC_FILES="$PROLOG_NAME1.h fd_to_c.h" DOC_FILES='???*.dvi ???*.ps ???*.pdf ???*.chm ???*.eps ???*.html ???*.gif' HTML_FILES='???*.html ???*.gif ???*.css' EXPL_FILES='Makefile README PROGS ??*.pl' EXC_FILES='Makefile README ??*.pl ??*_c.c' EXFD_FILES='Makefile ??*.pl ??*.fd' B="$GPLC $HEXGPLC $TOP_LEVEL pl2wam wam2ma ma2asm" O="top_level all_pl_bips debugger" L="$LIB_ENGINE_PL $LIB_BIPS_PL" if test "$USE_GUI_CONSOLE" = yes -a \( "$USE_LINEDIT" = no -o "$WIN32" = no \) then AC_DEFINE(NO_USE_GUI_CONSOLE) USE_GUI_CONSOLE=no fi if test "$USE_LINEDIT" = yes; then MAKE_LE_DIRS='$(LE_DIRS)' MAKE_LE_INTERF_OBJS='$(LE_INTERF_OBJS)' L="$L $LIB_LINEDIT" else MAKE_LE_DIRS= MAKE_LE_INTERF_OBJS='$(NO_LE_INTERF_OBJS)' fi if test "$USE_GUI_CONSOLE" = yes; then TOP_LEVEL_FLAGS=--gui-console MAKE_W32GC_DIRS='$(W32GC_DIRS)' O="$O w32gc_interf" BIN_FILES="$DLL_W32GUICONS" else TOP_LEVEL_FLAGS= MAKE_W32GC_DIRS= fi if test "$USE_SOCKETS" = yes; then MAKE_SOCKETS_OBJS='$(SOCKETS_OBJS)' else MAKE_SOCKETS_OBJS='$(NO_SOCKETS_OBJS)' fi if test "$USE_FD_SOLVER" = yes; then MAKE_FD_DIRS='$(FD_DIRS)' B="$B fd2c" L="$L $LIB_ENGINE_FD $LIB_BIPS_FD" O="$O all_fd_bips" else MAKE_FD_DIRS= fi for i in $B; do BIN_FILES="$BIN_FILES $i$EXE_SUFFIX" done for i in $O; do OBJ_FILES="$OBJ_FILES $i$OBJ_SUFFIX" done LIB_FILES=$L # *********************** # * Version & Copyright * # *********************** echo "$PKG_NAME" >VERSION echo "$PKG_NAME" >../VERSION echo "$PROLOG_VERSION" >/tmp/version_no.tex if diff /tmp/version_no.tex ../doc/version_no.tex >/dev/null 2>&1; then rm /tmp/version_no.tex else mv /tmp/version_no.tex ../doc/version_no.tex fi echo "$PROLOG_COPYRIGHT" >/tmp/copyright.tex if diff /tmp/copyright.tex ../doc/copyright.tex >/dev/null 2>&1; then rm /tmp/copyright.tex else mv /tmp/copyright.tex ../doc/copyright.tex fi # ******************** # * Files generation * # ******************** OTHER_MAKEFILES= for i in TestsPl/Makefile DevUtils/Makefile Ma2Asm/FromC/Makefile Win32/Makefile Win32/gp-setup.iss do if test -f $i.in; then OTHER_MAKEFILES="$OTHER_MAKEFILES $i" fi done AC_CONFIG_HEADER(EnginePl/gp_config.h) AC_CONFIG_FILES(Makefile TopComp/Makefile Pl2Wam/Makefile Wam2Ma/Makefile Ma2Asm/Makefile Fd2C/Makefile Linedit/Makefile W32GUICons/Makefile EnginePl/Makefile BipsPl/Makefile EngineFD/Makefile BipsFD/Makefile $OTHER_MAKEFILES) AC_OUTPUT ./gprolog-1.3.0/src/W32GUICons/0000777004425400513100000000000010547442376014343 5ustar diazloco./gprolog-1.3.0/src/W32GUICons/w32_console.rc0000755004425400513100000000716010023374757017025 0ustar diazloco//Microsoft Developer Studio generated resource script. // #include "w32_resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "w32_res_common.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Menu // IDR_MENU MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&Consult...", IDM_CONSULT MENUITEM "C&hange Dir...", IDM_CHDIR MENUITEM "&Insert File Name...", IDM_FILE_NAME MENUITEM SEPARATOR MENUITEM "E&xit", IDM_EXIT END POPUP "&Edit" BEGIN MENUITEM "&Copy\tCtrl+Alt+C", IDM_COPY MENUITEM "&Paste\tCtrl+Alt+V", IDM_PASTE END POPUP "&Terminal", CHECKED BEGIN MENUITEM "&Interrupt (send Ctrl+C)", IDM_INTERRUPT MENUITEM SEPARATOR MENUITEM "&Line Buffering", IDM_BUFFERING, CHECKED MENUITEM "&Flush Output", IDM_FLUSH MENUITEM SEPARATOR MENUITEM "&Show Text Console", IDM_SHOW_CONSOLE MENUITEM SEPARATOR MENUITEM "&Change Font...", IDM_FONT END POPUP "&Help" BEGIN MENUITEM "&Manual", IDM_MANUAL MENUITEM "&Index", IDM_INDEX MENUITEM SEPARATOR MENUITEM "&GNU Prolog web page", IDM_WEB MENUITEM SEPARATOR MENUITEM "&About", IDM_ABOUT END END ///////////////////////////////////////////////////////////////////////////// // // Accelerator // IDR_ACCEL ACCELERATORS DISCARDABLE BEGIN "C", IDM_INTERRUPT, VIRTKEY, CONTROL, NOINVERT "C", IDM_COPY, VIRTKEY, CONTROL, ALT, NOINVERT "V", IDM_PASTE, VIRTKEY, CONTROL, ALT, NOINVERT VK_PAUSE, IDM_INTERRUPT, VIRTKEY, CONTROL, NOINVERT END #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // French (France) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) #ifdef _WIN32 LANGUAGE LANG_FRENCH, SUBLANG_FRENCH #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "w32_resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""w32_res_common.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // French (France) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED ./gprolog-1.3.0/src/W32GUICons/w32_resource.h0000755004425400513100000000234510547152500017024 0ustar diazloco//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by w32_console.rc // #define IDR_MENU 102 #define IDR_ACCEL 106 #define IDM_COPY 40002 #define IDM_PASTE 40003 #define IDM_FONT 40004 #define IDM_ABOUT 40005 #define IDM_MANUAL 40006 #define IDM_EXIT 40007 #define IDM_INDEX 40009 #define IDM_FLUSH 40011 #define IDM_INTERRUPT 40012 #define IDM_BUFFERING 40013 #define IDM_SHOW_CONSOLE 40015 #define IDM_CONSULT 40016 #define IDM_CHDIR 40018 #define IDM_FILE_NAME 40019 #define IDM_WEB 40020 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 111 #define _APS_NEXT_COMMAND_VALUE 40021 #define _APS_NEXT_CONTROL_VALUE 1008 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif ./gprolog-1.3.0/src/W32GUICons/w32_res_common.h0000644004425400513100000000010610547152501017325 0ustar diazloco#ifdef _MSC_VER #include "afxres.h" #else #include #endif ./gprolog-1.3.0/src/W32GUICons/Makefile.in0000644004425400513100000000151210547152501016367 0ustar diazlocoDLL_W32GUICONS = @DLL_W32GUICONS@ CC = @CC@ @CFLAGS_MACHINE@ CFLAGS = @CFLAGS@ -I../EnginePl RC = @RC@ #RCFLAGS = @RCFLAGS@ -l 0x409 RCFLAGS = @RCFLAGS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LDGUILIBS = @LDGUILIBS@ DLLNAME = $(DLL_W32GUICONS) OBJDLL = w32_console@OBJ_SUFFIX@ RESDLL = w32_console.res .SUFFIXES: .SUFFIXES: @OBJ_SUFFIX@ .cpp .c .res .rc $(SUFFIXES) .cpp@OBJ_SUFFIX@: $(CC) -c $(CFLAGS) $*.cpp .c@OBJ_SUFFIX@: $(CC) -c $(CFLAGS) $*.c .rc.res: $(RC) $(RCFLAGS) @RC_OUT_NAME_OPT@$*.res $*.rc all: $(DLLNAME) w32gc_interf@OBJ_SUFFIX@ $(DLLNAME): $(OBJDLL) $(RESDLL) $(LD) @LD_DLL_NAME_OPT@ @LD_OUT_NAME_OPT@$(DLLNAME) $(OBJDLL) $(RESDLL) $(LDGUILIBS) clean: rm -f *@OBJ_SUFFIX@ *.res *.RES $(DLLNAME) *.lib *.exp *.EXP *.idb *.pdb distclean: clean ./gprolog-1.3.0/src/W32GUICons/w32gc_interf.c0000644004425400513100000001370710547154143016777 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Win32 GUI console * * File : w32gc_interf.c * * Descr.: line editor <--> GUICons interface * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: w32gc_interf.c,v 1.12 2007/01/04 10:35:15 diaz Exp $ */ #include #include #include "../EnginePl/gp_config.h" /* from linedit.h */ extern char *LE_Get_Separators(void); extern int LE_Get_Prompt_Length(void); /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static void Start_GUI(void); /* overwrite to customize linedit */ void (*le_hook_start) () = Start_GUI; void (*le_hook_emit_beep) (); void (*le_hook_put_char) (); int (*le_hook_get_char0) (); void (*le_hook_ins_mode) (); void (*le_hook_screen_size) (); int (*le_hook_kbd_is_not_empty) (); void (*le_hook_backd) (); void (*le_hook_forwd) (); void (*le_hook_displ) (); void (*le_hook_displ_str) (); void (*le_hook_erase) (); void (*le_hook_confirm) (); void (*le_hook_set_line_buffering) (); int (*le_hook_get_line_buffering) (); void (*le_hook_flush) (); int (*le_hook_confirm_box) (); void (*le_hook_message_box) (); void (*le_hook_exit_process) (); /*---------------------------------* * Function Prototypes * *---------------------------------*/ static FARPROC Find_Fct(HANDLE h, char *name); typedef __declspec(dllimport) int (*Fct) (); /*-------------------------------------------------------------------------* * START_GUI * * * *-------------------------------------------------------------------------*/ static void Start_GUI(void) { Fct W32GC_Start_Window; HANDLE h; #if 1 /* O to force console mode */ h = LoadLibrary(DLL_W32GUICONS); #else h = NULL; #endif if (h == NULL) { fprintf(stderr, "warning: cannot load DLL " DLL_W32GUICONS " - text console used\n"); le_hook_start = NULL; return; } le_hook_put_char = (void (*)()) Find_Fct(h, "_W32GC_Put_Char"); le_hook_get_char0 = (int (*)()) Find_Fct(h, "_W32GC_Get_Char0"); le_hook_kbd_is_not_empty = (int (*)()) Find_Fct(h, "_W32GC_Kbd_Is_Not_Empty"); le_hook_screen_size = (void (*)()) Find_Fct(h, "_W32GC_Screen_Size"); /* the following are not mandatory for linedit and could be commented out */ le_hook_emit_beep = (void (*)()) Find_Fct(h, "_W32GC_Emit_Beep"); le_hook_ins_mode = (void (*)()) Find_Fct(h, "_W32GC_Ins_Mode"); le_hook_backd = (void (*)()) Find_Fct(h, "_W32GC_Backd"); le_hook_forwd = (void (*)()) Find_Fct(h, "_W32GC_Forwd"); le_hook_displ = (void (*)()) Find_Fct(h, "_W32GC_Displ"); le_hook_displ_str = (void (*)()) Find_Fct(h, "_W32GC_Displ_Str"); le_hook_erase = (void (*)()) Find_Fct(h, "_W32GC_Erase"); /* the following are not used by linedit but by stream_supp.c */ le_hook_set_line_buffering = (void (*)()) Find_Fct(h, "_W32GC_Set_Line_Buffering"); le_hook_get_line_buffering = (int (*)()) Find_Fct(h, "_W32GC_Get_Line_Buffering"); le_hook_flush = (void (*)()) Find_Fct(h, "_W32GC_Flush"); le_hook_confirm_box = (int (*)()) Find_Fct(h, "_W32GC_Confirm_Box"); le_hook_message_box = (void (*)()) Find_Fct(h, "_W32GC_Message_Box"); le_hook_exit_process = (void (*)()) Find_Fct(h, "_W32GC_Exit_Process"); W32GC_Start_Window = (Fct) Find_Fct(h, "_W32GC_Start_Window"); (*W32GC_Start_Window) (LE_Get_Separators, LE_Get_Prompt_Length); } /*-------------------------------------------------------------------------* * FIND_FCT * * * *-------------------------------------------------------------------------*/ static FARPROC Find_Fct(HANDLE h, char *name) { FARPROC p; /* init here to avoid lcc (buggy) warning */ p = GetProcAddress(h, name + 1); if (p) return p; /* useless for MSVC++ but useful for lcc for instance */ p = GetProcAddress(h, name); if (p == NULL) { fprintf(stderr, "warning: cannot load fct %s in DLL " DLL_W32GUICONS "\n", name); exit(1); } return p; } ./gprolog-1.3.0/src/W32GUICons/w32_console.c0000644004425400513100000010625510547440737016650 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Win32 GUI console * * File : w32_console.c * * Descr.: W32 GUI Console * * Author: Jacob Navia and Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: w32_console.c,v 1.13 2007/01/05 12:17:35 diaz Exp $ */ #include #include #include #include #include #include #include #include #include #include #include #include "w32_resource.h" #include "../TopComp/prolog_path.c" #if 1 #define DLLEXPORT __declspec(dllexport) #endif #if 0 /* avoid to link with htmlhelp.lib - needs hhctrl.ocx at runtime */ #define LOAD_HTMLHELP_DYNAMICALLY #endif #if 0 #define DEBUG #endif /*---------------------------------* * Constants * *---------------------------------*/ #define EDIT_FIELD_SIZE 32000 /* 64 Kb for XP, 32 Kb for Win98 ? */ #define ABOUT_TEXT \ PROLOG_NAME " version " PROLOG_VERSION "\n" \ "By Daniel Diaz\n" \ PROLOG_COPYRIGHT "\n\n" \ "http://www.gprolog.org\n\n" \ PROLOG_NAME " comes with ABSOLUTELY NO WARRANTY.\n" \ "You may redistribute copies of " PROLOG_NAME " under the\n" \ "terms of the GNU General Public License." #define FIX_TAB 1 // replace \t by ESC+tab #define FIX_CR 2 // remove \r #define FIX_BACKSLASH 4 // replace \ by / #define FIX_QUOTE 8 // replace ' by '' /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ static char *(*fct_get_separators) (); static int (*fct_get_prompt_length) (); static unsigned int queue[10240]; static int queue_start, queue_end; static CRITICAL_SECTION cs; static HANDLE event_char_in_queue; static HWND hwndMain; // Main window handle static HWND hwndEditControl; static WNDPROC lpEProc; static HINSTANCE hInst; // Instance handle static LOGFONT CurrentFont; static HFONT hCourier; static int show_console = 0; // is the associated text console shown ? static HWND hwnd_console; static int in_get_char = 0; static int last_is_read = 0; // to know if a msg box to display at exit static int posit = 0; // position inside current (last) line static int line_buffering = 1; // default: line buffered static char wr_buffer[4096]; static char *wr_buffer_ptr = wr_buffer; static char buff_pathname[MAX_PATH]; /*---------------------------------* * Function Prototypes * *---------------------------------*/ static int CallMain(void *unused); static int StartWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow); static BOOL InitApplication(void); static HWND Createw32_consoleWndClassWnd(void); static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); static void MainWndProc_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify); static HFONT CreationCourier(int flag); static int CallChangeFont(HWND hwnd); static void SubClassEditField(HWND hwnd); static LRESULT CALLBACK SubClassEdit(HWND hwnd, UINT msg, WPARAM mp1, LPARAM mp2); static char *Get_Current_Word(void); static void Consult_File(void); static void Change_Directory(void); static void Insert_File_Name(void); static char *Get_Selected_File_Name(char *title, char *default_ext, char *filter); static char *Get_Selected_Directory(char *title, int new_folder); static void Show_Help(char *word); static int Get_CHM_Help_Path(char *path); static int WINAPI BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData); static void Add_Clipboard_To_Queue(void); static void Add_String_To_Queue(char *str, int mask_fix); static void Add_Char_To_Queue(int c); static void Set_Selection(int posit, int n); static void Set_Caret_Position(int posit); static int Move_Caret_To(int start_or_end); static void Move_Caret_From_Mouse(int if_no_selection); static int Delete_Selection(void); static void Display_Text(char *str, int n); static void Flush_Buffer(void); #ifdef DEBUG static int Console_Printf(char *format, ...); #endif DLLEXPORT void W32GC_Set_Line_Buffering(int is_buffered); DLLEXPORT void W32GC_Backd(int n); DLLEXPORT int W32GC_Confirm_Box(char *titre, char *msg); static BOOL Launched_From_Command_Line(); static HWND Find_Text_Console_Handle(void); static void Show_Text_Console(int show); /* from terminal.h */ #define KEY_CTRL(x) ((x) & 0x1f) #define KEY_ESC(x) ((2<<8) | ((x)|0x20)) /*<---------------------------------------------------------------------->*/ #ifdef __LCC__ #define DllMain LibMain #endif BOOL DLLEXPORT WINAPI DllMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // The DLL is being loaded for the first time by a given process. // Perform per-process initialization here. If the initialization // is successful, return TRUE; if unsuccessful, return FALSE. hInst = hDLLInst; break; case DLL_PROCESS_DETACH: // The DLL is being unloaded by a given process. Do any // per-process clean up here, such as undoing what was done in // DLL_PROCESS_ATTACH. The return value is ignored. break; case DLL_THREAD_ATTACH: // A thread is being created in a process that has already loaded // this DLL. Perform any per-thread initialization here. The // return value is ignored. break; case DLL_THREAD_DETACH: // A thread is exiting cleanly in a process that has already // loaded this DLL. Perform any per-thread clean up here. The // return value is ignored. break; } return TRUE; } /* get_separators can be NULL (default separators are used) * get_prompt_length can be NULL (prompt length supposed to be 0) * only relevant when the user clicks inside the last line inside the prompt * having the length we can consider it similarly to when he clicks above * (to set the cursor for a copy/paste). * not having the length we try to move the cursor (sending left arrows) * the application (e.g. linedit) then needs to detect an invalid left arrow * and ignore it (e.g. emit a beep). Anyway the user can copy/paste the prompt. * So NULL is really OK. */ DLLEXPORT int W32GC_Start_Window(char *(*get_separators) (), int (*get_prompt_length) ()) { DWORD tid; fct_get_separators = get_separators; fct_get_prompt_length = get_prompt_length; hwnd_console = Find_Text_Console_Handle(); show_console = Launched_From_Command_Line(); Show_Text_Console(show_console); InitializeCriticalSection(&cs); CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) CallMain, hwndMain, 0, &tid); Sleep(500); // tempo to wait windows manager ok in the thread return 1; } static int CallMain(void *unused) { StartWinMain(hInst, 0, "", SW_SHOW); return 0; } static int StartWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) { MSG msg; HANDLE hAccelTable; hInst = hInstance; event_char_in_queue = CreateEvent(NULL, FALSE, FALSE, NULL); if (!InitApplication()) return 0; hAccelTable = LoadAccelerators(hInst, MAKEINTRESOURCE(IDR_ACCEL)); if ((hwndMain = Createw32_consoleWndClassWnd()) == (HWND) 0) return 0; ShowWindow(hwndMain, SW_SHOW); while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(hwndMain, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } CloseHandle(event_char_in_queue); DeleteCriticalSection(&cs); return msg.wParam; } static BOOL InitApplication(void) { WNDCLASS wc; memset(&wc, 0, sizeof(WNDCLASS)); wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wc.lpfnWndProc = (WNDPROC) MainWndProc; wc.hInstance = hInst; wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszClassName = "w32_consoleWndClass"; wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); if (!RegisterClass(&wc)) return 0; return 1; } static HWND Createw32_consoleWndClassWnd(void) { return CreateWindow("w32_consoleWndClass", "GNU Prolog console", WS_MINIMIZEBOX | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_CAPTION | WS_BORDER | WS_SYSMENU | WS_THICKFRAME, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL); } static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { RECT rc; PAINTSTRUCT ps; static HWND hwndChild; switch (msg) { case WM_CREATE: GetClientRect(hwnd, &rc); hwndChild = CreateWindow("EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0, 0, (rc.right - rc.left), (rc.bottom - rc.top), hwnd, (HMENU) 1000, hInst, NULL); SetWindowLong(hwnd, DWL_USER, (DWORD) hwndChild); hCourier = CreationCourier(1); SendMessage(hwndChild, WM_SETFONT, (WPARAM) hCourier, 0L); SubClassEditField(hwndChild); hwndEditControl = hwndChild; SendMessage(hwndEditControl, EM_SETLIMITTEXT, EDIT_FIELD_SIZE, 0); SetFocus(hwndChild); break; case WM_SIZE: GetWindowRect(hwnd, &rc); MoveWindow(hwndChild, 0, 0, LOWORD(lParam), HIWORD(lParam), 1); break; case WM_SETFOCUS: SetFocus(hwndEditControl); break; case WM_COMMAND: HANDLE_WM_COMMAND(hwnd, wParam, lParam, MainWndProc_OnCommand); break; #if 0 case WM_CLOSE: if (!W32GC_Confirm_Box("GNU Prolog", "Really quit ?")) return 0; return DefWindowProc(hwnd, msg, wParam, lParam); #endif case WM_PAINT: BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); exit(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } static void MainWndProc_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { switch (id) { case IDM_CONSULT: Consult_File(); break; case IDM_CHDIR: Change_Directory(); break; case IDM_FILE_NAME: Insert_File_Name(); break; case IDM_EXIT: PostMessage(hwnd, WM_CLOSE, 0, 0); break; case IDM_COPY: SendMessage(hwndEditControl, WM_COPY, 0, 0); break; case IDM_PASTE: Add_Clipboard_To_Queue(); break; case IDM_INTERRUPT: if (in_get_char) Add_Char_To_Queue(KEY_CTRL('C')); else GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); break; case IDM_BUFFERING: line_buffering = 1 - line_buffering; W32GC_Set_Line_Buffering(line_buffering); break; case IDM_FLUSH: Flush_Buffer(); break; case IDM_SHOW_CONSOLE: show_console = 1 - show_console; Show_Text_Console(show_console); SetFocus(hwndEditControl); break; case IDM_FONT: CallChangeFont(hwnd); break; case IDM_MANUAL: Show_Help(NULL); break; case IDM_INDEX: Show_Help(Get_Current_Word()); break; case IDM_WEB: ShellExecute(NULL, "open", "http://www.gprolog.org/", NULL, ".", 0); break; case IDM_ABOUT: MessageBox(hwndMain, ABOUT_TEXT, "About GNU Prolog", MB_OK | MB_ICONINFORMATION); break; } } static HFONT CreationCourier(int flag) { memset(&CurrentFont, 0, sizeof(LOGFONT)); CurrentFont.lfCharSet = ANSI_CHARSET; CurrentFont.lfWeight = FW_NORMAL; if (flag) CurrentFont.lfHeight = 18; else CurrentFont.lfHeight = 15; CurrentFont.lfPitchAndFamily = (BYTE) (FIXED_PITCH | FF_MODERN); strcpy(CurrentFont.lfFaceName, "Courier"); /* Courier */ return (CreateFontIndirect(&CurrentFont)); } static int CallChangeFont(HWND hwnd) { LOGFONT lf; CHOOSEFONT cf; int r; memset(&cf, 0, sizeof(CHOOSEFONT)); memcpy(&lf, &CurrentFont, sizeof(LOGFONT)); cf.lStructSize = sizeof(CHOOSEFONT); cf.hwndOwner = hwnd; cf.lpLogFont = &lf; cf.Flags = CF_SCREENFONTS | CF_EFFECTS | CF_APPLY | CF_INITTOLOGFONTSTRUCT; cf.nFontType = SCREEN_FONTTYPE; r = ChooseFont(&cf); if (!r) return (0); memcpy(&CurrentFont, &lf, sizeof(LOGFONT)); hCourier = CreateFontIndirect(&CurrentFont); SendMessage(hwndEditControl, WM_SETFONT, (WPARAM) hCourier, 0); InvalidateRect(hwndEditControl, NULL, 1); SendMessage(hwndEditControl, EM_SCROLLCARET, 0, 0); return (1); } /*<---------------------------------------------------------------------->*/ static void SubClassEditField(HWND hwnd) { if (lpEProc == NULL) lpEProc = (WNDPROC) GetWindowLong(hwnd, GWL_WNDPROC); SetWindowLong(hwnd, GWL_WNDPROC, (DWORD) SubClassEdit); } static LRESULT CALLBACK SubClassEdit(HWND hwnd, UINT msg, WPARAM mp1, LPARAM mp2) { LRESULT r; int c, del, repeat, hasCtrl, hasAlt; unsigned char pKeyState[256]; if (msg == WM_CHAR) { repeat = (int) (mp2 & 0xffff); del = (mp1 == '\b' || mp1 == KEY_CTRL('D') || isprint(mp1)) ? Delete_Selection() : 0; if (del && (mp1 == '\b' || mp1 == KEY_CTRL('D')) && --repeat == 0) return 0; while (repeat--) Add_Char_To_Queue(mp1); return 0; } if (msg == WM_KEYDOWN) { GetKeyboardState(pKeyState); hasCtrl = (pKeyState[VK_CONTROL] & (unsigned char) 0x80); hasAlt = (pKeyState[VK_MENU] & (unsigned char) 0x80); #if 0 /* now done by accelerators defined in resources */ if ((mp1 == 'c' || mp1 == 'C') && hasCtrl && hasAlt) { SendMessage(hwndMain, WM_COMMAND, IDM_COPY, 0); return 0; } if ((mp1 == 'v' || mp1 == 'V') && hasCtrl && hasAlt) { SendMessage(hwndMain, WM_COMMAND, IDM_PASTE, 0); return 0; } #endif c = 0; switch (mp1) { case VK_NEXT: /* default vertical scroll behavior */ case VK_PRIOR: break; case VK_DELETE: if (Delete_Selection()) break; /* else like other keys */ case VK_LEFT: case VK_RIGHT: case VK_UP: case VK_DOWN: case VK_HOME: case VK_END: case VK_INSERT: Move_Caret_From_Mouse(0); c = (hasCtrl) ? 2 : 1; c = ((c << 8) | mp1); Add_Char_To_Queue(c); return 0; case VK_F1: /* not done by an accelerator for contextual help */ Show_Help(Get_Current_Word()); return 0; #ifdef DEBUG /* to include a test code */ case VK_F2: { int size = SendMessage(hwndEditControl, EM_GETLIMITTEXT, 0, 0); int len = SendMessage(hwndEditControl, WM_GETTEXTLENGTH, 0, 0); char s[100]; int beg, end; Set_Selection(3, 200); SendMessage(hwndEditControl, EM_GETSEL, (WPARAM) &beg, (WPARAM) &end); sprintf(s,"limit: %d len: %d sel: %d-%d", size, len, beg, end); MessageBox(NULL, s, "Error", MB_OK); // size += 10; SendMessage(hwndEditControl, EM_SETLIMITTEXT, size, 0); return 0; } #endif } } r = CallWindowProc(lpEProc, hwnd, msg, mp1, mp2); if (msg == WM_LBUTTONUP) /* left button (inside cur line) move the caret */ Move_Caret_From_Mouse(1); return r; } /*<---------------------------------------------------------------------->*/ #define Is_A_Sep(c) (strchr(separators, c) != NULL) static char * Get_Current_Word(void) { static char *buff = NULL; static int buff_len = 0; char *p, *q; int start, end, line_idx, length, offset; char *separators = " ,;:-'\"!@$#^&()-+*/\\[]|<=>`~{}"; if (fct_get_separators) separators = (*fct_get_separators) (); SendMessage(hwndEditControl, EM_GETSEL, (WPARAM) &start, (LPARAM) &end); line_idx = SendMessage(hwndEditControl, EM_LINEFROMCHAR, start, 0); length = SendMessage(hwndEditControl, EM_LINELENGTH, start, 0); offset = SendMessage(hwndEditControl, EM_LINEINDEX, line_idx, 0); if (buff_len < length) { buff_len = length + 128; buff = (char *) realloc(buff, buff_len); } *(unsigned short *) buff = length; SendMessage(hwndEditControl, EM_GETLINE, line_idx, (LPARAM) buff); buff[length] = '\0'; p = q = buff + (start - offset); if (!Is_A_Sep(*p)) /* else an empty word */ { while (p >= buff && !Is_A_Sep(*p)) p--; p++; while (*q && !Is_A_Sep(*q)) q++; } *q = '\0'; return p; } static void Consult_File(void) { char *p = Get_Selected_File_Name("Consult...", "pl", "Prolog Files (.pl .pro),*.pl;*.pro,All Files,*.*"); if (p == NULL) return; Add_Char_To_Queue(KEY_CTRL('A')); Add_Char_To_Queue(KEY_CTRL('K')); Add_String_To_Queue("consult('", 0); Add_String_To_Queue(p, FIX_TAB | FIX_CR | FIX_BACKSLASH | FIX_QUOTE); Add_String_To_Queue("').\n", 0); } static void Change_Directory(void) { char *p = Get_Selected_Directory("Select working directory", 1); if (p == NULL) return; Add_Char_To_Queue(KEY_CTRL('A')); Add_Char_To_Queue(KEY_CTRL('K')); Add_String_To_Queue("change_directory('", 0); Add_String_To_Queue(p, FIX_TAB | FIX_CR | FIX_BACKSLASH | FIX_QUOTE); Add_String_To_Queue("').\n", 0); #ifdef DEBUG SetCurrentDirectory(p); #endif } static void Insert_File_Name(void) { char *p = Get_Selected_File_Name("Pick a file name...", NULL, "Prolog Files (.pl .pro),*.pl;*.pro,All Files,*.*"); if (p == NULL) return; Add_Char_To_Queue('\''); Add_String_To_Queue(p, FIX_TAB | FIX_CR | FIX_BACKSLASH | FIX_QUOTE); Add_Char_To_Queue('\''); } static char * Get_Selected_File_Name(char *title, char *default_ext, char *filter) { char tmp_filter[128], *p; OPENFILENAME ofn; for(p = tmp_filter; *filter; filter++, p++) { *p = *filter; if (*p == ',') *p = '\0'; } *p++ = '\0'; *p = '\0'; memset(&ofn,0,sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = GetActiveWindow(); ofn.hInstance = GetModuleHandle(NULL); ofn.lpstrFilter = tmp_filter; ofn.nFilterIndex = 0; ofn.lpstrFile = buff_pathname; ofn.nMaxFile = sizeof(buff_pathname); ofn.lpstrTitle = title; ofn.lpstrDefExt = default_ext; ofn.lpstrInitialDir = "."; *buff_pathname = '\0'; ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_PATHMUSTEXIST ; return GetOpenFileName(&ofn) ? buff_pathname : NULL; } #ifndef BIF_NEWDIALOGSTYLE #define BIF_NEWDIALOGSTYLE 0x40 // new style #endif #ifndef BIF_NONEWFOLDERBUTTON #define BIF_NONEWFOLDERBUTTON 0x0200 // dont show "create new folder" button #endif static char * Get_Selected_Directory(char *title, int new_folder) { LPMALLOC pMalloc; BROWSEINFO browseInfo; LPITEMIDLIST lpItemIDList; CoInitialize(0); // needed for BIF_NEWDIALOGSTYLE if (S_OK != SHGetMalloc(&pMalloc)) return 0; memset(&browseInfo, 0, sizeof(BROWSEINFO)); browseInfo.hwndOwner = GetActiveWindow(); browseInfo.lpszTitle = title; browseInfo.lpfn = BrowseCallbackProc; browseInfo.ulFlags = BIF_NEWDIALOGSTYLE; if (!new_folder) browseInfo.ulFlags |= BIF_NONEWFOLDERBUTTON; lpItemIDList = SHBrowseForFolder(&browseInfo); *buff_pathname = '\0'; if (lpItemIDList != NULL) { SHGetPathFromIDList(lpItemIDList, buff_pathname); pMalloc->lpVtbl->Free(pMalloc, lpItemIDList); } pMalloc->lpVtbl->Release(pMalloc); CoUninitialize(); return (*buff_pathname) ? buff_pathname : NULL; } static int WINAPI BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData) { switch (uMsg) { case BFFM_INITIALIZED: { if (GetCurrentDirectory(sizeof(buff_pathname), buff_pathname)) { // WParam is TRUE since you are passing a path. // It would be FALSE if you were passing a pidl. SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM) buff_pathname); } break; } case BFFM_SELCHANGED: { // Set the status window to the currently selected path. if (SHGetPathFromIDList((LPITEMIDLIST) lp, buff_pathname)) { SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM) buff_pathname); } break; } default: break; } return 0; } static void Show_Help(char *word) { char help_path[1024]; HWND hwnd = 0; // or GetDesktopWindow(); UINT command; HH_AKLINK link; DWORD data; #ifdef LOAD_HTMLHELP_DYNAMICALLY typedef HWND (WINAPI *FHH) (); HINSTANCE inst; static FHH HtmlHelp; if (HtmlHelp == NULL && ((inst = LoadLibrary("hhctrl.ocx")) == NULL || (HtmlHelp = (FHH) GetProcAddress(inst, "HtmlHelpA")) != NULL)) { MessageBox(NULL, "Error loading hhctrl.ocx / HtmlHelpA", "Error", MB_OK); return; } #endif if (!Get_CHM_Help_Path(help_path)) /* if CANCEL, abort */ return; if (word == NULL) /* open first page of the manual */ { /* use strcat(help_path, "::/file.html#target") to open a specific page+target */ command = HH_DISPLAY_TOPIC; data = 0; } else { link.cbStruct = sizeof(HH_AKLINK); link.fReserved = FALSE; link.pszKeywords = word; link.pszUrl = NULL; // or .chm://index.html ? link.pszMsgText = NULL; link.pszMsgTitle = NULL; link.pszWindow = NULL; link.fIndexOnFail = TRUE; command = HH_KEYWORD_LOOKUP; data = (DWORD) &link; } if (HtmlHelp(hwnd, help_path, command, data) == 0) MessageBox(NULL, help_path, "HtmlHelp Error", MB_OK); } static int Get_CHM_Help_Path(char *path) { char *p; int devel_mode; for (;;) { if ((p = Get_Prolog_Path(&devel_mode)) != NULL) break; if ((p = Get_Selected_Directory("Select the GNU Prolog directory", 0)) == NULL) return 0; Read_Write_Registry(0, "RootPath", p, 0); } #ifdef DEBUG /* to force display + remove path (debug) */ MessageBox(NULL, p, "Prolog Root Path", MB_OK); Read_Write_Registry(0, "RootPath", "", 0); #endif if (devel_mode) { sprintf(path, "%s\\..\\doc\\gprolog.chm", p); if (access(path, F_OK) != 0) sprintf(path, "%s\\..\\..\\doc\\gprolog.chm", p); } else sprintf(path, "%s\\doc\\gprolog.chm", p); return 1; } /*<---------------------------------------------------------------------->*/ static void Add_Clipboard_To_Queue(void) { if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(hwndMain)) { HANDLE hClipData = GetClipboardData(CF_TEXT); if (hClipData) { char *str = GlobalLock(hClipData); if (str) Add_String_To_Queue(str, FIX_TAB | FIX_CR); GlobalUnlock(hClipData); } CloseClipboard(); } } static void Add_String_To_Queue(char *str, int mask_fix) { int c; EnterCriticalSection(&cs); SetEvent(event_char_in_queue); while(*str) { c = *str++; if (c == '\r' && (mask_fix & FIX_CR)) continue; if (c == '\t' && (mask_fix & FIX_TAB)) c = KEY_ESC('\t'); if (c == '\\' && (mask_fix & FIX_BACKSLASH)) c = '/'; if (c == '\'' && (mask_fix & FIX_QUOTE)) { queue[queue_end++] = '\''; if (queue_end >= sizeof(queue)) queue_end = 0; } queue[queue_end++] = c; if (queue_end >= sizeof(queue)) queue_end = 0; } LeaveCriticalSection(&cs); SetEvent(event_char_in_queue); } static void Add_Char_To_Queue(int c) { EnterCriticalSection(&cs); queue[queue_end++] = c; if (queue_end >= sizeof(queue)) queue_end = 0; LeaveCriticalSection(&cs); SetEvent(event_char_in_queue); } DLLEXPORT int W32GC_Kbd_Is_Not_Empty() { return queue_start != queue_end; } DLLEXPORT int W32GC_Get_Char0() { int result; in_get_char = 1; Flush_Buffer(); /* synchronize output and posit */ last_is_read = 1; while (queue_start == queue_end) { WaitForSingleObject(event_char_in_queue, INFINITE); } EnterCriticalSection(&cs); result = queue[queue_start]; queue_start++; if (queue_start >= sizeof(queue)) queue_start = 0; LeaveCriticalSection(&cs); in_get_char = 0; last_is_read = 1; return result; } static void Set_Selection(int posit, int n) { int lines = SendMessage(hwndEditControl, EM_GETLINECOUNT, 0, 0); int line_index = SendMessage(hwndEditControl, EM_LINEINDEX, lines - 1, 0); SendMessage(hwndEditControl, EM_SETSEL, line_index + posit, line_index + posit + n); } static void Set_Caret_Position(int posit) { Set_Selection(posit, 0); } static int Move_Caret_To(int start_or_end) { int lines = SendMessage(hwndEditControl, EM_GETLINECOUNT, 0, 0); int line_index = SendMessage(hwndEditControl, EM_LINEINDEX, lines - 1, 0); int prompt_length = 0; int c = (1 << 8) | VK_RIGHT; int count; if (fct_get_prompt_length) prompt_length = (*fct_get_prompt_length) (); start_or_end -= line_index; /* < 0 if not in the current (last) line */ if (start_or_end < prompt_length) /* not in cur line or in the prompt: do nothing */ return 0; count = start_or_end - posit; if (count < 0) { count = -count; c = (1 << 8) | VK_LEFT; } while (count--) Add_Char_To_Queue(c); return 1; } static void Move_Caret_From_Mouse(int if_no_selection) { int start, end; SendMessage(hwndEditControl, EM_GETSEL, (WPARAM) &start, (LPARAM) &end); if (if_no_selection && start != end) return; Move_Caret_To(start); } static int Delete_Selection(void) { int start, end; int count; SendMessage(hwndEditControl, EM_GETSEL, (WPARAM) &start, (LPARAM) &end); count = end - start; if (count == 0 || !Move_Caret_To(start)) return 0; while (count--) Add_Char_To_Queue(KEY_CTRL('D')); return 1; } static void Display_Text(char *str, int n) { while (n--) { switch (*str) { case '\r': break; case '\n': Flush_Buffer(); /* emit the line */ Set_Selection(0x7fff, 0); /* move caret at end of line */ SendMessage(hwndEditControl, EM_REPLACESEL, 0, (LPARAM) "\r\n"); posit = 0; break; case '\b': /* really needed if only used if W32GC_Backd not defined */ W32GC_Backd(1); break; default: if (wr_buffer_ptr - wr_buffer >= sizeof(wr_buffer)) Flush_Buffer(); *wr_buffer_ptr++ = isprint(*str) ? *str : ' '; } str++; } if (!line_buffering) Flush_Buffer(); } static void Flush_Buffer(void) { int n = wr_buffer_ptr - wr_buffer; int to_add = n + 2; /* maybe a \r\n after this */ int max_size = SendMessage(hwndEditControl, EM_GETLIMITTEXT, 0, 0); int cur_size = SendMessage(hwndEditControl, WM_GETTEXTLENGTH, 0, 0); if (n == 0) return; *wr_buffer_ptr = '\0'; if (n > 5) /* avoid this for short outputs, e.g. interactive reading with echo */ { int start, end; Set_Selection(posit, n); SendMessage(hwndEditControl, EM_GETSEL, (LPARAM) &start, (LPARAM) &end); to_add -= (end - start); } if (cur_size + to_add > max_size) /* not enough space - remove some beginning lines */ { int line = SendMessage(hwndEditControl, EM_LINEFROMCHAR, to_add, 0); int line_index = SendMessage(hwndEditControl, EM_LINEINDEX, line + 1, 0); SendMessage(hwndEditControl, EM_SETSEL, 0, line_index); SendMessage(hwndEditControl, EM_REPLACESEL, 0, (LPARAM) wr_buffer_ptr); /* empty string to remove lines */ } Set_Selection(posit, n); SendMessage(hwndEditControl, EM_REPLACESEL, 0, (LPARAM) wr_buffer); posit += n; wr_buffer_ptr = wr_buffer; last_is_read = 0; } DLLEXPORT void W32GC_Set_Line_Buffering(int is_buffered) { line_buffering = is_buffered; if (!line_buffering) { Flush_Buffer(); CheckMenuItem(GetMenu(hwndMain), IDM_BUFFERING, MF_BYCOMMAND | MF_UNCHECKED); EnableMenuItem(GetMenu(hwndMain), IDM_FLUSH, MF_BYCOMMAND | MF_GRAYED); } else { CheckMenuItem(GetMenu(hwndMain), IDM_BUFFERING, MF_BYCOMMAND | MF_CHECKED); EnableMenuItem(GetMenu(hwndMain), IDM_FLUSH, MF_BYCOMMAND | MF_ENABLED); } } DLLEXPORT int W32GC_Get_Line_Buffering(void) { return line_buffering; } DLLEXPORT void W32GC_Flush(FILE *f) { Flush_Buffer(); } #ifdef DEBUG static int Console_Printf(char *format, ...) /* debug: display in the GUI */ { va_list arg_ptr; char buff[1024]; int ret; va_start(arg_ptr, format); ret = vsprintf(buff, format, arg_ptr); Display_Text(buff, strlen(buff)); va_end(arg_ptr); return ret; } #endif DLLEXPORT void W32GC_Put_Char(int c) { char c1 = c; Display_Text(&c1, 1); } DLLEXPORT void W32GC_Backd(int n) { Flush_Buffer(); /* synchronize output and posit */ posit -= n; Set_Caret_Position(posit); } DLLEXPORT void W32GC_Forwd(int n) { Flush_Buffer(); /* synchronize output and posit */ posit += n; Set_Caret_Position(posit); } DLLEXPORT void W32GC_Displ(int n, char *str) { Display_Text(str, n); } DLLEXPORT void W32GC_Displ_Str(char *str) { Display_Text(str, strlen(str)); } DLLEXPORT void W32GC_Erase(int n) { Flush_Buffer(); /* synchronize output and posit */ Set_Selection(posit, n); SendMessage(hwndEditControl, EM_REPLACESEL, 0, (LPARAM) ""); } DLLEXPORT void W32GC_Emit_Beep() { Beep(440, 100); } DLLEXPORT void W32GC_Ins_Mode(int ins_mode) { } DLLEXPORT void W32GC_Screen_Size(int *row, int *col) { HDC hDC; RECT rc; int nHautCar, nLargCar; TEXTMETRIC textmetric; HFONT oldFont; hDC = GetDC(hwndEditControl); oldFont = SelectObject(hDC, hCourier); GetTextMetrics(hDC, &textmetric); nHautCar = textmetric.tmExternalLeading + textmetric.tmHeight; nLargCar = textmetric.tmAveCharWidth; SelectObject(hDC, oldFont); ReleaseDC(hwndEditControl, hDC); GetClientRect(hwndEditControl, &rc); rc.bottom -= GetSystemMetrics(SM_CYHSCROLL); rc.right -= GetSystemMetrics(SM_CXVSCROLL); *col = rc.right / nLargCar; *row = rc.bottom / nHautCar; } DLLEXPORT int W32GC_Confirm_Box(char *title, char *msg) { UINT utype; if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); Flush_Buffer(); utype = MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION; return (MessageBox(hwndMain, msg, title, utype) == IDYES); } DLLEXPORT void W32GC_Message_Box(char *title, char *msg, int type) { UINT utype; if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); Flush_Buffer(); utype = MB_OK | MB_SETFOREGROUND; if (type == 0) // error utype |= MB_ICONERROR; else if (type == 1) // warning utype |= MB_ICONWARNING; else if (type == 2) utype |= MB_ICONINFORMATION; // information else if (type == 3) utype |= MB_ICONQUESTION; // question MessageBox(hwndMain, msg, title,utype); } DLLEXPORT void W32GC_Exit_Process(int ret_val) { Flush_Buffer(); /* synchronize output and posit */ if (!last_is_read) W32GC_Message_Box("GNU Prolog", "Program terminated", 2); } static HWND Find_Text_Console_Handle(void) { HWND hwnd; char save_title[256]; char uniq_title[256]; GetConsoleTitle(save_title, sizeof(save_title)); sprintf(uniq_title, "%ld/%ld", GetTickCount(), GetCurrentProcessId()); SetConsoleTitle(uniq_title); Sleep(40); // wait to be sure the title is displayed hwnd = FindWindow(NULL, uniq_title); SetConsoleTitle(save_title); return hwnd; } /* Try to determine if launched from a command-line (if yes do not hide * the console) or as a separate screen (hide the console at start). * If cursor in 0,0 launched from a separate screen. */ static int Launched_From_Command_Line() { HANDLE h_stdout; CONSOLE_SCREEN_BUFFER_INFO csbi; int from_cmd_line; h_stdout = GetStdHandle(STD_OUTPUT_HANDLE); if (h_stdout == INVALID_HANDLE_VALUE) return TRUE; GetConsoleScreenBufferInfo(h_stdout, &csbi); from_cmd_line = (csbi.dwCursorPosition.X != 0 || csbi.dwCursorPosition.Y != 0); if (csbi.dwSize.X <= 0 || csbi.dwSize.Y <= 0) from_cmd_line = 1; return from_cmd_line; } static void Show_Text_Console(int show_console) { if (show_console) { ShowWindow(hwnd_console, SW_SHOW); CheckMenuItem(GetMenu(hwndMain), IDM_SHOW_CONSOLE, MF_BYCOMMAND | MF_CHECKED); } else { ShowWindow(hwnd_console, SW_HIDE); CheckMenuItem(GetMenu(hwndMain), IDM_SHOW_CONSOLE, MF_BYCOMMAND | MF_UNCHECKED); } } ./gprolog-1.3.0/src/Pl2Wam/0000777004425400513100000000000010547442376013702 5ustar diazloco./gprolog-1.3.0/src/Pl2Wam/syn_sugar.pl0000644004425400513100000001767310547162441016253 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog to WAM compiler * * File : syn_sugar.pl * * Descr.: pass 1: syntactic sugar removing * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: syn_sugar.pl,v 1.13 2007/01/04 10:34:07 diaz Exp $ */ syntactic_sugar_init_pred(Pred, _) :- '$aux_name'(Pred), !. syntactic_sugar_init_pred(_, _) :- g_assign(aux, 1). syntactic_sugar(SrcCl, Head, Body2) :- ( SrcCl = (Head :- Body) ; SrcCl = Head, Body = true ), !, normalize_cuts(Body, Body1), normalize_alts(Body1, Head, Body2). normalize_cuts(Body, Body2) :- g_assign(has_cut, f), normalize_cuts1(Body, CutVar, Body1), !, ( g_read(has_cut, t) -> Body2 = ('$get_cut_level'(CutVar), Body1) ; Body2 = Body1 ). normalize_cuts1(X, VarCut, P) :- var(X), normalize_cuts1(call(X), VarCut, P). normalize_cuts1((If ; R), CutVar, Body) :- nonvar(If), If = (P -> Q), Body = ('$get_cut_level'(CutVar1), P, '$cut'(CutVar1), Q1 ; R1), normalize_cuts1(Q, CutVar, Q1), normalize_cuts1(R, CutVar, R1). normalize_cuts1((P -> Q), CutVar, Body) :- Body = ('$get_cut_level'(CutVar1), P, '$cut'(CutVar1), Q1 ; fail), normalize_cuts1(Q, CutVar, Q1). normalize_cuts1(!, CutVar, '$cut'(CutVar)) :- g_assign(has_cut, t). normalize_cuts1((P, Q), CutVar, (P1, Q1)) :- normalize_cuts1(P, CutVar, P1), normalize_cuts1(Q, CutVar, Q1). normalize_cuts1((P ; Q), CutVar, (P1 ; Q1)) :- normalize_cuts1(P, CutVar, P1), normalize_cuts1(Q, CutVar, Q1). normalize_cuts1(call(G), _, '$call'(G, Func, Arity, true)) :- cur_pred_without_aux(Func, Arity). normalize_cuts1(catch(G, C, R), _, '$catch'(G, C, R, Func, Arity, true)) :- cur_pred_without_aux(Func, Arity). normalize_cuts1(throw(B), _, '$throw'(B, Func, Arity, true)) :- cur_pred_without_aux(Func, Arity). normalize_cuts1(P, _, P) :- ( callable(P) -> true ; error('body goal is not callable (~q)', [P]) ). normalize_alts(Body, Head, Body1) :- functor(Head, Pred, N), g_assign(head_functor, Pred), g_assign(head_arity, N), normalize_alts1(Body, Head, Body1), !. normalize_alts1(X, _, call(X)) :- var(X). normalize_alts1((P, Q), RestC, (P1, Q1)) :- normalize_alts1(P, (RestC, Q), P1), normalize_alts1(Q, (RestC, P), Q1). normalize_alts1((P ; Q), RestC, AuxPred) :- lst_var(RestC, [], VarRestC), lst_var((P ; Q), [], VarAlt), set_inter(VarAlt, VarRestC, V), length(V, N1), g_read(head_functor, Pred), g_read(head_arity, N), init_aux_pred_name(Pred, N, AuxName, N1), AuxPred =.. [AuxName|V], g_read(where, Where), linearize((P ; Q), AuxPred, Where, LAuxSrcCl), asserta(buff_aux_pred(AuxName, N1, LAuxSrcCl)). normalize_alts1(P, _, P1) :- pred_rewriting(P, P1), !. init_aux_pred_name(Pred, N, AuxName, N1) :- g_read(aux, Aux), Aux1 is Aux + 1, g_assign(aux, Aux1), '$make_aux_name'(Pred, N, Aux, AuxName), ( test_pred_info(bpl, Pred, N), set_pred_info(bpl, AuxName, N1) ; test_pred_info(bfd, Pred, N), set_pred_info(bfd, AuxName, N1) ; true ), !. linearize(Body, AuxPred, Where, LAuxSrcCl) :- ( Body = (P ; Q) -> linearize(Q, AuxPred, Where, LAuxSrcCl1), linearize1(P, AuxPred, Where, LAuxSrcCl2), append(LAuxSrcCl2, LAuxSrcCl1, LAuxSrcCl) ; linearize1(Body, AuxPred, Where, LAuxSrcCl) ). linearize1(fail, _, _, []) :- !. linearize1(P, AuxPred, Where, [Where + AltP]) :- copy_term((AuxPred :- P), AltP). lst_var(X, V, V1) :- var(X), !, set_add(V, X, V1). lst_var(P, V, V1) :- functor(P, _, N), lst_var_args(1, N, P, V, V1). lst_var_args(I, N, P, V, V2) :- ( I =< N -> arg(I, P, ArgP), lst_var(ArgP, V, V1), I1 is I + 1, lst_var_args(I1, N, P, V1, V2) ; V2 = V ). % Other predicate rewriting pred_rewriting(fd_tell(X), T) :- % FD transformation test_c_call_allowed(fd_tell / 1), pred_rewriting('$call_c'(X, [boolean]), T). pred_rewriting(set_bip_name(Name, Arity), Pred1) :- g_read(inline, t), % also if byte code since implies --no-inline nonvar(Name), nonvar(Arity), ( atom(Name) ; error('set_bip_name/2 inline: atom expected instead of ~q', [Name]) ), ( integer(Arity) ; error('set_bip_name/2 inline: integer expected instead of ~q', [Arity]) ), pred_rewriting('$call_c'('Set_Bip_Name_2'(Name, Arity)), Pred1). pred_rewriting(Pred, Pred1) :- % math define current bip g_read(inline, t), % also if byte code since implies --no-inline g_read(fast_math, f), functor(Pred, F, 2), ( F = (is) ; math_cmp_functor_name(F, _) ), % see code_gen.pl pred_rewriting('$call_c'('Set_Bip_Name_2'(F, 2)), T), Pred1 = (T, Pred). % The user should use: '$call_c'(F) or '$call_c'(F, LCOpt) % LCOpt is a list containing: % jump/boolean % fast_call (use a fact call convention) % tagged (use tagged calls for atom, integers and F/N) % by_value (pass atom, numbers, F/N by value not by WamWord) % use_x_regs (the function can destroy any X register) % % Backward compatibility: '$call_c_test'/1 and '$call_c_jump'/1 are % kept for the moment... % do not use LCOpt1 = '$no_internal$'(LCOpt) for bootstrapping pred_rewriting('$call_c'(F, LCOpt), '$call_c'(F, LCOpt1)) :- test_c_call_allowed('$call_c' / 2), no_internal_transf(LCOpt, LCOpt1). pred_rewriting('$call_c'(F), T) :- test_c_call_allowed('$call_c' / 1), pred_rewriting('$call_c'(F, []), T). % backward compatibility pred_rewriting('$call_c_test'(F), T) :- test_c_call_allowed('$call_c_test' / 1), pred_rewriting('$call_c'(F, [boolean]), T). % backward compatibility pred_rewriting('$call_c_jump'(F), T) :- test_c_call_allowed('$call_c_jump' / 1), pred_rewriting('$call_c'(F, [jump]), T). pred_rewriting(P, P). test_c_call_allowed(_) :- g_read(call_c, t), !. test_c_call_allowed(X) :- error('~q not allowed in this mode', [X]). % can be considered as inline (neither CP nor X regs to save) not_dangerous_c_call([]). not_dangerous_c_call([COpt|LCOpt]) :- COpt \== jump, COpt \== use_x_regs, not_dangerous_c_call(LCOpt). add_wrapper_to_dyn_clause(Pred, N, Where + Cl, AuxName) :- init_aux_pred_name(Pred, N, AuxName, N), ( Cl = (Head :- Body) -> head_wrapper(Head, AuxName, Head1), Cl1 = (Head1 :- Body) ; head_wrapper(Cl, AuxName, Cl1) ), assertz(buff_aux_pred(AuxName, N, [Where + Cl1])). head_wrapper(Head, AuxName, Head1) :- Head =.. [_|LArgs], Head1 =.. [AuxName|LArgs]. ./gprolog-1.3.0/src/Pl2Wam/indexing.pl0000644004425400513100000003445010547162440016035 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog to WAM compiler * * File : indexing.pl * * Descr.: indexing code generation * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: indexing.pl,v 1.12 2007/01/04 10:34:06 diaz Exp $ */ /*-------------------------------------------------------------------------* * Level 1: * * * * The clauses C1,...,Cn of a predicate Pred are split into groups * * G0,...,Gm so that each group Gi: * * * * a) contains only one clause whose 1st arg is a variable. * * b) contains only clauses whose 1st arg is not a variable. * * * * The following code is then produced: * * * * L0: try_me_else(L1) * * * * * * L1: retry_me_else(L2) * * * * : * * : * * Lm: trust_me_else_fail * * * * * * Level 2: * * * * For a group Gi whose type is a), the only contains the * * code produced for the associated Ck clause. * * For a group Gi whose type is b), the contains indexing * * instructions for the level 2 to discriminate between atoms, integers * * lists and structures as follows: * * * * switch_on_term(LabVar,LabAtm,LabInt,LabLst,LabStc) * * * * LabFail: fail if there is a LabXxx = LabFail * * * * LabAtm : switch_on_atom(N,[(atm1,LabAtm1),...(atmN,LabAtmN)]) \ * * | * * LabAtmj: try(Adj1) \ if more than 1 clause has | * * retry(Adj2) if more than 2 | atmj as 1st arg, | * * : | else LabAtmj = Adj1 | * * trust(Adjk) / | * * if there are atms, else LabAtm=LabFail/ * * idem for switch_on_integer * * * * LabLst : try(Adj1) \ if more than 1 clause has | * * retry(Adj2) if more than 2 | [_|_] as 1st arg, | * * : | else LabLst = Adj1 | * * trust(Adjk) / | * * if there are lsts, else LabLst=LabFail/ * * * * LabStc : switch_on_structure(N,[(stc1,LabStc1),...(stcN,LabStcN)]) \ * * | * * LabStcj: try(Adj1) \ if more than 1 clause has | * * retry(Adj2) if more than 2 | stcj as 1st arg, | * * : | else LabStcj = Adj1 | * * trust(Adjk) / | * * if there are stcs, else LabStc=LabFail/ * * * * LabVar: try_me_else(LabVar2) if there are more than 1 clause in Gi, * * Ad1: else LabVar = Ad1 * * * * LabVar2: retry_me_else(LabVar3) * * Ad2: * * : * * : * * LabVarp: trust_me_else_fail * * Adp: * * * * LCC: [cl(Ad,FirstArg,WamCl), ...] list of compiled clauses for Pred. * * * * Ad : will contain (in level 2) the label associated to WamCl * * (initially Ad is an unbound variable). * * FirstArg: the first argument of the source clause. * * WamCl : [wam_inst, ...] clause wam code. * * * * look_for_var partitions LCC in LCCBefore, CCVar and LCCAfter and detects* * the current case: * * * * 1...) a variables has been found (thus level 1), sub-cases: * * 11) LCCBefore<>[] and LCCAfter<>[] 12) LCCBefore<>[] and LCCAfter=[]* * 13) LCCBefore= [] and LCCAfter<>[] 14) LCCBefore= [] and LCCAfter=[]* * * * 2) no variables (thus level 2). * * * * other used variables: * * * * Lev1: has any try/retry/trust_me_else been generated for level 1 (t/f)? * * Atm : [a(atm,[Ad, ...]), ...] * * Int : [a(int,[Ad, ...]), ...] * * Lst : [Ad, ...] * * Stc : [a(f/n,[Ad, ...]), ...] * * List: Atm, Int, or Stc for general processings * * * * Each label issued from the indexing phase is first referenced and later * * defined. * *-------------------------------------------------------------------------*/ indexing(LCC, WamCode1) :- indexing1(LCC, f, _, [_|WamCode]), % ignore the unused label(0) cur_pred(Pred, N), ( test_pred_info(cut, Pred, N) -> WamCode1 = [load_cut_level(N)|WamCode] ; WamCode1 = WamCode ), allocate_labels(WamCode1, 1, _). indexing1(LCC, Lev1, Lab, [label(Lab)|WamCode]) :- look_for_var(LCC, Case, LCCBefore, CCVar, LCCAfter), mk_indexing(Case, LCCBefore, CCVar, LCCAfter, Lev1, WamCode), !. look_for_var([], 2, [], _, []). look_for_var([cl(Ad, var, WamCl)|LCC], Case, [], cl(Ad, var, WamCl), LCC) :- !, ( LCC = [] -> Case = 14 ; Case = 13 ). look_for_var([CC|LCC], Case1, [CC|LCCBefore], CCVar, LCCAfter) :- look_for_var(LCC, Case, LCCBefore, CCVar, LCCAfter), ( Case = 13 -> Case1 = 11 ; Case = 14 -> Case1 = 12 ; Case1 = Case ). mk_indexing(11, LCCBefore, cl(_, _, WamCl), LCCAfter, Lev1, WamCode) :- ( Lev1 = f -> TmRmTm = try_me_else(Lab) ; TmRmTm = retry_me_else(Lab) ), mk_indexing(2, LCCBefore, _, _, f, WamBefore), indexing1(LCCAfter, t, Lab1, WamAfter), WamCode = [TmRmTm, WamBefore, label(Lab), retry_me_else(Lab1), WamCl|WamAfter]. mk_indexing(12, LCCBefore, cl(_, _, WamCl), _, Lev1, WamCode) :- ( Lev1 = f -> TmRmTm = try_me_else(Lab) ; TmRmTm = retry_me_else(Lab) ), mk_indexing(2, LCCBefore, _, _, f, WamBefore), WamCode = [TmRmTm, WamBefore, label(Lab), trust_me_else_fail|WamCl]. mk_indexing(13, _, cl(_, _, WamCl), LCCAfter, Lev1, WamCode) :- ( Lev1 = f -> TmRmTm = try_me_else(Lab) ; TmRmTm = retry_me_else(Lab) ), indexing1(LCCAfter, t, Lab, WamAfter), WamCode = [TmRmTm, WamCl|WamAfter]. mk_indexing(14, _, cl(_, _, WamCl), _, Lev1, WamCode) :- ( Lev1 = f -> WamCode = WamCl ; WamCode = [trust_me_else_fail|WamCl] ). mk_indexing(2, LCC, _, _, Lev1, WamCode) :- ( Lev1 = f -> WamCode = WamCode1 ; WamCode = [trust_me_else_fail|WamCode1] ), ( LCC = [_] -> % no switch_on_term for only one clause WamCode2 = [_|WamCode2Rest], % remove useless label WamCode1 = WamCode2Rest ; WamCode1 = [switch_on_term(LabVar, LabAtm, LabInt, LabLst, LabStc)|WamCode2] ), WamCode2 = WamSwtAtm, split(LCC, Atm, Int, Lst, Stc), !, gen_switch(Atm, switch_on_atom, LabAtm, WamSwtInt, WamSwtAtm), gen_switch(Int, switch_on_integer, LabInt, WamLst, WamSwtInt), gen_list(Lst, LabLst, WamSwtStc, WamLst), gen_switch(Stc, switch_on_structure, LabStc, WamCode3, WamSwtStc), gen_insts(LCC, LabVar, WamCode3). split(LCC, Atm1, Int1, Lst, Stc1) :- split1(LCC, [], [], a(End, End), [], Atm, Int, a([], Lst), Stc), terminate_list(Atm, Atm1), terminate_list(Int, Int1), terminate_list(Stc, Stc1). split1([], Atm, Int, Lst, Stc, Atm, Int, Lst, Stc). split1([cl(Ad, FirstArg, _)|LCC], Atm, Int, Lst, Stc, Atm2, Int2, Lst2, Stc2) :- split2(FirstArg, Ad, Atm, Int, Lst, Stc, Atm1, Int1, Lst1, Stc1), split1(LCC, Atm1, Int1, Lst1, Stc1, Atm2, Int2, Lst2, Stc2). split2(atm(A), Ad, Atm, Int, Lst, Stc, Atm1, Int, Lst, Stc) :- add_to_list(Atm, A, Ad, Atm1). split2(int(N), Ad, Atm, Int, Lst, Stc, Atm, Int1, Lst, Stc) :- add_to_list(Int, N, Ad, Int1). split2(lst, Ad, Atm, Int, a([Ad|End], LAd), Stc, Atm, Int, a(End, LAd), Stc). split2(stc(F, N), Ad, Atm, Int, Lst, Stc, Atm, Int, Lst, Stc1) :- add_to_list(Stc, F / N, Ad, Stc1). add_to_list([], F, Ad, [a(F, End, [Ad|End])]). add_to_list([a(F, [Ad|End], LAd)|List], F, Ad, [a(F, End, LAd)|List]) :- !. add_to_list([X|List], F, Ad, [X|List1]) :- add_to_list(List, F, Ad, List1). terminate_list([], []). terminate_list([a(F, [], LAd)|L], [a(F, LAd)|L1]) :- terminate_list(L, L1). gen_switch([], _, fail, LNext, LNext) :- !. % if only 1 element with only 1 clause, no switch (remove if needed) gen_switch([a(_, [Ad])], _, Ad, LNext, LNext) :- !. % if only 1 element with n clauses, no switch (remove if needed) /* gen_switch([a(_, LAd)], _, Lab, LNext, WamTRT) :- !, gen_list(LAd, Lab, LNext, WamTRT). */ gen_switch(List, Ins, Lab, LNext, [label(Lab), SwtW|WamTRT]) :- create_switch_list(List, LSwt, LNext, WamTRT), SwtW =.. [Ins, LSwt]. create_switch_list([], [], LNext, LNext). create_switch_list([a(F, LAd)|List], [(F, Lab)|LSwt], LNext, WamTRT) :- gen_list(LAd, Lab, WamTRT1, WamTRT), create_switch_list(List, LSwt, LNext, WamTRT1). gen_list([], fail, LNext, LNext). gen_list([Ad], Ad, LNext, LNext) :- % only 1 Atmj, Lst or Stcj !. gen_list([Ad|LAd], Lab, LNext, WamRT1) :- % 2..n WamRT1 = [label(Lab), try(Ad)|WamRT], gen_list1(LAd, LNext, WamRT). gen_list1([Ad], LNext, [trust(Ad)|LNext]). gen_list1([Ad|LAd], LNext, WamRT1) :- WamRT1 = [retry(Ad)|WamRT], gen_list1(LAd, LNext, WamRT). gen_insts([cl(Ad, _, WamCl)], Ad, [label(Ad)|WamCl]) :- % only 1 clause !. gen_insts([cl(Ad, _, WamCl)|LCC], Lab, WamCode2) :- % 2..n gen_insts1(LCC, Lab1, WamCode), WamCode2 = [label(Lab), try_me_else(Lab1), label(Ad), WamCl|WamCode]. gen_insts1([cl(Ad, _, WamCl)], Lab, [label(Lab), trust_me_else_fail, label(Ad)|WamCl]) :- !. gen_insts1([cl(Ad, _, WamCl)|LCC], Lab, WamCode2) :- gen_insts1(LCC, Lab1, WamCode), WamCode2 = [label(Lab), retry_me_else(Lab1), label(Ad), WamCl|WamCode]. allocate_labels([], N, N) :- !. allocate_labels([WamInst1|WamInst2], N, N2) :- !, allocate_labels(WamInst1, N, N1), % for nested lists allocate_labels(WamInst2, N1, N2). allocate_labels(label(N), N, N1) :- !, N1 is N + 1 . allocate_labels(_, N, N). ./gprolog-1.3.0/src/Pl2Wam/inst_codif.wam0000644004425400513100000003467010547440341016525 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : inst_codif.pl % date : 1 5 2007 % time : 13:13:21 file_name('/home/diaz/GP/src/src/Pl2Wam/inst_codif.pl'). predicate(alias_stop_instruction/1,29,static,private,user,[ load_cut_level(1), allocate(1), get_variable(x(2),0), get_variable(y(0),1), put_variable(x(0),1), put_void(3), call_c('Blt_Functor',[fast_call,boolean],[x(2),x(1),x(3)]), put_value(x(2),1), call('$alias_stop_instruction/1_$aux1'/2), cut(y(0)), deallocate, proceed]). predicate('$alias_stop_instruction/1_$aux1'/2,29,static,private,user,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(call,3),(execute,5),(call_c,7)]), label(2), try_me_else(4), label(3), get_atom(call,0), proceed, label(4), retry_me_else(6), label(5), get_atom(execute,0), proceed, label(6), trust_me_else_fail, label(7), get_atom(call_c,0), put_integer(2,2), put_variable(x(0),3), call_c('Blt_Arg',[fast_call,boolean],[x(2),x(1),x(3)]), execute('$alias_stop_instruction/1_$aux2'/1)]). predicate('$alias_stop_instruction/1_$aux2'/1,29,static,private,user,[ try_me_else(1), put_value(x(0),1), put_atom(jump,0), execute(memberchk/2), label(1), trust_me_else_fail, put_value(x(0),1), put_atom(use_x_args,0), execute(memberchk/2)]). predicate(codification/2,43,static,private,user,[ load_cut_level(2), allocate(1), get_variable(y(0),2), call(codif/2), cut(y(0)), deallocate, proceed]). predicate(codif/2,47,static,private,user,[ try_me_else(78), switch_on_term(8,fail,fail,fail,1), label(1), switch_on_structure([(get_variable/2,2),(get_value/2,3),(get_atom/2,17),(get_integer/2,19),(get_float/2,21),(get_nil/1,23),(get_list/1,25),(get_structure/2,27),(put_variable/2,4),(put_void/1,31),(put_value/2,5),(put_unsafe_value/2,39),(put_atom/2,41),(put_integer/2,43),(put_float/2,45),(put_nil/1,47),(put_list/1,49),(put_structure/2,51),(math_load_value/2,6),(math_fast_load_value/2,7),(unify_variable/1,61),(unify_value/1,63),(unify_local_value/1,65),(call/1,67),(execute/1,69),(load_cut_level/1,71),(cut/1,73),(call_c/3,75),(foreign_call_c/4,77)]), label(2), try(9), trust(13), label(3), try(11), trust(15), label(4), try(29), trust(35), label(5), try(33), trust(37), label(6), try(53), trust(55), label(7), try(57), trust(59), label(8), try_me_else(10), label(9), get_structure(get_variable/2,0), unify_variable(x(0)), unify_variable(x(2)), get_structure(x/1,0), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(c/2,1), unify_value(x(2)), unify_value(x(0)), proceed, label(10), retry_me_else(12), label(11), get_structure(get_value/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(x/1,2), unify_variable(x(2)), get_list(1), unify_variable(x(3)), unify_list, unify_variable(x(1)), unify_nil, get_structure(r/1,3), unify_value(x(2)), get_structure(r/1,1), unify_value(x(0)), proceed, label(12), retry_me_else(14), label(13), get_structure(get_variable/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(y/1,2), unify_void(1), get_list(1), unify_variable(x(1)), unify_nil, get_structure(r/1,1), unify_value(x(0)), proceed, label(14), retry_me_else(16), label(15), get_structure(get_value/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(y/1,2), unify_void(1), get_list(1), unify_variable(x(1)), unify_nil, get_structure(r/1,1), unify_value(x(0)), proceed, label(16), retry_me_else(18), label(17), get_structure(get_atom/2,0), unify_void(1), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(r/1,1), unify_value(x(0)), proceed, label(18), retry_me_else(20), label(19), get_structure(get_integer/2,0), unify_void(1), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(r/1,1), unify_value(x(0)), proceed, label(20), retry_me_else(22), label(21), get_structure(get_float/2,0), unify_void(1), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(r/1,1), unify_value(x(0)), proceed, label(22), retry_me_else(24), label(23), get_structure(get_nil/1,0), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(r/1,1), unify_value(x(0)), proceed, label(24), retry_me_else(26), label(25), get_structure(get_list/1,0), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(r/1,1), unify_value(x(0)), proceed, label(26), retry_me_else(28), label(27), get_structure(get_structure/2,0), unify_void(1), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(r/1,1), unify_value(x(0)), proceed, label(28), retry_me_else(30), label(29), get_structure(put_variable/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(x/1,2), unify_variable(x(2)), get_list(1), unify_variable(x(3)), unify_list, unify_variable(x(1)), unify_nil, get_structure(w/1,3), unify_value(x(2)), get_structure(w/1,1), unify_value(x(0)), proceed, label(30), retry_me_else(32), label(31), get_structure(put_void/1,0), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(32), retry_me_else(34), label(33), get_structure(put_value/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(x/1,2), unify_variable(x(2)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(c/2,1), unify_value(x(2)), unify_value(x(0)), proceed, label(34), retry_me_else(36), label(35), get_structure(put_variable/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(y/1,2), unify_void(1), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(36), retry_me_else(38), label(37), get_structure(put_value/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(y/1,2), unify_void(1), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(38), retry_me_else(40), label(39), get_structure(put_unsafe_value/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(y/1,2), unify_void(1), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(40), retry_me_else(42), label(41), get_structure(put_atom/2,0), unify_void(1), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(42), retry_me_else(44), label(43), get_structure(put_integer/2,0), unify_void(1), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(44), retry_me_else(46), label(45), get_structure(put_float/2,0), unify_void(1), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(46), retry_me_else(48), label(47), get_structure(put_nil/1,0), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(48), retry_me_else(50), label(49), get_structure(put_list/1,0), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(50), retry_me_else(52), label(51), get_structure(put_structure/2,0), unify_void(1), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(52), retry_me_else(54), label(53), get_structure(math_load_value/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(x/1,2), unify_variable(x(2)), get_list(1), unify_variable(x(3)), unify_list, unify_variable(x(1)), unify_nil, get_structure(r/1,3), unify_value(x(2)), get_structure(w/1,1), unify_value(x(0)), proceed, label(54), retry_me_else(56), label(55), get_structure(math_load_value/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(y/1,2), unify_void(1), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(56), retry_me_else(58), label(57), get_structure(math_fast_load_value/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(x/1,2), unify_variable(x(2)), get_list(1), unify_variable(x(3)), unify_list, unify_variable(x(1)), unify_nil, get_structure(r/1,3), unify_value(x(2)), get_structure(w/1,1), unify_value(x(0)), proceed, label(58), retry_me_else(60), label(59), get_structure(math_fast_load_value/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(y/1,2), unify_void(1), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(60), retry_me_else(62), label(61), get_structure(unify_variable/1,0), unify_structure(x/1), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(62), retry_me_else(64), label(63), get_structure(unify_value/1,0), unify_structure(x/1), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(r/1,1), unify_value(x(0)), proceed, label(64), retry_me_else(66), label(65), get_structure(unify_local_value/1,0), unify_structure(x/1), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(r/1,1), unify_value(x(0)), proceed, label(66), retry_me_else(68), label(67), get_variable(x(2),1), get_structure(call/1,0), unify_structure((/)/2), unify_void(1), unify_variable(x(1)), put_integer(0,0), execute(lst_r_for_call_execute/3), label(68), retry_me_else(70), label(69), get_variable(x(2),1), get_structure(execute/1,0), unify_structure((/)/2), unify_void(1), unify_variable(x(1)), put_integer(0,0), execute(lst_r_for_call_execute/3), label(70), retry_me_else(72), label(71), get_structure(load_cut_level/1,0), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(w/1,1), unify_value(x(0)), proceed, label(72), retry_me_else(74), label(73), get_structure(cut/1,0), unify_structure(x/1), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_nil, get_structure(r/1,1), unify_value(x(0)), proceed, label(74), retry_me_else(76), label(75), allocate(3), get_variable(y(1),1), get_structure(call_c/3,0), unify_void(1), unify_variable(x(0)), unify_variable(y(0)), put_variable(y(2),1), call('$codif/2_$aux1'/2), put_value(y(0),0), put_unsafe_value(y(2),1), put_value(y(1),2), deallocate, execute(lst_rw_for_c_call/3), label(76), trust_me_else_fail, label(77), get_structure(foreign_call_c/4,0), unify_void(2), unify_variable(x(0)), unify_void(1), put_value(x(1),2), put_nil(1), execute(lst_rw_for_foreign_c_call/3), label(78), trust_me_else_fail, get_nil(1), proceed]). predicate('$codif/2_$aux1'/2,115,static,private,user,[ load_cut_level(2), try_me_else(1), allocate(3), get_variable(y(0),1), get_variable(y(1),2), put_value(x(0),1), put_structure(x/1,0), unify_variable(y(2)), call(member/2), cut(y(1)), put_value(y(0),0), get_list(0), unify_variable(x(0)), unify_nil, get_structure(w/1,0), unify_value(y(2)), deallocate, proceed, label(1), trust_me_else_fail, get_nil(1), proceed]). predicate(lst_r_for_call_execute/3,132,static,private,user,[ try_me_else(1), get_nil(2), get_value(x(1),0), proceed, label(1), trust_me_else_fail, get_list(2), unify_variable(x(3)), unify_variable(x(2)), get_structure(r/1,3), unify_local_value(x(0)), math_fast_load_value(x(0),0), call_c('Fct_Fast_Inc',[fast_call,x(0)],[x(0)]), execute(lst_r_for_call_execute/3)]). predicate(lst_rw_for_foreign_c_call/3,141,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(2),1), proceed, label(3), trust_me_else_fail, label(4), get_variable(x(3),1), get_list(0), unify_variable(x(1)), unify_variable(x(0)), get_list(2), unify_variable(x(4)), unify_variable(x(2)), get_structure(r/1,4), unify_value(x(1)), put_structure(w/1,4), unify_value(x(1)), put_list(1), unify_value(x(4)), unify_local_value(x(3)), execute(lst_rw_for_foreign_c_call/3)]). predicate(lst_rw_for_c_call/3,149,static,private,user,[ load_cut_level(3), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_value(x(2),1), proceed, label(4), retry_me_else(6), label(5), get_variable(x(4),1), get_list(0), unify_variable(x(1)), unify_variable(x(0)), get_structure(x/1,1), unify_variable(x(1)), get_list(2), unify_variable(x(5)), unify_variable(x(2)), get_structure(r/1,5), unify_value(x(1)), cut(x(3)), put_structure(w/1,3), unify_value(x(1)), put_list(1), unify_value(x(3)), unify_local_value(x(4)), execute(lst_rw_for_c_call/3), label(6), trust_me_else_fail, label(7), get_list(0), unify_void(1), unify_variable(x(0)), execute(lst_rw_for_c_call/3)]). ./gprolog-1.3.0/src/Pl2Wam/code_gen.wam0000644004425400513100000021647310547440341016152 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : code_gen.pl % date : 1 5 2007 % time : 13:13:21 file_name('/home/diaz/GP/src/src/Pl2Wam/code_gen.pl'). predicate(code_generation/5,27,static,private,user,[ allocate(3), get_variable(y(0),1), get_variable(y(1),2), put_atom(last_pred,1), put_atom(f,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_value(x(3),2), put_value(y(1),1), put_variable(y(2),3), call(generate_head/5), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(2),2), deallocate, execute(generate_body/3)]). predicate(generate_head/5,35,static,private,user,[ allocate(9), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), get_structure(p/3,0), unify_void(1), unify_variable(x(0)), unify_variable(y(0)), get_structure((/)/2,0), unify_void(1), unify_variable(x(1)), put_integer(0,0), put_variable(y(5),2), call(gen_list_integers/3), put_value(y(0),0), put_value(y(5),1), put_variable(y(6),2), put_variable(y(7),3), call('$generate_head/5_$aux1'/4), put_value(y(6),0), put_value(y(7),1), put_value(y(3),2), put_variable(y(8),3), call(gen_unif_arg_lst/4), put_value(y(1),0), put_value(y(4),1), put_value(y(2),2), put_unsafe_value(y(8),3), deallocate, execute('$generate_head/5_$aux2'/4)]). predicate('$generate_head/5_$aux2'/4,35,static,private,user,[ load_cut_level(4), try_me_else(1), math_fast_load_value(x(0),0), put_integer(1,5), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(0),x(5)]), cut(x(4)), get_list(1), unify_variable(x(0)), unify_local_value(x(3)), get_structure(allocate/1,0), unify_local_value(x(2)), proceed, label(1), trust_me_else_fail, get_value(x(3),1), proceed]). predicate('$generate_head/5_$aux1'/4,35,static,private,user,[ load_cut_level(4), try_me_else(1), put_atom(reorder,5), put_atom(t,6), call_c('Blt_G_Read',[fast_call,boolean],[x(5),x(6)]), cut(x(4)), execute(reorder_head_arg_lst/4), label(1), trust_me_else_fail, get_value(x(0),2), get_value(x(1),3), proceed]). predicate(reorder_head_arg_lst/4,51,static,private,user,[ allocate(12), get_variable(y(0),2), get_variable(y(1),3), put_variable(y(2),2), put_variable(y(3),3), put_variable(y(4),4), put_variable(y(5),5), put_variable(y(6),6), put_variable(y(7),7), call(split_arg_lst/8), put_value(y(6),0), put_variable(y(8),1), call(reverse/2), put_value(y(7),0), put_variable(y(9),1), call(reverse/2), put_value(y(2),0), put_value(y(8),1), put_variable(y(10),2), call(append/3), put_value(y(10),0), put_value(y(4),1), put_value(y(0),2), call(append/3), put_value(y(3),0), put_value(y(9),1), put_variable(y(11),2), call(append/3), put_unsafe_value(y(11),0), put_unsafe_value(y(5),1), put_value(y(1),2), deallocate, execute(append/3)]). predicate(generate_body/3,63,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_list(2), unify_atom(proceed), unify_nil, proceed, label(3), trust_me_else_fail, label(4), allocate(7), get_list(0), unify_variable(x(0)), unify_variable(y(4)), get_structure(p/3,0), unify_variable(y(0)), unify_variable(x(0)), unify_variable(y(3)), get_structure((/)/2,0), unify_variable(y(1)), unify_variable(y(2)), get_variable(y(5),1), get_variable(y(6),2), put_value(y(0),0), put_value(y(5),1), call('$generate_body/3_$aux1'/2), put_value(y(1),0), put_value(y(2),1), put_value(y(3),2), put_value(y(0),3), put_value(y(4),4), put_value(y(5),5), put_value(y(6),6), deallocate, execute(generate_body1/7)]). predicate('$generate_body/3_$aux1'/2,65,static,private,user,[ load_cut_level(2), try_me_else(1), get_value(x(1),0), cut(x(2)), put_atom(last_pred,0), put_atom(t,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, proceed]). predicate(generate_body1/7,73,static,private,user,[ load_cut_level(7), try_me_else(6), switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(fail,3),('$call_c',5)]), label(2), try_me_else(4), label(3), get_atom(fail,0), get_integer(0,1), get_list(6), unify_atom(fail), unify_nil, cut(x(7)), proceed, label(4), trust_me_else_fail, label(5), allocate(10), get_atom('$call_c',0), get_integer(2,1), get_variable(y(1),3), get_variable(y(2),4), get_variable(y(3),5), get_variable(y(4),6), get_list(2), unify_variable(x(0)), unify_list, unify_variable(y(0)), unify_nil, cut(x(7)), put_variable(y(5),1), put_variable(y(6),2), call('$generate_body1/7_$aux1'/3), put_value(y(2),0), put_value(y(0),1), put_variable(y(7),2), call('$generate_body1/7_$aux2'/3), put_value(y(0),0), put_value(y(6),1), put_variable(y(8),2), put_variable(y(9),3), put_value(y(4),4), call(load_c_call_args/5), put_structure(call_c/3,3), unify_local_value(y(5)), unify_local_value(y(7)), unify_local_value(y(8)), put_value(y(2),0), put_value(y(1),1), put_unsafe_value(y(9),2), put_value(y(3),4), deallocate, execute('$generate_body1/7_$aux3'/5), label(6), retry_me_else(7), allocate(9), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), get_variable(y(5),5), get_variable(y(6),6), get_variable(y(7),7), put_value(y(0),0), put_value(y(1),1), call(inline_predicate/2), cut(y(7)), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_variable(y(8),3), put_value(y(6),4), call(gen_inline_pred/5), cut(y(7)), put_value(y(4),0), put_value(y(3),1), put_unsafe_value(y(8),2), put_value(y(5),3), deallocate, execute('$generate_body1/7_$aux4'/4), label(7), trust_me_else_fail, allocate(11), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), get_variable(y(5),5), get_variable(y(6),6), put_integer(0,0), put_value(y(1),1), put_variable(y(7),2), call(gen_list_integers/3), put_value(y(2),0), put_value(y(7),1), put_variable(y(8),2), put_variable(y(9),3), call('$generate_body1/7_$aux5'/4), put_value(y(8),0), put_value(y(9),1), put_variable(y(10),2), put_value(y(6),3), call(gen_load_arg_lst/4), put_value(y(4),0), put_value(y(3),1), put_unsafe_value(y(10),2), put_value(y(0),3), put_value(y(1),4), put_value(y(5),5), deallocate, execute('$generate_body1/7_$aux6'/6)]). predicate('$generate_body1/7_$aux6'/6,110,static,private,user,[ load_cut_level(6), try_me_else(1), get_nil(0), cut(x(6)), put_value(x(1),0), put_value(x(2),1), put_value(x(3),2), put_value(x(4),3), execute('$generate_body1/7_$aux7'/4), label(1), trust_me_else_fail, get_list(2), unify_variable(x(1)), unify_variable(x(2)), get_structure(call/1,1), unify_structure((/)/2), unify_local_value(x(3)), unify_local_value(x(4)), put_value(x(5),1), execute(generate_body/3)]). predicate('$generate_body1/7_$aux7'/4,110,static,private,user,[ load_cut_level(4), try_me_else(1), math_fast_load_value(x(0),0), put_integer(1,5), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(0),x(5)]), cut(x(4)), get_list(1), unify_atom(deallocate), unify_list, unify_variable(x(0)), unify_nil, get_structure(execute/1,0), unify_structure((/)/2), unify_local_value(x(2)), unify_local_value(x(3)), proceed, label(1), trust_me_else_fail, get_list(1), unify_variable(x(0)), unify_nil, get_structure(execute/1,0), unify_structure((/)/2), unify_local_value(x(2)), unify_local_value(x(3)), proceed]). predicate('$generate_body1/7_$aux5'/4,110,static,private,user,[ load_cut_level(4), try_me_else(1), put_atom(reorder,5), put_atom(t,6), call_c('Blt_G_Read',[fast_call,boolean],[x(5),x(6)]), cut(x(4)), execute(reorder_body_arg_lst/4), label(1), trust_me_else_fail, get_value(x(0),2), get_value(x(1),3), proceed]). predicate('$generate_body1/7_$aux4'/4,98,static,private,user,[ load_cut_level(4), try_me_else(1), get_nil(0), cut(x(4)), put_value(x(1),0), put_value(x(2),1), execute('$generate_body1/7_$aux8'/2), label(1), trust_me_else_fail, put_value(x(3),1), execute(generate_body/3)]). predicate('$generate_body1/7_$aux8'/2,98,static,private,user,[ load_cut_level(2), try_me_else(1), math_fast_load_value(x(0),0), put_integer(1,3), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(0),x(3)]), cut(x(2)), get_list(1), unify_atom(deallocate), unify_list, unify_atom(proceed), unify_nil, proceed, label(1), trust_me_else_fail, get_list(1), unify_atom(proceed), unify_nil, proceed]). predicate('$generate_body1/7_$aux3'/5,76,static,private,user,[ load_cut_level(5), try_me_else(1), get_nil(0), cut(x(5)), put_value(x(1),0), put_value(x(2),1), put_value(x(3),2), execute('$generate_body1/7_$aux9'/3), label(1), trust_me_else_fail, get_list(2), unify_local_value(x(3)), unify_variable(x(2)), put_value(x(4),1), execute(generate_body/3)]). predicate('$generate_body1/7_$aux9'/3,76,static,private,user,[ load_cut_level(3), try_me_else(1), math_fast_load_value(x(0),0), put_integer(1,4), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(0),x(4)]), cut(x(3)), get_list(1), unify_atom(deallocate), unify_list, unify_local_value(x(2)), unify_list, unify_atom(proceed), unify_nil, proceed, label(1), trust_me_else_fail, get_list(1), unify_local_value(x(2)), unify_list, unify_atom(proceed), unify_nil, proceed]). predicate('$generate_body1/7_$aux2'/3,76,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(3), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), put_nil(1), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), put_atom(jump,0), put_value(y(0),1), call(memberchk/2), cut(y(2)), put_value(y(1),0), get_list(0), unify_atom(set_cp), unify_local_value(y(0)), deallocate, proceed, label(1), trust_me_else_fail, get_value(x(1),2), proceed]). predicate('$generate_body1/7_$aux1'/3,76,static,private,user,[ switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(atm/1,3),(stc/3,5)]), label(2), try_me_else(4), label(3), get_structure(atm/1,0), unify_local_value(x(1)), get_nil(2), proceed, label(4), trust_me_else_fail, label(5), get_structure(stc/3,0), unify_local_value(x(1)), unify_void(1), unify_local_value(x(2)), proceed]). predicate(reorder_body_arg_lst/4,130,static,private,user,[ allocate(10), get_variable(y(0),2), get_variable(y(1),3), put_variable(y(2),2), put_variable(y(3),3), put_variable(y(4),4), put_variable(y(5),5), put_variable(y(6),6), put_variable(y(7),7), call(split_arg_lst/8), put_value(y(4),0), put_value(y(6),1), put_variable(y(8),2), call(append/3), put_value(y(8),0), put_value(y(2),1), put_value(y(0),2), call(append/3), put_value(y(5),0), put_value(y(7),1), put_variable(y(9),2), call(append/3), put_unsafe_value(y(9),0), put_unsafe_value(y(3),1), put_value(y(1),2), deallocate, execute(append/3)]). predicate(split_arg_lst/8,145,static,private,user,[ load_cut_level(8), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), get_nil(2), get_nil(3), get_nil(4), get_nil(5), get_nil(6), get_nil(7), proceed, label(3), trust_me_else_fail, label(4), allocate(9), get_variable(x(11),7), get_variable(x(7),5), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(1), unify_variable(x(12)), unify_variable(y(1)), get_variable(y(2),8), put_value(x(2),1), put_value(x(4),5), put_value(x(6),9), put_variable(y(3),2), put_variable(y(4),4), put_variable(y(5),6), put_variable(y(6),8), put_variable(y(7),10), put_variable(y(8),13), call('$split_arg_lst/8_$aux1'/14), cut(y(2)), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(3),2), put_unsafe_value(y(4),3), put_unsafe_value(y(5),4), put_unsafe_value(y(6),5), put_unsafe_value(y(7),6), put_unsafe_value(y(8),7), deallocate, execute(split_arg_lst/8)]). predicate('$split_arg_lst/8_$aux1'/14,147,static,private,user,[ try_me_else(1), get_structure(var/2,0), unify_variable(x(14)), unify_void(1), get_structure(x/1,14), unify_variable(x(14)), put_atom(void,15), call_c('Blt_Term_Neq',[fast_call,boolean],[x(14),x(15)]), get_value(x(2),1), get_value(x(4),3), get_value(x(6),5), get_value(x(8),7), get_list(9), unify_local_value(x(0)), unify_local_value(x(10)), get_list(11), unify_local_value(x(12)), unify_local_value(x(13)), proceed, label(1), retry_me_else(2), allocate(14), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), get_variable(y(5),5), get_variable(y(6),6), get_variable(y(7),7), get_variable(y(8),8), get_variable(y(9),9), get_variable(y(10),10), get_variable(y(11),11), get_variable(y(12),12), get_variable(y(13),13), put_value(y(0),0), get_structure(stc/3,0), unify_void(2), unify_variable(x(0)), call(has_temporaries/1), put_value(y(1),0), get_value(y(2),0), put_value(y(3),0), get_value(y(4),0), put_value(y(5),0), get_list(0), unify_local_value(y(0)), unify_local_value(y(6)), put_value(y(7),0), get_list(0), unify_local_value(y(12)), unify_local_value(y(8)), put_value(y(9),0), get_value(y(10),0), put_value(y(11),0), get_value(y(13),0), deallocate, proceed, label(2), trust_me_else_fail, get_list(1), unify_local_value(x(0)), unify_local_value(x(2)), get_list(3), unify_local_value(x(12)), unify_local_value(x(4)), get_value(x(6),5), get_value(x(8),7), get_value(x(10),9), get_value(x(13),11), proceed]). predicate(has_temporaries/1,176,static,private,user,[ load_cut_level(1), allocate(1), get_list(0), unify_variable(x(0)), unify_variable(x(2)), get_variable(y(0),1), put_value(x(2),1), call('$has_temporaries/1_$aux1'/2), cut(y(0)), deallocate, proceed]). predicate('$has_temporaries/1_$aux1'/2,176,static,private,user,[ try_me_else(6), switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(var/2,3),(stc/3,5)]), label(2), try_me_else(4), label(3), get_structure(var/2,0), unify_variable(x(0)), unify_void(1), get_structure(x/1,0), unify_variable(x(0)), put_atom(void,1), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), proceed, label(4), trust_me_else_fail, label(5), get_structure(stc/3,0), unify_void(2), unify_variable(x(0)), execute(has_temporaries/1), label(6), trust_me_else_fail, put_value(x(1),0), execute(has_temporaries/1)]). predicate(gen_unif_arg_lst/4,189,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), get_value(x(3),2), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_variable(y(2),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(1), unify_variable(x(1)), unify_variable(y(1)), put_variable(y(3),2), call(gen_unif_arg/4), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_unsafe_value(y(3),3), deallocate, execute(gen_unif_arg_lst/4)]). predicate(gen_unif_arg/4,200,static,private,user,[ switch_on_term(2,11,fail,fail,1), label(1), switch_on_structure([(var/2,3),(atm/1,5),(int/1,7),(flt/1,9),(stc/3,13)]), label(2), try_me_else(4), label(3), get_variable(x(5),3), get_variable(x(3),2), get_variable(x(4),1), get_structure(var/2,0), unify_variable(x(1)), unify_variable(x(0)), put_value(x(5),2), execute('$gen_unif_arg/4_$aux1'/5), label(4), retry_me_else(6), label(5), get_structure(atm/1,0), unify_variable(x(0)), get_list(3), unify_variable(x(3)), unify_local_value(x(2)), get_structure(get_atom/2,3), unify_value(x(0)), unify_local_value(x(1)), proceed, label(6), retry_me_else(8), label(7), get_structure(int/1,0), unify_variable(x(0)), get_list(3), unify_variable(x(3)), unify_local_value(x(2)), get_structure(get_integer/2,3), unify_value(x(0)), unify_local_value(x(1)), proceed, label(8), retry_me_else(10), label(9), get_structure(flt/1,0), unify_variable(x(0)), get_list(3), unify_variable(x(3)), unify_local_value(x(2)), get_structure(get_float/2,3), unify_value(x(0)), unify_local_value(x(1)), proceed, label(10), retry_me_else(12), label(11), get_atom(nil,0), get_list(3), unify_variable(x(0)), unify_local_value(x(2)), get_structure(get_nil/1,0), unify_local_value(x(1)), proceed, label(12), trust_me_else_fail, label(13), allocate(7), get_variable(y(1),2), get_variable(x(4),1), get_structure(stc/3,0), unify_variable(x(0)), unify_variable(x(1)), unify_variable(y(0)), get_list(3), unify_variable(x(2)), unify_variable(y(2)), put_value(x(4),3), call('$gen_unif_arg/4_$aux2'/4), put_value(y(0),0), put_atom(head,1), put_variable(y(3),2), put_variable(y(4),3), put_variable(y(5),4), call(flat_stc_arg_lst/5), put_value(y(3),0), put_variable(y(6),1), put_value(y(2),2), call(gen_subterm_arg_lst/3), put_unsafe_value(y(4),0), put_unsafe_value(y(5),1), put_value(y(1),2), put_unsafe_value(y(6),3), deallocate, execute(gen_unif_arg_lst/4)]). predicate('$gen_unif_arg/4_$aux2'/4,218,static,private,user,[ load_cut_level(4), try_me_else(1), get_atom('.',0), get_integer(2,1), cut(x(4)), get_structure(get_list/1,2), unify_local_value(x(3)), proceed, label(1), trust_me_else_fail, get_structure(get_structure/2,2), unify_variable(x(2)), unify_local_value(x(3)), get_structure((/)/2,2), unify_local_value(x(0)), unify_local_value(x(1)), proceed]). predicate('$gen_unif_arg/4_$aux1'/5,200,static,private,user,[ load_cut_level(5), try_me_else(1), get_variable(x(6),3), get_variable(x(3),0), call_c('Blt_Var',[fast_call,boolean],[x(3)]), cut(x(5)), put_value(x(1),0), put_value(x(2),1), put_value(x(6),2), execute('$gen_unif_arg/4_$aux3'/5), label(1), trust_me_else_fail, get_list(2), unify_variable(x(0)), unify_local_value(x(3)), get_structure(get_value/2,0), unify_local_value(x(1)), unify_local_value(x(4)), proceed]). predicate('$gen_unif_arg/4_$aux3'/5,200,static,private,user,[ load_cut_level(5), try_me_else(1), put_structure(x/1,3), unify_atom(void), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(3)]), cut(x(5)), get_value(x(2),1), proceed, label(1), trust_me_else_fail, get_atom(not_in_cur_env,3), get_list(1), unify_variable(x(1)), unify_local_value(x(2)), get_structure(get_variable/2,1), unify_local_value(x(0)), unify_local_value(x(4)), proceed]). predicate(gen_load_arg_lst/4,233,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), get_value(x(3),2), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_variable(y(2),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(1), unify_variable(x(1)), unify_variable(y(1)), put_variable(y(3),2), call(gen_load_arg/4), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_unsafe_value(y(3),3), deallocate, execute(gen_load_arg_lst/4)]). predicate(gen_load_arg/4,244,static,private,user,[ switch_on_term(2,11,fail,fail,1), label(1), switch_on_structure([(var/2,3),(atm/1,5),(int/1,7),(flt/1,9),(stc/3,13)]), label(2), try_me_else(4), label(3), get_variable(x(5),2), get_variable(x(4),1), get_structure(var/2,0), unify_variable(x(1)), unify_variable(x(0)), get_list(3), unify_variable(x(2)), unify_local_value(x(5)), put_value(x(4),3), execute('$gen_load_arg/4_$aux1'/4), label(4), retry_me_else(6), label(5), get_structure(atm/1,0), unify_variable(x(0)), get_list(3), unify_variable(x(3)), unify_local_value(x(2)), get_structure(put_atom/2,3), unify_value(x(0)), unify_local_value(x(1)), proceed, label(6), retry_me_else(8), label(7), get_structure(int/1,0), unify_variable(x(0)), get_list(3), unify_variable(x(3)), unify_local_value(x(2)), get_structure(put_integer/2,3), unify_value(x(0)), unify_local_value(x(1)), proceed, label(8), retry_me_else(10), label(9), get_structure(flt/1,0), unify_variable(x(0)), get_list(3), unify_variable(x(3)), unify_local_value(x(2)), get_structure(put_float/2,3), unify_value(x(0)), unify_local_value(x(1)), proceed, label(10), retry_me_else(12), label(11), get_atom(nil,0), get_list(3), unify_variable(x(0)), unify_local_value(x(2)), get_structure(put_nil/1,0), unify_local_value(x(1)), proceed, label(12), trust_me_else_fail, label(13), allocate(8), get_variable(y(1),2), get_variable(y(2),3), get_variable(x(3),1), get_structure(stc/3,0), unify_variable(x(0)), unify_variable(x(1)), unify_variable(y(0)), put_variable(y(3),2), call('$gen_load_arg/4_$aux2'/4), put_value(y(0),0), put_atom(body,1), put_variable(y(4),2), put_variable(y(5),3), put_variable(y(6),4), call(flat_stc_arg_lst/5), put_value(y(5),0), put_value(y(6),1), put_list(2), unify_local_value(y(3)), unify_variable(y(7)), put_value(y(2),3), call(gen_load_arg_lst/4), put_unsafe_value(y(4),0), put_value(y(1),1), put_value(y(7),2), deallocate, execute(gen_subterm_arg_lst/3)]). predicate('$gen_load_arg/4_$aux2'/4,268,static,private,user,[ load_cut_level(4), try_me_else(1), get_atom('.',0), get_integer(2,1), cut(x(4)), get_structure(put_list/1,2), unify_local_value(x(3)), proceed, label(1), trust_me_else_fail, get_structure(put_structure/2,2), unify_variable(x(2)), unify_local_value(x(3)), get_structure((/)/2,2), unify_local_value(x(0)), unify_local_value(x(1)), proceed]). predicate('$gen_load_arg/4_$aux1'/4,244,static,private,user,[ load_cut_level(4), try_me_else(1), get_variable(x(5),3), get_variable(x(3),0), call_c('Blt_Var',[fast_call,boolean],[x(3)]), cut(x(4)), put_value(x(1),0), put_value(x(2),1), put_value(x(5),2), execute('$gen_load_arg/4_$aux3'/4), label(1), retry_me_else(2), get_atom(unsafe,0), put_atom(last_pred,0), put_atom(t,5), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(5)]), cut(x(4)), get_structure(put_unsafe_value/2,2), unify_local_value(x(1)), unify_local_value(x(3)), proceed, label(2), trust_me_else_fail, get_structure(put_value/2,2), unify_local_value(x(1)), unify_local_value(x(3)), proceed]). predicate('$gen_load_arg/4_$aux3'/4,244,static,private,user,[ load_cut_level(4), try_me_else(1), put_structure(x/1,3), unify_atom(void), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(3)]), cut(x(4)), get_structure(put_void/1,1), unify_local_value(x(2)), proceed, label(1), trust_me_else_fail, allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_value(x(3),1), put_value(y(0),0), call('$gen_load_arg/4_$aux4'/2), put_value(y(1),0), get_structure(put_variable/2,0), unify_local_value(y(0)), unify_local_value(y(2)), deallocate, proceed]). predicate('$gen_load_arg/4_$aux4'/2,244,static,private,user,[ load_cut_level(2), try_me_else(1), get_structure(x/1,0), unify_void(1), cut(x(2)), get_atom(in_heap,1), proceed, label(1), trust_me_else_fail, get_atom(unsafe,1), proceed]). predicate(flat_stc_arg_lst/5,283,static,private,user,[ load_cut_level(5), switch_on_term(2,3,fail,1,fail), label(1), try(5), retry(7), trust(9), label(2), try_me_else(4), label(3), get_nil(0), get_nil(2), get_nil(3), get_nil(4), proceed, label(4), retry_me_else(6), label(5), allocate(6), get_variable(y(1),1), get_variable(y(3),3), get_variable(y(4),4), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(2), unify_value(x(0)), unify_variable(y(2)), get_variable(y(5),5), call(simple_stc_arg/1), cut(y(5)), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), put_value(y(4),4), deallocate, execute(flat_stc_arg_lst/5), label(6), retry_me_else(8), label(7), get_list(0), unify_variable(x(7)), unify_nil, get_list(2), unify_variable(x(0)), unify_nil, get_structure(stc/3,0), unify_variable(x(6)), unify_variable(x(0)), unify_variable(x(2)), put_atom(opt_last_subterm,8), put_atom(t,9), call_c('Blt_G_Read',[fast_call,boolean],[x(8),x(9)]), get_structure(stc/3,7), unify_value(x(6)), unify_value(x(0)), unify_variable(x(0)), cut(x(5)), execute(flat_stc_arg_lst/5), label(8), trust_me_else_fail, label(9), allocate(5), get_variable(y(1),1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(2), unify_variable(x(1)), unify_variable(y(2)), get_list(3), unify_value(x(0)), unify_variable(y(3)), get_list(4), unify_variable(x(2)), unify_variable(y(4)), put_value(y(1),0), call('$flat_stc_arg_lst/5_$aux1'/3), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), put_value(y(4),4), deallocate, execute(flat_stc_arg_lst/5)]). predicate('$flat_stc_arg_lst/5_$aux1'/3,294,static,private,user,[ load_cut_level(3), try_me_else(1), get_atom(head,0), cut(x(3)), get_structure(var/2,1), unify_variable(x(0)), unify_void(1), get_structure(x/1,0), unify_local_value(x(2)), proceed, label(1), trust_me_else_fail, get_structure(var/2,1), unify_variable(x(0)), unify_atom(in_heap), get_structure(x/1,0), unify_local_value(x(2)), proceed]). predicate(simple_stc_arg/1,303,static,private,user,[ switch_on_term(2,9,fail,fail,1), label(1), switch_on_structure([(var/2,3),(atm/1,5),(int/1,7)]), label(2), try_me_else(4), label(3), get_structure(var/2,0), unify_void(2), proceed, label(4), retry_me_else(6), label(5), get_structure(atm/1,0), unify_void(1), proceed, label(6), retry_me_else(8), label(7), get_structure(int/1,0), unify_void(1), proceed, label(8), trust_me_else_fail, label(9), get_atom(nil,0), proceed]). predicate(gen_subterm_arg_lst/3,316,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(2),1), proceed, label(3), trust_me_else_fail, label(4), allocate(6), get_list(0), unify_variable(y(0)), unify_variable(y(1)), get_variable(y(2),1), get_variable(y(3),2), put_list(0), unify_value(y(0)), unify_value(y(1)), put_integer(0,1), put_variable(y(4),2), put_variable(y(5),3), call(gen_compte_void/4), put_unsafe_value(y(4),0), put_value(y(0),1), put_value(y(3),2), put_value(y(1),3), put_value(y(2),4), put_unsafe_value(y(5),5), deallocate, execute('$gen_subterm_arg_lst/3_$aux1'/6)]). predicate('$gen_subterm_arg_lst/3_$aux1'/6,318,static,private,user,[ load_cut_level(6), try_me_else(1), allocate(3), get_variable(y(0),3), get_variable(y(1),4), get_integer(0,0), cut(x(6)), put_value(x(1),0), put_variable(y(2),1), call(gen_subterm_arg/3), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(2),2), deallocate, execute(gen_subterm_arg_lst/3), label(1), trust_me_else_fail, get_list(2), unify_variable(x(1)), unify_variable(x(2)), get_structure(unify_void/1,1), unify_local_value(x(0)), put_value(x(5),0), put_value(x(4),1), execute(gen_subterm_arg_lst/3)]). predicate(gen_compte_void/4,330,static,private,user,[ load_cut_level(4), try_me_else(1), get_list(0), unify_variable(x(5)), unify_variable(x(0)), get_structure(var/2,5), unify_variable(x(5)), unify_void(1), get_structure(x/1,5), unify_variable(x(5)), put_atom(void,6), call_c('Blt_Term_Eq',[fast_call,boolean],[x(5),x(6)]), cut(x(4)), math_fast_load_value(x(1),1), call_c('Fct_Fast_Inc',[fast_call,x(1)],[x(1)]), execute(gen_compte_void/4), label(1), trust_me_else_fail, get_value(x(2),1), get_value(x(3),0), proceed]). predicate(gen_subterm_arg/3,340,static,private,user,[ switch_on_term(2,9,fail,fail,1), label(1), switch_on_structure([(var/2,3),(atm/1,5),(int/1,7),(stc/3,11)]), label(2), try_me_else(4), label(3), get_variable(x(4),1), get_structure(var/2,0), unify_variable(x(3)), unify_variable(x(0)), get_list(2), unify_variable(x(1)), unify_local_value(x(4)), put_value(x(3),2), execute('$gen_subterm_arg/3_$aux1'/3), label(4), retry_me_else(6), label(5), get_structure(atm/1,0), unify_variable(x(0)), get_list(2), unify_variable(x(2)), unify_local_value(x(1)), get_structure(unify_atom/1,2), unify_value(x(0)), proceed, label(6), retry_me_else(8), label(7), get_structure(int/1,0), unify_variable(x(0)), get_list(2), unify_variable(x(2)), unify_local_value(x(1)), get_structure(unify_integer/1,2), unify_value(x(0)), proceed, label(8), retry_me_else(10), label(9), get_atom(nil,0), get_list(2), unify_atom(unify_nil), unify_local_value(x(1)), proceed, label(10), trust_me_else_fail, label(11), allocate(3), get_variable(y(1),1), get_structure(stc/3,0), unify_variable(x(0)), unify_variable(x(1)), unify_variable(y(0)), get_list(2), unify_variable(x(2)), unify_variable(y(2)), call('$gen_subterm_arg/3_$aux2'/3), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute(gen_subterm_arg_lst/3)]). predicate('$gen_subterm_arg/3_$aux2'/3,355,static,private,user,[ load_cut_level(3), try_me_else(1), get_atom('.',0), get_integer(2,1), cut(x(3)), get_atom(unify_list,2), proceed, label(1), trust_me_else_fail, get_structure(unify_structure/1,2), unify_structure((/)/2), unify_local_value(x(0)), unify_local_value(x(1)), proceed]). predicate('$gen_subterm_arg/3_$aux1'/3,340,static,private,user,[ load_cut_level(3), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(3)), get_atom(in_heap,0), get_structure(unify_variable/1,1), unify_local_value(x(2)), proceed, label(1), retry_me_else(2), get_atom(in_heap,0), cut(x(3)), get_structure(unify_value/1,1), unify_local_value(x(2)), proceed, label(2), trust_me_else_fail, get_structure(unify_local_value/1,1), unify_local_value(x(2)), proceed]). predicate(gen_list_integers/3,366,static,private,user,[ execute('$gen_list_integers/3_$aux1'/3)]). predicate('$gen_list_integers/3_$aux1'/3,366,static,private,user,[ load_cut_level(3), try_me_else(1), math_fast_load_value(x(0),4), math_fast_load_value(x(1),5), call_c('Blt_Fast_Lt',[fast_call,boolean],[x(4),x(5)]), cut(x(3)), get_list(2), unify_local_value(x(0)), unify_variable(x(2)), math_fast_load_value(x(0),0), call_c('Fct_Fast_Inc',[fast_call,x(0)],[x(0)]), execute(gen_list_integers/3), label(1), trust_me_else_fail, get_nil(2), proceed]). predicate(special_form/2,379,static,private,user,[ get_structure(put_variable/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(x/1,2), unify_value(x(0)), get_structure(put_void/1,1), unify_value(x(0)), proceed]). predicate(dummy_instruction/2,384,static,private,user,[ switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(get_variable/2,3),(put_value/2,5)]), label(2), try_me_else(4), label(3), get_atom(f,1), get_structure(get_variable/2,0), unify_variable(x(1)), unify_variable(x(0)), get_structure(x/1,1), unify_value(x(0)), proceed, label(4), trust_me_else_fail, label(5), get_atom(f,1), get_structure(put_value/2,0), unify_variable(x(1)), unify_variable(x(0)), get_structure(x/1,1), unify_value(x(0)), proceed]). predicate(equal/4,420,static,private,user,[ try_me_else(1), get_value(x(3),2), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(1)]), proceed, label(1), retry_me_else(8), switch_on_term(4,fail,fail,fail,2), label(2), switch_on_structure([(var/2,3)]), label(3), try(5), trust(7), label(4), try_me_else(6), label(5), get_value(x(3),2), get_structure(var/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(var/2,1), unify_value(x(2)), unify_value(x(0)), call_c('Blt_Var',[fast_call,boolean],[x(0)]), proceed, label(6), trust_me_else_fail, label(7), get_variable(x(5),3), get_variable(x(4),1), get_structure(var/2,0), unify_variable(x(0)), unify_variable(x(3)), put_value(x(2),1), put_value(x(5),2), execute('$equal/4_$aux1'/5), label(8), retry_me_else(9), get_variable(x(5),3), get_variable(x(4),0), get_structure(var/2,1), unify_variable(x(0)), unify_variable(x(3)), put_value(x(2),1), put_value(x(5),2), execute('$equal/4_$aux2'/5), label(9), retry_me_else(10), get_variable(x(4),3), get_variable(x(3),2), get_variable(x(2),0), get_structure(var/2,1), unify_variable(x(1)), unify_variable(x(0)), get_structure(x/1,1), unify_variable(x(1)), execute(inline_unif_reg_term/5), label(10), retry_me_else(11), get_structure(stc/3,0), unify_variable(x(5)), unify_variable(x(4)), unify_variable(x(0)), get_structure(stc/3,1), unify_value(x(5)), unify_value(x(4)), unify_variable(x(1)), execute(equal_lst/4), label(11), trust_me_else_fail, get_list(3), unify_atom(fail), unify_local_value(x(2)), put_atom('explicit unification will fail',0), put_nil(1), execute(warn/2)]). predicate('$equal/4_$aux2'/5,436,static,private,user,[ load_cut_level(5), try_me_else(1), get_structure(x/1,0), unify_variable(x(0)), cut(x(5)), execute('$equal/4_$aux3'/5), label(1), trust_me_else_fail, allocate(4), get_variable(y(0),1), get_variable(y(1),4), get_variable(x(1),0), put_structure(var/2,0), unify_local_value(x(1)), unify_local_value(x(3)), put_value(x(2),3), put_variable(y(2),1), put_variable(y(3),2), call(gen_load_arg/4), put_value(y(1),0), put_unsafe_value(y(2),1), put_value(y(0),2), put_unsafe_value(y(3),3), deallocate, execute(gen_unif_arg/4)]). predicate('$equal/4_$aux3'/5,436,static,private,user,[ load_cut_level(5), try_me_else(1), put_atom(void,3), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(3)]), cut(x(5)), get_value(x(2),1), proceed, label(1), trust_me_else_fail, get_variable(x(5),4), get_variable(x(6),3), get_variable(x(4),2), get_variable(x(3),1), get_variable(x(1),0), put_value(x(6),0), put_value(x(5),2), execute(inline_unif_reg_term/5)]). predicate('$equal/4_$aux1'/5,426,static,private,user,[ load_cut_level(5), try_me_else(1), get_structure(x/1,0), unify_variable(x(0)), cut(x(5)), execute('$equal/4_$aux4'/5), label(1), trust_me_else_fail, allocate(4), get_variable(y(0),1), get_variable(y(1),4), get_variable(x(1),0), put_structure(var/2,0), unify_local_value(x(1)), unify_local_value(x(3)), put_value(x(2),3), put_variable(y(2),1), put_variable(y(3),2), call(gen_load_arg/4), put_value(y(1),0), put_unsafe_value(y(2),1), put_value(y(0),2), put_unsafe_value(y(3),3), deallocate, execute(gen_unif_arg/4)]). predicate('$equal/4_$aux4'/5,426,static,private,user,[ load_cut_level(5), try_me_else(1), put_atom(void,3), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(3)]), cut(x(5)), get_value(x(2),1), proceed, label(1), trust_me_else_fail, get_variable(x(5),4), get_variable(x(6),3), get_variable(x(4),2), get_variable(x(3),1), get_variable(x(1),0), put_value(x(6),0), put_value(x(5),2), execute(inline_unif_reg_term/5)]). predicate(equal_lst/4,458,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), get_value(x(3),2), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_variable(y(2),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(1), unify_variable(x(1)), unify_variable(y(1)), put_variable(y(3),2), call(equal/4), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_unsafe_value(y(3),3), deallocate, execute(equal_lst/4)]). predicate(inline_unif_reg_term/5,467,static,private,user,[ get_variable(x(5),2), get_variable(x(2),1), put_value(x(5),1), execute('$inline_unif_reg_term/5_$aux1'/5)]). predicate('$inline_unif_reg_term/5_$aux1'/5,467,static,private,user,[ load_cut_level(5), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(5)), get_atom(in_heap,0), put_value(x(1),0), put_value(x(2),1), put_value(x(3),2), put_value(x(4),3), execute(gen_load_arg/4), label(1), trust_me_else_fail, put_value(x(1),0), put_value(x(2),1), put_value(x(3),2), put_value(x(4),3), execute(gen_unif_arg/4)]). predicate(load_math_expr/4,495,static,private,user,[ try_me_else(10), switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(var/2,3),(int/1,5),(flt/1,7),(stc/3,9)]), label(2), try_me_else(4), label(3), allocate(4), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_structure(var/2,0), unify_variable(y(0)), unify_variable(x(0)), call('$load_math_expr/4_$aux1'/1), put_value(y(3),0), put_value(y(0),1), put_value(y(1),2), put_value(y(2),3), deallocate, execute('$load_math_expr/4_$aux2'/4), label(4), retry_me_else(6), label(5), get_structure(int/1,0), unify_variable(x(4)), put_structure(int/1,0), unify_value(x(4)), execute(gen_load_arg/4), label(6), retry_me_else(8), label(7), get_structure(flt/1,0), unify_variable(x(4)), put_structure(flt/1,0), unify_value(x(4)), execute(gen_load_arg/4), label(8), trust_me_else_fail, label(9), get_variable(x(5),3), get_variable(x(4),2), get_variable(x(3),1), get_structure(stc/3,0), unify_variable(x(0)), unify_variable(x(1)), unify_variable(x(2)), execute(load_math_expr1/6), label(10), trust_me_else_fail, put_list(1), unify_local_value(x(0)), unify_nil, put_atom('unknown expression in arithmetic expression (~q)',0), execute(error/2)]). predicate('$load_math_expr/4_$aux2'/4,495,static,private,user,[ load_cut_level(4), try_me_else(1), put_atom(fast_math,5), put_atom(t,6), call_c('Blt_G_Read',[fast_call,boolean],[x(5),x(6)]), cut(x(4)), get_list(0), unify_variable(x(0)), unify_local_value(x(3)), get_structure(math_fast_load_value/2,0), unify_local_value(x(1)), unify_local_value(x(2)), proceed, label(1), trust_me_else_fail, get_list(0), unify_variable(x(0)), unify_local_value(x(3)), get_structure(math_load_value/2,0), unify_local_value(x(1)), unify_local_value(x(2)), proceed]). predicate('$load_math_expr/4_$aux1'/1,495,static,private,user,[ load_cut_level(1), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(1)), put_atom('unbound variable in arithmetic expression',0), put_nil(1), execute(error/2), label(1), trust_me_else_fail, proceed]). predicate(load_math_expr1/6,518,static,private,user,[ try_me_else(11), switch_on_term(3,1,fail,fail,fail), label(1), switch_on_atom([('.',4),((+),2),((-),10)]), label(2), try(6), trust(8), label(3), try_me_else(5), label(4), get_atom('.',0), get_integer(2,1), get_list(2), unify_variable(x(0)), unify_list, unify_atom(nil), unify_nil, put_value(x(3),1), put_value(x(4),2), put_value(x(5),3), execute(load_math_expr/4), label(5), retry_me_else(7), label(6), get_atom(+,0), get_integer(1,1), get_list(2), unify_variable(x(0)), unify_nil, put_value(x(3),1), put_value(x(4),2), put_value(x(5),3), execute(load_math_expr/4), label(7), retry_me_else(9), label(8), get_atom(+,0), get_integer(2,1), get_list(2), unify_variable(x(0)), unify_list, unify_variable(x(1)), unify_nil, get_structure(int/1,1), unify_integer(1), put_list(2), unify_value(x(0)), unify_nil, put_atom(inc,0), put_integer(1,1), execute(load_math_expr1/6), label(9), trust_me_else_fail, label(10), get_atom(-,0), get_integer(2,1), get_list(2), unify_variable(x(0)), unify_list, unify_variable(x(1)), unify_nil, get_structure(int/1,1), unify_integer(1), put_list(2), unify_value(x(0)), unify_nil, put_atom(dec,0), put_integer(1,1), execute(load_math_expr1/6), label(11), retry_me_else(12), allocate(7), get_variable(y(0),2), get_variable(y(1),3), get_variable(y(2),4), get_variable(y(3),5), put_variable(y(4),2), call('$load_math_expr1/6_$aux1'/3), put_value(y(0),0), put_variable(y(5),1), put_variable(y(6),2), put_value(y(3),3), call(load_math_arg_lst/4), put_unsafe_value(y(6),0), get_list(0), unify_variable(x(0)), unify_local_value(y(2)), get_structure(call_c/3,0), unify_local_value(y(4)), unify_variable(x(0)), unify_local_value(y(5)), get_list(0), unify_atom(fast_call), unify_list, unify_variable(x(0)), unify_nil, get_structure(x/1,0), unify_local_value(y(1)), deallocate, proceed, label(12), retry_me_else(13), allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_value(y(0),0), put_value(y(1),1), put_void(2), call(math_exp_functor_name/3), put_atom('arithmetic operation not allowed in fast math (~q)',0), put_structure((/)/2,2), unify_local_value(y(0)), unify_local_value(y(1)), put_list(1), unify_value(x(2)), unify_nil, deallocate, execute(error/2), label(13), trust_me_else_fail, put_structure((/)/2,2), unify_local_value(x(0)), unify_local_value(x(1)), put_list(1), unify_value(x(2)), unify_nil, put_atom('unknown operation in arithmetic expression (~q)',0), execute(error/2)]). predicate('$load_math_expr1/6_$aux1'/3,530,static,private,user,[ load_cut_level(3), try_me_else(1), put_atom(fast_math,4), put_atom(t,5), call_c('Blt_G_Read',[fast_call,boolean],[x(4),x(5)]), cut(x(3)), execute(fast_exp_functor_name/3), label(1), trust_me_else_fail, execute(math_exp_functor_name/3)]). predicate(load_math_arg_lst/4,548,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), get_value(x(3),2), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_variable(y(2),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(1), unify_variable(x(1)), unify_variable(y(1)), get_structure(x/1,1), unify_variable(x(1)), put_variable(y(3),2), call(load_math_expr/4), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_unsafe_value(y(3),3), deallocate, execute(load_math_arg_lst/4)]). predicate(fast_exp_functor_name/3,557,static,private,user,[ switch_on_term(3,1,fail,fail,fail), label(1), switch_on_atom([((-),2),(inc,6),(dec,8),((+),10),((*),14),((//),16),((rem),18),((mod),20),((/\),22),((\/),24),((^),26),((\),28),((<<),30),((>>),32),(abs,34),(sign,36)]), label(2), try(4), trust(12), label(3), try_me_else(5), label(4), get_atom(-,0), get_integer(1,1), get_atom('Fct_Fast_Neg',2), proceed, label(5), retry_me_else(7), label(6), get_atom(inc,0), get_integer(1,1), get_atom('Fct_Fast_Inc',2), proceed, label(7), retry_me_else(9), label(8), get_atom(dec,0), get_integer(1,1), get_atom('Fct_Fast_Dec',2), proceed, label(9), retry_me_else(11), label(10), get_atom(+,0), get_integer(2,1), get_atom('Fct_Fast_Add',2), proceed, label(11), retry_me_else(13), label(12), get_atom(-,0), get_integer(2,1), get_atom('Fct_Fast_Sub',2), proceed, label(13), retry_me_else(15), label(14), get_atom(*,0), get_integer(2,1), get_atom('Fct_Fast_Mul',2), proceed, label(15), retry_me_else(17), label(16), get_atom(//,0), get_integer(2,1), get_atom('Fct_Fast_Div',2), proceed, label(17), retry_me_else(19), label(18), get_atom(rem,0), get_integer(2,1), get_atom('Fct_Fast_Rem',2), proceed, label(19), retry_me_else(21), label(20), get_atom(mod,0), get_integer(2,1), get_atom('Fct_Fast_Mod',2), proceed, label(21), retry_me_else(23), label(22), get_atom(/\,0), get_integer(2,1), get_atom('Fct_Fast_And',2), proceed, label(23), retry_me_else(25), label(24), get_atom(\/,0), get_integer(2,1), get_atom('Fct_Fast_Or',2), proceed, label(25), retry_me_else(27), label(26), get_atom(^,0), get_integer(2,1), get_atom('Fct_Fast_Xor',2), proceed, label(27), retry_me_else(29), label(28), get_atom(\,0), get_integer(1,1), get_atom('Fct_Fast_Not',2), proceed, label(29), retry_me_else(31), label(30), get_atom(<<,0), get_integer(2,1), get_atom('Fct_Fast_Shl',2), proceed, label(31), retry_me_else(33), label(32), get_atom(>>,0), get_integer(2,1), get_atom('Fct_Fast_Shr',2), proceed, label(33), retry_me_else(35), label(34), get_atom(abs,0), get_integer(1,1), get_atom('Fct_Fast_Abs',2), proceed, label(35), trust_me_else_fail, label(36), get_atom(sign,0), get_integer(1,1), get_atom('Fct_Fast_Sign',2), proceed]). predicate(math_exp_functor_name/3,578,static,private,user,[ switch_on_term(3,1,fail,fail,fail), label(1), switch_on_atom([((-),2), (inc,6), (dec,8), ((+),10), ((*),14), ((//),16), ((/),18), ((rem),20), ((mod),22), ((/\),24), ((\/),26), ((^),28), ((\),30), ((<<),32), ((>>),34), (abs,36), (sign,38), (min,40), (max,42), ((**),44), (sqrt,46), (atan,48), (cos,50), (acos,52), (sin,54), (asin,56), (exp,58), (log,60), (float,62), (ceiling,64), (floor,66), (round,68), (truncate,70), (float_fractional_part,72), (float_integer_part,74)]), label(2), try(4), trust(12), label(3), try_me_else(5), label(4), get_atom(-,0), get_integer(1,1), get_atom('Fct_Neg',2), proceed, label(5), retry_me_else(7), label(6), get_atom(inc,0), get_integer(1,1), get_atom('Fct_Inc',2), proceed, label(7), retry_me_else(9), label(8), get_atom(dec,0), get_integer(1,1), get_atom('Fct_Dec',2), proceed, label(9), retry_me_else(11), label(10), get_atom(+,0), get_integer(2,1), get_atom('Fct_Add',2), proceed, label(11), retry_me_else(13), label(12), get_atom(-,0), get_integer(2,1), get_atom('Fct_Sub',2), proceed, label(13), retry_me_else(15), label(14), get_atom(*,0), get_integer(2,1), get_atom('Fct_Mul',2), proceed, label(15), retry_me_else(17), label(16), get_atom(//,0), get_integer(2,1), get_atom('Fct_Div',2), proceed, label(17), retry_me_else(19), label(18), get_atom(/,0), get_integer(2,1), get_atom('Fct_Float_Div',2), proceed, label(19), retry_me_else(21), label(20), get_atom(rem,0), get_integer(2,1), get_atom('Fct_Rem',2), proceed, label(21), retry_me_else(23), label(22), get_atom(mod,0), get_integer(2,1), get_atom('Fct_Mod',2), proceed, label(23), retry_me_else(25), label(24), get_atom(/\,0), get_integer(2,1), get_atom('Fct_And',2), proceed, label(25), retry_me_else(27), label(26), get_atom(\/,0), get_integer(2,1), get_atom('Fct_Or',2), proceed, label(27), retry_me_else(29), label(28), get_atom(^,0), get_integer(2,1), get_atom('Fct_Xor',2), proceed, label(29), retry_me_else(31), label(30), get_atom(\,0), get_integer(1,1), get_atom('Fct_Not',2), proceed, label(31), retry_me_else(33), label(32), get_atom(<<,0), get_integer(2,1), get_atom('Fct_Shl',2), proceed, label(33), retry_me_else(35), label(34), get_atom(>>,0), get_integer(2,1), get_atom('Fct_Shr',2), proceed, label(35), retry_me_else(37), label(36), get_atom(abs,0), get_integer(1,1), get_atom('Fct_Abs',2), proceed, label(37), retry_me_else(39), label(38), get_atom(sign,0), get_integer(1,1), get_atom('Fct_Sign',2), proceed, label(39), retry_me_else(41), label(40), get_atom(min,0), get_integer(2,1), get_atom('Fct_Min',2), proceed, label(41), retry_me_else(43), label(42), get_atom(max,0), get_integer(2,1), get_atom('Fct_Max',2), proceed, label(43), retry_me_else(45), label(44), get_atom(**,0), get_integer(2,1), get_atom('Fct_Pow',2), proceed, label(45), retry_me_else(47), label(46), get_atom(sqrt,0), get_integer(1,1), get_atom('Fct_Sqrt',2), proceed, label(47), retry_me_else(49), label(48), get_atom(atan,0), get_integer(1,1), get_atom('Fct_Atan',2), proceed, label(49), retry_me_else(51), label(50), get_atom(cos,0), get_integer(1,1), get_atom('Fct_Cos',2), proceed, label(51), retry_me_else(53), label(52), get_atom(acos,0), get_integer(1,1), get_atom('Fct_Acos',2), proceed, label(53), retry_me_else(55), label(54), get_atom(sin,0), get_integer(1,1), get_atom('Fct_Sin',2), proceed, label(55), retry_me_else(57), label(56), get_atom(asin,0), get_integer(1,1), get_atom('Fct_Asin',2), proceed, label(57), retry_me_else(59), label(58), get_atom(exp,0), get_integer(1,1), get_atom('Fct_Exp',2), proceed, label(59), retry_me_else(61), label(60), get_atom(log,0), get_integer(1,1), get_atom('Fct_Log',2), proceed, label(61), retry_me_else(63), label(62), get_atom(float,0), get_integer(1,1), get_atom('Fct_Float',2), proceed, label(63), retry_me_else(65), label(64), get_atom(ceiling,0), get_integer(1,1), get_atom('Fct_Ceiling',2), proceed, label(65), retry_me_else(67), label(66), get_atom(floor,0), get_integer(1,1), get_atom('Fct_Floor',2), proceed, label(67), retry_me_else(69), label(68), get_atom(round,0), get_integer(1,1), get_atom('Fct_Round',2), proceed, label(69), retry_me_else(71), label(70), get_atom(truncate,0), get_integer(1,1), get_atom('Fct_Truncate',2), proceed, label(71), retry_me_else(73), label(72), get_atom(float_fractional_part,0), get_integer(1,1), get_atom('Fct_Float_Fract_Part',2), proceed, label(73), trust_me_else_fail, label(74), get_atom(float_integer_part,0), get_integer(1,1), get_atom('Fct_Float_Integ_Part',2), proceed]). predicate(fast_cmp_functor_name/2,629,static,private,user,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([((=:=),3),((=\=),5),((<),7),((=<),9),((>),11),((>=),13)]), label(2), try_me_else(4), label(3), get_atom(=:=,0), get_atom('Blt_Fast_Eq',1), proceed, label(4), retry_me_else(6), label(5), get_atom(=\=,0), get_atom('Blt_Fast_Neq',1), proceed, label(6), retry_me_else(8), label(7), get_atom(<,0), get_atom('Blt_Fast_Lt',1), proceed, label(8), retry_me_else(10), label(9), get_atom(=<,0), get_atom('Blt_Fast_Lte',1), proceed, label(10), retry_me_else(12), label(11), get_atom(>,0), get_atom('Blt_Fast_Gt',1), proceed, label(12), trust_me_else_fail, label(13), get_atom(>=,0), get_atom('Blt_Fast_Gte',1), proceed]). predicate(math_cmp_functor_name/2,636,static,private,user,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([((=:=),3),((=\=),5),((<),7),((=<),9),((>),11),((>=),13)]), label(2), try_me_else(4), label(3), get_atom(=:=,0), get_atom('Blt_Eq',1), proceed, label(4), retry_me_else(6), label(5), get_atom(=\=,0), get_atom('Blt_Neq',1), proceed, label(6), retry_me_else(8), label(7), get_atom(<,0), get_atom('Blt_Lt',1), proceed, label(8), retry_me_else(10), label(9), get_atom(=<,0), get_atom('Blt_Lte',1), proceed, label(10), retry_me_else(12), label(11), get_atom(>,0), get_atom('Blt_Gt',1), proceed, label(12), trust_me_else_fail, label(13), get_atom(>=,0), get_atom('Blt_Gte',1), proceed]). predicate(load_c_call_args/5,657,static,private,user,[ load_cut_level(5), try_me_else(1), allocate(5), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), get_variable(y(3),4), get_variable(y(4),5), put_value(x(0),1), put_atom(by_value,0), call(memberchk/2), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), call(load_by_value_arg_lst/4), cut(y(4)), deallocate, proceed, label(1), trust_me_else_fail, allocate(1), get_variable(y(0),5), put_value(x(1),0), put_value(x(2),1), put_value(x(3),2), put_value(x(4),3), call(load_by_reg_arg_lst/4), cut(y(0)), deallocate, proceed]). predicate(load_by_reg_arg_lst/4,668,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), get_value(x(3),2), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_variable(y(2),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(1), unify_variable(x(1)), unify_variable(y(1)), get_structure(x/1,1), unify_variable(x(1)), put_variable(y(3),2), call(gen_load_arg/4), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_unsafe_value(y(3),3), deallocate, execute(load_by_reg_arg_lst/4)]). predicate(load_by_value_arg_lst/4,677,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), get_value(x(3),2), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_variable(y(2),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(1), unify_variable(x(1)), unify_variable(y(1)), put_variable(y(3),2), call(load_by_value_arg/4), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_unsafe_value(y(3),3), deallocate, execute(load_by_value_arg_lst/4)]). predicate(load_by_value_arg/4,684,static,private,user,[ try_me_else(12), switch_on_term(2,9,fail,fail,1), label(1), switch_on_structure([(atm/1,3),(int/1,5),(flt/1,7),(stc/3,11)]), label(2), try_me_else(4), label(3), get_value(x(3),2), get_structure(atm/1,0), unify_local_value(x(1)), proceed, label(4), retry_me_else(6), label(5), get_value(x(3),2), get_structure(int/1,0), unify_local_value(x(1)), proceed, label(6), retry_me_else(8), label(7), get_value(x(3),2), get_structure(flt/1,0), unify_local_value(x(1)), proceed, label(8), retry_me_else(10), label(9), get_atom(nil,0), get_nil(1), get_value(x(3),2), proceed, label(10), trust_me_else_fail, label(11), get_value(x(3),2), get_structure(stc/3,0), unify_atom(/), unify_integer(2), unify_list, unify_variable(x(2)), unify_list, unify_variable(x(0)), unify_nil, get_structure(atm/1,2), unify_variable(x(2)), get_structure(int/1,0), unify_variable(x(0)), get_structure((/)/2,1), unify_value(x(2)), unify_value(x(0)), proceed, label(12), trust_me_else_fail, get_structure(x/1,1), unify_variable(x(1)), execute(gen_load_arg/4)]). predicate(c_fct_name/4,713,static,private,user,[ switch_on_term(4,1,fail,fail,fail), label(1), switch_on_atom([(var,5), (nonvar,7), (atom,9), (integer,11), (float,13), (number,15), (atomic,17), (compound,19), (callable,21), (list,23), (partial_list,25), (list_or_partial_list,27), (fd_var,29), (non_fd_var,31), (generic_var,33), (non_generic_var,35), (arg,37), (functor,39), (compare,41), ((=..),43), ((==),45), ((\==),47), ((@<),49), ((@=<),51), ((@>),53), ((@>=),55), (g_assign,57), (g_assignb,59), (g_link,61), (g_read,63), (g_array_size,65), (g_inc,2), (g_inco,69), (g_dec,3), (g_deco,77), (g_set_bit,83), (g_reset_bit,85), (g_test_set_bit,87), (g_test_reset_bit,89)]), label(2), try(67), retry(71), trust(73), label(3), try(75), retry(79), trust(81), label(4), try_me_else(6), label(5), get_atom(var,0), get_integer(1,1), get_atom('Blt_Var',2), get_atom(bool,3), proceed, label(6), retry_me_else(8), label(7), get_atom(nonvar,0), get_integer(1,1), get_atom('Blt_Non_Var',2), get_atom(bool,3), proceed, label(8), retry_me_else(10), label(9), get_atom(atom,0), get_integer(1,1), get_atom('Blt_Atom',2), get_atom(bool,3), proceed, label(10), retry_me_else(12), label(11), get_atom(integer,0), get_integer(1,1), get_atom('Blt_Integer',2), get_atom(bool,3), proceed, label(12), retry_me_else(14), label(13), get_atom(float,0), get_integer(1,1), get_atom('Blt_Float',2), get_atom(bool,3), proceed, label(14), retry_me_else(16), label(15), get_atom(number,0), get_integer(1,1), get_atom('Blt_Number',2), get_atom(bool,3), proceed, label(16), retry_me_else(18), label(17), get_atom(atomic,0), get_integer(1,1), get_atom('Blt_Atomic',2), get_atom(bool,3), proceed, label(18), retry_me_else(20), label(19), get_atom(compound,0), get_integer(1,1), get_atom('Blt_Compound',2), get_atom(bool,3), proceed, label(20), retry_me_else(22), label(21), get_atom(callable,0), get_integer(1,1), get_atom('Blt_Callable',2), get_atom(bool,3), proceed, label(22), retry_me_else(24), label(23), get_atom(list,0), get_integer(1,1), get_atom('Blt_List',2), get_atom(bool,3), proceed, label(24), retry_me_else(26), label(25), get_atom(partial_list,0), get_integer(1,1), get_atom('Blt_Partial_List',2), get_atom(bool,3), proceed, label(26), retry_me_else(28), label(27), get_atom(list_or_partial_list,0), get_integer(1,1), get_atom('Blt_List_Or_Partial_List',2), get_atom(bool,3), proceed, label(28), retry_me_else(30), label(29), get_atom(fd_var,0), get_integer(1,1), get_atom('Blt_Fd_Var',2), get_atom(bool,3), proceed, label(30), retry_me_else(32), label(31), get_atom(non_fd_var,0), get_integer(1,1), get_atom('Blt_Non_Fd_Var',2), get_atom(bool,3), proceed, label(32), retry_me_else(34), label(33), get_atom(generic_var,0), get_integer(1,1), get_atom('Blt_Generic_Var',2), get_atom(bool,3), proceed, label(34), retry_me_else(36), label(35), get_atom(non_generic_var,0), get_integer(1,1), get_atom('Blt_Non_Generic_Var',2), get_atom(bool,3), proceed, label(36), retry_me_else(38), label(37), get_atom(arg,0), get_integer(3,1), get_atom('Blt_Arg',2), get_atom(bool,3), proceed, label(38), retry_me_else(40), label(39), get_atom(functor,0), get_integer(3,1), get_atom('Blt_Functor',2), get_atom(bool,3), proceed, label(40), retry_me_else(42), label(41), get_atom(compare,0), get_integer(3,1), get_atom('Blt_Compare',2), get_atom(bool,3), proceed, label(42), retry_me_else(44), label(43), get_atom(=..,0), get_integer(2,1), get_atom('Blt_Univ',2), get_atom(bool,3), proceed, label(44), retry_me_else(46), label(45), get_atom(==,0), get_integer(2,1), get_atom('Blt_Term_Eq',2), get_atom(bool,3), proceed, label(46), retry_me_else(48), label(47), get_atom(\==,0), get_integer(2,1), get_atom('Blt_Term_Neq',2), get_atom(bool,3), proceed, label(48), retry_me_else(50), label(49), get_atom(@<,0), get_integer(2,1), get_atom('Blt_Term_Lt',2), get_atom(bool,3), proceed, label(50), retry_me_else(52), label(51), get_atom(@=<,0), get_integer(2,1), get_atom('Blt_Term_Lte',2), get_atom(bool,3), proceed, label(52), retry_me_else(54), label(53), get_atom(@>,0), get_integer(2,1), get_atom('Blt_Term_Gt',2), get_atom(bool,3), proceed, label(54), retry_me_else(56), label(55), get_atom(@>=,0), get_integer(2,1), get_atom('Blt_Term_Gte',2), get_atom(bool,3), proceed, label(56), retry_me_else(58), label(57), get_atom(g_assign,0), get_integer(2,1), get_atom('Blt_G_Assign',2), get_atom(void,3), proceed, label(58), retry_me_else(60), label(59), get_atom(g_assignb,0), get_integer(2,1), get_atom('Blt_G_Assignb',2), get_atom(void,3), proceed, label(60), retry_me_else(62), label(61), get_atom(g_link,0), get_integer(2,1), get_atom('Blt_G_Link',2), get_atom(void,3), proceed, label(62), retry_me_else(64), label(63), get_atom(g_read,0), get_integer(2,1), get_atom('Blt_G_Read',2), get_atom(bool,3), proceed, label(64), retry_me_else(66), label(65), get_atom(g_array_size,0), get_integer(2,1), get_atom('Blt_G_Array_Size',2), get_atom(bool,3), proceed, label(66), retry_me_else(68), label(67), get_atom(g_inc,0), get_integer(1,1), get_atom('Blt_G_Inc',2), get_atom(void,3), proceed, label(68), retry_me_else(70), label(69), get_atom(g_inco,0), get_integer(2,1), get_atom('Blt_G_Inco',2), get_atom(bool,3), proceed, label(70), retry_me_else(72), label(71), get_atom(g_inc,0), get_integer(2,1), get_atom('Blt_G_Inc_2',2), get_atom(bool,3), proceed, label(72), retry_me_else(74), label(73), get_atom(g_inc,0), get_integer(3,1), get_atom('Blt_G_Inc_3',2), get_atom(bool,3), proceed, label(74), retry_me_else(76), label(75), get_atom(g_dec,0), get_integer(1,1), get_atom('Blt_G_Dec',2), get_atom(void,3), proceed, label(76), retry_me_else(78), label(77), get_atom(g_deco,0), get_integer(2,1), get_atom('Blt_G_Deco',2), get_atom(bool,3), proceed, label(78), retry_me_else(80), label(79), get_atom(g_dec,0), get_integer(2,1), get_atom('Blt_G_Dec_2',2), get_atom(bool,3), proceed, label(80), retry_me_else(82), label(81), get_atom(g_dec,0), get_integer(3,1), get_atom('Blt_G_Dec_3',2), get_atom(bool,3), proceed, label(82), retry_me_else(84), label(83), get_atom(g_set_bit,0), get_integer(2,1), get_atom('Blt_G_Set_Bit',2), get_atom(void,3), proceed, label(84), retry_me_else(86), label(85), get_atom(g_reset_bit,0), get_integer(2,1), get_atom('Blt_G_Reset_Bit',2), get_atom(void,3), proceed, label(86), retry_me_else(88), label(87), get_atom(g_test_set_bit,0), get_integer(2,1), get_atom('Blt_G_Test_Set_Bit',2), get_atom(bool,3), proceed, label(88), trust_me_else_fail, label(89), get_atom(g_test_reset_bit,0), get_integer(2,1), get_atom('Blt_G_Test_Reset_Bit',2), get_atom(bool,3), proceed]). predicate(gen_inline_pred/5,401,static,private,user,[ load_cut_level(5), try_me_else(10), switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([('$get_cut_level',3),('$cut',5),((=),7),((is),9)]), label(2), try_me_else(4), label(3), allocate(5), get_atom('$get_cut_level',0), get_integer(1,1), get_list(2), unify_variable(y(0)), unify_nil, get_variable(y(1),3), get_variable(y(2),4), put_variable(y(3),0), put_variable(y(4),1), call(cur_pred/2), put_atom(cut,0), put_value(y(3),1), put_value(y(4),2), call(set_pred_info/3), put_value(y(0),0), put_unsafe_value(y(4),1), put_value(y(1),2), put_value(y(2),3), deallocate, execute(gen_unif_arg/4), label(4), retry_me_else(6), label(5), get_atom('$cut',0), get_integer(1,1), get_list(2), unify_variable(x(0)), unify_nil, get_structure(var/2,0), unify_variable(x(0)), unify_void(1), get_list(4), unify_variable(x(1)), unify_local_value(x(3)), get_structure(cut/1,1), unify_value(x(0)), proceed, label(6), retry_me_else(8), label(7), allocate(1), get_atom(=,0), get_integer(2,1), get_list(2), unify_variable(x(0)), unify_list, unify_variable(x(1)), unify_nil, get_variable(y(0),5), put_value(x(3),2), put_value(x(4),3), call(equal/4), cut(y(0)), deallocate, proceed, label(8), trust_me_else_fail, label(9), allocate(5), get_atom(is,0), get_integer(2,1), get_variable(y(1),3), get_list(2), unify_variable(y(0)), unify_list, unify_variable(x(0)), unify_nil, get_variable(y(2),5), put_value(x(4),3), put_variable(y(3),1), put_variable(y(4),2), call(load_math_expr/4), cut(y(2)), put_value(y(0),0), put_unsafe_value(y(3),1), put_value(y(1),2), put_unsafe_value(y(4),3), deallocate, execute(gen_unif_arg/4), label(10), retry_me_else(11), allocate(6), get_integer(2,1), get_variable(y(0),2), get_variable(y(1),3), get_variable(y(2),4), put_variable(y(3),1), call('$gen_inline_pred/5_$aux1'/2), put_value(y(0),0), put_variable(y(4),1), put_variable(y(5),2), put_value(y(2),3), call(load_math_arg_lst/4), put_unsafe_value(y(5),0), get_list(0), unify_variable(x(0)), unify_local_value(y(1)), get_structure(call_c/3,0), unify_local_value(y(3)), unify_variable(x(0)), unify_local_value(y(4)), get_list(0), unify_atom(fast_call), unify_list, unify_atom(boolean), unify_nil, deallocate, proceed, label(11), retry_me_else(12), get_atom('$foreign_call_c',0), get_integer(1,1), get_list(2), unify_variable(x(0)), unify_nil, get_structure(args/5,0), unify_variable(x(6)), unify_variable(x(5)), unify_variable(x(2)), unify_variable(x(1)), unify_variable(x(0)), get_list(4), unify_variable(x(4)), unify_local_value(x(3)), get_structure(foreign_call_c/5,4), unify_value(x(6)), unify_value(x(5)), unify_value(x(2)), unify_value(x(1)), unify_value(x(0)), proceed, label(12), trust_me_else_fail, allocate(8), get_variable(y(0),2), get_variable(y(1),3), get_variable(y(2),4), put_variable(y(3),2), put_variable(y(4),3), call(c_fct_name/4), put_value(y(4),0), put_variable(y(5),1), call('$gen_inline_pred/5_$aux2'/2), put_value(y(5),0), put_value(y(0),1), put_variable(y(6),2), put_variable(y(7),3), put_value(y(2),4), call(load_c_call_args/5), put_unsafe_value(y(7),0), get_list(0), unify_variable(x(0)), unify_local_value(y(1)), get_structure(call_c/3,0), unify_local_value(y(3)), unify_local_value(y(5)), unify_local_value(y(6)), deallocate, proceed]). predicate('$gen_inline_pred/5_$aux2'/2,702,static,private,user,[ load_cut_level(2), try_me_else(1), get_atom(bool,0), cut(x(2)), get_list(1), unify_atom(fast_call), unify_list, unify_atom(boolean), unify_nil, proceed, label(1), trust_me_else_fail, get_list(1), unify_atom(fast_call), unify_nil, proceed]). predicate('$gen_inline_pred/5_$aux1'/2,619,static,private,user,[ load_cut_level(2), try_me_else(1), put_atom(fast_math,3), put_atom(t,4), call_c('Blt_G_Read',[fast_call,boolean],[x(3),x(4)]), cut(x(2)), execute(fast_cmp_functor_name/2), label(1), trust_me_else_fail, execute(math_cmp_functor_name/2)]). ./gprolog-1.3.0/src/Pl2Wam/wam_emit.wam0000644004425400513100000005041610547440342016203 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : wam_emit.pl % date : 1 5 2007 % time : 13:13:22 file_name('/home/diaz/GP/src/src/Pl2Wam/wam_emit.pl'). predicate(emit_code_init/2,89,static,private,user,[ allocate(13), get_variable(y(0),0), put_value(x(1),0), put_variable(y(1),1), call(prolog_file_name/2), put_value(y(0),0), put_value(y(1),1), put_variable(y(2),2), call(emit_code_files/3), put_value(y(2),0), put_variable(y(3),1), call('$emit_code_init/2_$aux1'/2), put_atom(streamwamfile,0), put_value(y(3),1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(cur_pl_file,0), put_atom('',1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_variable(y(4),0), call(prolog_name/1), put_variable(y(5),0), call(prolog_version/1), put_variable(y(6),0), call(prolog_date/1), put_structure(dt/6,0), unify_variable(y(7)), unify_variable(y(8)), unify_variable(y(9)), unify_variable(y(10)), unify_variable(y(11)), unify_variable(y(12)), call(date_time/1), put_value(y(3),0), put_atom('%% compiler: ~a ~a (~a)~n',1), put_list(2), unify_local_value(y(4)), unify_list, unify_local_value(y(5)), unify_list, unify_local_value(y(6)), unify_nil, call(format/3), put_value(y(3),0), put_atom('%% file : ~a~n',1), put_list(2), unify_local_value(y(1)), unify_nil, call(format/3), put_value(y(3),0), put_atom('%% date : ~d ~d ~d~n',1), put_list(2), unify_value(y(8)), unify_list, unify_value(y(9)), unify_list, unify_value(y(7)), unify_nil, call(format/3), put_unsafe_value(y(3),0), put_atom('%% time : ~d:~d:~d~n',1), put_list(2), unify_value(y(10)), unify_list, unify_value(y(11)), unify_list, unify_value(y(12)), unify_nil, deallocate, execute(format/3)]). predicate('$emit_code_init/2_$aux1'/2,89,static,private,user,[ load_cut_level(2), try_me_else(1), get_atom(user,0), cut(x(2)), put_value(x(1),0), execute(current_output/1), label(1), trust_me_else_fail, put_value(x(1),2), put_atom(write,1), execute(open/3)]). predicate(emit_code_files/3,110,static,private,user,[ load_cut_level(3), try_me_else(7), switch_on_term(3,1,fail,fail,fail), label(1), switch_on_atom([('',2)]), label(2), try(4), trust(6), label(3), try_me_else(5), label(4), get_atom('',0), get_atom(user,1), get_atom(user,2), cut(x(3)), proceed, label(5), trust_me_else_fail, label(6), allocate(4), get_atom('',0), get_variable(y(0),2), cut(x(3)), put_value(x(1),0), put_void(1), put_variable(y(1),2), put_variable(y(2),3), call(decompose_file_name/4), put_variable(y(3),0), call('$emit_code_files/3_$aux1'/1), put_unsafe_value(y(2),0), put_unsafe_value(y(1),1), put_unsafe_value(y(3),2), put_value(y(0),3), deallocate, execute('$emit_code_files/3_$aux2'/4), label(7), trust_me_else_fail, get_value(x(2),0), proceed]). predicate('$emit_code_files/3_$aux2'/4,113,static,private,user,[ load_cut_level(4), try_me_else(1), get_atom('.pl',0), cut(x(4)), put_value(x(1),0), put_value(x(2),1), put_value(x(3),2), execute(atom_concat/3), label(1), trust_me_else_fail, allocate(3), get_variable(y(0),2), get_variable(y(1),3), get_variable(x(2),1), get_variable(x(1),0), put_value(x(2),0), put_variable(y(2),2), call(atom_concat/3), put_unsafe_value(y(2),0), put_value(y(0),1), put_value(y(1),2), deallocate, execute(atom_concat/3)]). predicate('$emit_code_files/3_$aux1'/1,113,static,private,user,[ load_cut_level(1), try_me_else(1), put_atom(native_code,2), put_atom(t,3), call_c('Blt_G_Read',[fast_call,boolean],[x(2),x(3)]), cut(x(1)), get_atom('.wam',0), proceed, label(1), trust_me_else_fail, get_atom('.wbc',0), proceed]). predicate(emit_code_term/2,131,static,private,user,[ allocate(2), get_variable(y(0),1), put_atom(streamwamfile,1), put_variable(y(1),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), put_value(x(0),1), put_value(y(1),0), call(character_count/2), put_value(y(1),0), put_value(y(0),1), call(line_count/2), put_unsafe_value(y(1),0), deallocate, execute(close/1)]). predicate(emit_code/5,140,static,private,user,[ allocate(2), get_variable(y(0),4), put_atom(streamwamfile,4), put_variable(y(1),5), call_c('Blt_G_Read',[fast_call,boolean],[x(4),x(5)]), put_value(y(1),4), put_void(5), call(emit_pred_start/6), put_value(y(0),0), put_void(1), put_value(y(1),2), call(emit_wam_code/3), put_value(y(1),0), put_atom(']).',1), call(write/2), put_unsafe_value(y(1),0), deallocate, execute(nl/1)]). predicate(emit_pred_start/6,150,static,private,user,[ load_cut_level(6), try_me_else(1), allocate(5), get_integer(0,1), get_variable(y(0),2), get_variable(y(1),3), get_variable(y(2),4), get_variable(y(3),5), get_variable(y(4),6), put_value(y(3),1), call('$emit_pred_start/6_$aux1'/2), cut(y(4)), put_value(y(0),0), put_value(y(2),1), call(emit_file_name_if_needed/2), put_value(y(2),0), put_atom('~n~ndirective(~d,~a,',1), put_list(2), unify_local_value(y(1)), unify_list, unify_local_value(y(3)), unify_nil, deallocate, execute(format/3), label(1), trust_me_else_fail, allocate(7), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),3), get_variable(y(3),4), put_value(x(2),0), put_value(y(3),1), call(emit_file_name_if_needed/2), put_value(y(0),0), put_value(y(1),1), put_variable(y(4),2), call('$emit_pred_start/6_$aux2'/3), put_value(y(0),0), put_value(y(1),1), put_variable(y(5),2), call('$emit_pred_start/6_$aux3'/3), put_value(y(0),0), put_value(y(1),1), put_variable(y(6),2), call('$emit_pred_start/6_$aux4'/3), put_value(y(3),0), put_atom('~n~npredicate(~q,~d,~a,~a,~a,',1), put_structure((/)/2,3), unify_local_value(y(0)), unify_local_value(y(1)), put_list(2), unify_value(x(3)), unify_list, unify_local_value(y(2)), unify_list, unify_local_value(y(4)), unify_list, unify_local_value(y(5)), unify_list, unify_local_value(y(6)), unify_nil, deallocate, execute(format/3)]). predicate('$emit_pred_start/6_$aux4'/3,159,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(2), get_variable(y(0),2), get_variable(x(2),1), get_variable(y(1),3), put_value(x(0),1), put_atom(bpl,0), call(test_pred_info/3), cut(y(1)), put_value(y(0),0), get_atom(built_in,0), deallocate, proceed, label(1), retry_me_else(2), allocate(2), get_variable(y(0),2), get_variable(x(2),1), get_variable(y(1),3), put_value(x(0),1), put_atom(bfd,0), call(test_pred_info/3), cut(y(1)), put_value(y(0),0), get_atom(built_in_fd,0), deallocate, proceed, label(2), trust_me_else_fail, get_atom(user,2), proceed]). predicate('$emit_pred_start/6_$aux3'/3,159,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(2), get_variable(y(0),2), get_variable(x(2),1), get_variable(y(1),3), put_value(x(0),1), put_atom(pub,0), call(test_pred_info/3), cut(y(1)), put_value(y(0),0), get_atom(public,0), deallocate, proceed, label(1), trust_me_else_fail, get_atom(private,2), proceed]). predicate('$emit_pred_start/6_$aux2'/3,159,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(2), get_variable(y(0),2), get_variable(x(2),1), get_variable(y(1),3), put_value(x(0),1), put_atom(dyn,0), call(test_pred_info/3), cut(y(1)), put_value(y(0),0), get_atom(dynamic,0), deallocate, proceed, label(1), trust_me_else_fail, get_atom(static,2), proceed]). predicate('$emit_pred_start/6_$aux1'/2,150,static,private,user,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([('$exe_user',3),('$exe_system',5)]), label(2), try_me_else(4), label(3), get_atom('$exe_user',0), get_atom(user,1), proceed, label(4), trust_me_else_fail, label(5), get_atom('$exe_system',0), get_atom(system,1), proceed]). predicate(emit_file_name_if_needed/2,180,static,private,user,[ load_cut_level(2), try_me_else(1), put_atom(cur_pl_file,1), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(0)]), cut(x(2)), proceed, label(1), trust_me_else_fail, allocate(1), get_variable(y(0),0), put_value(x(1),0), put_atom('~n~nfile_name(~q).~n',1), put_list(2), unify_local_value(y(0)), unify_nil, call(format/3), put_atom(cur_pl_file,0), put_value(y(0),1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), deallocate, proceed]). predicate(emit_wam_code/3,190,static,private,user,[ load_cut_level(3), try_me_else(5), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_variable(y(1),1), get_variable(y(2),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_variable(y(3),3), put_value(y(1),1), put_value(y(2),2), call(emit_wam_code/3), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), call(emit_wam_code/3), cut(y(3)), deallocate, proceed, label(5), retry_me_else(6), allocate(3), get_variable(y(0),1), get_variable(y(1),2), put_variable(y(2),1), call(special_form/2), put_unsafe_value(y(2),0), put_value(y(0),1), put_value(y(1),2), deallocate, execute(emit_wam_code/3), label(6), retry_me_else(7), allocate(1), get_variable(y(0),3), put_atom(keep_void_inst,2), put_variable(x(1),3), call_c('Blt_G_Read',[fast_call,boolean],[x(2),x(3)]), call(dummy_instruction/2), cut(y(0)), deallocate, proceed, label(7), retry_me_else(8), allocate(3), get_variable(y(0),0), get_variable(y(1),2), put_value(y(0),0), get_structure(label/1,0), unify_void(1), cut(x(3)), put_value(x(1),0), put_variable(y(2),1), call('$emit_wam_code/3_$aux1'/2), put_value(y(1),0), put_atom('~a~n~n',1), put_list(2), unify_local_value(y(2)), unify_nil, call(format/3), put_value(y(0),0), put_value(y(1),1), deallocate, execute(emit_one_inst/2), label(8), trust_me_else_fail, allocate(3), get_variable(y(0),0), get_variable(y(1),2), put_value(x(1),0), put_variable(y(2),1), call('$emit_wam_code/3_$aux2'/2), put_value(y(1),0), put_atom('~a~n ',1), put_list(2), unify_local_value(y(2)), unify_nil, call(format/3), put_value(y(0),0), put_value(y(1),1), deallocate, execute(emit_one_inst/2)]). predicate('$emit_wam_code/3_$aux2'/2,214,static,private,user,[ load_cut_level(2), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(2)), get_atom('[',1), get_atom(f,0), proceed, label(1), trust_me_else_fail, get_atom(',',1), proceed]). predicate('$emit_wam_code/3_$aux1'/2,204,static,private,user,[ load_cut_level(2), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(2)), get_atom('[',1), get_atom(f,0), proceed, label(1), trust_me_else_fail, get_atom(',',1), proceed]). predicate(emit_one_inst/2,226,static,private,user,[ load_cut_level(2), try_me_else(1), get_variable(x(3),1), get_variable(x(1),0), call_c('Blt_Atom',[fast_call,boolean],[x(1)]), cut(x(2)), put_value(x(3),0), execute(writeq/2), label(1), trust_me_else_fail, allocate(3), get_variable(y(0),0), get_variable(y(1),1), put_value(y(0),0), put_variable(x(1),2), put_variable(y(2),3), call_c('Blt_Functor',[fast_call,boolean],[x(0),x(2),x(3)]), put_value(y(1),0), call(writeq/2), put_integer(0,0), put_value(y(2),1), put_value(y(0),2), put_value(y(1),3), call(emit_args/4), put_value(y(1),0), put_atom(')',1), deallocate, execute(write/2)]). predicate(emit_args/4,236,static,private,user,[ load_cut_level(4), try_me_else(1), get_value(x(1),0), cut(x(4)), proceed, label(1), trust_me_else_fail, allocate(4), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), math_fast_load_value(x(0),0), call_c('Fct_Fast_Inc',[fast_call,x(0)],[x(0)]), get_variable(y(3),0), put_value(y(3),0), put_value(y(2),1), call('$emit_args/4_$aux1'/2), put_value(y(3),1), put_value(y(1),2), put_variable(x(0),3), call_c('Blt_Arg',[fast_call,boolean],[x(1),x(2),x(3)]), put_value(y(2),1), call(emit_one_arg/2), put_value(y(3),0), put_value(y(0),1), put_value(y(1),2), put_value(y(2),3), deallocate, execute(emit_args/4)]). predicate('$emit_args/4_$aux1'/2,239,static,private,user,[ load_cut_level(2), try_me_else(1), get_integer(1,0), cut(x(2)), put_value(x(1),0), put_atom('(',1), execute(put_char/2), label(1), trust_me_else_fail, put_value(x(1),0), put_atom(',',1), execute(put_char/2)]). predicate(emit_one_arg/2,249,static,private,user,[ load_cut_level(2), try_me_else(1), allocate(6), get_list(0), unify_variable(y(0)), unify_variable(y(1)), get_variable(y(2),1), get_variable(y(3),2), put_value(y(1),0), put_variable(y(4),1), call(length/2), math_fast_load_value(y(4),0), put_integer(30,1), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(0),x(1)]), cut(y(3)), put_value(y(2),0), put_atom('[',1), call(put_char/2), put_value(y(2),0), put_variable(y(5),1), call(line_position/2), put_value(y(2),0), put_value(y(0),1), put_structure(quoted/1,4), unify_atom(true), put_structure(priority/1,3), unify_integer(999), put_list(2), unify_value(x(4)), unify_list, unify_value(x(3)), unify_nil, call(write_term/3), put_value(y(1),0), put_unsafe_value(y(5),1), put_value(y(2),2), deallocate, execute(emit_list/3), label(1), trust_me_else_fail, get_variable(x(2),1), get_variable(x(1),0), put_value(x(2),0), execute(writeq/2)]). predicate(emit_list/3,264,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), put_value(x(2),0), put_atom(']',1), execute(put_char/2), label(3), trust_me_else_fail, label(4), allocate(4), get_list(0), unify_variable(y(0)), unify_variable(y(1)), get_variable(y(2),1), get_variable(y(3),2), put_value(y(3),0), put_atom(',~n~*c',1), put_list(2), unify_local_value(y(2)), unify_list, unify_integer(32), unify_nil, call(format/3), put_value(y(3),0), put_value(y(0),1), put_structure(quoted/1,4), unify_atom(true), put_structure(priority/1,3), unify_integer(999), put_list(2), unify_value(x(4)), unify_list, unify_value(x(3)), unify_nil, call(write_term/3), put_value(y(1),0), put_value(y(2),1), put_value(y(3),2), deallocate, execute(emit_list/3)]). predicate(emit_ensure_linked/0,275,static,private,user,[ load_cut_level(0), try_me_else(1), allocate(4), get_variable(y(0),0), put_atom(streamwamfile,0), put_variable(y(1),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_structure(ensure_linked/2,0), unify_variable(y(2)), unify_variable(y(3)), call(retract/1), cut(y(0)), put_value(y(1),0), put_atom('~n~nensure_linked([~q',1), put_structure((/)/2,3), unify_value(y(2)), unify_value(y(3)), put_list(2), unify_value(x(3)), unify_nil, call(format/3), put_value(y(1),0), call('$emit_ensure_linked/0_$aux1'/1), put_value(y(1),0), put_atom(']).',1), call(write/2), put_unsafe_value(y(1),0), deallocate, execute(nl/1), label(1), trust_me_else_fail, proceed]). predicate('$emit_ensure_linked/0_$aux1'/1,275,static,private,user,[ try_me_else(1), allocate(3), get_variable(y(0),0), put_structure(ensure_linked/2,0), unify_variable(y(1)), unify_variable(y(2)), put_void(1), call(clause/2), put_value(y(0),0), put_atom(',~q',1), put_structure((/)/2,3), unify_value(y(1)), unify_value(y(2)), put_list(2), unify_value(x(3)), unify_nil, call(format/3), fail, label(1), trust_me_else_fail, proceed]). predicate(bc_emit_code/5,292,static,private,user,[ allocate(3), get_variable(y(0),4), put_atom(streamwamfile,4), put_variable(y(1),5), call_c('Blt_G_Read',[fast_call,boolean],[x(4),x(5)]), put_value(y(1),4), put_variable(y(2),5), call(emit_pred_start/6), put_unsafe_value(y(2),0), put_value(y(0),1), put_unsafe_value(y(1),2), deallocate, execute('$bc_emit_code/5_$aux1'/3)]). predicate('$bc_emit_code/5_$aux1'/3,292,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(1), get_variable(y(0),2), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), cut(x(3)), get_list(1), unify_variable(x(0)), unify_nil, get_structure(bc/2,0), unify_variable(x(0)), unify_void(1), get_structure((:-)/2,0), unify_void(1), unify_variable(x(1)), put_value(y(0),0), call(bc_emit_prolog_term/2), put_value(y(0),0), put_atom(').~n',1), put_nil(2), deallocate, execute(format/3), label(1), trust_me_else_fail, allocate(5), get_variable(y(0),1), get_variable(y(1),2), put_value(y(0),0), put_variable(y(2),1), call(length/2), put_value(y(0),0), put_variable(y(3),1), put_variable(y(4),2), put_value(y(2),3), call('$bc_emit_code/5_$aux2'/4), put_value(y(1),0), put_atom('~d).~n',1), put_list(2), unify_local_value(y(3)), unify_nil, call(format/3), put_unsafe_value(y(4),0), put_value(y(1),1), deallocate, execute(bc_emit_lst_clause/2)]). predicate('$bc_emit_code/5_$aux2'/4,292,static,private,user,[ load_cut_level(4), try_me_else(1), get_list(0), unify_variable(x(0)), unify_nil, get_structure(bc/2,0), unify_atom('$$empty$$predicate$$clause$$'), unify_list, unify_atom(proceed), unify_nil, cut(x(4)), get_integer(0,1), get_nil(2), proceed, label(1), trust_me_else_fail, get_value(x(3),1), get_value(x(0),2), proceed]). predicate(bc_emit_lst_clause/2,313,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_list(0), unify_variable(x(0)), unify_variable(y(2)), get_structure(bc/2,0), unify_variable(y(0)), unify_variable(y(1)), get_variable(y(3),1), put_value(y(3),0), put_atom('~n~nclause(',1), put_nil(2), call(format/3), put_value(y(3),0), put_value(y(0),1), call(bc_emit_prolog_term/2), put_value(y(3),0), put_atom(',',1), call(write/2), put_value(y(1),0), put_void(1), put_value(y(3),2), call(emit_wam_code/3), put_value(y(3),0), put_atom(']).~n',1), put_nil(2), call(format/3), put_value(y(2),0), put_value(y(3),1), deallocate, execute(bc_emit_lst_clause/2)]). predicate(bc_emit_prolog_term/2,326,static,private,user,[ allocate(2), get_variable(y(0),0), get_variable(y(1),1), put_value(y(1),0), put_integer(0,1), put_void(2), call(numbervars/3), put_value(y(0),0), put_value(y(1),1), put_structure(numbervars/1,5), unify_atom(true), put_structure(ignore_ops/1,4), unify_atom(true), put_structure(quoted/1,3), unify_atom(true), put_list(2), unify_value(x(5)), unify_list, unify_value(x(4)), unify_list, unify_value(x(3)), unify_nil, deallocate, execute(write_term/3)]). ./gprolog-1.3.0/src/Pl2Wam/code_gen.pl0000644004425400513100000005312710547162440015775 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog to WAM compiler * * File : code_gen.pl * * Descr.: pass 3: code generation * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: code_gen.pl,v 1.17 2007/01/04 10:34:06 diaz Exp $ */ code_generation(Head, Body, NbChunk, NbY, WamHead) :- g_assign(last_pred, f), generate_head(Head, NbChunk, NbY, WamBody, WamHead), generate_body(Body, NbChunk, WamBody). generate_head(p(_, _ / N, LArg), NbChunk, NbY, WamNext, WamHead) :- gen_list_integers(0, N, LReg), ( g_read(reorder, t) -> reorder_head_arg_lst(LArg, LReg, LArg1, LReg1) ; LArg1 = LArg, LReg1 = LReg ), gen_unif_arg_lst(LArg1, LReg1, WamNext, WamLArg), ( NbChunk > 1 -> WamHead = [allocate(NbY)|WamLArg] ; WamHead = WamLArg ). reorder_head_arg_lst(LArg, LReg, LArg1, LReg1) :- split_arg_lst(LArg, LReg, LArgK, LRegK, LArgS, LRegS, LArgT, LRegT), reverse(LArgT, LArgT1), reverse(LRegT, LRegT1), append(LArgK, LArgT1, LArgKT), append(LArgKT, LArgS, LArg1), append(LRegK, LRegT1, LRegKT), append(LRegKT, LRegS, LReg1). generate_body([], _, [proceed]). generate_body([p(NoPred, Pred / N, LArg)|Body], NbChunk, WamPred) :- ( NoPred = NbChunk -> g_assign(last_pred, t) ; true ), generate_body1(Pred, N, LArg, NoPred, Body, NbChunk, WamPred). generate_body1(fail, 0, _, _, _, _, [fail]) :- !. generate_body1('$call_c', 2, [Arg, LCOpt], NoPred, Body, NbChunk, WamArgs) :- !, ( Arg = atm(Name), LStcArg = [] ; Arg = stc(Name, _, LStcArg) ), ( Body \== [], memberchk(jump, LCOpt) -> LCOpt1 = [set_cp|LCOpt] ; LCOpt1 = LCOpt ), load_c_call_args(LCOpt, LStcArg, LValue, WamCallC1, WamArgs), WamCallCInst = call_c(Name, LCOpt1, LValue), ( Body = [] -> ( NoPred > 1 -> WamCallC1 = [deallocate, WamCallCInst, proceed] ; WamCallC1 = [WamCallCInst, proceed] ) ; WamCallC1 = [WamCallCInst|WamBody], generate_body(Body, NbChunk, WamBody) ). generate_body1(Pred, N, LArg, NoPred, Body, NbChunk, WamPred) :- inline_predicate(Pred, N), !, gen_inline_pred(Pred, N, LArg, WamBody, WamPred), !, ( Body = [] -> ( NoPred > 1 -> WamBody = [deallocate, proceed] ; WamBody = [proceed] ) ; generate_body(Body, NbChunk, WamBody) ). generate_body1(Pred, N, LArg, NoPred, Body, NbChunk, WamLArg) :- gen_list_integers(0, N, LReg), ( g_read(reorder, t) -> reorder_body_arg_lst(LArg, LReg, LArg1, LReg1) ; LArg1 = LArg, LReg1 = LReg ), gen_load_arg_lst(LArg1, LReg1, WamCallExecute, WamLArg), ( Body = [] -> ( NoPred > 1 -> WamCallExecute = [deallocate, execute(Pred / N)] ; WamCallExecute = [execute(Pred / N)] ) ; WamCallExecute = [call(Pred / N)|WamBody], generate_body(Body, NbChunk, WamBody) ). reorder_body_arg_lst(LArg, LReg, LArg1, LReg1) :- split_arg_lst(LArg, LReg, LArgK, LRegK, LArgS, LRegS, LArgT, LRegT), append(LArgS, LArgT, LArgST), append(LArgST, LArgK, LArg1), append(LRegS, LRegT, LRegST), append(LRegST, LRegK, LReg1). % split LArg/LReg in: % LArgK/LRegK: known elements (without temporaries) % LArgS/LRegS: structures containing temporaries % LArgT/LRegT: temporaries split_arg_lst([], [], [], [], [], [], [], []). split_arg_lst([Arg|LArg], [Reg|LReg], LArgK, LRegK, LArgS, LRegS, LArgT, LRegT) :- ( Arg = var(x(No), _), No \== void, LArgK = LArgK1, LRegK = LRegK1, LArgS = LArgS1, LRegS = LRegS1, LArgT = [Arg|LArgT1], LRegT = [Reg|LRegT1] ; Arg = stc(_, _, LStcArg), has_temporaries(LStcArg), LArgK = LArgK1, LRegK = LRegK1, LArgS = [Arg|LArgS1], LRegS = [Reg|LRegS1], LArgT = LArgT1, LRegT = LRegT1 ; LArgK = [Arg|LArgK1], LRegK = [Reg|LRegK1], LArgS = LArgS1, LRegS = LRegS1, LArgT = LArgT1, LRegT = LRegT1 ), !, split_arg_lst(LArg, LReg, LArgK1, LRegK1, LArgS1, LRegS1, LArgT1, LRegT1). has_temporaries([Arg|LArg]) :- ( Arg = var(x(No), _), No \== void ; Arg = stc(_, _, LStcArg), has_temporaries(LStcArg) ; has_temporaries(LArg) ), !. % gen_unif_arg_lst(LArg, LReg, WamNext, WamLArg) gen_unif_arg_lst([], [], WamNext, WamNext). gen_unif_arg_lst([Arg|LArg], [Reg|LReg], WamNext, WamArg) :- gen_unif_arg(Arg, Reg, WamLArg, WamArg), gen_unif_arg_lst(LArg, LReg, WamNext, WamLArg). % gen_unif_arg(Arg, Reg, WamNext, WamArg) gen_unif_arg(var(VarName, Info), Reg, WamNext, WamArg) :- ( var(Info) -> ( VarName == x(void) -> WamArg = WamNext ; Info = not_in_cur_env, WamArg = [get_variable(VarName, Reg)|WamNext] ) ; WamArg = [get_value(VarName, Reg)|WamNext] ). gen_unif_arg(atm(A), Reg, WamNext, [get_atom(A, Reg)|WamNext]). gen_unif_arg(int(N), Reg, WamNext, [get_integer(N, Reg)|WamNext]). gen_unif_arg(flt(N), Reg, WamNext, [get_float(N, Reg)|WamNext]). gen_unif_arg(nil, Reg, WamNext, [get_nil(Reg)|WamNext]). gen_unif_arg(stc(F, N, LStcArg), Reg, WamNext, [WamInst|WamStcArg]) :- ( F = '.', N = 2 -> WamInst = get_list(Reg) ; WamInst = get_structure(F / N, Reg) ), flat_stc_arg_lst(LStcArg, head, LStcArg1, LArgAux, LRegAux), gen_subterm_arg_lst(LStcArg1, WamArgAux, WamStcArg), gen_unif_arg_lst(LArgAux, LRegAux, WamNext, WamArgAux). % gen_load_arg_lst(LArg, LReg, WamNext, WamLArg) gen_load_arg_lst([], [], WamNext, WamNext). gen_load_arg_lst([Arg|LArg], [Reg|LReg], WamNext, WamArg) :- gen_load_arg(Arg, Reg, WamLArg, WamArg), gen_load_arg_lst(LArg, LReg, WamNext, WamLArg). % gen_load_arg(Arg, Reg, WamNext, WamArg) gen_load_arg(var(VarName, Info), Reg, WamNext, [WamInst|WamNext]) :- ( var(Info) -> ( VarName == x(void) -> WamInst = put_void(Reg) ; ( VarName = x(_) -> Info = in_heap ; Info = unsafe ), WamInst = put_variable(VarName, Reg) ) ; Info = unsafe, g_read(last_pred, t) -> WamInst = put_unsafe_value(VarName, Reg) ; WamInst = put_value(VarName, Reg) ). gen_load_arg(atm(A), Reg, WamNext, [put_atom(A, Reg)|WamNext]). gen_load_arg(int(N), Reg, WamNext, [put_integer(N, Reg)|WamNext]). gen_load_arg(flt(N), Reg, WamNext, [put_float(N, Reg)|WamNext]). gen_load_arg(nil, Reg, WamNext, [put_nil(Reg)|WamNext]). gen_load_arg(stc(F, N, LStcArg), Reg, WamNext, WamArgAux) :- ( F = '.', N = 2 -> WamInst = put_list(Reg) ; WamInst = put_structure(F / N, Reg) ), flat_stc_arg_lst(LStcArg, body, LStcArg1, LArgAux, LRegAux), gen_load_arg_lst(LArgAux, LRegAux, [WamInst|WamStcArg], WamArgAux), gen_subterm_arg_lst(LStcArg1, WamNext, WamStcArg). % flat_stc_arg_lst(LStcArg, HB, LStcArg1, LArgAux, LRegAux) flat_stc_arg_lst([], _, [], [], []). flat_stc_arg_lst([StcArg|LStcArg], HB, [StcArg|LStcArg1], LArgAux, LRegAux) :- simple_stc_arg(StcArg), !, flat_stc_arg_lst(LStcArg, HB, LStcArg1, LArgAux, LRegAux). flat_stc_arg_lst([StcArg], HB, [stc(F, N, LStcArg1)], LArgAux, LRegAux) :- g_read(opt_last_subterm, t), % last subterm unif stc optimization StcArg = stc(F, N, LStcArg), !, flat_stc_arg_lst(LStcArg, HB, LStcArg1, LArgAux, LRegAux). flat_stc_arg_lst([StcArg|LStcArg], HB, [V|LStcArg1], [StcArg|LArgAux], [X|LRegAux]) :- ( HB = head -> V = var(x(X), _) ; V = var(x(X), in_heap) ), flat_stc_arg_lst(LStcArg, HB, LStcArg1, LArgAux, LRegAux). simple_stc_arg(var(_, _)). simple_stc_arg(atm(_)). simple_stc_arg(int(_)). simple_stc_arg(nil). % gen_subterm_arg_lst(LStcArg, WamNext, WamLStcArg) gen_subterm_arg_lst([], WamNext, WamNext). gen_subterm_arg_lst([Arg|LArg], WamNext, WamArg) :- gen_compte_void([Arg|LArg], 0, N, LArg1), ( N = 0 -> gen_subterm_arg(Arg, WamLArg, WamArg), gen_subterm_arg_lst(LArg, WamNext, WamLArg) ; WamArg = [unify_void(N)|WamLArg1], gen_subterm_arg_lst(LArg1, WamNext, WamLArg1) ). gen_compte_void([var(x(No), _)|LArg], N, N2, LArg1) :- No == void, !, N1 is N + 1, gen_compte_void(LArg, N1, N2, LArg1). gen_compte_void(LArg, N, N, LArg). gen_subterm_arg(var(VarName, Info), WamNext, [WamInst|WamNext]) :- ( var(Info) -> Info = in_heap, WamInst = unify_variable(VarName) ; Info = in_heap -> WamInst = unify_value(VarName) ; WamInst = unify_local_value(VarName) ). gen_subterm_arg(atm(A), WamNext, [unify_atom(A)|WamNext]). gen_subterm_arg(int(N), WamNext, [unify_integer(N)|WamNext]). gen_subterm_arg(nil, WamNext, [unify_nil|WamNext]). gen_subterm_arg(stc(F, N, LStcArg), WamNext, [WamInst|WamLStcArg]) :- ( F = '.', N = 2 -> WamInst = unify_list ; WamInst = unify_structure(F / N) ), gen_subterm_arg_lst(LStcArg, WamNext, WamLStcArg). gen_list_integers(I, N, L) :- ( I < N -> L = [I|L1], I1 is I + 1, gen_list_integers(I1, N, L1) ; L = [] ). % called at code emission special_form(put_variable(x(X), X), put_void(X)). dummy_instruction(get_variable(x(X), X), f). dummy_instruction(put_value(x(X), X), f). % Inline predicate code generation: % gen_inline_pred(Pred, Arity, LArg, WamNext, WamPred) % % the predicates defined here must have a corresponding clause % inline_predicate/2 (in pass 2). :- discontiguous(gen_inline_pred / 5). % Cut inline ('$get_cut_level'/1,'$cut'/1) gen_inline_pred('$get_cut_level', 1, [Arg], WamNext, WamArg) :- cur_pred(Pred, N), set_pred_info(cut, Pred, N), gen_unif_arg(Arg, N, WamNext, WamArg). gen_inline_pred('$cut', 1, [var(VarName, _)], WamNext, [WamInst|WamNext]) :- WamInst = cut(VarName). % Unification inline (=/2) gen_inline_pred(=, 2, [Arg1, Arg2], WamNext, WamEqual) :- equal(Arg1, Arg2, WamNext, WamEqual), !. equal(Arg1, Arg2, WamNext, WamNext) :- Arg1 == Arg2. equal(var(VarName, Info), var(VarName, Info), WamNext, WamNext) :- var(Info). equal(var(VarName1, Info1), Arg2, WamNext, WamEqual) :- ( VarName1 = x(Reg1) -> ( Reg1 == void -> WamNext = WamEqual ; inline_unif_reg_term(Info1, Reg1, Arg2, WamNext, WamEqual) ) ; gen_load_arg(var(VarName1, Info1), IReg, WamEqual1, WamEqual), gen_unif_arg(Arg2, IReg, WamNext, WamEqual1) ). equal(Arg1, var(VarName2, Info2), WamNext, WamEqual) :- ( VarName2 = x(Reg2) -> ( Reg2 == void -> WamNext = WamEqual ; inline_unif_reg_term(Info2, Reg2, Arg1, WamNext, WamEqual) ) ; gen_load_arg(var(VarName2, Info2), IReg, WamEqual1, WamEqual), gen_unif_arg(Arg1, IReg, WamNext, WamEqual1) ). equal(Arg1, var(x(Reg2), Info2), WamNext, WamEqual) :- inline_unif_reg_term(Info2, Reg2, Arg1, WamNext, WamEqual). equal(stc(F, N, LStcArg1), stc(F, N, LStcArg2), WamNext, WamEqual) :- equal_lst(LStcArg1, LStcArg2, WamNext, WamEqual). equal(_, _, WamNext, [fail|WamNext]) :- warn('explicit unification will fail', []). equal_lst([], [], WamNext, WamNext). equal_lst([Arg1|LArg1], [Arg2|LArg2], WamNext, WamEqual) :- equal(Arg1, Arg2, WamLArg, WamEqual), equal_lst(LArg1, LArg2, WamNext, WamLArg). inline_unif_reg_term(Info, Reg, Arg, WamNext, WamUnif) :- ( var(Info) -> Info = in_heap, gen_load_arg(Arg, Reg, WamNext, WamUnif) ; gen_unif_arg(Arg, Reg, WamNext, WamUnif) ). % Mathematical inlines (is/2, =:=/2, ...) /* provisional... pb with allocator to reuse VN2 for VN1 gen_inline_pred(is, 2, [var(VN1, Info1), stc(+, 2, [var(VN2, Info2), int(1)])], WamNext, WamMath) :- var(Info1), !, ( var(Info2) -> error('unbound variable in arithmetic expression', []) ; true ), Info1 = not_in_cur_env, WamMath = [call_c('Math_X_is_inc_y',[fast],[&,VN1,VN2])|WamNext]. */ gen_inline_pred(is, 2, [Arg1, Arg2], WamNext, WamMath) :- load_math_expr(Arg2, Reg, WamUnif, WamMath), !, gen_unif_arg(Arg1, Reg, WamNext, WamUnif). load_math_expr(var(VarName, Info), Reg, WamNext, WamMath) :- ( var(Info) -> error('unbound variable in arithmetic expression', []) ; true ), ( g_read(fast_math, t) -> WamMath = [math_fast_load_value(VarName, Reg)|WamNext] ; WamMath = [math_load_value(VarName, Reg)|WamNext] ). load_math_expr(int(N), Reg, WamNext, WamMath) :- gen_load_arg(int(N), Reg, WamNext, WamMath). load_math_expr(flt(N), Reg, WamNext, WamMath) :- gen_load_arg(flt(N), Reg, WamNext, WamMath). load_math_expr(stc(F, N, LArg), Reg, WamNext, WamMath) :- load_math_expr1(F, N, LArg, Reg, WamNext, WamMath). load_math_expr(X, _, _, _) :- error('unknown expression in arithmetic expression (~q)', [X]). load_math_expr1('.', 2, [Arg, nil], Reg, WamNext, WamMath) :- load_math_expr(Arg, Reg, WamNext, WamMath). load_math_expr1(+, 1, [Arg], Reg, WamNext, WamMath) :- load_math_expr(Arg, Reg, WamNext, WamMath). load_math_expr1(+, 2, [Arg1, int(1)], Reg, WamNext, WamMath) :- load_math_expr1(inc, 1, [Arg1], Reg, WamNext, WamMath). load_math_expr1(-, 2, [Arg1, int(1)], Reg, WamNext, WamMath) :- load_math_expr1(dec, 1, [Arg1], Reg, WamNext, WamMath). load_math_expr1(F, N, LArg, Reg, WamNext, WamMath) :- ( g_read(fast_math, t) -> fast_exp_functor_name(F, N, Name) ; math_exp_functor_name(F, N, Name) ), load_math_arg_lst(LArg, LValue, WamInst, WamMath), WamInst = [call_c(Name, [fast_call,x(Reg)], LValue)|WamNext]. load_math_expr1(F, N, _, _, _, _) :- math_exp_functor_name(F, N, _), error('arithmetic operation not allowed in fast math (~q)', [F / N]). load_math_expr1(F, N, _, _, _, _) :- error('unknown operation in arithmetic expression (~q)', [F / N]). load_math_arg_lst([], [], WamNext, WamNext). load_math_arg_lst([Arg|LArg], [x(Reg)|LReg], WamNext, WamMath) :- load_math_expr(Arg, Reg, WamLArg, WamMath), load_math_arg_lst(LArg, LReg, WamNext, WamLArg). fast_exp_functor_name(-, 1, 'Fct_Fast_Neg'). fast_exp_functor_name(inc, 1, 'Fct_Fast_Inc'). fast_exp_functor_name(dec, 1, 'Fct_Fast_Dec'). fast_exp_functor_name(+, 2, 'Fct_Fast_Add'). fast_exp_functor_name(-, 2, 'Fct_Fast_Sub'). fast_exp_functor_name(*, 2, 'Fct_Fast_Mul'). fast_exp_functor_name(//, 2, 'Fct_Fast_Div'). fast_exp_functor_name(rem, 2, 'Fct_Fast_Rem'). fast_exp_functor_name(mod, 2, 'Fct_Fast_Mod'). fast_exp_functor_name(/\, 2, 'Fct_Fast_And'). fast_exp_functor_name(\/, 2, 'Fct_Fast_Or'). fast_exp_functor_name(^, 2, 'Fct_Fast_Xor'). fast_exp_functor_name(\, 1, 'Fct_Fast_Not'). fast_exp_functor_name(<<, 2, 'Fct_Fast_Shl'). fast_exp_functor_name(>>, 2, 'Fct_Fast_Shr'). fast_exp_functor_name(abs, 1, 'Fct_Fast_Abs'). fast_exp_functor_name(sign, 1, 'Fct_Fast_Sign'). math_exp_functor_name(-, 1, 'Fct_Neg'). math_exp_functor_name(inc, 1, 'Fct_Inc'). math_exp_functor_name(dec, 1, 'Fct_Dec'). math_exp_functor_name(+, 2, 'Fct_Add'). math_exp_functor_name(-, 2, 'Fct_Sub'). math_exp_functor_name(*, 2, 'Fct_Mul'). math_exp_functor_name(//, 2, 'Fct_Div'). math_exp_functor_name(/, 2, 'Fct_Float_Div'). math_exp_functor_name(rem, 2, 'Fct_Rem'). math_exp_functor_name(mod, 2, 'Fct_Mod'). math_exp_functor_name(/\, 2, 'Fct_And'). math_exp_functor_name(\/, 2, 'Fct_Or'). math_exp_functor_name(^, 2, 'Fct_Xor'). math_exp_functor_name(\, 1, 'Fct_Not'). math_exp_functor_name(<<, 2, 'Fct_Shl'). math_exp_functor_name(>>, 2, 'Fct_Shr'). math_exp_functor_name(abs, 1, 'Fct_Abs'). math_exp_functor_name(sign, 1, 'Fct_Sign'). math_exp_functor_name(min, 2, 'Fct_Min'). math_exp_functor_name(max, 2, 'Fct_Max'). math_exp_functor_name(**, 2, 'Fct_Pow'). math_exp_functor_name(sqrt, 1, 'Fct_Sqrt'). math_exp_functor_name(atan, 1, 'Fct_Atan'). math_exp_functor_name(cos, 1, 'Fct_Cos'). math_exp_functor_name(acos, 1, 'Fct_Acos'). math_exp_functor_name(sin, 1, 'Fct_Sin'). math_exp_functor_name(asin, 1, 'Fct_Asin'). math_exp_functor_name(exp, 1, 'Fct_Exp'). math_exp_functor_name(log, 1, 'Fct_Log'). math_exp_functor_name(float, 1, 'Fct_Float'). math_exp_functor_name(ceiling, 1, 'Fct_Ceiling'). math_exp_functor_name(floor, 1, 'Fct_Floor'). math_exp_functor_name(round, 1, 'Fct_Round'). math_exp_functor_name(truncate, 1, 'Fct_Truncate'). math_exp_functor_name(float_fractional_part, 1, 'Fct_Float_Fract_Part'). math_exp_functor_name(float_integer_part, 1, 'Fct_Float_Integ_Part'). gen_inline_pred(F, 2, LArg, WamNext, WamMath) :- ( g_read(fast_math, t) -> fast_cmp_functor_name(F, Name) ; math_cmp_functor_name(F, Name) ), load_math_arg_lst(LArg, LValue, WamInst, WamMath), WamInst = [call_c(Name, [fast_call, boolean], LValue)|WamNext]. fast_cmp_functor_name(=:=, 'Blt_Fast_Eq'). fast_cmp_functor_name(=\=, 'Blt_Fast_Neq'). fast_cmp_functor_name(<, 'Blt_Fast_Lt'). fast_cmp_functor_name(=<, 'Blt_Fast_Lte'). fast_cmp_functor_name(>, 'Blt_Fast_Gt'). fast_cmp_functor_name(>=, 'Blt_Fast_Gte'). math_cmp_functor_name(=:=, 'Blt_Eq'). math_cmp_functor_name(=\=, 'Blt_Neq'). math_cmp_functor_name(<, 'Blt_Lt'). math_cmp_functor_name(=<, 'Blt_Lte'). math_cmp_functor_name(>, 'Blt_Gt'). math_cmp_functor_name(>=, 'Blt_Gte'). % foreign C call gen_inline_pred('$foreign_call_c', 1, [args(FctName, Return, BipPred, ChcSize, LType)], WamNext, WamInst) :- WamInst = [foreign_call_c(FctName, Return, BipPred, ChcSize, LType)|WamNext]. % call_c/3 management predicates load_c_call_args(LCOpt, LArg, LValue, WamNext, WamArg) :- memberchk(by_value, LCOpt), load_by_value_arg_lst(LArg, LValue, WamNext, WamArg), !. load_c_call_args(_, LArg, LValue, WamNext, WamArg) :- load_by_reg_arg_lst(LArg, LValue, WamNext, WamArg), !. load_by_reg_arg_lst([], [], WamNext, WamNext). load_by_reg_arg_lst([Arg|LArg], [x(Reg)|LReg], WamNext, WamArg) :- gen_load_arg(Arg, Reg, WamLArg, WamArg), load_by_reg_arg_lst(LArg, LReg, WamNext, WamLArg). load_by_value_arg_lst([], [], WamNext, WamNext). load_by_value_arg_lst([Arg|LArg], [Value|LValue], WamNext, WamArg) :- load_by_value_arg(Arg, Value, WamLArg, WamArg), load_by_value_arg_lst(LArg, LValue, WamNext, WamLArg). load_by_value_arg(atm(A), A, WamNext, WamNext). load_by_value_arg(int(N), N, WamNext, WamNext). load_by_value_arg(flt(N), N, WamNext, WamNext). load_by_value_arg(nil, [], WamNext, WamNext). load_by_value_arg(stc('/', 2, [atm(F), int(N)]), F/N, WamNext, WamNext). load_by_value_arg(Arg, x(Reg), WamArg, WamNext) :- gen_load_arg(Arg, Reg, WamArg, WamNext). % Other inlines gen_inline_pred(F, N, LArg, WamNext, WamCallC) :- c_fct_name(F, N, Name, RetType), ( RetType = bool -> LCOpt = [fast_call, boolean] ; LCOpt = [fast_call] ), load_c_call_args(LCOpt, LArg, LValue, WamInst, WamCallC), WamInst = [call_c(Name, LCOpt, LValue)|WamNext]. c_fct_name(var, 1, 'Blt_Var', bool). c_fct_name(nonvar, 1, 'Blt_Non_Var', bool). c_fct_name(atom, 1, 'Blt_Atom', bool). c_fct_name(integer, 1, 'Blt_Integer', bool). c_fct_name(float, 1, 'Blt_Float', bool). c_fct_name(number, 1, 'Blt_Number', bool). c_fct_name(atomic, 1, 'Blt_Atomic', bool). c_fct_name(compound, 1, 'Blt_Compound', bool). c_fct_name(callable, 1, 'Blt_Callable', bool). c_fct_name(list, 1, 'Blt_List', bool). c_fct_name(partial_list, 1, 'Blt_Partial_List', bool). c_fct_name(list_or_partial_list, 1, 'Blt_List_Or_Partial_List', bool). c_fct_name(fd_var, 1, 'Blt_Fd_Var', bool). c_fct_name(non_fd_var, 1, 'Blt_Non_Fd_Var', bool). c_fct_name(generic_var, 1, 'Blt_Generic_Var', bool). c_fct_name(non_generic_var, 1, 'Blt_Non_Generic_Var', bool). c_fct_name(arg, 3, 'Blt_Arg', bool). c_fct_name(functor, 3, 'Blt_Functor', bool). c_fct_name(compare, 3, 'Blt_Compare', bool). c_fct_name(=.., 2, 'Blt_Univ', bool). c_fct_name(==, 2, 'Blt_Term_Eq', bool). c_fct_name(\==, 2, 'Blt_Term_Neq', bool). c_fct_name(@<, 2, 'Blt_Term_Lt', bool). c_fct_name(@=<, 2, 'Blt_Term_Lte', bool). c_fct_name(@>, 2, 'Blt_Term_Gt', bool). c_fct_name(@>=, 2, 'Blt_Term_Gte', bool). c_fct_name(g_assign, 2, 'Blt_G_Assign', void). c_fct_name(g_assignb, 2, 'Blt_G_Assignb', void). c_fct_name(g_link, 2, 'Blt_G_Link', void). c_fct_name(g_read, 2, 'Blt_G_Read', bool). c_fct_name(g_array_size, 2, 'Blt_G_Array_Size', bool). c_fct_name(g_inc, 1, 'Blt_G_Inc', void). c_fct_name(g_inco, 2, 'Blt_G_Inco', bool). c_fct_name(g_inc, 2, 'Blt_G_Inc_2', bool). c_fct_name(g_inc, 3, 'Blt_G_Inc_3', bool). c_fct_name(g_dec, 1, 'Blt_G_Dec', void). c_fct_name(g_deco, 2, 'Blt_G_Deco', bool). c_fct_name(g_dec, 2, 'Blt_G_Dec_2', bool). c_fct_name(g_dec, 3, 'Blt_G_Dec_3', bool). c_fct_name(g_set_bit, 2, 'Blt_G_Set_Bit', void). c_fct_name(g_reset_bit, 2, 'Blt_G_Reset_Bit', void). c_fct_name(g_test_set_bit, 2, 'Blt_G_Test_Set_Bit', bool). c_fct_name(g_test_reset_bit, 2, 'Blt_G_Test_Reset_Bit', bool). ./gprolog-1.3.0/src/Pl2Wam/reg_alloc.pl0000644004425400513100000003315010547162440016153 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog to WAM compiler * * File : reg_alloc.pl * * Descr.: pass 4: register allocation * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: reg_alloc.pl,v 1.12 2007/01/04 10:34:06 diaz Exp $ */ /*-------------------------------------------------------------------------* * The main predicate is: * * allocate_registers(LInstW) ou allocate_registers(LInstW,MaxRegUsed): * * where LInstW is a list of instructions. * * and MaxRegUsed is an integer corresponding to the greatest register * * used (-1 if none or n>=0 if reg0...regMaxRegUsed are used). * * * * Two predicates must be provided in addition to the allocater: * * * * codification(InstW, LCode): * * defines the action of InstW on the registers as a list LCode of codes* * c(R1, R2) (copy R1 into R2), r(R) (read R) or w(R) (write R). * * * * alias_stop_instruction(InstW): * * true if InstW stop aliasing propagation. * * * * Terminology: * * Arg: Arg is an argument iff integer(Arg) * * Tmp: Tmp is a temporary iff var(Tmp) * * Reg: Reg is a register if it is either an argument or a temporary. * * * * This allocation proceeds in 3 steps: * * * * 1) computing aliases (i.e. list of same values at entry of each inst): * * LAlias is a list of aliases (one for each instruction) * * LAlias = [Alias,...] * * The aliases (Alias) are represented as a set of same values (LSame) * * Alias = [LSame,...]. * * each LSame is a set of Regs (integers or variables) * * eg Alias = [[1,2,X,Y],[3,Z,4]] means 1,2,X,Y are aliased, 3,Z,4 also* * * * 2) computing the list of temporaries LTmp=[tmp(Tmp, Imposs, Wish),...] * * where Imposs is a set of impossible values and Wish a set of wanted * * values (to give rise to useless copy instructions). * * The code is traversed in reverse order, computing at each time the * * set of Regs in life (InLife) (see PhD Thesis of Mats Carlsson). * * * * 3) Each Tmp in LTmp is assigned w.r.t. to Wish and Imposs in 2 steps: * * * * a) from [tmp(Tmp, Imposs, Wish)|LTmp]: * * * * while there exists Tmpj in Wish and not in Imposs: * * let tmp(Tmpj, Impossj, Wishj) be the associated record in LTmp* * Imposs := Imposs + Impossj and Wish := Wish + Wishj, * * LTmp := LTmp-tmp(Tmpj, Impossj, Wishj) (remove Tmpj from LTmp)* * Tmpj = Tmp (unify them) * * * * At the end of the loop: * * if there exists an integer k in Wish-Imposs then (see NB below) * * Tmp = k else replace tmp(Tmp, Imposs, Wish) in LTmp * * * * b) for each Tmp remaining in LTmp assign a value w.r.t to Imposs * * by chosing the first integer not present in Imposs (after sort) * * * * NB: it seems, from the construction, that, in Wish, only remains * * possible values so the compl(Wish, Imposs, AssignOK) would be useless, * * but I have to check this in depth. * *-------------------------------------------------------------------------*/ allocate_registers(LInstW) :- allocate_registers(LInstW, _). allocate_registers(LInstW, MaxRegUsed) :- g_read(reg_opt, OptReg), ( OptReg > 0 -> aliases(LInstW, [], LAlias) ; true ), create_lst_tmp(LInstW, LAlias, _, LTmp), assign_lst_tmp(LTmp, MaxRegUsed). % Aliasing information creation aliases([], _, []). aliases([InstW|LInstW], Alias, [Alias|LAlias]) :- ( alias_stop_instruction(InstW) -> Alias1 = [] ; codification(InstW, LCode), aliases1(LCode, Alias, Alias1) ), !, aliases(LInstW, Alias1, LAlias). aliases1([], Alias, Alias). aliases1([Code|LCode], Alias, Alias3) :- ( Code = r(Reg), Alias2 = Alias ; Code = w(Reg), remove_aliases_of(Alias, Reg, Alias2) ; Code = c(Reg, Reg1), remove_aliases_of(Alias, Reg1, Alias1), add_alias(Alias1, Reg, Reg1, Alias2) ), !, aliases1(LCode, Alias2, Alias3). add_alias([], Reg, Reg1, [[Reg, Reg1]]). add_alias([LSame|Alias], Reg, Reg1, [LSame1|Alias1]) :- ( set_elt(LSame, Reg) -> set_add(LSame, Reg1, LSame1), Alias1 = Alias ; LSame1 = LSame, add_alias(Alias, Reg, Reg1, Alias1) ). find_aliases_of([LSame|Alias], Reg, LSame1) :- ( set_delete(LSame, Reg, LSame1) -> true ; find_aliases_of(Alias, Reg, LSame1) ). remove_aliases_of([], _, []). remove_aliases_of([LSame|Alias], Reg, Alias1) :- ( set_delete(LSame, Reg, LSame1) -> ( ( LSame1 = [] ; LSame1 = [_] ) -> Alias1 = Alias ; Alias1 = [LSame1|Alias] ) ; Alias1 = [LSame|Alias2], remove_aliases_of(Alias, Reg, Alias2) ). % Temporaries dictionnary creation (lifetime analysis) create_lst_tmp([], [], [], []). create_lst_tmp([InstW|LInstW], [Alias|LAlias], InLife1, LTmp1) :- create_lst_tmp(LInstW, LAlias, InLife, LTmp), codification(InstW, LCode), !, handle_lst_code(LCode, Alias, InLife, InLife1, LTmp, LTmp1). handle_lst_code([], _, InLife, InLife, LTmp, LTmp). handle_lst_code([Code|LCode], Alias, InLife, InLife2, LTmp, LTmp2) :- handle_lst_code(LCode, Alias, InLife, InLife1, LTmp, LTmp1), handle_one_code(Code, Alias, [], InLife1, InLife2, LTmp1, LTmp2). handle_one_code(r(Reg), Alias, Wish, InLife, InLife1, LTmp, LTmp2) :- ( set_elt(InLife, Reg) -> InLife1 = InLife, ( var(Reg), Wish \== [] -> update_tmp(LTmp, Reg, [], Wish, LTmp2) ; LTmp2 = LTmp ) ; InLife1 = [Reg|InLife], constraints(Reg, InLife, Alias, Cstr), make_imposs(Cstr, [Reg], LTmp, LTmp1), ( var(Reg) -> update_tmp(LTmp1, Reg, Cstr, Wish, LTmp2) ; LTmp2 = LTmp1 ) ). handle_one_code(w(Reg), Alias, Wish, InLife, InLife1, LTmp, LTmp2) :- ( set_delete(InLife, Reg, InLife1) -> ( var(Reg), Wish \== [] -> update_tmp(LTmp, Reg, [], Wish, LTmp2) ; LTmp2 = LTmp ) ; InLife1 = InLife, ( var(Reg) -> constraints(Reg, InLife1, Alias, Cstr), ( Wish \== [] -> set_diff(Cstr, Wish, Cstr1) ; Cstr1 = Cstr ), make_imposs(Cstr1, [Reg], LTmp, LTmp1), update_tmp(LTmp1, Reg, Cstr1, Wish, LTmp2) ; LTmp2 = LTmp ) ). handle_one_code(c(Reg, Reg1), Alias, _, InLife, InLife2, LTmp, LTmp2) :- handle_one_code(w(Reg1), Alias, [Reg], InLife, InLife1, LTmp, LTmp1), handle_one_code(r(Reg), Alias, [Reg1], InLife1, InLife2, LTmp1, LTmp2). constraints(Reg, InLife, Alias, Cstr) :- ( g_read(reg_opt, 2), find_aliases_of(Alias, Reg, LSame) -> set_diff(InLife, LSame, Cstr) ; Cstr = InLife ). update_tmp([], Reg, Imposs, Wish, [tmp(Reg, Imposs, Wish)]). update_tmp([Tmp|LTmp], Reg, Imposs, Wish, [Tmp1|LTmp1]) :- Tmp = tmp(Reg1, Imposs1, Wish1), ( Reg == Reg1 -> set_union(Imposs, Imposs1, Imposs2), set_union(Wish, Wish1, Wish2), Tmp1 = tmp(Reg, Imposs2, Wish2), LTmp1 = LTmp ; Tmp1 = Tmp, update_tmp(LTmp, Reg, Imposs, Wish, LTmp1) ). remove_tmp([T|LTmp], Reg, Imposs, Wish, LTmp2) :- T = tmp(Reg1, Imposs1, Wish1), ( Reg == Reg1 -> Imposs = Imposs1, Wish = Wish1, LTmp2 = LTmp ; LTmp2 = [T|LTmp1], remove_tmp(LTmp, Reg, Imposs, Wish, LTmp1) ). make_imposs([], _, LTmp, LTmp). make_imposs([Reg|Cstr], Imposs, LTmp, LTmp2) :- ( var(Reg) -> update_tmp(LTmp, Reg, Imposs, [], LTmp1) ; LTmp1 = LTmp ), make_imposs(Cstr, Imposs, LTmp1, LTmp2). % Register assignment assign_lst_tmp(LTmp, MaxRegUsed) :- g_read(reg_opt, OptReg), ( OptReg = 2 -> assign_wishes(LTmp, LTmp1) ; no_wish(LTmp, OptReg, LTmp1) ), assign_values(LTmp1, -1, MaxRegUsed). assign_wishes([], []). assign_wishes([tmp(Tmp, Imposs, Wish)|LTmp], LTmp3) :- collapse_tmps(Wish, Imposs, LTmp, Tmp, Wish1, Imposs1, LTmp1), try_a_whish(Tmp, Imposs1, Wish1), ( var(Tmp) -> LTmp3 = [tmp(Tmp, Imposs1)|LTmp2] % no longer wish in tmp() ; LTmp3 = LTmp2 ), assign_wishes(LTmp1, LTmp2). collapse_tmps([], Imposs, LTmp, _, [], Imposs, LTmp). collapse_tmps([Reg|Wish], Imposs, LTmp, Tmp, Wish1, Imposs1, LTmp1) :- ( Reg == Tmp ; set_elt(Imposs, Reg) ), !, collapse_tmps(Wish, Imposs, LTmp, Tmp, Wish1, Imposs1, LTmp1). collapse_tmps([Arg|Wish], Imposs, LTmp, Tmp, [Arg|Wish1], Imposs1, LTmp1) :- integer(Arg), !, collapse_tmps(Wish, Imposs, LTmp, Tmp, Wish1, Imposs1, LTmp1). collapse_tmps([Tmp1|Wish], Imposs, LTmp, Tmp, Wish3, Imposs3, LTmp2) :- remove_tmp(LTmp, Tmp1, Imposs1, Wish1, LTmp1), set_union(Imposs, Imposs1, Imposs2), set_union(Wish, Wish1, Wish2), Tmp = Tmp1, collapse_tmps(Wish2, Imposs2, LTmp1, Tmp, Wish3, Imposs3, LTmp2). try_a_whish(Tmp, Imposs, Wish) :- set_diff(Wish, Imposs, [Tmp|_]), !. try_a_whish(_, _, _). no_wish([], _, []). no_wish([tmp(Tmp, Imposs, Wish)|LTmp], OptReg, [tmp(Tmp, Imposs1)|LTmp1]) :- ( OptReg = 0 -> set_union(Imposs, Wish, Imposs1) % no optimizations at all ; Imposs1 = Imposs ), % for some optimizations no_wish(LTmp, OptReg, LTmp1). assign_values([], MaxRegUsed, MaxRegUsed). assign_values([tmp(Tmp, Imposs)|LTmp], MaxRegUsed, MaxRegUsed2) :- sort(Imposs, Imposs1), find_hole(Imposs1, 0, Tmp), ( Tmp > MaxRegUsed -> MaxRegUsed1 = Tmp ; MaxRegUsed1 = MaxRegUsed ), assign_values(LTmp, MaxRegUsed1, MaxRegUsed2). find_hole([], Nb, Nb). find_hole([Reg|Imposs], Nb, Nb1) :- var(Reg), !, find_hole(Imposs, Nb, Nb1). find_hole([Reg|Imposs], Nb, Nb2) :- ( Reg > Nb -> Nb2 = Nb % hole found ; ( Reg == Nb -> Nb1 is Nb + 1 ; Nb1 = Nb ), find_hole(Imposs, Nb1, Nb2) ). % Set handling (without unification) set_add([], X, [X]). set_add([Y|L], X, [Y|L]) :- X == Y, !. set_add([Y|L], X, [Y|L1]) :- set_add(L, X, L1). set_delete([Y|L], X, L) :- % set_delete(L,X,L1) fails if X == Y, % X does not belong to L !. set_delete([Y|L], X, [Y|L1]) :- set_delete(L, X, L1). set_elt([Y|_], X) :- X == Y, !. set_elt([_|L], X) :- set_elt(L, X). set_inter([], _, []). set_inter([X|L1], L2, [X|L3]) :- set_elt(L2, X), !, set_inter(L1, L2, L3). set_inter([_|L1], L2, L3) :- set_inter(L1, L2, L3). set_union([], L2, L2). set_union([X|L1], L2, L3) :- set_elt(L2, X), !, set_union(L1, L2, L3). set_union([X|L1], L2, [X|L3]) :- set_union(L1, L2, L3). set_diff([], _, []). set_diff([X|L], L1, L3) :- ( set_elt(L1, X) -> L3 = L2 ; L3 = [X|L2] ), set_diff(L, L1, L2). ./gprolog-1.3.0/src/Pl2Wam/bip_list.pl0000644004425400513100000002611310547162440016032 0ustar diazloco/* this file is automatically generated by make_bip_list.pl */ % defined in /home/diaz/GP/src/src/BipsPl/all_solut.pl bip(bagof,3). bip(setof,3). bip(findall,3). % defined in /home/diaz/GP/src/src/BipsPl/arith_inl.pl bip(>=,2). bip(<,2). bip(>,2). bip(=\=,2). bip(=:=,2). bip(is,2). bip(=<,2). % defined in /home/diaz/GP/src/src/BipsPl/assert.pl bip(retractall,1). bip(assertz,1). bip(asserta,1). bip(retract,1). bip(abolish,1). bip(clause,2). % defined in /home/diaz/GP/src/src/BipsPl/atom.pl bip(char_code,2). bip(lower_upper,2). bip(current_atom,1). bip(name,2). bip(number_codes,2). bip(atom_codes,2). bip(atom_length,2). bip(atom_property,2). bip(number_chars,2). bip(new_atom,1). bip(new_atom,2). bip(new_atom,3). bip(number_atom,2). bip(atom_chars,2). bip(atom_concat,3). bip(atom_hash,2). bip(sub_atom,5). % defined in /home/diaz/GP/src/src/BipsPl/call.pl bip(call_det,2). bip(once,1). bip(\+,1). % defined in /home/diaz/GP/src/src/BipsPl/call_args.pl bip(call,2). bip(call,3). bip(call,4). bip(call,5). bip(call,6). bip(call,7). bip(call,8). bip(call,9). bip(call,10). bip(call,11). bip(call_with_args,1). bip(call_with_args,2). bip(call_with_args,3). bip(call_with_args,4). bip(call_with_args,5). bip(call_with_args,6). bip(call_with_args,7). bip(call_with_args,8). bip(call_with_args,9). bip(call_with_args,10). bip(call_with_args,11). % defined in /home/diaz/GP/src/src/BipsPl/char_io.pl bip(get_char,1). bip(get_char,2). bip(get_code,1). bip(get_code,2). bip(unget_byte,1). bip(unget_byte,2). bip(put_char,1). bip(put_char,2). bip(get_key,1). bip(get_key,2). bip(peek_code,1). bip(peek_code,2). bip(put_code,1). bip(put_code,2). bip(peek_char,1). bip(peek_char,2). bip(get_byte,1). bip(get_byte,2). bip(unget_char,1). bip(unget_char,2). bip(unget_code,1). bip(unget_code,2). bip(peek_byte,1). bip(peek_byte,2). bip(put_byte,1). bip(put_byte,2). bip(get_key_no_echo,1). bip(get_key_no_echo,2). % defined in /home/diaz/GP/src/src/BipsPl/const_io.pl bip(write_canonical_to_atom,2). bip(write_term_to_chars,3). bip(write_term_to_codes,3). bip(write_to_atom,2). bip(display_to_atom,2). bip(display_to_codes,2). bip(read_term_from_atom,3). bip(print_to_atom,2). bip(read_term_from_codes,3). bip(write_term_to_atom,3). bip(write_to_codes,2). bip(display_to_chars,2). bip(print_to_codes,2). bip(read_token_from_atom,2). bip(read_token_from_chars,2). bip(read_from_atom,2). bip(read_from_codes,2). bip(read_from_chars,2). bip(write_canonical_to_codes,2). bip(write_to_chars,2). bip(print_to_chars,2). bip(read_token_from_codes,2). bip(write_canonical_to_chars,2). bip(writeq_to_atom,2). bip(writeq_to_codes,2). bip(writeq_to_chars,2). bip(read_term_from_chars,3). bip(format_to_atom,3). bip(format_to_codes,3). bip(format_to_chars,3). % defined in /home/diaz/GP/src/src/BipsPl/consult.pl bip('.',2). bip(consult,1). bip(listing,0). bip(listing,1). bip(load,1). % defined in /home/diaz/GP/src/src/BipsPl/control.pl bip(abort,0). bip(repeat,0). bip(stop,0). bip(halt,0). bip(halt,1). bip(for,3). % defined in /home/diaz/GP/src/src/BipsPl/debugger.pl bip(spypoint_condition,3). bip(nospy,1). bip(notrace,0). bip(debugging,0). bip(spy,1). bip(leash,1). bip(wam_debug,0). bip(nodebug,0). bip(trace,0). bip(debug,0). bip(nospyall,0). % defined in /home/diaz/GP/src/src/BipsPl/dec10io.pl bip(told,0). bip(tab,1). bip(put,1). bip(seeing,1). bip(tell,1). bip(seen,0). bip(see,1). bip(append,1). bip(telling,1). bip(skip,1). bip(get,1). bip(get0,1). % defined in /home/diaz/GP/src/src/BipsPl/expand.pl bip(expand_term,2). bip(phrase,2). bip(phrase,3). % defined in /home/diaz/GP/src/src/BipsPl/file.pl bip(decompose_file_name,4). bip(absolute_file_name,2). bip(prolog_file_name,2). % defined in /home/diaz/GP/src/src/BipsPl/flag.pl bip(read_pl_state_file,1). bip(argument_counter,1). bip(write_pl_state_file,1). bip(argument_value,2). bip(set_prolog_flag,2). bip(current_prolog_flag,2). bip(argument_list,1). bip(environ,2). % defined in /home/diaz/GP/src/src/BipsPl/format.pl bip(format,2). bip(format,3). % defined in /home/diaz/GP/src/src/BipsPl/g_var_inl.pl bip(g_test_set_bit,2). bip(g_inc,1). bip(g_inc,2). bip(g_inc,3). bip(g_deco,2). bip(g_assign,2). bip(g_assignb,2). bip(g_set_bit,2). bip(g_inco,2). bip(g_test_reset_bit,2). bip(g_reset_bit,2). bip(g_dec,1). bip(g_dec,2). bip(g_dec,3). bip(g_array_size,2). bip(g_read,2). bip(g_link,2). % defined in /home/diaz/GP/src/src/BipsPl/le_interf.pl bip(add_linedit_completion,1). bip(find_linedit_completion,2). bip(get_linedit_prompt,1). bip(set_linedit_prompt,1). % defined in /home/diaz/GP/src/src/BipsPl/list.pl bip(reverse,2). bip(nth,3). bip(min_list,2). bip(permutation,2). bip(sum_list,2). bip(prefix,2). bip(last,2). bip(suffix,2). bip(sublist,2). bip(select,3). bip(append,3). bip(delete,3). bip(memberchk,2). bip(length,2). bip(member,2). bip(max_list,2). % defined in /home/diaz/GP/src/src/BipsPl/oper.pl bip(current_op,3). bip(op,3). % defined in /home/diaz/GP/src/src/BipsPl/os_interf.pl bip(host_name,1). bip(directory_files,2). bip(exec,5). bip(exec,4). bip(working_directory,1). bip(file_exists,1). bip(temporary_file,3). bip(architecture,1). bip(wait,2). bip(delete_file,1). bip(change_directory,1). bip(date_time,1). bip(select,5). bip(popen,3). bip(make_directory,1). bip(system,1). bip(system,2). bip(unlink,1). bip(os_version,1). bip(create_pipe,2). bip(file_property,2). bip(delete_directory,1). bip(spawn,2). bip(spawn,3). bip(sleep,1). bip(prolog_pid,1). bip(temporary_name,2). bip(shell,0). bip(shell,1). bip(shell,2). bip(rename_file,2). bip(file_permission,2). bip(send_signal,2). bip(fork_prolog,1). % defined in /home/diaz/GP/src/src/BipsPl/pl_error.pl bip(current_bip_name,2). bip(set_bip_name,2). bip(syntax_error_info,4). % defined in /home/diaz/GP/src/src/BipsPl/pred.pl bip(current_predicate,1). bip(predicate_property,2). % defined in /home/diaz/GP/src/src/BipsPl/pretty.pl bip(name_query_vars,2). bip(name_singleton_vars,1). bip(bind_variables,2). bip(numbervars,1). bip(numbervars,3). bip(portray_clause,1). bip(portray_clause,2). % defined in /home/diaz/GP/src/src/BipsPl/print.pl bip(get_print_stream,1). bip(print,1). bip(print,2). % defined in /home/diaz/GP/src/src/BipsPl/random.pl bip(get_seed,1). bip(set_seed,1). bip(randomize,0). bip(random,1). bip(random,3). % defined in /home/diaz/GP/src/src/BipsPl/read.pl bip(char_conversion,2). bip(read_number,1). bip(read_number,2). bip(read_token,1). bip(read_token,2). bip(read_integer,1). bip(read_integer,2). bip(read_term,2). bip(read_term,3). bip(current_char_conversion,2). bip(read_atom,1). bip(read_atom,2). bip(read,1). bip(read,2). bip(last_read_start_line_column,2). % defined in /home/diaz/GP/src/src/BipsPl/sockets.pl bip(socket_close,1). bip(socket_bind,2). bip(socket_connect,4). bip(socket,2). bip(socket_accept,3). bip(socket_accept,4). bip(hostname_address,2). bip(socket_listen,2). % defined in /home/diaz/GP/src/src/BipsPl/sort.pl bip(keysort,2). bip(keysort,1). bip(sort,2). bip(sort,1). bip(sort0,2). bip(sort0,1). % defined in /home/diaz/GP/src/src/BipsPl/src_rdr.pl bip(sr_change_options,2). bip(sr_get_size_counters,3). bip(sr_open,3). bip(sr_current_descriptor,1). bip(sr_get_include_list,2). bip(sr_get_file_name,2). bip(sr_write_error,2). bip(sr_write_error,4). bip(sr_write_error,6). bip(sr_close,1). bip(sr_read_term,4). bip(sr_error_from_exception,2). bip(sr_get_error_counters,3). bip(sr_set_error_counters,3). bip(sr_get_stream,2). bip(sr_get_position,3). bip(sr_get_include_stream_list,2). bip(sr_new_pass,1). bip(sr_write_message,4). bip(sr_write_message,6). bip(sr_write_message,8). bip(sr_get_module,3). % defined in /home/diaz/GP/src/src/BipsPl/stat.pl bip(system_time,1). bip(real_time,1). bip(statistics,0). bip(statistics,2). bip(cpu_time,1). bip(user_time,1). % defined in /home/diaz/GP/src/src/BipsPl/stream.pl bip(close,1). bip(close,2). bip(stream_line_column,3). bip(stream_property,2). bip(open_input_codes_stream,2). bip(flush_output,0). bip(flush_output,1). bip(current_input,1). bip(seek,4). bip(set_stream_buffering,2). bip(open_input_chars_stream,2). bip(open_output_chars_stream,1). bip(close_input_chars_stream,1). bip(stream_position,2). bip(open_output_atom_stream,1). bip(close_input_atom_stream,1). bip(at_end_of_stream,0). bip(at_end_of_stream,1). bip(character_count,2). bip(open_input_atom_stream,2). bip(set_stream_type,2). bip(set_output,1). bip(add_stream_alias,2). bip(current_stream,1). bip(set_stream_eof_action,2). bip(set_input,1). bip(current_alias,2). bip(open_output_codes_stream,1). bip(line_position,2). bip(current_output,1). bip(line_count,2). bip(close_input_codes_stream,1). bip(open,3). bip(open,4). bip(close_output_chars_stream,2). bip(close_output_codes_stream,2). bip(set_stream_line_column,3). bip(set_stream_position,2). bip(close_output_atom_stream,2). bip(current_mirror,2). bip(add_stream_mirror,2). bip(remove_stream_mirror,2). % defined in /home/diaz/GP/src/src/BipsPl/term_inl.pl bip(==,2). bip(functor,3). bip(@>,2). bip(setarg,3). bip(setarg,4). bip(=..,2). bip(copy_term,2). bip(term_ref,2). bip(compare,3). bip(@=<,2). bip(\==,2). bip(@>=,2). bip(arg,3). bip(@<,2). % defined in /home/diaz/GP/src/src/BipsPl/top_level.pl bip(top_level,0). bip(break,0). % defined in /home/diaz/GP/src/src/BipsPl/type_inl.pl bip(list_or_partial_list,1). bip(atomic,1). bip(number,1). bip(integer,1). bip(atom,1). bip(partial_list,1). bip(list,1). bip(var,1). bip(compound,1). bip(callable,1). bip(float,1). bip(nonvar,1). % defined in /home/diaz/GP/src/src/BipsPl/unify.pl bip(\=,2). bip(=,2). bip(unify_with_occurs_check,2). % defined in /home/diaz/GP/src/src/BipsPl/write.pl bip(writeq,1). bip(writeq,2). bip(write_canonical,1). bip(write_canonical,2). bip(display,1). bip(display,2). bip(nl,0). bip(nl,1). bip(write_term,2). bip(write_term,3). bip(write,1). bip(write,2). % defined in /home/diaz/GP/src/src/BipsFD/fd_bool.pl bip(##,2). bip(fd_at_least_one,1). bip(#\<=>,2). bip(#/\,2). bip(#\==>,2). bip(fd_only_one,1). bip(#<=>,2). bip(#\,1). bip(#==>,2). bip(#\/\,2). bip(fd_at_most_one,1). bip(fd_cardinality,2). bip(fd_cardinality,3). bip(#\/,2). bip(#\\/,2). % defined in /home/diaz/GP/src/src/BipsFD/fd_infos.pl bip(fd_vector_max,1). bip(fd_size,2). bip(fd_has_extra_cstr,1). bip(fd_set_vector_max,1). bip(fd_min,2). bip(fd_dom,2). bip(fd_use_vector,1). bip(fd_max_integer,1). bip(fd_has_vector,1). bip(fd_max,2). % defined in /home/diaz/GP/src/src/BipsFD/fd_math.pl bip(#=,2). bip(#>,2). bip(#\=,2). bip(#=<#,2). bip(#>=#,2). bip(#=<,2). bip(#\=#,2). bip(#>=,2). bip(#<#,2). bip(#=#,2). bip(#>#,2). bip(#<,2). % defined in /home/diaz/GP/src/src/BipsFD/fd_optim.pl bip(fd_minimize,2). bip(fd_maximize,2). % defined in /home/diaz/GP/src/src/BipsFD/fd_prime.pl bip(fd_prime,1). bip(fd_not_prime,1). % defined in /home/diaz/GP/src/src/BipsFD/fd_symbolic.pl bip(fd_relation,2). bip(fd_relationc,2). bip(fd_all_different,1). bip(fd_exactly,3). bip(fd_element_var,3). bip(fd_atleast,3). bip(fd_element,3). bip(fd_atmost,3). % defined in /home/diaz/GP/src/src/BipsFD/fd_values.pl bip(fd_labelingff,1). bip(fd_domain_bool,1). bip(fd_domain,2). bip(fd_domain,3). bip(fd_labeling,1). bip(fd_labeling,2). % defined in /home/diaz/GP/src/src/BipsPl/type_inl.pl bip(fd_var,1). bip(generic_var,1). bip(non_generic_var,1). bip(non_fd_var,1). ./gprolog-1.3.0/src/Pl2Wam/internal.pl0000644004425400513100000002372510547162440016047 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog to WAM compiler * * File : internal.pl * * Descr.: pass 2: internal format transformation * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: internal.pl,v 1.14 2007/01/04 10:34:06 diaz Exp $ */ /*-------------------------------------------------------------------------* * predicate internal format: (I(t)=internal format of t) * * * * I(p(Arg1, ..., ArgN))= p(NoPred, Pred/N, [I(Arg1), ..., I(ArgN)]) * * * * NoPred : predicate number = corresponding chunk number * * * * Pred/N : predicate/arity * * * * I(Argi): internal format of the ith argument * * * * var : var(VarName, Info) with: * * VarName = x(NoX) temporary * * (here NoX is unbound or = void if var is singleton) * * y(NoY) permanent (NoY is assigned here) * * Info = in_heap: the variable is stored in the heap * * unsafe : the var refers current environment * * not_in_cur_env: the var does not reside in the * * current environment * * (here Info is unbound) * * * * atom [] : nil * * atom (others) : atm(atom) * * integer : int(integer) * * float : flt(float) * * f(A1, ..., An): stc(f, n, [I(A1), ..., I(An)]) ([H|T] = '.'(H, T)) * * * * NB: a true/0 in the body of a clause is removed. * * variables are classified and permanent variables are assigned * * (temporary = x(_), permanent = y(i)) * *-------------------------------------------------------------------------*/ internal_format(Head, Body, Head1, Body1, NbChunk, NbY) :- format_head(Head, DicoVar, Head1), format_body(Body, DicoVar, Body1, NbChunk), classif_vars(DicoVar, 0, NbY). format_head(Head, DicoVar, Head1) :- format_pred(Head, 0, DicoVar, Head1, _). format_body(Body, DicoVar, Body1, NbChunk) :- format_body1(Body, 0, DicoVar, t, [], Body1, NbChunk, _). format_body1((P, Q), NoPred, DicoVar, StartChunk, LNext, P1, NoPred2, StartChunk2) :- !, format_body1(P, NoPred, DicoVar, StartChunk, Q1, P1, NoPred1, StartChunk1), format_body1(Q, NoPred1, DicoVar, StartChunk1, LNext, Q1, NoPred2, StartChunk2). format_body1(true, NoPred, _, StartChunk, LNext, LNext, NoPred, StartChunk) :- !. format_body1(Pred, NoPred, DicoVar, StartChunk, LNext, [Pred1|LNext], NoPred1, StartChunk1) :- ( StartChunk = t -> NoPred1 is NoPred + 1 ; NoPred1 = NoPred ), format_pred(Pred, NoPred1, DicoVar, Pred1, InlinePred), ( InlinePred = t -> StartChunk1 = f ; StartChunk1 = t ). % NB: a dangerous '$call_c' (e.g. with jump) is not considered as % inlined to enforce the end of its chunk. If something comes % after this '$call_c' an environment will be created (allocate) % to save CP (and X regs in Y regs if needed). % Other '$call_c' are considered as inlined. format_pred(Pred, NoPred, DicoVar, p(NoPred, F / N, ArgLst1), InlinePred) :- functor(Pred, F, N), Pred =.. [_|ArgLst], format_arg_lst(ArgLst, NoPred, DicoVar, ArgLst1), ( ( inline_predicate(F, N) ; F = '$call_c', N = 2, ArgLst1 = [_, LCOpt], % $no_internal_transf$ removed here not_dangerous_c_call(LCOpt) ) -> InlinePred = t ; InlinePred = f ). format_arg_lst([], _, _, []). format_arg_lst([Arg|ArgLst], NoPred, DicoVar, [Arg1|ArgLst1]) :- format_arg(Arg, NoPred, DicoVar, Arg1), !, format_arg_lst(ArgLst, NoPred, DicoVar, ArgLst1). format_arg(Var, NoPred, DicoVar, V) :- var(Var), add_var_to_dico(DicoVar, Var, NoPred, V). format_arg(T, _, _, T1) :- no_internal_transf(T1, T). format_arg([], _, _, nil). format_arg(A, _, _, atm(A)) :- atom(A). format_arg(N, _, _, int(N)) :- integer(N). format_arg(N, _, _, flt(N)) :- float(N). format_arg(Fonc, NoPred, DicoVar, stc(F, N, ArgLst1)) :- functor(Fonc, F, N), Fonc =.. [_|ArgLst], format_arg_lst(ArgLst, NoPred, DicoVar, ArgLst1). % creates a term T1 equivalent to T which will not be transformed % in the internal format. This can only by used for arguments of % inlined predicates and requires T is ground. % % NB: do not use T1 = '$no_internal_transf$'(T) for bootstrapping. no_internal_transf(T, T1) :- functor(T1, '$no_internal_tranf$', 1), arg(1, T1, T). % DicoVar=[ v(Var, NoPred1stOcc, Singleton, V), ... | EndVar ] % % Singleton = f or unbound variable % V = var(VarName, VarInfo) % VarName = x(_) or y(_) % Info is unbound add_var_to_dico(DicoVar, Var, NoPred1stOcc, V) :- var(DicoVar), !, V = var(_, _), DicoVar = [v(Var, NoPred1stOcc, _, V)|_]. add_var_to_dico([v(Var1, NoPred1stOcc1, Singleton, V)|_], Var2, NoPred1stOcc2, V) :- Var1 == Var2, !, V = var(VarName, _), Singleton = f, ( var(VarName), NoPred1stOcc1 \== NoPred1stOcc2, NoPred1stOcc2 > 1 -> VarName = y(_) ; true ). add_var_to_dico([_|DicoVar], Var, NoPred1stOcc, V) :- add_var_to_dico(DicoVar, Var, NoPred1stOcc, V). classif_vars([], NbY, NbY) :- !. classif_vars([v(_, _, Singleton, var(VarName, _))|DicoVar], Y, NbY) :- var(VarName), !, ( var(Singleton) -> VarName = x(void) ; VarName = x(_) ), classif_vars(DicoVar, Y, NbY). classif_vars([v(_, _, _, var(y(Y), _))|DicoVar], Y, NbY) :- Y1 is Y + 1, classif_vars(DicoVar, Y1, NbY). % Inline predicates: inline_predicate(Pred,Arity) % all predicates defined here must have a corresponding clause % gen_inline_pred/5 in pass 3 describing their associated code inline_predicate(Pred, Arity) :- g_read(inline, Inline), inline_predicate(Pred, Arity, Inline). inline_predicate('$get_cut_level', 1, _). inline_predicate('$cut', 1, _). inline_predicate(=, 2, _). inline_predicate('$foreign_call_c', 1, _). inline_predicate(var, 1, t). inline_predicate(nonvar, 1, t). inline_predicate(atom, 1, t). inline_predicate(integer, 1, t). inline_predicate(float, 1, t). inline_predicate(number, 1, t). inline_predicate(atomic, 1, t). inline_predicate(compound, 1, t). inline_predicate(callable, 1, t). inline_predicate(list, 1, t). inline_predicate(partial_list, 1, t). inline_predicate(list_or_partial_list, 1, t). inline_predicate(fd_var, 1, t). inline_predicate(non_fd_var, 1, t). inline_predicate(generic_var, 1, t). inline_predicate(non_generic_var, 1, t). inline_predicate(functor, 3, t). inline_predicate(arg, 3, t). inline_predicate(compare, 3, t). inline_predicate(=.., 2, t). inline_predicate(==, 2, t). inline_predicate(\==, 2, t). inline_predicate(@<, 2, t). inline_predicate(@=<, 2, t). inline_predicate(@>, 2, t). inline_predicate(@>=, 2, t). inline_predicate(is, 2, t). inline_predicate(=:=, 2, t). inline_predicate(=\=, 2, t). inline_predicate(<, 2, t). inline_predicate(=<, 2, t). inline_predicate(>, 2, t). inline_predicate(>=, 2, t). inline_predicate(g_assign, 2, t). inline_predicate(g_assignb, 2, t). inline_predicate(g_link, 2, t). inline_predicate(g_read, 2, t). inline_predicate(g_array_size, 2, t). inline_predicate(g_inc, 1, t). inline_predicate(g_inco, 2, t). inline_predicate(g_inc, 2, t). inline_predicate(g_inc, 3, t). inline_predicate(g_dec, 1, t). inline_predicate(g_deco, 2, t). inline_predicate(g_dec, 2, t). inline_predicate(g_dec, 3, t). inline_predicate(g_set_bit, 2, t). inline_predicate(g_reset_bit, 2, t). inline_predicate(g_test_set_bit, 2, t). inline_predicate(g_test_reset_bit, 2, t). ./gprolog-1.3.0/src/Pl2Wam/compat.pl0000644004425400513100000000467310547162440015517 0ustar diazloco/* $Id: compat.pl,v 1.2 2001/09/17 16:01:51 diaz Exp $ */ :- op(0, fx, dynamic). :- op(0, fx, discontiguous). :- op(0, fx, multifile). prolog_file_name(PlFile, PlFile1) :- decompose_file_name(PlFile, _Dir, _Prefix, Suffix), ( ( PlFile = user ; Suffix \== '' ) -> PlFile1 = PlFile ; atom_concat(PlFile, '.pl', PlFile1) ). last_read_start_line_column(Line, Col) :- g_read('$last_line', Line), g_read('$last_col', Col). stream_line_column(Stream, Line, Col) :- line_count(Stream, Count), line_position(Stream, Pos), Line is Count + 1, Col is Pos + 1, g_assign('$last_line', Line), g_assign('$last_col', Col). date_time(dt(0, 0, 0, 0, 0, 0)). numbervars(T) :- numbervars(T, 0, _). decompose_file_name(Path, Dir, Prefix, Suffix) :- atom_length(Path, L), Before is L - 1, find_dir_and_file_name(Path, Before, Dir, FileName), ( sub_atom(FileName, LgPrefix, 1, _, '.') -> sub_atom(FileName, 0, LgPrefix, LgSuffix, Prefix), sub_atom(FileName, LgPrefix, LgSuffix, 0, Suffix) ; Prefix = FileName, Suffix = '' ), !. find_dir_and_file_name(Path, Before, '', Path) :- Before < 0, !. find_dir_and_file_name(Path, Before, Dir, FileName) :- sub_atom(Path, Before, 1, After, /), Before1 is Before + 1, sub_atom(Path, 0, Before1, _, Dir), sub_atom(Path, _, After, 0, FileName), !. find_dir_and_file_name(Path, Before, Dir, FileName) :- Before1 is Before - 1, find_dir_and_file_name(Path, Before1, Dir, FileName). number_atom(N, A) :- ( number(N) -> number_chars(N, LCode), atom_chars(A, LCode) ; atom_chars(A, LCode), number_chars(N, LCode) ). '$catch'(Goal, Catcher, Recovery, _, _, _) :- catch(Goal, Catcher, Recovery). '$aux_name'(Name) :- sub_atom(Name, _, 5, _, '_$aux'), !. '$make_aux_name'(Pred, N, Aux, AuxName) :- ( sub_atom(Pred, LgBefore, 5, _, '_$aux') -> sub_atom(Pred, 0, LgBefore, _, Pred1) ; number_atom(N, AN), atom_concat($, Pred, Pred2), atom_concat(Pred2, /, Pred3), atom_concat(Pred3, AN, Pred1) ), number_atom(Aux, ANo), atom_concat('_$aux', ANo, AAux), atom_concat(Pred1, AAux, AuxName). '$pred_without_aux'(Func, Arity, Func1, Arity1) :- ( sub_atom(Func, LgBefore, 5, _, '_$aux') -> sub_atom(Func, B, 1, _, /), L is B - 1, sub_atom(Func, 1, L, _, Func1), B1 is B + 1, A is LgBefore - B - 1, sub_atom(Func, B1, A, _, SA1), number_atom(Arity1, SA1), ! ; Func1 = Func, Arity1 = Arity ). ./gprolog-1.3.0/src/Pl2Wam/sics_pl2wam0000755004425400513100000000004307454522762016045 0ustar diazloco#!/bin/sh sicstus -l sicstus -a $* ./gprolog-1.3.0/src/Pl2Wam/wam_emit.pl0000644004425400513100000002723510547162441016036 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog to WAM compiler * * File : wam_emit.pl * * Descr.: code emission * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: wam_emit.pl,v 1.14 2007/01/04 10:34:07 diaz Exp $ */ /*-------------------------------------------------------------------------* * WAM Instructions * * * * get_variable(V, A) put_variable(V, A) * * put_void(A) * * get_value(V, A) put_value(V, A) * * put_unsafe_value(y(Y), A) * * get_atom(F, A) put_atom(F, A) * * get_integer(N, A) put_integer(N, A) * * get_float(D, A) put_float(D, A) * * get_nil(A) put_nil(A) * * get_list(A) put_list(A) * * get_structure(F/N, A) put_structure(F/N, A) * * * * math_load_value(V, A) * * math_fast_load_value(V, A) * * * * unify_variable(V) allocate(N) * * unify_void(N) deallocate * * unify_value(V) * * unify_local_value(V) call(F/N) * * unify_atom(F) execute(F/N) * * unify_integer(N) proceed * * unify_nil fail * * unify_list (only for the last subterm if it is a list) * * unify_structure(F/N) (only for the last subterm if it is a structure) * * * * label(L) * * * * switch_on_term(Lvar, Latm, Lint, Llst, Lstc) * * switch_on_atom([(F,L),...]) * * switch_on_integer([(N,L),...]) * * switch_on_structure([(F/N,L),...]) * * * * try_me_else(L) try(L) * * retry_me_else(L) retry(L) * * trust_me_else_fail trust(L) * * * * load_cut_level(A) * * cut(V) * * * * call_c(F, [T,...], [W,...]) * * F=FctName, T=option only these options are relevant: * * - jump/boolean/x(X) (jump at / test / move returned value) * * - set_cp (set CP before the call at the next instruction) * * - fast_call (use a fact call convention) * * - tagged (use tagged calls for atoms, integers and F/N) * * * * foreign_call_c(F, T0, P/N, K, [(M1, T1),...]) * * F=FctName, T0=Return, P/N=BipName/BipArity, K=ChcSize * * Mi=mode (in/out/in_out), Ti=type * * * * V : x(X) or y(Y) * * X, Y : integer >= 0 * * A : integer * * D : float * * N, K : integer * * F, T, M: atom * * W : atom or integer or float or atom/integer or x(X) * * L : integer >= 1 (with no "holes") or 'fail' inside switch_on_term * *-------------------------------------------------------------------------*/ emit_code_init(WamFile0, PlFile0) :- prolog_file_name(PlFile0, PlFile), emit_code_files(WamFile0, PlFile, WamFile), ( WamFile = user -> current_output(Stream) ; open(WamFile, write, Stream) ), g_assign(streamwamfile, Stream), g_assign(cur_pl_file, ''), prolog_name(Name), prolog_version(Version), prolog_date(Date), date_time(dt(Yr, Mh, Dy, Hr, Me, Sd)), format(Stream, '%% compiler: ~a ~a (~a)~n', [Name, Version, Date]), format(Stream, '%% file : ~a~n', [PlFile]), format(Stream, '%% date : ~d ~d ~d~n', [Mh, Dy, Yr]), format(Stream, '%% time : ~d:~d:~d~n', [Hr, Me, Sd]). emit_code_files('', user, user) :- !. emit_code_files('', PlFile, WamFile) :- !, decompose_file_name(PlFile, _, Prefix, Suffix), ( g_read(native_code, t) -> WamSuffix = '.wam' ; WamSuffix = '.wbc' ), ( Suffix = '.pl' -> atom_concat(Prefix, WamSuffix, WamFile) ; atom_concat(Prefix, Suffix, WF), atom_concat(WF, WamSuffix, WamFile) ). emit_code_files(WamFile, _, WamFile). emit_code_term(Bytes, Lines) :- g_read(streamwamfile, Stream), character_count(Stream, Bytes), line_count(Stream, Lines), close(Stream). emit_code(Pred, N, PlFile, PlLine, WamCode) :- g_read(streamwamfile, Stream), emit_pred_start(Pred, N, PlFile, PlLine, Stream, _), emit_wam_code(WamCode, _, Stream), write(Stream, ']).'), nl(Stream). emit_pred_start(Pred, 0, PlFile, PlLine, Stream, Type) :- ( Pred = '$exe_user', Type = user ; Pred = '$exe_system', Type = system ), !, emit_file_name_if_needed(PlFile, Stream), format(Stream, '~n~ndirective(~d,~a,', [PlLine, Type]). emit_pred_start(Pred, N, PlFile, PlLine, Stream, _) :- emit_file_name_if_needed(PlFile, Stream), ( test_pred_info(dyn, Pred, N) -> StaDyn = dynamic ; StaDyn = static ), ( test_pred_info(pub, Pred, N) -> PubPriv = public ; PubPriv = private ), ( test_pred_info(bpl, Pred, N) -> UsBplBfd = built_in ; test_pred_info(bfd, Pred, N) -> UsBplBfd = built_in_fd ; UsBplBfd = user ), format(Stream, '~n~npredicate(~q,~d,~a,~a,~a,', [Pred / N, PlLine, StaDyn, PubPriv, UsBplBfd]). emit_file_name_if_needed(PlFile, _) :- g_read(cur_pl_file, PlFile), !. emit_file_name_if_needed(PlFile, Stream) :- format(Stream, '~n~nfile_name(~q).~n', [PlFile]), g_assign(cur_pl_file, PlFile). emit_wam_code([], _, _). emit_wam_code([WamInst|WamCode], First, Stream) :- emit_wam_code(WamInst, First, Stream), % for nested code emit_wam_code(WamCode, First, Stream), !. emit_wam_code(WamInst, First, Stream) :- special_form(WamInst, WamInst1), emit_wam_code(WamInst1, First, Stream). emit_wam_code(WamInst, _, _) :- g_read(keep_void_inst, KeepVoidInst), dummy_instruction(WamInst, KeepVoidInst), !. emit_wam_code(WamInst, First, Stream) :- WamInst = label(_), !, ( var(First) -> Car = '[', First = f ; Car = (',') ), format(Stream, '~a~n~n', [Car]), emit_one_inst(WamInst, Stream). emit_wam_code(WamInst, First, Stream) :- ( var(First) -> Car = '[', First = f ; Car = (',') ), format(Stream, '~a~n ', [Car]), emit_one_inst(WamInst, Stream). emit_one_inst(WamInst, Stream) :- atom(WamInst), !, writeq(Stream, WamInst). emit_one_inst(WamInst, Stream) :- functor(WamInst, F, N), writeq(Stream, F), emit_args(0, N, WamInst, Stream), write(Stream, ')'). emit_args(N, N, _, _) :- !. emit_args(I, N, WamInst, Stream) :- I1 is I + 1, ( I1 = 1 -> put_char(Stream, '(') ; put_char(Stream, ',') ), arg(I1, WamInst, A), emit_one_arg(A, Stream), emit_args(I1, N, WamInst, Stream). emit_one_arg([X|L], Stream) :- length(L, N), % split long lists N > 30, !, put_char(Stream, '['), line_position(Stream, P), write_term(Stream, X, [quoted(true), priority(999)]), emit_list(L, P, Stream). emit_one_arg(A, Stream) :- writeq(Stream, A). emit_list([], _, Stream) :- put_char(Stream, ']'). emit_list([X|L], P, Stream) :- format(Stream, ',~n~*c', [P, 0' ]), write_term(Stream, X, [quoted(true), priority(999)]), emit_list(L, P, Stream). emit_ensure_linked :- g_read(streamwamfile, Stream), retract(ensure_linked(Name, Arity)), !, format(Stream, '~n~nensure_linked([~q', [Name / Arity]), ( clause(ensure_linked(Name1, Arity1), _), format(Stream, ',~q', [Name1 / Arity1]), fail ; true ), write(Stream, ']).'), nl(Stream). emit_ensure_linked. bc_emit_code(Pred, N, PlFile, PlLine, LCompCl) :- g_read(streamwamfile, Stream), emit_pred_start(Pred, N, PlFile, PlLine, Stream, Type), ( nonvar(Type) -> LCompCl = [bc((_ :- Body), _)], bc_emit_prolog_term(Stream, Body), format(Stream, ').~n', []) ; length(LCompCl, NbCl), ( LCompCl = [bc('$$empty$$predicate$$clause$$', [proceed])] -> NbCl1 = 0, LCompCl1 = [] ; NbCl1 = NbCl, LCompCl1 = LCompCl ), format(Stream, '~d).~n', [NbCl1]), bc_emit_lst_clause(LCompCl1, Stream) ). bc_emit_lst_clause([], _). bc_emit_lst_clause([bc(Cl, WamCode)|LCompCl], Stream) :- format(Stream, '~n~nclause(', []), bc_emit_prolog_term(Stream, Cl), write(Stream, ','), emit_wam_code(WamCode, _, Stream), format(Stream, ']).~n', []), bc_emit_lst_clause(LCompCl, Stream). bc_emit_prolog_term(Stream, X) :- numbervars(X, 0, _), write_term(Stream, X, [numbervars(true), ignore_ops(true), quoted(true)]). ./gprolog-1.3.0/src/Pl2Wam/swilib.pl0000644004425400513100000000163110547162441015515 0ustar diazloco/* $Id: swilib.pl,v 1.5 2001/09/17 16:01:51 diaz Exp $ */ prolog_name('SWI Prolog'). prolog_version(X) :- current_prolog_flag(version, V), number_atom(V, X). prolog_date(X) :- current_prolog_flag(compiled_at, X). prolog_copyright(''). callable(X) :- atom(X), !. callable(X) :- compound(X). /* g_vars */ :- dynamic(gvar / 2). g_assign(Var, Value) :- ( retract(gvar(Var, _)) ; true ), !, asserta(gvar(Var, Value)). g_read(Var, Value) :- ( gvar(Var, Value1) ; Value1 = 0 ), !, Value = Value1. argument_list(LArgs) :- unix(argv([_|L])), delete_flags(L, LArgs), !. delete_flags([], []). delete_flags(['-x', _|L], L1) :- delete_flags(L, L1). delete_flags(['-t', _|L], L1) :- delete_flags(L, L1). delete_flags(['-g', _|L], L1) :- delete_flags(L, L1). delete_flags([--|L], L). go_other :- argument_list(L), go_other1(L). go_other1([]) :- !. go_other1(L) :- pl2wam(L), halt. ./gprolog-1.3.0/src/Pl2Wam/OTHER_PL0000644004425400513100000000221207246673622015074 0ustar diazloco Compiling pl2wam with various Prolog Systems -------------------------------------------- Go to the src/Pl2Wam sub-directory. The idea is to compile the file whole.pl (which produces a file whole.wam). GNU-Prolog ---------- Then get the user time give by time time pl2wam whole.pl YAP Prolog ---------- under yap ?- compile([compat,whole,yaplib]). ?- statistics(runtime, _), pl2wam([whole]), statistics(runtime,[_,T]). SICStus Prolog -------------- under sicstus | ?- compile([compat,whole,sicslib]). when asked for predicate redefinitions: type 'p' (redefine all). To obtain a bench: | ?- statistics(runtime, _), pl2wam([whole]), statistics(runtime,[_,T]). CIAO Prolog ----------- I have a problem with the modules of CIAO Prolog. Here is a solution: Create a file x.pl as follows: cat compat.pl whole.pl ciaolib.pl >x.pl echo 'b(T):- statistics(runtime, _), pl2wam([whole]), statistics(runtime,[_,T]). ' >>x.pl under ciao: ?- compile(x). To obtain a bench: ?- b(T). SWI-Prolog ---------- under pl: ?- [compat,whole,swilib]. To obtain a bench: ?- T0 is cputime, pl2wam([whole]), T is cputime-T0. ./gprolog-1.3.0/src/Pl2Wam/indexing.wam0000644004425400513100000005306110547440341016204 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : indexing.pl % date : 1 5 2007 % time : 13:13:21 file_name('/home/diaz/GP/src/src/Pl2Wam/indexing.pl'). predicate(indexing/2,122,static,private,user,[ allocate(4), get_variable(y(0),1), put_atom(f,1), put_void(2), put_list(3), unify_void(1), unify_variable(y(1)), call(indexing1/4), put_variable(y(2),0), put_variable(y(3),1), call(cur_pred/2), put_value(y(2),0), put_value(y(3),1), put_value(y(0),2), put_value(y(1),3), call('$indexing/2_$aux1'/4), put_value(y(0),0), put_integer(1,1), put_void(2), deallocate, execute(allocate_labels/3)]). predicate('$indexing/2_$aux1'/4,122,static,private,user,[ load_cut_level(4), try_me_else(1), allocate(4), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), get_variable(y(3),4), put_value(x(0),1), put_atom(cut,0), put_value(y(0),2), call(test_pred_info/3), cut(y(3)), put_value(y(1),0), get_list(0), unify_variable(x(0)), unify_local_value(y(2)), get_structure(load_cut_level/1,0), unify_local_value(y(0)), deallocate, proceed, label(1), trust_me_else_fail, get_value(x(3),2), proceed]). predicate(indexing1/4,134,static,private,user,[ load_cut_level(4), allocate(7), get_variable(y(0),1), get_list(3), unify_variable(x(1)), unify_variable(y(1)), get_structure(label/1,1), unify_local_value(x(2)), get_variable(y(2),4), put_variable(y(3),1), put_variable(y(4),2), put_variable(y(5),3), put_variable(y(6),4), call(look_for_var/5), put_value(y(3),0), put_value(y(4),1), put_value(y(5),2), put_value(y(6),3), put_value(y(0),4), put_value(y(1),5), call(mk_indexing/6), cut(y(2)), deallocate, proceed]). predicate(look_for_var/5,141,static,private,user,[ load_cut_level(5), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_integer(2,1), get_nil(2), get_nil(4), proceed, label(4), retry_me_else(6), label(5), get_nil(2), get_list(0), unify_variable(x(0)), unify_local_value(x(4)), get_structure(cl/3,0), unify_variable(x(2)), unify_atom(var), unify_variable(x(0)), get_structure(cl/3,3), unify_value(x(2)), unify_atom(var), unify_value(x(0)), cut(x(5)), put_value(x(4),0), execute('$look_for_var/5_$aux1'/2), label(6), trust_me_else_fail, label(7), allocate(2), get_variable(y(0),1), get_list(0), unify_variable(x(1)), unify_variable(x(0)), get_list(2), unify_value(x(1)), unify_variable(x(2)), put_variable(y(1),1), call(look_for_var/5), put_unsafe_value(y(1),0), put_value(y(0),1), deallocate, execute('$look_for_var/5_$aux2'/2)]). predicate('$look_for_var/5_$aux2'/2,150,static,private,user,[ load_cut_level(2), try_me_else(6), switch_on_term(2,fail,1,fail,fail), label(1), switch_on_integer([(13,3),(14,5)]), label(2), try_me_else(4), label(3), get_integer(13,0), cut(x(2)), get_integer(11,1), proceed, label(4), trust_me_else_fail, label(5), get_integer(14,0), cut(x(2)), get_integer(12,1), proceed, label(6), trust_me_else_fail, get_value(x(0),1), proceed]). predicate('$look_for_var/5_$aux1'/2,143,static,private,user,[ load_cut_level(2), try_me_else(1), get_nil(0), cut(x(2)), get_integer(14,1), proceed, label(1), trust_me_else_fail, get_integer(13,1), proceed]). predicate(mk_indexing/6,162,static,private,user,[ load_cut_level(6), switch_on_term(2,fail,1,fail,fail), label(1), switch_on_integer([(11,3),(12,5),(13,7),(14,9),(2,11)]), label(2), try_me_else(4), label(3), allocate(9), get_integer(11,0), get_variable(y(0),1), get_structure(cl/3,2), unify_void(2), unify_variable(y(1)), get_variable(y(2),3), get_variable(y(3),5), put_value(x(4),0), put_variable(y(4),1), put_variable(y(5),2), call('$mk_indexing/6_$aux1'/3), put_integer(2,0), put_value(y(0),1), put_void(2), put_void(3), put_atom(f,4), put_variable(y(6),5), call(mk_indexing/6), put_value(y(2),0), put_atom(t,1), put_variable(y(7),2), put_variable(y(8),3), call(indexing1/4), put_value(y(3),0), get_list(0), unify_local_value(y(4)), unify_list, unify_local_value(y(6)), unify_list, unify_variable(x(1)), unify_list, unify_variable(x(0)), unify_list, unify_value(y(1)), unify_local_value(y(8)), get_structure(label/1,1), unify_local_value(y(5)), get_structure(retry_me_else/1,0), unify_local_value(y(7)), deallocate, proceed, label(4), retry_me_else(6), label(5), allocate(6), get_integer(12,0), get_variable(y(0),1), get_structure(cl/3,2), unify_void(2), unify_variable(y(1)), get_variable(y(2),5), put_value(x(4),0), put_variable(y(3),1), put_variable(y(4),2), call('$mk_indexing/6_$aux2'/3), put_integer(2,0), put_value(y(0),1), put_void(2), put_void(3), put_atom(f,4), put_variable(y(5),5), call(mk_indexing/6), put_value(y(2),0), get_list(0), unify_local_value(y(3)), unify_list, unify_local_value(y(5)), unify_list, unify_variable(x(0)), unify_list, unify_atom(trust_me_else_fail), unify_value(y(1)), get_structure(label/1,0), unify_local_value(y(4)), deallocate, proceed, label(6), retry_me_else(8), label(7), allocate(6), get_integer(13,0), get_structure(cl/3,2), unify_void(2), unify_variable(y(0)), get_variable(y(1),3), get_variable(y(2),5), put_value(x(4),0), put_variable(y(3),1), put_variable(y(4),2), call('$mk_indexing/6_$aux3'/3), put_value(y(1),0), put_atom(t,1), put_value(y(4),2), put_variable(y(5),3), call(indexing1/4), put_value(y(2),0), get_list(0), unify_local_value(y(3)), unify_list, unify_value(y(0)), unify_local_value(y(5)), deallocate, proceed, label(8), retry_me_else(10), label(9), get_integer(14,0), get_structure(cl/3,2), unify_void(2), unify_variable(x(2)), put_value(x(4),0), put_value(x(5),1), execute('$mk_indexing/6_$aux4'/3), label(10), trust_me_else_fail, label(11), allocate(18), get_integer(2,0), get_variable(y(0),1), get_variable(y(1),6), put_value(x(4),0), put_value(x(5),1), put_variable(y(2),2), call('$mk_indexing/6_$aux5'/3), put_value(y(0),0), put_variable(y(3),1), put_value(y(2),2), put_variable(y(4),3), put_variable(y(5),4), put_variable(y(6),5), put_variable(y(7),6), put_variable(y(8),7), call('$mk_indexing/6_$aux6'/8), put_value(y(3),0), get_variable(y(9),0), put_value(y(0),0), put_variable(y(10),1), put_variable(y(11),2), put_variable(y(12),3), put_variable(y(13),4), call(split/5), cut(y(1)), put_value(y(10),0), put_atom(switch_on_atom,1), put_value(y(5),2), put_variable(y(14),3), put_value(y(9),4), call(gen_switch/5), put_value(y(11),0), put_atom(switch_on_integer,1), put_value(y(6),2), put_variable(y(15),3), put_value(y(14),4), call(gen_switch/5), put_value(y(12),0), put_value(y(7),1), put_variable(y(16),2), put_value(y(15),3), call(gen_list/4), put_value(y(13),0), put_atom(switch_on_structure,1), put_value(y(8),2), put_variable(y(17),3), put_value(y(16),4), call(gen_switch/5), put_value(y(0),0), put_unsafe_value(y(4),1), put_unsafe_value(y(17),2), deallocate, execute(gen_insts/3)]). predicate('$mk_indexing/6_$aux6'/8,193,static,private,user,[ load_cut_level(8), try_me_else(1), get_list(0), unify_void(1), unify_nil, cut(x(8)), get_list(1), unify_void(1), unify_variable(x(0)), get_value(x(0),2), proceed, label(1), trust_me_else_fail, get_list(2), unify_variable(x(0)), unify_local_value(x(1)), get_structure(switch_on_term/5,0), unify_local_value(x(3)), unify_local_value(x(4)), unify_local_value(x(5)), unify_local_value(x(6)), unify_local_value(x(7)), proceed]). predicate('$mk_indexing/6_$aux5'/3,193,static,private,user,[ load_cut_level(3), try_me_else(1), get_atom(f,0), cut(x(3)), get_value(x(2),1), proceed, label(1), trust_me_else_fail, get_list(1), unify_atom(trust_me_else_fail), unify_local_value(x(2)), proceed]). predicate('$mk_indexing/6_$aux4'/3,187,static,private,user,[ load_cut_level(3), try_me_else(1), get_atom(f,0), cut(x(3)), get_value(x(2),1), proceed, label(1), trust_me_else_fail, get_list(1), unify_atom(trust_me_else_fail), unify_local_value(x(2)), proceed]). predicate('$mk_indexing/6_$aux3'/3,179,static,private,user,[ load_cut_level(3), try_me_else(1), get_atom(f,0), cut(x(3)), get_structure(try_me_else/1,1), unify_local_value(x(2)), proceed, label(1), trust_me_else_fail, get_structure(retry_me_else/1,1), unify_local_value(x(2)), proceed]). predicate('$mk_indexing/6_$aux2'/3,171,static,private,user,[ load_cut_level(3), try_me_else(1), get_atom(f,0), cut(x(3)), get_structure(try_me_else/1,1), unify_local_value(x(2)), proceed, label(1), trust_me_else_fail, get_structure(retry_me_else/1,1), unify_local_value(x(2)), proceed]). predicate('$mk_indexing/6_$aux1'/3,162,static,private,user,[ load_cut_level(3), try_me_else(1), get_atom(f,0), cut(x(3)), get_structure(try_me_else/1,1), unify_local_value(x(2)), proceed, label(1), trust_me_else_fail, get_structure(retry_me_else/1,1), unify_local_value(x(2)), proceed]). predicate(split/5,214,static,private,user,[ allocate(6), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),4), get_variable(x(1),3), put_structure(a/2,3), unify_variable(x(2)), unify_value(x(2)), put_structure(a/2,7), unify_nil, unify_local_value(x(1)), put_nil(1), put_nil(2), put_nil(4), put_variable(y(3),5), put_variable(y(4),6), put_variable(y(5),8), call(split1/9), put_value(y(3),0), put_value(y(0),1), call(terminate_list/2), put_value(y(4),0), put_value(y(1),1), call(terminate_list/2), put_unsafe_value(y(5),0), put_value(y(2),1), deallocate, execute(terminate_list/2)]). predicate(split1/9,221,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(8),4), get_value(x(7),3), get_value(x(6),2), get_value(x(5),1), proceed, label(3), trust_me_else_fail, label(4), allocate(9), get_variable(y(1),5), get_variable(y(2),6), get_variable(y(3),7), get_variable(y(4),8), get_variable(x(5),4), get_variable(x(4),3), get_variable(x(3),2), get_variable(x(2),1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_structure(cl/3,0), unify_variable(x(1)), unify_variable(x(0)), unify_void(1), put_variable(y(5),6), put_variable(y(6),7), put_variable(y(7),8), put_variable(y(8),9), call(split2/10), put_value(y(0),0), put_unsafe_value(y(5),1), put_unsafe_value(y(6),2), put_unsafe_value(y(7),3), put_unsafe_value(y(8),4), put_value(y(1),5), put_value(y(2),6), put_value(y(3),7), put_value(y(4),8), deallocate, execute(split1/9)]). predicate(split2/10,228,static,private,user,[ switch_on_term(2,7,fail,fail,1), label(1), switch_on_structure([(atm/1,3),(int/1,5),(stc/2,9)]), label(2), try_me_else(4), label(3), get_value(x(9),5), get_value(x(8),4), get_value(x(7),3), get_variable(x(3),2), get_variable(x(2),1), get_structure(atm/1,0), unify_variable(x(1)), put_value(x(3),0), put_value(x(6),3), execute(add_to_list/4), label(4), retry_me_else(6), label(5), get_value(x(9),5), get_value(x(8),4), get_value(x(6),2), get_variable(x(2),1), get_structure(int/1,0), unify_variable(x(1)), put_value(x(3),0), put_value(x(7),3), execute(add_to_list/4), label(6), retry_me_else(8), label(7), get_atom(lst,0), get_value(x(9),5), get_value(x(7),3), get_value(x(6),2), get_structure(a/2,4), unify_variable(x(2)), unify_variable(x(0)), get_list(2), unify_local_value(x(1)), unify_variable(x(1)), get_structure(a/2,8), unify_value(x(1)), unify_value(x(0)), proceed, label(8), trust_me_else_fail, label(9), get_value(x(8),4), get_value(x(7),3), get_value(x(6),2), get_variable(x(2),1), get_structure(stc/2,0), unify_variable(x(3)), unify_variable(x(0)), put_structure((/)/2,1), unify_value(x(3)), unify_value(x(0)), put_value(x(5),0), put_value(x(9),3), execute(add_to_list/4)]). predicate(add_to_list/4,242,static,private,user,[ load_cut_level(4), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_list(3), unify_variable(x(0)), unify_nil, get_structure(a/3,0), unify_local_value(x(1)), unify_variable(x(0)), unify_list, unify_local_value(x(2)), unify_value(x(0)), proceed, label(4), retry_me_else(6), label(5), get_list(0), unify_variable(x(0)), unify_variable(x(5)), get_structure(a/3,0), unify_local_value(x(1)), unify_variable(x(6)), unify_variable(x(0)), get_list(6), unify_local_value(x(2)), unify_variable(x(2)), get_list(3), unify_variable(x(3)), unify_value(x(5)), get_structure(a/3,3), unify_local_value(x(1)), unify_value(x(2)), unify_value(x(0)), cut(x(4)), proceed, label(6), trust_me_else_fail, label(7), get_list(0), unify_variable(x(4)), unify_variable(x(0)), get_list(3), unify_value(x(4)), unify_variable(x(3)), execute(add_to_list/4)]). predicate(terminate_list/2,253,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_variable(x(2)), unify_variable(x(0)), get_structure(a/3,2), unify_variable(x(3)), unify_nil, unify_variable(x(2)), get_list(1), unify_variable(x(4)), unify_variable(x(1)), get_structure(a/2,4), unify_value(x(3)), unify_value(x(2)), execute(terminate_list/2)]). predicate(gen_switch/5,261,static,private,user,[ load_cut_level(5), try_me_else(5), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_atom(fail,2), get_value(x(4),3), cut(x(5)), proceed, label(3), trust_me_else_fail, label(4), get_value(x(4),3), get_list(0), unify_variable(x(0)), unify_nil, get_structure(a/2,0), unify_void(1), unify_list, unify_local_value(x(2)), unify_nil, cut(x(5)), proceed, label(5), trust_me_else_fail, allocate(3), get_variable(y(0),1), get_variable(x(1),3), get_list(4), unify_variable(x(4)), unify_list, unify_variable(y(1)), unify_variable(x(3)), get_structure(label/1,4), unify_local_value(x(2)), put_value(x(1),2), put_variable(y(2),1), call(create_switch_list/4), put_value(y(1),0), put_list(1), unify_local_value(y(0)), unify_list, unify_local_value(y(2)), unify_nil, call_c('Blt_Univ',[fast_call,boolean],[x(0),x(1)]), deallocate, proceed]). predicate(create_switch_list/4,282,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), get_value(x(3),2), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_variable(y(2),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_structure(a/2,0), unify_variable(x(2)), unify_variable(x(0)), get_list(1), unify_variable(x(1)), unify_variable(y(1)), get_structure((',')/2,1), unify_value(x(2)), unify_variable(x(1)), put_variable(y(3),2), call(gen_list/4), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_unsafe_value(y(3),3), deallocate, execute(create_switch_list/4)]). predicate(gen_list/4,291,static,private,user,[ load_cut_level(4), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_atom(fail,1), get_value(x(3),2), proceed, label(4), retry_me_else(6), label(5), get_value(x(3),2), get_list(0), unify_local_value(x(1)), unify_nil, cut(x(4)), proceed, label(6), trust_me_else_fail, label(7), get_variable(x(4),2), get_list(0), unify_variable(x(5)), unify_variable(x(0)), get_list(3), unify_variable(x(6)), unify_list, unify_variable(x(3)), unify_variable(x(2)), get_structure(label/1,6), unify_local_value(x(1)), get_structure(try/1,3), unify_value(x(5)), put_value(x(4),1), execute(gen_list1/3)]). predicate(gen_list1/3,301,static,private,user,[ switch_on_term(2,fail,fail,1,fail), label(1), try(3), trust(5), label(2), try_me_else(4), label(3), get_list(0), unify_variable(x(0)), unify_nil, get_list(2), unify_variable(x(2)), unify_local_value(x(1)), get_structure(trust/1,2), unify_value(x(0)), proceed, label(4), trust_me_else_fail, label(5), get_list(0), unify_variable(x(3)), unify_variable(x(0)), get_list(2), unify_variable(x(4)), unify_variable(x(2)), get_structure(retry/1,4), unify_value(x(3)), execute(gen_list1/3)]). predicate(gen_insts/3,310,static,private,user,[ load_cut_level(3), switch_on_term(2,fail,fail,1,fail), label(1), try(3), trust(5), label(2), try_me_else(4), label(3), get_list(0), unify_variable(x(0)), unify_nil, get_structure(cl/3,0), unify_local_value(x(1)), unify_void(1), unify_variable(x(4)), get_list(2), unify_variable(x(0)), unify_value(x(4)), get_structure(label/1,0), unify_local_value(x(1)), cut(x(3)), proceed, label(4), trust_me_else_fail, label(5), allocate(6), get_variable(y(2),1), get_variable(y(3),2), get_list(0), unify_variable(x(1)), unify_variable(x(0)), get_structure(cl/3,1), unify_variable(y(0)), unify_void(1), unify_variable(y(1)), put_variable(y(4),1), put_variable(y(5),2), call(gen_insts1/3), put_value(y(3),0), get_list(0), unify_variable(x(2)), unify_list, unify_variable(x(1)), unify_list, unify_variable(x(0)), unify_list, unify_value(y(1)), unify_local_value(y(5)), get_structure(label/1,2), unify_local_value(y(2)), get_structure(try_me_else/1,1), unify_local_value(y(4)), get_structure(label/1,0), unify_value(y(0)), deallocate, proceed]). predicate(gen_insts1/3,319,static,private,user,[ load_cut_level(3), switch_on_term(2,fail,fail,1,fail), label(1), try(3), trust(5), label(2), try_me_else(4), label(3), get_list(0), unify_variable(x(0)), unify_nil, get_structure(cl/3,0), unify_variable(x(0)), unify_void(1), unify_variable(x(5)), get_list(2), unify_variable(x(4)), unify_list, unify_atom(trust_me_else_fail), unify_list, unify_variable(x(2)), unify_value(x(5)), get_structure(label/1,4), unify_local_value(x(1)), get_structure(label/1,2), unify_value(x(0)), cut(x(3)), proceed, label(4), trust_me_else_fail, label(5), allocate(6), get_variable(y(2),1), get_variable(y(3),2), get_list(0), unify_variable(x(1)), unify_variable(x(0)), get_structure(cl/3,1), unify_variable(y(0)), unify_void(1), unify_variable(y(1)), put_variable(y(4),1), put_variable(y(5),2), call(gen_insts1/3), put_value(y(3),0), get_list(0), unify_variable(x(2)), unify_list, unify_variable(x(1)), unify_list, unify_variable(x(0)), unify_list, unify_value(y(1)), unify_local_value(y(5)), get_structure(label/1,2), unify_local_value(y(2)), get_structure(retry_me_else/1,1), unify_local_value(y(4)), get_structure(label/1,0), unify_value(y(0)), deallocate, proceed]). predicate(allocate_labels/3,329,static,private,user,[ load_cut_level(3), try_me_else(7), switch_on_term(1,2,fail,4,6), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(2),1), cut(x(3)), proceed, label(3), retry_me_else(5), label(4), allocate(3), get_variable(y(1),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), cut(x(3)), put_variable(y(2),2), call(allocate_labels/3), put_value(y(0),0), put_unsafe_value(y(2),1), put_value(y(1),2), deallocate, execute(allocate_labels/3), label(5), trust_me_else_fail, label(6), get_structure(label/1,0), unify_local_value(x(1)), cut(x(3)), math_fast_load_value(x(1),0), call_c('Fct_Fast_Inc',[fast_call,x(0)],[x(0)]), get_value(x(2),0), proceed, label(7), trust_me_else_fail, get_value(x(2),1), proceed]). ./gprolog-1.3.0/src/Pl2Wam/read_file.pl0000644004425400513100000006455210547162440016150 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog to WAM compiler * * File : read_file.pl * * Descr.: source file reading * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: read_file.pl,v 1.13 2007/01/04 10:34:06 diaz Exp $ */ /*-------------------------------------------------------------------------* * Data structures: * * * * the stack of opened files (for nested includes): * * global variable open_file_stack = [PlFile*Stream,...] * * from last to first. * * * * the context (where occurs an error): * * global variable where = OpenFileStack+(L1-L2) * * L1 = first line of the current clause (resp. directive). * * L2 = last line of the current clause (resp. directive). * * * * read_predicate(Pred,N,LSrcCl): * * the structure of the compiler is a repeat/fail loop on 1 predicate * * calling read_predicate(Pred,N,LSrcCl) to obtain next predicate. * * Pred = predicate name (an atom). * * N = arity (an integer >=0). * * LSrcCl = [SrcCl,...], list of source clauses, with * * SrcCl = Where+Cl where Cl is the source clause read. * * * * Buffers for special predicate management (with assert/retract): * * * * buff_aux_pred(Pred,N,LSrcCl): * * records the clauses of an auxiliary predicate. * * Asserted by Pass 1 (syntactic sugar removing) when splitting ;/2,etc.* * Retracted at the very next invocation of read_predicate/3 to * * ensure that aux. predicates always follow their "father" predicate. * * * * buff_discontig_clause(Pred,N,SrcCl): * * records a clause of a discontiguous predicate (:- discontiguous). * * Eacho clause of a discontiguous predicate is asserted when it is read* * When the end of file is reached all clauses of a discontiguous pred * * are grouped to return a list of source clauses LSrcCl. * * Thus discontiguous predicates are always compiled after other * * predicates. * * * * buff_dyn_interf_clause(Pred,N,SrcCl): * * records the interface clause of a dynamic predicate (:- dynamic). * * This clause is of the form Head:- call(Head) and only ensures that * * an external invocation to this predicate will not need to know that * * it is dynamic (and should be called by call/1). * * Asserted as soon as a :- dynamic directive is encountered. * * Retracted only when the end of file is reached. All other clauses of * * a dynamic predicate give rise to a system executable directive to * * assert(z) it. * * * * empty_dyn_pred(Pred,N,Where): * * asserted when the declaration of a dynamic predicate is encoutered * * (:- dynamic). Retracted when a clause of a dynamic predicate is read.* * At the end, only contains dynamic predicate with no clauses. * * Used then to define the interface clause. * * * * ensure_linked(Pred,N): * * asserted for each Pred/N occuring in a :- ensure_linked directive. * * * * Buffers for executable directive management (with assert/retract): * * * * buff_exe_system(SrcDirec) * * SrcDirec = Where+Body (i.e. source directive). * * records a system directive. * * Asserted for dynamic clauses (to assertz it), and to execute, at * * run-time, op/3 set_prolog_flag/2, char_conversion/2. * * Retracted only when the end of file has been reached to provide a * * predicate '$exe_system':- Body. * * * * buff_exe_user(SrcDirec) * * records user defined directives (:- initialization). * * Asserted when a :- initialization declaration is encountered. * * Retracted just after all '$buff_exe_system' to ensure that any user * * directive has the needed environment. * * * * Buffers for special clause management (with assert/retract): * * * * buff_clause(Pred,N,SrcCl): * * the reader needs a lookahead clause (to group clauses by predicates).* * For such a clause we assert/retract(buff_clause(Pred,N,SrcCl)). * * Read at the very next invocation of get_next_clause/3. * *-------------------------------------------------------------------------*/ :- op(200, fx, ?). read_file_init(PlFile) :- retractall(buff_clause(_, _, _)), retractall(buff_aux_pred(_, _, _)), retractall(buff_discontig_clause(_, _, _)), retractall(buff_dyn_interf_clause(_, _, _)), retractall(buff_exe_system(_)), retractall(buff_exe_user(_)), retractall(empty_dyn_pred(_, _, _)), retractall(ensure_linked(_, _)), retractall(pred_info(_, _, _)), g_assign(default_kind, user), g_assign(reading_dyn_pred, f), g_assign(eof_reached, f), g_assign(open_file_stack, []), g_assign(where, 0), g_assign(syn_error_nb, 0), g_assign(in_lines, 0), g_assign(in_bytes, 0), open_new_prolog_file(PlFile). read_file_term(Bytes, Lines) :- g_read(in_bytes, Bytes), g_read(in_lines, Lines). read_file_error_nb(SynErrNb) :- g_read(syn_error_nb, SynErrNb). open_new_prolog_file(PlFile0) :- prolog_file_name(PlFile0, PlFile), ( PlFile = user -> current_input(Stream) ; open(PlFile, read, Stream) ), g_read(open_file_stack, OpenFileStack), g_assign(open_file_stack, [PlFile * Stream|OpenFileStack]). close_last_prolog_file :- g_read(open_file_stack, [_ * Stream|OpenFileStack]), g_assign(open_file_stack, OpenFileStack), g_read(in_bytes, Bytes1), g_read(in_lines, Lines1), character_count(Stream, Bytes2), line_count(Stream, Lines2), Bytes is Bytes1 + Bytes2, Lines is Lines1 + Lines2, g_assign(in_bytes, Bytes), g_assign(in_lines, Lines), close(Stream). % Read of a predicate read_predicate(Pred, N, LSrcCl) :- repeat, read_predicate1(Pred, N, LSrcCl), % standard predicate % !, ( g_read(reading_dyn_pred, f), g_read(native_code, t) -> read_predicate_next(Pred, N, LSrcCl) ; true ). read_predicate_next(Pred, N, LSrcCl) :- test_pred_info(dyn, Pred, N), !, LSrcCl = [Where + _|_], add_dyn_interf_clause(Pred, N, Where), create_exe_clauses_for_dyn_pred(LSrcCl, Pred, N), fail. % backtrack to repeat of main loop read_predicate_next(Pred, N, LSrcCl) :- test_pred_info(pub, Pred, N), !, create_exe_clauses_for_pub_pred(LSrcCl). read_predicate_next(_, _, _). read_predicate1(Pred, N, LSrcCl) :- retract(buff_aux_pred(Pred, N, LSrcCl)), !. % aux. pred (cf syn_sugar) read_predicate1(Pred, N, LSrcCl) :- g_read(eof_reached, f), !, repeat, get_next_clause(Pred, N, SrcCl), SrcCl = _ + Cl, retractall(empty_dyn_pred(Pred, N, _)), ( test_pred_info(discontig, Pred, N) -> assertz(buff_discontig_clause(Pred, N, SrcCl)), define_predicate(Pred, N), fail % backtrack to read_predicate1 ; true ), ( test_pred_info(def, Pred, N) -> warn('discontiguous predicate ~q - clause ignored', [Pred / N]), fail % backtrack to read_predicate1 ; true ), !, Cl \== end_of_file, % if end_of_file is read, fail % and backtrack to read_predicate define_predicate(Pred, N), group_clauses_by_pred(Pred, N, SrcCl, LSrcCl). read_predicate1(Pred, N, [SrcCl|LSrcCl]) :- retract(buff_discontig_clause(Pred, N, SrcCl)), % discontiguous pred !, recover_discontig_clauses(Pred, N, LSrcCl). read_predicate1(Pred, N, [SrcCl]) :- g_assign(reading_dyn_pred, t), retract(buff_dyn_interf_clause(Pred, N, SrcCl)), % dyn predicate !. read_predicate1(Pred, N, [SrcCl]) :- g_assign(reading_dyn_pred, t), retract(empty_dyn_pred(Pred, N, Where)), % empty dyn predicate define_predicate(Pred, N), ( g_read(native_code, t) -> create_dyn_interf_clause(Pred, N, Where, SrcCl) ; SrcCl = Where + '$$empty$$predicate$$clause$$' ), !. read_predicate1(Pred, N, LSrcCl) :- g_assign(reading_dyn_pred, f), retract(buff_exe_system(Where + Body)), % system exe directives Pred = '$exe_system', N = 0, LSrcCl = [Where + (Pred :- Body)], !. read_predicate1(Pred, N, LSrcCl) :- retract(buff_exe_user(Where + Body)), % user exe directives Pred = '$exe_user', N = 0, LSrcCl = [Where + (Pred :- Body)], !. read_predicate1(Pred, N, LSrcCl) :- Pred = end_of_file, N = 0, LSrcCl = [], % end of file !. group_clauses_by_pred(Pred, N, SrcCl, [SrcCl|LSrcCl1]) :- get_next_clause(Pred1, N1, SrcCl1), ( Pred = Pred1, N = N1 -> group_clauses_by_pred(Pred1, N1, SrcCl1, LSrcCl1) ; LSrcCl1 = [], ( Pred1 = end_of_file, N1 = 0 -> true ; asserta(buff_clause(Pred1, N1, SrcCl1)) ) ). add_dyn_interf_clause(Pred, N, _) :- clause(buff_dyn_interf_clause(Pred, N, _), true), % already asserted !. add_dyn_interf_clause(Pred, N, Where) :- create_dyn_interf_clause(Pred, N, Where, SrcCl), assertz(buff_dyn_interf_clause(Pred, N, SrcCl)). create_dyn_interf_clause(Pred, N, Where, SrcCl) :- length(LArgs, N), Head =.. [Pred|LArgs], SrcCl = Where + (Head :- call(Head)). recover_discontig_clauses(Pred, N, [SrcCl|LSrcCl]) :- retract(buff_discontig_clause(Pred, N, SrcCl)), !, recover_discontig_clauses(Pred, N, LSrcCl). recover_discontig_clauses(_, _, []). create_exe_clauses_for_dyn_pred([], _, _). create_exe_clauses_for_dyn_pred([SrcCl|LSrcCl], Pred, N) :- SrcCl = Where + Cl, add_wrapper_to_dyn_clause(Pred, N, Where + Cl, AuxName), handle_initialization(system, '$add_clause_term_and_bc'(Cl, [execute(AuxName / N)]), Where), create_exe_clauses_for_dyn_pred(LSrcCl, Pred, N). create_exe_clauses_for_pub_pred([]). create_exe_clauses_for_pub_pred([Where + Cl|LSrcCl]) :- handle_initialization(system, '$add_clause_term'(Cl), Where), create_exe_clauses_for_pub_pred(LSrcCl). get_next_clause(Pred, N, SrcCl) :- retract(buff_clause(Pred, N, SrcCl)), SrcCl = Where + _, g_assign(where, Where), !. get_next_clause(Pred, N, SrcCl) :- g_read(open_file_stack, OpenFileStack), OpenFileStack = [_ * Stream|_], '$catch'(read_term(Stream, Cl, [singletons(SingNames)]), error(syntax_error(Err), _), after_syn_error, any, 0, false), ( var(Err) -> last_read_start_line_column(L1, _), '$catch'(expand_term(Cl, Cl1), error(Err, _), dcg_error(Err), any, 0, false), stream_line_column(Stream, Line, Col), ( Col = 1 -> L2 is Line - 1 ; L2 = Line ), Where = OpenFileStack + (L1 - L2), g_assign(where, Where), get_next_clause1(Cl1, Where, SingNames, Pred, N, SrcCl) ; get_next_clause(Pred, N, SrcCl) ), !. get_next_clause1(end_of_file, _, _, Pred, N, SrcCl) :- close_last_prolog_file, g_read(open_file_stack, OpenFileStack), ( OpenFileStack = [] -> Pred = end_of_file, N = 0, SrcCl = _ + end_of_file, g_assign(eof_reached, t) ; get_next_clause(Pred, N, SrcCl) ). get_next_clause1((:- D), Where, SingNames, Pred, N, SrcCl) :- display_singletons(SingNames, directive), ( g_read(foreign_only, f) ; functor(D, foreign, _) ), ( handle_directive(D, Where) ; error('invalid directive ~q', [D]) ), !, get_next_clause(Pred, N, SrcCl). get_next_clause1(Cl, Where, SingNames, Pred, N, Where + Cl) :- g_read(foreign_only, f), !, ( Cl = (Head :- _) ; Cl = Head ), ( nonvar(Head) -> true ; error('head is a variable', []) ), ( callable(Head) -> true ; error('head is not a callable (~q)', [Head]) ), functor(Head, Pred, N), check_predicate(Pred, N), display_singletons(SingNames, Pred / N). % ignore clause with --foreign-only get_next_clause1(_, _, _, Pred, N, SrcCl) :- get_next_clause(Pred, N, SrcCl). after_syn_error :- g_read(syn_error_nb, SynErrNb), SynErrNb1 is SynErrNb + 1, g_assign(syn_error_nb, SynErrNb1), syntax_error_info(_, Line, Column, Msg), g_read(open_file_stack, OpenFileStack), g_assign(where, OpenFileStack + (Line - Line)), disp_msg('syntax error', Column, '~a', [Msg]). dcg_error(Err) :- last_read_start_line_column(Line, _), g_read(open_file_stack, OpenFileStack), g_assign(where, OpenFileStack + (Line - Line)), error('DCG error raised: ~w', [Err]). display_singletons(SingNames, PI) :- g_read(singl_warn, t), !, get_singletons(SingNames, Sing), ( Sing = [] -> true ; warn('singleton variables ~w for ~q', [Sing, PI]) ). display_singletons(_, _). get_singletons([], []). get_singletons([X = _|SingNames], Sing1) :- ( sub_atom(X, 0, 1, _, '_') -> Sing1 = Sing ; Sing1 = [X|Sing] ), get_singletons(SingNames, Sing). :- discontiguous(handle_directive / 3). handle_directive(D, Where) :- D =.. [DName|DLst], handle_directive(DName, DLst, Where). handle_directive(public, DLst, _) :- !, DLst \== [], set_flag_for_preds(DLst, pub). handle_directive(dynamic, DLst, Where) :- !, DLst \== [], set_flag_for_preds(DLst, dyn), set_flag_for_preds(DLst, pub), add_empty_dyn(DLst, Where). handle_directive(discontiguous, DLst, _) :- !, DLst \== [], set_flag_for_preds(DLst, discontig). handle_directive(built_in, DLst, _) :- !, ( DLst == [], g_assign(default_kind, built_in) ; DLst \== [], set_flag_for_preds(DLst, bpl) ), !. handle_directive(built_in_fd, DLst, _) :- !, ( DLst == [], g_assign(default_kind, built_in_fd) ; DLst \== [], set_flag_for_preds(DLst, bfd) ). handle_directive(ensure_linked, DLst, _) :- !, ( g_read(native_code, f) -> warn('ensure_linked directive ignored in byte-code compilation mode', []) ; DLst \== [], add_ensure_linked(DLst) ). handle_directive(multifile, _, _) :- !, warn('multifile directive not supported - directive ignored', []). handle_directive(ensure_loaded, _, _) :- !, warn('ensure_loaded directive not supported - directive ignored', []). handle_directive(include, [PlFile], _) :- !, open_new_prolog_file(PlFile). handle_directive(op, [X, Y, Z], Where) :- !, exec_directive(op(X, Y, Z)), handle_initialization(system, op(X, Y, Z), Where). handle_directive(char_conversion, [X, Y], Where) :- !, exec_directive(char_conversion(X, Y)), handle_initialization(system, char_conversion(X, Y), Where). handle_directive(set_prolog_flag, [X, Y], Where) :- !, exec_directive(set_prolog_flag(X, Y)), ( current_prolog_flag(singleton_warning, off) -> g_assign(singl_warn, f) ; g_assign(singl_warn, t) ), handle_initialization(system, set_prolog_flag(X, Y), Where). handle_directive(initialization, [Body], Where) :- !, handle_initialization(user, Body, Where). handle_directive(foreign, [Template], Where) :- !, handle_directive(foreign, [Template, []], Where). handle_directive(foreign, _, _) :- g_read(call_c, f), !, warn('foreign directive ignored (not allowed in this mode)', []). handle_directive(foreign, [Template, Options], Where) :- !, callable(Template), list(Options), functor(Template, Pred, N), ( test_pred_info(pub, Pred, N) -> error('foreign predicate ~q should not be public/dynamic', [Pred/N]) ; true), define_predicate(Pred, N), g_assign(foreign_fct_name, Pred), g_assign(foreign_return, boolean), g_assign(foreign_bip, Pred/N), g_assign(foreign_choice_size, -1), foreign_get_options(Options), foreign_check_types(0, N, Template, LType), g_read(foreign_fct_name, FctName), g_read(foreign_return, Return), g_read(foreign_bip, BipPred), g_read(foreign_choice_size, ChcSize), no_internal_transf(args(FctName, Return, BipPred, ChcSize, LType), Args), functor(Head, Pred, N), SrcCl = Where + (Head :- '$foreign_call_c'(Args)), assertz(buff_discontig_clause(Pred, N, SrcCl)), add_ensure_linked('$force_foreign_link' / 0). % to force the link of foreign.o and then foreign_supp.o foreign_get_options([]). foreign_get_options([X|Options]) :- foreign_get_options1(X), !, foreign_get_options(Options). foreign_get_options1(fct_name(FctName)) :- atom(FctName), g_assign(foreign_fct_name, FctName). foreign_get_options1(return(Return)) :- atom(Return), ( Return = none ; Return = boolean ; Return = jump ), g_assign(foreign_return, Return). foreign_get_options1(bip_name(X)) :- nonvar(X), X = none, g_assign(foreign_bip, ''/ -1). foreign_get_options1(bip_name(BipName, BipArity)) :- atom(BipName), integer(BipArity), g_assign(foreign_bip, BipName/BipArity). foreign_get_options1(bip_name(BipName/BipArity)) :- atom(BipName), integer(BipArity), g_assign(foreign_bip, BipName/BipArity). foreign_get_options1(choice_size(ChcSize)) :- integer(ChcSize), g_assign(foreign_choice_size, ChcSize). foreign_check_types(N, N, _, []) :- !. foreign_check_types(I, N, Template, [(Mode, A)|LArgType]) :- I1 is I + 1, arg(I1, Template, Arg), nonvar(Arg), ( Arg = + A, Mode = in ; Arg = - A, Mode = out ; Arg = ? A, Mode = in_out ; Arg = term, A = term, Mode = in ), % term = +term nonvar(A), foreign_check_arg(A), foreign_check_types(I1, N, Template, LArgType). foreign_check_arg(integer). foreign_check_arg(positive). foreign_check_arg(float). foreign_check_arg(number). foreign_check_arg(atom). foreign_check_arg(boolean). foreign_check_arg(char). foreign_check_arg(in_char). foreign_check_arg(code). foreign_check_arg(in_code). foreign_check_arg(byte). foreign_check_arg(in_byte). foreign_check_arg(string). foreign_check_arg(chars). foreign_check_arg(codes). foreign_check_arg(term). handle_directive(DName, LArgs, _) :- length(LArgs, N), warn('unknown directive ~q - maybe use initialization/1 - directive ignored', [DName / N]). handle_initialization(system, Body, Where) :- assertz(buff_exe_system(Where + Body)). handle_initialization(user, Body, Where) :- assertz(buff_exe_user(Where + Body)). exec_directive(Goal) :- '$catch'(Goal, Err, exec_directive_exception(Goal, Err), any, 0, false), !. exec_directive(Goal) :- warn('directive failed (~q)', [Goal]). exec_directive_exception(Goal, Err) :- warn('directive failed (~q) with exception (~q)', [Goal, Err]). used_bips_via_call :- % to enforce the link of these bips op(_, _, _), char_conversion(_, _), set_prolog_flag(_, _), expand_term(_, _). add_empty_dyn([], _) :- !. add_empty_dyn([P1|P2], Where) :- !, add_empty_dyn(P1, Where), add_empty_dyn(P2, Where). add_empty_dyn((P1, P2), Where) :- !, add_empty_dyn(P1, Where), add_empty_dyn(P2, Where). add_empty_dyn(Pred / N, Where) :- assertz(empty_dyn_pred(Pred, N, Where)). add_ensure_linked([]) :- !. add_ensure_linked([P1|P2]) :- !, add_ensure_linked(P1), add_ensure_linked(P2). add_ensure_linked((P1, P2)) :- !, add_ensure_linked(P1), add_ensure_linked(P2). add_ensure_linked(Pred / N) :- clause(ensure_linked(Pred, N), true), !. add_ensure_linked(Pred / N) :- assertz(ensure_linked(Pred, N)). set_flag_for_preds([], _) :- !. set_flag_for_preds([P1|P2], Flag) :- !, set_flag_for_preds(P1, Flag), set_flag_for_preds(P2, Flag). set_flag_for_preds((P1, P2), Flag) :- !, set_flag_for_preds(P1, Flag), set_flag_for_preds(P2, Flag). set_flag_for_preds(Pred / N, Flag) :- atom(Pred), integer(N), ( test_pred_info(def, Pred, N) -> warn('directive occurs after definition of ~q - directive ignored', [Pred / N]) ; ( Flag = bpl, unset_pred_info(bfd, Pred, N) ; Flag = bfd, unset_pred_info(bpl, Pred, N) ; true ), !, set_pred_info(Flag, Pred, N) ). define_predicate(F, N) :- set_pred_info(def, F, N), test_pred_info(bpl, F, N), !. define_predicate(F, N) :- test_pred_info(bfd, F, N), !. define_predicate(F, N) :- g_read(default_kind, built_in), !, set_pred_info(bpl, F, N). define_predicate(F, N) :- g_read(default_kind, built_in_fd), !, set_pred_info(bfd, F, N). define_predicate(_, _). flag_bit(def, 0). flag_bit(dyn, 1). flag_bit(pub, 2). flag_bit(bpl, 3). flag_bit(bfd, 4). flag_bit(discontig, 5). flag_bit(cut, 6). set_pred_info(Flag, F, N) :- flag_bit(Flag, Bit), ( retract(pred_info(F, N, X)) ; X = 0 ), !, X1 is X \/ 1 << Bit, assertz(pred_info(F, N, X1)). unset_pred_info(Flag, F, N) :- flag_bit(Flag, Bit), retract(pred_info(F, N, X)), !, X1 is X /\ \ (1 << Bit), assertz(pred_info(F, N, X1)). unset_pred_info(_, _, _). test_pred_info(Flag, F, N) :- flag_bit(Flag, Bit), clause(pred_info(F, N, X), _), X /\ 1 << Bit > 0 . check_predicate(Pred, N) :- g_read(redef_error, t), bip(Pred, N), !, error('redefining built-in predicate ~q', [Pred / N]). check_predicate(Pred, N) :- g_read(redef_error, t), control_construct(Pred, N), !, error('redefining control construct ~q', [Pred / N]). check_predicate(Pred, N) :- g_read(susp_warn, t), suspicious_predicate(Pred, N), !, warn('suspicious predicate ~q', [Pred / N]). check_predicate(Pred, N) :- '$aux_name'(Pred), !, warn('using system auxiliary predicate ~q', [Pred / N]). check_predicate(_, _). control_construct(',', 2). control_construct(;, 2). control_construct(->, 2). control_construct(!, 0). control_construct(fail, 0). control_construct(true, 0). control_construct(call, 1). control_construct(catch, 3). control_construct(throw, 1). suspicious_predicate(',', 2). suspicious_predicate(;, 2). suspicious_predicate(->, 2). suspicious_predicate(!, 0). suspicious_predicate(:-, 1). suspicious_predicate(:-, 2). suspicious_predicate(-->, 2). suspicious_predicate({}, X) :- X < 2 . suspicious_predicate(+, 2). suspicious_predicate(-, 2). suspicious_predicate(*, 2). suspicious_predicate(/, 2). suspicious_predicate(//, 2). warn(Msg, LArg) :- disp_msg(warning, 0, Msg, LArg). error(Msg, LArg) :- disp_msg('fatal error', 0, Msg, LArg), repeat, % close all opened files ( close_last_prolog_file -> fail ; ! ), abort. disp_msg(MsgType, Column, Msg, LArg) :- numbervars(LArg), g_read(where, Where), ( Where = OpenFileStack + L12, L12 = _ - _ -> disp_file_name(OpenFileStack, _), disp_lines(L12), disp_column(Column) ; true ), format('~a: ', [MsgType]), format(Msg, LArg), nl(user_output). disp_file_name([], '') :- !. disp_file_name([FileName * _|OpenFileStack], ' including ') :- disp_file_name(OpenFileStack, Before), format('~a~a', [Before, FileName]). disp_lines(L - L) :- !, format(':~d', [L]). disp_lines(L1 - L2) :- format(':~d-~d', [L1, L2]). disp_column(Column) :- Column > 0, !, format(':~d: ', [Column]). disp_column(_) :- write(': '). % Exception recovery exception(error(syntax_error(_), _)) :- !, syntax_error_info(_, Line, Char, Msg), g_read(open_file_stack, OpenFileStack), g_assign(where, OpenFileStack + (Line - Line)), error('syntax error: ~a (char:~d)', [Msg, Char]). exception(error(existence_error(source_sink, File), _)) :- !, error('cannot open file ~a - does not exist', [File]). exception(error(permission_error(open, source_sink, File), _)) :- !, error('cannot open file ~a - permission error', [File]). exception(Err) :- error('exception raised: ~q', [Err]). ./gprolog-1.3.0/src/Pl2Wam/yaplib.pl0000644004425400513100000000124710547162441015507 0ustar diazloco/* $Id: yaplib.pl,v 1.2 2001/09/17 16:01:51 diaz Exp $ */ prolog_name('YAP Prolog'). prolog_version('4.3.12'). prolog_date('2000'). prolog_copyright(''). g_assign(Var, Value) :- bb_put(Var, Value). g_read(Var, Value) :- ( bb_get(Var, Value1) ; Value1 = 0 ), !, Value = Value1. argument_list([]). reverse([], []). reverse([H|T], L) :- reverse1(T, L, [H]). reverse1([], L, L). reverse1([H|T], L, L1) :- reverse1(T, L, [H|L1]). append([], L, L). append([X|L1], L2, [X|L3]) :- append(L1, L2, L3). % execution go_other :- argument_list(L), go_other1(L). go_other1([]) :- !. go_other1(L) :- pl2wam(L), halt. :- initialization(go_other). ./gprolog-1.3.0/src/Pl2Wam/pl2wam.wam0000644004425400513100000011300210547440341015571 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : pl2wam.pl % date : 1 5 2007 % time : 13:13:20 file_name('/home/diaz/GP/src/src/Pl2Wam/pl2wam.pl'). predicate(pl2wam/1,27,static,private,user,[ get_variable(x(1),0), put_structure(pl2wam1/1,0), unify_local_value(x(1)), put_structure(exception/1,2), unify_variable(x(1)), put_atom(pl2wam,3), put_integer(1,4), put_atom(true,5), execute('$catch'/6)]). predicate(pl2wam1/1,33,static,private,user,[ load_cut_level(1), allocate(13), get_variable(y(0),1), put_variable(y(1),1), put_variable(y(2),2), call(cmd_line_args/3), put_value(y(1),0), put_variable(y(3),1), call(prolog_file_name/2), put_value(y(1),0), call(read_file_init/1), put_value(y(2),0), put_value(y(1),1), call(emit_code_init/2), put_atom(native_code,0), put_variable(y(4),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(3),0), put_value(y(4),1), call(compile_msg_start/2), call(init_counters/0), call(repeat/0), put_variable(y(5),0), put_variable(y(6),1), put_variable(y(7),2), call(read_predicate/3), put_atom(user_read_file,0), put_atom(real_read_file,1), call(add_counter/2), put_value(y(7),0), put_value(y(0),1), put_value(y(4),2), put_value(y(5),3), put_value(y(6),4), call('$pl2wam1/1_$aux1'/5), call(emit_ensure_linked/0), put_variable(y(8),0), put_variable(y(9),1), call(read_file_term/2), put_variable(y(10),0), put_variable(y(11),1), call(emit_code_term/2), put_variable(y(12),0), call(read_file_error_nb/1), put_unsafe_value(y(12),0), put_unsafe_value(y(3),1), put_unsafe_value(y(8),2), put_unsafe_value(y(9),3), put_unsafe_value(y(10),4), put_unsafe_value(y(11),5), deallocate, execute('$pl2wam1/1_$aux2'/6)]). predicate('$pl2wam1/1_$aux2'/6,33,static,private,user,[ load_cut_level(6), try_me_else(1), allocate(5), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), get_variable(y(3),4), get_variable(y(4),5), get_integer(0,0), cut(x(6)), call(display_counters/0), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), put_value(y(4),4), deallocate, execute(compile_msg_end/5), label(1), trust_me_else_fail, allocate(0), put_list(1), unify_local_value(x(0)), unify_nil, put_atom('~N\t~d error(s)~n',0), call(format/2), deallocate, execute(abort/0)]). predicate('$pl2wam1/1_$aux1'/5,33,static,private,user,[ load_cut_level(5), try_me_else(1), get_nil(0), cut(x(5)), cut(x(1)), proceed, label(1), trust_me_else_fail, allocate(4), get_variable(y(0),0), get_variable(y(1),2), get_variable(y(2),3), get_variable(y(3),4), put_integer(0,0), call(read_file_error_nb/1), put_value(y(1),0), put_value(y(2),1), put_value(y(3),2), put_value(y(0),3), call(compile_and_emit_pred/4), fail]). predicate(compile_and_emit_pred/4,65,static,private,user,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(t,3),(f,5)]), label(2), try_me_else(4), label(3), allocate(7), get_atom(t,0), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_variable(y(3),3), put_variable(y(4),4), call(compile_emit_inits/5), put_value(y(2),0), put_variable(y(5),1), call(compile_lst_clause/2), put_value(y(5),0), put_variable(y(6),1), call(indexing/2), put_atom(user_indexing,0), put_atom(real_indexing,1), call(add_counter/2), put_value(y(0),0), put_value(y(1),1), put_value(y(3),2), put_value(y(4),3), put_value(y(6),4), call(emit_code/5), put_atom(user_wam_emit,0), put_atom(real_wam_emit,1), deallocate, execute(add_counter/2), label(4), trust_me_else_fail, label(5), allocate(6), get_atom(f,0), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_variable(y(3),3), put_variable(y(4),4), call(compile_emit_inits/5), put_value(y(2),0), put_variable(y(5),1), call(bc_compile_lst_clause/2), put_value(y(0),0), put_value(y(1),1), put_value(y(3),2), put_value(y(4),3), put_value(y(5),4), call(bc_emit_code/5), put_atom(user_wam_emit,0), put_atom(real_wam_emit,1), deallocate, execute(add_counter/2)]). predicate(compile_emit_inits/5,82,static,private,user,[ allocate(3), get_variable(y(0),2), get_variable(y(1),3), get_variable(y(2),4), put_atom(cur_func,2), call_c('Blt_G_Assign',[fast_call],[x(2),x(0)]), put_atom(cur_arity,2), call_c('Blt_G_Assign',[fast_call],[x(2),x(1)]), call(syntactic_sugar_init_pred/2), put_value(y(0),0), get_list(0), unify_variable(x(0)), unify_void(1), get_structure((+)/2,0), unify_variable(x(0)), unify_void(1), get_structure((+)/2,0), unify_variable(x(0)), unify_structure((-)/2), unify_local_value(y(2)), unify_void(1), get_list(0), unify_variable(x(0)), unify_void(1), get_structure((*)/2,0), unify_variable(x(0)), unify_void(1), put_value(y(1),1), deallocate, execute(absolute_file_name/2)]). predicate(compile_lst_clause/2,92,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(1), unify_variable(x(1)), unify_variable(y(1)), get_structure(cl/3,1), unify_void(1), unify_variable(x(1)), unify_variable(x(2)), call(compile_clause/3), put_value(y(0),0), put_value(y(1),1), deallocate, execute(compile_lst_clause/2)]). predicate(compile_clause/3,101,static,private,user,[ allocate(8), get_variable(y(0),1), get_variable(y(1),2), get_structure((+)/2,0), unify_variable(x(2)), unify_variable(x(0)), put_atom(where,1), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_variable(y(2),1), put_variable(y(3),2), call(syntactic_sugar/3), put_atom(user_syn_sugar,0), put_atom(real_syn_sugar,1), call(add_counter/2), put_value(y(2),0), put_value(y(3),1), put_variable(y(4),2), put_variable(y(5),3), put_variable(y(6),4), put_variable(y(7),5), call(internal_format/6), put_atom(user_internal,0), put_atom(real_internal,1), call(add_counter/2), put_value(y(4),0), put_value(y(5),1), put_value(y(6),2), put_value(y(7),3), put_value(y(1),4), call(code_generation/5), put_atom(user_code_gen,0), put_atom(real_code_gen,1), call(add_counter/2), put_value(y(1),0), call(allocate_registers/1), put_atom(user_reg_alloc,0), put_atom(real_reg_alloc,1), call(add_counter/2), put_value(y(1),0), put_value(y(0),1), call(find_first_arg/2), put_atom(user_first_arg,0), put_atom(real_first_arg,1), deallocate, execute(add_counter/2)]). predicate(bc_compile_lst_clause/2,117,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(1), unify_variable(x(1)), unify_variable(y(1)), get_structure(bc/2,1), unify_variable(x(1)), unify_variable(x(2)), get_structure((+)/2,0), unify_void(1), unify_value(x(1)), put_void(1), call(compile_clause/3), put_value(y(0),0), put_value(y(1),1), deallocate, execute(bc_compile_lst_clause/2)]). predicate(compile_msg_start/2,126,static,private,user,[ load_cut_level(2), try_me_else(1), put_atom(compile_msg,0), put_atom(f,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), cut(x(2)), proceed, label(1), trust_me_else_fail, allocate(2), get_variable(y(0),0), put_value(x(1),0), put_variable(y(1),1), call('$compile_msg_start/2_$aux1'/2), put_atom('compiling ~a for ~a...~n',0), put_list(1), unify_local_value(y(0)), unify_list, unify_local_value(y(1)), unify_nil, deallocate, execute(format/2)]). predicate('$compile_msg_start/2_$aux1'/2,129,static,private,user,[ load_cut_level(2), try_me_else(1), get_atom(t,0), cut(x(2)), get_atom('native code',1), proceed, label(1), trust_me_else_fail, get_atom('byte code',1), proceed]). predicate(compile_msg_end/5,139,static,private,user,[ load_cut_level(5), try_me_else(1), put_atom(compile_msg,0), put_atom(f,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), cut(x(5)), proceed, label(1), trust_me_else_fail, allocate(4), get_variable(y(0),0), get_variable(y(1),2), get_variable(y(2),3), put_variable(y(3),0), call(real_time/1), put_atom('~a compiled, ~d lines read - ~d bytes written, ~d ms~n',0), put_list(1), unify_local_value(y(0)), unify_list, unify_local_value(y(1)), unify_list, unify_local_value(y(2)), unify_list, unify_local_value(y(3)), unify_nil, deallocate, execute(format/2)]). predicate(cur_pred/2,149,static,private,user,[ put_atom(cur_func,2), call_c('Blt_G_Read',[fast_call,boolean],[x(2),x(0)]), put_atom(cur_arity,0), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate(cur_pred_without_aux/2,154,static,private,user,[ allocate(4), get_variable(y(0),0), get_variable(y(1),1), put_variable(y(2),0), put_variable(y(3),1), call(cur_pred/2), put_unsafe_value(y(2),0), put_unsafe_value(y(3),1), put_value(y(0),2), put_value(y(1),3), deallocate, execute('$pred_without_aux'/4)]). predicate(init_counters/0,161,static,private,user,[ load_cut_level(0), try_me_else(1), put_atom(statistics,1), put_atom(f,2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), cut(x(0)), proceed, label(1), trust_me_else_fail, put_atom(user_read_file,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(real_read_file,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(user_syn_sugar,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(real_syn_sugar,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(user_internal,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(real_internal,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(user_code_gen,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(real_code_gen,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(user_reg_alloc,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(real_reg_alloc,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(user_indexing,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(real_indexing,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(user_first_arg,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(real_first_arg,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(user_wam_emit,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(real_wam_emit,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_void(0), put_void(1), execute(last_times/2)]). predicate(add_counter/2,186,static,private,user,[ load_cut_level(2), try_me_else(1), put_atom(statistics,0), put_atom(f,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), cut(x(2)), proceed, label(1), trust_me_else_fail, allocate(4), get_variable(y(0),0), get_variable(y(1),1), put_variable(y(2),0), put_variable(y(3),1), call(last_times/2), put_value(y(0),0), put_variable(x(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(1),0), put_variable(x(1),3), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(3)]), math_fast_load_value(y(2),0), math_fast_load_value(x(2),2), call_c('Fct_Fast_Add',[fast_call,x(2)],[x(0),x(2)]), math_fast_load_value(y(3),0), math_fast_load_value(x(1),1), call_c('Fct_Fast_Add',[fast_call,x(1)],[x(0),x(1)]), put_value(y(0),0), call_c('Blt_G_Assign',[fast_call],[x(0),x(2)]), put_value(y(1),0), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), deallocate, proceed]). predicate(last_times/2,201,static,private,user,[ allocate(1), get_variable(y(0),0), get_variable(x(0),1), put_list(1), unify_void(1), unify_list, unify_local_value(x(0)), unify_nil, put_atom(real_time,0), call(statistics/2), put_atom(runtime,0), put_list(1), unify_void(1), unify_list, unify_local_value(y(0)), unify_nil, deallocate, execute(statistics/2)]). predicate(display_counters/0,208,static,private,user,[ load_cut_level(0), try_me_else(1), put_atom(statistics,1), put_atom(f,2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), cut(x(0)), proceed, label(1), trust_me_else_fail, allocate(22), put_atom(user_read_file,0), put_variable(y(0),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(real_read_file,0), put_variable(y(1),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(user_syn_sugar,0), put_variable(y(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(real_syn_sugar,0), put_variable(y(3),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(user_internal,0), put_variable(y(4),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(real_internal,0), put_variable(y(5),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(user_code_gen,0), put_variable(y(6),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(real_code_gen,0), put_variable(y(7),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(user_reg_alloc,0), put_variable(y(8),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(real_reg_alloc,0), put_variable(y(9),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(user_indexing,0), put_variable(y(10),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(real_indexing,0), put_variable(y(11),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(user_first_arg,0), put_variable(y(12),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(real_first_arg,0), put_variable(y(13),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(user_wam_emit,0), put_variable(y(14),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(real_wam_emit,0), put_variable(y(15),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), math_fast_load_value(y(0),0), math_fast_load_value(y(2),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(4),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(6),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(8),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(10),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(10),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(14),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), get_variable(y(16),0), math_fast_load_value(y(1),0), math_fast_load_value(y(3),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(5),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(7),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(9),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(11),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(11),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), math_fast_load_value(y(15),1), call_c('Fct_Fast_Add',[fast_call,x(0)],[x(0),x(1)]), get_variable(y(17),0), put_variable(y(18),0), call(user_time/1), put_variable(y(19),0), call(real_time/1), math_fast_load_value(y(18),0), math_fast_load_value(y(16),1), call_c('Fct_Fast_Sub',[fast_call,x(0)],[x(0),x(1)]), get_variable(y(20),0), math_fast_load_value(y(19),0), math_fast_load_value(y(17),1), call_c('Fct_Fast_Sub',[fast_call,x(0)],[x(0),x(1)]), get_variable(y(21),0), put_atom(' Statistics (in ms) user real~n',0), put_nil(1), call(format/2), put_atom(' source reading : %6d %6d~n',0), put_list(1), unify_local_value(y(0)), unify_list, unify_local_value(y(1)), unify_nil, call(format/2), put_atom(' syntactic sugar : %6d %6d~n',0), put_list(1), unify_local_value(y(2)), unify_list, unify_local_value(y(3)), unify_nil, call(format/2), put_atom(' internal format : %6d %6d~n',0), put_list(1), unify_local_value(y(4)), unify_list, unify_local_value(y(5)), unify_nil, call(format/2), put_atom(' code generation : %6d %6d~n',0), put_list(1), unify_local_value(y(6)), unify_list, unify_local_value(y(7)), unify_nil, call(format/2), put_atom(' register allocation: %6d %6d~n',0), put_list(1), unify_local_value(y(8)), unify_list, unify_local_value(y(9)), unify_nil, call(format/2), put_atom(' indexing : %6d %6d~n',0), put_list(1), unify_local_value(y(10)), unify_list, unify_local_value(y(11)), unify_nil, call(format/2), put_atom(' first arg computing: %6d %6d~n',0), put_list(1), unify_local_value(y(12)), unify_list, unify_local_value(y(13)), unify_nil, call(format/2), put_atom(' code emission : %6d %6d~n',0), put_list(1), unify_local_value(y(14)), unify_list, unify_local_value(y(15)), unify_nil, call(format/2), put_atom(' other : %6d %6d~n',0), put_list(1), unify_local_value(y(20)), unify_list, unify_local_value(y(21)), unify_nil, call(format/2), put_atom(' Total : %6d %6d~n',0), put_list(1), unify_local_value(y(18)), unify_list, unify_local_value(y(19)), unify_nil, deallocate, execute(format/2)]). predicate(cmd_line_args/3,251,static,private,user,[ allocate(2), get_variable(y(0),1), get_variable(y(1),2), put_atom(plfile,1), put_atom('',2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(wamfile,1), put_atom('',2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(native_code,1), put_atom(t,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(susp_warn,1), put_atom(t,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(singl_warn,1), put_atom(t,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(redef_error,1), put_atom(t,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(foreign_only,1), put_atom(f,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(call_c,1), put_atom(t,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(inline,1), put_atom(t,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(reorder,1), put_atom(t,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(reg_opt,1), put_integer(2,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(opt_last_subterm,1), put_atom(t,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(keep_void_inst,1), put_atom(f,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(fast_math,1), put_atom(f,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(statistics,1), put_atom(f,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_atom(compile_msg,1), put_atom(f,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), call(cmd_line_args/1), put_atom(plfile,0), put_value(y(0),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), call('$cmd_line_args/3_$aux1'/1), put_atom(wamfile,0), put_value(y(1),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), deallocate, proceed]). predicate('$cmd_line_args/3_$aux1'/1,251,static,private,user,[ load_cut_level(1), try_me_else(1), allocate(0), get_atom('',0), cut(x(1)), put_atom('no input file~n',0), put_nil(1), call(format/2), deallocate, execute(abort/0), label(1), trust_me_else_fail, proceed]). predicate(cmd_line_args/1,280,static,private,user,[ load_cut_level(1), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_list(0), unify_variable(x(0)), unify_variable(x(2)), get_variable(y(0),1), put_value(x(2),1), put_variable(y(1),2), call(cmd_line_arg1/3), cut(y(0)), put_unsafe_value(y(1),0), deallocate, execute(cmd_line_args/1)]). predicate(cmd_line_arg1/3,287,static,private,user,[ try_me_else(50), switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([('-o',3),('--output',5),('--pl-state',7),('-W',9),('--wam-for-native',11),('-w',13),('--wam-for-byte-code',15),('--no-susp-warn',17),('--no-singl-warn',19),('--no-redef-error',21),('--foreign-only',23),('--no-call-c',25),('--no-inline',27),('--no-reorder',29),('--no-reg-opt',31),('--min-reg-opt',33),('--no-opt-last-subterm',35),('--fast-math',37),('--keep-void-inst',39),('--statistics',41),('--compile-msg',43),('--version',45),('-h',47),('--help',49)]), label(2), try_me_else(4), label(3), get_atom('-o',0), put_atom('--output',0), execute(cmd_line_arg1/3), label(4), retry_me_else(6), label(5), allocate(1), get_atom('--output',0), put_value(x(1),0), put_variable(y(0),1), call('$cmd_line_arg1/3_$aux1'/3), put_atom(wamfile,1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), call('$cmd_line_arg1/3_$aux2'/1), put_atom(wamfile,0), put_unsafe_value(y(0),1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), deallocate, proceed, label(6), retry_me_else(8), label(7), allocate(0), get_atom('--pl-state',0), get_list(1), unify_variable(x(0)), unify_local_value(x(2)), call(read_pl_state_file/1), deallocate, execute('$cmd_line_arg1/3_$aux3'/0), label(8), retry_me_else(10), label(9), get_atom('-W',0), put_atom('--wam-for-native',0), execute(cmd_line_arg1/3), label(10), retry_me_else(12), label(11), get_atom('--wam-for-native',0), get_value(x(2),1), put_atom(native_code,0), put_atom(t,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(12), retry_me_else(14), label(13), get_atom('-w',0), put_atom('--wam-for-byte-code',0), execute(cmd_line_arg1/3), label(14), retry_me_else(16), label(15), get_atom('--wam-for-byte-code',0), get_value(x(2),1), put_atom(native_code,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(inline,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(call_c,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(16), retry_me_else(18), label(17), get_atom('--no-susp-warn',0), get_value(x(2),1), put_atom(susp_warn,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(18), retry_me_else(20), label(19), get_atom('--no-singl-warn',0), get_value(x(2),1), put_atom(singl_warn,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(20), retry_me_else(22), label(21), get_atom('--no-redef-error',0), get_value(x(2),1), put_atom(redef_error,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(22), retry_me_else(24), label(23), get_atom('--foreign-only',0), get_value(x(2),1), put_atom(foreign_only,0), put_atom(t,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(24), retry_me_else(26), label(25), get_atom('--no-call-c',0), get_value(x(2),1), put_atom(call_c,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(26), retry_me_else(28), label(27), get_atom('--no-inline',0), get_value(x(2),1), put_atom(inline,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(28), retry_me_else(30), label(29), get_atom('--no-reorder',0), get_value(x(2),1), put_atom(reorder,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(30), retry_me_else(32), label(31), get_atom('--no-reg-opt',0), get_value(x(2),1), put_atom(reg_opt,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(32), retry_me_else(34), label(33), get_atom('--min-reg-opt',0), get_value(x(2),1), put_atom(reg_opt,0), put_integer(1,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(34), retry_me_else(36), label(35), get_atom('--no-opt-last-subterm',0), get_value(x(2),1), put_atom(opt_last_subterm,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(36), retry_me_else(38), label(37), get_atom('--fast-math',0), get_value(x(2),1), put_atom(fast_math,0), put_atom(t,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(38), retry_me_else(40), label(39), get_atom('--keep-void-inst',0), get_value(x(2),1), put_atom(keep_void_inst,0), put_atom(t,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(40), retry_me_else(42), label(41), get_atom('--statistics',0), get_value(x(2),1), put_atom(statistics,0), put_atom(t,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(42), retry_me_else(44), label(43), get_atom('--compile-msg',0), get_value(x(2),1), put_atom(compile_msg,0), put_atom(t,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(44), retry_me_else(46), label(45), allocate(0), get_atom('--version',0), get_value(x(2),1), call(display_copying/0), deallocate, execute(stop/0), label(46), retry_me_else(48), label(47), get_atom('-h',0), put_atom('--help',0), execute(cmd_line_arg1/3), label(48), trust_me_else_fail, label(49), get_atom('--help',0), get_value(x(2),1), execute('$cmd_line_arg1/3_$aux4'/0), label(50), retry_me_else(51), allocate(1), get_variable(y(0),0), put_value(y(0),0), put_integer(0,1), put_integer(1,2), put_void(3), put_atom(-,4), call(sub_atom/5), put_atom('unknown option ~a - try pl2wam --help~n',0), put_list(1), unify_local_value(y(0)), unify_nil, call(format/2), deallocate, execute(abort/0), label(51), trust_me_else_fail, allocate(1), get_variable(y(0),0), get_value(x(2),1), put_atom(plfile,1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), call('$cmd_line_arg1/3_$aux5'/1), put_atom(plfile,0), put_value(y(0),1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), deallocate, proceed]). predicate('$cmd_line_arg1/3_$aux5'/1,391,static,private,user,[ load_cut_level(1), try_me_else(1), get_atom('',0), cut(x(1)), proceed, label(1), trust_me_else_fail, allocate(0), put_list(1), unify_local_value(x(0)), unify_nil, put_atom('input file already specified (~a)~n',0), call(format/2), deallocate, execute(abort/0)]). predicate('$cmd_line_arg1/3_$aux4'/0,375,static,private,user,[ try_me_else(1), allocate(1), put_variable(y(0),0), call(h/1), put_value(y(0),0), call(write/1), call(nl/0), fail, label(1), trust_me_else_fail, allocate(0), call(nl/0), put_atom('Report bugs to bug-prolog@gnu.org.',0), call(write/1), call(nl/0), deallocate, execute(stop/0)]). predicate('$cmd_line_arg1/3_$aux3'/0,305,static,private,user,[ load_cut_level(0), try_me_else(1), allocate(1), get_variable(y(0),0), put_atom(singleton_warning,0), put_atom(off,1), call(current_prolog_flag/2), cut(y(0)), put_atom(singl_warn,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), deallocate, proceed, label(1), trust_me_else_fail, proceed]). predicate('$cmd_line_arg1/3_$aux2'/1,290,static,private,user,[ load_cut_level(1), try_me_else(1), get_atom('',0), cut(x(1)), proceed, label(1), trust_me_else_fail, allocate(0), put_list(1), unify_local_value(x(0)), unify_nil, put_atom('output file already specified (~a)~n',0), call(format/2), deallocate, execute(abort/0)]). predicate('$cmd_line_arg1/3_$aux1'/3,290,static,private,user,[ try_me_else(1), allocate(1), get_list(0), unify_local_value(x(1)), unify_local_value(x(2)), put_value(x(1),0), put_integer(0,1), put_integer(1,2), put_void(3), put_variable(y(0),4), call(sub_atom/5), put_unsafe_value(y(0),0), put_atom(-,1), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), deallocate, proceed, label(1), trust_me_else_fail, allocate(0), put_atom('FILE missing after --output option~n',0), put_nil(1), call(format/2), deallocate, execute(abort/0)]). predicate(display_copying/0,405,static,private,user,[ allocate(3), put_variable(y(0),0), call(prolog_name/1), put_variable(y(1),0), call(prolog_version/1), put_variable(y(2),0), call(prolog_copyright/1), put_atom('Prolog to Wam Compiler (~a) ~a~n',0), put_list(1), unify_local_value(y(0)), unify_list, unify_local_value(y(1)), unify_nil, call(format/2), put_atom('By Daniel Diaz~n',0), put_nil(1), call(format/2), put_value(y(2),0), call(write/1), call(nl/0), put_atom('~a comes with ABSOLUTELY NO WARRANTY.~n',0), put_list(1), unify_local_value(y(0)), unify_nil, call(format/2), put_atom('You may redistribute copies of ~a~n',0), put_list(1), unify_local_value(y(0)), unify_nil, call(format/2), put_atom('under the terms of the GNU General Public License.~n',0), put_nil(1), call(format/2), put_atom('For more information about these matters, see the files named COPYING.~n',0), put_nil(1), deallocate, execute(format/2)]). predicate(prolog_name/1,421,static,private,user,[ put_value(x(0),1), put_atom(prolog_name,0), execute(current_prolog_flag/2)]). predicate(prolog_version/1,424,static,private,user,[ put_value(x(0),1), put_atom(prolog_version,0), execute(current_prolog_flag/2)]). predicate(prolog_date/1,427,static,private,user,[ put_value(x(0),1), put_atom(prolog_date,0), execute(current_prolog_flag/2)]). predicate(prolog_copyright/1,430,static,private,user,[ put_value(x(0),1), put_atom(prolog_copyright,0), execute(current_prolog_flag/2)]). predicate(h/1,438,static,private,user,[ switch_on_term(3,1,fail,fail,fail), label(1), switch_on_atom([('Usage: pl2wam [OPTION...] FILE',4),('',2),('Options:',8),(' -o FILE, --output FILE set output file name',10),(' -W, --wam-for-native produce a WAM file for native code',12),(' -w, --wam-for-byte-code produce a WAM file for byte-code (force --no-call-c)',14),(' --pl-state FILE read FILE to set the initial Prolog state',16),(' --no-susp-warn do not show warnings for suspicious predicates',18),(' --no-singl-warn do not show warnings for named singleton variables',20),(' --no-redef-error do not show errors for built-in redefinitions',22),(' --foreign-only only compile foreign/1-2 directives',24),(' --no-call-c do not allow the use of fd_tell, ''$call_c'',...',26),(' --no-inline do not inline predicates',28),(' --no-reorder do not reorder predicate arguments',30),(' --no-reg-opt do not optimize registers',32),(' --min-reg-opt minimally optimize registers',34),(' --no-opt-last-subterm do not optimize last subterm compilation',36),(' --fast-math fast mathematical mode (assume integer arithmetics)',38),(' --keep-void-inst keep void instructions in the output file',40),(' --compile-msg print a compile message',42),(' --statistics print statistics information',44),(' --help print this help and exit',46),(' --version print version number and exit',48),('''user'' can be given as FILE for the standard input/output',52)]), label(2), try(6), trust(50), label(3), try_me_else(5), label(4), get_atom('Usage: pl2wam [OPTION...] FILE',0), proceed, label(5), retry_me_else(7), label(6), get_atom('',0), proceed, label(7), retry_me_else(9), label(8), get_atom('Options:',0), proceed, label(9), retry_me_else(11), label(10), get_atom(' -o FILE, --output FILE set output file name',0), proceed, label(11), retry_me_else(13), label(12), get_atom(' -W, --wam-for-native produce a WAM file for native code',0), proceed, label(13), retry_me_else(15), label(14), get_atom(' -w, --wam-for-byte-code produce a WAM file for byte-code (force --no-call-c)',0), proceed, label(15), retry_me_else(17), label(16), get_atom(' --pl-state FILE read FILE to set the initial Prolog state',0), proceed, label(17), retry_me_else(19), label(18), get_atom(' --no-susp-warn do not show warnings for suspicious predicates',0), proceed, label(19), retry_me_else(21), label(20), get_atom(' --no-singl-warn do not show warnings for named singleton variables',0), proceed, label(21), retry_me_else(23), label(22), get_atom(' --no-redef-error do not show errors for built-in redefinitions',0), proceed, label(23), retry_me_else(25), label(24), get_atom(' --foreign-only only compile foreign/1-2 directives',0), proceed, label(25), retry_me_else(27), label(26), get_atom(' --no-call-c do not allow the use of fd_tell, ''$call_c'',...',0), proceed, label(27), retry_me_else(29), label(28), get_atom(' --no-inline do not inline predicates',0), proceed, label(29), retry_me_else(31), label(30), get_atom(' --no-reorder do not reorder predicate arguments',0), proceed, label(31), retry_me_else(33), label(32), get_atom(' --no-reg-opt do not optimize registers',0), proceed, label(33), retry_me_else(35), label(34), get_atom(' --min-reg-opt minimally optimize registers',0), proceed, label(35), retry_me_else(37), label(36), get_atom(' --no-opt-last-subterm do not optimize last subterm compilation',0), proceed, label(37), retry_me_else(39), label(38), get_atom(' --fast-math fast mathematical mode (assume integer arithmetics)',0), proceed, label(39), retry_me_else(41), label(40), get_atom(' --keep-void-inst keep void instructions in the output file',0), proceed, label(41), retry_me_else(43), label(42), get_atom(' --compile-msg print a compile message',0), proceed, label(43), retry_me_else(45), label(44), get_atom(' --statistics print statistics information',0), proceed, label(45), retry_me_else(47), label(46), get_atom(' --help print this help and exit',0), proceed, label(47), retry_me_else(49), label(48), get_atom(' --version print version number and exit',0), proceed, label(49), retry_me_else(51), label(50), get_atom('',0), proceed, label(51), trust_me_else_fail, label(52), get_atom('''user'' can be given as FILE for the standard input/output',0), proceed]). predicate(go/0,469,static,private,user,[ allocate(1), put_variable(y(0),0), call(argument_list/1), put_unsafe_value(y(0),0), deallocate, execute(pl2wam/1)]). directive(473,user,[ execute(go/0)]). ./gprolog-1.3.0/src/Pl2Wam/check_boot0000755004425400513100000000212410536305102015702 0ustar diazloco#!/bin/sh do_diff() { diff --ignore-space-change -I '^%' -I '^file_name(' $1 $2 || \ ( echo "difference encountered: $1 <> $2"; exit 1 ) } copy_files() { for i in $*; do \cp $i ${i}1 done } rm_make() { rm -f $* make >/tmp/make.log 2>&1 || (echo /tmp/make.log ; exit 1) } verify_files() { for i in $*; do # echo checking file $i do_diff $i ${i}1 || exit 1 done } do_all_bootstrap() { copy_files $* || exit 1 rm_make $* || exit 1 verify_files $* || exit 1 } usage() { echo 'usage check_boot -c [FILES] save FILES (.wam) to .wam1)' echo ' check_boot -m [FILES] rm FILES (.wam) and make (rebuild)' echo ' check_boot -v [FILES] verify FILES (.wam) vs .wam1' echo ' check_boot -a [FILES] do all (copy, make, verify)' } case $1 in -c) shift; files=${*:-*.wam}; copy_files $files || exit 1;; -m) shift; files=${*:-*.wam}; rm_make $files || exit 1;; -v) shift; files=${*:-*.wam}; verify_files $files || exit 1;; -a) shift; files=${*:-*.wam}; do_all_bootstrap $files || exit 1;; *) usage; exit 1;; esac exit 0 ./gprolog-1.3.0/src/Pl2Wam/first_arg.pl0000644004425400513100000000511410547162440016203 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog to WAM compiler * * File : first_arg.pl * * Descr.: first argument detection * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: first_arg.pl,v 1.11 2007/01/04 10:34:06 diaz Exp $ */ find_first_arg([], var). find_first_arg([WamInst|WamCode], FirstArg) :- ( defines_first_arg(WamInst, FirstArg) ; stopping_inst(WamInst), FirstArg = var ; find_first_arg(WamCode, FirstArg) ), !. stopping_inst(call(_)). stopping_inst(execute(_)). stopping_inst(cut(_)). stopping_inst(WamInst) :- codification(WamInst, LCode), assign_x0(LCode). assign_x0([Code|LCode]) :- ( Code = w(0) ; Code = c(R1, R2), R1 \== R2, R2 = 0 ; assign_x0(LCode) ). defines_first_arg(get_atom(A, 0), atm(A)). defines_first_arg(get_integer(N, 0), int(N)). %defines_first_arg(get_float(N,0),flt(N)). % no indexing on floats defines_first_arg(get_nil(0), atm([])). defines_first_arg(get_list(0), lst). defines_first_arg(get_structure(F / N, 0), stc(F, N)). ./gprolog-1.3.0/src/Pl2Wam/Makefile.in0000644004425400513100000000304610547152501015732 0ustar diazlocoGPLC = @GPLC@ GPLCFLAGS = --fast-math PLS = pl2wam.pl read_file.pl bip_list.pl syn_sugar.pl internal.pl \ code_gen.pl reg_alloc.pl inst_codif.pl first_arg.pl \ indexing.pl wam_emit.pl OBJS = $(PLS:.pl=@OBJ_SUFFIX@) WAMS = $(PLS:.pl=.wam) .SUFFIXES: .SUFFIXES: @OBJ_SUFFIX@ .wam .pl $(SUFFIXES) .pl.wam: $(GPLC) -W $(GPLCFLAGS) $*.pl .wam@OBJ_SUFFIX@: $(GPLC) -c $*.wam pl2wam@EXE_SUFFIX@: $(OBJS) [ ! -f pl2wam@EXE_SUFFIX@ ] || cp pl2wam@EXE_SUFFIX@ pl2wam0@EXE_SUFFIX@ $(GPLC) -o pl2wam@EXE_SUFFIX@ --no-fd-lib --min-bips $(OBJS) clean: [ ! -f pl2wam@EXE_SUFFIX@ ] || mv pl2wam@EXE_SUFFIX@ pl2wam0@EXE_SUFFIX@ rm -f *@OBJ_SUFFIX@ clean-wam: rm -f *.wam clean-full: clean-wam clean distclean: clean rm -f pl2wam@EXE_SUFFIX@ pl2wam0@EXE_SUFFIX@ make_bip_list@EXE_SUFFIX@ pl2wam.wam: pl2wam.pl read_file.wam: read_file.pl bip_list.wam: bip_list.pl syn_sugar.wam: syn_sugar.pl internal.wam: internal.pl code_gen.wam: code_gen.pl reg_alloc.wam: reg_alloc.pl inst_codif.wam: inst_codif.pl first_arg.wam: first_arg.pl indexing.wam: indexing.pl wam_emit.wam: wam_emit.pl check: ./check_boot -a && echo Bootstrap Prolog Compiler OK make_bip_list@EXE_SUFFIX@: make_bip_list.pl ../Bips??/[a-z]??*.pl $(GPLC) -o make_bip_list@EXE_SUFFIX@ make_bip_list.pl ./make_bip_list@EXE_SUFFIX@ >bip_list.pl make swi_pl2wam: swilib.pl $(PLS) pl -o swi_pl2wam_main -c swilib.pl $(PLS) echo "#!/bin/sh" >swi_pl2wam echo 'swi_pl2wam_main -g go -t halt -- $$*' >>swi_pl2wam chmod a+x swi_pl2wam ./gprolog-1.3.0/src/Pl2Wam/sicslib.pl0000644004425400513100000000136110547162441015654 0ustar diazloco/* $Id: sicslib.pl,v 1.5 2001/09/17 16:01:51 diaz Exp $ */ prolog_name('SICStus Prolog'). prolog_version(X) :- current_prolog_flag(version, X). prolog_date('2000'). prolog_copyright(''). g_assign(Var, Value) :- bb_put(Var, Value). g_read(Var, Value) :- ( bb_get(Var, Value1) ; Value1 = 0 ), !, Value = Value1. argument_list(LArgs) :- current_prolog_flag(argv, LArgs). reverse([], []). reverse([H|T], L) :- reverse1(T, L, [H]). reverse1([], L, L). reverse1([H|T], L, L1) :- reverse1(T, L, [H|L1]). append([], L, L). append([X|L1], L2, [X|L3]) :- append(L1, L2, L3). % execution go_other :- argument_list(L), go_other1(L). go_other1([]) :- !. go_other1(L) :- pl2wam(L), halt. :- initialization(go_other). ./gprolog-1.3.0/src/Pl2Wam/reg_alloc.wam0000644004425400513100000007676010547440341016341 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : reg_alloc.pl % date : 1 5 2007 % time : 13:13:21 file_name('/home/diaz/GP/src/src/Pl2Wam/reg_alloc.pl'). predicate(allocate_registers/1,86,static,private,user,[ put_void(1), execute(allocate_registers/2)]). predicate(allocate_registers/2,90,static,private,user,[ allocate(4), get_variable(y(0),0), get_variable(y(1),1), put_atom(reg_opt,1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), put_value(y(0),1), put_variable(y(2),2), call('$allocate_registers/2_$aux1'/3), put_value(y(0),0), put_value(y(2),1), put_void(2), put_variable(y(3),3), call(create_lst_tmp/4), put_unsafe_value(y(3),0), put_value(y(1),1), deallocate, execute(assign_lst_tmp/2)]). predicate('$allocate_registers/2_$aux1'/3,90,static,private,user,[ load_cut_level(3), try_me_else(1), math_fast_load_value(x(0),0), put_integer(0,4), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(0),x(4)]), cut(x(3)), put_value(x(1),0), put_nil(1), execute(aliases/3), label(1), trust_me_else_fail, proceed]). predicate(aliases/3,104,static,private,user,[ load_cut_level(3), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(2), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(2), unify_local_value(x(1)), unify_variable(y(1)), get_variable(y(2),3), put_value(x(1),2), put_variable(y(3),1), call('$aliases/3_$aux1'/3), cut(y(2)), put_value(y(0),0), put_unsafe_value(y(3),1), put_value(y(1),2), deallocate, execute(aliases/3)]). predicate('$aliases/3_$aux1'/3,106,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(2), get_variable(y(0),1), get_variable(y(1),3), call(alias_stop_instruction/1), cut(y(1)), put_value(y(0),0), get_nil(0), deallocate, proceed, label(1), trust_me_else_fail, allocate(3), get_variable(y(0),1), get_variable(y(1),2), put_variable(y(2),1), call(codification/2), put_unsafe_value(y(2),0), put_value(y(1),1), put_value(y(0),2), deallocate, execute(aliases1/3)]). predicate(aliases1/3,115,static,private,user,[ load_cut_level(3), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(2),1), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_variable(y(1),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_variable(y(2),3), put_value(x(1),2), put_variable(y(3),1), call('$aliases1/3_$aux1'/3), cut(y(2)), put_value(y(0),0), put_unsafe_value(y(3),1), put_value(y(1),2), deallocate, execute(aliases1/3)]). predicate('$aliases1/3_$aux1'/3,117,static,private,user,[ switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(r/1,3),(w/1,5),(c/2,7)]), label(2), try_me_else(4), label(3), get_structure(r/1,0), unify_void(1), get_value(x(2),1), proceed, label(4), retry_me_else(6), label(5), get_variable(x(3),2), get_variable(x(2),1), get_structure(w/1,0), unify_variable(x(1)), put_value(x(3),0), execute(remove_aliases_of/3), label(6), trust_me_else_fail, label(7), allocate(4), get_variable(y(0),1), get_structure(c/2,0), unify_variable(y(1)), unify_variable(y(2)), put_value(x(2),0), put_value(y(2),1), put_variable(y(3),2), call(remove_aliases_of/3), put_unsafe_value(y(3),0), put_value(y(1),1), put_value(y(2),2), put_value(y(0),3), deallocate, execute(add_alias/4)]). predicate(add_alias/4,131,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_list(3), unify_variable(x(0)), unify_nil, get_list(0), unify_local_value(x(1)), unify_list, unify_local_value(x(2)), unify_nil, proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_variable(x(0)), unify_variable(x(5)), get_list(3), unify_variable(x(3)), unify_variable(x(4)), execute('$add_alias/4_$aux1'/6)]). predicate('$add_alias/4_$aux1'/6,133,static,private,user,[ load_cut_level(6), try_me_else(1), allocate(6), get_variable(y(0),0), get_variable(y(1),2), get_variable(y(2),3), get_variable(y(3),4), get_variable(y(4),5), get_variable(y(5),6), put_value(y(0),0), call(set_elt/2), cut(y(5)), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), call(set_add/3), put_value(y(3),0), get_value(y(4),0), deallocate, proceed, label(1), trust_me_else_fail, get_value(x(0),3), put_value(x(5),0), put_value(x(4),3), execute(add_alias/4)]). predicate(find_aliases_of/3,144,static,private,user,[ get_list(0), unify_variable(x(0)), unify_variable(x(3)), execute('$find_aliases_of/3_$aux1'/4)]). predicate('$find_aliases_of/3_$aux1'/4,144,static,private,user,[ load_cut_level(4), try_me_else(1), allocate(1), get_variable(y(0),4), call(set_delete/3), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, put_value(x(3),0), execute(find_aliases_of/3)]). predicate(remove_aliases_of/3,153,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(2), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_variable(x(0)), unify_variable(x(3)), execute('$remove_aliases_of/3_$aux1'/4)]). predicate('$remove_aliases_of/3_$aux1'/4,155,static,private,user,[ load_cut_level(4), try_me_else(1), allocate(4), get_variable(y(0),2), get_variable(y(1),3), get_variable(y(2),4), put_variable(y(3),2), call(set_delete/3), cut(y(2)), put_unsafe_value(y(3),0), put_value(y(0),1), put_value(y(1),2), deallocate, execute('$remove_aliases_of/3_$aux2'/3), label(1), trust_me_else_fail, get_list(2), unify_local_value(x(0)), unify_variable(x(2)), put_value(x(3),0), execute(remove_aliases_of/3)]). predicate('$remove_aliases_of/3_$aux2'/3,155,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(3), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), call('$remove_aliases_of/3_$aux3'/1), cut(y(2)), put_value(y(0),0), get_value(y(1),0), deallocate, proceed, label(1), trust_me_else_fail, get_list(1), unify_local_value(x(0)), unify_local_value(x(2)), proceed]). predicate('$remove_aliases_of/3_$aux3'/1,155,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_void(1), unify_nil, proceed]). predicate(create_lst_tmp/4,172,static,private,user,[ load_cut_level(4), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), get_nil(2), get_nil(3), proceed, label(3), trust_me_else_fail, label(4), allocate(8), get_variable(y(2),2), get_variable(y(3),3), get_list(0), unify_variable(y(0)), unify_variable(x(0)), get_list(1), unify_variable(y(1)), unify_variable(x(1)), get_variable(y(4),4), put_variable(y(5),2), put_variable(y(6),3), call(create_lst_tmp/4), put_value(y(0),0), put_variable(y(7),1), call(codification/2), cut(y(4)), put_unsafe_value(y(7),0), put_value(y(1),1), put_unsafe_value(y(5),2), put_value(y(2),3), put_unsafe_value(y(6),4), put_value(y(3),5), deallocate, execute(handle_lst_code/6)]). predicate(handle_lst_code/6,182,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(5),4), get_value(x(3),2), proceed, label(3), trust_me_else_fail, label(4), allocate(6), get_variable(y(1),1), get_variable(y(2),3), get_variable(y(3),5), get_list(0), unify_variable(y(0)), unify_variable(x(0)), put_value(y(1),1), put_variable(y(4),3), put_variable(y(5),5), call(handle_lst_code/6), put_value(y(0),0), put_value(y(1),1), put_nil(2), put_unsafe_value(y(4),3), put_value(y(2),4), put_unsafe_value(y(5),5), put_value(y(3),6), deallocate, execute(handle_one_code/7)]). predicate(handle_one_code/7,191,static,private,user,[ switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(r/1,3),(w/1,5),(c/2,7)]), label(2), try_me_else(4), label(3), get_variable(x(7),6), get_variable(x(8),3), get_variable(x(3),2), get_variable(x(6),1), get_structure(r/1,0), unify_variable(x(1)), put_value(x(8),0), put_value(x(4),2), put_value(x(5),4), put_value(x(7),5), execute('$handle_one_code/7_$aux1'/7), label(4), retry_me_else(6), label(5), get_variable(x(7),6), get_variable(x(8),3), get_variable(x(3),2), get_variable(x(6),1), get_structure(w/1,0), unify_variable(x(1)), put_value(x(8),0), put_value(x(4),2), put_value(x(5),4), put_value(x(7),5), execute('$handle_one_code/7_$aux2'/7), label(6), trust_me_else_fail, label(7), allocate(7), get_structure(c/2,0), unify_variable(y(0)), unify_variable(y(1)), get_variable(y(2),1), get_variable(y(3),4), get_variable(y(4),6), put_structure(w/1,0), unify_value(y(1)), put_value(y(2),1), put_list(2), unify_value(y(0)), unify_nil, put_variable(y(5),4), put_variable(y(6),6), call(handle_one_code/7), put_structure(r/1,0), unify_value(y(0)), put_value(y(2),1), put_list(2), unify_value(y(1)), unify_nil, put_unsafe_value(y(5),3), put_value(y(3),4), put_unsafe_value(y(6),5), put_value(y(4),6), deallocate, execute(handle_one_code/7)]). predicate('$handle_one_code/7_$aux2'/7,208,static,private,user,[ load_cut_level(7), try_me_else(1), allocate(5), get_variable(y(0),1), get_variable(y(1),3), get_variable(y(2),4), get_variable(y(3),5), get_variable(y(4),7), put_value(y(0),1), call(set_delete/3), cut(y(4)), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), deallocate, execute('$handle_one_code/7_$aux3'/4), label(1), trust_me_else_fail, get_value(x(0),2), put_value(x(1),0), put_value(x(2),1), put_value(x(6),2), execute('$handle_one_code/7_$aux4'/6)]). predicate('$handle_one_code/7_$aux4'/6,208,static,private,user,[ load_cut_level(6), try_me_else(1), allocate(7), get_variable(y(0),0), get_variable(y(1),3), get_variable(y(2),4), get_variable(y(3),5), put_value(y(0),0), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(6)), put_value(y(0),0), put_variable(y(4),3), call(constraints/4), put_value(y(1),0), put_value(y(4),1), put_variable(y(5),2), call('$handle_one_code/7_$aux5'/3), put_value(y(5),0), put_list(1), unify_local_value(y(0)), unify_nil, put_value(y(2),2), put_variable(y(6),3), call(make_imposs/4), put_unsafe_value(y(6),0), put_value(y(0),1), put_unsafe_value(y(5),2), put_value(y(1),3), put_value(y(3),4), deallocate, execute(update_tmp/5), label(1), trust_me_else_fail, get_value(x(4),5), proceed]). predicate('$handle_one_code/7_$aux5'/3,208,static,private,user,[ load_cut_level(3), try_me_else(1), get_variable(x(4),1), get_variable(x(1),0), put_nil(0), call_c('Blt_Term_Neq',[fast_call,boolean],[x(1),x(0)]), cut(x(3)), put_value(x(4),0), execute(set_diff/3), label(1), trust_me_else_fail, get_value(x(1),2), proceed]). predicate('$handle_one_code/7_$aux3'/4,208,static,private,user,[ load_cut_level(4), try_me_else(1), get_variable(x(5),3), get_variable(x(3),1), get_variable(x(1),0), call_c('Blt_Var',[fast_call,boolean],[x(1)]), put_nil(0), call_c('Blt_Term_Neq',[fast_call,boolean],[x(3),x(0)]), cut(x(4)), put_value(x(2),0), put_value(x(5),4), put_nil(2), execute(update_tmp/5), label(1), trust_me_else_fail, get_value(x(2),3), proceed]). predicate('$handle_one_code/7_$aux1'/7,191,static,private,user,[ load_cut_level(7), try_me_else(1), allocate(7), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), get_variable(y(5),5), get_variable(y(6),7), put_value(y(0),0), put_value(y(1),1), call(set_elt/2), cut(y(6)), put_value(y(2),0), get_value(y(0),0), put_value(y(1),0), put_value(y(3),1), put_value(y(4),2), put_value(y(5),3), deallocate, execute('$handle_one_code/7_$aux6'/4), label(1), trust_me_else_fail, allocate(6), get_variable(y(0),1), get_variable(y(1),3), get_variable(y(2),4), get_variable(y(3),5), get_list(2), unify_local_value(y(0)), unify_local_value(x(0)), put_value(x(0),1), put_value(x(6),2), put_value(y(0),0), put_variable(y(4),3), call(constraints/4), put_value(y(4),0), put_list(1), unify_local_value(y(0)), unify_nil, put_value(y(2),2), put_variable(y(5),3), call(make_imposs/4), put_value(y(0),0), put_unsafe_value(y(5),1), put_unsafe_value(y(4),2), put_value(y(1),3), put_value(y(3),4), deallocate, execute('$handle_one_code/7_$aux7'/5)]). predicate('$handle_one_code/7_$aux7'/5,191,static,private,user,[ load_cut_level(5), try_me_else(1), get_variable(x(6),1), get_variable(x(1),0), call_c('Blt_Var',[fast_call,boolean],[x(1)]), cut(x(5)), put_value(x(6),0), execute(update_tmp/5), label(1), trust_me_else_fail, get_value(x(1),4), proceed]). predicate('$handle_one_code/7_$aux6'/4,191,static,private,user,[ load_cut_level(4), try_me_else(1), get_variable(x(5),3), get_variable(x(3),1), get_variable(x(1),0), call_c('Blt_Var',[fast_call,boolean],[x(1)]), put_nil(0), call_c('Blt_Term_Neq',[fast_call,boolean],[x(3),x(0)]), cut(x(4)), put_value(x(2),0), put_value(x(5),4), put_nil(2), execute(update_tmp/5), label(1), trust_me_else_fail, get_value(x(2),3), proceed]). predicate(constraints/4,235,static,private,user,[ get_variable(x(4),2), get_variable(x(2),1), get_variable(x(1),0), put_value(x(4),0), execute('$constraints/4_$aux1'/4)]). predicate('$constraints/4_$aux1'/4,235,static,private,user,[ load_cut_level(4), try_me_else(1), allocate(4), get_variable(y(0),2), get_variable(y(1),3), get_variable(y(2),4), put_atom(reg_opt,2), put_integer(2,3), call_c('Blt_G_Read',[fast_call,boolean],[x(2),x(3)]), put_variable(y(3),2), call(find_aliases_of/3), cut(y(2)), put_value(y(0),0), put_unsafe_value(y(3),1), put_value(y(1),2), deallocate, execute(set_diff/3), label(1), trust_me_else_fail, get_value(x(2),3), proceed]). predicate(update_tmp/5,245,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_list(4), unify_variable(x(0)), unify_nil, get_structure(tmp/3,0), unify_local_value(x(1)), unify_local_value(x(2)), unify_local_value(x(3)), proceed, label(3), trust_me_else_fail, label(4), get_variable(x(10),3), get_variable(x(11),1), get_list(0), unify_variable(x(9)), unify_variable(x(8)), get_list(4), unify_variable(x(6)), unify_variable(x(7)), get_structure(tmp/3,9), unify_variable(x(1)), unify_variable(x(3)), unify_variable(x(5)), put_value(x(11),0), put_value(x(10),4), execute('$update_tmp/5_$aux1'/10)]). predicate('$update_tmp/5_$aux1'/10,247,static,private,user,[ load_cut_level(10), try_me_else(1), allocate(8), get_variable(y(0),0), get_variable(y(1),4), get_variable(y(2),5), get_variable(y(3),6), get_variable(y(4),7), get_variable(y(5),8), put_value(y(0),0), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(1)]), cut(x(10)), put_value(x(2),0), put_value(x(3),1), put_variable(y(6),2), call(set_union/3), put_value(y(1),0), put_value(y(2),1), put_variable(y(7),2), call(set_union/3), put_value(y(3),0), get_structure(tmp/3,0), unify_local_value(y(0)), unify_local_value(y(6)), unify_local_value(y(7)), put_value(y(4),0), get_value(y(5),0), deallocate, proceed, label(1), trust_me_else_fail, get_variable(x(1),0), get_value(x(9),6), put_value(x(8),0), put_value(x(4),3), put_value(x(7),4), execute(update_tmp/5)]). predicate(remove_tmp/5,261,static,private,user,[ get_variable(x(6),4), get_variable(x(4),3), get_variable(x(9),1), get_list(0), unify_variable(x(8)), unify_variable(x(7)), get_structure(tmp/3,8), unify_variable(x(1)), unify_variable(x(3)), unify_variable(x(5)), put_value(x(9),0), execute('$remove_tmp/5_$aux1'/9)]). predicate('$remove_tmp/5_$aux1'/9,261,static,private,user,[ load_cut_level(9), try_me_else(1), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(1)]), cut(x(9)), get_value(x(3),2), get_value(x(5),4), get_value(x(7),6), proceed, label(1), trust_me_else_fail, get_variable(x(3),4), get_variable(x(1),0), get_list(6), unify_local_value(x(8)), unify_variable(x(4)), put_value(x(7),0), execute(remove_tmp/5)]). predicate(make_imposs/4,275,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(3),2), proceed, label(3), trust_me_else_fail, label(4), allocate(4), get_variable(y(1),1), get_variable(y(2),3), get_list(0), unify_variable(x(0)), unify_variable(y(0)), put_value(x(2),1), put_value(y(1),2), put_variable(y(3),3), call('$make_imposs/4_$aux1'/4), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(3),2), put_value(y(2),3), deallocate, execute(make_imposs/4)]). predicate('$make_imposs/4_$aux1'/4,277,static,private,user,[ load_cut_level(4), try_me_else(1), get_variable(x(5),1), get_variable(x(1),0), call_c('Blt_Var',[fast_call,boolean],[x(1)]), cut(x(4)), put_value(x(5),0), put_value(x(3),4), put_nil(3), execute(update_tmp/5), label(1), trust_me_else_fail, get_value(x(1),3), proceed]). predicate(assign_lst_tmp/2,289,static,private,user,[ allocate(2), get_variable(y(0),1), get_variable(x(1),0), put_atom(reg_opt,2), put_variable(x(0),3), call_c('Blt_G_Read',[fast_call,boolean],[x(2),x(3)]), put_variable(y(1),2), call('$assign_lst_tmp/2_$aux1'/3), put_unsafe_value(y(1),0), put_integer(-1,1), put_value(y(0),2), deallocate, execute(assign_values/3)]). predicate('$assign_lst_tmp/2_$aux1'/3,289,static,private,user,[ load_cut_level(3), try_me_else(1), get_integer(2,0), cut(x(3)), put_value(x(1),0), put_value(x(2),1), execute(assign_wishes/2), label(1), trust_me_else_fail, get_variable(x(3),1), get_variable(x(1),0), put_value(x(3),0), execute(no_wish/3)]). predicate(assign_wishes/2,300,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), proceed, label(3), trust_me_else_fail, label(4), allocate(6), get_variable(y(1),1), get_list(0), unify_variable(x(0)), unify_variable(x(2)), get_structure(tmp/3,0), unify_variable(y(0)), unify_variable(x(1)), unify_variable(x(0)), put_value(y(0),3), put_variable(y(2),4), put_variable(y(3),5), put_variable(y(4),6), call(collapse_tmps/7), put_value(y(0),0), put_value(y(3),1), put_value(y(2),2), call(try_a_whish/3), put_value(y(0),0), put_value(y(1),1), put_value(y(3),2), put_variable(y(5),3), call('$assign_wishes/2_$aux1'/4), put_unsafe_value(y(4),0), put_unsafe_value(y(5),1), deallocate, execute(assign_wishes/2)]). predicate('$assign_wishes/2_$aux1'/4,302,static,private,user,[ load_cut_level(4), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(4)), get_list(1), unify_variable(x(1)), unify_local_value(x(3)), get_structure(tmp/2,1), unify_local_value(x(0)), unify_local_value(x(2)), proceed, label(1), trust_me_else_fail, get_value(x(3),1), proceed]). predicate(collapse_tmps/7,314,static,private,user,[ load_cut_level(7), switch_on_term(2,3,fail,1,fail), label(1), try(5), retry(7), trust(9), label(2), try_me_else(4), label(3), get_nil(0), get_nil(4), get_value(x(6),2), get_value(x(5),1), proceed, label(4), retry_me_else(6), label(5), allocate(8), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), get_variable(y(5),5), get_variable(y(6),6), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_variable(y(7),7), put_value(y(3),1), put_value(y(1),2), call('$collapse_tmps/7_$aux1'/3), cut(y(7)), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), put_value(y(4),4), put_value(y(5),5), put_value(y(6),6), deallocate, execute(collapse_tmps/7), label(6), retry_me_else(8), label(7), get_list(0), unify_variable(x(8)), unify_variable(x(0)), get_list(4), unify_value(x(8)), unify_variable(x(4)), call_c('Blt_Integer',[fast_call,boolean],[x(8)]), cut(x(7)), execute(collapse_tmps/7), label(8), trust_me_else_fail, label(9), allocate(12), get_list(0), unify_variable(y(0)), unify_variable(y(1)), get_variable(y(2),1), get_variable(y(3),3), get_variable(y(4),4), get_variable(y(5),5), get_variable(y(6),6), put_value(x(2),0), put_value(y(0),1), put_variable(y(7),2), put_variable(y(8),3), put_variable(y(9),4), call(remove_tmp/5), put_value(y(2),0), put_value(y(7),1), put_variable(y(10),2), call(set_union/3), put_value(y(1),0), put_value(y(8),1), put_variable(y(11),2), call(set_union/3), put_value(y(3),0), get_value(y(0),0), put_unsafe_value(y(11),0), put_unsafe_value(y(10),1), put_unsafe_value(y(9),2), put_value(y(3),3), put_value(y(4),4), put_value(y(5),5), put_value(y(6),6), deallocate, execute(collapse_tmps/7)]). predicate('$collapse_tmps/7_$aux1'/3,316,static,private,user,[ try_me_else(1), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, get_variable(x(1),0), put_value(x(2),0), execute(set_elt/2)]). predicate(try_a_whish/3,336,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(1), get_variable(x(4),2), get_variable(y(0),3), put_list(2), unify_local_value(x(0)), unify_void(1), put_value(x(4),0), call(set_diff/3), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, proceed]). predicate(no_wish/3,344,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(2), proceed, label(3), trust_me_else_fail, label(4), allocate(3), get_variable(y(1),1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_structure(tmp/3,0), unify_variable(x(3)), unify_variable(x(1)), unify_variable(x(0)), get_list(2), unify_variable(x(2)), unify_variable(y(2)), get_structure(tmp/2,2), unify_value(x(3)), unify_variable(x(3)), put_value(x(0),2), put_value(y(1),0), call('$no_wish/3_$aux1'/4), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute(no_wish/3)]). predicate('$no_wish/3_$aux1'/4,346,static,private,user,[ load_cut_level(4), try_me_else(1), get_integer(0,0), cut(x(4)), put_value(x(1),0), put_value(x(2),1), put_value(x(3),2), execute(set_union/3), label(1), trust_me_else_fail, get_value(x(1),3), proceed]). predicate(assign_values/3,356,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_value(x(2),1), proceed, label(3), trust_me_else_fail, label(4), allocate(6), get_variable(y(2),1), get_variable(y(3),2), get_list(0), unify_variable(x(0)), unify_variable(y(1)), get_structure(tmp/2,0), unify_variable(y(0)), unify_variable(x(0)), put_variable(y(4),1), call(sort/2), put_value(y(4),0), put_integer(0,1), put_value(y(0),2), call(find_hole/3), put_value(y(0),0), put_value(y(2),1), put_variable(y(5),2), call('$assign_values/3_$aux1'/3), put_value(y(1),0), put_unsafe_value(y(5),1), put_value(y(3),2), deallocate, execute(assign_values/3)]). predicate('$assign_values/3_$aux1'/3,358,static,private,user,[ load_cut_level(3), try_me_else(1), math_fast_load_value(x(0),4), math_fast_load_value(x(1),1), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(4),x(1)]), cut(x(3)), get_value(x(0),2), proceed, label(1), trust_me_else_fail, get_value(x(1),2), proceed]). predicate(find_hole/3,370,static,private,user,[ load_cut_level(3), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_value(x(2),1), proceed, label(4), retry_me_else(6), label(5), get_list(0), unify_variable(x(4)), unify_variable(x(0)), call_c('Blt_Var',[fast_call,boolean],[x(4)]), cut(x(3)), execute(find_hole/3), label(6), trust_me_else_fail, label(7), get_list(0), unify_variable(x(0)), unify_variable(x(3)), execute('$find_hole/3_$aux1'/4)]). predicate('$find_hole/3_$aux1'/4,376,static,private,user,[ load_cut_level(4), try_me_else(1), math_fast_load_value(x(0),0), math_fast_load_value(x(1),3), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(0),x(3)]), cut(x(4)), get_value(x(1),2), proceed, label(1), trust_me_else_fail, allocate(3), get_variable(y(0),2), get_variable(y(1),3), put_variable(y(2),2), call('$find_hole/3_$aux2'/3), put_value(y(1),0), put_unsafe_value(y(2),1), put_value(y(0),2), deallocate, execute(find_hole/3)]). predicate('$find_hole/3_$aux2'/3,376,static,private,user,[ load_cut_level(3), try_me_else(1), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(1)]), cut(x(3)), math_fast_load_value(x(1),0), call_c('Fct_Fast_Inc',[fast_call,x(0)],[x(0)]), get_value(x(2),0), proceed, label(1), trust_me_else_fail, get_value(x(1),2), proceed]). predicate(set_add/3,391,static,private,user,[ load_cut_level(3), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_list(2), unify_local_value(x(1)), unify_nil, proceed, label(4), retry_me_else(6), label(5), get_list(0), unify_variable(x(0)), unify_variable(x(4)), get_list(2), unify_value(x(0)), unify_value(x(4)), call_c('Blt_Term_Eq',[fast_call,boolean],[x(1),x(0)]), cut(x(3)), proceed, label(6), trust_me_else_fail, label(7), get_list(0), unify_variable(x(3)), unify_variable(x(0)), get_list(2), unify_value(x(3)), unify_variable(x(2)), execute(set_add/3)]). predicate(set_delete/3,402,static,private,user,[ load_cut_level(3), switch_on_term(2,fail,fail,1,fail), label(1), try(3), trust(5), label(2), try_me_else(4), label(3), get_list(0), unify_variable(x(0)), unify_local_value(x(2)), call_c('Blt_Term_Eq',[fast_call,boolean],[x(1),x(0)]), cut(x(3)), proceed, label(4), trust_me_else_fail, label(5), get_list(0), unify_variable(x(3)), unify_variable(x(0)), get_list(2), unify_value(x(3)), unify_variable(x(2)), execute(set_delete/3)]). predicate(set_elt/2,412,static,private,user,[ load_cut_level(2), switch_on_term(2,fail,fail,1,fail), label(1), try(3), trust(5), label(2), try_me_else(4), label(3), get_list(0), unify_variable(x(0)), unify_void(1), call_c('Blt_Term_Eq',[fast_call,boolean],[x(1),x(0)]), cut(x(2)), proceed, label(4), trust_me_else_fail, label(5), get_list(0), unify_void(1), unify_variable(x(0)), execute(set_elt/2)]). predicate(set_inter/3,421,static,private,user,[ load_cut_level(3), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_nil(2), proceed, label(4), retry_me_else(6), label(5), allocate(4), get_variable(y(1),1), get_list(0), unify_variable(x(1)), unify_variable(y(0)), get_list(2), unify_value(x(1)), unify_variable(y(2)), get_variable(y(3),3), put_value(y(1),0), call(set_elt/2), cut(y(3)), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute(set_inter/3), label(6), trust_me_else_fail, label(7), get_list(0), unify_void(1), unify_variable(x(0)), execute(set_inter/3)]). predicate(set_union/3,433,static,private,user,[ load_cut_level(3), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_value(x(2),1), proceed, label(4), retry_me_else(6), label(5), allocate(4), get_variable(y(1),1), get_variable(y(2),2), get_list(0), unify_variable(x(1)), unify_variable(y(0)), get_variable(y(3),3), put_value(y(1),0), call(set_elt/2), cut(y(3)), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute(set_union/3), label(6), trust_me_else_fail, label(7), get_list(0), unify_variable(x(3)), unify_variable(x(0)), get_list(2), unify_value(x(3)), unify_variable(x(2)), execute(set_union/3)]). predicate(set_diff/3,445,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(2), proceed, label(3), trust_me_else_fail, label(4), allocate(3), get_variable(y(1),1), get_list(0), unify_variable(x(1)), unify_variable(y(0)), put_value(y(1),0), put_variable(y(2),3), call('$set_diff/3_$aux1'/4), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(2),2), deallocate, execute(set_diff/3)]). predicate('$set_diff/3_$aux1'/4,447,static,private,user,[ load_cut_level(4), try_me_else(1), allocate(3), get_variable(y(0),2), get_variable(y(1),3), get_variable(y(2),4), call(set_elt/2), cut(y(2)), put_value(y(0),0), get_value(y(1),0), deallocate, proceed, label(1), trust_me_else_fail, get_list(2), unify_local_value(x(1)), unify_local_value(x(3)), proceed]). ./gprolog-1.3.0/src/Pl2Wam/boot_cp0000755004425400513100000000011110253322322015220 0ustar diazloco#!/bin/sh files=${*:-*.wam} for i in $files; do \cp $i ${i}1 done ./gprolog-1.3.0/src/Pl2Wam/syn_sugar.wam0000644004425400513100000005160610547440341016414 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : syn_sugar.pl % date : 1 5 2007 % time : 13:13:21 file_name('/home/diaz/GP/src/src/Pl2Wam/syn_sugar.pl'). predicate(syntactic_sugar_init_pred/2,27,static,private,user,[ load_cut_level(2), try_me_else(1), allocate(1), get_variable(y(0),2), call('$aux_name'/1), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, put_atom(aux,0), put_integer(1,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed]). predicate(syntactic_sugar/3,36,static,private,user,[ load_cut_level(3), allocate(5), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), put_value(y(0),1), put_variable(y(3),2), call('$syntactic_sugar/3_$aux1'/3), cut(y(2)), put_value(y(3),0), put_variable(y(4),1), call(normalize_cuts/2), put_unsafe_value(y(4),0), put_value(y(0),1), put_value(y(1),2), deallocate, execute(normalize_alts/3)]). predicate('$syntactic_sugar/3_$aux1'/3,36,static,private,user,[ try_me_else(1), get_structure((:-)/2,0), unify_local_value(x(1)), unify_local_value(x(2)), proceed, label(1), trust_me_else_fail, get_value(x(1),0), get_atom(true,2), proceed]). predicate(normalize_cuts/2,46,static,private,user,[ load_cut_level(2), allocate(4), get_variable(y(0),1), get_variable(y(1),2), put_atom(has_cut,1), put_atom(f,2), call_c('Blt_G_Assign',[fast_call],[x(1),x(2)]), put_variable(y(2),1), put_variable(y(3),2), call(normalize_cuts1/3), cut(y(1)), put_value(y(0),0), put_unsafe_value(y(2),1), put_unsafe_value(y(3),2), deallocate, execute('$normalize_cuts/2_$aux1'/3)]). predicate('$normalize_cuts/2_$aux1'/3,46,static,private,user,[ load_cut_level(3), try_me_else(1), put_atom(has_cut,4), put_atom(t,5), call_c('Blt_G_Read',[fast_call,boolean],[x(4),x(5)]), cut(x(3)), get_structure((',')/2,0), unify_variable(x(0)), unify_local_value(x(2)), get_structure('$get_cut_level'/1,0), unify_local_value(x(1)), proceed, label(1), trust_me_else_fail, get_value(x(2),0), proceed]). predicate(normalize_cuts1/3,55,static,private,user,[ try_me_else(1), get_variable(x(3),0), call_c('Blt_Var',[fast_call,boolean],[x(3)]), put_structure(call/1,0), unify_local_value(x(3)), execute(normalize_cuts1/3), label(1), retry_me_else(20), switch_on_term(4,9,fail,fail,2), label(2), switch_on_structure([((;)/2,3),((->)/2,7),((',')/2,11),(call/1,15),(catch/3,17),(throw/1,19)]), label(3), try(5), trust(13), label(4), try_me_else(6), label(5), allocate(3), get_variable(y(1),1), get_structure((;)/2,0), unify_variable(x(0)), unify_variable(y(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), get_structure((->)/2,0), unify_variable(x(3)), unify_variable(x(0)), get_structure((;)/2,2), unify_variable(x(1)), unify_variable(y(2)), get_structure((',')/2,1), unify_variable(x(1)), unify_structure((',')/2), unify_value(x(3)), unify_structure((',')/2), unify_variable(x(3)), unify_variable(x(2)), get_structure('$get_cut_level'/1,1), unify_variable(x(1)), get_structure('$cut'/1,3), unify_value(x(1)), put_value(y(1),1), call(normalize_cuts1/3), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute(normalize_cuts1/3), label(6), retry_me_else(8), label(7), get_structure((->)/2,0), unify_variable(x(4)), unify_variable(x(0)), get_structure((;)/2,2), unify_variable(x(2)), unify_atom(fail), get_structure((',')/2,2), unify_variable(x(3)), unify_structure((',')/2), unify_value(x(4)), unify_structure((',')/2), unify_variable(x(4)), unify_variable(x(2)), get_structure('$get_cut_level'/1,3), unify_variable(x(3)), get_structure('$cut'/1,4), unify_value(x(3)), execute(normalize_cuts1/3), label(8), retry_me_else(10), label(9), get_atom(!,0), get_structure('$cut'/1,2), unify_local_value(x(1)), put_atom(has_cut,0), put_atom(t,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(10), retry_me_else(12), label(11), allocate(3), get_variable(y(1),1), get_structure((',')/2,0), unify_variable(x(0)), unify_variable(y(0)), get_structure((',')/2,2), unify_variable(x(2)), unify_variable(y(2)), put_value(y(1),1), call(normalize_cuts1/3), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute(normalize_cuts1/3), label(12), retry_me_else(14), label(13), allocate(3), get_variable(y(1),1), get_structure((;)/2,0), unify_variable(x(0)), unify_variable(y(0)), get_structure((;)/2,2), unify_variable(x(2)), unify_variable(y(2)), put_value(y(1),1), call(normalize_cuts1/3), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute(normalize_cuts1/3), label(14), retry_me_else(16), label(15), get_structure(call/1,0), unify_variable(x(0)), get_structure('$call'/4,2), unify_value(x(0)), unify_variable(x(0)), unify_variable(x(1)), unify_atom(true), execute(cur_pred_without_aux/2), label(16), retry_me_else(18), label(17), get_structure(catch/3,0), unify_variable(x(3)), unify_variable(x(1)), unify_variable(x(0)), get_structure('$catch'/6,2), unify_value(x(3)), unify_value(x(1)), unify_value(x(0)), unify_variable(x(0)), unify_variable(x(1)), unify_atom(true), execute(cur_pred_without_aux/2), label(18), trust_me_else_fail, label(19), get_structure(throw/1,0), unify_variable(x(0)), get_structure('$throw'/4,2), unify_value(x(0)), unify_variable(x(0)), unify_variable(x(1)), unify_atom(true), execute(cur_pred_without_aux/2), label(20), trust_me_else_fail, get_value(x(2),0), put_value(x(2),0), execute('$normalize_cuts1/3_$aux1'/1)]). predicate('$normalize_cuts1/3_$aux1'/1,90,static,private,user,[ load_cut_level(1), try_me_else(1), call_c('Blt_Callable',[fast_call,boolean],[x(0)]), cut(x(1)), proceed, label(1), trust_me_else_fail, put_list(1), unify_local_value(x(0)), unify_nil, put_atom('body goal is not callable (~q)',0), execute(error/2)]). predicate(normalize_alts/3,99,static,private,user,[ load_cut_level(3), allocate(1), get_variable(y(0),3), put_variable(x(5),3), put_variable(x(4),6), call_c('Blt_Functor',[fast_call,boolean],[x(1),x(3),x(6)]), put_atom(head_functor,3), call_c('Blt_G_Assign',[fast_call],[x(3),x(5)]), put_atom(head_arity,3), call_c('Blt_G_Assign',[fast_call],[x(3),x(4)]), call(normalize_alts1/3), cut(y(0)), deallocate, proceed]). predicate(normalize_alts1/3,106,static,private,user,[ load_cut_level(3), try_me_else(1), get_structure(call/1,2), unify_local_value(x(0)), call_c('Blt_Var',[fast_call,boolean],[x(0)]), proceed, label(1), retry_me_else(7), switch_on_term(3,fail,fail,fail,2), label(2), switch_on_structure([((',')/2,4),((;)/2,6)]), label(3), try_me_else(5), label(4), allocate(4), get_structure((',')/2,0), unify_variable(y(0)), unify_variable(y(1)), get_variable(y(2),1), get_structure((',')/2,2), unify_variable(x(2)), unify_variable(y(3)), put_value(y(0),0), put_structure((',')/2,1), unify_local_value(y(2)), unify_value(y(1)), call(normalize_alts1/3), put_value(y(1),0), put_structure((',')/2,1), unify_local_value(y(2)), unify_value(y(0)), put_value(y(3),2), deallocate, execute(normalize_alts1/3), label(5), trust_me_else_fail, label(6), allocate(9), get_structure((;)/2,0), unify_variable(y(0)), unify_variable(y(1)), get_variable(y(2),2), put_value(x(1),0), put_nil(1), put_variable(y(3),2), call(lst_var/3), put_structure((;)/2,0), unify_value(y(0)), unify_value(y(1)), put_nil(1), put_variable(y(4),2), call(lst_var/3), put_value(y(4),0), put_value(y(3),1), put_variable(y(5),2), call(set_inter/3), put_value(y(5),0), put_variable(y(6),1), call(length/2), put_atom(head_functor,1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), put_atom(head_arity,2), put_variable(x(1),3), call_c('Blt_G_Read',[fast_call,boolean],[x(2),x(3)]), put_variable(y(7),2), put_value(y(6),3), call(init_aux_pred_name/4), put_value(y(2),0), put_list(1), unify_local_value(y(7)), unify_local_value(y(5)), call_c('Blt_Univ',[fast_call,boolean],[x(0),x(1)]), put_atom(where,0), put_variable(x(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_structure((;)/2,0), unify_value(y(0)), unify_value(y(1)), put_value(y(2),1), put_variable(y(8),3), call(linearize/4), put_structure(buff_aux_pred/3,0), unify_local_value(y(7)), unify_local_value(y(6)), unify_local_value(y(8)), deallocate, execute(asserta/1), label(7), trust_me_else_fail, allocate(1), get_variable(y(0),3), put_value(x(2),1), call(pred_rewriting/2), cut(y(0)), deallocate, proceed]). predicate(init_aux_pred_name/4,132,static,private,user,[ load_cut_level(4), allocate(5), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), put_atom(aux,0), put_variable(x(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), math_fast_load_value(x(2),0), call_c('Fct_Fast_Inc',[fast_call,x(1)],[x(0)]), put_atom(aux,0), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(0),0), put_value(y(1),1), put_value(y(2),3), call('$make_aux_name'/4), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), call('$init_aux_pred_name/4_$aux1'/4), cut(y(4)), deallocate, proceed]). predicate('$init_aux_pred_name/4_$aux1'/4,132,static,private,user,[ try_me_else(1), allocate(2), get_variable(y(0),2), get_variable(y(1),3), get_variable(x(2),1), put_value(x(0),1), put_atom(bpl,0), call(test_pred_info/3), put_atom(bpl,0), put_value(y(0),1), put_value(y(1),2), deallocate, execute(set_pred_info/3), label(1), retry_me_else(2), allocate(2), get_variable(y(0),2), get_variable(y(1),3), get_variable(x(2),1), put_value(x(0),1), put_atom(bfd,0), call(test_pred_info/3), put_atom(bfd,0), put_value(y(0),1), put_value(y(1),2), deallocate, execute(set_pred_info/3), label(2), trust_me_else_fail, proceed]). predicate(linearize/4,147,static,private,user,[ execute('$linearize/4_$aux1'/4)]). predicate('$linearize/4_$aux1'/4,147,static,private,user,[ load_cut_level(4), try_me_else(1), allocate(6), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), get_structure((;)/2,0), unify_variable(y(3)), unify_variable(x(0)), cut(x(4)), put_value(y(0),1), put_value(y(1),2), put_variable(y(4),3), call(linearize/4), put_value(y(3),0), put_value(y(0),1), put_value(y(1),2), put_variable(y(5),3), call(linearize1/4), put_unsafe_value(y(5),0), put_unsafe_value(y(4),1), put_value(y(2),2), deallocate, execute(append/3), label(1), trust_me_else_fail, execute(linearize1/4)]). predicate(linearize1/4,156,static,private,user,[ load_cut_level(4), try_me_else(1), get_atom(fail,0), get_nil(3), cut(x(4)), proceed, label(1), trust_me_else_fail, get_variable(x(5),1), get_variable(x(4),0), get_list(3), unify_variable(x(0)), unify_nil, get_structure((+)/2,0), unify_local_value(x(2)), unify_variable(x(1)), put_structure((:-)/2,0), unify_local_value(x(5)), unify_local_value(x(4)), execute(copy_term/2)]). predicate(lst_var/3,165,static,private,user,[ load_cut_level(3), try_me_else(1), get_variable(x(4),1), get_variable(x(1),0), call_c('Blt_Var',[fast_call,boolean],[x(1)]), cut(x(3)), put_value(x(4),0), execute(set_add/3), label(1), trust_me_else_fail, get_variable(x(4),2), get_variable(x(3),1), put_void(2), put_variable(x(1),5), call_c('Blt_Functor',[fast_call,boolean],[x(0),x(2),x(5)]), put_value(x(0),2), put_integer(1,0), execute(lst_var_args/5)]). predicate(lst_var_args/5,175,static,private,user,[ execute('$lst_var_args/5_$aux1'/5)]). predicate('$lst_var_args/5_$aux1'/5,175,static,private,user,[ load_cut_level(5), try_me_else(1), allocate(5), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),4), math_fast_load_value(y(0),0), math_fast_load_value(y(1),1), call_c('Blt_Fast_Lte',[fast_call,boolean],[x(0),x(1)]), cut(x(5)), put_value(y(0),1), put_value(y(2),2), put_variable(x(0),4), call_c('Blt_Arg',[fast_call,boolean],[x(1),x(2),x(4)]), put_value(x(3),1), put_variable(y(4),2), call(lst_var/3), math_fast_load_value(y(0),0), call_c('Fct_Fast_Inc',[fast_call,x(0)],[x(0)]), put_value(y(1),1), put_value(y(2),2), put_unsafe_value(y(4),3), put_value(y(3),4), deallocate, execute(lst_var_args/5), label(1), trust_me_else_fail, get_value(x(3),4), proceed]). predicate(pred_rewriting/2,189,static,private,user,[ try_me_else(6), switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(fd_tell/1,3),(set_bip_name/2,5)]), label(2), try_me_else(4), label(3), allocate(2), get_structure(fd_tell/1,0), unify_variable(y(0)), get_variable(y(1),1), put_structure((/)/2,0), unify_atom(fd_tell), unify_integer(1), call(test_c_call_allowed/1), put_structure('$call_c'/2,0), unify_value(y(0)), unify_list, unify_atom(boolean), unify_nil, put_value(y(1),1), deallocate, execute(pred_rewriting/2), label(4), trust_me_else_fail, label(5), allocate(3), get_structure(set_bip_name/2,0), unify_variable(y(0)), unify_variable(y(1)), get_variable(y(2),1), put_atom(inline,0), put_atom(t,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), put_value(y(1),0), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), put_value(y(0),0), call('$pred_rewriting/2_$aux1'/1), put_value(y(1),0), call('$pred_rewriting/2_$aux2'/1), put_structure('$call_c'/1,0), unify_structure('Set_Bip_Name_2'/2), unify_value(y(0)), unify_value(y(1)), put_value(y(2),1), deallocate, execute(pred_rewriting/2), label(6), retry_me_else(7), allocate(4), get_variable(y(0),0), get_variable(y(1),1), put_atom(inline,0), put_atom(t,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(fast_math,0), put_atom(f,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), put_variable(y(2),1), put_integer(2,2), call_c('Blt_Functor',[fast_call,boolean],[x(0),x(1),x(2)]), put_value(y(2),0), call('$pred_rewriting/2_$aux3'/1), put_structure('$call_c'/1,0), unify_structure('Set_Bip_Name_2'/2), unify_local_value(y(2)), unify_integer(2), put_variable(y(3),1), call(pred_rewriting/2), put_value(y(1),0), get_structure((',')/2,0), unify_local_value(y(3)), unify_local_value(y(0)), deallocate, proceed, label(7), retry_me_else(17), switch_on_term(9,fail,fail,fail,8), label(8), switch_on_structure([('$call_c'/2,10),('$call_c'/1,12),('$call_c_test'/1,14),('$call_c_jump'/1,16)]), label(9), try_me_else(11), label(10), allocate(2), get_structure('$call_c'/2,0), unify_variable(x(0)), unify_variable(y(0)), get_structure('$call_c'/2,1), unify_value(x(0)), unify_variable(y(1)), put_structure((/)/2,0), unify_atom('$call_c'), unify_integer(2), call(test_c_call_allowed/1), put_value(y(0),0), put_value(y(1),1), deallocate, execute(no_internal_transf/2), label(11), retry_me_else(13), label(12), allocate(2), get_structure('$call_c'/1,0), unify_variable(y(0)), get_variable(y(1),1), put_structure((/)/2,0), unify_atom('$call_c'), unify_integer(1), call(test_c_call_allowed/1), put_structure('$call_c'/2,0), unify_value(y(0)), unify_nil, put_value(y(1),1), deallocate, execute(pred_rewriting/2), label(13), retry_me_else(15), label(14), allocate(2), get_structure('$call_c_test'/1,0), unify_variable(y(0)), get_variable(y(1),1), put_structure((/)/2,0), unify_atom('$call_c_test'), unify_integer(1), call(test_c_call_allowed/1), put_structure('$call_c'/2,0), unify_value(y(0)), unify_list, unify_atom(boolean), unify_nil, put_value(y(1),1), deallocate, execute(pred_rewriting/2), label(15), trust_me_else_fail, label(16), allocate(2), get_structure('$call_c_jump'/1,0), unify_variable(y(0)), get_variable(y(1),1), put_structure((/)/2,0), unify_atom('$call_c_jump'), unify_integer(1), call(test_c_call_allowed/1), put_structure('$call_c'/2,0), unify_value(y(0)), unify_list, unify_atom(jump), unify_nil, put_value(y(1),1), deallocate, execute(pred_rewriting/2), label(17), trust_me_else_fail, get_value(x(1),0), proceed]). predicate('$pred_rewriting/2_$aux3'/1,205,static,private,user,[ try_me_else(1), get_atom(is,0), proceed, label(1), trust_me_else_fail, put_void(1), execute(math_cmp_functor_name/2)]). predicate('$pred_rewriting/2_$aux2'/1,193,static,private,user,[ try_me_else(1), call_c('Blt_Integer',[fast_call,boolean],[x(0)]), proceed, label(1), trust_me_else_fail, put_list(1), unify_local_value(x(0)), unify_nil, put_atom('set_bip_name/2 inline: integer expected instead of ~q',0), execute(error/2)]). predicate('$pred_rewriting/2_$aux1'/1,193,static,private,user,[ try_me_else(1), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), proceed, label(1), trust_me_else_fail, put_list(1), unify_local_value(x(0)), unify_nil, put_atom('set_bip_name/2 inline: atom expected instead of ~q',0), execute(error/2)]). predicate(test_c_call_allowed/1,250,static,private,user,[ load_cut_level(1), try_me_else(1), put_atom(call_c,0), put_atom(t,2), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(2)]), cut(x(1)), proceed, label(1), trust_me_else_fail, put_list(1), unify_local_value(x(0)), unify_nil, put_atom('~q not allowed in this mode',0), execute(error/2)]). predicate(not_dangerous_c_call/1,260,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), get_list(0), unify_variable(x(1)), unify_variable(x(0)), put_atom(jump,2), call_c('Blt_Term_Neq',[fast_call,boolean],[x(1),x(2)]), put_atom(use_x_regs,2), call_c('Blt_Term_Neq',[fast_call,boolean],[x(1),x(2)]), execute(not_dangerous_c_call/1)]). predicate(add_wrapper_to_dyn_clause/4,270,static,private,user,[ allocate(5), get_variable(y(0),1), get_structure((+)/2,2), unify_variable(y(1)), unify_variable(y(2)), get_variable(y(3),3), put_value(y(0),1), put_value(y(3),2), put_value(y(0),3), call(init_aux_pred_name/4), put_value(y(2),0), put_value(y(3),1), put_variable(y(4),2), call('$add_wrapper_to_dyn_clause/4_$aux1'/3), put_structure((+)/2,1), unify_value(y(1)), unify_local_value(y(4)), put_structure(buff_aux_pred/3,0), unify_local_value(y(3)), unify_local_value(y(0)), unify_list, unify_value(x(1)), unify_nil, deallocate, execute(assertz/1)]). predicate('$add_wrapper_to_dyn_clause/4_$aux1'/3,270,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(3), get_variable(y(0),2), get_structure((:-)/2,0), unify_variable(x(0)), unify_variable(y(1)), cut(x(3)), put_variable(y(2),2), call(head_wrapper/3), put_value(y(0),0), get_structure((:-)/2,0), unify_local_value(y(2)), unify_value(y(1)), deallocate, proceed, label(1), trust_me_else_fail, execute(head_wrapper/3)]). predicate(head_wrapper/3,280,static,private,user,[ put_list(4), unify_void(1), unify_variable(x(3)), call_c('Blt_Univ',[fast_call,boolean],[x(0),x(4)]), put_list(0), unify_local_value(x(1)), unify_value(x(3)), call_c('Blt_Univ',[fast_call,boolean],[x(2),x(0)]), proceed]). ./gprolog-1.3.0/src/Pl2Wam/first_arg.wam0000644004425400513100000000706410547440341016361 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : first_arg.pl % date : 1 5 2007 % time : 13:13:21 file_name('/home/diaz/GP/src/src/Pl2Wam/first_arg.pl'). predicate(find_first_arg/2,27,static,private,user,[ load_cut_level(2), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_atom(var,1), proceed, label(3), trust_me_else_fail, label(4), allocate(1), get_list(0), unify_variable(x(0)), unify_variable(x(3)), get_variable(y(0),2), put_value(x(3),2), call('$find_first_arg/2_$aux1'/3), cut(y(0)), deallocate, proceed]). predicate('$find_first_arg/2_$aux1'/3,29,static,private,user,[ try_me_else(1), execute(defines_first_arg/2), label(1), retry_me_else(2), allocate(1), get_variable(y(0),1), call(stopping_inst/1), put_value(y(0),0), get_atom(var,0), deallocate, proceed, label(2), trust_me_else_fail, put_value(x(2),0), execute(find_first_arg/2)]). predicate(stopping_inst/1,39,static,private,user,[ try_me_else(8), switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(call/1,3),(execute/1,5),(cut/1,7)]), label(2), try_me_else(4), label(3), get_structure(call/1,0), unify_void(1), proceed, label(4), retry_me_else(6), label(5), get_structure(execute/1,0), unify_void(1), proceed, label(6), trust_me_else_fail, label(7), get_structure(cut/1,0), unify_void(1), proceed, label(8), trust_me_else_fail, allocate(1), put_variable(y(0),1), call(codification/2), put_unsafe_value(y(0),0), deallocate, execute(assign_x0/1)]). predicate(assign_x0/1,52,static,private,user,[ get_list(0), unify_variable(x(0)), unify_variable(x(1)), execute('$assign_x0/1_$aux1'/2)]). predicate('$assign_x0/1_$aux1'/2,52,static,private,user,[ try_me_else(6), switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(w/1,3),(c/2,5)]), label(2), try_me_else(4), label(3), get_structure(w/1,0), unify_integer(0), proceed, label(4), trust_me_else_fail, label(5), get_structure(c/2,0), unify_variable(x(1)), unify_variable(x(0)), call_c('Blt_Term_Neq',[fast_call,boolean],[x(1),x(0)]), get_integer(0,0), proceed, label(6), trust_me_else_fail, put_value(x(1),0), execute(assign_x0/1)]). predicate(defines_first_arg/2,63,static,private,user,[ switch_on_term(2,fail,fail,fail,1), label(1), switch_on_structure([(get_atom/2,3),(get_integer/2,5),(get_nil/1,7),(get_list/1,9),(get_structure/2,11)]), label(2), try_me_else(4), label(3), get_structure(get_atom/2,0), unify_variable(x(0)), unify_integer(0), get_structure(atm/1,1), unify_value(x(0)), proceed, label(4), retry_me_else(6), label(5), get_structure(get_integer/2,0), unify_variable(x(0)), unify_integer(0), get_structure(int/1,1), unify_value(x(0)), proceed, label(6), retry_me_else(8), label(7), get_structure(get_nil/1,0), unify_integer(0), get_structure(atm/1,1), unify_nil, proceed, label(8), retry_me_else(10), label(9), get_structure(get_list/1,0), unify_integer(0), get_atom(lst,1), proceed, label(10), trust_me_else_fail, label(11), get_structure(get_structure/2,0), unify_variable(x(0)), unify_integer(0), get_structure((/)/2,0), unify_variable(x(2)), unify_variable(x(0)), get_structure(stc/2,1), unify_value(x(2)), unify_value(x(0)), proceed]). ./gprolog-1.3.0/src/Pl2Wam/swi_pl2wam0000755004425400513100000000010607454522762015706 0ustar diazloco#!/bin/sh pl -g "op(0, fx, dynamic), [whole, swilib], go_other" -- $* ./gprolog-1.3.0/src/Pl2Wam/ciaolib.pl0000644004425400513100000000207710547162440015632 0ustar diazloco/* $Id: ciaolib.pl,v 1.2 2001/09/17 16:01:51 diaz Exp $ */ :- use_module(library(format)). :- use_module(library(sort)). :- use_module(library(lists)). :- use_module(library(prolog_sys), [statistics / 2]). prolog_name('CIAO Prolog'). prolog_version('1.6'). prolog_date('2000'). prolog_copyright(''). expand_term(X, X). /* g_assign(Var, Value) :- bb_put(Var, Value). g_read(Var, Value) :- ( bb_get(Var, Value1) ; Value1=0 ), !, Value=Value1. */ g_assign(Var, Value) :- ( retract(gvar(Var, _)) ; true ), !, asserta(gvar(Var, Value)). g_read(Var, Value) :- ( gvar(Var, Value1) ; Value1 = 0 ), !, Value = Value1. argument_list(LArgs) :- current_prolog_flag(argv, LArgs). /* reverse([], []). reverse([H|T], L) :- reverse1(T, L, [H]). reverse1([], L, L). reverse1([H|T], L, L1) :- reverse1(T, L, [H|L1]). append([], L, L). append([X|L1], L2, [X|L3]) :- append(L1, L2, L3). */ % execution go_other :- argument_list(L), go_other1(L). go_other1([]) :- !. go_other1(L) :- pl2wam(L), halt. :- initialization(go_other). ./gprolog-1.3.0/src/Pl2Wam/read_file.wam0000644004425400513100000020766210547440341016321 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : read_file.pl % date : 1 5 2007 % time : 13:13:21 file_name('/home/diaz/GP/src/src/Pl2Wam/read_file.pl'). predicate(read_file_init/1,108,static,private,user,[ allocate(1), get_variable(y(0),0), put_structure(buff_clause/3,0), unify_void(3), call(retractall/1), put_structure(buff_aux_pred/3,0), unify_void(3), call(retractall/1), put_structure(buff_discontig_clause/3,0), unify_void(3), call(retractall/1), put_structure(buff_dyn_interf_clause/3,0), unify_void(3), call(retractall/1), put_structure(buff_exe_system/1,0), unify_void(1), call(retractall/1), put_structure(buff_exe_user/1,0), unify_void(1), call(retractall/1), put_structure(empty_dyn_pred/3,0), unify_void(3), call(retractall/1), put_structure(ensure_linked/2,0), unify_void(2), call(retractall/1), put_structure(pred_info/3,0), unify_void(3), call(retractall/1), put_atom(default_kind,0), put_atom(user,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(reading_dyn_pred,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(eof_reached,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(open_file_stack,0), put_nil(1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(where,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(syn_error_nb,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(in_lines,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(in_bytes,0), put_integer(0,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(0),0), deallocate, execute(open_new_prolog_file/1)]). predicate(read_file_term/2,131,static,private,user,[ put_atom(in_bytes,2), call_c('Blt_G_Read',[fast_call,boolean],[x(2),x(0)]), put_atom(in_lines,0), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), proceed]). predicate(read_file_error_nb/1,138,static,private,user,[ put_atom(syn_error_nb,1), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(0)]), proceed]). predicate(open_new_prolog_file/1,144,static,private,user,[ allocate(2), put_variable(y(0),1), call(prolog_file_name/2), put_value(y(0),0), put_variable(y(1),1), call('$open_new_prolog_file/1_$aux1'/2), put_atom(open_file_stack,0), put_variable(x(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(open_file_stack,0), put_structure((*)/2,3), unify_local_value(y(0)), unify_local_value(y(1)), put_list(1), unify_value(x(3)), unify_value(x(2)), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), deallocate, proceed]). predicate('$open_new_prolog_file/1_$aux1'/2,144,static,private,user,[ load_cut_level(2), try_me_else(1), get_atom(user,0), cut(x(2)), put_value(x(1),0), execute(current_input/1), label(1), trust_me_else_fail, put_value(x(1),2), put_atom(read,1), execute(open/3)]). predicate(close_last_prolog_file/0,156,static,private,user,[ allocate(5), put_atom(open_file_stack,0), put_structure((*)/2,1), unify_void(1), unify_variable(y(0)), put_list(2), unify_value(x(1)), unify_variable(x(1)), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(2)]), put_atom(open_file_stack,0), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(in_bytes,0), put_variable(y(1),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(in_lines,0), put_variable(y(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), put_variable(y(3),1), call(character_count/2), put_value(y(0),0), put_variable(y(4),1), call(line_count/2), math_fast_load_value(y(1),0), math_fast_load_value(y(3),1), call_c('Fct_Fast_Add',[fast_call,x(2)],[x(0),x(1)]), math_fast_load_value(y(2),0), math_fast_load_value(y(4),1), call_c('Fct_Fast_Add',[fast_call,x(1)],[x(0),x(1)]), put_atom(in_bytes,0), call_c('Blt_G_Assign',[fast_call],[x(0),x(2)]), put_atom(in_lines,0), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(0),0), deallocate, execute(close/1)]). predicate(read_predicate/3,174,static,private,user,[ allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), call(repeat/0), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), call(read_predicate1/3), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute('$read_predicate/3_$aux1'/3)]). predicate('$read_predicate/3_$aux1'/3,174,static,private,user,[ load_cut_level(3), try_me_else(1), put_atom(reading_dyn_pred,4), put_atom(f,5), call_c('Blt_G_Read',[fast_call,boolean],[x(4),x(5)]), put_atom(native_code,4), put_atom(t,5), call_c('Blt_G_Read',[fast_call,boolean],[x(4),x(5)]), cut(x(3)), execute(read_predicate_next/3), label(1), trust_me_else_fail, proceed]). predicate(read_predicate_next/3,187,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_atom(dyn,0), put_value(y(0),1), put_value(y(1),2), call(test_pred_info/3), cut(y(3)), put_value(y(2),0), get_list(0), unify_variable(x(0)), unify_void(1), get_structure((+)/2,0), unify_variable(x(2)), unify_void(1), put_value(y(0),0), put_value(y(1),1), call(add_dyn_interf_clause/3), put_value(y(2),0), put_value(y(0),1), put_value(y(1),2), call(create_exe_clauses_for_dyn_pred/3), fail, label(1), retry_me_else(2), allocate(2), get_variable(y(0),2), get_variable(x(2),1), get_variable(y(1),3), put_value(x(0),1), put_atom(pub,0), call(test_pred_info/3), cut(y(1)), put_value(y(0),0), deallocate, execute(create_exe_clauses_for_pub_pred/1), label(2), trust_me_else_fail, proceed]). predicate(read_predicate1/3,203,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(1), get_variable(x(4),0), get_variable(y(0),3), put_structure(buff_aux_pred/3,0), unify_local_value(x(4)), unify_local_value(x(1)), unify_local_value(x(2)), call(retract/1), cut(y(0)), deallocate, proceed, label(1), retry_me_else(2), allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_atom(eof_reached,0), put_atom(f,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), cut(y(3)), call(repeat/0), put_value(y(0),0), put_value(y(1),1), put_variable(y(4),2), call(get_next_clause/3), put_value(y(4),0), get_structure((+)/2,0), unify_void(1), unify_variable(y(5)), put_structure(empty_dyn_pred/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_void(1), call(retractall/1), put_value(y(0),0), put_value(y(1),1), put_value(y(4),2), call('$read_predicate1/3_$aux1'/3), put_value(y(0),0), put_value(y(1),1), call('$read_predicate1/3_$aux2'/2), cut(y(3)), put_value(y(5),0), put_atom(end_of_file,1), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), put_value(y(1),1), call(define_predicate/2), put_value(y(0),0), put_value(y(1),1), put_unsafe_value(y(4),2), put_value(y(2),3), deallocate, execute(group_clauses_by_pred/4), label(2), retry_me_else(3), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_list(2), unify_variable(x(1)), unify_variable(y(2)), get_variable(y(3),3), put_structure(buff_discontig_clause/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_value(x(1)), call(retract/1), cut(y(3)), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute(recover_discontig_clauses/3), label(3), retry_me_else(4), allocate(1), get_variable(x(4),0), get_list(2), unify_variable(x(2)), unify_nil, get_variable(y(0),3), put_atom(reading_dyn_pred,0), put_atom(t,3), call_c('Blt_G_Assign',[fast_call],[x(0),x(3)]), put_structure(buff_dyn_interf_clause/3,0), unify_local_value(x(4)), unify_local_value(x(1)), unify_value(x(2)), call(retract/1), cut(y(0)), deallocate, proceed, label(4), retry_me_else(5), allocate(5), get_variable(y(0),0), get_variable(y(1),1), get_list(2), unify_variable(y(2)), unify_nil, get_variable(y(3),3), put_atom(reading_dyn_pred,0), put_atom(t,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_structure(empty_dyn_pred/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_variable(y(4)), call(retract/1), put_value(y(0),0), put_value(y(1),1), call(define_predicate/2), put_value(y(0),0), put_value(y(1),1), put_value(y(4),2), put_value(y(2),3), call('$read_predicate1/3_$aux3'/4), cut(y(3)), deallocate, proceed, label(5), retry_me_else(6), allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_atom(reading_dyn_pred,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_structure(buff_exe_system/1,0), unify_structure((+)/2), unify_variable(y(4)), unify_variable(y(5)), call(retract/1), put_value(y(0),0), get_atom('$exe_system',0), put_value(y(1),0), get_integer(0,0), put_value(y(2),0), get_list(0), unify_variable(x(0)), unify_nil, get_structure((+)/2,0), unify_value(y(4)), unify_structure((:-)/2), unify_local_value(y(0)), unify_value(y(5)), cut(y(3)), deallocate, proceed, label(6), retry_me_else(7), allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_structure(buff_exe_user/1,0), unify_structure((+)/2), unify_variable(y(4)), unify_variable(y(5)), call(retract/1), put_value(y(0),0), get_atom('$exe_user',0), put_value(y(1),0), get_integer(0,0), put_value(y(2),0), get_list(0), unify_variable(x(0)), unify_nil, get_structure((+)/2,0), unify_value(y(4)), unify_structure((:-)/2), unify_local_value(y(0)), unify_value(y(5)), cut(y(3)), deallocate, proceed, label(7), trust_me_else_fail, get_atom(end_of_file,0), get_integer(0,1), get_nil(2), cut(x(3)), proceed]). predicate('$read_predicate1/3_$aux3'/4,239,static,private,user,[ load_cut_level(4), try_me_else(1), put_atom(native_code,5), put_atom(t,6), call_c('Blt_G_Read',[fast_call,boolean],[x(5),x(6)]), cut(x(4)), execute(create_dyn_interf_clause/4), label(1), trust_me_else_fail, get_structure((+)/2,3), unify_local_value(x(2)), unify_atom('$$empty$$predicate$$clause$$'), proceed]). predicate('$read_predicate1/3_$aux2'/2,207,static,private,user,[ load_cut_level(2), try_me_else(1), allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(def,0), put_value(y(0),1), put_value(y(1),2), call(test_pred_info/3), cut(y(2)), put_atom('discontiguous predicate ~q - clause ignored',0), put_structure((/)/2,2), unify_local_value(y(0)), unify_local_value(y(1)), put_list(1), unify_value(x(2)), unify_nil, call(warn/2), fail, label(1), trust_me_else_fail, proceed]). predicate('$read_predicate1/3_$aux1'/3,207,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_atom(discontig,0), put_value(y(0),1), put_value(y(1),2), call(test_pred_info/3), cut(y(3)), put_structure(buff_discontig_clause/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_local_value(y(2)), call(assertz/1), put_value(y(0),0), put_value(y(1),1), call(define_predicate/2), fail, label(1), trust_me_else_fail, proceed]). predicate(group_clauses_by_pred/4,270,static,private,user,[ allocate(6), get_variable(y(0),0), get_variable(y(1),1), get_list(3), unify_local_value(x(2)), unify_variable(y(2)), put_variable(y(3),0), put_variable(y(4),1), put_variable(y(5),2), call(get_next_clause/3), put_value(y(0),0), put_unsafe_value(y(3),1), put_value(y(1),2), put_unsafe_value(y(4),3), put_unsafe_value(y(5),4), put_value(y(2),5), deallocate, execute('$group_clauses_by_pred/4_$aux1'/6)]). predicate('$group_clauses_by_pred/4_$aux1'/6,270,static,private,user,[ load_cut_level(6), try_me_else(1), get_value(x(1),0), get_value(x(3),2), cut(x(6)), put_value(x(1),0), put_value(x(3),1), put_value(x(4),2), put_value(x(5),3), execute(group_clauses_by_pred/4), label(1), trust_me_else_fail, get_nil(5), put_value(x(1),0), put_value(x(3),1), put_value(x(4),2), execute('$group_clauses_by_pred/4_$aux2'/3)]). predicate('$group_clauses_by_pred/4_$aux2'/3,270,static,private,user,[ load_cut_level(3), try_me_else(1), get_atom(end_of_file,0), get_integer(0,1), cut(x(3)), proceed, label(1), trust_me_else_fail, get_variable(x(3),0), put_structure(buff_clause/3,0), unify_local_value(x(3)), unify_local_value(x(1)), unify_local_value(x(2)), execute(asserta/1)]). predicate(add_dyn_interf_clause/3,286,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(1), get_variable(x(2),0), get_variable(y(0),3), put_structure(buff_dyn_interf_clause/3,0), unify_local_value(x(2)), unify_local_value(x(1)), unify_void(1), put_atom(true,1), call(clause/2), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, allocate(3), get_variable(y(0),0), get_variable(y(1),1), put_value(y(0),0), put_value(y(1),1), put_variable(y(2),3), call(create_dyn_interf_clause/4), put_structure(buff_dyn_interf_clause/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_local_value(y(2)), deallocate, execute(assertz/1)]). predicate(create_dyn_interf_clause/4,297,static,private,user,[ allocate(4), get_variable(y(0),0), get_variable(y(1),2), get_variable(y(2),3), put_variable(y(3),0), call(length/2), put_variable(x(0),1), put_list(2), unify_local_value(y(0)), unify_local_value(y(3)), call_c('Blt_Univ',[fast_call,boolean],[x(1),x(2)]), put_value(y(2),1), get_structure((+)/2,1), unify_local_value(y(1)), unify_structure((:-)/2), unify_value(x(0)), unify_structure(call/1), unify_value(x(0)), deallocate, proceed]). predicate(recover_discontig_clauses/3,305,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_list(2), unify_variable(x(1)), unify_variable(y(2)), get_variable(y(3),3), put_structure(buff_discontig_clause/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_value(x(1)), call(retract/1), cut(y(3)), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute(recover_discontig_clauses/3), label(1), trust_me_else_fail, get_nil(2), proceed]). predicate(create_exe_clauses_for_dyn_pred/3,314,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(6), get_variable(y(1),1), get_variable(y(2),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_structure((+)/2,0), unify_variable(y(3)), unify_variable(y(4)), put_value(y(1),0), put_value(y(2),1), put_structure((+)/2,2), unify_value(y(3)), unify_value(y(4)), put_variable(y(5),3), call(add_wrapper_to_dyn_clause/4), put_atom(system,0), put_structure(execute/1,2), unify_structure((/)/2), unify_local_value(y(5)), unify_local_value(y(2)), put_structure('$add_clause_term_and_bc'/2,1), unify_value(y(4)), unify_list, unify_value(x(2)), unify_nil, put_value(y(3),2), call(handle_initialization/3), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute(create_exe_clauses_for_dyn_pred/3)]). predicate(create_exe_clauses_for_pub_pred/1,325,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_structure((+)/2,0), unify_variable(x(2)), unify_variable(x(0)), put_structure('$add_clause_term'/1,1), unify_value(x(0)), put_atom(system,0), call(handle_initialization/3), put_value(y(0),0), deallocate, execute(create_exe_clauses_for_pub_pred/1)]). predicate(get_next_clause/3,334,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(2), get_variable(y(0),2), get_variable(x(2),0), get_variable(y(1),3), put_structure(buff_clause/3,0), unify_local_value(x(2)), unify_local_value(x(1)), unify_local_value(y(0)), call(retract/1), put_value(y(0),0), get_structure((+)/2,0), unify_variable(x(1)), unify_void(1), put_atom(where,0), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), cut(y(1)), deallocate, proceed, label(1), trust_me_else_fail, allocate(9), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_atom(open_file_stack,0), put_variable(y(4),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(4),0), get_list(0), unify_variable(x(0)), unify_void(1), get_structure((*)/2,0), unify_void(1), unify_variable(y(5)), put_structure(singletons/1,1), unify_variable(y(7)), put_structure(read_term/3,0), unify_value(y(5)), unify_variable(y(6)), unify_list, unify_value(x(1)), unify_nil, put_structure(syntax_error/1,2), unify_variable(y(8)), put_structure(error/2,1), unify_value(x(2)), unify_void(1), put_atom(after_syn_error,2), put_atom(any,3), put_integer(0,4), put_atom(false,5), call('$catch'/6), put_value(y(8),0), put_value(y(6),1), put_value(y(5),2), put_value(y(4),3), put_value(y(7),4), put_value(y(0),5), put_value(y(1),6), put_value(y(2),7), call('$get_next_clause/3_$aux1'/8), cut(y(3)), deallocate, proceed]). predicate('$get_next_clause/3_$aux1'/8,339,static,private,user,[ load_cut_level(8), try_me_else(1), allocate(13), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), get_variable(y(4),4), get_variable(y(5),5), get_variable(y(6),6), get_variable(y(7),7), put_value(y(0),0), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(8)), put_variable(y(8),0), put_void(1), call(last_read_start_line_column/2), put_structure(expand_term/2,0), unify_local_value(y(1)), unify_variable(y(9)), put_structure(error/2,1), unify_local_value(y(0)), unify_void(1), put_structure(dcg_error/1,2), unify_local_value(y(0)), put_atom(any,3), put_integer(0,4), put_atom(false,5), call('$catch'/6), put_value(y(2),0), put_variable(y(10),1), put_variable(y(11),2), call(stream_line_column/3), put_value(y(11),0), put_variable(y(12),1), put_value(y(10),2), call('$get_next_clause/3_$aux2'/3), put_structure((+)/2,1), unify_local_value(y(3)), unify_structure((-)/2), unify_local_value(y(8)), unify_local_value(y(12)), put_atom(where,0), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(9),0), put_value(y(4),2), put_value(y(5),3), put_value(y(6),4), put_value(y(7),5), deallocate, execute(get_next_clause1/6), label(1), trust_me_else_fail, put_value(x(5),0), put_value(x(6),1), put_value(x(7),2), execute(get_next_clause/3)]). predicate('$get_next_clause/3_$aux2'/3,339,static,private,user,[ load_cut_level(3), try_me_else(1), get_integer(1,0), cut(x(3)), math_fast_load_value(x(2),0), call_c('Fct_Fast_Dec',[fast_call,x(0)],[x(0)]), get_value(x(1),0), proceed, label(1), trust_me_else_fail, get_value(x(2),1), proceed]). predicate(get_next_clause1/6,357,static,private,user,[ load_cut_level(6), try_me_else(5), switch_on_term(1,2,fail,fail,4), label(1), try_me_else(3), label(2), allocate(3), get_atom(end_of_file,0), get_variable(y(0),3), get_variable(y(1),4), get_variable(y(2),5), call(close_last_prolog_file/0), put_atom(open_file_stack,1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), put_value(y(0),1), put_value(y(1),2), put_value(y(2),3), deallocate, execute('$get_next_clause1/6_$aux1'/4), label(3), trust_me_else_fail, label(4), allocate(6), get_structure((:-)/1,0), unify_variable(y(0)), get_variable(y(1),1), get_variable(y(2),3), get_variable(y(3),4), get_variable(y(4),5), get_variable(y(5),6), put_value(x(2),0), put_atom(directive,1), call(display_singletons/2), put_value(y(0),0), call('$get_next_clause1/6_$aux2'/1), put_value(y(0),0), put_value(y(1),1), call('$get_next_clause1/6_$aux3'/2), cut(y(5)), put_value(y(2),0), put_value(y(3),1), put_value(y(4),2), deallocate, execute(get_next_clause/3), label(5), retry_me_else(6), allocate(4), get_variable(y(0),2), get_variable(y(1),3), get_variable(y(2),4), get_structure((+)/2,5), unify_local_value(x(1)), unify_local_value(x(0)), put_atom(foreign_only,1), put_atom(f,2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), cut(x(6)), put_variable(y(3),1), call('$get_next_clause1/6_$aux4'/2), put_value(y(3),0), call('$get_next_clause1/6_$aux5'/1), put_value(y(3),0), call('$get_next_clause1/6_$aux6'/1), put_value(y(3),0), put_value(y(1),1), put_value(y(2),2), call_c('Blt_Functor',[fast_call,boolean],[x(0),x(1),x(2)]), put_value(y(1),0), put_value(y(2),1), call(check_predicate/2), put_value(y(0),0), put_structure((/)/2,1), unify_local_value(y(1)), unify_local_value(y(2)), deallocate, execute(display_singletons/2), label(6), trust_me_else_fail, put_value(x(3),0), put_value(x(4),1), put_value(x(5),2), execute(get_next_clause/3)]). predicate('$get_next_clause1/6_$aux6'/1,378,static,private,user,[ load_cut_level(1), try_me_else(1), call_c('Blt_Callable',[fast_call,boolean],[x(0)]), cut(x(1)), proceed, label(1), trust_me_else_fail, put_list(1), unify_local_value(x(0)), unify_nil, put_atom('head is not a callable (~q)',0), execute(error/2)]). predicate('$get_next_clause1/6_$aux5'/1,378,static,private,user,[ load_cut_level(1), try_me_else(1), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), cut(x(1)), proceed, label(1), trust_me_else_fail, put_atom('head is a variable',0), put_nil(1), execute(error/2)]). predicate('$get_next_clause1/6_$aux4'/2,378,static,private,user,[ try_me_else(1), get_structure((:-)/2,0), unify_local_value(x(1)), unify_void(1), proceed, label(1), trust_me_else_fail, get_value(x(1),0), proceed]). predicate('$get_next_clause1/6_$aux3'/2,368,static,private,user,[ try_me_else(1), execute(handle_directive/2), label(1), trust_me_else_fail, put_list(1), unify_local_value(x(0)), unify_nil, put_atom('invalid directive ~q',0), execute(error/2)]). predicate('$get_next_clause1/6_$aux2'/1,368,static,private,user,[ try_me_else(1), put_atom(foreign_only,0), put_atom(f,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, put_atom(foreign,1), put_void(2), call_c('Blt_Functor',[fast_call,boolean],[x(0),x(1),x(2)]), proceed]). predicate('$get_next_clause1/6_$aux1'/4,357,static,private,user,[ load_cut_level(4), try_me_else(1), get_nil(0), cut(x(4)), get_atom(end_of_file,1), get_integer(0,2), get_structure((+)/2,3), unify_void(1), unify_atom(end_of_file), put_atom(eof_reached,0), put_atom(t,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, put_value(x(1),0), put_value(x(2),1), put_value(x(3),2), execute(get_next_clause/3)]). predicate(after_syn_error/0,402,static,private,user,[ allocate(3), put_atom(syn_error_nb,1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), math_fast_load_value(x(0),0), call_c('Fct_Fast_Inc',[fast_call,x(1)],[x(0)]), put_atom(syn_error_nb,0), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_void(0), put_variable(y(0),1), put_variable(y(1),2), put_variable(y(2),3), call(syntax_error_info/4), put_atom(open_file_stack,0), put_variable(x(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(where,0), put_structure((+)/2,1), unify_value(x(2)), unify_structure((-)/2), unify_local_value(y(0)), unify_local_value(y(0)), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom('syntax error',0), put_unsafe_value(y(1),1), put_atom('~a',2), put_list(3), unify_local_value(y(2)), unify_nil, deallocate, execute(disp_msg/4)]). predicate(dcg_error/1,414,static,private,user,[ allocate(2), get_variable(y(0),0), put_variable(y(1),0), put_void(1), call(last_read_start_line_column/2), put_atom(open_file_stack,0), put_variable(x(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(where,0), put_structure((+)/2,1), unify_value(x(2)), unify_structure((-)/2), unify_local_value(y(1)), unify_local_value(y(1)), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom('DCG error raised: ~w',0), put_list(1), unify_local_value(y(0)), unify_nil, deallocate, execute(error/2)]). predicate(display_singletons/2,423,static,private,user,[ load_cut_level(2), try_me_else(1), allocate(2), get_variable(y(0),1), put_atom(singl_warn,1), put_atom(t,3), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(3)]), cut(x(2)), put_variable(y(1),1), call(get_singletons/2), put_unsafe_value(y(1),0), put_value(y(0),1), deallocate, execute('$display_singletons/2_$aux1'/2), label(1), trust_me_else_fail, proceed]). predicate('$display_singletons/2_$aux1'/2,423,static,private,user,[ load_cut_level(2), try_me_else(1), get_nil(0), cut(x(2)), proceed, label(1), trust_me_else_fail, get_variable(x(2),1), put_list(1), unify_local_value(x(0)), unify_list, unify_local_value(x(2)), unify_nil, put_atom('singleton variables ~w for ~q',0), execute(warn/2)]). predicate(get_singletons/2,436,static,private,user,[ switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(1), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_structure((=)/2,0), unify_variable(x(0)), unify_void(1), put_variable(y(1),2), call('$get_singletons/2_$aux1'/3), put_value(y(0),0), put_unsafe_value(y(1),1), deallocate, execute(get_singletons/2)]). predicate('$get_singletons/2_$aux1'/3,438,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(3), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), put_integer(0,1), put_integer(1,2), put_void(3), put_atom('_',4), call(sub_atom/5), cut(y(2)), put_value(y(0),0), get_value(y(1),0), deallocate, proceed, label(1), trust_me_else_fail, get_list(1), unify_local_value(x(0)), unify_local_value(x(2)), proceed]). predicate(handle_directive/2,450,static,private,user,[ get_variable(x(2),1), get_variable(x(3),0), put_list(4), unify_variable(x(0)), unify_variable(x(1)), call_c('Blt_Univ',[fast_call,boolean],[x(3),x(4)]), execute(handle_directive/3)]). predicate(foreign_get_options/1,569,static,private,user,[ load_cut_level(1), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_variable(y(1),1), call(foreign_get_options1/1), cut(y(1)), put_value(y(0),0), deallocate, execute(foreign_get_options/1)]). predicate(foreign_get_options1/1,576,static,private,user,[ switch_on_term(3,fail,fail,fail,1), label(1), switch_on_structure([(fct_name/1,4),(return/1,6),(bip_name/1,2),(bip_name/2,10),(choice_size/1,14)]), label(2), try(8), trust(12), label(3), try_me_else(5), label(4), get_structure(fct_name/1,0), unify_variable(x(1)), call_c('Blt_Atom',[fast_call,boolean],[x(1)]), put_atom(foreign_fct_name,0), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(5), retry_me_else(7), label(6), allocate(1), get_structure(return/1,0), unify_variable(y(0)), put_value(y(0),0), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), put_value(y(0),0), call('$foreign_get_options1/1_$aux1'/1), put_atom(foreign_return,0), put_value(y(0),1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), deallocate, proceed, label(7), retry_me_else(9), label(8), get_structure(bip_name/1,0), unify_variable(x(0)), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), get_atom(none,0), put_atom(foreign_bip,0), put_structure((/)/2,1), unify_atom(''), unify_integer(-1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(9), retry_me_else(11), label(10), get_structure(bip_name/2,0), unify_variable(x(3)), unify_variable(x(2)), call_c('Blt_Atom',[fast_call,boolean],[x(3)]), call_c('Blt_Integer',[fast_call,boolean],[x(2)]), put_atom(foreign_bip,0), put_structure((/)/2,1), unify_value(x(3)), unify_value(x(2)), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(11), retry_me_else(13), label(12), get_structure(bip_name/1,0), unify_structure((/)/2), unify_variable(x(3)), unify_variable(x(2)), call_c('Blt_Atom',[fast_call,boolean],[x(3)]), call_c('Blt_Integer',[fast_call,boolean],[x(2)]), put_atom(foreign_bip,0), put_structure((/)/2,1), unify_value(x(3)), unify_value(x(2)), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(13), trust_me_else_fail, label(14), get_structure(choice_size/1,0), unify_variable(x(1)), call_c('Blt_Integer',[fast_call,boolean],[x(1)]), put_atom(foreign_choice_size,0), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed]). predicate('$foreign_get_options1/1_$aux1'/1,580,static,private,user,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(none,3),(boolean,5),(jump,7)]), label(2), try_me_else(4), label(3), get_atom(none,0), proceed, label(4), retry_me_else(6), label(5), get_atom(boolean,0), proceed, label(6), trust_me_else_fail, label(7), get_atom(jump,0), proceed]). predicate(foreign_check_types/4,610,static,private,user,[ load_cut_level(4), try_me_else(1), get_nil(3), get_value(x(1),0), cut(x(4)), proceed, label(1), trust_me_else_fail, allocate(5), get_variable(y(0),1), get_variable(y(1),2), get_list(3), unify_variable(x(1)), unify_variable(y(3)), get_structure((',')/2,1), unify_variable(x(2)), unify_variable(y(2)), math_fast_load_value(x(0),0), call_c('Fct_Fast_Inc',[fast_call,x(0)],[x(0)]), get_variable(y(4),0), put_value(y(4),1), put_value(y(1),3), put_variable(x(0),4), call_c('Blt_Arg',[fast_call,boolean],[x(1),x(3),x(4)]), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), put_value(y(2),1), call('$foreign_check_types/4_$aux1'/3), put_value(y(2),0), call_c('Blt_Non_Var',[fast_call,boolean],[x(0)]), put_value(y(2),0), call(foreign_check_arg/1), put_value(y(4),0), put_value(y(0),1), put_value(y(1),2), put_value(y(3),3), deallocate, execute(foreign_check_types/4)]). predicate('$foreign_check_types/4_$aux1'/3,613,static,private,user,[ switch_on_term(2,9,fail,fail,1), label(1), switch_on_structure([((+)/1,3),((-)/1,5),((?)/1,7)]), label(2), try_me_else(4), label(3), get_structure((+)/1,0), unify_local_value(x(1)), get_atom(in,2), proceed, label(4), retry_me_else(6), label(5), get_structure((-)/1,0), unify_local_value(x(1)), get_atom(out,2), proceed, label(6), retry_me_else(8), label(7), get_structure((?)/1,0), unify_local_value(x(1)), get_atom(in_out,2), proceed, label(8), trust_me_else_fail, label(9), get_atom(term,0), get_atom(term,1), get_atom(in,2), proceed]). predicate(foreign_check_arg/1,631,static,private,user,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(integer,3),(positive,5),(float,7),(number,9),(atom,11),(boolean,13),(char,15),(in_char,17),(code,19),(in_code,21),(byte,23),(in_byte,25),(string,27),(chars,29),(codes,31),(term,33)]), label(2), try_me_else(4), label(3), get_atom(integer,0), proceed, label(4), retry_me_else(6), label(5), get_atom(positive,0), proceed, label(6), retry_me_else(8), label(7), get_atom(float,0), proceed, label(8), retry_me_else(10), label(9), get_atom(number,0), proceed, label(10), retry_me_else(12), label(11), get_atom(atom,0), proceed, label(12), retry_me_else(14), label(13), get_atom(boolean,0), proceed, label(14), retry_me_else(16), label(15), get_atom(char,0), proceed, label(16), retry_me_else(18), label(17), get_atom(in_char,0), proceed, label(18), retry_me_else(20), label(19), get_atom(code,0), proceed, label(20), retry_me_else(22), label(21), get_atom(in_code,0), proceed, label(22), retry_me_else(24), label(23), get_atom(byte,0), proceed, label(24), retry_me_else(26), label(25), get_atom(in_byte,0), proceed, label(26), retry_me_else(28), label(27), get_atom(string,0), proceed, label(28), retry_me_else(30), label(29), get_atom(chars,0), proceed, label(30), retry_me_else(32), label(31), get_atom(codes,0), proceed, label(32), trust_me_else_fail, label(33), get_atom(term,0), proceed]). predicate(handle_initialization/3,658,static,private,user,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(system,3),(user,5)]), label(2), try_me_else(4), label(3), get_atom(system,0), put_structure(buff_exe_system/1,0), unify_structure((+)/2), unify_local_value(x(2)), unify_local_value(x(1)), execute(assertz/1), label(4), trust_me_else_fail, label(5), get_atom(user,0), put_structure(buff_exe_user/1,0), unify_structure((+)/2), unify_local_value(x(2)), unify_local_value(x(1)), execute(assertz/1)]). predicate(exec_directive/1,667,static,private,user,[ load_cut_level(1), try_me_else(1), allocate(1), get_variable(y(0),1), put_structure(exec_directive_exception/2,2), unify_local_value(x(0)), unify_variable(x(1)), put_atom(any,3), put_integer(0,4), put_atom(false,5), call('$catch'/6), cut(y(0)), deallocate, proceed, label(1), trust_me_else_fail, put_list(1), unify_local_value(x(0)), unify_nil, put_atom('directive failed (~q)',0), execute(warn/2)]). predicate(exec_directive_exception/2,673,static,private,user,[ get_variable(x(2),1), put_list(1), unify_local_value(x(0)), unify_list, unify_local_value(x(2)), unify_nil, put_atom('directive failed (~q) with exception (~q)',0), execute(warn/2)]). predicate(used_bips_via_call/0,678,static,private,user,[ allocate(0), put_void(0), put_void(1), put_void(2), call(op/3), put_void(0), put_void(1), call(char_conversion/2), put_void(0), put_void(1), call(set_prolog_flag/2), put_void(0), put_void(1), deallocate, execute(expand_term/2)]). predicate(add_empty_dyn/2,687,static,private,user,[ load_cut_level(2), switch_on_term(2,3,fail,5,1), label(1), switch_on_structure([((',')/2,7),((/)/2,9)]), label(2), try_me_else(4), label(3), get_nil(0), cut(x(2)), proceed, label(4), retry_me_else(6), label(5), allocate(2), get_variable(y(1),1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), cut(x(2)), put_value(y(1),1), call(add_empty_dyn/2), put_value(y(0),0), put_value(y(1),1), deallocate, execute(add_empty_dyn/2), label(6), retry_me_else(8), label(7), allocate(2), get_variable(y(1),1), get_structure((',')/2,0), unify_variable(x(0)), unify_variable(y(0)), cut(x(2)), put_value(y(1),1), call(add_empty_dyn/2), put_value(y(0),0), put_value(y(1),1), deallocate, execute(add_empty_dyn/2), label(8), trust_me_else_fail, label(9), get_structure((/)/2,0), unify_variable(x(3)), unify_variable(x(2)), put_structure(empty_dyn_pred/3,0), unify_value(x(3)), unify_value(x(2)), unify_local_value(x(1)), execute(assertz/1)]). predicate(add_ensure_linked/1,706,static,private,user,[ load_cut_level(1), switch_on_term(3,4,fail,6,1), label(1), switch_on_structure([((',')/2,8),((/)/2,2)]), label(2), try(10), trust(12), label(3), try_me_else(5), label(4), get_nil(0), cut(x(1)), proceed, label(5), retry_me_else(7), label(6), allocate(1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), cut(x(1)), call(add_ensure_linked/1), put_value(y(0),0), deallocate, execute(add_ensure_linked/1), label(7), retry_me_else(9), label(8), allocate(1), get_structure((',')/2,0), unify_variable(x(0)), unify_variable(y(0)), cut(x(1)), call(add_ensure_linked/1), put_value(y(0),0), deallocate, execute(add_ensure_linked/1), label(9), retry_me_else(11), label(10), allocate(1), get_structure((/)/2,0), unify_variable(x(3)), unify_variable(x(2)), get_variable(y(0),1), put_structure(ensure_linked/2,0), unify_value(x(3)), unify_value(x(2)), put_atom(true,1), call(clause/2), cut(y(0)), deallocate, proceed, label(11), trust_me_else_fail, label(12), get_structure((/)/2,0), unify_variable(x(2)), unify_variable(x(1)), put_structure(ensure_linked/2,0), unify_value(x(2)), unify_value(x(1)), execute(assertz/1)]). predicate(set_flag_for_preds/2,728,static,private,user,[ load_cut_level(2), switch_on_term(2,3,fail,5,1), label(1), switch_on_structure([((',')/2,7),((/)/2,9)]), label(2), try_me_else(4), label(3), get_nil(0), cut(x(2)), proceed, label(4), retry_me_else(6), label(5), allocate(2), get_variable(y(1),1), get_list(0), unify_variable(x(0)), unify_variable(y(0)), cut(x(2)), put_value(y(1),1), call(set_flag_for_preds/2), put_value(y(0),0), put_value(y(1),1), deallocate, execute(set_flag_for_preds/2), label(6), retry_me_else(8), label(7), allocate(2), get_variable(y(1),1), get_structure((',')/2,0), unify_variable(x(0)), unify_variable(y(0)), cut(x(2)), put_value(y(1),1), call(set_flag_for_preds/2), put_value(y(0),0), put_value(y(1),1), deallocate, execute(set_flag_for_preds/2), label(8), trust_me_else_fail, label(9), get_variable(x(4),1), get_structure((/)/2,0), unify_variable(x(0)), unify_variable(x(1)), get_variable(x(3),2), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), call_c('Blt_Integer',[fast_call,boolean],[x(1)]), put_value(x(4),2), execute('$set_flag_for_preds/2_$aux1'/4)]). predicate('$set_flag_for_preds/2_$aux1'/4,741,static,private,user,[ load_cut_level(4), try_me_else(1), allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),4), put_atom(def,0), put_value(y(0),1), put_value(y(1),2), call(test_pred_info/3), cut(y(2)), put_atom('directive occurs after definition of ~q - directive ignored',0), put_structure((/)/2,2), unify_local_value(y(0)), unify_local_value(y(1)), put_list(1), unify_value(x(2)), unify_nil, deallocate, execute(warn/2), label(1), trust_me_else_fail, allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_value(y(2),0), put_value(y(0),1), put_value(y(1),2), call('$set_flag_for_preds/2_$aux2'/3), cut(y(3)), put_value(y(2),0), put_value(y(0),1), put_value(y(1),2), deallocate, execute(set_pred_info/3)]). predicate('$set_flag_for_preds/2_$aux2'/3,741,static,private,user,[ try_me_else(6), switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(bpl,3),(bfd,5)]), label(2), try_me_else(4), label(3), get_atom(bpl,0), put_atom(bfd,0), execute(unset_pred_info/3), label(4), trust_me_else_fail, label(5), get_atom(bfd,0), put_atom(bpl,0), execute(unset_pred_info/3), label(6), trust_me_else_fail, proceed]). predicate(define_predicate/2,758,static,private,user,[ load_cut_level(2), try_me_else(1), allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(def,0), put_value(y(0),1), put_value(y(1),2), call(set_pred_info/3), put_atom(bpl,0), put_value(y(0),1), put_value(y(1),2), call(test_pred_info/3), cut(y(2)), deallocate, proceed, label(1), retry_me_else(2), allocate(1), get_variable(x(3),1), get_variable(y(0),2), put_value(x(0),1), put_value(x(3),2), put_atom(bfd,0), call(test_pred_info/3), cut(y(0)), deallocate, proceed, label(2), retry_me_else(3), get_variable(x(3),1), put_atom(default_kind,1), put_atom(built_in,4), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(4)]), cut(x(2)), put_value(x(0),1), put_value(x(3),2), put_atom(bpl,0), execute(set_pred_info/3), label(3), retry_me_else(4), get_variable(x(3),1), put_atom(default_kind,1), put_atom(built_in_fd,4), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(4)]), cut(x(2)), put_value(x(0),1), put_value(x(3),2), put_atom(bfd,0), execute(set_pred_info/3), label(4), trust_me_else_fail, proceed]). predicate(flag_bit/2,778,static,private,user,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([(def,3),(dyn,5),(pub,7),(bpl,9),(bfd,11),(discontig,13),(cut,15)]), label(2), try_me_else(4), label(3), get_atom(def,0), get_integer(0,1), proceed, label(4), retry_me_else(6), label(5), get_atom(dyn,0), get_integer(1,1), proceed, label(6), retry_me_else(8), label(7), get_atom(pub,0), get_integer(2,1), proceed, label(8), retry_me_else(10), label(9), get_atom(bpl,0), get_integer(3,1), proceed, label(10), retry_me_else(12), label(11), get_atom(bfd,0), get_integer(4,1), proceed, label(12), retry_me_else(14), label(13), get_atom(discontig,0), get_integer(5,1), proceed, label(14), trust_me_else_fail, label(15), get_atom(cut,0), get_integer(6,1), proceed]). predicate(set_pred_info/3,789,static,private,user,[ load_cut_level(3), allocate(5), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), put_variable(y(3),1), call(flag_bit/2), put_value(y(0),0), put_value(y(1),1), put_variable(y(4),2), call('$set_pred_info/3_$aux1'/3), cut(y(2)), math_fast_load_value(y(4),0), put_integer(1,1), math_fast_load_value(y(3),2), call_c('Fct_Fast_Shl',[fast_call,x(1)],[x(1),x(2)]), call_c('Fct_Fast_Or',[fast_call,x(1)],[x(0),x(1)]), put_structure(pred_info/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_local_value(x(1)), deallocate, execute(assertz/1)]). predicate('$set_pred_info/3_$aux1'/3,789,static,private,user,[ try_me_else(1), get_variable(x(3),0), put_structure(pred_info/3,0), unify_local_value(x(3)), unify_local_value(x(1)), unify_local_value(x(2)), execute(retract/1), label(1), trust_me_else_fail, get_integer(0,2), proceed]). predicate(unset_pred_info/3,800,static,private,user,[ load_cut_level(3), try_me_else(1), allocate(5), get_variable(y(0),1), get_variable(y(1),2), get_variable(y(2),3), put_variable(y(3),1), call(flag_bit/2), put_structure(pred_info/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_variable(y(4)), call(retract/1), cut(y(2)), math_fast_load_value(y(4),0), put_integer(1,1), math_fast_load_value(y(3),2), call_c('Fct_Fast_Shl',[fast_call,x(1)],[x(1),x(2)]), call_c('Fct_Fast_Not',[fast_call,x(1)],[x(1)]), call_c('Fct_Fast_And',[fast_call,x(1)],[x(0),x(1)]), put_structure(pred_info/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_local_value(x(1)), deallocate, execute(assertz/1), label(1), trust_me_else_fail, proceed]). predicate(test_pred_info/3,811,static,private,user,[ allocate(4), get_variable(y(0),1), get_variable(y(1),2), put_variable(y(2),1), call(flag_bit/2), put_structure(pred_info/3,0), unify_local_value(y(0)), unify_local_value(y(1)), unify_variable(y(3)), put_void(1), call(clause/2), math_fast_load_value(y(3),0), put_integer(1,1), math_fast_load_value(y(2),2), call_c('Fct_Fast_Shl',[fast_call,x(1)],[x(1),x(2)]), call_c('Fct_Fast_And',[fast_call,x(0)],[x(0),x(1)]), put_integer(0,1), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(0),x(1)]), deallocate, proceed]). predicate(check_predicate/2,819,static,private,user,[ load_cut_level(2), try_me_else(1), allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(redef_error,0), put_atom(t,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), put_value(y(1),1), call(bip/2), cut(y(2)), put_atom('redefining built-in predicate ~q',0), put_structure((/)/2,2), unify_local_value(y(0)), unify_local_value(y(1)), put_list(1), unify_value(x(2)), unify_nil, deallocate, execute(error/2), label(1), retry_me_else(2), allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(redef_error,0), put_atom(t,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), put_value(y(1),1), call(control_construct/2), cut(y(2)), put_atom('redefining control construct ~q',0), put_structure((/)/2,2), unify_local_value(y(0)), unify_local_value(y(1)), put_list(1), unify_value(x(2)), unify_nil, deallocate, execute(error/2), label(2), retry_me_else(3), allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(susp_warn,0), put_atom(t,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), put_value(y(1),1), call(suspicious_predicate/2), cut(y(2)), put_atom('suspicious predicate ~q',0), put_structure((/)/2,2), unify_local_value(y(0)), unify_local_value(y(1)), put_list(1), unify_value(x(2)), unify_nil, deallocate, execute(warn/2), label(3), retry_me_else(4), allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_value(y(0),0), call('$aux_name'/1), cut(y(2)), put_atom('using system auxiliary predicate ~q',0), put_structure((/)/2,2), unify_local_value(y(0)), unify_local_value(y(1)), put_list(1), unify_value(x(2)), unify_nil, deallocate, execute(warn/2), label(4), trust_me_else_fail, proceed]). predicate(control_construct/2,843,static,private,user,[ switch_on_term(2,1,fail,fail,fail), label(1), switch_on_atom([((','),3),((;),5),((->),7),(!,9),(fail,11),(true,13),(call,15),(catch,17),(throw,19)]), label(2), try_me_else(4), label(3), get_atom(',',0), get_integer(2,1), proceed, label(4), retry_me_else(6), label(5), get_atom(;,0), get_integer(2,1), proceed, label(6), retry_me_else(8), label(7), get_atom(->,0), get_integer(2,1), proceed, label(8), retry_me_else(10), label(9), get_atom(!,0), get_integer(0,1), proceed, label(10), retry_me_else(12), label(11), get_atom(fail,0), get_integer(0,1), proceed, label(12), retry_me_else(14), label(13), get_atom(true,0), get_integer(0,1), proceed, label(14), retry_me_else(16), label(15), get_atom(call,0), get_integer(1,1), proceed, label(16), retry_me_else(18), label(17), get_atom(catch,0), get_integer(3,1), proceed, label(18), trust_me_else_fail, label(19), get_atom(throw,0), get_integer(1,1), proceed]). predicate(suspicious_predicate/2,853,static,private,user,[ switch_on_term(3,1,fail,fail,fail), label(1), switch_on_atom([((','),4),((;),6),((->),8),(!,10),((:-),2),((-->),16),({},18),((+),20),((-),22),((*),24),((/),26),((//),28)]), label(2), try(12), trust(14), label(3), try_me_else(5), label(4), get_atom(',',0), get_integer(2,1), proceed, label(5), retry_me_else(7), label(6), get_atom(;,0), get_integer(2,1), proceed, label(7), retry_me_else(9), label(8), get_atom(->,0), get_integer(2,1), proceed, label(9), retry_me_else(11), label(10), get_atom(!,0), get_integer(0,1), proceed, label(11), retry_me_else(13), label(12), get_atom(:-,0), get_integer(1,1), proceed, label(13), retry_me_else(15), label(14), get_atom(:-,0), get_integer(2,1), proceed, label(15), retry_me_else(17), label(16), get_atom(-->,0), get_integer(2,1), proceed, label(17), retry_me_else(19), label(18), get_atom({},0), math_fast_load_value(x(1),0), put_integer(2,1), call_c('Blt_Fast_Lt',[fast_call,boolean],[x(0),x(1)]), proceed, label(19), retry_me_else(21), label(20), get_atom(+,0), get_integer(2,1), proceed, label(21), retry_me_else(23), label(22), get_atom(-,0), get_integer(2,1), proceed, label(23), retry_me_else(25), label(24), get_atom(*,0), get_integer(2,1), proceed, label(25), retry_me_else(27), label(26), get_atom(/,0), get_integer(2,1), proceed, label(27), trust_me_else_fail, label(28), get_atom(//,0), get_integer(2,1), proceed]). predicate(warn/2,871,static,private,user,[ put_value(x(0),2), put_value(x(1),3), put_atom(warning,0), put_integer(0,1), execute(disp_msg/4)]). predicate(error/2,877,static,private,user,[ load_cut_level(2), allocate(1), get_variable(y(0),2), put_value(x(0),2), put_value(x(1),3), put_atom('fatal error',0), put_integer(0,1), call(disp_msg/4), call(repeat/0), put_value(y(0),0), call('$error/2_$aux1'/1), deallocate, execute(abort/0)]). predicate('$error/2_$aux1'/1,877,static,private,user,[ load_cut_level(1), try_me_else(1), allocate(1), get_variable(y(0),1), call(close_last_prolog_file/0), cut(y(0)), fail, label(1), trust_me_else_fail, cut(x(0)), proceed]). predicate(disp_msg/4,889,static,private,user,[ allocate(4), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), get_variable(y(3),3), put_value(y(3),0), call(numbervars/1), put_atom(where,1), put_variable(x(0),2), call_c('Blt_G_Read',[fast_call,boolean],[x(1),x(2)]), put_value(y(1),1), call('$disp_msg/4_$aux1'/2), put_atom('~a: ',0), put_list(1), unify_local_value(y(0)), unify_nil, call(format/2), put_value(y(2),0), put_value(y(3),1), call(format/2), put_atom(user_output,0), deallocate, execute(nl/1)]). predicate('$disp_msg/4_$aux1'/2,889,static,private,user,[ load_cut_level(2), try_me_else(1), allocate(2), get_variable(y(0),1), get_structure((+)/2,0), unify_variable(x(0)), unify_variable(y(1)), put_value(y(1),1), get_structure((-)/2,1), unify_void(2), cut(x(2)), put_void(1), call(disp_file_name/2), put_value(y(1),0), call(disp_lines/1), put_value(y(0),0), deallocate, execute(disp_column/1), label(1), trust_me_else_fail, proceed]). predicate(disp_file_name/2,906,static,private,user,[ load_cut_level(2), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_atom('',1), cut(x(2)), proceed, label(3), trust_me_else_fail, label(4), allocate(2), get_atom(' including ',1), get_list(0), unify_variable(x(1)), unify_variable(x(0)), get_structure((*)/2,1), unify_variable(y(0)), unify_void(1), put_variable(y(1),1), call(disp_file_name/2), put_atom('~a~a',0), put_list(1), unify_local_value(y(1)), unify_list, unify_value(y(0)), unify_nil, deallocate, execute(format/2)]). predicate(disp_lines/1,916,static,private,user,[ load_cut_level(1), switch_on_term(3,fail,fail,fail,1), label(1), switch_on_structure([((-)/2,2)]), label(2), try(4), trust(6), label(3), try_me_else(5), label(4), get_structure((-)/2,0), unify_variable(x(0)), unify_value(x(0)), cut(x(1)), put_list(1), unify_value(x(0)), unify_nil, put_atom(':~d',0), execute(format/2), label(5), trust_me_else_fail, label(6), get_structure((-)/2,0), unify_variable(x(2)), unify_variable(x(0)), put_list(1), unify_value(x(2)), unify_list, unify_value(x(0)), unify_nil, put_atom(':~d-~d',0), execute(format/2)]). predicate(disp_column/1,925,static,private,user,[ load_cut_level(1), try_me_else(1), math_fast_load_value(x(0),2), put_integer(0,3), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(2),x(3)]), cut(x(1)), put_list(1), unify_local_value(x(0)), unify_nil, put_atom(':~d: ',0), execute(format/2), label(1), trust_me_else_fail, put_atom(': ',0), execute(write/1)]). predicate(exception/1,937,static,private,user,[ load_cut_level(1), try_me_else(9), switch_on_term(3,fail,fail,fail,1), label(1), switch_on_structure([(error/2,2)]), label(2), try(4), retry(6), trust(8), label(3), try_me_else(5), label(4), allocate(3), get_structure(error/2,0), unify_variable(x(0)), unify_void(1), get_structure(syntax_error/1,0), unify_void(1), cut(x(1)), put_void(0), put_variable(y(0),1), put_variable(y(1),2), put_variable(y(2),3), call(syntax_error_info/4), put_atom(open_file_stack,0), put_variable(x(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(where,0), put_structure((+)/2,1), unify_value(x(2)), unify_structure((-)/2), unify_local_value(y(0)), unify_local_value(y(0)), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom('syntax error: ~a (char:~d)',0), put_list(1), unify_local_value(y(2)), unify_list, unify_local_value(y(1)), unify_nil, deallocate, execute(error/2), label(5), retry_me_else(7), label(6), get_structure(error/2,0), unify_variable(x(0)), unify_void(1), get_structure(existence_error/2,0), unify_atom(source_sink), unify_variable(x(0)), cut(x(1)), put_list(1), unify_value(x(0)), unify_nil, put_atom('cannot open file ~a - does not exist',0), execute(error/2), label(7), trust_me_else_fail, label(8), get_structure(error/2,0), unify_variable(x(0)), unify_void(1), get_structure(permission_error/3,0), unify_atom(open), unify_atom(source_sink), unify_variable(x(0)), cut(x(1)), put_list(1), unify_value(x(0)), unify_nil, put_atom('cannot open file ~a - permission error',0), execute(error/2), label(9), trust_me_else_fail, put_list(1), unify_local_value(x(0)), unify_nil, put_atom('exception raised: ~q',0), execute(error/2)]). predicate(handle_directive/3,455,static,private,user,[ load_cut_level(3), try_me_else(35), switch_on_term(3,1,fail,fail,fail), label(1), switch_on_atom([(public,4),(dynamic,6),(discontiguous,8),(built_in,10),(built_in_fd,12),(ensure_linked,14),(multifile,16),(ensure_loaded,18),(include,20),(op,22),(char_conversion,24),(set_prolog_flag,26),(initialization,28),(foreign,2)]), label(2), try(30), retry(32), trust(34), label(3), try_me_else(5), label(4), get_atom(public,0), cut(x(3)), put_nil(0), call_c('Blt_Term_Neq',[fast_call,boolean],[x(1),x(0)]), put_value(x(1),0), put_atom(pub,1), execute(set_flag_for_preds/2), label(5), retry_me_else(7), label(6), allocate(2), get_atom(dynamic,0), get_variable(y(0),1), get_variable(y(1),2), cut(x(3)), put_value(y(0),0), put_nil(1), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), put_value(y(0),0), put_atom(dyn,1), call(set_flag_for_preds/2), put_value(y(0),0), put_atom(pub,1), call(set_flag_for_preds/2), put_value(y(0),0), put_value(y(1),1), deallocate, execute(add_empty_dyn/2), label(7), retry_me_else(9), label(8), get_atom(discontiguous,0), cut(x(3)), put_nil(0), call_c('Blt_Term_Neq',[fast_call,boolean],[x(1),x(0)]), put_value(x(1),0), put_atom(discontig,1), execute(set_flag_for_preds/2), label(9), retry_me_else(11), label(10), allocate(1), get_atom(built_in,0), get_variable(y(0),3), cut(y(0)), put_value(x(1),0), call('$handle_directive/3_$aux1'/1), cut(y(0)), deallocate, proceed, label(11), retry_me_else(13), label(12), get_atom(built_in_fd,0), cut(x(3)), put_value(x(1),0), execute('$handle_directive/3_$aux2'/1), label(13), retry_me_else(15), label(14), get_atom(ensure_linked,0), cut(x(3)), put_value(x(1),0), execute('$handle_directive/3_$aux3'/1), label(15), retry_me_else(17), label(16), get_atom(multifile,0), cut(x(3)), put_atom('multifile directive not supported - directive ignored',0), put_nil(1), execute(warn/2), label(17), retry_me_else(19), label(18), get_atom(ensure_loaded,0), cut(x(3)), put_atom('ensure_loaded directive not supported - directive ignored',0), put_nil(1), execute(warn/2), label(19), retry_me_else(21), label(20), get_atom(include,0), get_list(1), unify_variable(x(0)), unify_nil, cut(x(3)), execute(open_new_prolog_file/1), label(21), retry_me_else(23), label(22), allocate(4), get_atom(op,0), get_list(1), unify_variable(y(0)), unify_list, unify_variable(y(1)), unify_list, unify_variable(y(2)), unify_nil, get_variable(y(3),2), cut(x(3)), put_structure(op/3,0), unify_value(y(0)), unify_value(y(1)), unify_value(y(2)), call(exec_directive/1), put_atom(system,0), put_structure(op/3,1), unify_value(y(0)), unify_value(y(1)), unify_value(y(2)), put_value(y(3),2), deallocate, execute(handle_initialization/3), label(23), retry_me_else(25), label(24), allocate(3), get_atom(char_conversion,0), get_list(1), unify_variable(y(0)), unify_list, unify_variable(y(1)), unify_nil, get_variable(y(2),2), cut(x(3)), put_structure(char_conversion/2,0), unify_value(y(0)), unify_value(y(1)), call(exec_directive/1), put_atom(system,0), put_structure(char_conversion/2,1), unify_value(y(0)), unify_value(y(1)), put_value(y(2),2), deallocate, execute(handle_initialization/3), label(25), retry_me_else(27), label(26), allocate(3), get_atom(set_prolog_flag,0), get_list(1), unify_variable(y(0)), unify_list, unify_variable(y(1)), unify_nil, get_variable(y(2),2), cut(x(3)), put_structure(set_prolog_flag/2,0), unify_value(y(0)), unify_value(y(1)), call(exec_directive/1), call('$handle_directive/3_$aux4'/0), put_atom(system,0), put_structure(set_prolog_flag/2,1), unify_value(y(0)), unify_value(y(1)), put_value(y(2),2), deallocate, execute(handle_initialization/3), label(27), retry_me_else(29), label(28), get_atom(initialization,0), get_list(1), unify_variable(x(1)), unify_nil, cut(x(3)), put_atom(user,0), execute(handle_initialization/3), label(29), retry_me_else(31), label(30), get_atom(foreign,0), get_list(1), unify_variable(x(0)), unify_nil, cut(x(3)), put_list(1), unify_value(x(0)), unify_list, unify_nil, unify_nil, put_atom(foreign,0), execute(handle_directive/3), label(31), retry_me_else(33), label(32), get_atom(foreign,0), put_atom(call_c,0), put_atom(f,1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), cut(x(3)), put_atom('foreign directive ignored (not allowed in this mode)',0), put_nil(1), execute(warn/2), label(33), trust_me_else_fail, label(34), allocate(7), get_atom(foreign,0), get_list(1), unify_variable(y(0)), unify_list, unify_variable(y(1)), unify_nil, get_variable(y(2),2), cut(x(3)), put_value(y(0),0), call_c('Blt_Callable',[fast_call,boolean],[x(0)]), put_value(y(1),0), call_c('Blt_List',[fast_call,boolean],[x(0)]), put_value(y(0),0), put_variable(y(3),1), put_variable(y(4),2), call_c('Blt_Functor',[fast_call,boolean],[x(0),x(1),x(2)]), put_value(y(3),0), put_value(y(4),1), call('$handle_directive/3_$aux5'/2), put_value(y(3),0), put_value(y(4),1), call(define_predicate/2), put_atom(foreign_fct_name,0), put_value(y(3),1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(foreign_return,0), put_atom(boolean,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(foreign_bip,0), put_structure((/)/2,1), unify_local_value(y(3)), unify_local_value(y(4)), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_atom(foreign_choice_size,0), put_integer(-1,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), put_value(y(1),0), call(foreign_get_options/1), put_integer(0,0), put_value(y(4),1), put_value(y(0),2), put_variable(y(5),3), call(foreign_check_types/4), put_atom(foreign_fct_name,0), put_variable(x(4),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(foreign_return,0), put_variable(x(3),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(foreign_bip,0), put_variable(x(2),1), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(1)]), put_atom(foreign_choice_size,0), put_variable(x(1),5), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(5)]), put_structure(args/5,0), unify_value(x(4)), unify_value(x(3)), unify_value(x(2)), unify_value(x(1)), unify_local_value(y(5)), put_variable(y(6),1), call(no_internal_transf/2), put_variable(x(0),1), put_value(y(3),2), put_value(y(4),3), call_c('Blt_Functor',[fast_call,boolean],[x(1),x(2),x(3)]), put_structure((+)/2,1), unify_local_value(y(2)), unify_structure((:-)/2), unify_value(x(0)), unify_structure('$foreign_call_c'/1), unify_local_value(y(6)), put_structure(buff_discontig_clause/3,0), unify_local_value(y(3)), unify_local_value(y(4)), unify_value(x(1)), call(assertz/1), put_structure((/)/2,0), unify_atom('$force_foreign_link'), unify_integer(0), deallocate, execute(add_ensure_linked/1), label(35), trust_me_else_fail, allocate(2), get_variable(y(0),0), put_value(x(1),0), put_variable(y(1),1), call(length/2), put_atom('unknown directive ~q - maybe use initialization/1 - directive ignored',0), put_structure((/)/2,2), unify_local_value(y(0)), unify_local_value(y(1)), put_list(1), unify_value(x(2)), unify_nil, deallocate, execute(warn/2)]). predicate('$handle_directive/3_$aux5'/2,540,static,private,user,[ load_cut_level(2), try_me_else(1), allocate(3), get_variable(y(0),0), get_variable(y(1),1), get_variable(y(2),2), put_atom(pub,0), put_value(y(0),1), put_value(y(1),2), call(test_pred_info/3), cut(y(2)), put_atom('foreign predicate ~q should not be public/dynamic',0), put_structure((/)/2,2), unify_local_value(y(0)), unify_local_value(y(1)), put_list(1), unify_value(x(2)), unify_nil, deallocate, execute(error/2), label(1), trust_me_else_fail, proceed]). predicate('$handle_directive/3_$aux4'/0,518,static,private,user,[ load_cut_level(0), try_me_else(1), allocate(1), get_variable(y(0),0), put_atom(singleton_warning,0), put_atom(off,1), call(current_prolog_flag/2), cut(y(0)), put_atom(singl_warn,0), put_atom(f,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), deallocate, proceed, label(1), trust_me_else_fail, put_atom(singl_warn,0), put_atom(t,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed]). predicate('$handle_directive/3_$aux3'/1,488,static,private,user,[ load_cut_level(1), try_me_else(1), put_atom(native_code,0), put_atom(f,2), call_c('Blt_G_Read',[fast_call,boolean],[x(0),x(2)]), cut(x(1)), put_atom('ensure_linked directive ignored in byte-code compilation mode',0), put_nil(1), execute(warn/2), label(1), trust_me_else_fail, put_nil(1), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), execute(add_ensure_linked/1)]). predicate('$handle_directive/3_$aux2'/1,480,static,private,user,[ try_me_else(1), put_nil(1), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(1)]), put_atom(default_kind,0), put_atom(built_in_fd,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, put_nil(1), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), put_atom(bfd,1), execute(set_flag_for_preds/2)]). predicate('$handle_directive/3_$aux1'/1,472,static,private,user,[ try_me_else(1), put_nil(1), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(1)]), put_atom(default_kind,0), put_atom(built_in,1), call_c('Blt_G_Assign',[fast_call],[x(0),x(1)]), proceed, label(1), trust_me_else_fail, put_nil(1), call_c('Blt_Term_Neq',[fast_call,boolean],[x(0),x(1)]), put_atom(bpl,1), execute(set_flag_for_preds/2)]). directive(106,system,[ put_integer(200,0), put_atom(fx,1), put_atom(?,2), execute(op/3)]). ./gprolog-1.3.0/src/Pl2Wam/pl2wam.pl0000644004425400513100000003261210547162440015430 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog to WAM compiler * * File : pl2wam.pl * * Descr.: main file * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: pl2wam.pl,v 1.12 2007/01/04 10:34:06 diaz Exp $ */ pl2wam(LArg) :- catch(pl2wam1(LArg), Err, exception(Err)). pl2wam1(LArg) :- cmd_line_args(LArg, PlFile, WamFile), prolog_file_name(PlFile, PlFile1), read_file_init(PlFile), emit_code_init(WamFile, PlFile), g_read(native_code, NativeCode), compile_msg_start(PlFile1, NativeCode), init_counters, repeat, read_predicate(Pred, N, LSrcCl), add_counter(user_read_file, real_read_file), ( LSrcCl = [] % [] at end of file -> ! ; read_file_error_nb(0), compile_and_emit_pred(NativeCode, Pred, N, LSrcCl), fail ), emit_ensure_linked, read_file_term(InBytes, InLines), emit_code_term(OutBytes, OutLines), read_file_error_nb(ErrNb), ( ErrNb = 0 -> display_counters, compile_msg_end(PlFile1, InBytes, InLines, OutBytes, OutLines) ; format('~N\t~d error(s)~n', [ErrNb]), abort ). compile_and_emit_pred(t, Pred, N, LSrcCl) :- compile_emit_inits(Pred, N, LSrcCl, PlFile, PlLine), compile_lst_clause(LSrcCl, LCompCl), indexing(LCompCl, WamCode), add_counter(user_indexing, real_indexing), emit_code(Pred, N, PlFile, PlLine, WamCode), add_counter(user_wam_emit, real_wam_emit). compile_and_emit_pred(f, Pred, N, LSrcCl) :- compile_emit_inits(Pred, N, LSrcCl, PlFile, PlLine), bc_compile_lst_clause(LSrcCl, LCompCl), bc_emit_code(Pred, N, PlFile, PlLine, LCompCl), add_counter(user_wam_emit, real_wam_emit). compile_emit_inits(Pred, N, LSrcCl, PlFile1, PlLine) :- g_assign(cur_func, Pred), g_assign(cur_arity, N), syntactic_sugar_init_pred(Pred, N), LSrcCl = [[PlFile * _|_] + (PlLine - _) + _|_], absolute_file_name(PlFile, PlFile1). compile_lst_clause([], []). compile_lst_clause([SrcCl|LSrcCl], [cl(_, FirstArg, WamCl)|LCC]) :- compile_clause(SrcCl, FirstArg, WamCl), compile_lst_clause(LSrcCl, LCC). compile_clause(Where + Cl, FirstArg, WamCl) :- g_assign(where, Where), syntactic_sugar(Cl, Head, Body), add_counter(user_syn_sugar, real_syn_sugar), internal_format(Head, Body, Head1, Body1, NbChunk, NbY), add_counter(user_internal, real_internal), code_generation(Head1, Body1, NbChunk, NbY, WamCl), add_counter(user_code_gen, real_code_gen), allocate_registers(WamCl), add_counter(user_reg_alloc, real_reg_alloc), find_first_arg(WamCl, FirstArg), add_counter(user_first_arg, real_first_arg). bc_compile_lst_clause([], []). bc_compile_lst_clause([SrcCl|LSrcCl], [bc(Cl, WamCl)|LCC]) :- SrcCl = _ + Cl, compile_clause(SrcCl, _FirstArg, WamCl), bc_compile_lst_clause(LSrcCl, LCC). compile_msg_start(_, _) :- g_read(compile_msg, f), !. compile_msg_start(PlFile, NativeCode) :- ( NativeCode = t -> Type = 'native code' ; Type = 'byte code' ), format('compiling ~a for ~a...~n', [PlFile, Type]). compile_msg_end(_, _, _, _, _) :- g_read(compile_msg, f), !. compile_msg_end(PlFile, _InBytes, InLines, OutBytes, _OutLines) :- real_time(Time), format('~a compiled, ~d lines read - ~d bytes written, ~d ms~n', [PlFile, InLines, OutBytes, Time]). cur_pred(Func, Arity) :- g_read(cur_func, Func), g_read(cur_arity, Arity). cur_pred_without_aux(Func1, Arity1) :- cur_pred(Func, Arity), '$pred_without_aux'(Func, Arity, Func1, Arity1). init_counters :- g_read(statistics, f), !. init_counters :- g_assign(user_read_file, 0), g_assign(real_read_file, 0), g_assign(user_syn_sugar, 0), g_assign(real_syn_sugar, 0), g_assign(user_internal, 0), g_assign(real_internal, 0), g_assign(user_code_gen, 0), g_assign(real_code_gen, 0), g_assign(user_reg_alloc, 0), g_assign(real_reg_alloc, 0), g_assign(user_indexing, 0), g_assign(real_indexing, 0), g_assign(user_first_arg, 0), g_assign(real_first_arg, 0), g_assign(user_wam_emit, 0), g_assign(real_wam_emit, 0), last_times(_, _). add_counter(_, _) :- g_read(statistics, f), !. add_counter(UserCounter, RealCounter) :- last_times(User1, Real1), g_read(UserCounter, User2), g_read(RealCounter, Real2), User is User1 + User2, Real is Real1 + Real2, g_assign(UserCounter, User), g_assign(RealCounter, Real). last_times(User, Real) :- statistics(real_time, [_, Real]), statistics(runtime, [_, User]). display_counters :- g_read(statistics, f), !. display_counters :- g_read(user_read_file, UReadFile), g_read(real_read_file, RReadFile), g_read(user_syn_sugar, USynSugar), g_read(real_syn_sugar, RSynSugar), g_read(user_internal, UInternal), g_read(real_internal, RInternal), g_read(user_code_gen, UCodeGen), g_read(real_code_gen, RCodeGen), g_read(user_reg_alloc, URegAlloc), g_read(real_reg_alloc, RRegAlloc), g_read(user_indexing, UIndexing), g_read(real_indexing, RIndexing), g_read(user_first_arg, UFirstArg), g_read(real_first_arg, RFirstArg), g_read(user_wam_emit, UWamEmit), g_read(real_wam_emit, RWamEmit), U is UReadFile + USynSugar + UInternal + UCodeGen + URegAlloc + UIndexing + UIndexing + UWamEmit, R is RReadFile + RSynSugar + RInternal + RCodeGen + RRegAlloc + RIndexing + RIndexing + RWamEmit, user_time(UTotal), real_time(RTotal), UMisc is UTotal - U, RMisc is RTotal - R, format(' Statistics (in ms) user real~n', []), format(' source reading : %6d %6d~n', [UReadFile, RReadFile]), format(' syntactic sugar : %6d %6d~n', [USynSugar, RSynSugar]), format(' internal format : %6d %6d~n', [UInternal, RInternal]), format(' code generation : %6d %6d~n', [UCodeGen, RCodeGen]), format(' register allocation: %6d %6d~n', [URegAlloc, RRegAlloc]), format(' indexing : %6d %6d~n', [UIndexing, RIndexing]), format(' first arg computing: %6d %6d~n', [UFirstArg, RFirstArg]), format(' code emission : %6d %6d~n', [UWamEmit, RWamEmit]), format(' other : %6d %6d~n', [UMisc, RMisc]), format(' Total : %6d %6d~n', [UTotal, RTotal]). % Command-line options reading cmd_line_args(LArg, PlFile, WamFile) :- g_assign(plfile, ''), g_assign(wamfile, ''), g_assign(native_code, t), g_assign(susp_warn, t), g_assign(singl_warn, t), g_assign(redef_error, t), g_assign(foreign_only, f), g_assign(call_c, t), g_assign(inline, t), g_assign(reorder, t), g_assign(reg_opt, 2), g_assign(opt_last_subterm, t), g_assign(keep_void_inst, f), g_assign(fast_math, f), g_assign(statistics, f), g_assign(compile_msg, f), cmd_line_args(LArg), g_read(plfile, PlFile), ( PlFile = '' -> format('no input file~n', []), abort ; true ), g_read(wamfile, WamFile). cmd_line_args([]). cmd_line_args([Arg|LArg]) :- cmd_line_arg1(Arg, LArg, LArg1), !, cmd_line_args(LArg1). cmd_line_arg1('-o', LArg, LArg1) :- cmd_line_arg1('--output', LArg, LArg1). cmd_line_arg1('--output', LArg, LArg1) :- ( LArg = [WamFile|LArg1], sub_atom(WamFile, 0, 1, _, Prefix), Prefix \== (-) ; format('FILE missing after --output option~n', []), abort ), g_read(wamfile, WamFile0), ( WamFile0 = '' -> true ; format('output file already specified (~a)~n', [WamFile0]), abort ), g_assign(wamfile, WamFile). cmd_line_arg1('--pl-state', [File|LArg], LArg) :- read_pl_state_file(File), ( current_prolog_flag(singleton_warning, off) -> g_assign(singl_warn, f) ; true ). cmd_line_arg1('-W', LArg, LArg1) :- cmd_line_arg1('--wam-for-native', LArg, LArg1). cmd_line_arg1('--wam-for-native', LArg, LArg) :- g_assign(native_code, t). cmd_line_arg1('-w', LArg, LArg1) :- cmd_line_arg1('--wam-for-byte-code', LArg, LArg1). cmd_line_arg1('--wam-for-byte-code', LArg, LArg) :- g_assign(native_code, f), g_assign(inline, f), % force --no-inline g_assign(call_c, f). % force --no-call-c cmd_line_arg1('--no-susp-warn', LArg, LArg) :- g_assign(susp_warn, f). cmd_line_arg1('--no-singl-warn', LArg, LArg) :- g_assign(singl_warn, f). cmd_line_arg1('--no-redef-error', LArg, LArg) :- g_assign(redef_error, f). cmd_line_arg1('--foreign-only', LArg, LArg) :- g_assign(foreign_only, t). cmd_line_arg1('--no-call-c', LArg, LArg) :- g_assign(call_c, f). cmd_line_arg1('--no-inline', LArg, LArg) :- g_assign(inline, f). cmd_line_arg1('--no-reorder', LArg, LArg) :- g_assign(reorder, f). cmd_line_arg1('--no-reg-opt', LArg, LArg) :- g_assign(reg_opt, 0). cmd_line_arg1('--min-reg-opt', LArg, LArg) :- g_assign(reg_opt, 1). cmd_line_arg1('--no-opt-last-subterm', LArg, LArg) :- g_assign(opt_last_subterm, f). cmd_line_arg1('--fast-math', LArg, LArg) :- g_assign(fast_math, t). cmd_line_arg1('--keep-void-inst', LArg, LArg) :- g_assign(keep_void_inst, t). cmd_line_arg1('--statistics', LArg, LArg) :- g_assign(statistics, t). cmd_line_arg1('--compile-msg', LArg, LArg) :- g_assign(compile_msg, t). cmd_line_arg1('--version', LArg, LArg) :- display_copying, stop. cmd_line_arg1('-h', LArg, LArg1) :- cmd_line_arg1('--help', LArg, LArg1). cmd_line_arg1('--help', LArg, LArg) :- ( h(L), write(L), nl, fail ; nl, write('Report bugs to bug-prolog@gnu.org.'), nl, stop ). cmd_line_arg1(Arg, _, _) :- sub_atom(Arg, 0, 1, _, -), format('unknown option ~a - try pl2wam --help~n', [Arg]), abort. cmd_line_arg1(PlFile, LArg, LArg) :- g_read(plfile, PlFile0), ( PlFile0 = '' -> true ; format('input file already specified (~a)~n', [PlFile0]), abort ), g_assign(plfile, PlFile). % Copying display_copying :- prolog_name(Name), prolog_version(Version), prolog_copyright(Copyright), format('Prolog to Wam Compiler (~a) ~a~n', [Name, Version]), format('By Daniel Diaz~n', []), write(Copyright), nl, format('~a comes with ABSOLUTELY NO WARRANTY.~n', [Name]), format('You may redistribute copies of ~a~n', [Name]), format('under the terms of the GNU General Public License.~n', []), format('For more information about these matters, see the files named COPYING.~n', []). prolog_name(Name) :- current_prolog_flag(prolog_name, Name). prolog_version(Version) :- current_prolog_flag(prolog_version, Version). prolog_date(Date) :- current_prolog_flag(prolog_date, Date). prolog_copyright(Copyright) :- current_prolog_flag(prolog_copyright, Copyright). % Help h('Usage: pl2wam [OPTION...] FILE'). h(''). h('Options:'). h(' -o FILE, --output FILE set output file name'). h(' -W, --wam-for-native produce a WAM file for native code'). h(' -w, --wam-for-byte-code produce a WAM file for byte-code (force --no-call-c)'). h(' --pl-state FILE read FILE to set the initial Prolog state'). h(' --no-susp-warn do not show warnings for suspicious predicates'). h(' --no-singl-warn do not show warnings for named singleton variables'). h(' --no-redef-error do not show errors for built-in redefinitions'). h(' --foreign-only only compile foreign/1-2 directives'). h(' --no-call-c do not allow the use of fd_tell, ''$call_c'',...'). h(' --no-inline do not inline predicates'). h(' --no-reorder do not reorder predicate arguments'). h(' --no-reg-opt do not optimize registers'). h(' --min-reg-opt minimally optimize registers'). h(' --no-opt-last-subterm do not optimize last subterm compilation'). h(' --fast-math fast mathematical mode (assume integer arithmetics)'). h(' --keep-void-inst keep void instructions in the output file'). h(' --compile-msg print a compile message'). h(' --statistics print statistics information'). h(' --help print this help and exit'). h(' --version print version number and exit'). h(''). h('''user'' can be given as FILE for the standard input/output'). % Starting directive go :- argument_list(LArg), pl2wam(LArg). :- initialization(go). ./gprolog-1.3.0/src/Pl2Wam/inst_codif.pl0000644004425400513100000001053310547162440016345 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog to WAM compiler * * File : inst_codif.pl * * Descr.: instruction codification (needed for register allocation) * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: inst_codif.pl,v 1.12 2007/01/04 10:34:06 diaz Exp $ */ % alias stopping instructions alias_stop_instruction(InstW) :- functor(InstW, F, _), ( F = call ; F = execute ; F = call_c, arg(2, InstW, LCOpt), (memberchk(jump, LCOpt) ; memberchk(use_x_args, LCOpt)) ), !. % instruction codification codification(WamInst, LCode) :- codif(WamInst, LCode), !. codif(get_variable(x(Tmp), Arg), [c(Arg, Tmp)]). codif(get_value(x(Tmp), Arg), [r(Tmp), r(Arg)]). codif(get_variable(y(_), Arg), [r(Arg)]). codif(get_value(y(_), Arg), [r(Arg)]). codif(get_atom(_, Arg), [r(Arg)]). codif(get_integer(_, Arg), [r(Arg)]). codif(get_float(_, Arg), [r(Arg)]). codif(get_nil(Arg), [r(Arg)]). codif(get_list(Reg), [r(Reg)]). codif(get_structure(_, Reg), [r(Reg)]). codif(put_variable(x(Tmp), Arg), [w(Tmp), w(Arg)]). codif(put_void(Arg), [w(Arg)]). codif(put_value(x(Tmp), Arg), [c(Tmp, Arg)]). codif(put_variable(y(_), Arg), [w(Arg)]). codif(put_value(y(_), Arg), [w(Arg)]). codif(put_unsafe_value(y(_), Arg), [w(Arg)]). codif(put_atom(_, Arg), [w(Arg)]). codif(put_integer(_, Arg), [w(Arg)]). codif(put_float(_, Arg), [w(Arg)]). codif(put_nil(Arg), [w(Arg)]). codif(put_list(Reg), [w(Reg)]). codif(put_structure(_, Reg), [w(Reg)]). codif(math_load_value(x(Reg), Tmp), [r(Reg), w(Tmp)]). codif(math_load_value(y(_), Tmp), [w(Tmp)]). codif(math_fast_load_value(x(Reg), Tmp), [r(Reg), w(Tmp)]). codif(math_fast_load_value(y(_), Tmp), [w(Tmp)]). codif(unify_variable(x(Tmp)), [w(Tmp)]). codif(unify_value(x(Tmp)), [r(Tmp)]). codif(unify_local_value(x(Tmp)), [r(Tmp)]). codif(call(_ / N), LCode) :- lst_r_for_call_execute(0, N, LCode). codif(execute(_ / N), LCode) :- lst_r_for_call_execute(0, N, LCode). codif(load_cut_level(Tmp), [w(Tmp)]). codif(cut(x(Tmp)), [r(Tmp)]). codif(call_c(_, LCOpt, LReg), LCode) :- ( member(x(Tmp), LCOpt) -> End = [w(Tmp)] ; End = [] ), lst_rw_for_c_call(LReg, End, LCode). codif(foreign_call_c(_, _, LReg, _), LCode) :- lst_rw_for_foreign_c_call(LReg, [], LCode). % instructions which use no temporaries codif(_, []). lst_r_for_call_execute(N, N, []). lst_r_for_call_execute(I, N, [r(I)|L]) :- I1 is I + 1, lst_r_for_call_execute(I1, N, L). lst_rw_for_foreign_c_call([], End, End). lst_rw_for_foreign_c_call([Reg|LReg], End, [r(Reg)|LCode]) :- lst_rw_for_foreign_c_call(LReg, [w(Reg)|End], LCode). lst_rw_for_c_call([], End, End). lst_rw_for_c_call([x(Reg)|LReg], End, [r(Reg)|LCode]) :- !, lst_rw_for_c_call(LReg, [w(Reg)|End], LCode). lst_rw_for_c_call([_|LReg], End, LCode) :- lst_rw_for_c_call(LReg, End, LCode). ./gprolog-1.3.0/src/Pl2Wam/bip_list.wam0000644004425400513100000020763510547440341016214 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : bip_list.pl % date : 1 5 2007 % time : 13:13:21 file_name('/home/diaz/GP/src/src/Pl2Wam/bip_list.pl'). predicate(bip/2,5,static,private,user,[ switch_on_term(62,1,fail,fail,fail), label(1), switch_on_atom([(bagof,63), (setof,65), (findall,67), ((>=),69), ((<),71), ((>),73), ((=\=),75), ((=:=),77), ((is),79), ((=<),81), (retractall,83), (assertz,85), (asserta,87), (retract,89), (abolish,91), (clause,93), (char_code,95), (lower_upper,97), (current_atom,99), (name,101), (number_codes,103), (atom_codes,105), (atom_length,107), (atom_property,109), (number_chars,111), (new_atom,2), (number_atom,119), (atom_chars,121), (atom_concat,123), (atom_hash,125), (sub_atom,127), (call_det,129), (once,131), ((\+),133), (call,3), (call_with_args,4), (get_char,5), (get_code,6), (unget_byte,7), (put_char,8), (get_key,9), (peek_code,10), (put_code,11), (peek_char,12), (get_byte,13), (unget_char,14), (unget_code,15), (peek_byte,16), (put_byte,17), (get_key_no_echo,18), (write_canonical_to_atom,233), (write_term_to_chars,235), (write_term_to_codes,237), (write_to_atom,239), (display_to_atom,241), (display_to_codes,243), (read_term_from_atom,245), (print_to_atom,247), (read_term_from_codes,249), (write_term_to_atom,251), (write_to_codes,253), (display_to_chars,255), (print_to_codes,257), (read_token_from_atom,259), (read_token_from_chars,261), (read_from_atom,263), (read_from_codes,265), (read_from_chars,267), (write_canonical_to_codes,269), (write_to_chars,271), (print_to_chars,273), (read_token_from_codes,275), (write_canonical_to_chars,277), (writeq_to_atom,279), (writeq_to_codes,281), (writeq_to_chars,283), (read_term_from_chars,285), (format_to_atom,287), (format_to_codes,289), (format_to_chars,291), ('.',293), (consult,295), (listing,19), (load,301), (abort,303), (repeat,305), (stop,307), (halt,20), (for,313), (spypoint_condition,315), (nospy,317), (notrace,319), (debugging,321), (spy,323), (leash,325), (wam_debug,327), (nodebug,329), (trace,331), (debug,333), (nospyall,335), (told,337), (tab,339), (put,341), (seeing,343), (tell,345), (seen,347), (see,349), (append,21), (telling,353), (skip,355), (get,357), (get0,359), (expand_term,361), (phrase,22), (decompose_file_name,367), (absolute_file_name,369), (prolog_file_name,371), (read_pl_state_file,373), (argument_counter,375), (write_pl_state_file,377), (argument_value,379), (set_prolog_flag,381), (current_prolog_flag,383), (argument_list,385), (environ,387), (format,23), (g_test_set_bit,393), (g_inc,24), (g_deco,401), (g_assign,403), (g_assignb,405), (g_set_bit,407), (g_inco,409), (g_test_reset_bit,411), (g_reset_bit,413), (g_dec,25), (g_array_size,421), (g_read,423), (g_link,425), (add_linedit_completion,427), (find_linedit_completion,429), (get_linedit_prompt,431), (set_linedit_prompt,433), (reverse,435), (nth,437), (min_list,439), (permutation,441), (sum_list,443), (prefix,445), (last,447), (suffix,449), (sublist,451), (select,26), (delete,457), (memberchk,459), (length,461), (member,463), (max_list,465), (current_op,467), (op,469), (host_name,471), (directory_files,473), (exec,27), (working_directory,479), (file_exists,481), (temporary_file,483), (architecture,485), (wait,487), (delete_file,489), (change_directory,491), (date_time,493), (popen,497), (make_directory,499), (system,28), (unlink,505), (os_version,507), (create_pipe,509), (file_property,511), (delete_directory,513), (spawn,29), (sleep,519), (prolog_pid,521), (temporary_name,523), (shell,30), (rename_file,531), (file_permission,533), (send_signal,535), (fork_prolog,537), (current_bip_name,539), (set_bip_name,541), (syntax_error_info,543), (current_predicate,545), (predicate_property,547), (name_query_vars,549), (name_singleton_vars,551), (bind_variables,553), (numbervars,31), (portray_clause,32), (get_print_stream,563), (print,33), (get_seed,569), (set_seed,571), (randomize,573), (random,34), (char_conversion,579), (read_number,35), (read_token,36), (read_integer,37), (read_term,38), (current_char_conversion,597), (read_atom,39), (read,40), (last_read_start_line_column,607), (socket_close,609), (socket_bind,611), (socket_connect,613), (socket,615), (socket_accept,41), (hostname_address,621), (socket_listen,623), (keysort,42), (sort,43), (sort0,44), (sr_change_options,637), (sr_get_size_counters,639), (sr_open,641), (sr_current_descriptor,643), (sr_get_include_list,645), (sr_get_file_name,647), (sr_write_error,45), (sr_close,655), (sr_read_term,657), (sr_error_from_exception,659), (sr_get_error_counters,661), (sr_set_error_counters,663), (sr_get_stream,665), (sr_get_position,667), (sr_get_include_stream_list,669), (sr_new_pass,671), (sr_write_message,46), (sr_get_module,679), (system_time,681), (real_time,683), (statistics,47), (cpu_time,689), (user_time,691), (close,48), (stream_line_column,697), (stream_property,699), (open_input_codes_stream,701), (flush_output,49), (current_input,707), (seek,709), (set_stream_buffering,711), (open_input_chars_stream,713), (open_output_chars_stream,715), (close_input_chars_stream,717), (stream_position,719), (open_output_atom_stream,721), (close_input_atom_stream,723), (at_end_of_stream,50), (character_count,729), (open_input_atom_stream,731), (set_stream_type,733), (set_output,735), (add_stream_alias,737), (current_stream,739), (set_stream_eof_action,741), (set_input,743), (current_alias,745), (open_output_codes_stream,747), (line_position,749), (current_output,751), (line_count,753), (close_input_codes_stream,755), (open,51), (close_output_chars_stream,761), (close_output_codes_stream,763), (set_stream_line_column,765), (set_stream_position,767), (close_output_atom_stream,769), (current_mirror,771), (add_stream_mirror,773), (remove_stream_mirror,775), ((==),777), (functor,779), ((@>),781), (setarg,52), ((=..),787), (copy_term,789), (term_ref,791), (compare,793), ((@=<),795), ((\==),797), ((@>=),799), (arg,801), ((@<),803), (top_level,805), (break,807), (list_or_partial_list,809), (atomic,811), (number,813), (integer,815), (atom,817), (partial_list,819), (list,821), (var,823), (compound,825), (callable,827), (float,829), (nonvar,831), ((\=),833), ((=),835), (unify_with_occurs_check,837), (writeq,53), (write_canonical,54), (display,55), (nl,56), (write_term,57), (write,58), ((##),863), (fd_at_least_one,865), ((#\<=>),867), ((#/\),869), ((#\==>),871), (fd_only_one,873), ((#<=>),875), ((#\),877), ((#==>),879), ((#\/\),881), (fd_at_most_one,883), (fd_cardinality,59), ((#\/),889), ((#\\/),891), (fd_vector_max,893), (fd_size,895), (fd_has_extra_cstr,897), (fd_set_vector_max,899), (fd_min,901), (fd_dom,903), (fd_use_vector,905), (fd_max_integer,907), (fd_has_vector,909), (fd_max,911), ((#=),913), ((#>),915), ((#\=),917), ((#=<#),919), ((#>=#),921), ((#=<),923), ((#\=#),925), ((#>=),927), ((#<#),929), ((#=#),931), ((#>#),933), ((#<),935), (fd_minimize,937), (fd_maximize,939), (fd_prime,941), (fd_not_prime,943), (fd_relation,945), (fd_relationc,947), (fd_all_different,949), (fd_exactly,951), (fd_element_var,953), (fd_atleast,955), (fd_element,957), (fd_atmost,959), (fd_labelingff,961), (fd_domain_bool,963), (fd_domain,60), (fd_labeling,61), (fd_var,973), (generic_var,975), (non_generic_var,977), (non_fd_var,979)]), label(2), try(113), retry(115), trust(117), label(3), try(135), retry(137), retry(139), retry(141), retry(143), retry(145), retry(147), retry(149), retry(151), trust(153), label(4), try(155), retry(157), retry(159), retry(161), retry(163), retry(165), retry(167), retry(169), retry(171), retry(173), trust(175), label(5), try(177), trust(179), label(6), try(181), trust(183), label(7), try(185), trust(187), label(8), try(189), trust(191), label(9), try(193), trust(195), label(10), try(197), trust(199), label(11), try(201), trust(203), label(12), try(205), trust(207), label(13), try(209), trust(211), label(14), try(213), trust(215), label(15), try(217), trust(219), label(16), try(221), trust(223), label(17), try(225), trust(227), label(18), try(229), trust(231), label(19), try(297), trust(299), label(20), try(309), trust(311), label(21), try(351), trust(455), label(22), try(363), trust(365), label(23), try(389), trust(391), label(24), try(395), retry(397), trust(399), label(25), try(415), retry(417), trust(419), label(26), try(453), trust(495), label(27), try(475), trust(477), label(28), try(501), trust(503), label(29), try(515), trust(517), label(30), try(525), retry(527), trust(529), label(31), try(555), trust(557), label(32), try(559), trust(561), label(33), try(565), trust(567), label(34), try(575), trust(577), label(35), try(581), trust(583), label(36), try(585), trust(587), label(37), try(589), trust(591), label(38), try(593), trust(595), label(39), try(599), trust(601), label(40), try(603), trust(605), label(41), try(617), trust(619), label(42), try(625), trust(627), label(43), try(629), trust(631), label(44), try(633), trust(635), label(45), try(649), retry(651), trust(653), label(46), try(673), retry(675), trust(677), label(47), try(685), trust(687), label(48), try(693), trust(695), label(49), try(703), trust(705), label(50), try(725), trust(727), label(51), try(757), trust(759), label(52), try(783), trust(785), label(53), try(839), trust(841), label(54), try(843), trust(845), label(55), try(847), trust(849), label(56), try(851), trust(853), label(57), try(855), trust(857), label(58), try(859), trust(861), label(59), try(885), trust(887), label(60), try(965), trust(967), label(61), try(969), trust(971), label(62), try_me_else(64), label(63), get_atom(bagof,0), get_integer(3,1), proceed, label(64), retry_me_else(66), label(65), get_atom(setof,0), get_integer(3,1), proceed, label(66), retry_me_else(68), label(67), get_atom(findall,0), get_integer(3,1), proceed, label(68), retry_me_else(70), label(69), get_atom(>=,0), get_integer(2,1), proceed, label(70), retry_me_else(72), label(71), get_atom(<,0), get_integer(2,1), proceed, label(72), retry_me_else(74), label(73), get_atom(>,0), get_integer(2,1), proceed, label(74), retry_me_else(76), label(75), get_atom(=\=,0), get_integer(2,1), proceed, label(76), retry_me_else(78), label(77), get_atom(=:=,0), get_integer(2,1), proceed, label(78), retry_me_else(80), label(79), get_atom(is,0), get_integer(2,1), proceed, label(80), retry_me_else(82), label(81), get_atom(=<,0), get_integer(2,1), proceed, label(82), retry_me_else(84), label(83), get_atom(retractall,0), get_integer(1,1), proceed, label(84), retry_me_else(86), label(85), get_atom(assertz,0), get_integer(1,1), proceed, label(86), retry_me_else(88), label(87), get_atom(asserta,0), get_integer(1,1), proceed, label(88), retry_me_else(90), label(89), get_atom(retract,0), get_integer(1,1), proceed, label(90), retry_me_else(92), label(91), get_atom(abolish,0), get_integer(1,1), proceed, label(92), retry_me_else(94), label(93), get_atom(clause,0), get_integer(2,1), proceed, label(94), retry_me_else(96), label(95), get_atom(char_code,0), get_integer(2,1), proceed, label(96), retry_me_else(98), label(97), get_atom(lower_upper,0), get_integer(2,1), proceed, label(98), retry_me_else(100), label(99), get_atom(current_atom,0), get_integer(1,1), proceed, label(100), retry_me_else(102), label(101), get_atom(name,0), get_integer(2,1), proceed, label(102), retry_me_else(104), label(103), get_atom(number_codes,0), get_integer(2,1), proceed, label(104), retry_me_else(106), label(105), get_atom(atom_codes,0), get_integer(2,1), proceed, label(106), retry_me_else(108), label(107), get_atom(atom_length,0), get_integer(2,1), proceed, label(108), retry_me_else(110), label(109), get_atom(atom_property,0), get_integer(2,1), proceed, label(110), retry_me_else(112), label(111), get_atom(number_chars,0), get_integer(2,1), proceed, label(112), retry_me_else(114), label(113), get_atom(new_atom,0), get_integer(1,1), proceed, label(114), retry_me_else(116), label(115), get_atom(new_atom,0), get_integer(2,1), proceed, label(116), retry_me_else(118), label(117), get_atom(new_atom,0), get_integer(3,1), proceed, label(118), retry_me_else(120), label(119), get_atom(number_atom,0), get_integer(2,1), proceed, label(120), retry_me_else(122), label(121), get_atom(atom_chars,0), get_integer(2,1), proceed, label(122), retry_me_else(124), label(123), get_atom(atom_concat,0), get_integer(3,1), proceed, label(124), retry_me_else(126), label(125), get_atom(atom_hash,0), get_integer(2,1), proceed, label(126), retry_me_else(128), label(127), get_atom(sub_atom,0), get_integer(5,1), proceed, label(128), retry_me_else(130), label(129), get_atom(call_det,0), get_integer(2,1), proceed, label(130), retry_me_else(132), label(131), get_atom(once,0), get_integer(1,1), proceed, label(132), retry_me_else(134), label(133), get_atom(\+,0), get_integer(1,1), proceed, label(134), retry_me_else(136), label(135), get_atom(call,0), get_integer(2,1), proceed, label(136), retry_me_else(138), label(137), get_atom(call,0), get_integer(3,1), proceed, label(138), retry_me_else(140), label(139), get_atom(call,0), get_integer(4,1), proceed, label(140), retry_me_else(142), label(141), get_atom(call,0), get_integer(5,1), proceed, label(142), retry_me_else(144), label(143), get_atom(call,0), get_integer(6,1), proceed, label(144), retry_me_else(146), label(145), get_atom(call,0), get_integer(7,1), proceed, label(146), retry_me_else(148), label(147), get_atom(call,0), get_integer(8,1), proceed, label(148), retry_me_else(150), label(149), get_atom(call,0), get_integer(9,1), proceed, label(150), retry_me_else(152), label(151), get_atom(call,0), get_integer(10,1), proceed, label(152), retry_me_else(154), label(153), get_atom(call,0), get_integer(11,1), proceed, label(154), retry_me_else(156), label(155), get_atom(call_with_args,0), get_integer(1,1), proceed, label(156), retry_me_else(158), label(157), get_atom(call_with_args,0), get_integer(2,1), proceed, label(158), retry_me_else(160), label(159), get_atom(call_with_args,0), get_integer(3,1), proceed, label(160), retry_me_else(162), label(161), get_atom(call_with_args,0), get_integer(4,1), proceed, label(162), retry_me_else(164), label(163), get_atom(call_with_args,0), get_integer(5,1), proceed, label(164), retry_me_else(166), label(165), get_atom(call_with_args,0), get_integer(6,1), proceed, label(166), retry_me_else(168), label(167), get_atom(call_with_args,0), get_integer(7,1), proceed, label(168), retry_me_else(170), label(169), get_atom(call_with_args,0), get_integer(8,1), proceed, label(170), retry_me_else(172), label(171), get_atom(call_with_args,0), get_integer(9,1), proceed, label(172), retry_me_else(174), label(173), get_atom(call_with_args,0), get_integer(10,1), proceed, label(174), retry_me_else(176), label(175), get_atom(call_with_args,0), get_integer(11,1), proceed, label(176), retry_me_else(178), label(177), get_atom(get_char,0), get_integer(1,1), proceed, label(178), retry_me_else(180), label(179), get_atom(get_char,0), get_integer(2,1), proceed, label(180), retry_me_else(182), label(181), get_atom(get_code,0), get_integer(1,1), proceed, label(182), retry_me_else(184), label(183), get_atom(get_code,0), get_integer(2,1), proceed, label(184), retry_me_else(186), label(185), get_atom(unget_byte,0), get_integer(1,1), proceed, label(186), retry_me_else(188), label(187), get_atom(unget_byte,0), get_integer(2,1), proceed, label(188), retry_me_else(190), label(189), get_atom(put_char,0), get_integer(1,1), proceed, label(190), retry_me_else(192), label(191), get_atom(put_char,0), get_integer(2,1), proceed, label(192), retry_me_else(194), label(193), get_atom(get_key,0), get_integer(1,1), proceed, label(194), retry_me_else(196), label(195), get_atom(get_key,0), get_integer(2,1), proceed, label(196), retry_me_else(198), label(197), get_atom(peek_code,0), get_integer(1,1), proceed, label(198), retry_me_else(200), label(199), get_atom(peek_code,0), get_integer(2,1), proceed, label(200), retry_me_else(202), label(201), get_atom(put_code,0), get_integer(1,1), proceed, label(202), retry_me_else(204), label(203), get_atom(put_code,0), get_integer(2,1), proceed, label(204), retry_me_else(206), label(205), get_atom(peek_char,0), get_integer(1,1), proceed, label(206), retry_me_else(208), label(207), get_atom(peek_char,0), get_integer(2,1), proceed, label(208), retry_me_else(210), label(209), get_atom(get_byte,0), get_integer(1,1), proceed, label(210), retry_me_else(212), label(211), get_atom(get_byte,0), get_integer(2,1), proceed, label(212), retry_me_else(214), label(213), get_atom(unget_char,0), get_integer(1,1), proceed, label(214), retry_me_else(216), label(215), get_atom(unget_char,0), get_integer(2,1), proceed, label(216), retry_me_else(218), label(217), get_atom(unget_code,0), get_integer(1,1), proceed, label(218), retry_me_else(220), label(219), get_atom(unget_code,0), get_integer(2,1), proceed, label(220), retry_me_else(222), label(221), get_atom(peek_byte,0), get_integer(1,1), proceed, label(222), retry_me_else(224), label(223), get_atom(peek_byte,0), get_integer(2,1), proceed, label(224), retry_me_else(226), label(225), get_atom(put_byte,0), get_integer(1,1), proceed, label(226), retry_me_else(228), label(227), get_atom(put_byte,0), get_integer(2,1), proceed, label(228), retry_me_else(230), label(229), get_atom(get_key_no_echo,0), get_integer(1,1), proceed, label(230), retry_me_else(232), label(231), get_atom(get_key_no_echo,0), get_integer(2,1), proceed, label(232), retry_me_else(234), label(233), get_atom(write_canonical_to_atom,0), get_integer(2,1), proceed, label(234), retry_me_else(236), label(235), get_atom(write_term_to_chars,0), get_integer(3,1), proceed, label(236), retry_me_else(238), label(237), get_atom(write_term_to_codes,0), get_integer(3,1), proceed, label(238), retry_me_else(240), label(239), get_atom(write_to_atom,0), get_integer(2,1), proceed, label(240), retry_me_else(242), label(241), get_atom(display_to_atom,0), get_integer(2,1), proceed, label(242), retry_me_else(244), label(243), get_atom(display_to_codes,0), get_integer(2,1), proceed, label(244), retry_me_else(246), label(245), get_atom(read_term_from_atom,0), get_integer(3,1), proceed, label(246), retry_me_else(248), label(247), get_atom(print_to_atom,0), get_integer(2,1), proceed, label(248), retry_me_else(250), label(249), get_atom(read_term_from_codes,0), get_integer(3,1), proceed, label(250), retry_me_else(252), label(251), get_atom(write_term_to_atom,0), get_integer(3,1), proceed, label(252), retry_me_else(254), label(253), get_atom(write_to_codes,0), get_integer(2,1), proceed, label(254), retry_me_else(256), label(255), get_atom(display_to_chars,0), get_integer(2,1), proceed, label(256), retry_me_else(258), label(257), get_atom(print_to_codes,0), get_integer(2,1), proceed, label(258), retry_me_else(260), label(259), get_atom(read_token_from_atom,0), get_integer(2,1), proceed, label(260), retry_me_else(262), label(261), get_atom(read_token_from_chars,0), get_integer(2,1), proceed, label(262), retry_me_else(264), label(263), get_atom(read_from_atom,0), get_integer(2,1), proceed, label(264), retry_me_else(266), label(265), get_atom(read_from_codes,0), get_integer(2,1), proceed, label(266), retry_me_else(268), label(267), get_atom(read_from_chars,0), get_integer(2,1), proceed, label(268), retry_me_else(270), label(269), get_atom(write_canonical_to_codes,0), get_integer(2,1), proceed, label(270), retry_me_else(272), label(271), get_atom(write_to_chars,0), get_integer(2,1), proceed, label(272), retry_me_else(274), label(273), get_atom(print_to_chars,0), get_integer(2,1), proceed, label(274), retry_me_else(276), label(275), get_atom(read_token_from_codes,0), get_integer(2,1), proceed, label(276), retry_me_else(278), label(277), get_atom(write_canonical_to_chars,0), get_integer(2,1), proceed, label(278), retry_me_else(280), label(279), get_atom(writeq_to_atom,0), get_integer(2,1), proceed, label(280), retry_me_else(282), label(281), get_atom(writeq_to_codes,0), get_integer(2,1), proceed, label(282), retry_me_else(284), label(283), get_atom(writeq_to_chars,0), get_integer(2,1), proceed, label(284), retry_me_else(286), label(285), get_atom(read_term_from_chars,0), get_integer(3,1), proceed, label(286), retry_me_else(288), label(287), get_atom(format_to_atom,0), get_integer(3,1), proceed, label(288), retry_me_else(290), label(289), get_atom(format_to_codes,0), get_integer(3,1), proceed, label(290), retry_me_else(292), label(291), get_atom(format_to_chars,0), get_integer(3,1), proceed, label(292), retry_me_else(294), label(293), get_atom('.',0), get_integer(2,1), proceed, label(294), retry_me_else(296), label(295), get_atom(consult,0), get_integer(1,1), proceed, label(296), retry_me_else(298), label(297), get_atom(listing,0), get_integer(0,1), proceed, label(298), retry_me_else(300), label(299), get_atom(listing,0), get_integer(1,1), proceed, label(300), retry_me_else(302), label(301), get_atom(load,0), get_integer(1,1), proceed, label(302), retry_me_else(304), label(303), get_atom(abort,0), get_integer(0,1), proceed, label(304), retry_me_else(306), label(305), get_atom(repeat,0), get_integer(0,1), proceed, label(306), retry_me_else(308), label(307), get_atom(stop,0), get_integer(0,1), proceed, label(308), retry_me_else(310), label(309), get_atom(halt,0), get_integer(0,1), proceed, label(310), retry_me_else(312), label(311), get_atom(halt,0), get_integer(1,1), proceed, label(312), retry_me_else(314), label(313), get_atom(for,0), get_integer(3,1), proceed, label(314), retry_me_else(316), label(315), get_atom(spypoint_condition,0), get_integer(3,1), proceed, label(316), retry_me_else(318), label(317), get_atom(nospy,0), get_integer(1,1), proceed, label(318), retry_me_else(320), label(319), get_atom(notrace,0), get_integer(0,1), proceed, label(320), retry_me_else(322), label(321), get_atom(debugging,0), get_integer(0,1), proceed, label(322), retry_me_else(324), label(323), get_atom(spy,0), get_integer(1,1), proceed, label(324), retry_me_else(326), label(325), get_atom(leash,0), get_integer(1,1), proceed, label(326), retry_me_else(328), label(327), get_atom(wam_debug,0), get_integer(0,1), proceed, label(328), retry_me_else(330), label(329), get_atom(nodebug,0), get_integer(0,1), proceed, label(330), retry_me_else(332), label(331), get_atom(trace,0), get_integer(0,1), proceed, label(332), retry_me_else(334), label(333), get_atom(debug,0), get_integer(0,1), proceed, label(334), retry_me_else(336), label(335), get_atom(nospyall,0), get_integer(0,1), proceed, label(336), retry_me_else(338), label(337), get_atom(told,0), get_integer(0,1), proceed, label(338), retry_me_else(340), label(339), get_atom(tab,0), get_integer(1,1), proceed, label(340), retry_me_else(342), label(341), get_atom(put,0), get_integer(1,1), proceed, label(342), retry_me_else(344), label(343), get_atom(seeing,0), get_integer(1,1), proceed, label(344), retry_me_else(346), label(345), get_atom(tell,0), get_integer(1,1), proceed, label(346), retry_me_else(348), label(347), get_atom(seen,0), get_integer(0,1), proceed, label(348), retry_me_else(350), label(349), get_atom(see,0), get_integer(1,1), proceed, label(350), retry_me_else(352), label(351), get_atom(append,0), get_integer(1,1), proceed, label(352), retry_me_else(354), label(353), get_atom(telling,0), get_integer(1,1), proceed, label(354), retry_me_else(356), label(355), get_atom(skip,0), get_integer(1,1), proceed, label(356), retry_me_else(358), label(357), get_atom(get,0), get_integer(1,1), proceed, label(358), retry_me_else(360), label(359), get_atom(get0,0), get_integer(1,1), proceed, label(360), retry_me_else(362), label(361), get_atom(expand_term,0), get_integer(2,1), proceed, label(362), retry_me_else(364), label(363), get_atom(phrase,0), get_integer(2,1), proceed, label(364), retry_me_else(366), label(365), get_atom(phrase,0), get_integer(3,1), proceed, label(366), retry_me_else(368), label(367), get_atom(decompose_file_name,0), get_integer(4,1), proceed, label(368), retry_me_else(370), label(369), get_atom(absolute_file_name,0), get_integer(2,1), proceed, label(370), retry_me_else(372), label(371), get_atom(prolog_file_name,0), get_integer(2,1), proceed, label(372), retry_me_else(374), label(373), get_atom(read_pl_state_file,0), get_integer(1,1), proceed, label(374), retry_me_else(376), label(375), get_atom(argument_counter,0), get_integer(1,1), proceed, label(376), retry_me_else(378), label(377), get_atom(write_pl_state_file,0), get_integer(1,1), proceed, label(378), retry_me_else(380), label(379), get_atom(argument_value,0), get_integer(2,1), proceed, label(380), retry_me_else(382), label(381), get_atom(set_prolog_flag,0), get_integer(2,1), proceed, label(382), retry_me_else(384), label(383), get_atom(current_prolog_flag,0), get_integer(2,1), proceed, label(384), retry_me_else(386), label(385), get_atom(argument_list,0), get_integer(1,1), proceed, label(386), retry_me_else(388), label(387), get_atom(environ,0), get_integer(2,1), proceed, label(388), retry_me_else(390), label(389), get_atom(format,0), get_integer(2,1), proceed, label(390), retry_me_else(392), label(391), get_atom(format,0), get_integer(3,1), proceed, label(392), retry_me_else(394), label(393), get_atom(g_test_set_bit,0), get_integer(2,1), proceed, label(394), retry_me_else(396), label(395), get_atom(g_inc,0), get_integer(1,1), proceed, label(396), retry_me_else(398), label(397), get_atom(g_inc,0), get_integer(2,1), proceed, label(398), retry_me_else(400), label(399), get_atom(g_inc,0), get_integer(3,1), proceed, label(400), retry_me_else(402), label(401), get_atom(g_deco,0), get_integer(2,1), proceed, label(402), retry_me_else(404), label(403), get_atom(g_assign,0), get_integer(2,1), proceed, label(404), retry_me_else(406), label(405), get_atom(g_assignb,0), get_integer(2,1), proceed, label(406), retry_me_else(408), label(407), get_atom(g_set_bit,0), get_integer(2,1), proceed, label(408), retry_me_else(410), label(409), get_atom(g_inco,0), get_integer(2,1), proceed, label(410), retry_me_else(412), label(411), get_atom(g_test_reset_bit,0), get_integer(2,1), proceed, label(412), retry_me_else(414), label(413), get_atom(g_reset_bit,0), get_integer(2,1), proceed, label(414), retry_me_else(416), label(415), get_atom(g_dec,0), get_integer(1,1), proceed, label(416), retry_me_else(418), label(417), get_atom(g_dec,0), get_integer(2,1), proceed, label(418), retry_me_else(420), label(419), get_atom(g_dec,0), get_integer(3,1), proceed, label(420), retry_me_else(422), label(421), get_atom(g_array_size,0), get_integer(2,1), proceed, label(422), retry_me_else(424), label(423), get_atom(g_read,0), get_integer(2,1), proceed, label(424), retry_me_else(426), label(425), get_atom(g_link,0), get_integer(2,1), proceed, label(426), retry_me_else(428), label(427), get_atom(add_linedit_completion,0), get_integer(1,1), proceed, label(428), retry_me_else(430), label(429), get_atom(find_linedit_completion,0), get_integer(2,1), proceed, label(430), retry_me_else(432), label(431), get_atom(get_linedit_prompt,0), get_integer(1,1), proceed, label(432), retry_me_else(434), label(433), get_atom(set_linedit_prompt,0), get_integer(1,1), proceed, label(434), retry_me_else(436), label(435), get_atom(reverse,0), get_integer(2,1), proceed, label(436), retry_me_else(438), label(437), get_atom(nth,0), get_integer(3,1), proceed, label(438), retry_me_else(440), label(439), get_atom(min_list,0), get_integer(2,1), proceed, label(440), retry_me_else(442), label(441), get_atom(permutation,0), get_integer(2,1), proceed, label(442), retry_me_else(444), label(443), get_atom(sum_list,0), get_integer(2,1), proceed, label(444), retry_me_else(446), label(445), get_atom(prefix,0), get_integer(2,1), proceed, label(446), retry_me_else(448), label(447), get_atom(last,0), get_integer(2,1), proceed, label(448), retry_me_else(450), label(449), get_atom(suffix,0), get_integer(2,1), proceed, label(450), retry_me_else(452), label(451), get_atom(sublist,0), get_integer(2,1), proceed, label(452), retry_me_else(454), label(453), get_atom(select,0), get_integer(3,1), proceed, label(454), retry_me_else(456), label(455), get_atom(append,0), get_integer(3,1), proceed, label(456), retry_me_else(458), label(457), get_atom(delete,0), get_integer(3,1), proceed, label(458), retry_me_else(460), label(459), get_atom(memberchk,0), get_integer(2,1), proceed, label(460), retry_me_else(462), label(461), get_atom(length,0), get_integer(2,1), proceed, label(462), retry_me_else(464), label(463), get_atom(member,0), get_integer(2,1), proceed, label(464), retry_me_else(466), label(465), get_atom(max_list,0), get_integer(2,1), proceed, label(466), retry_me_else(468), label(467), get_atom(current_op,0), get_integer(3,1), proceed, label(468), retry_me_else(470), label(469), get_atom(op,0), get_integer(3,1), proceed, label(470), retry_me_else(472), label(471), get_atom(host_name,0), get_integer(1,1), proceed, label(472), retry_me_else(474), label(473), get_atom(directory_files,0), get_integer(2,1), proceed, label(474), retry_me_else(476), label(475), get_atom(exec,0), get_integer(5,1), proceed, label(476), retry_me_else(478), label(477), get_atom(exec,0), get_integer(4,1), proceed, label(478), retry_me_else(480), label(479), get_atom(working_directory,0), get_integer(1,1), proceed, label(480), retry_me_else(482), label(481), get_atom(file_exists,0), get_integer(1,1), proceed, label(482), retry_me_else(484), label(483), get_atom(temporary_file,0), get_integer(3,1), proceed, label(484), retry_me_else(486), label(485), get_atom(architecture,0), get_integer(1,1), proceed, label(486), retry_me_else(488), label(487), get_atom(wait,0), get_integer(2,1), proceed, label(488), retry_me_else(490), label(489), get_atom(delete_file,0), get_integer(1,1), proceed, label(490), retry_me_else(492), label(491), get_atom(change_directory,0), get_integer(1,1), proceed, label(492), retry_me_else(494), label(493), get_atom(date_time,0), get_integer(1,1), proceed, label(494), retry_me_else(496), label(495), get_atom(select,0), get_integer(5,1), proceed, label(496), retry_me_else(498), label(497), get_atom(popen,0), get_integer(3,1), proceed, label(498), retry_me_else(500), label(499), get_atom(make_directory,0), get_integer(1,1), proceed, label(500), retry_me_else(502), label(501), get_atom(system,0), get_integer(1,1), proceed, label(502), retry_me_else(504), label(503), get_atom(system,0), get_integer(2,1), proceed, label(504), retry_me_else(506), label(505), get_atom(unlink,0), get_integer(1,1), proceed, label(506), retry_me_else(508), label(507), get_atom(os_version,0), get_integer(1,1), proceed, label(508), retry_me_else(510), label(509), get_atom(create_pipe,0), get_integer(2,1), proceed, label(510), retry_me_else(512), label(511), get_atom(file_property,0), get_integer(2,1), proceed, label(512), retry_me_else(514), label(513), get_atom(delete_directory,0), get_integer(1,1), proceed, label(514), retry_me_else(516), label(515), get_atom(spawn,0), get_integer(2,1), proceed, label(516), retry_me_else(518), label(517), get_atom(spawn,0), get_integer(3,1), proceed, label(518), retry_me_else(520), label(519), get_atom(sleep,0), get_integer(1,1), proceed, label(520), retry_me_else(522), label(521), get_atom(prolog_pid,0), get_integer(1,1), proceed, label(522), retry_me_else(524), label(523), get_atom(temporary_name,0), get_integer(2,1), proceed, label(524), retry_me_else(526), label(525), get_atom(shell,0), get_integer(0,1), proceed, label(526), retry_me_else(528), label(527), get_atom(shell,0), get_integer(1,1), proceed, label(528), retry_me_else(530), label(529), get_atom(shell,0), get_integer(2,1), proceed, label(530), retry_me_else(532), label(531), get_atom(rename_file,0), get_integer(2,1), proceed, label(532), retry_me_else(534), label(533), get_atom(file_permission,0), get_integer(2,1), proceed, label(534), retry_me_else(536), label(535), get_atom(send_signal,0), get_integer(2,1), proceed, label(536), retry_me_else(538), label(537), get_atom(fork_prolog,0), get_integer(1,1), proceed, label(538), retry_me_else(540), label(539), get_atom(current_bip_name,0), get_integer(2,1), proceed, label(540), retry_me_else(542), label(541), get_atom(set_bip_name,0), get_integer(2,1), proceed, label(542), retry_me_else(544), label(543), get_atom(syntax_error_info,0), get_integer(4,1), proceed, label(544), retry_me_else(546), label(545), get_atom(current_predicate,0), get_integer(1,1), proceed, label(546), retry_me_else(548), label(547), get_atom(predicate_property,0), get_integer(2,1), proceed, label(548), retry_me_else(550), label(549), get_atom(name_query_vars,0), get_integer(2,1), proceed, label(550), retry_me_else(552), label(551), get_atom(name_singleton_vars,0), get_integer(1,1), proceed, label(552), retry_me_else(554), label(553), get_atom(bind_variables,0), get_integer(2,1), proceed, label(554), retry_me_else(556), label(555), get_atom(numbervars,0), get_integer(1,1), proceed, label(556), retry_me_else(558), label(557), get_atom(numbervars,0), get_integer(3,1), proceed, label(558), retry_me_else(560), label(559), get_atom(portray_clause,0), get_integer(1,1), proceed, label(560), retry_me_else(562), label(561), get_atom(portray_clause,0), get_integer(2,1), proceed, label(562), retry_me_else(564), label(563), get_atom(get_print_stream,0), get_integer(1,1), proceed, label(564), retry_me_else(566), label(565), get_atom(print,0), get_integer(1,1), proceed, label(566), retry_me_else(568), label(567), get_atom(print,0), get_integer(2,1), proceed, label(568), retry_me_else(570), label(569), get_atom(get_seed,0), get_integer(1,1), proceed, label(570), retry_me_else(572), label(571), get_atom(set_seed,0), get_integer(1,1), proceed, label(572), retry_me_else(574), label(573), get_atom(randomize,0), get_integer(0,1), proceed, label(574), retry_me_else(576), label(575), get_atom(random,0), get_integer(1,1), proceed, label(576), retry_me_else(578), label(577), get_atom(random,0), get_integer(3,1), proceed, label(578), retry_me_else(580), label(579), get_atom(char_conversion,0), get_integer(2,1), proceed, label(580), retry_me_else(582), label(581), get_atom(read_number,0), get_integer(1,1), proceed, label(582), retry_me_else(584), label(583), get_atom(read_number,0), get_integer(2,1), proceed, label(584), retry_me_else(586), label(585), get_atom(read_token,0), get_integer(1,1), proceed, label(586), retry_me_else(588), label(587), get_atom(read_token,0), get_integer(2,1), proceed, label(588), retry_me_else(590), label(589), get_atom(read_integer,0), get_integer(1,1), proceed, label(590), retry_me_else(592), label(591), get_atom(read_integer,0), get_integer(2,1), proceed, label(592), retry_me_else(594), label(593), get_atom(read_term,0), get_integer(2,1), proceed, label(594), retry_me_else(596), label(595), get_atom(read_term,0), get_integer(3,1), proceed, label(596), retry_me_else(598), label(597), get_atom(current_char_conversion,0), get_integer(2,1), proceed, label(598), retry_me_else(600), label(599), get_atom(read_atom,0), get_integer(1,1), proceed, label(600), retry_me_else(602), label(601), get_atom(read_atom,0), get_integer(2,1), proceed, label(602), retry_me_else(604), label(603), get_atom(read,0), get_integer(1,1), proceed, label(604), retry_me_else(606), label(605), get_atom(read,0), get_integer(2,1), proceed, label(606), retry_me_else(608), label(607), get_atom(last_read_start_line_column,0), get_integer(2,1), proceed, label(608), retry_me_else(610), label(609), get_atom(socket_close,0), get_integer(1,1), proceed, label(610), retry_me_else(612), label(611), get_atom(socket_bind,0), get_integer(2,1), proceed, label(612), retry_me_else(614), label(613), get_atom(socket_connect,0), get_integer(4,1), proceed, label(614), retry_me_else(616), label(615), get_atom(socket,0), get_integer(2,1), proceed, label(616), retry_me_else(618), label(617), get_atom(socket_accept,0), get_integer(3,1), proceed, label(618), retry_me_else(620), label(619), get_atom(socket_accept,0), get_integer(4,1), proceed, label(620), retry_me_else(622), label(621), get_atom(hostname_address,0), get_integer(2,1), proceed, label(622), retry_me_else(624), label(623), get_atom(socket_listen,0), get_integer(2,1), proceed, label(624), retry_me_else(626), label(625), get_atom(keysort,0), get_integer(2,1), proceed, label(626), retry_me_else(628), label(627), get_atom(keysort,0), get_integer(1,1), proceed, label(628), retry_me_else(630), label(629), get_atom(sort,0), get_integer(2,1), proceed, label(630), retry_me_else(632), label(631), get_atom(sort,0), get_integer(1,1), proceed, label(632), retry_me_else(634), label(633), get_atom(sort0,0), get_integer(2,1), proceed, label(634), retry_me_else(636), label(635), get_atom(sort0,0), get_integer(1,1), proceed, label(636), retry_me_else(638), label(637), get_atom(sr_change_options,0), get_integer(2,1), proceed, label(638), retry_me_else(640), label(639), get_atom(sr_get_size_counters,0), get_integer(3,1), proceed, label(640), retry_me_else(642), label(641), get_atom(sr_open,0), get_integer(3,1), proceed, label(642), retry_me_else(644), label(643), get_atom(sr_current_descriptor,0), get_integer(1,1), proceed, label(644), retry_me_else(646), label(645), get_atom(sr_get_include_list,0), get_integer(2,1), proceed, label(646), retry_me_else(648), label(647), get_atom(sr_get_file_name,0), get_integer(2,1), proceed, label(648), retry_me_else(650), label(649), get_atom(sr_write_error,0), get_integer(2,1), proceed, label(650), retry_me_else(652), label(651), get_atom(sr_write_error,0), get_integer(4,1), proceed, label(652), retry_me_else(654), label(653), get_atom(sr_write_error,0), get_integer(6,1), proceed, label(654), retry_me_else(656), label(655), get_atom(sr_close,0), get_integer(1,1), proceed, label(656), retry_me_else(658), label(657), get_atom(sr_read_term,0), get_integer(4,1), proceed, label(658), retry_me_else(660), label(659), get_atom(sr_error_from_exception,0), get_integer(2,1), proceed, label(660), retry_me_else(662), label(661), get_atom(sr_get_error_counters,0), get_integer(3,1), proceed, label(662), retry_me_else(664), label(663), get_atom(sr_set_error_counters,0), get_integer(3,1), proceed, label(664), retry_me_else(666), label(665), get_atom(sr_get_stream,0), get_integer(2,1), proceed, label(666), retry_me_else(668), label(667), get_atom(sr_get_position,0), get_integer(3,1), proceed, label(668), retry_me_else(670), label(669), get_atom(sr_get_include_stream_list,0), get_integer(2,1), proceed, label(670), retry_me_else(672), label(671), get_atom(sr_new_pass,0), get_integer(1,1), proceed, label(672), retry_me_else(674), label(673), get_atom(sr_write_message,0), get_integer(4,1), proceed, label(674), retry_me_else(676), label(675), get_atom(sr_write_message,0), get_integer(6,1), proceed, label(676), retry_me_else(678), label(677), get_atom(sr_write_message,0), get_integer(8,1), proceed, label(678), retry_me_else(680), label(679), get_atom(sr_get_module,0), get_integer(3,1), proceed, label(680), retry_me_else(682), label(681), get_atom(system_time,0), get_integer(1,1), proceed, label(682), retry_me_else(684), label(683), get_atom(real_time,0), get_integer(1,1), proceed, label(684), retry_me_else(686), label(685), get_atom(statistics,0), get_integer(0,1), proceed, label(686), retry_me_else(688), label(687), get_atom(statistics,0), get_integer(2,1), proceed, label(688), retry_me_else(690), label(689), get_atom(cpu_time,0), get_integer(1,1), proceed, label(690), retry_me_else(692), label(691), get_atom(user_time,0), get_integer(1,1), proceed, label(692), retry_me_else(694), label(693), get_atom(close,0), get_integer(1,1), proceed, label(694), retry_me_else(696), label(695), get_atom(close,0), get_integer(2,1), proceed, label(696), retry_me_else(698), label(697), get_atom(stream_line_column,0), get_integer(3,1), proceed, label(698), retry_me_else(700), label(699), get_atom(stream_property,0), get_integer(2,1), proceed, label(700), retry_me_else(702), label(701), get_atom(open_input_codes_stream,0), get_integer(2,1), proceed, label(702), retry_me_else(704), label(703), get_atom(flush_output,0), get_integer(0,1), proceed, label(704), retry_me_else(706), label(705), get_atom(flush_output,0), get_integer(1,1), proceed, label(706), retry_me_else(708), label(707), get_atom(current_input,0), get_integer(1,1), proceed, label(708), retry_me_else(710), label(709), get_atom(seek,0), get_integer(4,1), proceed, label(710), retry_me_else(712), label(711), get_atom(set_stream_buffering,0), get_integer(2,1), proceed, label(712), retry_me_else(714), label(713), get_atom(open_input_chars_stream,0), get_integer(2,1), proceed, label(714), retry_me_else(716), label(715), get_atom(open_output_chars_stream,0), get_integer(1,1), proceed, label(716), retry_me_else(718), label(717), get_atom(close_input_chars_stream,0), get_integer(1,1), proceed, label(718), retry_me_else(720), label(719), get_atom(stream_position,0), get_integer(2,1), proceed, label(720), retry_me_else(722), label(721), get_atom(open_output_atom_stream,0), get_integer(1,1), proceed, label(722), retry_me_else(724), label(723), get_atom(close_input_atom_stream,0), get_integer(1,1), proceed, label(724), retry_me_else(726), label(725), get_atom(at_end_of_stream,0), get_integer(0,1), proceed, label(726), retry_me_else(728), label(727), get_atom(at_end_of_stream,0), get_integer(1,1), proceed, label(728), retry_me_else(730), label(729), get_atom(character_count,0), get_integer(2,1), proceed, label(730), retry_me_else(732), label(731), get_atom(open_input_atom_stream,0), get_integer(2,1), proceed, label(732), retry_me_else(734), label(733), get_atom(set_stream_type,0), get_integer(2,1), proceed, label(734), retry_me_else(736), label(735), get_atom(set_output,0), get_integer(1,1), proceed, label(736), retry_me_else(738), label(737), get_atom(add_stream_alias,0), get_integer(2,1), proceed, label(738), retry_me_else(740), label(739), get_atom(current_stream,0), get_integer(1,1), proceed, label(740), retry_me_else(742), label(741), get_atom(set_stream_eof_action,0), get_integer(2,1), proceed, label(742), retry_me_else(744), label(743), get_atom(set_input,0), get_integer(1,1), proceed, label(744), retry_me_else(746), label(745), get_atom(current_alias,0), get_integer(2,1), proceed, label(746), retry_me_else(748), label(747), get_atom(open_output_codes_stream,0), get_integer(1,1), proceed, label(748), retry_me_else(750), label(749), get_atom(line_position,0), get_integer(2,1), proceed, label(750), retry_me_else(752), label(751), get_atom(current_output,0), get_integer(1,1), proceed, label(752), retry_me_else(754), label(753), get_atom(line_count,0), get_integer(2,1), proceed, label(754), retry_me_else(756), label(755), get_atom(close_input_codes_stream,0), get_integer(1,1), proceed, label(756), retry_me_else(758), label(757), get_atom(open,0), get_integer(3,1), proceed, label(758), retry_me_else(760), label(759), get_atom(open,0), get_integer(4,1), proceed, label(760), retry_me_else(762), label(761), get_atom(close_output_chars_stream,0), get_integer(2,1), proceed, label(762), retry_me_else(764), label(763), get_atom(close_output_codes_stream,0), get_integer(2,1), proceed, label(764), retry_me_else(766), label(765), get_atom(set_stream_line_column,0), get_integer(3,1), proceed, label(766), retry_me_else(768), label(767), get_atom(set_stream_position,0), get_integer(2,1), proceed, label(768), retry_me_else(770), label(769), get_atom(close_output_atom_stream,0), get_integer(2,1), proceed, label(770), retry_me_else(772), label(771), get_atom(current_mirror,0), get_integer(2,1), proceed, label(772), retry_me_else(774), label(773), get_atom(add_stream_mirror,0), get_integer(2,1), proceed, label(774), retry_me_else(776), label(775), get_atom(remove_stream_mirror,0), get_integer(2,1), proceed, label(776), retry_me_else(778), label(777), get_atom(==,0), get_integer(2,1), proceed, label(778), retry_me_else(780), label(779), get_atom(functor,0), get_integer(3,1), proceed, label(780), retry_me_else(782), label(781), get_atom(@>,0), get_integer(2,1), proceed, label(782), retry_me_else(784), label(783), get_atom(setarg,0), get_integer(3,1), proceed, label(784), retry_me_else(786), label(785), get_atom(setarg,0), get_integer(4,1), proceed, label(786), retry_me_else(788), label(787), get_atom(=..,0), get_integer(2,1), proceed, label(788), retry_me_else(790), label(789), get_atom(copy_term,0), get_integer(2,1), proceed, label(790), retry_me_else(792), label(791), get_atom(term_ref,0), get_integer(2,1), proceed, label(792), retry_me_else(794), label(793), get_atom(compare,0), get_integer(3,1), proceed, label(794), retry_me_else(796), label(795), get_atom(@=<,0), get_integer(2,1), proceed, label(796), retry_me_else(798), label(797), get_atom(\==,0), get_integer(2,1), proceed, label(798), retry_me_else(800), label(799), get_atom(@>=,0), get_integer(2,1), proceed, label(800), retry_me_else(802), label(801), get_atom(arg,0), get_integer(3,1), proceed, label(802), retry_me_else(804), label(803), get_atom(@<,0), get_integer(2,1), proceed, label(804), retry_me_else(806), label(805), get_atom(top_level,0), get_integer(0,1), proceed, label(806), retry_me_else(808), label(807), get_atom(break,0), get_integer(0,1), proceed, label(808), retry_me_else(810), label(809), get_atom(list_or_partial_list,0), get_integer(1,1), proceed, label(810), retry_me_else(812), label(811), get_atom(atomic,0), get_integer(1,1), proceed, label(812), retry_me_else(814), label(813), get_atom(number,0), get_integer(1,1), proceed, label(814), retry_me_else(816), label(815), get_atom(integer,0), get_integer(1,1), proceed, label(816), retry_me_else(818), label(817), get_atom(atom,0), get_integer(1,1), proceed, label(818), retry_me_else(820), label(819), get_atom(partial_list,0), get_integer(1,1), proceed, label(820), retry_me_else(822), label(821), get_atom(list,0), get_integer(1,1), proceed, label(822), retry_me_else(824), label(823), get_atom(var,0), get_integer(1,1), proceed, label(824), retry_me_else(826), label(825), get_atom(compound,0), get_integer(1,1), proceed, label(826), retry_me_else(828), label(827), get_atom(callable,0), get_integer(1,1), proceed, label(828), retry_me_else(830), label(829), get_atom(float,0), get_integer(1,1), proceed, label(830), retry_me_else(832), label(831), get_atom(nonvar,0), get_integer(1,1), proceed, label(832), retry_me_else(834), label(833), get_atom(\=,0), get_integer(2,1), proceed, label(834), retry_me_else(836), label(835), get_atom(=,0), get_integer(2,1), proceed, label(836), retry_me_else(838), label(837), get_atom(unify_with_occurs_check,0), get_integer(2,1), proceed, label(838), retry_me_else(840), label(839), get_atom(writeq,0), get_integer(1,1), proceed, label(840), retry_me_else(842), label(841), get_atom(writeq,0), get_integer(2,1), proceed, label(842), retry_me_else(844), label(843), get_atom(write_canonical,0), get_integer(1,1), proceed, label(844), retry_me_else(846), label(845), get_atom(write_canonical,0), get_integer(2,1), proceed, label(846), retry_me_else(848), label(847), get_atom(display,0), get_integer(1,1), proceed, label(848), retry_me_else(850), label(849), get_atom(display,0), get_integer(2,1), proceed, label(850), retry_me_else(852), label(851), get_atom(nl,0), get_integer(0,1), proceed, label(852), retry_me_else(854), label(853), get_atom(nl,0), get_integer(1,1), proceed, label(854), retry_me_else(856), label(855), get_atom(write_term,0), get_integer(2,1), proceed, label(856), retry_me_else(858), label(857), get_atom(write_term,0), get_integer(3,1), proceed, label(858), retry_me_else(860), label(859), get_atom(write,0), get_integer(1,1), proceed, label(860), retry_me_else(862), label(861), get_atom(write,0), get_integer(2,1), proceed, label(862), retry_me_else(864), label(863), get_atom(##,0), get_integer(2,1), proceed, label(864), retry_me_else(866), label(865), get_atom(fd_at_least_one,0), get_integer(1,1), proceed, label(866), retry_me_else(868), label(867), get_atom(#\<=>,0), get_integer(2,1), proceed, label(868), retry_me_else(870), label(869), get_atom(#/\,0), get_integer(2,1), proceed, label(870), retry_me_else(872), label(871), get_atom(#\==>,0), get_integer(2,1), proceed, label(872), retry_me_else(874), label(873), get_atom(fd_only_one,0), get_integer(1,1), proceed, label(874), retry_me_else(876), label(875), get_atom(#<=>,0), get_integer(2,1), proceed, label(876), retry_me_else(878), label(877), get_atom(#\,0), get_integer(1,1), proceed, label(878), retry_me_else(880), label(879), get_atom(#==>,0), get_integer(2,1), proceed, label(880), retry_me_else(882), label(881), get_atom(#\/\,0), get_integer(2,1), proceed, label(882), retry_me_else(884), label(883), get_atom(fd_at_most_one,0), get_integer(1,1), proceed, label(884), retry_me_else(886), label(885), get_atom(fd_cardinality,0), get_integer(2,1), proceed, label(886), retry_me_else(888), label(887), get_atom(fd_cardinality,0), get_integer(3,1), proceed, label(888), retry_me_else(890), label(889), get_atom(#\/,0), get_integer(2,1), proceed, label(890), retry_me_else(892), label(891), get_atom(#\\/,0), get_integer(2,1), proceed, label(892), retry_me_else(894), label(893), get_atom(fd_vector_max,0), get_integer(1,1), proceed, label(894), retry_me_else(896), label(895), get_atom(fd_size,0), get_integer(2,1), proceed, label(896), retry_me_else(898), label(897), get_atom(fd_has_extra_cstr,0), get_integer(1,1), proceed, label(898), retry_me_else(900), label(899), get_atom(fd_set_vector_max,0), get_integer(1,1), proceed, label(900), retry_me_else(902), label(901), get_atom(fd_min,0), get_integer(2,1), proceed, label(902), retry_me_else(904), label(903), get_atom(fd_dom,0), get_integer(2,1), proceed, label(904), retry_me_else(906), label(905), get_atom(fd_use_vector,0), get_integer(1,1), proceed, label(906), retry_me_else(908), label(907), get_atom(fd_max_integer,0), get_integer(1,1), proceed, label(908), retry_me_else(910), label(909), get_atom(fd_has_vector,0), get_integer(1,1), proceed, label(910), retry_me_else(912), label(911), get_atom(fd_max,0), get_integer(2,1), proceed, label(912), retry_me_else(914), label(913), get_atom(#=,0), get_integer(2,1), proceed, label(914), retry_me_else(916), label(915), get_atom(#>,0), get_integer(2,1), proceed, label(916), retry_me_else(918), label(917), get_atom(#\=,0), get_integer(2,1), proceed, label(918), retry_me_else(920), label(919), get_atom(#=<#,0), get_integer(2,1), proceed, label(920), retry_me_else(922), label(921), get_atom(#>=#,0), get_integer(2,1), proceed, label(922), retry_me_else(924), label(923), get_atom(#=<,0), get_integer(2,1), proceed, label(924), retry_me_else(926), label(925), get_atom(#\=#,0), get_integer(2,1), proceed, label(926), retry_me_else(928), label(927), get_atom(#>=,0), get_integer(2,1), proceed, label(928), retry_me_else(930), label(929), get_atom(#<#,0), get_integer(2,1), proceed, label(930), retry_me_else(932), label(931), get_atom(#=#,0), get_integer(2,1), proceed, label(932), retry_me_else(934), label(933), get_atom(#>#,0), get_integer(2,1), proceed, label(934), retry_me_else(936), label(935), get_atom(#<,0), get_integer(2,1), proceed, label(936), retry_me_else(938), label(937), get_atom(fd_minimize,0), get_integer(2,1), proceed, label(938), retry_me_else(940), label(939), get_atom(fd_maximize,0), get_integer(2,1), proceed, label(940), retry_me_else(942), label(941), get_atom(fd_prime,0), get_integer(1,1), proceed, label(942), retry_me_else(944), label(943), get_atom(fd_not_prime,0), get_integer(1,1), proceed, label(944), retry_me_else(946), label(945), get_atom(fd_relation,0), get_integer(2,1), proceed, label(946), retry_me_else(948), label(947), get_atom(fd_relationc,0), get_integer(2,1), proceed, label(948), retry_me_else(950), label(949), get_atom(fd_all_different,0), get_integer(1,1), proceed, label(950), retry_me_else(952), label(951), get_atom(fd_exactly,0), get_integer(3,1), proceed, label(952), retry_me_else(954), label(953), get_atom(fd_element_var,0), get_integer(3,1), proceed, label(954), retry_me_else(956), label(955), get_atom(fd_atleast,0), get_integer(3,1), proceed, label(956), retry_me_else(958), label(957), get_atom(fd_element,0), get_integer(3,1), proceed, label(958), retry_me_else(960), label(959), get_atom(fd_atmost,0), get_integer(3,1), proceed, label(960), retry_me_else(962), label(961), get_atom(fd_labelingff,0), get_integer(1,1), proceed, label(962), retry_me_else(964), label(963), get_atom(fd_domain_bool,0), get_integer(1,1), proceed, label(964), retry_me_else(966), label(965), get_atom(fd_domain,0), get_integer(2,1), proceed, label(966), retry_me_else(968), label(967), get_atom(fd_domain,0), get_integer(3,1), proceed, label(968), retry_me_else(970), label(969), get_atom(fd_labeling,0), get_integer(1,1), proceed, label(970), retry_me_else(972), label(971), get_atom(fd_labeling,0), get_integer(2,1), proceed, label(972), retry_me_else(974), label(973), get_atom(fd_var,0), get_integer(1,1), proceed, label(974), retry_me_else(976), label(975), get_atom(generic_var,0), get_integer(1,1), proceed, label(976), retry_me_else(978), label(977), get_atom(non_generic_var,0), get_integer(1,1), proceed, label(978), trust_me_else_fail, label(979), get_atom(non_fd_var,0), get_integer(1,1), proceed]). ./gprolog-1.3.0/src/Pl2Wam/internal.wam0000644004425400513100000004462010547440341016214 0ustar diazloco% compiler: GNU Prolog 1.3.0 (Jan 4 2007) % file : internal.pl % date : 1 5 2007 % time : 13:13:21 file_name('/home/diaz/GP/src/src/Pl2Wam/internal.pl'). predicate(internal_format/6,59,static,private,user,[ allocate(5), get_variable(y(0),1), get_variable(y(1),3), get_variable(y(2),4), get_variable(y(3),5), put_variable(y(4),1), call(format_head/3), put_value(y(0),0), put_value(y(4),1), put_value(y(1),2), put_value(y(2),3), call(format_body/4), put_unsafe_value(y(4),0), put_integer(0,1), put_value(y(3),2), deallocate, execute(classif_vars/3)]). predicate(format_head/3,67,static,private,user,[ get_variable(x(3),2), put_value(x(1),2), put_integer(0,1), put_void(4), execute(format_pred/5)]). predicate(format_body/4,73,static,private,user,[ get_variable(x(5),2), put_value(x(1),2), put_value(x(3),6), put_integer(0,1), put_atom(t,3), put_nil(4), put_void(7), execute(format_body1/8)]). predicate(format_body1/8,76,static,private,user,[ load_cut_level(8), try_me_else(5), switch_on_term(1,4,fail,fail,2), label(1), try_me_else(3), label(2), allocate(8), get_variable(y(1),2), get_variable(y(2),4), get_variable(y(3),6), get_variable(y(4),7), get_structure((',')/2,0), unify_variable(x(0)), unify_variable(y(0)), cut(x(8)), put_value(y(1),2), put_variable(y(5),4), put_variable(y(6),6), put_variable(y(7),7), call(format_body1/8), put_value(y(0),0), put_unsafe_value(y(6),1), put_value(y(1),2), put_unsafe_value(y(7),3), put_value(y(2),4), put_unsafe_value(y(5),5), put_value(y(3),6), put_value(y(4),7), deallocate, execute(format_body1/8), label(3), trust_me_else_fail, label(4), get_atom(true,0), get_value(x(5),4), get_value(x(7),3), get_value(x(6),1), cut(x(8)), proceed, label(5), trust_me_else_fail, allocate(6), get_variable(y(0),0), get_variable(y(1),2), get_variable(y(3),6), get_variable(y(4),7), get_list(5), unify_variable(y(2)), unify_local_value(x(4)), put_value(x(3),0), put_value(x(1),2), put_value(y(3),1), call('$format_body1/8_$aux1'/3), put_value(y(0),0), put_value(y(3),1), put_value(y(1),2), put_value(y(2),3), put_variable(y(5),4), call(format_pred/5), put_unsafe_value(y(5),0), put_value(y(4),1), deallocate, execute('$format_body1/8_$aux2'/2)]). predicate('$format_body1/8_$aux2'/2,84,static,private,user,[ load_cut_level(2), try_me_else(1), get_atom(t,0), cut(x(2)), get_atom(f,1), proceed, label(1), trust_me_else_fail, get_atom(t,1), proceed]). predicate('$format_body1/8_$aux1'/3,84,static,private,user,[ load_cut_level(3), try_me_else(1), get_atom(t,0), cut(x(3)), math_fast_load_value(x(2),0), call_c('Fct_Fast_Inc',[fast_call,x(0)],[x(0)]), get_value(x(1),0), proceed, label(1), trust_me_else_fail, get_value(x(2),1), proceed]). predicate(format_pred/5,103,static,private,user,[ allocate(4), get_variable(y(3),4), get_variable(x(4),0), get_structure(p/3,3), unify_local_value(x(1)), unify_variable(x(0)), unify_variable(y(2)), get_structure((/)/2,0), unify_variable(y(0)), unify_variable(y(1)), put_value(y(0),0), put_value(y(1),3), call_c('Blt_Functor',[fast_call,boolean],[x(4),x(0),x(3)]), put_list(3), unify_void(1), unify_variable(x(0)), call_c('Blt_Univ',[fast_call,boolean],[x(4),x(3)]), put_value(y(2),3), call(format_arg_lst/4), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), deallocate, execute('$format_pred/5_$aux1'/4)]). predicate('$format_pred/5_$aux1'/4,103,static,private,user,[ load_cut_level(4), try_me_else(1), allocate(2), get_variable(y(0),3), get_variable(y(1),4), call('$format_pred/5_$aux2'/3), cut(y(1)), put_value(y(0),0), get_atom(t,0), deallocate, proceed, label(1), trust_me_else_fail, get_atom(f,3), proceed]). predicate('$format_pred/5_$aux2'/3,103,static,private,user,[ try_me_else(1), execute(inline_predicate/2), label(1), trust_me_else_fail, get_atom('$call_c',0), get_integer(2,1), get_list(2), unify_void(1), unify_list, unify_variable(x(0)), unify_nil, execute(not_dangerous_c_call/1)]). predicate(format_arg_lst/4,120,static,private,user,[ load_cut_level(4), switch_on_term(1,2,fail,4,fail), label(1), try_me_else(3), label(2), get_nil(0), get_nil(3), proceed, label(3), trust_me_else_fail, label(4), allocate(5), get_variable(y(1),1), get_variable(y(2),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_list(3), unify_variable(x(3)), unify_variable(y(3)), get_variable(y(4),4), put_value(y(1),1), put_value(y(2),2), call(format_arg/4), cut(y(4)), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), put_value(y(3),3), deallocate, execute(format_arg_lst/4)]). predicate(format_arg/4,129,static,private,user,[ try_me_else(1), get_variable(x(4),2), get_variable(x(2),1), get_variable(x(1),0), call_c('Blt_Var',[fast_call,boolean],[x(1)]), put_value(x(4),0), execute(add_var_to_dico/4), label(1), retry_me_else(2), get_variable(x(1),0), put_value(x(3),0), execute(no_internal_transf/2), label(2), retry_me_else(3), get_nil(0), get_atom(nil,3), proceed, label(3), retry_me_else(4), get_structure(atm/1,3), unify_local_value(x(0)), call_c('Blt_Atom',[fast_call,boolean],[x(0)]), proceed, label(4), retry_me_else(5), get_structure(int/1,3), unify_local_value(x(0)), call_c('Blt_Integer',[fast_call,boolean],[x(0)]), proceed, label(5), retry_me_else(6), get_structure(flt/1,3), unify_local_value(x(0)), call_c('Blt_Float',[fast_call,boolean],[x(0)]), proceed, label(6), trust_me_else_fail, get_variable(x(4),0), get_structure(stc/3,3), unify_variable(x(0)), unify_variable(x(5)), unify_variable(x(3)), call_c('Blt_Functor',[fast_call,boolean],[x(4),x(0),x(5)]), put_list(5), unify_void(1), unify_variable(x(0)), call_c('Blt_Univ',[fast_call,boolean],[x(4),x(5)]), execute(format_arg_lst/4)]). predicate(no_internal_transf/2,162,static,private,user,[ put_atom('$no_internal_tranf$',2), put_integer(1,3), call_c('Blt_Functor',[fast_call,boolean],[x(1),x(2),x(3)]), put_integer(1,2), call_c('Blt_Arg',[fast_call,boolean],[x(2),x(1),x(0)]), proceed]). predicate(add_var_to_dico/4,176,static,private,user,[ load_cut_level(4), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(4)), get_structure(var/2,3), unify_void(2), get_list(0), unify_variable(x(0)), unify_void(1), get_structure(v/4,0), unify_local_value(x(1)), unify_local_value(x(2)), unify_void(1), unify_local_value(x(3)), proceed, label(1), trust_me_else_fail, switch_on_term(3,fail,fail,2,fail), label(2), try(4), trust(6), label(3), try_me_else(5), label(4), get_variable(x(6),1), get_list(0), unify_variable(x(0)), unify_void(1), get_structure(v/4,0), unify_variable(x(0)), unify_variable(x(1)), unify_variable(x(5)), unify_local_value(x(3)), call_c('Blt_Term_Eq',[fast_call,boolean],[x(0),x(6)]), cut(x(4)), get_structure(var/2,3), unify_variable(x(0)), unify_void(1), get_atom(f,5), execute('$add_var_to_dico/4_$aux1'/3), label(5), trust_me_else_fail, label(6), get_list(0), unify_void(1), unify_variable(x(0)), execute(add_var_to_dico/4)]). predicate('$add_var_to_dico/4_$aux1'/3,181,static,private,user,[ load_cut_level(3), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), call_c('Blt_Term_Neq',[fast_call,boolean],[x(1),x(2)]), math_fast_load_value(x(2),1), put_integer(1,2), call_c('Blt_Fast_Gt',[fast_call,boolean],[x(1),x(2)]), cut(x(3)), get_structure(y/1,0), unify_void(1), proceed, label(1), trust_me_else_fail, proceed]). predicate(classif_vars/3,198,static,private,user,[ load_cut_level(3), switch_on_term(2,3,fail,1,fail), label(1), try(5), trust(7), label(2), try_me_else(4), label(3), get_nil(0), get_value(x(2),1), cut(x(3)), proceed, label(4), retry_me_else(6), label(5), allocate(3), get_variable(y(1),1), get_variable(y(2),2), get_list(0), unify_variable(x(0)), unify_variable(y(0)), get_structure(v/4,0), unify_void(2), unify_variable(x(0)), unify_structure(var/2), unify_variable(x(1)), unify_void(1), call_c('Blt_Var',[fast_call,boolean],[x(1)]), cut(x(3)), call('$classif_vars/3_$aux1'/2), put_value(y(0),0), put_value(y(1),1), put_value(y(2),2), deallocate, execute(classif_vars/3), label(6), trust_me_else_fail, label(7), get_list(0), unify_variable(x(3)), unify_variable(x(0)), get_structure(v/4,3), unify_void(3), unify_structure(var/2), unify_variable(x(3)), unify_void(1), get_structure(y/1,3), unify_local_value(x(1)), math_fast_load_value(x(1),1), call_c('Fct_Fast_Inc',[fast_call,x(1)],[x(1)]), execute(classif_vars/3)]). predicate('$classif_vars/3_$aux1'/2,201,static,private,user,[ load_cut_level(2), try_me_else(1), call_c('Blt_Var',[fast_call,boolean],[x(0)]), cut(x(2)), get_structure(x/1,1), unify_atom(void), proceed, label(1), trust_me_else_fail, get_structure(x/1,1), unify_void(1), proceed]). predicate(inline_predicate/2,220,static,private,user,[ put_atom(inline,3), put_variable(x(2),4), call_c('Blt_G_Read',[fast_call,boolean],[x(3),x(4)]), execute(inline_predicate/3)]). predicate(inline_predicate/3,227,static,private,user,[ switch_on_term(4,1,fail,fail,fail), label(1), switch_on_atom([('$get_cut_level',5), ('$cut',7), ((=),9), ('$foreign_call_c',11), (var,13), (nonvar,15), (atom,17), (integer,19), (float,21), (number,23), (atomic,25), (compound,27), (callable,29), (list,31), (partial_list,33), (list_or_partial_list,35), (fd_var,37), (non_fd_var,39), (generic_var,41), (non_generic_var,43), (functor,45), (arg,47), (compare,49), ((=..),51), ((==),53), ((\==),55), ((@<),57), ((@=<),59), ((@>),61), ((@>=),63), ((is),65), ((=:=),67), ((=\=),69), ((<),71), ((=<),73), ((>),75), ((>=),77), (g_assign,79), (g_assignb,81), (g_link,83), (g_read,85), (g_array_size,87), (g_inc,2), (g_inco,91), (g_dec,3), (g_deco,99), (g_set_bit,105), (g_reset_bit,107), (g_test_set_bit,109), (g_test_reset_bit,111)]), label(2), try(89), retry(93), trust(95), label(3), try(97), retry(101), trust(103), label(4), try_me_else(6), label(5), get_atom('$get_cut_level',0), get_integer(1,1), proceed, label(6), retry_me_else(8), label(7), get_atom('$cut',0), get_integer(1,1), proceed, label(8), retry_me_else(10), label(9), get_atom(=,0), get_integer(2,1), proceed, label(10), retry_me_else(12), label(11), get_atom('$foreign_call_c',0), get_integer(1,1), proceed, label(12), retry_me_else(14), label(13), get_atom(var,0), get_integer(1,1), get_atom(t,2), proceed, label(14), retry_me_else(16), label(15), get_atom(nonvar,0), get_integer(1,1), get_atom(t,2), proceed, label(16), retry_me_else(18), label(17), get_atom(atom,0), get_integer(1,1), get_atom(t,2), proceed, label(18), retry_me_else(20), label(19), get_atom(integer,0), get_integer(1,1), get_atom(t,2), proceed, label(20), retry_me_else(22), label(21), get_atom(float,0), get_integer(1,1), get_atom(t,2), proceed, label(22), retry_me_else(24), label(23), get_atom(number,0), get_integer(1,1), get_atom(t,2), proceed, label(24), retry_me_else(26), label(25), get_atom(atomic,0), get_integer(1,1), get_atom(t,2), proceed, label(26), retry_me_else(28), label(27), get_atom(compound,0), get_integer(1,1), get_atom(t,2), proceed, label(28), retry_me_else(30), label(29), get_atom(callable,0), get_integer(1,1), get_atom(t,2), proceed, label(30), retry_me_else(32), label(31), get_atom(list,0), get_integer(1,1), get_atom(t,2), proceed, label(32), retry_me_else(34), label(33), get_atom(partial_list,0), get_integer(1,1), get_atom(t,2), proceed, label(34), retry_me_else(36), label(35), get_atom(list_or_partial_list,0), get_integer(1,1), get_atom(t,2), proceed, label(36), retry_me_else(38), label(37), get_atom(fd_var,0), get_integer(1,1), get_atom(t,2), proceed, label(38), retry_me_else(40), label(39), get_atom(non_fd_var,0), get_integer(1,1), get_atom(t,2), proceed, label(40), retry_me_else(42), label(41), get_atom(generic_var,0), get_integer(1,1), get_atom(t,2), proceed, label(42), retry_me_else(44), label(43), get_atom(non_generic_var,0), get_integer(1,1), get_atom(t,2), proceed, label(44), retry_me_else(46), label(45), get_atom(functor,0), get_integer(3,1), get_atom(t,2), proceed, label(46), retry_me_else(48), label(47), get_atom(arg,0), get_integer(3,1), get_atom(t,2), proceed, label(48), retry_me_else(50), label(49), get_atom(compare,0), get_integer(3,1), get_atom(t,2), proceed, label(50), retry_me_else(52), label(51), get_atom(=..,0), get_integer(2,1), get_atom(t,2), proceed, label(52), retry_me_else(54), label(53), get_atom(==,0), get_integer(2,1), get_atom(t,2), proceed, label(54), retry_me_else(56), label(55), get_atom(\==,0), get_integer(2,1), get_atom(t,2), proceed, label(56), retry_me_else(58), label(57), get_atom(@<,0), get_integer(2,1), get_atom(t,2), proceed, label(58), retry_me_else(60), label(59), get_atom(@=<,0), get_integer(2,1), get_atom(t,2), proceed, label(60), retry_me_else(62), label(61), get_atom(@>,0), get_integer(2,1), get_atom(t,2), proceed, label(62), retry_me_else(64), label(63), get_atom(@>=,0), get_integer(2,1), get_atom(t,2), proceed, label(64), retry_me_else(66), label(65), get_atom(is,0), get_integer(2,1), get_atom(t,2), proceed, label(66), retry_me_else(68), label(67), get_atom(=:=,0), get_integer(2,1), get_atom(t,2), proceed, label(68), retry_me_else(70), label(69), get_atom(=\=,0), get_integer(2,1), get_atom(t,2), proceed, label(70), retry_me_else(72), label(71), get_atom(<,0), get_integer(2,1), get_atom(t,2), proceed, label(72), retry_me_else(74), label(73), get_atom(=<,0), get_integer(2,1), get_atom(t,2), proceed, label(74), retry_me_else(76), label(75), get_atom(>,0), get_integer(2,1), get_atom(t,2), proceed, label(76), retry_me_else(78), label(77), get_atom(>=,0), get_integer(2,1), get_atom(t,2), proceed, label(78), retry_me_else(80), label(79), get_atom(g_assign,0), get_integer(2,1), get_atom(t,2), proceed, label(80), retry_me_else(82), label(81), get_atom(g_assignb,0), get_integer(2,1), get_atom(t,2), proceed, label(82), retry_me_else(84), label(83), get_atom(g_link,0), get_integer(2,1), get_atom(t,2), proceed, label(84), retry_me_else(86), label(85), get_atom(g_read,0), get_integer(2,1), get_atom(t,2), proceed, label(86), retry_me_else(88), label(87), get_atom(g_array_size,0), get_integer(2,1), get_atom(t,2), proceed, label(88), retry_me_else(90), label(89), get_atom(g_inc,0), get_integer(1,1), get_atom(t,2), proceed, label(90), retry_me_else(92), label(91), get_atom(g_inco,0), get_integer(2,1), get_atom(t,2), proceed, label(92), retry_me_else(94), label(93), get_atom(g_inc,0), get_integer(2,1), get_atom(t,2), proceed, label(94), retry_me_else(96), label(95), get_atom(g_inc,0), get_integer(3,1), get_atom(t,2), proceed, label(96), retry_me_else(98), label(97), get_atom(g_dec,0), get_integer(1,1), get_atom(t,2), proceed, label(98), retry_me_else(100), label(99), get_atom(g_deco,0), get_integer(2,1), get_atom(t,2), proceed, label(100), retry_me_else(102), label(101), get_atom(g_dec,0), get_integer(2,1), get_atom(t,2), proceed, label(102), retry_me_else(104), label(103), get_atom(g_dec,0), get_integer(3,1), get_atom(t,2), proceed, label(104), retry_me_else(106), label(105), get_atom(g_set_bit,0), get_integer(2,1), get_atom(t,2), proceed, label(106), retry_me_else(108), label(107), get_atom(g_reset_bit,0), get_integer(2,1), get_atom(t,2), proceed, label(108), retry_me_else(110), label(109), get_atom(g_test_set_bit,0), get_integer(2,1), get_atom(t,2), proceed, label(110), trust_me_else_fail, label(111), get_atom(g_test_reset_bit,0), get_integer(2,1), get_atom(t,2), proceed]). ./gprolog-1.3.0/src/Pl2Wam/whole.pl0000644004425400513100000000046010547162441015341 0ustar diazloco/* $Id: whole.pl,v 1.5 2003/06/05 10:00:35 diaz Exp $ */ :- include(read_file). :- include(bip_list). :- include(syn_sugar). :- include(internal). :- include(code_gen). :- include(reg_alloc). :- include(inst_codif). :- include(first_arg). :- include(indexing). :- include(wam_emit). :- include(pl2wam). ./gprolog-1.3.0/src/Pl2Wam/make_bip_list.pl0000644004425400513100000000505710547162440017033 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog to WAM compiler * * File : make_bip_list.pl * * Descr.: bip file generator * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: make_bip_list.pl,v 1.13 2007/01/04 10:34:06 diaz Exp $ */ q :- set_prolog_flag(strict_iso, off), write('/* this file is automatically generated by make_bip_list.pl */'), nl, set_prolog_flag(strict_iso, off), pl_bips, fd_bips, halt. pl_bips :- findall(F - P, enum(built_in, P, F), L), keysort(L, L1), display_bips(L1, false). fd_bips :- findall(F - P, enum(built_in_fd, P, F), L), keysort(L, L1), display_bips(L1, false). enum(Prop, P, F) :- current_predicate(P), predicate_property(P, Prop), predicate_property(P, prolog_file(F)). display_bips([], _). display_bips([F - P|L], F0) :- treat_file(F, F0), P = Func / Arity, format('bip(~q,~d).~n', [Func, Arity]), display_bips(L, F). treat_file(X, X) :- !. treat_file(New, _) :- format('~n%% defined in ~a~n~n', [New]). :- initialization(q). ./gprolog-1.3.0/src/DOSSETVARS.BAT0000755004425400513100000000022607404702424014613 0ustar diazlocoSET A=C:\cygwin\home\diaz\GP\src\src SET PATH=%A%\TopComp;%A%\EnginePl;%A%\Pl2Wam;%A%\Wam2Ma;%A%\Ma2Asm;%A%\Fd2C;%A%\DevUtils;%A%\W32GUICons;%PATH% ./gprolog-1.3.0/src/TopComp/0000777004425400513100000000000010547442376014161 5ustar diazloco./gprolog-1.3.0/src/TopComp/top_comp.c0000644004425400513100000011204710547154143016136 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog Compiler * * File : top_comp.c * * Descr.: compiler main (shell) program * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: top_comp.c,v 1.17 2007/01/04 10:35:15 diaz Exp $ */ #include "../EnginePl/gp_config.h" #include #include #include #include #include #include #include #include #ifdef _WIN32 #include #include #include #include #else #include #include #include #include #endif #include "../EnginePl/wam_regs.h" #include "decode_hexa.c" #include "copying.c" #include "prolog_path.c" #include "../EnginePl/machine1.c" #if 0 #define DEBUG #endif /*---------------------------------* * Constants * *---------------------------------*/ #define CMD_LINE_MAX_OPT 4096 #define CMD_LINE_LENGTH (MAXPATHLEN + CMD_LINE_MAX_OPT + 1) #define TEMP_FILE_PREFIX GPLC #define OBJ_FILE_ALL_PL_BIPS "all_pl_bips" #define OBJ_FILE_ALL_FD_BIPS "all_fd_bips" #define OBJ_FILE_TOP_LEVEL "top_level" #define OBJ_FILE_DEBUGGER "debugger" #define EXE_FILE_PL2WAM "pl2wam" #define EXE_FILE_WAM2MA "wam2ma" #define EXE_FILE_MA2ASM "ma2asm" #define EXE_FILE_ASM AS #define EXE_FILE_FD2C "fd2c" #define EXE_FILE_CC CC #define EXE_FILE_LINK CC #define EXE_FILE_STRIP STRIP #define FILE_PL 0 #define FILE_WAM 1 #define FILE_MA 2 #define FILE_ASM 3 #define FILE_OBJ 4 #define FILE_FD 5 #define FILE_C 6 #define FILE_LINK 7 #define LINK_OPTION 8 #define PL_SUFFIX ".pl" #define PL_SUFFIX_ALTERNATE ".pro" #define WAM_SUFFIX ".wam" #define WBC_SUFFIX ".wbc" #define MA_SUFFIX ".ma" #define FD_SUFFIX ".fd" #define C_SUFFIX ".c" #define C_SUFFIX_ALTERNATE "|.C|.cc|.CC|.cxx|.CXX|.c++|.C++|.cpp|.CPP|" #define CC_COMPILE_OPT "-c " #define CC_INCLUDE_OPT "-I" /*---------------------------------* * Type Definitions * *---------------------------------*/ typedef struct { char *name; char *suffix; char *file_part; int type; char *work_name1; char *work_name2; } FileInf; typedef struct { char *exe_name; char opt[CMD_LINE_MAX_OPT]; char *out_opt; } CmdInf; /*---------------------------------* * Global Variables * *---------------------------------*/ char *start_path; int devel_mode = 0; char *devel_dir[] = { "EnginePl", "BipsPl", "EngineFD", "BipsFD", "Linedit", "W32GUICons", NULL }; FileInf *file_lopt; int nb_file_lopt = 0; int stop_after = FILE_LINK; int verbose = 0; char *file_name_out = NULL; int def_local_size = -1; int def_global_size = -1; int def_trail_size = -1; int def_cstr_size = -1; int fixed_sizes = 0; int needs_stack_file = 0; int bc_mode = 0; int gui_console = 0; int no_top_level = 0; int min_pl_bips = 0; int min_fd_bips = 0; int no_debugger = 0; int no_pl_lib = 0; int no_fd_lib = 0; int strip = 0; int no_decode_hex = 0; char warn_str[1024] = ""; char *temp_dir = NULL; int no_del_temp_files = 0; CmdInf cmd_pl2wam = { EXE_FILE_PL2WAM, " ", "-o " }; CmdInf cmd_wam2ma = { EXE_FILE_WAM2MA, " ", "-o " }; CmdInf cmd_ma2asm = { EXE_FILE_MA2ASM, " ", "-o " }; CmdInf cmd_asm = { EXE_FILE_ASM, " ", "-o " }; CmdInf cmd_fd2c = { EXE_FILE_FD2C, " ", "-o " }; CmdInf cmd_cc = { EXE_FILE_CC, " ", CC_OBJ_NAME_OPT }; CmdInf cmd_link = { EXE_FILE_LINK, " ", CC_EXE_NAME_OPT }; char *cc_fd2c_flags = CFLAGS " "; char *suffixes[] = { PL_SUFFIX, WAM_SUFFIX, MA_SUFFIX, ASM_SUFFIX, OBJ_SUFFIX, FD_SUFFIX, C_SUFFIX, NULL }; /*---------------------------------* * Function Prototypes * *---------------------------------*/ char *Search_Path(char *file); void Determine_Pathnames(void); void Compile_Files(void); void Create_Output_File_Name(FileInf *f, char *buff); void New_Work_File(FileInf *f, int stage, int stop_after); void Free_Work_File2(FileInf *f); void Compile_Cmd(CmdInf *c, FileInf *f); void Link_Cmd(void); void Exec_One_Cmd(char *str, int no_decode_hex); int Spawn_Decode_Hex(char *arg[]); void Delete_Temp_File(char *name); void Find_File(char *file, char *suff, char *file_path); void Fatal_Error(char *format, ...); void Parse_Arguments(int argc, char *argv[]); void Display_Help(void); #define Record_Link_Warn_Option(i) \ sprintf(warn_str + strlen(warn_str), "%s ", argv[i]) #define Before_Cmd(cmd) \ if (verbose) \ fprintf(stderr, "%s\n", cmd) #define After_Cmd(error) \ if (error) \ Fatal_Error("compilation failed") char *last_opt; #define Check_Arg(i, str) (last_opt = str, strncmp(argv[i], str, strlen(argv[i])) == 0) #define Add_Last_Option(opt) sprintf(opt + strlen(opt), "%s ", last_opt) #define Add_Option(i, opt) sprintf(opt + strlen(opt), "%s ", argv[i]) /*-------------------------------------------------------------------------* * MAIN * * * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { char **pdev; #ifdef _WIN32 setbuf(stdout, NULL); setbuf(stderr, NULL); #endif file_lopt = (FileInf *) calloc(argc + 1, sizeof(FileInf)); if (file_lopt == NULL) Fatal_Error("memory allocation fault"); Parse_Arguments(argc, argv); if (verbose) fprintf(stderr, "\n"); start_path = Get_Prolog_Path(&devel_mode); if (start_path == NULL) Fatal_Error("cannot find the path for %s, set environment variable %s", PROLOG_NAME, ENV_VARIABLE); strcat(cmd_cc.opt, CFLAGS_MACHINE " " CFLAGS_REGS CC_COMPILE_OPT); if (devel_mode) for (pdev = devel_dir; *pdev; pdev++) sprintf(cmd_cc.opt + strlen(cmd_cc.opt), "%s%s" DIR_SEP_S "%s ", CC_INCLUDE_OPT, start_path, *pdev); else sprintf(cmd_cc.opt + strlen(cmd_cc.opt), "%s%s" DIR_SEP_S "include ", CC_INCLUDE_OPT, start_path); strcat(cmd_link.opt, LDFLAGS " "); if (verbose) fprintf(stderr, "Path used: %s %s\n", start_path, (devel_mode) ? "(development mode)" : ""); Compile_Files(); return 0; } /*-------------------------------------------------------------------------* * COMPILE_FILES * * * *-------------------------------------------------------------------------*/ void Compile_Files(void) { FileInf *f; int stage; int stage_end; int l; FILE *fd; if (stop_after < FILE_LINK) { if (*warn_str) fprintf(stderr, "link not done - ignored option(s): %s\n", warn_str); stage_end = stop_after; needs_stack_file = 0; if (bc_mode) { suffixes[FILE_WAM] = WBC_SUFFIX; strcat(cmd_pl2wam.opt, "--wam-for-byte-code "); } } else stage_end = FILE_ASM; if (needs_stack_file) { f = file_lopt + nb_file_lopt; f->work_name2 = NULL; New_Work_File(f, FILE_WAM, 10000); /* to create work_name2 */ f->name = f->work_name2; f->suffix = f->name + strlen(f->name) - strlen(suffixes[FILE_MA]); f->type = FILE_MA; f->work_name1 = f->name, f->work_name2 = NULL; if (verbose) fprintf(stderr, "creating stack size file: %s\n", f->name); if ((fd = fopen(f->name, "wt")) == NULL) Fatal_Error("cannot open stack size file (%s)", f->name); if (def_local_size >= 0) fprintf(fd, "long global def_local_size = %d\n", def_local_size); if (def_global_size >= 0) fprintf(fd, "long global def_global_size = %d\n", def_global_size); if (def_trail_size >= 0) fprintf(fd, "long global def_trail_size = %d\n", def_trail_size); if (def_cstr_size >= 0) fprintf(fd, "long global def_cstr_size = %d\n", def_cstr_size); if (fixed_sizes) fprintf(fd, "long global fixed_sizes = 1\n"); fclose(fd); } if (verbose) fprintf(stderr, "\n*** Compiling\n"); for (f = file_lopt; f->name; f++) { if (f->type == LINK_OPTION) continue; if (verbose && (f->type == FILE_FD || f->type == FILE_C || f->type <= stage_end)) fprintf(stderr, "\n--- file: %s\n", f->name); if (f->type == FILE_FD && stop_after >= FILE_ASM) { stage = FILE_FD; /* to generate the correct C suffix */ New_Work_File(f, stage, (stop_after == FILE_FD) ? stop_after : 10000); Compile_Cmd(&cmd_fd2c, f); if (stop_after != FILE_FD) { stage = FILE_ASM; /* to generate the correct obj suffix */ New_Work_File(f, stage, stop_after); l = strlen(cmd_cc.opt); /* add fd2c C options */ strcpy(cmd_cc.opt + l, cc_fd2c_flags); Compile_Cmd(&cmd_cc, f); cmd_cc.opt[l] = '\0'; /* remove them */ } goto free_work_file; } if (f->type == FILE_C && stop_after >= FILE_ASM && stop_after != FILE_FD) { stage = FILE_ASM; /* to generate the correct obj suffix */ New_Work_File(f, stage, stop_after); Compile_Cmd(&cmd_cc, f); goto free_work_file; } if (f->type == FILE_FD || f->type == FILE_C || stop_after == FILE_FD || f->type > stop_after) { fprintf(stderr, "unused input file: %s\n", f->name); continue; } for (stage = f->type; stage <= stage_end; stage++) { New_Work_File(f, stage, stop_after); switch (stage) { case FILE_PL: Compile_Cmd(&cmd_pl2wam, f); break; case FILE_WAM: Compile_Cmd(&cmd_wam2ma, f); break; case FILE_MA: Compile_Cmd(&cmd_ma2asm, f); if (needs_stack_file && f == file_lopt + nb_file_lopt && !no_del_temp_files) { if (verbose) fprintf(stderr, "deleting stack size file\n"); Delete_Temp_File(f->name); } break; case FILE_ASM: Compile_Cmd(&cmd_asm, f); break; } } free_work_file: Free_Work_File2(f); /* to suppress last useless temp file */ } if (stop_after < FILE_LINK) return; if (verbose) fprintf(stderr, "\n*** Linking\n\n"); Link_Cmd(); /* removing temp files after link */ for (f = file_lopt; f->name; f++) if (f->work_name1 != f->name) /* also ok if f->type == LINK_OPTION */ Delete_Temp_File(f->work_name1); } /*-------------------------------------------------------------------------* * CREATE_OUTPUT_FILE_NAME * * * *-------------------------------------------------------------------------*/ void Create_Output_File_Name(FileInf *f, char *buff) { char *p; int l; static int counter = 0; for(p = file_name_out; *p; p++) { if (*p != '%') *buff++ = *p; else switch(* ++p) { case 'd': /* %d = the directory part */ strcpy(buff, f->name); l = f->file_part - f->name; buff += l; break; case 'f': /* %f = the whole file name */ strcpy(buff, f->name); buff += strlen(buff); break; case 'F': /* %F = the whole file name (without dir) */ strcpy(buff, f->file_part); buff += strlen(buff); break; case 'p': /* %p = the prefix file name */ strcpy(buff, f->name); l = f->suffix - f->name; buff += l; break; case 'P': /* %P = the prefix file name (without dir) */ strcpy(buff, f->file_part); l = f->suffix - f->file_part; buff += l; break; case 's': /* %s = the suffix */ strcpy(buff, f->suffix); buff += strlen(buff); break; case 'c': /* %c = a counter */ sprintf(buff, "%d", ++counter); buff += strlen(buff); break; default: *buff++ = '%'; /* no special % sequence */ *buff++ = *p; } } *buff = '\0'; } /*-------------------------------------------------------------------------* * NEW_WORK_FILE * * * *-------------------------------------------------------------------------*/ void New_Work_File(FileInf *f, int stage, int stop_after) { static char buff[MAXPATHLEN]; char *p; if (stage < stop_after) /* intermediate stage */ { p = M_Tempnam(temp_dir, TEMP_FILE_PREFIX); sprintf(buff, "%s%s", p, suffixes[stage + 1]); free(p); } else /* final stage */ if (file_name_out) /* specified output filename */ Create_Output_File_Name(f, buff); else { strcpy(buff, f->name); strcpy(buff + (f->suffix - f->name), suffixes[stage + 1]); } Free_Work_File2(f); f->work_name2 = strdup(buff); } /*-------------------------------------------------------------------------* * FREE_WORK_FILE2 * * * *-------------------------------------------------------------------------*/ void Free_Work_File2(FileInf *f) { if (f->work_name2 != NULL) { if (f->work_name1 != f->name) Delete_Temp_File(f->work_name1); f->work_name1 = f->work_name2; } } /*-------------------------------------------------------------------------* * COMPILE_CMD * * * *-------------------------------------------------------------------------*/ void Compile_Cmd(CmdInf *c, FileInf *f) { static char buff[CMD_LINE_LENGTH]; sprintf(buff, "%s%s%s%s %s", c->exe_name, c->opt, c->out_opt, f->work_name2, f->work_name1); Exec_One_Cmd(buff, 1); } /*-------------------------------------------------------------------------* * LINK_CMD * * * *-------------------------------------------------------------------------*/ void Link_Cmd(void) { static char file_out[MAXPATHLEN]; static char buff[CMD_LINE_LENGTH]; FileInf *f; int has_gui_console = 0; if (file_name_out == NULL) file_name_out = "%p"; /* will reuse first file name */ for (f = file_lopt; f->type == LINK_OPTION; f++) ; /* use first file name by default */ Create_Output_File_Name(f, file_out); file_name_out = file_out; /* with MSVC: if at run-time we don't find cl.exe we use link.exe * it is a workaround for users who have installed a binary version * (from a setup.exe) compiled with cl.exe but who don't have cl.exe */ #ifdef _MSC_VER { char *dont_care; if (SearchPath(NULL, cmd_link.exe_name, ".exe", CMD_LINE_LENGTH, buff, &dont_care) && getenv("USE_LINKER") == NULL) #endif sprintf(buff, "%s%s%s%s ", cmd_link.exe_name, cmd_link.opt, cmd_link.out_opt, file_name_out); #ifdef _MSC_VER else { if (verbose) printf("%s.exe not found ! we use link.exe\n", cmd_link.exe_name); sprintf(buff, "link /nologo /stack:8000000 /out:%s ", file_name_out); } } #endif /* f->work_name1 is OK for LINK_OPTION */ for (f = file_lopt; f->name; f++) sprintf(buff + strlen(buff), "%s ", f->work_name1); if (!min_pl_bips) { Find_File(OBJ_FILE_ALL_PL_BIPS, OBJ_SUFFIX, buff + strlen(buff)); strcat(buff, " "); } #ifndef NO_USE_FD_SOLVER if (!min_fd_bips) { Find_File(OBJ_FILE_ALL_FD_BIPS, OBJ_SUFFIX, buff + strlen(buff)); strcat(buff, " "); } #endif if (!no_top_level) { Find_File(OBJ_FILE_TOP_LEVEL, OBJ_SUFFIX, buff + strlen(buff)); strcat(buff, " "); } if (!no_debugger) { Find_File(OBJ_FILE_DEBUGGER, OBJ_SUFFIX, buff + strlen(buff)); strcat(buff, " "); } #ifndef NO_USE_FD_SOLVER if (!no_fd_lib) { Find_File(LIB_BIPS_FD, "", buff + strlen(buff)); strcat(buff, " "); Find_File(LIB_ENGINE_FD, "", buff + strlen(buff)); strcat(buff, " "); } #endif if (!no_pl_lib) { Find_File(LIB_BIPS_PL, "", buff + strlen(buff)); strcat(buff, " "); } Find_File(LIB_ENGINE_PL, "", buff + strlen(buff)); strcat(buff, " "); #ifndef NO_USE_LINEDIT Find_File(LIB_LINEDIT, "", buff + strlen(buff)); strcat(buff, " "); #endif strcat(buff, LDLIBS " "); if (!no_pl_lib && gui_console) { /* modify Linedit/Makefile.in to follow this list of ld objects */ Find_File("w32gc_interf", OBJ_SUFFIX, buff + strlen(buff)); strcat(buff, " "); has_gui_console = 1; } #ifdef _MSC_VER if (*buff != 'l' && *buff != 'L') /* it is not link.exe ! */ strcat(buff, "/link "); strcat(buff, "/ignore:4089 "); if (!has_gui_console) strcat(buff, "/subsystem:console "); #endif Exec_One_Cmd(buff, no_decode_hex); if (strip && *EXE_FILE_STRIP != ':' && *EXE_FILE_STRIP != '\0') { sprintf(buff, "%s %s%s", EXE_FILE_STRIP, file_name_out, EXE_SUFFIX); Exec_One_Cmd(buff, 1); } } /*-------------------------------------------------------------------------* * EXEC_ONE_CMD * * * *-------------------------------------------------------------------------*/ void Exec_One_Cmd(char *cmd, int no_decode_hex) { #if 1 int status; static char *arg[2] = { NULL, (char *) 1 }; arg[0] = cmd; Before_Cmd(cmd); if (no_decode_hex == 1) status = M_Spawn(arg); else status = Spawn_Decode_Hex(arg); if (status == -1) { fprintf(stderr, "error trying to execute "); perror(arg[0]); } if (status == -2) fprintf(stderr, "error trying to execute %s: unknown error", arg[0]); After_Cmd(status); #else int status; Before_Cmd(cmd); #ifdef DEBUG fprintf(stderr, "executing system() for: %s\n", cmd); #endif status = system(cmd); status >>= 8; if (status == -1 || status == 127) Fatal_Error("error trying to execute %s", cmd); After_Cmd(status); #endif } /*-------------------------------------------------------------------------* * SPAWN_DECODE_HEX * * * *-------------------------------------------------------------------------*/ int Spawn_Decode_Hex(char *arg[]) { int pid, status; FILE *f_out; static char buff[CMD_LINE_LENGTH]; pid = M_Spawn_Redirect(arg, 0, NULL, &f_out, &f_out); if (pid == -1 || pid == -2) return pid; for (;;) { fgets(buff, sizeof(buff), f_out); if (feof(f_out)) break; #ifndef DEBUG fputs(Decode_Hexa(buff, "predicate(%s)", 1, 1), stderr); #else fprintf(stderr, "piped line:%s", Decode_Hexa(buff, "predicate(%s)", 1, 1)); #endif } if (fclose(f_out)) return -1; status = M_Get_Status(pid); #ifdef DEBUG fprintf(stderr, "error status: %d\n", status); #endif return status; } /*-------------------------------------------------------------------------* * DELETE_TEMP_FILE * * * *-------------------------------------------------------------------------*/ void Delete_Temp_File(char *name) { if (no_del_temp_files) return; #if 1 if (verbose) fprintf(stderr, "delete %s\n", name); #endif unlink(name); } /*-------------------------------------------------------------------------* * FIND_FILE * * * *-------------------------------------------------------------------------*/ void Find_File(char *file, char *suff, char *file_path) { char name[MAXPATHLEN]; char **pdev; sprintf(name, "%s%s", file, suff); if (!devel_mode) { sprintf(file_path, "%s" DIR_SEP_S "lib" DIR_SEP_S "%s", start_path, name); if (access(file_path, F_OK) == 0) return; } else for (pdev = devel_dir; *pdev; pdev++) { sprintf(file_path, "%s" DIR_SEP_S "%s" DIR_SEP_S "%s", start_path, *pdev, name); if (access(file_path, F_OK) == 0) return; } Fatal_Error("cannot locate file %s", name); } /*-------------------------------------------------------------------------* * FATAL_ERROR * * * *-------------------------------------------------------------------------*/ void Fatal_Error(char *format, ...) { FileInf *f; va_list arg_ptr; va_start(arg_ptr, format); vfprintf(stderr, format, arg_ptr); va_end(arg_ptr); fprintf(stderr, "\n"); if (no_del_temp_files) exit(1); if (verbose) fprintf(stderr, "deleting temporary files before exit\n"); for (f = file_lopt; f->name; f++) { /* also ok if f->type == LINK_OPTION */ if (f->work_name1 && f->work_name1 != f->name && (file_name_out == NULL || strcasecmp(f->work_name1, file_name_out) != 0)) Delete_Temp_File(f->work_name1); if (f->work_name2 && f->work_name2 != f->name && (file_name_out == NULL || strcasecmp(f->work_name2, file_name_out) != 0)) Delete_Temp_File(f->work_name2); } exit(1); } /*-------------------------------------------------------------------------* * PARSE_ARGUMENTS * * * *-------------------------------------------------------------------------*/ void Parse_Arguments(int argc, char *argv[]) { int i, file_name_out_i; char **p, *q; FileInf *f = file_lopt; int nb_file = 0; for (i = 1; i < argc; i++) { if (*argv[i] == '-' && argv[i][1] != '\0') { if (Check_Arg(i, "-o") || Check_Arg(i, "--output")) { file_name_out_i = i; if (++i >= argc) Fatal_Error("FILE missing after %s option", last_opt); file_name_out = argv[i]; continue; } if (Check_Arg(i, "-W") || Check_Arg(i, "--wam-for-native")) { stop_after = FILE_PL; bc_mode = 0; continue; } if (Check_Arg(i, "-w") || Check_Arg(i, "--wam-for-byte-code")) { stop_after = FILE_PL; bc_mode = 1; continue; } if (Check_Arg(i, "-M") || Check_Arg(i, "--mini-assembly")) { stop_after = FILE_WAM; bc_mode = 0; continue; } if (Check_Arg(i, "-S") || Check_Arg(i, "--assembly")) { stop_after = FILE_MA; bc_mode = 0; continue; } if (Check_Arg(i, "-c") || Check_Arg(i, "--object")) { stop_after = FILE_ASM; bc_mode = 0; continue; } if (Check_Arg(i, "-F") || Check_Arg(i, "--fd-to-c")) { stop_after = FILE_FD; bc_mode = 0; continue; } if (Check_Arg(i, "--comment")) { Add_Last_Option(cmd_wam2ma.opt); Add_Last_Option(cmd_ma2asm.opt); continue; } if (Check_Arg(i, "--inline-asm") || Check_Arg(i, "--full-inline-asm")) { Add_Last_Option(cmd_ma2asm.opt); continue; } if (Check_Arg(i, "--temp-dir")) { if (++i >= argc) Fatal_Error("PATH missing after %s option", last_opt); temp_dir = argv[i]; continue; } if (Check_Arg(i, "--no-del-temp-files")) { no_del_temp_files = 1; continue; } if (Check_Arg(i, "--no-decode-hexa")) { no_decode_hex = 1; continue; } if (Check_Arg(i, "--version") || Check_Arg(i, "-v") || Check_Arg(i, "--verbose")) { Display_Copying("Prolog compiler"); if (Check_Arg(i, "--version")) exit(0); verbose = 1; continue; } if (Check_Arg(i, "-h") || Check_Arg(i, "--help")) { Display_Help(); exit(0); } if (Check_Arg(i, "--pl-state")) { if (++i >= argc) Fatal_Error("FILE missing after %s option", last_opt); if (access(argv[i], R_OK) != 0) { perror(argv[i]); exit(1); } Add_Last_Option(cmd_pl2wam.opt); last_opt = argv[i]; Add_Last_Option(cmd_pl2wam.opt); continue; } if (Check_Arg(i, "--no-susp-warn") || Check_Arg(i, "--no-singl-warn") || Check_Arg(i, "--no-redef-error") || Check_Arg(i, "--foreign-only") || Check_Arg(i, "--no-call-c") || Check_Arg(i, "--no-inline") || Check_Arg(i, "--no-reorder") || Check_Arg(i, "--no-reg-opt") || Check_Arg(i, "--min-reg-opt") || Check_Arg(i, "--no-opt-last-subterm") || Check_Arg(i, "--fast-math") || Check_Arg(i, "--keep-void-inst") || Check_Arg(i, "--compile-msg") || Check_Arg(i, "--statistics")) { Add_Last_Option(cmd_pl2wam.opt); continue; } if (Check_Arg(i, "--c-compiler")) { if (++i >= argc) Fatal_Error("FILE missing after %s option", last_opt); cmd_cc.exe_name = argv[i]; continue; } if (Check_Arg(i, "-C")) { if (++i >= argc) Fatal_Error("OPTION missing after %s option", last_opt); Add_Option(i, cmd_cc.opt); /* if C options specified do not take into account fd2c default C options */ cc_fd2c_flags = ""; continue; } if (Check_Arg(i, "-A")) { if (++i >= argc) Fatal_Error("OPTION missing after %s option", last_opt); Add_Option(i, cmd_asm.opt); continue; } if (Check_Arg(i, "--local-size")) { Record_Link_Warn_Option(i); if (++i >= argc) Fatal_Error("SIZE missing after %s option", last_opt); def_local_size = strtol(argv[i], &q, 10); if (*q || def_local_size < 0) Fatal_Error("invalid stack size (%s)", argv[i]); Record_Link_Warn_Option(i); needs_stack_file = 1; continue; } if (Check_Arg(i, "--global-size")) { Record_Link_Warn_Option(i); if (++i >= argc) Fatal_Error("SIZE missing after %s option", last_opt); def_global_size = strtol(argv[i], &q, 10); if (*q || def_global_size < 0) Fatal_Error("invalid stack size (%s)", argv[i]); Record_Link_Warn_Option(i); needs_stack_file = 1; continue; } if (Check_Arg(i, "--trail-size")) { Record_Link_Warn_Option(i); if (++i >= argc) Fatal_Error("SIZE missing after %s option", last_opt); def_trail_size = strtol(argv[i], &q, 10); if (*q || def_trail_size < 0) Fatal_Error("invalid stack size (%s)", argv[i]); Record_Link_Warn_Option(i); needs_stack_file = 1; continue; } if (Check_Arg(i, "--cstr-size")) { Record_Link_Warn_Option(i); if (++i >= argc) Fatal_Error("SIZE missing after %s option", last_opt); def_cstr_size = strtol(argv[i], &q, 10); if (*q || def_cstr_size < 0) Fatal_Error("invalid stack size (%s)", argv[i]); Record_Link_Warn_Option(i); needs_stack_file = 1; continue; } if (Check_Arg(i, "--fixed-sizes")) { Record_Link_Warn_Option(i); fixed_sizes = 1; needs_stack_file = 1; continue; } if (Check_Arg(i, "--no-top-level")) { Record_Link_Warn_Option(i); no_top_level = 1; no_debugger = 1; continue; } if (Check_Arg(i, "--gui-console")) { #ifdef W32_GUI_CONSOLE Record_Link_Warn_Option(i); gui_console = 1; #else fprintf(stderr, "Warning: Win32 GUI Console not available\n"); #endif continue; } if (Check_Arg(i, "--no-debugger")) { Record_Link_Warn_Option(i); no_debugger = 1; continue; } if (Check_Arg(i, "--min-pl-bips")) { Record_Link_Warn_Option(i); min_pl_bips = 1; continue; } if (Check_Arg(i, "--min-fd-bips")) { Record_Link_Warn_Option(i); min_fd_bips = 1; continue; } if (Check_Arg(i, "--min-bips") || Check_Arg(i, "--min-size")) { Record_Link_Warn_Option(i); no_top_level = no_debugger = min_pl_bips = min_fd_bips = 1; if (Check_Arg(i, "--min-size")) strip = 1; continue; } if (Check_Arg(i, "--no-pl-lib")) { Record_Link_Warn_Option(i); no_pl_lib = no_fd_lib = 1; no_top_level = no_debugger = min_pl_bips = min_fd_bips = 1; continue; } if (Check_Arg(i, "--no-fd-lib")) { Record_Link_Warn_Option(i); no_fd_lib = min_fd_bips = 1; continue; } if (Check_Arg(i, "-s") || Check_Arg(i, "--strip")) { Record_Link_Warn_Option(i); strip = 1; continue; } if (Check_Arg(i, "-L")) { Record_Link_Warn_Option(i); if (++i >= argc) Fatal_Error("OPTION missing after %s option", last_opt); Record_Link_Warn_Option(i); #if 0 Add_Option(i, cmd_link.opt); #else f->name = f->work_name1 = argv[i]; f->type = LINK_OPTION; nb_file_lopt++; f++; #endif continue; } Fatal_Error("unknown option %s - try %s --help", argv[i], GPLC); } f->name = argv[i]; if ((f->suffix = strrchr(argv[i], '.')) == NULL) f->suffix = argv[i] + strlen(argv[i]); for(q = f->suffix; q >= f->name; q--) if (*q == '/' #ifdef _WIN32 || *q == '\\' #endif ) break; f->file_part = q + 1; if (strcasecmp(PL_SUFFIX_ALTERNATE, f->suffix) == 0) f->type = FILE_PL; else if ((q = strstr(C_SUFFIX_ALTERNATE, f->suffix)) && q[-1] == '|' && q[strlen(f->suffix)] == '|') f->type = FILE_C; else { f->type = FILE_LINK; for (p = suffixes; *p; p++) if (strcasecmp(*p, f->suffix) == 0) { f->type = p - suffixes; break; } } f->work_name1 = f->name; f->work_name2 = NULL; if (f->type != FILE_LINK && access(f->name, R_OK) != 0) { perror(f->name); exit(1); } nb_file_lopt++; nb_file++; f++; } if (f == file_lopt) { if (verbose) exit(0); /* --verbose with no files same as --version */ else Fatal_Error("no input file specified"); } f->name = NULL; if (nb_file > 1 && stop_after < FILE_LINK && file_name_out && strchr(file_name_out, '%') == NULL) { fprintf(stderr, "named output file ignored with multiples output (or use meta-characters, e.g. %%p)\n"); Record_Link_Warn_Option(file_name_out_i); Record_Link_Warn_Option(file_name_out_i + 1); file_name_out = NULL; } } /*-------------------------------------------------------------------------* * DISPLAY_HELP * * * *-------------------------------------------------------------------------*/ void Display_Help(void) #define L(msg) fprintf(stderr, "%s\n", msg) { fprintf(stderr, "Usage: %s [OPTION]... FILE...\n", GPLC); L(" "); L("General options:"); L(" -o FILE, --output FILE set output file name (see below)"); L(" -W, --wam-for-native stop after producing WAM file(s)"); L(" -w, --wam-for-byte-code stop after producing WAM for byte-code file(s) (force --no-call-c)"); L(" -M, --mini-assembly stop after producing mini-assembly file(s)"); L(" -S, --assembly stop after producing assembly file(s)"); L(" -F, --fd-to-c stop after producing C file(s) from FD file(s)"); L(" -c, --object stop after producing object file(s)"); L(" --temp-dir PATH use PATH as directory for temporary files"); L(" --no-del-temp-files do not delete temporary files"); L(" --no-decode-hexa do not decode hexadecimal predicate names"); L(" -v, --verbose print executed commands"); L(" -h, --help print this help and exit"); L(" --version print version number and exit"); L(" "); L("Prolog to WAM compiler options:"); L(" --pl-state FILE read FILE to set the initial Prolog state"); L(" --no-susp-warn do not show warnings for suspicious predicates"); L(" --no-singl-warn do not show warnings for named singleton variables"); L(" --no-redef-error do not show errors for built-in redefinitions"); L(" --foreign-only only compile foreign/1-2 directives"); L(" --no-call-c do not allow the use of fd_tell, '$call_c',..."); L(" --no-inline do not inline predicates"); L(" --no-reorder do not reorder predicate arguments"); L(" --no-reg-opt do not optimize registers"); L(" --min-reg-opt minimally optimize registers"); L(" --no-opt-last-subterm do not optimize last subterm compilation"); L(" --fast-math fast mathematical mode (assume integer arithmetics)"); L(" --keep-void-inst keep void instructions in the output file"); L(" --compile-msg print a compile message"); L(" --statistics print statistics information"); L(" "); L("WAM to mini-assembly translator options:"); L(" --comment include comments in the output file"); L(" "); L("Mini-assembly to assembly translator options:"); L(" --comment include comments in the output file"); L(" --inline-asm inline some C calls as asm instructions"); L(" --full-inline-asm inline most C calls as asm instructions"); L(" "); L("C Compiler options:"); L(" --c-compiler FILE use FILE as C compiler"); L(" -C OPTION pass OPTION to the C compiler"); L(" "); L("Assembler options:"); L(" -A OPTION pass OPTION to the assembler"); L(" "); L("Linker options:"); L(" --local-size N set default local stack size to N Kb"); L(" --global-size N set default global stack size to N Kb"); L(" --trail-size N set default trail stack size to N Kb"); L(" --cstr-size N set default cstr stack size to N Kb"); L(" --fixed-sizes do not consult environment variables at run-time"); L(" --gui-console link the Win32 GUI console"); L(" --no-top-level do not link the top-level (force --no-debugger)"); L(" --no-debugger do not link the Prolog/WAM debugger"); L(" --min-pl-bips link only used Prolog built-in predicates"); L(" --min-fd-bips link only used FD solver built-in predicates"); L(" --min-bips same as: --no-top-level --min-pl-bips --min-fd-bips --no-debugger"); L(" --min-size same as: --min-bips --strip"); L(" --no-pl-lib do not look for the Prolog and FD libraries (maintenance only)"); L(" --no-fd-lib do not look for the FD library (maintenance only)"); L(" -s, --strip strip the executable"); L(" -L OPTION pass OPTION to the linker"); L(""); L("The file name specified after --output can include meta-characters:"); L(" %f for the whole input file name, %F same as %f without directory"); L(" %p for the whole prefix name, %P same as %p without directory"); L(" %s for the suffix (or empty if not specified)"); L(" %d for the directory part (or empty if not specified)"); L(" %c for a auto-increment counter"); L(""); L("Report bugs to bug-prolog@gnu.org."); } #undef L ./gprolog-1.3.0/src/TopComp/prolog_path.c0000644004425400513100000002072210547154142016631 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog Compiler * * File : prolog_path.c * * Descr.: Prolog installation path detector * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: prolog_path.c,v 1.9 2007/01/04 10:35:14 diaz Exp $ */ /* This file is included by top_comp.c and w32_console.c */ #include #include #include #if defined(_WIN32) || defined(__CYGWIN__) #include #include #endif #if defined(__unix__) || defined(__CYGWIN__) #include #endif #include "../EnginePl/gp_config.h" #if 0 #define DEBUG #endif static char *Is_A_Valid_Root(char *str, int *devel_mode); static char *Search_Path(char *file); #if defined(_WIN32) || defined(__CYGWIN__) static int Read_Write_Registry(int read, char *key_name, char *buff, long buff_size); #endif #define COMPILER_EXE GPLC EXE_SUFFIX /*-------------------------------------------------------------------------* * GET_PROLOG_PATH * * * * returns the GNU Prolog start path (or NULL) and if devel_mode * * the returned buffer can be written. * *-------------------------------------------------------------------------*/ static char * Get_Prolog_Path(int *devel_mode) { static char resolved[MAXPATHLEN]; char *p; if ((p = getenv(ENV_VARIABLE)) != NULL) { strcpy(resolved, p); #ifdef DEBUG fprintf(stderr, "Prolog path from " ENV_VARIABLE ": %s\n", resolved); #endif if ((p = Is_A_Valid_Root(resolved, devel_mode)) != NULL) return p; } if ((p = Search_Path(COMPILER_EXE)) == NULL) { #if defined(_WIN32) || defined(__CGYWIN__) if (Read_Write_Registry(1, "RootPath", resolved, sizeof(resolved))) { #ifdef DEBUG fprintf(stderr, "Prolog path from Registry: %s\n", resolved); #endif return Is_A_Valid_Root(resolved, devel_mode); } #endif return NULL; } #ifdef DEBUG fprintf(stderr, GPLC " found from PATH: %s\n", p); #endif #if defined(__unix__) || defined(__CYGWIN__) if (realpath(p, resolved) == NULL) return NULL; #else /* realpath useless under Win32 since SearchPath resolves it */ strcpy(resolved, p); #endif #ifdef DEBUG fprintf(stderr, "link resolution: %s\n", resolved); #endif p = resolved + strlen(resolved) - 1; while (p > resolved && *p != DIR_SEP_C) /* skip exec_name */ p--; while (p > resolved && *p == DIR_SEP_C) /* skip / */ p--; while (p > resolved && *p != DIR_SEP_C) /* skip previous dir name */ p--; p[1] = '\0'; #ifdef DEBUG fprintf(stderr, "Prolog path from resolution: %s\n", resolved); #endif return Is_A_Valid_Root(resolved, devel_mode); } /*-------------------------------------------------------------------------* * IS_A_VALID_ROOT * * * *-------------------------------------------------------------------------*/ static char * Is_A_Valid_Root(char *str, int *devel_mode) { char *p; #ifdef DEBUG fprintf(stderr, "test if valid root and detect devel mode: %s\n", str); #endif p = str + strlen(str) - 1; while (p >= str && *p == DIR_SEP_C) p--; if (p < str) goto invalid; p++; strcpy(p, DIR_SEP_S "bin" DIR_SEP_S COMPILER_EXE); if (access(str, X_OK) == 0) { *p = '\0'; *devel_mode = 0; valid: #ifdef DEBUG fprintf(stderr, "valid root: %s\n", str); #endif return str; } /* for development mode, only test the existence of TopComp directory */ strcpy(p, DIR_SEP_S "TopComp"); if (access(str, F_OK) == 0) { *p = '\0'; *devel_mode = 1; #ifdef DEBUG fprintf(stderr, "development mode detected\n"); #endif goto valid; } invalid: #ifdef DEBUG fprintf(stderr, "invalid root: %s\n", str); #endif return NULL; } /*-------------------------------------------------------------------------* * SEARCH_PATH * * * *-------------------------------------------------------------------------*/ static char * Search_Path(char *file) { #if defined(__unix__) || defined(__CYGWIN__) char *path = getenv("PATH"); char *p; int l; static char buff[MAXPATHLEN]; if (path == NULL) return NULL; p = path; for (;;) { if ((p = strchr(path, ':')) != NULL) { l = p - path; strncpy(buff, path, l); } else { strcpy(buff, path); l = strlen(buff); } buff[l++] = DIR_SEP_C; strcpy(buff + l, file); if (access(buff, X_OK) == 0) return buff; if (p == NULL) break; path = p + 1; } return NULL; #else static char buff[MAXPATHLEN]; char *file_part; if (SearchPath(NULL, file, ".exe", MAXPATHLEN, buff, &file_part) == 0) return NULL; return buff; #endif } #if defined(_WIN32) || defined(__CYGWIN__) /*-------------------------------------------------------------------------* * READ_WRITE_REGISTRY * * * *-------------------------------------------------------------------------*/ static int Read_Write_Registry(int read, char *key_name, char *buff, long buff_size) { HKEY hkey_software, hkey_prolog; DWORD dw_type; unsigned long disp; if (RegOpenKeyExA(HKEY_CURRENT_USER, "Software", 0, KEY_QUERY_VALUE, &hkey_software) != 0) return 0; if (RegCreateKeyEx (hkey_software, "GnuProlog", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey_prolog, &disp) != 0) { RegCloseKey(hkey_software); return 0; } if (read) { dw_type = REG_SZ; memset(buff, 0, buff_size); if (RegQueryValueExA (hkey_prolog, key_name, 0, &dw_type, buff, &buff_size) != 0 || *buff == '\0') { RegCloseKey(hkey_software); *buff = '\0'; return 0; } } else { RegSetValueEx(hkey_prolog, key_name, 0, REG_SZ, buff, strlen(buff) + 1); } RegCloseKey(hkey_prolog); RegCloseKey(hkey_software); return 1; } #endif #ifdef USE_ALONE /*-------------------------------------------------------------------------* * MAIN * * * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { int devel_mode = 0; char *start_path = Get_Prolog_Path(); if (start_path == NULL) { puts("error: GNU Prolog path not found"); return 1; } if (*start_path == '@') /* development mode */ { start_path++; devel_mode = 1; } puts(start_path); if (argc > 1 && devel_mode) puts("development mode"); return 0; } #endif ./gprolog-1.3.0/src/TopComp/copying.c0000644004425400513100000000540310547154142015762 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog Compiler * * File : copying.c * * Descr.: copying notice for --version option * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: copying.c,v 1.9 2007/01/04 10:35:14 diaz Exp $ */ /* This file included by top_comp.c, wam2ma.c, ma2asm.c,... */ /*-------------------------------------------------------------------------* * DISPLAY_COPYING * * * *-------------------------------------------------------------------------*/ void Display_Copying(char *sub_part) { if (sub_part) fprintf(stderr, "%s (%s) ", sub_part, PROLOG_NAME); else fprintf(stderr, "%s ", PROLOG_NAME); fprintf(stderr, "%s\n", PROLOG_VERSION); fprintf(stderr, "By Daniel Diaz\n"); fprintf(stderr, "%s\n", PROLOG_COPYRIGHT); fprintf(stderr, "%s comes with ABSOLUTELY NO WARRANTY.\n", PROLOG_NAME); fprintf(stderr, "You may redistribute copies of %s\n", PROLOG_NAME); fprintf(stderr, "under the terms of the GNU General Public License.\n"); fprintf(stderr, "For more information about these matters, " "see the files named COPYING.\n"); } ./gprolog-1.3.0/src/TopComp/decode_hexa.c0000644004425400513100000000775210547154142016553 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog Compiler * * File : decode_hexa.c * * Descr.: hexadecimal decoding * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: decode_hexa.c,v 1.10 2007/01/04 10:35:14 diaz Exp $ */ /* This file is included by top_comp.c and hexfilter.c */ #define AUX_STR "_$aux" #define Hex_Num(c) (isdigit(c) ? (c)-'0' : isupper(c) ? (c)-'A'+10 : (c)-'a'+10) /*-------------------------------------------------------------------------* * DECODE_HEXA * * * * str : the line to decode * * format : printf format to emit decoded strings (or NULL) * * strict : 1: only predicate indicators, 0: also predicate names * * decode_aux: 0: no, 1: as its father, 2: as father + auxiliary number * *-------------------------------------------------------------------------*/ char * Decode_Hexa(char *str, char *format, int strict, int decode_aux) { char *src, *dst; char *q, *s; int arity; int n; static char buff[2048]; static char result[4096]; if (format == NULL) format = "%s"; dst = result; for (src = str; *src; src++) { if ((*src == '_' && src[1] == 'X') || *src == 'X') { if (src > str && isalnum(src[-1])) goto normal_char; s = buff; for (q = (*src == '_') ? src + 2 : src + 1; isxdigit(*q); q += 2) { if (!isxdigit(q[1])) goto normal_char; *s++ = Hex_Num(*q) * 16 + Hex_Num(q[1]); } *s = '\0'; if (*q == '_') { if (!isdigit(*++q)) goto normal_char; arity = strtol(q, &q, 10); if (isalnum(*q)) goto normal_char; sprintf(s, "/%d", arity); } else if (strict) goto normal_char; if (decode_aux == 0 || *buff != '$' || (src = strstr(buff, AUX_STR)) == NULL) goto normal_pred; n = strtol(src + sizeof(AUX_STR) - 1, &s, 10); if (strict && *s != '/') goto normal_pred; s = buff + 1; /* skip leading $ */ if (decode_aux == 2) sprintf(src, "-aux-%d", n); else *src = '\0'; goto disp_pred; normal_pred: s = buff; disp_pred: sprintf(dst, format, s); while (*dst) dst++; src = q; if (*src == '\0') break; } normal_char: *dst++ = *src; } *dst = '\0'; return result; } ./gprolog-1.3.0/src/TopComp/Makefile.in0000644004425400513100000000174210547152501016212 0ustar diazlocoTOP_LEVEL = @TOP_LEVEL@ TOP_LEVEL_FLAGS = @TOP_LEVEL_FLAGS@ GPLC = @GPLC@ HEXGPLC = @HEXGPLC@ CC = @CC@ @CFLAGS_MACHINE@ CFLAGS = @CFLAGS@ LDLIBS = @LDLIBS@ EXECS = $(GPLC)@EXE_SUFFIX@ $(HEXGPLC)@EXE_SUFFIX@ ALL_EXECS = $(EXECS) $(TOP_LEVEL)@EXE_SUFFIX@ first: $(EXECS) $(GPLC)@EXE_SUFFIX@: top_comp.c ../EnginePl/wam_regs.h \ ../EnginePl/gp_config.h decode_hexa.c copying.c prolog_path.c $(CC) $(CFLAGS) @CC_EXE_NAME_OPT@$(GPLC)@EXE_SUFFIX@ top_comp.c $(LDLIBS) $(HEXGPLC)@EXE_SUFFIX@: hexfilter.c decode_hexa.c $(CC) $(CFLAGS) @CC_EXE_NAME_OPT@$(HEXGPLC)@EXE_SUFFIX@ hexfilter.c all: $(ALL_EXECS) $(TOP_LEVEL)@EXE_SUFFIX@: ../EnginePl/gp_config.h copying.c top_level.c $(GPLC) $(TOP_LEVEL_FLAGS) -o $(TOP_LEVEL)@EXE_SUFFIX@ top_level.c clean: -mv $(TOP_LEVEL)@EXE_SUFFIX@ $(TOP_LEVEL)0@EXE_SUFFIX@ rm -f *@OBJ_SUFFIX@ $(ALL_EXECS) distclean: rm -f *@OBJ_SUFFIX@ $(ALL_EXECS) $(TOP_LEVEL)0@EXE_SUFFIX@ ./gprolog-1.3.0/src/TopComp/top_level.c0000644004425400513100000001520710547154143016307 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Prolog Top-level * * File : top_level.c * * Descr.: top-level command-line option checking * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: top_level.c,v 1.13 2007/01/04 10:35:15 diaz Exp $ */ #include #include #include "gprolog.h" #include "../TopComp/copying.c" /*---------------------------------* * Constants * *---------------------------------*/ /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ /*---------------------------------* * Function Prototypes * *---------------------------------*/ static void Display_Help(void); #define Check_Arg(i, str) (strncmp(argv[i], str, strlen(argv[i])) == 0) #define EXEC_CMD_LINE_GOAL X24657865635F636D645F6C696E655F676F616C #define PREDICATE_TOP_LEVEL X746F705F6C6576656C Prolog_Prototype(PREDICATE_TOP_LEVEL, 0); Prolog_Prototype(EXEC_CMD_LINE_GOAL, 1); /*-------------------------------------------------------------------------* * To define a top_level simply compile an empty source file (Prolog or C) * * (linking the Prolog top-level is done by default). * * This file is because we want to take into account some options/arguments* *-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------* * MAIN * * * * See comments in EnginePl/main.c about the use of the wrapper function. * *-------------------------------------------------------------------------*/ static int Main_Wrapper(int argc, char *argv[]) { int i; int new_argc = 0; char **new_argv; WamWord *entry_goal; int nb_entry_goal = 0; WamWord *query_goal; int nb_query_goal = 0; WamWord word; Start_Prolog(argc, argv); /* argc and argv will be changed */ new_argv = (char **) Malloc(sizeof(char *) * (argc + 1)); new_argv[new_argc++] = argv[0]; entry_goal = (WamWord *) Malloc(sizeof(WamWord) * argc); query_goal = (WamWord *) Malloc(sizeof(WamWord) * argc); for (i = 1; i < argc; i++) { if (*argv[i] == '-' && argv[i][1] != '\0') { if (strcmp(argv[i], "--") == 0) { i++; break; } if (Check_Arg(i, "--version")) { Display_Copying("Prolog top-Level"); exit(0); } if (Check_Arg(i, "--init-goal")) { if (++i >= argc) Fatal_Error("Goal missing after --init-goal option"); A(0) = Tag_ATM(Create_Atom(argv[i])); Call_Prolog(Prolog_Predicate(EXEC_CMD_LINE_GOAL, 1)); Reset_Prolog(); continue; } if (Check_Arg(i, "--entry-goal")) { if (++i >= argc) Fatal_Error("Goal missing after --entry-goal option"); entry_goal[nb_entry_goal++] = Tag_ATM(Create_Atom(argv[i])); continue; } if (Check_Arg(i, "--query-goal")) { if (++i >= argc) Fatal_Error("Goal missing after --query-goal option"); query_goal[nb_query_goal++] = Tag_ATM(Create_Atom(argv[i])); continue; } if (Check_Arg(i, "-h") || Check_Arg(i, "--help")) { Display_Help(); exit(0); } } /* unknown option is simply ignored (passed to Prolog) */ new_argv[new_argc++] = argv[i]; } while(i < argc) new_argv[new_argc++] = argv[i++]; new_argv[new_argc] = NULL; os_argc = new_argc; os_argv = new_argv; if (nb_entry_goal) { word = Mk_Proper_List(nb_entry_goal, entry_goal); Blt_G_Assign(Tag_ATM(Create_Atom("$cmd_line_entry_goal")), word); } Free(entry_goal); if (nb_query_goal) { word = Mk_Proper_List(nb_query_goal, query_goal); Blt_G_Assign(Tag_ATM(Create_Atom("$cmd_line_query_goal")), word); } Free(query_goal); Reset_Prolog(); Call_Prolog(Prolog_Predicate(PREDICATE_TOP_LEVEL, 0)); Stop_Prolog(); return 0; } int main(int argc, char *argv[]) { return Main_Wrapper(argc, argv); } /*-------------------------------------------------------------------------* * DISPLAY_HELP * * * *-------------------------------------------------------------------------*/ static void Display_Help(void) #define L(msg) fprintf(stderr, "%s\n", msg) { fprintf(stderr, "Usage: %s [OPTION]... \n", TOP_LEVEL); L(""); L(" --init-goal GOAL execute GOAL before top_level/0"); L(" --entry-goal GOAL execute GOAL inside top_level/0"); L(" --query-goal GOAL execute GOAL as a query for top_level/0"); L(" -h, --help print this help and exit"); L(" --version print version number and exit"); L(" -- do not parse the rest of the command-line"); L(""); L("Report bugs to bug-prolog@gnu.org."); } #undef L ./gprolog-1.3.0/src/TopComp/hexfilter.c0000644004425400513100000002107110547154142016303 0ustar diazloco/*-------------------------------------------------------------------------* * GNU Prolog * * * * Part : Utiliy * * File : hexfilter.c * * Descr.: Prolog hexadecimal decoding filter * * Author: Daniel Diaz * * * * Copyright (C) 1999-2007 Daniel Diaz * * * * GNU Prolog is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2, or any later version. * * * * GNU Prolog is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc. * * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * *-------------------------------------------------------------------------*/ /* $Id: hexfilter.c,v 1.11 2007/01/04 10:35:14 diaz Exp $ */ #include #include #include #include #include #include "../EnginePl/gp_config.h" #include "decode_hexa.c" /*---------------------------------* * Constants * *---------------------------------*/ #define MAX_ARGS 1024 #define HEXGPLC_VERSION "1.0" /*---------------------------------* * Type Definitions * *---------------------------------*/ /*---------------------------------* * Global Variables * *---------------------------------*/ int encode = 0; int strict = 1; int enclose = 1; int decode_aux = 0; int cmd_line = 0; char *format = NULL; FILE *fin = NULL; char *arg[MAX_ARGS]; int nb_arg = 0; /*---------------------------------* * Function Prototypes * *---------------------------------*/ void One_File(FILE *f); void One_Line(char *str); void Fatal_Error(char *format, ...); void Parse_Arguments(int argc, char *argv[]); void Display_Help(void); #define Check_Arg(i, str) (strncmp(argv[i], str, strlen(argv[i])) == 0) /*-------------------------------------------------------------------------* * MAIN * * * *-------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { FILE *f; int i; Parse_Arguments(argc, argv); if (nb_arg == 0) { if (cmd_line) Fatal_Error("command-line is empty"); One_File(stdin); return 0; } for (i = 0; i < nb_arg; i++) { if (cmd_line) { One_Line(arg[i]); putchar('\n'); continue; } if ((f = fopen(arg[i], "rt")) == NULL) Fatal_Error("cannot open %s", arg[i]); One_File(f); fclose(f); } return 0; } /*-------------------------------------------------------------------------* * ONE_FILE * * * *-------------------------------------------------------------------------*/ void One_File(FILE *f) { static char buff[4096]; for (;;) { if (fgets(buff, sizeof(buff), f) == NULL) break; One_Line(buff); } } /*-------------------------------------------------------------------------* * ONE_LINE * * * *-------------------------------------------------------------------------*/ void One_Line(char *str) { int n; char *p; #define Is_Sep(c) (c == '\0' || isspace(c) || strchr("'\"", c)) if (encode) { while (*str) { if (Is_Sep(*str)) { putchar(*str++); continue; } putchar('X'); while (*str && !Is_Sep(*str)) { if (*str == '/') { n = strtol(str + 1, &p, 10); if (n >= 0 && n < 1024 && Is_Sep(*p)) { str = p; printf("_%d", n); break; } } printf("%2X", (unsigned) (unsigned char) *str); str++; } } return; } fputs(Decode_Hexa(str, format, strict, decode_aux), stdout); } /*-------------------------------------------------------------------------* * PARSE_ARGUMENTS * * * *-------------------------------------------------------------------------*/ void Parse_Arguments(int argc, char *argv[]) { int i; for (i = 1; i < argc; i++) { if (*argv[i] == '-' && argv[i][1] != '\0') { if (Check_Arg(i, "--encode")) { encode = 1; continue; } if (Check_Arg(i, "--relax")) { strict = 0; continue; } if (Check_Arg(i, "--printf")) { if (++i >= argc) Fatal_Error("format missing after -printf option"); format = argv[i]; continue; } if (Check_Arg(i, "--aux-father")) { decode_aux = 1; continue; } if (Check_Arg(i, "--aux-father2")) { decode_aux = 2; continue; } if (Check_Arg(i, "--cmd-line")) { cmd_line = 1; continue; } if (Check_Arg(i, "-H")) { encode = 1; cmd_line = 1; strict = 0; continue; } if (Check_Arg(i, "-P")) { encode = 0; cmd_line = 1; strict = 0; decode_aux = 0; continue; } if (Check_Arg(i, "--version")) { fprintf(stderr, "Prolog/Hexa Filter "); fprintf(stderr, " Daniel Diaz - 1998\n"); fprintf(stderr, "%s version %s\n", HEXGPLC, HEXGPLC_VERSION); exit(0); } if (Check_Arg(i, "-h") || Check_Arg(i, "--help")) { Display_Help(); exit(0); } Fatal_Error("unknown option %s - try %s --help", argv[i], HEXGPLC); } arg[nb_arg++] = argv[i]; } } /*-------------------------------------------------------------------------* * FATAL_ERROR * * * *-------------------------------------------------------------------------*/ void Fatal_Error(char *format, ...) { va_list arg_ptr; va_start(arg_ptr, format); vfprintf(stderr, format, arg_ptr); va_end(arg_ptr); fprintf(stderr, "\n"); exit(1); } /*-------------------------------------------------------------------------* * DISPLAY_HELP * * * *-------------------------------------------------------------------------*/ void Display_Help(void) #define L(msg) fprintf(stderr, "%s\n", msg) { fprintf(stderr, "Usage: %s [OPTION]... [FILE...]", HEXGPLC); L(" "); L("Options:"); L(" --encode encoding mode (default is decoding)"); L(" --relax decode also predicate names (not only predicate indicators)"); L(" --printf FORMAT pass encoded/decoded string to printf with FORMAT"); L(" --aux-father decode auxiliary predicate as its father"); L(" --aux-father2 decode auxiliary predicate as its father + auxiliary number"); L(" --cmd-line command-line mode: encode/decode each argument of the command-line"); L(" -H shortcut for --cmd-line --encode"); L(" -P shortcut for --cmd-line --relax"); L(" -h, --help print this help and exit"); L(" --version print version number and exit"); } ./gprolog-1.3.0/src/README0000644004425400513100000000246110007017722013437 0ustar diazloco General Compilation Information This directory contains the source of GNU Prolog. 1) Compiling locally -------------------- To compile the package locally use: ./configure [OPTIONS] make For more information about the options of configure refer to the INSTALL file in the parent directory. It is possible to re-run './configure' to change the value of some installation directories (see 2) after the local compilation (i.e. the compilation will not be done again). 2) Cleaning ----------- To remove installed files (remove the content of INSTALL_DIR): make uninstall To clean up the local compilation (does not erase configuration files): make clean To fully clean up the local compilation: make distclean 2) Rebuilding a source distribution ----------------------------------- To rebuild a source distribution file: make dist this will create a file gprolog-xxx.tgz (in the src directory). 3) Building a RPM distribution ------------------------------- Refer to the file src/RPM/README for more information 4) Building a debian package ---------------------------- Refer to the file src/debian/README for more information 5) Building a Win32 auto-install distribution --------------------------------------------- Refer to the file src/Win32/README for more information ./gprolog-1.3.0/src/WINDOWS0000644004425400513100000001731210536017324013642 0ustar diazloco Windows installation instructions This file describes how to compile GNU Prolog on Windows machines. There are actually 3 ports: - pure Win32 with MS Visual C++ (MSVC++) - pure Win32 with MinGW (gcc) - using Cygwin with Cygwin (gcc). However, even to compile a source distribution of GNU Prolog with MSVC, you need a Unix-like environment (providing standard Unix tools like: make, rm, cp, ...). You can either use Cygwin or MinGW/MSYS for this. NB: The current version DOES NOT accept spaces in pathnames. Do not uncompress your source distribution under a pathname containing spaces. Do not install it under a pathname containing spaces. 1) Installing and configuring Cygwin ------------------------------------ Cygwin is a Unix-like environment for Windows. It consists of two parts: - a DLL (cygwin1.dll) which acts as a Linux emulation layer providing substantial Linux API functionality. - a collection of tools, which provide Linux look and feel. Refer to www.cygwin.com to properly install Cygwin. The resulting system is installed under something like c:\Cygwin. You can set some variables in this .bat launching cygwin (c:\cygwin\cygwin.bat) since environment variables are inherited by the Cygwin shell. For instance if you use MSVC++ and the Microsoft SDK (see below) you can add "call c:\Program Files\Microsoft SDK\SetEnv.Bat" to the .bat (note that if you have installed "Register environment variables" from the Microsoft SDK, you don't need to call SetEnv.bat as explained below). You can also modify your .bashrc file to set the PATH variable for the tools you will use. Similarly if you want to use the Microsoft HTML Help Workshop (see below) you can add something like "C:\Program Files\HTML Help Workshop" to your PATH in the .bat file (or '/cygdrive/c/Program Files/HTML Help Workshop' in your .bashrc file). Here is an example of .bat file launching bash in a text console: @ECHO OFF CALL c:\hhvars.bat CALL c:\cygwin\cygwin.bat with hhvars.bat containing: @ECHO OFF ECHO Setting environment for using HTML Help Workshop. PATH=%PATH%;C:\Program Files\HTML Help Workshop Finally note that a pure Win32 native graphical version of Emacs exists for winXX machines (in addition to the one provided by Cygwin which requires Cygwin1.dll and runs in text mode unless a X server is started). Refer to www.gnu.org/software/emacs/windows for more information. The gcc version provided by Cygwin is a cygwin port of gcc (it uses cygwin1.dll). By default it generates a code using cygwin1.dll. It is however possible to generate a pure win32 code using the -mno-cygwin option. The -mno-cygwin flag to gcc makes gcc link against standard Microsoft DLLs instead of Cygwin (like what does MinGW/gcc). This is desirable for native Windows programs that don't need a UNIX emulation layer. This is not to be confused with MinGW (see below) whose gcc does not need cygwin1.dll to run (it is a pure Win32 port of gcc). 2) Installing and configuring MinGW/MSYS ---------------------------------------- MinGW (Minimalist GNU For Windows) is a collection of freely available and freely distributable Windows specific header files and import libraries combined with GNU toolsets that allow one to produce native Windows programs that do not rely on any 3rd-party C runtime DLLs. MSYS is A Minimal SYStem to provide POSIX/Bourne configure scripts the ability to execute and create a Makefile used by make. Refer to www.mingw.org for more information (how to get MinGW/MSYS and all needed tools). NB: if you want your .bash_profile to be executed, add this line at the end of /etc/profile (in c:\msys\1.0\etc): if [ -f "$HOME/.bash_profile" ]; then source "$HOME/.bash_profile"; fi The gcc version provided by MinGW is a native win32 port of gcc. It generates a code for native win32. By default, under MinGW/MSYS, the Win32 GUI console is compiled. For this you need the HTML Help Workshop. See below on how to get/install it. You can avoid the GUI console using ./configure --disable-gui-console (see INSTALL). 3) Compiling GNU Prolog using Cygwin or MinGW/MSYS -------------------------------------------------- Launch a shell (Cygwin or MSYS) and follow the classical installation procedure (see ../INSTALL file), i.e.: ./configure make make install The default gcc will be used (the one using cygwin1.dll and producing code using cygwin1.dll) under cygwin and native win32 gcc under msys. 4) Compiling GNU Prolog using MSVC++ ------------------------------------ You need MSVC++. GNU Prolog has been tested with version 6.0 and Visual C++ 2005 Express Edition. The later is freely available from microsoft site: http://msdn.microsoft.com/vstudio/express/visualc/download/. Then install this SDK (or more recent version) : Microsoft Windows Server 2003 R2 Platform SDK. You can install it from : http://www.microsoft.com/downloads/details.aspx?FamilyId=0BAF2B35-C656-4969-ACE8-E4C0C0716ADB&displaylang=en. If you chose to set up environement variables, MSVC++ is informed about new include/library directories. Else your can execute .bat provided with the MS compiler (e.g. vcvarvs32.bat or vsvar32.bat). Anyway, your PATH shoud contain the cl.exe command-line compiler, INCLUDE and LIB should be correctly set. NB: for MSVC6.0: its lib directory should appear before the lib directory of the SDK (else an error occurs when linking the GUI console). NB: recent cygwin include a /bin/link.exe command. Be sure it doesn't shadow the Microsoft linker (also called link.exe). The simplest way to solve it is to rename /bin/link.exe of cygwin. Once MSVC++ and the SDK are well installed use --with-msvc at configure time: ./configure --with-msvc make make install By default, the GUI console is compiled (sources in W32GUICons) unless you use ./configure --disable-gui-console. See the ../INSTALL file for further information. Even if compiled with the GUI it is possible to avoid it (and run in console mode) a Prolog program setting the environment variable LINEDIT to a string containing gui=no, e.g. (bash) export LINEDIT='gui=no', (windows) SET LINEDIT=gui=no. 5) Using Microsoft HTML Help ---------------------------- If you compile under native Win32 with the GUI Console (see above), you can have a direct access to the GNU Prolog manual (with contextual help, index, table of contents, search). For this we use the Microsoft HMLT Help facility. which is the standard help system for the Win32 platforms (replacing old WinHelp). It is mainly based on HTML files + add-ons (table of contents, index, search facilities,...). A SDK is freely available as a "HTML Help Workshop". There are 2 parts: a compiler to create a .chm version of the documentation (see doc/README) and a library that makes it possible to use this file from a C program. You can get the HTML-Help Workshop from msdn.microsoft.com/library/en-us/htmlhelp/html/vsconHH1Start.asp (file HTMLHELP.EXE). In order to access to the compiler you have to add "C:\Program Files\HTML Help Workshop" to your PATH (see file hhvars.bat above). If you have the SDK (see above) the header file htmlhelp.h and the library htmlhel.lib are already present. Else copy them from the workshop directory. For MinGW (I suppose you are under MSYS and mingw is in /mingw): cp /c/Program\ Files/HTML\ Help\ Workshop/include/* /mingw/include/. cp /c/Program\ Files/HTML\ Help\ Workshop/lib/* /mingw/lib/ Note that it is possible to rename htmlhelp.lib to libhtmlhelp.a to follow the Unix-like names (but a .lib also works). Note: when building the GUI console a warning can be displayed by the linker due to some directive placed by MS link.exe in the .lib. It does not matter. The message looks like: Warning: .drectve `-defaultlib:uuid.lib ' unrecognized Consult doc/README for more information about HTML Help Formats. ./gprolog-1.3.0/doc/0000777004425400513100000000000010547442375012555 5ustar diazloco./gprolog-1.3.0/doc/debugger.tex0000644004425400513100000003627210547152501015056 0ustar diazloco\newpage \section{Debugging} \label{Debugging} %HEVEA\cutdef[1]{subsection} \subsection{Introduction} The GNU Prolog debugger provides information concerning the control flow of the program. The debugger can be fully used on consulted predicates (i.e. byte-code). For native compiled code only the calls/exits are traced, no internal behavior is shown. Under the debugger it is possible to exhaustively trace the execution or to set spy-points to only debug a specific part of the program. Spy-points allow the user to indicate on which predicates the debugger has to stop to allow the user to interact with it. The debugger uses the ``procedure box control flow model'', also called the Byrd Box model since it is due to Lawrence Byrd. \subsection{The procedure box model} The procedure box model of Prolog execution provides a simple way to show the control flow. This model is very popular and has been adopted in many Prolog systems (e.g. SICStus Prolog, Quintus Prolog,\ldots). A good introduction is the chapter 8 of ``Programming in Prolog'' of Clocksin \& Mellish~\cite{Clock}. The debugger executes a program step by step tracing an invocation to a predicate (\texttt{call}) and the return from this predicate due to either a success (\texttt{exit}) or a failure (\texttt{fail}). When a failure occurs the execution backtracks to the last predicate with an alternative clause. The predicate is then re-invoked (\texttt{redo}). Another source of change of the control flow is due to exceptions. When an exception is raised from a predicate (\texttt{exception}) by \IdxPB{throw/1} \RefSP{catch/3} the control is given back to the most recent predicate that has defined a handler to recover this exception using \IdxPB{catch/3} \RefSP{catch/3}. The procedure box model shows these different changes in the control flow, as illustrated here: \InsertImage{debug-box} Each arrow corresponds to a \emph{port}. An arrow to the box indicates that the control is given to this predicate while an arrow from the box indicates that the control is given back from the procedure. This model visualizes the control flow through these five ports and the connections between the boxes associated with subgoals. Finally, it should be clear that a box is associated with one invocation of a given predicate. In particular, a recursive predicate will give raise to a box for each invocation of the predicate with different entries/exits in the control flow. Since this might get confusing for the user, the debugger associates with each box a unique identifier (i.e. the invocation number). \subsection{Debugging predicates} \subsubsection{Running and stopping the debugger} \label{Running-and-stopping-the-debugger} \AddDBD{trace/0} \AddDBD{debug/0} \AddDBD{debugging/0} \AddDBD{notrace/0} \AddDBD{nodebug/0} \AddDBD{wam\_debug/0} \texttt{trace/0} activates the debugger. The next invocation of a predicate will be traced. \texttt{debug/0} activates the debugger. The next invocation of a predicate on which a spy-point has been set will be traced. It is important to understand that the information associated with the control flow is only available when the debugger is on. For efficiency reasons, when the debugger is off the information concerning the control flow (i.e. the boxes) is not retained. So, if the debugger is activated in the middle of a computation (by a call to \texttt{debug/0} or \texttt{trace/0} in the program or after the interrupt key sequence (\texttt{Ctl-C}) by choosing \texttt{trace} or \texttt{debug}), information prior to this point is not available. \texttt{debugging/0}: prints onto the terminal information about the current debugging state (whether the debugger is switched on, what are the leashed ports, spy-points defined,\ldots). \texttt{notrace/0} or \texttt{nodebug/0} switches the debugger off. \texttt{wam\_debug/0} invokes the sub-debugger devoted to the WAM data structures \RefSP{The-WAM-debugger}. It can be also invoked using the \texttt{W} debugger command \RefSP{Debugger-commands}. \subsubsection{Leashing ports} \label{Leashing-ports} \AddDBD{leash/1} \texttt{leash(Ports)} requests the debugger to prompt the user, as he creeps through the program, for every port defined in the \texttt{Ports} list. Each element of \texttt{Ports} is an atom in \texttt{call}, \texttt{exit}, \texttt{redo}, \texttt{fail}, \texttt{exception}. \texttt{Ports} can also be an atom defining a shorthand: \begin{itemize} \item \IdxDKD{full}: equivalent to \texttt{[call, exit, redo, fail, exception]} \item \IdxDKD{half}: equivalent to \texttt{[call, redo]} \item \IdxDKD{loose}: equivalent to \texttt{[call]} \item \IdxDKD{none}: equivalent to \texttt{[]} \item \IdxDKD{tight}: equivalent to \texttt{[call, redo, fail, exception]} \end{itemize} When an unleashed port is encountered the debugger continues to show the associated goal but does not stop the execution to prompt the user. \subsubsection{Spy-points} \label{Spy-points} \AddDBD{spy/1} \AddDBD{nospy/1} \AddDBD{nospyall/0} \AddDBD{spypoint\_condition/3} When dealing with big sources it is not very practical to creep through the entire program. It is preferable to define a set of spy-points on interesting predicates to be prompted when the debugger reaches one of these predicates. Spy-points can be added either using \texttt{spy/1} (or \texttt{spypoint\_condition/3}) or dynamically when prompted by the debugger using the \texttt{+} (or \texttt{*}) debugger command \RefSP{Debugger-commands}. The current mode of leashing does not affect spy-points in the sense that user interaction is requested on every port. \texttt{spy(PredSpec)} sets a spy-point on all the predicates given by \texttt{PredSpec}. \texttt{PredSpec} defines one or several predicates and has one of the following forms: \begin{itemize} \item \texttt{[PredSpec1, PredSpec2,\ldots]}: set a spy-point for each element of the list. \item \texttt{Name}: set a spy-point for any predicate whose name is \texttt{Name} (whatever the arity). \item \texttt{Name/Arity}: set a spy-point for the predicate whose name is \texttt{Name} and arity is \texttt{Arity}. \item \texttt{Name/A1-A2}: set a spy-point for the each predicate whose name is \texttt{Name} and arity is between \texttt{A1} and \texttt{A2}. \end{itemize} It is not possible to set a spy-point on an undefined predicate. The following predicate is used to remove one or several spy-points: \texttt{nospy(PredSpec)} removes the spy-points from the specified predicates. \texttt{nospyall/0} removes all spy-points: It is also possible to define conditional spy-points. \texttt{spypoint\_condition(Goal, Port, Test)} sets a conditional spy-point on the predicate for \texttt{Goal}. When the debugger reaches a conditional spy-point it only shows the associated goal if the following conditions are verified: \begin{itemize} \item the actual goal unifies with \texttt{Goal}. \item the actual port unifies with \texttt{Port}. \item the Prolog goal \texttt{Test} succeeds. \end{itemize} \subsection{Debugging messages} We here described which information is displayed by the debugger when it shows a goal. The basic format is as follows: \OneLine{\Param{S N M Port}:~\Param{Goal} ?} \Param{S} is a spy-point indicator: if there is a spy-point on the current goal the \texttt{+} symbol is displayed else a space is displayed. \Param{N} is the invocation number. This unique number can be used to correlate the trace messages for the various ports, since it is unique for every invocation. \Param{M} is an index number which represents the number of direct ancestors of the goal (i.e. the current depth of the goal). \Param{Port} specifies the particular port (\texttt{call}, \texttt{exit}, \texttt{fail}, \texttt{redo}, \texttt{exception}). \Param{Goal} is the current goal (it is then possible to inspect its current instantiation) which is displayed using \IdxPB{write\_term/3} with \texttt{quoted(true)} and \texttt{max\_depth(\Param{D})} options \RefSP{write-term/3}. Initially \Param{D} (the print depth) is set to 10 but can be redefined using the \texttt{{\lt}} debugger command \RefSP{Debugger-commands}. The \texttt{?} symbol is displayed when the debugger is waiting a command from the user. (i.e. \texttt{Port} is a leashed port). If the port is unleashed, this symbol is not displayed and the debugger continues the execution displaying the next goal. \subsection{Debugger commands} \label{Debugger-commands} When the debugger reaches a leashed port it shows the current goal followed by the \texttt{?} symbol. At this point there are many commands available. Typing \texttt{RETURN} will creep into the program. Continuing to creep will show all the control flow. The debugger shows every port for every predicate encountered during the execution. It is possible to select the ports at which the debugger will prompt the user using the built-in predicate \IdxDB{leash/1} \RefSP{Leashing-ports}. Each command is only one character long: \begin{tabular}{|c|c|p{10.4cm}|} \hline Command & Name & Description \\ \hline\hline \texttt{RET} or \texttt{c} & creep & single-step to the next port \\ \hline \texttt{l} & leap & continue the execution only stopping when a goal with a spy-point is reached \\ \hline \texttt{s} & skip & skip over the entire execution of the current goal. No message will be shown until control returns \\ \hline \texttt{G} & go to & ask for an invocation number and continue the execution until a port is reached for that invocation number \\ \hline \texttt{r} & retry & try to restart the invocation of the current goal by failing until reaching the invocation of the goal. The state of execution is the same as when the goal was initially invoked (except when using side-effect predicates) \\ \hline \texttt{f} & fail & force the current goal to fail immediately \\ \hline \texttt{w} & write & show the current goal using \texttt{write/2} \RefSP{write-term/3} \\ \hline \texttt{d} & display & show the current goal using \texttt{display/2} \RefSP{write-term/3} \\ \hline \texttt{p} & print & show the current goal using \texttt{print/2} \RefSP{write-term/3} \\ \hline \texttt{e} & exception & show the pending exception. Only applicable to an \texttt{exception} port \\ \hline \texttt{g} & ancestors & show the list of ancestors of the current goal \\ \hline \texttt{A} & alternatives & show the list of ancestors of the current goal combined with choice-points \\ \hline \texttt{u} & unify & ask for a term and unify the current goal with this term. This is convenient for getting a specific solution. Only available at a \texttt{call} port \\ \hline \texttt{.} & father file & show the Prolog file name and the line number where the current predicate is defined \\ \hline \texttt{n} & no debug & switch the debugger off. Same as \IdxDB{nodebug/0} \RefSP{Running-and-stopping-the-debugger} \\ \hline \texttt{=} & debugging & show debugger information. Same as \IdxDB{debugging/0} \RefSP{Running-and-stopping-the-debugger} \\ \hline \texttt{+} & spy this & set a spy-point on the current goal. Uses \IdxDB{spy/1} \RefSP{Spy-points} \\ \hline \texttt{-} & nospy this & remove a spy-point on the current goal. Uses \IdxDB{nospy/1} \RefSP{Spy-points} \\ \hline \texttt{*} & spy conditionally & ask for a term \texttt{Goal, Port, Test} (terminated by a dot) and set a conditional spy-point on the current predicate. \texttt{Goal} and the current goal must have the same predicate indicator. Uses \IdxDB{spypoint\_condition/3} \RefSP{Spy-points} \\ \hline \texttt{L} & listing & list all the clauses associated with the current predicate. Uses \IdxPB{listing/1} \RefSP{listing/1} \\ \hline \texttt{a} & abort & abort the current execution. Same as \IdxPB{abort/0} \RefSP{abort/0} \\ \hline \texttt{b} & break & invoke a recursive top-level. Same as \IdxPB{break/0} \RefSP{abort/0} \\ \hline \texttt{@} & execute goal & ask for a goal and execute it \\ \hline \texttt{{\lt}} & set print depth & ask for an integer and set the print depth to this value (\texttt{-1} for no depth limit) \\ \hline \texttt{h} or \texttt{?} & help & display a summary of available commands \\ \hline \texttt{W} & WAM debugger & invoke the low-level WAM debugger \RefSP{The-WAM-debugger} \\ \hline \end{tabular} \subsection{The WAM debugger} \label{The-WAM-debugger} In some cases it is interesting to have access to the \Idx{WAM} data structures. This sub-debugger allows the user to inspect/modify the contents of any stack or register of the WAM. The WAM debugger is invoked using the built-in predicate \IdxDB{wam\_debug/0} \RefSP{Running-and-stopping-the-debugger} or the \texttt{W} debugger command \RefSP{Debugger-commands}. The following table presents the specific commands of the WAM debugger: \begin{tabular}{|l|l|} \hline Command & Description \\ \hline\hline \texttt{write} \Param{A} [\Param{N}] & write \Param{N} terms starting at the address \Param{A} using \texttt{write/1} \RefSP{write-term/3} \\ \hline \texttt{data} \Param{A} [\Param{N}] & display \Param{N} words starting at the address \Param{A} \\ \hline \texttt{modify} \Param{A} [\Param{N}] & display and modify \Param{N} words starting at the address \Param{A} \\ \hline \texttt{where} \Param{A} & display the real address corresponding to \Param{A} \\ \hline \texttt{what} \Param{RA} & display what corresponds to the real address \Param{RA} \\ \hline \texttt{deref} \Param{A} & display the dereferenced word starting at the address \Param{A} \\ \hline \texttt{envir} [\Param{SA}] & display the contents of the environment located at \Param{SA} (or the current one) \\ \hline \texttt{backtrack} [\Param{SA}] & display the contents of the choice-point located at \Param{SA} (or the current one) \\ \hline \texttt{backtrack all} & display all choice-points \\ \hline \texttt{quit} & quit the WAM debugger \\ \hline \texttt{help} & display a summary of available commands \\ \hline \end{tabular} In the above table the following conventions apply: \begin{itemize} \item elements between [ and ] are optional. \item \Param{N} is an optional integer (defaults to 1). \item \Param{A} is a WAM address, its syntax is: \Param{BANK\_NAME} [ \texttt{[ \Param{N} ]} ], i.e. a bank name possibly followed by an index (defaults to 0). \Param{BANK\_NAME} is either: \begin{itemize} \item \texttt{reg}: WAM general register (stack pointers, continuation, ...). \item \texttt{x}: WAM X register (temporary variables, i.e. arguments). \item \texttt{y}: WAM Y register (permanent variables). \item \texttt{ab}: WAM X register saved in the current choice-point. \item \Param{STACK\_NAME}: WAM stack (\Param{STACK\_NAME} in \texttt{local}, \texttt{global}, \texttt{trail}, \texttt{cstr}). \end{itemize} \item \Param{SA} is a WAM stack address, i.e. \texttt{\Param{STACK\_NAME}} [ \texttt{[ \Param{N} ]} ] (special case of WAM addresses). \item \Param{RA} is a real address, its syntax is the syntax of C integers (in particular the notation \texttt{0x\ldots} is recognized). \end{itemize} It is possible to only use the first letters of a commands and bank names when there is no ambiguity. Also the square brackets \texttt{[} \texttt{]} enclosing the index of a bank name can be omitted. For instance the following command (showing the contents of 25 consecutive words of the global stack from the index 3): \texttt{data global[3] 25} can be abbreviated as: \texttt{d g 3 25}. %HEVEA\cutend ./gprolog-1.3.0/doc/debug-box.fig0000644004425400513100000000166206665443302015116 0ustar diazloco#FIG 3.2 Landscape Center Inches Letter 100.00 Single -2 1200 2 6 4200 2700 6000 3600 2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 4200 2700 6000 2700 6000 3600 4200 3600 4200 2700 4 0 0 100 0 0 12 0.0000 4 180 705 4747 3195 predicate\001 -6 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 3375 2850 4200 2850 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 6000 2850 6825 2850 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 4200 3450 3375 3450 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 3 1 1 1.00 60.00 120.00 5100 3600 5100 4050 3375 4050 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 6825 3450 6000 3450 4 0 0 100 0 0 12 0.0000 4 135 330 6900 3495 redo\001 4 0 0 100 0 0 12 0.0000 4 135 285 6900 2895 exit\001 4 2 0 100 0 0 12 0.0000 4 135 270 3300 2910 call\001 4 2 0 100 0 0 12 0.0000 4 135 240 3300 3495 fail\001 4 2 0 100 0 0 12 0.0000 4 180 735 3300 4095 exception\001 ./gprolog-1.3.0/doc/Makefile0000644004425400513100000001045310547152501014201 0ustar diazlocoPREFIX=gprolog MAIN=$(PREFIX).tex DVINAME=$(PREFIX).dvi PSNAME=$(PREFIX).ps PDFNAME=$(PREFIX).pdf HTMLNAME=$(PREFIX).html CHMNAME=$(PREFIX).chm FIG=$(shell echo *.fig) EPS=$(FIG:.fig=.eps) GIF=$(FIG:.fig=.gif) TEX_SRC=$(MAIN) packages.tex macros.tex body.tex copyright.tex \ cover.tex acknow.tex intro.tex use.tex debugger.tex \ format-defs.tex direct-cc.tex pl-bips.tex fd-cstr.tex \ c-interface.tex references.tex tbl-contents.tex the-index.tex \ version_no.tex TRACE= #TRACE=-trace .SUFFIXES: .SUFFIXES: .html .hva .pdf .eps .ps .dvi .aux .toc .idx .tex $(SUFFIXES) help: @echo @echo '*** Please read the README file ***' @echo @echo 'make all make DVI, PDF, PostScript, HTML and CHM versions' @echo 'make dvi make DVI version (needs LaTeX2e)' @echo 'make pdf make PDF version (needs pdflatex)' @echo 'make ps make PostScript version (needs dvips)' @echo 'make html make HTML versions (needs HeVeA)' @echo 'make chm make HTMLHelp version (needs hhc - Win32 only)' @echo @echo 'make clean remove all temporary files' @echo 'make distclean remove all versions and auxiliary files' @echo 'make clean-all remove all versions' @echo @echo 'make help this help' @echo .eps.pdf: epstopdf $< # ps2pdf $< $@ all: dvi pdf ps html chm dvi: $(DVINAME) $(DVINAME): $(TEX_SRC) compil-scheme.eps debug-box.eps do_latex -dvi $(TRACE) $(MAIN) pdf: $(PDFNAME) $(PDFNAME): $(TEX_SRC) compil-scheme.pdf debug-box.pdf do_latex -pdf $(TRACE) $(MAIN) ps: $(PSNAME) $(PSNAME): $(DVINAME) dvips -o $(PSNAME) -D 300 $(DVINAME) html: $(HTMLNAME) html_node/index.html $(HTMLNAME): custom.hva $(TEX_SRC) hevea -O -s -exec xxdate.exe -fix custom.hva $(MAIN) -o $(HTMLNAME) html_node/index.html: $(HTMLNAME) rm -f html_node/index.html html_node/$(PREFIX)*.html (cd html_node && hacha -hrf -tocbis ../$(HTMLNAME) && ./hh_do_hhc_hhk $(PREFIX)) chm: $(CHMNAME) $(CHMNAME): $(HTMLNAME) html_node/hh-$(PREFIX).hhp html_node/index.html -(cd html_node; hhc hh-$(PREFIX).hhp; mv -f $(CHMNAME) ..) 2>/dev/null || exit 0 clean: rm -f $(PREFIX).aux $(PREFIX).toc $(PREFIX).ind $(PREFIX).idx $(PREFIX).log $(PREFIX).out $(PREFIX).ilg rm -f $(PREFIX).pdf.aux $(PREFIX).pdf.toc $(PREFIX).pdf.ind $(PREFIX).pdf.idx rm -f $(PREFIX).dvi.aux $(PREFIX).dvi.toc $(PREFIX).dvi.ind $(PREFIX).dvi.idx rm -rf $(PREFIX)*.htoc $(PREFIX)*.haux $(PREFIX)*.hind $(PREFIX)*.hrf distclean: clean-full clean-all: distclean rm -f $(DVINAME) $(PDFNAME) $(PSNAME) $(CHMNAME) rm -f $(HTMLNAME) html_node/$(PREFIX)*.html html_node/index.html (cd html_node ; rm -f *.hhc *.hhk *.css *.hrf *.gif *.html) clean-aux: rm -f *.aux *.toc *.ind *.idx *.log *.haux *.htoc *.hidx *.hind *.out *.ilg *.hrf clean-full: clean-all clean-aux clean-test: rm -f ?.dvi ?.pdf ?.html ?.ps ?.info ?.txt rm -f ?.aux ?.toc ?.idx ?.ind ?.log rm -f ?.haux ?.htoc ?.hidx ?.hind ?.out ?.ilg ?.hrf # create compressed formats for DVI and HTML in 1 page and HTML 1 page / node COPY_PATH=/tmp DVITGZNAME=$(DVINAME).tar.gz HTMLTGZNAME=$(HTMLNAME).tar.gz HTMLNODETGZNAME=$(PREFIX).html_node.tar.gz copy: $(DVINAME) $(PSNAME) $(PDFNAME) $(HTMLNAME) $(CHMNAME) names cp $(DVINAME) $(EPS) $(PSNAME) $(PDFNAME) $(HTMLNAME) $(GIF) $(CHMNAME) $(COPY_PATH)/. tar cf - $(DVINAME) $(EPS) | gzip > $(COPY_PATH)/$(DVITGZNAME) tar cf - $(HTMLNAME) $(GIF) | gzip > $(COPY_PATH)/$(HTMLTGZNAME) ( cd html_node ; tar cf - index.html $(PREFIX)*.html $(PREFIX)*.css *.gif | gzip > $(COPY_PATH)/$(HTMLNODETGZNAME) ) NAMES_FILE=$(COPY_PATH)/doc_names names: @echo '# file generated by doc/Makefile' >$(NAMES_FILE) @echo "PREFIX=$(PREFIX)" >>$(NAMES_FILE) @echo "DVINAME=$(DVINAME)" >>$(NAMES_FILE) @echo "PDFNAME=$(PDFNAME)" >>$(NAMES_FILE) @echo "PSNAME=$(PSNAME)" >>$(NAMES_FILE) @echo "HTMLNAME=$(HTMLNAME)" >>$(NAMES_FILE) @echo "CHMNAME=$(CHMNAME)" >>$(NAMES_FILE) @echo "GIF='$(GIF)'" >>$(NAMES_FILE) @echo "EPS='$(EPS)'" >>$(NAMES_FILE) @echo "DVITGZNAME=$(DVITGZNAME)" >>$(NAMES_FILE) @echo "HTMLTGZNAME=$(HTMLTGZNAME)" >>$(NAMES_FILE) @echo "HTMLNODETGZNAME=$(HTMLNODETGZNAME)" >>$(NAMES_FILE) for-release: all dist-dvi dist-html names ./gprolog-1.3.0/doc/packages.tex0000644004425400513100000000136710547152501015045 0ustar diazloco\newif\ifpdf \ifx\pdfoutput\undefined \pdffalse % we are not running PDFLaTeX \else \ifnum\pdfoutput=0 \pdffalse % we are not running PDFLaTeX \else \pdfoutput=1 \pdftrue % we are running PDFLaTeX \fi \fi \documentclass[twoside]{article} \usepackage{hevea} \usepackage{a4} \usepackage{calc} \usepackage{multicol} \usepackage{tabularx} \usepackage{makeidx} \usepackage{ifthen} \usepackage{fancyhdr} \ifpdf \usepackage[pdftex]{graphicx} \usepackage[pdftex=true]{hyperref} \hypersetup{% pdftitle = {GNU-Prolog Manual}, pdfsubject = {GNU-Prolog Manual}, pdfkeywords = {GNU-Prolog, Prolog, Finite Domain Constraints}, pdfauthor = {Daniel Diaz} } \else \usepackage[dvips]{graphics} \usepackage{epsfig} \fi ./gprolog-1.3.0/doc/tbl-contents.tex0000644004425400513100000000013010547152501015666 0ustar diazloco\newpage \setlength{\parskip}{0pt} \tableofcontents \setlength{\parskip}{\saveparskip} ./gprolog-1.3.0/doc/intro.tex0000644004425400513100000001143610547152501014420 0ustar diazloco\newpage \section{Introduction} GNU Prolog \cite{gnu-prolog} is a free Prolog compiler with constraint solving over finite domains developed by \MyUrl{http://pauillac.inria.fr/\~{}diaz}{Daniel Diaz}. For recent information about GNU Prolog please consult \MyUrl{http://www.gnu.org/software/prolog}{the GNU Prolog page}. \index{Warren Abstract Machine|see {WAM}} GNU Prolog is a Prolog compiler based on the Warren Abstract Machine (\IdxD{WAM}) \cite{Warren83,Ait-Kaci91}. It first compiles a Prolog program to a WAM file which is then translated to a low-level machine independent language called \Idx{mini-assembly} specifically designed for GNU Prolog. The resulting file is then translated to the assembly language of the target machine (from which an object is obtained). This allows GNU Prolog to produce a native stand alone executable from a Prolog source (similarly to what does a C compiler from a C program). The main advantage of this compilation scheme is to produce native code and to be fast. Another interesting feature is that executables are small. Indeed, the code of most unused built-in predicates is not included in the executables at link-time. A lot of work has been devoted to the ISO compatibility. Indeed, GNU Prolog is very close to the \MyUrl{http://www.logic-programming.org/prolog\_std.html}{ISO standard for Prolog} \cite{iso-part1}. GNU Prolog also offers various extensions very useful in practice (global variables, OS interface, sockets,...). In particular, GNU Prolog contains an efficient constraint solver over Finite Domains (FD). This opens contraint logic pogramming to the user combining the power of constraint programming to the declarativity of logic programming. The key feature of the GNU Prolog solver is the use of a single (low-level) primitive to define all (high-level) FD constraints. There are many advantages of this approach: constraints can be compiled, the user can define his own constraints (in terms of the primitive), the solver is open and extensible (as opposed to black-box solvers like CHIP),\ldots Moreover, the GNU Prolog solver is rather efficient, often more than commercial solvers. GNU Prolog is inspired from two systems developed by the same author: \begin{itemize} \item \texttt{wamcc}: a Prolog to C compiler \cite{wamcc}. the key point of \texttt{wamcc} was its ability to produce stand alone executables using an original compilation scheme: the translation of Prolog to C via the WAM. Its drawback was the time needed by \texttt{gcc} to compile the produced sources. GNU Prolog can also produce stand alone executables but using a faster compilation scheme. \item \texttt{clp(FD)}: a constraint programming language over FD \cite{long-clp-fd}. Its key feature was the use of a single primitive to define FD constraints. GNU Prolog is based on the same idea but offers an extended constraint definition language. In comparison to \texttt{clp(FD)}, GNU Prolog offers new predefined constraints, new predefined heuristics, reified constraints,\ldots \end{itemize} Here are some features of GNU Prolog: \begin{itemize} \item Prolog system: \begin{itemize} \item conforms to the ISO standard for Prolog (floating point numbers, streams, dynamic code,\dots). \item a lot of extensions: global variables, definite clause grammars (DCG), sockets interface, operating system interface,\ldots \item more than 300 Prolog built-in predicates. \item Prolog debugger and a low-level WAM debugger. \item line editing facility under the interactive interpreter with completion on atoms. \item powerful bidirectional interface between Prolog and C. \end{itemize} \item Compiler: \begin{itemize} \item native-code compiler producing stand alone executables. \item simple command-line compiler accepting a wide variety of files: Prolog files, C files, WAM files,\ldots \item direct generation of assembly code 15 times faster than \texttt{wamcc} + \texttt{gcc}. \item most of unused built-in predicates are not linked (to reduce the size of the executables). \item compiled predicates (native-code) as fast as \texttt{wamcmcc} on average. \item consulted predicates (byte-code) 5 times faster than \texttt{wamcc}. \end{itemize} \item Constraint solver: \begin {itemize} \item FD variables well integrated into the Prolog environment (full compatibility with Prolog variables and integers). No need for explicit FD declarations. \item very efficient FD solver (comparable to commercial solvers). \item high-level constraints can be described in terms of simple primitives. \item a lot of predefined constraints: arithmetic constraints, boolean constraints, symbolic constraints, reified constraints,\ldots \item several predefined enumeration heuristics. \item the user can define his own new constraints. \item more than 50 FD built-in constraints/predicates. \end{itemize} \end{itemize} ./gprolog-1.3.0/doc/gprolog.tex0000644004425400513100000000007210547152501014730 0ustar diazloco\input{packages.tex} \input{macros.tex} \input{body.tex} ./gprolog-1.3.0/doc/compil-scheme.gif0000644004425400513100000001052110542447571015762 0ustar diazlocoGIF89aÁ>€ÿÿÿ!þMade with GIMP!ù ,Á>þŒ©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇòL×öçúÎ÷þ ‡Ä¢ñˆL*—̦ó J§ÔªõŠÍªÜ®÷ ‹Çd®öŒ¶‚æ`÷NËçÍx Ý°ô7>ý¤ç—@¸a8ƒ¸È˜xÐu‡g‡Y¡“ÙÈÙ‰òeÐ&JzWº©€ê¢êÙêÊáGy:kZKÁÊ‚ûºË‹™úH;jy¡»Õ{ŒŒ \+,K —,=íù8)):xé«SL ^Í<ñý)Žž]Z­þ_Í a~RŸÏŽs¯ï¯ÞDÀ© ´¦PÁ…‹FÍ;´ÂË‚I +ÎYæ&ÅÃþBÖ,zÌ‚ÄÁ<º6~Mµj,ŽW»~ÑúµìÙ´‰Ø½;·îݸkûÕw_à>ˆ û÷x^ã<˜+—æÜÛó¹ÑsTŸÎëzìlµÛðÎ=sòðaÁÓ0Ož‘cË¡D¯J66¶öçá_•O)[}ûMþ•ª¬4Ÿ% H )Tñ×_PúѧTGýÇ,2UÕO "ÕYi¨áRM8T… :x¡€ê§’‡ ¢S ^ 6þgà-î$âV­‘á5ktè‹7j!¢BÉÚ‹E‰¤"D“MR!e UNÅ•aù‘–Æpi‘—æxd.$æ9g¢iæšÿ¤i›Áir agNwú“gP{òÙæŸððFh¡†Ú§ ®$ªh[Œ6zÖ£–7©œ’VjÕ¥˜R¸é™švŠ#¨XJ&ꤖڢ{¨Ú§êªéµêjx°ÆÊݧ´Vdë­lêÊk¯3! ,¾òa{ƒ´tþWIî Û9òq‰ikÕ+³ÄŒxì6 â$µÍÞUK¶É­uÞ6Ä!¹ã#K1BV{nR5nÓ‘CÓ²±l¼tXHŽQR½d®¾ƒí-;Ï”ËÀ‹e>ÉÛ­Â'½+1JWÜe¾3tñƸjì1AÆ%$nÈsødD¢Qdò¾¿dô *P¶|FH6ÖY¼4“å`~Ⱥ[‚´;/lS3÷v•òÐÐÕdìˆìt2O%‹PÒQKÍtÏF'uàÕK (£±@y¥³×Ký³ÙÔ¹û¯Ú‘~—ÛzÙ5‘Üœ•m·Ëy_†÷Þ.ú=Y߀98c§Øáˆÿ†öâý5î8Q³FþnÖä”Sz¹`‚gÅæœ.[°¢Ž(èÅjzÂ<¥Þê¬Sëú뎬.»êêÕnû·¸ÃNûîûÝîûﺯI–[M< Þñ›Kò2,ïô–Î+/é¢ ¤ŒæyÓS_½³žª}´BynòùÛ7=Ã,e?ó‡ß[鯀=·ïtŠ(“äüïÕ?#üݯGûë^Ýü×¼ú1ìG'Jüâ—ô…L‚HCà˜zgA5/ƒƒ»Š$„"ìKˆ¼@Ppc+„ AxÂÞlƒ2a k(¡âpE$ÜaÕtèÃk‘nˆD¤[SsD|´0‰zbâ œ%BцStKþrE+fŠÛbv èÅÊH1Œ1 Ñp¼3ªÐŒj$\‘1Æ7J Žr¬£÷¨2dÁ¢ˆÁ KG™‚É/wsŠ˜wÔÅ þM|ëÇ ÙÈ­ñ/ ØCÑI’6±1¨’>bWôè²7Aò‡ aä Iùâ퀪 †+·¶J€Rd£|ÚÁ¤­¥ Ô¥‰RùJg°g+zôQ+a ÕPŽTÆ0KÌhº™Ô\Ç1ÛV²\n²”× *·ó±f6ò–K¤*E°•T˜ÔÄfÖ®i¯vìÛÕ,ŸV²q\ê\—”£Ó‘©(Wú›¾ô;‹qˆ`Ã#SîT#A=Úr^FŘ̓e$êRÉéÌ;ÂfsLf’ 9Cœa"‰ÙVÙÈÐÃPU š¦&¦¤Ž–)hÊÌ!RA™Q¡vî•¥MÄH  êJÌW@ -T S#f$“Ú?ïŸÿ´¨$ FQ&8v[v5!]~ú¼Sh…®’ìf>…É<¾3žmÍ*uRø¿¶9V*ží¸‹„ =l°SAìi÷paz³±œUíh½IǪ’-qAOŠþ*[‚*7lbßl¹Š®ubýP¦„ÖOÍÑÓ•šUÜ3¹ï®ÊˆX/yó)±à^„…µQïoÚË^Ú¸w8ðÅØ|ÑX±D‚F¿¾âïÝÀ8,èBFÀãnâ <)ÁRpOÜàúæWÂ饰EøÇ g¸fîð‰ D²ös4<éˆãsâȤ8S+–l‹9â,½Xr3¦dCã¹æÅ;VqYücÆVr0jCsc'´™u£S¹×4ðÑ·È%šbˆ:‘Ž ÄÃ%—Ã4LV¨f[ “9·êA ¤©0hŒÇ«âìËe-_ŠÛ)—’ù²žm‹þd,o2—g†Zšó¼=0š^<2•ÊŒ”M2NïE´/i4>úüDŽžÂz|vÉ*SzÊd[ØHVÒbY×+dt_QdRCã¹ÄN²GŸËå;_6ÉFâµLÔë9`sÙƒµ¦õmýè!ÓXÙ6f6Ž‘íi_[LÚCv¥¡-bg+™Úxâ¶G¬}elWÎÛ‚ w8Å­ctóXÝ>f7Ý-dx™Ø–·ä<Œï>)ßü6”©,,°û¶zÂòïl¾ë‚ÛàúBx¸+¬p‚<¿þ/œ¯[ñÍø·W'LÇ1îp5@XQ?pÈ+7ò˦\P'/6Ä'¾ðˆ_˜xl>D¿sãÇþ›Ÿ÷1‚äá2 óóŽ®Ú§ö4ªpqªÄ oµÊcÝ£Ïú×ý VËåé¹aמË¿¼ízk+Ë»¦Ò´¡Yl‰J^æTž•:Ø…§Ò±ÃõŽ^¿²6µ–ÍÈÒÓ¥@G:¾ÚXGÛ뤕æ¤ÉŽõ¸'•=%lC“h(#T nÞìa­.öÅsé¿ÕsËãŠVÌ]ôÎäFr‘»ò…}“ô3Õ¯z×Ë^÷9å»í•žp·[6EeèîË|8܃ ³OÎòÖ“Þü6?ÿØÓ_}ZÉ¢|Ÿk•hï¦A}Ö·ç¹¶WRi5×Û×">|x½¾j [è¹þË:RŠ g){t@{þ«),p­Jí§¨qz:r-¸ÅÕ] xm6×)ÝÓ}¸R]ÆGrlct޲]ÈrpÓ\æ%3X`ÂòV(‚åp /Ù'c1sg,ø‚.ø*xo¸66¸'÷zÇ+8xƒGƒ)„8’zÝQ„–r„(7„σ/ׄ ³„ñ6s¤sUØûf…Y8P ¨BGoø…ƒgo!bn§£m¿R†=n‡6†±•†Š×…N†ôw†Kò†­‡—‡l8‡+؆ÛV‡¶q‡7e<ÐâƒÁ†Ü3f\H-TCzÈ>È}õLJßáˆM$g“xxÖþitXF cg&Âi{ÆgÄ]ˆP¢fLYÑh µfôk¬…ÿA•‡\¯†H0jÌ€b¨‰ò i±Xgà§‹ƒ¶jtW‰B§=Æä\­ˆ-Šògb©‰ ÂWTÇtÐ(xÈ8kä·v»dˆóòŒ{^X›h>Á(ŽÅXL“†]æV™&ß'@ü²Wª˜Ó¸tèkê˜hìˆ!½TuÔ7ˆŠÌh?¨vk¡8ÉP&fªöfÉÅ#tf³H?Xm–heÉø¨xÕ‘ ô‡½’IèBŒø‘æ˜{ W’v¨‘“Q2ˆCµ’r¸‡Ý˜“.·“Ù’õÖ‡$”O°†:þù“9”÷Q“³Ç’>y“ø”©7P9•R¹^8y”F¨…[Ƀ‘Á•_9’Mù]É,a©†’x]g–ïÆsh9^ †’®²–*—·2—sv—*ydi7yisu™‚|)2né1:ø&„I3ˆI,€™˜ŒYŠé5‰F’©6”)rŽÙ—ƒ"˜ß³„›iA*è™S˜%–)š…è—Fš¥Ùˆ˜Y;8Ç©ù:†IŠgš>tq°Y‹¬ÉqZ· E%¸Y–«ikÇø<Ày.æ0À¡›¹Öš’'i÷cF²Yz8œ§É7‘ÅXna ˆ|Öy7eyÕ—·izÑç?mW^É d©_e!þ¸Óv…G¡Wv;Çéò%y $Xl´d{´œ—óŸù‰ù "J’Ò÷3úo´(=A2ªù zj Z˜´8*e:R¥Ithö%gÈj*¢&¸z¢bÓOßX¢ º¢ÕunÅ¡+ ÛØ‹£2êN`… ;êO`öXÚW£'Z€a3|! ¤M£K *ê¤PjkQš©gœTº‰ˆ¥ÞàŸº¥Ø'‹µù¥zucj¦gÚƒh ”jšnlÚ¦nÚnp§r*…tz6v:§xê†zJIbʧdê¥Ê5ÊAW*¨y¨F¨‰*~Œª†Ž “*©B–Z¨šEyþa˜jGšZGœ*GžúF ÚF¢ªF¤zF¦JF¨FªêErñŠ$±e:¥äg¢3ÇÒ˜„:%·ªˆÁ¨h¹&RDj«³”wI¼H£Ãº}Åê«Úˆ —©ÄÊŽBŒÏzy›*­$²iØ9:ªleDg¿ôž÷‰­3i›KI…êZ¨ìšA¬ºEðšEòzEôZEö:Eø EúêDüÊDþšD{D•Ê•“Ú¨Ë{Ëz ëw ˤ |»¡›°û¤k‰† ±åб ¢«Ÿ¹¨«±;²$Û±{²Jš²+˲-ë²Ýu…³n#›+5ìé§»9%[]ú±¶ç›þ´ +ž1PÅu×ú6¼Jœ‹b¥ÇõwYJ¢ÖY¼ù³*ëUpT«È˜ ²Pè$>W«TOÛ´`³ÊxtÃ(Q ÚYa+.HÊ­¿TŠbûYC‹{ÕÊ€óÙ¡l‡â¶é‡wBšLH[¹9‚»`ˆ;-ù¤}+£Ï’w랬(µÓVŸaª*w»žÇ“HªñÉZq6QÕTQÓ²U «ö™’Çðe*÷¹Z Uf…¤»MÜe¹Mº[[v™gw\‚´¼„¤ããŠÅ»lº»(¼ûˆt;\—¤ ЏÌÛDÎû¢SÛu‚5Ê ®z ¹”ˆµm6FÊ©q>£výègP½þЪkÎ5¾Ô‹¡‹žm[w׋µ»•âiZm ‚³OåÄ·ÍÐq?º <[¤:ºGw%|Œ‹”®…^¶;£ÑÛ¾Ú“Ú‹€ r|+¤­ŸØk®£Ö ä{Á‡ur¦8[¥(Àš†z'€Ü "¼nçQÚ#|ö»—æSÏiÀI9Âèº~)ùuõ»¸ítNµ›€,Ü+¾† °¸_7¹Àj½Q‹Äf ¿‘{LY³M<£¥ûµS¼ºUì®$:¿€ûW/“Å^|Æz ˆJlÅn¬G¹Ø#qL[ÖSÀ•7©I;ÌÃû»»pL+<½Ä—‚T¦µ€ÈdkŠLqîÇECËB>«D’¬'45›³ˆ‹³|L&®)³®û²Ÿ Ê¡,Ê£LÊ¥lʧŒÊ©¬Ê«ì+;./gprolog-1.3.0/doc/debug-box.eps0000644004425400513100000001103606665443302015134 0ustar diazloco%!PS-Adobe-2.0 EPSF-2.0 %%Title: fig2.eps %%Creator: fig2dev Version 3.2 Patchlevel 1 %%CreationDate: Fri Feb 19 13:34:02 1999 %%For: aude@borba.inria.fr (Jean-Christophe Aude) %%Orientation: Portrait %%BoundingBox: 0 0 283 88 %%Pages: 0 %%BeginSetup %%EndSetup %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save -152.0 249.0 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog $F2psBegin 10 setmiterlimit n -1000 5149 m -1000 -1000 l 8238 -1000 l 8238 5149 l cp clip 0.06000 0.06000 sc % Polyline 7.500 slw n 4200 2700 m 6000 2700 l 6000 3600 l 4200 3600 l cp gs col0 s gr /Times-Roman ff 180.00 scf sf 4747 3195 m gs 1 -1 sc (predicate) col0 sh gr % Polyline gs clippath 4080 2820 m 4200 2850 l 4080 2880 l 4215 2880 l 4215 2820 l cp clip n 3375 2850 m 4200 2850 l gs col0 s gr gr % arrowhead n 4080 2820 m 4200 2850 l 4080 2880 l 4080 2850 l 4080 2820 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 6705 2820 m 6825 2850 l 6705 2880 l 6840 2880 l 6840 2820 l cp clip n 6000 2850 m 6825 2850 l gs col0 s gr gr % arrowhead n 6705 2820 m 6825 2850 l 6705 2880 l 6705 2850 l 6705 2820 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3495 3480 m 3375 3450 l 3495 3420 l 3360 3420 l 3360 3480 l cp clip n 4200 3450 m 3375 3450 l gs col0 s gr gr % arrowhead n 3495 3480 m 3375 3450 l 3495 3420 l 3495 3450 l 3495 3480 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3495 4080 m 3375 4050 l 3495 4020 l 3360 4020 l 3360 4080 l cp clip n 5100 3600 m 5100 4050 l 3375 4050 l gs col0 s gr gr % arrowhead n 3495 4080 m 3375 4050 l 3495 4020 l 3495 4050 l 3495 4080 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 6120 3480 m 6000 3450 l 6120 3420 l 5985 3420 l 5985 3480 l cp clip n 6825 3450 m 6000 3450 l gs col0 s gr gr % arrowhead n 6120 3480 m 6000 3450 l 6120 3420 l 6120 3450 l 6120 3480 l cp gs 0.00 setgray ef gr col0 s /Times-Roman ff 180.00 scf sf 6900 3495 m gs 1 -1 sc (redo) col0 sh gr /Times-Roman ff 180.00 scf sf 6900 2895 m gs 1 -1 sc (exit) col0 sh gr /Times-Roman ff 180.00 scf sf 3300 2910 m gs 1 -1 sc (call) dup sw pop neg 0 rm col0 sh gr /Times-Roman ff 180.00 scf sf 3300 3495 m gs 1 -1 sc (fail) dup sw pop neg 0 rm col0 sh gr /Times-Roman ff 180.00 scf sf 3300 4095 m gs 1 -1 sc (exception) dup sw pop neg 0 rm col0 sh gr $F2psEnd rs ./gprolog-1.3.0/doc/acknow.tex0000644004425400513100000000503210547152501014542 0ustar diazloco\newpage \section{Acknowledgements} I would like to thank the \MyUrl{http://panoramix.univ-paris1.fr/CRINFO/} {department of computing science} at the university of Paris 1 for allowing me the time and freedom necessary to achieve this project. I am grateful to the members of the \MyUrl{http://loco.inria.fr/}{Loco project} at \MyUrl{http://www.inria.fr/Unites/ROCQUENCOURT-eng.html} {INRIA Rocquencourt} for their encouragement. Their involvement in this work led to useful feedback and exchange. I would particularly like to thank \MyUrl{http://www.sju.edu/\Tilde{jhodgson}}{Jonathan Hodgson} for the time and effort he put into the proofreading of this manual. His suggestions, both regarding ISO technical aspects as well as the language in which it was expressed, proved invaluable. The on-line HTML version of this document was created using \MyUrl{http://pauillac.inria.fr/\Tilde{maranget}/hevea/}{\hevea} developed by Luc Maranget who kindly devoted so much of his time extending the capabilities of {\hevea} in order to handle such a sizeable manual. Jean-Christophe Aude kindly improved the visual aspect of both the illustrations and the GNU Prolog web pages. Thanks to Richard A. O'Keefe for his advice regarding the implementation of some Prolog built-in predicates and for suggesting me the in-place installation feature. Many thanks to the following contributors: \begin{itemize} \item \MyEMail{ax@apax.net}{Alexander Diemand} for his initial port to alpha/linux. \item \MyEMail{clive@laluna.demon.co.uk}{Clive Cox} and \MyUrl{http://www.rano.org/}{Edmund Grimley Evans} for their port to ix86/SCO. \item \MyEMail{nollinge@ens-lyon.fr}{Nicolas Ollinger} to for his port to ix86/FreeBSD. \item \MyEMail{brook@nmsu.edu}{Brook Milligan} for his port to ix86/NetBSD and for general configuration improvements. \item \MyUrl{http://www.speech.sri.com/people/stolcke/}{Andreas Stolcke} for his port to ix86/Solaris. \item \MyEMail{spratt@alum.mit.edu}{Lindsey Spratt} for his port to powerpc/Darwin (MacOS X). \item \MyEMail{gbeauchesne@mandrakesoft.com}{Gwenol\'{e} Beauchesne} for his port to x86\_64/Linux. \item \MyEMail{jtb@netbsd.org}{Jason Beegan} for his port to sparc/NetBSD and to powerpc/NetBSD. \item \MyEMail{csrabak@ig.com.br}{Cesar Rabak} for his initial port to ix86/MinGW. \end{itemize} Many thanks to all those people at \MyUrl{http://www.gnu.org}{GNU} who helped me to finalize the GNU Prolog project. Finally, I would like to thank everybody who tested preliminary releases and helped me to put the finishing touches to this system. ./gprolog-1.3.0/doc/hevea.sty0000644004425400513100000000560010530564311014366 0ustar diazloco% hevea : hevea.sty % This is a very basic style file for latex document to be processed % with hevea. It contains definitions of LaTeX environment which are % processed in a special way by the translator. % Mostly : % - latexonly, not processed by hevea, processed by latex. % - htmlonly , the reverse. % - rawhtml, to include raw HTML in hevea output. % - toimage, to send text to the image file. % The package also provides hevea logos, html related commands (ahref % etc.), void cutting and image commands. \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{hevea}[2002/01/11] \RequirePackage{comment} \newif\ifhevea\heveafalse \@ifundefined{ifimagen}{\newif\ifimagen\imagenfalse} \makeatletter% \newcommand{\heveasmup}[2]{% \raise #1\hbox{$\m@th$% \csname S@\f@size\endcsname \fontsize\sf@size 0% \math@fontsfalse\selectfont #2% }}% \DeclareRobustCommand{\hevea}{H\kern-.15em\heveasmup{.2ex}{E}\kern-.15emV\kern-.15em\heveasmup{.2ex}{E}\kern-.15emA}% \DeclareRobustCommand{\hacha}{H\kern-.15em\heveasmup{.2ex}{A}\kern-.15emC\kern-.1em\heveasmup{.2ex}{H}\kern-.15emA}% \DeclareRobustCommand{\html}{\protect\heveasmup{0.ex}{HTML}} %%%%%%%%% Hyperlinks hevea style \newcommand{\ahref}[2]{{#2}} \newcommand{\ahrefloc}[2]{{#2}} \newcommand{\aname}[2]{{#2}} \newcommand{\ahrefurl}[1]{\texttt{#1}} \newcommand{\footahref}[2]{#2\footnote{\texttt{#1}}} \newcommand{\mailto}[1]{\texttt{#1}} \newcommand{\imgsrc}[2][]{} \newcommand{\home}[1]{\protect\raisebox{-.75ex}{\char126}#1} \AtBeginDocument {\@ifundefined{url} {%url package is not loaded \let\url\ahref\let\oneurl\ahrefurl\let\footurl\footahref} {}} %% Void cutting instructions \newcounter{cuttingdepth} \newcommand{\tocnumber}{} \newcommand{\notocnumber}{} \newcommand{\cuttingunit}{} \newcommand{\cutdef}[2][]{} \newcommand{\cuthere}[2]{} \newcommand{\cutend}{} \newcommand{\htmlhead}[1]{} \newcommand{\htmlfoot}[1]{} \newcommand{\htmlprefix}[1]{} \newenvironment{cutflow}[1]{}{} \newcommand{\cutname}[1]{} \newcommand{\toplinks}[3]{} %%%% Html only \excludecomment{rawhtml} \newcommand{\rawhtmlinput}[1]{} \excludecomment{htmlonly} %%%% Latex only \newenvironment{latexonly}{}{} \newenvironment{verblatex}{}{} %%%% Image file stuff \def\toimage{\endgroup} \def\endtoimage{\begingroup\def\@currenvir{toimage}} \def\verbimage{\endgroup} \def\endverbimage{\begingroup\def\@currenvir{verbimage}} \newcommand{\imageflush}[1][]{} %%% Bgcolor definition \newsavebox{\@bgcolorbin} \newenvironment{bgcolor}[2][] {\newcommand{\@mycolor}{#2}\begin{lrbox}{\@bgcolorbin}\vbox\bgroup} {\egroup\end{lrbox}% \begin{flushleft}% \colorbox{\@mycolor}{\usebox{\@bgcolorbin}}% \end{flushleft}} %%% Style sheets macros, defined as no-ops \newcommand{\newstyle}[2]{} \newcommand{\addstyle}[1]{} \newcommand{\setenvclass}[2]{} \newcommand{\getenvclass}[1]{} \newcommand{\loadcssfile}[1]{} \newenvironment{divstyle}[1]{}{} \newenvironment{cellstyle}[2]{}{} %%% Postlude \makeatother ./gprolog-1.3.0/doc/gprolog.chm0000755004425400513100000124440410547155142014720 0ustar diazlocoITSF`›_‹3 ý|ª{О  É"æìý|ª{О  É"æì`xTÌþIITSPT ÿÿÿÿÿÿÿÿ j’].!Ðù É"æìTÿÿÿÿÿÿÿÿÿÿÿÿPMGL¸ÿÿÿÿÿÿÿÿ//#IDXHDRë©s /#ITBITS /#STRINGSíšVøZ/#SYSTEM„n¡*/#TOPICSëÉs¹/#URLSTRì­Wì/#URLTBLì‚sªd /#WINDOWSݽ>L /$FIftiMainàý!ЬR /$OBJINSTàçb•?/$WWAssociativeLinks//$WWAssociativeLinks/Propertyàç^/$WWKeywordLinks//$WWKeywordLinks/BTreeÝ¿ ‚àL/$WWKeywordLinks/DataàŸVÆ>/$WWKeywordLinks/Mapàæ*/$WWKeywordLinks/Propertyàç> /contents_motif.gifݯ‚< /gprolog.cssݳ{‰C/gprolog001.htmlÚÉ‚ã?/gprolog002.html˜©; b/gprolog003.html˜Ê´O/gprolog004.html˜þl‘/gprolog005.html™”9/gprolog006.html™¤A‚‘/gprolog007.html›µW¨ /gprolog008.html›Ýw‚ž~/gprolog009.htmlüu/gprolog010.htmlžŠ/gprolog011.htmlž—˜/gprolog012.htmlž°±'/gprolog013.htmlžá?•</gprolog014.htmlžö{Â/gprolog015.htmlŸ¹©w/gprolog016.htmlŸã ./gprolog017.htmlŸò8/gprolog018.html ?Êv/gprolog019.html Ì5ûr/gprolog020.html¡È'”q/gprolog021.html¡ÝøN/gprolog022.html¢ÕfÛ~/gprolog023.html£±d¥!/gprolog024.html¤× _/gprolog025.html¤÷dšT/gprolog026.html¥’8®N/gprolog027.html¥Á÷y/gprolog028.html¦¸å@/gprolog029.html§ž?¬w/gprolog030.html¨Ë6ˆ/gprolog031.html©ÓQËL/gprolog032.htmlªŸÁq/gprolog033.htmlªá…¢_/gprolog034.html°ƒmr/gprolog035.html±…_Äj/gprolog036.html²ÊIó5/gprolog037.html³½~„³R/gprolog038.html·ñP†a/gprolog039.html¸ø1¾\/gprolog040.html¹· Ä/gprolog041.html¹û ái/gprolog042.htmlºÝ ‚¨`/gprolog043.html½…iàz/gprolog044.html½æcçz/gprolog045.html¿Î]«#/gprolog046.htmlÀúÑ)/gprolog047.htmlÁË)³/gprolog048.htmlÁþF¾>/gprolog049.html½Ð]/gprolog050.htmlÃa„î$/gprolog051.htmlÇüÌB/gprolog052.htmlÉÈGº/gprolog053.htmlÊ‚X¥0/gprolog054.htmlʨ¥j/gprolog055.htmlÊÍrÆ/gprolog056.htmlË” ©M/gprolog057.html˽X¿/gprolog058.htmlËüY’/gprolog059.htmlÌŽ[±/gprolog060.htmlÌ¿lë/gprolog061.htmlͪró/gprolog062.htmlÎsüK/gprolog063.htmlÏš>¼!/gprolog064.htmlÏÖ_ z/gprolog065.htmlÏ÷YQ/gprolog066.htmlЕ*â/gprolog067.htmlÑ÷E©/gprolog068.htmlÓ MáH/gprolog069.htmlÔ‚ã./gprolog070.htmlÔåC´j/gprolog071.htmlÕš-žf/hh-gprolog.hhcŒ |„V/hh-gprolog.hhk¾R‡êi /index.htmlŒˆ?˜=/manual-idx.htmlÕ¹…s/next_motif.gifݱ>‚=/previous_motif.gifݬE‚=::DataSpace/NameList<(::DataSpace/Storage/MSCompressed/Content¦”Ê ,::DataSpace/Storage/MSCompressed/ControlDataj)::DataSpace/Storage/MSCompressed/SpanInfob/::DataSpace/Storage/MSCompressed/Transform/List<&_::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/i::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/ResetTableƒh [ìw‘©3¾HÓ_ìy Ž>h Uncompressed MSCompressed{7FC28940-9D31-11D0°‰LZXC8(°‰ %€Ô ަ"ì)t2 9ÒJtVÜ_,g¾oTvÔ“à©zÊöÞ`ö˜–)¨>ªQò^¨dJsz{¸Ž†›f°ȼlÒ¼â¼ô6ÿ Úâ%6lI~T€pæ…T¡À­»ðË*äfùd3ž•jüžcfȰª" aÚœE HHA Version 4.74.8702$ Þüˆ3í/Ç index.htmlGNU Prolog Manualgprolog mainwindow"Á˜Š  T#SMý.Èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ3D@2oen‘x×êMeËw?<-’#›oÆQmÓææ%CG‹á@œýJÿFÊDjÑhàì»ïî–ðI:d†¿Š{(¥Öc|[ØdçW}Ùã½%ôl»—¿)ðd¿?| g\^¡1„_œ;~d4r•é›=ܦ›šf²m}`0tŠï€TÉ€7Cm»»ÌE‹QH DøZVÅ¥Þ¬¶ÞjÙŒ°+d'ð|gÌì@Íÿ}ßÿ{FøCÞú-£Ð’Zɤfåìþšœ±Ž’›¯Ú nzl•L5evêà¿rÝÍšnKwyF,½’ly¨2s¼ÜAÙI2·ù†è 5ýë/Ü¡jp·&ÔB_ t+3:Úþî\¶µ_6Q®8Õ¡1Ê’…:í¿PšƲð0è¯m¶Á˜>fË]_S‚`ZÄy5°Él˜ifl¡‹em¡šœ(›%‰ùR)²>w\£q‚ÃêAÂôݘðƒ©.ÌHÁÆ|ýÎ冷ÒEÕ/œ“E ïWH]‘ѲœŽ6'´?ä­©0JµA †‡¿dB˽D¨øèxŽóÇõ²hŽÍÍœX(¥÷+5êÿCU-…SCô¿‡5{:A\ª+'qšuã'Dn̆8«¦m†ò76¿Ð‡è´_†U·<‰k†¨íí|Žò7ìuP ŧR½Vjî¶±%Ó¤K"e,Í!¥DÚo¬Z&'¯Çmt‘mŸ´÷ØmZ¨öÚVõ qО&ºèÂ{·ÒfœÃ°ná 3ì“€•5Éf)”Ĭ•fº!íbû¡Y.òE»Wš²ëúq÷%—°@³UÂã‰ÚGûŒ8!O Xû9Ƭž*ß«\i©è`i¹¶ÄöÃ%ßÏ%RÆtS(ôùNÿ»0K.4î©Dµ™k ­¯û8†Í„Èó.ª!‘hpX_çn²ÈCû±m³n Úß±É ó =&ÃrîéµXËæõëá˜)ÊL˜‡áÞ;¼±œÌ¡(P¤Œ“²[lñ†âjhùöœÄfB“å+k”³ ´ÕšÙ Ú„81ÌÁX9ü¢>­·£e‰_VÔ5SúQ›ó>;ì¶™»g£º¶ˆ£+YwŠ7¾(¬e/ìY± аLo*ÃÄêkJv„XÐ4óÒ5ƒ87Õµ§M²’C^«}Ýá2YóÛþ¢Ç™L²+Ûéo[£°ïgÚ/Ý VÅ“zMaµ8º¬{¼2•YÛ£Lz’ÙV6/ÐÏlã£I,Û’L©zUßö ª°'68 Í«^Õwg—›Yn{«£Ï*4³zëc!¿IÝt"ëaê|˜†ÄéÚND¸”ñäÙ;ó¹á°Ó5¬0ÓèøFûŠƒ½¥ÚZż‚›GøzãÙI—<–ö¤lîdû¸$“?ƒaèS“`vâä19Í/aF(…ºHLÍ?ê/&V´s®bz»ÉÿºÀ¥äÁ%¿[^‚$Òuê â$vTìƒïX‹±Ù§ðÕ×~ã¹dŒz±ÊN4ó+¦ã½²÷ôØèBæ¦c{̸ἠ-( Ã!û®Xð.žÂ1-êMV3ƒ,æjÚºhE}Ù,ÃUéÅ Ó½Vexèš>²ßÄHÖ´¢®F/È’¬ve’j×esAN] Ãv&ì*2 W×¢k¤æ±ü<ŒŒrVt¶™&vd–UˆúlfqNÓ+ËÄ›¬;tM~l߯¨˜MƒÑŽAê®®áÜ>·FQ ¡×n:¬Gõ5H¨“ gq{ û/YêP1«ÔÈß&>a—cï_¶…jüý×-Pa_\|äúAÞG2µ!ßèú ‘oëÕóH¹ÌʺVg£\p¡¯(+sne ÷Øqbg.‘%€X´Ïi&¦•èÙ©|ª+¦ª]<þ£2`Ñ›áZEzFg?O·þ¯Bf‰SgëX“Þlue|gÃ* é •§/Ãó™ -¿UÁš‡V/£ä/ †Gèw½õ«Æ;z-p¥)4guÑNzÙlŸuoïÂâ‰ZEèò;Àn 9Cm!L:©©á[…uÌ&Jl15JœÂ šñ=ÑE%¨Á¹‘l…žºUª<“wÌ=½K³úœVëJjsîT#öcñ+¤˜~*†ïÜŽÇd$/0$ªÖªf»doš_aA¨ßÆÜ«tÄyK´ö^’ËüÒ×ÁnZ£ú&ÔWC%ix«¾È/¹û†Õ’ÉÛÁ]‚dRäáñ.ÑpK~swe2û+¢= †ºµ4™x@ Ýï)†8έ]}ˆêFpÍÈ!“kËzIS•Ãìö~ª]쮄êa¸ù:ïk×'EŸcÀös\ò('Ÿ(iÈzƒr¡„jºõ,\U©$ö–]~ßôcU«¾ö}û{kfxz8†i£i[MkθûÞ\ÚŸ¡œÄ,5ö镲0žKÞ<%¹(3a8ÊhTE×ú6yeÁ#é‚´%Zô½éD³U­LšŽ1ú‘щfKW¥ËÊ@<¢‰k{&øHæ¶öÍkélfÕ˜jç›7‚Ô çpÚÞ¥K7Nw‚]U[æÂ¨Åx5ᨈO÷¥âOdC¥{ÓæNÅeì­íÏæÈ䪎õ:KÒ®2…„Òï’V ñ¶cTzÙ=«@Éjä:A¨-^‡­¾ñéÇÇÓì#š“ÙìÁµI<žóðסoL`dd–k ñT\Þ]ŽSqÃà†gåú¹߈Q/1˜K$”!€QQ1Sô&„¼‹—ÑœM9£â©,N¥òŒw 4AŒç•w¢Î0*YÆg[Ÿ·‡bI5´A&ñ·^»èü0*·b/vÆ3†l^EÆc‚5ŠŠÇ±5F³Ú¦¿[°EÅüh,=ÌÔaÉ宨Þ Ь;•aއ鹉§µ:ª¶%:ÁÙØË€ ™šiüLÏïüFÇ( ã7 T]Ëz¸ZÁH3VTÒ'q¾™±)ÊÏßÃ?= Œ@ʾmC½Åz>@M<ë‘SLßë{”Eô‰íä)àþô8Ìžä—`ׇ"ÿj­«?Š8 OÓHÚccŒçO@I?0ýgÆp A¹#_“ïÆN‹ù®“´?Á•6‰jÔûƒ¯ÀxŸ~D^g3Ù‘\ÁmÁH»Av“¾-qºVumäÊt îQ'àE‹Ý÷¯ýo°%£‘ÇÖâê(4qŒ}߇R_HóévN÷tŸô£Be@X¿zm¯@Aj»/†VêøÚöÓT™¶Ògñ޳ˆÕCã¨àÊ\ª}B\ã(ÖõÄu®ÌrùJFµÔÖ!n=ßõ«À½‚XÆ6ú”T—QT<%º( ”¡™O‡ƒ6‚Чó¤×áþÔ÷«„”9§ï¦H åYœŸP}b|1þÿ¹.We(*OùÒ¥a–wõß½ðQR!9䨑 cˆ¬¯ â\ÔS× ùio â„øòÜ·K†ûüž^Þ>h!”<9ƇWÒó"ñ M¥B<±ôÓ$’Š$ÝñÐþ(úC°y¬[Gå´§Óõÿ\Ê#W¿6¨h NŒ¨¿“ÅŠþH³‡ ;ª×“9_üáû ª'ƒõýì¯~îUyÕàï ƒÒ+$eSÆeŠ,·YåâÒñ•µ@­ÁÂÑ*ߺ´$7•©]ð¥ZaiJwÁAé K7iÈ3¼›:û}¸Àø*ÞLƒ.ÁÜó @R<ºy¯Sªbûu/0ºÍi+F ¯ªüªÏÀšÈ- 58°ø%%1Ñ%dÃúJZ;ðþºf7Zc”ßr½pþò HtÆÖ Ä…Ðÿ‚ÿåÈU±Å­¬^ºà.! Ó?^ÆáôòSgÌŽŸ nA©N¼`LÒ´ï/90Ÿ¥œæ°Øßó¦ÉNâf©N‚ß.æ×±ãi¥zÝsóBÙ>#¶ò¬ÅŒÆ¤—ãÊõPjG¸!áS—…¢ÌÞ\Ðzy/C†3n}=JvÅûË#î7xyK8Â˶Gi•;¸ï%èœeæדoÕ!??©\»H€ªi÷¿L¬Ò 4‘ˆ'8ɱ6Õ¶PøíϸRÛ¯Boe£²¾Ä(¾ïɆ¡>Ú*ä O©„®mêtˆW J B´y(L<{G¹TÆÑ[åÂð3cžEÙêp(D ìP«ž+g%ÅùýÖá&;f_ñùÎ+.~Ò¼ ‰C BÖ#Db&’1üvëÕa5Z°a¢‡¸Ü`î| [í?'AFŒj2£ÛÁu¨ô]Tî ð.åpÕ í]²UþܲF€%Ë}8>½)ZÑ‘ ç¥P ˜!>(hÈ/3 æî…ÙpýDLSí øÍM,¤A ;Cûé‹ 鎓æŽ4ž—jø|N}¶rÝn®ÔŠ«*ž¹êV7CKW`iî²[Ð넊gvíI.Kdž¦¼,n„ì‘NÐ>‹›õÔÆF˜ûábÒ5Õ³#Lµ[:±Ro;ö¯®%·þÑÿ±ê·Â‰0}ÁŽåø·u=tã§èÔãËÓÿP 9 '£AFÁÆ­œšé›R ?£#¥mdƒãÄ¥vð„ɈKÛÂ.¼ Ñþ)HW¬1¢Q>AlF>r3 Æ<ͪ™¼4¦Db´@4ˆ*‘kKjÆ5|ÎpöšìûöÓð¹Í~úäñB¨z6£©Ïo‡|@Õ©]rº®»…«,U a6¶:MÝLo±`ïqQjEøi’JPRi_G„îõò‡\ø#´aš´.N¼"¶CÃû|ö„£ë|nt@¦ðÔ…ñpB´=!ìr3¿7ÊOùGÉVÔ”ª{,¶n4\õÓÖ7¬ w5ZV˜a½pÍ_?¡»ôÇ‘«Í•È]®ÃJKrq†«° "M›‡`úéVXU%° bù¸ŸÍ¸‘Iòƒ'~dÁðå@IÕÙ±$LaËÐaˆô@ùºÀu’JÕ© Õy_tN¶¸cßøÍï¦n.¦>2vä Õ(QRˆ27гf(¹¸¯ /¹F0;vÎÜx‚.£ Þûm”ÔäÎ`^¸ z”26‰R=ÐyùFß§¬qê~I÷²ñx;Ìe[â AÓŠ”Wâ&Ÿö}Â3tƒ~AíC}8ý{öåÒõ±¾" „žY’T#v®y)Õ“8“ÌõpUü’€¥9 rõ:©ðlïËÔͧS†Q£cѲ¹"¾\*¹-ü¢˜È»“ä3ÕrÚLõß÷ë¿ó‘›ü:’Ṳ̀¨Ô”\iŽQ3‘OZ[EznYñÉ<‘ã½þ‘cûø#ÇùñGŽûüGŽûåŽÒŸdssòq°Ší¦®‚ý•j›Ns,øãqêÞûO§?=_—ÿ)aÇZŠŸóð¦tQÂ=àbä}~6ßí¹‰u£«Ô/²õw[Ž\·JlÝÆÏÂ%Ü«f&~5cçïÿÿ™kФu/ÿÕSùøÈ=»Ç™ªÝ5ÊaÕÉ+ÁLd×ùò _[4_6ÿM>8ºi²EèåRuºDr`ÿóömkÖS/¢ÎÍmØ÷Dîê ùæ ž¯6? LÍ »÷oªéª ñy:.õ§-“™~ÏzšÄ9yB>q~ïzŒ\¯§Š&(œq¬šw÷¼k§1M"íNw[Ç“ŽÀjÁÐIl‹ÖC¬j­if„-Þ¥ùÒ¿nfÙÕ '˜-î ÃÊH÷쩟˜9¬Ø•pûDÄÈõßò…¿d!aAZ‹“§ÃÆõ‹níw§ª$‚!ʤ ð›zü‡÷ד’ Uœä´q&¸kéMˆqx(·õÌ^¯–§ó–ã¬Î§«OS](ÚýÉçRûoÊþ­h†½S¼âØý*@Tl¤šˆÞ€bbd}€Ã4ÈóžÂ|VM´z1îG…Ì)áüÑĤgóNÁà ëMã2«Ò°§W­Ë¬U/°H1aû³œ‡I!\ø¹}\…é‹76N9YÄ+‰»ÊC¾k6»f¢«ç³ulõ(‚uù`ºõChuÔGö¢³ŸxÈ&¥<ëóVÈh~_T;gá¬gc$ö7Bðò6ã¬ÉÁ!-ð@ùS;úÄæ0ïó–/ÙH6èmEÞ Å«ô»žhÂ@®wN'ïúΰò N¼ÄúîéxSÖǰùß ý#pµÏg³oCOÐëò¿zQ·BMå£N ìNÇ 473ou/ê­:°pÝ–ÚöÔwm›6Òsg ýnÊmµk]{G:ûïPþ@d©f !›²?^ÖÉðiø‘|†¿&€ 5²–yê!{ ¿?=kÛû¯GR½–3Õ¼ú€e˜iXÙˆ=OSV&"4f©Ê×äчâOK~›üEÆÚÔ¥EüÀÒ‹£/„•ŒW¾x*­›åÏOÊ$6:tÊy˜¨¯Ã#âU>FøV£=XõÚ ™57˜ãpþÒc5ŠíÔÏ·tÀµ\O!¯µœÿÜÈuMÕÈí©FHJ0gJ©ùÛ€l æ÷ ~$ù’72×§"¿ÙP#'Ʊ1tê¯õ–ÍJ6íÈmõVJüŠó2ÉyzáÕªT±h3ÙûÐ!ÆR6Ú~Lú3ÕAÒô{ã’‘ Ö¢þM¡?ãç7r àFÇ£÷Tµãå—##›y˜ÌPçi·lƒfÈšªOG:´Ÿ­”QÿXÖ¤.zÄ<ßPïuѩГãq¢±ê¡"~ªy xZv5qL‚? H5ßp‹]ú¹æBC6z Ðº¢êµ<ðòÈIŠÞ”‡±ÖÆpQo!s!ËBÜí *½ ´FqÅäºúää[#…å‰B‘<×X×GGøÍôþÔxko­ØÓ[,ëóõœŒ‡ Ï¯ÚÙ]s©œi– ¾ñžÙ-.BôÉY?oé§~;ßã>í¶¿{ó»ÌüʯOÜ챿7ª[‡ÿ/õÑ °˜³‡ç?æk ïýT]¶HW÷B¬íZÿÄ‚ÕZw'±¿ºDÝ]!dÕJMjôê;Û—·®»uåQÇ“ÆÆc=Ü·pÆÔ²£ˆ4n ¹ám-Î—ì Ž`‘Ô³…ƒ‹~š6–b×îµ\S¶ÜF£Ø¶0¡Ìì·ìñ¹}ÆÙ]ù+aJN­ÌÏÎ^.ÍD€ Ï–.F=Èa½Õ:˜Èä}î+{Ëq»*×À0€‰`pïƒÅÆ‘Ì~ »uü€! ìúÁzÀ-wÉj„Ÿ¯õÖ“‡‹õTy6 Èj³á%³Î†ž¼pë-À—?„×WÅLxk Ân %¥–ÔÍáóÜüΈa» £&ujq`\.cþh°•ÎÞÝá$—™8tCSMÜ&Cb ‡X7¸ŠJy5Z(Ê(RéÖãÆ®ƒL¤qƒKC¶)íK97à àŸs6ÔSVlÛ>µp™Sö@V—Õ‘§êÈ— m9oì¼êzËA£é\E ,BÕs—îÛc&`y®-œÊM›áñ?Ñ59N1^H}õt‹c×%M£7¨Gïܘ ¦d‡çP«å`Ìpa¢ê",ÁaZ=DgèÞœ~rº‰ÍÒ™¤¼j#3UuÏ&¼t«Ã4{±Ë*ñ0O½oÑð‘d›Ü gç½Ä×Ns¨ŒRˆíTà ¤Fõ¡½;‘j‹Ž;¦¨|˜>·Ä‚xÑN±J0Ùm¯b¯µmÖŠñ1 ›uŽD9¦ãhpÃx¼aÕèÚàíwÉ;¥ p¢!„¨XéC“Á}¶´64ô߶äMpý2{6Q³Ä5’Â#RŠEr#ÿç1ð±@Ué¨ÝPtNµíöaú\ÄxÜ—]³ãSžVVM©‚ÖY 1ç¾w îJ#ZÆÞv•øˆîKQôQÑsóe¨Õ˜Zð¹^ÇOû+Ã^ô8—B 7Ì¥C³TÁ=ŽØqðcçh×/w»“a•Èr ‚?òAéÓ¬¨'ùéHœ˜à@fVyá÷5¤±“DuD¹˜k£Ùï=0öQ·Íù’Ù“)æO„*N!~Ê=×Gt.@¨ÒÛî#Ì}GãÅíþè!ˆ_¦‡åV‘ñÊvaíÉ:´Dª§Þ‡¸£‘¼Ne(# hÇÊžDU úÚØG\‘^!‡qÜgywÝN=‹ì j<å8_@U§ÂÕ‰®§Û¶E¡+ÝßV*áR#w]Ó»îk ”mç¾Y¯"¿ºåÖØö_,‰¦XØO×xsZÉíDÞøï›î±-ºâð¸ ÙAÊâeå((ßðb„ØuiÀ];'Û"“x·j鎳 &Ng¼í|ˆïy!’ÃC¡fá³Ü˜$”Sƒ¨\)džA'Õ! äáwÎÅWýKy‹ÄGå´ šê豺HÓÙ 4ÿ_ï2ÿ×tM_lि"™âÔ¥­$¢²é8DOÐ}zu'šµ@ê÷R¸'Ò¬ óQ-íÃòÁéÞíó€:váú¬ØN± –*đ궦>åašmEšDÿD cè^Ütq–´¤ÁH÷«[ÑÑœMb÷Øú!;Ú‚à‡høU°C”a˜gflÕ¶„¸ƒ5pE€`m³òàvKƒ4§-o«òø‹÷åIqD” ìïJÒøÄTýÚÉçØö}ÂÂ:»ëÒó•ý '6óŸ:"®®PÎS÷í"ã"‡5ƒÈpî…È@|T§JÆÎØz¾YÞp>ï]†ÿ}û…QA?b_9¶WÎV–oK?ÄÖ•Lá3í’ÇÒsf¿œÝ!o∕8ëUÛ@å`!~˜VÐr ˜žÉ ¿ò ýAÄ=p`Ò÷ ´iTQ)Üúÿúár.7ôlsz9z½dßÎõµÍp—«1ÛtIЇ£’ˆÔÊ`)/’7qIÐCuÇJmÉ…=þÃŽº¨¸‡³ëcƒéS »;ì¦Ñ>ñçù&N½ÉÂ&@LIˆœ•œûàñš²¨o›çÜÑdƒ-=Ô˜-|Tm)åÞ‹ìI?^™è=ixwéRƒ°f¤ŽàK»"B¶ñ]ènó÷曥iÑçŠ)íÉ6—ƒ.@~[Ä\ج½Ü2EyÔMÙ8ÙY¦Í‰fªé1 U?hIÀ…^ßs‹‚•_¿ß©ËºõLT¡š§½7eÇ?¯³¼G ?Õ"Ýý»g¨WŸ{ܛꥻråu¸ÊÂ3xkµ_—±ŸÆ1™\„\Gì+Hr¡ƒ¨ "%ôìUœ\géáêNŸç-z$òx°ÍŽÜÔüùwò‰E–8ÀæÂ?ü¦™d_üÐsl«m6ŽFZòë×h’É‹0§1òQp^qኯ0 _Ö5Ÿ×+JU܆ k6ÜûÃ9†'K¸ß(³v|Õ„q½¢Ñ9Ö5ÚÜíEH˜#p傆QwdÏÔê]ž‘zÃh[áèœhg*¹†ç'ÌâºÏÐ ëÕ‹Ü[­ÜUù%É…·Ù¯Y íô ¼P¤1È«X‡ ÁK’:­`­6•½Ì:ÝHßĸ^¶­=m]Μgáp a»Ü4‘ô !·\9Ûõ¬1y¾°k·Bo[^þÌäƒÑ°ç–ºôbD£*šlê¢ÚwM®L¨{ž NÛäüÏ 0–Uh·P=¨Ækð¶»&Z~“0\“‰èÈßÊ ÈUŒÞ…LDQ¾Pšœ™4lOk9Z¼gÅò7¿4bn­åúã6`.¥¹?Ei>Þ›uwØ Äå-¨–,M»ábu£`¡M÷5<ˆNûªP'­÷¶¶V •ÉY¤tmÏ$yßDËó€f3ü’›_ Èõ÷t”ѹ9Å<ܦ'bO§ÿ"ÂúÓw ;}z…­S£Óé÷óz-.Óì_¹,²¿ëI&‚ˆÈ"5¡¹V·«bÒlA‡ì_[UÀºÑeêãx†ïÍ@Øvt«´Ö#z:ÀdJŠÑ=3è ’ýbNòw/À&È© ¯*ß1H!]q:Ø?oIT‰)kW]מìMÇÈ,Qþ—’1&²Ô¾GdFÜ`üž‚ctå·Åß”ùÖ5Æ/ ~{rô6HÐ`Ó(¾ ‡HByî¼M Éîª_ç$û̶’_Ÿè¡Ëz‹ ð~+µ1Ì)²óÞ»àÃóºÜ1àZ4ñîu œÌ[ç‘8‡>4¶Xز¶'‹YÂmŽéO:C[S–^¬|rºé²ËÊÓÓ ôŒ[Ì²Š€5-[¸{ÿ£±Wç\@.’é?[·ª=Œ–)@ªŽOV¹Êêy«Ùgw°3ê)žh ¤eáCéÆ /hºÙ)´”E†®êykéd=Ç IO:ÚuÝz»î¼ü-VtïgËX/ëÄ£:~¬Ži¾lõyÛ:z¤Þ29¦­ùG_*ºÑ*u[Þ·xÙ G©TK»à¹Ì c±-æ¹Ë,,"=Ábé †´ ̆½K²Û ²ÓXRt2A¨T] ³´Í;‹&•÷,+«knWÂ’,Í“òg­cðÒHz½k;*«Ô7‹”>“¸¥\3wõîd°Ã”$zYÃå^ýþ45CT¸¨˜€ÜÙ¶,01BÀ øþ&EéË{%µef[Ln÷ï@ù€š£"0£MËìNr`ÉA°â'Éß•âgˆÉO6ìÁ^üÌÜ%=ö†Ûûö¹\f¹=^j”Ë(s"s¿œ…ƒÛsb"lË+ŸÌ|ª©Ü69âÚqÚ¸*x$€ ÍÌ”‚¶ï(ÑÂÁ4=& ­×®{ïÇÕÖ­1dÜH·ˆ{ï-í(ª#MãBCã"#ÙÉ–­4$¨¿Å¹AÂÿ€s‰·´ØêÅZäÜÀô»ú°ï›¥o ¸³{Z ßU[eÙR Uîðu1§/ÀÆV&}/}âï,¿Ç¦¤Œ, sïåGÒßÄ™þÅœzõ`6.))a»|^ìëìÓ†ù‰½m£5ê¾*wa§yð/𣮅jêÂX˜N'*Ï@n‹d [x”@˜¨â4ÔEIx¤i}ϱû%¬Žµ&(c¦›Š¸^S¨£Ä£Ø±àÜ*T®³iûsx‘«I[³¯”j Ï«0çVÞóJ¡iÝVS6[îm—¿ó .LTY?&o§†ûlª\©Ï·KÒJ-V¿p…Z¹ð³TC† ,~Ü´*¶Ì¦>àrv+($ákÿçÍ·^©Klû§ JŸAõaÕ¶ç8×ÔÝL¥&yêýQ_žÛ³Â9Òå–ºèw`<…j `»Ö_ýr­ôœÆcF…dÀçÆÂ]U„Ra÷ÑATHõÙðï,ÊP¨…•aJXà•?m`ZG€I*ûëjí©ˆßH"¶MçÊh²>0ô ŒÅ1ôRµ(ÚäUa±Xý 'Ŷ¥ÇŠ.[©WfØÉçHâflŸ˜KdjÒ4N˜Çê3^ÉÖOewf[L44¦ªìÊ6BO\z¡q#„õ€*8È)T{© —³ª4Æh˜B Bç@uŽ#vžÌdã8õÓܾþâéOÓÛmT¤ 0 N(]YÛó7Ã+þ­H3gRÂàcä¸5¬ ¡/m8*渃DŠò.)·n1£Á.Ü••Ü©JÓ±ð7xA,oÃ4‚L¹Z”"ý[ãNs™3Gð>ƒÞ3brõx8=qÔ¡2èˆIE—o<¼^v‡¬Ž\^D3NŽßïo„+Œ2›òŸ´R4®©ú ëw)U¹eÕOý¶Hþ|ë긼é¶"zß8ÍT j.8˜Éê-s7³À¸Â²Pf9€æß¹EúÕ˜¢Gµ½ÈAS~Õ|÷…çuaEû_i ŠNðÃÕ ;«Ê [ÑÖBŠÐ¬Ú©cZrŒÉùþ*ê^q«¯¸õ¬òðŒUí+¨^sIàuJ¤2x Û,síe|º£üæþµ ùóeq ÅV¦• ?£$Ÿ÷‹ N_§$A³YaQº²ÊÊ@2ߨô$7æ]_W b3F¹žùwŸgf–š³3€é/EÚ S)®’k3¬]Èɰ;pËN|¶©z 9øý˜ ÏÏ¡`„á¶å)DJC‘k> `›æ°ºSöPÉÙL1Ÿ4îɸ§Ú0ØC6{þÙ`!•—iX¢oÄ^À¶˜ÈFª»C“mnò ÚOœñžžL ýkÛ|«â—¤&•7Ý5¿ …‹*+w=ü š’'’ÞFƒö4]/—Ï…œ[ölŠlífÃoçO[\+ŠG:F¬ô¹|ÒMÊy²h\àЦ¨›ža)°€i¨T%mWçrÎÀ Œã×WÕzÐQSœ«¸éÓ)Zßæ-…©eöÒ¤;ZÉëù¥a`ôe5Û` öðŸGak²ªnêîE²Ýdž6fWº}}™?/ÂÝî±ÃJ[7 ßaè}õÚA€—AvìYðm€w›äL¦?¬™U‹•Ó{…{}ÒÏ}ƒ(µ£3$ÙÕ›#h(=Ek–ͨw?8ÄùàK…Ö²ª '³ TÉÕ³È먴œg‘ìM–+4b8 œGkµ×㠗О¹\ s… )€ˆk*< ïóÛ±_ùq /~˜bŸ!±õãÄæ¹Û9Kç¡òàúŠºÍëRÜt¬cÞ.á‘ –çŒnEµjjÉÊ‚« Ö Ón‡†ö0 ,“qv´É™±sáÐ}‡§õ¿–#J‘á°aÊHõ×hJv)òm´Ú÷\½ÜŠÕ [X'.Á/BÃ2ȉGñº"}ƽ«ýBí¨‹ä ÈC;È/ùæwF|c‰e” ‡Ô.£¢6, ÍhÚàtÙ€;覰ˆ?®Ç<ÅvÄåÂÓÍÆsíx¸¥F®çi¡£à’dÀKg ŰYb&I$ünÛ3ƒƒ@ø£2ë¯ ÛFÓ·—0nʯ;^ˆ-UkÕˆ÷âG¨˜ñÂŽÁƒW†Öî*¸L”š•µŸ“á>„ް6»’7ŠÌ¯'šJ¦õµ”/Š…ÉNôFÿÐ(„&cœvÅq¦K÷%4˜™­8MWî¹YÒš·úÃ\ƒß-<¦ø~%oÿQQãJD÷éxÁáK ôQµän„jŪéÙ6w›Õ’£ã¸·ØáTãé 0ÿçOñ&L2ÎA«!²:ÿ32e5`IÝ'YÔ-û&îøìÆ^*^`-Š²Þ’“ A•ÞËëep&Mæ÷+ô¸L ¦Þ¾'ÄŽj‘n #ÿššBhÞ£~–ÉEcµ`µÒ{ 4I#MHjp7Ë "ˆ{ÒÀä– NQ‰ØÏÇ¿0¡ Á²lá4œ"P —Œ¦;îëdf£r«ö(Æw:j¡-óéH››ÔVZ6Màð´fùè!Eå\zëEzbY¢#Qß³1B Ì)“,8ËóHï sLŒIªfm£ž@_=‘ý®º D§7ö0£°ïÉ /óý#/·|)ã,RAÆ3ò+àKòžûQ/0ý!<]MÿXà õ>@«q[ñó2Í4e(Zñ cµ,b­âKöGªéÅ<š*3r‚ºz…ÄÑÙ¢Êr-'áù,­XgªòØO£,¥6DíÛÕÞ¶q…Ù³dr~ZtÓÃOKÙ*0­Àµ‰|i)c#ÎmLXÊÎâÁHe—سFÂÏ?¹Ë¤¡hŠËäyD>çï¥YáäbmF8ƒv’uíôeTˆ †a@º°® S¨ñÔ¨ØßúУ¼ËÙ¥'‹£ñ‘sØÎd±á D£ë¸ / SzV )cé!öSq†zÂH Þ4QúLGYeñs¾­ 0ï7l‰fiéh^‰D†,¨ µçN™´s–Õ~@·›Õt‹=}bãF&îD™94øçßhÒ¦"ª®ŸCΊÜåæ§ðÀåv2À,«Ö»Í« ŒÄѺ=[ó¢Ñǵ²¼ìÀ –ìЬ¢¸Š°Ò·o­¸™ÿá­ ëùôº(ÛT lcmÈóV¤ú+ŸvyüK®×áBý]¾™¢Œ‰¨a$L?’I÷2ù›"“ä1Q]É à0œK‰‰\1,1¥±È£öøká9¥žÇgÝz\Yø8aêK—g5*éÍ•¦óÅ%4^ø%ÃËl¸5­è Î^›ƒDg‰Øùì ÎúžëJ¶Ø DœÎô¦u}™ƒ ‹«¡­èƒ“â^Ͳš¾J Å*Ò®P8'v0 Ô9RVx‡Òã& >-ϾÕ”ƒR{«÷ËdÕ$”’»4³nÓK;™Ý LéGŠêÇ#:œ8]èr›œÇ›½h3*þ³÷"þT*œ ÙÛ]*yÒ<H­·ÒOvôÜRk¥Š^ÆlúáX°ÐæøÍ W¢6–#ƒÑ÷@;¬KžJJØô¤´S*¥ båuW¢éæ×…Žy ˱&94y ±Bž¨œL’‚DHFÔy ôïû•6lQĺ!ˆD\’XÝH.{‰ÐüG”1X¨œúkŠ%oj¯Age±shôê³arQÖÕ¦Ά¸Š™]Ô’äcyŸ2&X‰AM¨pœ¬y%ë5f¡ôÇh¶õD`§á¨²•çx-nn=aq33¥ ÚÇ?S¤ˆ÷}P,÷fÚ«×Uz”SarB\Õ3ÏyªGpÃoŽ$ct¢è ˜žBJß½§CZ‚cÔ{g3þ$z~¾T^¨÷ÎnöYr¨Ï‘ý|%üp³Iey-ý³¡L›¶JcdvË&hŒ¦7úµËµ{Ø$tu‹lŒGÅ¡àr~Œñ®ÇfR5iS/ ×£Óô¦hdƒ`?ìŸøG’׎â0t̵"¯Í° ¬Ø8ý^ªÝaƒqIÿp¥dþ[þâb®„9{+†AÑÑ®©ÃÏØßI÷ÿÍK¯Ã&ñM—G>ñ¦äÉ…;7XþÿO™DƒÝð㵂ãm¯µf˜.üÅTF’Ìx©¼kYÅæ­…ÇÔ°'=c‹Ÿ¿Üùõ Qþg´tp÷LúCÿoÜ<(l´Ù`ö‰PèÙgêýæ!@ˆ{ãc´j*¡-&±¶meEA9øŽþ @2:G ㋚°¯LPL ÛÁuë¢^òòLNÅýŸaB‚퉚°£Þ;Y\fíûëèTp[ØÑøà.¶±£ŸÂ‚& ©€T”ï.ü'(_‡ª\ʾnÓ ¬F×fw&"Jεƒ÷D—¿IÕæÍ3¨üÍ2Õá‡0&ÝÙ‡ßCC@2oel‘ð9ÖÍÚ²»5€SÙÛ²˜#IÿY’¼­Z8€;/ÆÁœ©Û÷,ÿý8«y€OØ÷¾Ÿ—zw¯tÇɤ;ëPµÜ¹¦6n¥ò _ùr•¥ Í_½œ½°?ž–[öO]K 2ªè*Ž?­æL€¾é!…-A64M®“V†#ý¬žᤩ;¡™«öÞõÖ¶¶©Ü¦ u¡•q;Éz{%ËD’ä4@bviúÚÝÁÿÿÿŒI”0í²¸×Ô^ÙFXÑ>œ>CÄa^ ­cB·àu%ŠëÃî5Ö8'0ÎXÝh¦ÁÑêH§åµœ3ÀIöU]·ÊÑßò ÔÖ¦Dt.\ŠæÂê%ŽÛhÀë´ŒTN«ÆáÛ|âýÿäaf©][«Ñ‚O'µJÿ¢’ãE.U„óË»¦b÷ ¨ã9Ïc@²€?­ÖÐEÔªëŸèPýÌxÚŒ¬Ðß¿¨w2ŽÐ/Û&ò3ò¿S%C'8&d+KÇŠfcĨÊóQš‡æÎfç†û²D'‘IQ†·fáD¶ö—!sû‡ÿñ: 9$ÔoT¿„=µÆòh¸w¢£&9'+51YT ¡#§É,(ËKu‡Ö§Ÿf&'é³q鸌ÉCf++ñ’ ¡Î%ï4L¹ä|Èìžb¥t²]Q•Hï•g‹¾ê“ùøÁùxB þا¦ÜUFÂbÊV¡ïò=%ÿeœóp9™Ü™OŽB`*ž¥€ â’]çÎâ|ÈÑcvôÛd›pX®{ÄÚ©ãôÔgÃbÚ2ö;GµöŠÌÓóW>ŸwÅÀgìÅÄ&c8²VèÐÄXÏÕ~È_••½T3†µV²ÜÂÛg!"uV‘+çì…;µ (A™¨‚/Úò.³ Š;ºÿt=-A@veÃ6þù¤”WêUþ53ó‹ÔÏ3‰+g'Ù§0KÂ(Kf؈'Nnücúo ÕŽ5Ê™+eb¼{U÷ËÛ¹ÅÛŠ~01'ìØw•ÐŒ!ŠÄZ§®“©ó¿%¸Rˆj¦°k{‚' ŽÖ#/)þ̉¨JŠ Ü’ ëÉs‹e1#wäûd·dc¹ÖLÜuř˫® r›5­Ó]Ìra„b(žû†Ñ_Ñ^8,\(AA ž´_Ћ›„úv\½ÁeœäY”¬™.°_š{;Úø)Ëïþ¦!ò¦+mþcÆ9ŠäOÀlÿæj(Uî`Äv ;;QX.‰ÎÍñbb>u“‘îÈÚYêܾ›Y…ËÒu=U±ÕM²èFŒ­9W„™ðˆ²›D'q¿_»TaüVT¥ìx;f÷‡óÿé|MœYå|óÑ[ ¢VD¯…øªi'”5Qkò[¹’ý7»°/ä$¡¢YjTÛK–"­°÷ÈØ&G‰ü,›]ÚˆlåÓÁ´õœËÁ;QUûºÎšOek¯†)—².Û÷e ~šÅû Ýzh1º©ÎÚ°÷õYX ëçÙ Y‚'9ÖÄð–Ø-½û!6òðϮݶVøÇ®¤ç ÏŽ˜4&ødé2ÜÿþÐ3Ù´=í§” R…½Iv2gŠ–Pp$ªny ç1´ëcß¹ÕgXZ”Y_vyèN}Ãí¥a,àG s2æÖÎŒjgõbÌòâ|+f‡ægp6‹wê(H ÷´Ù_;óeôÊ…o.ð<{ÍyçûnÛc= áÂH¦ŠQT‹ÔrNI¹›”Ó’¹Ôéþ®|Ô:üæ¢ì=ôgU"Ìé÷zí ³gËF±ÌŠŸ„‚îÊø"®ký¾|6ÆÓ˜Nðìl×2Sù¥¬ ­®«Øór0eÑt¤lÖUáâeÛü‹ipïȲp¦ÉW×'PrrÊnþ–QõèÿŽvþââÃ×}¥e¥áƒ°Íšüï9¾a¹ÁD•ù]¯l,õ™<ÛŸé²$¥þçVËݰ؆'ªnÏ^³iǵÚõ®ZóMîåWdÂâ ìÇlÔÁí­(‚¢2îÍ診»•QÇ›Ö_NUÇ™ihÍâ£åÂpÜ‹´nÏLg^œ;jÛ3<õZšÎ6ÚÞS_ö…Ï–Ü̼›KZ±ÙËÄLÂyÌ8®¤ OõÉxàŽ‰#/‘Éœ«ç×<ì׌þÍ®|ñ–ÞKѱü®äè>ævb6Øݺ ¼¼Bîf74sŠCs.ó¦0Úº3„ãÄ¿·|?äýG-€}³Z}å¼E£DþfÞ·Ì6ýVNöñRîAY«9î n ÃÃ;;Ûˆ=fQÕÿÄG_úßVã«iCFÈ8×¶`ý”7BrVP2:rG;»AÂ!œaÝ´IY¤ƒ!Âû_úLyÿì…HÍüû?ƒ0á-°s€1Úqÿ‡Ý:ÈíAÇ\Ï¢Q¥žd2Ùh9aÅÏ®1y~}Å­[ëë|*¾¤=Ž¥¶1r™`ŽQ*VKû×þ‰ª–aÆp|äàÑÏWã²k€òmŽWDŽž¶Ä¹¸³2G¯Ò½×ÜBþE¬RÚ1`kfð°»C…u¦Ãþc½qª FZ¬'x&Èäd»NCãU,õ ¢PéÏd-2èË*Ü2/6¹õ¬Ù¡üî'‡ák‡YÕä‘=‹è!K}ìttn yXi ŒIŠÙ²ýÛhU¶Ÿ=1O>•J7yîÎC:õ˜C[Ï` a…iœq sŸ‡Qˆ \ÙÝdm6ZÆýD¥ ì+In†7ÂŒìMaç¼›GÐp!4Õî0D7C "¸Ï>½DZ•jËHþ›o7Þi£Ÿn7<@¢–Üž§ýžŽßÈeËAÓrmÉ›§ˆ|Ÿë¤ŠŒö7¦PÜ+Žßw‰ÙÎH@ã60Ö‹…™ n òè›b$]ƒ’µyŒ<äàý¶…„Yq·dáxÙ¡†N†}XÇ=¼íé³®9\3INsʽ£7F•h$c>&oßœwŒá/Çilãä97[-{SO™³nm“A, ü`œéŸ}:’'ËW>¹ÓÖnAJà %®ß0Ü{FÁ—mw†’šÀ9XÈúªÍ-¡´¦HÎIšÇà¦]yZ9Ôt,Úm*Óž³hJ´û‰$=É5v£·û¾Ó%_Ót«,“ ÒÄ5yá`‰¯.{N¤T—É`ô$Ò]ݲ=.Ma©I’§êð~F='ãP&ê¥y·½2Ô¨ÍÙiŸ™ô§B,«i=; )F3· Pi]ã8@ÕB@X66U=Ù‡ ZšpLæ0+!-ÕÚÀ}?y÷€ôºþ¼ªÀ'|ßóGDóEUíÀ@xÛ•§ Îä)•u ’²ÂQ£²âÒ¨Ø2ˆ=UÛLw Cø%Òäµv·w˜2½LK$¤óÝѮюHP˜d©zMÙ¸Žky–½>Õ,SCäË$bÕ¬{¹˜…ÚŸ2±\%OÙÌŸ}¢R* “ÇêÀhœÆ²ÂIdz93¶EÈ^òýš$·¼M+ nApé3L‰ÊÛ5à|½ }"ùó7‘p¤ð»se3´kD’ÐQ±ãzJ[_öoŒF|ÀB“'I¬-J‡¥JI hÙzG8w”ŠGï¤ê=Æ”ªŸƒÚ˜Ã®šÕ}÷ò¯À3¨!ÂfO»£”§þéŒJ+÷Á´]ô·6妫4iå Ç|.³rÁœ-²¯Û‚D›áí&a?ƒ Ðმ)±Pž}=±~!„‰¨ˆ[­Ì»ßÑs.._ÿüeŒnyý{Ô.AÔ¨ä¡ü£Ù-fã¶Æo¦O¯î´1ÆU¡š¿0Þ]j:GÃ[óúaì&oÈÇŒ7F7¡EѢﰷóÎ+ÖþEԸƩ]J{Õ ‡ºÚÛI[‰™z³E‡²ò‘ Ó^DzuRžßHËw%R« µdì]£4}¡‹‹9§í^]ýЧÙ‘+µ(õèúøÇ¿ø’’£vذ!²±ËÝ®êÛ³ |£¯Dp.Ðm÷í}·(³} ÚÁw \í*üY瀜seä¬Üm’±Aýž³¸)Ô:Ük u òEßåž{àPߺåò:ñv¸¼¾—V=ôñÝ&ž&!çþçúø‰hÖ… JŠdèJ8z››”‚yE[‰w+c½a»›ù‘•@+`dŸ#E>¶Ùù!¨‰Lª]Üý€2-¤áJ>z¢ï[ZŸxþ¿P†»uD¥Gåí zß‚5ét Ô—ãˉ M¿cÀš‡Ö.ªúZ“;G¾&®g5ØË°rÀ“¦Ó–ÛÅšô^>Šõ ꎊj‰ÐáwÊ] 9†Ú>LšFš¢Œê‘›t(bȱQzà¦o¸+“ôD-ÅÀ ßR³…ŽyVª<2w™ƒê–lÚžVìJjñîTÆð–9œÝî hôîÙMDyÁ€U›½UYvqÝ„_‚¨ÛãfúU1&N"•Ä×å²ß4>«ΫïR=ëK”3ïw—GÖ¾ÙkÌô38{€)ŒXþ~"¶äÿWæÉóÚ¯ÄîÅÀŽu,ø9A;Y;¤˜Àx¶«ÏQ¼“¬™,[Ð{„ïŽZÜWª2­kv\¸ê:ákõ—ï3ˆzÑnLân‚K†2x¡¡å¨†TæêY0¡U gq’çŒXÕ%ïíûw{6³.O!9)EZ—”šîú7{Ù(˜!cg¿YIr’óxò}JÀ@Ѻ†Tõ©æ®3L/¯®Dþ8p;À’CiQßû38­Jg¤èú;à0ÃHR4FÚÚ Íy@#k•9-Þ¶¹š}ÛÆ9:sçšY6¦àùà:GÍqT¸¦»néËé%°gRÞ2{~=r…'#¼Švd—Íð‡*"Ù%Y,›3Oó;í¥&®ÔÏÇyU’#+ÌÐáð¦IèØNjIh‹§³§XOܳV¥¤fÐ ¡f¶x¿ÍpÇI?9.LµVNɰçj“w2çÑ-®Câ*šÀ&Í”YѪ(ãh¸º»§qμ¾°ÑP(|ü>†¸AŒzHúT‚‘Œ»IOÑMXu.£9›3J¼SYœB•Ørî4AŒæUvc Î0YÅÏfÉoþak´A&ïn]w ¿hû0ˆd/4Ëþè¼Ê0’Æ Ô5І†±ÕI—ÚM}[`EÃÜh,}á×ÈïÌ?EƒÎp üv€X.Ñ&Á¼ºSä¼¶U=ª[ÅËA‡Øi€É;[ﳚÁÜ6Ódw¤iÈY5à"?GE˜voι“kÙ3<Ø%ïßÑä:(ïÆ&¹qÓaVðêÓã™jJóNÅÕ-©?©¥‚ÍÇ–ˆB×4±/Ú$°gbQ»àÿb9'öƘåÌ‘ùÂz9ÇR§ߎ×_¬xÐcó'‰¤!«ø¶f†Õìm oñôâeO¿šÚ^õ9'Œðw ó$OÖ`¿m4ó+ñSÀ‡{ ÝÁü3 ܉¼þË£!ÓuQ冸UStÒ¥ÙÍ]ÆÓ%÷fU"1Üu¢poö5*éÝi.jî­Ç4r†Y¢hÓçÄâT_/…øë|Ef ¾ðÒ;Y4t½ØÜ~kþ£Ý)ú÷bªW#’>ÊÖG­¨¤Oò|cVa›|6Í(à˜½mC¾í:Ë€½<ålÌÒµ»HtŠo6 }Z\OrKëÑþÍVúÈx2G¾±œE\ü<ðQ¥²îÿ Ï¦º¹£^lí÷?Žo¤Û¹ºý«U—*/Ý~oÔÍ‹¨FÈmðò>—nS¨ÆÈ‹`éka}ËêZ×U P€ Ò%»OÊ÷ÞÖöÜÁ^ä>Iзo^H/OØG}(5óœ*ëF¹þõfýÓa:2÷/¹„ÕWªí«*ª6lùo4m¿iMwÕ¦û0}˜í0ËÔXAܜצ²Wl³.Ùþ?ïXÕÐw’¿š2yJº¤:‚-È;âAö—× lÑ‘Oˆu™t@¤ é Éå@)Ðtf… >RN­ ôoæý õÁxÔœõ¸ÉñänʦÁŒ/ÉvâTµžÙ¥‡*Ô˜í6\;öúh±¢sÞÞiX[îU{DŠœ{ÔîšhžâD°öÞbÕ|hEÖúûŒ^jX‚ -9Í é‡ •™J“±¢'ôšÒsMÖÎT-ŠwxEú-°H¬#'Œæ¿\Te‰ÔNuÚKX¿‘@Ô1ÅRQ*{’ŽŽ³Äz›ùJúõù÷¬&{'-ý||%ÞìUqÕßÅ {U?Y5øªX†yr[[.Ìò­µP<­ß•ˆäªß¹´£ë%„dW\qVh kgÕX¹4i$4-¥@³}3 H¾ˆ KÐ̘{e^ÀžG•ÒúRmnŸö"Ó±·åmIG jþgнr€ú‹Øú"’øÀ Ɇ†ò…´; òïè¯ÁD¿µz=~å àÖ´X“p. ‹å+·ö–$µÆ$µ4Îô0í䕬==oÎØ*¦ ·@T']°"i´%Œ-l¢%Ìž‘ü÷ž·§@u’4Kv"W~¸˜¿s`ÇÓÊóµãò  Î(åg\¾ODÈA/jû#bWÞš‰Ù•Uuò_œüÍõ¤—è20Ííª¯¥ÙEÓ›}žÌ^Mš´£Ê)² Ì”ˆQq–˜§¾>xljú¦Î¨ Mu· õÞÀËYÍH 0êt$›ÞvC[uãHgn ”¾Ä@ Ñ»lÔ$g*"¶T:ßÃt Z%Ž@@Fܼà£Ò|åFí[cBJhÓAùv à€D ìq«$+f£Épçv€„ɼYûW%Ÿ¬%¡R"D*%N,Xš&߯†A°äny:ÖyT‹#Làq{ª¨‹}õ Ëó"d$·Õë&×hPº.ôîï å»>«ÊÊ`}³Çœ¾¸ö¦Œ%ó„jžGKà fPÌZ–{ (ï2 zÆœ~1Ú q¨ž€¤M (f xöCET£æÍ¸l|øW§fHx]ôîs’n ÔÏÕrÄÙºÌc$ìÐ3[ 5ƒÅ³ûv8À¥YÓ4—ÅÂM˜4CÅ‹ä®=s8@ÓyÜLn #uœSìÖw…hO°Ác–êëÛÓ{«öp£LŸ°#inM]±qµ¿èÔÓ‹ÓÿX{ <ˆ…_‹ãÖËF c5«:r68AâçÄ•~ :ðÂäDMú/ï8 ßm*@…±ÁF|Øz@£KÆ@ÍHŠu ?LDZ@BH[H6fË70o^él´8ЬÞÕ{€Ì™1ý%bA´Rx|kÁÂUÁNOÓ]­šX±ÚÁXdü‡A ¿í5.Jånò€?YÕÍŠ‡=näYj8"ä ܳ§ž€;„¤ˆqtN3#Æù6²j½˜šu·ø¢Pq;©¿ GÉ–l¯Öȱ¿ˆÍãÓi×…·‡EþŽTü:“—)áã âé@ŠÉJ”æÂã Ì, ? $ ìAô¨NÀ¤y³,î æ‚Úåò´¨NG¢¤Oüz¶FÎ?w˜ì"D½7VdFNAà$é›Qð¾ü¾KŸÜàIÞ­¿Eðî$² J_¨òãö©÷³&]é$Ñi›¸•™\4o€òÓ­¥+]9 ÂíÜH`RüvjSá²e0Kƒ!dÎGµyßFÀ¸— œ·Ÿªî³ÄG÷’sÞú0œ;ïà@º°v®bMÆÀx%žW˜WíXZÁYo¢Mӆķx}s$¦«“Üoi ¿ƒÏ ÝP®¼ Üv¾vß3ñp¤Ù]"¼¡—‰sêÓz‚½3·iÄ5£ ¸îL¬Ùçè“—;Š ä˜£ ¾dÉ ÜéÓzå¹KNãas÷ÙhH¾±DÉ]f!Í8Ñ€}W0Œ ô©×„Ó‚–Ú`shãÆQ< ˜¦f=@І›‹ûVê޳IÙrA‹¼”´€½-ó­Hõoë^á=x¢mo»´HKÒ‰ÁoôP§LÈÔV&ËÆ¶3ÿÕSe³Œ¢Ác®kÁ ɵÂm”¾…ÁäÆ:nð Xh„•, -DeË»bDÃ<¯h.™Zºé7Ï(òÂå8žç0”›¢¥ÃJDžÔ,ïO’¤•¯„”òÉœœ œH^= Õd¬ÿ(ÎrŠ`çæÚÖ€„‘ ¯Ð]JÝ:àÁ”{">R áYô= ¶¦»m øX !BGΰ[-)„0 RbÏ8öµÀÁSàà‰‡‚Y¼ÈÆ‘{ÆFœLqGÉ~:,„n¶X2ÅØ‚]’? 0ê4Býr–à·2ŽÕ‚—»M`¤mÉ,¨7.„ ŸÓ\wWgŸæÈŽ@*ˆ×ÀÇ å¥b6u×ËÛF¹«)@žÀuͼåØ9îäÌG>3ðë“åétáÂs0É>rûKéļ(É0¹§>R„æGG‰“<éTF3Œ€t2%ùf*ž÷¥É÷G‘p1x[pXÙ’× o´ÒÏ)™CÆIuãX<{“ïfgÀ„ÞóÙ-yUrÖ¦ñ¬…çïwmàÓ¢“xÃeóJo;ÐÖýz˜bPÖÿûù ÖÿùaÜ/Ž^/{Ÿ¡WߣS¸ Cê¸Ef¤æ¹Ìav£sRâÅ3˜UߨñÌ.§±Ko÷=`Szõ—®Làþ ÉB­JQ=cú° `:ûƒ6^9¢–} */œWÅÞÇŸÐØ>ZU‘ÒÂÂ)":=Ìry0V^ü[]| áøǼÖâ‡;ؼ`Öä§²ÛΣó‡ŒF¯VC K•®AîN1WòTV-5ÜÖ¨b2¤½¢”œâûƒç¶ûío,£ÇFýdñQªÝ¶<+ēЎúø|=§•²s!Q@QO )ÃgUcÂ%ÆŽ•“ðÒVìrM!7,›=ÙSuŸ@0Æ÷¥TEíèbN˜&$ÂRaƒ­„ïÀÐ0ôöe gÝ wí^ižl‡_ÙDØäBjJˆÙ&5;k×zb.sþÁy Ê½è˜âHdž"’D„Y\ù.íªóyR‰'á&Ùënµ0äÊõT"fx€÷µV™ ¤®£NÒò&l˜™MŠûKÀçxI{Ÿðl&g t6|¤Íû>˜,ÌfÒ”j×Âj&òIµD£§Ù1ºy&%Äúù%Äûú%Äùî~þÔÀÿ½Y‘¿,™Ç²ˆæX;×E©ÓM`ÔcVéïm½§·¸èÿ+¹l„´S„9Ͼ’ñ˾Ú”æVùQˆ¡i3¨®ÝGe}V9“¾ =øˆÆt÷»ÿÖ1V¦»î?E)Öæå@©ç±o¬€¡‘ƒøý¼Õç£fËõ®Ü®0Gwm Â3ijS½ŠFÐÔQ‰8xª/ñTÜüµx aⱌžyž‡OêŸpâUOæ(œ “™Ì^`6 £d­žÃæ‘ íç9GéZ`Í£@-v«fÓÍØ]ä«Iøº2D"އbbÒ(¸oÎë©viLØõˆî£{Ò¹´_P´P#73ouêPNÅ5í–Ú¾qs6΃ù6’ e‰ß®»µ»¦ëRcý÷)ÿ*"D¬c»a–°¯‹7Âcě𡠈´(íØSþ¿í/"ƒíßúÛ[Ĭު'ñE©˜B¸qÅ!œ¨Tn˜ñÆÃ‹å²Ã*ãÀc2a‹ <‚'7È(áÀ Ìßww;©Ÿ¶6…N”±+K¾ƒ Ž….Çîû€Ö†Ôø¶I“D¦ô~ÕŒ%É ·ÿï_ÿ¤M1M¯…6ÑlNYÎ^=¥ŸL…ŠÒÓ‘t_·Hû̉¢ù—6¶xÑ”Êú_(>m…ðK³€HTX(¢4†(ó6V2P“‰%áwÂò飻…¦b‚þ4*¿]öéœÇ&ZLd›£žTîDç¡Oåsz}æØÂ_å ™Ü#b‰$úÅEhìBRz™©i7BR„Q•Ê[JƼ%ÈZnP?ë‰U¾è`–¾ðÚZþ?ÿðe—þú—ªä}7ÌSŒ² 6ω lýg~Ÿû³“möq+²–<~@’î‚—q¹×uÔñãÍòHZ@þ1¿l<è ‰D©NÉ$C·ÍC†·Ò¹»ãÂÓ€~Iq ؆oÞz óæQËÓMÚ c÷±Š½…Ó¤ê² ª<š9ø Iïd:{S5¨4Iœ¡+-˜NL±oªìÎÔke†²[ÙÆÝWˆ ˜ºyH -Î-î'‡n*ýçw»ÖE®þ1.„ÏÙŽ“}>R–¢y´Ã^È]÷"ÚÌDó%ã¶{ÑVzvü_$Žžä£PçAÎð¹ùºymðô¿öω¨®9¦`¢ZXvÍ7†G™#X™ÃU‡Û¡ò´5틯_6ñöºêãeÂÃvì™gêV¬´nhjÖ„êî|lx=ìæ2›c².˜Ð2Ô?s‚Iݬæ˜ÞP¡ƒ‰'&«ís–{ïQÑiFWr–”k”j,WÒñnëÙb†Àd ’‘Õ'ÊÕ‘ÏAï+œƒÅd×d–t`#säŒÇÞ†Õ/å^ÏL98;£Uú‘"w=HÛjn,ËãýVµÄ± °Ò¨+«ur@€…9ºCÃ㸣fzq Ó¨ê¯_Hœ^‹Ñ<-‘\Sž;c³ÎV+‹”1ЄH ´Y¤•ؤÃõ =jôc²‰yå¡­'^ŽC³ÅDD[éìöAT82åQªGßþïÙê'@¸+\=”•ûIdwô9 sÐ Ä Ë\Q›u6ðON¢ˆ6¹ ©e\¶SÜ]­G¨œùß(”>£ìk¹"g 6¶D:‚ztöV/B—…3xÉk³AãÝhª²°È[¨Ÿ«DiÇ&Öµð‹ž¢HzWÇ4ΜU;÷ÏQ½H™/Ÿi*é"‘¶ <Ô“Ó9­ §“R¸kn›% :T»ŒÎHÄÐù4jêÊÜH!ލ@\eHüoŠ»Nè-%–6%;H8oÏŒý\ ír_tÖ@йa Ó7Ò¾uš•Kž“‰nvfŠÇ 4êì‡?Í/Ë­¦àu- àš¡ug‰JOÕ®©‘Ü_ôPÀÇ»PõUô35{ÚPhÑÑ æ]–{Ã픫Ö]ÅDG/Ž¢&“o¢{¡Lâ™Ë¢@Gø¾€Úß u/®ûš£˜9àÆX0Ö].e@ÿ…³‚Ϻë}Ž·LäõLÞ¤N¼FðÈŠàAËâ]&1( ÐfǰšÙ8©áäãu›wêY§•Dàj¦¸'Ú<)ÔˆNീ¹ù'¬=Ü2‡™û7ƒàb^¡8)š¹Â3Å04›Uf•y‚Ó-V‚þ‚'-ËÔ5Z…HžüÞ•1 ~á=a÷cu÷Þ®•¢Vý(aÓ.÷½òåe¶È—[µ_—ð7Âf"]ÀÂ̪#vÀ%œÅé€àjAdš^Ÿtää‡çU?º Ï‘k¾ ÛÁ’5òþ\ Wç=îøä2‰?£Á·Ö*ýºo7Kö»Êü±¶¸ßÑÁ‘Vl¾Fq<,žÝ¦ÇG}LˆIWÛà Mâºê^!#IÄ;Õ ÓrUų̀Üõ–ØõÓì H¤)‹¥èÄ áuihâéBr©r¶êZdò€Xßq Š¿á+æËÌà…-³ÑצS…~’k¡º´SAÿ/_‰Å JtŸ'Pk—zi…Mð|öa³/ͩߘ3ü)d1a5D²B,|0kù5èUrŽiÅÌ_¡*ÂôIm]jrƒ3ŠIÀ¾›×÷{Ø ¼á/ßK¦U\³ÊѰæz54 Nz©PO"þií­* ²5Jé Ê®5õçËód2r†’c Èõ·xÒn§çô°tžÕ=¢U¤¤ ˆÝ%Üàò+n}K¯˜ö|éîr‹Â:–Òâò»˜ä‘›@­9ÉúZšnY*­ƒnU믗ÔÀ'|÷ ÿ0:Ö;\KR&œ¹Çí äöN»"ëÁÞç?E³ ÝX­ºkAWMI1Mf~¹¤_, ¾îÅò]òÎʼnEø\’ºä´B`ÞÀ¸8C’2ºÔ2PÚ Ž-—{QX,1>º’Àfdä5€ {ÒŽ1• âÜddU×Ç|“«·ùú¤£hØr¢ %\š›Â°°î_É¥©Ì击ÿetÁzOÞhbñZìEÂ69é:ܹs8¸nM»Ž¢|Žš1P„æÁó˜:_D¯ Ƕ¿']ÆèP}MP-ŠIñè±ÇÆ£»é¡Ç@mˆš9Œ:Vÿ;­oæ£@U.d鉊S¿¤|¿é<— 45CT¸¨1fk¶m$KØ!`|Ðþ&EéÉ{%µe[_š›ýûPþ@Fˆh  €äz{µ 1Ÿùdä Ÿà“>k_µ‰ë>ˆ±Í]ËÜVëåg”PK°8‹?€€Eq,â#É´â,^ñ/jX ¾h œ(¦™™€ª³Í]³‹1Ê‘€Ù5ö{çäÚê¶ôn¬—@ï¶3Ѩ‘4 // ¼"‹®låJ¦®’à"ø÷ @8_©´*xá©+øøè²À&Õµ…hÀV´Ã¦ÃzèãR,øfXêÅyKRÎ}à<âRUXC¿¸Ê€S––ätÁ¥¿ú„S•ï²þpö® Cª®÷[©ÝéòjG¿íÎ' üÕø;C»~qK° ãeÞâs8 ‡Ó¤¥uô0yá*!¹˜‰%G±—7›´} Wæ©pºÔ¾¥@{µ{³Ö.œÞÅ\¹g¬HÅCÛ^¯27²¦óéu µwç@÷JG¾Ë0Ò›»©GÌj¢ qŽÈ0ºÏ;dZãïð%ª®TÂ*é ¶c:õ*Ï1=¤l…y¼ƒaŸá§xÇÈ5‰ª…u:e©Úù¯?ÛK »\º@nѰäGìÂ8ݵþ¶99è'¤v®‹ ü}ÏbY'EaHÎãnÐàÒ•úÌÁó W%çˆp7W m†.ô“p”ŽÄªÚ¤ÿ±SÖjC¸±%¡r»ñ㶉ť|—Åg°ë\õ]ÔnºaãŒ-Êbg÷×/QhMŸq*8A)Qå ©båÚ¢^œÈŒó{O±ªµªlöx›: žT’$#äúÝqvú*¬Föi­Dq×ûm˜'¨#¿ÆŸz›špY„¡¹NLC$–'®­†k­¸g½ÏŠKµJ½¶ÚC.Âoœ¸ ­ˆÆ®epæÐôyv©* `X€Ç8¨U€/ßžýðR ÕŽÿÝÐR´«%7ãˆy 唤k*ަ³«<õÿ¨òcžÞ‘ÌÈA¡ÀÄÓç|Pé[àî×ð ty)ŒŠ™¼pŽPámZdkSgç¼…åÆ'¬J+>I‚ÙÎ>)œr[ău´e‰d¿•ôF,æÏ_GW]b–† žS7¹ÏÛÌN5CJ<‡8Ög†îz«È0àz޳æò ˆÐ2ƒ§éàOZ>ŒŒÎ"v9æˆÌà³¥Äp¢òƒ4 +qÆZ¥'g¢¿0¡l3ïéšDL±¿­î×Úmx7ñoÊ;˜êö¹›b·¿|Dªóg¼§©²d?lbj,üÔD2‹ »ÊæW¬qñe¥È~²Gßs’EB’»‰P>‚Êw£g´BÐûwɉY;ï!¤ø#×E\QMÔ5 ï7ÙæÓmRÊÃHã‹t=uÝ‚¬ârLHv­™7œ:ç Ç8x}ª"3JvŠzUõÜô$£õjã–˜Nre¯@¸ÍQ^Í? ¡·;«ß©é?…Ö°'ÿ@,SPìÊ·ÐOígG8[ü;×Ú*¾Pÿ¦kIÌŽ·“lüÕÝs¿îàÉŒxž˜3cJX;«÷÷ žzøQþGG‹Lêÿ›‘h(MGc•Õh/Z~ä¼…y.´’Ù=5UÜÛ™^=À¼‹:FÓ¾rÉièñ…¸(ˆ´À!yµ±ËÀƒÒ Ü5òúÜÒ nÖ_ï5ËÖܹùÛs®öÜŒ‡PÞ7!¥ÄéX®mtù<Št°:§v1 û b„³Äª›5âºÌ"øMr.P!¥÷'½R¨ûÌbSºR#¯?„Y«ì°a)ƒ9?Üß“Ä<Îwó'*Œ?-+MšÁ›Æd¾ ÃçÛB°ûùfûPý »¾ì|ôé–ŽÒ­º-3:,£ |‰üÇw4&_§"BF±²?0Ñ:%Âà´®gYAÞÐbhf¬ù1A„…„ôŒ¾²iìݯ²Œ ’ßsÅÚõŸM4(Àø¾døø¢¸ÙYŸþóôW±ô‹©— Mç:U³kwѵ?¦ÝŒ»ÙÃ:¾ž“Â9Ê3¬ØìJ\N#ª§ûý?&'àHðê6¥°†©Ç¶§Z?òƒ·7ÍqŽèÞ¶0×`’êYç[Òà±mQ±rùD­ðÞËi B Še׋*2ó¥^)lÛú’驸A·Ñõš‡çÜ7{æÐ‘‡éõ½ž$N‘á°Ä—e¤÷kÖʼ—BnºÚ]½ØE뤘<^"®! n”žBu?FâWû…rÑúéÛ˜<@ÇwÍ™0óùî )Ç !.¨ãË…T܆ȩ@HzF FcWXžŸþƒy‘5q±Q¹pFãÞm+!Ÿ éô@~t6Ñ&I¼{v š¥ èK*™wXšC8Ê•v‡žØ€4{K¾”qSÜýóD¦ ¾2&ù@*q¼•c{íÜ1ÉÁÉS—€S¹ÒÃÆÉXÇÉÅ_Ýæ¦7µNœõнOé…‘RL"Œ¹82ŽÇNåích–:˶bXd]áó¤\•³ºEýòØ¡ü•¼óKrˆ/Wï[ªàEZ{Z§­%z)®H¢š$R™mÚ¸ù·Ç*6ïå-€øÿO çaþ¯Ù„UÈ6t'dô@î S»3©úDÚì3>rñáO`ìŒ3à £ìïSQƒKéfsPø*~B½Mzó§•Cgh¿È0Y˜ª–ï&9òª³~1ŠÛ4Ì0m¸í¸d¤rMÒJË/d7{¨Ò€'ȨlÁµ“~Ÿ‘¶ †” ߥm´xhD2.¾¼ç0çp3Û•#\Ç骳«¡ÈDUz@­_"; ÒZxÜâ “sô½¢ýJ@£GÆ×GˆR˜LéÀ„4\Ï~¿šC Ê$U36hÈàÂM¤µ?¿ÿ‡& ™O_y¹ÔÅ{ ¹ô„OI’ßÐCñ÷E$u2hï×^Û-¶ïz:‰š×j(:Ç€Òêb¬¬žE°Um/Å>G5¢ HÔPeWnB1Bw!"2n”EY¿%5@#´ù…'U*¦” NÔmZ¸~+‚ÜæÚÜ#Èpý´éÖ:‹áö5†*¶VA×¥òU¦©Œ<·1c9™‹%Æ]µæ„!?CoŸ”†£).LóŒ|çÏÕY@áæbmFžµÚ<¸ö”t…`Š †a@"]&QñÔÚ¨سW¤W‰—²@O.ÊÝFŽ b'Í‚1‘¬ãD=.]L*ºi-ÇòBì$¦á ý†D¸˺fzL˜ÉY¥eò{¾Ö”˜ÿ´¶³Di4^‰D†<¨ ½÷Ï™ihY~{rA¶IXã-öô¹”Ö™º“mdgþÍßèÓ ¨ º·µÎÅðrt”ÿØüZà%÷ƒè?U‰Fä™]=%ó¢Ò¬µ,ÛªƒhY²ŒÊ‹a*#Já~¶àv?Á[AÖyú¾8‘Ûu pãnäþ+Ry_¿cý/Q߇õw5ÿ&E™QÃH™~$ïq<âwG ä1^^jÓ‚@œK©‰\1­”1¥²Èã÷8lã9­š­ÎZô¼¦²ëq‚/,_¡Õª¬7w˜Î×Pyã—<Á&^×<›Ü°¶Gˆ&2oÄøÈso!©×jl\"ÅÎ*zŠgS…U«™Z è¿ÁØùÎÍIM³%YÝÐp:8®v“ 7Y@bׇrRy.|Z} ž8«¥>ö­?jdÕã%’4œú¸¯ÎP†fAf§»L1š\ž±`>véå`zÑ 6¯M6üÝ·Pò£R`¦dkwiòÄz´$D:[-›·ÑK8ñI¥ŒKE±š¡ÅñaW˜R6‰‚XÞ Úßí`.l±a{”ªZÔúÚÆÎ(.Dû•‡¥J^%4räÇbd. 1tÕÈå”dFª}QUR“-Oåß§TyìÂím§‰¸B<¨µÒ$÷:¡ÆïQ [^h¯yžè£)z;{…<¸«§_µ ÏCÖ‘{ZÕ:Qâ¢Ã'®ÉL5jÏò·¼–LP$mag£F{‰Ðõˆ³4zúc8Ûq"œ'¶TŠÿ»~î=±ó33¥ ÖÉOÐÏIÐÜ, Ù=*ÀôüÇ5ë]ØŒØ}V»Hèïtajs?\O}Ú’¹ºOv»fî%Ú05;Û5Ka*ý¿ÜbÒ¿ÍÓÆ°‘ÿú彡9MôSÿO½¦ÿÂS˜¢ÝnòóWB³ÀŸ]†Pc¤„g*TI^¼‰ñžyV«ÄqGòáU»žœޱúÏ=\ühÃâ¥Ûy,ªýÿ@K=<¬´(mìÃl(ûìDöôót`ýø@2D@3oe»–®À®Ä’ôO®ÿíIF° fcÅ Šj'éû6é_éMÍÛý÷ªúð«Àh‰  øÝw»=u$›’Û“IðwÓÇH23›Óž¹È¹}ÝÔÞöèBZp ¹SG•(åÜy´£PȽb½…¡ŠTÞŠô£TëŸPÐ :@‡fA=ªZ!Z2¤ÍÍ€ÔÌšÑϽÞ÷»ó;ÏîwíÚµÝ%í¶Û]·®i±¬Y@¨²Ð±†°–ÖŠ°Hkù E(0Âô#ý}óà ò l<ô»³¤Ãü†‰˜/ã>–G?$‹$|ì<@‘ŸI˜7‚䈡‹¢¥Á¸?†³ISÇ>ÆfàêPH–žØK^ ÚF¡cCè!Ñu”HGà+öç"µæ‹ ‘ì%!B¥ã*vb?œ'Äp窖}Éä!šM¡GF+îêù=Žñ„Ë^|B•éfÎ4"ꌼÆîðMàˆ(š³eWŒ‰yjšéXÐ,Ýïn˜c_éÖøxÏcúqÝHÈÝ— ìÅ»@3¨Ž§$‰9JeÊ5à )Ѐv(—ŎÄb¹L£Ÿ¦­Ò`£øÜïÏ×+Þ7ìõ9ŠS-„G¶!LxØnŽñþ6Ébõ6㞯44–½C\ôQòÀ»hŒŽÅ¿ïn‡+j|î·lÌ„Zs̱;‰#¦P&F^7ÊRŽdŽ}ðaú_þÌÃÛÃïÙøæúý f’¸~¦ç^Oé‘Ⳇâ½hF3¢Æ¸ÍbÕœ÷.f˜w/CYeÓ"ìlzȹ¨®êÓ/å3ŸÕþ ó93£ˆý%OpÏüèÛ¤:o”;eÌÁÞ òººúq/ÈÏñÚŽnÀÀ<*«ì06Pñ+ÉkîÈüw…ü¡B‘?¡Hît¯‡.AÀ:gse¯ãä»Åª:ðĺ¡BÈkÎðõ9òéÿ%K–û2ôÔÖ¥D†&GV)µgXËó-À+­ŸÉphí¯åièË^¿¿Çñã™.ôº]MøÊr}¦=Î?@gA¡‡ å]ÇQ~ëüVž× ¤ÍÍB6>ú³OP"/ät™µX•W «3¦¦¶ì/˜‰}Œž =5¦5<Ƥb¿nj¶ü=)Ë~¾ çf2„ A˜eÊßž ³É—ÁÂûÍ%ŒùXËI峩¿É¦óe`9ó_D“d’W•=K¢p@Ðô8(H¦‚³^ oØÕ«ƒ€Òñ•šD áJ‡ :‹lÞAÈ‹ÑyZ%DjÍà~xú Žx0ïþô·þfX¥æð¦ži“­§Ó"ȾѾÓòŸì¿m.²5^.», æ¬ÍHlÁ@ŸM5Ÿìø &÷Šr¹ ÖÖç3Jˆþšèó¢è² œWä¼üÖ󫚪7¬è©¿vôñ ‡Ã!Ñã±™"/0MCBþ¶¡Ô_ î¹[«½wÒH³™¨jÀØÕ Ä®Ôäzj'i&šã«÷Ó§¢hD¦xryÍOƒí#·¶†Õ¦ã(K?µ÷÷OÐÁô­ à®ge–؉ÚpäÄö£:®•Ç«AEPªg)˜åjÌPpÚF;?M*; Õ8Ë÷üÜþîëíi;û€œ.Ÿª/Ö‹N2â z|–hY˜ýûÚ¤ïÑý$. —"`@}5ô?'uèÙwù·ýX&pïéD›Ç/ ,ÆÔÃ'¦¢73:A—^|Š33ÄDѦ¯Îàѽâ~D'Dû÷ëäþãBPr°ºþ†Òȵÿ#8£Îp©/´ªõ“¢ˆï^éAº`CÑo˜8ÑÑmý‘RÍOšJQºR½!n¹-Ñ.¾˜Ft"4:R%š^?*…i4241Qb‚m0«qŽ€Ÿ26—‡“«I±žƒ‹³–GáA…¡c™§Øl†bŒD<º!!IÎ÷Jq8­ åG{’¿Ê fÿËîcãMÉË,ËY}ôW&±y²oha¸Þ aHGãÙGòš˜·dDÏÅÄ¢„~`¡sM¹Ö<é‹E‡ËªËÒ+KqÄnBb•T_•Ä™c~JGŸf’?…3 *Ta°&Iß´a²ÝWp6t´þhŠÜ{3¥’ŸéiqPðÇU\z¦¨‹D1ž‰Ö?&@¢ÂNçƒ×•ûÏ–ågÍÍAäÑ —Ÿ˜^AòЄ‹ f'JpÊhzgtû†ç?ël¾$̽LPe¾RN-íÿîM @âJ!Uíúj¤–„=½šã@Ä¡ò±Ì(•P^ÿ&:û¨çžSa]æ_ê d¦/#àÏŠç´,Y‰_hŠa7³@›¦z‘ÐèQ2SåYWJÿ¡ÀÁ¦;…ô¡Ü®[Ža·âBÜÍc¸O¦ˆ¨{)RcóêɨŠ Ê%…ü`?%#‘q|e+1š÷$tá‚0P‡:°æª²äSf[ R ·–è¹³P†hÁúeZ‘‘eÆ›&}²È%”¹Á~25$zÇ4ʈ¹šÎ]Ó§Ú$jÙ5Ø™•ÂìÅV Ê.PÙæØ É“œœã/1IlgK|ÊR²‘Ô u×!˜½à>%yÎB@Ô%‡ŽÒÞ+cÓ%ߘ±b`» XÓG-µ£´¼g}bîNÒÙö³“è‚ñ´¶8…Ò´éô½÷ú(5Ù×Ë‘¿D¤áÕzåXÑ&ª,'”€ŠÚyCÄ^1‚¯ ÛKBì“=°l ˼ ÔÁñX)ó´¥%²å¨Þd:S#E$öK —ÓÒz¶0ÊgììªÊ¿â ÔÓ¾bSá`rÍ1ûãøØjwô]âó{J^<Æ×ÏFãN“̳‚aâ"ZÆè›ESê2ͱØû=²6c šæà©)Ì›à&K6¥1'aþçx'Yž }ºk!…ötË j¶Â${ãTòQp¥Š±PiJgÎÙû Ò{rϰ©ž«LÎçJ·‹){ ç5&‰Ö:“R¾ãûNP1S­äDÚ³«ûÅüL[KÜ5—Ì?Ì6-Üve9^ùñùüƒ³ ‚€7­kˆ ˜blµé¶2;Vûsðq¥`ø#ùTHê 1¬{8Yàê@k»Ð&‰ oïóÓÅZò®P r‹F©¡Ÿù¿ÌoÖ®èMb¡iÌHÙ ´îµ—ƒv%àçòg¢¥òL³oX ‚¦Í Õå1ÌlÑ^äŠç÷óeXeW&ìË‚.ˆÌÚD¡E$ˆÒÒÇMaÅŽ-´×éû%Î5Cf³ éiÒW¬‚ƒ$IGCC{ ä£þƬ Âx¥(šJàÐ à¸<ÜTÎd×I2ÙÏ<C–ƈ¾ß©Øòà<Å›Ó$³S"u²°"ÜuTææEMg- Ÿs§³ÖØ53{‘ ïÜQŸJéÑê úÏ©Õ(ËClÒ °-”Ý®SÀC;˜j)ÉÔˆóÌâÖš÷î\C¤èÕaH5T”v­š8ÀS/³fvSèHY Mf¢ŸqN²iZ¦¬m¹À×m'’fÚw¼À˵ֹØÙÓ1’e& sC€y2”av$ *:YÎ+€Ð~Ù¥Çs¥2µr×f (@øÄ$ U²`rã­EêA¬¹˜ÙtS5ÓB¶}‘Ó CY[€™*wMiÝ~*H! ØÒÑ'ÑÜy]ɼ9ᔣŽƒcß/X^7Ž*¼Šjs²Ï@K’ @bUª›?êHy+XÜh B%-9¤¡»u¯$JÕú³Ö Kº1KÈ÷̓‚ïq1ªg–~Á{Z(!€ÒßÔòÐ>ß9@"E Aó”'ÉšqáMqåm‘]›+V%Ê¿gÃÒ¶0Ð)í^ÝþO¢î[X˜ÃüÿKnI!E=Jl §tü%U:¤ñC­µÒÑÀ#ÛHÞè¿ Ü¹ª‚*)CX]5¯î™T\$R…ô¯©õ÷qüñ=”ºó[8ßFÈN ˆÔ_©çxy¥¥IÙWfb5µÛ}ºq$¶:tÀ.Ê}Ø& ’ …B=S^uåß ÈÚ”9ü_ÌHùõºeòë{§t·Ie|Œ:p^z² WpØ¿Í\äñ)‚c¥¾tbD÷ŒÑ”R(#L¹¤ØGÏ $!¦xr0e±‘ù7©ŠþæÓßip×à”=î–ZVFZ™a×ÒØ:)#¶(šFˆ:¯Xÿ1r¦¼’û5oŸúç_ q„î HÈ픩Ÿ6D?9¿·€ê½=x覵hF+õÌ6\YJ2k)šsçdÆö:²ÆÚþ³Š)¼Í{në ÂE„–‚=ÁÑœö=S@áÒ`ºÍ¯X©¥<}f£”>9¹•ðå´¥Aûó\i’-募ÚÿQq0œìI¨™²FÛcÒ¡yâ²bAV¢¬´T²ãš¬›ËžÓ„9V‡ë$FʤÿÚ‹’¿^Ým¨Úå w«ÝÈY±ó®y£«O›–ª´i6¼X^EñõŒ*[z¦ß8V"ªi²ûóÈUýÖ¹ã\ÝÿPÑT«NM´] ‰m+¶D’x¥¥î`SâÕ‹ºÀ—dAûõóz†T‡uh‹òL¥‹­Å&킜U¦ ŠiØ»ûÍ4.Ö‰p®º·«òz»÷5u B¾e$ÔŽ„”}ëQ 0";Ÿ,/ÌxèÆß±ê31WR/×lÊÝ“'𰶍¤¹ÛÑEç™ï½]óhȈóŽäæš6:»ïv»¯ ¢‡mGR‘@¿›Oè稂´ê„öQ®ñbtWâ`Èøÿê™'õõá¡ |¿q»pdãŽÇFÐFž#bÒqGzvGÅúóTMû£r‡(%EëCéáEïŠk}>·¡Ð²#ܳ+ìÒ6Ñù{ ”ø:p„쥛[C3ÇÛo{¡Ù)b Øí%)€Yñ ‚¾WNÍr®…íŸe }é÷vÞà?ÝJ&Õ^ª3¨›,úæIú´2ñÊÖ&Xn=ã”q†²6¦_òè=—’I¬{ÍÛÁGœ¹ÝD†b Qî‘Ôò¶ZsCw™~œÚÒ-bvf´ÂÆpʪnm0_p²g—Vý¦z® ÉcmÓ\iõ–Ÿ½ÖÜ*kvvÉc¯6(’óàb(ÁKbu Lm#%´|?—Àû.õÁ±¦=WðJº˜“°v ÜýعvzÇ”„:ðï•ø¦ò¬”°óÄ\\ƒ7vÎýSˆËÃ}6t -u«-)sÐeq?I&)¼dV@vm§ÉýVa©´n~«boXa‹î´‡¶vé>ää…pk(c§N4±÷©ðQj^´ãö6aýrñXÙdŒ;e¬ïbËÊ\ˆ¾IÛ|„“·ø43pEwjwyðQoš˜Ü][øK&ÄYHW=CÅ«Pkõ­mL-­“¬4tGT7æU#Å:}x®‡Ê¨†U¿úÔtN9ôµ°•1ž°>³’„‹H_a\¯úLÉÅT\º#ÅCQÕ‰“A„úêÆŽ×ÐŽ\Ü“q•8‚ ð;ᘓ±¨Øš±W»š_xUR׎¡¥‘ÐŒŒŒêÿ=GÚ‡ £ @"".¡Ô7i;EES.Ž6B.¸E¡Ð¸5ò)œ½öSëUgîíË7ÜóUþ§T¤ä£Ã»¡é0Ü5méëVò]¸`j’SÈ3j¡š¸ô­j€´.W$cØZWÝ1Dùæ%^Å­€vµÒ|Œ›ùš[göô6?÷o•Ì@fÐ@¾ÔkÒ‘ñÏ«0ƒà×z€fÊRÜaÆ8þ|¹[Öñ&«`Z‹ÿµ97O"”¼Ì|Ьše`Ígz?Çݬˬÿ<6HóúÉÑÿe~aÀÍßeZ³»zÓ)Wœ,mú>«ÝÞ@«|2ÿâ$ƒg!ã¾Òº¤A)¤¡Öš=ozÎRØ …¹©ø•ë4y¾`Ö¢>jYö‹ã«úö-29E¡u• å{á¤{_ÁصõNyCW^Êð÷Fð{e™“Ÿæ\0‹õ œÈŽ2¢O¯©6? 9džvuZV±Ù„´ùÇñ½ 5ŸÛ‡­Rèfî¹f´çâ$¹_ûyèã\(Bªl½ŒJEÉ‘øÎ$†¿v¾³ÑËð= ðèÁüé ½bƒÁŒèÕíØU“»"„—B/¸riòg^Ùá¾$”KöþÎ3÷lcH"ßйM7„ÉÝr»Ä§^!4¥ñ´Ýâ«á4L]‚zãïèæŠÔŽ÷:¿¶ ö¿ CµÜž»gWZ «‹8j3צ‡Ž¥¤{õÌô¼¿€mD;viÿ_>xan‰YªÍÌ.@³?l†Ê‚òã±¼£uý2ÂêM3¼§4~SÂàäJÆc{SV§xý«Ï¯¡=R_ë°\×œÔæwŠúoÊ{´lBä»å¥{À`åV¤® ð«Fž‘Žcƒf GºÒÊ{CÖR/€A$E²} ‘Ó„À¸hµñü>ÅzEèBq Øü·µÏ¥¾ÏF–yŒ¯w£×׵ɰÚܬ¢½;ÁšlN’̱ýíEª ‹™:ÖSíT”³í,Ú›E%–›$–ºKP*øûÙPŒ/”û_1lc1Þ…Ð]Õ²§R…ÉÚý‚n¦ ¯Ê®øÁÓúËô²?ÞÖGžR‘¨Iïê¸#?!¾é<Í{ɦ®³ðŒoT·Q~·G2Ø\| ·ÊºPôR38å§¾ÔŠ.ùÿÍIJ ʦ6²áš„qlY¡m×gEë™Ö7عljBû+wÈK¨g ¤Wä)¨¹²€˜·Æ ’“¡â`¡?ègæ|‡MQèêIô¼ñÒFèx³pa®Ökn…:yÃC¶q&®©™@.gÉnÍt„¤íˆ¯ÙPÊQ>°tÎX4Û}ÙÆuFÉz~¬ÛcpHÛÀ]GM.ÿÉÁ\¨ZDaCn[Î5îFa…˜X&J íJÅI[…Jx|+¯ ¿{V(OYmm£lÇÖþËmRÙëCú¼ï®À•:dFØ^JU›˜Èyinò×ðŒÊ¢ã•í¬»Eàû¹ýÖCy®©hÿkè$ú¤)µ7„Oúë¬èˆ,Rf©%êó¡bãaógåâñ\j¸®HJçij7kÜšNtß\A¾ZDß/fdm xvl¯È¥âê¹€‹C Ô3T»;ืàº÷f2W¯˜€Ëï™ê£Éj6‡äü¬¢S´f›'Ùú^D£y2»9¶xµ|K$+Ò‰f”QÇœv$·øm•ÞŽG¤ô7{Ÿ÷¤?gÞH*f<Üæ§g“•ó\a=åÙ®@çWä]•ÓÙ%ð"„¡¥7·Ž°U€™ÞŒEÉ.L3¢»'5‹²†$ª(3«Ì‹šº÷],?ve+Hè¿ŽŠ§Wû„<À¯Õ†Æsí\½¹6ªj…ã½g½jÈ.*bùŠKÛ–Ž;R/n J¼lnKVýþ=U\⩵_†[“l)T>êdcEì'øk1”ÚŠ¦›ôÝÏøÄE{¦î&”H Ïð´æd±»Ã©># }ûÙ¾ÂéŽ] >#«ã íg]ó“ g0mè´£ Pª/ ˜Gï’ûR‘/†±M-oÝÖqØî/ÐhÑ¡©ŽžQDGÍ×Ò&tÛÉÇF$›ÜÅaºm¥æÙ4.܈w „Qû1‡t´e¹}ìøpè‚[ËW½º¸®s—œ¹ûkÞ‹ž•0×ëþ#ÖÐ[QaðžܾÝ;Q%ÏLs£Ü›š4œÁ›Øª{¿ÂŠî†XÆdé®(îNXªïqK1çVY‰OL"¥·¿—WŠ+NâtX8­=Zo¢Vÿ®S;T¶QZ2&›tx-€Í åƒßSa‡Œ,ß¡Qiïdh¿®”,Y"m¡µIDQä„ã%—Zâ[F+Å¢ƒŒÈxßnÙ9>à”-ClY(¬ÑDËöÔ@Óz””- -õ,Š`²Œp—¾Öã’—–Ñ ÁØùò¹D„®;(WNr eGed-O¨R½ªO-J6”gâÝt@yp³ó7º2iTeUS£MÉ3¤*MD°zQ`úŒƒ)Zʳ>üó¡î(,Z¿gyƳÒôò Ø-4šÊà Þu Ûç?ÀbR¨¢ö„ìr·0@tchAîÖŸ^:Oèbì”g¥ÄQ!âoºa۱͖P­Sîxø+‘õË)¬×7ôˆòúí§ëïÎÞç9Í–lØ”±½¤¢ÝÎ"B2bDéD/¶TÁµ1ßðàoy)&§;¿º¼ÛljB^0¸ˆ”„IÃŽVf#ýìλø• ÃZ¶×/ Þ²+6è¾J#@!©‹÷cÇkR¸!S—~ªzêåM,y1EYÃK©oÅwcºx]&la«F¤ÙÅÑ«*ø-g¤§(º‚xךÕâdvÀF™‘4r$j-(BÓ"te‰„´DR+Lñ×Ó Ë±ã漢sJ9W¶ÿƒnD¯ákÝ!`'çtŠcü×ÙBœìwèÏŠ©âùXjÿ—Å^vEUšAì¦J¼Ô4@-Ví%­0­U"Ãek.°bÂorõ÷3¿MŽ„| ²B³éT‘ÊâÉ$[kM‚ÂÚ_+)_i–çCƒhc3ÚšŠ&µS ÔÌÈï 'ú™h):à\6ÏÍÓØH¨@|šª’‘)[•ܵ EÌ·¡Mº ‰"C} 2ls¥Hñ8zj§Å›I íÒfÕhÓ››ÈBˆ}ÉDN-;h4SôH›³p­•Wëm^µ3JéøÍ[ywÛtLk4³Xá×¾!µV @Ç›>jêÇEã—„ À#_ræ P‡ö³£ô±#"mʇ h*×­‡êî¶KŽ‘YÇBwÿ>dHAy™óe|ÃñØgç Ž¿¯~äN«,”¿ú¶E•[ØÛ,3õÈûž;äÈ<Ïyq7²z‰ï(vàA¥Fø¤j‹rE£²çî£7÷q¥¸u÷¨‘ÃÇŒ<×J²ŸÚ"¿üç2¯=þ­Ùn½Þ¤5 ÃÖÝÂŽ…ø|Z4Ö•÷褘éµ"iB!Á¼+sp¢†SˉµÈÓÛJ>‡4«…Ãàš™Ìï ¼ }F¤Ï,ÞoÀéÓáOGð®íVÜ«|[\ö>2¶Å<ìPÞš”ÿ¤ìfú¸°I¼¸w…  ©¹Sþ ¾ÝlÆéplΚ.´ölfÕÍ­Þ&ƒ5ІÇÙ@™nP†Þ볩¡<ƒ3t:Óê°>2çínËP ;ãŽ]½ðòí÷H6lz5éçÿ¢Ï¿1äއÆFJ¯ä<÷l–‡§Fy¿¢ÞÅNN¿€wÉÙvZùwz›®Zü2D¬bWç;+‰¸H½ì# ý ÜwÜ"ü®ÆÂ˜Âü„êÕú[ Ôhb‡XÔ©·“?l‘I¾¦7Q‡°1ƒTˆFlà]„Ž#4NM‡Î*®´„¬‘ ³ç`8ù âïih ¤—aW8ÿP2ó‚Í1ý]Qœ»EÅéCr¿‚ËSŒ6?Z%—¤j0ÝȪ`pÍŠÞ£vå“ñÅ6Z«õT/ÂjζA¤ëªÓæ#B‚#¡šeó¶ƒñ†Ü{/™:V—a¢\Á¥—àÔTJ;}·k¸Wý?$_w®æ6UL*íâ•P¤GÙFÇîׯV}àfÃ6½ŒAë‡9…ÞÕôʦÉ~á¿“(­&ØÁ ÜHˆ[> çu-çöšò2y7°_ALÕZÁ[¬è4b?ó„@ý©vÍ¥ ³ZFà NçH€ZO§5þžamïÉäz1å±1AÄ,·#&âúh·D‚“¬’]¦€xMøúÛ®œå•à—¬¦4QVžÏƒST +®G8õÈÛ|Ò- Oe”2* Î › ê=s= ÁM‘h‚#`yøÊyoØ‚ã>¢/]™M;«øœ·œ/>42'l£Ü.&oîÄ/)OCOçï‘°à€:„Àu¼@O|>é;CÓ:ì`}8òiÒ—?]ƒ+›A7 î±¾Ì; …äÇcæÇŒvvÜM>ì÷ÂïO?"œ“Qß}øÆó_Ø> 2Ž+8ŽèÙm¦b,x¨‰¬¡XÞ²I7¡:ç#ÎÆ6öEuÔŸâÌæâÀŽ?Ìb!øA’ *%>Ù>ûÎe^ÜÁEý…E xN©ëè˜6õž ºë[Œ‹èø˜Ë¦X¨ëìÆæ¾×¶– 3LòB¹ë‚½^Iƒÿ_xHN4÷=ƒ±§^ª•lÙØW×ÄX÷aÄi„œØšñ!šm½/h_Ú‰(sÀÝv:›~Áõ‘‡ð¨}è!ðy)ôïÑl@ó!>?OnluGnud°ÆUÚj;ÏelɤúZØ­9xn ¬}Ð%!ƒïçôzá¿iðsx {Z t©!HMEÉævœ¿ÊW~ywÊ&`œ·­lÂCyHûzÕ"(è,-Ö}dÿ %„"¾NÊ~x[óf%ó<}º‹–#ðÉNùMìÉÉ3Æ~ ÀŽÔÖ ìykÜ>¼av½Ð‘anÔ±}às ƒbfâ’>• 8{B ß,~>Æ’á ºªÕS‚ýF­Ä_}îIë-z;•1¾Ž_$ dˆ3ºáM” a 6h§˜*EÌFgŒÊ¸¼vKòȘ/ä@°‡×«xK£Hã³¹Žßn oÈx›çnëç¬CæeöeœL±]u=þ'$hbŒM°="Oªé7ǯgù—8_ø3K'ç‰ñ’Qéo|Äj ±Q‚ÙÅ£$!ý¹dN*†<SätׇÒSœ0à w(·ÆEÀ¹í:6ƒ_èágè†:ú÷Yû{Á÷4½R"Î4Œ2ÿ½Þèëþà~|ß+!HÁÌ ep> WLx»#Ò«Ko¿Ãtp†¥ ¨ Ã0¥NžŽ÷V\ðÖ©º•iŸMؤEµF\Á.âßAýK|§ʸƒ7y•½*QTÃÞïå5 R$Ù~H’nÜVÆ…˜÷Uú#»ô*=çNÝ"Ò“¥Y(Û=bË,\ýLV–F’ÊDd¼ƒçõ¸\¸Q+p£¢•0a}A_4ÛUQfN  @ŠýñN`:#`?uª ¯D¨ÆÁŽ?m²÷š½ð•„RõÞIܤÝûÎô `ËqwCáÞ?9 äÙwÆu†Jé= “zï·x—¢TT|Š&CX sì{™2ê Ö5Õ±‘u —Þç³0D LÌ¡ý«gbÇGñžÁó®ÞsD\oqÓs»iì4GÛ±áß•,ŠîúMbLG¾ òmÂæ®jø€½.ÝîÚÌ„)³—¹E,ôž³1Sâü®ÒÅDJ‚ëfø»)VA ôv'DWÓ„_f— ÞfzT£h¨ÒP\d€¤.ØpBÏ L‘VjnÚ8õËh)ÂÊ冲ëÀ? `²á-göY[Oí…E·êˆgný<ùSàXºXå‘BîBp ̆qVÌÇ•}Óî'ÿ[s¡8wó¦¾ËVŽÑ·’3¤çúlÐxž§®`ÌÂÄ̼«\·–qûÓ³Ðãbó²ÝÖ¢ÒÇÜ8úWRìÿ0oßž&ïæÓÅ Wž3Ex/ ÙõÞš4ìúW ¤ÉŒ…ü¨ëì°ë·7 ÅOy«7”j…›WÈîCâŽw­,ÉðÕ×Ì¿£Ld×D•–²´SzvÌÁx¡:‹&øé!ÂþZSÚœïÉòб¯Ü)ß µkEÒCþŸ;z b«(`×¶Ð4Ç+àA8C³•—£G&¤ƒ¦:ÁÖÁ·23šÆÔ¼U…“ÐÐWnr qE-Ì̇èŠÀ­¿§ëÚ‡#±DìpÁ0{ £UAÆOÎùjØ¿>8ì·GDÇIÓµ\wó ÈÈZ=ÈØ ¡ó‡:Y{xâ14§}OŽ/¹›x¹¤fj=»2€ßð.§:Î4£#ÖqpØLYA°•¶CÈ¢i üÇ!NÿÀ=0›Ì¿8+dËb×bFÖ໡dÌ©g µIEÓܾ“ ÀØëaâûKú)•ÒÅ[¬äq# ùH˜š9ði&“T<>ò)¶“ð“ÿ3ÄÐ X‰N×mÁï…ýëh"(s¤ÌxÝŠÅï‰ýßÅÈ…Õ)"%*àœQ}„¯OPz†X>4&fõ`9Öã嘈%¦ÌÓHÄœœ°8‚“ÆWE/LÊãùς̲ޏ Nˆßˆ‹„Jÿ…)ôÌ>DaD\Ôn!MŸ8ù"éN¼GÌš¨l¨ÖËMŽˆXˆ¡>˜c(”¿[4úg‚ù?Í0WVþ *ˆ«¡ª–rÛ™^ÄÎA×ÙÒøœZx³ßfñu*~î¬aQÄw¾79»E’Ba!)äÏ•oò½Jpþ#mG2TW3ou¿ê x÷¸®›9N$dØ€ÛÆ„ܸà·G`î¦Ð4m»K²åÃ{»hô}Ï’ÅFÈHd à•æÇ·wÛÝuúÜw}?¿Ëc‚Mö É“»w#Ì~ÓÆ*svˆ©åAî@‡Vƒ*åÊäC¥¢?½¢×t¨UAE*èE÷èAÝ+UéMwª¦díJÛ2ɤM†ªf®þŒï÷Ü{{÷ÛÞÎýoY©$eËr–+Ù̲¬mrir5sæãžô?H8Wöý}¾ÏtiG¾k€eÝðMŸ<ûåA¥>ÒÏÃL{Ð{ïvÞcÔ=Tòô˜uF6*C”‚ÉHŽ€’ÆM'*_–|2PÄEp$‘ÌÍFª„y’§5…PP‡Ø U{>©±¨CÀ‰·l]¿I¡ÄáF ð»\<] u9Ñ(ÚF>b\@¸Ô΢ÿ"Ø€ 9êcŽŸÖjK¨ –ëò§ Ö©9nN–ÊÔ“íŠð‰º’~@Ei…„ "þZ\4(r“'ú”¦bÍvŒÏžé(O L;‰ýùèÖ¤~-í‡Ó™#|¦FÐß@v0K¼ÍøÉP£¢Ac˸:*(Óm9w¨êèY3s7q )’BRH“ˆP•0´_S9¶åÑŒÅÙðZ4ïÎL‘DAÌuµ ê™®Ldk¯øEm骪ª¨ªÌSúñ\d^â~!CîÈ Rùv¢š]~- ÇD$°«%\Úvh.ûó¡Þ‹šŸ.\4Èñ©! !‘Vêû"#á­7ý×Ç Ì÷Þ:EoΤtgCžçÌîL?Ñ¥>¾h¿¯|-#°sÞø9v^¾Y!ŸÀï3VÞȇÈTz :ô6-ó‘äGe锢ÒÃÞñm"E:á2ù9÷Ëû'=”ù­Ùú¼¦Mk‡Ø%ÿÝ™ègõ¿`Fx`‡âUÄW"¨ ÍŽÕ ë8U;tc¼¹xU;6nã’ô*8|{MS´ú‹¨˜A y2Ú0QT¤ç?òÑYåðMGm1OüFI7—†¢þïÿ×ÛèÞÖÏÿ«Wäý~…P¹‰D,g¡O=RSß§×ö¥ø² àÊ{vþ—Ù¨QœFúy´1©ý¨"a!ý’JiôH&Eµ*Rtò½•é‚&±â½5œº¦|·Ò ºŽÇ—™!ÈH²Óó :­¡ÊNLjcÉþ"¾Aw7ì‡FÑH*@yÂ>2xI;Þ^à“^ž;<òR\Ùr  Þó![ß_ÞÉñžÞJý|}jò¹*#ƒ+ôÿjÎQÃ@ «Žòמ-J©"yP½GÞox>ÐFÍBw)ò*Ùp5”ŠÁ˜œz˰"s œcƤ`цQR}¦{w4ã¾AqÎÐΧë(ÄÌж}}åå¤ìuú3|íxè^æ¼m#ƒ—7ásÿ²Ì˜J«ŠÛcÀàѼrò]>´Egp“°OΘ¡¡|R¯çÛkf¨#“:móÌ?w@VÉÝwÊÔ±æ¨×¡Hµz i¥½èŸ>÷Gp¼à{–ªš Ü®ü3J¥"‚OÑ+h§Œût²a¦ãŒáþ¤M´1† ÎýF=Òz rnÌ}±¥p /WÇ7Ø~mýEû¨¡Cˆ9ßôßS{cá~žmUɱÇ5÷Û_Ϧ֩8\¼jârºý¥y$Î|LØÊÊ&;»†F¿z„bTöú­H»™#‘€ŽÂã”ÞóàœŸRœ°ÀÐe.…– XGưÈõ›¡ø3WßI©8ص’d9ÖÊz³ DG‰ß$3ÙA½ðœª¦i‡_Ôuvý\ÕgÃg}Ú$Ë“ÑâÖ,â!„ «qÓijÙL¨ AZ’u/^ì NôNô »ÿ–”8Í$Q”’Á¨©¤ÇÕîÂS}iz£¥ýÑà.6+%›ïæ%ŒA.œ,•V×B•FiF„¨ØA\ÞØ°Ý´ª’ÈæÈeqà7ˆutPŒp€ÊkµLQ'3}`éÈc·µ¢çID“Öʶ5Þ`ˆ!&‡R.Æh\Ú63 FaÊ4Â%FŸ=µŠc½“&ÛÞao–rÞãlüz]°8Fˆ‡³"$VÔøZbjÖŠ^'ˆ–gX³šƒí™5ˤ-úp?ÕO¿ cœI÷„¸?pÇ ¿ *¢íçŽêàÔ"B ËIÅ"=ÁjßþÊ'8.J]Áþ}Žƒ*S\dŒSä!¨G±Ê|\TºƒúgkxAVÈEØwê{6îËX1ð+ÌÍ[§&[™¾dzý»)N‘g6}cµg˜¤ ÚWÙ¸õ¡9RÀ:`ôÊ™ãø“¥HØjƒT–-0T¸ÞP”“^S;àhÈ&–(ráY8­±Í>%4žX©}ôÝÄ¢Ïoýu»¡Ï frÌóàòê­¨g€³vfl­í o)#mxvXh†Øx£½w KÜÌk3 FFWÅ7ÿÇ],`ŠÉ)Ð:L£ò Bnm¨Î6ƒæmJ†Ùpã­“LlhÏNwkö?J1:g´ cêhìd=úéU¦§‘ÇÕêWÔr‹Q«"”ê1Iš= dÿÛÃ::kX‡Ù†¨,ì¢0ܪIMu¬í"f« D“CÙ ¹» ™OF†Ú!}ÚáZ„/Ê{‚?W$Õhé$Á3S›]€Ú’Z“h í¼ÁlmB3"ˆQÕ™]Ö„Q³Õ‚Nv–Èܧl´šwc6¹ý<±7-ê·5®£>q #¦Ž­eÿœ10?q5Lh¯Bá)eÉÓI Ì@Ò*êA¢íg3À0 D %^Å}ÆDL-ßäá×ÃÓ¥-ÔƒæëbÙ®Öv¶ÜÚ¶ø zt8‚~ÔϤû§ ðƒòmÝèNÖ·^jÏžØz o9PFÀ#Î`¼»dmÞÐàsRLaTR6ÏáÏÝ£pg IY72Õh¨ÛQÞúë÷ÃÌ™ÌoºT‚²=˜B ûÝ/è ½ºiµ èÏE¨€™F*.ÖÂÿœÚIX½nt'³NgpÊ0JORVâmØá fÍ ¥tÓ",ê.•kaøŒ¦Vp†GJk‘SiXÔ3>™ðm°iè3IS¥Â8Ö%nk'â¾Æ:kHß1»Ÿ+36> t!Zª£ªªé½ÎÑ¥P¸¥!¯=­£WK¨57 “L42ÚoǪ Pút߸mÝíÞl#Ã7U3 Á2Ürjo ø~³À+l„Û•ð‰GNj†£Æªua;¯[Ú f@%ºbíz-’£-ÌŽH„éÜaWû»®‡KÙ†åì· åûù4@] úKA]ò¶õ€†.U{j9ŒîÅ}zˆ¿QÛ4´ ;ÉKÔµº•ÊÕi»^ˆ6 9gH;ß/Jlü^qòIÞÆ4ôµ6û±;ã{x§: š+~.`дÚCg…uÔœß&qø»£t4¸Š7‚•šø©ö–‘Þ”‡ ½Dt¥yfãìê‡Ð ,ýâôþ ŸHm2î¬ ²¦Ñm¹Êñ}u›ÌÜùÖ¼KÔX$?¯þ5ƒScóDAßê‚qñ `ÍBgˆüÌ—‚.ÛP¢›o¼W¡¢¸ञ{èld =Ÿý1¹q€ âÌa@PÀñ¹5*·gOÕ84X”v™SÆZÂÝ,Zn€»Ø&î° $;n•î8½r?¸jq]‚•Mò[8⹬düQÁ¤ þ_°&Àˆ·ßOn%àVT‘üÇxžôåÈYpó‘“´„ûƒw# tÛ'¸J¿˜òjzIXÉ%¤_ÈÄõ†jÑijýäM°@z§êÐJ1,N9XQíLÁ±KÆ«ˆaa%‚… [&K¦³6NYȵi>¹®“kžßÝRÚíß*CÖ~´äFa+iKàÏ©Çј.¨¶C=V“[-X ލŒE“‘¹Ý‚¥S4ú'`­hº Âušph ¦¤~£lãC ÈLÒŽl£Òþº†ÜÏ©Pœüž(ЫÒ‡ûä«é ï?[ü¹­Z+Óëÿt±2™ ›šX„ŠIœÜß6èa.ÔçÄp“P†ä×<µêC§éä]«±þ<‘~Ó Óü¡æ§í—a\«Ãì cO€„""(`ó’Ñ_ÑçBwÖÛMÊKJ’üÆõH†÷ï)R:Ôï.#øá¬­Y¸UxIgx:XaŽ äˆ”@ÄD’©âÏè‡h1;'÷µ+R zÐtœÙ¼„(Ýl&•œÇeŒbèâª?07Öb¨bN2K¤Ì^ÇÄÚÃÜ º&ˆ_V%—Ø' V¡‚!ˆ³LaÓmx/Æ-’v +å⥔ŒVÔ(?Pš 17MɯÊ<Ž)¸ /†3¡lÏÙ€xet%Çu¥}|Zû(|¯Æ¸âœ­u1<Ü-¸{ß¶É ¶ïEØ­-®#l¸TÆThÝAâ¾ÿIF—Üí(C‹ÜC]Çž_{‡Ô¨ç¶.Úamöl˜6;¨!ÖÀÿ\›Žžc5Î;Ÿº"|.j¾µZY¡n¬Gdä?.µV2=çˆÒúãa¾zÙÖb5ÀÖÅš{%G¤·xí¢ »=’ˆ·^Þ^:µGt’‡†h—eô óÓ¥|%Ï»£>íœW˜ ÆÉQ”¨µ ›Âÿ1Ü®ëðcltíÜ´htÍS²›û ,î=ƒ¯²ýð:…CÍe2½¹´”òk‰ø$Hx FëÛ–ÍY’J…“•ZœÑ¹)2ÿBÁ„où¾«Í ùÙV™f¯×±×Êi>£IØÁ®ÙU)qG·ÇuM$2c[KÞíîh­éÛ}ƒ\ø õ¾uýi’ÿ§zرç[׫ ßFh`º: :õÑ(=Øœæ†À›ŒWŽ#÷¶…jœYµ=Hx7Á2¶E<¯‡Ox%ÉƠ̥}‰ùLëLêl;«ü¾YÍ&ø 5†JHÁi¢·YœŠP{ëajÑíèé©ÐNß É¡÷j{3º, ;Ô¿2°TÑa7ÙŸ½`”“<ýTo1§œ\­Êt6%^šûÐÕSÊ{«qAµ*ëYg 3¿`¸šöÚqC 8ði“ï‡QüPˆ/Ú-‹ ÌñA|ÑÝ)œ•Ðå^öì B»ÇĨÍÛ_Û…roh‡™ôlß.av8&°Ä!_x¦dÔƒo˜Á3ðq—ÙŠÒ>e¶O½{ùÐ$úùOø¡iì3ɸùb‹xHê¢àðâò‘¾*à $AÆý¬1)0Âðx²8T ËrÇ40t*ÛÆFVO®f^«jVNÒ ÑÖ¸ìdœ4‡}¹á™*ÙÏØßdâ¨Ä«—Ëïl2€”XÓ™í.ëûÀ“Ÿ%ÛÃ{øSUûÞtcÝ«4B'wjå˜ÙeÞ3WÅu%-¡Úñ¶ôÞRér—É;Ñhê:Ø„©¹ƒ¨OíˆVûne¡uM®ÀˆÌR¤û(:•¿ þ²b‹ ù»5XBPžMB•ŸÑqì$Õ≋7Í€^WÄÒ—ëF‘îÛŸ>ŠŸ¯ó–ígC?/K£ äÛhà‰uOR~R]¡·\ððd̺;¦ È<€Ì>Þ­éZ`æóÑö΄»Úòˆè¡•×­\¡WM»Â¸Û6ðÉ^Q ¦ÖC“ÎîHµü ŒT£ô¾Xã¥ÒšLÎŒ‘¨¶™5íƒ`½µô°b¦òîý£Õ/@±7.àû “õo=üÛé•°„”‰3 ÆE ¡‰·¡“b½Rư—cº¬WB=â\HF9'W“Ê¢‹§KqѼ¥ñ%¨‰Ç}©ÔÛ¾Ïx‚ùõRócW«TgîS`.]f(ù—u¹S-WèÄåÖõlUs®jÍÍ÷5µº4Ç¿ú’8˜X±ê ;®Sî-ÕçTX ¿²V‚½'rw&u S¢ ·k@Êh㊵š-e¨ZiiöÃ>%‰_‘ Ú$Æ|ÒœÓéȳœ€a%`h¢¨t¡Ñ£ RÍ#†ùݡРÜOMÈ\šÝŸ¤ôô€c\LÃ'W0šŠºž®ºW»®[]Û†i€.…ƒSÎN¤özÛ` ³-RçO+rÞjĖ“ ŒdÂ÷ïKP%<T5¤ƒ\lI=šsÛhŸñVªØ@M qƒš¨ô´4œÖå§]]ï’ÙÊM­š»ÐÜwêä©'£å¹ÐU‘&KhÑ,7ý‹ÂŒM€ù²FwŸ;®às;n`ZR ¤鯾ºÌÿAžEbtåïö1\}öÞ°â•‚ÃHù±ʸ Y—Â$Úò6;Äž'»u”ÇK•)µ€Ô]£¸ª0I“™¦I²Wz§)âWPC2y‹CsA±Ç/Ã>c“Úú l– ¹¡ª¼r%ä2@k£ i}‚«yHöŽ.pET~°k~µ3•y§Ÿ½ì߉^š’Vöu%½°ƒcwYì÷uØÓ: “úi»Ü»ëgkRð‘$ðÓŽ)n(‹yÙ ¯GrR²[3ßÉýØŸâÕ©ø©ZÂÚ”J2Òˆ1}ñrU??ÂÔ»Ìd*‘„[]–e«Í…ĘƊ庈4‘Ž<’)‹Ê¹e:wŠ}ùÓ£ò±¤N,xjâZlûk„i1ã6’ ²¶™J÷ë"p.²òZŒs ìŸ4s§AƒÑ±ˆ óƈKH/ê ] V5- R-©{(Ж‰¬Ø|Ý ²ÏW¼¶1"—ù•µ~J«*OŒÒ˜¾ZQÖë.p¶à©8Þ'7D½8é‹®vµ£Û0üN©1`ð,íñú›“Ñ,éÂ3ÅÉË­̼†¿+Ác‰8á2¶(艙!ÜD’á…·Æ1þj 8æϪ¤ŽŸ¹¯~P;_6T‘0Ò2c"ÒßñÐ{ &Û²úîü²ëiˆ­¼–hK–ë“=)A»ã3ß´Vªº%};4Iûv˜)¨†Lâ³ ¸èàÝ}ÐAå-vÙÝÖ_®®kC!p=_ÝoÛeäýl¨[Vùi5£BHLÿTW&á>ò‚ÿDØMÝêš]mu†&™}«Û9à¢-Ï'Øn¼àíˆt ù_Ùv`3ä²”âÄJ ðÞ°Ì)§ëˆköÛ :z_plÆ¡pbÓä¾NØ_í¡úúªP:÷!}ñxrúœ¨ÔŸ#v}œþœNßC…›i¤¾C‰çz™øÍ+žsÞ|Ä9$eÝ"Ž'l Sˆ=Ž¥²–ò+P‡ê½ûçÌæÄy–†,¢#Âìù–ν½~>ÈH Âo¨Ÿt)/“"“¼ì§Uþº‘c{]<ì/(/þ¦bK­}âÄÌJ»Aü4vü2¯‘ê³€üoók邸ö¹v¡Bl¶&-c#¬uæÑbæ,íØš‚DFõÆ©r%êÕÛ+W'ê^þnïµ ¼'¸E놿È„`DW“p½†À—#~°í˜0ïϳ#¡0ó'/‹¶œ*iñ;fæ[¯ã¤p¶Xë­ŠKNˆQ˜mV#œ“‘Èü"<ëܯAlçk¹Üwš¤Ý¸,ˆ sí¢5él`ü 8Hßfý¹ úÀ°|Uœ·B¦2 °äd;ŠS _;‡#1è=×ÚUö¥#ƒ²BêZ%kwF”±iòF<26¸$!ÉòÀÿþ‡öEÑ—÷^¾õÒ>ꧤfÝ^·ö×ô>_KÜí5ÒÃ¥Õ¥¥“wì/"%å®bSl¬ ýƥaLÚÑ&-ñ½ü¨±é!Þ²_âê«TÚ‡Ï9~nŒ­+k‚ÃAû83Vïrb~?|­— úéêÕ 9Ù¤HVâãI^rçálŒ =û ä ›ñaÝø£Þ{±ÃçÒ˵ΊÁuOÁEÉ ë–“6&lì•ØT’*&/"¿`h ÷ÆL…aüÿ?ÞÓdb …û¦Ôì„R‰†áš.~T:,|nßge(Df7#þ‰Q¼·F•ÓÆdJž±Ó⯆ʎ(“Ž,ñEåÏ? ¢v]I%²‰5\PX’®ØYö´S¬`íçœJuâ[ÀX«ZQ'¾°†þ cé‹2™e¼&¹°Z€G/h9jB–ŸT´n(ëê<ϤCÉ1’ég›Í3¾]’Yi~f~uÑY6u¿œ”&- Å’-@]¯q½ý¥©{\PÆ×ü0”·s‚Å,_‡š‰>öÅý*”¢0zPÏðÆ^qèºt'Œb®­ÍšÄçÔxËtÍ£Goš–»…yO±ãÁŸÖ4ÿÏöwúªîìTç¿Ah­hU÷T4êl¸VñaŸ¬¹öÝdû8¼¯ÉÖq¹noJCÕeÉûÔmmÿª.¶Óh€NœFâ'š× FI /}fG˜e«~`OÇ /˜@Š‹¸«CÞ@$Sr58„&ÄEœã¦n<Æ”K– <Úò¶çt6 a-tø<÷äIò2zŒM<&§˜àvIS·î-)Ü@”Àô‚Å̰%"ËÝš }.jéÕoÜ(†H¨ÏâéGûÜYj I¶žP˾\ŽŠ ÝD7òŒ­T»:5/@írªqØÍìÀ6b"Þ †ÉvÐ5˵ØJÄ™?ó]ýLû»Ð4VÞ¢Èј4öwµOdƒ¢Ô)£O× ¨ÌCQ%êôòi¿_ßòµ•³NÓtí‚«ºáìŸgôz"ù,8àää¿í+tz¿?µF¿úoNZ)2ï ñ씹¿ŒæÂñò­Ïôûl˪Ìàâ×_SâËîÈ}u1Ÿ>ºdnzMwú=­!_ é_î9Ú8”ï¸5åR@ÝÌ&i§ÆBª ï¥ú$ö¾Fº™òs@h>×¾ÜKš¶â?Q.¿j,Sß}$ù8·ˆxéèÍŸ³õw[Þƒþø?Ù?Ñœ¿>Ýýæaߣ3ó÷y å ð<<žiaßÇyçüÕ´,?ýsà‡¸ž¡¹ˆÝ€æ¿Ú.D²¨Yª…®ü§úu· ¨®k‰÷_-JL—S<Ëåvªêm¬¹!þåu^»òÿ—Π˿ÉS#™º_-Çxï†n\ȯƒi5#ãi‰^tmÿ>"ôfÌ9sÜÅÞ™®ÛÙf³)GºýÇ‘HS0XežÌÑ~íý^Ú}¯á.Dbm×$ÒKþÀÜq0à‚ШCî*r8ïö[ìE@ÿù?Ù×̬à¼û~üê|f­y\«~gàä'3±°7 >å³èHòy¢±õQUϯÖEÞ`?h¿ÎèÏ‹,†LPS—è}?¿£åzù©¦¶x¿Âº2 ”#†ØM \…’ÙàRý¯ù‘¼®£Ð[¯~Í€‘¥SôÒÅ>/P…·&N×QzÁR»ô8¸]èõO ©èÉ÷¦õ=… kˆ2ó7FÖ‹TÉŒ œŠ{¬gÖWÎrÕ¦„8狾œJ³1‰è„·žðŠž5¬=~å|¡xÞ—À?B“_³‰ “²FŒ2`âþc H¨¸à!ż,~Tÿ*u°]ä2ßÛM¢´g–õ/ª¼;s²&( LV«8eRòøP²‰.*(sÌÅh, *åqA}@û¿ýCƒfå9‰ê$}×LpP¾àN2΃¨¶)î8ˆŸ¬rWXcû ºÞâw2þIóŽß|ðº( â¸Å;*£yA„‹œA‘aÔI=(g§;‚e¦ë#“›ù#B""¼¹÷V#yvý믔A-9gd›â£myÌÝŠcc‹†ôŠ×¾”UV6SÀàqS…”d.Yû“ıo³õO/oY…—û.o/m3>êµoÇR4Í2F¦n!d•T¯v³á3±êWÖ¶¤ñ˜KSÿ.k(xÀNzËçMF,Ùó¹èÕŒ]8´uB¯ô¸­åìuåéæ>±#³‡3|=²X…<~'?Ýì]þuš B¢ÝŠÓñ1"Þd7* Mé;2+pjŽ¥5}~¤Ò'J‡ ¿`•Üû8_!“¥Ó˜ë€Ò!çºÞ“çÌUÃÌ<µÝŽu¥·B¨Ímáöeš ÔK””­ ÇÃËŽÈÝæ±ïøÏ¯Öù(qN|æºî—p„4m+sÞ.&3È6Æ"Í„¾uýÎfkŸ:þ2—ly;Í!è¬òXжbÀ%@­*‡#:'Qgz‡:nx¨ãE¡o­wIíüG§S €åéà Ö+ÿ‚†à´› «¡"˜Ys…RH ]"æý,>Èâ‡Ù{“‡yfÌ'»ªCCÜø%ÙŠ¾âòùz9áDœ4#ZW(²ntIì´vŠ*òÈ`Ga¿pGt­’#âL·ålÈö°5ÚU »Yªy§ ­ƒìâ‰5æbîùl:ã8',8´ܳ}áwG5©ã¨\Xê…1wLâÍí(úóZˆSºf—’¦íü/׊ dì‡B@‘dž2Øš*xÙqLOK¦¢©×ZéVKfíG[¦!‹a‹P©QT/h‰‘’`Ùµ£ã”(¨šM*l‰b·JÙ¥¯(ƒ§Õ »1Æ„¶‘]\ˆY±7\±H–aÙÌü  Mì˜Å3ý:™òYïPKRèqÜ:,µ¿¡8 ŠkÁ¶úGT¸ÌßµŒv¯ÑNNÈò¥2é”.`³*ZœŒÏää‡VI¤ÈiÔ]Zhƒd#=ƶA33·®#I$ŠjÒiV0 ò·î:O¢2Óx{æ|jÚ:khNu·Ã& Så³B À±Á—À>~ÿŒö« »ÂÈ wÛ6û÷˜ÃPÅÑ:W†•ŒUŠâØÙ“ÜëZõ6 ¸‘y¹ÈRÇ;¿ƒºèÔÔ(ð/„w™)0E]g6Móœ\~R^ö1ÐCô—Qº0XÍ9—/xIʰŸå;X—Í–Øåý/U/ì/:Ä5bµÒ؃5§.–h²ÉÇï•?ŸMl·WM!(³: •}³ J@¯F‘¥5^Æ7×,}åR•}OJ&…7Çlð‚ ?´–Rݼ¯°ä¸î²¦úJvؘ’ÎÄrÙK $-åÍ#{™Úws}•?êíeÀ™æ0¸QÂÆñó±Æâ_ƒR±›ÒJj™ ‡,ã«¥F÷¤¬ì¸uJ̱âNc=Šš;ü^ÇkDúã8³LΫ½b>Æ8¾˜]ŽºÐC)aƒÃ¸Ø,˜Ö8D×€áò¸Ùo©»ŠßÜõ’'H9æŠÌ$2|Ÿ¸0ì¸Ì:¤³— p­=—žÔ*yp=‰Î.8mJlb$¸_;Ž÷q["0üY}Ø·Þ)ù…Åå.Ø—[Î VÓÀ–F‡ © hÝ¢¶ãÉÒA™Aœ4óxhh:[cêX =l_á*káÐ+h?&8n¼bML‚¯%û"÷ìù6 ŽbóͨEC e-pN‰l'ÙurÖ14£ŠØ•›šŽ5*àtyÛÁ >?×lس¦0›|°g¯L´×)û½<&jY]E"ßÙÆyˤFâ;.ëV€ ’U°œ,núÊILœÅ–wG)Â>âL¢ì ®ÌMÿº[Í"@;‡g”RY›zŒá'ËFšDâJάF‚çÚö8u³ô 1â<:Ö‘Ç#Yæ…x)êèM Ök7¡ß‡ÁÕfR:ù&òd¯ ·ó™–xãßýõ RÆØ ‘N·˜ðr]±YÃçéÕêæ üΰ‚c¡ˆÍ§vyßó’‰`žÿ÷òÞË»·QPÛÄŽ¾pætSª±’¨Hå;½©êÆpržêÖ¡c’¥òx@kû}’Íx<~•f6‹ì«³°¶51 ª@îåµÀÙÔýõâ§¹µ.¶Gôë*ŒôÑ7µíöæŒd9\ì‚a¨ê¨ÖÕØžk7«Ê…V©Ÿ'ÁËô‘_ãú šØ zU/ö0ÏÁ.xtø”I(/Žkõ²È2Ö9ä3Ó{Z·¶]œ)SÜlÌ”ƒ(v»‘\ñ°B™ëÖèÿ´± ÐùæNõ´o ù?Mšb ÷Ä?¢*+…>ªñÓªbZøŽîxÃS¸He'>›é ìdlk/‰m·ðÃd™Lê—¼\#œ^ÚZX@ÃɯÛ[I:{l&—;YxlœÄÜèól6تwiÍ^çÅp–ÿ\QÏžåTx>5yåý$/ßæÿ}žwy 7m¼ò–sâ­§,Ô€Êl"tQIs[!ñO³"?Ô5}˜©Ä$dçPÌî6 O3}ã©Ñr–do¯ª §`ÿuü¾îïà˜„ŽPúY`¹¼AMnÑ0Û{HvDqÉ Xc€ßµyëàÎÅö˜úoCR“ªpoáºY(ïä[œY=áuáËGÚãŒXœËPæ°ç ×¤Ž$V¾ ¡c·›-F9󦻄½h‡’)‘ V®§Šäº´t'Õ¹Ù8æzŸ.|Š2¤ Þyu¢îîÅìšÒ3õ%Ûá.hÅ®M‘¶î¶µ»bÞƒ·—´Xk´û ÀÐ|îñŽÑÞoÞüá)9AFm·ª]ûk𢷸²ý8 ØŸêw³ÅF¯¿¬]óï•|/Ÿ ‘Á}Y4äßÖqº|-8CíYwï›Ë§ÞØW,:× ˆDÓñN4,d ˆõô"ÔÞú§ÍÌŠ`öïeŒ1Cüýn[ðʳ¨W€Nû$g¾ñ?iN+)zÃoQļ¡I0:5aÀRÝ%È&Æ+Ò×) ý) ]'G¥ä/DuUŸ„ˆUòƒé&m-Z’ÖT¿Ýé¹–Ó—ôè,îKXj›ZI]{H”äLØq"–ŒëG¯Õ ôóÑ.Ë“IŸ=¥…E±— Xkž¬D¦m†},ß^ Œ¢a’<6Õ¨H9+„Pô?á;} œÎGÇ=Š 3¢ “DæŽÀy¢®H¬²dÐÃf çã‚c«‹ôÑQCþ½`!‰UÖ2R.©Á ´CÂsþ@Ewª©ëSӪ׀ª‡³l9 œK6Nr?Ù<÷l?sx˜XM»æ{ñŸòú¡—3-m,õ8Ë£I~§ÎRú ™;YÝ}ÇѼ(ýCÌðÉÎq³ý ŽŒÈšvGËöo4ó.»Rk27ëÇ™óó‚=¨[wY#׆ªÈ1ònõF/Øû~Âí?þKtº“CÇ(B˜22 ª;Ï›5îRúÉÄÔL×úB÷6UbH’-âç?Ì~JwwÉK•8òÚ» Ú‘»5A;_Eö ¿kÈ39Bh’qvM(µ¦íg‹†bâ¹ÏÓxy niæm™4D¯:yé(504á2É5D<·iVÓq¬o|dD¿ÂôIzК™tbŽ#Iæ4 ²Ø)K ?ÈbQR¬bCX©!ô;ã«°âz@å½“Ýø+‰8‡Û‘-ZQ^\à$<÷ÝÊ£ŠpÀ©p <™ïÿbÁRŸï×°7¿‚²w\ý ÊßÔü†‰–`ŸTM8924Én„Jæ0N‹\ß™,%£¦ðퟓ4g˜œ'¡5\ï¸Ñ7†1ÖQŒƒ\N ;ª™¹"³e¯~‘á#E/?µ¬c“¦þ›gL^šE§¬àìÖvhVë ̸) n02n@„Çò¼d€å74|+ƒHÚãK[DxÇÌgþåÜŒøËý#0ô \Ç›oƒ©åývKªk˜ +‚•Ñ}(B]RÜÏ5§x";lˆä¦1Šö G*_(Û‘QŸÏ„À ßn:—lö)ª¥Œ{Ì´ŠS‘¢¥ † '=N\1Ö¢"¥•(€ºåË ³áÃZ:R’ý]`%€]€ÊÎhȨ#²OX*'‚AŸDPï´l†È²ÖYŒµe¿s…}¥[G&7U®–>]ZCYž²8ùÚtGâBݘØ@Å_M††:ð ˆðÃxä}´´5ãõoŸ‘ÿ(ü¡þWyÞ¶ N‘f³òMŽ-LTÔ÷‡-‚Š.ÔÕ|²Áù‡1ëìL/¤ŽåçÆßBPëãm^sÝ[Aïm{Í£óÆ#*OT&퀊,n,®­û×&-g¼¼ÈØ3×;”+q…Å0goÂöÉ•;,ëÌ.yž½‘ ~®À >9É/'ÅšÏ+Ú|.‰ÜwfúÄ] Øz1_™­~¨Wùžh<­Oþc¨EœÅàl°ê·|^þ5÷¡Èœ»It¼×Uµ¸„þvm’éB:Ý_RÛg)Až‡•ãP¢!Ÿ5õßaTSÿ¼ز§å ÄRËóë[1MNLïÈ «=ól` ý¥žn‘?6FäM‚õ!ÕS™)ìJu´>osÇc3¥V ,VƒÑXL{âÏ:É:[i+±µTaØìJü÷ït®?Ô¸³ÜsÂñ†Ój¯*r”»…-Ÿš?¼•ÂùÑ¡åŸaQØÍî<ȼÐb/˜ E¿Cj#;¨•$}cáóÆmcñ&¹_'ö»=¯R<Ós[X¼9NsÁ½jÚÅ«|ßψ©XÆcÁØ?3U:êKs£ñçØj†%fÄiFùv(¨EÊCdJy¾ëqVÏ÷ð?BTP2oe¯’¾ w»ÈJW±ü–¡4VÙhs—weÎÅ4Y®P=«ý÷"ÿŒP‘ÈœÀ¼Æ_ßmnoÌlr—3I?76Œ²gÝD¤÷¹}=³]ÀL£P´y §ªÜ"Ü ¨m)ȽäЊRôN‡>TŠ}è§¥ AôE‡ºG5Pg6£Vê´Mù;O#"8w¸»ßß¾»»3·2s¤­wfîöfeïfÞ»d»ËI‘å.£2@%‘¢QA aã#>!ª‚ŠçÆ2>£¼à/Ê›òó©SDÔøÕêªH>@ÅB#)Õ£Pyìx^h™Wý—p\.rËGbÆ”#N)<•£qÆpJe.A#Eå¹ùó |r€^z*“úEbN"©13&Ú< NvM2Êùj%Ãe1ArYdCŹ4'MžÙŠ•¯þyמ‘Onö=²¢¹êÏdËÒCò vÞ'?ŃXpy~†Ü‹¸ì&CŒƒ}R‰0õ‡ÉÒŽÜS÷g†Q*“Š¿YgÌt6SËЙq6xäyP Ï j©žDÄ e8¤¦ w™yt‹T_ÿÍ+ÆÈÅQS4¿´¦™ä{>#f(FEõV™ HUt1Õôkõy:^ *c"b"Á$<¶-Ù’œ¥${lÎ_ŽË•Œ—Nˆ4føÑèÕˆýOù÷ Oš,R¨Ä•„2õ•J[±Ï‚Q/¨ò²™¼YÒŒŒ‹äÉjdD© !´ðµH†·¥½ìîå¿9o}µô‘Å)¥Æƒ>2%?ÊÙ䌭Çͤx+‡Y¤>ëúZCV2ˆÓÞáàæ#‰mÊíŸt†<O̘åRWÅNJª mÇ”­S±ÐtÊwáîœL˜š¸”Uÿbm¼ÚEgZqf½±`ϧôï WüF†‚»¹kõAƒ*è“&Òà’FƒH©hGÂ&‡•#RÈ „>:²EdÊ”ê´UãJ¤Ä¨…¸ÍKD '”—VQgBt{ÈzDEÔáÐIí_›[f=:“¡¯'íÒ:…ò%{5©cú’ô(g f²6övÓ[ÕHRÉ,¯Ý” .Ð\IÍAZ~çB²6l‡H MsKY.‚8$¯Käý?‰jŠÎûðÉ$ÇN¥Ñ“JE'ãë©äJ ŒÆŒÖý4µ)f£ å3÷cûóL45"ù¥è‹€s†£ÖbÍ@×±M¯ ZxXØ#ÞO©NS’0Ápx™þj‡¡Š{ó¤»\o1ñÏx«ˆû&FNtŒµù9òšx+Ìp;f“‡ÈÊâå9²a|r¶räš#yRõŠnwª¿ç9zŸ´>TþzÈŒ›!h¤ÐÙ¬ÑÜ=>5Õ¾$Û˧1#€vò{@L*¯t™óºž5Šä¨(e±àp\9ýzM9Âôܾ˜Ãàôbΰ1MæþÄw¢ß}§F¾ND³N~í7÷ZÌ*¥~Ñ~=úŒ4Q¾Ñ‘õ«"–„èëÜ×qûq¡ša$±Âú:r}XÂ+ˆ'KmªÊ{Ma¡Žº:¦FB«ôø5ú8ù¸Î˜#žcªð8’ bž¢‡°è·l´Õá>ˆƒqøÖpé à®R¸MގŇTדuýi_k®`ˆ#êt{Ý/r q‡îÂÄ©VxQéfW¥NXIã—é>M N ÈrbÕF9¯·µ#®†'Ì`Fˆü@1 À:y­Ü£&k¶¤yß>•ËiŠÐkÖÆöãcÐ:eDº‡áiË9!W%Ò‘3ÂCë'hclƒÓ»9$š:ÞÒfö¤8_ƒ·CwGK¬¨+”UDŸ°Ñš6'”šé‚+8!Á•\‡\¾|À'X‹Q4‡Z‡È}KSfu)¦+í°ž!•ñ|sóàÌg:Ø{Jú®¹}B-qæ6±} Š¸F_Ø¢˜p³ÅAýœ¹CHè’*Œ%VÉ¿ÝyroÒÂûÿ¾ÔUÓž¯ùWûu#¾A^¾<4/n­ƒ÷fÉ,éæ½„NÍÔøÛè(©äRñ½üYâ”T)ƒ'å•) ¾cV Ô=Òd›»x´þ.È.­1"…ȳfc8aaVLÂoJ¿iºx.õ&b‹½1 Ü¢yáÛ¸ˆy÷¿qä$‡ƒ¼MÔŽBq3 ?ÃÁ¡FŠÃŒ§‘Y©çFxïw¢ÎË6ÞH¼\J|¼»Öé¬Õ¨7tGs¶ûžºÿÆP‘¹%êœ$(egiÏ®M¥YHÊ6 ä «Vó„ ;ŸL›\²å15Ûv_{wÿ'|Á~s²ñ½±)·ï[ô`_¯dôÉT/…» ¾±¥ö9*:Ÿ¦ÛRä£Å¦"Ÿ«2·p“ܹ5“€º-5”¤U}¹pÒMx•sã’¸VìlÓ[¡5pÊÙÂùЖÚdqµ]ñ„!¦ %'˜ŠË‡«¾a”.Šø½Ošê™×.zÏVí1tv»B‰w#ÃÕn‚ûvà‹^ú`w7šÔ ]†»[›²+:#Šû^IØ5¯\¤’81¡œ4 ùƒ¢=ã[œ¶í#e „|#©Ë¦g´K )(k™nÖß ÷«ZK¹;©dWoçÇ#†Î>€'}êUÕ×rÝòS@Uµ_‡Do‚ÔÚÃW;èj=ô³'ìú(ŽŸ¬Ÿ&$°±W^ºÍ;‹(bAŸsX¨,øi£ê¢M¤€:Ë.ýQ©…®ìaÉñ  F¿Qž…ù¡æû˜Ê‘±ßý»öm]ž:=/æMâHŽÒR½ç('¨N×vKû[½î}mÙ™µ{‚;÷Î#ÐÓxd eý™g§Ôé*îÚíà4§A•¹ÙÂ¥>7ü[š¿ê²èãùðëÉ\¹wèVõ¤½áí! pµTÝ%z¦\‚µK ,[¬m«EG¾]«k3“¤™Â³ºL6ÖT5¨‘µÔŒ³ú ¸ܻ¦zLWëDL…è„Öµ] œ§&1“±L¶°ûæ>ÌÏòÃt+æº||ðY©Ô‰U¤W»ªñ·\´k¯/d•¸cW1_— óíy8JUµ³m†ê(OÁÑÒß÷«‘¡Mw“¥!r$ºnA§ÿQfq¾:Åä!L•7“•Vî ma›kHÚÂæí>‰‘ð8 ÿ€Áò'‚Ì€q…Á$†ÐžÊàhýg H`ó9à›íú&êNf]#W¥V Ÿâáyøt02œÀÓ"G€O¡Ë`„1ÄOéût`¡°èÑ|,pÏTÔ«Õè>Tϯ½Â>{®"Üt$Yéº|³¯¨4_µ¯v“ôÝ£ciåþña‘)ûæ¶}ÞVÇ} ÝæÇˆ6ý*ö„©Í›ô WD ¨Ð¢MM¶ßo\ÆRF¶BNpiøÛyŒjÕ8„ý`‘Fã᎜íŠQ >¬7"—€;áüß|L×Ýñ¡€i9T;ë†gÛåXš¯Ò¿d+T±Ftÿ{ôÔ¹» Þ^Ëaà£Æ²êÝùËu „ùÿý³Al"›'鸿¦-x±P~v² ªG.>z¥"ìGçF¹í=À=w»è°â[ì]‹“^¤h¿·ˆ}˜ùVoeVºHê uOÈ—±¶°vû·¥/›q$:hm’PPœõ¢e8€°´N*+§“J³ì M‡´ÊÕð?oAØ$9Ú‡ÆVAÕÙ¯¡í,Oñ®a¦]BÀ Ft¿„{Î×éåSL€ýû+°Û)lŒ’3V`À›ûÛ¯ÄôŒXñ«üJDÚÑôÓ.±Ôè¿Ë«<Nû%dNP]´†ù ¤GÏgÐÒ²÷›x‹í³» 7ñÔÅàÕÕcŠŸlubÓÂSh iç6Nrœ×Ã<1}›Û ªÏ.kòöÛ܅σ”—.šK×zb©1I@Gœ¼êø­F=•ö·Í.ª|’{Þ/G6]½ˆœná Åôl+—qú3@ÇMõ¼ ùŽA!¡v%>sÌî¡>É Ÿo‚Õò´~I^|-þدšW8-wжÓ.X&ê“áiÓY“7Їa·nÚªuËæ|Í{ä_>Zê‚Â~<¡ÛÔ+iÎò¹D¼Zü€Ls</²0|1}œ Ø:'PfkÄ»¥SÙ>•¦Â·ÔšxxâÃßM@M“vЀHË?¹ ]¤À›‘¶+ŠÄÑœÝÐÚ,B]­îÒAÁÑÊ\‡-)oØ^©zìÑm?8ïß_ö¶]ÔrãAU:gtù“•9NšW.šá‹µÜýœ£E†…8À°ÑKwí½V¡`‘tAÏwM[—U*/g"ÖrlnvÒc¯êw¸P&ͳ!D3ÿ;Þ£ß"‡ÜŸ *ùKo×S8¡ÍÊ'ºgfM^÷Æò8áxC‘-÷vfÚp¨«º¨F?„VݸhˆÖ®BÚùž6wO¶67ê’8r¶_3¹ëÞ Fm¨ÔT݈P^o¼çeâªË°è†$A•Y·5oò3²©ÏÐYÝD—_æº]trZ]î)öÊZõjNZÙØ+«@}tËMZËâ‘;¶G¹èNòŸ¶ÅWR3Áö¦;•–_ûÁÆ•8à°ÂG ,ª)ÀƒNÔ)™÷õmáˆSo–7Ÿ¹®˜ËÒ¿D…u¿’ܹãß d:'²’=7·¯Žè sßû’7–td_ó Æ`ÉvóDM¾žÈÎ)¼oñœWÂ¥LH3/Oª~Ô8?¼Y§R“=ÅàÊ 9Éž|Çö'*UªÀl°W›}—òoPM|Ç$IŸ8xpÂ[¼âË’r‚u’ú¹¤“BÔ©ÁÝ3ˆÝµºY:kWùPwÆ@&¾rGå’Îeœk[þ}°“\j'ÒHÆ­¹®çûÙLü2Ù‹ ¶ú¦Ô%Ê-ZËú-äX7#FÎTi1Ç´ä)mvè!–û8‘ùˆøÜ¾Ÿp]u8þÄ­‰_Šë5~´<}á¢yþ§,á m°«jÍH¶W±Ù:÷lÞàÆ÷·¸SŠ«X&…ìòdò!Za÷¨ÂSSÖµgZT®õíu_%/×Iè#{ïfæ“VfuËϳÛÐ.„¿í‡|4¾àã)œ \Ù„ÓïËDŠšýâ4¨Ü@Óì“úŒn£æHÎðKïÜq ¾zú·bÏIœð\ø;”ú`Ç¡–ýªˆ…ÔMÁÿD$:'(š|È•qªò\~øvßãMöź žµ#Ø›œXþÒ5¾käë›ç–Df "Í%{¨t¢˜Î8P ?=Op~z$>½p/Õûé&悳ªz>ë‘Û@4Ï÷ðsÜnKaÊÌݸŠâˆt´¦~üëæ8áÿ÷zoø= "EÚ×ÌCˆ¨wÂÒ<'Wû/Z8&.y/ÛpÇvøÏ±òLÏi¬LÆëÖ°6ÚâR´9þ=u^o8Øs¤ÍEõ]ï7ö9w{–Uˆû°ëÞZõV×QTA$fü[8!6…j©qžE­DV•jw,Zé¼®¥{oiÍ•#*Ôp­Í‰°;õÈWÎpî-¹Ýìì¯<“QØ€j!K*¦Œ=&㸨B«øÚpŒès8A½UÜøl ;C5+«lõ™½'kpQK}_/#`ƒq 7b¬Îåxõè»C€k¯q“þ¤#÷ŽáõÐÇø7(o8ÎÁg.Ä“8å·_pP6ÈgDºóŸs÷k ¯ƒ| L&‰úP øÍ¦U5®±ì‹`®wr5 Õ‚3"­ q[ìùåøöW¶¦ ´ûÁ÷¹ïºùÿ+°—ûf„ûWúæ„ÆŠ_8\Žh#ÒÙ€¥ƒ ½Dñ/› ½›ø^$80ÿÎNÃhpÂÕ\âp0,~ê^ŸTÇÚîß¡Yò£ÝÃаý¢ì¸JqÍ€x˜»¼5Òó6jôh1ö1à…?/-.A{hxüñ±£*àìì•4bêŸxEÕã?rña Âx\U+Ž¿üÜç{rZg8ü T2ÈS®ˆ·Ã|Ãe®™ü-4\™9^>sr{é |®Ôj­à«¤%JÆ´ ,¯HG˜4Npi!ÀN ¼Ê¦Ï+:̱CŸ±UÙ×/KÌZŸB¬¿Ýâ}Ò@aÌNÝ4ë®0G{ÚâÞÓ*ÃÃç8ÞcÝ-£êxçCÝU1¹OÝ&]\Á&Ffqöº}1>'rÀÝ dëœ`Äø|²y`ŽÁO[ËéŠSDaÒªl–I£ mâ\o]6÷M\͉«—hW<Ç"Ë!ª>fá0èÚWCŸd#V›/^‹¯„ll‰ÓEÖæVt¤À”x8ê8H{^¦gûÒþ›˜x©ùgg–ù óO¡)8B`é¡f±§tÌï:Ùý}¹†ã_·/„Äcº°¾xA~€Ñèç¨VGû^aµÀr`x^鬅åð¬úBAMz'sÜ\?zeADÄ6‘Ÿ!‚zÕžŒ;…UʼnâÂVÎeàÜ̯dí•­à‘-ÂyÍ;°Ê+ÙöµÔ¿°oSVDE¡æZ¦ 8£è•öå<º€úêKÓˤñj$0K«d‘zÆkO%»ÎK×dÂÔXÂEs%¥dÀãJpìÁx(qñÜ ‡°h”ˆ³àÆÐt…/¶4¯í£s|&¯Œ# OUŒyä`Kf^çuÂí“ØZ¥/É»AVµ.x]np4oÁ»—.Rk×d5Êy¦HP¥®Å²Íw(Þ£Â\Ùsj¼O÷‹SùÿÒûà°WG\d×ëAîQÝGê¼P‚ÁÀ€†ÔhÅuÿs)AwúdÆE…C?ëòñ‹Ä5Á.f‚ÃÖ4÷.g2e×a\®'Œò®ÌÐ (¼O=¯¸A¶†R´“dÜ”kÒj÷ö­Ûz¹’ úcîÅÎ=Ô3¬`D”îµÍ Fkk@ Q…,› °+1å¨P írxx?aøv'e2¯seø£'CüãÎ[ é§8Ö4Áƒc©ãÿ'èüæ£yM™Vúfé4c€ »¢Þ½ëÆø¼E%2;ÌÇ»ø^ÆdëĶ:hfz¿2·¿ï>$Ÿ¼r“d?É1R³— ){ µn¼MÜNÝô¾‚§MU¬ íhs2Ì+„þB&‹1©LÀØâ#pžÏ×Ú'ðÛòA÷.ÓæÿkN²¼“µ”¯n›túÄChÉ'iË'?g÷crxòªK2 ß|¢uŽ5Y3P†Ã¯\òÈl¹ø+(FþM†® ûýL;ê*ôQèhŠÞ¼ /ITõƒ½†ôÌœf¢äás z2Ê2ÀÅ@· —ô˜ÐŽ#œç~& 1È«t¶: †çÿÎ,RÌŸÝ&î2 lJËo«%/õ:»ë+ æÚ$ƒf²ÄÃ*zò¼¡Z±V4EÇv¤þáï­cÏ éùgOb¨ÿÉ R’A²|Õ­Øc¾£€PÀÀÂaN³Æ.‰Ø*‹X·`%½à)/#ߛ;,e‰ï·[Œ©þãËäÖ)lë|Œ€"œØðAGR­_Úê‹ÿëàûj6³'%»`¸ûæ;¤;²‚«pÝo/†åZ/ä¡ö<é]SØÃÖ¬Qî¾a MËôBÁÙ_iL Úô-çc•C˜QµŸ•ätd;Ïu7-}D§Š‹õ‰õ 9'¤š¢õe{†œq-U› S×û ñ»ó?Û‡W~;Z´=»/[&&­¬-½4k¬£$ºÏtá+X=ÝPßgòòšäÛ/?‹.ø¼(ø}B(/N`m´ûõq<3ÐOõµÁïG&¾ã¢Šü q’i‘ ²`åµ2=ZÁÃ)Y (©C÷ªïô-BñÆü3^q<¿À\ÀäŒSä0@òÎF€`Áï@ëà è?{ ‡*ëªÅ ¸Íåï§Ó÷ù‹(ÀïÑNLt ³˜Ï1üé€sâÓeG' |@=ß”&¡®åúáÄ hÕC‚KÀÌ÷ÙÓµ™KsF¾œwFk…“äyç™ÄuÚŽŽz—Y•T˜íB.ïòQzìóÜ›;F ÎCv 2D&4cì\·ÄûòK;{«a³Fué^†.˜ Ž”ë"^%<²?¤ÃÛéübw8A @ÿ÷b}7©»úümÃrÀ~íU£?ÎÿýÅ›ÿ¡Ž™÷=†-¬.œB„?¿ÄèÚßkN?©’¬éálÙÆ‚@u¬kºwPû–²ɈýFò]ßú=sÊó@èçˆCÃú-õwòø-ÁõlŽó“óDm‰Š»»;,6F]ÊMm­§Šþõ é;˜‚8m%ïÿ £1ü@¬k†#âÁÂ#ï§!Îg‹T½8¼ÒaÁ®¼øº|c7¡î÷6-œÆ¥w¿<'ýz–ÝÕÚg?‹ö´šÇÁŸÍ%X”ú¤dÌÁƒýJ+HäI¯H®rbÕÿl°œ”i²©/Ð~»I“¸Š¿ ®SŸ[dì馶>eXãÈIînôÆnûIÐòƒŠÏ†Ø 0ðd Q‘f‚z26F¹}&ÿ+À%á²ñ¨Èç§ÅŽ?7#ýÈ47ƒ«ÝkN²ŸØbFrFíÂsøÐ°©“Øßõž–›l XÍ*-D§äv/A„… ÙCˬ3(H£E¤n\¼«pZ)°Œè ®üCå8SSd8*uízÈÞHH4æ¼øÀÇ+’è/]?Õ=ƒ6ᥥÃæpÍú2ù&•¸g5áX @áÍÜ’KQ׿d‹ó½!ÌY©rÑÕ©wŽ%JŸëozÆL#±zR¨Ë£ÌØ;j·W‰MnZ#½‹í‹0e_S³0žEaiŸ0EÅÄÄ7Œ¿Íƒ´œ-ß·Ðx¦YM¦™¤³v®“h® `®™Bû¿õ„@Kesç½.h ·‰Ê|B"#ˆ­o‹`ö{KZifö+n‰eØçÓGVõPìaNäŠÇ“y}Ñ«<æ ˆ‹†J†ª( ![‚U»¹q6ü¼çq[ªbø²9 ë“^ò)ñ8`Sž@ãyYQþ±¡<³_Ã'a€+ =¦„ü•L™0aLkÜËóÐ$|~T\˜gÏš`fÿÿ!-s–mÅþ\P­ú÷–„“5͡ݢûµ@ÜŠø¸Ö€-øk¬0ÿÍm¼¿q«öÇÌ@Øo_Ïï>×ÛøQ/ >oRxnù·p¸Ø>àÇÈBðý.âÄDKáGðüϪ…ÿvÅRÞ¡7ËÊÂj:j>æÎM+º™tÁéÏÑ’úy@ò=r˜dXiß‚êå­>¢Ÿ¢º^Iô§«3‚N1o=yDŒíÒSÒyfRÚÃΉؠt”öìnz„oD“a¬Œo5|7¬&·¯÷+Ö€îþ5¢È?O‚]ƒ ÕW.Âݳ—箿µ=±'ØÊ‡B–SÂ%R íz¢òÿ^Þã ¶nÿå «Ÿ_²Ê<8Š íÛ Ø{U‚‹pa" Wpƒíhïí¿k÷qÑ÷~.øöÊqÑû¡Gð.x–.yGeû!»kË‹ý¬‰©¿K«lAª"tâ+S¶EÃõî¢{~=À©BëÝ©ŸévYíõn‚fŠǃ}•¼÷Ï'è7%G›¤­@mOvÝnz [ú1Ix-ÿ`L?¦U]Þ9zÖª^¨U‘aÁk°æ²^ª ¹3ÌòéXõë;gŠwƒŒÊ‹;嘱 veWä­aLmVûŒ‹ª äSg6¾Û>öo/î"€Ó¿Ø aH#Òˆ¥cJ96²Eßr<ò“ªlr8 PFŽš~þ›•"HðñOÑ¥ƒAjpè¿q'¸ú¬AtÇÐGT÷ÿ|Wõöøûñû$þ†çàß :¯ø® ÑÎz+ø>ˆjìªHݱÐ*»¤P·F׫>… DÜa Gôõj’äþêeØñg%[•pO«›MúúÝà†‚]»ê+ å¦=ÉnÆÁ}vÔw<0(ŸàÔäü´ˆÑN.g3ö&&¨'›7H/ÖÏ,n­ÝôB:, E_Ò‚Šk‘žcÅ66n¨¸z¦ßb|…¯}y¥6³‹ª”¹ ÌôÑx£^>!SIâÝg.ÕÄ ^õñR)Ã1²Ã½ܬÈÄY?ö³žáëµX›O¶üÿëHÜ`ÀÀ €ûºEV¿ NY7Ëž• P° à)ó«-‹î?XÈËÙ©X?Sgw¹C×ñÆ—D‡dµs– ÓI‹›Ç(ļQàòmZ!v*nˆ;iÅ–§ @Së¬ÛP_Õxߣ“‹íÏ=œuO£¥õµ¥Y& ñ `ç&˜(oÈ‹¼û ø ð}½pØ=›Ná•Ôú‡¯eï,ü6 ÙaK[hÁ!6r{ɺîQ©­A-]© á½ØÕ¶EìaªÅ§åã=/ssN,Ì0>´µùâ[ ðŸ£Õ×Çè(âfýP ¼ÅÓ#Qœ [î•Ãêw®>|Lz˜#$  K»K‡›ÂTG (l1µðΑ¢1eè‚¶ìAìù·/AAŸ™Ö6Ïrö±·ÇÛž&q†·úJA¥q†U9æ@Xî%*Ø’†õç_ò3«N\sû¼@°ØIQüNz5˜€· S!Pþím–O°Ms#ðî…J 1Ær‡i4î¿Ñ3tÀäu©+Ad¼– c’±·#KSMxA‘q´`8#±vg,£k|kþv`®Ó±l‹¡²“nCµLf¶9jC³.X¾T͹LŒßÊᬩ<4rÂÚÓ›qùg îû5ÔÈÆ¾ÞÎѰ.6QIÌ=UÎ\VŸC渦Õ+ñز gp?ÄVRÊ{²‰„¾z”^/ñ†ÃG¶ëÜØ›'ŽA¢~[ô”GÞJëùx¸¯ ò35«aò$실4lrCçÀ‡$H2¯!r-¸ÑìÏŽaиõqHE×€Åê1&^†4&úš°@aÂåNEÓ,ÌÄ‘|DFïŠÊ¨Ã³Û„à#;‘ ‡ :å{)â÷³µ4ËÖŽþk€Ê%)\÷ÎxÏÛ- \´”øUÓ!§åÜÉÆ»Î/BÌ; w׿:qÇï7]ƒ‹*`ÆÒ: :öʇ'þ4©Î :§Ós÷ï}‘„걃DƒÈfðƒ~± Qž/ÐcV§ŸÆNŽbŽdÊK{YZÝÉc/ì¤q:s„‹=·àÝáÒjÃÁÓ±ÉÚª†Û´Ý²—ØÙäf‘éhÑ¡2µÓ áðGÑÓõäQGÄXF¬JöHe•ÞnÄk3âsVÇ1ìÖÀÒüòèO m• „©¤…ÅLÝã1<´R7VH,òCͺ!ª0úà×KX»+ÞÆ×KÃçsÐ$¦ "ï·Mm` ÉÈU¹8$frã7‡…ª_ïûí riŽÐ‚Á6ŽÂäÑ[±ÿ?®wì¼tƒª£i â÷ÑŽ,®H½ã‰du¹ØcÍaõ^ÖEâäÇü¬SD'Ì* dâàôœÂ(’fØw7  콺‚uâÞ°FfJ%‚Ô£¥ïðÙlxM Ör< 66By /±V„@zñ×Z!x[½#Þò.ã¤;h£¢çÓÃ]¿~d¢AvRN92ã†V¤¦07ƒúÇE”åÐ0= Ca³€–(€¿éìj©ÿÏrN&y“7ŠüQòØÈ7u­‡²a”69÷æ\ÛÜDfu%ïh(ØŠµmì1¤_™¬Út€QØk}ì %Ú ·4§‹h®>?b=D¤ÖK×^èQ\*³z\Ø3œº ͆ssÙAµ¥û —îûá„ßÔz‡“x¶ò&' hüct±Ù7FM€ ;¦ãîU²·K2yRp»@ÛQIÛBG)ö©œøÆW´¥¼p2ï0‰­ÉJ¹ü?…®F[Oˆ¨A8ޤ}™)ý¢gF2ÏëÙbÿÙ4eüBÆJ8éMá¿‚‰›N97u;? Óׇ½(:GiFvÕ{—¨Z¥èFOt‚ àÑè)OE@ôÑÛzP·i”NŒÒ.„m2‡»3Á!š0"+}¿w÷Ûݽݙ›.¹·Mæ6¹ÜÛÙ—k#3ÜVlÉQ–¤¬$Šm„Æ–È$€ „  ! á’-€Á”_F 'DP ‚…øxB†?´r.b¦Vÿ…%%šŒcÆðò£|x`ùï/±(µjå †‰\•G¥¡Ø§äžOPÄ(-K¸N~Tj«™¥4•ÚhBu„ž‡^UÂ_$ñ„j)¢"üj¥Í“(аâÉôœLŠe—!ifÖ.)iÕ¤ôµ0J"ø­ 0C·˜ØCåQ¨áŒz+Ç÷c5ãñªÈ+2ä4l,4vÓÙÒ•rÐŒ" u—sQ‹5Cך«Nzƒ™]ØT}Œ[ƒÚ§ée¹Y´¾ÊºCx¹¢0Ã~p¼Ü¢P x‹© é7(Í@Ý F‰‹Žs"ù•œCä¡°Ó6w„%« 6Žÿñ²1Ö©}6L1a,N¸$Âd’æ9 %1>}¸D5aœl¶±¼ÉÆ;±uËs½ì®#ݪêH øyhNÚÛ²Dw9¬KúÆØGÊUibÔµ¼Þ57 ß‚r.³ÆOVšÛ4“(œ[9HŒ"‹ÊÃB8ˆ"2žç™´Æ^NE’%Û§a[VFb/¶• ãÕòè“ Q´?ª' >kñ{$/„á¤<ú?éÛÊ+¯±J:‡ØÖ zçØš‘ aŒÉËŠZ5¡Á¾œˆÅfb²á%Ç«M°ü‰Íé¢l<õà —w¥Ó`ÐsÄa9êH«wIÀx¶ÆöŸ4O– B<›åÁlf& µ–î²ÏŲœ´Ñ$:ÀÖl^;[ÇÓ–-©å+/HcB~™-0‡k7'¯¸ã¹ÇuÔ¦œc”G¼ ËóI+s\Õ.èÕ–±¯ôN—'Š£5*â¡ìåÆÿBé·ÓÖÖþcâžyVz­Ê; ˆ;ÛÅ>;Ñww²ÄÀ¶V•æ#XÒ˜¶ž4ìŽ{b‡§NxÿïÊR]§zek½Bj·´Võqõœ:hœZáðk-­<löPü,LYgQ3RðÔ}î¦+ËAϲ“å#÷2¢L‰ÆˆQsn•çù"ÒR-ýáÂìsn'qi,ƒu"®ÌëÙÍKÔ6íïnÊŸ/iÅV.àCƒg»¼(P«ž?¯üóI*!xÐcvÌ&Q™ WÞþÒ#³vµùž²ê<”b£thigHA‚4ÜB@ýFl¦âðM@Uöå[îP,’Špµ©ÏÑœK%{†ªÞß.PŸ:ßø_œ‰è-“۸ΠϥGLr§2qÁu©%š¹4sÊzlÆéG:9zÔðe* œ[Ä;öñ8¬0æ¿û/ŸÕï¸(ofhã‘qÏÙ6»õ¶¼·õRéÇ>€MDø¬!XܧŒúÔB„oÊà‰Ž¾µv‡3Å3 ­/}0œ1Ó™M¢ŠäÁq’.«.÷½w^ÌB·)<ÃÿñÄ´Ómq€Ýœš›5{4Zz€V½ý?ÉÏ5á<Cž£ûÏ¢ŒNµjô’(`ÔcÍa; ùy݃(qRMTÄ©Áû¾_æÿ ù’øÖìÞÝYÊùº05]£”¤2[_5Ìar•®a+¼xÝ$4m¶¢JÎneN¹è¬I‡µt.r›õ¸0:4£çJµSé}F´1-·CæªæÿÃ×B·iX>ÛµKÌM]\Ò´AœÐ34ßâéãꆇ JºÂ+xÈçØ¤&¡qíÏZO̪XãªINBRˆi2J>ä}1¦¶)›Öõ«¬~›Ž_N³VB€&¥u?S.È"=gáALüoŒôÛ|ì—ëîüÿGn%òöÁQ¨ú—<âäG«n?ÉšÉÆèF¡§»’¼™}ïψ!?ðSC,—OÅo©>üXœ3Ròò0Ó7­QvÈÛºa°.“ˆMçÔ`:>62³mñk¤£Å›SNùbÓKšåïÛ%7°.åVÐm•ÏgÕÓCÓ‹`²;<¸‰”˜F1yíë4và{(ÖéhÉŒ,âˆ[)uà3×°aÕzý!—‰º2ô{éy´ BCåµëÕ5(±NÃ[©¼ß¼AzÃþ¶2±QÓñ¶våê?ÚËé7{*<ÞÇ]m„€Š•KÄcÇ1rSí–‹ÿåÆD|ÊXžäé½ ígéÆÃÆÇòd…u¤W‡s—8â Çk7ifs¸ùÒܧØ´$Kè©ð±ÅþØî»¯¤qðë%V\½þ²Åü½˜–ðDâ¶ÑŸŽOÊn ÏEÏ»ö!]É$ܯ“)™Ù¸Ï íEúª¥€ QàþHí íjM^}x×dðʦú—‚2¡ö"šŒfÌN3*{údìu7¶º¼M]G ×*ªï?ïbÔw„€vYbs¼¹SÚdNûò~Ûóp)M³3=m̼°¸¶JÄ3ŽrÔ>:'?keEÇΞΉ76ðÚõ憽‘Ñ#>Ñ–Ó$‰Ï"4ãñæì'tl!ä‡#ä±dÉíp:õçâGšqÙ}þhl¥—èwz°µä9FŽKKÔ¸çÈ\òõRÂÈ]…ÇOTÏrÕú>šéŽn¥Ù·ÔRG†‘ÉÉŒ@=F?¬ívÙŠßk]ßÙmÚ#SK»^=Üå`, œê`¬¯ T¡yð Š›‰âàÄgPfDë&‘Ýîš™è£2ì§³Œ°†©dWKÿüCÆôäËHhp¿ÌG\ú¡\Õ=Ágvœ±µmÉ\( ·¬˜îW«¯¬É[O® 'ÄøZ/½;£zЦÌfâ3q;¨†—„Å#x›x/#L%kéš#SʆÂäú<®ÅÎÈtƒ (ê¯Äw߀)ž>/ŸÏÒ(KÂUŒ‘Ý+±¹Æ+”(ž^;Ë›`ÎsXNP} 8[ýáC{0hϺÚq5ä¤î0yå Ô| §=…â!܈̪ƒõn~u)rÛ%bIž»[ôJö+ë-¾¬U‡‚·ÆÖ‘øœÝlÌ´5Õ„tªô¥žšÜPà ùvaq]«ä¥ozý€ Ð@|Ý8N¯?ÏäwBzÿOé—ˆÓ®'ìQæ#ú)ïmìÈ)ݼ?ªá>²}î?ÒõǬ†V¥¢’Þz{}TÒRþ$ùrî>ã$\¬b.4µà6^ßȶ ÷MG6. Û|jœëT¸öäØW#!Š¡÷˜š–:®½6­TU„ö„` ó3oü ÑéíqýÙ[Ä-ÕŠ¨\E©¿T–ÂAza?ZÍ, ‘·¤Ýጳ㻺ÇELJïƒâá»ßÇZ,~‰êg,ÿ@~ cnçp±ñï]è"¶¯šä ¹iï.×Ü?»ç¶õà UNU•É© Ö€»¾Éè÷öɹ®—RÄTßôçb)kwž^{“Iµ²Ÿª '#IÁkZÑ §5…:¸ö–„Eb†´4«3¡G 3¾©¶ÂËÉÖŒ¥ ŽZüˆ`:ýžÀï2NYáoˆA·äts2LÔª™zàG«i<Šôоú‹ÃÖ{AØùÖò&71’¶zEóx¢ bþÂïÁôÁƒÌä¡Ñp55!ôfþƒØÀÌ@TŠâà‰[™=B[<>°$ÂqÌÔκ­ ÖâŽäˆø=t¢”ùÚK/)¦\àa‰ôÝ>z#;Õ¾ô ?¼ANmLñ¦>,ܪ³]®íW6§n]Qcuš)÷§  ¯LÝ oS ìõ ؆m³¸;³õÃ*ö<ÎÃgÑŽÙÈÛ»´Ùwf‰â,–¼Ÿ, Ò­J£ÖÒj’<úÁ“¯þ2"¶F‚/ÁkàGZôyé5]z³+½†dÖì|'c!´¤_mp@¡ ¡®ôÃ6Ž®ñ%]a"’ÌQ²ˆŠ x`{ \¸šÃ>`›nO°õkDØïzK°£R©ô‘¡Þnþ>ªƒ ®_Nf‰°ÿŸ™¥îˆ‡L ~¾Ðâà ¢¡¡„´ýlò»®Z¥Ú*ÄlI"ÁîÝ,ÃnA «ê3ëòT[Í‚C¤P-ÓÞÍ7ºÎ5мwêÜÕÝÌP ì.õ• {·öŽq€M¢u“Ú;®Û§) ̹ÈßzìKÏö|>n$ý Î鈻íÞA«í[Ókè=î p亭Zûì|\@qa„–"“)]1­ñn²AŠ¿P >°–î!%§°±¿-ì%¸K03ˆœ(þôÿ¹" ¦°CEÉà…[ŸBI‘¦ìLøFÙagP8Œ"c cŠã1U„ô_úr§º³%ôè½á/0ÝõØdu„ÀéO第~õµ§º¥°¯ÕÑ}ôñ Ë}ïÿ¦=xà5ˆ,u6^G⻲‘t¬Ï;½LRQ'$ʺBcí®ys ĵ CœQhôàõ^Te±–ßûnÄŒzìŠÐñå@`ȼ»öà™›'L'áqä¾ë…Ó¤Þá®Õ•«0×Áy°ZØ}T‹€1ƒbŽÌááÃ1­}àÁ=ìT=å†שäèÕáàÁŸ¼<õo„ Ä b xÝ*‚5ç5š%üú ½„u®DÔwädD g$)O›ªå¯¬ÂpØ•dULƒÏráßÔ°EŸ«p vc¥`˜ÈXB ƒ+­wÁ|ê8p1‡˜?ôÖÏ!=Ð…aô&¢½Z­øŒa›Z‘ãÀD3=cV«›êP›Æ(`³[¡ïg=LÒa‡ûvsƒ[r¥4º´Âm˦‹7ñT¥À•ÿ~Y¼‡Âű~^ÙbDÇ©(Ü-òƒR”ã8¾§îÔA0aêƒÖ0µC©àC]¤ìò`Ί$ç#xè1³QbÅ IDÌtGÀô3œQ7™†eÖ»MÿÆNÌ.ýNŽ6˜×l_b£Ó¨xƱ†-/÷ž=ùʈG¿0gñÇH\&C†×ÿGa7ÿÇZ % Wõ_Ò)[¡… :GMhqeº˜¬Ú™4AÀe'dÌݘ§ll’°y0È-{.çëa«ðHâ»%+Ó¼r¹íš²‡á!ª9ΘgÐL£É •B‰‘l˜·Ÿ I”îRàŸªJ¢óÅ!Lè¸E½öh£/tVîDʦ—]ÀPûß8ÿ’ô?j—˜¶Ó^úr[Ÿ‘ëWÅ€ëQVéÑc¿·,p8`0¸ T\*‡ævùzò‚lÊmÛº¡«™¼ïÓ½( ó›e¥E6¶XT¹q¼ø ÔT=«y9ðì6+ Ÿ§];* 1ä,›¦Y4nb8£â¬¥ð,d2žÿ5òE†me+o•ÒÐ 6¸ˆ±Ã³+ ? i|E¶[œnbŒâŽ9C†ÅZÀÔ°¸çßV‘íæ¢*ÙØØ/Œtî‚J¦8‡Ç3ÁÒù¸tíNj¾n6X÷ýG'dÁèq#Õ`ï6³ï-è¦D¡£{¸{P“!ñq—“5X¦ÙŽ}°Ç‘µC<ÕãÝÑ"×þWÞyÈPY¾Þ¾OlÁfûèÛ ûCônƒ2Bcµ®oRDÂB¨RQ4…y"vº­¢Í©=뺢=1$ûët„•ºi¸¼ :æ¶½»ä^6#Béj,9ò¡m„HÜtq²G…ƒÚÝ‹q—£GÙîº6Æ­ò#ý;nä˜•Êq«×(»€EëËì{o›:¡ÏbþÇv)ºŧ ¤¡¿~Ü“#%\M—§ (žî#O°ÌƒD‹ÿµ‹åpô+{(ïEý=Ј‘9EW\3øÎF‡Þ¹Â`?úÅÏ€úX”ÂÌs*õ”‰ÇÂ#EQ2r©Ð‚ µ¥«Ÿ¿î«3ëÍK6‹C¾áÔøæ­‘Ë`Ê Íë4Âáfn*<›Ô;Wõ-ò?QG½[qØ¥¼ž«UãKysújÁkµížHkÝá"ã5Ö(©Ètj”‰`¾U³Ç"¦OuÚ¹{·BÀÖ8ÌþŽ7ø%¸zŒwÇÇ{~XÖ¸ð÷Þë»àà‹c¦eËÄÑîÈ'­òñf`µLòΠ-4GíS•àŸøŒ³ Ã@¬“ï$³÷5ª'Û*oôººÎ’õÏͦߨ„ÌYâ^ #”i{§¿§?Ö‘™4²\<¢=§Ƹõ‚wÒ>–k;æN"FzÕlm]3Š3TW#ou¿ê x7¹»1”qH hä#Ïb)’»™»à¼[º*ÐÚvím¡ûïRþ0CTG"p¼)É뻳©ÉÞï¹{‚àwlždÏÜŽ#Éž»“o »DƒŠåNî@‡R(w¢œÝ[Ê᣽@ ¢*:è‡= W- *:Ó´ÅfH¯ÖTÀ{’^mf¤ˆD°¬¡þ{ï}Þ¾Ï7çÞœnnÌÜ·Ý/sîþµ[N‹Kfšadr, ˜ej… "|™x|RãA@"¼¢@å ðûŽ ™øß¬ÎàgÀ™2ypŇ>$$ž ñ”ŸÀï fýMÖè?¡ø"â/Ï”gÚo}’b6v:4}Ç5” 6‡Tx°ÞéaÇ£7E (ŸA Ðþj‰Öª¬ Lþ`™øÄl{“=%ÇZuâƒA”0z“o…ÈD-–÷4}tü4=À'Ÿ”I.T'R„yÆ-?g¼3Í¢2opâå¼Ãej qGZ³²Jr"Uh“ÀØseRUXsTEªSˆlUãþˆšB;ZJôšÙÇ_‡×n<(†òÁM)æé)Nš†CQ½É±žZ¬ºÑlim/ÿȈÈ섉•Q ¶ëŠáSo~"!§²Å¡–’†1RÓAVU¯$Ú„COkÏ»ýùÕA6ޤÄÁ¸~"8NC N¨nCÈ*+ x¼BÁj ‡Fdpœj1!_ÓCžüÂa±Jò¼>¸£"qÆí}älƒVöRWÿ¥v°'NJcÉÖ0&"¦ZXâTþ •‹Ð\@éí@|%;:›#ÚNS(‚Ø’€»ÒV/ˆS?ã'Í, Ÿ¥³ “€Gª¦ „%òŸÄ ‰„³¢xöu8bµpc½{‰Ø]Öš‹¥üŸÅ²<š3”R-¦2MU-{X™뤚UÁ:†HʺBŸy…U„O¶0ï\­ÝÆÉ§¿óâÌ?Á„øÞÌ?^ÿ‰msÖRø°iÅŒG9¤Q~•ƒÒ¨»?ô6Iõ~è"…á£óßÃó’à³ôY°ž|":ÏN)-ò÷‰wp@Þß7–¼‡H‰hIY8¢* =xý\©RvÞL?Ÿå] <…2ÌxßßAÊ1ð5™µáQ–àáÁ«Dvée7«¬3F_Ǧ)@;wÇ;ø»õ€àdµôÈîz8޳ñ` ɘ–Ô:olÕï\ägÚD#\KìÎ$­2£¥Ìµ‡.wT|5Ê‹ÌUM…¶g\:Ê £˜£çì¢'ì¬ìY ˆØø+ßoõ_ª°««¬¾¢>„“µ´4è­¡ /e]^hM‘ÞV>ެÇÚÜØúÀQ}»Fôdä)2!Ë⊤ŠX›‡Z“Gí£·ôšþ¾ýÞh*¾¥ýí€ÒkM°í8žÎÞh5,B©÷ÔD¤a¤¢ÃÝB«™ù‰:kÉ´ü|ó‘ ¬S°"/½È×1-6B3ÃÛ…w{w|¥{ UûGk`uܤ"o»6¾A¹^->.¸O¦W™% MDRžkÈQ?=ºßUIá†nSºsR±6ç#dèõh÷®ƒ/……SQ‰dæ¢úza‚ ~>WÀ!©l3´Lcž1@Πe^óLŽ ¾ðH?0噉 ¾²[Ž˜7çÍjrq9¶‘šI½É6åÊÆ°£Y0cÙðÀAzÂbK-=ÿ}r ãeUÈ)ëß¶ÉQ«hM[—j¶(è(‹anšÕž¦WÓÈûYãˆÿ»Ò•{Á/*VšQá…“W†øð#tŠ´j5ë¤s¤f=ñ´©¤s.r \•Ü[;eû„Ý*‚çGš¤z+ñÝS²×šÉô5í:¢7#9åô>_ʦP¾Ð`ð‘Ÿò·º$FÃ¥ÚŒ'Br|[73.ÛÉÏÂ#‘¿‘UzâœP™ ÞjfÈïXçî¶F¯|(š°‹Öõ‰¼§ƒÂÌ{µ× Ùóx»QêÐôR•φ1¥Þi›/«ËYO8y%5FLaÙB¾f„ì#†'³ƒæãq–Ü «Ú*àd¬'{²á· ÚDeŒ Dm¸Ð­ñ´.í‹Ó‹#ZR™I]#«[’ó<“™ ¨Ìý¦ï1åXà×ß4|Ò8¸þjg¿í¢‡k1hä2ÿü^gÝãËË»´uÿв‚%Ýb̘MSG;¡áD„Dä½QZpÒ)NÐ0ã+Ç -Tjæ¡ $cœÿ։ꄩØ”ѵШ#!;:ê)Dpè­·ç!-/ídEªO ÓZìXyh¤Ö`:?¨ ¸£Ñ,´·¬oe£{Fíz½o®)ŽŽQÚ™Tg¥°~PKðne¸ÉR‘‚-$íê&Mqšhþéô‚mm‚`Á>W^€.­MYFH¯Z­lò­ÃÈâRåpƹëieX¥•cUiŒ.´(ïÞO>“#vb«PWØJãGŠ ïÖ“½lõÌ?ƒ6’$Àn\HæL•ZÖ»¯þriD¨DŠ˜_Ì5:^º2Ð-i‰ŠZ] ®oþpÖ?ý—¡QÒ9ƒŒ’)©µðIÊP*Ü M®MWú•Ðj^†òeD¶%ôŸ.ö[Ê)»oêgW&»Y º€u'¯‡ñEyùùçå"$ьԤ<£t¶Š³òoˆ| xñ€ê¥>;×Éò†>?ãœ<´Í’:"azëiÕP[?¤RZ{ÚŸ)]“¦fôJ›¼0^g`€tÞO@3ÑЂó—Éò‘U˧FBœ¢ÖËÿéKûyÈy ˤ/ñMê ãìÿB¿2|Ž«bm^n†6¥ÔB†@Ù´ýj~ùôÑ?´·_¤ÛªpüuXy*– N,î™ÑbžÎM—ï™–~½hU+ô¤ûÎ[ Ä?cÚâŒjéÉõÛǬQ”Öšè#³)aw™Ëïã+úgMÂrÓ#RSª RqîñuìǵdaÎϦÕï™zaí‘¿´L×ú÷IqK©ÈÛv^Ú)MZs·oÆ;7Wø›½„ÒæÌo=@÷òæŸÐ9‹& ôœ¹ò4ˆÇªxüxyüh$ ¸ßDÞ>„´-„óÈ ìk?vòZO¬5Š¥Œw¡Xnl‹áÝyNÓb¾Ó¼<v`×™±g@9š(= (‡mÿf~ )†–¢?²EÍß©¿-Z&¬¨VàJ²!( xަš­KEʤ?Õ’ÅŸŸ_Ÿ[Ë[Ielì>™Tồ̈́Sç¢'xFªG_×±K­ÿ5l+ÞÜt¶ŒO%˜;–á¯,÷80Jò±'ˆi./{úÞZ„ƒAÌPH³1«Ž0Û^lÁì#y1ÆÉË®¿(ß·çS}Ò"[ð ]ÂË‹•Áôm{'Š ØŸ;p½¥?)Ìô½Ö¥•ZoƒGY$ºÎÞë±SøorsiŒû$åÖÞ«³;‘À(£w*œ®Kkù €|:PV,Þ6xžžú«$ºä׋úµ‚$(¸Ç¯ðBaƦ‚ ü-‚70éòãÉ*°!/¡~}4šö6¥6ôè/ç­EB$©5%rã8‘¥¼++3Ï”ì ‹ÌLóÀ&ŠJ{ôýØø–ç‰/Ж0y˜;³‰Ø·ÈMdA³å9%¡M*³ÙËgItËä²Ík®¸¹Eh<ôN¡æ•j4÷ìõ'éÚEÓœ'—Z¶4»®Ók»ø-Òª¾¬ØK‚z¦UUL†ôó¥|éËa';_+dº©:´~¬õí>„>mÞ=Œ‚‡fVS¼›‚ŸÒ%ý0r ๽˜­˜|û’¦ ¼Í*šIº)²ö®mJÚœWµ>­â~xâÃ/_%¬_CÝ7q™E>Pm¹ºÄ9EFÏ ¯?'4Sò`~MÙmHu$~T˜'\L¾/&†¬v.+<®]yz¯8(ÌypÞÌáœ[û¨šu¶,ØÁ/Ž(‘ªOª½3j®iOÁÅä²9¨)ï9×}ãxÕƒ{ƒa–Ù ÃïOös-¼^‘…$S²©z°dº-±)§rMü2–-€¯hÚŒbÍÐ,•Ñ8K‹D MD§"c3·Ý¾ X+ÌNáÝ\°>g62•ƒ+9yÈwaóÕÖ© ¨ÚvC³î£7R®7+Jš†àµ´¨ßŠAUvoنȬ̤ç¹8›9{Ïó@jß%6QG<™mæ§~SX&1%Žð 6­CÖÀEA}»$ZoW~×6¼pgü »=*8¹.ÚPñµã¸Réù¤öW7YY³€ú#)=ÛËÊ>¦ëjiošÊb÷.º0€µçûZînuž;,Y¶žýk×åíH–»xüéK;Ü«½Nû‘äG¸¥åÌñãâZ;­'õ tBÝíu>´‰OÕ2ØIט‘$sæk”¤Sª“’¹dp^ç=Yõ³&èÚøÍ(-!†][“ki^>òvóºˆê²›¶°T§+£›ÓW÷9Ú;3 ÌÕ_ tò5› êη*«dùŠy \FéRÂ÷Ä"$턆ÕgÞ­ª™íæåŠ3µ%s€Ê•¸e<Ãh›=ííi™Ý˜Qšb5E¾ÖÁw¸~V¼ ø¶®R¸ö͵y“)Mé"LXȬ²J+­ó׿†”¢Jy) Ô8$à6Ë¡ìü_Ú¹ùÛ;åÌ õØœO[¸Ä¤¤)ª`DîrRü¬´¦øŠàw¯ÚÐ/•YzÝ€ÜãÕ’ÚðžE[o˜þÄ;ÒÂ&„Šó* Ž7bêù#l3ˆ.ÏøLšÕ¸Š6 šGªãá5)T ‡ÄQ¿]dûÂò0b~‡Í'óvH{ÛÅ2S¤Zûol–ŠÐÖÑ¿?ú3¥zƒ>áƒÌ‹²7ìÈ ÑÎ ,9f;O1wÝZµîð'“$Ô( ÂÐ8·G®mì*Ü&µ­4ûQÚyOG¢’6ò°[’°ÚÁn„pÓyl›º“°¸ÑPß8B™V ±R @™GÄtbñòYßv-;þß«9hTùV;Õ>=Ô×oµ2™…èM/ê½à„8}K{Ý  ‰§£«æÝmUeÈí}MWOÄsaøG=޽Öå܈¦ß‡æØYì`‹¥Íë(xBUÁ„}£×Rþ´]@[,­‚÷z™ŠÂªŸ¦úrÀ‡ãí¢(îfàhE®'¼ï›ç({÷òdH´ž×¸ECïeúF\î¯,-rÚ;¥q¹&ú=¹P2ѵç pµ¢/£­ÿ\7Aá;òÿ&eP)Ãvî3>xxðLÿSÖ©ø¼5ÉÑ3çf}C©_õqE5ÁâvævÌIý¢oE¾-ßî÷ÝèÄúõܽ†qP9{ùobõß*—`†Å­Z/þÁú”bAfj×”2سb‘ØëÓfÊV7}J£Û­J'WOÔµXâ'®EwOs ‹Î»ìÚÒIo%šCÝÃrK U4Nªz „pjÐÕô©Í~T'çð–«~üx’££!jÿ.*T¨ãMãžïm‘X„='ö3™Œ©”Hý†¾a=z@»‚I¯$ñEN˜Ä§è<õ˜€!¥ˆA"‡-„¨ùÇå+ó±7Ó†}Á·‹—¡ß¨òüÂD˜âʶ§©’»opuÙnö§ƒ¨@rI‚­ÙHŸ%Däb?"ždµƒÜËÓ@zÛé\·HêFûˆ‘@";ð—N€5µ3äýFöºµ¬–ø¶æ³ÅäŸLc}ãÛ‹Xîp™vÛ}ö¬ySPÒÏ ÉêÀ6Û<}»íáÍ®&ƒ9ørá±GsnÕï$i]Ä}ÞÉw?)5ç!B—X8¹Ý˜ºŽ†ê®D?í & ’Ò¢«;P3Þ«)ä6’!Çy?Ñ|»Ht7åMpšcëÿ5½(@.4ƒ´ðöŽØbbàbbøæ¿Ô¯WââCÜÃà†öŠÝ4¥9}Kqø‘ÉøLˆ{öPÝÓDv:)R5ßñörLôþisp¬ç'ÕS¿:º›n¶¹"<λfîógÕèÐV9ô°çÓ³|Ïçœí Ž[[+áòƒ,5Öéäs$ÿ—=¬Ï`¤¼½WKöÚŠƒXòÐŒ÷ÝaŸ¨WÔ/ï†ÙÁ VzÜŽ”¶.$X€V4|{òÃ÷ØN~èP6|«m–=¬/ë|—Јyœ¸ºØêȧ‰ñ2oâ°¾›Tj—:@#>©1fy½gÊqXzŒj¸æø•’è­Œ<ÌIz!ÕœxÎó«7wš…¦šj™u4½ÜPäóñÇý=ƒ‰ GÝ8\ -ºâ’Ôœˆ¾fIË£²|SWôíLç±GàãŽoC±†ì“G.0‘€ò‚æ?–üB›"²ºu6áò”ýø)ƒÕ]0ÉY|îÌÛŠ)˜ˆt‘$ŠôvÞÕ¦âÂÌáU÷±;ç0^°Î}‹qîµ½T‡¯ëØÖ>Ÿ[ÞÎ’–ìô­JQEk\È"•=ãW6ļÎ>…ÂÃùI¼îäÇŒ4[È÷í„5k¼4K1ÛËfÜG#ÅðbƃÑ~ üÄ1?²ò*yȔҤЊøÓ¿l %a¡kêž/ÐϾ4¦ 0ËSÂúy,Ïg2t~Éh8PV¨FðÆ3HTG&€LIˆð¨ZŠFySFš©ªN–šhP¥pàfSûã.} â8™Ü-†÷=ívþöÚôU`/›xdÇ5äG©"¡°$^×[O‡†J”P/ØïH}6ì,€ kª§à(^Ù äøáÖMæbÊqÎ ZaÂïº-¿÷ßn¤bàÓmfªâ|í7ç¸k0sØZ>/¼sa‰K7æñ¾óY¸ RùŸŽŸ„F0øpM{ÇÇ5-¹³få£)ì&Ÿk·F-ÑQ×IæN¹zŒtbtrYjL:ÄÆpíÔßÍ]vD’(èŽxp‡Pv yéÞã@»3À]eã²jëÁÅ$û›7QÛùi<Dô ,…b0 ˆô⢫.”S@îLKµäH¦âJJWZ}6¡[Ü]¥Ôr(f2I·7/¼»²v]Ýȃf<`£À±¤E¡í ÄùÕ›û¿yÐîSYª†kàb!®ÄÆä´ÑG™{3xSLÿú0›ƒî-üRýPr\3 pÐ}×"ÿsX]«¢ïš²Š(¸<ÝØ'Ì×±“Šþÿð w¹“œ›–À…pëDͬÒþhÂéû½±Šd ÝrŠFÍVé›Ó›Ÿ‡T ‡™µ2äy4ýŽaP¾)àiI¢“zåéEêÞ¯ÁÍ%¦¦ãë3,ûwÜ*¸ûøúT­#K¤)<[¶ƒÇ”b°ƒ”Mv±!×r/ÍÒo ŠPî熥Pie‘e+´xœžVùe†þ“ySO“y"X “ª)_²ÿhBòÛª{“)y*™-ÿ'cùé^àª(™óÛ6ZÀ;sMÚkÍ/˜Ñtž%ŽW~dü’Ð}Ny<ø¹?EÒ7z}ˆÄ0 1C]ó­D­ßoGEOëÈ"|²˜al[L óõ1ý£â¦ý!äg÷Çꥀhƒ1N²Æ]þxi›hÔºô• Ž¢³ŒÏUq6«¾s”¬†äôÏØE§tr“U¨XÐ&åG ò³cSø+eد S93[¥é2dÀ¹ßîÌštóìZmwj™¾>6šÇ’ãtñ7]xø&—Þ8úÞ‚lj¼1Áª_ž¸¡Ô³Îj=ì«WÁk!Ò‡.}ýzÄå“n1Kø?lýù¹­/ŸJßM]nüÜ U ¢Š¢ŸJút%€FúS쀒'ŽL¤µ»JÌ&”Äþw!ß竘®Áfî4Ô(¹TœN¨Ç 2,u`dU<éGTªÇCä£X—[t3\ )â0VAŒÛf%øv6¾CD,Å)ÔÙw0XÑ!„H3Ÿ»I¥¬J,QgsvL âZu8~Ÿe ¨po´F7—`±b‹aßî<’Ýè–”ÍrÂg|8nuTÃpø1Ùh>LWÞ+¾2pÆ/ï€ãPöÈ á7ðãm ô °x;üe«‚¢•¦—(/–K~竳×([ã9 â0‘þÊäZÓ»ÝËr5®vÎ]5”]nóöç0Ô¢ñéűë¤_†Áȧ¬!Ѷ2£Aé‰-I 6|‡E’Λ65e¨¡-µ-ôh½p•,öÍ*ä°v¡—ÝiÈ8Ü0¦ÇÇ3ºyÎC2›ý¦¼þ9:uÝß{[oQôƒ“ò¬mš¼ý(Õ'ÚÑÞZ‹(¯ö½ÄëÙïpø{ã&«] È¢÷|< ûB«EñBeãEvNwBʳ²SÞj¡ÎϪôŽ•ô€cŠËɨw~Æ}†Aì<¼Ý\ÿÈQÀé)M_õÑü¤•¨:vù«hrd!LØ1®Çržˆ-l:’lê¼ÐùžÄ*X+VVÌÖÛo¾~¶¢ol,ÞÁô¥ùÊ éööŽu¼ è[¨DŽDËd´†MÐkgrn•ý^v¥ô"Ó‰3s¨Œxt“À`vÉ`@œ}p2ùçê“7Š<¼8ªj“ÆŽ˜³rˆ,ж¤½ç]í—®ž%‡Vð7}°Ù†Wö’‹,™NðQ ÞÖµ1TáÏnPã}7(×Áp“ëÝÐÔuÐVåQšîÐ3§œÑè»¶<;_²—´gýrœ™‡B)ÄуX,e>ÂÌ¿b£ëñܤø^°¥Û‰Ëc ÏÊEIjB ÷~(>s=÷b)Á,õÔ“™O—÷R0‚©ötºRUTãËyáÙt³€ªgÏä;©Ç#¹Ô67Óß½~|CìÝ75™ÉƒÚd”©KÜÏtߪX­bªen¦  9 D—û K»aZ2‰†È–­ê-ÄfZ$²³½0*d*@Z/.)ò4‰®;•%S3³e 畆ì*D(à!gد6¬b“ê¶^zßÂë¯ò‹©$²ØÍ±Ÿ³rQ«îžáþEíè ZÂ"£YÄ8Â쩪؞F ŽžÕ(=%5 ( ÜÊ5¥ÆJÅ’ƒýgÓÙÿR+ lÍÖØ¾ÌϵòLèÎ µv“#ÉÞ¬ÄÌ›ÛTŠ&ç­’àw7¤ÑŒ=CAÉ{§é:ªUùN#,R(ãòô…øŒÁ½›$°ª)±sÞž«rïÅ┬ÇTF'€¯Êê: û>¶üuê¦ÃJ ƒä\s!Öx0†±ªKÍu»©F‘':ÍjÖm{ƒ¡Ù ô çáÔJ™v#%')íýÑÏ]V65Jê|M=¦V\]€*PrÉî²x xÖÜèÍ‘NkÃ§ä¨æ³t`ÃÅ£ÒBšî‹ÖŸ±ºo4”‰Ž"Ër¦ 5<°rùúf¹¤K÷Ùþ;)Õ©dñD%±`4ÖDÃJev=Á2`ë÷>Føó–]¹°Ü¥ ȽÍçu¤ƒÉà^ñ!÷áQKÙÆDâj+Õášf÷ùð‹ÕWYéni:רÝyN5gslËÊ•dûi7lä‚) Ëþé×ó.l5Hof‰ÁVÁŠ ÒÁœm¤fÆu«Ì½¥­¹«œ »¤b¢ã§uH~E0'«\F+c‘åNU\îßFIp%éYÍÀ—ß¼#ìüÑÎOîbC Bëh]]¿ôS´ÝQЬÕäÄ74Sb"S²w²µP"4h`oe—%`Ü´¢WÌ2tSc˜) ‹[ª-Ü;aMÛÀÿ]¡´55U³NR—Ô[á//” n &4¿Ç rk¹ß…†¤×C~˜EF£ ib)”K{ ©J¯†¨CFZÀs½ÛM’œ0vÚr S¡ÚôNô0Öþ³e÷åH(i«N&Øý" ¬»älžw¾¯´¿ M]’±]9#¹:¬ö|"×Ks)¬Vâ7~±ªÃjÍùþªµÈ;³ã½ þý·®m»Êh5”Œò#1§Ú~Ó†PwÛ©joì% ŠÖ ÷ÏF5Tk$Ï®ñP\ëèUéjÄÄõÆâ.ñ#^»‹­;‚D¦·ÈÁhÝßÖ-^%˜X›K^†Ì2îD°=“Ý­tW’RÍ_H’¢lPxË4Gè*ŒìsóraÁ‰lÍ—8s”ߘÞŠ‡µÊNŽG¼ÊLéRkmÇãá=2\ƒÎ—zúɬÜOw:yXî.߆‘ü “ºîyº+Ö–Ö¬¯j,šg~í*Ä­Z™å£ýÿäÊçÖXcYrTƒi¹­ïÄqÁ¨7MOÑ}Ù¦&ù¦5KÖPM¯ [QOàZ{AæCËÏ¡èA½O¬â)Ó÷äÞ†JBN§$TÙÅjì?.­¯l´v»&ÍA öämêÕ rM6é|Í7˜˜©úûlà )-1LÝE{C‡>6‡oCΦî…r¾Nõ/TzÊòÚ8ßµj{-'-Ãû|Ü ]ÕPȧ:®µ¡²ÿð¢°R¦¿â¥oã$í£Vß´·»xœõ¯;ð˜~æ=Ñ׆ð;¹Ç¨º;Û[1R¾É˜¦lgÀc‡­gý^àþÕÄÑÞ‡½Ô7V)^ÉêžbEwZúα9ôÅ#˜”<0=¿7œQçf*w}eÃ'yQ»vÖ©s!Ü—E nb–ÖñAXèÉL쨹YIØÙìÓo׈yÔg³û;½ŸmIMφMµˆ–²¤éˆÆÇÒ—zWø{¢w>øÉh9õGCßO:ãz¾gâúÙaN3Ÿ2ëu–µýÎÊp?ÃòçC îõ!`o>ƒÚ×f³þÏ¿û3‡‹Ö×á$F°Ó)¹àºêvÒ<…çë ÿ¡IGËPÙ Rûn!b/HçŠq„–ðšäZS†úr/R7=Ì 3ÛÔöfˆsýžŽÉá6À”ޏôIr; #‚E÷ä1ì É{ä' ƒß µ(DHÜÖ›Ór|ä7N68—#CH¿°ÅẔà)l ß‹n¬1ºÜ)j˜€:ú\ȯ«œËšþ2u‹Ú²Èh¯ÝOá`6ÉBê¨/ aÃ}åü,»ç*B Ð[¬a U{V'º7g R 9{€Ú²÷íU¯•©¦øÁ´SËûûOLȶ ‰ÉÞ|#>w~ÿ’ÛÅîÇ–-äþOÀâºÜø]9jöÊÀ©íûÿ³ò¿²Õ÷Kî!_ÎØÑûЛ»d˜áßë}Ë$%‘ø³88†U±†udV¾!oë‰+Y\®gÏV'÷²þyVÅ®»ØØ²–·'Ño&X`ÃòãÙ ‹ÏGX+¿ÝèáÏe¤|À]þýt&Å:b"õ|ƒqƒuÍu00yуܘÂG{FžÆUá^±¦¼àØ?®1‰³b2ÓÚ|²ýVÛÁsm_X °Â²‹ø';%úÐ3VÚKµ‰är úÜNoWO½v]ÔÁ(KÛ:tL\o{"† :UeUpúNÆh”'vÝbUƒ30™àÃ\möY–¢{WAà gIÚv¢û§ò…†¸¦Y;qaOÆ® °Ø­Ž"áX|Æø×ËOk祄o+Î`ïÞõÊî«ÙИkŠÇ¹ìˆܶÆL¾Ä4ð€ÇF9p,(Ó¸:`†lÝÒà;rk÷…þ£Ö;õ[œ!›\îö 4Ô¢ª‰0r”ËeF¤XRù1ØùÌ !Žßµ¨N)ŒìXžEû±ólía‡&~º¾˜<Ñ&°ö‡“<Ó\iÞ¤hƒ9ßwl„¤ýnä̺ã ù뢺 ÁU*²øáL9øÏ&+o—\ܵ­µU3“|4" €(Ðñ2¡màaUÁK±÷÷jd:Yþp0“ÅvÖÎ-;r¸ô€}íÙÒDGñl¬¶Œ;éËÈÙª_IÚ/$öV®öªÂ¿±[“G<¸þ½†¼(ûýÌÝã7\Ôé¶ÑLôíwì¡™£§,Ùþ‹_J$ö®ïáÜ‘Œn*jA²¢H¬˜B¨åLó"ß’ÿŠVà1†ûSÐi^Òër¦ßO¼úVQ濦× ‚Ë¡3TG3otoêü{$ Éþr#˜5,›$rF ÛÈ‹0 Û¦¹vmGëÛ¶¶»¯þý`PFfÎl ~þiÎŽrIïïNFI›¦­’'Á€B²P´¶8@ÊÁ)6·Y¾ý#kÀ…{ …@e ã•#FWdÇ_HP*žØ$©‰g\乸 %ÉT9)ºâÛA™D£(ß?¿ßß}ww»n¶‹YÓfnßà­K„Ö — X$«ŽqصQª0+2ÓVJ(H Ž$¤×¨+Àâ¬Ç0À|9 Œòø@…Eÿû’4SÿÏ™¡+£¥ÃÒ—45̬Jû‹ÒÕxÒoY¹Eí¢Á¦¾äS§²9¯yߘ˜# œE³5V »ö©êPšã97²°Ù21¯û’ × þì`céï‹IDðšoOå±h›âÚàâa‡eÊréŸù®F‹ÍÔó…Ùo[;Z½Ý¢mv£Biñ©(?ü¼š›þšñîÑÜØÒRV-“VáÁÚÑU}Q¼ù×–×c—oêk€éί³z2! «ŹZ3¢[¬UÔM–uݳ39úЄ=j箨ï±VÛ¡«KÕßßÝž–ËVŽY¶üZ„XÕ\á,/¾?üwáb”/¯W{GÍR¹_ÕízåÑL¯±Ý³ÆV¾=æÏðpQèî$Üc„6™JL‹ÞÑ^­!”éü+ðw=/¯™ë…¶âÌš,ô•¨Ëƒ2¦Ü)¸™¸–ÁoÒ·,(ª5OæÞò&bþn .§ZÖ7¾³Ž½Àž÷WŒâ¶ËZw*ÌñqÏ%x´`ÕŸY†'ŽˆTêd¦j.§ÁbˉµÄ£È^@ùƒÜÞA}4&§Üð¿ñ@BüùwÓm¹ž”Zï¡;äßËÖÂYéøsV›…²°˜—fÚˆŽmòjV• Ìþ|°íË\rÁ2/¡s„w±,<“†0â–=„|0™‘kœ3Ený‰„¶xS+7m¤òÍD¶3Î6åÑboò E&2ìØþòŸøxé59>W½Uç9D¿êî£W浯­-°‘ÎÏ'Êdeºf–ol,­AÁ 9´Ä,[µš(‹¹´­q>zülJ-¼PÐÅ^ v S/ûÃý™¹¼-Áp"„‚мf¿÷µÇôÀjM¡ñ²˜Gæ¹æ»VËTÛ˜ò¿ÃU¯6G+ØW_MP–w«öÿÑz4 骫©Jÿå¼JÛŽ×jÄÊ,nn®rÌOOB?11grâ¯ÏSe—3ã.Œ¬ ýÞä p"½»S^®væœYmÆnÔîºÕ[*xÆ}8úæWf|ÏžwÏÀFü—¹áª×òöñõ¨YË€ô™ª·û®È³l˜Ý…ãWßw>³²9ÐÒm”íÄe€o³ÿŠzë–¡Ø´½Š]k)©µ¬VYEn]Øã [;ÃvÙQüc¼Ã´·¤¯¹0RÌÓ·BÍÓÑù—­ûþ¶¹˜«äµBák’S7ñ:åÂ@Ç mµÚn aàsùÚC­/”™ôÏYÕ¤Ñèu•¶•ÁHÝf×Xúx·ÓNÞ‘¾çýW ©p]µÛ_ýA‡7‡õÓˆÁ€Q8/ãí¿íArM™OÙgÛçÂÄïyXS°”ÅÞœØüüg&áôj-¯‹M;ΗÅ)CßïÄK2ÀÙjÿ±¸t¡˜´­ç/lŸ‰éûU8’;k¦»1|î^;‡ÿ«3ç>Ç«H9-ìln¡žî‹ŠùÅûÁ9rV~ˆ©°-EÇ?x¼†3„czñªj’µP¬·ó§<6œÖvúnÙ©[ ´FÛÅ*q6­[ÏÄ…–ÅG©ÜñêL¹ŒNû϶Ѭ9÷Puþ+¾ëG‘­öµÂZì5äW"ÁžÙ!)Ûù®âg£[–¶Ï¯7ô}»~^¨Û¾_i>îžò1¶à›úž%ÿCçá$|“þWÊ?ûZÄYâ ÆRGb«Úçaƒ6†~yk¡ÌHý[¹¿-Šü;X8“5Ÿ3À™ÔL‹Z&ÏÏÉÔú0ÏC=éþ:…/Ü©N"S!:ü}NÕ#ƽñcKj¶N0OáÞÀ÷Þò‰€I'Øx\ô»–UÞ¤ðŸ—5ÿ:ÒUýÔjtáÅhæüæôšÉzÙ©Šéì†wÙC¹ÔðFX}9dé;:߬(C‰–‰|±õªYEë<³Hž_ر@VßÏ0Õ°ÆR&UÓÁ º'ƒT¤t™ù©¾Ö[&=‹Öb¾¤‹Ç´ˆ‡¢ÒŠºbm-¥£‚D²ƒ¤%øeí΋ɦHNÚ܃ê^[W‰™PçZôB³&!úäw…j—Ö”6 Z Ý…œÐU‚=Dæ°Ÿ²êÊ߇Mž@R”Àiöt"ƒ{EËØ›Äi¿c¥á]ÝM¹À@'«¤ù,åV¯EI;¹Ñc«™egÐ222:o›8!×iô99EüUêØ¢Êß™å—Nóx  ß‹vºß?ù‹‹Éq‚üÄ›åÆp7ÀûŽNaã+\‘ZxÇó¤S;èŸlÿhàœŸk`O ä359®Õþ<‰Ñm+²V‰O'×\¬)ë%M/­úÓ˜Í8F*óŒw™±ŒyLŽÈ·wš¼ÒdÔ>«ÿGhÕ—njmžÈw`ýX?‹=0éªÅè/ö±”Å£«þÁFqMæ¼$tÁZW@ÜšŒ&‰ªÏz /úFÚý®0EÓ.ß`4ÿëS_¾QKÒmëô›Óªk:f–ãµs­ÄÐeV°Ã¼žM´ú®¯½Wçk¹ÚNL¡,²Z•zÝít›òk³dƵ½¼çTZò Ø\(¢„ÿdÔïõØÛ4çŸ#;—MnA¾*&äGüè­cÿ ½š ýÇM‘¡)ýR´LtËEŽ{ Q÷Išây.s‡ŸÊàœðžžßJpI¾ïÚüËöóÃ&¸^PF#3>8à„iì`¿àfHr0S„lCø`ü@xãÑ ßÀ9¥Ö[HƒÁ±Â ‹d–7äôˆciK<¢O DâW¼PÈ»ü½o¦"äÇänøWäÖbé¾C –¿ð)["~y`sl!ÊVýâí-…â¸`|‹"·OU§ŒXf|†!7¬e&*9³ë43I¿l]®†8f¶½p¤xÁŠÑ+¶tóáãÕ©ŸrÚ¢©¤UuEÉYG[3r {v-П٠ Ÿuñ_òq.AY …?¡TLœÃÍòÄ¥²¬ux_à¤2 é Y·gŠpuX"%;…—ªû„b\«¦mM&äPk@ˆ†\ø©d.¢ŠôA]š‚2G„8†71 Ù€0Èš«Þ“óöHëæãçj«“ëXK°þŒ:ÐÔq3ùyˆÁncdT!ñRw=ÓC(±fºB¡´cöŒ³³=°À¸1 €€š lê:L‚ý„-êN´™®O‘÷„h×p‘ß ¿´Í£K£œeî+ÀúkžŠÏ>ì›ðIKÑmM-‰/úMm–7–0ßæe_«ÕH”/ç⸖Ȧ÷—#âôBÎ\1†E‹í¾’Ù¿#ªÒõô—qèsdcñ·Ìpù?ÐÄ?²à`ã' ú[$§ûÈU|>ä—ly =†+0´N§dd†Æ¾n1„Ü…³ù•NEÙ–X)äDì©AºÈD˜“@'$l$Ùd’ÕQŠõ’d#Š–#ºðˆ™•TSª-ŠÉÄ#_v;QäëÌÚÅ.€¨KÀóÒï¹XËâ´¿ßv)ü»Uò¶iï|ñªØCöKnx~˜ÃMº|É"ÈXBÀ Ö@‰ô!¶/\l%%1“7:èÇ&'‚¯W…uRx &ޝ æ?˜˜9”HÿÐ¥$žôݲ1/¢\˜aëUïðŸU°M}OÛµ9Z®¿–ž‚°OèwÂp$†ü¸ÚPbdN4=d€AñúeÞ}ó!NH̨¨üH¯¤k$–¤žÒdMÊ]—éí?_±ò£(Ž(÷+•Lu®ú=“•Þä:TI …Ö¹ES¤o.ïUþ]Áæ 1áu‡ÙÜ üãü#:xÔ}iáÿ ®Ô‚"/éˆh|Û‘¯])N´_2]•=ró ‘ÉÍVÛeÙR*©J¨l%Ç+´êšÓ²©A2ÍÞ›UÓv-Øß«Bö?x|KT=eE¶Ü̱ ¾%Xag~X[Qžë²C×oÏPÊãe5±ãÙñ·9™)ÈùŠédicXÌTýØEƒ×dÆwèÉÍbsù ê½(AV§˜2”çklJ)U){W˜2üÂþ9¬¦³¾V¢.­1Ú‘ý¢=2¯ÍBTÌ+Û0XÆmy»’ƒÕy@ÿ¯×P^Pø Ãkb7ë!ÁСÃÝë²åQPÜCâ†c>$q;my».•PñüšÒȃ¨NƒÚ_ÔY»6àn¢K‚£Ú7¥J®¨¤FR„gñq‰ÿ5°z¶H³îÄå~í0F‹5¨/H¬ÊÑRÒÐù;€=Ø ˜Ã›¶ö‰ÄmáüýQ {5àRwÀ&¡çáÙÁSHʼÑéØN]#¡<…®84ï™qðNe#¤TWTWÝ€¨ÜšþÜýÌ…˜G@}gfäcÓ\Çef%UÁʈˢܤ¸…të9Ó+”4ÿ5îªÁÔû¥¸IÚy&)áa2ý¶c3êf¡Å“’^D2ÎD™¸m1æJS´Ñ3 éÍuï¿Ã™(O©5À”,á„EušWŠ½Û©ë8œxT÷ÇÅý,ËѽŒ ˜¼ÁÔ'xì¿’;œã_ÇÛÿñÍs‚ `³V’ÂäÈòùP†z<‹ÇÊ–‚¶™¤ÇËø+ ª2íÖ—G‹Æðô~yàŒzf,öȳÿ"sgÝf dOT”Ôèx#êäïK2Ûß|kŽR´ª¡î¤Më CÍŸ[»’*©ï*—Jâ2z™¶NÀt­¤ ý($¯§ÐWÉww*NNŒÝ/• b:a09ʬ¦àŸ™þén¦:Î Ÿ‹r"3ÛÔ&¶ö·&]éÅàk(ÜètÜŠ?åöìA7$ÀÎ^Öü-%Tª®Ú|QIs6YÂ,3C‚\ÿ™§6ôÈßaæk§B•wË]¤2"T?£AòÕáÏaè CBöOèa€‡ñ®^JbüqÝÝ%άù=³øÿ(t?êƒ ë™S C4@#oe>‘ðS3¢Ü@Ùü-lDƒÈi& "¯»mÅUC½¶”Ëõ†Öï™þû0R#BEAþ¶rwœ$ÉŸ»aÂ$“Ì‘’„îî)Éɦ*ʃo›2UªÞÝã£yÖÖï½–ÕÖ½z ƒ•ÓŠeƒNmºŠjY£—½h­ôŸô3Ì€Ntl’L–¶!›I@ f䬈à¿}{¾÷½÷¹»›»r›0×d¹3»96#YÕRZcùÉrk¤²Üa‘d+Jª+ÉK’ˆGxA”ŠqRˆ)!N@𗈀ðpáþ±&3C%"£)™[jeút¹)U2+Pr"`u¤§Åá΋ꊠŠP$ež •¿o´Ý ®el(„%lp¦ðUT”¤‘±ÖfD®©Â”¬b§¦Ž«œy¥+'Rµ¥S‘PÅB°ƒ6T[(H¦£Z¹8&«„xÞ´ÔÖZ“S›"d4˜ªö] üÏ,À­þ•m#3^°!òJ¯ö.‰†Æî‘² Ù¼O-…®S1ÏÉÄöV¤œ#Ò±gr"Û ‡¡åg»“2S®b=Ö«j”#E ª'¢h5daÑ¥z.&Z]Fzæ ¹£x£EÜŸiªP*Æ·”cÅ–FYc÷Љ%éï>´ä»h~‰ø÷4åh’î¾T–_¥ tîò2•Ì~ '&C»«'"Êò”ƒ…b®D™øzDÆ0ºNÌÊCø/ªË©g)—TýûDÜxœåE‰39×ö3ÆÓDEÔµå› ‘%V±†ÈÍ9)YWJ3üÄý&ª3ññ)òþ'Òïšæ'>“ŠíPóÊ®.+‰ŽNgŸÞŒNS¯–©ÒšŸÎe‹)Ïdm:PÑþš5fVIe’…¢|;qt‹…ŒndžßÛü1ßâN0¹²å8/_R,ëåk!±SEÕ©˜è<ÈkÄÏ.KQ—"â•©Ž¹Ôí4Ý1´àýÊé°˜W‘|~ü\öïý1—%ø¢ÚŒ’q…ièÐô¤í’Ð\ÎOÃE }7ÎÐ8£¿'¡^NjJójÙZæ»8é ÄÒ“ÌW,õJ²¶HÓúøÈ¸ˆ½ªvÂWß®ó–GÚòBeîñ÷oäåí)êÔØ ³i®îVbu6&áH¬H‘©’„Ê)dµT#½J.Ü’ß5 8Œµ nc½X-Õ”Ëkc!H¡ˆŸÙ¢ÅíÖÑî«Üá‚¶«;ÑƸ¦ ÂJ=ÜWUåzÙ¦1Ë):8šábÕk¨Ž¯«Àx¥<~C=ñý.ú9ú[¼—˜tõËß!ÎC~‹Ôóe2E¦<ž7Úîá¿J8Ž“Q¹Ì?-§cåréyˆ"áKSÃV,¯§9{{ÑkXÕ |l@iRimÙKÈÞC° œÒÊtJÍÂkÐ;5CHâ$– , Çõ)±É̉Òñu»2Úÿ'ÅÝ!ŸB®سÀþÔ†ÛÄò\vtV'‘ÄM°_@Z‰8ŽyêŠCtcŽd¥¢Te&ÚÁ&£Ð¯>Ð ­iSOð”uÒo)&]Ô¥.Yœ¹C«$îü_«ãÿPq)‹ü&\µÖù ÃEņœ3H(rG1Iž¥rOÏC}O·ÅmÅj«kÙî2Ú†yA­~ûÓtPšlä=àü鿼 uq®³ÃðÝ—çÖãsoíjäáô5ê1ÔïLÛº²žwëIú4’x6nµáès±U /Ñ'U”;3ÑÄS4È\ºÞ¦»Oôm•‘³Bv÷â®ÛÑ%òR;³¾Þ½{'ÿ¦JÜpö7r÷lƒuÕäz…œ³ 4Eý3úŽúL6oÚ#zÛôTmLã>¯ÌüEê'ï½O‰×^Rþì@›wÒY4)¥Xú¢,â1ÝŠ(R­c¹U”6ØÑG¸2¶{EÁÉ CqøÛ°áóUØÙHŒíw‘oq&Øß,[8ä{BoqÊUªga˩梹êÒ³`^Ms©V1!› [¿=ä‚…|¯“;TÉ?(NÖ‡$§&“ÆXÙ©ÂæÖÁÅ5îŸÙ«DnìßB'o«sîÅjâKæOzîóOP!‚B®œÌá©ÌZuîXÚph»Æa9þ|=;4ݳ-¸Ë¨±Óxà}yÙïݬï»#C­**YÉø¬-™¼ ²¨²róòD\iI)ŒI¹ÃO±÷eJ«‰t‰M?Òl@cG†6Êu…•”`™÷bÒr´ˆz¸h¯¨†ä¾hEäâ­|廳ðî=ßÝ ¦ÖâÄ%u-/°¢Ç’….ýÓq‘,Ìx}‘í¯Ý“ó D½6Ú«1Òs¤õ*ÆÜ»“’™½Ò»[öj™ÇD{éö—ÎÂÙ3‡ò–Åâó·Ž,kfŽÍƒg’¿‘®ÜóÓ*(ÝŸ§²!žšÉ)vñ¢¾W8i3VP빋¶¼aõ#Õ\ÞmÈ÷¼öôÍ÷þî$[S̪^Ïãmf{YµåàJŒ/æ—ñÕ6sé‹çÌvÓò Àøu'MéEÊo¼ƒÅ õ…é_føoßý-Ç@g*ÝõaÚw÷®ç”Ü ¹íŸiCçè ä¾¥Ú­}%²+1­Š«BùãYLâ:ã ”Þ¥÷£k&psÈeA¦M0ì&šj³ñ$-T!uHäߌj¬¸îáóÛïH.ˆ,²bUˆ—IYwsÅJ.mL“%Ÿ(Õ%û×(ÿ÷D'J5Ø ŽÖŽÝ–ýÉzz$"ÓZ¨°Á[+ö[¥÷ |6ÊËæ{wHÿÉË`—äE†pó½›\ð `‚6²Ò°ý·å9Êß»O¢N釷ÍÄï’åãï3³¤¨¤¦b‹õàüÙ¶ñáŒVêæa%ø®p >›of{öûQÌþ¨§ãx1äŒæ²½/Ì6#ù-ü}áñ 8?';Ì1'þÉᛨÀ¼‘”XøúÞ{±º0aÿâ:D ÄÄêT¶÷Fó×>£à¨(úCÀ”¾9«e³'ô¾ì~•Ìïö»Y´Ü¼€c†ÖBQæšèÀFefϼ-žd›ÆîìPdt’ð„ì§Þ*ãÉ®ãK‚zôK¨ðÄgx‚k±æµj/>«+þ¨$#"Ð÷åìÛ®ßëÒ>D^ƒ¤Ö}ºkê'pÈôL@þƒÑ»-e³N5Ï€©ÕͽpÉü÷EÀŸ?*‰ô°ÃÀ³ïB#©Q>wh~Ö°{Îÿ\¼‡2Ï'Qg»MÍ–ÿ¨èbÇ4Gmå@Ž 8¨§›R b›vakG‡il |°”¦¸ˆ©Q%^íŒ%QicØMj¡8Tcú:̤'XÉ™2n ù í.ÕJœŠ¥,Äå ¹ æWjµ~C´ Ծؚ‘Ë‘¡uJ­ñŠbЄÿƒV×®.Çå²¾ás]ÇI„àçÿ¾¾Ž]]æR=rŽ×{¢ØÑÝÛ\„¹î#~2%û?Üúhf HÛ‰s¦kØ\ÌAÖœýáþ9&ûŸ‡Ü‹Z41™íKs Ã0 Ž‘Ñ„Z {´°±€TKìØÇ°B;ì^xüAKÔÁzŠ9¥‚îú™FÙ,;c-Žã!Ávܪá•ÁùŠÒqýÊ_è å¦ä"Ö.á Ãd†øW´qŽöÙãrO>Ÿ _óñmE»¡æT*‚žœÆMûµj®|6ç!`Å£¸†¸y¥¨oÚøq´={å ‹ÿ6kJæ÷1ý ‘i'ÒŒM<,@Ü ³:ÎþKiNM ÌüW4g@õ†ÀýÌÎòÙ^¨‹¥áºÇgÝa )çÈ •FÙ1AÁª€ê†lö /ù.’¥»œ-qG¯{ÎÐ}?‹xô§ÿyôù58;/?ÁJë¢~_œÍÐÚ{ÎþÐêA¼²ÐÿŸî:·^Ý…ÇÈ詾@üoÁb˜5 ßÚölŽ‹Fuƒr”êê1¦+v¡GAŽU´Ù½Vœ+œµùÖŽËÄ~­ÿo2P³½]áyÓ¨G­CüÓзýjåñz›ìå0KYî)&\ÄŸÉæòj=ñNc´X‹–®S½iœ;š}šTú'˜›æjú±¦½þCA:õ<-]¹t–.Ûn4ÞÄðÇ'aAˆúD]Έq˜-Øé{:uL]µM¼ÈOºðé«ÛÖÞgq"nØ~Ø9¦ ¯3c!€¶Ö¼ ÏÉvíV”±êÑu3ÁGUNÓDuµòYUÿ³R¨Ï ާ½»ÁÅd~ 4‹í‰d—ìé gÍ£¢m¨>wÇÎáÙèÌi1i?µPŸA§#žà=¸cÏ Ö|ê5ü¼¾–OléÌ$qÀÒZùÏ:»‹×L¿¿B6]L®|ƒ>ËËÿKå*T¼×Áy ÙâÐÜRI@ö—‰B—c.0ó2M‹ø;ª…ž[¦ev < Áäº3aàz° ®MmO«¿8©ek¾nb—¹Ùy 7ÿ3˜K³ZrŽìI  p,ÜÙ¾Hïî“ „j zœÙ,o¼ÎêŠà §zóÍ-—ùHú¨$ì/ÖüŸåÚ_v/ÿX¾<fÿ KÛº(qÃoÊ XŒƒ{ Xc@ Ù¡UD!„C=g íbÐÇ‘ºXˆ×ÈWýr‡,nôà]Ã㡌¢Ì)|` 9OôNh¦!~Å’E‰ÖQ” t0Ã4Ø» ÑL\nûÏKVcñ¨Ú@ºŒÀ Œ½³Ú0ðtÿ4™ÂqX¤ýªÂôê~Üd‰ðý„G³8]mÜèûf°ws/à ŒaÝ?¿‰Æ]^þ0†ÛDóÁQº5`;Q/³8Zä8øãrµb€ì›Ó% ¡Cëx¤Ä±JC¡eR&ÒµF ¥õǽ†ZÕ›8˜œl‚þlw.•‡™eÁëGVÏŠ.â†1èªà¦wKÕDiB2w%7Pn,›óº[1]11)vF?…ÀæöÃR¦+w~£·ÀHã[ƒkÙLŠ ö¡ÛÍƱT bë`±½ß“Xgã&IiÍRžJ=V;—jCû*?Ó»Ôi©w­<¬Åú̾tfUÊ,Å[ÿÐ×ð,ã2>~tuË7¸¡z…»¶©7k¯1JêW›]Á] ýÛØå#ΧKÍöþ±øc¦zhA®JƒËC»vSà:¡I+/øš¿~™KÈÀîÌÝ“÷zŽ‰Éžë¬沊Գ’¦±þãI(6¦Ä™º[¤Ú…Yµõ–†ÄÚõÅ.È`ÂŽêÂ4J‰H5äÓ)‰®a×y:¨I'f·lãØ™Á;µ×l3¡±Âì2 š kŶ,H¶Eb.Ä—?7V(·« åü¼"X‚êß5*Ø`àžˆCóíeØ/×už“–®Nxï€iÃcÄÔÇ÷üÏòÐ AýÀàkeòRwöû®Ÿq:™XJû F»˜À€4BXbÏÂ…¦‘ê…û*DäÉŸW3r\L=O,µ@Ü.,i¶HGB¥hìÒ‘ÐÔ:l¿x¤‹U–g"ŸGݵ0Iåà7§s-¡WˆU®˜º0{¸¬n¾^×P¸èà'K»%×Gï¡ó‰;,߆‘™0õ›É–ÙiÑ»2Å…‘a¼‰{½”Mú±¢ÉÚ£éâäifãízŃ/ØÖØç>“®0€«gO8ä[~ÏÑdË” z”DœhÊ„ªÁ5oIk¦þ„ñvT L:'0>šLúœ¯^Ñ÷Ýßü¤=–Y­¹G’`Å«õ·\Æd·/îÈþ#^C±N=Ω>•Ú_& ró2­±Ù4Û3´‰ ŽOÙ±{M²í?ÖÅŽ’-¸³N4Ù–Ú§ùwRcN æORÖ±’Ḏâq,ÞNx™ˆO³­ÿ“ 7¼°ÕÜ”ïø‰˜ƒðüœ©N•¥|ª„Jbá)­„Ô59ð3gzúâ“úº][Ê?LCF÷[/L †þc3Û+& 4À¾ÃU1(’ §Ùå6/9s ³ú!áßM(¤ŸUVm“îJOXŸÞ·è˜ Ú-2\g6cn“È^Ì ŽâÛ_G)CƱß}J‘:_ý–Ù‹à}¾ÆÛ¨RkyšäÃÍ^š±ï#ã ,g¿…÷›§‚îpŒo\Ú0ÕfºEæN}ªWðW.è±¾xT3M|¬À!;ûà @ 2DP#f=—3øÚ¬8«@T $©¨´À7I§»•k«­–ìRßÕû7K¿wÿÿØü`f D®oK{é©gÆûz%üô4;’ËÚ½¼m e€Àä¼”WÈÃÀ¹È=òƒŽœ.:3×Oñ¢Ê;ô£10ÐMø£0€ôJ݆¶$“^»Æ’¤ˆËŒUÍ€¾Aîûï÷ïý¹y¯Ë¶5®m^’ò6­kiÐ6]ÚÚF„¬ƒ"%¤e±Š˜¨( µ 1>óoP€ð>Š€€/ÖGttOè{¤*x*¯7ö'&èqazS&ÿïq® Ã7É„2dLYZ\è3p<;ý“+ˆƒÀÅ´h7 !e¬,l°2~‡Å‰…âÇOðÏïöÝ\ dÃÕ4 áÜÊ”øaáÙÿÝ®ö ô×:H|„<‡?!ALÅè¡Å+M±Xu-*`Ey¦M¬Q¶ÿúF­ÁQÉ]pIF« ÅÌ!+yvºF%z@Qº*8¶žN&ce;1 ýŒìò䢣€^˜z0®*¤ÂϬȌ…§O£ÓT"M*tEõ<µ>wš*É2©é“£ÙO»gȰ™Ý~´’Ä ÙàÍf|šâÖ@úmÓãE@( ÁƒõŽÞ‡ñJÙ×t ×°%üŽiòá=Iô å¤"µôš²:íh¶˜Ùt¶Ò2¾5Û˜*oíõ‡ AVË€zòÒ×$]À!p@Õ`™ÞÞ¥Ó#›Èm¶"þ9ƒöµ„ŒÅHG_ì]˜ Ü g<ÖÂÕ¥Z@ÂS8<…MvOSXF&5¤Ú§n [^X4rAíÑ¡S¿ K`e}÷ó3¢œlàaù%É·oæ.ÐÛmþDZd/°lËbÞˆÑYýÙH9hø:ŸìŸ$Ü­’l÷ Ñ^¦ÔÈC6X´ —œ3Ã̓Ó’^Úîµ'ÙSAi'ájÕ’Ë{M|6{òè•ÆY@VÉ\ÊuNÐ6“f ©`‰­ñ©3¨)Ý’ŽBZc^ŠþIÑÉ–‡ o1üÊ&7ïŸ%ªjv¨b7“äŽÙ¬dŸ yÚ¾‘Þ AåÊAÁ`“IüaeLÁŒ&>WZ=“¥ì•‘]ªíÌD]÷ÇVAF²’ÍNšQiLš|’ó‡FêdTLÚNc^«T\aJcúê~ßÑØðˈÐ&&ÍwV¤?ˆE핊f99`jm Ô!䯨‡(fúŽuÇ¡ºË¡†Y´(Õnéc5Ždj±—»ž«Ojè`(Å'ªÚ—£s²_ ÍÊv¹‹å’þÈ@l]v%L•Ò6•±D5‡ÁšsQª¡Íj®³%X}ÈTÁoÔåÀ ÕÓ; 3µêÊm訄N…|“ªfœLI*¡œÕÉg$ŽÚQ™Uö£¸J&kBs©†Åì„%à,"ÕÇṯ÷üËÒÿøÐÑÔ(‘ŽFk(¾`ð“æ=´D(d„×O¢7ïsÛÅ"aªJŒh2(ÉÄ´­&ç’ÅÂ3éʨlÂТNr¾ÏqZ ÒFí÷Ýb-ƒÅÚlPi:›’…~l´UÈžTúÔ=[ˆÙ V$îÓa ´k ‹bØ åqpù:¹ß[#~Œk¹j– С¼ÄÜ*c820Ø'dn¨PÀ;7ˆ‚mÞ AåA+` `d²@“WæBÄÀ¾ô˜§ ¹“¹“BªíL’ 5Éê*úßiД)úƒ&Ébšƒ9k± ò¢—UBP,‘ ´P,9êè¥CåjÁ:Kبú;ªa}†ç†Ç¿ii:ëçúû»uµ÷‚¤™q"ƒ&C?rœDßÄÿ¦‚dÂüV&¬ÑþD¼J»\ÙB,+s±pôÍöÒÍêxÝ{úDR+O>ŪJ›‹Ãîxƒ°Žr½¹èœ‹)HHÀá%þ+VäurI\‰GŠ=Äâ³yìÆ/ÃP¶T…Ó£´‚.vq$_ôÔà‡Ü2‚YY”'ºÇ.ä@,fжît§´ÉäB»qè7jçÝ F‹d+BŸŸÆê4¢C®T ¯GoôD­Ïª²¨ß›F±¼I—Â{04¡—¾c#ÉÛ%)ýBÅ×:Y~´´`Žî)dœà)ÊfްÊÜæ(ªÉ±!œÿHì6Ï8‡~©ÌeYѸ\}±Å|!±±8qÖA¶mPæðó‚)‚‘äüô³Ô£.x¤Ð ¿¾™§y]NšÊdCc»ÿjº)8G.-Dïdgk¨‰pÄJ»ÐÍ®2³Ð[OK.dÍ3¾Žïüâ9¨oà`¦Ì9ï¤F.ÜûÿQª±þN²¦'e¬£BšVèóòß•8/fˆ «œ¿ªW.ÜÛ°º_¦WBî{.sW&Ë>ý¡x$$_O¥—\¥jy®Ÿ¥ýÓÉ«ÇÎU º”È?û =°^jj‹®?I·ÉI¼Å)W4„¹8$“'oÜòB/´W\Ì›ŸgÐ.´ôìç[}¯ÏLˆÞÐóÆP5«<ÖIö1sGHH,¯àBÙw~1_PilŸëbèÍ) é^‹Š =÷2Ñ7š”Á_Å„1 Ð}¼-Û±„Ѿu4_ßføe¡Š¡ÖôcWÑÛÈZ溽%²j\4.¬ç\:2d˜—súÌchã¶Ý’”³ö1ÚÀ à 0ýÒ«“7ã½@Ä*oÛ‚ìÃðXh@Mvfûyvjõaƒij oX­1=¾]9dÈ誙ûÖÒCà\­IÐr؈^¢Øs>N›j&jTžì[¢Z¯ïÜèÍ©ŸÜ2ÿRÓ÷|ûYiëE|î Y,ù/IV+Ê´fv)òf]@+GSÄû^ÕS`Lº€Iz-¢ä!ó† &®¢¾îç§íèÚofÚ5ïP—Ç“·´YK–œ…ˆ‰s×üÒVÓî>_Îç;Ýã€ÈöZìL¸5Õ-K~ýó{ 2§Ò*ƒ6àXW†¸Ûò:Ú§f¶ ô|ݰ<Ê]ëœwlU¥)£©®Èž#s³¸½¨¬þØtü’#´ÞV´<¨}HûF<ú!À˜Ÿ@‰§`1 pzò”ßâKÒpI7øµqoþ3¹óTnC· ·*ð†ZUñ• ”ta—]¹xÊ‹Ü[ÚïYñˆ˜¦M^ ‹YWÀñMª{m›¸<[½8IËmê8`‡ò¿øåŽlT2>J¨‹vªZåh*é½?Ó<îì+Öꌰi@X '>û’ξ>;Ën§k~†¸%BØû†+äVQ9{–QhüU3ÑÚsF¹³…º™~ya7h®Ušqô!ñÏö ^GÅ-þFü 9hæµ1€|ÕöüŽl²‹A ~‹üᲿÁÌ ™Ðm^^E!*eN´”¹©æA‚ëÖyYo+ãÑŸÀ¸¡œ— Ja7G  z„pÙ " "ã—é–u?•ÿ©m0åeÔ›;¯¦†O*:QO?¤üi·Dnm–! —ç>ÖÝç:.ó÷º X$šÉ¤Rï\X˜^ð °°¹.*BÕ7„L^†±ˆê/BDҦˉÙå!qpç¦ÓÆá'øL†ë{²Ÿîœ1 ó}²˜"ð® $ÅLI>²˜ ÕOWêÏËmïWk0=L¼ƒ{Ÿ[Éñô_À¬8šè@S°k€8îûɘ>@„ríj‹Î½ã 4 ¨ŸÓs'ûL\ƒ¶ì?£wHª1wÐD~çüUÅí–˜ÓiÕå>?÷Wm»:ôØN™ƒ[Ò|˜ótˆwǨ¤è§þ<2‰IŸÀupXá„’0=hFÂuËÝ™?.낪ou§ÈÁŸNGöT›¾Ôƒv5ÙíN6å½lklÖÐ J2Þ¢ó2Óxaúûé-ìWó.NNæA¡M5pø¸,ùþwtòSz€kXy:_Ò½¿õZgz¥O{šêoe÷Émà:.kO-GRpr¾#Y›Ñ ®zû@úÏ~LlÆTD³Ñ¥HwX7o:[2ÆzÚÅFÚKªµ^Ž[D:qæ‚3R>aDô&ˆÀJ×ä:j&Í® Ý øö@À{Í\t8Dð5TH«?€@ Ð}5”U)å;Ña{^÷L§{KËOŸµ5@’§ñ²ºE…lm¿ä¨Î¬…3ð9B»³Ë†ÐªU/Öt»SÓ{TBA)Ï«r"Ü à°Í(g¥©nÏ­]W;iÓê—ºÆÈ9­é{ œÈzÝY˜v?ëòŒ+·0Áflö·eÙÙæÕÙâsÉpjœ ö…*Jæþà.F_Ѧ¸Kju˜îd<Ã?·ô~úAìŸr}žì¬ë´‚Э†,!Ì3nC^f%W¤?½’ÿL,q.ed öm ÞN$žd¨úN:x!>pâžêëcbA&?j`ö¾xRœPBñâ‡Iš¦à ¸zr«„G92ÝÛš[Tç„’Nþ¡\²Ê‹ðµ nÑ!oAü÷o2îLÓ=Ö±ÐÉÚÜÚ$PÚï§è.S ØD‰~^„D¦ BAi¾‰dŸoÛ–HF¾£é†o]ôÙ»àXä½'-ˆjyi‚ùD§øO.¡®VŒ5:-Ü;ݺڿd†`c9K«r<Û1²èp½g}L6ÒißÕ!cùº— öç:‚ÊïÈÜä}®_P«4Ñ—ÂMRÖoJIÙ…#AG',Ñnþæ-§¹3®‡‰¹Ù¼ë!è'ªi  bÂoÞË|+`ñ[('Lœƒ“V#¹¼Š`Ø…ÌjÅ!‡=Øœ|Pí Í°IMCæzs½¦C8|纋ĮU›h¥G£øYq’ÊO#?W§šs=¢NíwoÉ ÍòÅF_ ºßô}j–Z¤Z‹9Ê[h±%•L °{ƈÞ÷»„GYîOF8µ¡,&±Øñ”ïU[f5ÿáÎ(oD9~‹/ž) +ø‰ˆŸÀŸl>¸Ñk'éÈ@oF÷ÉzI»µ¾ÎuxsýF2+ :‰ä²àµ)±õ›ft±Àð‹}æ—NSMß0_0%sÓ5@øg¼P=&sj±FñrÛ%7çÜŽÍlcûž a/)»ú=ªžÄ.‚€Ãt]ˆ|ƒ0œwƒ\¯·¨xiÇ ¹2»JõvŸaŽ€;:?“Œv¿û871ÄÑY¯Ò¡‹9ñ|±EÀ¸ÕðíÍRå‹ÀƒTà,)nòÝóúá@ZÍÝ€Bpaƒ®^7¼‡„êZOÓô+MýæÖÔdnðµ µ%F m»y Ìï1ó7ƒ~cÜ Õ½ïWy}™æÑ×"xwò”ü¡ŒT‹TV_¡ý¥@­ñl C4×SPèc¨D(DˆLýN^c ï"[Dz©Ã£Š°o¤ãtú›µyEPBž¾&kn*‡ŒÐ}Ÿá?¯ƒãY_$åè3ú…ôúé½/Û Ÿ¢û+Ý[ç}Ý\(Џì0v¨Ÿ¾ªñ§{:¬¯o„‰c»ðI–Æ[A°½ÑïrÀ4±ç¨9¾mTtOG‹Ég…ŽXÝ<‘åó¯ òSæ<,q 8:€üüâ>#g ­GuYPç6ÑŽ¡æuðƒÌ‰3 ;Ia&°8Ζ tqq¶“d‰‹È;ÕC½áA˜mµ§Î^8g€34ýjmýxò:ǘ)f¯pRØm(V×£¹.&9/ÄP§ftˆwÀ5Ãjr“þtvä,Ó¢-iÇY̨çAv™ÓÁ}Ê@’0ú¬nº+:TÍ‚ÆM³ØÐ"Ü›¸ Œûî#¼ ÉäŸhbr]ÛTìv±Ü”M]íøfÇ:â›TÌí¢½'¼© `nÛ AlË›ÀœŽL$BW<¸(ÍÝ}Áw¢ ÏMóhè0W_ÙvI1è^é<‘ß‘î6‹g8?Œ?vp[Iî6v—=•So¦Ön7úYuªVâøL„NçTœN)Ï­ÁöSý’– .§hßš•”íßÑ._ž\cÆ-™7´çÅs­k™Êm( é' Þfg*Ø¥k´q ãz÷ßwºïñ]a®¿0ôÈWÑÉúùžs×zbªSMK¯çOî;ÿ«rR‡ _­Ásï½)Ÿœç¦’ßÃì"¢cé3qþ¥Äœ„³ <¬Ó–Ð@p‚˜iö'÷tºs¹F–´…Š4´(“:tÃy/yÈÓ¯tÃÃ\¢_³µèé5úlà”]XÙ·˜‹³×òK‘çÕ ”F!âÁ‘^õ!¼7¾Hb§.À>¿ß/q¯FK2—-ÂQž$DÀ±…õ çZL _/Æâr•žA"Ðc(ý„»²Í>ˆ‰Ø«„™E]‰Wr'±ÓF*Y<1 íW‚ŒœÍ~Å!2X?ý…XGÛ3zr²³ÑþÖ`”n˜ä%ŒIªžs^ë°‹ßÔ*Pâ±åßhœê™_£†ú3ôsÊ )®œF7Aâ´òo¬_ˆ“}cõr‚ ˰ù?#kéÇ<˜kv§¸­üþÛ½lvmf·Ý–A)|1w û]¥¨°çµ¡XZáM"8ƒ®yžZ Éyiî,Faud0úû6>¾Ÿçp[zÎc]ÓNS©× ÞãÇseÎ/\Q#jmŽkU'S£æ!’ƒ&__AqÆ%ÑS¸ŽTºÍbïÑdD÷+Öcm fexÆT¾9ˆy‡':˜ÁX)_4PöŒÙÏwk­“G¼ó×=5šÞâPôõ ±¾ZF}*Ò<'|}ƨóÅ;Éœo è²V­o݉'ÿîë™YŦN#}9·CQ†F=Æy…p}ŸWkJ¦¼¼Õ79 ܩコxƒ‡ô§j=¿a=ÕHQ)½TúõWßì]ÆÓ“¨´a–…)}Ð <Ôm]a,håÛ]ûú¼ ?Þ¥Í&øÜR`åÿ¿.dÍè1ÜSN=àä™~Î{tì¢B[vvÝ Ž¢¶¹Ø‡t KÔè\î;Å$¡€>$7™·†ÆÀ~£aL.̵*±AtίíðÏ/õ«ßŒ3¯ÔÎ| 4F+Žæ–hOïzûn‰CÀ;h·HeÇôÏ>ÀSüàŠùqµÜ#F‰ ÿ:É=÷åd¤ÞWù²¡q,9â¢wŠ1 ‚ý8°7#¾ëûÑ“¡ÊR‡ÁÊ•l‘ýÙ+bT†­£òïËCzæÙâá°k‡MtîÜI*qôðuç¦ïêÔú“ùö;øáÀÃÄ„©M†ßù…i·³bÜ~_;4$ûxìBÛ]æ:[3°õÂKókÓ¨Àcd˸7–ñî`Vv.§"ΫpûZáß—ÊõìÿÓÒàÚ‹Ab-ªÈÊTA‘pÀU*’’É[2OT²æ? žó¢f²3³-%?^YîçuÎ’3!OöûºÄ.9í¼œ]y €&€­æ™l9 L¹¥ƒ3ešI†š…ÉX¶@&$ÓˆNx¢A”lÚ’ÒIJÞͼµP$CC@#oeg‘ x՜ڂðoÙ$ " Ù°!"{5– ð·åÞ®¶ßÖï¿èøÀ âˆ:¼žÿžîüº¡÷üÞ×'½:¤½{m#HïÖñÁN{j)·á€œrõl€G‹8eÙTvåÝR8øÑ(ˆ†Ñ?P¢~4€Ð4C+B¥OšÚzîÉÛ³ÏðˆDÀª }ß{÷þ÷»÷sΛy¼¹×ÍcwnyspVrs¬‚&Êb‚Ä/«…K̘"€DE(nD™Y*d/(r”ñ € 4à«0ØCãÓw;lì9n ìü>MS€cÈ{4ÈÇcF›‚œ2ÿ‰Ÿ9Ãî{.^–XƒaÃÉ1yÜ8QTè㾟ii}قó2¡+y"B…žŠÙÈ %8Bô˜œÀJX ¢Ò%¤ˆáÌxÉydŠª<DL=ãgä&]¸CxСÖj‘Z:pƒíœg‰¢Ç&¾´ÊH&0´‚3 ¦gFf‹˜¦|•ÀáÓµ2KµMü —¾ˆ†fyi•g—ÊDÂæ;),ŠÅ,çúÇ£Œ?-«Œ’ò‰r3é'~Þ€’|tBçB–}ÕˆaÂ7ëå,¬.£ôS9¤!ÌÄ¡¬ÎU9ŸV-Dï¨'–??îqbb.˜ï@É Ë–!LGÑ_þoð>NIéNj 0”/Ø{úó +74Mguê8ÕÉwß3g4‡ÀX03ÓÓ3±põ/­ó&6lËn'RXj쳨X%;S¨!ˆè¨º¬¥â§ü•“‡†Jkª¦tûˆœlSi6×ãÑh®é{ (¬êõã€ýö¶×ƒ¬hbaØë¹WœæÀ=î„Ê“™ήnWrYí¸q¥ €45Zíì;bÅ"€P¤ØÀÏh>ßlE­ÊAûÖ.Ö&ÐTf¨O‰ SÆÉ›ÖëþõLT¡ÑÚÉœ 0aÌ´Ç`î E-k ÷U›ÒÜùqÿû›ŠªaÓàŒ£T X푪2ò©éèU P¥D‘+u¾Cÿ,:ž% ‚D´7á²aqÃ!ÅÄåŬ²"yiK\ñ‰mú^“}C#‹”FÊcc+Î1ÓãdL©5žÿ6­bBDÄNƘ*j7"À$w™ïçÅéO)€ø’níýë|þgw«ìªhÑÃìÅEUduIǃõH‚Ç!‘Šá[=%{m1èÏÃMÃ50ûnåÉÔ>6dšUç}–ž…Ì_¸>*4ôÊJÇŸeÁç„%ÉÎþB7ZO.-§¡ 6ñ¾ÐEå2ûH'– îjŒFÈ=æœÇõ%--GNó} §Ç’´xG\n«L(ŠÇTp2‚LÂ’_“ùF 3 p ª€·[ýLžÉ‘Mq6By?qSQN¦GÉ ¼!ù@ L&àþ@t~"&7Põð‰”-²Pžª0p›\ƒX¡nþäçšs¥Ÿ±žs'â9JºVÃ";¦gHNV‰ÉG&שJ’¿ˆ§ÄÏi‰$‚{;ýíd “X†0ÒrÞÃAgê '´¹ ÔöHâîÛ`LvÐÌ~Pßh•ÁŠÏ!IÒ38O>©…EG$É® ¿œ)ä¤óBÉó‡1¡Wn%1–¶Pàÿ ¢©°G"ª[âNÒÆµ~¤ z¼Õc‘Ò¥'Q´xÈ]Œù¶­Ð©·Ck4ÅçÒ@„V(7ìÔ~ŒäУÇ`Òªà€&OU[佉/Ãá´ÓLg4™É½ý>\ÜÕuP/Å¡Œ5ñº»îI‰ð¥ÜLU3çN…žË0h? mî„í6$LA~ëè?em4Ó2ø/r<1Bæ'´6ŸSû•ÎS¼UÎÓ¼Û°Ž<\]û¿Dƒ_[2%Â\€½dùÛsi¹;¡±E¬£Ÿ™3ß!H÷Sí¼4£†C3ÁeY* m`;½{¿«ëÙP‡h@Çt½!Õ(ƒÍö};4¹©Ô»A×xZÊ…¨ç@7LȘ <ïý£lÁ½ùSÞÄõÐq 8™ùÆØgÇh€´iž`B£§g6“gŽhËN” ’?°3¡”‰œ‘{"–dK€ÇºÉ©N$˜¨¸wO¨˜ýl÷×§Íö»“*ÛÝÉñë71øÁáx_³œ­£‰ ó#.¤L¢àNÁuÍ\ò 8ÅQ¤-Î| I“žr*ÊÛÝ^ÈqèŽ'í;â´:Ѓâþpf*21Óž øŠàO}Ïþt±?…¬€Ïi2×!náú 옓Š6Ö?é·`°¤ã:ˆãà KŠ–¸þiœ~‰‡F)äX¢`ƒð¿…±Ay‡ØÁ¢k–y·¨ºÿüò$¯N ¢Ör{[§Ý„¢–Ç‚¬¢ËˆPîRz;ƒj¼r4ÐZõÃ-è“Þ;§Šz”Çê\‘+óæÄ7EÏ/áY µ>ªÏ­™A¾ÎЕÖ\Ù塪ž«#yïkÛN¦ÊÎÌïK6@€RÝ^QEN¨pÈ5æU ªÇãXƒ„ŽäŠ}˜²7º¾ò¼ÓT’æ¹ÀVÓJÞ9²åæ©Ï/• ðëi‘–¡'ãú侑2Wd©|£¿˜ë;eDã!¬|H¬$zW/Š‹¬PgQß×ÿ´ŸFÄ{Ä.øñÔ8ÄÇÂíÍ'öŠ'?+õ5¬ü Â\ô“$_F×,Ôê“á¼SËOúüQ¯u»mÀ¼ U€(k˜Ï+ñô˜üÕ˜PѰ”bžs!÷*Û‡-m\ÝVÁ AâhŒiìužŠ.eËB @B–ÂÒéjýÈÕDt‘Ý4WdLn41R I·K¦n.C¹¿I~]úO®ƒr`ãë(CApÓU—¾EÞ/¡aJÇ“¤$åEówQ1­¶DAFT]ËëIóÝwg03®´o¯¾¹´ŸÇÇ °„ÂÛOáøÛbJ±«¸~]Fúçiê23Wþ·ÀWuÚ¾T³q2ã(žWÍÚ‹—¿±gŽ·)Ì zq3¸Kf˜SÑDûé‘#ÌŽøÒ·í°¤pˆæ“áØç7Xuûà-A§-­”‡é?(®?Ï'SÊÜ,mKS%aDdüB[´=ÿ±!ó[Ÿ˜†ZYkø±Õô˜Ý­Jpdn«¶1±^º¹ô²å1ï,ƒÓ=·a”û€v"ŠÍޝë]á}`ÑÏL9¡–(2×'4Ï(hбU½/fý ‘jAÉèº7“áA*ÿµÊb§e­¼ÏK¥Ò6_Òaø› ¹ÏT8˜xiw·6…wâóÂ`Í;z6Uµ!4]„ .óç›~È|Šß)&˜`fI|¾ÃfmV+4 á f{éq¦¨ e%—0úšíË+ZnµY³$áêƒ *•U‚ ø¼M— Hým®ZfgY.î‘cÊ-—Á›m)µ¬Â.‰TUd§YšS¥_Ë*?7! ZtC0Éû„£nÅMÒ ÄÝ,‚0tf†ãº08ž²’²G…¾Ð—Rx«”RÆîûèZ´j·Ë÷^÷X”¿öo¬Œ,{ͪMQ”…öNF._vÙV«¬°·ýܲr©Öš[¦Þ{_ÞÒq¡s¨®‹ê´rT°÷eÖŸ7ÛNfTdŠ!m˜®àR»)áš÷Œ—É'. d›X­9o×—ûÀÿÆ÷Ù÷Ó¼f?¥ðF»¶èA­XÄGù롚Ê: Û瘿/nhþBMÇuªÉTwN1´6;Îe{{Oìo‘§}jµ“ž=í  ÃÿÜ÷¬ I­{3ÐEá-v­I¤ÝŸ7¼|Œl cMv8@”ð–³Xªñ2¾n=®¼‹pÆkì¬1¥4ŠOª[kÈbÙ©µßúPúýR„nìiºåްÝ#ˆ{>ç)Y“pþIËA‘$ÂÀ!–ŽpÐvzìóêlæÛ½Ý¬B)ø[›À£™ÐQD8s}Ù—íè'ÊÑ* z¸ð4D…ÝkÇ»N{þÏa9J:ŠEÑëg“ì _šOÄ%/‚}£•~kŠ|h XUüm glíátÚ´ö)Zi„ ãÒmJÍz`´ÑS£Ý ÓÉ =«JH8'ùÒ ¼ÿž@èé¼2“A;’!ë«Û”™ 6-h Eô/YÓâ×03møÁßÙh¡P˜ðü´‘[‡=id Ešs‘ï;¼â§<%ÒLeå³Aਂp[lŸUv¿¦z`úáY=šªŠbÅK麖3˜qxÇpóKU»“S´©m×—Y  À‘mñuBº:Jgëcǧ<8oáÓü©y6µ—n£ iïQئKÚÒ’ÖÃBNç —.­ƒCͽÌQàºý|dÌÛäAW%Ù6RbÅn2ðºL-ÈÆ£G:{ù_3ÈÀ0½@ÚÕ-¼RWž”’ÕJaAjEÑ!Ý)¨û;”b§õs+«éqúiÛ“ ‚»ø(†Â2ó«`0NºA‚£ÛaËê ëÁfÿ½XòÄÔõq¶÷žEÍ Y˜ ñ]ûÃ%WòM#ÚÒ™³÷a`?«MA83ÅØnštÀHzRw*¬“+l^{¿'¯K¡@• ú™érNå´°’%:)ý,ç™Këg6’š©©H3ƒÕC¥@tô#±²‰6v3iXÆ…e#À ò™œp¯Gò8N‘m”•ò¹ê°8£tâP¸—k`B0 g²Àóù‰ÇÐC³—±2}Ë«²zê™YN‚î2Ì„›Æ/SôßsDq¥ŠV-G½¦¬Œ÷ŸJV’¶ª§Ü´ZÃxùаF`¹ãà|€mR áüœ‹´X"ÕîHÔ|ˆ½§PLä„ ¨gdá·ZqD÷9s ÔE¼d|éày-40ÈZMal9¥¢:ª}#·Y$rlUÖýÖ´ºõÆl<#ƒþÓ)'W7~vŸ¨1²¢&ÀÙÖòà­ÉGM/ãøBà iqê—Ïë÷NÈ?+¢¤^ðGN%mz—Ùõ‡rúvÅË5P¤ã4´§Ü±D úïåDÐnµ“ýÁX åÏ׬‹9ë òé7®áŸtñ_-e%  ?ð>‡•üúxÃÚÀôÀŸµ¶Y2w«—Èi¾èŠhjƒ@Ì-Ï4ÍîɈ{å_Mìȼz‰Y¾05w®t–mJ“’fîšHÄí‡Õ„{•Záh»`[«Šô)C°ëÝ{wé1í^î{¶‚•¶m=È¢Û÷é'%æ› !î[=¢Mceˆ8¸´”)öÁþÓWi«r{C 8 kG²ù–¢¾;Tì¼+¸t#¨²|Ÿ4½B_™À[ Êkùô-VÒµÏÛoY’;¥jìnØ ÛÆúq$C›»‡»€·Rl5g\^ WË~,6p ùoÎÊþ?ù(öÖc–|P©ßÎÛ‡ 9؃À*\óø´•å *¶¡þI-{¿vðÖ…dÎ\LóÜ|àÑkÔ&¡exd…O ²Ç»ó厌·h_%žDøÏõ‡hüC±ʃ¨|5ÂfËEÇ›"Àô3¾‹˜|ýwÑêM‰ArN)¾;àu@ÿï‘ÙÔ¯(w¾Ê!¯×ƒ»MxfkW`&÷©”§üáê¥pÞݦçl;3·W)çXl½ó¡„¾˜zçŒtVÞ %mmTó4`‘ayçž ZJ†î}†uÞ&7Âåö`! :´*0N7êŽ.âG¸ÿ¹dÜ9ÂÉZ7z7â‹ôVÙ«ÔY7dÞªçY`¬¶8#áþ_ì¯Èà;‹uÍ yÃ;ªqVTc)`J ÿPÞ+|H8«?V‹£¬,"=Ôîgì@/í6Ü‚áLt›Ž»ÉÞ2õ±%3—PfDl˜sºoF¡Ô›ÊŒ•™‰›÷íWJöi?×.å·¸kÍ:jeûô^€o{&¤O9òEvê³ ‘öõôAM¬ôÊ4{ïÐKl^^è+­ Õ¾oƒÕöÇYt¤Y3Ê«¹ž#c¬6¶žÈ›Y¬=Ò#Ü+ý^ÌË79–uâZpŒ%Ùòê”±Ñâïå rŠ„TDÆØ0…Úþ¾ËCÒAÚ ïN‡YÆ›ú}yelÔc*´Ù…]y=äKoIn(~ÿ·/7{oañ4ïFp’|¡­òHöŒ¥Óç©6ócGl</}¢´¹>®cMJÜÿ.*>žç´ÄŠæ’YæX¢­EFòX²(]ô´ï/Uyå€ÿÐq_Ö ´&ómAezœD$:œ$e;ÊÊ‚Ár­¿\ü±‘>§ ޳ÌtÏg×POe“sÒ4À\ö# ro |ˆßê™´)õÃI¦etòŠ›=L*qn/õõ%¦C‡ÍÜWîë'¼vKAÎç|2 HįþÑoˆùm%ü†”ˆ“Èåà=g]kGÌ+Ô3ɸ„ÀHXCQ…` q;ˆ±¼Ê´d_[ë‡/õÉȵXîD×ðÛå-^5“›m§qrJµ±¬[Ëtåx‹¡ê’Ãl:R³™æ6XÿQ$Nnè? ÷ìî!Ë\› ÌY$8¼/룣©zôk­$KÅyK¥ìy¿ @¾l|M5µ5ù~Á€ú4án¬ê¹Ôr⛊é޳Œý{„;ÏâüëeÕÍgßëV¯Ö[rCÖñ;-z*Ô“&.9ûý;m}”Úð~pº.‹‡AݨV7¤5 [_›` Ùçf=³Ìè¢Àßö¶·{Ñרé½ÿ‰Ož|Ö¶‘9´U_(P0º.ÆÏPARr Ñâûæ°ZEj§ 6¹›~¨ü5ýþú6Ð*þVMJ&ü-¥ )óIBƒ1 ié‰Î Þ¨ÛX…?Ké²õ%ÊîXE_H{°Èk®yî]eÃù³qÛÉoC á²{Ý{i¦ØÞ™m\'ŠAË1òwÛ¸œƒÇãÒêDiQ¦`èž§Å>™ß˜(ö+†çŒD¤0×â (C@È‹,\#Úà2þ'#‹¶º³0Û¤ÿ¡9Çq,MŽ(½s²CNF*9ѬbÇE ·•€’\]æ¢'JÑc"\-´oÄàŸ¹#}cyé{Å‚×ýú €&rÇHèùë:ü'‚Nl 3D¶¶ ™Xe¿«²áò•‚i½d^±L¹¢Úÿnt¥åDzµ«LÊÞÇÑîz °ÿO,g¯«½ Rqêïa6zúW H¶bªûMìèÖO¬ G""ÿ¸ý-î€'>sZEz<Þ-ëœ-¯Õñ;ËEíc¨Äwœì¬;ÂâË—ÃAi›ð·ú̱[Ð×>B¾H(-ç‡þedÐÓPyc|Á3ÓÀeP›ä:æùÕ•´R9×Þë¤×Ìùö˜#m»ñ*ðb¡»1]/ô;ä@_öãu6îc€|¨ ÊpÍ]®µÕ?O„JY Ý•fTàláL´F?¢.Öµ´€)¼v»#yWØävƒÐ*>åÇŠM> üYż”õ7;;8Ü[‡³#9)ßúØ'äD 9 ýC”4ÄbúFêd nvð;7¾¥]¡áëöfTFˆêÖ—ðxíÁdž–W Ð°`' oìµeˆ½rò& ‹[È $œúÕD®,ï²WŠ•¨mwj!|TáøBÇÊ„QÑ´ R˺1nĶÈCTþ7>†KÙ‡ÈFÊ–{+â>1á7¾ÓZï-w‚÷•°|.)O]+äRœn:4CZ2ýä·¿—‚ß$Aª$´N¸¸¬#G&Í«-€X·ºI³+÷M%W»woà슠&VtÞhÙU½òó¦~WsŸ±Ìó”àv–Jw0ùÒΓ)+5Fd¸ÍpvÜòN p&ðJ¬Âdä<5…Ü áÍ7» < ìæ÷ü,›ñpº†p¾¤L¾r‡Ê€µ wÑ æiŸÀøÖ\c¼¾A:¹/ŒN‘¼õwœ€VÕì·ÓFfò³·àȨ>Mù¢Vá@»+Ø`ƒs¥íª®†^òfÇ€/Šð·U,#lO ò )Ä£ÀGý Ì]9ðàj'©úüM › ¾B˜@?c8"t4ñ»\èâ'¶%ÜH' L²:êàWµ—Ì›ï•`äЕÈ8ºõ.È?6OAJkeÐp³ ´R´p ÛEšÛþàµñ£#¸—佉¥µˆ§²*xi´Õ‘ ›î¹°nZ¥Ôßþ8_omƒn2Y0;#“è"W «ðn°:*–£,?UR{)Ú2l&u7¯.Ð#ºO`Ó’d°mL3“›ž-&é‰Å„ÑÂ&|o Sí822;mç9{ŠþÕNéÊÛVV“phœI#»Ã^ür»QgÃ¥Øì‹ÝÈuÈs„’FÄQ½Ì4(ë™%„·öÁ ±‰[¡×áÓwFRö+Ôxï™–i™Tˆ î·†µbY_V IGÔ¶mª¦"A#'Ö¤f{ëœÙêÔ­) €òBG¼çTÒý–·qAmáÍò4œ#uU^5Ý hʤŸ%o˜–DU†€âìΔØš3ÕŽy–ö­>[Ÿȼ0c ëVz7ôÍ™IѶ:ðé™Ûµgn»QXÖ·` Q ¿lýërTð¨™â>¡òGBPw·¿ë^',ºn[÷’}ÞáèåBä<óf­tRåà{gŒÇ›üðb¼è&Y ¬([˜M"‡½”ÕòQžº[V$àð3å¹"œñ ¤]Ïý•"P)£ ÌÃàžµˆIe÷Dié˜cé"’Ê€­5øð$2`kìGسmkóXTwU‡U5¿Õ},¤„$‘…ië‰ü¦<}ÆÛÙ{tj)»?˜žB`¿oHqÏgk¿|$¼Üî½ê•y-L¹\]jiJ™}ÐõbÒíÉ<È2íÞN¨—¢>Ziò‡YýB55è#$õa±JtG16)®Ù‡‰#*ßm6)a¶œ@0 ªÚÖµzUÔ)pëý°õMo¡~8t¡Ö#´‹ÔOçrëÏÌŽY÷¨Ë0ɤëuúv¾ý9_¾)úŽr`£ÿMOÆÖÓ)[þߢ2øv[6Žm™<×{E°·­K#£ž‘—á9vÌcè¾fËHŠ ‘'ácu;ɳαƒCÔU®ïÏIÎ "ý/ì']SÝSyÚ/k\Wä@ .ðwfr" g¶ƒVÀt éú;±dÈœ©ï(¸@£[÷_Ì…0õµ²ýŒHÏÀøàé?[›ê3i\y97 ¨".NÕõª¨ã™ÌT§_Oå;"­ŒGJÒeiR—ò ™F:h\´2’Ç„S^Döx“óĈfÒ ¿ÒÑã»üN Ù`§#VNÈEe±¶-OpèlÌðǧ u|ô¸po³ñã†xÎ3tò³‹Y{ÐïsÐúª0º ¸v8¥‹e^4g·E+H9ÇbDÓ=*åó³ ÈeJôfѤn…ç«,yã<²*¸„:’èq7´¾ ¦¡K)¯Ö5ŠùJm D«ê_ÈÜÞ™ÄÏÄhÎBYn31Fé"óRLÿ´õRh71Ùq/êJ<396^ÛÅ–?ò+»yÄÏÈi66|ò¶y¯mkãè+ÇÊ4æ]ã¥à£«0®æ¥q³á*T3ø–qfLÔ¥´?ÞôÎèÞ§Ò7À™æœ|µ­5eüî?F]B\ÛÕàð;é‘wï…û/O Nqeíòùœ1‰BxºgœÛ(¢u‡d)BÐÔÕÔs­Fíó!]e#ɼG­&ƈ…Rà.å=Ó䌷”JÒaÃæÉm)TjÍmØÉZ"JzlW2aÛÁÌ?Þò|,Àî-÷Ú³‘cEnD¸Ô·ãŽÚ;xÒÆ›ƒã —ç Àåo%û9ðÊ|cß³ÿñۑϪüó·#žQËÏOn‡ ü£‹€š;Ó=}Äæ­´[}t õÀ³³ã™p¼ 7KËžpRÀ‡3(—ò›°'~ÃÊÿI£S{y <õxe€ùœÇî«€ýª~¼.ù?²v3Ûú¸¦'³’eÖ4<¾-»o+âÒ±w"‰§É  cdNÂZ\G=9s“šÔRú2é׊`¢skÒd)^(î^=3=’m-HDÜ<£O™œÑ .äçÍ@ýRc­óýúÛ '5¾RË ¯šáS‡»Oy”—*‡±Ü-AlôuÎ4•@ìý'4õëè…˜dæü›­À“´ê#ãºíñ”X~Æ¿B8ü XÕ5¬)üز™=-[=ñᨭ޺⭽nã”S•–z¨*èR’iÝzª®G H§´€ì>Ä&‚8pà|n\–½°ïÁ×Mwë>>ÅÜ ÂÕd ;bt+±hÐïSA™ób®'CÅ;é>q¨„|­G¿vRbQ*þw%T2/»Q|‰KªÇy?gÝ8vÏX™›y¤ý¹ ÿG›~ÏÍÿc-V<-súºi'æÇè^<ñXÙMâJxÆî%äÆžáUÍãÃ8›ÕÒ!#´&H#¥æÓµ[xr5 ÚñÖ,I—”™ÈFñ4¤¤ô4øHwÌ{i—<ÕþðûŠ]A®)¬È’éA^ðXþ8¦x‚ëC‘©¥ŽpÚ¡-Çáj¡ fJ›*0òUæL5^çYd?‰ÔƒODyלâÊ?¼½Ý{[eÌÁT08Þ-<‰¤[ûH[ˆY®˶"É^è¶½¨‘9=oèÎUm¸6àž'©—$Õp±KÉì ùÖ]°þ^ä²Ûz¬:aa4ù¢njICÙÃüÆÜ éãÝ„ÙÁp#oï–üÁoŒ¿” ¡›4ŠùÚ&¦;–“ˆ8bÛ2QÜáƒA|Ç"ÌÕq{nS‘ Ç:S>çbF@BD`2_d¾ÖWànÖê^¨Ø’¯hÒMf »y•wÅ+lŒqñHù¯Bß¿Q䀙)088OamIöeé¿/¥¤÷Þ‘O¶¾­žz×T˜‚Ë¡T€ž Q”åî”C;61‘¦ò¢Ûý 0Å舎ôƒ þTÑ€~ôp#€¨Ò==f`wK$±­÷Ä ŠDàŠîþþóù÷ÞÞ·îîçæo{ÿnYf·mì¬Ü¹ÆÊq²œG:È´,Œdæ.-f8¢TËà„"%‘’@1ésœG€~À ˆ ‚ à7Ó7.…¢ôøŠýßÂŒý/àw/q¼xC^ó|‰ó}®âDˆOot_Æ~ÍûǬ¶qó«þ#Î÷€£¨h¸ÐÅyy¾¸ïéTƒˆí@O‹'ؘg‰œgOPð È3ÀLž  fr “m4DLšÔŒ;M™‰<œ<>…}ã{;Îå 6£\ü'÷šp]ðdOiª?i ’V¨Ù3 “ a˜|yÄœø/nÁÈ‚MÉo*¤ƒžV¤«bØÓì¾Õç“Í ¾È(ˆtÄÔÄÀ…ÀŠ“ œ íR¥ã‰Ý‹ŠÓ«¬fËÔþbRÝ<o†ÖjýÇE¢«Sàwõ’T;ßÕÞ teóP1È©eÍ@ÐÞìŒÃ§“½Ðÿ±Ñ³Ì¼;AüÔcTcªÖh6ŠÌÁ?¡6=ò$X‘WgÔ±˜0\ò)ìš"N:"†ì?ÇüLóP&Ñ7%6ƒ¢rc'¥>%}u äU /'Ñ{dÐC¡ø,¿*T|6{ vSÆV{¸SèC Ààb0a~×˜Ž’®¡¿ñyó{8˜—>]]Ý@‹D§Ê‡ SèÊYéà5ß Ï°Œ,™RaV6\Z¡@òš—†ùâª{•(¨`ççGü‚Å·qt ¸ªƒ‰qrlfÊ6Ï ðWq§—?³¹´â¹ÿ……ñ ÉØ˜êPŠ`ñEdQþ£å±¼jÔ5T”Ë™Ïh €.‹URŠC# Kc='TáÞfÏfÒ[Ù35¥,8/ÕË£â‚AÊSQ“Èl*<ƒ^I5k@™˜)9öîRC jNsŠcò= ØÏ~¬€bµ†ëðxFw¯òR'`H‹%vºP(Ê \@Q$ý{ֆ‘é£møfIÒÛê13oHÙŒ¤i*çõtJ!•$`"%(b·Ëç¡ü“3&¯üÓ“Nx}H •Q ¹  a¨9É$YÒýP¨8S)3Óh³~fëøÇÑ€oÁÑ)gº„*RúÅä•7&œ×ÞclZ†ƒÔoïÄc1ê'óÈ E”žü^2}0âžÖÚ ó¨Kž}`Ff¤O4÷^Šõ°UTiÞ6˜‡J¥r´;zKËÅŒ²›z£¦Œ~æ+‰S3“SUKûé§XXŒzG 4s{î;Ó¿0ÜPr;c4Æ?9ÙµÎWt3û Ö~ÅG½Ì,dâw 3‚ØŽC#~âD3þ`Ôpüø¨ÉYâ÷¤Ba XdÂMbo!½ÄgšÕ²”;ª·Å$¨}žèr²A"“ kÜÂ+`,5HL8°¤²Gçto´½Ç2Á5?Ŭ꿂}‰Ù(ÓR<¼¸¤×i(©ÔŽÇ‚:X¶G/`ãàu›Ò¿ïð;BÿÇv8†‘‹†Ýg4ZÿÖþøÄmîƒSïðc‘îå,>V»"aôÂþÇ"øÂ™Ó´¤Z~qÒØõ»8àÂ}ƒs@Â-P‚4V_®C5Ë´bMrué–\ƒòñ‚%Ј#ðpø—•VbÞv~Ť•^¤ñšk]²Sœ­#²G GìLðÖ3¼’\î3†v:¤œt})Hœ~J^LÝ™îÕáùVrÁq¿|+.„í¿ë BË Ÿ5ÓŽ6`E šÈK ‘š2çü1û˜/ç'ŸD;nø6Àçq¶¹ŽZü!ûv:kz€qtîS¢‹T÷ÕÕ‹K©Dê³F ÔjþÙ’¤üý;Q{*/,ˆn²üÜù¼8ÍBD°Ñ)&èé¡0Ó5S0©8d Pëê#rš¯þ¯4±ð’æ’1}Ì«MÄ¢+p½—ë˜ø)ƒnÀQd`^ßÕ.t‡º¤ƒ ê^e±v‚ÈbýÝ»B¿Òs5«Ô][U3`‹Ö±°€ÍT/Àbúšrën=G‘ÖLñ€U:\÷órÐ[ô&¼°¹GîÏ!MNÎs—Ò-CT8i,Y*_£² àz²c X.ûV³NT4´¯Ÿúó ¨ŠíÛ‹žÒFÁ?;£Ñ{^\-«`Y!Ãâ.`;§•„-x8€ÉqÞ C”Ëy¹šÈ+´‘ꑯ×°„"í£`! zØÜAú\(Ç´PDÕù`v ,ÊÌ-ÔŽÙñ[#¤%$‡¦ [±7A‡MK™ûÌe³+ åçÑ1àU=R6/~mš ð\ÑM'dì?¬³’É"Ë 1âC` Že2ê´ª‡( °–±*Ôb]ײ.2­7vTR·aJ ×{SØïYØ9ËDP1åe’Ù©‰—"à SñÒ]´ž[>â}’îêI<­vÁrŠˆÅç²U,!LTõ[ìãW²Ÿö,‰•©ba±$žÞ+³(:Ù«¾x­¢ÝŸžW^ºDKñs—‘k¼¼f¶„#—¾.d¢—¿`—°[·¼–Sé š-ÈfàvŽÀq[ìšG±äàíx£^]£E]íתç®Ü5Ì_'QE¯¢„•ítÿ/Bq“J³:4×D. …ð¦{ßví@¾¥ª!¦LQW°‚ªa$èÎhoý¹ôžKõöXÉ·G' vEiÅÀ„Ww!^e q…²ƒÅ¶‘#ý üÒ³KÐc-mÓm[¥^‹#Á;P½–;qS½vîË¥·‰HçCCÙØ-ža˜û…aøfAk1ÿ¡Ý/óz4ÕÔ›Ùý¨e¿Gä4ôÜÚãAÔóÂ{ˆ™,ñÁܰ~$8$±1Áü‚LEŬঞCÄguåùу¾f/ì úHNjMCŸÛí)ªµe…5ß kYS¶S®yˆ 2n"áÏwÙµX‰€ªk§ É;Ñü’„® Ó>&ÆæÉ‹XÌå•£’®ÇÝRŽÆna¿±‹V±raí¢ÆÃt! r·RVÌBž1{üX1H[Z«pTÑŸB-±uøˆú·ÖÇÆ×~Ñ‘„]æw"G:ì8QŠK&r¨î#ˆ'+ƒîìÄ€^c?½Åfc?y1êÆz_â<½Øs:;ˆ#¾ÅU*®øºèabOïZÏêv¸XÝ/RY fÅ·WðÛþç1ɨàÒ”âl´Ç?e#EY€$žÄ¬¥î ð°5¥ §Ž~;Ζ ÜÛSÍú߸y·Ç¸éʤ³Vƒ˜³&N|™ôêW‰g¾²<r÷ìp•0vÁ'jw®Ô‚ía*%W\)œ=ïÏd÷xì—ͯ’Åknk€ûQVþE÷Jxëð/HÓA˜’ŽÒç¥ñþZâ=$fz]ëK+ëçpyIßîG8œ"‚ ­¨R¾ç8×Þ•õÆí@‚ÖõD½ )=Ù]Rÿ M‚Ìå‘ÅùšMF¿“Šq,xÁ¶ R Ì@ÉEION&è¸&y¿û2½E†Qòæ€B%…6` ›A´6lûóNpî¨ýÁ/Ÿ}‘<ÁYæ’ä*›e~@Üq6îã.‚k{X4”¥ÿnÄb#¯ŠŒa²×„™e0¡µÈÕïæ£/¯â4Ü5Š÷ÛCï©Ãd<`ƒ)R€?°–q\F³/Ëa¶Œ÷_` ó·vt.–t\_•Æ9çÞ~~í[…@Õücìw«.ÂL ™ñŒ´êM¸‰ýÚ–ô¡RéÏÞ\´¥kø;û½¦ÜÏÄQ­£m«?*t|¢ø.¬/JvØpcéf”ƒæ‡ÝD-gxov÷ð!sL;³±Ò=Y¿Es5i[ëa|§½bNvÜ—Îàï†]CÏçm˜.®½ºsд¶ý2IsÁ‰ØÝ‘–ÜsœÍ™\sMTäÀ¶9°sÇÓ†½‹C+¬l¨–ùÚÊêhP^N5ͺVŸgژף)ãBÑô&9˜O!ÂÍC/Dh èÿlRsŒÖÂí ÙÀpØÉ¢¬±H«Õ@ßtú® žÄrº¶a‰¤pXþ71³x—zMñÐåtÉ)[²á§¼ˆ0÷×¾XÔ‘¿$ëñ5lNÚÅØ46]fˬ Ëz¨:™ u•:€Fð5Pƒöò9†˜mgÒâP ïî¸ÇÇèGS p‡³˜4éÙšr~Çytfãðð^Û}?d5w¸žÀ¡Ø;Õ¿u±÷ÖZ=Øjø &8Âôšß&f#˨—T+ÉQ7Ê‚Mõ±MQè¥í:eŒ÷PÃÏã }LµFjȺé±±KòêÁ“¶±š‰íqîLá×Á‹Þm>8§â­ã½Tÿ¶%,‰Œ¥,ÅDÆ0€½S={Oµ,E"Õ¸*»Q]&¹Xh ¯hïÕò“õJò&¹Xr N8AC³ÕkËâjR5â-üØë59ZƒŽTkɪ¤Þ+j€à‘"‚³{„Lוm"U³¦ÀÕZ™jòNÝîàRím;®°ðBL“·Ûægtss9ÿÜJW™úÁs>›¿m´º Sø"Ô4ÉFäF’e]ËP[DVŒøÜš|R"º-F° ­]:[†¡îäš&¯ARY:šsÚ.ÆÐj.D\q…Þ/å‚Lp¡ëð|5„Ýeé9I),Ýlà‰«yæË‹Ä£4ºmB7ä<é•ö¯w¡ŽðC›ù×¾:Ï܈4Û ß«lž5 fQõC3§úÖ"M"ØV¤†èžŠöÃ*͘ó°³x3FnûÒ"w¾—Ãdz=e¥í‰;æûP* Žë{ND¡8Ž‘n­)ƒ››Ð£Á!5±ñ‰,p]37Šs~™«ÔÊN›SðžÛfþ} +–?NŸ3vÉ#¥›Þ·¤©zt1Ö„JrlüvVøÄ‡\ø0hÏÏKCCÖô‰ºÏ¹U%Ú%%à’eVƉ½¬)ÔœІ÷™Ž.B0)•›ÞøI'ªb‡P¹îi¨Š¢)®‚Ÿ¦Ø0àßò ýY”÷¬~FÝ&35RS¿¾AÍ[d\u†½ÚžZqtó' é¼j·ä%;yx·†L…ÄRUB dWG®ï#5!†qÉý±Ü‘îóç+ÆçYÙ"å%®–¿Î‹åžO¸n™pš\Cfîq€Æ„=Àâ„|üoŒð5óáiâ¶…\\„i ë§}ï`–‡Óa`0 6Ì)PçâÁAˆnò¦xFu²Ò‘]ŽÆõߟòæ ÔÁz–(¿äWf§’ÏLävk$\×Ë ¿AÜ…¡Á+g¶²³Ém´TÈ”Im“¥ë|áïz:ðI2ÎRg/ë7¨Í|HÚüo=j«ieÑòSK‘F],oRg¡¼‚®<øq¢ÌÜ^w»ˆs´ÅØB w®Ð¬fÌ4<¾gº_˜ “×K¢úÙЄ ÿƒ™Œ+è<5½ê¹û »I,Ü£J OyËÿ!§9÷‚FÏÊæ ö6ÓB9Ã!‡’ÍIâÕnÏäšÝlÉtV‰l• ÿ¡Öà9'×eÕzzï0€C[hn·{éZ‚óÀÜ@ðZÜ”ÍÁ°ÍK°¨š;9æ,6ž«ý B«{á_Šxe ›@¨<üM„†Ýç9zK_­÷{Ëg«ð)vsŽûCEQJ]ìÐd­Rð—"3ö.ïˆ<. ì$7Ò5Šõ³#Rdö'©[ ‰]EÆ&ÅT‡>o õsð1@]îB/ÀéÖîÞ{»W&©Æ<]…ŒñÂ%£è¨bѬrãPçL¡AÄN”³¢¼1úŬ—p<ÚRfßÌ|±°KlI‡½b±H[ŒY:ÖN”;±ØÐ«ûió³ÀU-Ï“€lšQ\å Ä™rd3Öòk˜¹Ù>qC·ä7ÀòJµÈÅè-˜Œ/‹®h¨Û¢¥û@?¢&.ˆO_³á|r¬æm’»Ú‚§ Ò½ÆiaUÀ±Ï(®s–ºÏ.õ@44Ìú”ki5KÍ™ýG|IÞÞ%ŠX+Ñ”uã· Š¥×´¦Ÿ¤KêiµjE&¼…ޤáUAÂ)“˜šˆ·F›Úaðù¨lGuí>ÝaFÍy³¸Âý­¶”paÙú$ý¨}¼‘•Ý2ŸV7…@ò 46 ò7eHñ1T¶Áôb'MbX3ÿ+  ¤x¬KPÇbÝk`Ò Âc@Í 8y7C?¹¿b' ü¯Á÷ÿ—Ý,9¨ A^:¥«m7à2ÊÒ´ÏPû|Ó…X“еÍ7U4óŸrñÖ<ü7^å{Måž§Á¦„ k Løåì gNoº¨B<–GÓIsú¶¢³]gÉÌ Þ×.;‘Ùt»U§~ñDge&ýóhó)ž4ÝÈ[,¯’šÅ·únºáØÛ`\r’VæZòõhß$SØ`CÑe)Ø£5nûÍ¢ŽÁFR“^ùh–$äGû†9œ³"‰à: ‰_ømÒõ9ŸÍÓÛE˜™Ñ•t6Ï%½9…-Ëë Ìy;»ï@28šžUHjht³w2ƒ¯¼mМÅÙ›¿îùFìÐ?âÊŒ‰š VÎ0=`Ý2©ãÈ é¿WŒÄG¥|Ë’ƒø÷¹¬á¸Ç»‘ËæY($Æ-ðiÍ=›¶¥Jƒwg‹Ç4ä3ù•]»ÏŒi«\l¨G´šR@ølíQcõ#V²»å‡y5bí…Ò¯È*0’D°¥!¹Õ‘6ipg ØáX¬GK^˜p½ít`PM]4éè˜ã×ëòÞ Y'[(‰ÛÐèÿüo«à5à{¼„‘BÜg_\ÿ‹£»)k§ÖL¹£óá\Év»}’ü )ùÚÝû4úFW aèt³È(̽To±ßÞ°úÛëK™Ž–ØhnÈ3?ªÂ•‰ù÷i#W%¨ìÔviþÐf_v_àȹ½p ä!po£`+‹|·Û…S­EàyLˆ˜næê¬á%ÀUÀ6ªuy¶]¥áá™­‰?™äÛî'*!I"ƒe]’P@ü#&¤¥_9¤ ½eqGÜZ¹Å­æ Ø3—:× ZÔ_ô7+Ђ°æ1jÉ:"ÈtÅñEŒíÕùY4T7é)7K”w±ìÄP;Ï—¬õÐÐÌv©÷ÅO¨÷YÕNØü­“šæœªã»¿uZ€êC`““_cAhIH,ÿþb8¹8ÉvR?ZyÉñqU,Ån[H¶hÓ£o$Iªon»acX:UÆj`m¨ÅíÔwCêœgrÌB˰é,#ÈËŽà5…S¾ï¼Ô(ñ‡'«É»e2à‘¿ $e”!2bQ ªxça¡®|X\ †þ­ØüûŽ,溬`žàr¦¨*‚@Ã+¸Ì³!Ñ}Øxü•“¤jçjŸ5ÿnqr9À×µ¼ñf@[˜î¹pßBçŠ÷Êû˜ÅFØüÜŒªd×´1óð»÷H9ŒÏ\•¯$(;Ìxž8Œ‡Žm6œ[Ýñ¹ ˜¦÷áÄÌ¡ãû|s‹ˆVþq¥‡×CO¤^­cé¾åø‹£®üI¹ðü£â˜wï¿§ƒáÜ«ØÝÕÛ~èà´×C7äGü¢‰€ ƒƒâ å7ÈéÇ+–*q+~'d ®$)²F‚G=¸gCÁ“UîÕké3t1E™½B}õºØ&⊸•Dl(žÝº€×'ØãŸ…\ž{Í‘T–aú?ÔLuÞ ›Ã@¿2oÊ[܆—„+ïQ`,åniµy>!ðdžÅ_P¥Œ¯…5*àXx—Â/‹ùµíܪ@Š,L—#[n2ЪQi_²ŽÎ'­À§N ¦:× z0Ó68™È’^‹c=ÙZ—¤rJÏkÀdÎù3¾>Ù0â4dÞóásl…PªÅE”;'‹"ÝyÊ‘wiÀÈ ##Éž±ztˆêò‘“Gp³A…ÿ›t1P㇞¾g‚¢ ³.ŸXcn€;QE"–7ksºà¤ÍjC«A†Òk¨ o¶/ìV·ZB÷e yIL#‘Hý&*¯koÃ?9BI4º°ˆãú'›¤Žr„ÓÙ§HÒðºÀQZ Ó’³¡@³†!¹{®õÜ3 Ï•z 6ê6!×ó¿$c÷¸]¸ä¾‘.}¡¼â¶£ý¸ùC…_ Ü…>Â"‡"Fw|8W(Øp çN Äfµ?m­ÀÕ³4üT[Vv™n«Ž›ÄLÞ{שÅaÄA½ Íë^cŠÅ˜"Ò¸ǦgùàÜ®ùƒ*ñ-ð‹‡OK°eéþîÚ™?òxß–”š­¨Ï¦t {….¶9¢'Q³8wßsFÉm$@PŠ+Þ¸×?–åÉÐ\R“MÓ{m Z3ÊÈ¿²Ôjm}ê'$µˆe­t‰¡Í5ä䔢÷ UY WP…]¤Õêåd–'‰$!ë;7èBÙÆ¼V™d{aæÊi¢K¼‘#2Ø=1j\‡|9qe¾GL¤bΔ߯[>O¡A{_»¥p|;¦-àta;×k“ЗïAíîk臠Éþ°«eÝîqDÚ›‡'aßÇ¡1ÒÒ¬ÚÈtj‹œ] °²i¶,w M‡”•ü«HÐQ¾ë¦‘ ÎÃèö¼&X÷œh÷ìF#L…)r-¢Áâ´÷]9ìèÆ°–7%€éßg-ºç¸^g·i­¹ô1ü"ƒhý§fT4¡êˆ ßg.›YPè qÏî ñ=×%€Kh2‰»N£‰–SfsÀp(3VW0(QŸ€œdÕž"ȈTé7¤“¢f6 27ŸpO1Þt³.DF=órp2 $Ã>N_ŽU—«:5³Fÿ«pHå·Bq¹J'푦£>‹Þ”€ŠNYá\Îä§²}`’Â!/fúáÆRî2C† Muw¼W¥B”Š¢UfdkåÛ¿G®é…É3®BWKÙ‚÷ b‚ÐE5¢PƈœæèvèfC†Ñ]ZLá?RQ ’¡C¯ÄB”^ xÈÀÅ052ƒ¦4Œ•cU$Â6I€-òÆQWûËÙÂÑ«ýúÉcþ¥®%cì7¹é¦ãcï«c´– n\ÂiXìJ̺ð§”:†v‹ eøÛk¼^º*.Ú dê0ø±®óT~’ï°)F³o%N*fpÕ2 3ñ©*+ìüܤgF«ÒÓt•zÌö’2Ÿ§ eê¢òK2øJ¨…pFƒÒ)ðü¼þ0¾W-šÛ%(ºCæˆx-óÍÿª·L£‰LºÎ ¬ßd¸ÅØ#Ê“¨[µL2š‚5›íiM8EßÄÞo-zÊ{¤ŽòzÁŽ`S_XáªiÑ…ÍæˆþfÅRÿ;¡Íe˜©ƒeíø´«ö6IT¼p_b¦Í&b¯Åƒuy<ô ¸„f– K3³ßœ¢ðÝ'#…)¦Êàãæm¨že”¤h–ÞpÊE¤óôB:ÿʳ™J6–QdSbV7\òÄ1žù02Pᯑ³kË|™²¢¡,Mñ= Æ¿wRâFF¾¿²ß—dĬ! mUÚÂi_áO>Ô¸ÓÃw2Ë0c6dW ©/£Ÿc°±ÿÛ †n_¨üÿ/Ì9¢c‚à p“ê™—À·„Äåô¯"s3Vˆ 0±Ì$'j³i¿UÏA›Îy8 /ä¢#Xܺ~9±*кÝÏ8³Ö<§úš.ïD\þ¯ÜÉ'(Ö1;¯¹ØÆA]œ…ñì À8ëd¿­Õ¢«rR]Æ «#L8"Ñç(Á"毥å!ô2ïä}c~·KVÍÑSôN¬È’Îö&“Û½-ái^`JÍkƒIe3–ú1˜ÜÝ$T»„…®mÒ| »®4µõÄ7¹ÌÁX‡$³xáT‰*~2:½¾àÐoMønµ¨ãˆuú;ö¶*ò KoçZ?›AxãÖí€v§iÜ7»é*€ÛK]|EOh‡³Î7rÞÛo|‘ižB{ûƒ7N‘AÌ($Ñu^øÓ±Ç|Ú÷ ß-¢C¦*B›ÏÊ‘÷2\# èÞK·0–ß[â']gÊâÐÊ)@¡:P~aààîEnÀ ImûUÚ„Ñ% —ég-Dö¯LÀÍÅG%m¸ %¾&v¥ÓzZþôÒ`Ü}pÀG s!šWÃ8uÓ…BÜ·8•™i܋駸·o~y{m†¢Å r_î'â=Šú!VØ HþCOvv¿çNÞ#þÚ¬ªgtã3^~HI#÷Ž~N‡B*âÀ+ë5² w–ÚKß/œwá/ÙH)m÷¸€*=lFÐò‰ÊD"MØyr¿i×ï“çQs!†éU-¦cƒnš £ÖÌÖ«ŽYÜS!ËH°³w½²µ½øŸ‡|Ò øìëâ{ávѧ­pZQ'˸ë»Lj欬êÐÏGÈpÀ/Š+)â…˜¹$܈ð¢ôÀ_ª¾ãÿQC>]0[&8s"-ø›9Ó-ó&iÃÙ­ytQ.ZÀQ©¢šc*>€à¤•á‰fiêh^36@#u»Ê\ÀÜÈ û›Û–•( )¾jãȬiÛ¸eŒ»qÛ="ûiÿþŒŒÈ`‘ ‚7¯ÜøÝÜ3ëË&ð¹¹LÄð’›¶D¬ÉÜÝ’Ÿ·„ñƒht)êB¢m¹¹·}TÂUîÈ7”¡D¡XD§4/Êþ£Eè@iBÐ ¬MCf¦²»LIzf2š«ƒïww¿ï¼Û;ÍͶ˺æ´Ù›·¬›šÖMØÒµÕQˆV"ÁèlX­ÚÊ€-¨",‹lmDÌñJˆP4|úƒàt> õTô’gLDl†„ùIªŠú©21C‘(ÒÂy*F/?6ÏÍÑæùA1ž±vDXICÊâüdq¯Õ „Ód¬JSµ#‡ŽEP‘H¢ŒZ¦£hœ¡áNÌ2ZoÂö›‡G£5rr{ˆæÒ·$G…ÈUéˆܰ!zXšîI<›«pò}éÊH×’,¥ÄÓ}WC((uua¥ŠÁÚγ„„Â"”³—¢è+w£ÌÛšýÔ¬pm,‘ê¤s•Ž5S$Å2¨aVC¾C¶2u;ùWäB=pl³“‰àã0¹4[ÑkU)à傲&KQ,_OD|êzRÊâ³í¸í‹¾VûÁ ´#ŹÄdÂ3´P-­wt±‹×ºŒ •dn Ä"’2Pý%Š!E ®SppU¸´Bé@ð—ì2ë’g‡F˜~Žr*Tеh”ƒxÕø¯‚ÕaÿiÞçÆ~¡“H~}p<¯:c5ÒG,‘%9ò”ÍJ†jcÐÉŠ0+èHŸŽõ¬ëšQ©*o‘?¦ú厎ùÿ}“鎸&m³þ¾Í…[7GgÆáß°ìÜXºß¢-cŒb.ÛË%]é ûD7òb©©ðßÁ͘÷Ô"&ädܺÙHƒ™—º9ötj|+iÈ(õ׿“Üêj6δPˆVÒˆÚ½IïeÝål"tQ$­JÙ&qëæØÕŒo^,†¦ùZyµ¼ó©—.%óX s&©k=WýZ—¿3—õDÒÚÎÎïÆçÚ™ëá±q0Ø¿öß™3’ƒ-Â]–ßwUŸáeÄb#õá##Nƒ ÈXìDª¯®¹ì‹dÕ0^/w¥Q 猸–ªÓ¦2I2¡X¶ÍKåm*wÏÌúüÝP!‘­Ú«ò䣰bÞJf6&½W‡VzÎ(ReÔ÷g©ß鸶5AS!‚yŸàðì³õ ˜ÓɉÂt{øìЕ †’¦’§–ݵÔñÓCÐìÚøqEä%™ØŒ*3#á¾ õ±s$§¨Ü5]c³)„x«ï+äoˆ¥`†[÷ TéšPNž¿C¸œ³• Zz…¹ï7ªñ@…Tù»¬_»íY~_5]d’éÇq^E‘˜Ä„öó¸óD•Uó+p«vÝnóÁŽÞÛÝrŒÍT½’ªQUKe#!?éVµ_—RºM­2ë¯ »øºµmFešHÇMf«äRaº™Ý[÷‰1-fÙ¿ë±õ[*Ë2b… r̲~T>,PSüŒŸN1í*å¥iµT+ ag!"fÏˈ²Å«Ég!¡©Ÿç¤8dp $ëÛ¿´~#ûŠúXSÏg½ gRG›¬Tí,ÃÀÛŸ`âð<Éu‹ÈÕR·N¼ËŠó÷†÷†õ«ëeÈàÏìkëV‡©ö›Ec€¢ždìuLDš"üÉ2<¶wïFWŒ*Šê=)“´®à¤i²&­´ïø(êzÕb4˵arà¾ýk âÀMlÚÃ%½¶gÍèm·Â¥Þ…ÂsÄË Ê=bxŠwh{ ß³(#–Àü¡G,m E†¢e=¾šåŽZåÿ¬ `nÿÔË"²Ó8´½qVèi†êB2ÑJ9¥.pÍæ8# e¦ùûÖqŸÖ×wd &8Š“÷ª&Óe„(V„G¨!Õ%@ñË&;mm æÙX¦6uÎÛˆº3,”†žä[¢ ¨„mÜÛÉ#*.9ÆvDéao›}V°zb™!oÀL67¸¯ª¹ºttØÕrñT¼üêÎpòÜÌ“ÂÈõtøxÉ$Â2xû^Œ  @õ;‰2~ÓÁ}±FË«ð"ö­Š5I${á«5[Ö}Eò_¥_¬U4gœk4\XY^ øN3h 6˜.¸Ø2oL¿¤ØZÃ' ?ÔÆÅOH²o àc>|àÔ^/­í)9Ñ´~›:(²Ö.!B’ $^YU4³JÓy&sòÖ·E"›ök˜8 Ë#úú› ±\yY1g‹Ï•®ã\Ìž‚G¥Ê¹‹ÙÚûÕ±O„ÏÜÂ?:A“ÓBZöŽçjDV-à.ŠñubC~z¹"Ùºg~ÅJ#p´Mðò 9¡» _!Ë[¤›= «‡‚Õ¸ùŸZ¬ZN Æ‹º~g·=¹Ðl&+ze¤½ pÛéo‚ú ¨]fꣳI?ˆš»_!ÕèY%¾…4¹›+¾/ ž’ù>omÖÉT[_X2:l­]³ô¥RÄJ*ìÕ܃†ït¼7d€)î „8 â<»^¿øèåúŸjÀhOEjz臞¸fI°¶¶Ð6 ô¬ÕßþŒžÐî™g··aʼn­‰¥†°†¼ƒèOà’Ö|ÞÞEãAP˜AÞ~ÞxÂÜ´¶¢ÆŽ9úu‡&A˜ø«mqk©¾âžV¥$³8WZÃÜ„œaÔgýl‡ýuåí„ÀwÓrÁ’ÌÓZoØmq )åå‹ìz<šý!E+}Ù–Ì·±j_ö«rí(?: ?àÿí¼Ë eQñ¨ýxcâ™qqkAþy­ÖÔgŒþcu:Ë šÔÃêË´àµL¿N½p޳„õgäEÎ-ñÌSL*Q–fX_¢=Ãø ŸŒeq 5B*&Åyž0¶fß?µä$?ÓØ3¯Éúg¯NlxÀá´²$VÓ©ôV°Jáf2r(ÎöÓ§,#°ÕêÚý½Ba©•euº©`Éd}'¨uXãš7»´Pž·;p ÁÑïÏh¹BGÎlô3ñ=Ü÷ …‹àNô q2Hà¡r™Fyüe¦†â£ÏCWr¥ˆPj8“l–ÙüÏ5™ßö-0"@Ÿb?èG43ФC Â(ä*X@í<¦S1úåZV/Gæ4ÿbVG&ÌˇŠê9ó¤¬elŸÀùÀ"Hñf1RfZ ÔäÐYU“Éù:ûü8êâ,>µõ2ç/—œg©\H[²À$ÎTÝNè²À®×g +ýHO¸h׆éË‘ÈÅ‹³S^õbNô–Y6ñÍDÜÈYÓ·•¼B£áˆ<}ç{=kº=s,Ü,¼1{¼b%6Þ?)Cã¢$âsä,¥ŠÎg £™ý Ø|}G\¼Ï”®·cÓH.àq Àu˜÷qŒ”çú¤”I'o[=èÀ‘Œi·Ý *¦ø¯¨¦³:îjÃFW‹‘#ÓûP\¼Ä“£Õ†àµð›ÂµÞˆ[AGˆ'™ ¡î2Z .RÓמ¹£æ-wîá(˜xE7ÙAÂØÕ韘íûû].Ô°Äû9ýRZ¡½c“*ê÷˜45~”H뵤sù\¥Ô,|Î\g®²t%I‚ì„[ÞcW¿"ÑRN/Ô‰@ÂlvôûSW|xÃq~ÎÃyÑ¥Gß§J˜íF,!«&™2Êò¹`߬ERhäŸXRT½ÝqÔ´ØIiŠ…)¾|"¥°øñ{ðšNú†eGö÷ ¤®µ’“¯Aü´Ý)í~nBf­4jâ|›Î±ÃÀWŒÇÇ׫šÝݼa ¹‡>í¹gš:XÃW%ÄZ7M]r$#Lùù ª¶~kÌí4‘]M1èxvR8aªî–`ß tˆ ðĆiÁ1`Nõ}G4'‹ÎFÚ°!ønÞ#™¥…¯;ŠøtƒµÊ=ÇÍL†=¬`¥ÄÖ5ìe†ÝDüš†6C~é-ïêœëdh¹U ݰ‹îíáüޅ她7X?3ìýÖIDR CF·'qïß{e0Ÿ+{™ !‰F©ûŽ1é‚ņéÛÒ„_S1û5½¿¨èì«’'ʹ>–š€’syé$k€ò.í8 @`@CÂ@@€õó@šÁ`x  €:dºdh-; €4w 6‘jŒìI{w‘¾Þ£xD"Ìô,šûæ´Þ©)ºŠ™1m4óçèÿ)üåÉ/y?̬§Ôî}zì Ð,*í¿Õ|×ÃxIƒŒ™çWHUnìI­f±Á0=#òÉÆ¾0€ëª-ÓÅ‚îÑYâX=C~3Ú“ûjëBE"L[Ú4ÏyÂÜ^¿ý57·Ú_(bŠEëÁÙ‘9®–P®üpÍ¥úGs”3´ëð¶x©­«EÞWK± ѾˆÛðZÕ]z.ñQó𨭢#ç.!k bHÇæÓeÑøýÅ”æÁW†ƒ–Áô€ʨ,¼0,–ák0ƒhNàhàuÚý#!¨'#™0ÒÞ"Àt¹"ã;BÓ]…§R£J³™1é&‚ý¤òÁRÒ‚öWU«0ØEÏHEdbä¹çzÆ8ý/od¯uÑàíˆOÅ‚öÆúg%Kwu|¥šŠ4´Â9T(Û×aêàE[n7ÕqnÍ/ðŒÙqæ$èæ­çMê™ÿÂÎÖ±¸ä|ÁŸð‚×T€ß†b¦fìO¶Àéü€*ÁËüiþo³;QuÙ¶Ò‚G‘.€–mE)·úʲÛåá@:µ Zm'VÆšÜI "éÈoŒSÌÏ·æ¨4ï1à° Ò‘°‚¼$·W»šÿ^¯†Ëa“(þœ ¨OÇîr™'±1˜É>£þ±³Ÿ þþp×L „© <9:ÌÔÎÄ®ãÄ#•æye²U‡ÌÁ¦ðqÍ×±xf8¶|wvµø 㛹9+#·k’¡•éª&üEG£•†“,M© ŒöUwOºSŒ¯'®LÈ}M<5³JÒ0—üÐ-”P1|³ýb ~v‚G“…Ü_“2\‘Ú ¶ßæ`¦Cut°¿yDŒ‹7P>jNÉ[ÝQøÇ,hPήT ¿Qò¹îÅ àÒ±Å+ûuÞi.Åö){zCÅ ÃëÚ=;`ó"`3eÜ{TcTEZ¼PSâü´·ø÷÷$à÷Ni}­»œDtî Á;Ýw](O¼¼- A „23 z­B»¨À¿9ì¸ëªÍ຋ägéWïX›íô9›í4Ò5Ò隌$¸‘ ˜›{ÙLH»\0íX¼EŠ(ýn}~¯íšÏp7-ÆÇ×*ÆÚÕÆæ¶cCŠ¡ì÷VmÁ¡Ò)ë•D—_Žñ…ÍZH£XpyA‡èІ֔ZEð—VǽûŸ¢O:Ô ð|ÂJs ­ñÞÙÔk&Z rÕsÌ›iŸ!3½ñÇÖME£ñöó.¯ú2¤(c,=hUù^黥Æ%¬€¿Ótª3ƒò ÿwz êÙ\ãK"O2N òÊ—ÛßÞ:ÙóÊFB}ï¦^%éˆÕ~Î|‰t]X{Ú‚yJç¨úª™^g%& ÍÁ€RûØœŽô÷9ë%C¼Ó­Þ¼”ÆA®+\@Ç?/C≂уqÔ%Bt „@šñNb7î í“Ã÷+ËíwÜ¢ â™fÝ–Ügîm¤¤ÖfXÜë˜ÊvuÜqi"øâ°P§äøË@ómæÓ–ãÐftüÑ;{û{‘€î¬|Üí׸<ÖÂ!͈¿à@®ù› q[§o (‚íâò&g÷Kï9ˆ£u®¯î«ï$úÑh}t§¡: IRF:Ptw û“¯%O'1ó€R0‹I Åi£{pÐ¥\k¢rôë/½•ËnÑ ]ÙÆ½¿«Ši©ÞTøx´m;ʃ®ÿf%L-K0ü“e e·ÐLòÄÕl ¯¿”dSy[Ò»°çà :‚` †Ìƒ™ÊGnór`¨1¯õwc<]ɈJ©‡ùr,¤™ × é®¹>8•Ì¡Óe;sEqЧ¦¨>,öeÉPýWÉ ´f!hñ{öOÒÐãžÅ`—ý Òï+S²À í:7BþÖ÷ KE¸Ó³Ç'šN¦ëðŠë+u…;uÿüŸò&ï=" ô‰«’bÆ7¨¤üKíR™ ‰æ§F³—Õ“§ %ήèMq#Þ6e;Œq²*SXTxYBËŠÄ?ö½§ï‚~¬0ڽƦøËðüHáõ0&ËJˆî ¯ /­§ïjæ,B Ù«1ࢲLe¹_ |BZþÙ°ÚËí¿ô°h‘:’R0‚ zÚ¬ÑXôdÓ¿¯Ô¿—¦/l4&ôÞŸÀ %V±‡d/i+„×:h¢7ãXR&;˜6jíeö³j&Ôvn-@ß_¾î«9°…Tá…JwOeXÓñË¡ƒÚZÀûœ¿nûG'é5]¨ù£±`ÐÊúÀU•”̯O¡5ãdŒ/ ŒG»ð)Ò©^áË1­jÛ³dÏþÊ:;ÆãW ‰ºP² Fs®+ë$½nê´¸e€1E¹MW®^»ó$õ‹%¤ãvœÀ,|«Bè >‰ ösÔ.ê­£RR¤[_:fÊ\hÁÐ5Àe¶wö„d¾ÆS„à—ÐñÏñT³§FÒT› œ=¬^V,®þa\9Èö»Ó!“›õ¿Â…³êªš½€BVÒBŒçú£’†Ò1%Nzø¥ŒÜ‘ŒŽuóŠâÉ–ˆÎéqÑÝ9ŸWçyÄèUà<ã3úž«•üoꕆ£Ö12z-<Ñô4ðNÇ÷Îm&¦hÆBÿäS"ÎÞVxƒŽ€œw>9!íòÞß76¢YsþÝÆì¶d’ɽ,GéÖô»ÑÒfêç„IþWYã­5ùðß0õ‘‹Г0$‰up±jŽz…º ¤ý÷O¢T±ý›1ü‚ì¦ÒÊ´+óð£1»X‹Ôn¾Gx¶äK?ð#­«;ïÛºåË¥ràœBèS°q­ïø»R™U°e«ß»q•-¥ßÊRîäõ Ôùy¤Toº<ü—¡jk×{û,¾Ió%w‚½PÝoþçÿ?ÉXg^H® üîJú6Ç1Iý¤”ñglªÖwßHÈt)ÁHá/2—F:OtÆ–n!ƒD¤ê³.€•êo+ÒÎI y]¥ª>øSéSÖ)=LrtŽ~D¿]ÞÄPìúV”5“Ág—°:ë~7î½#ú£ÎûÍÇŒÿ0Ç‚‹½¸äWõûΘƢà¥Ñl@@À÷ß@Pxó¾{‘׳5–x£k˜\߈“i á…ßðà®-BËf‚ Ž*”§¯áQ‚ øý–¸‹ù"NêD8ƒ§~ŠŠŸÀb"½\™|…Çò[‘!3¶ LT¨Øžž·í¤É*NºÝÂBñÂUÞLŽÝÆÿ†^{óDŠ gÒò šbQ;LdëcÉh2t¥‰ÛïâšÅbÙ ›É;iVH!óÁ·w@žMë¸ù9þŸq*˜+>ik°ámµ%XN.@ÚÅÓ­BäHï¶Ö‰· ;®+Ðñœ®ÕŸ`Íâ÷„úÇëŽîÅZÚDúµÛtrÎíë3ÀSÖa 3Þ¥%ljbëÅgÒ %‘ZÔügµD>‚Ï¥Zçµ¢Ý ›ÿÖÕ`à‰q4 6l ˨œŠú¦ýw¡*˜3S©8þÃq+³¢ÎgÓ­}Z&¤YÏï¸D$d:`®g‚œvTQŸ±<ˆöä{æ/ˆü)L†f- s¡ù¦\šî}¶äJœ{{< ©O‹<ÞiHþ¿¡¡õóÓèLéqü$¦^¯êßP¸Ï)) 7zPýèê=ŒÆ›—p`Uº˜ª˜jEE> í1°}¸wwš<º î/XéVß >Bó¾D˜¼ÿ~IÎy õõû|×üã²9MÀ‰>BŠ “œ‹3Ë!¿á>ôI;9[®ºC÷bÀ¸Ú¿1/ª™p,|4¹cÈRŠC=ì;ËSOÓÝb¹™BF‰Xâè}i¶£‹ÃËIÏqÖ$€ A\|ÐÎÁivöâ~p 0@©`àˆêh‚?~;Ë£°lƒÂÆ’Áþ»¿Ž5îxONÙiñúßc©’+¡Òž¼óŽ2¾¼+,s&ûÞÊÁ—â©÷¬÷}–|ú]Òþ’šƒ @V:ºöEL¡wß\='kéç¡TDl‘9:ñZà ðé‡Yp¶ïß«þYÒÆ5‡ø¸±4O1¢™êâÅ+>ÿ3ÌÆ‘FÉ_¡öy5kÜ¡”ø@¤I‡ e¬–?éöþcMŸg05„£ú•Ÿ!âä{‡Z|p!Ç=?61/Ö¦òÞ@¡ÿ]þ#u ïÔ²ö'¸áãšz0ü 5»õôέ‹3n-ã…˜öW-žâW8äyµŠÎ™\ʈU}ÄÐæø|››`Ã4³ÒkõÖvŒ ï‹svªšÄé@dqïy‰$à2ñú1Ea=åêÁwlUçÿF†h“Ÿˆ3ky•â:X[|•~í¦nw²©Åøßú}^FyWß× ”[iá✺ n9{“tP̺Ô4ÑñEº`Ñ íÃöäÇ4Úwx±º¨â 8¹…{9Mˆ…÷¸!óìG\xÊ ÍŽBŒçÁ®[•Tkú ¿á-äñ[â^:BÖo}®gó“§SMùVñêK5X?ôõ½iÏÿÄe‚Ö˜#¸¦)™“” „3„.as @ÀϨ+íV•×Þû|‘Ž Cž3EG#ot·ê¿€kd¢¡lÐo#€h*9$ñ0žßÄb--MÚ—R»k¶ÿ¾”Œш\ ГßÜdfãIføð|Ê»2&›qSÔ†¼PÕ®â©-¼t/µEsÝ{^må­zª¯:A8héJ/z‰TªÒKß_c­F}£Cüt³™Ý0`²da3™€0ÌÙÀ÷ý~÷Ýß}mw¹>l×-ÉíÖéfÅm[l.ZPHŒbI ì#P¢¶K`D€ Q#¬AŒò¸ˆ ²TÁåø*æ Z…´! u:I˪Ը¬ÌÀ©Š uŸB‰ÛœŽ“œ™ ªÑ/àf‚T”øDªŽL=T@¥""NFäPì+ÏU³ǵJ5%Û/ñãë“Æ?6.9ª\]8ƒ'*bE‹uKŠ“ŒF*•4)'l«o¶Gq0)#›Ç”B”gÀãÄ)+A´Ê”3÷“Rz2~ô²Âª“IvR’–¼ € Û‹LšmV@K³ ~ut=Òˆ—TôçÖM<¾w¼& y®ŒcV5+ž¤©€ù´xÌÜd£hF¦ôbB˜]²²ìÒ,ÂÊii“ÌÒ¯ÅE^ÿœ1ÌËTTlªE¦Ð•^Š[Z$óó“¯÷{}M¼¶kÓ@ä² ,IÈ—ÌBIÏr¨²— ¹ý!´z˪æé@uÅ=º‡J_x))—“ºÍ:ý»X–?´}%cZós“‘l§+W¿—ÔæYœQ}$Ç­Þòð >ƒÅãÜmÐb: ¶¤¶k­¦ €óΰßq{׌K|iÝŒl g+gf'r†§˜!Û îúƒ;U¨D‘ùÒ¡%Á= ÆgÔçŸ]o§´¾ù–¬ÝÑ–8,GëµY:w¸ÍÆ5Í™ò嚢‘e¼µ.ÓÀ;ÉãŽ;º+½ÙlkÒ¡ÄË5MTYÕ&ÁQj•Öiž-V#ØÓÞ®¨Ûé\B‘Uº³nµ¶è¹–«ÃÏíF!S–Ct#É&rJÙçšNüº´Œ€Í¢Ù¸Êålç&•Ê­Níd®‰£[¨~Cº~Æ©~Y ‘G´«gy-«8s›Ö‰Ð~\d\èsAêëIüL ºšŠ\ጶ©B¿­ ‹6Dllýá@WÜðPåàç;»’4nšyŽu8ðpæ:]2mʇÓIq¹Œ¡eN¦™{ïP:I]°/ñ ]ã'D·œ¹UݵÂX@w¾û¸“9ÔlÈjÞÒrXw<ÍîH”ztvûèšrã§{É/í§“5N2¶9@@ÏãGÊRPg±æDy‚ŽXÜDu#WiÅ.ÕÈQœh/¨g@1õí¬‘Ú<·|¬;'‚¹†äšà¿Å@Ȉeî½8=ª%Ì)šMg)ÓküüÑâ³”ßð~åm„y”ÏE#¥Ò¨‚C± €ÏÙ[Q©ƒ*­­PÐê¼[ÔV<3×Ì}*Ys\uöß9²åèò©Tí.×NwÉšeEÖž:&»Ÿñë%m¿/[IõxË|¨ú™ûÀ—É]J¢£zº*H =4­© W®Ýívc¾Ÿ@Ôïþ«ïPªctq#þ‹ ²Õà¼aÔ \›Í™¦w[Î~ÛJ…x\Ö7Ï®/”ýr;¾P@ÈY„éé(ðòxžÎpÿ¿AáÔ^QÛe °^Y“£}+¦ÁSùqÜ_Ñ:×v‹'$‹.M÷gηQùwy—o@é/§ßâPhÆà‚5å@õ-K›ÚjÒ]¨áB8(Ü^9ÎÜ[»ôpÛ4z ›-üIE~ÉA$xqµ\]‹í7ŸF#2§—‹!pÎr›²|G[‰`”AœŽ`ÚÀ'Z>œ×=ö5ã|½8|VNg²Çëm:x)JŽ{«i*Àftàeh6ês$dâ[ë/0}E†ñ–Îñ¢Þ—Ó+‡É é5ÿþÎ!àLuö¿ž›MíŒYŒOiö¸¼ã}6‡Z”9¹–KÊ >Š]óÕåPãShó½áÏómb¯<Ä{ R½W–xé±ñEÞeŸ]üÐ6ä %Ãf@òP>¡dc %˜ì ¬ð¡-¯V#ãx?˲@(<3ÄYسŠöh€´A„gæÒÎ]rí=pPÃçei Ï}?Ò­ý+M”pH–ò”Ð Ð(•|»)«v핺çËòdÍG™K‚Á­Ûå/c““Ù³ž ¡Ýº­ÞŽÍsƒ5”9¨vŒSM£ ® úâBèVoƒË²Ì“ êë-wpÞ’Ëv)TÆ…b:[mäæ2¨öÊ)…?wù|ýbcÓ2ФӦ-µeÄÖÓíf¶Ã¶8±MÙâÇzgÂuãOëC8€°@Â1a}ëLcŒØðþlUr–°vø7w ;sMfGbsÀw¦ èä{­=ye–:×êÛ¿i‡±Ÿ$ì¥RÚI—é?šømËo`·E¼ÉUÕú*7JçèÅdN,­LQ´öQd%v—"&¶Ko1'ÛWØtfgï0‡¦€81ØÎnI›ÄìmƒÜÓÄ—\}Ça|•Ÿþøé3ìË]]üL6â¾<‰B„ê!ƒŒÐ ¾jtýþçç¹û‘%ßvÔ ‡JÅÁà}n½ù ²šâšPB%|~gnÕµì|îY&8Âö5.raèz&‹ÜÒÄqôU“|øf°ñt—DRÍØ·¥¦©Å%&úy&^ç¥t×Åw*ú‹à!2,U/‡ŸBþЙˊ»4„Ö3áÔŠ pXÐŽÂŒga3AmtìcÂ"/8Gæ¹R©Ì"6˶܉ˆV¬¼ä(S°)þ· ûŸ ›ªëÚ X]P¾×W1>½­Q¼œßQ7ÇQ‰:õQx'æ‚azìéÞRIŽ&àêi¡f›v¨qõ¦‰­,‹…E<oÄÈ\oòÑ¿Êm¢zPó>'©ÒI]/¸v[U F­¯4D“â«rýxëRÆnù¿C×·[Ë/õœLo ßYÏnê²PYàÊ ±Ú¸wwã7•-ôŸQ± ÂÞ¢c&oá]°ùþú_$DïÛêÖºáê/ìÃ߬Ÿqš ¥k," •?ÏkÜ€èP”û8æÈ þ!2‚„ …Ïm ÅG°ú D³:úþö?×¼üÜ‘~Õ”`Çý›À©ÕA´';óÏà9½ “ÝÙéþ¾Éïp‚ºPÊÚÂH/DÜ%JE§¡|5š‹.Ÿ€}èa¾ú#ÃÂ÷”J^WéÍi`›­A«Ð@ƒ æýhÊÄÕóõ¯F2äc‡PcMƒE€Äø(#áׂ’71zcVÇf•ðüé¾ë1Óz"¼FÝ.Ø:7R‹hâ«ÉYG„É.kQ¹\Ū ~HйxÛ¹ò;†ÁÐð‘ù*½ƒ~ëÙ#î†ã¾A£¤ïtð”§™`5íï,?f\Ïh”qö§™£äÙpìK::ÿ“ÉéE«ùÖàý±Ø/¼‘Ëy0W/‚qØÑýŒF“uãZÓ¥Nx>Ù;fk8ƒ¥$a^g´… ìä.L×ãêè~“Ž®„çê-RÞ¤Þq‚, °oZ@K !Ÿ±Ïßôá, D%XøÕjõ†]0@@„pD¼>chD,–X0 -¨¸UÃò¥Sjipó+戚2~Íy¦Î6´ê¨¦)£Ló&QÄɺÀ=ÉÝ„,+/•ç§»N·ps3_ü ±ë;¨+ Üj[µõs£þðY9<û™Ñ˜˜ZÚɪ@£‘hÊ/¨ îÎcïÆWöð‰ƒ ùféÛ%Wà n@¼à'ú¤«ÍE«ù)LNcpÁ^ 뱃?÷†ýê÷ùq櫚zGGlu5l)ÖÌ*ŒµŽ¨‡É‡ªÖ¹nU(­—§ˆ{Ÿ·O¶xƒÈ]ßÁ˜yqBÆúZðËâpSxÚ»‹õ⥥©ê`'klbžXÿí€XLWæEн©”+#Þå2á|ýÓÄÁ–•LÚ”ì´ ])¯ÛhŒb¥ %D=&D^Äß~ ~ÜÉÆ¶ê-Ûìˆ$NÊ=ÄÀ’$/_å–vеµRj‘òŒ5‘]ˆ-‘BJ™m[åÀ¿¨`RªžD´s ›Âq¡¹X`‰FÆxpkÉàÑ"wÈÄèÞBðXåFÐ.€€Üî!ÑKŠÓ™ûn3á…˜dYËèÐ.ÒÑÒì¬nîkˆÈ:»Ì —µzcÉñŒ:ê%CYí?¾x:¯‹ƒh#8(òð=ŸÇJ0ß©ÐQ*N¤hlNñ¿O.HÿNpÖ0¹eìöÙjUò¡ëeÊ1~\•ŒWßÉÙÔ‘û@pý¬KâËtDäñy³ù8`*«³ÉöØ"È0_ž0ªü[¬Z:Ù¥Šú}6kfÏ«e=gkCæÄŹåòúÆ­®†v& ÏåâF-Þ4¹šØ€C”Ë?ÞèB¬òb]Ãtn¿Ti«+¥~•z$¢ñQ½»—Q(Õ=>JîØžm.ƒ<šJúZú§a¢kvü)q–báò‹¾q-» [T[…{´ä1nIóCY»ïå¹÷u_„Ã-xlïæðÕ?Þ(³0ÛÍNóÈÏ•èE"à½ôþmgé­XÿLZÃY¨¬÷^Wcn8@'Do¸1—¶^ \*]i-ãÿ¦k¨¯zq…û.V$®pÙĸ=7”€=áþëhqïÇÉò°™vËÞ á–<.s ¿wwFxÅ™ÁFó¨,#ˆ$9X~\1@a߉9ãßvRñ>·ç¢´†„,¨~+I,âI¡ŸOXÇ.é¬wßÔäUÁ/nãœ`nøÑýfaë¦Ìû–•]š¨ç]N½wÕRŽÈí•òÕëœ{^ÜâÑ=´ã’gWú­7û|ä¤þàˆæÈå Øça«ê¬¯‰f,†._4çCÙ”’ïŒ!ƒ¿ÐUÞôÎ÷Õ[QŸ«!šð¢à›.»P[GcpîÏ _¨Î+ßÜCÈò2P}xx~G^Ÿ|k=jMEBìmÀb«‚EÞ¹Dïªs°G0 ’XdG´Ü– ú˜Êú¾UËEòáÙ‘Çvo饙Gå«z˜=Q÷u¿àinúõ…”zTžÃ`·q,ëç¬#©f”N‡m8¬ËV¼ig˜ ~ò‡³f>lþòßa±P‡ÐÀA ÎÅÒ2†TT£ÿ·ó(sÁ7u‹qeÚSÓ  iÊÚòº¨BpÄ®ÆMÿDz&Ú@‹ aԵ¤>U¬_H‘§Ï5™ÂÙyLÁÔÿ¿ÊH¦Æœý ÏoPW0|–ʱ–aV $ fu£ÕsüXP~2QøÐÊ“×h…€¥¸Ý êNQYR‚‘™SCº¶ÈÇúÔëÓ€>$=Ú”Šl¤le祊4áû7É2å©‘ßÄ4Å2ŒsÓ5IÄ…Ò“²Y$:¦#ÍTÀœ£î/<öá²5¸”®„šI_îŒV.æ1lmÅà¾<š!X‚ÚPHDÂ%/ÃP>,yý]èfu­ñ ý®Úîþó’_û:Cxóó‘ÜOŸe\Í:Zó½–lZW.¬ŸÇJ΢–WÄè2{/= T_°O}c_*§•ì\QŨ]B´¬‚ Jè]ƒ… ^ †ŽËó˜Ö7vÇ]á?{4ÉÐÌ}}ÜnkË,á±1¬È*u*$”Þ™ÙnSlðžÙ¦^öqVŠAÊ€ªª:*ô “ÜAZÐ"úþì_ÝÆþ€9Ý·N]™U?ç¿Z}?¦‹É7Þ@ÿ|=[eºQìý5m„H—LöàZwXh%Ž;©ÚŸÿ9añÅ·ºv ÿ´´áóú'ÀÆBwú¸þÀµ:ùÊ©™RlòÉ1¤ÞwØõŒx}K¾Tû¸Ü{—çêõaõ–Њ" Ùc¶—Ð@…÷Õ‰ë¡û3dìVn—ã?»51Y>[Æ;<Ôq/¶_ÞÚt‘¿µÆï‹ì~\Ë£ñ@»¯`»§?ñÃü+óþ½ûóå|w®ßh ®#ýաбŸ‡›àFV§›)—aS%×¼JõÍD6¦^_V|j¾Ç{Q‘ô°[¿Vkkû#ÌýŒ;ºupÞÊ ´;åÞdÃá²|ÔcÔj°Ë^≻ßëeÀ‡†\úc±§„\ˆ¥‚EûS¿·EÕ–ÇåÞœ=>÷ Bu躔9‹Ìûcî·Ì€m"×å2üFê6.xí² •À"åáߨ¬º5¸Þ·3¤Þ’ÈôýŽQ{š—×sãٌ؉ òwÅXOã^/¨;ÊåßñKÆ_"%é(–RrháDØ`É̘ݞd8ŠóÝÎ}¨Ýíl8üîe${Zƒüš>.–ÅŽW>xjû¾×,ü,ö}ØZûºïW‡&øÕ‰é_šÅiA¦X÷ëÙùð53;)4b><÷?Ù õ!Ÿã¾þÈAc‚¼,Þu;w^Ľñ;ÏðéP@VùÏK4üP +‡«+ tºB³¿xÿhµ‡F‹€ÿwOÑ@¨õÆHA¾ÍªøÞïÇ×¾4î»óg€ÿò¨LbÿîvÞùy@€ŒÏиLŽéƒõb¸‚’€•>l!X¿i_¶–•—b!£õÛÏX)$€ý’)1ÆK@»Â2&Dª{q+Á½ËÀžg»¡žllªïÙ›ç:Q}¶ŒìyQÄÊOØ^¤52(kÆd³#(/ìö®G9ÇykQ 6ÿ/u[yqB—3×5ZEd¡ÚJ§¬ðkE6å7M‰•‘‘’ŽI‰å«þjRööÙ¹Dæ¥'¥³2LMqY#³ ‘ލ‘W÷?å ©Œ$’÷¥KÇi0&èÂl’œ–iš]0)£¼íñBÇËi‘v>ž¥8 ½g˜´Ïíp‡ÿåç,¸º>óec}<·ènÛD3D@#oew•»€Y$š®Ê-í#@x† a„½mŠÇ-®*à­ÖÛ Â¿g,éÑô€™!«0Ûäô”ÜšOûè\ðñû®U iäîøšÜ'¤Çt%9ÃÖ©¡î( µµM}¡¡€ u´2#¥@+j™eRCBX,*_™åRfdÙà¥S” r6$Á_dsFˆhÀß ÷}ÝÝÛۻݛær–lÉå.s“^±­­m¡…F¥U ‰Ö Pž,"ZŒÄ|å‡@ ( ày2 À€óX(ß/‰Œ•:e‰%¢Øç〥d˜1¢ŒD¬.f6&,0h\ìx‡”A‰Õ%R+L™£¹"ç&M'2Dÿ8<Jž58@Ùe¹ÌƒÇ.Q*@œ‚vˆ ‡8_GBYUøᓱ¼]Z±V U¬–S‰Î>Ù+)‡N%)9Âa7¿M‡“ò²«-Ò\Õ-œf¹4}2¬‘’jƒ¿5stéÛ¹D6y$ÎøØ€• Úm0B„†m в‘î‡'XÀ)°Q2‹¬ÐÈé( hDUÅ4VA8ºÐÍÌÍh)ÒŠÉÄ+aTˆ;‘²¾ÛÞf™¤ïý©Þ¦o™O¯+95w]ˆ›å6Ž·òV,Æ”Éq'FÐ{âÚ&eÿe à`™6Õ"bTm,¤oÊ©I¥Äœd IÚq%Ia¨é€å”!œè-3–ˆ§]Ê’ÌU$Ћ–¢+k¹ë˜Æ)ë ]éS=ÒFÒ.ãáqrVæ*MÜÔe)*ª§¸Sš´2•èU¥• .ª$sa¶¼¿•š™Éà›Yü <y Íæ”h¢¨j¨ELD’Á›1 ta·¢5[:̧› RæM±ºHg–ýš  O´I¡¶Â J¾>|m¦©Y³­è |âËîk“Z%= µ™©«@¡ö¼Ø´kùçÓëR¤ ÞèBTÈô€ØkÆ…gâ‘"“ð”Ø,ÍXûx)#'MäJ„íœ ç½ØíO›˜z)LðjäÞ$úk§Å* yÆ0Ë:Oú1šÞ²î­€Àâ­³çZÓˆó#~v]%½&¶ðˆMÌQFgQ]oP*nJa)<[‚WòÔi­±®ì#ª¡·›œ/\ÕlXZwd™î>VŒ¤#¨±q«&]#ðuËéTÙT«çªLiÙlalºÂüСÍ-êQ=Ö}p£AÅà˜ðê^,uLv:Jo3S@f¿VÍDkA S:Ò説µÜ¤nþ‹K-SIl©SýU³ˆ_k˜û!6‰Öη\(_aÄÎf·id§ë^üÒú$Bµ´6¸Ž´­j›šãýÒן—Î^pÍš·OɈSAMªÄlØ wÚÉGñNxïŒÇcäŸch¯Ô¡vÛåc¥=ÜH]ôgxí$Þ­¯<%…°À ‡´Í^r|ù6X©Œ=:¡¥Õ°U¥~HÝj¨ü.ÞGažðž·ð7s |„ÓŽIm-½Ä™¡žtoÃÖã°¨•¢Ý“½Ÿº™~ô÷Ùùí–œuÒ‡óe5ð°ü¶ ?O gà=\ˆ$7ypNFË ÆI†9 ;ÃÓm!m+HÊV™Ûg{¸)Ù(’É’ÇØ“‘qñ3‡;ã2؆ûÙ¨Ï} ¬|c [Y’– U2Œ0c…Fãx’±ÃƒšWcùX“ ‘Ç”7ÇlV¯ÑÄ宯7jcòðY½3HH§|Ùh)”t›?¨ú, 1²œÂñ{¨ìï!qtZÃÒÄÛ˜¯žÇCFÉ]ä3(ìHéò›Å¸Ø¿!²ëkjoújï'£r{àP+hxfâÉÍq¶bí¨8TÖz‰a©ýmHÜWYK´´*™N Nö:;í°¼­tUÓŸ½%Ð7°¯³ëäÞ=©qÇÄ‹#øJY6Ð Æs5,w'ÚbâÕêm=rÝ]Ñby¤6„gåèÒˆžÍ¥Ÿø!Š“¶>õš)ýe‡Ó/g¨èsVéùäb7cÂô•å´&ãva®G8î±øåzX ^ITÑRâö)"’Q"©( Ãϳe/’|¯v<ƽ92P!•ègM×Ô%R†ÁÜx‚AÅ9S0©e[’9/‡e®'d¥¹rtù[¹¾Þ]É™ ½Ã!“°/-Éz ue j¤3ò¼xu±JŠ´{&í[mµ/-©™Š˜ªKõg÷Õœþ‰ rn¤øYâƒØÇ|EåGì/+š§šq÷!OÎ:¬g{ðÇÉ¢@5)p; ì€ N2=_~)qºjø«÷Éy¦‡J+ ħiôÀcÍÑÿ!*íï@R?óów»õm#_œtþn¼°%ýq–Øg¾= ¶Ö9ZÁ.Hüª%‰^¬ñ=Þ‚fXs;Gt!ê†ÂÜØ…Û³2õ\„ˆÛÞuu¹Îléjà·’´x^:áLã. NU¸1_ºÓøB œB@–zk8)gN §»H4äó—NÅ:F¾,k)ôN Zp`~¤ëŒIò#ŽŸ [àfÌ3CHˆ„ý–Æä8ù6ü‚·Ò€© ˜pÿ|ݺx½£uÝ2QŸÏ›Z$§õ¬BVŸ$â”Ð ’àÃqipøY»ÅéÜ_XSœ5É. Od}ÿïËpXĈu¥-ì’ÓÂERãG 2âyòcƯ_=ß0`_U¯zWÙ ÷j½"®3Òf<•»ToºËð˜ÕOõ ¦óŠ€)4U¨ò=·Y ©ÊR:ìu×Ë¡Ïü‘|èþ&{÷v_FŽ•õÀ„¶£—RŽwu­Íê q¿± %¶5º„bAtŠ­Yú9ºÐÔšþLX·#ËrRoË]ò¿îÅ_Œ¨<«çƒòWÑhƒÿ€€@/ßÐ ÚVÿ-ð=7 €Àíì åþðÇsxZË|ŽËm/=è;î ׇW-a(‹ç¢"ÏÁy±î¯Þ”åƒðrê¡VùÜ%­¥LÖÕiÓó«ËÁ@墋Ì_• õù8…d™Ö©”þ²cÜHû/E+îû{·Õ®€^¨‹ÆN–b`õb-¢åä¶ Pü:§ )³Nì™×š¼ç$$ÎšŠˆSØHZ¹ÁJ‹ÅíÐúˆgìÎNüm¹‡-µuк#›[š¹e+‹Ÿ –zbÉaŠôŠ(êŸþÕÉo6Ó N½çχ§êQ ùš×î@W¯=Õk#¡Vú©? ûéLæ`ý1 g—,#³¾ð•UqùÞfÛ‰ÊÈ~À=Ï£ †!¤"†/A <v‹=… ÑÃX\ KÚ“àËòUǺ¥CÊ(íì£K­ápвÀ§õ>©çΣè@9ë€Pñðe áI£cüA@>`` ? ŸñÆ 6œB} ¼ o2òðoód*NѾÝÐ?G–ïj†Ëà¿_¿7ú¦°ò7Ïr¶\ ¸¿_˜§ï?“ûÊ„(¤å˜Œ8']2‰¾¦.Bk"»Ä©ŸµbEó ¹>VÏÃrèâ¾LjGà K6›ûW©UÏV•g;Ïé)¬²WFÒ7PáWxwÚ…ç¦ïv€òz›x*Ù·­D¼nÂßÖIÙõûƒ$×Äi ª=†'#Ðòà?rCbsÇ;=7¯4Ϙ!†ŽÜ Þ_q2(¦žý·m6;°{æøq3~rvæ®ÃéIG£/Þ#-)âe‰üV;lÅÀæUÕÔæ¾i7ˆûÒNéÛÂ*é,hO­Ü¢ù%MS¨šH±CÁ°²á—ƒbb^ ví–K¹6f3"¦ò¢É¼Ím~šÂÄ{<ÂWÐpú)VÑÂ'áp>ò»8°‡Óæ@Ⴧv©ÈùGé?¥cò1YäGÈyJ9ý4)G’b‘A¬˜˜Ÿtì>þ?RgÖ ¢(À®É˜wLÄȺâIIüöV±r)Í™LD¶Y¾){–Ç™©ñœ–¨óš´´QÅTñ3†ÑÇ›Im”™åvVl ÙãÈ×jšXxçWiPžÊ@'Ìâà¾ë4S¹÷×ÒŠ il”C¦9$b èÀ¢²mh(µýòùÐLbÚû4YOø ^ˆeuíXOcÄ@ 3¦ÄR˜‡NôÚÊH4Z$…E•&•%Z™T\æô½®lëYç.³¿2xD §ïf‡f®`pžÛGÅ ž…$d<'°Ø™4a±dV€§/ÙS™ë´EEÕ)Â,꘾“ö|鱂»ð,\rÂÄ“× ÍO¬ü; …ÝS9;%±KÅL,sù×ß{:M„5âÔíQ{4 ¤  àýÇÑ_í¡B˜Ð-4×ðhÚM†ÿy  Æ{¾FU,ñù ÏçGY¥ž·Yo H‡H+«ôoÇzï|?z¡«OÛÓŒÜSF5/ç¥gH/ÉgYBàÖ ë6›Šó”èŒÎè·élgB ÇdZzr¸¿¯ñБKhW̬ƒ]ftY¸©Hò„ù•_תµq ƒÎÚ,akµH$^¤j–ú×h¯·Œß¥N´P@èöØ¿½Ô#“ݪ|ïÕïyð1*Jðp]%‘ñi¼“ÞÓúoH=$ö(ør]ÃÛôŸößrl·áßeRj]ì•mãêôÏé3Š~°>¼êŠà½Á&˜u¢+³¼­¿Yd¡Ä¬!øWõ:sýyÏÕÒ³N—^ÿ—µ^œ©×9T2p8QpáÏR7 j2«V/FÁwß½@1¢Ùç@ô4¿fšNI ¡“ èX+ á RŠ×õ<”hmªf?é<ònÇÓ)9jÖòøÝ;õŽÿ-h<^ñvö<‰>›¸s+ª‰ñ0"pš/„'ça@£ã‰¨fì&ÆÇC½%K$b¼Va„ø$©»MŒ4Å%I#TµL½ ]¢„ä[½ãkŠâ(¾d·`Êm9Þ5ÜnÀ¢lE͇±ݹ:B)D^¿ÃíqßÀ·Ê”wÅIa[‡¥³(ÚP:-5ÁˆuX³Šý€xŒa2Ô¼%¹øü6<ŒˆÁ%ôJ]ˆˆâ‚]QázޝçÓF¢jhšÅ:œ½%€}œ œg{-òüøýº.g2'IshåÜ#ã(€ Ù(Èd‚œ iz$lÎ*Ån·Ï>:œn!M ôtÊ".ý='vbt†X.kDÓ¬0<<»é¸NÉ=@†qt™vÉÙ%!kXgéÀÑt|P› Âê`³Z¦ÍY“è™Ó\ÌÃÌ—êØFŠ¢F9šù”Ø[*dÄŠ¿°i-7`2 ^NÌÂy>ÐÎøéb Ðƒ£X³¦|wéÆÎë<£L6gVÄõÖ‚ÔrÌÀÐ.ÅÎqzbpûY6©× ,<Æø:hj&œ‡.™ø:¦Ã \!óšVÁsZ¡ ra^ÇI521tT—ÏI àÓ`rkdÓ;®k%¨œfIó_*“/ D™òNPHý¸8éIÁ]¹&½ÒQGëÓO⸽¨þ‡†d|.6²–“‚u.¼-—ÅÏ­`P!ì—­zhU‘¸pS«¼T­ûšµ¿jÚ6b:;jÁµta'ì]ˆQ–Å|ŒY”H[á„^Ã$'_áNqš¯f¥O.©í ¿–¾‘Em¼1,Ú«™´š1rj\.n2U˜•6_ÄZ™} *wÍ<ì}W5x¶[·Ï¦¡¯u(ç4Sf–ÜYó$E7(Éï1õ¹y™Emp+@:+ß Wá_Þ.нþ3dö<˜Ã\  ®UtŸ*w+¥ÿÄŠ¤åºöŠU\bâö‚¦S•Û?ÛÕßiyáŠî<$ùóÈŽÚ0¾#¶£øÍ¡²6Aç0RÕÁ¶ ´ujÍ„ } ÇaóRÑpk¸âž<˜jA]çªXµÃa/”f¸ÔÍŽy]¿’ÙTfyÅA)ÎûKéÕ.PÒâû#Ôý$ã÷ÎN Î* ÄøeÊóì.iƒ% £&½DªýзpîT„¯1’£BAéŒì—uÄäÂÛäªX•¹,m0.6ñÒélœm8bue$Š#Š]Uu¸)~n¾NÏâàmápÎjUÐ[˜m¸’¥§Ü¯mŒÈ-Rù=„ÂSWËKIâÅpYՌʕ:üñ©:£Ë”›Yî̃GÙ™øtãCrÜ„Õu´Cfr~ÒÔêÕ62RÓ—>eZÅ{3}ä‘„ßÙß}†^wîn°°Ä±Ã$?Nä¯qâšM÷°vÝ4»@ÆïªŽÜ½ß4¸¹¶Õ'yþe ;\').õäÿ7°óÔÞ 34m‘Ú󴣎5.†Ö™Zxes'U¤§»ÆSlxzN)æÎOe±Ä´ÝD!€‘!.ÓWñ;Á¦£¸ß‰ë”ÔøÑášØ87Í rfWq÷ _ˆÏ åÇèÒrŒÙ݃nmíU¯U•ùõÏ[ƒï(åØÌ®Op±|è­zièÍ9“ªº’[yÑfr•êeVØ{'{ (Ü_9Ï8~I{5w¿Zh¶Ö÷ªòo×vW›ëŠÃ Ää{ÑMD‘‰æÐ 9€ú+™ºF&š@M÷gÓDg«“s {¿¥ÍÁŠ‹+Q´Ë7‡i«ôztG½!wcÃxã¡\k4¶°á D® fhŠ©b›93Ñ}?³kœ3:ˆ QÛ¬ofÒ•AóÓÝ-‘Dv¤¤ýnuê›p½› ½)AËl´J†‰_Á_bRBÖâswÞ¥}Ç7¼ú0 ä^¡ó³c-øwÃRsÏx!j7è –®(K>ÙUÑ‹x„‚¶±‘ÊÅÍJýv'Ö@g`@\¹yë{Üvò"Ä’ƒfØëSÒ[´_Çèvµ¸gwfEõ2LtEå÷è‰}`ä® & Õ °¿<¤‹j ²T“³n tõÂ}ô’™ÈB7©}GhÎýí©}ƒñcÚ¸Z;IòfÀ=8h©¿$˜èàØêJ¶´FJYµ P⦲6"è5 aoÝLDýo¸ÊqÖüJ\â¼¢÷Ü^[Ç›Iž½Ws)çV¢Ã‘îjy•¤oA›BLÔ|=ÜïH…ïÝ7[úÛ…"¡ ñÓk h¶ùÞ<òånû-ùâ9ïn¶¡S]3Öú‚?•1Çx`ü o>'¸Î4ØÐ%ÏrЬ·¨°bÌW±Œ°‹U<$!_+¡Œ§=h$@&ÿŠ£Ã2ë#Ýø]ÙÊ'ÂPP4eHÀ„PØfÓÉûƒdáÜ…·­Xß%±«ßëÚϞ߉¨—~ö²ùIƒÓ~U£^KÝ¥k_yúïœa’c6RûßýJ³tó¦Öí¬3œ=jº­14ß]Boƒ‘“/†wÑl®Å‹7,›‚¢½óÆxIhDàâ:ØÙÉÀíÝA º~Ë0à@óöC‡&È»]­x§`W$nY¼Q^¼©J!Þ‹ÚSŽm3‡0š Ю4D_õ:ãž÷«‡Ó¶Fƒø° ¨!y¼ã$ÄÔÃà^\þô/{kIk÷{«ïø£ †ÿú%…Ei•¾®»H®ö*ÝP±¤·èûªŒð8 Ó\dÛe+K2hÕ>Gè¹ ÊL1³ä; å«òlLÊrå!éíŽÕG¯0'T/+œì¯8 ¿æÅÒ•ˆAcìr÷~ÿ3!Éé]‡M&¼Êy2¥—òÃöP™¤T>ÚeÛ‰„›ôƒˆ1n°À_oñWöù¼lðö9]æå8™“^F¾¡ÿ_QJ€|Ø&mÍÏ$˜8‚†nÀ¶-߇à…äcÀÃÃhÄìœ,j*'½t <ìÃì2|b°]¾¾u ‚ …¬ËBÑÏõ®üvWI2™)S©©(-WrSu¸X…í îçOÓ¿F·ö+ÿQÖ¯ ÚDÄofÌÂBŒRJ;è«nf9¿Þðw}+ÞÌQÁ‚( V%ŸëÛG£~ÃEý¥â]@>­ØÓåGt˜H«/jÌ#BzeëÎFÉ®öÑØcŒƒügïÌaçô†ƒ%»|üÿýfµ†Z5ÝÊhm¸¿ÙÞz3¡­Òp¡>Ý'üغC…׆>ŒÈ1ëð5H¢â²\oðf,gÂ" æÿÞ×#‘ó»cŠ->)‚«ò§šþœiŽ'äÄ]FöO¯E}²íëç¢w#Ágó•¿…g}\öâç»ûËg­¯³õ4©óÏ®ÕGû5ZGÇ€ª¬ÿQ³]Ørzk¿Öèß+¶\¿„‚¿mÕ›Bv—?¾ÄDà@ žwP°ÃñÜ —†ËêW ìP ”K>íÛWâçùžtÇÕ"žÛŽÈ“Þ¤|ã€öÿZWlž€‡Ž O07ÄŒ6°²{<P3T@#odo•o½ ÖŠÊ@Úà ø5b ñ x…Æ»¥ùBvÛÛå IßYòï€"€+8-2ÄiØæÎÇLøs3LÉ$7•dÌÝš’Mn.º¥Ô zSü¨¹Õ½ûV­¨úwoUÕ¯Jébk¥™ªœ¢t…ßhDK5:èiº  húúšíf¤ÓÂ5ŒÉÉÖ&3fFÀª ûÝ»ï{÷þÎ7ç67r»yÍÛ¤¹]4wݶ»¶¤IþÃ#MK*FFŒ0‚( ˆ",¥ák'€’%|@¢’¨ ‚ª}âT 3çÁ ˜Rì‰ÛŒÔ¼#~¼ ]HÄâbddŇÈÌÜ÷ÊÊry•ñ<Á>ºb–ãÆÈÉLM‡Œ“€µ-¾»\‘$Þ€â¢ÅXåp7³ë£™OóÍ`‚åärä ;lÑOÅNRfAd•‘˜ÊÆ›ådd’éÒEØÈ­ˆý4¬…wÝþmÕ¤á sCõh¶*›z]6dLõe—Z–‘%æÆµ!KPŽS¬RST PN¾%%øN8ÜE~ãZ”Ó!ê\h¶ð¯žT¦œÏgwJ§?M4rÜn‡Ý€¬:EìGbf#!þ¥ØëÌ rýϹ )V¡V.Î#ÒhK¤ ‚¿P­uö•ÆÙÉg“'ÂƒïÆ’ãIÜ¥½Ÿ”|á{=m Ò·ëŒe—â˲@Ì¡T]kH,Hl·”> •ªƒbû.ùuð,®ö[‘@Iñ‰ë]x“xljY`Z• A`xvj.Vxؼe;O? +b6rŠSÒÙúÊ`<…ç`zî/)ðx†ñØMû¸g¶Á3öVõP„‘í” ã®Ìx1·^/û°ÈÙ•œ—ÀÐ/øÂ÷šKÅ%‰Zc²”ÞýòRè´·®²rïhn7hóÖ³}mãÇSlkJ²é›Ò¨m iWÎ]*3©Ög±M3fÌP^¤ö•Àªv…*ƒúØž„ Gs‚ÕZ£ááÓ“iÙø^È*±eÆ’¡µ&ÉŠr׬ª»+8kï” AŠ·×ˆ%_Ð]CäÍ %!ï§k¡AãºW‘襓H2RòRÉ¡ËÊäË8-¦e‘1sé“¢””¨ûÖüyg§´¿¶™ö–´&™Ó#kH% eMf%Ljê>RZ¹kÄF$ú qÄÓJ` Iíf?#gÕ¿=»ò )J^F[Lâ\æÀ,a©é!dUø‘}¤5“~Y¼‰»Ž1¦îqdÒïÔd9wó…þÅN«c õGרWêÓÚY–Äûì à8É­K÷æÆ2XéÐäå•0­Òñ5Ødó®ÔÎû+ÎWÇ1ñu ãÑø,n¤<óm­¿*ÛA¶;ûº¦ÂÐû››:~fW¹¾Ü^­è¹úfúCèYA‰*q$:\ ¢f_£·~›–ÜŸÀM-ì°.ž0Ö K–É‹ë,ìÚÌùãcB ¶©õ¿A¾±kn“Š&¤ZZ©â.wSÝ·LK-L¹z½„zà1O*]IÎ.¿°÷ûU¨{ø=éªÉÔßbiWŒÉ‡Ú쳬£gNn‹^HxW<¡8š'ÑgDˆï4ä¾W8M¤}…‰q åP,8pJX/“•iS \Mĸ–ˆÜæè ZuÕ¨½ÁÅb±eòþ#÷'yv† CµDºH¦9# ‡þ¤m´0&mVq?Ú ûvØ`ÍJù "èÖ{Ü'Nûóxž'˜âXS ¦í1‘iÒÔ«îıËRVÃh-b(S®+†¤NZ1aõšŠ1´­^³xÀP‚Ù‚¥rÁxHE›‘Sâ¾Tûµ[&øÆ°ÛrGHg€;€ä2]Aoz·á­Ò£0;XçVªbîXšò²ÐáoÑ Ìó¥¡Ë»‡”+[±‰|²¶‚ '* ï‚°pD„ºº®> Ù{H½úèfaýTw(rŽÂ—/&¸ñwÿ ÑrÓ Çë°Zq–BŠDéÔ…ïÔí/r¦ ¤Éå¶Kî‚[¥çôœÌ`ËW12¨zìá•£œ'¡^Xÿ\´k"Žá#ÓWý›»Öë¤lAP"ÙFf''$^ ¿›Yø9Õ]Ü©Œ)Öv£Ê¡…“ÄY•žÈI rœl:,dNR¥ñR ¬pŸ=P‚ÄygVR’ÄrˆÛ‰† V_|²>l$½¯å´5J—+—¼½®«u)h§æJ‰Õ?Í_ªBC%“ ÁéF˜3./Ї²¡™}4*¶.íTÉ ÑýîÑûcáRŸ²î³jzç…2C¤t/lœsåȦèÿ …uþ8µ;\¡o†u˜ÛÁªõîò¤l©]†ó{NܪZå’ütÒÆ ª€XãþVñÂýKr¢ÃÉ·öGޘ߾#Ñ·³Ø¬O›´‡ëÐuÞÔÅhå©><,¶Íw"@¼?á8£ ø ¹¦’“å}B^¹ÜHÆî %’€Ô¼šÒ_ì„Ñ8Þ¹;’-ěܑ¾]P@‹ ‚=H0Çw÷/±c=óPŠ,]ŽÐZþ.Ÿ{óÊåØíTCû†ÄS‘‚q~@»H ó ñ–æî°ÿíT5£µ››Ý쯸ò6ÙQ Xs±.=g}„ÂgyjVùÓ©§jÑtU”';š ª›hs)f#ÅÙ"™AФhñþÍXÔÀ‘kNAÁ}éå–UÄã#çrÛÏ B®­åWÑ^Џ„u ©L:ôPÀöfH×(½;ë4î7-™‘Í Š/‰é[â*3ìéU¢rÖTuÌ÷/·ÖÂüVý¬Ò9ŠýÉñ²a`ç®@¨bé–.Êýê磊Ɏâyî¶û;æwòõDrsÍÑJN½µÒ´Go¯f2¬CFH¦áNýEHBšüƒÿÎ' I‡ÎŽ{[€?ÝÒ–ŸÑIB,², ÄJ…~‘Y4oç8òÞ«uiÖ²^àGë®nn)ÅrMõw£Öév# oMafÇXðZm–ž'›WdqAÈ1á"¡Ìˆqç{È@vö_9÷ùÍ)_Îh¥É÷§ÃíF‡æF\˜ÁíEÿy©¤ÇæFñ& ïDèÌ7+bžD¢­†vOïÈ­×ÆŸ]ù3]êFŵ;TAÖ§V´gx¶^mž÷è*8ŰºšŒòª €j>oYaȧC®gêUv±>žÖ2$w¾FÝ÷ó›Ý¬F¹•ÑõT]`j‹"¤kÖÈ‚K¹dгÆ1ªÖLû¶E7^KúÚá:ê&¢sÌÝOºúîïk×G:g+K¥÷»}Þñ±h5wJï ==mÝ·¦¢ÝÁ¶‚1¨’Hжa-žhE‹ô¨SŽ›±+ƒŒ£þžË¯ú¾ýCõÉñUN{ç0zX;mn¼û댻ù-§Ò_`ÎrÄh‚þ­Kf¿5½¤ˆ(Ýüå$0z1+P)M+ß/·³–—À@~¤¾ Ã\s!pÁÍÅ—7 ‚.†Lûœ^ëbQ0ù1tšx-Rí1…Öþ1„gÃK¸½ôgH‘æÉwzËϳ{´ ÆÂ°v-c ¨}éOX~J ˆ~’¨Óà±Ýœ WåÒ¥ÃĶ[ˆ!K #w=’9-º‹àÿ°˜‰MŠ¢Î‰Ó´»¾,ÇѲ^Ü÷d×Þ¾OšÖõ±Ž•6ÙF=öïÀ>ƒõw«a6”¡U­|óÕo­»I ¹¸°mxgÆ·ÈáÃêQº)çÓ7¡']¼ÐÁ` `ìÃùÚ±¼lƒ9ÿ2‹3hœòSñš?üÈ:£ÅNP1 xy,Àw§i’fcÚ2Èv¬Í® ëщ¡cH–­c`4Õ8ù}n´¯%Ša÷Ï9Y˺¦h7“}!<ùËtÔrx{ªìÝ`B–Pµ”Úhn‘‰^i›ÈJÌ 7 4óèI? lE°;¸š3›…¯½+ÒEÁ¨á©™= dr¹;0 #DËè‘ Ç`Á'¼R ñœVe tßš>›ŠTcjÏ‚WÉ gÜ9½]2¼+ÆÁb¡”uuúºÊ|vwêy—ø\ÂîOí°¨ˆO¨UQv9.pŠãàÓÉ¢£‚9p(£“ß…Mzå‚J™5m}v!¦sݘ<º{RË–£¸ÃÎ1ƒÔžÕZϧë-'Vý£”Òãi~ýGîS1q|ùq\oª9Ñ”sÌ/ÒýÑýº÷Rì¸é$æëW.!£|VªlÛÆÇêÐéÚÏDÉë`üU#ž4WóT§² l棼~À’s„d­É] "„XÒ°P•o.ºÑzÓªÈ1¼¿¥È|çÓ÷ xk µôõæK¹KÉcg‹kì¬©Ž¢wÿó@ýi ÐžxG#æô£= ÷£Ÿû Ò)«Wüi㔲ò9½óVS$˜¿Kx@Ë®3g5âꤧÁ\Ö·-*5F+ÑT_X$@Rþ\þ! “6R©Zfñ7éqVƒu°TiÜ0Ikéü[,‰îl/g2l €œöc„¯ã‘Úëý\¦úL÷¨Ÿ*‰öšó€Åâ9MtÂäâªà®<›=u«£PÁ½P(]Å Ë›xÄà‘Í—s1]ãE6LÙŽ¦lLÇ‚‘]ÆŒ&itQVž~Si0ßÄœÇjYòÎlWjyFòi€φ­ÖÑ„X 3>;&Ëqý̱7ùõþ 34ôtˆ³½rÿð A@aì…Ïôö<®ö?çÃë`›\ÕA-Jt»tUƒ¸ÏeÖ>p¼lïá|›ñhÜ&ÆË†6Ã#„;Ý´Y¿ ´’9ÀOѰ‡Õ¬ 6SZך¡Û'òÛ,Ï[6ÃEºµnm*j‡7ÖŒÎø—§û§5@3zÈ9æ±£Šˆœ&ÝOÁ¢§?'á!D][ d­Òœl>á*4¨1¨ôñ/!"ĭ׳ÍGD÷8óWÌâ» Œ yPDl•Íl©ë+•¹TGqëWgeg†SEŠºKV»e:*Ö&|\WÖU –3æ/õ½êvù¹u˜Ð€°¿A…õ †×ð×—ü#[ –é@íé¯ûÏP‰¬˜Wî6¥6ˆŸe×€ŽA¢ ÏM¦Qù½Bï@³lŠÿOù¹Mƒ Ÿr¶B™ÁñËË´ mÚ£GŠ¿Nc6£Žš#æ°¼mt³u+± %[2SßYV@œf‰hûJàlE÷G·ê·Ôé)¹ÎN‘¶^f54`‡Ö£´ZÌ)‡T-¡Ùi`·[Z[xCŸW蘗ŸÜ}“Ö(: RAˆžÐì­>Êá}¿ ˼\ä*ºõ®2ç«‘²øÉÎäïzÖ7’·’üäÅ22]ø?úßž•%y"?ófýŒÒËßÑÐcû1ù.ùæ8¯óDæ’£üTN]eí^q—œ&IYÐÊŠª!AMz¥£e¯šq4ÿß üB}¢ìé,=‚éDñß‘—ÒW‚#i} …§:€IšëlÙNªï‘Õp]ðDœíjË÷€¶; ßV7 ß™ïå‚ÓCô€èV“sÝYÕ`'…B0’ÌÁ ¯GÀ:™mÇ?¡U€‚IzáGdƵùÈYauáiÙï b¼“©/À­ã(7¬,áÙªò]$\ª6UV¼ŒËê-ì]¶^Fó#@4ÙŽ¬o¼VÉË%…}Ò÷¾iˆ€weŽ2úŽõLI² 8½wgô`¶ÕÁÐ? á š ù“Ç´¦ xð€´LàÁ 2a¼<hŒeRû”Ú†V\­Èáã9ÞÒäÍ@:Ú#Dqo¦)h»@ùã²½¦a{~wÌ\°é)VÝ„cMOHh·# ?„òvç˜óìz…iTøZ’L-Ô“+Çö=3Ö¯BJFÂLôä×ÓM j¬…÷Cæ0÷b]\|'"/MÍìÚùs0p)N®Tg*ß]óUÁ‘ÏCd;¥®á+(%˜°ëG“ü?qÚž£ݪdœ¯èÖ3<é¡¿áF‘þ /®A‰ë²ªŸFA¤Î¸®èÆæX6¦ƒ@lÜÌ‘0(Çæ€ØØ!~ Bjâ¡ £úd⛼PRY<¦Ýà Z½ö\ð 6ñC˜vXXin)IŒ¤…¼V¢¢†K«g“r¾W¥ô i±îgðê²þ%P¿U ¥–™}xaˆË^ZhBþ¹Å  @Ýßù<õkE-ô0¯1®h=ÏKƒœÿ ô5™``D³§Ä;‘Ôµ~·‚HùPýÖKúpFp Ê‹õÄÒÁ†ÉGH@Á¹>¿E›­z¶,Î[è³ÈÑ'DÃ_Ö?Ž77UuîUnàùN–z¢­ÂK¹BþH;ζíÀ ìBØX Ú@ALÜ¢ ¢¨³€Hs?¬|q•mç°èÉöØ.³ÖÞFR¶4›Û/1ny¼äÞPõî72¦1\äkйa M2 ¥’­ >±LNiË"ØpAÑÁàoeSõØê,õ `©p”ýq:×øŒŒ*,ÐåŽ=Ö¾|sXR]ý¥}^g"ÔÚ%¼&BôL Û*.Cû¬·«ÇolEØ´¯½e’ šàdÀrbÐ@ÔÍ˼ñR P|Ä&bѳ@Ó¬Nò¾ðb’‚5ªÝ’¬:v%4Ì ·ÿ‰pm`ÍõèØ“1÷Ç™«Õ‡LX>‚m[Ô€³ôd…!~"ÛŽŽYûÜhŸ°åJ¾D#A°¨æ ð@h?Ž£Þ»-Ža-7É–Oèv†Ø‹G‹Ûcöóž¶ó>vWf̸ñ­‚ðád¸û²9†èR׋Þy‡#'ÿ{’œ3fÞ‡ýûíy«†z…#VŽeû k°“Šý£Å(½­fÛD¾¹âTå®–×J2ªw°<‡ÁªL:4L…ã²¾ô=N.P:Î#[Û¼TnëÝëò;Ûü“Ê•ï ïð¹ÿgþ)±ûƒÞ^¾ÊÕûßäÇIM³¡+½àîØâ½Ë÷òrûGŽveiÎxïÁxl!W-ÛÖÚü°i²fVm²5 ó`Ã#ÉÛþ§º· É.Ïë$Ú`æsIºÁA fÁ//Š±ì´²˜‰ë`+´u…€œJµ:¸A“Iè5KÏÙD¦ïók=Üþ±/îÀçèuVÏÓ )A¹Á­sÀb­ºöÓôºˆ)0›5_Èð5ôðJRº lCÇÙy&ðTÍ÷ßÊY(0Ò#Ôu‚( ZÚ•N”õ2fª™„<«Úsüg”f™ è¼ÝˆëUËÑÌä‘Te¿¡…ù¶|5 ´¸íQ¹±SÑëmTßP8E™[¨¾'6d(a?xÅqük*7ÞD’“¹%§CšrMò5nãZfk¨;¸ vÎôDÁBí«lý*À."Oþmòì¤Ñ(Ë´_ˆìû±ÊÛW„/n-H ³¼$ÿÈÖX]„+¡ŒÅ£)B¾Rr{áBlñÐYð÷ñ‡‘¢°û›>†V´«£¬Xûý&‰éÂÍ̆°QÖò!ÎÝîŠ f2P…_ô‘ìØ^ŠSTD³¯r@3þN!uÖŽwHßF†Ñ‡"XTº¿ØÃ[@²ŽÿÈÄß[-ð@"tl ”øÐ³\»¡u§UêT[ ¶€ÙU|ÏåÙ*á&äQ¹ùðv_§\öÏæ±æ ÜMÊÛßöØâ‚wâðÎØ6ûŽÛž›þ?6#Ǭæçh=Õ‡¯Ã{0¡q›ÜyþäÆŠ°Çiþ”- ›aP6¸±jP˜5ýtž3†¥èæ2e5Îk´ o@åÜ.ËTÿ‰ þPÅ?P^û¿0Kä­†¯çëcºØH J ¦QH¸“Õ·ã6 Rà.d±€sÆXg©wæžlÓ;„]f5»W¹§[–~ë«Msò=~fù’0žl h`FåÏX°=»b»&VÐç@Û°ýa2˜)·Á²fápG×}*R®¥(€K8oýøäLè”ò¾ê—öJÖQ; |>\hM5ýð’¿•ÚÄupNA3/ôý÷lÓ³+fæ{ÊÆã-ýgz§b•tOfEã’Î+žEPžEª¨ì—ãª"ö¥–•‚Û–ˆí‚Ÿ·+ÐúÆZ.;\À—VÈæ'^™ÀeŒÑƒM‚¡1ð¸åµ€'"¥´`ýµ–f’e˜˜e ¿µã¶–c´ï0±Q/€øa0bøå‘sŽÊ¥u¡4å§´ºEîE2¶1{2BÁ1é'©"צO{!Õ¬€ŸcGÝ2‚‹1¡ôkÔ"Y7¾©*&ëžv:çûô®·VŒZ]óÙ¤5v©×é›ó䜵qÑŠ€3D@#oe»–®ÀµÇ¤zŸHÀ¦ •Hb«ŒÝniÖ^\ÑÐIs$6èÛÌÿ^ã¿€Ñ*08C9úñí¯·Ù·wžÌdÜÍ0ü=Ù7’ìÙÝÈgß[¢D}m t@Q ÷w=ð£ÊÈpwò£oAD(ú¢W} G£¢@ßéP¿þJ¢ôL¯z®m%½Nó\’$£4› #DD`eßûÞûÛû·ïswsss/½ì˼̬ÍËt—ÊÕRedÔ ©Ô……@”)*µdU àP ^à¡'ïô(c‚ËË}Ž9 ¼ßù„W—L§—§‰›Càú‚„&3DÈœò<Ÿ<°¨/ÿ|ÊÏ~‚róHù„hΆŸHs똤³=#·¼évBzÒ(8!zÇÏ4ÐÇC‚SG¾ d‚tü­MúŽíGPñòCJA£9W/[‰ ê[¥y˜Æ[¹z–/W&•L Yƒ”‡'ŸBœ_p×Xf‘Ü 7çòÊ!fL¢T¥{ëI==„M2Àߣ›ª^Xô„ARi›ôœznôL†ï“â†uy“õqjë‹ã¤ ƒ`IÏ!©‡DEgj¦Í±ð`Úµ(¢ª½1ëTÞQb{^9ÃBè;g@çU‡^—ºOŽqç}to3xZŽ ¨¥0Éxä9 q>žçk>”àí©EiÝ5°Ý.¤©. æ^éàû5Õ;z7i&µe¾9eTßcn›³X¨J!ãߤ™tÊ9/´ò$øMQëÈT±Xp6uv ϘX–§“÷šJü|¤,άLÅ£[¾Itm«êCÞûöãuÁ¨Å¸)æ““öåÕCaLkƒÊòƒâá ¡ÌèäZ”  B€×ãYS'5€Â(öø¢þda…•z´óMl#¿ˆUõ@Ë}¾WÙ>=3dWi³ý)D?d±Õê‹Ä žM sž:˜Š9¼Aµ Æ+ä´*Â?HFøˆ9//>ü]ƒÿö‹Ö]«7N‘ ×€—}– .ߣ0èæêÀkæ¡gŒNiýú¿ÒÂÃl¹¬ž³d”ÔÒK) •jc­4˜‡çI•ªIUÆN©ZQ…f{«:Š59à -QÃÖ¾ϦÙùÐhÐ>4ˆ«ß;†ÿÊ„ÉSŽ®¡€(žQÕûsÂËÙ—œ ŸÅèý|ƸӢ¿Ã¯ÈÊyÍ ËQA#¾ÛU©Ä)‡„@˜ŒÛ¥6”ò=4çaò¢·A¦ª3'³ñúžo܈s‘tééLU=M×`A_uwtÆ,3o?ýyãyðG®è_æÌ`ß§ÿü8¶γgUé0”åä»èê>˜yÏ<ç¾s| árv¿>å@ õ“¢Ä1yEë8ìèVœ†`ƒrr‚›S‰éÝ™ÜÜꔉ~‰;&¤›²ð¼óŸß13é³òÐO±s”J~ÀI” Íß h®˜NÇ•C—kRË´lGHø_=ÿU›;ô0ðôbö“«Z¹!™Ã9ïÏLOÐy$¸YÀ#ú„Ç B•r~éûŽñ¡ÇÅ I,K¡¥¿‘aŽùY6<4긦¬¿ÁÀÁF?']í+ƒc좆[}Dzž+_åGdÁïFDètFæç<ÜÜ—ú2ù,ëÄ+]/ïùžÉ¢ryõÿüi×àÕ3Õ¹¢§Va¬jå=Í*/ð3‹—-`V[wíÕÒÅ~RéùˆË5ýE´„êòä–ûòR™ô“µüCsût!‡9ô:æ& Žþ™Ê‹hmÒ{ÕAßîj¶ ô€3ç/³$ ŒË/FŒï·i¸y&iL"L©?Ùª6Õ¤xÝ_/“q™®š{¾` °–®uY>ø ѵ©0ý‘ŸÌõ\°4Hxâc]ffÑG«ÅÊ×8C`µóo€ÓªÖDØÉïB±·ÙÉÅ6yLbµçÅH?š5¬­2ï¹iñ1œ@1[£=àŒßUï^Ûr½NìªHÖ±mhÉ2V(Àî,Ž4 ÏšzÎ 'ý<"ìÚ©¼i4˹nnÌò™%ízrÛÙǪûT`rÚ†”¥Í¿îÐAïVãç~|5'Âiµ›CHZ›_nÄŽê¼ðÜ‘ô.5H{Ü=uy°CÝîœÚm,%=šDºø)òõ[‡†J…%Ú"> ó~[ÿ[,T&Þæ#œ•'F_5Pƒ«ú9* ÜO+•æß L O©í£Ï|$F;R»L nÉŠÃ1vD†6>dbþ”%A–f¬ï­øÌK/}4MØñ Sv|Á÷°l§(xû[–€ë³p„,P\ð³€ä£Ö•xš—y¥"…º£jD.N%Tè°€|JFð`!ïˆâB‰ìVÔÈaNÿPr“NPàÿ2›;Ö3à±¾`]ÝnT…yô»Òïž^ÍXõÈ»ˆE¢åŸâ×õ`øuÏóSdµ~˜Õ62AaÐIÑRä{¢ˆ›¦äG·²ùºÆ6Ê'ðM€ ýRÙ{üP‹Šò%7ðÝ^p[5É2ƒÕ©€õ¾?–ZVk¨ÚŠ7¢ ¦¸RtV’g!¤w¥D3ôÛxIú(æsÁ¹ÒA¯\!ƒS!ˆ4ùÔÛ Ñæúÿ¨åç´ùäqêëxªäöŠc*iEg6pb{™vVŸ|]ÿݺÝ|±ËV&ܶ §L“B€ÅîQ®Æ¢¢¼DÌS·sö)æeسMç Pê#EYB…ûÞ¼^Ož$²jõx<ÕÕR”é¬[, ñ£Žê,ŠgÌ`rE‚Î;‰b:£L$»Ä³…Òb=UuN*iDb$Z®wl[ Úv¬ÊÏš½¨Ã爡ª ¼¹ÊP)_#š"è*låô9†X¸YµYÌLK=UO>…ˆ~—²¨&Ör×£'DÞÕG:mö-“ðÜ݈«pÃޱ0ECïz÷jÍØó¯QfÝ˦³1WÓ’QcŸñ~žÎ÷D¿2‰âf8¸ s ß¿3® ho¬’ã2[iUB¶V't…èiþ8/ã„Qz(Ú£Ç[X.ѸJhÄÎÕ”m1Öz­–~ŠŽJd{ ê)S]ÖAª°&Þs¨WS8‘xúÙýY¶ò-cS[ȸu‡!ü£EÓ€ó··Í”Y¢>—–äJE¿qkS°³eÑÖÔUÇóÄ9P!b¤G‡„žÚʰyT7ÂÖM â^{tçE)XoLb®ÃbËÄ1aE‡nÖ§c^kr. Rå=œyhñ ”Çþ½‚øpÓd¡ËÅ ÊVNå4ƒ[¡Á”èL:Ž-°4‹ƒ$f´Cf÷nSM-~ò¦ä±d¨àû ;I4©N.Lzõî]† –™dÒéz‰)¼–É6˜Fíο>ùÀwÙp?ùFÏœé¬ø°Þ-7ómÎÿ˹¥ñ´Í0ú™OZÊpÙ1LVq«äW®)YìËÓ”:3”9"<C¢dU‚SvzðÙ)êøn.¤Ê6UüX®ê4_ÝœÆsÏ[µ­4Ra¨4Q¬ì_ãÃÌiHtZÅtÙM=¯ HÄrÒÞ+ µ${’ÚÕ‰Î_¯>k´±A£/6K"œóæ/@4ª{迊ΜÊW¼¸±hTÊf{•Œûw˜:ž³–^Êþå#p#Ó—Ü eÝìÕ²_•Æ'háb[_ Åb<¬¿æ_nœP¿‘ûD¥`¯Ø[쫆¸4iLÚG§T…Øþ¯:›N°{—Þà„ÊÅü&ƒzpE°S¡2‚ €SU£ÎWÏÐ’!<úÀzn¿::Šh=‡ùÚùI·†ñ+"&á°ŸóÝxñAMÓ ¯­ï9{¤}o£0€$é`Y—UÐ_åx'óÈr{0:ùʦÕWçù›äæGáÙJ:‚&Gèv86 í+ Ú€y™¶9l§yŽ};OApE™·MÂãufìZE~IÏSÁf®)Lý㿺¬ÈŒ q¡Tx~xà¡éPwêP-òCí—®çËpµ2Ü”œÒGƒ‚q´­²¨~] Iì·tå‚ë­ë§º{µ·ƒ¿K»¢Å-¥?F)ïÓùmò q¿!ñL[\qÃϵÀkh½‘aÜ7–Dgq=ýcRÑÖ}ÏyçìÕŠ éYõx¦E휯pfñ®Áp=~,ós ÔÜ9.”¢íú°—ܲŒ¦kè_jë‰ðòBvtHg4Ð@ÜYŽŒØ?ô= #»+´ö-Ç•ïå)'(]ó¤½s…I›ä¶îè÷È$vêæ@FHLX>ÖB?A(€SB&û3«HF’¨¶»eÅÝÙ-t©»0ÓèdžùÕN0ì42³!Ú¬Ò฻¸“óuÜsÚùb‹Kr­e2J>öx°®æFà N“ÃÅ{{ .NçTÕ¿—W¨"«nÇG^[„u'ª[‘`¾rD¿H‘{£\0wŠë¨4û™"wÇyºÇ÷{ °ËÒø¯tÎ=fðˆêÆdWW[·‚Ÿykóá¢Sø:¨52Ç.,>V7RæÍ¾ƒ‰=Ž Ï”£¾´f¦d0–Ç׳¹À"Ö³+Oß÷ÐÇçwXÝŸñöb7AãÖMø¶B'E-Õ–»”¾7öë?ª¹ÿWÛQ¯þ§¾.ï¿“uñAÕÄÛ‹±ÜYŒuzézu tu#¦¤=XÞ>¤;ÐoÁM%Sä„›läy\­¨{ùÏ2^Âùm¥ûI¸ŒÉÖ¼^dnö>iØfëu'Q]è^Ã/¾ÝæeEAa`X6^Q™N¸Ò5ܕʚ5ƒ!ž™•[O„˯8–°â‹N]C 8ì^’VX%ïÖä•tKX6$·È]R³/ÍÓY3hªŒq¬íÓ×sïBUíæ-7埳a,o*Vî v?×·3»éßeÀ ®ùÍÂÛÌï²Îï™o~DòŽ0¾A)ffvú±ã{ÄÆbX {ݤv:°ÜúÌïõëDB¶RÚÖbŠ¿;zòPó;`)¬¯NÈxGªè…¯Ôj4rÏàŒ{Gš•Ž~ÅçpÁÍÀrî§V+ÿÕêU–†z„±ß"Q„zÂ_•xá—Ö6vWN#)03DTɈýÛ¸lÁðŽPdùÑ~ÜmQøNkøÁ“k3V±R_z^;§±9É=ºôÎÞ«þ®É)ÎãÛÖ¡@j—}æ1»X480´yßå—©µ`Õ¤FR޲SÔÚk_'Ð>áí“ôþôy핯L¥+§Š›=Áã–Ê‘¥+;ëqÚ8»™ÇÛù+Û¢ SÞ—ÿ1Âã>Q% G òÄ\ã!_Ÿ ñí¹Ê³A¡\}¶qV4rÚ½|ÓDkê›[„&â2÷gè»;i\ ¿îá%ªº^i)µiºáUñ;zR«’âß8_üÔÔêãù'Ϭüÿl{®¹°â—-¿ßÈh×õ4Ý'Ñ£QÔÇ0x§ÌIÞë€Öo5ìÀâðîaàŒuÁínÉÿaŒ|MÖŸê3±#å)ÌJaÇ, 5šïÎG^ÄTb¡?(z3Ÿ“š:ç4ÂËÅWåb§R2ö>ÙÛ}³ç8üþm4ñ\Âb Êˈ]Í`Üf.ümþÏïáƒ.pì\DŠÏ%Dµ—¹Õ1m™¢r/ŽÝ°V’õÀ> ç úƒå¢©ãzüEÝåÊáÙ=‘ͳI–ÒGl±C6—¦©N ‚diÂ¥Y!2‡—¡°U)›¨© †°Pj6=y—”`úˆ‘dtúûmÕa ©0þ^é¸ÿ+LRƒþO3]ï“>Ÿ¾ÍšU–0Ø$ùä¿™dDz¹Bûè?à0'¯$ýñœ-ùøñ‹WàÔÏP òm’7 Ì'‡þbštÀÊZ D¥GNêB8)žæ§ÁïxðDs.öVFv.¿:D;ù‡ öæ!†8ÎÁ‹`ëÆzùúÀõÓ?eb^.^¨º/Ô}ð‚³HUÚœ Ï`ïíëB]ýfƒ>0+ âŒøaw’v]¡²ÉBÛR üïÖRça71Í€,ü]/t˜øº#÷©Ë„N|Õ³uÔÁÊɬ½Â·VËq§íÈÊ5Ž•ùÝ&Ev»ÌoÀÚ,æ§àXB•ûÉõX@Ÿ{ûß/&c2&€É /H1÷£'\8,ÄoÙO¦ â»§ÝÈ-Ó‹˜Â[¾ñdUz™îdÃk¨¨-æ½ÛDJvváí_/aû9#AžˆÙ)æ¦OÏ× Nb ÙªNkIN$ô }ø©´£~m'l×ÔA2¯–ÞïÿáAXõ:ZöÅĹJ·®ì_R¨êbŸþÅ]©ÿ¯äÅÕæÜWýbúi{)•8ô»Ú’¸•ƒ„õ~ƒ» ùž*ô{§Ž¶6Üêò«ÉÆ8'íZ€—ï.^Û;;ª`ð{‡3WÚäýnf*UtÞŠèÚL©Qú$8ZV+™¡{×òõþ«ý %!«ûÞéæ>ð¢äÎí*íô©Ægí0Q$T¿ÍÕÜâTÝîàs.Hþ3Ù¶ÌûÐj¨»ƒM?qžé~dĸœÓ:(ŒëjýëñGÅWZºY;¹önåÿ¤±üŸÔ–ퟓü&ÜŒUôØ’\Ä‹ÓK³Â%Š ™M<ú¸#9ëÉ’þtc:áa,²ú¦îH—GËŒÿ\]íRxßpdY¿ .;rÖ¤U²†,ó’g¡f±¹H¦ô’¼e©åÿ‰K[0©NÜ‹&Lb÷K})¹Ø6ûP ±­·÷nQ˜§_ÄðŠ5±¿­?u§Äeõéô÷•?vˆàeêWå©ÅEÑ›£·<¥‰¢_6W®¥Âö!‡“> )Ú¸ èw/1ªËÄÉô³øã"Cû~³ñòŒÕ ‰¢m{/ «6¿u/%*Òpéså°ÁûìEŨDˆp¶Ý8‹º»”¢£G–éÊð°«ãŸ.lü¥ÎægLeg~ÝÐŒç°ûÍwŒ/õOI´Ýz‡X:ñªìôïÎu²Ê!µ ?‹É<¹° b~<ÑÆéFª´d-­eyãà]Ž<ˆSÄ*ëpƵ|·ÆËý•õj:…[!™qšÕZË)®‰(Rˆ›Xk‰Oõ¦ßêï—Þ]Ëá\GØ ä714H.’þ¿‘w3Çx2Ãh­þV˜e“Ë ÿXóó—(d‚“ Òšü–2ò7è.¾æ<¢Éð¡ìbЗbÑf %†Â;™¦E<°%» ˜,Jø î\S„‰Pª‰â\Óôƒ•Í[kej­Š»øµ㸬õ‚ˆ‹Ô%MÃ#20 Ó ;ôrûµÑÒÆµçëV«3ç¢WõRÊÿÚÆéœ¶·_!âdͱý·:œˆ]I\}\M3* ª@Ð;TÞ* ð i6^ãGx>&Àޤ¸Ž: Aš¸iÒ9Ÿ%™¦éÞc¼ß=2ñƒÐ·&ãÿVßÉø-tÄ_»½oVÄïå…½¿Ñ8Gþ¡w›z‹ìÃs•®VÔÝí&yü/xêþ@µEþÏoRœ¸:ˆ¥voü'¦ #þI¾Ve_Äk€fû®[<ˆA>¼2¤bÙ1|qûšÄËf}.%tAmÁ¶ûÞ¯¶ÄDþV¤kZ–9ŠxPYçKãÁ¸‚;°×ÅðÕ ;¶š|¶6gœl¢…¢ ÅÌÞg÷ c³6 Ý*EãÜçé æžÅ´}nfû¬Hëa×MöiÜsŒ¤ÛD‹2ïmm­zÿÊïO'*ös×÷mƒ)—ÏÀENlº’<:!Fíÿ'ƒeÀoàøÃ§¦¢o–}íæ|ªÈHa`ä=0ôü÷å E%ìŒÎhî €‘¢ŸqÈõ4œt‰Ïi†ÎGÖ£;:<8}´äÞ,Z#ß@LB¦á.I=ÔÉKñB ¬ë7.›Ó‘ÆeÌ”$RR.î À Ÿv”jd*Õ1s©¥LT-ÆG`ãq‘LXÜû²øÞ>Î"3¸½erKÝz¶u2 ˜=>tnGR›gËfœ×niÕM¼½ÝQSa#Wb°A1@Ô¾¯L“ mþ4óͧÕÉc{-­ø)jR©´\;&MGí@® àVä(*d2Æ}„þ”Jút•ÊC¢°Ù%]á©ÌÞŽØÇþ}ÔÆ&¢Q4z‡¼°¥çôñâe/™×†!F^è öQ§›XŠ×Q6µ}ËNå¯o‡ n cÞ¼”BçÊÛa>5ÃÉŠÆ, ¥e‘´$~ -m?¼Ý}Y?äÁß´¿ û­^ÒpWíU×þÞÍ9!Ô²H—Ÿöb£ðn©hunºoæ,§þÐ'†tFÑÊêÈ€þJ 5 (,²>ûHòØ×Bh$?dÑ™TÆøü-ÆØé]w®VBÍù>ïTRA…’„ÂÃñ³ºì?}J´Y‰´¢Õwæó.áI~v@iµ]e¥¥¬³Å¼ÁèEf\7]Š6 ®HöS;¹®aü‡Œú;œ9J_a»èñRÝׯ4…¯D$[éåu'wª¡ÉP½ÄŒÚ>•>W$ Q~41=ñ!§?gÒ)­e;mQ½äìÚínJål±¨5ô®@ >Å,W™ÃD§{œD@ Òf¯ÝPö\ ÏZÆK¡ÄÐöݼ:ÌÁ¥Ô"RC[²Ž›ã~zÌp¬-¤O³cpëÓÔF²Ã°…%’é+¹}%5@æâÙ†}fEàÞ}ªãiÔÌÊ|Dq÷÷ù¥Ñȳº…Ò k/Á}Mݳ7¦"+ Ó8©®¯*6†¤·ÕŽß¾©ä‚„ñâ¸øy3ª6 y®ì‹ÈÁ²‹cùpœ‘'áá¾Æ‰¡_IZ*m‡Û#õŠðÆswh§pãVZl©†Ó¥nÍÈL\—£Ãœ€‡P·m\u¹€¨á7I!c@,˜Ð’çp<´€(½'“¬dŸë^h+a¯–ªa€8— Ú»jg-²šR˜Bìñ¤H\“:d(Ë”`Y‰Ë*¶é©üx käÌjs€{iÕ|Í8fcôHeߪoìÔ½ã,µe³OYò¬à\v§Mr• lïám²ˆÅÅᬰLU¥Ü U*4Fð”·NÞjUc&D¢Žv râ{õE~ÕJ¸†¦d®qéð5Tðµ3zwˆ¶Žƒø –ÎÛÈNd‚ u"0þrŸŠË)'9ÜÛüV~Švûð:Éð•fšaF‡ñ³–ÊgmzÙËM€Pšd¹ÌÛ=ñˆŒq+Ý¿¾Š}`‰”µoú[G²ÌYÚ,¸‘ã¸+;<û®ß»&¨–äK£-æØXµ>3fe³y‘©»Ø;»6XGjæbÐ|êb5‹w…¹6„Emà5|Ë䯦lÊJšãûÛÑ—=Ž®ÔÝ@¦è‘p³‘ã™Ô,+˜&#78UOXm)½¼•vUì^ÜÕ•K>Q&¹ŠÀ m † ’’>…Zå¨Ù3ÕÌ!BÎg7jŒW«²ÃvÉŠþÌ †?$cg`ä –¤(Àµ£}=ëÞ̳5v`¤ÀÏ¬Š¹W n¥dCíÒ7ä [ÝšËúÐÆ¢˜±´KWÊöÏÎ+‡êrBìz@.ƒŠ-”|(8•éuf+I7nboÿo-¼wä8Å øé" ™úk ô}sÈ!õ"õW¤¹Ûè'PAm¸ÇtëÙL \ÁÃS¤Sy¹b¯JϦTBë9ýH9Åú’œíc8åI£PüÀY;ýWÕELŸû¦Ä…‹G¡l{Üsž‡RltÊΗþ$¥‘.]öâao}œRÿÑÔsI=ðý‡‚Ûc1uã–^%֢Ꭰç%ˆç‰ñ|1ÌQ~•Z R½’f%±ô_$sb࿎ØEÁJˆºŸYÖQÂJƒšÜ"ÃJçhûhܨ² Ô#ÆJç +i¤’˜ó±ýPuÑr’9*TÏmޝñè,NÃyi&¶9©›®…cÅxaÇËy꯴áPá½Á ^°âðp§ƒe“rÕÅ×B´ ‰Ç”¥ÄžH§Vql–Ü%ì¬~ì/Õ2CZÅ•ÛñÉ=¿KãW%Ð"ˆ`û@ ÿ"“š]¢ZzÒ¢%øu<öìI .±ïÅJh6'‰ ¥Ô­¢Ü1¤QkÌü7šÚf%;ªÆ¢öUdFöÈÚVk‡~˜Ò|“WˆŸ%þˆÙ5Úì–qúÍ ÖeƒÓ?Ï¢XCn¼©àrTù*}QÌÃé6Û‘ñª¬4F–wAéÉJ¾í±‚ÆÇ•¢Œwö3%|H‰i_·% !n†(£üÑÊøùq4_Ћ3ÉŸmÙ€S <|—Äy8¿žËüv[|ÈDæa@vÂùøôÂSFZñ:kn%DI±F®µªâð#'V€×0òûNá¾sps¸7««€Új˜ ÏsÐo†ão“´þ6iöÜPS%´ä¦¡±…üæ±!Ò(-Ç{äŽ#éŸqÒÉù…‰@Æì•D@¿ÕgšÈ%B¨»K¹d”L©h;´_S*&”ÔëÑ*ÍŽ0rviB’È‘âÎÎGic«ç¨¡eÕ£ÑýzÅcïH°¾J¤l…ipyq¨ ºI¾Í/®;« -ØÕb £`ÄÐGƒÐ£•¾™…*lQ•fÑF}ëHÉ¥df_€á›ÝdPHÙ/é Â9%¥s!â†VFläš#ð°˜^®‰ ÔkÞ¼k”ªXŸê~5ŠFéÀQyÕ–PÝRÁu±´÷ᦇ=˜ÕÀŸBcMp'«d}g|¸) ÂÀâS×Xèä*m£­Œû8àÔc¥1¤1ÿnÂ7%0]A‘­×tŠâév/³æ¥Æ|BÕ(±¿ËÈ­ë¦^Œ?öf¶¡%·r³œ ¡Ï V ŒZîa§©êyB&Øë`y2=µ®‚î•ãðD[+Li÷ï&[_g»BpL@¦_‚PD»Ä©5¿@“-L¢#—{'šj확”GgœîÂæ´æU Ú›_☊LŽûSkÉ/ñšbª#)Ñæ(Xb!j!~¢ƒ›" Ú)m,FwMìN…#â+Äx(¼Ù;#’%œ7™¾°4ˆ1™¯=™ªR@}éÝRSU†ZŒ˜qS㻩UI0>©™˜p²÷м“ÙY`2š¯V¾ØWW/Ì^øeDÐoUx‰ØPëÅ’ÑX±åà­M}$cÖ#5Ïu>O¤³"ÎY Î[7§§X_7!ŒÉzÚˆµ…Þ„µ .¦v,y¢aÄO,‰š”’{”÷;û=[4PqÏœ~²ä*ˆT\˜·k°†CKèÚ׊î4^%WµWˆ‚xÙsB‡8öÿdPo‹®·#lÚçp#›ÓÐìð˜ú™ÂocŽRPeC‚üØ9jêxE¥ŠJÉŽaÞµ…´ÒHf£ºô:ÉÒ.î^I§Œl›BMËÜÇä$iù«‘<üZœÛ--GÛÎl`ÊgMA`f”ÎLÍÌ"ÐÒ¸S|¶§–çG²Â{ï¼À]=ÍŠºNP! œ%âUŸ@"0ù÷–<“ ‹Ë¿° Yá ¨‚÷²3$]µ Pêbü¯Ô£·®ë!æa+¥Ò•0¯IH¶ä’°FŒGò’¥v³k2R­á/£fpšÞ°ŽÎFÍúùg!¹Âs ½pLƒÛ Fþ'\t+pœU­ÒÍȺi¢vKý‰¶¦_qÎqñƒÛLîn«Š4ãRñ+j=o²!ý¢b õç±ìL +LNAj¸xN/iË%¥4ÙHwè{¡ÄwY %4©ötÓ¾"@п¼¼1£òà ú߀§Mû¶ÝaõM]’ä}êëû‰¨Åʪ©Ò\ä´]Í®²žî«ÈÉ>.Û3ŠÚ¡v#éÏíßcqS¶HVSžoŒ‡ù¡ÞFËOçÝÄÛÁïcàç©^ 9oó$/I»Ü׎[4“"PrøE_ ÃÜBßp*9¦ø¼6ò¿µ3†¸sÿq *ñ”%!$ði'.îcpKAÚ)p˜%¸XÊвýwŽë& ia¸¤Q冣âeϱ&"NçD®QÛë4°tþZsš>%É1¸#%w¨l–´…ƒXj`ýÖÉqÀsD¿3Î)™«I^j®¼8Ždô<˜L?V¿’cwX`ˆÑ ™†r?þ?¿ “wPuËM~%©Õþ'¼B¦aÊüÚt-UôÙ%áLφz\ÇŠÃ^á= 5¸O¼ÍÞŠMx DÄp³ðƒÏ*-‹ê_ ÄØGIó9m|²¯ÜßS1Mj·å“ŒÐf©æD;wß"T]\:ÑÄŠ²Ô黵閞º‡ý!C\BšÆM« 9A_ø¬ÜhZoõ$—²ªT¿¸ÐP¼vh¬Ñèß¶D¶è¼«Ç Ø1Ý^Zå¯B&¡h5 M$fEìè9rÇT²P Ú,ÎMÚ.(×Ï}DkedUŽ‹m ý%L>= ZlhCÐXEj—Ë—¼›hE`6ñž…aÐ3üÆcÙm©ñ]7ê9‹Œ×d¿@³I¸ "½y&ŠÃ„fqm#ãË\•Àž­íE[P^$x÷)eïÛd €Qð•Ü•‡šáz†—–-%Ø_”™| ²¡0´Jb1K_Ñ€B¥uz-%ŠêpbPÄY rœñ¤¨ÍœÖ#A~¥ÛXØÄ”:DÇN@tÜëu¿Q7“Ù;d+÷J#Ôe^\eÑbEŸ‡‚#uŒÇµº…‚•KµüATƒ„É9= ÃøÎËPAª‹«r9`â>¼`ˆ×{j,…I£}É É%q÷J}C¶ÐƒTN…8d8ZbI°S2¼h®…ždfI’­è$¥®~x9»ŽBïËösìšÛ1ü‘g„;CÏ!øyù^i³Ÿ¶æ…HÚy•› ÖÇUÁM*ŸKsa—’ðRÀ÷;ë‹‹'¢Z±qþёڸ±¶ì9°½çÛ‹‘/7ËŠèô<|+¯Ýµqï­åQ©|/|á(½p!Ъ5äȶ=~[jgÓ ¡‰›íiB4aš°ïqxÔYT.ÿ}~˜fD›£|GÏI=öƒoèG°3³’µB"ŽVF¦²CÍH™ÊiqµªWüš›ò RŽÜPq¡ Ù´¥d.‰k„%Å[iPQ[Ý;Nþ …sÏ÷u‰i¿I oÈ×94lõ`ÍìT6=Ï &çÕ¼ º°ºAw€é¸‡²ÛÁ“ý.^Ó°B%)½HÍÛÂa,7' I_lŽÔ²5Ñã–ÄGŒgÑ˾)'h”ž“îò>G˜Ëù;±9t;ìÈwø˜¦wÉ3&¿ª¹³’ß×QÞ¡Õ [‡ý›à5Œƒ‡»\Í¥Ò;º¹w ÝÉö¾ˆC@Ü! Å‘üzõ;'_ÌtPÂGŒ –&’ìÉ­gþ+€Ç3A°× bã©8S¾Q;QÝ'õQoÜy‘äå]\î´¾‚ŸÝ£O´Þ] [ˆ}Z…b§ÞÝÝl~ÄLîhÉöõ¯ÛðÔªuý͈}ˆ/¤[6Õ(å!à`QQ­à™oð~ÉèF8à§tÄkWè€|Ê‹¼‹àHßnNp5½~³$ϺÛNh£p©>gâh;U]5ñ…‚ïˆFRýÚ”Ád3c@2nU®‰I5º›Bü'GvYÉj-'ƱQ¾›áBC ëÍhe ?Ißgëx;`f¨lFû@ý8ω³š“—îDárï“H’Üݽ½äo@9G¿ÎA…uG …P[ûmH@–ÖPË3RB+_ùàH[me+üZ¤È+—™@‰ËÕÑžá)uù9¼¤dÚfˆ„À¬Ý÷½Ý®¼‹+¯»Î9îöªókåWÉÊa+…”̶‹Ë3—®uåªK–`ñ€ˆxž@x’çI '€@Àí'„'Á+N4 ÌÂ/6"а.ƒÕ"V…OLýß9GÇÊâþw§ ŸŸ+qd¬¸e2ÄJ"N'c˜% è ¿{Ç’ŠãÊÊH˜a¦PbƒQq(i`&L0ÏcÅåä<˜ê’£*£:oZ:¥Y`êÜjrW™J¤Ò²,NÆ!—ú ÇÓxgôÖo[ä'6ÿ#3-!²õ%R(tK®à'ÉIV1¼vtÜP{†–Œ~ÆpF’ÁʲRÁl(ÒzSÀ²° 9B1Ø¿f8,‡ˆU¦`†óÍ&q˜4•´ts¤äLÔ pNsÌDM# Ã$çRÙ‘ÁÆßgïêòñÍ2¤¢p)u¼Í¡Þ4´By™Åi6AÚ+ÀBª¬::˜’ý™ 0Þ¼Jn"W]¨€KšÇ´Å@‘TiŽŒ4|¤F¶QaŠÐÑ*diPµ}ùUªÓì'«„-•1¬®¥ˆÁÅL}"P$WcòuA--%#'¤ŸNΔ~U>}.VP¯B¨‡>—µ¬¿âò$舺ŒQp•Ì1ðÒ6bŽæ¦ft· ïú{Ÿ¹>2@à6œÄ¬|^­²µ›î¯£ HRJ#d3ݱ͈ȟÍ?9˜¨9ñžMĪxÿ¦æãL1NuO°úî-“Í96Ƀ­·Hš_QQEqyXŽ …“*ˆ|ë-¶âDt$GæÄZ¹TPÑ#—wbHP`.Ž: 4ºø©&I ب°J‰óѪ>`5¡ûbØ3=áîÚÎÆŽÃ3G›æNLåÜ;¬1:µZ Ó|ºù’‡S­ðø­ßÐgA-V9+=;X»9òV Áõshc;Ú“ŒlÍÃßyO~>JZB!¾PÀ×Qã—½%HU¿°¢›ÁØ‘ÈsœdôW[Åvy c¤G„f! ;_$ü°Ö—x &ÿ¢3~À»¢ ¸ËXì£5ãJ£BäåÒÊÑ‘¿¥ÇÒ‘“qº –õé{™òK’±• µf„µ*£,ÖÕTd’Ïš ”ì«—Ï Že‘eª„ßÉÒÒ bpÑ,d´B-‹5U7ßê/_…¯ézäN§¶8*O ¶Žbo×à>ñ2h#R2YÒƒ{,šÏÕs7Î÷ÜϾφEû÷ jÃõz¾6 [Q¥ z©´Ð¬ ¾I~T öF㫆Ž"8bfÛ<Ï8}ú3WBSê[Øv¾Èœ7NÙvuûEÙ,>ÃÎSÅzýÅ «×8ëœpòç¯0û¥°Ò|]Há¼R­{F2o 4QÁý¥¦>¯áÊ3šo›,EÀRN+ Ï:މ{<)cÓL®€U›è¤.h&ÛžýBá×ÓRZ–ò…i‡öQëºà¼<¤¸¥··és%ë ©þˆ“°w¸«’ðV¡‰Í^Çúùñ¬µÃ)­ûÛ¦NJ $kÏð‘eäÞ>ø!5öõ|gÙS?Jzß@r{•…ð.ÚçŽZdìwA+Úý»¾]k«–·-¹—è¤èÂJªß„i,+€3YÕ¤¤ ‡è £›Kèå $Å\¥l9­Ä}N†ÈYF4cµ¤ÚÛÞÓg%ùm{ýÙná ·øb(‘/œ«/##E’È"ÊJÉ]sœvP³e©ªÔ$VÌ÷ ˜b)ï%žZàjíØ\8¹X‘oÍúXhCš!òñ:)÷\$ç ü£uOñÍ®³jÔGùaOßNª"ý¢®F'{WýëõþÙ§†Ïã–^ ‹‡Ó à¼I‘t“Œ†Y²v Ö(Oˆ!týMo¦Ä±’1%QÈŽšb•LÆG†))’Ö¥'¢½ñß¡¯h‹üÞ•MÁH×1 ÙÆNäïÆŸüfFÙ[R6TX«Ãá‘s³dŒ.#ñ@ß6 !UZH€% à ¥]ïõÔ*‚åõJ—l½>ìZAG-ã7E’Ëq?8µ}– åÜ\&„ú}³šþÿß6°»zù¿EU}+oÒ•&ÿs+ÁWØ1ÞYß}7öEJ˜ý$1®2ÃS÷ÿ¢Êjß³FoLp)|ž1‚¿Q{> ^kÜàjIêÉvÚž¸Ló_¦,𻄗߻ڔ¶Otö¤7’ìå-û´¾×¡z"­v#ÝÍû¾î"ô¿?[¡¸ ¨ælÐÛ6å„çç 1OÜh«·d.äˆðà`¡»”Pc!g7–/[³ÜØ›°—~.8ц—ªŽ€™gÀÝ#>VXLøÒÜÂPú¾DjÖzµÅ©J©ÞTwUP§ †7r|U|ÕŒ4ð Ó??Ï¡ÚI(¤hþ(_í¼v“ÏÞV7%øàVö…²¼$‡é ºm9 Štè¾>°¬ûXÝ€¥¢[}n1-ªŸýü=ì°@â“?ñëªlÜàð{lJaFŠ·n˜–›m®æÁÚy ÛeÅݪë‡ö@å°¦O>õÈ÷0TÏ÷ ò²6'ÿùj¡·Iˆ÷Ïžx·ÁçòæM}a 'îH¤Â¸®FDŽ )Y²pâ¢u ÿòÉ\ øºàšîß­|z8uPHG(|Àcc$¢·ªâ Óy,¢d¼á|</ÿR¼§¬žBày'“#lΑ ¨ç^ï7øÒNì>‹ZÒ*O¹åÖ„ ¹Qˆ×5Z¨b¢èU«ÿÂN^Õ^k¸ÂÌpýš â9tâ»dßÏo®àÅ)@j°ý2Ǹé‘X™ØÂêÅgÅÓRùvø6 4”Ÿ(šðpì–ô8-&$ßSõñÍoÙ›§øýéb?µškJì%Yœ ‰wÇ݇ùÉ5úz;·Âya.úY;” +ñ—:Q#ô ´ãGÉÄE©W’ÈbÄŠˆ«SÞKßX1nG&_ÌK2GI¤¾ðO&ÈE•˜ÜQ°ms†Rù7 v–C~ãz 3ÉMÔß¶j¹ËހɼK ™|…˜OÔ_… ÕVŸ¸ÿ¸9²¼ Æ“ßxñõãŠ+Å3b?̶è˜ßxø©rAþ¡OÅ&õ¾£ï¯sä§¾÷IÅ;ì)›;*:·ôøVÒKVäùFq¹§Š4HÆ*¹8&£•OtÆÑóI`èýÇá|÷i?h'lB{¢´ÉðdÌ÷à›õîIõ®çŠiÔÂ÷¯*e³Îéµpê‹¢º9ÕðµASê¤F˜ãøšN°“¡¬i:çþœòí«ß€®[1] sO„Ïï÷×ê0ÆP½ë*i'Yï©ÆB„g7ÊGhbü]´fŽ(‡jU­5Æ]n`Å1°ß[úf€‡("¨ÒÌÖ†€‘¢"@Åãr²¹>üI߀~y‹ ÕÑÉ@-µùP×E“ˆH–ë•(~ëNîŽÓ‚סÎGXª½«V蜡šOQY—Æp¢×š/Øžöt.ÙŽÊØlB·Ü“)\NÅnxqomc¶.$YÝíTÏ®[”¢\(œ„ö°ï’y×¼ñ×PÊG}Ý!©H /K¶~dÚh%eÜ­‹nE÷F-:ùiâCý~”uãp©îr‚¨À;*AvÊHêA#ɸø5§ªßñ½¿ \IÎN®)¨ˆh$‚Òu¬æÅ=™N»åþ²Š6PÆ«X×g–Æ ë§ˆÅ*ÒÁ n¨ÖGù–Jbz£+°a1o)YqÏŠ¹VŸ¯«ÎÊèÃ]_Û píºmcÁÉÝç'ì²T#.ºN¼:œìƒ›Qÿ³ë#4¶~×™¾>Ƨ] ¦J‘J‘rýø»·5üzyÕÆFDëXdˆ ¾+ó³w©L•â`^‹ôŽ×ãH!q³¡µ>›íë•”à°1ͨQv+¼VžªÞv!n–ZjgÎ-ªšÎÓ°lÒ¨[“.% ºhÚ²Ò’ƒîC­ DW&Zñ|ÚìzO«,ÙÖ¡: bnx½Ow§ï“H\.d¼½·y¦Çô>1š,GDßö›½ø\º€ VJl¨¾’,p¨­ðÅö-¼r–´@‰ ÒNsŠÎOd¶f‰‰s g‰×.â“‚œHC¸(è¨NëèN7²[xG¶ $ìŸÝ¯ÆÂ5µ¨¶q%)}÷µkŒz¨î!#pÚLM6õ«wî;³šÓÅBéêë ñ­o™L6@\L¬9£~þnêñ¢ðÒ{§8H qùëìuU˜];Ž´>ÎðœÕˆ›êñ~'×pþ_¡ˆ Ñþ7¡ý}LÑ/ewÙ'Øõõf_Bñ¢ËU±9DÊ.®}¿o»ìéŸW““5ÖúAí²-éï©§…OC[>ÈöѾ÷ 8A^>#¥³†u©Ž±¤„éݨþ6¼¢Qõö!¦Gà×{Ö(^*w §RDÔó$±ìÝrA’\¡õ‰z7¯y.üàjÞ*üz(]»\K@$½½2êt†…%zÃå(²Èh°×¾–ju‹½®Ý¡œM”ªØa…­u“RCª,jŽ–¸£N”­®BRBø5±[é‹´à1ɰ¯ŽX…S@¾}P[yaZ<=Qgù‡l〛‰’ü=™rŠÉ³‘vñžh²pËBçwÀUôÐðô¿+nÄ“Œè©êÏ÷/+³õâÙÂl³:‡²m¢µa¢(¦©îýIJ4é/›*º­ Ü[Þ§6ã•Ø`­#Cà;˜;Eýn˜GûÖHmþ·ª$˜?ÃÛZq3:ø­zÕg·F7¡­Ut¯˜©{b,›vQ£ÍP—3°ñP±ðó0þ-^òxùÙ*@ײN/°ˆ0> “Ün[eϸ|fýÎJ|S? Ó9ÿºb¬j H»´³õ!ãðÝ:ž•Ö»åߣÉÓÞbÁEk¯à·E–¸ºh¸šÝÿZWÅh ÝVô zFÀÓ»4òûï}æ‡u¤À?ýr³Uê/ €z¥o]\T=žññP‰Z”kV#oØ×Pe{ w¯¿×rØ£À¥ƒléØ]­!6™¾ÿ>þ‘7DgÓî›MÛh޳H»¶Z@Q%³£§àaËQ6Ýû³íÆ¢ó1$é6a6NK÷ΚÏ}"f%&;~ÅÙCt›ÔŠßÿÏ¢D9|šøÇËóÖRmeψu4£‰³Ìè!­2ÚX»óÂAZJTz2mQ«ø—i´±zCÍÁý>¬Øôª?/Stúm~¬T|tËû¸µ‡º¤âìáÒˤÃC~3,5k(Ô¹—§iqî>ÈnÔBy²økr¹±ƒ[R}vÕ`1ÐáÕGÀ¡¼Ð¶!½/ꆚGžnÏ·5ý`(y§@‡ÑhMœvЫ§½—„A²ÓWºžË+Y¢Ëmv5%"6;¤©Ž/=jmÍdŒpĽ޾ˆ™(´à{eƒXÅRr’Þ'ž ž TÚH÷<djÑi¶¼qùT¢Íà?ÃØ^ûâY4XÄ9b^Á8AæˆéjCY×=ai> uVbc~OÂ9¤‡”\s¾Iœ¸ÆªDÞÝœp˜½8-«) µËËÈWùÑÇFJVŸ4ÖŸwÕbô<ûú“~¨o¯¸9J» ñÞ|€_OÈßñã`îº×ó©htø?÷)JµÙºÌPyš¿YýÁ™ðÑT¨':4$=À»@ŸÄ0'Ï% W%’”Žï£YQWGÂ9tY1ÿg^LçHÞGHÑYQRÕ®D²¡òvîgÆÇºs”•.t%ƒÎüÆÈý³‡Ž2ðèTêcÆœqÑÛ¢Ù`nWø'ìl¹W"•uð•NÄÎÜbçãgÍu´r#ðœíüɯiwæž"+¡Ž;K ˜ñÉÕŽvkr[Ù‰OY´Àø…~~’bó·Jï0 Ö‡/B•¤3êvGãX%z@W()îLí=ÂÈ—çßMghV¾»´x—ýÄøÐ}®41‚¼Ó™²×:ó| è÷B®udÒxx-8üöf¬ÏdiÂyɥ™ߜàõÊo’uãþGŸ¡½bÀc j¯ O¯X¥-Gddsªn\€#£¬ª|@øJ¥ÎÁäJìØ~@³©UïáOõe¼3ð7~¨j}I„¼IR«Ô¦?  |{Ê•"‘ÉæIŸ¸zL7Õòü¬ÛÉur™ðaÊÜVö¶ƒ í”s©Z„©j Àt%¯îçBðŽ·ñYË|z×Êz_¸˜éï 1„Bâ^ç×4mÿ»/Ø7 RUVðŽzL¦&’õˆ0oødm OÁÆâzæ¿Z´õ¡Jmö6ª6Û~’§¬gc³ìšQ~ýàAí÷ú·¤`4Øç€Ïá?‹Õ}~3íãçw‹ÅáwGþÅÃÈà>âÑAÑüÆ@Z ¼ ^TxÌÞØÃ÷ÐúóðN÷O´±‘íàËgÜzg½c4ŽÂÖ' ñÚûÜ1DjaÈ/ãÔý4³‹·Cƒ\þÉ÷3€cäüS>G†Ù¡˜‘àýpP ìo—ñfÀCqt%¬Ù^ ; ƒé Ãñ·o%a'5ĵÁœ åÁ2ñõGÍ™snƒ> ø°ÛpáŸÏlE˰F•Ûoë-eBÿì×ÔÏe,÷柳½uæð!œ9Ö+;ÒG¯º”]8RxÀ߀RòÁ"u*Gf¼)áÁÅã@n 7;|2~ vlsn¡¹¸fèÍ/Xï–Ç Q¨èÍö LÇê«r»¯²¶¯å;í]bßçêöz'ea{ËæBθyörfÂvÝI{Ñ®õÚ¿Ê8<ý¸«là(Pf`7XY*-k™<묬ÎíÀéÚ=%°8ƒH¤¬â#x…ó&¿ öž{Æ–—·-¢ºDÂy‘,Ñ;ïú‹È[¥.–”ÅØˆHè>´¸I*P¹f!éhþŒžÑ1‘4»‘îܛ뜫Ù/’JB{s©ŽÕX‡9'®ÈI…~3ƒ³R‰[ì$)mt rÈBX›$áÁv%!8>äÆëØ×û—|¬Š¸ÕIL›òħà@}û·%kÜSíu¦pKûeÏúxklû…(&OŽpß%ݹçïòÝ G´y×B*¡7qR«÷1 qœ=Ê›€&)Í8X¨Åö°yI¢þ)’µ.ý5ý4âÓWT¬n©Gì˜ëN=zƒqŠÒöˆ-¡/¾G.ß´müvÖöfv»±]lɺ½ØÎ>y‚í»°F·_Xt–3ÖŒäN¼¶‰ýƒ˜~©{ódb^Nl`FR-µQ“@‚//囫Bÿ¹¯_¥ÊN¤=;gßß r§CŽÌ&Žf·{jèþ´Ø94ƒã™­Š}NÂYü·v=« × Lz;zÒ ]ÎdÀØx¶;Í®d)(È)bŽ{®Éž¸é›{AŸ¼¼ãÙ^s¦Z;~gháãehÙ€Ä úèãËèWIðê…—õÈ^ç“À ¥áGÈl¸åj‘Z+{õRÍìá5ÔðQ$RvER¤0¹»Áíaª¾hfAqq±6 ´âÐò¶õa`~@ùO†.ÔèYQ7á>-£³oî?CÖÆ^溽#ný#˜ã˜I¨ÄFdaYF .ã¾v¦âR<`“¥‹$Yòš~¿†"J)ŒÇëa™ ±,|áÏü_ú¢hŸûýŸ?°¶g<|4Nˆj›U“œ÷¨ôíAiNBu³mµ Ì<€Ä4óElˆÌß™"Ì»úÚ6@@ª<ÒØ¸ýò¤GÔkÑ™0ŸQ„lÀs’36ÿ&ìâÖ…=!úñ<=l›¡•.Ož°Äì“uÿèyqŒ&G]ÄI«ûŠþ}ù±•ôéêf‰_”BþyÙ8‡ÆÂ–‹| —‡!á4L)u²¨í x»vÿ)í1 ÆÜ4°yo૯—Ê/“h”û%h NÄb2Ëš|ãCÓ‰“9„z?Æ!šþQInÁØ›dŠL.Þ@ þŒÚk™ùbñÂÀŠŒz8aÑ á2iCü»KC«Rt™Z5£àŠŸ:út¨!™öåH'P•~üWjEYˆ÷#®1¢ Õû§=h?¶™‚t ýurmÂ4–û¸>)|hí°“]¼Û¡&Æ×à÷'Èý© Øžlù_qè„.„~½qp06@ô¨Ys–Yûg„(h¤Ðx;.‚;™¶lêêÙ/ Ü1ƒ~Ã`N æ¶» ƬwKÚožužÙðhDQ(p 9b QÙ±®ù˜Aá O ”Ûô8.ßz R‰³¦_уn’l.U‹8¨²1xqÆ‘C ª©‹Z¤¹ŒÌ@]§jd9†SÑ%šªA¦ã,âJë…ÂýB+j¢lCÖ ¨Obg "6/ê «ÈðÞ÷”ƒž„jîܧý9W —ü R ÍL+<Íþ 2À7Ûãl„=²ÎTŽ!Éb¯&“d݃ãÂqu»,¹vÆi£$¯¸ zZ%ÈIC{€hbG^“q`šŽ´·©ÁjÂÈq˜¦¡'° q‹½3s{°Mãúá5Ûž€?Éy "ÝBõ­êD`ˆ….<½h Î[Ñ~XbIèI-äý"x Z¦Ñ"øaˆ‘£Â£»k†ênù ˆ‡ºåCN>}ùlœÝ)øã ¬£‘ùPªºnPÑÅÅݼ·9>X aDL+ÂvvFDD¹%ÖºBué- ¶ºåÂoÿü_ˆÌG8I¤Žð.?ʦl NéSã.C§C …¢åæmb =b{} éy Ï"· ‹6è’B=Ç»ˆ>HƒC!¦æ=PÑŸV˜DA±Ú<¡î Ö±³& ÷ wp7m¯«óO–úiÿœ!*ý¾Êjô*„U0T¼Pµuqòf3Js››;1xY¯u+PÕ}ZçÏG…;Ì4š?Ê«eã!Q»KK-䪒RýÔ"…Ðo\ˆÝŒOÑ Û‰ÐV¤t ¶ì7ÒÛ½#ÊzI‰€¥É®HE`í×ÇÑ]t:2q0ƒs™‹°MiÔš5!ÒówIX.®V²ˆ{DÖæç"DBV] SP*Ý®&CMÀ&WÌ"J6'8Y‹@Ÿ!¼Ù5„@L}-Úmçͧ<8‘ma#‚Ñ ­Aj;al)3çz#kn­l²Ä|Ä@(‚®n:Éh#„D»²Äãsî”Øb_‘ØxŽ÷Þ ˆñ"»%˜wpOšÑ‘CÙ0²Ø0ÇÆñg%¼ö€ùDE4üÒü•7ùº«ENN ¸ Ï]Û‹)QÐÊ |hÓÄœ„¼"ëVS•.+`–\'”&³ˆýsP0q=æÑo¥åËí.]dqÊ´º/…N¹­‡!0Íj¢»2[î7H1º—©³pe(¯èèÅÄî8Öè¾Ý{óÀuÖY7æšòŒŽ‹tFéµF |ÏbË䂉ïÝhôò vlþ í+m Eºÿ4Å "6å¾Ôxpûãx3 z(I¼—ìÕ² ÄÌ_°¼†é±T¶ÐÝêw{ø ¦&«óà‚ÝÓõ‚SÙ–;·$™ÆÕ>ûÌd†ÏبYè®Ýª¶ºöÚÄÙ­"áþôG%:c¥AK¬`§‰ØYhõ³ÐwjÁÍ#@®GÁ€íÒ·6³Ô› ‹Öq\:“Ž!Sîãά=.Bv04І)ºLEqZ½óýy=Ç]!oœ)‹×±ÿDîçi\†|Ø€bùµY!ª¬úØ‘i!ñ±QÓôâ'“Bécíù‡K}ªZ%<LpÔÊgþ¡‚B .!’6>õ ¦ÓüEl™Ú€Ý[áXyßåzØ7·@·áhÛP¥ ffwqyLÖ–éySqd+#>‰Ã¯Áв`öýù×2Cýðw9:æLMF|š‡ä¨o6/šwè…@ ál ©¢Í˜7Õ«LêC´éAĘ#¾)²Þ’/t-Pð K\£36!Ù ˜¨8¬KFHó…Z$x&fϹNEcðI¹„ƒ‰Ü•éÆÇ6:+_o-žåƒƒ0Ét §°tº¢xÖAXÕ5ò`úÓM§ƒå¯.1 P'²ãrÅßo²óS1Yk.,§ÌZ/aÿ¶Í "k"ˆ†‰µ-°x˜VŠ3?= s ò þ¢t×qà E»CÅì+ÿ!v‚øí_éa­y(¤jùÞˆ©ÏªŸÞÛÀÂ¥ù|ÃóšÊ éÿŒ$ü+œ¼täÚ»=®ð½Èôg½1ÑßJÑÿ‹ðƒ¡Q0.ÁÞbÛ"ôDÍØ /”†@‡K<„’mÍ|¿…j|QKƒ­¡ÝV µŠ(í,8m ³ìßòb2F˜ñ‡Y·Á‰šVLèÕýò …¨Ý@™¹{&2²?I1‘Âá$Ûà4€3C83ou?È€Ÿ|)-2·MÝÿMŠiQ¶›c†I'Ú¬[Ϙ­–q­ïÅþû P„42pE·Þ{Ì﹑åÏfË„ð™`SØŽØÀ]6þfìuÁÌêÛ“][¿ýöõµÖ¶õ}YI¬®8ñ1GVY5/³,_œ\²Z¶xq2YuV⋳“l¶ˆgœq™À”ÑXÍû‚½ïëé´ô²,m¾-¯÷‚KÚ !l™!­»èæcÞ4Ý„š^‹'qŸÆm©7“¤Oà>œUËà,øY~ÖKý$ÿ‚WÛ• ?¨˜l‘舴,Nšà‡è¾.: ‡>Íšøï,ÌÃíå¥#ã{ Z,dm‡Dü4nÊ/+ÞÐÉ!+±3]ÁZ·,ŸA>ÏçÍZó=Í ‚­2ˆ†P÷^'l Ú ÙdûÄ ,ÚäÂs8ØäÄ4C‰Áe„Y„DÓ ‰÷±mñZ$§÷l {¸ †D瀵íØ¾W[Pjª¤mu‰m”ÂaØÆQl#$/u=;aæ¶VHdßÛrkÛדJFfÛS7X"1ìB©ÚM«2îh0QÈÕd–Œåyƒ´‹ ƒ[Í™ÈÛ ¤;y¤3‰§½©Äß7¿I0™£( H­1“j;äTYÖÖ â‹ ë3Õ=j>qòdüÇŸ‹Ç|"â7bím1†,¶¡, ¥qbh†PƒáJÕè}Ó?8ŒúR3Âôy¼”0çgy¥;nB†|†Úë(‰ø!šM° FÄ:e=uªËXÍG(Õó<Ÿr•,YKµÔ[ŒhÉM‚ËeäEÀ¼ @Øo<ø7¦ß í¡uiG˜ÛÅU–ߘ$›¶6’S TÀæ+2 ºßî6A³'¼© m-ð…0Ã`vBH­ŧ‰«úÅõ§lÁx?M ?;Ô‡`‡š'2 7TãP/cÔš’©†fÃÄ=þS¥$¶?•) ñOF÷«n$V Ïæ5Ô&BÝFCêþ•Ž@≠žÉÈK’Lí䦟⠩¯ªŸ'òô‘q?\žÒb’$…6”Uª‰Óa›àw{;Xf±)°öÂÒ1w=#ÓÑëÐ3JÉ^[”™”·Š?гˆ?þþú‡bò»œÍ(©!á=k|›ÎœºÎ6À (>]¼Ào~æÀܥƒùï~iÐ>W a¨%ºÈa‚ë)UpuûpzãK`·Axß!g‹…_Êd±w(ÖðD À©¨ ï‡Ä-‚ŠÀHÅé®x/wBxû ÇË%zÎ qö™ÁFæ¨d÷¼Iî&©ûß'Ÿâ¡ ô'÷‡Ÿ'ǰB2‰ì3,e¨ ñp±RÆû‚xRÃ8B}O_xÔd_`ªXš¹P.Í»ï¹[ÎÏÛçlü]cKo@ã;¥ŒK²8RÇvŽâ­¸4æP|S)”7ƒR%ŒlŸô ¹a‹PFR{(ÓÆâ'¯U‰¶xj1¨£bZY˜‰y¹}¤§u’ ‰0Ÿ_µ@#¹‡É£å‘øöÅ)Æ:€xKRá1œ%¼ïC…ycýñÊ[6LÚÂñÃë&w_@·tVÂðÂ)>ïqµÀí鈩˜¡W܈Ky²ÚQtŽòzT6XwôÝúÖ; [ÓÍí#ç‹'õ”¤ò‘‹á+þO(—X¸bü˜àÞ_¬{}³°Q/þ¹O9±—2SÄ¿˜Ì£” Y}}þ´K;æ€FºWfN-µR÷õò %²Æ}J²¼¤öŽì‚ìÏ/î„(Ç-b€ ¤ÈÒ5`ë ë‚ Èì³'ÚuY•ÖŸÞ›•¢DaËwKRœ¡oÓ)ä…Rm1=Rq:Ḃ+Ušß+é½´ H­ãY.ž\2s&1쵓Š12TNCížþä3<§®íE¬Ej‚¼Éï‚o.W™Aˆ¹{åNé9…©$ GBÿLtCõ¥yqãô+ï3ü›ýúÖk{ŨE¬5¥Z@‰äkŒÓÓŠûô©˜†šM7: (c hà¿@й‰UL+¥rST¦¶ÿ.Úw¿0"õ—{ey‹—i¸îk• +w¨°Ð¥*Æ€÷ñ÷°# aÜÒNhRʺE;ø…F®âÛ2®5n÷שGG¨š¶ô#±‚4©aÀ^¬­˜kú´•wèhvÁ®†»\T°òæ»P{g“`yðN²=ÕCÉE©²éÄ ‚ÜÕœÀ$2Åæj0Ù=¿ju™yrùÌ1àJ†N/ºº ï9#ER"¾×áæêžûQ§ŒB:.ë§­@.¥õ Vo?rûÉ.Œ|$1X=¢«Ñ83Œ™Ó»‹H›“q%§@Õ° I>²L4Jè£ãe)c|6Õ”ÈL7ùë™X‚ZÂ6©4ÅF«âBÆRº¥@<*€ÉHµÆ *-¥Åèšó…” HNL‰M×y¬€™–„—mEºaN‘EŠ6Áa´¦op‘­méþ­ÛªÃùªwø7åÄã9ò_t§_›8•ùðµG>½ ˜mh^Sž Á?S%¢ëœ{h+ëÿæFUºpZl£ü<ï#øÏoÀ7ŒÐo`L}_wÝ qýIÝ.DÚ\ÑÿsßÏ-Ëèœl¶æds<÷(Ú›n½‰¨R¶Œ1JLÙ‰pi$-ÆÃJAõ«žF¢¡ÒYìþ«ÝG*ã¡z™Âb©)‡ Þ•£ÚjÞÇyéÂ2T§ÕŸÛŒƒÞAX…•(«d‘F5i´J¥K¤fj‰·DC¾„-ÐäΪda#FŽW÷ÎÄ) 5íS^Gþ_}¨B)©B7)Žp÷§\¥øD¥¬š`T§R´ aIþ¨ð~Uqu çSˆ9j¤®.Fò&•€@Y[Q„Š“wJ˜üê![g˜*e½º‰ê$]Qƒ7ª øU£o1ª*P²íy¦‚7Ê¢L 5SÇ X\’<Ú¶>E¦-ÃlÖýŸ§“ÄÇh0zæ#êêföÊÁ³‡Ù*É¢‚PÎm¹G`#v¼·CꃘUòi‰¿s¢m¡2$&'zÕKv]¦DÖq9_¤î¯ Ø¡Œ²Zê!rB¡X˜õ©‰Ä©Eôƒc‹xÖš‹ºŸìøEKÄ09 ¡A–—úÊ„§&o†æòô †*Ájw¾²ù *ð$d\Öœ²CµD™»pÚ#¸ùçº3«joc`ÉiÐÆ¼æ—Ûö•žè¤ÍHÆ‚ äYÕEþ|õ}H¡ñ7Aÿ†9ÌEŨvŠró<GuT4p éU=u\¾]/žÞÏË7 âÞ‰éªj ûÐþ ÁªS‚Ú¨³C}¿1²5é-dêIÆ—†îÃ^3[¿s>ĺ:`° ž!Û•"tZáílø6ž#4í© 8Æ)¤APµƒ^’h6‚ÅWÓ©˜l!© ·ã˜XÕbwE£“‹Uå+ã“à'I ‚{{Ô¼:Y„Í¥rt†,¸V]\/d‰Ï.1ѧë˜?úµ%òï4[wê®vÅ\ñJi] ‚ù Âú¯?~lrÈxòÅ0Ê#} ¬—n9äwÅýŠÿœŠ·è6¶ Çr*¨—¤²™¤:r…IRÆ &~€ 1’xÿDó×ÃRì?'=Ÿ«ÓPC@?ëi•°‡¹Äð~ì‰ÌíWD&ôy@†dfŠMÞT´NµTXŒä6ã*ßÖÄà›8¬w©ï¥†‹K§- uãžÜ3&˜•‚M4å?B(LjOð-ôø¦Æ –öÑÎS"j0U?J»­iñ [€XƒÆY²¤`P*Tà K$á–nl²Aå⮚¥R*|HËD|LDûjËDX0X–šu©©O¶Jˆ¡’uj*Í«’ë².æ ¹.Ž­÷¹†šQàýyÀN öŠfÖ†s¦™Cà-(Á{‰ññY5¡T/‹™\HÈ¿Y+íÞí™Þ ïô–Öï²tÝZŒª— 8åΫgd¿êjê~#¯:‹vjÚòlr|ý*8«2&`‚a«ØX*Ƨ`* º„­•׺²³ÄYªé|•g*Šƒ~WŸ>fð¬ÿºÈˆ¼Á¡sóF•²J%U´¯z"Mè°g‰)*@B½tœ›–^±?Ù êÕ]ÝÝáQyÛíóãKîϱãJå×ðý…‚­ŸÂvÈaVÚR™–²–Ü‹Èqd€r§×"¡œ¼g%¶Žãck)V4¶õÞµ@8{‡ÌC³qÜ^©3oD¨8àU":Édv”ƒj´ˆÝ‘À04û^GnW‚CXnã?´Š©†ŠÓMÓúý;µÀÖ‹‡PbÊ)…lIÏdþû0"âimùÌ÷7‰YåR ®šì¥kÉš<ÙjY=€„rÖܧöó(¹¡n•P:šÏ‹ˆË³õô³–QÕ·g`ʸÉ]¿UfoµòrT͉ d•=xž[I€€é†{Kù£uá ½ýµæƒJÜž°¢á-‰œÒÚG½SPÚ¾k,½zž° î‹÷áò6BaJ³BP §'`ó‰ú½·¯Œ3dÁQiO5Ιa-¤éX2ן´Uj°\Hžƒ$h¦Éñ.,žn(A½€(«V}«DÀr_MÖ£þs½ø9ÌCî=l˜³ýŸSÙ߆5Ûý)”˜<<4ôÖ•<=½§çZ¡zçûô¤`b‡C¸Ïû¥Öß.¯–ßN·žßN¯ÕÓeúg€—³\o¾hk^Ï¢çyçæêöÁ=9ýÉÜ~³n•ŒfÌçùìócgŠŠõ'jõ´ƒ¨øf% ¾ÞÙ Ï_ÕÄQСÊ9‹¸1íôÎ|™ï³ ì"¾#+üoÕØÕ‚Û2Æ›VÛÀL,v3Õ$Íeþu Æ9ˆŽ}k{îõ5w7¼×ùƒf¤;Å-¶‚”<¸tæšü4¬LœŠýÙFÓËŸ”]Ö9µÞ÷A›£=lé4 ¬£68Ôg _ßõG÷6‰EwÒšºtÀ%¼VË`ð=<öe5‘ãŸtùÎ!$Óéq‘kÂá×W6Åÿ=Þ Ã&µâH¿œSc‡¿¬ºëöLÄ“ïåOiüÄ'ìø]t v›ßùÆègø Ï.º7çÒñÛÌïÚg_Ot×q…L1É„vé®Mzúgê§Šü~» ÈD5úgÓéõÊ _•5.›õÅÇq£ÝïÙâ§ÿŸ5‹¡%¡Ñ%›i÷X.Gv¸8=ßw5ïÔNèe!™40àÉôGùÎé¤hŸ—~×ö$i  Ê7½;úþ–%zG³¤!BµèÇ##rmùÿ—×ù¼ ¨ˆ§YÿúB9Í¥5Œ2 }=J弨8S2·)SWäûÌÖ¡‡M°àõ:–8vx±ÕÞ§œ&ÓÖ~÷=»ê´ bŽ–Pî¸qLá~ÕWþ÷Å|œ“¦ÜG“*¼ñ30Üýyüà)™à¶-_ n¡^Õy¼]©³'S"_{#ðŽD6ŒxòhM Ç£8ó)íØÖýØû¤¿÷Æ 5Î@¿l![ìOR àÀ)ǵ¯žŠWR¼;{3ëµâÕ$Ô¢#“â/ŸqÈ}"cЦP(£G.BÇ÷‰î¶Ý9ôÕÌwÞ´õê°cºâàŒžáC¬¾çxMá+î{žQ3ŽÚ@p9í-Š›íMö&ˆÝÑ>Ä6s”ž#zw¨åcB@’n,»iãqŸGå(ro‹Pò]vðw0ÞM*àõçJ $Ñë±û:àÌÁ^$HU¥øè¤Y"†‚Jrõɺ=ÐiþæXˆ¥dŠá$£ŽÉ’f” =Ù•ö¢åhÙXiÎØ˜-á±(Ñ $”Ê)¯E cä³³ˆkX>Ïò¦µãÍ4TrAD.üzC^þeQf”ƒ_ß õ2Ùrd­‹W lYâ¥6eUëÞr\4)¦@Ù>ßrÔ©ãš®5Ì™ÄÉËjÕ½2ÄÛppË@Â’¤9<²ñÿÇa7wM,¤ vSžV5'×Ä<ŸF1â¥Ù¥sY,S„ ;Á4NJV2 dß#7(<íÈÏ‚À12–=>QÍÌ®(|+–3¨Éãߦ{Q¾)ÌÉD7w­EÏbòØ–©çŸPÛoÅ¢}xëv¼n÷J¡S6w\ø;‹ÿî”éƒN\»*Ô¦*€JÖÁ g/PŠÀ íG\j ÿ×éåŠñDZƒ†Z§ªé½–² Î1*´x–ºÖXÜ­¬ô_ˆKðý£U+ìESŸ\£é²R#²VA§›ºøI{¥Â GCwj«¥y2ŽUŠÂt×ú§ç=}a:m!Yt/…1|ùÒ@§Ê®vþU„àl¶œ« œ,\¯r,½Àé;X°ʵJÄú«ÁNyÛ]„)0RO ƒóYz^[m¼95÷zs,™v†÷OyŒ«X6s3Þ_”ÇÁ%K¨: ‡*V9b=øH­Ëòϼü Õ¶À†õཀྵ‘Ac‰ïÓ •¨Ê¿°…Tæ& n¡Gž2áÎàµÝïÕq|å—WŸÎ“Ñ_ë•äÉó-ü8PŒüßÅGÝkø‚Ÿpl_î¶qKgźŸ¾¼x­kiáö5°·JÕÿi¼¬… ,ê ùý=‚—Ÿ Ò‰ ˆôü÷QÚ¤¸ì³íCFRÒQ•BªSÒ]à»ÀÝ© …ÓÒÖ1/©3ÎLÿ%=² C…÷¿å°ü‹¿ú ˜F®);.Þ Bk ‡X ׎=ÜšXPÍ’ ñët/¾“UO&ßí³@[J•² *XÀu ã{%VŸÀwú¶â-~Â’•(ŠBâý‚z Á–„¦Aÿt@3 ¹û¥Eæx¢âk­ÜÄ,é&\ƒ‹JŠRÕ4›á„}׊ØõË—z¯èqEÌ¢o,÷ý>ZVÉjÈ„¤ÃjJSh(œFª_W”ÂhסÕúÎ÷äAÔ(¿0 Zn­”Ê›z'M¥‰÷%e—Um98ëˆöòjyb5¦šJ’ïÑÖ,û~ý,Z÷ÉUµðëY´ì‘=Œ=Nµ¢<9ÂîÌÀn¹qE!f4E²/Å[ãY;ä·ŸØV Ä2".æÌjc:šx$Žú1Ç"ŒUñnÛ.гÚ!©R»Èæ,s**ZÞ9¥'v×vi´«¼6ËbÚ…¥ /y—›¡vH8Â(›“Å©•Å'ìM’‘4$*åoÜìßÚ>¦yüòOˆÛ,ÒL£‰<)ö‡:©èðæòHŸâX¶@<©‡ÍøƒÅαmUEÖHƒaQßÏ0º>ÕëX>ùó7§–½ëWhA®w‚Û'Rw¢¾”hÝÅJKrgãÀ’k[mQ‡O=„=nž¸¶œh£ç-™ËÞ¬=/êxb 'ìã¥%’­@i¼v¯öÄÇ·–ÙjŽsn€Iàá ¬û³ Y*›§[]Y­–€WFG­$dD‘§)Α¾ÖSBèME²Qü´«Ñ<ÿœúŒb.ñ–r $@ò0ÞÊp×ýÃ)8)W»²0¬Âª#¯KZ–x:oî O–88 "â UUÐBS#É?#yFª&)‚YXÛä¿m(’EÆXc,A1_ÛÓÿö÷ÛÒ?õÐU´;ÓLàîàpM{°M;84ÀÈP‘À# ïyw¿Eç“×.¶¾zzô„6’_fÜFÞLJ}y²qKnÐQî(»¢ªöþv(ÿŠü‘7öh¡º4Ƚ¢:´*ZMýjp¢èE?èŸ"TJ…Þ2õ$³ñ&ÓøCâ*™) ’*›¦»àf1&äQ,ŒbᲑn Ô·¥iå]}Wµÿÿøÿ j¤r]”™b1MU¯½5WsâX«B©s¨M'"ÒE£(pDÎ9„$+R ͤþ¦ºjø_ÊW­GXä$$R‘-Ö›¤R¦]l¨Õ,FU¬L%»Êë¦*Feb Qì¦[T¹"'§ï€@R-*¾2[Äé/Üåxµ¬~MxBqä…Iã·„à^o…×±õl(Ëh|W­š®~e ekØ×4ȱYR X/2±Ä•š{‘õ¶l×­ìÅ2­Ñ¿ÊØI$ê|r,pd6\ÍrÛ¢¶jãé7-Z=LåÈ%¸ÃþîY~ï!D¨ÆI¼†6>sÞ/¥+-ßžºi›»ýÑ›°IœÈ}ˆÉc""œlµ#ŽZà4±¸]×âK^ :j¡ÊT.äLåý,¶s‘£}€Ç-x¸À^йêä¶”xÙøâj˜<Ocµ÷ðå,Ö×FPGÿ‹£ Ôª…‹úór0eëTùˆæšù=¥9¿ժѧيN1ŽÏÕy“1û©†ã¢ÿ8‘Nö6·3ÅÓ–ªŒc‡ð”è²Ñ~aûæ4}z:5hwœžØ:ŽGn1µS)Ù ˆAk´£P…k™t½'HFçuf+¹¤ô*o˜Þþ·ùóQ;ÃýL‰Ñ‡žÜRáý[Hy+¸nߥݖFj>E‘‰¥ÐßëÞgX,5ŽájäyˆÈ#x@0)#y Áø±\Ø„«Â~þa©Äo­¡Ù¹°ŠT¶G=íEá—©…"èNß/õÊz•:ºÙȇcqf†©ÌGŒ[G ¯;NèÓxD§vSÄf â²ZgÄÿÓcýŒ2¤´ÊPÃb··õÃUpƒlâ϶?3:ï¤'Zu¹'ùžxð°¶üÃÛ:ãzO±¬ä: ÓE(ƒ¦P'Ñ™˜ç©–/3J4Ô>RljË4ëÐ/}®ˆåB&43©HÕJê‹SÒ©>5zG b»Â¸ºÆÛ¬ô­Î ÜRú’ëb¸øç‘ᥜy$óí»ëÌθ€8ú‹i¶’£ØÀmò›pA„T*ì  ÎØ<CÞvïš²‡éu8¼„3/•[-*ÇÌö\úþÊV¤ï¿‘Q~¸÷ÑëRq£.Ö‹Qª”对ìÌÿ¦C^S_2Žå>5V3<>»¤k[É›Sq²8æ“e¶n1>ƒ/(Ò;Â@£3ïW…ced_„€ÐTèœãØÃŒ@#ásc¸GýÊt™ºÈtßÌå^_Îó<äcÓ8CîOG>•¢Zª±@öÐ36”‚´ð6¯ž@28¿ÅØ1áî«CMy ùªk`ÈÂidkH‡?pFâ÷uÈXñþñ¯˜¸¯r|MÏÀºóDEP£ù¾#=ó±8àcûm P/éqë´ÈŽòm©°ñ€=H”Ø’ÈŽÛI¦ßˆ®Ñ®Âæ'=™T³Ãû!|«-~KÀ‰#Ölå‚´Š}k‡{I °]åÛóÀ¥ÆãÁUU5é—íË©ù о¹§RlËÞyXÐ<Á¹Øáþš~ 3µLÁ®È:kÐÎûf_S ©Üf‹âkÄ^#pf¡AGöÉÏ8²'E’£ÉCƒ¸ŠÈB[ðªÜÿ*¾äG#ìá#¸mfQ;Fp‚¤FË|$ÎÓˆ$»N¬±mš„d[-™‡BnBüX(h¯eãa¡l|µø¨Ícß¶8Bfhå×ê÷ìVy~Ÿ³v>&çÕ‚€x.ÕLµô|ó¿jaÌhW¬^áÎŽ(Ú‘²8MÃôD*²qˆ%{ˉ»ÕÌÙ }ñ̆H+£iÊú‘lòþÑq<}+¨S² Ž|gn¨@³5µ @“i´ŠV&`Ûd›¾érî<Å1÷4š@³=±AYË”ä–e…íkUÆ}]î•ø¢]A3:tïðôÑÌém•s ÞçOpÀ"6(IÙò:£cGÈ+t %.°múépÊKØ‘ ü†¢¼2ÕÚ–¡ž2TiW&—ÇÕOekpØÐR“änÂ¥Ò•Y)ÿéÈææÂØfþzJ¼q¤ˆÈuÙt+¨­W *X|¦å¢÷â¿#¦Øì«ÛŒNöéáÓã:ÃûKO“ÑÈD–IæOx1ZüøC½’‚‡*:8WAe8ñÙX/1‘ÑŒ²Ÿ}·¡Ê:ñw‹×È”:¯ !ÇßEƒ°z3DÄç¤BÀ.¿­Cïç ¤ßSv:@y½ Ž ¿àq¢ìú—NÒØ‘Àñ ‘óIï’EN,*¯Ö].Û¿ö îê~=Æ)ÅÑXr¯Ùë>@WØÜûÄÄüË…d®\ïqà_÷ä‚77ƒ†tfÅuÒ /¦B5¾Ad„l„)¸ ²ò)³ÿz5ͽÌú+¡^ÿhTË·S’!΢lØÔß!édF14¾°¢/®.ˆñØŽ±1ð+x€˜_<†€r~q®¼É›š%Ýèxn£õ”×Åõõóñ—¤¬ó×Yw‡ ÊÙŸˆKU¡CKqf\·¹ž6~Ï}HˆçïêÍ U1W;;é €ÈO@5½ÅárÜ[vÇÐSeYåiÿú—ÒédÒ?¼äV•ûP@øŠç¹‚{Áô+û_„ÎÞý+ŒÐØ]üû›±Þ¼bv#¤œåº›…8ä–Ùj.zÁu Ž+ÜIÄ®FpœY€æ•ýÒ=}+qZp£–ù<£®j˜}fÓä°#F'~ïHö:HÆ6æ°y’ 0ùÕl¢ûý²ãìnÅ8ÿ¹vjÅâ©=ê´öUª}µQ9zFtØü®/ƒ|µ“—ñí/kªj³µfºTøMÔ.”¥Šcõ8 Ó[²*¾ê>|ò1ÏóáðÝÑeñGÍšcö¸ ’}óÇ;8F¯àÔ‹.7Íh®ÿí>¿Í¨ïñ›Qvú7£ßé7£Þÿ·ëJ™ÊþXùû~±Ï²4@Ô®~ŠôZsßš¯é“kzâÅdx’éþ»_¬1WrýïžÌG±P|f;½˜Gá|Í÷`¹ª8`ƒ¡U¨:åŽOä_Öf–£i%Ê®˜&CÅYs?åxÝY`›ªWwl+ŸØgLפü÷U¥Á©©D;ŸuÓxú’™Ÿ{ø×Åi³¿Îz¢àäêÉŠã>ìM#ãkˆä%Öþ–-‰“?`_ÙŽk”`‘Õcâµé IY–Ã×RßàÏ…É»¾Œ×½¥aj†ŽïÑwP±^²þ¼ñû&³˜ß;(„E_Ççu[¶aÖ$̬‘âW8Ç8~ìF\:ÆÖ1,õ»9N¶z^½²M%Ñ“v­<\à1e½nã)£þ\iÙGêj¾çƒˆeí¿ñ}¸-IîçLXù”‚Y £ÖúŒ›ÙV¶ÐôVÖù–ŠÐ¼Sl®X~//ƽÂÿ+HƒðÜ=]£™@Jí÷{WúPgàùw†9Ï~ Ÿ¡˜Þº ¥.6§ÊÙ|>£L;¯®1Nº–_.ë é›î¿«ÀøGüàðËÆ¿zŸé³ã6ìO˜à«Fš~eK½Án1<äÖÎ|“œ7ZZ8-Çø-»ø¢€üíc¿]TIèGê\v^–¨àMåôµ\…aú£{—“&õãÒèÒA}¿ô·ò¬ÃŽÍ¿O¿Œ§PEÙîÛÆÓ‡¹[&úX¶âô@áÝ@sÃŽ®I-àÜòS3Á^žï`nù .Æ þ_±äl‡#lgýZ>‚Fcxg¦ÍëzÍ©GãÃwìÐñ¤ÑŠ|i÷ÜŸÁÊ„¹jÎ|BåÕ[ÖU:G èÃA#6ýë2÷æq£ß™ u[ñ‘Có6B8¬ä¥¡ÙàßÅYxBüCÔ¹¾*§ë4B¥©Ìö =œîXcét—ûîqW…ñ\ÙßÖº­ë°X,~¾Qœ}-Ý<ä"h„†ù8¥·±Ï~tÝköȵ<ÉðY:HÞm×,Ô]S?$Ðßøó„³˜³v/Ñi´Ç (&±Þ4ÃühüFhå§#½÷áö± ²˜¹/#È…kÁ̼j¸þ}·! ÅÃõ:˜ ³_¡™SAê<]ŸÄHá‹ñ[“ú§D“Lqꬿ?ÎErV®A@À1’×*Gé.&:‡æ¯¿2ÿÛ•WìÏ : jöÃ"=ô4%ÝÆ•¥bêKž½\â_ÚU¥Ï³ +!ö©ù¬1¬7P1§¸ã” ”Wö誷ZÝ¿.Ù…ˆ+ĤÎÖ™2zÒ\³.‘qE$Á6Îú~ínOžV¨–JÇÞýþ¢\8†uT÷¾CÔLêPôõ†˜õÂ-Úè$onûŸ‚ÁîÁ¢Úm%Ï‚±¾²XX¿ÀÆ‘éA¸áíóBn[·ý¬S Þ³¼A7ÏÎt\pÎYÁ}‡é£þ²Aer>»’˜ÿú£àW¹~öû¶Àœ›Ç³~+dáÏ=zƒÏ{ûÔǼþ¹#Òa­.%ñ÷ÎÅ­Bÿ`¤¶Qc¼ÚÆ€ÍÍ”RZÏöÄ»ùíþ s™å}!#¥%_|)¦ð2Ø¿ {6‘ÓZ4¼ÿ²kÔ»O»r°¡Ç[—ÇBKÜî;WÊð­áˆBØ\"L6œ(üà"ַ޶oÛÎZêÓ!­ŠZ7ë¨X{+âBÔ”lŽ^ØNgÿ§~ÖTçÚs‹‚ÍÙö`ªtpsstîFŠró¤¹ãz\èåĮݘHu~&“JÞJYt«>ü¢¸,».ñ´X¥¤·5›Œ*Îd5µf9óÒG¾|sš™ËñËO‚§|˜SM­{6tòH{'=7NÖOWÏê[Yøÿ6KúôÈçƒÍõºr­¤Sä8"uÅÃ[šN•3r^Ó™‘ué°±³Òÿ?‘–%;'ú‹¦t9ÚR°aßü­†œùÍÙªüЯ߳•ùÁ²˜]±ãG=;Ó§ÿÏ(tã{ŽÏèÿúq sTjyÒŸG—GšvP§c]d°¤˜ÒŸoKSÊ¼Ë óñÄ›;þO®ÿÔ™MPê{Tû@Ú}ûcOÅRíŒÁ°fýîa;l¯äTã‚*pœ=˜ÄÊkøT?áòÝ7x´_œµí5á·1Aóë¸D) FdMœ×öµsDÒž)Z¼>°!¥”pqà]Ù Ÿ±îÀ Fvë¼AÞkL<ö/Â5Èmþfy3›q—ó Ðßd=7«G數ñ­à'ÆÊþ|5h〞?3HFÃf•ÿüjƵv DKàÔjµµêþ&•î ù—f;'±­oÖÉæ~Ã*ðÕ€øä ò k¡æ¶”ÎÈŽ50ÑÓ/4yÏ»h•·Q{­}âµoW?|®JÏ(yÄéGÚ“x‡z R@¦«³°#ÑwÇ·|„Až¶*ò|é_¨ŽA)°åÍ›V£‚qèlo9ž9•öâ=4ô½EA¬câ7'Õ§éZ‚xSÀj|LíH+Wä'Tó¸4UÙ/²ÁÉp,%¨tˆ| ‚ŒèA +—4ô†ùÁÄ^5Eî¦vq[òE†— ­¡£ò‚ÑïÌU²R^»ûªk"ƈ­»^sØë/½[Š6·ÃùÇE®'u©ë)L5Œ¦çùÃ4G®³ë•Ë#T7ûÝŠÙ^úŠê/ù—Ù”XD—ñ[Ø]Öeb·ÐZ#íÀÙeÙíbUäàâë(]Ï݇ “[“ë…Ø£œEa0}¥<ç^¡¼PnÙ›×™«æêöç8ÑwçQÿÕôBñ©Þ£mk±[ÄÌž­sw×¯ÍøÞw~Ê‘ò¬ëä`DM0f¾5óÁ×Z¾9´^ ¿çPjÖ¿§\a™ÆàzÎÄØ±~GÆ^ÌI\j%~œ!³©¼¸ 2ÿ)!PvŸÓdìkË´–³…kôŸ¸2kÒŠr9Û^­¿:‡Tí¤—A«hKÞìÊùŠZÑk;3/WD pÅIwÃmpá'X8»V_sà˜Ÿ9Ã@øM¹àx+ç¡]¯ÚeÝfgŠ,}QšÂ@ ò]„”´íuÍ N£¼h—W';)˜šÄøöXOQRfŸ´†EtaÖ6ß|€ÄñØ1¿-„cMdžðkÛX‘ÖjŠÖî>v‡Yé1ÿÝSêÇ·–·š”"~úÅ((ô›~íè=‚(°aÂ[ÈŽÏÓkŽÉKø4ºCð˜áX¹+oµ_^—±rX¯1£&=h©(4æÛÅGO¤ÅÌÝ;º}ùÍÛAücE›áõ‘I®­KþŒ»ƒDÿ•[ÛîA[Å _7)Jé9Ûñ|†nWÚÐC²„LÛ1irðL\ZRÁ©!I‚¢¶Š‡Ý±KA,“×nЦu´‡×æaÍTq­x%Œ›VÄÌ Xµ„õo< …y1’gUÄ®¿¦ÇÁاó"ça»Ã›ZG·b}A¤v Fÿ¤¹®'÷ÉúË7DcuЇ„§çH®¬*£beäZß9Êå²KB.»aËu»;‡”ŒNÕâ _Ì3ñ½ Û4ìÿ˜¾]Õ[¸Z]¢ó3ï ¬·yzý}œE¢ëa.üMûµ Ùy¡Iï4¼MÕŠ 6Ñp¢x|Ðc{`Ï_›|*>€¨•’*Pçº-DH v ¾}6ôÓFFw8š6·WöвÈg9"·p};?£Õ”Æ¢‡™»ÏLeŸ* ­‡Û*ÀžMU¢“ÛÆw8üÞœÏ5k<ÜÂ$ö²Ådª`¶r[þö?[«uv±î%®]øàÞngƒÊ\°¡{ÇÝÁ7RÊqª_Ϋò!ã!f‡ÍÈI^s®´-•³V´]2,Ø÷¬lb6Õ‚šÝ¹ r¡i.Ä1ðõ`S|:`zE)zÜqŽí‰üªv°—^h_îV›ª_ï.”:]âà| +¶Ñò,ïî1#†î@*Ш^é ôºë=4ì;D3 ‚h Á“»ËTÅÖ,^OäàD¨VDâöyÈÆkéññ]6‹ŒWe¯–æÔWh— q/aº$2 KáÛµTܺÝÖpyÀvL¦Ë6Éùo9–bn‡¦YѼÁjXUˆ« {U‘P7yÔÝà-Àryœ'{‚µ;^SgÙãáÁ í&›‡T~{ȧ1Ž#ènß;Zþ©$¹mDæ‡F4Áº‘ {¢™!ú†×:Ð[Çj==X s{±kþ²‚ñZIcËB¢k̹Z ¾Ã÷õ?õ¼$x×èÂ#¼®îc÷ÏK‘%óìÍq sá|7 ®[`A\CwN M7URh­í)ÀóìlÌuÐæ‡÷Z“ž·^ߨmD&á_óC©µ¸§Mò‡!ßÉU¾µ«¹ÐÈØPÖRªµ”¨úJ7ÿVB‰‘©Hæ2À7–²Î›É°âÓ’ŸvíØ&æ-b½ òiî`i‚À9.k„ýé,®²â"Iü×6.Þƒ\”pí”-ŽÑçŠ=ëèMƒŒ«´Í¡Ü¢qÍ-™ÇçÌô èJmŸô€}Âf•ó±¶<{àávù6(CÁqÛqA>•îö»h‰‹5îgS|ƒAk¦+ô±fe²KN±Ò(¸p]gJÆ<‚iÂ>Sð¨ÞŠlØ‹ S'ó° °ÕX±î¨ÆÝb¿¹D*©†Íô•3¬8}mÌöb+Ò)ä;»À@x±í¼ˆ™4Ác`Š:†W23®DcÐWI=Í^ô“Û7íЬÁû÷£Âe˜lŸ‹‹[ÀoRýïÚÏ"~>þ‘|n©1'Az(ª“ ~ÛÆêóèÀØÉß(ðk;íÅÇç|e—¾sºª›.©XϬR݈Rok,qG.Þ…,µbí($9³ù#».ø#{¿å»É7¹»"0ݦjô„êâÌ„¥®YŠ j®¾ Gp Ž °–QA)öe9åpÿ9Zð21A¨Ç÷DO€jÁ?û¤³ŽKº7iu•†‘m îØš¦èÄ@àTîmNÑ/gL®ð¶XBYb¶5 {™7ø(~ôS¸_ôŒûüÔYæ’žøu1îDf¨3ó» ÈѨÏÁÂÃ<.MƒÅ¡ð2ô€Ü!‚ëÉ! EëÄ5Aï¼ËrâÕ1>åôUÔ«™ÓÌó€ÖŒÜèm³"…f¢×Ó½¬Ú äjѩČÆñÞ»HçµËVfU°]˜Š­ˆóyÇ$±¹˜¦gVdMsËÄ{GXðΘ·oÖ(^A¦hkS΋äÌinèÚ„¬€ñæÍ]–wv»¡¥÷Ó¹MU#›né(‚i%œ¡Áõ­Ë±ç¥<ï/9âwù¼V£ÌýkŠ|P~÷êéï’<ü–Pb(×daÈÞ¬¥¦<´bµ¢ŸÏó ˆ‡ÉÔ¨#<ùÄ29ÀW-¼ûr[„Sf ³ÒT[ßa@Ô“¤[ÿÖÕ¦yÚ%VôEޤÄÍøò‡ø(ÎBÆ6ÿ” q{õ§á%…cáòŸX9òl»Þ#ÝK¦ÓáSÉè º¤|p®qÇzî7î 6<à`ŠIï‡/þ„´%¦ñ®W5¯Œ++—rJ§ß§ï×;<Â{“³GRO8=Þ¤ŽÐ>Ny“8"ï”pÁ›ÇÀÖä]VVl† qƒnØæ‹úP‹Õ×>7'ªåç)Z_<¬:œýç×ÜG™Ñø9 Ý÷qÀ礘^àœ5a)xÔ}iaBG …ÞM™ GQÓ¯ç²! ÃDQ¦x§ºt0òH„$R±³sãr¶¥@ì'_Ow Ò1p!ïB%x—MP5X·ž1)ræìòœÅ½g1X?p6q~½"3ÀêfÔQAQBð[0=wÞ® 9Ç­Á|4Z¢m›ˆË4Ë4aˆ… j¸pý³!?>ȉÐBÜàùfCg·°F:Ln¯l ÿ(Wt1¨ebUˆ ö=DØh¡bÀ“#=£QdGµ{H)䬉†>*Íè{˜QO3?eŽ˜õì_ò)˜BàµÑÔ“d ±ÍXj˜@]0»æàØo \¤2þ¸Û2h_æ#~t à‹Ç̹ }d‰O’r]  ®ýŒÓ`xÎTp»¨ÚGWçµáѱ¨ñ¡kÀ‰Iñ•Áá}j*Êfâ`×››-T¼¶¿=9 6NI€ÈÀJÿ‡þŽfÙV³U ˆ³’GŽ8YÃWhö>‡ñ‹ºQ8ت4ÔELoøh¸“”Z²Xl;™ñ<ò_»Ý<È´_ÊìØ_» ?x¢}õä¹ëtœÊÃ`Ggi×wÖMÒÎ?¥Ø%i, ôÚùO=p4£e=›º=»qD+aèŠ{o`9ó(Ùó}|íðò;›Ît+2> 'FƒÀÔ¹‹w ,ä[ô²orŠòµêuÞYš*Âú‚IkÚÔ#.oúÙ¹þ·}0¢CÀr7ÑÜR/B õ¼äոαã¥×œƒ[a†w vH “w‰a´Ë/*÷÷îê(l”Û•¬“Z-Ckðõ‹vÎ6la®ÞØÏ͵:Ðú LCÂÆnÞâðœ2=Eîûn!ìn›¦/G/"…òmýÂÑœDæâÚD4®Ïé¾MòÒxóÃñµŸ1Лlg‡„–ìçr¢W¥z ÅÄ)›þLáɹjâGY×fÓ°æÇ$¡™•–9ÉÛE†›º‹ùDÆM.ðÃÂÍ„oÞ™àMû\ÔýŸA¢†K4‰Ào˜DÚ§w4èLE‡Ï?é››¤¥Ú†“!¹AœÄ©XºfÊ}Úsœ@Zª­¹Õ²ÁöÿW(A°®P@ö¤Æ-îùTÃ%k¼4CraaÓ’ëÏó¥íF Ê;&Z²Wöésx¿‹FÈC=/NžE›,q§¥&hÛq‚w`Á/<¼ÆÈ ¶ xÈN†Ñ‰¿°œOCïY‚·qÙ®fBó_YÔÅEϦ½ tœÞTÎemcƒ¤Ž×'c‰RMØî›§(Øm޾•B>Ró]8Ù\M®òôЄvüâNÚÍ­!2K¨¯eô÷â°v³÷€CZZOÔÂâ¨ÎGbÃs—rÑ1yíí©5ÏÝ™Ž±˜w ÕÊÝ# à*T~¢À*r¼nw9$îë?,¢,ûßí8冰ׅÎN ²-ãÔ™TJÄï=ºvÂÁÚzü?9P–û…u1½úáŒ]åßìÑpÚ&Q ê-:£ý×Ӄ…ˆ@n›qoäˆõUçua†½Ù+ï má‡ðw ‹†XÉõXÿÖaöøèÆåZЯ™'éŸÝeëñ"]Hþ¬­sAצ6ZöÖ01p66®iŒ}Ù£ªx4\µ‡FˆN1hãÙK±s ˦«äÐmÞÖ‘U¿žûÍ–8:k\ÿÙ‘Ów‡+aú %h»ƒ¡‰Êziì[9üýr¨Ï°òèQhÞâ#8ꇾýE²;7ö‹èaÍa·_0~WŸÏ.qaû9ÆÉ–ÐûÆ›'—z×5MEùŠÇm”KàN½Åy;œã­÷ôIѬë¥ÖPø ‘w]x“°cÙKq‘~¨káE€«\Y_Áó¥ N—à ñ®þ»#_ÿüÓ ‚‹Ë6Ôùù€e°ˆCþ¤½/ºTÇq£ãMí-5YÞ×ül}Nå–ò"‡%Õa¡–"Óºö ,šÀ@´¯ áÀ@5¯ÆJ ¡€Džñ´9áS\V·ßZx2ž¬ƒ-~L ¥[zÏHD›aÿç¸/É|’ê»w?a½¾½BÕ.RmIÝ{ähs.òã­J¯±°‡‘×ÄIu×Vkåôåù–ÜV¹EM ÔÄÚÚIÚ ¦&)]’k0|ñO¾¼\€8®J¸”`„s¶xk =©`‡f·ÞáLBM‹ ÿ“°³´~¨6"Ô7÷³gëð 4­H˜€~¢?I̓œÝÓB©G vtÎDí=ØAÖY1l™Õ‘kÆF"×/b³ÙRèJ±ÀG¥.ã.°á »k7еØÏSdçI˜ÜèIŒ3P4䩘;lÀ½˜;7OŸ)T(szJR6;%è©ø@ò̘|$˜Ã¨,w›(A3/‹$ÏJsWÇ#D$†b¯+xqþÀÖ±L€+ïœÄjÕÌñ ñ'°kê`|H«ld nÎu¼+-y¥;ЊßoYBé‡ ¯#®jáA›ÐŒ.¬öÌH!¦e®eÓišÂ3ëí ýËŠ’r¥Ž±¾w'rh».§xFcàŠ¶älj 8r™°LÑíû‚x;·å´{T‡ÐéB¸L«ø×cÈ;ÊC±³bÞxÞ9VcÞ¤ž(4ÿ °íaÛ·~K@ºlÏhχµÉ¤ÛmcVÁÎÖ¹ì¨rû­"æiúCðôÓŹÒ]'؉_؃­Ê¯ÇWÒ‘ÚÔep¤ ë“:P`6@·0μiŠY6öùu~eòHí¾-„£‡‰ÇW ‚™vKÛ¹]|°¬ê$wn¯ VŸÜ¹J+ya®] ñ b(w‹ëú &íÍÚå4£ìèÔ,Û½(SW“Xï=~';+4,î[Ú®¯ü¿(CÊK ß?w4ÅB¼}nEãÚFá:²§uEu9[ØÒg$V ÌÓr`Yô5ðÐYMe@@ÍWL Þ€`Š“ý¯¤g0¤ËÉ æ ­AÄéùVuvÈe !wxâ×â PJ•¾À}¦¾…@Üي«¢€5¨¼Ylß ‰#À Ø»þOÀé ¾àHCcàÓõ‹=”Wz©±ØA®W ª„\pRû²b:±”ps܇=GEã VŒâ:f NUÞ´z$%ÕØ^„ûT®  P\™†ÞÝʼnÍ 9ç%Ï@;Þ:*µ5 sZ„=}nÅsËi¶à…ùkÕ­ÛÀ5Å $ž‚/x¿¾03ó=uAÛá¢dJðA+ÂãwÞÅ)Eê˃Ëó¹õ•yœÅ+JÊÎÄihRRçJ´Š¤zÜ×2³>cð[E>S²eµíæƒ` 1tjŸú h+®ö>r&Rª¨®xá#ªŽ(†®ÚèÓtþyòm*žsöì‡èP$–lñ§UÓv)=©©PD°ÀÈcØ5Dé5V‡ÔŽq÷{z…w dɼ'þ™å³Ñ¡Åqî<ïñO ÜŨ¸ º£ˆgéêA†?Ó^s: k¨çó“FÔæa „Ž€ôMAnÖzížRK¾´ñåÇ ú‚æ •½$O׫ðFí»§›µÏ§è÷Íñ°7J‚ÜŽÅ.¼¥nûü¬;’†.¼Ú¢»ˆ —†X°s©£”0¼Iü ¤”€‹©*–‚;ǰ ^¼¾ØÈ-åéÈ¥B¾ñ¤&Ū$1Lø]·›ÌYðn€ž'¿áŠ’`T#‡ÇfL@•äx ÉÝÎÒÕ™x Í !½¦Øo^3ÑvÑê6´'«ÑÚ-ÓC.Úí}Â?{ê/¥¬^*ñ&vøp[Æ~Ö´ªo*ÃÊãóWÔcS;`Uý™vsÝGÎЙe?o!cÒ4jCIOÅ”´Ó_.'%“dŽfKW&¸Øccë…|ç•JÙcm¶Žå@ÞAäᆠ9;‚øÿwäÿуÝÄ6íù }`ØÐ´bhsÑÛ4¤‚wpw ªot ZtÏö ¶Sw[lò޲ÏzƒuM ‰„xÛÛáΊnKm`öìLª´v·ß‹™þ#åb­4Äpäôa{ŸÃD]ýé63uFPË-zm¦†òkÂ3<º'%Ž-üþ$óк›8›(–`{ªš4°„…MáÊ£û3‰¸+ù™ÖÍ=ó}NçVŸx#häT´^bœª½§X+jðçÿÐùÍ+~Ãë¶·€` p#øóBWÈ –‡UÌ䍯…»Õ¢…lïYv¯8‘XŽÀlÁò€Z2ÔÖØtf«ÿ¯C†°5ë§µ–c3°t=0ùŽëVgX™k¹½áz )[PZaêò97Yoß½F]USz¼©ËoKaÛ\ªê”*À¿u=(³Âµn?Öa´Pkq0pJ(|R4ÀíÒâ?EP«‹Á81P$_uuRפ.•PÄÐ{É¥]•_1åf°…(R˜_¦U—‰*·!Pä±aÙˆ †¥¾_ø ¿¥ê‡J+UX¢€É `ß!Ûû×ÛÞón×¶û"YÏl—˜ÀÀ’\kÌÖÂö;CX±í;¹lmª½½Û¶±ÖÞ^²c[Ý9òZ*¹Vk²¢mZ‘¦l-Q„ Ì? ™Äa"`†ú€ÌŒíºµ¶”b„QD—/´|Ýç8ÿÀ÷?7DÍxÍ~£?s|¬@- ¸àßÊŒÆG.|p—só^‚®!ö¹|¿ø…œØ˜ ›/ßTåœ(Näá b“ÄîŠÊSÎJ¤©>§¬¥\únú›Ë¯oê­VY›ñøštë×þÖ|]ÄÄ×åZ—÷EïKÃŒ‘¸L¤Àާ[øo–¿Òµ™£Øx¯`¦ãݯ¾–·>{± H“Îõ¹šws‹ë…þ@ÔõÈ:ÿ–ðÄQ¯["õ/«—J=K¸Œ)/§zT\–S–ÎE_¤}œ‡F =ökB7J—±òìpeI‰~\ùößÛ4•úÇ_©/™^îË=K~ ý¤®ærC/,ÿ¨¢Ý¶’ÅNõþ¹¯£Ì–oT½€@.9[\ý÷ò_KY+ôk±ª–'xâMg<Õw›¯ùBP^Ÿ.*\òoõõ¥«GŽËS\ƒÝ9Ñ_J_(a:î“u¾?æ3èü Ú‚Sˆ½j<ýß/ÎÀÐú÷•®ùú¦¿VóY{ íÜú/ Ü §ö¡0säýúN¡¾AçÝ̹°k$ü艹äG $þ.[B.¥žgµ«׺ªâéÓôl}€ëµ_p¾.ãü•Å X.§ÀÆ‘÷:V¿ü{¡|ÄŠIÎ<Û¾½[WÚ H=DÞùù9·†sWñ Ïç±²Ü:“|â9³=È.fouFÑöÉ æŒìÃ*ŸõÕ© 9éðçïBÝï–ÜîDðDÙŸrM€üœ7ê£DÏIc~¹\·\È}£oºýa¡²îêbO|N®·POîϺ+U@ñüáÔžè™Ö^«Çë=[­·»â¦Åׂ:òÔåÞLÓá75\Fîæ\ø]£ï^Å'†}ñÊ»àŒê”}R_æyLòc/×GKw“Kýz¶gàžŽ¿E2û¥žfŸ ‰ñB§@‚ã¿Ãeâ @(P @P (  @(P @P ( PJý_äÀ¿äÿ-«|6Éù‘¢³#&–àž£'ðà{è迚/Á×ÏÓ—‚ ßö€Lk‰Ï&’Nzm†Ðþ ¸øXRŸüLäüœ›þ·öèŸpɇoþ@ÈGÙD£¹ûá ÅSÎhc`«OuØG nêµý3ò×äô~ÝnÿãŸþ™§éa‰ß³ï+Ø‹[æƒxÍ%E¸¤™Ê¨úñî|§ð»GÆgÉ!iG<$uTtsɾ)iSác?ÂÃSÒ#Þ’ºŸ ŸÒs•ž¤î…ß3܇’AüçÒ"òSK¦œ‹g¼ Ö A/ ââ÷ºd•´©ô’>*iS!Ð%Eø¨¤L¥D—áE’g*èèbYpô‹¶QâI‹eSuGN%…IÝ&ÒP’’gP)Q *iÀ´®;­üKÎ-°”JÓ[´·0B¤ÈiA<+;ÊH¯ØÒ% o¿`u[„Ò²na¶üJ‡],=„±8È{²tÚŦƒ/€,O¼]@=|±tpÅ҃ܧÛ/¨‡–qý<é“´2#SLwpWR€ÉL€2g¤QˤÀ2s{K®z`ÚJë{…øñ¡=©T°xšöR™gçu ¥BÑU-¥RÇéºR±cõe‹©\!{âÂR±÷®ŽT°)»¶ÅT²¾¬ã­Ù/[e«çK-ŽÂõõ¥'é ðR 'åªîKÎ –Ÿ—¸Š×£—_Šé¨—`•¯Y/Ã*`Ì^å"•Ó¾.­# êh—s•°†/Å*b&_é"*cÔ]ÖEWÈBœþZRK”–Į̀Œ“»Ç¾¯ì0|'/NÙ3äÜÆFè§x:Ò’ŒE2—HZ’±KæI\2iÉÆ"™K$-ÉX%s‹¤.´dc‘Ì%’–d,’¹EÒ—ŒZ2±Hæ’IK2É\"iKÆ’™Ê2vµ_î¾X hbÁàù%/¹‹Æ€¸Xðþ'œ@8Ó2z?¿ÐÌî̾ï€ÒÎÎÿþÔ¾zh½;ttíMÓ.ö%4`´¾!}«©MÑÔÿk´€kõ€/Ê7~¾|öla’si6Å´Àâß¾ |Œ·µ„ã¿€·_ ñ77HÝ¿õêÎd€;0f ˜°á€8°N™¤ÐÉ»nÕ®‰jŸ†ëþú°Ãm& ?Á‚==7 BÁƒ5êTØP'LœŒ… »ìä/ ‹J¿‡ íÃ’6ú->}4ù#6¿ Nĉë…8ß6lÔ8R÷CC±bŽNê›l¨™YÈ*al%™ØpnÜeË–ßÓvP©½{vlÆ;˜å?6,VRÙ† %K\¾Ø E÷áíª¦æÍ¯ËȆ^äw^0×ÐÒêêî^³éìÝ´ óžl`NÚe„2o‰¯œœš¦Ü.+ÝÃë²eGß`X§ÝÀi p´4¤Ç¡±ý²~Ñ7ÄÛmHM&_1}˜ß}v9³è˜öí6d5köá7tÛo3çç›ÓPhU4CÞžig¿sÔÏ·gÐúnÎÇcûú=érë"Úµ»È4i.’‡ã¼H22)zç‹ôæ%÷,O¾¬ƒä¶AwÛ:ofh` tdpp·I÷ÛX:OH¦‰……Ó‘C×{©§½­É¡GžSòV qã«#îÜud]šŽ,õ¶òzÙòצkû_»{:•Ü"l¾¢±AˆˆÙ‘ÄDìÈÚ;‡§¡ÊÞÞä[=ÌG?~ Ï©Aâ«´>È´5¿Èµß¿’/0ܻՎ³±…Ï:¹S¾‚dßï`é׳lk#Œts-Œÿþ #ÀíÈð ]ÇH×zî¿þº~§D>ô #„ÄHðà1r\XŽ,둇Ë·a°Ö##º5ÙnN1rŒ¸ŽD½íG¾‰yÈÄ8ÇH8wï°õññ~áîîú5³ðVë¨ñ%v±ÞÔCãX|~÷{¦ˆ¢£¹èŒ^[ÛPø¥Qp¬Àé™ š'¤"ßâ¿d1LÁ±nɯ«…Ÿt ·©™&ïwŒ®µ«p¼«’+Ì—W->”ÿ†Ï >Ò¹™[H`­\æq½ñ}Nv zÌÕ“úãŸìˆKžn™ãš¨ö!…($«müÂ9Ä¢†û«QÁVjêu+PWõ¾¢OW-H`¥ÕÚ<?³ÅÓ´è|*M×®êʤÅzM|CȉQrç¼bÈ^u,—%Géov j‚ÚÞ`£C¯Y±»7¸ ]¤<ªåyÊ’½éyلٗ£D e É?0/S•b¤ÜÓ³waðáÈÙ{´B2­˜ôÑ>÷®7WD}£Ü[QõÖƒßRê;…-ÃS#ó‘átUÝy1ó©Â'¡Ø÷AÕÑÀ¦í1’CV•i[WWÅzXb è/@T¾Ô!jRêJ]uä`,ÜJ~½'í:ÐÒ×Ô¹+%$M å€ÌZœåliDyt¶F”.=·iÊ0GØvV÷‡ví}šªUJªÖ @k„t}\›ëò©E# ;Ð?´ÛQfY!.ꢕ!…+:$)-5Ýt%nhÖSåו±pÆ:«è&5å&=ŸÒb£‰ÀÛ]Π~`¢¼ŒŽm|‰Y³ïa¡ÖljB‹ 'h˜Œg7Ñéqõs¹éâÝB¶¿î‹_yAjÍ霋‹óŸV3âyZÅöœà:ׯ‰b ±Æ²2kîù˜¢‰õ_ÜõYªÓp¬ƒ,o]VèÞ°ÌsP±*vÂ}¼=1\EÜL†‚‹²Uª®².8sm¡ûGƇ’«Ì%-4ºâ¡ôŸ`<¼Ä-ÏÆÆZö©%ÃO¼Ýê”O59—S1Jª°¤ÃjÙ1”wRYê…Ú‚ÞBe@äÛFy†äQô¾Äèõ Ëè5nª*ªI›Â-)ØMçgHôÙÏßΤ§CnlœcÕ¨ÕÀÕ°3VÊY…E|©dC ä ¡„¹ Ë¥lL m,z4)–ÈW^U|ë]!Ìkž´"Ï”tXâð³Ø.€&t©ü4ϧϰbšÐ:a ZÜþ&ÖøØ{ëÛ³•^J›nqƒQ7±nMGTB3kOlêµ-nk°~¦ÜœÊ7©•GÖ\dÏœ+Û2OaYpòWs¡žÉJ¾û©–Ÿc(O¦—vyw…,o×´_Ñ^Šû¢ þ”œšW%ÊËàT«7õèpK“µË¬È&FJhdÊ) HØá{¶=¬ÏˆúÔ¢6ƒÔW4®Z( Ã7ºí2Э”Z‡/m7Ø‹|4"PÓŠ öî k”äÈàô¦zÊ#‰m¬BŒ€2·ÕljŒÜ3Ê3NÎI_z¸­ÑÙ=ÙØÓpa×¢ò«iŒ¬Öªv]ïª|î°caWíÖDQçgŽ' N¡Æ¥',V&€ªRÍÎθ£}Ϫ ¥ªúQmD€¢QbbÌtjY‹ ø¢˜”#¤<¸ÙPœñô5³ªÌœzéaˆ¥£??YšÆZªK ÐÆ‹½¡NqQIÎÑÂk•(ë*JÊTݨ“ΰ =oÈ› “[ʳí,j VŠx“¤Yˆja˜¡Xk>åôÄ'ðj³ƒN^‚ÁR$& ¤ÏSiÃoa¹f¤'ä‹LÅ@zVð1Œf©%¼ ÚŒûª£€ZÕÙ#+ÇÍIa7¶øÄt­ª)}Üôâò„Òí²ª:®öµxv]¯ëðWÕ(Ö'’ŠeÓÕ93-ni…ÓÓÕh­ŽÙ¥ 2yÎê eÄ(m—‹FfÄcQÊVâ¯ßÀGY`xfËдh…Bjµ;äFøØÔrÕò,yü•™‹ï‹Bò×1•KÎ^‘¦ª§WCq ôž™º»©Ð½qXö«WT[JsÒ¬YZio§@Ðç§Òg«ƒ¦(eÕéí©V °Ó¨Ê´Ž’x¨eõ[ÅùHfhͬónG‡;¢v´Á^ü,† ‘¡c+cúÎÑa›Ù Ç-¼YWDÏ«»ZP ºØVv¤øa­KÚljmÔNÐå¯DÌân;n4ÈÑ'Ý|v ùBÈvÞCÀm¸ ¢Ü¿›™l#“·Püæ:HgÈÍp)KÌ(<\´‰ÑJE:n±/ˆ¹˜¥ –pßJwKტޗçYñìQ¤¯]9–<¶ì39&¸Ù<C“+‰Õfô“ôhK’æ Øgt«¶kAVKÓfGD"ˬtGìÐEÅ7º¡E±Šºz%ZâÊû@Òqß®ÀE@%bnë~J8§qz¦zI÷»'\{÷€8jÙI]¹n³CIü:`'nD\B­¾¼U·¨ vÂ@ŽÆåé‚’ÄʾJÝ/À ®÷ºc¤/î]1ó]¥[•a‰KÕñ:X8Ù0Õ9&îuzñ ‚°̽3:8þô p–%ZRà¾|/ `1H¼LŽ$N:QÔÈ, ±wÏÈ-1âL¤®oW jsëëæ SìéNÞrsãÐÈXl«W{Ò®hÑŠuFw˪!CT»µÚ–N‚Ú†²OúJÜpÓyâxô£¶¦¥o¡”È£%¿ÁÑð}êà!@¦=ã¾ Cøª)Øó”UãD™*«ðýœŽÞˆÊÈîä'ö·kN§Î×/´ñì4*F ßÔâÀovij½‹×ÅQŠåèâhœÑYÕ²#ÝËñ8/žè6€—«QGž¬*íÏ›¹”@Éá…Ôñ0= … µÅõ={RC©?ø†o}LÔæ}ù^AV1@}µJ/=~¸N3¬H¾ø¸ö»|aÇ‚ªbHkî²TYŒ-}­@gœ}W‡zTÆ««è•;qR—§¾)ªM•Aù)áìJ¶ëYœf3YF¾µ²7 ¾ŽY.éKöÚF†­à²þ·ë^«ÔÑ¥»Xe†¸M1lj.¢)?$­é`VÖv­ƒ+wõî TÉñ’òÁͬߎtæÃ.ê‘d*-Omè|U¥ô©jàªyŸøEÃ+Y­Ò©Q¯£)èô'NhÞo¬&ÜÍwàAìßÒºf¬Q® ±[J JiÅeäÝJƒp³M¯°¡)~²k =ÏBÇqˆÜ¢Îä¥Užу[Xk}؈üC£vœÖW!F×P´T,ÂÙIk¯5HKm*ŸƒƒÎ<‡r³T4#ñU(‰u…Üš8ƒ‚/èdÏvÅ;ÕëL¶õåº)ECçjŒb;Ud¼›EG醺OBÒCÎŒ°k @÷f‘ѱU¸Ì4ìT£‹a±W»5=¶W¼ÄnöWÎÓfÌœÍ_9—©ÝëF Úê=T$-l ä蜠Ú{«²­­­<°µuZÚ-pl2ÍòZð°¡]·"‘ÎL9Ù9ô£ó¢Q )ò”ÉŒÜÑâ Fg˜ÆR¨›‰²3š´Þ©†³26Ng”^ x1[–ÖÆ§U*c÷ŽÁÿ±øÑòËM/O‹Vj»«üj’þ1mì×¥‚P@­G*³â­¶Cš8sr±ö"7Z—¨qW‘sìÖ–³!¬¢ÔËØÉËzä×O0?1}Žiò,þ¿ÇëtöBš²cÍ ‹ü›5⑇>³CQL1ØÓN=ý„“ïïgNKdÔ¦åvÉ›:i»vb£•ÚkiÆ:§jUvÓzâÁ}^Ô0œ*,°¨UQV’…n,éx·f&ZC®gÖ:í¥‘ºÁ3'ÁGVKÃ;iŽFÑ!»;¯PMÏØ¨¨¼°óG»HT¬|Í¿©®}1híÞ¡Í[Ä*«…QÛT('±ïb%vËYÓøk¿õ‰„¾Þɰó§Œ}À @«_ÅiO­6ɳW¼Ü=Ȥ® C ¡ÚâT˜(]MqfŒØLå¹²„®Ý¦ €:8«Óf¦0«É¥Šµ3VÒÄýrA;:å—ÌL !Â%*ª>¡a·Œ\h²…Tê;T*Sjj{\²ƒ×€ÊûÓ„$™5ØÚטcíäô–>d‡ˆØVù‹.~¯[=2RÖˆe¹·$Þe òâ—ºå'0ÙM0,u;ì&ÍnÖØB„ 8‹ÃÞÚ+ «z—¢>=eïÕ€ ö¼E ñYpCþwuþu¬‰]À"ÑÛ¬èa÷–  t‘âÔ,0€DmïÚdìÀXHîr¢zußT× µ8Uîo6ã­À‚Á ï¶Ä¯£ðwðšà`м×Nó}¶ÿêÞ :O8ͬj®¡#ðtsÚ¬l€Å2é_£Ä›K‘|$›Ø^×RÎ?ª„‘î°,°3ÒûñÐM¬tÞMÓW¦pâ@¥×æufN0ë°ÁÌIãf·âS0 8CyS°#kš…!oÇVu~WreÈüŒM|×šÆØgcõ]ƒF×(‡ ‡¹<É%]×Áò­~W€ˆ…ͧdä{Á‚ÌeBáh7>™O„k;ÛÆ­¨V4y*c¼ö°Vî9aÊ®ñ.œÈÈBÐ5ª Oqðn‘M¥³ 2ÎjNiÚ Uͨéûà`žÛG ‘ì›*Ž _ßΡnl6iFØ´[ŒÕ›?/€`¶uWÖóq¾S€O!`Û˜ƒA÷sNz—ý¢F±IA¶uÐ4B¤1€.Ý+ÛÀÎ*aÛvˆªÖ|ÄŒpâ–òÅ &©¡s韈ãÉ‚xþ¸Á?nÞŽgoôíFÎ~¯n©Pj¼93C†J‘®¢lþe‹ñ³|c¼ûóv»ðaÑûÐÞ¸èÒƒö·1Ù6܇o\w ØÆsLyƒ€Ü‡Yã¶·Þ1hðãhâKÈ„œãèŒCÎt‹åJq6ÄC!9«I·©žs4IÖ‘íß!\/»Yñ‘2[ "ñºÚQ–¬EÕB0&ƒÿׄè‚Ì,5Í®Þ8®³+@ ñ®[rÇfÙJB…÷Å¡ ·<¦ƒÐÇå0ĸñ à+\ãÜ­ìÉÎ&uÉ®5šor 4XïF ®]?í\^͘9±É]xvér¯ †ÏYk€ò8¬·†c¾Õö±@mmŸýt•¢&îƒ¶ŽØ•,_‡‡Ìäßsy®è@ÜÙÐ'™á|ß„/Í?²Þ£ø#SŽ‘˜%ŽºèÇéÅòc`ã.b8Š·¬—Iv–Êx=z红œ²hsÑÍ«?OÝ›¶ÈÝœéf¶™AΜª·»ä0„~{‡]´Œ»Ù¬L3ÏcœŽ•¸W®G=ÇÇÌ9;?äÞptÇMER6/‚=€Ž¬4á"h÷ʇ[AN†vNôU>4ÀÆI;AïAémùx›¸Þ¸w1!:ãÇw–r^‘ò{IÏiµ¬ ‘N¯$:y²·È™…‹Zî<"×ßV+|ŽØÈ4½“7MÝq>ÐgIÇ Ä6 ™Jg𩼠ãŠÔN\ƒÔ:ÒÑò¢ëzžïôžÎÏ—¸³œg,‡Iv¥t­>—Íæ Ír“bÔ {qÖ:[vJ˜H,hôÞÆ?PVP©ž qÅ‹˜n¤Š%çŽríÓM–£iî_:ð+PqŸp‰=w=‡}OÕqƒ7Gÿ Öwéô Ó‡¨k8}2\C4ý9÷nݕЛ†#°ßνn]aNÛbÕ]NÇöÂ÷ñBp#rp—uÓjÉžo`.ìn)cö,½ t¦§ÿq!ÂÏòç†D×ôÝòÞxè»é…U"}”Ï÷íÔ¨Ýj”É?|Ì,^Œƒ_·‡=#Z<6› ½ëŽîvô)TàcÒÛø»bî`/¿'-0£?¢N™#캊´ùi´š½})`w'{Ë› ˜©$ãB e#G»ÎL ½C~‹FòüÒˆ 1Ìe5’›Ø V’{׺q :‚½=´Ïæs‚ÒÏ´ê¸ øÔ|Ë+òª)ÞÛ¸Gr˜{;ÏzíŒ×mõéTT­gõ@å2ßÜ7¸”ÐuÓÓèÉ9¢ÍxZ¸ï¬Nä½ÒxC`ÄM˜ü;ce²8Y3˜;òØ—kÓÐzE;wËÚÌ:¸Þ‚žà‚äÀ\n·èigð€s‚Þ½{ˆñZõ* |û·´680ÒÉu²?kÈ RŸnðîð‚ý ÔìÀqºÔçQN¾ÇîŒó$¯èÈë,§†¨‹gÒê EÀó&xJŽ[©é9P¦ª±& Òª(ÿ|(‹4<†B„â,§ÉÖA f¬Õ„JÒF­+JóÓG‘à™AË¥[yÁ‡Ï]æê™P}WMç“^TXŒ3®É¥¶ö‘§ÑM­¤²h/Ð8"®Ää³D‡Z„7ÍOoMV*P{¸H,¾Nä4÷*å¿ ¹òiþ÷É:ç¸-"°ÇÍ™×P¬[Ô¤-Î ÖŸ¶ä—§ ÃT-½>N.G<3-¬†\3Ì^z÷PN±Ü¦Ú°+âXñ×›»8ÌszM&fé³܃+^™¦‡;ÍáVÏØ-Ÿð(P›'Ê‹éx`>ì`BìØ÷ƒðJ™Õm¥SVoÇR{+gð"åÓTùˆ°ÜÀ²1dæaÞ,ŸKs‹ãtÂâˆ\lŒz'4V.òîŒ;NÐðO ¹Y%ëžsÌo9ÜŸ n˜ÄÉÌ-¥ 1šqcÆžáî fNj„üŠUŸE„Ä®ñûQë¼ %Bõñß¿¤´ÞNlZÑL(Öt#pP¢öàx÷v@D€Û¢ÛÀÓ±$æ+ø]‹m‡ðÜ{²Ïù”]ÑíY´c™¤úvñçx*W¬¼Dåø¨,ûˆ wðåg*o³¸Ž&«'äÛ°cÕqÆñ!‡hÑ«<$U°çÒ ¸Šoc®Ì€&uÂ<>zeqp9¨“ˆ\hùf²È‰bq,ÝPrë¥'¿ÍÜ <Ãg¸ «˜_$£rœl <3!›—æòî*HŒr7Á „ÇeŸ' !Kúÿ¤uÁj.ÁÑ-ÌŒ÷ Í)—4;ÎVDb NnÞ ó£ nj¨M¯‹Ó¢p^b®ÂîéJÎû°–øj¸-y YÝ•×L`8O*±­î‘ÖìmZw^ ß,5nŽº‹äÀŒpíE4 ­lq/®É¹×8ž;˚颜¸+)ÀÓkÜÈx.͸-¢§‰Ä\Ë+TëhžòKsýA¹ôîBjøóÍR»s!ýhlÉ^5ý ßdp !GáÍTù‘ê.IóNu‹i÷wÞýV3X [„ʯßf¢½EèD0ô0«ä¯mP.l6Q¬¢Íó JÙÔSB‡±Í ëF†è«CÀõhBë\$Tן¥,0鯾J§ÿÊØÁΆíÞ^åZlE¦-ré =tã³~çÝ¿ÓúÄ^PСsŒ˜Å¤g»û†1«Ä¿±vf³}}ÎâÁ‚ýqŒÙ* -ösÌÑÑVn°öå!®llP¤gÝ$VXdo§T5|b†–¸ ÀÇ]Þj‡»#5@Ó«jëâó ðŠ¢›rd"^:"gÙQ‰·é3¯Ÿ„õ¿QN¦céäÇšvÜõØXõ,:~ýiº•‹Cï¾æš>ª­_¼Šzhu~ß{úÀh_)ÒëÎRlJ2PJ˜?Nœl7¥§S¦ Øü£Þ^'d›ÖÚöì¦õ?+pWµa-[óKgæýY*Òß_ê©f§N?'Ÿà©Â%Á+øxœžêŽbOb ›ñÔåÔoSʾÒUkΞ„÷ÇÖ„ù`92!PŸ.4D¿BÇ.u+õ»Œž¥?t“…Éï2GæäOìå³/ጇ·DÐmçì |Š2orž¢8S—e¼¦9ßö&*ãÔß¾kÉÒm~òÓð!EšìD,óÉ·ÓI°;çáð)ª¨Üþœà̉öÄçyMÐúRí ›%ð£ž:ÉÂ/„æ‚/‘Z©àÅ*A*4ü Ð\,žÂÿoëÓ3êKÙw*9+й=åµ?;YþéX±µ1í $‘ÈŸÍs¿SgFÕæ¬^º ‰™\èëÒfå9Æë)å0arU¢¼YMep [ôÑu/k+ùÕçKÿ1m7ªCö¦¢JëðT†¥)«eO€giú "êö¦é:Ù'`cAJ& ¬ü„x*éX ¥…Û…È“pç ä[¼×‡,xÿÃå‡ÅÄuÈàºõŠá²eÖA!%TxÉłڽ6˜eýüúS½zýådz_„³ý-©ÿ¾}Ç<˜ÿßÿ]‰ìƒíoãˉӧ½¿ŒûY’š7üÖô?gúpƒÂè3v?ŸÚ A§ýùºò”Vœ§fåÿÕsˆÏJ±StŽcWn*?üf¢Aé*ûæäÉuþ|ÃIF>1BÆRý‡ÃSh½Oí$Ò>áúoîó£›ÚÊØüÉ;Ï€rv_ô&dg2©ï‘b§ƒžä!©Þô)z…›/‚_Žü—Í#åOŸÐ%ÑÁvs ^ç›xß\ÀŠ1êù›ìÂþYp…¯ QãêýBMô3oò«ôwì÷ ye—¥ä™ö ?PÿÌ\ÀDRÈÆ~ˆçÐ_¿3¤ÏyœoÊ ÅGÑͿвšœÉð9!\¼ : ]½‚–7 ¿/Œž˜Áó˜±0:ñÕãó ÃædL>|™1›ð|ËÛÙ.ëúæ¨7›ýÖó |_î ˆÙ0ŒëƒÏ^¨ÂþZÔBƒ¦óš€Ñi)%œç“šˆ)œþƒÔOîÀ«7¨üàš>ë…ˆd*AvNÅæ0ƒzwl —9(0Ï"-‚0­xãgà‹–àà<–ú¡}ˆâ æH¿>1£ú¸S>˜^1Á-0Z\zñ: Šƒ†òçSKO¿ùôkÉõÿáGHPoZŠÚÙˆK˜4 ß#1ÿS¡Î4èSFgø€ßpàµ}®k3¦$õu´ÛSÊßÜk 6Ì7QýæL¤4ÿs˜CM©Å_^ÀèÆc€ Y¾A! ÒÛk¸)?”6A~ ÈÕfqx«þ‡w,²)£| Ï^ôJ˜20Uãï¹,ÑÃC„ƒïñÜÅáwQÔÝmR2ÏT…0õβ<¬˜Ø¢<üĨÆéÁO^H?yaÌ3eó ßÌ"P:)‡üPÔ}=8õäŽ#ÜlkÏöœ)㘞ÃpŸxÛÜg7b>O¼ ç[¸ËŒ~Òj“'¤’þd(ÑOD è.…qâB> ‹ŒÀãWÂûÊ™<–Æ Ö8ýJ,^gýÚRŽ˜žðµ‡ 1`ñBÙÆ‘Ἆ¢Å–û^Îú çô|>ó~Ïþ‹[lÁaµ-0pýÈ8ÙILƒå~™GR±×‘çãEhÄüñ ~†/Ãyð§xÏCut?Åî1á¿…3¢¥ ï¾à혷_ƒàüàc[”ƒMîŸýß gÖdÝ>(õ>Jþ f3¼1úâ>þ@ù@á]LRþ;­°·,‚S2 o“ãáIs¡‰ïƒ\M^)}¤Ü÷‡ÆÂÔ°7´ªNY^†’f•]ÅÂpýåŒþ¢Ëc™’pá<ìÿ9 µÓl,ü»íócÃè‡ÜpC¿nÛ–Íœàðº^ú7²ŒÉá¤Q´=ª£E9GÿâAÅk2|±(Áh°ÑêW»u/ ÿÃYË‘6uE âÄ@l+‹¦  ²)¨r%±(R©Èaåi^\¤ª¹ !ØË¶ðrÊÀ**€«‚;*8£b¦yú+¿°04¬/ûÔàO{jÀ.‚Ÿ—_ê>fMŒ¸`ó¿ ŒDQ$–—LË¿9Ÿ˜‰Ó:Å.e±‡ÝÙZ †Sóµ9¿¹Â½ù†Ú5|¢yç+ºß½h¶nóWÕT™ÀÀQZ>ýKÅkw¬ÁUÆ ‰$…s·@h þLÓ~ÒJR³½{5÷Üñî4Q”¨”píJïOÎïøˆR¡¯ÎÞÞ›DÑüwlIgÔI--m$N£UH æWXîVÉÏ“€|ƒš«Y¤>“ê6ž˜U:¥IDÑ•t~§„)Ñ® ¼J?Á,Š¢äÔ9i{Vk5©.$Ùt²H½·ƒöã{Á¥öÑœÐSñ|•’{-Žô’BßW4hS TÎÂ’^ )½é$!-`®^'|Smq$}§¾SÉYÄï-“õ—ÿLãËs½f¢[:)DÃɼ”¹Õ…¼©÷šÂ 2-ÔX"¶øâ*ËæŽHRùwMôa€É•Ÿ©=_Þ•¯îW¬¾m ‘Ƴu&ŸÒÒhÅ–KQõzùHU£¬^.jrÊ]í¤:©ñv/‡\,m!gã"G@]y”|­õ(1¿¥~s¥®Ôi`#Ø«P:#^o˜¦4ݤ¾§™Ú8âE4ó²J¾·¥@LÃóHb!³È2*Ÿ‰Ý½¬ïuüIH„¤îoÏÔFj»IÛ´S>-ˆ‹'«Ýçzîy¶8~=h¤œfÞ. W–' ¯±4$p…Xg#wI3ùHØøN;÷Wbn¸,™H²942¯Ì²OH+ 3i—‰Ì¢Õ½Œ· ƒS±™¯ó$.ÒA­’¡ë*ÂÛÔŸî 7îIB/¤P&Ê?)]ËÒ©lHJdHZÍâK$¤ ó)qDe°Úƒô*KÂx d;I%ŠãOé©„xj úI²%Ó¯Ûe ÕÐ,&RÞ¤±J/R`í)ñþ&h:ZU¡#:i/EHJ±ÔA€¢{©f°ÜëÓ0«—Ó2êN…V'ÔÍœ ‰Ìˆ;üF]vÊ%Ž·‰Õ½Nü6ê­Áß@©|J";ßî®UVŒHiªøêÙ©‚ÇP9k'Íõ©Èغî,ß7P2Ѽã&õ‡Ry8«Eí,E)P°±«Á ÂhQW@ à@‚ÞLÅ©}Äû¤E™4WÝÐtyT*Qãp¤›#ºÐøo—²5É~@gâ«™§:µ2|䤷)o’´ºLDœ`:èÔÚ_Mï=Nº«JÖùB_¿ÙÕœmâzïǃD¯µ¬>…3Fj¸óžŸí8­Ìóˆù¢¡øÄtÂ@Ô·T‚lŸ·-*Üzcاq†’;Њ:” ç°š1WÎ<î° œ=¹›õ /ÙmaÍ>—Ä·Ëdœ=ì ñ/§qûö¶åš¸Ü˦Ö³, ‚dª(qTÊyŒÄIë'÷ŠeÄ+\N ·š7wø¦…§ÞL»þÞùÒü MDªDZKã-uc½ñ>ye2q)z‘ £ ü{ØAˆç¢]7“ý: x7¤º7\A.'xE•âï›Î h®„to|‹RÍJæÊg@²@ï3ÒÒ¢§{a7]Åû ,ƒì“0ZRB( ºÃLÈ v&°òWÙú|ŸN(¯]å§!Ë ²R¤½ER‹§:Ò&¸+éYôÇðÊ@S¯‡nS_[NÑút¡(Wªo 9¬t…Ö§²&t@™KÄE6î\’,´æ:7°|m²ŸŽ”¿Yƒ¤ Ki›WÇ_†*“æü¶õwË‹câÒoØËE» .VßU‹TàÊÕD¤ï¾…€ Ëj‘ذ5(Ëæùî³·£KN‡Ô@ú"‰Yp(={5öR+½mªyE›=éææ^e•@Èc¨ô «Í{ÄÛÁƒ¡+ Þ» kx“½ãÞÊשVj{X à¶Ý©gџڀѿ-Â- E ) ø0~ ;ÕÁÔ=¨1a‘=§>NÆþá*ʲ§thÇ:Ǻ…rÁd˜ %ÂÏjØHýû[æk dg lµNPI.ªÛóQyÖÁÒ­WJ` sñ]´¼Ãù·=Å­KᾸJ•@+Ñ ;Aúbªäl®ˆlv\rÚ Ü/{hPh áS*ï®Ã† —Ù\_b•DÓgÛÒ1jÊêÓK^J} K&–µVNüWæCǹˆÀhÃxT6îÓû*Zˆ>Jõyßî¹ÑOíp¼‡ê›;Jh³ÞGóm¡êG%‰ðe©÷8×X«_$zIø­ð±‹N0¥—Ö´c|}ŒX¨éwDs•gÌÌgŽ24„Â`kÆP@¯ç›ÞBÅDl‚˜±méAp°+?40Iw 6ŒÀt¨5c«gÇ/NAGë¬,|ìÚÖ¤iÝEw™è™‘é3Ni¤ö¯µŒèÒŸº6¢V:lµµDbãO^i}‚7­Â‰kãÎJ‡¬_óKQïÁgiAOÐÖp§ ¢§Œk±¦®KÙ­÷Ó^¾ñqg±¦1t±£îlå"¼Žr>i‹Ô­"*W™ÌÓˆôN“’ebwmNùµPé¦TlëÈF+n´ íÞmÕ”aæšND”‡Õ8p)Ôo ঠÛð7;Ó²+<ÆÙß‚¹¡Œ"È8¡ÙÊ`×Þ.n·â\ë&­À-ís7ëãÚzO¯5¨=3”åñ7×E×ÑË™8î^ðHwz·É0ñ£ÞŽblj¢á× 9óTôƒ!¶"þ‘°.ní°±ùR6쟺ÉežD·N*t u~ÜmÞ6ïZˆí¿¢h¢he¬!q“/C¡ÐPä(-o8Œ§Æñ*‘lä† ß7ä¾—0ì±öÞ1÷Ä%äHg®S}°CVÂ4²E•V™  ¾ªÇr)¥ŽDRž7þ÷Þ.«3”f±Ÿp1aÏ$Qhp·±õã:œÉ¢¥¥s«L{5"f~ÕÔ{­ZvíIñ·ë²›y9|.‰ž¾­äÇ´žvXÿ†dç­Õ?„æåd‘LQw#\7,û"Hˆ$k1èÉ­$[zÛÑj߬#õ,Umƒ^ ‘¡Î{¢C3,¢ÁÅM'dùøÙ]mMPxõµo³µŒ< Ž#÷oÈ'Í_8ö4©¡çÏ{8 ÚÊŸëþèDƒJ¾SM2Sµk3‹áÅ8ü§¬v¦-n5:BÈ… ÎȨï#ÔôÍ-ÎGÿu±j°öC)¤‡5æ-T«Wþ.m¤Þ¾üBÚ°.¹jVÊTLZ×¾d­SÛîßör¶¢í&D·0 i¼SÓöe£ù ÓM-ºnØŸ‘ ‹_:“N3²Ý2’)°>Ñç…SO`ZQO’:_>†P®’8é¿$C©÷âüH'ûÚ¯Ì Y‡á© Ò!®ÛDP³\{(BVC]¥ø9<êå´Ò6€ v÷ ¹G™u0åÂ*¿fdáÉḎ‘[ï­€¶+çFçÄümî»k1n G?MÍëýnÑf²þRįó'2kx2|ÆPEPniw3®8®eûðñ M 4¿Ãw·ËŠè;t¡LXË÷®é)Å..B(ÞkÖÕ}ÅG„Ñ@€˜À%·Á†»›š¶#AëgFÏì“d\âbôš¹’óxTˆÈpí®`L°rÓz‹5“»â¢ßlgJÙJDu†½> óÙ»Ûiʉð‘PmWºÞ€;ÅôÆ2eX†áz?qpÖ“gßF”Ãß/PޕĉãClDTœ¬÷ „^“ì-˜.H×Q(yÊ{×3·¿ šxtµŒ5ü¨×ZOœYõz/ Ž©2r›Ii=г^lœìà†°ßcMð_˜Ñ-¶xýöçêð¿Û^¨|òŒ-«¶§MõÛ‰°ž¤à—ä,a‘u’÷s•8û©ÆtޤíÀJMˆñÎIüY5ýãìôµ1ƦÌá4r™ÉosÇ ­e12®L͙կ=| †³"ì©°MuàOð²&9Zmd05ûq¸Ýå‡ “'U9ÙH¹“‰’¼b[Ÿ*&ù—¼ù¿*vuÄçáB/fYWîDÑ„Ù4KŸäÀ"ánÓ‰Á¯NÈ.ƒ+(pÙ°66qOädºYsDûÀvT¼]ìüR(©¶ÐJm{;ÓÄx3·<°wœœ}ÕÀ9ÓG’ÑsF_\ &î7„›ºÖƒà²(]`‹çÏAÊtÀØ•& ’`®îˆÄçHsÈxƒDï`vñµ5‰Ø»?ÖT<²úO>¦ì ä\fÝóŠüHÚQÜ (Ìj®êgjÌŠñ) <;ú´*EÀ…53 ×?¢ßhž·aò&Q¾ «Ô8ۈ݉õð7£dŠ=ª¾ Ëkó 9€‰‘Í£W’¸:«"÷^é¸@(KÎÍ%àòCŽ]Q²Ên¤û#C¶¬3»ÍÔÿV~ߎc÷€F[ Uêdllë}n&߈ø‹’·PÞc¸°Rz7^' 01@•#v ™eEÞñs-BƒÒ¹9âGe©ûç÷DJR|¡UÙÛ1²É@dá_—uxÓð5¿¤uÞsÂL¬òÙŒW€~dEçVm„u€ dŸ|=pVå'1m:–ìNÓu=‘AýÁ9v¼ÂŒl¿Ö£Ï¡Å>ÛåM-®ˆ´Ä ”Æêyzøõ‰0^N@ë+múA ËXt›š“t§%›O0×7eÕ+H¢{œÝ©ŽI®R0»š0tt‘Ù$4œÇ6½©\ªOožš7±œ³Ø²R.?`%üp¬uÃʳd†õéÏ„Ë×õ÷5Q’àªy×Ó¬Gqñ³9 .Ä*Ö+Ÿõ,%hÐ[;L]î|F·1̼ÅîJëTøà,¬NÃJí5"”ˆùUàa2Mó”½/DÛ2 §2¹x“ªçé”=pBç2»üaÏûÝ@Áh C€žá¹Ûd¤ÚæÂÉQ.°Ñ« y #Ì&úTÉâ¬R$nJ³{„Š›:+žÎRm»ŠÐ§®vpà#‹ÒsõTÝEJJ›ƒ>ø˜”H˜lÞØ`Ô|;ˆ!•wÜ–S ÂXÓ¸­“Éü\ñÉ@Ò’·U`K´É¸î'î§êÈ,B·Ê˽¾THx+¥Jšmf@3"ÒMœqLf’ä%°> +›8[ ‚”Âa{eìçXIèüŠu^­0ú92á· øs#Ì­d½ð#©›8ÝèÑO’ê Ej2y³FÉ;uìŠË–(ƒ'Cʹ‚6Ï;itŒŠî'iη5ÇÕ7"Òªìgù HW䋟.PÄ£üŠUáöBçªMˆN¹«G`²Þz6Çœ¾°4ÁÍ'B³¢&‘ OÅ¥8ë#åé‡Â@h¢­SÑ¥ãHm‘8àƒl¼Ì€æŸeºJ@ÏÇ\¾ÊñªönùH&íãȹ]åàXç 2Æ\%ï¸ÙÊ;»~­L6›½¡\R7®D„ÑÙ$Rõ‰ûôW(¨êòð;‡DSËRySÜNŸ€ñ= õÄßyÜ‹¸Þa¢íh{á÷ÅH®RÙd¡š´ :CÌlNÝ—^ÿÃ¥ô çy¶1›nÌž;¬7h„i•-â#È·P.v\9teÕ'\…[ðµ2®‰ú‹¥]Øç üO²…²íOg"ßÏI½G…B<Ÿa"_áÓD·äwš³B—]¹Å§;²œ%Ê—ƒjSòÈÍ+ˆ†YsZѯ €{ ”aì% X`OàÖ!Aò<}oÏ×(›ÉÊÉ_»%ó¬Lrxx|ÀU jï¤ñuÆ—r‘®l4SBKo.¯d/£)þlˆ+&Ý|5ëbDÜÍÏ›húé2ëíc1,6«Òí´âˆš"ìÉœø‰ÞZáU…ËlENÜ‚·e«l‹ˆþVêqb4@g ú »”ïHâ ­ '=©Ÿ{,I`f0âlrêRšºNi>¹iAY·wÂßs¹6úa1¢×DW[#”†NDo÷K’!+{"M¡+M¿t@¡´oðP"phÑÎ6¥è·m.2Å9ÓT ?ªx–’_Oˤ f1ôLAí.Ä`Q4 ºfF]«ê™S’8ÊÙ˜µëÅøˆmú(¥uLÛ® ])C+¿§øk-„ùX{êÔ—$ íhâz/”'O%B?h96ó;üAvä…“‚5_5†›¨E½kÑZ2 —󽻼ȶ0Aðíô8»‹žSÌzjýlÿŠgÌÇHã ·4®Äw÷ZÁ)Å TZáž/ÑÕwݫݼv¿ìZÀ¦Ï™ªä¬æ]ÖÓäž_°-r·¦çà ¼Nxéíǹf•}9)ÿjPm†ù¨S=;u§ -Æ_:(dOtÂn·µLG<‡a»Äßµ¿SLYÔ¹þþîrCrWµ´F\ñÅ RÖSÛ´²óïè0<%V3…™CvÍ;·Zzkû†±ŒB÷BÍÀ%õÃê7’êD|~\îBl©c­[ŽÕ[C³sox_ÿÊ¹Ž‡®]ØNVÈð&™FÔUE “íc˜SŒŒÉmرál;Ón‰™_.w_Ê>"¡o¦8±3&9b…è Çúw„íls-÷·k‚³¢&mžlÉ|uCQ2ÚÀÍ6þÀhγµ#= ÍLN•€À®©áNÝ Güzd‰ÍÚÀÃⓎtGͳˆõu°´¹N ›ß\;H­&ì“ vø&Ó’Pï´UbùöØìÜüó.…±u%Í6‘/J sY*Ï»ð¤û­–øÙ=ïŠÉf,ÚIÀJsC™ÒÜ2p˜€«¶eqÔ]§¥}m)z‚âéòmL½_–»/SOøòå¬Cpä³:18ѼÆÞ”à¦äüs%¬ýÙWÇO®¼.ïh$üÜì½M±™g+Îo½-‘¦ß¿òM¯hÁÔmikê1äWæ;)¡ÛhÊl˸¼ÐñÂuæ®ëd]t!®V¾`üKŸ|b;_¡x¼±&ÇÆ”ñ;Ö¡t¹ÒY­J†˜ÃjjæY ̸§»ŒÛŸ¢fËï( 'ÓÎëæxxÒ+éëRƒiÞxáÈXs{9î„ç Ã“‘„]ëNÌ dTeºx®< l¢ÚÑCósþ2=ÝóÒÇÜpÃBØÌ‡¼`†Gkª»Møë`P’¸r“Î kË’úloŸØB7j¸Q\Æn0IN+îŠÙPrf&€ˆƒ%Ä¡c`O€/eè0tcgÍû—;LŒ sÖ²‹zh´/ç†Á»MÑ0YZ¼9 áy2 1DãI™~ ¬vÕ…¿»çy&ñ§Nù¬s$ Y„®iÕ†•ë¹—wp­(Qß8ÍD¾»îˆ9üÄE‡»¹WIsÞ}Jµ’±Ý䤥Áyh½`â:X“±eüœ²ž§ú”‰ö(îbÒ‘nÁœ$/ÑÒÙ9lÐû×»ÝL’q.÷ëi· n¤h%È•i¢¤w¾…¯­TÃl?~ó²¹™è'¹td6³ ÁìÜïþa#)WkµNæ¯À*žö“ÞÀ¶ã0ˆ¸šû}†‹­Ðs—fVŒá,^;·xVl â •júƒb†TÌì]‰ëÐ Ï_¹Á¥aૼA¹šän›INh²*yü=]†õ,L/+™ÒKÙ(ßðF³é+í²«@¹¨ŸS€¦ê`õ´ Io³3Áç'Dú¡‰4’ÏîÚ˜í^ŒÊ%øÂˆïç;ª¿ ð]MW.ß¼‹FG’SÀ±wRúÄ@F“T.4±ƒ¯9gyc‹rÃhW@ºŸæ:ލ­)Žÿ<ŒTa ß^û}À¦º|›Säüd°n|Ó0/QÉø›-æQ¾•ïý©S"*lj*mÓâýn¦ù€w‰ÛßøRÈ'¦<òßnãKóxEþ0¢ŽŸøoª«åüÆká‡þ÷¯+ý~^Gù~6äØxÿY–ãoÖ½¨—‚FûTžfƒ9 WÎô_M½¾éŒG”FjEUþô¶Ê½ 8¥„¥;¥ ñ4y4¨Ÿ³ÿò/rý£€@’áK¼-u¢Ê©¦U>°š‹Òø( ß6þ”#—Ññc†zä!qL9ôñmp¼‚×?ÚEÇ+ãFnΔŔ”ê“öàÉHynU[–ñ›ù—þþ%;9oJ»÷dŸ¨7†ô5Éb†€Ÿ.ðßiÿïgIKñ†ËÖSŒŸceK²-þ­I~7žú0ŵê£ää|Æ`tã»>}éyˆçÏM#Ç) •7¦Ô¦GÔ°_´‰³üܦÓ¿RšÒU}_8¬ýBü­ßî‚›[ÿ9êÒôÏðž‹Z㯽þ_C*Z¯#µ ˜Êõï íô¦+}~·6¥0ò§Ô¢Ÿ•Lš55—ø›S òÿþ÷ajÚÿxäÇTÜè²·/|ãƒG5 pÉeµ.Ó¥¦´àE#w:Ok'ð™]õ3ÄöÿÏÇ#·ÛBT«>4à…ÈÆ½1ÝnÑzÙ1Ýo¡Ú^Èÿ¼¥d-5‘ë¦k-7XëãéÝxV¿_÷øUçÁw粑ΨŸéˆ¾=þ_•ÿA|GMo9~+‡ã#/Çô–šãgÿ“ìì Ó¦xŸ×ÑÓ¨h ŽÕ|øpªÞèeÆôÃt?”ðz<Ýnãûøx"O›|ãwŒò?2{ïY7cZ /”úi!;ÆñŒŸî_<opû~´þsž÷ó¢6ûEI~µQ°’[['Q.-Ödý²Ýœó¹Ä*wÅÂeRKVüÛ©˜À,ê|PTEgùß”‘ä|ê]a¢¼[—ÔLD¶w²Æ ëEÙ+ë!(Õol`3æÉ«²Y,—lVNòȉì„!Ñš+µÈo•¸!¼†/ܰÛáã›Daj,¥†?ÐÃ…S?x¨ êßs)sÃÈ•¤Òhá¶W8X"Ý×ß`I7®MæuŠ>uJîzb##ß4?~„t¿2ï,Z»ùSù3ã[®ñ>¯W*¬*¯ýzŒÙÓ|ÈÈÍ­êB3`U³ ’{¢öƒ°„…¡uòhàx`ûMާ«Œ@;ÑO2l™·n.G¦„òþÙ ÅíÉホ9BVÂ2ŽS1–W³™®ê¨Sʤ£¥Gd¹5¹”QcHçí[£û]:ù{Fº«ó~íøÉÔý”cäÊ 'Úd»¸ô^ÌZCÞùéEaÏ ßcQ(@·iïëRç t âBÆGÍ* F߈$=K;ˆ±´¢ƒJ‰†³µîBjgq£¥0 XÒŽRllA$û{¥`j®òKnr`!©„—óß÷‚Ü«×SÑJf%f>ìë°Ø ¸ X³$%¯qöZúp6ú¶¢”Pˆîü8b”è(£û¥eD×ð±•Ûvîþ*××€|°i”ÐàM vøÛU<³Ü÷èw‹•uå©G:0ƒ,öFèl4c”8Fn»n@o’°èÀäŒC7;k3²z¸O{?8œÎÞ!—µœ)á•͡§ñ"mƒôdUÂ’nã{0lFyM²R±ržúýFs2;­™"ä:øßbgV¤ø+û‡†vדNeÖº@›÷ý'ùU³‘aCh‡‚XÞr_³ÏÚºÜÖóÚëÎŽN½‡ p]^XqzcvÍÉ¥1½Ìlh¾u½Dß_:Žî“ÿÒûú°@ÍúÿhÁóðE…yh¼î3¨¶óÕóîlDŸ4Rðúpî C›_´$jnÅ,ØCMÚã$ŸŽt¬-ݰð)ÖÛí¡ºnÀO…Côz™@‹óu ñ¢±ú^p¾æþè }ä7*D¡[טo™b~œJ«¦A…Ï{’–fÏ®±D4/FHTãt󬳾;S¶°U‰gÎ㹡§œÒÝ{ŠÐÐ0XÖœ²ƒú§ˆÎè«@Ô*è*d8øIÐ*%­vÔƒÝݨ@ÊcɃìÝ{ˆX‚:àÖi^”;wo÷Iˆ_àï@‘µJW‘HNqî„ bû©îÝ/(ÝÞÿr~8k„§.‚ž9óŸúí¯Ák×[‘êÎÏ=õžZMeƒ¸ ªì#ßxºeõ)ÅBù °}åê\¿ÐNȦë[îý…Üfê"Ëå) WÒ\ :ì ž1?P§{ PÄÎÌ'K÷àü¹žëš•ñŒ€˜þu‰›ÿC¢+ê±Dìœk“ Ã)'wxj¾˜Vî—ñ½Y!ÉÀè]«K@@–ðRð‚7M%]l#ÍÁˆ‘ktâ2¶ä`bÎßé…B˜Ðp³ñÊÈ‘H%]áEP¼­k5·ÁNÞßõ¤†tÝv³ŒnŠòΟIF¢®ñ—A Mê%Ð…|µ¿x*q `'ä.*KcOšWeC^.U™¾¨'7¶ùZA}é Å+ÔiVjó€ë‹øœ<†bÖ »ÕÆÔ!nòº´iAWŸÐ9úfVÈ@Çbšfî¤TÓØ3Û·zn5!”2ØN*µY¥Ó ƒk3Nbš_i¬]— ­œ”Ÿ€”©`+‡ä²°s¬i)H¸“3‡„ ½¦Á4„ÎÒ/#¢oçÈGÿÈëÚ›ñ¶âï&£ÜY§_ŽoB€‚&¹Ú1ºúŠ{VtÔä¶ío2ß`^>BÄÎD ¯$iyEûœæuk8ÅÌê÷ZCB p¥QÏ m*¦]!„ Î±ƒOp¢‘”­Ï}ÿ¡âìÀ6VÇݭY@G4ýWn;>ïºÁ» 3'–2 ßÚÔIF骆 ]É›ˆ¬£îB9Ü~6}Wrב¶Òñ`3Èø{Óâú£/ !QdI…Be£c ©WýÊDÂVîûeÔîþŒVXÓQ²utÌžW /+ÞD?*õ§ˆQ {¤-9.×÷Ž¿™(ÉÍ6æÀ®–¼œF,©oáÕ5Þxpcî[ã‡Qé¹B®±6ÌYbסŸ}:W\¤épk¼vt̲1j¦îŠçéÚ1šqRBHz©~ïã [ieyÜÈ¥,1óù4x¼ý!%WGVýöVuÈSR¯m<æäp;rǶ6‚ê–L£LÜ1uG™ ÍŒ¼+¯ÇkHâ æ8×`7û O¿&QžßZ˜1Y.'íÁ„©úsp™,Mâ/Òn±ðjÝLþ‹ìŠ~Kíõ¸¥SD¯ëüœG@O†pŸÔXh²èã‹·^ b6ò™å »QžiO“r0CC] Ïf ‚­iËûz Í͸ðB'7T¡Ñ^È'ôÅHÆárØÑ>ÀÁ°ÕR#æíe:U…¬g_gÛd® ÷¯‰†«H°ì†Y®â–Y ãƒøõŠƒ ½‰¡ž_¡áZ®UôvDBÅ—È1¥}<ñ),õ!q•Ù¶Ù ¨ 87ûõƒgÆ€,t°÷FE®k¸Ð3Õ™íDDxÕý¯}]íx¨+}•W{fQu̯³`H§íª‘¤€P~’ö&9¦º‡Þ›yÙP9 íDâ=SA—ð:ž¡Þâv]Š­B¹³„‡Î1Ê™™P6°¿ªÖâ¡#kÊK4c¾ÎüÑ4ùFž0q ƒØI`ëCÙTÀ‡Ð[VFÐvg[p¹Î¯ŽWçÄÙ=×oe×gÛfsîx<ñ{¹†“Î r^‚twˆ ÙFÛvð†Ô9)$V±™ìZ§‘tGíO /ã$v"4Å0 çS\Ñ[¦ä¶:ó5ѤêäÔ“D mòm÷ƒQݳíq“ Ö pŽ»HÐè½<(çq8r–$çåN~-©;=np-9Þ0Wè+€…—?µh%…PÇÏ8ze i*@jI#Ã^¼œN8’êZÐ7%ŽÞc«è@qÆ’IV$Åÿ,ù6ƒÍ˜æ|Ìcååj´ T(©ªCQº²¬w``DÇ’‰Å¯P¦ðyk$BØ$©ã ßü,ùøÁÆp%x5yz†ÒPÛ&½:×ô q&®Éœ|èÍ«lpDÚ¡u#C+óÍ?Q™YÒ°ö{kÏ\’ž–KP0&ÔÞ ÷<è¿ê בo¤$H%ÀÌ&¾M]RN÷šÄœÍàÇïg…Qð‘=jà.Íx³t«b_àë 8”\´…î—q}fž½YäS-œ7 BtÇÍŸö”ëWªÍ^‘¶cGýÕhpŒ#¢_F"Z½l¤¬mŠ$˜>z› ²œCŒcÁºgƉ˜ <9ÉÂéÐ~£äÄÔ"â{S‘±\¥y¥›ºnø¥»0æÉ—|WÛyGt‡Úáú¯tÊe|N U€P§&¨ç¿Î® z- `W²Ã–‘ìè*,76FÈŒžjôíüÒš¡T5y\{6ÓÛzÂ[“O@ü{!_.u…˜gÖ 2q/Ëʹõ€MŸôã-§ $ãaž§ôÔMgæ›Ê0ABOÐc—PC‡‰JØÔªÆÈÕÃCΪ¦kÆÐÜW{@ˆc?pÁîE¿ø}‚ ˆš±GfÜd†aÎ^4³›r™ÙZvÊ=S àUÏ#Â×ÓqüN™îü_oDãM~núÎçÄ‹@Tá‰à³»œý¨†Õ\è‹u"‡¢ê<Ö&›8*Q˜ý¨£Q†'ÝRàGÐv¸™Zy´(ù ɰ+zçtW0šÙƯ½³*Nd^p yê»ùÔö0pZ‡8‰€½y /^× ·ìÊÿXŠ:À íxsÌD-3ÿ%ábÞO][pœ÷Ø¥ü乬‡©Á¸$¨±ÈQ/$ÓD7І{§}üUô¨Æžšlƒ1:i:oß.K²“‰WµAܦ¶0†ëOÞöz OÖ‰l›èdrÅñZFôKõ¢…,§SZFøúÚL~""תˆ²W/ê—J}q¸—ßu@®ÓÞtÐSsØ\+Ë–³¡&M´?Øg%"t$S–Yª¸ñìã.›˜Ê>ÉGw°¬œ#m*Ì.:›uqÒÓßyiOÝ3ð[Pìsƒ+î.§Ìq=‡˜G•šD´á„©D¥DvñOLwH>¹¸ñ7šFçc¾ÎÅÂNc{–ëm»§í«)ט‹ohÀ–3¼ù¦ErŸ)‹¢˜EvÅPŽ ¥[xCýâ¬Î<³ç38RЬž/.â\sQçï »Ò 6'/õVÑÛpz狌Þþ@>¦Èq=<ºµ:|@îôüh6þ…Hiç&8ðšÝ°"ž”7Hë³üYS¸ç˜Ëî–(‰¹^tó1\ˆ³¿½Dw ÌíØB¿tòIQŸÑ 'Él”©9‹]ª3‚Ð'Ç0}Ö®_ET²e’d.Ù vFûoðô4Ðr&?WXe4.¯à7N÷²Áv‰:1G»ÿuu ²„:²º:~Ì¢+²–@{R¢m÷—JŒøˆIm©ð°/Âø³ãvŸ3Ë•Q•KÙÏÂG7ØT™w-&xkúýÂ×Ê/@ ¾^ì8¤tŸÎÆd4ÇóUZM4Yéÿæ•4·më¬'2É™Oˆ-ánjX>ùçj–ÈuÇ;Í; €xlMÑ ž–…÷¤Öþ­|Dó#©") ÊÅÏxºeyÀó® ÿù?eãIWÍC)Ûæ%½¿†ÒðŸ?úÊ"gñæoiŸ– > ¿¤aRé©-)7¿:tÎÛ¨¬p@Ê JËç£&†§Ð&˜©X?ŠuMœ9t§ ñŒ“üÛ>G¡%œ7R¹Â«½A‰•‰êI€W¸ð(Á¢`&rd“Ö>ÿº«áÂÅßÿJ3Æcw¿7Rßâo¾hÆî¦Or$GiÆ<ßWSñd+º_÷^¾>è}Ʊµ¯è(H.;;Þ8úÎUX Ý‚”JÖš‹n@Âs>_ Ÿ¤ºl‡qÚÙä;\ôKï¨ÿ ¯ÔväL C¹¹«Ã’áéSñ¢c]ƒƒ¿©üd¯kh]G ´#D„î¯m>ãÀ t·\¿Ò°Ϧ˜Â">GùM„Ÿh•é[” ðiÝžYÈ­ŒP'°Îzhì:•ûlz†‚‹‰â…rVëÊþ-¹áx±w¦©Žgv[Jl0¹C#õÆFý ðDùä0BY(oÇ¥õ °©ÞT4Ò§“ï)[…6u_Ѧ~lìÁõ²Ô*Æ­&FÎjÄýªpЛ@àÇl{‰•XôrW2d÷¾D"Ì=Œu‹æÔ_I`mzº«Š§„‰aè³(|à IP˜jÓþÄ„@§(½dÚ½µ?Lpg»ÚR¬S:×Óm9ö˜ë·³;ó[GÊ'ÊO#4ÁŸ$‚~$˜&Ë…~g‹Udb=Ž>‘5~¢ëšˆ€ÑzôQŠ$RއΒ`.Ž9eü x"̘|d(ÛLp1ŒÔÛQÏÂ[~`0£²“‹vu]³³¬±@DCtôT^À|1”všÊQ%ìM(”w BÖè­¶Áx½v9|°<µ&ðá¼åê½FiÈQs2´¡µª:ó}u=/¾i®àüúýЉc½YehÊ&C~ò¾o—/+w¹áj nº&‘d[OEƒ MŒIc¼€k³3Vxôçwù­i/øÎVQd,¾Ùú†°Oê5ýÁ†D$0º8Æ—9êð3£‹¦åظÇp11`yÊ Æ’3Ã\ƒv½ÄpÄè@ Çñ³•lÙšï&<‹ÑhÖzÔcºgöVHY²Â¯/£¼Ö…÷žs1·œa’O‚N1ìI‚]™èKj˜俉˜ÜŽçwßÈ ¾¯g«’ûXb“,&4!ùyðµÔM“å·RÂ,Sh"A—}6^½»Ä}‚SÄ'¸´%çéÒ“,'ûø úµärÆ5dQÙæ@£õœ³äçA¹ôÓW¼oΓÜP†|`¶“­L“¼ ñ ÒÌt &9ƒ>wÀm˜ tW·k4†µÖåÕg&VGƦÇëÃ-,_§ßŸ¯HUlR7¿æHpýmÈvvI  ©hÕÌfÛôÄ‚.¨S«Er§¤ôf¶¸ÓK,ËY1³ÅˆDVrå$à÷á ©˜ŸËÛ•rö½/QIzwWsXU|‰£…BÜ4·š‚Ur{V–y ºÈw #^°7Y§;%Ÿíãî* í«ï×{jþ½3¢òjùHâš¿Çô1ÆhÇx‚]@ßÏK­IxæŠyôñör—Bš`µ lÍÓ—æ› guƒï½8e—]=õS3Åí³Ô¬®d4±jz‰S¥æî£ðÒémֶؼ_6ÞÑXBº7;s=…Û„¶ÊàÙɤæ¨s­ü|è)wº  ƒ\$*LSèNm*.m&Æ¡ñk† ›¶Èká/¸Î^xé ¸8»guîê¿¿ŸéŸ@µ'ý±\> D®è¬'Z>~8oœäC^vîÆ´÷HWBkž#‡%SšÞ ™‰óD¾…"—Ö&ãÚ–gÐ9Ñ_+ú’À¢…;3ç|‰½åÛ$ü;TºÉÐ"­dE2­ÜÉmºa„ÛÖóÜ›ÎÜêv9 ˆ‹» € Ù̼@ ½—šßÁ’\Ÿð3‘dãA L–ò´AÏzcæ@»N½ï ·}¡ q}mÏÝVRÁàL¶£·îÚi˜Vðuc+\’ ê›ÅzÍZÜ2•šš ]‚ÜÇ5Ë[¦óá-чZÞ´·Ð”û£ÙAyiÍáÚêºTS„Y:® …éÂáÝ/Éî´zâ§Ž@-W»X±¾‰¤yÞÏn<®» x ߯üÞ*ÛDCDFÜ:¨µŸ‘ÚŒ™±¸³ö~nos=¢@–˳º¹:aj’ÏH²``6æ”Z*\¸[.m9,ÄÜœ½Ü=&ˆJ]ôïœI ½iÅ¹í¬ AoeÑS¶C/zB ˜dÃáÀ€`fSâb9Á9Ä2I6ÉîRk¼EKF¹=ï~B™Áw-^1ž—ÔÍËÏjEæåÞV)àJAäVÅ•És‡³F´öê®+rM+!Ö«Èôúá8!^bÌÁ-ùT‰F©(|¯Qád9ò QÕa¯!´Z ‚Áä~·2¹âæà?K/ØäìDè“OÊ9¯Z'¯¦IÂ=©©íL̇ª$0¾ª ÈO¡bYÍ#Æ&D9l¤]!õüܱ^y›I Œ7Ì«Èl“›]Ûbµz3¤ò%ÅèoºûŒÔh!=›áfˆG=qך…6Ð4‚yܼtWŒ_øžS…BL÷-⺓Üm2Ò¶*‡RÖ7¹ÉQ˜9p¼~‹’ <!¤™5LH¥Vi»¢Za)еÖÁå¶|˜ ŽI)Ür'”XÕVeÇ(’{±ÿ’Ç ¤là:Ô¤yrâÐ1hðòc§MÌ©àFźÐhtšßÈqÁ7aðŠ šˆ»vMž0×5R®Ÿ}U´®/æ³5Z W%“w¢3¨-+è °žú%³ãþµûÈ3ô½»çKR3=±a¤Ù|ʈX²¸Ž<HµË±J€Ym˜ã„ô=Õ—9#ÅrWFŸ'áÐf‚05S}y¼J"ç Èà îûÁ¬ºÏíN|^ÕžÎæº’ÛÏ(t;¾gQô³XLN™œCÆ¡¢?MŠWú‚žÄfw«'¾=vF¸J}:¬ž˜$°J:±GWwí„Pν¡®Éîpgײ q0°:¼å¥(¸[ÃD¨2åp¬9 è¼®¦ØkIà¬Hÿ€Ø'rw5N’UDŠ0e%Ѻ ·¡¶g;N‡@ ó,¿É+ä\áýQoÖœðùÒSèÛœšŒŸ\ï2i¿$„á„—¤ñÇ~5qÆëZ]^‹²V†* ýÁ*Ñ<Ã*yÂ9Š‹$œè0dÑBBbénF«ÿ -øßGã…Ödê'ôìYáëm\ÛMþ°<Ì€Ÿ@²‰øÉo—¢¼j½ÏŒïwѨf»`ðGŽ¿ÙE_J ½ªÝ0Yò2[QÃKT2¥»ù1ƒ‘õ¥•ºÊü½3ç_1ï`ðÆ7¦Úx5ljù¥V0/`.¬Zmì˜-ÁÔ+s‹WLLl®ˆÚÒ)L+é=¼¼ž¾oI×¥~|'îÝŸ«+üQþ©@i苌-ÒÒœ-^ü­Ã„ûXk*fIÐ2µT†ïÁïPµÐtG^\c³»_yF½ž™“ ªfÆØ£»×Èéb´Sš˜(xÇÄóQ‘ i¦ueÖu'ó ~â&ªêÂæé)‹¾åæ‚ý…/öø·"9Ǫ ¸<­Ö•8o |Fé»:hÓä‹hÏ«Bõöòä×ÿ»GŒÿ†jz™ žà…ÍiDÛ§›ôö¬¡õ9ìÀTªn”]’ˆW%ºåß™1Öz*WÅXù{™Hpßusíï¬aó2ï¥åÔ×l…èè}0>ªC+_Ø ö}÷”ÚÙ¿.&åËÁrØŽy‡ò¨£ÿì`J”OOeøyø™Ïè1Ö™:¸ L5KWȪV¿¹À{°û læ#ªTïµ…Îâ/^.¡¡ÔLÌ^¿™C<¾ó¨þLY³ú䥽DzVYЏ’WúÉÏÿayþƒ­*åd…wšÒÝ΃6¦ûZØì\úÿzY^ºeHÓÿ%›xëü¿J¢,ïÔœN%ÇëJÔüÀÇ¢›Þ½*üvhbÒgÚóöÿf¼í)(Ý|jay”/V®ƒ:¹wŒoG?ƒÞŽù jÐZE2SË´±?¦´ˆ³¸ñë®ê7¼Q'X£ù’bHDÄô{͆àÛî)•™ÙJŽ^» úÕ²lôÍð{ç_£´Àøi5ü]¦±24Ê1®,ù°¸ãÆøà5òwwÏYåV‹÷jó}¡c™ŠM1Ÿþ‰Y²Ç\Y~ôy&Æ~ÁÒ‡|®§ü,}/=;kYز±Âc™ÅùæPªÐݵ£ôÿNÓbØ Ó®>ô4v¹°µ`¯X#úôÙaÍü[ŽÛê±—USXµx03É”ù„E Ä2ÇRrì˜`ülnçcbÞ0¦Nþ|ÚåPü‡ÞÓ2ªAª–Øýª+=¿ƒCW¿B¸»Ëš©SCd2éù¼Þ`îÛšª_r4"ãìâBÝeatE/³J΀yG³.ÎÝ g×t;ã½÷»Õ¹ª‰ëa“awÌÎõ¨6üœT9óOc‘·wú'cä1%©KéoëOdQêé¦OËKuÔ~Áó7u~C²àê=]gJúbÂ˵ïØøb1qx=‚Ëý±’gòÅñƒ(3¹ƒX*«]4ÅÍ.Ô,ðßÎ4n5Êc‡Á3Yƒ?fLåüPƒ­9Æ¡ŠÿfE Ÿ¦÷¦­ÎÈ€j€JÝü«ëƒÓæÓzŸX€ËÑiªá ±¾eÝ”}槬ÎG×èú-Sª+¾K¹Í®uW©ËBÏŠŒÔýƒí!Qúmò1¿}XþÆuبiz¶ô®YCÕû!N5o؃•òU#}JÒdë¸^Ëv1ÓçŽUÒåÚÛÖˆÚǨ÷8S¬éo}þ{Á×ø]Rú»±1ìÍ‹Ö~ëóò¾ÿõ†tÚŽi|ëZ¸—jÐì‡=óe9Ÿ,‹òÿº±ÌZot!®t¬—÷±˜•¡k í|2ˆ;SµC½mX¬T&ÆZ”¾]«=Q²1·ráõüe/ž¤³«R_§îPsÕ”ìÁÐo(ÓæúZ¬Ö¨ûŸ]Jƒ”ò'‡1Æ¥e¯gqß5cÔ¤êÝi^Yqõ²ºP§VJþyÀjV²¾R«K†ä×Íf¢©ë-b¨˜Sý¼Øee™°¥7SÉ“V¯ŠÝ•ŸÄÙôA0K~_+×ÊäÃÚåèþ¬ÿ ‚QõýWçdÛÙß3UæÀµ_,ç—Qû{‡TϹD×em5gXñ^ÓÿU‰Ïð¢|P5ú>Fõ5 ·ð×S/¦_ÛÂú¦;¿áþ‘¯?¦°/žN¥e´!X²•±b[dÓ¼ª¢¦¯ƒõiÀ`~0üõ"-ü‹OñÕOÕé?ç…è@ó>bÞ¬˜¾d½"†ößK°?¶û„ڀà ¥ß[Gpò%û]Ë¿æï|ÃZË¿Zý_8Ç»hù'-™¥Æ31” }Éu$‘/öK¶I+UÞ‡ùá@„¼e´Ÿ\AoÞùy)žô‘C¶½ÌÉG¸üo8®ÿ.æü˜†èþêèùÖa#>_ém­–Öúë·yÕªò·íÇ%—ãOGÈÍÐþ èù‘\n"?ñZdJ_`ö’éùµ÷«LçW¿@Ý)ÚXi_z LíTÊajž¬_û;g¡Ú.‚±30Õ?59b0öѽÜÿvÌ|íc~AðܨÊÿ—‚#ÃMhÔÅõEöÒ …êø»Qý™j€DÕûs3e Úc×Ü·Ašóîa[ŒéÇk5÷?Yv\Ÿ3Ňô¥¢ö;ÿèWºYk}éqÉÃvÕåÉʆÿ]šÿ²¤Üm»èü^6·¼dºhyPîbô7\úèÃg¬dŠÇ\Ê”{9ÌH5÷ÿ³)¥fG~øŽ¢!¨™f,Ó>Z&4á\)請¤Pþ0À¹.zÓØ´o¨E6µ—S늅°¹‡Ï[åEï‰T[j¸_Ó^GâV•u^¤Gmë9`úõjƒò¥Ï~Bx6¸0u1þ‡÷r&V;M¯- €ò†ý£Õ~°qük@#Ëå«+kL~¬ºL½ÿÕ:¨º…µÖ{¬µ`ÏV¶ÓæÂã.ª‹¦9¦u¿X`Yõö7–?_…À>í¤¨¢Œâ¬öªÉ+Cëa7ÍžñÌ‹Ì~/Q~zTý-RèŠöþw¨´®Ù¸¢Ø^gM ñÖ‚þOhÂo£«øÜ~Þt¨zý]Ðø{æ Ýæ"ù^l^¿ú烞“+¬õU»ðz*ÌžWàÅþ–—ÉeJ–ªûÿìXܪ'àh­šW¿‘}çoFÑ™›¢2]YпЍO`òó5V…+’8ƒ[Éá QO%á«KŠÉšnSoÕë‹Yßù”?!¹æÛòø =Õ'ÙÁÍ hÂ\åGÆÕÍ·²^F'²ù܉*TM9\7" ™:J®´ -@ùXoÒ¬”ý¥_—ã×V¾.x\Cð ?aØÙ·®6J¬Jy#bÈ•gÛµµN$Ÿ‚{.³›_w_Ý˜Ðø¼&Ÿ ]]€68mŒR± U ØBdU)€O}ö´ÀÜ«8‚²~Sò7-{«Ö¦Íçu–)—uÓ}“쳃M†á@ÀoÌà„x'{®²Yó²JÔ'Üüa‡Eƒ|xú9\ðÄ5œ®FûöŠ„ž¶‡âdƒ^¹Ÿ¹—A%ÈoJ(¢Žæ¦åÐð0œÿ€p‚p®ò¥冼øö’†ƒÙž*±i*{DQ†¶?»úBÚQæ@ôêÕ ¦Bhr¥Ø]Ú=Ì{šÓYé‹Ò%@&çdETR ö›s3nûS!Ö$ôi¸ÍNÍè´Ó^ùI3¯²ÙŠŠáÂiÅkbÏx误¹HXøßH܃ÞĤæâÛ†S‚lþ¼ÌþR¶:åt³å7>#/ž¦ÜÄÜk¨làã§ùØ!Ñx°ÌÑ|^UóàNoV'UÛ‹«ïbï.VFN*’æ’Rð|œ–°~,ÛrźâÛ_ò-+WŠOÍôªÀE|=É¢»>{ Þ A—¿µ„hm4.n:M»V(„€rÅܾ|ÛœmçºI‰!’ÒÕöÊ[#²óÄf¡Aò¢6ïá¹ÍP"®6ßr%gQrËΑzÿvš5×™\½ƒ‰žÐLRë¡.Zˆ JÊ?´µ³/$Œ¡eT_ŸQÍ%DÚî E‹ÊZÀt¥ãv·ÿ´Ê 0Çtˆ‚-&½½ˆèçJö2å[cÙŽ¢uà™ÊžÆ_^`Y‹VE@“%ʧrèAÑô‰9€›Éé/á·ÂÕUëN&á¦%ÕÑÓ_M]rh6eH½bôÉ®p¨$µùì)ôøñ¨ÖÖ4~ÍëðÒ2U˜GÒnà'}Úö@a³¯pínrjg %°0ÈÏòÆŸÊEy ÐÖŽå¬Òù'<+°k57] .Ý× .Äs>…3')Ç¿Þܸœ§ÓùXEùwŒFH߃Œvl¡CYÊ×ÀPR(œ‰×“/²ûœ±x#Ý>Á¤XÊë)è7‡Ì«¡ÒìËÿçΚmÒ )8ÒAÒjÒ8i…t2)›ÔMª&“¶WÑ;8…Kù¤‘ûßÈÿ<-Œå‰›†™@‰–¦€ ÷3ÍUG^3°4o¢Ó“<9á\°éçëT" h¢Ð¹`> ŽAÒJõZ\·N}}HžI,ý;ÆÓœ‰HÑ^´{¸¢×Î|Ëp¤Êµm<¤ž'¡Ç )=4IÇãÊ8&¡©˜>çásEB|Z}~ÏHœb ÁH†ïÆ ðÀÇUŽæëu€ÍG¼¿_#![´ÇÜâeàöWQtšñ¦0:ë3$¨Õ÷y.ž Î?´í1â°B¬Îè’ç4J¡\Jr%>—5-šzÈx>;²O¼ªzŠŽä_·à`È¡>-çÑ6°Ž`Ô=:Åy½ ”Éëâø®ô ·~ž„0^~î5Ђ­4qɺ½½þ™É'Bj8§È P&a ¸ÆÞF¡âW‚·GF”¶kzxÝ8óa‘ijÃ2ÂÍÅuhq*ÒÐá‹l 2…ôÏ¿³¤b…ÙÌfCMI·¼‰fK‹/[6b%€pŒñÍ¢ H#°L$™ÜhûW -~Æ£#nÇVfÑØì ¤G‰¥/z‹j©8×vBJ‰% ҜŸ–Äq^õ'ëIk(¬2¡‡®æ¸JºU€òÒ&èäæ|Y#_¥³uÔa/ÍFpûÃͲ­ÂBs3Aèõ¤z™É…+ÀÌT´ ³¨MŽ‹¬5×¹HžÍ+a×ˈ¯/X3‘Ãmt×nÛ¶Ø“Ìø \àœdÍì ¤û³…?ìѵ‚†-ØBÁ¤hê8827»LCuêÝ?á·5–фΓ\ó7ô ]º¬äªÔß'"J:Es”§{•dxer&ÓD<¸øÓófsøhƒÅ65eí„ÌëáÚQ™%4W?µä0Àò¤­49IÓèbåxÇ8ó7ñ„Äš¢}«a0…‚ƒOgu(y I®DT,›ÑpÝsÿ/nV8­9N'”N>§ÕÌÞoØää IA’Ìäé?™Y0 ÷='í-Íde°¸Å極O—A›KÞ¥¦´¶9ÝÜÙfíÚíÆ…®À±¥oËåÑ-±ºŸ¡| .ª¤LüÞ8¶§Ï½vÍ8ZB@ÜÑ“Hgwœ¬ö›lœ›†ŒX%"×bc…{>Þ{«Î9L¢$4³ÕŸï”• ·54Ðé.øF1)Ï-»uò¿Ù†äp7DÝf^ÜøŒB:¸]`— t|^d6YEùX(ieÇ÷%;®†‘šñvˆWÞ¥¨¾g£‘„U²© ¯%Uqß×QO,ð­×uP“fªZa¦÷Ýѧ·¦±’ª lÁ…x¾³zÉeó©®Îµ„Ú6Ô8>£2 #eä«¥óÖ Û= i»³d…:ã5¸„ G‹%8‘;l>þA¶D¯WŸü“ž [t¿èÙ0¤›åeØè²^Œb'‘ :¼ØÈ¦¥ôfÓTÍqž·2³6eõüÁÌ×Ï6¯¯$w£ŸëN³™¡:B½«’Ó«W„6e9Æm"Œäƒ£ô£öÄTštŸ5ã· :ƒ¬Ï¼L’ä»Ï*ˆÐ·C(AÊÞê³&­ÙMÆ]œÁmó@2L½y!y x¹¡¥¹ªR< O'«œáyÞD霱%¥è*.}fàØ´Ot1ªsQØ·X"ßÍF ¬\àr"ÄŒ±ÜüPýwH] ­,fó6Â!!JdôA^e"è‚F.‚uu.,Ï•¼uÚE”å°ÎSæ´yÇM4!u:ŽÀìTåä31­®ycH[Â.·Þšf;¹«] ìÞ +‘DúX7W9ѵ†Ö)LP·[¶ðeÔeçTydEµçDåþ€"ÒYÅÑ‹úqC5ønP¯lí$u®îè)‹6ú¯É¡˜%¢ õ˜£N·3³¶ÈwbÛøJ´inn›§>Ͳá>ÄhO²«t¡oöžÐÖH'7 c‹O¼ Ë.DÌHÁø"¯,tiô©’sx¼x}·³Ä—Î&œ5Ÿp Ç!^Ð]J ,k–´FêÉ' €&£Š[l,ø¹|½®<¤–Ìln¡i½s%ë¶Ò.vmö t™Q/¶€þrÌLOC1å5ax OL)r´à@HÑæ wh­P Rëf»†—¯s²ã"‰Ä’“S‡—¬Fû½ ®¾*Ó}:X`’O&ÅWзQJ’„œ-ôX¬;ÅÛÔP¹¶8.ü¥ZøëÁÌoÏÏ0ýѧjÓÏÔÜ/ÿÛœx(*¡øã¹¯â›4kÉ>ÿgnG¾å¢‡NÜ÷ÇÌØ{è›qxs–¼Âãd“h»”yûéLÇͶWú5D51¦Žzøgõ5 JHÞVݤû¥Î2ž¥m¯¹Ç}2FjLÅ'.Idɘ6ß3÷ÏÐYÁ%ƒ(„¬é|Ú@4ê¢&— bK Z%¯¹Â"LÊIÁV#mVûë0]­‰¦yékéß³ º©¨Ï e¡|mÆ®¯ñ@èÎJ9—³èÎn‰¥6¢:Ê}ÒFhYqGÀ?1” D\¹žs¬ …_AÚt“À¹›%nîB3ݲ¢äĺ¤ÜH]xNÈØð© p‚ ¯—ÌÞQ¾×øú_£¶,Ωºõ.­CÇFÜ3¹¹;Kħ… X¡ƒÒ§>°JᘆŒt•†)P•íÚ\x-ĨN«Çæ^°v§2U è9Üg6§×àugîêN’m½3Žz¤mÍÂÍu‰…ÑŠÌ7¢¾PÒ|¥ûq^¯v5%¥­5vÆÒ,üÌ`ÉNvÂzVçÆ-W€^†ï ›cº[qºà9ñ ª°““kR ìo¢f/`“ã°tŒ=ìÅ '÷õ…7AÔß´í¿pÙERüÇy÷¹p”O(¬< …¢¿At¹ú5Âìí4Ké–0½¿_ë…p„§ œGÁ•ÅÒÁóÇð?*¦¾"Ú¦öâ"â¶žÌêð¶ë—9õóc5ÐÌáóî‰A*O¢{÷óöJûº ÑZÇþÁ=qV¼;"Œß¼ ›Õ ¥}£ ¦)›ÿIT8ñ¥LHé•ðIŽ%>²m2¨ë²ÁرO’6¡:‰£¶$2(›Éà„-ŠàËüìÊÃHK2pVZŽŸ¢®IØ0G½ õµ¼ÐC¦ìº™qÜYܨTç´Ù'OÓ­MµSµ]²fyG‹´»ÞqØì'p rjöÏ!X…T}€Pæu!ÁÆYj¹=¢¥žàÇx<šÓOØa}–a—Ê ÒÑÂ)¹œgMŽ„díƒOš;-úa 1ÄDFtÇ^pþ©Š³Ò)˜4ò9Â@ˆ¹kÆ¢r#Aîî4yão £`<Ž©Û½là,÷é8Ò:iô÷íƒñ¬ºãí‘xC  p @a+b§x怱ÖÌ“ÛÅY¬S„¼ÄÚÏZ¨p»UgâÚñÖ¼¾Á±§ó ÷*jÌF@v/¸<¿9~fÕ~ºãP›W·Ê×Ç»ôª+ZM¢¸,¼î3p¢mðçàÎry™—Â0ÇaÄ—'e8¾ë^2|]UŒþV7q¦¿øØ%o½ö‘…$»ä®ÉßU‘m«øŽ\bʽû] ÇH_÷ÑC›ùcÉÓR_z–’§6}zÜ>žWûù¾ÀÛ5ɸ*p¾Läs=§LAwÅn.§bÒ¢h¿œ;¬ÅN±u'~ÈØ-ß}ÝU´ð;—¥äÅ1w¥¨e;cº‘ÒKUWÂE…]ŸÏ¬™U¶¯ ªï#;ä`ZeÆ<Ùïª|ùªØþ—ŠÔx1¸ _¼aŸ• K€^nV²PŠg\bù¹Ÿ6Zç+÷“Q5®–êlбdñû”¿+{U‰1ù—‘xZ~™¨ ø3sQaË,ýâXÐíÖf÷ÿJ›Üµ ¼D¼2ž¥o}Ê¥Ãó3ÀŸG.í3°¬ø (ˆGðoè—üùªQ½U¶öš¶j¾3öUºCTË _+› >M©}÷õµÞ¬?ÑTócB©F ]?Ži}^†A¦<4Û÷ïŸBÃ*÷jªC÷zž[z™1ù¯&ã©Ê1‡û5ÃT÷?m®oÄ›KÔpŸ#T¼êƒDcï…èþÖ{Tµ¾¡¾Ý ©¡”}‹ù÷®]Óë )›êï]0»þ´‡ƒÈ7ïcííO-Éå'Ã@|>Þ4`ÿ7šBߺéÛ€>¶yAlßi»ùíÆþíº9LñÎBÏß7Ø1Êòü~ßëXÿ­¬™{ÑäbŠ÷uZów¼ KÁùû9«³Û‡7¦xñDÕÌÌ{ÝÇîW.Iö¯ß‡ÙÁ¯xæmµlXU¡CÿþÕÝ4ž)…ïɹŒZÖ?/~ª™¿à\¯¼?h}âïx¢êí0ú×;ždýß}—z²y_Bª= ÓËÿŒŒä+ú»ªÉþ»ØOŠ1ª…&ìc´××W=Õñ¼TºÜzË…ÕÑ=ßFÙÙû~´Ãé³à§¯x¸rŒÿN vÃ÷Ùt¨Ž÷*ÎÓ#yþȽo€ªñw+'yØ6_ûïìC{­o;¶ÿߥJ¦?CÏ·aýÀ©5­à\oF5[lÑÔÕÁø5íóå¼?öéßðý¥B~Å;77>õ÷0ÆOñ[D÷ã?‡@fŠbeø_¬¡úá2J÷¶rW—VKŒªÕË¿b‡õøï cúüðx1¾ÇÇx¼¼ÇZQå~—Â:¦ Ü•ÝüÕB(W¿es¼ìyÇÕlèãhÙ»?ÝÕ³©Øwëø¼o˜cúU¥—æX¼½¶ïö·¢Hüu½¾w¥¼ ù±jû3)v£jð8 æe¾— øÀªfÿ`ü‘æò62ýDìBL)#+‡ÕLeðeÖÙÎ߉Ÿ·ì^niiÂümÉÆïö1¸©_?–&Cäg~T..¨Mlì  Õ§;sH` üÀHðµ— oýGô ’³ª,ôG°Þ·¨"í6¶ù}ðm6¶«bø0O×û?Ì{9Žášc¼¨Êå^gLt÷’Þ¨î†IÏ:[Úq1}­Ï›Ð¸Ær_w…²ËÚªKÂêô/Ò úøãá×U@Ñ*?'•<ôÓâY¾ZДêöÜŠ€Y‹*õÒ׳1RÖ(øk‡åvýŠ[Oci£í‹;P+±o]ErTÿLxäSÊâ@‰Un³P-xZb2¢0¯É‡iõÕ­àqÓœm­—)W¯3ö~Oýba³ý‰vDÇ×Ü\‚êùÏùô{RÈ2öÑ/JÕä”zôvúÕ¿Ó;üZsˆÊõßð÷¿©3ÛøòL óû^-§wc(-øz¬«ì½òå´µy¿Ã÷UIk>)Œÿ ú5s¬N2 _YSL¦”æØýSQªöÝ6}×?ÃVŠЈ†9¹RÅ?‹` G¶TÿØ$Ó­–÷wGnàúŒ*÷7 œ/9^Ò…8¢Ú¯½ÃÆS< C³¿o¡54¯æ¦ & ÞR‘!ªb¿¿¸Qüˆ«í×yªøÕ¦—ãªä?#3§L/¸5Œc±ÿ¾nªjcr`'ûÑhþ®oíC¨ªÃS±ÜùgbvëVÉÔŽÿƦ”ÂÀÇ;IÏOÙ§13[{PÞõÞ}á¡9}¡1™Œ‹ë¯3´Ò×=ýzVÔŠŠY€¸Óý.ÍSêâ}!×_eëúþÄÎÑñ‰*mŒï)4ÞlP¥.“å°±‚×\ªËNßÄÿ\ó[{î?~‰[éLì}Úk ÷öb >*×û0øë¼KiEe¼~—<Éõù<Êï¾–ýcÀ¥ê lýk7Kú|ŒFUó5û¥3û¦çO1ø¿®¤‹K—jŸ¶Rän?±…í¨ö;© ë@H2·À–åBòõïÜ=NÆÖ£[J²ÇŠÅÇL.¶ª•†GÖE~¦¨44c¶%“µø2÷ö?F…_Ûá4_Ïvƒ|;«"’þ›-_ZlÝ ’¨z|å“ù!³@ÕÄⳇ¤×ÒÚ¡ý~%ÔŸ¾øà TÖoU‡_îFÒÿm+¬¼…*¸¾¶^oß…/ØÅ´&xƒÿý OËø’ÌÅ‘^)ánÖe¾1ª#ÞõÕKð3¿<Ðfþµ©üÅM§ß xÒ eC³ái¹I@.:@{CÔK&ÕŒÛ,§FOž!ÎñèÇ‹ÁÌßÖn%¡uhG„Iï¿&Ýå ¹ã"-˜LaÜ<P#Egs‘󙨮ð„èfuy¸%‡îÍ_“¸µ4é]ÞóðÅ@Ñgýjvм4nª C¶õüÊQmùîs†Ö"üÖØc+k·À…Uå`¶#)[³ÊÆ*-$é!g«m^!—gs³:kÞÈ…<$ÈyŒï1#Á„¾¤Ëû²ä†4U4|`Ë\çWEø®ßû%Á©¸¤‹u‰tžBË@XÂóMS”¢t¬´JYM×ò¢½jåœ'Úèb¢¹{Eás ßX,J‘íE­&baêw½Ä.AE(~$gÐBžj¢ˆóô4\¦m2…¨ç ]’(1Ê?èø£„GJ@B¾«N¿r4ÑQòa|¤ê3'¥¬õ]üÜ~þý/%•/Úz¾_©iªî9-Û×rlZ¡Ã630+¤£Ij ^ÿR<Ç2j4xÚ]¦&<ôøöŽ@z¢'`V¹¨)€|ó C"ùž¬Žú‘ÝwÁУ.°Ã! àJ`c•Ævcý—ƒS¦¥”e9DÍô%`/­á,tãm’Ap?í¢¹FòQ/à3Ƈ´c ÈOV˜ýÁmR5ΟÁ&…íò{vâU§KTÔ uÿ ý›XŸ²û¢ ÎAJÊ9¹TSáXðäì Bݬ©uÀÑÀçSÿa½DîEB"Øö(oÀ®÷ÏHt¯ Úvø½ ôØ;¢1“W­0Bé} ŠaSÙòût}ÙMù1Pƒ­JÊóÃR<Ì ©¬Éšâ|ðx:’—Zá» Dpµë­Ã0ãa-žz×ů€mê9£ùU'£Y(¿@qƒšÇ9 ­Iuëà„=1¬ÐÛ =XÀ@wyÎ¥rc‚PMmQêSóȤ÷(RÚ•µíbÙý {˜ÔìÁX] µ˜q þÄbñ¤Gä ºÖS¯AýX¼´>›º…g\’Oó§•8„•—Áh €O^!QŽhâ³×-hã3¤áçÚÑó¤üîFi¿µ|Š! ëhe²¡&æÅ›ñ< Çèxå»M£M³ÂëìDÒMà ö@ö¬?«ÀÏóU v7!¼Q<èõžj¼ŠàL9]m¶„Pø7xØhõókÍê5¤ÑîÝ|¾Z…€¨ÎLÜ*Ÿ¨n;(aá/øiIK–•mµœ!ÃÎ>*máa¤ÈpÈÏ’ßImËö l»ìÉee41F-©eôÀå9öÂ4™Ìæê2!{ÒyLÉ6ç6]ÄU¬±¢ùôDhsnzÄ ê$&õóADâ€d<ëBéEJzÀ"ì\@_«}iëýT@f˜K.éÑp ÞëN»úd¶fÏ•€_x†xÖ_˜¶f¡Å”2’’á»Â³U‰tí&RàÛ¬K®Â5wob¬1Ý”VÀÑJÔäR÷áì2£MÊ ÈFµð‘ÁR3ÙÚ £Ã!\®Âë8å lë<¨”y¸ÍÒ€‘?æy^ÍÅ“=«_%« º%ˆRPO ã”R©¥š“JÊê†aNíRÖ9õJF&…EAä$ºB©í^9h§[R— Ón”µƒL·I™¡*š0w¶·¶É¶zzì,ÊK€ÝM‚ˆˆÔk¦ÏÖR}ŠWØìVëÁdotÎZêØ¶#“Xrí?<¯m}¶²ÛˆH+‘mbŶkƒ#ÛZ(HɉTÌ%ã÷p­ÚÓÙ• Á´É¶8Bˆh¨¨ì»Êô¹Ì Y$Š*,© IùN÷^rAÿn:9EE·dر§ˆçŒlV â‡6Rè§ Ì»hðÜuÆÕm,Û¾`§~{ Ó0?h51žq³±’Bº½—òÉÌá,´ „Ú32yÚB×ï¢wÜC]¯:Åìרôê·Øíñ€Äü]O`ŠÏsŒÑ^@“ØV™ñÒT†5âãÙ§¦¥ dý± ‘ÝÀb#…œ,2Ýr*¯/r­Àe€êŒ˜LqE œÈö X¸“§©&ydòJB[¡6ÙnْYa²zÃÊ€E½ž>¤<˜dÉX» ofPiÍŒæªÏ©hiII}'H!²œþ A.áèü“€P-Aï.8‚…HÔ=êèrv  Oô˜ävï3³éÝÍÐ•Š ö€ÂˆéOén ŽçoøF«Î¾LÀÆÝMÄ+\O9"–ânòÌžz…ŸÀ˜qøÑ4/Q´ê9(¨‹ *0ÊÍÈו5ÕY‘cZѵV2ÇN˜Vf:TK.Ö zÇ3£t4µ È›vA¢R@u§—€…\O(0ämR‹nØt©ÓôWåP¡¨ÞN¯'ä¢-ia!Û±š"lPšïÉhàu“ xžì1@SþàK{""9[Ç pgûºPD!ôÇôo‹¡fŒxѸfÝxœô+½šçás!ur”„Hçr˜Ä÷ežñ9ª÷ªBƒY) r?U¨ØI™ïIµ…AîÝ£pt ûQ: 0ô¿J¢DûöuG&Œ*ºZŠÃ~”ªÂYí[1Õ7Có•YÏ9Ômà+ÓDó7·©aæÃ!hgÚŒ‰DÌÚ}gÑZ5)0¹ÛÇz^ðëœIüì¤T_þÔD@sÊ&æÏÔÛÔR¦Q£k´¯?ÚàâÊL¿›1˜ÊÐSK€FI¾Ä„¤ÉÐi­O|ÅÏã1äÉ`†gi§ðb‡ßÆbrÀ\¸7®?M—`F™ÙÏ©”ÅØr”&Ëó.Šã©J_‡ŠG wÑ”ËÇÏ<ÌYÍØyŒgæë¸Øíb¨ŒÔžV?‰—ô{2›+Ûdó¦Vèh[epÆDøˆòê¢&üJa9 uôs2’añt¡PBe'NfMµjz󓣌z—é²Û¾HEd,E¯?PµxK©Ê¢\ gÓz1ÙW®UÓƒ€‡;¹µZ]šoZúeö=btÔà->V¹ödaÛt¾×ÓfQ-Ã÷»y8ú!£9šF¹pqS7áÖôk¥QšÝ9><2Ð:æü‡>ÎèâŽC™¨P¶Í(ÉåôpÎ8óˆúÌ5¾7ND©M'„½éæ¯yNA§¥àÎTʪT%eæ+¼Šä˜|ñ–å9Á«î¶ªh€32ôLw¯6_o:8d§Ã„¦Ö"äŠü˜†+E®ºÒA²cÉQj'£G ƒ¯?³ÅÃxÞ`Cô´¡4t\©yTätÆX˜üΤ·•Þ´ÛF§ÎËÞ¾.jsô;žÊ3ÎÌÀ\´X­ØøGä:âðŠFJI|_°t½4w¤„¨žu.5QŸ! ë ¢ü¶žìÒ•$Ve©&ªöwÂ)¨ºLϼ ø®ŠJ¿ÝiÕ„» ª‰êhUD+”O¨:Qu¬JQ¥­ Qµ¯Jã6h塪ª’j¤A%lûèå)íVÈ•g¦^wÿêõJ¿àr( `¥ Ž”³à¼OÐ¥?¬²ò• o‡ª,ÿzÑ|ñãÓbVDgýh6-€°°2ÝœC:÷GŒ䉕öŸ‚€{fín©ìE„tügoïBªA²Ð‚Ãn@â}Hµùµ˜”ýM˶®,sA]²ÄÜ2»>¼¥Ó´Â„Çó¥ æ–l¬ à|ÅÕiLæå(FåŠâüâdvW%ÐÂ)&%Ö.\<²¸CÈ@è±^x;Ädúó9µËìgãÕeuW¨Bʾy.Þ2è>€hÜ[ù.k"ü=±Ÿ2Ž˜pß;Ô¦*ƒ>XZ’E(—‚YHÂq^ä!¥™U4ñCÐO#Ûàóæä¬!×oÚq^„;uqùûMΜRxmLÅ’0Ã'¨Ç“nóÙHÑ()NcÌ熰¹YÒ”§©“#×ffOF­ˆ³OÑ}ÅoÇåwõªé3Q”;¬7,êñVS]vþÉ8-Tö¤ ¾=wò0¹°+•þˆä€lÇpóK&¥ÝÏr--ú6³#¹SI̽ÈT_Ì•LȶÞìr ù¼3ÖÁÓmóŒO§ì¯1 œ”™¦DôAÓf’Yº;3tF˜[o …2›Â”h¿ÐµÄ|ÝWë¶'ÆuU\’¦Šþ騔Œ’%3,?…‹ìaNæØ-ð‰ù[P šT´pq§²* Ü1ײt]r{&yò-wöhuÓáQœB¾¾£u§¼ò±%Ž›û³»r™óÄ<åæx~rü±8HrÙ‘ö&-ì!í6@TEÐã%Øïß R}Ýl®Ç$ Ê8mîæ,θÒWwØyãÆÊôÔa\DKˆë½%{2Êh›°aÿ „ó¡w¹"é²v;Œû©Á_eÓ9öÜ ‰ÅѬ_üÔRÈMlñ´ÑiíÄÔÍ.EqEZxfx™[2•F½ÀíŠ$ m±WŒ<›ì+Fãês ò,Øõò=þÒ“[¬ƒ‚oIxH€ñ8³0oxvƒÍ;Šÿ_ç^²U¶<Ý_—­Å3›M)i$zÃmãCó"´C2£÷”º´ŠFGl݇H¶¿agEŸ0¹Ž%Ô7ž”Ù5ň£À»ÜLÊ? ±>¥ÅDóë”BÚÀ†s“ÉÔr¥µŠh{‹=¡.N ݬh4|ݤloU@ÐL‹Žë•QöÓ„(r a¹ã&çÛP°áÓ—®´(¶~£ö!Ìý—E6 a9KÃWÇãD2ðâüú rá¼Ed»!2lo# @bÖAØrf%…ÒÂ1ÀXe^åÎݲM—2„ÕË_³¶·½Bñ(´m›&_(,Þu^©MXÛH´IhÙ8øXxgOžº–ÙCxï•(uYà @ãÜÙ &?7M>o¬GÙßPe8“nñìöZC;Ø<ꂳ¼~žŒxóp“ÀºŽJ{…Ú4W$D ÖÈÙ4‹‘éLðœ6„ÑÅiæ,×Zˆ÷ø‰ü›öAÙœø*nQÇ6CR"ŒŒ­2Dƒ†nn‚ú„*Üþ£Ji}¥â(B÷Gt°â†'þ@æ$ÿ«]9EŒ‡‹kó" ®[ |.e;}ü>ÿúC€×ÓR¥ù$ÀQ×ùîÅß`èÄçûÿ€oná "®›3ù -ú::Å‚@n6¯‚•Ù=?æÈpÃó’ïÄvóÍ/–ßc™D/J#½/¥›JPG0)qå0ˆb¬-HÌÀSçËŸ vð"g‡¡ßÉÊ58k½Ú’™rCÅ'Òã`’˜wÇŒŠ‚àÚ¤Wzëüg=hšöá©G§•bE ¨‡Ÿº;Èì³-6uÙú{*¨²·Ñ87«©Â”WNTÿ@d“V[œCŸi,PÏnÇbt7ˆÕ“ljuå_‹ˆGžÒÃ!W¥•¦ùŽÒí€<á>¥±S›îaáž½¿,d4ÔøºËqyK`µ_ŸX:(V.¦úHïÅ·Nt?³7¢ë¾€'‡çäΑˆå_£$–B¾ÀŸ­³ÑRäXËð±ÉOz­sñ¨‘«L3Zt«lñBá½0v÷ÉÅô*­Ô#ÿ+š4ß"Ëhd(á8V9$æ™÷–tìrš²)ïíŽÿƒUj`àJÅsà PšB4¶x•æ#}ýÁ›Ëö÷p­CïHkKJ̤ Òµÿu+lq^YnÁ÷¯B„iã¼è4g®Ó( Ù cÞÊB† ÙžòðV¨ß4*[{3}hw¶6ân¤!åúÄÄåGÂ_LQ$ÝÇÉ'*ÎÇs¡%èc|”á-y;2ùtýo˜Ož—O ÒœÀ†™Þ¬yéf “^rg¸–¥×'`O°ƒô &)xh%’tNeX eyAÙÑ•õfð«¨* a ‚I×Yy½Œ—)Î+ZáG»»¯±ßõ@×w妸äŸoŠBºú_c†›_!GήH/€Õyt»Z&9¶©þ\9Òú'Bù ®ÂžxκÕ$x«×YÉ{#êËn\HUƒß·2zfÓGˆJ–ÑOâWèuP|ç'sÍîPÁÜ™& ¦>ÞJ£¸L·RÊᢔ})–æº@°—ߪ»gp™¦´š²­»î’|Va͉ Þ(Š ølŒdE¤55¬ç¤dÿç”ECoˆ5„d$P«^äÕ>§ÃõÀkup½¦Ù^‡–‚½Ý ”ÅŠÙpÈ|‹½ÁJ9›©‘_";—(9ÌSßôÙúƒÝ’½|¯…@€æ—A!l™•¦í»RâÛ‚Wg°9ív0 Ü?«¶,’ Úq€óB»{ZÛ¥dm"öùju Ç xÉ}Ö!H5ì­®uÔö ò>³°®¤Ô%M²¬q |›_Ø™óKë\hŠâÕœ- &úd¡ã5‡“Ý °ÊŽ–|fù˜¬dµœõ3ŽoªXçLj¨KTÎ/“xC-°«Nóˆís*p/² ô"Es|Ö¦O‹äÉîdÂÖ„[`<‡ä|Q …ü³†û>ú‚ÒFê{nìʉ4>3¯ø°aÙÄŸ§ƒANwõ챨ÐWUZCGë 6‡¿MüZóÆ ¡Ù+=NÞ K>‹–Ù+ѽŠAŽ…ß ö"Á]ý×m¾õsþfpÚBÉ냼nù},;l®½Å¯˜Š0g )aZøU´,Õâè¢l:olçeÃ!:ýEíRJÎD“NÞK²"Ç]ï§õÖðíc!ßâIÝ®õ4YwêpyÌÜâÒ|O`)† ÄÁA$Z£ó[vBÂì÷šJnåV-Qj×vÍÐ¹é„ø[Xš¦!ý¤¢Zy«9½¡‹µ °A“‹×*Ï|­ðvN¬š½.‘ ŠX7’Ï”T+öžV3„¥`H "e6šgHÿ¹!{Õ¨ .~e7§Q™h½Ä”c©aP¾»ö ÚÚuÖæ¢‰¾é*¨îÅz™8˃»ùü Ø–Žû š·6AQ›Ð¢ào1뙾ÐR$jËâµZ&èÉçýP<ÀqΚ=T(f¡d‚uOjkš R&wL¥ ô&Š$~˜7B¿õJÚÀHQ¦ã‹í¾ÊÕ¦?fÒ-ve“‹Isȳ̙ԣ¦ÄXŒ§ijbémzëŒ4âZܧp8˜N›Yí‡2F}EL”¦šMN{Ê™}¦¶F¢@ÒM ©È¬ôéš%Ùö&Ï›–BÃáf‹  œšºî ¯¸¯%Ø7ja¸m¯c5+˜êÒÕ\í÷ õ;÷+µƒ#+}ØvwŒGºBçaPøÕ­éÊm¸çžPÞ˜P×b¬Ìjr-JúÌÅÂ\ý¯…H¿lnM¯gÁÜnbEùÕ¡3ÓQ”@•Šoã“xL¥ëÓ– ûM †^JY¿6_§p/¾Ê‘w}^ªKOz³Ë‹¨ÎB`Û°¤ˆæÈÀèB-$,¸œ½$\ âåµ{ÆèErk}—‡M,—yu$ÔPGR@™òk5°k$(ÖµWw]’'¼ýE0#ÍÝ`3™‹Œ,˹kÂì0óžù ³9¿ÁÏê sØì [`ÌÏPGÇ KË+,«µU1Õá,ØÎçÈ+]Mì YFu}a9g˜áø‰Õ…HÅ¥–¢…õ+aé]bšóºß|9jºÀ¾ÇÈ“XÐê„NgXX°H<Ö]MÜœAå Õ+NÛëNýwe°Oò0;X]—±Z½ Nǯ[ÌX®Ø[·[õ@bØ­cŸµnJ—7kô:âîǃݱ›3zC cW³é|©£;Ìp½¬{æä ›—a®{ùf&Ê éú€–—a)LÇàVÄ~ÞÊqƃ|ßjYcí2¾Tp˜,~e½cjœ;ÏÏß·3Xä÷z«0të Á«¿°AÕ;-«Å–òì–Ù/C Xêµô·Ëû§Ö¬2»îÕkÕRFgØ¢· “Þ~•vP*/¬~Æþ³<”'Ku{Wpù·7d%GqðÓ±¾‹ßáÊ„ °Í—9ƒþ<ÄÇðaø›Ó–=¬—á­0œi¹é½Á눑>fÒá ƒÝ¿FYØ>ú:N-جŠõúÁçÞuyÓªàœc¾Ç%– úzOü…|ýНÿ§/ùÓ÷g 0Ì—#*õ|ÚM»½p—Bñ‚WÕkź߫8Õ¾‰œœ"`ºheÆ{uó1ƒkù§sv¾c+æ9É¿õ[>gÜGÀœÏüÆ6‘¬Ì/²Ñ{9ÿ¼–ÈÝKÕíw•ƒWÕüVíoÈo!<Ƚ÷t{‡3êß u] 77c9†õK"Aè¾ÎãKqî €ylå¡Ú„üǰô½—ÿMê“ÄtŽ—ÿ«ü˜œ°˜ª‡+§uÛ˜Ö°ÈX³D6³ÇœWÃÚ«¢|´Ž¥ïżâêµ]χ®G®ø®´ß³6ŒÿY¬×m„ø³8ú_6è#6ìâçôg¼o•øMüÇÿ«) Œ,,ןú[zú/8¯ï_r ø³Úø¬`EnþEÙUh¾×»'üj›ÃÕOØÆ ß¹ê“ÐÇÀf̦k#äã à1-dã|¨ø3ªŒß*O„Í10-å®ü½>:³«_ÖLć“ó–ÃÒâva« ó§ÎÆ?±ª©ðyXó8^}õø­o?‘•ÙPò?ì‡"üaý`tVaw {¢!(ÿêÎõ'Ž9üÈÞ]£û÷¼7©ù÷èç½`ÇáÀ€ê»ƒðD0LÇv’¿?D¼@ê}ZUõ˜ÎIç=½ŸX7RÛ¢¢á¿ÞWˆ1ë„ÍÏùz™‰nôÇB9òKïh¸ºÅºúaÐ{#æ¨{aR,Õb.úƒ1½Q3ú_‘xîcÎ'á¬.è2ØÇ@˦'_É™ RÔjü_YŒâŒÌÏ[0¬æÌc~ïêÄŸƒ§ÑÌ]‚ái|‹ ƒëÅéßm>¤ÿö€üƒê×mX—–MX×hýˆÏ×Õô/X ë‹JBm.û/Ö$ªW¢£UÿÃàkàŽ¯¿ÚtáSCC“¤Ñ]­‡«^ÉÃú’É×ulŒ„?ýÇq³‡žWt¾}yäävèðÓ‰½ì½×p}W;: úVÄÍg6™FîKü7=*ö]Ʋ­dgøVt‚Èp²Âú·å"*cýÎßui˜<ó£&V?úïó¿¦Ö‘i宄OG–ón²À´Æù¹MM‡ä¼ͲÕbA;‚X:"c³°¿ýèàÒß9Wú=Ÿ^µH€O޼~¿yH@?!Z¿€zóuÍ>ƵמÏl£(±Òßþió7©ú³C9¿o+Ø_µ8 ¿1KòöØÄºß¹*È“³=F6|žOâƒÿÆQ^¦ç<Ño1Vÿ4 I.¹¾ßå´—ißþƽ@Ä= /uïO¦ˆ”§ÜõM2½å­í‹ÙUßüóMßñ–¥mpYœ?öMˆ fc@Áq»Üß,fXÇm°ù?ö¹~j³09¹­ ^Çji«ÌˆË•Ö4ÑŠ‡ïÉG<ý|rºzúäöñ¯n7u“éîáÿ‘°ú›¯ãÅ»2Ù?ߤ Û`W:óëÉú¸ªÛ%Æô›óÄõÔuúÏWºêcÕÌšÏêke(Xøf@œYþkeY7ê7ÍÅ Ra_Îy×0jÄêWn„/†›öd:ý‚½«a¿6ŽÿÚ˾ÐïÖ¶;æê{³ÚïÕ×òú!Ç›+K¸ÞÑ¡‡ädÑ\勼ÄÚ—¾»Ò®…_÷†Ê·¦8$ kׂD70~æ5{éÂ>™,êŸ,­3?œ 8Â~¯w]ÜèRtFqÈMø’Ú°õ‡›PɶÃÿ“]žçÿôW Þ3ïü­#…Io|åóü€ùòyp¯ÿ¤ ¯öÀð]}&(|CñO$ÎÈ É^ÃX?êÿ˜s®YzæYǪDX²¼ÅÀ®ó¹‘* ¾+£7?~ò¥d÷¢¾åù†§Æeò3õØQt—’ÎvöO±qxòVðýʃcQ]æðƒ ëÞL{Ç*’Í (øéãÄ…òEëþz¬†€‰ýƒØÍÓ]Ÿ“Ì(“_·Y·ãV¿6÷¸ûRêÛž‰0‘MžFŒ|¸ƒÉcˆøµÊN¯É/intG¼õó~ä_tÞ­ç6xüÃ~n¸ÀLþ³µóø/»´…¥þroV¾âjyš?^k¥µ9ˆ˜?l+®õç;>_ôî×÷WºS?ÝVv´°n3G.ôV^Å´¶üÇ àÑëa “7³«œ~©L÷x„ÙÖÌõZ§ÀUùÇ 7åUiûožu+×éè½Í_œƒðò¹ÿ"×¶ÈX¹jPÃçzC¿m0iOÎŒ°½a)¸z¿ùAÑåný‚¨9+ÆŸWõ'ðŒÿÛûÿÿ‘ÚÿÁ»xŸÝ§78õ7Í¢E±ñüïñÛ¾ÐþKpýìo€É–a³;AýÃó>Ì:øÿ¸cÛ)›'˜0_Øtzy#ÌÎÊWè†rÏ!íëo9‰~Ĺþ»ð¸=g¶iÃ×ÿL™‹Úýäßun0¤¿nHTÜ6z 7Ýi»€gÎFÑ’ú³ͳ˜éÚa÷×~‚‚©p~:ìÉwû©ž«Ìœ•~nùÈo×ÏÆ¿w-æt ÏÄÅ÷û‡IÀo>C÷¥oæKùÕ¦÷ïTãtÙÈuÕ$~{X±ë \õΟ§¤wìn¼™êÐ@%§¦±Òe}¾+–È£dºÅJú·Ž sH2´ø¬Þ#j©Æ.‘`^T=yT{xú£AHQñîR+âQ¯£‹á´…Í¿\€JFFkÖø*To|tutÐöq9vPàÒÈäŠkÛ™[!ÀZÜïÐBuLÉ>³®ƒx­]Zv’øžëOŸ(4.[³¼tÔ3Ӷ⹪|\{ïú  ÔBIæ3Oóæ./ °Å} kÆjÊÚŸ]ò¨K€²«y _vnÇëEÎZyóÂHñ¶« !uÅÖnèiÓ³_æË&ãYšB<¨ˆDøÅ\“JËe€‘? œ–úaŠ¥uÿÀ÷Õ­nó¥*UWpˆÀ´Lj.©¢½3¹H\…ÁyK15õëíF>I$´O€ %‘ߨ.˜Ÿ•†ë¡ ¢ÐÄ…hƒCÍŠw/’õ·]•E”)%·'>B„^]݉­C'¾yšñÂqÊkt¸[Ú.í‡i·ª8vÈg\dK‡Ý"߉‚½) - 㞌ÁÍRGÔimr •q.f]Z ÿÇ“ Š5H«­¢92[.} í ¹'²¤ìèþóT0N¸ 6  nAä|^Ùò+EèÄ#êR Q~7TITÊùcžHÓÏM†yIcÄNê|\ò«Î6… Ó!ÈÊ\W˜N³y 5ˆ²ê¦6Âb6Žï~Å”š¾ô\9ÝN$`BG‹Kø‘gmØ™ rIx¦ãˆ@ÕGŸŒâ|#q"']ÊÓ.N3÷ñ¼Ï¹6 di‰Ðð>ÙP²70!Õ§»i‹šŒÔ–ÔÕq¶¸ Tý$ MkÂJd—ô!´³Ù‡Ìç7,oRzDQZ±:¤ë|œ`À•E„dû8IÐíË.8fy{%vD–.‹»Ëj)Z)ò¥›è§9Gb®aŽØ¬a«„ir)¾÷žÕ2^p$ 6©Œp¼©8·.ª p ‹z2çÖA'ÇcËø9#aŠáÍ<ön`[‡×”oöðÖÉ­)ƒ5õï”ÿ àûôÚйÛì•CJúȾ^…¨RÜ9†V½!¾ ØÛ"½^Oœ P¢j£ xÕm’Î)€ÖIãiM0ž™ŒRÉG¼sýâÄ_S´ –»¾Q.í¥|€~x9òÁÐtqcÁHçj挿”Uöz!¤.ª€T¾Kxf¤§Zæƒ5/&þœç_à ڙUrpKÙ¯)ÉB. @*çïÊZuƒ´ &Põh¹²êŒÐœ' Ü®k§r4¦kè?ûñZ›ÖT©+h-ʇãžË¿}h]xgT%áõOí4æ*ꤔ -lÈüö ÈJÕ¡ä€ÈÛ#‘.EºÀ„D1àtð]A2ÂL¨T*aþ¢6}xT¡ýÇ­s Vêég1÷JYcЉ2»·˜Ž>|ö;%x>f#Ã]oH¢›D§Q1ïX*ÓO殪“&­½R0rÁ®™qµ¢€ÕkéÒ˜nqJî©$V/ž¬"ë¶ÂSÞw¬&ê/ £MnÔéƒý' zšåœ$ÃYÈ©M … »º9¶>¬7J”ݹð¿Ócÿú çoìÞ¢W·G'ÕåÎBš±±…W‰Ë`hHäì¬Bê°®;ïçú×Q©Ï&ksGì¦ày3Žúoœ"‹z “ƒ)æŠöBÀ®Ø ” ‘).-óuãѻ¬ä’Akr˜¡R=£]ò«ñÐÔ-…—Ënaª$Wü5¸p‚ .I‚®u½Z6#©EÒëK¬Q°6 }5ùŸHFjê@‡ÞŒ”qsÏ Í/p'B‡vgQa`0+Grki|'ë§ŠÁ—O7w­<õ•ª#¡4Ê” ‹Ôb†Úè3iÕ¹‰¢Còñç·‰îIk¹û8×3ÑÙPÁ*ÃC®5 dà¬I½¸¢?/?ÒÂ?=[gz¦Ì)จݽ—ž¦K¹¹ew-ð½Z©È„hÜü\R††Üö=Fi8Qn£abK·*0Ê0ÝVþÎàúQ\àm R~üÂt?,ï¥+ÉSŠ ™L¹^Ø‹j'>¯j[{…ùÀ¼âP ¼3„hŸû/¶ÿBúŒÛ›7ü%ÞvåÓÓûz]9üs̈Ed "8cw0&a6Ëfc"Ù©çô[µv`?Õh£ Íœ$| SPË|Hé9)ðð.èXÒÖ+;l!6ø}¶´ 0ööw¨]•JYñ}Íô¯s7SH†°‘$ïÛ7Hq[b÷d—Å=ö6‹%½ùÏ:nÊå`±Ò›T±âΚ!Y¾™ú*(EK‘ަóGFÊ€ô¨rPÛÛ_ðgÕuéÀ:쳤ù÷JÂÛjÓ8KÝáÐAQ¢Að¬c¼“wÞ£>±Ž­(n!×QšÛÒÈèç’®Wöw!³ÝnÌ·h¾ª¨pŸ¯‚8†E<¶QV«¤Û´™VÚì/JÀiØ~-‹É†… aFqaØöÒ”8i¸ägòu -ÅR›žK ØÙ Ðm¹œ‚ת $üu¶ÔٱرФÇíh7/@ª€|•îÃ>Ì€YàšdJä°i ¢jÂ/nêL¡ ³E¢×ã“™„°Ixˆ>±mÚ®U¼—®3€Z*grËUü»M*ŽJEélÇS«a»"m(œJ‚wtúMéF×üŒGŸëJÝ‘q9Ä·aìyŽÜZ"eÐúäUËÎëŠ&áAÌN}¡‡ÃŽÚëw7ÏH\ÉÉ äŽ£TswÕݬîsã!@˳ÌùïðÔ2q*açÑûJ\|€Ÿˆ:®™L¦8(t·¯H\„Cy¨¤ê•ĦEk]ªÑÊ?›b:wãÎãªm¬ÆVD–ùKëßSMIVx}v>1ëŦ³9ÌäÑ0^2…×2‡_ØN3Þ ©å³Í·”ö"4!{ ³NLÜ·vS›9¹|›æ[ÝA…Fp¯²U96 Oµ?i›ÙæÇYµZ‹ð@¿år+Í CýÞ*]“íÕz_\±T)ÓÙdÛ^—€ôéL§Y®²\ªÖ g–àÚÜÚ6”íe;Ú‹ŽQÄÁ¡"GeQyŽ^e©€Û†—»_¨6àòíC‹Å†Þk{ïÎ]Kˆø$t¶Åà)®c KjúØCI I5#ÓD½¿¹É¥´8(.ë Yù¢ôº¾Náp$P™Þ^÷(7ÀëeìAÂ*;:)ú¸¿ïÍý£·p¥ª(®MŸØ´6}ÿß9¿òGÛZ9ų”]EbÕÄ2ížÙd³ÅáI†ÒpTk° É<*Ò¸Iêe\99ÔÁ¶„ >mÊ6ž9¬1(¯åì}¤J>7±÷ñàÆ¬zSµs¯ALsÜ1|wU³]zæãbÊ0îXÕ2‡$͸•Úÿ{3çÛÿ¥¯ð.Sª]íDÜ¢&µÕîâ‰Öâ à—A¡]Ñ­>€>V\áÞg;]3˜uŽf†`±x¼7×êV•Ñ*‡„.ñÌᦠfdg•ÞÊ>©Ò~ÔçÚÀAôXª¹÷ƒ†í=aMÕßXF -쨎pÅ¿)¡6ûñ| iP:‡±ö ªkªÒÒs„,%ZETÇS!¿\=”ê¸êOõSµQ¸oóº:ÁÑö+5Lè¥fHÕŒTƒþM5˜ëô u^(€ÃÔFv…qõÎhŠ‹±ìó4Ï€ªŠ×çÐ2h+W©^«ž–ÆlŒN5Q‚â›|½É¦jþ[wã÷s²ßËÝPjrG'ûLõ ãN®þ(ɵوV~Ï·*+Ü#$e7ûg;ch™_5›UÔëféUÒƒ¹-!¾?¤•T“¸K×Ù§cåº ì«ß§Lm¿÷°¬zœÝ¥*¢\Õ“À:˜j€áÚÈ“iÁ Ý‚yΫ'¨Xvª6U P'#-+ÊÛògª•¾¶‚©nnd8×m²;¨B¨w”=Ïwź¤Ã2V–›6Ôkee3ý¥t2BfS¼Œ jêÝžfGãRQO½Œ¾cÊ2Ñ×Ä4l¾Åþ—éÀ]Räì!ã·ïÊöªÅ˜ô†T]BÖ[°žTWX F8á¢<˜èØâ“]ÊÊèÒr‰6úŒ™‡œÇ²y­ú ƒ}£¼Üš+Uã²+TÓñ%:ÆÚ·îý_ŽØb3©Ø Ü [Iœ"Û˜c=i‚»Ïš«bÍ(WÓÁ ^À8óQHNܱT»®ÌM¹"fÚÖˆÑRÓ="‚hÌpgn§Nš É·°É†°ÎÝu)¼µSg·'ýWú3<"Ö<ütQt0»â³Rî®MhuùÏ5u©ØuñoªL]+½6ÂUùü…üUðÇù‚LÛ@ÜÏstêMÏ)›·•ù>-ý[ÏHÎIÔsáƒêÝãÕaâïB;f0±qæ¬êon3e±Hé/á8ähB/äEß&‰UÒÍÙ)PO ׂjÞCh. Be -Z¯} ã8-ã¶Éµ(t:Øv¦û÷ DAœÈ]p×I~€ÍXŸh¯žÞu¿G(g³Z4g–‡ßòÆ„à쵘ð2€zÌ<(ß|>pâº1r—7f¥4Êfc3s¢HîáC‘œ­äoàÄf™¢þÔjR!‚i›ÉÌPã˜VøÖ5tgIÍñbÝ ßjÚ=¹N¼ù•xKj"÷þ=â ”ºž* X€©¥ª3bRö+;=O„:ñC~; ^’G=5qñ;¹f=C@˜ «2çèŠO ‡]ÖaÅVçʳ@é©ùoט†I2Î[2ΤÈLn›g4–mƒÁÜÏê´O€µ‰X1‹ýj"Ç^öD‰Ó¥6÷xXãïû„‡l:¹c¶ i¸"ä6•2š ” ¸éœtgîS\ñ–°(€jús'-ا$6PØ$î‰‚Ý òv'Ž´‹ã§aÙzÕmd’ÀôuÚÞÖg…{'Jö ùš¬oÍŒfñœù ¾UùÉø‹ï;©3¯d\²!šyvÇ™,ÙFPee"[R°ÚÍ­ g‘˜”bŸ7}€¿û0¦ŸVkÚ2›âú¨ÿä4}õ]rØ­Ö†ýü®~p’¬„HRÂÍÍ \#AH®ížÜä-cWêŠÕÒe„w˜Ò³º´öǃ&õ¦“­ ×íE9ëG"¶$vkëð ÐóÞ¿G-Æé•tñ Ÿ­¨šeùŽEà{âE/T”O¸|*<„2d"5¤-> ì£-e!¨X§h$4Źº¤²¬Vž“Qä¥ •`„jñ“Âí"Sœ;dã/ÝùÑáLJyPëh/Z ×ȆÀ–RÏõu µtª=ðŒNlÊB§oÚ,ƒ×ÿ³$ZFáx$ÚC;¬`ªÏ.»ˆßÒWôÅU.ùÊQ-LÜ7á6‰Ýö–2jâ—^)# Õ” Ú XÇà˜š›ÖÌÓŒ·C£M8§HÂP›!€ÙÜ]—uˆ™E-ÀÅ…èÌ# {”H}›çÕ Qh½¦u\Í!šüúò¨³o6 5ÃïºPÿñ|-/ùŸÇjø4¥Q nPº«”$Ä=¢B,ž”&9J·2^÷Õ@ðßœÃq$êÐ$XÎèÛ.ÁtÁ &ÔŒ>›ì˜åeèûA_:\UÙ‡c*çÚÄù±…5ÝKiœ%`ÿ!JBð<-Û®=Fãh¢¨Œs‡µéš:+1þqÚ©ˆÜ•ptªÖŠŒ†Ì~9H ›`ïu8²8„ úN‹E–G<¿¦Ùá-—)«ç§Ý¶r׿w±t7ÖÇÒ>—£M#VJ=d"û‚Ú»ƒJS®ù(«tlö2.$äKð=Áâ4f;‹ïs0P©ïé–ÄÇ·áäƒ}Nº–¶–VüMÕl1E·Hs6½y&‡‹}š'Pâ…ÔkŽ­]Qžd”E.û"×Å’ªn¿¿Þái SƒºIMÈäFªÕé:;½ê!ê‡^ØBÖ˜ÂM"$Òù^Yª+>…¤’£8V*Ñ·üª€%Y-­­Ý¦|ÉÑgÌ;.n[ÝÿÎC‚ÇM¡îrá%˜›[w›M®8ÓrÜø9þ“ñœ–¤¶B~»C¤~›{ÂÕÈ’D4ÉrlëÜí=f‡f@Á—Ëż`£(¥WMBÚ>Ä$‹àQ|†[$¯´vX8ÑsWY:smb´Â]Åž•|†yïuÓ %é& F¾Š[&a†Z Tä4Ósúζ:®ÍÛ¾Á/ãtó*ÊÞ9+®¢vÐÒô7Å‹·™n7Ð u4€.Ù$ÔR}OF!~¯¢ÉœÙTEy,šì•um¾80‹m6®O„ï³—áœÅÖeN‰–£ìÖ¹)I‰$Á~9éêì6¶{YùáCΜu«Èsöuõ+§Ü:uËnw„b楖±ãœÔhO {­e¹bµUÊ%ÂÁ3r¢!vàÆ™vîV ½Ôy6›1››¡»º’ÜLAü^ê–(}¸ü‘&êŠ{¤0—“‚¥R§µQxÓN³oÓ):õ8e]Æ ŸÅ¥ä¹ú¡Tf»ËÇr“’›¢MçÔ¤©¡uR 瓾Ï!äÕò…dõ€y™yvÅ蘊%?©Bl™€ä5ŽÃ-+ëÄŽ™öŠÂ©k?0#n àÀt¶TB;>:DІ¼•+zû>—£]M"ÙùÙòðÚûgT_`¢OnXŸmk%×$ÊMáW¤#¦ºÆÑ±Á±8g°Íôh ›Iг¯f'õ­¿eÿ¶§yN*RL×r®8‡XÒf@]“áàR„Ž>Œw8ÍB9Áèïã6êšØÚ bØÜm¼ŠÑž™àptq¡ ·HÞL²ýSaÜð%çã º°ÆÐTüO„~›×ðdz§’Fc>âÈ¿t Å!r©÷™˜GZÑ ¢ówp”0•b*ÅßÉèÀYGr\œX°w-›ÄFD-5 E¥3ÚO(o,ýI”¢7>x $½È*Ž£i0WïÔ<)Ðu¬1"Pœ“(zbç•ñR‚¼ò`÷ e êeRR‰* $“WrÉùžÖ0YR+Ø —&Fñ}`ª"°( 4»¤8 ðØÜ¶".1õ"Â9´P™xGmJò;¶ü¶L,~gq½&¦]Ò„íuô¢íD(Øè]üùü¼`[2Ú—oJŸ*â±ùWT ½‡­p|³1ÐyŽ0™v©3T(0Þ’;›Ðæ© Ò©xmy¸VŠy Z)®#6Y®X;T$°‡ý[h݉Œ÷à—àåÆÊFòâŠÝté÷ˆ¦Ês"€ÓŽ/$̵oøŽÌ’Q­ÖئwRvêTgDòîó¶ê/!¿gi‹†·D¶Øõ{¨û§2qHú-—ºµdðšÈ1…ÈÙ7d ñ³NÆIŠ#K ¨´0.;··00„³f—e'¬E¹m {#NØ{30 ”„ÙN% ²¨ 7BõtƲ€sÀ˜k9–4äñ»ë#;¸ÌPæ¬\]àÆîÉ„*ÁÁ³Lt[ Á¹nþ ž¶MpÂÜìR·c41΋‚/SU=QBõÀOu°òԬؿ+,°¢ 3Û€¡-cìì¥Ï¿°h3ï’Cæí&Íì8Må³Yvbd9¾.–ê0{ÞCUB-žwÍjœ¨lÀîâièÅ•çîEìëé·'Öþ¶Û}¥t-Ž=ÑŸÛYg¸‘wå8ÒM—Ãi‘Þ_#Ïm‰kÔn4+1KI#£D`Ê™{¦(¤þ¹‹'†¬_W"5O‘}+㢲uqq2·Pc¦UPm¾\3¶ã0tfoQ_ÞUö¿-Š‘öa¼ÄUr3æ±q²mßé2(àÔqPºy“Áã¶™Ûfá(*3ãËü1˪ž~è¹)‚”®©‰}a`›8¶šI}Æ,½"±øÜÉ¡)`33b@ j¿(vŽÀw¹påjçŒÔp«t—ŸŠå´ó_“Ý´XÎX,Mò•‡Õÿ)¨²‚?êÜ„.r K«Ó軄ÅÙ[Ê>öU¥=•JÿÕÍß`\à¼û`p~áX7µP›"Íc…x•N ¡t×<ý|4AuvÞ@Î^ç4á m¸…Ì&µ`Ö N5÷løÃëÍvQwçñKªñID¤ «lü:¯šº;D Xêš´@ݺ±±}Š–”QNÐúÕï]ADàùe!Ù¹¶Õ.|ÖùaÑî¢y±‰xd/º›\²ŒfB‚.b¯­RBÒð<×®Ôv—hŽ ÁÁ”êlR’úÙ0!ý`6RÒJußw2êœV‰ÍŽÑnéQžˆ¸}” :W=}1ë76x_лnaYžÈ,á7µtòì ¦×Æ§'øÇ9àì×3Ü3Ÿ×*߇ÄY7²`|€x„ÇlpíÖ/㢕úñ}îcjd‡Ãí šF•Á3«; ø'ƒ9…Éñp!@¼É~²7}þøU 5R¿gÒ\ù ÿ4Yý²“†ôezoT±Õwÿ=hòü«ÎÐw}"ûðäh‹>ãPÃ_qš'÷ãNÌ€}Ø É<«² f’õx¨•Y‡ì5{^i׋?*fÕPÃüe,_ÏëïûL^–—ì7.uÀ¬Ÿî—¼°dé€]–¢î6b^wÌf·5¯N`ÑsÏÚ+ªE1öš p©á½»Oo%¢^7«.4¶«B3CĦ­ï`_}Ê{VðR ‹slüúl EÿúË×½b=·QךþÑ&¨Tùh7_6@²XOk³RÃÞ/ø¶-?øö…X–༠ѮÇð;“@œ³á,ö’gçg¦óJ±}U½þjž1MòË #<^°Çý'á`o¹Ü.ƒr/^žh ú¤8è´n•d^O®d [>™·—Ìðøí@ÀsŽëXù³:Ž]?ÖꡕŲ«ìžxÅŸ³:ž'õ4ÍX<Ó¯a øhv†ú‡„3èü?]݇Ádéb¹†…¬,+l5??P’è¬=ëçâÇúòư}ËÓWAèÆù *Óƒ~'²¾Ñ‡˜6§ëPØ/CÐü:Š î_3[,‹Hµ¾TŽ„V—loÙÆÕsqý¥ ºlAãýáˆá¦Hþ?ÿâíô‘x áoæ˜÷ðwù°ÉÀšë°ÿšÉÉ—ü7p•ü¬^úKnöbò› û­â¿öÕÌbcW=ôüXNÜu8«vÿù§´:ƒ:vzäÄó~éêÅw2cåþ_s¬ùqècý?a,±ÙØo®ݰÂDü•™F¿œÄè˜ønVx‰úa h6<ùœ¦½Ø­{¿¬ÆÀ—Ç>ÏÕÏÎÙ¿M8#¡U›5÷ÄÿÏ6AUûU\‘Á½Þ•×0ÄüÏÿM^:;>®ë_ÇÒ·(wØÿ|sŸì*‡§å3êsÎ.!™ƒô fö‘§Nýç±:/ àèAÉÔá1ª¨×ûùÞú[-t†Ão úO¯¥ÓKõ’«®ÛÝ¢ûD«õG} è=´ÄûWèÇÍ'§ç ÊÂ>µXÊÌâ!t,$ú!íßò€ÏKþ]%çÃN²4õIþ¸¿<'ãÐ?ëéîÿ9,zsþù;Ûëçú Óçà)¥Úû§¸ëÓžï—Æf¢þÏ›õg£¾þ›ÅÌÞ5+ƒýºW|ÖX»€ÁÏÉL›ð£ž}¾¼ÑŠŸR±-¾ËDküéü¥óâÿv²?~¨ì`RÆ×ýÃe ßY]_F*¬ž`8Y­7…0¸=þ‚ÜgÛ GEtrziEÓhN£[üm±þ¨ÎÓ¨tMò—¾îR7_{®Ò/$ù†×öÔZ壆±:çßü¥žˆÙòsXÚ#Áþ{ŸUì–+Ú‡D÷£L~°`Ü^&}~¼ ×aég0y³‡þ3©òɰ;=ë³YÄ+ösOR«Ú„ýóˆ0ƼÞOìl°_Þ,N¶ž5Ãó¶¼A̦w†,ÿoc{ ™iW„¡¿Ñ Õþ­<Ý/å}‹¦rËó Ð ª„|íúª‘áÀ½¾œî½ò§ž¼ÔípÿÞ“:Å’;²÷f‘VêÌ›×1ÝêV‚ÔùaѯÿiQZüÆcuÛ=¶Š–ÎÐÝ‘™Ëê±>V/u=áCagn‹ÆÊ9¶ÇÖ³Ö—OÛ¸ðŸÐq¯ƒ€ñ—7<1Ï£TtòÂ|èš&˜{BÊ`‚ý&‡ÂXäôûÕ|aéG\ÖKk?™6W'öùám#Ýç«âvqr ùV«tlÆWŸ×ã~«V ¼DvpÿmmWe²«…ËßüÉ®XefQÕž}.¶_»×Å,héðÓ`­1öP>O^vø¬­9ÁoPò*ýf8ëÿm*AñÎ%E¯ÙóúFSï”4½3ØIúÀS²S¿U¾ŽãQ—ß÷w|¦ÅÂð¯.´Å‡ëÅx= !ðç‹6 |óÇ &oðÛ¦GáøõITùÕßœ¥9Aìǹҭr…ÿ8³ÉýÙöxßË]¿6cÛ,Be=^¯¼ðTqUÍüÁ„6¨NȆîÐÀc÷<¯+Öý^¨gÓd‘Ÿí²~:h™÷ ¯üñEŽ6E´ª”h#­’°M7­ô’‹Y&±xdû†G€Ö"x„âþ"âÚâÕ j…J¡™å$ª‡#Ài 6f¬¨Ã´sÂ8‰1Á%2Ð4?ñ<Åßí.´Í³ 8ã&œeD6S¡wà¸I³ªѦ³¢/6Jk{—>U›ÔÒïòÂî›·d•ƒ}˜mƒæö‡ÖÊYñ¨öØg+ŸTýÖD¬sº­ç]3q¸è8; ïñO¬{4ÀáÞ•„Ý9xui­éP0…B‚©üUÄšn«EÀw*௧÷‡á.BA_Ø/eúkp-|@)U¿ÜU¸M¨ZÒjÝåïÀÐÁLþþ*ಧò­ÃÝŲ×¶ƒñ é?¥ÊQ £m¾MÑVË5 ~¿ß»tœç21Ña§÷æˆbjå¶ï~*w¬誋ˆWŒø!@ਪUqt\« §¬*pþ§§â‚ÃO5A>¨:àÎvÿ©>*”±£DÕª½°8ÂMCrï.6â+¤KÈM¤ò, JU„ÎCŽ~Âñüù9Œ;'Ô¼‹Ö#²¿ž¹)%Ì_VR¶©MÓ¡1èM%XIõX¢²¥„¨I\7Y¸M>=;h6­r× 0Û#È­ðá#¹ä¬¨b}@w컊-º¯»•U0H(@ ·®ãzWººÆ¸ÝýyZkq­=ë…L``µn‰¹O€ÉµO‰Yeð±ú#)Ã+8žƒ £ÞEu Ô,g,nðÜ™¬M+8é¸wy‹¬I.Ÿ¡9½þo6£ª‰¯ÌˆQÀb²öÖ:¼7ˆkÚ>ãñþRmÛív+Ê— % ší;X)Ü´wÑ*Á§eoe‚IÝÑöIt¤;)Ë.ÓZ=÷Êi óåÅ ÿãÖ(ë㇤Mñ);ªˆ Aj¿pdx(bÁ¿)~wJE+GO'\Œ;Ï=ÆWú7½S5U ªŠYk¹ªÌ¸îø¸#È+ØiÖ…d%32GMÁäËšcút#Ô]§ýà®`f2µ{§ÐYáCI5ÏX /±d(Ú¥°+¢¨H¼È„y®O¨L«‰ü 82¦Ö-Þ&Ü~Y; O"ÏÑþ¹Ùpvi¶ý Å4aVäŽ!{ôü‘µA|a‘i&³æ1À±[s$îÀÂ%ЪýR¬°*òè[ÛÓÿ4¢R`f%ƒ}Ðù®F1Õ0$™dEQÀ*Nž}áäQ'ng^)U‡¼.Nþµß<ÞNG:f‡2ѯ!õT/;ËËsõ—)ZzÍy…†Ç o4c¢5TÞâ2¢²yÈAó„±@”!æâ&œV—ð‡M'Z0^CP¦‚Y¸OÍQÄh¸¯“ÚUY8î:Á1iÒŠf 눢!_©31+J"¶/ S×é”u©DÑãÀ6ù‚¹u„½C¤ X œá]2æ­3ý­ ¢^h?Xeîê›äª8j¹LÒ5L|ÜzrýHHߢVòr¼òCWQ¥¦ãöÌÌ·Ó È—û=3ïþ„ ¡¾Š;ô4ªØâ<ªÜ~–Cò’=8©ÊÝBu Ma•¸L9´—m¢tFìñž÷!97µ6:uæ¬ls¬å̘¥€’+ÍRòR§u;ß(•îœ[[£ uB49k~ ÙM>ÉÄ• É|V5Œ7òà ™Å“”Ü\/W99~H[g¡‚‡Ø›®ëœHÄc»?/´r³{ç´Hm’Ÿ#ÐHƒ£`ìû%Ýæ-7Ä®Šœƒd[@1¿Eây $aÀ’b/^µprXL¯Ü¹lšm¦l0ÐI %Z=Ÿªú¤‘ D&®Sá˜Ðkí8È3! ;S¸æAñôš‚…—Ìʼn²Ò߸^Ï®Ý1;® Ì80t–´xôÊ!Ö´íóm) O;Ôq´ ^ö2ª«Ž¢\bdú6"5õåH½™XÁtlçÉ2*ã7ˆèPmù€•ž‘"•‡%ÐéqyZ’ˆU¼ûÐÓOÕŠdÝqÅÈWbÍùË[¹rØNϬÖø2Ý–+mþþ”‚œ×SA­Sü­ôìSG” fCö惤}ÁÞÕiÀ²‹ ™Þ ]/küJ§4æ´b‰íêP¬¶›2jÒcí;ë\£¢"é6aGØY8ìƒ=ÚÄ!´'¼”ôN»"hѲ…FIì@õñàq[\sq~â±Ú;[AµkC.—Ëš['›B’âÚORv¦½Ÿ¥LÇ|ë×A}e¨E©ÐÑŽ”Ð'@–2‘–!¾ï”Š"¨ÂSmªÙ,Š˜ þ¹å —fœ’ž9÷ê.ªÓ gN;¯¹jÂÞ^=‰—…65êKèW(}ièøÓ^PÈ9ëè¾f'Øètßv÷Ó³Ë'¨ƒ·æjN#]Ëu¡ÿQö…•e6Nöaß{öYØž² “}Ì.ú/YCãEi¹ºð –¢HqóTÜSK½Ù7®õ4ƒ†ì±Ú&DÉ3ö/ìå˜Åö‡]VZƒÉ:•ÈŠ[вB"É(-Ì -Y—«CgBG¤³Y¨¾ƒFÑý› `pbS©†f‹Š×ÙGYÓ}¡Qg7¿`H›bÏœ•[þÄ•ãtŠyYe¢R Äç‚d)—8|LÀÛtañcƈ Ô%Ž|Ø×oŽCÕâ†Af‚¦MD€±ðúÑÖaH|ΪIX^T¤tããî¦Zós²R l>·,ê¤ÚêÄÝ (•NEH´pY\0ÊâÎÍÁSÛÚŠ¼¦O ‡æ€]©‘øËbWðÓ¾ñýXßJì¦íøNþÌ|ø,ýD,ÝàŽ¬r<Þ«ÍŵéºoLýµ·¡uÊ>½L±+0C;&/ú]ÿ}¥7*¨\g*Êá.„uU"Ó$””VM„øèÏv¢Kj4ÄewC­6+ c~(£=àKÃFêšBJ©•öÒ•Pì,1ikÐýæ­–Õ¶Ñ•¢>tÌ5)ÎÍQ©«Öû‡(A‘³ û?ÙS¦¢@çý¬Òpuïìì!¤œøÀîw—€uɤ3º[}Õ´äDNÎÇ“¦ŽåΗq@-’¹c-E²›´}$.ÔìßÑ«Q‡QG{KÝÚQµ]®g“Mû5l³¬—¦ù´ÅÙGZ¨Â.çÉ·ÓXí?*w‹Þ&2Ц¯¯ÊáÊ#­ ·’šˆ()tš_£dõ œ¥¢Î‡VÂ1Þãº@ œ÷)²]ú¢_EHƒˆ—å¦$×UEIôð¡ˆ÷Àƪ ’-PáòuäH(ÉKÑ`sõE§Ç4O§÷SåÅ,ÏNÃ>L‘‹QÒ,q£›†Š°Ÿwy‰oYä{èqÓ|Ð]°×ñÕ…Kã i‰Cj›´k9s’~xýÑ#ay»tÐZ~€‚Å ¸‰§,ÑØÚž&—v2§„à"ï@'Ðýl6>¦ L3FÖ¶(U2&ø‰’M'w° …ª¯rýKÅSgE0¬P•tl™]ч—¢Gì0âà*ï MN' ä*ñøÂPûû“<[ö¼í ²Ý€"f-º’ä…WÝàrâé¦Ù±gä?õž«š>~s+–T¢Ñ%F†g‡¿þ!t°móaY¸¿ˆw_dGZ9øûŽÉŒŠ=.wÎi2u[<÷ùä[[ŒÖ~}g£@´0—ЭØë`:²˜uÐêy),ï2µ?¿5¢Ç¿xŒ¶™³Jž?~¦pS$3jRŸ¡Î&šÔ­,Š~GOÍ6—Ú9™²—RHñ¬^è uÜCî$w{uèHR›e·„Ir»:OìƒÏ=çØxcB`JeÅ?%ÔΉ+}tvUT&ZImFUŸbžBÞ‘)JÞ®eIÊø[%‡'_ó²-VYe›)Ä+àè®$òª«Ö£:¡»‹Ç'F”á‹ßq@Q;5*›9mнQP™`rOÐpÒrœC46_BmyK($j2ÎC7 Dƒ3Ëø*È÷%y'¿¾•žf92Ý—àIÛæ öpÜݲPÞ–j(5̸åœEë™ Æ0÷ĤN¸lðsklŒváX§N–ñ |¬ð¤Qo¾à`¨£ÒÜÊo ó—«… ý±©B¬I0êÄÃ7R³å·]®¾š"|敨ìÿ’Ãa°ü|u×aaÏ)Ã?/€4¤ê¶DùhIÇ⤧¥˜ô˜²nÁäRœ”p߫חtö”LPÍ‘¶(r6>.«ÇRž(û@Í£Â!>›¤º2òŽ3 }Ã)ƒH[—dµ_†O‚©š5´á®Vs¥%Ó%7tw¯°gt”»¸d}Ï"„¿» kîu[Kv¦áqIg¶Þ˜ü¼ÊîlèŠ{J‰’Ž»Â¡\Îß­R;–jÄ7$Ç›žìÚ{Ip[Õxc ;¯…nRÂ]„^³¨íõÊ`„û˜=Ô{Sf'{¦¹Â䜠,O‚[·2Î[ÝV.×b9y†€±bOSÒù!:¶W•Pq› “D'µ>z§·òm%oiî&LG«ƒÙŠ®Øm©aôæ»Ç½=rßÞ8Aòã¦òg¤ð©ôÛ Qz鎗± ê¹Sýt{ói¦œüÍ«­Î™¨¨©™yN}tèŒ÷ž=ÃÂö ýD¯OîÌòU k®†Œi¸]‰7å¯khRK¡-£€•ÚÐ:êäÏlQ¥Äu(Òùk û<6'L‘¶Ç{Ø’ØOý|O?Èmi™™0ŽØ(›p‰MéNxóÖÓ.ùXotõà7>MîÂÚ¥Q3à<µ½¾!iÓð:9|×u'fÅ?¹UNÇ…/‹§è½°KMDž£kºskŸ–Ü XïV…Q>¦ÐžQÉ¡Îâ‰îoRËnG¹: ÿ0¯Påï´Î·b¼å¤¶6"9‚9´l-¼Æ—ñ–Ó”KZÝxS¬²5’,%ND3tA LMÝÃ;7-UnxLòÑ6·]ˆ={‚š´¤*«Õtöîå€RÀoLÐLºÜ›íµ”.(YamgÞ„/¦žfÅu±´«a`ÒÉn1±¼4©âIúÔÙô×Ї“M›·ùÉ £]¤-Àdôʵ‹$õî“ÐmbWÑËÛÜñ²J~£M˜ qp^Pʾ[1®Wº}ÛsŽ“ÛQít‹š&ÒUûK’ïçìÜÎã¤×8i¢X†Î‹³OLÛž”ÿÔ]`FÝ·£¿ ÛŸn¾Eâh'&ä¹ãšÔéžö#C]ÕЛ™»Úÿí¯ÀÊq§¬³°á$L&®Ð9è{òs%·œ ñ' ]sæ™Þ>d`ñ…4¡îéKôÂ’³õdº â:ù®iK¾íjE¶y¡nÌÃCçMÔ/òí·î‡Ù‰Ž3dÚ£¸<|áèô[§Ê"È#{èÒòQw-«GÜ2ÛÊÖ¤°l’…OoÔQ‹Äóm:ã¥R*ws8nz?š‰#ƒB£Ú¨V=§½?ûšq“ $‡Îòj^ãž-‹`ñ$Ž*k± ±7ÀÀr”Útp1ìox(ó;J¶oPÚ¡( DÇn‡$ŠÒJÁÛŒT=™ O'äp`Ðòõ9lm%Ì™üØïx6oc±tsH{ž”n¦Ãä$~œ3ýY‰î·9MG›£dº-ιMC.ÿÒiÆìc¡3²V9:[~Öî^×{SiiúËx¯øf> ý~(& ÄYƒ±N$FL¨¼á” ×à©_(B³ëN0Ò4üVkÿ²KlHq6Ÿè쬋ÀÒR´CòøÙ”0)V“Q¦çqSÉv:NxC3½œ4”Î.SÍvÒ¨3ߣ»²‘ ùÙO ‰05ùbfî¤ðº-—\JÛÃdë ôÎN¯( „ …<ìD´éótE›y­Æ©˜„ºV]D¨ˆŽšÈcQ(%#V'²œ¤:"JDUïpKUŒ¹pѨÂù^ZL.[öÇnKý¦å¸$º\+B}•+CÉÔ¥uÙ±µGWX©^Ö)gu a õ„z€‰u ¼¥Q%D’$¦^RBú¡‹§ç!WŠ%•cÛIÍYÊç6%#{-Š”ÕFŠhºŸGìÖûõ°"“e@Ž?2"§½ÀŸÊ}V´õš.q½hDšé6ÂA3åLÀ#3ÿÑ'‹d±Ã"wÍ[Ä“•V2UíZ›B‡³·RlÅhh3à‚@®IR¯LMÕ¦ó[º4ŒAƒp˜B–}OŽ0–Ì«¹A>•kQD_ÕxHòDÌ®I8Òu¸Ïsæ×¹%:ÂHíA­uY$òE²ù«±-m€jÀ…H³FÀds]> S´'ÐPÜß.6P—Vèpë> ï|$;Û\q3ÔG?ŽÉN'Ó?ØÅ`Ñ:ÝØ™ ÞÚ|ñÄ'êféd‘®¦ãÈ  Â¨Þ¾‡ª³,ʇgü‚¢uGp15q€t'ˆ‹P²kQ±[ ¡ jÛ*V.«Yëf2›Å£É©1¬Ñ² óéïTf†°cmð²ü,¥&î©‹–ÆnŒã²š„sõËI&» é(&cš>cÑ^ú™Gl˜ËO˜zú'ÊÿµÚ3 b; v.«~Ûá·Z À.X5rD†ÚÁósA²o¸UIúà{Ì}ãP``ŸÔ¿j2içxj4‹uKJè=Ö±(èÕžòËMæŠNuZ.B§±yHêºÔÈã?òéºQºåVº>\•ÌÌÑÙÓy‘/=æ)éè )¨S€ß6L­n½žÏ]˜0æ“ú|¡ës“!¼gíîX|»„á¨Ø’I%IœöäÔãða×zQB˜ÂøšÓM˜hU%ú D|ÕmüÅá«s’KÛ„¤Î–ô‡]:§Å*:L¤;&ÕA°3b×°)äó›’@ákB^“Í®v_R½Âç½< ð‰#4Ìù°0̧IJ IU Iº“½hhUÌê(„?ô;œZ³Ì7¿ÿ Þ‘-’!jQ<!w’@‘5AïzÊ‘¬³‰© %TLûl'è0D‰±ø“­㜙þæ£÷¥Þ¡ÙzÌç`S?)Ýڔ±Œ?†yáí>=M:)ÌS ýZ©í÷>€IÉuÏST¥fMv›ózðÓD©Õ>gEUB²Õ©À ÒdÏRim–íûülTœ1¦ý–Ä“°­ééß:"ZìÎô'Òhdå féÅÍ+!#¯§¾°I£$¼$(*´¢fì•+lR[‚ß._ÏiÊQµ^8X;šI¼µõm]ÈuŒC9 ?Á âÖQ­Ùp{º[Cì 3¢PKR†sl7tÿhf‰0B9*Ê1H‰Ñ~{J8QLðššâÿM ™ýÜ#Á™ËÙ)ü©õܳî¯"Rm/2ÁÂNWaN0dP{eYß._{“ÏÃJNI]l(EëÒ­×MÁËyc “æ egbÊ'na±ÆÿqŽqðmÔ Bv¡£Pƒu–Éç~’Ï}xçÑÖ±Ö‰éÍvvQ†òüqxOCs´Ù{§M3<Ô}¨ö;J´6ƒã¬4œrš!ô~þ£ílQG騒i„õ ;yiug·Ì$9™2 ãþ…ëÁ FÙE´6„(,z†š–yn·êèñÌÒ‚_‹±LzÆ48bS¾ŸUÇ•¯!(µè¨W-´ ¶g#ˆAÝ”Ãǽ/Æ¢¬A8ÞPáÒØ2nØ@ØhX.dÊEòáq8n+e£W´¬­g‡[b×i%+³r&m M/Ôwð`8Ç‚N™ /¾‘ ÏqÑÄì¸:ƃˆvpuy€ÏÉër¶p]ñb;ô„{uÊR@³L“L ²µc°fäsãÊÌ‚ËÐaؼô³‰¶úåq na   v0:‘n¬¹•ÊlÉ&¶)V c!³B—ÐÀë ˜2,å½E.Ì–Ç6‹së ¬lŒêiŤi“Ù縄µ†Ä„bæKe™}w¿kDB«Ú¾?õǸ+ºd"•ísüwºãŠDóKA(žƒj1¥ /…AC]¯ôRps?Çcê§þŒK2ÊâÃvI^—ðeé„ä!<½Z£zµš-V°qþ¬­ ›¡$½\ð’ïjž´àœ‚r–¯ødsÉÙ/röš[›¡”l i/™´Àò’µÌ‘Ú<ùû¿|K5J:®«ÆÓ›¯+ªQÔv_vè60Ý&ëôU¼P +'M×óš&ÈpäèÝÛ`÷£;Ÿ¤•}­ùÁ`Û¢Š£Ç s(‘ôî1‘ ‰A“ï^“£•‘W9‡9eõkªÎ~•\äü³1ìß¹\Óÿ·àX»(‰CÿÑÚÜMâNè{l–³çÙ{æÝ4ùä©qŠp O–(xÍy–ÚÅž TÅMñelâ€ìŸMxín¾ŠY7ó¨ˆeëáî° › èåñ“OT§ûH^;*`˜ ¦êàR>cîµ€­X [X Õ¤¾ÒØ&Yfü°óx"¦ÐøÑüÛƒ_I0*RÍZëú¡.çTˆ:ƒl™qÊò[îà•Ø˜3;LœÖÌËZ"ê¯?³àA†ÚÓ}NF|3o°çwâö[[µÍ •Z©¿9Œ¬:Œlkd~ö«qñe˜Nñ³†yr|v!V°ÄjVípx‹!¾ÄfÏ »Éc„ïC }yËN÷Ü®Ûá/óÆ_‹ãcC>‚ãöƒV•Þ÷×Êw»_hW68ð^¸ÞÏuõŒ‡…³0ª—«lˆ½á¼hë²d|àbüma äTYïeû×ôA'?¿Nuü¼áÐV X5¥e£ªù‚“õ/æ€lýøÃ IY)¾M]ÞoNûå×_õíènŸ\8[/­{Û}ñ7Æ4ß3t~Á»Ê.<­Aìòþñ1!ÿ.HúÕ?œž}ÆxüáÙt.eqš}ÚÈësùsÖù#XÉ•@çXÈ &âØéÍqBWK8ná0*¬Ïö7ÆWC׈1›¬Z·ŸäH‚ÏZ=È"â¿%_/D ,²ñªLáPóá‹y7&÷̧mv‘/ÌXkWŠÕ‹@lö×nÂÆ™:Ÿ§Ð‚‰LñÇòuù·‰&øqÎ×êáð<ÿaƒ,Gì—;»áöÉÑM02Íéð¿9ã3°Q2sçË‹mãþ¿í~„_j‹¦2ÉeÈ9âVoâQ„Ñá¡'_éÒ‡Ÿ‘>'¾ØÍüsj‚ÆÊò?—áÙm¿øª^UËhOôB°¹~lŽd½¾Ñ—â90üo Òþ·=y1ÜÍz.T«qVÅT“U9«2²X_dÉd¿ÌÂË F1f ý²°t~70Ãά0ÙåÜ>ÖLqsSó'Ï™ Cž'Æã8­—ê}â¿éFížó‘ Ö"Ë•÷o;9«Yªý'b!ÌŸ¾j_÷qí®/ç³éËe…$(|næ`˜ŸÀYÅ%ðñ¬°Ñk‡w±¨1€øêÙ¯&˜È爳A…ù>ò¿zÑ6r-Ãx›q>Kp•ÿå lfÓ¶:Ëëðĉzyååô|c¯âã_ÀpËZz7³}އ«Eëó¹#÷³ovfïÎ ñæ­ÝlŠ ƒ¢ºÿÕÍ6ÿ®sÏ«jUzÐ[k,—иk¿>ñ¢u»g6‹d ÁU±-^ôK8Á¿ñÁWmŠ{ ûÀ™ã¥›Þó2¥û%Ä'r² €0bN6tïvÕz±;Á×a‹õf¨žŸ¤@·Ë/ÏZŒLo?^3˜Y^SåÏ*õŸÏêD`ðß> 0…éhoa2æ ›ÿ¸XcÜe_¾‹äqMòTý?—¿Å¢JÝëå¨}Þçç %p ßK/—¸·Ø éN­ér$lë=_Œ»÷¸U|˜ÐWôGiüRûä–¾}äLxÿDZŒÔSåq9ˆûÒœ˜Î‹V3l÷aYâ³Ø'S«3gBìúÇß3~MWÕ“¾+àøÝðxhò”ç"Õ¾"-Œá0ó˜L–VþrÍK Úææ3UŒeõìÚM*ŒäºÚΟ^}²ßÛ]§õÏwC£Êÿß]£Uð­êMÞÖs˜—oWµŸ;µêMòY¦®˜½¾ªÑ«~«S†Ùpˆ™sû]Ñrl0áÞäÐÇ‹á~-)Nwï=¶à…Äál¼Ü`™µ¸YïþK¡,gJs/ØÃ¶j¾¨™ÿîtµ×`ÝÎ0—¾OÐr±~y븋¾KªÏá/2/8xn¿ÆŸ_×bš—y8ªXüïàôö ˆ°Á6 eqËn>õYaŠáÉçh°5Bñ+m€XÕDsXVŠ=›‡NùoC~÷¯{«^‚±7ó³mÿÿæqãΩ»ÕÿäñæûÕÑaPëE-ÑòŒÃóU€ßö«¡ê1|÷ŒÂdÀù÷?ƒø}ëîñ7ʘo³Y±Æ©ŸÀý~.åŠ áGa?ö8_a§Çº8e»3xý=û4³åô[ ;_VÜÙ<}ˆ&^På³xë9c;q~&'çÿƒ…¹úkñk>–üé½÷xÖõ7;¿ùƒj^]¼ûåL ¸²S°Zñ·Uà»YÀ—_(Ùk“Š™iç·ê_02ϳ5KàÃÂzœè–»«Ð ú3›ŸWaîé}~™/ýŸÕešËí?ës䛟kÛº ¶1ôé´üw{À—ê¼ÞõBá˜ýïÓ¹mûNFÓW/¨IÐ(Dƒ4N„ŒÒ‹Dý\c{¡ëô– ¨;â¯Üm÷¯¿k—7~ÐVƤ<þU+¿×ëŒk尿Øþá¤_ñôØÿ¥¼k/þ‡‡<­îÛxÕÂs~½Çì°^F&¿mýb`ØWŠÁ¾º<ÃÙGùuÅ_—ýçsN6^úÁ0¿é'†»$DÌÿabüWqVöAðôx9ì_—ÕáE[e6ªoÿ-Ng5þý]õÍÖÀÌ}¾žÀÞx÷Yc½HýŸ`é¿÷o”ºóÕóîvTØè{逮âuÚýfRÍw\¦(/Õ?Î5¨.òL‹,e_Ä }¥IPíykçxîçÏÝ~¬ûÑ“÷Aà e þ}m—]û‰ˆÙx2˜øwfù†Ûþ~„V³gqÃÞôLoŒEϼp?ÿÓs× sÛ>f)~Ÿ‹æšŸ¶jï¹Òö“‰÷/g^?NbTÂ41û¥ô±ø5£üè,‚·ªt~&â6¼Ã?FpCç÷Ë\O3Ptÿ˶â¯zâÁ„ùZ¿Œ~Ü`„8Ì8þ¬ÆŒóêSÒ«ÔŸôJŸ<ÁŒjåþĺb ÿ ×pþ*¨bó×çô‡Õý£#ð¯jú_j‘ÊVëMúþ(ÿ/°¿þ÷Ø7›¢È ÒM  TJ š;Þ“[”óûþmI,z¯‡ˆÈ XÓ`n–$þß´ÚŽ‘² J©ý† Ýh¤jœ±r^k¡Wò³Ê‘Ò>°oàbН¿£!~žž«EBUGS´:Íù07ƒa£nÜÓøWM^BÕçµ–ÇÄÆÿF•2 ØÐ)8šgà—&yAÊ”8¥´²`9ƒ"ûë “°›S *I@cOJ•$ ž&ã\;kåà(Ÿš6%9œ˜Q¿+îÅ´6yþà)mR·¿„±-;TšvLiÅ*‹„VÚ[÷ +Jk3€06¦†·g­t+¸pµ&»|Âk† ´TP/D¶Í ËDAú|ïóLž¼dªS6¤²HˆåAØÜS^£û!×#Ë¿daÍÞƒºejÐ6™)YMTS·ŒsÆ`¼½´ð£f¨N«5 ð‡à¤¨n>‚1³*—Ô·¸H‹Ì ùÑDÝ€¬Ì¬ßÄ‹4h@C²2ëTJŸk¬ëçÁ[?¼°¥õ]2ë ñK¢ËìH:á;úÜFœ² »LEä‡+¶€Û¶tŦƈrm¬Êûk >ºô©¢î†C-±*£áŸ!q<)+Gƒé²3¿Âï¼eŸ³UQév¸üÝ¿wß7x>‹‡wÎFòå_Ìs‡ ßAüä™e~‹gÛl­£¸ Ÿ¶o%·Ú»Q©AV.`)ï%b¼†wîĬdÌ-vEv‹7‚›‘uû/¬'Ò}‘vñÆFÙ»†Œ ËéoÃŒx˜EB(Ùlw8>(H¥ÿQÍ»YËìsu·L”6@rÈC¹eìWÚ¥U]_­ĽcË\(°žü­»þòk÷µ•¡7—ëØ UË ÁXº¡_Ÿqô‹XfR©úÿeê5œÀgQit˜l–ëcŽñpbRcýpžµYŸÏJ{ËAEÙ"nlVsX\|€×¢žšymÄ»Éí•›EiÔpR `9ÚÌö–Ï %‚…ñ1— µ!ÂÁõö0Ý¡`QwIÊò1ÒOoíPXñwÆ£Ùì†õ®[Þ“ZÞ—×視œúôœwbVG1Ŭ>½˜¡ÇF$Ý["’nsš,ò†x&À²•ðíÒ¾‘Õ£Ú:CÅÙªÕÙ‹×Ѿ°‚x+ﺶ Úz¦/°§4z³ÚT>í›nø[AZ ¶Ñÿ²sr°!½qœàMÓ×´%µÓ.ß³x Í`&¹8ƒ˜}[ÇMñœœ5N÷uhmJ‘œÔÉ)â5·A­ô’K}³<ísÚâ ÿçÆVƒYÔé™ñ­Cª[r–¨šêkycŶ$„ƒX£”)qs˜qÄG» u!.6 .èüZ&J9òE¼k7ž~J£›¦Õ×VDµñ-»‡Nì’Åbé0!Ô٫꩸«1Y³kÝÏï¼Weø]„"(z º}úž8_)ºãäìŽiýÔSÔˆZ7¢Š¨8l13XY~œ^'kèŠd¯AwèÍ~Z42Wg]ãdkw¬ÕÝœ1’8Ñþ;io»xë¡®î 8ÿ‘~×<˜¶Èd¢boš]âóJÜÄDk¦‡¾!D`–»#ÈrQ!#rÒP Xø\æÕRφñÛÌØE¨ÜÅo•Hßm[ºÝ‹ÕÞ½Ãû¶Ïÿ¨Ò©D7rÂø^¤{òF=2ÛIþl§ãBUÅ…ò©[#wwK¬cYS çÇ×#ßäìåx ·Î5£ÇW~¢u#É•ï¹^8nŒ‡…ØvvS!ÃGò-æ<;LÚg.§Fûm ˆ‰Í®J^Šõíh@ÙC$ yÚu^Ðç+õÁ¸ÕÛ…ý–Œ‹µÆÇkåìÇÆ·cqØ8Yjëjk&“Hû¿…⺷2æÊÑ8*”Ô\¨SláÅ}N“ÇÚi=Þv–ÖëhôÆõd©5u(Rÿ¸wŠ_ØgÝܰ¿d3þÎðôTIÌé}YÕIoSÇ\`Ô›wOk˜cP\mSˆWÞBeA)Lô`ÑtŽa3{Ö`Æl#¯A—Ø>âCµ7Ñ„˜h¨ô¢ìÖ ó›ŽÕ–X«³v­™ÆŒjåñ|ÃËq¿ÞôH=’€oʇzxÉDå+J..ÔP)Ïç-¹›Ñë&»×žå")y4·úÖUP9Rgb©QàY^Åù9²àÀ­ÚR, CãÚ£§{pžÜÒáï\—«v°6‡¤Â¥L#_/ž(è%æS=•V†Îô³‡y™Þãø¡¦ü{-ˆÅ&œÙ笜þCërs¨¾¬ÜOV©Bß>ûø"zP}¦£ÚUq3:_&µd‡>„O²ÿ%‡rÜŽ¬`]¸Ä•dš·Ý†²8XMÛMüÅ·öqacðŒ†»ÑÜmˆÈ¼™¨˜FÂI&Þv0ŸyaËñ¦‹DT(â«÷Ýå©üÅcJ¤½ë›ê¼O´$ýT9Nè±€(iù®"Hˆ!… ê¥:Ë?„IPõ0P$;½èùÉ^L¶¡K¤©¢Ò&R'2È4áH îB“{™0F`OñŠä¬@¥j±m¼Œ^5ìH3„*ߘ„S½¡*µTGê÷“†®Î e¼wg¶pA lö«,Ÿ&5Ûß‹´hÁ0d®4!€¢Ùt?e„MM Ôp]ö…Ð;GŽKÄ¡Ã+Rb‹‹æ;Ž+UR˜$<®p–m²¶R©5ó"}9ª}"q‚¸s9u©r±« Ø“»Ïè½=kŸ˜§!ùT½£zž=p ©+ÈûôkÝ!hO_ÀwÆ%j·ÒÀvJ1šŽÔÞ“ù^¯ÃÚÒžY¾€ãvà£:å“’ÞÚO×îjˆ>Ç_‰S£<é•ç ]qÁc }óá¸wgZfçæY¨í2V r g¬Â.,õ‘~a 씣•%ì3eGÏù*idž’\ëlBúy­òò+`RÁáÊébIç‰âž@áAÓí¿È™¿²œtg)ê¢÷)².P[™òá‹ÕÜpozõøeüu;½ˆ”ŒÒ3ð¤ˆj¸ú.{a˜³´X2¡Ðè=Sô‡°cìíõbÉ”í O¹ÓV)ƒÜMfi6Sg–!ÌW±mé\¨˜ºTÒh7ÿÛ­¾»rC8›ÖïpˆÓå„-„b,Ö…«ŸË-·–ëÓcbqx¸qv—_•hÐ,I“úá03^¤Û6öæ&ÐžÔ Áê%MßÖXTRðvbf79žö€“&pH J©'·èiè’ôÍl±³ý Ò c`¬t®UwÀò†y;~¹š“«$‘G×,¢Ë&o“ÕI²Žôfò¶é¯:0õÝ3ظ£—}1DGÝĦ) -Ù¤–„õÐZÞ– xn³¡lPDù<©º»›Yd¨%DkÿêË›Ì'¬£½[j­ÞËЩÄЇF9&ìDÚ:†Î÷¤5æ:tÒaN«r3¾Ï²k8ÂCâdýEý°T‰f<Ý ¯x–ª*6ÛCÓ`G¨ jÄ$òÑ"[Æ©I™±JYãmešsÀR €9Ô7tÐø™iZ®¯qªŠàhäg~{TMFÛ¦ÊsÔ-LB…CBÍtrA>8`¶fŽQZO‚¤*ó ô2Ø4Vûþý„ÊT…å …èÎ<¹oùM£Lk³™;ºø¬æe!JÇðþ¼RÎðG”Ð>Ó ÌVœHù%[MŽ¡6ªÔ#Èã9þ .“¥”n©SH%}öÒ¶í@ˆÀÆÆ>„kÙ¶Œ•£±RM‹€‰mÑÕqf,¤Cn6}(Ð/ΤQ€ƒ[]Œ‘ÇjŽÇÚCt€¾2¸éX0¢œÛ€ìˆâŸ®î³rb´0(C_‘PÉè¢fß´5ñ@ ¯zÕ‰A%e´7jÙkYÑ‹*”[»»{>¾j ç¥qòNa%’Z” ç<} RåV–”u‚õœ²*<|„kM£@’ÊûT´÷8klÕž}'gЉÔo¯-)Zq|?@oI*tb©äS*Ï +õ%M×'Vµ‘p£@?õ0po6õBá©ÉÿGFOæ|•¯X+DOÿ6ß*@¥3É‘&—[O>—ùHñšËÒ®Üeht=ÖwÓ•T.hu¨v›€_i¢ Æ3ºƒ¨Œòe³;–YB6¨êÍ@cw,c¾ižb,çŸj·À©>.½a&´Ã%t®1´ÈÂ=.CbÆmå{¡ƒŒ´6ŽÝíƒQgceJš`,%¥k¬ä)DÏ¥Ë`âÐcq¨nCOqáÃ׊Ÿ„Áê>÷ßЮîÙ˜F®Í-¦û=zÁÕÐJvñ&l„ZýhÞœ*HÞ§¾H”]QD¦´¢„¨˜ˆZ¾À™Sç‘qS:$4sSžï¤ižâÉVOìVyUôh[™Öv[ÌhåÕT«ÚÈù\Q©ÛÁ:¿nN‘T.a|†Mí¡§º:„î’\;bض†T{71’r!S¼bf7ÿñ`hÔ,ÀãuéŸE<Ž3Ö¦¢R_ñòXøv\Àb@Õ# ¤LºY?žOIçgK@ &-«87Ù˜¾—²“÷h,zË”Õ.aúîSö •Ï\G²Â¸˜º|mq $¡©§-Ÿ˜… ¡ÆéòÊÛo>G_cuÅÒ€^%.‘…hÔo$ò84ø¶§—Å£$R,3nN—+9Î)}žâç(zêˆñòKÑ¥cuä¹!ŠíúŠ,g&#¯æNò"ÐMžûä+3§xbÑ÷Qp{ʇʎZµNŽíƒNtÛK¹¸`ô¹¹ö,1͵Ç"Y‚Œ]^DWkÓöUž´çÑÅמ--ןZVH,¤$ý½U-ÚÅå¾¥³‰;Â@äú·¨G£¿IBÆqKm6IúG¤LYLŸ[H¥vÚI Ñ’—]U:i"Þª(o¥»µ$ã©`4ïuᇠTé§Ýí Ï©{Éy5G©[y*r½B¾T®Bè³éìê:‘f\—ºùJR­ÔÞ5¥ 5Ú;[–PÚ²…hÌF=Ä-j̺%ÁSÒHÊŽBÇ ±üàV²Åíèî“{CLþ¶ÕÌœ¯ƒøT˜m¿ÜvíCžïŠꚦl X _Ÿ?$·ñÂÅÒ%cG›d(3Ðf¸Z†¾myHº›ïcꨞlG4cˆÐœöå–B÷ì §H‚è°¢$ÜD"ptŒg  ŸÅVíPÛál*ÄCCW´x]®—mQE°Œ°N+ÊaÖæ­èý~˜ëÞt|Þz˳ @çQ1LÐl‰ô0®â1y-¼&×°ÈbY 7·{'`f,ì,NÝþl¯óÂï¯%ûüý¦ö”hõ‰{Ó,¯ûô&ÆèYfш¼Mß(gOb·±@åx°µOr«›Je9Yí¥±3ž›[nÄ ø+fêe–õÔ¦„Ã!Ä8!Ü!ØC‚{±vl¢¹AÍn¢yh e÷½v`|”›ˆ@T«óKy¬MÉ“úŠ‹ˆ„¨Ñaû-¤VèæŒöJ¿Â<Ûÿ•xÅ€;!Ïh °÷hù;˜’â°D.uÐL×_¼Uõ°ðì“Ìžº‘ÂŒšŠ;=üh…v8СÃc6.Fñ5G!b‰²¬wo6G*·‹[Ší7›nk Êàdrâ†Xd{¨¿ýLgä"׫ÁtÃ'xð úß"qÐëj%¶(Qq%XîÊH‰ÜÆBÏ`i‡«lêÖ¤¬Æ‚hÉ:P² (ã%!¡XÓj©$¹üÛçÔG@T7“„¹“Š[ÙúLÌ¿˜×[Ì4df ž$À£¯ØÑi²XÝ}sµ&¡þÖ£}Yž–Ž,'Bƒ³— ÓlT!ÊMv•v„êbf!w»—ª¿@õèÐÍó‰yc/ìv4y2qoËé§¹e”TH;)b3ë]Ѭâホ\ì HP‚™ÒÇBÃOv£ žnWsˆ ¢’‹E}´RT¼+ÇÍ|Ü„½gЗªfѨwQ@áo ´ñïüL!œêìó†[°Š† wÓ%Ó|{0½ŸÐü·Ø8ý§É,¬.yÕ–š‹:ª-j³ 0ÚáÔ¸¬B,N õBf¥ž™Jv‚7Qš.dR›0)Õeö]JhŒçåÑ›“¦Ü/¢ôںɥ¾'4CJ~©់?m+€G}†ˆ(}Z”™$ Bp½Ì»²š¨k7韥 KBi”É+ Ìz²OCíz<qêqá@Íiš]Ã+F¦žOÖ©ÒE…Þ?CšeÒÔ3Ã÷À¡Ìì(ý¨àÙÓ·î%>­56×Y4ÕSf“޵Lv©EÑx÷}! Jßôº”ŽžÇ;S`7­`ß4°¨Vl%Μ[ž•Jœ3z°e×/îÑÜÁв¨tˆ±ƒô/*Ôº©Ý¨æßå<÷Ïü.n´éc`]* R€ƒŽ$=hÐùW­d™,£âCÔÕ϶’íÚbÌLmõÁÊîîí %ÏÓeÃX=ˆIòkMQµ P&ž&ØÝºq—Ÿ»Dª#6>„9Y‘?d®˜f¸‹gb¼Ô| ´-èVK–½r@æ Ä…fßdÚ] Ž´MBìž'õ SÈtéðÓìyY¼ìv$R˜Òm%­_LME' oœEjÍAIr?õmõ™‘Pwì9+ñíþñ3 )mõB5m’ä€ÒÙh{À½Á0À¿¿MͦÔ#û’ExY—,WÈ–ò_ãÖhí!…Ù¥ÎCûçCd€8ÿ˜AÀíaÛ)å%_,cÏuÔ©…{ÉU.†ŽÌJ0üŸÅ­“6é×€ÏW±ø:Åq&O7xÖ®+J'¾·*áÄ8“õªËYé;÷ò.˜ ”n[œÜ`ì/'2ñŠâ*\ÌzEïø®2@)7)AZiºô € k‹v¯­¹’ÕëH€ã  W]Í£`-?5‚à E\7«{oÅGë¾€§DÞIŽ+y:6ªu)æBJuµL!Uh‘ù}¨,'i'€H÷4(eÊ¿Ôáq&ŒÒ§€•$ Âû‡MõÿD|,Žžˆ¡Ê¯Ð©,Å™¥° ±?Vï{d{h¢eçeÚ³µÏ4Ì 'qwЬëª#¨øößȰ$:¼ò;Â\èKÈÉKjöÔ÷w‚•Ljº¹î€ 7’æŸÀdKç<…¼ùäÝ)@-e)iÀG—\.2)³Q¥c®Ú½dKfSèõPë`²¸P˜ûíYr«¢#Àk ã£Õöƒ{´«ƒPo ´N‡&á$ÁU/L†¯)’¦_¦~Ó~f•×M6‡Ié}ä8”[Ô Î×Bcó Ù„>ÐoñŸºÛR@Ùç Š|”ß±M—…”#(Õ¦ö°8fð§|9(°»)5qÏ‚K¤QH‚[G#‹Ä&€¬ùVBm—q»ÖÈTŽçÞfTóœRsöéÓ&:w°s£AÀ‰M’%YœoÜøðCdþf窅Œõ—î­VÕß7¢ªWUœ®*^Æ0ËI}V—¶E#û熲ÑsfÞW¬Ô4Mî©ô;Z ŸéSñõ}íÎ µW¥¢iå–°Œ”«ÏX)œæ<øøx¶fío–¡eXxŸ ˵»)¡ÙµvÞGˆZg®½ê’¤»¬ÚìW"»|Ò›TÈJ×ÍŒøgQy–+݆§B§ã[>ž×J¢YþªZ DU¸3ÜÁîSû2~ý!î÷wwØ=Ç«¹ô0ÌYVê.Ê-·Õñ,[¯Ÿi©ç1³ó¥Õ)CÄrð~— _åy±UŒÅIáYeAÀe.Ûû“óV|ÊñJ9eÉúf»åôüò¢VŸq /Ù÷­uðþËæ²3~ëÅŽ0=¼®^RÀ5% xãïòB—A Lâ?K‡Ú4?ò»­j•šhùç8ÚÕI¼Spá»VÌ’qn@áÉ®û|’ÖÌb*h±Ž4ßßàÊ/faüÕÏÊÜüïfÿØ‚gmØøÉè|•È Y ÂE¦ñ¦Uf­>¾Øa=0¬þÏIå6€u&d"ðxv¿ê¯˜kêüÜò/nÐÕËn´åÁêoŸì…µè 3>Kþçpœç‹ÕuèùX_BÒ©Æoëüïýw§»/5fÑÅT®_™ÝwüV5p‚í¸ê5\ƒR?sP—ÓC8Qy-¼”oWWâQËÿxîöo*0¥~µ¼ìÈ$O|£#geoÙ&SÈ?e¿'0¼Ò†^¿ý»¼ ^wßù(¿ï}ºOq0ƶÀ|þ£Õîºý°…úõ9X?¼ž_ÕÇwøKy)íÏgYÜXß!ôgÇQ» wûµE ün‡ço[ÿ×|(Oøæ#`aø$[ù]Íf¥²ïã7+\´Ú¯Zù“º¿ó…&ß^φ¢s³›ë!úþài,#óy/*ñSÿêJ¾Hqþ±öÁÜ ’!ø½ˆ®já×w¸=NXÁîtX¡dcÿÒx-mrˆà$íÂÛGÊ»~rüÚƒ+ò‚8{É]¯<š¼ùfRÓŽð ©×3ì/‹'¯©ú+²¿>¸þÀÉ·ûÅõ?IJ˜ydŸ±sÏoéÝxAÛÇÑÄý¹ê«“sùócùÿR_ Š·!c=&}¶¹½|¹cŠÇ/"¿‘Ѫ™ÕlÐT·^â9ëo5œ9¿üùºÉ?¤ûjröK ïî¤!¿{I`î¼Ðú9¿„¹_ûo îÒýžÐïiö¯_½ÿÅé­€O´;O^ÅÎX'¼¡àOxЊÝÚ¨_Ìý:š¼w¡~OÞKQ5ÇQVtψîÀûë‹^÷3R#¿ñav‹¥ëô˜W“UÊDÿoùZ÷‘Ëj{ä½s¼Ö\/ƒMÙ,ïku+ÓËâ±yÁ}0A’si^ÃogFÜOç½`ëoxO—аŸ ú=9Ñ_.½@"ê¡ûK÷ìÛß{u/·Ê™•û±¸aŸüYÃò˜ ?¢mX/l:‡Æß³˜ÏoÍþ0Lá® ÿ† /Ìòý¯€>Þü_ú=;üi ‰Jg-ýBå»õ©ìl(Ùæé÷¿gÉô_û?©Á県ÝWµ'ãÏï£ÀñëûÏWÂü<p£®ßHqç'ðe÷'~o¡f ãñûgöâx±ý;É€ïöÝcö:·Ö]–6ðK¬æ<ÜÕÃýËÂSÕfü°ùÝFé®Ñéš±‡Õ1ÃbŸÿ°žááâxš©©G¬ª°§5Ý׫W÷5p¿¸çû"ü í½I¼Ì}|:àø¹ß»úÀ2ÿ7½ø²ÿF7ɲùaë䥣SuÞÍ3ë/^ηMôt>ä0_ÇÀ™è¬ÎÁþôÏ k.Kú«ï,Á³a­X7¸Íbµˆ+ùɇú«‹ý@-ô†ùÉ ŠÅ:Ë’ÿ£Ö¢åL'gµÝ3ýòä½”7z½ò‘5?–€CÌßê‘ÎŒMùÕ¯YFg„ã^ß'&~¹~š¼V±×#ø=ó}ð“ÿ¿,wÍ–ÑË`®†òrÛ÷Hí?$ê£ÎÒ¾ejv Yç°Ã5 öS8Ïæâ‰ÜÛxI÷òƒ˜bµ_ëLú꟠³ý!oÑïÐ œ`ûœ¯Цh$̯Ž^|ú?äiw)¥ïmÀ_$5ÂÖ»>_…¤¸Þ+¼º…¡±fů“ž*d¿ÎRªÓß'²Uˆ8ˆÌb-2ö{!Ó¬úÐ:R,­ßìýA;–Ñ„~þS 5kv_úáW·\Äìo˜ûÅwÍqßÛ=pP£ÿÒl£Å÷Áö…³ÿðC/VãwtG‹5úÿ~ÖC‘`>8}„M•ò¡·j¸$/îå>`ù}7ÏÓV¡Y‚Y÷еO¨õˆûƒéÇ1´v‚î#³Áûw\°ûÍžùò‘ŠLÊõ¿ÝýOþcþ ÷›g??t}"“þ–™2ö«™É܃€‰¿Óœæ›y}J¿§nBÀ<²?!p»Vïïs(㥺ªé_ãûvƒôÝ1Û ø3¬Ä>ì°Ü¹K3#l8 n¶•(Â0¥hþ£ë³,62y¦ôJ¥(œØ¨c‚– ÿœÃ¬ù·  ¤Äjq_y–öz™˜“”hguDÀÑßœ”r&MÔ)P¥Šå4à„zÜ'(@ÍrD ŠÏv§ÙîI¸Y~}ËÛxJý¨QÔ‚“Ò`Er`i¢§^“€~>Ô9¼*­Ò,9Ei¾(l‚¹­œà ¬C‰´ž)M–¤-` #Ñ'dpô´vñ´7t½ º f^EFŽHñ²>T±4^ òÔB–Ê:ÑCM”W4‰.Î÷h%$Vìeh”Q‡á’Yÿ †«#aÄWµy@WOhÖ§L=œ´ÛÔ7Ƹƒ>ï-Öw|¾ŽÌP2À“L+³ÎÂlÕ½Âä‡UQ¤%_6’†DŸ0ÒyP€ÊV½H’;ÆÀÀÕ %vƒ„õ¾32Œî¡Q¿Û÷÷þ’¹ a`âü•€µ5(P:œ¹p€ïzòˆëRó\¾o:c„®tV¾pEO^P´‡çñ<Ó[pôÂ͎σ˜ï÷Ç^Û}‰QK&ö3‚È®|¡‘ʳiø§·-°Ff ¸äâœr.¼ „}þ6ÕNŸïM>Ü€øJ-ùi]¶ËÈÏxØ UDÜ8®2Ñ­œ#{"]BKËE6…²ÂŒyz"þ ]Éøº®h‹*8Ù™µQ ª™wpÝû}ly~˜ú¨ °H¾Qæa©ñž×»L’`|7úN§*Ñ0L š?u ”˜mM&l³Õ$º*fQp皢¥•ßZ¹ƒÇkœWÀÎNü'ÎФ¨Tœ çSêj]bg¦f;âË1;¥S^ÔÞÈò‘£f&š°°Ê8’Y{ 'ºŒý®Ç5¯w‘“áî,vÔó8ižbhvÜÉM„p¦{!öžó²k˜¾¨íõø›Ž„¸DêŠÈ’Ø£nò†C¬…žŽ¹æš)€}¯°·ƒ }zÛSÄÓ6|¸¨…\=¼Ö2ƒ3ÞÞFV¤9ú¡ãcC¨ºsD$’œäL(%´íºp‘Ƽ[Ñ* ç.;Lƒ;AG $ë6$iÉöjI iS·bSŠãN/ñˆÝ~ÄË,Ùðö‘7„ƒE¬º ­‚¡AÓo²ÄX²=ò@b¢õiJEÛãX¾DA9N7팆¿¦ùeµdÔ³—*ž0h”0Nû(Ärá—v8t}©³e"_˜Ž$Ê1P†cô³Ùp^},#åìUÓJR¡ßRÛC9¿^ Ü¿ ‰£uÈgø&aФ‹ÞÌW¡É¹ÓR¶v"ñ¬}Aë”8–ŽdP«E5£ù8›ñ|m6J@‡‡¶h¦«)é븎Ò;Šk´à‰S…QeÐ|ï…sF1„¬¦31£@ s§S—0£ú!Hrn{Ú8Ö ¤+²‡<γ¶Ö exü-û+ܵƒšÎôû4>^{aýaW>Û¦'Öïß&:—-¬U áf|Æ­„q.•Ô ½Šz„§×{»®äf‚…˜Íò‰#^1ßiq¸W•Þ¡ÏuÜ(}Rü}ñ K»ð~6‘©*Ø©½ô¦d8î`CélzÖMéÔÍnjí ã“rYæà(ªá-;ÖôP¼¬¡»‘.9Nv%dÝ0Û,¥NþqÖzçM¥4©7‹B !ÓoMò¢ò[˜ºâ¤›EIaw³¤âÆAj³ Fæó³w|™ŽLv·6–4á²×söA(é,9 \ÂZÞcÓ3¥3írމùÕãR$n±¹Yy‡h¾Aë³Õ¯åôcm—b–=ùD€#ËÁÚZ@…­…‰,¥CêÓ¬I€nýÉÕžu8|V u¶íu¬é¼.‹‡>i{{]ÏMèÁ†ç\ã¡iO‹«²d¥EŸÛÏM,sCZÑã¤OæÊ9›MG¼šP«2˜ Þºßãs§F3¸GPƤ¬¤±UZ`ÜÚ TmÇôäWºN¸vy6]X¾ËË!³Ç²çRsð\nökßdø†åð©©ÀÜr¢Ò¤oO”»øˆÞ©®Kúåb-µè8A2Ä™D¹©²V¡{·!4××vó°ÓRçeV.qK¯6Î2ÊŸ\ÚQ‚kH‘UU ËC1Äݵ­óuš”1{8K8·>ÿ[ãz3¿Ù"kò=‘O¬¾´-uå+X…}U¬ó—+PMýî\XdºÝéOoåàvFâg·8ÐŒçWÔËJ˜º¨›TfghUþðîÆ9•y8õq´û1•¶4žÁ^ ›Ö Rª5­Pçåˆ`É3EŽ+ýCfÂã!Ò´#eN3¶´+¶yAgÁßîb]6n˜âu±5Ö•Å”Œ ‹)Äi9°$Xp‹RÛ Œß†²9I€NH¦(µG™jC¹ÜÔGŸÇêêd¨)Ö( §ÀaÖnÞ“à~“”6,ûŸÚqtÒzZŽéìY@Yv}V6 ‰‹vÿF|…¶áÎd¹`Åîe ¶± ¬½¸¨Ó4Ôš Ä8Ѷù_ñÈñmÄ1O˜õp÷—7á7ZÜÎG8Y&íð/ÓNðÛ›2Ѥ2)œuø q3«±¹mk¯ : y’,'Ò¸Äå½}º½Iw>²/£#‰#©mRØ|¿· Z¨84’Ú€ç£s Ã?…#¨Î­‡Åi~?\ŸXíçk'r¬¸,ä¢/iN‡É"Iq¼÷/ïO;M:‰‡|‘f£ÊS«Œ®Ì1èA"!Œ,”ÿÑŸxr‡*ïë ÷Ú °Õ~£›Ú}Lûñ‹éŽÍ¤#’ ·úîo›æÕY«2êbñ7šBv4*PÆRV¢ÿ@ñðù¸Ð &O»ILŽ lÁã`«Nª]ÜÁ¹*À*˜=üwÌ 9k7êZrí7‹å°~ lû­£5”¦jÁoé{ºÏ“¹Ï×ËtþBZ U½vaŽ{šgNJrbÙ1ì7ú°d¶qJK§^¾î¯«ü•»_ó¹âZ®¸ÛŽ€…åãY\7â9è2]‚9Ö^>h\Ôoú;‚üi¿Ÿ’\fŒ ¤Ãd‚o ?ò‡ÿ5Û€«2ŽãvîéPŽÍ÷ ãºpÕUþDa ݱèÁñø€¸8”í-÷”€¼” œÆtacxq™&¯¹ì›_ÎŽº­wSÚXÃ; ñž‰ã[Þ…ð´‹úZ K3‚wo!¹Ñ¦\ÃÛ`ÓÄ!šð¥àL†(æi‘[d#ç-ɾìb¬C±ù!¦j׎µ—QJ…Ï–š‹áY’êÚ¥¢³ó“æe™öâÜŠ²Ó•=tSKìq$Ä,Ü×,¢EÒØ缋vXÁ3m³lƒ4ÝyÊ&™Fƒù:~v°‰kåƒ FHâ7âê¼pî!ÓT†Síz&½ÕÆîQ÷7æ¶h±øŒSûn[3Ñ|¤!Lø“v H\º³Ïþ¨K(œrñŒ÷¤ ‡4v ¶²)wMJ6ÃAÖŸ :òAd:¼Ü5=us.¦/º´Ž­êžP|Oa—®UÅÀz…š”+¡ë8>‚lÕ“æ©W ¬ÝŸ}á ÀoTVfRŽû…²xwýßM)–zj¦•Ï^‚SZÏ4šï€é0¿“°Ü8¯n,'}°tpeÖÌ¡iîŠdí2\£N úÝ‚©Ê‘0…ë¹—»y>Á!ÛÕ¾!ÁjX ýî¯`¦LÓZGì;õVëªäò\U2î+slwt–*û»\Å ”.¨‹æ£–SØ–*¡bçLç~µTœE¯-”ûNgç1iêÜxTÎnOnÆ¢Á ›/m©8-‡>Rlæà³`ÞŸGHT0’¤ØAã·do/p :LÊ8:Y˸b";È^n:ÍÈ$ ®Î2 y|ª°çÈáµ|Þ=¬š¤ÒáÁ 3µ%GÞ_ýr|PÚÐVëdxïnþ¹Bw}y0¾b(ïß|…>zóŒPò⊡ëW]¡åÊ·}ôn^ýÓa\~OªœB¹Ä«¿S¬+”Û`*¬®™( Ý$Åk°‚¼÷Aì*ULQ2$5NÄ3ærzÅâô§@Zf˜+}+»—+*T@ý2r¥yÉ.áf!*• ¯ U‡SC Ò u¼æ@ÁÙ¼ýŸ‰"ƒ”™`lYË>Írs.·ÿ%WRµ¦©Þ=É+ß_cN3×D=Á¸‡óxxû+×$4˜µ’Å¡&ý¡;·2û[Mÿ ŒÍ(?Í2”Empa®ùN*ÖBo 2iï¨ ~´‡]‡½@§Ë€•p€>|D©øPö`_Âh‘˃h,ÉGi¿ÄKÒEE¡×™…“}ÚìLj1׎ät”;Ð,€$™“oÜ¡ßΉöÏ}`"÷ =O^Æ—úFçmÓnU|2á:SRÔ3ØáV€¹˜¤·aŠ} Ž^Ù\ÒÞmbü[p¶~›ØDqTp{šY×nžcý%Áüj5KÄß}F¬ËLscøLyÀ `Ðßiª_‘6Ë,ËÿÐ ò? \ân‰‚ºû"3 »šUÉ·À‹˜m7–¿ÑÈ4ÌÕm¶ñªîŒÅ6¶nùÖ ÆEzƒò«pBe Ç–5g›.§ÅftI>ê÷==HÝ6Òf:åý8½¡ñÞ­:xÆYLIÕÖÜ%èE…†d=1G•5q†/TF¹êªâ“ “ƒ9”=¯á›œÕ±ñò¿¥$߇!ÝÊÜk"·m/Ìg9fê½ô‘57û…ú^¹²ºg¶eŒy¿~f]eß¶PõOÆ3g‡É ‘““3×ÛHLué$ñõJ½píS¹0^h™…”‰Í†$D+S¿5«í?5Î ]æ°çÁo›à òÂhMÌä¸5'^µ"^·C®1jbB0UÇÙ–àèïš]×8ámGó»ëP_N«öÞK{}n-˜dÊ|÷ò³¿‰øÇ×ç–ëf'üÀOC¶’¶h9«X§¸³wì^1ñݘÊÊ ,Wr–œáÔñʱY“n÷!I½ØZ£§÷\žWâs}¶[QÅD¯nçúŸÈÑò[ªè³&\³áf ‹[N’Ôå€xTZ.èS«….æ…ê0%·žÑhfº8 ®`d©g‰®Æ¤]Í"›\ô‘­ö;=üŽs¡ó°ÒÂÛ_™4¬I”±,=ÑÉàe¤¦ÓÍñožQ¸§LÄ¢à#õ»-¿5-­‡Â’>ŽOI¤€ n+§³ƒçFÓD–B&êÑngå’6sÃSo,õ#±60aTK6iUÿ¶Â»/rdÙèºÜ.¦åùí¬EçÎl…Ïl‰}öÙÿꔢ↹é[Z½µ–* Høià‡=1 &ª~_5]²9©ãå8ÆsØ÷ñfý &-þ'³µ ×J¾÷ݶ뽔h‹B.â[¸-cœì”ö9'Ƶ¿xç6¨O¾s±U¡6&[rïçˆoØ9Ôܰõy,Ô7SîÞÝÇ _†0´E;ÙRhx¬.àÜs¶.úU^=^¥Å£¥òÓõù(–~ÖU}ÇË’^Ô_)ˆ86öm8ð®QóÝåúÝ®RÎÿ+‡ù!Ÿ¢OÀCYl íý @wÜ\Þ] œ©‚³‘£‹÷V­&Y7z/›U wFÈWМÝþ':ŸL: c};âܹŻ¡RBòX@eZØC{úÂLT‘PBgÏnñ8ef«£IúÙ'JÕl€aq?ÏR÷i}ŸAÃTa½Æ¹ùµˆ»†MŒ­5qxÙcH!­E`m4E³ë(äõ^§‘0Öݲ§AH¢EãµËßm…¶é¦VÍ$:Õû%!ê„Hñ•þYò&"á( \Ó-¡˜ˆ:—뎨%‡­ÊŽp92‚çcD`F¥Aô0èZi;YGÌûçý±DÑ÷4eS{͢䧅˜Bâyãëe9婲b! ˼“€¤œŒ±}¸ÀN]DN¶Ññn™€Õ@/ñCŽ.p<8XöΠIl£5{ì2Õuj„ŒþðïyÇ|®'KÔ8à¸9˜“ÑcM`q»§6iae…ÙM£ïæ·ø5€[©†Ÿ»BstwÒÑö6|’!§´„ÌÚÔ|Vs]í3 ³·˜?ÎÄši*ªˆÒåH´nyúKo¦ÅÞ,l²•Ù›jõî:¬°ô9\ë€4.7.6GÚt~mDÐ:õL(>®ÂYª Fd¤*ÂrDgòL6¥ C7K7„—YSuÀ¬’=7µ£žÛqŽ8>T…çÙQz¯1 ªok7PÄZÞÖûêZ«çÜ·[‘.Skòd`Æ¥(4 ¥é±HwøÌ¡¨Æ§?ÏÌë¥p7,y"¼½JP™ÇYõYe6 ]¡”J1ëáÒ=û_¡‹)–R=‹¾›*<ôÝé(©J4ñM¬Ó¬Ó“ñóÚ-–N!·dé:¼Šn¢³ì‰Ùõ‰Ö¾vé[Õ̓۱ˆazuýÖ¶}x¡&å>+zpËΑ0hõñÝç}iç]°’d<#µ .ߥ±ÞÒ(I&g[Jܵ±N­ýúaAAm´ó ½(+}æ}b|Díßî]e×X(½-òSAO§¿#Q 7a¾Œ¿lR¨¿[ã ¢jé¥eä ª^Ó %œbšÿÆCðà‹d²g rb/¯à¨/qœŽÉ*ŒëzQjÂSGV<7CZmù+'›JJ%½ùƒFÖ9Šíúhµväe«D°Æ©ñ2ìÏo¢î3!GãIóÊ÷®{Ç÷]ÆnÚí‰Aó™ ‰÷´h°#‘úÞÂ)t:2,ê¦0i>y ? ¢¼¨ÞÞ$ÞÀèµ÷}ö1üü5ŒGü;;ž‰R<ØTJ{P¤f9DßN¯ýRe8—ˆÊÍ|v$Ý úIü9Å"ŒôbÑŸ„£5žyîË]Œ9Aù¦¾Èîâ$›“m@ÌÂ3Koµ”ÙA‰-‘)2°;·à)¨ŒpšUÞi”QS¹ÌH:cáã4'“NŠËw1KaÑ â¦3U«pÁP-±§D|xÜÉË?+¶€zœË%jz£l?]Ó14öB;µæ¨F L·ÀOŒrG³TÔÆÔ~f@ay17f«K„E¢T’Ýý·-mÔÖ©OdÓèˆ{1úñ¦P í‡nÂ;Á)ØTÂké‚QGÛ"Z[Ñ ¡Åtú%Òf]ˆn“J/ó‚yчå’cÓóɆzƒÜÍŒ„ô9-ÜÌÍNíLûF…íZ­K-¦Ï<9¡é€*Íù¹,©OÇÃpIf™$ H¹(9קއ-‚#ü…™ªî:†îl"üI|žØÀ‹O½1û¹3mùÔ,SÈF*E,*œ¼Ô\è î_Œ@m-- txý{xŒ¨êuGêkš8¬ápqu",î¯uvû6ç¸MT¿á¿rb[رði÷ç&}ßùm C„¢Z¹Qo…PX“KÎô´ê©@vfx"]œ=ó—$Èÿn,ÔÍ„4“³†y ï›#²¢´ò"ai·»ä îo’wŽ0ŒK=»C¤cÂxs«›Ø )øS-F«Ü³^ øá~yçâ¥s2×c©n/škÃsF›_Xñd(pvc¯êeÿþ)à×DÏ¡ýC+ãs¿çVßûù‹D¦Õ°ï÷Î÷¬(u¨g(uãüUãǸ)o]ñè Ú>ž–‹ßóØë` ÕÝçö@{Ì]Z÷6×^\ÿCðd›<_,üÌuÿ€ïxû{Tœüá÷¤ü°â~ù¼,/ýyÔùŽÛ=–½þÌÕmÓ|fÓñ/Á £õ‚¢—þ}Žp̱éwöº­.VâŸß>9ñÓl ì/’«ûÞA‘ü\eÇNîoVˆmýßHšd² ß„×Ú7¹õãxEÜ?B È ¹´3X_õŠf¬×òr?šp÷q„ÿ˜Ñl"`5ùð¤ÖBÀtÿ»÷ãëË0}-}ìvu„!Õ=|^3èÇ2‰‡U}ž,°EÝäËn}Ï<*L÷}°î¾Œ`QžøŠÒØU½ø‰b‹‹5Ïyë¿4ޝĘ[òê2ÖÕ,ÙxôïFÈ ø—xßýöŽLäe|uËÛßó½x§MÁ(z‹•ÎõðüAq&Vl„½ãáÖ‹pòK%苤/ÖÍ\ô%ì—™¿rq0²}ïWËRî½Q¿ô°fôûNÃði ÊÉßÇØaB2‘Eð‡´Í f·Ï_ œ±ÞÃÚÆPâ—bSŠeQÿUƒ]ð†l0õ?kܬÝû÷;^l÷:?l¯oÿ/½µL‹…ÃÛÞÓˆa‘¶¿’ìßýî²´'û¹¿oæ=_†Þ¿µ‰ÄÌ~¬hõÚÒyÃlòLÇoûµ‚y÷P_ÉN‚ÿ–Œ´Ã0ØõDì†òÏ— ¬ýûÝ@ÌÏ)ɘ÷“†î¡wœt>ð•ùÁ~5›ñ_J|›câ |{€³í¯Í^ÿhHÅqøÚþ›½ñÒÄìÔÜç÷aÁ`­ z¤ù2¦¢ØþSÍkü7:™#±Ìi{Ú'Ä0÷V‘øáœí2½—,Ðõżo’¼`Tqë·wÆŽN.ƒ­³œí†ÞmÕëŨ·Ý÷ù[¤t¯Q=.Õ¡qƬË&ÂX¸:øGÂ@´Ê»|Xfóåéð2ßza×zÿ^:ŸÂÕXšà³1œp?ƒôý«áʼna>û·"­Ç®Â'ŸÕçfPØK¾ÏYŸ[â¹OU´óåºë[½~p÷õ‡0CÈ@ø7A/_‡Ÿ±4߃z†óºVœÃ×ú¶¯³¡li†½¼qhÿ&Áív¨oHKóf+L¹wÕ¡u-›ñ¶¾ÈRšî¹5‚aÿ}<€l¸ h2ÏùñÑ[ÝÍ*üà =/x÷›…ñágµñÁè÷:­"ñ/¼o‚{tèç/SÞýúiðáƒö ¾Aw±º‰€%þ¹˜1Ã:žot |Òs×uŸ0§g­_'ƒ¼×Þ÷Sœ žì¡ æîÿʃº\ôm¦‹—Hìú[sÉžxƒs°dô­V·Ñ=õ#€©ïá%v³e{_Õâ “îëû?xqÆú¿1w›í¤ÿÃ<ÀúµÕÞ¢ÕN÷øûá|äJžm}4‹‘êÕËm,1Â--02š{0/äÛa‡Ò2½pû ºá[ÁJ?ôÕ:ÄþÀÍùnþC½ò²–ð"¶^¿é4ïrïˆüUq¼j¸U÷†c_~dY"×~ 4/›Áï´ÏY™ÎCö½§óù­Yç/mXVÞ—>®SåÓýÙËÔ9­Í€þf`~û¿D c–ÿ\ƒßÜBzøÕÆŒÔg©›`†«ûE í—ÆUú—ÃÄ>@Ð2?ÿ2ŒýÆxõLCž˜ççŸÃøßûu„ŒÔâ-üà4xŸŽD…ÃRŸí‘!ÍYù¼ äMþ5õ<\Zæõð×1ßËú˜'Vñ_‰ŒÇ:®—Ô5`ñË?ï'&_b obdðÇK–Zúèÿé¼Rþ7‹þº ´Zñ ­÷þËÑ›üÁAäçÿ„¹Ñ=à÷»³º ~<¾ŸÞ›¿¨ûfš4°o0¶ÿº/þz®¿@)'çß!6?ôîwv¨Ñýª.÷ÚÃè‹Ô}õ’ܨ‰äH¦"<þGðfݱšÄýë0c ʳúßßO¿¸û Gø<ºàÍ’öU¯qÚ“ãÔ°¸¯îˆô¯m€$øÚùÉ&œZÇÏŸü?,TÒ‡`îyÿ+ŸˆaíÝt9sÓ]ïó.ñ^¸uÝx-êy¿g°BïŸ ,µü ~«c Ï_Îï˜ü>/CÂ_QwHËçóÞîÇFÂØû庇_ÍÎÐÿ}äíáKáý$Ç´À:}4PxáÁÞÕ%ö¾ýö~ás¡þ¨ù/îÎÛq.ôß$Køþ#Ȳa¿[²çï ¦øæé÷!3³ø,G6SÄAüÙ½“ ÐðÛ3z 8äú"Fç+€Ë£ÎÞŸA§¯ƒ”0ÉGdùc~”«êÇ×I²Âm`þkçòóýÛÞ ¼XIdùÏo’ÿ™›\}±‡Ä»f`¶³á0ß>ç`ÞÈüÒ%Õ<µüRÚ{õgƒ?ýÿ4À3`çÝ•»'®f·é!ç=ö¹õ!ÝŸW¤+}KÎ?çŸûU;0Î 0sîÇvˆIø´XŽ—ìþ·Té~½â>®ô&ܨwÝÌòè™í8€o2Áwö8qZ€¾Ï}ÁR¿—Þî3UîhHyü7yËü´˜·¡ï¿XG}toÏ$¦åïED¦0ŒM‘>Ïݘ/ÙþÈÙkGé/=‹_è,@?#½ÝÀ{/û~…¥äK ×ë,Öåæö·à;Q»•·{ëƒo×KÖ¡6ÿî ߎƒÉ4šík ìëÛå‹Q»Åíí ë1Ùù2)ŸÉ§ï;cŽþ7,wÌè3TŽƒ}è—olös_Ñø¿í_‡=å½ãÿUïÛy˜Hžû·µF¨Îò)p¢ïïót“œhÇï ¬ôîîOùY9íÞ^É¿{Û´Ë{éðɈ³¶¶”:!9’/g%[Òmð9v‡´ Ž,á½ÚuÒ1qzJ›ÂÝ´)‡™-Ê7{t“^`ÞæG ïD3èèÊpœ¹¹Tÿ"LƒÇeIû©\ ¾*_S%¢›·‚÷Ú¸–üí.­:boýÉJ_Ü ¡Ì¦V–2ßsç34ÛbW`=s$7uÆŸpQÔ4\Òšˆ|¬þ´N °Êfw諽¬óc)ž—¾ÖÿOƒ›¨¾/%LKUÿ¾ «+¢Gœ€Mð»È’4˜J`,lÐÛýy¢&ÈC²¥ÿÊ:I€ëˆ¢ÒM0Òí’ ¨\Δ'­7ŸtÏ÷c&L⪄Ê †½ ^gäõŠ”_? RœSÖk"ô]ï!7\z½UùS ,v‹â Žb-L2÷¯u.ß»»[PzGË?Îä­^pI€ð÷áÊ&ë½@JåOÈ ›6ú ÂUƒábÒxã‚w%Ð]¥êÛŽO’×EûY«Â: Afoë Ðg%J>A>ÏÀõK,HÿY<ùª^OKIó´P²§¾iýz‚…‰¦÷œùžâ£ŠVE‹¥´y¸6l°+56ÍS¥Pm™Ë ærm)v!®/WX[LÖö£*}’/óRn<Âl:VË5s6)ã p²ãvÆÜ&p•y×XနÔ/Ù/Üz.5ʼõÐÅ7ˆÉçå ñÁuÕÿÒ½ûkQeA¾¦)¬mGÓ‰2QoØãÒ”àÆ’¦µªU…_³š¬êЧiäѬ@@Ø *äwê=UØ+Q¿?6‡ûvUäî‚¢éªU¥Î÷­ °Ñ¾È"ÊÅY˜tðö/‹©t´%ɨö5ÖÜÞLno¡ÎçH7yÎ?¼Eûlì RM,’g¿Ì#Œ‚§»ú>k­õ dùZ´“‚Š‘l¤­+yÉQ’2" ȱk#9!¨lçÉgçUj7« ]nÒž8?3I# aùµïQ…`vD)ï•Yÿúœwþ/ÌÉ 6óîC²3ypeÈß4³60 õ¼¿åßñ¸¼Ì亟tOþZå¼¼hêÌÿÀÅæÀäFk¾q6:ø añC½v‚2œå8|)˜N,ö<$Ú€ÄcŽÑ…-T¤Ýná5)Dª…æ½Ï§W¹dC|š&™°@Ð`é©Å€[ºÉ“ûÈÁ 8Åu4¶v¢¿Ëóã#{’ÁE#h¯8eEÞ&ȉv0ðL<£6'”SÕ„³M»n"Y2†ðT}Ô÷܉Åÿª*ç‹‹3n„×…Oíз~Hç…‡…|çiÊrf}—Å•3€0Š ý¥òðh–)9…@Öy¢7ŸÐáÒ(R‰ýñz¹>©¬Ælf†¨MAŸl{]u8¹I8«;àjptˆƒg'·í1T“ÄoÒÙ©<,2¡›¬¥t÷#ÙßSD 8<™3ÄD î:;vRVwÕd. îJÃaRÝ‘cH\Ù”ø^p·—÷(À”™±TZìè ¶·H\ÿ·aár×&57×mŸÙÞêÒ¶®yúÊf.gÔÎãš“9¯?22|‹ÔGi$Í(êÙ±©­§2 J%*øŒ«Êr9µ‹rZÇúÜo&NòtïwW®òÌÌñj;à FW¾c9CÚ°|½±ê˜ß›„ òcÒ\6±J¡¾ÿfŒü² Ä.dNd‚ÝS÷­þ0}BŒRÙ­Ç÷´"“ÊàñRÅlV7I"p¬r÷ TÄ,låÒÏ9X®U"Gyð¿N?Xq"²Ä9À®_E¢P¼Ô}ö9&“MýÝÉåª%½¹tO(XŠe)ð¹ö”«JcE˜¤%gÙÝžt¥4º8;Ämû µÊÕBÍ7QŠs!ã¾î‚yúPþ¯ÔR‡£Q«‡ƒ§Ã¥ßéð)”¢% 0T(êÓ±fi–è­–éY†–i}}2¾}š¿†8ˆ‹ œlŒæäJ‰@Ë, _w.ax»¹qצô³w˜½'å?.hQÍ>¿½õFÓ?I´>M¹(ÊIY4ž²®¡qX7Â`ú´Ã1ÙÍhÍÊfÏ?!Å©E~ç¿Üs–!nƒ Äì\¥rÅ®]¥5íø¡½*8+’ä§—tðbÁWðF¥³  „ 8§ ¸Ñ™uÑù-dTt WŸÜª=þrô.©™Û'62¶ïr*© ‰7zJ¨¤éÌ!0”<ìÂðB±Œm×ìWUŒj\t²BðóöÀJ͆˜ôäñ(F2\7áŸR]‘•{oT +%nŠHHðó®|µ åEW“ÞA/Î-ë\µÞkÁ:Ü^jÖÃQ9x»MKï™aÀÖW) Ú¦".,G£¬ÄvzPi"§9ÑýÙ€0»Ù«».LÅMñ,¬=SXMvéú–ÉÁ'¨/åÁQaC‚ßÜ{T¨aL •pIЙ½\×8”ÅI*oä×çúÆC÷õÌ×û"Zœ.ñd†˜OËBÓQ*>yÔ¸†ítÐÐk¸!™®“¹l¢(´k!橉U\¶Úpò syAÏ£V V"}4„-LPŠ0Æõà‚©Z½pœ¬.£Âìü'{ÒKè`èÂíò"8ض¬™8ª‘‡PöŠ¥È¦í­1—4ÿÜ sü¡ŠDl‚ºGVµ3\Òý4x} K:2žÈc¿kKºn€dÔÙ.Kgg¯Ðg ÌWªe otk|5o›y?ªu‹`À-}¦¾áZÜ3>wkm>ÁNMIê,ˆÖ–Š- -ô¾'3$¦)ÒyCÄ—²ó˱ï¯=þ!Í_ ´­¿;aëx+ÜúÞÞlÌÉ{Ûèvh’7ÂYaið&Ûùî@úê(ÎA™ÈÞ@‹±zTÕ¦¨¤“LíÜ—A¨ê›âq’¨¨|Z%Š/¥Œ[Æwn[å¨4¨jë™±Õk´wß'IÚFÚõ ʯ¸Vk™nÉWS.¿)‰?ÅOx-îÛÉ”ww"Ü5[¿¨}C!CwJ‚¶€<³i06*xh~ 3mÇU–'¡VßÌíȤ—šû;ØÍ‰Œq¿ qX³8J{K“ïþ3¶( ¦ŸŽÛ’´Öä3vÞP<'·Jé*èVë%#W¹ÿÉsò˜ûa\ß°~|'$x™W±êô–<,½ ©Uƒø¢<Ëæç€W@R\r¦¼¸óæ,ÝåCk.â"çœãH•Ú™P‘gÚy7rá[­KœÖ<„rr£­mŠ'€ÔáÈÚE'rã·sfú"ZæHÌ›¡O2¬Y’ko|ùcþÑs²çKk3ž•áÎPS!"ùà\¥y<¥›þ)Ô%Fe³_ר¥Ñ&’€6åe͹»êæ÷LPÔÿʪ}·wŽZ̾“YõäÙ©ÒútÖ¦H;ŒÄøcüȤ]éµ¶%'ˆ_gòËW“:Íóºß¬ï<ͰÚð!.4ǰð»(9ý`)¡vVó;¡tÚNË㫦À¬Ô§™aQ«ÈTÉ•l‘Æ·@_OÞOÔãSGTâ‰ø:›4nÜõíU–ÄÑJƒ]燕—àdIîfûz¬Àí ¸ Ý÷X¯{,noü%¡Ë·w!’˜5C y~öIn UlT9Ë}™qÜiNÉ»µRÇNKùñµ³Èvs“åmm…;í žÁ¦qØë¦èouPüËr—} 1ñ··Ú9ƒ:Õ8ç¹–5ãQðÐŒ'vŸqF -!æ57‡—nÚ¨l§à…÷Ù ïµô³'I¬°š.Ë¢l±w Ö:ì[+é]æ[Ôªó$}»^-³®+¹@)RyßG .dðäĉáÒ&0aš, X:“ªE"xÝÉ@±T’žýßÏãÁ¬æËcØ}vÂ/4ÛüŠƒ½E—O‡FÅæh?ÀØ`¼v] «Z¨R•q´qŒl0²X&µu2„ìŸ~†Jâí¦9räí€'ÉöÇ®üšvaÂ{ñA ,·®0»ªZ;.ÍóŸ‘$ÌÇ]•B.¤?òsµÚ_ß-Aµ)N¯Q(5êp„j¢B#5ë>5TÅøâž¶9Û¹"§@ÒéH’=SQÓ¨,Vã€t•¹º¶BáØÖB¾ìs2v™€€ñ³HPÇêº%9php 7<î“þzY :Ø@byÅ\ÖEÙ½ŽIçq‡•M¤€%–QÃB[Úš½Õ°“éj¶µ¸í„'ÕjË¡>û¨EUûTßT\UÑxñ@yÅURÀNÇò@UÍèó6_èJ:q¨ú5Wé0rñÞ@³ëó(u°erêPûçÙÊ_ÐömM×oÄâ{ØÞJ°Áêªêæ³Hd‹ˆ¨Ý¡°ñgrü!Åš[X:TbµÞêÀwM1‡á6|-L²§Y%hÔž¦#Eæ]ê¤Æér¸—;•ÕžñBD¸Ùú$5±HçNñ‘L¤Vûj³ÙÝ3KVx^ öD2'Q7RÎýÊ›U¦ô§*0ï¬ë·&Ô7²šµ úéìyÁõ}‹M4Õ>í;ʂꂂÉCZöúQË'N) îê sìaÙZÑ1]¥üã‹_P¯ôë–¡Ý~øx¡ç”v™ÉÒÞ}§¨‡Òœ ŒNÿþAÆœåYhcŸ¡¹j&Iyô{+ñ¥ÍyãF’{÷Yù”vÇ›xrÍ ð¨¢Q€-ùéé2¥eʹt.*d¸C·î‘l$BظK„îÖ˜ccÇÓ^..ÉÕ9 Tx2U30å’a8sÛC©Ö=*;8ªnIðO;¹`̈ؠ~> %ÇÒg}ä:kIaU²[™×ÇUÔ!†Åâ¡àcK™rìÃQÉOç;É0'JÑxrIeóCÝ9A‡¸ ]ºÖ7!|s×8 :óç ñ‹ L›[ÖPHp£ïŸ'B™'K¡Ý&:êeœ L¦üLÊã<+¸ÛB7FOFŸ U@§äbLO*'®sÀBæVq$?Ÿ–gš FpŒC„ŽïY†™2)…“ 9jü%~ƒF(ˆ´­MtPLR£¥'¼ø’kÄeÖ €“q†*»c÷ÁÖ$Ýp4D¶¢'jõ<7çdª«éG²ºæ>÷P4ôjÇÅ~2uýZ;g¯—6ÝT ž(;§Ñ裕A'ÕvÚ‰»}ÿI8L›Ô‡²ðsÌ‘MSv_ ‡_ÀÄuÓÐdÄ»ƒÉg¥‡¿|XÖ…¾Ë…-~¨+Ö³ %Bkཎă®À w¶+|uŠ‹:jŽËÈp^B˜}¢Õ<¥ß>qw°Ú«/þ¶Ïˆ +ú°N©zû˜(²ÅäJ‰Ð†u”6ûÞ‡ˆhÖÖéÓ«ßmmWßr™C;YR¼3PÿdV…€<+ ªèè+9@›skfÖ…Qà¬9ãÖl‹`Ì †~­ñ h­2ÁAL–œlr!Ñ„Û5‹`›Ÿñ\ÓÔ`œJ•`Ô!O¬!ÛöêÝ›ÕàÀñå)|ð¸Ôt(:ˆuƒK-ÜLSZK„ë[UkWë¥,ß¾«‰ÁÞT‹Ä­ún’ÚœI$že.Ž_Ÿ˜MÉ/Ëh¢²÷›NÕïüq¾®ù"øÆ´¯œ‹kx¡fÝÑ7t=ʾlR¿ÕI°.ÒÕŽó*¶•÷8€„t»ú-=½\fªœÂ؜ȭK«yI—“;KÿæVló§øÉ"‘<¼õƒå(ôBU bÀg2ÄóÅJœµÌM*2ÂÏÃW­<<è^UlAaƒaÕ ËGðѤÙäUd#™ÅÌ‹“ãED|“§ps.d¤ Äsìè¤èïFo•!õU0üènκ Ç6‚7.F±7_^ïZ,Ì4×»sà „õº*æ³™ ©žWw+¹¶ðþáXi´º]WD¬£(ªˆ[÷"%Õ¦¼RñûZIcRÍzf@’.wTÃL²%›91™Sê—êÝZãJÎ º'0ÿF=Û/Œ;ˆe¥Íñ„£P¢HA`-•¤.£˜ºÈ ¶îÅní›zK$"k幩õe Ðf`cÏé& ÷I[üÚ.}Ô€:@’×Åg·d¾ÃâäUÓ¤u ØnÒmo9¦ë•0Q™ô*ÀNg`>¨õ2ŽZ{h NŒœ]H©¬c¢­z¸ú®Ž²™§)‚-8Ùj17µP£êr¶– á¹ÿ$çÞàW›`¼$¢Ó9ÐÕ¹¿Þ镦Ž|lé^Ç'\`pò°L&å)ê¼ÉÜ™ÔÈo‚æoJX—¶äI´«Çãð «Á”ÚUìIŠÿ•Àó½á¼MÅqžŠ+`uC µbROé ´Ø)F èVRâ©u¼*ÎîëŽIº¾wÏÍ`K®ê³%C—ÍŽ&õ$âµ·vØÈÃ5DÔ㥇ÁÐ0Ð5õVØãu¢¿a ¿E'Z!Þa'DÅ©0¡pÅ^ `xó?™9OိJͼÂèQ8OL+|Öã9¯†¡h†ùwtj^™oò'J¢Ÿå£¦4r½ñÙP0ã=‹ÊЏm¯ò¯R#1¿Ä¤Ê–¿ÑB=K3H_ iÕ¼MP"M¢Ÿ±R²ûjŽ~*]J\¤ÈðE $aWÝxíd\âí(—Å&\¹£ ŸÇ¸éåòÔ5Q§\ÃæÝ+e±p6üsåƒå¥"N&4¯rÊ00Ê`]4uAÉ+iš·Î6âR÷¼ÛJRKæ•ùk¶!õÃÛûfÕ%kU° Åš†1ˆÕUë8£vFÀ8"bÉDÅêRΡJñù‘”eªl¡¸S;‰pÄ"fîÉû(5ßΫ>¤qŠ+¹ÀÜ[ð¢Iç˜Yˆeêµrw[øÌ0o^æí+TÓÓNsª!ç÷ékùKEäO}…=¿A÷ÅGýL×Ôx»"ßßk£UKäö’>÷ÛË Í*  Dë×—€VÞ2~ëꃃI~au43^VòX“‡N¢)ÈÒeó~[_V¦a®úð.ô§>—–º˜×̃ì0.®°^A=ÅÐèUÙi¬‚ úà¤êÍÖÿÌŠS^Õª5L`8öåÅü˜˜ë¯v£Z&ò˜w‹4ÓÂÀÄ­´ëþ8C˜4oõ}¡9›™-›Šë”\2°ÃÏLõíuÿ+OaFòm”9ÕW dhpɱnžªSâÙ2†Ö¬°R»4tBá]ˆe%kFTŽ}oø 2ó° Š1÷=¥(ŒÍJljFUn›7¿œïvÉB­·ú0ƒìˆDV ¹ªLù±2xyceËŸÃ6Æú$‹cŒw0†±qšõ²ÃŽUä*Å©ù†¨CUë ù9‚4ùÒäú©Ç•kjÐËþ®svc5ÿM(õ?Ž] ÷_V¯ÔïîÓ]54ç0Á"sðþµ4»eaò©“Ó53{øõÇWŒÙ‡|p5§¯d†õªÁÿ”©8&qKkºó^[ÿR”߀躸:ÛŒï%ã 9ZŒUbþZ1ø²_\ ­{UÊvœµ]’Œ%Îë9uÀ¡†\¶FU&uUg¬oÆóЬ‰µŸwEl¨áù­5g­,¬âtMNªWVÉÚŠûê_ù}[7êF¬Ê°²Ê²]‰°á3­E°bæ¤ÕÏu=nµðÉïÉŸ!J¾’QT—Ÿ!hÉÔdžPŸdG&åß? SÉÓQ6†­2[¬ÏÓ—..ËÇŠ;óõ-ĆÏ“⨑Áë< µÄ|ì3¹üu˘j¯Ïœ Ð)vëã3OøØÆ‡raª+¿ÝÉ]r°ÇÅËÓ\Y¥ÇçÊ[`ËhXÎÁ@«úíì­3ü‘Ì•ûùÈ™î‹ä7Ë ÍÎÿxuèx‡¨Y+^óûØäç*Ãè@‚C÷‚š±žùÙ.EbG17siDñZ\òÓN¸ôi™jµ »@gMT±oFáu…ŸuNcZaÕP©ÿf.á3Ü×bu;¸ÁÑj/ 8õâÔû:7ã- Õ*ó¹ÓO± ‚ô óƒƒñyÇÙË?àªëË6áe*~¦†Lßp¾7 k“¬Å›FT‹,­V Û.9~„[c…Îø0.Yùéd˜˜ç»ƒ ×Q‹ú¤5Ô£fKÛžYžOÞ¡»€Âð ÅâˆUiåÃã Öû=üðjnS«?Ë/ÙÔB<@¿x»ªßVº@]®Õž¸ëóA‹{׿˦ì?Žúµ™¸d{kŽÙðçã³5ÌÎqcu‚”ü‘ï2iBçÿ 1ìC²svzß(íÓÔú¾òøk?Ú¯8w}¿Âaj wxÏ\”´®IÃÛ†ÃN¶±®§YŸpïYI·ƒŽ|ÛÁz~X‘smƒö]ë“ Ž¨TþgŒ*ÆOgÞ÷¢™q›çK5‡n»æŸroÓÛwÖLò{³~z:Ä.ìžzúËïJ\ž †ÙÅ]Coëzú—,xÏM. !Á#*œJc0ð#¹ûñP¿p£N˜°Z1äeøC ‘ÚøÏíƒb[î\øüñu¼Àµ~·†ÅUÛþ Aí‚1ï¢'ËÀ¶uU,\ƒ+*áÁˆ™øjáÚJlÄ«»˜_Q¿ÃPØå ƒ*ÉÈö=‹$xª9ÝÂŒbd=ÓÝ63²$äµ_3²Åü¡¢ú:>‡í`âÏöâp¢' uÙù{Ápø[ó;'B.¼ð}î`¥/¹Ð›¯zš¾;/áð£mü¸„K«Ç>ý¾ÃœóSŸ|­öž„zÆ'D¢¦ 9X TÌw˜œê„ôˆN^w\òoš)‹pþƒXÞjë-«£?¤ÃŸêPWªYØcÌòi.{·0¸‚à ~à˜sl/N}?¢®ïÛâ%Óv{ë/4z3ÙŽ…K#3ÏJp÷?¦ÉÑ?G2ü@ÐäÁßÅžEó½ÐZ­ú/fâ~ßóE>Úþ’'÷~ÿù‰>¿ž ¤‡e‡î0H—ŸÜè¥?_n`eÆ\ö-îíŸÐWO[Èõg÷¹6òu©CMª›V¯Ü}èG“µ«.SÂÇv|†Ïµò+>=û±ÞðÑ[›úrç,/\4¨ôDvkâû b_qìžæÌË?€¸§„ 6KxÝ~Öîc¾ìò ÌWa£L?¿‚OXÏ›$‘Ã)ä|M@'üÀù·ùóOûŒÒ]~‡Bý‰ØårçMð+¾¥©/1Y _„Í.c>óÑ/B¡¾ä0`¡\^uSý}F[©¼_=®’?zw¨ušƒ|Ý¿á/,çk¾aÔŽ‘eMìcq°©­.f‚þð ¿ëý†dÓ?¸×À…ejŽå‰Ó¨åŠè_¦L±<÷îä :½ë]Ô|uæ—aþVyX?”³ä*óÛíê:kØUeeWóbj .«Bô"õO™0f—ô8Ÿ9|hquÍš óÈ&v9 ©©c•¬u×b ?N#d9´ËÏçÚÌkÙ_"agÿ¿ù»üCx¦½¢¢z¼Ä¢CNkõ䦻V¿€¾Üýî.òÃP£ÿb/ùôÞYœÃŸ¦g†²üˆ¿Ä@XO¡§`îZ'ïQ7ÿwú%mÀš5¬«pþO×ëéФÿ½ÜrùÏMäÿ¿€m­ôxŒ­…ƺnDÇl~uEulÿ2GÄeQ“qÃÐ~Ä/müŸc3+.…ÿVƒqúžõ›:(Ñ”»óGôq³ê ¾Sš\.tAç˜{Ÿm;>sÔâÂù¿èß?Qçªèî'µ¨m~ÍLâ‘»%&N¿¸Yÿıo—.ý'ºF0­„ÿÁNPet÷wÓÔ»JÕŸÇê5õ'uúDrV——•°¿Ý¯`3µÝ»ÏØÐ™O_î‹,„aÓÁÔ›mÿþë=b1?Œwã|¾MߨýÏ…àëºÝùo¿—xïäÁjÏ]²ñ:=ž–|ÅDìo§§—q¤ku«Àþÿi üïÂ2ú3½ëpŽn|Hü~[9Ó/¼ýÿQïsÔ4JˆÜ¸¯_µ[nz-Ý ,'Ç û)žxþ]‘¼Ðv3R2Zx‹&§DÜiãqòZGÛRгVINr`d+tŠÖ=ÓÁÊ$]8dî‰Ñ9!$; <Ëê‹!„Œ“° á¤ô,÷_A_¦é}‘„“äú&žbUd´éÝ r"ÂZ‚¬,åd>ºÿMú´~1þó£ æ&˘ÖíkºØ®Z«”7†Y’o¼{$³‚)qÑ4…b.¢ÁÆ™Gœ˜¨y…†w¯¬‰&ù%ÂK¸xÍvÒËgÖœ’ü-Ù…Tç^þ4Åd¼t8ð)…8”å|Žô:<^uðãB~ŠŠ@/R¸{!ŸõGº‰Xœœi?L5ÚOicÊ´îÌ"”B,‡ZÊ)zKÁÏ$ç”KµßGö«MªC^aA^‘TnØ]÷J&>gÌ’ÜŽ`Á„|.æÍC–'9îW=$×*W/ñ(iU¹æ,ÄÇú&XsHSrÒLâ×½ŽBpTDGVù@6æ W?òª‡‚RŠË ×Uh›”ü˘‹óÏ‚!ƒEFæáÙ"çÊùãÄ \ÑS&þw‚¡™Rƒ»ÎÿÃ('vÐÎb `Ô¾vni±j(èÐe&˜&ÞUbŒ¬ZrÃ\[Ôm>`¥¦¨ÉØ®˜u&âwÏ·¤C´0îUå‡\–‹#KQÁ£ªý…9Ý(“g3i™Í¦¶2f\R¸Rúb ù‚`HªeP‚6K`4™ó´hÎú|‰«Ù2DCbß×HBÉãöÕØ­º Ö{x‡”OKÐ㵨’²TkI5ë´À•·=áÌOõ˜&ÈËÂÆ¨Po$ŸÁÉÅ›“iÑ ¥¶·.𺷄wsL€ëă(ŒÍ¡}uRÀ–h GnV:cï»)6[ÿ#ÈÒ2[‘CÌ6?úŽÓXdì[ô¶6qD59™E²ºEòªJŸEû«nßܱ(’^±§uQ@«úê#,Ó» žò¢3÷Éû„Ýv•ùyî–T­éí~öQt}hƒÉøX‘îVL æT½¬ûÝl”Eën@³kÓtòz‹ÿêÜ!§­LßrÍY ^Žª«2ýCô&7ò’èŠ 6\8Ø,j.;ý´RNRTŽ*‘¶—®½d®/TŠ<£ŠibÏ…¤­~='á¶yÌDÔä…NŒ˜U¹ YhJc­.¦'¤&9¶Ðñö¬Ùí¤ßþÚ‘o{«~C ú*ÈJ~]i•õ½ø1v;;~êW6ìX§…~bÓ®r<ƒV¢¿•ŸŠÑÜ®Fx¥aˆ`ö— Údí\ÇhÉ”HY¡IRÿœ:<>ÖÅà4eÌ(RK(ïLv0Šˆm !Á®|~ÂïV×ÛxÀ'3Ì y:ð+¬Þg-_’ ÌÜËÉEá¡›T£«ÚèÉhËÜcTm€–ÅÔ®Š 5Rš’1ráÇ™²òô#ç2åÕþž¬·ät;‡ÒÌy”˜×Sû¯3½<ïóA9µLŸ§nÉ’€†–À@Œ2 Ÿ¤·IÓså€ÎD¸iŒ›F1Èí—¯”‹TÁÁiÊŒŸ­;Â%\+ÞC½üÍ›O. ‡?)ÊE!&­‡.Ý`}GÆí.€X{¦ëÜø 8!ÀxîAàèщ'7cºà4ÿâ.£+ch•"dÀd¶r¯WSe…œ=NOâaxÏiWäÀ÷³Î…dZ©ž©Rù9³ÜkJFBJ(SÜþœH6ôîÙ›$çA^윷`¥.Œy%A'à‰Zºá—ôÙˈßÿ ä‡ '•c4…Lu%–¯'ž=wM}N't?¸~@Ì̼2a:»Ç3£¸àEÑXd3ä…÷.›`Zä íX=Ô6tnwjÜ:cŸÖL3"»Á ©ý.ó]2mRÞµ:)øñL°V¾î¶ܔ㜀6˜[u?ÓJúgIB<ÌÛß·>ž|Vº9üµÄ,ØÌFø ›··âæï¯P¼PHOl};ïvxóž€%Ý&>ŽY¸¤Âò4¨KBX{wØ5 ©"…™èo§_ƒdÿ}gàs"K'L¯mìKùª…‰ÁéÁ¥SG'‹Ãæòl(¦:PÝä¬SGiP\ž»½Ðíæ2oó«Ì|6K[&"x°]¨JŒ1ˆVc„,Ò^V“œJ.ìbòI‰©È7‰È”ø÷ÖÔôžÎÈ­¯é‚%)arŠ“„LÏpîÀ5ò‹rØÈ¸Y åóAø£˜ô{`~ ]™;¶ŸåŒèL{rÀ& u¸îÔüÆÅ§‘0iá©Õd”74YN‰¤Ô¿¸žµåÛòq–Ý(eÇB±ýø¦æ¢L+ ãÖèFž*ždXÛ+Ê/:?ëÏ \Dò/GÈ’ zM9Dô픃²KEP?|BC¼u\Ý’NÒNs†pES"‚øºÜú-gœ.6+S‰/Æq†'¸$¿wÃI¥”.qojÚyÒÓRqª¬3f¬Ð|5M Y (ìm/¡žãˆ6+wyGáà¶Îò6§B2°3°ÅwÌåûÌÊž\Dòœ´¥þz|Ý{]2KŒíÂôZsŠ<ô:ö9 Ä‘®]ÍP­XS†"óç¤éùyIÜÊ<3”,ä’5û´Ä¸}í'\*}˜òÿ ²*ÃMHž½0=A ÓZ˜Î)^íÎur°¤Óg“¬D"FL)¶_WBŠðK8”{!@4«½}†œ-áç²hPœæú„%,Tzü{“ÔøÈmFHl¶$ǃtrÌJ´C€=XžOC—[[ôÍt™vœˆ/ø&·¸éP÷aAiË Ùʽ­i$Ü¥™ jÒ#qÀ—nûøqŒâæ¤ÊYªÏ9Äf”å=ݼÞ@Ÿ(xÍû¬m¹ ±è‚…1‹z”’ž)âÉe÷äîÜ{´&ú½œÈ+üî1»üw>òÈ+ÐÁlI”ȃyÒŸ÷oÎgï íôôI ™2Öbnà̲´Ø§W=zBWèßZ‰ÔúŒzI³xL6Q ¯þ5ø¢35SwНiÃiƒ3™Ìsñ¡Òø¡Çþy¿¿ÞšKxæU7ú°P1ülȤ™çdΫ˜ïrÏla’cóÝÝ–L©RÈÙ PÙÙŽ˜M.'÷X®8‰&§´C'‘äú!¡œìÖ“ÏÔÍïfÅÂp¤¼¯CãLã|r‹„U´œPI¹^½0ذ–Ò—Ì®ÜÂÒä&,¤Yu­°•á%tßãØ‚q7„˜Œ¶?î—À³B«l¥“JÎP¿)±Zã™\©n’þùP•=ò°"ml¯àpýEìd%ë' Õª!ÝH<²m¸j8)Ð9–{Cæ„%)¤p‹J7&ÕBY“î6Mr3·…–’$žkš'€ÐNX•”»vˆK,¶uŸh½üîü<:xhÕ]ö¾M1 ×Üê|â£Q VN›­6ÿ;ižÈ«{†ho †hÅ€sšød6ð 4¾õ³ÙðWgû‘nÌéÛ[Q躼ßi9N.Y‚óÓ˜²Ð–XÓ§F‡¤·u2òæˆé©<ÙÓѰ5%Œšõ FXÇBM7¶Tö¦µ³šQÏh9“xFø†pœå"÷IÉC•@釫Àf雿~ Hòó;|×td+þ}|1჎ä´Ug {§‡¶GÞ Å7ƒE¤ÝÞ  íåYÊ‰Ž€Ð©éºTN¦ˆCAÎ¥^™Uöª—¿ÇÃÕ½NšÎŠ ŸµÚ-"NUK¥‡‰½YdŒEK‰Ú3‰.cù¥ÀÏÉÕfßÐÖ‹‰±ãžpk;ÀtîÀÖ“YDZ§€§Ñ¤ÚNÞ»ÃqÑ<ÑÇ'D4Á X”T ÍK©”ñÖÁá»>÷î‘MP¹|]/l'pƒäyòXßAüŒž©>]ºbF: ž¾g&)&».çOðÏÆÐLÓQ³Lh´ÆV5â8Ï…¢¿ÚîpšDyË, ÓQ®ô-Ö¿ÑR¦vŠcÿ,²Þ· ­úY—)†ª‘†Jéý°hKÇ©¬‰éÖpuÁ<cŠ›q—w´µÈ¥x74Šw‹vI´ËÊâC®ß_.sHÒÒ=G‘>.¾Ä›ôé`<Ÿ)ˆ<}yJãfÿ.| m,ú dI»¨˜"oŒLì”v‘( <ÊTˆ2?ìÒ!¤PîÍ,¯îc÷T*þ –3`8ÜÝŸ\U0Úh›¨F¾´@0ïä3¿Ð› “ߢô¿Û$sêôÞ\3‡<à«ê1òÕ Þ¬þï#ZûýT£ð˜CÒ-L±Ô0#` —i”6„°yt´3m(7z çp½zˆàA)ï­^ù‡vq¸:ó0+¦.¼HìF¹Â" ÿ ×Oþ[ƒIFö—˜ÉÜž: ol^#ebßo+â{7½R¸¢ " É{—žôÈ„” ðÉb¢Ô0A† V>1 áÉ_ ± ´˜_‚…_I‰Ïú„±h ã5ŸÀ6r_Weâ½±–_‹·5—§Á 7Õê»ïÎùxö*Gý¯Î¡3½¾ ª§oúû›C¯Óú†vûW×òsš@3¤¾ý³a«ò§Ðøÿ×j²–¼ÉhmͨD"¼·>ë¦~á¿âLÉQI}‚ \sõò)Ddø7‚ÔâÛÎîgl`‹ë'Sχú6¨7çÿ7Cû΃8ñ?ë"MK˜=ÏЇã3ï»/³uRýĆéð›ÃNþð.bN×LUוiJ½ô¿`Ô‡lG½f†¸~‡¡.l;QŸÛÄÿG>§|‡°û:X²ßÓÌô’ÃzÇÂ\.¡›”|¯1ð8µŸâ>ët;ýg¦ é$ƒä’Ó/AMuîßøìïk_¾×³t±8ÄSŸ˜(pêQ§ú"ع«Íh«GõMhV7Ó±U?0y©ö>ñã¡®côé×’ç—ëö.ý4çnÏòþ*qã/Š{Í×(‚_ï¨Ûp=6þÅ?)`õLiDaö]ôÎSÝöØ2!T“jç^võI S _7¢VírõR`Íe®z•ý1ªS áßÔïºõ &7NÏO‹eFÕ¥²·Ñz®¯œŸ8Œ¬h“ á€r? ÙáU}e•Óã…›ì^V¼í]úž‹ ?´žß•8©E-·Ù„®B†3ê\?ŒS8’Xÿûì·çòs¯âë?Ѝتojï>¯ª²ªßwþ ú…—,ë?©ÅBÔ+Mïwšæ«Lý^`Éñ0Ý¿»ÝC_ %€øé«7/WC{Љi¿Š,Vq՞뀼‰®÷òÛ8êq_+uÁä_Ì~çÿCj ÷.ÿ:ÍÈ·'þ÷<*¿ T0|£Ôaü<ùºOXþ}&ÐGaê@ŸÞ-*ÀÍåόѸ¶Ù)‡åî˳íÊ…Ãùn{~ßFjÌœÓèôÏkœÍÓ^º§©BÇWðÙåÁÆVôG¿D/œ]„BÚ|›¸WßTÎúN(À7£¬~TA·äÃ’þš‘p$ÇMºs’Þé¶Ê/ëÐÒ겡t)l’udVVU(ô²¯…ª-Ì‹äú8•_SÆÂ£B 3økd¹õ½ˆù ï÷‡ÔÇ·’Ü’tÿn_%ñoþ~h¸õ9·È÷aз¥4§\îÒwf<£S1b÷·(ÿ¸þqj *æz®JÌKR—ôoªñ%•i ü*«åõÎìªg~dGR3~ZÎêèjÂHį’â~U™¢{÷нçÌúðé« 0½§@ëû—´VTÕZr=LS.yþþ`s¨1ü‡k·¾Ç¯þ3NT½µG­RÊÚßå¥å)XDöFº¿XŸ‰1{?¥.<ú¸åÇ^ÜO)™õ'»ýô]ìÏnâåü=COÙùÏkô?EÿZø“beüy‚Ë¿Ãt¼ü_gFÉ}a¢gÜöä‚°úI/ÚÉ'ÕûÞ—_öK÷>üX‘üôóG¦yÿ!=eeäúÿz‰>öK£ýà’âÛmΨ³L“õç‹ö´ºtš°c?2€¢)i„á5ëLÏót5C±þ¾…б7…ú”$<ž“õ›¹Ö¯Äîß·¹Ä~JÁ§ºØôŒ—)Y­ý)ñZ‘Á%ø]d \~—åÂ|QùªÇ{ɃÉJûd»À|*‡SxýŸäP•)³}ú.¦ÎÍ8¦7¹Êü/ù”î#Ë!ë/ÓçTu×éÖÍO½:CاŒ_ÖïÕ`]…5—Í$Ö‘€ƒ‘ï7Npû¶9ð§q=DVý•`SžØxÔÁê™*‡ú­óá­Äh?Ïiþþ»Vû’¬¡ý•§4³‰ú•¹Á`Ý~ߌú–p»?ÐyWzOè{w”Ÿƒä‹0^khT÷þçw“ÊêÁ<tÜ­îîe]ݯ«Ö.È~Ž”‰û[®ÊÙ?"ìÄ“ùAv[oi„”g`¤äl‘y.0ß&øcŽÁõ·zj%*“I>ÏÄûà›ò±3yÝ«Ž¾ í©Ìv¥Oðú™KÖ~Ý5pŠO°þÔ.)aŠþ£ƒ˜êl޹ªîë~4º_üjÂ1ª!|ù&ß]%¢éüßþâ€ðùÅ+ÓÌLú•uVb̲ò6íÎÿäw”ø›Y­Ota?Ûþ=·ðK[ùª‰{UM‚þS(•$4í%ªÍ1õY\«ìغ»×|ú¯¢Ëzëý6]k‰èÞF¬æ×`‘ñõcÍ>ÉD‰÷cQ» 4꿸vôñðñ¥¸ñeÿ»÷#pÀ¿á.xrC£  Ã¾Ë(ŠŸÄ÷G_÷O¡4_J ~¦÷éfΨ~Wuë;tzöûµœ8ëaºvrÏ$ˆèùÊ^k-:èÈAÙ{7dZ7‹%ýUš þÁœüP;V›ý÷)ƒ5Óý7мËÄÇŸùûÁ€¢'ÂæºwüíGq©ýc€Ó¿Þñ_ Vq½®|Þù âwê%_+ú´#¿ å×|gÇÉiuéw·d#\È ÞúèSCàòª‰>íÙ€¼)#•NôM=#§÷GÓà&оª2RhÙh··ŽœØ“‚ w$ÉBÈGU–£4@k‹B{,>'Ÿ•Lt†ž«Iå^n]ˆQKÈB6*4ú[töˆÈé2¨H³„%Ç$Z30h1é±é¯òlCÅû@ÚgÐ+œ ¬øN ¤Ðkñ¶…ø–´¸IH·}§-ö•"š¡ ñõ¯¹Ôß+¿XϹøP·• ØõAbÏ>4ê šQ\`H9›†Áš°?Á·ô%ò‡Þ>Ж?èqB ZAêèå+zåºyòßòIlíR \HG= uï©7É×í’nJ„ªË•EaÀg/øV[Å2²œ©A 4”Žï³à¦¬3^|A'ȽÒ ¾%%}'ë¹½¢qæõÒ£sõTò›*9Æ_+c'¤Â«Šãuá'‹qø#nfË=ÜÍ?¦Î!OÒg6€¼sÔ#£6©:ጸ.%Ãt_{è‡ïx^¸p–±¢)(zÛ (·ynð½Rê6%þ„¨&ìiƒgçHÙC>E»És8=€ç@ŸÐœW¤³Ä¾‘“AèëlŸ+½‰îP‘XxO7ß,h*õ€;…ªÂÙ ‚3øÒ|öàÓ¡ž5ÞB*6õ¬×­é𞊭¥IONlR¹“YÔ22Ý;wcL[×à5M7UÁ,z¨µ[ÀónsÿÞvvŸ ™áÕàw©áY ¯{mÞtV„·í=IPµK®®ì¶qjºI¥Éó˜~6ž»«ŒlÚ qª!wΨð¢uÙˆëcÿN§âk1ø¾m„TµR‘©RãWKÙ¼ÖýûÑnU$W€QÍ7Д5s¿S¥¸9¥ùµ£vZÔ*èŠw–‚uÏyoøA™ªm[=.À ÓÞ¹ú §ÊÏ7ûÜ‹g)t¶Ò‚OîálöKÈÀo‹—t2ü¢’3èµËíÆíðºªfиPýîÒ+—Õà ys“§ÄûOF‡@§@À¹›Z%v?´ç)p¼1„³ü–ˆ?•×$&*DíÖ¤¼EzEzpU²¾”žf¸©«½ŠÝ0%‰©xʦ ª§û×W݈V½:û z¼ÕgˆjÙ–sPnôÌù¬¥èÕø†#¬‚(­¸‰ê¾n£q‰hèÈ)| ëx¤\7‚ÍéïI2ݸþ (E@Èøƒ²§›`¯·}Ï5ê¸')ÉŠÂI·â>Kµ*F0™*ðóÞZi=i õ¹CSv_êE>)²ÔŒWÄÈ—YÙ†ü¢˜ßkš´ `ÄOKßüë§ö,U’Ð õX:OÑ.s8iN“ÔSKË"S_›Ÿ8fÓ|ÓG²b%R*tNcq\x ð@e#çrøHäÔc„ß™ŠÞ©ì]¼%§kWÙ.W ?51#+Ô;M¯é‰7–FPáý uf]GuG-!f¬R‰(†FàJ•ãódqëK ½t̉–µ¢s¢ƒ¸É ëxÍöÖH—áì«<;Î-€+”RÑ&tG÷x‚lb­’lßú”ä'èiò¶²r ½.€ùvæ»ûÂóŽ á8ÁïÔo[¢äÇ<ø®˜/¶äüM´¥Ž“¡Ç|p/;c5wiä|—m–☘2~p.i ~-‡~Û2ý×ÌJÏ®8kœ´gƒS Á1­hVø -•?·zïMÞÚ¥ž7"‰¡aÆ;ÎhêÊp9²$›%÷P*òJqŒvò{‰šÏ‘J5‡ Ý9ééI§Kœ hÔº*9ïIæ á[ðŽsàƒÔJä9ÓölÚçš$žŸás?Ðz^[Ò*Pη\Ý3en ™4}K7L]‚ß=éqSOºÙ´`±“uHðå/]™ Í#×L|Ò˦}á:¡:`*[Æl˜ÝÇ-g6ÒLÒ…SØá8C:»é il•œ¢=H•t”¶¯Ù¤Ô·ÒÓ×`8@úüÔK×LW¥ØvÒkêZzfÚ>åå“4kK³æ~TŠBÊöÐ4˜XAñ½·6#á`寉&Œ=“ã{ ˆÇt»µˆií¾óçZ†ÑúxEsBÝ,ªÕè²ü³ú¤x˜.4ÒF|XégÉ %U?ëi†LBæÄWþªuÛ›Qg˜ôˆ>úü†¼˜ñ¹£ì\1þÜ…f4åmú8àÑbÏ`Sœ3DÝ —g|þ<Œ!IåËÄ”ž&Åßopk„ë1C¿•‡ÂƒÞ½\ÖÑo/c-„4½Õ}>ÞÆ Þ“*ë»t[ÔÓv ëV%=V´”:‰”ÇÌ/7‚óö¬þçò{ ®ÖMS£¤b7ë«ÌðÓW`àG2ã‘Y¦ü\ø ±ûiíì\—zL„Ì„4›ÈI‰•†\Á˜§!9¨Òx°?!5›v‚vu”ƒß,¦èœ¶»ù0xm†é8¶†4sw0ÝùüÌ Q@U¹ÓÜ'¡Ç9Š˜ ±h3»±-¯O9\³‰É/;9ç•zU Æïè~T³¤xBÖt~úr•÷ähˆ»=ÒHA5)0‹$™xfpMàºÔæ»’>aÈ¹Äø;³%÷*’m›eÉUVæ»* ט¨¾ñz;#wt¨°ŒªK²hSš¤ë#;®·œÇ¥ôÌÒ$q„w/B=Œµ" {†50KI˜Ç³ä%xðA¯9¾{\f¦}ÿâ a?kšKüN*p縕@#s¸ZøBÿ1zC"fÎý„S'õXèöúowÞ§v„}W(Ž(+{"¿øS1‚l´æ’u.¡ÿQV ádEÖÜ1­›JŽÚfb\Ò%¢­¼ˆÊ~…Ü-Ïc2ЭڈŒ5 MaNRWq•EÖVØsSW²¾}øˆÚ´ûx ,´†§tJ¦ë·SÔÍ–,ÏÑ[Û@0ÀÖœP¯vSWQI<ð⟴8ùŽ]@TùakÜ¡mQ°Jô´"Ù±Î~uÜ\µRûÜ#ü^}®… #Ñ&éœâi•ÅÍ=,%Ú0`ã®ÏB®Âdµ7/¡‡§ÿs/èuék(Y6‹2lz†}ì–)Š8ºÓå!ïŽqj¤Z™¼fÀmüûâ,Öì+æec&ˆ€m?4>t„G):Ïí-…±™·£é°²¡yðZ‘ÿ³·2qi Ù""›"0îêÉx¾|ØeÞ_¶š¿®ÖÚÞ°„h×ík³jAÆ úÈEÛuØ€ =•øáH̼¶V"„±­<õR2džžC2\1øW1Wle”Bæµ~ôN¹šWçÝxõ±í¸òkÖÞHíìF‡t'U×ÈÕ F¶£ÎŒì×fÒZê­Ye$®–S˜¯rŸÜ¹Jì· dñ÷bú¬;§zA {³ÁØŒÃE¢ó¤ï3uBpêä·©Füvä½Å0¡“¢þuV_ªàžæôåøô]»$…”8†“7!ë˜ÕfŠÌæqŽˆ:iò¾j‡óƒ6áê–ÜJl;b°úÛzON\…_åÍë¸"‘<¬é›ÒëÔí˜EÓðNÝ/a”;mòvÄù`IÈMžá²‘ Å´›ZDDdŸ"lÚ4a}¶ÆìÀyHA„ÓÒlK’‰ìAºŠ¤½fÔìÚ$ºwMIežEk'½²aÍ(3LºᓾôáÀ5úö,wb-®ø½,*p§1Ïß‹­få°<Ùìaf2À54Á4.šÆ",íÛTãº[†PÑN¦¥‰"9TŸ¹e¯M½Ý0n[“ëkßÖ)‹}—DK­)ÖW5ã©*ö·ìôRꔦ#­ÉÕG!8-ÌK!–sô÷%±?*ÇþðX}öï·©#ƒv©ëWXs›¯_µü;S÷Üú×XãqùX—›ÌÐuò“Ä‘\oút)Äôø67N…—èÚèЭÒN¯5™NïhÀ¬þ€PÈàR6m˘ªÌ8:kû}!%£©Æio–»Î´Y¢(°-'1ÜÚR )ã"Llîéd¹̦á¡=‘ÎûÊã̸ÌmЬ—ÓcF+TÀ¢;V¨›œ¡“’øÖ\¿ ~1S™N0WÇ ÏWƒ{t¿'Ȉèhã ZKؼzøgVé„Eòù¨|!éýÃ;Žzõô›ÉÉ9dæ÷úé5±ßRw9Þç\4ßPGJkƒ&x·89ø"©¸ý·÷|q'ï‡j­^mS"ÆœQµª·ÿwhˆŽIÅ2g’s¹5yD¾¶t踊jL;c5ûõ2Ó”‰1чÕÌCDæ% „2îþ–ž`²6l~îÐå{hÖwÞ§§pá½¢4 ¹5’`Ì׸Å<ÁîH 3¥‹R¦;Mž[mó? ¡¸ÔM´6®(ÍËÒzЯ®r ˆ¬T9|bܺBu„øÉj&?d±Rqf™Š”ä©e`)¡ÎWò‰©‘‹²0²<«›Ìã›iZŸƒNb#C¤‡ôù–&SÞj {q(‰V„†& ¦cÐV¤=†óGʸ7eÖ>‘ÁÞÚåì^’$œÒœS'2xé{”¶Ûœõ6‹ÚsAå½t6-;Wi#RºM!Š(Qka­ñ}Z™˜Fƒ¶’2ÂTZ^Ë#ÏÀ°Â3Æ"¶ Qºm> ©³¦\m…“*‹ø<ïOzþ ºêT”ûd ‰Ë<ö‚Ü2TÿÅR0(÷m{½ªéLAíï ãÐã".Ìן8×Á)Ë2–ìÂÍ»àÌQìºlôtréˆÆ6 ýFõÌÈj8îƒgÚÅŽÛJI›Öiî]öÕù:1ÇA?ÍÍl¤Àß"Í ¸¦ûêe„ €’UôE܈„RÜ>ŒOß³¦Õ Еô·Â+Ùó<9 iò‚ŒõÓÏ·0 XÄÑøFæKŸ9ð²Xié%¶cnîϰXXàTF™÷€e#“ø¶ï€æ)JŽÉŽ ã¦ŸŒÿÌëzÀ­éñKÐ-›h8öÅ­ŽGZ‰[§ß*b ³çdÄOçÍf©k©p¸«~úO„ö´:+!I|x¸øAl²UŠÒÞ¡i—“ ]Št’‹‡¦šÏÿŸŽƒš®¡™"“ôðt"fÒuê<|çäòÁ‹õ)þ¶Gi,û¶fŽ‘±ô`ç±çnòK àåo=JÁî÷ßgcŽ —±Y''o(`Ñ£i9/ÁшÂh‘ÒçvsÙóP 7=y~ >6 Ü-heÑ%µëšïÎË€—dcÎéuåòSËPÎí¢àm½FtA?†göj.=¥PÎ HÝÕLÂs•ókK[õ ~Ô=A‹L|X,v**›•@lNÌWá:³_Ác߀ôŸÅSFŠAF³äód•WÅ7;(š.uK[ì<‰)1>”M+Þx£í»¥´¼¼¤÷Î7ংräл –°ŸÇ2¡ÑÂúòï™ØÜ¸ªST÷©£1ZqdiE€•Å‚ëcNðÆca¬H?ŒEУޜˆ ƒ“ oMæÖ6’ý„µqšÐàèrÊ)0çhJ ”] cXuL=«†[IÆ]@éS£_µÈ!e ZšÂ;ÄÃÁx‹êŒH×=i'Ço¬óÈÜkV•{ßÈLó9%?‹?²†èH¼bÝß™œ..ÊC4 ìÕ>ôpl.s›œÅX&I(äRôKƒ›\rnXÒTýØí·¿‰Ý[,·òâœLtOão†x2Î6/ ÍÞæ*&¸ËK,-jxæhŸhræ—¬Ã/ÌuI®KÇCT@3ýǚ܊W²-¤Màå´¾]©¹ w›^¢Ü 3w¦ãñ»uèÜ‚4¯Ä= …Òg—äÏè 5›qæj3V×(Å„ä¾j]rÁÏ2Íp±1½ã*÷§ÜlmúöKCÔø:n'´d 倡õ,aÛå…mª"9¥ø"½¯H­¹iÊ*5Ç’gH`Òþ Ö!ó+."œ/Ý›Fˆ¾Çûq »@iÒcr;·À®‹i±ñ™/—êÕI'˜JN†w7É(’éïeýNÄKèMDéN2Y¼`±Ëð¹p꯻ŠÙ2{?žŒg¢bó¼)¡UÏA ùpp=`» ­0‡÷²¯wŸ>êš™·Ú z€…N.^½Ö!~ºõóc¾8†û‡ûçMý½X°í°ÓjQ½®>abgÿ†ÓçâÔxÏä÷µ:áðŠ1¬Ëݺ¬ê ŸÄÖ4Þ¨O»¸fÞ>nõIùag–ÁÝUCaW•Î{Ͼʾk“K1âîêæ­Ï,NOfv—nñÿÚY{Š ÃçÛNJþXȺ?dš§Ys=DÖ1ÁUdO†äz¶ O° aA—ÅîºÀ©©™O +©~ØYO<3©úe.”zƒÌ¦¢G$ð“Ö™ì]zPT²þ±bëy—¾ë_û޾À°‘_ã^½0¬•À4¨Ú/üt" ?O]­ÈýH3g}è$ }g\.I5£ï«œ]éÝÖÆÅð=ë!vpjjǪ/ØçÓ!¿|Iöœï×ê[½Ú¢ê}·ñ>躓}R'œ2ÇÏ}òqìê¼™­2¹2üÒß cý/A?Éå(¢6Ô²w½þÕðžSþôñÄ¿ÌB¦Ÿ–ð¼—×úå%_ÀÇl/Ûý¨yfêº<ª3\ÿ]“ ÕÀö·S j7‹db}«ê„÷¤Æ¸k9C¯SÑÞïM~aD}îd‡4³²AßÈþ7,ëGz$çºÄpá2vrÑwaÙSVUÉbD÷jº«óL!ñ÷QÃê³ eŠeßU¦±K™éý‡±Ë\ =ýŽ¢&õ@chNÚÅå5ÝTO8Ùq95âÓ1¯-;}gíõ}§è:|"úº\z/:|]½Tgƒ*^ùú1åòzrE ¾£VÔZßr—5^ÕJöψUøÎ|\Äõõp£ª×!«| Ú ·Ä»÷§¾®4¹&ÞS¸bÜ¿5ÏIó­.Ǘػ꣄ÍÏõc¹}Ʀp2 ›§+*²' P·!ÊTÕî]ë—h¥i¹r|ñ°§pßÁŠÕñ¾^y»M†½¨Ë“áõ÷•ÉKfÞêÆ¯—ÃÃ6U±iÁ”‹o£0^õrÀµPªpZ§Û~È· ùû¨ZæÚǬ­,ñž½áü_g]SÖ)èu+—à1º/@.ÊýL6wž5ǨûÀŽH'×뫬D­òg#:ÞK¿ªÞ6ó?PøgÂ.–O ë K'FÕTo˘ö”ïrqíi~—lèfºŸ}^,­€¹üší‰ùhùr›¹ëË¢ÐR5OÀ‘ }¯JH¬Y'Õì=¯È2&zßò»~CM^ œË|èÖoå*3W¿»aC@·ÔðôìMI†05ºüUw2õó³bŸZ™õ ‰jßþé9»úzü{òe†èý<‰_öåQ}¯; ñ†ßÿ”Í}?eteÈ…?÷*’eî­FWŸC‚û+pâõuÓ¤ ßL‡ÓÐIÖg FùÀÔ,÷Óh@¼æršíik²ý_ÞÏò=#gðZÖî“v>Ä_’‚M@ù«²ü‹¨uòìiò?×p¦×OÚz,‘ãcOk[ÜVa0°¸¼…ñ^…ûÆS£Ë¢NçiZu¾¶;l;ñ>C>vï᤯îX£hT}·õ »Õ˜ìZ•¯¢¶ü F'„T¤™òœŠÃã2Ïûdô­S~Æ8³×‹ ÞÇ Ï-œm7?ªû,¦ü¨>鶴V™ü‰ bâ2ÿUT^E1ê/w®¨ÌÈ&È¡©30oZŸpŒ‡E5Ý‘{ñ¡5Üœñ?Ë…ò¹ù˜D™ÛdðÕç—겺Äz´×Ù¨­†z¸Ê®åfæ¹ÀØß™¿˜É mUöÈí¡¨úƒuú_Éê9ûÇoöyëã*lÒä…Mõ}NDmÀ ³+”v?tPÀúUzÛã4 Âÿ‹øfƒæKÒ Ÿ…ÌÔ»¾FK´/W¸îÈ¢n6Õ¢ì:íª_€ÿÏ´WQÞêÔÁÓÌ ÜVgö‹‘À$ëÇöÁGÜë)Ø| zàÇã¿ñEßùÜç?¢;Lâx5¯ÆHÝoC 7šáh´ S¥¾¦{¢d]!U­[˜$}T÷/˜òû`ú²åÏñG3AÕ‘œ´w;Ó«Z[bè%+EÇÇÐð%ãŒí`þEqhÅý!܉Ô!ÝgKzÜ#.äY^*Ï+–¥ó™Pl÷ô) ÿuÖ²KxÒ"—L íÛ5jÔ?kaû?¢\„©GÔŒþ×1OpùÖïùÛ?zE°ž“_,Ö×í` /×wwå¶gxï+.2:«Èµõ£þ¿û Åä.¡ÿŽ(‰âzÒä›ÖK]iT§¯/o*î¾ßëýœuÛŽkÇ̘ñÅÝ_†ÓW«GðÏ?Î<á&Ä•*øÈ|Äᇫ»W|µ×BIÜän@Œýgù§Êè V+v=*tY]*>“6ŸcŽìe€½dÎ=¸ô/\ž§9®ú˜ãëï©—¼Až’·[æðÅ¢„úÅ…WÅÏtÕôëlÙ”•T±ïV$«/Ǥp÷¤oöStÆHþav¯ú@{xÙÀ_ßõýH~÷º|ˆÏÐfNu›"ϰAHÂïáçCBïxÅæ†;ÁØvܵ,‰·ÓÞžÖ4é—_êX©ž=ÜİӯSLךóüßæ™S2‡®cß%  ÔÕ\«O è̘üDÏýÓAl±*—¥®tIdèSw‘Ñza†§ B±Œ¿\?2¸øÇVŸò[îê5+GØŸâê‘åù{±§42ê üoüöµ‹j4ÀúÌüíÂ9b­²¸£UËs «O˜ûfJ–ýŽî°âÉjFÂFÔ÷ÇKï®´ý´‹ä;8á úÃÿÊ?Ý~Ð-rˆ5”Ã_ðYɰ_*VºúœÊPköKÄAý]ÔDÂìuÇëMd€ÚåEØ"ö^²>wbæ%³œ›šÝg””ÉQd9Á0å žžÃ¾¦zŽëM‚Ö6¥Èï…úÄ×0J®±ZÿÄ£Lx–;Ζ'ß9¬ê *C"í[ó£%åœã6mE§æŠO¢T´v»-ÍCŽÑ#‘À‰ð-hŽeiFüoã´cCî'9¾xØYSWË á°ïUqó‘‘ó¤ÂEËWVÁ%c|qÜ^Æ^FŽÆ ðÂ-'®±A’õ¶q—§=\Ö.ûÎØó²lŒxfb –«Ê4šhèaì}£ÕŒ˜éNs1sÑü.¶ÍZ+ª9©ñÅD±dí[š¸<&q3uol$nRŠfÂF¶òy>ÜOÚ—üAÅ %û¢wEÑï"Ý+Ÿ]qÇvßöhQÿ5}9ƒÓ ¤ ®5Åys¾BjE*é„î«ØLš&Xu#XüYBJ ~ÏnS}àæõz’£Q<óíSú~›+Tk{ß"w޹B~·<¤ÐÓã³ÄÕlD`[æ^8«†ºÿù\:pÈŠëqÖAñ²£ÒÁƒŒÁ²œè¥È§±Â™¦ÁÅÇ]Móõ) ='~qûÖ9œÔ$ |ÜCÑ ûÕ…‚OÑ%ÄH4ÅôL…Ý~`û}`KcH391‡“,WÝK#c¹¡‚š¬¥)ñâÌLV,`óJ¤:üÀ>ä ÔLIÍJš vg¿ÐãI³klMˆ7§Õ•‚-!5¬€ãÕœ]¿iÀÌϸ†¾–WoõåäfLjx'§Äš`Vðð¨ÖkYnÚ}¾”oƒ#E*$ù5 ÷ì™1¶ÚÙ L×lóa‰( ¸©UJ]ÀÔqW\ˆæéÒöñpøËÂ_ư1´ÄŽ<ç£%l£§§NxGÙIÁÚYAëàO/+g‡ÖåÍÆ#Ž'Ídòe}¢“HUÿ-n£…¥2À7`Ò7vjÉIÆMбÁb5²æ¤täYÖ]™ßÆ¿› ئ!5À¡-ÆÚ•_G4áÃ*NÔä}Ú¯“8…†ïQœ‰òCu·‚ùc—ÁFI‚}ÔÅ"» ¤›´ªU¸L7q¹ÕFxYÆ50·ync¦é³ü_‡úq*mªxÓÍ6ƒ»e”8¾«×wžè$žJ³‘Xͨb"–ªó­{3SâpiÛl— D´—©®‹F¨ þÞ‹; ‘b|u­² ŠXúK·|c2=,zØÊv.^ÈÁ„¢)ÿ¯ˆ—ØÔGƒ×æö w¨ê¬„ŠñÁy_Öþ÷Ï’µ!Þ‘= ü¨®ÿ¿%Ü>ŽÈ§gÍQˆHÂçßY¸˜[:0Ԝ洗O"—¹Ûù?û ´¶(ºм‘àƒœ6»Ï¥÷64Q¶ÉßJðÆ@”æà¦¶¶¢ƒP`íIÎóóʶÍ/4´ÚI5„);Mõ†ÞÖî:ÝíQç E½x`Û-üTüúÑ¿ÿ×< ††óZ Chš2‡O…в¼ŸU•×kS"¦EDž >l&ç- ×Tþ2HûÌ©…`Px@o¥Èx1 nÄKghóÔ…>ˆ!á·c=(Ù=ïÞ¤ä{v.±ûU¢“²Q(QBŒôA3蟨¨`àèš=ÅËÝUØ.Rœœê4(ÂQ¦€œHNI¸Œæn É.äÙ¾§Ûï°ãz/ì®Æ—,Î}IøÙ ·GP¨Uvö[ÐYÄÉŽª¬-áœÞS„o­¹L’'1ÙS$v౫…‘»RrÏæŸìµÙCî/Úƒv-7¢–®KaدWøTʬGjó:ÞÂW6ýFùµdçòû»Éçpã¬"š$äà/Ê·,HrïY¯^ÖR‚h„Ég™˜Â‹&«ü?o›ŒMÞÌ=>ˆ£}‹¤ÊhAÜåâ=)M% íZ ÀöƒX³2±ía=èD\e¡¯›B•ºs«>šÂy˜‡Ã¾ÞÃé7®9pM¦<ég¶5.\ÒÝP]õtø§/ß&ÅŠ•sýw[Ï•¿]±§¨/+`ð¢sé™bq%Ù9€6:@è=7È |//rÀ¹(#†c¶ª¼-rν´‘+lâ1@ÌKú:-vh•ýgoÖÎ9ò*Û·à5œ‚ÓaÍôñ‹ãÈ±í¦ àåÜÙ·GöA¸›ù|™8uß YõYK ÂÅ¡ ³Þ Ñ1fÀš‡} Pz¿vwW&k¢“BÝÀÌÑý1wôEb¢¬„U¨ûäe±Ñ,nL¯o–G&dàæóTT»¸ÛäA I‡Ó€buzˆ-+»Må9ZLàÍ»îKÚô¬s™CÒ2Å ÷Þ’,•ŽGhfæ!Àndz‡‰mÄO±ø\¡XžtÒ9Éœ}¨1wù~ÂÜS»CK|–¢NL°¶è™Á³…ãH#¯#ÝL“Œ€Ÿm¹I ÚÊ® ‹T%ÑZr‡cL€»}:¤yiúÕI§ú4÷sÌÓK°æ™¼¨}” §œÖpâk°Ù©Ó 9RC׫qÑi.ú2(É nïPÊQ€®=Œ¾cFw&b4/Ë=Ò N¦uñBÇ>¹{mÇs^î÷ úSWiƒ¤;g³C°s¤ø!&y‡Mo MÜ,}£q|â”tôÐeä…#ofdLiÅ3»–äée–x¼ÞÝ?†+ÿì–¯ÈRÃãÏŸpbQJ3£0Û«AÛÊúÊ«‘r2kC)Ú|^ {&ÒB“¾½n¨¥Ÿ=l<Ùž¦×ÓîÌ.]¹*«z â[w®·n›Ðè ç7«£!;g¸íÛ¦­N´@Ÿ°†ØßŒK"ƒøææ‰é`³NnƲPŠ YZú@¼cÅí£•+¼†újH [ôeJíœùCž¤.ùÎpφ̑Y[Ú×PÛ ä!W[„¤ºK!·0À¤h ¬9ÿ=d§Ó©žW¼×´†”áΘOP!ć¬ŸH!`ßÖ²® §º¥6¡ƒ•Tí=Ê`lì&·¬±¥ºVÃÔ„'ðžŒNXà(q5îÝ)LŠ)㻵٠QPcP lÉ •ÛÍen/¶wêÑôù&SsXõL|ûFu¤êÕŒ†ˆÚX­³‘`¾ðã0Ùˆ^ÃfI¤ŸœFK®lƒÖ©±”ù{{ŸiÛzH¬õ"цW1€yÏGW_ìãY ŒSÊ1Ò#¥Î¸)»Eh+ÔJE¢hË­D,_ñÀÔΛVo²¤³u‹ƒj:[·–0DÄÂü×%{:“v³s„qóãñ®U"¶3Ü&1é]Âi4§Ýã2c¹‡üˆa°ij,ö}»ë,Á%¸¡Ý°\!R3lÄIòZ ‰ºü0Áà»ä1¼ëØsÇPKÙf¶{Ñ}§{eÎtcjÊ!¦Â°¦HÞÅ£ë×­õ´Ý0c”¨7$VãÒŒÝÁݬB¨¬À`8‰PAé‰xæ=‰ÃæÏð—áç/Täãõ[ЕP\ƒÞBd/Ù ýS,”1,Îþ³gøPDòúËð3ij5ˆS1 xëÙ³Y-»IÎBdït›jVlFÞ)ÀŽ;Uv¿A²Ò Þª®öRê~kõ‘°?WÚV†:km;•#Ôb‰«Ò“ÏkËÆœÛ@¢%_ÂU¨óc—Ï!ðÉ–ÜT²æÊ¶Qýó¨q\¡#,^ ¬ h‰¨Æ“Te9Š… À;3^#ÑbÓŪ‘ã&‰hP4ߨ 1“z¶ì‚æ:w ¶WŒT ©ÁR›CÂUíÐãã®4 Wå b“^£}Ñb\Žî¡ðP/$‰\#g$óü fƒcÔ ³.í:xÈ@•µhó$´dÐŽR/ÁVŒœöÉÝ\naÖ¨…´E¶!«MØkö±1»8´ŠÒ]Ee gùàÁœÅ-å®&GÊáqönK0Vçe1#pÎ4ó¨ûÕGˆ}Xa§ 6rG¡¼™ hî”C=S>e¦“ºÝqVFø´¤ðp¶­±`àõõ'cZ~ŒÁÍY:Ù&Øçô¯w¸èàY©Çòx×Ó¸ýÖ@.7v Þ…"L£EU‹­÷²Ù1€Œöfc!g†Þ6Ù¿7Ë£á¯C.ärâ’Á0Öúª‚sgt;0×ÀY íª¶¡òdã•kÞ±¢­-éª÷â`¢nÛ ñÐÈ|dò©mÛ\VŽjÕñ!²C¡áN³ÑÎam8…¶S¶™{ˆÛE—ñ Uæ –Ú¥õTÁ¼¯™C£Ð!C¼Fé!0\W—IžÖ^«XlZ»:r»‹†mƒì"mò8K´ö ¨³«K.ŽÛÂázÆK°Q6ÆBŸÅ^'¨›£ŸÓb¶ÉCVêˆÞçDŽ›ËñjÂçÚ´ ôðˆç*M’â Ž•7໎¶F”·Ìjg­Æ.s‚âbd3×Coy¢¾ºŒá¤ˆð3X§Èœ»Æqö|*&V{âDz4ã`¨Ä^\§ô¹iÞ”~ Ê@ü0µÀë 2ê¡{i£öÎU²ð-PTYö!C–þ,¥»`  êž¬›…N-è…³lŽÊÌL¦Ãä’ m¥šÊ¥;4)ÁP„-çIãU+G¼)l%ˆÌtjj#÷h»ãÀ¹7æ$&ô:Ü"´ëŸI>tßtfø‘ÝÀ¨B ]Uœú³7¹m…©^ÔŒ°âE×ñ¡mµV·`¡m7ã/GZK6"oŠž(¿mñA¦¦ƒ{ÝWþ84'»‘×°”òH·GÆX}$çèÔzó\·nV`†´3‚˜næ, g}z>x®ZØúÞ›•³ÐÛ#áCøësr£%ë°ãV¯v8õÕñw‘Ê¥JÍte­0¦h3~d"@^¢Ìb§­–Ü|/pœ³Ä±zîéöÇÆ¨a[\nˆZ:€zœñåC#¢k½;M{]}¨—Ý#ˆÀÕJ“˜ÆT$Zz½êãv܃‹&™,»Âm -©½II“«ã&»ÄZ—cµegñ÷ X.þ׺¿[ݰ*N/L„~ —)žsvÑMÇ׊PŽ•À6 }ÈE·b¹ :-·ö†±ºCNîï ÙǪ³î¶ÝD”NŽt®¢Ãµ¶k…2I À&»iZluÛyPòcœ¯ÜÍÚÞsx%r›ên™ïnv98\§ö&ê°!‹¡íFµŸsµˆÃêÞç‚a첄gÊhlÛ9Å&g=x 5ãÈW}¤-Ë8Q°ð ¹§ò¼Èý“WÈFäª&„IcX Ô-ýä)êpõc3}j¾ÕˆÈcߺºY[›@-]J£„#Dãj}H4Ôp`¡O2€#q - ˜øPªº¸‹Æ¾i*Ô0dCjG÷ ¼ÂKÚ‹Ó˜õ˜§R6tü fWqÄ4ñ¿æ_;âãN‡²žÂ<Ö'‘‹¤k=Ù»ª®ù cåÙ”ÙUÑc€q8½ŒÞä¡È-çêØ÷ƒøŒŒ%F„p……à§^ŸQðè6ãö—Êv¯pÂWW¼PäÜœ·UV. ßÄAv¢‘Á…^ pôf–…q!Þß4•héh ýohÕ0ÆóšSÄy#S)ZÂ…æNjÎf¼)ÆîÕÊ·ñ?ŽH=-Ò9Êú좠‚}äxvjÃp›î(ƒ=¢Ã©l9¥ŠCÛÏ·C$â È9W¬‹‡ˆWª£ÓžÃß%H5âwD<Äwßê*³ÛŠ´é|qÆC=!Ü¢]’眮"æÜ9NàÅë\hºU+ï“é2òÓýXüÿäüç>Ðþ1`H÷-,Ô’ !ÞW¿o?Ýžšòåt$Hd”ûÀOÖ×…žBЩbAÉåhGa”ŠØ4p%|˜AI`€Ð.æf \¼Æá!R_&Q“_€ˆÄÓSèh^Й8¨²%/Ÿü\©£C&ëÏzèzWÛ·Ê‹/Rƒ–%…Ê·½¤J¢<•àú¦õï,Ð)gŶ¨ØÔ uÂVaíFƒ¯ì¥8r÷2‚g}-‚ŽÍ‚g(•:A}E/¸L²åqÃ@-f°îžI°ì«:€ß”u! ª®8A‡ž \‰N¶™éUá%V‘U(À?Lqä‰Û2½ ÐdÍRïrW€h7Ý™TθÌ{ìëFkËøx€ó÷jƒ;{á#!J׋/‚Pzl\5z´þ}²1¾*= ¨<{*ã;#-5vX±Un†«j®›Î? ´Œ‹Ã¢PRšs\IÙ¥¥£Øq2yÍZNk\º¿Ä÷]£Ø Ál ÓŽ?›ša›÷L×.Z—’Ð~<æ^ü |V¼dc¬ûôû˜Ëð…q øN’U]“s¦½{S‚;™œµ™…`ëíð+èG¹æ3bFÜŸÇíEz’BZZÚáP0¢„&Õ8ýÔ»šD2Hª8rî«HnoÂ@D]RÂJd“ü>? œÅ.ç6ú Ä™r'p¥;?ΠqMÓJ~:¢Þj¢ø€šñÖ?᯳Êh%ßdòœj>\@­¢Ñ¡¹§Àa Ù¸Š· ×)äÓLVϞŲ{Jœ-¦ß@ù ,dZ¹É <èL±¹v¶œ Ún(EMÇ.̬ç9ƒ¦Ê–V"·Á‡'KB•°ÁTqÇ/W™[;Úi…I9U§#3mFŽÂÔc\ºó>­­“V…p!Ø•b ª´Ôüî¨ç@#3kð(¡‘KÒC“7©uÚ]7ÈÖ6LÝáaËÜ›i¥,9• Iñ×o~-—ãŒoÖ•s K@«£±Ù ÔY’ЋKËb&+dÞ[1ƪذý†}VɄț¦ù$Vn/{Î0£¡ð_,!„Ú¹]4s ÿì¹.Æ)8¬ w>'²O*Ñ•€mÌžlR@ojz7°ÑI`Wºl·mrùØLÆ÷+Q Àr6jÞih¨J697k”çѲ¤K›FŸAÅÖï•ÏL„ªäÌæñ›ÈX¶4nâÌí@‡.’”sÔ`B•ö&«Úœ•9«ìü”üH̳½ó£‰—G—tQâtñÜyí–'Í‘‹pØÉ W:bX=è9©öÒ;»h2KÍä*pš˜Ü[[.íʲpoÔE%‰3àJS…·Û¼ÏÊ"&JsWŽo×»ÆEìÓ,%…™»1Ö s–kÐ5ìКvû)br ®a¤l«LKŒ'¶Mݺ•I¦¼%™¡xÖ±µœjÞG¹v!Þšè·Ê“y¹K6×â¤ß‹G @¥¯†É!¼1¶ïB͓ӧˆZ€ÙމËÌ*3uH£W¬´…FMˆ~EÔUCmƒj¯ÔYskZ¸ â%[òJòØ5³¬wÐihi±sá¼?*mù$§MܺÔü *R#Ï7Fv`åæ4Nu¥°"œ]7N4¡@N8˜M)R"Æ¹î¤ ­ú˜ÏÚTÑU$^ÈÛOåmÉŸßAÍÀqeL‹°¾âÎ!ÉB„{Bc)ü.¾ý 9º]À b{ø ò Ð¡IYd½vÌšDJR¶gÑ)ÕcÚ%šZÎa@³pðèÌÎù ú-*1Çë^O.Ds\XƘA„§ðq[ ‡!¶ˆ ¸C…îú%)*ÂëFJ3˜b•´?ÎIÿ¡')èn¤wMhæn¢q쯧ÄÕì¹°Ý `(öº6žøãzèv¾Dov•TEêÔË #dw +¼Aó6Òcl¡°K€AŸK­ŒT…‚æÁ 2}pËf»ñžÞ2ØyvÔ¤øPÚKÙî7e“'ÝXl”ÛÖ¦Hß½îèìU7ƒ$¶lâk¡ìÙÞ¹JÍù™ŽY¯$,²+äVÎLk±dbCÌeÈ6$Úì¢MWe~ öVl"%n·ÚÎ3‡±¹bÇ*ÒñÇl©üö‹Ï]‘Th±„Ù¾”w<›úAF‚?Ûqá¹çt·kÉUöj£–Õe´X&…!ß+lK ø£ü͵g,¡-ÄŽNÄÌè0­‹¾Öj¦UÜÆ¥êÒØ­Â\tZÅÂ_¶.Q«Õ5oÂÐãq¶žÏ|ÏT tð¢ÜŽÎm!2Z³Jë~lÑ*lñµ¿ºˆÎ[¼Fú.µ“/.*6É^ÉS›"G”` ¶“®,°ë90WÓ¢ŒÞé”WŠßâÌpÕöRæÁ ¶qÊ„‹'+A–Ç“"X8%ç /¯D–Æ]ÔZƃSÌHµN¸èN¨=ºóu--݃“ñÛ*3H-µxy‰=æ¨ÍtQ×/)·Å 4á̽ج§e4XÄ[¨\]ô÷Þ'ýHGÖÉ)߆š%P¸5‹îå°3¡s]ÝåNaÎÃå"²%ì4|*5Ë`œ6¡TMRBl~XÜ(plÜ=![}š•*5à?¢ÁoæÚ‰¸iWü³f°§ó®;Ep™a»4õQ±Í0w|:­Y5ŠßÉ Ò†Ÿ€í`¬F ‰VÝzÚ¦Ýpç§÷Èý“ê-—ÖÏÏ!9&½f+Ž6°¿=÷4hŠ˜x²ÿFªÏwàn¢•1ÕÈt[ ¾î¾pñ¹šhέ²N÷PI[Å 1eôxrE$²y[®†ü’̦5ÉŠ¤²²í&ºmg%+g‰?-`‚0 ÅͰ|¿˜uåÔºpàqú‚Ôã2®—åá®FªXHÓ׬8¶(éËõÅ›3õ^M¡5t{Ü\îDÙë÷¥éi‡`[ô· lÀg¸–oZm†žmµû2d³ú̉ª]feC³xn ¸bžJdJRÙÀi?÷cg¾É“(S;‡ç±£GJßÎÏŒ*0è•sSmg¯„LŰc›™æʱ‹[ „«*n'¿"¨Õë·’' |®[ˆä0·çQýôôò °­³÷'“6Êí>À‡Ïµ‚QXàŠÜ2œƒÄÓyãþ*—pÓÓLšâboüVâwwμѰÎÍÑ Ý‰lïR‚DrºS—†õ€JÙ™@•¢ÀÂÂ3àsÚ?+(Hq‘¤=ˆ‚nJv-„r ånÈ£Ôà‹ò•i–l%KD¿.³?ÀÌ®øâY¢y Xp|S-G¬¢e¶ôü#©×f¬Ôø)¢:÷OJ–cØ„œ0 r !¼‹ýµÕ|“f›´fA dÝ’AŸÉÐ2[sv*ÚÈûüĤt‘áwR%”X.OªEb¿ÆÈ<z@E7N½µª9 ˆz°h§ßj^÷™ lMæú$–£T!lÞ‰ ¯;Ö°÷çfjÐ;K²Ù œÈ…Oà& t÷†Âr¨|”B<åBµNHïÀrµ::‚±Mr3àf ÊF¾Îó;ˆ(Ð’ï“{0%¥Ì÷ækSÌ4¤ƒ4k“ä 'rÖφÂip܉0\ã&Bq„å¤S¯xàŽ/˜§HXV”Gz4 më<Ô¥Â;Š“áT9†ï†ú‹Ü„zn°!5póßã2÷b<ÀRy²…ó!8¦õþëF¼•/¦yæ¡°A(^²d¹âÈÒpžÃÀ-•¼Cð­,¶ã®—Êb)À–ÍÐá7ª€k¸»/&a|vmïîê`„ÚA=ÐRFŠ×~û6ìÔ‘$ü˜Ý<C×BˆRƒXÄF²S·2„—‰Ö¹}õ¢ß¹oÉæØG†`^M¹ÆŽ™'C‡-kŸÊ„qe(z'4»4®– Õ{w(“c:—x^šáÂd¶8Ï©˜%é ÂWòfyw»p —ZØåýsý1v•-¡ÝUƒjEe"«€;‹¾Öpì&$QO» ‹ Ê.º•ú’ë6f¹Ã£OMÙR'Õ–ØÜª¯•?eK£X4)ÙAËtƒîåj-ÓÌ€a@N±kQh' ³V¤ø8µýá¤lYò„…<-ßãµXHy6Ýi~ä ²PðfšÀè_“†ŸËŸÈ½2(]’C‰Y* n]Ay|‘ŽnÃd]»ÓúPºš²?EÏb‹NToaSX×h€ó°¨ÏGn¼ü` ÕJX2Nî]ˆÞ¨ÑÆšËØ€Þ²âk…Üã=ßû§p¯Žå.Eï˜ÈÆ>&î¦ìµ y¥‘\‹ZÛ:Aœ¢ .Tžø%n/µIK=·ê6¸04 ?¤‹ƒ6**MƒwÝ©@ÝDMlÛ²ãö'»9Ö~jëðd¶mžä75lùΤ†0µ\Iã¹¢ef˜§0{Àµž"Ô–Hϼ»íìÝBÉü Ô¯¯|dz˜µ‘Ì–C„3î²E!Å:ÂÌ•¶·ƒSÉMGò´½ý{•ÎÿrÊ ¢ŸØ-é€Ê ¹ê0ocˆßû›|Êtñü6c°\W|~1¬˜ÜןÏq!ä#=o¦¾åïöó^öýãŸ£Š·þ÷wx9÷“>ñ¼È…ˆŽß—ÞñçÌœs§þ¥6gÌ,fÇC ”D]¤Û@  ¹¿³¤6( ûÄ í”sÝzÇÌTÓd†Ðð€ÚIŽ-IÎ7vK“¾;æHc”ÃYu›–Òy?ß&£ËûSæ¢äÙÏ@Ó¿ßñNàÊ’–Ûláz($€oÚ¥ŒUŸƒÞúÉÒíÄÐΧUC=/z†=öN†âi#øÕ‚È&*Èåv’WØql1\ùó¦`#ˆ—{ݦ_ÕŠÆ×'®rãt›)@­Å÷š#Š÷¥>çÄðãU\ŠRͰ¸\pÑ{: D ¼RÒåŒ8–×q$UD£Iìçñù›9 PÏÞ«xDñ\D$\}çšq¿ºl––4²œqØcòÉËŽ5ÒŸ9­ ޵7’råR² ǧ*\Jäò¦‰‰wÙ\TÞkæBÅ›QƒPºhQãŸZ­’ÒÒM׋³&‹½Ãà ¹ ŸÀeKfà>-#Í‹.‚f°˜2XÃ.ðµ<ˆñݯ…ÑÇɱ QöWTÛ÷”º =º1[fKêØ/ƒÃiZÄ*8´®KÝàßʆ¯5äÇ#éo‰q7Xx¡ÔŠ—ÇɆ'‰Í†ÇÅ&’nÇ,ºdZ,嬊ΥqÂyð¢é÷ÓŸ%iˆaÄ¡‚è4¢©A{ a”Ìá"‹¡":¨.Íõo/SÛ¼ž,i·B‘‚ƒ?çÝ%189SÇCܵòd‘KHÏÀIÉ »pUû2äè;íq–:—_N 3—QX›ïôn® ì4JÚɈ֮Y؉*~›„ Œèð S®IJFAŒ5b¯×ˆ}‘0Âo}åX!äÏ‹áò>H1Q’{msQ/ròOôé§Þ?)xc®£ÈiÖg˜l^"ëø2̺ÜÀ £Ý A1ªXœ³áìv0¬‡êaêà¤?©‹Ø…bs¦“3ø¤rMSà BÎ#ÁÒ]&u[åB€2æÐ/pI^¸²:ûl >4D‚ŸªVq& ÁͪËîtPìMÒc*€æá˜2wЊw²ãÌ÷7ö„šÿŸ3ñív9c|D8`®¿›.2]£k‘¾`fºt÷Y åùJºŠÒ âvéN¯óøÑÕflè.TóhëŸÿgT+ŽK9ªy&»n`â > á®Ç„y?Ô¹RÎ9Ú)r©ç_ãä±NÓ°³‹ó•nº˜NEÐÜîvV<:߈°O¡îreoF´Æ-„Åí–8mA‚2æ{u()é¹?à4©ïÚUô¾WjŠ9µ3mñÌ£—Cž2Zý)~¼ä]Àšò,|Sü¤…æþ¤Ù:Ñ=M`%H‰@q…oc.(ñ ©¸Âµ=tà*ihX\ÌNJȹgyÁ=TŒþË6¥m€»ÆÉ¤õ†Äqð–)]¹Uäiï½ÑÖ0«uâûÔ¼€1[K4>A}¹eî'uGñ]Nç-s~üU‚TÍHé­m º¥)²07å6¥ce&ŸÞsÐ…ïXŽì®L¦Eƒ€Ï¢èÖ>ÄI4°úÂ1äÄü³þ+„ì®—‡è«GƒÏFwŒ½>1=¨C7)xJôYÜÚšg¶SŠVœ‹¤À|غ¿Í¬8?äd6µ•Wr6ÌJ¥“ٲ׆JS^|D]G˺¯·÷áÎ<'vì*<¶8\‹ä( Ùf% n4ÄwtëÝÚA‰D…«&Ø .ŸÅvŠ~þ>ç:È8 C~‹yz†F¿”¥©$›s…Ul¶‰Xfw™Xwv"åFç^Ézü:mB0RL檽ÙB%8:VbàäÀÓ?×ý;KêEŽ…ÎGT l¤àJ„$½¤;¬+ÜTTYþXõkš‹øc·Î× Eƒ|ᣛA ‰Ò¿c/khfUt¹.T‹HM™ÈeÛts"*ìopiŒ{Œ-G*u.D›wJås tƒqœµÆ¯ô-·/X̬H¥ßg @)jRè1 ¡Ç—)¾~7rBªRÅGb`€ƒQê[l)ÈÙS¶w°ÀÙé“[3¶Ûöž5}‡ÎѦÂùåB{ž™…3Ÿ gYÚ ÖR—þz’ÀÝôÄ’»ÙÈm· :ÛikQÏ\g É4`;—W™ø8ÅÏaåh"øšÐÁèZÄ[KEÆ ¸‡G›(²š»–å6ËVñi$a£Á‡Æ1'â¢êAÊYê…7+sýk=ï=ÇJ%D¦*s< @cÅöó3C‚Ž3–K=Ó{j"+qÝᣪǢØ6ñØY´È³Fç¤kYžååÍî x³  )µæQ#£§÷j[<ÊI˜cú§Ûÿ¶[œó–lj4¸œ=ü‹äô<‘Œz±+u(¨ô©G›<¬›;ê1Ã*äâP·‘ådSà(M\Ú6”á Á¸îׄ˜H—=Z{Rìîý[jÕ¦Ër@d¢Þ­|'عÿ?{/NÑ’ä¡8y×—»&–Ò³|éìË-s¨`åôvÂhãW­(qrÅSݲ¬‹`új*ŸU-l±þѲ¬üÝšŸN<Å VÆWËbÐ^ïä‡xDIÍfÏ䈋Ÿ>ªôQäX:&\*LB7/Y¬„™;£ äM ¼êmÅ,í ønñ¦àsèƒ7‹í Ž#ˆ*–ÁÆo卿Ÿ»ä&¸,š«5úÎ݇ìZµÑdè)”†sQ:ïi €Îù±¢½úzô[ùmg-—x5’Ô{»ÛúwqRÖLYÄXjç‰êwîÝ.ÇiÝED{j†5¯r©.FÜÖf®Ë}CPÓYîò$•ðRwæWØÊPq $ÂþÄš5îyn%ûþ’­ìx‡†7T”éD‚´ê©v€Œžý=U¡5IY,\‰Œ²‹Efv¯z+qvZFg¬ii¾±F‡€/>wN|‰cd;ZâóGÖ46\SŒWe'¿ëKµËš¬œ¸q‡GýµÌÎ6›ŒÖ·°”åT9ˆVE ÑeÀ%åJëX—áZÑn‰·!2©èÇ+·b>qÒŽFbìev/†quZIo/· #逫Ê'õÍŽšY•÷´fjrÑ0Ç‚ÖuÎvzÁƃ.‚›¼Æ”Ûqš^wóƒ†î’Ô'ñs)‰)Tš>ÇÜHœJí^®ÔC–•&&ÃäŒ/Y˜—2·Û`ÕPáø5«®"¼Ù&ºêáä²ÝÍ—Ö„p»Ö͉âÕrc/,Rñ/oñÜŒ¸¥À¹ŠêÃó]'|yÊg2¤ÄËkœç \Pklqûí0ƒ à ĚD3O+­Énã GeRI…–Lú¹nžÈžjz>2ÒR4zzÐ "1\—Âjǯ9Þ°¼%ªaŒÚmr\|äÔõÓ(…ëëF®LîþîÀk€Êa•½8õ ޳vh?ìk?8JÄÖýFÂéæ„†=w—¼Íí7”9®s„…·Äšò+]^µêÔ¶fݹÍ]Ĉر¢x9[C_WA˜¦Ìïêb‘زP‘êè‡vNׄ­véí¦•8x‰ŽÓ¢‡$PÏ}ÇÖçª`ÌÄõQMVÄ <—îíù·ùCU7E±t±óôð¨­\ÄpeщdÅ¥äšÅÊ c7æ—ë3MR%ÜIÁ<æhß¹Fòe°©Í"‘Ú¬ŽÛ:’fFçઔL>›ÃýXv2]ûÍG¶º¬òî‚ÈÌ+ÊÛ°^ÚqçÑx?÷°@Ó%áᬠ/÷\NX *OšmðZÅSÞ:øL­Ö°&ļ)×\ˆ’:ÙòÐ Jã&Øü¤uúâö„Šš¹ç&w à04@\Ï!f8´vœé[ÙÃä¤ïÀQ IÄnß÷ÄÀeÏ$[ˆ•r$ŒKr¹CÉ%*»¡ç`Äè+}„Å‘ÇÜ™²ë~ãäã*²£LÄq†¤&›¥QD½ 'Hm”`‰ù[À½ýiéëö ŠNÓ"3öCùbíWòÞ×§î-P¹ 5‡å§}¦aÉo…-¬3}%S…¥ïµ)è%x½´fù9 "Ö"þËúSì-³\RéS»®Áötà "eïà/ÚRÕÄ¿˜ÁdoA\ű»Ív컕Q=‚pJUó÷1BÊü ƒI¹ëØÏéf.Ô˜ §Í:ükœÆj åý6òíý±â$ym-†Ým[Õ™)l•ˆh_9ΚDMí‹:è”Æzý¬—Ù«î ½€l ´fÖÉßk2ÐWú‚¾¤Î}ñ°{Aò›™òü©r™±Þòãí_𪑈õì3ì’5Í.Ÿm¸‘oNœFS0/­aß´¬ÌÞ #ªàÏ0!)K"p¥¸ý`Õ¥æ>gT·†Mc_u;Þö_˜¶)ýtL¢U,ûRÚQª®_Þøû[E!“3?ñY5 ¥cqû&¬OÝ‹TÖ´‹ kÌ1%Ž­K£‹ù¼\'xûØu@ˆª/ø°R¶Sz°¯íúƒzôìÐ×ú¶`Q\rí®¢µõ£~ª;=Ÿª*pó—´ûu!.kdê~üïݨ©Su±0ugƒ´#ËäP1˜¿ÿH?éÅû§ª“à;s(E?Ùµtç.‘}ÛFüù\¤T¹Ö¼ßž‡9;âìøÍì…ùOn?a—fÌ’þ5–E²x=àŸd„7uóý§™ó“ùí@U¨Šò\+¬9…²Çœ—÷ccÆ¿}%8Þ^‰)'Všd6·…e.ÿÿ][©¤zÙ~Ó²Ò"FÆU¤‰Xþ/Óm›$￟õVͦgb2ô÷N¡¹GvúQè.§Ü÷ë¾¾—†;³ÿnðìiZ˜Y>ûyw ýéÕ|óX«—åÏÉX:ñ2†ûa›—Ï̽L`ã%;âÚQÕö`þú?´ÊËÇ>{?íÂxtëþIÚÕC(à?eÉÇ&5KŽì¨ÇM•ñøæî›Òî_l§{ù¾ñ¼ˆÿ¨¤—Ìj⟼`O£òâ ÔÈ&G/®y~åMÙÿ¿ö›ï›ÿ“‘©˜×¯ëójN~¬ö=ËŸïNµ'þ3ýò£õg5"ŸôqÚé¨VÿadúêÚç»Ößöjñ>W{uᵿÿoÉÝüŸB·ÚÓ2¸Úÿ¸óÚuݵßH°ñ߯¥¯}÷Oé¡–'ÒõpÌ…ô²?¹M,û‚÷&þL°x~Ž oÙœ"I-cza'ž¦+" üÏtS:Y^V2½±õëf}f울}ÕË ?ût2Ý.JÓ‚¬0ø|T©¾Á…½Øê†Q{.ù ¦*T¿GzC75õqß{ͺ|=&à¨/]ÅÐOz<:–¿¦ =ÿYjÞKz Ùpæ²ÆìÓxÃû>ÎüO˜š9Eð•ÅoÊ>d‹¾zß{Äq…O]¥øýt'yFÞ¬ë|¯a» 2C27÷˜¿óa*ÒW<ýØõƒ‰jËà´Ò¹üލ™Â¡>_ä‚fxǪÙ]TmÂ’EÆôƒ1}[ï ú4“à¢àøõ/C¾þ|/?zUœèG;<]¸¬QžÓ'V©’:–Žsý½>¬W™¿þº5Œ¸´S •Œß^·Õ9V^Ž›®±ØÊ¦N@¿æžô cw^–ZCÀwS¾#ú7_=NÙ9J°æÀÎÊ/æF|¶õúCàß“ vÂÿ|¤º²]/ŠÎ.{‚_„ÿ&©ù’Æú/ö`J âïg¦7Ýþþ ÜžÛŸ`ˆÒ§ÕžÉ7šëÔg!Lw—·åBÔ¹*þg£pJ|ò÷|Ñý<Õê4é½`ÞØŒ?ø³ÅýYSsUfPN-br·Jg]ý)=” ú-9ýÈ*ÕíÏêuÏ/Üœßf6èõ×ej®óuª\ ÿ\‘’½ažþت+¨;FµŒUÿ*k¹v¡çÅòwíøïbSý?CZæY˜,ß¿ùp§NÕûuZ¨Í+’øc-ÐÒÓ =î—ÂäÚgµü‚Ý©B÷SÿPà§’» ¾FQR’¿ÒÿòBT¶=ÅKªØO+b:°MÞen}ÊOrçÔü3ëÁU+¯9!ôi©¨qáõ)>ØÏ€Òÿ‚ËËmeÏÇ>µ±?ð÷“ÐÉ82»¨X?;ñ:Äe÷ÎÿU-#þ`ëì}5öw¾ŠÀ?ã~¹(è­Î/£—«p\Bæ Á‚þÄxüfðkžÿ÷Û.ß«ª°¸ÙµË|vØCþÓ µ ô爸ñé­?ÙWëü}ÂP\‚üž†µ³ý_ŸΦÀ¦FëaV©dzØ¿sÀÛöÊs¼ž­3‹×™Þ°nßI:r/1^\8„öß[óœE/(ß/>͘¢/¸Òˆ¼O`ŠÇ:ˆŠT.¸xñÕ!|Ý‚ôz¿ÿºzâAú\H`·r¼ö¢½×³%+>æxM.\ðŒ'±P‹Jì¿+~ÑëTºUß|w8ä<ÝO)\¦ø„Ýz8ö-Øð³†½ÃÔ©nxõÿÎi<Ñ›‡Uý ªø8 «¬Ø}ÈLYXV„×{q¹s|a€“Í=óC‹ÙB¿¾,´Y°aÎ+Î<"{‹¥°‘±r†N;sŠçuI>×Àøçc-aÝü ³·Ea¼Õtã4yž˜GŒJ:•¬L¨ 2æëØííö1É2¸©ÛŒf32UéõÀ1×𕼆Óx¨¦Uzs"ÜL× Õ½||ÿSý‡éO‚ôÜSY„b¬‚»“¸¿5âådœ&Øú–8ïÎù—}J ÐÏ Nkä ñ­k™@*æ›î³gÃŒæ/"vçÇ÷ìÕzb{’S¤ýQ"Á6PHu8‹¹;Ò?_%(U°ßÒ²æ¶0ío*Œl×Ì{õÅ  ÉÕºõÊCiBF­Îžµäœ3È[‰ÒÔ•3ɨR¸ôÝ2ìJ‰À^[ö«âê‡ïº.‡ Õ”ƒº>™{ZY^0Ê>\툔H&Ý¢+èfiÓ@2r+3Î5_oa!Ú9޶]æ]¥Ð±7¶Ômpà)ºáñL@\Ë´T;|©Â Èlê‰ø2Åñàc‚ àwÿÓ’ÒX—Èrù{ø\ñYåÎA§L/K"’^ۜߤ1 “ÈŒ-‰bd@ѽxêÌUÓù8šàa4Dó å€´@ŽE ȘºƒËfð3àʨ½ÍuBÌG¬^B6ßç­Ðµ‘µHÀäsá°§xå2Ta"K¹“Ýä$ô-Úm@Þ†uR~&~ÀÔ§âoŒ³ãËb|„^W õͱSlÒ ¤ñôdeCŠ.µè¹Ê \.ÑÉÓ4ɯð³ï³¢ÕÎHÙ¼}¶æKaÑ7 ©Îs# 2 ´FØ…@bÂGUã5 º±DxÿÅÀAD±á’ˆažYnѳGúì¾ÆaÁÉ´MV&ѸòšŸáͲKÁ-B¾3G¸åeðî[dŽèߜ→(¼}X þÅx†·Ã{žŒÕMñç™ÖP|:Þ9ç†Í"â é_Ö☕2u†ˆü`¡[ó; š½Ä#—ér1L<ƒj*ßgP1^ŽòSiÜ|Ôbh®ÑÄ|¦Ø›w4„SJÊÊÅ”³°ó»-îü¤|;ù6ÊEÉ-fßÂÖÒ݆Þ*:]VE܇"Û–ÄÁªÏ6ÛfêTEðX1Òfô:öÀ£(,>úa¯þåLpòYf+&†Á‘\d娫¡oéàŽHf-K‡™êGÞ™ŸSzŠ«*<Ÿ G_ß-!^GÝy‹ÇËϹ#Þ䢯v/ú»ôEC¢c“(Òql5}OLM7æHMB^øxüýÌ^°¨,Qi”t+Àꉋz›s;¡ Y®µKµPâ4ÚÚs=H%<Êé@s·£Ü2{¾Y]Žô¢ŸÌtB”’U¹äv”<â+U¦4ÍÂkš(ðƒ‚€=®¤Qˆ0'‰Ãä,IÏ“I4h(Ê“»z´Ü47ÉÖxdwé”@ngöÙÑ5>G¾¤ÀJ¯¿HäçÙJŲ›§” ç¼÷À =N(§hU‘³ù…]IçàÝ@Ð3‹¥Rˆi€°F×`gݯD;;+Ò&•Œë[?`v¹xC£øÇR‹˜n v ö’‰&j`!§žPŠ»Ú8H¡bœÕ<ê|2ä?ÎH~ëoá¦ú ÞX÷ïÈaÃó,GuPcÒSa´dƒêçvíòÈ!¤á»hܬþ¶4OÉŽ'¢“†³±’ L ¬jøâÞ9c.}Í/1·,dœæµ@‰<–N…ÄNº èLº®7Ðe›ðàvɤ§9©E#,ã—–úu‚þÍS…q k­¬9µ¯¹›9 ž•enŠŒÒi/óP€i“Ec“ÉÚ’€È¸¨»¬ÀÒMòÜUЛ‰Ü2”îû¦ü{†c£†&tÂSÚëbx*Ý"øºÄÏ‹ –*÷ÐñyjÇ}áóp…¶ ÜqšU–Em–Àÿqã^NŽœÎ^› b›(aSjòñæz2õÐQ*Nû¯«7"úd›3ÕåРª+<ÔÙƒYÉU·žùö*ãÙŒoãÝV0GZ[žÞJ<¾>'ŽœBÈXܯámȦkˆ E-­‚åž)¿Ííñ‘bîÝIIá˜%½ñ Fñ>Œ (y#'O‹ãsYãšYoÑ@£€EÍNÉÝB‚ŸÜ’›W®[£¤9"Žû-¬¢à¯&ã ’Ø–®ë™›Ön„8‰ùwGwM»¿[»u޶Z¶ªìdnòK)ÞäñhØ1xŒ2my;K-šh±õxšŠ6ω‡| íJÕñ¸ È]p4;ÇJæc{ŸÃÏgy4ýëˆypšn½ãrοeoÖ5KÈìÐfæí!'©â3s£ÔÓ—g©UÜhºÖR+üüÿÐM©(.̸_˜z„ÉâÏ8áƒD6mMöZàoS´ØþŽ9Ë‚Ï<ʼn³.ph‘ ŧÄsˆ¬k­ð–£zŸsÐuˆ Ÿ—¯²ê°3Xk'¸Ç¶<Öꦕ㙷êÆäØå’TÞ³·²6¥ìãxÊm"ñžŠ~¾œ—Ÿ¢ˆ×’ád…&±`iÛ³GÞ¾‚ˆ½ý¶ˆ|è9å2êØùÕ¢nû^¬bRìøwŒ–úÙðƒ©q‡¿cÍOÌn*”A7DÏ"Y)¼&$ÄDÊ9÷DÚq£ÛMæna(cr´—ˆèsSè73hÊT V‰»w^*&a·Ûpâ  wöÜó*²%æÕn€']Ïi”)qÌ(ñIZ ×`†ÜÛJüø&´pcòYç½J!;sà\_x¯g/ÒdˆAŒ™=æ’N@;÷ÍXZ©"'9QÒÀt§cì=Þ—gñk>Íq–…ðIá#o÷ß ±¶'L1º044ô•îA$ÝA,4§™ÂÍiR#›bØ3K ´9Îñ¤ý°ýCçI1\ʤ&C Þ˜ä`½òö˜TJ6)WÑf[y¥úö’gа"rHcf"fé¿jL‰îU$uÙHÿ†`éŠmF‚…‰²äbü焽#Ý¡mx÷âô€²µ%m,}½Èÿê|©¢˜‰Ù–ªîuP`žÄÏ8±~<ø,zÆ<æ=\ñŠc8B±¿Ïžå˜‰•'tËG+𼣞µ)L½ÀëÐãª1;ÓÄǾ„È%¬ÉZO¦8éC+~r S0Ry-}0•“ÎŒde§äúIW˜êIŠGùY¥“LÈ'²Ku0 ¤Cé)S›tc侩uÏÔÓÒ÷ÈÕÙÚ¿ÓGì É™ŸôW:l*Ÿ½M¡¦ 3åÝÜ0éÕð­ƒsüòk´0úÚ\þe”“…ŒÝ7î)¡ª–KFW±‘>jjκ8Û²Øù}ƒ?, )§&na‡7y˜[þšã2uRYùÌž—8¶FÈlô¢Yv²Ñ5ɸݣkf•ðE÷/„´®Ÿ‡Ð(n™€^¹jnµÛ–²°œfz/:A…Y"9™ 7dÈñ-K&ƲìþÄÁ„ãk%¯ëGÄG:úXÖa“i>uæÀ9=·ÍiU[Èâg+tkø5ØI°TyòÝã‰EûðÀH>'L¦•ÎyÁ÷ÇoK„âÌ е)]¥«~»ˆ25­ñ¡Ïr_¢ð”#øC;69°Ú§Ã44üi·òYý`¸‚ÈÚPÐÖ›œÑ|ÔqmN )j¨Óáñ¥ƒµ|~„:"R‡0&zOÁ×)G—€ ›Û ÌÚœ(’X‰ÕcøäU õþ '¿g)¨?x5`—&ƒµa¤A5} »zImǘs'•ÈhÕfÊóÛ‘£Õ(;Y) Ü•â#JÒˆ#ç¶nÇÓª÷0À¤n ˆ WKÅØÖü pÓ°™ñkG`JsbÖ¹!Ò@¥¼é=|m.“èP3¯p»P‚b”¯³7í3ý†Xa‘Ùüv ÚT6‡œ0@A G'CiËžf`œì6§„À(mrƒì!‘\” Ø /voåŠ Sƒ¥CqÚm"è2}šwFmà×:5lÄcës˜‘u…;‹«´Õ.8M¼Û¨þ[¢"Ÿ-{v—ºTe$‘Áõ<‚´"8ý{"6!7†™i‰iò1wªÎGÙ‹ï Ýê<ÒÚáñzÚï¡~ø-–ÌÏDνrüÅÙqî!ç»°w¯ÒŽôd>_ŸçW0Gºï²Å wÞó©“Þ ÖšãóŸt´¾{°®ÂSþjliMšC¿¨fû]üŠ=ƶs.¥´ìfæR§…‰äËW1Ö*±5°FêqG“¦mþd˜xç\“"Ü9óî|þ{ÑMëÂO5.ޱ+gÅ4ë5rWµÈ®ZË;-ìŸRÊøkújŽjVpÓNíŠNÏ~w§3“]à Ù¦¡_{k‹ëw—Ѿ¡““SÕ©«dÊõqò2+9r‘\œ©”8^ŠX·Þ=”Õ9’¸È#IΜ»á¤‚ÍŒŒ›¡ïM“ðiÏ¥«Åœü¶.‹}›MÃÃ?$ÊÔx¿43XšÄùŒ’ïÜănGúqŽ.y~ÃB5¬”q28yy Þü¼ý âvÉÈsP7%-Ï_ÿv±lÙ>uu Þ‚§øµå¸÷®èþþ¯gJ5»„Ç£]UÛÃõg³]’±{fí~R_P{¿jM¦Ýèɲö½ÿÂ3ètií&Z·ÿ58í«_œüci/ïüÏÞø­M8:Û¨tgò1ºWB“å5njœýGÌ&ùšWý”Ž.Ç[ÇÇÇÇÇÇþÇêò$©?ù#†üVªü“¿}¬Â>èâßš[ÎL½º'sYÆ)M|—T!Aã#¶ÖBx’î°Þ’útÉ¥Q3~w£Ý‹?’ÿs1Tíù'q‰þì6v+O—–ö7s<ôùÄ…7÷¢øE×Ë:Üÿ/*ÿ3çx­ú??…}^ßí8ïà·/nÿœbØ@ü}Þ z=Þþâ „€úð¹ã£ããããããããããããüãňÏùï1êñ%’Neî”—µÒ\\ø+íë½ã#ããããããããããããþãk[…åc ýè'ε7Õé¾G'çkônmâÓЂgSÇæMGMsçî¡.œi\0®?&|‡¡·„ Ö4ŠMC‡£g¡EOé Ù7M Ó$o­'ÀÜ=¦J4'Ú÷°%F\óø¡/¦Q2»<œ üªö­eÙ[±oÉäÓ ¦E ›6 zªT¾Ûùܳz¨¡Ú„LîD¯ž¶ë+ß)W b¬(y·!TpŒhô=² Æc ßP´i­Lšão»‡Ÿv ½†uX«Â÷Üb}«îëú¶ÊòØÉrÓ÷Çj…»=….íQ_ûn ´OÏü |»EèîAXÔžÚžÃþRç„‹çÙ(ñçŸBö\Qh•5 =޵’8_b¹Ç-ãªv&{‡Qؽtž¦þW:²îÛ“%b • î!=†ü´y÷éAòm½$v ø£¸,Âpi]ƒÐÛ7õSLÆÿ¯ìgvóp%âL’)¯JœõÈDb‡§%LˆJ+8`2é¯à9tàDãs‚Ф=üCJ«®`3ó±\"<”ŸD&ðéD?Á=&¢L+]ôw¶ÍÕ…^~HtPúZ0ê˜Ö1•‰DÇ­ ÉÄcÄ@†”O˨) 7U=³ëêdÙz­c(„[¶fŸñ_$‹)¯]ØÈÍbáöŸ°ŒC /…C ­bô[P:!Ê%z 4Á£Ue¥`ò…y+P3‰(`茜'¥Œñ2¬‚D¢®8Å)r¦ÙšGíÅÊzòq锑 ")¶Åa⛓h*¤HÅa9U2˜"NÓpò‰³;g"ø ³ôf )yìNqP Í…¢â¢´¤‡'"ŸECÁ•Žëe—Íg¤FŠ#b„_4bì½,!KTöL×UÔYß:xRR›±"NcY+×,jÐ Á%fpKbæ ®‡0!S¨‡.¶>Â2›žÅ Õu5J­ÿ”5R¶z">æpÿ\†Á-¦üŠ JtRˆÒˆK+‡Á¤Ô˜:ºrj”?ÇFªVÀ‘êôHðf‚ê/VÿÝÊîæróÂZ-ÒµwYóÁo‹Qm ²ÁN¥;t¥c ã¼(e°WfȋŞ"¨ÐX†Q+ ÝÉ%œ:¶D6!Á*+$ÇïxÊ-v%£ƒR=Ä(ðI…2LSä°íœÁËü¡Û附DK¬pnw”ÉFeN8Ђ~爅Áþ•¦ŠÎ¨B€*§ËÑ¢Š²V¸½’ÎäX°Ð/Þ³”üE`yû£!æÁöDi!†¤è„)/£a96aT!LŠuª$…BFÆp|f%8K*&1Âpž`„Æ”MäñDÞO”3bNâïVÈ2Çö¡(PDŠpc0†q)!.p a{o+€“ñ"·íߨhïÊo£ôp¸"…ª±0ð* ›ÉwÂŒî²`…‚ö—hý=Òu ÷@CPŠ×‡"è•Ry›wÕê¸btÏ3”®‘) ËžÀF$‰,¤p*òîÁcV>dˆ•ƒè(ù3|­ðDØ0õkü"ˆƒ‚øwb!ʼnÂYÒ[Ó~ÊGö%6»DºVÖC¢‰š}ø¥ ŸµLŒFfu£Z9P¤'ô]ÇtkÔ[ELÉP&ââ•ÏŒRˆz1DÜX=PbŸƒº kæ—xúNdž³ˆŽ>ܑȷcî›ð¶h/»59ÓÆ¶/T*è>@¬ fC²©.ÅzÞ-‘:‚u¸g‚³b<“I³„zOˆØ“Fß ”™…# 9 ET"RV”d‹Â4§ÀôY*B£á1¡C£Ô zJ?ùW:,±©,×Y‰VhFƒ¢ôµ¿ÏqAŽ>=l“цâä&0+!ÿå“‘D L9ÁSü¡Gy”&ñŒTªS¹?6MW#æpéDX(l& æ3Qb¸"¡9ŠJ™ñ9Wqûxsä¢8Œl¥”Bbˆ A)fÈ”ÚudyF”—J¸•êà‚¢žl LJi°ù‘“SÉ…óÏ[¬b½Û…˜?‘ŒlžP†'Æl÷å·‚²Q¸”Bó¢˜PRä­‘á(‰Ä•Rx &Ph²‰nŒa8â:øtÅç:Ó1" ¨¥`Ð*Œï#¹1d¬‚ã•T¯¸B„ž±¸ñ'‹É„BA‘[#Ñ…Ø Å Œöy°Å26AP!0 fT9*ŠÇáⳓ ‹%õÌXÂÇž‰ä€’ Fœ;ò‰ŠJÃ#R)*\ áySNЃ¢ ¡´ÂG©,"¨ P–2Ä¿¨ö*4Ç‘ e´¦·¤íñ}‚ô&1I²a4†J¿r‰“hÂo§‘SJ˜Îzl“@²à žJ °9TðÚÃÒ£F6iñ„U=ˆ°3@’¼CyÂ1—¨ %ƒÎãbˆ‚ÁãPŽ…A9R"›ƒ¥*2ÁÄO&vˆÊ2;Fž0œ…BÁ…6Š#™BšÑ*DxQÍeŠ ~¯Ð¥Fžiåç«ì™æ‡´*B(¶Ù6땬Õ[ìÔ”OÌ@) !GŠÅ•Bx%§Á›c&qBSK„øüK2FöIE‘:FqPà‡ªÀ÷’ë¬5õ¼¡˜ Á'UY*RW¹®*¤èÉïOWføñãXæ«”yŠ&±'D%J· øürF#lΈ7…ha)ê‡6p/Tbž4HPâBª‰Ìå’xEÃ'Wù‹ bGª8Ì ‡G°ÒfZ+%~zd“1{à0ÍrÍ¡ÞlªÇÅ9BÁ¢PQ¨P”êH1ù„Ö+\F >œÂ*¯&Š,r”'ASóe èŸßª[ðW±ŒŽ=² É ?n@¯_Ñ7ˆ½`218 c`5LU«RhmÑŠé¦-ûÖÿß=ÿ¶êZÅЩÅR¬…Ûö\Ûo»öfÚÖ$ðBt‚!¼ñ!N:D ’AJ¢WI ëDø¤`dª¡FŠïøù}pïë wIN-9Ñïý–ì½îáë–]‘+—”³T6Û.~ðÛ€°]ÛUdÊ¡—M«cK…£ä-ÑUŒPÊ(K9þ}`¸jh†Š&aÜÆ7Ž=;ž˜"ý<¢ìo¿«sÄmù)'J¡É«ê Lx9Uæ 9³™z¦|¤´^ýö®È\uj M%ë·jc`b ® Wµ Ýðs•DšŠ©¥n>̬’> q ¦ª¸.rªøŠs@´CãU¤Ëœá ‡©|쥰¹ÑjRð« ¶VDh*¨ªâoCÐÇ^[êQXíL'‡œSÐcõ½hyÂO.a%©“çp±œšØ¹}ɵ‘(eÖ‚¤ÕöIS‚eò¥4Òö áiBñþ^@­P› !6D °‡à@í$³ÔÊᧉzF>\¶‚,(k„÷²Ð;iÜ ¢P%=0nè²A’†8Ál¥6P8*˾SI}Cv™mS—ÍN$²gkŠçªü÷$“‹!z\?~™&Î-ÛžÇ~ìþ ¹Påë¦ú’U|†³ š=™c’†sß}œ-š,F‹³ËãÐ2Ù«ÿô–0žYÄ#˜aîKÃäTí«9С ,f•¹4 }éý )ÚRHZƒ( ð4B܆„ï‰Qƒ=)jø)A‡'S ¾>Ô{Îðàç†lPM>jƒð‡à Ç5Tà@VC„¸ÃRU9¤ª2Í“Ä;.Ìbˆ™*šíñË)Î4à!Ê£6¦Ê0™øi"ô]ÓiÚ’Ÿ)Mb¹J¦}ó'íkß³æ1¨ù/k§êSJè22v.­}A¢)0¢áö†ˆP4Hç`íƒÈêÓ¦Ùµ |• ~Nöøôm”žüÈý¨/æq™MMÄî‰/R×bKVé0ŸDg[“å¼­\+ó†ïþP—ÆL8„´tǧÛ@3¬ß­]´ôê \3@ÓÌÏ*€òoäS"ÿíØEeì¼}ñD²LL)èDè ¡l‚¨Ù`ý£Ôˆ<‰ô¼:sоÕZ-7z AC¾%r™A§PÞD%ð­Æ>;™êu_>=ÕHDÁ‡FºòÃÁ}·íj_ÇšBÅ‹lÜt=sÐ"e艬Èÿìœ~R}‰·[²±ð6›H>"Xn('LI‰†ÓRä4n ÚØ|Ô>§&üžÂ騟lüOô Ÿ°®Ê¹J×ä5+åèšpT•hjý÷…}X‹Àµš¢¸›r–F½åLDžrŸT¤(ƒå‹{Nü7\ÓÀëû"sÊòdNâ7ü“æÃ™Òæ§ –•Ò8¿È¤çC’”ß Jʉv¹Â0n2 é8änSRsñ)ËÂBw’“Ô ä¤äÜ”n µÐ•Ü b¤TÑï<&É—ItžóSUíÙTç9ª=G´ãÛ—åZ`¼e|~Ë|¨ËuÐxÛã-mƒª…no=ùà”‹ÛÒ¼Ýé¤äƒn8'¾AÓ*þûçMtõ¸h/¨0ºJÚŽI¦cöÑQh)ÉÊ”³øˆ2î°‰”b')±™”lÀ$…)ä$…6èÀRX+)Îõ¦}_äE|rÓ×-7ËMZ‚Pb[§#m¨Z”MÐûáÖ&R’¯ ¥m¸´U×0-WÔM)L¼9*ƒ§N‰t¨ OÈ-—"f¥•&W4±“ÓÙÔ• µ½÷ª?Ag››_zk¯®yå¾`!Ö$j5ð—’è•]5ZÎD–‚4Rôk[M…T•ÙIK>˜HR5¶½ŸÁúê¾´G±&ÿÕ„ý½‰¯ª8µ=VR€ÃR•àtájÓ¥^¢½¯(ô¦Ä¨Ó½”´j^~xKÝæJv£^¨ówkí¥„±´gD}Õê®ÙÙl:OÓ¾OJ¾]h.‰)¢)m€2,n¼Tk¥|•‰ueËààl¹4ÀËå f¹âVn LİLŠ´ Ë WÕÏêQx ¤p[.Âô¹’o¥xËÓ-׃â\PY¶¶“íj¦+rª©eC—“š¯-—ƒ–èZ—ŒUÔ•Ä|ð¯^@¥h*"§P_LÊ(Œ…H¶K·2)fP%)¦KDR Àø)g “‚¤u5ÎÔ‰³?E“$“²vRtán”œÀ› OäM¢3z“é ÇIú„bƒS.;k¶ìR~ÃS)<9e÷$'éÉI|†rRŸœ”h¨b,' jfêqR  0Ieh>&!'I ”¤ȤF%)£!™”PrK*¼'-¨†•¹ k—Pe-zl¹4ØË•-yjÖ(dx2®è™À¬(W¿¼¤/M×AØ“ç­~ËãÕeúÞC¹õ3éР©»þ 0ÝÃ~ìŸý›_>W³{t?b_´rVº>Å& JÄf"[QH5³;púlRœaLDM%'Á&Ö1C¶ª;% ~…ËÇÄPce¨å¸Š×ˆåŸ.í÷[LŠ9 “Ò)X¾-=‹ç-–>'j¹è@õ"!k•‡;c/éiãÖo%)Ìa™s˜%ÜudþUpH&¯OQP2ûWŠ[,Jöɾšƒ2)æpCÊíC‡Û)9"!R¸þ{a›2ÜøÀ 73ßåL 7ò)û—‚çηÇJÓ—tšÜéò˜…'- +âòËr(‰´ÓÇ­¯Ž¾´—ªzÜëMåÔfËÈ¡DØLå)n&‰™Iœæãõ«?_4WSÍ-‹C]÷%ºB^X}¥]Ië®ÆÃ[ ò–›ðòÊ¥š~zû8)ù€µP‰ì B¹(žá›ÎIú†}Rùð'e,aÔȉîx‰òLTOöʾ B‡nËEf>]¨®¨/|íÂ[ù¥¶ýʼ=œLi6¾Ã³‚Jë?Ý6Ý~<7ö±A—ñ °’VûÔ6>xV7_&Þ’—6°Ô Íæ^Ÿ58Ԁ糆؈¸M0í>Ð(‘€mˆèÃ0h¬Ÿ^ÓºÜý¡¡ ~–'¾6$×éÒ_®ÍŠ¡ûzø9ç®,U¼]×0ë£ÁÄ„ >(çùÎG5ní ­ÿp0sbîG+ÜúêŸç<íü¤‰>:ŒÒj5Ö·=B¥¹BgëÔIÊ\ÇȺD³sê²Üñ½±5¥m&rEn®øE‹keqpÚN®Øm­4Z¥ace<™£\E)"¤ ‘)Fè áùÅG(GÑ@ )B¤Š‘¬·<Œ±`E£)¤‘"F b)ò4|Ä‚Q¤pDŠ)ˆ¥Ëãñ FQ4ÂB )b¤$––â#Œ£h …„!RÅHH,,OÅG(GÑ@ )B¤Š‘‘XXp–•Üͽk+c+$M{t,·¦ËSò´vÀ|È0³›•퀬¨ì¥mh#Ä!âñø>|{»«ŸàjÀ¬ü“ÁNF@„2e9Ê-ÒêhI»F¹ë0>K~¢B³Me8–…‹dh_´E«£%Z-9ªIÒÔhˆý¤m´ ¾-ùJÌd4”á(QF£ H>dxÉø&ƒjÉV>–tU¤hŒP¢2F|x@ødƒÉŒ&2œe€Ê”!)c»$•ÿ<¡|2ÁdF“ÃNhƒV¢ Z!”mXʌѤ?Ò†¬$“ÁbF~\÷+HÚ0ßa!Êc”)gÄO†µá«d0“ÑP†¡ jÃV¬eˆÊñAì!±6gLÆ4ád”F(aQèµF«2>|÷x€ªá» ÁïUhõB!"ˆfk¼â!¢"ˆDˆ\bFHX ÁáD„#B`åiñd–åC4@„"(³YÉ „Ç!>‚Ì"Y¡d!ˆYÄC”,`ˆˆ†ˆpB!"ˆB°`yC|Yk”p,ˆ"B!ˆe¤ÌcYâ¢!"‹ˆ‡´º$bFCx´øÕW!˜¢"ë?¢Ö‰Rø†‡h€"D"‰i1ú· ™\÷&õâÜèkGD€""—óÙËâT‹YA¢"ˆDˆ$b‰‹ÇãW>­‚!! Âj-hp†&ÙnÖgŪ®ŸÖÁÅ  ®á¬D„#B¯Å­°É „Ç!>ä˜ Íá„BD#Ï ¬cˆ†`pˆˆ"B!q‰!!°‚Â! ˆF„Á"åñdËú! „ˆ"F”A„g“YX Áá&³²¬!ˆ!eá`ˆˆ†ˆpB!"ˆM²y<|`CC4Y„–“fY,P!²eË $x>âCÊ,–%C4Y„k”„,™E²HÄÈ2Hìa‘rg0ÄDCD8å 3ˆÐDˆDbüÂ;FATšÖôyâ#!¢ "¬rh…EDUŽ­à‰Ú1…±g+ÇV C|4„C"@œJ6›%£Ï °TŽ?ÐXÁ¬ á„BD#Ï ëáøƒ²åÌ ÑˆDD1" <¢ñ! rÜ…ïgD€""/ÇV`DŒÉƒ–úÎrÎØØÚŸŸªrf]xH'_0¤œá÷]f4jó, B貸• Ç²Ù}ÄŽÑxoF;~fj´–ÉÍÜ›1”ëÞ³¯¾KKC›¬•ö¶]#UòC,,þ“:Î|º™­Í´®˜(xu3Ú„•£ŸVÏï/büJhØkáõP`\RQ+Ç›VÜþO7ùñ‚ðá©Î–U…õ³úˆY³}x×®±bÍT“ÜmƶeÝ> Ü9–õ\×ÈdYsÛHb­R¢Xí.©‰ç57~™…¡øú¸lÌ‘®ŸxtÚ{ÿĸp$ЈYErÑðñÃtãϵlõ¨ÀmqÏNáÿGµóyèûŸŸÓÙ-j1n1ŽëëŠQJÕØ{ƒÙZ z ºÊ±€Ýµm58oÁ× êZšHÂÛþ0nèyjä³(²õRúhî,ŒF'äLã¢&wˆ$¾É8ïÊIº¬§ælÑâøFàD˜ßñ‰Çí:úþ„â}„,‰’>%¬ˆm,$ŒÑ\[yÓI*%a‰¯·ß:uA¬Ùjl÷é~·Ÿq WŠ'aObXzî;¡I¼:ÃÃû¹£‰^ÅV›:›‰aÞzy:«qfsߟû¤°%‹†=¶sí©7Ó=Ί¤"7l¿à‰âÛ®¡£»m¹ löõP4…‚âºi?»½'•W‘¼]¬d°q)‘YM5µ&sæÀo/PÖ åŒ&sÔtÏ–é/ø€3hÊû> [+{“ó94†ºCZ‹ŒÖšwêÛ¾M!î­–VËÙè…À~§c盋j‡sú¨›V¥òë~ú|LxšïTÉælôü«ÉŒŽ~ÙÈÚ«:$vMÓ_1^ ÅXjìÁܶ¼íóå…Ä&® á¾Â1Õ탾'Î\¹Šiñã¦_‰¤Ç Þš£¼º'çb“ý_L#߆ ½Kš·`o˜hüÉ­æâ~Ðx"¢(æßã©(dxè ÎW¦WýM€©ÿå«Wªù”´µ`å¬|Y6°-FíM·C½Ö;ó_28Þù,ºwÞ½I¡¬}Ñඨ“íQËÞj¡èMë1ÉE{ߣyl=€éê%y”§GªQ5J%EÜÞ—ÿêJzäežÓˆž§é™ÍÏÍnö#8Þ"Êèævûâ¨Å*bAdhàâ56Ú¹QÑ1\¦ãŽY†:š¢ša¸óì–Ý3eÌs¦Ÿã3Í 5MìÞ­‹Zê¦:`›; ¥ÚV:œš”`îs?Ek$û Í>‹^7ýu1YÿÚ¾±~–­Ô0o&Ø1_Ö·§]!‘ÏcC“þ^GvÀJÂNM€à•ÔæOó­¼'ø&Í“l¬9¯ßcÙtÜêÛ’ ³´ØŠ˜‹Ì²º³‰áËäíMr|^´ýÝÎÜÃì4”ÖŠØÐ¼RÅM+‹D†3½eîù[Š÷?þq"5­µ_=Eÿr÷³T82²' |{š-[Q5~Ý@mÙ¼¶l»d‘®Å«f˜7žÌ³'œÕ·+ó×IÝ‚õõ¼%%­²Li‹Ôó ù ®q¯k5Š,†khùsvÂCjåPÙȯoæk½6_±Nbž×îñ±Ÿq0îuü3›„ÏV*¹‡Ø`ôZhGÖCÉ«—7XؾË^œ9†¬ÜrÛ—ÅΜ»ž„°¦1°Ó<ö"NrÆÃïÞž³ç·¼O«…ˆ (*ï¿SÑ}G¿¢¼„=×êz"îðʪ5#6´™¹Û[=ÊlwŸqʬAµäìØNæ´ÉЛ<Ë­ˆ4¶ùã²³`6GÀ^¾µ«bêú̸A¨žñ üþfÕ]iÿè“`à]cÚä ì*ÐÐYµx•ó-Ö¹ÁU=dR¿*ã¾âCléRQÛMgÊÞZàpqjé܆25z<âY<ÞðrÒrûî»:/¿XK]üoßE)jíÛïúyŠ·ÝÝÿ°ˆ?zv=ékŽÂoI'dOKñba\‚‘ká í¥X#È‹ÿtÓÂ!)ÂUpŠú€-|ðì}‚™H¨¤×<(,ô!²Ò/ʬmI Î *ØQ°³7Mw­dÚiM›èÌþq,¸jüjmËôM£FÄõ×hÑYÐß}Sï¼oG\àÞ7¿+¶çŠ-³xŸì² 9¢+JœU‹ÈÃïÚ=KR^mnô¥úáþ—W{§]Iäɬ¯%“,7~{vVþëÒØ\å”P× ßß'C5•Âʸôf–ó‹ªØ|ø”ý<€ë¥ŠçjíˆZ´É(K¼Ž¿“÷e0éò¸–Vx•Uí-]ëz×½ËÌp6îævÌõxäO· £'}¦uD˜ª¼zmAÛ ,õœ„JMvÑãØ×ŽàvÖÝ´v¾éÈÃÂŽÙ?ÞéôtÙ•Ê5¶+IÇ’úl¥éÍ“ÙA?|=ñÙ…‘o*ÁØâµ*íj\ƒ9ÀÛ·:à´Á] V‘àmàŽØö¦ §~}Þž__Dо™Í$%ñá³·ÝéVíŸÏ«Ã݇߬ÅÝøtÄ ßæBâž—šÌïÈb`þ¯²Ó•±¢+sí»_ôö·€vÂv_¬=]ëx—U“j?™Œµ¿cwµÚý¦…ªØ,W…Õ|æ`Ô@¸¶¿…ƒZæuÄ܃FIñì;©L˜þÔêôt¯^—á¼’NöÏø…wœ¶n-ù•ÍÔ)ÆÀ; ý„º~LY˜‰„·Ñ'Š_üÍv {GJÛ]’,ZòÞ^v¥oÖmï Pfîò(ÙŸT{}› ±ê*viwvñ­ÚøWõai{ƒ*ãfÕk».W–yš—ò7V-ÛYË,VÌÞuÈnqº–¥]ÞëÝùnyC{÷»¼k»ÝÚ{ˆÿÚq¿ßjÄò¶­;Ïok¾oî^Ȭ[»Ñn{;hdG%Öµ[gY³làã"[ëví.õUb½+Õ‰7=¬À[o\éÚ/ìK»Øº>gù:çÅQ8+6õ´qýò *ÔyÍ£(86*Yw-Ôðô°¸Úß?iêX*{gÛ}³¢ØÎ`‘ùŒâVߪ÷Ûìß[´¿äÑl®Ý)[‚Ù| ?ìN`ðþê×çxÍ”8ì æÌ<ÓÀB^ëƒus¡‚õ—åÅMÏmV8醯¨ ÆÅ¾«ß¦s˜{QÿK*Ußôü½KCSŸƒÛem‡¬}_—øÉož&ýÐ~fý{nKõ+.ùêÌé 0šƆ‡Ã³\Í^æý{ pö¡uÀF4þâÎ÷_vn·~Å*Ïâþ™¨÷¾¾²í£±x‡,« £­@¶½±ó}^ШÆ4ª”w=L}ï»áïÔXtý/Z3ƒMÝå뉜ÎýÁÛGu´y3w1ËVIÈûÝþ«55Òç?Ñm)•Ùò€ŠMÆCëÓ´/õ34æc—ð‹Ê[[÷õ¿¤Ú¾† ð„wiœÑ,ÀSÎÖogI3×@zÈ›sE+±(Ê›{”L1‹b¯ ¡ :wê YMŽÛ¿ØœÒïok~Ðq¤e,Ãk0^ŒHØ?:ëͺˆÁkTJéìÑSèÄËjÄlj.é¥×òø±lw¹²i¦ðº,‡ˆÐ¦ëH#i›œIi0 c¨>°UT"Æw¿ Œì ½Ù;'\= Bbèùx*$ ¾TÇ×è]×®”TÑïð8x|xïioîˆ÷ ìLn<ˆõœe=éòAÛH/í»ÖÒê)x}½qsê2 ©ˆ¼,ná{‰Ïç'½ós^}©¹µ,Q×¼j£6ï䯧U¥§¤o<  ^ú¨'µWg œÀc ¹-Ž‹¢,À¨Ò“Uãz£n¢®„åòÉþ~*DdÍíy¦Þ·fyyõÏ¿_r6 1\ãö à¼ûSˆÁ]ÞGÝC{SÅÞ§àNB™qÏ+ŒÑŸýÖ%¦öñpægæT¬ÑÍ;²¡çŽ!´×º]ˆNñL$Æã?t{ýµ{F ÐØM­Ø,תխñ*£4ñ+_6é¡êaÛô1Cµ?ŠÁ.Ÿ™+úk Òwdç¿ðæk˜°36´5›€ØöþÅ·VrK¡òý¶5~‰åwzÉUÎÆ=Páå‘7¡ú˜v«¦Ä2û˪kBÇžcóOž gIs±—ñÀÐÌþ­¦j>Ö‰/2¾œñÜ™v`½ë1ûÒÞØÙßǼ-° ·õb<2 ŠÛæ¥o+3•­LªÿVæÕÿ+“÷Êl÷ßÊtûß뼌 ßn˜>¸ìÝpÚ›Þànïçëó¿”H Æ„Ã÷^hzZß9!N=îlBÃÀ¼—„· ŧ÷öiÆÛ›Ì*´Ð:œã®Ù><~¼Òdãc•öIñ¡7'ŽšÎú¬ íû·Y@Fˆq+6ëØâûV¡{t÷ÑFý²²ãö-ýöÅw¥6†‡ÕñÄ8o ÐÍvÝÉJ놾®>–ñ}â·V&‰ »à¨–`ÏîQm4µ!£®¸»ÂÁTÛäû‘ô‡öJY²Œ 1 m³en4Ù]yž¤íÖ¿_åÙ!¨[ W/ ¾žó¾ˆ„ž€‹M‚1aÇ$ fTÀXQÇÂTtëlÜÏó¨qeý¿3d¯¨á(ð˜­tx^7 õR¾o=€:%Ctµ1òVÆÄ”‡µ oÁãÔ«ñlB'èÖgãþɆª=«ê†M4-mеj¾m3¤¬âª8h;ÎFÇbU ÄÎÚ ²8!ã®Ð”ŽqZ#†ê¢"dO}7¥bËXMsËý=ào²Réó'Lûj{íàëmá)Ј;¼ÈÚÕ®–Œ´‚$˜ãæ¡öîAR‘öªRª´¥b½I¥*ZU>KT$ª E•POŠ*Þªª¨u¨PwUwU6†åï=â¤*Æó}çúošÞ¦Á^Œ!;á¿%–ÜMXöù—/CGpþ¢ ª£J?9¯‹õÿ°:¸?CÇü˜ªC^TaÀò‡¬«Õ>‡aS¥Vaë¡K*0=Síe˜XR¢B÷*ü†a9œ ‡ý¡,•ûc3ªé^ÌRíĪ9í¦RÜk¥"â^ »…0¨q…°¨lö°ì¬X!{˜ÖUUîjªÂ¿°¦£ÒJ°Â‚íSUS>L½Ôð‡?¥Há0Õ•”`û_ˆ(¸Çc¡! TAtÿTÿÂSåIÃæí´ñaØ9œvá?Æ6$aÕMþ“‡©HO‚†çI˜ÿ˜ÊNz –9S~‡}´i´ÃaÕ™ô>ì)ª“†‡Þ´¤aaÙÔ¤ùaöL`§ê5²\h¿,±XÅb‹X,b±‹Å,±XÅb‹X,b±‹Å,±XÅb‹X,b±‹Å,±XÅb‹X,b±‹Å,±XÅb‹X,b±‹Å,±XÅb‹X,b±‹Å,±XÅb‹X,b±‹Å,±XØÿ€./gprolog-1.3.0/doc/pl-bips.tex0000644004425400513100000111157610547152501014642 0ustar diazloco\newpage \section{Prolog built-in predicates} %HEVEA\cutdef[1]{subsection} \subsection{Type testing} \subsubsection{\texttt{var/1}, \texttt{nonvar/1}, \texttt{atom/1}, \texttt{integer/1}, \texttt{float/1}, \texttt{number/1}, \texttt{atomic/1}, \\ \texttt{compound/1}, \texttt{callable/1}, \texttt{list/1}, \texttt{partial\_list/1}, \texttt{list\_or\_partial\_list/1}} \label{var/1} \AddPBD{var/1} \AddPBD{nonvar/1} \AddPBD{atom/1} \AddPBD{integer/1} \AddPBD{float/1} \AddPBD{number/1} \AddPBD{atomic/1} \AddPBD{compound/1} \AddPBD{callable/1} \AddPBD{list/1} \AddPBD{partial\_list/1} \AddPBD{list\_or\_partial\_list/1} \begin{TemplatesTwoCols} var(?term)\\ nonvar(?term)\\ atom(?term)\\ integer(?term)\\ float(?term)\\ number(?term)\\ atomic(?term)\\ compound(?term)\\ callable(?term)\\ list(?term)\\ partial\_list(?term)\\ list\_or\_partial\_list(?term) \end{TemplatesTwoCols} \Description \texttt{var(Term)} succeeds if \texttt{Term} is currently uninstantiated (which therefore has not been bound to anything, except possibly another uninstantiated variable). \texttt{nonvar(Term)} succeeds if \texttt{Term} is currently instantiated (opposite of \texttt{var/1}). \texttt{atom(Term)} succeeds if \texttt{Term} is currently instantiated to an atom. \texttt{integer(Term)} succeeds if \texttt{Term} is currently instantiated to an integer. \texttt{float(Term)} succeeds if \texttt{Term} is currently instantiated to a floating point number. \texttt{number(Term)} succeeds if \texttt{Term} is currently instantiated to an integer or a floating point number. \texttt{atomic(Term)} succeeds if \texttt{Term} is currently instantiated to an atom, an integer or a floating point number. \texttt{compound(Term)} succeeds if \texttt{Term} is currently instantiated to a compound term, i.e. a term of arity $>$ 0 (a list or a structure). \texttt{callable(Term)} succeeds if \texttt{Term} is currently instantiated to a callable term, i.e. an atom or a compound term. \texttt{list(Term)} succeeds if \texttt{Term} is currently instantiated to a list, i.e. the atom \texttt{[]} (empty list) or a term with principal functor \texttt{'.'/2} and with second argument (the tail) a list. \texttt{partial\_list(Term)} succeeds if \texttt{Term} is currently instantiated to a partial list, i.e. a variable or a term whose the main functor is \texttt{'.'/2} and the second argument (the tail) is a partial list. \texttt{list\_or\_partial\_list(Term)} succeeds if \texttt{Term} is currently instantiated to a list or a partial list. \PlErrorsNone \Portability \texttt{var/1}, \texttt{nonvar/1}, \texttt{atom/1}, \texttt{integer/1}, \texttt{float/1}, \texttt{number/1}, \texttt{atomic/1}, \texttt{compound/1} and \texttt{callable/1} are ISO predicates. \texttt{list/1}, \texttt{partial\_list/1} and \texttt{list\_or\_partial\_list/1} are GNU Prolog predicates. \subsection{Term unification} \subsubsection{\texttt{(=)/2} - Prolog unification} \AddPBD{(=)/2} \begin{TemplatesOneCol} =(?term, ?term) \end{TemplatesOneCol} \Description \texttt{Term1 = Term2} unifies \texttt{Term1} and \texttt{Term2}. No occurs check is done, i.e. this predicate does not check if a variable is unified with a compound term containing this variable (this can lead to an infinite loop). \texttt{=} is a predefined infix operator \RefSP{op/3:(Term-input/output)}. \PlErrorsNone \Portability ISO predicate. \subsubsection{\texttt{unify\_with\_occurs\_check/2}} \AddPBD{unify\_with\_occurs\_check/2} \begin{TemplatesOneCol} unify\_with\_occurs\_check(?term, ?term) \end{TemplatesOneCol} \Description \texttt{unify\_with\_occurs\_check(Term1, Term2)} unifies \texttt{Term1} and \texttt{Term2}. The occurs check test is done (i.e. the unification fails if a variable is unified with a compound term containing this variable). \PlErrorsNone \Portability ISO predicate. \subsubsection{\texttt{({\bs}=)/2} - not Prolog unifiable} \AddPBD{({\bs}=)/2} \begin{TemplatesOneCol} {\bs}=(?term, ?term) \end{TemplatesOneCol} \Description \texttt{Term1 {\bs}= Term2} succeeds if \texttt{Term1} and \texttt{Term2} are not unifiable (no occurs check is done). \texttt{{\bs}=} is a predefined infix operator \RefSP{op/3:(Term-input/output)}. \PlErrorsNone \Portability ISO predicate. \subsection{Term comparison} \subsubsection{Standard total ordering of terms} \label{Standard-total-ordering-of-terms} The built-in predicates described in this section allows the user to compare Prolog terms. Prolog terms are totally ordered according to the standard total ordering of terms which is as follows (from the smallest term to the greatest): \begin{itemize} \item variables, oldest first. \item finite domain variables \RefSP{Finite-Domain-variables}, oldest first. \item floating point numbers, in numeric order. \item integers, in numeric order. \item atoms, in alphabetical (i.e. character code) order. \item compound terms, ordered first by arity, then by the name of the principal functor and by the arguments in left-to-right order. \end{itemize} A list is treated as a compound term (whose principal functor is \texttt{'.'/2}). The portability of the order of variables is not guaranteed (in the ISO reference the oder of variables is system dependent). \subsubsection{\texttt{(==)/2} - term identical, \texttt{({\bs}==)/2} - term not identical, \\ \texttt{(@{\lt})/2} - term less than, \texttt{(@={\lt})/2} - term less than or equal to, \\ \texttt{(@{\gt})/2} - term greater than, \texttt{(@{\gt}=)/2} - term greater than or equal to} \label{(==)/2} \AddPBD{(==)/2} \AddPBD{({\bs}==)/2} \AddPBD{("@{\lt})/2} \AddPBD{("@={\lt})/2} \AddPBD{("@{\gt})/2} \AddPBD{("@{\gt}=)/2} \begin{TemplatesTwoCols} ==(?term, ?term)\\ {\bs}==(?term, ?term) \\ @{\lt}(?term, ?term) \\ @={\lt}(?term, ?term)\\ @{\gt}(?term, ?term)\\ @{\gt}=(?term, ?term) \end{TemplatesTwoCols} \Description These predicates compare two terms according to the standard total ordering of terms \RefSP{Standard-total-ordering-of-terms}. \texttt{Term1 == Term2} succeeds if \texttt{Term1} and \texttt{Term2} are equal. \texttt{Term1 {\bs}== Term2} succeeds if \texttt{Term1} and \texttt{Term2} are different. \texttt{Term1 @{\lt} Term2} succeeds if \texttt{Term1} is less than \texttt{Term2}. \texttt{Term1 @={\lt} Term2} succeeds if \texttt{Term1} is less than or equal to \texttt{Term2}. \texttt{Term1 @{\gt} Term2} succeeds if \texttt{Term1} is greater than \texttt{Term2}. \texttt{Term1 @{\gt}= Term2} succeeds if \texttt{Term1} is greater than or equal to \texttt{Term2}. \texttt{==}, \texttt{{\bs}==}, \texttt{@{\lt}}, \texttt{@={\lt}}, \texttt{@{\gt}} and \texttt{@{\gt}=} are predefined infix operators \RefSP{op/3:(Term-input/output)}. \PlErrorsNone \Portability ISO predicates. \subsubsection{\texttt{compare/3}} \AddPBD{compare/3} \begin{TemplatesOneCol} compare(?atom, +term, +term) \end{TemplatesOneCol} \Description \texttt{compare(Result, Term1, Term2)} compares \texttt{Term1} and \texttt{Term2} according to the standard \RefSP{Standard-total-ordering-of-terms} and unifies \texttt{Result} with: \begin{itemize} \item the atom \texttt{{\lt}} if \texttt{Term1} is less than \texttt{Term2}. \item the atom \texttt{=} if \texttt{Term1} and \texttt{Term2} are equal. \item the atom \texttt{{\gt}} if \texttt{Term1} is greater than \texttt{Term2}. \end{itemize} \begin{PlErrors} \ErrCond{\texttt{Result} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Result)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{Term processing} \subsubsection{\texttt{functor/3}} \AddPBD{functor/3} \begin{TemplatesOneCol} functor(+nonvar, ?atomic, ?integer)\\ functor(-nonvar, +atomic, +integer) \end{TemplatesOneCol} \Description \texttt{functor(Term, Name, Arity)} succeeds if the principal functor of \texttt{Term} is \texttt{Name} and its arity is \texttt{Arity}. This predicate can be used in two ways: \begin{itemize} \item \texttt{Term} is not a variable: extract the name (an atom or a number if \texttt{Term} is a number) and the arity of \texttt{Term} (if \texttt{Term} is atomic \texttt{Arity} = 0). \item \texttt{Term} is a variable: unify \texttt{Term} with a general term whose principal functor is given by \texttt{Name} and arity is given by \texttt{Arity}. \end{itemize} \begin{PlErrors} \ErrCond{\texttt{Term} and \texttt{Name} are both variables} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Term} and \texttt{Arity} are both variables} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Term} is a variable and \texttt{Name} is neither a variable nor an atomic term} \ErrTerm{type\_error(atomic, Name)} \ErrCond{\texttt{Term} is a variable and \texttt{Arity} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Arity)} \ErrCond{\texttt{Term} is a variable, \texttt{Name} is a constant but not an atom and \texttt{Arity} is an integer $>$ 0} \ErrTerm{type\_error(atom, Name)} \ErrCond{\texttt{Term} is a variable and \texttt{Arity} is an integer $>$ \texttt{max\_arity} flag \RefSP{set-prolog-flag/2}} \ErrTerm{representation\_error(max\_arity)} \ErrCond{\texttt{Term} is a variable and \texttt{Arity} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Arity)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{arg/3}} \AddPBD{arg/3} \begin{TemplatesOneCol} arg(+integer, +compound\_term, ?term) \end{TemplatesOneCol} \Description \texttt{arg(N, Term, Arg)} succeeds if the \texttt{N}\emph{th} argument of \texttt{Term} is \texttt{Arg}. \begin{PlErrors} \ErrCond{\texttt{N} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Term} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{N} is neither a variable nor an integer} \ErrTerm{type\_error(integer, N)} \ErrCond{\texttt{Term} is neither a variable nor a compound term} \ErrTerm{type\_error(compound, Term)} \ErrCond{\texttt{N} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, N)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{(=..)/2} - univ} \AddPBD{(=..)/2} \begin{TemplatesOneCol} =..(+nonvar, ?list)\\ =..(-nonvar, +list) \end{TemplatesOneCol} \Description \texttt{Term =.. List} succeeds if \texttt{List} is a list whose head is the atom corresponding to the principal functor of \texttt{Term} and whose tail is a list of the arguments of \texttt{Term}. \texttt{=..} is a predefined infix operator \RefSP{op/3:(Term-input/output)}. \begin{PlErrors} \ErrCond{\texttt{Term} is a variable and \texttt{List} is a partial list} \ErrTerm{instantiation\_error} \ErrCond{\texttt{List} is neither a partial list nor a list} \ErrTerm{type\_error(list, List)} \ErrCond{\texttt{Term} is a variable and \texttt{List} is a list whose head is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{List} is a list whose head \texttt{H} is neither an atom nor a variable and whose tail is not the empty list} \ErrTerm{type\_error(atom, H)} \ErrCond{\texttt{List} is a list whose head \texttt{H} is a compound term and whose tail is the empty list} \ErrTerm{type\_error(atomic, H)} \ErrCond{\texttt{Term} is a variable and \texttt{List} is the empty list} \ErrTerm{domain\_error(non\_empty\_list, [])} \ErrCond{\texttt{Term} is a variable and the tail of \texttt{List} has a length $>$ \texttt{max\_arity} flag \RefSP{set-prolog-flag/2}} \ErrTerm{representation\_error(max\_arity)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{copy\_term/2}} \AddPBD{copy\_term/2} \begin{TemplatesOneCol} copy\_term(?term, ?term) \end{TemplatesOneCol} \Description \texttt{copy\_term(Term1, Term2)} succeeds if \texttt{Term2} unifies with a term \texttt{T} which is a renamed copy of \texttt{Term1}. \PlErrorsNone \Portability ISO predicate. \subsubsection{\texttt{setarg/4}, \texttt{setarg/3}} \AddPBD{setarg/4} \AddPBD{setarg/3} \begin{TemplatesOneCol} setarg(+integer, +compound\_term, +term, +boolean)\\ setarg(+integer, +compound\_term, +term) \end{TemplatesOneCol} \Description \texttt{setarg(N, Term, NewValue, Undo)} replaces destructively the \texttt{N}\emph{th} argument of \texttt{Term} with \texttt{NewValue}. This assignment is undone on backtracking if \texttt{Undo} = \texttt{true}. This should only used if there is no further use of the old value of the replaced argument. If \texttt{Undo} = \texttt{false} then \texttt{NewValue} must be either an atom or an integer. \texttt{setarg(N, Term, NewValue)} is equivalent to \texttt{setarg(N, Term, NewValue, true)}. \begin{PlErrors} \ErrCond{\texttt{N} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{N} is neither a variable nor an integer} \ErrTerm{type\_error(integer, N)} \ErrCond{\texttt{N} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, N)} \ErrCond{\texttt{Term} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Term} is neither a variable nor a compound term} \ErrTerm{type\_error(compound, Term)} \ErrCond{\texttt{NewValue} is neither an atom nor an integer and \texttt{Undo} = \texttt{false}} \ErrTerm{type\_error(atomic, NewValue)} \ErrCond{\texttt{Undo} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Undo} is neither a variable nor a boolean} \ErrTerm{type\_error(boolean, Undo)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{Variable naming/numbering} \label{Variable-naming/numbering} \subsubsection{\texttt{name\_singleton\_vars/1}} \label{name-singleton-vars/1} \AddPBD{name\_singleton\_vars/1} \begin{TemplatesOneCol} name\_singleton\_vars(?term) \end{TemplatesOneCol} \Description \texttt{name\_singleton\_vars(Term)} binds each singleton variable appearing in \texttt{Term} with a term of the form \texttt{'\$VARNAME'('\_')}. Such a term can be output by \texttt{write\_term/3} as a variable name \RefSP{write-term/3}. \PlErrorsNone \Portability GNU Prolog predicates. \subsubsection{\texttt{name\_query\_vars/2}} \label{name-query-vars/2} \AddPBD{name\_query\_vars/2} \begin{TemplatesOneCol} name\_query\_vars(+list, ?list) \end{TemplatesOneCol} \Description \texttt{name\_query\_vars(List, Rest)} for each element of \texttt{List} of the form \texttt{Name = Var} where \texttt{Name} is an atom and \texttt{Var} a variable, binds \texttt{Var} with the term \texttt{'\$VARNAME'(Name)}. Such a term can be output by \texttt{write\_term/3} as a variable name \RefSP{write-term/3}. \texttt{Rest} is unified with the list of elements of \texttt{List} that have not given rise to a binding. This predicate is provided as a way to name the variable lists obtained returned by \texttt{read\_term/3} with \IdxPO[variable\_names]{variable\_names(List)} or \IdxPO[singletons]{singletons(List)} options \RefSP{read-term/3}. \begin{PlErrors} \ErrCond{\texttt{List} is a partial list} \ErrTerm{instantiation\_error} \ErrCond{\texttt{List} is neither a partial list nor a list} \ErrTerm{type\_error(list, List)} \ErrCond{\texttt{Rest} is neither a partial list nor a list} \ErrTerm{type\_error(list, Rest)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{bind\_variables/2}, \texttt{numbervars/3}, \texttt{numbervars/1}} \label{bind-variables/2} \AddPBD{bind\_variables/2} \AddPBD{numbervars/3} \AddPBD{numbervars/1} \begin{TemplatesOneCol} bind\_variables(?term, +var\_binding\_option\_list)\\ numbervars(?term, +integer, ?integer)\\ numbervars(?term) \end{TemplatesOneCol} \Description \texttt{bind\_variables(Term, Options)} binds each variable appearing in \texttt{Term} according to the options given by \texttt{Options}. \SPart{Variable binding options}: \texttt{Options} is a list of variable binding options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are: \begin{itemize} \item \IdxPOD{numbervars}: specifies that each variable appearing in \texttt{Term} should be bound to a term of the form \texttt{'\$VAR'(N)} where \texttt{N} is an integer. Such a term can be output by \texttt{write\_term/3} as a variable name \RefSP{write-term/3}. This is the default. \item \IdxPOD{namevars}: specifies that each variables appearing in \texttt{Term} shall be bound to a term of the form \texttt{'\$VARNAME'(Name)} where \texttt{Name} is the atom that would be output by \texttt{write\_term/3} seeing a term of the \texttt{'\$VAR'(N)} where \texttt{N} is an integer. Such a term can be output by \texttt{write\_term/3} as a variable name \RefSP{write-term/3}. This is the alternative to \texttt{numbervars}. \item \IdxPOD[from]{from(From)}: the first integer \texttt{N} to use for number/name variables of \texttt{Term} is \texttt{From}. The default value is \texttt{0}. \item \IdxPOD[next]{next(Next)}: when \texttt{bind\_variables/2} succeeds, \texttt{Next} is unified with the (last integer \texttt{N})+1 used to bind the variables of \texttt{Term}. \item \IdxPOD[exclude]{exclude(List)}: collects all variable names appearing in \texttt{List} to avoid a clash when binding a variable of \texttt{Term}. Precisely a number \texttt{N} $\geq$ \texttt{From} will not be used to bind a variable of \texttt{Term} if: \begin{itemize} \item there is a sub-term of \texttt{List} of the form \texttt{'\$VAR'(N)} or \texttt{'\$VARNAME'(Name)} where \texttt{Name} is the constant that would be output by \texttt{write\_term/3} seeing a term of the \texttt{'\$VAR'(N)}. \item an element of \texttt{List} is of the form \texttt{Name = Var} where \texttt{Name} is an atom that would be output by \texttt{write\_term/3} on seeing a term of the from \texttt{'\$VAR'(N)}. This case allows for lists returned by \texttt{read\_term/3} (with \IdxPO[variable\_names]{variable\_names(List)} or \IdxPO[singletons]{singletons(List)} options) \RefSP{read-term/3} and by \texttt{name\_query\_vars/2} \RefSP{name-query-vars/2}. \end{itemize} \end{itemize} \texttt{numbervars(Term, From, Next)} is equivalent to \texttt{bind\_variables(Term, [from(From), next(Next)]}, i.e. each variable of \texttt{Term} is bound to \texttt{'\$VAR'(N)} where \texttt{From $\leq$} \texttt{N} $<$ \texttt{Next}. \texttt{numbervars(Term)} is equivalent to \texttt{numbervars(Term, 0, \_)}. \begin{PlErrors} \ErrCond{\texttt{Options} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Options} is neither a partial list nor a list} \ErrTerm{type\_error(list, Options)} \ErrCond{an element \texttt{E} of the \texttt{Options} list is neither a variable nor a variable binding option} \ErrTerm{domain\_error(var\_binding\_option, E)} \ErrCond{\texttt{From} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{From} is neither a variable nor an integer} \ErrTerm{type\_error(integer, From)} \ErrCond{\texttt{Next} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Next)} \ErrCond{\texttt{List} is a partial list} \ErrTerm{instantiation\_error} \ErrCond{\texttt{List} is neither a partial list nor a list} \ErrTerm{type\_error(list, List)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{term\_ref/2}} \AddPBD{term\_ref/2} \begin{TemplatesOneCol} term\_ref(+term, ?integer)\\ term\_ref(?term, +integer) \end{TemplatesOneCol} \Description \texttt{term\_ref(Term, Ref)} succeeds if the internal reference of \texttt{Term} is \texttt{Ref}. This predicate can be used either to obtain the internal reference of a term or to obtain the term associated with a given reference. Note that two identical terms can have different internal references. A good way to use this predicate is to first record the internal reference of a given term and to later re-obtain the term via this reference. \begin{PlErrors} \ErrCond{\texttt{Term} and \texttt{Ref} are both variables} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Ref} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Ref)} \ErrCond{\texttt{Ref} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Ref)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{Arithmetic} \subsubsection{Evaluation of an arithmetic expression} \label{Evaluation-of-an-arithmetic-expression} An arithmetic expression is a Prolog term built from numbers, variables, and functors (or operators) that represent arithmetic functions. When an expression is evaluated each variable must be bound to a non-variable expression. An expression evaluates to a number, which may be an integer or a floating point number. The following table details the components of an arithmetic expression, how they are evaluated, the types expected/returned and if they are ISO or an extension: \begin{tabular}{|l|L{7.4cm}|c|c|} \hline Expression & Result = \textit{eval}(Expression) & Signature & ISO \\ \hline\hline Variable & must be bound to a non-variable expression \texttt{E}. \linebreak The result is \textit{eval}(\texttt{E}) & IF $\rightarrow$ IF & Y \\ \hline integer number & this number & I $\rightarrow$ I & Y \\ \hline floating point number & this number & F $\rightarrow$ F & Y \\ \hline \texttt{+ E} & \textit{eval}(\texttt{E}) & IF $\rightarrow$ IF & N \\ \hline \texttt{- E} & - \textit{eval}(\texttt{E}) & IF $\rightarrow$ IF & Y \\ \hline \texttt{inc(E)} & \textit{eval}(\texttt{E}) + 1 & IF $\rightarrow$ IF & N \\ \hline \texttt{dec(E)} & \textit{eval}(\texttt{E}) - 1 & IF $\rightarrow$ IF & N \\ \hline \texttt{E1 + E2} & \textit{eval}(\texttt{E1}) + \textit{eval}(\texttt{E2}) & IF, IF $\rightarrow$ IF & Y \\ \hline \texttt{E1 - E2} & \textit{eval}(\texttt{E1}) - \textit{eval}(\texttt{E2}) & IF, IF $\rightarrow$ IF & Y \\ \hline \texttt{E1 * E2} & \textit{eval}(\texttt{E1}) * \textit{eval}(\texttt{E2}) & IF, IF $\rightarrow$ IF & Y \\ \hline \texttt{E1 / E2} & \textit{eval}(\texttt{E1}) / \textit{eval}(\texttt{E2}) & IF, IF $\rightarrow$ F & Y \\ \hline \texttt{E1 // E2} & \textit{rnd}(\textit{eval}(\texttt{E1}) / \textit{eval}(\texttt{E2})) & I, I $\rightarrow$ I & Y \\ \hline \texttt{E1 rem E2} & \textit{eval}(\texttt{E1}) - (\textit{rnd}(\textit{eval}(\texttt{E1}) / \textit{eval}(\texttt{E2}))*\textit{eval}(\texttt{E2})) & I, I $\rightarrow$ I & Y \\ \hline \texttt{E1 mod E2} & \textit{eval}(\texttt{E1}) - ( $\lfloor$\textit{eval}(\texttt{E1}) / \textit{eval}(\texttt{E2})$\rfloor$ *\textit{eval}(\texttt{E2})) & I, I $\rightarrow$ I & Y \\ \hline \texttt{E1 /{\bs} E2} & \textit{eval}(\texttt{E1}) bitwise\_and \textit{eval}(\texttt{E2}) & I, I $\rightarrow$ I & Y \\ \hline \texttt{E1 {\bs}/ E2} & \textit{eval}(\texttt{E1}) bitwise\_or \textit{eval}(\texttt{E2}) & I, I $\rightarrow$ I & Y \\ \hline \texttt{E1 \^{} E2} & \textit{eval}(\texttt{E1}) bitwise\_xor \textit{eval}(\texttt{E2}) & I, I $\rightarrow$ I & N \\ \hline \texttt{{\bs} E} & bitwise\_not \textit{eval}(\texttt{E}) & I $\rightarrow$ I & Y \\ \hline \texttt{E1 {\lt}{\lt} E2} & \textit{eval}(\texttt{E1}) integer\_shift\_left \textit{eval}(\texttt{E2}) & I, I $\rightarrow$ I & Y \\ \hline \texttt{E1 {\gt}{\gt} E2} & \textit{eval}(\texttt{E1}) integer\_shift\_right \textit{eval}(\texttt{E2}) & I, I $\rightarrow$ I & Y \\ \hline \texttt{abs(E)} & absolute value of \textit{eval}(\texttt{E}) & IF $\rightarrow$ IF & Y \\ \hline \texttt{sign(E)} & sign of \textit{eval}(\texttt{E}) (-1 if $<$ 0, 0 if = 0, +1 if $>$ 0) & IF $\rightarrow$ IF & Y \\ \hline \texttt{min(E1,E2)} & minimal value between \textit{eval}(\texttt{E1}) and \textit{eval}(\texttt{E2}) & IF, IF $\rightarrow$ ? & N \\ \hline \texttt{max(E1,E2)} & maximal value between \textit{eval}(\texttt{E1}) and \textit{eval}(\texttt{E2}) & IF, IF $\rightarrow$ ? & N \\ \hline \texttt{E1 ** E2} & \textit{eval}(\texttt{E1}) raised to the power of \textit{eval}(\texttt{E2}) & IF, IF $\rightarrow$ F & Y \\ \hline \texttt{sqrt(E)} & square root of \textit{eval}(\texttt{E}) & IF $\rightarrow$ F & Y \\ \hline \texttt{atan(E)} & arc tangent of \textit{eval}(\texttt{E}) & IF $\rightarrow$ F & Y \\ \hline \texttt{cos(E)} & cosine of \textit{eval}(\texttt{E}) & IF $\rightarrow$ F & Y \\ \hline \texttt{acos(E)} & arc cosine of \textit{eval}(\texttt{E}) & IF $\rightarrow$ F & N \\ \hline \texttt{sin(E)} & sine of \textit{eval}(\texttt{E}) & IF $\rightarrow$ F & Y \\ \hline \texttt{asin(E)} & arc sine of \textit{eval}(\texttt{E}) & IF $\rightarrow$ F & N \\ \hline \texttt{exp(E)} & $e$ raised to the power of \textit{eval}(\texttt{E}) & IF $\rightarrow$ F & Y \\ \hline \texttt{log(E)} & natural logarithms of \textit{eval}(\texttt{E}) & IF $\rightarrow$ F & Y \\ \hline \texttt{float(E)} & the floating point number equal to \textit{eval}(\texttt{E}) & IF $\rightarrow$ F & Y \\ \hline \texttt{ceiling(E)} & rounds \textit{eval}(\texttt{E}) upward to the nearest integer & F $\rightarrow$ I & Y \\ \hline \texttt{floor(E)} & rounds \textit{eval}(\texttt{E}) downward to the nearest integer & F $\rightarrow$ I & Y \\ \hline \texttt{round(E)} & rounds \textit{eval}(\texttt{E}) to the nearest integer & F $\rightarrow$ I & Y \\ \hline \texttt{truncate(E)} & the integer value of \textit{eval}(\texttt{E}) & F $\rightarrow$ I & Y \\ \hline \texttt{float\_fractional\_part(E)} & the float equal to the fractional part of \textit{eval}(\texttt{E}) & F $\rightarrow$ F & Y \\ \hline \texttt{float\_integer\_part(E)} & the float equal to the integer part of \textit{eval}(\texttt{E}) & F $\rightarrow$ F & Y \\ \hline \end{tabular} The meaning of the signature field is as follows: \begin{itemize} \item I $\rightarrow$ I: unary function, the operand must be an integer and the result is an integer. \item F $\rightarrow$ F: unary function, the operand must be a floating point number and the result is a floating point number. \item F $\rightarrow$ I: unary function, the operand must be a floating point number and the result is an integer. \item IF $\rightarrow$ F: unary function, the operand can be an integer or a floating point number and the result is a floating point number. \item IF $\rightarrow$ IF: unary function, the operand can be an integer or a floating point number and the result has the same type as the operand. \item I, I $\rightarrow$ I: binary function: each operand must be an integer and the result is an integer. \item IF, IF $\rightarrow$ IF: binary function: each operand can be an integer or a floating point number and the result is a floating point number if at least one operand is a floating point number, an integer otherwise. \item IF, IF $\rightarrow$ ?: binary function: each operand can be an integer or a floating point number and the result has the same type as the selected operand. This is used for \texttt{min} and \texttt{max}. Note that in case of equality between an integer and a floating point number the result is an integer. \end{itemize} \texttt{is}, \texttt{+}, \texttt{-}, \texttt{*}, \texttt{//}, \texttt{/}, \texttt{rem}, and \texttt{mod} are predefined infix operators. \texttt{+} and \texttt{-} are predefined prefix operators \RefSP{op/3:(Term-input/output)}. \SPart{Integer division rounding function}: the integer division rounding function \texttt{\textit{rnd}(X)} rounds the floating point number \texttt{X} to an integer. There are two possible definitions (depending on the target machine) for this function which differ on negative numbers: \begin{itemize} \item \texttt{\textit{rnd}(X)} = integer part of \texttt{X}, e.g. \texttt{\textit{rnd}(-1.5)} = \texttt{-1} (round toward 0) \item \texttt{\textit{rnd}(X)} = $\lfloor$\texttt{X}$\rfloor$, e.g. \texttt{\textit{rnd}(-1.5)} = \texttt{-2} (round toward $-\infty$) \end{itemize} The definition of this function determines the precise definition of the integer division \texttt{(//)/2} and of the integer remainder \texttt{(rem)/2}. Rounding toward zero is the most common case. In any case it is possible to test the value (\texttt{toward\_zero} or \texttt{down}) of the \IdxPF{integer\_rounding\_function} \Idx{Prolog flag} to determine which function being used \RefSP{set-prolog-flag/2}. \SPart{Fast mathematical mode}: in order to speed-up integer computations, the GNU Prolog compiler can generate faster code when invoked with the \IdxK{--fast-math} option \RefSP{Using-the-compiler}. In this mode only integer operations are allowed and a variable in an expression must be bound at evaluation time to an integer. No type checking is done. \begin{PlErrors} \ErrCond{a sub-expression \texttt{E} is a variable} \ErrTerm{instantiation\_error} \ErrCond{a sub-expression \texttt{E} is neither a number nor an evaluable functor} \ErrTerm{type\_error(evaluable, E)} \ErrCond{a sub-expression \texttt{E} is a floating point number while an integer is expected} \ErrTerm{type\_error(integer, E)} \ErrCond{a sub-expression \texttt{E} is an integer while a floating point number is expected} \ErrTerm{type\_error(float, E)} \ErrCond{a division by zero occurs} \ErrTerm{evaluation\_error(zero\_divisor)} \end{PlErrors} \Portability Refer to the above table to determine which evaluable functors are ISO and which are GNU Prolog extensions. For efficiency reasons, GNU Prolog does not detect the following ISO arithmetic errors: \texttt{float\_overflow}, \texttt{int\_overflow, int\_underflow}, and \texttt{undefined}. \subsubsection{\texttt{(is)/2} - evaluate expression} \AddPBD{(is)/2} \begin{TemplatesOneCol} is(?term, +evaluable) \end{TemplatesOneCol} \Description \texttt{Result is Expression} succeeds if \texttt{Result} can be unified with \textit{eval}(\texttt{Expression}). Refer to the evaluation of an arithmetic expression for the definition of the \textit{eval} function \RefSP{Evaluation-of-an-arithmetic-expression}. \texttt{is} is a predefined infix operator \RefSP{op/3:(Term-input/output)}. \Errors Refer to the evaluation of an arithmetic expression for possible errors \RefSP{Evaluation-of-an-arithmetic-expression}. \Portability ISO predicate. \subsubsection{\texttt{(=:=)/2} - arithmetic equal, \texttt{(={\bs}=)/2} - arithmetic not equal, \\ \texttt{({\lt})/2} - arithmetic less than, \texttt{(={\lt})/2} - arithmetic less than or equal to, \\ \texttt{({\gt})/2} - arithmetic greater than, \texttt{({\gt}=)/2} - arithmetic greater than or equal to} \label{(=:=)/2} \AddPBD{(=:=)/2} \AddPBD{(={\bs}=)/2} \AddPBD{({\lt})/2} \AddPBD{(={\lt})/2} \AddPBD{({\gt})/2} \AddPBD{({\gt}=)/2} \begin{TemplatesTwoCols} =:=(+evaluable, +evaluable)\\ ={\bs}=(+evaluable, +evaluable)\\ {\lt}(+evaluable, +evaluable)\\ ={\lt}(+evaluable, +evaluable)\\ {\gt}(+evaluable, +evaluable)\\ {\gt}=(+evaluable, +evaluable) \end{TemplatesTwoCols} \Description \texttt{Expr1 =:= Expr2} succeeds if \textit{eval}(\texttt{Expr1}) = \textit{eval}(\texttt{Expr2}). \texttt{Expr1 ={\bs}= Expr2} succeeds if \textit{eval}(\texttt{Expr1}) $\neq$ \textit{eval}(\texttt{Expr2}). \texttt{Expr1 {\lt} Expr2} succeeds if \textit{eval}(\texttt{Expr1}) $<$ \textit{eval}(\texttt{Expr2}). \texttt{Expr1 ={\lt} Expr2} succeeds if \textit{eval}(\texttt{Expr1}) $\leq$ \textit{eval}(\texttt{Expr2}). \texttt{Expr1 {\gt} Expr2} succeeds if \textit{eval}(\texttt{Expr1}) $>$ \textit{eval}(\texttt{Expr2}). \texttt{Expr1 {\gt}= Expr2} succeeds if \textit{eval}(\texttt{Expr1}) $\geq$ \textit{eval}(\texttt{Expr2}). Refer to the evaluation of an arithmetic expression for the definition of the \textit{eval} function \RefSP{Evaluation-of-an-arithmetic-expression}. \texttt{=:=}, \texttt{={\bs}=}, \texttt{{\lt}}, \texttt{={\lt}}, \texttt{{\gt}} and \texttt{{\gt}=} are predefined infix operators \RefSP{op/3:(Term-input/output)}. \Errors Refer to the evaluation of an arithmetic expression for possible errors \RefSP{Evaluation-of-an-arithmetic-expression}. \Portability ISO predicates. \subsection{Dynamic clause management} \subsubsection{Introduction} \label{Introduction:(Dynamic-clause-management)} \SPart{Static and dynamic procedures}: a procedure is either dynamic or static. All built-in predicates are static. A user-defined procedure is static by default unless a \IdxDi{dynamic/1} directive precedes its definition \RefSP{dynamic/1}. Adding a clause to a non-existent procedure creates a dynamic procedure. The clauses of a dynamic procedure can be altered (e.g. using \texttt{asserta/1}), the clauses of a static procedure cannot be altered. \SPart{Private and public procedures}: each procedure is either public or private. A dynamic procedure is always public. Each built-in predicate is private, and a static user-defined procedure is private by default unless a \IdxDi{public/1} directive precedes its definition \RefSP{public/1}. If a dynamic declaration exists it is unnecessary to add a public declaration since a dynamic procedure is also public. A clause of a public procedure can be inspected (e.g. using \texttt{clause/2}), a clause of a private procedure cannot be inspected. \SPart{A logical database update view}: any change in the database that occurs as the result of executing a goal (e.g. when a sub-goal is a call of \texttt{assertz/1} or \texttt{retract/1}) only affects subsequent activations. The change does not affect any activation that is currently being executed. Thus the database is frozen during the execution of a goal, and the list of clauses defining a predication is fixed at the moment of its execution. \subsubsection{\texttt{asserta/1}, \texttt{assertz/1}} \AddPBD{asserta/1} \AddPBD{assertz/1} \begin{TemplatesOneCol} asserta(+clause)\\ assertz(+clause) \end{TemplatesOneCol} \Description \texttt{asserta(Clause)} first converts the term \texttt{Clause} to a clause and then adds it to the current internal database. The predicate concerned must be dynamic \RefSP{Introduction:(Dynamic-clause-management)} or undefined and the clause is inserted before the first clause of the predicate. If the predicated is undefined it is created as a dynamic procedure. \texttt{assertz(Clause)} acts like \texttt{asserta/1} except that the clause is added at the end of all existing clauses of the concerned predicate. \SPart{Converting a term \texttt{Clause} to a clause \texttt{Clause1}:} \begin{itemize} \item extract the head and the body of \texttt{Clause}: either \texttt{Clause} = \texttt{(Head :- Body)} or \texttt{Clause} = \texttt{Head} and \texttt{Body} = \texttt{true}. \item \texttt{Head} must be a callable term (or else the conversion fails). \item convert \texttt{Body} to a body clause (i.e. a goal) \texttt{Body1}. \item the converted clause \texttt{Clause1} = \texttt{(Head :- Body1)}. \end{itemize} \SPart{Converting a term \texttt{T} to a goal:} \begin{itemize} \item if \texttt{T} is a variable it is replaced by the term \texttt{call(T)}. \item if \texttt{T} is a control construct \texttt{(',')/2}, \texttt{(;)/2} or \texttt{(-{\gt})/2} each argument of the control construct is recursively converted to a goal. \item if \texttt{T} is a callable term it remains unchanged. \item otherwise the conversion fails (\texttt{T} is neither a variable nor a callable term). \end{itemize} \begin{PlErrors} \ErrCond{\texttt{Head} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Head} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Head)} \ErrCond{\texttt{Body} cannot be converted to a goal} \ErrTerm{type\_error(callable, Body)} \ErrCond{The predicate indicator \texttt{Pred} of \texttt{Head} is that of a static procedure} \ErrTerm{permission\_error(modify, static\_procedure, Pred)} \end{PlErrors} \Portability ISO predicates. \subsubsection{\texttt{retract/1}} \AddPBD{retract/1} \begin{TemplatesOneCol} retract(+clause) \end{TemplatesOneCol} \Description \texttt{retract(Clause)} erases the first clause of the database that unifies with \texttt{Clause}. The concerned predicate must be a dynamic procedure \RefSP{Introduction:(Dynamic-clause-management)}. Removing all clauses of a procedure does not erase the procedure definition. To achieve this use \texttt{abolish/1} \RefSP{abolish/1}. \texttt{retract/1} is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{Head} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Head} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Head)} \ErrCond{The predicate indicator \texttt{Pred} of \texttt{Head} is that of a static procedure} \ErrTerm{permission\_error(modify, static\_procedure, Pred)} \end{PlErrors} \Portability ISO predicate. In the ISO reference, the operation associated with the \texttt{permission\_error} is \texttt{access} while it is \texttt{modify} in GNU Prolog. This seems to be an error of the ISO reference since for \texttt{asserta/1} (which is similar in spirit to \texttt{retract/1}) the operation is also \texttt{modify}. \subsubsection{\texttt{retractall/1}} \AddPBD{retractall/1} \begin{TemplatesOneCol} retractall(+head) \end{TemplatesOneCol} \Description \texttt{retractall(Head)} erases all clauses whose head unifies with \texttt{Head}. The concerned predicate must be a dynamic procedure \RefSP{Introduction:(Dynamic-clause-management)}. The procedure definition is not removed so that it is found by \IdxPB{current\_predicate/1} \RefSP{current-predicate/1}. \texttt{abolish/1} should be used to remove the procedure \RefSP{abolish/1}. \begin{PlErrors} \ErrCond{\texttt{Head} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Head} is not a callable term} \ErrTerm{type\_error(callable, Head)} \ErrCond{The predicate indicator \texttt{Pred} of \texttt{Head} is that of a static procedure} \ErrTerm{permission\_error(modify, static\_procedure, Pred)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{clause/2}} \AddPBD{clause/2} \begin{TemplatesOneCol} clause(+head, ?callable\_term) \end{TemplatesOneCol} \Description \texttt{clause(Head, Body)} succeeds if there exists a clause in the database that unifies with \texttt{Head :- Body}. The predicate in question must be a public procedure \RefSP{Introduction:(Dynamic-clause-management)}. Clauses are delivered from the first to the last. This predicate is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{Head} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Head} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Head)} \ErrCond{The predicate indicator \texttt{Pred} of \texttt{Head} is that of a private procedure} \ErrTerm{permission\_error(access, private\_procedure, Pred)} \ErrCond{\texttt{Body} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Body)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{abolish/1}} \label{abolish/1} \AddPBD{abolish/1} \begin{TemplatesOneCol} abolish(+predicate\_indicator) \end{TemplatesOneCol} \Description \texttt{abolish(Pred)} removes from the database the procedure whose predicate indicator is \texttt{Pred}. The concerned predicate must be a dynamic procedure \RefSP{Introduction:(Dynamic-clause-management)}. \begin{PlErrors} \ErrCond{\texttt{Pred} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and either \texttt{Name} or \texttt{Arity} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Pred} is neither a variable nor a predicate indicator} \ErrTerm{type\_error(predicate\_indicator, Pred)} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and \texttt{Arity} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Arity)} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and \texttt{Name} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Name)} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and \texttt{Arity} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Arity)} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and \texttt{Arity} is an integer $>$ \texttt{max\_arity} flag \RefSP{set-prolog-flag/2}} \ErrTerm{representation\_error(max\_arity)} \ErrCond{The predicate indicator \texttt{Pred} is that of a static procedure} \ErrTerm{permission\_error(modify, static\_procedure, Pred)} \end{PlErrors} \Portability ISO predicate. \subsection{Predicate information} \subsubsection{\texttt{current\_predicate/1}} \label{current-predicate/1} \AddPBD{current\_predicate/1} \begin{TemplatesOneCol} current\_predicate(?predicate\_indicator) \end{TemplatesOneCol} \Description \texttt{current\_predicate(Pred)} succeeds if there exists a predicate indicator of a defined procedure that unifies with \texttt{Pred}. All user defined procedures are found, whether static or dynamic. Internal system procedures whose name begins with \texttt{'\$'} are not found. A user-defined procedure is found even when it has no clauses. A user-defined procedure is not found if it has been abolished. To conform to the ISO reference, built-in predicates are not found except if the \IdxPF{strict\_iso} \Idx{Prolog flag} is switched off \RefSP{set-prolog-flag/2}. This predicate is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{Pred} is neither a variable nor a predicate indicator} \ErrTerm{type\_error(predicate\_indicator, Pred)} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and \texttt{Arity} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Arity)} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and \texttt{Name} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Name)} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and \texttt{Arity} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Arity)} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and \texttt{Arity} is an integer $>$ \texttt{max\_arity} flag \RefSP{set-prolog-flag/2}} \ErrTerm{representation\_error(max\_arity)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{predicate\_property/2}} \label{predicate-property/2} \AddPBD{predicate\_property/2} \begin{TemplatesOneCol} predicate\_property(?predicate\_indicator, ?predicate\_property) \end{TemplatesOneCol} \Description \texttt{predicate\_property(Pred, Property)} succeeds if there exists a predicate indicator of a defined procedure that unifies with \texttt{Pred} and if \texttt{Property} unifies with one of the properties of the procedure. All user defined procedures and built-in predicates are found. Internal system procedures whose name begins with \texttt{'\$'} are not found. This predicate is re-executable on backtracking. \SPart{Predicate properties}: \begin{itemize} \item \IdxPPD{static}: if the procedure is static. \item \IdxPPD{dynamic}: if the procedure is dynamic. \item \IdxPPD{private}: if the procedure is private. \item \IdxPPD{public}: if the procedure is public. \item \IdxPPD{user}: if the procedure is a user-defined procedure. \item \IdxPPD{built\_in}: if the procedure is a Prolog built-in predicate. \item \IdxPPD{built\_in\_fd}: if the procedure is an FD built-in predicate. \item \IdxPPD{native\_code}: if the procedure is compiled in native code. \item \IdxPPD[prolog\_file]{prolog\_file(File)}: source file from which the predicate has been read. \item \IdxPPD[prolog\_line]{prolog\_line(Line)}: line number of the source file. \end{itemize} \begin{PlErrors} \ErrCond{\texttt{Pred} is neither a variable nor a predicate indicator} \ErrTerm{type\_error(predicate\_indicator, Pred)} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and \texttt{Arity} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Arity)} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and \texttt{Name} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Name)} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and \texttt{Arity} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Arity)} \ErrCond{\texttt{Pred} is a term \texttt{Name/Arity} and \texttt{Arity} is an integer $>$ \texttt{max\_arity} flag \RefSP{set-prolog-flag/2}} \ErrTerm{representation\_error(max\_arity)} \ErrCond{\texttt{Property} is neither a variable nor a predicate property term} \ErrTerm{domain\_error(predicate\_property, Property)} \ErrCond{\texttt{Property} = \texttt{prolog\_file(File)} and \texttt{File} is neither a variable nor an atom} \ErrTerm{type\_error(atom, File)} \ErrCond{\texttt{Property} = \texttt{prolog\_line(Line)} and \texttt{Line} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Line)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{All solutions} \subsubsection{Introduction} \label{Introduction:(All-solutions)} It is sometimes useful to collect all solutions for a goal. This can be done by repeatedly backtracking and gradually building the list of solutions. The following built-in predicates are provided to automate this process. The built-in predicates described in this section invoke \texttt{call/1} \RefSP{call/1} on the argument \texttt{Goal}. When efficiency is crucial and \texttt{Goal} is complex it is better to define an auxiliary predicate which can then be compiled, and have \texttt{Goal} call this predicate. \subsubsection{\texttt{findall/3}} \AddPBD{findall/3} \begin{TemplatesOneCol} findall(?term, +callable\_term, ?list) \end{TemplatesOneCol} \Description \texttt{findall(Template, Goal, Instances)} succeeds if \texttt{Instances} unifies with the list of values to which a variable \texttt{X} not occurring in \texttt{Template} or \texttt{Goal} would be instantiated by successive re-executions of \texttt{call(Goal), X = Template} after systematic replacement of all variables in \texttt{X} by new variables. Thus, the order of the list \texttt{Instances} corresponds to the order in which the proofs are found. \begin{PlErrors} \ErrCond{\texttt{Goal} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Goal} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Goal)} \ErrCond{The predicate indicator \texttt{Pred} of \texttt{Goal} does not correspond to an existing procedure and the value of the \texttt{unknown} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{existence\_error(procedure, Pred)} \ErrCond{\texttt{Instances} is neither a partial list nor a list} \ErrTerm{type\_error(list, Instances)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{bagof/3}, \texttt{setof/3}} \AddPBD{bagof/3} \AddPBD{setof/3} \begin{TemplatesOneCol} bagof(?term, +callable\_term, ?list)\\ setof(?term, +callable\_term, ?list) \end{TemplatesOneCol} \Description \texttt{bagof(Template, Goal, Instances)} assembles as a list the set of solutions of \texttt{Goal} for each different instantiation of the free variables in \texttt{Goal}. The elements of each list are in order of solution, but the order in which each list is found is undefined. This predicate is re-executable on backtracking. \SPart{Free variable set}: \texttt{bagof/3} groups the solutions of \texttt{Goal} according to the free variables in \texttt{Goal}. This set corresponds to all variables occurring in \texttt{Goal} but not in \texttt{Template}. It is sometimes useful to exclude some additional variables of \texttt{Goal}. For that, \texttt{bagof/3} recognizes a goal of the form \texttt{T\^{}Goal} and exclude all variables occuring in \texttt{T} from the free variable set. \texttt{(\^{})/2} can be viewed as an \emph{existential quantifier} (the logical reading of \texttt{X\^{}Goal} being ``there exists an \texttt{X} such that \texttt{Goal} is true''). The use of this existential qualifier is superfluous outside \texttt{bagof/3} (and \texttt{setof/3}) and then is not recognized. \texttt{(\^{})/2} is a predefined infix operator \RefSP{op/3:(Term-input/output)}. \texttt{setof(Template, Goal, Instances)} is equivalent to \texttt{bagof(Template,Goal,I), sort(I,Instances)}. Each list is then a sorted list (duplicate elements are removed). From the implementation point of view \texttt{setof/3} is as fast as \texttt{bagof/3}. Both predicates use an in-place (i.e. destructive) sort \RefSP{sort/2} and require the same amount of memory. \begin{PlErrors} \ErrCond{\texttt{Goal} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Goal} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Goal)} \ErrCond{The predicate indicator \texttt{Pred} of \texttt{Goal} does not correspond to an existing procedure and the value of the \texttt{unknown} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{existence\_error(procedure, Pred)} \ErrCond{\texttt{Instances} is neither a partial list nor a list} \ErrTerm{type\_error(list, Instances)} \end{PlErrors} \Portability ISO predicates. \subsection{Streams} \label{Streams} \subsubsection{Introduction} \label{Introduction:(Streams)} A stream provides a logical view of a source/sink. \SPart{Sources and sinks}: a program can output results to a sink or input data from a source. A source/sink may be a file (regular file, terminal, device,\ldots), a constant term, a pipe, a socket,\ldots \SPart{Associating a stream to a source/sink}: to manipulate a source/sink it must be associated with a stream. This provides a logical and uniform view of the source/sink whatever its type. Once this association has been established, i.e. a stream has been created, all subsequent references to the source/sink are made by referring the stream. A stream is unidirectional: it is either an input stream or an output stream. For a classical file, the association is done by opening the file (whose name is specified as an atom) with the \IdxPB{open/4} \RefSP{open/4}. GNU Prolog makes it possible to treat a Prolog constant term as a source/sink and provides built-in predicates to associate a stream to such a term \RefSP{Constant-term-streams}. GNU Prolog provides operating system interface predicates defining pipes between GNU Prolog and child processes with streams associated with these pipes, e.g. \IdxPB{popen/3} \RefSP{popen/3}. Similarly, socket interface predicates associate streams to a socket to allow the communication, e.g. \IdxPB{socket\_connect/4} \RefSP{socket-connect/4}. \SPart{Stream-term}: a stream-term identifies a stream during a call of an input/output built-in predicate. It is created as a result of associating a stream to a source/sink (section above). A stream-term is a compound term of the form \texttt{'\$stream'(I)} where \texttt{I} is an integer. \SPart{Stream aliases}: any stream may be associated with a stream alias which is an atom which may be used to refer to that stream. The association can be done at open time or using \IdxPB{add\_stream\_alias/2} \RefSP{add-stream-alias/2}. Such an association automatically ends when the stream is closed. A particular alias only refers to at most one stream at any one time. However, more than one alias can be associated with a stream. Most built-in predicates which have a stream-term as an input argument also accept a stream alias as that argument. However, built-in predicates which return a stream-term do not accept a stream alias. \SPart{Standard streams}: two streams are predefined and open during the execution of every goal: the standard input stream which has the alias \IdxPKD{user\_input} and the standard output stream which has the alias \IdxPKD{user\_output}. A goal which attempts to close either standard stream succeeds, but does not close the stream. \SPart{Current streams}: during execution there is a current input stream and a current output stream. By default, the current input and output streams are the standard input and output streams, but the built-in predicates \IdxPB{set\_input/1} \RefSP{set-input/1} and \IdxPB{set\_output/1} \RefSP{set-output/1} can be used to change them. When the current input stream is closed, the standard input stream becomes the current input stream. When the current output stream is closed, the standard output stream becomes the current output stream. \SPart{Text streams and binary streams}: a text stream is a sequence of characters. A text stream is also regarded as a sequence of lines where each line is a possibly empty sequence of characters followed by a new line character. GNU Prolog may add or remove space characters at the ends of lines in order to conform to the conventions for representing text streams in the operating system. A binary stream is a sequence of bytes. Only a few built-in predicates can deal with binary streams, e.g. \IdxPB{get\_byte/2} \RefSP{Byte-input/output}. \SPart{Stream positions}: the stream position of a stream identifies an absolute position of the source/sink to which the stream is connected and defines where in the source/sink the next input or output will take place. A stream position is a ground term of the form \texttt{'\$stream\_position'(I1, I2, I3, I4)} where \texttt{I1}, \texttt{I2}, \texttt{I3} and \texttt{I4} are integers. Stream positions are used to reposition a stream (when possible) using for instance \IdxPB{set\_stream\_position/2} \RefSP{set-stream-position/2}. \SPart{The position end of stream}: when all data of a stream \Param{S} has been input \Param{S} has a stream position end-of-stream. At this stream position a goal to input more data will return a specific value to indicate that end of stream has been reached (e.g. \texttt{-1} for \texttt{get\_code/2} or \texttt{end\_of\_file} for \texttt{get\_char/2},\ldots). When this terminating value has been input, the stream has a stream position past-end-of-stream. \SPart{Buffering mode}: input/output on a stream can be buffered (line-buffered or block-buffered) or not buffered at all. The buffering mode can be specified at open time or using \IdxPB{set\_stream\_buffering/2} \RefSP{set-stream-buffering/2}. Line buffering is used on output streams, output data are only written to the sink when a new-line character is output (or at the close time). Block buffering is used on input or output. On input streams, when an input is requested on the source, if the buffer is empty, all available characters are read (within the limits of the size of the buffer), subsequent reads will first use the characters in the buffer. On output streams, output data are stored in the buffer and only when the buffer is full is it physically written on the sink. Thus, an output to a buffered stream may not be sent immediately to the sink connected to that stream. When it is necessary to be certain that output has been delivered, the built-in predicate \IdxPB{flush\_output/1} \RefSP{flush-output/1} should be used. Finally, it is also possible to use non-buffered streams, in that case input/output are directly done on the connected source/sink. This can be useful for communication purposes (e.g. sockets) or when a precise control is needed, e.g. \IdxPB{select/5} \RefSP{wait/2}. \SPart{Stream mirrors}: any stream may be associated with mirror streams specified at open time or using \IdxPB{add\_stream\_mirror/2} \RefSP{add-stream-mirror/2}. Then, all characters/bytes read from/written to the stream are also written on each mirror stream. The association automatically ends when either the stream or the mirror stream is closed. It is also possible to explicitely remove a mirror stream using \IdxPB{remove\_stream\_mirror/2} \RefSP{remove-stream-mirror/2}. \subsubsection{\texttt{current\_input/1}} \AddPBD{current\_input/1} \begin{TemplatesOneCol} current\_input(?stream) \end{TemplatesOneCol} \Description \texttt{current\_input(Stream)} unifies \texttt{Stream} with the stream-term identifying the current input stream. \begin{PlErrors} \ErrCond{\texttt{Stream} is neither a variable nor a stream} \ErrTerm{domain\_error(stream, Stream)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{current\_output/1}} \AddPBD{current\_output/1} \begin{TemplatesOneCol} current\_output(?stream) \end{TemplatesOneCol} \Description \texttt{current\_output(Stream)} unifies \texttt{Stream} with the stream-term identifying the current output stream. \begin{PlErrors} \ErrCond{\texttt{Stream} is neither a variable nor a stream} \ErrTerm{domain\_error(stream, Stream)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{set\_input/1}} \label{set-input/1} \AddPBD{set\_input/1} \begin{TemplatesOneCol} set\_input(+stream\_or\_alias) \end{TemplatesOneCol} \Description \texttt{set\_input(SorA)} sets the current input stream to be the stream associated with the stream-term or alias \texttt{SorA}. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(input, stream, SorA)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{set\_output/1}} \label{set-output/1} \AddPBD{set\_output/1} \begin{TemplatesOneCol} set\_output(+stream\_or\_alias) \end{TemplatesOneCol} \Description \texttt{set\_output(SorA)} sets the current output stream to be the stream associated with the stream-term or alias \texttt{SorA}. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an input stream} \ErrTerm{permission\_error(output, stream, SorA)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{open/4}, \texttt{open/3}} \label{open/4} \AddPBD{open/4} \AddPBD{open/3} \begin{TemplatesOneCol} open(+source\_sink, +io\_mode, -stream, +stream\_option\_list)\\ open(+source\_sink, +io\_mode, -stream) \end{TemplatesOneCol} \Description \texttt{open(SourceSink, Mode, Stream, Options)} opens the source/sink \texttt{SourceSink} for input or output as indicated by \texttt{Mode} and the list of stream-options \texttt{Options} and unifies \texttt{Stream} with the stream-term which is associated with this stream. See \IdxPB{absolute\_file\_name/2} for information about the syntax of \texttt{SourceSink} \RefSP{absolute-file-name/2}. \SPart{Input/output modes}: \texttt{Mode} is an atom which defines the input/output operations that may be performed the stream. Possible modes are: \begin{itemize} \item \IdxPMD{read}: the source/sink is a source and must already exist. Input starts at the beginning of the source. \item \IdxPMD{write}: the source/sink is a sink. If the sink already exists then it is emptied else an empty sink is created. Output starts at the beginning of that sink. \item \IdxPMD{append}: the source/sink is a sink. If the sink does not exist it is created. Output starts at the end of that sink. \end{itemize} \SPart{Stream options}: \texttt{Options} is a list of stream options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are: \begin{itemize} \item \IdxPOD[type]{type(}\IdxPOD{text}/\IdxPOD{binary}\texttt{)}: specifies whether the stream is a text stream or a binary stream. The default value is \texttt{text}. \item \IdxPOD[reposition]{reposition(true}/\texttt{false)}: specifies whether it is possible to reposition the stream. The default value is \texttt{true} except if the stream cannot be repositioned (e.g. a terminal). \item \IdxPOD[eof\_action]{eof\_action(error}/\texttt{eof\_code}/\texttt{reset)}: specifies the effect of attempting to input from a stream whose stream position is past-end-of-stream: \begin{itemize} \item \IdxPOD{error}: a \texttt{permission\_error} is raised signifying that no more input exists in this stream. \item \IdxPOD{eof\_code}: the result of input is as if the stream position is end-of-stream. \item \IdxPOD{reset}: the stream position is reset so that it is not past-end-of-stream, and another attempt is made to input from it (this is useful when inputting from a terminal). \end{itemize} The default value is \texttt{eof\_code}. \item \IdxPOD[alias]{alias(Alias)}: specifies that the atom \texttt{Alias} is to be an alias for the stream. By default no alias is attached to the stream. Several aliases can be defined for a same stream. \item \IdxPOD[mirror]{mirror(Mirror)}: specifies the stream associated with the stream-term or alias \texttt{Mirror} is a mirror for the stream. By default no mirro is attached to the stream. Several mirrors can be defined for a same stream. \item \IdxPOD[buffering]{buffering(none}/\texttt{line}/\texttt{block)}: specifies which type of buffering is used by input/output operations on this stream: \begin{itemize} \item \IdxPOD{none}: no buffering. \item \IdxPOD{line}: output operations buffer data emitted until a new-line occurs \item \IdxPOD{block}: input/output operations buffer data until a given number (implementation dependant) of characters/bytes have been treated. \end{itemize} The default value is \texttt{line} for a terminal (TTY), \texttt{block} otherwise. \end{itemize} \texttt{open(SourceSink, Mode, Stream, Options)} is equivalent to \texttt{open(SourceSink, Mode, Stream, [])}. \begin{PlErrors} \ErrCond{\texttt{SourceSink} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Mode} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Options} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Mode} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Mode)} \ErrCond{\texttt{Options} is neither a partial list nor a list} \ErrTerm{type\_error(list, Options)} \ErrCond{\texttt{Stream} is not a variable} \ErrTerm{type\_error(variable, Stream)} \ErrCond{\texttt{SourceSink} is neither a variable nor a source/sink} \ErrTerm{domain\_error(source\_sink, SourceSink)} \ErrCond{\texttt{Mode} is an atom but not an input/output mode} \ErrTerm{domain\_error(io\_mode, Mode)} \ErrCond{an element \texttt{E} of the \texttt{Options} list is neither a variable nor a stream-option} \ErrTerm{domain\_error(stream\_option, E)} \ErrCond{the source/sink specified by \texttt{SourceSink} does not exist} \ErrTerm{existence\_error(source\_sink, SourceSink)} \ErrCond{the source/sink specified by \texttt{SourceSink} cannot be opened} \ErrTerm{permission\_error(open, source\_sink, SourceSink)} \ErrCond{an element \texttt{E} of the \texttt{Options} list is \texttt{alias(A)} and \texttt{A} is already associated with an open stream} \ErrTerm{permission\_error(open, source\_sink, alias(A))} \ErrCond{an element \texttt{E} of the \texttt{Options} list is \texttt{mirror(M)} and \texttt{M} is not associated with an open stream} \ErrTerm{existence\_error(stream, M)} \ErrCond{an element \texttt{E} of the \texttt{Options} list is \texttt{mirror(M)} and \texttt{M} iis an input stream} \ErrTerm{permission\_error(output, stream, M)} \ErrCond{an element \texttt{E} of the \texttt{Options} list is \texttt{reposition(true)} and it is not possible to reposition this stream} \ErrTerm{permission\_error(open, source\_sink, reposition(true))} \end{PlErrors} \Portability ISO predicates. The \texttt{mirror/1} and \texttt{buffering/1} stream options are GNU Prolog extensions. \subsubsection{\texttt{close/2}, \texttt{close/1}} \label{close/2} \AddPBD{close/2} \AddPBD{close/1} \begin{TemplatesOneCol} close(+stream\_or\_alias, +close\_option\_list)\\ close(+stream\_or\_alias) \end{TemplatesOneCol} \Description \texttt{close(SorA, Options)} closes the stream associated with the stream-term or alias \texttt{SorA}. If \texttt{SorA} is the standard input stream or the standard output stream \texttt{close/2} simply succeeds else the associated source/sink is physically closed. If \texttt{SorA} is the current input stream the current input stream becomes the standard input stream \IdxPK{user\_input}. If \texttt{SorA} is the current output stream the current output stream becomes the standard output stream \IdxPK{user\_output}. \SPart{Close options}: \texttt{Options} is a list of close options. For the moment only one option is available: \begin{itemize} \item \IdxPOD[force]{force(true}/\texttt{false)}: with \texttt{false}, if an error occurs when trying to close the source/sink, the stream is not closed and an error (\texttt{system\_error} or \texttt{resource\_error}) is raised (but \texttt{close/2} succeeds). With \texttt{true}, if an error occurs it is ignored and the stream is closed. The purpose of \texttt{force/1} option is to allow an error handling routine to do its best to reclaim resources. The default value is \texttt{false}. \end{itemize} \texttt{close(SorA)} is equivalent to \texttt{close(SorA, [])}. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Options} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Options} is neither a partial list nor a list} \ErrTerm{type\_error(list, Options)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{an element \texttt{E} of the \texttt{Options} list is neither a variable nor a close-option} \ErrTerm{domain\_error(close\_option, E)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} needs a special close \RefSP{Constant-term-streams}} \ErrTerm{system\_error(needs\_special\_close)} \end{PlErrors} \Portability ISO predicates. The \texttt{system\_error(needs\_special\_close)} is a GNU Prolog extension. \subsubsection{\texttt{flush\_output/1}, \texttt{flush\_output/0}} \label{flush-output/1} \AddPBD{flush\_output/1} \AddPBD{flush\_output/0} \begin{TemplatesOneCol} flush\_output(+stream\_or\_alias)\\ flush\_output \end{TemplatesOneCol} \Description \texttt{flush\_output(SorA)} sends any buffered output characters/bytes to the stream. \texttt{flush\_output/0} applies to the current output stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an input stream} \ErrTerm{permission\_error(output, stream, SorA)} \end{PlErrors} \Portability ISO predicates. \subsubsection{\texttt{current\_stream/1}} \label{current-stream/1} \AddPBD{current\_stream/1} \begin{TemplatesOneCol} current\_stream(?stream) \end{TemplatesOneCol} \Description \texttt{current\_stream(Stream)} succeeds if there exists a stream-term that unifies with \texttt{Stream}. This predicate is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{Stream} is neither a variable nor a stream-term} \ErrTerm{domain\_error(stream, Stream)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{stream\_property/2}} \label{stream-property/2} \AddPBD{stream\_property/2} \begin{TemplatesOneCol} stream\_property(?stream, ?stream\_property) \end{TemplatesOneCol} \Description \texttt{stream\_property(Stream, Property)} succeeds if \texttt{current\_stream(Stream)} succeeds \RefSP{current-stream/1} and if \texttt{Property} unifies with one of the properties of the stream. This predicate is re-executable on backtracking. \SPart{Stream properties}: \begin{itemize} \item \IdxPPD[file\_name]{file\_name(F)}: the name of the connected source/sink. \item \IdxPPD[mode]{mode(M)}: \texttt{M} is the open mode (\texttt{read}, \texttt{write}, \texttt{append}). \item \IdxPPD{input}: if it is an input stream. \item \IdxPPD{output}: if it is an output stream. \item \IdxPPD[alias]{alias(A)}: \texttt{A} is an alias of the stream. \item \IdxPPD[mirror]{mirror(M)}: \texttt{M} is a mirror stream of the stream. \item \IdxPPD[type]{type(T)}: \texttt{T} is the type of the stream (\texttt{text}, \texttt{binary}). \item \IdxPPD[reposition]{reposition(R)}: \texttt{R} is the reposition boolean (\texttt{true}, \texttt{false}). \item \IdxPPD[eof\_action]{eof\_action(A)}: \texttt{A} is the end-of-file action (\texttt{error}, \texttt{eof\_code}, \texttt{reset}). \item \IdxPPD[buffering]{buffering(B)}: \texttt{B} is the buffering mode (\texttt{none}, \texttt{line}, \texttt{block}). \item \IdxPPD[end\_of\_stream]{end\_of\_stream(E)}: \texttt{E} is the current end-of-stream status (\texttt{not}, \texttt{at}, \texttt{past}). If the stream position is end-of-stream then \texttt{E} is unified with \texttt{at} else if the stream position is past-end-of-stream then \texttt{E} is unified with \texttt{past} else \texttt{E} is unified with \texttt{not}. \item \IdxPPD[position]{position(P)}: \texttt{P} is the stream-position term associated with the current position. \end{itemize} \begin{PlErrors} \ErrCond{\texttt{Stream} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Stream} is neither a variable nor a stream-term} \ErrTerm{domain\_error(stream, Stream)} \ErrCond{\texttt{Property} is neither a variable nor a stream property} \ErrTerm{domain\_error(stream\_property, Property)} \ErrCond{\texttt{Property} = \texttt{file\_name(E)},\texttt{ mode(E)}, \texttt{alias(E)}, \texttt{end\_of\_stream(E)}, \texttt{eof\_action(E)}, \texttt{reposition(E)}, \texttt{type(E)} or \texttt{buffering(E)} and \texttt{E} is neither a variable nor an atom} \ErrTerm{type\_error(atom, E)} \end{PlErrors} \Portability ISO predicate. The \texttt{buffering/1} property is a GNU Prolog extension. \subsubsection{\texttt{at\_end\_of\_stream/1}, \texttt{at\_end\_of\_stream/0}} \AddPBD{at\_end\_of\_stream/1} \AddPBD{at\_end\_of\_stream/0} \begin{TemplatesOneCol} at\_end\_of\_stream(+stream\_or\_alias)\\ at\_end\_of\_stream \end{TemplatesOneCol} \Description \texttt{at\_end\_of\_stream(SorA)} succeeds if the stream associated with stream-term or alias \texttt{SorA} has a stream position end-of-stream or past-end-of-stream. This predicate can be defined using \IdxPB{stream\_property/2} \RefSP{stream-property/2}. \texttt{at\_end\_of\_stream/0} applies to the current input stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(input, stream, SorA)} \end{PlErrors} \Portability ISO predicates. The \texttt{permission\_error(input, stream, SorA)} is a GNU Prolog extension. \subsubsection{\texttt{stream\_position/2}} \label{stream-position/2} \AddPBD{stream\_position/2} \begin{TemplatesOneCol} stream\_position(+stream\_or\_alias, ?stream\_position) \end{TemplatesOneCol} \Description \texttt{stream\_position(SorA, Position)} succeeds unifying \texttt{Position} with the stream-position term associated with the current position of the stream-term or alias \texttt{SorA}. This predicate can be defined using \IdxPB{stream\_property/2} \RefSP{stream-property/2}. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{Position} is neither a variable nor a stream-position term} \ErrTerm{domain\_error(stream\_position, Position)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{set\_stream\_position/2}} \label{set-stream-position/2} \AddPBD{set\_stream\_position/2} \begin{TemplatesOneCol} set\_stream\_position(+stream\_or\_alias, +stream\_position) \end{TemplatesOneCol} \Description \texttt{set\_stream\_position(SorA, Position)} sets the position of the stream associated with the stream-term or alias \texttt{SorA} to \texttt{Position}. \texttt{Position} should have previously been returned by \IdxPB{stream\_property/2} \RefSP{stream-property/2} or by \IdxPB{stream\_position/2} \RefSP{stream-position/2}. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Position} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{Position} is neither a variable nor a stream-position term} \ErrTerm{domain\_error(stream\_position, Position)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} has stream property \texttt{reposition(false)}} \ErrTerm{permission\_error(reposition, stream, SorA)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{seek/4}} \AddPBD{seek/4} \begin{TemplatesOneCol} seek(+stream\_or\_alias, +stream\_seek\_method, +integer, ?integer) \end{TemplatesOneCol} \Description \texttt{seek(SorA, Whence, Offset, NewOffset)} sets the position of the stream associated with the stream-term or alias \texttt{SorA} to \texttt{Offset} according to \texttt{Whence} and unifies \texttt{NewOffset} with the new offset from the beginning of the file. \texttt{seek/4} can only be used on binary streams. \texttt{Whence} is an atom from: \begin{itemize} \item \IdxPWD{bof}: the position is set relatively to the begin of the file (\texttt{Offset} should be $\geq$ 0). \item \IdxPWD{current}: the position is set relatively to the current position (\texttt{Offset} can be $\geq$ 0 or $\leq$ 0). \item \IdxPWD{eof}: the position is set relatively to the end of the file (\texttt{Offset} should be $\leq$ 0). \end{itemize} This predicate is an interface to the C Unix function \texttt{lseek(2)}. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Whence} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Offset} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{Whence} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Whence)} \ErrCond{\texttt{Whence} is an atom but not a valid stream seek method} \ErrTerm{domain\_error(stream\_seek\_method, Whence)} \ErrCond{\texttt{Offset} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Offset)} \ErrCond{\texttt{NewOffset} is neither a variable nor an integer} \ErrTerm{type\_error(integer, NewOffset)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} has stream property \texttt{reposition(false)}} \ErrTerm{permission\_error(reposition, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a text stream} \ErrTerm{permission\_error(reposition, text\_stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{character\_count/2}} \AddPBD{character\_count/2} \begin{TemplatesOneCol} character\_count(+stream\_or\_alias, ?integer) \end{TemplatesOneCol} \Description \texttt{character\_count(SorA, Count)} unifies \texttt{Count} with the number of characters/bytes read/written on the stream associated with stream-term or alias \texttt{SorA}. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Count} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Count)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{line\_count/2}} \label{line-count/2} \AddPBD{line\_count/2} \begin{TemplatesOneCol} line\_count(+stream\_or\_alias, ?integer) \end{TemplatesOneCol} \Description \texttt{line\_count(SorA, Count)} unifies \texttt{Count} with the number of lines read/written on the stream associated with the stream-term or alias \texttt{SorA}. This predicate can only be used on text streams. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Count} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Count)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(access, binary\_stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{line\_position/2}} \label{line-position/2} \AddPBD{line\_position/2} \begin{TemplatesOneCol} line\_position(+stream\_or\_alias, ?integer) \end{TemplatesOneCol} \Description \texttt{line\_position(SorA, Count)} unifies \texttt{Count} with the number of characters read/written on the current line of the stream associated with the stream-term or alias \texttt{SorA}. This predicate can only be used on text streams. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Count} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Count)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(access, binary\_stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{stream\_line\_column/3}} \AddPBD{stream\_line\_column/3} \begin{TemplatesOneCol} stream\_line\_column(+stream\_or\_alias, ?integer, ?integer) \end{TemplatesOneCol} \Description \texttt{stream\_line\_column(SorA, Line, Column)} unifies \texttt{Line} (resp. \texttt{Column}) with the current line number (resp. column number) of the stream associated with the stream-term or alias \texttt{SorA}. This predicate can only be used on text streams. Note that \texttt{Line} corresponds to the value returned by \IdxPB{line\_count/2} + 1 \RefSP{line-count/2} and \texttt{Column} to the value returned by \texttt{line\_position/2} + 1 \RefSP{line-position/2}. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Line} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Line)} \ErrCond{\texttt{Column} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Column)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(access, binary\_stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{set\_stream\_line\_column/3}} \AddPBD{set\_stream\_line\_column/3} \begin{TemplatesOneCol} set\_stream\_line\_column(+stream\_or\_alias, +integer, +integer) \end{TemplatesOneCol} \Description \texttt{set\_stream\_line\_column(SorA, Line, Column)} sets the stream position of the stream associated with the stream-term or alias \texttt{SorA} according to the line number \texttt{Line} and the column number \texttt{Column}. This predicate can only be used on text streams. It first repositions the stream to the beginning of the file and then reads character by character until the required position is reached. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Line} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Column} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Line} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Line)} \ErrCond{\texttt{Column} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Column)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(reposition, binary\_stream, SorA)} \ErrCond{\texttt{SorA} has stream property \texttt{reposition(false)}} \ErrTerm{permission\_error(reposition, stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{add\_stream\_alias/2}} \label{add-stream-alias/2} \AddPBD{add\_stream\_alias/2} \begin{TemplatesOneCol} add\_stream\_alias(+stream\_or\_alias, +atom) \end{TemplatesOneCol} \Description \texttt{add\_stream\_alias(SorA, Alias)} adds \texttt{Alias} as a new alias to the stream associated with the stream-term or alias \texttt{SorA}. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Alias} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Alias} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Alias)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{Alias} is already associated with an open stream} \ErrTerm{permission\_error(add\_alias, source\_sink, alias(Alias))} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{current\_alias/2}} \AddPBD{current\_alias/2} \begin{TemplatesOneCol} current\_alias(?stream, ?atom) \end{TemplatesOneCol} \Description \texttt{current\_alias(Stream, Alias)} succeeds if \texttt{current\_stream(Stream)} succeeds \RefSP{current-stream/1} and if \texttt{Alias} unifies with one of the aliases of the stream. It can be defined using \IdxPB{stream\_property/2} \RefSP{stream-property/2}. This predicate is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{Stream} is neither a variable nor a stream-term} \ErrTerm{domain\_error(stream, Stream)} \ErrCond{\texttt{Alias} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Alias)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{add\_stream\_mirror/2}} \label{add-stream-mirror/2} \AddPBD{add\_stream\_mirror/2} \begin{TemplatesOneCol} add\_stream\_mirror(+stream\_or\_alias, +stream\_or\_alias) \end{TemplatesOneCol} \Description \texttt{add\_stream\_mirror(SorA, Mirror)} adds the stream associated with the stream-term or alias \texttt{Mirror} as a new mirror to the stream associated with the stream-term or alias \texttt{SorA}. After this, all characters (or bytes) read from (or written to) \texttt{SorA} are also written to \texttt{Mirror}. This mirroring occurs until \texttt{Mirror} is explicitely removed using \IdxPB{remove\_stream\_mirror/2} \RefSP{remove-stream-mirror/2} or implicitely when \texttt{Mirror} is closed. Several mirror streams can be associated with a same stream. If \texttt{Mirror} represents the same stream as \texttt{SorA} or if \texttt{Mirror} is already a mirror for \texttt{SorA}, no mirror is added. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Mirror} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{Mirror} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, Mirror)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{Mirror} is not associated with an open stream} \ErrTerm{existence\_error(stream, Mirror)} \ErrCond{\texttt{Mirror} is an input stream} \ErrTerm{permission\_error(output, stream, Mirror)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{remove\_stream\_mirror/2}} \label{remove-stream-mirror/2} \AddPBD{remove\_stream\_mirror/2} \begin{TemplatesOneCol} remove\_stream\_mirror(+stream\_or\_alias, +stream\_or\_alias) \end{TemplatesOneCol} \Description \texttt{remove\_stream\_mirror(SorA, Mirror)} removes the stream associated with the stream-term or alias \texttt{Mirror} from the list of mirrors of the stream associated with the stream-term or alias \texttt{SorA}. This predicate fails if \texttt{Mirror} is not a mirror stream for \texttt{SorA}. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Mirror} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{Mirror} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, Mirror)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{Mirror} is not associated with an open stream} \ErrTerm{existence\_error(stream, Mirror)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{current\_mirror/2}} \AddPBD{current\_mirror/2} \begin{TemplatesOneCol} current\_mirror(?stream, ?stream) \end{TemplatesOneCol} \Description \texttt{current\_mirror(Stream, M)} succeeds if \texttt{current\_stream(Stream)} succeeds \RefSP{current-stream/1} and if \texttt{M} unifies with one of the mirrors of the stream. It can be defined using \IdxPB{stream\_property/2} \RefSP{stream-property/2}. This predicate is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{Stream} is neither a variable nor a stream-term} \ErrTerm{domain\_error(stream, Stream)} \ErrCond{\texttt{M} is neither a variable nor a stream-term} \ErrTerm{domain\_error(stream, M)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{set\_stream\_type/2}} \label{set-stream-type/2} \AddPBD{set\_stream\_type/2} \begin{TemplatesOneCol} set\_stream\_type(+stream\_or\_alias, +atom) \end{TemplatesOneCol} \Description \texttt{set\_stream\_type(SorA, Type)} updates the type associated with stream-term or alias \texttt{SorA}. The value of \texttt{Type} is an atom in \IdxPO{text} or \IdxPO{binary} as for \IdxPB{open/4} \RefSP{open/4}. The type of a stream can only be changed before any input/output operation is executed. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Type} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Type} is neither a variable nor a valid type} \ErrTerm{domain\_error(stream\_type, Type)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{An I/O operation has already been executed on \texttt{SorA}} \ErrTerm{permission\_error(modify, stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{set\_stream\_eof\_action/2}} \AddPBD{set\_stream\_eof\_action/2} \begin{TemplatesOneCol} set\_stream\_eof\_action(+stream\_or\_alias, +atom) \end{TemplatesOneCol} \Description \texttt{set\_stream\_eof\_action(SorA, Action)} updates the \texttt{eof\_action} option associated with the stream-term or alias \texttt{SorA}. The value of \texttt{Action} is one of the atoms \IdxPO{error}, \IdxPO{eof\_code}, \IdxPO{reset} as for \IdxPB{open/4} \RefSP{open/4}. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Action} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Action} is neither a variable nor a valid eof action} \ErrTerm{domain\_error(eof\_action, Action)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(modify, stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{set\_stream\_buffering/2}} \label{set-stream-buffering/2} \AddPBD{set\_stream\_buffering/2} \begin{TemplatesOneCol} set\_stream\_buffering(+stream\_or\_alias, +atom) \end{TemplatesOneCol} \Description \texttt{set\_stream\_buffering(SorA, Buffering)} updates the buffering mode associated with the stream-term or alias \texttt{SorA}. The value of \texttt{Buffering} is one of the atoms \IdxPO{none}, \IdxPO{line} or \IdxPO{block} as for \IdxPB{open/4} \RefSP{open/4}. This predicate may only be used after opening a stream and before any other operations have been performed on it. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Buffering} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Buffering} is neither a variable nor a valid buffering mode} \ErrTerm{domain\_error(buffering\_mode, Buffering)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{Constant term streams} \label{Constant-term-streams} \subsubsection{Introduction} \label{Introduction:(Constant-term-streams)} Constant term streams allow the user to consider a constant term (atom, character list or character code list) as a source/sink by associating to them a stream. Reading from a constant term stream will deliver the characters of the constant term as if they had been read from a standard file. Characters written on a constant term stream are stored to form the final constant term when the stream is closed. The built-in predicates described in this section allow the user to open and close a constant term stream for input or output. However, very often, a constant term stream is created to be only read or written once and then closed. To avoid the creation and the destruction of such a stream, GNU Prolog offers several built-in predicates to perform single input/output from/to constant terms \RefSP{Input/output-from/to-constant-terms}. \subsubsection{\texttt{open\_input\_atom\_stream/2}, \texttt{open\_input\_chars\_stream/2}, \\ \texttt{open\_input\_codes\_stream/2}} \AddPBD{open\_input\_atom\_stream/2} \AddPBD{open\_input\_chars\_stream/2} \AddPBD{open\_input\_codes\_stream/2} \begin{TemplatesOneCol} open\_input\_atom\_stream(+atom, -stream)\\ open\_input\_chars\_stream(+character\_list, -stream)\\ open\_input\_codes\_stream(+character\_code\_list, -stream) \end{TemplatesOneCol} \Description \texttt{open\_input\_atom\_stream(Atom, Stream)} unifies \texttt{Stream} with the stream-term which is associated with a new input text-stream whose data are the characters of \texttt{Atom}. \texttt{open\_input\_chars\_stream(Chars, Stream)} is similar to \texttt{open\_input\_atom\_stream/2} except that data are the content of the character list \texttt{Chars}. \texttt{open\_input\_codes\_stream(Codes, Stream)} is similar to \texttt{open\_input\_atom\_stream/2} except that data are the content of the character code list \texttt{Codes}. \begin{PlErrors} \ErrCond{\texttt{Stream} is not a variable} \ErrTerm{type\_error(variable, Stream)} \ErrCond{\texttt{Atom} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Chars} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Codes} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Atom} is neither a variable nor a an atom} \ErrTerm{type\_error(atom, Atom)} \ErrCond{\texttt{Chars} is neither a partial list nor a list} \ErrTerm{type\_error(list, Chars)} \ErrCond{\texttt{Codes} is neither a partial list nor a list} \ErrTerm{type\_error(list, Codes)} \ErrCond{an element \texttt{E} of the \texttt{Chars} list is neither a variable nor a character} \ErrTerm{type\_error(character, E)} \ErrCond{an element \texttt{E} of the \texttt{Codes} list is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \ErrCond{an element \texttt{E} of the \texttt{Codes} list is an integer but not a character code} \ErrTerm{representation\_error(character\_code)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{close\_input\_atom\_stream/1}, \texttt{close\_input\_chars\_stream/1}, \\ \texttt{close\_input\_codes\_stream/1}} \AddPBD{close\_input\_atom\_stream/1} \AddPBD{close\_input\_chars\_stream/1} \AddPBD{close\_input\_codes\_stream/1} \begin{TemplatesOneCol} close\_input\_atom\_stream(+stream\_or\_alias)\\ close\_input\_chars\_stream(+stream\_or\_alias)\\ close\_input\_codes\_stream(+stream\_or\_alias) \end{TemplatesOneCol} \Description \texttt{close\_input\_atom\_stream(SorA)} closes the constant term stream associated with the stream-term or alias \texttt{SorA}. \texttt{SorA} must a stream open with \texttt{open\_input\_atom\_stream/2} \RefSP{Introduction:(Constant-term-streams)}. \texttt{close\_input\_chars\_stream(SorA)} acts similarly for a character list stream. \texttt{close\_input\_codes\_stream(SorA)} acts similarly for a character code list stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(close, stream, SorA)} \ErrCond{\texttt{SorA} is a stream-term or alias but does not refer to a constant term stream.} \ErrTerm{domain\_error(term\_stream\_or\_alias, SorA)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{open\_output\_atom\_stream/1}, \texttt{open\_output\_chars\_stream/1}, \\ \texttt{open\_output\_codes\_stream/1}} \label{open-output-atom-stream/1} \AddPBD{open\_output\_atom\_stream/1} \AddPBD{open\_output\_chars\_stream/1} \AddPBD{open\_output\_codes\_stream/1} \begin{TemplatesOneCol} open\_output\_atom\_stream(-stream)\\ open\_output\_chars\_stream(-stream)\\ open\_output\_codes\_stream(-stream) \end{TemplatesOneCol} \Description \texttt{open\_output\_atom\_stream(Stream)} unifies \texttt{Stream} with the stream-term which is associated with a new output text-stream. All characters written to this stream are collected and will be returned as an atom when the stream is closed by \texttt{close\_ouput\_atom\_stream/2} \RefSP{close-output-atom-stream/2}. \texttt{open\_output\_chars\_stream(Stream)} is similar to \texttt{open\_output\_atom\_stream/1} except that the result will be a character list. \texttt{open\_output\_codes\_stream(Stream)} is similar to \texttt{open\_output\_atom\_stream/1} except that the result will be a character code list. \begin{PlErrors} \ErrCond{\texttt{Stream} is not a variable} \ErrTerm{type\_error(variable, Stream)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{close\_output\_atom\_stream/2}, \texttt{close\_output\_chars\_stream/2}, \\ \texttt{close\_output\_codes\_stream/2}} \label{close-output-atom-stream/2} \AddPBD{close\_output\_atom\_stream/2} \AddPBD{close\_output\_chars\_stream/2} \AddPBD{close\_output\_codes\_stream/2} \begin{TemplatesOneCol} close\_output\_atom\_stream(+stream\_or\_alias, ?atom)\\ close\_output\_chars\_stream(+stream\_or\_alias, ?character\_list)\\ close\_output\_codes\_stream(+stream\_or\_alias, ?character\_code\_list) \end{TemplatesOneCol} \Description \texttt{close\_output\_atom\_stream(SorA, Atom)} closes the constant term stream associated with the stream-term or alias \texttt{SorA}. \texttt{SorA} must be associated with a stream open with \texttt{open\_output\_atom\_stream/1} \RefSP{open-output-atom-stream/1}. \texttt{Atom} is unified with an atom formed with all characters written on the stream. \texttt{close\_output\_chars\_stream(SorA, Chars)} acts similarly for a character list stream. \texttt{close\_output\_codes\_stream(SorA, Codes)} acts similarly for a character code list stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Atom} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom)} \ErrCond{\texttt{Chars} is neither a partial list nor a list} \ErrTerm{type\_error(list, Chars)} \ErrCond{\texttt{Codes} is neither a partial list nor a list} \ErrTerm{type\_error(list, Codes)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an input stream} \ErrTerm{permission\_error(close, stream, SorA)} \ErrCond{\texttt{SorA} is a stream-term or alias but does not refer to a constant term stream} \ErrTerm{domain\_error(term\_stream\_or\_alias, SorA)} \end{PlErrors} \Portability GNU Prolog predicates. \subsection{Character input/output} These built-in predicates enable a single character or character code to be input from and output to a text stream. The atom \texttt{end\_of\_file} is returned as character to indicate the end-of-file. \texttt{-1} is returned as character code to indicate the end-of-file. \subsubsection{\texttt{get\_char/2}, \texttt{get\_char/1}, \texttt{get\_code/1}, \texttt{get\_code/2}} \label{get-char/2} \AddPBD{get\_char/2} \AddPBD{get\_code/2} \AddPBD{get\_char/1} \AddPBD{get\_code/1} \begin{TemplatesOneCol} get\_char(+stream\_or\_alias, ?in\_character)\\ get\_char(?in\_character)\\ get\_code(+stream\_or\_alias, ?in\_character\_code)\\ get\_code(?in\_character\_code) \end{TemplatesOneCol} \Description \texttt{get\_char(SorA, Char)} succeeds if \texttt{Char} unifies with the next character read from the stream associated with the stream-term or alias \texttt{SorA}. \texttt{get\_code/2} is similar to \texttt{get\_char/2} but deals with character codes. \texttt{get\_char/1} and \texttt{get\_code/1} apply to the current input stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Char} is neither a variable nor an in-character} \ErrTerm{type\_error(in\_character, Char)} \ErrCond{\texttt{Code} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Code)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(input, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(input, binary\_stream, SorA)} \ErrCond{\texttt{SorA} has stream properties \texttt{end\_of\_stream(past)} and \texttt{eof\_action(error)}} \ErrTerm{permission\_error(input, past\_end\_of\_stream, SorA)} \ErrCond{The entity input from the stream is not a character} \ErrTerm{representation\_error(character)} \ErrCond{\texttt{Code} is an integer but not an in-character code} \ErrTerm{representation\_error(in\_character\_code)} \end{PlErrors} \Portability ISO predicates. \subsubsection{\texttt{get\_key/2}, \texttt{get\_key/1} \texttt{get\_key\_no\_echo/2}, \texttt{get\_key\_no\_echo/1}} \AddPBD{get\_key/2} \AddPBD{get\_key/1} \AddPBD{get\_key\_no\_echo/2} \AddPBD{get\_key\_no\_echo/1} \begin{TemplatesOneCol} get\_key(+stream\_or\_alias, ?integer)\\ get\_key(?integer)\\ get\_key\_no\_echo(+stream\_or\_alias, ?integer)\\ get\_key\_no\_echo(?integer) \end{TemplatesOneCol} \Description \texttt{get\_key(Code, SorA)} succeeds if \texttt{Code} unifies with the character code of the next key read from the stream associated with the stream-term or alias \texttt{SorA}. It is intended to read a single key from the keyboard (thus \texttt{SorA} should refer to current input stream). No buffering is performed (a character is read as soon as available) and function keys can also be read (in that case, \texttt{Code} is an integer $>$ 255). The read character is echoed if it is printable. This facility is only possible if the \IdxK{linedit} facility has been installed \RefSP{The-line-editor} otherwise \texttt{get\_key/2} behaves similarly to \IdxPB{get\_code/2} \RefSP{get-char/2} (the code of the first character is returned) but also pumps remaining characters until a character $<$ space (0x20) is read (in particular RETURN). The same behavior occurs if \texttt{SorA} does not refer to the current input stream or if this stream is not attached to a terminal. \texttt{get\_key\_no\_echo/2} behaves similarly to \texttt{get\_key/2} except that the read character is not echoed. \texttt{get\_key/1} and \texttt{get\_key\_no\_echo/1} apply to the current input stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Code} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Code)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(input, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(input, binary\_stream, SorA)} \ErrCond{\texttt{SorA} has stream properties \texttt{end\_of\_stream(past)} and \texttt{eof\_action(error)}} \ErrTerm{permission\_error(input, past\_end\_of\_stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{peek\_char/2}, \texttt{peek\_char/1}, \texttt{peek\_code/1}, \texttt{peek\_code/2}} \AddPBD{peek\_char/2} \AddPBD{peek\_code/2} \AddPBD{peek\_char/1} \AddPBD{peek\_code/1} \begin{TemplatesOneCol} peek\_char(+stream\_or\_alias, ?in\_character)\\ peek\_char(?in\_character)\\ peek\_code(+stream\_or\_alias, ?in\_character\_code)\\ peek\_code(?in\_character\_code) \end{TemplatesOneCol} \Description \texttt{peek\_char(SorA, Char)} succeeds if \texttt{Char} unifies with the next character that will be read from the stream associated with the stream-term or alias \texttt{SorA}. The character is not read. \texttt{peek\_code/2} is similar to \texttt{peek\_char/2} but deals with character codes. \texttt{peek\_char/1} and \texttt{peek\_code/1} apply to the current input stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Char} is neither a variable nor an in-character} \ErrTerm{type\_error(in\_character, Char)} \ErrCond{\texttt{Code} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Code)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(input, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(input, binary\_stream, SorA)} \ErrCond{\texttt{SorA} has stream properties \texttt{end\_of\_stream(past)} and \texttt{eof\_action(error)}} \ErrTerm{permission\_error(input, past\_end\_of\_stream, SorA)} \ErrCond{The entity input from the stream is not a character} \ErrTerm{representation\_error(character)} \ErrCond{\texttt{Code} is an integer but not an in-character code} \ErrTerm{representation\_error(in\_character\_code)} \end{PlErrors} \Portability ISO predicates. \subsubsection{\texttt{unget\_char/2}, \texttt{unget\_char/1}, \texttt{unget\_code/2}, \texttt{unget\_code/1}} \AddPBD{unget\_char/2} \AddPBD{unget\_code/2} \AddPBD{unget\_char/1} \AddPBD{unget\_code/1} \begin{TemplatesOneCol} unget\_char(+stream\_or\_alias, +character)\\ unget\_char(+character)\\ unget\_code(+stream\_or\_alias, +character\_code)\\ unget\_code(+character\_code) \end{TemplatesOneCol} \Description \texttt{unget\_char(SorA, Char)} pushes back \texttt{Char} onto the stream associated with the stream-term or alias \texttt{SorA}. \texttt{Char} will be the next character read by \texttt{get\_char/2}. The maximum number of characters that can be cumulatively pushed back is given by the \IdxPF{max\_unget} \Idx{Prolog flag} \RefSP{set-prolog-flag/2}. \texttt{unget\_code/2} is similar to \texttt{unget\_char/2} but deals with character codes. \texttt{unget\_char/1} and \texttt{unget\_code/1} apply to the current input stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Char} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Code} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Char} is neither a variable nor a character} \ErrTerm{type\_error(character, Char)} \ErrCond{\texttt{Code} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Code)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(input, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(input, binary\_stream, SorA)} \ErrCond{\texttt{Code} is an integer but not a character code} \ErrTerm{representation\_error(character\_code)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{put\_char/2}, \texttt{put\_char/1}, \texttt{put\_code/1}, \texttt{put\_code/2}, \texttt{nl/1}, \texttt{nl/0}} \label{put-char/2} \AddPBD{put\_char/2} \AddPBD{put\_code/2} \AddPBD{nl/1} \AddPBD{put\_char/1} \AddPBD{put\_code/1} \AddPBD{nl/0} \begin{TemplatesOneCol} put\_char(+stream\_or\_alias, +character)\\ put\_char(+character)\\ put\_code(+stream\_or\_alias, +character\_code)\\ put\_code(+character\_code)\\ nl(+stream\_or\_alias)\\ nl \end{TemplatesOneCol} \Description \texttt{put\_char(SorA, Char)} writes \texttt{Char} onto the stream associated with the stream-term or alias \texttt{SorA}. \texttt{put\_code/2} is similar to \texttt{put\_char/2} but deals with character codes. \texttt{nl(SorA)} writes a new-line character onto the stream associated with the stream-term or alias \texttt{SorA}. This is equivalent to \texttt{put\_char(SorA, '{\bs}n')}. \texttt{put\_char/1}, \texttt{put\_code/1} and \texttt{nl/0} apply to the current output stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Char} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Code} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Char} is neither a variable nor a character} \ErrTerm{type\_error(character, Char)} \ErrCond{\texttt{Code} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Code)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an input stream} \ErrTerm{permission\_error(output, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(output, binary\_stream, SorA)} \ErrCond{\texttt{Code} is an integer but not a character code} \ErrTerm{representation\_error(character\_code)} \end{PlErrors} \Portability ISO predicates. \subsection{Byte input/output} \label{Byte-input/output} These built-in predicates enable a single byte to be input from and output to a binary stream. \texttt{-1} is returned to indicate the end-of-file. \subsubsection{\texttt{get\_byte/2}, \texttt{get\_byte/1}} \AddPBD{get\_byte/2} \AddPBD{get\_byte/1} \begin{TemplatesOneCol} get\_byte(+stream\_or\_alias, ?in\_byte)\\ get\_byte(?in\_byte) \end{TemplatesOneCol} \Description \texttt{get\_byte(SorA, Byte)} succeeds if \texttt{Byte} unifies with the next byte read from the stream associated with the stream-term or alias \texttt{SorA}. \texttt{get\_byte/1} applies to the current input stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Byte} is neither a variable nor an in-byte} \ErrTerm{type\_error(in\_byte, Byte)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(input, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a text stream} \ErrTerm{permission\_error(input, text\_stream, SorA)} \ErrCond{\texttt{SorA} has stream properties \texttt{end\_of\_stream(past)} and \texttt{eof\_action(error)}} \ErrTerm{permission\_error(input, past\_end\_of\_stream, SorA)} \end{PlErrors} \Portability ISO predicates. \subsubsection{\texttt{peek\_byte/2}, \texttt{peek\_byte/1}} \AddPBD{peek\_byte/2} \AddPBD{peek\_byte/1} \begin{TemplatesOneCol} peek\_byte(+stream\_or\_alias, ?in\_byte)\\ peek\_byte(?in\_byte) \end{TemplatesOneCol} \Description \texttt{peek\_byte(SorA, Byte)} succeeds if \texttt{Byte} unifies with the next byte that will be read from the stream associated with the stream-term or alias \texttt{SorA}. The byte is not read. \texttt{peek\_byte/1} applies to the current input stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Byte} is neither a variable nor an in-byte} \ErrTerm{type\_error(in\_byte, Byte)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(input, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a text stream} \ErrTerm{permission\_error(input, text\_stream, SorA)} \ErrCond{\texttt{SorA} has stream properties \texttt{end\_of\_stream(past)} and \texttt{eof\_action(error)}} \ErrTerm{permission\_error(input, past\_end\_of\_stream, SorA)} \end{PlErrors} \Portability ISO predicates. \subsubsection{\texttt{unget\_byte/2}, \texttt{unget\_byte/1}} \AddPBD{unget\_byte/2} \AddPBD{unget\_byte/1} \begin{TemplatesOneCol} unget\_byte(+stream\_or\_alias, +byte)\\ unget\_byte(+byte) \end{TemplatesOneCol} \Description \texttt{unget\_byte(SorA, Byte)} pushes back \texttt{Byte} onto the stream associated with the stream-term or alias \texttt{SorA}. \texttt{Byte} will be the next byte read by \texttt{get\_byte/2}. The maximum number of bytes that can be successively pushed back is given by the \IdxPF{max\_unget} \Idx{Prolog flag} \RefSP{set-prolog-flag/2}. \texttt{unget\_byte/1} applies to the current input stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Byte} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Byte} is neither a variable nor a byte} \ErrTerm{type\_error(byte, Byte)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(input, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a text stream} \ErrTerm{permission\_error(input, text\_stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{put\_byte/2}, \texttt{put\_byte/1}} \AddPBD{put\_byte/2} \AddPBD{put\_byte/1} \begin{TemplatesOneCol} put\_byte(+stream\_or\_alias, +byte)\\ put\_byte(+byte) \end{TemplatesOneCol} \Description \texttt{put\_byte(SorA, Byte)} writes \texttt{Byte} onto the stream associated with the stream-term or alias \texttt{SorA}. \texttt{put\_byte/1} applies to the current output stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Byte} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Byte} is neither a variable nor a byte} \ErrTerm{type\_error(byte, Byte)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(output, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a text stream} \ErrTerm{permission\_error(output, text\_stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicates. \subsection{Term input/output} \label{Term-input/output} These built-in predicates enable a Prolog term to be input from or output to a text stream. The atom \texttt{end\_of\_file} is returned as term to indicate the end-of-file. The syntax of such terms can also be altered by changing the operators \RefSP{op/3:(Term-input/output)}, and making some characters equivalent to others \RefSP{char-conversion/2} if the \IdxPF{char\_conversion} \Idx{Prolog flag} is \texttt{on} \RefSP{set-prolog-flag/2}. Double quoted tokens will be returned as an atom or a character list or a character code list depending on the value of the \IdxPF{double\_quotes} Prolog flag \RefSP{set-prolog-flag/2}. Similarly, back quoted tokens are returned depending on the value of the \IdxPF{back\_quotes} Prolog flag. \subsubsection{\texttt{read\_term/3}, \texttt{read\_term/2}, \texttt{read/2}, \texttt{read/1}} \label{read-term/3} \AddPBD{read\_term/3} \AddPBD{read/2} \AddPBD{read\_term/2} \AddPBD{read/1} \begin{TemplatesOneCol} read\_term(+stream\_or\_alias, ?term, +read\_option\_list)\\ read\_term(?term, +read\_option\_list)\\ read(+stream\_or\_alias, ?term)\\ read(?term) \end{TemplatesOneCol} \Description \texttt{read\_term(SorA, Term, Options)} is true if \texttt{Term} unifies with the next term read from the stream associated with the stream-term or alias \texttt{SorA} according to the options given by \texttt{Options}. \SPart{Read options}: \texttt{Options} is a list of read options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are: \begin{itemize} \item \IdxPOD[variables]{variables(VL)}: \texttt{VL} is unified with the list of all variables of the input term, in left-to-right traversal order. Anonymous variables are included in the list \texttt{VL}. \item \IdxPOD[variable\_names]{variable\_names(VNL)}: \texttt{VNL} is unified with the list of pairs \texttt{Name = Var} where \texttt{Var} is a named variable of the term and \texttt{Name} is the atom associated with the name of \texttt{Var}. Anonymous variables are not included in the list \texttt{VNL}. \item \IdxPOD[singletons]{singletons(SL)}: \texttt{SL} is unified with the list of pairs \texttt{Name = Var} where \texttt{Var} is a named variable which occurs only once in the term and \texttt{Name} is the atom associated to the name of \texttt{Var}. Anonymous variables are not included in the list \texttt{SL}. \item \IdxPOD[syntax\_error]{syntax\_error(error}/\texttt{warning}/\texttt{fail)}: specifies the effect of a syntax error: \begin{itemize} \item \IdxPOD{error}: a \texttt{syntax\_error} is raised. \item \IdxPOD{warning}: a warning message is displayed and the predicate fails. \item \IdxPOD{fail}: the predicate quietly fails. \end{itemize} The default value is the value of the \IdxPF{syntax\_error} \Idx{Prolog flag} \RefSP{set-prolog-flag/2}. \item \IdxPOD[end\_of\_term]{end\_of\_term(dot}/\texttt{eof)}: specifies the end-of-term delimiter: \texttt{dot} is the classical full-stop delimiter (a dot followed with a layout character), \texttt{eof} is the end-of-file delimiter. This option is useful for predicates like \IdxPB{read\_term\_from\_atom/3} \RefSP{read-term-from-atom/3} to avoid to add a terminal dot at the end of the atom. The default value is \texttt{dot}. \end{itemize} \texttt{read(SorA, Term)} is equivalent to \texttt{read\_term(SorA, Term, [])}. \texttt{read\_term/2} and \texttt{read/1} apply to the current input stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Options} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{Options} is neither a partial list nor a list} \ErrTerm{type\_error(list, Options)} \ErrCond{an element \texttt{E} of the \texttt{Options} list is neither a variable nor a valid read option} \ErrTerm{domain\_error(read\_option, E)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(input, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(input, binary\_stream, SorA)} \ErrCond{\texttt{SorA} has stream properties \texttt{end\_of\_stream(past)} and \texttt{eof\_action(error)}} \ErrTerm{permission\_error(input, past\_end\_of\_stream, SorA)} \ErrCond{a syntax error occurs and the value of the \texttt{syntax\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{syntax\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability ISO predicates. The ISO reference raises a \texttt{representation\_error(Flag)} where \texttt{Flag} is \texttt{max\_arity},\texttt{ max\_integer}, or\texttt{ min\_integer} when the read term breaches an implementation defined limit specified by \texttt{Flag}. GNU Prolog detects neither \texttt{min\_integer} nor \texttt{max\_integer} violation and treats a \texttt{max\_arity} violation as a syntax error. The read options \texttt{syntax\_error/1} and \texttt{end\_of\_term/1} are GNU Prolog extensions. \subsubsection{\texttt{read\_atom/2}, \texttt{read\_atom/1}, \texttt{read\_integer/2}, \texttt{read\_integer/1}, \\ \texttt{read\_number/2}, \texttt{read\_number/1}} \label{read-atom/2} \AddPBD{read\_atom/2} \AddPBD{read\_integer/2} \AddPBD{read\_number/2} \AddPBD{read\_atom/1} \AddPBD{read\_integer/1} \AddPBD{read\_number/1} \begin{TemplatesOneCol} read\_atom(+stream\_or\_alias, ?atom)\\ read\_atom(?atom)\\ read\_integer(+stream\_or\_alias, ?integer)\\ read\_integer(?integer)\\ read\_number(+stream\_or\_alias, ?number)\\ read\_number(?number) \end{TemplatesOneCol} \Description \texttt{read\_atom(SorA, Atom)} succeeds if \texttt{Atom} unifies with the next atom read from the stream associated with the stream-term or alias \texttt{SorA}. \texttt{read\_integer(SorA, Integer)} succeeds if \texttt{Integer} unifies with the next integer read from the stream associated with the stream-term or alias \texttt{SorA}. \texttt{read\_number(SorA, Number)} succeeds if \texttt{Number} unifies with the next number (integer or floating point number) read from the stream associated with the stream-term or alias \texttt{SorA}. \texttt{read\_atom/1}, \texttt{read\_integer/1} and \texttt{read\_number/1} apply to the current input stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Atom} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom)} \ErrCond{\texttt{Integer} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Integer)} \ErrCond{\texttt{Number} is neither a variable nor a number} \ErrTerm{type\_error(number, Number)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(input, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(input, binary\_stream, SorA)} \ErrCond{\texttt{SorA} has stream properties \texttt{end\_of\_stream(past)} and \texttt{eof\_action(error)}} \ErrTerm{permission\_error(input, past\_end\_of\_stream, SorA)} \ErrCond{a syntax error occurs and the value of the \texttt{syntax\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{syntax\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{read\_token/2}, \texttt{read\_token/1}} \label{read-token/2} \AddPBD{read\_token/2} \AddPBD{read\_token/1} \begin{TemplatesOneCol} read\_token(+stream\_or\_alias, ?nonvar)\\ read\_token(?nonvar) \end{TemplatesOneCol} \Description \texttt{read\_token(SorA, Token)} succeeds if \texttt{Token} unifies with the encoding of the next Prolog token read from the stream associated with stream-term or alias \texttt{SorA}. \SPart{Token encoding}: \begin{itemize} \item \IdxPTD[var]{var(A)}: a variable is read whose name is the atom \texttt{A}. \item an atom \texttt{A}: an atom \texttt{A} is read. \item integer \texttt{N}: an integer \texttt{N} is read. \item floating point number \texttt{N}: a floating point number \texttt{N} is read. \item \IdxPTD[string]{string(A)}: a string (double quoted item) is read whose characters forms the atom \texttt{A}. \item \IdxPTD[punct]{punct(P)}: a punctuation character \texttt{P} is read (\texttt{P} is a one-character atom in \texttt{()[]{\lb}|{\rb}}, the atom \texttt{full\_stop} or the atom \texttt{end\_of\_file}). \item \IdxPTD[back\_quotes]{back\_quotes(A)}: a back quoted item is read whose characters forms the atom \texttt{A}. \item \IdxPTD[extended]{extended(A)}: an extended character \texttt{A} (an atom) is read. \end{itemize} As for \texttt{read\_term/3}, the behavior of \texttt{read\_token/2} can be affected by some \Idx[Prolog flag]{Prolog flags} \RefSP{Term-input/output}. \texttt{read\_token/1} applies to the current input stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an output stream} \ErrTerm{permission\_error(input, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(input, binary\_stream, SorA)} \ErrCond{\texttt{SorA} has stream properties \texttt{end\_of\_stream(past)} and \texttt{eof\_action(error)}} \ErrTerm{permission\_error(input, past\_end\_of\_stream, SorA)} \ErrCond{a syntax error occurs and the value of the \texttt{syntax\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{syntax\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{syntax\_error\_info/4}} \label{syntax-error-info/4} \AddPBD{syntax\_error\_info/4} \begin{TemplatesOneCol} syntax\_error\_info(?atom, ?integer, ?integer, ?atom) \end{TemplatesOneCol} \Description \texttt{syntax\_error\_info(FileName, Line, Column, Error)} returns the information associated with the last syntax error. \texttt{Line} is the line number of the error, \texttt{Column} is the column number of the error and \texttt{Error} is an atom explaining the error. \begin{PlErrors} \ErrCond{\texttt{FileName} is neither a variable nor an atom} \ErrTerm{type\_error(atom, FileName)} \ErrCond{\texttt{Line} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Line)} \ErrCond{\texttt{Column} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Column)} \ErrCond{\texttt{Error} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Error)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{last\_read\_start\_line\_column/2}} \AddPBD{last\_read\_start\_line\_column/2} \begin{TemplatesOneCol} last\_read\_start\_line\_column(?integer, ?integer) \end{TemplatesOneCol} \Description \texttt{last\_read\_start\_line\_column(Line, Column)} unifies \texttt{Line} and \texttt{Column} with the line number and the column number associated with the start of the last read predicate. This predicate can be used after calling one of the following predicates: \IdxPB{read\_term/3}, \IdxPB{read\_term/2}, \IdxPB{read/2}, \IdxPB{read/1} \RefSP{read-term/3}, \IdxPB{read\_atom/2}, \IdxPB{read\_atom/1}, \IdxPB{read\_integer/2}, \IdxPB{read\_integer/1}, \IdxPB{read\_number/2}, \IdxPB{read\_number/1} \RefSP{read-atom/2} or \IdxPB{read\_token/2}, \IdxPB{read\_token/1} \RefSP{read-token/2}. \begin{PlErrors} \ErrCond{\texttt{Line} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Line)} \ErrCond{\texttt{Column} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Column)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{write\_term/3}, \texttt{write\_term/2}, \texttt{write/2}, \texttt{write/1}, \texttt{writeq/2}, \texttt{writeq/1}, \\ \texttt{write\_canonical/2}, \texttt{write\_canonical/1}, \texttt{display/2}, \texttt{display/1}, \texttt{print/2}, \\ \texttt{print/1}} \label{write-term/3} \AddPBD{write\_term/3} \AddPBD{portray/1} \AddPBD{write/2} \AddPBD{writeq/2} \AddPBD{write\_canonical/2} \AddPBD{display/2} \AddPBD{print/2} \AddPBD{write\_term/2} \AddPBD{write/1} \AddPBD{writeq/1} \AddPBD{write\_canonical/1} \AddPBD{display/1} \AddPBD{print/1} \begin{TemplatesOneCol} write\_term(+stream\_or\_alias, ?term, +write\_option\_list)\\ write\_term(?term, +write\_option\_list)\\ write(+stream\_or\_alias, ?term)\\ write(?term)\\ writeq(+stream\_or\_alias, ?term)\\ writeq(?term)\\ write\_canonical(+stream\_or\_alias, ?term)\\ write\_canonical(?term)\\ display(+stream\_or\_alias, ?term)\\ display(?term)\\ print(+stream\_or\_alias, ?term)\\ print(?term) \end{TemplatesOneCol} \Description \texttt{write\_term(SorA, Term, Options)} writes \texttt{Term} to the stream associated with the stream-term or alias \texttt{SorA} according to the options given by \texttt{Options}. \SPart{Write options}: \texttt{Options} is a list of write options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are: \begin{itemize} \item \IdxPOD[quoted]{quoted(true}/\texttt{false)}: if \texttt{true} each atom and functor is quoted if this would be necessary for the term to be input by \texttt{read\_term/3}. If \texttt{false} no extra quotes are written. The default value is \texttt{false}. \item \IdxPOD[ignore\_ops]{ignore\_ops(true}/\texttt{false)}: if \texttt{true} each compound term is output in functional notation (neither operator notation nor list notation is used). If \texttt{false} operator and list notations are used. The default value is \texttt{false}. \item \IdxPOD[numbervars]{numbervars(true}/\texttt{false)}: if \texttt{true} a term of the form \texttt{'\$VAR'(N)}, where \texttt{N} is an integer, is output as a variable name (see below). If \texttt{false} such a term is output normally (according to the other options). The default value is \texttt{true}. \item \IdxPOD[namevars]{namevars(true}/\texttt{false)}: if \texttt{true} a term of the form \texttt{'\$VARNAME'(Name)}, where \texttt{Name} is an atom, is output as a variable name (see below). If \texttt{false} such a term is output normally (according to the other options). The default value is \texttt{true}. \item \IdxPOD[space\_args]{space\_args(true}/\texttt{false)}: if \texttt{true} an extra space character is emitted after each comma separating the arguments of a compound term in functional notation or of a list. If \texttt{false} no extra space is emitted. The default value is \texttt{false}. \item \IdxPOD[portrayed]{portrayed(true}/\texttt{false)}: if \texttt{true} and if there exists a predicate \texttt{portray/1}, \texttt{write\_term/3} acts as follows: if \texttt{Term} is a variable it is simply written. If \texttt{Term} is non-variable then it is passed to \texttt{portray/1}. If this succeeds then it is assumed that \texttt{Term} has been output. Otherwise \texttt{write\_term/3} outputs the principal functor of \texttt{Term} (\texttt{Term} itself if it is atomic) according to other options and recursively calls \texttt{portray/1} on the components of \texttt{Term} (if it is a compound term). With \texttt{ignore\_ops(false)} a list is first passed to \texttt{portray/1} and only if this call fails each element of the list is passed to \texttt{portray/1} (thus every sub-list is not passed). The default value is \texttt{false}. \item \IdxPOD[max\_depth]{max\_depth(N)}: controls the depth of output for compound terms. \texttt{N} is an integer specifying the depth. The output of a term whose depth is greater than \texttt{N} gives rise to the output of \texttt{...} (3 dots). By default there is no depth limit. \item \IdxPOD[priority]{priority(N)}: specifies the starting priority to output the term. This option controls if \texttt{Term} should be enclosed in brackets. \texttt{N} is a positive integer $\leq$ 1200. By default \texttt{N} = 1200. \end{itemize} \SPart{Variable numbering}: when the \texttt{numbervars(true)} option is passed to \texttt{write\_term/3} any term of the form \texttt{'\$VAR'(N)} where \texttt{N} is an integer is output as a variable name consisting of a capital letter possibly followed by an integer. The capital letter is the \texttt{(I+1)}\emph{th} letter of the alphabet and the integer is \texttt{J}, where \texttt{I = N mod 26} and \texttt{J = N // 26}. The integer \texttt{J} is omitted if it is zero. For example: \begin{CodeTwoCols}[2cm] \Two{'\$VAR'(0)}{is written as \texttt{A}} \Two{'\$VAR'(1)}{is written as \texttt{B}} \One{...} \Two{'\$VAR'(25)}{is written as \texttt{Z}} \Two{'\$VAR'(26)}{is written as \texttt{A1}} \Two{'\$VAR'(27)}{is written as \texttt{B1}} \end{CodeTwoCols} \SPart{Variable naming}: when the \texttt{namevars(true)} option is passed to \texttt{write\_term/3} any term of the form \texttt{'\$VARNAME'(Name)} where \texttt{Name} is an atom is output as a variable name consisting of the characters \texttt{Name}. For example: \texttt{'\$VARNAME'('A')} is written as \texttt{A} (even in the presence of the \texttt{quoted(true)} option). \texttt{write(SorA, Term)} is equivalent to \texttt{write\_term(SorA, Term, [])}. \texttt{writeq(SorA, Term)} is equivalent to \texttt{write\_term(SorA, Term, [quoted(true)])}. \texttt{write\_canonical(SorA, Term)} is equivalent to \texttt{write\_term(SorA, Term, [quoted(true), \\ ignore\_ops(true), numbervars(false)])}. \texttt{display(SorA, Term)} is equivalent to \texttt{write\_term(SorA, Term, [ignore\_ops(true), \\ numbervars(false)])}. \texttt{print(SorA, Term)} is equivalent to \texttt{write\_term(SorA, Term, [numbervars(false), \\ portrayed(true)])}. \texttt{write\_term/2}, \texttt{write/1}, \texttt{writeq/1}, \texttt{write\_canonical/1}, \texttt{display/1} and \texttt{print/1} apply to the current output stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Options} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Options} is neither a partial list nor a list} \ErrTerm{type\_error(list, Options)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{an element \texttt{E} of the \texttt{Options} list is neither a variable nor a valid write-option} \ErrTerm{domain\_error(write\_option, E)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an input stream} \ErrTerm{permission\_error(output, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(output, binary\_stream, SorA)} \end{PlErrors} \Portability ISO predicates except \texttt{display/1-2} and \texttt{print/1-2} that are GNU Prolog predicates. \texttt{namevars/1}, \texttt{space\_args/1}, \texttt{portrayed/1}, \texttt{max\_depth/1} and \texttt{priority/1} options are GNU Prolog extensions. \subsubsection{\texttt{format/3}, \texttt{format/2}} \label{format/3} \AddPBD{format/3} \AddPBD{format/2} \begin{TemplatesOneCol} format(+stream\_or\_alias, +character\_code\_list\_or\_atom, +list)\\ format(+character\_code\_list\_or\_atom, +list) \end{TemplatesOneCol} \Description \texttt{format(SorA, Format, Arguments)} writes the \texttt{Format} string replacing each format control sequence \texttt{F} by the corresponding element of \texttt{Arguments} (formatted according to \texttt{F}) to the stream associated with the stream-term or alias \texttt{SorA}. \SPart{Format control sequences}: the general format of a control sequence is \texttt{'\~{}NC'}. The character \texttt{C} determines the type of the control sequence. \texttt{N} is an optional numeric argument. An alternative form of \texttt{N} is \texttt{'*'}. \texttt{'*'} implies that the next argument \texttt{Arg} in \texttt{Arguments} should be used as a numeric argument in the control sequence. The use of C \texttt{printf()} formatting sequence (beginning by the character \texttt{\%}) is also allowed. The following control sequences are available: \begin{tabular}{|C{1.4cm}|C{2.8cm}|p{10.45cm}|} \hline Format sequence & type of the argument & Description \\ \hline\hline \texttt{\~{}Na} & atom & print the atom without quoting. \texttt{N} is minimal number of characters to print using spaces on the rigth if needed (default: the length of the atom) \\ \hline \texttt{\~{}Nc} & character code & print the character associated with the code. \texttt{N} is the number of times to print the character (default: 1)\\ \hline \texttt{ \~{}Nf} \linebreak \texttt{\~{}Ne \~{}NE \~{}Ng \~{}NG} & float expression & pass the argument \texttt{Arg} and \texttt{N} to the C \texttt{printf()} function as: \linebreak if \texttt{N} is not specified \texttt{printf("\%f",Arg)} else \texttt{printf("\%.Nf",Arg)}. \linebreak Similarly for \texttt{\~{}Ne}, \texttt{\~{}NE}, \texttt{\~{}Ng} and \texttt{\~{}NG} \\ \hline \texttt{\~{}Nd} & integer expression & print the argument. \texttt{N} is the number of digits after the decimal point. If \texttt{N} is 0 no decimal point is printed (default: 0)\\ \hline \texttt{\~{}ND} & integer expression & identical to \texttt{\~{}Nd} except that \texttt{','} separates groups of three digits to the left of the decimal point \\ \hline \texttt{\~{}Nr} & integer expression & print the argument according to the radix \texttt{N}. 2 $\leq$ \texttt{N} $\leq$ 36 (default: 8). The letters \texttt{a-z} denote digits $>$ 9 \\ \hline \texttt{\~{}NR} & integer expression & identical to \texttt{\~{}Nr} except that the letters \texttt{A-Z} denote digits $>$ 9 \\ \hline \texttt{\~{}Ns} & character code list & print exactly \texttt{N} characters (default: the length of the list) \\ \hline \texttt{\~{}NS} & character list & print exactly \texttt{N} characters (default: the length of the list) \\ \hline \texttt{\~{}i} & term & ignore the current argument \\ \hline \texttt{\~{}k} & term & pass the argument to \IdxPB{write\_canonical/1} \RefSP{write-term/3} \\ \hline \texttt{\~{}p} & term & pass the argument to \IdxPB{print/1} \RefSP{write-term/3} \\ \hline \texttt{\~{}q} & term & pass the argument to \IdxPB{writeq/1} \RefSP{write-term/3} \\ \hline \texttt{\~{}w} & term & pass the argument to \IdxPB{write/1} \RefSP{write-term/3} \\ \hline \texttt{\~{}\~{}} & none & print the character \texttt{'\~{}'} \\ \hline \texttt{\~{}Nn} & none & print \texttt{N} new-line characters (default: 1) \\ \hline \texttt{\~{}N} & none & print a new-line character if not at the beginning of a line \\ \hline \texttt{\~{}?} & atom & use the argument as a nested format string \\ \hline \texttt{\%F} & atom, integer or float expression & interface to the C function \texttt{printf(3)} for outputting atoms (C string), integers and floating point numbers. \texttt{*} are also allowed. \\ \hline \end{tabular} \texttt{format/2} applies to the current output stream. \begin{PlErrors} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Format} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Arguments} is a partial list} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Format} is neither a partial list nor a list or an atom} \ErrTerm{type\_error(list, Format)} \ErrCond{\texttt{Arguments} is neither a partial list nor a list} \ErrTerm{type\_error(list, Arguments)} \ErrCond{an element \texttt{E} of the \texttt{Format} list is neither a variable nor a character code} \ErrTerm{representation\_error(character\_code, E)} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{an element \texttt{E} of Format is not a valid format control sequence} \ErrTerm{domain\_error(format\_control\_sequence, E)} \ErrCond{the \texttt{Arguments} list does not contain sufficient elements} \ErrTerm{domain\_error(non\_empty\_list, [])} \ErrCond{an element \texttt{E} of the \texttt{Arguments} list is a variable while a non-variable term was expected} \ErrTerm{instantiation\_error} \ErrCond{an element \texttt{E} of the \texttt{Arguments} list is neither variable nor an atom while an atom was expected} \ErrTerm{type\_error(atom, E)} \ErrCond{an element \texttt{E} of the \texttt{Arguments} cannot be evaluated as an arithmetic expression while an integer or a floating point number was expected} \ErrTermRm{an arithmetic error \RefSP{Evaluation-of-an-arithmetic-expression}} \ErrCond{an element \texttt{E} of the \texttt{Arguments} list is neither variable nor character code while a character code was expected} \ErrTerm{representation\_error(character\_code, E)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an input stream} \ErrTerm{permission\_error(output, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(output, binary\_stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{portray\_clause/2}, \texttt{portray\_clause/1}} \label{portray-clause/2} \AddPBD{portray\_clause/2} \AddPBD{portray\_clause/1} \begin{TemplatesOneCol} portray\_clause(+stream\_or\_alias, +clause)\\ portray\_clause(+clause) \end{TemplatesOneCol} \Description \texttt{portray\_clause(SorA, Clause)} pretty prints \texttt{Clause} to the stream associated with the stream-term or alias \texttt{SorA}. \texttt{portray\_clause/2} uses the variable binding predicates \IdxPB{name\_singleton\_vars/1} \RefSP{name-singleton-vars/1} and \IdxPB{numbervars/1} \RefSP{bind-variables/2}. This predicate is used by \IdxPB{listing/1} \RefSP{listing/1}. \texttt{portray\_clause/1} applies to the current output stream. \begin{PlErrors} \ErrCond{\texttt{Clause} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Clause} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Clause)} \ErrCond{\texttt{SorA} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{SorA} is neither a variable nor a stream-term or alias} \ErrTerm{domain\_error(stream\_or\_alias, SorA)} \ErrCond{\texttt{SorA} is not associated with an open stream} \ErrTerm{existence\_error(stream, SorA)} \ErrCond{\texttt{SorA} is an input stream} \ErrTerm{permission\_error(output, stream, SorA)} \ErrCond{\texttt{SorA} is associated with a binary stream} \ErrTerm{permission\_error(output, binary\_stream, SorA)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{get\_print\_stream/1}} \AddPBD{get\_print\_stream/1} \begin{TemplatesOneCol} get\_print\_stream(?stream) \end{TemplatesOneCol} \Description \texttt{get\_print\_stream(Stream)} unifies \texttt{Stream} with the stream-term associated with the output stream used by \IdxPB{print/2} \RefSP{write-term/3}. The purpose of this predicate is to allow a user-defined \IdxPB{portray/1} predicate to identify the output stream in use. \begin{PlErrors} \ErrCond{\texttt{Stream} is neither a variable nor a stream-term} \ErrTerm{domain\_error(stream, Stream)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{op/3}} \label{op/3:(Term-input/output)} \AddPBD{op/3} \begin{TemplatesOneCol} op(+integer, +operator\_specifier, +atom\_or\_atom\_list) \end{TemplatesOneCol} \Description \texttt{op(Priority, OpSpecifier, Operator)} alters the operator table. \texttt{Operator} is declared as an operator with properties defined by specifier \texttt{OpSpecifier} and \texttt{Priority}. \texttt{Priority} must be an integer $\geq$ 0 and $\leq$ 1200. If \texttt{Priority} is 0 then the operator properties of \texttt{Operator} (if any) are canceled. \texttt{Operator} may also be a list of atoms in which case all of them are declared to be operators. In general, operators can be removed from the operator table and their priority or specifier can be changed. However, it is an error to attempt to change the \texttt{','} operator from its initial status. An atom can have multiple operator definitions (e.g. prefix and infix like \texttt{+}) however an atom cannot have both an infix and a postfix operator definitions. \SPart{Operator specifiers}: the following specifiers are available: \begin{tabular}{|c|c|c|} \hline Specifier & Type & Associativity \\ \hline\hline \texttt{fx} & prefix & no \\ \hline \texttt{fy} & prefix & yes \\ \hline \texttt{xf} & postfix & no \\ \hline \texttt{yf} & postfix & yes \\ \hline \texttt{xfx} & infix & no \\ \hline \texttt{yfx} & infix & left \\ \hline \texttt{xfy} & infix & right \\ \hline \end{tabular} \SPart{Prolog predefined operators}: \begin{tabular}{|r|c|L{11cm}|} \hline Priority & Specifier & Operators \\ \hline\hline \texttt{1200} & \texttt{xfx} & \texttt{:- ~--{\gt}} \\ \hline \texttt{1200} & \texttt{fx} & \texttt{:-} \\ \hline \texttt{1100} & \texttt{xfy} & \texttt{;} \\ \hline \texttt{1050} & \texttt{xfy} & \texttt{-{\gt}} \\ \hline \texttt{1000} & \texttt{xfy} & \texttt{,} \\ \hline \texttt{900} & \texttt{fy} & \texttt{{\bs}+} \\ \hline \texttt{700} & \texttt{xfx} & \texttt{= ~{\bs}= ~=.. ~== ~{\bs}== ~@{\lt} ~@={\lt} ~@{\gt} ~@{\gt}= ~is ~=:= ~={\bs}= ~{\lt} ~={\lt} ~{\gt} ~{\gt}=} \\ \hline \texttt{600} & \texttt{xfy} & \texttt{:} \\ \hline \texttt{500} & \texttt{yfx} & \texttt{+ ~- ~/{\bs} ~{\bs}/} \\ \hline \texttt{400} & \texttt{yfx} & \texttt{* ~/ ~// ~rem ~mod ~{\lt}{\lt} ~{\gt}{\gt}} \\ \hline \texttt{200} & \texttt{xfy} & \texttt{** ~\^{}} \\ \hline \texttt{200} & \texttt{fy} & \texttt{+ ~- ~{\bs}} \\ \hline \end{tabular} \SPart{FD predefined operators}: \begin{tabular}{|r|c|L{11cm}|} \hline Priority & Specifier & Operators \\ \hline\hline \texttt{750} & \texttt{xfy} & \texttt{\#{\lt}={\gt} ~\#{\bs}{\lt}={\gt}} \\ \hline \texttt{740} & \texttt{xfy} & \texttt{\#=={\gt} ~\#{\bs}=={\gt}} \\ \hline \texttt{730} & \texttt{xfy} & \texttt{\#\# ~\#{\bs}/ ~\#{\bs}{\bs}/} \\ \hline \texttt{720} & \texttt{yfx} & \texttt{\#/{\bs} ~\#{\bs}/{\bs}} \\ \hline \texttt{710} & \texttt{fy} & \texttt{\#{\bs}} \\ \hline \texttt{700} & \texttt{xfx} & \texttt{\#= ~\#{\bs}= ~\#{\lt} ~\#={\lt} ~\#{\gt} ~\#{\gt}= ~\#=\# ~\#{\bs}=\# ~\#{\lt}\# ~\#={\lt}\# ~\#{\gt}\# ~\#{\gt}=\#} \\ \hline \texttt{500} & \texttt{yfx} & \texttt{+ ~-} \\ \hline \texttt{400} & \texttt{yfx} & \texttt{* ~/ ~// ~rem} \\ \hline \texttt{200} & \texttt{xfy} & \texttt{**} \\ \hline \texttt{200} & \texttt{fy} & \texttt{+ ~-} \\ \hline \end{tabular} \begin{PlErrors} \ErrCond{\texttt{Priority} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{OpSpecifier} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Operator} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Priority} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Priority)} \ErrCond{\texttt{OpSpecifier} is neither a variable nor an atom} \ErrTerm{type\_error(atom, OpSpecifier)} \ErrCond{\texttt{Operator} is neither a partial list nor a list nor an atom} \ErrTerm{type\_error(list, Operator)} \ErrCond{an element \texttt{E} of the \texttt{Operator} list is neither a variable nor an atom} \ErrTerm{type\_error(atom, E)} \ErrCond{\texttt{Priority} is an integer not $\geq$ 0 and $\leq$ 1200} \ErrTerm{domain\_error(operator\_priority, Priority)} \ErrCond{\texttt{OpSpecifier} is not a valid operator specifier} \ErrTerm{domain\_error(operator\_specifier, OpSpecifier)} \ErrCond{\texttt{Operator} is \texttt{','} or an element of the \texttt{Operator} list is \texttt{','}} \ErrTerm{permission\_error(modify, operator, ',')} \ErrCond{\texttt{OpSpecifier} is a specifier such that \texttt{Operator} would have a postfix and an infix definition.} \ErrTerm{permission\_error(create, operator, Operator)} \end{PlErrors} \Portability ISO predicate. The ISO reference implies that if a program calls \texttt{current\_op/3}, then modifies an operator definition by calling \texttt{op/3} and backtracks into the call to \texttt{current\_op/3}, then the changes are guaranteed not to affect that \texttt{current\_op/3} goal. This is not guaranteed by GNU Prolog. \subsubsection{\texttt{current\_op/3}} \AddPBD{current\_op/3} \begin{TemplatesOneCol} current\_op(?integer, ?operator\_specifier, ?atom) \end{TemplatesOneCol} \Description \texttt{current\_op(Priority, OpSpecifier, Operator)} succeeds if \texttt{Operator} is an operator with properties defined by specifier \texttt{OpSpecifier} and \texttt{Priority}. This predicate is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{Priority} is neither a variable nor an operator priority} \ErrTerm{domain\_error(operator\_priority, Priority)} \ErrCond{\texttt{OpSpecifier} is neither a variable nor an operator specifier} \ErrTerm{domain\_error(operator\_specifier, OpSpecifier)} \ErrCond{\texttt{Operator} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Operator)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{char\_conversion/2}} \label{char-conversion/2} \AddPBD{char\_conversion/2} \begin{TemplatesOneCol} char\_conversion(+character, +character) \end{TemplatesOneCol} \Description \texttt{char\_conversion(InChar, OutChar)} alters the character-conversion mapping. This mapping is used by the following read predicates: \IdxPB{read\_term/3} \RefSP{read-term/3}, \IdxPB{read\_atom/2}, \IdxPB{read\_integer/2}, \IdxPB{read\_number/2} \RefSP{read-atom/2} and \IdxPB{read\_token/2} \RefSP{read-token/2} to replace any occurrence of a character \texttt{InChar} by \texttt{OutChar}. However the conversion mechanism should have been previously activated by switching on the \IdxPF{char\_conversion} \Idx{Prolog flag} \RefSP{set-prolog-flag/2}. When \texttt{InChar} and \texttt{OutChar} are the same, the effect is to remove any conversion of a character \texttt{InChar}. Note that the single character read predicates (e.g. \texttt{get\_char/2}) never do character conversion. If such behavior is required, it must be explicitly done using \texttt{current\_char\_conversion/2} \RefSP{current-char-conversion/2}. \begin{PlErrors} \ErrCond{\texttt{InChar} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{OutChar} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{InChar} is neither a variable nor a character} \ErrTerm{type\_error(character, InChar)} \ErrCond{\texttt{OutChar} is neither a variable nor a character} \ErrTerm{type\_error(character, OutChar)} \end{PlErrors} \Portability ISO predicate. The \texttt{type\_error(character,\ldots)} is a GNU Prolog behavior, the ISO reference instead defines a \texttt{representation\_error(character)} in this case. This seems to be an error of the ISO reference since, for many other built-in predicates accepting a character (e.g. \texttt{char\_code/2}, \texttt{put\_char/2}), a \texttt{type\_error} is raised. The ISO reference implies that if a program calls \texttt{current\_char\_conversion/2}, then modifies the character mapping by calling \texttt{char\_conversion/2}, and backtracks into the call to \texttt{current\_char\_conversion/2} then the changes are guaranteed not to affect that \texttt{current\_char\_conversion/2} goal. This is not guaranteed by GNU Prolog. \subsubsection{\texttt{current\_char\_conversion/2}} \label{current-char-conversion/2} \AddPBD{current\_char\_conversion/2} \begin{TemplatesOneCol} current\_char\_conversion(?character, ?character) \end{TemplatesOneCol} \Description \texttt{current\_char\_conversion(InChar, OutChar)} succeeds if the conversion of \texttt{InChar} is \texttt{OutChar} according to the character-conversion mapping. In that case, \texttt{InChar} and \texttt{OutChar} are different. This predicate is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{InChar} is neither a variable nor a character} \ErrTerm{type\_error(character, InChar)} \ErrCond{\texttt{OutChar} is neither a variable nor a character} \ErrTerm{type\_error(character, OutChar)} \end{PlErrors} \Portability ISO predicate. Same remark as for char\_conversion/2 \RefSP{char-conversion/2}. \subsection{Input/output from/to constant terms} \label{Input/output-from/to-constant-terms} These built-in predicates enable a Prolog term to be input from or output to a Prolog constant term (atom, character list or character code list). All these predicates can be defined using constant term streams \RefSP{Constant-term-streams}. They are however simpler to use. \subsubsection{\texttt{read\_term\_from\_atom/3}, \texttt{read\_from\_atom/2}, \texttt{read\_token\_from\_atom/2}} \label{read-term-from-atom/3} \AddPBD{read\_term\_from\_atom/3} \AddPBD{read\_from\_atom/2} \AddPBD{read\_token\_from\_atom/2} \begin{TemplatesOneCol} read\_term\_from\_atom(+atom ?term, +read\_option\_list)\\ read\_from\_atom(+atom, ?term)\\ read\_token\_from\_atom(+atom, ?nonvar) \end{TemplatesOneCol} \Description \texttt{}% \texttt{}% \texttt{}% Like \IdxPB{read\_term/3}, \IdxPB{read/2} \RefSP{read-term/3} and \IdxPB{read\_token/2} \RefSP{read-token/2} except that characters are not read from a text-stream but from \texttt{Atom}; the atom given as first argument. \begin{PlErrors} \ErrCond{\texttt{Atom} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Atom} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom)} \ErrCond{see associated predicate errors} \ErrTermRm{\RefSP{read-term/3} and \RefSP{read-token/2}} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{read\_term\_from\_chars/3}, \texttt{read\_from\_chars/2}, \texttt{read\_token\_from\_chars/2}} \AddPBD{read\_term\_from\_chars/3} \AddPBD{read\_from\_chars/2} \AddPBD{read\_token\_from\_chars/2} \begin{TemplatesOneCol} read\_term\_from\_chars(+character\_list ?term, +read\_option\_list)\\ read\_from\_chars(+character\_list, ?term)\\ read\_token\_from\_chars(+character\_list, ?nonvar) \end{TemplatesOneCol} \Description \texttt{}% \texttt{}% \texttt{}% Like \IdxPB{read\_term/3}, \IdxPB{read/2} \RefSP{read-term/3} and \IdxPB{read\_token/2} \RefSP{read-token/2} except that characters are not read from a text-stream but from \texttt{Chars}; the character list given as first argument. \begin{PlErrors} \ErrCond{\texttt{Chars} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Chars} is neither a partial list nor a list} \ErrTerm{type\_error(list, Chars)} \ErrCond{an element \texttt{E} of the \texttt{Chars} list is neither a variable nor a character} \ErrTerm{type\_error(character, E)} \ErrCond{see associated predicate errors} \ErrTermRm{\RefSP{read-term/3} and \RefSP{read-token/2}} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{read\_term\_from\_codes/3}, \texttt{read\_from\_codes/2}, \texttt{read\_token\_from\_codes/2}} \AddPBD{read\_term\_from\_codes/3} \AddPBD{read\_from\_codes/2} \AddPBD{read\_token\_from\_codes/2} \begin{TemplatesOneCol} read\_term\_from\_codes(+character\_code\_list ?term, +read\_option\_list)\\ read\_from\_codes(+character\_code\_list, ?term)\\ read\_token\_from\_codes(+character\_code\_list, ?nonvar) \end{TemplatesOneCol} \Description \texttt{}% \texttt{}% \texttt{}% Like \IdxPB{read\_term/3}, \IdxPB{read/2} \RefSP{read-term/3} and \IdxPB{read\_token/2} \RefSP{read-token/2} except that characters are not read from a text-stream but from \texttt{Codes}; the character code list given as first argument. \begin{PlErrors} \ErrCond{\texttt{Codes} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Codes} is neither a partial list nor a list} \ErrTerm{type\_error(list, Codes)} \ErrCond{an element \texttt{E} of the \texttt{Codes} list is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \ErrCond{an element \texttt{E} of the \texttt{Codes} list is an integer but not a character code} \ErrTerm{representation\_error(character\_code, E)} \ErrCond{see associated predicate errors} \ErrTermRm{\RefSP{read-term/3} and \RefSP{read-token/2}} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{write\_term\_to\_atom/3}, \texttt{write\_to\_atom/2}, \texttt{writeq\_to\_atom/2}, \\ \texttt{write\_canonical\_to\_atom/2}, \texttt{display\_to\_atom/2}, \texttt{print\_to\_atom/2}, \\ \texttt{format\_to\_atom/3}} \AddPBD{write\_term\_to\_atom/3} \AddPBD{write\_to\_atom/2} \AddPBD{writeq\_to\_atom/2} \AddPBD{write\_canonical\_to\_atom/2} \AddPBD{display\_to\_atom/2} \AddPBD{print\_to\_atom/2} \AddPBD{format\_to\_atom/3} \begin{TemplatesOneCol} write\_term\_to\_atom(?atom, ?term, +write\_option\_list)\\ write\_to\_atom(?atom, ?term)\\ writeq\_to\_atom(?atom, ?term)\\ write\_canonical\_to\_atom(?atom, ?term)\\ display\_to\_atom(?atom, ?term)\\ print\_to\_atom(?atom, ?term)\\ format\_to\_atom(?atom, +character\_code\_list\_or\_atom, +list) \end{TemplatesOneCol} \Description \texttt{}% \texttt{}% \texttt{}% \texttt{}% \texttt{}% \texttt{}% \texttt{}% Similar to \IdxPB{write\_term/3}, \IdxPB{write/2}, \IdxPB{writeq/2}, \IdxPB{write\_canonical/2}, \IdxPB{display/2}, \IdxPB{print/2} \RefSP{write-term/3} and \IdxPB{format/3} \RefSP{format/3} except that characters are not written onto a text-stream but are collected as an atom which is then unified with the first argument \texttt{Atom}. \begin{PlErrors} \ErrCond{\texttt{Atom} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom)} \ErrCond{see associated predicate errors} \ErrTermRm{\RefSP{write-term/3} and \RefSP{format/3}} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{write\_term\_to\_chars/3}, \texttt{write\_to\_chars/2}, \texttt{writeq\_to\_chars/2}, \\ \texttt{write\_canonical\_to\_chars/2}, \texttt{display\_to\_chars/2}, \texttt{print\_to\_chars/2}, \\ \texttt{format\_to\_chars/3}} \AddPBD{write\_term\_to\_chars/3} \AddPBD{write\_to\_chars/2} \AddPBD{writeq\_to\_chars/2} \AddPBD{write\_canonical\_to\_chars/2} \AddPBD{display\_to\_chars/2} \AddPBD{print\_to\_chars/2} \AddPBD{format\_to\_chars/3} \begin{TemplatesOneCol} write\_term\_to\_chars(?character\_list, ?term, +write\_option\_list)\\ write\_to\_chars(?character\_list, ?term)\\ writeq\_to\_chars(?character\_list, ?term)\\ write\_canonical\_to\_chars(?character\_list, ?term)\\ display\_to\_chars(?character\_list, ?term)\\ print\_to\_chars(?character\_list, ?term)\\ format\_to\_chars(?character\_list, +character\_code\_list\_or\_atom, +list) \end{TemplatesOneCol} \Description \texttt{}% \texttt{}% \texttt{}% \texttt{}% \texttt{}% \texttt{}% \texttt{}% Similar to \IdxPB{write\_term/3}, \IdxPB{write/2}, \IdxPB{writeq/2}, \IdxPB{write\_canonical/2}, \IdxPB{display/2}, \IdxPB{print/2} \RefSP{write-term/3} and \IdxPB{format/3} \RefSP{format/3} except that characters are not written onto a text-stream but are collected as a character list which is then unified with the first argument \texttt{Chars}. \begin{PlErrors} \ErrCond{\texttt{Chars} is neither a partial list nor a list} \ErrTerm{type\_error(list, Chars)} \ErrCond{see associated predicate errors} \ErrTermRm{\RefSP{write-term/3} and \RefSP{format/3}} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{write\_term\_to\_codes/3}, \texttt{write\_to\_codes/2}, \texttt{writeq\_to\_codes/2}, \\ \texttt{write\_canonical\_to\_codes/2}, \texttt{display\_to\_codes/2}, \texttt{print\_to\_codes/2}, \\ \texttt{format\_to\_codes/3}} \AddPBD{write\_term\_to\_codes/3} \AddPBD{write\_to\_codes/2} \AddPBD{writeq\_to\_codes/2} \AddPBD{write\_canonical\_to\_codes/2} \AddPBD{display\_to\_codes/2} \AddPBD{print\_to\_codes/2} \AddPBD{format\_to\_codes/3} \begin{TemplatesOneCol} write\_term\_to\_codes(?character\_code\_list, ?term, +write\_option\_list)\\ write\_to\_codes(?character\_code\_list, ?term)\\ writeq\_to\_codes(?character\_code\_list, ?term)\\ write\_canonical\_to\_codes(?character\_code\_list, ?term)\\ display\_to\_codes(?character\_code\_list, ?term)\\ print\_to\_codes(?character\_code\_list, ?term)\\ format\_to\_codes(?character\_code\_list, +character\_code\_list\_or\_atom, +list) \end{TemplatesOneCol} \Description \texttt{}% \texttt{}% \texttt{}% \texttt{}% \texttt{}% \texttt{}% \texttt{}% Similar to \IdxPB{write\_term/3}, \IdxPB{write/2}, \IdxPB{writeq/2}, \IdxPB{write\_canonical/2}, \IdxPB{display/2}, \IdxPB{print/2} \RefSP{write-term/3} and \IdxPB{format/3} \RefSP{format/3} except that characters are not written onto a text-stream but are collected as a character code list which is then unified with the first argument \texttt{Codes}. \begin{PlErrors} \ErrCond{\texttt{Codes} is neither a partial list nor a list} \ErrTerm{type\_error(list, Codes)} \ErrCond{see associated predicate errors} \ErrTermRm{\RefSP{write-term/3} and \RefSP{format/3}} \end{PlErrors} \Portability GNU Prolog predicates. \subsection{DEC-10 compatibility input/output} \subsubsection{Introduction} The DEC-10 Prolog I/O predicates manipulate streams implicitly since they only refer to current input/output streams \RefSP{Introduction:(Streams)}. The current input and output streams are initially set to \IdxPK{user\_input} and \IdxPK{user\_output} respectively. The predicate \texttt{see/1} (resp. \texttt{tell/1}, \texttt{append/1}) can be used for setting the current input (resp. output) stream to newly opened streams for particular files. The predicate \texttt{seen/0} (resp. \texttt{told/0}) close the current input (resp. output) stream, and resets it to the standard input (resp. output). The predicate \texttt{seeing/1} (resp. \texttt{telling/1}) is used for retrieving the file name associated with the current input (resp. output) stream. The file name \IdxPKD{user} stands for the standard input or output, depending on context (\IdxPK{user\_input} and \IdxPK{user\_output} can also be used). The DEC-10 Prolog I/O predicates are only provided for compatibility, they are now obsolete and their use is discouraged. The predicates for explicit stream manipulation should be used instead \RefSP{Streams}. \subsubsection{\texttt{see/1}, \texttt{tell/1}, \texttt{append/1}} \AddPBD{see/1} \AddPBD{tell/1} \AddPBD{append/1} \begin{TemplatesOneCol} see(+source\_sink)\\ see(+stream)\\ tell(+source\_sink)\\ tell(+stream)\\ append(+source\_sink)\\ append(+stream) \end{TemplatesOneCol} \Description \texttt{see(FileName)} sets the current input stream to \texttt{FileName}. If there is a stream opened by \texttt{see/1} associated with the same \texttt{FileName} already, then it becomes the current input stream. Otherwise, \texttt{FileName} is opened for reading and becomes the current input stream. \texttt{tell(FileName)} sets the current output stream to \texttt{FileName}. If there is a stream opened by \texttt{tell/1} associated with the same \texttt{FileName} already, then it becomes the current output stream. Otherwise, \texttt{FileName} is opened for writing and becomes the current output stream. \texttt{append(FileName)} like \texttt{tell/1} but \texttt{FileName} is opened for writing + append. A stream-term (obtained with any other built-in predicate) can also be provided as \texttt{FileName} to these predicates. \Errors See errors associated with \texttt{open/4} \RefSP{open/4}. \Portability GNU Prolog predicates. \subsubsection{\texttt{seeing/1}, \texttt{telling/1}} \AddPBD{seeing/1} \AddPBD{telling/1} \begin{TemplatesOneCol} seeing(?source\_sink)\\ telling(?source\_sink) \end{TemplatesOneCol} \Description \texttt{seeing(FileName)} succeeds if \texttt{FileName} unifies with the name of the current input file, if it was opened by \texttt{see/1}; else with the current input stream-term, if this is not \IdxPK{user\_input}, otherwise with \IdxPK{user}. \texttt{telling(FileName)} succeeds if \texttt{FileName} unifies with the name of the current output file, if it was opened by \texttt{tell/1} or \texttt{append/1}; else with the current output stream-term, if this is not \IdxPK{user\_output}, otherwise with \IdxPK{user}. \PlErrorsNone \Portability GNU Prolog predicates. \subsubsection{\texttt{seen/0}, \texttt{told/0}} \AddPBD{seen/0} \AddPBD{told/0} \begin{TemplatesOneCol} seen\\ told \end{TemplatesOneCol} \Description \texttt{seen} closes the current input, and resets it to \IdxPK{user\_input}. \texttt{told} closes the current output, and resets it to \IdxPK{user\_output}. \PlErrorsNone \Portability GNU Prolog predicates. \subsubsection{\texttt{get0/1}, \texttt{get/1}, \texttt{skip/1}} \AddPBD{get0/1} \AddPBD{get/1} \AddPBD{skip/1} \begin{TemplatesOneCol} get0(?in\_character\_code)\\ get(?in\_character\_code)\\ skip(+character\_code) \end{TemplatesOneCol} \Description \texttt{get0(Code)} succeeds if \texttt{Code} unifies with the next character code read from the current input stream. Thus it is equivalent to \texttt{get\_code(Code)} \RefSP{get-char/2}. \texttt{get(Code)} succeeds if \texttt{Code} unifies with the next character code read from the current input stream that is not a layout character. \texttt{skip(Code)} skips just past the next character code \texttt{Code} from the current input stream. \Errors See errors for \texttt{get\_code/2} \RefSP{get-char/2}. \Portability GNU Prolog predicates. \subsubsection{\texttt{put/1}, \texttt{tab/1}} \AddPBD{put/1} \AddPBD{tab/1} \begin{TemplatesOneCol} put(+character\_code)\\ tab(+evaluable) \end{TemplatesOneCol} \Description \texttt{put(Code)} writes the character whose code is \texttt{Code} onto the current output stream. It is equivalent to \texttt{put\_code(Code)} \RefSP{put-char/2}. \texttt{tab(N)} writes \texttt{N} spaces onto the current output stream. \texttt{N} may be an arithmetic expression. \Errors See errors for \texttt{put\_code/2} \RefSP{put-char/2} and for arithmetic expressions \RefSP{Evaluation-of-an-arithmetic-expression}. \Portability GNU Prolog predicates. \subsection{Term expansion} \label{Term-expansion} \subsubsection{Definite clause grammars} \label{DCG} \index{Definite clause grammars|see {DCG}} Definite clause grammars are a useful notation to express grammar rules. However the ISO reference does not include them, so they should be considered as a system dependent feature. Definite clause grammars are an extension of context-free grammars. A grammar rule is of the form: \OneLine{\textrm{head} \IdxPKD[(--{\gt})/2]{--{\gt}} \textrm{body}.} \texttt{--{\gt}} is a predefined infix operator \RefSP{op/3:(Term-input/output)}. Here are some features of definite clause grammars: \begin{itemize} \item a non-terminal symbol may be any callable term. \item a terminal symbol may be any Prolog term and is written as a list. The empty list represents an empty sequence of terminals. \item a sequence is expressed using the Prolog conjunction operator \texttt((',')/2). \item the head of a grammar rule consists of a non-terminal optionally followed by a sequence of terminals (i.e. a Prolog list). \item the body of a grammar rule consists of a sequence of non-terminals, terminals, predicate call, disjunction (using \texttt{;/2}), if-then (using \texttt{(-{\gt})/2}) or cut (using \texttt{!}). \item a predicate call must be enclosed in curly brackets (using \texttt{{\lb}{\rb}/1}). This makes it possible to express an extra condition. \end{itemize} A grammar rule is nothing but a ``syntactic sugar'' for a Prolog clause. Each grammar rule accepts as input a list of terminals (tokens), parses a prefix of this list and gives as output the rest of this list (possibly enlarged). This rest is generally parsed later. So, each a grammar rule is translated into a Prolog clause that explicitly the manages the list. Two arguments are then added: the input list (\texttt{Start}) and the output list (\texttt{Stop}). For instance: \OneLine{p --{\gt} q.} is translated into: \OneLine{p(Start, End) :- q(Start, End).} Extra arguments can be provided and the body of the rule can contain several non-terminals. Example: \begin{Indentation} \begin{verbatim} p(X, Y) --> q(X), r(X, Y), s(Y). \end{verbatim} \end{Indentation} is translated into: \begin{Indentation} \begin{verbatim} p(X, Y, Start, End) :- q(X, Start, A), r(X, Y, A, B), s(Y, B, End). \end{verbatim} \end{Indentation} Terminals are translated using unification: \OneLine{assign(X,Y) --{\gt} left(X), [:=], right(Y), [;].} is translated into: \begin{Indentation} \begin{verbatim} assign(X,Y,Start,End) :- left(X, Start, A), A=[:=|B], right(Y, B, C), C=[;|End]. \end{verbatim} \end{Indentation} Terminals appearing on the left-hand side of a rule are connected to the output argument of the head. It is possible to include a call to a prolog predicate enclosing it in curly brackets (to distinguish them from non-terminals): \OneLine{assign(X,Y) --{\gt} left(X), [:=], right(Y0), {\lb}Y is Y0 {\rb}, [;].} is translated into: \begin{Indentation} \begin{verbatim} assign(X,Y,Start,End) :- left(X, Start, A), A=[:=|B], right(Y0, B, C), Y is Y0, C=[;|End]. \end{verbatim} \end{Indentation} Cut, disjunction and if-then(-else) are translated literally (and do not need to be enclosed in curly brackets). \subsubsection{\texttt{expand\_term/2}, \texttt{term\_expansion/2}} \AddPBD{expand\_term/2} \begin{TemplatesOneCol} expand\_term(?term, ?term)\\ term\_expansion(?term, ?term) \end{TemplatesOneCol} \Description \texttt{expand\_term(Term1, Term2)} succeeds if \texttt{Term2} is a transformation of \texttt{Term1}. The transformation steps are as follows: \begin{itemize} \item if \texttt{Term1} is a variable, it is unified with \texttt{Term2} \item if \texttt{term\_expansion(Term1, Term2)} succeeds \texttt{Term2} is assumed to be the transformation of \texttt{Term1}. \item if \texttt{Term1} is a DCG then \texttt{Term2} is its translation \RefSP{DCG}. \item otherwise \texttt{Term2} is unified with \texttt{Term1}. \end{itemize} \texttt{term\_expansion(Term1, Term2)} is a hook predicate allowing the user to define a specific transformation. The GNU Prolog compiler \RefSP{The-GNU-Prolog-compiler} automatically calls \texttt{expand\_term/2} on each \texttt{Term1} read in. However, in the current release, only DCG transformation are done by the compiler (i.e. \texttt{term\_expansion/2} cannot be used). To use \texttt{term\_expansion/2}, it is necessary to call \texttt{expand\_term/2} explicitly. \PlErrorsNone \Portability GNU Prolog predicate. \subsubsection{\texttt{phrase/3}, \texttt{phrase/2}} \AddPBD{phrase/3} \AddPBD{phrase/2} \begin{TemplatesOneCol} phrase(?term, ?list, ?list)\\ phrase(?term, ?list) \end{TemplatesOneCol} \Description \texttt{phrase(Phrase, List, Remainder)} succeeds if the list \texttt{List} is in the language defined by the grammar rule body \texttt{Phrase}. \texttt{Remainder} is what remains of the list after a phrase has been found. \texttt{phrase(Phrase, List)} is equivalent to \texttt{phrase(Phrase, List, [])}. \begin{PlErrors} \ErrCond{\texttt{List} is neither a list nor a partial list} \ErrTerm{type\_error(list, List)} \ErrCond{\texttt{Remainder} is neither a list nor a partial list} \ErrTerm{type\_error(list, Remainder)} \end{PlErrors} \Portability GNU Prolog predicates. \subsection{Logic, control and exceptions} \subsubsection{\texttt{abort/0}, \texttt{stop/0}, \texttt{top\_level/0}, \texttt{break/0}, \texttt{halt/1}, \texttt{halt/0}} \label{abort/0} \AddPBD{abort/0} \AddPBD{stop/0} \AddPBD{top\_level/0} \AddPBD{break/0} \AddPBD{halt/1} \AddPBD{halt/0} \begin{TemplatesOneCol} abort\\ stop\\ top\_level\\ break\\ halt(+integer)\\ halt \end{TemplatesOneCol} \Description \texttt{abort} aborts the current execution. If this execution was initiated under a \Idx{top-level} the control is given back to the top-level and the message \texttt{{\lb}execution aborted{\rb}} is displayed. Otherwise, e.g. execution started by a \texttt{initialization/1} directive \RefSP{initialization/1}, \texttt{abort/0} is equivalent to \texttt{halt(1)} (see below). \texttt{stop} stops the current execution. If this execution was initiated under a \Idx{top-level} the control is given back to the top-level. Otherwise, \texttt{stop/0} is equivalent to \texttt{halt(0)} (see below). \texttt{top\_level} starts a new recursive \Idx{top-level} (including the banner display). To end this new \Idx{top-level} simply type the end-of-file key sequence (\texttt{Ctl-D}) or its term representation: \texttt{end\_of\_file.} \texttt{break} invokes a recursive top-level (no banner is displayed). To end this new level simply type the end-of-file key sequence (\texttt{Ctl-D}) or its term representation: \texttt{end\_of\_file.} \texttt{halt(Status)} causes the GNU Prolog process to immediately exit back to the shell with the return code \texttt{Status}. \texttt{halt} is equivalent to \texttt{halt(0)}. \begin{PlErrors} \ErrCond{\texttt{Status} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Status} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Status)} \end{PlErrors} \Portability \texttt{halt/1} and \texttt{halt/0} are ISO predicates. \texttt{abort/0}, \texttt{stop/0}, \texttt{top\_level/0} and \texttt{break/0} are GNU Prolog predicates. \subsubsection{\texttt{once/1}, \texttt{({\bs}+)/1} - not provable, \texttt{call/2-11}, \texttt{call\_with\_args/1-11}, \texttt{call\_det/2}} \AddPBD{once/1} \AddPBD{({\bs}+)/1} \AddPBD{call/2-11} \AddPBD{call\_with\_args/1-11} \AddPBD{call\_det/2} \begin{TemplatesOneCol} once(+callable\_term)\\ {\bs}+(+callable\_term) \\ call(+callable\_term, +term,\ldots, +term)\\ call\_with\_args(+atom, +term,\ldots, +term)\\ call\_det(+callable\_term, ?boolean) \end{TemplatesOneCol} \Description \texttt{once(Goal)} succeeds if \texttt{call(Goal)} succeeds. However \texttt{once/1} is not re-executable on backtracking since all alternatives of \texttt{Goal} are cut. \texttt{once(Goal)} is equivalent to \texttt{call(Goal), !}. \texttt{{\bs}+ Goal} succeeds if \texttt{call(Goal)} fails and fails otherwise. This built-in predicate gives negation by failure. \texttt{call(Closure, Arg1,\ldots, ArgN)} calls the goal \texttt{call(Goal)} where \texttt{Goal} is constructed by appending \texttt{Arg1,\ldots, ArgN} ($1 \leq \texttt{N} \leq 10$) additional arguments to the arguments (if any) of \texttt{Closure}. \texttt{call\_with\_args(Functor, Arg1,\ldots, ArgN)} calls the goal whose functor is \texttt{Functor} and whose arguments are \texttt{Arg1},\ldots, \texttt{ArgN} ($0 \leq \texttt{N} \leq 10$). \texttt{call\_det(Goal, Deterministic)} succeeds if \texttt{call(Goal)} succeeds and unifies \texttt{Deterministic} with \texttt{true} if \texttt{Goal} has not created any choice-points, with \texttt{false} otherwise. \texttt{{\bs}+} is a predefined prefix operator \RefSP{op/3:(Term-input/output)}. \begin{PlErrors} \ErrCond{\texttt{Goal} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Goal} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Goal)} \ErrCond{The predicate indicator \texttt{Pred} of \texttt{Goal} does not correspond to an existing procedure and the value of the \texttt{unknown} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{existence\_error(procedure, Pred)} \ErrCond{\texttt{Functor} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Functor} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Functor)} \ErrCond{\texttt{Deterministic} is neither a variable nor a boolean} \ErrTerm{type\_error(boolean, Deterministic)} \ErrCond{for \texttt{call/2-11} the resulting arity of \texttt{Goal} (arity of $\texttt{Closure} + \texttt{N}$) is an integer $>$ \texttt{max\_arity} flag \RefSP{set-prolog-flag/2}} \ErrTerm{representation\_error(max\_arity)} \end{PlErrors} \Portability \texttt{once/1} and \texttt{({\bs}+)/1} are ISO predicates, \texttt{call/2-11}, \texttt{call\_with\_args/1-11} and \texttt{call\_det/2} are GNU Prolog predicates. \subsubsection{\texttt{repeat/0}} \AddPBD{repeat/0} \begin{TemplatesOneCol} repeat \end{TemplatesOneCol} \Description \texttt{repeat} generates an infinite sequence of backtracking choices. The purpose is to repeatedly perform some action on elements which are somehow generated, e.g. by reading them from a stream, until some test becomes true. Repeat loops cannot contribute to the logic of the program. They are only meaningful if the action involves side-effects. The only reason for using repeat loops instead of a more natural tail-recursive formulation is efficiency: when the test fails back, the Prolog engine immediately reclaims any working storage consumed since the call to \texttt{repeat/0}. \PlErrorsNone \Portability ISO predicate. \subsubsection{\texttt{for/3}} \AddPBD{for/3} \begin{TemplatesOneCol} for(?integer, +integer, +integer) \end{TemplatesOneCol} \Description \texttt{for(Counter, Lower, Upper)} generates an sequence of backtracking choices instantiating \texttt{Counter} to the values \texttt{Lower}, \texttt{Lower+1},\ldots, \texttt{Upper}. \begin{PlErrors} \ErrCond{\texttt{Counter} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Counter)} \ErrCond{\texttt{Lower} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Lower} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Lower)} \ErrCond{\texttt{Upper} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Upper} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Upper)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{Atomic term processing} These built-in predicates enable atomic terms to be processed as a sequence of characters and character codes. Facilities exist to split and join atoms, to convert a single character to and from the corresponding character code, and to convert a number to and from a list of characters and character codes. \subsubsection{\texttt{atom\_length/2}} \AddPBD{atom\_length/2} \begin{TemplatesOneCol} atom\_length(+atom, ?integer) \end{TemplatesOneCol} \Description \texttt{atom\_length(Atom, Length)} succeeds if \texttt{Length} unifies with the number of characters of the name of \texttt{Atom}. \begin{PlErrors} \ErrCond{\texttt{Atom} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Atom} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom)} \ErrCond{\texttt{Length} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Length)} \ErrCond{\texttt{Length} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Length)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{atom\_concat/3}} \AddPBD{atom\_concat/3} \begin{TemplatesOneCol} atom\_concat(+atom, +atom, ?atom)\\ atom\_concat(?atom, ?atom, +atom) \end{TemplatesOneCol} \Description \texttt{atom\_concat(Atom1, Atom2, Atom12)} succeeds if the name of \texttt{Atom12} is the concatenation of the name of \texttt{Atom1} with the name of \texttt{Atom1}. This predicate is re-executable on backtracking (e.g. if \texttt{Atom12} is instantiated and both \texttt{Atom1} and \texttt{Atom2} are variables). \begin{PlErrors} \ErrCond{\texttt{Atom1} and \texttt{Atom12} are variables} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Atom2} and \texttt{Atom12} are variables} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Atom1} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom1)} \ErrCond{\texttt{Atom2} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom2)} \ErrCond{\texttt{Atom12} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom12)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{sub\_atom/5}} \AddPBD{sub\_atom/5} \begin{TemplatesOneCol} sub\_atom(+atom, ?integer, ?integer, ?integer, ?atom) \end{TemplatesOneCol} \Description \texttt{sub\_atom(Atom, Before, Length, After, SubAtom)} succeeds if atom \texttt{Atom} can be split into three atoms, \texttt{AtomL}, \texttt{SubAtom} and \texttt{AtomR} such that \texttt{Before} is the number of characters of the name of \texttt{AtomL}, \texttt{Length} is the number of characters of the name of \texttt{SubAtom} and \texttt{After} is the number of characters of the name of \texttt{AtomR}. This predicate is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{Atom} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Atom} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom)} \ErrCond{\texttt{SubAtom} is neither a variable nor an atom} \ErrTerm{type\_error(atom, SubAtom)} \ErrCond{\texttt{Before} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Before)} \ErrCond{\texttt{Length} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Length)} \ErrCond{\texttt{After} is neither a variable nor an integer} \ErrTerm{type\_error(integer, After)} \ErrCond{\texttt{Before} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Before)} \ErrCond{\texttt{Length} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Length)} \ErrCond{\texttt{After} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, After)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{char\_code/2}} \label{char-code/2} \AddPBD{char\_code/2} \begin{TemplatesOneCol} char\_code(+character, ?character\_code)\\ char\_code(-character, +character\_code) \end{TemplatesOneCol} \Description \texttt{char\_code(Char, Code)} succeeds if the character code for the one-char atom \texttt{Char} is \texttt{Code}. \begin{PlErrors} \ErrCond{\texttt{Char} and \texttt{Code} are variables} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Char} is neither a variable nor a one-char atom} \ErrTerm{type\_error(character, Char)} \ErrCond{\texttt{Code} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Code)} \ErrCond{\texttt{Code} is an integer but not a character code} \ErrTerm{representation\_error(character\_code)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{lower\_upper/2}} \AddPBD{lower\_upper/2} \begin{TemplatesOneCol} lower\_upper(+character, ?character)\\ lower\_upper(-character, +character) \end{TemplatesOneCol} \Description \texttt{lower\_upper(Char1, Char2)} succeeds if \texttt{Char1} and \texttt{Char2} are one-char atoms and if \texttt{Char2} is the upper conversion of \texttt{Char1}. If \texttt{Char1} (resp. \texttt{Char2}) is a character that is not a lower (resp. upper) letter then \texttt{Char2} is equal to \texttt{Char1}. \begin{PlErrors} \ErrCond{\texttt{Char1} and \texttt{Char2} are variables} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Char1} is neither a variable nor a one-char atom} \ErrTerm{type\_error(character, Char1)} \ErrCond{\texttt{Char2} is neither a variable nor a one-char atom} \ErrTerm{type\_error(character, Char2)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{atom\_chars/2}, \texttt{atom\_codes/2}} \label{atom-chars/2} \AddPBD{atom\_chars/2} \AddPBD{atom\_codes/2} \begin{TemplatesOneCol} atom\_chars(+atom, ?character\_list)\\ atom\_chars(-atom, +character\_list)\\ atom\_codes(+atom, ?character\_code\_list)\\ atom\_codes(-atom, +character\_code\_list) \end{TemplatesOneCol} \Description \texttt{atom\_chars(Atom, Chars)} succeeds if \texttt{Chars} is the list of one-char atoms whose names are the successive characters of the name of \texttt{Atom}. \texttt{atom\_codes(Atom, Codes)} is similar to \texttt{atom\_chars/2} but deals with a list of character codes. \begin{PlErrors} \ErrCond{\texttt{Atom} is a variable and \texttt{Chars} (or \texttt{Codes}) is a partial list or a list with an element which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Atom} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom)} \ErrCond{\texttt{Chars} is neither a list nor a partial list} \ErrTerm{type\_error(list, Chars)} \ErrCond{\texttt{Codes} is neither a list nor a partial list} \ErrTerm{type\_error(list, Codes)} \ErrCond{\texttt{Atom} is a variable and an element \texttt{E} of the list \texttt{Chars} is neither a variable nor a one-char atom} \ErrTerm{type\_error(character, E)} \ErrCond{\texttt{Atom} is a variable and an element \texttt{E} of the list \texttt{Codes} is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \ErrCond{\texttt{Atom} is a variable and an element \texttt{E} of the list \texttt{Codes} is an integer but not a character code} \ErrTerm{representation\_error(character\_code)} \end{PlErrors} \Portability ISO predicates. The ISO reference only causes a \texttt{type\_error(list, Chars)} if \texttt{Atom} is a variable and \texttt{Chars} is neither a list nor a partial list. GNU Prolog always checks if \texttt{Chars} is a list. Similarly for \texttt{Codes}. The \texttt{type\_error(integer, E)} when an element \texttt{E} of the \texttt{Codes} is not an integer is a GNU Prolog extension. This seems to be an omission in the ISO reference since this error is detected for many other built-in predicates accepting a character code (e.g. \texttt{char\_code/2}, \texttt{put\_code/2}). \subsubsection{\texttt{number\_atom/2}, \texttt{number\_chars/2}, \texttt{number\_codes/2}} \label{number-atom/2} \AddPBD{number\_atom/2} \AddPBD{number\_chars/2} \AddPBD{number\_codes/2} \begin{TemplatesOneCol} number\_atom(+number, ?atom)\\ number\_atom(-number, +atom)\\ number\_chars(+number, ?character\_list)\\ number\_chars(-number, +character\_list)\\ number\_codes(+number, ?character\_code\_list)\\ number\_codes(-number, +character\_code\_list) \end{TemplatesOneCol} \Description \texttt{number\_atom(Number, Atom)} succeeds if \texttt{Atom} is an atom whose name corresponds to the characters of \texttt{Number}. \texttt{number\_chars(Number, Chars)} is similar to \texttt{number\_atom/2} but deals with a list of character codes. \texttt{number\_codes(Number, Codes)} is similar to \texttt{number\_atom/2} but deals with a list of characters. \begin{PlErrors} \ErrCond{\texttt{Number} and \texttt{Atom} are variables} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Number} is a variable and \texttt{Chars} (or \texttt{Codes}) is a partial list or a list with an element which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Number} is neither a variable nor an number} \ErrTerm{type\_error(number, Number)} \ErrCond{\texttt{Atom} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom)} \ErrCond{\texttt{Number} is a variable and \texttt{Chars} is neither a list nor a partial list} \ErrTerm{type\_error(list, Chars)} \ErrCond{\texttt{Number} is a variable and \texttt{Codes} is neither a list nor a partial list} \ErrTerm{type\_error(list, Codes)} \ErrCond{\texttt{Number} is a variable and an element \texttt{E} of the list \texttt{Chars} is neither a variable nor a one-char atom} \ErrTerm{type\_error(character, E)} \ErrCond{\texttt{Number} is a variable and an element \texttt{E} of the list \texttt{Codes} is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \ErrCond{\texttt{Number} is a variable and an element \texttt{E} of the list \texttt{Codes} is an integer but not a character code} \ErrTerm{representation\_error(character\_code)} \ErrCond{\texttt{Number} is a variable, \texttt{Atom} (or \texttt{Chars} or \texttt{Codes}) cannot be parsed as a number and the value of the \texttt{syntax\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{syntax\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability \texttt{number\_atom/2} is a GNU Prolog predicate. \texttt{number\_chars/2} and \texttt{number\_codes/2} are ISO predicates. GNU Prolog only raises an error about an element \texttt{E} of the \texttt{Chars} (or \texttt{Codes}) list when \texttt{Number} is a variable while the ISO reference always check this. This seems an error since the list itself is only checked if \texttt{Number} is a variable. The \texttt{type\_error(integer, E)} when an element \texttt{E} of the \texttt{Codes} is not an integer is a GNU Prolog extension. This seems to be an omission in the ISO reference since this error is detected for many other built-in predicates accepting a character code (e.g. \texttt{char\_code/2}, \texttt{put\_code/2}). \subsubsection{\texttt{name/2}} \AddPBD{name/2} \begin{TemplatesOneCol} name(+atomic, ?character\_code\_list)\\ name(-atomic, +character\_code\_list) \end{TemplatesOneCol} \Description \texttt{name(Constant, Codes)} succeeds if \texttt{Codes} is a list whose elements are the character codes corresponding to the successive characters of \texttt{Constant} (a number or an atom). However, there atoms are for which \texttt{name(Constant, Codes)} is true, but which will not be constructed if \texttt{name/2} is called with \texttt{Constant} uninstantiated, e.g. the atom \texttt{'1024'}. For this reason the use of \texttt{name/2} is discouraged and should be limited to compatibility purposes. It is preferable to use atom\_codes/2 \RefSP{atom-chars/2} or number\_chars/2 \RefSP{number-atom/2}. \begin{PlErrors} \ErrCond{\texttt{Constant} is a variable and \texttt{Codes} is a partial list or a list with an element which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Constant} is neither a variable nor an atomic term} \ErrTerm{type\_error(atomic, Constant)} \ErrCond{\texttt{Constant} is a variable and \texttt{Codes} is neither a list nor a partial list} \ErrTerm{type\_error(list, Codes)} \ErrCond{\texttt{Constant} is a variable and an element \texttt{E} of the list \texttt{Codes} is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \ErrCond{\texttt{Constant} is a variable and an element \texttt{E} of the list \texttt{Codes} is an integer but not a character code} \ErrTerm{representation\_error(character\_code)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{atom\_hash/2}} \label{atom-hash/2} \AddPBD{atom\_hash/2} \begin{TemplatesOneCol} atom\_hash(+atom, ?integer)\\ atom\_hash(?atom, +integer) \end{TemplatesOneCol} \Description \texttt{atom\_hash(Atom, Hash)} succeeds if \texttt{Hash} is the internal key associated with \texttt{Atom} (an existing atom). The internal key of an atom is a unique integer $\geq$ 0 and $<$ to the \IdxPF{max\_atom} \Idx{Prolog flag} \RefSP{set-prolog-flag/2}. \begin{PlErrors} \ErrCond{\texttt{Atom} and \texttt{Hash} are both variables} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Atom} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom)} \ErrCond{\texttt{Hash} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Hash)} \ErrCond{\texttt{Hash} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Hash)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{new\_atom/3}, \texttt{new\_atom/2}, \texttt{new\_atom/1}} \AddPBD{new\_atom/3} \AddPBD{new\_atom/2} \AddPBD{new\_atom/1} \begin{TemplatesOneCol} new\_atom(+atom, +integer, -atom)\\ new\_atom(+atom, -atom)\\ new\_atom(-atom) \end{TemplatesOneCol} \Description \texttt{new\_atom(Prefix, Hash, Atom)} unifies \texttt{Atom} with a new atom whose name begins with the characters of the name of \texttt{Prefix} and whose internal key is \texttt{Hash} \RefSP{atom-hash/2}. This predicate is then a symbol generator. It is guaranteed that \texttt{Atom} does not exist before the invocation of \texttt{new\_atom/3}. The characters appended to \texttt{Prefix} to form \texttt{Atom} are in: \texttt{A}-\texttt{Z} (capital letter), \texttt{a}-\texttt{z} (small letter), \texttt{0}-\texttt{9} (digit), \texttt{\#}, \texttt{\$}, \texttt{\&}, \texttt{\_}, \texttt{@}. \texttt{new\_atom/2} is similar to \texttt{new\_atom/3}, but the atom generated can have any (free) internal key. \texttt{new\_atom/1} is similar to \texttt{new\_atom(atom\_, Atom)}, i.e. the generated atom begins with \texttt{atom\_}. \begin{PlErrors} \ErrCond{\texttt{Prefix} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Hash} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Prefix} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Prefix)} \ErrCond{\texttt{Hash} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Hash)} \ErrCond{\texttt{Hash} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Hash)} \ErrCond{\texttt{Atom} is not a variable} \ErrTerm{type\_error(variable, Atom)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{current\_atom/1}} \label{current-atom/2} \AddPBD{current\_atom/1} \begin{TemplatesOneCol} current\_atom(?atom) \end{TemplatesOneCol} \Description \texttt{current\_atom(Atom)} succeeds if there exists an atom that unifies with \texttt{Atom}. All atoms are found except those beginning with a \texttt{'\$'} (system atoms). This predicate is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{Atom} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{atom\_property/2}} \label{atom-property/2} \AddPBD{atom\_property/2} \begin{TemplatesOneCol} atom\_property(?atom, ?atom\_property) \end{TemplatesOneCol} \Description \texttt{atom\_property(Atom, Property)} succeeds if \texttt{current\_atom(Atom)} succeeds \RefSP{current-atom/2} and if \texttt{Property} unifies with one of the properties of the atom. This predicate is re-executable on backtracking. \SPart{Atom properties}: \begin{itemize} \item \IdxPPD[length]{length(Length)}: \texttt{Length} is the length of the name of the atom. \item \IdxPPD[hash]{hash(Hash)}: \texttt{Hash} is the internal key of the atom \RefSP{atom-hash/2}. \item \IdxPPD{prefix\_op}: if there is a prefix operator currently defined with this name. \item \IdxPPD{infix\_op}: if there is an infix operator currently defined with this name. \item \IdxPPD{postfix\_op}: if there is a postfix operator currently defined with this name. \item \IdxPPD{needs\_quotes}: if the atom must be quoted to be read later. \item \IdxPPD{needs\_scan}: if the atom must be scanned when output to be read later (e.g. contains special characters that must be output with a \texttt{{\bs}} \Idx{escape sequence}). \end{itemize} \begin{PlErrors} \ErrCond{\texttt{Atom} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Atom)} \ErrCond{\texttt{Property} is neither a variable nor a n atom property term} \ErrTerm{domain\_error(atom\_property, Property)} \ErrCond{\texttt{Property} = \texttt{length(E)} or \texttt{hash(E)} and \texttt{E} is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{List processing} These predicates manipulate lists. They are bootstrapped predicates (i.e. written in Prolog) and no error cases are tested (for the moment). However, since they are written in Prolog using other built-in predicates, some errors can occur due to those built-in predicates. \subsubsection{\texttt{append/3}} \AddPBD{append/3} \begin{TemplatesOneCol} append(?list, ?list, ?list) \end{TemplatesOneCol} \Description \texttt{append(List1, List2, List12)} succeeds if the concatenation of the list \texttt{List1} and the list \texttt{List2} is the list \texttt{List12}. This predicate is re-executable on backtracking (e.g. if \texttt{List12} is instantiated and both \texttt{List1} and \texttt{List2} are variable). \PlErrorsNone \Portability GNU Prolog predicate. \subsubsection{\texttt{member/2}, \texttt{memberchk/2}} \AddPBD{member/2} \AddPBD{memberchk/2} \begin{TemplatesOneCol} member(?term, ?list)\\ memberchk(?term, ?list) \end{TemplatesOneCol} \Description \texttt{member(Element, List)} succeeds if \texttt{Element} belongs to the \texttt{List}. This predicate is re-executable on backtracking and can be thus used to enumerate the elements of \texttt{List}. \texttt{memberchk/2} is similar to \texttt{member/2} but only succeeds once. \PlErrorsNone \Portability GNU Prolog predicate. \subsubsection{\texttt{reverse/2}} \AddPBD{reverse/2} \begin{TemplatesOneCol} reverse(?list, ?list) \end{TemplatesOneCol} \Description \texttt{reverse(List1, List2)} succeeds if \texttt{List2} unifies with the list \texttt{List1} in reverse order. \PlErrorsNone \Portability GNU Prolog predicate. \subsubsection{\texttt{delete/3}, \texttt{select/3}} \AddPBD{delete/3} \AddPBD{select/3} \begin{TemplatesOneCol} delete(?list, ?term, ?list)\\ select(?term, ?list, ?list) \end{TemplatesOneCol} \Description \texttt{delete(List1, Element, List2)} removes all occurrences of \texttt{Element} in \texttt{List1} to provide \texttt{List2}. A strict term equality is required, cf. \IdxPB{(==)/2} \RefSP{(==)/2}. \texttt{select(Element, List1, List2)} removes one occurrence of \texttt{Element} in \texttt{List1} to provide \texttt{List2}. This predicate is re-executable on backtracking. \PlErrorsNone \Portability GNU Prolog predicate. \subsubsection{\texttt{permutation/2}} \AddPBD{permutation/2} \begin{TemplatesOneCol} permutation(?list, ?list) \end{TemplatesOneCol} \Description \texttt{permutation(List1, List2)} succeeds if \texttt{List2} is a permutation of the elements of \texttt{List1}. This predicate is re-executable on backtracking. \PlErrorsNone \Portability GNU Prolog predicate. \subsubsection{\texttt{prefix/2}, \texttt{suffix/2}} \AddPBD{prefix/2} \AddPBD{suffix/2} \begin{TemplatesOneCol} prefix(?list, ?list)\\ suffix(?list, ?list) \end{TemplatesOneCol} \Description \texttt{prefix(Prefix, List)} succeeds if \texttt{Prefix} is a prefix of \texttt{List}. This predicate is re-executable on backtracking. \texttt{suffix(Suffix, List)} succeeds if \texttt{Suffix} is a suffix of \texttt{List}. This predicate is re-executable on backtracking. \PlErrorsNone \Portability GNU Prolog predicate. \subsubsection{\texttt{sublist/2}} \AddPBD{sublist/2} \begin{TemplatesOneCol} sublist(?list, ?list) \end{TemplatesOneCol} \Description \texttt{sublist(List1, List2)} succeeds if \texttt{List1} is a sub-list of \texttt{List2}. This predicate is re-executable on backtracking. \PlErrorsNone \Portability GNU Prolog predicate. \subsubsection{\texttt{last/2}} \AddPBD{last/2} \begin{TemplatesOneCol} last(?list, ?term) \end{TemplatesOneCol} \Description \texttt{last(List, Element)} succeeds if \texttt{Element} is the last element of \texttt{List}. \PlErrorsNone \Portability GNU Prolog predicate. \subsubsection{\texttt{length/2}} \AddPBD{length/2} \begin{TemplatesOneCol} length(?list, ?integer) \end{TemplatesOneCol} \Description \texttt{length(List, Length)} succeeds if \texttt{Length} is the length of \texttt{List}. \PlErrorsNone \Portability GNU Prolog predicate. \subsubsection{\texttt{nth/3}} \AddPBD{nth/3} \begin{TemplatesOneCol} nth(?integer, ?list, ?term) \end{TemplatesOneCol} \Description \texttt{nth(N, List, Element)} succeeds if the \texttt{N}\emph{th} argument of \texttt{List} is \texttt{Element}. \PlErrorsNone \Portability GNU Prolog predicate. \subsubsection{\texttt{max\_list/2}, \texttt{min\_list/2}, \texttt{sum\_list/2}} \AddPBD{min\_list/2} \AddPBD{max\_list/2} \AddPBD{sum\_list/2} \begin{TemplatesOneCol} min\_list(+list, ?number)\\ max\_list(+list, ?number)\\ sum\_list(+list, ?number) \end{TemplatesOneCol} \Description \texttt{min\_list(List, Min)} succeeds if \texttt{Min} is the smallest number in \texttt{List}. \texttt{max\_list(List, Max)} succeeds if \texttt{Max} is the largest number in \texttt{List}. \texttt{sum\_list(List, Sum)} succeeds if \texttt{Sum} is the sum of all the elements in \texttt{List}. \texttt{List} must be a list of arithmetic evaluable terms \RefSP{Evaluation-of-an-arithmetic-expression}. \PlErrorsNone \Portability GNU Prolog predicate. \subsubsection{\texttt{sort/2}, \texttt{sort0/2}, \texttt{keysort/2} \texttt{sort/1}, \texttt{sort0/1}, \texttt{keysort/1}} \label{sort/2} \AddPBD{sort/2} \AddPBD{sort0/2} \AddPBD{keysort/2} \AddPBD{sort/1} \AddPBD{sort0/1} \AddPBD{keysort/1} \begin{TemplatesOneCol} sort(+list, ?list)\\ sort0(+list, ?list)\\ keysort(+list, ?list)\\ sort(+list)\\ sort0(+list)\\ keysort(+list) \end{TemplatesOneCol} \Description \texttt{sort(List1, List2)} succeeds if \texttt{List2} is the sorted list corresponding to \texttt{List1} where duplicate elements are merged. \texttt{sort0/2} is similar to \texttt{sort/2} except that duplicate elements are not merged. \texttt{keysort(List1, List2)} succeeds if \texttt{List2} is the sorted list of \texttt{List1} according to the keys. The list \texttt{List1} consists of items of the form \texttt{Key-Value}. These items are sorted according to the value of \texttt{Key} yielding the \texttt{List2}. Duplicate keys are not merged. This predicate is stable, i.e. if \texttt{K-A} occurs before \texttt{K-B} in the input, then \texttt{K-A} will occur before \texttt{K-B} in the output. \texttt{sort/1}, \texttt{sort0/1} and \texttt{keysort/1} are similar to \texttt{sort/2}, \texttt{sort0/2} and \texttt{keysort/2} but achieve a sort in-place destructing the original \texttt{List1} (this in-place assignment is not undone at backtracking). The sorted list occupies the same memory space as the original list (saving thus memory consumption). The time complexity of these sorts is $O(N~log~N)$, $N$ being the length of the list to sort. These predicates refer to the standard ordering of terms \RefSP{Standard-total-ordering-of-terms}. \begin{PlErrors} \ErrCond{\texttt{List1} is a partial list} \ErrTerm{instantiation\_error} \ErrCond{\texttt{List1} is neither a partial list nor a list} \ErrTerm{type\_error(list, List1)} \ErrCond{\texttt{List2} is neither a partial list nor a list} \ErrTerm{type\_error(list, List2)} \end{PlErrors} \Portability GNU Prolog predicates. \subsection{Global variables} \subsubsection{Introduction} \label{Global-variables} GNU Prolog provides a simple and powerful way to assign and read global variables. A global variable is associated with each atom, its initial value is the integer 0. A global variable can store 3 kinds of objects: \begin{itemize} \item a copy of a term (the assignment can be made backtrackable or not). \item a link to a term (the assignment is always backtrackable). \item an array of objects (recursively). \end{itemize} The space necessary for copies and arrays is dynamically allocated and recovered as soon as possible. For instance, when an atom is associated with a global variable whose current value is an array, the space for this array is recovered (unless the assignment is to be undone when backtracking occurs). When a link to a term is associated with a global variable, the reference to this term is stored and thus the original term is returned when the content of the variable is read. \SPart{Global variable naming convention}: a global variable is referenced by an atom. If the variable contains an array, an index (ranging from 0) can be provided using a compound term whose principal functor is the correponding atom and the argument is the index. In case of a multi-dimensional array, each index is given as the arguments of the compound term. If the variable contains a term (link or copy), it is possible to only reference a sub-term by giving its argument number (also called \IdxD{argument selector}). Such a sub-term is specified using a compound term whose principal functor is \texttt{-/2} and whose first argument is a global variable name and the second argument is the argument number (from 1). This can be applied recursively to specify a sub-term of any depth. In case of a list, a argument number I represents the Ith element of the list. In the rest of this section we use the operator notation since \texttt{-} is a predefined infix operator \RefSP{op/3:(Term-input/output)}. In the following, \Param{GVarName} represents a reference to a global variable and its syntax is as follows: \begin{Indentation} \begin{tabular}{@{}llll} \Param{GVarName} & ::= & \Param{atom} & whole content of a variable \\ & & \Param{atom}\texttt{(}\Param{Integer}\texttt{,}\ldots\texttt{,}\Param{Integer}\texttt{)} & element of an array \\ & & \Param{GVarName}\texttt{-}\Param{Integer} & sub-term selection \\ \Param{Integer} & ::= & \Param{integer} & immediate value \\ & & \Param{GVarName} & indirect value \end{tabular} \end{Indentation} When a \Param{GVarName} is used as an index or an argument number (i.e. indirection), the value of this variable must be an integer. Here are some examples of the naming convention: \begin{tabular}{ll} \texttt{a} & the content of variable associated with \texttt{a} (any kind) \\ \texttt{t(1)} & the 2nd element of the array associated with \texttt{t} \\ \texttt{t(k)} & if the value associated with \texttt{k} is I, the Ith element of the array associated with \texttt{t} \\ \texttt{a-1-2} & if the value associated with \texttt{a} is \texttt{f(g(a,b,c),2)}, the sub-term \texttt{b} \\ \end{tabular} Here are the errors associated with global variable names and common to all predicates. \begin{PlErrorsNoTitle} \ErrCond{\texttt{GVarName} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{GVarName} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, GVarName)} \ErrCond{\texttt{GVarName} contains an invalid argument number (or \texttt{GVarName} is an array)} \ErrTerm{domain\_error(g\_argument\_selector, GVarName)} \ErrCond{\texttt{GVarName} contains an invalid index (or \texttt{GVarName} is not an array)} \ErrTerm{domain\_error(g\_array\_index, GVarName)} \ErrCond{\texttt{GVarName} is used as an indirect index or argument selector and is not an integer} \ErrTerm{type\_error(integer, GVarName)} \end{PlErrorsNoTitle} \SPart{Arrays}: the predicates \texttt{g\_assign/2}, \texttt{g\_assignb/2} and \texttt{g\_link/2} \RefSP{g-assign/2} can be used to create an array. They recognize some terms as values. For instance, a compound term with principal functor \IdxPGD{g\_array} is used to define an array of fixed size. There are 3 forms for the term \texttt{g\_array}: \begin{itemize} \item \texttt{g\_array(Size)}: if \texttt{Size} is an integer $>$ 0 then defines an array of \texttt{Size} elements which are all initialized with the integer \texttt{0}. \item \texttt{g\_array(Size, Initial)}: as above but the elements are initialized with the term \texttt{Initial} instead of 0. \texttt{Initial} can contain other array definitions allowing thus for multi-dimensional arrays. \item \texttt{g\_array(List)}: as above if \texttt{List} is a list of length \texttt{Size} except that the elements of the array are initialized according to the elements of \texttt{List} (which can contain other array definitions). \end{itemize} An array can be extended explicitely using a compound term with principal functor \IdxPGD{g\_array\_extend} which accept the same 3 forms detailed above. In that case, the existing elements of the array are not initialized. If \texttt{g\_array\_extend} is used with an object which is not an array it is similar to \texttt{g\_array}. Finally, an array can be \textit{automatically} expanded when needed. The programmer does not need to explicitely control the expansion of an automatic array. An array is expanded as soon as an index is outside the current size of this array. Such an array is defined using a compound term with principal functor \IdxPGD{g\_array\_auto}: \begin{itemize} \item \texttt{g\_array\_auto(Size)}: if \texttt{Size} is an integer $>$ 0 then defines an automatic array whose initial size is \texttt{Size}. All elements are initialized with the integer \texttt{0}. Elements created during implicit expansions will be initialized with \texttt{0}. \item \texttt{g\_array\_auto(Size, Initial)}: as above but the elements are initialized with the term \texttt{Initial} instead of 0. \texttt{Initial} can contain other array definitions allowing thus for multi-dimensional arrays. Elements created during implicit expansions will be initialized with \texttt{Initial}. \item \texttt{g\_array\_auto(List)}: as above if \texttt{List} is a list of length \texttt{Size} except that the elements of the array are initialized according to the elements of \texttt{List} (which can contain other array definitions). Elements created during implicit expansions will be initialized with \texttt{0}. \end{itemize} In any case, when an array is read, a term of the form \texttt{g\_array([Elem0,..., ElemSize-1])} is returned. Some examples using global variables are presented later \RefSP{Examples}. \subsubsection{\texttt{g\_assign/2}, \texttt{g\_assignb/2}, \texttt{g\_link/2}} \label{g-assign/2} \AddPBD{g\_assign/2} \AddPBD{g\_assignb/2} \AddPBD{g\_link/2} \begin{TemplatesOneCol} g\_assign(+callable\_term, ?term)\\ g\_assignb(+callable\_term, ?term)\\ g\_link(+callable\_term, ?term) \end{TemplatesOneCol} \Description \texttt{g\_assign(GVarName, Value)} assigns a copy of the term \texttt{Value} to \texttt{GVarName}. This assignment is not undone when backtracking occurs. \texttt{g\_assignb/2} is similar to \texttt{g\_assign/2} but the assignment is undone at backtracking. \texttt{g\_link(GVarName, Value)} makes a link between \texttt{GVarName} to the term \texttt{Value}. This allows the user to give a name to any Prolog term (in particular non-ground terms). Such an assignment is always undone when backtracking occurs (since the term may no longer exist). If \texttt{Value} is an atom or an integer, \texttt{g\_link/2} and \texttt{g\_assignb/2} have the same behavior. Since \texttt{g\_link/2} only handles links to existing terms it does not require extra memory space and is not expensive in terms of execution time. NB: argument selectors can only be used with {g\_assign/2} (i.e. when using an argument selector inside an assignment, this one must not be backtrackable). \Errors See common errors detailed in the introduction \RefSP{Global-variables} \begin{PlErrorsNoTitle} \ErrCond{\texttt{GVarName} contains an argument selector and the assignment is backtrackable} \ErrTerm{domain\_error(g\_argument\_selector, GVarName)} \end{PlErrorsNoTitle} \Portability GNU Prolog predicates. \subsubsection{\texttt{g\_read/2}} \AddPBD{g\_read/2} \begin{TemplatesOneCol} g\_read(+callable\_term, ?term) \end{TemplatesOneCol} \Description \texttt{g\_read(GVarName, Value)} unifies \texttt{Value} with the term assigned to \texttt{GVarName}. \Errors See common errors detailed in the introduction \RefSP{Global-variables} \Portability GNU Prolog predicate. \subsubsection{\texttt{g\_array\_size/2}} \AddPBD{g\_array\_size/2} \begin{TemplatesOneCol} g\_array\_size(+callable\_term, ?integer) \end{TemplatesOneCol} \Description \texttt{g\_array\_size(GVarName, Value)} unifies \texttt{Size} with the dimension (an integer $>$ 0) of the array assigned to \texttt{GVarName}. Fails if \texttt{GVarName} is not an array. \Errors See common errors detailed in the introduction \RefSP{Global-variables} \begin{PlErrorsNoTitle} \ErrCond{\texttt{Size} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Size)} \end{PlErrorsNoTitle} \Portability GNU Prolog predicate. \subsubsection{\texttt{g\_inc/3}, \texttt{g\_inc/2}, \texttt{g\_inco/2}, \texttt{g\_inc/1}, \texttt{g\_dec/3}, \texttt{g\_dec/2}, \texttt{g\_deco/2}, \texttt{g\_dec/1}} \AddPBD{g\_inc/3} \AddPBD{g\_inc/2} \AddPBD{g\_inco/2} \AddPBD{g\_inc/1} \AddPBD{g\_dec/3} \AddPBD{g\_dec/2} \AddPBD{g\_deco/2} \AddPBD{g\_dec/1} \begin{TemplatesOneCol} g\_inc(+callable\_term, ?integer, ?integer) \\ g\_inc(+callable\_term, ?integer) \\ g\_inco(+callable\_term, ?integer) \\ g\_inc(+callable\_term) \\ g\_dec(+callable\_term, ?integer, ?integer) \\ g\_dec(+callable\_term, ?integer) \\ g\_deco(+callable\_term, ?integer) \\ g\_dec(+callable\_term) \end{TemplatesOneCol} \Description \texttt{g\_inc(GVarName, Old, New)} unifies \texttt{Old} with the integer assigned to \texttt{GVarName}, increments \texttt{GVarName} and then unifies \texttt{New} with the incremented value. \texttt{g\_inc(GVarName, New)} is equivalent to \texttt{g\_inc(GVarName, \_, New)}. \texttt{g\_inco(GVarName, Old)} is equivalent to \texttt{g\_inc(GVarName, Old, \_)}. \texttt{g\_inc(GVarName)} is equivalent to \texttt{g\_inc(GVarName, \_, \_)}. Predicates \texttt{g\_dec} are similar but decrement the content of \texttt{GVarName} instead. \Errors See common errors detailed in the introduction \RefSP{Global-variables} \begin{PlErrorsNoTitle} \ErrCond{\texttt{Old} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Old)} \ErrCond{\texttt{New} is neither a variable nor an integer} \ErrTerm{type\_error(integer, New)} \ErrCond{\texttt{GVarName} stores an array} \ErrTerm{type\_error(integer, g\_array)} \ErrCond{\texttt{GVarName} stores a term \texttt{T} which is not an integer} \ErrTerm{type\_error(integer, T)} \end{PlErrorsNoTitle} \Portability GNU Prolog predicates. \subsubsection{\texttt{g\_set\_bit/2}, \texttt{g\_reset\_bit/2}, \texttt{g\_test\_set\_bit/2}, \texttt{g\_test\_reset\_bit/2}} \AddPBD{g\_set\_bit/2} \AddPBD{g\_reset\_bit/2} \AddPBD{g\_test\_set\_bit/2} \AddPBD{g\_test\_reset\_bit/2} \begin{TemplatesOneCol} g\_set\_bit(+callable\_term, +integer) \\ g\_reset\_bit(+callable\_term, +integer) \\ g\_test\_set\_bit(+callable\_term, +integer) \\ g\_test\_reset\_bit(+callable\_term, +integer) \end{TemplatesOneCol} \Description \texttt{g\_set\_bit(GVarName, Bit)} sets to 1 the bit number specified by \texttt{Bit} of the integer assigned to \texttt{GVarName} to 1. Bit numbers range from 0 to the maximum number allowed for integers (this is architecture dependent). If \texttt{Bit} is greater than this limit, the modulo with this limit is taken. \texttt{g\_reset\_bit(GVarName, Bit)} is similar to \texttt{g\_set\_bit/2} but sets the specified bit to 0. \texttt{g\_test\_set\_bit/2} succeeds if the specified bit is set to 1. \texttt{g\_test\_reset\_bit/2} succeeds if the specified bit is set to 0. \Errors See common errors detailed in the introduction \RefSP{Global-variables} \begin{PlErrorsNoTitle} \ErrCond{\texttt{Bit} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Bit} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Bit)} \ErrCond{\texttt{Bit} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Bit)} \ErrCond{\texttt{GVarName} stores an array} \ErrTerm{type\_error(integer, g\_array)} \ErrCond{\texttt{GVarName} stores a term \texttt{T} which is not an integer} \ErrTerm{type\_error(integer, T)} \end{PlErrorsNoTitle} \Portability GNU Prolog predicates. \subsubsection{Examples} \label{Examples} \SPart{Simulating \texttt{g\_inc/3}}: this predicate behaves like: global variable: \begin{Indentation} \begin{verbatim} my_g_inc(Var, Old, New) :- g_read(Var, Old), N is Value + 1, g_assign(Var, X), New = N. \end{verbatim} \end{Indentation} The query: \texttt{my\_g\_inc(c, X, \_)} will succeed unifying \texttt{X} with \texttt{0}, another call to \texttt{my\_g\_inc(a, Y, \_)} will then unify \texttt{Y} with \texttt{1}, and so on. \SPart{Difference between \texttt{g\_assign/2} and \texttt{g\_assignb/2}}: \texttt{g\_assign/2} does not undo its assignment when backtracking occurs whereas \texttt{g\_assignb/2} undoes it. \begin{Code} \begin{tabular}{@{}p{6cm}@{\quad}l@{}} test(Old) :- & testb(Old) :- \\ ~~~~~~~~g\_assign(x,1), & ~~~~~~~~g\_assign(x,1), \\ ~~~~~~~~(~~~g\_read(x, Old), & ~~~~~~~~(~~~g\_read(x, Old), \\ ~~~~~~~~~~~~\textit{g\_assign}(x, 2) & ~~~~~~~~~~~~\textit{g\_assignb}(x, 2) \\ ~~~~~~~~;~~~g\_read(x,~Old), & ~~~~~~~~;~~~g\_read(x, Old), \\ ~~~~~~~~~~~~g\_assign(x, 3) & ~~~~~~~~~~~~g\_assign(x, 3) \\ ~~~~~~~~). & ~~~~~~~~). \\ \end{tabular} \end{Code} The query \texttt{test(Old)} will succeed unifying \texttt{Old} with \texttt{1} and on backtracking with \texttt{2} (i.e. the assignment of the value \texttt{2} has not been undone). The query \texttt{testb(Old)} will succeed unifying \texttt{Old} with \texttt{1} and on backtracking with \texttt{1} (i.e. the assignment of the value \texttt{2} has been undone). \SPart{Difference between \texttt{g\_assign/2} and \texttt{g\_link/2}}: \texttt{g\_assign/2} (and \texttt{g\_assignb/2}) creates a copy of the term whereas \texttt{g\_link/2} does not. \texttt{g\_link/2} can be used to avoid passing big data structures (e.g. dictionaries,\ldots) as arguments to predicates. \begin{Code} \begin{tabular}{@{}p{6cm}@{\quad}l@{}} test(B) :- & test(B) :- \\ ~~~~~~~~\textit{g\_assign}(b, f(X)), & ~~~~~~~~\textit{g\_link}(b, f(X)), \\ ~~~~~~~~X = 12, & ~~~~~~~~X = 12, \\ ~~~~~~~~g\_read(b, B). & ~~~~~~~~g\_read(b, B). \\ \end{tabular} \end{Code} The query \texttt{test(B)} will succeed unifying \texttt{B} with \texttt{f(\_)} (\texttt{g\_assign/2} assigns a copy of the value). The query \texttt{testl(B)} will succeed unifying \texttt{B} with \texttt{f(12)} (\texttt{g\_link/2} assigns a pointer to the term). \SPart{Simple array definition}: here are some queries to show how arrays can be handled: \begin{Indentation} \begin{verbatim} | ?- g_assign(w, g_array(3)), g_read(w, X). X = g_array([0,0,0]) | ?- g_assign(w(0), 16), g_assign(w(1), 32), g_assign(w(2), 64), g_read(w, X). X = g_array([16,32,64]) \end{verbatim} \end{Indentation} this is equivalent to: \begin{Indentation} \begin{verbatim} | ?- g_assign(k, g_array([16,32,64])), g_read(k, X). X = g_array([16,32,64]) | ?- g_assign(k, g_array(3,null)), g_read(k, X), g_array_size(k, S). S = 3 X = g_array([null,null,null]) \end{verbatim} \end{Indentation} \SPart{2-D array definition}: \begin{Indentation} \begin{verbatim} | ?- g_assign(w, g_array(2, g_array(3))), g_read(w, X). X = g_array([g_array([0,0,0]),g_array([0,0,0])]) | ?- ( for(I,0,1), for(J,0,2), K is I*3+J, g_assign(w(I,J), K), fail ; g_read(w, X) ). X = g_array([g_array([0,1,2]),g_array([3,4,5])]) | ?- g_read(w(1),X). X = g_array([3,4,5]) \end{verbatim} \end{Indentation} \SPart{Hybrid array}: \begin{Indentation} \begin{verbatim} | ?- g_assign(w,g_array([1,2,g_array([a,b,c]), g_array(2,z),5])), g_read(w, X). X = g_array([1,2,g_array([a,b,c]), g_array([z,z]),5]) | ?- g_read(w(1), X), g_read(w(2,1), Y), g_read(w(3,1), Z). X = 2 Y = b Z = z | ?- g_read(w(1,2),X). uncaught exception: error(domain_error(g_array_index,w(1,2)),g_read/2) \end{verbatim} \end{Indentation} \SPart{Array extension}: \begin{Indentation} \begin{verbatim} | ?- g_assign(a, g_array([10,20,30])), g_read(a, X). X = g_array([10,20,30]) | ?- g_assign(a, g_array_extend(5,null)), g_read(a, X). X = g_array([10,20,30,null,null]) | ?- g_assign(a, g_array([10,20,30])), g_read(a, X). X = g_array([10,20,30]) | ?- g_assign(a, g_array_extend([1,2,3,4,5,6])), g_read(a, X). X = g_array([10,20,30,4,5,6]) \end{verbatim} \end{Indentation} \SPart{Automatic array}: \begin{Indentation} \begin{verbatim} | ?- g_assign(t, g_array_auto(3)), g_assign(t(1), foo), g_read(t,X). X = g_array([0,foo,0]) | ?- g_assign(t(5), bar), g_read(t,X). X = g_array([0,foo,0,0,0,bar,0,0]) | ?- g_assign(t, g_array_auto(2, g_array(2))), g_assign(t(1,1), foo), g_read(t,X). X = g_array([g_array([0,0]),g_array([0,foo])]) | ?- g_assign(t(3,0), bar), g_read(t,X). X = g_array([g_array([0,0]),g_array([0,foo]),g_array([0,0]),g_array([bar,0])]) | ?- g_assign(t(3,4), bar), g_read(t,X). uncaught exception: error(domain_error(g_array_index,t(3,4)),g_assign/2) | ?- g_assign(t, g_array_auto(2, g_array_auto(2))), g_assign(t(1,1), foo), g_read(t,X). X = g_array([g_array([0,0]),g_array([0,foo])]) | ?- g_assign(t(3,3), bar), g_read(t,X). X = g_array([g_array([0,0]),g_array([0,foo]),g_array([0,0]), g_array([0,0,0,bar])]) | ?- g_assign(t, g_array_auto(2, g_array_auto(2, null))), g_read(t(2,3), U), g_read(t, X). U = null X = g_array([g_array([null,null]),g_array([null,null]), g_array([null,null,null,null]),g_array([null,null])]) \end{verbatim} \end{Indentation} \subsection{Prolog state} \subsubsection{\texttt{set\_prolog\_flag/2}} \label{set-prolog-flag/2} \AddPBD{set\_prolog\_flag/2} \begin{TemplatesOneCol} set\_prolog\_flag(+flag, +term) \end{TemplatesOneCol} \Description \texttt{set\_prolog\_flag(Flag, Value)} sets the value of the \IdxD{Prolog flag} \texttt{Flag} to \texttt{Value}. \index{flag|see {Prolog flag}} \SPart{Prolog flags}: a Prolog flag is an atom which is associated with a value that is either implementation defined or defined by the user. Each flag has a permitted range of values; any other value is a \texttt{domain\_error}. The following two tables present available flags, the possible values, a description and if they are ISO or an extension. The first table presents unchangeable flags while the second one the changeable flags. For flags whose default values is machine independent, this value is \underline{underlined}. \SPart{Unchangeable flags}: \begin{tabular}{|L{4.5cm}|C{2.2cm}|L{6.5cm}|C{0,6cm}|} \hline Flag & Values & Description & ISO \\ \hline\hline \IdxPFD{bounded} & \texttt{\underline{true}} / \texttt{false} & are integers bounded ? & Y \\ \hline \IdxPFD{max\_integer} & an integer & greatest integer & Y \\ \hline \IdxPFD{min\_integer} & an integer & smallest integer & Y \\ \hline \IdxPFD{integer\_rounding\_function} & \texttt{toward\_zero} \linebreak \texttt{down} & \texttt{\textit{rnd}(X)} = integer part of \texttt{X} \linebreak \texttt{\textit{rnd}(X)} = $\lfloor$\texttt{X$\rfloor$} \RefSP{Evaluation-of-an-arithmetic-expression} & Y \\ \hline \IdxPFD{max\_arity} & an integer & maximum arity for compound terms (255) & Y \\ \hline \IdxPFD{max\_atom} & an integer & maximum number of atoms & N \\ \hline \IdxPFD{max\_unget} & an integer & maximum number of successive ungets & N \\ \hline \IdxPFD{prolog\_name} & an atom & name of the Prolog system & N \\ \hline \IdxPFD{prolog\_version} & an atom & version number of the Prolog system & N \\ \hline \IdxPFD{prolog\_date} & an atom & date of the Prolog system & N \\ \hline \IdxPFD{prolog\_copyright} & an atom & copyright message of the Prolog system & N \\ \hline \end{tabular} \SPart{Changeable flags}: \begin{tabular}{|L{4.5cm}|C{2.8cm}|L{6.2cm}|C{0,6cm}|} \hline Flag & Values & Description & ISO \\ \hline\hline \IdxPFD{char\_conversion} & \texttt{on} / \texttt{\underline{off}} & is character conversion activated ? & Y \\ \hline \IdxPFD{debug} & \texttt{on} / \texttt{\underline{off}} & is the debugger activated ? & Y \\ \hline \IdxPFD{singleton\_warning} & \texttt{\underline{on}} / \texttt{off} & warn about named singleton variables ? & N \\ \hline \IdxPFD{strict\_iso} & \texttt{\underline{on}} / \texttt{off} & strict ISO behavior ? & N \\ \hline ~ \linebreak \IdxPFD{double\_quotes} & ~ \linebreak \texttt{atom} \linebreak \texttt{chars} \linebreak \texttt{\underline{codes}} \linebreak \texttt{atom\_no\_escape} \linebreak \texttt{chars\_no\_escape} \linebreak \texttt{codes\_no\_escape} & a double quoted constant is returned as: \linebreak an atom \linebreak a list of characters \linebreak a list of character codes \linebreak as \texttt{atom} but ignore \IdxD{escape sequence}s \linebreak as \texttt{chars} but ignore escape sequences \linebreak as \texttt{code} but ignore escape sequences & ~ \linebreak Y \linebreak ~ \linebreak ~ \linebreak N \\ \hline ~ \linebreak \IdxPFD{back\_quotes} & ~ \linebreak \texttt{atom} \linebreak \texttt{chars} \linebreak \texttt{codes} \linebreak \texttt{\underline{atom\_no\_escape}} \linebreak \texttt{chars\_no\_escape} \linebreak \texttt{codes\_no\_escape} & a back quoted constant is returned as: \linebreak an atom \linebreak a list of characters \linebreak a list of character codes \linebreak as \texttt{atom} but ignore escape sequences \linebreak as \texttt{chars} but ignore escape sequences \linebreak as \texttt{code} but ignore escape sequences & ~ \linebreak N \\ \hline ~ \linebreak \IdxPFD{unknown} & ~ \linebreak \texttt{\underline{error}} \linebreak \texttt{warning} \linebreak \texttt{fail} & a predicate calls an unknown procedure: \linebreak an \texttt{existence\_error} is raised \linebreak a message is displayed then fails \linebreak quietly fails & ~ \linebreak Y \\ \hline ~ \linebreak \IdxPFD{syntax\_error} & ~ \linebreak \texttt{\underline{error}} \linebreak \texttt{warning} \linebreak \texttt{fail} & a predicate causes a syntax error: \linebreak a \texttt{syntax\_error} is raised \linebreak a message is displayed then fails \linebreak quietly fails & ~ \linebreak N \\ \hline ~ \linebreak \IdxPFD{os\_error} & ~ \linebreak \texttt{\underline{error}} \linebreak \texttt{warning} \linebreak \texttt{fail} & a predicate causes an O.S. error: \linebreak a \texttt{system\_error} is raised \linebreak a message is displayed then fails \linebreak quietly fails & ~ \linebreak N \\ \hline \end{tabular} The \texttt{strict\_iso} flag is introduced to allow a compatibility with other Prolog systems. When turned off the following relaxations apply: \begin{itemize} \item a callable term can be given as a predicate indicator. \item built-in predicates are found by \texttt{current\_predicate/1} \RefSP{current-predicate/1}. \end{itemize} \begin{PlErrors} \ErrCond{\texttt{Flag} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Value} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Flag} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Flag)} \ErrCond{\texttt{Flag} is an atom but not a valid flag} \ErrTerm{domain\_error(prolog\_flag, Flag)} \ErrCond{\texttt{Value} is inappropriate for Flag} \ErrTerm{domain\_error(flag\_value, Flag+Value)} \ErrCond{\texttt{Value} is appropriate for \texttt{Flag} but flag \texttt{Flag} is not modifiable} \ErrTerm{permission\_error(modify, flag, Flag)} \end{PlErrors} \Portability ISO predicate. All ISO flags are implemented. \subsubsection{\texttt{current\_prolog\_flag/2}} \AddPBD{current\_prolog\_flag/2} \begin{TemplatesOneCol} current\_prolog\_flag(?flag, ?term) \end{TemplatesOneCol} \Description \texttt{current\_prolog\_flag(Flag, Value)} succeeds if there exists a \Idx{Prolog flag} that unifies with \texttt{Flag} and whose value unifies with \texttt{Value}. This predicate is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{Flag} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Flag)} \ErrCond{\texttt{Flag} is an atom but not a valid flag} \ErrTerm{domain\_error(prolog\_flag, Flag)} \end{PlErrors} \Portability ISO predicate. \subsubsection{\texttt{set\_bip\_name/2}} \label{set-bip-name/2} \AddPBD{set\_bip\_name/2} \begin{TemplatesOneCol} set\_bip\_name(+atom, +arity) \end{TemplatesOneCol} \Description \texttt{set\_bip\_name(Functor, Arity)} initializes the context of the error \RefSP{General-format-and-error-context} with \texttt{Functor} and \texttt{Arity} (if \texttt{Arity} $<$ 0 only \texttt{Functor} is significant). \begin{PlErrors} \ErrCond{\texttt{Functor} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Arity} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Functor} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Functor)} \ErrCond{\texttt{Arity} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Arity)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{current\_bip\_name/2}} \label{current-bip-name/2} \AddPBD{current\_bip\_name/2} \begin{TemplatesOneCol} current\_bip\_name(?atom, ?arity) \end{TemplatesOneCol} \Description \texttt{current\_bip\_name(Functor, Arity)} succeeds if \texttt{Functor} and \texttt{Arity} correspond to the context of the error \RefSP{General-format-and-error-context} (if \texttt{Arity} $<$ 0 only \texttt{Functor} is significant). \begin{PlErrors} \ErrCond{\texttt{Functor} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Functor)} \ErrCond{\texttt{Arity} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Arity)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{write\_pl\_state\_file/1}, \texttt{read\_pl\_state\_file/1}} \label{write-pl-state-file/1} \AddPBD{write\_pl\_state\_file/1} \AddPBD{read\_pl\_state\_file/1} \begin{TemplatesOneCol} write\_pl\_state\_file(+source\_sink)\\ read\_pl\_state\_file(+source\_sink) \end{TemplatesOneCol} \Description \texttt{write\_pl\_state\_file(FileName)} writes onto \texttt{FileName} all information that influences the parsing of a term \RefSP{Term-input/output}. This allows a sub-process written in Prolog to read this file and then process any Prolog term as done by the parent process. This file can also be passed as argument of the \IdxK{--pl-state} option when invoking \IdxK{gplc} \RefSP{Using-the-compiler}. More precisely the following elements are saved: \begin{itemize} \item all operator definitions \RefSP{op/3:(Term-input/output)}. \item the character conversion table \RefSP{char-conversion/2}. \item the value of \IdxPF{char\_conversion}, \IdxPF{double\_quotes}, \IdxPF{back\_quotes} and \IdxPF{singleton\_warning} \Idx{Prolog flag}s \RefSP{set-prolog-flag/2}. \end{itemize} \texttt{read\_pl\_state\_file(FileName)} reads (restores) from \texttt{FileName} all information previously saved by \texttt{write\_pl\_state\_file/1.} \begin{PlErrors} \ErrCond{\texttt{FileName} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{FileName} is neither a variable nor an atom} \ErrTerm{type\_error(atom, FileName)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{Program state} \subsubsection{\texttt{consult/1}, \texttt{'.'/2} - program consult} \label{consult/1} \AddPBD{consult/1} \AddPBD{'.'/2} \begin{TemplatesOneCol} consult(+atom\_or\_atom\_list)\\ '.'(+atom, +atom\_list) \end{TemplatesOneCol} \Description \texttt{consult(Files)} compiles and loads into memory each file of the list \texttt{Files}. Each file is compiled for byte-code using the GNU Prolog compiler \RefSP{The-GNU-Prolog-compiler} then loaded using \texttt{load/1} \RefSP{load/1}. It is possible to specify \IdxPK{user} as a file name to directly enter the program from the terminal. \texttt{Files} can be also a single file name (i.e. an atom). Refer to the section concerning the consult of a Prolog program for more information \RefSP{Consulting-a-Prolog-program}. The final file name of a file is computed using the predicates \IdxPB{prolog\_file\_name/2} \RefSP{prolog-file-name/2} and \IdxPB{absolute\_file\_name/2} \RefSP{absolute-file-name/2}. \texttt{[ File | Files ]}, i.e. \texttt{'.'(File, Files)} is equivalent to \texttt{consult([ File | Files ])}. \begin{PlErrors} \ErrCond{\texttt{Files} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Files} is neither a partial list nor a list nor an atom} \ErrTerm{type\_error(list, Files)} \ErrCond{an element \texttt{E} of the \texttt{Files} list is neither a variable nor an atom} \ErrTerm{type\_error(atom, E)} \ErrCond{an element \texttt{E} of the \texttt{Files} list is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, E)} \ErrCond{an element \texttt{E} of the \texttt{Files} list is a valid pathname but does not correspond to an existing source} \ErrTerm{existence\_error(source\_sink, E)} \ErrCond{an error occurs executing a directive} \ErrTermRm{see \texttt{call/1} errors \RefSP{call/1}} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{load/1}} \label{load/1} \AddPBD{load/1} \begin{TemplatesOneCol} load(+atom\_or\_atom\_list) \end{TemplatesOneCol} \Description \texttt{load(Files)} loads into memory each file of the list \texttt{Files}. Each file must have been previously compiled for byte-code using the GNU Prolog compiler \RefSP{The-GNU-Prolog-compiler}. \texttt{Files} can be also a single file name (i.e. an atom). The final file name of a file is computed using the predicates \IdxPB{absolute\_file\_name/2} \RefSP{absolute-file-name/2}. If no suffix is given \texttt{'.wbc'} is appended to the file name. \begin{PlErrors} \ErrCond{\texttt{Files} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Files} is neither a partial list nor a list nor an atom} \ErrTerm{type\_error(list, Files)} \ErrCond{an element \texttt{E} of the \texttt{Files} list is neither a variable nor an atom} \ErrTerm{type\_error(atom, E)} \ErrCond{an element \texttt{E} of the \texttt{Files} list is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, E)} \ErrCond{an element \texttt{E} of the \texttt{Files} list is a valid pathname but does not correspond to an existing source} \ErrTerm{existence\_error(source\_sink, E)} \ErrCond{an error occurs executing a directive} \ErrTermRm{see \texttt{call/1} errors \RefSP{call/1}} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{listing/1}, \texttt{listing/0}} \label{listing/1} \AddPBD{listing/1} \AddPBD{listing/0} \begin{TemplatesOneCol} listing(+predicate\_indicator)\\ listing(+atom)\\ listing \end{TemplatesOneCol} \Description \texttt{listing(Pred)} lists the clauses of the consulted predicate whose predicate indicator is \texttt{Pred}. \texttt{Pred} can also be a single atom in which case all predicates whose name is \texttt{Pred} are listed (of any arity). This predicate uses \IdxPB{portray\_clause/2} \RefSP{portray-clause/2} to output the clauses. \texttt{listing} lists all clauses of all consulted predicates. \begin{PlErrors} \ErrCond{\texttt{Pred} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Pred} is neither a variable nor predicate indicator or an atom} \ErrTerm{type\_error(predicate\_indicator, Pred)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{System statistics} \subsubsection{\texttt{statistics/0}, \texttt{statistics/2}} \AddPBD{statistics/0} \AddPBD{statistics/2} \begin{TemplatesOneCol} statistics\\ statistics(?atom, ?list) \end{TemplatesOneCol} \Description \texttt{statistics} displays statistics about memory usage and run times. \texttt{statistics(Key, Value)} unifies \texttt{Value} with the current value of the statistics key \texttt{Key}. \texttt{Value} a list of two elements. Times are in milliseconds, sizes of areas in bytes. \begin{tabular}{|l|l|l|} \hline Key & Description & Value \\ \hline\hline \texttt{user\_time} & user CPU time & \texttt{[SinceStart, SinceLast]} \\ \hline \texttt{system\_time} & system CPU time & \texttt{[SinceStart, SinceLast]} \\ \hline \texttt{cpu\_time} & total CPU time (user + system) & \texttt{[SinceStart, SinceLast]} \\ \hline \texttt{real\_time} & absolute time & \texttt{[SinceStart, SinceLast]} \\ \hline \texttt{local\_stack} & local stack sizes (control, environments, choices) & \texttt{[UsedSize, FreeSize]} \\ \hline \texttt{global\_stack} & global stack sizes (compound terms) & \texttt{[UsedSize, FreeSize]} \\ \hline \texttt{trail\_stack} & trail stack sizes (variable bindings to undo) & \texttt{[UsedSize, FreeSize]} \\ \hline \texttt{cstr\_stack} & constraint trail sizes (finite domain constraints) & \texttt{[UsedSize, FreeSize]} \\ \hline \end{tabular} Note that the key \texttt{runtime} is recognized as \texttt{user\_time} for compatibility purpose. \begin{PlErrors} \ErrCond{\texttt{Key} is neither a variable nor a valid key} \ErrTerm{domain\_error(statistics\_key, Key)} \ErrCond{\texttt{Value} is neither a variable nor a list of two elements} \ErrTerm{domain\_error(statistics\_value, Value)} \ErrCond{\texttt{Value} is a list of two elements and an element \texttt{E} is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{user\_time/1}, \texttt{system\_time/1}, \texttt{cpu\_time/1}, \texttt{real\_time/1}} \label{user-time/1} \AddPBD{user\_time/1} \AddPBD{system\_time/1} \AddPBD{cpu\_time/1} \AddPBD{real\_time/1} \begin{TemplatesOneCol} user\_time(?integer)\\ system\_time(?integer)\\ cpu\_time(?integer)\\ real\_time(?integer) \end{TemplatesOneCol} \Description \texttt{user\_time(Time)} unifies \texttt{Time} with the user CPU time elapsed since the start of Prolog. \texttt{system\_time(Time)} unifies \texttt{Time} with the system CPU time elapsed since the start of Prolog. \texttt{cpu\_time(Time)} unifies \texttt{Time} with the CPU time (user + system) elapsed since the start of Prolog. \texttt{real\_time(Time)} unifies \texttt{Time} with the absolute time elapsed since the start of Prolog. \begin{PlErrors} \ErrCond{\texttt{Time} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Time)} \end{PlErrors} \Portability GNU Prolog predicates. \subsection{Random number generator} \subsubsection{\texttt{set\_seed/1}, \texttt{randomize/0}} \AddPBD{set\_seed/1} \AddPBD{randomize/0} \begin{TemplatesOneCol} set\_seed(+integer)\\ randomize \end{TemplatesOneCol} \Description \texttt{set\_seed(Seed)} reinitializes the random number generator seed with \texttt{Seed}. \texttt{randomize} reinitializes the random number generator. This predicates calls \texttt{set\_seed/1} with a random value depending on the absolute time. \begin{PlErrors} \ErrCond{\texttt{Seed} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Seed} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Seed)} \ErrCond{\texttt{Seed} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Seed)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{get\_seed/1}} \AddPBD{get\_seed/1} \begin{TemplatesOneCol} get\_seed(?integer) \end{TemplatesOneCol} \Description \texttt{get\_seed(Seed)} unifies \texttt{Seed} with the current random number generator seed. \begin{PlErrors} \ErrCond{\texttt{Seed} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Seed)} \ErrCond{\texttt{Seed} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Seed)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{random/1}} \AddPBD{random/1} \begin{TemplatesOneCol} random(-float) \end{TemplatesOneCol} \Description \texttt{random(Number)} unifies \texttt{Number} with a random floating point number such that 0.0 $\leq$ \texttt{Number} $<$ 1.0. \begin{PlErrors} \ErrCond{\texttt{Number} is not a variable} \ErrTerm{type\_error(variable, Number)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{random/3}} \AddPBD{random/3} \begin{TemplatesOneCol} random(+number, +number, -number) \end{TemplatesOneCol} \Description \texttt{random(Base, Max, Number)} unifies \texttt{Number} with a random number such that \texttt{Base} $\leq$ \texttt{Number} $<$ \texttt{Max}. If both \texttt{Base} and \texttt{Max} are integers \texttt{Number} will be an integer, otherwise \texttt{Number} will be a floating point number. \begin{PlErrors} \ErrCond{\texttt{Base} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Base} is neither a variable nor a number} \ErrTerm{type\_error(number, Base)} \ErrCond{\texttt{Max} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Max} is neither a variable nor a number} \ErrTerm{type\_error(number, Max)} \ErrCond{\texttt{Number} is not a variable} \ErrTerm{type\_error(variable, Number)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{File name processing} \subsubsection{\texttt{absolute\_file\_name/2}} \label{absolute-file-name/2} \AddPBD{absolute\_file\_name/2} \begin{TemplatesOneCol} absolute\_file\_name(+atom, atom) \end{TemplatesOneCol} \Description \texttt{absolute\_file\_name(File1, File2)} succeeds if \texttt{File2} is the absolute pathname associated with the relative file name \texttt{File1}. \texttt{File1} can contain \texttt{\$\Param{VAR\_NAME}} sub-strings. When such a sub-string is encountered, it is expanded with the value of the environment variable whose name is \Param{VAR\_NAME} if exists (otherwise no expansion is done). \texttt{File1} can also begin with a sub-string \texttt{\~{}\Param{USER\_NAME}/}, this is expanded as the home directory of the user \Param{USER\_NAME}. If \Param{USER\_NAME} does not exist \texttt{File1} is an invalid pathname. If no \Param{USER\_NAME} is given (i.e. \texttt{File1} begins with \texttt{\~{}/}) the \texttt{\~{}} character is expanded as the value of the environment variable \texttt{HOME}. If the \texttt{HOME} variable is not defined \texttt{File1} is an invalid pathname. Relative references to the current directory (\texttt{/./} sub-string) and to the parent directory (\texttt{/../} sub-strings) are removed and no longer appear in \texttt{File2}. \texttt{File1} is also invalid if it contains too many \texttt{/../} consecutive sub-strings (i.e. parent directory relative references). Finally if \texttt{File1} is \IdxPK{user} then \texttt{File2} is also unified with \texttt{user} to allow this predicate to be called on Prolog file names (since \texttt{user} in DEC-10 input/output predicates denotes the current input/output stream). Most predicates using a file name implicitly call this predicate to obtain the desired file, e.g. \texttt{open/4}. \begin{PlErrors} \ErrCond{\texttt{File1} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{File1} is neither a variable nor an atom} \ErrTerm{type\_error(atom, File1)} \ErrCond{\texttt{File2} is neither a variable nor an atom} \ErrTerm{type\_error(atom, File2)} \ErrCond{\texttt{File1} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, File1)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{decompose\_file\_name/4}} \AddPBD{decompose\_file\_name/4} \begin{TemplatesOneCol} decompose\_file\_name(+atom, ?atom, ?atom, ?atom) \end{TemplatesOneCol} \Description \texttt{decompose\_file\_name(File, Directory, Prefix, Suffix)} decomposes the pathname \texttt{File} and extracts the \texttt{Directory} part (characters before the last \texttt{/}), the \texttt{Prefix} part (characters after the last \texttt{/} and before the last \texttt{.} or until the end if there is no suffix) and the \texttt{Suffix} part (characters from the last \texttt{.} to the end of the string). \begin{PlErrors} \ErrCond{\texttt{File} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{File} is neither a variable nor an atom} \ErrTerm{type\_error(atom, File)} \ErrCond{\texttt{Directory} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Directory)} \ErrCond{\texttt{Prefix} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Prefix)} \ErrCond{\texttt{Suffix} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Suffix)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{prolog\_file\_name/2}} \label{prolog-file-name/2} \AddPBD{prolog\_file\_name/2} \begin{TemplatesOneCol} prolog\_file\_name(+atom, ?atom) \end{TemplatesOneCol} \Description \texttt{prolog\_file\_name(File1, File2)} unifies \texttt{File2} with the Prolog file name associated with \texttt{File1}. More precisely \texttt{File2} is computed as follows: \begin{itemize} \item if \texttt{File1} has a suffix or if it is \IdxPK{user} then \texttt{File2} is unified with \texttt{File1}. \item else if the file whose name is \texttt{File1} + \texttt{'.pl'} exists then \texttt{File2} is unified with this name. \item else if the file whose name is \texttt{File1} + \texttt{'.pro'} exists then \texttt{File2} is unified with this name. \item else \texttt{File2} is unified with the name \texttt{File1} + \texttt{'.pl'}. \end{itemize} This predicate uses \IdxPB{absolute\_file\_name/2} to check the existence of a file \RefSP{absolute-file-name/2}. \begin{PlErrors} \ErrCond{\texttt{File1} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{File1} is neither a variable nor an atom} \ErrTerm{type\_error(atom, File1)} \ErrCond{\texttt{File2} is neither a variable nor an atom} \ErrTerm{type\_error(atom, File2)} \ErrCond{\texttt{File1} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, File1)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{Operating system interface} \subsubsection{\texttt{argument\_counter/1}} \label{argument-counter/1} \AddPBD{argument\_counter/1} \begin{TemplatesOneCol} argument\_counter(?integer) \end{TemplatesOneCol} \Description \texttt{argument\_counter(Counter)} succeeds if \texttt{Counter} is the number of arguments of the command-line. Since the first argument is always the name of the running program, \texttt{Counter} is always $\geq$ 1. See \RefSP{The-GNU-Prolog-interactive-interpreter} for more information about command-line arguments retrieved under the top\_level. \begin{PlErrors} \ErrCond{\texttt{Counter} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Counter)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{argument\_value/2}} \label{argument-value/2} \AddPBD{argument\_value/2} \begin{TemplatesOneCol} argument\_value(+integer, ?atom) \end{TemplatesOneCol} \Description \texttt{argument\_value(N, Arg)} succeeds if the \texttt{N}\emph{th} argument on the command-line unifies with \texttt{Arg}. The first argument is always the name of the running program and its number is 0. The number of arguments on the command-line can be obtained using \texttt{argument\_counter/1} \RefSP{argument-counter/1}. \begin{PlErrors} \ErrCond{\texttt{N} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{N} is neither a variable nor an integer} \ErrTerm{type\_error(integer, N)} \ErrCond{\texttt{N} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, N)} \ErrCond{\texttt{Arg} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Arg)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{argument\_list/1}} \label{argument-list/1} \AddPBD{argument\_list/1} \begin{TemplatesOneCol} argument\_list(?list) \end{TemplatesOneCol} \Description \texttt{argument\_list(Args)} succeeds if \texttt{Args} unifies with the list of atoms associated with each argument on the command-line other than the first argument (the name of the running program). \begin{PlErrors} \ErrCond{\texttt{Args} is neither a partial list nor a list} \ErrTerm{type\_error(list, Args)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{environ/2}} \AddPBD{environ/2} \begin{TemplatesOneCol} environ(?atom, ?atom) \end{TemplatesOneCol} \Description \texttt{environ(Name, Value)} succeeds if \texttt{Name} is the name of an environment variable whose value is \texttt{Value}. This predicate is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{Name} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Name)} \ErrCond{\texttt{Value} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Value)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{make\_directory/1}, \texttt{delete\_directory/1}, \texttt{change\_directory/1}} \AddPBD{make\_directory/1} \AddPBD{delete\_directory/1} \AddPBD{change\_directory/1} \begin{TemplatesOneCol} make\_directory(+atom)\\ delete\_directory(+atom)\\ change\_directory(+atom) \end{TemplatesOneCol} \Description \texttt{make\_directory(PathName)} creates the directory whose pathname is \texttt{PathName}. \texttt{delete\_directory(PathName)} removes the directory whose pathname is \texttt{PathName}. \texttt{change\_directory(PathName)} sets the current directory to the directory whose pathname is \texttt{PathName}. See \IdxPB{absolute\_file\_name/2} for information about the syntax of \texttt{PathName} \RefSP{absolute-file-name/2}. \begin{PlErrors} \ErrCond{\texttt{PathName} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{PathName} is neither a variable nor an atom} \ErrTerm{type\_error(atom, PathName)} \ErrCond{\texttt{PathName} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, PathName)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{working\_directory/1}} \AddPBD{working\_directory/1} \begin{TemplatesOneCol} working\_directory(?atom) \end{TemplatesOneCol} \Description \texttt{working\_directory(PathName)} succeeds if \texttt{PathName} is the pathname of the current directory. \begin{PlErrors} \ErrCond{\texttt{PathName} is neither a variable nor an atom} \ErrTerm{type\_error(atom, PathName)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{directory\_files/2}} \AddPBD{directory\_files/2} \begin{TemplatesOneCol} directory\_files(+atom, ?list) \end{TemplatesOneCol} \Description \texttt{directory\_files(PathName, Files)} succeeds if \texttt{Files} is the list of all entries (files, sub-directories,\ldots) in the directory whose pathname is \texttt{PathName}. See \IdxPB{absolute\_file\_name/2} for information about the syntax of \texttt{PathName} \RefSP{absolute-file-name/2}. \begin{PlErrors} \ErrCond{\texttt{PathName} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{PathName} is neither a variable nor an atom} \ErrTerm{type\_error(atom, PathName)} \ErrCond{\texttt{PathName} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, PathName)} \ErrCond{\texttt{Files} is neither a partial list nor a list} \ErrTerm{type\_error(list, Files)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{rename\_file/2}} \AddPBD{rename\_file/2} \begin{TemplatesOneCol} rename\_file(+atom, +atom) \end{TemplatesOneCol} \Description \texttt{rename\_file(PathName1, PathName2)} renames the file or directory whose pathname is \texttt{PathName1} to \texttt{PathName2}. See \IdxPB{absolute\_file\_name/2} for information about the syntax of \texttt{PathName1} and \texttt{PathName2} \RefSP{absolute-file-name/2}. \begin{PlErrors} \ErrCond{\texttt{PathName1} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{PathName1} is neither a variable nor an atom} \ErrTerm{type\_error(atom, PathName1)} \ErrCond{\texttt{PathName1} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, PathName1)} \ErrCond{\texttt{PathName2} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{PathName2} is neither a variable nor an atom} \ErrTerm{type\_error(atom, PathName2)} \ErrCond{\texttt{PathName2} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, PathName2)} \ErrCond{an operating system error occurs and value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{delete\_file/1}, \texttt{unlink/1}} \AddPBD{delete\_file/1} \AddPBD{unlink/1} \begin{TemplatesOneCol} delete\_file(PathName)\\ unlink(PathName) \end{TemplatesOneCol} \Description \texttt{delete\_file(PathName)} removes the existing file whose pathname is \texttt{PathName}. \texttt{unlink/1} is similar to \texttt{delete\_file/1} except that it never causes a \texttt{system\_error} (e.g. if \texttt{PathName} does not refer to an existing file). See \IdxPB{absolute\_file\_name/2} for information about the syntax of \texttt{PathName} \RefSP{absolute-file-name/2}. \begin{PlErrors} \ErrCond{\texttt{PathName} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{PathName} is neither a variable nor an atom} \ErrTerm{type\_error(atom, PathName)} \ErrCond{\texttt{PathName} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, PathName)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{file\_permission/2}, \texttt{file\_exists/1}} \label{file-permission/2} \AddPBD{file\_permission/2} \AddPBD{file\_exists/1} \begin{TemplatesOneCol} file\_permission(+atom, +atom)\\ file\_permission(+atom, +atom\_list)\\ file\_exists(+atom) \end{TemplatesOneCol} \Description \texttt{file\_permission(PathName, Permission)} succeeds if \texttt{PathName} is the pathname of an existing file (or directory) whose permissions include \texttt{Permission}. \SPart{File permissions}: \texttt{Permission} can be a single permission or a list of permissions. A permission is an atom among: \begin{itemize} \item \IdxPXD{read}: the file or directory can be read. \item \IdxPXD{write}: the file or directory can be written. \item \IdxPXD{execute}: the file can be executed. \item \IdxPXD{search}: the directory can be searched. \end{itemize} If \texttt{PathName} does not exists or if it its permissions do not include \texttt{Permission} this predicate fails. \texttt{file\_exists(PathName)} is equivalent to \texttt{file\_permission(PathName, [])}, i.e. it succeeds if \texttt{PathName} is the pathname of an existing file (or directory). See \IdxPB{absolute\_file\_name/2} for information about the syntax of \texttt{PathName} \RefSP{absolute-file-name/2}. \begin{PlErrors} \ErrCond{\texttt{PathName} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{PathName} is neither a variable nor an atom} \ErrTerm{type\_error(atom, PathName)} \ErrCond{\texttt{PathName} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, PathName)} \ErrCond{\texttt{Permission} is a partial list or a list with an element which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Permission} is neither an atom nor partial list or a list} \ErrTerm{type\_error(list, Permission)} \ErrCond{an element \texttt{E} of the \texttt{Permission} list is neither a variable nor an atom} \ErrTerm{type\_error(atom, E)} \ErrCond{an element \texttt{E} of the \texttt{Permission} is an atom but not a valid permission} \ErrTerm{domain\_error(os\_file\_permission, Permission)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{file\_property/2}} \label{file-property/2} \AddPBD{file\_property/2} \begin{TemplatesOneCol} file\_property(+atom, ?os\_file\_property) \end{TemplatesOneCol} \Description \texttt{file\_property(PathName, Property)} succeeds if \texttt{PathName} is the pathname of an existing file (or directory) and if \texttt{Property} unifies with one of the properties of the file. This predicate is re-executable on backtracking. \SPart{File properties}: \begin{itemize} \item \IdxPPD[absolute\_file\_name]{absolute\_file\_name(File)}: \texttt{File} is the absolute file name of \texttt{PathName} \RefSP{absolute-file-name/2}. \item \IdxPPD[real\_file\_name]{real\_file\_name(File)}: \texttt{File} is the real file name of \texttt{PathName} (follows symbolic links). \item \IdxPPD[type]{type(Type)}: \texttt{Type} is the type of \texttt{PathName}. Possible values are: \IdxPXD{regular}, \IdxPXD{directory}, \IdxPXD{fifo}, \IdxPXD{socket}, \IdxPXD{character\_device}, \IdxPXD{block\_device} or \IdxPXD{unknown}. \item \IdxPPD[size]{size(Size)}: \texttt{Size} is the size (in bytes) of \texttt{PathName}. \item \IdxPPD[permission]{permission(Permission)}: \texttt{Permission} is a permission of \texttt{PathName} \RefSP{file-permission/2}. \item \IdxPPD[last\_modification]{last\_modification(DT)}: \texttt{DT} is the last modification date and time \RefSP{date-time/1}. \end{itemize} See \IdxPB{absolute\_file\_name/2} for information about the syntax of \texttt{PathName} \RefSP{absolute-file-name/2}. \begin{PlErrors} \ErrCond{\texttt{PathName} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{PathName} is neither a variable nor an atom} \ErrTerm{type\_error(atom, PathName)} \ErrCond{\texttt{PathName} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, PathName)} \ErrCond{\texttt{Property} is neither a variable nor a file property term} \ErrTerm{domain\_error(os\_file\_property, Property)} \ErrCond{\texttt{Property} = \texttt{absolute\_file\_name(E)}, \texttt{real\_file\_name(E)}, \texttt{type(E)} or \texttt{permission(E)} and \texttt{E} is neither a variable nor an atom} \ErrTerm{type\_error(atom, E)} \ErrCond{\texttt{Property} = \texttt{last\_modification(DateTime)} and \texttt{DateTime} is neither a variable nor a compound term} \ErrTerm{type\_error(compound, DateTime)} \ErrCond{\texttt{Property} = \texttt{last\_modification(DateTime)} and \texttt{DateTime} is a compound term but not a structure \texttt{dt/6}} \ErrTerm{domain\_error(date\_time, DateTime)} \ErrCond{\texttt{Property} = \texttt{size(E)} or \texttt{last\_modification(DateTime)} and \texttt{DateTime} is a structure \texttt{dt/6} but an element \texttt{E} is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{temporary\_name/2}} \AddPBD{temporary\_name/2} \begin{TemplatesOneCol} temporary\_name(+atom, ?atom) \end{TemplatesOneCol} \Description \texttt{temporary\_name(Template, PathName)} creates a unique file name \texttt{PathName} whose pathname begins by \texttt{Template}. \texttt{Template} should contain a pathname with six trailing \texttt{X}\emph{s}. \texttt{PathName} is \texttt{Template} with the six \texttt{X}\emph{s} replaced with a letter and the process identifier. This predicate is an interface to the C Unix function \texttt{mktemp(3)}. See \IdxPB{absolute\_file\_name/2} for information about the syntax of \texttt{Template} \RefSP{absolute-file-name/2}. \begin{PlErrors} \ErrCond{\texttt{Template} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Template} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Template)} \ErrCond{\texttt{Template} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, Template)} \ErrCond{\texttt{PathName} is neither a variable nor an atom} \ErrTerm{type\_error(atom, PathName)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{temporary\_file/3}} \AddPBD{temporary\_file/3} \begin{TemplatesOneCol} temporary\_file(+atom, +atom, ?atom) \end{TemplatesOneCol} \Description \texttt{temporary\_file(Directory, Prefix, PathName)} creates a unique file name \texttt{PathName} whose pathname begins by \texttt{Directory/Prefix}. If \texttt{Directory} is the empty atom \texttt{''} a standard temporary directory will be used (e.g. \texttt{/tmp}). \texttt{Prefix} can be the empty atom \texttt{''}. This predicate is an interface to the C Unix function \texttt{tempnam(3)}. See \IdxPB{absolute\_file\_name/2} for information about the syntax of \texttt{Directory} \RefSP{absolute-file-name/2}. \begin{PlErrors} \ErrCond{\texttt{Directory} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Directory} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Directory)} \ErrCond{\texttt{Directory} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, Directory)} \ErrCond{\texttt{Prefix} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Prefix} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Prefix)} \ErrCond{\texttt{PathName} is neither a variable nor an atom} \ErrTerm{type\_error(atom, PathName)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{date\_time/1}} \label{date-time/1} \AddPBD{date\_time/1} \begin{TemplatesOneCol} date\_time(?compound) \end{TemplatesOneCol} \Description \texttt{date\_time(DateTime)} unifies \texttt{DateTime} with a compound term containing the current date and time. \texttt{DateTime} is a structure \texttt{dt(Year, Month, Day, Hour, Minute, Second)}. Each sub-argument of the term \texttt{dt/6} is an integer. \begin{PlErrors} \ErrCond{\texttt{DateTime} is neither a variable nor a compound term} \ErrTerm{type\_error(compound, DateTime)} \ErrCond{\texttt{DateTime} is a compound term but not a structure \texttt{dt/6}} \ErrTerm{domain\_error(date\_time, DateTime)} \ErrCond{\texttt{DateTime} is a structure \texttt{dt/6} and an element \texttt{E} is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{host\_name/1}} \AddPBD{host\_name/1} \begin{TemplatesOneCol} host\_name(?atom) \end{TemplatesOneCol} \Description \texttt{host\_name(HostName)} unifies \texttt{HostName} with the name of the host machine executing the current GNU Prolog process. If the sockets are available \RefSP{Introduction:(Sockets-input/output)}, the name returned will be fully qualified. In that case, \texttt{host\_name/1} will also succeed if \texttt{HostName} is instantiated to the unqualified name (or an alias) of the machine. \begin{PlErrors} \ErrCond{\texttt{Hostname} is neither a variable nor an atom} \ErrTerm{type\_error(atom, HostName)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{os\_version/1}} \AddPBD{os\_version/1} \begin{TemplatesOneCol} os\_version(?atom) \end{TemplatesOneCol} \Description \texttt{os\_version(OSVersion)} unifies \texttt{OSVersion} with the operating system version of the machine executing the current GNU Prolog process. \begin{PlErrors} \ErrCond{\texttt{OSVersion} is neither a variable nor an atom} \ErrTerm{type\_error(atom, OSVersion)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{architecture/1}} \AddPBD{architecture/1} \begin{TemplatesOneCol} architecture(?atom) \end{TemplatesOneCol} \Description \texttt{architecture(Architecture)} unifies \texttt{Architecture} with the name of the machine executing the current GNU Prolog process. \begin{PlErrors} \ErrCond{\texttt{Architecture} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Architecture)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{shell/2}, \texttt{shell/1}, \texttt{shell/0}} \AddPBD{shell/2} \AddPBD{shell/1} \AddPBD{shell/0} \begin{TemplatesOneCol} shell(+atom, ?integer)\\ shell(+atom)\\ shell \end{TemplatesOneCol} \Description \texttt{shell(Command, Status)} invokes a new shell (named by the \texttt{SHELL} environment variable) passing \texttt{Command} for execution and unifies \texttt{Status} with the result of the execution. If \texttt{Command} is the empty atom \texttt{''} a new interactive shell is executed. The control is returned to Prolog upon termination of the called process. \texttt{shell(Command)} is equivalent to \texttt{shell(Command, 0)}. \texttt{shell} is equivalent to \texttt{shell('', 0)}. \begin{PlErrors} \ErrCond{\texttt{Command} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Command} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Command)} \ErrCond{\texttt{Status} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Status)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{system/2}, \texttt{system/1}} \AddPBD{system/2} \AddPBD{system/1} \begin{TemplatesOneCol} system(+atom, ?integer)\\ system(+atom) \end{TemplatesOneCol} \Description \texttt{system(Command, Status)} invokes a new default shell passing \texttt{Command} for execution and unifies \texttt{Status} with the result of the execution. The control is returned to Prolog upon termination of the shell process. This predicate is an interface to the C Unix function \texttt{system(3)}. \texttt{system(Command)} is equivalent to \texttt{system(Command, 0)}. \begin{PlErrors} \ErrCond{\texttt{Command} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Command} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Command)} \ErrCond{\texttt{Status} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Status)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{spawn/3}, \texttt{spawn/2}} \AddPBD{spawn/3} \AddPBD{spawn/2} \begin{TemplatesOneCol} spawn(+atom, +atom\_list, ?integer)\\ spawn(+atom, +atom\_list) \end{TemplatesOneCol} \Description \texttt{spawn(Command, Arguments, Status)} executes \texttt{Command} passing as arguments of the command-line each element of the list \texttt{Arguments} and unifies \texttt{Status} with the result of the execution. The control is returned to Prolog upon termination of the command. \texttt{spawn(Command, Arguments)} is equivalent to \texttt{spawn(Command, Arguments, 0)}. \begin{PlErrors} \ErrCond{\texttt{Command} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Command} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Command)} \ErrCond{\texttt{Arguments} is a partial list or a list with an element which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Arguments} is neither a partial list nor a list} \ErrTerm{type\_error(list, Arguments)} \ErrCond{an element \texttt{E} of the \texttt{Arguments} list is neither a variable nor an atom} \ErrTerm{type\_error(atom, E)} \ErrCond{\texttt{Status} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Status)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{popen/3}} \label{popen/3} \AddPBD{popen/3} \begin{TemplatesOneCol} popen(+atom, +io\_mode, -stream) \end{TemplatesOneCol} \Description \texttt{popen(Command, Mode, Stream)} invokes a new default shell (by creating a pipe) passing \texttt{Command} for execution and associates a stream either to the standard input or the standard output of the created process. if \texttt{Mode} is \texttt{read} (resp. \texttt{write}) an input (resp. output) stream is created and \texttt{Stream} is unified with the stream-term associated. Writing to the stream writes to the standard input of the command while reading from the stream reads the command's standard output. The stream must be closed using \IdxPB{close/2} \RefSP{close/2}. This predicate is an interface to the C Unix function \texttt{popen(3)}. \begin{PlErrors} \ErrCond{\texttt{Command} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Command} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Command)} \ErrCond{\texttt{Mode} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Mode} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Mode)} \ErrCond{\texttt{Mode} is an atom but neither \texttt{read} nor \texttt{write}.} \ErrTerm{domain\_error(io\_mode, Mode)} \ErrCond{\texttt{Stream} is not a variable} \ErrTerm{type\_error(variable, Stream)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{exec/5}, \texttt{exec/4}} \AddPBD{exec/5} \AddPBD{exec/4} \begin{TemplatesOneCol} exec(+atom, -stream, -stream, -stream, -integer)\\ exec(+atom, -stream, -stream, -stream) \end{TemplatesOneCol} \Description \texttt{exec(Command, StreamIn, StreamOut, StreamErr, Pid)} invokes a new default shell passing \texttt{Command} for execution and associates streams to standard streams of the created process. \texttt{StreamIn} is unified with the stream-term associated with the standard input stream of \texttt{Command} (it is an output stream). \texttt{StreamOut} is unified with the stream-term associated with the standard output stream of \texttt{Command} (it is an input stream). \texttt{StreamErr} is unified with the stream-term associated with the standard error stream of \texttt{Command} (it is an input stream). \texttt{Pid} is unified with the process identifier of the new process. This information is only useful if it is necessary to obtain the status of the execution using \texttt{wait/2} \RefSP{wait/2}. Until a call to \texttt{wait/2} is done the process remains in the system processes table (as a zombie process if terminated). For this reason, if the status is not needed it is preferable to use \texttt{exec/4}. \texttt{exec/4} is similar to \texttt{exec/5} but the process is removed from system processes as soon as it is terminated. \begin{PlErrors} \ErrCond{\texttt{Command} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Command} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Command)} \ErrCond{\texttt{StreamIn} is not a variable} \ErrTerm{type\_error(variable, StreamIn)} \ErrCond{\texttt{StreamOut} is not a variable} \ErrTerm{type\_error(variable, StreamOut)} \ErrCond{\texttt{StreamErr} is not a variable} \ErrTerm{type\_error(variable, StreamErr)} \ErrCond{\texttt{Pid} is not a variable} \ErrTerm{type\_error(variable, Pid)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{fork\_prolog/1}} \AddPBD{fork\_prolog/1} \begin{TemplatesOneCol} fork\_prolog(-integer) \end{TemplatesOneCol} \Description \texttt{fork\_prolog(Pid)} creates a child process that differs from the parent process only in its PID. In the parent process \texttt{Pid} is unified with the PID of the child while in the child process \texttt{Pid} is unified with 0. In the parent process, the status of the child process can be ontained using \texttt{wait/2} \RefSP{wait/2}. Until a call to \texttt{wait/2} is done the child process remains in the system processes table (as a zombie process if terminated). This predicate is an interface to the C Unix function \texttt{fork(2)}. \begin{PlErrors} \ErrCond{\texttt{Pid} is not a variable} \ErrTerm{type\_error(variable, Pid)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{create\_pipe/2}} \AddPBD{create\_pipe/2} \begin{TemplatesOneCol} create\_pipe(-stream, -stream) \end{TemplatesOneCol} \Description \texttt{create\_pipe(StreamIn, StreamOut)} creates a pair of streams pointing to a pipe inode. \texttt{StreamIn} is unified with the stream-term associated with the input side of the pipe and \texttt{StreamOut} is unified with the stream-term associated with output side. This predicate is an interface to the C Unix function \texttt{pipe(2)}. \begin{PlErrors} \ErrCond{\texttt{StreamIn} is not a variable} \ErrTerm{type\_error(variable, StreamIn)} \ErrCond{\texttt{StreamOut} is not a variable} \ErrTerm{type\_error(variable, StreamOut)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{wait/2}} \label{wait/2} \AddPBD{wait/2} \begin{TemplatesOneCol} wait(+integer, ?integer) \end{TemplatesOneCol} \Description \texttt{wait(Pid, Status)} waits for the child process whose identifier is \texttt{Pid} to terminate. \texttt{Status} is then unified with the exit status. This predicate is an interface to the C Unix function \texttt{waitpid(2)}. \begin{PlErrors} \ErrCond{\texttt{Pid} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Pid} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Pid)} \ErrCond{\texttt{Status} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Status)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{prolog\_pid/1}} \AddPBD{prolog\_pid/1} \begin{TemplatesOneCol} prolog\_pid(?integer) \end{TemplatesOneCol} \Description \texttt{prolog\_pid(Pid)} unifies \texttt{Pid} with the process identifier of the current GNU Prolog process. \begin{PlErrors} \ErrCond{\texttt{Pid} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Pid)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{send\_signal/2}} \AddPBD{send\_signal/2} \begin{TemplatesOneCol} send\_signal(+integer, +integer)\\ send\_signal(+integer, +atom) \end{TemplatesOneCol} \Description \texttt{send\_signal(Pid, Signal)} sends \texttt{Signal} to the process whose identifier is \texttt{Pid.} \texttt{Signal} can be specified directly as an integer or symbolically as an atom. Allowed atoms depend on the machine (e.g. \texttt{'SIGINT'}, \texttt{'SIGQUIT'}, \texttt{'SIGKILL'}, \texttt{'SIGUSR1'}, \texttt{'SIGUSR2'}, \texttt{'SIGALRM'},\ldots). This predicate is an interface to the C Unix function \texttt{kill(2)}. \begin{PlErrors} \ErrCond{\texttt{Pid} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Pid} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Pid)} \ErrCond{\texttt{Signal} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Signal} is neither a variable nor an integer or an atom} \ErrTerm{type\_error(integer, Signal)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{sleep/1}} \AddPBD{sleep/1} \begin{TemplatesOneCol} sleep(+number) \end{TemplatesOneCol} \Description \texttt{sleep(Seconds)} puts the GNU Prolog process to sleep for \texttt{Second}s seconds. \texttt{Seconds} can be an integer or a floating point number (in which case it can be $<$ 1). This predicate is an interface to the C Unix function \texttt{usleep(3)}. \begin{PlErrors} \ErrCond{\texttt{Seconds} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Seconds} is neither a variable nor a number} \ErrTerm{type\_error(number, Seconds)} \ErrCond{\texttt{Seconds} is a number $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, Seconds)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{select/5}} \label{select/5} \AddPBD{select/5} \begin{TemplatesOneCol} select(+list, ?list, +list, ?list, +number) \end{TemplatesOneCol} \Description \texttt{select(Reads, ReadyReads, Writes, ReadyWrites, TimeOut)} waits for a number of streams (or file descriptors) to change status. \texttt{ReadyReads} is unified with the list of elements listed in \texttt{Reads} that have characters available for reading. Similarly \texttt{ReadyWrites} is unified with the list of elements of \texttt{Writes} that are ok for immediate writing. The elements of \texttt{Reads} and \texttt{Writes} are either stream-terms or aliases or integers considered as file descriptors, e.g. for sockets \RefSP{Sockets-input/output}. Streams that must be tested with \texttt{select/5} should not be buffered. This can be done at the opening using \IdxPB{open/4} \RefSP{open/4} or later using \IdxPB{set\_stream\_buffering/2} \RefSP{set-stream-buffering/2}. \texttt{TimeOut} is an upper bound on the amount of time (in milliseconds) elapsed before \texttt{select/5} returns. If \texttt{TimeOut} $\leq$ 0 (no timeout) \texttt{select/5} waits until something is available (either or reading or for writing) and thus can block indefinitely. This predicate is an interface to the C Unix function \texttt{select(2)}. \begin{PlErrors} \ErrCond{\texttt{Reads} (or \texttt{Writes}) is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Reads} is neither a partial list nor a list} \ErrTerm{type\_error(list, Reads)} \ErrCond{\texttt{Writes} is neither a partial list nor a list} \ErrTerm{type\_error(list, Writes)} \ErrCond{\texttt{ReadyReads} is neither a partial list nor a list} \ErrTerm{type\_error(list, ReadyReads)} \ErrCond{\texttt{ReadyWrites} is neither a partial list nor a list} \ErrTerm{type\_error(list, ReadyWrites)} \ErrCond{an element \texttt{E} of the \texttt{Reads} (or \texttt{Writes}) list is neither a stream-term or alias nor an integer} \ErrTerm{domain\_error(stream\_or\_alias, E)} \ErrCond{an element \texttt{E} of the \texttt{Reads} (or \texttt{Writes}) list is not a selectable item} \ErrTerm{domain\_error(selectable\_item, E)} \ErrCond{an element \texttt{E} of the \texttt{Reads} (or \texttt{Writes}) list is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, E)} \ErrCond{an element \texttt{E} of the \texttt{Reads} (or \texttt{Writes}) list is a stream-tern or alias not associated with an open stream} \ErrTerm{existence\_error(stream, E)} \ErrCond{an element \texttt{E} of the \texttt{Reads} list is associated with an output stream} \ErrTerm{permission\_error(input, stream, E)} \ErrCond{an element \texttt{E} of the \texttt{Writes} list is associated with an input stream} \ErrTerm{permission\_error(output, stream, E)} \ErrCond{\texttt{TimeOut} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{TimeOut} is neither a variable nor a number} \ErrTerm{type\_error(number, TimeOut)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{Sockets input/output} \label{Sockets-input/output} \subsubsection{Introduction} \label{Introduction:(Sockets-input/output)} This set of predicates provides a way to manipulate sockets. The predicates are straightforward interfaces to the corresponding BSD-type socket functions. This facility is available if the sockets part of GNU Prolog has been installed. A reader familiar with BSD sockets will understand them immediately otherwise a study of sockets is needed. The domain is either the atom \texttt{'AF\_INET'} or \texttt{'AF\_UNIX'} corresponding to the same domains in BSD-type sockets. An address is either of the form \texttt{'AF\_INET'(HostName, Port)} or \texttt{'AF\_UNIX'(SocketName)}. \texttt{HostName} is an atom denoting a machine name, \texttt{Port} is a port number and \texttt{SocketName} is an atom denoting a socket. By default, streams associated with sockets are \texttt{block} buffered. The predicate \IdxPB{set\_stream\_buffering/2} \RefSP{set-stream-buffering/2} can be used to change this mode. They are also text streams by default. Use \IdxPB{set\_stream\_type/2} \RefSP{set-stream-type/2} to change the type if binary streams are needed. \subsubsection{\texttt{socket/2}} \AddPBD{socket/2} \begin{TemplatesOneCol} socket(+socket\_domain, -integer) \end{TemplatesOneCol} \Description \texttt{socket(Domain, Socket)} creates a socket whose domain is \texttt{Domain} \RefSP{Sockets-input/output} and unifies \texttt{Socket} with the descriptor identifying the socket. This predicate is an interface to the C Unix function \texttt{socket(2)}. \begin{PlErrors} \ErrCond{\texttt{Domain} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Domain} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Domain)} \ErrCond{\texttt{Domain} is an atom but not a valid socket domain} \ErrTerm{domain\_error(socket\_domain, Domain)} \ErrCond{\texttt{Socket} is not a variable} \ErrTerm{type\_error(variable, Socket)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{socket\_close/1}} \AddPBD{socket\_close/1} \begin{TemplatesOneCol} socket\_close(+integer) \end{TemplatesOneCol} \Description \texttt{socket\_close(Socket)} closes the socket whose descriptor is \texttt{Socket}. This predicate should not be used if \texttt{Socket} has given rise to a stream, e.g. by \IdxPB{socket\_connect/4} \RefSP{socket-connect/4}. In that case simply use \IdxPB{close/2} \RefSP{close/2} on the associated stream. \begin{PlErrors} \ErrCond{\texttt{Socket} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Socket} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Socket)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{socket\_bind/2}} \AddPBD{socket\_bind/2} \begin{TemplatesOneCol} socket\_bind(+integer, +socket\_address) \end{TemplatesOneCol} \Description \texttt{socket\_bind(Socket, Address)} binds the socket whose descriptor is \texttt{Socket} to the address specified by \texttt{Address} \RefSP{Sockets-input/output}. If \texttt{Address} if of the form \texttt{'AF\_INET'(HostName, Port)} and if \texttt{HostName} is uninstantiated then it is unified with the current machine name. If \texttt{Port} is uninstantiated, it is unified to a port number picked by the operating system. This predicate is an interface to the C Unix function \texttt{bind(2)}. \begin{PlErrors} \ErrCond{\texttt{Socket} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Socket} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Socket)} \ErrCond{\texttt{Address} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Address} is neither a variable nor a valid address} \ErrTerm{domain\_error(socket\_address, Address)} \ErrCond{\texttt{Address} = \texttt{'AF\_UNIX'(E)} and \texttt{E} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Address} = \texttt{'AF\_UNIX'(E)} or \texttt{'AF\_INET'(E, \_)} and \texttt{E} is neither a variable nor an atom} \ErrTerm{type\_error(atom, E)} \ErrCond{\texttt{Address} = \texttt{'AF\_UNIX'(E)} and \texttt{E} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, E)} \ErrCond{\texttt{Address} = \texttt{'AF\_INET'(\_, E)} and \texttt{E} is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{socket\_connect/4}} \label{socket-connect/4} \AddPBD{socket\_connect/4} \begin{TemplatesOneCol} socket\_connect(+integer, +socket\_address, -stream, -stream) \end{TemplatesOneCol} \Description \texttt{socket\_connect(Socket, Address, StreamIn, StreamOut)} connects the socket whose descriptor is \texttt{Socket} to the address specified by \texttt{Address} \RefSP{Sockets-input/output}. \texttt{StreamIn} is unified with a stream-term associated with the input of the connection (it is an input stream). Reading from this stream gets data from the socket. \texttt{StreamOut} is unified with a stream-term associated with the output of the connection (it is an output stream). Writing to this stream sends data to the socket. The use of \IdxPB{select/5} can be useful \RefSP{select/5}. This predicate is an interface to the C Unix function \texttt{connect(2)}. \begin{PlErrors} \ErrCond{\texttt{Socket} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Socket} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Socket)} \ErrCond{\texttt{Address} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Address} is neither a variable nor a valid address} \ErrTerm{domain\_error(socket\_address, Address)} \ErrCond{\texttt{Address} = \texttt{'AF\_UNIX'(E)} or \texttt{'AF\_INET'(E, \_)} or \texttt{Address} = \texttt{'AF\_INET'(\_, E)} and \texttt{E} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Address} = \texttt{'AF\_UNIX'(E)} or \texttt{'AF\_INET'(E, \_)} and \texttt{E} is neither a variable nor an atom} \ErrTerm{type\_error(atom, E)} \ErrCond{\texttt{Address} = \texttt{'AF\_UNIX'(E)} and \texttt{E} is an atom but not a valid pathname} \ErrTerm{domain\_error(os\_path, E)} \ErrCond{\texttt{Address} = \texttt{'AF\_INET'(\_, E)} and \texttt{E} is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \ErrCond{\texttt{StreamIn} is not a variable} \ErrTerm{type\_error(variable, StreamIn)} \ErrCond{\texttt{StreamOut} is not a variable} \ErrTerm{type\_error(variable, StreamOut)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{socket\_listen/2}} \AddPBD{socket\_listen/2} \begin{TemplatesOneCol} socket\_listen(+integer, +integer) \end{TemplatesOneCol} \Description \texttt{socket\_listen(Socket, Length)} defines the socket whose descriptor is \texttt{Socket} to have a maximum backlog queue of \texttt{Length} pending connections. This predicate is an interface to the C Unix function \texttt{listen(2)}. \begin{PlErrors} \ErrCond{\texttt{Socket} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Socket} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Socket)} \ErrCond{\texttt{Length} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Length} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Length)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{socket\_accept/4}, \texttt{socket\_accept/3}} \AddPBD{socket\_accept/4} \AddPBD{socket\_accept/3} \begin{TemplatesOneCol} socket\_accept(+integer, -atom, -stream, -stream)\\ socket\_accept(+integer, -stream, -stream) \end{TemplatesOneCol} \Description \texttt{socket\_accept(Socket, Client, StreamIn, StreamOut)} extracts the first connection to the socket whose descriptor is \texttt{Socket}. If the domain is \texttt{'AF\_INET'}, \texttt{Client} is unified with an atom whose name is the Internet host address in numbers-and-dots notation of the connecting machine. \texttt{StreamIn} is unified with a stream-term associated with the input of the connection (it is an input stream). Reading from this stream gets data from the socket. \texttt{StreamOut} is unified with a stream-term associated with the output of the connection (it is an output stream). Writing to this stream sends data to the socket. The use of \IdxPB{select/5} can be useful \RefSP{select/5}. This predicate is an interface to the C Unix function \texttt{accept(2)}. \texttt{socket\_accept(Socket, StreamIn, StreamOut)} is equivalent to \texttt{socket\_accept(Socket, \_,\\ StreamIn, StreamOut)}. \begin{PlErrors} \ErrCond{\texttt{Socket} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Socket} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Socket)} \ErrCond{\texttt{Client} is not a variable} \ErrTerm{type\_error(variable, Client)} \ErrCond{\texttt{StreamIn} is not a variable} \ErrTerm{type\_error(variable, StreamIn)} \ErrCond{\texttt{StreamOut} is not a variable} \ErrTerm{type\_error(variable, StreamOut)} \ErrCond{an operating system error occurs and the value of the \texttt{os\_error} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{system\_error(\textit{atom explaining the error})} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{hostname\_address/2}} \AddPBD{hostname\_address/2} \begin{TemplatesOneCol} hostname\_address(+atom, ?atom)\\ hostname\_address(?atom, +atom) \end{TemplatesOneCol} \Description \texttt{hostname\_address(HostName, HostAddress)} succeeds if the Internet host address in numbers-and-dots notation of \texttt{HostName} is \texttt{HostAddress}. \texttt{Hostname} can be given as a fully qualified name, or an unqualified name or an alias of the machine. The predicate will fail if the machine name or address cannot be resolved. \begin{PlErrors} \ErrCond{\texttt{HostName} and \texttt{HostAddress} are variables} \ErrTerm{instantiation\_error} \ErrCond{\texttt{HostName} is neither a variable nor an atom} \ErrTerm{type\_error(atom, HostName)} \ErrCond{\texttt{HostAddress} is neither a variable nor an atom} \ErrTerm{type\_error(atom, HostAddress)} \ErrCond{\texttt{Address} is neither a variable nor a valid address} \ErrTerm{domain\_error(socket\_address, Address)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{Linedit management} The following predicates are only available if the \IdxK{linedit} part of GNU Prolog has been installed. \subsubsection{\texttt{get\_linedit\_prompt/1}} \AddPBD{get\_linedit\_prompt/1} \begin{TemplatesOneCol} get\_linedit\_prompt(?atom) \end{TemplatesOneCol} \Description \texttt{get\_linedit\_prompt(Prompt)} succeeds if \texttt{Prompt} is the current \IdxK{linedit} prompt, e.g. the \Idx{top-level} prompt is \texttt{'| ?-'}. By default all other reads have an empty prompt. \begin{PlErrors} \ErrCond{\texttt{Prompt} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Pred)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{set\_linedit\_prompt/1}} \AddPBD{set\_linedit\_prompt/1} \begin{TemplatesOneCol} set\_linedit\_prompt(+atom) \end{TemplatesOneCol} \Description \texttt{set\_linedit\_prompt(Prompt)} sets the current \IdxK{linedit} prompt to \texttt{Prompt}. This prompt will be displayed for reads from a terminal (except for \Idx{top-level} reads). \begin{PlErrors} \ErrCond{\texttt{Prompt} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Prompt} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Pred)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{add\_linedit\_completion/1}} \AddPBD{add\_linedit\_completion/1} \begin{TemplatesOneCol} add\_linedit\_completion(+atom) \end{TemplatesOneCol} \Description \texttt{add\_linedit\_completion(Word)} adds \texttt{Word} in the list of \Idx{completion} words maintained by \IdxK{linedit} \RefSP{The-line-editor}. Only words containing letters, digits and the underscore character are added (if \texttt{Word} does not respect this restriction the predicate fails). \begin{PlErrors} \ErrCond{\texttt{Word} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Word} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Word)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{find\_linedit\_completion/2}} \AddPBD{find\_linedit\_completion/2} \begin{TemplatesOneCol} find\_linedit\_completion(+atom, ?atom) \end{TemplatesOneCol} \Description \texttt{find\_linedit\_completion(Prefix, Word)} succeeds if \texttt{Word} is a word beginning by \texttt{Prefix} and belongs to the list of \Idx{completion} words maintained by \IdxK{linedit} \RefSP{The-line-editor}. This predicate is re-executable on backtracking. \begin{PlErrors} \ErrCond{\texttt{Prefix} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Prefix} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Prefix)} \ErrCond{\texttt{Word} is neither a variable nor an atom} \ErrTerm{type\_error(atom, Word)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{Source reader facility} \subsubsection{Introduction} To be written... \subsubsection{\texttt{sr\_open/3}} \AddPBD{sr\_open/3} \subsubsection{\texttt{sr\_change\_options/2}} \AddPBD{sr\_change\_options/2} \subsubsection{\texttt{sr\_close/1}} \AddPBD{sr\_close/1} \subsubsection{\texttt{sr\_read\_term/4}} \AddPBD{sr\_read\_term/4} \subsubsection{\texttt{sr\_current\_descriptor/1}} \AddPBD{sr\_current\_descriptor/1} \subsubsection{\texttt{sr\_get\_stream/2}} \AddPBD{sr\_get\_stream/2} \subsubsection{\texttt{sr\_get\_module/3}} \AddPBD{sr\_get\_module/3} \subsubsection{\texttt{sr\_get\_file\_name/2}} \AddPBD{sr\_get\_file\_name/2} \subsubsection{\texttt{sr\_get\_position/3}} \AddPBD{sr\_get\_position/3} \subsubsection{\texttt{sr\_get\_include\_list/2}} \AddPBD{sr\_get\_include\_list/2} \subsubsection{\texttt{sr\_get\_include\_stream\_list/2}} \AddPBD{sr\_get\_include\_stream\_list/2} \subsubsection{\texttt{sr\_get\_size\_counters/3}} \AddPBD{sr\_get\_size\_counters/3} \subsubsection{\texttt{sr\_get\_error\_counters/3}} \AddPBD{sr\_get\_error\_counters/3} \subsubsection{\texttt{sr\_set\_error\_counters/3}} \AddPBD{sr\_set\_error\_counters/3} \subsubsection{\texttt{sr\_error\_from\_exception/2}} \AddPBD{sr\_error\_from\_exception/2} \subsubsection{\texttt{sr\_write\_message/8}, \texttt{sr\_write\_message/6}, \texttt{sr\_write\_message/4}} \AddPBD{sr\_write\_message/8} \AddPBD{sr\_write\_message/6} \AddPBD{sr\_write\_message/4} \subsubsection{\texttt{sr\_write\_error/6}, \texttt{sr\_write\_error/4}, \texttt{sr\_write\_error/2}} \AddPBD{sr\_write\_error/6} \AddPBD{sr\_write\_error/4} \AddPBD{sr\_write\_error/2} %HEVEA\cutend ./gprolog-1.3.0/doc/do_latex0000755004425400513100000000434007616171010014263 0ustar diazloco#!/bin/sh # Daniel Diaz # LaTeX and PDF LaTeX compiler invocator # also executes makeindex and bibtex if needed # version 1.0 # Fri Jan 24 16:33:11 CET 2003 usage () { echo 'do_latex [OPTIONS] FILE' echo echo 'Options:' echo ' -dvi create a DVI file' echo ' -pdf create a PDF file' echo ' -silent redirect (pdf)latex output to /dev/null' echo ' -trace trace mode' echo ' -h this help' exit 0 } trace_msg () { test $trace = 1 && echo "$file: $*" } differ () { if diff $1 $2 >/dev/null 2>&1 then false else true fi } restore () { f=$1.$2 fp=$1.$type.$2 if test -f $fp; then trace_msg "restoring: copying $fp to $f" cp -a $fp $f fi } save () { f=$1.$2 fp=$1.$type.$2 if test ! -f $f; then return fi if test ! -f $fp || `differ $f $fp`; then trace_msg "files $f and $fp differ - redo" redo=1 fi trace_msg "files $f and $fp are identical - moving $f to $fp" mv $f $fp } one_cmd () { trace_msg "executing $1 $redir" outfile=$base.$type outfileerr=$base.err.$type eval $1 $redir err=$? if test $err = 0; then trace_msg "removing $outfileerr" rm -f $outfileerr else trace_msg "compilation error (status=$err)" if test -f $outfile; then trace_msg "moving partial resulting file $outfile to $outfileerr" mv $outfile $outfileerr fi exit $err fi } compile () { base=`dirname $file`/`basename $file .tex` for s in $suffixes; do restore $base $s done one_cmd "$compiler $file" if test -f $base.idx; then one_cmd "makeindex $base.idx" fi redo=0 if fgrep -q '\bibdata{' $base.aux; then one_cmd "bibtex $base" fi for s in $suffixes; do save $base $s done } suffixes='aux toc idx ind bbl' type=dvi compiler=latex redi='' trace=0 file_list='' while test $# -gt 0 ; do case $1 in -dvi) type=dvi; compiler=latex;; -pdf) type=pdf; compiler=pdflatex;; -silent) redir=">/dev/null";; -trace) trace=1;; -h|-help) usage;; -*) echo "unrecognized option $1 - use -f for help"; exit 1;; *) file_list="$file_list $1";; esac shift done for file in $file_list; do redo=1 while test $redo = 1; do compile done done exit 0 ./gprolog-1.3.0/doc/use.tex0000644004425400513100000014375510547152502014074 0ustar diazloco\newpage \section{Using GNU Prolog} %HEVEA\cutdef[1]{subsection} \subsection{Introduction} \label{Introduction:(Using-GNU-Prolog)} GNU Prolog offers two ways to execute a Prolog program: \begin{itemize} \item interpreting it using the GNU Prolog interactive interpreter. \item compiling it to a (machine-dependent) executable using the GNU Prolog native-code compiler. \end{itemize} Running a program under the interactive interpreter allows the user to list it and to make full use of the debugger on it \RefSP{Debugging}. Compiling a program to native code makes it possible to obtain a stand alone executable, with a reduced size and optimized for speed. Running a Prolog program compiled to native-code is around 3-5 times faster than running it under the interpreter. However, it is not possible to make full use of the debugger on a program compiled to native-code. Nor is it possible to list the program. In general, it is preferable to run a program under the interpreter for debugging and then use the native-code compiler to produce an autonomous executable. It is also possible to combine these two modes by producing an executable that contains some parts of the program (e.g. already debugged predicates whose execution-time speed is crucial) and interpreting the other parts under this executable. In that case, the executable has the same facilities as the GNU Prolog interpreter but also integrates the native-code predicates. This way to define a new enriched interpreter is detailed later \RefSP{Generating-a-new-interactive-interpreter}. \subsection{The GNU Prolog interactive interpreter} \label{The-GNU-Prolog-interactive-interpreter} \subsubsection{Starting/exiting the interactive interpreter} \index{interpreter|see {top-level}} GNU Prolog offers a classical Prolog interactive interpreter also called \emph{top-level}. It allows the user to execute queries, to consult Prolog programs, to list them, to execute them and to debug them. The \IdxD{top-level} can be invoked using the following command: \OneLineTwoCols[5.5cm]{\% gprolog \textrm{[}\Param{OPTION}\textrm{]\ldots}}{(the \texttt{\%} symbol is the operating system shell prompt)} \SPart{Options}: \begin{CmdOptions} \IdxKD{--init-goal} \Param{GOAL} & execute \Param{GOAL} before top\_level/0 \\ \IdxKD{--entry-goal} \Param{GOAL} & execute \Param{GOAL} inside top\_level/0 \\ \IdxKD{--query-goal} \Param{GOAL} & execute \Param{GOAL} as a query for top\_level/0 \\ \IdxKD{--help} & print a help and exit \\ \IdxKD{--version} & print version number and exit \\ \IdxKD{--} & do not parse the rest of the command-line \\ \end{CmdOptions} The main role of the \texttt{gprolog} command is to execute the top-level itself, i.e. to execute the built-in predicate \IdxPB{top\_level/0} \RefSP{abort/0} which will produce something like: \begin{Code} \begin{verbatim} GNU Prolog 1.2.9 By Daniel Diaz Copyright (C) 1999-2007 Daniel Diaz | ?- \end{verbatim} \end{Code} The top-level is ready to execute your queries as explained in the next section. To quit the top-level type the end-of-file key sequence (\texttt{Ctl-D}) or its term representation: \texttt{end\_of\_file.} It is also possible to use the built-in predicate \IdxPB{halt/0} \RefSP{abort/0}. However, before entering the top-level itself, the command-line is processed to treat all known options (those listed above). All unrecognized arguments are collected together to form the argument list which will be available using \IdxPB{argument\_value/2} \RefSP{argument-value/2} or \IdxPB{argument\_list/1} \RefSP{argument-list/1}. The \texttt{--} option stops the parsing of the command-line, all remainding options are collected into the argument list. Several options are provided to execute a goal before entering the interaction with the user: \begin{itemize} \item The \texttt{--init-goal} option executes the \Param{GOAL} as soon as it is encountered (while the commnad-line is processed). \Param{GOAL} is thus executed before entering \texttt{top\_level/0}. \item The \texttt{--entry-goal} option executes the \Param{GOAL} at the entry of \texttt{top\_level/0} just after the banner is displayed. \item The \texttt{--query-goal} option executes the \Param{GOAL} as if the user has typed in. \end{itemize} The above order is thus the order in which each kind of goal (init, entry, query) is executed. If there are several goals of a same kind they are executed in the oder of appearance. Thus, all init goals are executed (in the order of appearance) before all entry goals and all entry goals are executed before all query goals. Each \Param{GOAL} is passed as a shell argument (i.e. one shell string) and should not contain a terminal dot. Example: \texttt{--init-goal 'write(hello), nl'} under a sh-like. To be executed, a \Param{GOAL} is transformed into a term using \IdxPB[read\_term\_from\_atom/3] {read\_term\_from\_atom(Goal, Term, [end\_of\_term(eof)])}. Respecting both the syntax of shell strings and of Prolog can be heavy. For instance, passing a backslash character \texttt{{\bs}} can be difficult since it introduces an \Idx{escape sequence} both in sh and inside Prolog quoted atoms. The use of back quotes can then be useful since, by default, no escape sequence is processed inside back quotes (this behavior can be controlled using the \IdxPF{back\_quotes} \Idx{Prolog flag} \RefSP{set-prolog-flag/2}). Since the Prolog argument list is created when the whole command-line is parsed, if a \texttt{--init-goal} option uses \texttt{argument\_value/2} or \texttt{argument\_list/1} it will obtained the original command-line arguments (i.e. including all recognized arguments). Here is an example of using execution goal options: \begin{Code} \% gprolog --init-goal 'write(before), nl' --entry-goal 'write(inside), nl'\\ --query-goal 'append([a,b],[c,d],X)' \end{Code} will produce the following: \begin{Code} \begin{verbatim} before GNU Prolog 1.2.9 By Daniel Diaz Copyright (C) 1999-2007 Daniel Diaz inside | ?- append([a,b],[c,d],X). X = [a,b,c,d] yes | ?- \end{verbatim} \end{Code} \subsubsection{The interactive interpreter read-execute-write loop} The GNU Prolog top-level is built on a classical read-execute-write loop that also allows for re-executions (when the query is not deterministic) as follows: \begin{itemize} \item display the prompt, i.e. '\texttt{| ?-}'. \item read a query (i.e. a goal). \item execute the query. \item in case of success display the values of the variables of the query. \item if there are remaining alternatives (i.e. the query is not deterministic), display a \texttt{?} and ask the user who can use one of the following commands: \texttt{RETURN} to stop the execution, \texttt{;} to compute the next solution or \texttt{a} to compute all remaining solution. \end{itemize} Here is an example of execution of a query (``find the lists \texttt{X} and \texttt{Y} such that the concatenation of \texttt{X} and \texttt{Y} is \texttt{[a,b]}''): \begin{CodeTwoCols} \One{| ?- append(X,Y,[a,b,c]).} \SkipLine \One{X = []} \Two{Y = [a,b,c] ? ;}{(here the user presses \texttt{;} to compute another solution)} \SkipLine \One{X = [a]} \Two{Y = [b,c] ? a}{(here the user presses \texttt{a} to compute all remaining solutions)} \SkipLine \One{X = [a,b]} \Two{Y = [c]} {(here the user is not asked and the next solution is computed)} \SkipLine \One{X = [a,b,c]} \Two{Y = []} {(here the user is not asked and the next solution is computed)} \SkipLine \Two{no}{(no more solution)} \end{CodeTwoCols} In some cases the top-level can detect that the current solution is the last one (no more alternatives remaining). In such a case it does not display the \texttt{?} symbol (and does not ask the user). Example: \begin{CodeTwoCols} \One{| ?- (X=1 ; X=2).} \SkipLine \Two{X = 1 ? ;}{(here the user presses \texttt{;} to compute another solution)} \SkipLine \Two{X = 2} {(here the user is not prompted since there are no more alternatives)} \SkipLine \One{yes} \end{CodeTwoCols} The user can stop the execution even if there are more alternatives by typing \texttt{RETURN}. \begin{CodeTwoCols} \One{| ?- (X=1 ; X=2).} \SkipLine \Two{X = 1 ?} {(here the user presses \texttt{RETURN} to stop the execution)} \SkipLine \One{yes} \end{CodeTwoCols} The top-level tries to display the values of the variables of the query in a readable manner. For instance, when a variable is bound to a query variable, the name of this variable appears. When a variable is a singleton an underscore symbol \texttt{\_} is displayed (\texttt{\_} is a generic name for a singleton variable, it is also called an anonymous variable). Other variables are bound to new brand variable names. When a query variable name \texttt{X} appears as the value of another query variable \texttt{Y} it is because \texttt{X} is itself not instantiated otherwise the value of \texttt{X} is displayed. In such a case, nothing is output for \texttt{X} itself (since it is a variable). Example: \begin{CodeTwoCols} \One{| ?- X=f(A,B,\_,A), A=k.} \SkipLine \Two{A = k} {(the value of \texttt{A} is displayed also in \texttt{f/3} for \texttt{X})} \Two{X = f(k,B,\_,k)} {(since \texttt{B} is a variable which is also a part of \texttt{X}, \texttt{B} is not displayed)} \end{CodeTwoCols} \begin{CodeTwoCols} \One{| ?- functor(T,f,3), arg(1,T,X), arg(3,T,X).} \SkipLine \Two{T = f(X,\_,X)} {(the 1$^{st}$ and 3$^{rd}$ args are equal to \texttt{X}, the 2$^{nd}$ is an anonymous variable)} \end{CodeTwoCols} \begin{CodeTwoCols} \One{| ?- read\_from\_atom('k(X,Y,X).',T).} \SkipLine \Two{T = k(A,\_,A)} {(the 1$^{st}$ and 3$^{rd}$ args are unified, a new variable name \texttt{A} is introduced)} \end{CodeTwoCols} The top-level uses variable binding predicates \RefSP{Variable-naming/numbering}. To display the value of a variable, the top-level calls \IdxPB{write\_term/3} with the following option list: \texttt{[\IdxPO[quoted]{quoted(true)},\IdxPO[numbervars]{numbervars(false)}, \IdxPO[namevars]{namevars(true)}]} \RefSP{write-term/3}. A term of the form \texttt{'\$VARNAME'(Name)} where \texttt{Name} is an atom is displayed as a variable name while a term of the form \texttt{'\$VAR'(N)} where \texttt{N} is an integer is displayed as a normal compound term (such a term could be output as a variable name by \texttt{write\_term/3}). Example: \begin{CodeTwoCols} \One{| ?- X='\$VARNAME'('Y'), Y='\$VAR'(1).} \SkipLine \Two{X = Y} {(the term \texttt{'\$VARNAME'('Y')} is displayed as \texttt{Y})} \Two{Y = '\$VAR'(1)} {(the term \texttt{'\$VAR'(1)} is displayed as is)} \end{CodeTwoCols} \begin{CodeTwoCols} \One{| ?- X=Y, Y='\$VAR'(1).} \SkipLine \One{X = '\$VAR'(1)} \One{Y = '\$VAR'(1)} \end{CodeTwoCols} In the first example, \texttt{X} is explicitly bound to \texttt{'\$VARNAME'('Y')} by the query so the top-level displays \texttt{Y} as the value of \texttt{X}. \texttt{Y} is unified with \texttt{'\$VAR'(1)} so the top-level displays it as a normal compound term. It should be clear that \texttt{X} is not bound to \texttt{Y} (whereas it is in the second query). This behavior should be kept in mind when doing variable binding operations. Finally, the top-level computes the user-time \RefSP{user-time/1} taken by a query and displays it when it is significant. Example: \begin{CodeTwoCols} \One{| ?- retractall(p(\_)), assertz(p(0)),} \One{~~~~~repeat,} \One{~~~~~~~~retract(p(X)),} \One{~~~~~~~~Y is X + 1,} \One{~~~~~~~~assertz(p(Y)),} \One{~~~~~~~~X = 1000, !.} \SkipLine \One{X = 1000} \One{Y = 1001} \SkipLine \Two{(180 ms) yes}{(the query took 180ms of user time)} \end{CodeTwoCols} \subsubsection{Consulting a Prolog program} \label{Consulting-a-Prolog-program} The top-level allows the user to consult Prolog source files. Consulted predicates can be listed, executed and debugged (while predicates compiled to native-code cannot). For more information about the difference between a native-code predicate and a consulted predicate refer to the introduction of this section \RefSP{Introduction:(Using-GNU-Prolog)} and to the part devoted to the compiler \RefSP{Different-kinds-of-codes}. To consult a program use the built-in predicate \IdxPB{consult/1} \RefSP{consult/1}. The argument of this predicate is a Prolog file name or \texttt{user} to specify the terminal. This allows the user to directly input the predicates from the terminal. In that case the input shall be terminated by the end-of-file key sequence (\texttt{Ctl-D}) or its term representation: \texttt{end\_of\_file.} A shorthand for \texttt{consult(}\Param{FILE}\texttt{)} is \texttt{[}\Param{FILE}\texttt{]}. Example: \begin{CodeTwoCols} \One{| ?- [user].} \One{{\lb}compiling user for byte code...{\rb}} \One{even(0).} \One{even(s(s(X))):-} \One{~~~~~~~~even(X).} \Two{}{(here the user presses \texttt{Ctl-D} to end the input)} \One{{\lb}user compiled, 3 lines read - 350 bytes written, 1180 ms{\rb}} \SkipLine \One{| ?- even(X).} \SkipLine \Two{X = 0 ? ;}{(here the user presses \texttt{;} to compute another solution)} \SkipLine \Two{X = s(s(0)) ? ;}{(here the user presses \texttt{;} to compute another solution)} \SkipLine \Two{X = s(s(s(s(0)))) ?}{(here the user presses \texttt{RETURN} to stop the execution)} \SkipLine \One{yes} \One{| ?- listing.} \SkipLine \One{even(0).} \One{even(s(s(A))) :-} \One{~~~~~~~~even(A).} \end{CodeTwoCols} When \IdxPB{consult/1} \RefSP{consult/1} is invoked on a Prolog file it first runs the GNU Prolog compiler \RefSP{The-GNU-Prolog-compiler} as a child process to generate a temporary WAM file for byte-code. If the compilation fails a message is displayed and nothing is loaded. If the compilation succeeds, the produced file is loaded into memory using \IdxPB{load/1} \RefSP{load/1}. Namely, the byte-code of each predicate is loaded. When a predicate \Param{P} is loaded if there is a previous definition for \Param{P} it is removed (i.e. all clauses defining \Param{P} are erased). We say that \Param{P} is redefined. Note that only consulted predicates can be redefined. If \Param{P} is a native-code predicate, trying to redefine it will produce an error at load-time: the predicate redefinition will be ignored and the following message displayed: \OneLine{native code procedure \Param{P} cannot be redefined} Finally, an existing predicate will not be removed if it is not re-loaded. This means that if a predicate \Param{P} is loaded when consulting the file \Param{F}, and if later the definition of \Param{P} is removed from the file \Param{F}, consulting \Param{F} again will not remove the previously loaded definition of \Param{P} from the memory. Consulted predicates can be debugged using the Prolog debugger. Use the debugger predicate \IdxDB{trace/0} or \IdxDB{debug/0} \RefSP{Running-and-stopping-the-debugger} to activate the debugger. \subsubsection{Interrupting a query} \label{Interrupting-a-query} Under the top-level it is possible to interrupt the execution of a query by typing the interruption key (\texttt{Ctl-C}). This can be used to abort a query, to stop an infinite loop, to activate the debugger,\ldots When an interruption occurs the top-level displays the following message: \texttt{Prolog interruption (h for help)~?} The user can then type one of the following commands: \begin{tabular}{|c|c|l|} \hline Command & Name & Description \\ \hline\hline \texttt{a} & abort & abort the current execution. Same as \IdxPB{abort/0} \RefSP{abort/0} \\ \hline \texttt{e} & exit & quit the current Prolog process. Same as \IdxPB{halt/0} \RefSP{abort/0} \\ \hline \texttt{b} & break & invoke a recursive top-level. Same as \IdxPB{break/0} \RefSP{abort/0} \\ \hline \texttt{c} & continue & resume the execution \\ \hline \texttt{t} & trace & start the debugger using \IdxDB{trace/0} \RefSP{Running-and-stopping-the-debugger} \\ \hline \texttt{d} & debug & start the debugger using \IdxDB{debug/0} \RefSP{Running-and-stopping-the-debugger} \\ \hline \texttt{h} or \texttt{?} & help & display a summary of available commands \\ \hline \end{tabular} \subsubsection{The line editor} \label{The-line-editor} The line editor (\IdxKD{linedit}) allows the user to build/update the current input line using a variety of commands. This facility is available if the \texttt{linedit} part of GNU Prolog has been installed. \texttt{linedit} is implicitly called by any built-in predicate reading from a terminal (e.g. \texttt{get\_char/1}, \texttt{read/1},\ldots). This is the case when the \Idx{top-level} reads a query. \SPart{Bindings}: each command of \texttt{linedit} is activated using a key. For some commands another key is also available to invoke the command (on some terminals this other key may not work properly while the primary key always works). Here is the list of available commands: \begin{tabular}{|c|c|l|} \hline Key & Alternate key & Description \\ \hline\hline \texttt{Ctl-B} & \texttt{$\leftarrow$} & go to the previous character \\ \hline \texttt{Ctl-F} & \texttt{$\rightarrow$} & go to the next character \\ \hline \texttt{Esc-B} & \texttt{Ctl-$\leftarrow$} & go to the previous word \\ \hline \texttt{Esc-F} & \texttt{Ctl-$\rightarrow$} & go to the next word \\ \hline \texttt{Ctl-A} & \texttt{Home} & go to the beginning of the line \\ \hline \texttt{Ctl-E} & \texttt{End} & go to the end of the line \\ \hline \texttt{Ctl-H} & \texttt{Backspace} & delete the previous character \\ \hline \texttt{Ctl-D} & \texttt{Delete} & delete the current character \\ \hline \texttt{Ctl-U} & \texttt{Ctl-Home} & delete from beginning of the line to the current character \\ \hline \texttt{Ctl-K} & \texttt{Ctl-End} & delete from the current character to the end of the line \\ \hline \texttt{Esc-L} & & lower case the next word \\ \hline \texttt{Esc-U} & & upper case the next word \\ \hline \texttt{Esc-C} & & capitalize the next word \\ \hline \texttt{Ctl-T} & & exchange last two characters \\ \hline \texttt{Ctl-V} & \texttt{Insert} & switch on/off the insert/replace mode \\ \hline \texttt{Ctl-I} & \texttt{Tab} & complete word (twice displays all possible completions) \\ \hline \texttt{Esc-Ctl-I} & \texttt{Esc-Tab} & insert spaces to emulate a tabulation \\ \hline \texttt{Ctl-space} & & mark beginning of the selection \\ \hline \texttt{Esc-W} & & copy (from the begin selection mark to the current character) \\ \hline \texttt{Ctl-W} & & cut (from the begin selection mark to the current character) \\ \hline \texttt{Ctl-Y} & & paste \\ \hline \texttt{Ctl-P} & \texttt{$\uparrow$} & recall previous history line \\ \hline \texttt{Ctl-N} & \texttt{$\downarrow$} & recall next history line \\ \hline \texttt{Esc-P} & & recall previous history line beginning with the current prefix \\ \hline \texttt{Esc-N} & & recall next history line beginning with the current prefix \\ \hline \texttt{Esc-{\lt}} & \texttt{Page Up} & recall first history line \\ \hline \texttt{Esc-{\gt}} & \texttt{Page Down} & recall last history line \\ \hline \texttt{Ctl-C} & & generate an interrupt signal \RefSP{Interrupting-a-query} \\ \hline \texttt{Ctl-D} & & generate an end-of-file character (at the begin of the line) \\ \hline \texttt{RETURN} & & validate a line \\ \hline \texttt{Esc-?} & & display a summary of available commands \\ \hline \end{tabular} \SPart{History}: when a line is entered (i.e. terminated by \texttt{RETURN}), \texttt{linedit} records it in an internal list called history. It is later possible to recall history lines using appropriate commands (e.g. \texttt{Ctl-P} recall the last entered line) and to modify them as needed. It is also possible to recall a history line beginning with a given prefix. For instance to recall the previous line beginning with \texttt{write} simply type \texttt{write} followed by \texttt{Esc-P}. Another \texttt{Esc-P} will recall an earlier line beginning with \texttt{write},\ldots \SPart{Completion}: another important feature of \texttt{linedit} is its \IdxD{completion} facility. Indeed, \texttt{linedit} maintains a list of known words and uses it to complete the prefix of a word. Initially this list contains all predefined atoms and the atoms corresponding to available predicates. This list is dynamically updated when a new atom appears in the system (whether read at the top-level, created with a built-in predicate, associated with a new consulted predicate,\ldots). When the completion key (\texttt{Tab}) is pressed \texttt{linedit} acts as follows: \begin{itemize} \item use the current word as a prefix. \item collect all words of the list that begin with this prefix. \item complete the current word with the longest common part of all matching words. \item if more than one word matches emit a beep (a second \texttt{Tab} will display all possibilities). \end{itemize} Example: \begin{CodeTwoCols} \Two{| ?- argu} {(here the user presses \texttt{Tab} to complete the word)} \Two{| ?- argument\_}{(\texttt{linedit} completes \texttt{argu} with \texttt{argument\_} and emits a beep)} \Two{}{(the user presses again \texttt{Tab} to see all possible completions)} \Two{argument\_counter}{(\texttt{linedit} shows 3 possible completions)} \One{argument\_list} \One{argument\_value} \Two{| ?- argument\_}{(\texttt{linedit} redisplays the input line)} \SkipLine \Two{| ?- argument\_c}{(to select \texttt{argument\_counter} the user presses \texttt{c} and \texttt{Tab})} \Two{| ?- argument\_counter}{(\texttt{linedit} completes with \texttt{argument\_counter})} \end{CodeTwoCols} Finally, \texttt{linedit} allows the user to check that (square/curly) brackets are well balanced. For this, when a close bracket symbol, i.e. \texttt{)}, \texttt{]} or \texttt{{\rb}}, is typed, \texttt{linedit} determines the associated open bracket, i.e. \texttt{(}, \texttt{[} or \texttt{{\lb}}, and temporarily repositions the cursor on it to show the match. \subsection{Adjusting the size of Prolog stacks} \label{Adjusting-the-size-of-Prolog-stacks} GNU Prolog uses several stacks to execute a Prolog program. Each stack has a static size and cannot be dynamically increased during the execution. For each stack there is a default size but the user can define a new size by setting an environment variable. When a GNU Prolog program is run it first consults these variables and if they are not defined uses the default sizes. The following table presents each stack of GNU Prolog with its default size and the name of its associated environment variable: \begin{tabular}{|c|c|c|l|} \hline Stack & Default & Environment & Description \\ name & size (Kb) & variable & \\ \hline\hline \texttt{local} & 4096 & \texttt{LOCALSZ} & control stack (environments and choice-points) \\ \hline \texttt{global} & 8192 & \texttt{GLOBALSZ} & heap (compound terms) \\ \hline \texttt{trail} & 3072 & \texttt{TRAILSZ} & conditional bindings (bindings to undo at backtracking) \\ \hline \texttt{cstr} & 3072 & \texttt{CSTRSZ} & finite domain constraint stack (FD variables and constraints) \\ \hline \end{tabular} If the size of a stack is too small an overflow will occur during the execution. In that case GNU Prolog emits the following error message before stopping: \OneLine{\Param{S} stack overflow (size:~\Param{N} Kb, environment variable used:~\Param{E})} where \Param{S} is the name of the stack, \Param{N} is the current stack size in Kb and \Param{E} the name of the associated environment variable. When such a message occurs it is possible to (re)define the variable \Param{E} with the new size. For instance to allocate 8192 Kb to the local stack under a Unix shell use: \begin{CodeTwoCols}[6cm] \Two{LOCALSZ=8192; export LOCALS}{(under \texttt{sh} or \texttt{bash})} \Two{setenv LOCALSZ 8192}{(under \texttt{csh} or \texttt{tcsh})} \end{CodeTwoCols} This method allows the user to adjust the size of Prolog stacks. However, in some cases it is preferable not to allow the user to modify these sizes. For instance, when providing a stand alone executable whose behavior should be independent of the environment in which it is run. In that case the program should not consult environment variables and the programmer should be able to define new default stack sizes. The GNU Prolog compiler offers this facilities via several command-line options such as \IdxK{--local-size} or \IdxK{--fixed-sizes} \RefSP{Using-the-compiler}. Finally note that GNU Prolog stacks are virtually allocated (i.e. use virtual memory). This means that a physical memory page is allocated only when needed (i.e. when an attempt to read/write it occurs). Thus it is possible to define very large stacks. At the execution, only the needed amount of space will be physically allocated. \subsection{The GNU Prolog compiler} \label{The-GNU-Prolog-compiler} \subsubsection{Different kinds of codes} \label{Different-kinds-of-codes} One of the main advantages of GNU Prolog is its ability to produce stand alone executables. A Prolog program can be compiled to native code to give rise to a machine-dependent executable using the GNU Prolog compiler. However native-code predicates cannot be listed nor fully debugged. So there is an alternative to native-code compilation: byte-code compilation. By default the GNU Prolog compiler produces native-code but via a command-line option it can produce a file ready for byte-code loading. This is exactly what \IdxPB{consult/1} does as was explained above \RefSP{Consulting-a-Prolog-program}. GNU Prolog also manages interpreted code using a Prolog interpreter written in Prolog. Obviously interpreted code is slower than byte-code but does not require the invocation of the GNU Prolog compiler. This interpreter is used each time a meta-call is needed as by \texttt{call/1} \RefSP{call/1}. This also the case of dynamically asserted clauses. The following table summarizes these three kinds of codes: \begin{tabular}{|l|l|c|l|} \hline Type & Speed & Debug ? & For what \\ \hline\hline interpreted-code & slow & yes & meta-call and dynamically asserted clauses \\ \hline byte-code & medium & yes & consulted predicates \\ \hline native-code & fast & no & compiled predicates \\ \hline \end{tabular} \subsubsection{Compilation scheme} \label{Compilation-scheme} \SPart{Native-code compilation}: a Prolog source is compiled in several stages to produce an object file that is linked to the GNU Prolog libraries to produce an executable. The Prolog source is first compiled to obtain a \Idx{WAM} \cite{Warren83} file. For a detailed study of the WAM the interested reader can refer to \MyUrl{http://www.isg.sfu.ca/\~{}hak/documents/wam.html}{``Warren's Abstract Machine: A Tutorial Reconstruction''} \cite{Ait-Kaci91}. The WAM file is translated to a machine-independent language specifically designed for GNU Prolog. This language is close to a (universal) assembly language and is based on a very reduced instruction set. For this reason this language is called \IdxD{mini-assembly} (\IdxD{MA}). The mini-assembly file is then mapped to the assembly language of the target machine. This assembly file is assembled to give rise to an object file which is then linked with the GNU Prolog libraries to provide an executable. The compiler also takes into account Finite Domain constraint definition files. It translates them to C and invoke the C compiler to obtain object files. The following figure presents this compilation scheme: \InsertImage{compil-scheme} Obviously all intermediate stages are hidden to the user who simply invokes the compiler on his Prolog file(s) (plus other files: C,\ldots) and obtains an executable. However, it is also possible to stop the compiler at any given stage. This can be useful, for instance, to see the \Idx{WAM} code produced (perhaps when learning the WAM). Finally it is possible to give any kind of file to the compiler which will insert it in the compilation chain at the stage corresponding to its type. The type of a file is determined using the suffix of its file name. The following table presents all recognized types/suffixes: \begin{tabular}{|l|l|l|} \hline Suffix of the file & Type of the file & Handled by: \\ \hline\hline \texttt{.pl}, \texttt{.pro} & Prolog source file & \texttt{pl2wam} \\ \hline \texttt{.wam} & WAM source file & \texttt{wam2ma} \\ \hline \texttt{.ma} & Mini-assembly source file & \texttt{ma2asm} \\ \hline \texttt{.s} & Assembly source file & the assembler \\ \hline \texttt{.c}, \texttt{.C}, \texttt{.CC}, \texttt{.cc}, \texttt{.cxx}, \texttt{.c++}, \texttt{.cpp} & C or C++ source file & the C compiler \\ \hline \texttt{.fd} & Finite Domain constraint source file & \texttt{fd2c} \\ \hline any other suffix (\texttt{.o}, \texttt{.a},\ldots) & any other type (object, library,\ldots) & the linker (C linker) \\ \hline \end{tabular} \SPart{Byte-code compilation}: the same compiler can be used to compile a source Prolog file for byte-code. In that case the Prolog to WAM compiler is invoked using a specific option and produces a WAM for byte-code source file (suffixed \texttt{.wbc}) that can be later loaded using \IdxPB{load/1} \RefSP{load/1}. Note that this is exactly what \IdxPB{consult/1} \RefSP{consult/1} does as explained above \RefSP{Consulting-a-Prolog-program}. \subsubsection{Using the compiler} \label{Using-the-compiler} The GNU Prolog compiler is a command-line compiler similar in spirit to a Unix C compiler like \texttt{gcc}. To invoke the compiler use the \IdxKD{gplc} command as follows: \OneLineTwoCols[5.5cm]{\% gplc \textrm{[}\Param{OPTION}\textrm{]\ldots}~\Param{FILE}\textrm{\ldots}}{(the \texttt{\%} symbol is the operating system shell prompt)} The arguments of \texttt{gplc} are file names that are dispatched in the compilation scheme depending on the type determined from their suffix as was explained previously \RefSP{Compilation-scheme}. All object files are then linked to produce an executable. Note however that GNU Prolog has no module facility (since there is not yet an ISO reference for Prolog modules) thus a predicate defined in a Prolog file is visible from any other predicate defined in any other file. GNU Prolog allows the user to split a big Prolog source into several files but does not offer any way to hide a predicate from others. The simplest way to obtain an executable from a Prolog source file \texttt{prog.pl} is to use: \OneLine{\% gplc prog.pl} This will produce an native executable called \texttt{prog} which can be executed as follows: \OneLine{\% prog} However, there are several options that can be used to control the compilation: \SPart{General options}: \begin{CmdOptions} \IdxKD{-o} \Param{FILE}, \IdxKD{--output} \Param{FILE} & use \Param{FILE} as the name of the output file \\ \IdxKD{-W}, \IdxKD{--wam-for-native} & stop after producing WAM files(s) \\ \IdxKD{-w}, \IdxKD{--wam-for-byte-code} & stop after producing WAM for byte-code file(s) (force \texttt{--no-call-c}) \\ \IdxKD{-M}, \IdxKD{--mini-assembly} & stop after producing mini-assembly files(s) \\ \IdxKD{-S}, \IdxKD{--assembly} & stop after producing assembly files (s) \\ \IdxKD{-F}, \IdxKD{--fd-to-c} & stop after producing C files(s) from FD constraint definition file(s) \\ \IdxKD{-c}, \IdxKD{--object} & stop after producing object files(s) \\ \IdxKD{--temp-dir} \Param{PATH} & use \Param{PATH} as directory for temporary files \\ \IdxKD{--no-del-temp} & do not delete temporary files \\ \IdxKD{--no-decode-hexa} & do not decode hexadecimal predicate names \\ \IdxKD{-v}, \IdxKD{--verbose} & print executed commands \\ \IdxKD{-h}, \IdxKD{--help} & print a help and exit \\ \IdxKD{--version} & print version number and exit \\ \end{CmdOptions} \SPart{Prolog to WAM compiler options}: \begin{CmdOptions} \IdxKD{--pl-state} \Param{FILE} & read \Param{FILE} to set the initial Prolog state \\ \IdxKD{--no-susp-warn} & do not show warnings for suspicious predicates \\ \IdxKD{--no-singl-warn} & do not show warnings for named singleton variables \\ \IdxKD{--no-redef-error} & no not show errors for built-in predicate redefinitions \\ \IdxKD{--foreign-only} & only compile \texttt{foreign/1-2} directives \\ \IdxKD{--no-call-c} & do not allow the use of \texttt{fd\_tell}, \texttt{'\$call\_c}',\ldots \\ \IdxKD{--no-inline} & do not inline predicates \\ \IdxKD{--no-reorder} & do not reorder predicate arguments \\ \IdxKD{--no-reg-opt} & do not optimize registers \\ \IdxKD{--min-reg-opt} & minimally optimize registers \\ \IdxKD{--no-opt-last-subterm} & do not optimize last subterm compilation \\ \IdxKD{--fast-math} & use fast mathematical mode (assume integer arithmetics) \\ \IdxKD{--keep-void-inst} & keep void WAM instructions in the output file \\ \IdxKD{--compile-msg} & print a compile message \\ \IdxKD{--statistics} & print statistics information \\ \end{CmdOptions} \SPart{WAM to mini-assembly translator options}: \begin{CmdOptions} \IdxKD{--comment} & include comments in the output file \\ \end{CmdOptions} \SPart{Mini-assembly to assembly translator options}: \begin{CmdOptions} \IdxK{--comment} & include comments in the output file \\ \end{CmdOptions} \SPart{C compiler options}: \begin{CmdOptions} \IdxKD{--c-compiler} \Param{FILE} & use \Param{FILE} as C compiler \\ \IdxKD{-C} \Param{OPTION} & pass \Param{OPTION} to the C compiler \\ \end{CmdOptions} \SPart{Assembler options}: \begin{CmdOptions} \IdxKD{-A} \Param{OPTION} & pass \Param{OPTION} to the assembler \\ \end{CmdOptions} \SPart{Linker options}: \begin{CmdOptions} \IdxKD{--local-size} \Param{N} & set default local stack size to \Param{N} Kb \\ \IdxKD{--global-size} \Param{N} & set default global stack size to \Param{N} Kb \\ \IdxKD{--trail-size} \Param{N} & set default trail stack size to \Param{N} Kb \\ \IdxKD{--cstr-size} \Param{N} & set default constraint stack size to \Param{N} Kb \\ \IdxKD{--fixed-sizes} & do not consult environment variables at run-time (use default sizes) \\ \IdxKD{--no-top-level} & do not link the \Idx{top-level} (force \IdxK{--no-debugger}) \\ \IdxKD{--no-debugger} & do not link the Prolog/WAM debugger \\ \IdxKD{--min-pl-bips} & link only used Prolog built-in predicates \\ \IdxKD{--min-fd-bips} & link only used FD solver built-in predicates \\ \IdxKD{--min-bips} & shorthand for: \texttt{--no-top-level} \texttt{--min-pl-bips} \texttt{--min-fd-bips} \\ \IdxKD{--min-size} & shorthand² for: \texttt{--min-bips} \texttt{--strip} \\ \IdxKD{--no-fd-lib} & do not look for the FD library (maintenance only) \\ \IdxKD{-s}, \IdxKD{--strip} & strip the executable \\ \IdxKD{-L} \Param{OPTION} & Pass \Param{OPTION} to the linker \\ \end{CmdOptions} It is possible to only give the prefix of an option if there is no ambiguity. The name of the output file is controlled via the \texttt{-o} \Param{FILE} option. If present the output file produced will be named \Param{FILE}. If not specified, the output file name depends on the last stage reached by the compiler. If the link is not done the output file name(s) is the input file name(s) with the suffix associated with the last stage. If the link is done, the name of the executable is the name (without suffix) of the first file name encountered in the command-line. Note that if the link is not done \texttt{-o} has no sense in the presence of multiple input file names. For this reason, several meta characters are available for substitution in \Param{FILE}: \begin{itemize} \item \texttt{\%f} is substitued by the whole input file name. \item \texttt{\%F} is similar to \texttt{\%f} but the directory part is omitted. \item \texttt{\%p} is substitued by the whole prefix file name (omitting the suffix). \item \texttt{\%P} is similar to \texttt{\%p} but the directory part is omitted. \item \texttt{\%s} is substitued by the file suffix (including the dot). \item \texttt{\%d} is substitued by the directory part (empty if no directory is specified). \item \texttt{\%c} is substitued by the value of an internal counter starting from 1 and auto-incremented. \end{itemize} By default the compiler runs in the native-code compilation scheme. To generate a WAM file for byte-code use the \texttt{--wam-for-byte-code} option. The resulting file can then be loaded using \IdxPB{load/1} \RefSP{load/1}. To execute the Prolog to WAM compiler in a given \emph{read environment} (operator definitions, character conversion table,\ldots) use \texttt{--pl-state} \Param{FILE}. The state file should be produced by \IdxPB{write\_pl\_state\_file/1} \RefSP{write-pl-state-file/1}. By default the Prolog to WAM compiler inlines calls to some deterministic built-in predicates (e.g. \texttt{arg/3} and \texttt{functor/3}). Namely a call to such a predicate will not yield a classical predicate call but a simple C function call (which is obviously faster). It is possible to avoid this using \texttt{--no-inline}. Another optimization performed by the Prolog to WAM compiler is unification reordering. The arguments of a predicate are reordered to optimize unification. This can be deactivated using \texttt{--no-reorder}. The compiler also optimizes the unification/loading of nested compound terms. More precisely, the compiler emits optimized instructions when the last subterm of a compound term is itself a compound term (e.g. lists). This can be deactivated using \texttt{--no-opt-last-subterm}. By default the Prolog to WAM compiler fully optimizes the allocation of registers to decrease both the number of instruction produced and the number of used registers. A good allocation will generate many \emph{void instructions} that are removed from the produced file except if \texttt{--keep-void-inst} is specified. To prevent any optimization use \texttt{--no-reg-opt} while \texttt{--min-reg-opt} forces the compiler to only perform simple register optimizations. The Prolog to WAM compiler emits an error when a control construct or a built-in predicate is redefined. This can be avoided using \texttt{--no-redef-error}. The compiler also emits warnings for suspicious predicate definitions like \texttt{-/2} since this often corresponds to an earlier syntax error (e.g. \texttt{-} instead of \texttt{\_}. This can be deactivated by specifying \texttt{--no-susp-warn}. Finally, the compiler warns when a singleton variable has a name (i.e. not the generic anonymous name \texttt{\_}). This can be deactivated specifying \texttt{--no-singl-warn}. Predicate names are encoded with an hexadecimal representation. This is explained in more detail later \RefSP{The-hexadecimal-predicate-name-encoding}. By default the error messages from the linker (e.g. multiple definitions for a given predicate, reference to an undefined predicate,\ldots) are filtered to replace any hexadecimal representation by the real predicate name. Specifying the \texttt{--no-decode-hexa} prevents \IdxK{gplc} from filtering linker output messages and hexadecimal representations are then shown. When producing an executable it is possible to specify default stack sizes (using \texttt{--\Param{STACK\_NAME}-size}) and to prevent it from consulting environment variables (using \texttt{--fixed-sizes}) as was explained above \RefSP{Adjusting-the-size-of-Prolog-stacks}. By default the produced executable will include the top-level, the Prolog/WAM debugger and all Prolog and FD built-in predicates. It is possible to avoid linking the top-level \RefSP{The-GNU-Prolog-interactive-interpreter} by specifying \texttt{--no-top-level}. In this case, at least one \IdxDi{initialization/1} directive \RefSP{initialization/1} should be defined. The option \texttt{--no-debugger} does not link the debugger. To include only used built-in predicates that are actually used the options \texttt{--no-pl-bips} and/or \texttt{--no-fd-bips} can be specified. For the smallest executable all these options should be specified. This can be abbreviated by using the shorthand option \texttt{--min-bips}. By default, executables are not \emph{stripped}, i.e. their symbol table is not removed. This table is only useful for the C debugger (e.g. when interfacing Prolog and C). To remove the symbol table (and then to reduce the size of the final executable) use \texttt{--strip}. Finally \texttt{--min-size} is a shortcut for \texttt{--min-bips} and \texttt{--strip}, i.e. the produced executable is as small as possible. Example: compile and link two Prolog sources \texttt{prog1.pl} and \texttt{prog2.pl}. The resulting executable will be named \texttt{prog1} (since \texttt{-o} is not specified): \OneLine{\% gplc prog1.pl prog2.pl} Example: compile the Prolog file \texttt{prog.pl} to study basic WAM code. The resulting file will be named \texttt{prog.wam}: \OneLine{\% gplc -W --no-inline --no-reorder --keep-void-inst prog.pl} Example: compile the Prolog file \texttt{prog.pl} and its C interface file \texttt{utils.c} to provide an autonomous executable called \texttt{mycommand}. The executable is not stripped to allow the use of the C debugger: \OneLine{\% gplc -o mycommand prog.pl utils.c} Example: detail all steps to compile the Prolog file \texttt{prog.pl} (the resulting executable is stripped). All intermediate files are produced (\texttt{prog.wam}, \texttt{prog.ma}, \texttt{prog.s}, \texttt{prog.o} and the executable \texttt{prog}): \begin{Indentation} \begin{verbatim} % gplc -W prog.pl % gplc -M --comment prog.wam % gplc -S --comment prog.ma % gplc -c prog.s % gplc -o prog -s prog.o \end{verbatim} \end{Indentation} \subsubsection{Running an executable} \label{Running-an-executable} In this section we explain what happens when running an executable produced by the GNU Prolog native-code compiler. The default main function first starts the Prolog engine. This function collects all linked objects (issued from the compilation of Prolog files) and initializes them. The initialization of a Prolog object file consists in adding to appropriate tables new atoms, new predicates and executing its system directives. A system directive is generated by the Prolog to WAM compiler to reflect a (user) directive executed at compile-time such as \texttt{op/3} \RefSP{op/3}. Indeed, when the compiler encounters such a directive it immediately executes it and also generates a system directive to execute it at the start of the executable. When all system directives have been executed the Prolog engine executes all initialization directives defined with \IdxDi{initialization/1} \RefSP{initialization/1}. If several initialization directives appear in the same file they are executed in the order of appearance. If several initialization directives appear in different files the order in which they are executed is machine-dependant. However, on most machines the order will be the reverse order in which the associated files have been linked (this is not true under native win32). When all initialization directives have been executed the default main function looks for the GNU Prolog \Idx{top-level}. If present (i.e. it has been linked) it is called otherwise the program simply ends. Note that if the top-level is not linked and if there is no initialization directive the program is useless since it simply ends without doing any work. The default main function detects such a behavior and emits a warning message. Example: compile an empty file \texttt{prog.pl} without linking the top-level and execute it: \begin{Indentation} \begin{verbatim} % gplc --no-top-level prog.pl % prog Warning: no initial goal executed use a directive :- initialization(Goal) or remove the link option --no-top-level (or --min-bips or --min-size) \end{verbatim} \end{Indentation} \subsubsection{Generating a new interactive interpreter} \label{Generating-a-new-interactive-interpreter} In this section we show how to define a new \Idx{top-level} extending the GNU Prolog interactive interpreter with new predicate definitions. The obtained top-level can then be considered as an enriched version of the basic GNU Prolog top-level \RefSP{The-GNU-Prolog-interactive-interpreter}. Indeed, each added predicate can be viewed as a predefined predicate just like any other built-in predicate. This can be achieved by compiling these predicates and including the top-level at link-time. The real question is: why would we include some predicates in a new top-level instead of simply consulting them under the GNU Prolog top-level ? There are two reasons for this: \begin{itemize} \item the predicate cannot be consulted. This is the case of a predicate calling foreign code, like a predicate interfacing with C \RefSP{Interfacing-Prolog-and-C} or a predicate defining a new FD constraint. \item the performance of the predicate is crucial. Since it is compiled to native-code such a predicate will be executed very quickly. Consulting will load it as byte-code. The gain is much more noticeable if the program is run under the debugger. The included version will not be affected by the debugger while the consulted version will be several times slower. Obviously, a predicate should be included in a new top-level only when it is itself debugged since it is difficult to debug native-code. \end{itemize} To define a new top-level simply compile the set of desired predicates and linking them with the GNU Prolog top-level (this is the default) using \IdxK{gplc} \RefSP{Using-the-compiler}. Example: let us define a new top-level called \texttt{my\_top\_level} including all predicates defined in \texttt{prog.pl}: \OneLine{\% gplc -o my\_top\_level prog.pl} By the way, note that if \texttt{prog.pl} is an empty Prolog file the previous command will simply create a new interactive interpreter similar to the GNU Prolog top-level. Example: as before where some predicates of \texttt{prog.pl} call C functions defined in \texttt{utils.c}: \OneLine{\% gplc -o my\_top\_level prog.pl utils.c} In conclusion, defining a particular top-level is nothing else but a particular case of the native-code compilation. It is simple to do and very useful in practice. \subsubsection{The hexadecimal predicate name encoding} \label{The-hexadecimal-predicate-name-encoding} When the GNU Prolog compiler compiles a Prolog source to an object file it has to associate a symbol to each predicate name. However, the syntax of symbols is restricted to identifiers: string containing only letters, digits or underscore characters. On the other hand, predicate names (i.e. atoms) can contain any character with quotes if necessary (e.g. \texttt{'x+y=z'} is a valid predicate name). The compiler has then to encode predicate names respecting the syntax of identifiers. To achieve this, GNU Prolog uses an hexadecimal representation where each predicate name is translated to a symbol beginning with an \texttt{X} followed by the hexadecimal notation of the code of each character of the name. Example: \texttt{'x+y=z'} will be encoded as \texttt{X782B793D7A} since \texttt{78} is the hexadecimal representation of the code of \texttt{x}, \texttt{2B} of the code of \texttt{+}, etc. Since Prolog allows the user to define several predicates with the same name but with a different arity GNU Prolog encodes predicate indicators (predicate name followed by the arity). The symbol associated with the predicate name is then followed by an underscore and by the decimal notation of the arity. Example: \texttt{'x+y=z'/3} will be encoded as \texttt{X782B793D7A\_3}. So, from the \Idx{mini-assembly} stage, each predicate indicator is replaced by its hexadecimal encoding. The knowledge of this encoding is normally not of interest for the user, i.e. the Prolog programmer. For this reason the GNU Prolog compiler hides this encoding. When an error occurs on a predicate (undefined predicate, predicate with multiple definitions,\ldots) the compiler has to decode the symbol associated with the predicate indicator. For this \IdxK{gplc} filters each message emitted by the linker to locate and decode eventual predicate indicators. This filtering can be deactivated specifying \texttt{--no-decode-hexa} when invoking \IdxK{gplc} \RefSP{Using-the-compiler}. This filter is provided as an utility that can be invoked using the \IdxKD{hexgplc} command as follows: \OneLineTwoCols[5.5cm]{\% hexgplc \textrm{[}\Param{OPTION}\textrm{]\ldots}~\Param{FILE}\textrm{\ldots}}{(the \texttt{\%} symbol is the operating system shell prompt)} \SPart{Options}: \begin{CmdOptions} \IdxKD{--encode} & encoding mode (default mode is decoding) \\ \IdxKD{--relax} & decode also predicate names (not only predicate indicators) \\ \IdxKD{--printf} \Param{FORMAT} & pass encoded/decoded string to C \texttt{printf(3)} with \Param{FORMAT} \\ \IdxKD{--aux-father} & decode an auxiliary predicate as its father \\ \IdxKD{--aux-father2} & decode an auxiliary predicate as its father + auxiliary number \\ \IdxKD{--cmd-line} & encode/decode each argument of the command-line \\ \IdxKD{-H} & same as: \texttt{--cmd-line --encode} \\ \IdxKD{-P} & same as: \texttt{--cmd-line --relax} \\ \IdxKD{--help} & print a help and exit \\ \IdxKD{--version} & print version number and exit \\ \end{CmdOptions} It is possible to give a prefix of an option if there is no ambiguity. Without arguments \texttt{hexgplc} runs in decoding mode reading its standard input and decoding each symbol corresponding to a predicate indicator. To use \texttt{hexgplc} in the encoding mode the \texttt{--encode} option must be specified. By default \texttt{hexgplc} only decodes predicate indicators, this can be relaxed using \texttt{--relax} to also take into account simple predicate names (the arity can be omitted). It is possible to format the output of an encoded/decoded string using \texttt{--printf \Param{FORMAT}} in that case each string \Param{S} is passed to the C \texttt{printf(3)} function as \texttt{printf(\Param{FORMAT},\Param{S})}. Auxiliary predicates are generated by the Prolog to WAM compiler when simplifying some control constructs like \texttt{';'/2} present in the body of a clause. They are of the form \texttt{'\$\Param{NAME}/\Param{ARITY}\_\$aux\Param{N}'} where \texttt{\Param{NAME}/\Param{ARITY}} is the predicate indicator of the simplified (i.e. father) predicate and \Param{N} is a sequential number (a predicate can give rise to several auxiliary predicates). It is possible to force \texttt{hexgplc} to decode an auxiliary predicate as its father predicate indicator using \texttt{--aux-father} or as its father predicate indicator followed by the sequential number using \texttt{--aux-father2}. If no file is specified, \texttt{hexgplc} processes its standard input otherwise each file is treated sequentially. Specifying the \texttt{--cmd-line} option informs \texttt{hexgplc} that each argument is not a file name but a string that must be encoded (or decoded). This is useful to encode/decode a particular string. For this reason the option \texttt{-H} (encode to hexadecimal) and \texttt{-P} (decode to Prolog) are provided as shorthand. Then, to obtain the hexadecimal representation of a predicate \Param{P} use: \OneLine{\% hexgplc -H \Param{P}} Example: \begin{Indentation} \begin{verbatim} % hexgplc -H 'x+y=z' X782B793D7A \end{verbatim} \end{Indentation} %HEVEA\cutend ./gprolog-1.3.0/doc/body.tex0000644004425400513100000000102510547152502014214 0ustar diazloco\makeindex \begin{document} \input{cover.tex} \cleardoublepage \input{tbl-contents.tex} \cleardoublepage \input{acknow.tex} \cleardoublepage \input{intro.tex} \cleardoublepage \input{use.tex} \cleardoublepage \input{debugger.tex} \cleardoublepage \input{format-defs.tex} \cleardoublepage \input{direct-cc.tex} \cleardoublepage \input{pl-bips.tex} \cleardoublepage \input{fd-cstr.tex} \cleardoublepage \input{c-interface.tex} \cleardoublepage \input{references.tex} \cleardoublepage \input{the-index.tex} \end{document} ./gprolog-1.3.0/doc/gprolog.dvi0000644004425400513100000335216410547153013014730 0ustar diazloco÷ƒ’À;è TeX output 2007.01.04:1125‹ÿÿÿÿ Ú‹– ý"E ÃÝ» ý_"E  }‘øãóÂÖN ½q cmbx12ºGNU‘Ç PR‘ÿZOLOGŽŸ‰+‘øãŸúO9„°ÇÇ>|ŽŽ¤‘oNóX«Q ff cmr12»A–³/Nativš›¼e“Prolog“Compiler“with“Constrain˜t“Solving“o˜v˜er“Finite“DomainsŽ¡’¿ pEdition–³/1.8,“for“GNU“Prolog“v›¼ersion“1.3.0ŽŸ £Ö’^«Jan›¼uary–³/4,“2007Ž s¯‘øãóÂÖN ff cmbx12¼bŒÌy–ffDaniel“DiazŽŸ ‘øãŸúO9„ØcÇ>|ŽŽŽŽŒ‹* Ú‹– ý"E ÃÝ» ý_"E û²d‘øãóKñ`y cmr10²Cop•¸ãyrigh“t–UU(C)“1999-2007“Daniel“Diazޤ‘øãP•¸ãermission›Œ5is‘Œ6gran“ted˜to‘Œ6mak“e˜and‘Œ6distribute˜v“erbatim–Œ6copies˜of“this˜manš¸ãual“pro˜vided‘Œ5the“cop˜yrigh˜t‘Œ5noticeŽ© ‘øãand–UUthis“pGermission“notice“are“preserv¸ãed“on“all“copies.Ž¡‘øãP•¸ãermission›Ñmis‘Ñlgran“ted˜to‘Ñlcop“y˜and–Ñldistribute˜moGdi ed“v¸ãersions˜of“this˜man¸ãual“under˜the“conditions˜forަ‘øãv•¸ãerbatim›:¤cop“ying,‘s÷pro“vided˜that˜the˜en“tire˜resulting˜deriv“ed˜w“ork˜is‘:£distributed˜under˜the˜terms˜of˜aަ‘øãpGermission–UUnotice“iden¸ãtical“to“this“one.Ž¡‘øãPš¸ãermission–ßis“gran˜ted“to“cop˜y“and“distribute“translations‘ßof“this“man˜ual“in˜to“another“language,‘ö®under“theަ‘øãabšGo•¸ãv“e–.Lconditions‘.Kfor“mo˜di ed–.Kv¸ãersions,‘6except“that–.Lthis“p˜ermission‘.Knotice“ma¸ãy“b˜e›.Kstated“in˜a“translationަ‘øãappro•¸ãv“ed›UUb“y˜the˜F‘ÿ*ªree˜Soft“w“are˜F–ÿ*ªoundationŸü^ÿóÙ“ Rcmr7±1ŽŽ‘|s²,˜51˜F“ranklin˜St,˜Fifth˜FloGor,˜Boston,˜MA˜02110-1301,˜USA.Ž‘øãŸà­‰ff¶HŸ J=‘ "5Ÿý-:ó¹Aa¨cmr6¾1ŽŽŽ‘LÜóßCÊscmtt8Ãhttp://www.fsf.org/ŽŽŽŒ‹Ï Ú‹– ý"EŸüfd‘øã²CONTENTSŽŽŽ’»!‚1ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øã¼Con•ŒÌten“tsޤ‘øãóò"V cmbx10Ä1Ž‘ãAc•®9kno“wledgemen“ts’SÑ9ŽŽ¡‘øã2Ž‘ãIn®9troQÇduction’mWx11ŽŽ¡‘øã3Ž‘ãUsing–ÕTGNU“Prolog’LnG13ŽŽ¤ ‘ã²3.1Ž‘ã In¸ãtroGduction‘”î‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷13ŽŽ¡‘ã3.2Ž‘ã The–UUGNU“Prolog“in•¸ãteractiv“e‘UUin“terpreter‘‰Ä‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷13ŽŽ¡‘ã 3.2.1Ž‘BãStarting/exiting–UUthe“in•¸ãteractiv“e‘UUin“terpreter‘銑ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷13ŽŽ¡‘ã 3.2.2Ž‘BãThe›UUin•¸ãteractiv“e˜in“terpreter˜read-execute-write˜loGop‘~½‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷14ŽŽ¡‘ã 3.2.3Ž‘BãConsulting–UUa“Prolog“program‘¸‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷16ŽŽ¡‘ã 3.2.4Ž‘BãIn¸ãterrupting–UUa“query‘”š‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷17ŽŽ¡‘ã 3.2.5Ž‘BãThe–UUline“editor‘øK‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷18ŽŽ¡‘ã3.3Ž‘ã Adjusting–UUthe“size“of“Prolog“stac¸ãks‘©Ú‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷19ŽŽ¡‘ã3.4Ž‘ã The–UUGNU“Prolog“compiler‘»Ë‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷20ŽŽ¡‘ã 3.4.1Ž‘BãDi eren¸ãt–UUkinds“of“coGdes‘Ô’‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷20ŽŽ¡‘ã 3.4.2Ž‘BãCompilation‘UUsc¸ãheme‘80‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷20ŽŽ¡‘ã 3.4.3Ž‘BãUsing–UUthe“compiler‘¿N‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷22ŽŽ¡‘ã 3.4.4Ž‘BãRunning–UUan“executable‘x‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷25ŽŽ¡‘ã 3.4.5Ž‘BãGenerating–UUa“new“in•¸ãteractiv“e‘UUin“terpreter‘WÑ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷25ŽŽ¡‘ã 3.4.6Ž‘BãThe–UUhexadecimal“predicate“name“encoGding‘M‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷26ŽŽ©‘øãÄ4Ž‘ãDebugging’w 29ŽŽ¡‘ã²4.1Ž‘ã In¸ãtroGduction‘”î‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷29ŽŽ¡‘ã4.2Ž‘ã The–UUprošGcedure“b˜o¸ãx“mo˜del‘ÿX‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷29ŽŽ¡‘ã4.3Ž‘ã Debugging‘UUpredicatesbÿ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷29ŽŽ¡‘ã 4.3.1Ž‘BãRunning–UUand“stopping“the“debugger‘â‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷29ŽŽ¡‘ã 4.3.2Ž‘BãLeashing‘UUpGorts‘ž‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷30ŽŽ¡‘ã 4.3.3Ž‘BãSp•¸ãy-pGoin“ts‘F’‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷30ŽŽ¡‘ã4.4Ž‘ã Debugging‘UUmessages‘M«‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷31ŽŽ¡‘ã4.5Ž‘ã Debugger‘UUcommands‘*‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷31ŽŽ¡‘ã4.6Ž‘ã The–UUW‘þãAM“debugger‘‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷32ŽŽ¦‘øãÄ5Ž‘ãF‘ÿ «ormat–ÕTof“de nitions’CnJ35ŽŽ¡‘ã²5.1Ž‘ã General‘UUformat‘_Š‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷35ŽŽ¡‘ã5.2Ž‘ã T¸ãypšGes–UUand“mo˜des‘ã‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷35ŽŽ¡‘ã5.3Ž‘ã Errors‘µ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷37ŽŽ¡‘ã 5.3.1Ž‘BãGeneral–UUformat“and“error“con¸ãtext‘‚™‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷37ŽŽ¡‘ã 5.3.2Ž‘BãInstan¸ãtiation‘UUerror‘ÛÆ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷37ŽŽ¡‘ã 5.3.3Ž‘BãT¸ãypGe‘UUerror‘j#‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷38ŽŽ¡‘ã 5.3.4Ž‘BãDomain‘UUerror‘*‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷38ŽŽ¡‘ã 5.3.5Ž‘BãExistence‘UUerror‘ª ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷39ŽŽ¡‘ã 5.3.6Ž‘BãP¸ãermission‘UUerror‘|‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷39ŽŽ¡‘ã 5.3.7Ž‘BãRepresen¸ãtation‘UUerror‘‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷39ŽŽ¡‘ã 5.3.8Ž‘BãEv‘ÿqÇaluation‘UUerror‘*‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷40ŽŽ¡‘ã 5.3.9Ž‘BãResource‘UUerror‘[Ü‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷40ŽŽ¡‘ã 5.3.10Ž‘BãSyn¸ãtax‘UUerror‘j‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷40ŽŽ¡‘ã 5.3.11Ž‘BãSystem‘UUerror‘?o‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷40ŽŽ¦‘øãÄ6Ž‘ãProlog–ÕTdirectivš®9es“and“con˜trol“constructs’ã}´41ŽŽ¡‘ã²6.1Ž‘ã Prolog‘UUdirectiv¸ães‘£‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷41ŽŽ¡‘ã 6.1.1Ž‘BãIn¸ãtroGduction‘xP‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷41ŽŽ¡‘ã 6.1.2Ž‘Bãóßê|ŽŽŽŽ ÃÝ» ý_"E‘ã 6.1.7Ž‘BãÅbuilt‘¡E‰ff&fŽ–Ç«in/0²,›UUÅbuilt‘¡E‰ff&fŽ“in/1²,˜Åbuilt‘¡E‰ff&fŽ“in‘¡E‰ff&fŽ“fd/0²,˜Åbuilt‘¡E‰ff&fŽ“in‘¡E‰ff&fŽ“fd/1‘¦†‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷43ŽŽ¤ ‘ã 6.1.8Ž‘BãÅinclude/1‘1_‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷44ŽŽ¡‘ã 6.1.9Ž‘BãÅensure‘¡E‰ff&fŽ‘Ç«loaded/1‘F‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷44ŽŽ¡‘ã 6.1.10Ž‘BãÅop/3‘‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷44ŽŽ¡‘ã 6.1.11Ž‘BãÅchar‘¡E‰ff&fŽ‘Ç«conversion/2‘2‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷44ŽŽ¡‘ã 6.1.12Ž‘BãÅset‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag/2‘„‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷45ŽŽ¡‘ã 6.1.13Ž‘BãÅinitialization/1‘TÝ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷45ŽŽ¡‘ã 6.1.14Ž‘BãÅforeign/2²,‘UUÅforeign/1‘F›‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷45ŽŽ¡‘ã6.2Ž‘ã Prolog–UUcon¸ãtrol“constructs‘Y‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷46ŽŽ¡‘ã 6.2.1Ž‘BãÅtrue/0²,–UUÅfail/0²,“Å!/0‘# ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷46ŽŽ¡‘ã 6.2.2Ž‘BãÅ(',')/2–UU²-“conjunction,“Å(;)/2“²-“disjunction,“Å(->)/2“²-“if-then‘ð—‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷46ŽŽ¡‘ã 6.2.3Ž‘BãÅcall/1‘c,‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷47ŽŽ¡‘ã 6.2.4Ž‘BãÅcatch/3²,‘UUÅthrow/1‘ñP‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷47ŽŽŸ‘øãÄ7Ž‘ãProlog–ÕTbuilt-in“predicates’,m49ŽŽ¡‘ã²7.1Ž‘ã T¸ãypGe‘UUtesting‘ư‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷49ŽŽ¡‘ã 7.1.1Ž‘BãÅvar/1²,–UUÅnonvar/1²,“Åatom/1²,“Åinteger/1²,“Åfloat/1²,“Ånumber/1²,“Åatomic/1²,Ž¡‘BãÅcompound/1²,–UUÅcallable/1²,“Ålist/1²,“Åpartial‘¡E‰ff&fŽ›Ç«list/1²,“Ålist‘¡E‰ff&fŽ˜or‘¡E‰ff&fŽ˜partial‘¡E‰ff&fŽ˜list/1‘ü².ŽŽ‘Ç‘ü.ŽŽ‘x÷49ŽŽ¡‘ã7.2Ž‘ã T‘ÿ*ªerm‘UUuni cation‘#‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷50ŽŽ¡‘ã 7.2.1Ž‘BãÅ(=)/2–UU²-“Prolog“uni cation‘?=‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷50ŽŽ¡‘ã 7.2.2Ž‘BãÅunify‘¡E‰ff&fŽ–Ç«with‘¡E‰ff&fŽ“occurs‘¡E‰ff&fŽ“check/2‘aW‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷50ŽŽ¡‘ã 7.2.3Ž‘BãÅ(\=)/2–UU²-“not“Prolog“uni able‘©Û‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷50ŽŽ¡‘ã7.3Ž‘ã T‘ÿ*ªerm‘UUcomparison‘¸f‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷51ŽŽ¡‘ã 7.3.1Ž‘BãStandard–UUtotal“ordering“of“terms‘‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷51ŽŽ¡‘ã 7.3.2Ž‘BãÅ(==)/2–UU²-“term“idenš¸ãtical,“Å(\==)/2“²-“term“not“iden˜tical,Ž¡‘BãÅ(@<)/2–UU²-“term“less“than,“Å(@=<)/2“²-“term“less“than“or“equal“to,Ž¡‘BãÅ(@>)/2–UU²-“term“greater“than,“Å(@>=)/2“²-“term“greater“than“or“equal“to‘)C‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷51ŽŽ¡‘ã 7.3.3Ž‘BãÅcompare/3‘1_‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷52ŽŽ¡‘ã7.4Ž‘ã T‘ÿ*ªerm‘UUproGcessing‘c‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷52ŽŽ¡‘ã 7.4.1Ž‘BãÅfunctor/3‘1_‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷52ŽŽ¡‘ã 7.4.2Ž‘BãÅarg/3‘Ü‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷53ŽŽ¡‘ã 7.4.3Ž‘BãÅ(=..)/2–UU²-“univÕ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷53ŽŽ¡‘ã 7.4.4Ž‘BãÅcopy‘¡E‰ff&fŽ‘Ç«term/2‘ðÌ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷54ŽŽ¡‘ã 7.4.5Ž‘BãÅsetarg/4²,‘UUÅsetarg/3‘ÿ€‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷54ŽŽ¡‘ã7.5Ž‘ã V‘ÿ*ªariable‘UUnaming/n•¸ãum“bGering‘8/‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷55ŽŽ¡‘ã 7.5.1Ž‘BãÅname‘¡E‰ff&fŽ–Ç«singleton‘¡E‰ff&fŽ“vars/1‘ZÏ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷55ŽŽ¡‘ã 7.5.2Ž‘BãÅname‘¡E‰ff&fŽ–Ç«query‘¡E‰ff&fŽ“vars/2‘„‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷55ŽŽ¡‘ã 7.5.3Ž‘BãÅbind‘¡E‰ff&fŽ‘Ç«variables/2²,–UUÅnumbervars/3²,“Ånumbervars/1‘Ìø‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷56ŽŽ¡‘ã 7.5.4Ž‘BãÅterm‘¡E‰ff&fŽ‘Ç«ref/2‘0É‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷57ŽŽ¡‘ã7.6Ž‘ã Arithmetic¿‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷57ŽŽ¡‘ã 7.6.1Ž‘BãEv‘ÿqÇaluation–UUof“an“arithmetic“expression‘÷Ñ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷57ŽŽ¡‘ã 7.6.2Ž‘BãÅ(is)/2–UU²-“ev‘ÿqÇaluate“expression‘±‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷59ŽŽ¡‘ã 7.6.3Ž‘BãÅ(=:=)/2–UU²-“arithmetic“equal,“Å(=\=)/2“²-“arithmetic“not“equal,Ž¡‘BãÅ(<)/2–UU²-“arithmetic“less“than,“Å(=<)/2“²-“arithmetic“less“than“or“equal“to,Ž¡‘BãÅ(>)/2–UU²-“arithmetic“greater“than,“Å(>=)/2“²-“arithmetic“greater“than“or“equal“to‘©‘ü.ŽŽ‘Ç‘ü.ŽŽ‘x÷60ŽŽ¡‘ã7.7Ž‘ã Dynamic–UUclause“managemen¸ãt‘ø*‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷60ŽŽ¡‘ã 7.7.1Ž‘BãIn¸ãtroGduction‘xP‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷60ŽŽ¡‘ã 7.7.2Ž‘BãÅasserta/1²,‘UUÅassertz/1‘F›‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷61ŽŽ¡‘ã 7.7.3Ž‘BãÅretract/1‘1_‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷62ŽŽ¡‘ã 7.7.4Ž‘BãÅretractall/1‘ÿ’‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷62ŽŽ¡‘ã 7.7.5Ž‘BãÅclause/2‘ªG‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷63ŽŽ¡‘ã 7.7.6Ž‘BãÅabolish/1‘1_‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷63ŽŽ¡‘ã7.8Ž‘ã Predicate‘UUinformation‘†ƒ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷64ŽŽ¡‘ã 7.8.1Ž‘BãÅcurrent‘¡E‰ff&fŽ‘Ç«predicate/1‘›b‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷64ŽŽ¡‘ã 7.8.2Ž‘BãÅpredicate‘¡E‰ff&fŽ‘Ç«property/2‘[e‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷65ŽŽ¡‘ã7.9Ž‘ã All‘UUsolutionsš‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷66ŽŽ¡‘ã 7.9.1Ž‘BãIn¸ãtroGduction‘xP‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷66ŽŽŽŸŽŒ‹Q4 Ú‹– ý"EŸüfd‘øã²CONTENTSŽŽŽ’»!‚3ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã 7.9.2Ž‘BãÅfindall/3‘1_‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷66ŽŽ¤ ‘ã 7.9.3Ž‘BãÅbagof/3²,‘UUÅsetof/3‘ñP‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷66ŽŽ¡‘ã7.10Ž‘ã Streams‘±s‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷67ŽŽ¡‘ã 7.10.1Ž‘BãIn¸ãtroGduction‘xP‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷67ŽŽ¡‘ã 7.10.2Ž‘BãÅcurrent‘¡E‰ff&fŽ‘Ç«input/1‘F‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷69ŽŽ¡‘ã 7.10.3Ž‘BãÅcurrent‘¡E‰ff&fŽ‘Ç«output/1‘Í/‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷69ŽŽ¡‘ã 7.10.4Ž‘BãÅset‘¡E‰ff&fŽ‘Ç«input/1‘ðÌ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷69ŽŽ¡‘ã 7.10.5Ž‘BãÅset‘¡E‰ff&fŽ‘Ç«output/1‘wä‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷70ŽŽ¡‘ã 7.10.6Ž‘BãÅopen/4²,‘UUÅopen/3‘ª5‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷70ŽŽ¡‘ã 7.10.7Ž‘BãÅclose/2²,‘UUÅclose/1‘ñP‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷72ŽŽ¡‘ã 7.10.8Ž‘BãÅflush‘¡E‰ff&fŽ–Ç«output/1²,‘UUÅflush‘¡E‰ff&fŽ“output/0‘aÛ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷72ŽŽ¡‘ã 7.10.9Ž‘BãÅcurrent‘¡E‰ff&fŽ‘Ç«stream/1‘Í/‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷73ŽŽ¡‘ã 7.10.10Ž‘BãÅstream‘¡E‰ff&fŽ‘Ç«property/2‘2‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷73ŽŽ¡‘ã 7.10.11Ž‘BãÅat‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream/1²,‘UUÅat‘¡E‰ff&fŽ“end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream/0‘&¤‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷74ŽŽ¡‘ã 7.10.12Ž‘BãÅstream‘¡E‰ff&fŽ‘Ç«position/2‘2‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷74ŽŽ¡‘ã 7.10.13Ž‘BãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“position/2‘ZÏ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷75ŽŽ¡‘ã 7.10.14Ž‘BãÅseek/4‘c,‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷75ŽŽ¡‘ã 7.10.15Ž‘BãÅcharacter‘¡E‰ff&fŽ‘Ç«count/2‘2‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷76ŽŽ¡‘ã 7.10.16Ž‘BãÅline‘¡E‰ff&fŽ‘Ç«count/2‘wä‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷77ŽŽ¡‘ã 7.10.17Ž‘BãÅline‘¡E‰ff&fŽ‘Ç«position/2‘F‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷77ŽŽ¡‘ã 7.10.18Ž‘BãÅstream‘¡E‰ff&fŽ–Ç«line‘¡E‰ff&fŽ“column/3‘Ó·‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷77ŽŽ¡‘ã 7.10.19Ž‘BãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“line‘¡E‰ff&fŽ“column/3‘¡T‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷78ŽŽ¡‘ã 7.10.20Ž‘BãÅadd‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“alias/2‘Œœ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷79ŽŽ¡‘ã 7.10.21Ž‘BãÅcurrent‘¡E‰ff&fŽ‘Ç«alias/2‘F‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷79ŽŽ¡‘ã 7.10.22Ž‘BãÅadd‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“mirror/2LŸ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷79ŽŽ¡‘ã 7.10.23Ž‘BãÅremove‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“mirror/2Ò‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷80ŽŽ¡‘ã 7.10.24Ž‘BãÅcurrent‘¡E‰ff&fŽ‘Ç«mirror/2‘Í/‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷80ŽŽ¡‘ã 7.10.25Ž‘BãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“type/2‘„‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷81ŽŽ¡‘ã 7.10.26Ž‘BãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“eof‘¡E‰ff&fŽ“action/2‘<‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷81ŽŽ¡‘ã 7.10.27Ž‘BãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“buffering/2Ò‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷82ŽŽ¡‘ã7.11Ž‘ã Constan¸ãt–UUterm“streams‘j‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷82ŽŽ¡‘ã 7.11.1Ž‘BãIn¸ãtroGduction‘xP‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷82ŽŽ¡‘ã 7.11.2Ž‘BãÅopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/2²,‘UUÅopen‘¡E‰ff&fŽ“input‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream/2²,Ž¡‘BãÅopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream/2‘aW‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷83ŽŽ¡‘ã 7.11.3Ž‘BãÅclose‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/1²,‘UUÅclose‘¡E‰ff&fŽ“input‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream/1²,Ž¡‘BãÅclose‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream/1‘èo‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷83ŽŽ¡‘ã 7.11.4Ž‘BãÅopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/1²,‘UUÅopen‘¡E‰ff&fŽ“output‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream/1²,Ž¡‘BãÅopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream/1‘èo‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷84ŽŽ¡‘ã 7.11.5Ž‘BãÅclose‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/2²,‘UUÅclose‘¡E‰ff&fŽ“output‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream/2²,Ž¡‘BãÅclose‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream/2‘o‡‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷84ŽŽ¡‘ã7.12Ž‘ã Character‘UUinput/output‘Fz‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷85ŽŽ¡‘ã 7.12.1Ž‘BãÅget‘¡E‰ff&fŽ–Ç«char/2²,›UUÅget‘¡E‰ff&fŽ“char/1²,˜Åget‘¡E‰ff&fŽ“code/1²,˜Åget‘¡E‰ff&fŽ“code/2‘à‘‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷85ŽŽ¡‘ã 7.12.2Ž‘BãÅget‘¡E‰ff&fŽ–Ç«key/2²,›UUÅget‘¡E‰ff&fŽ“key/1˜get‘¡E‰ff&fŽ“key‘¡E‰ff&fŽ“no‘¡E‰ff&fŽ“echo/2²,˜Åget‘¡E‰ff&fŽ“key‘¡E‰ff&fŽ“no‘¡E‰ff&fŽ“echo/1‘ú­‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷86ŽŽ¡‘ã 7.12.3Ž‘BãÅpeek‘¡E‰ff&fŽ–Ç«char/2²,›UUÅpeek‘¡E‰ff&fŽ“char/1²,˜Åpeek‘¡E‰ff&fŽ“code/1²,˜Åpeek‘¡E‰ff&fŽ“code/2‘nÇ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷87ŽŽ¡‘ã 7.12.4Ž‘BãÅunget‘¡E‰ff&fŽ–Ç«char/2²,›UUÅunget‘¡E‰ff&fŽ“char/1²,˜Åunget‘¡E‰ff&fŽ“code/2²,˜Åunget‘¡E‰ff&fŽ“code/1‘Ä‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷88ŽŽ¡‘ã 7.12.5Ž‘BãÅput‘¡E‰ff&fŽ–Ç«char/2²,›UUÅput‘¡E‰ff&fŽ“char/1²,˜Åput‘¡E‰ff&fŽ“code/1²,˜Åput‘¡E‰ff&fŽ“code/2²,˜Ånl/1²,˜Ånl/0‘X‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷88ŽŽ¡‘ã7.13Ž‘ã Byte‘UUinput/output‘£‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷89ŽŽ¡‘ã 7.13.1Ž‘BãÅget‘¡E‰ff&fŽ–Ç«byte/2²,‘UUÅget‘¡E‰ff&fŽ“byte/1‘~Z‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷89ŽŽ¡‘ã 7.13.2Ž‘BãÅpeek‘¡E‰ff&fŽ–Ç«byte/2²,‘UUÅpeek‘¡E‰ff&fŽ“byte/1‘Åu‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷90ŽŽ¡‘ã 7.13.3Ž‘BãÅunget‘¡E‰ff&fŽ–Ç«byte/2²,‘UUÅunget‘¡E‰ff&fŽ“byte/1‘Ó¥‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷90ŽŽ¡‘ã 7.13.4Ž‘BãÅput‘¡E‰ff&fŽ–Ç«byte/2²,‘UUÅput‘¡E‰ff&fŽ“byte/1‘~Z‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷91ŽŽ¡‘ã7.14Ž‘ã T‘ÿ*ªerm‘UUinput/output‘?w‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷91ŽŽ¡‘ã 7.14.1Ž‘BãÅread‘¡E‰ff&fŽ–Ç«term/3²,›UUÅread‘¡E‰ff&fŽ“term/2²,˜Åread/2²,˜Åread/1‘S‡‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷92ŽŽ¡‘ã 7.14.2Ž‘BãÅread‘¡E‰ff&fŽ–Ç«atom/2²,›UUÅread‘¡E‰ff&fŽ“atom/1²,˜Åread‘¡E‰ff&fŽ“integer/2²,˜Åread‘¡E‰ff&fŽ“integer/1²,Ž¡‘BãÅread‘¡E‰ff&fŽ–Ç«number/2²,‘UUÅread‘¡E‰ff&fŽ“number/1‘À‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷93ŽŽ¡‘ã 7.14.3Ž‘BãÅread‘¡E‰ff&fŽ–Ç«token/2²,‘UUÅread‘¡E‰ff&fŽ“token/1‘Ó¥‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷94ŽŽ¡‘ã 7.14.4Ž‘BãÅsyntax‘¡E‰ff&fŽ–Ç«error‘¡E‰ff&fŽ“info/4LŸ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷95ŽŽŽŸŽŒ‹¡× Ú‹– ý"EŸüfd‘øã²4ŽŽŽ’‡SCCONTENTSŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã 7.14.5Ž‘BãÅlast‘¡E‰ff&fŽ–Ç«read‘¡E‰ff&fŽ“start‘¡E‰ff&fŽ“line‘¡E‰ff&fŽ“column/2‘.ô‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷95ŽŽ¤ ‘ã 7.14.6Ž‘BãÅwrite‘¡E‰ff&fŽ–Ç«term/3²,›UUÅwrite‘¡E‰ff&fŽ“term/2²,˜Åwrite/2²,˜Åwrite/1²,˜Åwriteq/2²,˜Åwriteq/1²,Ž¡‘BãÅwrite‘¡E‰ff&fŽ–Ç«canonical/2²,›UUÅwrite‘¡E‰ff&fŽ“canonical/1²,˜Ådisplay/2²,˜Ådisplay/1²,˜Åprint/2²,Ž¡‘BãÅprint/1‘êD‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷96ŽŽ¡‘ã 7.14.7Ž‘BãÅformat/3²,‘UUÅformat/2‘ÿ€‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷98ŽŽ¡‘ã 7.14.8Ž‘BãÅportray‘¡E‰ff&fŽ–Ç«clause/2²,‘UUÅportray‘¡E‰ff&fŽ“clause/1‘·&‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x÷99ŽŽ¡‘ã 7.14.9Ž‘BãÅget‘¡E‰ff&fŽ–Ç«print‘¡E‰ff&fŽ“stream/1‘Œœ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö100ŽŽ¡‘ã 7.14.10Ž‘BãÅop/3‘‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö100ŽŽ¡‘ã 7.14.11Ž‘BãÅcurrent‘¡E‰ff&fŽ‘Ç«op/3‘wä‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö102ŽŽ¡‘ã 7.14.12Ž‘BãÅchar‘¡E‰ff&fŽ‘Ç«conversion/2‘2‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö102ŽŽ¡‘ã 7.14.13Ž‘BãÅcurrent‘¡E‰ff&fŽ–Ç«char‘¡E‰ff&fŽ“conversion/2‘°‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö103ŽŽ¡‘ã7.15Ž‘ã Input/output–UUfrom/to“constan¸ãt“terms‘©Ä‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö104ŽŽ¡‘ã 7.15.1Ž‘BãÅread‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“atom/3²,›UUÅread‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“atom/2²,˜Åread‘¡E‰ff&fŽ“token‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“atom/2‘¬k‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö104ŽŽ¡‘ã 7.15.2Ž‘BãÅread‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“chars/3²,›UUÅread‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“chars/2²,˜Åread‘¡E‰ff&fŽ“token‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“chars/2‘zž‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö104ŽŽ¡‘ã 7.15.3Ž‘BãÅread‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“codes/3²,›UUÅread‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“codes/2²,˜Åread‘¡E‰ff&fŽ“token‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“codes/2‘zž‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö105ŽŽ¡‘ã 7.15.4Ž‘BãÅwrite‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/3²,›UUÅwrite‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/2²,˜Åwriteq‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/2²,Ž¡‘BãÅwrite‘¡E‰ff&fŽ–Ç«canonical‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/2²,›UUÅdisplay‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/2²,˜Åprint‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/2²,Ž¡‘BãÅformat‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“atom/3~l‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö105ŽŽ¡‘ã 7.15.5Ž‘BãÅwrite‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/3²,›UUÅwrite‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/2²,˜Åwriteq‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/2²,Ž¡‘BãÅwrite‘¡E‰ff&fŽ–Ç«canonical‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/2²,›UUÅdisplay‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/2²,˜Åprint‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/2²,Ž¡‘BãÅformat‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“chars/3‘„‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö106ŽŽ¡‘ã 7.15.6Ž‘BãÅwrite‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/3²,›UUÅwrite‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/2²,˜Åwriteq‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/2²,Ž¡‘BãÅwrite‘¡E‰ff&fŽ–Ç«canonical‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/2²,›UUÅdisplay‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/2²,˜Åprint‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/2²,Ž¡‘BãÅformat‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“codes/3‘„‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö106ŽŽ¡‘ã7.16Ž‘ã DEC-10–UUcompatibilit¸ãy“input/output‘ÿ ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö107ŽŽ¡‘ã 7.16.1Ž‘BãIn¸ãtroGduction‘xP‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö107ŽŽ¡‘ã 7.16.2Ž‘BãÅsee/1²,–UUÅtell/1²,“Åappend/1‘±A‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö107ŽŽ¡‘ã 7.16.3Ž‘BãÅseeing/1²,‘UUÅtelling/1‘¿ƒ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö108ŽŽ¡‘ã 7.16.4Ž‘BãÅseen/0²,‘UUÅtold/0‘ª5‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö108ŽŽ¡‘ã 7.16.5Ž‘BãÅget0/1²,–UUÅget/1²,“Åskip/1‘j&‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö108ŽŽ¡‘ã 7.16.6Ž‘BãÅput/1²,‘UUÅtab/1‘c‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö109ŽŽ¡‘ã7.17Ž‘ã T‘ÿ*ªerm‘UUexpansion‘[ü‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö109ŽŽ¡‘ã 7.17.1Ž‘BãDe nite–UUclause“grammars‘Š‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö109ŽŽ¡‘ã 7.17.2Ž‘BãÅexpand‘¡E‰ff&fŽ–Ç«term/2²,‘UUÅterm‘¡E‰ff&fŽ“expansion/2‘èó‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö111ŽŽ¡‘ã 7.17.3Ž‘BãÅphrase/3²,‘UUÅphrase/2‘ÿ€‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö111ŽŽ¡‘ã7.18Ž‘ã Logic,–UUcon¸ãtrol“and“exceptions‘¹‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö112ŽŽ¡‘ã 7.18.1Ž‘BãÅabort/0²,–UUÅstop/0²,“Åtop‘¡E‰ff&fŽ‘Ç«level/0²,“Åbreak/0²,“Åhalt/1²,“Åhalt/0‘›‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö112ŽŽ¡‘ã 7.18.2Ž‘BãÅonce/1²,–UUÅ(\+)/1“²-“not“pro¸ãv‘ÿqÇable,“Åcall/2-11²,“Åcall‘¡E‰ff&fŽ–Ç«with‘¡E‰ff&fŽ“args/1-11²,‘UUÅcall‘¡E‰ff&fŽ“det/2‘ÄP‘ü².ŽŽ‘ xö113ŽŽ¡‘ã 7.18.3Ž‘BãÅrepeat/0‘ªG‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö113ŽŽ¡‘ã 7.18.4Ž‘BãÅfor/3‘Ü‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö114ŽŽ¡‘ã7.19Ž‘ã A¸ãtomic–UUterm“proGcessing‘ÿb‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö114ŽŽ¡‘ã 7.19.1Ž‘BãÅatom‘¡E‰ff&fŽ‘Ç«length/2‘þü‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö114ŽŽ¡‘ã 7.19.2Ž‘BãÅatom‘¡E‰ff&fŽ‘Ç«concat/3‘þü‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö115ŽŽ¡‘ã 7.19.3Ž‘BãÅsub‘¡E‰ff&fŽ‘Ç«atom/5‘0É‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö115ŽŽ¡‘ã 7.19.4Ž‘BãÅchar‘¡E‰ff&fŽ‘Ç«code/2‘ðÌ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö116ŽŽ¡‘ã 7.19.5Ž‘BãÅlower‘¡E‰ff&fŽ‘Ç«upper/2‘þü‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö116ŽŽ¡‘ã 7.19.6Ž‘BãÅatom‘¡E‰ff&fŽ–Ç«chars/2²,‘UUÅatom‘¡E‰ff&fŽ“codes/2‘Ó¥‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö117ŽŽ¡‘ã 7.19.7Ž‘BãÅnumber‘¡E‰ff&fŽ–Ç«atom/2²,›UUÅnumber‘¡E‰ff&fŽ“chars/2²,˜Ånumber‘¡E‰ff&fŽ“codes/2‘D´‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö117ŽŽ¡‘ã 7.19.8Ž‘BãÅname/2‘c,‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö118ŽŽ¡‘ã 7.19.9Ž‘BãÅatom‘¡E‰ff&fŽ‘Ç«hash/2‘ðÌ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö119ŽŽ¡‘ã 7.19.10Ž‘BãÅnew‘¡E‰ff&fŽ–Ç«atom/3²,›UUÅnew‘¡E‰ff&fŽ“atom/2²,˜Ånew‘¡E‰ff&fŽ“atom/1‘Ëë‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö119ŽŽ¡‘ã 7.19.11Ž‘BãÅcurrent‘¡E‰ff&fŽ‘Ç«atom/1‘¾ÿ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö120ŽŽ¡‘ã 7.19.12Ž‘BãÅatom‘¡E‰ff&fŽ‘Ç«property/2‘F‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö120ŽŽ¡‘ã7.20Ž‘ã List‘UUproGcessing‘Ôá‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö121ŽŽ¡‘ã 7.20.1Ž‘BãÅappend/3‘ªG‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö121ŽŽ¡‘ã 7.20.2Ž‘BãÅmember/2²,‘UUÅmemberchk/2‘ͳ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö121ŽŽ¡‘ã 7.20.3Ž‘BãÅreverse/2‘1_‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö122ŽŽŽŸŽŒ‹øe Ú‹– ý"EŸüfd‘øã²CONTENTSŽŽŽ’»!‚5ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã 7.20.4Ž‘BãÅdelete/3²,‘UUÅselect/3‘ÿ€‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö122ŽŽ¤ ‘ã 7.20.5Ž‘BãÅpermutation/2‘†ª‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö122ŽŽ¡‘ã 7.20.6Ž‘BãÅprefix/2²,‘UUÅsuffix/2‘ÿ€‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö123ŽŽ¡‘ã 7.20.7Ž‘BãÅsublist/2‘1_‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö123ŽŽ¡‘ã 7.20.8Ž‘BãÅlast/2‘c,‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö124ŽŽ¡‘ã 7.20.9Ž‘BãÅlength/2‘ªG‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö124ŽŽ¡‘ã 7.20.10Ž‘BãÅnth/3‘Ü‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö124ŽŽ¡‘ã 7.20.11Ž‘BãÅmax‘¡E‰ff&fŽ–Ç«list/2²,›UUÅmin‘¡E‰ff&fŽ“list/2²,˜Åsum‘¡E‰ff&fŽ“list/2‘Ëë‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö125ŽŽ¡‘ã 7.20.12Ž‘BãÅsort/2²,–UUÅsort0/2²,“Åkeysort/2“sort/1²,“Åsort0/1²,“Åkeysort/1‘©â‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö125ŽŽ¡‘ã7.21Ž‘ã Global‘UUv‘ÿqÇariablestÞ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö126ŽŽ¡‘ã 7.21.1Ž‘BãIn¸ãtroGduction‘xP‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö126ŽŽ¡‘ã 7.21.2Ž‘BãÅg‘¡E‰ff&fŽ–Ç«assign/2²,›UUÅg‘¡E‰ff&fŽ“assignb/2²,˜Åg‘¡E‰ff&fŽ“link/2‘ è‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö127ŽŽ¡‘ã 7.21.3Ž‘BãÅg‘¡E‰ff&fŽ‘Ç«read/2‘"™‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö128ŽŽ¡‘ã 7.21.4Ž‘BãÅg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“size/2‘7Q‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö128ŽŽ¡‘ã 7.21.5Ž‘BãÅg‘¡E‰ff&fŽ–Ç«inc/3²,›UUÅg‘¡E‰ff&fŽ“inc/2²,˜Åg‘¡E‰ff&fŽ“inco/2²,˜Åg‘¡E‰ff&fŽ“inc/1²,˜Åg‘¡E‰ff&fŽ“dec/3²,˜Åg‘¡E‰ff&fŽ“dec/2²,˜Åg‘¡E‰ff&fŽ“deco/2²,˜Åg‘¡E‰ff&fŽ“dec/1‘³m‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ‘ xö129ŽŽ¡‘ã 7.21.6Ž‘BãÅg‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“bit/2²,›UUÅg‘¡E‰ff&fŽ“reset‘¡E‰ff&fŽ“bit/2²,˜Åg‘¡E‰ff&fŽ“test‘¡E‰ff&fŽ“set‘¡E‰ff&fŽ“bit/2²,˜Åg‘¡E‰ff&fŽ“test‘¡E‰ff&fŽ“reset‘¡E‰ff&fŽ“bit/2‘Àš‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö130ŽŽ¡‘ã 7.21.7Ž‘BãExamples‘†š‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö130ŽŽ¡‘ã7.22Ž‘ã Prolog‘UUstate‘Tð‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö133ŽŽ¡‘ã 7.22.1Ž‘BãÅset‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag/2‘„‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö133ŽŽ¡‘ã 7.22.2Ž‘BãÅcurrent‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag/2‘ZÏ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö134ŽŽ¡‘ã 7.22.3Ž‘BãÅset‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name/2‘7Q‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö135ŽŽ¡‘ã 7.22.4Ž‘BãÅcurrent‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name/2‘Œœ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö135ŽŽ¡‘ã 7.22.5Ž‘BãÅwrite‘¡E‰ff&fŽ–Ç«pl‘¡E‰ff&fŽ“state‘¡E‰ff&fŽ“file/1²,‘UUÅread‘¡E‰ff&fŽ“pl‘¡E‰ff&fŽ“state‘¡E‰ff&fŽ“file/1‘;ò‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö136ŽŽ¡‘ã7.23Ž‘ã Program‘UUstate‘£ ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö136ŽŽ¡‘ã 7.23.1Ž‘BãÅconsult/1²,–UUÅ'.'/2“²-“program“consult‘FJ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö136ŽŽ¡‘ã 7.23.2Ž‘BãÅload/1‘c,‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö137ŽŽ¡‘ã 7.23.3Ž‘BãÅlisting/1²,‘UUÅlisting/0‘F›‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö138ŽŽ¡‘ã7.24Ž‘ã System‘UUstatistics‘c‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö138ŽŽ¡‘ã 7.24.1Ž‘BãÅstatistics/0²,‘UUÅstatistics/2‘ã‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö138ŽŽ¡‘ã 7.24.2Ž‘BãÅuser‘¡E‰ff&fŽ–Ç«time/1²,›UUÅsystem‘¡E‰ff&fŽ“time/1²,˜Åcpu‘¡E‰ff&fŽ“time/1²,˜Åreal‘¡E‰ff&fŽ“time/1‘õß‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö139ŽŽ¡‘ã7.25Ž‘ã Random›UUn•¸ãum“bGer˜generator‘›Á‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö139ŽŽ¡‘ã 7.25.1Ž‘BãÅset‘¡E‰ff&fŽ‘Ç«seed/1²,‘UUÅrandomize/0‘ ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö139ŽŽ¡‘ã 7.25.2Ž‘BãÅget‘¡E‰ff&fŽ‘Ç«seed/1‘0É‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö140ŽŽ¡‘ã 7.25.3Ž‘BãÅrandom/1‘ªG‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö140ŽŽ¡‘ã 7.25.4Ž‘BãÅrandom/3‘ªG‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö140ŽŽ¡‘ã7.26Ž‘ã File–UUname“proGcessing‘ÔÇ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö141ŽŽ¡‘ã 7.26.1Ž‘BãÅabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2‘Ó·‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö141ŽŽ¡‘ã 7.26.2Ž‘BãÅdecompose‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/4‘ZÏ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö141ŽŽ¡‘ã 7.26.3Ž‘BãÅprolog‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2‘Œœ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö142ŽŽ¡‘ã7.27Ž‘ã OpGerating–UUsystem“in¸ãterface‘bÞ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö142ŽŽ¡‘ã 7.27.1Ž‘BãÅargument‘¡E‰ff&fŽ‘Ç«counter/1‘J‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö142ŽŽ¡‘ã 7.27.2Ž‘BãÅargument‘¡E‰ff&fŽ‘Ç«value/2‘Í/‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö143ŽŽ¡‘ã 7.27.3Ž‘BãÅargument‘¡E‰ff&fŽ‘Ç«list/1‘F‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö143ŽŽ¡‘ã 7.27.4Ž‘BãÅenviron/2‘1_‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö144ŽŽ¡‘ã 7.27.5Ž‘BãÅmake‘¡E‰ff&fŽ–Ç«directory/1²,›UUÅdelete‘¡E‰ff&fŽ“directory/1²,˜Åchange‘¡E‰ff&fŽ“directory/1‘öh‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö144ŽŽ¡‘ã 7.27.6Ž‘BãÅworking‘¡E‰ff&fŽ‘Ç«directory/1‘›b‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö144ŽŽ¡‘ã 7.27.7Ž‘BãÅdirectory‘¡E‰ff&fŽ‘Ç«files/2‘2‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö145ŽŽ¡‘ã 7.27.8Ž‘BãÅrename‘¡E‰ff&fŽ‘Ç«file/2‘þü‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö145ŽŽ¡‘ã 7.27.9Ž‘BãÅdelete‘¡E‰ff&fŽ‘Ç«file/1²,‘UUÅunlink/1‘ ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö146ŽŽ¡‘ã 7.27.10Ž‘BãÅfile‘¡E‰ff&fŽ–Ç«permission/2²,‘UUÅfile‘¡E‰ff&fŽ“exists/1‘p ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö146ŽŽ¡‘ã 7.27.11Ž‘BãÅfile‘¡E‰ff&fŽ‘Ç«property/2‘F‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö147ŽŽ¡‘ã 7.27.12Ž‘BãÅtemporary‘¡E‰ff&fŽ‘Ç«name/2‘Í/‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö148ŽŽ¡‘ã 7.27.13Ž‘BãÅtemporary‘¡E‰ff&fŽ‘Ç«file/3‘Í/‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö149ŽŽ¡‘ã 7.27.14Ž‘BãÅdate‘¡E‰ff&fŽ‘Ç«time/1‘ðÌ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö149ŽŽ¡‘ã 7.27.15Ž‘BãÅhost‘¡E‰ff&fŽ‘Ç«name/1‘ðÌ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö150ŽŽ¡‘ã 7.27.16Ž‘BãÅos‘¡E‰ff&fŽ‘Ç«version/1‘wä‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö150ŽŽ¡‘ã 7.27.17Ž‘BãÅarchitecture/1F­‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö151ŽŽŽŸŽŒ‹Kd Ú‹– ý"EŸüfd‘øã²6ŽŽŽ’‡SCCONTENTSŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã 7.27.18Ž‘BãÅshell/2²,–UUÅshell/1²,“Åshell/0‘¿q‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö151ŽŽ¤ ‘ã 7.27.19Ž‘BãÅsystem/2²,‘UUÅsystem/1‘ÿ€‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö152ŽŽ¡‘ã 7.27.20Ž‘BãÅspawn/3²,‘UUÅspawn/2‘ñP‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö152ŽŽ¡‘ã 7.27.21Ž‘BãÅpopen/3‘êD‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö153ŽŽ¡‘ã 7.27.22Ž‘BãÅexec/5²,‘UUÅexec/4‘ª5‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö153ŽŽ¡‘ã 7.27.23Ž‘BãÅfork‘¡E‰ff&fŽ‘Ç«prolog/1‘þü‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö154ŽŽ¡‘ã 7.27.24Ž‘BãÅcreate‘¡E‰ff&fŽ‘Ç«pipe/2‘þü‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö154ŽŽ¡‘ã 7.27.25Ž‘BãÅwait/2‘c,‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö155ŽŽ¡‘ã 7.27.26Ž‘BãÅprolog‘¡E‰ff&fŽ‘Ç«pid/1‘wä‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö155ŽŽ¡‘ã 7.27.27Ž‘BãÅsend‘¡E‰ff&fŽ‘Ç«signal/2‘þü‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö156ŽŽ¡‘ã 7.27.28Ž‘BãÅsleep/1‘êD‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö156ŽŽ¡‘ã 7.27.29Ž‘BãÅselect/5‘ªG‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö156ŽŽ¡‘ã7.28Ž‘ã SoGc•¸ãk“ets‘UUinput/output‘ÔÑü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö157ŽŽ¡‘ã 7.28.1Ž‘BãIn¸ãtroGduction‘xP‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö157ŽŽ¡‘ã 7.28.2Ž‘BãÅsocket/2‘ªG‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö158ŽŽ¡‘ã 7.28.3Ž‘BãÅsocket‘¡E‰ff&fŽ‘Ç«close/1‘¾ÿ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö158ŽŽ¡‘ã 7.28.4Ž‘BãÅsocket‘¡E‰ff&fŽ‘Ç«bind/2‘þü‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö159ŽŽ¡‘ã 7.28.5Ž‘BãÅsocket‘¡E‰ff&fŽ‘Ç«connect/4‘Í/‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö159ŽŽ¡‘ã 7.28.6Ž‘BãÅsocket‘¡E‰ff&fŽ‘Ç«listen/2‘F‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö160ŽŽ¡‘ã 7.28.7Ž‘BãÅsocket‘¡E‰ff&fŽ–Ç«accept/4²,‘UUÅsocket‘¡E‰ff&fŽ“accept/3‘p ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö160ŽŽ¡‘ã 7.28.8Ž‘BãÅhostname‘¡E‰ff&fŽ‘Ç«address/2‘J‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö161ŽŽ¡‘ã7.29Ž‘ã Linedit‘UUmanagemen¸ãt‘[á‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö162ŽŽ¡‘ã 7.29.1Ž‘BãÅget‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“prompt/1‘Ó·‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö162ŽŽ¡‘ã 7.29.2Ž‘BãÅset‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“prompt/1‘Ó·‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö162ŽŽ¡‘ã 7.29.3Ž‘BãÅadd‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“completion/1‘)‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö162ŽŽ¡‘ã 7.29.4Ž‘BãÅfind‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“completion/2‘°‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö163ŽŽ¡‘ã7.30Ž‘ã Source–UUreader“facilit¸ãy‘£‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö163ŽŽ¡‘ã 7.30.1Ž‘BãIn¸ãtroGduction‘xP‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö163ŽŽ¡‘ã 7.30.2Ž‘BãÅsr‘¡E‰ff&fŽ‘Ç«open/3‘©±‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.3Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«change‘¡E‰ff&fŽ“options/2LŸ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.4Ž‘BãÅsr‘¡E‰ff&fŽ‘Ç«close/1‘0É‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.5Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«read‘¡E‰ff&fŽ“term/4‘7Q‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.6Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«current‘¡E‰ff&fŽ“descriptor/1‘¡ê‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.7Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“stream/2‘¾i‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.8Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“module/3‘¾i‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.9Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“file‘¡E‰ff&fŽ“name/2‘î‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.10Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“position/3‘„‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.11Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“include‘¡E‰ff&fŽ“list/2‘Ó!‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.12Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“include‘¡E‰ff&fŽ“stream‘¡E‰ff&fŽ“list/2‘§Ü‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.13Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“size‘¡E‰ff&fŽ“counters/3‘“$‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.14Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“error‘¡E‰ff&fŽ“counters/3‘<‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.15Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“error‘¡E‰ff&fŽ“counters/3‘<‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.16Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«error‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“exception/2‘aW‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.17Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«write‘¡E‰ff&fŽ“message/8²,›UUÅsr‘¡E‰ff&fŽ“write‘¡E‰ff&fŽ“message/6²,˜Åsr‘¡E‰ff&fŽ“write‘¡E‰ff&fŽ“message/4‘¦y‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽ¡‘ã 7.30.18Ž‘BãÅsr‘¡E‰ff&fŽ–Ç«write‘¡E‰ff&fŽ“error/6²,›UUÅsr‘¡E‰ff&fŽ“write‘¡E‰ff&fŽ“error/4²,˜Åsr‘¡E‰ff&fŽ“write‘¡E‰ff&fŽ“error/2‘ ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö164ŽŽŸ‘øãÄ8Ž‘ãFinite–ÕTdomain“solv®9er“and“built-in“predicates’ÉŽ165ŽŽ¡‘ã²8.1Ž‘ã In¸ãtroGduction‘”î‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö165ŽŽ¡‘ã 8.1.1Ž‘BãFinite–UUDomain“v‘ÿqÇariables‘”‡‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö165ŽŽ¡‘ã8.2Ž‘ã FD–UUv‘ÿqÇariable“parameters‘M™‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö166ŽŽ¡‘ã 8.2.1Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer/1~l‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö166ŽŽ¡‘ã 8.2.2Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«vector‘¡E‰ff&fŽ“max/1‘¾i‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö166ŽŽ¡‘ã 8.2.3Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“vector‘¡E‰ff&fŽ“max/1‘Äñ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö167ŽŽ¡‘ã8.3Ž‘ã Initial–UUv‘ÿqÇalue“constrain¸ãts‘”µ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö167ŽŽ¡‘ã 8.3.1Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«domain/3²,‘UUÅfd‘¡E‰ff&fŽ“domain‘¡E‰ff&fŽ“bool/1S‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö167ŽŽ¡‘ã 8.3.2Ž‘BãÅfd‘¡E‰ff&fŽ‘Ç«domain/2‘ðÌ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö168ŽŽ¡‘ã8.4Ž‘ã T¸ãypGe‘UUtesting‘ư‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö168ŽŽŽŸŽŒ‹¨  Ú‹– ý"EŸüfd‘øã²CONTENTSŽŽŽ’»!‚7ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã 8.4.1Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«var/1²,›UUÅnon‘¡E‰ff&fŽ“fd‘¡E‰ff&fŽ“var/1²,˜Ågeneric‘¡E‰ff&fŽ“var/1²,˜Ånon‘¡E‰ff&fŽ“generic‘¡E‰ff&fŽ“var/1‘ûÑ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö168ŽŽ¤ ‘ã8.5Ž‘ã FD–UUv‘ÿqÇariable“information‘âê‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö169ŽŽ¡‘ã 8.5.1Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«min/2²,›UUÅfd‘¡E‰ff&fŽ“max/2²,˜Åfd‘¡E‰ff&fŽ“size/2²,˜Åfd‘¡E‰ff&fŽ“dom/2‘½‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö169ŽŽ¡‘ã 8.5.2Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«has‘¡E‰ff&fŽ“extra‘¡E‰ff&fŽ“cstr/1²,›UUÅfd‘¡E‰ff&fŽ“has‘¡E‰ff&fŽ“vector/1²,˜Åfd‘¡E‰ff&fŽ“use‘¡E‰ff&fŽ“vector/1‘Bh‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö170ŽŽ¡‘ã8.6Ž‘ã Arithmetic‘UUconstrain¸ãts‘i‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö170ŽŽ¡‘ã 8.6.1Ž‘BãFD–UUarithmetic“expressions‘ÆI‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö170ŽŽ¡‘ã 8.6.2Ž‘BãP•¸ãartial›UUA“C:˜Å(#=)/2˜²-˜constrain“t˜equal,˜Å(#\=)/2˜²-˜constrain“t˜not˜equal,Ž¡‘BãÅ(#<)/2–UU²-“constrainš¸ãt“less“than,“Å(#=<)/2“²-“constrain˜t“less“than“or“equal,Ž¡‘BãÅ(#>)/2–UU²-“constrainš¸ãt“greater“than,“Å(#>=)/2“²-“constrain˜t“greater“than“or“equal‘E’‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ‘ xö171ŽŽ¡‘ã 8.6.3Ž‘BãF‘ÿ*ªull–UUAš¸ãC:“Å(#=#)/2“²-“constrain˜t“equal,“Å(#\=#)/2“²-“constrain˜t“not“equal,Ž¡‘BãÅ(#<#)/2–UU²-“constrainš¸ãt“less“than,“Å(#=<#)/2“²-“constrain˜t“less“than“or“equal,Ž¡‘BãÅ(#>#)/2–UU²-“constrainš¸ãt“greater“than,“Å(#>=#)/2“²-“constrain˜t“greater“than“or“equal‘Œ­‘ü.ŽŽ‘Ç‘ü.ŽŽ‘ xö172ŽŽ¡‘ã 8.6.4Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«prime/1²,‘UUÅfd‘¡E‰ff&fŽ“not‘¡E‰ff&fŽ“prime/1‘„â‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö173ŽŽ¡‘ã8.7Ž‘ã BoGolean–UUand“rei ed“constrain¸ãts‘Mw‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö173ŽŽ¡‘ã 8.7.1Ž‘BãBoGolean–UUFD“expressions­‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö173ŽŽ¡‘ã 8.7.2Ž‘BãÅ(#\)/1–UU²-“constrainš¸ãt“NOT,“Å(#<=>)/2“²-“constrain˜t“equiv‘ÿqÇalen˜t,Ž¡‘BãÅ(#\<=>)/2–UU²-“constrainš¸ãt“di eren˜t,“Å(##)/2“²-“constrain˜t“X˜OR,Ž¡‘BãÅ(#==>)/2–UU²-“constrainš¸ãt“imply‘ÿ*ª,“Å(#\==>)/2“²-“constrain˜t“not“imply‘ÿ*ª,Ž¡‘BãÅ(#/\)/2–UU²-“constrainš¸ãt“AND,“Å(#\/\)/2“²-“constrain˜t“NAND,Ž¡‘BãÅ(#\/)/2–UU²-“constrainš¸ãt“OR,“Å(#\\/)/2“²-“constrain˜t“NORi”‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö174ŽŽ¡‘ã 8.7.3Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«cardinality/2²,›UUÅfd‘¡E‰ff&fŽ“cardinality/3²,˜Åfd‘¡E‰ff&fŽ“at‘¡E‰ff&fŽ“least‘¡E‰ff&fŽ“one/1²,˜Åfd‘¡E‰ff&fŽ“at‘¡E‰ff&fŽ“most‘¡E‰ff&fŽ“one/1²,Ž¡‘BãÅfd‘¡E‰ff&fŽ–Ç«only‘¡E‰ff&fŽ“one/1‘°9‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö175ŽŽ¡‘ã8.8Ž‘ã Sym•¸ãbGolic‘UUconstrain“ts‘†Œ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö176ŽŽ¡‘ã 8.8.1Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«all‘¡E‰ff&fŽ“different/1‘Œœ‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö176ŽŽ¡‘ã 8.8.2Ž‘BãÅfd‘¡E‰ff&fŽ‘Ç«element/3‘wä‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö176ŽŽ¡‘ã 8.8.3Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«element‘¡E‰ff&fŽ“var/3~l‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö177ŽŽ¡‘ã 8.8.4Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«atmost/3²,›UUÅfd‘¡E‰ff&fŽ“atleast/3²,˜Åfd‘¡E‰ff&fŽ“exactly/3‘¨N‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö177ŽŽ¡‘ã 8.8.5Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«relation/2²,‘UUÅfd‘¡E‰ff&fŽ“relationc/2‘¡Ø‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö178ŽŽ¡‘ã8.9Ž‘ã LabGeling‘UUconstrain¸ãts‘›â‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö179ŽŽ¡‘ã 8.9.1Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«labeling/2²,›UUÅfd‘¡E‰ff&fŽ“labeling/1²,˜Åfd‘¡E‰ff&fŽ“labelingff/1‘D´‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö179ŽŽ¡‘ã8.10Ž‘ã Optimization‘UUconstrain¸ãts‘z‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö180ŽŽ¡‘ã 8.10.1Ž‘BãÅfd‘¡E‰ff&fŽ–Ç«minimize/2²,‘UUÅfd‘¡E‰ff&fŽ“maximize/2‘À‘ü².ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö180ŽŽŸ‘øãÄ9Ž‘ãIn®9terfacing–ÕTProlog“and“C’)R<183ŽŽ¡‘ã²9.1Ž‘ã Calling–UUC“from“Prolog‘ÛÙ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö183ŽŽ¡‘ã 9.1.1Ž‘BãIn¸ãtroGduction‘xP‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö183ŽŽ¡‘ã 9.1.2Ž‘BãÅforeign/2‘UU²directiv¸ãe‘o‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö183ŽŽ¡‘ã 9.1.3Ž‘BãThe–UUC“function‘Ô´‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö184ŽŽ¡‘ã 9.1.4Ž‘BãInput‘UUargumen¸ãts‘ê‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö185ŽŽ¡‘ã 9.1.5Ž‘BãOutput‘UUargumen¸ãts‘¢á‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö185ŽŽ¡‘ã 9.1.6Ž‘BãInput/output‘UUargumen¸ãts‘[¢‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö185ŽŽ¡‘ã 9.1.7Ž‘BãW‘ÿ*ªriting–UUnon-deterministic“C“coGde‘ D‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö186ŽŽ¡‘ã 9.1.8Ž‘BãExample:‘qÇinput–UUand“output“argumen¸ãts‘7Ï‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö186ŽŽ¡‘ã 9.1.9Ž‘BãExample:‘qÇnon-deterministic‘UUcoGde‘â—‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö187ŽŽ¡‘ã 9.1.10Ž‘BãExample:‘qÇinput/output‘UUargumen¸ãts‘pÑü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö189ŽŽ¡‘ã9.2Ž‘ã Manipulating–UUProlog“terms‘i‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö190ŽŽ¡‘ã 9.2.1Ž‘BãIn¸ãtroGduction‘xP‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö190ŽŽ¡‘ã 9.2.2Ž‘BãManaging–UUProlog“atoms8‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö191ŽŽ¡‘ã 9.2.3Ž‘BãReading–UUProlog“terms‘¸(‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö191ŽŽ¡‘ã 9.2.4Ž‘BãUnifying–UUProlog“terms‘±‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö192ŽŽ¡‘ã 9.2.5Ž‘BãCreating–UUProlog“terms‘bË‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö194ŽŽ¡‘ã 9.2.6Ž‘BãT‘ÿ*ªesting–UUthe“t¸ãypGe“of“Prolog“terms‘÷÷‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö194ŽŽ¡‘ã 9.2.7Ž‘BãComparing–UUProlog“terms‘›¤‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö195ŽŽ¡‘ã 9.2.8Ž‘BãCop¸ãying–UUProlog“terms‘M|‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö195ŽŽ¡‘ã 9.2.9Ž‘BãComparing–UUand“ev‘ÿqÇaluating“arithmetic“expressions‘0‚‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö196ŽŽ¡‘ã9.3Ž‘ã Raising–UUProlog“errors‘r‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö196ŽŽ¡‘ã 9.3.1Ž‘BãManaging–UUthe“error“con¸ãtext€‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö196ŽŽŽŸŽŒ‹‘ Ú‹– ý"EŸüfd‘øã²8ŽŽŽ’‡SCCONTENTSŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã 9.3.2Ž‘BãInstan¸ãtiation‘UUerror‘ÛÆ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö196ŽŽ¤ ‘ã 9.3.3Ž‘BãT¸ãypGe‘UUerror‘j#‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö196ŽŽ¡‘ã 9.3.4Ž‘BãDomain‘UUerror‘*‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö197ŽŽ¡‘ã 9.3.5Ž‘BãExistence‘UUerror‘ª ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö197ŽŽ¡‘ã 9.3.6Ž‘BãP¸ãermission‘UUerror‘|‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö197ŽŽ¡‘ã 9.3.7Ž‘BãRepresen¸ãtation‘UUerror‘‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö197ŽŽ¡‘ã 9.3.8Ž‘BãEv‘ÿqÇaluation‘UUerror‘*‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö198ŽŽ¡‘ã 9.3.9Ž‘BãResource‘UUerror‘[Ü‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö198ŽŽ¡‘ã 9.3.10Ž‘BãSyn¸ãtax‘UUerror‘j‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö198ŽŽ¡‘ã 9.3.11Ž‘BãSystem‘UUerror‘?o‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö199ŽŽ¡‘ã9.4Ž‘ã Calling–UUProlog“from“C‘ÛÙ‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö199ŽŽ¡‘ã 9.4.1Ž‘BãIn¸ãtroGduction‘xP‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö199ŽŽ¡‘ã 9.4.2Ž‘BãExample:‘qÇÅmy‘¡E‰ff&fŽ‘Ç«call/1–UU²-“a“Åcall/1“²clone‘…¼‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö200ŽŽ¡‘ã 9.4.3Ž‘BãExample:‘qÇreco•¸ãv“ering–UUthe“list“of“all“opGerators‘-‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö202ŽŽ¡‘ã9.5Ž‘ã De ning–UUa“new“C“Åmain()“²function‘x)‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö203ŽŽ¡‘ã 9.5.1Ž‘BãExample:‘qÇasking–UUfor“ancestors‘?‘ü.ŽŽ–Ç‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘ xö204ŽŽ¤‘ãÄReferences’pÿþ207ŽŽ¡‘ãIndex’Šƒà209ŽŽŽŸŽŒ‹ LÀ Ú‹– ý"EŸüfd’»!‚²9ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øã¼1Ž‘/ÒAc•ŒÌkno“wledgemen“tsŽŸ!ç‘øã²I‘uÌw•¸ãould›uÕlik“e˜to–uÔthank˜the“departmen¸ãt˜of˜computing“scienceŸü^ÿ±2ŽŽ‘òH²at˜the“univ•¸ãersit“y˜of‘uÔP“aris˜1˜for‘uÔallo“wing˜meޤ ‘øãthe–UUtime“and“freedom“necessary“to“ac•¸ãhiev“e–UUthis“pro‘Ž8ject.Ž©‘øãI‘kam–™grateful“to“the“mem¸ãbšGers“of“the‘˜Lo˜co“pro‘Ž8jectŸü^ÿ±3ŽŽ‘‚ ²at“INRIA‘kRo˜cquencourtŸü^ÿ±4ŽŽ‘‚ ²for“their“encouragemen¸ãt.Ž¡‘øãTheir›UUin•¸ãv“olv“emen“t˜in˜this˜w“ork˜led˜to˜useful˜feedbac“k˜and˜exc“hange.ަ‘øãI‘ÈÂw•¸ãould›Èåparticularly‘Èælik“e˜to–Èæthank˜Jonathan“HoGdgsonŸü^ÿ±5ŽŽ‘EX²for˜the“time˜and“e ort˜he“put˜in¸ãto“the˜proGofreadingŽ¡‘øãof–åthis›æman¸ãual.‘_÷His“suggestions,‘*•bGoth˜regarding“ISO‘Øtecš¸ãhnical“aspGects“as“w˜ell›æas“the“language“in˜whic¸ãh“itŽ¡‘øãwš¸ãas–UUexpressed,“pro˜v˜ed“in˜v‘ÿqÇaluable.ަ‘øãThe–DÜon-line“HTML‘DØvš¸ãersion“of‘DÝthis“doGcumen˜t“w˜as“created“using“H‘þ€Ÿÿ#±EŽ–` ²V‘þ€Ÿÿ#±EŽ“²AŸü^ÿ±6ŽŽ‘ÁK²dev˜elopGed‘DÝb˜y–DÜLuc“Maranget“whoŽ¡‘øãkindly– Œdevš¸ãoted‘ ‹so“m˜uc˜h› ‹of“his˜time“extending“the˜capabilities“of˜H‘þ€Ÿÿ#±EŽ–` ²V‘þ€Ÿÿ#±EŽ“²A‘ zin˜order– Œto˜handle“suc¸ãh˜a“sizeableŽ¡‘øãman¸ãual.ަ‘øãJean-Christophe–§ÁAude“kindly›§Àimpro•¸ãv“ed–§Áthe“visual“aspGect“of˜bGoth“the“illustrations“and“the˜GNU‘§¬PrologŽ¡‘øãw¸ãeb‘UUpages.ަ‘øãThanks–ïŸto“Ricš¸ãhard“A.“O'Keefe“for“his‘ï advice“regarding“the“implemen˜tation“of“some“Prolog“built-inŽ¡‘øãpredicates–UUand“for“suggesting“me“the“in-place“installation“feature.ަ‘øãManš¸ãy–UUthanks“to“the“follo˜wing“con˜tributors:ޤ‘ãó !",š cmsy10¸ŽŽŽ‘ã ²Alexander–UUDiemandŸü^ÿ±7ŽŽ‘ÑȲfor“his“initial“pGort“to“alpha/lin¸ãux.Ž¡‘ã¸ŽŽŽ‘ã ²Cliv•¸ãe›UUCo“xŸü^ÿ±8ŽŽ‘ÑȲand˜Edm“und˜Grimley˜Ev‘ÿqÇansŸü^ÿ±9ŽŽ‘ÑȲfor˜their˜pGort˜to˜ix86/SCO.Ž¡‘ã¸ŽŽŽ‘ã ²Nicolas–UUOllingerŸü^ÿ±10ŽŽ‘ Î;²to“for“his“pGort“to“ix86/F‘ÿ*ªreeBSD.Ž¡‘ã¸ŽŽŽ‘ã ²BrošGok–UUMilliganŸü^ÿ±11ŽŽ‘ Î;²for“his“p˜ort“to“ix86/NetBSD“and“for“general“con guration“impro•¸ãv“emen“ts.Ž¡‘ã¸ŽŽŽ‘ã ²Andreas›UUStolc•¸ãk“eŸü^ÿ±12ŽŽ‘ Î;²for˜his˜pGort˜to˜ix86/Solaris.Ž¡‘ã¸ŽŽŽ‘ã ²Lindsey–UUSprattŸü^ÿ±13ŽŽ‘ Î;²for“his“pšGort“to“p˜o•¸ãw“erp˜c/Darwin–UU(MacOS“X).Ž¡‘ã¸ŽŽŽ‘ã ²Gw•¸ãenol“‘ûGe›UUBeauc“hesneŸü^ÿ±14ŽŽ‘ Î;²for˜his˜pGort˜to˜x86‘™˜‰ffŽ‘™š64/Lin“ux.Ž¡‘ã¸ŽŽŽ‘ã ²Jason–UUBeeganŸü^ÿ±15ŽŽ‘ Î;²for“his“pšGort“to“sparc/NetBSD“and“to“p˜o•¸ãw“erp˜c/NetBSD.Ž¡‘ã¸ŽŽŽ‘ã ²Cesar–UURabakŸü^ÿ±16ŽŽ‘ Î;²for“his“initial“pGort“to“ix86/MinGW.Ž¡‘øãMan¸ãy–UUthanks“to“all“those“pšGeople“at“GNUŸü^ÿ±17ŽŽ‘ Î;²who“help˜ed“me“to“ nalize“the“GNU“Prolog“pro‘Ž8ject.ަ‘øãFinally‘ÿ*ª,‘nI‘ÁÙw•¸ãould›Â6lik“e–Â7to˜thank“ev¸ãeryb•Go“dy˜who˜tested–Â7preliminary˜releases“and˜helpGed“me˜to“put˜theŽŸ ‘øã nishing–UUtouc¸ãhes“to“this“system.Ž‘øãŸ ’±‰ff¶HŸ J=‘ "5Ÿý-:¾2ŽŽŽ‘LÜÃhttp://panoramix.univ-paris1.fr/CRINFO/ޤ Š>‘ "5Ÿý-:¾3ŽŽŽ‘LÜÃhttp://loco.inria.fr/Ž¡‘ "5Ÿý-:¾4ŽŽŽ‘LÜÃhttp://www.inria.fr/Unites/ROCQUENCOURT-eng.htmlŽ¡‘ "5Ÿý-:¾5ŽŽŽ‘LÜÃhttp://www.sju.edu/~jhodgsonŽ¡‘ "5Ÿý-:¾6ŽŽŽ‘LÜÃhttp://pauillac.inria.fr/~maranget/hevea/Ž¡‘ "5Ÿý-:¾7ŽŽŽ‘LÜÃax@apax.netŽ¡‘ "5Ÿý-:¾8ŽŽŽ‘LÜÃclive@laluna.demon.co.ukŽ¡‘ "5Ÿý-:¾9ŽŽŽ‘LÜÃhttp://www.rano.org/Ž¡‘wŽŸý-:¾10ŽŽŽ‘LÜÃnollinge@ens-lyon.frŽ¡‘wŽŸý-:¾11ŽŽŽ‘LÜÃbrook@nmsu.eduŽ¡‘wŽŸý-:¾12ŽŽŽ‘LÜÃhttp://www.speech.sri.com/people/stolcke/Ž¡‘wŽŸý-:¾13ŽŽŽ‘LÜÃspratt@alum.mit.eduŽ¡‘wŽŸý-:¾14ŽŽŽ‘LÜÃgbeauchesne@mandrakesoft.comŽ¡‘wŽŸý-:¾15ŽŽŽ‘LÜÃjtb@netbsd.orgŽ¡‘wŽŸý-:¾16ŽŽŽ‘LÜÃcsrabak@ig.com.brŽ¡‘wŽŸý-:¾17ŽŽŽ‘LÜÃhttp://www.gnu.orgŽŽŸŽŒ‹ g  Ú‹– ý"EŸüfd‘øã²10ŽŽŽ’:Ž1‘ A•¸ãCKNO“WLEDGEMENTSŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ»ŸŽŒ‹ v Ú‹– ý"EŸüfd’¶!²11ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øã¼2Ž‘/ÒInŒÌtros3ductionŽŸ!ç‘øã²GNU‘ Prolog–[5Ž‘]“is“a“free“Prolog‘compiler“with“constrainš¸ãt“solving“o˜v˜er“ nite‘domains“dev˜elopGed“b˜y“Danielޤ ‘øãDiazŸü^ÿ±18ŽŽ›xæ².‘qÇF‘ÿ*ªor–UUrecen¸ãt“information“abGout“GNU“Prolog“please“consult“the“GNU“Prolog“pageŸü^ÿ±19ŽŽ˜².Ž©‘øãGNU›¦Prolog–¶is“a“Prolog“compiler“based‘·on“the“W‘ÿ*ªarren“Abstract“Mac¸ãhine“(W‘þãAM)˜[9Ž‘,“1Ž‘·].‘[èIt“ rst“compilesŽ¡‘øãa–£tProlog›£sprogram“to“a˜W‘þãAM‘£` le“whic¸ãh˜is“then“translated“to˜a“lo•¸ãw-lev“el‘£tmac“hine˜indepGenden“t‘£tlanguageŽ¡‘øãcalled–éumini-assem¸ãbly“spGeci cally“designed“for›étGNU‘éOProlog.‘.'The“resulting“ le˜is“then“translated“to“theŽ¡‘øãassemš¸ãbly–Ålanguage“of“the“target‘ÅŽmac˜hine“(from“whic˜h“an“ob‘Ž8ject“is“obtained).‘ÂpThis“allo˜ws“GNU‘ÅpPrologŽ¡‘øãto–ÛproGduce›Ûa“nativ¸ãe“stand“alone˜executable“from“a“Prolog˜source“(similarly“to“what˜doGes“a“C‘ÚöcompilerŽ¡‘øãfrom›+Ìa–+ÍC‘+Áprogram).‘cïThe“main˜adv‘ÿqÇan¸ãtage˜of“this˜compilation˜sc¸ãheme“is˜to˜proGduce“nativ¸ãe˜coGde˜and“to˜bGeŽ¡‘øãfast.‘žòAnother–ddin¸ãteresting›dcfeature“is˜that“executables˜are“small.‘žòIndeed,‘h(the˜coGde“of˜most“un¸ãused˜built-inŽ¡‘øãpredicates–UUis“not“included“in“the“executables“at“link-time.ަ‘øãA‘•lot–•®of“wš¸ãork“has‘•­bGeen“dev˜oted“to“the“ISO–•compatibilit˜y‘ÿ*ª.‘2ÑIndeed,‘¥ÄGNU“Prolog–•®is“v˜ery“close‘•­to“the“ISOŽ¡‘øãstandard–UUfor“PrologŸü^ÿ±20ŽŽ‘ Î;²[6Ž‘].ަ‘øãGNU‘ìaProlog–ì‡also›ìˆo ers“v‘ÿqÇarious˜extensions“v¸ãery˜useful˜in“practice˜(global“v‘ÿqÇariables,–TOS‘ìainš¸ãterface,“soGc˜k-Ž¡‘øãets,...).‘WLIn–âparticular,‘ÆGNU‘ÎProlog“conš¸ãtains“an‘ãecien˜t“constrain˜t“solv˜er“o˜v˜er“Finite‘ãDomains“(FD).“ThisŽ¡‘øãopGens›(‚con•¸ãtrain“t–(ƒlogic˜pGogramming“to˜the“user˜com¸ãbining˜the“pGo•¸ãw“er˜of‘(ƒconstrain“t˜programming‘(ƒto˜theŽ¡‘øãdeclarativitš¸ãy–’of“logic“programming.‘[†The“k˜ey‘‘feature“of“the“GNU‘Prolog“solv˜er“is“the“use‘‘of“a“single“(lo˜w-Ž¡‘øãlev•¸ãel)›ØÊprimitiv“e‘ØÉto˜de ne˜all˜(high-lev“el)›ØÉFD‘بconstrain“ts.‘ü&There˜are›ØÊman“y˜adv‘ÿqÇan“tages˜of‘ØÉthis˜approac“h:Ž¡‘øãconstrain¸ãts–ÂKcan›ÂLbGe“compiled,‘ß´the˜user“can˜de ne“his˜oš¸ãwn“constrain˜ts›ÂL(in“terms˜of“the˜primitivš¸ãe),‘ß´the“solv˜erŽ¡‘øãis–SìopGen›Sëand“extensible˜(as“oppGosed˜to“blac•¸ãk-bGo“x‘Sìsolv“ers˜lik“e‘SìCHIP),.–ªª.“.“Moreo•¸ãv“er,‘T4the˜GNU˜Prolog‘Sìsolv“erŽ¡‘øãis–UUrather“ecienš¸ãt,“often“more“than“commercial“solv˜ers.ަ‘øãGNU–UUProlog“is“inspired“from“t•¸ãw“o–UUsystems“devš¸ãelopGed“b˜y“the“same“author:Ž©Ä;‘ã¸ŽŽŽ‘ã Åwamcc²:‘-of“Prolog“to“C‘' via“the“W‘þãAM.Ž¡‘ã Its›ŠÆdra•¸ãwbac“k‘ŠÇw“as˜the˜time‘ŠÇneeded˜b“y‘®SÅgcc–ŠÇ²to˜compile˜the“proGduced˜sources.‘GNU‘ЏProlog“can˜alsoŽ¡‘ã proGduce–UUstand“alone“executables“but“using“a“faster“compilation“sc¸ãheme.ŽŸâ‘ã¸ŽŽŽ‘ã Åclp(FD)²:–ÀOa›ÀPconstrain¸ãt“programming˜language“o•¸ãv“er˜FD‘À3[4Ž‘].‘²·Its›ÀOk“ey˜feature‘ÀPw“as˜the–ÀPuse˜of“a˜singleŽ¡‘ã primitivš¸ãe–~ìto‘~ëde ne“FD–~áconstrain˜ts.‘î‹GNU“Prolog–~ìis›~ëbased“on“the“same˜idea“but“o ers˜an“extendedŽ¡‘ã constrain¸ãt–hDde nition“language.‘ª“In“comparison“to“Åclp(FD)²,“GNU‘h?Prolog‘hCo ers“new“prede ned“con-Ž¡‘ã strainš¸ãts,–UUnew“prede ned“heuristics,“rei ed“constrain˜ts,.–ªª.“.ަ‘øãHere–UUare“some“features“of“GNU“Prolog:ަ‘ã¸ŽŽŽ‘ã ²Prolog‘UUsystem:Ž¡‘# Ä{ŽŽŽ‘'ã ²conforms–ð¨to›ð§the“ISO‘ðŽstandard˜for“Prolog˜( oating“pGoinš¸ãt“n˜um˜bšGers,–Êstreams,“dynamic‘ð¨co˜de,.–ªª.“.“).Ž©â‘# Ä{ŽŽŽ‘'ã ²a–H°lot›H¯of“extensions:‘ktglobal“v‘ÿqÇariables,‘K7de nite˜clause“grammars“(DCG),˜sošGc•¸ãk“ets‘H°in“terface,‘K7op˜er-Ž¡‘'ã ating–UUsystem“in¸ãterface,.–ªª.“.ޤâ‘# Ä{ŽŽŽ‘'ã ²more–UUthan“300“Prolog“built-in“predicates.ަ‘# Ä{ŽŽŽ‘'ã ²Prolog–UUdebugger“and“a“lo•¸ãw-lev“el–UUW‘þãAM“debugger.Ž¡‘# Ä{ŽŽŽ‘'ã ²line–UUediting“facilitš¸ãy“under“the“in˜teractiv˜e“in˜terpreter“with“completion“on“atoms.ަ‘# Ä{ŽŽŽ‘'ã ²pšGo•¸ãw“erful–UUbidirectional“in¸ãterface“b˜et•¸ãw“een–UUProlog“and“C.ŽŸâ‘ã¸ŽŽŽ‘ã ²Compiler:ޤ ‘# Ä{ŽŽŽ‘'ã ²nativ¸ãe-cošGde–UUcompiler“pro˜ducing“stand“alone“executables.ަ‘# Ä{ŽŽŽ‘'ã ²simple–Fcommand-line›Fcompiler“accepting˜a“wide˜v‘ÿqÇariet¸ãy“of˜ les:‘S,Prolog“ les,–‚4C‘EÉ les,“W‘þãAMŽ¡‘'ã les,.–ªª.“.Ž‘øãŸ:J‰ff¶HŸ J=‘wŽŸý-:¾18ŽŽŽ‘LÜÃhttp://pauillac.inria.fr/~diazޤ Š>‘wŽŸý-:¾19ŽŽŽ‘LÜÃhttp://www.gnu.org/software/prologŽ¡‘wŽŸý-:¾20ŽŽŽ‘LÜÃhttp://www.logic-programming.org/prolog‘‚މffŒÐŽ‘^std.htmlŽŽŸŽŒ‹ v¡ Ú‹– ý"EŸüfd‘øã²12ŽŽŽ’_vÎ2‘ INTR¸ãODUCTIONŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘# Ä{ŽŽŽ‘'ã ²direct–UUgeneration“of“assem¸ãbly“coGde“15“times“faster“than“Åwamcc“²+“Ågcc².ޤ‘# Ä{ŽŽŽ‘'ã ²most–UUof“unš¸ãused“built-in“predicates“are“not“link˜ed“(to“reduce“the“size“of“the“executables).Ž¡‘# Ä{ŽŽŽ‘'ã ²compiled–UUpredicates“(nativš¸ãe-coGde)“as“fast“as“Åwamcmcc“²on“a˜v˜erage.Ž¡‘# Ä{ŽŽŽ‘'ã ²consulted–UUpredicates“(b¸ãyte-coGde)“5“times“faster“than“Åwamcc².ŽŸ‘ã¸ŽŽŽ‘ã ²Constrain•¸ãt‘UUsolv“er:ޤ ‘# Ä{ŽŽŽ‘'ã ²FD‘%%v‘ÿqÇariables–%1wš¸ãell“in˜tegrated“in˜to“the“Prolog“en˜vironmen˜t“(full“compatibilit˜y“with“Prolog“v‘ÿqÇari-Ž¡‘'ã ables–UUand“in¸ãtegers).‘qÇNo“need“for“explicit“FD“declarations.ޤ‘# Ä{ŽŽŽ‘'ã ²v•¸ãery›UUecien“t˜FD˜solv“er˜(comparable˜to˜commercial˜solv“ers).Ž¡‘# Ä{ŽŽŽ‘'ã ²high-lev•¸ãel›UUconstrain“ts˜can˜b•Ge˜describ“ed˜in˜terms˜of˜simple˜primitiv¸ães.Ž¡‘# Ä{ŽŽŽ‘'ã ²a–Ùƒlot“of“prede ned“constrain•¸ãts:‘z#arithmetic‘Ù„constrain“ts,›:Žb•Go“olean‘Ùƒconstrain•¸ãts,˜sym“bGolic‘Ùƒcon-ŽŸ ‘'ã strainš¸ãts,–UUrei ed“constrain˜ts,.–ªª.“.Ž¡‘# Ä{ŽŽŽ‘'ã ²sevš¸ãeral–UUprede ned“en˜umeration“heuristics.Ž¡‘# Ä{ŽŽŽ‘'ã ²the–UUuser“can“de ne“his“oš¸ãwn“new“constrain˜ts.Ž¡‘# Ä{ŽŽŽ‘'ã ²more–UUthan“50“FD“built-in“constrain¸ãts/predicates.ŽŽŸŽŒ‹ ŠC Ú‹– ý"EŸüfd’¶!²13ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øã¼3Ž‘/ÒUsing–ffGNU“PrologŽŸ#ç‘øãóÂÖN  cmbx12Ç3.1Ž‘£In tro`ductionŽ©uT‘øã²GNU–UUProlog“o ers“t•¸ãw“o›UUw“a“ys˜to˜execute˜a˜Prolog˜program:ޤl½‘ã¸ŽŽŽ‘ã ²inš¸ãterpreting–UUit“using“the“GNU“Prolog“in˜teractiv˜e“in˜terpreter.ŽŸ¶^‘ã¸ŽŽŽ‘ã ²compiling–UUit“to“a“(mac•¸ãhine-depšGenden“t)–UUexecutable“using“the“GNU“Prolog“nativ¸ãe-co˜de“compiler.Ž¡‘øãRunning–'•a“program‘'”under“the“in•¸ãteractiv“e›'•in“terpreter˜allo“ws–'”the˜user˜to˜list“it˜and˜to˜mak¸ãe˜full“use˜of˜theޤ ‘øãdebugger–¶ßon“it›¶Þ(section“4,‘ÏBpage˜29).‘–eCompiling“a“program˜to“nativš¸ãe“coGde“mak˜es“it“pGossible‘¶Þto“obtain“aŽ¡‘øãstand–©"alone“executable,‘Ë“with›©#a“reduced“size“and˜optimized“for“spGeed.‘8aRunning“a˜Prolog“program“compiledŽ¡‘øãto–¶nativ¸ãe-coGde›¶is“around˜3-5“times˜faster“than˜running“it˜under“the“in•¸ãterpreter.‘<µHo“w“ev“er,‘Õôit–¶is˜not“pGossibleŽ¡‘øãto–"mak¸ãe“full›"use“of“the“debugger˜on“a“program“compiled˜to“nativ¸ãe-cošGde.‘Ø#Nor“is“it“p˜ossible‘"to“list“theŽ¡‘øãprogram.‘…^In–[Ýgeneral,‘~it›[Üis“preferable“to˜run“a“program˜under“the˜in¸ãterpreter“for“debugging˜and“thenŽ¡‘øãuse–kgthe‘kfnativ¸ãe-cošGde“compiler“to“pro˜duce›kfan“autonomous“executable.‘³üIt˜is“also“pGossible“to˜com¸ãbine“theseŽ¡‘øãt•¸ãw“o›l¨moGdes‘l§b“y˜proGducing–l§an˜executable˜that“con¸ãtains˜some“parts˜of“the˜program˜(e.g.‘·¾already˜debuggedŽ¡‘øãpredicates–#øwhose›#ùexecution-time“spGeed˜is“crucial)“and˜in¸ãterpreting“the“other˜parts“under˜this“executable.Ž¡‘øãIn–$that›$case,‘W®the“executable˜has“the“same˜facilities“as˜the“GNU‘#ÍProlog“in¸ãterpreter“but˜also“in¸ãtegratesŽ¡‘øãthe–HÐnativš¸ãe-coGde‘HÏpredicates.‘m›This“w˜a˜y›HÏto“de ne“a˜new“enricš¸ãhed“in˜terpreter›HÏis“detailed“later˜(section“3.4.5,Ž¡‘øãpage‘UU25).ŽŸ'pK‘øãÇ3.2Ž‘£The–€GNU“Prolog“in• teractiv“e‘€in“terpreterަ‘øãÄ3.2.1Ž‘‰Starting/exiting–ÕTthe“in•®9teractiv“e‘ÕTin“terpreterަ‘øã²GNU‘!¸Prolog–!ío ers›!ìa“classical“Prolog˜in•¸ãteractiv“e›!íin“terpreter˜also‘!ìcalled˜óý': cmti10Ètop-level².‘׎It˜allo“ws˜the‘!ìuser˜toŽ¡‘øãexecute–Wåqueries,‘˜Što“consult“Prolog›Wæprograms,‘˜‰to“list˜them,‘˜‰to“execute“them˜and“to˜debug“them.‘yxTheŽ¡‘øãtop-levš¸ãel–UUcan“bGe“in˜v˜ok˜ed“using“the“follo˜wing“command:ŽŸl¼žæd‘ã Å%–?ýgprolog“²[óßê|ŽŽŽŽ ÃÝ» ý_"E‘øãwill– 2bGe› 1a¸ãv‘ÿqÇailable“using‘,¿Åargument‘¡E‰ff&fŽ‘Ç«value/2˜²(section“7.27.2,‘lpage˜143)“or“Åargument‘¡E‰ff&fŽ‘Ç«list/1˜²(section“7.27.3,ޤ ‘øãpage–ö143).‘SÍThe›öÅ--“²option“stops˜the“parsing˜of“the“command-line,‘,all“remainding“options˜are“collectedŽ¡‘øãinš¸ãto–UUthe“argumen˜t“list.ŽŸ‘øãSevš¸ãeral–UUoptions“are“pro˜vided“to“execute“a“goal“bGefore“en˜tering“the“in˜teraction“with“the“user:Ž©H‘ã¸ŽŽŽ‘ã ²The–ƒ3Å--init-goal›ƒ2²option“executes“the˜ÉGOAL‘?™²as“soGon˜as“it˜is“encoun¸ãtered“(while˜the“commnad-lineŽ¡‘ã is–UUprošGcessed).‘qÇÉGOAL‘Dzis“th¸ãus“executed“b˜efore“en¸ãtering‘xâÅtop‘¡E‰ff&fŽ‘Ç«level/0².ŽŸÈ$‘ã¸ŽŽŽ‘ã ²The–gïÅ--entry-goal“²option“executes“the“ÉGOAL‘$\²at“the“en¸ãtry‘gîof‘/ Åtop‘¡E‰ff&fŽ‘Ç«level/0“²just“after“the“banner“isŽ¡‘ã displa•¸ãy“ed.ŽŸÈ#‘ã¸ŽŽŽ‘ã ²The–UUÅ--query-goal“²option“executes“the“ÉGOAL‘Dzas“if“the“user“has“t¸ãypGed“in.ަ‘øãThe›9abGo•¸ãv“e˜order‘9is˜th“us˜the˜order˜in˜whic“h‘9eac“h˜kind˜of˜goal˜(init,‘>¹en“try‘ÿ*ª,‘>ºquery)˜is˜executed.‘h[If˜there˜areŽ¡‘øãsev¸ãeral–É¡goals“of“a›É¢same“kind“they“are“executed“in˜the“ošGder“of“app˜earance.‘C6Th¸ãus,‘å’all‘É¢init“goals“are“executedŽ¡‘øã(in–Îthe“order‘Íof“appšGearance)“b˜efore“all“enš¸ãtry“goals‘Íand“all“en˜try“goals“are“executed‘ÍbGefore“all“query“goals.Ž©‘øãEacš¸ãh–ÔÉGOAL‘T²is“passed“as“a“shell“argumen˜t›Ô(i.e.‘íÑone“shell“string)“and“should˜not“con¸ãtain“a“terminal“dot.Ž¡‘øãExample:‘…–Å--init-goal–?ý'write(hello),“nl'–ß<²under›ß=a“sh-lik¸ãe.‘}T‘ÿ*ªo˜bGe“executed,‘¶a˜ÉGOAL‘›‹²is“transformedŽ¡‘øãin¸ãto–,a›,term“using‘O¢Åread‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“atom(Goal,–?ýTerm,“[end‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“term(eof)])².‘dResp•Gecting‘,b“oth˜the‘,syn-Ž¡‘øãtax–$of“shell›$strings“and“of“Prolog“can˜bGe“hea¸ãvy–ÿ*ª.‘Þ F“or˜instance,‘WÆpassing–$a“bacš¸ãkslash“c˜haracter‘$Å\“²can“bGeŽ¡‘øãdicult–˃since“it“in¸ãtrošGduces“an“escap˜e“sequence“b˜oth“in“sh‘Ë‚and“inside“Prolog“quoted“atoms.‘ÔQThe“use“ofŽ¡‘øãbacš¸ãk– quotes“can“then“bGe“useful‘since,‘Åb˜y“default,‘Äno“escapšGe“sequence‘is“pro˜cessed“inside“bac¸ãk“quotes“(thisŽ¡‘øãbšGeha¸ãvior–UUcan“b˜e“con¸ãtrolled“using“the“Åback‘¡E‰ff&fŽ‘Ç«quotes“²Prolog“ ag“(section“7.22.1,“page“133)).ަ‘øãSince–z the›z Prolog“argumen¸ãt˜list“is˜created“when˜the“whole˜command-line“is˜parsed,‘¥èif“a˜Å--init-goal“²optionŽ¡‘øãuses–†äÅargument‘¡E‰ff&fŽ›Ç«value/2‘†ã²or“Åargument‘¡E‰ff&fŽ˜list/1“²it“will›†ãobtained“the“original“command-line˜argumen¸ãts“(i.e.Ž¡‘øãincluding–UUall“recognized“argumen¸ãts).ަ‘øãHere–UUis“an“example“of“using“execution“goal“options:Ž©H‘ã Å%–?ýgprolog“--init-goal“'write(before),“nl'“--entry-goal“'write(inside),“nl'Ž¡‘ã --query-goal‘?ý'append([a,b],[c,d],X)'ަ‘øã²will–UUproGduce“the“follo¸ãwing:Ž©G‘ã ÅbeforeŽ¡‘ã GNU–?ýProlog“1.2.9Ž¡‘ã By–?ýDaniel“DiazŽ¡‘ã Copyright–?ý(C)“1999-2007“Daniel“DiazŽ¡‘ã insideŽ¡‘ã |–?ý?-“append([a,b],[c,d],X).Ž¡¡‘ã X–?ý=“[a,b,c,d]Ž¡¡‘ã yesŽ¡‘ã |‘?ý?-ŽŸ%æ*‘øãÄ3.2.2Ž‘‰The›ÕTin•®9teractiv“e˜in“terpreter˜read-execute-write˜loQÇopŽŸuT‘øã²The–ÍáGNU‘Í¿Prolog“top-lev¸ãel“is“built›Íâon“a“classical“read-execute-write“loGop“that˜also“allo¸ãws“for“re-executionsŽ¡‘øã(when–UUthe“query“is“not“deterministic)“as“follo¸ãws:ަ‘ã¸ŽŽŽ‘ã ²displa¸ãy–UUthe“prompt,“i.e.‘qÇ'Å|‘?ý?-²'.ޤÈ$‘ã¸ŽŽŽ‘ã ²read–UUa“query“(i.e.‘qÇa“goal).Ž¡‘ã¸ŽŽŽ‘ã ²execute–UUthe“query‘ÿ*ª.ŽŽŸŽŒ‹ ) Ú‹– ý"EŸüfd‘øã²3.2‘ The–UUGNU“Prolog“in•¸ãteractiv“e‘UUin“terpreterŽŽŽ’¶!15ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã¸ŽŽŽ‘ã ²in–UUcase“of“success“displa¸ãy“the“v›ÿqÇalues“of“the“v˜ariables“of“the“query‘ÿ*ª.ŽŸÁ@‘ã¸ŽŽŽ‘ã ²if–çVthere›çWare“remaining“alternativ¸ães“(i.e.‘Mthe˜query“is“not“deterministic),‘ýWdispla¸ãy“a“Å?‘M²and“ask˜the“userޤ ‘ã who–PÇcan“use“one“of“the“follo¸ãwing“commands:‘o€ÅRETURN‘PŲto“stop“the“execution,‘Q°Å;‘RL²to“compute“the“nextŽ¡‘ã solution–UUor“Åa“²to“compute“all“remaining“solution.ŽŸ‚‘øãHere–Lsis“an“example“of“execution“of“a“query“(\ nd“the“lists“ÅX›Lq²and“ÅY‘Lp²suc¸ãh“that“the“concatenation“of‘ÅX˜²andŽ¡‘øãÅY–UU²is“Å[a,b]²"):Ž©e‚Ÿ«æd‘ã Å|–?ý?-“append(X,Y,[a,b,c]).ŽŽ¡¡‘ã X–?ý=“[]ŽŽ¡‘ã Y–?ý=“[a,b,c]“?‘ ú;ŽŽŽ’ƒ²©²(here–UUthe“user“presses“Å;“²to“compute“another“solution)ŽŽ¡¡‘ã ÅX–?ý=“[a]ŽŽ¡‘ã Y–?ý=“[b,c]“?‘ úaŽŽŽ’ƒ²©²(here–UUthe“user“presses“Åa“²to“compute“all“remaining“solutions)ŽŽ¡¡‘ã ÅX–?ý=“[a,b]ŽŽ¡‘ã Y–?ý=“[c]ŽŽŽ’ƒ²©²(here–UUthe“user“is“not“ask¸ãed“and“the“next“solution“is“computed)ŽŽ¡¡‘ã ÅX–?ý=“[a,b,c]ŽŽ¡‘ã Y–?ý=“[]ŽŽŽ’ƒ²©²(here–UUthe“user“is“not“ask¸ãed“and“the“next“solution“is“computed)ŽŽ¡¡‘ã ÅnoŽŽŽ’ƒ²©²(no–UUmore“solution)ŽŽŽŽŽ¦‘øãIn–TÑsome›TÐcases“the˜top-lev¸ãel“can“detect˜that“the˜curren¸ãt“solution˜is“the“last˜one“(no˜more“alternativ¸ãesŽ¡‘øãremaining).‘qÇIn–UUsucš¸ãh“a“case“it“doGes“not“displa˜y“the“Å?‘qDzsym˜bšGol“(and“do˜es“not“ask“the“user).‘qÇExample:ŽŸ5‚ŸÛæd‘ã Å|–?ý?-“(X=1“;“X=2).ŽŽ¡¡‘ã X–?ý=“1“?‘ ú;ŽŽŽ’ƒ²©²(here–UUthe“user“presses“Å;“²to“compute“another“solution)ŽŽ¡¡‘ã ÅX–?ý=“2ŽŽŽ’ƒ²©²(here–UUthe“user“is“not“prompted“since“there“are“no“more“alternativ¸ães)ŽŽ¡¡‘ã ÅyesŽŽŽŽŽŸ4ôH‘øã²The–UUuser“can“stop“the“execution“evš¸ãen“if“there“are“more“alternativ˜es“b˜y“t˜yping‘xâÅRETURN².Ž©(ôHŸçæd‘ã Å|–?ý?-“(X=1“;“X=2).ŽŽ¡¡‘ã X–?ý=“1“?ŽŽŽ’ƒ²©²(here–UUthe“user“presses“ÅRETURN“²to“stop“the“execution)ŽŽ¡¡‘ã ÅyesŽŽŽŽŽ¦‘øã²The–àtop-levš¸ãel‘ßtries“to“displa˜y“the‘ßv›ÿqÇalues“of“the“v˜ariables›ßof“the“query“in˜a“readable“manner.‘\õF‘ÿ*ªor“instance,Ž¡‘øãwhen–Ò¾a›Ò½v‘ÿqÇariable“is˜bGound“to“a˜query“v‘ÿqÇariable,‘òthe˜name“of˜this“v‘ÿqÇariable“appGears.‘êWhen˜a“v‘ÿqÇariable˜is“aŽ¡‘øãsingleton–ð‘an“underscore‘ð’symš¸ãbGol‘‘Ö‰ff&fŽ‘ ¨Íis“displa˜y˜ed“(‘¡E‰ff&fŽ‘¸=is“a“generic“name“for›ð’a“singleton“v‘ÿqÇariable,‘¸it˜is“also“calledŽ¡‘øãan–ËQanon¸ãymous“v›ÿqÇariable).‘CÆOther“v˜ariables‘ËRare“bGound“to“new“brand“v˜ariable‘ËRnames.‘CÆWhen“a“query“v˜ariableŽ¡‘øãname–áÅX‘ဲappGears“as‘áœthe“v›ÿqÇalue“of“another“query“v˜ariable“ÅY‘ဲit“is“bGecause“ÅX‘á²is“itself“not“instan¸ãtiated“otherwiseŽ¡‘øãthe–uv‘ÿqÇalue“of‘å‘ÅX‘g²is“displa•¸ãy“ed.‘_|In›usuc“h˜a˜case,‘)nnothing˜is–toutput˜for˜ÅX‘g²itself˜(since“it˜is˜a˜v‘ÿqÇariable).‘_|Example:ŽŸ#‚Ÿíæd‘ã Å|–?ý?-“X=f(A,B,‘¡E‰ff&fŽ‘Ç«,A),“A=k.ŽŽ¡¡‘ã A–?ý=“kŽŽŽ’ƒ²©²(the–UUv‘ÿqÇalue“of‘rÅA“²is“displa•¸ãy“ed–UUalso“in“Åf/3“²for“ÅX²)ŽŽ¡‘ã ÅX–?ý=“f(k,B,‘¡E‰ff&fŽ‘Ç«,k)ŽŽŽ’ƒ²©²(since–UUÅB“²is“a“v‘ÿqÇariable“whicš¸ãh“is“also“a“part“of‘rÅX²,“ÅB“²is“not“displa˜y˜ed)ŽŽŽŽŽŸ0ŽŸóÚÝ‘ã Å|–?ý?-“functor(T,f,3),“arg(1,T,X),“arg(3,T,X).ŽŽ¡Ÿ ‘ã T–?ý=“f(X,‘¡E‰ff&fŽ‘Ç«,X)ŽŽŽ’ƒ²©²(the–UU1Ÿü^ÿó 0e—rcmmi7´stŽ‘  å²and“3Ÿü^ÿ´r7dŽ‘ 쩲args“are“equal“to“ÅX²,“the“2Ÿü^ÿ´ndŽ‘ ð…²is“an“anon¸ãymous“v‘ÿqÇariable)ŽŽŽŽŽŸ*™ŸóÚÝ‘ã Å|–?ý?-“read‘¡E‰ff&fŽ–Ç«from‘¡E‰ff&fŽ“atom('k(X,Y,X).',T).ŽŽ¡Ÿ ‘ã T–?ý=“k(A,‘¡E‰ff&fŽ‘Ç«,A)ŽŽŽ’ƒ²©²(the–UU1Ÿü^ÿ´stŽ‘  å²and“3Ÿü^ÿ´r7dŽ‘ 쩲args“are“uni ed,“a“new“v‘ÿqÇariable“name“ÅA“²is“in¸ãtroGduced)ŽŽŽŽŽŽŸŽŒ‹¯ Ú‹– ý"EŸüfd‘øã²16ŽŽŽ’H¯3‘ USING–UUGNU“PR¸ãOLOGŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãThe–~Štop-lev¸ãel›~‹uses“v‘ÿqÇariable“binding˜predicates“(section˜7.5,‘ˆ×page˜55).‘ígT‘ÿ*ªo“displa¸ãy˜the“v‘ÿqÇalue“of˜a“v‘ÿqÇariable,ޤ ‘øãthe–+ìtop-levš¸ãel“calls‘+ëÅwrite‘¡E‰ff&fŽ‘Ç«term/3“²with“the“follo˜wing“option‘+ëlist:‘õÅ[quoted(true),numbervars(false),Ž¡‘øãnamevars(true)]– À²(section“7.14.6,‘9[page“96).‘• A‘ ‘term“of› Áthe“form“Å'$VARNAME'(Name)“²where˜ÅName“²is“anŽ¡‘øãatom–•üis“displa•¸ãy“ed–•üas›•ûa“v‘ÿqÇariable“name“while“a“term˜of“the“form“Å'$VAR'(N)‘•˲where“ÅN‘•̲is˜an“inš¸ãteger“is“displa˜y˜edŽ¡‘øãas–Zma“normal›ZlcompGound“term“(suc¸ãh“a“term“could˜bGe“output“as“a“v‘ÿqÇariable˜name“b¸ãy‘}úÅwrite‘¡E‰ff&fŽ‘Ç«term/3²).‘%Example:ŽŸ&Ÿíæd‘ã Å|–?ý?-“X='$VARNAME'('Y'),“Y='$VAR'(1).ŽŽ¡¡‘ã X–?ý=“YŽŽŽ’ƒ²©²(the–UUterm“Å'$VARNAME'('Y')“²is“displa•¸ãy“ed–UUas“ÅY²)ŽŽ¡‘ã ÅY–?ý=“'$VAR'(1)ŽŽŽ’ƒ²©²(the–UUterm“Å'$VAR'(1)“²is“displa•¸ãy“ed–UUas“is)ŽŽŽŽŽŸ9Ÿíæd‘ã Å|–?ý?-“X=Y,“Y='$VAR'(1).ŽŽ¡¡‘ã X–?ý=“'$VAR'(1)ŽŽ¡‘ã Y–?ý=“'$VAR'(1)ŽŽŽŽŽŸ%qÇ‘øã²In–Œ~the“ rst›Œexample,‘šHÅX‘Œp²is“explicitly“bGound˜to“Å'$VARNAME'('Y')‘Œp²b¸ãy“the“query“so“the˜top-levš¸ãel“displa˜ys“ÅYŽ¡‘øã²as–µÑthe“v‘ÿqÇalue“of‘|îÅX².“ÅY‘µ¸²is“uni ed“with“Å'$VAR'(1)“²so“the“top-levš¸ãel“displa˜ys“it“as“a“normal“compGound“term.Ž¡‘øãIt–bŽshould“bšGe“clear“that“ÅX‘b‹²is“not“b˜ound“to“ÅY‘b‹²(whereas“it“is“in“the“second“query).‘™rThis“b˜eha¸ãvior“should“b˜eŽ¡‘øãk¸ãept–UUin“mind“when“doing“v‘ÿqÇariable“binding“opGerations.Ž©‘øãFinally‘ÿ*ª,›VGthe–Vtop-lev¸ãel“computes“the“user-time‘V(section“7.24.2,˜page“139)“takš¸ãen“b˜y“a“query‘Vand“displa˜ys“itŽ¡‘øãwhen–UUit“is“signi can¸ãt.‘qÇExample:ŽŸOqÇŸÃæd‘ã Å|–?ý?-“retractall(p(‘¡E‰ff&fŽ‘Ç«)),“assertz(p(0)),ŽŽ¡‘,"ûrepeat,ŽŽ¡‘;âòretract(p(X)),ŽŽ¡‘;âòY–?ýis“X“+“1,ŽŽ¡‘;âòassertz(p(Y)),ŽŽ¡‘;âòX–?ý=“1000,“!.ŽŽ¡¡‘ã X–?ý=“1000ŽŽ¡‘ã Y–?ý=“1001ŽŽ¡¡‘ã (180–?ýms)“yesŽŽŽ’ƒ²©²(the–UUquery“toGok“180ms“of“user“time)ŽŽŽŽŽŸaoý‘øãÄ3.2.3Ž‘‰Consulting–ÕTa“Prolog“programŽŸuT‘øã²The›>top-lev•¸ãel‘>allo“ws˜the–>user˜to“consult˜Prolog˜source“ les.‘jConsulted˜predicates“can˜bGe˜listed,‘B¹executedŽ¡‘øãand–Îdebugged›Í(while“predicates˜compiled“to˜nativ¸ãe-coGde“cannot).‘]ïF‘ÿ*ªor“more˜information“abGout˜the“di er-Ž¡‘øãence›)bGet•¸ãw“een˜a˜nativ“e-coGde–(predicate˜and˜a˜consulted˜predicate˜refer˜to˜the“in¸ãtroGduction˜of˜this˜sectionŽ¡‘øã(section–UU3.1,“page“13)“and“to“the“part“dev¸ãoted“to“the“compiler“(section“3.4.1,“page“20).ަ‘øãT‘ÿ*ªo–&iconsult“a“program“use“the“built-in‘&jpredicate“Åconsult/1“²(section“7.23.1,‘Z®page“136).‘åThe“argumen¸ãtŽ¡‘øãof–¾:this“predicate›¾;is“a“Prolog“ le“name˜or“Åuser“²to“spGecify“the“terminal.‘¬wThis“allo¸ãws“the˜user“to“directlyŽ¡‘øãinput–Ppthe“predicates“from“the“terminal.‘p%In“that“case“the“input“shall“bGe“terminated“bš¸ãy“the“end-of- le“k˜eyŽ¡‘øãsequence–NŽ(ÅCtl-D²)›NŒor“its“term“represen¸ãtation:‘ndÅend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“file.‘o„²A‘Nshorthand–NŽfor“Åconsult(ÉFILE‘¼rÅ)˜²is“Å[ÉFILE‘¼rÅ]².Ž¡‘øãExample:ŽŽŸŽŒ‹¾= Ú‹– ý"EŸüfd‘øã²3.2‘ The–UUGNU“Prolog“in•¸ãteractiv“e‘UUin“terpreterŽŽŽ’¶!17ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýÛ¢EŸæd‘ã Å|–?ý?-“[user].ŽŽ¤ ‘ã {compiling–?ýuser“for“byte“code...}ŽŽ¡‘ã even(0).ŽŽ¡‘ã even(s(s(X))):-ŽŽ¡‘;âòeven(X).ŽŽ¡’ƒ²©²(here–UUthe“user“presses“ÅCtl-D“²to“end“the“input)ŽŽ¡‘ã Å{user–?ýcompiled,“3“lines“read“-“350“bytes“written,“1180“ms}ŽŽ¡¡‘ã |–?ý?-“even(X).ŽŽ¡¡‘ã X–?ý=“0“?‘ ú;ŽŽŽ’ƒ²©²(here–UUthe“user“presses“Å;“²to“compute“another“solution)ŽŽ¡¡‘ã ÅX–?ý=“s(s(0))“?‘ ú;ŽŽŽ’ƒ²©²(here–UUthe“user“presses“Å;“²to“compute“another“solution)ŽŽ¡¡‘ã ÅX–?ý=“s(s(s(s(0))))“?ŽŽŽ’ƒ²©²(here–UUthe“user“presses“ÅRETURN“²to“stop“the“execution)ŽŽ¡¡‘ã ÅyesŽŽ¡‘ã |–?ý?-“listing.ŽŽ¡¡‘ã even(0).ŽŽ¡‘ã even(s(s(A)))‘?ý:-ŽŽ¡‘;âòeven(A).ŽŽŽŽŽ ’‘øã²When–wDÅconsult/1›wE²(section“7.23.1,‘¿Àpage“136)“is˜in•¸ãv“ok“ed–wDon“a˜Prolog“ le“it˜ rst“runs“the“GNU‘vúPrologޤ ‘øãcompiler–ù¤(section›ù£3.4,‘"·page“20)˜as“a˜c¸ãhild“proGcess“to˜generate“a˜tempGorary“W‘þãAM‘ùy le“for˜b¸ãyte-coGde.‘^³IfŽ¡‘øãthe–œ#compilation“fails›œ$a“message“is“displa•¸ãy“ed˜and–œ#nothing“is“loaded.‘F2If“the“compilation˜succeeds,‘íÖtheŽ¡‘øãproGduced–¯s le›¯ris“loaded˜in¸ãto“memory“using‘ÒÿÅload/1“²(section“7.23.2,‘Åùpage“137).‘€ Namely‘ÿ*ª,‘Åúthe˜b¸ãyte-coGde“ofŽ¡‘øãeac¸ãh–ã|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ3.2.5Ž‘‰The–ÕTline“editorŽŸuT‘øã²The–Þ‘line›Þeditor“(Ålinedit²)˜allo¸ãws“the˜user“to“build/upGdate˜the“curren¸ãt˜input“line˜using“a˜v‘ÿqÇariet¸ãy“ofޤ ‘øãcommands.‘3(This–•Ëfacilitš¸ãy“is“a˜v‘ÿqÇailable“if“the‘•ÊÅlinedit“²part“of“GNU‘•ºProlog“has“bGeen“installed.‘3(Ålinedit“²isŽ¡‘øãimplicitly–“ßcalled‘“àbš¸ãy“an˜y“built-in“predicate›“àreading“from“a“terminal˜(e.g.‘-eÅget‘¡E‰ff&fŽ‘Ç«char/1²,‘£‚Åread/1²,.–ªª.“.“).‘-fThisŽ¡‘øãis–UUthe“case“when“the“top-lev¸ãel“reads“a“query‘ÿ*ª.Ž©‘øãÄBindings²:‘‹7eacš¸ãh–b command“of‘)*Ålinedit“²is“activ‘ÿqÇated“using“a‘bk˜ey–ÿ*ª.‘—ïF“or–b some“commands“another“k˜ey“is“alsoŽ¡‘øãa•¸ãv‘ÿqÇailable›2to‘2Žin“v“ok“e˜the˜command–2Ž(on˜some“terminals˜this˜other“k•¸ãey˜ma“y˜not‘2Žw“ork˜propGerly‘2Žwhile˜theŽ¡‘øãprimary–UUkš¸ãey“alw˜a˜ys“w˜orks).‘qÇHere“is“the“list“of“a˜v‘ÿqÇailable“commands:Ž¥ÙÌÆ‘øã ÿ6 ‰ffžDN¤fd¤™œ„ ff–ßñŸüfdKey“¡„ ffŽ‘B ±Alternate‘UUk¸ãey‘Ÿ™œ„ ffŽ’‰ìDescription’⟙œ„ ffŽŽ©‰ffžDNŸff‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-B“¡„ ffŽ‘ZÉ&¸ ‘¼uŸ™œ„ ffŽ’‰ì²go–UUto“the“previous“c¸ãharacter’™-Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-F“¡„ ffŽ‘ZÉ&¸!‘¼uŸ™œ„ ffŽ’‰ì²go–UUto“the“next“c¸ãharacter’ªUhŸ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅEsc-B“¡„ ffŽ‘PI,Ctl-¸ ‘<{Ÿ™œ„ ffŽ’‰ì²go–UUto“the“previous“w¸ãord’«ñÙŸ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅEsc-F“¡„ ffŽ‘PI,Ctl-¸!‘<{Ÿ™œ„ ffŽ’‰ì²go–UUto“the“next“w¸ãord’½@Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-A“¡„ ffŽ‘UI-Home‘<{Ÿ™œ„ ffŽ’‰ì²go–UUto“the“bGeginning“of“the“line’*·Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-E“¡„ ffŽ‘Wé+End‘ÜzŸ™œ„ ffŽ’‰ì²go–UUto“the“end“of“the“line’ª„Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-H“¡„ ffŽ‘H)4Backspace‘ ƒŸ™œ„ ffŽ’‰ì²delete–UUthe“previous“c¸ãharacter’•±ÙŸ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-D“¡„ ffŽ‘P 0Delete‘ü~Ÿ™œ„ ffŽ’‰ì²delete–UUthe“currenš¸ãt“c˜haracter’š¸øŸ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-U“¡„ ffŽ‘JÉ3Ctl-Home‘¼Ÿ™œ„ ffŽ’‰ì²delete–UUfrom“bGeginning“of“the“line“to“the“currenš¸ãt“c˜haracter‘‡Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-K“¡„ ffŽ‘Mi1Ctl-End‘\€Ÿ™œ„ ffŽ’‰ì²delete–UUfrom“the“currenš¸ãt“c˜haracter“to“the“end“of“the“line‘#@Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅEsc-L“¡„ ffŽ’ƒ…œŸ™œ„ ffŽ’‰ì²lo•¸ãw“er–UUcase“the“next“w¸ãord’§€Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅEsc-U“¡„ ffŽ’ƒ…œŸ™œ„ ffŽ’‰ì²uppGer–UUcase“the“next“w¸ãord’¥Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅEsc-C“¡„ ffŽ’ƒ…œŸ™œ„ ffŽ’‰ì²capitalize–UUthe“next“w¸ãord’ª\„Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-T“¡„ ffŽ’ƒ…œŸ™œ„ ffŽ’‰ì²excš¸ãhange–UUlast“t˜w˜o“c˜haracters’—LŸ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-V“¡„ ffŽ‘P 0Insert‘ü~Ÿ™œ„ ffŽ’‰ì²switc¸ãh–UUon/o “the“insert/replace“moGde‘oDŸ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-I“¡„ ffŽ‘Wé+Tab‘ÜzŸ™œ„ ffŽ’‰ì²complete–UUwš¸ãord“(t˜wice“displa˜ys“all“pGossible“completions)‘"@Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–ŸüfdÅEsc-Ctl-I“¡„ ffŽ‘Mi1Esc-Tab‘\€Ÿ™œ„ ffŽ’‰ì²insert–UUspaces“to“em¸ãulate“a“tabulation‘r\}Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–ŸüfdÅCtl-space“¡„ ffŽ’ƒ…œŸ™œ„ ffŽ’‰ì²mark–UUbGeginning“of“the“selection’Š\}Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅEsc-W“¡„ ffŽ’ƒ…œŸ™œ„ ffŽ’‰ì²copš¸ãy–UU(from“the“bGegin“selection“mark“to“the“curren˜t“c˜haracter)‘Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-W“¡„ ffŽ’ƒ…œŸ™œ„ ffŽ’‰ì²cut–UU(from“the“bGegin“selection“mark“to“the“currenš¸ãt“c˜haracter)‘ sŸ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-Y“¡„ ffŽ’ƒ…œŸ™œ„ ffŽ’‰ì²paste’ýŸ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-P“¡„ ffŽ‘]I&¸"‘!“¡„ ffŽ‘H)4Page‘?ýDown‘ ƒŸ™œ„ ffŽ’‰ì²recall–UUlast“history“line’µLŸ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-C“¡„ ffŽ’ƒ…œŸ™œ„ ffŽ’‰ì²generate–UUan“in¸ãterrupt“signal“(section“3.2.4,“page“17)‘1ê­Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅCtl-D“¡„ ffŽ’ƒ…œŸ™œ„ ffŽ’‰ì²generate–UUan“end-of- le“c¸ãharacter“(at“the“bGegin“of“the“line)‘£‘Ÿ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff‘ ßüŸüfdÅRETURN‘ ßû¡„ ffŽ’ƒ…œŸ™œ„ ffŽ’‰ì²v‘ÿqÇalidate–UUa“line’ÖŽNŸ™œ„ ffŽŽ¦‰ffžDN¡¤™œ„ ff–úŸüfdÅEsc-?“¡„ ffŽ’ƒ…œŸ™œ„ ffŽ’‰ì²displaš¸ãy–UUa“summary“of“a˜v‘ÿqÇailable“commands‘[N;Ÿ™œ„ ffŽŽ¦‰ffžDNŽŽŽ¡‘øãÄHistory(ä²:‘GGwhen–Va›Uline“is“en¸ãtered˜(i.e.‘Urterminated“b¸ãy‘#âÅRETURN²),“Ålinedit“²records˜it“in˜an“in¸ãternal˜list“calledޤ ‘øãhistory‘ÿ*ª.‘l»It–F1is“later›F0pGossible“to“recall“history˜lines“using“appropriate“commands“(e.g.‘lºÅCtl-P‘F-²recall“the“lastŽ¡‘øãen¸ãtered–,line)›+and“to“moGdify“them˜as“needed.‘"KIt“is“also˜pGossible“to“recall˜a“history“line“bGeginning˜with“aŽ¡‘øãgiv¸ãen–Ì pre x.‘ÕäF‘ÿ*ªor“instance›Ì to“recall“the˜previous“line“bGeginning˜with“Åwrite“²simply“t¸ãypGe˜Åwrite“²follo•¸ãw“edŽ¡‘øãb¸ãy‘xâÅEsc-P².–UUAnother“ÅEsc-P“²will“recall“an“earlier“line“bGeginning“with“Åwrite²,.–ªª.“.ަ‘øãÄCompletion²:‘ranother–v«impGortanš¸ãt“feature‘vªof‘=ÈÅlinedit“²is“its“completion“facilit˜y‘ÿ*ª.‘'Indeed,‘£3Ålinedit“²main˜tainsŽ¡‘øãa–°list“of“knoš¸ãwn“w˜ords“and“uses“it“to“complete‘°the“pre x“of“a“w˜ord.‘:³Initially“this“list“con˜tains“all“prede nedŽ¡‘øãatoms–îand›îthe“atoms“correspGonding“to˜a¸ãv‘ÿqÇailable“predicates.‘OWThis“list˜is“dynamically“upGdated“when˜a“newŽ¡‘øãatom–ihappGears›iiin“the˜system“(whether˜read“at˜the“top-lev¸ãel,‘nncreated“with˜a“built-in˜predicate,‘nmassoGciatedŽ¡‘øãwith–BÞa“new“consulted“predicate,.–ªª.“.“).‘k When–BÞthe“completion“kš¸ãey“(ÅTab²)“is“pressed“Ålinedit“²acts“as“follo˜ws:ŽŽŸŽŒ‹ÜРÚ‹– ý"EŸüfd‘øã²3.3‘ Adjusting–UUthe“size“of“Prolog“stac¸ãksŽŽŽ’¶!19ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã¸ŽŽŽ‘ã ²use–UUthe“currenš¸ãt“w˜ord“as“a“pre x.ޤ‘ã¸ŽŽŽ‘ã ²collect–UUall“w¸ãords“of“the“list“that“bGegin“with“this“pre x.Ž¡‘ã¸ŽŽŽ‘ã ²complete–UUthe“currenš¸ãt“w˜ord“with“the“longest“common“part“of“all“matc˜hing“w˜ords.Ž¡‘ã¸ŽŽŽ‘ã ²if–UUmore“than“one“wš¸ãord“matc˜hes“emit“a“bGeep“(a“second“ÅTab“²will“displa˜y“all“pGossibilities).Ž¡‘øãExample:ŽŸIqÇŸÉæd‘ã Å|–?ý?-“arguŽŽŽ’ƒ²©²(here–UUthe“user“presses“ÅTab“²to“complete“the“w¸ãord)ŽŽ¤ ‘ã Å|–?ý?-“argument‘¡E‰ff&fŽŽŽŽ’ƒ²©²(Ålinedit–UU²completes“Åargu“²with“Åargument‘¡E‰ff&fŽ‘²and“emits“a“bGeep)ŽŽ¡’ƒ²©(the–UUuser“presses“again“ÅTab“²to“see“all“pGossible“completions)ŽŽ¡‘ã Åargument‘¡E‰ff&fŽ‘Ç«counterŽŽŽ’ƒ²©²(Ålinedit–UU²sho¸ãws“3“pGossible“completions)ŽŽ¡‘ã Åargument‘¡E‰ff&fŽ‘Ç«listŽŽ¡‘ã argument‘¡E‰ff&fŽ‘Ç«valueŽŽ¡‘ã |–?ý?-“argument‘¡E‰ff&fŽŽŽŽ’ƒ²©²(Ålinedit–UU²redispla¸ãys“the“input“line)ŽŽ¡¡‘ã Å|–?ý?-“argument‘¡E‰ff&fŽ‘Ç«cŽŽŽ’ƒ²©²(to–UUselect“Åargument‘¡E‰ff&fŽ‘Ç«counter“²the“user“presses“Åc“²and“ÅTab²)ŽŽ¡‘ã Å|–?ý?-“argument‘¡E‰ff&fŽ‘Ç«counterŽŽŽ’ƒ²©²(Ålinedit–UU²completes“with“Åargument‘¡E‰ff&fŽ‘Ç«counter²)ŽŽŽŽŽŸJ‘øãFinally‘ÿ*ª,‘HþÅlinedit–Eè²alloš¸ãws“the“user“to“c˜hec˜k“that“(square/curly)“brac˜k˜ets“are“w˜ell“balanced.‘l¢F‘ÿ*ªor“this,‘Hþwhenޤ ‘øãa›+µclose‘+¶brac•¸ãk“et˜sym“bGol,–4i.e.‘cèÅ)²,“Å]‘4 ²or˜Å}²,“is›+¶t¸ãypGed,“Ålinedit˜²determines–+µthe“assošGciated“op˜en‘+¶brac•¸ãk“et,‘4i.e.‘cçÅ(²,‘4 Å[Ž¡‘øã²or–UUÅ{²,“and“tempšGorarily“rep˜ositions“the“cursor“on“it“to“shoš¸ãw“the“matc˜h.ŽŸ'þ6‘øãÇ3.3Ž‘£Adjusting–€the“size“of“Prolog“stac ksŽŸuT‘øã²GNU‘!Prolog–0uses‘/sevš¸ãeral“stac˜ks“to›/execute“a“Prolog˜program.‘^fEac•¸ãh˜stac“k–0has“a˜static“size“and˜cannot“bGeŽ¡‘øãdynamically–mincreased“during›lthe“execution.‘WzF‘ÿ*ªor“eac•¸ãh˜stac“k–mthere“is“a˜default“size“but“the˜user“can“de neŽ¡‘øãa–æ­new“size“bš¸ãy“setting“an‘æ¬en˜vironmen˜t“v‘ÿqÇariable.‘LåWhen“a“GNU‘æ‘Prolog“program‘æ¬is“run“it“ rst“consults“theseŽ¡‘øãv‘ÿqÇariables–ùìand“if“they›ùëare“not“de ned“uses“the“default˜sizes.‘_ŒThe“follo¸ãwing“table˜presenš¸ãts“eac˜h“stac˜k“ofŽ¡‘øãGNU–UUProlog“with“its“default“size“and“the“name“of“its“assoGciated“en•¸ãvironmen“t‘UUv‘ÿqÇariable:Ž©7Ø,‘øãŸ×€‰ff½±ä©fd¤™œ„ ff– Î.ŸüfdStac¸ãk“¡„ ffŽ‘6%Default‘ ØãŸ™œ„ ffŽ‘fÁ]En•¸ãvironmen“t‘Ÿ™œ„ ffŽ’«¶Description’ߣ«Ÿ™œ„ ffŽŽ¡¤™œ„ ff‘ KŸüfdname‘ J¡„ ffŽ‘2Lºsize‘UU(Kb)‘Ÿ™œ„ ffŽ‘qï˜v‘ÿqÇariable‘.:Ÿ™œ„ ffŽ’½K~Ÿ™œ„ ffŽŽ¤‰ff½±äŸff‰ff½±ä¦¤™œ„ ff‘ŸÿŸüfdÅlocal‘Ÿþ¡„ ffŽ‘|ŽŽŽŽ ÃÝ» ý_"E‘øãFinally–anote›athat“GNU‘aProlog˜stac¸ãks“are“virtually˜alloGcated“(i.e.›”ßuse“virtual“memory).˜This‘ameans“thatޤ ‘øãa–»ph¸ãysical›»Žmemory“page“is“alloGcated˜only“when“needed“(i.e.‘¤twhen˜an“attempt“to“read/write˜it“oGccurs).Ž¡‘øãTh¸ãus–—it›˜is“pGossible“to˜de ne“v¸ãery“large˜stac•¸ãks.‘^‡A“t˜the–—execution,‘'$only“the“needed˜amoun¸ãt“of“space˜will“bGeŽ¡‘øãph¸ãysically‘UUalloGcated.ŽŸ'þ6‘øãÇ3.4Ž‘£The–€GNU“Prolog“compilerޤuT‘øãÄ3.4.1Ž‘‰Di eren®9t–ÕTkinds“of“coQÇdesŽ¡‘øã²One––/of“the“main“adv‘ÿqÇanš¸ãtages“of“GNU‘–Prolog“is“its‘–.abilit˜y“to“proGduce“stand“alone“executables.‘4UA‘–Prologޤ ‘øãprogram–fÈcan“bšGe‘fÇcompiled“to“nativ¸ãe“co˜de“to“givš¸ãe‘fÇrise“to“a“mac˜hine-depGenden˜t“executable‘fÇusing“the“GNUŽ¡‘øãProlog›;*compiler.‘#EHo•¸ãw“ev“er˜nativ“e-co•Gde‘;)predicates˜cannot˜b“e˜listed–;)nor˜fully˜debugged.‘#ESo˜there“is˜anŽ¡‘øãalternativš¸ãe–}œto“nativ˜e-coGde“compilation:‘ÂUb˜yte-coGde“compilation.‘êœBy“default“the“GNU‘}PProlog“compilerŽ¡‘øãpro•Gduces›ànativ¸ãe-co“de–àbut˜via˜a“command-line˜option˜it“can˜proGduce˜a“ le˜ready˜for“b¸ãyte-coGde˜loading.Ž¡‘øãThis–rªis›r«exactly“what“Åconsult/1“²doGes˜as“w¸ãas“explained˜abGo•¸ãv“e–rª(section“3.2.3,‘zpage“16).‘ÉÇGNU‘r£Prolog“alsoŽ¡‘øãmanages–9?in¸ãterpreted›9@coGde“using“a˜Prolog“in¸ãterpreter“written˜in“Prolog.‘†Obš¸ãviously“in˜terpreted‘9@coGde“isŽ¡‘øãslo•¸ãw“er–65than“b¸ãyte-cošGde“but“do˜es“not“require“the“in•¸ãv“o˜cation‘66of–65the“GNU‘6-Prolog“compiler.‘ggThis“in¸ãterpreterŽ¡‘øãis–lYused“eacš¸ãh“time“a“meta-call“is“needed“as“b˜y‘æÅcall/1“²(section“6.2.3,‘²page“47).‘¶ÓThis“also“the“case“ofŽ¡‘øãdynamically–UUasserted“clauses.‘qÇThe“follo¸ãwing“table“summarizes“these“three“kinds“of“coGdes:ŽŸ+¤ù‘øãŸã³4‰ff{ã·¤fd¤™œ„ ff‘ŸüfdT¸ãypGe‘6ª¯¡„ ffŽ‘Y÷€SpGeed‘*­Ÿ™œ„ ffŽ’‰]ìDebug‘UU?‘Ÿ™œ„ ffŽ’ºWF‘ÿ*ªor‘UUwhat’™ÜƒŸ™œ„ ffŽŽ©‰ff{ã·Ÿff‰ff{ã·¡¤™œ„ ff‘Ÿüfdin¸ãterpreted-coGde‘¡„ ffŽ‘Y÷€slo¸ãw‘UZŸ™œ„ ffŽ’”Ì'y¸ães‘n:Ÿ™œ„ ffŽ’ºWmeta-call–UUand“dynamically“asserted“clauses‘Ÿ™œ„ ffŽŽ¦‰ff{ã·¡¤™œ„ ff‘Ÿüfdb¸ãyte-coGde‘#8æ¡„ ffŽ‘Y÷€medium‘Ÿ™œ„ ffŽ’”Ì'y¸ães‘n:Ÿ™œ„ ffŽ’ºWconsulted‘UUpredicates‘i Ÿ™œ„ ffŽŽ¦‰ff{ã·¡¤™œ„ ff‘Ÿüfdnativ¸ãe-coGde‘qÈ¡„ ffŽ‘Y÷€fast‘uŸ™œ„ ffŽ’–6Ñno‘ØäŸ™œ„ ffŽ’ºWcompiled‘UUpredicates‘kG)Ÿ™œ„ ffŽŽ¦‰ff{ã·ŽŽŽŸ9£/‘øãÄ3.4.2Ž‘‰Compilation‘ÕTsc®9hemeŽŸuT‘øãNativ®9e-coQÇde‘Ìcompilation²:‘m¹a–M9Prolog“source“is“compiled“in“sev¸ãeral“stages“to‘M8proGduce“an“ob‘Ž8ject“ le“thatŽ¡‘øãis–½Ûlink¸ãed“to“the›½ÜGNU‘½ÀProlog“libraries“to“proGduce“an˜executable.‘«YThe“Prolog“source˜is“ rst“compiled“toŽ¡‘øãobtain–è¥a“W›þãAM‘èŠ[9Ž‘]“ le.‘MF‘ÿ*ªor“a“detailed“study“of“the“W˜AM‘èŠthe“in¸ãterested“reader“can‘è¦refer“to“\W‘ÿ*ªarren's“Ab-Ž¡‘øãstract–KMacš¸ãhine:‘OÂA‘9T‘ÿ*ªutorial“Reconstruction"Ÿü^ÿ±21ŽŽ‘ Š1²[1Ž‘].‘[The“W‘þãAM‘: le“is‘Jtranslated“to“a“mac˜hine-indepGenden˜tŽ¡‘øãlanguage–ûàspGeci cally“designed“for“GNU‘ûÊProlog.‘SõThis“language‘ûáis“close“to“a“(univš¸ãersal)“assem˜bly“languageŽ¡‘øãand–=îis“based›=íon“a“v¸ãery“reduced˜instruction“set.‘+’F‘ÿ*ªor˜this“reason“this“language˜is“called“mini-assem¸ãblyŽ¡‘øã(MA).–ctThe“mini-assemš¸ãbly“ le“is“then“mappGed“to“the‘cuassem˜bly“language“of“the“target“mac˜hine.‘œ$ThisŽ¡‘øãassemš¸ãbly–éF le‘éEis“assem˜bled“to‘éEgiv˜e“rise“to›éEan“ob‘Ž8ject“ le˜whic¸ãh“is˜then“link¸ãed“with˜the“GNU‘é*Prolog“librariesŽ¡‘øãto–9xproš¸ãvide“an“executable.‘h~The“compiler“also“tak˜es“in˜to“accoun˜t“Finite“Domain“constrain˜t“de nition“ les.Ž¡‘øãIt–êtranslates“them“to“C›Ãand“in•¸ãv“ok“e–êthe“C˜compiler“to“obtain“ob‘Ž8ject“ les.‘¼ÅThe“folloš¸ãwing“ gure“presen˜tsŽ¡‘øãthis–UUcompilation“sc¸ãheme:Ž‘øãŸX-‰ff¶HŸ J=‘wŽŸý-:¾21ŽŽŽ‘LÜÃhttp://www.isg.sfu.ca/~hak/documents/wam.htmlŽŽŸŽŒ‹  Ú‹– ý"EŸüfd‘øã²3.4‘ The–UUGNU“Prolog“compilerŽŽŽ’¶!21ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» þøB‘4ü@ þ]F¥‰ffO  ¥¹[„¥¹[ffŸý‘ï@PSfile="compil-scheme.eps" llx=0 lly=0 urx=394 ury=499 rwi=3270 ŽŽŽŽ’N?>„¥¹[ffŽžff‰ffO ŽŽŽŽŸ‘øãObš¸ãviously–ƒäall“in˜termediate“stages‘ƒåare“hidden“to“the“user“who“simply“in˜v˜ok˜es‘ƒåthe“compiler“on“his“Prologޤ ‘øã le(s)–Å(plus“other›Å les:‘Q)C,.–ªª.“.“)‘ÀÚand˜obtains–Åan“executable.‘ÀÙHo•¸ãw“ev“er,‘ òit–Åis“also“pGossible˜to“stop“theŽ¡‘øãcompiler–—üat‘—ûanš¸ãy“giv˜en“stage.‘9»This‘—ûcan“bGe“useful,›¨¥for“instance,˜to“see›—ûthe“W‘þãAM‘—ëco•Gde˜pro“duced‘—ü(p“erhapsŽ¡‘øãwhen–tNlearning›tOthe“W‘þãAM).“Finally˜it“is“pGossible˜to“givš¸ãe“an˜y“kind›tOof“ le“to˜the“compiler“whic¸ãh˜will“insertŽ¡‘øãit–OÏin“the›OÎcompilation“c¸ãhain“at“the“stage˜correspšGonding“to“its“t¸ãyp˜e.‘oïThe“t¸ãyp˜e“of“a“ le‘OÎis“determined“usingŽ¡‘øãthe–UUsux“of“its“ le“name.‘qÇThe“folloš¸ãwing“table“presen˜ts“all“recognized“t˜ypGes/suxes:ŽŸDÿþ‘øãŸÊæh‰ff²ý¤fd¤™œ„ ff‘ŸüfdSux–UUof“the“ le‘X¸™¡„ ffŽ’ª÷8T¸ãypGe–UUof“the“ le‘`*¶Ÿ™œ„ ffŽ’TÁ@Handled‘UUb¸ãy:‘(ÇŸ™œ„ ffŽŽ©‰ff²ýŸff‰ff²ý¡¤™œ„ ff‘ŸüfdÅ.pl²,‘UUÅ.pro‘sN ¡„ ffŽ’ª÷8²Prolog–UUsource“ le‘X#™Ÿ™œ„ ffŽ’TÁ@Åpl2wam‘>UqŸ™œ„ ffŽŽ¦‰ff²ý¡¤™œ„ ff‘Ÿüfd.wam’‰*v¡„ ffŽ’ª÷8²W‘þãAM–UUsource“ le‘ZÎFŸ™œ„ ffŽ’TÁ@Åwam2ma‘>UqŸ™œ„ ffŽŽ¦‰ff²ý¡¤™œ„ ff‘Ÿüfd.ma’Žjs¡„ ffŽ’ª÷8²Mini-assem¸ãbly–UUsource“ le‘6$Ÿ™œ„ ffŽ’TÁ@Åma2asm‘>UqŸ™œ„ ffŽŽ¦‰ff²ý¡¤™œ„ ff‘Ÿüfd.s’“ªp¡„ ffŽ’ª÷8²Assem¸ãbly–UUsource“ le‘K#™Ÿ™œ„ ffŽ’TÁ@the‘UUassem¸ãbler‘"‡!Ÿ™œ„ ffŽŽ¦‰ff²ý¡¤™œ„ ff‘ŸüfdÅ.c²,–UUÅ.C²,“Å.CC²,“Å.cc²,“Å.cxx²,“Å.c++²,“Å.cpp‘¡„ ffŽ’ª÷8²C–UUor“C++“source“ le‘GDŸ™œ„ ffŽ’TÁ@the–UUC“compiler‘Î<Ÿ™œ„ ffŽŽ¦‰ff²ý¡¤™œ„ ff‘ŸüfdÅ.fd’Žjs¡„ ffŽ’ª÷8²Finite–UUDomain“constrain¸ãt“source“ le‘Ÿ™œ„ ffŽ’TÁ@Åfd2c‘HÕkŸ™œ„ ffŽŽ¦‰ff²ý¡¤™œ„ ff‘Ÿüfd²an¸ãy–UUother“sux“(Å.o²,“Å.a²,.–ªª.“.“)‘#±‡¡„ ffŽ’ª÷8anš¸ãy–UUother“t˜ypGe“(ob‘Ž8ject,“library‘ÿ*ª,.–ªª.“.“)‘ ‡Ÿ™œ„ ffŽ’TÁ@the–UUlinkš¸ãer“(C“link˜er)‘Ÿ™œ„ ffŽŽ¦‰ff²ýŽŽŽŸDqÅ‘øãÄByte-coQÇde‘ïmcompilation²:‘Ÿ*the–lsame›lcompiler“can“bGe˜used“to˜compile“a“source˜Prolog“ le˜for“b¸ãyte-coGde.Ž¡‘øãIn–óHthat›óGcase“the˜Prolog“to˜W‘þãAM‘ócompiler“is“in•¸ãv“ok“ed˜using–óHa˜spGeci c“option˜and“proGduces“a˜W‘þãAM‘óforŽ¡‘øãb¸ãyte-coGde– ôsource“ le› ó(suxed“Å.wbc²)“that“can˜bGe“later“loaded“using‘0€Åload/1“²(section“7.23.2,‘:Ûpage“137).Ž¡‘øãNote–æthat›åthis“is˜exactly“what˜Åconsult/1“²(section˜7.23.1,‘ª–page“136)˜doGes“as˜explained“abGo•¸ãv“e˜(section‘æ3.2.3,ŽŽŸŽŒ‹º Ú‹– ý"EŸüfd‘øã²22ŽŽŽ’H¯3‘ USING–UUGNU“PR¸ãOLOGŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãpage‘UU16).ŽŸ%l¢‘øãÄ3.4.3Ž‘‰Using–ÕTthe“compilerŽŸuT‘øã²The–Ü'GNU‘ÜProlog“compiler“is“a›Ü&command-line“compiler“similar“in“spirit“to˜a“Unix“C‘Ücompiler“lik¸ãe“Ågcc².Ž© ‘øãT‘ÿ*ªo›UUin•¸ãv“ok“e˜the˜compiler˜use˜the˜Ågplc˜²command˜as˜follo“ws:ޤ[½žæd‘ã Å%–?ýgplc“²[ÉOPTION›¼r²].–ªª.“.‘ê§ÉFILE˜².“.“.ŽŽŽ’®`„(the–UUÅ%“²sym¸ãbšGol“is“the“op˜erating“system“shell“prompt)ŽŽŽŽŽ¡‘øãThe–žargumenš¸ãts“of‘e;Ågplc“²are“ le“names“that‘žare“dispatc˜hed“in“the“compilation“sc˜heme“depGending“on“theަ‘øãt¸ãypGe–îÈdetermined›îÇfrom“their“sux“as˜w¸ãas“explained“previously“(section˜3.4.2,‘Kpage“20).‘O˜All“ob‘Ž8ject˜ les“areަ‘øãthen–ÞElink¸ãed›ÞFto“proGduce“an˜executable.‘JNote“ho•¸ãw“ev“er˜that–ÞEGNU‘Þ'Prolog“has˜no“moGdule“facilit¸ãy˜(since“thereަ‘øãis–³not“yš¸ãet“an“ISO‘³xreference“for“Prolog“moGdules)“th˜us“a“predicate‘³‘de ned“in“a“Prolog“ le“is“visible“fromަ‘øãanš¸ãy–àtother“predicate‘àude ned“in“an˜y“other“ le.‘%GNU‘àPProlog“allo˜ws›àuthe“user“to“split“a˜big“Prolog“sourceަ‘øãin•¸ãto›UUsev“eral˜ les˜but˜doGes˜not˜o er˜an“y˜w“a“y˜to˜hide˜a˜predicate˜from˜others.ŽŸ‘øãThe–UUsimplest“w•¸ãa“y–UUto“obtain“an“executable“from“a“Prolog“source“ le“Åprog.pl“²is“to“use:Ž©[¾‘ã Å%–?ýgplc“prog.plŽ¡‘øã²This–UUwill“proGduce“an“nativš¸ãe“executable“called“Åprog“²whic˜h“can“bGe“executed“as“follo˜ws:ަ‘ã Å%‘?ýprogŽ¡‘øã²Ho•¸ãw“ev“er,–UUthere“are“sevš¸ãeral“options“that“can“bGe“used“to“con˜trol“the“compilation:ŽŸ‘øãÄGeneral‘ÕToptions²:ޤ_qÇŸ·æd‘þãÅ-o–UUÉFILE‘¼r²,“Å--output“ÉFILEŽŽŽ’Šì›²use–UUÉFILE‘Dzas“the“name“of“the“output“ leŽŽ¤ ‘þãÅ-W²,‘UUÅ--wam-for-nativeŽŽŽ’Šì›²stop–UUafter“proGducing“W‘þãAM“ les(s)ŽŽ¡‘þãÅ-w²,‘UUÅ--wam-for-byte-codeŽŽŽ’Šì›²stop–UUafter“prošGducing“W‘þãAM“for“b¸ãyte-co˜de“ le(s)“(force“Å--no-call-c²)ŽŽ¡‘þãÅ-M²,‘UUÅ--mini-assemblyŽŽŽ’Šì›²stop–UUafter“proGducing“mini-assem¸ãbly“ les(s)ŽŽ¡‘þãÅ-S²,‘UUÅ--assemblyŽŽŽ’Šì›²stop–UUafter“proGducing“assem¸ãbly“ les“(s)ŽŽ¡‘þãÅ-F²,‘UUÅ--fd-to-cŽŽŽ’Šì›²stop–UUafter“proGducing“C“ les(s)“from“FD“constrain¸ãt“de nition“ le(s)ŽŽ¡‘þãÅ-c²,‘UUÅ--objectŽŽŽ’Šì›²stop–UUafter“proGducing“ob‘Ž8ject“ les(s)ŽŽ¡‘þãÅ--temp-dir‘UUÉPATHŽŽŽ’Šì›²use–UUÉPATH‘Dzas“directory“for“tempGorary“ lesŽŽ¡‘þãÅ--no-del-tempŽŽŽ’Šì›²do–UUnot“delete“tempGorary“ lesŽŽ¡‘þãÅ--no-decode-hexaŽŽŽ’Šì›²do–UUnot“decoGde“hexadecimal“predicate“namesŽŽ¡‘þãÅ-v²,‘UUÅ--verboseŽŽŽ’Šì›²prin¸ãt–UUexecuted“commandsŽŽ¡‘þãÅ-h²,‘UUÅ--helpŽŽŽ’Šì›²prin¸ãt–UUa“help“and“exitŽŽ¡‘þãÅ--versionŽŽŽ’Šì›²prin•¸ãt›UUv“ersion˜n“um“bGer˜and˜exitŽŽŽŽŽ¡‘øãÄProlog–ÕTto“W‘þ¸äAM“compiler“options²:ŽŸkqÇŸ«æd‘þãÅ--pl-state‘UUÉFILEŽŽŽ’Šì›²read–UUÉFILE‘Dzto“set“the“initial“Prolog“stateŽŽ¤ ‘þãÅ--no-susp-warnŽŽŽ’Šì›²do–UUnot“shoš¸ãw“w˜arnings“for“suspicious“predicatesŽŽ¡‘þãÅ--no-singl-warnŽŽŽ’Šì›²do–UUnot“shoš¸ãw“w˜arnings“for“named“singleton“v‘ÿqÇariablesŽŽ¡‘þãÅ--no-redef-errorŽŽŽ’Šì›²no–UUnot“sho¸ãw“errors“for“built-in“predicate“rede nitionsŽŽ¡‘þãÅ--foreign-onlyŽŽŽ’Šì›²only–UUcompile“Åforeign/1-2“²directiv¸ãesŽŽ¡‘þãÅ--no-call-cŽŽŽ’Šì›²do–UUnot“allo¸ãw“the“use“of‘rÅfd‘¡E‰ff&fŽ›Ç«tell²,“Å'$call‘¡E‰ff&fŽ˜c²',.–ªª.“.ŽŽ¡‘þãÅ--no-inlineŽŽŽ’Šì›²do–UUnot“inline“predicatesŽŽ¡‘þãÅ--no-reorderŽŽŽ’Šì›²do–UUnot“reorder“predicate“argumen¸ãtsŽŽ¡‘þãÅ--no-reg-optŽŽŽ’Šì›²do–UUnot“optimize“registersŽŽ¡‘þãÅ--min-reg-optŽŽŽ’Šì›²minimally–UUoptimize“registersŽŽ¡‘þãÅ--no-opt-last-subtermŽŽŽ’Šì›²do–UUnot“optimize“last“subterm“compilationŽŽ¡‘þãÅ--fast-mathŽŽŽ’Šì›²use–UUfast“mathematical“moGde“(assume“in¸ãteger“arithmetics)ŽŽ¡‘þãÅ--keep-void-instŽŽŽ’Šì›²k•¸ãeep›UUv“oid˜W‘þãAM˜instructions˜in˜the˜output˜ leŽŽ¡‘þãÅ--compile-msgŽŽŽ’Šì›²prin¸ãt–UUa“compile“messageŽŽ¡‘þãÅ--statisticsŽŽŽ’Šì›²prin¸ãt–UUstatistics“informationŽŽŽŽŽŽŸŽŒ‹)_ Ú‹– ý"EŸüfd‘øã²3.4‘ The–UUGNU“Prolog“compilerŽŽŽ’¶!23ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄW‘þ¸äAM–ÕTto“mini-assem®9bly“translator“options²:ޤžæd‘þãÅ--commentŽŽŽ’Šì›²include–UUcommen¸ãts“in“the“output“ leŽŽŽŽŽ¡‘øãÄMini-assemš®9bly–ÕTto“assem˜bly“translator“options²:Ž¡žæd‘þãÅ--commentŽŽŽ’Šì›²include–UUcommen¸ãts“in“the“output“ leŽŽŽŽŽ¡‘øãÄC–ÕTcompiler“options²:ޤqÇŸùæd‘þãÅ--c-compiler‘UUÉFILEŽŽŽ’Šì›²use–UUÉFILE‘Dzas“C“compilerŽŽŸ ‘þãÅ-C‘UUÉOPTIONŽŽŽ’Šì›²pass–UUÉOPTION‘Dzto“the“C“compilerŽŽŽŽŽ¡‘øãÄAssem®9bler‘ÕToptions²:ޤžæd‘þãÅ-A‘UUÉOPTIONŽŽŽ’Šì›²pass–UUÉOPTION‘Dzto“the“assem¸ãblerŽŽŽŽŽ¡‘øãÄLink®9er‘ÕToptions²:ޤeqÇŸ±æd‘þãÅ--local-size‘UUÉNŽŽŽ’Šì›²set–UUdefault“loGcal“stac¸ãk“size“to“ÉN‘DzKbŽŽ¤ ‘þãÅ--global-size‘UUÉNŽŽŽ’Šì›²set–UUdefault“global“stac¸ãk“size“to“ÉN‘DzKbŽŽ¡‘þãÅ--trail-size‘UUÉNŽŽŽ’Šì›²set–UUdefault“trail“stac¸ãk“size“to“ÉN‘DzKbŽŽ¡‘þãÅ--cstr-size‘UUÉNŽŽŽ’Šì›²set–UUdefault“constrainš¸ãt“stac˜k“size“to“ÉN‘DzKbŽŽ¡‘þãÅ--fixed-sizesŽŽŽ’Šì›²do–UUnot“consult“en•¸ãvironmen“t–UUv‘ÿqÇariables“at“run-time“(use“default“sizes)ŽŽ¡‘þãÅ--no-top-levelŽŽŽ’Šì›²do–UUnot“link“the“top-lev¸ãel“(force“Å--no-debugger²)ŽŽ¡‘þãÅ--no-debuggerŽŽŽ’Šì›²do–UUnot“link“the“Prolog/W‘þãAM“debuggerŽŽ¡‘þãÅ--min-pl-bipsŽŽŽ’Šì›²link–UUonly“used“Prolog“built-in“predicatesŽŽ¡‘þãÅ--min-fd-bipsŽŽŽ’Šì›²link–UUonly“used“FD“solv¸ãer“built-in“predicatesŽŽ¡‘þãÅ--min-bipsŽŽŽ’Šì›²shorthand–UUfor:‘qÇÅ--no-top-level“--min-pl-bips“--min-fd-bipsŽŽ¡‘þã--min-sizeŽŽŽ’Šì›²shorthand–UUfor:‘qÇÅ--min-bips“--stripŽŽ¡‘þã--no-fd-libŽŽŽ’Šì›²do–UUnot“loGok“for“the“FD“library“(main¸ãtenance“only)ŽŽ¡‘þãÅ-s²,‘UUÅ--stripŽŽŽ’Šì›²strip–UUthe“executableŽŽ¡‘þãÅ-L‘UUÉOPTIONŽŽŽ’Šì›²Pš¸ãass–UUÉOPTION‘Dzto“the“link˜erŽŽŽŽŽ¡‘øãIt–UUis“pGossible“to“only“givš¸ãe“the“pre x“of“an“option“if“there“is“no“am˜biguit˜y‘ÿ*ª.ŽŸ‘øãThe–qname›pof“the“output˜ le“is“con¸ãtrolled˜via“the“Å-o˜ÉFILE‘ÑÓ²option.‘\{If“presen¸ãt˜the“output“ le˜proGduced“willޤ ‘øãbGe– ‡named› ˆÉFILE‘¼r².“If“not˜spGeci ed,‘ãthe˜output“ le“name˜depGends“on“the“last˜stage“reacš¸ãhed“b˜y‘ ˆthe“compiler.Ž¡‘øãIf–ÝÚthe›ÝÙlink“is˜not“done˜the“output˜ le“name(s)˜is“the˜input“ le˜name(s)“with˜the“sux˜assoGciated“withŽ¡‘øãthe–,ûlast›,üstage.‘dTIf“the“link˜is“done,‘5 the˜name“of“the˜executable“is˜the“name“(without˜sux)“of“the˜ rst“ leŽ¡‘øãname– encoun¸ãtered“in“the›command-line.‘ZYNote“that“if˜the“link“is“not“done“Å-o“²has“no˜sense“in“the“presenceŽ¡‘øãof–Xmš¸ãultiple“input“ le“names.‘ÆÐF‘ÿ*ªor“this“reason,‘Nsev˜eral“meta“c˜haracters“are“a˜v‘ÿqÇailable“for“substitution“inŽ¡‘øãÉFILE‘¼r²:Ž©jí‘ã¸ŽŽŽ‘ã Å%f–UU²is“substitued“b¸ãy“the“whole“input“ le“name.ޤµv‘ã¸ŽŽŽ‘ã Å%F–UU²is“similar“to“Å%f“²but“the“directory“part“is“omitted.Ž¡‘ã¸ŽŽŽ‘ã Å%p–UU²is“substitued“b¸ãy“the“whole“pre x“ le“name“(omitting“the“sux).Ž¡‘ã¸ŽŽŽ‘ã Å%P–UU²is“similar“to“Å%p“²but“the“directory“part“is“omitted.ŽŸµw‘ã¸ŽŽŽ‘ã Å%s–UU²is“substitued“b¸ãy“the“ le“sux“(including“the“dot).Ž¡‘ã¸ŽŽŽ‘ã Å%d–UU²is“substitued“bš¸ãy“the“directory“part“(empt˜y“if“no“directory“is“spGeci ed).Ž¡‘ã¸ŽŽŽ‘ã Å%c–UU²is“substitued“bš¸ãy“the“v‘ÿqÇalue“of“an“in˜ternal“coun˜ter“starting“from“1“and“auto-incremen˜ted.ަ‘øãBy–fÜdefault“the›fÛcompiler“runs“in“the˜nativš¸ãe-coGde“compilation“sc˜heme.‘"JT‘ÿ*ªo“generate‘fÛa“W‘þãAM‘fŸ le“for“b˜yte-coGdeޤ ‘øãuse–µ;the“Å--wam-for-byte-code›µ:²option.‘|ŽŽŽŽ ÃÝ» ý_"E‘øãT‘ÿ*ªo–,[execute“the›,ZProlog“to“W‘þãAM‘,#compiler“in“a“giv¸ãen˜Èr–ÿ}'e“ad‘Y¹envir“onment‘3²(opGerator‘,[de nitions,‘bc¸ãharacterޤ ‘øãcon•¸ãv“ersion›Pÿtable,.–ªª.“.“)‘use˜Å--pl-state˜ÉFILE‘¼r².‘QThe˜state˜ le˜should˜b•Ge˜pro“duced˜b¸ãy‘tŒÅwrite‘¡E‰ff&fŽ–Ç«pl‘¡E‰ff&fŽ“state‘¡E‰ff&fŽ“file/1Ž¡‘øã²(section–UU7.22.5,“page“136).Ž©‘øãBy–Àddefault“the›ÀcProlog“to“W‘þãAM‘À>compiler“inlines“calls˜to“some“deterministic“built-in“predicates˜(e.g.‘@"Åarg/3Ž¡‘øã²and–†RÅfunctor/3²).‘½Namely“a“call“to“suc¸ãh“a“predicate›†Qwill“not“yield“a“classical“predicate˜call“but“a“simpleŽ¡‘øãC–UUfunction“call“(whicš¸ãh“is“ob˜viously“faster).‘qÇIt“is“pGossible“to“a˜v˜oid“this“using‘xâÅ--no-inline².ަ‘øãAnother–Xoptimization“pGerformed“bš¸ãy“the“Prolog“to“W‘þãAM‘W×compiler“is“uni cation“reordering.‘^The“argumen˜tsŽ¡‘øãof–ƒxa“predicate“are“reordered“to“optimize“uni cation.›ü0This“can“bGe“deactiv‘ÿqÇated“using‘§Å--no-reorder².˜TheŽ¡‘øãcompiler–a0also“optimizes“the“uni cation/loading‘a/of“nested“compGound“terms.‘•XMore“precisely‘ÿ*ª,‘d&the“compilerŽ¡‘øãemits–Zoptimized“instructions“when“the›Zlast“subterm“of“a“compGound“term“is“itself˜a“compGound“term“(e.g.Ž¡‘øãlists).‘qÇThis–UUcan“bGe“deactiv‘ÿqÇated“using‘xâÅ--no-opt-last-subterm².ަ‘øãBy–šdefault“the›šProlog“to“W‘þãAM‘š~compiler“fully“optimizes˜the“alloGcation“of“registers“to˜decrease“bGoth“theŽ¡‘øãn•¸ãum“bšGer–9nof“instruction“pro˜duced“and“the“n•¸ãum“b˜er–9nof“used“registers.‘hzA‘9ggo˜o˜d“allo˜cation“will“generate“man¸ãyŽ¡‘øãÈvoid‘Þøinstructions‘y ²that–¦íare“remo•¸ãv“ed–¦ìfrom›¦íthe“proGduced˜ le˜except“if‘n Å--keep-void-inst˜²is“spGeci ed.‘fŽT‘ÿ*ªoŽ¡‘øãprev•¸ãen“t›Úan“y˜optimization–ÚŽuse˜Å--no-reg-opt˜²while˜Å--min-reg-opt˜²forces˜the“compiler˜to˜only˜pGerformŽ¡‘øãsimple–UUregister“optimizations.ަ‘øãThe–ÛProlog›Ûto“W‘þãAM‘Úúcompiler“emits˜an“error“when˜a“con¸ãtrol˜construct“or“a˜built-in“predicate˜is“rede ned.Ž¡‘øãThis–áæcan›áåbGe“a•¸ãv“oided˜using‘sÅ--no-redef-error².‘KMThe˜compiler–áæalso“emits˜w¸ãarnings“for˜suspicious“predicateŽ¡‘øãde nitions–Šãlik¸ãe›ŠäÅ-/2“²since˜this“often˜correspGonds“to˜an“earlier˜syn¸ãtax“error“(e.g.‘sÅ-“²instead˜of‘óE‰ff&fŽ‘«.‘sThis“canŽ¡‘øãbšGe–Tdeactiv‘ÿqÇated‘Sb¸ãy“sp˜ecifying‘'àÅ--no-susp-warn².‘VÇFinally‘ÿ*ª,‘‡the“compiler›Sw¸ãarns“when˜a“singleton˜v‘ÿqÇariable“hasŽ¡‘øãa–UUname“(i.e.›qÇnot“the“generic“anon¸ãymous“name‘öš‰ff&fŽ‘).˜This“can“bšGe“deactiv‘ÿqÇated“sp˜ecifying‘xâÅ--no-singl-warn².ަ‘øãPredicate–Oßnames“are›OÞencoGded“with“an“hexadecimal˜represen¸ãtation.‘oõThis“is“explained“in˜more“detail“laterŽ¡‘øã(section–…g3.4.6,‘®þpage“26).‘,xBy“default›…hthe“error“messages“from“the˜linkš¸ãer“(e.g.‘,xm˜ultiple“de nitions‘…hfor“a“giv˜enŽ¡‘øãpredicate,‘Ãreference–Þto“an“unde ned“predicate,.–ªª.“.“)‘U are–Þ ltered“to‘ßreplace“anš¸ãy“hexadecimal“represen˜tationŽ¡‘øãbš¸ãy–ÿNthe“real“predicate“name.‘USpGecifying“the“Å--no-decode-hexa“²prev˜en˜ts“Ågplc“²from“ ltering“link˜er“outputŽ¡‘øãmessages–UUand“hexadecimal“represenš¸ãtations“are“then“sho˜wn.ަ‘øãWhen–åÜprošGducing“an“executable‘åÛit“is“p˜ossible“to“sp˜ecify“default‘åÛstac¸ãk“sizes“(using‘ iÅ--ÉSTACK‘¡E‰ff&fŽ‘Ç«NAME‘¼rÅ-size²)Ž¡‘øãand–\Sto“prev•¸ãen“t–\Sit“from“consulting“en•¸ãvironmen“t–\Sv‘ÿqÇariables“(using‘àÅ--fixed-sizes²)“as“wš¸ãas“explained“abGo˜v˜eŽ¡‘øã(section– ¦3.3,›³zpage“19).‘SºBy“default“the‘ ¥proGduced“executable“will“include“the“top-lev¸ãel,˜the“Prolog/W‘þãAMŽ¡‘øãdebugger–2áand“all“Prolog“and“FD‘2¨built-in“predicates.‘ jIt“is“pGossible“to“a•¸ãv“oid–2álinking“the“top-lev¸ãel“(sec-Ž¡‘øãtion–Lü3.2,‘N¨page“13)“b¸ãy“spGecifying‘pŠÅ--no-top-level².‘nþIn“this›Lýcase,‘N§at“least˜one“Åinitialization/1“²directiv¸ãeŽ¡‘øã(section–‰;6.1.13,‘² page“45)‘‰|ŽŽŽŽ ÃÝ» ý_"E‘ã Å%–?ýgplc“-o“mycommand“prog.pl“utils.cޤ‘øã²Example:‘Afdetail–½%all“steps›½$to“compile“the˜Prolog“ le“Åprog.pl˜²(the“resulting“executable˜is“strippGed).‘©6AllŽ© ‘øãin¸ãtermediate–UU les“are“proGduced“(Åprog.wam²,“Åprog.ma²,“Åprog.s²,“Åprog.o“²and“the“executable“Åprog²):Ž¡‘ã Å%–?ýgplc“-W“prog.plަ‘ã %–?ýgplc“-M“--comment“prog.wamަ‘ã %–?ýgplc“-S“--comment“prog.maަ‘ã %–?ýgplc“-c“prog.sަ‘ã %–?ýgplc“-o“prog“-s“prog.oŽŸ%þ6‘øãÄ3.4.4Ž‘‰Running–ÕTan“executableŽŸuT‘øã²In–…vthis›…usection“w¸ãe˜explain“what˜happGens“when˜running“an˜executable“proGduced˜bš¸ãy“the“GNU‘…@Prolog“nativ˜e-ަ‘øãcoGde–Pcompiler.‘pThe›Pdefault“main“function˜ rst“starts˜the“Prolog˜engine.‘pThis˜function“collects˜all“link¸ãedަ‘øãob‘Ž8jects–š«(issued“from“the“compilation‘šªof“Prolog“ les)“and“initializes“them.‘AÈThe“initialization“of“a“Prologަ‘øãob‘Ž8ject–•’ le“consists“in›•‘adding“to“appropriate“tables“new“atoms,‘¥¡new“predicates˜and“executing“its“systemަ‘øãdirectiv•¸ães.‘BA‘šµsystem›šÇdirectiv“e˜is˜generated˜b“y˜the‘šÆProlog˜to˜W‘þãAM‘šµcompiler˜to˜re ect˜a˜(user)˜directiv“eަ‘øãexecuted–’Ýat›’Ücompile-time“suc¸ãh“as“Åop/3˜²(section“6.1.10,–¢?page˜44).‘*^Indeed,“when–’Ýthe˜compiler“encoun¸ãtersަ‘øãsuc•¸ãh›ZAa‘Z@directiv“e˜it˜immediately–Z@executes˜it˜and“also˜generates“a˜system˜directiv¸ãe“to˜execute˜it“at˜theަ‘øãstart–ðlof“the“executable.‘C When“all“system“directivš¸ães“ha˜v˜e“bGeen“executed“the“Prolog“engine“executes“allަ‘øãinitialization–þÞdirectivš¸ães“de ned“with“Åinitialization/1“²(section‘þÝ6.1.13,‘)page“45).‘TõIf“sev˜eral“initializationަ‘øãdirectiv¸ães–®…appGear›®†in“the˜same“ le“they˜are“executed˜in“the“order˜of“appGearance.‘}XIf˜sev¸ãeral“initializationަ‘øãdirectivš¸ães–\VappGear‘\Win“di eren˜t›\W les“the“order˜in“whic¸ãh“they˜are“executed˜is“mac•¸ãhine-depGendan“t.‘†ËHo“w“ev“er,ަ‘øãon–Påmost›Pämac¸ãhines“the˜order“will˜bGe“the˜rev¸ãerse“order“in˜whic¸ãh“the˜assoGciated“ les˜ha•¸ãv“e‘PåbGeen˜link“ed‘På(thisަ‘øãis–.not›-true“under˜nativ¸ãe“win32).‘IQWhen˜all“initialization˜directivš¸ães“ha˜v˜e“bGeen›-executed“the˜default“mainަ‘øãfunction–6LloGoks›6Mfor“the“GNU‘6DProlog˜top-levš¸ãel.‘goIf“presen˜t“(i.e.‘goit“has“bGeen‘6Mlink˜ed)“it“is“called‘6Motherwise“theަ‘øãprogram–\simply“ends.‘[uNote“that“if“the‘]top-levš¸ãel“is“not“link˜ed“and›]if“there“is“no˜initialization“directiv¸ãe“theަ‘øãprogram–Xfis›Xeuseless“since“it˜simply“ends“without˜doing“anš¸ãy“w˜ork.‘zùThe›Xedefault“main“function˜detects“suc¸ãhަ‘øãa–UUbGehaš¸ãvior“and“emits“a“w˜arning“message.ŽŸ‘øãExample:‘qÇcompile–UUan“emptš¸ãy“ le“Åprog.pl“²without“linking“the“top-lev˜el“and“execute“it:Ž¡‘ã Å%–?ýgplc“--no-top-level“prog.plަ‘ã %‘?ýprogަ‘ã Warning:–?ýno“initial“goal“executedަ‘!£use–?ýa“directive“:-“initialization(Goal)ަ‘!£or–?ýremove“the“link“option“--no-top-level“(or“--min-bips“or“--min-size)ŽŸ%þ6‘øãÄ3.4.5Ž‘‰Generating–ÕTa“new“in•®9teractiv“e‘ÕTin“terpreterŽŸuT‘øã²In–ythis“section‘ywš¸ãe“sho˜w“ho˜w“to‘yde ne“a“new“top-lev˜el‘yextending“the“GNU‘xøProlog“in˜teractiv˜e“in˜terpreterަ‘øãwith–y new“predicate–yŸde nitions.‘Þ¨The“obtained–y top-lev¸ãel“can“then›yŸbGe“considered“as“an˜enricš¸ãhed“v˜ersion“ofަ‘øãthe–ÙIbasic›ÙHGNU‘Ù'Prolog“top-lev¸ãel˜(section“3.2,›úEpage“13).‘ý¢Indeed,˜eac¸ãh“added›ÙHpredicate“can“bGe˜view¸ãed“asަ‘øãa– prede ned› predicate“just˜likš¸ãe“an˜y› other“built-in˜predicate.‘¤íThis˜can“bGe˜ac•¸ãhiev“ed‘ b“y˜compiling‘ theseަ‘øãpredicates–UUand“including“the“top-lev¸ãel“at“link-time.ŽŸ‘øãThe– real›question“is:‘¡wh•¸ãy˜w“ould‘ w“e˜include– some˜predicates“in“a˜new“top-lev¸ãel˜instead“of˜simply“consultingަ‘øãthem–UUunder“the“GNU“Prolog“top-levš¸ãel“?‘qÇThere“are“t˜w˜o“reasons“for“this:Ž¡‘ã¸ŽŽŽ‘ã ²the–ʆpredicate“cannot›ʇbGe“consulted.‘Ñ[This“is“the“case˜of“a“predicate“calling“foreign˜coGde,‘'Òlik¸ãe“aަ‘ã predicate–UUinš¸ãterfacing“with“C“(section“9,“page“183)“or“a“predicate“de ning“a“new“FD“constrain˜t.Ž¡‘ã¸ŽŽŽ‘ã ²the–òçpšGerformance“of“the“predicate“is“crucial.‘PøSince“it“is“compiled“to“nativ¸ãe-co˜de“suc¸ãh“a“predicate“willަ‘ã bGe–Òexecuted‘Óvš¸ãery“quic˜kly‘ÿ*ª.‘[FConsulting“will“load‘Óit“as“b˜yte-coGde.‘[FThe‘Ógain“is“m˜uc˜h“more‘Ónoticeable“ifŽŽŸŽŒ‹_ Ú‹– ý"EŸüfd‘øã²26ŽŽŽ’H¯3‘ USING–UUGNU“PR¸ãOLOGŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã the–TKprogram“is“run“under“the“debugger.‘qnThe“included“vš¸ãersion“will“not“bGe“a ected“b˜y“the“debuggerޤ ‘ã while–PTthe›PUconsulted“v¸ãersion“will˜bGe“sev¸ãeral˜times“slo•¸ãw“er.‘pOb“viously‘ÿ*ª,‘QUa–PTpredicate“should˜bGe“includedŽ¡‘ã in–UUa“new“top-levš¸ãel“only“when“it“is“itself“debugged“since“it“is“dicult“to“debug“nativ˜e-coGde.Ž©‘øãT‘ÿ*ªo–À‡de ne›À†a“new“top-lev¸ãel“simply˜compile“the“set˜of“desired“predicates˜and“linking“them“with˜the“GNUŽ¡‘øãProlog–UUtop-lev¸ãel“(this“is“the“default)“using‘xâÅgplc“²(section“3.4.3,“page“22).ŽŸ‘øãExample:‘qÇlet–UUus“de ne“a“new“top-lev¸ãel“called“Åmy‘¡E‰ff&fŽ–Ç«top‘¡E‰ff&fŽ“level–UU²including“all“predicates“de ned“in“Åprog.pl²:ަ‘ã Å%–?ýgplc“-o“my‘¡E‰ff&fŽ–Ç«top‘¡E‰ff&fŽ“level‘?ýprog.plަ‘øã²By‘‘the›w•¸ãa“y‘ÿ*ª,‘!…note˜that–‘if‘Û®Åprog.pl˜²is“an˜empt¸ãy“Prolog˜ le“the“previous˜command“will˜simply“create˜a“newŽ¡‘øãin•¸ãteractiv“e›UUin“terpreter˜similar˜to˜the˜GNU˜Prolog˜top-lev“el.ŽŸ‘øãExample:‘qÇas–UUbGefore“where“some“predicates“of‘rÅprog.pl“²call“C“functions“de ned“in“Åutils.c²:ަ‘ã Å%–?ýgplc“-o“my‘¡E‰ff&fŽ–Ç«top‘¡E‰ff&fŽ“level–?ýprog.pl“utils.cަ‘øã²In–±Œconclusion,‘šde ning“a“particular›±top-lev¸ãel“is“nothing“else˜but“a“particular“case˜of“the“nativ¸ãe-coGdeŽ¡‘øãcompilation.‘qÇIt–UUis“simple“to“do“and“v¸ãery“useful“in“practice.ŽŸ%þ6‘øãÄ3.4.6Ž‘‰The–ÕThexadecimal“predicate“name“encoQÇdingŽŸuT‘øã²When–ô the“GNU‘ôProlog›ôcompiler“compiles“a“Prolog“source˜to“an“ob‘Ž8ject“ le˜it“has“to“assoGciate˜a“sym¸ãbGol“toŽ¡‘øãeac•¸ãh›šçpredicate‘šæname.‘B|Ho“w“ev“er,‘¬Kthe˜syn“tax˜of˜sym“bGols–šæis˜restricted˜to“idenš¸ãti ers:‘üëstring“con˜taining‘šçonlyŽ¡‘øãletters,‘IÈdigits–äor›åunderscore“c¸ãharacters.‘¼uOn“the˜other“hand,‘IÈpredicate“names“(i.e.‘¼uatoms)˜can“con¸ãtainŽ¡‘øãan•¸ãy›y*c“haracter˜with–y)quotes˜if˜necessary˜(e.g.‘ÝEÅ'x+y=z'˜²is“a˜v‘ÿqÇalid˜predicate˜name).‘ÝEThe˜compiler“has˜thenŽ¡‘øãto–IéencoGde›Iêpredicate“names˜respGecting“the˜synš¸ãtax“of“iden˜ti ers.‘O…T‘ÿ*ªo“ac˜hiev˜e–Iêthis,‘‡GNU‘IªProlog“uses‘IéanŽ¡‘øãhexadecimal–)represenš¸ãtation“where“eac˜h‘)predicate“name“is“translated“to“a“sym˜b•Gol‘)b“eginning–)with“an“ÅXŽ¡‘øã²follo•¸ãw“ed›UUb“y˜the˜hexadecimal˜notation˜of˜the˜coGde˜of˜eac“h˜c“haracter˜of˜the˜name.Ž©‘øãExample:‘ Å'x+y=z'–#²will‘"ÿbšGe“enco˜ded“as“ÅX782B793D7A‘"˲since“Å78“²is“the‘"ÿhexadecimal“represen¸ãtation“of“theŽ¡‘øãcošGde–UUof‘rÅx²,“Å2B“²of“the“co˜de“of‘rÅ+²,“etc.ަ‘øãSince–¸ÊProlog›¸Éallo¸ãws“the“user“to˜de ne“sev¸ãeral“predicates˜with“the“same˜name“but“with“a˜di erenš¸ãt“arit˜yŽ¡‘øãGNU‘&Prolog–:encoGdes“predicate“indicators›9(predicate“name“follo•¸ãw“ed‘:b“y˜the›:arit“y).‘XThe˜sym“b•Gol˜asso“ciatedŽ¡‘øãwith–UUthe“predicate“name“is“then“follo•¸ãw“ed›UUb“y˜an˜underscore˜and˜b“y˜the˜decimal˜notation˜of˜the˜arit“y‘ÿ*ª.ަ‘øãExample:‘qÇÅ'x+y=z'/3–UU²will“bšGe“enco˜ded“as“ÅX782B793D7A‘¡E‰ff&fŽ‘Ç«3².ަ‘øãSo,›Aofrom–indicators.‘È…This“ ltering˜can˜bGe˜deactiv‘ÿqÇated“spGecifying‘•ÌÅ--no-decode-hexaŽ¡‘øã²when›UUin•¸ãv“oking‘xâÅgplc˜²(section˜3.4.3,˜page˜22).ަ‘øãThis–UU lter“is“proš¸ãvided“as“an“utilit˜y“that“can“bGe“in˜v˜ok˜ed“using“the“Åhexgplc“²command“as“follo˜ws:ޤžæd‘ã Å%–?ýhexgplc“²[ÉOPTION›¼r²].–ªª.“.‘ê§ÉFILE˜².“.“.ŽŽŽ’®`„(the–UUÅ%“²sym¸ãbšGol“is“the“op˜erating“system“shell“prompt)ŽŽŽŽŽ¡‘øãÄOptions²:ŽŽŸŽŒ‹q Ú‹– ý"EŸüfd‘øã²3.4‘ The–UUGNU“Prolog“compilerŽŽŽ’¶!27ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý“¢EŸÉæd‘þãÅ--encodeŽŽŽ’Šì›²enco•Gding›UUmo“de˜(default˜mo“de˜is˜deco“ding)ŽŽ¤ ‘þãÅ--relaxŽŽŽ’Šì›²decoGde–UUalso“predicate“names“(not“only“predicate“indicators)ŽŽ¡‘þãÅ--printf‘UUÉFORMATŽŽŽ’Šì›²pass›UUenco•Gded/deco“ded˜string˜to˜C˜Åprintf(3)˜²with˜ÉFORMATŽŽ¡‘þãÅ--aux-fatherŽŽŽ’Šì›²decoGde–UUan“auxiliary“predicate“as“its“fatherŽŽ¡‘þãÅ--aux-father2ŽŽŽ’Šì›²decošGde–UUan“auxiliary“predicate“as“its“father“+“auxiliary“n•¸ãum“b˜erŽŽ¡‘þãÅ--cmd-lineŽŽŽ’Šì›²enco•Gde/deco“de–UUeacš¸ãh“argumen˜t“of“the“command-lineŽŽ¡‘þãÅ-HŽŽŽ’Šì›²same‘UUas:‘qÇÅ--cmd-line‘?ý--encodeŽŽ¡‘þã-PŽŽŽ’Šì›²same‘UUas:‘qÇÅ--cmd-line‘?ý--relaxŽŽ¡‘þã--helpŽŽŽ’Šì›²prin¸ãt–UUa“help“and“exitŽŽ¡‘þãÅ--versionŽŽŽ’Šì›²prin•¸ãt›UUv“ersion˜n“um“bGer˜and˜exitŽŽŽŽŽŸMqÇ‘øãIt–UUis“pGossible“to“givš¸ãe“a“pre x“of“an“option“if“there“is“no“am˜biguit˜y‘ÿ*ª.Ž©‘øãWithout–©ˆargumen¸ãts“Åhexgplc“²runs“in“decošGding“mo˜de“reading“its“standard“input“and“deco˜ding“eacš¸ãh“sym˜bGolޤ ‘øãcorrespšGonding– Ëto“a“predicate– Êindicator.‘YšT‘ÿ*ªo“use– ËÅhexgplc“²in“the“enco˜ding“mo˜de‘ Êthe“Å--encode“²option“m¸ãustŽ¡‘øãb•Ge›Ëesp“eci ed.‘ÓõBy˜default–ËdÅhexgplc˜²only“decoGdes˜predicate“indicators,‘èèthis˜can“bGe˜relaxed“using‘îòÅ--relaxŽ¡‘øã²to–RÅalso‘RÆtakš¸ãe“in˜to‘RÆaccoun˜t“simple›RÆpredicate“names˜(the“arit¸ãy“can˜bGe“omitted).‘píIt“is˜pGossible“to˜format“theŽ¡‘øãoutput–\of“an“enco•Gded/deco“ded–[string›\using‘7éÅ--printf‘?ýÉFORMAT‘о²in“that˜case˜eac¸ãh˜string‘7éÉS‘н²is˜passed˜to˜theŽ¡‘øãC–UUÅprintf(3)“²function“as“Åprintf(ÉFORMAT–¼rÅ,ÉS“Å)².ަ‘øãAuxiliary–~[predicates“are›~Zgenerated“b¸ãy“the“Prolog“to“W‘þãAM‘~Pcompiler“when“simplifying˜some“con¸ãtrol“con-Ž¡‘øãstructs–žƒlikš¸ãe‘ž„Å';'/2“²presen˜t“in›ž„the“b•Go“dy–žƒof˜a“clause.‘MRThey“are˜of“the“form˜Å'$ÉNAME–¼rÅ/ÉARITY‘]·‰ff&fŽ‘„Å$auxÉN“Å'‘žp²whereŽ¡‘øãÉNAME‘¼rÅ/ÉARITY‘µ²is–ø¹the›ø¸predicate“indicator˜of“the˜simpli ed“(i.e.‘Rèfather)˜predicate“and˜ÉN‘µ²is“a˜sequenš¸ãtial“n˜um-Ž¡‘øãbGer–¦w(a“predicate“can“givš¸ãe‘¦vrise“to“sev˜eral“auxiliary“predicates).‘e-It“is“pšGossible‘¦vto“force“Åhexgplc“²to“deco˜deŽ¡‘øãan–f~auxiliary“predicate“as“its“father“predicate‘f}indicator“using‘Š Å--aux-father“²or“as“its“father“predicateŽ¡‘øãindicator›UUfollo•¸ãw“ed˜b“y˜the˜sequen“tial˜n“um“bGer˜using‘xâÅ--aux-father2².ަ‘øãIf–V¡no›V  le“is“sp•Geci ed,‘–óÅhexgplc˜²pro“cesses–V¡its“standard˜input“otherwise˜eac¸ãh“ le“is˜treated“sequen¸ãtially‘ÿ*ª.Ž¡‘øãSpGecifying–Ëèthe“Å--cmd-line‘Ëç²option“informs“Åhexgplc“²that“eacš¸ãh“argumen˜t›Ëçis“not“a“ le“name˜but“a“stringŽ¡‘øãthat–Z9m¸ãust‘Z:bšGe“enco˜ded“(or‘Z:deco˜ded).‘€tThis“is‘Z:useful“to“enco˜de/deco˜de›Z:a“particular“string.‘€tF‘ÿ*ªor˜this“reasonŽ¡‘øãthe–§option›§Å-H‘¦þ²(encoGde“to˜hexadecimal)“and˜Å-P‘¦þ²(decoGde“to˜Prolog)“are“pro¸ãvided˜as“shorthand.‘gThen,‘»ƒtoŽ¡‘øãobtain–UUthe“hexadecimal“represen¸ãtation“of“a“predicate“ÉP‘Dzuse:ޤ‘ã Å%–?ýhexgplc“-H“ÉPŽ¡‘øã²Example:Ž¡‘ã Å%–?ýhexgplc“-H“'x+y=z'ŽŸ ‘ã X782B793D7AŽŽŸŽŒ‹‚; Ú‹– ý"EŸüfd‘øã²28ŽŽŽ’H¯3‘ USING–UUGNU“PR¸ãOLOGŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ»ŸŽŒ‹: Ú‹– ý"EŸüfd’¶!²29ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øã¼4Ž‘/ÒDebuggingŽŸ#ç‘øãÇ4.1Ž‘£In tro`ductionŽ©uT‘øã²The–E}GNU‘E8Prolog“debugger“proš¸ãvides“information“concerning“the“con˜trol‘E~ o˜w“of“the“program.‘*The“debuggerޤ ‘øãcan–döbšGe“fully“used“on“consulted“predicates“(i.e.‘ ©b¸ãyte-co˜de).‘ ªF‘ÿ*ªor“nativ¸ãe“compiled“co˜de“only“the“calls/exitsŽ¡‘øãare–ztraced,‘5Dno“inš¸ãternal“bGeha˜vior“is‘{sho˜wn.‘‹7Under“the“debugger“it‘{is“pGossible“to“exhaustiv˜ely‘{trace“theŽ¡‘øãexecution–E¥or›E¤to“set˜sp•¸ãy-pGoin“ts–E¥to˜only“debug“a˜spGeci c“part˜of“the˜program.‘lSp•¸ãy-pGoin“ts˜allo“w–E¥the˜user“toŽ¡‘øãindicate–õ|ŽŽŽŽ ÃÝ» ý_"E‘øãthe–}debugger“is“on.‘4€F‘ÿ*ªor“eciency“reasons,‘ÂBwhen“the“debugger“is“o “the“information“concerning“the“con¸ãtrolޤ ‘øã oš¸ãw–^½(i.e.‘Žthe“bGo˜xes)“is“not“retained.‘ŽSo,‘aif“the“debugger›^¾is“activ‘ÿqÇated“in“the“middle“of˜a“computation“(b¸ãyŽ¡‘øãa–ÿ‚call›ÿto“Ådebug/0˜²or“Åtrace/0˜²in“the“program˜or“after˜the“inš¸ãterrupt“k˜ey‘ÿsequence“(ÅCtl-C²)‘ÿUb˜y“c˜hoGosingŽ¡‘øãÅtrace–UU²or“Ådebug²),“information“prior“to“this“pGoinš¸ãt“is“not“a˜v‘ÿqÇailable.Ž©‘øãÅdebugging/0²:‘N‡prin•¸ãts›õon“to˜the˜terminal˜information‘ôabGout˜the˜curren“t˜debugging˜state˜(whether˜theŽ¡‘øãdebugger–UUis“switcš¸ãhed“on,“what“are“the“leashed“pGorts,“sp˜y-pGoin˜ts“de ned,.–ªª.“.“).ަ‘øãÅnotrace/0–UU²or“Ånodebug/0“²switc¸ãhes“the“debugger“o .ަ‘øãÅwam‘¡E‰ff&fŽ‘Ç«debug/0›á?²in•¸ãv“ok“es–á>the˜sub-debugger“dev¸ãoted˜to˜the“W‘þãAM‘ádata“structures˜(section˜4.6,‘9page“32).‘„ItŽ¡‘øãcan–UUbGe“also“in•¸ãv“ok“ed–UUusing“the“ÅW“²debugger“command“(section“4.5,“page“31).Ž©%þ6‘øãÄ4.3.2Ž‘‰Leashing‘ÕTpQÇortsŽŸuT‘øãÅleash(Ports)–í²requests“the“debugger“to“prompt‘íthe“user,‘as“he“creeps“through“the“program,‘for“ev¸ãeryŽ¡‘øãpGort–íde ned“in“the‘ìÅPorts“²list.‘_úEacš¸ãh“elemen˜t“of‘ç ÅPorts“²is“an“atom“in“Åcall²,–*›Åexit²,“Åredo²,‘*œÅfail²,“Åexception².Ž¡‘øãÅPorts–UU²can“also“bGe“an“atom“de ning“a“shorthand:ޤ‘ã¸ŽŽŽ‘ã Åfull²:‘qÇequiv‘ÿqÇalen¸ãt–UUto“Å[call,–?ýexit,“redo,“fail,“exception]Ž¡‘ã¸ŽŽŽ‘ã Åhalf²:‘qÇequiv‘ÿqÇalen¸ãt–UUto“Å[call,‘?ýredo]Ž¡‘ã¸ŽŽŽ‘ã Åloose²:‘qÇequiv‘ÿqÇalen¸ãt–UUto“Å[call]Ž¡‘ã¸ŽŽŽ‘ã Ånone²:‘qÇequiv‘ÿqÇalen¸ãt–UUto“Å[]Ž¡‘ã¸ŽŽŽ‘ã Åtight²:‘qÇequiv‘ÿqÇalen¸ãt–UUto“Å[call,–?ýredo,“fail,“exception]Ž¡‘øã²When–ran›sunleashed“pGort˜is“encoun¸ãtered˜the“debugger˜con•¸ãtin“ues‘rto˜sho“w–rthe˜assoGciated“goal˜but“doGes˜notޤ ‘øãstop–UUthe“execution“to“prompt“the“user.ަ‘øãÄ4.3.3Ž‘‰Sp•®9y-pQÇoin“tsŽŸuT‘øã²When–˜ídealing“with“big“sources“it“is“not‘˜ìvš¸ãery“practical“to“creep“through“the“en˜tire“program.‘2úIt“is“preferableŽ¡‘øãto–o+de ne›o*a“set“of“sp•¸ãy-pGoin“ts˜on›o+in“teresting˜predicates–o*to˜bGe˜prompted“when˜the˜debugger˜reac¸ãhes“one˜ofŽ¡‘øãthese›’§predicates.‘0âSp•¸ãy-pGoin“ts˜can˜bGe–’¦added˜either˜using‘¶3Åspy/1˜²(or˜Åspypoint‘¡E‰ff&fŽ‘Ç«condition/3²)“or˜dynamicallyŽ¡‘øãwhen–˜#prompted“b¸ãy›˜"the“debugger“using“the˜Å+“²(or“Å*²)“debugger˜command“(section“4.5,‘½úpage“31).‘2¶The“curren¸ãtŽ¡‘øãmošGde–Gof‘Gleashing“do˜es‘Gnot“a ect“sp•¸ãy-p˜oin“ts–Gin›Gthe“sense˜that“user˜in¸ãteraction˜is“requested˜on“ev¸ãery˜pGort.Ž©‘øãÅspy(PredSpec)–Ä`²sets“a›Ä_sp•¸ãy-pGoin“t–Ä`on“all“the“predicates“giv•¸ãen˜b“y‘çíÅPredSpec².‘AvÅPredSpec–Ä`²de nes˜one“or“sev¸ãeralŽ¡‘øãpredicates–UUand“has“one“of“the“follo¸ãwing“forms:ޤ‘ã¸ŽŽŽ‘ã Å[PredSpec1,‘?ýPredSpec2,...]²:‘qÇset–UUa“sp•¸ãy-pGoin“t–UUfor“eacš¸ãh“elemen˜t“of“the“list.Ž¡‘ã¸ŽŽŽ‘ã ÅName²:‘qÇset–UUa“sp•¸ãy-pGoin“t–UUfor“anš¸ãy“predicate“whose“name“is“ÅName“²(whatev˜er“the“arit˜y).Ž¡‘ã¸ŽŽŽ‘ã ÅName/Arity²:‘qÇset–UUa“sp•¸ãy-pGoin“t–UUfor“the“predicate“whose“name“is“ÅName“²and“arit¸ãy“is“ÅArity².Ž¡‘ã¸ŽŽŽ‘ã ÅName/A1-A2²:‘Áìset–ýga“sp•¸ãy-pGoin“t–ýgfor›ýhthe“eac¸ãh“predicate˜whose“name“is˜ÅName“²and“arit¸ãy“is˜bGet•¸ãw“een‘ýgÅA1ŽŸ ‘ã ²and‘UUÅA2².Ž¡‘øãIt–UUis“not“pšGossible“to“set“a“sp•¸ãy-p˜oin“t–UUon“an“unde ned“predicate.ަ‘øãThe–UUfolloš¸ãwing“predicate“is“used“to“remo˜v˜e“one“or“sev˜eral“sp˜y-pGoin˜ts:ަ‘øãÅnospy(PredSpec)›UU²remo•¸ãv“es˜the˜sp“y-pGoin“ts˜from˜the˜spGeci ed˜predicates.ŽŽŸŽŒ‹Ÿ› Ú‹– ý"EŸüfd‘øã²4.4‘ Debugging‘UUmessagesŽŽŽ’¶!31ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅnospyall/0›UU²remo•¸ãv“es˜all˜sp“y-pGoin“ts:ޤ‘øãIt–UUis“also“pšGossible“to“de ne“conditional“sp•¸ãy-p˜oin“ts.Ž¡‘øãÅspypoint‘¡E‰ff&fŽ‘Ç«condition(Goal,–?ýPort,“Test)–c²sets›ba“conditional˜sp•¸ãy-pGoin“t–con“the˜predicate“for˜ÅGoal².‘VÌWhenޤ ‘øãthe–Àdebugger“reacš¸ãhes“a“conditional“sp˜y-pGoin˜t“it“only“sho˜ws“the“assoGciated“goal“if“the“follo˜wing“conditionsŽ¡‘øãare‘UUv¸ãeri ed:ޤ‘ã¸ŽŽŽ‘ã ²the–UUactual“goal“uni es“with“ÅGoal².Ž¡‘ã¸ŽŽŽ‘ã ²the–UUactual“pGort“uni es“with“ÅPort².Ž¡‘ã¸ŽŽŽ‘ã ²the–UUProlog“goal“ÅTest“²succeeds.ŽŸ'þ6‘øãÇ4.4Ž‘£Debugging‘€messagesŽŸuT‘øã²W‘ÿ*ªe–£˜here“describGed‘£™whicš¸ãh“information“is“displa˜y˜ed‘£™b˜y“the“debugger“when“it‘£™sho˜ws“a“goal.‘6‰The“basic“formatŽ© ‘øãis–UUas“follo¸ãws:Ž¡‘ã ÉS–?ýN“M“Port‘¼rÅ:“ÉGoal‘üoÅ?Ž¡‘øãÉS‘{.²is›¾âa‘¾ãsp•¸ãy-pGoin“t˜indicator:‘&if‘¾ãthere˜is˜a˜sp“y-pGoin“t‘¾ãon˜the˜curren“t˜goal˜the‘¾ãÅ+˜²sym“bGol˜is˜displa“y“ed‘¾ãelse˜a˜spaceަ‘øãis›´Èdispla•¸ãy“ed.‘ÉPort‘+C²spGeci es“the“particularަ‘øãpGort‘îV(Åcall²,–•Åexit²,›–Åfail²,“Åredo²,˜Åexception²).‘<ÉÉGoal‘ªÈ²is›îUthe–îVcurren¸ãt“goal˜(it“is˜then“pGossible“to˜inspGect“itsަ‘øãcurren•¸ãt›—–instan“tiation)‘——whic“h˜is˜displa“y“ed–——using‘»#Åwrite‘¡E‰ff&fŽ‘Ç«term/3˜²with˜Åquoted(true)“²and˜Åmax‘¡E‰ff&fŽ‘Ç«depth(ÉD‘¼rÅ)ަ‘øã²options–‰(section“7.14.6,‘)~page“96).‘_ƒInitially‘BÉD‘Úí²(the“prin¸ãt“depth)“is“set“to“10“but‘ˆcan“bGe“rede ned“using“theަ‘øãÅ<–äà²debugger“command›äá(section“4.5,‘Âpage˜31).‘ hThe“Å?‘ i²symš¸ãbGol“is“displa˜y˜ed“when“the‘äádebugger“is“w˜aitingަ‘øãa–#³command“from›#´the“user.‘Üá(i.e.‘ÜâÅPort“²is“a“leashed˜pGort).‘ÜáIf“the˜pGort“is“unleashed,‘WJthis˜sym¸ãbGol“is“notަ‘øãdispla•¸ãy“ed–UUand“the“debugger“con•¸ãtin“ues–UUthe“execution“displa¸ãying“the“next“goal.ŽŸ'þ6‘øãÇ4.5Ž‘£Debugger‘€commandsŽŸuT‘øã²When–šthe›šdebugger“reac¸ãhes“a˜leashed“pGort“it˜shoš¸ãws“the“curren˜t“goal‘šfollo˜w˜ed“b˜y“the‘šÅ?–@²sym˜bGol.“A˜t‘šthisަ‘øãpGoinš¸ãt–Ðçthere“are“man˜y“commands‘Ðæa˜v‘ÿqÇailable.‘ä}T˜yping‘ôtÅRETURN‘ÐDzwill“creep“in˜to“the‘Ðæprogram.‘ä}Con˜tin˜uing“toަ‘øãcreep–bžwill›bŸsho¸ãw“all˜the“con•¸ãtrol˜ o“w.‘™£The˜debugger‘bžsho“ws˜ev“ery–bžpGort˜for“ev¸ãery˜predicate“encoun¸ãteredަ‘øãduring–U|ŽŽŽŽ ÃÝ» þxo ‘øã þÝŸ‰ffÄ»"¤fd¤™œ„ ff–ŸüfdCommand“¡„ ffŽ‘XE¼Name‘x蟙œ„ ffŽ’–l*DescriptionŽŽ’ÄT¼Ÿ™œ„ ffŽŽ©‰ffÄ»"Ÿff‰ffÄ»"¡¤™œ„ ff› 5_ŸüfdÅRET–UU²or“Åc˜¡„ ffŽ‘Y‚/²creep‘µ[Ÿ™œ„ ffŽ’–l*single-step–UUto“the“next“pGortŽŽ’ÄT¼Ÿ™œ„ ffŽŽ¦‰ffÄ»"¡¤™œ„ff‘àŸðfdÅl‘à¡„ffŽ‘\½²leap‘"8蟙œ„ffŽ’–l*con•¸ãtin“ue–¿the›¿execution“only“stopping˜when“a“goal“with˜a“sp•¸ãy-pGoin“tŽŸ ’–l*is‘UUreac¸ãhedŽŽ’ÄT¼Ÿ™œ„ffŽŽ©‰ffÄ»"¡¤™œ„ff‘àŸðfdÅs‘à¡„ffŽ‘\".²skip‘"UZŸ™œ„ffŽ’–l*skip›¾¼o•¸ãv“er˜the˜en“tire˜execution˜of˜the‘¾½curren“t˜goal.‘­üNo˜message˜willŽŸ ’–l*bGe–UUshoš¸ãwn“un˜til“con˜trol“returnsŽŽ’ÄT¼Ÿ™œ„ffŽŽ¦‰ffÄ»"¡¤™œ„ff‘àŸðfdÅG‘à¡„ffŽ‘YÌÙ²go‘UUto‘ Ÿ™œ„ffŽ’–l*ask–¥Jfor“an“in•¸ãv“ošGcation‘¥Jn“um“b˜er–¥Jand“con•¸ãtin“ue–¥Jthe“execution“un¸ãtil“a“p˜ortŽŸ ’–l*is–UUreacš¸ãhed“for“that“in˜v˜oGcation“n˜um˜bGerŽŽ’ÄT¼Ÿ™œ„ffŽŽ¦‰ffÄ»"¡¤'™œ„0ff‘àŸØfdÅr‘à¡„0ffŽ‘Z0g²retry‘ c“Ÿ'™œ„0ffŽ’–l*try–Ž to›Ž¡restart“the˜in•¸ãv“oGcation–Ž of˜the“curren¸ãt˜goal“b¸ãy˜failing“un•¸ãtil˜reac“h-ޤ ’–l*ing› ‚the‘ in•¸ãv“oGcation˜of˜the– goal.‘‘MThe˜state“of˜execution˜is“the˜sameŽ¡’–l*as–îwhen›íÿthe“goal“w¸ãas˜initially“in•¸ãv“ok“ed–î(except“when˜using“side-e ectŽ¡’–l*predicates)ŽŽ’ÄT¼Ÿ'™œ„0ffŽŽŸ(‰ffÄ»"¡¤™œ„ ff‘àŸüfdÅf‘à¡„ ffŽ‘^²fail‘$N=Ÿ™œ„ ffŽ’–l*force–UUthe“curren¸ãt“goal“to“fail“immediatelyŽŽ’ÄT¼Ÿ™œ„ ffŽŽ©‰ffÄ»"¡¤™œ„ ff‘àŸüfdÅw‘à¡„ ffŽ‘YÉK²write‘üwŸ™œ„ ffŽ’–l*shoš¸ãw–UUthe“curren˜t“goal“using‘xâÅwrite/2“²(section“7.14.6,“page“96)ŽŽ’ÄT¼Ÿ™œ„ ffŽŽ¦‰ffÄ»"¡¤™œ„ ff‘àŸüfdÅd‘à¡„ ffŽ‘U›²displa¸ãy‘Î<Ÿ™œ„ ffŽ’–l*shoš¸ãw–UUthe“curren˜t“goal“using‘xâÅdisplay/2“²(section“7.14.6,“page“96)ŽŽ’ÄT¼Ÿ™œ„ ffŽŽ¦‰ffÄ»"¡¤™œ„ ff‘àŸüfdÅp‘à¡„ ffŽ‘Z3õ²prin¸ãt‘ g!Ÿ™œ„ ffŽ’–l*shoš¸ãw–UUthe“curren˜t“goal“using‘xâÅprint/2“²(section“7.14.6,“page“96)ŽŽ’ÄT¼Ÿ™œ„ ffŽŽ¦‰ffÄ»"¡¤™œ„ ff‘àŸüfdÅe‘à¡„ ffŽ‘P7‚²exception‘j®Ÿ™œ„ ffŽ’–l*sho¸ãw–T9the›T:pGending“exception.‘qiOnly“applicable˜to“an˜Åexception“²pGortŽŽ’ÄT¼Ÿ™œ„ ffŽŽ¦‰ffÄ»"¡¤™œ„ ff‘àŸüfdÅg‘à¡„ ffŽ‘P׃²ancestors‘ ¯Ÿ™œ„ ffŽ’–l*shoš¸ãw–UUthe“list“of“ancestors“of“the“curren˜t“goalŽŽ’ÄT¼Ÿ™œ„ ffŽŽ¦‰ffÄ»"¡¤™œ„ff‘àŸðfdÅA‘à¡„ffŽ‘K—‚²alternativ¸ães‘Ê­Ÿ™œ„ffŽ’–l*sho¸ãw–c[the›cZlist“of˜ancestors“of˜the“curren¸ãt˜goal“com¸ãbined˜with“c¸ãhoice-ŽŸ ’–l*pGoin¸ãtsŽŽ’ÄT¼Ÿ™œ„ffŽŽ©‰ffÄ»"¡¤™œ„$ff‘àŸäfdÅu‘à¡„$ffŽ‘YÌØ²unify‘ Ÿ™œ„$ffŽ’–l*ask–4for›3ÿa“term“and˜unify“the“curren¸ãt˜goal“with“this˜term.‘ ÇThis“isޤ ’–l*con•¸ãv“enien“t–Áfor›Ágetting“a˜spGeci c“solution.‘´ÉOnly“a¸ãv‘ÿqÇailable˜at“a˜ÅcallŽ¡’–l*²pGortŽŽ’ÄT¼Ÿ™œ„$ffŽŽŸ‰ffÄ»"¡¤™œ„ff‘àŸðfdÅ.‘à¡„ffŽ‘OìØ²father‘UU le‘ Ÿ™œ„ffŽ’–l*sho¸ãw–8 the›8 Prolog“ le“name˜and“the˜line“n•¸ãum“bGer–8 where˜the“curren¸ãtŽŸ ’–l*predicate–UUis“de nedŽŽ’ÄT¼Ÿ™œ„ffŽŽ¦‰ffÄ»"¡¤™œ„ ff‘àŸüfdÅn‘à¡„ ffŽ‘PéI²no‘UUdebug‘uŸ™œ„ ffŽ’–l*switc¸ãh–ëþthe“debugger“o .‘NªSame“as“Ånodebug/0“²(section“4.3.1,‘page“29)ŽŽ’ÄT¼Ÿ™œ„ ffŽŽŸ‰ffÄ»"¡¤™œ„ff‘àŸðfdÅ=‘à¡„ffŽ‘N°e²debugging‘㟙œ„ffŽ’–l*sho¸ãw–f|debugger“information.‘¥;Same“as‘f{Ådebugging/0“²(section“4.3.1,ŽŸ ’–l*page‘UU29)ŽŽ’ÄT¼Ÿ™œ„ffŽŽ¦‰ffÄ»"¡¤™œ„ff‘àŸðfdÅ+‘à¡„ffŽ‘SéJ²sp¸ãy‘UUthis‘vŸ™œ„ffŽ’–l*set–Pja“sp•¸ãy-pGoin“t–Pjon›Pithe“curren¸ãt“goal.‘ cUses˜Åspy/1“²(section“4.3.3,ŽŸ ’–l*page‘UU30)ŽŽ’ÄT¼Ÿ™œ„ffŽŽ¦‰ffÄ»"¡¤™œ„ff‘àŸðfdÅ-‘à¡„ffŽ‘N¢-²nosp¸ãy‘UUthis‘ÕXŸ™œ„ffŽ’–l*remo•¸ãv“e›Õa‘Ôsp“y-pGoin“t˜on˜the‘Ôcurren“t˜goal.‘A2Uses˜Ånospy/1‘Ô²(section˜4.3.3,ŽŸ ’–l*page‘UU30)ŽŽ’ÄT¼Ÿ™œ„ffŽŽ¦‰ffÄ»"¡¤'™œ„0ff‘àŸØfdÅ*‘à¡„0ffŽ‘?ÌÔ²sp¸ãy‘UUconditionally‘Ÿ'™œ„0ffŽ’–l*ask–~2for“a›~3term“ÅGoal,–?ýPort,“Test–~2²(terminated“b¸ãy˜a“dot)“andޤ ’–l*set–g=a›g|ŽŽŽŽ ÃÝ» ý£o‘øãŸ²œ‰ffº¨m¤fd¤™œ„ ff‘ŸüfdCommand‘_Ø¡„ ffŽ‘W,®Description’1#ŒŸ™œ„ ffŽŽ©‰ffº¨mŸff‰ffº¨m¡¤™œ„ ff‘ŸüfdÅwrite‘UUÉA‘Dz[ÉN‘¼r²]‘î-¡„ ffŽ‘W,®write–UUÉN›Dzterms“starting“at“the“address“ÉA˜²using‘xâÅwrite/1“²(section“7.14.6,“page“96)‘Ÿ™œ„ ffŽŽ¦‰ffº¨m¡¤™œ„ ff‘ŸüfdÅdata‘UUÉA‘Dz[ÉN‘¼r²]‘.*¡„ ffŽ‘W,®displa•¸ãy‘xâÉN‘Dzw“ords–UUstarting“at“the“address“ÉA’®J¤Ÿ™œ„ ffŽŽ¦‰ffº¨m¡¤™œ„ ff‘ŸüfdÅmodify‘UUÉA‘Dz[ÉN‘¼r²]‘®0¡„ ffŽ‘W,®displaš¸ãy–UUand“moGdify‘xâÉN‘Dzw˜ords“starting“at“the“address“ÉA‘y‘‘øãIn–UUthe“abGo•¸ãv“e–UUtable“the“folloš¸ãwing“con˜v˜en˜tions“apply:ޤ‘ã¸ŽŽŽ‘ã ²elemen•¸ãts›UUbGet“w“een˜[˜and˜]˜are˜optional.Ž¡‘ã¸ŽŽŽ‘ã ÉN‘Dzis–UUan“optional“in¸ãteger“(defaults“to“1).Ž¡‘ã¸ŽŽŽ‘ã ÉA›út²is–>a“W‘þãAM‘>address,‘B±its“syn¸ãtax“is:‘f!ÉBANK‘¡E‰ff&fŽ‘Ç«NAME˜²[“Å[‘?ýÉN‘üoÅ]‘>²],“i.e.‘ja“bank“name‘> pGossibly“follo•¸ãw“ed›>b“y˜anޤ ‘ã index–UU(defaults“to“0).‘qÇÉBANK‘¡E‰ff&fŽ‘Ç«NAME‘Dzis“either:Ž¡‘# Ä{ŽŽŽ‘'ã Åreg²:‘qÇW‘þãAM–UUgeneral“register“(stacš¸ãk“pGoin˜ters,“con˜tin˜uation,“...).ޤ‘# Ä{ŽŽŽ‘'ã Åx²:›qÇW‘þãAM–UUX“register“(tempGorary“v‘ÿqÇariables,“i.e.˜argumen¸ãts).Ž¡‘# Ä{ŽŽŽ‘'ã Åy²:‘qÇW‘þãAM–UUY“register“(pGermanen¸ãt“v‘ÿqÇariables).Ž¡‘# Ä{ŽŽŽ‘'ã Åab²:‘qÇW‘þãAM–UUX“register“sa•¸ãv“ed–UUin“the“currenš¸ãt“c˜hoice-pGoin˜t.Ž¡‘# Ä{ŽŽŽ‘'ã ÉSTACK‘¡E‰ff&fŽ›Ç«NAME‘¼r²:–UUW‘þãAM“stac¸ãk“(ÉSTACK‘¡E‰ff&fŽ˜NAME‘Dzin“Ålocal²,“Åglobal²,“Åtrail²,“Åcstr²).ޤ‘ã¸ŽŽŽ‘ã ÉSA›Dzis–UUa“W‘þãAM“stac¸ãk“address,“i.e.‘qÇÉSTACK‘¡E‰ff&fŽ‘Ç«NAME˜²[“Å[‘?ýÉN‘üoÅ]“²]“(spGecial“case“of“W‘þãAM“addresses).Ž¡‘ã¸ŽŽŽ‘ã ÉRA‘òk²is–62a›63real“address,‘njits“syn¸ãtax˜is“the˜syn¸ãtax˜of“C‘5ùin¸ãtegers“(in˜particular“the˜notation“Å0x...‘`²isŽ© ‘ã recognized).Ž¡‘øãIt–µœis›µpGossible“to˜only“use“the˜ rst“letters“of˜a“commands˜and“bank“names˜when“there“is˜no“am•¸ãbiguit“y‘ÿ*ª.‘<ŠAlsoަ‘øãthe–¡±square“brac•¸ãk“ets›¡²Å[–¡±]“²enclosing“the“index˜of“a“bank“name“can˜bGe“omitted.‘VÛF‘ÿ*ªor˜instance“the“follo¸ãwingަ‘øãcommand–HD(shoš¸ãwing‘HEthe“con˜ten˜ts‘HEof“25“consecutiv˜e‘HEw˜ords“of›HEthe“global˜stac¸ãk“from“the˜index“3):‘W¦Ådataަ‘øãglobal[3]›?ý25–UU²can“bGe“abbreviated“as:‘qÇÅd˜g˜3˜25².ŽŽŸŽŒ‹"ÕÓ Ú‹– ý"EŸüfd‘øã²34ŽŽŽ’qsA4‘ DEBUGGINGŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ»ŸŽŒ‹#亠Ú‹– ý"EŸüfd’¶!²35ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øã¼5Ž‘/ÒF‘þ¦format–ffof“de nitionsŽŸ#ç‘øãÇ5.1Ž‘£General‘€formatŽŸuT‘øã²The–UUde nition“of“conš¸ãtrol“constructs,“directiv˜es“and“built-in“predicates“is“presen˜ted“as“follo˜ws:ޤ‘øãÄT‘ÿ «emplatesŽ¡‘øã²Sp•Geci es›fžthe‘fŸt¸ãyp“es˜of–fŸthe˜argumen¸ãts˜and“whic¸ãh˜of“them˜shall˜bGe“instan•¸ãtiated˜(mošGde).‘¥£T“yp˜es‘fŸand‘fžmo˜desŽ© ‘øãare–UUdescribGed“later“(section“5.2,“page“35).Ž¡‘øãÄDescriptionŽ¡‘øã²Describ•Ges›h˜the‘h™b“eha•¸ãvior˜(in˜the˜absence‘h™of˜an“y˜error–h™conditions).‘«It“is˜explicitly˜men¸ãtioned˜when“a˜built-ަ‘øãin–/Äpredicate“is“re-executable“on“bac•¸ãktrac“king.‘Prede ned–/ÄopGerators“in•¸ãv“olv“ed–/Äin“the“de nition“are“alsoަ‘øãmen¸ãtioned.Ž¡‘øãÄErrorsŽ¡‘øã²Details–fÀthe“error›f¿conditions.‘¦P¸ãossible“errors“are˜detailed“later“(section“5.3,‘kpage“37).‘¦F‘ÿ*ªor˜directiv¸ães,‘kthisަ‘øãpart–UUis“omitted.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²SpGeci es–UUwhether“the“de nition“conforms“to“the“ISO“standard“or“is“a“GNU“Prolog“extension.ŽŸ'þ6‘øãÇ5.2Ž‘£T ypš`es–€and“mo˜desŽŸuT‘øã²The–ùwtemplates“part“de nes,‘"€for“eacš¸ãh“argumen˜t“of‘ùxthe“concerned“built-in“predicate,‘"€its“moGde“and“t˜ypGe.ަ‘øãThe›eÐmo•Gde‘eÏsp“eci es˜whether˜or˜not‘eÏthe˜argumen•¸ãt˜m“ust˜bGe‘eÏinstan“tiated˜when˜the˜built-in‘eÏpredicate˜isަ‘øãcalled.‘qÇThe–UUmošGde“is“enco˜ded“with“a“sym¸ãb˜ol“just“b˜efore“the“t•¸ãyp˜e.‘qÇP“ossible–UUmo˜des“are:ޤ‘ã¸ŽŽŽ‘ã Å+²:‘qÇthe–UUargumenš¸ãt“m˜ust“bGe“instan˜tiated.Ž¡‘ã¸ŽŽŽ‘ã Å-²:‘qÇthe–UUargumenš¸ãt“m˜ust“bšGe“a“v‘ÿqÇariable“(will“b˜e“instan¸ãtiated“if“the“built-in“predicate“succeeds).Ž¡‘ã¸ŽŽŽ‘ã Å?²:‘qÇthe–UUargumenš¸ãt“can“bGe“instan˜tiated“or“a“v‘ÿqÇariable.Ž¡‘øãThe–UUtš¸ãypGe“of“an“argumen˜t“is“de ned“b˜y“the“follo˜wing“table:ŽŽŸŽŒ‹$åB Ú‹– ý"EŸüfd‘øã²36ŽŽŽ’,ZT5‘ F¸ãORMA‘ÿ*ªT–UUOF“DEFINITIONSŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» þŽ;Õ‘øã þÇLÖ‰ff¯‘¤fd¤™œ„ ff‘ŸüfdT¸ãypGe‘QÇr¡„ ffŽ‘uBDescriptionŽŽ’ÂI+Ÿ™œ„ ffŽŽ©‰ff¯‘Ÿff‰ff¯‘¡¤™œ„ ff‘ŸüfdÉTYPE‘]·‰ff&fŽ‘„Ålist‘8Ãp¡„ ffŽ‘uB²a–UUlist“whose“the“tš¸ãypGe“of“eac˜h“elemen˜t“is“ÉTYPEŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdTYPE1‘]·‰ff&fŽ‘„Åor‘¡E‰ff&fŽ‘Ç«ÉTYPE2‘ûÑ¡„ ffŽ‘uB²a–UUterm“whose“t¸ãypGe“is“either“ÉTYPE1‘Dzor“ÉTYPE2ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅatom‘SG¡„ ffŽ‘uB²an‘UUatomŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅatom‘¡E‰ff&fŽ‘Ç«property‘%î¡„ ffŽ‘uB²an–UUatom“propGert¸ãy“(section“7.19.12,“page“120)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅboolean‘C‡Š¡„ ffŽ‘uB²the–UUatom“Åtrue“²or“ÅfalseŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘Ÿüfdbyte‘SG¡„ ffŽ‘uB²an–UUin¸ãteger“¸“²0“and“¸“²255ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅcallable‘¡E‰ff&fŽ‘Ç«term‘%î¡„ ffŽ‘uB²an–UUatom“or“a“compGound“termŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅcharacter‘9¡„ ffŽ‘uB²a–UUsingle“c¸ãharacter“atomŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅcharacter‘¡E‰ff&fŽ‘Ç«code‘ ?ñ¡„ ffŽ‘uB²an–UUin¸ãteger“¸“²1“and“¸“²255ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅclause‘HLJ¡„ ffŽ‘uB²a–UUclause“(fact“or“rule)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅclose‘¡E‰ff&fŽ‘Ç«option‘*¿ë¡„ ffŽ‘uB²a–UUclose“option“(section“7.10.7,“page“72)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅcompound‘¡E‰ff&fŽ‘Ç«term‘%î¡„ ffŽ‘uB²a–UUcompGound“termŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅevaluable‘9¡„ ffŽ‘uB²an–UUarithmetic“expression“(section“7.6.1,“page“57)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅfd‘¡E‰ff&fŽ–Ç«bool‘¡E‰ff&fŽ“evaluable‘øL¡„ ffŽ‘uB²a›UUb•Go“olean˜FD˜expression˜(section˜8.7.1,˜page˜173)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅfd‘¡E‰ff&fŽ–Ç«labeling‘¡E‰ff&fŽ“option‘ ¸O¡„ ffŽ‘uB²an–UUFD“labGeling“option“(section“8.9.1,“page“179)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅfd‘¡E‰ff&fŽ‘Ç«evaluable‘*¿ë¡„ ffŽ‘uB²an–UUarithmetic“FD“expression“(section“8.6.1,“page“170)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅfd‘¡E‰ff&fŽ‘Ç«variable‘/ÿè¡„ ffŽ‘uB²an–UUFD“v‘ÿqÇariableŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅflag‘SG¡„ ffŽ‘uB²a–UUProlog“ ag“(section“7.22.1,“page“133)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅfloat‘N„¡„ ffŽ‘uB²a–UU oating“pGoinš¸ãt“n˜um˜bGerŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅhead‘SG¡„ ffŽ‘uB²a–UUhead“of“a“clause“(atom“or“compGound“term)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅinteger‘C‡Š¡„ ffŽ‘uB²an‘UUin¸ãtegerŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅin‘¡E‰ff&fŽ‘Ç«byte‘DÿÜ¡„ ffŽ‘uB²an–UUin¸ãteger“¸“²0“and“¸“²255“or“Å-1“²(for“the“end-of- le)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅin‘¡E‰ff&fŽ‘Ç«character‘*¿ë¡„ ffŽ‘uB²a–UUsingle“c¸ãharacter“atom“or“the“atom“Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“file–UU²(for“the“end-of- le)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅin‘¡E‰ff&fŽ–Ç«character‘¡E‰ff&fŽ“code‘øL¡„ ffŽ‘uB²an–UUin¸ãteger“¸“²1“and“¸“²255“or“Å-1“²(for“the“end-of- le)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅio‘¡E‰ff&fŽ‘Ç«mode‘DÿÜ¡„ ffŽ‘uB²an–UUatom“in:‘qÇÅread²,“Åwrite“²or“ÅappendŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘Ÿüfdlist‘SG¡„ ffŽ‘uB²the–UUemptš¸ãy“list“Å[]“²or“a“non-empt˜y“list“Å[‘¡E‰ff&fŽ–Ç«|‘¡E‰ff&fŽ“]ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘Ÿüfdnonvar‘HLJ¡„ ffŽ‘uB²an¸ãy–UUterm“that“is“not“a“v‘ÿqÇariableŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅnumber‘HLJ¡„ ffŽ‘uB²an–UUinš¸ãteger“or“a“ oating“pGoin˜t“n˜um˜bGerŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅoperator‘¡E‰ff&fŽ‘Ç«specifier‘ ?ý¡„ ffŽ‘uB²an–UUopšGerator“sp˜eci er“(section“7.14.10,“page“100)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅos‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“property‘8I¡„ ffŽ‘uB²an–UUopšGerating“system“ le“prop˜ert¸ãy“(section“7.27.11,“page“147)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„$ff‘ŸäfdÅpredicate‘¡E‰ff&fŽ‘Ç«indicator‘¡„$ffŽ‘uB²a–íûterm“ÅName/Arity›íü²where“ÅName“²is“an“atom˜and“ÅArity“²an“in¸ãteger“¸“²0.‘;ºAޤ ‘uBcallable–§ëterm›§êcan“bGe“giv¸ãen˜if“the“Åstrict‘¡E‰ff&fŽ‘Ç«iso˜²Prolog“ ag“is˜switc¸ãhed“o Ž¡‘uB(section–UU7.22.1,“page“133)ŽŽ’ÂI+Ÿ™œ„$ffŽŽŸ‰ff¯‘¡¤™œ„ ff‘ŸüfdÅpredicate‘¡E‰ff&fŽ‘Ç«property‘ ?ý¡„ ffŽ‘uB²a–UUpredicate“propGert¸ãy“(section“7.8.2,“page“65)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅread‘¡E‰ff&fŽ‘Ç«option‘/ÿè¡„ ffŽ‘uB²a–UUread“option“(section“7.14.1,“page“92)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ff‘ŸðfdÅsocket‘¡E‰ff&fŽ‘Ç«address‘ ?ñ¡„ffŽ‘uB²a–áhterm“of“the“form“Å'AF‘¡E‰ff&fŽ›Ç«UNIX'(A)‘áD²or“Å'AF‘¡E‰ff&fŽ˜INET'(A,N)‘áC²where“ÅA‘áD²is“an“atomŽŸ ‘uBand–UUÅN“²an“in¸ãtegerŽŽ’ÂI+Ÿ™œ„ffŽŽŸ‰ff¯‘¡¤™œ„ ff‘ŸüfdÅsocket‘¡E‰ff&fŽ‘Ç«domain‘%î¡„ ffŽ‘uB²an–UUatom“in:‘qÇÅ'AF‘¡E‰ff&fŽ›Ç«UNIX'“²or“Å'AF‘¡E‰ff&fŽ˜INET'ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘Ÿüfdsource‘¡E‰ff&fŽ‘Ç«sink‘/ÿè¡„ ffŽ‘uB²an–UUatom“iden¸ãtifying“a“source“or“a“sinkŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅstream‘HLJ¡„ ffŽ‘uB²a–lstream-term:‘RÒa“term“of‘kthe“form“Å'$stream'(N)›\²where“ÅN˜²is“an‘kin¸ãteger“¸“²0ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅstream‘¡E‰ff&fŽ‘Ç«option‘%î¡„ ffŽ‘uB²a–UUstream“option“(section“7.10.6,“page“70)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅstream‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“alias‘xF¡„ ffŽ‘uB²a–UUstream-term“or“an“alias“(atom)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ff‘ŸðfdÅstream‘¡E‰ff&fŽ‘Ç«position‘ÿô¡„ffŽ‘uB²a–*stream›*pGosition:‘>a“term˜Å'$stream‘¡E‰ff&fŽ‘Ç«position'(I1,–?ýI2,“I3,“I4)‘*²whereŽŸ ‘uBÅI1²,–UUÅI2²,“ÅI3“²and“ÅI4“²are“in¸ãtegersŽŽ’ÂI+Ÿ™œ„ffŽŽŸ‰ff¯‘¡¤™œ„ ff‘ŸüfdÅstream‘¡E‰ff&fŽ‘Ç«property‘ÿô¡„ ffŽ‘uB²a–UUstream“propGert¸ãy“(section“7.10.10,“page“73)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅstream‘¡E‰ff&fŽ–Ç«seek‘¡E‰ff&fŽ“method‘ ¸O¡„ ffŽ‘uB²an–UUatom“in:‘qÇÅbof²,“Åcurrent“²or“ÅeofŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘Ÿüfdterm‘SG¡„ ffŽ‘uB²an¸ãy‘UUtermŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅvar‘¡E‰ff&fŽ–Ç«binding‘¡E‰ff&fŽ“option‘ ¸O¡„ ffŽ‘uB²a–UUv‘ÿqÇariable“binding“option“(section“7.5.3,“page“56)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘¡¤™œ„ ff‘ŸüfdÅwrite‘¡E‰ff&fŽ‘Ç«option‘*¿ë¡„ ffŽ‘uB²a–UUwrite“option“(section“7.14.6,“page“96)ŽŽ’ÂI+Ÿ™œ„ ffŽŽ¦‰ff¯‘ŽŽŽŽŸŽŒ‹%ìò Ú‹– ý"EŸüfd‘øã²5.3‘ ErrorsŽŽŽ’¶!37ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÇ5.3Ž‘£ErrorsޤuT‘øãÄ5.3.1Ž‘‰General–ÕTformat“and“error“con®9textŽ¡‘øã²When–Éan›É error“oGccurs“an˜exception“of“the˜form:‘Y-Åerror(ÉErrorTerm–¼rÅ,‘?ýÉCaller“Å)‘ɲis˜raised.‘ÌáÉErrorTerm‘…z²isޤ ‘øãa– >term“spGecifying› ?the“error“(detailed“in“next“sections)˜and“ÉCaller‘Ȱ²is“a“term“spGecifying˜the“con¸ãtext“ofŽ¡‘øãthe–cerror.‘› The“conš¸ãtext“is“either“the“predicate‘cindicator“of“the“last“in˜v˜ok˜ed“built-in“predicate“or“an“atomŽ¡‘øãgiving–UUgeneral“con¸ãtext“information.Ž©‘øãUsing–{”exceptions“allo¸ãws›{“the“user“bGoth“to˜reco•¸ãv“er–{”an“error“using‘Ÿ!Åcatch/3˜²(section“6.2.4,‘…$page˜47)“and“toŽ¡‘øãraise–UUan“error“using‘xâÅthrow/1“²(section“6.2.4,“page“47).ަ‘øãT‘ÿ*ªo–UUillustrate“hoš¸ãw“to“write“error“cases,“let“us“write“a“predicate“Åmy‘¡E‰ff&fŽ‘Ç«pred(X)“²where“ÅX“²m˜ust“bGe“an“in˜teger:Ž©‘ã Åmy_pred(X)‘?ý:-Ž¡‘;âñ(‘¿÷nonvar(X)‘?ý->Ž¡‘PâåtrueŽ¡‘;âñ;‘¿÷throw(error(instantiation_error),‘?ýmy_pred/1)),Ž¡‘;âñ),Ž¡‘;âñ(‘¿÷integer(X)‘?ý->Ž¡‘PâåtrueŽ¡‘;âñ;‘¿÷throw(error(type_error(integer,–?ýX),“my_pred/1))Ž¡‘;âñ),Ž¡‘;âñ...ަ‘øã²T‘ÿ*ªo–…qhelp›…rthe“user“to˜write“these“error˜cases,‘‘xa“set˜of“system“predicates˜is“pro¸ãvided“to˜raise“errors.‘TheseŽ¡‘øãpredicates– are› ÿof“the“form“Å'$pl‘¡E‰ff&fŽ–Ç«err‘¡E‰ff&fŽ“...'‘X«²and˜they– all“refer˜to“the“implicit“error˜con¸ãtext.‘X«The“predicatesŽ¡‘øãÅset‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name/2–L²(section“7.22.3,›¯Jpage“135)“and“Åcurrent‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name/2‘K²(section–L7.22.4,˜page“135)“are“pro-Ž¡‘øãvided–°ðto“set“and“reco•¸ãv“er–°ðthe“name“and“the“aritš¸ãy‘°ñassoGciated“with“this“con˜text“(an“arit˜y“ó  b> cmmi10µ<“²0“means“thatŽ¡‘øãonly–`the›`atom“correspGonding“to˜the“functor“is˜signi can¸ãt).‘’Using“these˜system“predicates“the˜user“couldŽ¡‘øãde ne–UUthe“abGo•¸ãv“e–UUpredicate“as“follo¸ãw:ަ‘ã Åmy_pred(X)‘?ý:-Ž¡‘;âñset_bip_name(my_pred,1),Ž¡‘;âñ(‘¿÷nonvar(X)‘?ý->Ž¡‘PâåtrueŽ¡‘;âñ;‘¿÷'$pl_err_instantiation'Ž¡‘;âñ),Ž¡‘;âñ(‘¿÷integer(X)‘?ý->Ž¡‘PâåtrueŽ¡‘;âñ;‘¿÷'$pl_err_type'(integer,‘?ýX)Ž¡‘;âñ),Ž¡‘;âñ...ަ‘øã²The–UUfolloš¸ãwing“sections“detail“eac˜h“kind“of“errors“(and“assoGciated“system“predicates).ŽŸ%þ6‘øãÄ5.3.2Ž‘‰Instan®9tiation‘ÕTerrorŽŸuT‘øã²An–¬Vinstan¸ãtiation›¬Uerror“oGccurs“when“an˜argumen¸ãt“or“one“of˜its“compGonen¸ãts“is“v‘ÿqÇariable˜while“an“instan¸ãtiatedŽ¡‘øãargumen•¸ãt›UUw“as˜expGected.‘qÇÉErrorTerm‘Dzhas˜the˜follo“wing˜form:‘qÇÅinstantiation‘¡E‰ff&fŽ‘Ç«error².ŽŸ‘øãThe–&çsystem“predicate›&èÅ'$pl‘¡E‰ff&fŽ–Ç«err‘¡E‰ff&fŽ“instantiation'–&ç²raises“this˜error“in“the“curren¸ãt˜error“con¸ãtext“(sec-Ž¡‘øãtion–UU5.3.1,“page“37).ŽŽŸŽŒ‹& ° Ú‹– ý"EŸüfd‘øã²38ŽŽŽ’,ZT5‘ F¸ãORMA‘ÿ*ªT–UUOF“DEFINITIONSŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ5.3.3Ž‘‰T®9ypQÇe‘ÕTerrorŽ©uT‘øã²A‘Tt¸ãypšGe–„error“o˜ccurs“when“the“t¸ãyp˜e“of“an“argumen¸ãt“or“one‘ƒof“its“comp˜onen¸ãts“is“not“the“exp˜ected“t¸ãyp˜eޤ ‘øã(but–Ünot“a–Ü‘v‘ÿqÇariable).‘xÉErrorTerm›™²has“the–Üfollo¸ãwing“form:‘€=Åtype‘¡E‰ff&fŽ‘Ç«error(ÉType‘¼rÅ,‘?ýCulprit)‘Ü‘²where“ÉType˜²isŽ¡‘øãthe–UUexpšGected“t¸ãyp˜e“and“ÉCulprit‘Dzthe“argumenš¸ãt“whic˜h“caused“the“error.‘qÇÉType‘Dzis“one“of:Ž ‰Ÿ‘ã¸ŽŽŽ‘ã Åatomޤv…‘ã¸ŽŽŽ‘ã ÅatomicŽ©v„‘ã¸ŽŽŽ‘ã ÅbooleanŽ¡‘ã¸ŽŽŽ‘ã ÅbyteŽ¡‘ã¸ŽŽŽ‘ã Åcallableަ‘ã¸ŽŽŽ‘ã ÅcharacterŽ¡‘ã¸ŽŽŽ‘ã ÅcompoundŽŽŸ’¢÷ܸŽŽŽ’¬÷ÝÅevaluableޤÕU’¢÷ܸŽŽŽ’¬÷ÝÅfd‘¡E‰ff&fŽ–Ç«bool‘¡E‰ff&fŽ“evaluableŽ©ÕV’¢÷ܸŽŽŽ’¬÷ÝÅfd‘¡E‰ff&fŽ‘Ç«evaluableŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅfd‘¡E‰ff&fŽ‘Ç«variableŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅfloatަ’¢÷ܸŽŽŽ’¬÷ÝÅin‘¡E‰ff&fŽ‘Ç«byteŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅin‘¡E‰ff&fŽ‘Ç«characterŽŽŸ’> °¸ŽŽŽ’H ±Åintegerޤ’> °¸ŽŽŽ’H ±ÅlistŽ¡’> °¸ŽŽŽ’H ±ÅnumberŽ¡’> °¸ŽŽŽ’H ±Åpredicate‘¡E‰ff&fŽ‘Ç«indicatorŽ¡’> °¸ŽŽŽ’H ±ÅvariableŽŽŽŸ‘øã²The–”wsystem›”xpredicate“Å'$pl‘¡E‰ff&fŽ–Ç«err‘¡E‰ff&fŽ“type'(Type,‘?ýCulprit)˜²raises–”wthis˜error“in˜the“curren¸ãt˜error“con¸ãtextŽ¡‘øã(section–UU5.3.1,“page“37).ŽŸ%þ6‘øãÄ5.3.4Ž‘‰Domain‘ÕTerrorަ‘øã²A‘7domain‘79error–7:ošGccurs“when“the“t¸ãyp˜e›79of“an“argumen¸ãt“is˜correct“but“its“v‘ÿqÇalue“is˜outside“the“expGectedŽ¡‘øãdomain.‘" ÉErrorTerm‘÷d²has–:óthe“follo¸ãwing›:òform:‘=Ådomain‘¡E‰ff&fŽ‘Ç«error(ÉDomain–¼rÅ,‘?ýÉCulprit“Å)˜²where–:óÉDomain‘÷d²is“theŽ¡‘øãexpGected–UUdomain“and“ÉCulprit‘Dzthe“argumenš¸ãt“whic˜h“caused“the“error.‘qÇÉDomain‘Dzis“one“of:Ž  ÿ‘ã¸ŽŽŽ‘ã Åatom‘¡E‰ff&fŽ‘Ç«propertyޤj«‘ã¸ŽŽŽ‘ã Åbuffering‘¡E‰ff&fŽ‘Ç«modeŽ©jª‘ã¸ŽŽŽ‘ã Åcharacter‘¡E‰ff&fŽ–Ç«code‘¡E‰ff&fŽ“listŽ¡‘ã¸ŽŽŽ‘ã Åclose‘¡E‰ff&fŽ‘Ç«optionŽ¡‘ã¸ŽŽŽ‘ã Ådate‘¡E‰ff&fŽ‘Ç«timeަ‘ã¸ŽŽŽ‘ã Åeof‘¡E‰ff&fŽ‘Ç«actionŽ¡‘ã¸ŽŽŽ‘ã Åfd‘¡E‰ff&fŽ–Ç«labeling‘¡E‰ff&fŽ“optionŽ¡‘ã¸ŽŽŽ‘ã Åflag‘¡E‰ff&fŽ‘Ç«valueަ‘ã¸ŽŽŽ‘ã Åformat‘¡E‰ff&fŽ–Ç«control‘¡E‰ff&fŽ“sequenceŽ¡‘ã¸ŽŽŽ‘ã Åg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“indexŽ¡‘ã¸ŽŽŽ‘ã Åio‘¡E‰ff&fŽ‘Ç«modeަ‘ã¸ŽŽŽ‘ã Ånon‘¡E‰ff&fŽ–Ç«empty‘¡E‰ff&fŽ“listŽ¡‘ã¸ŽŽŽ‘ã Ånot‘¡E‰ff&fŽ–Ç«less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zeroŽŽ ÿ’¢÷ܸŽŽŽ’¬÷ÝÅoperator‘¡E‰ff&fŽ‘Ç«priorityޤ;B’¢÷ܸŽŽŽ’¬÷ÝÅoperator‘¡E‰ff&fŽ‘Ç«specifierŽ©;C’¢÷ܸŽŽŽ’¬÷ÝÅos‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“permissionŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅos‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“propertyŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅos‘¡E‰ff&fŽ‘Ç«pathަ’¢÷ܸŽŽŽ’¬÷ÝÅpredicate‘¡E‰ff&fŽ‘Ç«propertyŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅprolog‘¡E‰ff&fŽ‘Ç«flagŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅread‘¡E‰ff&fŽ‘Ç«optionަ’¢÷ܸŽŽŽ’¬÷ÝÅselectable‘¡E‰ff&fŽ‘Ç«itemŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅsocket‘¡E‰ff&fŽ‘Ç«addressŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅsocket‘¡E‰ff&fŽ‘Ç«domainަ’¢÷ܸŽŽŽ’¬÷ÝÅsource‘¡E‰ff&fŽ‘Ç«sinkŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅstatistics‘¡E‰ff&fŽ‘Ç«keyŽŽ ÿ’> °¸ŽŽŽ’H ±Åstatistics‘¡E‰ff&fŽ‘Ç«valueޤ’> °¸ŽŽŽ’H ±ÅstreamŽ¡’> °¸ŽŽŽ’H ±Åstream‘¡E‰ff&fŽ‘Ç«optionŽ¡’> °¸ŽŽŽ’H ±Åstream‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“aliasŽ¡’> °¸ŽŽŽ’H ±Åstream‘¡E‰ff&fŽ‘Ç«positionŽ¡’> °¸ŽŽŽ’H ±Åstream‘¡E‰ff&fŽ‘Ç«propertyŽ¡’> °¸ŽŽŽ’H ±Åstream‘¡E‰ff&fŽ–Ç«seek‘¡E‰ff&fŽ“methodŽ¡’> °¸ŽŽŽ’H ±Åstream‘¡E‰ff&fŽ‘Ç«typeŽ¡’> °¸ŽŽŽ’H ±Återm‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“aliasŽ¡’> °¸ŽŽŽ’H ±Åvar‘¡E‰ff&fŽ–Ç«binding‘¡E‰ff&fŽ“optionŽ¡’> °¸ŽŽŽ’H ±Åwrite‘¡E‰ff&fŽ‘Ç«optionŽŽŽŸ‘øã²The–«¾system›«¿predicate“Å'$pl‘¡E‰ff&fŽ–Ç«err‘¡E‰ff&fŽ“domain'(Domain,‘?ýCulprit)–«¾²raises˜this“error˜in“the“curren¸ãt˜error“con¸ãtextŽ¡‘øã(section–UU5.3.1,“page“37).ŽŽŸŽŒ‹'7 Ú‹– ý"EŸüfd‘øã²5.3‘ ErrorsŽŽŽ’¶!39ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ5.3.5Ž‘‰Existence‘ÕTerrorŽ©uT‘øã²an–Ê[existence›Ê\error“oGccurs“when“an˜ob‘Ž8ject“on“whic¸ãh˜an“opGeration“is˜to“bšGe“p˜erformed“do˜es‘Ê\not“exist.ޤ ‘øãÉErrorTerm‘1 ²has–t›the›tšfollo¸ãwing“form:‘°SÅexistence‘¡E‰ff&fŽ‘Ç«error(ÉObject–¼rÅ,‘?ýÉCulprit“Å)˜²where–t›ÉObject‘1 ²is“the˜t¸ãypGe“ofŽ¡‘øãthe–UUob‘Ž8ject“and“ÉCulprit‘Dzthe“argumenš¸ãt“whic˜h“caused“the“error.‘qÇÉObject‘Dzis“one“of:ޤ‘ã¸ŽŽŽ‘ã ÅprocedureŽŽ’¢÷ܸŽŽŽ’¬÷ÝÅsource‘¡E‰ff&fŽ‘Ç«sinkŽŽ’> °¸ŽŽŽ’H ±ÅstreamŽŽŽ¡‘øã²The–•Ðsystem“predicate“Å'$pl‘¡E‰ff&fŽ–Ç«err‘¡E‰ff&fŽ“existence'(Object,‘?ýCulprit)–•вraises“this‘•Ïerror“in“the“curren¸ãt“errorޤ ‘øãcon¸ãtext–UU(section“5.3.1,“page“37).ŽŸ%þ6‘øãÄ5.3.6Ž‘‰P®9ermission‘ÕTerrorަ‘øã²A‘«“pšGermission–«ìerror“o˜ccurs“when›«ëan“attempt“to˜pGerform“a“prohibited˜opGeration“is“made.‘u‹ÉErrorTermŽ¡‘øã²has–Â{the“follo¸ãwing“form:‘LÅpermission‘¡E‰ff&fŽ‘Ç«error(ÉOperation–¼rÅ,›?ýÉPermission“Å,˜ÉCulprit“Å)–Â{²where“ÉOperation‘~í²isŽ¡‘øãthe–/ïopGeration›/îwhic¸ãh“caused˜the“error,‘f•ÉPermission‘ì`²the“t¸ãypGe˜of“the“tried˜pGermission“and˜ÉCulprit‘ìa²theŽ¡‘øãargumen•¸ãt›UUwhic“h˜caused˜the˜error.‘qÇÉOperation‘Dzis˜one˜of:ޤ@ŸØ‘ã¸ŽŽŽ‘ã Åaccessޤ‘ã¸ŽŽŽ‘ã Åadd‘¡E‰ff&fŽ‘Ç«aliasŽ¡‘ã¸ŽŽŽ‘ã ÅcloseŽŽŸØ’¢÷ܸŽŽŽ’¬÷ÝÅcreateޤ㎒¢÷ܸŽŽŽ’¬÷ÝÅinputŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅmodifyŽŽŸØ’> °¸ŽŽŽ’H ±Åopenޤ㎒> °¸ŽŽŽ’H ±ÅoutputŽ¡’> °¸ŽŽŽ’H ±ÅrepositionŽŽŽ©‘øã²and–UUÉPermission‘Dzis“one“of:Ž¡ŸØ‘ã¸ŽŽŽ‘ã Åbinary‘¡E‰ff&fŽ‘Ç«streamޤ㎑ã¸ŽŽŽ‘ã ÅflagŽ¡‘ã¸ŽŽŽ‘ã ÅoperatorŽŽŸØ’¢÷ܸŽŽŽ’¬÷ÝÅpast‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“streamޤ’¢÷ܸŽŽŽ’¬÷ÝÅprivate‘¡E‰ff&fŽ‘Ç«procedureŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅsource‘¡E‰ff&fŽ‘Ç«sinkŽŽŸØ’> °¸ŽŽŽ’H ±Åstatic‘¡E‰ff&fŽ‘Ç«procedureޤ’> °¸ŽŽŽ’H ±ÅstreamŽ¡’> °¸ŽŽŽ’H ±Åtext‘¡E‰ff&fŽ‘Ç«streamŽŽŽ¦‘øã²The– ìsystem› ëpredicate“Å'$pl‘¡E‰ff&fŽ–Ç«err‘¡E‰ff&fŽ“permission'(Operation,–?ýPermission,“Culprit)– ì²raises“this˜error“inޤ ‘øãthe–UUcurrenš¸ãt“error“con˜text“(section“5.3.1,“page“37).ŽŸ%þ6‘øãÄ5.3.7Ž‘‰Represen®9tation‘ÕTerrorŽŸuT‘øã²A‘varepresenš¸ãtation–v«error“oGccurs“when‘v¬an“implemen˜tation“limit“has‘v¬bGeen“breac˜hed.‘ÕÊÉErrorTerm‘3²has“theŽ¡‘øãfollo¸ãwing–ËBform:‘]¢Årepresentation‘¡E‰ff&fŽ‘Ç«error(ÉLimit‘¼rÅ)›ËC²where“ÉLimit‘‡´²is˜the“name˜of“the“reac¸ãhed˜limit.‘ÓÉLimitŽ¡‘øã²is–UUone“of:ŽŸ<ŸÜ‘ã¸ŽŽŽ‘ã Åcharacterޤ‘ã¸ŽŽŽ‘ã Åcharacter‘¡E‰ff&fŽ‘Ç«codeŽ¡‘ã¸ŽŽŽ‘ã Åin‘¡E‰ff&fŽ–Ç«character‘¡E‰ff&fŽ“codeŽŽŸÜ’¢÷ܸŽŽŽ’¬÷ÝÅmax‘¡E‰ff&fŽ‘Ç«arityޤ’¢÷ܸŽŽŽ’¬÷ÝÅmax‘¡E‰ff&fŽ‘Ç«integerŽ¡’¢÷ܸŽŽŽ’¬÷ÝÅmin‘¡E‰ff&fŽ‘Ç«integerŽŽŸÜ’> °¸ŽŽŽ’H ±Åtoo‘¡E‰ff&fŽ–Ç«many‘¡E‰ff&fŽ“variablesŽŽŽ¦‘øã²The–UUerrors“Åmax‘¡E‰ff&fŽ›Ç«integer“²and“Åmin‘¡E‰ff&fŽ˜integer“²are“not“currenš¸ãtly“implemen˜ted.ަ‘øãThe– system“predicate“Å'$pl‘¡E‰ff&fŽ–Ç«err‘¡E‰ff&fŽ“representation'(Limit)– ²raises“this‘ error“in“the“currenš¸ãt“error“con˜textŽ¡‘øã(section–UU5.3.1,“page“37).ŽŽŸŽŒ‹('f Ú‹– ý"EŸüfd‘øã²40ŽŽŽ’,ZT5‘ F¸ãORMA‘ÿ*ªT–UUOF“DEFINITIONSŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ5.3.8Ž‘‰Ev‘ÿ\raluation‘ÕTerrorŽ©uT‘øã²An–Zev‘ÿqÇaluation“error“oGccurs›Z when“an“arithmetic“expression“giv¸ães“rise“to“an“exceptional˜v‘ÿqÇalue.‘€%ÉErrorTermޤ ‘øã²has–9³the“follo¸ãwing“form:‘cöÅevaluation‘¡E‰ff&fŽ‘Ç«error(ÉError‘¼rÅ)“²where“ÉError›ö%²is‘9´the“name“of“the“error.‘h‘ÉError˜²is“oneŽ¡‘øãof:ŽŸ*Ÿî‘ã¸ŽŽŽ‘ã Åfloat‘¡E‰ff&fŽ‘Ç«overflowŽŸ‘ã¸ŽŽŽ‘ã Åint‘¡E‰ff&fŽ‘Ç«overflowŽŽŸî’¢÷ܸŽŽŽ’¬÷ÝÅundefinedŽŸ’¢÷ܸŽŽŽ’¬÷ÝÅunderflowŽŽŸî’> °¸ŽŽŽ’H ±Åzero‘¡E‰ff&fŽ‘Ç«divisorŽŽŽ¤‘øã²The–UUerrors“Åfloat‘¡E‰ff&fŽ›Ç«overflow²,“Åint‘¡E‰ff&fŽ˜overflow²,“Åundefined“²and“Åunderflow“²are“not“currenš¸ãtly“implemen˜ted.Ž¡‘øãThe–fèsystem›fépredicate“Å'$pl‘¡E‰ff&fŽ–Ç«err‘¡E‰ff&fŽ“evaluation'(Error)–fè²raises“this˜error“in“the“curren¸ãt˜error“con¸ãtext“(sec-ޤ ‘øãtion–UU5.3.1,“page“37).ŽŸ%þ6‘øãÄ5.3.9Ž‘‰Resource‘ÕTerrorަ‘øã²A›ú[resource–úrerror‘úqoGccurs“when“GNU˜Prolog“doGes“not‘úqha•¸ãv“e–úrenough“resources.‘S|ÉErrorTerm‘¶ã²has“the“follo¸ãwingŽ¡‘øãform:›qÇÅresource‘¡E‰ff&fŽ‘Ç«error(ÉResource‘¼rÅ)–UU²where“ÉResource‘Dzis“the“name“of“the“resource.˜ÉResource‘Dzis“one“of:ޤ‘ã¸ŽŽŽ‘ã Åprint‘¡E‰ff&fŽ–Ç«object‘¡E‰ff&fŽ“not‘¡E‰ff&fŽ“linkedŽŽ’¢÷ܸŽŽŽ’¬÷ÝÅtoo‘¡E‰ff&fŽ–Ç«big‘¡E‰ff&fŽ“fd‘¡E‰ff&fŽ“constraintŽŽ’> °¸ŽŽŽ’H ±Åtoo‘¡E‰ff&fŽ–Ç«many‘¡E‰ff&fŽ“open‘¡E‰ff&fŽ“streamsŽŽŽ¡‘øã²The–öèsystem›öépredicate“Å'$pl‘¡E‰ff&fŽ–Ç«err‘¡E‰ff&fŽ“resource'(Resource)˜²raises–öèthis˜error“in˜the“curren¸ãt˜error“con¸ãtext˜(sec-ޤ ‘øãtion–UU5.3.1,“page“37).ŽŸ%þ6‘øãÄ5.3.10Ž‘!ƇSyn®9tax‘ÕTerrorަ‘øã²A‘ Hsynš¸ãtax– [error“oGccurs“when“a“sequence“of“c˜haracter“doGes‘ \not“conform“to“the“syn˜tax“of“terms.‘XÉÉErrorTermŽ¡‘øã²has–UUthe“follo¸ãwing“form:‘qÇÅsyntax‘¡E‰ff&fŽ‘Ç«error(ÉError‘¼rÅ)“²where“ÉError‘Dzis“an“atom“explaining“the“error.ŽŸ‘øãThe–&çsystem“predicate›&èÅ'$pl‘¡E‰ff&fŽ–Ç«err‘¡E‰ff&fŽ“syntax'(Error)–&ç²raises“this˜error“in“the“curren¸ãt˜error“con¸ãtext“(sec-Ž¡‘øãtion–UU5.3.1,“page“37).ŽŸ%þ6‘øãÄ5.3.11Ž‘!ƇSystem‘ÕTerrorަ‘øã²A›¨«system–¨×error“can“oGccur“at“an¸ãy“stage.‘8IA˜system“error“is“generally“assošGciated“with“an“external“comp˜onen¸ãtŽ¡‘øã(e.g.‘÷popGerating–ãsystem).‘÷oÉErrorTerm‘>U²has“the›âfollo¸ãwing“form:‘ÊâÅsystem‘¡E‰ff&fŽ‘Ç«error(ÉError‘¼rÅ)“²where˜ÉError‘>U²isŽ¡‘øãan–MFatom“explaining›MGthe“error.‘Y›This“is“an“extension˜to“ISO‘Mwhic¸ãh“only˜de nes“Åsystem‘¡E‰ff&fŽ‘Ç«error“²withoutŽ¡‘øãargumen¸ãts.ŽŸ‘øãThe–&çsystem“predicate›&èÅ'$pl‘¡E‰ff&fŽ–Ç«err‘¡E‰ff&fŽ“system'(Error)–&ç²raises“this˜error“in“the“curren¸ãt˜error“con¸ãtext“(sec-Ž¡‘øãtion–UU5.3.1,“page“37).ŽŽŸŽŒ‹)50 Ú‹– ý"EŸüfd’¶!²41ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øã¼6Ž‘/ÒProlog–ffdirectivšŒÌes“and“con˜trol“constructsŽŸ#ç‘øãÇ6.1Ž‘£Prolog‘€directiv esޤuT‘øãÄ6.1.1Ž‘‰In®9troQÇductionŽ¡‘øã²Prolog–×Àdirectiv¸ães“are›׿annotations“inserted“in“Prolog“source˜ les“for“the“compiler.‘ùA‘מProlog“directiv¸ãe“isŽŸ ‘øãused–UUto“spGecify:Ž©ý ‘ã¸ŽŽŽ‘ã ²the–UUpropšGerties“of“some“pro˜cedures“de ned“in“the“source“ le.ޤ~Бã¸ŽŽŽ‘ã ²the–UUformat“and“the“synš¸ãtax“for“read-terms“in“the“source“ le“(using“c˜hangeable“Prolog“ ags).ŽŸ~Ñ‘ã¸ŽŽŽ‘ã ²included–UUsource“ les.Ž¡‘ã¸ŽŽŽ‘ã ²a–UUgoal“to“bGe“executed“at“run-time.ŽŸ%X_‘øãÄ6.1.2Ž‘‰Ådynamic/1ŽŸuT‘øãÄT‘ÿ «emplatesަ‘ã Ådynamic(+predicate‘¡E‰ff&fŽ‘Ç«indicator)ޤ ‘ã dynamic(+predicate‘¡E‰ff&fŽ–Ç«indicator‘¡E‰ff&fŽ“list)Ž¡‘ã dynamic(+predicate‘¡E‰ff&fŽ–Ç«indicator‘¡E‰ff&fŽ“sequence)ަ‘øãÄDescriptionŽ©‘øãÅdynamic(Pred)–Ÿ²spšGeci es“that“the“pro˜cedure“whose“predicate‘ indicator“is“ÅPred“²is“a“dynamic“pro˜cedure.Ž¡‘øãThis›d÷directiv•¸ãe‘dömak“es˜it˜pGossible˜to‘döalter˜the˜de nition˜of‘,ÅPred˜²b“y˜adding˜or‘döremo“ving˜clauses.‘ ¬F‘ÿ*ªor˜moreŽ¡‘øãinformation–UUrefer“to“the“section“abGout“dynamic“clause“managemen¸ãt“(section“7.7.1,“page“60).ަ‘øãThis–UUdirectiv¸ãe“shall“precede“the“de nition“of‘rÅPred“²in“the“source“ le.ަ‘øãIf–³Òthere“is›³Ñno“clause“for“ÅPred˜²in“the“source“ le,‘ËqÅPred“²exists˜ho•¸ãw“ev“er–³Òas“an“empt¸ãy˜predicate“(this“meansŽ¡‘øãthat–UUÅcurrent‘¡E‰ff&fŽ‘Ç«predicate(Pred)“²succeeds).ަ‘øãIn–2order“to‘2‘alloš¸ãw“m˜ultiple“de nitions,‘ißÅPred“²can“also“bGe“a›2‘list“of“predicate“indicators“or˜a“sequence“ofŽ¡‘øãpredicate–UUindicators“using‘xâÅ','/2“²as“separator.ަ‘øãÄP•®9ortabilit“yަ‘øã²ISO‘UUdirectiv¸ãe.ŽŸ%X_‘øãÄ6.1.3Ž‘‰Åpublic/1ŽŸuT‘øãÄT‘ÿ «emplatesŽŸý¡‘ã Åpublic(+predicate‘¡E‰ff&fŽ‘Ç«indicator)Ž¡‘ã public(+predicate‘¡E‰ff&fŽ–Ç«indicator‘¡E‰ff&fŽ“list)Ž¡‘ã public(+predicate‘¡E‰ff&fŽ–Ç«indicator‘¡E‰ff&fŽ“sequence)ŽŸý ‘øãÄDescriptionަ‘øãÅpublic(Pred)–J²spšGeci es“that“the‘Ipro˜cedure“whose“predicate“indicator“is“ÅPred‘I²is“a“public“pro˜cedure.‘_nThisŽ¡‘øãdirectiv•¸ãe›Éémak“es˜it˜p•Gossible˜to˜insp“ect˜the˜clauses˜of‘‘ÅPred².‘CNF‘ÿ*ªor˜more˜information˜refer˜to˜the˜section˜ab“outŽ¡‘øãdynamic–UUclause“managemen¸ãt“(section“7.7.1,“page“60).ŽŽŸŽŒ‹*A1 Ú‹– ý"EŸüfd‘øã²42ŽŽŽ’©–¼6‘ PRš¸ãOLOG–UUDIRECTIVES“AND“CONTR˜OL“CONSTR˜UCTSŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãThis–¯directiv¸ãe“shall“precede“the“de nition“of‘v/ÅPred“²in“the“source“ le.‘~þSince“a“dynamic“proGcedure“is“alsoޤ ‘øãpublic.‘VvIt–`is›auseless“(but˜correct)˜to“de ne˜a“public˜directiv¸ãe˜for“a˜predicate“already˜declared“as˜dynamic.Ž©‘øãIn–2order“to‘2‘alloš¸ãw“m˜ultiple“de nitions,‘ißÅPred“²can“also“bGe“a›2‘list“of“predicate“indicators“or˜a“sequence“ofŽ¡‘øãpredicate–UUindicators“using‘xâÅ','/2“²as“separator.ަ‘øãÄP•®9ortabilit“yަ‘øã²GNU›Q Prolog–QJdirectiv¸ãe.‘e¦The“ISO˜reference“doGes“not‘QIde ne“anš¸ãy“directiv˜e“to“declare“a“predicate“publicŽ¡‘øãbut–¨šit“doGes›¨™distinguish“public“predicates.‘k•It“is“w¸ãorth“noting˜that“in“most“Prolog˜systems“the“Åpublic/1Ž¡‘øã²directivš¸ãe–  is“as“a“visibilit˜y“declaration.‘QïIndeed,‘²ºdeclaring“a“predicate“as“public“mak˜es“it“visible“from“an˜yŽ¡‘øãpredicate–rde ned“in›ran¸ãy“other“ le“(otherwise˜the“predicate“is“only˜visible“from“predicates“de ned˜in“theŽ¡‘øãsame–£csource“ le“as“itself‘Ç).‘6wWhen“a“mošGdule“system“is“incorp˜orated“in“GNU‘£6Prolog“a“more“general“visibilit¸ãyŽ¡‘øãdeclaration–UUshall“bGe“pro¸ãvided“conforming“to“the“ISO“reference.ŽŸ%h‘øãÄ6.1.4Ž‘‰Åmultifile/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©H…‘ã Åmultifile(+predicate‘¡E‰ff&fŽ‘Ç«indicator)Ž¡‘ã multifile(+predicate‘¡E‰ff&fŽ–Ç«indicator‘¡E‰ff&fŽ“list)Ž¡‘ã multifile(+predicate‘¡E‰ff&fŽ–Ç«indicator‘¡E‰ff&fŽ“sequence)ަ‘øãÄDescriptionŽ©‘øãÅmultifile(Pred)–Â8²is“not‘Â7suppGorted“bš¸ãy“GNU‘ÂProlog.‘¸oWhen“suc˜h“a“directiv˜e“is“encoun˜tered‘Â7it“is“simplyŽ¡‘øãignored.‘qÇAll–UUclauses“for“a“givš¸ãen“predicate“m˜ust“reside“in“a“single“ le.ަ‘øãÄP•®9ortabilit“yަ‘øã²ISO–UUdirectiv¸ãe.‘qÇNot“suppGorted.ŽŸ%h‘øãÄ6.1.5Ž‘‰Ådiscontiguous/1ŽŸuT‘øãÄT‘ÿ «emplatesŽŸH†‘ã Ådiscontiguous(+predicate‘¡E‰ff&fŽ‘Ç«indicator)Ž¡‘ã discontiguous(+predicate‘¡E‰ff&fŽ–Ç«indicator‘¡E‰ff&fŽ“list)Ž¡‘ã discontiguous(+predicate‘¡E‰ff&fŽ–Ç«indicator‘¡E‰ff&fŽ“sequence)ŽŸH…‘øãÄDescriptionަ‘øãÅdiscontiguous(Pred)–u8²spšGeci es‘u7that“the“pro˜cedure›u7whose“predicate“indicator˜is“ÅPred“²is˜a“discon¸ãtiguousŽ¡‘øãproGcedure.‘Namely‘ÿ*ª,‘ythe–Aþclauses›Aÿde ning‘eŒÅPred“²are˜not˜restricted˜to“bGe˜consecutiv¸ãe˜but˜can“appGear˜an¸ãywhereŽ¡‘øãin–UUthe“source“ le.ަ‘øãThis–UUdirectiv¸ãe“shall“precede“the“de nition“of‘rÅPred“²in“the“source“ le.ަ‘øãIn–2order“to‘2‘alloš¸ãw“m˜ultiple“de nitions,‘ißÅPred“²can“also“bGe“a›2‘list“of“predicate“indicators“or˜a“sequence“ofŽ¡‘øãpredicate–UUindicators“using‘xâÅ','/2“²as“separator.ަ‘øãÄP•®9ortabilit“yަ‘øã²ISO–ÂOdirectiv¸ãe.‘¹The›ÂkISO“reference˜doGcumen¸ãt˜states˜that–Âjif˜there˜is˜no˜clause˜for˜ÅPred“²in˜the˜source˜ le,Ž¡‘øãÅPred›ús²exists‘útho•¸ãw“ev“er˜as‘útan˜empt“y˜predicate–út(i.e.‘a"Åcurrent‘¡E‰ff&fŽ‘Ç«predicate(Pred)“²will˜succeed).‘a"This“is˜notŽ¡‘øãthe–UUcase“for“GNU“Prolog.ŽŽŸŽŒ‹+K% Ú‹– ý"EŸüfd‘øã²6.1‘ Prolog‘UUdirectiv¸ãesŽŽŽ’¶!43ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ6.1.6Ž‘‰Åensure‘¡E‰ff&fŽ‘Ç«linked/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åensure‘¡E‰ff&fŽ–Ç«linked(+predicate‘¡E‰ff&fŽ“indicator)ޤ ‘ã ensure‘¡E‰ff&fŽ–Ç«linked(+predicate‘¡E‰ff&fŽ“indicator‘¡E‰ff&fŽ“list)Ž¡‘ã ensure‘¡E‰ff&fŽ–Ç«linked(+predicate‘¡E‰ff&fŽ“indicator‘¡E‰ff&fŽ“sequence)ަ‘øãÄDescriptionŽ©‘øãÅensure‘¡E‰ff&fŽ‘Ç«linked(Pred)–Àn²spšGeci es“that“the“pro˜cedure“whose‘Àmpredicate“indicator“is“ÅPred“²m¸ãust“b˜e“includedŽ¡‘øãbš¸ãy–±ñthe“link˜er.‘;QThis“directiv˜e“is“useful“when“compiling“to“nativ˜e“coGde‘±òto“force“the“link˜er“to“include“the“coGdeŽ¡‘øãof–®›a›®šgiv¸ãen“predicate.‘}—Indeed,‘Äìif“the˜Ågplc“²is˜in•¸ãv“ok“ed–®›with“an˜option“to˜reduce“the˜size“of˜the“executableŽ¡‘øã(section›O·3.4.3,‘ŽPpage–O¸22),‘ŽOthe“link¸ãer˜only“includes˜the˜coGde“of˜predicates“that˜are“statically˜referenced.Ž¡‘øãHo•¸ãw“ev“er,‘J„the›GÐlink“er–GÏcannot˜detect“dynamically˜referenced˜predicates“(used˜as˜data“passed˜to“a˜meta-callŽ¡‘øãpredicate).‘qÇThe–UUuse“of“this“directivš¸ãe“prev˜en˜ts“it“to“exclude“the“coGde“of“suc˜h“predicates.ަ‘øãIn–2order“to‘2‘alloš¸ãw“m˜ultiple“de nitions,‘ißÅPred“²can“also“bGe“a›2‘list“of“predicate“indicators“or˜a“sequence“ofŽ¡‘øãpredicate–UUindicators“using‘xâÅ','/2“²as“separator.ަ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“directiv¸ãe.ŽŸ%þ6‘øãÄ6.1.7Ž‘‰Åbuilt‘¡E‰ff&fŽ–Ç«in/0Ä,›ÕTÅbuilt‘¡E‰ff&fŽ“in/1Ä,˜Åbuilt‘¡E‰ff&fŽ“in‘¡E‰ff&fŽ“fd/0Ä,˜Åbuilt‘¡E‰ff&fŽ“in‘¡E‰ff&fŽ“fd/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åbuilt‘¡E‰ff&fŽ‘Ç«inŽ¡‘ã built‘¡E‰ff&fŽ–Ç«in(+predicate‘¡E‰ff&fŽ“indicator)Ž¡‘ã built‘¡E‰ff&fŽ–Ç«in(+predicate‘¡E‰ff&fŽ“indicator‘¡E‰ff&fŽ“list)Ž¡‘ã built‘¡E‰ff&fŽ–Ç«in(+predicate‘¡E‰ff&fŽ“indicator‘¡E‰ff&fŽ“sequence)Ž¡‘ã built‘¡E‰ff&fŽ–Ç«in‘¡E‰ff&fŽ“fdŽ¡‘ã built‘¡E‰ff&fŽ–Ç«in‘¡E‰ff&fŽ“fd(+predicate‘¡E‰ff&fŽ“indicator)Ž¡‘ã built‘¡E‰ff&fŽ–Ç«in‘¡E‰ff&fŽ“fd(+predicate‘¡E‰ff&fŽ“indicator‘¡E‰ff&fŽ“list)Ž¡‘ã built‘¡E‰ff&fŽ–Ç«in‘¡E‰ff&fŽ“fd(+predicate‘¡E‰ff&fŽ“indicator‘¡E‰ff&fŽ“sequence)ަ‘øãÄDescriptionŽ©‘øãÅbuilt‘¡E‰ff&fŽ‘Ç«in–ȲspšGeci es‘Èthat“the“pro˜cedures‘Ède ned“from“noš¸ãw“ha˜v˜e‘Èthe“Åbuilt‘¡E‰ff&fŽ‘Ç«in“²propGert˜y‘È(section“7.8.2,Ž¡‘øãpage‘UU65).ަ‘øãÅbuilt‘¡E‰ff&fŽ‘Ç«in(Pred)–c]²is›c\similar“to˜Åbuilt‘¡E‰ff&fŽ‘Ç«in/0“²but“only˜a ects“the“proGcedure˜whose“predicate˜indicator“isŽ¡‘øãÅPred².ަ‘øãThis–UUdirectiv¸ãe“shall“precede“the“de nition“of‘rÅPred“²in“the“source“ le.ަ‘øãIn–2order“to‘2‘alloš¸ãw“m˜ultiple“de nitions,‘ißÅPred“²can“also“bGe“a›2‘list“of“predicate“indicators“or˜a“sequence“ofŽ¡‘øãpredicate–UUindicators“using‘xâÅ','/2“²as“separator.ަ‘øãÅbuilt‘¡E‰ff&fŽ–Ç«in‘¡E‰ff&fŽ“fd›_x²(resp.‘/Åbuilt‘¡E‰ff&fŽ“in‘¡E‰ff&fŽ“fd(Pred)²)˜is˜similar˜to˜Åbuilt‘¡E‰ff&fŽ“in˜²(resp.‘/Åbuilt‘¡E‰ff&fŽ“in(Pred)²)˜but˜sets˜theŽ¡‘øãÅbuilt‘¡E‰ff&fŽ–Ç«in‘¡E‰ff&fŽ“fd–UU²predicate“propGert¸ãy“(section“7.8.2,“page“65).ަ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“directiv¸ães.ŽŽŸŽŒ‹,Wš Ú‹– ý"EŸüfd‘øã²44ŽŽŽ’©–¼6‘ PRš¸ãOLOG–UUDIRECTIVES“AND“CONTR˜OL“CONSTR˜UCTSŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ6.1.8Ž‘‰Åinclude/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ[‘ã Åinclude(+atom)Ž¡‘øãÄDescriptionŽ©‘øãÅinclude(File)–sé²spGeci es›sèthat“the˜con•¸ãten“t–séof˜the“Prolog˜source“ÅFile˜²shall“bGe˜inserted.‘Í‚The˜resultingޤ ‘øãProlog–Ñ®text“is“idenš¸ãtical‘ѯto“the“Prolog“text“obtained“b˜y‘ѯreplacing“the“directiv˜e“b˜y“the“con˜ten˜t‘ѯof“the“PrologŽ¡‘øãsource‘UUÅFile².ަ‘øãSee›UUÅabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2˜²for˜information˜abGout˜the˜syn¸ãtax˜of‘rÅFile˜²(section˜7.26.1,˜page˜141).ަ‘øãÄP•®9ortabilit“yަ‘øã²ISO‘UUdirectiv¸ãe.ŽŸ%èú‘øãÄ6.1.9Ž‘‰Åensure‘¡E‰ff&fŽ‘Ç«loaded/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ[‘ã Åensure‘¡E‰ff&fŽ‘Ç«loaded(+atom)Ž¡‘øãÄDescriptionަ‘øãÅensure‘¡E‰ff&fŽ‘Ç«loaded(File)–²is›not“suppGorted˜bš¸ãy“GNU‘>Prolog.‘#vWhen“suc˜h‘a“directiv˜e‘is“encoun˜tered‘it“isŽŸ ‘øãsimply‘UUignored.ަ‘øãÄP•®9ortabilit“yަ‘øã²ISO–UUdirectiv¸ãe.‘qÇNot“suppGorted.ŽŸ%èú‘øãÄ6.1.10Ž‘!ƇÅop/3ŽŸuT‘øãÄT‘ÿ «emplatesŽ¡‘ã Åop(+integer,–?ý+operator‘¡E‰ff&fŽ›Ç«specifier,“+atom‘¡E‰ff&fŽ˜or‘¡E‰ff&fŽ˜atom‘¡E‰ff&fŽ˜list)Ž¡‘øãÄDescriptionަ‘øãÅop(Priority,–?ýOpSpecifier,“Operator)–õ;²alters›õ|ŽŽŽŽ ÃÝ» ý_"E‘øãÄDescriptionŽ©‘øãÅchar‘¡E‰ff&fŽ‘Ç«conversion(InChar,‘?ýOutChar)–•ݲalters›•Üthe“c•¸ãharacter-con“v“ersion–•Ýmapping.‘3^This“directiv¸ãe˜is“exe-ޤ ‘øãcuted–òas“soGon“as“it“is“encounš¸ãtered“b˜y‘òa“call“to“the“built-in“predicate“Åchar‘¡E‰ff&fŽ‘Ç«conversion/2“²(section“7.14.12,Ž¡‘øãpage–^102).‘ÆàA‘*system“directiv¸ãe›]is“also“generated˜to“re ect˜the“e ect˜of“this˜directiv¸ãe“at˜run-time“(sec-Ž¡‘øãtion–UU3.4.4,“page“25).ަ‘øãÄP•®9ortabilit“yަ‘øã²ISO‘UUdirectiv¸ãe.ŽŸ%þ6‘øãÄ6.1.12Ž‘!ƇÅset‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åset‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag(+flag,‘?ý+term)Ž¡‘øãÄDescriptionަ‘øãÅset‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag(Flag,‘?ýValue)–£Û²sets›£Úthe“v‘ÿqÇalue“of˜the“Prolog“ ag“ÅFlag˜²to“ÅValue².‘]XThis“directiv¸ãe˜is“exe-ޤ ‘øãcuted–Yas“soGon“as‘Yžit“is“encounš¸ãtered“b˜y“a“call“to“the‘Yžbuilt-in“predicate“Åset‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag/2–Y²(section“7.22.1,Ž¡‘øãpage–^133).‘ÆàA‘*system“directiv¸ãe›]is“also“generated˜to“re ect˜the“e ect˜of“this˜directiv¸ãe“at˜run-time“(sec-Ž¡‘øãtion–UU3.4.4,“page“25).ަ‘øãÄP•®9ortabilit“yަ‘øã²ISO‘UUdirectiv¸ãe.ŽŸ%þ6‘øãÄ6.1.13Ž‘!ƇÅinitialization/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åinitialization(+callable‘¡E‰ff&fŽ‘Ç«term)Ž¡‘øãÄDescriptionަ‘øãÅinitialization(Goal)–ŽÃ²adds›ŽÄÅGoal“²to“the˜set“of“goal˜whic¸ãh“shall˜bGe“executed“at˜run-time.‘/—A‘Ž‘user“directiv¸ãeޤ ‘øãis–pågenerated“to“execute“ÅGoal“²at“run-time.‘ÄxIf“sevš¸ãeral“initialization“directiv˜es“appGear“in“the“same“ le“theyŽ¡‘øãare–UUexecuted“in“the“order“of“appGearance“(section“3.4.4,“page“25).ަ‘øãÄP•®9ortabilit“yަ‘øã²ISO‘UUdirectiv¸ãe.ŽŸ%þ6‘øãÄ6.1.14Ž‘!ƇÅforeign/2Ä,‘ÕTÅforeign/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åforeign(+callable‘¡E‰ff&fŽ–Ç«term,‘?ý+foreign‘¡E‰ff&fŽ“option‘¡E‰ff&fŽ“list)Ž¡‘ã foreign(+callable‘¡E‰ff&fŽ‘Ç«term)ަ‘øãÄDescriptionŽŽŸŽŒ‹.l¸ Ú‹– ý"EŸüfd‘øã²46ŽŽŽ’©–¼6‘ PRš¸ãOLOG–UUDIRECTIVES“AND“CONTR˜OL“CONSTR˜UCTSŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅforeign(Template,‘?ýOptions)–WX²de nes›WWan“in¸ãterface“predicate“whose˜protot¸ãypGe“is“ÅTemplate˜²according“toޤ ‘øãthe–poptions“givš¸ãen“b˜y‘“ÅOptions².‘ÁÏRefer“to“the“foreign“coGde“in˜terface‘pfor“more“information“(section“9.1,Ž¡‘øãpage‘UU183).ޤ‘øãÅforeign(Template)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åforeign(Template,‘?ý[])².Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“directiv¸ãe.ŽŸ'þ6‘øãÇ6.2Ž‘£Prolog–€con trol“constructsޤuT‘øãÄ6.2.1Ž‘‰Åtrue/0Ä,–ÕTÅfail/0Ä,“Å!/0Ž¡‘øãÄT‘ÿ «emplatesŽ©‘ã Åtrueޤ ‘ã failŽ¡‘ã !ަ‘øãÄDescriptionޤ‘øãÅtrue›UU²alw•¸ãa“ys˜succeeds.Ž¡‘øãÅfail›UU²alw•¸ãa“ys˜fails˜(enforces˜bac“ktrac“king).Ž¡‘øãÅ!‘\ß²alw•¸ãa“ys–succeeds“and‘žthe“for“side-e ect“of“remoš¸ãving“all“c˜hoice-pGoin˜ts“created‘žsince“the“in˜v˜oGcation“of“theŽŸ ‘øãpredicate–UUactiv‘ÿqÇating“it.Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO–UUcon¸ãtrol“constructs.ŽŸ%þ6‘øãÄ6.2.2Ž‘‰Å(',')/2–ÕTÄ-“conjunction,“Å(;)/2“Ä-“disjunction,“Å(->)/2“Ä-“if-thenŽŸuT‘øãT‘ÿ «emplatesަ‘ã Å','(+callable‘¡E‰ff&fŽ–Ç«term,‘?ý+callable‘¡E‰ff&fŽ“term)ޤ ‘ã ;(+callable‘¡E‰ff&fŽ–Ç«term,‘?ý+callable‘¡E‰ff&fŽ“term)Ž¡‘ã ->(+callable‘¡E‰ff&fŽ–Ç«term,‘?ý+callable‘¡E‰ff&fŽ“term)ަ‘øãÄDescriptionޤ‘øãÅGoal1–?ý,“Goal2–UU²executes“ÅGoal1“²and,“in“case“of“success,“executes“ÅGoal2².Ž¡‘øãÅGoal1–?ý;“Goal2–UU² rst“creates“a“c•¸ãhoice-pGoin“t–UUand“executes“ÅGoal1².‘qÇOn“bac•¸ãktrac“king‘xâÅGoal2–UU²is“executed.Ž¡‘øãÅGoal1–?ý->“Goal2–0² rst“executes‘0ÅGoal1“²and,›7Žin“case“of“success,˜remo•¸ãv“es–0all“c•¸ãhoice-pGoin“ts‘0created‘0b“y‘S©ÅGoal1ޤ ‘øã²and›½ executes–½ ÅGoal2².‘?This“con¸ãtrol˜construct˜acts“lik¸ãe˜an“if-then˜(ÅGoal1“²is˜the“test˜part“and˜ÅGoal2“²the˜thenŽ¡‘øãpart).‘§áNote›g]that–g^if‘.zÅGoal1“²fails˜Å->/2“²fails˜also.‘§áÅ->/2“²is˜often“com¸ãbined˜with“Å;/2˜²to“de ne˜an“if-then-elseŽŽŸŽŒ‹/uU Ú‹– ý"EŸüfd‘øã²6.2‘ Prolog–UUcon¸ãtrol“constructsŽŽŽ’¶!47ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãas›8Ðfollo¸ãws:‘8½ÅGoal1–?ý->“Goal2“;“Goal3².‘8Note˜that˜ÅGoal1“->“Goal2˜²is˜the˜ rst˜argumen¸ãt˜of˜the˜Å(;)/2ޤ ‘øã²and–8ËÅGoal3“²(the“else“part)“is“the“second“argumen•¸ãt.‘)Suc“h–8Ëan“if-then-else“con¸ãtrol“construct“ rst“createsŽ¡‘øãa›A”c•¸ãhoice-pGoin“t˜for‘A•the˜else-part˜(in“tuitiv“ely˜assoGciated˜with˜Å;/2²)‘A•and˜then˜executes˜ÅGoal1².‘6…In˜case˜ofŽ¡‘øãsuccess,‘ºÞall›¦c•¸ãhoice-pGoin“ts‘¦created˜b“y‘ÊÅGoal1–¦²together˜with“the˜c•¸ãhoice-pGoin“t˜for–¦the˜else-part“are˜remo•¸ãv“edŽ¡‘øãand–UUÅGoal2“²is“executed.‘qÇIf‘rÅGoal1“²fails“then“ÅGoal3“²is“executed.ޤ‘øãÅ','²,–UUÅ;“²and“Å->“²are“prede ned“in x“opGerators“(section“7.14.10,“page“100).Ž¡‘øãÄErrorsŽŸ:ÿ‘øãŸÒæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅGoal1–UU²or“ÅGoal2“²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Goal1–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýGoal1)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Goal2–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýGoal2)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ'™œ„0ffŸØfd‘²The–UUpredicate“indicator“ÅPred“²of‘rÅGoal1“²or“ÅGoal2ޤ ‘²došGes–UUnot“corresp˜ond“to“an“existing“pro˜cedureŽ¡‘and–UUthe“v‘ÿqÇalue“of“the“Åunknown“²Prolog“ ag“isŽ¡‘Åerror–UU²(section“7.22.1,“page“133)ŽŽ’㥄0ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(procedure,‘?ýPred)ŽŽ’ÆØŸ'™œ„0ffŽŽŸ(‰ffÇ>|ŽŽŽŸ|¤fdŸ™œ„ ffŸüfd‘ÅGoal–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Goal–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýGoal)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ'™œ„0ffŸØfd‘²The–UUpredicate“indicator“ÅPred“²of‘rÅGoal“²doGes“notޤ ‘correspšGond–UUto“an“existing“pro˜cedure“and“theŽ¡‘v‘ÿqÇalue–UUof“the“Åunknown“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄0ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(procedure,‘?ýPred)ŽŽ’ÆØŸ'™œ„0ffŽŽŸ(‰ffÇ>|ŽŽŽŸ6>“‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO–UUcon¸ãtrol“construct.ަ‘øãÄ6.2.4Ž‘‰Åcatch/3Ä,‘ÕTÅthrow/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åcatch(?callable‘¡E‰ff&fŽ‘Ç«term,–?ý?term,“?term)ŽŸ ‘ã throw(+nonvar)Ž¡‘øãÄDescriptionŽŽŸŽŒ‹0}Ò Ú‹– ý"EŸüfd‘øã²48ŽŽŽ’©–¼6‘ PRš¸ãOLOG–UUDIRECTIVES“AND“CONTR˜OL“CONSTR˜UCTSŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅcatch(Goal,–?ýCatcher,“Recovery)–d²is›csimilar“to˜Åcall(Goal)“²(section“6.2.3,‘`page“47).‘W!If“this˜succeeds“orޤ ‘øãfails,›²Mso‘‰ŒdoGes–‰‹the“call“to“Åcatch/3².‘-ÚIf“ho•¸ãw“ev“er,‘²Nduring–‰‹the“execution“of‘P©ÅGoal²,˜there“is“a‘‰Œcall“to“Åthrow(Ball)²,Ž¡‘øãthe›úôcurren•¸ãt‘úõ o“w˜of˜con“trol‘úõis˜in“terrupted,‘ and˜con“trol˜returns–úõto˜a˜call˜of‘ÂÅcatch/3˜²that˜is“bGeing˜executed.Ž¡‘øãThis–UUcan“happGen“in“one“of“t•¸ãw“o‘UUw“a“ys:ޤ‘ã¸ŽŽŽ‘ã ²implicitly‘ÿ*ª,–UUwhen“an“error“condition“for“a“built-in“predicate“is“satis ed.Ž¡‘ã¸ŽŽŽ‘ã ²explicitly‘ÿ*ª,‘—when–ãñthe“program›ãðexecutes“a“call˜of‘«Åthrow/1“²bGecause˜the“program“wishes˜to“abandonŽ© ‘ã the–UUcurrenš¸ãt“proGcessing,“and“instead“to“tak˜e“an“alternativ˜e“action.Ž¡‘øãÅthrow(Ball)–(̲causes“the“normal“ oš¸ãw“of“con˜trol“to“bGe‘(Ëtransferred“bac˜k“to“an“existing“call“of‘ïéÅcatch/3².ަ‘øãWhen–žåa“call“to“Åthrow(Ball)“²happGens,‘ñIÅBall“²is“copied“and“the“stacš¸ãk“is“un˜w˜ound“bac˜k“to“the“call“toަ‘øãÅcatch/3²,‘öwhereupGon–ÞRthe›ÞQcop¸ãy“of‘¥oÅBall˜²is“uni ed˜with“ÅCatcher².‘JIf“this“uni cation˜succeeds,‘öthen“Åcatch/3ަ‘øã²executes–æ‡the›æ†goal“ÅRecovery“²using‘ Åcall/1“²(section“6.2.3,‘ Ópage˜47)“in“order˜to“determine“the˜success“orަ‘øãfailure–Šof‘Ú¦Åcatch/3².‘¬eOtherwise,‘Cin“case›‰the“uni cation“fails,‘Cthe“stac•¸ãk˜k“eeps‘Šun“winding,‘CloGoking˜for‘Šanަ‘øãearlier›UUin•¸ãv“oGcation˜of‘rÅcatch/3².‘qÇÅBall˜²ma“y˜bGe˜an“y˜non-v‘ÿqÇariable˜term.ޤ‘øãÄErrorsŽŸ:ÿ‘øãŸÒæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅGoal–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Goal–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýGoal)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ'™œ„0ffŸØfd‘²The–UUpredicate“indicator“ÅPred“²of‘rÅGoal“²doGes“notޤ ‘correspšGond–UUto“an“existing“pro˜cedure“and“theŽ¡‘v‘ÿqÇalue–UUof“the“Åunknown“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄0ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(procedure,‘?ýPred)ŽŽ’ÆØŸ'™œ„0ffŽŽŸ(‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Ball–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ|ŽŽŽŽ ÃÝ» ý_"E‘øã¼7Ž‘/ÒProlog–ffbuilt-in“predicatesŽŸ#ç‘øãÇ7.1Ž‘£T yp`e‘€testingޤuT‘øãÄ7.1.1Ž‘‰Åvar/1Ä,–ÕTÅnonvar/1Ä,“Åatom/1Ä,“Åinteger/1Ä,“Åfloat/1Ä,“Ånumber/1Ä,“Åatomic/1Ä,Ž© ‘‰Åcompound/1Ä,–ÕTÅcallable/1Ä,“Ålist/1Ä,“Åpartial‘¡E‰ff&fŽ›Ç«list/1Ä,“Ålist‘¡E‰ff&fŽ˜or‘¡E‰ff&fŽ˜partial‘¡E‰ff&fŽ˜list/1Ž¡‘øãÄT‘ÿ «emplatesŽŸTŸÄ‘ã Åvar(?term)ަ‘ã nonvar(?term)ަ‘ã atom(?term)ަ‘ã integer(?term)ަ‘ã float(?term)ަ‘ã number(?term)ŽŽŸÄ’ú‚Gatomic(?term)ަ’ú‚Gcompound(?term)ަ’ú‚Gcallable(?term)ަ’ú‚Glist(?term)ަ’ú‚Gpartial‘¡E‰ff&fŽ‘Ç«list(?term)ަ’ú‚Glist‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“partial‘¡E‰ff&fŽ“list(?term)ŽŽŽ¤‘øãÄDescriptionŽ¡‘øãÅvar(Term)–Ö=²succeeds“if‘ZÅTerm‘Ö<²is“currenš¸ãtly“uninstan˜tiated“(whic˜h“therefore“has“not‘Ö“²0ަ‘øã(a–UUlist“or“a“structure).Ž¡‘øãÅcallable(Term)›ªª²succeeds–ª©if‘qÇÅTerm“²is˜currenš¸ãtly“instan˜tiated›ªªto“a˜callable“term,‘ÌÌi.e.‘8äan“atom˜or“a˜compGoundަ‘øãterm.Ž¡‘øãÅlist(Term)–©ä²succeeds“if‘qÅTerm“²is“currenš¸ãtly“instan˜tiated›©ãto“a“list,‘¿i.e.‘otthe˜atom“Å[]“²(empt¸ãy“list)“or“a“termަ‘øãwith–UUprincipal“functor“Å'.'/2“²and“with“second“argumen¸ãt“(the“tail)“a“list.Ž¡‘øãÅpartial‘¡E‰ff&fŽ‘Ç«list(Term)–P²succeeds“if‘ÅTerm“²is“currenš¸ãtly“instan˜tiated“to›P€a“partial“list,‘Qxi.e.‘p+a“v‘ÿqÇariable˜or“a“termަ‘øãwhose–UUthe“main“functor“is“Å'.'/2“²and“the“second“argumen¸ãt“(the“tail)“is“a“partial“list.Ž¡‘øãÅlist‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“partial‘¡E‰ff&fŽ“list(Term)–UU²succeeds“if‘rÅTerm“²is“currenš¸ãtly“instan˜tiated“to“a“list“or“a“partial“list.Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øãÅvar/1²,–\Ånonvar/1²,“Åatom/1²,‘\Åinteger/1²,“Åfloat/1²,“Ånumber/1²,“Åatomic/1²,“Åcompound/1–Z¸²and“Åcallable/1“²areަ‘øãISO‘UUpredicates.ŽŽŸŽŒ‹2–Ë Ú‹– ý"EŸüfd‘øã²50ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅlist/1²,–UUÅpartial‘¡E‰ff&fŽ›Ç«list/1“²and“Ålist‘¡E‰ff&fŽ˜or‘¡E‰ff&fŽ˜partial‘¡E‰ff&fŽ˜list/1“²are“GNU“Prolog“predicates.ŽŸ'þ6‘øãÇ7.2Ž‘£T‘þàerm‘€uni cationޤuT‘øãÄ7.2.1Ž‘‰Å(=)/2–ÕTÄ-“Prolog“uni cationŽ¡‘øãT‘ÿ «emplatesޤ‘ã Å=(?term,‘?ý?term)Ž¡‘øãÄDescriptionޤ‘øãÅTerm1–?ý=“Term2–5²uni es›5ÅTerm1“²and“ÅTerm2².‘gNo“oGccurs“c•¸ãhec“k˜is–5done,‘;„i.e.‘gthis“predicate˜doGes“not“c•¸ãhec“k˜if‘5aŽ© ‘øãv›ÿqÇariable–UUis“uni ed“with“a“compGound“term“con¸ãtaining“this“v˜ariable“(this“can“lead“to“an“in nite“loGop).Ž¡‘øãÅ=–UU²is“a“prede ned“in x“opGerator“(section“7.14.10,“page“100).Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicate.ŽŸ%þ6‘øãÄ7.2.2Ž‘‰Åunify‘¡E‰ff&fŽ–Ç«with‘¡E‰ff&fŽ“occurs‘¡E‰ff&fŽ“check/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åunify‘¡E‰ff&fŽ–Ç«with‘¡E‰ff&fŽ“occurs‘¡E‰ff&fŽ“check(?term,‘?ý?term)Ž¡‘øãÄDescriptionޤ‘øãÅunify‘¡E‰ff&fŽ–Ç«with‘¡E‰ff&fŽ“occurs‘¡E‰ff&fŽ“check(Term1,‘?ýTerm2)–RQ²uni es›RPÅTerm1“²and˜ÅTerm2².‘pÆThe˜oGccurs“c•¸ãhec“k˜test–RQis˜done“(i.e.ަ‘øãthe–UUuni cation“fails“if“a“v›ÿqÇariable“is“uni ed“with“a“compGound“term“con¸ãtaining“this“v˜ariable).Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicate.ŽŸ%þ6‘øãÄ7.2.3Ž‘‰Å(\=)/2–ÕTÄ-“not“Prolog“uni ableŽŸuT‘øãT‘ÿ «emplatesޤ‘ã Å\=(?term,‘?ý?term)Ž¡‘øãÄDescriptionŽŸ‘øãÅTerm1–?ý\=“Term2–UU²succeeds“if‘rÅTerm1“²and“ÅTerm2“²are“not“uni able“(no“oGccurs“c•¸ãhec“k–UUis“done).ŽŽŸŽŒ‹3¢* Ú‹– ý"EŸüfd‘øã²7.3‘ T‘ÿ*ªerm‘UUcomparisonŽŽŽ’¶!51ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅ\=–UU²is“a“prede ned“in x“opGerator“(section“7.14.10,“page“100).ޤ‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicate.ŽŸ'«Í‘øãÇ7.3Ž‘£T‘þàerm‘€comparisonޤuT‘øãÄ7.3.1Ž‘‰Standard–ÕTtotal“ordering“of“termsŽ¡‘øã²The–|ùbuilt-in›|øpredicates“describGed˜in“this˜section“allo¸ãws˜the“user˜to“compare˜Prolog“terms.‘è±Prolog“termsޤ ‘øãare–Ÿ°totally“ordered“according“to›Ÿ±the“standard“total“ordering“of“terms“whic¸ãh“is˜as“follo¸ãws“(from“the“smallestŽ¡‘øãterm–UUto“the“greatest):ŽŸ+‘ã¸ŽŽŽ‘ã ²v‘ÿqÇariables,–UUoldest“ rst.ޤ@–‘ã¸ŽŽŽ‘ã ² nite–UUdomain“v‘ÿqÇariables“(section“8.1.1,“page“165),“oldest“ rst.Ž¡‘ã¸ŽŽŽ‘ã ² oating–UUpGoinš¸ãt“n˜um˜bGers,“in“n˜umeric“order.Ž¡‘ã¸ŽŽŽ‘ã ²inš¸ãtegers,–UUin“n˜umeric“order.Ž¡‘ã¸ŽŽŽ‘ã ²atoms,–UUin“alphabšGetical“(i.e.‘qÇc¸ãharacter“co˜de)“order.Ž¡‘ã¸ŽŽŽ‘ã ²compGound–¤‡terms,‘øSordered“ rst“bš¸ãy“arit˜y‘ÿ*ª,‘øTthen“b˜y“the“name“of“the“principal“functor“and“b˜y“theޤ ‘ã argumenš¸ãts–UUin“left-to-righ˜t“order.ŽŸ,‘øãA–UUlist“is“treated“as“a“compGound“term“(whose“principal“functor“is“Å'.'/2²).Ž©‘øãThe–‰cpGortabilit¸ãy“of›‰dthe“order“of“v‘ÿqÇariables˜is“not“guaran¸ãteed“(in˜the“ISO‘‰Vreference“the“oGder˜of“v‘ÿqÇariables“isŽ¡‘øãsystem‘UUdepGenden¸ãt).ŽŸ%«Ì‘øãÄ7.3.2Ž‘‰Å(==)/2–ÕTÄ-“term“idenš®9tical,“Å(\==)/2“Ä-“term“not“iden˜tical,Ž¡‘‰Å(@<)/2–ÕTÄ-“term“less“than,“Å(@=<)/2“Ä-“term“less“than“or“equal“to,Ž¡‘‰Å(@>)/2–ÕTÄ-“term“greater“than,“Å(@>=)/2“Ä-“term“greater“than“or“equal“toŽŸuT‘øãT‘ÿ «emplatesŽŸ.àáŸè‘ã Å==(?term,‘?ý?term)Ž¡‘ã \==(?term,‘?ý?term)Ž¡‘ã @<(?term,‘?ý?term)ŽŽŸè’ú‚G@=<(?term,‘?ý?term)Ž¡’ú‚G@>(?term,‘?ý?term)Ž¡’ú‚G@>=(?term,‘?ý?term)ŽŽŽ¦‘øãÄDescriptionަ‘øã²These–>Zpredicates›>[compare“t•¸ãw“o˜terms–>Zaccording˜to“the“standard˜total“ordering˜of“terms˜(section“7.3.1,Ž¡‘øãpage‘UU51).ަ‘øãÅTerm1–?ý==“Term2–UU²succeeds“if‘rÅTerm1“²and“ÅTerm2“²are“equal.ަ‘øãÅTerm1–?ý\==“Term2–UU²succeeds“if‘rÅTerm1“²and“ÅTerm2“²are“di eren¸ãt.ަ‘øãÅTerm1–?ý@<“Term2–UU²succeeds“if‘rÅTerm1“²is“less“than“ÅTerm2².ŽŽŸŽŒ‹4© Ú‹– ý"EŸüfd‘øã²52ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅTerm1–?ý@=<“Term2–UU²succeeds“if‘rÅTerm1“²is“less“than“or“equal“to“ÅTerm2².ޤ‘øãÅTerm1–?ý@>“Term2–UU²succeeds“if‘rÅTerm1“²is“greater“than“ÅTerm2².Ž¡‘øãÅTerm1–?ý@>=“Term2–UU²succeeds“if‘rÅTerm1“²is“greater“than“or“equal“to“ÅTerm2².Ž¡‘øãÅ==²,–UUÅ\==²,“Å@<²,“Å@=<²,“Å@>“²and“Å@>=“²are“prede ned“in x“opGerators“(section“7.14.10,“page“100).Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicates.ŽŸ%¬‰‘øãÄ7.3.3Ž‘‰Åcompare/3ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ„•‘ã Åcompare(?atom,–?ý+term,“+term)Ž©„–‘øãÄDescriptionŽ¡‘øãÅcompare(Result,–?ýTerm1,“Term2)–[²compares›[žÅTerm1“²and˜ÅTerm2“²according“to˜the“standard˜(section“7.3.1,ŽŸ ‘øãpage–UU51)“and“uni es“ÅResult“²with:ަ‘ã¸ŽŽŽ‘ã ²the–UUatom“Å<“²if‘rÅTerm1“²is“less“than“ÅTerm2².ŽŸBK‘ã¸ŽŽŽ‘ã ²the–UUatom“Å=“²if‘rÅTerm1“²and“ÅTerm2“²are“equal.ŽŸBJ‘ã¸ŽŽŽ‘ã ²the–UUatom“Å>“²if‘rÅTerm1“²is“greater“than“ÅTerm2².ަ‘øãÄErrorsŽ¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅResult–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýResult)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ'¬‰‘øãÇ7.4Ž‘£T‘þàerm‘€pro`cessingޤuT‘øãÄ7.4.1Ž‘‰Åfunctor/3Ž¡‘øãÄT‘ÿ «emplatesަ‘ã Åfunctor(+nonvar,–?ý?atomic,“?integer)ޤ ‘ã functor(-nonvar,–?ý+atomic,“+integer)ŽŸ„•‘øãÄDescriptionŽŸ‘øãÅfunctor(Term,–?ýName,“Arity)–´<²succeeds“if“the›´;principal“functor“of‘{YÅTerm“²is“ÅName“²and˜its“arit¸ãy“is“ÅArity².Ž¡‘øãThis–UUpredicate“can“bGe“used“in“t•¸ãw“o‘UUw“a“ys:ަ‘ã¸ŽŽŽ‘ã ÅTerm–Q=²is“not“a“v‘ÿqÇariable:‘o»extract“the“name“(an“atom“or‘Q|ŽŽŽŽ ÃÝ» ý_"E‘ã¸ŽŽŽ‘ã ÅTerm–ãx²is“a“v‘ÿqÇariable:‘Ž unify‘ÅTerm“²with“a‘ãygeneral“term“whose“principal“functor“is“givš¸ãen“b˜y‘ÅName“²andŽŸ ‘ã aritš¸ãy–UUis“giv˜en“b˜y‘xâÅArity².ޤ@‘øãÄErrorsŽŸS˜‘øãŸºLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅTerm–UU²and“ÅName“²are“bGoth“v‘ÿqÇariablesŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Term–UU²and“ÅArity“²are“bGoth“v‘ÿqÇariablesŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Term–UU²is“a“v›ÿqÇariable“and“ÅName“²is“neither“a“v˜ariableŽŸ ‘nor–UUan“atomic“termŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atomic,‘?ýName)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Term–?ײis“a“v›ÿqÇariable“and‘?ÖÅArity“²is“neither“a“v˜ariableŽŸ ‘nor–UUan“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýArity)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Term–UU²is“a“v‘ÿqÇariable,“ÅName“²is“a“constan¸ãt“but“not“anŽŸ ‘atom–UUand“ÅArity“²is“an“in¸ãteger“µ>“²0ŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýName)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Term–UU²is“a“v‘ÿqÇariable“and“ÅArity“²is“an“in¸ãteger“µ>ŽŸ ‘Åmax‘¡E‰ff&fŽ‘Ç«arity–UU² ag“(section“7.22.1,“page“133)ŽŽ’㥄ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(max‘¡E‰ff&fŽ“arity)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Term–UU²is“a“v‘ÿqÇariable“and“ÅArity“²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýArity)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽŸU _‘øãÄP•®9ortabilit“yŽ©‘øã²ISO‘UUpredicate.ŽŸ%±Ø‘øãÄ7.4.2Ž‘‰Åarg/3ŽŸuT‘øãÄT‘ÿ «emplatesŽ¡‘ã Åarg(+integer,–?ý+compound‘¡E‰ff&fŽ‘Ç«term,“?term)ŽŸA‘øãÄDescriptionަ‘øãÅarg(N,–?ýTerm,“Arg)–UU²succeeds“if“the“ÅNÈth‘¸²argumen¸ãt“of‘rÅTerm“²is“ÅArg².ަ‘øãÄErrorsŽŸ.³2‘øãŸÞ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅN–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Term–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘N–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýN)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Term–UU²is“neither“a“v‘ÿqÇariable“nor“a“compGound“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(compound,‘?ýTerm)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘N–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýN)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ0¤ù‘øãÄP•®9ortabilit“yަ‘øã²ISO‘UUpredicate.ŽŸ%±Ø‘øãÄ7.4.3Ž‘‰Å(=..)/2–ÕTÄ-“univŽŸuT‘øãT‘ÿ «emplatesŽ¡‘ã Å=..(+nonvar,‘?ý?list)ŽŸ ‘ã =..(-nonvar,‘?ý+list)Ž¡‘øãÄDescriptionަ‘øãÅTerm‘?ý=..‘ úList–²succeeds“if‘Ú"ÅList›²is“a“list“whose“head“is“the“atom˜correspGonding“to“the“principal“functorŽŸ ‘øãof›rÅTerm–UU²and“whose“tail“is“a“list“of“the“argumen¸ãts“of˜ÅTerm².ަ‘øãÅ=..‘qDzis–UUa“prede ned“in x“opGerator“(section“7.14.10,“page“100).ŽŽŸŽŒ‹6º% Ú‹– ý"EŸüfd‘øã²54ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄErrorsŽŸY˜‘øãŸ´LΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅTerm–UU²is“a“v‘ÿqÇariable“and“ÅList“²is“a“partial“listŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘List–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýList)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Term–UU²is“a“v‘ÿqÇariable“and“ÅList“²is“a“list“whose“headŽŸ ‘is–UUa“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘List–ñ§²is›ñ¦a“list“whose˜head“ÅH‘ñ²is“neither“an˜atom“norŽŸ ‘a–UUv‘ÿqÇariable“and“whose“tail“is“not“the“empt¸ãy“listŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýH)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘List–UU²is“a“list“whose“head“ÅH“²is“a“compGound“termŽŸ ‘and–UUwhose“tail“is“the“empt¸ãy“listŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atomic,‘?ýH)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Term–UU²is“a“v‘ÿqÇariable“and“ÅList“²is“the“empt¸ãy“listŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(non‘¡E‰ff&fŽ“empty‘¡E‰ff&fŽ“list,‘?ý[])ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘Term–UU²is“a“v‘ÿqÇariable“and“the“tail“of‘rÅList“²has“aޤ ‘length–UUµ>“Åmax‘¡E‰ff&fŽ‘Ç«arity“² ag“(section“7.22.1,Ž¡‘page‘UU133)ŽŽ’㥄$ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(max‘¡E‰ff&fŽ“arity)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ[ _‘øãÄP•®9ortabilit“yŽ©‘øã²ISO‘UUpredicate.ŽŸ%þ6‘øãÄ7.4.4Ž‘‰Åcopy‘¡E‰ff&fŽ‘Ç«term/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åcopy‘¡E‰ff&fŽ‘Ç«term(?term,‘?ý?term)Ž¡‘øãÄDescriptionަ‘øãÅcopy‘¡E‰ff&fŽ‘Ç«term(Term1,‘?ýTerm2)–UU²succeeds“if‘rÅTerm2“²uni es“with“a“term“ÅT“²whicš¸ãh“is“a“renamed“cop˜y“of‘rÅTerm1².ަ‘øãÄErrorsަ‘øã²None.ަ‘øãÄP•®9ortabilit“yަ‘øã²ISO‘UUpredicate.ŽŸ%þ6‘øãÄ7.4.5Ž‘‰Åsetarg/4Ä,‘ÕTÅsetarg/3ŽŸuT‘øãÄT‘ÿ «emplatesŽ¡‘ã Åsetarg(+integer,–?ý+compound‘¡E‰ff&fŽ‘Ç«term,“+term,“+boolean)ŽŸ ‘ã setarg(+integer,–?ý+compound‘¡E‰ff&fŽ‘Ç«term,“+term)Ž¡‘øãÄDescriptionަ‘øãÅsetarg(N,–?ýTerm,“NewValue,“Undo)–?µ²replaces›?¶destructiv¸ãely“the˜ÅNÈth‘²argumen¸ãt˜of‘ÒÅTerm˜²with“ÅNewValue².ޤ ‘øãThis–cassignmen¸ãt›cis“undone“on˜bac•¸ãktrac“king–cif‘*;ÅUndo“²=˜Åtrue².‘›#This“should“only˜used“if“there“is˜no“furtherŽ¡‘øãuse–~|ŽŽŽŽ ÃÝ» ýo‘øãŸÆ›‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅN–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘N–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýN)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘N–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýN)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Term–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Term–UU²is“neither“a“v‘ÿqÇariable“nor“a“compGound“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(compound,‘?ýTerm)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘NewValue–UU²is“neither“an“atom“nor“an“in¸ãteger“andŽŸ ‘ÅUndo–UU²=“ÅfalseŽŽ’㥄ffŽ’éÒqtype‘¡E‰ff&fŽ‘Ç«error(atomic,‘?ýNewValue)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Undo–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Undo–UU²is“neither“a“v‘ÿqÇariable“nor“a“b•Go“oleanŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(boolean,‘?ýUndo)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸI>’‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ'þ6‘øãÇ7.5Ž‘£V‘þàariable‘€naming/n• um“b`eringޤuT‘øãÄ7.5.1Ž‘‰Åname‘¡E‰ff&fŽ–Ç«singleton‘¡E‰ff&fŽ“vars/1Ž¡‘øãÄT‘ÿ «emplatesޤ‘ã Åname‘¡E‰ff&fŽ–Ç«singleton‘¡E‰ff&fŽ“vars(?term)Ž¡‘øãÄDescriptionަ‘øãÅname‘¡E‰ff&fŽ–Ç«singleton‘¡E‰ff&fŽ“vars(Term)–÷²binds“eac¸ãh›÷singleton“v‘ÿqÇariable“appGearing“in˜ÅTerm“²with“a“term˜of“the“formޤ ‘øãÅ'$VARNAME'('‘¡E‰ff&fŽ‘Ç«')².‘?ûSucš¸ãh–ša“term“can“bGe‘šoutput“b˜y‘½žÅwrite‘¡E‰ff&fŽ‘Ç«term/3“²as“a“v‘ÿqÇariable“name“(section“7.14.6,Ž¡‘øãpage‘UU96).ަ‘øãÄErrorsަ‘øã²None.ަ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.5.2Ž‘‰Åname‘¡E‰ff&fŽ–Ç«query‘¡E‰ff&fŽ“vars/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åname‘¡E‰ff&fŽ–Ç«query‘¡E‰ff&fŽ“vars(+list,‘?ý?list)Ž¡‘øãÄDescriptionަ‘øãÅname‘¡E‰ff&fŽ–Ç«query‘¡E‰ff&fŽ“vars(List,‘?ýRest)–Ý^²for‘Ý_eacš¸ãh“elemen˜t“of‘¤|ÅList“²of“the“form›Ý_ÅName–?ý=“Var–Ý^²where“ÅName˜²is“anޤ ‘øãatom–ØÅand›ØÄÅVar“²a“v‘ÿqÇariable,‘ù binds“ÅVar˜²with“the“term˜Å'$VARNAME'(Name)².‘üSuc¸ãh“a˜term“can“bGe˜output“b¸ãyŽ¡‘øãÅwrite‘¡E‰ff&fŽ‘Ç«term/3–dβas›dÏa“v‘ÿqÇariable“name“(section˜7.14.6,‘¨¬page“96).‘ 3ÅRest“²is˜uni ed“with“the“list˜of“elemen¸ãtsŽ¡‘øãof‘âƒÅList–f²that“ha•¸ãv“e–fnot“givš¸ãen“rise“to“a“binding.‘ÃúThis“predicate“is“pro˜vided“as“a“w˜a˜y“to“name“the“v‘ÿqÇari-Ž¡‘øãable– ”lists› •obtained“returned˜b¸ãy‘0!Åread‘¡E‰ff&fŽ‘Ç«term/3“²with˜Åvariable‘¡E‰ff&fŽ‘Ç«names(List)“²or˜Åsingletons(List)“²optionsŽ¡‘øã(section–UU7.14.1,“page“92).ަ‘øãÄErrorsŽŽŸŽŒ‹8Ô Ú‹– ý"EŸüfd‘øã²56ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýjo‘øãŸëš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅList–UU²is“a“partial“listŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘List–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýList)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Rest–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýRest)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ$>“‘øãÄP•®9ortabilit“yŽŸ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.5.3Ž‘‰Åbind‘¡E‰ff&fŽ‘Ç«variables/2Ä,–ÕTÅnumbervars/3Ä,“Ånumbervars/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åbind‘¡E‰ff&fŽ–Ç«variables(?term,‘?ý+var‘¡E‰ff&fŽ“binding‘¡E‰ff&fŽ“option‘¡E‰ff&fŽ“list)ޤ ‘ã numbervars(?term,–?ý+integer,“?integer)Ž¡‘ã numbervars(?term)ަ‘øãÄDescriptionŽ©‘øãÅbind‘¡E‰ff&fŽ‘Ç«variables(Term,‘?ýOptions)–Mh²binds›Mieac¸ãh“v‘ÿqÇariable“appGearing˜in“ÅTerm˜²according“to“the˜options“giv¸ãenŽ¡‘øãb¸ãy‘xâÅOptions².ަ‘øãÄV‘ÿ «ariable‘†Ébinding‘†Èoptions²:‘O¡ÅOptions–²is“a› list“of“v‘ÿqÇariable“binding“options.‘[If“this˜list“conš¸ãtains“con˜tradic-Ž¡‘øãtory–UUoptions,“the“righš¸ãtmost“option“is“the“one“whic˜h“applies.‘qÇP˜ossible“options“are:Ž©‘ã¸ŽŽŽ‘ã Ånumbervars²:‘b\spšGeci es–6that‘6~eac¸ãh“v‘ÿqÇariable“app˜earing›6~in“ÅTerm“²should˜bšGe“b˜ound“to›6~a“term“of˜the“formŽ¡‘ã Å'$VAR'(N)–QJ²where›QLÅN“²is˜an‘QKin•¸ãteger.‘pnSuc“h˜a–QKterm˜can“bGe˜output“b¸ãy‘tØÅwrite‘¡E‰ff&fŽ‘Ç«term/3˜²as“a˜v‘ÿqÇariable“nameŽ¡‘ã (section–UU7.14.6,“page“96).‘qÇThis“is“the“default.ަ‘ã¸ŽŽŽ‘ã Ånamevars²:‘ùöspGeci es–mthat›leac¸ãh“v‘ÿqÇariables˜appGearing“in˜ÅTerm“²shall˜bšGe“b˜ound›lto“a˜term“of˜the“formŽ¡‘ã Å'$VARNAME'(Name)–\²where›]ÅName“²is˜the“atom˜that“w¸ãould“bGe˜output“b¸ãy‘¢êÅwrite‘¡E‰ff&fŽ‘Ç«term/3“²seeing˜a“termŽ¡‘ã of–4Ðthe“Å'$VAR'(N)›4Ȳwhere“ÅN˜²is“an“in•¸ãteger.‘fðSuc“h–4Ða“term“can‘4ÑbGe“output“b¸ãy‘X]Åwrite‘¡E‰ff&fŽ‘Ç«term/3“²as“a“v‘ÿqÇariableŽ¡‘ã name–UU(section“7.14.6,“page“96).‘qÇThis“is“the“alternativ¸ãe“to“Ånumbervars².ަ‘ã¸ŽŽŽ‘ã Åfrom(From)²:‘ #the›!‚ rst–!ƒin¸ãteger“ÅN‘!N²to“use˜for“n•¸ãum“bGer/name–!ƒv‘ÿqÇariables“of‘èŸÅTerm“²is“ÅFrom².‘ÖPThe“defaultŽ¡‘ã v‘ÿqÇalue–UUis“Å0².ަ‘ã¸ŽŽŽ‘ã Ånext(Next)²:‘Dwhen–ùÖÅbind‘¡E‰ff&fŽ‘Ç«variables/2›ùײsucceeds,‘ #ÅNext“²is˜uni ed“with˜the“(last˜in¸ãteger“ÅN²)+1˜used“toŽ¡‘ã bind–UUthe“v‘ÿqÇariables“of‘rÅTerm².ަ‘ã¸ŽŽŽ‘ã Åexclude(List)²:‘•œcollects–g@all›g?v‘ÿqÇariable“names“appGearing˜in“ÅList˜²to“a•¸ãv“oid–g@a˜clash“when˜binding“aŽ¡‘ã v‘ÿqÇariable–UUof‘rÅTerm².‘qÇPrecisely“a“n•¸ãum“bšGer–UUÅN“¸“ÅFrom“²will“not“b˜e“used“to“bind“a“v‘ÿqÇariable“of‘rÅTerm“²if:Ž¡‘# Ä{ŽŽŽ‘'ã ²there–¹Jis›¹Ia“sub-term“of‘€fÅList“²of“the˜form“Å'$VAR'(N)‘¹0²or˜Å'$VARNAME'(Name)“²where“ÅName˜²is“theŽ¡‘'ã constanš¸ãt–UUthat“w˜ould“bGe“output“b˜y‘xâÅwrite‘¡E‰ff&fŽ‘Ç«term/3“²seeing“a“term“of“the“Å'$VAR'(N)².ŽŸ‘# Ä{ŽŽŽ‘'ã ²an–±±elemenš¸ãt“of‘xÎÅList“²is“of“the“form“ÅName–?ý=“Var–±±²where“ÅName“²is“an“atom“that“w˜ould“bGe“outputŽ¡‘'ã b¸ãy‘‹>Åwrite‘¡E‰ff&fŽ‘Ç«term/3–g±²on“seeing›g°a“term“of“the“from“Å'$VAR'(N)².“This“case˜allo¸ãws“for“lists“returnedŽ¡‘'ã b¸ãy‘ÕÅread‘¡E‰ff&fŽ›Ç«term/3–óH²(with“Åvariable‘¡E‰ff&fŽ˜names(List)“²or“Åsingletons(List)“²options)“(section“7.14.1,Ž¡‘'ã page–UU92)“and“b¸ãy‘xâÅname‘¡E‰ff&fŽ–Ç«query‘¡E‰ff&fŽ“vars/2–UU²(section“7.5.2,“page“55).ަ‘øãÅnumbervars(Term,–?ýFrom,“Next)–ºZ²is‘ºYequiv‘ÿqÇalen¸ãt“to“Åbind‘¡E‰ff&fŽ‘Ç«variables(Term,–?ý[from(From),“next(Next)]²,Ž¡‘øãi.e.‘qÇeac¸ãh–UUv‘ÿqÇariable“of‘rÅTerm“²is“bGound“to“Å'$VAR'(N)“²where“ÅFrom‘?ý¸“ÅN“µ<“ÅNext².ޤ‘øãÅnumbervars(Term)–UU²is“equiv‘ÿqÇalen¸ãt“to“Ånumbervars(Term,‘?ý0,‘áB‰ff&fŽ‘ ¨)².Ž¡‘øãÄErrorsŽŽŸŽŒ‹9á Ú‹– ý"EŸüfd‘øã²7.6‘ ArithmeticŽŽŽ’¶!57ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý•o‘øãŸÀ›‰ffÇ>|¤fdŸ™œ„ffŸðfd‘ÅOptions–U0²is“a›U/partial“list“or“a“list˜with“an“elemen¸ãtŽŸ ‘ÅE–UU²whic¸ãh“is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Options–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýOptions)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅOptions“²list“is“neither“aŽŸ ‘v›ÿqÇariable–UUnor“a“v˜ariable“binding“optionŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(var‘¡E‰ff&fŽ“binding‘¡E‰ff&fŽ“option,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘From–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘From–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýFrom)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Next–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýNext)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘List–UU²is“a“partial“listŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘List–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýList)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸO>’‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.5.4Ž‘‰Återm‘¡E‰ff&fŽ‘Ç«ref/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Återm‘¡E‰ff&fŽ‘Ç«ref(+term,‘?ý?integer)ŽŸ ‘ã term‘¡E‰ff&fŽ‘Ç«ref(?term,‘?ý+integer)Ž¡‘øãÄDescriptionަ‘øãÅterm‘¡E‰ff&fŽ‘Ç«ref(Term,‘?ýRef)–Ѻ²succeeds›Ñ»if“the“in¸ãternal˜reference“of‘˜×ÅTerm˜²is“ÅRef².‘EéThis˜predicate“can“bGe˜used“eitherޤ ‘øãto–…õobtain›…öthe“in¸ãternal“reference“of˜a“term“or“to˜obtain“the“term“assoGciated˜with“a“giv¸ãen“reference.‘¨NoteŽ¡‘øãthat›÷Ot•¸ãw“o‘÷Piden“tical˜terms‘÷Pcan˜ha“v“e‘÷Pdi eren“t˜in“ternal‘÷Preferences.‘W¶A‘÷&go•Go“d˜w•¸ãa“y–÷Pto˜use“this˜predicate“is˜toŽ¡‘øã rst–UUrecord“the“inš¸ãternal“reference“of“a“giv˜en“term“and“to“later“re-obtain“the“term“via“this“reference.ަ‘øãÄErrorsŽŸ"LÌ‘øãŸëš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅTerm–UU²and“ÅRef“²are“bGoth“v‘ÿqÇariablesŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Ref–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýRef)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Ref–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýRef)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ$>“‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ'þ6‘øãÇ7.6Ž‘£ArithmeticޤuT‘øãÄ7.6.1Ž‘‰Ev‘ÿ\raluation–ÕTof“an“arithmetic“expressionŽ¡‘øã²An–NÖarithmetic›N×expression“is“a˜Prolog“term“built˜from“n•¸ãum“bGers,‘7v‘ÿqÇariables,‘6and–NÖfunctors˜(or“opGerators)ޤ ‘øãthat–rrepresen¸ãt›sarithmetic“functions.‘|When“an˜expression“is“ev‘ÿqÇaluated“eac¸ãh˜v‘ÿqÇariable“m¸ãust“b•Ge˜b“ound‘rtoŽ¡‘øãa–¬!non-v›ÿqÇariable“expression.‘v,An“expression“ev˜aluates“to‘¬"a“n•¸ãum“bGer,‘ÁÔwhic“h›¬!ma“y˜bGe˜an˜in“teger‘¬"or˜a˜ oatingŽ¡‘øãpšGoin•¸ãt‘MYn“um“b˜er.‘YÕThe›MYfollo“wing˜table‘MZdetails˜the˜compGonen“ts–MZof˜an“arithmetic˜expression,‘‹Zho¸ãw“they˜areŽ¡‘øãev‘ÿqÇaluated,–UUthe“t¸ãypšGes“exp˜ected/returned“and“if“they“are“ISO“or“an“extension:ŽŽŸŽŒ‹:ñˆ Ú‹– ý"EŸüfd‘øã²58ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» þ];Ö‘øã þøLÕ‰ffÅ¿…¤fd¤™œ„ ff‘ŸüfdExpression‘QÖ*¡„ ffŽ’ÛáResult–UU=“Èeval‘‰²(Expression)ŽŽ’fh¼Ÿ™œ„ ffŽ’r"Signature‘ ¿ÿŸ™œ„ ffŽ’®gUISO‘Ÿ™œ„ ffŽŽ©‰ffÅ¿…Ÿff‰ffÅ¿…¡¤™œ„ff‘ŸðfdV‘ÿ*ªariable‘\ë¡„ffŽ’Ûám¸ãust–UUbšGe“b˜ound“to“a“non-v‘ÿqÇariable“expression“ÅE².ŽŸ ’ÛáThe–UUresult“is“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ffŽ’tï#IF–UU¸!“²IF‘ Ÿ™œ„ffŽ’³ :Y‘ ¸äŸ™œ„ffŽŽŸ‰ffÅ¿…¡¤™œ„ ff‘Ÿüfdin•¸ãteger‘UUn“um“bGer‘>äb¡„ ffŽ’Ûáthis‘UUn•¸ãum“bGerŽŽ’fh¼Ÿ™œ„ ffŽ’{vAI–UU¸!“²I‘§Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘Ÿüfd oating–UUpGoinš¸ãt“n˜um˜bGer‘!ÀÌ¡„ ffŽ’Ûáthis‘UUn•¸ãum“bGerŽŽ’fh¼Ÿ™œ„ ffŽ’x‹•F–UU¸!“²F‘¼sŸ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅ+‘?ýE‘qO¡„ ffŽ’ÛáÈeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’tï#IF–UU¸!“²IF‘ Ÿ™œ„ ffŽ’³ :N‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅ-‘?ýE‘qO¡„ ffŽ’Ûá²-‘UUÈeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’tï#IF–UU¸!“²IF‘ Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅinc(E)‘a&¡„ ffŽ’ÛáÈeval‘‰²(ÅE²)–UU+“1ŽŽ’fh¼Ÿ™œ„ ffŽ’tï#IF–UU¸!“²IF‘ Ÿ™œ„ ffŽ’³ :N‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅdec(E)‘a&¡„ ffŽ’ÛáÈeval‘‰²(ÅE²)–UU-“1ŽŽ’fh¼Ÿ™œ„ ffŽ’tï#IF–UU¸!“²IF‘ Ÿ™œ„ ffŽ’³ :N‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ý+“E2‘\O)¡„ ffŽ’ÛáÈeval›‰²(ÅE1²)–UU+“Èeval˜²(ÅE2²)ŽŽ’fh¼Ÿ™œ„ ffŽ’lÏ"IF,–UUIF“¸!“²IF‘Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ý-“E2‘\O)¡„ ffŽ’ÛáÈeval›‰²(ÅE1²)–UU-“Èeval˜²(ÅE2²)ŽŽ’fh¼Ÿ™œ„ ffŽ’lÏ"IF,–UUIF“¸!“²IF‘Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ý*“E2‘\O)¡„ ffŽ’ÛáÈeval›‰²(ÅE1²)–UU*“Èeval˜²(ÅE2²)ŽŽ’fh¼Ÿ™œ„ ffŽ’lÏ"IF,–UUIF“¸!“²IF‘Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ý/“E2‘\O)¡„ ffŽ’ÛáÈeval›‰²(ÅE1²)–UU/“Èeval˜²(ÅE2²)ŽŽ’fh¼Ÿ™œ„ ffŽ’n[IF,–UUIF“¸!“²F‘Î9Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ý//“E2‘W,¡„ ffŽ’ÛáÈrnd–‰²(Èeval“²(ÅE1²)–UU/“Èeval‘‰²(ÅE2²))ŽŽ’fh¼Ÿ™œ„ ffŽ’v™ÏI,–UUI“¸!“²I‘Ê­Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ýrem“E2‘QÏ/¡„ ffŽ’ÛáÈeval›‰²(ÅE1²)–UU-“(Èrnd˜²(Èeval˜²(ÅE1²)“/“Èeval˜²(ÅE2²))*Èeval˜²(ÅE2²))ŽŽ’fh¼Ÿ™œ„ ffŽ’v™ÏI,–UUI“¸!“²I‘Ê­Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ýmod“E2‘QÏ/¡„ ffŽ’ÛáÈeval›‰²(ÅE1²)–UU-“(“¸bÈeval˜²(ÅE1²)“/“Èeval˜²(ÅE2²)¸c“²*Èeval˜²(ÅE2²))ŽŽ’fh¼Ÿ™œ„ ffŽ’v™ÏI,–UUI“¸!“²I‘Ê­Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ý/\“E2‘W,¡„ ffŽ’ÛáÈeval›‰²(ÅE1²)–UUbit¸ãwise‘™˜‰ffŽ‘™šand“Èeval˜²(ÅE2²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v™ÏI,–UUI“¸!“²I‘Ê­Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ý\/“E2‘W,¡„ ffŽ’ÛáÈeval›‰²(ÅE1²)–UUbit¸ãwise‘™˜‰ffŽ‘™šor“Èeval˜²(ÅE2²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v™ÏI,–UUI“¸!“²I‘Ê­Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ý^“E2‘\O)¡„ ffŽ’ÛáÈeval›‰²(ÅE1²)–UUbit¸ãwise‘™˜‰ffŽ‘™šxor“Èeval˜²(ÅE2²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v™ÏI,–UUI“¸!“²I‘Ê­Ÿ™œ„ ffŽ’³ :N‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅ\‘?ýE‘qO¡„ ffŽ’Ûá²bit¸ãwise‘™˜‰ffŽ‘™šnot‘UUÈeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’{vAI–UU¸!“²I‘§Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ý<<“E2‘W,¡„ ffŽ’ÛáÈeval‘‰²(ÅE1²)›UUin¸ãteger‘™˜‰ffŽ–™šshift‘™˜‰ffŽ“left˜Èeval‘‰²(ÅE2²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v™ÏI,–UUI“¸!“²I‘Ê­Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ý>>“E2‘W,¡„ ffŽ’ÛáÈeval‘‰²(ÅE1²)‘UUinš¸ãteger‘™˜‰ffŽ–™šshift‘™˜‰ffŽ“righ˜t‘UUÈeval‘‰²(ÅE2²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v™ÏI,–UUI“¸!“²I‘Ê­Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅabs(E)‘a&¡„ ffŽ’Ûá²absolute–UUv‘ÿqÇalue“of“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’tï#IF–UU¸!“²IF‘ Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅsign(E)‘\O)¡„ ffŽ’Ûá²sign–UUof“Èeval‘‰²(ÅE²)“(-1“if“µ<“²0,“0“if“=“0,“+1“if“µ>“²0)ŽŽ’fh¼Ÿ™œ„ ffŽ’tï#IF–UU¸!“²IF‘ Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅmin(E1,E2)‘L2¡„ ffŽ’Ûá²minimal–UUv‘ÿqÇalue“bGet•¸ãw“een–UUÈeval›‰²(ÅE1²)“and“Èeval˜²(ÅE2²)ŽŽ’fh¼Ÿ™œ„ ffŽ’o„xIF,–UUIF“¸!“²?‘µVŸ™œ„ ffŽ’³ :N‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅmax(E1,E2)‘L2¡„ ffŽ’Ûá²maximal–UUv‘ÿqÇalue“bGet•¸ãw“een–UUÈeval›‰²(ÅE1²)“and“Èeval˜²(ÅE2²)ŽŽ’fh¼Ÿ™œ„ ffŽ’o„xIF,–UUIF“¸!“²?‘µVŸ™œ„ ffŽ’³ :N‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅE1–?ý**“E2‘W,¡„ ffŽ’ÛáÈeval›‰²(ÅE1²)–UUraised“to“the“pGo•¸ãw“er–UUof“Èeval˜²(ÅE2²)ŽŽ’fh¼Ÿ™œ„ ffŽ’n[IF,–UUIF“¸!“²F‘Î9Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅsqrt(E)‘\O)¡„ ffŽ’Ûá²square–UUroGot“of“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v½\IF–UU¸!“²F‘î:Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅatan(E)‘\O)¡„ ffŽ’Ûá²arc–UUtangen¸ãt“of“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v½\IF–UU¸!“²F‘î:Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅcos(E)‘a&¡„ ffŽ’Ûá²cosine–UUof“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v½\IF–UU¸!“²F‘î:Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅacos(E)‘\O)¡„ ffŽ’Ûá²arc–UUcosine“of“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v½\IF–UU¸!“²F‘î:Ÿ™œ„ ffŽ’³ :N‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅsin(E)‘a&¡„ ffŽ’Ûá²sine–UUof“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v½\IF–UU¸!“²F‘î:Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅasin(E)‘\O)¡„ ffŽ’Ûá²arc–UUsine“of“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v½\IF–UU¸!“²F‘î:Ÿ™œ„ ffŽ’³ :N‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅexp(E)‘a&¡„ ffŽ’Ûáµe–UU²raised“to“the“pGo•¸ãw“er–UUof“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v½\IF–UU¸!“²F‘î:Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅlog(E)‘a&¡„ ffŽ’Ûá²natural–UUlogarithms“of“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v½\IF–UU¸!“²F‘î:Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅfloat(E)‘W,¡„ ffŽ’Ûá²the–UU oating“pGoinš¸ãt“n˜um˜bGer“equal“to“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’v½\IF–UU¸!“²F‘î:Ÿ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅceiling(E)‘L2¡„ ffŽ’Ûá²rounds–UUÈeval‘‰²(ÅE²)“up•¸ãw“ard–UUto“the“nearest“in¸ãtegerŽŽ’fh¼Ÿ™œ„ ffŽ’zëF–UU¸!“²I‘1ÉŸ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅfloor(E)‘W,¡„ ffŽ’Ûá²rounds–UUÈeval‘‰²(ÅE²)“do•¸ãwn“w“ard–UUto“the“nearest“in¸ãtegerŽŽ’fh¼Ÿ™œ„ ffŽ’zëF–UU¸!“²I‘1ÉŸ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅround(E)‘W,¡„ ffŽ’Ûá²rounds–UUÈeval‘‰²(ÅE²)“to“the“nearest“in¸ãtegerŽŽ’fh¼Ÿ™œ„ ffŽ’zëF–UU¸!“²I‘1ÉŸ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅtruncate(E)‘GO5¡„ ffŽ’Ûá²the–UUin¸ãteger“v‘ÿqÇalue“of“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’zëF–UU¸!“²I‘1ÉŸ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅfloat‘¡E‰ff&fŽ–Ç«fractional‘¡E‰ff&fŽ“part(E)‘¡„ ffŽ’Ûá²the–UU oat“equal“to“the“fractional“part“of“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’x‹•F–UU¸!“²F‘¼sŸ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…¡¤™œ„ ff‘ŸüfdÅfloat‘¡E‰ff&fŽ–Ç«integer‘¡E‰ff&fŽ“part(E)‘¿÷¡„ ffŽ’Ûá²the–UU oat“equal“to“the“in¸ãteger“part“of“Èeval‘‰²(ÅE²)ŽŽ’fh¼Ÿ™œ„ ffŽ’x‹•F–UU¸!“²F‘¼sŸ™œ„ ffŽ’³ :Y‘ ¸äŸ™œ„ ffŽŽ¦‰ffÅ¿…ŽŽŽ  X‘øãThe–UUmeaning“of“the“signature“ eld“is“as“follo¸ãws:ޤ‘ã¸ŽŽŽ‘ã ²I–UU¸!“²I:“unary“function,“the“opšGerand“m¸ãust“b˜e“an“inš¸ãteger“and“the“result“is“an“in˜teger.Ž¡‘ã¸ŽŽŽ‘ã ²F‘¶+¸!–¶D²F:›¶Cunary“function,‘΀the˜opšGerand“m¸ãust“b˜e“a“ oating‘¶Cp˜oinš¸ãt“n˜um˜bGer“and“the“result‘¶Cis“a“ oatingŽ© ‘ã pšGoin•¸ãt‘UUn“um“b˜er.Ž¡‘ã¸ŽŽŽ‘ã ²F–UU¸!“²I:“unary“function,“the“opšGerand“m¸ãust“b˜e“a“ oating“p˜oinš¸ãt“n˜um˜bGer“and“the“result“is“an“in˜teger.Ž¡‘ã¸ŽŽŽ‘ã ²IF‘›²¸!–›Å²F:››Äunary“function,‘­`the“opGerand˜can“bGe˜an“in¸ãteger˜or“a˜ oating“pGoin•¸ãt˜n“um“bGer–›Åand˜the“resultަ‘ã is–UUa“ oating“pGoinš¸ãt“n˜um˜bGer.Ž¡‘ã¸ŽŽŽ‘ã ²IF‘i¸!–i²IF:›iunary“function,‘nthe“opGerand“can˜bGe“an“in¸ãteger“or˜a“ oating“pGoinš¸ãt“n˜um˜bGer‘iand“the“resultަ‘ã has–UUthe“same“t¸ãypšGe“as“the“op˜erand.ŽŽŸŽŒ‹;ï Ú‹– ý"EŸüfd‘øã²7.6‘ ArithmeticŽŽŽ’¶!59ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã¸ŽŽŽ‘ã ²I,–UUI“¸!“²I:“binary“function:‘qÇeacš¸ãh“opGerand“m˜ust“bGe“an“in˜teger“and“the“result“is“an“in˜teger.Ž©‘ã¸ŽŽŽ‘ã ²IF,–IF‘€Í¸!“²IF:“binary“function:‘ÉReac¸ãh“opšGerand“can“b˜e›an“in¸ãteger“or“a“ oating˜pGoinš¸ãt“n˜um˜bGer“andޤ ‘ã the–~Šresult›~‹is“a“ oating˜pGoinš¸ãt“n˜um˜bšGer“if‘~‹at“least“one“op˜erand›~‹is“a“ oating˜pGoinš¸ãt“n˜um˜bGer,‘ˆØan“in˜tegerŽ¡‘ã otherwise.ަ‘ã¸ŽŽŽ‘ã ²IF,–½ÉIF‘½®¸!›½È²?:‘B¯binary“function:‘B®eac¸ãh“opGerand“can˜bGe“an“in¸ãteger“or˜a“ oating“pGoinš¸ãt“n˜um˜bGer‘½Èand“theŽ¡‘ã result–rShas›rTthe“same“t¸ãypGe˜as“the“selected“opGerand.‘ÈÂThis˜is“used“for˜Åmin“²and“Åmax².‘ÈÂNote“that˜in“caseŽ¡‘ã of–UUequalitš¸ãy“bGet˜w˜een“an“in˜teger“and“a“ oating“pGoin˜t“n˜um˜bGer“the“result“is“an“in˜teger.ަ‘øãÅis²,–ÞÉÅ+²,›ÞÈÅ-²,“Å*²,“Å//²,“Å/²,˜Årem²,“and–ÃKÅmod›ÃL²are“prede ned“in x“opGerators.‘»ªÅ+˜²and“Å-“²are“prede ned˜pre x“opGeratorsŽ¡‘øã(section–UU7.14.10,“page“100).ŽŸ‘øãÄIn®9teger–¢division‘¢rounding“function²:‘ì2the–J,in¸ãteger“division“rounding“function“Érnd‘¼rÅ(X)‘Iè²rounds“the“ oatingŽ¡‘øãpšGoin•¸ãt‘èn“um“b˜er–èÅX‘ݲto“an“inš¸ãteger.‘ñ€There‘éare“t˜w˜o“pšGossible“de nitions“(dep˜ending“on“the“target“mac¸ãhine)“forŽ¡‘øãthis–UUfunction“whicš¸ãh“di er“on“negativ˜e“n˜um˜bGers:ަ‘ã¸ŽŽŽ‘ã Érnd›¼rÅ(X)–UU²=“in¸ãteger“part“of‘rÅX²,“e.g.‘qÇÉrnd˜Å(-1.5)“²=“Å-1“²(round“to•¸ãw“ard‘UU0)ަ‘ã¸ŽŽŽ‘ã Érnd›¼rÅ(X)–UU²=“¸bÅX¸c²,“e.g.‘qÇÉrnd˜Å(-1.5)“²=“Å-2“²(round“to•¸ãw“ard‘UU¸1²)ަ‘øãThe–!¬de nition›!­of“this˜function“determines˜the“precise˜de nition˜of“the“in¸ãteger˜division“Å(//)/2˜²and“of˜theŽ¡‘øãinš¸ãteger–®Úremainder“Å(rem)/2².‘~WRounding“to˜w˜ard“zero‘®Ûis“the“most“common“case.‘~WIn“an˜y“case‘®Ûit“is“pGossibleŽ¡‘øãto–ñtest“the“v‘ÿqÇalue“(Åtoward‘¡E‰ff&fŽ›Ç«zero“²or“Ådown²)“of“the“Åinteger‘¡E‰ff&fŽ˜rounding‘¡E‰ff&fŽ˜function“²Prolog“ ag“to“determineŽ¡‘øãwhic¸ãh–UUfunction“bGeing“used“(section“7.22.1,“page“133).Ž©‘øãÄF‘ÿ «ast–Gmathematical“moQÇde²:‘ßBin–Œorder“to“spGeed-up‘Œin¸ãteger“computations,‘™Áthe“GNU‘ŒProlog“compiler“canŽ¡‘øãgenerate–¬£faster“coGde›¬¢when“in•¸ãv“ok“ed–¬£with“the“Å--fast-math˜²option“(section“3.4.3,‘Âvpage“22).‘w°In“this“moGdeŽ¡‘øãonly–Ginš¸ãteger“opGerations“are“allo˜w˜ed‘Gand“a“v‘ÿqÇariable“in“an“expression“m˜ust“b•Ge‘Gb“ound–Gat“ev‘ÿqÇaluation“time“toŽ¡‘øãan–UUinš¸ãteger.‘qÇNo“t˜ypGe“c˜hec˜king“is“done.ަ‘øãÄErrorsŽŸ@³2‘øãŸÌ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘²a–UUsub-expression“ÅE“²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²a–UUsub-expression“ÅE“²is“neither“a“n•¸ãum“bGer–UUnor“anŽŸ ‘ev‘ÿqÇaluable‘UUfunctorŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(evaluable,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²a–UUsub-expression“ÅE“²is“a“ oating“pGoinš¸ãt“n˜um˜bGerŽŸ ‘while–UUan“in¸ãteger“is“expGectedŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²a–UUsub-expression“ÅE“²is“an“in¸ãteger“while“a“ oatingŽŸ ‘pšGoin•¸ãt‘UUn“um“b˜er–UUis“exp˜ectedŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(float,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘²a–UUdivision“b¸ãy“zero“oGccursŽŽ’㥄 ffŽ’éÒqÅevaluation‘¡E‰ff&fŽ–Ç«error(zero‘¡E‰ff&fŽ“divisor)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽŸB¤ù‘øãÄP•®9ortabilit“yަ‘øã²Refer–(to›'the“abGo•¸ãv“e˜table–(to˜determine“whic¸ãh˜ev‘ÿqÇaluable“functors˜are“ISO‘Öand“whic¸ãh˜are“GNU‘ÖPrologŽ¡‘øãextensions.‘]KF‘ÿ*ªor–£Öeciency“reasons,‘÷vGNU›£€Prolog“doGes“not“detect‘£×the“follo¸ãwing“ISO˜arithmetic“errors:Ž¡‘øãÅfloat‘¡E‰ff&fŽ–Ç«overflow²,›UUÅint‘¡E‰ff&fŽ“overflow,‘?ýint‘¡E‰ff&fŽ“underflow²,˜and˜Åundefined².ŽŸ%þ6‘øãÄ7.6.2Ž‘‰Å(is)/2–ÕTÄ-“ev‘ÿ\raluate“expressionŽŸuT‘øãT‘ÿ «emplatesޤ‘ã Åis(?term,‘?ý+evaluable)Ž¡‘øãÄDescriptionަ‘øãÅResult–?ýis“Expression›OU²succeeds–OTif‘rÅResult“²can˜bGe˜uni ed“with˜Èeval‘‰²(ÅExpression²).‘rRefer˜to“the˜ev‘ÿqÇaluationŽŸ ‘øãof–UUan“arithmetic“expression“for“the“de nition“of“the“Èeval‘]Þ²function“(section“7.6.1,“page“57).ŽŽŸŽŒ‹<%ß Ú‹– ý"EŸüfd‘øã²60ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅis–UU²is“a“prede ned“in x“opGerator“(section“7.14.10,“page“100).ޤ‘øãÄErrorsŽ¡‘øã²Refer–UUto“the“ev‘ÿqÇaluation“of“an“arithmetic“expression“for“pGossible“errors“(section“7.6.1,“page“57).Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicate.ŽŸ%ç‘øãÄ7.6.3Ž‘‰Å(=:=)/2–ÕTÄ-“arithmetic“equal,“Å(=\=)/2“Ä-“arithmetic“not“equal,ޤ ‘‰Å(<)/2–ÕTÄ-“arithmetic“less“than,“Å(=<)/2“Ä-“arithmetic“less“than“or“equal“to,Ž¡‘‰Å(>)/2–ÕTÄ-“arithmetic“greater“than,“Å(>=)/2“Ä-“arithmetic“greater“than“or“equal“toŽ©uT‘øãT‘ÿ «emplatesŽŸ/¯…Ÿè‘ã Å=:=(+evaluable,‘?ý+evaluable)Ž¡‘ã =\=(+evaluable,‘?ý+evaluable)Ž¡‘ã <(+evaluable,‘?ý+evaluable)ŽŽŸè’ú‚G=<(+evaluable,‘?ý+evaluable)Ž¡’ú‚G>(+evaluable,‘?ý+evaluable)Ž¡’ú‚G>=(+evaluable,‘?ý+evaluable)ŽŽŽ¤‘øãÄDescriptionŽ¡‘øãÅExpr1–?ý=:=“Expr2–UU²succeeds“if“Èeval›‰²(ÅExpr1²)“=“Èeval˜²(ÅExpr2²).Ž¡‘øãÅExpr1–?ý=\=“Expr2–UU²succeeds“if“Èeval›‰²(ÅExpr1²)“¸6²=“Èeval˜²(ÅExpr2²).Ž¡‘øãÅExpr1–?ý<“Expr2–UU²succeeds“if“Èeval›‰²(ÅExpr1²)“µ<“Èeval˜²(ÅExpr2²).Ž¡‘øãÅExpr1–?ý=<“Expr2–UU²succeeds“if“Èeval›‰²(ÅExpr1²)“¸“Èeval˜²(ÅExpr2²).Ž¡‘øãÅExpr1–?ý>“Expr2–UU²succeeds“if“Èeval›‰²(ÅExpr1²)“µ>“Èeval˜²(ÅExpr2²).Ž¡‘øãÅExpr1–?ý>=“Expr2–UU²succeeds“if“Èeval›‰²(ÅExpr1²)“¸“Èeval˜²(ÅExpr2²).Ž¡‘øãRefer–~to“the“ev‘ÿqÇaluation“of“an“arithmetic“expression‘for“the“de nition“of“the“Èeval‘вfunction“(section“7.6.1,ŽŸ ‘øãpage‘UU57).Ž¡‘øãÅ=:=²,–UUÅ=\=²,“Å<²,“Å=<²,“Å>“²and“Å>=“²are“prede ned“in x“opGerators“(section“7.14.10,“page“100).Ž¡‘øãÄErrorsŽ¡‘øã²Refer–UUto“the“ev‘ÿqÇaluation“of“an“arithmetic“expression“for“pGossible“errors“(section“7.6.1,“page“57).Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicates.ŽŸ'ç‘øãÇ7.7Ž‘£Dynamic–€clause“managemen tަ‘øãÄ7.7.1Ž‘‰In®9troQÇductionަ‘øãStatic–úxand“dynamic“proQÇcedures²:‘²^a–u¡proGcedure“is›u either“dynamic“or“static.‘ÒªAll“built-in˜predicates“areŽŸ ‘øãstatic.‘Ø(A‘wmuser-de ned–wuproGcedure›wvis“static˜b¸ãy“default“unless˜a“Ådynamic/1˜²directiv¸ãe“precedes˜its“de nitionŽŽŸŽŒ‹=7Ï Ú‹– ý"EŸüfd‘øã²7.7‘ Dynamic–UUclause“managemen¸ãtŽŽŽ’¶!61ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øã(section–['6.1.2,‘\œpage“41).‘ƒ>Adding›[(a“clause“to“a˜non-existen¸ãt“proGcedure“creates˜a“dynamic“proGcedure.‘ƒ>Theޤ ‘øãclauses–vÁof›vÂa“dynamic˜proGcedure“can˜bGe“altered˜(e.g.‘Ö using‘šOÅasserta/1²),‘the“clauses˜of“a˜static“proGcedureŽ¡‘øãcannot–UUbGe“altered.Ž©‘øãÄPriv‘ÿ\rate–#>and‘#?public“proQÇcedures²:‘ùHeac¸ãh–™proGcedure›™is“either“public˜or“priv‘ÿqÇate.‘= A‘™dynamic˜proGcedure“isŽ¡‘øãalw•¸ãa“ys›ê‹public.‘N/Eac“h˜built-in˜predicate˜is˜priv–ÿqÇate,‘ÿçand˜a˜static˜user-de ned‘êŒproGcedure˜is˜priv“ate˜b¸ãy˜defaultŽ¡‘øãunless–j­a“Åpublic/1›j®²directiv¸ãe“precedes“its“de nition“(section˜6.1.3,‘°page“41).‘±ÏIf˜a“dynamic“declarationŽ¡‘øãexists–ÚÝit“is“unnecessary“to“add“a‘ÚÞpublic“declaration“since“a“dynamic“proGcedure“is“also“public.‘_A‘Ú»clauseŽ¡‘øãof–]a›]public“proGcedure“can˜bšGe“insp˜ected“(e.g.‘ˆÍusing‘€ŽÅclause/2²),‘^ía“clause“of‘]a“priv‘ÿqÇate“pro˜cedure‘]cannot“b˜eŽ¡‘øãinspGected.ަ‘øãÄA‘-¥logical–-¼database“upQÇdate“view(ä²:‘ ‡an•¸ãy›¢5c“hange˜in˜the˜database˜that˜oGccurs˜as˜the˜result˜of˜executingŽ¡‘øãa–Î$goal“(e.g.‘Ü3when“a›Î#sub-goal“is“a“call“of‘•@Åassertz/1“²or“Åretract/1²)“only˜a ects“subsequen¸ãt“activ‘ÿqÇations.Ž¡‘øãThe–k\cš¸ãhange“doGes‘k]not“a ect“an˜y“activ‘ÿqÇation‘k]that“is“curren˜tly“bGeing“executed.‘³ÝTh˜us“the‘k]database“is“frozenŽ¡‘øãduring–0Athe›0@execution“of˜a“goal,‘7«and“the“list˜of“clauses˜de ning“a“predication˜is“ xed“at˜the“momen¸ãt˜of“itsŽ¡‘øãexecution.ŽŸ%þ6‘øãÄ7.7.2Ž‘‰Åasserta/1Ä,‘ÕTÅassertz/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åasserta(+clause)Ž¡‘ã assertz(+clause)ަ‘øãÄDescriptionŽ©‘øãÅasserta(Clause)›1±² rst‘1°con•¸ãv“erts˜the–1°term˜ÅClause“²to˜a“clause˜and“then˜adds“it˜to“the˜currenš¸ãt“in˜ternalŽ¡‘øãdatabase.‘TäThe–þ«predicate›þ¬concerned“m¸ãust“bGe˜dynamic“(section“7.7.1,‘page“60)˜or“unde ned“and˜the“clauseŽ¡‘øãis–ÅVinserted“bGefore“the›ÅW rst“clause“of“the“predicate.‘AÈIf“the“predicated“is“unde ned“it“is˜created“as“a“dynamicŽ¡‘øãproGcedure.ަ‘øãÅassertz(Clause)–x²acts“lik¸ãe›yÅasserta/1“²except“that“the“clause˜is“added“at“the“end“of˜all“existing“clausesŽ¡‘øãof–UUthe“concerned“predicate.ަ‘øãÄCon•®9v“erting–ÕTa“term“ÅClause“Äto“a“clause“ÅClause1Ä:Ž©‘ã¸ŽŽŽ‘ã ²extract–Ö¡the›Ö¢head“and“the˜b•Go“dy–Ö¡of‘¾ÅClause²:‘2meither˜ÅClause“²=“Å(Head–?ý:-“Body)˜²or–Ö¡ÅClause“²=˜ÅHead“²andŽ¡‘ã ÅBody–UU²=“Åtrue².ަ‘ã¸ŽŽŽ‘ã ÅHead–UU²mš¸ãust“bGe“a“callable“term“(or“else“the“con˜v˜ersion“fails).ަ‘ã¸ŽŽŽ‘ã ²con•¸ãv“ert–UUÅBody“²to“a“b•Go“dy–UUclause“(i.e.‘qÇa“goal)“ÅBody1².ަ‘ã¸ŽŽŽ‘ã ²the›UUcon•¸ãv“erted˜clause˜ÅClause1˜²=˜Å(Head–?ý:-“Body1)².ަ‘øãÄCon•®9v“erting–ÕTa“term“ÅT“Äto“a“goal:ަ‘ã¸ŽŽŽ‘ã ²if‘rÅT–UU²is“a“v‘ÿqÇariable“it“is“replaced“b¸ãy“the“term“Åcall(T)².ަ‘ã¸ŽŽŽ‘ã ²if‘oÅT‘Q²is–QRa›QScon¸ãtrol“construct˜Å(',')/2²,‘QÅ(;)/2˜²or“Å(->)/2“²eac•¸ãh˜argumen“t–QRof˜the“con¸ãtrol˜construct“isŽ¡‘ã recursiv•¸ãely›UUcon“v“erted˜to˜a˜goal.ަ‘ã¸ŽŽŽ‘ã ²if‘rÅT–UU²is“a“callable“term“it“remains“unc¸ãhanged.ަ‘ã¸ŽŽŽ‘ã ²otherwise–UUthe“con•¸ãv“ersion–UUfails“(ÅT“²is“neither“a“v‘ÿqÇariable“nor“a“callable“term).ަ‘øãÄErrorsŽŽŸŽŒ‹>@Ÿ Ú‹– ý"EŸüfd‘øã²62ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýv¢D‘øãŸÞæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅHead–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Head–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýHead)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Body–UU²cannot“bGe“con•¸ãv“erted–UUto“a“goalŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýBody)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²The–RÍpredicate“indicator“ÅPred“²of‘êÅHead“²is“that“of“aŽŸ ‘static‘UUproGcedureŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(modify,ŽŸ ’éÒqstatic‘¡E‰ff&fŽ‘Ç«procedure,‘?ýPred)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ0qÆ‘øãÄP•®9ortabilit“yŽ©‘øã²ISO‘UUpredicates.ŽŸ%þ6‘øãÄ7.7.3Ž‘‰Åretract/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åretract(+clause)Ž¡‘øãÄDescriptionަ‘øãÅretract(Clause)–v"²erases›v#the“ rst“clause˜of“the“database˜that“uni es“with“ÅClause².‘Ô/The˜concerned“pred-ޤ ‘øãicate–áƒm¸ãust“bšGe“a“dynamic“pro˜cedure›á„(section“7.7.1,‘Žpage“60).‘QRemo¸ãving˜all“clauses“of“a“prošGcedure“do˜esŽ¡‘øãnot–-erase›-the“proGcedure“de nition.‘d]T‘ÿ*ªo“ac•¸ãhiev“e˜this–-use“Åabolish/1“²(section˜7.7.6,‘5$page“63).‘d]Åretract/1“²isŽ¡‘øãre-executable–UUon“bac•¸ãktrac“king.ަ‘øãÄErrorsŽŸ(LÌ‘øãŸåš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅHead–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Head–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýHead)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²The–RÍpredicate“indicator“ÅPred“²of‘êÅHead“²is“that“of“aŽŸ ‘static‘UUproGcedureŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(modify,ŽŸ ’éÒqstatic‘¡E‰ff&fŽ‘Ç«procedure,‘?ýPred)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ*>“‘øãÄP•®9ortabilit“yަ‘øã²ISO‘`¡predicate.‘”xIn–`æthe“ISO‘` reference,‘£Êthe‘`åopšGeration“asso˜ciated“with›`åthe“Åpermission‘¡E‰ff&fŽ‘Ç«error˜²is“ÅaccessŽ¡‘øã²while–­%it“is›­$Åmodify“²in“GNU‘­Prolog.‘y7This“seems˜to“bGe“an“error“of“the˜ISO‘­reference˜since“for“Åasserta/1Ž¡‘øã²(whic¸ãh–UUis“similar“in“spirit“to“Åretract/1²)“the“opGeration“is“also“Åmodify².ŽŸ%þ6‘øãÄ7.7.4Ž‘‰Åretractall/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åretractall(+head)Ž¡‘øãÄDescriptionަ‘øãÅretractall(Head)–u?²erases›u>all“clauses“whose˜head“uni es“with“ÅHead².‘Ñ„The˜concerned“predicate“m¸ãust˜bGe“aޤ ‘øãdynamic–v¿prošGcedure“(section‘vÀ7.7.1,‘page“60).‘ÖThe“pro˜cedure“de nition“is›vÀnot“remo•¸ãv“ed–v¿so“that˜it“is“foundŽ¡‘øãb¸ãy‘ØÑÅcurrent‘¡E‰ff&fŽ‘Ç«predicate/1›µE²(section–µD7.8.1,‘Í@page“64).‘‘–Åabolish/1“²should“bGe˜used“to“remo•¸ãv“e˜the‘µDproGcedureŽ¡‘øã(section–UU7.7.6,“page“63).ަ‘øãÄErrorsŽŸ(LÌ‘øãŸåš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅHead–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Head–UU²is“not“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýHead)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²The–RÍpredicate“indicator“ÅPred“²of‘êÅHead“²is“that“of“aŽŸ ‘static‘UUproGcedureŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(modify,ŽŸ ’éÒqstatic‘¡E‰ff&fŽ‘Ç«procedure,‘?ýPred)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŽŸŽŒ‹?N) Ú‹– ý"EŸüfd‘øã²7.7‘ Dynamic–UUclause“managemen¸ãtŽŽŽ’¶!63ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.7.5Ž‘‰Åclause/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åclause(+head,‘?ý?callable‘¡E‰ff&fŽ‘Ç«term)Ž¡‘øãÄDescriptionަ‘øãÅclause(Head,‘?ýBody)–¹â²succeeds›¹ãif“there“exists˜a“clause“in“the˜database“that“uni es˜with“ÅHead–?ý:-“Body².ޤ ‘øãThe–Üupredicate›Ütin“question˜m¸ãust“bGe˜a“public“proGcedure˜(section“7.7.1,‘ô¡page“60).‘I|Clauses“are˜deliv¸ãered“fromŽ¡‘øãthe–UU rst“to“the“last.‘qÇThis“predicate“is“re-executable“on“bac•¸ãktrac“king.ަ‘øãÄErrorsŽŸ.ÿ‘øãŸÞæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅHead–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Head–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýHead)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²The–RÍpredicate“indicator“ÅPred“²of‘êÅHead“²is“that“of“aŽŸ ‘priv‘ÿqÇate‘UUproGcedureŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(access,ŽŸ ’éÒqprivate‘¡E‰ff&fŽ‘Ç«procedure,‘?ýPred)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Body–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýBody)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ0qÆ‘øãÄP•®9ortabilit“yަ‘øã²ISO‘UUpredicate.ŽŸ%þ6‘øãÄ7.7.6Ž‘‰Åabolish/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åabolish(+predicate‘¡E‰ff&fŽ‘Ç«indicator)Ž¡‘øãÄDescriptionަ‘øãÅabolish(Pred)›Ì´²remo•¸ãv“es–̳from˜the˜database“the˜proGcedure˜whose“predicate˜indicator˜is“ÅPred².‘×ãThe˜con-ŽŸ ‘øãcerned–UUpredicate“m¸ãust“bšGe“a“dynamic“pro˜cedure“(section“7.7.1,“page“60).ަ‘øãÄErrorsŽŽŸŽŒ‹@]# Ú‹– ý"EŸüfd‘øã²64ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý¹o‘øãŸœ›‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPred–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Pred–UU²is“a“term“ÅName/Arity“²and“either“ÅName“²orŽŸ ‘ÅArity–UU²is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Pred–UU²is“neither“a“v‘ÿqÇariable“nor“a“predicateŽŸ ‘indicatorŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(predicate‘¡E‰ff&fŽ“indicator,‘?ýPred)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Pred–UU²is“a“term“ÅName/Arity“²and“ÅArity“²is“neitherŽŸ ‘a–UUv‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýArity)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Pred–O¨²is›O©a“term“ÅName/Arity˜²and“ÅName“²is˜neither“aŽŸ ‘v‘ÿqÇariable–UUnor“an“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýName)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Pred–UU²is“a“term“ÅName/Arity“²and“ÅArity“²is“anŽŸ ‘in¸ãteger–UUµ<“²0ŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýArity)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘Pred–UU²is“a“term“ÅName/Arity“²and“ÅArity“²is“anޤ ‘in¸ãteger–UUµ>“Åmax‘¡E‰ff&fŽ‘Ç«arity“² ag“(section“7.22.1,Ž¡‘page‘UU133)ŽŽ’㥄$ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(max‘¡E‰ff&fŽ“arity)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²The–UUpredicate“indicator“ÅPred“²is“that“of“a“staticŽŸ ‘proGcedureŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(modify,ŽŸ ’éÒqstatic‘¡E‰ff&fŽ‘Ç«procedure,‘?ýPred)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸs>’‘øãÄP•®9ortabilit“yŽ©‘øã²ISO‘UUpredicate.ŽŸ'þ6‘øãÇ7.8Ž‘£Predicate‘€informationޤuT‘øãÄ7.8.1Ž‘‰Åcurrent‘¡E‰ff&fŽ‘Ç«predicate/1Ž¡‘øãÄT‘ÿ «emplatesޤ‘ã Åcurrent‘¡E‰ff&fŽ–Ç«predicate(?predicate‘¡E‰ff&fŽ“indicator)Ž¡‘øãÄDescriptionަ‘øãÅcurrent‘¡E‰ff&fŽ‘Ç«predicate(Pred)–Åòsucceeds›ÅÄif“there“exists˜a“predicate“indicator˜of“a“de ned˜proGcedure“thatޤ ‘øãuni es–Õwith“ÅPred².›§GAll“user“de ned‘ÖproGcedures“are“found,‘@õwhether“static“or“dynamic.˜In¸ãternal“systemŽ¡‘øãprošGcedures–-whose‘,name“b˜egins›,with“Å'$'“²are˜not“found.‘ºNA‘úuser-de ned“proGcedure˜is“found˜ev¸ãen“whenŽ¡‘øãit–4žhas›4Ÿno“clauses.‘£A‘4euser-de ned“proGcedure“is“not˜found“if“it˜has“bšGeen“ab˜olished.‘£T‘ÿ*ªo“conform‘4Ÿto“theŽ¡‘øãISO‘§ireference,‘üZbuilt-in›§Ápredicates–§Àare“not“found“except“if“the“Åstrict‘¡E‰ff&fŽ‘Ç«iso˜²Prolog“ ag“is“switc¸ãhed“o Ž¡‘øã(section–UU7.22.1,“page“133).‘qÇThis“predicate“is“re-executable“on“bac•¸ãktrac“king.ަ‘øãÄErrorsŽŸR³2‘øãŸº³4‰ffÇ>|©fdŸ™œ„ffŸðfd‘ÅPred–UU²is“neither“a“v‘ÿqÇariable“nor“a“predicateŽ¡‘indicatorŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(predicate‘¡E‰ff&fŽ“indicator,‘?ýPred)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘Pred–UU²is“a“term“ÅName/Arity“²and“ÅArity“²is“neitherŽ¡‘a–UUv‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýArity)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘Pred–O¨²is›O©a“term“ÅName/Arity˜²and“ÅName“²is˜neither“aŽ¡‘v‘ÿqÇariable–UUnor“an“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýName)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘Pred–UU²is“a“term“ÅName/Arity“²and“ÅArity“²is“anŽ¡‘in¸ãteger–UUµ<“²0ŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýArity)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„$ffŸäfd‘Pred–UU²is“a“term“ÅName/Arity“²and“ÅArity“²is“anŽ¡‘in¸ãteger–UUµ>“Åmax‘¡E‰ff&fŽ‘Ç«arity“² ag“(section“7.22.1,Ž¡‘page‘UU133)ŽŽ’㥄$ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(max‘¡E‰ff&fŽ“arity)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸT¤ù‘øãÄP•®9ortabilit“yަ‘øã²ISO‘UUpredicate.ŽŽŸŽŒ‹AdÑ Ú‹– ý"EŸüfd‘øã²7.8‘ Predicate‘UUinformationŽŽŽ’¶!65ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.8.2Ž‘‰Åpredicate‘¡E‰ff&fŽ‘Ç«property/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åpredicate‘¡E‰ff&fŽ–Ç«property(?predicate‘¡E‰ff&fŽ“indicator,‘?ý?predicate‘¡E‰ff&fŽ“property)Ž¡‘øãÄDescriptionŽ©‘øãÅpredicate‘¡E‰ff&fŽ‘Ç«property(Pred,‘?ýProperty)–ìq²succeeds›ìrif“there“exists“a˜predicate“indicator“of“a˜de ned“pro-ޤ ‘øãcedure–ÍÄthat“uni es“with“ÅPred“²and“if‘”áÅProperty“²uni es“with“one“of“the“propšGerties“of“the“pro˜cedure.‘ÛAllŽ¡‘øãuser–Çïde ned›ÇîproGcedures“and˜built-in“predicates˜are“found.‘B¥In¸ãternal“system˜proGcedures“whose˜name“bGeginsŽ¡‘øãwith–UUÅ'$'“²are“not“found.‘qÇThis“predicate“is“re-executable“on“bac•¸ãktrac“king.ަ‘øãÄPredicate‘ÕTpropQÇerties²:ޤ‘ã¸ŽŽŽ‘ã Åstatic²:‘qÇif–UUthe“proGcedure“is“static.Ž¡‘ã¸ŽŽŽ‘ã Ådynamic²:‘qÇif–UUthe“proGcedure“is“dynamic.Ž¡‘ã¸ŽŽŽ‘ã Åprivate²:‘qÇif–UUthe“proGcedure“is“priv‘ÿqÇate.Ž¡‘ã¸ŽŽŽ‘ã Åpublic²:‘qÇif–UUthe“proGcedure“is“public.Ž¡‘ã¸ŽŽŽ‘ã Åuser²:‘qÇif–UUthe“prošGcedure“is“a“user-de ned“pro˜cedure.Ž¡‘ã¸ŽŽŽ‘ã Åbuilt‘¡E‰ff&fŽ‘Ç«in²:‘qÇif–UUthe“proGcedure“is“a“Prolog“built-in“predicate.Ž¡‘ã¸ŽŽŽ‘ã Åbuilt‘¡E‰ff&fŽ–Ç«in‘¡E‰ff&fŽ“fd²:‘qÇif–UUthe“proGcedure“is“an“FD“built-in“predicate.Ž¡‘ã¸ŽŽŽ‘ã Ånative‘¡E‰ff&fŽ‘Ç«code²:‘qÇif–UUthe“prošGcedure“is“compiled“in“nativ¸ãe“co˜de.Ž¡‘ã¸ŽŽŽ‘ã Åprolog‘¡E‰ff&fŽ‘Ç«file(File)²:‘qÇsource–UU le“from“whic¸ãh“the“predicate“has“bGeen“read.Ž¡‘ã¸ŽŽŽ‘ã Åprolog‘¡E‰ff&fŽ‘Ç«line(Line)²:‘qÇline›UUn•¸ãum“bGer˜of˜the˜source˜ le.Ž¡‘øãÄErrorsŽŸwLË‘øãŸ–›‰ffÇ>|¤fdŸ™œ„ffŸðfd‘ÅPred–UU²is“neither“a“v‘ÿqÇariable“nor“a“predicateŽŸ ‘indicatorŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(predicate‘¡E‰ff&fŽ“indicator,‘?ýPred)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Pred–UU²is“a“term“ÅName/Arity“²and“ÅArity“²is“neitherŽŸ ‘a–UUv‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýArity)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Pred–O¨²is›O©a“term“ÅName/Arity˜²and“ÅName“²is˜neither“aŽŸ ‘v‘ÿqÇariable–UUnor“an“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýName)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Pred–UU²is“a“term“ÅName/Arity“²and“ÅArity“²is“anŽŸ ‘in¸ãteger–UUµ<“²0ŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýArity)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘Pred–UU²is“a“term“ÅName/Arity“²and“ÅArity“²is“anޤ ‘in¸ãteger–UUµ>“Åmax‘¡E‰ff&fŽ‘Ç«arity“² ag“(section“7.22.1,Ž¡‘page‘UU133)ŽŽ’㥄$ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(max‘¡E‰ff&fŽ“arity)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Property–UU²is“neither“a“v‘ÿqÇariable“nor“a“predicateŽŸ ‘propGert¸ãy‘UUtermŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(predicate‘¡E‰ff&fŽ“property,ŽŸ ’éÒqProperty)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Property–UU²=“Åprolog‘¡E‰ff&fŽ‘Ç«file(File)“²and“ÅFile“²isŽŸ ‘neither–UUa“v‘ÿqÇariable“nor“an“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFile)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Property–UU²=“Åprolog‘¡E‰ff&fŽ‘Ç«line(Line)“²and“ÅLine“²isŽŸ ‘neither–UUa“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýLine)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸy>’‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŽŸŽŒ‹Bv# Ú‹– ý"EŸüfd‘øã²66ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÇ7.9Ž‘£All‘€solutionsޤuT‘øãÄ7.9.1Ž‘‰In®9troQÇductionŽ¡‘øã²It–ï}is“sometimes“useful›ï~to“collect“all“solutions“for“a“goal.‘OÕThis“can“bGe“done˜bš¸ãy“repGeatedly“bac˜ktrac˜king“andޤ ‘øãgradually–£building“the“list›£of“solutions.‘ZÈThe“follo¸ãwing“built-in“predicates˜are“pro¸ãvided“to“automate“thisŽ¡‘øãproGcess.Ž©‘øãThe–ZÒbuilt-in“predicates›ZÓdescribGed“in“this“section“in•¸ãv“ok“e–ZÒÅcall/1˜²(section“6.2.3,‘\1page“47)˜on“the“argumen¸ãtŽ¡‘øãÅGoal².‘!ÎWhen›eciency–is“crucial“and“ÅGoal“²is˜complex“it“is“bGetter“to“de ne˜an“auxiliary“predicate“whic¸ãhŽ¡‘øãcan–UUthen“bGe“compiled,“and“ha•¸ãv“e–UUÅGoal“²call“this“predicate.ŽŸ%þ6‘øãÄ7.9.2Ž‘‰Åfindall/3ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åfindall(?term,–?ý+callable‘¡E‰ff&fŽ‘Ç«term,“?list)Ž¡‘øãÄDescriptionަ‘øãÅfindall(Template,–?ýGoal,“Instances)›æ ²succeeds–æ if‘­'ÅInstances“²uni es˜with“the˜list“of˜v‘ÿqÇalues“to˜whic¸ãhޤ ‘øãa›‘vv‘ÿqÇariable–‘uÅX‘‘%²not“oGccurring˜in˜ÅTemplate“²or˜ÅGoal˜²w¸ãould“bGe˜instan•¸ãtiated˜b“y˜successiv“e‘‘ure-executions˜ofŽ¡‘øãÅcall(Goal),–?ýX“=“Template–ºÔ²after›ºÕsystematic“replacemen¸ãt“of˜all“v‘ÿqÇariables˜in“ÅX‘ºº²b¸ãy˜new“v‘ÿqÇariables.‘¢ETh¸ãus,Ž¡‘øãthe–UUorder“of“the“list“ÅInstances“²correspšGonds“to“the“order“in“whic¸ãh“the“pro˜ofs“are“found.ަ‘øãÄErrorsŽŸ:ÿ‘øãŸÒæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅGoal–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Goal–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýGoal)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ'™œ„0ffŸØfd‘²The–UUpredicate“indicator“ÅPred“²of‘rÅGoal“²doGes“notޤ ‘correspšGond–UUto“an“existing“pro˜cedure“and“theŽ¡‘v‘ÿqÇalue–UUof“the“Åunknown“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄0ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(procedure,‘?ýPred)ŽŽ’ÆØŸ'™œ„0ffŽŽŸ(‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Instances–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýInstances)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ|ŽŽŽŽ ÃÝ» ý_"E‘øãsome–}badditional›}cv‘ÿqÇariables“of‘DÅGoal².‘éðF‘ÿ*ªor“that,‘‡fÅbagof/3“²recognizes“a˜goal“of˜the“form“ÅT^Goal˜²and“excludeޤ ‘øãall–È(v‘ÿqÇariables›È'oGccuring“in˜ÅT‘Ȳfrom“the“free˜v‘ÿqÇariable“set.‘B¸Å(^)/2“²can˜bGe“view¸ãed˜as“an“Èexistential‘quanti er‘Ûµ²(theŽ¡‘øãlogical–¾&reading“of‘…CÅX^Goal“²bGeing‘¾'\there“exists“an“ÅX‘¾ ²sucš¸ãh“that“ÅGoal“²is“true").‘¬;The“use“of“this“existen˜tialŽ¡‘øãquali er–UUis“supGer uous“outside“Åbagof/3“²(and“Åsetof/3²)“and“then“is“not“recognized.ޤ‘øãÅ(^)/2–UU²is“a“prede ned“in x“opGerator“(section“7.14.10,“page“100).Ž¡‘øãÅsetof(Template,–?ýGoal,“Instances)–\E²is“equiv‘ÿqÇalen¸ãt‘\Fto“Åbagof(Template,Goal,I),‘?ýsort(I,Instances)².Ž© ‘øãEacš¸ãh–UUlist“is“then“a“sorted“list“(duplicate“elemen˜ts“are“remo˜v˜ed).Ž¡‘øãF‘ÿ*ªrom–– the“implemen•¸ãtation›– pGoin“t–– of“view‘¹—Åsetof/3˜²is“as“fast“as“Åbagof/3².‘3åBoth“predicates˜use“an“in-placeަ‘øã(i.e.‘qÇdestructivš¸ãe)–UUsort“(section“7.20.12,“page“125)“and“require“the“same“amoun˜t“of“memory‘ÿ*ª.Ž¡‘øãÄErrorsŽŸ:ÿ‘øãŸÒæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅGoal–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Goal–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýGoal)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ'™œ„0ffŸØfd‘²The–UUpredicate“indicator“ÅPred“²of‘rÅGoal“²doGes“notޤ ‘correspšGond–UUto“an“existing“pro˜cedure“and“theŽ¡‘v‘ÿqÇalue–UUof“the“Åunknown“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄0ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(procedure,‘?ýPred)ŽŽ’ÆØŸ'™œ„0ffŽŽŸ(‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Instances–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýInstances)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸa“source/sink²:‘mÌto–ÓWmanipulate“a›ÓXsource/sink“it“m¸ãust˜bšGe“asso˜ciated‘ÓXwith“aަ‘øãstream.‘B–This–šðpro¸ãvides›šïa“logical˜and“uniform˜view“of˜the˜source/sink“whatev¸ãer˜its“t¸ãypGe.‘B–Once“this˜asso-ަ‘øãciation–BÖhas›B×bGeen“established,‘FŠi.e.‘ka“stream“has˜bGeen“created,‘FŠall“subsequen¸ãt˜references“to˜the“source/sinkަ‘øãare–#|made›#{b¸ãy“referring“the˜stream.‘Ü;A‘#Gstream“is˜unidirectional:‘it˜is“either“an˜input“stream“or˜an“out-ަ‘øãput–×âstream.‘ùmF‘ÿ*ªor“a“classical“ le,‘ø„the“assošGciation“is“done“b¸ãy‘×áop˜ening“the“ le“(whose“name‘×áis“sp˜eci ed“asަ‘øãan–çatom)›èwith“the“Åopen/4“²(section˜7.10.6,‘F page˜70).‘³}GNU‘¶Prolog“mak¸ães˜it“pGossible“to“treat˜a“Prologަ‘øãconstan¸ãt–èäterm›èåas“a˜source/sink“and˜pro¸ãvides“built-in˜predicates“to˜assoGciate“a˜stream“to˜suc¸ãh“a˜term“(sec-ަ‘øãtion–™‰7.11,‘ª—page“82).‘>eGNU‘™xProlog“proš¸ãvides“opGerating‘™Šsystem“in˜terface›™Špredicates“de ning˜pipšGes“b˜et•¸ãw“eenަ‘øãGNU‘æProlog–úand›ùc¸ãhild“proGcesses“with˜streams“assoGciated“with˜these“pipGes,‘¦e.g.‘W©Åpopen/3˜²(section“7.27.21,ަ‘øãpage›‡ý153).‘-USimilarly‘ÿ*ª,‘±soGc•¸ãk“et˜in“terface–‡þpredicates˜assoGciate˜streams˜to“a˜soGc•¸ãk“et˜to˜allo“w‘‡þthe˜comm“unication,ަ‘øãe.g.‘qÇÅsocket‘¡E‰ff&fŽ‘Ç«connect/4–UU²(section“7.28.5,“page“159).Ž¡‘øãÄStream-term²:‘A a–<östream-term›<÷iden¸ãti es“a˜stream“during“a˜call“of˜an“input/output˜built-in“predicate.ަ‘øãIt–5is›5žcreated“as“a˜result“of“assoGciating˜a“stream“to˜a“source/sink“(section˜abGo•¸ãv“e).‘ A‘5cstream-term˜is‘5aަ‘øãcompGound–UUterm“of“the“form“Å'$stream'(I)“²where“ÅI“²is“an“in¸ãteger.Ž¡‘øãÄStream‘ÚÚaliases²:‘8™an•¸ãy›8¾stream‘8¿ma“y˜b•Ge˜asso“ciated˜with˜a–8¿stream˜alias˜whic¸ãh˜is˜an˜atom“whic•¸ãh˜ma“y˜bGeަ‘øãused–á to›á refer“to“that“stream.‘çThe˜assošGciation“can“b˜e“done‘á at“op˜en“time“or‘á using‘—Åadd‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“alias/2ŽŽŸŽŒ‹D’™ Ú‹– ý"EŸüfd‘øã²68ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øã(section–}Æ7.10.20,‘¨ãpage“79).›)íSuc¸ãh“an‘}ÅassoGciation“automatically“ends“when“the“stream“is“closed.˜A‘}particularޤ ‘øãalias–=µonly›=¶refers“to“at˜most“one“stream˜at“an¸ãy“one˜time.‘içHo•¸ãw“ev“er,‘Bomore–=µthan˜one“alias“can˜bšGe“asso˜ciatedŽ¡‘øãwith–Ða“stream.‘ãFMost“built-in“predicates“whic•¸ãh›Ѐha“v“e–Ða“stream-term“as“an“input˜argumen¸ãt“also“accept“aŽ¡‘øãstream–A—alias“as›A–that“argumen•¸ãt.‘k2Ho“w“ev“er,‘EŠbuilt-in–A—predicates“whic¸ãh˜return“a“stream-term“do˜not“accept“aŽ¡‘øãstream‘UUalias.Ž©‘øãÄStandard‘™Üstreams²:›„Ét•¸ãw“o–ÞÖstreams“are“prede ned“and“opGen“during“the‘Þ×execution“of“ev¸ãery“goal:˜theŽ¡‘øãstandard–ê input›ê stream“whic¸ãh“has˜the“alias“Åuser‘¡E‰ff&fŽ‘Ç«input˜²and“the“standard˜output“stream“whic¸ãh˜has“theŽ¡‘øãalias–œÅuser‘¡E‰ff&fŽ‘Ç«output².‘F$A‘œ goal›œwhic¸ãh“attempts“to˜close“either˜standard“stream˜succeeds,‘­Ñbut“doGes˜not“closeŽ¡‘øãthe‘UUstream.ަ‘øãÄCurren®9t‘<@streams²:‘$Æduring›®Õexecution–®Ôthere“is˜a“curren¸ãt˜input“stream˜and“a˜curren¸ãt“output˜stream.‘~EByŽ¡‘øãdefault,›5„the–-curren¸ãt“input“and“output“streams“are‘-the“standard“input“and“output“streams,˜but“the“built-Ž¡‘øãin–©predicates“Åset‘¡E‰ff&fŽ›Ç«input/1“²(section“7.10.4,‘½ñpage“69)“and‘©Åset‘¡E‰ff&fŽ˜output/1“²(section“7.10.5,‘½ñpage“70)“can“bGeŽ¡‘øãused–xOto›xNc¸ãhange“them.‘Ú´When“the˜curren¸ãt“input˜stream“is“closed,‘ the˜standard“input“stream˜bGecomes“theŽ¡‘øãcurrenš¸ãt–ÁQinput“stream.‘µºWhen“the“curren˜t“output›ÁPstream“is“closed,‘ÜPthe“standard˜output“stream“bGecomesŽ¡‘øãthe–UUcurren¸ãt“output“stream.ަ‘øãÄT‘ÿ «ext–%Dstreams›%Eand“binary˜streams²:‘üÍa–šØtext“stream“is‘šÙa“sequence“of“c¸ãharacters.‘BPA‘šÇtext“stream“is“alsoŽ¡‘øãregarded–óZas“a“sequence“of“lines“where“eacš¸ãh“line“is“a“pGossibly“empt˜y“sequence“of“c˜haracters“follo˜w˜ed“b˜yŽ¡‘øãa–H£new‘H¤line“cš¸ãharacter.‘K²GNU‘HeProlog“ma˜y›H¤add“or˜remo•¸ãv“e–H£space“c¸ãharacters˜at“the“ends˜of“lines˜in“orderŽ¡‘øãto–Þconform“to“the“con•¸ãv“en“tions–Þfor“represen¸ãting“text“streams“in“the“opGerating‘Þsystem.‘ ÚA‘Ýãbinary“streamŽ¡‘øãis–#]a›#\sequence“of˜b¸ãytes.‘ÛÞOnly“a˜few“built-in˜predicates“can˜deal“with“binary˜streams,‘VÞe.g.‘ÛÞÅget‘¡E‰ff&fŽ‘Ç«byte/2Ž¡‘øã²(section–UU7.13,“page“89).ަ‘øãÄStream‘ºpQÇositions²:‘eíthe–=£stream›=¢pGosition“of˜a˜stream“iden¸ãti es˜an“absolute˜pGosition“of˜the“source/sink˜toŽ¡‘øãwhic¸ãh–Ìsthe›Ìrstream“is“connected˜and“de nes“where˜in“the˜source/sink“the“next˜input“or“output˜will“tak¸ãeŽ¡‘øãplace.‘%A‘Gstream–tpGosition“is“a›uground“term“of“the˜form“Å'$stream‘¡E‰ff&fŽ‘Ç«position'(I1,–?ýI2,“I3,“I4)‘t²whereŽ¡‘øãÅI1²,‘ÈÅI2²,‘ÈŽÅI3›±„²and–±ƒÅI4“²are“in¸ãtegers.‘†RStream“pGositions“are“used˜to“repGosition“a“stream˜(when“pGossible)“usingŽ¡‘øãfor–UUinstance“Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“position/2–UU²(section“7.10.13,“page“75).ަ‘øãÄThe–—òpQÇosition“end‘—óof“stream²:‘Ä>when›þall–þ‘data“of˜a“stream˜ÉS‘º×²has“bGeen“input˜ÉS‘º×²has“a˜stream“pGositionŽ¡‘øãend-of-stream.‘ĘA¸ãt–pðthis›pïstream“pGosition“a“goal“to“input“more“data“will“return˜a“spGeci c“v‘ÿqÇalue“to“indicateŽ¡‘øãthat– ¡end›  of“stream“has˜bGeen“reac¸ãhed“(e.g.‘X‹Å-1“²for˜Åget‘¡E‰ff&fŽ›Ç«code/2“²or“Åend‘¡E‰ff&fŽ˜of‘¡E‰ff&fŽ˜file‘  ²for“Åget‘¡E‰ff&fŽ˜char/2²,.–ªª.“.“).‘X‹WhenŽ¡‘øãthis–UUterminating“v‘ÿqÇalue“has“bšGeen“input,“the“stream“has“a“stream“p˜osition“past-end-of-stream.ަ‘øãÄBu ering‘üÐmoQÇde²:‘s©input/output›VGon–VFa“stream“can˜bGe“bu ered“(line-bu ered“or˜bloGc¸ãk-bu ered)“or“notŽ¡‘øãbu ered–>‚at›>all.‘-MThe“bu ering“moGde“can˜bšGe“sp˜eci ed“at‘>op˜en“time“or‘>using‘bÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“buffering/2Ž¡‘øã²(section–5û7.10.27,›|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.10.2Ž‘!ƇÅcurrent‘¡E‰ff&fŽ‘Ç«input/1Ž©uT‘øãÄT‘ÿ «emplatesŽŸˆ9‘ã Åcurrent‘¡E‰ff&fŽ‘Ç«input(?stream)ŽŸˆ:‘øãÄDescriptionޤ‘øãÅcurrent‘¡E‰ff&fŽ‘Ç«input(Stream)–UU²uni es“ÅStream“²with“the“stream-term“idenš¸ãtifying“the“curren˜t“input“stream.Ž¡‘øãÄErrorsŽ¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅStream–UU²is“neither“a“v‘ÿqÇariable“nor“a“streamŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýStream)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicate.ŽŸ%­Q‘øãÄ7.10.3Ž‘!ƇÅcurrent‘¡E‰ff&fŽ‘Ç«output/1ަ‘øãÄT‘ÿ «emplatesޤˆ9‘ã Åcurrent‘¡E‰ff&fŽ‘Ç«output(?stream)Ž¡‘øãÄDescriptionޤ‘øãÅcurrent‘¡E‰ff&fŽ‘Ç«output(Stream)–UU²uni es“ÅStream“²with“the“stream-term“idenš¸ãtifying“the“curren˜t“output“stream.Ž¡‘øãÄErrorsŽ¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅStream–UU²is“neither“a“v‘ÿqÇariable“nor“a“streamŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýStream)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicate.ŽŸ%­Q‘øãÄ7.10.4Ž‘!ƇÅset‘¡E‰ff&fŽ‘Ç«input/1ަ‘øãÄT‘ÿ «emplatesŽŸˆ:‘ã Åset‘¡E‰ff&fŽ–Ç«input(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias)ŽŸˆ9‘øãÄDescriptionŽ¡‘øãÅset‘¡E‰ff&fŽ‘Ç«input(SorA)‘Ãÿ²sets–Ä#the“curren¸ãt›Ä$input“stream“to“bGe˜the“stream“assoGciated˜with“the“stream-term˜or“aliasŽ© ‘øãÅSorA².Ž¡‘øãÄErrorsŽŸ.ÿ‘øãŸÞæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orަ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ0qÆ‘øãÄP•®9ortabilit“yŽŽŸŽŒ‹F¼€ Ú‹– ý"EŸüfd‘øã²70ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãISO‘UUpredicate.ŽŸ%þ6‘øãÄ7.10.5Ž‘!ƇÅset‘¡E‰ff&fŽ‘Ç«output/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åset‘¡E‰ff&fŽ–Ç«output(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias)Ž¡‘øãÄDescriptionޤ‘øãÅset‘¡E‰ff&fŽ‘Ç«output(SorA)‘‹|²sets–‹Šthe“curren¸ãt‘‹‹output“stream“to“bšGe“the“stream“asso˜ciated‘‹‹with“the“stream-term“orŽ© ‘øãalias‘UUÅSorA².Ž¡‘øãÄErrorsŽŸ.ÿ‘øãŸÞæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orަ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“input“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(output,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ0qÆ‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicate.ŽŸ%þ6‘øãÄ7.10.6Ž‘!ƇÅopen/4Ä,‘ÕTÅopen/3ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åopen(+source‘¡E‰ff&fŽ–Ç«sink,›?ý+io‘¡E‰ff&fŽ“mode,˜-stream,˜+stream‘¡E‰ff&fŽ“option‘¡E‰ff&fŽ“list)ަ‘ã open(+source‘¡E‰ff&fŽ–Ç«sink,›?ý+io‘¡E‰ff&fŽ“mode,˜-stream)Ž¡‘øãÄDescriptionޤ‘øãÅopen(SourceSink,–?ýMode,“Stream,“Options)–y¦²opGens“the›y¥source/sink“ÅSourceSink“²for“input˜or“outputަ‘øãas›ùDindicated–ùCb¸ãy‘ÑÅMode“²and˜the˜list“of˜stream-options“ÅOptions˜²and˜uni es“ÅStream˜²with“the˜stream-termަ‘øãwhic¸ãh–ˆis›‡assoGciated“with“this“stream.‘¸_See“Åabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2˜²for–ˆinformation“abGout“the˜syn¸ãtax“ofަ‘øãÅSourceSink–UU²(section“7.26.1,“page“141).Ž¡‘øãÄInput/output‘oÖmoQÇdes²:‘~~ÅMode–Û°²is“an“atom›Û±whic¸ãh“de nes“the“input/output“opGerations“that˜ma¸ãy“bšGe“p˜er-ަ‘øãformed–UUthe“stream.‘qÇP¸ãossible“moGdes“are:ޤ‘ã¸ŽŽŽ‘ã Åread²:‘Óthe›\\source/sink–\[is“a“source“and˜m¸ãust“already“exist.‘†ÚInput“starts“at“the˜bGeginning“of“theަ‘ã source.Ž¡‘ã¸ŽŽŽ‘ã Åwrite²:‘q»the–U>source/sink“is›U=a“sink.‘q¿If“the˜sink“already˜exists“then“it˜is“emptied“else˜an“empt¸ãy˜sink“isަ‘ã created.‘qÇOutput–UUstarts“at“the“bGeginning“of“that“sink.Ž¡‘ã¸ŽŽŽ‘ã Åappend²:‘e¸the–=6source/sink“is“a–=7sink.‘i¼If“the–=6sink“doGes“not›=7exist“it“is“created.‘i½Output“starts˜at“the“endަ‘ã of–UUthat“sink.Ž¡‘øãÄStream‘»Œoptions²:‘)ÅOptions›…²is–†a“list“of˜stream“options.‘ÊYIf“this“list“conš¸ãtains“con˜tradictory‘…options,‘O’theަ‘øãrighš¸ãtmost–UUoption“is“the“one“whic˜h“applies.‘qÇP˜ossible“options“are:Ž¡‘ã¸ŽŽŽ‘ã Åtype(text²/Åbinary)²:‘AÊspGeci es–õ[whether“the“stream“is“a“text“stream“or“a“binary“stream.‘QÉThe“defaultަ‘ã v‘ÿqÇalue–UUis“Åtext².ŽŽŸŽŒ‹GÅû Ú‹– ý"EŸüfd‘øã²7.10‘ StreamsŽŽŽ’¶!71ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã¸ŽŽŽ‘ã Åreposition(true²/Åfalse)²:‘ÎspšGeci es‘uwhether–tit“is“p˜ossible‘uto“rep˜osition“the“stream.‘|%The“defaultޤ ‘ã v‘ÿqÇalue–UUis“Åtrue“²except“if“the“stream“cannot“bšGe“rep˜ositioned“(e.g.‘qÇa“terminal).Ž©Ë"‘ã¸ŽŽŽ‘ã Åeof‘¡E‰ff&fŽ–Ç«action(error²/Åeof‘¡E‰ff&fŽ“code²/Åreset)²:‘À4spGeci es–|Œthe›|‹e ect“of˜attempting“to˜input“from˜a“streamŽ¡‘ã whose–UUstream“pGosition“is“past-end-of-stream:Ž¡‘# Ä{ŽŽŽ‘'ã Åerror²:‘qÇa–UUÅpermission‘¡E‰ff&fŽ‘Ç«error“²is“raised“signifying“that“no“more“input“exists“in“this“stream.ŽŸË!‘# Ä{ŽŽŽ‘'ã Åeof‘¡E‰ff&fŽ‘Ç«code²:‘qÇthe–UUresult“of“input“is“as“if“the“stream“pGosition“is“end-of-stream.ŽŸË"‘# Ä{ŽŽŽ‘'ã Åreset²:‘´¶the–vÌstream›vÍpGosition“is˜reset“so˜that“it˜is“not˜past-end-of-stream,‘*and˜another“attemptŽ¡‘'ã is–UUmade“to“input“from“it“(this“is“useful“when“inputting“from“a“terminal).ŽŸË"‘ã The–UUdefault“v‘ÿqÇalue“is“Åeof‘¡E‰ff&fŽ‘Ç«code².ŽŸË!‘ã¸ŽŽŽ‘ã Åalias(Alias)²:‘¶œspšGeci es–w¿that“the“atom‘wÀÅAlias“²is“to“b˜e›wÀan“alias“for“the˜stream.‘ÙBy˜default“no“aliasŽ¡‘ã is–UUattacš¸ãhed“to“the“stream.‘qÇSev˜eral“aliases“can“bGe“de ned“for“a“same“stream.ަ‘ã¸ŽŽŽ‘ã Åmirror(Mirror)²:‘w¬spšGeci es–XGthe‘XHstream“asso˜ciated›XHwith“the“stream-term˜or“alias˜ÅMirror“²is˜a“mirrorŽ¡‘ã for–(Ûthe“stream.›bôBy“default“no“mirro“is“attac¸ãhed“to“the“stream.˜Sev¸ãeral“mirrors“can“bGe“de ned“for“aŽ¡‘ã same‘UUstream.ަ‘ã¸ŽŽŽ‘ã Åbuffering(none²/Åline²/Åblock)²:‘òÔspGeci es–Wnwhicš¸ãh“t˜ypGe“of“bu ering“is‘Woused“b˜y“input/output“opGerationsŽ¡‘ã on–UUthis“stream:Ž¡‘# Ä{ŽŽŽ‘'ã Ånone²:‘qÇno‘UUbu ering.ŽŸË!‘# Ä{ŽŽŽ‘'ã Åline²:‘qÇoutput–UUopšGerations“bu er“data“emitted“un¸ãtil“a“new-line“o˜ccursŽŸË"‘# Ä{ŽŽŽ‘'ã Åblock²:‘%¶input/output–½4opGerations›½3bu er“data˜un¸ãtil“a˜givš¸ãen“n˜um˜bGer‘½3(implemen˜tation“depGendan˜t)Ž¡‘'ã of›UUc•¸ãharacters/b“ytes˜ha“v“e˜bGeen˜treated.ŽŸË"‘ã The–UUdefault“v‘ÿqÇalue“is“Åline“²for“a“terminal“(TTY),“Åblock“²otherwise.ŽŸ–C‘øãÅopen(SourceSink,–?ýMode,“Stream,“Options)–\E²is“equiv‘ÿqÇalen¸ãt‘\Fto“Åopen(SourceSink,–?ýMode,“Stream,“[])².ޤ‘øãÄErrorsŽ ¨³0‘øã ÿd³6‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSourceSink–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Mode–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Options–U0²is“a›U/partial“list“or“a“list˜with“an“elemen¸ãtŽŸ ‘ÅE–UU²whic¸ãh“is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Mode–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýMode)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Options–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýOptions)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Stream–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStream)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SourceSink–UU²is“neither“a“v‘ÿqÇariable“nor“aŽŸ ‘source/sinkŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(source‘¡E‰ff&fŽ“sink,‘?ýSourceSink)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Mode–UU²is“an“atom“but“not“an“input/output“moGdeŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(io‘¡E‰ff&fŽ“mode,‘?ýMode)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅOptions“²list“is“neither“aŽŸ ‘v‘ÿqÇariable–UUnor“a“stream-optionŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“option,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²the–UUsource/sink“spšGeci ed“b¸ãy‘xâÅSourceSink“²do˜esŽŸ ‘not‘UUexistŽŽ’㥄ffŽ’éÒqÅexistence‘¡E‰ff&fŽ–Ç«error(source‘¡E‰ff&fŽ“sink,‘?ýSourceSink)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²the–UUsource/sink“spGeci ed“b¸ãy‘xâÅSourceSink“²cannotŽŸ ‘b•Ge‘UUop“enedŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(open,‘?ýsource‘¡E‰ff&fŽ“sink,ŽŸ ’éÒqSourceSink)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an›0elemen¸ãt–0ÅE‘0²of“the˜ÅOptions“²list˜is˜Åalias(A)‘0²andŽŸ ‘ÅA–UU²is“already“assošGciated“with“an“op˜en“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(open,‘?ýsource‘¡E‰ff&fŽ“sink,ŽŸ ’éÒqalias(A))ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅOptions“²list“is“Åmirror(M)ŽŸ ‘²and–UUÅM“²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýM)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅOptions“²list“is“Åmirror(M)ŽŸ ‘²and–UUÅM“²iis“an“input“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(output,–?ýstream,“M)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅOptions“²list“isޤ ‘Åreposition(true)–UU²and“it“is“not“pGossible“toŽ¡‘repGosition–UUthis“streamŽŽ’㥄$ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(open,‘?ýsource‘¡E‰ff&fŽ“sink,ŽŸ ’éÒqreposition(true))ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽ ª¤÷‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO–UUpredicates.‘qÇThe“Åmirror/1“²and“Åbuffering/1“²stream“options“are“GNU“Prolog“extensions.ŽŽŸŽŒ‹HÒ§ Ú‹– ý"EŸüfd‘øã²72ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.10.7Ž‘!ƇÅclose/2Ä,‘ÕTÅclose/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åclose(+stream‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“alias,‘?ý+close‘¡E‰ff&fŽ“option‘¡E‰ff&fŽ“list)Ž© ‘ã close(+stream‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“alias)Ž¡‘øãÄDescriptionޤ‘øãÅclose(SorA,‘?ýOptions)–é²closes“the“stream“assoGciated“with“the“stream-term“or‘é€alias“ÅSorA².“If‘°žÅSorA‘é²isަ‘øãthe–ÙÊstandard“input“stream›ÙÉor“the“standard“output“stream“Åclose/2“²simply˜succeeds“else“the“assoGciatedަ‘øãsource/sink–Æ/is“phš¸ãysically“closed.‘ÄUIf‘LÅSorA‘Ʋis“the“curren˜t“input“stream“the“curren˜t“input“stream“bGecomesަ‘øãthe–j standard“input“stream›j!Åuser‘¡E‰ff&fŽ‘Ç«input².‘°(If‘1=ÅSorA‘j²is“the“curren¸ãt“output“stream˜the“curren¸ãt“output“streamަ‘øãbGecomes–UUthe“standard“output“stream“Åuser‘¡E‰ff&fŽ‘Ç«output².Ž¡‘øãÄClose‘ÕToptions²:›qÇÅOptions–UU²is“a“list“of“close“options.˜F‘ÿ*ªor“the“momenš¸ãt“only“one“option“is“a˜v‘ÿqÇailable:ޤ‘ã¸ŽŽŽ‘ã Åforce(true²/Åfalse)²:‘‹with–rÝÅfalse²,› (if“an“error“oGccurs“when“trying“to“close“the“source/sink,˜the“streamަ‘ã is–Ÿnot“closed“and“an“error“(Åsystem‘¡E‰ff&fŽ›Ç«error‘ž²or“Åresource‘¡E‰ff&fŽ˜error²)“is“raised“(but“Åclose/2“²succeeds).ަ‘ã With–Þ Åtrue²,‘õ÷if›Þan“error˜oGccurs“it“is˜ignored“and˜the“stream˜is“closed.‘J The˜purpGose“of‘¥<Åforce/1“²optionަ‘ã is–ôÔto“allo¸ãw›ôÓan“error“handling“routine“to“do˜its“bGest“to“reclaim“resources.‘QœThe“default˜v‘ÿqÇalue“is“Åfalse².Ž¡‘øãÅclose(SorA)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åclose(SorA,‘?ý[])².ޤ‘øãÄErrorsŽŸM˜‘øãŸÀLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Options–U0²is“a›U/partial“list“or“a“list˜with“an“elemen¸ãtަ‘ÅE–UU²whic¸ãh“is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Options–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýOptions)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orަ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅOptions“²list“is“neither“aަ‘v‘ÿqÇariable–UUnor“a“close-optionŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(close‘¡E‰ff&fŽ“option,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²needs“a“spGecial“close“(section“7.11,“page“82)ŽŽ’㥄 ffŽ’éÒqÅsystem‘¡E‰ff&fŽ–Ç«error(needs‘¡E‰ff&fŽ“special‘¡E‰ff&fŽ“close)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸO _‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO–UUpredicates.‘qÇThe“Åsystem‘¡E‰ff&fŽ–Ç«error(needs‘¡E‰ff&fŽ“special‘¡E‰ff&fŽ“close)–UU²is“a“GNU“Prolog“extension.ŽŸ%þ6‘øãÄ7.10.8Ž‘!ƇÅflush‘¡E‰ff&fŽ–Ç«output/1Ä,‘ÕTÅflush‘¡E‰ff&fŽ“output/0ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åflush‘¡E‰ff&fŽ–Ç«output(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias)ަ‘ã flush‘¡E‰ff&fŽ‘Ç«outputŽ¡‘øãÄDescriptionޤ‘øãÅflush‘¡E‰ff&fŽ‘Ç«output(SorA)–UU²sends“anš¸ãy“bu ered“output“c˜haracters/b˜ytes“to“the“stream.Ž¡‘øãÅflush‘¡E‰ff&fŽ‘Ç«output/0–UU²applies“to“the“curren¸ãt“output“stream.Ž¡‘øãÄErrorsŽŽŸŽŒ‹IéàÚ‹– ý"EŸüfd‘øã²7.10‘ StreamsŽŽŽ’¶!73ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýv¢D‘øãŸÞæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“input“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(output,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ0qÆ‘øãÄP•®9ortabilit“yޤ‘øã²ISO‘UUpredicates.Ž©%契øãÄ7.10.9Ž‘!ƇÅcurrent‘¡E‰ff&fŽ‘Ç«stream/1ŽŸuT‘øãÄT‘ÿ «emplatesŽŸâ‘ã Åcurrent‘¡E‰ff&fŽ‘Ç«stream(?stream)ŽŸã‘øãÄDescriptionŽ¡‘øãÅcurrent‘¡E‰ff&fŽ‘Ç«stream(Stream)–¹²succeeds“if›¹there“exists“a“stream-term“that˜uni es“with“ÅStream².‘=ÛThis“predicateŽŸ ‘øãis–UUre-executable“on“bac•¸ãktrac“king.Ž¡‘øãÄErrorsŽ¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅStream–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-termŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýStream)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ަ‘øãÄ7.10.10Ž‘'†…Åstream‘¡E‰ff&fŽ‘Ç«property/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ©â‘ã Åstream‘¡E‰ff&fŽ–Ç«property(?stream,‘?ý?stream‘¡E‰ff&fŽ“property)ŽŸã‘øãÄDescriptionŽ¡‘øãÅstream‘¡E‰ff&fŽ›Ç«property(Stream,‘?ýProperty)–¨²succeeds“if‘FÅÅcurrent‘¡E‰ff&fŽ˜stream(Stream)‘§²succeeds“(section“7.10.9,ޤ ‘øãpage–åÇ73)›åÈand“if‘¬äÅProperty˜²uni es“with“one“of˜the“propGerties“of˜the“stream.‘L˜This“predicate˜is“re-executableŽ¡‘øãon‘UUbac•¸ãktrac“king.ŽŸ‘øãÄStream‘ÕTpropQÇerties²:ަ‘ã¸ŽŽŽ‘ã Åfile‘¡E‰ff&fŽ‘Ç«name(F)²:–UUthe“name“of“the“connected“source/sink.ޤÆñ‘ã¸ŽŽŽ‘ã Åmode(M)²:–UUÅM“²is“the“opšGen“mo˜de“(Åread²,“Åwrite²,“Åappend²).Ž¡‘ã¸ŽŽŽ‘ã Åinput²:‘qÇif–UUit“is“an“input“stream.Ž¡‘ã¸ŽŽŽ‘ã Åoutput²:‘qÇif–UUit“is“an“output“stream.ŽŸÆò‘ã¸ŽŽŽ‘ã Åalias(A)²:–UUÅA“²is“an“alias“of“the“stream.Ž¡‘ã¸ŽŽŽ‘ã Åmirror(M)²:–UUÅM“²is“a“mirror“stream“of“the“stream.Ž¡‘ã¸ŽŽŽ‘ã Åtype(T)²:–UUÅT“²is“the“t¸ãypGe“of“the“stream“(Åtext²,“Åbinary²).Ž¡‘ã¸ŽŽŽ‘ã Åreposition(R)²:–UUÅR“²is“the“repšGosition“b˜o˜olean“(Åtrue²,“Åfalse²).ŽŽŸŽŒ‹Jù$ Ú‹– ý"EŸüfd‘øã²74ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã¸ŽŽŽ‘ã Åeof‘¡E‰ff&fŽ›Ç«action(A)²:–UUÅA“²is“the“end-of- le“action“(Åerror²,“Åeof‘¡E‰ff&fŽ˜code²,“Åreset²).ޤ‘ã¸ŽŽŽ‘ã Åbuffering(B)²:–UUÅB“²is“the“bu ering“moGde“(Ånone²,“Åline²,“Åblock²).Ž¡‘ã¸ŽŽŽ‘ã Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“stream(E)²:–ZÉÅE‘ZȲis“the“curren¸ãt“end-of-stream“status“(Ånot²,–\&Åat²,“Åpast²).‘‚$If–ZÉthe“stream“pGosition“isޤ ‘ã end-of-stream–Å>then›Å?ÅE‘Å"²is“uni ed˜with“Åat˜²else“if“the˜stream“pGosition˜is“past-end-of-stream˜then“ÅE‘Å"²isŽ¡‘ã uni ed–UUwith“Åpast“²else“ÅE“²is“uni ed“with“Ånot².ޤ‘ã¸ŽŽŽ‘ã Åposition(P)²:–UUÅP“²is“the“stream-pšGosition“term“asso˜ciated“with“the“curren¸ãt“p˜osition.Ž¡‘øãÄErrorsŽŸ@ÿ‘øãŸÌæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅStream–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Stream–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-termŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýStream)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Property–UU²is“neither“a“v‘ÿqÇariable“nor“a“streamŽŸ ‘propGert¸ãyŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“property,‘?ýProperty)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ'™œ„0ffŸØfd‘Property–UU²=“Åfile‘¡E‰ff&fŽ‘Ç«name(E)²,‘?ýÅmode(E)²,“Åalias(E)²,ޤ ‘Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“stream(E)²,‘UUÅeof‘¡E‰ff&fŽ“action(E)²,Ž¡‘Åreposition(E)²,–UUÅtype(E)“²or“Åbuffering(E)“²andŽ¡‘ÅE–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄0ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýE)ŽŽ’ÆØŸ'™œ„0ffŽŽŸ(‰ffÇ>|ŽŽŽŸBqÆ‘øãÄP•®9ortabilit“yŽ©‘øã²ISO–UUpredicate.‘qÇThe“Åbuffering/1“²propGert¸ãy“is“a“GNU“Prolog“extension.ŽŸ%þ6‘øãÄ7.10.11Ž‘'†…Åat‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream/1Ä,‘ÕTÅat‘¡E‰ff&fŽ“end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream/0ŽŸuT‘øãÄT‘ÿ «emplatesŽ¡‘ã Åat‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias)ŽŸ ‘ã at‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“streamŽ¡‘øãÄDescriptionަ‘øãÅat‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream(SorA)›E9²succeeds–E=if“the“stream“assoGciated“with‘E|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ0qÆ‘øãÄP•®9ortabilit“yަ‘øã²ISO–UUpredicates.‘qÇThe“Åpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)–UU²is“a“GNU“Prolog“extension.ŽŸ%þ6‘øãÄ7.10.12Ž‘'†…Åstream‘¡E‰ff&fŽ‘Ç«position/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŽŸŽŒ‹Kó Ú‹– ý"EŸüfd‘øã²7.10‘ StreamsŽŽŽ’¶!75ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Åstream‘¡E‰ff&fŽ–Ç«position(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?stream‘¡E‰ff&fŽ“position)ŽŸ‘øãÄDescriptionŽ©‘øãÅstream‘¡E‰ff&fŽ‘Ç«position(SorA,‘?ýPosition)–¦å²succeeds“unifying‘ÊrÅPosition“²with‘¦äthe“stream-pšGosition“term“asso˜ci-ޤ ‘øãated–gtwith›gsthe“curren¸ãt“pGosition˜of“the˜stream-term“or“alias˜ÅSorA².“This“predicate˜can“bGe˜de ned“usingŽ¡‘øãÅstream‘¡E‰ff&fŽ‘Ç«property/2–UU²(section“7.10.10,“page“73).ަ‘øãÄErrorsŽŸ4ÿ‘øãŸØæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Position–UU²is“neither“a“v‘ÿqÇariable“nor“aŽŸ ‘stream-pGosition‘UUtermŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“position,‘?ýPosition)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽŸ6qÆ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.10.13Ž‘'†…Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“position/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“position(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+stream‘¡E‰ff&fŽ“position)Ž¡‘øãÄDescriptionަ‘øãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“position(SorA,‘?ýPosition)–œ²sets“the‘›pšGosition“of“the“stream“asso˜ciated‘›with“the“stream-ޤ ‘øãterm– øor› ùalias“ÅSorA‘ æ²to“ÅPosition².‘YSÅPosition“²should“ha•¸ãv“e˜previously– øbGeen“returned˜b¸ãy‘/…Åstream‘¡E‰ff&fŽ‘Ç«property/2Ž¡‘øã²(section–UU7.10.10,“page“73)“or“b¸ãy‘xâÅstream‘¡E‰ff&fŽ‘Ç«position/2“²(section“7.10.12,“page“74).ަ‘øãÄErrorsŽŸFæe‘øãŸÆ€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Position–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Position–UU²is“neither“a“v‘ÿqÇariable“nor“aŽŸ ‘stream-pGosition‘UUtermŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“position,‘?ýPosition)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²has“stream“propGert¸ãy‘xâÅreposition(false)ŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(reposition,‘?ýstream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸHØ,‘øãÄP•®9ortabilit“yަ‘øã²ISO‘UUpredicate.ŽŸ%þ6‘øãÄ7.10.14Ž‘'†…Åseek/4ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ‘ã Åseek(+stream‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“alias,›?ý+stream‘¡E‰ff&fŽ“seek‘¡E‰ff&fŽ“method,˜+integer,˜?integer)ŽŽŸŽŒ‹LB Ú‹– ý"EŸüfd‘øã²76ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄDescriptionŽŸ‘øãÅseek(SorA,–?ýWhence,“Offset,“NewOffset)–jŒ²sets“the“pšGosition“of“the“stream“asso˜ciated“with“the“stream-ޤ ‘øãterm–¿‚or“alias“ÅSorA‘¿f²to“ÅOffset“²according“to›¿ÅWhence“²and“uni es“ÅNewOffset“²with“the˜new“o set“from“theŽ¡‘øãbšGeginning–UUof“the“ le.‘qÇÅseek/4“²can“only“b˜e“used“on“binary“streams.‘qÇÅWhence“²is“an“atom“from:Ž©iÜ‘ã¸ŽŽŽ‘ã Åbof²:‘qÇthe–UUpšGosition“is“set“relativ¸ãely“to“the“b˜egin“of“the“ le“(ÅOffset“²should“b˜e“¸“²0).ޤ4î‘ã¸ŽŽŽ‘ã Åcurrent²:‘qÇthe–UUpGosition“is“set“relativš¸ãely“to“the“curren˜t“pšGosition“(ÅOffset“²can“b˜e“¸“²0“or“¸“²0).Ž¡‘ã¸ŽŽŽ‘ã Åeof²:‘qÇthe–UUpšGosition“is“set“relativ¸ãely“to“the“end“of“the“ le“(ÅOffset“²should“b˜e“¸“²0).ަ‘øãThis–UUpredicate“is“an“in¸ãterface“to“the“C“Unix“function“Ålseek(2)².ޤ‘øãÄErrorsŽŸkæd‘øãŸ¡€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Whence–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Offset–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Whence–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýWhence)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Whence–UU²is“an“atom“but“not“a“v‘ÿqÇalid“stream“seekŽŸ ‘methoGdŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“seek‘¡E‰ff&fŽ“method,‘?ýWhence)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Offset–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýOffset)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘NewOffset–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýNewOffset)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²has“stream“propGert¸ãy‘xâÅreposition(false)ŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(reposition,‘?ýstream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“text“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(reposition,‘?ýtext‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸmØ+‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%¦Ç‘øãÄ7.10.15Ž‘'†…Åcharacter‘¡E‰ff&fŽ‘Ç«count/2ŽŸuT‘øãÄT‘ÿ «emplatesަ‘ã Åcharacter‘¡E‰ff&fŽ–Ç«count(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?integer)ަ‘øãÄDescriptionŽ¡‘øãÅcharacter‘¡E‰ff&fŽ‘Ç«count(SorA,‘?ýCount)–æ8²uni es›æ7ÅCount“²with˜the“n•¸ãum“bGer‘æ8of˜c“haracters/b“ytes–æ8read/written˜on“theŽŸ ‘øãstream–UUassoGciated“with“stream-term“or“alias“ÅSorA².Ž¡‘øãÄErrorsŽŸ.ÿ‘øãŸÞæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Count–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýCount)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ0qÆ‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŽŸŽŒ‹M!Ò Ú‹– ý"EŸüfd‘øã²7.10‘ StreamsŽŽŽ’¶!77ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.10.16Ž‘'†…Åline‘¡E‰ff&fŽ‘Ç«count/2Ž©uT‘øãÄT‘ÿ «emplatesޤ‘ã Åline‘¡E‰ff&fŽ–Ç«count(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?integer)Ž¡‘øãÄDescriptionޤ‘øãÅline‘¡E‰ff&fŽ‘Ç«count(SorA,‘?ýCount)–Ö\²uni es“ÅCount“²with›Ö]the“n•¸ãum“bGer–Ö\of“lines“read/written“on˜the“stream“assoGciatedŽŸ ‘øãwith–UUthe“stream-term“or“alias“ÅSorA².“This“predicate“can“only“bGe“used“on“text“streams.Ž¡‘øãÄErrorsŽŸ:³2‘øãŸÒ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Count–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýCount)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(access,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ<¤ù‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.10.17Ž‘'†…Åline‘¡E‰ff&fŽ‘Ç«position/2ަ‘øãÄT‘ÿ «emplatesޤ‘ã Åline‘¡E‰ff&fŽ–Ç«position(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?integer)Ž¡‘øãÄDescriptionŽ©‘øãÅline‘¡E‰ff&fŽ‘Ç«position(SorA,‘?ýCount)–C²uni es›CÅCount“²with˜the“n•¸ãum“bGer˜of‘Cc“haracters˜read/written–Con˜the“curren¸ãtޤ ‘øãline–ÿèof“the›ÿéstream“assoGciated“with“the˜stream-term“or“alias“ÅSorA².“This˜predicate“can“only“bGe˜used“on“textŽ¡‘øãstreams.ަ‘øãÄErrorsŽŸ:³2‘øãŸÒ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Count–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýCount)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(access,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ<¤ù‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.10.18Ž‘'†…Åstream‘¡E‰ff&fŽ–Ç«line‘¡E‰ff&fŽ“column/3ŽŸuT‘øãÄT‘ÿ «emplatesŽŽŸŽŒ‹N3r Ú‹– ý"EŸüfd‘øã²78ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Åstream‘¡E‰ff&fŽ–Ç«line‘¡E‰ff&fŽ“column(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,–?ý?integer,“?integer)ŽŸ‘øãÄDescriptionŽ©‘øãÅstream‘¡E‰ff&fŽ–Ç«line‘¡E‰ff&fŽ“column(SorA,–?ýLine,“Column)–Ó2²uni es“ÅLine›Ó3²(resp.‘ë^ÅColumn²)“with“the˜currenš¸ãt“line“n˜um˜bGerޤ ‘øã(resp.‘¿Jcolumn›o,n•¸ãum“bGer)–o+of˜the“stream˜assoGciated“with˜the“stream-term˜or“alias˜ÅSorA².“This˜predicate“canŽ¡‘øãonly–ŸTbGe›ŸUused“on“text˜streams.‘OÅNote“that“ÅLine“²correspGonds˜to“the“v‘ÿqÇalue˜returned“b¸ãy‘ÂáÅline‘¡E‰ff&fŽ‘Ç«count/2˜²+“1Ž¡‘øã(section–¸7.10.16,‘нpage›¸77)“and“ÅColumn˜²to“the˜v‘ÿqÇalue“returned“b¸ãy‘Û›Åline‘¡E‰ff&fŽ‘Ç«position/2“²+“1˜(section“7.10.17,Ž¡‘øãpage‘UU77).ަ‘øãÄErrorsŽŸ@æe‘øãŸÌ€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Line–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýLine)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Column–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýColumn)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(access,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸBØ,‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.10.19Ž‘'†…Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“line‘¡E‰ff&fŽ“column/3ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“line‘¡E‰ff&fŽ“column(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,–?ý+integer,“+integer)Ž¡‘øãÄDescriptionަ‘øãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“line‘¡E‰ff&fŽ“column(SorA,–?ýLine,“Column)–H`²sets“the›Hastream“pGosition“of“the˜stream“assoGciated“withޤ ‘øãthe–ifstream-term›ieor“alias“ÅSorA‘i`²according“to“the“line˜n•¸ãum“bGer–ifÅLine“²and“the˜column“n•¸ãum“bGer‘ifÅColumn².‘­ùThisŽ¡‘øãpredicate–ãxcan“only“bšGe“used“on“text“streams.‘0It“ rst“rep˜ositions“the“stream“to“the“b˜eginning“of“the“ leŽ¡‘øãand–UUthen“reads“cš¸ãharacter“b˜y“c˜haracter“un˜til“the“required“pGosition“is“reac˜hed.ަ‘øãÄErrorsŽŸYþ‘øãŸ³æh‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Line–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Column–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Line–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýLine)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Column–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýColumn)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(reposition,ŽŸ ’éÒqbinary‘¡E‰ff&fŽ‘Ç«stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²has“stream“propGert¸ãy‘xâÅreposition(false)ŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(reposition,‘?ýstream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸ[qÅ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŽŸŽŒ‹O@ Ú‹– ý"EŸüfd‘øã²7.10‘ StreamsŽŽŽ’¶!79ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.10.20Ž‘'†…Åadd‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“alias/2Ž©uT‘øãÄT‘ÿ «emplatesޤ‘ã Åadd‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“alias(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+atom)Ž¡‘øãÄDescriptionޤ‘øãÅadd‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“alias(SorA,‘?ýAlias)–~²adds“ÅAlias“²as›a“new“alias“to“the“stream˜assoGciated“with“the“stream-ŽŸ ‘øãterm–UUor“alias“ÅSorA².Ž¡‘øãÄErrorsŽŸ@æe‘øãŸÌ€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Alias–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Alias–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAlias)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Alias–UU²is“already“assošGciated“with“an“op˜en“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(add‘¡E‰ff&fŽ“alias,‘?ýsource‘¡E‰ff&fŽ“sink,ŽŸ ’éÒqalias(Alias))ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸBØ,‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.10.21Ž‘'†…Åcurrent‘¡E‰ff&fŽ‘Ç«alias/2ަ‘øãÄT‘ÿ «emplatesޤ‘ã Åcurrent‘¡E‰ff&fŽ‘Ç«alias(?stream,‘?ý?atom)Ž¡‘øãÄDescriptionŽ©‘øãÅcurrent‘¡E‰ff&fŽ›Ç«alias(Stream,‘?ýAlias)–eI²succeeds“if‘,fÅcurrent‘¡E‰ff&fŽ˜stream(Stream)‘eJ²succeeds“(section“7.10.9,‘•Lpage“73)ޤ ‘øãand–ºHif‘eÅAlias“²uni es“with“one“of“the“aliases“of‘ºIthe“stream.‘  It“can“bGe“de ned“using‘ÝÕÅstream‘¡E‰ff&fŽ‘Ç«property/2Ž¡‘øã²(section–UU7.10.10,“page“73).‘qÇThis“predicate“is“re-executable“on“bac•¸ãktrac“king.ަ‘øãÄErrorsŽŸ™‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅStream–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-termŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýStream)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Alias–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAlias)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.10.22Ž‘'†…Åadd‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“mirror/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åadd‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“mirror(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias)Ž¡‘øãÄDescriptionŽŽŸŽŒ‹PSp Ú‹– ý"EŸüfd‘øã²80ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅadd‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“mirror(SorA,‘?ýMirror)–éϲadds“the›éÎstream“assoGciated“with“the“stream-term“or˜alias“ÅMirror“²asޤ ‘øãa–Šnew“mirror“to“the“stream“assoGciated“with“the“stream-term‘Šor“alias“ÅSorA².“After“this,‘—,all“c¸ãharacters“(orŽ¡‘øãbš¸ãytes)–i×read“from“(or“written“to)“ÅSorA‘iÒ²are“also“written“to“ÅMirror².‘¯NThis“mirroring“oGccurs“un˜til“ÅMirror“²isŽ¡‘øãexplicitely›—yremo•¸ãv“ed˜using‘»Åremove‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“mirror/2˜²(section˜7.10.23,‘½rpage˜80)˜or‘—zimplicitely˜when˜ÅMirrorŽ¡‘øã²is–—¾closed.‘9Sev¸ãeral“mirror“streams‘—½can“bšGe“asso˜ciated“with›—½a“same“stream.‘9If‘^ÛÅMirror“²represen¸ãts˜the“sameŽ¡‘øãstream–UUas“ÅSorA“²or“if‘rÅMirror“²is“already“a“mirror“for“ÅSorA²,“no“mirror“is“added.ޤ‘øãÄErrorsŽŸG˜‘øãŸÆLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Mirror–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Mirror–& ²is›& neither“a˜v‘ÿqÇariable˜nor“a“stream-term˜orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýMirror)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Mirror–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýMirror)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Mirror–UU²is“an“input“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(output,–?ýstream,“Mirror)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸI _‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.Ž©%¿'‘øãÄ7.10.23Ž‘'†…Åremove‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“mirror/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸÛ‘ã Åremove‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“mirror(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias)ŽŸÛ‘øãÄDescriptionŽ¡‘øãÅremove‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“mirror(SorA,‘?ýMirror)›ªg²remo•¸ãv“es–ªhthe˜stream˜assoGciated“with˜the˜stream-term“or˜aliasޤ ‘øãÅMirror–y7²from›y6the“list“of“mirrors˜of“the“stream˜assoGciated“with“the˜stream-term“or“alias“ÅSorA².˜This“predicateŽ¡‘øãfails–UUif‘rÅMirror“²is“not“a“mirror“stream“for“ÅSorA².ޤ‘øãÄErrorsŽŸ@æe‘øãŸÌ€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Mirror–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Mirror–& ²is›& neither“a˜v‘ÿqÇariable˜nor“a“stream-term˜orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýMirror)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Mirror–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýMirror)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸBØ,‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ަ‘øãÄ7.10.24Ž‘'†…Åcurrent‘¡E‰ff&fŽ‘Ç«mirror/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸÛ‘ã Åcurrent‘¡E‰ff&fŽ‘Ç«mirror(?stream,‘?ý?stream)ŽŽŸŽŒ‹Q_° Ú‹– ý"EŸüfd‘øã²7.10‘ StreamsŽŽŽ’¶!81ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄDescriptionŽ©‘øãÅcurrent‘¡E‰ff&fŽ–Ç«mirror(Stream,‘?ýM)‘Zß²succeeds›["if‘"@Åcurrent‘¡E‰ff&fŽ“stream(Stream)˜²succeeds‘[#(section˜7.10.9,‘œ–page˜73)ޤ ‘øãand– yif‘g–ÅM‘ #²uni es“with› xone“of“the“mirrors˜of“the“stream.‘S2It“can“bGe˜de ned“using‘ÄÅstream‘¡E‰ff&fŽ‘Ç«property/2Ž¡‘øã²(section–UU7.10.10,“page“73).‘qÇThis“predicate“is“re-executable“on“bac•¸ãktrac“king.ަ‘øãÄErrorsŽŸ™‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅStream–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-termŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýStream)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘M–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-termŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýM)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.10.25Ž‘'†…Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“type/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“type(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+atom)Ž¡‘øãÄDescriptionަ‘øãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“type(SorA,‘?ýType)–¤¡²upšGdates‘¤ the“t¸ãyp˜e“asso˜ciated“with›¤ stream-term“or“alias“ÅSorA².˜The“v‘ÿqÇalueޤ ‘øãof‘ØÅType–Qº²is›Q»an“atom˜in˜Åtext“²or˜Åbinary“²as˜for˜Åopen/4“²(section˜7.10.6,‘Rspage“70).‘p”The˜t¸ãypGe“of˜a“stream˜canŽ¡‘øãonly–UUbšGe“c¸ãhanged“b˜efore“an¸ãy“input/output“op˜eration“is“executed.ަ‘øãÄErrorsŽŸ@æe‘øãŸÌ€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Type–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Type–UU²is“neither“a“v›ÿqÇariable“nor“a“v˜alid“t¸ãypGeŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“type,‘?ýType)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²An–UUI/O“opšGeration“has“already“b˜een“executed“onŽŸ ‘ÅSorAŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(modify,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸBØ,‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.10.26Ž‘'†…Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“eof‘¡E‰ff&fŽ“action/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“eof‘¡E‰ff&fŽ“action(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+atom)Ž¡‘øãÄDescriptionަ‘øãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“eof‘¡E‰ff&fŽ“action(SorA,‘?ýAction)–Ðx²upšGdates“the“Åeof‘¡E‰ff&fŽ‘Ç«action“²option‘Ðwasso˜ciated“with“the“stream-ޤ ‘øãterm–çor“alias“ÅSorA².“The“v‘ÿqÇalue“of‘GÅAction“²is“one“of“the“atoms“Åerror²,‘ÊŒÅeof‘¡E‰ff&fŽ‘Ç«code²,‘Ê‹Åreset“²as“for“Åopen/4Ž¡‘øã²(section–UU7.10.6,“page“70).ަ‘øãÄErrorsŽŽŸŽŒ‹Rq- Ú‹– ý"EŸüfd‘øã²82ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýƒª‘øãŸÒ€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Action–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Action–£²is“neither“a“v›ÿqÇariable‘¢nor“a“v˜alid“eof“actionŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(eof‘¡E‰ff&fŽ“action,‘?ýAction)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(modify,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ<Ø,‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.10.27Ž‘'†…Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“buffering/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“buffering(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+atom)Ž¡‘øãÄDescriptionަ‘øãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“buffering(SorA,‘?ýBuffering)–И²upšGdates“the‘Йbu ering“mo˜de“asso˜ciated“with‘Йthe“stream-termޤ ‘øãor–uhalias“ÅSorA².“The›uiv‘ÿqÇalue“of‘<…ÅBuffering“²is“one“of“the“atoms˜Ånone²,‘½lÅline“²or“Åblock˜²as“for“Åopen/4“²(sec-Ž¡‘øãtion›O³7.10.6,‘ŽKpage–O´70).‘`âThis“predicate˜ma¸ãy˜only“bGe˜used“after˜opGening“a˜stream“and˜bGefore“an¸ãy˜otherŽ¡‘øãopGerations›UUha•¸ãv“e˜b•Geen˜p“erformed˜on˜it.ަ‘øãÄErrorsŽŸ:³2‘øãŸÒ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Buffering–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Buffering–UU²is“neither“a“v›ÿqÇariable“nor“a“v˜alidŽŸ ‘bu ering‘UUmoGdeŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(buffering‘¡E‰ff&fŽ“mode,‘?ýBuffering)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽŸ<¤ù‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ'þ6‘øãÇ7.11Ž‘cConstan t–€term“streamsޤuT‘øãÄ7.11.1Ž‘!ƇIn®9troQÇductionŽ¡‘øã²Constanš¸ãt–vterm‘wstreams“allo˜w›wthe“user˜to“consider“a˜constan¸ãt“term˜(atom,‘|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.11.2Ž‘!ƇÅopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/2Ä,‘ÕTÅopen‘¡E‰ff&fŽ“input‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream/2Ä,ޤ ‘!ƇÅopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸLe‘ã Åopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream(+atom,‘?ý-stream)Ž¡‘ã open‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream(+character‘¡E‰ff&fŽ“list,‘?ý-stream)Ž¡‘ã open‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream(+character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list,‘?ý-stream)ŽŸLf‘øãÄDescriptionŽ©‘øãÅopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream(Atom,‘?ýStream)–3Õ²uni es›3ÖÅStream“²with˜the“stream-term˜whic¸ãh“is˜assoGciated“withŽ¡‘øãa–UUnew“input“text-stream“whose“data“are“the“c¸ãharacters“of‘rÅAtom².ަ‘øãÅopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream(Chars,‘?ýStream)–ñ+²is“similar“to“Åopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/2–ñ+²except“that“dataŽ¡‘øãare–UUthe“con•¸ãten“t–UUof“the“c¸ãharacter“list“ÅChars².ަ‘øãÅopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream(Codes,‘?ýStream)–ñ+²is“similar“to“Åopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/2–ñ+²except“that“dataŽ¡‘øãare–UUthe“con•¸ãten“t–UUof“the“c¸ãharacter“coGde“list“ÅCodes².ަ‘øãÄErrorsŽŸk³1‘øãŸ¡³5‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅStream–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStream)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Chars–UU²is“a“partial“list“or“a“list“with“an“elemen¸ãt“ÅEŽŸ ‘²whic¸ãh–UUis“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Codes–UU²is“a“partial“list“or“a“list“with“an“elemen¸ãt“ÅEŽŸ ‘²whic¸ãh–UUis“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom–UU²is“neither“a“v‘ÿqÇariable“nor“a“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Chars–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýChars)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Codes–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýCodes)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅChars“²list“is“neither“aŽŸ ‘v‘ÿqÇariable–UUnor“a“c¸ãharacterŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅCodes“²list“is“neither“aŽŸ ‘v‘ÿqÇariable–UUnor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemenš¸ãt“ÅE“²of“the“ÅCodes“²list“is“an“in˜teger“butŽŸ ‘not–UUa“c¸ãharacter“coGdeŽŽ’㥄ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(character‘¡E‰ff&fŽ“code)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸm¤ø‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%iT‘øãÄ7.11.3Ž‘!ƇÅclose‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/1Ä,‘ÕTÅclose‘¡E‰ff&fŽ“input‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream/1Ä,Ž¡‘!ƇÅclose‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream/1ŽŸuT‘øãÄT‘ÿ «emplatesŽŸLf‘ã Åclose‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias)Ž¡‘ã close‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias)Ž¡‘ã close‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias)ŽŸLe‘øãÄDescriptionަ‘øãÅclose‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream(SorA)‘/Û²closes–0the“constan¸ãt“term›0stream“assoGciated“with“the˜stream-term“orŽ¡‘øãalias–UUÅSorA².“ÅSorA“²m¸ãust“a“stream“opGen“with“Åopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/2–UU²(section“7.11.1,“page“82).ަ‘øãÅclose‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream(SorA)–UU²acts“similarly“for“a“c¸ãharacter“list“stream.ŽŽŸŽŒ‹Tã Ú‹– ý"EŸüfd‘øã²84ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅclose‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream(SorA)–UU²acts“similarly“for“a“c¸ãharacter“coGde“list“stream.ޤ‘øãÄErrorsŽŸ:³2‘øãŸÒ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(close,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“a“stream-term“or“alias“but“doGes“not“referŽŸ ‘to–UUa“constan¸ãt“term“stream.ŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(term‘¡E‰ff&fŽ“stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ<¤ù‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.11.4Ž‘!ƇÅopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/1Ä,‘ÕTÅopen‘¡E‰ff&fŽ“output‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream/1Ä,ޤ ‘!ƇÅopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream(-stream)Ž¡‘ã open‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream(-stream)Ž¡‘ã open‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream(-stream)ަ‘øãÄDescriptionŽ©‘øãÅopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream(Stream)–ü²uni es“ÅStream“²with“the“stream-term‘ü‚whic¸ãh“is“assoGciated“with“a“newŽ¡‘øãoutput–y0text-stream.‘ÝXAll›y1c¸ãharacters“written“to“this“stream“are“collected“and“will˜bGe“returned“as“an“atomŽ¡‘øãwhen–UUthe“stream“is“closed“b¸ãy‘xâÅclose‘¡E‰ff&fŽ–Ç«ouput‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/2–UU²(section“7.11.5,“page“84).ަ‘øãÅopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream(Stream)–[ç²is›[èsimilar“to“Åopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/1–[ç²except˜that“the“resultŽ¡‘øãwill–UUbGe“a“c¸ãharacter“list.ަ‘øãÅopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream(Stream)–[ç²is›[èsimilar“to“Åopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/1–[ç²except˜that“the“resultŽ¡‘øãwill–UUbšGe“a“c¸ãharacter“co˜de“list.ަ‘øãÄErrorsަ‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅStream–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStream)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¦‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.11.5Ž‘!ƇÅclose‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/2Ä,‘ÕTÅclose‘¡E‰ff&fŽ“output‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream/2Ä,Ž¡‘!ƇÅclose‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åclose‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?atom)Ž¡‘ã close‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?character‘¡E‰ff&fŽ“list)Ž¡‘ã close‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list)ަ‘øãÄDescriptionŽŽŸŽŒ‹U£ Ú‹– ý"EŸüfd‘øã²7.12‘ Character‘UUinput/outputŽŽŽ’¶!85ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅclose‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream(SorA,‘?ýAtom)–Øö²closes“the“constan¸ãt“term“stream“assoGciated“with“the“stream-ޤ ‘øãterm–óÅor“alias›óÆÅSorA².“ÅSorA‘óZ²m¸ãust“b•Ge˜asso“ciated–óÅwith“a“stream˜opGen“with“Åopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/1Ž¡‘øã²(section›…7.11.4,‘#âpage–†84).‘],ÅAtom“²is˜uni ed˜with˜an“atom˜formed˜with“all˜c¸ãharacters˜written˜on“the˜stream.ޤ‘øãÅclose‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream(SorA,‘?ýChars)–UU²acts“similarly“for“a“c¸ãharacter“list“stream.Ž¡‘øãÅclose‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream(SorA,‘?ýCodes)–UU²acts“similarly“for“a“c¸ãharacter“coGde“list“stream.Ž¡‘øãÄErrorsŽŸMLË‘øãŸÀ›‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Chars–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýChars)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Codes–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýCodes)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“input“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(close,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“a“stream-term“or“alias“but“doGes“not“referŽŸ ‘to–UUa“constan¸ãt“term“streamŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(term‘¡E‰ff&fŽ“stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸO>’‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ'þ6‘øãÇ7.12Ž‘cCharacter‘€input/outputŽ©uT‘øã²These–ÌÞbuilt-in›ÌÝpredicates“enable“a˜single“c¸ãharacter“or˜c¸ãharacter“coGde˜to“bGe“input˜from“and“output˜to“aޤ ‘øãtext– éstream.‘Y£The› èatom“Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“file– é²is“returned˜as“c¸ãharacter“to˜indicate“the“end-of- le.‘Y£Å-1“²is˜returned“asŽ¡‘øãc¸ãharacter–UUcoGde“to“indicate“the“end-of- le.ŽŸ%þ6‘øãÄ7.12.1Ž‘!ƇÅget‘¡E‰ff&fŽ–Ç«char/2Ä,›ÕTÅget‘¡E‰ff&fŽ“char/1Ä,˜Åget‘¡E‰ff&fŽ“code/1Ä,˜Åget‘¡E‰ff&fŽ“code/2ަ‘øãÄT‘ÿ «emplatesŽ©‘ã Åget‘¡E‰ff&fŽ–Ç«char(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?in‘¡E‰ff&fŽ“character)Ž¡‘ã get‘¡E‰ff&fŽ–Ç«char(?in‘¡E‰ff&fŽ“character)Ž¡‘ã get‘¡E‰ff&fŽ–Ç«code(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?in‘¡E‰ff&fŽ“character‘¡E‰ff&fŽ“code)Ž¡‘ã get‘¡E‰ff&fŽ–Ç«code(?in‘¡E‰ff&fŽ“character‘¡E‰ff&fŽ“code)ަ‘øãÄDescriptionŽ©‘øãÅget‘¡E‰ff&fŽ‘Ç«char(SorA,‘?ýChar)›Ÿ²succeeds–žif‘Õ¼ÅChar“²uni es˜with˜the“next˜c¸ãharacter˜read“from˜the“stream˜assoGciatedŽ¡‘øãwith–UUthe“stream-term“or“alias“ÅSorA².ަ‘øãÅget‘¡E‰ff&fŽ›Ç«code/2–UU²is“similar“to“Åget‘¡E‰ff&fŽ˜char/2“²but“deals“with“c¸ãharacter“coGdes.ަ‘øãÅget‘¡E‰ff&fŽ›Ç«char/1–UU²and“Åget‘¡E‰ff&fŽ˜code/1“²apply“to“the“curren¸ãt“input“stream.ަ‘øãÄErrorsŽŽŸŽŒ‹V²Ð Ú‹– ý"EŸüfd‘øã²86ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý­Õv‘øãŸ§³5‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Char–UU²is“neither“a“v‘ÿqÇariable“nor“an“in-c¸ãharacterŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(in‘¡E‰ff&fŽ“character,‘?ýChar)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýCode)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(input,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²has“stream“propGertiesŽŸ ‘Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“stream(past)–UU²and“Åeof‘¡E‰ff&fŽ‘Ç«action(error)ŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(input,ŽŸ ’éÒqpast‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²The›UUen•¸ãtit“y˜input˜from˜the˜stream˜is˜not˜aŽŸ ‘c¸ãharacterŽŽ’㥄ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ‘Ç«error(character)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“an“inš¸ãteger“but“not“an“in-c˜haracter“coGdeŽŽ’㥄 ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(in‘¡E‰ff&fŽ“character‘¡E‰ff&fŽ“code)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽŸg¤ø‘øãÄP•®9ortabilit“yŽŸ‘øã²ISO‘UUpredicates.ŽŸ%þ6‘øãÄ7.12.2Ž‘!ƇÅget‘¡E‰ff&fŽ–Ç«key/2Ä,›ÕTÅget‘¡E‰ff&fŽ“key/1˜get‘¡E‰ff&fŽ“key‘¡E‰ff&fŽ“no‘¡E‰ff&fŽ“echo/2Ä,˜Åget‘¡E‰ff&fŽ“key‘¡E‰ff&fŽ“no‘¡E‰ff&fŽ“echo/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åget‘¡E‰ff&fŽ–Ç«key(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?integer)ޤ ‘ã get‘¡E‰ff&fŽ‘Ç«key(?integer)Ž¡‘ã get‘¡E‰ff&fŽ–Ç«key‘¡E‰ff&fŽ“no‘¡E‰ff&fŽ“echo(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?integer)Ž¡‘ã get‘¡E‰ff&fŽ–Ç«key‘¡E‰ff&fŽ“no‘¡E‰ff&fŽ“echo(?integer)ަ‘øãÄDescriptionŽ©‘øãÅget‘¡E‰ff&fŽ‘Ç«key(Code,‘?ýSorA)‘(ê²succeeds–)!if‘ð>ÅCode“²uni es“with›) the“c¸ãharacter“coGde“of“the“next˜k¸ãey“read“from“theŽ¡‘øãstream–xÌassoGciated›xËwith“the˜stream-term“or“alias˜ÅSorA².“It˜is“in¸ãtended“to˜read“a“single˜k¸ãey“from˜the“k¸ãeybGoardŽ¡‘øã(thš¸ãus–ŸÅSorA‘žé²should“refer“to“curren˜t“input“stream).‘5No“bu ering“is‘ŸpGerformed“(a“c˜haracter“is“read‘Ÿas“soGon“asŽ¡‘øãaš¸ãv‘ÿqÇailable)–ë\and‘ë[function“k˜eys“can“also›ë[bGe“read“(in˜that“case,‘ŽÅCode“²is˜an“in¸ãteger“µ>˜²255).‘NuThe˜read“c¸ãharacterŽ¡‘øãis–UUecš¸ãhoGed“if“it“is“prin˜table.ަ‘øãThis–„îfacilit¸ãy›„ïis“only˜pGossible“if˜the“Ålinedit“²facilit¸ãy˜has“bGeen˜installed“(section“3.2.5,‘Õpage˜18)“otherwiseŽ¡‘øãÅget‘¡E‰ff&fŽ‘Ç«key/2›Üd²bGeha•¸ãv“es˜similarly˜to˜Åget‘¡E‰ff&fŽ‘Ç«code/2˜²(section˜7.12.1,‘þ(page˜85)˜(the˜coGde˜of˜the˜ rst˜c“haracter˜isŽ¡‘øãreturned)–'but›&also“pumps“remaining˜cš¸ãharacters“un˜til“a‘&c˜haracter“µ<“²space›&(0x20)“is“read˜(in“particularŽ¡‘øãRETURN).–æ|ŽŽŽŽ ÃÝ» ý•;Ý‘øãŸÀLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýCode)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(input,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²has“stream“propGertiesŽŸ ‘Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“stream(past)–UU²and“Åeof‘¡E‰ff&fŽ‘Ç«action(error)ŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(input,ŽŸ ’éÒqpast‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸO _‘øãÄP•®9ortabilit“yŽŸ‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.12.3Ž‘!ƇÅpeek‘¡E‰ff&fŽ–Ç«char/2Ä,›ÕTÅpeek‘¡E‰ff&fŽ“char/1Ä,˜Åpeek‘¡E‰ff&fŽ“code/1Ä,˜Åpeek‘¡E‰ff&fŽ“code/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åpeek‘¡E‰ff&fŽ–Ç«char(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?in‘¡E‰ff&fŽ“character)ޤ ‘ã peek‘¡E‰ff&fŽ–Ç«char(?in‘¡E‰ff&fŽ“character)Ž¡‘ã peek‘¡E‰ff&fŽ–Ç«code(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?in‘¡E‰ff&fŽ“character‘¡E‰ff&fŽ“code)Ž¡‘ã peek‘¡E‰ff&fŽ–Ç«code(?in‘¡E‰ff&fŽ“character‘¡E‰ff&fŽ“code)ަ‘øãÄDescriptionŽ©‘øãÅpeek‘¡E‰ff&fŽ‘Ç«char(SorA,‘?ýChar)–”°²succeeds“if‘[ÍÅChar“²uni es“with“the‘”±next“c¸ãharacter“that“will“bGe“read“from“theŽ¡‘øãstream–UUassoGciated“with“the“stream-term“or“alias“ÅSorA².“The“c¸ãharacter“is“not“read.ަ‘øãÅpeek‘¡E‰ff&fŽ›Ç«code/2–UU²is“similar“to“Åpeek‘¡E‰ff&fŽ˜char/2“²but“deals“with“c¸ãharacter“coGdes.ަ‘øãÅpeek‘¡E‰ff&fŽ›Ç«char/1–UU²and“Åpeek‘¡E‰ff&fŽ˜code/1“²apply“to“the“curren¸ãt“input“stream.ަ‘øãÄErrorsŽŸe³1‘øãŸ§³5‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Char–UU²is“neither“a“v‘ÿqÇariable“nor“an“in-c¸ãharacterŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(in‘¡E‰ff&fŽ“character,‘?ýChar)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýCode)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(input,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²has“stream“propGertiesŽŸ ‘Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“stream(past)–UU²and“Åeof‘¡E‰ff&fŽ‘Ç«action(error)ŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(input,ŽŸ ’éÒqpast‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²The›UUen•¸ãtit“y˜input˜from˜the˜stream˜is˜not˜aŽŸ ‘c¸ãharacterŽŽ’㥄ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ‘Ç«error(character)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“an“inš¸ãteger“but“not“an“in-c˜haracter“coGdeŽŽ’㥄 ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(in‘¡E‰ff&fŽ“character‘¡E‰ff&fŽ“code)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽŸg¤ø‘øãÄP•®9ortabilit“yަ‘øã²ISO‘UUpredicates.ŽŽŸŽŒ‹XÔr Ú‹– ý"EŸüfd‘øã²88ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.12.4Ž‘!ƇÅunget‘¡E‰ff&fŽ–Ç«char/2Ä,›ÕTÅunget‘¡E‰ff&fŽ“char/1Ä,˜Åunget‘¡E‰ff&fŽ“code/2Ä,˜Åunget‘¡E‰ff&fŽ“code/1ŽŸuT‘øãÄT‘ÿ «emplatesŽŸLe‘ã Åunget‘¡E‰ff&fŽ–Ç«char(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+character)ޤ ‘ã unget‘¡E‰ff&fŽ‘Ç«char(+character)Ž¡‘ã unget‘¡E‰ff&fŽ–Ç«code(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+character‘¡E‰ff&fŽ“code)Ž¡‘ã unget‘¡E‰ff&fŽ–Ç«code(+character‘¡E‰ff&fŽ“code)ŽŸLf‘øãÄDescriptionŽ©‘øãÅunget‘¡E‰ff&fŽ‘Ç«char(SorA,‘?ýChar)–»²pushes‘ºbacš¸ãk“ÅChar“²on˜to›ºthe“stream“assoGciated˜with“the“stream-term˜or“aliasŽ¡‘øãÅSorA².–òkÅChar“²will“bGe“the‘òjnext“cš¸ãharacter“read“b˜y‘øÅget‘¡E‰ff&fŽ‘Ç«char/2².‘PÏThe“maxim˜um‘òjn˜um˜bGer“of“c˜haracters“that“canŽ¡‘øãbGe›UUcum•¸ãulativ“ely˜pushed˜bac“k˜is˜giv“en˜b“y˜the˜Åmax‘¡E‰ff&fŽ‘Ç«unget˜²Prolog˜ ag˜(section˜7.22.1,˜page˜133).ަ‘øãÅunget‘¡E‰ff&fŽ›Ç«code/2–UU²is“similar“to“Åunget‘¡E‰ff&fŽ˜char/2“²but“deals“with“c¸ãharacter“coGdes.ަ‘øãÅunget‘¡E‰ff&fŽ›Ç«char/1–UU²and“Åunget‘¡E‰ff&fŽ˜code/1“²apply“to“the“curren¸ãt“input“stream.ަ‘øãÄErrorsŽŸY³1‘øãŸ³³5‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Char–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Char–UU²is“neither“a“v‘ÿqÇariable“nor“a“c¸ãharacterŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýChar)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýCode)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(input,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“an“inš¸ãteger“but“not“a“c˜haracter“coGdeŽŽ’㥄 ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(character‘¡E‰ff&fŽ“code)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ[¤ø‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%iT‘øãÄ7.12.5Ž‘!ƇÅput‘¡E‰ff&fŽ–Ç«char/2Ä,›ÕTÅput‘¡E‰ff&fŽ“char/1Ä,˜Åput‘¡E‰ff&fŽ“code/1Ä,˜Åput‘¡E‰ff&fŽ“code/2Ä,˜Ånl/1Ä,˜Ånl/0ŽŸuT‘øãÄT‘ÿ «emplatesŽŸLf‘ã Åput‘¡E‰ff&fŽ–Ç«char(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+character)Ž¡‘ã put‘¡E‰ff&fŽ‘Ç«char(+character)Ž¡‘ã put‘¡E‰ff&fŽ–Ç«code(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+character‘¡E‰ff&fŽ“code)Ž¡‘ã put‘¡E‰ff&fŽ–Ç«code(+character‘¡E‰ff&fŽ“code)Ž¡‘ã nl(+stream‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“alias)Ž¡‘ã nlŽŸLe‘øãÄDescriptionަ‘øãÅput‘¡E‰ff&fŽ‘Ç«char(SorA,‘?ýChar)–UU²writes“ÅChar“²on¸ãto“the“stream“assoGciated“with“the“stream-term“or“alias“ÅSorA².ަ‘øãÅput‘¡E‰ff&fŽ›Ç«code/2–UU²is“similar“to“Åput‘¡E‰ff&fŽ˜char/2“²but“deals“with“c¸ãharacter“coGdes.ަ‘øãÅnl(SorA)‘D¿²writes–Dýa“new-line‘Dücš¸ãharacter“on˜to“the“stream›DüassoGciated“with“the“stream-term˜or“alias“ÅSorA².Ž¡‘øãThis–UUis“equiv‘ÿqÇalen¸ãt“to“Åput‘¡E‰ff&fŽ‘Ç«char(SorA,‘?ý'\n')².ŽŽŸŽŒ‹YèA Ú‹– ý"EŸüfd‘øã²7.13‘ Byte‘UUinput/outputŽŽŽ’¶!89ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅput‘¡E‰ff&fŽ–Ç«char/1²,›UUÅput‘¡E‰ff&fŽ“code/1˜²and˜Ånl/0˜²apply˜to˜the˜curren¸ãt˜output˜stream.ޤ‘øãÄErrorsŽŸY³1‘øãŸ³³5‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Char–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Char–UU²is“neither“a“v‘ÿqÇariable“nor“a“c¸ãharacterŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýChar)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýCode)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“input“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(output,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(output,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“an“inš¸ãteger“but“not“a“c˜haracter“coGdeŽŽ’㥄 ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(character‘¡E‰ff&fŽ“code)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ[¤ø‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicates.ŽŸ'þ6‘øãÇ7.13Ž‘cByte‘€input/outputޤuT‘øã²These–%õbuilt-in›%öpredicates“enable˜a“single˜b¸ãyte“to˜bGe“input˜from“and“output˜to“a˜binary“stream.‘ã©Å-1“²isŽ© ‘øãreturned–UUto“indicate“the“end-of- le.ŽŸ%þ6‘øãÄ7.13.1Ž‘!ƇÅget‘¡E‰ff&fŽ–Ç«byte/2Ä,‘ÕTÅget‘¡E‰ff&fŽ“byte/1Ž¡‘øãÄT‘ÿ «emplatesޤ‘ã Åget‘¡E‰ff&fŽ–Ç«byte(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?in‘¡E‰ff&fŽ“byte)ަ‘ã get‘¡E‰ff&fŽ–Ç«byte(?in‘¡E‰ff&fŽ“byte)Ž¡‘øãÄDescriptionޤ‘øãÅget‘¡E‰ff&fŽ‘Ç«byte(SorA,‘?ýByte)–ûJ²succeeds“if‘ÂgÅByte“²uni es“with“the“next“b¸ãyte“read“from“the“stream“assoGciated“withަ‘øãthe–UUstream-term“or“alias“ÅSorA².Ž¡‘øãÅget‘¡E‰ff&fŽ‘Ç«byte/1–UU²applies“to“the“curren¸ãt“input“stream.Ž¡‘øãÄErrorsŽŸM˜‘øãŸÀLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Byte–UU²is“neither“a“v‘ÿqÇariable“nor“an“in-b¸ãyteŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(in‘¡E‰ff&fŽ“byte,‘?ýByte)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“text“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(input,‘?ýtext‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²has“stream“propGertiesŽŸ ‘Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“stream(past)–UU²and“Åeof‘¡E‰ff&fŽ‘Ç«action(error)ŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(input,ŽŸ ’éÒqpast‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸO _‘øãÄP•®9ortabilit“yŽŽŸŽŒ‹Zùd Ú‹– ý"EŸüfd‘øã²90ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãISO‘UUpredicates.ŽŸ%þ6‘øãÄ7.13.2Ž‘!ƇÅpeek‘¡E‰ff&fŽ–Ç«byte/2Ä,‘ÕTÅpeek‘¡E‰ff&fŽ“byte/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åpeek‘¡E‰ff&fŽ–Ç«byte(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?in‘¡E‰ff&fŽ“byte)Ž© ‘ã peek‘¡E‰ff&fŽ–Ç«byte(?in‘¡E‰ff&fŽ“byte)Ž¡‘øãÄDescriptionޤ‘øãÅpeek‘¡E‰ff&fŽ‘Ç«byte(SorA,‘?ýByte)›¼²succeeds–¼Žif‘ƒªÅByte“²uni es˜with˜the“next˜b¸ãyte“that˜will˜bGe“read˜from“the˜streamަ‘øãassoGciated–UUwith“the“stream-term“or“alias“ÅSorA².“The“b¸ãyte“is“not“read.Ž¡‘øãÅpeek‘¡E‰ff&fŽ‘Ç«byte/1–UU²applies“to“the“curren¸ãt“input“stream.Ž¡‘øãÄErrorsŽŸM˜‘øãŸÀLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Byte–UU²is“neither“a“v‘ÿqÇariable“nor“an“in-b¸ãyteŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(in‘¡E‰ff&fŽ“byte,‘?ýByte)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“text“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(input,‘?ýtext‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²has“stream“propGertiesŽŸ ‘Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“stream(past)–UU²and“Åeof‘¡E‰ff&fŽ‘Ç«action(error)ŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(input,ŽŸ ’éÒqpast‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸO _‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicates.ŽŸ%þ6‘øãÄ7.13.3Ž‘!ƇÅunget‘¡E‰ff&fŽ–Ç«byte/2Ä,‘ÕTÅunget‘¡E‰ff&fŽ“byte/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åunget‘¡E‰ff&fŽ–Ç«byte(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+byte)ަ‘ã unget‘¡E‰ff&fŽ‘Ç«byte(+byte)Ž¡‘øãÄDescriptionޤ‘øãÅunget‘¡E‰ff&fŽ‘Ç«byte(SorA,‘?ýByte)–»²pushes‘ºbacš¸ãk“ÅByte“²on˜to›ºthe“stream“assoGciated˜with“the“stream-term˜or“aliasަ‘øãÅSorA².–üÅByte›ý²will“bGe˜the“next˜bš¸ãyte“read“b˜y‘³ŠÅget‘¡E‰ff&fŽ‘Ç«byte/2².‘!½The“maxim˜um‘ýn˜um˜bGer“of‘ýb˜ytes“that‘ýcan“bGeަ‘øãsuccessivš¸ãely–UUpushed“bac˜k“is“giv˜en“b˜y“the“Åmax‘¡E‰ff&fŽ‘Ç«unget“²Prolog“ ag“(section“7.22.1,“page“133).Ž¡‘øãÅunget‘¡E‰ff&fŽ‘Ç«byte/1–UU²applies“to“the“curren¸ãt“input“stream.Ž¡‘øãÄErrorsŽŽŸŽŒ‹[ J Ú‹– ý"EŸüfd‘øã²7.14‘ T‘ÿ*ªerm‘UUinput/outputŽŽŽ’¶!91ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý;Ý‘øãŸÆLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Byte–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Byte–UU²is“neither“a“v‘ÿqÇariable“nor“a“b¸ãyteŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(byte,‘?ýByte)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“text“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(input,‘?ýtext‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸI _‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.13.4Ž‘!ƇÅput‘¡E‰ff&fŽ–Ç«byte/2Ä,‘ÕTÅput‘¡E‰ff&fŽ“byte/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åput‘¡E‰ff&fŽ–Ç«byte(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+byte)ŽŸ ‘ã put‘¡E‰ff&fŽ‘Ç«byte(+byte)Ž¡‘øãÄDescriptionަ‘øãÅput‘¡E‰ff&fŽ‘Ç«byte(SorA,‘?ýByte)–UU²writes“ÅByte“²on¸ãto“the“stream“assoGciated“with“the“stream-term“or“alias“ÅSorA².ަ‘øãÅput‘¡E‰ff&fŽ‘Ç«byte/1–UU²applies“to“the“curren¸ãt“output“stream.ަ‘øãÄErrorsŽŸG˜‘øãŸÆLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Byte–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Byte–UU²is“neither“a“v‘ÿqÇariable“nor“a“b¸ãyteŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(byte,‘?ýByte)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(output,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“text“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(output,‘?ýtext‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸI _‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ'þ6‘øãÇ7.14Ž‘cT‘þàerm‘€input/outputŽŸuT‘øã²These–¤.built-in“predicates“enable“a“Prolog›¤-term“to“bGe“input“from“or“output“to“a“text˜stream.‘^RThe“atomޤ ‘øãÅend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“file–"²is›#returned“as“term“to˜indicate“the“end-of- le.‘^·The“syn¸ãtax“of˜suc¸ãh“terms“can“also˜bGe“alteredŽ¡‘øãb•¸ãy›t™c“hanging–tšthe˜opGerators“(section˜7.14.10,‘|kpage˜100),‘|jand“making˜some“c•¸ãharacters˜equiv‘ÿqÇalen“t‘tšto˜othersŽ¡‘øã(section–›7.14.12,‘¬page“102)“if“the››Åchar‘¡E‰ff&fŽ‘Ç«conversion“²Prolog“ ag“is“Åon“²(section˜7.22.1,‘¬Œpage“133).‘CDoubleŽ¡‘øãquoted–ztokš¸ãens“will“bGe“returned“as“an“atom“or“a“c˜haracter“list“or“a“c˜haracter“cošGde“list“dep˜ending“on“theŽ¡‘øãv‘ÿqÇalue–Pvof›Pwthe“Ådouble‘¡E‰ff&fŽ‘Ç«quotes˜²Prolog“ ag˜(section“7.22.1,›?page“133).‘c,Similarly‘ÿ*ª,˜bacš¸ãk“quoted‘Pwtok˜ens“areŽ¡‘øãreturned–UUdepGending“on“the“v‘ÿqÇalue“of“the“Åback‘¡E‰ff&fŽ‘Ç«quotes“²Prolog“ ag.ŽŽŸŽŒ‹\ä Ú‹– ý"EŸüfd‘øã²92ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.14.1Ž‘!ƇÅread‘¡E‰ff&fŽ–Ç«term/3Ä,›ÕTÅread‘¡E‰ff&fŽ“term/2Ä,˜Åread/2Ä,˜Åread/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åread‘¡E‰ff&fŽ–Ç«term(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,–?ý?term,“+read‘¡E‰ff&fŽ–Ç«option‘¡E‰ff&fŽ“list)ޤ ‘ã read‘¡E‰ff&fŽ–Ç«term(?term,‘?ý+read‘¡E‰ff&fŽ“option‘¡E‰ff&fŽ“list)Ž¡‘ã read(+stream‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“alias,‘?ý?term)Ž¡‘ã read(?term)ަ‘øãÄDescriptionŽ©‘øãÅread‘¡E‰ff&fŽ‘Ç«term(SorA,–?ýTerm,“Options)–âß²is›âÞtrue“if‘©ûÅTerm“²uni es“with˜the“next“term˜read“from˜the“streamŽ¡‘øãassoGciated–UUwith“the“stream-term“or“alias“ÅSorA“²according“to“the“options“givš¸ãen“b˜y‘xâÅOptions².ަ‘øãÄRead‘ Ooptions²:‘‚ÅOptions–¤Ê²is›¤Ëa“list˜of“read˜options.‘6îIf˜this“list˜conš¸ãtains“con˜tradictory–¤Ëoptions,‘Èthe“righ˜tmostŽ¡‘øãoption–UUis“the“one“whicš¸ãh“applies.‘qÇP˜ossible“options“are:Ž©‘ã¸ŽŽŽ‘ã Åvariables(VL)²:–¼¬ÅVL‘¼†²is“uni ed“with“the“list“of“all“v‘ÿqÇariables“of“the“input“term,‘Û5in“left-to-righš¸ãt“tra˜v˜ersalŽ¡‘ã order.‘qÇAnon¸ãymous–UUv‘ÿqÇariables“are“included“in“the“list“ÅVL².ަ‘ã¸ŽŽŽ‘ã Åvariable‘¡E‰ff&fŽ‘Ç«names(VNL)²:–ÆÅVNL‘Æ!²is“uni ed›Æ€with“the“list˜of“pairs“ÅName–?ý=“Var˜²where–ÆÅVar“²is˜a“namedŽ¡‘ã v›ÿqÇariable–gof“the“term“and‘gÅName“²is“the“atom“assoGciated“with“the“name“of‘.!ÅVar².‘¦×Anon¸ãymous“v˜ariablesŽ¡‘ã are–UUnot“included“in“the“list“ÅVNL².ަ‘ã¸ŽŽŽ‘ã Åsingletons(SL)²:–VšÅSL‘VY²is›V™uni ed“with“the˜list“of“pairs˜ÅName–?ý=“Var–Vš²where“ÅVar˜²is“a“named˜v‘ÿqÇariable“whic¸ãhŽ¡‘ã ošGccurs–Ûonly“once“in“the“term“and“ÅName“²is“the‘Úatom“asso˜ciated“to“the“name“of‘äøÅVar².‘ËYAnon¸ãymousŽ¡‘ã v‘ÿqÇariables–UUare“not“included“in“the“list“ÅSL².ަ‘ã¸ŽŽŽ‘ã Åsyntax‘¡E‰ff&fŽ‘Ç«error(error²/Åwarning²/Åfail)²:‘qÇspGeci es–UUthe“e ect“of“a“syn¸ãtax“error:Ž¡‘# Ä{ŽŽŽ‘'ã Åerror²:‘qÇa–UUÅsyntax‘¡E‰ff&fŽ‘Ç«error“²is“raised.ޤ‘# Ä{ŽŽŽ‘'ã Åwarning²:‘qÇa–UUwš¸ãarning“message“is“displa˜y˜ed“and“the“predicate“fails.Ž¡‘# Ä{ŽŽŽ‘'ã Åfail²:‘qÇthe–UUpredicate“quietly“fails.ŽŸ‘ã The–UUdefault“v›ÿqÇalue“is“the“v˜alue“of“the“Åsyntax‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“(section“7.22.1,“page“133).ަ‘ã¸ŽŽŽ‘ã Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“term(dot²/Åeof)²:‘ƱspGeci es›Éthe–Êend-of-term“delimiter:‘ưÅdot“²is“the“classical˜full-stop“delimiterޤ ‘ã (a–®Üdot“follo•¸ãw“ed›®Ýwith–®Üa“la•¸ãy“out‘®Üc“haracter),‘Å>Åeof˜²is–®Üthe“end-of- le“delimiter.‘~]This“option˜is“useful“forŽ¡‘ã predicates–4likš¸ãe“Åread‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“atom/3–4²(section‘37.15.1,‘npage“104)“to“a˜v˜oid“to“add‘3a“terminal“dot“atŽ¡‘ã the–UUend“of“the“atom.‘qÇThe“default“v‘ÿqÇalue“is“Ådot².ަ‘øãÅread(SorA,›?ýTerm)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åread‘¡E‰ff&fŽ‘Ç«term(SorA,˜Term,˜[])².ޤ‘øãÅread‘¡E‰ff&fŽ‘Ç«term/2–UU²and“Åread/1“²apply“to“the“curren¸ãt“input“stream.Ž¡‘øãÄErrorsŽŽŸŽŒ‹])! Ú‹– ý"EŸüfd‘øã²7.14‘ T‘ÿ*ªerm‘UUinput/outputŽŽŽ’¶!93ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý¿Õv‘øãŸ•³5‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Options–U0²is“a›U/partial“list“or“a“list˜with“an“elemen¸ãtŽŸ ‘ÅE–UU²whic¸ãh“is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Options–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýOptions)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅOptions“²list“is“neither“aŽŸ ‘v›ÿqÇariable–UUnor“a“v˜alid“read“optionŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(read‘¡E‰ff&fŽ“option,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(input,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²has“stream“propGertiesŽŸ ‘Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“stream(past)–UU²and“Åeof‘¡E‰ff&fŽ‘Ç«action(error)ŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(input,ŽŸ ’éÒqpast‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²a–UUsyn¸ãtax“error“oGccurs“and“the“v‘ÿqÇalue“of“theޤ ‘Åsyntax‘¡E‰ff&fŽ‘Ç«error–UU²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsyntax‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸy¤ø‘øãÄP•®9ortabilit“yŽŸ‘øã²ISO‘|Öpredicates.‘é1The–}"ISO‘|×reference›}#raises“a˜Årepresentation‘¡E‰ff&fŽ‘Ç«error(Flag)˜²where˜ÅFlag“²is˜Åmax‘¡E‰ff&fŽ‘Ç«arity²,ޤ ‘øãÅmax‘¡E‰ff&fŽ–Ç«integer²,‘Iýor‘?ýÅmin‘¡E‰ff&fŽ“integer–²when“the“read“term“breacš¸ãhes“an“implemen˜tation“de ned“limit“spGeci edŽ¡‘øãb¸ãy‘ë©ÅFlag².‘ÊGNU‘ÇþProlog›Èdetects–Èneither“Åmin‘¡E‰ff&fŽ‘Ç«integer˜²nor“Åmax‘¡E‰ff&fŽ‘Ç«integer˜²violation“and“treats˜a“Åmax‘¡E‰ff&fŽ‘Ç«arityŽ¡‘øã²violation–­as“a“syn¸ãtax›­error.‘yThe“read“options˜Åsyntax‘¡E‰ff&fŽ›Ç«error/1“²and“Åend‘¡E‰ff&fŽ˜of‘¡E‰ff&fŽ˜term/1“²are“GNU‘¬¿PrologŽ¡‘øãextensions.ŽŸ%þ6‘øãÄ7.14.2Ž‘!ƇÅread‘¡E‰ff&fŽ–Ç«atom/2Ä,›ÕTÅread‘¡E‰ff&fŽ“atom/1Ä,˜Åread‘¡E‰ff&fŽ“integer/2Ä,˜Åread‘¡E‰ff&fŽ“integer/1Ä,Ž¡‘!ƇÅread‘¡E‰ff&fŽ–Ç«number/2Ä,‘ÕTÅread‘¡E‰ff&fŽ“number/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åread‘¡E‰ff&fŽ–Ç«atom(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?atom)Ž¡‘ã read‘¡E‰ff&fŽ‘Ç«atom(?atom)Ž¡‘ã read‘¡E‰ff&fŽ–Ç«integer(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?integer)Ž¡‘ã read‘¡E‰ff&fŽ‘Ç«integer(?integer)Ž¡‘ã read‘¡E‰ff&fŽ–Ç«number(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?number)Ž¡‘ã read‘¡E‰ff&fŽ‘Ç«number(?number)ަ‘øãÄDescriptionŽ©‘øãÅread‘¡E‰ff&fŽ‘Ç«atom(SorA,‘?ýAtom)› ã²succeeds– âif‘ÓÅAtom“²uni es˜with˜the“next˜atom˜read“from˜the“stream˜assoGciatedŽ¡‘øãwith–UUthe“stream-term“or“alias“ÅSorA².ަ‘øãÅread‘¡E‰ff&fŽ‘Ç«integer(SorA,‘?ýInteger)–‚8²succeeds›‚9if‘IUÅInteger“²uni es˜with“the“next˜in¸ãteger“read“from˜the“streamŽ¡‘øãassoGciated–UUwith“the“stream-term“or“alias“ÅSorA².ަ‘øãÅread‘¡E‰ff&fŽ‘Ç«number(SorA,‘?ýNumber)–A²succeeds›Aif‘%ÅNumber“²uni es˜with“the“next˜n•¸ãum“bGer›A(in“teger˜or‘A oating˜pGoin“tŽ¡‘øãn•¸ãum“bšGer)–UUread“from“the“stream“asso˜ciated“with“the“stream-term“or“alias“ÅSorA².ަ‘øãÅread‘¡E‰ff&fŽ–Ç«atom/1²,›UUÅread‘¡E‰ff&fŽ“integer/1˜²and˜Åread‘¡E‰ff&fŽ“number/1˜²apply˜to˜the˜curren¸ãt˜input˜stream.ަ‘øãÄErrorsŽŽŸŽŒ‹^5Ë Ú‹– ý"EŸüfd‘øã²94ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý³Õv‘øãŸ¡³5‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Integer–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýInteger)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Number–UU²is“neither“a“v‘ÿqÇariable“nor“a“n•¸ãum“bGerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(number,‘?ýNumber)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(input,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²has“stream“propGertiesŽŸ ‘Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“stream(past)–UU²and“Åeof‘¡E‰ff&fŽ‘Ç«action(error)ŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(input,ŽŸ ’éÒqpast‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²a–UUsyn¸ãtax“error“oGccurs“and“the“v‘ÿqÇalue“of“theޤ ‘Åsyntax‘¡E‰ff&fŽ‘Ç«error–UU²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsyntax‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸm¤ø‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.14.3Ž‘!ƇÅread‘¡E‰ff&fŽ–Ç«token/2Ä,‘ÕTÅread‘¡E‰ff&fŽ“token/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åread‘¡E‰ff&fŽ–Ç«token(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?nonvar)ŽŸ ‘ã read‘¡E‰ff&fŽ‘Ç«token(?nonvar)Ž¡‘øãÄDescriptionަ‘øãÅread‘¡E‰ff&fŽ‘Ç«token(SorA,‘?ýToken)–)ù²succeeds“if‘ñÅToken“²uni es“with“the›)úencoGding“of“the“next˜Prolog“tok¸ãen“readŽŸ ‘øãfrom–UUthe“stream“assoGciated“with“stream-term“or“alias“ÅSorA².ަ‘øãÄT‘ÿ «ok®9en‘ÕTencoQÇding(ä²:Ž¡‘ã¸ŽŽŽ‘ã Åvar(A)²:–UUa“v‘ÿqÇariable“is“read“whose“name“is“the“atom“ÅA².Ž¡‘ã¸ŽŽŽ‘ã ²an–UUatom“ÅA²:“an“atom“ÅA“²is“read.Ž¡‘ã¸ŽŽŽ‘ã ²inš¸ãteger–UUÅN²:“an“in˜teger“ÅN“²is“read.Ž¡‘ã¸ŽŽŽ‘ã ² oating–UUpGoinš¸ãt“n˜um˜bšGer“ÅN²:“a“ oating“p˜oinš¸ãt“n˜um˜bGer“ÅN“²is“read.Ž¡‘ã¸ŽŽŽ‘ã Åstring(A)²:–UUa“string“(double“quoted“item)“is“read“whose“c¸ãharacters“forms“the“atom“ÅA².Ž¡‘ã¸ŽŽŽ‘ã Åpunct(P)²:–±œa›±punctuation“c¸ãharacter“ÅP‘±C²is“read˜(ÅP‘±B²is˜a“one-c¸ãharacter“atom˜in“Å()[]{|}²,‘®the“atomŽ© ‘ã Åfull‘¡E‰ff&fŽ›Ç«stop–UU²or“the“atom“Åend‘¡E‰ff&fŽ˜of‘¡E‰ff&fŽ˜file²).Ž¡‘ã¸ŽŽŽ‘ã Åback‘¡E‰ff&fŽ‘Ç«quotes(A)²:–UUa“bacš¸ãk“quoted“item“is“read“whose“c˜haracters“forms“the“atom“ÅA².Ž¡‘ã¸ŽŽŽ‘ã Åextended(A)²:–UUan“extended“c¸ãharacter“ÅA“²(an“atom)“is“read.Ž¡‘øãAs–ÐEfor“Åread‘¡E‰ff&fŽ›Ç«term/3²,‘ïthe“bGeha¸ãvior“of‘—bÅread‘¡E‰ff&fŽ˜token/2“²can“bGe‘ÐFa ected“b¸ãy“some“Prolog“ ags“(section“7.14,ަ‘øãpage‘UU91).ޤ‘øãÅread‘¡E‰ff&fŽ‘Ç«token/1–UU²applies“to“the“curren¸ãt“input“stream.Ž¡‘øãÄErrorsŽŽŸŽŒ‹_H% Ú‹– ý"EŸüfd‘øã²7.14‘ T‘ÿ*ªerm‘UUinput/outputŽŽŽ’¶!95ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý¡;Ý‘øãŸ´LΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“output“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(input,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²has“stream“propGertiesŽŸ ‘Åend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“stream(past)–UU²and“Åeof‘¡E‰ff&fŽ‘Ç«action(error)ŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(input,ŽŸ ’éÒqpast‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²a–UUsyn¸ãtax“error“oGccurs“and“the“v‘ÿqÇalue“of“theޤ ‘Åsyntax‘¡E‰ff&fŽ‘Ç«error–UU²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsyntax‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ[ _‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicates.ŽŸ%ü§‘øãÄ7.14.4Ž‘!ƇÅsyntax‘¡E‰ff&fŽ–Ç«error‘¡E‰ff&fŽ“info/4ŽŸuT‘øãÄT‘ÿ «emplatesޤøÂ‘ã Åsyntax‘¡E‰ff&fŽ–Ç«error‘¡E‰ff&fŽ“info(?atom,–?ý?integer,“?integer,“?atom)Ž¡‘øãÄDescriptionަ‘øãÅsyntax‘¡E‰ff&fŽ–Ç«error‘¡E‰ff&fŽ“info(FileName,–?ýLine,“Column,“Error)–mf²returns›mgthe“information˜assoGciated“with˜the“lastޤ ‘øãsynš¸ãtax–P'error.‘p ÅLine“²is“the‘P&line“n˜um˜bGer“of“the“error,‘Q0ÅColumn“²is“the“column“n˜um˜bGer‘P&of“the“error“and“ÅErrorŽ¡‘øã²is–UUan“atom“explaining“the“error.ަ‘øãÄErrorsŽŸ(ÿ‘øãŸäæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅFileName–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFileName)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Line–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýLine)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Column–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýColumn)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Error–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýError)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ*qÆ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%ü§‘øãÄ7.14.5Ž‘!ƇÅlast‘¡E‰ff&fŽ–Ç«read‘¡E‰ff&fŽ“start‘¡E‰ff&fŽ“line‘¡E‰ff&fŽ“column/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸøÃ‘ã Ålast‘¡E‰ff&fŽ–Ç«read‘¡E‰ff&fŽ“start‘¡E‰ff&fŽ“line‘¡E‰ff&fŽ“column(?integer,‘?ý?integer)ŽŸøÂ‘øãÄDescriptionަ‘øãÅlast‘¡E‰ff&fŽ–Ç«read‘¡E‰ff&fŽ“start‘¡E‰ff&fŽ“line‘¡E‰ff&fŽ“column(Line,‘?ýColumn)–¾ö²uni es“ÅLine“²and“ÅColumn“²with‘¾õthe“line“n•¸ãum“bGer–¾öand“theŽ¡‘øãcolumn›?n•¸ãum“b•Ger˜asso“ciated˜with–?the˜start˜of˜the˜last˜read“predicate.‘This˜predicate˜can“bGe˜used˜after˜callingŽ¡‘øãone–ô¨of›ô§the“follo¸ãwing˜predicates:‘°lÅread‘¡E‰ff&fŽ–Ç«term/3²,›|Åread‘¡E‰ff&fŽ“term/2²,˜Åread/2²,˜Åread/1–ô¨²(section‘ô§7.14.1,˜page“92),Ž¡‘øãÅread‘¡E‰ff&fŽ–Ç«atom/2²,›@HÅread‘¡E‰ff&fŽ“atom/1²,‘@IÅread‘¡E‰ff&fŽ“integer/2²,˜Åread‘¡E‰ff&fŽ“integer/1²,‘@IÅread‘¡E‰ff&fŽ“number/2²,˜Åread‘¡E‰ff&fŽ“number/1‘Þ²(sec-Ž¡‘øãtion–UU7.14.2,“page“93)“or“Åread‘¡E‰ff&fŽ›Ç«token/2²,“Åread‘¡E‰ff&fŽ˜token/1“²(section“7.14.3,“page“94).ަ‘øãÄErrorsŽŽŸŽŒ‹`XD Ú‹– ý"EŸüfd‘øã²96ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýd;Þ‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅLine–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýLine)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Column–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýColumn)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yŽŸ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.14.6Ž‘!ƇÅwrite‘¡E‰ff&fŽ–Ç«term/3Ä,›ÕTÅwrite‘¡E‰ff&fŽ“term/2Ä,˜Åwrite/2Ä,˜Åwrite/1Ä,˜Åwriteq/2Ä,˜Åwriteq/1Ä,ޤ ‘!ƇÅwrite‘¡E‰ff&fŽ–Ç«canonical/2Ä,›ÕTÅwrite‘¡E‰ff&fŽ“canonical/1Ä,˜Ådisplay/2Ä,˜Ådisplay/1Ä,˜Åprint/2Ä,Ž¡‘!ƇÅprint/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åwrite‘¡E‰ff&fŽ–Ç«term(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,–?ý?term,“+write‘¡E‰ff&fŽ–Ç«option‘¡E‰ff&fŽ“list)Ž¡‘ã write‘¡E‰ff&fŽ–Ç«term(?term,‘?ý+write‘¡E‰ff&fŽ“option‘¡E‰ff&fŽ“list)Ž¡‘ã write(+stream‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“alias,‘?ý?term)Ž¡‘ã write(?term)Ž¡‘ã writeq(+stream‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“alias,‘?ý?term)Ž¡‘ã writeq(?term)Ž¡‘ã write‘¡E‰ff&fŽ–Ç«canonical(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý?term)Ž¡‘ã write‘¡E‰ff&fŽ‘Ç«canonical(?term)Ž¡‘ã display(+stream‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“alias,‘?ý?term)Ž¡‘ã display(?term)Ž¡‘ã print(+stream‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“alias,‘?ý?term)Ž¡‘ã print(?term)ަ‘øãÄDescriptionŽ©‘øãÅwrite‘¡E‰ff&fŽ‘Ç«term(SorA,–?ýTerm,“Options)–.b²writes“ÅTerm“²to“the“stream“assoGciated“with“the“stream-term“or“aliasŽ¡‘øãÅSorA–UU²according“to“the“options“givš¸ãen“b˜y‘xâÅOptions².ަ‘øãÄW‘ÿ «rite‘¦þoptions²:‘› ÅOptions–êB²is›êAa“list“of˜write“options.‘ 0If˜this“list˜conš¸ãtains“con˜tradictory“options,‘O|theŽ¡‘øãrighš¸ãtmost–UUoption“is“the“one“whic˜h“applies.‘qÇP˜ossible“options“are:Ž©‘ã¸ŽŽŽ‘ã Åquoted(true²/Åfalse)²:‘÷Óif‘_wÅtrue–˜[²eacš¸ãh“atom“and“functor“is‘˜Zquoted“if“this“w˜ould“bGe‘˜Znecessary“for“theŽ¡‘ã term–²µto›²¶bGe“input˜b¸ãy‘ÖBÅread‘¡E‰ff&fŽ‘Ç«term/3².‘;’If‘yÓÅfalse“²no˜extra“quotes˜are“written.‘;’The˜default“v‘ÿqÇalue˜is“Åfalse².ަ‘ã¸ŽŽŽ‘ã Åignore‘¡E‰ff&fŽ‘Ç«ops(true²/Åfalse)²:‘Nif‘r5Åtrue–«²eac¸ãh“compGound›«term“is“output“in˜functional“notation“(neitherŽ¡‘ã opšGerator–%notation“nor‘&list“notation“is“used).‘Š8If‘ÏBÅfalse“²op˜erator‘&and“list“notations“are“used.‘Š8TheŽ¡‘ã default–UUv‘ÿqÇalue“is“Åfalse².ަ‘ã¸ŽŽŽ‘ã Ånumbervars(true²/Åfalse)²:‘gKif‘zÅtrue–@]²a“term“of‘@\the“form“Å'$VAR'(N)²,“where“ÅN‘@X²is“an“in¸ãteger,‘DŽis“outputŽ¡‘ã as–Âèa“v‘ÿqÇariable“name“(see“bGelo•¸ãw).‘º€If‘ŠÅfalse‘Âé²suc“h–Âèa“term“is“output“normally“(according“to“the“otherŽ¡‘ã options).‘qÇThe–UUdefault“v‘ÿqÇalue“is“Åtrue².ަ‘ã¸ŽŽŽ‘ã Ånamevars(true²/Åfalse)²:‘UÈif‘äsÅtrue–V²a“term“of“the“form“Å'$VARNAME'(Name)²,›(‰where“ÅName“²is“an“atom,˜isŽ¡‘ã output–iuas›ita“v‘ÿqÇariable“name˜(see“bGeloš¸ãw).‘®&If‘0‘Åfalse“²suc˜h“a›itterm“is˜output“normally“(according˜to“theŽ¡‘ã other–UUoptions).‘qÇThe“default“v‘ÿqÇalue“is“Åtrue².ަ‘ã¸ŽŽŽ‘ã Åspace‘¡E‰ff&fŽ‘Ç«args(true²/Åfalse)²:‘™if‘tÅtrue–¬ù²an“extra›¬øspace“c¸ãharacter“is˜emitted“after“eac¸ãh˜comma“separatingŽ¡‘ã the–³argumen¸ãts›³of“a˜compGound“term“in˜functional“notation˜or“of“a˜list.‘‹!If‘z;Åfalse˜²no“extra˜space“isŽ¡‘ã emitted.‘qÇThe–UUdefault“v‘ÿqÇalue“is“Åfalse².ަ‘ã¸ŽŽŽ‘ã Åportrayed(true²/Åfalse)²:‘ if‘èÅtrue– ô²and“if“there“exists‘ õa“predicate“Åportray/1²,‘SÜÅwrite‘¡E‰ff&fŽ‘Ç«term/3“²actsŽ¡‘ã as–ýWfollo¸ãws:‘ÁÌif›ÄtÅTerm“²is“a“v‘ÿqÇariable“it‘ýXis“simply“written.‘iÎIf˜ÅTerm“²is“non-v‘ÿqÇariable“then“it‘ýXis“passed“toŽ¡‘ã Åportray/1².‘0;If–±this›°succeeds“then˜it“is˜assumed˜that“ÅTerm˜²has“bGeen˜output.‘0|ŽŽŽŽ ÃÝ» ý_"E‘ã Åignore‘¡E‰ff&fŽ‘Ç«ops(false)–ÿ²a›list“is˜ rst“passed˜to“Åportray/1˜²and“only˜if“this˜call“fails˜eacš¸ãh“elemen˜t‘of“theޤ ‘ã list–UUis“passed“to“Åportray/1“²(thš¸ãus“ev˜ery“sub-list“is“not“passed).‘qÇThe“default“v‘ÿqÇalue“is“Åfalse².Ž©‘ã¸ŽŽŽ‘ã Åmax‘¡E‰ff&fŽ‘Ç«depth(N)²:–0Scon¸ãtrols›0Tthe“depth“of“output˜for“compGound“terms.‘ÂÅN‘0²is“an“in¸ãteger˜spGecifying“theŽ¡‘ã depth.‘S&The–ùpoutput“of“a›ùqterm“whose“depth˜is“greater“than“ÅN‘ùY²giv¸ães˜rise“to“the˜output“of“Å...‘S&²(3“dots).Ž¡‘ã By–UUdefault“there“is“no“depth“limit.ަ‘ã¸ŽŽŽ‘ã Åpriority(N)²:–ÊspGeci es›Êthe“starting“priorit¸ãy˜to“output“the˜term.‘CXThis˜option“con¸ãtrols“if‘‘!ÅTerm“²shouldŽ¡‘ã bšGe–UUenclosed“in“brac•¸ãk“ets.‘qÇÅN–UU²is“a“p˜ositivš¸ãe“in˜teger“¸“²1200.‘qÇBy“default“ÅN“²=“1200.ަ‘øãÄV‘ÿ «ariable‘Ð*n•®9um“bQÇering(ä²:‘oˆwhen–P×the“Ånumbervars(true)“²option›PØis“passed“to“Åwrite‘¡E‰ff&fŽ‘Ç«term/3“²an¸ãy˜term“of“theŽ¡‘øãform–=‹Å'$VAR'(N)›=…²where“ÅN˜²is›=Œan“in¸ãteger“is“output“as“a“v‘ÿqÇariable“name“consisting˜of“a“capital“letter“pGossiblyŽ¡‘øãfollo•¸ãw“ed›êb“y‘ê~an˜in“teger.‘N*The˜capital–ê~letter˜is˜the“Å(I+1)Èth‘®â²letter“of˜the“alphabGet˜and˜the“in¸ãteger˜is“ÅJ²,˜whereŽ¡‘øãÅI–?ý=“N“mod“26–UU²and“ÅJ–?ý=“N“//“26².›qÇThe–UUin¸ãteger“ÅJ“²is“omitted“if“it“is“zero.˜F‘ÿ*ªor“example:Ž©1qÇŸáæd‘ã Å'$VAR'(0)ŽŽŽ‘JÊÙ²is–UUwritten“as“ÅAŽŽ¡‘ã '$VAR'(1)ŽŽŽ‘JÊÙ²is–UUwritten“as“ÅBŽŽ¡‘ã ...ŽŽ¡‘ã '$VAR'(25)ŽŽŽ‘JÊÙ²is–UUwritten“as“ÅZŽŽ¡‘ã '$VAR'(26)ŽŽŽ‘JÊÙ²is–UUwritten“as“ÅA1ŽŽ¡‘ã '$VAR'(27)ŽŽŽ‘JÊÙ²is–UUwritten“as“ÅB1ŽŽŽŽŽ¦‘øãÄV‘ÿ «ariable‘naming(ä²:‘è‰when›µthe–¶Ånamevars(true)“²option“is˜passed“to“Åwrite‘¡E‰ff&fŽ‘Ç«term/3“²an¸ãy“term˜of“the“formŽ¡‘øãÅ'$VARNAME'(Name)–Ê#²where›Ê"ÅName“²is˜an“atom“is˜output“as“a˜v‘ÿqÇariable“name˜consisting“of“the˜c¸ãharacters“ÅName².Ž¡‘øãF‘ÿ*ªor–UUexample:‘qÇÅ'$VARNAME'('A')“²is“written“as“ÅA“²(ev¸ãen“in“the“presence“of“the“Åquoted(true)“²option).ޤ‘øãÅwrite(SorA,›?ýTerm)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åwrite‘¡E‰ff&fŽ‘Ç«term(SorA,˜Term,˜[])².Ž¡‘øãÅwriteq(SorA,›?ýTerm)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åwrite‘¡E‰ff&fŽ‘Ç«term(SorA,˜Term,˜[quoted(true)])².Ž¡‘øãÅwrite‘¡E‰ff&fŽ›Ç«canonical(SorA,‘?ýTerm)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åwrite‘¡E‰ff&fŽ˜term(SorA,–?ýTerm,“[quoted(true),Ž© ‘øãignore‘¡E‰ff&fŽ‘Ç«ops(true),‘?ýnumbervars(false)])².Ž¡‘øãÅdisplay(SorA,›?ýTerm)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åwrite‘¡E‰ff&fŽ–Ç«term(SorA,˜Term,˜[ignore‘¡E‰ff&fŽ“ops(true),ަ‘øãnumbervars(false)])².Ž¡‘øãÅprint(SorA,›?ýTerm)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åwrite‘¡E‰ff&fŽ‘Ç«term(SorA,˜Term,˜[numbervars(false),ަ‘øãportrayed(true)])².Ž¡‘øãÅwrite‘¡E‰ff&fŽ›Ç«term/2²,–оÅwrite/1²,‘нÅwriteq/1²,“Åwrite‘¡E‰ff&fŽ˜canonical/1²,‘нÅdisplay/1–¸²and“Åprint/1‘¸²apply“to“the“curren¸ãtަ‘øãoutput‘UUstream.Ž¡‘øãÄErrorsŽŸYLË‘øãŸ´›‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Options–U0²is“a›U/partial“list“or“a“list˜with“an“elemen¸ãtަ‘ÅE–UU²whic¸ãh“is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Options–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýOptions)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orަ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅOptions“²list“is“neither“aަ‘v›ÿqÇariable–UUnor“a“v˜alid“write-optionŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(write‘¡E‰ff&fŽ“option,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“input“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(output,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(output,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ[>’‘øãÄP•®9ortabilit“yŽŽŸŽŒ‹bz» Ú‹– ý"EŸüfd‘øã²98ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãISO‘ bpredicates› Òexcept– ÓÅdisplay/1-2“²and“Åprint/1-2“²that˜are“GNU‘ bProlog“predicates.‘ ˜@Ånamevars/1²,ޤ ‘øãÅspace‘¡E‰ff&fŽ›Ç«args/1²,–UUÅportrayed/1²,“Åmax‘¡E‰ff&fŽ˜depth/1“²and“Åpriority/1“²options“are“GNU“Prolog“extensions.ŽŸ%þ6‘øãÄ7.14.7Ž‘!ƇÅformat/3Ä,‘ÕTÅformat/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åformat(+stream‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“alias,›?ý+character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“atom,˜+list)Ž¡‘ã format(+character‘¡E‰ff&fŽ–Ç«code‘¡E‰ff&fŽ“list‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“atom,‘?ý+list)ަ‘øãÄDescriptionŽ©‘øãÅformat(SorA,–?ýFormat,“Arguments)–nѲwrites“the“ÅFormat“²string“replacing‘nÐeacš¸ãh“format“con˜trol“sequence“ÅFŽ¡‘øã²bš¸ãy–ç@the‘ç?correspGonding“elemen˜t›ç?of‘®]ÅArguments“²(formatted˜according“to˜ÅF²)‘ç$to“the˜stream“assoGciated˜with“theŽ¡‘øãstream-term–UUor“alias“ÅSorA².ަ‘øãÄF‘ÿ «ormat‘زcon®9trol‘رsequences²:‘w¢the–XBgeneral“format“of“a“conš¸ãtrol‘XCsequence“is“Å'~NC'².“The“c˜haracter‘XCÅC‘XA²deter-Ž¡‘øãmines–‚ƒthe“tš¸ãypGe“of“the“con˜trol“sequence.‘ùRÅN‘‚w²is“an“optional“n˜umeric“argumen˜t.‘ùQAn“alternativ˜e“form‘‚„of‘I ÅN‘‚w²isŽ¡‘øãÅ'*'².‘OÝÅ'*'–ô²²implies›ô±that“the“next˜argumen¸ãt“ÅArg“²in“ÅArguments˜²should“bGe“used˜as“a“n•¸ãumeric˜argumen“t‘ô²inŽ¡‘øãthe–D‰conš¸ãtrol“sequence.‘l.The“use“of“C‘D…Åprintf()“²formatting“sequence“(bGeginning“b˜y“the“c˜haracter“Å%²)“is“alsoŽ¡‘øãallo•¸ãw“ed.‘qÇThe›UUfollo“wing˜con“trol˜sequences˜are˜a“v‘ÿqÇailable:ŽªÊØ)‘øã ÿD€‰ffÆnéfdŸ™œ„ffŸðfd‘ F‘ÿ*ªormatŽ¡‘Ü|sequenceŽŽ‘3Õl„ffŽ‘J”!t¸ãypGe–UUof“theŽ¡‘MÂZargumen¸ãtŽŽ’M-Ÿ™œ„ffŽ’–³“DescriptionŽŽ’Æ]Ÿ™œ„ffŽŽŸ‰ffÆnßff‰ffÆn柙œ„$ffŸäfd‘ »Å~NaŽŽ‘3Õl„$ffŽ‘W[?²atomŽŽ’M-Ÿ™œ„$ffŽ’–³“prinš¸ãt–ŽÃthe“atom“without“quoting.‘ÅN‘޵²is“minimal“n˜um˜bGer“of“c˜haractersŽ¡’–³“to–÷2prin¸ãt“using›÷1spaces“on“the“rigth˜if“needed“(default:‘µ€the“length“ofŽ¡’–³“the‘UUatom)ŽŽ’Æ]Ÿ™œ„$ffŽŽŸ‰ffÆn柙œ„ffŸðfd‘ »Å~NcŽŽ‘3Õl„ffŽ‘BÅé²c¸ãharacter‘UUcoGdeŽŽ’M-Ÿ™œ„ffŽ’–³“prin•¸ãt› @the‘ ?c“haracter˜asso•Gciated˜with‘ ?the˜co“de.‘R‡ÅN‘Ÿê²is˜the‘ ?n•¸ãum“bGer˜ofŽ¡’–³“times–UUto“prinš¸ãt“the“c˜haracter“(default:‘qÇ1)ŽŽ’Æ]Ÿ™œ„ffŽŽŸ‰ffÆn柙œ„$ffŸäfd‘ª¹Å~NfŽ¡‘ŠÁ~Ne‘?ý~NEŽ¡‘ŠÁ~Ng‘?ý~NGŽŽ‘3Õl„$ffŽ‘@¥ç² oat‘UUexpressionŽŽ’M-Ÿ™œ„$ffŽ’–³“pass–kthe›jargumen¸ãt“ÅArg“²and˜ÅN›µ²to“the“C˜Åprintf()‘j²function“as:Ž¡’–³“if‘‚ÅN‘X"²is›Xdnot–XespGeci ed“Åprintf("%f",Arg)˜²else“Åprintf("%.Nf",Arg)².Ž¡’–³“Similarly–UUfor“Å~Ne²,“Å~NE²,“Å~Ng“²and“Å~NGŽŽ’Æ]Ÿ™œ„$ffŽŽŸ‰ffÆn柙œ„ffŸðfd‘ »~NdŽŽ‘3Õl„ffŽ‘;~˲in¸ãteger‘UUexpressionŽŽ’M-Ÿ™œ„ffŽ’–³“prin•¸ãt‘°Dthe›°Eargumen“t.‘:ÂÅN‘°²is˜the‘°Dn“um“bGer˜of–°Ddigits˜after“the˜decimal“pGoin¸ãt.Ž¡’–³“If‘rÅN–UU²is“0“no“decimal“pGoinš¸ãt“is“prin˜ted“(default:‘qÇ0)ŽŽ’Æ]Ÿ™œ„ffŽŽŸ‰ffÆn柙œ„ffŸðfd‘ »Å~NDŽŽ‘3Õl„ffŽ‘;~˲in¸ãteger‘UUexpressionŽŽ’M-Ÿ™œ„ffŽ’–³“iden¸ãtical–Àto“Å~Nd“²except“that–ÀÅ','‘ÚͲseparates“groups–Àof“three“digits“toŽ¡’–³“the–UUleft“of“the“decimal“pGoin¸ãtŽŽ’Æ]Ÿ™œ„ffŽŽŸ‰ffÆn柙œ„ffŸðfd‘ »Å~NrŽŽ‘3Õl„ffŽ‘;~˲in¸ãteger‘UUexpressionŽŽ’M-Ÿ™œ„ffŽ’–³“prinš¸ãt–×íthe“argumen˜t“according“to“the“radix“ÅN².“2“¸“ÅN‘×͸“²36“(default:‘38).Ž¡’–³“The–UUletters“Åa-z“²denote“digits“µ>“²9ŽŽ’Æ]Ÿ™œ„ffŽŽŸ‰ffÆn柙œ„ ffŸüfd‘ »Å~NRŽŽ‘3Õl„ ffŽ‘;~˲in¸ãteger‘UUexpressionŽŽ’M-Ÿ™œ„ ffŽ’–³“iden¸ãtical–UUto“Å~Nr“²except“that“the“letters“ÅA-Z“²denote“digits“µ>“²9ŽŽ’Æ]Ÿ™œ„ ffŽŽ¤‰ffÆn柙œ„ ffŸüfd‘ »Å~NsŽŽ‘3Õl„ ffŽ‘:¢8²c¸ãharacter–“coGde“listŽŽ’M-Ÿ™œ„ ffŽ’–³“prinš¸ãt–UUexactly‘xâÅN“²c˜haracters“(default:‘qÇthe“length“of“the“list)ŽŽ’Æ]Ÿ™œ„ ffŽŽ¡‰ffÆn柙œ„ ffŸüfd‘ »Å~NSŽŽ‘3Õl„ ffŽ‘Eð”²c¸ãharacter‘UUlistŽŽ’M-Ÿ™œ„ ffŽ’–³“prinš¸ãt–UUexactly‘xâÅN“²c˜haracters“(default:‘qÇthe“length“of“the“list)ŽŽ’Æ]Ÿ™œ„ ffŽŽ¡‰ffÆn柙œ„ ffŸüfd‘ª¹Å~iŽŽ‘3Õl„ ffŽ‘X-²termŽŽ’M-Ÿ™œ„ ffŽ’–³“ignore–UUthe“currenš¸ãt“argumen˜tŽŽ’Æ]Ÿ™œ„ ffŽŽ¡‰ffÆn柙œ„ ffŸüfd‘ª¹Å~kŽŽ‘3Õl„ ffŽ‘X-²termŽŽ’M-Ÿ™œ„ ffŽ’–³“pass–UUthe“argumen¸ãt“to“Åwrite‘¡E‰ff&fŽ‘Ç«canonical/1“²(section“7.14.6,“page“96)ŽŽ’Æ]Ÿ™œ„ ffŽŽ¡‰ffÆn柙œ„ ffŸüfd‘ª¹Å~pŽŽ‘3Õl„ ffŽ‘X-²termŽŽ’M-Ÿ™œ„ ffŽ’–³“pass–UUthe“argumen¸ãt“to“Åprint/1“²(section“7.14.6,“page“96)ŽŽ’Æ]Ÿ™œ„ ffŽŽ¡‰ffÆn柙œ„ ffŸüfd‘ª¹Å~qŽŽ‘3Õl„ ffŽ‘X-²termŽŽ’M-Ÿ™œ„ ffŽ’–³“pass–UUthe“argumen¸ãt“to“Åwriteq/1“²(section“7.14.6,“page“96)ŽŽ’Æ]Ÿ™œ„ ffŽŽ¡‰ffÆn柙œ„ ffŸüfd‘ª¹Å~wŽŽ‘3Õl„ ffŽ‘X-²termŽŽ’M-Ÿ™œ„ ffŽ’–³“pass–UUthe“argumen¸ãt“to“Åwrite/1“²(section“7.14.6,“page“96)ŽŽ’Æ]Ÿ™œ„ ffŽŽ¡‰ffÆn柙œ„ ffŸüfd‘ª¹Å~~ŽŽ‘3Õl„ ffŽ‘X0•²noneŽŽ’M-Ÿ™œ„ ffŽ’–³“prinš¸ãt–UUthe“c˜haracter“Å'~'ŽŽ’Æ]Ÿ™œ„ ffŽŽ¡‰ffÆn柙œ„ ffŸüfd‘ »~NnŽŽ‘3Õl„ ffŽ‘X0•²noneŽŽ’M-Ÿ™œ„ ffŽ’–³“prinš¸ãt–UUÅN“²new-line“c˜haracters“(default:‘qÇ1)ŽŽ’Æ]Ÿ™œ„ ffŽŽ¡‰ffÆn柙œ„ ffŸüfd‘ª¹Å~NŽŽ‘3Õl„ ffŽ‘X0•²noneŽŽ’M-Ÿ™œ„ ffŽ’–³“prinš¸ãt–UUa“new-line“c˜haracter“if“not“at“the“bGeginning“of“a“lineŽŽ’Æ]Ÿ™œ„ ffŽŽ¡‰ffÆn柙œ„ ffŸüfd‘ª¹Å~?ŽŽ‘3Õl„ ffŽ‘W[?²atomŽŽ’M-Ÿ™œ„ ffŽ’–³“use–UUthe“argumen¸ãt“as“a“nested“format“stringŽŽ’Æ]Ÿ™œ„ ffŽŽ¡‰ffÆn柙œ„ffŸðfd‘ª¹Å%FŽŽ‘3Õl„ffŽ‘?M²atom,–UUin¸ãteger“orŽŸ ‘@¥ç oat‘UUexpressionŽŽ’M-Ÿ™œ„ffŽ’–³“in¸ãterface–­ to›­ the“C‘¬pfunction“Åprintf(3)˜²for“outputting˜atoms“(CŽŸ ’–³“string),–UUinš¸ãtegers“and“ oating“pGoin˜t“n˜um˜bGers.‘qÇÅ*“²are“also“allo˜w˜ed.ŽŽ’Æ]Ÿ™œ„ffŽŽŸ‰ffÆnÃŽŽŽ¦‘øãÅformat/2–UU²applies“to“the“curren¸ãt“output“stream.ŽŽŸŽŒ‹c½ Ú‹– ý"EŸüfd‘øã²7.14‘ T‘ÿ*ªerm‘UUinput/outputŽŽŽ’¶!99ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄErrorsŽ Àæc‘øã ÿL€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Format–UU²is“a“partial“list“or“a“list“with“an“elemen¸ãtŽŸ ‘ÅE–UU²whic¸ãh“is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Arguments–UU²is“a“partial“listŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Format–UU²is“neither“a“partial“list“nor“a“list“or“anŽŸ ‘atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýFormat)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Arguments–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýArguments)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅFormat“²list“is“neither“aŽŸ ‘v‘ÿqÇariable–UUnor“a“c¸ãharacter“coGdeŽŽ’㥄ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(character‘¡E‰ff&fŽ“code,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“F‘ÿ*ªormat“is“not“a“v‘ÿqÇalid“formatŽŸ ‘con¸ãtrol‘UUsequenceŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(format‘¡E‰ff&fŽ“control‘¡E‰ff&fŽ“sequence,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²the–UUÅArguments“²list“doGes“not“conš¸ãtain“sucien˜tŽŸ ‘elemen¸ãtsŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(non‘¡E‰ff&fŽ“empty‘¡E‰ff&fŽ“list,‘?ý[])ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅArguments“²list“is“a“v‘ÿqÇariableŽŸ ‘while–UUa“non-v‘ÿqÇariable“term“w¸ãas“expGectedŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅArguments“²list“is“neitherŽŸ ‘v‘ÿqÇariable–ù”nor›ù•an“atom˜while“an˜atom“w¸ãas˜expGectedŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅArguments“²cannot“bGeޤ ‘ev‘ÿqÇaluated–UUas“an“arithmetic“expression“while“anŽ¡‘inš¸ãteger–UUor“a“ oating“pGoin˜t“n˜um˜bGer“w˜as“expGectedŽŽ’㥄$ffŽ’éÒqan–UUarithmetic“error“(section“7.6.1,“page“57)ŽŽ’ÆØŸ™œ„$ffŽŽ©‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘an–UUelemen¸ãt“ÅE“²of“the“ÅArguments“²list“is“neitherޤ ‘v‘ÿqÇariable–UUnor“cš¸ãharacter“coGde“while“a“c˜haracterŽ¡‘cošGde–UUw¸ãas“exp˜ectedŽŽ’㥄$ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(character‘¡E‰ff&fŽ“code,‘?ýE)ŽŽ’ÆØŸ™œ„$ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“input“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(output,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(output,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽ ÂØ*‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.14.8Ž‘!ƇÅportray‘¡E‰ff&fŽ–Ç«clause/2Ä,‘ÕTÅportray‘¡E‰ff&fŽ“clause/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åportray‘¡E‰ff&fŽ–Ç«clause(+stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ý+clause)ŽŸ ‘ã portray‘¡E‰ff&fŽ‘Ç«clause(+clause)Ž¡‘øãÄDescriptionަ‘øãÅportray‘¡E‰ff&fŽ‘Ç«clause(SorA,‘?ýClause)›G¤²prett•¸ãy‘G¥prin“ts˜ÅClause˜²to–G¥the˜stream˜assoGciated˜with“the˜stream-termޤ ‘øãor– alias“ÅSorA².“Åportray‘¡E‰ff&fŽ›Ç«clause/2“²uses‘ the“v‘ÿqÇariable“binding“predicates“Åname‘¡E‰ff&fŽ˜singleton‘¡E‰ff&fŽ˜vars/1“²(sec-Ž¡‘øãtion–œ7.5.1,‘Aîpage“55)“and“Ånumbervars/1›²(section“7.5.3,‘Aípage˜56).‘©œThis“predicate“is˜used“b¸ãy‘6)Ålisting/1Ž¡‘øã²(section–UU7.23.3,“page“138).ަ‘øãÅportray‘¡E‰ff&fŽ‘Ç«clause/1–UU²applies“to“the“curren¸ãt“output“stream.ަ‘øãÄErrorsŽŽŸŽŒ‹d§ Ú‹– ý"EŸüfd‘øã²100ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý;Ý‘øãŸÆLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅClause–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Clause–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýClause)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-term“orŽŸ ‘aliasŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“not“assošGciated“with“an“op˜en“streamŽŽ’㥄 ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýSorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SorA–UU²is“an“input“streamŽŽ’㥄 ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(output,–?ýstream,“SorA)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘SorA–UU²is“assoGciated“with“a“binary“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ–Ç«error(output,‘?ýbinary‘¡E‰ff&fŽ“stream,ŽŸ ’éÒqSorA)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸI _‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.14.9Ž‘!ƇÅget‘¡E‰ff&fŽ–Ç«print‘¡E‰ff&fŽ“stream/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åget‘¡E‰ff&fŽ–Ç«print‘¡E‰ff&fŽ“stream(?stream)Ž¡‘øãÄDescriptionަ‘øãÅget‘¡E‰ff&fŽ–Ç«print‘¡E‰ff&fŽ“stream(Stream)–¹ö²uni es›¹õÅStream“²with“the“stream-term˜assoGciated“with“the“output˜stream“usedޤ ‘øãbš¸ãy‘5—Åprint/2– ²(section“7.14.6,‘page“96).‘[YThe“purpGose“of“this“predicate“is“to“allo˜w“a“user-de ned“Åportray/1Ž¡‘øã²predicate–UUto“iden¸ãtify“the“output“stream“in“use.ަ‘øãÄErrorsަ‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅStream–UU²is“neither“a“v‘ÿqÇariable“nor“a“stream-termŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýStream)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¦‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.14.10Ž‘'†…Åop/3ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åop(+integer,–?ý+operator‘¡E‰ff&fŽ›Ç«specifier,“+atom‘¡E‰ff&fŽ˜or‘¡E‰ff&fŽ˜atom‘¡E‰ff&fŽ˜list)Ž¡‘øãÄDescriptionަ‘øãÅop(Priority,–?ýOpSpecifier,“Operator)–ò*²alters›ò+the“opGerator˜table.‘P¹ÅOperator“²is˜declared“as˜an“opGeratorޤ ‘øãwith–y:propšGerties‘y;de ned“b¸ãy“sp˜eci er‘y;ÅOpSpecifier“²and“ÅPriority².‘ÝxÅPriority“²m¸ãust“b˜e›y;an“in¸ãteger“¸˜²0“andŽ¡‘øã¸–+|²1200.‘cÔIf‘ò™ÅPriority“²is‘+}0“then“the“opšGerator“prop˜erties“of‘ò™ÅOperator“²(if‘+}anš¸ãy)“are“canceled.‘cÔÅOperator“²ma˜yŽ¡‘øãalso–…2bšGe“a“list“of“atoms“in‘…3whic¸ãh“case“all“of“them“are“declared“to“b˜e“op˜erators.‘_In“general,‘‘)op˜erators“canŽ¡‘øãbGe›8nremo•¸ãv“ed˜from˜the˜opGerator˜table˜and˜their˜priorit“y˜or‘8osp•Geci er˜can˜b“e˜c•¸ãhanged.‘Ho“w“ev“er,‘q4it˜is˜anŽ¡‘øãerror–B·to“attempt“to“cš¸ãhange“the“Å','‘Fp²opGerator“from“its“initial“status.‘k’An“atom“can“ha˜v˜e“m˜ultiple“opGeratorŽ¡‘øãde nitions–Öß(e.g.‘G pre x›Öàand“in x“lik¸ãe˜Å+²)“ho•¸ãw“ev“er–Ößan“atom˜cannot“ha•¸ãv“e–ÖßbGoth˜an“in x“and“a˜pšGost x“op˜eratorŽ¡‘øãde nitions.ަ‘øãÄOp•QÇerator‘ÕTsp“eci ers²:‘qÇthe–UUfolloš¸ãwing“spGeci ers“are“a˜v‘ÿqÇailable:ŽŽŸŽŒ‹e¹¹ Ú‹– ý"EŸüfd‘øã²7.14‘ T‘ÿ*ªerm‘UUinput/outputŽŽŽ’±!€101ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýŠ¢C‘øãŸÊæh‰ff ’¤fd¤™œ„ ff–ŸüfdSpGeci er“¡„ ffŽ‘;E¶T¸ãypGe‘ €Ÿ™œ„ ffŽ‘a¬ AssoGciativit¸ãy‘Ÿ™œ„ ffŽŽ©‰ff ’Ÿff‰ff ’¡¤™œ„ ff–ŽŽ’¥ŽŽ’¥“@>=“is“=:=“=\=“<“=<ŽŸ ‘fAv>‘ ú>=ŽŽ’¥>ŽŽ’¥‘ ú#\<=>ŽŽ’¥‘ ú#\==>ŽŽ’¥“#>=“#=#“#\=#“#<#“#=<#“#>#“#>=#ŽŽ’¥|ŽŽŽŽ ÃÝ» ýÀ©‘øãŸ•€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPriority–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘OpSpecifier–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Operator–UU²is“a“partial“list“or“a“list“with“anŽŸ ‘elemenš¸ãt–UUÅE“²whic˜h“is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Priority–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýPriority)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘OpSpecifier–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýOpSpecifier)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Operator–UU²is“neither“a“partial“list“nor“a“list“norŽŸ ‘an‘UUatomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýOperator)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅOperator“²list“is“neither“aŽŸ ‘v‘ÿqÇariable–UUnor“an“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Priority–UU²is“an“in¸ãteger“not“¸“²0“and“¸“²1200ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(operator‘¡E‰ff&fŽ“priority,‘?ýPriority)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘OpSpecifier–UU²is“not“a“v‘ÿqÇalid“opšGerator“sp˜eci erŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(operator‘¡E‰ff&fŽ“specifier,ŽŸ ’éÒqOpSpecifier)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Operator–UU²is“Å','“²or“an“elemen¸ãt“of“the“ÅOperatorŽŸ ‘²list–UUis“Å','ŽŽ’㥄ffŽ’éÒqpermission‘¡E‰ff&fŽ‘Ç«error(modify,–?ýoperator,“',')ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘OpSpecifier–UU²is“a“spGeci er“suc¸ãh“that“ÅOperatorŽŸ ‘²w•¸ãould›UUha“v“e˜a˜pGost x˜and˜an˜in x˜de nition.ŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(create,‘?ýoperator,ŽŸ ’éÒqOperator)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸyØ+‘øãÄP•®9ortabilit“yޤ‘øã²ISO‘UUpredicate.Ž¡‘øãThe–4…ISO‘4|reference›4„implies“that˜if“a“program˜calls“Åcurrent‘¡E‰ff&fŽ‘Ç«op/3²,‘;then“moGdi es˜an“opGerator˜de nition“b¸ãyޤ ‘øãcalling‘3qÅop/3–ä²and“bac•¸ãktrac“ks›åin“to–äthe“call“to“Åcurrent‘¡E‰ff&fŽ‘Ç«op/3²,‘Èthen“the“c¸ãhanges“are˜guaran¸ãteed“not“to“a ectŽ¡‘øãthat–UUÅcurrent‘¡E‰ff&fŽ‘Ç«op/3“²goal.‘qÇThis“is“not“guaranš¸ãteed“b˜y“GNU“Prolog.ŽŸ%þ6‘øãÄ7.14.11Ž‘'†…Åcurrent‘¡E‰ff&fŽ‘Ç«op/3ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åcurrent‘¡E‰ff&fŽ–Ç«op(?integer,›?ý?operator‘¡E‰ff&fŽ“specifier,˜?atom)Ž¡‘øãÄDescriptionޤ‘øãÅcurrent‘¡E‰ff&fŽ‘Ç«op(Priority,–?ýOpSpecifier,“Operator)–„@²succeeds›„?if‘K]ÅOperator“²is˜an“opGerator˜with“propGertiesŽ© ‘øãde ned–UUbš¸ãy“spGeci er“ÅOpSpecifier“²and“ÅPriority².‘qÇThis“predicate“is“re-executable“on“bac˜ktrac˜king.Ž¡‘øãÄErrorsŽŸ.LÌ‘øãŸßš‰ffÇ>|¤fdŸ™œ„ffŸðfd‘ÅPriority–UU²is“neither“a“v‘ÿqÇariable“nor“an“opGeratorަ‘priorit¸ãyŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(operator‘¡E‰ff&fŽ“priority,‘?ýPriority)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘OpSpecifier–UU²is“neither“a“v‘ÿqÇariable“nor“anަ‘op•Gerator‘UUsp“eci erŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(operator‘¡E‰ff&fŽ“specifier,ަ’éÒqOpSpecifier)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Operator–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýOperator)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽŸ0>“‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicate.ŽŸ%þ6‘øãÄ7.14.12Ž‘'†…Åchar‘¡E‰ff&fŽ‘Ç«conversion/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ‘ã Åchar‘¡E‰ff&fŽ‘Ç«conversion(+character,‘?ý+character)ŽŽŸŽŒ‹gØe Ú‹– ý"EŸüfd‘øã²7.14‘ T‘ÿ*ªerm‘UUinput/outputŽŽŽ’±!€103ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄDescriptionŽ©‘øãÅchar‘¡E‰ff&fŽ‘Ç«conversion(InChar,‘?ýOutChar)–U&²alters“the›U'c•¸ãharacter-con“v“ersion–U&mapping.‘q:This˜mapping“is“usedޤ ‘øãbš¸ãy–E|¤fdŸ™œ„ ffŸüfd‘ÅInChar–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘OutChar–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘InChar–UU²is“neither“a“v‘ÿqÇariable“nor“a“c¸ãharacterŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýInChar)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘OutChar–UU²is“neither“a“v‘ÿqÇariable“nor“a“c¸ãharacterŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýOutChar)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ*qÆ‘øãÄP•®9ortabilit“yަ‘øã²ISO›xjpredicate.‘ÛThe–xsÅtype‘¡E‰ff&fŽ‘Ç«error(character,...)‘Û ²is‘xra“GNU˜Prolog‘xrbGeha¸ãvior,‘:the“ISO‘xireference“insteadŽ¡‘øãde nes–«ga›«fÅrepresentation‘¡E‰ff&fŽ‘Ç«error(character)“²in˜this“case.‘sûThis“seems˜to“bGe˜an“error“of˜the“ISO‘«Prefer-Ž¡‘øãence–·%since,‘Ïšfor“man¸ãy›·&other“built-in“predicates˜accepting“a˜c¸ãharacter“(e.g.‘—8Åchar‘¡E‰ff&fŽ–Ç«code/2²,‘ÏšÅput‘¡E‰ff&fŽ“char/2²),‘Ï™aŽ¡‘øãÅtype‘¡E‰ff&fŽ‘Ç«error–UU²is“raised.ަ‘øãThe–³|ISO‘³Rreference“implies“that›³{if“a˜program“calls“Åcurrent‘¡E‰ff&fŽ–Ç«char‘¡E‰ff&fŽ“conversion/2²,‘ÓÚthen–³|moGdi es˜the“c¸ãharac-Ž¡‘øãter–¾Imapping›¾Jb¸ãy“calling‘á×Åchar‘¡E‰ff&fŽ‘Ç«conversion/2²,‘Üand˜bac•¸ãktrac“ks‘¾Iin“to˜the–¾Icall˜to“Åcurrent‘¡E‰ff&fŽ–Ç«char‘¡E‰ff&fŽ“conversion/2Ž¡‘øã²then–kØthe‘k×cš¸ãhanges“are“guaran˜teed›k×not“to“a ect“that˜Åcurrent‘¡E‰ff&fŽ–Ç«char‘¡E‰ff&fŽ“conversion/2–kزgoal.‘µOThis“is˜not“guar-Ž¡‘øãan•¸ãteed›UUb“y˜GNU˜Prolog.ŽŸ%þ6‘øãÄ7.14.13Ž‘'†…Åcurrent‘¡E‰ff&fŽ–Ç«char‘¡E‰ff&fŽ“conversion/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åcurrent‘¡E‰ff&fŽ–Ç«char‘¡E‰ff&fŽ“conversion(?character,‘?ý?character)Ž¡‘øãÄDescriptionަ‘øãÅcurrent‘¡E‰ff&fŽ–Ç«char‘¡E‰ff&fŽ“conversion(InChar,‘?ýOutChar)–P\²succeeds“if›P[the“con•¸ãv“ersion–P\of‘yÅInChar˜²is“ÅOutChar“²accordingޤ ‘øãto–Uthe“c•¸ãharacter-con“v“ersion–Tmapping.‘ïÇIn“that–Ucase,‘‰ÕÅInChar“²and“ÅOutChar‘T²are“di eren¸ãt.‘ïÆThis“predicate“isŽ¡‘øãre-executable–UUon“bac•¸ãktrac“king.ަ‘øãÄErrorsŽŸ™‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅInChar–UU²is“neither“a“v‘ÿqÇariable“nor“a“c¸ãharacterŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýInChar)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘OutChar–UU²is“neither“a“v‘ÿqÇariable“nor“a“c¸ãharacterŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýOutChar)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yަ‘øã²ISO–UUpredicate.‘qÇSame“remark“as“for“c•¸ãhar‘™˜‰ffŽ‘™šcon“v“ersion/2–UU(section“7.14.12,“page“102).ŽŽŸŽŒ‹héJ Ú‹– ý"EŸüfd‘øã²104ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÇ7.15Ž‘cInput/output–€from/to“constan t“termsŽ©uT‘øã²These–$µbuilt-in“predicates›$¶enable“a“Prolog“term˜to“bGe“input“from˜or“output“to“a˜Prolog“constan¸ãt“termޤ ‘øã(atom,‘…page“92)˜and“Åread‘¡E‰ff&fŽ‘Ç«token/2“²(section˜7.14.3,‘Æ>page˜94)“exceptŽ¡‘øãthat–UUcš¸ãharacters“are“not“read“from“a“text-stream“but“from“ÅAtom²;“the“atom“giv˜en“as“ rst“argumen˜t.ަ‘øãÄErrorsŽŸ(LÌ‘øãŸåš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅAtom–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²see–UUassoGciated“predicate“errorsŽŽ’㥄ffŽ’éÒq(section–UU7.14.1,“page“92)“and“(section“7.14.3,ŽŸ ’éÒqpage‘UU94)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ*>“‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%7f‘øãÄ7.15.2Ž‘!ƇÅread‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“chars/3Ä,›ÕTÅread‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“chars/2Ä,˜Åread‘¡E‰ff&fŽ“token‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“chars/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ©dt‘ã Åread‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“chars(+character‘¡E‰ff&fŽ“list–?ý?term,“+read‘¡E‰ff&fŽ–Ç«option‘¡E‰ff&fŽ“list)Ž¡‘ã read‘¡E‰ff&fŽ–Ç«from‘¡E‰ff&fŽ“chars(+character‘¡E‰ff&fŽ“list,‘?ý?term)Ž¡‘ã read‘¡E‰ff&fŽ–Ç«token‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“chars(+character‘¡E‰ff&fŽ“list,‘?ý?nonvar)ަ‘øãÄDescriptionŽ©‘øã²Lik¸ãe–¯©Åread‘¡E‰ff&fŽ‘Ç«term/3²,‘Æ=Åread/2“²(section›¯¨7.14.1,‘Æ>page“92)˜and“Åread‘¡E‰ff&fŽ‘Ç«token/2“²(section˜7.14.3,‘Æ>page˜94)“exceptŽ¡‘øãthat–£Pc¸ãharacters“are›£Qnot“read“from“a˜text-stream“but“from“ÅChars²;‘Þ¨the“cš¸ãharacter“list“giv˜en‘£Qas“ rst“argumen˜t.ަ‘øãÄErrorsŽŸ:ÿ‘øãŸÒæg‰ffÇ>|©fdŸ™œ„ffŸðfd‘ÅChars–UU²is“a“partial“list“or“a“list“with“an“elemen¸ãt“ÅEŽ¡‘²whic¸ãh–UUis“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘Chars–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýChars)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅChars“²list“is“neither“aŽ¡‘v‘ÿqÇariable–UUnor“a“c¸ãharacterŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²see–UUassoGciated“predicate“errorsŽŽ’㥄ffŽ’éÒq(section–UU7.14.1,“page“92)“and“(section“7.14.3,Ž¡’éÒqpage‘UU94)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.15.3Ž‘!ƇÅread‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“codes/3Ä,›ÕTÅread‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“codes/2Ä,˜Åread‘¡E‰ff&fŽ“token‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“codes/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ6‘ã Åread‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“codes(+character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list–?ý?term,“+read‘¡E‰ff&fŽ–Ç«option‘¡E‰ff&fŽ“list)ޤ ‘ã read‘¡E‰ff&fŽ–Ç«from‘¡E‰ff&fŽ“codes(+character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list,‘?ý?term)Ž¡‘ã read‘¡E‰ff&fŽ–Ç«token‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“codes(+character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list,‘?ý?nonvar)ŽŸ6Œ‘øãÄDescriptionŽ©‘øã²Lik¸ãe–¯©Åread‘¡E‰ff&fŽ‘Ç«term/3²,‘Æ=Åread/2“²(section›¯¨7.14.1,‘Æ>page“92)˜and“Åread‘¡E‰ff&fŽ‘Ç«token/2“²(section˜7.14.3,‘Æ>page˜94)“exceptŽ¡‘øãthat–Écš¸ãharacters“are“not“read“from“a“text-stream“but“from“ÅCodes²;‘pthe“c˜haracter“coGde“list“giv˜en“as“ rstŽ¡‘øãargumen¸ãt.ަ‘øãÄErrorsŽŸF³2‘øãŸÆ³4‰ffÇ>|©fdŸ™œ„ffŸðfd‘ÅCodes–UU²is“a“partial“list“or“a“list“with“an“elemen¸ãt“ÅEŽ¡‘²whic¸ãh–UUis“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘Codes–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýCodes)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅCodes“²list“is“neither“aŽ¡‘v‘ÿqÇariable–UUnor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–UUelemenš¸ãt“ÅE“²of“the“ÅCodes“²list“is“an“in˜teger“butŽ¡‘not–UUa“c¸ãharacter“coGdeŽŽ’㥄ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(character‘¡E‰ff&fŽ“code,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²see–UUassoGciated“predicate“errorsŽŽ’㥄ffŽ’éÒq(section–UU7.14.1,“page“92)“and“(section“7.14.3,Ž¡’éÒqpage‘UU94)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸH¤ù‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%›½‘øãÄ7.15.4Ž‘!ƇÅwrite‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/3Ä,›ÕTÅwrite‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/2Ä,˜Åwriteq‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/2Ä,Ž¡‘!ƇÅwrite‘¡E‰ff&fŽ–Ç«canonical‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/2Ä,›ÕTÅdisplay‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/2Ä,˜Åprint‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/2Ä,Ž¡‘!ƇÅformat‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“atom/3ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ6Œ‘ã Åwrite‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom(?atom,–?ý?term,“+write‘¡E‰ff&fŽ–Ç«option‘¡E‰ff&fŽ“list)Ž¡‘ã write‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“atom(?atom,‘?ý?term)Ž¡‘ã writeq‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“atom(?atom,‘?ý?term)Ž¡‘ã write‘¡E‰ff&fŽ–Ç«canonical‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom(?atom,‘?ý?term)Ž¡‘ã display‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“atom(?atom,‘?ý?term)Ž¡‘ã print‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“atom(?atom,‘?ý?term)Ž¡‘ã format‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“atom(?atom,›?ý+character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“atom,˜+list)ŽŸ6‘øãÄDescriptionަ‘øã²Similar‘õto‘õÅwrite‘¡E‰ff&fŽ›Ç«term/3²,‘TÅwrite/2²,–UÅwriteq/2²,“Åwrite‘¡E‰ff&fŽ˜canonical/2²,“Ådisplay/2²,‘TÅprint/2‘õ²(section‘õ7.14.6,Ž¡‘øãpage–£ç96)“and“Åformat/3“²(section“7.14.7,‘Çdpage“98)“except“that“cš¸ãharacters“are“not“written“on˜to“a“text-streamŽ¡‘øãbut–UUare“collected“as“an“atom“whicš¸ãh“is“then“uni ed“with“the“ rst“argumen˜t“ÅAtom².ަ‘øãÄErrorsŽŸ"™‘øãŸëL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅAtom–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²see–UUassoGciated“predicate“errorsŽŽ’㥄ffŽ’éÒq(section–UU7.14.6,“page“96)“and“(section“7.14.7,ŽŸ ’éÒqpage‘UU98)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ$ `‘øãÄP•®9ortabilit“yŽŽŸŽŒ‹j ² Ú‹– ý"EŸüfd‘øã²106ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãGNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.15.5Ž‘!ƇÅwrite‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/3Ä,›ÕTÅwrite‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/2Ä,˜Åwriteq‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/2Ä,ޤ ‘!ƇÅwrite‘¡E‰ff&fŽ–Ç«canonical‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/2Ä,›ÕTÅdisplay‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/2Ä,˜Åprint‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/2Ä,Ž¡‘!ƇÅformat‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“chars/3ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åwrite‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars(?character‘¡E‰ff&fŽ“list,–?ý?term,“+write‘¡E‰ff&fŽ–Ç«option‘¡E‰ff&fŽ“list)Ž¡‘ã write‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“chars(?character‘¡E‰ff&fŽ“list,‘?ý?term)Ž¡‘ã writeq‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“chars(?character‘¡E‰ff&fŽ“list,‘?ý?term)Ž¡‘ã write‘¡E‰ff&fŽ–Ç«canonical‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars(?character‘¡E‰ff&fŽ“list,‘?ý?term)Ž¡‘ã display‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“chars(?character‘¡E‰ff&fŽ“list,‘?ý?term)Ž¡‘ã print‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“chars(?character‘¡E‰ff&fŽ“list,‘?ý?term)Ž¡‘ã format‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“chars(?character‘¡E‰ff&fŽ“list,›?ý+character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“atom,˜+list)ަ‘øãÄDescriptionŽ©‘øã²Similar‘õto‘õÅwrite‘¡E‰ff&fŽ›Ç«term/3²,‘TÅwrite/2²,–UÅwriteq/2²,“Åwrite‘¡E‰ff&fŽ˜canonical/2²,“Ådisplay/2²,‘TÅprint/2‘õ²(section‘õ7.14.6,Ž¡‘øãpage–£ç96)“and“Åformat/3“²(section“7.14.7,‘Çdpage“98)“except“that“cš¸ãharacters“are“not“written“on˜to“a“text-streamŽ¡‘øãbut–UUare“collected“as“a“cš¸ãharacter“list“whic˜h“is“then“uni ed“with“the“ rst“argumen˜t“ÅChars².ަ‘øãÄErrorsŽŸ"™‘øãŸëL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅChars–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýChars)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²see–UUassoGciated“predicate“errorsŽŽ’㥄ffŽ’éÒq(section–UU7.14.6,“page“96)“and“(section“7.14.7,ŽŸ ’éÒqpage‘UU98)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ$ `‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.15.6Ž‘!ƇÅwrite‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/3Ä,›ÕTÅwrite‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/2Ä,˜Åwriteq‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/2Ä,Ž¡‘!ƇÅwrite‘¡E‰ff&fŽ–Ç«canonical‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/2Ä,›ÕTÅdisplay‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/2Ä,˜Åprint‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/2Ä,Ž¡‘!ƇÅformat‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“codes/3ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åwrite‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes(?character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list,–?ý?term,“+write‘¡E‰ff&fŽ–Ç«option‘¡E‰ff&fŽ“list)Ž¡‘ã write‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“codes(?character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list,‘?ý?term)Ž¡‘ã writeq‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“codes(?character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list,‘?ý?term)Ž¡‘ã write‘¡E‰ff&fŽ–Ç«canonical‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes(?character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list,‘?ý?term)Ž¡‘ã display‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“codes(?character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list,‘?ý?term)Ž¡‘ã print‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“codes(?character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list,‘?ý?term)Ž¡‘ã format‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“codes(?character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list,›?ý+character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“atom,˜+list)ަ‘øãÄDescriptionŽ©‘øã²Similar‘õto‘õÅwrite‘¡E‰ff&fŽ›Ç«term/3²,‘TÅwrite/2²,–UÅwriteq/2²,“Åwrite‘¡E‰ff&fŽ˜canonical/2²,“Ådisplay/2²,‘TÅprint/2‘õ²(section‘õ7.14.6,Ž¡‘øãpage–£ç96)“and“Åformat/3“²(section“7.14.7,‘Çdpage“98)“except“that“cš¸ãharacters“are“not“written“on˜to“a“text-streamŽ¡‘øãbut–UUare“collected“as“a“cš¸ãharacter“coGde“list“whic˜h“is“then“uni ed“with“the“ rst“argumen˜t“ÅCodes².ަ‘øãÄErrorsŽŽŸŽŒ‹kÓ Ú‹– ý"EŸüfd‘øã²7.16‘ DEC-10–UUcompatibilit¸ãy“input/outputŽŽŽ’±!€107ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýj;Þ‘øãŸëL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅCodes–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýCodes)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²see–UUassoGciated“predicate“errorsŽŽ’㥄ffŽ’éÒq(section–UU7.14.6,“page“96)“and“(section“7.14.7,ŽŸ ’éÒqpage‘UU98)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ$ `‘øãÄP•®9ortabilit“yŽŸ‘øã²GNU–UUProlog“predicates.ŽŸ'þ6‘øãÇ7.16Ž‘cDEC-10–€compatibilit y“input/outputޤuT‘øãÄ7.16.1Ž‘!ƇIn®9troQÇductionŽ¡‘øã²The–CsDEC-10“Prolog“I/O‘C6predicates“manipulate“streams“implicitly“since“they“only“refer“to“curren¸ãt“in-ޤ ‘øãput/output–FÉstreams“(section›FÈ7.10.1,‘ƒ&page“67).‘F"The“curren¸ãt“input“and“output“streams˜are“initially“setŽ¡‘øãto–3Åuser‘¡E‰ff&fŽ›Ç«input“²and‘3€Åuser‘¡E‰ff&fŽ˜output“²respGectiv¸ãely‘ÿ*ª.› FThe“predicate“Åsee/1“²(resp.˜Åtell/1²,‘k Åappend/1²)“can“bGeŽ¡‘øãused–-for“setting“the“curren¸ãt“input“(resp.‘ùoutput)“stream“to“newly“opGened“streams“for“particular“ les.Ž¡‘øãThe–g…predicate›g„Åseen/0“²(resp.‘¨UÅtold/0²)“close˜the“curren¸ãt˜input“(resp.‘¨Uoutput)“stream,‘land˜resets“it˜to“theŽ¡‘øãstandard›<íinput‘<î(resp.–(output).“The˜predicate‘<îÅseeing/1˜²(resp.“Åtelling/1²)–<îis˜used˜for“retrieving˜theŽ¡‘øã le–úðname›úñassoGciated“with“the“curren¸ãt˜input“(resp.›b™output)“stream.˜The“ le“name“Åuser‘úñ²stands“for“theŽ¡‘øãstandard–šQinput“or›šPoutput,‘«depGending“on˜con¸ãtext“(Åuser‘¡E‰ff&fŽ›Ç«input“²and“Åuser‘¡E‰ff&fŽ˜output‘šP²can“also“bGe“used).‘@ºTheŽ¡‘øãDEC-10››£Prolog–›¢I/O‘›‘predicates“are˜only˜pro¸ãvided“for˜compatibilit¸ãy‘ÿ*ª,‘­6they˜are“no¸ãw˜obsolete˜and“their˜useŽ¡‘øãis–AÈdiscouraged.‘7The“predicates›AÇfor“explicit“stream“manipulation˜should“bGe“used“instead˜(section“7.10,Ž¡‘øãpage‘UU67).ŽŸ%þ6‘øãÄ7.16.2Ž‘!ƇÅsee/1Ä,–ÕTÅtell/1Ä,“Åappend/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åsee(+source‘¡E‰ff&fŽ‘Ç«sink)Ž¡‘ã see(+stream)Ž¡‘ã tell(+source‘¡E‰ff&fŽ‘Ç«sink)Ž¡‘ã tell(+stream)Ž¡‘ã append(+source‘¡E‰ff&fŽ‘Ç«sink)Ž¡‘ã append(+stream)ަ‘øãÄDescriptionŽ©‘øãÅsee(FileName)–0œ²sets“the›0›curren¸ãt“input“stream“to˜ÅFileName².‘eŠIf“there˜is“a“stream“opGened˜b¸ãy‘T)Åsee/1“²assoGci-Ž¡‘øãated–§ýwith›§þthe“same˜ÅFileName“²already‘ÿ*ª,‘¼¨then˜it“bGecomes“the˜curren¸ãt“input˜stream.‘iÀOtherwise,‘¼¨ÅFileNameŽ¡‘øã²is–UUopšGened“for“reading“and“b˜ecomes“the“curren¸ãt“input“stream.ަ‘øãÅtell(FileName)–ɲsets“the“curren¸ãt“output›Êstream“to“ÅFileName².‘È#If“there“is˜a“stream“opGened“b¸ãy‘@VÅtell/1Ž¡‘øã²assošGciated––úwith“the“same“ÅFileName“²already‘ÿ*ª,‘çcthen“it“b˜ecomes‘–ûthe“curren¸ãt“output“stream.‘6¶Otherwise,Ž¡‘øãÅFileName–UU²is“opšGened“for“writing“and“b˜ecomes“the“curren¸ãt“output“stream.ަ‘øãÅappend(FileName)–UU²lik¸ãe“Åtell/1“²but“ÅFileName“²is“opšGened“for“writing“+“app˜end.ަ‘øãA‘ÈÊstream-term›Èé(obtained–Èèwith“an¸ãy“other˜built-in“predicate)“can“also˜bGe“pro¸ãvided“as“ÅFileName˜²to“theseŽ¡‘øãpredicates.ަ‘øãÄErrorsަ‘øã²See–UUerrors“assoGciated“with“Åopen/4“²(section“7.10.6,“page“70).ŽŽŸŽŒ‹l+á Ú‹– ý"EŸüfd‘øã²108ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.16.3Ž‘!ƇÅseeing/1Ä,‘ÕTÅtelling/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åseeing(?source‘¡E‰ff&fŽ‘Ç«sink)ŽŸ ‘ã telling(?source‘¡E‰ff&fŽ‘Ç«sink)Ž¡‘øãÄDescriptionަ‘øãÅseeing(FileName)–ý²succeeds›üif‘äÅFileName“²uni es˜with“the“name“of˜the“curren¸ãt“input˜ le,‘(Bif“it˜w¸ãas“opGenedޤ ‘øãbš¸ãy‘xâÅsee/1²;–UUelse“with“the“curren˜t“input“stream-term,“if“this“is“not“Åuser‘¡E‰ff&fŽ‘Ç«input²,“otherwise“with“Åuser².ަ‘øãÅtelling(FileName)›™Ê²succeeds–™Ëif‘`çÅFileName“²uni es˜with“the˜name“of˜the“curren¸ãt˜output“ le,‘êçif“it˜w¸ãasŽ¡‘øãopGened–ûÐb¸ãy‘^Åtell/1“²or›ûÑÅappend/1²;‘Oelse“with“the˜curren¸ãt“output“stream-term,‘%oif˜this“is˜not“Åuser‘¡E‰ff&fŽ‘Ç«output²,Ž¡‘øãotherwise–UUwith“Åuser².ަ‘øãÄErrorsަ‘øã²None.ަ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.16.4Ž‘!ƇÅseen/0Ä,‘ÕTÅtold/0ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã ÅseenŽ¡‘ã toldަ‘øãÄDescriptionޤ‘øãÅseen–UU²closes“the“curren¸ãt“input,“and“resets“it“to“Åuser‘¡E‰ff&fŽ‘Ç«input².Ž¡‘øãÅtold–UU²closes“the“curren¸ãt“output,“and“resets“it“to“Åuser‘¡E‰ff&fŽ‘Ç«output².Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.16.5Ž‘!ƇÅget0/1Ä,–ÕTÅget/1Ä,“Åskip/1ŽŸuT‘øãÄT‘ÿ «emplatesŽŽŸŽŒ‹m91 Ú‹– ý"EŸüfd‘øã²7.17‘ T‘ÿ*ªerm‘UUexpansionŽŽŽ’±!€109ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Åget0(?in‘¡E‰ff&fŽ–Ç«character‘¡E‰ff&fŽ“code)ޤ ‘ã get(?in‘¡E‰ff&fŽ–Ç«character‘¡E‰ff&fŽ“code)Ž¡‘ã skip(+character‘¡E‰ff&fŽ‘Ç«code)ŽŸ,‘øãÄDescriptionŽ©‘øãÅget0(Code)–Ùù²succeeds“if‘¡ÅCode›Ùú²uni es“with“the“next“c¸ãharacter“coGde“read“from˜the“curren¸ãt“input“stream.Ž¡‘øãThš¸ãus–UUit“is“equiv‘ÿqÇalen˜t“to“Åget‘¡E‰ff&fŽ‘Ç«code(Code)“²(section“7.12.1,“page“85).ަ‘øãÅget(Code)–÷v²succeeds›÷uif‘¾“ÅCode“²uni es˜with“the˜next“c¸ãharacter“coGde˜read“from˜the“curren¸ãt“input˜stream“thatŽ¡‘øãis–UUnot“a“la•¸ãy“out‘UUc“haracter.ަ‘øãÅskip(Code)–UU²skips“just“past“the“next“cš¸ãharacter“coGde“ÅCode“²from“the“curren˜t“input“stream.ަ‘øãÄErrorsަ‘øã²See–UUerrors“for“Åget‘¡E‰ff&fŽ‘Ç«code/2“²(section“7.12.1,“page“85).ަ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%Й‘øãÄ7.16.6Ž‘!ƇÅput/1Ä,‘ÕTÅtab/1ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ,‘ã Åput(+character‘¡E‰ff&fŽ‘Ç«code)Ž¡‘ã tab(+evaluable)ŽŸ,‘øãÄDescriptionަ‘øãÅput(Code)–ª•²writes“the“cš¸ãharacter“whose“coGde“is“ÅCode“²on˜to“the“curren˜t“output“stream.‘q‡It“is“equiv‘ÿqÇalen˜t“toŽ¡‘øãÅput‘¡E‰ff&fŽ‘Ç«code(Code)–UU²(section“7.12.5,“page“88).ަ‘øãÅtab(N)–UU²writes“ÅN“²spaces“onš¸ãto“the“curren˜t“output“stream.‘qÇÅN“²ma˜y“bGe“an“arithmetic“expression.ަ‘øãÄErrorsަ‘øã²See–± errors›± for“Åput‘¡E‰ff&fŽ‘Ç«code/2“²(section˜7.12.5,‘Ñçpage“88)˜and“for“arithmetic˜expressions“(section˜7.6.1,‘Ñçpage“57).ަ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ'Й‘øãÇ7.17Ž‘cT‘þàerm‘€expansionޤuT‘øãÄ7.17.1Ž‘!ƇDe nite–ÕTclause“grammarsŽ¡‘øã²De nite–±clause“grammars“are“a“useful“notation“to‘±€express“grammar“rules.‘;,Ho•¸ãw“ev“er–±the“ISO‘±Wreference“doGesޤ ‘øãnot›°include–±them,‘jso“they˜should˜bGe“considered˜as˜a˜system“depGenden¸ãt˜feature.‘UåDe nite“clause˜grammarsŽ¡‘øãare–UUan“extension“of“con¸ãtext-free“grammars.‘qÇA“grammar“rule“is“of“the“form:ޤ,‘ã head–?ýÅ-->“²b•Go“dyÅ.Ž¡‘øã-->–UU²is“a“prede ned“in x“opGerator“(section“7.14.10,“page“100).ŽŽŸŽŒ‹n?A Ú‹– ý"EŸüfd‘øã²110ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãHere–UUare“some“features“of“de nite“clause“grammars:ޤ‘ã¸ŽŽŽ‘ã ²a–UUnon-terminal“symš¸ãbGol“ma˜y“bGe“an˜y“callable“term.Ž¡‘ã¸ŽŽŽ‘ã ²a–¨rterminal‘¨ssymš¸ãbGol“ma˜y“bGe‘¨san˜y“Prolog“term›¨sand“is˜written“as“a˜list.‘kThe“empt¸ãy“list˜represen¸ãts“anŽ© ‘ã empt¸ãy–UUsequence“of“terminals.Ž¡‘ã¸ŽŽŽ‘ã ²a–UUsequence“is“expressed“using“the“Prolog“conjunction“opGerator“Å(²(',')/2).Ž¡‘ã¸ŽŽŽ‘ã ²the–©«head“of“a“grammar“rule“consists“of“a‘©¬non-terminal“optionally“follo•¸ãw“ed›©«b“y˜a˜sequence˜of˜terminalsަ‘ã (i.e.‘qÇa–UUProlog“list).Ž¡‘ã¸ŽŽŽ‘ã ²the›Ô)/2²)“or“cut“(using˜Å!²).Ž¡‘ã¸ŽŽŽ‘ã ²a–MÎpredicate“call›MÏm¸ãust“bGe“enclosed“in˜curly“brac•¸ãk“ets–MÎ(using‘q[Å{}/1²).‘oEThis“mak¸ães“it˜pGossible“to“expressަ‘ã an–UUextra“condition.Ž¡‘øãA‘Èhgrammar–Ȇrule“is›È…nothing“but“a“\syn¸ãtactic˜sugar"“for“a“Prolog“clause.‘ËYEac¸ãh“grammar˜rule“accepts“asަ‘øãinput–nˆa“list“of›n‰terminals“(tok¸ãens),‘´Ôparses“a“pre x˜of“this“list“and“giv¸ães“as“output“the˜rest“of“this“listަ‘øã(pGossibly–:éenlarged).›"ƒThis“rest“is“generally‘:êparsed“later.˜So,‘tNeacš¸ãh“a“grammar“rule“is“translated“in˜to“aަ‘øãProlog–ø7clause›ø8that“explicitly˜the“manages˜the“list.‘R¾Twš¸ão“argumen˜ts“are›ø8then“added:‘C9the“input˜list“(ÅStart²)ަ‘øãand–UUthe“output“list“(ÅStop²).‘qÇF‘ÿ*ªor“instance:Ž¡‘ã Åp–?ý-->“q.Ž¡‘øã²is–UUtranslated“in¸ãto:Ž¡‘ã Åp(Start,–?ýEnd)“:-“q(Start,“End).Ž¡‘øã²Extra–S¹argumenš¸ãts“can‘S¸bGe“pro˜vided“and“the“b•Go“dy–S¹of‘S¸the“rule“can“con˜tain“sev˜eral‘S¸non-terminals.‘q>Example:Ž¡‘ã Åp(X,–?ýY)“-->ަ‘;âñq(X),ަ‘;âñr(X,‘?ýY),ަ‘;âñs(Y).Ž¡‘øã²is–UUtranslated“in¸ãto:Ž¡‘ã Åp(X,–?ýY,“Start,“End)“:-ަ‘;âñq(X,–?ýStart,“A),ަ‘;âñr(X,–?ýY,“A,“B),ަ‘;âñs(Y,–?ýB,“End).Ž¡‘øã²T‘ÿ*ªerminals–UUare“translated“using“uni cation:Ž¡‘ã Åassign(X,Y)–?ý-->“left(X),“[:=],“right(Y),“[;].Ž¡‘øã²is–UUtranslated“in¸ãto:Ž¡‘ã Åassign(X,Y,Start,End)‘?ý:-ަ‘;âñleft(X,–?ýStart,“A),ަ‘;âñA=[:=|B],ަ‘;âñright(Y,–?ýB,“C),ަ‘;âñC=[;|End].Ž¡‘øã²T‘ÿ*ªerminals–UUappGearing“on“the“left-hand“side“of“a“rule“are“connected“to“the“output“argumen¸ãt“of“the“head.ŽŸ‘øãIt–ïµis“pGossible›ï´to“include“a“call˜to“a“prolog“predicate“enclosing˜it“in“curly“brac•¸ãk“ets˜(to–ïµdistinguish“themަ‘øãfrom‘UUnon-terminals):Ž¡‘ã Åassign(X,Y)–?ý-->“left(X),“[:=],“right(Y0),“{Y“is“Y0“},“[;].Ž¡‘øã²is–UUtranslated“in¸ãto:ŽŽŸŽŒ‹oH$ Ú‹– ý"EŸüfd‘øã²7.17‘ T‘ÿ*ªerm‘UUexpansionŽŽŽ’±!€111ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Åassign(X,Y,Start,End)‘?ý:-ޤ ‘;âñleft(X,–?ýStart,“A),Ž¡‘;âñA=[:=|B],Ž¡‘;âñright(Y0,–?ýB,“C),Ž¡‘;âñY–?ýis“Y0,Ž¡‘;âñC=[;|End].Ž©‘øã²Cut,‘Z4disjunction–òÔand›òÕif-then(-else)“are˜translated“literally“(and˜do“not˜need“to˜bGe“enclosed˜in“curlyŽ¡‘øãbrac•¸ãk“ets).ŽŸ%þ6‘øãÄ7.17.2Ž‘!ƇÅexpand‘¡E‰ff&fŽ–Ç«term/2Ä,‘ÕTÅterm‘¡E‰ff&fŽ“expansion/2ŽŸuT‘øãÄT‘ÿ «emplatesަ‘ã Åexpand‘¡E‰ff&fŽ‘Ç«term(?term,‘?ý?term)Ž¡‘ã term‘¡E‰ff&fŽ‘Ç«expansion(?term,‘?ý?term)ަ‘øãÄDescriptionŽŸ‘øãÅexpand‘¡E‰ff&fŽ‘Ç«term(Term1,‘?ýTerm2)–PW²succeeds›PXif‘tÅTerm2“²is“a˜transformation“of‘tÅTerm1².‘pThe˜transformation“stepsŽ¡‘øãare–UUas“follo¸ãws:ަ‘ã¸ŽŽŽ‘ã ²if‘rÅTerm1–UU²is“a“v‘ÿqÇariable,“it“is“uni ed“with“ÅTerm2ަ‘ã¸ŽŽŽ‘ã ²if‘åÅterm‘¡E‰ff&fŽ‘Ç«expansion(Term1,‘?ýTerm2)–ADzsucceeds›AÈÅTerm2“²is˜assumed“to˜bGe“the˜transformation“of‘åÅTerm1².ަ‘ã¸ŽŽŽ‘ã ²if‘rÅTerm1–UU²is“a“DCG“then“ÅTerm2“²is“its“translation“(section“7.17.1,“page“109).ަ‘ã¸ŽŽŽ‘ã ²otherwise–UUÅTerm2“²is“uni ed“with“ÅTerm1².ަ‘øãÅterm‘¡E‰ff&fŽ‘Ç«expansion(Term1,‘?ýTerm2)–o²is“a›nhoGok“predicate“allo¸ãwing“the“user“to˜de ne“a“spGeci c“transformation.Ž©‘øãThe–ð•GNU‘ð+Prolog“compiler“(section›ð”3.4,‘Wepage“20)“automatically˜calls“Åexpand‘¡E‰ff&fŽ‘Ç«term/2“²on“eac¸ãh“ÅTerm1Ž¡‘øã²read›£in.‘ ¬°Ho•¸ãw“ev“er,‘ƒ6in˜the˜curren“t˜release,‘ƒ5only˜DCG‘0transformation˜are˜done‘¢b“y˜the˜compiler˜(i.e.Ž¡‘øãÅterm‘¡E‰ff&fŽ›Ç«expansion/2– ɲcannot“bGe“used).‘$T‘ÿ*ªo“use“Återm‘¡E‰ff&fŽ˜expansion/2²,‘6æit“is“necessary“to“call“Åexpand‘¡E‰ff&fŽ˜term/2Ž¡‘øã²explicitly‘ÿ*ª.ަ‘øãÄErrorsަ‘øã²None.ަ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.17.3Ž‘!ƇÅphrase/3Ä,‘ÕTÅphrase/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åphrase(?term,–?ý?list,“?list)Ž¡‘ã phrase(?term,‘?ý?list)ަ‘øãÄDescriptionŽŸ‘øãÅphrase(Phrase,–?ýList,“Remainder)–`²succeeds“if“the“list“ÅList“²is‘ain“the“language“de ned“b¸ãy“the“grammarŽ¡‘øãrule›UUb•Go“dy‘xâÅPhrase².‘qÇÅRemainder˜²is˜what˜remains˜of˜the˜list˜after˜a˜phrase˜has˜b“een˜found.ŽŽŸŽŒ‹pS- Ú‹– ý"EŸüfd‘øã²112ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅphrase(Phrase,›?ýList)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åphrase(Phrase,˜List,˜[])².ޤ‘øãÄErrorsŽŸ™‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅList–UU²is“neither“a“list“nor“a“partial“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýList)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Remainder–UU²is“neither“a“list“nor“a“partial“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýRemainder)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ'þ6‘øãÇ7.18Ž‘cLogic,–€con trol“and“exceptionsޤuT‘øãÄ7.18.1Ž‘!ƇÅabort/0Ä,–ÕTÅstop/0Ä,“Åtop‘¡E‰ff&fŽ‘Ç«level/0Ä,“Åbreak/0Ä,“Åhalt/1Ä,“Åhalt/0Ž¡‘øãÄT‘ÿ «emplatesŽ©‘ã Åabortޤ ‘ã stopŽ¡‘ã top‘¡E‰ff&fŽ‘Ç«levelŽ¡‘ã breakŽ¡‘ã halt(+integer)Ž¡‘ã haltަ‘øãÄDescriptionŽ©‘øãÅabort–Q ²abGorts“the“curren¸ãt›Qexecution.‘pYIf“this˜execution“wš¸ãas“initiated“under“a“top-lev˜el‘Qthe“con˜trol“is“giv˜enŽ¡‘øãbacš¸ãk–Dto‘Džthe“top-lev˜el›Džand“the˜message“Å{execution‘?ýaborted}˜²is“displa•¸ãy“ed.–? Otherwise,‘€pe.g.“executionŽ¡‘øãstarted–=‰b¸ãy›=ˆa“Åinitialization/1˜²directiv¸ãe“(section˜6.1.13,›w•page“45),˜Åabort/0›=ˆ²is“equiv‘ÿqÇalen¸ãt˜to“Åhalt(1)Ž¡‘øã²(see‘UUbGelo¸ãw).ަ‘øãÅstop–ç²stops“the‘çcurrenš¸ãt“execution.‘&ÖIf“this“execution“w˜as“initiated‘çunder“a“top-lev˜el“the‘çcon˜trol“is“giv˜enŽ¡‘øãbacš¸ãk–UUto“the“top-lev˜el.‘qÇOtherwise,“Åstop/0“²is“equiv‘ÿqÇalen˜t“to“Åhalt(0)“²(see“bGelo˜w).ަ‘øãÅtop‘¡E‰ff&fŽ‘Ç«level–^ˆ²starts“a‘^‰new“recursivš¸ãe“top-lev˜el“(including“the‘^‰banner“displa˜y).‘`T‘ÿ*ªo“end‘^‰this“new“top-lev˜elŽ¡‘øãsimply–UUtš¸ãypGe“the“end-of- le“k˜ey“sequence“(ÅCtl-D²)“or“its“term“represen˜tation:‘qÇÅend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“file.ަ‘øãbreak›˜Ì²in•¸ãv“ok“es˜a‘˜Írecursiv“e˜top-lev“el˜(no˜banner‘˜Íis˜displa“y“ed).‘<,T‘ÿ*ªo‘˜Íend˜this˜new˜lev“el‘˜Ísimply˜t“ypGe˜theŽ¡‘øãend-of- le–UUkš¸ãey“sequence“(ÅCtl-D²)“or“its“term“represen˜tation:‘qÇÅend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“file.ަ‘øãhalt(Status)–ê[²causes›êZthe“GNU‘ê?Prolog“proGcess˜to“immediately˜exit“bac¸ãk“to˜the“shell˜with“the˜return“coGdeŽ¡‘øãÅStatus².ަ‘øãÅhalt–UU²is“equiv‘ÿqÇalen¸ãt“to“Åhalt(0)².ަ‘øãÄErrorsŽŸ™‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅStatus–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Status–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýStatus)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yަ‘øãÅhalt/1–È ²and›ÈŸÅhalt/0“²are˜ISO‘È‚predicates.‘˧Åabort/0²,–årÅstop/0²,“Åtop‘¡E‰ff&fŽ‘Ç«level/0˜²and–È Åbreak/0“²are˜GNU‘È‚PrologŽ¡‘øãpredicates.ŽŽŸŽŒ‹q\f Ú‹– ý"EŸüfd‘øã²7.18‘ Logic,–UUcon¸ãtrol“and“exceptionsŽŽŽ’±!€113ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.18.2Ž‘!ƇÅonce/1Ä,–ÕTÅ(\+)/1“Ä-“not“pro®9v‘ÿ\rable,“Åcall/2-11Ä,“Åcall‘¡E‰ff&fŽ–Ç«with‘¡E‰ff&fŽ“args/1-11Ä,‘ÕTÅcall‘¡E‰ff&fŽ“det/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åonce(+callable‘¡E‰ff&fŽ‘Ç«term)ޤ ‘ã \+(+callable‘¡E‰ff&fŽ‘Ç«term)Ž¡‘ã call(+callable‘¡E‰ff&fŽ‘Ç«term,–?ý+term,...,“+term)Ž¡‘ã call‘¡E‰ff&fŽ–Ç«with‘¡E‰ff&fŽ“args(+atom,–?ý+term,...,“+term)Ž¡‘ã call‘¡E‰ff&fŽ–Ç«det(+callable‘¡E‰ff&fŽ“term,‘?ý?boolean)ަ‘øãÄDescriptionŽ©‘øãÅonce(Goal)–š<²succeeds›š=if‘aYÅcall(Goal)“²succeeds.‘3jHo•¸ãw“ev“er˜Åonce/1–š<²is˜not“re-executable“on˜bac•¸ãktrac“king‘š|¤fdŸ™œ„ ffŸüfd‘ÅGoal–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Goal–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýGoal)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ'™œ„0ffŸØfd‘²The–UUpredicate“indicator“ÅPred“²of‘rÅGoal“²doGes“notޤ ‘correspšGond–UUto“an“existing“pro˜cedure“and“theŽ¡‘v‘ÿqÇalue–UUof“the“Åunknown“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄0ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(procedure,‘?ýPred)ŽŽ’ÆØŸ'™œ„0ffŽŽŸ(‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Functor–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Functor–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFunctor)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Deterministic–UU²is“neither“a“v‘ÿqÇariable“nor“aŽŸ ‘b•Go“oleanŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(boolean,‘?ýDeterministic)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²for–UUÅcall/2-11“²the“resulting“aritš¸ãy“of‘rÅGoal“²(arit˜yޤ ‘of‘UUÅClosureŽ‘*N ²+‘8àÅNŽ‘xݲ)–UUis“an“in¸ãteger“µ>“Åmax‘¡E‰ff&fŽ‘Ç«arity“² agŽ¡‘(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(max‘¡E‰ff&fŽ“arity)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸa _‘øãÄP•®9ortabilit“yަ‘øãÅonce/1–e‚²and“Å(\+)/1“²are“ISO‘e|ŽŽŽŽ ÃÝ» ý_"E‘øãÅrepeat–žG²generates“an“in nite‘žFsequence“of“bac•¸ãktrac“king›žGc“hoices.‘4ÃThe˜purp•Gose˜is‘žFto˜rep“eatedly˜p“erform˜someޤ ‘øãaction–º¸on‘º·elemenš¸ãts“whic˜h“are“someho˜w–º·generated,‘Ôe.g.‘¡ïb˜y“reading–º¸them“from“a–º·stream,‘Ôun˜til“some‘º¸testŽ¡‘øãb•Gecomes›ðtrue.‘CxRep“eat˜lo“ops˜cannot˜con¸ãtribute˜to˜the˜logic˜of˜the˜program.‘CxThey˜are˜only˜meaningfulŽ¡‘øãif–~ithe›~jaction“in•¸ãv“olv“es–~iside-e ects.‘íThe“only“reason˜for“using“repšGeat“lo˜ops›~jinstead“of“a“more˜natural“tail-Ž¡‘øãrecursiv•¸ãe›ghform“ulation–ggis˜eciency:‘•ìwhen˜the˜test˜fails“bac¸ãk,‘kíthe“Prolog˜engine˜immediately“reclaims˜an¸ãyŽ¡‘øãw¸ãorking–UUstorage“consumed“since“the“call“to“Årepeat/0².ޤ‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicate.ŽŸ%‰”‘øãÄ7.18.4Ž‘!ƇÅfor/3Ž©uT‘øãÄT‘ÿ «emplatesޤâ6‘ã Åfor(?integer,–?ý+integer,“+integer)Ž¡‘øãÄDescriptionޤ‘øãÅfor(Counter,–?ýLower,“Upper)–Ñ>²generates›Ñ?an“sequence˜of“bac•¸ãktrac“king˜c“hoices›Ñ>instan“tiating‘ôÌÅCounter˜²toŽŸ ‘øãthe–UUv‘ÿqÇalues“ÅLower²,“ÅLower+1²,.–ªª.“.“,‘UUÅUpper².Ž¡‘øãÄErrorsŽŸ.³2‘øãŸÞ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅCounter–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýCounter)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Lower–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Lower–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýLower)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Upper–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Upper–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýUpper)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ0¤ù‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ'‰”‘øãÇ7.19Ž‘cA tomic–€term“pro`cessingަ‘øã²These–Xbuilt-in›Xpredicates“enable˜atomic“terms“to˜bšGe“pro˜cessed›Xas“a“sequence˜of“c¸ãharacters˜and“c¸ãharacterޤ ‘øãcošGdes.‘G¹F‘ÿ*ªacilities–×*exist“to“split“and“join“atoms,‘ðfto“con•¸ãv“ert‘×+a–×*single“c¸ãharacter“to“and“from“the“corresp˜ondingŽ¡‘øãcš¸ãharacter–UUcoGde,“and“to“con˜v˜ert“a“n˜um˜bGer“to“and“from“a“list“of“c˜haracters“and“c˜haracter“coGdes.ŽŸ%‰”‘øãÄ7.19.1Ž‘!ƇÅatom‘¡E‰ff&fŽ‘Ç«length/2ަ‘øãÄT‘ÿ «emplatesޤâ6‘ã Åatom‘¡E‰ff&fŽ‘Ç«length(+atom,‘?ý?integer)Ž¡‘øãÄDescriptionŽŸ‘øãÅatom‘¡E‰ff&fŽ‘Ç«length(Atom,‘?ýLength)–åš²succeeds“if‘¬·ÅLength“²uni es“with“the“n•¸ãum“bGer–åšof“c¸ãharacters“of“the“name“ofŽŸ ‘øãÅAtom².ŽŽŸŽŒ‹sw; Ú‹– ý"EŸüfd‘øã²7.19‘ A¸ãtomic–UUterm“proGcessingŽŽŽ’±!€115ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄErrorsŽŸ(ÿ‘øãŸäæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅAtom–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Length–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýLength)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Length–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýLength)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ*qÆ‘øãÄP•®9ortabilit“yŽ©‘øã²ISO‘UUpredicate.ŽŸ%þ6‘øãÄ7.19.2Ž‘!ƇÅatom‘¡E‰ff&fŽ‘Ç«concat/3ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åatom‘¡E‰ff&fŽ‘Ç«concat(+atom,–?ý+atom,“?atom)ŽŸ ‘ã atom‘¡E‰ff&fŽ‘Ç«concat(?atom,–?ý?atom,“+atom)Ž¡‘øãÄDescriptionަ‘øãÅatom‘¡E‰ff&fŽ‘Ç«concat(Atom1,–?ýAtom2,“Atom12)–:²succeeds›9if“the˜name“of‘ÙVÅAtom12“²is“the˜concatenation“of˜the“nameޤ ‘øãof‘îÜÅAtom1›'À²with–'¿the“name“of‘îÝÅAtom1².‘éThis˜predicate“is“re-executable“on˜bac•¸ãktrac“king–'¿(e.g.‘éif‘îÜÅAtom12“²isŽ¡‘øãinstan¸ãtiated–UUand“bGoth“ÅAtom1“²and“ÅAtom2“²are“v‘ÿqÇariables).ަ‘øãÄErrorsŽŸ.³2‘øãŸÞ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅAtom1–UU²and“ÅAtom12“²are“v‘ÿqÇariablesŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom2–UU²and“ÅAtom12“²are“v‘ÿqÇariablesŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom1–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom1)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom2–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom2)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom12–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom12)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ0¤ù‘øãÄP•®9ortabilit“yަ‘øã²ISO‘UUpredicate.ŽŸ%þ6‘øãÄ7.19.3Ž‘!ƇÅsub‘¡E‰ff&fŽ‘Ç«atom/5ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åsub‘¡E‰ff&fŽ‘Ç«atom(+atom,–?ý?integer,“?integer,“?integer,“?atom)Ž¡‘øãÄDescriptionަ‘øãÅsub‘¡E‰ff&fŽ‘Ç«atom(Atom,–?ýBefore,“Length,“After,“SubAtom)–{²succeeds“if›zatom“ÅAtom“²can“bGe˜split“in¸ãto“threeޤ ‘øãatoms,‘’ ÅAtomL²,–…çÅSubAtom“²and“ÅAtomR‘…Û²sucš¸ãh“that“ÅBefore“²is‘…èthe“n˜um˜bGer“of“c˜haracters“of“the‘…èname“of‘MÅAtomL²,Ž¡‘øãÅLength–ù²is›ùthe“n•¸ãum“bGer‘ùof˜c“haracters–ùof˜the“name“of‘À­ÅSubAtom“²and“ÅAfter˜²is“the˜n•¸ãum“bGer–ùof“c¸ãharacters˜of“theŽ¡‘øãname–UUof‘rÅAtomR².“This“predicate“is“re-executable“on“bac•¸ãktrac“king.ަ‘øãÄErrorsŽŽŸŽŒ‹tƒ Ú‹– ý"EŸüfd‘øã²116ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý¢C‘øãŸÅæh‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅAtom–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘SubAtom–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýSubAtom)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Before–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýBefore)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Length–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýLength)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘After–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýAfter)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Before–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýBefore)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Length–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýLength)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘After–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýAfter)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸIqÅ‘øãÄP•®9ortabilit“yޤ‘øã²ISO‘UUpredicate.Ž©%o‹‘øãÄ7.19.4Ž‘!ƇÅchar‘¡E‰ff&fŽ‘Ç«code/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸiF‘ã Åchar‘¡E‰ff&fŽ–Ç«code(+character,‘?ý?character‘¡E‰ff&fŽ“code)ŽŸ ‘ã char‘¡E‰ff&fŽ–Ç«code(-character,‘?ý+character‘¡E‰ff&fŽ“code)ŽŸiE‘øãÄDescriptionŽ¡‘øãÅchar‘¡E‰ff&fŽ‘Ç«code(Char,‘?ýCode)–UU²succeeds“if“the“cš¸ãharacter“coGde“for“the“one-c˜har“atom“ÅChar“²is“ÅCode².Ž¡‘øãÄErrorsŽŸ(ÿ‘øãŸäæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅChar–UU²and“ÅCode“²are“v‘ÿqÇariablesŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Char–UU²is“neither“a“v‘ÿqÇariable“nor“a“one-c¸ãhar“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýChar)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýCode)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Code–UU²is“an“inš¸ãteger“but“not“a“c˜haracter“coGdeŽŽ’㥄 ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(character‘¡E‰ff&fŽ“code)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ*qÆ‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicate.ަ‘øãÄ7.19.5Ž‘!ƇÅlower‘¡E‰ff&fŽ‘Ç«upper/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸiF‘ã Ålower‘¡E‰ff&fŽ‘Ç«upper(+character,‘?ý?character)Ž© ‘ã lower‘¡E‰ff&fŽ‘Ç«upper(-character,‘?ý+character)ŽŸiE‘øãÄDescriptionŽ¡‘øãÅlower‘¡E‰ff&fŽ‘Ç«upper(Char1,‘?ýChar2)›g²succeeds–fif‘È„ÅChar1“²and˜ÅChar2“²are˜one-c¸ãhar˜atoms“and˜if‘ȃÅChar2˜²is“the˜uppGerަ‘øãcon•¸ãv“ersion›„®of–KÊÅChar1².‘ÿÑIf“ÅChar1˜²(resp.‘ÿÐÅChar2²)˜is˜a–„­c¸ãharacter˜that“is˜not“a˜lo•¸ãw“er–„­(resp.‘ÿÑuppGer)“letter˜thenަ‘øãÅChar2–UU²is“equal“to“ÅChar1².Ž¡‘øãÄErrorsŽŸ"LÌ‘øãŸëš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅChar1–UU²and“ÅChar2“²are“v‘ÿqÇariablesŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Char1–UU²is“neither“a“v‘ÿqÇariable“nor“a“one-c¸ãhar“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýChar1)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Char2–UU²is“neither“a“v‘ÿqÇariable“nor“a“one-c¸ãhar“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýChar2)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ$>“‘øãÄP•®9ortabilit“yŽŽŸŽŒ‹u¾ Ú‹– ý"EŸüfd‘øã²7.19‘ A¸ãtomic–UUterm“proGcessingŽŽŽ’±!€117ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãGNU–UUProlog“predicate.ŽŸ%f³‘øãÄ7.19.6Ž‘!ƇÅatom‘¡E‰ff&fŽ–Ç«chars/2Ä,‘ÕTÅatom‘¡E‰ff&fŽ“codes/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ@-‘ã Åatom‘¡E‰ff&fŽ–Ç«chars(+atom,‘?ý?character‘¡E‰ff&fŽ“list)ޤ ‘ã atom‘¡E‰ff&fŽ–Ç«chars(-atom,‘?ý+character‘¡E‰ff&fŽ“list)Ž¡‘ã atom‘¡E‰ff&fŽ–Ç«codes(+atom,‘?ý?character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list)Ž¡‘ã atom‘¡E‰ff&fŽ–Ç«codes(-atom,‘?ý+character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list)ŽŸ@.‘øãÄDescriptionŽ©‘øãÅatom‘¡E‰ff&fŽ‘Ç«chars(Atom,‘?ýChars)–­•²succeeds›­”if‘t²ÅChars“²is“the˜list“of“one-c¸ãhar˜atoms“whose“names“are˜the“successiv¸ãeŽ¡‘øãc¸ãharacters–UUof“the“name“of‘rÅAtom².ަ‘øãÅatom‘¡E‰ff&fŽ›Ç«codes(Atom,‘?ýCodes)–UU²is“similar“to“Åatom‘¡E‰ff&fŽ˜chars/2“²but“deals“with“a“list“of“c¸ãharacter“coGdes.ަ‘øãÄErrorsŽŸY˜‘øãŸ´LΉffÇ>|©fdŸ™œ„$ffŸäfd‘ÅAtom–UU²is“a“v‘ÿqÇariable“and“ÅChars“²(or“ÅCodes²)“is“aŽ¡‘partial–UUlist“or“a“list“with“an“elemenš¸ãt“whic˜h“is“aŽ¡‘v‘ÿqÇariableŽŽ’㥄$ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘Atom–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽ¤‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘Chars–UU²is“neither“a“list“nor“a“partial“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýChars)ŽŽ’ÆØŸ™œ„ ffŽŽ¡‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘Codes–UU²is“neither“a“list“nor“a“partial“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýCodes)ŽŽ’ÆØŸ™œ„ ffŽŽ¡‰ffÇ>|¦Ÿ™œ„ffŸðfd‘Atom–UU²is“a“v‘ÿqÇariable“and“an“elemen¸ãt“ÅE“²of“the“listŽŸ ‘ÅChars–UU²is“neither“a“v‘ÿqÇariable“nor“a“one-c¸ãhar“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¤‰ffÇ>|¦Ÿ™œ„ffŸðfd‘Atom–UU²is“a“v‘ÿqÇariable“and“an“elemen¸ãt“ÅE“²of“the“listŽŸ ‘ÅCodes–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¡‰ffÇ>|¦Ÿ™œ„ffŸðfd‘Atom–UU²is“a“v‘ÿqÇariable“and“an“elemen¸ãt“ÅE“²of“the“listŽŸ ‘ÅCodes–UU²is“an“inš¸ãteger“but“not“a“c˜haracter“coGdeŽŽ’㥄ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(character‘¡E‰ff&fŽ“code)ŽŽ’ÆØŸ™œ„ffŽŽ¡‰ffÇ>|ŽŽŽŸ[ _‘øãÄP•®9ortabilit“yަ‘øã²ISO–dpredicates.‘…~The›’ISO“reference˜only˜causes˜a˜Åtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýChars)˜²if‘Í®ÅAtom˜²is˜a˜v‘ÿqÇariable˜andŽ¡‘øãÅChars–])²is“neither“a“list“nor“a“partial“list.‘‰CGNU‘\äProlog“alw•¸ãa“ys›])c“hec“ks˜if‘$FÅChars˜²is˜a˜list.‘‰CSimilarly˜forŽ¡‘øãÅCodes².‘IUThe–ÛþÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)‘Ûß²when“an“elemenš¸ãt“ÅE‘Ûà²of“the“ÅCodes“²is“not“an“in˜teger“is“a“GNU‘ÛßPrologŽ¡‘øãextension.‘€uThis–Z:seems“to“bGe“an“omission›Z9in“the“ISO‘Z8reference“since“this“error“is“detected˜for“man¸ãy“otherŽ¡‘øãbuilt-in–UUpredicates“accepting“a“c¸ãharacter“coGde“(e.g.‘qÇÅchar‘¡E‰ff&fŽ›Ç«code/2²,“Åput‘¡E‰ff&fŽ˜code/2²).ŽŸ%f³‘øãÄ7.19.7Ž‘!ƇÅnumber‘¡E‰ff&fŽ–Ç«atom/2Ä,›ÕTÅnumber‘¡E‰ff&fŽ“chars/2Ä,˜Ånumber‘¡E‰ff&fŽ“codes/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ@-‘ã Ånumber‘¡E‰ff&fŽ‘Ç«atom(+number,‘?ý?atom)Ž¡‘ã number‘¡E‰ff&fŽ‘Ç«atom(-number,‘?ý+atom)Ž¡‘ã number‘¡E‰ff&fŽ–Ç«chars(+number,‘?ý?character‘¡E‰ff&fŽ“list)Ž¡‘ã number‘¡E‰ff&fŽ–Ç«chars(-number,‘?ý+character‘¡E‰ff&fŽ“list)Ž¡‘ã number‘¡E‰ff&fŽ–Ç«codes(+number,‘?ý?character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list)Ž¡‘ã number‘¡E‰ff&fŽ–Ç«codes(-number,‘?ý+character‘¡E‰ff&fŽ“code‘¡E‰ff&fŽ“list)ŽŸ@.‘øãÄDescriptionަ‘øãÅnumber‘¡E‰ff&fŽ‘Ç«atom(Number,‘?ýAtom)–~7²succeeds“if‘ETÅAtom“²is“an“atom‘~8whose“name“correspGonds“to“the“c¸ãharacters“ofŽ¡‘øãÅNumber².ŽŽŸŽŒ‹v ð Ú‹– ý"EŸüfd‘øã²118ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅnumber‘¡E‰ff&fŽ›Ç«chars(Number,‘?ýChars)–UU²is“similar“to“Ånumber‘¡E‰ff&fŽ˜atom/2“²but“deals“with“a“list“of“c¸ãharacter“coGdes.ޤ‘øãÅnumber‘¡E‰ff&fŽ›Ç«codes(Number,‘?ýCodes)–UU²is“similar“to“Ånumber‘¡E‰ff&fŽ˜atom/2“²but“deals“with“a“list“of“c¸ãharacters.Ž¡‘øãÄErrorsŽ ‰³1‘øãŸƒ³5‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅNumber–UU²and“ÅAtom“²are“v‘ÿqÇariablesŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘Number–UU²is“a“v‘ÿqÇariable“and“ÅChars“²(or“ÅCodes²)“is“aޤ ‘partial–UUlist“or“a“list“with“an“elemenš¸ãt“whic˜h“is“aŽ¡‘v‘ÿqÇariableŽŽ’㥄$ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Number–UU²is“neither“a“v‘ÿqÇariable“nor“an“n•¸ãum“bGerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(number,‘?ýNumber)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Number–UU²is“a“v‘ÿqÇariable“and“ÅChars“²is“neither“a“listŽŸ ‘nor–UUa“partial“listŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýChars)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Number–UU²is“a“v‘ÿqÇariable“and“ÅCodes“²is“neither“a“listŽŸ ‘nor–UUa“partial“listŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýCodes)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Number–UU²is“a“v‘ÿqÇariable“and“an“elemen¸ãt“ÅE“²of“the“listŽŸ ‘ÅChars–UU²is“neither“a“v‘ÿqÇariable“nor“a“one-c¸ãhar“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(character,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Number–UU²is“a“v‘ÿqÇariable“and“an“elemen¸ãt“ÅE“²of“the“listŽŸ ‘ÅCodes–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Number–UU²is“a“v‘ÿqÇariable“and“an“elemen¸ãt“ÅE“²of“the“listŽŸ ‘ÅCodes–UU²is“an“inš¸ãteger“but“not“a“c˜haracter“coGdeŽŽ’㥄ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(character‘¡E‰ff&fŽ“code)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ'™œ„0ffŸØfd‘Number–UU²is“a“v‘ÿqÇariable,“ÅAtom“²(or“ÅChars“²or“ÅCodes²)ޤ ‘cannot–UUbšGe“parsed“as“a“n•¸ãum“b˜er–UUand“the“v‘ÿqÇalue“ofŽ¡‘the–UUÅsyntax‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄0ffŽ’éÒqÅsyntax‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ'™œ„0ffŽŽŸ(‰ffÇ>|ŽŽŽ ‹¤ø‘øãÄP•®9ortabilit“yŽ¡‘øãÅnumber‘¡E‰ff&fŽ›Ç«atom/2–UU²is“a“GNU“Prolog“predicate.‘qÇÅnumber‘¡E‰ff&fŽ˜chars/2“²and“Ånumber‘¡E‰ff&fŽ˜codes/2“²are“ISO“predicates.Ž¡‘øãGNU›ocProlog–o¬only“raises“an“error“abGout“an“elemen¸ãt“ÅE˜²of“the“ÅChars‘o«²(or“ÅCodes²)“list“when“ÅNumber“²is“aޤ ‘øãv‘ÿqÇariable–àRwhile“the–àQISO‘à5reference“alw•¸ãa“ys›àRc“hec“k˜this.‘JÆThis˜seems˜an–àQerror˜since˜the˜list˜itself“is˜only˜c•¸ãhec“k“edŽ¡‘øãif‘rÅNumber–UU²is“a“v‘ÿqÇariable.ŽŸ‘øãThe–ñÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)‘ð©²when“an“elemen¸ãt›ñÅE‘ð¨²of“the“ÅCodes˜²is“not“an˜in¸ãteger“is“a˜GNU‘ð¨PrologŽ¡‘øãextension.‘€uThis–Z:seems“to“bGe“an“omission›Z9in“the“ISO‘Z8reference“since“this“error“is“detected˜for“man¸ãy“otherŽ¡‘øãbuilt-in–UUpredicates“accepting“a“c¸ãharacter“coGde“(e.g.‘qÇÅchar‘¡E‰ff&fŽ›Ç«code/2²,“Åput‘¡E‰ff&fŽ˜code/2²).ŽŸ%ç‘øãÄ7.19.8Ž‘!ƇÅname/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ©””‘ã Åname(+atomic,‘?ý?character‘¡E‰ff&fŽ–Ç«code‘¡E‰ff&fŽ“list)Ž¡‘ã name(-atomic,‘?ý+character‘¡E‰ff&fŽ–Ç«code‘¡E‰ff&fŽ“list)ަ‘øãÄDescriptionŽ©‘øãÅname(Constant,‘?ýCodes)–¤²succeeds“if‘kÅCodes“²is“a“list‘¤whose“elemenš¸ãts“are“the“c˜haracter“cošGdes“corresp˜ondingŽ¡‘øãto–í™the‘íšsuccessivš¸ãe“c˜haracters›íšof‘´¶ÅConstant“²(a˜n•¸ãum“bGer–í™or˜an“atom).‘:”Ho•¸ãw“ev“er,‘ªthere˜atoms–í™are˜for“whic¸ãhŽ¡‘øãÅname(Constant,‘?ýCodes)›îó²is–îòtrue,‘Zbut“whic¸ãh˜will˜not“bGe˜constructed“if‘¶Åname/2“²is˜called“with˜ÅConstantŽ¡‘øã²uninstan¸ãtiated,‘˸e.g.‘ôOthe›€×atom–€ØÅ'1024'².‘ôNF‘ÿ*ªor“this˜reason“the“use˜of‘GõÅname/2˜²is“discouraged˜and“shouldŽ¡‘øãbšGe–­4limited“to“compatibilit¸ãy“purp˜oses.‘ydIt“is“preferable“to“use“atom‘™˜‰ffŽ‘™šco˜des/2“(section“7.19.6,‘Ã,page“117)“orŽ¡‘øãn•¸ãum“bGer‘™˜‰ffŽ‘™šc“hars/2–UU(section“7.19.7,“page“117).ަ‘øãÄErrorsŽŽŸŽŒ‹w±P Ú‹– ý"EŸüfd‘øã²7.19‘ A¸ãtomic–UUterm“proGcessingŽŽŽ’±!€119ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý”Õw‘øãŸÀ³4‰ffÇ>|¤fdŸ™œ„ffŸðfd‘ÅConstant–UU²is“a“v‘ÿqÇariable“and“ÅCodes“²is“a“partial“listŽŸ ‘or–UUa“list“with“an“elemenš¸ãt“whic˜h“is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Constant–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomicŽŸ ‘termŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atomic,‘?ýConstant)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Constant–:Q²is“a›:Pv‘ÿqÇariable“and“ÅCodes“²is˜neither“a“listŽŸ ‘nor–UUa“partial“listŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýCodes)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Constant–UU²is“a“v‘ÿqÇariable“and“an“elemen¸ãt“ÅE“²of“theŽŸ ‘list–UUÅCodes“²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Constant–UU²is“a“v‘ÿqÇariable“and“an“elemen¸ãt“ÅE“²of“theŽŸ ‘list–UUÅCodes“²is“an“inš¸ãteger“but“not“a“c˜haracter“coGdeŽŽ’㥄ffŽ’éÒqÅrepresentation‘¡E‰ff&fŽ–Ç«error(character‘¡E‰ff&fŽ“code)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸN¤ù‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ%qW‘øãÄ7.19.9Ž‘!ƇÅatom‘¡E‰ff&fŽ‘Ç«hash/2ŽŸuT‘øãÄT‘ÿ «emplatesޤq‘ã Åatom‘¡E‰ff&fŽ‘Ç«hash(+atom,‘?ý?integer)ŽŸ ‘ã atom‘¡E‰ff&fŽ‘Ç«hash(?atom,‘?ý+integer)Ž¡‘øãÄDescriptionަ‘øãÅatom‘¡E‰ff&fŽ‘Ç«hash(Atom,‘?ýHash)–óÒ²succeeds“if‘ºïÅHash‘óÓ²is“the“inš¸ãternal“k˜ey“assoGciated“with‘óÓÅAtom“²(an“existing“atom).ޤ ‘øãThe›˜in•¸ãternal‘˜k“ey˜of˜an–˜atom˜is˜a˜unique“in¸ãteger˜¸˜²0“and˜µ<˜²to“the˜Åmax‘¡E‰ff&fŽ‘Ç«atom˜²Prolog˜ ag“(section˜7.22.1,Ž¡‘øãpage‘UU133).ަ‘øãÄErrorsŽŸ(ÿ‘øãŸäæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅAtom–UU²and“ÅHash“²are“bGoth“v‘ÿqÇariablesŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Hash–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýHash)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Hash–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýHash)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ*qÆ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%qX‘øãÄ7.19.10Ž‘'†…Ånew‘¡E‰ff&fŽ–Ç«atom/3Ä,›ÕTÅnew‘¡E‰ff&fŽ“atom/2Ä,˜Ånew‘¡E‰ff&fŽ“atom/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©q‘ã Ånew‘¡E‰ff&fŽ‘Ç«atom(+atom,–?ý+integer,“-atom)Ž¡‘ã new‘¡E‰ff&fŽ‘Ç«atom(+atom,‘?ý-atom)Ž¡‘ã new‘¡E‰ff&fŽ‘Ç«atom(-atom)ަ‘øãÄDescriptionŽ©‘øãÅnew‘¡E‰ff&fŽ‘Ç«atom(Prefix,–?ýHash,“Atom)–†õ²uni es›†öÅAtom“²with“a˜new“atom“whose˜name“bGegins“with˜the“c¸ãharactersŽ¡‘øãof–[íthe“name›[îof‘# ÅPrefix“²and“whose“in•¸ãternal˜k“ey–[íis“ÅHash“²(section“7.19.9,‘]”page“119).‘…This˜predicate“is“thenŽ¡‘øãa–?Ûsymš¸ãbGol“generator.‘jžIt“is“guaran˜teed“that“ÅAtom“²došGes‘?Ünot“exist“b˜efore“the“in•¸ãv“o˜cation‘?Ûof‘øÅnew‘¡E‰ff&fŽ‘Ç«atom/3².‘jžTheŽ¡‘øãc¸ãharacters–×appGended›Øto“ÅPrefix“²to˜form“ÅAtom“²are˜in:‘QˆÅA²-ÅZ‘Dz(capital“letter),‘!½Åa²-Åz˜²(small“letter),–!½Å0²-Å9˜²(digit),“Å#²,Ž¡‘øãÅ$²,–UUÅ&²,‘öš‰ff&fŽ‘,“Å@².ަ‘øãÅnew‘¡E‰ff&fŽ›Ç«atom/2–UU²is“similar“to“Ånew‘¡E‰ff&fŽ˜atom/3²,“but“the“atom“generated“can“ha•¸ãv“e›UUan“y˜(free)˜in“ternal˜k“ey‘ÿ*ª.ŽŽŸŽŒ‹xÄY Ú‹– ý"EŸüfd‘øã²120ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅnew‘¡E‰ff&fŽ›Ç«atom/1–UU²is“similar“to“Ånew‘¡E‰ff&fŽ˜atom(atom‘¡E‰ff&fŽ˜,‘?ýAtom)²,“i.e.‘qÇthe“generated“atom“bGegins“with“Åatom‘¡E‰ff&fŽ˜².ޤ‘øãÄErrorsŽŸ4æe‘øãŸØ€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPrefix–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Hash–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Prefix–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPrefix)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Hash–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýHash)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Hash–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýHash)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Atom–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ6Ø,‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%â+‘øãÄ7.19.11Ž‘'†…Åcurrent‘¡E‰ff&fŽ‘Ç«atom/1Ž©uT‘øãÄT‘ÿ «emplatesޤ}½‘ã Åcurrent‘¡E‰ff&fŽ‘Ç«atom(?atom)Ž¡‘øãÄDescriptionޤ‘øãÅcurrent‘¡E‰ff&fŽ‘Ç«atom(Atom)–ñø²succeeds›ñùif“there“exists“an˜atom“that“uni es“with˜ÅAtom².‘P¨All“atoms“are˜found“exceptŽŸ ‘øãthose–UUbGeginning“with“a“Å'$'“²(system“atoms).‘qÇThis“predicate“is“re-executable“on“bac•¸ãktrac“king.Ž¡‘øãÄErrorsŽ¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅAtom–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%â,‘øãÄ7.19.12Ž‘'†…Åatom‘¡E‰ff&fŽ‘Ç«property/2ަ‘øãÄT‘ÿ «emplatesޤ}½‘ã Åatom‘¡E‰ff&fŽ–Ç«property(?atom,‘?ý?atom‘¡E‰ff&fŽ“property)Ž¡‘øãÄDescriptionŽ©‘øãÅatom‘¡E‰ff&fŽ–Ç«property(Atom,‘?ýProperty)‘"²succeeds›!ÿif‘éÅcurrent‘¡E‰ff&fŽ“atom(Atom)˜²succeeds–"(section˜7.19.11,‘,Dpage“120)ޤ ‘øãand–ÓEif‘šbÅProperty›ÓD²uni es“with“one“of˜the“propGerties“of“the“atom.‘ë–This“predicate˜is“re-executable“onŽ¡‘øãbac•¸ãktrac“king.ަ‘øãÄA®9tom‘ÕTpropQÇerties²:ŽŸ}½‘ã¸ŽŽŽ‘ã Ålength(Length)²:‘qÇÅLength–UU²is“the“length“of“the“name“of“the“atom.ޤ¾Þ‘ã¸ŽŽŽ‘ã Åhash(Hash)²:‘qÇÅHash–UU²is“the“inš¸ãternal“k˜ey“of“the“atom“(section“7.19.9,“page“119).Ž©¾ß‘ã¸ŽŽŽ‘ã Åprefix‘¡E‰ff&fŽ‘Ç«op²:‘qÇif–UUthere“is“a“pre x“opGerator“curren¸ãtly“de ned“with“this“name.Ž¡‘ã¸ŽŽŽ‘ã Åinfix‘¡E‰ff&fŽ‘Ç«op²:‘qÇif–UUthere“is“an“in x“opGerator“curren¸ãtly“de ned“with“this“name.ަ‘ã¸ŽŽŽ‘ã Åpostfix‘¡E‰ff&fŽ‘Ç«op²:‘qÇif–UUthere“is“a“pšGost x“op˜erator“curren¸ãtly“de ned“with“this“name.ŽŽŸŽŒ‹yÓË Ú‹– ý"EŸüfd‘øã²7.20‘ List‘UUproGcessingŽŽŽ’±!€121ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã¸ŽŽŽ‘ã Åneeds‘¡E‰ff&fŽ‘Ç«quotes²:‘qÇif–UUthe“atom“m¸ãust“bšGe“quoted“to“b˜e“read“later.ŽŸꀑã¸ŽŽŽ‘ã Åneeds‘¡E‰ff&fŽ‘Ç«scan²:‘Ûkif–Š'the“atom‘Š&m¸ãust“bšGe“scanned“when“output“to“b˜e“read“later‘Š&(e.g.‘=con¸ãtains“sp˜ecialŽ© ‘ã cš¸ãharacters–UUthat“m˜ust“bšGe“output“with“a“Å\“²escap˜e“sequence).ŽŸÕ‘øãÄErrorsŽŸ.LÌ‘øãŸßš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅAtom–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýAtom)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Property–UU²is“neither“a“v‘ÿqÇariable“nor“a“n“atomަ‘propGert¸ãy‘UUtermŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(atom‘¡E‰ff&fŽ“property,‘?ýProperty)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Property–UU²=“Ålength(E)“²or“Åhash(E)“²and“ÅE“²isަ‘neither–UUa“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ0>“‘øãÄP•®9ortabilit“yŽŸ‘øã²GNU–UUProlog“predicate.ŽŸ'ôô‘øãÇ7.20Ž‘cList‘€pro`cessingޤuT‘øã²These–[predicates›[manipulate“lists.‘ƒ They“are˜b•Go“otstrapp“ed–[predicates˜(i.e.‘ƒ written“in“Prolog)˜and“noަ‘øãerror–´Pcases›´Qare“tested˜(for“the“momen•¸ãt).‘ŽºHo“w“ev“er,‘Ìsince–´Pthey˜are“written“in˜Prolog“using˜other“built-inަ‘øãpredicates,–UUsome“errors“can“oGccur“due“to“those“built-in“predicates.ŽŸ%ôõ‘øãÄ7.20.1Ž‘!ƇÅappend/3Ž¡‘øãÄT‘ÿ «emplatesŽŸÕ‘ã Åappend(?list,–?ý?list,“?list)ŽŸÕ‘øãÄDescriptionޤ‘øãÅappend(List1,–?ýList2,“List12)–†²succeeds›‡if“the˜concatenation“of“the˜list“ÅList1“²and˜the“list˜ÅList2“²isަ‘øãthe–JÐlist“ÅList12².›nEThis“predicate“is“re-executable“on“bac•¸ãktrac“king–JÐ(e.g.˜if‘íÅList12“²is“instan¸ãtiated“and“bGothަ‘øãÅList1–UU²and“ÅList2“²are“v‘ÿqÇariable).Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%ôô‘øãÄ7.20.2Ž‘!ƇÅmember/2Ä,‘ÕTÅmemberchk/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸÕ‘ã Åmember(?term,‘?ý?list)ަ‘ã memberchk(?term,‘?ý?list)ŽŸÕ‘øãÄDescriptionŽ¡‘øãÅmember(Element,‘?ýList)–°²succeeds“if‘ØÎÅElement“²bGelongs“to“the›±ÅList².‘¦ØThis“predicate˜is“re-executable“onަ‘øãbac•¸ãktrac“king–UUand“can“bGe“thš¸ãus“used“to“en˜umerate“the“elemen˜ts“of‘rÅList².ŽŽŸŽŒ‹zà— Ú‹– ý"EŸüfd‘øã²122ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅmemberchk/2–UU²is“similar“to“Åmember/2“²but“only“succeeds“once.ޤ‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.Ž©%™‡‘øãÄ7.20.3Ž‘!ƇÅreverse/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ,J‘ã Åreverse(?list,‘?ý?list)ŽŸ,K‘øãÄDescriptionŽ¡‘øãÅreverse(List1,‘?ýList2)–UU²succeeds“if‘rÅList2“²uni es“with“the“list“ÅList1“²in“rev¸ãerse“order.Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ަ‘øãÄ7.20.4Ž‘!ƇÅdelete/3Ä,‘ÕTÅselect/3ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ,K‘ã Ådelete(?list,–?ý?term,“?list)Ž© ‘ã select(?term,–?ý?list,“?list)ŽŸ,J‘øãÄDescriptionŽ¡‘øãÅdelete(List1,–?ýElement,“List2)›:s²remo•¸ãv“es–:rall˜oGccurrences˜of‘ÅElement˜²in˜ÅList1˜²to“pro¸ãvide˜ÅList2².‘! Aަ‘øãstrict–UUterm“equalit¸ãy“is“required,“cf.‘qÇÅ(==)/2“²(section“7.3.2,“page“51).Ž¡‘øãÅselect(Element,–?ýList1,“List2)›?æ²remo•¸ãv“es–?åone˜oGccurrence“of‘ÅElement˜²in“ÅList1˜²to“pro¸ãvide˜ÅList2².‘j¢Thisަ‘øãpredicate–UUis“re-executable“on“bac•¸ãktrac“king.Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%™‡‘øãÄ7.20.5Ž‘!ƇÅpermutation/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŽŸŽŒ‹{ê Ú‹– ý"EŸüfd‘øã²7.20‘ List‘UUproGcessingŽŽŽ’±!€123ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Åpermutation(?list,‘?ý?list)Ž©…'‘øãÄDescriptionޤ‘øãÅpermutation(List1,‘?ýList2)–Ox²succeeds“if‘”ÅList2“²is“a“pGermš¸ãutation‘Owof“the“elemen˜ts“of‘”ÅList1².‘~This“predicateŽŸ ‘øãis–UUre-executable“on“bac•¸ãktrac“king.Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%¬¨‘øãÄ7.20.6Ž‘!ƇÅprefix/2Ä,‘ÕTÅsuffix/2ŽŸuT‘øãÄT‘ÿ «emplatesަ‘ã Åprefix(?list,‘?ý?list)ŽŸ ‘ã suffix(?list,‘?ý?list)ަ‘øãÄDescriptionŽ¡‘øãÅprefix(Prefix,‘?ýList)–b–²succeeds“if›)³ÅPrefix‘b—²is“a“pre x“of˜ÅList².‘™ŠThis‘b—predicate“is“re-executable“on“bac¸ãk-Ž© ‘øãtrac¸ãking.Ž¡‘øãÅsuffix(Suffix,‘?ýList)–|ϲsucceeds“if›CìÅSuffix“²is“a“sux“of˜ÅList².‘è5This“predicate“is“re-executable“on“bac¸ãk-ަ‘øãtrac¸ãking.Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%¬¨‘øãÄ7.20.7Ž‘!ƇÅsublist/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ…'‘ã Åsublist(?list,‘?ý?list)Ž¡‘øãÄDescriptionޤ‘øãÅsublist(List1,‘?ýList2)–Y ²succeeds›Y if‘ (ÅList1“²is“a˜sub-list“of‘ (ÅList2².‘|èThis“predicate“is˜re-executable“onަ‘øãbac•¸ãktrac“king.Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŽŸŽŒ‹|ïÑ Ú‹– ý"EŸüfd‘øã²124ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.20.8Ž‘!ƇÅlast/2Ž©uT‘øãÄT‘ÿ «emplatesޤ‘ã Ålast(?list,‘?ý?term)Ž¡‘øãÄDescriptionޤ‘øãÅlast(List,‘?ýElement)–UU²succeeds“if›rÅElement“²is“the“last“elemen¸ãt“of˜ÅList².Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.20.9Ž‘!ƇÅlength/2ަ‘øãÄT‘ÿ «emplatesޤ‘ã Ålength(?list,‘?ý?integer)Ž¡‘øãÄDescriptionޤ‘øãÅlength(List,‘?ýLength)–UU²succeeds“if›rÅLength“²is“the“length“of˜ÅList².Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.20.10Ž‘'†…Ånth/3ަ‘øãÄT‘ÿ «emplatesޤ‘ã Ånth(?integer,–?ý?list,“?term)Ž¡‘øãÄDescriptionޤ‘øãÅnth(N,–?ýList,“Element)–UU²succeeds“if“the“ÅNÈth‘¸²argumen¸ãt“of‘rÅList“²is“ÅElement².Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŽŸŽŒ‹}õ2 Ú‹– ý"EŸüfd‘øã²7.20‘ List‘UUproGcessingŽŽŽ’±!€125ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.20.11Ž‘'†…Åmax‘¡E‰ff&fŽ–Ç«list/2Ä,›ÕTÅmin‘¡E‰ff&fŽ“list/2Ä,˜Åsum‘¡E‰ff&fŽ“list/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åmin‘¡E‰ff&fŽ‘Ç«list(+list,‘?ý?number)ޤ ‘ã max‘¡E‰ff&fŽ‘Ç«list(+list,‘?ý?number)Ž¡‘ã sum‘¡E‰ff&fŽ‘Ç«list(+list,‘?ý?number)ަ‘øãÄDescriptionޤ‘øãÅmin‘¡E‰ff&fŽ‘Ç«list(List,‘?ýMin)–UU²succeeds“if‘rÅMin“²is“the“smallest“n•¸ãum“bGer–UUin“ÅList².Ž¡‘øãÅmax‘¡E‰ff&fŽ‘Ç«list(List,‘?ýMax)–UU²succeeds“if‘rÅMax“²is“the“largest“n•¸ãum“bGer–UUin“ÅList².Ž¡‘øãÅsum‘¡E‰ff&fŽ‘Ç«list(List,‘?ýSum)–UU²succeeds“if‘rÅSum“²is“the“sum“of“all“the“elemen¸ãts“in“ÅList².Ž¡‘øãÅList–UU²m¸ãust“bGe“a“list“of“arithmetic“ev‘ÿqÇaluable“terms“(section“7.6.1,“page“57).Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.20.12Ž‘'†…Åsort/2Ä,–ÕTÅsort0/2Ä,“Åkeysort/2“sort/1Ä,“Åsort0/1Ä,“Åkeysort/1ŽŸuT‘øãÄT‘ÿ «emplatesަ‘ã Åsort(+list,‘?ý?list)ޤ ‘ã sort0(+list,‘?ý?list)Ž¡‘ã keysort(+list,‘?ý?list)Ž¡‘ã sort(+list)Ž¡‘ã sort0(+list)Ž¡‘ã keysort(+list)ަ‘øãÄDescriptionŽ©‘øãÅsort(List1,‘?ýList2)›e²succeeds–eif‘,5ÅList2“²is˜the“sorted˜list“correspGonding˜to“ÅList1˜²where“duplicate˜elemen¸ãtsŽ¡‘øãare‘UUmerged.ަ‘øãÅsort0/2–UU²is“similar“to“Åsort/2“²except“that“duplicate“elemen¸ãts“are“not“merged.ަ‘øãÅkeysort(List1,‘?ýList2)›K²succeeds–Jif‘ÏhÅList2“²is˜the˜sorted“list˜of‘ÏgÅList1˜²according“to˜the˜k¸ãeys.‘ЧThe˜listŽ¡‘øãÅList1–è²consists›çof“items˜of“the˜form“ÅKey-Value².‘ŒThese˜items“are“sorted˜according“to˜the“v‘ÿqÇalue˜of‘ÐÅKeyŽ¡‘øã²yielding–ƒthe“ÅList2².‘V×Duplicate“k¸ãeys“are“not“merged.›VÖThis“predicate“is‘„stable,‘­i.e.˜if‘Ë ÅK-A‘o²ošGccurs“b˜efore“ÅK-BŽ¡‘øã²in–UUthe“input,“then“ÅK-A“²will“ošGccur“b˜efore“ÅK-B“²in“the“output.ަ‘øãÅsort/1²,‘º-Åsort0/1–¦²and“Åkeysort/1“²are“similar“to“Åsort/2²,‘º.Åsort0/2“²and“Åkeysort/2“²but“ac•¸ãhiev“e–¦a“sort“in-Ž¡‘øãplace–Ô$destructing“the“original›Ô%ÅList1“²(this“in-place“assignmen¸ãt“is“not˜undone“at“bac•¸ãktrac“king).‘F·The‘Ô$sortedŽ¡‘øãlist–UUoGccupies“the“same“memory“space“as“the“original“list“(saš¸ãving“th˜us“memory“consumption).ަ‘øãThe–UUtime“complexit¸ãy“of“these“sorts“is“µOG²(µN›lpl2`og‘±.N‘²),“µN˜²bGeing“the“length“of“the“list“to“sort.ަ‘øãThese–UUpredicates“refer“to“the“standard“ordering“of“terms“(section“7.3.1,“page“51).ŽŽŸŽŒ‹~ù4 Ú‹– ý"EŸüfd‘øã²126ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄErrorsŽŸ"LÌ‘øãŸëš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅList1–UU²is“a“partial“listŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘List1–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýList1)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘List2–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýList2)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ$>“‘øãÄP•®9ortabilit“yŽŸ‘øã²GNU–UUProlog“predicates.ŽŸ'þ6‘øãÇ7.21Ž‘cGlobal‘€v‘ÿ@ariablesޤuT‘øãÄ7.21.1Ž‘!ƇIn®9troQÇductionŽ¡‘øã²GNU‘QProlog–dproš¸ãvides“a“simple‘eand“pGo˜w˜erful“w˜a˜y“to“assign‘eand“read“global“v›ÿqÇariables.‘X"A‘Qglobal“v˜ariable“isŽ© ‘øãassoGciated–è9with“eac¸ãh›è:atom,‘þ its“initial˜v›ÿqÇalue“is“the“in¸ãteger“0.‘MiA‘èglobal“v˜ariable“can“store“3‘è:kinds“of“ob‘Ž8jects:ޤ‘ã¸ŽŽŽ‘ã ²a–UUcopš¸ãy“of“a“term“(the“assignmen˜t“can“bGe“made“bac˜ktrac˜k‘ÿqÇable“or“not).Ž¡‘ã¸ŽŽŽ‘ã ²a–UUlink“to“a“term“(the“assignmenš¸ãt“is“alw˜a˜ys“bac˜ktrac˜k‘ÿqÇable).Ž¡‘ã¸ŽŽŽ‘ã ²an–UUarraš¸ãy“of“ob‘Ž8jects“(recursiv˜ely).Ž¡‘øãThe–ã™space“necessary“for“copies“and“arraš¸ãys“is“dynamically‘ã˜alloGcated“and“reco˜v˜ered“as“sošGon“as“p˜ossible.‘KÞF‘ÿ*ªorަ‘øãinstance,‘ when–ÿüan›ÿûatom“is˜assoGciated“with˜a“global˜v‘ÿqÇariable˜whose“curren¸ãt˜v‘ÿqÇalue“is˜an“arra¸ãy‘ÿ*ª,‘ the“space˜forަ‘øãthis–UUarraš¸ãy“is“reco˜v˜ered“(unless“the“assignmen˜t“is“to“bGe“undone“when“bac˜ktrac˜king“oGccurs).ޤ‘øãWhen–mza›m{link“to˜a“term˜is“assoGciated“with˜a“global˜v‘ÿqÇariable,‘s„the“reference“to˜this“term˜is“stored˜and“th¸ãusަ‘øãthe–UUoriginal“term“is“returned“when“the“con•¸ãten“t–UUof“the“v‘ÿqÇariable“is“read.Ž¡‘øãÄGlobal–ÕTv‘ÿ\rariable“naming“con•®9v“en“tion²:‘qÇa–UUglobal“v‘ÿqÇariable“is“referenced“b¸ãy“an“atom.Ž¡‘øãIf–áthe›âv‘ÿqÇariable“con¸ãtains“an˜arra¸ãy‘ÿ*ª,‘·_an“index˜(ranging“from“0)˜can“bGe“pro¸ãvided˜using“a“compGound˜term“whoseަ‘øãprincipal–û?functor›û@is“the“correpGonding˜atom“and“the˜argumen¸ãt“is“the˜index.‘SÀIn“case“of˜a“m¸ãulti-dimensionalަ‘øãarra•¸ãy‘ÿ*ª,›UUeac“h˜index˜is˜giv“en˜as˜the˜argumen“ts˜of˜the˜compGound˜term.Ž¡‘øãIf–´the›µv‘ÿqÇariable“con¸ãtains˜a“term˜(link“or˜cop¸ãy),‘EÌit“is“pGossible˜to“only˜reference“a˜sub-term“b¸ãy˜giving“itsަ‘øãargumen•¸ãt›˜Vn“um“bGer˜(also˜called˜argumen“t˜selector).‘:ÊSuc“h˜a˜sub-term˜is˜sp•Geci ed˜using˜a˜comp“ound˜termަ‘øãwhose–[íprincipal“functor“is“Å-/2“²and“whose“ rst“argumenš¸ãt‘[ìis“a“global“v‘ÿqÇariable“name“and“the“second“argumen˜tަ‘øãis–‚the“argumenš¸ãt“n˜um˜bšGer‘ƒ(from“1).‘\ÖThis“can“b˜e“applied‘ƒrecursiv¸ãely“to“sp˜ecify“a“sub-term“of‘ƒan¸ãy“depth.‘\ÖInަ‘øãcase–žof‘ža“list,‘°|ŽŽŽŽ ÃÝ» ýo¢EŸíæd‘þãÅaŽ‘%"ú²the›UUcon•¸ãten“t˜of˜v‘ÿqÇariable˜assoGciated˜with˜Åa˜²(an“y˜kind)ŽŽ¤ ‘þãÅt(1)Ž‘%"ú²the–UU2nd“elemenš¸ãt“of“the“arra˜y“assoGciated“with“ÅtŽŽ¡‘þãt(k)Ž‘%"ú²if–UUthe“v‘ÿqÇalue“assoGciated“with“Åk“²is“I,“the“Ith“elemenš¸ãt“of“the“arra˜y“assoGciated“with“ÅtŽŽ¡‘þãa-1-2Ž‘%"ú²if–UUthe“v‘ÿqÇalue“assoGciated“with“Åa“²is“Åf(g(a,b,c),2)²,“the“sub-term“ÅbŽŽŽŽŽŸ)qÇ‘øã²Here–UUare“the“errors“assoGciated“with“global“v‘ÿqÇariable“names“and“common“to“all“predicates.ŽŸB¤ù‘øãŸÌ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅGVarName–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘GVarName–ö ²is“neither›ö a“v‘ÿqÇariable“nor“a˜callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýGVarName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘GVarName–UU²conš¸ãtains“an“in˜v‘ÿqÇalid“argumen˜t“n˜um˜bGerŽŸ ‘(or–UUÅGVarName“²is“an“arra¸ãy)ŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(g‘¡E‰ff&fŽ“argument‘¡E‰ff&fŽ“selector,ŽŸ ’éÒqGVarName)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘GVarName–6K²conš¸ãtains“an“in˜v‘ÿqÇalid“index“(or“ÅGVarNameŽŸ ‘²is–UUnot“an“arra¸ãy)ŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(g‘¡E‰ff&fŽ“array‘¡E‰ff&fŽ“index,‘?ýGVarName)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘GVarName–UU²is“used“as“an“indirect“index“orŽŸ ‘argumenš¸ãt–UUselector“and“is“not“an“in˜tegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýGVarName)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸC32‘øãÄArra®9ys²:‘ëpthe›’)predicates‘’*Åg‘¡E‰ff&fŽ–Ç«assign/2²,‘¡_Åg‘¡E‰ff&fŽ“assignb/2˜²and‘’*Åg‘¡E‰ff&fŽ“link/2˜²(section˜7.21.2,‘¡_page–’*127)˜can“bGe˜usedޤ ‘øãto–^acreate“an–^`arra¸ãy‘ÿ*ª.›ŒëThey“recognize–^asome“terms“as–^`v‘ÿqÇalues.˜F‘ÿ*ªor“instance,‘`¤a›^acompGound“term˜with˜principalŽ¡‘øãfunctor–UUÅg‘¡E‰ff&fŽ›Ç«array“²is“used“to“de ne“an“arra¸ãy“of“ xed“size.‘qÇThere“are“3“forms“for“the“term“Åg‘¡E‰ff&fŽ˜array²:Ž©‘ã¸ŽŽŽ‘ã Åg‘¡E‰ff&fŽ‘Ç«array(Size)²:‘ICif‘1ÅSize–A²is“an“in¸ãteger›Aµ>“²0“then“de nes“an˜arraš¸ãy“of‘0ÅSize“²elemen˜ts‘Awhic˜h“are“allŽ¡‘ã initialized–UUwith“the“in¸ãteger“Å0².ަ‘ã¸ŽŽŽ‘ã Åg‘¡E‰ff&fŽ‘Ç«array(Size,‘?ýInitial)²:‘.›as›ÎüabGo•¸ãv“e–Îýbut˜the“elemen¸ãts˜are“initialized˜with“the˜term“ÅInitial˜²insteadŽ¡‘ã of–UU0.‘qÇÅInitial“²can“conš¸ãtain“other“arra˜y“de nitions“allo˜wing“th˜us“for“m˜ulti-dimensional“arra˜ys.ަ‘ã¸ŽŽŽ‘ã Åg‘¡E‰ff&fŽ‘Ç«array(List)²:‘ƒ‰as›^6abGo•¸ãv“e˜if‘%SÅList˜²is˜a˜list˜of‘^5length˜ÅSize˜²except˜that˜the˜elemen“ts˜of˜the˜arra“y˜areŽ¡‘ã initialized–UUaccording“to“the“elemenš¸ãts“of‘rÅList“²(whic˜h“can“con˜tain“other“arra˜y“de nitions).ަ‘øãAn–bAarra¸ãy“can“bšGe‘bBextended“explicitely“using“a“comp˜ound“term‘bBwith“principal“functor“Åg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“extendŽ¡‘øã²whic¸ãh–¼Øaccept›¼×the“same˜3“forms“detailed˜abGo•¸ãv“e.‘¨OIn–¼Øthat˜case,‘Ö¹the˜existing“elemen¸ãts“of˜the“arra¸ãy˜are“notŽ¡‘øãinitialized.‘qÇIf‘rÅg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“extend–UU²is“used“with“an“ob‘Ž8ject“whicš¸ãh“is“not“an“arra˜y“it“is“similar“to“Åg‘¡E‰ff&fŽ‘Ç«array².ŽŸ‘øãFinally‘ÿ*ª,‘fwan–ü¤arra¸ãy›ü¥can“bGe“Èautomatic‘ÿ}'al‘‚Øly‘ß!²expanded“when“needed.‘ g´The˜programmer“doGes“not“need“toŽ¡‘øãexplicitely–+Scon¸ãtrol›+Rthe“expansion“of˜an“automatic˜arraš¸ãy‘ÿ*ª.‘óÀAn“arra˜y“is›+Rexpanded“as˜soGon“as“an˜index“isŽ¡‘øãoutside–Èthe›Çcurren¸ãt“size“of˜this“arra•¸ãy‘ÿ*ª.‘wSuc“h–Èan“arra¸ãy˜is“de ned“using˜a“compGound“term˜with“principalŽ¡‘øãfunctor‘UUÅg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“auto²:ަ‘ã¸ŽŽŽ‘ã Åg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“auto(Size)²:‘>Pif‘µ„ÅSize–îg²is›îfan“in¸ãteger“µ>“²0“then˜de nes“an“automatic“arra¸ãy“whose˜initial“size“isŽ¡‘ã ÅSize².‘ë7All–}Ðelemen¸ãts›}Ïare“initialized“with˜the“in•¸ãteger˜Å0².‘ë7Elemen“ts–}Ðcreated“during˜implicit“expansionsŽ¡‘ã will–UUbGe“initialized“with“Å0².ަ‘ã¸ŽŽŽ‘ã Åg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“auto(Size,‘?ýInitial)²:‘as›£óabGo•¸ãv“e˜but˜the‘£ôelemen“ts˜are˜initialized˜with‘£ôthe˜term˜ÅInitialŽ¡‘ã ²instead–‹fof›‹e0.‘.xÅInitial“²can˜con¸ãtain“other˜arraš¸ãy“de nitions“allo˜wing‘‹eth˜us“for‘‹em˜ulti-dimensional“arra˜ys.Ž¡‘ã Elemen¸ãts–UUcreated“during“implicit“expansions“will“bGe“initialized“with“ÅInitial².ަ‘ã¸ŽŽŽ‘ã Åg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“auto(List)²:‘¦1as›o‹abGo•¸ãv“e–oŠif‘6§ÅList“²is˜a“list“of“length˜ÅSize“²except“that“the˜elemen¸ãts“of“theŽ¡‘ã arraš¸ãy–Hare“initialized‘Haccording“to“the“elemen˜ts‘Hof‘ÅList“²(whic˜h“can“con˜tain‘Hother“arra˜y“de nitions).Ž¡‘ã Elemen¸ãts–UUcreated“during“implicit“expansions“will“bGe“initialized“with“Å0².ަ‘øãIn–ïianš¸ãy“case,‘Ìwhen“an‘ïjarra˜y“is“read,‘Ìa“term“of“the“form‘ïjÅg‘¡E‰ff&fŽ‘Ç«array([Elem0,...,‘?ýElemSize-1])“²is“returned.ŽŸ‘øãSome–UUexamples“using“global“v‘ÿqÇariables“are“presen¸ãted“later“(section“7.21.7,“page“130).ŽŸ%þ6‘øãÄ7.21.2Ž‘!ƇÅg‘¡E‰ff&fŽ–Ç«assign/2Ä,›ÕTÅg‘¡E‰ff&fŽ“assignb/2Ä,˜Åg‘¡E‰ff&fŽ“link/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŽŸŽŒ‹€ < Ú‹– ý"EŸüfd‘øã²128ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Åg‘¡E‰ff&fŽ–Ç«assign(+callable‘¡E‰ff&fŽ“term,‘?ý?term)ޤ ‘ã g‘¡E‰ff&fŽ–Ç«assignb(+callable‘¡E‰ff&fŽ“term,‘?ý?term)Ž¡‘ã g‘¡E‰ff&fŽ–Ç«link(+callable‘¡E‰ff&fŽ“term,‘?ý?term)ŽŸ‘øãÄDescriptionŽ©‘øãÅg‘¡E‰ff&fŽ‘Ç«assign(GVarName,‘?ýValue)–N²assigns“a“copš¸ãy“of“the“term“ÅValue“²to“ÅGVarName².‘\This“assignmen˜t“is“notŽ¡‘øãundone–UUwhen“bac•¸ãktrac“king‘UUoGccurs.ަ‘øãÅg‘¡E‰ff&fŽ›Ç«assignb/2–UU²is“similar“to“Åg‘¡E‰ff&fŽ˜assign/2“²but“the“assignmenš¸ãt“is“undone“at“bac˜ktrac˜king.ަ‘øãÅg‘¡E‰ff&fŽ‘Ç«link(GVarName,‘?ýValue)–’޲makš¸ães‘’a“link“bGet˜w˜een›’ÅGVarName“²to“the˜term“ÅValue².‘)sThis“allo¸ãws“the˜user“toŽ¡‘øãgiv¸ãe–A¾a›A½name“to˜an¸ãy“Prolog“term˜(in“particular˜non-ground“terms).‘k?Suc¸ãh“an˜assignmen¸ãt“is˜alw•¸ãa“ys‘A¾undoneŽ¡‘øãwhen››œbac•¸ãktrac“king˜oGccurs˜(since‘››the˜term˜ma“y˜no˜longer˜exist).‘D›If‘b¹ÅValue˜²is˜an‘››atom˜or˜an˜in“teger,Ž¡‘øãÅg‘¡E‰ff&fŽ›Ç«link/2–´²and“Åg‘¡E‰ff&fŽ˜assignb/2“²ha•¸ãv“e–´the“same“bGeha¸ãvior.‘\çSince“Åg‘¡E‰ff&fŽ˜link/2“²only“handles“links“to“existing“termsŽ¡‘øãit–UUdošGes“not“require“extra“memory“space“and“is“not“exp˜ensiv¸ãe“in“terms“of“execution“time.ަ‘øãNB:–ÿ%argumen¸ãt“selectors“can“only“bGe›ÿ&used“with“g‘™˜‰ffŽ‘™šassign/2“(i.e.‘U when˜using“an“argumen¸ãt“selector“inside“anŽ¡‘øãassignmenš¸ãt,–UUthis“one“m˜ust“not“bGe“bac˜ktrac˜k‘ÿqÇable).ަ‘øãÄErrorsަ‘øã²See–UUcommon“errors“detailed“in“the“in¸ãtroGduction“(section“7.21.1,“page“126)ŽŸff‘øãŸñ€‰ffÇ>|ŸfdŸ™œ„ffŸðfd‘ÅGVarName–UU²conš¸ãtains“an“argumen˜t“selector“and“theŽ¡‘assignmenš¸ãt–UUis“bac˜ktrac˜k‘ÿqÇableŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(g‘¡E‰ff&fŽ“argument‘¡E‰ff&fŽ“selector,Ž¡’éÒqGVarName)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸØ-‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.21.3Ž‘!ƇÅg‘¡E‰ff&fŽ‘Ç«read/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åg‘¡E‰ff&fŽ–Ç«read(+callable‘¡E‰ff&fŽ“term,‘?ý?term)Ž¡‘øãÄDescriptionަ‘øãÅg‘¡E‰ff&fŽ‘Ç«read(GVarName,‘?ýValue)–UU²uni es“ÅValue“²with“the“term“assigned“to“ÅGVarName².ަ‘øãÄErrorsަ‘øã²See–UUcommon“errors“detailed“in“the“in¸ãtroGduction“(section“7.21.1,“page“126)ަ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.21.4Ž‘!ƇÅg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“size/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ¡‘ã Åg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“size(+callable‘¡E‰ff&fŽ“term,‘?ý?integer)ŽŽŸŽŒ‹ (ø Ú‹– ý"EŸüfd‘øã²7.21‘ Global‘UUv‘ÿqÇariablesŽŽŽ’±!€129ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄDescriptionޤ‘øãÅg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“size(GVarName,‘?ýValue)–듲uni es›ë”ÅSize“²with“the˜dimension“(an“in¸ãteger“µ>˜²0)“of“the˜arra¸ãy“assignedŽ© ‘øãto–UUÅGVarName².‘qÇF›ÿ*ªails“if‘rÅGVarName“²is“not“an“arra¸ãy˜.Ž¡‘øãÄErrorsŽ¡‘øã²See–UUcommon“errors“detailed“in“the“in¸ãtroGduction“(section“7.21.1,“page“126)Ž¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅSize–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýSize)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.21.5Ž‘!ƇÅg‘¡E‰ff&fŽ–Ç«inc/3Ä,›ÕTÅg‘¡E‰ff&fŽ“inc/2Ä,˜Åg‘¡E‰ff&fŽ“inco/2Ä,˜Åg‘¡E‰ff&fŽ“inc/1Ä,˜Åg‘¡E‰ff&fŽ“dec/3Ä,˜Åg‘¡E‰ff&fŽ“dec/2Ä,˜Åg‘¡E‰ff&fŽ“deco/2Ä,˜Åg‘¡E‰ff&fŽ“dec/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åg‘¡E‰ff&fŽ–Ç«inc(+callable‘¡E‰ff&fŽ“term,–?ý?integer,“?integer)ަ‘ã g‘¡E‰ff&fŽ–Ç«inc(+callable‘¡E‰ff&fŽ“term,‘?ý?integer)ަ‘ã g‘¡E‰ff&fŽ–Ç«inco(+callable‘¡E‰ff&fŽ“term,‘?ý?integer)ަ‘ã g‘¡E‰ff&fŽ–Ç«inc(+callable‘¡E‰ff&fŽ“term)ަ‘ã g‘¡E‰ff&fŽ–Ç«dec(+callable‘¡E‰ff&fŽ“term,–?ý?integer,“?integer)ަ‘ã g‘¡E‰ff&fŽ–Ç«dec(+callable‘¡E‰ff&fŽ“term,‘?ý?integer)ަ‘ã g‘¡E‰ff&fŽ–Ç«deco(+callable‘¡E‰ff&fŽ“term,‘?ý?integer)ަ‘ã g‘¡E‰ff&fŽ–Ç«dec(+callable‘¡E‰ff&fŽ“term)Ž¡‘øãÄDescriptionޤ‘øãÅg‘¡E‰ff&fŽ‘Ç«inc(GVarName,–?ýOld,“New)–øç²uni es›øæÅOld“²with˜the“in¸ãteger˜assigned“to“ÅGVarName²,‘!Êincremen¸ãts“ÅGVarNameަ‘øã²and–UUthen“uni es“ÅNew“²with“the“incremen¸ãted“v‘ÿqÇalue.Ž¡‘øãÅg‘¡E‰ff&fŽ›Ç«inc(GVarName,‘?ýNew)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åg‘¡E‰ff&fŽ˜inc(GVarName,‘áB‰ff&fŽ‘ ¨,‘?ýNew)².Ž¡‘øãÅg‘¡E‰ff&fŽ›Ç«inco(GVarName,‘?ýOld)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åg‘¡E‰ff&fŽ˜inc(GVarName,‘?ýOld,‘áB‰ff&fŽ‘ ¨)².Ž¡‘øãÅg‘¡E‰ff&fŽ›Ç«inc(GVarName)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åg‘¡E‰ff&fŽ˜inc(GVarName,‘áB‰ff&fŽ– ¨,‘áB‰ff&fŽ“)².Ž¡‘øãPredicates–UUÅg‘¡E‰ff&fŽ‘Ç«dec“²are“similar“but“decremenš¸ãt“the“con˜ten˜t“of‘rÅGVarName“²instead.Ž¡‘øãÄErrorsŽ¡‘øã²See–UUcommon“errors“detailed“in“the“in¸ãtroGduction“(section“7.21.1,“page“126)ŽŸ*ÿÿ‘øãŸäæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅOld–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýOld)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘New–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýNew)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘GVarName–UU²stores“an“arra¸ãyŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(integer,‘?ýg‘¡E‰ff&fŽ“array)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘GVarName–UU²stores“a“term“ÅT“²whicš¸ãh“is“not“an“in˜tegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýT)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ*qÆ‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŽŸŽŒ‹‚ 3Ì Ú‹– ý"EŸüfd‘øã²130ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.21.6Ž‘!ƇÅg‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“bit/2Ä,›ÕTÅg‘¡E‰ff&fŽ“reset‘¡E‰ff&fŽ“bit/2Ä,˜Åg‘¡E‰ff&fŽ“test‘¡E‰ff&fŽ“set‘¡E‰ff&fŽ“bit/2Ä,˜Åg‘¡E‰ff&fŽ“test‘¡E‰ff&fŽ“reset‘¡E‰ff&fŽ“bit/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‡ ‘ã Åg‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“bit(+callable‘¡E‰ff&fŽ“term,‘?ý+integer)ޤ ‘ã g‘¡E‰ff&fŽ–Ç«reset‘¡E‰ff&fŽ“bit(+callable‘¡E‰ff&fŽ“term,‘?ý+integer)Ž¡‘ã g‘¡E‰ff&fŽ–Ç«test‘¡E‰ff&fŽ“set‘¡E‰ff&fŽ“bit(+callable‘¡E‰ff&fŽ“term,‘?ý+integer)Ž¡‘ã g‘¡E‰ff&fŽ–Ç«test‘¡E‰ff&fŽ“reset‘¡E‰ff&fŽ“bit(+callable‘¡E‰ff&fŽ“term,‘?ý+integer)ަ‘øãÄDescriptionŽ©‘øãÅg‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“bit(GVarName,‘?ýBit)–µj²sets›µito“1“the“bit˜n•¸ãum“b•Ger›µjsp“eci ed˜b•¸ãy‘Ø÷ÅBit‘µi²of˜the˜in“teger˜assigned‘µito˜ÅGVarNameŽ¡‘øã²to–çi1.‘ (Bit“n•¸ãum“bGers–çirange“from“0“to“the“maximš¸ãum“n˜um˜bGer“allo˜w˜ed“for“in˜tegers“(this“is“arc˜hitectureŽ¡‘øãdepšGenden¸ãt).‘qÇIf‘rÅBit–UU²is“greater“than“this“limit,“the“mo˜dulo“with“this“limit“is“tak¸ãen.ަ‘øãÅg‘¡E‰ff&fŽ–Ç«reset‘¡E‰ff&fŽ“bit(GVarName,‘?ýBit)–UU²is“similar“to“Åg‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“bit/2–UU²but“sets“the“spGeci ed“bit“to“0.ަ‘øãÅg‘¡E‰ff&fŽ–Ç«test‘¡E‰ff&fŽ“set‘¡E‰ff&fŽ“bit/2–UU²succeeds“if“the“spGeci ed“bit“is“set“to“1.ަ‘øãÅg‘¡E‰ff&fŽ–Ç«test‘¡E‰ff&fŽ“reset‘¡E‰ff&fŽ“bit/2–UU²succeeds“if“the“spGeci ed“bit“is“set“to“0.ަ‘øãÄErrorsަ‘øã²See–UUcommon“errors“detailed“in“the“in¸ãtroGduction“(section“7.21.1,“page“126)ŽŸ132‘øãŸÞ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅBit–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Bit–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýBit)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Bit–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýBit)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘GVarName–UU²stores“an“arra¸ãyŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(integer,‘?ýg‘¡E‰ff&fŽ“array)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘GVarName–UU²stores“a“term“ÅT“²whicš¸ãh“is“not“an“in˜tegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýT)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ0¤ù‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%>בøãÄ7.21.7Ž‘!ƇExamplesŽŸuT‘øãSim®9ulating‘þ8Åg‘¡E‰ff&fŽ‘Ç«inc/3²:›qÇthis–UUpredicate“bGeha•¸ãv“es‘UUlik“e:˜global‘UUv‘ÿqÇariable:Ž©‡ ‘ã Åmy_g_inc(Var,–?ýOld,“New)“:-Ž¡‘;âñg_read(Var,‘?ýOld),Ž¡‘;âñN–?ýis“Value“+“1,Ž¡‘;âñg_assign(Var,‘?ýX),Ž¡‘ã New–?ý=“N.ަ‘øã²The›ÓÅquery:‘n§Åmy‘¡E‰ff&fŽ–Ç«g‘¡E‰ff&fŽ“inc(c,‘?ýX,‘áB‰ff&fŽ‘ ¨)˜²will–ÓÆsucceed˜unifying‘÷RÅX‘Ó¤²with“Å0²,‘óaanother˜call˜to˜Åmy‘¡E‰ff&fŽ–Ç«g‘¡E‰ff&fŽ“inc(a,‘?ýY,‘áB‰ff&fŽ‘ ¨)˜²willŽ¡‘øãthen–UUunify‘xâÅY“²with“Å1²,“and“so“on.ŽŸ‘øãÄDi erence›IbQÇet•®9w“een‘HÅg‘¡E‰ff&fŽ–Ç«assign/2˜Äand˜Åg‘¡E‰ff&fŽ“assignb/2²:‘™ZÅg‘¡E‰ff&fŽ“assign/2–é²doGes›énot“undo˜its“assignmen¸ãt˜whenŽ¡‘øãbac•¸ãktrac“king–UUošGccurs“whereas“Åg‘¡E‰ff&fŽ‘Ç«assignb/2“²undo˜es“it.ŽŸ4?íŸÛæd‘ã Åtest(Old)‘?ý:-ŽŽŽ’Çqtestb(Old)‘?ý:-ŽŽ¡‘;âñg‘¡E‰ff&fŽ‘Ç«assign(x,1),ŽŽŽ’ñYg‘¡E‰ff&fŽ‘Ç«assign(x,1),ŽŽ¡‘;âñ(‘¿÷g‘¡E‰ff&fŽ‘Ç«read(x,‘?ýOld),ŽŽŽ’ñY(‘¿÷g‘¡E‰ff&fŽ‘Ç«read(x,‘?ýOld),ŽŽ¡‘PâåÉg‘¡E‰ff&fŽ‘Ç«assign‘¼rÅ(x,‘?ý2)ŽŽŽ’MÉg‘¡E‰ff&fŽ‘Ç«assignb‘¼rÅ(x,‘?ý2)ŽŽ¡‘;âñ;‘¿÷g‘¡E‰ff&fŽ‘Ç«read(x,‘?ýOld),ŽŽŽ’ñY;‘¿÷g‘¡E‰ff&fŽ‘Ç«read(x,‘?ýOld),ŽŽ¡‘Pâåg‘¡E‰ff&fŽ‘Ç«assign(x,‘?ý3)ŽŽŽ’Mg‘¡E‰ff&fŽ‘Ç«assign(x,‘?ý3)ŽŽ¡‘;âñ).ŽŽŽ’ñY).ŽŽŽŽŽŽŸŽŒ‹ƒ @Ñ Ú‹– ý"EŸüfd‘øã²7.21‘ Global‘UUv‘ÿqÇariablesŽŽŽ’±!€131ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãThe–júquery›އÅtest(Old)“²will“succeed“unifying˜ÅOld“²with“Å1‘jû²and“on“bac•¸ãktrac“king–júwith“Å2“²(i.e.‘²¶the“assignmen¸ãtޤ ‘øãof–æ®the“v‘ÿqÇalue“Å2“²has“not“bGeen“undone).‘%ÒThe“query› ;Åtestb(Old)“²will“succeed“unifying˜ÅOld“²with“Å1“²and“onŽ¡‘øãbac•¸ãktrac“king–UUwith“Å1“²(i.e.‘qÇthe“assignmen¸ãt“of“the“v‘ÿqÇalue“Å2“²has“bGeen“undone).ŽŸ‘øãÄDi erence›YQbQÇet•®9w“een˜Åg‘¡E‰ff&fŽ–Ç«assign/2‘YRÄand˜Åg‘¡E‰ff&fŽ“link/2²:‘ŠÅg‘¡E‰ff&fŽ“assign/2›¦·²(and‘¦¶Åg‘¡E‰ff&fŽ“assignb/2²)˜creates˜a‘¦¶cop¸ãy˜ofŽ¡‘øãthe–ìterm“whereas“Åg‘¡E‰ff&fŽ›Ç«link/2“²doGes‘ì~not.‘7EÅg‘¡E‰ff&fŽ˜link/2“²can“bGe“used“to“a•¸ãv“oid‘ì~passing–ìbig“data“structures“(e.g.Ž¡‘øãdictionaries,.–ªª.“.“)‘qÇas–UUargumen¸ãts“to“predicates.Ž©&Ÿíæd‘ã Åtest(B)‘?ý:-ŽŽŽ’Çqtest(B)‘?ý:-ŽŽ¡‘;âñÉg‘¡E‰ff&fŽ‘Ç«assign‘¼rÅ(b,‘?ýf(X)),ŽŽŽ’ñYÉg‘¡E‰ff&fŽ‘Ç«link‘¼rÅ(b,‘?ýf(X)),ŽŽ¡‘;âñX–?ý=“12,ŽŽŽ’ñYX–?ý=“12,ŽŽ¡‘;âñg‘¡E‰ff&fŽ‘Ç«read(b,‘?ýB).ŽŽŽ’ñYg‘¡E‰ff&fŽ‘Ç«read(b,‘?ýB).ŽŽŽŽŽ¦‘øã²The–1©query‘U7Åtest(B)‘1p²will“succeed‘1ªunifying‘U6ÅB‘1q²with“Åf(‘¡E‰ff&fŽ›Ç«)“²(Åg‘¡E‰ff&fŽ˜assign/2›1ª²assigns“a“cop¸ãy“of˜the“v‘ÿqÇalue).‘ÄTheŽ¡‘øãquery›xâÅtestl(B)–UU²will“succeed“unifying˜ÅB“²with“Åf(12)“²(Åg‘¡E‰ff&fŽ‘Ç«link/2“²assigns“a“pGoin¸ãter“to“the“term).ŽŸ‘øãÄSimple–ÕTarra®9y“de nition²:‘qÇhere–UUare“some“queries“to“shoš¸ãw“ho˜w“arra˜ys“can“bGe“handled:Ž©‘ã Å|–?ý?-“g_assign(w,“g_array(3)),“g_read(w,“X).Ž¡¡‘ã X–?ý=“g_array([0,0,0])Ž¡¡‘ã |–?ý?-“g_assign(w(0),“16),“g_assign(w(1),“32),“g_assign(w(2),“64),“g_read(w,“X).Ž¡¡‘ã X–?ý=“g_array([16,32,64])ަ‘øã²this–UUis“equiv‘ÿqÇalen¸ãt“to:ަ‘ã Å|–?ý?-“g_assign(k,“g_array([16,32,64])),“g_read(k,“X).Ž¡¡‘ã X–?ý=“g_array([16,32,64])Ž¡¡‘ã |–?ý?-“g_assign(k,“g_array(3,null)),“g_read(k,“X),“g_array_size(k,“S).Ž¡¡‘ã S–?ý=“3Ž¡‘ã X–?ý=“g_array([null,null,null])ަ‘øãÄ2-D–ÕTarra®9y“de nition²:ަ‘ã Å|–?ý?-“g_assign(w,“g_array(2,“g_array(3))),“g_read(w,“X).Ž¡¡‘ã X–?ý=“g_array([g_array([0,0,0]),g_array([0,0,0])])Ž¡¡‘ã |–?ý?-“(‘¿÷for(I,0,1),“for(J,0,2),“K“is“I*3+J,“g_assign(w(I,J),“K),Ž¡‘A"îfailŽ¡‘,"ú;‘¿÷g_read(w,‘?ýX)Ž¡‘,"ú).Ž¡¡‘ã X–?ý=“g_array([g_array([0,1,2]),g_array([3,4,5])])Ž¡¡‘ã |–?ý?-“g_read(w(1),X).Ž¡¡‘ã X–?ý=“g_array([3,4,5])ަ‘øãÄHybrid‘ÕTarra®9y(ä²:ަ‘ã Å|–?ý?-“g_assign(w,g_array([1,2,g_array([a,b,c]),“g_array(2,z),5])),“g_read(w,“X).Ž¡¡‘ã X–?ý=“g_array([1,2,g_array([a,b,c]),“g_array([z,z]),5])Ž¡ŽŸŽŒ‹„ Qk Ú‹– ý"EŸüfd‘øã²132ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Å|–?ý?-“g_read(w(1),“X),“g_read(w(2,1),“Y),“g_read(w(3,1),“Z).ޤ ¡‘ã X–?ý=“2Ž¡‘ã Y–?ý=“bŽ¡‘ã Z–?ý=“zŽ¡¡‘ã |–?ý?-“g_read(w(1,2),X).Ž¡‘ã uncaught–?ýexception:“error(domain_error(g_array_index,w(1,2)),g_read/2)Ž©7o‘øãÄArra®9y‘ÕTextension²:ŽŸ7n‘ã Å|–?ý?-“g_assign(a,“g_array([10,20,30])),“g_read(a,“X).Ž¡¡‘ã X–?ý=“g_array([10,20,30])Ž¡¡‘ã |–?ý?-“g_assign(a,“g_array_extend(5,null)),“g_read(a,“X).Ž¡¡‘ã X–?ý=“g_array([10,20,30,null,null])Ž¡¡‘ã |–?ý?-“g_assign(a,“g_array([10,20,30])),“g_read(a,“X).Ž¡¡‘ã X–?ý=“g_array([10,20,30])Ž¡¡‘ã |–?ý?-“g_assign(a,“g_array_extend([1,2,3,4,5,6])),“g_read(a,“X).Ž¡¡‘ã X–?ý=“g_array([10,20,30,4,5,6])ަ‘øãÄAutomatic‘ÕTarra®9y(ä²:ަ‘ã Å|–?ý?-“g_assign(t,“g_array_auto(3)),“g_assign(t(1),“foo),“g_read(t,X).Ž¡¡‘ã X–?ý=“g_array([0,foo,0])Ž¡¡‘ã |–?ý?-“g_assign(t(5),“bar),“g_read(t,X).Ž¡¡‘ã X–?ý=“g_array([0,foo,0,0,0,bar,0,0])Ž¡¡‘ã |–?ý?-“g_assign(t,“g_array_auto(2,“g_array(2))),“g_assign(t(1,1),“foo),Ž¡‘,"úg_read(t,X).Ž¡¡‘ã X–?ý=“g_array([g_array([0,0]),g_array([0,foo])])Ž¡¡‘ã |–?ý?-“g_assign(t(3,0),“bar),“g_read(t,X).Ž¡¡‘ã X–?ý=“g_array([g_array([0,0]),g_array([0,foo]),g_array([0,0]),g_array([bar,0])])Ž¡¡‘ã |–?ý?-“g_assign(t(3,4),“bar),“g_read(t,X).Ž¡‘ã uncaught–?ýexception:“error(domain_error(g_array_index,t(3,4)),g_assign/2)Ž¡¡‘ã |–?ý?-“g_assign(t,“g_array_auto(2,“g_array_auto(2))),“g_assign(t(1,1),“foo),Ž¡‘,"úg_read(t,X).Ž¡¡‘ã X–?ý=“g_array([g_array([0,0]),g_array([0,foo])])Ž¡¡‘ã |–?ý?-“g_assign(t(3,3),“bar),“g_read(t,X).Ž¡¡‘ã X–?ý=“g_array([g_array([0,0]),g_array([0,foo]),g_array([0,0]),Ž¡‘&âýg_array([0,0,0,bar])])Ž¡ŽŸŽŒ‹… \3 Ú‹– ý"EŸüfd‘øã²7.22‘ Prolog‘UUstateŽŽŽ’±!€133ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Å|–?ý?-“g_assign(t,“g_array_auto(2,“g_array_auto(2,“null))),“g_read(t(2,3),“U),ޤ ‘,"úg_read(t,‘?ýX).Ž¡¡‘ã U–?ý=“nullŽ¡‘ã X–?ý=“g_array([g_array([null,null]),g_array([null,null]),Ž¡‘V"âg_array([null,null,null,null]),g_array([null,null])])ŽŸ'þ6‘øãÇ7.22Ž‘cProlog‘€stateޤuT‘øãÄ7.22.1Ž‘!ƇÅset‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag/2Ž¡‘øãÄT‘ÿ «emplatesޤ‘ã Åset‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag(+flag,‘?ý+term)Ž¡‘øãÄDescriptionޤ‘øãÅset‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag(Flag,‘?ýValue)–UU²sets“the“v‘ÿqÇalue“of“the“Prolog“ ag“ÅFlag“²to“ÅValue².Ž¡‘øãÄProlog‘TÜ ags²:‘9ëa–åŸProlog›åž ag“is˜an˜atom“whic¸ãh˜is˜assoGciated“with˜a˜v‘ÿqÇalue“that˜is˜either“implemen¸ãtation˜de-ޤ ‘øã ned–™ôor›™õde ned“b¸ãy˜the“user.‘3REac¸ãh“ ag˜has“a˜pGermitted“range“of˜v‘ÿqÇalues;‘Øjan¸ãy“other˜v‘ÿqÇalue“is˜a“Ådomain‘¡E‰ff&fŽ‘Ç«error².Ž¡‘øãThe›HÎfollo•¸ãwing‘HÏt“w“o˜tables‘HÏpresen“t˜a“v‘ÿqÇailable–HÏ ags,‘KOthe“pGossible˜v‘ÿqÇalues,‘KPa“description˜and˜if“they˜are“ISO‘HËorŽ¡‘øãan–WÝextension.‘y^The“ rst“table“presen•¸ãts›WÜunc“hangeable–WÝ ags“while“the˜second“one“the“c¸ãhangeable“ ags.‘y^F‘ÿ*ªorŽ¡‘øã ags–UUwhose“default“v‘ÿqÇalues“is“macš¸ãhine“indepGenden˜t,“this“v‘ÿqÇalue“is“underlinedŽ“Ÿ™”‰fe.#•Ž‘1xê.ŽŸ‘øãÄUnc®9hangeable‘ÕT ags²:ޤc>‘‘øãŸ¬œ‰ffº¥ç¤fdŸ™œ„ ffŸüfd‘FlagŽŽ’Œ “„ ffŽ’£ðßV‘ÿ*ªaluesŽŽ’×n🙜„ ffŽ’ÝÕVDescriptionŽŽ’œÆ¸Ÿ™œ„ ffŽ’£=kISOŽŽ’º?Ÿ™œ„ ffŽŽ©‰ffº¥çŸff‰ffº¥ç¡Ÿ™œ„ ffŸüfd‘ÅboundedŽŽ’Œ “„ ffŽ’”­`trueŽ’”­`Ÿ™”‰feÿôŽ’­©²/‘UUÅfalseŽŽ’×n🙜„ ffŽ’ÝÕV²are–UUin¸ãtegers“bGounded“?ŽŽ’œÆ¸Ÿ™œ„ ffŽ’§öOYŽŽ’º?Ÿ™œ„ ffŽŽ¦‰ffº¥ç¡Ÿ™œ„ ffŸüfd‘Åmax‘¡E‰ff&fŽ‘Ç«integerŽŽ’Œ “„ ffŽ’œPÞ²an‘UUin¸ãtegerŽŽ’×n🙜„ ffŽ’ÝÕVgreatest‘UUin¸ãtegerŽŽ’œÆ¸Ÿ™œ„ ffŽ’§öOYŽŽ’º?Ÿ™œ„ ffŽŽ¦‰ffº¥ç¡Ÿ™œ„ ffŸüfd‘Åmin‘¡E‰ff&fŽ‘Ç«integerŽŽ’Œ “„ ffŽ’œPÞ²an‘UUin¸ãtegerŽŽ’×n🙜„ ffŽ’ÝÕVsmallest‘UUin¸ãtegerŽŽ’œÆ¸Ÿ™œ„ ffŽ’§öOYŽŽ’º?Ÿ™œ„ ffŽŽ¦‰ffº¥ç¡Ÿ™œ„ffŸðfd‘Åinteger‘¡E‰ff&fŽ–Ç«rounding‘¡E‰ff&fŽ“functionŽŽ’Œ “„ffŽ’•þátoward‘¡E‰ff&fŽ‘Ç«zeroŽŸ ’§¢®downŽŽ’×n🙜„ffŽ’ÝÕVÉrnd‘¼rÅ(X)–UU²=“in¸ãteger“part“of‘rÅXŽŸ ’ÝÕVÉrnd‘¼rÅ(X)–UU²=“¸bÅX¸c“²(section“7.6.1,“page“57)ŽŽ’œÆ¸Ÿ™œ„ffŽ’§öOYŽŽ’º?Ÿ™œ„ffŽŽŸ‰ffº¥ç¡Ÿ™œ„ ffŸüfd‘Åmax‘¡E‰ff&fŽ‘Ç«arityŽŽ’Œ “„ ffŽ’œPÞ²an‘UUin¸ãtegerŽŽ’×n🙜„ ffŽ’ÝÕVmaxim•¸ãum›KFarit“y–KGfor˜compGound“terms˜(255)ŽŽ’œÆ¸Ÿ™œ„ ffŽ’§öOYŽŽ’º?Ÿ™œ„ ffŽŽ¦‰ffº¥ç¡Ÿ™œ„ ffŸüfd‘Åmax‘¡E‰ff&fŽ‘Ç«atomŽŽ’Œ “„ ffŽ’œPÞ²an‘UUin¸ãtegerŽŽ’×n🙜„ ffŽ’ÝÕVmaxim•¸ãum›UUn“um“bGer˜of˜atomsŽŽ’œÆ¸Ÿ™œ„ ffŽ’§öONŽŽ’º?Ÿ™œ„ ffŽŽ¦‰ffº¥ç¡Ÿ™œ„ ffŸüfd‘Åmax‘¡E‰ff&fŽ‘Ç«ungetŽŽ’Œ “„ ffŽ’œPÞ²an‘UUin¸ãtegerŽŽ’×n🙜„ ffŽ’ÝÕVmaxim•¸ãum›UUn“um“bGer˜of˜successiv“e˜ungetsŽŽ’œÆ¸Ÿ™œ„ ffŽ’§öONŽŽ’º?Ÿ™œ„ ffŽŽ¦‰ffº¥ç¡Ÿ™œ„ ffŸüfd‘Åprolog‘¡E‰ff&fŽ‘Ç«nameŽŽ’Œ “„ ffŽ’ l²an‘UUatomŽŽ’×n🙜„ ffŽ’ÝÕVname–UUof“the“Prolog“systemŽŽ’œÆ¸Ÿ™œ„ ffŽ’§öONŽŽ’º?Ÿ™œ„ ffŽŽ¦‰ffº¥ç¡Ÿ™œ„ ffŸüfd‘Åprolog‘¡E‰ff&fŽ‘Ç«versionŽŽ’Œ “„ ffŽ’ l²an‘UUatomŽŽ’×n🙜„ ffŽ’ÝÕVv•¸ãersion›UUn“um“bGer˜of˜the˜Prolog˜systemŽŽ’œÆ¸Ÿ™œ„ ffŽ’§öONŽŽ’º?Ÿ™œ„ ffŽŽ¦‰ffº¥ç¡Ÿ™œ„ ffŸüfd‘Åprolog‘¡E‰ff&fŽ‘Ç«dateŽŽ’Œ “„ ffŽ’ l²an‘UUatomŽŽ’×n🙜„ ffŽ’ÝÕVdate–UUof“the“Prolog“systemŽŽ’œÆ¸Ÿ™œ„ ffŽ’§öONŽŽ’º?Ÿ™œ„ ffŽŽ¦‰ffº¥ç¡Ÿ™œ„ ffŸüfd‘Åprolog‘¡E‰ff&fŽ‘Ç«copyrightŽŽ’Œ “„ ffŽ’ l²an‘UUatomŽŽ’×n🙜„ ffŽ’ÝÕVcop•¸ãyrigh“t–UUmessage“of“the“Prolog“systemŽŽ’œÆ¸Ÿ™œ„ ffŽ’§öONŽŽ’º?Ÿ™œ„ ffŽŽ¦‰ffº¥çŽŽŽ¡‘øãÄChangeable‘ÕT ags²:ŽŽŸŽŒ‹† cb Ú‹– ý"EŸüfd‘øã²134ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» þ©‘øã ÿ@€‰ffÃ/¤fdŸ™œ„ ffŸüfd‘FlagŽŽ’Œ “„ ffŽ’¬zV‘ÿ*ªaluesŽŽ’èTŸ™œ„ ffŽ’îçºDescriptionŽŽ’¥O럙œ„ ffŽ’«ÆžISOŽŽ’ÂÈ´Ÿ™œ„ ffŽŽ©‰ffÃ/Ÿff‰ffÃ/¡Ÿ™œ„ ffŸüfd‘Åchar‘¡E‰ff&fŽ‘Ç«conversionŽŽ’Œ “„ ffŽ’§¶Œon–UU²/“ÅoffŽ“Ÿ™”‰fe¿÷ŽŽŽ’èTŸ™œ„ ffŽ’î纲is–UUcš¸ãharacter“con˜v˜ersion“activ‘ÿqÇated“?ŽŽ’¥O럙œ„ ffŽ’°‚YŽŽ’ÂÈ´Ÿ™œ„ ffŽŽ¦‰ffÃ/¡Ÿ™œ„ ffŸüfd‘ÅdebugŽŽ’Œ “„ ffŽ’§¶Œon–UU²/“ÅoffŽ“Ÿ™”‰fe¿÷ŽŽŽ’èTŸ™œ„ ffŽ’î纲is–UUthe“debugger“activ‘ÿqÇated“?ŽŽ’¥O럙œ„ ffŽ’°‚YŽŽ’ÂÈ´Ÿ™œ„ ffŽŽ¦‰ffÃ/¡Ÿ™œ„ ffŸüfd‘Åsingleton‘¡E‰ff&fŽ‘Ç«warningŽŽ’Œ “„ ffŽ’§¶ŒonŽ’§¶ŒŸ™”‰fe úŽ’µ‹Û²/‘UUÅoffŽŽ’èTŸ™œ„ ffŽ’î纲w¸ãarn–UUabGout“named“singleton“v‘ÿqÇariables“?ŽŽ’¥O럙œ„ ffŽ’°‚NŽŽ’ÂÈ´Ÿ™œ„ ffŽŽ¦‰ffÃ/¡Ÿ™œ„ ffŸüfd‘Åstrict‘¡E‰ff&fŽ‘Ç«isoŽŽ’Œ “„ ffŽ’§¶ŒonŽ’§¶ŒŸ™”‰fe úŽ’µ‹Û²/‘UUÅoffŽŽ’èTŸ™œ„ ffŽ’î纲strict–UUISO“bGeha¸ãvior“?ŽŽ’¥O럙œ„ ffŽ’°‚NŽŽ’ÂÈ´Ÿ™œ„ ffŽŽ¦‰ffÃ/¡ŸK™œ„TffŸ´fdŸ ‘Ådouble‘¡E‰ff&fŽ‘Ç«quotesŽŽ’Œ “„Tffޤ ’°+àatomŽ¡’­‹ácharsŽ¡’­‹ácodesŽ’­‹áŸ™”‰fe?ñŽŽ¡’—dAatom‘¡E‰ff&fŽ–Ç«no‘¡E‰ff&fŽ“escapeŽ¡’”ÄBchars‘¡E‰ff&fŽ–Ç«no‘¡E‰ff&fŽ“escapeŽ¡’”ÄBcodes‘¡E‰ff&fŽ–Ç«no‘¡E‰ff&fŽ“escapeŽŽ’èTŸK™œ„TffŽ’î纲a–UUdouble“quoted“constan¸ãt“is“returned“as:ޤ ’îçºan‘UUatomŽ¡’îçºa–UUlist“of“c¸ãharactersŽ¡’îçºa–UUlist“of“c¸ãharacter“coGdesŽ¡’îçºas–UUÅatom“²but“ignore“escapGe“sequencesŽ¡’îçºas–UUÅchars“²but“ignore“escapGe“sequencesŽ¡’îçºas–UUÅcode“²but“ignore“escapGe“sequencesŽŽ’¥OëŸK™œ„Tffޤ ’°‚YŽ¡¡¡’°‚NŽŽ’ÂÈ´ŸK™œ„TffŽŽ©L‰ffÃ/¡ŸK™œ„TffŸ´fdŸ ‘Åback‘¡E‰ff&fŽ‘Ç«quotesŽŽ’Œ “„Tffޤ ’°+àatomŽ¡’­‹ácharsŽ¡’­‹ácodesŽ¡’—dAatom‘¡E‰ff&fŽ–Ç«no‘¡E‰ff&fŽ“escapeŽ’—dAŸÒx‰feF2ŽŽ¡’”ÄBchars‘¡E‰ff&fŽ–Ç«no‘¡E‰ff&fŽ“escapeŽ¡’”ÄBcodes‘¡E‰ff&fŽ–Ç«no‘¡E‰ff&fŽ“escapeŽŽ’èTŸK™œ„TffŽ’î纲a–UUbacš¸ãk“quoted“constan˜t“is“returned“as:ޤ ’îçºan‘UUatomŽ¡’îçºa–UUlist“of“c¸ãharactersŽ¡’îçºa–UUlist“of“c¸ãharacter“coGdesŽ¡’îçºas–UUÅatom“²but“ignore“escapGe“sequencesŽ¡’îçºas–UUÅchars“²but“ignore“escapGe“sequencesŽ¡’îçºas–UUÅcode“²but“ignore“escapGe“sequencesŽŽ’¥OëŸK™œ„TffŽŸ ’°‚NŽŽ’ÂÈ´ŸK™œ„TffŽŽ¦‰ffÃ/¡Ÿ'™œ„0ffŸØfdŸ ‘ÅunknownŽŽ’Œ “„0ffޤ ’­‹áerrorŽ’­‹áŸ™”‰fe?ñŽŽ¡’¨KäwarningŽ¡’°+àfailŽŽ’èTŸ'™œ„0ffŽ’î纲a–O"predicate“calls‘O!an“unkno¸ãwn“proGcedure:ޤ ’îçºan–UUÅexistence‘¡E‰ff&fŽ‘Ç«error“²is“raisedŽ¡’îçºa–UUmessage“is“displa•¸ãy“ed–UUthen“failsŽ¡’îçºquietly‘UUfailsŽŽ’¥OëŸ'™œ„0ffŽŸ ’°‚YŽŽ’ÂÈ´Ÿ'™œ„0ffŽŽ©(‰ffÃ/¡Ÿ'™œ„0ffŸØfdŸ ‘Åsyntax‘¡E‰ff&fŽ‘Ç«errorŽŽ’Œ “„0ffޤ ’­‹áerrorŽ’­‹áŸ™”‰fe?ñŽŽ¡’¨KäwarningŽ¡’°+àfailŽŽ’èTŸ'™œ„0ffŽ’î纲a–UUpredicate“causes“a“syn¸ãtax“error:ޤ ’îçºa–UUÅsyntax‘¡E‰ff&fŽ‘Ç«error“²is“raisedŽ¡’îçºa–UUmessage“is“displa•¸ãy“ed–UUthen“failsŽ¡’îçºquietly‘UUfailsŽŽ’¥OëŸ'™œ„0ffŽŸ ’°‚NŽŽ’ÂÈ´Ÿ'™œ„0ffŽŽ¦‰ffÃ/¡Ÿ'™œ„0ffŸØfdŸ ‘Åos‘¡E‰ff&fŽ‘Ç«errorŽŽ’Œ “„0ffޤ ’­‹áerrorŽ’­‹áŸ™”‰fe?ñŽŽ¡’¨KäwarningŽ¡’°+àfailŽŽ’èTŸ'™œ„0ffŽ’î纲a–UUpredicate“causes“an“O.S.“error:ޤ ’îçºa–UUÅsystem‘¡E‰ff&fŽ‘Ç«error“²is“raisedŽ¡’îçºa–UUmessage“is“displa•¸ãy“ed–UUthen“failsŽ¡’îçºquietly‘UUfailsŽŽ’¥OëŸ'™œ„0ffŽŸ ’°‚NŽŽ’ÂÈ´Ÿ'™œ„0ffŽŽ¦‰ffÃ/ŽŽŽ ÎØ+‘øãThe–R³Åstrict‘¡E‰ff&fŽ‘Ç«iso›R´² ag“is˜inš¸ãtroGduced“to“allo˜w‘R´a“compatibilit˜y›R´with“other“Prolog˜systems.‘pæWhen˜turned“o ŽŸ ‘øãthe–UUfollo¸ãwing“relaxations“apply:ޤù‘ã¸ŽŽŽ‘ã ²a–UUcallable“term“can“bGe“giv¸ãen“as“a“predicate“indicator.ŽŸüƒ‘ã¸ŽŽŽ‘ã ²built-in–UUpredicates“are“found“b¸ãy‘xâÅcurrent‘¡E‰ff&fŽ‘Ç«predicate/1“²(section“7.8.1,“page“64).Ž¡‘øãÄErrorsŽŸ:æe‘øãŸÒ€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅFlag–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Value–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Flag–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFlag)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Flag–UU²is“an“atom“but“not“a“v‘ÿqÇalid“ agŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(prolog‘¡E‰ff&fŽ“flag,‘?ýFlag)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Value–UU²is“inappropriate“for“FlagŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(flag‘¡E‰ff&fŽ“value,‘?ýFlag+Value)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Value–UU²is“appropriate“for“ÅFlag“²but“ ag‘xâÅFlag“²isŽŸ ‘not‘UUmoGdi ableŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(modify,–?ýflag,“Flag)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ<Ø,‘øãÄP•®9ortabilit“yŽŸ‘øã²ISO–UUpredicate.‘qÇAll“ISO“ ags“are“implemen¸ãted.ŽŸ%ü¶‘øãÄ7.22.2Ž‘!ƇÅcurrent‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŽŸŽŒ‹‡ tU Ú‹– ý"EŸüfd‘øã²7.22‘ Prolog‘UUstateŽŽŽ’±!€135ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Åcurrent‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag(?flag,‘?ý?term)Ž©0,‘øãÄDescriptionޤ‘øãÅcurrent‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag(Flag,‘?ýValue)–²succeeds›if“there“exists“a˜Prolog“ ag“that“uni es˜with“ÅFlag“²andŽŸ ‘øãwhose–UUv‘ÿqÇalue“uni es“with“ÅValue².‘qÇThis“predicate“is“re-executable“on“bac•¸ãktrac“king.Ž¡‘øãÄErrorsŽŸ™‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅFlag–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFlag)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Flag–UU²is“an“atom“but“not“a“v‘ÿqÇalid“ agŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(prolog‘¡E‰ff&fŽ“flag,‘?ýFlag)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yŽ¡‘øã²ISO‘UUpredicate.ŽŸ%c@‘øãÄ7.22.3Ž‘!ƇÅset‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name/2ŽŸuT‘øãÄT‘ÿ «emplatesަ‘ã Åset‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name(+atom,‘?ý+arity)ަ‘øãÄDescriptionŽ¡‘øãÅset‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name(Functor,‘?ýArity)–ÆO²initializes›ÆNthe“con¸ãtext˜of“the˜error“(section“5.3.1,‘âépage“37)˜with“ÅFunctorŽŸ ‘øã²and–UUÅArity“²(if‘rÅArity“µ<“²0“only‘xâÅFunctor“²is“signi can¸ãt).Ž¡‘øãÄErrorsŽŸ(ÿ‘øãŸäæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅFunctor–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Arity–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Functor–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFunctor)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Arity–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýArity)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ*qÆ‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%cA‘øãÄ7.22.4Ž‘!ƇÅcurrent‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ0+‘ã Åcurrent‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name(?atom,‘?ý?arity)ަ‘øãÄDescriptionŽ¡‘øãÅcurrent‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name(Functor,‘?ýArity)–ë²succeeds›ëÁif‘²ßÅFunctor“²and˜ÅArity“²correspGond˜to“the“con¸ãtext˜of“theŽŸ ‘øãerror–UU(section“5.3.1,“page“37)“(if‘rÅArity“µ<“²0“only‘xâÅFunctor“²is“signi can¸ãt).Ž¡‘øãÄErrorsŽŸ™‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅFunctor–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFunctor)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Arity–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýArity)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŽŸŽŒ‹ˆ ŠÆ Ú‹– ý"EŸüfd‘øã²136ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.22.5Ž‘!ƇÅwrite‘¡E‰ff&fŽ–Ç«pl‘¡E‰ff&fŽ“state‘¡E‰ff&fŽ“file/1Ä,‘ÕTÅread‘¡E‰ff&fŽ“pl‘¡E‰ff&fŽ“state‘¡E‰ff&fŽ“file/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åwrite‘¡E‰ff&fŽ–Ç«pl‘¡E‰ff&fŽ“state‘¡E‰ff&fŽ“file(+source‘¡E‰ff&fŽ“sink)Ž© ‘ã read‘¡E‰ff&fŽ–Ç«pl‘¡E‰ff&fŽ“state‘¡E‰ff&fŽ“file(+source‘¡E‰ff&fŽ“sink)Ž¡‘øãÄDescriptionŽŸ‘øãÅwrite‘¡E‰ff&fŽ–Ç«pl‘¡E‰ff&fŽ“state‘¡E‰ff&fŽ“file(FileName)–n¤²writes“on¸ãto“ÅFileName“²all‘n¥information“that“in uences“the“parsing“ofަ‘øãa–¨term“(section›©7.14,‘M|¤fdŸ™œ„ ffŸüfd‘ÅFileName–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘FileName–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFileName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ0>“‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ'þ6‘øãÇ7.23Ž‘cProgram‘€stateޤuT‘øãÄ7.23.1Ž‘!ƇÅconsult/1Ä,–ÕTÅ'.'/2“Ä-“program“consultŽ¡‘øãT‘ÿ «emplatesޤ‘ã Åconsult(+atom‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“list)ަ‘ã '.'(+atom,‘?ý+atom‘¡E‰ff&fŽ‘Ç«list)Ž¡‘øãÄDescriptionޤ‘øãÅconsult(Files)–ôv²compiles›ôwand“loads“in¸ãto“memory˜eac¸ãh“ le“of˜the“list“ÅFiles².‘O+Eac¸ãh“ le“is˜compiled“forަ‘øãb¸ãyte-coGde–©vusing“the“GNU‘©JProlog“compiler“(section“3.4,‘ËÖpage“20)“then“loaded“using‘ÍÅload/1“²(section“7.23.2,ަ‘øãpage–th137).‘ÏIt“is‘tipšGossible“to“sp˜ecify‘—õÅuser“²as“a“ le“name“to“directly‘tien¸ãter“the“program“from“the“terminal.ަ‘øãÅFiles–'2²can›'1bGe“also˜a“single“ le˜name“(i.e.–ç]an˜atom).“Refer–'2to˜the“section“concerning˜the“consult˜of“aަ‘øãProlog–UUprogram“for“more“information“(section“3.2.3,“page“16).Ž¡‘øãThe–9¸ nal“ le“name“of“a“ le“is“computed“using“the“predicates“Åprolog‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2–9¸²(section“7.26.3,ަ‘øãpage–UU142)“and“Åabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2–UU²(section“7.26.1,“page“141).ŽŽŸŽŒ‹‰ –Û Ú‹– ý"EŸüfd‘øã²7.23‘ Program‘UUstateŽŽŽ’±!€137ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅ[–?ýFile“|“Files“]²,›UUi.e.‘qÇÅ'.'(File,“Files)˜²is˜equiv‘ÿqÇalen¸ãt˜to˜Åconsult([“File“|“Files“])².ޤ‘øãÄErrorsŽŸXæe‘øãŸ´€‰ffÇ>|¤fdŸ™œ„ffŸðfd‘ÅFiles–UU²is“a“partial“list“or“a“list“with“an“elemen¸ãt“ÅEŽŸ ‘²whic¸ãh–UUis“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Files–UU²is“neither“a“partial“list“nor“a“list“nor“anŽŸ ‘atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýFiles)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅFiles“²list“is“neither“aŽŸ ‘v‘ÿqÇariable–UUnor“an“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–0Zelemen¸ãt›0[ÅE‘0Q²of“the“ÅFiles“²list˜is“an“atom˜but“notŽŸ ‘a–UUv‘ÿqÇalid“pathnameŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅFiles“²list“is“a“v‘ÿqÇalidޤ ‘pathname–/…but“došGes“not‘/„corresp˜ond“to“an“existingŽ¡‘sourceŽŽ’㥄$ffŽ’éÒqÅexistence‘¡E‰ff&fŽ–Ç«error(source‘¡E‰ff&fŽ“sink,‘?ýE)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘²an–UUerror“oGccurs“executing“a“directiv¸ãeŽŽ’㥄 ffŽ’éÒqsee–UUÅcall/1“²errors“(section“6.2.3,“page“47)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽŸZØ,‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.23.2Ž‘!ƇÅload/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åload(+atom‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“list)Ž¡‘øãÄDescriptionŽ©‘øãÅload(Files)–áK²loads“inš¸ãto“memory“eac˜h“ le“of‘áJthe“list“ÅFiles².‘KEac˜h“ le“m˜ust“ha˜v˜e“bGeen“previously“compiledޤ ‘øãfor–ªb¸ãyte-cošGde“using“the“GNU‘—Prolog“compiler“(section‘«3.4,‘ÿpage“20).‘X9ÅFiles“²can“b˜e‘«also“a“single“ le“nameŽ¡‘øã(i.e.‘qÇan‘UUatom).ަ‘øãThe–y¸ nal›y¹ le“name˜of“a˜ le“is“computed˜using“the˜predicates“Åabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2˜²(section‘y¸7.26.1,Ž¡‘øãpage–UU141).‘qÇIf“no“sux“is“giv¸ãen“Å'.wbc'“²is“appGended“to“the“ le“name.ަ‘øãÄErrorsŽŸXæe‘øãŸ´€‰ffÇ>|©fdŸ™œ„ffŸðfd‘ÅFiles–UU²is“a“partial“list“or“a“list“with“an“elemen¸ãt“ÅEŽ¡‘²whic¸ãh–UUis“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘Files–UU²is“neither“a“partial“list“nor“a“list“nor“anŽ¡‘atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýFiles)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅFiles“²list“is“neither“aŽ¡‘v‘ÿqÇariable–UUnor“an“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–0Zelemen¸ãt›0[ÅE‘0Q²of“the“ÅFiles“²list˜is“an“atom˜but“notŽ¡‘a–UUv‘ÿqÇalid“pathnameŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„$ffŸäfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅFiles“²list“is“a“v‘ÿqÇalidŽ¡‘pathname–/…but“došGes“not‘/„corresp˜ond“to“an“existingŽ¡‘sourceŽŽ’㥄$ffŽ’éÒqÅexistence‘¡E‰ff&fŽ–Ç«error(source‘¡E‰ff&fŽ“sink,‘?ýE)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘²an–UUerror“oGccurs“executing“a“directiv¸ãeŽŽ’㥄 ffŽ’éÒqsee–UUÅcall/1“²errors“(section“6.2.3,“page“47)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽŸZØ,‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŽŸŽŒ‹Š ¥U Ú‹– ý"EŸüfd‘øã²138ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.23.3Ž‘!ƇÅlisting/1Ä,‘ÕTÅlisting/0ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Ålisting(+predicate‘¡E‰ff&fŽ‘Ç«indicator)ޤ ‘ã listing(+atom)Ž¡‘ã listingަ‘øãÄDescriptionŽ©‘øãÅlisting(Pred)–‡x²lists›‡wthe“clauses“of˜the“consulted˜predicate“whose“predicate˜indicator“is“ÅPred².‘.ÅPred“²canŽ¡‘øãalso–/TbGe“a“single“atom“in›/Uwhic¸ãh“case“all“predicates“whose“name“is“ÅPred“²are“listed˜(of“anš¸ãy“arit˜y).‘ÿÄThisŽ¡‘øãpredicate–UUuses“Åportray‘¡E‰ff&fŽ‘Ç«clause/2“²(section“7.14.8,“page“99)“to“output“the“clauses.ަ‘øãÅlisting–UU²lists“all“clauses“of“all“consulted“predicates.ަ‘øãÄErrorsŽŸ"™‘øãŸëL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPred–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Pred–UU²is“neither“a“v‘ÿqÇariable“nor“predicate“indicatorŽŸ ‘or–UUan“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(predicate‘¡E‰ff&fŽ“indicator,‘?ýPred)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ$ `‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ'þ6‘øãÇ7.24Ž‘cSystem‘€statisticsޤuT‘øãÄ7.24.1Ž‘!ƇÅstatistics/0Ä,‘ÕTÅstatistics/2Ž¡‘øãÄT‘ÿ «emplatesޤ‘ã ÅstatisticsŽŸ ‘ã statistics(?atom,‘?ý?list)Ž¡‘øãÄDescriptionަ‘øãÅstatistics–UU²displa¸ãys“statistics“abGout“memory“usage“and“run“times.ަ‘øãÅstatistics(Key,‘?ýValue)–`޲uni es“ÅValue›`²with“the“curren¸ãt“v‘ÿqÇalue“of“the˜statistics“k¸ãey‘„ÅKey².‘“rÅValue˜²a“list“ofŽŸ ‘øãt•¸ãw“o›UUelemen“ts.‘qÇTimes˜are˜in˜milliseconds,˜sizes˜of˜areas˜in˜b“ytes.ޤJ¤ø‘øãŸÄ³5‰ff®Äƒ¤fd¤™œ„ ff‘ŸüfdKey‘2‡¡„ ffŽ‘PTXDescription’¦ñÖŸ™œ„ ffŽ’/žbV‘ÿ*ªalue‘fMñŸ™œ„ ffŽŽ©‰ff®ÄƒŸff‰ff®Äƒ¡¤™œ„ ff‘ŸüfdÅuser‘¡E‰ff&fŽ‘Ç«time‘¿÷¡„ ffŽ‘PTX²user–UUCPU“time’—cŸ™œ„ ffŽ’/žbÅ[SinceStart,‘?ýSinceLast]‘Ÿ™œ„ ffŽŽ¦‰ff®Äƒ¡¤™œ„ ff‘Ÿüfdsystem‘¡E‰ff&fŽ‘Ç«time‘ ?ý¡„ ffŽ‘PTX²system–UUCPU“time’‹j·Ÿ™œ„ ffŽ’/žbÅ[SinceStart,‘?ýSinceLast]‘Ÿ™œ„ ffŽŽ¦‰ff®Äƒ¡¤™œ„ ff‘Ÿüfdcpu‘¡E‰ff&fŽ‘Ç«time‘ÿô¡„ ffŽ‘PTX²total–UUCPU“time“(user“+“system)‘KqÌŸ™œ„ ffŽ’/žbÅ[SinceStart,‘?ýSinceLast]‘Ÿ™œ„ ffŽŽ¦‰ff®Äƒ¡¤™œ„ ff‘Ÿüfdreal‘¡E‰ff&fŽ‘Ç«time‘¿÷¡„ ffŽ‘PTX²absolute‘UUtime’ñÔŸ™œ„ ffŽ’/žbÅ[SinceStart,‘?ýSinceLast]‘Ÿ™œ„ ffŽŽ¦‰ff®Äƒ¡¤™œ„ ff‘Ÿüfdlocal‘¡E‰ff&fŽ‘Ç«stack‘ ?ý¡„ ffŽ‘PTX²loGcal–UUstacš¸ãk“sizes“(con˜trol,“en˜vironmen˜ts,“c˜hoices)‘Ÿ™œ„ ffŽ’/žbÅ[UsedSize,‘?ýFreeSize]‘¿÷Ÿ™œ„ ffŽŽ¦‰ff®Äƒ¡¤™œ„ ff‘Ÿüfdglobal‘¡E‰ff&fŽ‘Ç«stack‘¡„ ffŽ‘PTX²global–UUstac¸ãk“sizes“(compGound“terms)‘:Ÿ™œ„ ffŽ’/žbÅ[UsedSize,‘?ýFreeSize]‘¿÷Ÿ™œ„ ffŽŽ¦‰ff®Äƒ¡¤™œ„ ff‘Ÿüfdtrail‘¡E‰ff&fŽ‘Ç«stack‘ ?ý¡„ ffŽ‘PTX²trail–UUstac¸ãk“sizes“(v‘ÿqÇariable“bindings“to“undo)‘qÄŸ™œ„ ffŽ’/žbÅ[UsedSize,‘?ýFreeSize]‘¿÷Ÿ™œ„ ffŽŽ¦‰ff®Äƒ¡¤™œ„ ff‘Ÿüfdcstr‘¡E‰ff&fŽ‘Ç«stack‘ú¡„ ffŽ‘PTX²constrainš¸ãt–UUtrail“sizes“( nite“domain“constrain˜ts)‘¿üŸ™œ„ ffŽ’/žbÅ[UsedSize,‘?ýFreeSize]‘¿÷Ÿ™œ„ ffŽŽ¦‰ff®ÄƒŽŽŽ¡‘øã²Note–UUthat“the“kš¸ãey‘xâÅruntime“²is“recognized“as“Åuser‘¡E‰ff&fŽ‘Ç«time“²for“compatibilit˜y“purpGose.ަ‘øãÄErrorsŽŽŸŽŒ‹‹ ´d Ú‹– ý"EŸüfd‘øã²7.25‘ Random›UUn•¸ãum“bGer˜generatorŽŽŽ’±!€139ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ývo‘øãŸßš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅKey–UU²is“neither“a“v›ÿqÇariable“nor“a“v˜alid“k¸ãeyŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(statistics‘¡E‰ff&fŽ“key,‘?ýKey)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Value–UU²is“neither“a“v‘ÿqÇariable“nor“a“list“of“t•¸ãw“oŽŸ ‘elemen¸ãtsŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(statistics‘¡E‰ff&fŽ“value,‘?ýValue)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Value–UU²is“a“list“of“t•¸ãw“o›UUelemen“ts˜and˜an˜elemen“t˜ÅEŽŸ ‘²is–UUneither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸ0>“‘øãÄP•®9ortabilit“yŽŸ‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.24.2Ž‘!ƇÅuser‘¡E‰ff&fŽ–Ç«time/1Ä,›ÕTÅsystem‘¡E‰ff&fŽ“time/1Ä,˜Åcpu‘¡E‰ff&fŽ“time/1Ä,˜Åreal‘¡E‰ff&fŽ“time/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åuser‘¡E‰ff&fŽ‘Ç«time(?integer)ޤ ‘ã system‘¡E‰ff&fŽ‘Ç«time(?integer)Ž¡‘ã cpu‘¡E‰ff&fŽ‘Ç«time(?integer)Ž¡‘ã real‘¡E‰ff&fŽ‘Ç«time(?integer)ަ‘øãÄDescriptionޤ‘øãÅuser‘¡E‰ff&fŽ‘Ç«time(Time)–UU²uni es“ÅTime“²with“the“user“CPU“time“elapsed“since“the“start“of“Prolog.Ž¡‘øãÅsystem‘¡E‰ff&fŽ‘Ç«time(Time)–UU²uni es“ÅTime“²with“the“system“CPU“time“elapsed“since“the“start“of“Prolog.Ž¡‘øãÅcpu‘¡E‰ff&fŽ‘Ç«time(Time)–UU²uni es“ÅTime“²with“the“CPU“time“(user“+“system)“elapsed“since“the“start“of“Prolog.Ž¡‘øãÅreal‘¡E‰ff&fŽ‘Ç«time(Time)–UU²uni es“ÅTime“²with“the“absolute“time“elapsed“since“the“start“of“Prolog.Ž¡‘øãÄErrorsŽ¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅTime–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýTime)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ'þ6‘øãÇ7.25Ž‘cRandom›€n• um“b`er˜generatorޤuT‘øãÄ7.25.1Ž‘!ƇÅset‘¡E‰ff&fŽ‘Ç«seed/1Ä,‘ÕTÅrandomize/0Ž¡‘øãÄT‘ÿ «emplatesަ‘ã Åset‘¡E‰ff&fŽ‘Ç«seed(+integer)ŽŸ ‘ã randomizeަ‘øãÄDescriptionޤ‘øãÅset‘¡E‰ff&fŽ‘Ç«seed(Seed)–UU²reinitializes“the“random“n•¸ãum“bGer–UUgenerator“seed“with“ÅSeed².Ž¡‘øãÅrandomize–v¶²reinitializes›v·the“random“n•¸ãum“bGer–v¶generator.‘ÕëThis˜predicates“calls“Åset‘¡E‰ff&fŽ‘Ç«seed/1“²with˜a“randomŽŸ ‘øãv‘ÿqÇalue–UUdepGending“on“the“absolute“time.Ž¡‘øãÄErrorsŽŽŸŽŒ‹Œ Â{ Ú‹– ý"EŸüfd‘øã²140ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýjo‘øãŸëš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSeed–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Seed–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýSeed)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Seed–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýSeed)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ$>“‘øãÄP•®9ortabilit“yޤ‘øã²GNU–UUProlog“predicates.Ž©%FP‘øãÄ7.25.2Ž‘!ƇÅget‘¡E‰ff&fŽ‘Ç«seed/1ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ©¿‘ã Åget‘¡E‰ff&fŽ‘Ç«seed(?integer)ŽŸ©¾‘øãÄDescriptionŽ¡‘øãÅget‘¡E‰ff&fŽ‘Ç«seed(Seed)–UU²uni es“ÅSeed“²with“the“currenš¸ãt“random“n˜um˜bGer“generator“seed.Ž¡‘øãÄErrorsŽŸ™‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSeed–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýSeed)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Seed–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýSeed)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ަ‘øãÄ7.25.3Ž‘!ƇÅrandom/1ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ©¿‘ã Årandom(-float)ŽŸ©¾‘øãÄDescriptionŽ¡‘øãÅrandom(Number)–UU²uni es“ÅNumber“²with“a“random“ oating“pGoinš¸ãt“n˜um˜bGer“suc˜h“that“0.0“¸“ÅNumber“µ<“²1.0.Ž¡‘øãÄErrorsŽ¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅNumber–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýNumber)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ަ‘øãÄ7.25.4Ž‘!ƇÅrandom/3ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ©¿‘ã Årandom(+number,–?ý+number,“-number)ŽŸ©¾‘øãÄDescriptionŽ¡‘øãÅrandom(Base,–?ýMax,“Number)–Ñk²uni es›ÑlÅNumber“²with“a˜random“n•¸ãum“bGer›Ñksuc“h˜that–ÑlÅBase˜¸˜ÅNumber“µ<˜ÅMax².ޤ ‘øãIf–ÑñbšGoth“ÅBase“²and“ÅMax“²are“in¸ãtegers“ÅNumber“²will“b˜e“an“in¸ãteger,‘ñotherwise“ÅNumber“²will“b˜e“a“ oating“p˜oin¸ãtŽ¡‘øãn•¸ãum“bGer.ŽŽŸŽŒ‹ ÌÜ Ú‹– ý"EŸüfd‘øã²7.26‘ File–UUname“proGcessingŽŽŽ’±!€141ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄErrorsŽŸ.³2‘øãŸÞ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅBase–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Base–UU²is“neither“a“v‘ÿqÇariable“nor“a“n•¸ãum“bGerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(number,‘?ýBase)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Max–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Max–UU²is“neither“a“v‘ÿqÇariable“nor“a“n•¸ãum“bGerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(number,‘?ýMax)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Number–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýNumber)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ0¤ù‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ'þ6‘øãÇ7.26Ž‘cFile–€name“pro`cessingޤuT‘øãÄ7.26.1Ž‘!ƇÅabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2Ž¡‘øãÄT‘ÿ «emplatesޤ‘ã Åabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name(+atom,‘?ýatom)Ž¡‘øãÄDescriptionަ‘øãÅabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name(File1,‘?ýFile2)–“Ô²succeeds“if‘ZñÅFile2“²is“the“absolute“pathname“assoGciated“with“the“rel-ޤ ‘øãativš¸ãe–Ôç le“name‘ÔèÅFile1².‘FøÅFile1“²can“con˜tain“Å$ÉVAR‘¡E‰ff&fŽ‘Ç«NAME‘‘9²sub-strings.‘FøWhen“suc˜h“a‘Ôèsub-string“is“encoun˜tered,Ž¡‘øãit–Éßis“expanded“with“the‘ÉÞv›ÿqÇalue“of“the“en•¸ãvironmen“t–Éßv˜ariable“whose“name“is‘ÉÞÉVAR‘¡E‰ff&fŽ‘Ç«NAME‘†3²if“exists“(otherwiseŽ¡‘øãno–0Êexpansion›0Éis“done).‘%ÅFile1˜²can“also“bGegin˜with“a˜sub-string‘TWÅ~ÉUSER‘¡E‰ff&fŽ‘Ç«NAME‘¼rÅ/²,‘g§this˜is“expanded˜as“theŽ¡‘øãhome–V²directory“of“the“user“ÉUSER‘¡E‰ff&fŽ›Ç«NAME‘¼r².“If‘ÏÉUSER‘¡E‰ff&fŽ˜NAME‘$²doGes“not“exist“ÅFile1‘V³²is“an“in¸ãv‘ÿqÇalid“pathname.‘uÞIf“noŽ¡‘øãÉUSER‘¡E‰ff&fŽ‘Ç«NAME‘0 ²is–s¢givš¸ãen“(i.e.‘Ì­ÅFile1“²bGegins“with“Å~/²)“the‘s¡Å~“²c˜haracter“is“expanded“as“the‘s¡v‘ÿqÇalue“of“the“en˜viron-Ž¡‘øãmen¸ãt–ëv›ÿqÇariable“ÅHOME².“If‘êthe“ÅHOME‘Ú²v˜ariable“is“not“de ned“ÅFile1“²is“an‘êin¸ãv˜alid“pathname.‘[¤Relativ¸ãe“referencesŽ¡‘øãto–÷the“currenš¸ãt“directory‘ø(Å/./“²sub-string)“and“to“the“paren˜t“directory“(Å/../‘ø²sub-strings)“are“remo˜v˜ed“andŽ¡‘øãno–Flonger“appGear›Ein“ÅFile2².‘«™ÅFile1“²is“also“in¸ãv‘ÿqÇalid“if˜it“conš¸ãtains“toGo“man˜y‘6ÒÅ/../“²consecutiv˜e“sub-stringsŽ¡‘øã(i.e.‘åparen•¸ãt›‡ directory‘‡ relativ“e˜references).‘åFinally–‡ if‘N&ÅFile1“²is˜Åuser“²then˜ÅFile2“²is˜also“uni ed˜with“ÅuserŽ¡‘øã²to–Såallo¸ãw“this“predicate“to›SæbGe“called“on“Prolog“ le“names“(since“Åuser˜²in“DEC-10“input/output“predicatesŽ¡‘øãdenotes–UUthe“curren¸ãt“input/output“stream).ަ‘øãMost–UUpredicates“using“a“ le“name“implicitly“call“this“predicate“to“obtain“the“desired“ le,“e.g.‘qÇÅopen/4².ަ‘øãÄErrorsŽŸ(ÿ‘øãŸäæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅFile1–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘File1–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFile1)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘File2–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFile2)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘File1–UU²is“an“atom“but“not“a“v‘ÿqÇalid“pathnameŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýFile1)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ*qÆ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.26.2Ž‘!ƇÅdecompose‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/4ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ‘ã Ådecompose‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name(+atom,–?ý?atom,“?atom,“?atom)ŽŽŸŽŒ‹Ž Ö‹ Ú‹– ý"EŸüfd‘øã²142ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄDescriptionŽ©‘øãÅdecompose‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name(File,–?ýDirectory,“Prefix,“Suffix)–y»²decompGoses›yºthe“pathname˜ÅFile“²and˜ex-ޤ ‘øãtracts–the›ŽÅDirectory“²part˜(c¸ãharacters“bGefore“the˜last“Å/²),‘éthe“ÅPrefix˜²part“(c¸ãharacters“after˜the“last˜Å/“²andŽ¡‘øãbGefore–Ãthe›Âlast“Å.‘^A²or“un¸ãtil˜the“end“if˜there“is˜no“sux)“and˜the“ÅSuffix“²part˜(c¸ãharacters“from“the˜last“Å.‘^A²toŽ¡‘øãthe–UUend“of“the“string).ަ‘øãÄErrorsŽŸ.³2‘øãŸÞ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅFile–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘File–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFile)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Directory–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýDirectory)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Prefix–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPrefix)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Suffix–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýSuffix)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ0¤ù‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%¿-‘øãÄ7.26.3Ž‘!ƇÅprolog‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸÛ,‘ã Åprolog‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name(+atom,‘?ý?atom)ŽŸÛ-‘øãÄDescriptionަ‘øãÅprolog‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name(File1,‘?ýFile2)–èa²uni es“ÅFile2“²with“the‘èbProlog“ le“name“assoGciated“with“ÅFile1².‘MvMoreŽ¡‘øãprecisely‘xâÅFile2–UU²is“computed“as“follo¸ãws:ŽŸÛ-‘ã¸ŽŽŽ‘ã ²if‘rÅFile1–UU²has“a“sux“or“if“it“is“Åuser“²then“ÅFile2“²is“uni ed“with“ÅFile1².ޤm–‘ã¸ŽŽŽ‘ã ²else–UUif“the“ le“whose“name“is“ÅFile1“²+“Å'.pl'“²exists“then“ÅFile2“²is“uni ed“with“this“name.Ž¡‘ã¸ŽŽŽ‘ã ²else–UUif“the“ le“whose“name“is“ÅFile1“²+“Å'.pro'“²exists“then“ÅFile2“²is“uni ed“with“this“name.ŽŸm—‘ã¸ŽŽŽ‘ã ²else–UUÅFile2“²is“uni ed“with“the“name“ÅFile1“²+“Å'.pl'².ŽŸÛ,‘øãThis–UUpredicate“uses“Åabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2–UU²to“c•¸ãhec“k–UUthe“existence“of“a“ le“(section“7.26.1,“page“141).ަ‘øãÄErrorsŽŸ(ÿ‘øãŸäæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅFile1–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘File1–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFile1)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘File2–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýFile2)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘File1–UU²is“an“atom“but“not“a“v‘ÿqÇalid“pathnameŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýFile1)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ*qÆ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ'¿-‘øãÇ7.27Ž‘cOp`erating–€system“in terfaceޤuT‘øãÄ7.27.1Ž‘!ƇÅargument‘¡E‰ff&fŽ‘Ç«counter/1Ž¡‘øãÄT‘ÿ «emplatesŽŽŸŽŒ‹ æÀ Ú‹– ý"EŸüfd‘øã²7.27‘ OpGerating–UUsystem“in¸ãterfaceŽŽŽ’±!€143ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Åargument‘¡E‰ff&fŽ‘Ç«counter(?integer)ŽŸ9‘øãÄDescriptionŽ©‘øãÅargument‘¡E‰ff&fŽ‘Ç«counter(Counter)–Qh²succeeds“if‘„ÅCounter“²is“the“n•¸ãum“bGer›Qhof‘Qgargumen“ts˜of˜the˜command-line.‘#Sinceޤ ‘øãthe–m| rst›m{argumen¸ãt“is˜alw•¸ãa“ys–m|the“name˜of“the“running˜program,‘s…ÅCounter“²is“alw•¸ãa“ys˜¸–m|²1.‘º;See˜(section“3.2,Ž¡‘øãpage–UU13)“for“more“information“abGout“command-line“argumenš¸ãts“retriev˜ed“under“the“top‘™˜‰ffŽ‘™šlev˜el.ަ‘øãÄErrorsަ‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅCounter–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýCounter)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¦‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%=˜‘øãÄ7.27.2Ž‘!ƇÅargument‘¡E‰ff&fŽ‘Ç«value/2ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ9‘ã Åargument‘¡E‰ff&fŽ‘Ç«value(+integer,‘?ý?atom)ŽŸ:‘øãÄDescriptionަ‘øãÅargument‘¡E‰ff&fŽ‘Ç«value(N,‘?ýArg)–6²succeeds“if“the›6~ÅNÈth‘úâ²argumen¸ãt“on“the“command-line“uni es“with˜ÅArg².‘g€The“ rstŽ¡‘øãargumen•¸ãt›E¥is‘E¤alw“a“ys˜the–E¤name˜of“the˜running“program˜and“its˜n•¸ãum“bGer–E¤is˜0.‘lŒThe“n•¸ãum“bGer˜of‘E¤argumen“ts˜onŽ¡‘øãthe–UUcommand-line“can“bGe“obtained“using‘xâÅargument‘¡E‰ff&fŽ‘Ç«counter/1“²(section“7.27.1,“page“142).ަ‘øãÄErrorsŽŸ(ÿ‘øãŸäæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅN–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘N–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýN)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘N–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýN)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Arg–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýArg)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ*qÆ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%=—‘øãÄ7.27.3Ž‘!ƇÅargument‘¡E‰ff&fŽ‘Ç«list/1ŽŸuT‘øãÄT‘ÿ «emplatesŽŸ:‘ã Åargument‘¡E‰ff&fŽ‘Ç«list(?list)ŽŸ9‘øãÄDescriptionަ‘øãÅargument‘¡E‰ff&fŽ‘Ç«list(Args)–~زsucceeds“if‘EõÅArgs“²uni es“with“the“list“of“atoms“assoGciated“with“eacš¸ãh“argumen˜t“onŽ¡‘øãthe–UUcommand-line“other“than“the“ rst“argumen¸ãt“(the“name“of“the“running“program).ަ‘øãÄErrorsަ‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅArgs–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýArgs)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¦‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŽŸŽŒ‹ ô› Ú‹– ý"EŸüfd‘øã²144ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.27.4Ž‘!ƇÅenviron/2Ž©uT‘øãÄT‘ÿ «emplatesޤ‘ã Åenviron(?atom,‘?ý?atom)Ž¡‘øãÄDescriptionޤ‘øãÅenviron(Name,‘?ýValue)–›V²succeeds››Uif‘bsÅName“²is“the˜name“of“an˜en•¸ãvironmen“t–›Vv›ÿqÇariable“whose“v˜alue‘›Uis“ÅValue².ŽŸ ‘øãThis–UUpredicate“is“re-executable“on“bac•¸ãktrac“king.Ž¡‘øãÄErrorsŽŸ™‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅName–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýName)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Value–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýValue)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.5Ž‘!ƇÅmake‘¡E‰ff&fŽ–Ç«directory/1Ä,›ÕTÅdelete‘¡E‰ff&fŽ“directory/1Ä,˜Åchange‘¡E‰ff&fŽ“directory/1ަ‘øãÄT‘ÿ «emplatesŽ©‘ã Åmake‘¡E‰ff&fŽ‘Ç«directory(+atom)ޤ ‘ã delete‘¡E‰ff&fŽ‘Ç«directory(+atom)Ž¡‘ã change‘¡E‰ff&fŽ‘Ç«directory(+atom)ަ‘øãÄDescriptionޤ‘øãÅmake‘¡E‰ff&fŽ‘Ç«directory(PathName)–UU²creates“the“directory“whose“pathname“is“ÅPathName².Ž¡‘øãÅdelete‘¡E‰ff&fŽ‘Ç«directory(PathName)›UU²remo•¸ãv“es˜the˜directory˜whose˜pathname˜is˜ÅPathName².Ž¡‘øãÅchange‘¡E‰ff&fŽ‘Ç«directory(PathName)–Oÿ²sets›Pthe“curren¸ãt“directory˜to“the˜directory“whose“pathname˜is“ÅPathName².Ž¡‘øãSee›UUÅabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2˜²for˜information˜abGout˜the˜syn¸ãtax˜of‘rÅPathName˜²(section˜7.26.1,˜page˜141).Ž¡‘øãÄErrorsŽŸ4ÿ‘øãŸØæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPathName–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName–UU²is“an“atom“but“not“a“v‘ÿqÇalid“pathnameŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ6qÆ‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.27.6Ž‘!ƇÅworking‘¡E‰ff&fŽ‘Ç«directory/1ŽŸuT‘øãÄT‘ÿ «emplatesŽŽŸŽŒ‹‘ V Ú‹– ý"EŸüfd‘øã²7.27‘ OpGerating–UUsystem“in¸ãterfaceŽŽŽ’±!€145ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Åworking‘¡E‰ff&fŽ‘Ç«directory(?atom)Ž©‘øãÄDescriptionޤ‘øãÅworking‘¡E‰ff&fŽ‘Ç«directory(PathName)–UU²succeeds“if‘rÅPathName“²is“the“pathname“of“the“curren¸ãt“directory‘ÿ*ª.Ž¡‘øãÄErrorsŽ¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅPathName–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.7Ž‘!ƇÅdirectory‘¡E‰ff&fŽ‘Ç«files/2ŽŸuT‘øãÄT‘ÿ «emplatesަ‘ã Ådirectory‘¡E‰ff&fŽ‘Ç«files(+atom,‘?ý?list)ަ‘øãÄDescriptionŽ¡‘øãÅdirectory‘¡E‰ff&fŽ‘Ç«files(PathName,‘?ýFiles)›Ì8²succeeds–Ì7if‘“UÅFiles“²is˜the˜list“of˜all“en¸ãtries˜( les,‘ç¤sub-directories,.–ªª.“.“)ޤ ‘øãin–Fmthe“directory“whose“pathname“is“ÅPathName².‘ESee“Åabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2–Fm²for“information“abGout“theŽ¡‘øãsyn¸ãtax–UUof‘rÅPathName“²(section“7.26.1,“page“141).ޤ‘øãÄErrorsŽŸ:³2‘øãŸÒ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPathName–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName–UU²is“an“atom“but“not“a“v‘ÿqÇalid“pathnameŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Files–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýFiles)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ<¤ù‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.8Ž‘!ƇÅrename‘¡E‰ff&fŽ‘Ç«file/2ŽŸuT‘øãÄT‘ÿ «emplatesަ‘ã Årename‘¡E‰ff&fŽ‘Ç«file(+atom,‘?ý+atom)ަ‘øãÄDescriptionŽ¡‘øãÅrename‘¡E‰ff&fŽ‘Ç«file(PathName1,‘?ýPathName2)–æ²renames›åthe“ le“or“directory˜whose“pathname“is˜ÅPathName1“²toޤ ‘øãÅPathName2².‘¢See›e“Åabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2–e’²for“information˜abGout“the“syn¸ãtax˜of‘,¯ÅPathName1˜²and“ÅPathName2Ž¡‘øã²(section–UU7.26.1,“page“141).ŽŸ‘øãÄErrorsŽŽŸŽŒ‹’ W Ú‹– ý"EŸüfd‘øã²146ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý;Ý‘øãŸÆLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPathName1–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName1–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPathName1)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName1–UU²is“an“atom“but“not“a“v‘ÿqÇalid“pathnameŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýPathName1)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName2–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName2–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPathName2)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName2–UU²is“an“atom“but“not“a“v‘ÿqÇalid“pathnameŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýPathName2)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“v‘ÿqÇalue“ofޤ ‘the–UUÅos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸI _‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ%ü§‘øãÄ7.27.9Ž‘!ƇÅdelete‘¡E‰ff&fŽ‘Ç«file/1Ä,‘ÕTÅunlink/1ŽŸuT‘øãÄT‘ÿ «emplatesޤøÂ‘ã Ådelete‘¡E‰ff&fŽ‘Ç«file(PathName)ŽŸ ‘ã unlink(PathName)Ž¡‘øãÄDescriptionަ‘øãÅdelete‘¡E‰ff&fŽ‘Ç«file(PathName)›UU²remo•¸ãv“es˜the˜existing˜ le˜whose˜pathname˜is˜ÅPathName².ަ‘øãÅunlink/1–ܲis›Üsimilar“to“Ådelete‘¡E‰ff&fŽ‘Ç«file/1“²except˜that“it“nev¸ãer“causes˜a“Åsystem‘¡E‰ff&fŽ‘Ç«error“²(e.g.‘I`if‘£;ÅPathName“²doGesޤ ‘øãnot–UUrefer“to“an“existing“ le).ަ‘øãSee›UUÅabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2˜²for˜information˜abGout˜the˜syn¸ãtax˜of‘rÅPathName˜²(section˜7.26.1,˜page˜141).ަ‘øãÄErrorsŽŸ4ÿ‘øãŸØæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPathName–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName–UU²is“an“atom“but“not“a“v‘ÿqÇalid“pathnameŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ6qÆ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%ü§‘øãÄ7.27.10Ž‘'†…Åfile‘¡E‰ff&fŽ–Ç«permission/2Ä,‘ÕTÅfile‘¡E‰ff&fŽ“exists/1ŽŸuT‘øãÄT‘ÿ «emplatesŽŸøÃ‘ã Åfile‘¡E‰ff&fŽ‘Ç«permission(+atom,‘?ý+atom)Ž¡‘ã file‘¡E‰ff&fŽ–Ç«permission(+atom,‘?ý+atom‘¡E‰ff&fŽ“list)Ž¡‘ã file‘¡E‰ff&fŽ‘Ç«exists(+atom)ŽŸøÂ‘øãÄDescriptionަ‘øãÅfile‘¡E‰ff&fŽ‘Ç«permission(PathName,‘?ýPermission)–4ܲsucceeds“if‘ûùÅPathName“²is“the‘4Ûpathname“of“an“existing“ le“(orŽ¡‘øãdirectory)–UUwhose“pGermissions“include“ÅPermission².ŽŽŸŽŒ‹“ g Ú‹– ý"EŸüfd‘øã²7.27‘ OpGerating–UUsystem“in¸ãterfaceŽŽŽ’±!€147ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄFile‘'µpQÇermissions²:‘ ÅPermission–œ÷²can›œøbGe“a˜single˜pGermission“or˜a˜list“of˜p•Germissions.‘H¯A‘œåp“ermission‘œ÷is˜anŽŸ ‘øãatom‘UUamong:Ž©vú‘ã¸ŽŽŽ‘ã Åread²:‘qÇthe–UU le“or“directory“can“bGe“read.ޤ»}‘ã¸ŽŽŽ‘ã Åwrite²:‘qÇthe–UU le“or“directory“can“bGe“written.Ž¡‘ã¸ŽŽŽ‘ã Åexecute²:‘qÇthe–UU le“can“bGe“executed.Ž¡‘ã¸ŽŽŽ‘ã Åsearch²:‘qÇthe–UUdirectory“can“bGe“searc¸ãhed.ަ‘øãIf‘rÅPathName–UU²došGes“not“exists“or“if“it“its“p˜ermissions“do“not“include“ÅPermission“²this“predicate“fails.ޤ‘øãÅfile‘¡E‰ff&fŽ›Ç«exists(PathName)–üDzis“equiv‘ÿqÇalen¸ãt“to“Åfile‘¡E‰ff&fŽ˜permission(PathName,‘?ý[])²,‘}i.e.‘TBit“succeeds“if‘ÃäÅPathNameŽŸ ‘øã²is–UUthe“pathname“of“an“existing“ le“(or“directory).Ž¡‘øãSee›UUÅabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2˜²for˜information˜abGout˜the˜syn¸ãtax˜of‘rÅPathName˜²(section˜7.26.1,˜page˜141).Ž¡‘øãÄErrorsŽŸeLË‘øãŸ¨›‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPathName–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName–UU²is“an“atom“but“not“a“v‘ÿqÇalid“pathnameŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Permission–UU²is“a“partial“list“or“a“list“with“anŽŸ ‘elemen•¸ãt›UUwhic“h˜is˜a˜v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Permission–UU²is“neither“an“atom“nor“partial“list“orŽŸ ‘a‘UUlistŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýPermission)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅPermission“²list“is“neither“aŽŸ ‘v‘ÿqÇariable–UUnor“an“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅPermission“²is“an“atom“butŽŸ ‘not–UUa“v‘ÿqÇalid“pGermissionŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“file‘¡E‰ff&fŽ“permission,ŽŸ ’éÒqPermission)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸg>’‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ%à·‘øãÄ7.27.11Ž‘'†…Åfile‘¡E‰ff&fŽ‘Ç«property/2ŽŸuT‘øãÄT‘ÿ «emplatesަ‘ã Åfile‘¡E‰ff&fŽ–Ç«property(+atom,‘?ý?os‘¡E‰ff&fŽ“file‘¡E‰ff&fŽ“property)ަ‘øãÄDescriptionŽ¡‘øãÅfile‘¡E‰ff&fŽ‘Ç«property(PathName,‘?ýProperty)›·²succeeds–·if‘~­ÅPathName“²is˜the˜pathname“of˜an“existing˜ le“(or˜di-ޤ ‘øãrectory)›8ïand–8ðif‘ ÅProperty“²uni es˜with“one˜of“the˜propGerties˜of“the˜ le.‘hPThis“predicate˜is“re-executable˜onŽ¡‘øãbac•¸ãktrac“king.ŽŸ‘øãÄFile‘ÕTpropQÇerties²:ަ‘ã¸ŽŽŽ‘ã Åabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name(File)²:‘4òÅFile–Û«²is“the‘Û¬absolute“ le“name“of‘¢ÈÅPathName“²(section“7.26.1,‘ôpage“141).ޤ»}‘ã¸ŽŽŽ‘ã Åreal‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name(File)²:‘qÇÅFile–UU²is“the“real“ le“name“of‘rÅPathName“²(folloš¸ãws“sym˜bGolic“links).Ž¡‘ã¸ŽŽŽ‘ã Åtype(Type)²:‘ë‘ÅType–Hê²is“the‘Hétš¸ãypGe“of‘ÅPathName².‘NP˜ossible“v‘ÿqÇalues‘Héare:‘ë’Åregular²,–~™Ådirectory²,“Åfifo²,“Åsocket²,ŽŸ ‘ã Åcharacter‘¡E‰ff&fŽ–Ç«device²,›UUÅblock‘¡E‰ff&fŽ“device˜²or˜Åunknown².ŽŽŸŽŒ‹” %C Ú‹– ý"EŸüfd‘øã²148ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã¸ŽŽŽ‘ã Åsize(Size)²:‘qÇÅSize–UU²is“the“size“(in“b¸ãytes)“of‘rÅPathName².ޤ‘ã¸ŽŽŽ‘ã Åpermission(Permission)²:‘qÇÅPermission–UU²is“a“pGermission“of‘rÅPathName“²(section“7.27.10,“page“146).Ž¡‘ã¸ŽŽŽ‘ã Ålast‘¡E‰ff&fŽ‘Ç«modification(DT)²:–UUÅDT“²is“the“last“moGdi cation“date“and“time“(section“7.27.14,“page“149).Ž¡‘øãSee›UUÅabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2˜²for˜information˜abGout˜the˜syn¸ãtax˜of‘rÅPathName˜²(section˜7.26.1,˜page˜141).ޤ‘øãÄErrorsŽ þ‘øã ÿ}æh‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPathName–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName–UU²is“an“atom“but“not“a“v‘ÿqÇalid“pathnameŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Property–UU²is“neither“a“v‘ÿqÇariable“nor“a“ le“propGert¸ãyŽŸ ‘termŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“file‘¡E‰ff&fŽ“property,‘?ýProperty)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘Property–UU²=“Åabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name(E)²,ޤ ‘Åreal‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name(E)²,–UUÅtype(E)“²or“Åpermission(E)Ž¡‘²and–UUÅE“²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄$ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýE)ŽŽ’ÆØŸ™œ„$ffŽŽ©‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘Property–UU²=“Ålast‘¡E‰ff&fŽ‘Ç«modification(DateTime)ޤ ‘²and–UUÅDateTime“²is“neither“a“v‘ÿqÇariable“nor“aŽ¡‘compGound‘UUtermŽŽ’㥄$ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(compound,‘?ýDateTime)ŽŽ’ÆØŸ™œ„$ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘Property–UU²=“Ålast‘¡E‰ff&fŽ‘Ç«modification(DateTime)ޤ ‘²and–UUÅDateTime“²is“a“compGound“term“but“not“aŽ¡‘structure‘UUÅdt/6ŽŽ’㥄$ffŽ’éÒqdomain‘¡E‰ff&fŽ–Ç«error(date‘¡E‰ff&fŽ“time,‘?ýDateTime)ŽŽ’ÆØŸ™œ„$ffŽŽ¦‰ffÇ>|¡Ÿ'™œ„0ffŸØfd‘Property–UU²=“Åsize(E)“²orޤ ‘Ålast‘¡E‰ff&fŽ‘Ç«modification(DateTime)–M­²and“ÅDateTime“²isŽ¡‘a–UUstructure“Ådt/6“²but“an“elemen¸ãt“ÅE“²is“neither“aŽ¡‘v‘ÿqÇariable–UUnor“an“in¸ãtegerŽŽ’㥄0ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ'™œ„0ffŽŽŸ(‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽ¦‰ffÇ>|ŽŽŽ ‘qÅ‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.12Ž‘'†…Åtemporary‘¡E‰ff&fŽ‘Ç«name/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åtemporary‘¡E‰ff&fŽ‘Ç«name(+atom,‘?ý?atom)Ž¡‘øãÄDescriptionŽ©‘øãÅtemporary‘¡E‰ff&fŽ‘Ç«name(Template,‘?ýPathName)–Ó²creates›Óa“unique˜ le“name“ÅPathName˜²whose“pathname˜bGegins“b¸ãyޤ ‘øãÅTemplate².‘Y›ÅTemplate› ϲshould– Ðcon¸ãtain“a“pathname˜with“six“trailing‘0]ÅXÈs².‘YšÅPathName“²is“ÅTemplate“²with˜the“sixŽ¡‘øãÅXÈs‘í ²replaced–with‘~a“letter“and“the“proGcess“idenš¸ãti er.‘^This“predicate“is“an“in˜terface‘~to“the“C‘pUnix“functionŽ¡‘øãÅmktemp(3)².ަ‘øãSee›UUÅabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2˜²for˜information˜abGout˜the˜syn¸ãtax˜of‘rÅTemplate˜²(section˜7.26.1,˜page˜141).ަ‘øãÄErrorsŽŽŸŽŒ‹• 5i Ú‹– ý"EŸüfd‘øã²7.27‘ OpGerating–UUsystem“in¸ãterfaceŽŽŽ’±!€149ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý‚Õw‘øãŸÒ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅTemplate–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Template–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýTemplate)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Template–UU²is“an“atom“but“not“a“v‘ÿqÇalid“pathnameŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýTemplate)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ<¤ù‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.13Ž‘'†…Åtemporary‘¡E‰ff&fŽ‘Ç«file/3ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åtemporary‘¡E‰ff&fŽ‘Ç«file(+atom,–?ý+atom,“?atom)Ž¡‘øãÄDescriptionަ‘øãÅtemporary‘¡E‰ff&fŽ‘Ç«file(Directory,–?ýPrefix,“PathName)–c\²creates“a“unique‘c[ le“name“ÅPathName“²whose“pathnameޤ ‘øãbGegins–‹xbš¸ãy‘¯ÅDirectory/Prefix².‘1If‘R•ÅDirectory‘‹y²is“the“empt˜y›‹yatom“Å''˜²a“standard“tempGorary˜directory“willŽ¡‘øãbšGe–á‚used“(e.g.–NÅ/tmp²).“ÅPrefix–Ⴒcan“b˜e“the“emptš¸ãy“atom“Å''².‘NThis“predicate“is“an“in˜terface“to“the“C‘á^UnixŽ¡‘øãfunction‘UUÅtempnam(3)².ަ‘øãSee›UUÅabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2˜²for˜information˜abGout˜the˜syn¸ãtax˜of‘rÅDirectory˜²(section˜7.26.1,˜page˜141).ަ‘øãÄErrorsŽŸG˜‘øãŸÆLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅDirectory–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Directory–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýDirectory)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Directory–UU²is“an“atom“but“not“a“v‘ÿqÇalid“pathnameŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýDirectory)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Prefix–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Prefix–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPrefix)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘PathName–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPathName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸI _‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.14Ž‘'†…Ådate‘¡E‰ff&fŽ‘Ç«time/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Ådate‘¡E‰ff&fŽ‘Ç«time(?compound)Ž¡‘øãÄDescriptionަ‘øãÅdate‘¡E‰ff&fŽ‘Ç«time(DateTime)–,²uni es›-ÅDateTime“²with“a“compGound˜term“conš¸ãtaining“the“curren˜t‘-date“and“time.ޤ ‘øãÅDateTime–ʲis›Éa“structure˜Ådt(Year,–?ýMonth,“Day,“Hour,“Minute,“Second)².‘¼%Eac•¸ãh‘Êsub-argumen“t˜of‘ÊtheŽ¡‘øãterm–UUÅdt/6“²is“an“in¸ãteger.ŽŽŸŽŒ‹– DÈ Ú‹– ý"EŸüfd‘øã²150ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄErrorsŽŸ4LÌ‘øãŸÙš‰ffÇ>|¤fdŸ™œ„ffŸðfd‘ÅDateTime–UU²is“neither“a“v‘ÿqÇariable“nor“a“compGoundŽŸ ‘termŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(compound,‘?ýDateTime)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘DateTime–UU²is“a“compGound“term“but“not“aŽŸ ‘structure‘UUÅdt/6ŽŽ’㥄ffŽ’éÒqdomain‘¡E‰ff&fŽ–Ç«error(date‘¡E‰ff&fŽ“time,‘?ýDateTime)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘DateTime–*…²is“a“structure‘*„Ådt/6“²and“an“elemen¸ãt“ÅE‘*z²isŽŸ ‘neither–UUa“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸ6>“‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ%¨Ã‘øãÄ7.27.15Ž‘'†…Åhost‘¡E‰ff&fŽ‘Ç«name/1ŽŸuT‘øãÄT‘ÿ «emplatesޤs‘ã Åhost‘¡E‰ff&fŽ‘Ç«name(?atom)Ž¡‘øãÄDescriptionަ‘øãÅhost‘¡E‰ff&fŽ‘Ç«name(HostName)–pϲuni es›pÐÅHostName“²with˜the“name˜of“the˜host“mac¸ãhine˜executing“the˜curren¸ãt“GNUޤ ‘øãProlog–ú$prošGcess.‘`4If‘ú#the“so˜c•¸ãk“ets–ú$are“a¸ãv‘ÿqÇailable“(section“7.28.1,‘#Wpage“157),‘#Xthe‘ú#name“returned“will“b˜e“fullyŽ¡‘øãquali ed.‘IûIn–Ýòthat“case,‘õÒÅhost‘¡E‰ff&fŽ‘Ç«name/1“²will›Ýñalso“succeed“if‘¥ÅHostName“²is“instan¸ãtiated˜to“the˜unquali ed“nameŽ¡‘øã(or–UUan“alias)“of“the“mac¸ãhine.ަ‘øãÄErrorsŽŸ(™‘øãŸåL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅHostname–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýHostName)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ* `‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%¨Ã‘øãÄ7.27.16Ž‘'†…Åos‘¡E‰ff&fŽ‘Ç«version/1ŽŸuT‘øãÄT‘ÿ «emplatesޤs‘ã Åos‘¡E‰ff&fŽ‘Ç«version(?atom)Ž¡‘øãÄDescriptionަ‘øãÅos‘¡E‰ff&fŽ‘Ç«version(OSVersion)–\ì²uni es›\ëÅOSVersion“²with˜the“opGerating˜system“v¸ãersion˜of“the˜mac¸ãhine“executingŽŸ ‘øãthe–UUcurren¸ãt“GNU“Prolog“proGcess.ަ‘øãÄErrorsŽŸ(™‘øãŸåL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅOSVersion–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýOSVersion)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ* `‘øãÄP•®9ortabilit“yŽŽŸŽŒ‹— TT Ú‹– ý"EŸüfd‘øã²7.27‘ OpGerating–UUsystem“in¸ãterfaceŽŽŽ’±!€151ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãGNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.17Ž‘'†…Åarchitecture/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åarchitecture(?atom)Ž¡‘øãÄDescriptionޤ‘øãÅarchitecture(Architecture)–np²uni es“ÅArchitecture“²with“the“name‘noof“the“macš¸ãhine“executing“the“curren˜tŽ© ‘øãGNU–UUProlog“proGcess.Ž¡‘øãÄErrorsŽŸ(™‘øãŸåL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅArchitecture–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýArchitecture)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueަ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“Åerrorަ‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ* `‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.18Ž‘'†…Åshell/2Ä,–ÕTÅshell/1Ä,“Åshell/0ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åshell(+atom,‘?ý?integer)ަ‘ã shell(+atom)ަ‘ã shellŽ¡‘øãÄDescriptionޤ‘øãÅshell(Command,‘?ýStatus)›^O²in•¸ãv“ok“es˜a‘^Pnew˜shell˜(named˜b“y˜the‘^PÅSHELL‘]ɲen“vironmen“t˜v‘ÿqÇariable)˜passingަ‘øãÅCommand–g²for“execution“and“uni es‘gÅStatus“²with“the“result“of“the“execution.‘¦ßIf‘.%ÅCommand“²is“the“empt¸ãyަ‘øãatom–¡˜Å''“²a“new›¡™in•¸ãteractiv“e–¡˜shell“is“executed.‘V‘The“con¸ãtrol“is“returned“to“Prolog˜upGon“termination“of“theަ‘øãcalled‘UUproGcess.Ž¡‘øãÅshell(Command)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åshell(Command,‘?ý0)².Ž¡‘øãÅshell–UU²is“equiv‘ÿqÇalen¸ãt“to“Åshell('',‘?ý0)².Ž¡‘øãÄErrorsŽŸ"LÌ‘øãŸëš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅCommand–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Command–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýCommand)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Status–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýStatus)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ$>“‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŽŸŽŒ‹˜ `e Ú‹– ý"EŸüfd‘øã²152ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.27.19Ž‘'†…Åsystem/2Ä,‘ÕTÅsystem/1ŽŸuT‘øãÄT‘ÿ «emplatesޤí¬‘ã Åsystem(+atom,‘?ý?integer)Ž© ‘ã system(+atom)Ž¡‘øãÄDescriptionޤ‘øãÅsystem(Command,‘?ýStatus)›ÌX²in•¸ãv“ok“es–ÌWa˜new˜default˜shell“passing‘ïåÅCommand˜²for˜execution“and˜uni es˜ÅStatusަ‘øã²with–the›žresult“of“the˜execution.‘[ŠThe“con¸ãtrol“is“returned˜to“Prolog“upGon˜termination“of“the˜shell“proGcess.ަ‘øãThis–UUpredicate“is“an“in¸ãterface“to“the“C“Unix“function“Åsystem(3)².Ž¡‘øãÅsystem(Command)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åsystem(Command,‘?ý0)².Ž¡‘øãÄErrorsŽŸ"LÌ‘øãŸëš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅCommand–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Command–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýCommand)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Status–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýStatus)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ$>“‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ%Œ ‘øãÄ7.27.20Ž‘'†…Åspawn/3Ä,‘ÕTÅspawn/2ŽŸuT‘øãÄT‘ÿ «emplatesޤí¬‘ã Åspawn(+atom,–?ý+atom‘¡E‰ff&fŽ‘Ç«list,“?integer)ަ‘ã spawn(+atom,‘?ý+atom‘¡E‰ff&fŽ‘Ç«list)Ž¡‘øãÄDescriptionޤ‘øãÅspawn(Command,–?ýArguments,“Status)–Fû²executes›FüÅCommand“²passing˜as“argumen¸ãts˜of“the˜command-line“eac¸ãhަ‘øãelemenš¸ãt–½»of“the“list“ÅArguments“²and“uni es“ÅStatus“²with“the“result“of“the“execution.‘??The“con˜trol“is“returnedަ‘øãto–UUProlog“upGon“termination“of“the“command.Ž¡‘øãÅspawn(Command,›?ýArguments)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åspawn(Command,˜Arguments,˜0)².Ž¡‘øãÄErrorsŽŸS˜‘øãŸºLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅCommand–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Command–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýCommand)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Arguments–UU²is“a“partial“list“or“a“list“with“anŽŸ ‘elemen•¸ãt›UUwhic“h˜is˜a˜v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Arguments–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýArguments)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅArguments“²list“is“neither“aŽŸ ‘v‘ÿqÇariable–UUnor“an“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Status–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýStatus)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸU _‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŽŸŽŒ‹™ iÛ Ú‹– ý"EŸüfd‘øã²7.27‘ OpGerating–UUsystem“in¸ãterfaceŽŽŽ’±!€153ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.27.21Ž‘'†…Åpopen/3ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åpopen(+atom,–?ý+io‘¡E‰ff&fŽ‘Ç«mode,“-stream)Ž¡‘øãÄDescriptionŽ©‘øãÅpopen(Command,–?ýMode,“Stream)›î¶²in•¸ãv“ok“es–î·a˜new˜default“shell˜(b¸ãy˜creating“a˜pipGe)˜passing‘DÅCommand˜²forޤ ‘øãexecution–+and›+assoGciates“a˜stream“either“to˜the“standard“input˜or“the“standard˜output“of˜the“createdŽ¡‘øãproGcess.›kif‘oÅMode‘¨q²is–¨pÅread“²(resp.˜Åwrite²)›¨qan“input˜(resp.‘koutput)“stream“is˜created“and“ÅStream˜²is“uni edŽ¡‘øãwith–èthe“stream-term“assoGciated.‘)òW‘ÿ*ªriting“to“the‘è stream“writes“to“the“standard“input“of“the“commandŽ¡‘øãwhile–mreading“from“the“stream“reads“the“command's“standard‘moutput.‘¹The“stream“m¸ãust“bGe“closed“usingŽ¡‘øãÅclose/2–UU²(section“7.10.7,“page“72).‘qÇThis“predicate“is“an“in¸ãterface“to“the“C“Unix“function“Åpopen(3)².ަ‘øãÄErrorsŽŸG˜‘øãŸÆLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅCommand–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Command–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýCommand)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Mode–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Mode–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýMode)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Mode–UU²is“an“atom“but“neither“Åread“²nor“Åwrite².ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(io‘¡E‰ff&fŽ“mode,‘?ýMode)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Stream–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStream)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸI _‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.22Ž‘'†…Åexec/5Ä,‘ÕTÅexec/4ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åexec(+atom,–?ý-stream,“-stream,“-stream,“-integer)Ž¡‘ã exec(+atom,–?ý-stream,“-stream,“-stream)ަ‘øãÄDescriptionŽ©‘øãÅexec(Command,–?ýStreamIn,“StreamOut,“StreamErr,“Pid)›òª²in•¸ãv“ok“es–ò©a˜new˜default˜shell“passing‘7ÅCommandŽ¡‘øã²for–DÊexecution“and“assošGciates“streams‘DÉto“standard“streams“of“the“created“pro˜cess.‘@%ÅStreamIn“²is“uni edŽ¡‘øãwith–æthe“stream-term“assoGciated›åwith“the“standard“input“stream“of‘ÐÅCommand“²(it˜is“an“output“stream).Ž¡‘øãÅStreamOut–Ù̲is“uni ed“with“the“stream-term“assoGciated“with“the“standard“output“stream“of‘ éÅCommand“²(itŽ¡‘øãis–Éinformation“is›¬?only“useful“if“it“is“necessary˜to“obtain“the“status“of“the˜execution“using‘ÏËÅwait/2Ž¡‘øã²(section–¶ 7.27.25,‘Î5page›¶155).‘“âUn¸ãtil“a˜call“to˜Åwait/2“²is˜done“the˜proGcess“remains˜in“the˜system“proGcessesŽ¡‘øãtable–”Õ(as›”Öa“zom¸ãbie˜proGcess“if˜terminated).‘0HF‘ÿ*ªor˜this“reason,‘¤¶if“the˜status“is˜not“needed˜it“is˜preferable“toŽ¡‘øãuse‘UUÅexec/4².ަ‘øãÅexec/4–á²is›á~similar“to˜Åexec/5“²but˜the“proGcess˜is“remo•¸ãv“ed–áfrom˜system“proGcesses˜as“soGon˜as“it˜is“terminated.ަ‘øãÄErrorsŽŽŸŽŒ‹š w§ Ú‹– ý"EŸüfd‘øã²154ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý;Ý‘øãŸÆLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅCommand–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Command–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýCommand)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘StreamIn–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStreamIn)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘StreamOut–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStreamOut)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘StreamErr–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStreamErr)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Pid–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýPid)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸI _‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.27.23Ž‘'†…Åfork‘¡E‰ff&fŽ‘Ç«prolog/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åfork‘¡E‰ff&fŽ‘Ç«prolog(-integer)Ž¡‘øãÄDescriptionަ‘øãÅfork‘¡E‰ff&fŽ‘Ç«prolog(Pid)–m²creates›na“c¸ãhild˜proGcess“that“di ers˜from“the“paren¸ãt˜proGcess“only˜in“its“PID.˜In“theޤ ‘øãparenš¸ãt–A proGcess“ÅPid‘A ²is“uni ed“with“the“PID‘@Ðof“the“c˜hild‘A while“in“the“c˜hild“proGcess“ÅPid‘A ²is“uni ed“withŽ¡‘øã0.‘E2In››Ïthe–›Îparen¸ãt“proGcess,‘­lthe“status˜of“the“c¸ãhild“prošGcess“can“b˜e“on¸ãtained‘›Ïusing‘¿[Åwait/2“²(section“7.27.25,Ž¡‘øãpage–±]155).‘…ÝUn¸ãtil“a›±\call“to“Åwait/2˜²is“done˜the“c¸ãhild˜proGcess“remains“in˜the“system˜proGcesses“table˜(as“aŽ¡‘øãzomš¸ãbie–UUproGcess“if“terminated).‘qÇThis“predicate“is“an“in˜terface“to“the“C“Unix“function“Åfork(2)².ަ‘øãÄErrorsŽŸ(™‘øãŸåL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPid–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýPid)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ* `‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.24Ž‘'†…Åcreate‘¡E‰ff&fŽ‘Ç«pipe/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åcreate‘¡E‰ff&fŽ‘Ç«pipe(-stream,‘?ý-stream)Ž¡‘øãÄDescriptionަ‘øãÅcreate‘¡E‰ff&fŽ‘Ç«pipe(StreamIn,‘?ýStreamOut)– “²creates“a“pair“of“streams“pšGoin¸ãting‘ ”to“a“pip˜e“ino˜de.‘—ÅStreamIn“²isޤ ‘øãuni ed–Ñäwith›Ñåthe“stream-term“assoGciated˜with“the“input˜side“of˜the“pipGe“and˜ÅStreamOut“²is“uni ed˜with“theŽ¡‘øãstream-term–(’assoGciated›(“with“output“side.‘bÜThis“predicate“is“an˜in¸ãterface“to“the˜C‘(†Unix˜function“Åpipe(2)².ަ‘øãÄErrorsŽŽŸŽŒ‹› ‡: Ú‹– ý"EŸüfd‘øã²7.27‘ OpGerating–UUsystem“in¸ãterfaceŽŽŽ’±!€155ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ývo‘øãŸßš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅStreamIn–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStreamIn)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘StreamOut–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStreamOut)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ0>“‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.25Ž‘'†…Åwait/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åwait(+integer,‘?ý?integer)Ž¡‘øãÄDescriptionަ‘øãÅwait(Pid,‘?ýStatus)–~•²wš¸ãaits‘~–for“the“c˜hild‘~–proGcess“whose“iden˜ti er›~–is“ÅPid“²to“terminate.‘íˆÅStatus˜²is“thenŽŸ ‘øãuni ed–UUwith“the“exit“status.‘qÇThis“predicate“is“an“in¸ãterface“to“the“C“Unix“function“Åwaitpid(2)².ަ‘øãÄErrorsŽŸ4ÿ‘øãŸØæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPid–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Pid–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýPid)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Status–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýStatus)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ6qÆ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.26Ž‘'†…Åprolog‘¡E‰ff&fŽ‘Ç«pid/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ¡‘ã Åprolog‘¡E‰ff&fŽ‘Ç«pid(?integer)Ž¡‘øãÄDescriptionަ‘øãÅprolog‘¡E‰ff&fŽ‘Ç«pid(Pid)–UU²uni es“ÅPid“²with“the“proGcess“idenš¸ãti er“of“the“curren˜t“GNU“Prolog“proGcess.ަ‘øãÄErrorsަ‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅPid–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýPid)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¦‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŽŸŽŒ‹œ •) Ú‹– ý"EŸüfd‘øã²156ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.27.27Ž‘'†…Åsend‘¡E‰ff&fŽ‘Ç«signal/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åsend‘¡E‰ff&fŽ‘Ç«signal(+integer,‘?ý+integer)Ž© ‘ã send‘¡E‰ff&fŽ‘Ç«signal(+integer,‘?ý+atom)Ž¡‘øãÄDescriptionޤ‘øãÅsend‘¡E‰ff&fŽ‘Ç«signal(Pid,‘?ýSignal)–”ž²sends›”ŸÅSignal“²to“the“proGcess˜whose“iden¸ãti er“is˜ÅPid.‘1ŠSignal“²can˜bšGe“sp˜eci edަ‘øãdirectly–èžas›èan“in¸ãteger˜or“sym¸ãbGolically“as˜an“atom.‘MŠAllo•¸ãw“ed–èžatoms˜depGend“on“the˜mac¸ãhine“(e.g.‘MŠÅ'SIGINT'²,ަ‘øãÅ'SIGQUIT'²,›SïÅ'SIGKILL'²,‘SðÅ'SIGUSR1'²,‘T6Å'SIGUSR2'²,‘T7Å'SIGALRM'²,.–ªª.“.“).‘qPThis˜predicate–Sðis˜an˜in¸ãterface˜to“the˜Cަ‘øãUnix–UUfunction“Åkill(2)².Ž¡‘øãÄErrorsŽŸ@³2‘øãŸÌ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPid–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Pid–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýPid)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Signal–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Signal–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãteger“or“anŽŸ ‘atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýSignal)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸB¤ù‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.28Ž‘'†…Åsleep/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åsleep(+number)Ž¡‘øãÄDescriptionޤ‘øãÅsleep(Seconds)–K‘²puts“the›K’GNU‘KŽProlog“proGcess˜to“sleep“for“ÅSecond²s“seconds.‘n†ÅSeconds“²can˜bGe“an“in¸ãtegerަ‘øãor–Á+a›Á* oating“pGoin•¸ãt˜n“um“bGer‘Á+(in˜whic“h–Á+case˜it“can“bGe˜µ<“²1).‘µGThis“predicate˜is“an“in¸ãterface˜to“the˜C‘ÁUnixަ‘øãfunction‘UUÅusleep(3)².Ž¡‘øãÄErrorsŽŸ"LÌ‘øãŸëš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSeconds–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Seconds–UU²is“neither“a“v‘ÿqÇariable“nor“a“n•¸ãum“bGerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(number,‘?ýSeconds)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Seconds–UU²is“a“n•¸ãum“bGer–UUµ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýSeconds)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ$>“‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.27.29Ž‘'†…Åselect/5ŽŸuT‘øãÄT‘ÿ «emplatesŽŽŸŽŒ‹ Ÿþ Ú‹– ý"EŸüfd‘øã²7.28‘ SoGc•¸ãk“ets‘UUinput/outputŽŽŽ’±!€157ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Åselect(+list,–?ý?list,“+list,“?list,“+number)ŽŸ‘øãÄDescriptionŽ©‘øãÅselect(Reads,–?ýReadyReads,“Writes,“ReadyWrites,“TimeOut)–XŲwš¸ãaits‘XÆfor“a“n˜um˜bGer“of‘XÆstreams“(or“ leޤ ‘øãdescriptors)–úto“cš¸ãhange–ústatus.‘ _òÅReadyReads“²is–úuni ed“with“the‘úlist“of“elemen˜ts“listed‘úin“ÅReads“²thatŽ¡‘øãha•¸ãv“e›æ c“haracters˜a“v‘ÿqÇailable–æfor˜reading.‘ $'Similarly‘ ­ÅReadyWrites˜²is˜uni ed“with˜the˜list˜of“elemen¸ãts˜ofŽ¡‘øãÅWrites–¯.²that“are›¯/ok“for“immediate“writing.‘SThe“elemen¸ãts˜of‘vKÅReads“²and“ÅWrites˜²are“either“stream-termsŽ¡‘øãor–÷aliases›öor“in¸ãtegers“considered“as˜ le“descriptors,‘ e.g.‘Výfor˜soGc•¸ãk“ets–÷(section“7.28,‘ page“157).‘VýStreams“thatŽ¡‘øãm¸ãust–ÞœbšGe“tested“with“Åselect/5“²should“not“b˜e“bu ered.‘ œThis“can“b˜e“done“at“the“op˜ening“using‘)Åopen/4Ž¡‘øã²(section–‚˜7.10.6,›èpage“70)“or“later“using‘¦%Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“buffering/2–‚˜²(section“7.10.27,˜page“82).‘ùÅTimeOut“²isŽ¡‘øãan–Ø—uppšGer“b˜ound›Ø–on“the“amoun¸ãt“of“time“(in˜milliseconds)“elapsed“bGefore“Åselect/5“²returns.‘ûŒIf‘Ÿ´ÅTimeOutŽ¡‘øã¸–E²0›EÃ(no“timeout)˜Åselect/5“²w•¸ãaits˜un“til–EÂsomething˜is“a¸ãv‘ÿqÇailable˜(either“or˜reading“or˜for“writing)˜and“th¸ãusŽ¡‘øãcan–UUbloGcš¸ãk“inde nitely‘ÿ*ª.‘qÇThis“predicate“is“an“in˜terface“to“the“C“Unix“function“Åselect(2)².ަ‘øãÄErrorsŽ ¢ý‘øã ÿjæi‰ffÇ>|©fdŸ™œ„ffŸðfd‘ÅReads–UU²(or“ÅWrites²)“is“a“partial“list“or“a“list“withŽ¡‘an–UUelemenš¸ãt“ÅE“²whic˜h“is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘Reads–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýReads)ŽŽ’ÆØŸ™œ„ ffŽŽ¤‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘Writes–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýWrites)ŽŽ’ÆØŸ™œ„ ffŽŽ¡‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘ReadyReads–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýReadyReads)ŽŽ’ÆØŸ™œ„ ffŽŽ¡‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘ReadyWrites–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýReadyWrites)ŽŽ’ÆØŸ™œ„ ffŽŽ¡‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅReads“²(or“ÅWrites²)“list“isŽŸ ‘neither–UUa“stream-term“or“alias“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(stream‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“alias,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¤‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅReads“²(or“ÅWrites²)“list“is“notŽŸ ‘a–UUselectable“itemŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(selectable‘¡E‰ff&fŽ“item,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¡‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅReads“²(or“ÅWrites²)“list“is“anŽŸ ‘in¸ãteger–UUµ<“²0ŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¡‰ffÇ>|¦Ÿ™œ„$ffŸäfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅReads“²(or“ÅWrites²)“list“is“aޤ ‘stream-tern–UUor“alias“not“assošGciated“with“an“op˜enŽ¡‘streamŽŽ’㥄$ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(stream,‘?ýE)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅReads“²list“is“assoGciated“withŽŸ ‘an–UUoutput“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(input,–?ýstream,“E)ŽŽ’ÆØŸ™œ„ffŽŽ¡‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–%Åelemen¸ãt“ÅE‘%¸²of“the“ÅWrites“²list‘%Äis“assoGciated“withŽŸ ‘an–UUinput“streamŽŽ’㥄ffŽ’éÒqÅpermission‘¡E‰ff&fŽ‘Ç«error(output,–?ýstream,“E)ŽŽ’ÆØŸ™œ„ffŽŽ¡‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘TimeOut–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¤‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘TimeOut–UU²is“neither“a“v‘ÿqÇariable“nor“a“n•¸ãum“bGerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(number,‘?ýTimeOut)ŽŽ’ÆØŸ™œ„ ffŽŽ¡‰ffÇ>|¦Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽ ¤qÄ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ'þ6‘øãÇ7.28Ž‘cSo`c• k“ets‘€input/outputޤuT‘øãÄ7.28.1Ž‘!ƇIn®9troQÇductionŽ¡‘øã²This–±yset›±xof“predicates“pro¸ãvides˜a“w•¸ãa“y–±yto˜manipulate“soGc•¸ãk“ets.‘;(The–±ypredicates“are˜straigh•¸ãtforw“ard‘±yin“terfacesޤ ‘øãto–;öthe“correspšGonding“BSD-t¸ãyp˜e“so˜c•¸ãk“et‘;÷functions.‘ýThis›;öfacilit“y˜is˜a“v‘ÿqÇailable˜if‘;÷the˜soGc“k“ets˜part˜of˜GNU‘;¯PrologŽ¡‘øãhas–Ò“bGeen“installed.‘é€A›Òsreader“familiar“with‘Ò’BSD˜soGc•¸ãk“ets–Ò“will“understand‘Ò’them“immediately“otherwise“aŽ¡‘øãstudy–UUof“soGc•¸ãk“ets–UUis“needed.ŽŽŸŽŒ‹ž ¬+ Ú‹– ý"EŸüfd‘øã²158ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãThe–û’domain“is“either“the›û‘atom“Å'AF‘¡E‰ff&fŽ–Ç«INET'‘û|²or˜Å'AF‘¡E‰ff&fŽ“UNIX'‘û|²correspGonding–û’to˜the“same“domains“in“BSD-t¸ãypGeޤ ‘øãsoGc•¸ãk“ets.Ž©‘øãAn–>laddress“is›>keither“of“the“form“Å'AF‘¡E‰ff&fŽ‘Ç«INET'(HostName,‘?ýPort)˜²or“Å'AF‘¡E‰ff&fŽ‘Ç«UNIX'(SocketName)².‘j$ÅHostName“²isŽ¡‘øãan–ï_atom›ï`denoting“a˜mac¸ãhine“name,‘ÄÅPort˜²is“a˜pšGort“n•¸ãum“b˜er–ï`and›ï_ÅSocketName“²is˜an“atom˜denoting“a˜soGc•¸ãk“et.ަ‘øãBy–”default,‘Ustreams‘•assošGciated“with“so˜c•¸ãk“ets–•are›”Åblock“²bu ered.‘UÜThe“predicate˜Åset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“buffering/2Ž¡‘øã²(section–v-7.10.27,‘~bpage›v,82)“can˜bGe“used˜to“c¸ãhange˜this“moGde.‘ÔMThey“are˜also“text˜streams“b¸ãy˜default.‘ÔNUseŽ¡‘øãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“type/2–UU²(section“7.10.25,“page“81)“to“cš¸ãhange“the“t˜ypGe“if“binary“streams“are“needed.ŽŸ%þ6‘øãÄ7.28.2Ž‘!ƇÅsocket/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åsocket(+socket‘¡E‰ff&fŽ‘Ç«domain,‘?ý-integer)Ž¡‘øãÄDescriptionަ‘øãÅsocket(Domain,‘?ýSocket)–b²creates“a“soGc•¸ãk“et–bwhose“domain“is‘bÅDomain“²(section“7.28,‘eOpage“157)“and“uni esޤ ‘øãÅSocket–n"²with“the‘n!descriptor“idenš¸ãtifying“the“soGc˜k˜et.‘¼-This“predicate“is“an‘n!in˜terface“to“the“C‘nUnix“functionŽ¡‘øãÅsocket(2)².ަ‘øãÄErrorsŽŸ:³2‘øãŸÒ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅDomain–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Domain–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýDomain)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Domain–O£²is›O¢an“atom“but˜not“a“v‘ÿqÇalid˜soGc•¸ãk“et‘O£domainŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(socket‘¡E‰ff&fŽ“domain,‘?ýDomain)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Socket–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýSocket)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ<¤ù‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.28.3Ž‘!ƇÅsocket‘¡E‰ff&fŽ‘Ç«close/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åsocket‘¡E‰ff&fŽ‘Ç«close(+integer)Ž¡‘øãÄDescriptionަ‘øãÅsocket‘¡E‰ff&fŽ‘Ç«close(Socket)–Gë²closes“the“sošGc•¸ãk“et–Gëwhose“descriptor“is“ÅSocket².‘mNThis“predicate“should“not“b˜e“usedޤ ‘øãif‘6|ÅSocket›o^²has–o_giv¸ãen“rise˜to“a“stream,‘uáe.g.‘¿äb¸ãy‘’ìÅsocket‘¡E‰ff&fŽ‘Ç«connect/4˜²(section“7.28.5,‘uápage“159).‘¿äIn˜that“caseŽ¡‘øãsimply–UUuse“Åclose/2“²(section“7.10.7,“page“72)“on“the“assoGciated“stream.ަ‘øãÄErrorsŽŸ.LÌ‘øãŸßš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSocket–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Socket–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýSocket)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŽŸŽŒ‹Ÿ Á^ Ú‹– ý"EŸüfd‘øã²7.28‘ SoGc•¸ãk“ets‘UUinput/outputŽŽŽ’±!€159ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.28.4Ž‘!ƇÅsocket‘¡E‰ff&fŽ‘Ç«bind/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åsocket‘¡E‰ff&fŽ–Ç«bind(+integer,‘?ý+socket‘¡E‰ff&fŽ“address)Ž¡‘øãÄDescriptionަ‘øãÅsocket‘¡E‰ff&fŽ‘Ç«bind(Socket,‘?ýAddress)–(‘²binds›(the“soGc•¸ãk“et˜whose–(‘descriptor˜is“ÅSocket˜²to“the˜address“spGeci edޤ ‘øãb¸ãy‘±ªÅAddress–޲(section›Ž7.28,‘ÜOpage“157).‘If‘U;ÅAddress“²if“of“the“form˜Å'AF‘¡E‰ff&fŽ‘Ç«INET'(HostName,‘?ýPort)“²and“ifŽ¡‘øãÅHostName–w ²is›wuninstan¸ãtiated“then˜it“is˜uni ed“with˜the“curren•¸ãt˜mac“hine–w name.‘×&If‘>=ÅPort˜²is“uninstan¸ãtiated,Ž¡‘øãit–ëšis›ë™uni ed“to“a˜pšGort“n•¸ãum“b˜er›ëšpic“k“ed‘ë™b“y˜the˜opGerating–ë™system.‘4•This˜predicate˜is“an˜in¸ãterface˜to“the˜CŽ¡‘øãUnix–UUfunction“Åbind(2)².ަ‘øãÄErrorsŽŸeþ‘øãŸ§æh‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSocket–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Socket–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýSocket)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Address–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Address–UU²is“neither“a“v›ÿqÇariable“nor“a“v˜alid“addressŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(socket‘¡E‰ff&fŽ“address,‘?ýAddress)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Address–UU²=“Å'AF‘¡E‰ff&fŽ‘Ç«UNIX'(E)“²and“ÅE“²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Address–UU²=“Å'AF‘¡E‰ff&fŽ›Ç«UNIX'(E)“²or“Å'AF‘¡E‰ff&fŽ˜INET'(E,‘áB‰ff&fŽ‘ ¨)ŽŸ ‘²and–UUÅE“²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Address–UU²=“Å'AF‘¡E‰ff&fŽ‘Ç«UNIX'(E)“²and“ÅE“²is“an“atom“butŽŸ ‘not–UUa“v‘ÿqÇalid“pathnameŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Address–UU²=“Å'AF‘¡E‰ff&fŽ–Ç«INET'(‘¡E‰ff&fŽ“,‘?ýE)–UU²and“ÅE“²is“neither“aŽŸ ‘v‘ÿqÇariable–UUnor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸgqÅ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.28.5Ž‘!ƇÅsocket‘¡E‰ff&fŽ‘Ç«connect/4ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åsocket‘¡E‰ff&fŽ–Ç«connect(+integer,›?ý+socket‘¡E‰ff&fŽ“address,˜-stream,˜-stream)Ž¡‘øãÄDescriptionަ‘øãÅsocket‘¡E‰ff&fŽ‘Ç«connect(Socket,–?ýAddress,“StreamIn,“StreamOut)–êi²connects“the‘êjsoGc•¸ãk“et–êiwhose“descriptor“isޤ ‘øãÅSocket–4Ѳto“the“address“spGeci ed“b¸ãy‘X^ÅAddress“²(section“7.28,‘;Rpage“157).‘fðÅStreamIn“²is“uni ed“with“a“stream-Ž¡‘øãterm–ˆ˜assoGciated“with›ˆ™the“input“of“the˜connection“(it“is“an“input˜stream).‘ Reading˜from“this“streamŽ¡‘øãgets–ðndata“from›ðmthe“soGc•¸ãk“et.‘ CÅStreamOut–ðn²is“uni ed“with˜a“stream-term“assoGciated“with˜the“output“ofŽ¡‘øãthe–2connection›1(it“is“an˜output“stream).‘·]W‘ÿ*ªriting“to“this˜stream“sends“data˜to“the“soGc•¸ãk“et.‘·]The˜use‘2ofŽ¡‘øãÅselect/5–“²can›”bGe“useful˜(section“7.27.29,‘»page“156).‘VÜThis˜predicate“is˜an“in¸ãterface˜to“the“C‘€Unix“functionŽ¡‘øãÅconnect(2)².ŽŽŸŽŒ‹  е Ú‹– ý"EŸüfd‘øã²160ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄErrorsŽŸwæd‘øãŸ•€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSocket–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Socket–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýSocket)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Address–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Address–UU²is“neither“a“v›ÿqÇariable“nor“a“v˜alid“addressŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(socket‘¡E‰ff&fŽ“address,‘?ýAddress)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Address‘†²=–…Å'AF‘¡E‰ff&fŽ›Ç«UNIX'(E)‘u²or“Å'AF‘¡E‰ff&fŽ˜INET'(E,‘áB‰ff&fŽ‘ ¨)‘†²orŽŸ ‘ÅAddress–UU²=“Å'AF‘¡E‰ff&fŽ–Ç«INET'(‘¡E‰ff&fŽ“,‘?ýE)–UU²and“ÅE“²is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Address–UU²=“Å'AF‘¡E‰ff&fŽ›Ç«UNIX'(E)“²or“Å'AF‘¡E‰ff&fŽ˜INET'(E,‘áB‰ff&fŽ‘ ¨)ŽŸ ‘²and–UUÅE“²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Address–UU²=“Å'AF‘¡E‰ff&fŽ‘Ç«UNIX'(E)“²and“ÅE“²is“an“atom“butŽŸ ‘not–UUa“v‘ÿqÇalid“pathnameŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(os‘¡E‰ff&fŽ“path,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Address–UU²=“Å'AF‘¡E‰ff&fŽ–Ç«INET'(‘¡E‰ff&fŽ“,‘?ýE)–UU²and“ÅE“²is“neither“aŽŸ ‘v‘ÿqÇariable–UUnor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘StreamIn–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStreamIn)ŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘StreamOut–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStreamOut)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸyØ+‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.28.6Ž‘!ƇÅsocket‘¡E‰ff&fŽ‘Ç«listen/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åsocket‘¡E‰ff&fŽ‘Ç«listen(+integer,‘?ý+integer)Ž¡‘øãÄDescriptionަ‘øãÅsocket‘¡E‰ff&fŽ‘Ç«listen(Socket,‘?ýLength)–Dzde nes“the“soGc•¸ãk“et–Çwhose“descriptor‘Æis“ÅSocket“²to“ha•¸ãv“e–Ça“maxim¸ãumޤ ‘øãbac¸ãklog–OÐqueue“of‘íÅLength›OѲpGending“connections.‘a8This“predicate˜is“an“in¸ãterface“to“the“C‘OUnix“functionŽ¡‘øãÅlisten(2)².ަ‘øãÄErrorsŽŸ:³2‘øãŸÒ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSocket–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Socket–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýSocket)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Length–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Length–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýLength)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸ<¤ù‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.28.7Ž‘!ƇÅsocket‘¡E‰ff&fŽ–Ç«accept/4Ä,‘ÕTÅsocket‘¡E‰ff&fŽ“accept/3ŽŸuT‘øãÄT‘ÿ «emplatesŽŽŸŽŒ‹¡ àæ Ú‹– ý"EŸüfd‘øã²7.28‘ SoGc•¸ãk“ets‘UUinput/outputŽŽŽ’±!€161ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Åsocket‘¡E‰ff&fŽ‘Ç«accept(+integer,–?ý-atom,“-stream,“-stream)ޤ ‘ã socket‘¡E‰ff&fŽ‘Ç«accept(+integer,–?ý-stream,“-stream)ŽŸ‘øãÄDescriptionŽ©‘øãÅsocket‘¡E‰ff&fŽ‘Ç«accept(Socket,–?ýClient,“StreamIn,“StreamOut)–”²extracts›”the“ rst˜connection“to˜the“soGc•¸ãk“etŽ¡‘øãwhose–yˆdescriptor›y‰is“ÅSocket².‘ÞaIf“the“domain“is˜Å'AF‘¡E‰ff&fŽ‘Ç«INET'²,“ÅClient“²is“uni ed˜with“an“atom“whose˜name“isŽ¡‘øãthe–€×Inš¸ãternet“host“address“in“n˜um˜bGers-and-dots“notation“of“the“connecting“mac˜hine.‘ôMÅStreamIn“²is“uni edŽ¡‘øãwith–ÀTa“stream-term“assoGciated“with“the“input“of“the“connection“(it“is“an“input“stream).‘@Reading“from“thisŽ¡‘øãstream–­gets“data“from“the“sošGc•¸ãk“et.‘yÅStreamOut–­²is“uni ed“with“a“stream-term“asso˜ciated“with“the“outputŽ¡‘øãof–the›connection“(it˜is“an˜output“stream).‘!ÉW‘ÿ*ªriting˜to“this˜stream“sends˜data“to“the˜soGc•¸ãk“et.‘!ÉThe˜use‘ofŽ¡‘øãÅselect/5–“²can›”bGe“useful˜(section“7.27.29,‘»page“156).‘VÜThis˜predicate“is˜an“in¸ãterface˜to“the“C‘€Unix“functionŽ¡‘øãÅaccept(2)².ަ‘øãÅsocket‘¡E‰ff&fŽ›Ç«accept(Socket,–?ýStreamIn,“StreamOut)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åsocket‘¡E‰ff&fŽ˜accept(Socket,‘áB‰ff&fŽ‘ ¨,Ž¡‘øãStreamIn,‘?ýStreamOut)².ަ‘øãÄErrorsŽŸ@æe‘øãŸÌ€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅSocket–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Socket–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýSocket)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Client–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýClient)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘StreamIn–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStreamIn)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘StreamOut–UU²is“not“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(variable,‘?ýStreamOut)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„$ffŸäfd‘²an–UUopšGerating“system“error“o˜ccurs“and“the“v‘ÿqÇalueޤ ‘of–UUthe“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄$ffŽ’éÒqÅsystem‘¡E‰ff&fŽ‘Ç«error(Éatom–?ýexplaining“the“error‘¼rÅ)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|ŽŽŽŸBØ,‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ7.28.8Ž‘!ƇÅhostname‘¡E‰ff&fŽ‘Ç«address/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åhostname‘¡E‰ff&fŽ‘Ç«address(+atom,‘?ý?atom)Ž¡‘ã hostname‘¡E‰ff&fŽ‘Ç«address(?atom,‘?ý+atom)ަ‘øãÄDescriptionŽ©‘øãÅhostname‘¡E‰ff&fŽ‘Ç«address(HostName,‘?ýHostAddress)–å²succeeds“if“the“Inš¸ãternet“host“address“in“n˜um˜bGers-and-dotsŽ¡‘øãnotation–Îbof‘•~ÅHostName“²is“ÅHostAddress².‘DËÅHostname“²can›ÎabGe“giv¸ãen“as˜a“fully“quali ed˜name,‘é`or˜an“unquali edŽ¡‘øãname–”äor“an›”åalias“of“the“mac¸ãhine.‘0uThe“predicate“will“fail˜if“the“mac¸ãhine“name“or˜address“cannot“bGeŽ¡‘øãresolv¸ãed.ަ‘øãÄErrorsŽŸ(ÿ‘øãŸäæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅHostName–UU²and“ÅHostAddress“²are“v‘ÿqÇariablesŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘HostName–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýHostName)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘HostAddress–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýHostAddress)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Address–UU²is“neither“a“v›ÿqÇariable“nor“a“v˜alid“addressŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(socket‘¡E‰ff&fŽ“address,‘?ýAddress)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ*qÆ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŽŸŽŒ‹¢ òK Ú‹– ý"EŸüfd‘øã²162ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÇ7.29Ž‘cLinedit‘€managemen tޤuT‘øã²The–UUfolloš¸ãwing“predicates“are“only“a˜v‘ÿqÇailable“if“the“Ålinedit“²part“of“GNU“Prolog“has“bGeen“installed.ŽŸ%Ô‘øãÄ7.29.1Ž‘!ƇÅget‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“prompt/1Ž¡‘øãÄT‘ÿ «emplatesŽŸ;è‘ã Åget‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“prompt(?atom)Ž©;鑸ãÄDescriptionޤ‘øãÅget‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“prompt(Prompt)›Åݲsucceeds–ÅÞif‘ŒúÅPrompt“²is˜the˜curren¸ãt“Ålinedit˜²prompt,‘!ÿe.g.‘Ãathe˜top-lev¸ãelŽŸ ‘øãprompt–UUis“Å'|‘?ý?-'².‘qÇBy“default“all“other“reads“ha•¸ãv“e–UUan“empt¸ãy“prompt.Ž¡‘øãÄErrorsŽ¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅPrompt–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPred)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%Óÿ‘øãÄ7.29.2Ž‘!ƇÅset‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“prompt/1ŽŸuT‘øãÄT‘ÿ «emplatesަ‘ã Åset‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“prompt(+atom)Ž©;è‘øãÄDescriptionŽ¡‘øãÅset‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“prompt(Prompt)–[g²sets“the›[hcurren¸ãt“Ålinedit“²prompt“to˜ÅPrompt².‘xThis“prompt˜will“bGe“displa•¸ãy“edŽŸ ‘øãfor–UUreads“from“a“terminal“(except“for“top-lev¸ãel“reads).Ž¡‘øãÄErrorsŽŸ™‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPrompt–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Prompt–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPred)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%Ô‘øãÄ7.29.3Ž‘!ƇÅadd‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“completion/1ŽŸuT‘øãÄT‘ÿ «emplatesަ‘ã Åadd‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“completion(+atom)ŽŸ;鑸ãÄDescriptionŽ¡‘øãÅadd‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“completion(Word)–â²adds›áÅWord“²in“the˜list“of“completion˜wš¸ãords“main˜tained“b˜y‘=nÅlinedit“²(sec-ޤ ‘øãtion–*)3.2.5,‘_^page“18).‘ðDOnly“wš¸ãords“con˜taining‘**letters,‘_^digits“and“the“underscore“c˜haracter‘**are“added“(ifŽ¡‘øãÅWord–UU²došGes“not“resp˜ect“this“restriction“the“predicate“fails).ŽŽŸŽŒ‹£ ΠÚ‹– ý"EŸüfd‘øã²7.30‘ Source–UUreader“facilit¸ãyŽŽŽ’±!€163ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄErrorsŽŸ™‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅWord–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Word–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýWord)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ7.29.4Ž‘!ƇÅfind‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“completion/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åfind‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“completion(+atom,‘?ý?atom)Ž¡‘øãÄDescriptionަ‘øãÅfind‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“completion(Prefix,‘?ýWord)–²succeeds“if‘È4ÅWord“²is“a“wš¸ãord“bGeginning“b˜y‘$¤ÅPrefix“²and“bGelongsޤ ‘øãto–.«the›.¬list“of“completion“w•¸ãords˜main“tained›.«b“y‘R8Ålinedit˜²(section–.¬3.2.5,‘epage˜18).‘ýÊThis˜predicate“is˜re-Ž¡‘øãexecutable–UUon“bac•¸ãktrac“king.ަ‘øãÄErrorsŽŸ"LÌ‘øãŸëš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅPrefix–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Prefix–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýPrefix)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Word–UU²is“neither“a“v‘ÿqÇariable“nor“an“atomŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(atom,‘?ýWord)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ$>“‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ'þ6‘øãÇ7.30Ž‘cSource–€reader“facilit yޤuT‘øãÄ7.30.1Ž‘!ƇIn®9troQÇductionŽ¡‘øã²T‘ÿ*ªo–UUbGe“written...ŽŽŸŽŒ‹¤  Ú‹– ý"EŸüfd‘øã²164ŽŽŽ’ó87‘ PR¸ãOLOG–UUBUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ7.30.2Ž‘!ƇÅsr‘¡E‰ff&fŽ‘Ç«open/3ޤuT‘øãÄ7.30.3Ž‘!ƇÅsr‘¡E‰ff&fŽ–Ç«change‘¡E‰ff&fŽ“options/2Ž¡‘øãÄ7.30.4Ž‘!ƇÅsr‘¡E‰ff&fŽ‘Ç«close/1Ž¡‘øãÄ7.30.5Ž‘!ƇÅsr‘¡E‰ff&fŽ–Ç«read‘¡E‰ff&fŽ“term/4Ž¡‘øãÄ7.30.6Ž‘!ƇÅsr‘¡E‰ff&fŽ–Ç«current‘¡E‰ff&fŽ“descriptor/1Ž¡‘øãÄ7.30.7Ž‘!ƇÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“stream/2Ž¡‘øãÄ7.30.8Ž‘!ƇÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“module/3Ž¡‘øãÄ7.30.9Ž‘!ƇÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“file‘¡E‰ff&fŽ“name/2Ž¡‘øãÄ7.30.10Ž‘'†…Åsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“position/3Ž¡‘øãÄ7.30.11Ž‘'†…Åsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“include‘¡E‰ff&fŽ“list/2Ž¡‘øãÄ7.30.12Ž‘'†…Åsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“include‘¡E‰ff&fŽ“stream‘¡E‰ff&fŽ“list/2Ž¡‘øãÄ7.30.13Ž‘'†…Åsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“size‘¡E‰ff&fŽ“counters/3Ž¡‘øãÄ7.30.14Ž‘'†…Åsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“error‘¡E‰ff&fŽ“counters/3Ž¡‘øãÄ7.30.15Ž‘'†…Åsr‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“error‘¡E‰ff&fŽ“counters/3Ž¡‘øãÄ7.30.16Ž‘'†…Åsr‘¡E‰ff&fŽ–Ç«error‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“exception/2Ž¡‘øãÄ7.30.17Ž‘'†…Åsr‘¡E‰ff&fŽ–Ç«write‘¡E‰ff&fŽ“message/8Ä,›ÕTÅsr‘¡E‰ff&fŽ“write‘¡E‰ff&fŽ“message/6Ä,˜Åsr‘¡E‰ff&fŽ“write‘¡E‰ff&fŽ“message/4Ž¡‘øãÄ7.30.18Ž‘'†…Åsr‘¡E‰ff&fŽ–Ç«write‘¡E‰ff&fŽ“error/6Ä,›ÕTÅsr‘¡E‰ff&fŽ“write‘¡E‰ff&fŽ“error/4Ä,˜Åsr‘¡E‰ff&fŽ“write‘¡E‰ff&fŽ“error/2ŽŽŸŽŒ‹¥ Õ Ú‹– ý"EŸüfd’±!€²165ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øã¼8Ž‘/ÒFinite–ffdomain“solvŒÌer“and“built-in“predicatesŽŸ#ç‘øãÇ8.1Ž‘£In tro`ductionŽ©uT‘øã²The–\X nite“domain“(FD)‘\constrainš¸ãt“solv˜er“extends“Prolog‘\Ywith“constrain˜ts“o˜v˜er“FD.“This“facilit˜y“is“a˜v‘ÿqÇailableޤ ‘øãif–c­the›c¬FD‘cgpart“of˜GNU‘cgProlog“has˜bGeen“installed.‘œÍThe“solv¸ãer“is˜an“instance˜of“the˜Constrain¸ãt“LogicŽ¡‘øãProgramming–ÇÚscš¸ãheme“in˜troGduced“b˜y“Ja ar“and“Lassez“in“1987“[7Ž‘].‘ÉVConstrain˜ts“on“FD‘ǽare“solv˜ed“usingŽ¡‘øãpropagation–©tecš¸ãhniques,‘¬in“particular‘ªarc-consistency“(A˜C).“The‘ªin˜terested“reader›ªcan“refer˜to“\Constrain¸ãtŽ¡‘øãSatisfaction–î¼in›î»Logic“Programming"˜of“P–ÿ*ª.˜V“an‘î¼Hen•¸ãtenryc“k˜(1989)‘î¼[8Ž‘].‘O”The˜solv“er–î¼is˜based“on˜the“Åclp(FD)Ž¡‘øã²solv¸ãer‘EÌ[4Ž‘].‘EThe–EÍGNU›E‡Prolog“FD˜solvš¸ãer“o ers‘EÌarithmetic“constrain˜ts,‘|b•Go“olean–EÌconstrain˜ts,‘|rei ed“constrain˜tsŽ¡‘øãand–UUsymš¸ãbGolic“constrain˜ts“on“an“new“kind“of“v›ÿqÇariables:‘qÇFinite“Domain“v˜ariables.ŽŸ%þ6‘øãÄ8.1.1Ž‘‰Finite–ÕTDomain“v‘ÿ\rariablesަ‘øã²A‘·Ånew–¸ t¸ãypGe›¸!of“data˜is“inš¸ãtroGduced:‘7^FD‘·Åv‘ÿqÇariables“whic˜h“can‘¸!only“tak˜e›¸!v‘ÿqÇalues“in“their˜domains.‘š)TheŽ¡‘øãinitial–domain“of“an“FD‘Òv‘ÿqÇariable“is‘Å0..fd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer–²where“Åfd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer–²represen¸ãts“the“greatestŽ¡‘øãv›ÿqÇalue–g*that‘g+an¸ãy“FD‘g%v˜ariable›g+can“tak¸ãe.‘§GThe“predicate“Åfd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer/1˜²returns–g*this“v‘ÿqÇalue“whic•¸ãh˜ma“y‘g*bGeŽ¡‘øãdi eren¸ãt–Ìfrom›Ëthe“Åmax‘¡E‰ff&fŽ‘Ç«integer˜²Prolog“ ag˜(section“7.22.1,‘Hipage˜133).‘¹+The˜domain“of˜an“FD‘™v‘ÿqÇariableŽ¡‘øãÅX‘¤Ñ²is–¤åreduced›¤æstep“b¸ãy˜step“bš¸ãy“constrain˜ts›¤æin“a˜monotonic“w•¸ãa“y:‘èwhen–¤åa˜v‘ÿqÇalue“has˜bGeen“remo•¸ãv“ed˜from‘¤åtheŽ¡‘øãdomain–&{of›í˜ÅX‘&E²it“will“nev¸ãer“reappGear“in“the“domain‘&zof˜ÅX².“An“FD‘&Ev‘ÿqÇariable“is“fully“compatible“with“bGothŽ¡‘øãProlog–  in¸ãtegers“and“Prolog“v›ÿqÇariables.‘Y5Namely‘ÿ*ª,‘^when“an“FD‘ Žv˜ariable“is“expGected“bš¸ãy“an“FD‘ constrain˜t“it“isŽ¡‘øãpGossible–3¨to›3©pass“a˜Prolog“in¸ãteger˜(considered“as˜an“FD‘3 v‘ÿqÇariable˜whose“domain˜is“a˜singleton)“or˜a“PrologŽ¡‘øãv‘ÿqÇariable–º"(immediately›º#bGound“to“an˜initial“range“Å0..fd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer²).‘ /This˜a•¸ãv“oids–º"the“need˜for“spGeci cŽ¡‘øãt¸ãypGe–¼ëdeclaration.‘¨ŠAlthough“it“is›¼ìnot“necessary“to“declare˜the“initial“domain“of˜an“FD‘¼Ñv‘ÿqÇariable“(since“itŽ¡‘øãwill›db•Ge‘cb“ound˜Å0..fd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer˜²when˜appGearing–cfor˜the˜ st˜time“in˜a˜constrain¸ãt)˜it“is˜adv‘ÿqÇan¸ãtageous˜toŽ¡‘øãdo–¡ˆso›¡‡and“th¸ãus“reduce˜as“soGon“as˜pGossible“the“size“of˜its“domain:‘ ,particularly“bGecause“GNU‘¡tProlog,‘´”forŽ¡‘øãeciency–çŠreasons,‘ý€doGes›ç‹not“c•¸ãhec“k‘çŠfor˜o“v“er o“ws.‘M.F‘ÿ*ªor˜instance,‘ýwithout˜an“y–çŠpreliminary˜domain“de nitionsŽ¡‘øãfor–œÂÅX²,“ÅY‘œ°²and“ÅZ²,“the“non-linear“constrainš¸ãt“ÅX*Y#=Z‘œ¯²will“fail“due“to“an“o˜v˜er o˜w“when“computing“the“uppGerŽ¡‘øãbGound–·žof“the“domain“of‘~»ÅZ²:“Åfd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer–?ý¸“Åfd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer².‘˜£This›·žo•¸ãv“er o“w˜causes˜a˜negativ“e˜resultŽ¡‘øãfor–UUthe“uppšGer“b˜ound“and“the“constrain¸ãt“then“fails.ŽŸ‘øãThere–UUare“t•¸ãw“o›UUin“ternal˜represen“tations˜for˜an˜FD˜v‘ÿqÇariable:Ž©‘ã¸ŽŽŽ‘ã Äin•®9terv‘ÿ\ral‘WLrepresen“tation²:‘only–¤õthe›¤ôÈmin‘iX²and“the˜Èmax‘Ù9²of˜the“v‘ÿqÇariable“are˜main¸ãtained.‘`¦In“thisŽ¡‘ã represen¸ãtation–UUit“is“pGossible“to“store“v‘ÿqÇalues“included“in“Å0..fd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer².ަ‘ã¸ŽŽŽ‘ã Äsparse‘ ‰represen®9tation²:‘¿an–dÑadditional“bit-v¸ãector“is“used‘dÐto“store“the“set“of“pGossible“v‘ÿqÇalues“forŽ¡‘ã the–—}v›ÿqÇariable“(i.e.‘8>the“domain).‘8?In“this“represen¸ãtation“it“is“pGossible‘—|to“store“v˜alues“included“inŽ¡‘ã Å0..vector‘¡E‰ff&fŽ›Ç«max².‘ußBy–¬default“Åvector‘¡E‰ff&fŽ˜max›¬²is“set“to“127.‘ußThis“v‘ÿqÇalue˜can“bGe“rede ned“via˜an“en-Ž¡‘ã vironmen¸ãt–\*v‘ÿqÇariable›\+ÅVECTORMAX‘[ç²or“via˜the“built-in˜predicate“Åfd‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“vector‘¡E‰ff&fŽ“max/1˜²(section‘\*8.2.3,Ž¡‘ã page–,è167).‘dMThe“predicate›,çÅfd‘¡E‰ff&fŽ–Ç«vector‘¡E‰ff&fŽ“max/1–,è²returns˜the“curren¸ãt“v‘ÿqÇalue˜of‘ôÅvector‘¡E‰ff&fŽ‘Ç«max˜²(section“8.2.1,Ž¡‘ã page‘UU166).ަ‘øãThe–initial›represen¸ãtation“for“an˜FD›Úv‘ÿqÇariable“ÅX˜²is›alw•¸ãa“ys–an“in•¸ãterv‘ÿqÇal˜represen“tation–and“is˜switc¸ãhed“toŽ¡‘øãa–wˆsparse“represenš¸ãtation“when“a‘w‰\hole"“appGears“in“the“domain“(e.g.‘Øadue“to“an“inequalit˜y“constrain˜t).Ž¡‘øãOnce–m~a›mv‘ÿqÇariable“uses˜a“sparse“represen¸ãtation˜it“will˜not“switc•¸ãh˜bac“k–m~to“an˜inš¸ãterv‘ÿqÇal“represen˜tation‘mev˜en“ifŽ¡‘øãthere–V›are“no“longer“holes“in“its“domain.‘ušWhen“this“switc¸ãhing“oGccurs“some“v‘ÿqÇalues“in“the“domain“of‘¸ÅX“²canŽ¡‘øãbGe–è%lost“since‘è$Åvector‘¡E‰ff&fŽ›Ç«max“²is“less“than“Åfd‘¡E‰ff&fŽ˜max‘¡E‰ff&fŽ˜integer².‘*6W‘ÿ*ªe“sa¸ãy“that“\ÅX›çÿ²is‘è$extra-constrained"“since“ÅX˜²isŽ¡‘øãconstrained–W3bš¸ãy“the“solv˜er›W4to“the“domain“Å0..vector‘¡E‰ff&fŽ‘Ç«max“²(via“an˜imaginary“constrain¸ãt“ÅX–?ý#=<“Évector‘¡E‰ff&fŽ‘Ç«max‘¼r²).Ž¡‘øãAn–k¿Åextra‘¡E‰ff&fŽ‘Ç«cstr›k¾²is“assoGciated˜with“eac¸ãh“FD‘kƒv‘ÿqÇariable“to˜indicate“that“v‘ÿqÇalues˜ha•¸ãv“e–k¿bGeen“lost˜due“to˜the“switc¸ãhŽ¡‘øãto–æåa›ææsparse“represen¸ãtation.‘LøThis“ ag˜is“upGdated˜on“ev¸ãery˜opGerations.‘L÷The˜domain“of˜an“extra-constrainedŽ¡‘øãFD–Ræv‘ÿqÇariable›Rçis“output˜follo•¸ãw“ed‘Ræb“y˜the˜Å@›Ræ²sym“bGol.‘pøWhen˜a›Rçconstrain“t˜fails–Ræon˜a“extra-constrained˜v‘ÿqÇariableŽ¡‘øãa›ÖCmessage‘ÖDÅWarning:‘ úVector–?ýtoo“small“-“maybe“lost“solutions“(FD“Var:ÉN‘¼rÅ)‘Ö#²is˜displa•¸ãy“ed˜(ÉN‘’–²is˜theŽ¡‘øãaddress–UUof“the“in•¸ãv“olv“ed‘UUv‘ÿqÇariable).ŽŽŸŽŒ‹¦ Š Ú‹– ý"EŸüfd‘øã²166ŽŽŽ’¤=×8‘ FINITE–UUDOMAIN“SOL‘þãVER“AND“BUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãExample–UU1“(Åvector‘¡E‰ff&fŽ‘Ç«max“²=“Å127²):ŽŸ,32‘øãŸã³4‰ffÕ±¤fd¤™œ„ ff‘ŸüfdConstrain¸ãt–UUon“ÅX‘¡„ ffŽ‘W¾š²Domain‘UUof‘rÅX‘ ñžŸ™œ„ ffŽ’£$Üextra‘¡E‰ff&fŽ‘Ç«cstr‘Ÿ™œ„ ffŽ’â’Ó²Lost‘UUv‘ÿqÇalues‘Ÿ™œ„ ffŽŽ©‰ffÕ±Ÿff‰ffÕ±¡¤™œ„ ff‘ŸüfdÅX–?ý#=<“512‘±ç¡„ ffŽ‘W¾š0..512‘%œ„ ffŽ’´È©off‘£ÌŸ™œ„ ffŽ’â’Ó²none‘"N<Ÿ™œ„ ffŽŽ¦‰ffÕ±¡¤™œ„ ff‘ŸüfdÅX–?ý#\=“10‘ ñä¡„ ffŽ‘W¾š0..9:11..127‘Ÿ™œ„ ffŽ’·h§on‘CËŸ™œ„ ffŽ’â’Ó128..512‘ ÜŸ™œ„ ffŽŽ¦‰ffÕ±¡¤™œ„ ff‘ŸüfdX–?ý#=<“100‘±ç¡„ ffŽ‘W¾š0..9:11..100‘Ÿ™œ„ ffŽ’´È©off‘£ÌŸ™œ„ ffŽ’â’Ó²none‘"N<Ÿ™œ„ ffŽŽ¦‰ffÕ±ŽŽŽŸ+¤ù‘øãIn–äKthis›äLexample,‘ when“the“constrain¸ãt˜ÅX–?ý#\=“10–äK²is˜pGosted“some“v‘ÿqÇalues˜are“lost,‘ the“Åextra‘¡E‰ff&fŽ‘Ç«cstr˜²is“thenŽ© ‘øãswitc•¸ãhed›UUon.‘qÇHo“w“ev“er,˜pGosting˜the˜constrain“t˜ÅX–?ý#=<“100˜²will˜turn˜o ˜the˜ ag˜(no˜v‘ÿqÇalues˜are˜lost).ŽŸ‘øãExample‘UU2:ޤ*qÆ‘øãŸäæg‰ffs~¤fd¤™œ„ ff‘ŸüfdConstrain¸ãt–UUon“ÅX‘¡„ ffŽ‘W¾š²Domain‘UUof‘rÅX‘g1kŸ™œ„ ffŽ’üd©extra‘¡E‰ff&fŽ‘Ç«cstr‘Ÿ™œ„ ffŽ’;Ò ²Lost‘UUv‘ÿqÇalues‘Ÿ™œ„ ffŽŽ©‰ffs~¡¤™œ„ ff‘ŸüfdÅX–?ý#=<“512‘±ç¡„ ffŽ‘W¾š0..512‘~¿»Ÿ™œ„ ffŽ’voff‘£ÌŸ™œ„ ffŽ’;Ò ²none‘"N<Ÿ™œ„ ffŽŽ¦‰ffs~¡¤™œ„ ff‘ŸüfdÅX–?ý#\=“10‘ ñä¡„ ffŽ‘W¾š0..9:11..127‘_?ÍŸ™œ„ ffŽ’¨ton‘CËŸ™œ„ ffŽ’;Ò 128..512‘ ÜŸ™œ„ ffŽŽ¦‰ffs~¡¤™œ„ ff‘ŸüfdX–?ý#>=“256‘±ç¡„ ffŽ‘W¾šWarning:‘ úVector–?ýtoo“small...‘Ÿ™œ„ ffŽ’¨ton‘CËŸ™œ„ ffŽ’;Ò 128..512‘ ÜŸ™œ„ ffŽŽ¦‰ffs~ŽŽŽ¡‘øã²In›ýÚthis–ýÛexample,‘'ûthe“constrain¸ãt˜ÅX–?ý#>=“256˜²fails–ýÛdue˜to˜the“lost˜of‘Ä÷Å128..512“²so˜a˜message“is˜displa•¸ãy“edަ‘øãonš¸ãto–Î"the‘Î!terminal.‘Ü-The“solution“w˜ould›Î!consist“in“increasing“the˜size“of“the˜vš¸ãector“either“b˜y‘Î!setting“theަ‘øãen•¸ãvironmen“t–UUv‘ÿqÇariable“ÅVECTORMAX“²(e.g.‘qÇto“Å512²)“or“using‘xâÅfd‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“vector‘¡E‰ff&fŽ“max(512)².ŽŸ‘øãFinally‘ÿ*ª,›\8bit-v¸ãectors–'¤are“not“dynamic,˜i.e.‘è´all“v•¸ãectors‘'¥ha“v“e–'¤the“same“size“(Å0..vector‘¡E‰ff&fŽ‘Ç«max²).‘èµSo“the“useަ‘øãof‘7»Åfd‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“vector‘¡E‰ff&fŽ“max/1–pž²is›pŸlimited“to“the“initial“de nition˜of“vš¸ãector“sizes“and“m˜ust‘pŸošGccur“b˜efore“an¸ãyަ‘øãconstrainš¸ãt.‘kyAs–Bjseen“bGefore,‘F3the“solv˜er‘Bktries“to“displa˜y“a›Bkmessage“when“a“failure˜oGccurs“due“to“a˜toGo“shortަ‘øãÅvector‘¡E‰ff&fŽ‘Ç«max².‘‚öUnfortunately‘ÿ*ª,‘\~in–[some“cases“it›[cannot“detect“the“lost˜of“v‘ÿqÇalues“and“no˜message“is“emitted.ަ‘øãSo–UUthe“user“should“alw•¸ãa“ys›UUtak“e˜care˜to˜this˜parameter˜to˜b•Ge˜sure˜that˜it˜is˜large˜to˜enco“de˜an•¸ãy˜v“ector.ŽŸ'îï‘øãÇ8.2Ž‘£FD–€v‘ÿ@ariable“parametersޤuT‘øãÄ8.2.1Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer/1Ž¡‘øãÄT‘ÿ «emplatesŽ©¹ ‘ã Åfd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer(?integer)ŽŸ¹ ‘øãÄDescriptionޤ‘øãÅfd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer(N)–UU²succeeds“if›rÅN“²is“the“curren¸ãt“v‘ÿqÇalue“of˜Åfd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer–UU²(section“8.1,“page“165).Ž¡‘øãÄErrorsŽ¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅN–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýN)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%îï‘øãÄ8.2.2Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«vector‘¡E‰ff&fŽ“max/1ŽŸuT‘øãÄT‘ÿ «emplatesަ‘ã Åfd‘¡E‰ff&fŽ–Ç«vector‘¡E‰ff&fŽ“max(?integer)ŽŸ¹ ‘øãÄDescriptionŽŽŸŽŒ‹§ 35 Ú‹– ý"EŸüfd‘øã²8.3‘ Initial–UUv‘ÿqÇalue“constrain¸ãtsŽŽŽ’±!€167ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅfd‘¡E‰ff&fŽ–Ç«vector‘¡E‰ff&fŽ“max(N)–UU²succeeds“if›rÅN“²is“the“curren¸ãt“v‘ÿqÇalue“of˜Åvector‘¡E‰ff&fŽ‘Ç«max“²(section“8.1,“page“165).ޤ‘øãÄErrorsŽ¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅN–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýN)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ8.2.3Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“vector‘¡E‰ff&fŽ“max/1Ž©uT‘øãÄT‘ÿ «emplatesޤ‘ã Åfd‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“vector‘¡E‰ff&fŽ“max(+integer)Ž¡‘øãÄDescriptionޤ‘øãÅfd‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“vector‘¡E‰ff&fŽ“max(N)‘Yý²initializes›Z=Åvector‘¡E‰ff&fŽ“max˜²based–Z|¤fdŸ™œ„ ffŸüfd‘ÅN–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘N–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýN)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘N–UU²is“an“in¸ãteger“µ<“²0ŽŽ’㥄 ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýN)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ$>“‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ'þ6‘øãÇ8.3Ž‘£Initial–€v‘ÿ@alue“constrain tsަ‘øãÄ8.3.1Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«domain/3Ä,‘ÕTÅfd‘¡E‰ff&fŽ“domain‘¡E‰ff&fŽ“bool/1ަ‘øãÄT‘ÿ «emplatesŽ©‘ã Åfd‘¡E‰ff&fŽ–Ç«domain(+fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list‘¡E‰ff&fŽ“or‘¡E‰ff&fŽ“fd‘¡E‰ff&fŽ“variable,–?ý+integer,“+integer)ޤ ‘ã fd‘¡E‰ff&fŽ–Ç«domain(?fd‘¡E‰ff&fŽ“variable,–?ý+integer,“+integer)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«domain‘¡E‰ff&fŽ“bool(+fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«domain‘¡E‰ff&fŽ“bool(?fd‘¡E‰ff&fŽ“variable)ަ‘øãÄDescriptionŽ©‘øãÅfd‘¡E‰ff&fŽ‘Ç«domain(Vars,–?ýLower,“Upper)–X)²constrainš¸ãts“eac˜h“elemen˜t“ÅX›X(²of‘FÅVars“²to˜tak¸ãe“a“v‘ÿqÇalue“in“ÅLower..Upper².Ž¡‘øãThis–ƒ¥predicate“is“generally“used“to“set“the“initial“domain“of“v›ÿqÇariables“to“an“in¸ãterv˜al.‘ü·ÅVars“²can“bGe“also“aŽ¡‘øãsingle–UUFD“v›ÿqÇariable“(or“a“single“Prolog“v˜ariable).ަ‘øãÅfd‘¡E‰ff&fŽ–Ç«domain‘¡E‰ff&fŽ“bool(Vars)–ú’²is›ú‘equiv‘ÿqÇalen¸ãt“to“Åfd‘¡E‰ff&fŽ‘Ç«domain(Vars,–?ý0,“1)–ú’²and˜is“used“to“declare˜b•Go“olean‘ú’FDŽ¡‘øãv‘ÿqÇariables.ަ‘øãÄErrorsŽŽŸŽŒ‹¨ C Ú‹– ý"EŸüfd‘øã²168ŽŽŽ’¤=×8‘ FINITE–UUDOMAIN“SOL‘þãVER“AND“BUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý;Ý‘øãŸÆLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅVars–UU²is“not“a“v‘ÿqÇariable“but“is“a“partial“listŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Vars–K¯²is“neither“a“v›ÿqÇariable“nor“an“FD‘K­v˜ariable“norŽŸ ‘an–UUin¸ãteger“nor“a“listŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýVars)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–F÷elemen¸ãt›FöÅE‘Fó²of“the˜ÅVars“²list˜is“neither˜a“v‘ÿqÇariableŽŸ ‘nor–UUan“FD“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Lower–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Lower–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýLower)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Upper–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Upper–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýUpper)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸI _‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ8.3.2Ž‘‰Åfd‘¡E‰ff&fŽ‘Ç«domain/2ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åfd‘¡E‰ff&fŽ–Ç«domain(+fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list,‘?ý+integer‘¡E‰ff&fŽ“list)ŽŸ ‘ã fd‘¡E‰ff&fŽ–Ç«domain(?fd‘¡E‰ff&fŽ“variable,‘?ý+integer‘¡E‰ff&fŽ“list)Ž¡‘øãÄDescriptionަ‘øãÅfd‘¡E‰ff&fŽ‘Ç«domain(Vars,‘?ýValues)–«²constrainš¸ãts“eac˜h‘¬elemen˜t“ÅX‘›²of“the“list“ÅVars‘¬²to“tak˜e“a“v‘ÿqÇalue“in‘¬the“list“ÅValues².ޤ ‘øãThis– predicate“is“generally› used“to“set“the“initial“domain“of˜v›ÿqÇariables“to“a“set“of“v˜alues.‘HåThe“domain“ofŽ¡‘øãeac¸ãh›þÝv‘ÿqÇariable–þÜof‘ÅúÅVars“²uses˜a˜sparse“represen¸ãtation.‘n^ÅVars“²can˜bGe˜also“a˜single“FD‘þ±v‘ÿqÇariable˜(or“a˜singleŽ¡‘øãProlog‘UUv‘ÿqÇariable).ަ‘øãÄErrorsŽŸLæe‘øãŸÀ€‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅVars–UU²is“not“a“v‘ÿqÇariable“but“is“a“partial“listŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Vars–K¯²is“neither“a“v›ÿqÇariable“nor“an“FD‘K­v˜ariable“norŽŸ ‘an–UUin¸ãteger“nor“a“listŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýVars)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–F÷elemen¸ãt›FöÅE‘Fó²of“the˜ÅVars“²list˜is“neither˜a“v‘ÿqÇariableŽŸ ‘nor–UUan“FD“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Values–UU²is“a“partial“list“or“a“list“with“an“elemen¸ãtŽŸ ‘ÅE–UU²whic¸ãh“is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Values–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýValues)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅValues“²list“is“neither“aŽŸ ‘v‘ÿqÇariable–UUnor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸNØ,‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ'þ6‘øãÇ8.4Ž‘£T yp`e‘€testingޤuT‘øãÄ8.4.1Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«var/1Ä,›ÕTÅnon‘¡E‰ff&fŽ“fd‘¡E‰ff&fŽ“var/1Ä,˜Ågeneric‘¡E‰ff&fŽ“var/1Ä,˜Ånon‘¡E‰ff&fŽ“generic‘¡E‰ff&fŽ“var/1Ž¡‘øãÄT‘ÿ «emplatesŽŽŸŽŒ‹© Nñ Ú‹– ý"EŸüfd‘øã²8.5‘ FD–UUv‘ÿqÇariable“informationŽŽŽ’±!€169ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýk"EŸô‘ã Åfd‘¡E‰ff&fŽ‘Ç«var(?term)ŽŸ ‘ã non‘¡E‰ff&fŽ–Ç«fd‘¡E‰ff&fŽ“var(?term)ŽŽŸô’ú‚Ggeneric‘¡E‰ff&fŽ‘Ç«var(?term)ŽŸ ’ú‚Gnon‘¡E‰ff&fŽ–Ç«generic‘¡E‰ff&fŽ“var(?term)ŽŽŽ¤‘øãÄDescriptionŽ¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«var(Term)–UU²succeeds“if‘rÅTerm“²is“curren¸ãtly“an“FD“v‘ÿqÇariable.Ž¡‘øãÅnon‘¡E‰ff&fŽ–Ç«fd‘¡E‰ff&fŽ“var(Term)–UU²succeeds“if›rÅTerm“²is“curren¸ãtly“not“an“FD“v‘ÿqÇariable“(oppGosite“of˜Åfd‘¡E‰ff&fŽ‘Ç«var/1²).Ž¡‘øãÅgeneric‘¡E‰ff&fŽ‘Ç«var(Term)–UU²succeeds“if‘rÅTerm“²is“either“a“Prolog“v›ÿqÇariable“or“an“FD“v˜ariable.Ž¡‘øãÅnon‘¡E‰ff&fŽ–Ç«generic‘¡E‰ff&fŽ“var(Term)–²succeeds“if‘Õ,ÅTerm“²is“neither“a“Prolog“v›ÿqÇariable‘nor“an“FD‘ ßv˜ariable“(oppGosite“ofŽ© ‘øãÅgeneric‘¡E‰ff&fŽ‘Ç«var/1²).Ž¡‘øãÄErrorsŽ¡‘øã²None.Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicate.ŽŸ'þ6‘øãÇ8.5Ž‘£FD–€v‘ÿ@ariable“informationޤuT‘øã²These–Ó&predicate›Ó%allo¸ãw“the“user˜to“get“some˜information“abGout“FD‘Óv‘ÿqÇariables.‘ë9They“are˜not“constrain¸ãts,ަ‘øãthey–UUonly“return“the“curren¸ãt“state“of“a“v‘ÿqÇariable.ŽŸ%þ6‘øãÄ8.5.1Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«min/2Ä,›ÕTÅfd‘¡E‰ff&fŽ“max/2Ä,˜Åfd‘¡E‰ff&fŽ“size/2Ä,˜Åfd‘¡E‰ff&fŽ“dom/2Ž¡‘øãÄT‘ÿ «emplatesޤ‘ã Åfd‘¡E‰ff&fŽ–Ç«min(+fd‘¡E‰ff&fŽ“variable,‘?ý?integer)ަ‘ã fd‘¡E‰ff&fŽ–Ç«max(+fd‘¡E‰ff&fŽ“variable,‘?ý?integer)ަ‘ã fd‘¡E‰ff&fŽ–Ç«size(+fd‘¡E‰ff&fŽ“variable,‘?ý?integer)ަ‘ã fd‘¡E‰ff&fŽ–Ç«dom(+fd‘¡E‰ff&fŽ“variable,‘?ý?integer‘¡E‰ff&fŽ“list)Ž¡‘øãÄDescriptionޤ‘øãÅfd‘¡E‰ff&fŽ‘Ç«min(X,‘?ýN)–UU²succeeds“if›rÅN“²is“the“minimal“v‘ÿqÇalue“of“the“curren¸ãt“domain“of˜ÅX².Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«max(X,‘?ýN)–UU²succeeds“if›rÅN“²is“the“maximal“v‘ÿqÇalue“of“the“curren¸ãt“domain“of˜ÅX².Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«size(X,‘?ýN)–UU²succeeds“if‘rÅN“²is“the“n•¸ãum“bGer–UUof“elemenš¸ãts“of“the“curren˜t“domain“of‘rÅX².Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«dom(X,‘?ýValues)–UU²succeeds“if›rÅValues“²is“the“list“of“v‘ÿqÇalues“of“the“curren¸ãt“domain“of˜ÅX².Ž¡‘øãÄErrorsŽŸ4³2‘øãŸØ³4‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅX–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘X–UU²is“neither“an“FD“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýX)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘N–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýN)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–F÷elemen¸ãt›FöÅE‘Fó²of“the˜ÅVars“²list˜is“neither˜a“v‘ÿqÇariableŽŸ ‘nor–UUan“FD“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Values–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýValues)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŽŸŽŒ‹ª ^àÚ‹– ý"EŸüfd‘øã²170ŽŽŽ’¤=×8‘ FINITE–UUDOMAIN“SOL‘þãVER“AND“BUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄP•®9ortabilit“yŽŸ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ8.5.2Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«has‘¡E‰ff&fŽ“extra‘¡E‰ff&fŽ“cstr/1Ä,›ÕTÅfd‘¡E‰ff&fŽ“has‘¡E‰ff&fŽ“vector/1Ä,˜Åfd‘¡E‰ff&fŽ“use‘¡E‰ff&fŽ“vector/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åfd‘¡E‰ff&fŽ–Ç«has‘¡E‰ff&fŽ“extra‘¡E‰ff&fŽ“cstr(+fd‘¡E‰ff&fŽ“variable)ޤ ‘ã fd‘¡E‰ff&fŽ–Ç«has‘¡E‰ff&fŽ“vector(+fd‘¡E‰ff&fŽ“variable)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«use‘¡E‰ff&fŽ“vector(+fd‘¡E‰ff&fŽ“variable)ަ‘øãÄDescriptionޤ‘øãÅfd‘¡E‰ff&fŽ–Ç«has‘¡E‰ff&fŽ“extra‘¡E‰ff&fŽ“cstr(X)–UU²succeeds“if“the“Åextra‘¡E‰ff&fŽ‘Ç«cstr“²of‘rÅX“²is“curren¸ãtly“on“(section“8.1,“page“165).Ž¡‘øãÅfd‘¡E‰ff&fŽ–Ç«has‘¡E‰ff&fŽ“vector(X)‘t”²succeeds›tÎif–tÍthe“curren¸ãt˜domain“of‘;êÅX‘t•²uses“a“sparse˜represen¸ãtation“(section“8.1,‘¡¶page“165).Ž¡‘øãÅfd‘¡E‰ff&fŽ–Ç«use‘¡E‰ff&fŽ“vector(X)–UU²enforces“a“sparse“represen¸ãtation“for“the“domain“of‘rÅX“²(section“8.1,“page“165).Ž¡‘øãÄErrorsŽŸ™‘øãŸñL͉ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅX–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘X–UU²is“neither“an“FD“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýX)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|ŽŽŽŸ `‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ'þ6‘øãÇ8.6Ž‘£Arithmetic‘€constrain tsޤuT‘øãÄ8.6.1Ž‘‰FD–ÕTarithmetic“expressionsŽ¡‘øã²An–Ô(or›—=opGerators)“that˜represen¸ãt“arithmetic˜functions.‘7The˜follo¸ãwing“table˜details“the˜compGonen¸ãtsŽ¡‘øãof–UUan“FD“arithmetic“expression:ŽŽŸŽŒ‹« kë Ú‹– ý"EŸüfd‘øã²8.6‘ Arithmetic‘UUconstrain¸ãtsŽŽŽ’±!€171ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýÈo‘øãŸ‰ff¼¤fd¤™œ„ ff‘ŸüfdFD‘UUExpression‘¡„ ffŽ‘j”HResultŽŽ’VŸ™œ„ ffŽŽ©‰ff¼Ÿff‰ff¼¡¤™œ„ ff‘ŸüfdProlog‘UUv‘ÿqÇariable‘ÀT¡„ ffŽ‘j”Hdomain‘UUÅ0..fd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integerŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘Ÿüfd²FD–UUv‘ÿqÇariable“ÅX‘!€Z¡„ ffŽ‘j”H²domain‘UUof‘rÅXŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘Ÿüfd²in•¸ãteger›UUn“um“bGer˜ÅN‘w¡„ ffŽ‘j”H²domain‘UUÅN..NŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘Ÿüfd+‘?ýE‘N„¡„ ffŽ‘j”H²same–UUas“ÅEŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘Ÿüfd-‘?ýE‘N„¡„ ffŽ‘j”H²oppGosite‘UUof‘rÅEŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘ŸüfdE1–?ý+“E2‘9¡„ ffŽ‘j”H²sum–UUof‘rÅE1“²and“ÅE2ŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘ŸüfdE1–?ý-“E2‘9¡„ ffŽ‘j”H²subtraction–UUof‘rÅE2“²from“ÅE1ŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘ŸüfdE1–?ý*“E2‘9¡„ ffŽ‘j”H²mš¸ãultiplication–UUof‘rÅE1“²b˜y‘xâÅE2ŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘ŸüfdE1–?ý/“E2‘9¡„ ffŽ‘j”H²inš¸ãteger–UUdivision“of‘rÅE1“²b˜y‘xâÅE2“²(only“succeeds“if“the“remainder“is“0)ŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘ŸüfdÅE1–?ý**“E2‘3Ç“¡„ ffŽ‘j”HE1–UU²raised“to“the“pšGo•¸ãw“er–UUof‘rÅE2‘?ý²(ÅE1“²or“ÅE2“²m¸ãust“b˜e“an“in¸ãteger)ŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘ŸüfdÅmin(E1,E2)‘)G™¡„ ffŽ‘j”H²minim¸ãum–UUof‘rÅE1“²and“ÅE2ŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘Ÿüfdmax(E1,E2)‘)G™¡„ ffŽ‘j”H²maxim¸ãum–UUof‘rÅE1“²and“ÅE2ŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘Ÿüfddist(E1,E2)‘$œ¡„ ffŽ‘j”H²distance,‘UUi.e.‘qǸjÅE1–?ý-“E2¸jŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘ŸüfdÅE1–?ý//“E2‘3Ç“¡„ ffŽ‘j”H²quotienš¸ãt–UUof“the“in˜teger“division“of‘rÅE1“²b˜y‘xâÅE2ŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ ff‘ŸüfdE1–?ýrem“E2‘.‡–¡„ ffŽ‘j”H²remainder–UUof“the“inš¸ãteger“division“of‘rÅE1“²b˜y‘xâÅE2ŽŽ’VŸ™œ„ ffŽŽ¦‰ff¼¡¤™œ„ff‘Ÿðfdquot‘¡E‰ff&fŽ‘Ç«rem(E1,E2,R)‘¡„ffŽ‘j”H²quotienš¸ãt–UUof“the“in˜teger“division“of‘rÅE1“²b˜y‘xâÅE2ŽŸ ‘j”H²(ÅR–UU²is“the“remainder“of“the“inš¸ãteger“division“of‘rÅE1“²b˜y‘xâÅE2²)ŽŽ’VŸ™œ„ffŽŽŸ‰ff¼ŽŽŽ ‚>‘øãFD‘•expressions–•8are“not“restricted“to“bGe“linear.‘1¾Ho•¸ãw“ev“er‘•7non-linear›•8constrain“ts˜usually˜yield˜less˜constrain“tޤ ‘øãpropagation–UUthan“linear“constrain¸ãts.Ž©‘øãÅ+²,–[„Å-²,“Å*²,‘[…Å/²,“Å//²,“Årem›óá²and–óâÅ**“²are˜prede ned“in x˜opGerators.‘ MmÅ+˜²and“Å-˜²are“prede ned˜pre x“opGeratorsŽ¡‘øã(section–UU7.14.10,“page“100).ަ‘øãÄErrorsŽŸ.LÌ‘øãŸßš‰ffÇ>|©fdŸ™œ„ffŸðfd‘²a–UUsub-expression“is“of“the“form‘öš‰ff&fŽ‘ \ýÅ**‘?ýE“²and“ÅE“²is“aŽ¡‘v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²a–UUsub-expression“ÅE“²is“neither“a“v‘ÿqÇariable“nor“anŽ¡‘in¸ãteger–UUnor“an“FD“arithmetic“functorŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“evaluable,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘²an–UUexpression“is“toGo“complexŽŽ’㥄 ffŽ’éÒqÅresource‘¡E‰ff&fŽ–Ç«error(too‘¡E‰ff&fŽ“big‘¡E‰ff&fŽ“fd‘¡E‰ff&fŽ“constraint)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽŸ><É‘øãÄ8.6.2Ž‘‰P•®9artial›ÕTA“C:˜Å(#=)/2˜Ä-˜constrain“t˜equal,˜Å(#\=)/2˜Ä-˜constrain“t˜not˜equal,Ž¡‘‰Å(#<)/2–ÕTÄ-“constrainš®9t“less“than,“Å(#=<)/2“Ä-“constrain˜t“less“than“or“equal,Ž¡‘‰Å(#>)/2–ÕTÄ-“constrainš®9t“greater“than,“Å(#>=)/2“Ä-“constrain˜t“greater“than“or“equalŽŸuT‘øãT‘ÿ «emplatesŽ©‘ã Å#=(?fd‘¡E‰ff&fŽ–Ç«evaluable,‘?ý?fd‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #\=(?fd‘¡E‰ff&fŽ–Ç«evaluable,‘?ý?fd‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #<(?fd‘¡E‰ff&fŽ–Ç«evaluable,‘?ý?fd‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #=<(?fd‘¡E‰ff&fŽ–Ç«evaluable,‘?ý?fd‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #>(?fd‘¡E‰ff&fŽ–Ç«evaluable,‘?ý?fd‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #>=(?fd‘¡E‰ff&fŽ–Ç«evaluable,‘?ý?fd‘¡E‰ff&fŽ“evaluable)ަ‘øãÄDescriptionޤ‘øãÅFdExpr1–?ý#=“FdExpr2–UU²constrains“ÅFdExpr1“²to“bGe“equal“to“ÅFdExpr2².Ž¡‘øãÅFdExpr1–?ý#\=“FdExpr2–UU²constrains“ÅFdExpr1“²to“bGe“di eren¸ãt“from“ÅFdExpr2².Ž¡‘øãÅFdExpr1–?ý#<“FdExpr2–UU²constrains“ÅFdExpr1“²to“bGe“less“than“ÅFdExpr2².Ž¡‘øãÅFdExpr1–?ý#=<“FdExpr2–UU²constrains“ÅFdExpr1“²to“bGe“less“than“or“equal“to“ÅFdExpr2².ŽŽŸŽŒ‹¬ t7 Ú‹– ý"EŸüfd‘øã²172ŽŽŽ’¤=×8‘ FINITE–UUDOMAIN“SOL‘þãVER“AND“BUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅFdExpr1–?ý#>“FdExpr2–UU²constrains“ÅFdExpr1“²to“bGe“greater“than“ÅFdExpr2².ޤ‘øãÅFdExpr1–?ý#>=“FdExpr2–UU²constrains“ÅFdExpr1“²to“bGe“greater“than“or“equal“to“ÅFdExpr2².Ž¡‘øãÅFdExpr1–UU²and“ÅFdExpr2“²are“arithmetic“FD“expressions“(section“8.6.1,“page“170).Ž¡‘øãÅ#=²,–UUÅ#\=²,“Å#<²,“Å#=<²,“Å#>“²and“Å#>=“²are“prede ned“in x“opGerators“(section“7.14.10,“page“100).Ž¡‘øãThese–?àpredicates›?ápGost“arithmetic“constrain¸ãts“that˜are“managed“b¸ãy˜the“solv¸ãer“using“a˜partial“arc-consistencyޤ ‘øãalgorithm–”to“reduce“the“domain“of“in•¸ãv“olv“ed–”v‘ÿqÇariables.‘.#In“this“sc¸ãheme“only“the“bGounds“of“the“domain“ofŽ¡‘øãv‘ÿqÇariables–X‰are“upGdated.‘{dThis“leads“to“less“propagation“than“full‘XŠarc-consistency“tec¸ãhniques“(section“8.6.3,Ž¡‘øãpage–º172)“but“is›ºgenerally“more“ecien¸ãt“for“arithmetic.‘¡uThese˜arithmetic“constrain¸ãts“can“bGe“rei edŽ¡‘øã(section–UU8.7,“page“173).ޤ‘øãÄErrorsŽ¡‘øã²Refer–UUto“the“syn¸ãtax“of“arithmetic“FD“expressions“for“pGossible“errors“(section“8.6.1,“page“170).Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ8.6.3Ž‘‰F‘ÿ «ull–ÕTAš®9C:“Å(#=#)/2“Ä-“constrain˜t“equal,“Å(#\=#)/2“Ä-“constrain˜t“not“equal,ޤ ‘‰Å(#<#)/2–ÕTÄ-“constrainš®9t“less“than,“Å(#=<#)/2“Ä-“constrain˜t“less“than“or“equal,Ž¡‘‰Å(#>#)/2–ÕTÄ-“constrainš®9t“greater“than,“Å(#>=#)/2“Ä-“constrain˜t“greater“than“or“equalŽŸuT‘øãT‘ÿ «emplatesŽ©‘ã Å#=#(?fd‘¡E‰ff&fŽ–Ç«evaluable,‘?ý?fd‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #\=#(?fd‘¡E‰ff&fŽ–Ç«evaluable,‘?ý?fd‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #<#(?fd‘¡E‰ff&fŽ–Ç«evaluable,‘?ý?fd‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #=<#(?fd‘¡E‰ff&fŽ–Ç«evaluable,‘?ý?fd‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #>#(?fd‘¡E‰ff&fŽ–Ç«evaluable,‘?ý?fd‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #>=#(?fd‘¡E‰ff&fŽ–Ç«evaluable,‘?ý?fd‘¡E‰ff&fŽ“evaluable)ަ‘øãÄDescriptionޤ‘øãÅFdExpr1–?ý#=#“FdExpr2–UU²constrains“ÅFdExpr1“²to“bGe“equal“to“ÅFdExpr2².Ž¡‘øãÅFdExpr1–?ý#\=#“FdExpr2–UU²constrains“ÅFdExpr1“²to“bGe“di eren¸ãt“from“ÅFdExpr2².Ž¡‘øãÅFdExpr1–?ý#<#“FdExpr2–UU²constrains“ÅFdExpr1“²to“bGe“less“than“ÅFdExpr2².Ž¡‘øãÅFdExpr1–?ý#=<#“FdExpr2–UU²constrains“ÅFdExpr1“²to“bGe“less“than“or“equal“to“ÅFdExpr2².Ž¡‘øãÅFdExpr1–?ý#>#“FdExpr2–UU²constrains“ÅFdExpr1“²to“bGe“greater“than“ÅFdExpr2².Ž¡‘øãÅFdExpr1–?ý#>=#“FdExpr2–UU²constrains“ÅFdExpr1“²to“bGe“greater“than“or“equal“to“ÅFdExpr2².Ž¡‘øãÅFdExpr1–UU²and“ÅFdExpr2“²are“arithmetic“FD“expressions“(section“8.6.1,“page“170).Ž¡‘øãÅ#=#²,–UUÅ#\=#²,“Å#<#²,“Å#=<#²,“Å#>#“²and“Å#>=#“²are“prede ned“in x“opGerators“(section“7.14.10,“page“100).Ž¡‘øãThese–M—predicates›M˜pGost“arithmetic“constrain¸ãts“that˜are“managed“b¸ãy˜the“solv¸ãer“using“a˜full“arc-consistencyޤ ‘øãalgorithm–‚to“reduce“the“domain“of“in•¸ãv“olv“ed–‚v›ÿqÇariables.‘ðMIn“this“sc¸ãheme“the“full“domain“of“v˜ariables“isŽ¡‘øãupGdated.‘5ÁThis–¡Cleads“to“more“propagation“than“partial“arc-consistency“tec¸ãhniques“(section“8.6.1,‘ÅGpage“170)ŽŽŸŽŒ‹­ ‡ Ú‹– ý"EŸüfd‘øã²8.7‘ BoGolean–UUand“rei ed“constrain¸ãtsŽŽŽ’±!€173ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãbut–ý¬is›ý«generally“less“ecien¸ãt˜for“arithmetic.‘jËThese˜arithmetic“constrain¸ãts˜can“bGe“rei ed˜(section“8.7.1,Ž© ‘øãpage‘UU173).ޤ‘øãÄErrorsŽ¡‘øã²Refer–UUto“the“syn¸ãtax“of“arithmetic“FD“expressions“for“pGossible“errors“(section“8.6.1,“page“170).Ž¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ8.6.4Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«prime/1Ä,‘ÕTÅfd‘¡E‰ff&fŽ“not‘¡E‰ff&fŽ“prime/1ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åfd‘¡E‰ff&fŽ–Ç«prime(?fd‘¡E‰ff&fŽ“variable)ަ‘ã fd‘¡E‰ff&fŽ–Ç«not‘¡E‰ff&fŽ“prime(?fd‘¡E‰ff&fŽ“variable)Ž¡‘øãÄDescriptionޤ‘øãÅfd‘¡E‰ff&fŽ‘Ç«prime(X)–¼²constrain¸ãts›ðÅX“²to–ïbGe“a˜prime“n•¸ãum“b•Ger›ïb“et•¸ãw“een˜Å0..vector‘¡E‰ff&fŽ‘Ç«max².‘¿–This˜constrain“t˜enforces˜aަ‘øãsparse–UUrepresen¸ãtation“for“the“domain“of‘rÅX“²(section“8.1,“page“165).Ž¡‘øãÅfd‘¡E‰ff&fŽ–Ç«not‘¡E‰ff&fŽ“prime(X)–°Á²constrain¸ãts›±ÅX“²to˜bGe˜a˜non‘±prime˜n•¸ãum“b•Ger˜b“et•¸ãw“een˜Å0..vector‘¡E‰ff&fŽ‘Ç«max².‘…This˜constrain“tަ‘øãenforces–UUa“sparse“represen¸ãtation“for“the“domain“of‘rÅX“²(section“8.1,“page“165).Ž¡‘øãÄErrorsŽ¡‘øãŸ÷€‰ffÇ>|ŸfdŸ™œ„ ffŸüfd‘ÅX–UU²is“neither“an“FD“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýX)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|ŽŽŽ¡‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ'þ6‘øãÇ8.7Ž‘£Bo`olean–€and“rei ed“constrain tsޤuT‘øãÄ8.7.1Ž‘‰BoQÇolean–ÕTFD“expressionsŽ¡‘øã²An› b•Go“olean– FD‘ŸÚexpression“is˜a“Prolog˜term“built˜from“in¸ãtegers˜(0“for˜false,‘ÄJ1˜for“true),‘ÄKv‘ÿqÇariables“(Prolog˜orަ‘øãFD–æv‘ÿqÇariables),‘£partial›÷A¸ãC“arithmetic˜constrain¸ãts˜(section˜8.6.2,–£page˜171),“full˜A•¸ãC‘æarithmetic˜constrain“tsަ‘øã(section–v|8.6.3,‘¾Åpage“172)“and“functors‘v{(or“opšGerators)“that“represen¸ãt“b˜o˜olean“functions.‘Õ;When“a“sub-ަ‘øãexpression–ºof“a“b•Go“olean–ºexpression“is“an“arithmetic“constrain¸ãt“Éc‘¼r²,‘Qit“is“rei ed.‘ÍöNamely‘ÿ*ª,‘Qas“soGon“as“theަ‘øãsolv¸ãer–@Údetects›@Ùthat“Éc‘ýL²is˜true“(i.e.‘jóÈentaile‘ÿ}'d‘‰²)“the˜sub-expression“has“the˜v‘ÿqÇalue“Å1².‘jóSimilarly“when˜the“solv¸ãerަ‘øãdetects–„˜that“Éc‘A ²is“false“(i.e.‘ÿ‘Èdisentaile‘ÿ}'d‘‰²)“the“sub-expression“ev‘ÿqÇaluates›„™as“Å0².‘ÿWhile˜neither“the“en•¸ãtailmen“tަ‘øãnor–“the“disen•¸ãtailmen“t›“can–“bGe“detected“the˜sub-expression“is“ev‘ÿqÇaluated“as˜a“domain“Å0..1².‘,wThe“follo¸ãwingަ‘øãtable–UUdetails“the“compšGonen¸ãts“of“an“FD“b˜o˜olean“expression:ŽŽŸŽŒ‹® “ä Ú‹– ý"EŸüfd‘øã²174ŽŽŽ’¤=×8‘ FINITE–UUDOMAIN“SOL‘þãVER“AND“BUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý¶¨‘øãŸŸ€‰ff637¤fd¤™œ„ ff‘ŸüfdFD‘UUExpression‘N;¡„ ffŽ‘TÓõResult’ÄÿöŸ™œ„ ffŽŽ©‰ff637Ÿff‰ff637¡¤™œ„ ff‘ŸüfdProlog‘UUv‘ÿqÇariable‘¡„ ffŽ‘TÓõdomain‘UUÅ0..1’¨j©Ÿ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘Ÿüfd²FD–UUv‘ÿqÇariable“ÅX‘ À¡„ ffŽ‘TÓõ²domain–UUof‘rÅX²,“ÅX“²is“constrained“to“bGe“in“Å0..1‘#UMŸ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘Ÿüfd0‘UU²(in¸ãteger)‘ê´¡„ ffŽ‘TÓõÅ0‘UU²(false)’½c†Ÿ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘ŸüfdÅ1‘UU²(in¸ãteger)‘ê´¡„ ffŽ‘TÓõÅ1‘UU²(true)’¾Î1Ÿ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘ŸüfdÅ#\‘?ýE‘33¡„ ffŽ‘TÓõ²not‘UUÅE’ÉñÀŸ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘ŸüfdE1–?ý#<=>“E2‘‡E¡„ ffŽ‘TÓõE1–UU²equiv‘ÿqÇalen¸ãt“to“ÅE2’Œê¨Ÿ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘ŸüfdE1–?ý#\<=>“E2‘GH¡„ ffŽ‘TÓõE1–UU²not“equiv‘ÿqÇalenš¸ãt“to“ÅE2“²(i.e.‘qÇÅE1“²di eren˜t“from“ÅE2)‘Ÿ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘ŸüfdE1–?ý##“E2‘?¡„ ffŽ‘TÓõE1–UU²exclusivš¸ãe“OR“ÅE2“²(i.e.‘qÇÅE1“²not“equiv‘ÿqÇalen˜t“to“ÅE2)‘£‘Ÿ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘ŸüfdE1–?ý#==>“E2‘‡E¡„ ffŽ‘TÓõE1–UU²implies“ÅE2’¦±ÈŸ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘ŸüfdE1–?ý#\==>“E2‘GH¡„ ffŽ‘TÓõE1–UU²doGes“not“imply‘xâÅE2’„nŸ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘ŸüfdE1–?ý#/\“E2‘ÇB¡„ ffŽ‘TÓõE1–UU²AND“ÅE2’®ª­Ÿ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘ŸüfdE1–?ý#\/\“E2‘‡E¡„ ffŽ‘TÓõE1–UU²NAND“ÅE2’§*¬Ÿ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘ŸüfdE1–?ý#\/“E2‘ÇB¡„ ffŽ‘TÓõE1–UU²OR“ÅE2’¶*®Ÿ™œ„ ffŽŽ¦‰ff637¡¤™œ„ ff‘ŸüfdE1–?ý#\\/“E2‘‡E¡„ ffŽ‘TÓõE1–UU²NOR“ÅE2’®ª­Ÿ™œ„ ffŽŽ¦‰ff637ŽŽŽŸoØ*‘øã#<=>²,–,Å#\<=>²,›-Å##²,“Å#==>²,“Å#\==>²,“Å#/\²,˜Å#\/\²,“Å#\/–ý¢²and“Å#\\/“²are“prede ned“in x“opGerators.‘T‹Å#\“²is“a“prede nedޤ ‘øãpre x–UUopGerator“(section“7.14.10,“page“100).Ž©‘øãÄErrorsŽŸ4LÌ‘øãŸÙš‰ffÇ>|©fdŸ™œ„$ffŸäfd‘²a–UUsub-expression“ÅE“²is“neither“a“v‘ÿqÇariable“nor“anŽ¡‘in¸ãteger–UU(0“or“1)“nor“an“FD“b•Go“olean–UUfunctor“norŽ¡‘rei ed‘UUconstrain¸ãtŽŽ’㥄$ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable,‘?ýE)ŽŽ’ÆØŸ™œ„$ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘²an–UUexpression“is“toGo“complexŽŽ’㥄 ffŽ’éÒqÅresource‘¡E‰ff&fŽ–Ç«error(too‘¡E‰ff&fŽ“big‘¡E‰ff&fŽ“fd‘¡E‰ff&fŽ“constraint)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²a–UUsub-expression“is“an“inš¸ãv‘ÿqÇalid“rei ed“constrain˜tŽŽ’㥄ffŽ’éÒqan–UUarithmetic“constrain¸ãt“error“(section“8.6.1,Ž¡’éÒqpage‘UU170)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸCÉ‘øãÄ8.7.2Ž‘‰Å(#\)/1–ÕTÄ-“constrainš®9t“NOT,“Å(#<=>)/2“Ä-“constrain˜t“equiv‘ÿ\ralen˜t,Ž¡‘‰Å(#\<=>)/2–ÕTÄ-“constrainš®9t“di eren˜t,“Å(##)/2“Ä-“constrain˜t“X˜OR,Ž¡‘‰Å(#==>)/2–ÕTÄ-“constrainš®9t“imply‘ÿ «,“Å(#\==>)/2“Ä-“constrain˜t“not“imply‘ÿ «,Ž¡‘‰Å(#/\)/2–ÕTÄ-“constrainš®9t“AND,“Å(#\/\)/2“Ä-“constrain˜t“NAND,Ž¡‘‰Å(#\/)/2–ÕTÄ-“constrainš®9t“OR,“Å(#\\/)/2“Ä-“constrain˜t“NORŽŸuT‘øãT‘ÿ «emplatesŽŸÌÑã Å#\(?fd‘¡E‰ff&fŽ–Ç«bool‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #<=>(?fd‘¡E‰ff&fŽ–Ç«bool‘¡E‰ff&fŽ“evaluable,‘?ý?fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #\<=>(?fd‘¡E‰ff&fŽ–Ç«bool‘¡E‰ff&fŽ“evaluable,‘?ý?fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable)Ž¡‘ã ##(?fd‘¡E‰ff&fŽ–Ç«bool‘¡E‰ff&fŽ“evaluable,‘?ý?fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #==>(?fd‘¡E‰ff&fŽ–Ç«bool‘¡E‰ff&fŽ“evaluable,‘?ý?fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #\==>(?fd‘¡E‰ff&fŽ–Ç«bool‘¡E‰ff&fŽ“evaluable,‘?ý?fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #/\(?fd‘¡E‰ff&fŽ–Ç«bool‘¡E‰ff&fŽ“evaluable,‘?ý?fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #\/\(?fd‘¡E‰ff&fŽ–Ç«bool‘¡E‰ff&fŽ“evaluable,‘?ý?fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #\/(?fd‘¡E‰ff&fŽ–Ç«bool‘¡E‰ff&fŽ“evaluable,‘?ý?fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable)Ž¡‘ã #\\/(?fd‘¡E‰ff&fŽ–Ç«bool‘¡E‰ff&fŽ“evaluable,‘?ý?fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable)ŽŸÌ‘øãÄDescriptionަ‘øãÅ#\=‘?ýFdBoolExpr1–UU²constrain¸ãts“ÅFdBoolExpr1“²to“bGe“false.ަ‘øãÅFdBoolExpr1–?ý#<=>“FdBoolExpr2–UU²constrains“ÅFdBoolExpr1“²to“bGe“equiv‘ÿqÇalen¸ãt“to“ÅFdBoolExpr2².ަ‘øãÅFdBoolExpr1–?ý#\<=>“FdBoolExpr2–UU²constrains“ÅFdBoolExpr1“²to“bGe“equiv‘ÿqÇalen¸ãt“to“not“ÅFdBoolExpr2².ަ‘øãÅFdBoolExpr1–?ý##“FdBoolExpr2–UU²constrains“ÅFdBoolExpr1“²X¸ãOR“ÅFdBoolExpr2“²to“bGe“trueŽŽŸŽŒ‹¯ žó Ú‹– ý"EŸüfd‘øã²8.7‘ BoGolean–UUand“rei ed“constrain¸ãtsŽŽŽ’±!€175ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅFdBoolExpr1–?ý#==>“FdBoolExpr2–UU²constrains“ÅFdBoolExpr1“²to“imply‘xâÅFdBoolExpr2².ޤ‘øãÅFdBoolExpr1–?ý#\==>“FdBoolExpr2–UU²constrains“ÅFdBoolExpr1“²to“not“imply‘xâÅFdBoolExpr2².Ž¡‘øãÅFdBoolExpr1–?ý#/\“FdBoolExpr2–UU²constrains“ÅFdBoolExpr1“²AND“ÅFdBoolExpr2“²to“bGe“true.Ž¡‘øãÅFdBoolExpr1–?ý#\/\“FdBoolExpr2–UU²constrains“ÅFdBoolExpr1“²AND“ÅFdBoolExpr2“²to“bGe“false.Ž¡‘øãÅFdBoolExpr1–?ý#\/“FdBoolExpr2–UU²constrains“ÅFdBoolExpr1“²OR“ÅFdBoolExpr2“²to“bGe“true.Ž¡‘øãÅFdBoolExpr1–?ý#\\/“FdBoolExpr2–UU²constrains“ÅFdBoolExpr1“²OR“ÅFdBoolExpr2“²to“bGe“false.Ž¡‘øãÅFdBoolExpr1–UU²and“ÅFdBoolExpr2“²are“b•Go“olean–UUFD“expressions“(section“8.7.1,“page“173).Ž¡‘øãNote–UUthat“Å#\<=>“²(not“equiv‘ÿqÇalenš¸ãt)“and“Å##“²(exclusiv˜e“or)“are“synon˜ymous.Ž¡‘øãThese–.Úpredicates‘.ÙpšGost“b˜o˜olean“constrain¸ãts›.Ùthat“are“managed˜bš¸ãy“the“FD‘._solv˜er“using“a‘.Ùpartial“arc-ޤ ‘øãconsistency–Oalgorithm“to“reduce›O the“domain“of“in•¸ãv“olv“ed‘Ov‘ÿqÇariables.‘^òThe˜(dis)en“tailmen“t–Oof“rei ed“con-Ž¡‘øãstrain¸ãts–éis›êdetected“using“either˜the“bGounds˜(for“partial“A•¸ãC‘¹arithmetic˜constrain“ts)–éor“the˜full“domainŽ¡‘øã(for–UUfull“Aš¸ãC“arithmetic“constrain˜ts).Ž©‘øãÅ#<=>²,–,Å#\<=>²,›-Å##²,“Å#==>²,“Å#\==>²,“Å#/\²,˜Å#\/\²,“Å#\/–ý¢²and“Å#\\/“²are“prede ned“in x“opGerators.‘T‹Å#\“²is“a“prede nedŽ¡‘øãpre x–UUopGerator“(section“7.14.10,“page“100).ަ‘øãÄErrorsަ‘øã²Refer–UUto“the“syn¸ãtax“of“b•Go“olean–UUFD“expressions“for“pGossible“errors“(section“8.7.1,“page“173).ަ‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ8.7.3Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«cardinality/2Ä,›ÕTÅfd‘¡E‰ff&fŽ“cardinality/3Ä,˜Åfd‘¡E‰ff&fŽ“at‘¡E‰ff&fŽ“least‘¡E‰ff&fŽ“one/1Ä,˜Åfd‘¡E‰ff&fŽ“at‘¡E‰ff&fŽ“most‘¡E‰ff&fŽ“one/1Ä,Ž¡‘‰Åfd‘¡E‰ff&fŽ–Ç«only‘¡E‰ff&fŽ“one/1ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åfd‘¡E‰ff&fŽ–Ç«cardinality(+fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable‘¡E‰ff&fŽ“list,‘?ý?fd‘¡E‰ff&fŽ“variable)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«cardinality(+integer,›?ý?fd‘¡E‰ff&fŽ“variable,˜+integer)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«at‘¡E‰ff&fŽ“least‘¡E‰ff&fŽ“one(+fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable‘¡E‰ff&fŽ“list)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«at‘¡E‰ff&fŽ“most‘¡E‰ff&fŽ“one(+fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable‘¡E‰ff&fŽ“list)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«only‘¡E‰ff&fŽ“one(+fd‘¡E‰ff&fŽ“bool‘¡E‰ff&fŽ“evaluable‘¡E‰ff&fŽ“list)ަ‘øãÄDescriptionŽ©‘øãÅfd‘¡E‰ff&fŽ‘Ç«cardinality(List,‘?ýCount)–Ãh²uni es›ÃiÅCount“²with“the“n•¸ãum“bGer˜of›Ãhconstrain“ts˜that˜are‘Ãitrue˜in˜ÅList².Ž¡‘øãThis–Lis“equiv‘ÿqÇalenš¸ãt“to“pGost“the“constrain˜t“ÅBŸÿ±1Ž– ¼pÅ+›?ýBŸÿ±2Ž“Å+˜...+˜BŸÿ´nŽ‘ ±{Å#=˜Count‘L²where–Leac¸ãh“v‘ÿqÇariable“ÅBi“²is“a“newŽ¡‘øãv‘ÿqÇariable–Pzde ned›Pyb¸ãy“the˜constrain¸ãt“ÅBŸÿ´iŽ‘”IÅ#<=>‘?ýCŸÿ´iŽ›¤Å²where“ÅCŸÿ´iŽ˜²is“the“ÅiÈth‘ܲconstrainš¸ãt“of‘–ÅList².‘p)Eac˜h–PyÅCŸÿ´iŽ‘¤Æ²m˜ust“bGe‘PzaŽ¡‘øãb•Go“olean–UUFD“expression“(section“8.7.1,“page“173).ަ‘øãÅfd‘¡E‰ff&fŽ›Ç«cardinality(Lower,–?ýList,“Upper)–5²is“equiv‘ÿqÇalen¸ãt‘4to“Åfd‘¡E‰ff&fŽ˜cardinality(List,–?ýCount),“Lower“#=<Ž¡‘øãCount,–?ýCount“#=<“Upperަ‘øãfd‘¡E‰ff&fŽ–Ç«at‘¡E‰ff&fŽ“least‘¡E‰ff&fŽ“one(List)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åfd‘¡E‰ff&fŽ‘Ç«cardinality(List,–?ýCount),“Count“#>=“1².ަ‘øãÅfd‘¡E‰ff&fŽ–Ç«at‘¡E‰ff&fŽ“most‘¡E‰ff&fŽ“one(List)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åfd‘¡E‰ff&fŽ‘Ç«cardinality(List,–?ýCount),“Count“#=<“1².ŽŽŸŽŒ‹° ²9 Ú‹– ý"EŸüfd‘øã²176ŽŽŽ’¤=×8‘ FINITE–UUDOMAIN“SOL‘þãVER“AND“BUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅfd‘¡E‰ff&fŽ–Ç«only‘¡E‰ff&fŽ“one(List)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åfd‘¡E‰ff&fŽ‘Ç«cardinality(List,‘?ý1)².ޤ‘øãÄErrorsŽŸGLË‘øãŸÆ›‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅList–UU²is“a“partial“listŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘List–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýList)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Count–UU²is“neither“an“FD“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýCount)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Lower–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Lower–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýLower)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Upper–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Upper–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýUpper)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemenš¸ãt“ÅE“²of“the“ÅList“²list“is“an“in˜v‘ÿqÇalidŽŸ ‘b•Go“olean‘UUexpressionŽŽ’㥄ffŽ’éÒqan–UUFD“b•Go“olean–UUconstrain¸ãt“(section“8.7.1,ŽŸ ’éÒqpage‘UU173)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸI>’‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ'þ6‘øãÇ8.8Ž‘£Sym• b`olic‘€constrain“tsޤuT‘øãÄ8.8.1Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«all‘¡E‰ff&fŽ“different/1Ž¡‘øãÄT‘ÿ «emplatesޤ‘ã Åfd‘¡E‰ff&fŽ–Ç«all‘¡E‰ff&fŽ“different(+fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list)Ž¡‘øãÄDescriptionŽ©‘øãÅfd‘¡E‰ff&fŽ–Ç«all‘¡E‰ff&fŽ“different(List)–׉²constrains›׊all“v‘ÿqÇariables˜in“ÅList“²to˜tak¸ãe“distinct˜v‘ÿqÇalues.‘ødThis“is˜equiv‘ÿqÇalen¸ãt“toޤ ‘øãpGosting–¹4an‘¹5inequalitš¸ãy“constrain˜t“for“eac˜h›¹5pair“of“v‘ÿqÇariables.‘eThis˜constrain¸ãt“is“triggered“when˜a“v‘ÿqÇariableŽ¡‘øãbGecomes–UUground,“remo¸ãving“its“v›ÿqÇalue“from“the“domain“of“the“other“v˜ariables.ަ‘øãÄErrorsŽŸ(LÌ‘øãŸåš‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅList–UU²is“a“partial“listŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘List–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýList)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–F÷elemen¸ãt›FöÅE‘Fó²of“the˜ÅList“²list˜is“neither˜a“v‘ÿqÇariableŽŸ ‘nor–UUan“in¸ãteger“nor“an“FD“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸ*>“‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ8.8.2Ž‘‰Åfd‘¡E‰ff&fŽ‘Ç«element/3ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åfd‘¡E‰ff&fŽ–Ç«element(?fd‘¡E‰ff&fŽ“variable,›?ý+integer‘¡E‰ff&fŽ“list,˜?fd‘¡E‰ff&fŽ“variable)Ž¡‘øãÄDescriptionަ‘øãÅfd‘¡E‰ff&fŽ‘Ç«element(I,–?ýList,“X)–UU²constrainš¸ãts“ÅX“²to“bGe“equal“to“the“ÅIÈth‘¸²in˜teger“(from“1)“of‘rÅList².ަ‘øãÄErrorsŽŽŸŽŒ‹± Á[ Ú‹– ý"EŸüfd‘øã²8.8‘ Sym•¸ãbGolic‘UUconstrain“tsŽŽŽ’±!€177ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýŽÕw‘øãŸÆ³4‰ffÇ>|¤fdŸ™œ„ffŸðfd‘ÅI–UU²is“neither“a“v›ÿqÇariable“nor“an“FD“v˜ariable“nor“anŽŸ ‘in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýI)ŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ffŸðfd‘X–UU²is“neither“a“v›ÿqÇariable“nor“an“FD“v˜ariable“nor“anŽŸ ‘in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýX)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘List–UU²is“a“partial“list“or“a“list“with“an“elemen¸ãt“ÅEŽŸ ‘²whic¸ãh–UUis“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘List–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýList)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–F÷elemen¸ãt›FöÅE‘Fó²of“the˜ÅList“²list˜is“neither˜a“v‘ÿqÇariableŽŸ ‘nor–UUan“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸH¤ù‘øãÄP•®9ortabilit“yŽ©‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ8.8.3Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«element‘¡E‰ff&fŽ“var/3ŽŸuT‘øãÄT‘ÿ «emplatesޤ‘ã Åfd‘¡E‰ff&fŽ–Ç«element‘¡E‰ff&fŽ“var(?fd‘¡E‰ff&fŽ“variable,›?ý+fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list,˜?fd‘¡E‰ff&fŽ“variable)Ž¡‘øãÄDescriptionަ‘øãÅfd‘¡E‰ff&fŽ–Ç«element‘¡E‰ff&fŽ“var(I,–?ýList,“X)–·ã²constrain¸ãts›¸>ÅX“²to˜bGe˜equal˜to˜the˜ÅIÈth‘|¢²v‘ÿqÇariable˜(from˜1)˜of‘[ÅList².‘šƒThisޤ ‘øãconstrainš¸ãt–Æ„is“similar“to“Åfd‘¡E‰ff&fŽ‘Ç«element/3“²(section“8.8.2,‘âÏpage“176)“but“ÅList“²can“also“con˜tain“FD‘Ægv‘ÿqÇariablesŽ¡‘øã(rather–UUthan“just“in¸ãtegers).ަ‘øãÄErrorsŽŸ@³2‘øãŸÌ³4‰ffÇ>|©fdŸ™œ„ffŸðfd‘ÅI–UU²is“neither“a“v›ÿqÇariable“nor“an“FD“v˜ariable“nor“anŽ¡‘in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýI)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘X–UU²is“neither“a“v›ÿqÇariable“nor“an“FD“v˜ariable“nor“anŽ¡‘in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýX)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘List–UU²is“a“partial“listŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¤‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘List–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýList)ŽŽ’ÆØŸ™œ„ ffŽŽ¡‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–F÷elemen¸ãt›FöÅE‘Fó²of“the˜ÅList“²list˜is“neither˜a“v‘ÿqÇariableŽŸ ‘nor–UUan“in¸ãteger“nor“an“FD“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸB¤ù‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicate.ŽŸ%þ6‘øãÄ8.8.4Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«atmost/3Ä,›ÕTÅfd‘¡E‰ff&fŽ“atleast/3Ä,˜Åfd‘¡E‰ff&fŽ“exactly/3ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åfd‘¡E‰ff&fŽ–Ç«atmost(+integer,›?ý+fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list,˜+integer)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«atleast(+integer,›?ý+fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list,˜+integer)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«exactly(+integer,›?ý+fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list,˜+integer)ަ‘øãÄDescriptionޤ‘øãÅfd‘¡E‰ff&fŽ‘Ç«atmost(N,–?ýList,“V)–UU²pGosts“the“constrain¸ãt“that“at“most“ÅN“²v›ÿqÇariables“of‘rÅList“²are“equal“to“the“v˜alue“ÅV².Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«atleast(N,–?ýList,“V)‘,¼²pGosts–,Æthe›,Çconstrain¸ãt“that“at“least˜ÅN‘,¼²v‘ÿqÇariables“of‘óãÅList˜²are“equal“to“the˜v‘ÿqÇalue“ÅV².ŽŽŸŽŒ‹² Ïš Ú‹– ý"EŸüfd‘øã²178ŽŽŽ’¤=×8‘ FINITE–UUDOMAIN“SOL‘þãVER“AND“BUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅfd‘¡E‰ff&fŽ‘Ç«exactly(N,–?ýList,“V)‘,à²pGosts–,êthe“constrain¸ãt“that“at“exactly‘PwÅN‘,ß²v›ÿqÇariables“of‘ôÅList“²are“equal“to“the“v˜alueޤ ‘øãÅV².Ž©‘øãThese–ºconstrain¸ãts“are›»spGecial“cases“of‘à×Åfd‘¡E‰ff&fŽ‘Ç«cardinality/2˜²(section“8.7.3,‘%¦page“175)˜but“their“implemen¸ãta-Ž¡‘øãtion–UUis“more“ecien¸ãt.ަ‘øãÄErrorsŽŸA˜‘øãŸÌLΉffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅN–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘N–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýN)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘V–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘V–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýV)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘List–UU²is“a“partial“listŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘List–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýList)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–F÷elemen¸ãt›FöÅE‘Fó²of“the˜ÅList“²list˜is“neither˜a“v‘ÿqÇariableŽŸ ‘nor–UUan“FD“v‘ÿqÇariable“nor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸC _‘øãÄP•®9ortabilit“yަ‘øã²GNU–UUProlog“predicates.ŽŸ%þ6‘øãÄ8.8.5Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«relation/2Ä,‘ÕTÅfd‘¡E‰ff&fŽ“relationc/2ŽŸuT‘øãÄT‘ÿ «emplatesŽ©‘ã Åfd‘¡E‰ff&fŽ–Ç«relation(+integer‘¡E‰ff&fŽ“list‘¡E‰ff&fŽ“list,‘?ý?fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«relationc(+integer‘¡E‰ff&fŽ“list‘¡E‰ff&fŽ“list,‘?ý?fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list)ަ‘øãÄDescriptionŽ©‘øãÅfd‘¡E‰ff&fŽ‘Ç«relation(Relation,‘?ýVars)–Ö¹²constrain¸ãts›Öºthe“tuple“of˜v‘ÿqÇariables“ÅVars˜²to“bGe“equal˜to“one“tuple˜of“theŽ¡‘øãlist–UUÅRelation².‘qÇA“tuple“is“represenš¸ãted“b˜y“a“list.ަ‘øãExample:‘qÇde nition–UUof“the“b•Go“olean–UUAND“relation“so“that“X“AND“Y“¸,“²Z:Ž©‘ã Åand(X,Y,Z):-Ž¡‘;âñfd_relation([[0,0,0],[0,1,0],[1,0,0],[1,1,1]],‘?ý[X,Y,Z]).ަ‘øãfd‘¡E‰ff&fŽ›Ç«relationc(Columns,‘?ýVars)–G{²is“similar“to‘G|Åfd‘¡E‰ff&fŽ˜relation/2“²except“that“the“relation“is‘G|not“giv¸ãen“as“theŽ¡‘øãlist–UUof“tuples“but“as“the“list“of“the“columns“of“the“relation.‘qÇA“column“is“represenš¸ãted“b˜y“a“list.ŽŸ‘øãExample:ަ‘ã Åand(X,Y,Z):-Ž¡‘;âñfd_relationc([[0,0,1,1],[0,1,0,1],[0,0,0,1]],‘?ý[X,Y,Z]).ަ‘øãÄErrorsŽŸFæe‘øãŸÆ€‰ffÇ>|©fdŸ™œ„ffŸðfd‘ÅRelation–UU²is“a“partial“list“or“a“list“with“aŽ¡‘sub-term–UUÅE“²whic¸ãh“is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘Relation–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýRelation)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅRelation“²list“is“neither“aŽ¡‘v‘ÿqÇariable–UUnor“an“in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘Vars–UU²is“a“partial“listŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ¤‰ffÇ>|¦Ÿ™œ„ ffŸüfd‘Vars–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýVars)ŽŽ’ÆØŸ™œ„ ffŽŽ¡‰ffÇ>|¦Ÿ™œ„ffŸðfd‘²an–F÷elemen¸ãt›FöÅE‘Fó²of“the˜ÅVars“²list˜is“neither˜a“v‘ÿqÇariableŽŸ ‘nor–UUan“in¸ãteger“nor“an“FD“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŽŸŽŒ‹³ Þö Ú‹– ý"EŸüfd‘øã²8.9‘ LabGeling‘UUconstrain¸ãtsŽŽŽ’±!€179ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄP•®9ortabilit“yŽŸ‘øã²GNU–UUProlog“predicates.ŽŸ'þ6‘øãÇ8.9Ž‘£Lab`eling‘€constrain tsޤuT‘øãÄ8.9.1Ž‘‰Åfd‘¡E‰ff&fŽ–Ç«labeling/2Ä,›ÕTÅfd‘¡E‰ff&fŽ“labeling/1Ä,˜Åfd‘¡E‰ff&fŽ“labelingff/1Ž¡‘øãÄT‘ÿ «emplatesŽ©‘ã Åfd‘¡E‰ff&fŽ–Ç«labeling(+fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list,‘?ý+fd‘¡E‰ff&fŽ“labeling‘¡E‰ff&fŽ“option‘¡E‰ff&fŽ“list)ޤ ‘ã fd‘¡E‰ff&fŽ–Ç«labeling(+fd‘¡E‰ff&fŽ“variable,‘?ý+fd‘¡E‰ff&fŽ“labeling‘¡E‰ff&fŽ“option‘¡E‰ff&fŽ“list)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«labeling(+fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«labeling(+fd‘¡E‰ff&fŽ“variable)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«labelingff(+fd‘¡E‰ff&fŽ“variable‘¡E‰ff&fŽ“list)Ž¡‘ã fd‘¡E‰ff&fŽ–Ç«labelingff(+fd‘¡E‰ff&fŽ“variable)ަ‘øãÄDescriptionŽ©‘øãÅfd‘¡E‰ff&fŽ‘Ç«labeling(Vars,‘?ýOptions)–LƲassigns“a“v›ÿqÇalue“to‘LÅeac¸ãh“v˜ariable“ÅX‘LIJof“the“list“ÅVars‘LŲaccording“to“the“list“ofŽ¡‘øãlabGeling–á×options“givš¸ãen“b˜y‘dÅOptions².›KHÅVars“²can“bGe“also“a“single‘áÖFD‘áºv‘ÿqÇariable.˜This“predicate“is“re-executableŽ¡‘øãon‘UUbac•¸ãktrac“king.ަ‘øãÄFD‘ðlabQÇeling‘options²:‘ÝÅOptions–Šõ²is›Šöa“list˜of“labGeling˜options.‘¨If˜this“list˜conš¸ãtains“con˜tradictory‘Šöoptions,Ž¡‘øãthe–UUrighš¸ãtmost“option“is“the“one“whic˜h“applies.‘qÇP˜ossible“options“are:ŽŸ‘ã¸ŽŽŽ‘ã Åvariable‘¡E‰ff&fŽ‘Ç«method(V)²:–UUspGeci es“the“heuristics“to“select“the“v‘ÿqÇariable“to“en¸ãumerate:Ž¡‘# Ä{ŽŽŽ‘'ã Åstandard²:‘qÇno–UUheuristics,“the“leftmost“v‘ÿqÇariable“is“selected.Ž©‘# Ä{ŽŽŽ‘'ã Åfirst‘¡E‰ff&fŽ‘Ç«fail–~p²(or“Åff²):‘Ãüselects“the“v‘ÿqÇariable“with“the“smallest“n•¸ãum“bGer›~pof‘~oelemen“ts˜in˜its˜domain.Ž¡‘'ã If–UUsevš¸ãeral“v‘ÿqÇariables“ha˜v˜e“the“same“n˜um˜bGer“of“elemen˜ts“the“leftmost“v‘ÿqÇariable“is“selected.ަ‘# Ä{ŽŽŽ‘'ã Åmost‘¡E‰ff&fŽ–Ç«constrained²:‘P/lik¸ãe›ĉÅfirst‘¡E‰ff&fŽ“fail‘Ĉ²but˜when˜sev•¸ãeral˜v‘ÿqÇariables˜ha“v“e˜the‘Ĉsame˜n“um“bGer˜ofŽ¡‘'ã elemenš¸ãts–UUselects“the“v‘ÿqÇariable“that“appGears“in“most“constrain˜ts.ަ‘# Ä{ŽŽŽ‘'ã Åsmallest²:‘Rselects–òthe“v‘ÿqÇariable›ñthat“has“the˜smallest“v‘ÿqÇalue“in“its˜domain.‘\¦If“there“is˜more“thanŽ¡‘'ã one–UUsuc¸ãh“v›ÿqÇariable“selects“the“v˜ariable“that“appGears“in“most“constrain¸ãts.ަ‘# Ä{ŽŽŽ‘'ã Ålargest²:‘«ÿselects–rqthe“v›ÿqÇariable‘rpthat“has“the“greatest“v˜alue“in“its“domain.‘ÉIf“there“is“more“thanŽ¡‘'ã one–UUsuc¸ãh“v›ÿqÇariable“selects“the“v˜ariable“that“appGears“in“most“constrain¸ãts.ަ‘# Ä{ŽŽŽ‘'ã Åmax‘¡E‰ff&fŽ‘Ç«regret²:‘©@selects–ñthe“v‘ÿqÇariable›ñthat“has“the“greatest˜di erence“bGet•¸ãw“een–ñthe˜smallest“v‘ÿqÇalueŽ¡‘'ã and–ƒGthe“next“v›ÿqÇalue“of“its“domain.‘ûIf‘ƒHthere“is“more“than“one“suc¸ãh“v˜ariable“selects“the“v˜ariableŽ¡‘'ã that–UUappGears“in“most“constrain¸ãts.ަ‘# Ä{ŽŽŽ‘'ã Årandom²:›qÇselects–UUrandomly“a“v‘ÿqÇariable.˜Eacš¸ãh“v‘ÿqÇariable“is“only“c˜hosen“once.ŽŸ‘ã The–UUdefault“v‘ÿqÇalue“is“Åstandard².Ž©‘ã¸ŽŽŽ‘ã Åreorder(true/false)²:‘d€spGeci es–N±if›N²the“v‘ÿqÇariable˜heuristics“should“dynamically˜reorder“the˜list“ofŽ¡‘ã v‘ÿqÇariable–JO(Åtrue²)›JNor“not˜(Åfalse²).‘nDynamic“reordering“is˜generally“more˜ecien¸ãt“but˜in“some˜cases“aŽ¡‘ã static–UUordering“is“faster.‘qÇThe“default“v‘ÿqÇalue“is“Åtrue².ަ‘ã¸ŽŽŽ‘ã Åvalue‘¡E‰ff&fŽ‘Ç«method(V)²:–UUspGeci es“the“heuristics“to“select“the“v›ÿqÇalue“to“assign“to“the“c¸ãhosen“v˜ariable:Ž¡‘# Ä{ŽŽŽ‘'ã Åmin²:‘qÇen¸ãumerates–UUthe“v‘ÿqÇalues“from“the“smallest“to“the“greatest“(default).ޤ‘# Ä{ŽŽŽ‘'ã Åmax²:‘qÇen¸ãumerates–UUthe“v‘ÿqÇalues“from“the“greatest“to“the“smallest.Ž¡‘# Ä{ŽŽŽ‘'ã Åmiddle²:‘qÇen¸ãumerates–UUthe“v‘ÿqÇalues“from“the“middle“to“the“bGounds.Ž¡‘# Ä{ŽŽŽ‘'ã Åbounds²:‘qÇen¸ãumerates–UUthe“v‘ÿqÇalues“from“the“bGounds“to“the“middle.Ž¡‘# Ä{ŽŽŽ‘'ã Årandom²:›qÇen¸ãumerates–UUthe“v‘ÿqÇalues“randomly‘ÿ*ª.˜Eac¸ãh“v‘ÿqÇalue“is“only“tried“once.ŽŸ‘ã The–UUdefault“v‘ÿqÇalue“is“Åmin².ŽŽŸŽŒ‹´ ïó Ú‹– ý"EŸüfd‘øã²180ŽŽŽ’¤=×8‘ FINITE–UUDOMAIN“SOL‘þãVER“AND“BUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã¸ŽŽŽ‘ã Åbacktracks(B)²:–UUuni es“ÅB“²with“the“n•¸ãum“bGer–UUof“bac•¸ãktrac“ks–UUduring“the“en¸ãumeration.Ž©&t‘øãÅfd‘¡E‰ff&fŽ›Ç«labeling(Vars)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åfd‘¡E‰ff&fŽ˜labeling(Vars,‘?ý[])².ޤ‘øãÅfd‘¡E‰ff&fŽ›Ç«labelingff(Vars)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åfd‘¡E‰ff&fŽ˜labeling(Vars,‘?ý[variable‘¡E‰ff&fŽ˜method(ff)])².Ž¡‘øãÄErrorsŽŸLæe‘øãŸÀ€‰ffÇ>|¤fdŸ™œ„ffŸðfd‘ÅVars–UU²is“a“partial“list“or“a“list“with“an“elemen¸ãt“ÅEŽŸ ‘²whic¸ãh–UUis“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Vars–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýVars)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–F÷elemen¸ãt›FöÅE‘Fó²of“the˜ÅVars“²list˜is“neither˜a“v‘ÿqÇariableŽŸ ‘nor–UUan“in¸ãteger“nor“an“FD“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ffŸðfd‘Options–U0²is“a›U/partial“list“or“a“list˜with“an“elemen¸ãtŽŸ ‘ÅE–UU²whic¸ãh“is“a“v‘ÿqÇariableŽŽ’㥄ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Options–UU²is“neither“a“partial“list“nor“a“listŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(list,‘?ýOptions)ŽŽ’ÆØŸ™œ„ ffŽŽŸ‰ffÇ>|¡Ÿ™œ„ffŸðfd‘²an–UUelemen¸ãt“ÅE“²of“the“ÅOptions“²list“is“neither“aŽŸ ‘v‘ÿqÇariable–UUnor“a“labGeling“optionŽŽ’㥄ffŽ’éÒqÅdomain‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“labeling‘¡E‰ff&fŽ“option,‘?ýE)ŽŽ’ÆØŸ™œ„ffŽŽ¦‰ffÇ>|ŽŽŽŸNØ,‘øãÄP•®9ortabilit“yŽ¡‘øã²GNU–UUProlog“predicates.ŽŸ'Ïa‘øãÇ8.10Ž‘cOptimization‘€constrain tsޤuT‘øãÄ8.10.1Ž‘!ƇÅfd‘¡E‰ff&fŽ–Ç«minimize/2Ä,‘ÕTÅfd‘¡E‰ff&fŽ“maximize/2Ž¡‘øãÄT‘ÿ «emplatesަ‘ã Åfd‘¡E‰ff&fŽ–Ç«minimize(+callable‘¡E‰ff&fŽ“term,‘?ý?fd‘¡E‰ff&fŽ“variable)ޤ ‘ã fd‘¡E‰ff&fŽ–Ç«maximize(+callable‘¡E‰ff&fŽ“term,‘?ý?fd‘¡E‰ff&fŽ“variable)ަ‘øãÄDescriptionŽ©‘øãÅfd‘¡E‰ff&fŽ‘Ç«minimize(Goal,‘?ýX)‘+òrepGeatedly–+úcalls“ÅGoal“²to“ nd‘+ûa“v›ÿqÇalue“that“minimizes“the“v˜ariable‘+ûÅX².“ÅGoal“²is“aŽ¡‘øãProlog–C-goal›C.that“should˜instan¸ãtiate“ÅX²,“a˜common“case˜bGeing“the“use˜of‘ JÅfd‘¡E‰ff&fŽ‘Ç«labeling/2˜²(section“8.9.1,Ž¡‘øãpage–ô„179).‘ OUThis“predicate“uses“a‘ô…brancš¸ãh-and-bGound“algorithm“with“restart:‘°&eac˜h“time“Åcall(Goal)Ž¡‘øã²succeeds–p“the“computation›p”restarts“with“a“new“constrain¸ãt˜ÅX–?ý#<“V–pŒ²where‘p“ÅV“²is˜the–p“v‘ÿqÇalue“of‘7°ÅX‘pŒ²at˜the“end“ofŽ¡‘øãthe–åÇlast›åÈcall“of‘¬äÅGoal².‘L™When“a“failure˜ošGccurs“(either“b˜ecause›åÈthere“are˜no“remaining“c•¸ãhoice-pGoin“ts˜for‘åÇÅGoalŽ¡‘øã²or–úbGecause“the‘ûadded“constrainš¸ãt“is“inconsisten˜t“with“the›ûrest“of“the“store)“the“last˜solution“is“recomputedŽ¡‘øãsince–UUit“is“optimal.ަ‘øãÅfd‘¡E‰ff&fŽ›Ç«maximize(Goal,‘?ýX)–UU²is“similar“to“Åfd‘¡E‰ff&fŽ˜minimize/2“²but“ÅX“²is“maximizedÅ.ަ‘øãÄErrorsŽŸ@ÿ‘øãŸÌæg‰ffÇ>|¤fdŸ™œ„ ffŸüfd‘ÅGoal–UU²is“a“v‘ÿqÇariableŽŽ’㥄 ffŽ’éÒqÅinstantiation‘¡E‰ff&fŽ‘Ç«errorŽŽ’ÆØŸ™œ„ ffŽŽ©‰ffÇ>|¡Ÿ™œ„ ffŸüfd‘Goal–UU²is“neither“a“v‘ÿqÇariable“nor“a“callable“termŽŽ’㥄 ffŽ’éÒqÅtype‘¡E‰ff&fŽ‘Ç«error(callable,‘?ýGoal)ŽŽ’ÆØŸ™œ„ ffŽŽ¦‰ffÇ>|¡Ÿ'™œ„0ffŸØfd‘²The–UUpredicate“indicator“ÅPred“²of‘rÅGoal“²doGes“notޤ ‘correspšGond–UUto“an“existing“pro˜cedure“and“theŽ¡‘v‘ÿqÇalue–UUof“the“Åunknown“²Prolog“ ag“is“ÅerrorŽ¡‘²(section–UU7.22.1,“page“133)ŽŽ’㥄0ffŽ’éÒqÅexistence‘¡E‰ff&fŽ‘Ç«error(procedure,‘?ýPred)ŽŽ’ÆØŸ'™œ„0ffŽŽŸ(‰ffÇ>|¡Ÿ™œ„ffŸðfd‘X–UU²is“neither“a“v›ÿqÇariable“nor“an“FD“v˜ariable“nor“anŽŸ ‘in¸ãtegerŽŽ’㥄ffŽ’éÒqÅtype‘¡E‰ff&fŽ–Ç«error(fd‘¡E‰ff&fŽ“variable,‘?ýX)ŽŽ’ÆØŸ™œ„ffŽŽŸ‰ffÇ>|ŽŽŽŸBqÆ‘øãÄP•®9ortabilit“yŽŽŸŽŒ‹µ ë Ú‹– ý"EŸüfd‘øã²8.10‘ Optimization‘UUconstrain¸ãtsŽŽŽ’±!€181ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãGNU–UUProlog“predicates.ŽŽŸŽŒ‹¶  Ú‹– ý"EŸüfd‘øã²182ŽŽŽ’¤=×8‘ FINITE–UUDOMAIN“SOL‘þãVER“AND“BUIL›ÿ*ªT-IN“PREDICA˜TESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ»ŸŽŒ‹· ã Ú‹– ý"EŸüfd’±!€²183ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øã¼9Ž‘/ÒInŒÌterfacing–ffProlog“and“CŽŸ#ç‘øãÇ9.1Ž‘£Calling–€C“from“PrologޤuT‘øãÄ9.1.1Ž‘‰In®9troQÇductionŽ¡‘øã²This–UUinš¸ãterface“allo˜ws“a“Prolog“predicate“to“call“a“C“function.‘qÇHere“are“some“features“of“this“facilit˜y:Ž©êì‘ã¸ŽŽŽ‘ã ²implicit–UUProlog“¸$“²C“data“con•¸ãv“ersions–UUfor“simple“t¸ãypGes.ޤuv‘ã¸ŽŽŽ‘ã ²functions–UUto“handle“complex“t¸ãypGes.Ž¡‘ã¸ŽŽŽ‘ã ²error–UUdetection“depšGending“on“the“t¸ãyp˜e“of“the“argumen¸ãt.Ž¡‘ã¸ŽŽŽ‘ã ²di erenš¸ãt–UUkinds“of“argumen˜ts:‘qÇinput,“output“or“input/output.Ž¡‘ã¸ŽŽŽ‘ã ²pšGossibilit¸ãy–UUto“write“non-deterministic“co˜de.ަ‘øãThis–*ùin¸ãterface“can“then“bšGe‘*úused“to“write“b˜oth“simple“and“complex“C–*Âroutines.‘ò´A“simple–*ùroutine“usesޤ ‘øãeither–²\input›²]or“output˜argumenš¸ãts“whic˜h‘²]t˜ypGe“is›²]simple.‘;uIn“that˜case“the˜user“doGes˜not“need˜anš¸ãy“kno˜wledgeŽ¡‘øãof–ŒÞProlog›Œßdata“structures“since“all˜Prolog“¸$“²C‘ŒÐdata“con•¸ãv“ersions–ŒÞare˜implicitly“ac•¸ãhiev“ed.‘cT‘ÿ*ªo‘ŒÞmanipulateŽ¡‘øãcomplex›ºÕterms–ºÔ(lists,‘Ô5structures)“a˜set“of˜functions˜is“pro¸ãvided.‘¢FFinally“it˜is˜also“pGossible˜to“write˜non-Ž¡‘øãdeterministic–UUC“coGde.ŽŸ%TX‘øãÄ9.1.2Ž‘‰Åforeign/2‘ÕTÄdirectiv®9eŽŸuT‘øãÅforeign/2–²directivš¸ãe“(section“6.1.14,‘Œ~page“45)“declares“a“C‘›function‘in˜terface.‘ ÂøThe“general“form“isŽ¡‘øãÅforeign(Template,‘?ýOptions)–˜²whicš¸ãh“de nes‘˜an“in˜terface“predicate“whose“protot˜ypGe‘˜is“ÅTemplate“²ac-Ž¡‘øãcording–qLto“the‘qMoptions“givš¸ãen“b˜y‘”ÙÅOptions².‘Å­ÅTemplate“²is“a“callable“term“spGecifying‘qMthe“t˜yp•Ge/mo“de–qLof“eac˜hŽ¡‘øãargumen¸ãt–UUof“the“assoGciated“Prolog“predicate.ŽŸ‘øãÄF‘ÿ «oreign‘¢Åoptions²:‘×ÅOptions–ú²is›ùa“list“of“foreign“options.‘‰¶If“this˜list“conš¸ãtains“con˜tradictory“options,‘4£theŽ¡‘øãrighš¸ãtmost–UUoption“is“the“one“whic˜h“applies.‘qÇP˜ossible“options“are:ަ‘ã¸ŽŽŽ‘ã Åfct‘¡E‰ff&fŽ‘Ç«name(F)²:–´ÅF‘£²is›µan“atom“represen¸ãting˜the“name“of˜the“C‘£function“to˜call.‘ZçBy“default“the˜name“ofŽ¡‘ã the–eàC‘eÛfunction›eßis“the“same˜as“the˜principal“functor˜of‘,ýÅTemplate².‘£gIn˜an¸ãy“case,‘jthe˜atom“assoGciatedŽ¡‘ã with–UUthe“name“of“the“function“mš¸ãust“conforms“to“the“syn˜tax“of“C“iden˜ti ers.Ž©uv‘ã¸ŽŽŽ‘ã Åreturn(boolean²/Ånone²/Åjump)²:‘qÇspGeci es–UUthe“v‘ÿqÇalue“returned“b¸ãy“the“C“function:Ž¡‘# Ä{ŽŽŽ‘'ã Åboolean²:‘qÇthe–UUt¸ãypGe“of“the“function“is“ÅBool“²(returns“ÅTRUE“²on“success,“ÅFALSE“²otherwise).ޤuv‘# Ä{ŽŽŽ‘'ã Ånone²:‘qÇthe–UUt¸ãypGe“of“the“function“is“Åvoid“²(no“returned“v‘ÿqÇalue).Ž¡‘# Ä{ŽŽŽ‘'ã Åjump²:‘DŠthe–úÛt¸ãypGe›úÚof“the“function˜is“Åvoid(*)()“²(returns˜the“address“of˜a“Prolog“coGde˜to“execute).ŽŸuv‘ã The–UUdefault“v‘ÿqÇalue“is“Åboolean².ަ‘ã¸ŽŽŽ‘ã Åbip‘¡E‰ff&fŽ‘Ç«name(Name,‘?ýArity)²:‘PYinitializes–ythe›xerror“con¸ãtext“with“ÅName˜²and“ÅArity².‘[~If“an˜error“oGccurs“thisޤ ‘ã information–Cšis›C™used“to“indicate“from˜whic¸ãh“predicate“the“error˜oGccurred“(section“5.3.1,‘G%page“37).‘kÞItŽ¡‘ã is–;“also“pGossible›;”to“prev•¸ãen“t–;“the“initialization˜of“the“error“con¸ãtext“using‘_!Åbip‘¡E‰ff&fŽ‘Ç«name(none)².‘i1By“defaultŽ¡‘ã ÅName–UU²and“ÅArity“²are“set“to“the“functor“and“arit¸ãy“of‘rÅTemplate².ަ‘ã¸ŽŽŽ‘ã Åchoice‘¡E‰ff&fŽ‘Ç«size(N)²:–pthis›pžoption“spGeci es“that“the˜function“implemen¸ãts“a˜non-deterministic“coGde.‘àÅN‘p–²isŽ¡‘ã an–œinš¸ãteger“spGecifying“the“size“needed“b˜y“the“non-deterministic“C‘‡function.‘VŠThis“facilit˜y“is“explainedŽ¡‘ã later–UU(section“9.1.7,“page“186).‘qÇBy“default“a“foreign“function“is“deterministic.ŽŸêì‘øãÅforeign(Template)–UU²is“equiv‘ÿqÇalen¸ãt“to“Åforeign(Template,‘?ý[])².ŽŸ‘øãÄF‘ÿ «oreign–ÔumošQÇdes‘Ôvand“t®9yp˜es²:‘-|eac•¸ãh›3/argumen“t–30of‘úLÅTemplate˜²spGeci es˜the“foreign˜mo•Gde˜and˜t¸ãyp“e‘30of˜theŽ¡‘øãcorrespGonding–¢argumenš¸ãt.‘XThis“information“is“used“to“c˜hec˜k“the“t˜ypGe“of“e ectiv˜e“argumen˜ts“at“run-timeŽ¡‘øãand–Ç¿to›ǾpGerform“Prolog˜¸$“²C‘Çšdata“con•¸ãv“ersions.‘B•Eac“h‘Ç¿argumen“t˜of‘ŽÜÅTemplate˜²is–Ç¿formed˜with“a˜mošGde“sym¸ãb˜olŽ¡‘øãfollo•¸ãw“ed›UUb“y˜a˜t“ypGe˜name.‘qÇP“ossible˜foreign˜moGdes˜are:ŽŽŸŽŒ‹¸ › Ú‹– ý"EŸüfd‘øã²184ŽŽŽ’h9‘ INTERF‘þãA•¸ãCING›UUPR“OLOG˜AND˜CŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã¸ŽŽŽ‘ã Å+²:‘qÇinput‘UUargumen¸ãt.ޤ‘ã¸ŽŽŽ‘ã Å-²:‘qÇoutput‘UUargumen¸ãt.Ž¡‘ã¸ŽŽŽ‘ã Å?²:‘qÇinput/output‘UUargumen¸ãt.Ž¡‘øãPš¸ãossible–UUforeign“t˜ypGes“are:ޤ|>‘øãŸ“‰ffµNN¤fd¤™œ„ ff‘ŸüfdF‘ÿ*ªoreign‘UUt¸ãypGe‘¡„ ffŽ‘I°dProlog‘UUt¸ãypGe‘2N@Ÿ™œ„ ffŽ’µeC‘UUt¸ãypGe‘ÇŸ™œ„ ffŽ’áKhDescription–UUof“the“C“t¸ãypGe‘dŸ™œ„ ffŽŽ©‰ffµNNŸff‰ffµNN¡¤™œ„ ff‘ŸüfdÅinteger‘#«¡„ ffŽ‘I°d²in¸ãteger‘GŽEŸ™œ„ ffŽ’µeÅlong‘úŸ™œ„ ffŽ’áKh²v‘ÿqÇalue–UUof“the“in¸ãteger‘j¯Ÿ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅpositive‘㮡„ ffŽ‘I°d²pGositiv•¸ãe‘UUin“teger‘"Ž@Ÿ™œ„ ffŽ’µeÅlong‘úŸ™œ„ ffŽ’áKh²v‘ÿqÇalue–UUof“the“in¸ãteger‘j¯Ÿ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅfloat‘"£¥¡„ ffŽ‘I°d² oating–UUpGoinš¸ãt“n˜um˜bGer‘Ÿ™œ„ ffŽ’µeÅdouble‘Ÿ™œ„ ffŽ’áKh²v‘ÿqÇalue–UUof“the“ oating“pGoinš¸ãt“n˜um˜bGer‘=ÜjŸ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅnumber‘c¨¡„ ffŽ‘I°d²n•¸ãum“bGer‘D8œ„ ffŽ’µeÅdouble‘Ÿ™œ„ ffŽ’áKh²v‘ÿqÇalue–UUof“the“n•¸ãum“bGer‘|XŸ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅatom‘'㢡„ ffŽ‘I°d²atom‘O`Ÿ™œ„ ffŽ’µeÅint‘¿÷Ÿ™œ„ ffŽ’áKh²in•¸ãternal›UUk“ey˜of˜the˜atom‘iÀŸ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅboolean‘#«¡„ ffŽ‘I°d²b•Go“olean‘Cj³Ÿ™œ„ ffŽ’µeÅint‘¿÷Ÿ™œ„ ffŽ’áKh²v‘ÿqÇalue–UUof“the“b•Go“olean–UU(0=Åfalse²,“1=Åtrue²)‘!@Ÿ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅchar‘'㢡„ ffŽ‘I°d²c¸ãharacter‘<øïŸ™œ„ ffŽ’µeÅint‘¿÷Ÿ™œ„ ffŽ’áKh²v‘ÿqÇalue–UUof“(the“coGde“of‘Ç)“the“c¸ãharacter‘8œnŸ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅcode‘'㢡„ ffŽ‘I°d²c¸ãharacter‘UUcoGde‘%ê´Ÿ™œ„ ffŽ’µeÅint‘¿÷Ÿ™œ„ ffŽ’áKh²v‘ÿqÇalue–UUof“the“c¸ãharacter-coGde‘]ÇŸ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅbyte‘'㢡„ ffŽ‘I°d²b¸ãyte‘Rj·Ÿ™œ„ ffŽ’µeÅint‘¿÷Ÿ™œ„ ffŽ’áKh²v‘ÿqÇalue–UUof“the“b¸ãyte’ŠG!Ÿ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅin‘¡E‰ff&fŽ‘Ç«char‘›ý¡„ ffŽ‘I°d²in-c¸ãharacter‘1NCŸ™œ„ ffŽ’µeÅint‘¿÷Ÿ™œ„ ffŽ’áKh²v‘ÿqÇalue–UUof“the“c¸ãharacter“or“Å-1“²for“end-of- le‘;Ÿ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅin‘¡E‰ff&fŽ‘Ç«code‘›ý¡„ ffŽ‘I°d²in-c¸ãharacter‘UUcoGde‘@Ÿ™œ„ ffŽ’µeÅint‘¿÷Ÿ™œ„ ffŽ’áKh²v‘ÿqÇalue–UUof“the“c¸ãharacter-coGde“or“Å-1“²for“end-of- le‘Ÿ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅin‘¡E‰ff&fŽ‘Ç«byte‘›ý¡„ ffŽ‘I°d²in-b¸ãyte‘FÀ Ÿ™œ„ ffŽ’µeÅint‘¿÷Ÿ™œ„ ffŽ’áKh²v‘ÿqÇalue–UUof“the“b¸ãyte“or“Å-1“²for“the“end-of- le‘!GŸ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅstring‘c¨¡„ ffŽ‘I°d²atom‘O`Ÿ™œ„ ffŽ’µeÅchar‘?ý*‘Ÿ™œ„ ffŽ’áKh²C–UUstring“con¸ãtaining“the“name“of“the“atom‘N0Ÿ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅchars‘"£¥¡„ ffŽ‘I°d²c¸ãharacter‘UUlist‘,@ Ÿ™œ„ ffŽ’µeÅchar‘?ý*‘Ÿ™œ„ ffŽ’áKh²C–UUstring“conš¸ãtaining“the“c˜haracters“of“the“list‘1ÁŸ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅcodes‘"£¥¡„ ffŽ‘I°d²c¸ãharacter-coGde‘UUlist‘1ÏŸ™œ„ ffŽ’µeÅchar‘?ý*‘Ÿ™œ„ ffŽ’áKh²C–UUstring“conš¸ãtaining“the“c˜haracters“of“the“list‘1ÁŸ™œ„ ffŽŽ¦‰ffµNN¡¤™œ„ ff‘ŸüfdÅterm‘'㢡„ ffŽ‘I°d²Prolog‘UUterm‘0ã–Ÿ™œ„ ffŽ’µeÅPlTerm‘Ÿ™œ„ ffŽ’áKh²generic–UUProlog“term‘}G!Ÿ™œ„ ffŽŽ¦‰ffµNNŽŽŽ¡‘øãÄSimple–-Yforeign“t®9ypQÇe²:‘(¾a–ÃCsimple‘ÃBtš¸ãypGe“is“an˜y“foreign‘ÃBt˜ypšGe“listed“in“the‘ÃBab˜o•¸ãv“e–ÃCtabled“except“Återm².‘AA‘Ãsimpleޤ ‘øãforeign–ðtš¸ãypGe“is‘ð€an“atomic“term“(c˜haracter‘ð€and“c˜haracter-coGde“lists“are“in‘ð€fact“lists“of“constan˜ts).‘CFEac˜hŽ¡‘øãsimple–UUforeign“tš¸ãypGe“is“con˜v˜erted“to/from“a“C“t˜ypGe“to“simplify“the“writing“of“the“C“function.Ž©‘øãÄComplex‘¤ðforeign‘¤ñt®9ypQÇe²:‘Ú×tš¸ãypGe– Ýforeign“t˜ypGe“Återm“²refers“to‘ Üan˜y“Prolog“term“(e.g.‘_lists,‘6ÿstructures.–ªª.“.“).Ž¡‘øãWhen–ÑUsucš¸ãh‘ÑTan“t˜ypšGe“is‘ÑTsp˜eci ed“the“argumen¸ãt›ÑTis“passed“to˜the“C‘Ñ5function“as˜a“ÅPlTerm“²(GNU‘Ñ4Prolog“CŽ¡‘øãt•¸ãypGe›Ž‘equiv‘ÿqÇalen“t˜to‘Ža˜Ålong²).‘{Sev“eral˜functions‘Žare˜pro“vided˜to˜manipulate˜ÅPlTerm‘޲v‘ÿqÇariables˜(section˜9.2,Ž¡‘øãpage–[À190).‘…Since“the“original“term“is“passed“to“the‘[¿function“it“is“pGossible“to“read“its“v‘ÿqÇalue“or“to“unify“it.Ž¡‘øãSo–ä&the›ä'meaning“of“the˜mošGde“sym¸ãb˜ol“is›ä'less“signi can¸ãt.‘;F‘ÿ*ªor“this˜reason“it“is˜pGossible“to“omit˜the“moGdeŽ¡‘øãsymš¸ãbGol.‘qÇIn–UUthat“case“Återm“²is“equiv‘ÿqÇalen˜t“to“Å+term².ŽŸ%þ6‘øãÄ9.1.3Ž‘‰The–ÕTC“functionŽŸuT‘øã²The–FxC›FtcoGde“is‘Fywritten“in“a“C˜ le“whicš¸ãh“m˜ust“ rst“include“the“GNU‘FuProlog“header“ le“called“Ågprolog.h².Ž¡‘øãThis–UU le“conš¸ãtains“all“GNU“Prolog“C“de nitions“(constan˜ts,“t˜ypGes,“protot˜ypGes,.–ªª.“.“).ަ‘øãThe–BØtš¸ãypGe“returned‘BÙb˜y“a“C‘B›function“depGends“on“the›BÙv‘ÿqÇalue“of“the“Åreturn“²foreign˜option“(section“9.1.2,Ž¡‘øãpage–ŒN183).‘´If“it“is›ŒOÅboolean“²then˜the“C‘Œ@function˜is“of˜t¸ãypGe“ÅBool“²and˜shall“return˜ÅTRUE‘Œ@²in“case˜of“successŽ¡‘øãand–!ÅFALSE›²otherwise.‘õ,If“the“Åreturn“²option“is‘"Ånone“²the“C˜function“is“of“t¸ãypGe›"Åvoid².‘õ+Finally“if˜it“is“Åjump²,Ž¡‘øãthe–2Õfunction›2Ôshall“return“the˜address“of˜a“Prolog“predicate˜and,‘9»at“the“exit˜of“the“function,‘9»the˜con¸ãtrol“isŽ¡‘øãgiv¸ãen–UUto“that“predicate.ަ‘øãThe–]2tš¸ãypGe‘]1of“the“argumen˜ts“of›]1the“C‘\îfunction˜depGends“on“the˜mošGde“and“t¸ãyp˜e“declaration‘]1sp˜eci ed“inŽ¡‘øãÅTemplate–UU²for“the“correspGonding“argumenš¸ãt“as“explained“in“the“follo˜wing“sections.ŽŽŸŽŒ‹¹ % Ú‹– ý"EŸüfd‘øã²9.1‘ Calling–UUC“from“PrologŽŽŽ’±!€185ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ9.1.4Ž‘‰Input‘ÕTargumen®9tsŽ©uT‘øã²An–Ÿçinput›Ÿèargumen¸ãt“is“tested˜at“run-time“to˜c•¸ãhec“k–Ÿçif“its˜t¸ãypGe“conforms“to˜the“foreign“t¸ãypGe˜and“thenޤ ‘øãit–°·is›°¶passed“to˜the“C‘°]function.‘ƒìThe˜t¸ãypGe“of˜the“assoGciated“C‘°]argumen¸ãt˜is“giv•¸ãen˜b“y‘°·the˜abGo“v“e‘°·tableŽ¡‘øã(section–79.1.2,›Hïpage“183).‘ºmF‘ÿ*ªor“instance,˜the“e ectiv•¸ãe‘6argumen“t–7ÅArg“²assoGciated“with“Å+positive“²foreignŽ¡‘øãdeclaration–UUis“submitted“to“the“follo¸ãwing“proGcess:ޤ‘ã¸ŽŽŽ‘ã ²if‘rÅArg–UU²is“a“v‘ÿqÇariable“an“Åinstantiation‘¡E‰ff&fŽ‘Ç«error“²is“raised.Ž¡‘ã¸ŽŽŽ‘ã ²if‘rÅArg–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãteger“a“Åtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýArg)“²is“raised.Ž¡‘ã¸ŽŽŽ‘ã ²if‘rÅArg–UU²is“an“in¸ãteger“µ<“²0“a“Ådomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýArg)–UU²is“raised.Ž¡‘ã¸ŽŽŽ‘ã ²otherwise–UUthe“v‘ÿqÇalue“of‘rÅArg“²is“passed“to“the“C“is“passed“to“the“C“function“as“an“in¸ãteger“(Ålong²).Ž¡‘øãWhen–ËÅ+string›Ë²is“spGeci ed˜the“string“passed˜to“the“function˜is“the˜in¸ãternal“string“of˜the“correspGondingޤ ‘øãatom–UUand“should“not“bšGe“mo˜di ed.ŽŸ‘øãWhen–SÅ+term“²is“spšGeci ed“the“term“passed“to“the“function‘Sis“the“original“Prolog“term.‘k"It“can“b˜e“readŽ¡‘øãand/or–UUuni ed.‘qÇIt“is“also“the“case“when“Återm“²is“spšGeci ed“without“an¸ãy“mo˜de“sym¸ãb˜ol.ŽŸ%þ6‘øãÄ9.1.5Ž‘‰Output‘ÕTargumen®9tsަ‘øã²An–¯êoutput›¯éargumen¸ãt“is˜tested“at˜run-time“to˜c•¸ãhec“k–¯êif˜its“t¸ãypGe“conforms˜to“the˜foreign“t¸ãypGe˜and“it˜is“uni edŽ¡‘øãwith–ìÝthe›ìÞv‘ÿqÇalue“set“b¸ãy“the˜C‘ì¶function.‘8`The“t¸ãypGe“of˜the“assoGciated“C‘ì¶argumen¸ãt˜is“a“pGoin¸ãter“to˜the“t¸ãypGeŽ¡‘øãgiv•¸ãen›ÅÌb“y‘ÅËthe˜abGo“v“e–ÅËtable˜(section“9.1.2,–áépage˜183).‘Ã*F‘ÿ*ªor˜instance,“the‘ÅËe ectiv•¸ãe˜argumen“t‘ÅËÅArg˜²assoGciatedŽ¡‘øãwith–UUÅ-positive“²foreign“declaration“is“handled“as“follo¸ãws:ޤ‘ã¸ŽŽŽ‘ã ²if‘rÅArg–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãteger“a“Åtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýArg)“²is“raised.Ž¡‘ã¸ŽŽŽ‘ã ²if‘rÅArg–UU²is“an“in¸ãteger“µ<“²0“a“Ådomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýArg)–UU²is“raised.Ž¡‘ã¸ŽŽŽ‘ã ²otherwise– a“pGoinš¸ãter“to“an“in˜teger“(Ålong“*²)“is“passed“to“the‘ C‘ûfunction.‘_If“the“function“returns“ÅTRUEŽ© ‘ã ²the–UUin¸ãteger“stored“at“this“loGcation“is“uni ed“with“ÅArg².Ž¡‘øãWhen–QÅ-term“²is“spGeci ed,‘"the“function‘Rmš¸ãust“construct“a“term“in˜to“the‘Rits“correspGonding“argumen˜t“(whic˜hަ‘øãis–Y*of“t•¸ãypGe›Y)ÅPlTerm‘?ý*²).‘}FA“t–Y*the˜exit“of“the“function“this˜term“will“bGe“uni ed“with˜the“actual“predicateަ‘øãargumen¸ãt.ŽŸ%þ6‘øãÄ9.1.6Ž‘‰Input/output‘ÕTargumen®9tsŽŸuT‘øã²Basically–pƒan“input/output“argumenš¸ãt“is“treated“as‘p‚in“input“argumen˜t“if“it“is“not“a“v‘ÿqÇariable,‘wNas“an“outputަ‘øãargumenš¸ãt–ݯotherwise.‘ ÔThe“t˜ypšGe‘Ý®of“the“asso˜ciated›Ý®C‘ÝŒargumen¸ãt“is˜a“pGoin¸ãter“to˜a“ÅFIOArg“²(GNU‘Ý‹Prolog“Cަ‘øãtš¸ãypGe)–UUde ned“as“follo˜ws:Ž¡‘ã Åtypedef‘?ýstructަ‘&âý{ަ‘,"úBool‘?ýis_var;ަ‘,"úBool‘?ýunify;ަ‘,"úunionަ‘;âñ{ަ‘A"îlong‘¿÷l;ަ‘A"îchar‘ ú*s;ަ‘A"îdouble‘?ýd;ަ‘;âñ}value;ަ‘&âý}FIOArg;ŽŽŸŽŒ‹º <ó Ú‹– ý"EŸüfd‘øã²186ŽŽŽ’h9‘ INTERF‘þãA•¸ãCING›UUPR“OLOG˜AND˜CŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãThe–= eld›<Åis‘¡E‰ff&fŽ‘Ç«var“²is“set˜to“ÅTRUE‘ ²if˜the“argumen¸ãt“is˜a“v‘ÿqÇariable“and˜ÅFALSE‘ ²otherwise.‘®~This“v‘ÿqÇalue˜can“bGeޤ ‘øãtested–?b¸ãy›>the“C‘+function“to“determine˜whicš¸ãh“treatmen˜t“to–>pGerform.‘XThe“ eld–?Åunify“²con˜trols‘>whether“theŽ¡‘øãe ectiv•¸ãe›I›argumen“t‘Iœm“ust˜bGe˜uni ed–Iœat˜the˜exit˜of“the˜C‘I˜function.‘mßInitially‘m(Åunify˜²is“set˜to˜the“same˜v‘ÿqÇalueŽ¡‘øãas–þcÅis‘¡E‰ff&fŽ‘Ç«var›þb²(i.e.‘lða“v‘ÿqÇariable˜argumen¸ãt“will“bGe˜uni ed“while“a˜non-v‘ÿqÇariable“argumen¸ãt˜will“not)“but˜it“canŽ¡‘øãb•Ge›£2mo“di ed–£1b¸ãy˜the“C‘£function.‘[]The“ eld˜Åvalue“²stores˜the“v‘ÿqÇalue˜of“the˜argumen¸ãt.‘[\It˜is“declared˜as“a˜CŽ¡‘øãÅunion–ô²²since“there‘ô±are“sevš¸ãeral“kinds“of“v‘ÿqÇalue“t˜ypGes.‘QThe“ eld“Ås“²is“used‘ô±for“C‘ôšstrings,‘Åd“²for“C‘ô™doubles“and“ÅlŽ¡‘øã²otherwise›b¯(Åint²,–fÅlong²,“ÅPlTerm²).‘™Öif‘)ÍÅis‘¡E‰ff&fŽ‘Ç«var˜²is˜ÅFALSE‘b¬²then–b°Åvalue˜²con¸ãtains˜the“input˜v‘ÿqÇalue˜of“the˜argumen¸ãtŽ¡‘øãwith–Þbthe›Þcsame“con•¸ãv“en“tions–Þbas˜for“input˜argumenš¸ãts“(section“9.1.4,‘ö-page“185).‘J!A˜t›Þcthe“exit˜of“the“function,‘ö-ifŽ¡‘øãunify–Véis“ÅTRUE“value“²m•¸ãust›Vêcon“tain–Véthe“v‘ÿqÇalue“to“unify˜with“the“same“con•¸ãv“en“tions–Véas˜for“output“argumen¸ãtsŽ¡‘øã(section–UU9.1.5,“page“185).ŽŸ‘øãF‘ÿ*ªor–Wæinstance,‘˜Šthe‘Wçe ectivš¸ãe“argumen˜t“ÅArg“²assoGciated›Wçwith“Å?positive“²foreign“declaration˜is“handled“asŽ¡‘øãfollo¸ãws:Ž©¿]‘ã¸ŽŽŽ‘ã ²if‘W ÅArg–ï²is“a›ðv‘ÿqÇariable“Åis‘¡E‰ff&fŽ‘Ç«var“²and“Åunify“²are“set˜to“ÅTRUE›ž²else“to“ÅFALSE˜²and“its‘ðv‘ÿqÇalue“is“copied“inŽ¡‘ã Åvalue.l².ޤ_¯‘ã¸ŽŽŽ‘ã ²if‘rÅArg–UU²is“neither“a“v‘ÿqÇariable“nor“an“in¸ãteger“a“Åtype‘¡E‰ff&fŽ‘Ç«error(integer,‘?ýArg)“²is“raised.ŽŸ_®‘ã¸ŽŽŽ‘ã ²if‘rÅArg–UU²is“an“in¸ãteger“µ<“²0“a“Ådomain‘¡E‰ff&fŽ–Ç«error(not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýArg)–UU²is“raised.Ž¡‘ã¸ŽŽŽ‘ã ²otherwise–—àa“pGoin¸ãter“to›—áthe“ÅFIOArg“²(ÅFIOArg“*²)“is“passed˜to“the“C‘—Ïfunction.‘9iIf“the“function“returnsޤ ‘ã ÅTRUE–UU²and“if‘rÅunify“²is“TR¸ãUE“the“v‘ÿqÇalue“stored“in“Åvalue.l“²is“uni ed“with“ÅArg².ŽŸ%Jø‘øãÄ9.1.7Ž‘‰W‘ÿ «riting–ÕTnon-deterministic“C“coQÇdeŽŸuT‘øã²The›øóin•¸ãterface‘øòallo“ws˜the–øòuser˜to“write˜non-deterministic“C‘øÛcoGde.‘RüWhen“a˜C‘øÛfunction“is˜non-deterministic,Ž¡‘øãa›%c•¸ãhoice-pGoin“t˜is˜created˜for˜this˜function.‘Š8When˜a˜failure˜oGccurs,‘4Ùif˜all˜more˜recen“t˜non-deterministicŽ¡‘øãcoGde›I are–I nished,‘…ûthe“function˜is“re-in•¸ãv“ok“ed.‘LðIt–Iis˜then“impGortan¸ãt˜to“inform˜Prolog“when˜there“is˜noŽ¡‘øãmore›Uüsolution–Uû(i.e.‘s»no“more˜c¸ãhoice)“for˜a˜non-deterministic“coGde.‘s»So,‘–%when“no˜more“c¸ãhoices˜remainsŽ¡‘øãthe–ãåfunction‘ãämš¸ãust“remo˜v˜e‘ãäthe“c˜hoice-pGoin˜t.‘vThe‘ãäin˜terface“incremen˜ts‘ãäa“coun˜ter‘ãäeac˜h“time‘ãäthe“functionŽ¡‘øãis›†¶re-in•¸ãv“ok“ed.‘èA“t˜the–†µ rst˜call“this˜coun¸ãter“is˜equal˜to“0.‘éThis“information˜allo¸ãws“the˜function“to˜detectŽ¡‘øãits–nË rst“call.‘¾(When“writing“non-deterministic–nÊcošGde,‘u)it“is–nËoften“useful“to“record‘nÊdata“b˜et•¸ãw“een‘nËconsecutiv“eŽ¡‘øãre-in•¸ãv“oGcations–qPof“the›qOfunction.‘ŸThe“in•¸ãterface˜main“tains–qPa“bu er“to˜record“suc¸ãh“an“information.‘Å·The“sizeŽ¡‘øãof–ŸCthis›ŸDbu er“is˜givš¸ãen“b˜y›ÂÑÅchoice‘¡E‰ff&fŽ‘Ç«size(N)‘Ÿ0²when“using˜Åforeign/2“²(section–ŸD9.1.2,‘±¾page“183).‘O’This“size‘ŸCisŽ¡‘øãthe›Xn•¸ãum“bGer˜of˜(consecutiv“e)‘YÅlongÈs‘×y²needed˜b“y˜the˜C‘Dfunction.‘WInside˜the˜function˜it˜is‘YpGossible˜to˜call˜theŽ¡‘øãfollo¸ãwing‘UUfunctions/macros:ަ‘ã Åvoid‘?ýGet_Choice_Counter(void)Ž¡‘ã TYPE–?ýGet_Choice_Buffer“(TYPE)Ž¡‘ã void‘?ýNo_More_Choice‘ÿô(void)ަ‘øã²The–UUfunction“ÅGet‘¡E‰ff&fŽ–Ç«Choice‘¡E‰ff&fŽ“Counter()–UU²returns“the“v‘ÿqÇalue“of“the“in•¸ãv“oGcation›UUcoun“ter˜(0˜at˜the˜ rst˜call).ޤ‘øãThe–UUmacro“ÅGet‘¡E‰ff&fŽ–Ç«Choice‘¡E‰ff&fŽ“Buffer(ÉTYPE›¼rÅ)–UU²returns“a“pGoin¸ãter“to“the“bu er“(casted“to“ÉTYPE˜²).Ž¡‘øãThe–UUfunction“ÅNo‘¡E‰ff&fŽ–Ç«More‘¡E‰ff&fŽ“Choice()–UU²deletes“the“cš¸ãhoice“pGoin˜t“assoGciated“with“the“function.ŽŸ%Jø‘øãÄ9.1.8Ž‘‰Example:‘pinput–ÕTand“output“argumen®9tsŽŸuT‘øã²All–)”examples“presen¸ãted“here›)“can“bGe“found“in“the“ÅExamplesC‘)‰²sub-directory˜of“the“distribution,‘2Tin“the“ lesŽ© ‘øãÅexamp.pl–UU²(Prolog“part)“and“Åexamp‘¡E‰ff&fŽ‘Ç«c.c“²(C“part).Ž¡‘øãLet–I[us›IZde ne“a“predicate˜Åfirst‘¡E‰ff&fŽ‘Ç«occurrence(A,–?ýC,“P)–IX²whic¸ãh‘I[uni es˜ÅP“²with–I[the˜pGosition“(from“0)˜of“theަ‘øã rst–UUoGccurrence“of“the“cš¸ãharacter“ÅC“²in“the“atom“ÅA².“The“predicate“m˜ust“fail“if‘rÅC“²došGes“not“app˜ear“in“ÅA².Ž¡‘øãIn–UUthe“prolog“ le“Åexamp.pl²:ŽŽŸŽŒ‹» Jô Ú‹– ý"EŸüfd‘øã²9.1‘ Calling–UUC“from“PrologŽŽŽ’±!€187ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Å:-–?ýforeign(first‘¡E‰ff&fŽ‘Ç«occurrence(+string,“+char,“-positive)).Ž©-I‘øã²In–UUthe“C“ le“Åexamp‘¡E‰ff&fŽ‘Ç«c.c²:ŽŸ-H‘ã Å#include‘?ýޤ ‘ã #include‘?ý"gprolog.h"Ž¡¡‘ã BoolŽ¡‘ã first_occurrence(char–?ý*str,“long“c,“long“*pos)Ž¡‘ã {Ž¡‘cchar‘?ý*p;Ž¡¡‘cp–?ý=“strchr(str,“c);Ž¡‘cif–?ý(p“==“NULL)‘SÿÐ/*“C“does“not“appear“in“A“*/Ž¡‘&âýreturn–?ýFALSE;‘N¿Ó/*“fail“*/Ž¡¡‘c*pos–?ý=“p“-“str;‘N¿Ó/*“set“the“output“argument“*/Ž¡‘creturn–?ýTRUE;‘^Ê/*“succeed“*/Ž¡‘ã }ަ‘øã²The–UUcompilation“proGduces“an“executable“called“Åexamp²:ŽŸ-H‘ã Å%–?ýgplc“examp.pl“examp‘¡E‰ff&fŽ‘Ç«c.cަ‘øã²Examples–UUof“use:ަ‘ã Å|–?ý?-“first_occurrence(prolog,“p,“X).Ž¡¡‘ã X–?ý=“0Ž¡¡‘ã |–?ý?-“first_occurrence(prolog,“k,“X).Ž¡¡‘ã noŽ¡¡‘ã |–?ý?-“first_occurrence(prolog,“A,“X).Ž¡‘ã {exception:‘?ýerror(instantiation_error,first_occurrence/3)}Ž¡¡‘ã |–?ý?-“first_occurrence(prolog,“1“,X).Ž¡‘ã {exception:‘?ýerror(type_error(character,1),first_occurrence/3)}ŽŸ%ÐÙ‘øãÄ9.1.9Ž‘‰Example:‘pnon-deterministic‘ÕTcoQÇdeŽŸuT‘øã²W‘ÿ*ªe–«‘here›«de ne“a“predicate˜Åoccurrence(A,–?ýC,“P)–«9²whic¸ãh‘«‘uni es˜ÅP“²with–«‘the˜pGosition“(from“0)˜of“oneŽ¡‘øãoGccurrence–Œ!of“the›Œ"c¸ãharacter“ÅC‘‹î²in“the˜atom“ÅA².“The“predicate˜will“fail“if‘S>ÅC‘‹ï²došGes“not“app˜ear“in‘Œ"ÅA².“The“predicateŽ¡‘øãis–Îre-executable›Íon“bac•¸ãktrac“king.‘_šThe˜information–Îthat“m¸ãust˜bšGe“recorded“b˜et•¸ãw“een‘Ít“w“o‘Îin“v“o˜cations‘Íof‘ÎtheŽ¡‘øãfunction–UUis“the“next“starting“pGosition“in“ÅA“²to“searc¸ãh“for“ÅC².ŽŸ‘øãIn–UUthe“prolog“ le“Åexamp.pl²:ަ‘ã Å:-–?ýforeign(occurrence(+string,“+char,“-positive),“[choice‘¡E‰ff&fŽ‘Ç«size(1)]).ŽŸ-H‘øã²In–UUthe“C“ le“Åexamp‘¡E‰ff&fŽ‘Ç«c.c²:ަ‘ã Å#include‘?ýŽ¡‘ã #include‘?ý"gprolog.h"Ž¡¡‘ã BoolŽ¡‘ã occurrence(char–?ý*str,“long“c,“long“*pos)Ž¡‘ã {ŽŽŸŽŒ‹¼ _ Ú‹– ý"EŸüfd‘øã²188ŽŽŽ’h9‘ INTERF‘þãA•¸ãCING›UUPR“OLOG˜AND˜CŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘cÅchar‘?ý**info_pos;ޤ ‘cchar‘?ý*p;Ž¡¡‘cinfo_pos–?ý=“Get_Choice_Buffer(char“**);“/*“recover“the“buffer“*/Ž¡¡‘cif–?ý(Get_Choice_Counter()“==“0)‘)ÿè/*“first“invocation“?“*/Ž¡‘&âý*info_pos–?ý=“str;Ž¡¡‘cp–?ý=“strchr(*info_pos,“c);Ž¡‘cif–?ý(p“==“NULL)‘SÿÐ/*“C“does“not“appear“*/Ž¡‘&âý{Ž¡‘1b÷No_More_Choice();‘/?å/*–?ýremove“choice-point“*/Ž¡‘1b÷return–?ýFALSE;‘D?Ù/*“fail“*/Ž¡‘&âý}Ž¡¡‘c*pos–?ý=“p“-“str;‘N¿Ó/*“set“the“output“argument“*/Ž¡‘c*info_pos–?ý=“p“+“1;‘>ÿÜ/*“update“next“starting“pos“*/Ž¡‘creturn–?ýTRUE;‘^Ê/*“succeed“*/Ž¡‘ã }ޤ­~‘øã²The–UUcompilation“proGduces“an“executable“called“Åexamp²:Ž©­‘ã Å%–?ýgplc“examp.pl“examp‘¡E‰ff&fŽ‘Ç«c.cŽ¡‘øã²Examples–UUof“use:ŽŸOFŸÃæd‘ã Å|–?ý?-“occurrence(prolog,“o,“X).ŽŽ¤ ¡‘ã X–?ý=“2“?ŽŽŽ’ƒ²©²(here–UUthe“user“presses“Å;“²to“compute“another“solution)ŽŽ¡¡‘ã ÅX–?ý=“4“?ŽŽŽ’ƒ²©²(here–UUthe“user“presses“Å;“²to“compute“another“solution)ŽŽ¡¡‘ã ÅnoŽŽŽ’ƒ²©²(no–UUmore“solution)ŽŽ¡¡‘ã Å|–?ý?-“occurrence(prolog,“k,“X).ŽŽ¡¡‘ã noŽŽŽŽŽŸO­~‘øã²In–¤Wthe“ rst“example“when“the“second“(the“last)‘¤VošGccurrence“is“found“(ÅX=4²)“the“c•¸ãhoice-p˜oin“t–¤Wremains“andޤ ‘øãthe–hµfailure›h´is“detected˜only“when˜another“solution“is˜requested“(b¸ãy˜pressing‘ŒBÅ;²).‘«æIt˜is“pGossible˜to“impro•¸ãv“eŽ¡‘øãthis–˜bGehaš¸ãvior“b˜y“deleting“the“c˜hoice-pGoin˜t“when“there‘—is“no“more“oGccurrence.‘VˆT‘ÿ*ªo“do“this“it“is“necessary“toŽ¡‘øãdo–1Ñone“searc¸ãh“ahead.‘eðThe“information“stored“is“the“pšGosition‘1Òof“the“next“o˜ccurrence.‘eðLet“us“de ne“suc¸ãh“aŽ¡‘øãbGeha¸ãvior–UUfor“the“predicate“Åoccurrence2/3².ŽŸ‘øãIn–UUthe“prolog“ le“Åexamp.pl²:ަ‘ã Å:-–?ýforeign(occurrence2(+string,“+char,“-positive),“[choice‘¡E‰ff&fŽ‘Ç«size(1)]).ŽŸ­~‘øã²In–UUthe“C“ le“Åexamp‘¡E‰ff&fŽ‘Ç«c.c²:ަ‘ã Å#include‘?ýŽ¡‘ã #include‘?ý"gprolog.h"Ž¡¡‘ã BoolŽ¡‘ã occurrence2(char–?ý*str,“long“c,“long“*pos)Ž¡‘ã {Ž¡‘cchar‘?ý**info_pos;Ž¡‘cchar‘?ý*p;Ž¡¡‘cinfo_pos–?ý=“Get_Choice_Buffer(char“**);“/*“recover“the“buffer“*/ŽŽŸŽŒ‹½ g> Ú‹– ý"EŸüfd‘øã²9.1‘ Calling–UUC“from“PrologŽŽŽ’±!€189ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E¤ ‘cÅif–?ý(Get_Choice_Counter()“==“0)“/*“first“invocation“?“*/Ž¡‘&âý{Ž¡‘1b÷p–?ý=“strchr(str,“c);Ž¡‘1b÷if–?ý(p“==“NULL)‘>ÿÜ/*“C“does“not“appear“at“all“*/Ž¡‘;âñ{Ž¡‘FbëNo_More_Choice();‘?ñ/*–?ýremove“choice-point“*/Ž¡‘Fbëreturn–?ýFALSE;‘/?å/*“fail“*/Ž¡‘;âñ}Ž¡¡‘1b÷*info_pos–?ý=“p;Ž¡‘&âý}Ž¡’¹â©/*–?ýinfo_pos“=“an“occurrence“*/Ž¡‘c*pos–?ý=“*info_pos“-“str;‘$¿ë/*“set“the“output“argument“*/Ž¡¡‘cp–?ý=“strchr(*info_pos“+“1,“c);Ž¡‘cif–?ý(p“==“NULL)‘SÿÐ/*“no“more“occurrence“*/Ž¡‘&âýNo_More_Choice();‘9¿ß/*–?ýremove“choice-point“*/Ž¡‘celseŽ¡‘&âý*info_pos–?ý=“p;‘IÖ/*“else“update“next“solution“*/Ž¡¡‘creturn–?ýTRUE;‘^Ê/*“succeed“*/Ž¡‘ã }Ž©‘øã²Examples–UUof“use:ŽŸCqÇŸÏæd‘ã Å|–?ý?-“occurrence2(prolog,“l,“X).ŽŽ¡¡‘ã X–?ý=“3ŽŽŽ’ƒ²©²(here–UUthe“user“is“not“prompted“since“there“is“no“more“alternativ¸ãe)ŽŽ¡¡‘ã Å|–?ý?-“occurrence2(prolog,“o,“X).ŽŽ¡¡‘ã X–?ý=“2“?ŽŽŽ’ƒ²©²(here–UUthe“user“presses“Å;“²to“compute“another“solution)ŽŽ¡¡‘ã ÅX–?ý=“4ŽŽŽ’ƒ²©²(here–UUthe“user“is“not“prompted“since“there“is“no“more“alternativ¸ãe)ŽŽŽŽŽŸUþ6‘øãÄ9.1.10Ž‘!ƇExample:‘pinput/output‘ÕTargumen®9tsŽŸuT‘øã²W‘ÿ*ªe–~6here“de ne“a“predicate“Åchar‘¡E‰ff&fŽ‘Ç«ascii(Char,‘?ýCode²)“whicš¸ãh“con˜v˜erts“in“bGoth“directions“the“c˜haracter“ÅCharŽ¡‘øã²and–UUits“c¸ãharacter-coGde“ÅCode².‘qÇThis“predicate“is“then“similar“to“Åchar‘¡E‰ff&fŽ‘Ç«code/2“²(section“7.19.4,“page“116).ŽŸ‘øãIn–UUthe“prolog“ le“Åexamp.pl²:ަ‘ã Å:-–?ýforeign(char‘¡E‰ff&fŽ›Ç«ascii(?char,“?code),“[fct‘¡E‰ff&fŽ˜name('Char‘¡E‰ff&fŽ˜Ascii')]).ަ‘øã²In–UUthe“C“ le“Åexamp‘¡E‰ff&fŽ‘Ç«c.c²:ަ‘ã Å#include‘?ý"gprolog.h"Ž¡¡‘ã BoolŽ¡‘ã char_ascii(FIOArg–?ý*c,“FIOArg“*ascii)Ž¡‘ã {Ž¡‘cif–?ý(!c->is_var)‘N¿Ó/*“Char“is“not“a“variable“*/Ž¡‘&âý{Ž¡‘1b÷ascii->unify–?ý=“TRUE;‘î/*“enforce“unif.“of“Code“*/Ž¡‘1b÷ascii->value.l–?ý=“c->value.l;“/*“set“Code“*/Ž¡‘1b÷return–?ýTRUE;‘IÖ/*“succeed“*/ŽŽŸŽŒ‹¾ p6 Ú‹– ý"EŸüfd‘øã²190ŽŽŽ’h9‘ INTERF‘þãA•¸ãCING›UUPR“OLOG˜AND˜CŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘&âýÅ}ޤ ¡‘cif–?ý(ascii->is_var)‘>ÿÜ/*“Code“is“also“a“variable“*/Ž¡‘&âýPl_Err_Instantiation();‘?ñ/*–?ýemit“instantiation_error“*/Ž¡¡‘cc->value.l–?ý=“ascii->value.l;‘ ú/*“set“Char“*/Ž¡‘creturn–?ýTRUE;‘^Ê/*“succeed“*/Ž¡‘ã }Ž©ý\‘øã²If‘ÅÃÅChar–þ§²is›þ¦instan¸ãtiated“it˜is˜necessary“to˜enforce“the˜uni cation“of‘ÅÃÅCode˜²since“it˜could“bGe˜instan¸ãtiated.Ž¡‘øãRecall–«Ñthat›«Òb¸ãy“default˜if“an“input/output˜argumen¸ãt“is˜instan¸ãtiated“it˜will“not“bGe˜uni ed“at˜the“exitŽ¡‘øãof–]¿the›]¾function“(section“9.1.6,‘ŸØpage“185).‘‹If˜bGoth“ÅChar“²and˜ÅCode“²are˜v‘ÿqÇariables“the“function˜raises“anŽ¡‘øãÅinstantiation‘¡E‰ff&fŽ‘Ç«error².‘qÇThe›UUw•¸ãa“y˜to˜raise˜Prolog˜errors˜is˜describGed˜later˜(section˜9.3,˜page˜196).ŽŸ‘øãThe–UUcompilation“proGduces“an“executable“called“Åexamp²:ŽŸý[‘ã Å%–?ýgplc“examp.pl“examp‘¡E‰ff&fŽ‘Ç«c.cަ‘øã²Examples–UUof“use:ަ‘ã Å|–?ý?-“char_ascii(a,“X).Ž¡¡‘ã X–?ý=“97Ž¡¡‘ã |–?ý?-“char_ascii(X,“65).Ž¡¡‘ã X–?ý=“'A'Ž¡¡‘ã |–?ý?-“char_ascii(a,“12).Ž¡¡‘ã noŽ¡¡‘ã |–?ý?-“char_ascii(X,“X).Ž¡‘ã {exception:‘?ýerror(instantiation_error,char_ascii/2)}Ž¡¡‘ã |–?ý?-“char_ascii(1,“12).Ž¡‘ã {exception:‘?ýerror(type_error(character,1),char_ascii/2)}ŽŸ'ý¤‘øãÇ9.2Ž‘£Manipulating–€Prolog“termsޤuT‘øãÄ9.2.1Ž‘‰In®9troQÇductionŽ¡‘øã²In–Lthe‘Lfolloš¸ãwing“w˜e‘Lpresen˜ts“a›Lset“of“functions˜to“manipulate˜Prolog“terms.‘n²F‘ÿ*ªor˜simple“foreign˜terms“theޤ ‘øãfunctions–UUmanipulate“simple“C“t¸ãypGes“(section“9.1.2,“page“183).Ž©‘øãF‘ÿ*ªunctions–Ámanaging›Âlists“handle“an˜arra¸ãy“of“2˜elemenš¸ãts“(of“t˜ypGe‘ÂÅPlTerm²)“con˜taining“the‘Âterms“correspGond-Ž¡‘øãing–àto›ßthe“head˜and“the˜tail“of˜the“list.‘fF‘ÿ*ªor“the˜empt¸ãy“list˜ÅNULL‘Ѳis˜passed“as˜the“arra¸ãy‘ÿ*ª.‘fThese“functionsŽ¡‘øãrequire–+wto›+v atten“a“list˜in“eac¸ãh“sub-list.‘cÒT‘ÿ*ªo“simplify“the˜managemen¸ãt“of“propGer˜lists“(i.e.‘cÒlists“terminatedŽ¡‘øãb¸ãy‘«¥Å[]²)–ˆa›ˆset“of˜functions˜is“pro¸ãvided˜that“handle˜the˜n•¸ãum“bGer‘ˆof˜elemen“ts–ˆof˜the˜list“(an˜in¸ãteger)“and˜anŽ¡‘øãarra•¸ãy›Ó`whose‘Óaelemen“ts˜(of˜t“ypGe–ÓaÅPlTerm²)˜are“the˜elemen¸ãts˜of“the˜list.‘ëéThe“caller˜of˜these“functions˜m¸ãustŽ¡‘øãproš¸ãvide–UUthe“arra˜y‘ÿ*ª.ަ‘øãF‘ÿ*ªunctions–Kmanaging›KcompGound“terms˜handle“a“functor˜(the“principal˜functor“of“the˜term),‘M%an˜arit¸ãy‘n¦ÉN‘ˆ¸Ž¡‘øã²0–¼]and“an“arraš¸ãy“of‘ƒzÉN‘x´²elemen˜ts“(of“t˜ypGe“ÅPlTerm²)“con˜taining“the“sub-terms‘¼\of“the“compGound“term.‘¦ßSinceŽ¡‘øãa–plist›pis“a˜spGecial“case˜of“compGound˜term“(functor˜=“Å'.'‘²and˜arit¸ãy=2)“it˜is“pGossible˜to“use˜an¸ãy“functionŽ¡‘øãmanaging–K#compGound“terms“to“deal›K"with“a“list“but“the“error“detection“is“not“the˜same.‘S1Indeed“man¸ãyŽŽŸŽŒ‹¿ x¥ Ú‹– ý"EŸüfd‘øã²9.2‘ Manipulating–UUProlog“termsŽŽŽ’±!€191ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãfunctions›\c•¸ãhec“k˜if˜the˜Prolog‘[argumen“t˜is˜correct.‘½ÜThe˜name˜of˜a˜read‘[or˜unify˜function˜c“hec“king˜theޤ ‘øãProlog–$argumenš¸ãts“is“of“the‘$form“ÉName‘]·‰ff&fŽ‘„ÅCheck()².‘ÝàF‘ÿ*ªor“eac˜h“of“these“functions‘$there“is“a“also“c˜hec˜k-freeŽ¡‘øãvš¸ãersion–UUcalled“ÉName‘¼rÅ()².‘qÇW‘ÿ*ªe“then“only“presen˜t“the“name“of“c˜hec˜king“functions.ŽŸ%½^‘øãÄ9.2.2Ž‘‰Managing–ÕTProlog“atomsŽŸuT‘øã²Eacš¸ãh–öatom“has“a“unique“in˜ternal“k˜ey“whic˜h“correspGonds“to“its“index“in“the“GNU‘ãProlog“atom“table.‘KªItŽ¡‘øãis–UUpšGossible“to“obtain“the“information“ab˜out“an“atom“and“to“create“new“atoms“using:ŽŸÒÈ‘ã Åchar–?ý*Atom_Name‘9¿ß(int“atom)Ž¡‘ã int‘¿÷Atom_Length‘/?å(int‘?ýatom)Ž¡‘ã Bool‘ úAtom_Needs_Quote‘ÿô(int‘?ýatom)Ž¡‘ã Bool‘ úAtom_Needs_Scan‘?ñ(int‘?ýatom)Ž¡‘ã Bool‘ úIs_Valid_Atom‘$¿ë(int‘?ýatom)Ž¡‘ã int‘¿÷Create_Atom‘/?å(char‘?ý*str)Ž¡‘ã int‘¿÷Create_Allocate_Atom(char‘?ý*str)Ž¡‘ã int‘¿÷Find_Atom‘9¿ß(char‘?ý*str)Ž¡‘ã int‘¿÷ATOM_CHAR‘9¿ß(char‘?ýc)Ž¡‘ã int‘¿÷atom_nilŽ¡‘ã int‘¿÷atom_falseŽ¡‘ã int‘¿÷atom_trueŽ¡‘ã int‘¿÷atom_end_of_fileŽŸÒÇ‘øã²The–#ëmacro“ÅAtom‘¡E‰ff&fŽ‘Ç«Name(atom)“²returns“the“in¸ãternal“string“of‘ëÅatom“²(this“string“should“not“bšGe“mo˜di ed).Ž¡‘øãThe–UUfunction“ÅAtom‘¡E‰ff&fŽ‘Ç«Lengh(atom)“²returns“the“length“(of“the“name)“of‘rÅatom².Ž©‘øãThe›ê€function‘êÅAtom‘¡E‰ff&fŽ–Ç«Needs‘¡E‰ff&fŽ“Scan(atom)˜²indicates–êif˜the“canonical˜form“of‘±Åatom“²needs˜to“bGe˜quoted“as˜doneŽ¡‘øãb¸ãy‘žÅwriteq/2–zz²(section“7.14.6,‘ÃÃpage“96).‘á5In“that“case“ÅAtom‘¡E‰ff&fŽ–Ç«Needs‘¡E‰ff&fŽ“Scan(atom)–zz²indicates“if“this“simplyŽ¡‘øãcomes–Àdo¸ãwn“to“write›¿quotes“around“the“name“of‘ÚÝÅatom˜²or“if“it“necessary“to“scan˜eacš¸ãh“c˜haracter“of“theŽ¡‘øãname–µ6bGecause“there“are“some“non-prinš¸ãtable“c˜haracters‘µ7(or“included“quote“c˜haracters).‘‘jThe“functionŽ¡‘øãÅIs‘¡E‰ff&fŽ–Ç«Valid‘¡E‰ff&fŽ“Atom(atom)–UU²is“true“only“if‘rÅatom“²is“the“inš¸ãternal“k˜ey“of“an“existing“atom.ަ‘øãThe–€Mfunction›€LÅCreate‘¡E‰ff&fŽ‘Ç«Atom(str)“²adds˜a“new˜atom“whose˜name“is˜the“con•¸ãten“t˜of‘GjÅstr˜²to–€Mthe˜system“andŽ¡‘øãreturns–•çits“in•¸ãternal›•èk“ey‘ÿ*ª.‘3}If˜the–•çatom“already“exists˜its“k¸ãey“is“simply“returned.‘3~The“string‘¹uÅstr“²passed“toŽ¡‘øãthe–Òfunction›Ñshould“not˜bšGe“mo˜di ed›Ñlater.‘ñ=The“function˜ÅCreate‘¡E‰ff&fŽ–Ç«Allocate‘¡E‰ff&fŽ“Atom(str)–Ò²is˜pro¸ãvided“whenŽ¡‘øãthis–UUcondition“cannot“bGe“ensured.‘qÇIt“simply“makš¸ães“a“dynamic“cop˜y“of‘rÅstr².ަ‘øãThe–l‡function›lˆÅFind‘¡E‰ff&fŽ‘Ç«Atom(str)“²returns˜the“in•¸ãternal˜k“ey–l‡of˜the“atom“whose˜name“is˜Åstr“²or˜Å-1“²if˜doGes“notŽ¡‘øãexist.ަ‘øãAll–J[atoms“correspGonding›JZto“a“single“c¸ãharacter˜already“exist“and“their˜k¸ãey“can“bGe“obtained˜via“the“macroŽ¡‘øãÅATOM‘¡E‰ff&fŽ›Ç«CHAR².–»F‘ÿ*ªor‘»instance“ÅATOM‘¡E‰ff&fŽ˜CHAR('.')‘¢Ê²is›»the“atom“assoGciated˜with“Å'.'‘¢Ê²(this˜atom“is“the˜functor“ofŽ¡‘øãlists).‘k€The›Bother–B€v‘ÿqÇariables“correspGond˜to“the˜inš¸ãternal“k˜ey‘Bof“frequen˜tly“used‘Batoms:‘h\Å[]²,–FEÅfalse²,“Åtrue‘B€²andŽ¡‘øãÅend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“file².ŽŸ%½^‘øãÄ9.2.3Ž‘‰Reading–ÕTProlog“termsŽŸuT‘øã²The–ÒWname“of“all“functions›ÒXpresen¸ãted“here“are“of“the“form“ÅRd‘¡E‰ff&fŽ‘Ç«ÉName‘]·‰ff&fŽ‘„ÅCheck()².‘FThey˜all“c•¸ãhec“k–ÒWthe“v‘ÿqÇalidit¸ãy“ofŽ¡‘øãthe–q­Prolog“term“to“read›q®emitting“appropriate“errors“if“necessary‘ÿ*ª.‘ÆÏEac¸ãh˜function“has“a“c•¸ãhec“k-free‘q­v“ersionŽ¡‘øãcalled‘UUÅRd‘¡E‰ff&fŽ‘Ç«ÉName‘¼rÅ()².ަ‘øãÄSimple‘jQforeign‘jPt®9ypQÇes²:‘tãfor›Öâeac¸ãh–Öãsimple“foreign˜t¸ãypGe“(section“9.1.2,‘÷Fpage˜183)“there“is“a˜read“functionŽ¡‘øã(used–UUbš¸ãy“the“in˜terface“when“an“input“argumen˜t“is“pro˜vided):ŽŸÒÈ‘ã Ålong‘ÿôRd_Integer_Check‘ ú(PlTerm‘?ýterm)ŽŽŸŽŒ‹À „p Ú‹– ý"EŸüfd‘øã²192ŽŽŽ’h9‘ INTERF‘þãA•¸ãCING›UUPR“OLOG˜AND˜CŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Ålong‘ÿôRd_Positive_Check–?ý(PlTerm“term)ޤ ‘ã double‘ úRd_Float_Check‘ÿô(PlTerm‘?ýterm)Ž¡‘ã double‘ úRd_Number_Check‘¿÷(PlTerm‘?ýterm)Ž¡‘ã int–?ñRd_Atom_Check“(PlTerm‘?ýterm)Ž¡‘ã int‘?ñRd_Boolean_Check‘ ú(PlTerm‘?ýterm)Ž¡‘ã int–?ñRd_Char_Check“(PlTerm‘?ýterm)Ž¡‘ã int‘?ñRd_In_Char_Check‘ ú(PlTerm‘?ýterm)Ž¡‘ã int–?ñRd_Code_Check“(PlTerm‘?ýterm)Ž¡‘ã int‘?ñRd_In_Code_Check‘ ú(PlTerm‘?ýterm)Ž¡‘ã int–?ñRd_Byte_Check“(PlTerm‘?ýterm)Ž¡‘ã int‘?ñRd_In_Byte_Check‘ ú(PlTerm‘?ýterm)Ž¡‘ã char–¿÷*Rd_String_Check“(PlTerm‘?ýterm)Ž¡‘ã char‘¿÷*Rd_Chars_Check‘ÿô(PlTerm‘?ýterm)Ž¡‘ã char‘¿÷*Rd_Codes_Check‘ÿô(PlTerm‘?ýterm)Ž¡‘ã int‘?ñRd_Chars_Str_Check(PlTerm–?ýterm,“char“*str)Ž¡‘ã int‘?ñRd_Codes_Str_Check(PlTerm–?ýterm,“char“*str)Ž©&D‘øã²All–Ú|functions›Ú{returning“a“C‘ÚYstring“(Åchar‘?ý*²)˜use“a˜same“bu er.‘;The“function˜ÅRd‘¡E‰ff&fŽ–Ç«Chars‘¡E‰ff&fŽ“Str‘¡E‰ff&fŽ“Check()‘Ú|²isŽ¡‘øãsimilar›:€to‘:ÅRd‘¡E‰ff&fŽ–Ç«Chars‘¡E‰ff&fŽ“Check()˜²but–:accepts˜as“argumen¸ãt˜a˜string“to˜store“the˜result“and˜returns“the˜lengthŽ¡‘øãof–UUthat“string“(whic¸ãh“is“also“the“length“of“the“Prolog“list).‘qÇSimilarly“for“ÅRd‘¡E‰ff&fŽ–Ç«Codes‘¡E‰ff&fŽ“Str‘¡E‰ff&fŽ“Check()².ŽŸ‘øãÄComplex‘0terms²:‘ÌÑthe–‚Úfolloš¸ãwing“functions“return“the“sub-argumen˜ts“(terms)‘‚Ûof“complex“terms“as“anŽ¡‘øãarraš¸ãy–®of‘uÅPlTerm“²except‘®ÅRd‘¡E‰ff&fŽ–Ç«Proper‘¡E‰ff&fŽ“List‘¡E‰ff&fŽ“Check()–®²whic˜h›®returns“the˜size“of˜the“list˜read“(and˜initializesŽ¡‘øãthe–^parraš¸ãy‘ýÅelement²).‘Refer“to‘^qthe“in˜troGduction“of“this›^qsection“for“more“information˜abGout“the“argumen¸ãtsŽ¡‘øãof–UUcomplex“functions“(section“9.2.1,“page“190).ަ‘ã Åint‘?ñRd_Proper_List_Check(PlTerm–?ýterm,“PlTerm“*arg)Ž¡‘ã PlTerm–?ý*Rd_List_Check‘$¿ë(PlTerm“term)Ž¡‘ã PlTerm–?ý*Rd_Compound_Check‘¿÷(PlTerm“term,“int“*functor,“int“*arity)Ž¡‘ã PlTerm–?ý*Rd_Callable_Check‘¿÷(PlTerm“term,“int“*functor,“int“*arity)ŽŸ%ÏW‘øãÄ9.2.4Ž‘‰Unifying–ÕTProlog“termsŽŸuT‘øã²The–ÒWname“of“all“functions›ÒXpresen¸ãted“here“are“of“the“form“ÅUn‘¡E‰ff&fŽ‘Ç«ÉName‘]·‰ff&fŽ‘„ÅCheck()².‘FThey˜all“c•¸ãhec“k–ÒWthe“v‘ÿqÇalidit¸ãy“ofŽ¡‘øãthe–;éProlog“term“to“unify“emitting“appropriate“errors“if“necessary‘ÿ*ª.‘iMEacš¸ãh“function“has“a“c˜hec˜k-free“v˜ersionŽ¡‘øãcalled‘UUÅUn‘¡E‰ff&fŽ‘Ç«ÉName‘¼rÅ()².ŽŸ‘øãÄSimple‘Õ«foreign‘Õ¬t®9ypQÇes²:‘r^for–U¡eacš¸ãh“simple“foreign“t˜ypGe“(section“9.1.2,‘U´page“183)‘U there“is“an“unify“functionŽ¡‘øã(used–UUbš¸ãy“the“in˜terface“when“an“output“argumen˜t“is“pro˜vided):ަ‘ã ÅBool–?ýUn_Integer_Check“(long“n,‘ÿôPlTerm“term)Ž¡‘ã Bool–?ýUn_Positive_Check(long“n,‘ÿôPlTerm“term)Ž¡‘ã Bool–?ýUn_Float_Check‘¿÷(double“n,‘ úPlTerm“term)Ž¡‘ã Bool–?ýUn_Number_Check› ú(double“n,˜PlTerm“term)Ž¡‘ã Bool–?ýUn_Atom_Check‘ÿô(int“atom,‘ úPlTerm“term)Ž¡‘ã Bool–?ýUn_Boolean_Check“(int“b,‘?ñPlTerm“term)Ž¡‘ã Bool–?ýUn_Char_Check‘ÿô(int“c,‘?ñPlTerm“term)Ž¡‘ã Bool–?ýUn_In_Char_Check“(int“c,‘?ñPlTerm“term)Ž¡‘ã Bool–?ýUn_Code_Check‘ÿô(int“c,‘?ñPlTerm“term)Ž¡‘ã Bool–?ýUn_In_Code_Check“(int“c,‘?ñPlTerm“term)Ž¡‘ã Bool–?ýUn_Byte_Check‘ÿô(int“b,‘?ñPlTerm“term)Ž¡‘ã Bool–?ýUn_In_Byte_Check“(int“b,‘?ñPlTerm“term)Ž¡‘ã Bool–?ýUn_String_Check‘ ú(char“*str,“PlTerm“term)Ž¡‘ã Bool–?ýUn_Chars_Check‘¿÷(char“*str,“PlTerm“term)Ž¡‘ã Bool–?ýUn_Codes_Check‘¿÷(char“*str,“PlTerm“term)ަ‘øã²The›q&function‘q'ÅUn‘¡E‰ff&fŽ–Ç«Number‘¡E‰ff&fŽ“Check(n,‘?ýterm)˜²uni es–q'Återm˜²with˜an“in¸ãteger˜if‘8CÅn“²is˜an“in¸ãteger,‘xwith“a˜ oatingŽŽŸŽŒ‹Á ”¬ Ú‹– ý"EŸüfd‘øã²9.2‘ Manipulating–UUProlog“termsŽŽŽ’±!€193ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãpšGoin•¸ãt‘'Zn“um“b˜er–'Yotherwise.‘btThe›'Zfunction“ÅUn‘¡E‰ff&fŽ–Ç«String‘¡E‰ff&fŽ“Check(str,‘?ýterm)˜²creates˜the˜atom‘'YcorrespGonding˜toޤ ‘øãÅstr–UU²and“then“uni es“term“with“it“(same“as“ÅUn‘¡E‰ff&fŽ–Ç«Atom‘¡E‰ff&fŽ“Check(Create‘¡E‰ff&fŽ“Allocate‘¡E‰ff&fŽ“Atom(str),‘?ýterm)²).ŽŸ‘øãÄComplex‘%­terms²:‘º¹the–yÏfollo¸ãwing›yÎfunctions“accept˜the˜sub-argumen¸ãts“(terms)˜of“complex˜terms“as˜anŽ¡‘øãarraš¸ãy–‡Ïof‘NìÅPlTerm².‘ 4Refer“to‘‡Îthe“in˜trošGduction“of“this“section‘‡Îfor“more“information“ab˜out‘‡Îthe“argumen¸ãts“ofŽ¡‘øãcomplex–UUfunctions“(section“9.2.1,“page“190).ީܡ‘ã ÅBool–?ýUn_Proper_List_Check(int“size,“PlTerm“*arg,“PlTerm“term)Ž¡‘ã Bool–?ýUn_List_Check‘$¿ë(PlTerm“*arg,“PlTerm“term)Ž¡‘ã Bool–?ýUn_Compound_Check‘¿÷(int“functor,“int“arity,“PlTerm“*arg,Ž¡’šb»PlTerm‘?ýterm)Ž¡‘ã Bool–?ýUn_Callable_Check‘¿÷(int“functor,“int“arity,“PlTerm“*arg,Ž¡’šb»PlTerm‘?ýterm)ަ‘øã²All–ý|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ9.2.5Ž‘‰Creating–ÕTProlog“termsŽŸuT‘øã²These–tfunctions“are“proš¸ãvided“to“creates“Prolog“terms.‘¬#Eac˜h“function“returns“a“ÅPlTerm“²con˜taining“theޤ ‘øãcreated‘UUterm.ŽŸ‘øãÄSimple‘yforeign‘xt®9ypQÇes²:‘ªfor–±eac¸ãh›±simple“foreign˜t¸ãypGe“(section˜9.1.2,‘Ñôpage“183)˜there“is˜a“creation˜function:Ž©‘ã ÅPlTerm–?ýMk_Integer“(long“n)Ž¡‘ã PlTerm–?ýMk_Positive(long“n)Ž¡‘ã PlTerm–?ýMk_Float‘¿÷(double“n)Ž¡‘ã PlTerm–?ýMk_Number‘ ú(double“n)Ž¡‘ã PlTerm–?ýMk_Atom‘ÿô(int“atom)Ž¡‘ã PlTerm–?ýMk_Boolean“(int“b)Ž¡‘ã PlTerm–?ýMk_Char‘ÿô(int“c)Ž¡‘ã PlTerm–?ýMk_In_Char“(int“c)Ž¡‘ã PlTerm–?ýMk_Code‘ÿô(int“c)Ž¡‘ã PlTerm–?ýMk_In_Code“(int“c)Ž¡‘ã PlTerm–?ýMk_Byte‘ÿô(int“b)Ž¡‘ã PlTerm–?ýMk_In_Byte“(int“b)Ž¡‘ã PlTerm–?ýMk_String‘ ú(char“*str)Ž¡‘ã PlTerm–?ýMk_Chars‘¿÷(char“*str)Ž¡‘ã PlTerm–?ýMk_Codes‘¿÷(char“*str)ަ‘øã²The–×£function›פÅMk‘¡E‰ff&fŽ‘Ç«Number(n,‘?ýterm)“²initializes“Återm“²with˜an“in¸ãteger“if‘žÀÅn˜²is“an“in¸ãteger,‘ðÇwith“a˜ oating“pGoin¸ãtŽ¡‘øãn•¸ãum“bGer–ÒÓotherwise.‘êBThe›ÒÔfunction“ÅMk‘¡E‰ff&fŽ‘Ç«String(str)“² rst˜creates“an“atom˜correspGonding“to“Åstr˜²and“thenŽ¡‘øãreturns–UUthat“Prolog“atom“(i.e.‘qÇequiv‘ÿqÇalen¸ãt“to“ÅMk‘¡E‰ff&fŽ–Ç«Atom(Create‘¡E‰ff&fŽ“Allocate‘¡E‰ff&fŽ“Atom(str))²).ŽŸ‘øãÄComplex‘%­terms²:‘º¹the–yÏfollo¸ãwing›yÎfunctions“accept˜the˜sub-argumen¸ãts“(terms)˜of“complex˜terms“as˜anŽ¡‘øãarraš¸ãy–‡Ïof‘NìÅPlTerm².‘ 4Refer“to‘‡Îthe“in˜trošGduction“of“this“section‘‡Îfor“more“information“ab˜out‘‡Îthe“argumen¸ãts“ofŽ¡‘øãcomplex–UUfunctions“(section“9.2.1,“page“190).ަ‘ã ÅPlTerm–?ýMk_Proper_List(int“size,“PlTerm“*arg)Ž¡‘ã PlTerm–?ýMk_List‘$¿ë(PlTerm“*arg)Ž¡‘ã PlTerm–?ýMk_Compound‘¿÷(int“functor,“int“arity,“PlTerm“*arg)Ž¡‘ã PlTerm–?ýMk_Callable‘¿÷(int“functor,“int“arity,“PlTerm“*arg)ŽŸ%þ6‘øãÄ9.2.6Ž‘‰T‘ÿ «esting–ÕTthe“t®9ypQÇe“of“Prolog“termsŽŸuT‘øã²The–gÎfolloš¸ãwing“functions“test“the‘gÍt˜ypGe“of“a“Prolog“term.‘©2Eac˜h“function‘gÍcorrespGonds“to“a“t˜ypGe“testingŽ¡‘øãbuilt-in–UUpredicate“(section“7.1.1,“page“49).ަ‘ã ÅBool–?ýBlt_Var‘Y?Í(PlTerm“term)Ž¡‘ã Bool–?ýBlt_Non_Var‘D?Ù(PlTerm“term)Ž¡‘ã Bool–?ýBlt_Atom‘SÿÐ(PlTerm“term)Ž¡‘ã Bool–?ýBlt_Integer‘D?Ù(PlTerm“term)Ž¡‘ã Bool–?ýBlt_Float‘N¿Ó(PlTerm“term)Ž¡‘ã Bool–?ýBlt_Number‘IÖ(PlTerm“term)Ž¡‘ã Bool–?ýBlt_Atomic‘IÖ(PlTerm“term)Ž¡‘ã Bool–?ýBlt_Compound‘>ÿÜ(PlTerm“term)Ž¡‘ã Bool–?ýBlt_Callable‘>ÿÜ(PlTerm“term)Ž¡‘ã Bool–?ýBlt_List‘SÿÐ(PlTerm“term)Ž¡‘ã Bool–?ýBlt_Partial_List‘)ÿè(PlTerm“term)Ž¡‘ã Bool–?ýBlt_List_Or_Partial_List(PlTerm“term)Ž¡‘ã Bool–?ýBlt_Fd_Var‘IÖ(PlTerm“term)Ž¡‘ã Bool–?ýBlt_Non_Fd_Var‘4â(PlTerm“term)Ž¡‘ã Bool–?ýBlt_Generic_Var‘/?å(PlTerm“term)ŽŽŸŽŒ‹Ã µ1 Ú‹– ý"EŸüfd‘øã²9.2‘ Manipulating–UUProlog“termsŽŽŽ’±!€195ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã ÅBool–?ýBlt_Non_Generic_Var‘?ñ(PlTerm“term)ޤ ‘ã int‘ úType_Of_Term‘>ÿÜ(PlTerm‘?ýterm)Ž¡‘ã int‘ úList_Length‘D?Ù(PlTerm‘?ýlist)Ž©‘øã²The–Xnfunction“ÅType‘¡E‰ff&fŽ–Ç«Of‘¡E‰ff&fŽ“Term(term)–Xn²returns“the“tš¸ãypGe“of‘‹Återm²,‘Y4the“follo˜wing“constan˜ts“can“bGe“used“to“testŽ¡‘øãthis–UUt¸ãypGe“(e.g.‘qÇin“a“Åswitch“²instruction):ަ‘ã¸ŽŽŽ‘ã ÅPLV²:–UUProlog“v‘ÿqÇariable.ަ‘ã¸ŽŽŽ‘ã ÅFDV²:–UU nite“domain“v‘ÿqÇariable.ަ‘ã¸ŽŽŽ‘ã ÅINT²:‘UUin¸ãteger.ަ‘ã¸ŽŽŽ‘ã ÅFLT²:–UU oating“pGoinš¸ãt“n˜um˜bGer.ަ‘ã¸ŽŽŽ‘ã ÅATM²:‘UUatom.ަ‘ã¸ŽŽŽ‘ã ÅLST²:‘UUlist.ަ‘ã¸ŽŽŽ‘ã ÅSTC²:‘UUstructureަ‘øãThe– Ëtag‘0XÅLST‘ ¸²means“a“term“whose“principal› Êfunctor“is“Å'.'‘Y™²and“whose“arit¸ãy“is“2“(recall˜that“the“empt¸ãy“listŽ¡‘øãis–UUthe“atom“Å[]²).‘qÇThe“tag‘xâÅSTC“²means“an¸ãy“other“compGound“term.ŽŸ‘øãThe–’function“ÅList‘¡E‰ff&fŽ‘Ç«Length(list)“²returns“the“n•¸ãum“bGer–’of“elemenš¸ãts“of“the‘’Ålist“²(Å0“²for“the“empt˜y“list).‘'øIfŽ¡‘øãlist–UUis“not“a“list“this“function“returns“Å-1².ŽŸ%þ6‘øãÄ9.2.7Ž‘‰Comparing–ÕTProlog“termsŽŸuT‘øã²The–£folloš¸ãwing“functions“compares“Prolog“terms.‘#²Eac˜h“function“correspGonds“to“a“comparison“built-inŽ¡‘øãpredicate–UU(section“7.3.2,“page“51).ަ‘ã ÅBool–?ýBlt_Term_Eq“(PlTerm“term1,“PlTerm“term2)Ž¡‘ã Bool–?ýBlt_Term_Neq(PlTerm“term1,“PlTerm“term2)Ž¡‘ã Bool–?ýBlt_Term_Lt“(PlTerm“term1,“PlTerm“term2)Ž¡‘ã Bool–?ýBlt_Term_Lte(PlTerm“term1,“PlTerm“term2)Ž¡‘ã Bool–?ýBlt_Term_Gt“(PlTerm“term1,“PlTerm“term2)Ž¡‘ã Bool–?ýBlt_Term_Gte(PlTerm“term1,“PlTerm“term2)ަ‘øã²All–²these“functions“are“based“on“a“general“comparison“function“returning“a“negativš¸ãe“in˜teger“if‘y­Återm1“²isŽ¡‘øãless–UUthan“Återm2²,“0“if“they“are“equal“and“a“pGositivš¸ãe“in˜teger“otherwise:ަ‘ã Åint–?ýTerm_Compare(PlTerm“term1,“PlTerm“term2)ŽŸ%þ6‘øãÄ9.2.8Ž‘‰Cop®9ying–ÕTProlog“termsŽŸuT‘øã²The–UUfolloš¸ãwing“functions“mak˜e“a“cop˜y“of“a“Prolog“term:ަ‘ã Åvoid–?ýCopy_Term‘9¿ß(PlTerm“*dst_adr,“PlTerm“*src_adr)Ž¡‘ã void–?ýCopy_Contiguous_Term(PlTerm“*dst_adr,“PlTerm“*src_adr)Ž¡‘ã int‘ úTerm_Size‘9¿ß(PlTerm‘?ýterm)ަ‘øã²The–#Ifunction“ÅCopy‘¡E‰ff&fŽ–Ç«Term(dst‘¡E‰ff&fŽ“adr,‘?ýsrc‘¡E‰ff&fŽ“adr)–#I²makš¸ães‘#Ha“cop˜y“of“the“term“loGcated‘#Hat“Åsrc‘¡E‰ff&fŽ‘Ç«adr“²and“storesŽ¡‘øãit–from“the“address‘givš¸ãen“b˜y‘:¥Ådst‘¡E‰ff&fŽ‘Ç«adr².‘·The“result“is‘a“con˜tiguous“term.‘·If“it“can‘bGe“ensured“that“theŽ¡‘øãsource–”Iterm“is‘”Ha“conš¸ãtiguous“term“(i.e.‘.¢result“of“a“previous“cop˜y)‘”Hthe“function“ÅCopy‘¡E‰ff&fŽ–Ç«Contiguous‘¡E‰ff&fŽ“Term()Ž¡‘øã²can–DóbGe“used“instead“(it“is“faster).‘lQIn“anš¸ãy“case,‘H:sucien˜t“space“should“bGe“a˜v‘ÿqÇailable“for“the“cop˜y“(i.e.‘lQfromŽ¡‘øãÅdst‘¡E‰ff&fŽ›Ç«adr²).‘qÇThe–UUfunction“ÅTerm‘¡E‰ff&fŽ˜Size(term)“²returns“the“n•¸ãum“bGer–UUof‘rÅPlTerm“²needed“b¸ãy‘xâÅterm².ŽŽŸŽŒ‹Ä Àã Ú‹– ý"EŸüfd‘øã²196ŽŽŽ’h9‘ INTERF‘þãA•¸ãCING›UUPR“OLOG˜AND˜CŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ9.2.9Ž‘‰Comparing–ÕTand“ev‘ÿ\raluating“arithmetic“expressionsŽŸuT‘øã²The–/follo¸ãwing›.functions“compare˜arithmetic“expressions.‘TEac¸ãh“function˜correspGonds“to˜a“comparisonޤ ‘øãbuilt-in–UUpredicate“(section“7.6.3,“page“60).Ž©‘ã ÅBool–?ýBlt_Eq“(PlTerm“expr1,“PlTerm“expr2)Ž¡‘ã Bool–?ýBlt_Neq(PlTerm“expr1,“PlTerm“expr2)Ž¡‘ã Bool–?ýBlt_Lt“(PlTerm“expr1,“PlTerm“expr2)Ž¡‘ã Bool–?ýBlt_Lte(PlTerm“expr1,“PlTerm“expr2)Ž¡‘ã Bool–?ýBlt_Gt“(PlTerm“expr1,“PlTerm“expr2)Ž¡‘ã Bool–?ýBlt_Gte(PlTerm“expr1,“PlTerm“expr2)ަ‘øã²The–Éfollo¸ãwing›Èfunction“ev‘ÿqÇaluates“the“expression˜Åexpr“²and“stores“its˜result“as“a“Prolog˜n•¸ãum“bGer›É(in“teger˜orŽ¡‘øã oating–UUpGoinš¸ãt“n˜um˜bGer)“in“Åresult²:ަ‘ã Åvoid–?ýMath_Load_Value(PlTerm“expr,“PlTerm“*result)ަ‘øã²This–UUfunction“can“bGe“follo•¸ãw“ed›UUb“y˜a˜read˜function˜(section˜9.2.3,˜page˜191)˜to˜obtain˜the˜result.ŽŸ'þ6‘øãÇ9.3Ž‘£Raising–€Prolog“errorsŽ©uT‘øã²The–®ífolloš¸ãwing‘®ìfunctions“allo˜ws›®ìa“C‘®Âfunction“to˜raise“a˜Prolog“error.‘:ORefer“to˜the“section˜concerning“PrologŽ¡‘øãerrors–UUfor“more“information“abGout“the“e ect“of“raising“an“error“(section“5.3,“page“37).ŽŸ%þ6‘øãÄ9.3.1Ž‘‰Managing–ÕTthe“error“con®9textަ‘øã²When–'one“of“the“folloš¸ãwing“error“function“is“in˜v˜ok˜ed‘(it“refers“to“the“implicit“error“con˜text“(section“5.3.1,Ž¡‘øãpage–ê37).‘ñ…This“conš¸ãtext“indicates“the“name“and“the‘éarit˜y“of“the“concerned“predicate.‘ñ…When“using“aŽ¡‘øãÅforeign/2–ž²declaration“this“conš¸ãtext‘ž is“set“b˜y“default“to“the“name“and‘ž arit˜y“of“the“assoGciated“PrologŽ¡‘øãpredicate.‘KÿThis–žcan›žbGe“con¸ãtrolled˜using“the“Åbip‘¡E‰ff&fŽ‘Ç«name˜²option“(section“9.1.2,›°Bpage“183).‘LIn“an¸ãy“case,˜theŽ¡‘øãfollo¸ãwing–UUfunctions“can“also“bšGe“used“to“mo˜dify“this“con¸ãtext:Ž©‘ã Åvoid–?ýSet_C_Bip_Name‘ ú(char“*functor,“int“arity)Ž¡‘ã void‘?ýUnset_C_Bip_Name(void)ަ‘øã²The–7Ufunction“ÅSet‘¡E‰ff&fŽ–Ç«C‘¡E‰ff&fŽ“Bip‘¡E‰ff&fŽ“Name(functor,‘?ýarity)›7T²initializes–7Uthe“con¸ãtext“of“the“error˜with“Åfunctor“²andŽ¡‘øãÅarity–•¢²(if‘\¾Åarityµ<²0“only‘¹/Åfunctor›•¡²is“signi can¸ãt).‘2­The˜function“ÅUnset‘¡E‰ff&fŽ–Ç«C‘¡E‰ff&fŽ“Bip‘¡E‰ff&fŽ“Name()‘•¢²remo•¸ãv“es˜suc“h‘•¢anŽ¡‘øãinitialization–ü (the›ü con¸ãtext“is“then˜reset“to“the˜last“ÅFunctor²/ÅArity“²set˜b¸ãy“a“call˜to“Åset‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name/2Ž¡‘øã²(section–Ù$7.22.3,‘ñûpage“135).‘HaThis“is“useful“when“writing“a“C‘Ùroutine“to“de ne“a“con¸ãtext“for“errors“oGccurringŽ¡‘øãin–UUthis“routine“and,“bGefore“exiting“to“restore“the“previous“con¸ãtext.ޤ%þ6‘øãÄ9.3.2Ž‘‰Instan®9tiation‘ÕTerrorŽŸuT‘øã²The–UUfolloš¸ãwing“function“raises“an“instan˜tiation“error“(section“5.3.2,“page“37):ަ‘ã Åvoid‘?ýPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Instantiation(void)Ž¡‘øãÄ9.3.3Ž‘‰T®9ypQÇe‘ÕTerrorŽŸuT‘øã²The–UUfolloš¸ãwing“function“raises“a“t˜ypGe“error“(section“5.3.3,“page“38):ަ‘ã Åvoid›?ýPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Type(int˜atom‘¡E‰ff&fŽ“type,˜PlTerm˜culprit)ŽŽŸŽŒ‹Å Íf Ú‹– ý"EŸüfd‘øã²9.3‘ Raising–UUProlog“errorsŽŽŽ’±!€197ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅatom‘¡E‰ff&fŽ‘Ç«type–ãѲis“(the“inš¸ãternal“k˜ey‘ãÐof‘Ç)“the“atom“assošGciated“with“the“exp˜ected“t¸ãyp˜e.‘:F‘ÿ*ªor“eacš¸ãh“t˜ypGe“name“ÉTޤ ‘øã²there–‚—is›‚–a“correspGonding˜prede ned“atom˜stored“in˜a“global˜v‘ÿqÇariable“whose˜name“is˜of“the˜form“Åtype‘¡E‰ff&fŽ‘Ç«ÉT‘¼r².Ž¡‘øãÅculprit–UU²is“the“argumenš¸ãt“whic˜h“caused“the“error.Ž©‘øãÄExample²:‘qÇÅx–UU²is“an“atom“while“an“inš¸ãteger“w˜as“expGected:‘qÇÅPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Type(type‘¡E‰ff&fŽ“integer,‘?ýx)².ŽŸ%þ6‘øãÄ9.3.4Ž‘‰Domain‘ÕTerrorŽŸuT‘øã²The–UUfollo¸ãwing“function“raises“a“domain“error“(section“5.3.4,“page“38):ޤ‘ã Åvoid›?ýPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Domain(int˜atom‘¡E‰ff&fŽ“domain,˜PlTerm˜culprit)Ž¡‘øãatom‘¡E‰ff&fŽ‘Ç«domain–à²is“(the“inš¸ãternal“k˜ey“of‘Ç)“the“atom“assošGciated“with“the“exp˜ected“domain.‘F‘ÿ*ªor“eac¸ãh“domainޤ ‘øãname–Œ¿ÉD‘I#²there“is“a“correspGonding“prede ned›ŒÀatom“stored“in“a“global“v‘ÿqÇariable“whose“name˜is“of“the“formŽ¡‘øãÅdomain‘¡E‰ff&fŽ‘Ç«ÉD‘¼r².–UUÅculprit“²is“the“argumenš¸ãt“whic˜h“caused“the“error.ަ‘øãÄExample²:›qÇÅx–UU²is“µ<“²0“but“should“bGe“¸“²0:˜ÅPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Domain(domain‘¡E‰ff&fŽ“not‘¡E‰ff&fŽ“less‘¡E‰ff&fŽ“than‘¡E‰ff&fŽ“zero,‘?ýx)².ŽŸ%þ6‘øãÄ9.3.5Ž‘‰Existence‘ÕTerrorŽŸuT‘øã²The–UUfollo¸ãwing“function“raises“an“existence“error“(section“5.3.5,“page“39):ޤ‘ã Åvoid›?ýPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Existence(int˜atom‘¡E‰ff&fŽ“object,˜PlTerm˜culprit)Ž¡‘øãatom‘¡E‰ff&fŽ‘Ç«object–às²is“(the“in•¸ãternal›àrk“ey–àsof‘Ç)“the“atom“assoGciated“with˜the“tš¸ãypGe“of“the“ob‘Ž8ject.‘ F‘ÿ*ªor“eac˜h“ob‘Ž8jectޤ ‘øãname–Œ¿ÉO‘I#²there“is“a“correspGonding“prede ned›ŒÀatom“stored“in“a“global“v‘ÿqÇariable“whose“name˜is“of“the“formŽ¡‘øãÅexistence‘¡E‰ff&fŽ‘Ç«ÉO‘¼r².–UUÅculprit“²is“the“argumenš¸ãt“whic˜h“caused“the“error.ަ‘øãÄExample²:›qÇÅx–UU²doGes“not“refer“to“an“existing“source:˜ÅPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Existence(existence‘¡E‰ff&fŽ“source‘¡E‰ff&fŽ“sink,‘?ýx)².ŽŸ%þ6‘øãÄ9.3.6Ž‘‰P®9ermission‘ÕTerrorŽŸuT‘øã²The–UUfollo¸ãwing“function“raises“a“pGermission“error“(section“5.3.6,“page“39):ޤ‘ã Åvoid›?ýPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Permission(int˜atom‘¡E‰ff&fŽ“operation,˜int˜atom‘¡E‰ff&fŽ“permission,˜PlTerm˜culprit)Ž¡‘øãatom‘¡E‰ff&fŽ‘Ç«operation–\N²is“(the“in•¸ãternal‘\Mk“ey–\Nof‘Ç)“the“atom“assošGciated“with“the“op˜eration‘\Mwhic¸ãh“caused“the“error.ޤ ‘øãF‘ÿ*ªor–Ðeac¸ãh›Ð opGeration“name“ÉO‘Œr²there“is“a˜correspGonding“prede ned“atom˜stored“in“a“global˜v‘ÿqÇariable“whoseŽ¡‘øãname–Cis“of›Cthe“form“Åpermission‘¡E‰ff&fŽ–Ç«operation‘¡E‰ff&fŽ“ÉO‘¼r².‘CÅatom‘¡E‰ff&fŽ“permission˜²is–C(the“inš¸ãternal“k˜ey“of‘Ç)‘Cthe“atom“asso-Ž¡‘øãciated–swith›sthe“tried˜pGermission.‘ÌwF‘ÿ*ªor“eac¸ãh˜pGermission“name˜ÉP‘/ú²there“is˜a“correspGonding˜prede ned“atomŽ¡‘øãstored–˜in“a›˜global“v‘ÿqÇariable“whose“name˜is“of“the“form˜Åpermission‘¡E‰ff&fŽ–Ç«type‘¡E‰ff&fŽ“ÉP‘¼r².–˜Åculprit“²is“the˜argumenš¸ãt“whic˜hŽ¡‘øãcaused–UUthe“error.ަ‘øãÄExample²:›qÇreading–UUfrom“an“output“stream“Åx²:˜ÅPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Permission(permission‘¡E‰ff&fŽ“operation‘¡E‰ff&fŽ“input,Ž¡‘øãpermission‘¡E‰ff&fŽ–Ç«type‘¡E‰ff&fŽ“stream,‘?ýx)².ŽŸ%þ6‘øãÄ9.3.7Ž‘‰Represen®9tation‘ÕTerrorŽŸuT‘øã²The–UUfolloš¸ãwing“function“raises“a“represen˜tation“error“(section“5.3.7,“page“39):ŽŸ‘ã Åvoid›?ýPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Representation(int˜atom‘¡E‰ff&fŽ“limit)ŽŽŸŽŒ‹Æ Úc Ú‹– ý"EŸüfd‘øã²198ŽŽŽ’h9‘ INTERF‘þãA•¸ãCING›UUPR“OLOG˜AND˜CŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅatom‘¡E‰ff&fŽ‘Ç«limit–>M²is‘>L(the“inš¸ãternal“k˜ey“of‘Ç)›>Lthe“atom“assoGciated“with˜the“reacš¸ãhed“limit.‘,®F‘ÿ*ªor“eac˜h‘>Llimit“nameޤ ‘øãÉL‘Ý•²there–!™is›!ša“correspGonding˜prede ned“atom˜stored“in˜a“global˜v‘ÿqÇariable“whose˜name“is˜of“the˜formŽ¡‘øãÅrepresentation‘¡E‰ff&fŽ‘Ç«ÉL‘¼r².Ž©‘øãÄExample²:‘qÇan–UUarit¸ãy“tošGo“big“o˜ccurs:‘qÇÅPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Representation(representation‘¡E‰ff&fŽ“max‘¡E‰ff&fŽ“arity)².ŽŸ%þ6‘øãÄ9.3.8Ž‘‰Ev‘ÿ\raluation‘ÕTerrorŽŸuT‘øã²The–UUfollo¸ãwing“function“raises“an“ev‘ÿqÇaluation“error“(section“5.3.8,“page“40):ޤ‘ã Åvoid›?ýPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Evaluation(int˜atom‘¡E‰ff&fŽ“error)Ž¡‘øãatom‘¡E‰ff&fŽ‘Ç«error–²is“(the“inš¸ãternal“k˜ey‘of‘Ç)“the“atom“assoGciated“with“the“error.‘ ÂùF‘ÿ*ªor“eac˜h“ev‘ÿqÇaluation“errorޤ ‘øãname–Œ¿ÉE‘I#²there“is“a“correspGonding“prede ned›ŒÀatom“stored“in“a“global“v‘ÿqÇariable“whose“name˜is“of“the“formŽ¡‘øãÅevaluation‘¡E‰ff&fŽ‘Ç«ÉE‘¼r².ަ‘øãÄExample²:›qÇa–UUdivision“b¸ãy“zero“oGccurs:˜ÅPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Evaluation(evluation‘¡E‰ff&fŽ“zero‘¡E‰ff&fŽ“divisor)².ŽŸ%þ6‘øãÄ9.3.9Ž‘‰Resource‘ÕTerrorŽŸuT‘øã²The–UUfollo¸ãwing“function“raises“a“resource“error“(section“5.3.9,“page“40):ޤ‘ã Åvoid›?ýPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Resource(int˜atom‘¡E‰ff&fŽ“resource)Ž¡‘øãatom‘¡E‰ff&fŽ‘Ç«resource–ÜR²is“(the‘ÜSinš¸ãternal“k˜ey“of‘Ç)“the›ÜSatom“assoGciated“with“the˜resource.‘¾F‘ÿ*ªor˜eac¸ãh“resource“errorޤ ‘øãname–Œ¿ÉR‘I#²there“is“a“correspGonding“prede ned›ŒÀatom“stored“in“a“global“v‘ÿqÇariable“whose“name˜is“of“the“formŽ¡‘øãÅresource‘¡E‰ff&fŽ‘Ç«ÉR‘¼r².ަ‘øãÄExample²:‘qÇtošGo–UUman¸ãy“op˜en“streams:‘qÇÅPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Resource(resource‘¡E‰ff&fŽ“too‘¡E‰ff&fŽ“many‘¡E‰ff&fŽ“open‘¡E‰ff&fŽ“streams)².ŽŸ%þ6‘øãÄ9.3.10Ž‘!ƇSyn®9tax‘ÕTerrorŽŸuT‘øã²The–UUfolloš¸ãwing“function“raises“a“syn˜tax“error“(section“5.3.10,“page“40):ޤ‘ã Åvoid›?ýPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Syntax(int˜atom‘¡E‰ff&fŽ“error)Ž¡‘øãatom‘¡E‰ff&fŽ‘Ç«error–⥲is‘â¦(the“inš¸ãternal“k˜ey“of‘Ç)›â¦the“atom“assoGciated˜with“the“error.‘¸There“is“no˜prede ned“syn¸ãtaxޤ ‘øãerror‘UUatoms.ަ‘øãÄExample²:›qÇa–UUÅ/“²is“expGected:˜ÅPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“Syntax(Create‘¡E‰ff&fŽ“Atom("/‘?ýexpected"))².ަ‘øãThe–´follo¸ãwing›´function“emits“a˜syn¸ãtax“error“according˜to“the“v‘ÿqÇalue˜of“the“Åsyntax‘¡E‰ff&fŽ‘Ç«error˜²Prolog“ agŽ¡‘øã(section–™87.22.1,‘ê1page“133).‘=pThis“function“can›™9then“return“(if“the“v‘ÿqÇalue“of“the˜ ag“is“either“ÅwarningŽ¡‘øã²or–v/Åfail²).‘ÔVIn“that“case“the“calling“function‘v0should“fail“(e.g.‘ÔUreturning‘™½ÅFALSE²).“This“function“acceptsŽ¡‘øãa–G— le“name“(the“emptš¸ãy“string“C‘GYÅ""“²can“bGe“passed),‘„'a“line“and“column“n˜um˜bGer“and“an“error“messageŽ¡‘øãstring.‘µ†Using›këthis–kêfunction“mak¸ães“it“pGossible“to“further“call˜the“built-in“predicate“Åsyntax‘¡E‰ff&fŽ–Ç«error‘¡E‰ff&fŽ“info/4Ž¡‘øã²(section–UU7.14.4,“page“95):ޤ‘ã Åvoid›?ýEmit‘¡E‰ff&fŽ–Ç«Syntax‘¡E‰ff&fŽ“Error(char˜*file‘¡E‰ff&fŽ“name,˜int˜line,˜int˜column,˜char˜*message)Ž¡‘øãÄExample²:›qÇa–UUÅ/“²is“expGected:˜ÅEmit‘¡E‰ff&fŽ–Ç«Syntax‘¡E‰ff&fŽ“Error("data",–?ý10,“30,“"/“expected")².ŽŽŸŽŒ‹Ç é¿ Ú‹– ý"EŸüfd‘øã²9.4‘ Calling–UUProlog“from“CŽŽŽ’±!€199ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÄ9.3.11Ž‘!ƇSystem‘ÕTerrorŽŸuT‘øã²The–UUfollo¸ãwing“function“raises“a“system“error“(4.3.11,“page“*):ޤÑã Åvoid›?ýPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“System(int˜atom‘¡E‰ff&fŽ“error)Ž¡‘øãatom‘¡E‰ff&fŽ‘Ç«error–Ò²is‘Ò (the“inš¸ãternal“k˜ey›Ò of‘Ç)“the“atom˜assoGciated“with“the˜error.‘çñThere“is“no˜prede ned“systemŽ© ‘øãerror‘UUatoms.ޤ‘øãÄExample²:‘qÇan–UUinš¸ãv‘ÿqÇalid“pathname“is“giv˜en:‘qÇÅPl‘¡E‰ff&fŽ–Ç«Err‘¡E‰ff&fŽ“System(Create‘¡E‰ff&fŽ“Atom("invalid–?ýpath“name"))².Ž¡‘øãThe–ƒ4follo¸ãwing“function“emits‘ƒ3a“system“error“assošGciated“with“an“op˜erating“system‘ƒ3error“according“to“theަ‘øãv‘ÿqÇalue–fóof“the“Åos‘¡E‰ff&fŽ‘Ç«error“²Prolog“ ag“(section›fô7.22.1,‘kZpage“133).‘¦¡This˜function“can“then“return“(if“the“v‘ÿqÇalueަ‘øãof–â the“ ag›â is“either“Åwarning“²or“Åfail²).‘KYIn˜that“case“the“calling“function˜should“fail“(e.g.‘KYreturning‘˜ÅFALSE²).ަ‘øãThis–UUfunction“uses“the“v›ÿqÇalue“of“the“Åerrno“²C“library“v˜ariable:ޤÑã Åvoid‘?ýOs‘¡E‰ff&fŽ‘Ç«Error(void)Ž¡‘øãÄExample²:›qÇa–UUcall“to“the“C“Unix“function“Åchdir(3)“²returns“Å-1²:˜ÅOs‘¡E‰ff&fŽ‘Ç«Error()².ŽŸ'¹þ‘øãÇ9.4Ž‘£Calling–€Prolog“from“CޤuT‘øãÄ9.4.1Ž‘‰In®9troQÇductionŽ¡‘øã²The–UUfolloš¸ãwing“functions“allo˜ws“a“C“function“to“call“a“Prolog“predicate:ޤÑã Åvoid‘¿÷Pl_Query_Begin‘)ÿè(Bool‘?ýrecoverable)ަ‘ã int‘ÿôPl_Query_Call‘/?å(int–?ýfunctor,“int“arity,“PlTerm“*arg)ަ‘ã int‘ÿôPl_Query_Next_Solution(void)ަ‘ã void‘¿÷Pl_Query_End‘4â(int‘?ýop)ަ‘ã PlTerm‘?ýPl_Get_Exception‘î(void)ަ‘ã void‘¿÷Pl_Exec_Continuation‘ ú(int–?ýfunctor,“int“arity,“PlTerm“*arg)Ž¡‘øã²The›UUin•¸ãv“o•Gcation˜of˜a˜Prolog˜predicate˜should˜b“e˜done˜as˜follo¸ãws:Ž¡‘ã¸ŽŽŽ‘ã ²opGen–UUa“query“using‘xâÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“Begin()ŽŸa‘ã¸ŽŽŽ‘ã ²compute–UUthe“ rst“solution“using‘xâÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“Call()ޤaŽ‘ã¸ŽŽŽ‘ã ²ev•¸ãen“tually–UUcompute“next“solutions“using‘xâÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“Next‘¡E‰ff&fŽ“Solution()Ž¡‘ã¸ŽŽŽ‘ã ²close–UUthe“query“using‘xâÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“End()ޤÑøã²The–Àêfunction“ÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“Begin(recoverable)›Àë²is–Àêused“to“initialize˜a“query‘ÿ*ª.‘´‡The“argumen¸ãt“Årecoverableަ‘øã²shall–ÂàbGe›Âßset“to˜ÅTRUE‘ÂIJif˜the“user“w•¸ãan“ts˜to›Âàreco“v“er,‘ÞBat˜the–Âßend˜of“the˜query‘ÿ*ª,‘ÞBthe˜memory“space˜consumedަ‘øãbš¸ãy–H¯the“query“(in“that“case‘H°an“additional“c˜hoice-pGoin˜t“is“created).‘KÕAll“terms“created“in‘H°the“heap,‘……e.g.ަ‘øãusing‘ù$ÅMk‘¡E‰ff&fŽ‘Ç«...‘òŒ²family–Õ–functions›Õ—(section“9.2.5,–õ§page˜194),“after‘Õ–the˜in•¸ãv“oGcation˜of‘œ³ÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“Begin()˜²canަ‘øãbGe›UUreco•¸ãv“ered˜when˜calling‘xâÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“End(TRUE)˜²(see˜bGelo¸ãw).ŽŸ‘øãThe›nfunction‘oÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“Call(functor,–?ýarity,“arg)˜²calls–oa˜predicate“passing˜argumen¸ãts.‘It“is˜thenަ‘øãused–­,to›­-compute“the˜ rst“solution.‘yMThe˜argumen¸ãts“Åfunctor²,‘Ã#Åarity“²and“Åarg˜²are“similar˜to“those˜of“theަ‘øãfunctions–UUhandling“complex“terms“(section“9.2.1,“page“190).‘qÇThis“function“returns:Ž¡‘ã¸ŽŽŽ‘ã ÅPL‘¡E‰ff&fŽ‘Ç«FAILURE–UU²(a“constan¸ãt“equal“to“ÅFALSE²,“i.e.‘qÇ0)“if“the“query“fails.ޤaŽ‘ã¸ŽŽŽ‘ã ÅPL‘¡E‰ff&fŽ‘Ç«SUCCESS‘œž²(a‘œ¯constanš¸ãt–œ°equal“to“ÅTRUE²,“i.e.‘GØ1)“in“case“of“success.‘G×In“that“case“the“argumen˜t“arra˜yަ‘ã Åarg–UU²can“bšGe“used“to“obtain“the“uni cation“p˜erformed“b¸ãy“the“query‘ÿ*ª.Ž¡‘ã¸ŽŽŽ‘ã ÅPL‘¡E‰ff&fŽ›Ç«EXCEPTION‘¥õ²(a–¦ constan¸ãt“equal“to“2).‘cæIn“that“case“function“ÅPl‘¡E‰ff&fŽ˜Get‘¡E‰ff&fŽ˜Exception()“²can“bGe“used“toަ‘ã obtained–UUthe“exceptional“term“raised“b¸ãy‘xâÅthrow/1“²(section“6.2.4,“page“47).ŽŽŸŽŒ‹È ø( Ú‹– ý"EŸüfd‘øã²200ŽŽŽ’h9‘ INTERF‘þãA•¸ãCING›UUPR“OLOG˜AND˜CŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãThe–/function“ÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“Next‘¡E‰ff&fŽ“Solution()–/²is“used“to“compute“a“new“solution.‘KIt“m¸ãust“bGe“only“used“ifޤ ‘øãthe–Þresult›Ýof“the˜previous“solution˜w¸ãas“ÅPL‘¡E‰ff&fŽ‘Ç«SUCCESS².˜This“functions˜returns“the˜same“kind˜of“v‘ÿqÇalues˜asŽ¡‘øãÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“Call()–UU²(see“abGo•¸ãv“e).ŽŸ‘øãThe–’òfunction“ÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“End(op)›’ñ²is–’òused“to“ nish“a˜query‘ÿ*ª.‘*žThis“function“mainly˜manages“the“remainingŽ¡‘øãalternativš¸ães–¶of‘¶the“query‘ÿ*ª.‘“ÞHo˜w˜ev˜er,‘Î4ev˜en“if“the“query‘¶has“no“alternativ˜es‘¶this“function“m˜ust“bGe‘¶used“toŽ¡‘øãcorrectly–UU nish“the“query‘ÿ*ª.‘qÇThe“v‘ÿqÇalue“of‘rÅop“²is:Ž©‘ã¸ŽŽŽ‘ã ÅPL‘¡E‰ff&fŽ‘Ç«RECOVER²:–·‚to“reco•¸ãv“er–·‚the“memory›·space“consumed“b¸ãy“the“query‘ÿ*ª.‘˜NAfter˜that“the“state“of“PrologŽ¡‘ã stac¸ãks–ais›`exactly“the“same˜as“b•Gefore˜op“ening–athe“query–ÿ*ª.‘¢êT“o˜use–athis˜option“the“query˜mš¸ãust“ha˜v˜eŽ¡‘ã bšGeen–UUinitialized“sp˜ecifying‘xâÅTRUE“²for“Årecoverable“²(see“ab˜o•¸ãv“e).ަ‘ã¸ŽŽŽ‘ã ÅPL‘¡E‰ff&fŽ‘Ç«CUT²:–UUto“cut“remaining“alternativ¸ães.‘qÇThe“e ect“of“this“option“is“similar“to“a“cut“after“the“query‘ÿ*ª.ަ‘ã¸ŽŽŽ‘ã ÅPL‘¡E‰ff&fŽ–Ç«KEEP‘¡E‰ff&fŽ“FOR‘¡E‰ff&fŽ“PROLOG²:–¸Ôto“kš¸ãeep“the“alternativ˜es“for“Prolog.‘=This“is“useful“when“the“query“w˜as“in˜v˜ok˜edŽ¡‘ã in–£-a“foreign›£.C‘£function.‘[OIn“that˜case,‘¶£when“the“predicate“correspGonding“to˜the“C‘£foreign“functionŽ¡‘ã is›™|in•¸ãv“ok“ed˜a˜query˜is˜executed˜and˜the˜remaining˜alternativ“es˜are˜then˜a“v‘ÿqÇailable˜as˜alternativ“es˜ofŽ¡‘ã that‘UUpredicate.ަ‘øãNote–sthat›rsev¸ãeral“queries˜can“bGe“nested˜since“a˜stac¸ãk“of“queries˜is“main¸ãtained.‘_{F‘ÿ*ªor“instance,‘)mit˜is“pGossibleŽ¡‘øãto–Ücall›Üa“query˜and“bGefore˜terminating“it˜to“call“another˜query‘ÿ*ª.‘ ÊIn˜that“case˜the“ rst˜execution“ofŽ¡‘øãÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“End()–•²will›•Ž nish“the“second“query˜(i.e.‘2othe˜inner)“and“the“next˜execution“of‘\ªÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“End()Ž¡‘øã²will–UU nish“the“ rst“query‘ÿ*ª.Ž©‘øãFinally‘ÿ*ª,‘²the–lTfunction“ÅPl‘¡E‰ff&fŽ–Ç«Exec‘¡E‰ff&fŽ“Continuation(functor,–?ýarity,“arg)›lU²replaces–lTthe“curren¸ãt˜calculus“b¸ãyŽ¡‘øãthe–a¸execution“of“the“spGeci ed“predicate.‘–ñThe“argumen¸ãts“Åfunctor²,‘dÑÅarity“²and“Åarg“²are“similar“to“those“ofŽ¡‘øãthe–UUfunctions“handling“complex“terms“(section“9.2.1,“page“190).ŽŸ%þ6‘øãÄ9.4.2Ž‘‰Example:‘pÅmy‘¡E‰ff&fŽ‘Ç«call/1–ÕTÄ-“a“Åcall/1“ÄcloneŽŸuT‘øã²W‘ÿ*ªe–B·here“de ne“a“predicate“Åmy‘¡E‰ff&fŽ‘Ç«call(Goal)“²whicš¸ãh“acts“lik˜e“Åcall(Goal)“²except“that“w˜e“do“not“handleŽ¡‘øãexceptions–UU(if“an“exception“oGccurs“the“goal“simply“fails):ަ‘øãIn–UUthe“prolog“ le“Åexamp.pl²:ޤ‘ã Å:-‘?ýforeign(my‘¡E‰ff&fŽ‘Ç«call(term)).Ž¡‘øã²In–UUthe“C“ le“Åexamp‘¡E‰ff&fŽ‘Ç«c.c²:Ž¡‘ã Å#include‘?ýޤ ‘ã #include‘?ý"gprolog.h"Ž¡¡‘ã BoolŽ¡‘ã my_call(PlTerm‘?ýgoal)Ž¡¡‘ã {Ž¡‘cPlTerm‘?ý*arg;Ž¡‘cint–?ýfunctor,“arity;Ž¡‘cint‘?ýresult;Ž¡¡‘carg–?ý=“Rd_Callable_Check(goal,“&functor,“&arity);Ž¡‘cPl_Query_Begin(FALSE);Ž¡‘cresult–?ý=“Pl_Query_Call(functor,“arity,“arg);Ž¡‘cPl_Query_End(PL_KEEP_FOR_PROLOG);Ž¡‘creturn–?ý(result“==“PL_SUCCESS);Ž¡‘ã }ŽŸ‘øã²The–UUcompilation“proGduces“an“executable“called“Åexamp²:ŽŽŸŽŒ‹É n Ú‹– ý"EŸüfd‘øã²9.4‘ Calling–UUProlog“from“CŽŽŽ’±!€201ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Å%–?ýgplc“examp.pl“examp‘¡E‰ff&fŽ‘Ç«c.cŽ©âÔ‘øã²Examples–UUof“use:ޤsT›ŸŸæd‘ã Å|–?ý?-“my‘¡E‰ff&fŽ‘Ç«call(write(hello)).ŽŽ¤ ‘ã helloŽŽ¡¡‘ã |–?ý?-“my‘¡E‰ff&fŽ‘Ç«call(for(X,1,3)).ŽŽ¡¡‘ã X–?ý=“1“?ŽŽŽ’ƒ²©²(here–UUthe“user“presses“Å;“²to“compute“another“solution)ŽŽ¡¡‘ã ÅX–?ý=“2“?ŽŽŽ’ƒ²©²(here–UUthe“user“presses“Å;“²to“compute“another“solution)ŽŽ¡¡‘ã ÅX–?ý=“3ŽŽŽ’ƒ²©²(here–UUthe“user“is“not“prompted“since“there“is“no“more“alternativ¸ãe)ŽŽ¡¡‘ã Å|–?ý?-“my‘¡E‰ff&fŽ‘Ç«call(1).ŽŽ¡‘ã {exception:‘?ýerror(type‘¡E‰ff&fŽ–Ç«error(callable,1),my‘¡E‰ff&fŽ“call/1)}ŽŽ¡¡‘ã |–?ý?-“my‘¡E‰ff&fŽ‘Ç«call(call(1)).ŽŽ¡¡‘ã noŽŽŽŽŽ¡‘øã²When–°Åmy‘¡E‰ff&fŽ‘Ç«call(1)“²is›±called“an“error“is˜raised“due“to“the“use˜of‘ÎÍÅRd‘¡E‰ff&fŽ–Ç«Callable‘¡E‰ff&fŽ“Check()².‘WæHo•¸ãw“ev“er–°the“errorޤ ‘øãraised–UUbš¸ãy‘xâÅmy‘¡E‰ff&fŽ‘Ç«call(call(1))“²is“ignored“and“ÅFALSE“²(i.e.‘qÇa“failure)“is“returned“b˜y“the“foreign“function.ŽŸ‘øãT‘ÿ*ªo–õrreally‘õssimš¸ãulate“the“bGeha˜vior“of‘¼Åcall/1“²when“an‘õsexception“is“reco˜v˜ered›õsit“should“bGe“re-raised˜to“bGeŽ¡‘øãcaptured–=Xb¸ãy›=Wan“earlier“handler.‘iÈThe˜idea“is“then˜to“execute“a“Åthrow/1˜²as“the“con•¸ãtin“uation.‘iÈThis˜is‘=XwhatŽ¡‘øãit–UUis“done“bš¸ãy“the“follo˜wing“coGde:ŽŸâÓ‘ã Å#include‘?ýŽ¡‘ã #include‘?ý"gprolog.h"Ž¡¡‘ã BoolŽ¡‘ã my_call(PlTerm‘?ýgoal)Ž¡‘ã {Ž¡‘cPlTerm‘?ý*args;Ž¡‘cint–?ýfunctor,“arity;Ž¡‘cint‘?ýresult;Ž¡¡‘cargs–?ý=“Rd_Callable_Check(goal,“&functor,“&arity);Ž¡‘cPl_Query_Begin(FALSE);Ž¡‘cresult–?ý=“Pl_Query_Call(functor,“arity,“args);Ž¡‘cPl_Query_End(PL_KEEP_FOR_PROLOG);Ž¡‘cif–?ý(result“==“PL_EXCEPTION)Ž¡‘&âý{Ž¡‘1b÷PlTerm–?ýexcept“=“Pl_Get_Exception();Ž¡‘1b÷Pl_Exec_Continuation(Find_Atom("throw"),–?ý1,“&except);Ž¡‘&âý}Ž¡¡‘creturn‘?ýresult;Ž¡‘ã }ަ‘øã²The–UUfolloš¸ãwing“coGde“propagates“the“error“raised“b˜y‘xâÅcall/1².Ž©T›Ÿùæd‘ã Å|–?ý?-“my‘¡E‰ff&fŽ‘Ç«call(call(1)).ŽŽ¡‘ã {exception:‘?ýerror(type‘¡E‰ff&fŽ–Ç«error(callable,1),my‘¡E‰ff&fŽ“call/1)}ŽŽŽŽŽ¦‘øã²Finally–UUnote“that“a“simpler“w•¸ãa“y–UUto“de ne“Åmy‘¡E‰ff&fŽ›Ç«call/1“²is“to“use“ÅPl‘¡E‰ff&fŽ˜Exec‘¡E‰ff&fŽ˜Continuation()“²as“follo¸ãws:ŽŸâÔ‘ã Å#include‘?ýŽŽŸŽŒ‹Ê ö Ú‹– ý"EŸüfd‘øã²202ŽŽŽ’h9‘ INTERF‘þãA•¸ãCING›UUPR“OLOG˜AND˜CŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Å#include‘?ý"gprolog.h"ޤ ¡‘ã BoolŽ¡‘ã my_call(PlTerm‘?ýgoal)Ž¡‘ã {Ž¡‘cPlTerm‘?ý*args;Ž¡‘cint–?ýfunctor,“arity;Ž¡¡‘cargs–?ý=“Rd_Callable_Check(goal,“&functor,“&arity);Ž¡‘cPl_Exec_Continuation(functor,–?ýarity,“args);Ž¡‘creturn‘?ýTRUE;Ž¡‘ã }ŽŸ%ºô‘øãÄ9.4.3Ž‘‰Example:‘preco•®9v“ering–ÕTthe“list“of“all“opQÇeratorsŽŸuT‘øã²W‘ÿ*ªe–~here“de ne“a›~predicate“Åall‘¡E‰ff&fŽ‘Ç«op(List)“²whic¸ãh“uni es“ÅList“²with“the“list˜of“all“curren¸ãtly“de ned“opGeratorsŽ¡‘øãas–UUwš¸ãould“bGe“done“b˜y:‘qÇÅfindall(X,current‘¡E‰ff&fŽ–Ç«op(‘¡E‰ff&fŽ“,‘¡E‰ff&fŽ“,X),List)².Ž©‘øãIn–UUthe“prolog“ le“Åexamp.pl²:ŽŸÇ”‘ã Å:-‘?ýforeign(all‘¡E‰ff&fŽ‘Ç«op(term)).ޤÇ“‘øã²In–UUthe“C“ le“Åexamp‘¡E‰ff&fŽ‘Ç«c.c²:Ž¡‘ã Å#include‘?ýޤ ‘ã #include‘?ý"gprolog.h"Ž¡¡‘ã BoolŽ¡‘ã all_op(PlTerm‘?ýlist)Ž¡‘ã {Ž¡‘cPlTerm‘?ýop[1024];Ž¡‘cPlTerm‘?ýargs[3];Ž¡‘cint–?ýn“=“0;Ž¡‘cint‘?ýresult;Ž¡¡‘cPl_Query_Begin(TRUE);Ž¡‘cargs[0]–?ý=“Mk_Variable();Ž¡‘cargs[1]–?ý=“Mk_Variable();Ž¡‘cargs[2]–?ý=“Mk_Variable();Ž¡‘cresult–?ý=“Pl_Query_Call(Find_Atom("current_op"),“3,“args);Ž¡‘cwhile‘?ý(result)Ž¡‘&âý{Ž¡‘1b÷op[n++]–?ý=“Mk_Atom(Rd_Atom(args[2]));“/*“arg“#2“is“the“name“of“the“op“*/Ž¡‘1b÷result–?ý=“Pl_Query_Next_Solution();Ž¡‘&âý}Ž¡‘cPl_Query_End(PL_RECOVER);Ž¡¡‘creturn–?ýUn_Proper_List_Check(n,“op,“list);Ž¡‘ã }ŽŸÇ“‘øã²Note–~Íthat“w•¸ãe›~Ìkno“w–~Íhere“that“there˜is“no“source“for˜exception.‘î/In˜that“case“the“result˜of‘EêÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“CallŽ¡‘øã²and›UUÅPl‘¡E‰ff&fŽ–Ç«Query‘¡E‰ff&fŽ“Next‘¡E‰ff&fŽ“Solution˜²can˜b•Ge˜considered˜as˜a˜b“o“olean.ަ‘øãThe–UUcompilation“proGduces“an“executable“called“Åexamp²:ޤÇ“‘ã Å%–?ýgplc“examp.pl“examp‘¡E‰ff&fŽ‘Ç«c.cŽ¡‘øã²Example–UUof“use:ŽŽŸŽŒ‹Ë í Ú‹– ý"EŸüfd‘øã²9.5‘ De ning–UUa“new“C“Åmain()“²functionŽŽŽ’±!€203ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘ã Å|–?ý?-“all_op(L).ޤ ¡‘ã L–?ý=“[:-,:-,\=,=:=,#>=,#<#,@>=,-->,mod,#>=#,**,*,+,+,',',...]Ž¡¡‘ã |–?ý?-“findall(X,current_op(_,_,X),L).Ž¡¡‘ã L–?ý=“[:-,:-,\=,=:=,#>=,#<#,@>=,-->,mod,#>=#,**,*,+,+,',',...]ŽŸ'þ6‘øãÇ9.5Ž‘£De ning–€a“new“C“ó߆µT cmtt12Êmain()“ÇfunctionŽŸuT‘øã²GNU‘ã…Prolog–ãªalloš¸ãws“the“user“to“de ne“his“o˜wn“Åmain()“²function.‘ÆThis“can“bšGe“useful“to“p˜erform“sev¸ãeralŽ¡‘øãtasks–ÒbGefore“starting›Ñthe“Prolog“engine.‘\ñT‘ÿ*ªo˜do“this“simply“de ne“a˜classical“Åmain(argc,‘?ýargv)“²function.Ž¡‘øãThe–UUfollo¸ãwing“functions“can“then“bGe“used:Ž©‘ã Åint‘ úStart_Prolog‘/?å(int–?ýargc,“char“*argv[])Ž¡‘ã void‘?ýStop_Prolog‘4â(void)Ž¡‘ã void‘?ýReset_Prolog‘/?å(void)Ž¡‘ã Bool‘?ýTry_Execute_Top_Level(void)ަ‘øã²The– pfunction“ÅStart‘¡E‰ff&fŽ‘Ç«Prolog(argc,‘?ýargv)“²initializes“the“Prolog“engine‘ q(Åargc“²and“Åargv“²are“the“command-Ž¡‘øãline–\Wv‘ÿqÇariables).‘†ÎThis›\Xfunction“collects“all˜link¸ãed“ob‘Ž8jects˜(issued“from“the˜compilation“of“Prolog˜ les)“andŽ¡‘øãinitializes–øÉthem.‘\$The“initialization“of›øÊa“Prolog“ob‘Ž8ject“ le˜consists“in“adding“to˜appropriate“tables“newŽ¡‘øãatoms,‘>new–7predicates›8and“executing˜its˜system“directiv•¸ães.‘WA‘#system˜directiv“e˜is‘7generated˜b“y‘7the˜PrologŽ¡‘øãto–ZuW‘þãAM‘Z1compiler“to›Ztre ect“a“(user)˜directiv¸ãe“executed“at“compile-time˜suc¸ãh“as“Åop/3˜²(section“6.1.10,Ž¡‘øãpage–X44).‘z#Indeed,‘˜Ñwhen“the›Xcompiler“encoun•¸ãters˜suc“h–Xa“directiv¸ãe˜it“immediately˜executes“it˜and“alsoŽ¡‘øãgenerates–a“system“directivš¸ãe“to“execute“it“at“the“start“of“the“executable.‘Z«When“all“system“directiv˜es“ha˜v˜eŽ¡‘øãbGeen–t:executed›t;the“Prolog“engine“executes˜all“initialization“directiv¸ães“de ned˜with“Åinitialization/1Ž¡‘øã²(section–É6.1.13,‘æŠpage“45).‘ÎFThe“function›É€returns“the“n•¸ãum“bGer–Éof˜user“directiv¸ães“(i.e.‘ÎFÅinitialization/1²)Ž¡‘øãexecuted.‘qÇThis–UUfunction“m¸ãust“bGe“called“only“once.Ž©‘øãThe–΄function“ÅStop‘¡E‰ff&fŽ‘Ç«Prolog()“²stops“the“Prolog“engine.‘ÝSThis“function“m¸ãust“bGe“called“only“once“after“allŽ¡‘øãProlog–UUtreatmenš¸ãt“ha˜v˜e“bGeen“done.ަ‘øãThe–UUfunction“ÅReset‘¡E‰ff&fŽ‘Ç«Prolog()“²reinitializes“the“Prolog“engine“(i.e.‘qÇreset“all“Prolog“stac¸ãks).ަ‘øãThe–ãâfunction“ÅTry‘¡E‰ff&fŽ–Ç«Execute‘¡E‰ff&fŽ“Top‘¡E‰ff&fŽ“Level()–ãâ²executes‘ãáthe“top-levš¸ãel“if“link˜ed“(section“3.4.3,‘G„page“22)“andŽ¡‘øãreturns–UUÅTRUE².“If“the“top-levš¸ãel“is“not“presen˜t“the“functions“returns“ÅFALSE².ަ‘øãHere–UUis“the“de nition“of“the“default“GNU“Prolog‘xâÅmain()“²function:ŽŸ‘ã ÅintŽ¡‘ã Main_Wrapper(int–?ýargc,“char“*argv[])Ž¡‘ã {Ž¡‘cint‘?ýnb_user_directive;Ž¡‘cBool‘?ýtop_level;Ž¡¡‘cnb_user_directive–?ý=“Start_Prolog(argc,“argv);Ž¡¡‘ctop_level–?ý=“Try_Execute_Top_Level();Ž¡¡‘cStop_Prolog();Ž¡¡‘cif–?ý(top_level“||“nb_user_directive)Ž¡‘&âýreturn‘?ý0;Ž¡¡‘cfprintf(stderr,ŽŽŸŽŒ‹Ì (ý Ú‹– ý"EŸüfd‘øã²204ŽŽŽ’h9‘ INTERF‘þãA•¸ãCING›UUPR“OLOG˜AND˜CŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘FbëÅ"Warning:–?ýno“initial“goal“executed\n"ޤ ‘Fbë"‘¿÷use–?ýa“directive“:-“initialization(Goal)\n"Ž¡‘Fbë"‘¿÷or–?ýremove“the“link“option“--no-top-level"Ž¡‘Fbë"–?ý(or“--min-bips“or“--min-size)\n");Ž¡¡‘creturn‘?ý1;Ž¡‘ã }Ž¡¡‘ã intŽ¡‘ã main(int–?ýargc,“char“*argv[])Ž¡‘ã {Ž¡‘creturn–?ýMain_Wrapper(argc,“argv);Ž¡‘ã }Ž©&D‘øã²Note–‡tthat“under“some“circumstances“it“is“necessary“to‘‡uencapsulate“the“coGde“of‘N‘Åmain()“²inside“an“in¸ãtermedi-Ž¡‘øãate–õfunction‘õcalled“b¸ãy‘Åmain()².›QÛIndeed,‘·some“C‘õwcompilers“(e.g.˜gcc)‘õtreats“Åmain()“²particularly‘ÿ*ª,‘·proGducingŽ¡‘øãan–tuncompatible“cošGde‘uw.r.t“GNU‘bProlog.‘Z'So“it“is“a“go˜o˜d‘uidea“to“alw•¸ãa“ys–tuse“a“wrapp˜er‘ufunction“as“sho¸ãwnŽ¡‘øãabGo•¸ãv“e.ŽŸ%ÏW‘øãÄ9.5.1Ž‘‰Example:‘pasking–ÕTfor“ancestorsŽŸuT‘øã²In–UUthis“example“wš¸ãe“use“the“follo˜wing“Prolog“coGde“(in“a“ le“called“Ånew‘¡E‰ff&fŽ‘Ç«main.pl²):ަ‘ã Åparent(bob,‘¿÷mary).Ž¡‘ã parent(jane,‘ úmary).Ž¡‘ã parent(mary,‘ úpeter).Ž¡‘ã parent(paul,‘ úpeter).Ž¡‘ã parent(peter,‘?ýjohn).Ž¡¡‘ã anc(X,‘?ýY):-Ž¡‘;âñparent(X,‘?ýY).Ž¡¡‘ã anc(X,–?ýZ)“:-Ž¡‘;âñparent(X,‘?ýY),Ž¡‘;âñanc(Y,‘?ýZ).ަ‘øã²The–kqfollo¸ãwing›kp le“(called“Ånew‘¡E‰ff&fŽ–Ç«main‘¡E‰ff&fŽ“c.c²)˜de nes–kqa“Åmain()˜²function“readinf“the˜name“of“a˜pGerson“andŽ¡‘øãdisplaš¸ãying–UUall“successors“of“that“pGerson.‘qÇThis“is“equiv‘ÿqÇalen˜t“to“the“Prolog“query:‘qÇÅanc(Result,‘?ýName)².ަ‘ã Åstatic‘?ýintŽ¡‘ã Main_Wrapper(int–?ýargc,“char“*argv[])Ž¡‘ã {Ž¡‘cint‘?ýfunc;Ž¡‘cWamWord‘?ýarg[10];Ž¡‘cchar‘?ýstr[100];Ž¡‘cchar‘?ý*sol[100];Ž¡‘cint–?ýi,“nb_sol“=“0;Ž¡‘cBool‘?ýres;Ž¡¡‘cStart_Prolog(argc,‘?ýargv);Ž¡¡‘cfunc–?ý=“Find_Atom("anc");Ž¡‘cfor‘?ý(;;)Ž¡‘&âý{Ž¡‘1b÷printf("\nEnter–?ýa“name“(or“'end'“to“finish):“");Ž¡‘1b÷scanf("%s",‘?ýstr);Ž¡ŽŸŽŒ‹Í 5€ Ú‹– ý"EŸüfd‘øã²9.5‘ De ning–UUa“new“C“Åmain()“²functionŽŽŽ’±!€205ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘1b÷Åif–?ý(strcmp(str,“"end")“==“0)ޤ ‘;âñbreak;Ž¡¡‘1b÷Pl_Query_Begin(TRUE);Ž¡¡‘1b÷arg[0]–?ý=“Mk_Variable();Ž¡‘1b÷arg[1]–?ý=“Mk_String(str);Ž¡‘1b÷nb_sol–?ý=“0;Ž¡‘1b÷res–?ý=“Pl_Query_Call(func,“2,“arg);Ž¡‘1b÷while‘?ý(res)Ž¡‘;âñ{Ž¡‘Fbësol[nb_sol++]–?ý=“Rd_String(arg[0]);Ž¡‘Fbëres–?ý=“Pl_Query_Next_Solution();Ž¡‘;âñ}Ž¡‘1b÷Pl_Query_End(PL_RECOVER);Ž¡¡‘1b÷for–?ý(i“=“0;“i“<“nb_sol;“i++)Ž¡‘;âñprintf("‘ úsolution:–?ý%s\n",“sol[i]);Ž¡‘1b÷printf("%d–?ýsolution(s)\n",“nb_sol);Ž¡‘&âý}Ž¡¡‘cStop_Prolog();Ž¡‘creturn‘?ý0;Ž¡‘ã }Ž¡¡‘ã intŽ¡‘ã main(int–?ýargc,“char“*argv[])Ž¡‘ã {Ž¡‘creturn–?ýMain_Wrapper(argc,“argv);Ž¡‘ã }ޤ‘øã²The–UUcompilation“proGduces“an“executable“called“Ånew‘¡E‰ff&fŽ‘Ç«main²:Ž¡‘ã Å%–?ýgplc“new‘¡E‰ff&fŽ›Ç«main.pl“new‘¡E‰ff&fŽ˜main‘¡E‰ff&fŽ˜c.cŽ¡‘øã²Examples–UUof“use:Ž¡‘ã ÅEnter–?ýa“name“(or“'end'“to“finish):“johnޤ ‘csolution:‘?ýpeterŽ¡‘csolution:‘?ýbobŽ¡‘csolution:‘?ýjaneŽ¡‘csolution:‘?ýmaryŽ¡‘csolution:‘?ýpaulŽ¡‘ã 5‘?ýsolution(s)Ž¡¡‘ã Enter–?ýa“name“(or“'end'“to“finish):“maryŽ¡‘csolution:‘?ýbobŽ¡‘csolution:‘?ýjaneŽ¡‘ã 2‘?ýsolution(s)Ž¡¡‘ã Enter–?ýa“name“(or“'end'“to“finish):“endŽŽŸŽŒ‹Î =¢ Ú‹– ý"EŸüfd‘øã²206ŽŽŽ’h9‘ INTERF‘þãA•¸ãCING›UUPR“OLOG˜AND˜CŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ»ŸŽŒ‹Ï C& Ú‹– ý"EŸüfd‘øã²REFERENCESŽŽŽ’±!€207ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øã¼ReferencesŽŸ!ç‘ýã²[1]ŽŽ‘ qCH.–UUA‘þ㎑üqt-Kaci.‘nï\W›ÿ*ªarren's“Abstract“Mac¸ãhine,“A“T˜utorial“Reconstruction".ޤ ‘ qCLogic–UUProgramming“Series,“MIT“Press,“1991.Ž¡‘ qCÅhttp://www.vanx.org/archive/wam/wam.htmlޤ‘ýã²[2]ŽŽ‘ qCW.F.–UUCloGc¸ãksin“and“C.S.“Mellish.‘nïProgramming“in“Prolog,“Springer-V‘ÿ*ªerlag,“1981.Ž¡‘ýã[3]ŽŽ‘ qCP‘ÿ*ª.–UUCoGdognet“and“D.“Diaz.‘nï\Åwamcc²:‘qÇCompiling“Prolog“to“C".ޤ ‘ qCIn›UUÈ12th–“çInternational“Confer–ÿ}'enc“e–“çon“L–ÿ}'o“gic‘“çPr“o“gr“amming²,˜T‘ÿ*ªoky¸ão,˜Japan,˜MIT˜Press,˜1995.Ž¡‘ qCÅftp://ftp.inria.fr/INRIA/Projects/loco/publications/WAMCC/iclp95.pdfŽ©‘ýã²[4]ŽŽ‘ qCP‘ÿ*ª.–UUCoGdognet“and“D.“Diaz.‘nï\Compiling“Constrain¸ãt“in“Åclp(FD)²".Ž¡‘ qCÈJournal–“çof“L–ÿ}'o“gic‘“çPr“o“gr“amming²,–UUV‘ÿ*ªol.“27,“No.“3,“June“1996.Ž¡‘ qCÅftp://ftp.inria.fr/INRIA/Projects/loco/publications/CLP-FD/jlp96.pdfަ‘ýã²[5]ŽŽ‘ qCD.–UUDiaz“and“P‘ÿ*ª.“CoGdognet.‘nï\Design“and“Implemen¸ãtation“of“the“GNU“Prolog“System".Ž¡‘ qCÈJournal–“çof“F‘ÿ;¼unctional“and“L–ÿ}'o“gic‘“çPr“o“gr“amming²,–UUV‘ÿ*ªol.“2001,“No.“6,“OctobGer“2001.Ž¡‘ qCÅftp://ftp.inria.fr/INRIA/Projects/loco/publications/GNU-PROLOG/jflp01.pdfަ‘ýã²[6]ŽŽ‘ŠÝInformation–UUtecš¸ãhnology“-“Programming“languages“-“Prolog“-“P˜art“1:‘qÇGeneral“Core.Ž¡‘ qCISO/IEC–UU13211-1,“1995.ަ‘ýã[7]ŽŽ‘ qCJ.–UUJa ar“and“J-L.“Lassez.‘nï\Constrain¸ãt“Logic“Programming".Ž¡‘ qCIn›UUÈPrinciples–“çOf“Pr–ÿ}'o“gr“amming‘“çL“anguages²,˜Munic•¸ãh,˜German“y‘ÿ*ª,˜Jan“uary˜1987.ަ‘ýã[8]ŽŽ‘ qCP–ÿ*ª.›UUV“an˜Hen•¸ãtenryc“k.‘nï\Constrain“t˜Satisfaction˜in˜Logic˜Programming".Ž¡‘ qCLogic–UUProgramming“Series,“The“MIT“Press,“1989.ަ‘ýã[9]ŽŽ‘ qCD.–UUH.“D.“W‘ÿ*ªarren.‘nï\An“Abstract“Prolog“Instruction“Set".Ž¡‘ qCT‘ÿ*ªecš¸ãhnical–UURepGort“309,“SRI“In˜ternational,“Oct.“1983.ŽŽŸŽŒ‹Ð CÉ Ú‹– ý"EŸüfd‘øã²208ŽŽŽ’{azREFERENCESŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ»ŸŽŒ‹Ñ K Ú‹– ý"EŸüfd‘øã²INDEXŽŽŽ’±!€209ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ýd#Ÿ 呸ã¼IndexŽŽ ›äÝ ý‚#‘øãÅ!/0²,–UUÄ46²,“47ޤ ‘øãÅ'.'/2²,‘UUÄ136Ž¡‘øãÅ(',')/2²,‘UUÄ46Ž¡‘øãÅ(-->)/2²,‘UUÄ109Ž¡‘øãÅ(->)/2²,‘UUÄ46Ž¡‘øãÅ(;)/2²,‘UUÄ46Ž¡‘øãÅ(=)/2²,‘UUÄ50Ž¡‘øãÅ(=..)/2²,‘UUÄ53Ž¡‘øãÅ(=:=)/2²,‘UUÄ60Ž¡‘øãÅ(==)/2²,–UUÄ51²,“122Ž¡‘øãÅ(=<)/2²,‘UUÄ60Ž¡‘øãÅ(=\=)/2²,‘UUÄ60Ž¡‘øãÅ(@=<)/2²,‘UUÄ51Ž¡‘øãÅ(@<)/2²,‘UUÄ51Ž¡‘øãÅ(@>)/2²,‘UUÄ51Ž¡‘øãÅ(@>=)/2²,‘UUÄ51Ž¡‘øãÅ(#/\)/2‘?ý²(FD),‘UUÄ174Ž¡‘øãÅ(#=)/2‘?ý²(FD),‘UUÄ171Ž¡‘øãÅ(#==>)/2‘?ý²(FD),‘UUÄ174Ž¡‘øãÅ(#=#)/2‘?ý²(FD),‘UUÄ172Ž¡‘øãÅ(#=<)/2‘?ý²(FD),‘UUÄ171Ž¡‘øãÅ(#=<#)/2‘?ý²(FD),‘UUÄ172Ž¡‘øãÅ(##)/2‘?ý²(FD),‘UUÄ174Ž¡‘øãÅ(#<)/2‘?ý²(FD),‘UUÄ171Ž¡‘øãÅ(#<=>)/2‘?ý²(FD),‘UUÄ174Ž¡‘øãÅ(#<#)/2‘?ý²(FD),‘UUÄ172Ž¡‘øãÅ(#>)/2‘?ý²(FD),‘UUÄ171Ž¡‘øãÅ(#>=)/2‘?ý²(FD),‘UUÄ171Ž¡‘øãÅ(#>=#)/2‘?ý²(FD),‘UUÄ172Ž¡‘øãÅ(#>#)/2‘?ý²(FD),‘UUÄ172Ž¡‘øãÅ(#\)/1‘?ý²(FD),‘UUÄ174Ž¡‘øãÅ(#\/)/2‘?ý²(FD),‘UUÄ174Ž¡‘øãÅ(#\/\)/2‘?ý²(FD),‘UUÄ174Ž¡‘øãÅ(#\=)/2‘?ý²(FD),‘UUÄ171Ž¡‘øãÅ(#\==>)/2‘?ý²(FD),‘UUÄ174Ž¡‘øãÅ(#\=#)/2‘?ý²(FD),‘UUÄ172Ž¡‘øãÅ(#\<=>)/2‘?ý²(FD),‘UUÄ174Ž¡‘øãÅ(#\\/)/2‘?ý²(FD),‘UUÄ174Ž¡‘øãÅ(is)/2²,‘UUÄ59Ž¡‘øãÅ(<)/2²,‘UUÄ60Ž¡‘øãÅ(>)/2²,‘UUÄ60Ž¡‘øãÅ(>=)/2²,‘UUÄ60Ž¡‘øãÅ(\+)/1²,‘UUÄ113Ž¡‘øãÅ(\=)/2²,‘UUÄ50Ž¡‘øãÅ(\==)/2²,‘UUÄ51Ž¡‘øãÅ--²,‘UUÄ13Ž¡‘øãÅ--assembly²,‘UUÄ22Ž¡‘øãÅ--aux-father²,‘UUÄ27Ž¡‘øãÅ--aux-father2²,‘UUÄ27Ž¡‘øãÅ--c-compiler²,‘UUÄ23Ž¡‘øãÅ--cmd-line²,‘UUÄ27Ž¡‘øãÅ--comment²,–UU23,“Ä23Ž¡‘øãÅ--compile-msg²,‘UUÄ22Ž¡‘øãÅ--cstr-size²,‘UUÄ23ŽŽŽ ý‚#’îEÅ--encode²,‘UUÄ27ޤ ’îEÅ--entry-goal²,‘UUÄ13Ž¡’îEÅ--fast-math²,–UUÄ22²,“59Ž¡’îEÅ--fd-to-c²,‘UUÄ22Ž¡’îEÅ--fixed-sizes²,–UU19,“Ä23Ž¡’îEÅ--foreign-only²,‘UUÄ22Ž¡’îEÅ--global-size²,‘UUÄ23Ž¡’îEÅ--help²,–UUÄ13²,“Ä22²,“Ä27Ž¡’îEÅ--init-goal²,‘UUÄ13Ž¡’îEÅ--keep-void-inst²,‘UUÄ22Ž¡’îEÅ--local-size²,–UU19,“Ä23Ž¡’îEÅ--min-bips²,‘UUÄ23Ž¡’îEÅ--min-fd-bips²,‘UUÄ23Ž¡’îEÅ--min-pl-bips²,‘UUÄ23Ž¡’îEÅ--min-reg-opt²,‘UUÄ22Ž¡’îEÅ--min-size²,‘UUÄ23Ž¡’îEÅ--mini-assembly²,‘UUÄ22Ž¡’îEÅ--no-call-c²,‘UUÄ22Ž¡’îEÅ--no-debugger²,–UU23,“Ä23Ž¡’îEÅ--no-decode-hexa²,‘UUÄ22Ž¡’îEÅ--no-del-temp²,‘UUÄ22Ž¡’îEÅ--no-fd-lib²,‘UUÄ23Ž¡’îEÅ--no-inline²,‘UUÄ22Ž¡’îEÅ--no-opt-last-subterm²,‘UUÄ22Ž¡’îEÅ--no-redef-error²,‘UUÄ22Ž¡’îEÅ--no-reg-opt²,‘UUÄ22Ž¡’îEÅ--no-reorder²,‘UUÄ22Ž¡’îEÅ--no-singl-warn²,‘UUÄ22Ž¡’îEÅ--no-susp-warn²,‘UUÄ22Ž¡’îEÅ--no-top-level²,‘UUÄ23Ž¡’îEÅ--object²,‘UUÄ22Ž¡’îEÅ--output²,‘UUÄ22Ž¡’îEÅ--pl-state²,–UUÄ22²,“136Ž¡’îEÅ--printf²,‘UUÄ27Ž¡’îEÅ--query-goal²,‘UUÄ13Ž¡’îEÅ--relax²,‘UUÄ27Ž¡’îEÅ--statistics²,‘UUÄ22Ž¡’îEÅ--strip²,‘UUÄ23Ž¡’îEÅ--temp-dir²,‘UUÄ22Ž¡’îEÅ--trail-size²,‘UUÄ23Ž¡’îEÅ--verbose²,‘UUÄ22Ž¡’îEÅ--version²,–UUÄ13²,“Ä22²,“Ä27Ž¡’îEÅ--wam-for-byte-code²,‘UUÄ22Ž¡’îEÅ--wam-for-native²,‘UUÄ22Ž¡’îEÅ-A²,‘UUÄ23Ž¡’îEÅ-C²,‘UUÄ23Ž¡’îEÅ-F²,‘UUÄ22Ž¡’îEÅ-H²,‘UUÄ27Ž¡’îEÅ-L²,‘UUÄ23Ž¡’îEÅ-M²,‘UUÄ22Ž¡’îEÅ-P²,‘UUÄ27Ž¡’îEÅ-S²,‘UUÄ22Ž¡’îEÅ-W²,‘UUÄ22Ž¡’îEÅ-c²,‘UUÄ22ŽŽŽŽŽŽŸŽŒ‹Ò L Ú‹– ý"EŸüfd‘øã²210ŽŽŽ’ŸFINDEXŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅ-h²,‘UUÄ22ޤ ‘øãÅ-o²,‘UUÄ22Ž¡‘øãÅ-s²,‘UUÄ23Ž¡‘øãÅ-v²,‘UUÄ22Ž¡‘øãÅ-w²,‘UUÄ22Ž©‘øãÅabolish/1²,‘UUÄ63Ž¡‘øãÅabort/0²,–UU17,“32,“Ä112Ž¡‘øãÅabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name‘?ý²(propGert¸ãy),‘UUÄ147Ž¡‘øãÅabsolute‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2²,–ÔI44,“70,‘ÔH136,“137,“Ä141²,Ž¡‘ ã142,‘UU144{149Ž¡‘øãÅadd‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“completion/1²,‘UUÄ162Ž¡‘øãÅadd‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“alias/2²,–UU67,“Ä79Ž¡‘øãÅadd‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“mirror/2²,–UU68,“Ä79Ž¡‘øãÅalias‘?ý²(option),‘UUÄ71Ž¡‘øãÅalias‘?ý²(propGert¸ãy),‘UUÄ73Ž¡‘øãÅappend‘?ý²(moGde),‘UUÄ70Ž¡‘øãÅappend/1²,‘UUÄ107Ž¡‘øãÅappend/3²,‘UUÄ121Ž¡‘øãÅarchitecture/1²,‘UUÄ151Ž¡‘øãÅarg/3²,‘UUÄ53Ž¡‘øã²argumen¸ãt–UUselector,“Ä126Ž¡‘øãÅargument‘¡E‰ff&fŽ‘Ç«counter/1²,‘UUÄ142Ž¡‘øãÅargument‘¡E‰ff&fŽ‘Ç«list/1²,–UU14,“Ä143Ž¡‘øãÅargument‘¡E‰ff&fŽ‘Ç«value/2²,–UU14,“Ä143Ž¡‘øãÅasserta/1²,‘UUÄ61Ž¡‘øãÅassertz/1²,‘UUÄ61Ž¡‘øãÅat‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream/0²,‘UUÄ74Ž¡‘øãÅat‘¡E‰ff&fŽ–Ç«end‘¡E‰ff&fŽ“of‘¡E‰ff&fŽ“stream/1²,‘UUÄ74Ž¡‘øãÅatom/1²,‘UUÄ49Ž¡‘øãÅatom‘¡E‰ff&fŽ‘Ç«chars/2²,‘UUÄ117Ž¡‘øãÅatom‘¡E‰ff&fŽ‘Ç«codes/2²,‘UUÄ117Ž¡‘øãÅatom‘¡E‰ff&fŽ‘Ç«concat/3²,‘UUÄ115Ž¡‘øãÅatom‘¡E‰ff&fŽ‘Ç«hash/2²,‘UUÄ119Ž¡‘øãÅatom‘¡E‰ff&fŽ‘Ç«length/2²,‘UUÄ114Ž¡‘øãÅatom‘¡E‰ff&fŽ‘Ç«property/2²,‘UUÄ120Ž¡‘øãÅatomic/1²,‘UUÄ49ަ‘øãÅback‘¡E‰ff&fŽ‘Ç«quotes‘?ý²( ag),–UU14,“91,“Ä134²,“136Ž¡‘øãÅback‘¡E‰ff&fŽ‘Ç«quotes‘?ý²(tok¸ãen),‘UUÄ94Ž¡‘øãÅbacktracks‘?ý²(FD–UUoption),“Ä180Ž¡‘øãÅbagof/3²,‘UUÄ66Ž¡‘øãÅbinary‘?ý²(option),–UUÄ70²,“81Ž¡‘øãÅbind‘¡E‰ff&fŽ‘Ç«variables/2²,‘UUÄ56Ž¡‘øãÅbip‘¡E‰ff&fŽ‘Ç«name‘?ý²(option),–UUÄ183²,“196Ž¡‘øãÅblock‘?ý²(option),–UUÄ71²,“82Ž¡‘øãÅblock‘¡E‰ff&fŽ‘Ç«device‘?ý²(pGermission),‘UUÄ147Ž¡‘øãÅbof‘?ý²(whence),‘UUÄ76Ž¡‘øãÅboolean‘?ý²(option),–UUÄ183²,“184Ž¡‘øãÅbounded‘?ý²( ag),‘UUÄ133Ž¡‘øãÅbounds‘?ý²(FD–UUoption),“Ä179Ž¡‘øãÅbreak/0²,–UU17,“32,“Ä112Ž¡‘øãÅbuffering‘?ý²(option),‘UUÄ71Ž¡‘øãÅbuffering‘?ý²(propGert¸ãy),‘UUÄ74Ž¡‘øãÅbuilt‘¡E‰ff&fŽ‘Ç«in‘?ý²(propGert¸ãy),–UU43,“Ä65Ž¡‘øãÅbuilt‘¡E‰ff&fŽ‘Ç«in/0‘?ý²(directiv¸ãe),‘UUÄ43Ž¡‘øãÅbuilt‘¡E‰ff&fŽ‘Ç«in/1‘?ý²(directiv¸ãe),‘UUÄ43ŽŽŽ ý_"E’îEÅbuilt‘¡E‰ff&fŽ–Ç«in‘¡E‰ff&fŽ“fd‘?ý²(propGert¸ãy),–UU43,“Ä65ޤ ’îEÅbuilt‘¡E‰ff&fŽ–Ç«in‘¡E‰ff&fŽ“fd/0‘?ý²(directiv¸ãe),‘UUÄ43Ž¡’îEÅbuilt‘¡E‰ff&fŽ–Ç«in‘¡E‰ff&fŽ“fd/1‘?ý²(directiv¸ãe),‘UUÄ43Ž©’îEÅcall/1²,‘UUÄ47Ž¡’îEÅcall/2-11²,‘UUÄ113Ž¡’îEÅcall‘¡E‰ff&fŽ‘Ç«det/2²,‘UUÄ113Ž¡’îEÅcall‘¡E‰ff&fŽ–Ç«with‘¡E‰ff&fŽ“args/1-11²,‘UUÄ113Ž¡’îEÅcallable/1²,‘UUÄ49Ž¡’îEÅcatch/3²,–UU29,“37,“Ä47Ž¡’îEÅchange‘¡E‰ff&fŽ‘Ç«directory/1²,‘UUÄ144Ž¡’îEÅchar‘¡E‰ff&fŽ‘Ç«code/2²,–UUÄ116²,“189Ž¡’îEÅchar‘¡E‰ff&fŽ‘Ç«conversion‘?ý²( ag),–UU91,“103,“Ä134²,“136Ž¡’îEÅchar‘¡E‰ff&fŽ‘Ç«conversion/2‘?ý²(directiv¸ãe),‘UUÄ44Ž¡’îEÅchar‘¡E‰ff&fŽ‘Ç«conversion/2²,–UU45,“Ä102Ž¡’îEÅcharacter‘¡E‰ff&fŽ‘Ç«count/2²,‘UUÄ76Ž¡’îEÅcharacter‘¡E‰ff&fŽ‘Ç«device‘?ý²(pGermission),‘UUÄ147Ž¡’îEÅchoice‘¡E‰ff&fŽ‘Ç«size‘?ý²(option),–UUÄ183²,“186Ž¡’îEÅclause/2²,‘UUÄ63Ž¡’îEÅclose/1²,‘UUÄ72Ž¡’îEÅclose/2²,–UUÄ72²,“153,“158Ž¡’îEÅclose‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/1²,‘UUÄ83Ž¡’îEÅclose‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream/1²,‘UUÄ83Ž¡’îEÅclose‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream/1²,‘UUÄ83Ž¡’îEÅclose‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/2²,‘UUÄ84Ž¡’îEÅclose‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream/2²,‘UUÄ84Ž¡’îEÅclose‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream/2²,‘UUÄ84Ž¡’îEÅcompare/3²,‘UUÄ52Ž¡’îE²completion,–UUÄ18²,“162,“163Ž¡’îEÅcompound/1²,‘UUÄ49Ž¡’îEÅconsult/1²,–UU16,“17,“20,“21,“Ä136Ž¡’îEÅcopy‘¡E‰ff&fŽ‘Ç«term/2²,‘UUÄ54Ž¡’îEÅcpu‘¡E‰ff&fŽ‘Ç«time/1²,‘UUÄ139Ž¡’îEÅcreate‘¡E‰ff&fŽ‘Ç«pipe/2²,‘UUÄ154Ž¡’îEÅcurrent‘?ý²(whence),‘UUÄ76Ž¡’îEÅcurrent‘¡E‰ff&fŽ‘Ç«alias/2²,‘UUÄ79Ž¡’îEÅcurrent‘¡E‰ff&fŽ‘Ç«atom/1²,‘UUÄ120Ž¡’îEÅcurrent‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name/2²,–UU37,“Ä135Ž¡’îEÅcurrent‘¡E‰ff&fŽ–Ç«char‘¡E‰ff&fŽ“conversion/2²,‘UUÄ103Ž¡’îEÅcurrent‘¡E‰ff&fŽ‘Ç«input/1²,‘UUÄ69Ž¡’îEÅcurrent‘¡E‰ff&fŽ‘Ç«mirror/2²,‘UUÄ80Ž¡’îEÅcurrent‘¡E‰ff&fŽ‘Ç«op/3²,‘UUÄ102Ž¡’îEÅcurrent‘¡E‰ff&fŽ‘Ç«output/1²,‘UUÄ69Ž¡’îEÅcurrent‘¡E‰ff&fŽ‘Ç«predicate/1²,–UU62,“Ä64Ž¡’îEÅcurrent‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag/2²,‘UUÄ134Ž¡’îEÅcurrent‘¡E‰ff&fŽ‘Ç«stream/1²,‘UUÄ73ަ’îEÅdate‘¡E‰ff&fŽ‘Ç«time/1²,‘UUÄ149Ž¡’îEÅdebug‘?ý²( ag),‘UUÄ134Ž¡’îEÅdebug/0‘?ý²(debug),–UU17,“Ä29Ž¡’îEÅdebugging/0‘?ý²(debug),–UUÄ29²,“32Ž¡’îEÅdecompose‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/4²,‘UUÄ141Ž¡’îE²De nite–UUclause“grammars,“Èse‘ÿ}'e‘°²DCGŽ¡’îEÅdelete/3²,‘UUÄ122Ž¡’îEÅdelete‘¡E‰ff&fŽ‘Ç«directory/1²,‘UUÄ144Ž¡’îEÅdelete‘¡E‰ff&fŽ‘Ç«file/1²,‘UUÄ146Ž¡’îEÅdirectory‘?ý²(pGermission),‘UUÄ147ŽŽŽŽŽŸŽŒ‹Ó XÝ Ú‹– ý"EŸüfd‘øã²INDEXŽŽŽ’±!€211ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅdirectory‘¡E‰ff&fŽ‘Ç«files/2²,‘UUÄ145ޤ ‘øãÅdiscontiguous/1‘?ý²(directiv¸ãe),‘UUÄ42Ž¡‘øãÅdisplay/1²,‘UUÄ96Ž¡‘øãÅdisplay/2²,–UUÄ96²,“105,“106Ž¡‘øãÅdisplay‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“atom/2²,‘UUÄ105Ž¡‘øãÅdisplay‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“chars/2²,‘UUÄ106Ž¡‘øãÅdisplay‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“codes/2²,‘UUÄ106Ž¡‘øãÅdouble‘¡E‰ff&fŽ‘Ç«quotes‘?ý²( ag),–UU91,“Ä134²,“136Ž¡‘øãÅdynamic‘?ý²(propGert¸ãy),‘UUÄ65Ž¡‘øãÅdynamic/1‘?ý²(directiv¸ãe),–UUÄ41²,“60Ž©‘øãÅend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“stream‘?ý²(propGert¸ãy),‘UUÄ74Ž¡‘øãÅend‘¡E‰ff&fŽ–Ç«of‘¡E‰ff&fŽ“term‘?ý²(option),‘UUÄ92Ž¡‘øãÅensure‘¡E‰ff&fŽ‘Ç«linked/1‘?ý²(directiv¸ãe),‘UUÄ43Ž¡‘øãÅensure‘¡E‰ff&fŽ‘Ç«loaded/1‘?ý²(directiv¸ãe),‘UUÄ44Ž¡‘øãÅenviron/2²,‘UUÄ144Ž¡‘øãÅeof‘?ý²(whence),‘UUÄ76Ž¡‘øãÅeof‘¡E‰ff&fŽ‘Ç«action‘?ý²(option),‘UUÄ71Ž¡‘øãÅeof‘¡E‰ff&fŽ‘Ç«action‘?ý²(propGert¸ãy),‘UUÄ74Ž¡‘øãÅeof‘¡E‰ff&fŽ‘Ç«code‘?ý²(option),–UUÄ71²,“81Ž¡‘øãÅerror‘?ý²(option),–UUÄ71²,“81,“Ä92Ž¡‘øã²escapGe–UUsequence,“14,“121,“Ä134Ž¡‘øãÅexclude‘?ý²(option),‘UUÄ56Ž¡‘øãÅexec/4²,‘UUÄ153Ž¡‘øãÅexec/5²,‘UUÄ153Ž¡‘øãÅexecute‘?ý²(pGermission),‘UUÄ147Ž¡‘øãÅexpand‘¡E‰ff&fŽ‘Ç«term/2²,‘UUÄ111Ž¡‘øãÅextended‘?ý²(tok¸ãen),‘UUÄ94Ž¡‘øã²extra-constrained,‘UUÈse‘ÿ}'e‘°Åextra‘¡E‰ff&fŽ‘Ç«cstrŽ¡‘øãextra‘¡E‰ff&fŽ‘Ç«cstr‘?ý²(FD),–UUÄ165²,“170ަ‘øãÅfail‘?ý²(option),‘UUÄ92Ž¡‘øãÅfail/0²,‘UUÄ46Ž¡‘øãÅfct‘¡E‰ff&fŽ‘Ç«name‘?ý²(option),‘UUÄ183Ž¡‘øãÅfd‘¡E‰ff&fŽ–Ç«all‘¡E‰ff&fŽ“different/1‘?ý²(FD),‘UUÄ176Ž¡‘øãÅfd‘¡E‰ff&fŽ–Ç«at‘¡E‰ff&fŽ“least‘¡E‰ff&fŽ“one/1‘?ý²(FD),‘UUÄ175Ž¡‘øãÅfd‘¡E‰ff&fŽ–Ç«at‘¡E‰ff&fŽ“most‘¡E‰ff&fŽ“one/1‘?ý²(FD),‘UUÄ175Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«atleast/3‘?ý²(FD),‘UUÄ177Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«atmost/3‘?ý²(FD),‘UUÄ177Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«cardinality/2‘?ý²(FD),–UUÄ175²,“178Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«cardinality/3‘?ý²(FD),‘UUÄ175Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«dom/2‘?ý²(FD),‘UUÄ169Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«domain/2‘?ý²(FD),‘UUÄ168Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«domain/3‘?ý²(FD),‘UUÄ167Ž¡‘øãÅfd‘¡E‰ff&fŽ–Ç«domain‘¡E‰ff&fŽ“bool/1‘?ý²(FD),‘UUÄ167Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«element/3‘?ý²(FD),‘UUÄ176Ž¡‘øãÅfd‘¡E‰ff&fŽ–Ç«element‘¡E‰ff&fŽ“var/3‘?ý²(FD),‘UUÄ177Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«exactly/3‘?ý²(FD),‘UUÄ177Ž¡‘øãÅfd‘¡E‰ff&fŽ–Ç«has‘¡E‰ff&fŽ“extra‘¡E‰ff&fŽ“cstr/1‘?ý²(FD),‘UUÄ170Ž¡‘øãÅfd‘¡E‰ff&fŽ–Ç«has‘¡E‰ff&fŽ“vector/1‘?ý²(FD),‘UUÄ170Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«labeling/1‘?ý²(FD),‘UUÄ179Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«labeling/2‘?ý²(FD),–UUÄ179²,“180Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«labelingff/1‘?ý²(FD),‘UUÄ179Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«max/2‘?ý²(FD),‘UUÄ169Ž¡‘øãÅfd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer‘?ý²(FD),–UUÄ165²,“166Ž¡‘øãÅfd‘¡E‰ff&fŽ–Ç«max‘¡E‰ff&fŽ“integer/1‘?ý²(FD),‘UUÄ166Ž¡‘øãÅfd‘¡E‰ff&fŽ‘Ç«maximize/2‘?ý²(FD),‘UUÄ180ŽŽŽ ý_"E’îEÅfd‘¡E‰ff&fŽ‘Ç«min/2‘?ý²(FD),‘UUÄ169ޤ ’îEÅfd‘¡E‰ff&fŽ‘Ç«minimize/2‘?ý²(FD),‘UUÄ180Ž¡’îEÅfd‘¡E‰ff&fŽ–Ç«not‘¡E‰ff&fŽ“prime/1‘?ý²(FD),‘UUÄ173Ž¡’îEÅfd‘¡E‰ff&fŽ–Ç«only‘¡E‰ff&fŽ“one/1‘?ý²(FD),‘UUÄ175Ž¡’îEÅfd‘¡E‰ff&fŽ‘Ç«prime/1‘?ý²(FD),‘UUÄ173Ž¡’îEÅfd‘¡E‰ff&fŽ‘Ç«relation/2‘?ý²(FD),‘UUÄ178Ž¡’îEÅfd‘¡E‰ff&fŽ‘Ç«relationc/2‘?ý²(FD),‘UUÄ178Ž¡’îEÅfd‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“vector‘¡E‰ff&fŽ“max/1‘?ý²(FD),–UU165,“Ä167Ž¡’îEÅfd‘¡E‰ff&fŽ‘Ç«size/2‘?ý²(FD),‘UUÄ169Ž¡’îEÅfd‘¡E‰ff&fŽ–Ç«use‘¡E‰ff&fŽ“vector/1‘?ý²(FD),‘UUÄ170Ž¡’îEÅfd‘¡E‰ff&fŽ‘Ç«var/1‘?ý²(FD),‘UUÄ168Ž¡’îEÅfd‘¡E‰ff&fŽ–Ç«vector‘¡E‰ff&fŽ“max/1‘?ý²(FD),–UU165,“Ä166Ž¡’îEÅfifo‘?ý²(pGermission),‘UUÄ147Ž¡’îEÅfile‘¡E‰ff&fŽ‘Ç«exists/1²,‘UUÄ146Ž¡’îEÅfile‘¡E‰ff&fŽ‘Ç«name‘?ý²(propGert¸ãy),‘UUÄ73Ž¡’îEÅfile‘¡E‰ff&fŽ‘Ç«permission/2²,‘UUÄ146Ž¡’îEÅfile‘¡E‰ff&fŽ‘Ç«property/2²,‘UUÄ147Ž¡’îEÅfind‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“completion/2²,‘UUÄ163Ž¡’îEÅfindall/3²,‘UUÄ66Ž¡’îEÅfirst‘¡E‰ff&fŽ‘Ç«fail‘?ý²(FD–UUoption),“Ä179Ž¡’îE² ag,–UUÈse‘ÿ}'e‘°²Prolog“ agŽ¡’îEÅfloat/1²,‘UUÄ49Ž¡’îEÅflush‘¡E‰ff&fŽ‘Ç«output/0²,‘UUÄ72Ž¡’îEÅflush‘¡E‰ff&fŽ‘Ç«output/1²,–UU68,“Ä72Ž¡’îEÅfor/3²,‘UUÄ114Ž¡’îEÅforce‘?ý²(option),‘UUÄ72Ž¡’îEÅforeign/1‘?ý²(directiv¸ãe),–UUÄ45²,“Ä183Ž¡’îEÅforeign/2‘?ý²(directiv¸ãe),–UUÄ45²,“Ä183Ž¡’îEÅfork‘¡E‰ff&fŽ‘Ç«prolog/1²,‘UUÄ154Ž¡’îEÅformat/2²,‘UUÄ98Ž¡’îEÅformat/3²,–UUÄ98²,“105,“106Ž¡’îEÅformat‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“atom/3²,‘UUÄ105Ž¡’îEÅformat‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“chars/3²,‘UUÄ106Ž¡’îEÅformat‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“codes/3²,‘UUÄ106Ž¡’îEÅfrom‘?ý²(option),‘UUÄ56Ž¡’îEÅfull‘?ý²(debug),‘UUÄ30Ž¡’îEÅfunctor/3²,‘UUÄ52ŽŸ’îEÅg‘¡E‰ff&fŽ‘Ç«array‘?ý²(global–UUv‘ÿqÇar.),“Ä127Ž¡’îEÅg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“auto‘?ý²(global–UUv‘ÿqÇar.),“Ä127Ž¡’îEÅg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“extend‘?ý²(global–UUv‘ÿqÇar.),“Ä127Ž¡’îEÅg‘¡E‰ff&fŽ–Ç«array‘¡E‰ff&fŽ“size/2²,‘UUÄ128Ž¡’îEÅg‘¡E‰ff&fŽ‘Ç«assign/2²,‘UUÄ127Ž¡’îEÅg‘¡E‰ff&fŽ‘Ç«assignb/2²,‘UUÄ127Ž¡’îEÅg‘¡E‰ff&fŽ‘Ç«dec/1²,‘UUÄ129Ž¡’îEÅg‘¡E‰ff&fŽ‘Ç«dec/2²,‘UUÄ129Ž¡’îEÅg‘¡E‰ff&fŽ‘Ç«dec/3²,‘UUÄ129Ž¡’îEÅg‘¡E‰ff&fŽ‘Ç«deco/2²,‘UUÄ129Ž¡’îEÅg‘¡E‰ff&fŽ‘Ç«inc/1²,‘UUÄ129Ž¡’îEÅg‘¡E‰ff&fŽ‘Ç«inc/2²,‘UUÄ129Ž¡’îEÅg‘¡E‰ff&fŽ‘Ç«inc/3²,‘UUÄ129Ž¡’îEÅg‘¡E‰ff&fŽ‘Ç«inco/2²,‘UUÄ129Ž¡’îEÅg‘¡E‰ff&fŽ‘Ç«link/2²,‘UUÄ127Ž¡’îEÅg‘¡E‰ff&fŽ‘Ç«read/2²,‘UUÄ128Ž¡’îEÅg‘¡E‰ff&fŽ–Ç«reset‘¡E‰ff&fŽ“bit/2²,‘UUÄ130Ž¡’îEÅg‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“bit/2²,‘UUÄ130Ž¡’îEÅg‘¡E‰ff&fŽ–Ç«test‘¡E‰ff&fŽ“reset‘¡E‰ff&fŽ“bit/2²,‘UUÄ130ŽŽŽŽŽŸŽŒ‹Ô o Ú‹– ý"EŸüfd‘øã²212ŽŽŽ’ŸFINDEXŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅg‘¡E‰ff&fŽ–Ç«test‘¡E‰ff&fŽ“set‘¡E‰ff&fŽ“bit/2²,‘UUÄ130ޤ ‘øãÅgeneric‘¡E‰ff&fŽ‘Ç«var/1‘?ý²(FD),‘UUÄ168Ž¡‘øãÅget/1²,‘UUÄ108Ž¡‘øãÅget0/1²,‘UUÄ108Ž¡‘øãÅget‘¡E‰ff&fŽ‘Ç«byte/1²,‘UUÄ89Ž¡‘øãÅget‘¡E‰ff&fŽ‘Ç«byte/2²,–UU68,“Ä89Ž¡‘øãÅget‘¡E‰ff&fŽ‘Ç«char/1²,‘UUÄ85Ž¡‘øãÅget‘¡E‰ff&fŽ‘Ç«char/2²,‘UUÄ85Ž¡‘øãÅget‘¡E‰ff&fŽ‘Ç«code/1²,‘UUÄ85Ž¡‘øãÅget‘¡E‰ff&fŽ‘Ç«code/2²,–UUÄ85²,“86Ž¡‘øãÅget‘¡E‰ff&fŽ‘Ç«key/1²,‘UUÄ86Ž¡‘øãÅget‘¡E‰ff&fŽ‘Ç«key/2²,‘UUÄ86Ž¡‘øãÅget‘¡E‰ff&fŽ–Ç«key‘¡E‰ff&fŽ“no‘¡E‰ff&fŽ“echo/1²,‘UUÄ86Ž¡‘øãÅget‘¡E‰ff&fŽ–Ç«key‘¡E‰ff&fŽ“no‘¡E‰ff&fŽ“echo/2²,‘UUÄ86Ž¡‘øãÅget‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“prompt/1²,‘UUÄ162Ž¡‘øãÅget‘¡E‰ff&fŽ–Ç«print‘¡E‰ff&fŽ“stream/1²,‘UUÄ100Ž¡‘øãÅget‘¡E‰ff&fŽ‘Ç«seed/1²,‘UUÄ140Ž¡‘øãÅgplc²,–UUÄ22²,“24,“26,“136Ž©Åò‘øãÅhalf‘?ý²(debug),‘UUÄ30Ž¡‘øãÅhalt/0²,–UU13,“17,“Ä112Ž¡‘øãÅhalt/1²,‘UUÄ112Ž¡‘øãÅhash‘?ý²(propGert¸ãy),‘UUÄ120Ž¡‘øãÅhexgplc²,‘UUÄ26Ž¡‘øãÅhost‘¡E‰ff&fŽ‘Ç«name/1²,‘UUÄ150Ž¡‘øãÅhostname‘¡E‰ff&fŽ‘Ç«address/2²,‘UUÄ161ަ‘øãÅignore‘¡E‰ff&fŽ‘Ç«ops‘?ý²(option),‘UUÄ96Ž¡‘øãÅinclude/1‘?ý²(directiv¸ãe),‘UUÄ44Ž¡‘øãÅinfix‘¡E‰ff&fŽ‘Ç«op‘?ý²(propGert¸ãy),‘UUÄ120Ž¡‘øãÅinitialization/1‘?ý²(directiv¸ãe),–UU24,“25,“Ä45²,“203Ž¡‘øãÅinput‘?ý²(propGert¸ãy),‘UUÄ73Ž¡‘øãÅinteger/1²,‘UUÄ49Ž¡‘øãÅinteger‘¡E‰ff&fŽ–Ç«rounding‘¡E‰ff&fŽ“function‘?ý²( ag),–UU59,“Ä133Ž¡‘øã²in•¸ãterpreter,‘UUÈse‘ÿ}'e‘°²top-lev“elŽŸÅó‘øãÅjump‘?ý²(option),–UUÄ183²,“184ަ‘øãÅkeysort/1²,‘UUÄ125Ž¡‘øãÅkeysort/2²,‘UUÄ125ަ‘øãÅlargest‘?ý²(FD–UUoption),“Ä179Ž¡‘øãÅlast/2²,‘UUÄ124Ž¡‘øãÅlast‘¡E‰ff&fŽ‘Ç«modification‘?ý²(propGert¸ãy),‘UUÄ148Ž¡‘øãÅlast‘¡E‰ff&fŽ–Ç«read‘¡E‰ff&fŽ“start‘¡E‰ff&fŽ“line‘¡E‰ff&fŽ“column/2²,‘UUÄ95Ž¡‘øãÅleash/1‘?ý²(debug),–UUÄ30²,“31Ž¡‘øãÅlength‘?ý²(propGert¸ãy),‘UUÄ120Ž¡‘øãÅlength/2²,‘UUÄ124Ž¡‘øãÅline‘?ý²(option),–UUÄ71²,“82Ž¡‘øãÅline‘¡E‰ff&fŽ‘Ç«count/2²,–UUÄ77²,“78Ž¡‘øãÅline‘¡E‰ff&fŽ‘Ç«position/2²,‘UUÄ77Ž¡‘øãÅlinedit²,–UUÄ18²,“86,“162,“163Ž¡‘øãÅlist/1²,‘UUÄ49Ž¡‘øãÅlist‘¡E‰ff&fŽ–Ç«or‘¡E‰ff&fŽ“partial‘¡E‰ff&fŽ“list/1²,‘UUÄ49Ž¡‘øãÅlisting/0²,‘UUÄ138Ž¡‘øãÅlisting/1²,–UU32,“99,“Ä138Ž¡‘øãÅload/1²,–UU17,“21,“23,“Ä137Ž¡‘øãÅloose‘?ý²(debug),‘UUÄ30ŽŽŽ ý_"E’îEÅlower‘¡E‰ff&fŽ‘Ç«upper/2²,‘UUÄ116Ž©’îE²MA,‘UUÄ20ޤ ’îEÅmake‘¡E‰ff&fŽ‘Ç«directory/1²,‘UUÄ144Ž¡’îEÅmax‘?ý²(FD–UUoption),“Ä179Ž¡’îEÅmax‘¡E‰ff&fŽ‘Ç«arity‘?ý²( ag),‘UUÄ133Ž¡’îEÅmax‘¡E‰ff&fŽ‘Ç«atom‘?ý²( ag),–UU119,“Ä133Ž¡’îEÅmax‘¡E‰ff&fŽ‘Ç«depth‘?ý²(option),‘UUÄ97Ž¡’îEÅmax‘¡E‰ff&fŽ‘Ç«integer‘?ý²( ag),–UUÄ133²,“165Ž¡’îEÅmax‘¡E‰ff&fŽ‘Ç«list/2²,‘UUÄ125Ž¡’îEÅmax‘¡E‰ff&fŽ‘Ç«regret‘?ý²(FD–UUoption),“Ä179Ž¡’îEÅmax‘¡E‰ff&fŽ‘Ç«unget‘?ý²( ag),–UU88,“90,“Ä133Ž¡’îEÅmember/2²,‘UUÄ121Ž¡’îEÅmemberchk/2²,‘UUÄ121Ž¡’îEÅmiddle‘?ý²(FD–UUoption),“Ä179Ž¡’îEÅmin‘?ý²(FD–UUoption),“Ä179Ž¡’îEÅmin‘¡E‰ff&fŽ‘Ç«integer‘?ý²( ag),‘UUÄ133Ž¡’îEÅmin‘¡E‰ff&fŽ‘Ç«list/2²,‘UUÄ125Ž¡’îE²mini-assem¸ãbly‘ÿ*ª,–UU11,“Ä20²,“26Ž¡’îEÅmirror‘?ý²(option),‘UUÄ71Ž¡’îEÅmirror‘?ý²(propGert¸ãy),‘UUÄ73Ž¡’îEÅmode‘?ý²(propGert¸ãy),‘UUÄ73Ž¡’îEÅmost‘¡E‰ff&fŽ‘Ç«constrained‘?ý²(FD–UUoption),“Ä179Ž¡’îEÅmultifile/1‘?ý²(directiv¸ãe),‘UUÄ42ަ’îEÅname/2²,‘UUÄ118Ž¡’îEÅname‘¡E‰ff&fŽ–Ç«query‘¡E‰ff&fŽ“vars/2²,‘UUÄ55Ž¡’îEÅname‘¡E‰ff&fŽ–Ç«singleton‘¡E‰ff&fŽ“vars/1²,–UUÄ55²,“99Ž¡’îEÅnamevars‘?ý²(option),–UU16,“Ä56²,“Ä96Ž¡’îEÅnative‘¡E‰ff&fŽ‘Ç«code‘?ý²(propGert¸ãy),‘UUÄ65Ž¡’îEÅneeds‘¡E‰ff&fŽ‘Ç«quotes‘?ý²(propGert¸ãy),‘UUÄ121Ž¡’îEÅneeds‘¡E‰ff&fŽ‘Ç«scan‘?ý²(propGert¸ãy),‘UUÄ121Ž¡’îEÅnew‘¡E‰ff&fŽ‘Ç«atom/1²,‘UUÄ119Ž¡’îEÅnew‘¡E‰ff&fŽ‘Ç«atom/2²,‘UUÄ119Ž¡’îEÅnew‘¡E‰ff&fŽ‘Ç«atom/3²,‘UUÄ119Ž¡’îEÅnext‘?ý²(option),‘UUÄ56Ž¡’îEÅnl/0²,‘UUÄ88Ž¡’îEÅnl/1²,‘UUÄ88Ž¡’îEÅnodebug/0‘?ý²(debug),–UUÄ29²,“32Ž¡’îEÅnon‘¡E‰ff&fŽ–Ç«fd‘¡E‰ff&fŽ“var/1‘?ý²(FD),‘UUÄ168Ž¡’îEÅnon‘¡E‰ff&fŽ–Ç«generic‘¡E‰ff&fŽ“var/1‘?ý²(FD),‘UUÄ168Ž¡’îEÅnone‘?ý²(debug),‘UUÄ30Ž¡’îEÅnone‘?ý²(option),–UUÄ71²,“82,“Ä183²,“184Ž¡’îEÅnonvar/1²,‘UUÄ49Ž¡’îEÅnospy/1‘?ý²(debug),–UUÄ30²,“32Ž¡’îEÅnospyall/0‘?ý²(debug),‘UUÄ30Ž¡’îEÅnotrace/0‘?ý²(debug),‘UUÄ29Ž¡’îEÅnth/3²,‘UUÄ124Ž¡’îEÅnumber/1²,‘UUÄ49Ž¡’îEÅnumber‘¡E‰ff&fŽ‘Ç«atom/2²,‘UUÄ117Ž¡’îEÅnumber‘¡E‰ff&fŽ‘Ç«chars/2²,‘UUÄ117Ž¡’îEÅnumber‘¡E‰ff&fŽ‘Ç«codes/2²,‘UUÄ117Ž¡’îEÅnumbervars‘?ý²(option),–UU16,“Ä56²,“Ä96Ž¡’îEÅnumbervars/1²,–UUÄ56²,“99Ž¡’îEÅnumbervars/3²,‘UUÄ56ަ’îEÅonce/1²,‘UUÄ113ŽŽŽŽŽŸŽŒ‹Õ ‡Ä Ú‹– ý"EŸüfd‘øã²INDEXŽŽŽ’±!€213ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅop/3‘?ý²(directiv¸ãe),‘UUÄ44ޤ ‘øãÅop/3²,–UU44,“Ä100Ž¡‘øãÅopen/3²,‘UUÄ70Ž¡‘øãÅopen/4²,–UU67,“Ä70²,“81,“82,“157Ž¡‘øãÅopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/2²,‘UUÄ83Ž¡‘øãÅopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream/2²,‘UUÄ83Ž¡‘øãÅopen‘¡E‰ff&fŽ–Ç«input‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream/2²,‘UUÄ83Ž¡‘øãÅopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“atom‘¡E‰ff&fŽ“stream/1²,‘UUÄ84Ž¡‘øãÅopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“chars‘¡E‰ff&fŽ“stream/1²,‘UUÄ84Ž¡‘øãÅopen‘¡E‰ff&fŽ–Ç«output‘¡E‰ff&fŽ“codes‘¡E‰ff&fŽ“stream/1²,‘UUÄ84Ž¡‘øãÅos‘¡E‰ff&fŽ‘Ç«error‘?ý²( ag),–UUÄ134²,“199Ž¡‘øãÅos‘¡E‰ff&fŽ‘Ç«version/1²,‘UUÄ150Ž¡‘øãÅoutput‘?ý²(propGert¸ãy),‘UUÄ73ŽŸ‘øãÅpartial‘¡E‰ff&fŽ‘Ç«list/1²,‘UUÄ49Ž¡‘øãÅpeek‘¡E‰ff&fŽ‘Ç«byte/1²,‘UUÄ90Ž¡‘øãÅpeek‘¡E‰ff&fŽ‘Ç«byte/2²,‘UUÄ90Ž¡‘øãÅpeek‘¡E‰ff&fŽ‘Ç«char/1²,‘UUÄ87Ž¡‘øãÅpeek‘¡E‰ff&fŽ‘Ç«char/2²,‘UUÄ87Ž¡‘øãÅpeek‘¡E‰ff&fŽ‘Ç«code/1²,‘UUÄ87Ž¡‘øãÅpeek‘¡E‰ff&fŽ‘Ç«code/2²,‘UUÄ87Ž¡‘øãÅpermission‘?ý²(propGert¸ãy),‘UUÄ148Ž¡‘øãÅpermutation/2²,‘UUÄ122Ž¡‘øãÅphrase/2²,‘UUÄ111Ž¡‘øãÅphrase/3²,‘UUÄ111Ž¡‘øãÅpopen/3²,–UU67,“Ä153Ž¡‘øãÅportray/1²,–UUÄ96²,“100Ž¡‘øãÅportray‘¡E‰ff&fŽ‘Ç«clause/1²,‘UUÄ99Ž¡‘øãÅportray‘¡E‰ff&fŽ‘Ç«clause/2²,–UUÄ99²,“138Ž¡‘øãÅportrayed‘?ý²(option),‘UUÄ96Ž¡‘øãÅposition‘?ý²(propGert¸ãy),‘UUÄ74Ž¡‘øãÅpostfix‘¡E‰ff&fŽ‘Ç«op‘?ý²(propGert¸ãy),‘UUÄ120Ž¡‘øãÅpredicate‘¡E‰ff&fŽ‘Ç«property/2²,‘UUÄ65Ž¡‘øãÅprefix/2²,‘UUÄ123Ž¡‘øãÅprefix‘¡E‰ff&fŽ‘Ç«op‘?ý²(propGert¸ãy),‘UUÄ120Ž¡‘øãÅprint/1²,–UUÄ96²,“98Ž¡‘øãÅprint/2²,–UUÄ96²,“100,“105,“106Ž¡‘øãÅprint‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“atom/2²,‘UUÄ105Ž¡‘øãÅprint‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“chars/2²,‘UUÄ106Ž¡‘øãÅprint‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“codes/2²,‘UUÄ106Ž¡‘øãÅpriority‘?ý²(option),‘UUÄ97Ž¡‘øãÅprivate‘?ý²(propGert¸ãy),‘UUÄ65Ž¡‘øã²Prolog‘·Ó ag,–×T14,“36,›×S45,“59,“64,“88,˜90{92,“94,“103,Ž¡‘ ã119,–UUÄ133²,“135,“136,“165,“198,“199Ž¡‘øãÅprolog‘¡E‰ff&fŽ‘Ç«copyright‘?ý²( ag),‘UUÄ133Ž¡‘øãÅprolog‘¡E‰ff&fŽ‘Ç«date‘?ý²( ag),‘UUÄ133Ž¡‘øãÅprolog‘¡E‰ff&fŽ‘Ç«file‘?ý²(propGert¸ãy),‘UUÄ65Ž¡‘øãÅprolog‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name/2²,–UU136,“Ä142Ž¡‘øãÅprolog‘¡E‰ff&fŽ‘Ç«line‘?ý²(propGert¸ãy),‘UUÄ65Ž¡‘øãÅprolog‘¡E‰ff&fŽ‘Ç«name‘?ý²( ag),‘UUÄ133Ž¡‘øãÅprolog‘¡E‰ff&fŽ‘Ç«pid/1²,‘UUÄ155Ž¡‘øãÅprolog‘¡E‰ff&fŽ‘Ç«version‘?ý²( ag),‘UUÄ133Ž¡‘øãÅpublic‘?ý²(propGert¸ãy),‘UUÄ65Ž¡‘øãÅpublic/1‘?ý²(directiv¸ãe),–UUÄ41²,“61Ž¡‘øãÅpunct‘?ý²(tok¸ãen),‘UUÄ94Ž¡‘øãÅput/1²,‘UUÄ109Ž¡‘øãÅput‘¡E‰ff&fŽ‘Ç«byte/1²,‘UUÄ91ŽŽŽ ý_"E’îEÅput‘¡E‰ff&fŽ‘Ç«byte/2²,‘UUÄ91ޤ ’îEÅput‘¡E‰ff&fŽ‘Ç«char/1²,‘UUÄ88Ž¡’îEÅput‘¡E‰ff&fŽ‘Ç«char/2²,‘UUÄ88Ž¡’îEÅput‘¡E‰ff&fŽ‘Ç«code/1²,‘UUÄ88Ž¡’îEÅput‘¡E‰ff&fŽ‘Ç«code/2²,‘UUÄ88ޤ’îEÅquoted‘?ý²(option),–UU16,“Ä96Ž¡’îEÅrandom‘?ý²(FD–UUoption),“Ä179ޤ ’îEÅrandom/1²,‘UUÄ140Ž¡’îEÅrandom/3²,‘UUÄ140Ž¡’îEÅrandomize/0²,‘UUÄ139Ž¡’îEÅread‘?ý²(moGde),‘UUÄ70Ž¡’îEÅread‘?ý²(pGermission),‘UUÄ147Ž¡’îEÅread/1²,–UUÄ92²,“95Ž¡’îEÅread/2²,–UUÄ92²,“95,“104,“105Ž¡’îEÅread‘¡E‰ff&fŽ‘Ç«atom/1²,–UUÄ93²,“95Ž¡’îEÅread‘¡E‰ff&fŽ‘Ç«atom/2²,–UUÄ93²,“95,“103Ž¡’îEÅread‘¡E‰ff&fŽ–Ç«from‘¡E‰ff&fŽ“atom/2²,‘UUÄ104Ž¡’îEÅread‘¡E‰ff&fŽ–Ç«from‘¡E‰ff&fŽ“chars/2²,‘UUÄ104Ž¡’îEÅread‘¡E‰ff&fŽ–Ç«from‘¡E‰ff&fŽ“codes/2²,‘UUÄ105Ž¡’îEÅread‘¡E‰ff&fŽ‘Ç«integer/1²,–UUÄ93²,“95Ž¡’îEÅread‘¡E‰ff&fŽ‘Ç«integer/2²,–UUÄ93²,“95,“103Ž¡’îEÅread‘¡E‰ff&fŽ‘Ç«number/1²,–UUÄ93²,“95Ž¡’îEÅread‘¡E‰ff&fŽ‘Ç«number/2²,–UUÄ93²,“95,“103Ž¡’îEÅread‘¡E‰ff&fŽ–Ç«pl‘¡E‰ff&fŽ“state‘¡E‰ff&fŽ“file/1²,‘UUÄ136Ž¡’îEÅread‘¡E‰ff&fŽ‘Ç«term/2²,–UUÄ92²,“95Ž¡’îEÅread‘¡E‰ff&fŽ‘Ç«term/3²,–UUÄ92²,“95,“103{105Ž¡’îEÅread‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“atom/3²,–UU14,“92,“Ä104Ž¡’îEÅread‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“chars/3²,‘UUÄ104Ž¡’îEÅread‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“codes/3²,‘UUÄ105Ž¡’îEÅread‘¡E‰ff&fŽ‘Ç«token/1²,–UUÄ94²,“95Ž¡’îEÅread‘¡E‰ff&fŽ‘Ç«token/2²,–UUÄ94²,“95,“103{105Ž¡’îEÅread‘¡E‰ff&fŽ–Ç«token‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“atom/2²,‘UUÄ104Ž¡’îEÅread‘¡E‰ff&fŽ–Ç«token‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“chars/2²,‘UUÄ104Ž¡’îEÅread‘¡E‰ff&fŽ–Ç«token‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“codes/2²,‘UUÄ105Ž¡’îEÅreal‘¡E‰ff&fŽ–Ç«file‘¡E‰ff&fŽ“name‘?ý²(propGert¸ãy),‘UUÄ147Ž¡’îEÅreal‘¡E‰ff&fŽ‘Ç«time/1²,‘UUÄ139Ž¡’îEÅregular‘?ý²(pGermission),‘UUÄ147Ž¡’îEÅremove‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“mirror/2²,–UU68,“80,“Ä80Ž¡’îEÅrename‘¡E‰ff&fŽ‘Ç«file/2²,‘UUÄ145Ž¡’îEÅreorder‘?ý²(FD–UUoption),“Ä179Ž¡’îEÅrepeat/0²,‘UUÄ113Ž¡’îEÅreposition‘?ý²(option),‘UUÄ71Ž¡’îEÅreposition‘?ý²(propGert¸ãy),‘UUÄ73Ž¡’îEÅreset‘?ý²(option),–UUÄ71²,“81Ž¡’îEÅretract/1²,‘UUÄ62Ž¡’îEÅretractall/1²,‘UUÄ62Ž¡’îEÅreturn‘?ý²(option),–UUÄ183²,“184Ž¡’îEÅreverse/2²,‘UUÄ122ŽŸ’îEÅsearch‘?ý²(pGermission),‘UUÄ147Ž¡’îEÅsee/1²,‘UUÄ107Ž¡’îEÅseeing/1²,‘UUÄ108Ž¡’îEÅseek/4²,‘UUÄ75Ž¡’îEÅseen/0²,‘UUÄ108Ž¡’îEÅselect/3²,‘UUÄ122ŽŽŽŽŽŸŽŒ‹Ö ›ã Ú‹– ý"EŸüfd‘øã²214ŽŽŽ’ŸFINDEXŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅselect/5²,–UU68,“Ä156²,“159,“161ޤ ‘øãÅsend‘¡E‰ff&fŽ‘Ç«signal/2²,‘UUÄ156Ž¡‘øãÅset‘¡E‰ff&fŽ–Ç«bip‘¡E‰ff&fŽ“name/2²,–UU37,“Ä135²,“196Ž¡‘øãÅset‘¡E‰ff&fŽ‘Ç«input/1²,–UU68,“Ä69Ž¡‘øãÅset‘¡E‰ff&fŽ–Ç«linedit‘¡E‰ff&fŽ“prompt/1²,‘UUÄ162Ž¡‘øãÅset‘¡E‰ff&fŽ‘Ç«output/1²,–UU68,“Ä70Ž¡‘øãÅset‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag/2‘?ý²(directiv¸ãe),‘UUÄ45Ž¡‘øãÅset‘¡E‰ff&fŽ–Ç«prolog‘¡E‰ff&fŽ“flag/2²,–UU45,“Ä133Ž¡‘øãÅset‘¡E‰ff&fŽ‘Ç«seed/1²,‘UUÄ139Ž¡‘øãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“buffering/2²,–UU68,“Ä82²,“157,“158Ž¡‘øãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“eof‘¡E‰ff&fŽ“action/2²,‘UUÄ81Ž¡‘øãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“line‘¡E‰ff&fŽ“column/3²,‘UUÄ78Ž¡‘øãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“position/2²,–UU68,“Ä75Ž¡‘øãÅset‘¡E‰ff&fŽ–Ç«stream‘¡E‰ff&fŽ“type/2²,–UUÄ81²,“158Ž¡‘øãÅsetarg/3²,‘UUÄ54Ž¡‘øãÅsetarg/4²,‘UUÄ54Ž¡‘øãÅsetof/3²,‘UUÄ66Ž¡‘øãÅshell/0²,‘UUÄ151Ž¡‘øãÅshell/1²,‘UUÄ151Ž¡‘øãÅshell/2²,‘UUÄ151Ž¡‘øãÅsingleton‘¡E‰ff&fŽ‘Ç«warning‘?ý²( ag),–UUÄ134²,“136Ž¡‘øãÅsingletons‘?ý²(option),–UU55,“56,“Ä92Ž¡‘øãÅsize‘?ý²(propGert¸ãy),‘UUÄ148Ž¡‘øãÅskip/1²,‘UUÄ108Ž¡‘øãÅsleep/1²,‘UUÄ156Ž¡‘øãÅsmallest‘?ý²(FD–UUoption),“Ä179Ž¡‘øãÅsocket‘?ý²(pGermission),‘UUÄ147Ž¡‘øãÅsocket/2²,‘UUÄ158Ž¡‘øãÅsocket‘¡E‰ff&fŽ‘Ç«accept/3²,‘UUÄ160Ž¡‘øãÅsocket‘¡E‰ff&fŽ‘Ç«accept/4²,‘UUÄ160Ž¡‘øãÅsocket‘¡E‰ff&fŽ‘Ç«bind/2²,‘UUÄ159Ž¡‘øãÅsocket‘¡E‰ff&fŽ‘Ç«close/1²,‘UUÄ158Ž¡‘øãÅsocket‘¡E‰ff&fŽ‘Ç«connect/4²,–UU67,“158,“Ä159Ž¡‘øãÅsocket‘¡E‰ff&fŽ‘Ç«listen/2²,‘UUÄ160Ž¡‘øãÅsort/1²,‘UUÄ125Ž¡‘øãÅsort/2²,‘UUÄ125Ž¡‘øãÅsort0/1²,‘UUÄ125Ž¡‘øãÅsort0/2²,‘UUÄ125Ž¡‘øãÅspace‘¡E‰ff&fŽ‘Ç«args‘?ý²(option),‘UUÄ96Ž¡‘øãÅspawn/2²,‘UUÄ152Ž¡‘øãÅspawn/3²,‘UUÄ152Ž¡‘øãÅspy/1‘?ý²(debug),–UUÄ30²,“32Ž¡‘øãÅspypoint‘¡E‰ff&fŽ‘Ç«condition/3‘?ý²(debug),–UUÄ30²,“32Ž¡‘øãÅsr‘¡E‰ff&fŽ–Ç«change‘¡E‰ff&fŽ“options/2²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ‘Ç«close/1²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ–Ç«current‘¡E‰ff&fŽ“descriptor/1²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ–Ç«error‘¡E‰ff&fŽ“from‘¡E‰ff&fŽ“exception/2²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“error‘¡E‰ff&fŽ“counters/3²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“file‘¡E‰ff&fŽ“name/2²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“include‘¡E‰ff&fŽ“list/2²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“include‘¡E‰ff&fŽ“stream‘¡E‰ff&fŽ“list/2²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“module/3²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“position/3²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“size‘¡E‰ff&fŽ“counters/3²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ–Ç«get‘¡E‰ff&fŽ“stream/2²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ‘Ç«open/3²,‘UUÄ164Ž¡‘øãÅsr‘¡E‰ff&fŽ–Ç«read‘¡E‰ff&fŽ“term/4²,‘UUÄ164ŽŽŽ ý_"E’îEÅsr‘¡E‰ff&fŽ–Ç«set‘¡E‰ff&fŽ“error‘¡E‰ff&fŽ“counters/3²,‘UUÄ164ޤ ’îEÅsr‘¡E‰ff&fŽ–Ç«write‘¡E‰ff&fŽ“error/2²,‘UUÄ164Ž¡’îEÅsr‘¡E‰ff&fŽ–Ç«write‘¡E‰ff&fŽ“error/4²,‘UUÄ164Ž¡’îEÅsr‘¡E‰ff&fŽ–Ç«write‘¡E‰ff&fŽ“error/6²,‘UUÄ164Ž¡’îEÅsr‘¡E‰ff&fŽ–Ç«write‘¡E‰ff&fŽ“message/4²,‘UUÄ164Ž¡’îEÅsr‘¡E‰ff&fŽ–Ç«write‘¡E‰ff&fŽ“message/6²,‘UUÄ164Ž¡’îEÅsr‘¡E‰ff&fŽ–Ç«write‘¡E‰ff&fŽ“message/8²,‘UUÄ164Ž¡’îEÅstandard‘?ý²(FD–UUoption),“Ä179Ž¡’îEÅstatic‘?ý²(propGert¸ãy),‘UUÄ65Ž¡’îEÅstatistics/0²,‘UUÄ138Ž¡’îEÅstatistics/2²,‘UUÄ138Ž¡’îEÅstop/0²,‘UUÄ112Ž¡’îEÅstream‘¡E‰ff&fŽ–Ç«line‘¡E‰ff&fŽ“column/3²,‘UUÄ77Ž¡’îEÅstream‘¡E‰ff&fŽ‘Ç«position/2²,–UUÄ74²,“75Ž¡’îEÅstream‘¡E‰ff&fŽ‘Ç«property/2²,–UUÄ73²,“74,“75,“79,“81Ž¡’îEÅstrict‘¡E‰ff&fŽ‘Ç«iso‘?ý²( ag),–UU36,“64,“Ä134Ž¡’îEÅstring‘?ý²(tok¸ãen),‘UUÄ94Ž¡’îEÅsub‘¡E‰ff&fŽ‘Ç«atom/5²,‘UUÄ115Ž¡’îEÅsublist/2²,‘UUÄ123Ž¡’îEÅsuffix/2²,‘UUÄ123Ž¡’îEÅsum‘¡E‰ff&fŽ‘Ç«list/2²,‘UUÄ125Ž¡’îEÅsyntax‘¡E‰ff&fŽ‘Ç«error‘?ý²( ag),–UU92,“Ä134²,“198Ž¡’îEÅsyntax‘¡E‰ff&fŽ‘Ç«error‘?ý²(option),‘UUÄ92Ž¡’îEÅsyntax‘¡E‰ff&fŽ–Ç«error‘¡E‰ff&fŽ“info/4²,–UUÄ95²,“198Ž¡’îEÅsystem/1²,‘UUÄ152Ž¡’îEÅsystem/2²,‘UUÄ152Ž¡’îEÅsystem‘¡E‰ff&fŽ‘Ç«time/1²,‘UUÄ139Ž©’îEÅtab/1²,‘UUÄ109Ž¡’îEÅtell/1²,‘UUÄ107Ž¡’îEÅtelling/1²,‘UUÄ108Ž¡’îEÅtemporary‘¡E‰ff&fŽ‘Ç«file/3²,‘UUÄ149Ž¡’îEÅtemporary‘¡E‰ff&fŽ‘Ç«name/2²,‘UUÄ148Ž¡’îEÅterm‘¡E‰ff&fŽ‘Ç«ref/2²,‘UUÄ57Ž¡’îEÅtext‘?ý²(option),–UUÄ70²,“81Ž¡’îEÅthrow/1²,–UU29,“37,“Ä47²,“199Ž¡’îEÅtight‘?ý²(debug),‘UUÄ30Ž¡’îEÅtold/0²,‘UUÄ108Ž¡’îE²top-lev¸ãel,–UUÄ13²,“18,“23,“25,“112,“162,“203Ž¡’îEÅtop‘¡E‰ff&fŽ‘Ç«level/0²,–UU13,“Ä112Ž¡’îEÅtrace/0‘?ý²(debug),–UU17,“Ä29Ž¡’îEÅtrue/0²,‘UUÄ46Ž¡’îEÅtype‘?ý²(option),‘UUÄ70Ž¡’îEÅtype‘?ý²(propGert¸ãy),–UUÄ73²,“Ä147ަ’îEÅunget‘¡E‰ff&fŽ‘Ç«byte/1²,‘UUÄ90Ž¡’îEÅunget‘¡E‰ff&fŽ‘Ç«byte/2²,‘UUÄ90Ž¡’îEÅunget‘¡E‰ff&fŽ‘Ç«char/1²,‘UUÄ88Ž¡’îEÅunget‘¡E‰ff&fŽ‘Ç«char/2²,‘UUÄ88Ž¡’îEÅunget‘¡E‰ff&fŽ‘Ç«code/1²,‘UUÄ88Ž¡’îEÅunget‘¡E‰ff&fŽ‘Ç«code/2²,‘UUÄ88Ž¡’îEÅunify‘¡E‰ff&fŽ–Ç«with‘¡E‰ff&fŽ“occurs‘¡E‰ff&fŽ“check/2²,‘UUÄ50Ž¡’îEÅunknown‘?ý²( ag),‘UUÄ134Ž¡’îEÅunknown‘?ý²(pGermission),‘UUÄ147Ž¡’îEÅunlink/1²,‘UUÄ146Ž¡’îEÅuser‘?ý²(propGert¸ãy),‘UUÄ65Ž¡’îEÅuser²,–UUÄ107²,“108,“136,“141,“142ŽŽŽŽŽŸŽŒ‹× ²† Ú‹– ý"EŸüfd‘øã²INDEXŽŽŽ’±!€215ŽŽŽŽ‘øãŸfi‰ÌÍÇ>|ŽŽŽŽ ÃÝ» ý_"E‘øãÅuser‘¡E‰ff&fŽ‘Ç«input²,–UUÄ68²,“72,“107,“108ޤ ‘øãÅuser‘¡E‰ff&fŽ‘Ç«output²,–UUÄ68²,“72,“107,“108Ž¡‘øãÅuser‘¡E‰ff&fŽ‘Ç«time/1²,‘UUÄ139Ž©‘øãÅvalue‘¡E‰ff&fŽ‘Ç«method‘?ý²(FD–UUoption),“Ä179Ž¡‘øãÅvar‘?ý²(tok¸ãen),‘UUÄ94Ž¡‘øãÅvar/1²,‘UUÄ49Ž¡‘øãÅvariable‘¡E‰ff&fŽ‘Ç«method‘?ý²(FD–UUoption),“Ä179Ž¡‘øãÅvariable‘¡E‰ff&fŽ‘Ç«names‘?ý²(option),–UU55,“56,“Ä92Ž¡‘øãÅvariables‘?ý²(option),‘UUÄ92Ž¡‘øãÅvector‘¡E‰ff&fŽ‘Ç«max‘?ý²(FD),–UUÄ165²,“167,“173ަ‘øãÅwait/2²,‘UUÄ155Ž¡‘øã²W‘þãAM,–UUÄ11²,“20,“21,“32Ž¡‘øãÅwam‘¡E‰ff&fŽ‘Ç«debug/0‘?ý²(debug),–UUÄ29²,“32Ž¡‘øãÅwarning‘?ý²(option),‘UUÄ92Ž¡‘øã²W‘ÿ*ªarren–UUAbstract“Mac¸ãhine,“Èse‘ÿ}'e‘°²W‘þãAMŽ¡‘øãÅworking‘¡E‰ff&fŽ‘Ç«directory/1²,‘UUÄ144Ž¡‘øãÅwrite‘?ý²(moGde),‘UUÄ70Ž¡‘øãÅwrite‘?ý²(pGermission),‘UUÄ147Ž¡‘øãÅwrite/1²,–UUÄ96²,“98Ž¡‘øãÅwrite/2²,–UUÄ96²,“105,“106Ž¡‘øãÅwrite‘¡E‰ff&fŽ‘Ç«canonical/1²,–UUÄ96²,“98Ž¡‘øãÅwrite‘¡E‰ff&fŽ‘Ç«canonical/2²,–UUÄ96²,“105,“106Ž¡‘øãÅwrite‘¡E‰ff&fŽ–Ç«canonical‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/2²,‘UUÄ105Ž¡‘øãÅwrite‘¡E‰ff&fŽ–Ç«canonical‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/2²,‘UUÄ106Ž¡‘øãÅwrite‘¡E‰ff&fŽ–Ç«canonical‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/2²,‘UUÄ106Ž¡‘øãÅwrite‘¡E‰ff&fŽ–Ç«pl‘¡E‰ff&fŽ“state‘¡E‰ff&fŽ“file/1²,–UU24,“Ä136Ž¡‘øãÅwrite‘¡E‰ff&fŽ‘Ç«term/2²,‘UUÄ96Ž¡‘øãÅwrite‘¡E‰ff&fŽ‘Ç«term/3²,–UU16,“31,“Ä96²,“105,“106Ž¡‘øãÅwrite‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“atom/3²,‘UUÄ105Ž¡‘øãÅwrite‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“chars/3²,‘UUÄ106Ž¡‘øãÅwrite‘¡E‰ff&fŽ–Ç«term‘¡E‰ff&fŽ“to‘¡E‰ff&fŽ“codes/3²,‘UUÄ106Ž¡‘øãÅwrite‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“atom/2²,‘UUÄ105Ž¡‘øãÅwrite‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“chars/2²,‘UUÄ106Ž¡‘øãÅwrite‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“codes/2²,‘UUÄ106Ž¡‘øãÅwriteq/1²,–UUÄ96²,“98Ž¡‘øãÅwriteq/2²,–UUÄ96²,“105,“106,“191Ž¡‘øãÅwriteq‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“atom/2²,‘UUÄ105Ž¡‘øãÅwriteq‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“chars/2²,‘UUÄ106Ž¡‘øãÅwriteq‘¡E‰ff&fŽ–Ç«to‘¡E‰ff&fŽ“codes/2²,‘UUÄ106ŽŽŽŽŽŸŽŒø É|ƒ’À;èÚ‹–À!ƒ Ùó߆µT cmtt12óßê cmmi10ó 0e—rcmmi7óKñ`y cmr10óÙ“ Rcmr7ù Òñßßßßßßß./gprolog-1.3.0/doc/gprolog.ps0000644004425400513100000461305710547153035014576 0ustar diazloco%!PS-Adobe-2.0 %%Creator: dvips(k) 5.95a Copyright 2005 Radical Eye Software %%Title: gprolog.dvi %%Pages: 217 %%PageOrder: Ascend %%BoundingBox: 0 0 595 842 %%DocumentFonts: CMBX12 CMR12 CMR10 CMR7 CMR6 CMTT8 CMBX10 CMTT10 CMSY10 %%+ CMTI10 CMITT10 CMMI7 CMMI10 CMTT12 %%DocumentPaperSizes: a4 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -o gprolog.ps -D 300 gprolog.dvi %DVIPSParameters: dpi=300 %DVIPSSource: TeX output 2007.01.04:1125 %%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: texps.pro 0 0 %! TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def end %%EndProcSet %%BeginProcSet: special.pro 0 0 %! TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known {userdict/md get type/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState save N userdict maxlength dict begin/magscale true def normalscale currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin/SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet %%BeginFont: CMTT12 %!PS-AdobeFont-1.1: CMTT12 1.0 %%CreationDate: 1991 Aug 20 16:45:46 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /CMTT12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 40 /parenleft put dup 41 /parenright put dup 97 /a put dup 105 /i put dup 109 /m put dup 110 /n put readonly def /FontBBox{-1 -234 524 695}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F0364CD5660FE13FF01BC20148F9C480BCD0E C81D5BFC66F04993DD73F0BE0AB13F53B1BA79FE5F618A4F672B16C06BE3251E 3BCB599BFA0E6041FBD558475370D693A959259A2699BA6E97CF40435B8E8A4B 426343E145DF14E59028D4E0941AB537E34024E6CDE0EA9AF8038A3260A0358D D5B1DB53582F0DAB7ADE29CF8DBA0992D5A94672DFF91573F38D9BFD1A57E161 E52DA1B41433C82261E47F79997DF603935D2A187A95F7A25D148FB3C2B6AA32 6B982C32C6B25867871ED7B38E150031A3DE568C8D3731A779EAAF09AC5CE6C5 A129C4147E56882B8068DF37C97C761694F1316AF93E33FF7E0B2F1F252735CE 0D9F7BCE136B06EE967ABE0C8DF24DCBBF99874702ED252B677F407CB39678CC 85DDFC2F45C552BA967E4158165ED16FECC4E32AC4D3B3EB8046DCDD37C92FDF F1F3710BB8EF5CA358ABACA33C7E5ACAD6BF5DC58BDFC3CF09BA2A38291D45A4 C15FF1916FE2EC47FDC80911EB9C61F5D355BEDFC9DB17588547763AC5F0B1CC 12D2FFB32E0803D37E3281DA9CE36C5433655526ACFB3A301C56FAB09DF07B5D 048B47687348DEB96F3F9C53CE56DDD312B93D3918CD92AF53FB9461864D11B8 0138918D0B1270C54873C4012CDE6F886DB11BCEA04B023EBB43E0D0A06BE725 741D08B9DB688731A6C9886C15A83C28DADCC81385EA239E045E8F3670CE03DB 9EE77ED067036595C9F3B1854343BE3A12E486B6E5A2F8AC44FA5378D28DCCEE 306B0E283AA444423F9A4FF38E2B56DCF67A39CEB2C643DAE86865517D5D0371 CB8797208ADEC637330A3A57902C9A88EDB75A7C16FA9850075D9F19578EC666 1353CC1FC512D59DFF847ACCD5A0FDA6F4CF4BB7C9EE62271154425996A09CD7 A6099E025C6AC5170921C33DF1DB152BAA76D1CDA2667774233B9D7EF92ED6FA D9E07F7752D6F4A18D674BBCCD27A08B998A2EFAC6239B9B1E05FC075E1AF019 2D627627BDCD71968288C9EDCD1F646CC73BB16D7E6CC6EC8063AF781C0395B9 FA6B18D75AFEE579C77B9FF51FE829D6298E773AD14BC7753D999EFEF431326D A88EFD68AF1BDAC9C0018ABB77BC75173D955734BDCCD4D30FA94CF6AE54E21B B1BCC8308C4DB9F5E5D68520536709EA57DA33A8EE30AF0E4C7AE0A2E6789FE9 8DEB4B1AC515ACAD9825FD0808870F6FC09D596C0A7B25970F8E19B59F9D872A 473CA6093397B7A1FE692CE3D22BA6A66D1005B2517EF118B285698BFD199B3D 738898DE93A6832443699626E1E25AA0C2AA99EF92E5519A1B5112BD373BEB2D 2274CDF96ECB8EBF2C06EA34A3DB57A7970CF9E1AC29E4D2C081B8098924846D 09EB4EE636CAE6B0DFFBD8F6F6750E7A9355AF36FB0F8FF232340491EE0CAE82 245D17750C54FFA78E7257EF48CB89C3249970F10E51450739185EE4215AE805 73643B7B667211DA15EF42E8373948DB52519043297B37F3562D50590941F905 D9C83E90C67FED0B44246A638033EF8D8ABB0FF8E1487F47415591173F349FF8 0E9E9E09F30EFFAD12CA94A4F90E1B99F9725EB718AC986168357C57A351CD1D 4F63D284D6F61FA0412A9D41DEA18C0DA0D2C937D16CC147F6F7245F012564A7 21EF57A428CB6CD0AD31B6A5F057124B542B3AFA49615DF833C25BE60AF7F3A8 71F50FC164DA2BF918753E11D89BEE81B71BB3E1AC0B420444458DBFF032F5BF ACBC7E2192305DFA356C88C8FB490173F298D1DD6EB01A0FB5A11F9EAC93BEF6 E2661229FAB9C0537A3F6B5D60D8DA5EEF5CFD69FD9240D852D75F582CDBB37A ACC41BD9E09EC6B2E641490AB4D80A8FAC70A0409EA124F80F41EBC6E48E55D2 8B508753F41B6D1DF1C5A4848BF97296BA477660A93794F03BE2A806838610CF D744821D795220F57AE6FE9347B6128ECB7ABAB0CAAABA329DE11DB45EC60228 7C485081A33E841BDB9654533FF0BCB816FBE30C67E60F21CBC2C5781A690A64 D1926CC48F2D5DF5DF1B3EA9CA7DFB5F36BAB2E9DBE30AA1972868514C2D6965 48D23102C50A73BAFCCA15590CB52F088495BB1810B11B662A940E6AB8E1E8F2 A892AFF24768996C2ADE79D925177F2788D0D9AE0E6C3291CBC857C1CFBD3166 BE255F2B390E0BDBB9C8035383744DF04E670CCD63BD8AEEDD15D415ED4C9280 315686CF7C9212122314F25A4EC9E59751F555DED4A8CEA30ECD347E78F1ABE8 414F9A29EF1C3A3FB8904155EF993D94F3DA27BB1D107DE26E75507390116243 BC2A2D87D0AD7DF129904DE480B3FD905C06CAA73378C7FD621E6B827BD0CE0A E61238A395AFB53C03B23BF58634F03326A015019607DCA3DC1EEB315EF06F4D B9040ECD91E02AF0D0B92704B0C96292B3 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI10 %!PS-AdobeFont-1.1: CMMI10 1.100 %%CreationDate: 1996 Jul 23 07:53:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 60 /less put dup 62 /greater put dup 78 /N put dup 79 /O put dup 101 /e put dup 103 /g put dup 108 /l put dup 111 /o put readonly def /FontBBox{-32 -250 1048 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E 6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF 8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE 03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8 42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8 40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837 B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53 956017667D1074FE5415F315CFC941447D57558E64B9D4E9EA5477E6F6A296FF A0459316B76FD210E71CE728FE5907EFAFC9D458558307FF4D4DE06C2756EA4B 5CA2C11EFB33F89E10505503CB46CBFE2B6AB0F2CB22647A12EFF1669ED4838C E3F3D155B75427C2B585B7E880C3ECA82B9D7E8DA006F2D1C9A2682EC8D454FB FA444505ACAC441B213F8ED08E277EE673C92BC739F530F9A7F641DFCEF3AA9F 4D0BA913872BB7AC92BD36FF70FDB82F151E764A528ECC12F85AC2AF0C3BF573 586FB361CA1A98B9B79D088309123F2C37BB7A1E90258DCB8BCC050426CECB4E F28F703A581054CBC035D0467DD9F7DA044A76E79E9676939EEB6D2EFDD6FA69 23F756B74A05545BF8152C8F3F41C79F5FDEAF6B15B8F2427CB507DBA0D4B373 BDFEE7343F8CD60D81EB43DAEBA842E174D5FF4841165F82EE5B48C23E6EB452 426B2B3E46A0E1EC187785BC770715A5FDC52D19E0353BB047C4A48C8D430D11 7954B68F6CBDBAB75BBBF7BF72B1986BC2DDF184519BBB6B1DFCAA3EA5D863DC C4EB4B3970FC51B5DA850DF6A94583920501FD0362EF69B90FFF2A162C383AAA 0CE9D473089903DB1E3F94CECEA5EF5F4266709489609EC3F195930B8B2E8524 D74EB69C1A9B9BB8EECEB82A060AC8323905E1BE6088E3C9EA713F8451B1BFED 826F60DB62510D21B949B16D836ED08B2B97B178F79E000916DEE3D4306202ED 000721A151B8C58F40557F532B261CAFBC1A55526D959A97B9C10EEFA054DB03 988E664B749E66881C553CF67E778C8DBE81E716D9111D72C7BC5F2568115FDB 718EA4533A25FD3748B75DBD65FB0648F71615D28E59BBFFA56012FD5A6B2B45 38946C955BE00CF500179C41BE9A4EA66DF4E77493C7B89FF562F20708DFDA89 9A25B7BB7C05781DDD1D2BE67BDB0A556521ECE46935099758FE8225B3B0DE52 93565490EFDD8ED93756FFFA4CF397DC424DEE0465B25D048570483BE8AC1C7A E739521F764A2A4696DD43BF3D3053FD98AD01D719C449FEF19072F69396630C 789B5C5B89E3A408BECAFCFCEF1CBA1F17419C593834DCAC102A0903AF6D0CA4 3AB1546AA03AFAABFBD4202B7CAFC6F46145FD858211601CB59E474D51C844EC 18BE647053CD1C9E266BE89541E23FE144B632ADB05B3EF8610EACA93E0AE69E 16098BE7B900825BC8D2B8EC5F7E1BC05E93CACA54205C03DFC927B30105259D 65A7D4A594321697E8698AF48D4A1F0BC6031897E31A0307974E157A3339564A D999F329404FCF54A520B0CDF3670821370056FF491C95DA4B33491BC1D45086 5CFBB1B53042B0847EE688AF169E953A3337618A8732C122F6A5F5A50B00FCAD 3225183BC7E12B95405D85178BEBD309A3118A39B5405A122605481F31939085 3F5522B318246EC89A57BEFFD0066F558FB963CEE02A07AE124A7EE4D5E45A34 FEE23B20D9FF8AC8E58A42EF26E19023872DFEB71CCAAC1C4091284C73012E34 AA3F4788932AA460BCA919F2A2E5F6D3C78229A3779B467202F54CC2545D5289 CD1AE12AD1892F333427E2D9CCEC364B326F99DEFF545610E8A82FC24528C151 8F115C633736D766AF4F4B904A11B8BB1CF2BC589E1A5C4AA0A5878C4B378CD3 9705CBA501BCBC74DD4922DD8B3677B1714B66E95DCA0E823BA02D4C37570C4B 51AE28A3D85EE0D9F157E2A7F21BC719CCABBF4D6D29D830CAAFCD6E726806D5 F65AF736FA42B8FC48A0316C121C1EB90BE34CB2B4E82E1DA0AE40E393DC7023 0D073B1DF4EB54F899AD4A41A9F94DC200880A0DB99D67235A2451B25F710C29 A882865BA922E56E9FC16756014FA5CBDB1C32750BD6835A70EB715CEA19A887 2041905E8C660BACDCA26C8247D6B3C10FA5DC240E433E479AC6AFCF57CF9669 7FF46BE644748E 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI7 %!PS-AdobeFont-1.1: CMMI7 1.100 %%CreationDate: 1996 Jul 23 07:53:53 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI7) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI7 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 100 /d put dup 105 /i put dup 110 /n put dup 114 /r put dup 115 /s put dup 116 /t put readonly def /FontBBox{0 -250 1171 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D77639DF1232A4D6233A9CAF69B151DFD33F C0962EAC6E3EBFB8AD256A3C654EAAF9A50C51BC6FA90B61B60401C235AFAB7B B078D20B4B8A6D7F0300CF694E6956FF9C29C84FCC5C9E8890AA56B1BC60E868 DA8488AC4435E6B5CE34EA88E904D5C978514D7E476BF8971D419363125D4811 4D886EDDDCDDA8A6B0FDA5CF0603EA9FA5D4393BEBB26E1AB11C2D74FFA6FEE3 FAFBC6F05B801C1C3276B11080F5023902B56593F3F6B1F37997038F36B9E3AB 76C2E97E1F492D27A8E99F3E947A47166D0D0D063E4E6A9B535DC9F1BED129C5 123775D5D68787A58C93009FD5DA55B19511B95168C83429BD2D878207C39770 012318EA7AA39900C97B9D3859E3D0B04750B8390BF1F1BC29DC22BCAD50ECC6 A3C633D0937A59E859E5185AF9F56704708D5F1C50F78F43DFAC43C4E7DC9413 44CEFE43279AFD3C167C942889A352F2FF806C2FF8B3EB4908D50778AA58CFFC 4D1B14597A06A994ED8414BBE8B26E74D49F6CF54176B7297CDA112A69518050 01337CBA5478EB984CDD22020DAED9CA8311C33FBCC84177F5CE870E709FC608 D28B3A7208EFF72988C136142CE79B4E9C7B3FE588E9824ABC6F04D141E589B3 914A73A42801305439862414F893D5B6C327A7EE2730DEDE6A1597B09C258F05 261BC634F64C9F8477CD51634BA648FC70F659C90DC042C0D6B68CD1DF36D615 24F362B85A58D65A8E6DFD583EF9A79A428F2390A0B5398EEB78F4B5A89D9AD2 A517E0361749554ABD6547072398FFDD863E40501C316F28FDDF8B550FF8D663 9843D0BEA42289F85BD844891DB42EC7C51229D33EE7E83B1290404C799B8E8C 889787CDC43FBDFE1B4A245C9AA8693DE3556FCF9B5558458BDDB03416567965 FC0550B129181FEFBB252A98FEB70B4B4C56BDF24B8371CB40F4D605B05CD589 C4DF276271CBEF3E4E85535A5A2186852825EC587F6C4BD6A9A8E65CE4D34D9D C45714B3CC411A513C2F215936DEEB9F8109AD88310DFEFCB0D26F4112E326F0 F4EAC64BEFAB8391400AF8632E73BDBEC6BB65349A4DC922F2893D7BBE241297 7DA42D833015C32E17C04AC66A0FD7D4A290977DFC3B72310C4D36D9F8E68327 B062272CD499264C920411BD9A2D83E5B16F383FE738BE7E07214FC93574CA29 909789B5ADFE4703298A0FBE631ED816542AE4AF136DA60EBCB34FAE2AAE5DA5 13FB7BD7CA626E45F7311FA42100222F09571F086DE16C1824C7DBBD0083B6E0 6B9D5C9A091DEF2FEF6CB63E3EB90FF8D77463518B592E25D68687DF7C9B300A 65C5006732359BACC7C1C5169A223FDEE3778BAD7EB35BD8E19B69415BAE2053 59BC0EA9D65382D5FF0264950950154CFAEC53FB021FEE9C93BB278331835805 FD0CEAB6637507D1CCA98993ED0B336ECA09CDAD5EB23E49C8656B57A6D457A3 74C63F6815231C413556D17FBF70DB0993F614E4A0F83B08E0ED76810592C934 93C3B30EF14AB627F1BC6730C7211A9315463E7C7B233ECAE2E4BA1A9FB14C39 7E2E8A6C8DE5DA4E0ECF46F05D5F7432ABE350511819571AB7A52D177C6B3AE2 1C29F2BF4C208B5FD4E6A66DC56604C6E126F918B1910F1F9760FB3F72D910BC FD9D5D8AA52C7D6BFDBB0E6685D7D8576492501CD9B1E72F12F0B4188DDDB0DE E8CCCBFEC16B8DB69E5F88132D2B3812BB4B9F583CB4E0956E6A13F3CEA3D263 F102EA49C49F3FE1F6250885E564A34A0651685E7731A0E81740CBF6F8A62229 88207D047BCAD671CD39714FEABCCA4A9E9978542F0A9E01F0E3B0179ADC59DB 9EF9AD1CAD911786DBFB850FE92071C6D0E11EF8F33B17701DDCB9E5779A8C54 91B34B29B2D4241CC472FF8C22C5A8BA9A917810C2E2ED52A6D533E71C286C97 85FC3A4D8F4E86B06A1C437AB258BBA4E24E8F62C2798E29BCECE8720DEBA6E5 64D769A892DC1DA56DA183F3ABA758ED6676D955906346D8F4F6332C2BF2B146 6D7CC47AE04E59FE2A6E9D8136E5FE31D8D104E0AAA7D63B0A9A0272526F1998 282E8225147F58FABD01500D651BDC2E776DF822CB5A4577F25CBFB76E1D8FC9 E649CC4C8C5A44D1DB6B594C1ED63ADAD558D900FF960A9F164603EBC02897AE 620DF1D0BAAA99A6F0D6E33CCD4374D56881302C6E2E19C26CF2A56D6B0D70AE 0CC7BFA46820105AB3CD361E299213A5C06479362816405C094998C15A4E8D16 B0B19F73615F1725A928976A81DAA6B10FF2CC65B527013787A00C3500576E71 90BBF77B6864B9EDB771CF3A6E4ADF882B3E1DF9323A12642ADE04B284DD2D0E 8ED92D09E237EC5B469AA59BD82550524B7D54985796FCBD45A2A263CA45C73A F0898195258FB1832670FC7B9CB7BF5AA9A84CE1213FD4FC5056DED35BEE5655 6B815B3D5F903095EEF5CF0C42D13BE0F9116F798C73ED0800669EC80FDB0F9C 5C7889D77D75F41422ACC07006FEF1E581A6139F7BA349FB314E514125260476 8F3F3ADF75E47215D4E32098F2E349A24134559FC97916FB6DCB326D709A121D D5BA8D62113BD77F5844310905D8158BC969DE4F5DE793FA457C7B6C393A05DE CBF8650665C4E42C6F2A0B8A22E6AD9FEC3D236220753ACD072CE3E21B902BBA 62D8E183EEF3FF80172B54AA926A154D025E3BBA34DFF1794C50366DB794CB20 29205E2C561761683D70EAFFE500CA6334794BC9243ACA74B4003FE53AA06736 D7DC1203193F3A03F8C5ABAC11A74174E3A763EFFD7A65DC5381685BF416E85A 4BC293C9D6764C206C4A570BBE4778A5EBA95585DC8E571C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMITT10 %!PS-AdobeFont-1.1: CMITT10 1.0 %%CreationDate: 1991 Aug 18 17:48:50 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMITT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch true def end readonly def /FontName /CMITT10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 49 /one put dup 50 /two put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 89 /Y put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 120 /x put dup 121 /y put readonly def /FontBBox{11 -233 669 696}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D004D606918A40B8D7BFA821B73E118040992A4 E1BF99740F8FAA47E4349853C8149C0F8BE2F23C6F332BC0373C867D0715E8FA FF163A60AFD0FED665D5829739975C5DE12EB30895604D211F645D4E13330DB7 64B6E35463C93B752F691FDDC44595B0A0E9E57C6F649809C4DBC7DB58102A60 46349E9A5740893A1BD4536B99ECE72B147B713619037400669C07291022F84F 4F3302F8244D2F0F1380466E81E0B5E00AF33E021A55620A7A93F3BD49C7040A 67C096167F502EF2051B526405B9391B4340A3FFEC103E317E315A88D31661E1 7E4104A2B925D1DDA9586861904FF6FFCE6A8E808385E4C4014F5A494874E2FB C3758D6989AB68C4CEF82F92B9439794FC404A29D086ED6B27997735BC3A24F0 473FFD74BAECF5282E2EBFCB92D69B81C568D394055E2E30A7E3F448796E4EB8 019AC2E075377F777183BD87FDD194E855ABFA35AFA73304DBB181C267431B16 70456FD8470B525011891C1E140B8FF24A474B89F1CEAAB509F91FCAF512E16D 8413BAC0C664FDCD31245C5996F4883305D3EDF1C8D1E6F0B1E79A06028BBDDF 6AA5B515DF33BA8FFF2394262F3FE1DF95AD661322BFA5179E325BD1B1EECE49 69F64789FF1BE8DE5CD7485571A07471BD6CAB4891BAB122BF1B23D78711E29C 0DF2342B7335C35D0F0805B0A83F6570AB661156D2F8FDD159DAC2E0D429DEBC C5AB0E396E719270933DABAEEB1370747E0ACF595A6B92B409383CCCB1932570 D905892DD16D2186DDDFD147B12E123AC89F96282FA95D10FAA87C6B65EDDB89 B3CFF6C85E86E42826889A2DCB4533324B933A22919F1E3A186544285D2B8E46 967A88601546413D4BAF975BD1746D540DCEC712FF13DCFDCC534D6BD90E63CD C25BE4F46D5044F1EC01FC3D6332F7DD559FD0AA2FFCCA62F3F8EB9444B45F8D 36077ACB5A54EAB89E11E13FF39490B9BBAB4258C607CEBC155D498C1F0476CF EF8ABA3D40DC46A578DBB20635D121B142FF4CC3FA8554C98EC0C181BCDBD121 28DE71189B43C84F8C6D8FC3C3AC9623ACB3314800A5B48A7C7BD308590035FC 5B7BA5BFF8FA888CA4EDE4FED26DA74416310BA1A54EDE36E171EDB9DEF3D748 41255480AAAFBD15863A8D90EA9E7E13CD67CE2FD89AA301E05690C85C58B60F 3335A9B660141B5DE1B71BE643AD4000AA44DE03CC55E57AA580370F57AD3ED7 046E95DE57D0A6DCBC836EC04B9BD51400BD0CCA3551565052F301B8B40722D0 49287A11B5A240599F3005143ABB3491A972C7710AEAED59E5346ECFB97F48F4 CAD1561686F7DE1CD9724DE206353D5EB88F954EBC532216F4B4C55C410B8E95 654B2B3B58512C89E4B1047B3B854B17B81F25E291830892C7232CC7C81B26AD 142A73FBDEB6E94B12D913F979677D134376E597EF8B6F227AF16EE40A286C69 81AC0CC8CE03BD52302FDF96F56BF897819308D5EB0C201282E42398B28182C4 F4C61D3C674C98A7448D8C2859485B16CE4A11BE05C174DF304C7AE246D27884 647EBA2F98C9EE25F0467D8F2CEBA58C39368047CBA6D4805D30484FB94CEFBF 77E25C3A1BBC31808926A9AEB0F1C00CDB6AFAE0CFDA2A7B57DDE2CB95295ECD 3FD51444245C32B4E1506C1B0A67AEDF15A9F419A8AA603C44F75DBC53061C2A 9095F6E6BAFCB29071357A8C3C1D6FDA4B77B19A412B65838095DB4481FE9C42 3239B328FF5AC23C59257460A33A9CE927D9B6B5FBFB3D79613649289C77C661 13F3CC040B0DC0AC82521B8AE76D1E42364844F0DA927433589D2D1E635B19BD BA522B22D219444BE05140C21051AE95940F2BAF40868AE764EC6A0B22F909EA 43862CA54D055803CAFCAC661DB6BF6936C86116F21208D84743FC0800A9609E D90B47C03FC6318C19CC52187AAB008E82CB5866BD19340BFAA16B8EF8D8A275 807576A584F0FD4C628664F96BDA1316F88B4CC5FE355DBBBC590BDAF3378FE7 C3A86E9CC1D2C744BD598BBC1E22E2B68EBADA823B62BEE2E4CF9DD903A28D0D 992FB81A73B0C8D0225CE877543B8D72C5254B3014A6C45663258EB18FF18445 3FF54B907EBEE3D4F39F9B460946D421E97CE9162B62CE5B014DB2C897E2AAA9 88F01396409A58135F5122AEB59FD43D4B299CD3D135FF1DB674AF4915EDB5FA 3BC5411817C051516F4B10B0F805DF6AF8C597BE0FA3EBB185DC772509253576 69E3925AAFA58B6EB69E2AE98FB1A7D5812A359D7EBB270B3D6D18167B21670C CB6C904247152759D29308804B716FBB7919E017631399400AD97A2C0D5F1829 EB621B3427C7FD2FB53BCCE2946744D6462C8EFB175C1C92F9212903AAEF7D71 2497B06DFC5E3D3107F6C104719B7DB0B1BAD2D068B534865E223452F14633D6 0F852928B16AB57E13712B62823DD27A9B84A5F175107D114FF33CC9111E290C FE26658F5B85E4CB87A8BDD41EA05B57136031955C898A15F4685578A7DC46D1 DAC6229D68D55DD7FD502670C7CB52F041702E7D43D5EDD40892ECC72C573006 853985F5C7147259E4A6872F8AB16635D88A75DE873EB104A33C71C2C12E3F13 4A4E9B63FA3483F8E70FABD2AF67DB83E87D383956FE0288DBFA962D830EED79 894FC0895F40A7996F697DD21CED885CCC784FFEC0E7B29177AE8A5384AB9F2F 7BF12E19BD0B105ECC1B35CBD7A388DE24359ACA51233D6E32C9AD98A35EDF0D 7E1BA83BAC1E115D7DF5F1E29255A75BF04E586497E818DC334A63EA1AF2947C 22B3F4DABB24DBF5F669C88E93A357E25758A41F697653DEDD87E3BBA8E924D8 35C25D45BCB1E9793F0EA42653B8892ECBFC0BF327BC301FA5D6E627A36518EC D83B5F2CA9BCA719D828469FE27C2F34AB93D6AFEC11BAC443CFEF9CEC80E939 EE2309CB7F59F2E1FD56C34099030BAC510CBE855C4C884D022E82B6BE2BDBB5 23C08009AFA01C241A08DB3C06E6A3BBACFB1BB898719661B42A9942DDB514E8 69A3316985D042C97D2137A9739CB68BFC3265E643ACEC9C245D54B63FD62420 E4C040F6934FD627A38F0D627DA78FF8D8347CB2FB0BD3380277F49EDA9ACB48 1CC418CDF2FF5A5082A61A567821BF0884581EC247BA079F72DEF38FE3401072 D1EC7730969F76358B25A1713BB918C083FA37242C4FF4EED06A7BB2C83060DA 9BEFC47DF98846683A8A4258B702D8772E3BA1B3F25E776646C780A564287B42 D37BAD7A75D6E2AF1ECA73309DB58B833734DA8F1DA94655CC6B530C84BAB704 86D22F14E15034A2A4271B7E44B450771FF2AA88955EE0EA38E4CFF21B610D8B 11BD89465D9FC9E19A646A4E2AF3EBCD2ADD52EBB4D09B560F80E83B4F8514F6 4D4B2869CFD397F4C600AB2172F880F6A48A7D8F521B2F3276E64618F6891E9C E54F3F00F6274CBD0482FEC75BACEABD528FA3C32AB875F433175AA6C0065613 430EB88B97E26963FCCF4C9C132DDF4FB4CD84EC3B8990191BF12B34019F4CB9 A6313FD3C2E1AACFFFD7A81B93BB1F944E334C4F4F787A494C86D9EA02D432DB 7C62AA1AABB766AD76E946E6B6B031EF1CCC09416FB89A56F67A87F1B9411064 614CAFE85424821ABB37E5F3266DDC511CE4FFBDF7DA62942D9CBE2C5D2AC4A4 F1E3521F9582485CE7DC097B0C8CEDF43D3A34FD760A887C49F634EAA9A31101 F2787EB609AA1490ECDD1359F715A017BACEDD43D3921D224BB4D4C37C176D64 F85B83DB6141DACF7FDE25C2850EE6EAEB8DAE03A6C5C70CB3E8FF22F2FF871C 47915EF3C2C0A1643640B5BE2703E9F23F341E00CD3BA90E46F9916272730771 1C0EE6FA783D0D3D44E77128DBE8B0A629CA4A478F438EE5170794601E5D846A 8550AF271189B7F737F112186548B59058986976EC47BE1CB290DAC5B291CD77 4BCBB6BE6239276A955B72A5D1EAA9675265A451E1C9B5EB2E50368C94BA32A1 7BF4E5782FDB8BD915A23BF7AE951765E6C00484710EBF8827ED795879E58360 26A81B47DC1971B04592CCD6B52FA6A2076154FD9946CC571685D256C874CB99 AD4AC6E58E47FCA935C673956B2A6295B0D93D4177CCFECA473F611F56E18796 B8B3291305223470CD0810E11833A91E459E9C53D1073F202D07339D02DCF887 199FC5EE7AF46346A1A52DEDAF2DF5EC98F42E754A1C901797B9511A2B249435 FEC6BD8CFEFE107D4906E6B5D5A28CFB5633784D73FC941460CE056A2DEB49E5 E01FBA6791019C1B6DC5DFE2BB9971F9745FD3F26986170AACA09AB0159BE9F1 A161955C530BC6FE9EA0AC7FD6FB5B4EE0059C95A1F3CD8196954E17847D95D5 62686ED94049282EA0CB144BA29B19006D35376E4A348A0C2F043FC3DECD1FB8 C29435E372143936766278182619D921226D17ECA618A2A521261B8F19B0D5FE 2A1272B0BCE1640C3CAB41214538032AE5D4AF398BF921FDD0508752686DD26D F2333C5F96490404F2C1BA241D6596BA10B5817AB078D8A8D753FDE6E699CFB4 E88EB6229E2D57387F8EC16C55EEB5EA58A026FE1BC0368F416694DDB38C1D36 6C66AE607F56F6CDA91B6A9537954315B6327CD115E7C9D8F19243C31DDF9945 962B6228489A8105D3421CF0AEA5AB9590402EBA5D1496B4B8CAD5981BE2700C F482503EB7351090710117C33C2DD537A3219462A50FC76CDCF3B59285996304 73FAA9984B7612C2EEAD30021AC95359FB8CE3A9473A06D2226FE2D0D4D7E5AC B746C93F86877126F08F53D8DE90AAD26C471529937F7C40AF0C01C6C4E60A6B 944F26BA2F15A490F68013AA30926D966DC69F1120F32BD2D35B912FE711E69D 96617D292C0C16BBC5E28DF23F8C4BABA7D8C2230C1CCC9EB669EBEEDED24CAC 5FFBD78ACC5F0E7535372614CA7A873BB14E6C407813E062BC1C045AC214C4C5 C89A8B8519D5A5792B69CFAB5660FF54DED2C1E8DB28599475B1E30C59D076DF 919898FD4E5C2464A08C8BB10ED5A69C849C60EA9AB1325752AD5C35BCE9BD21 3E717A1876A224264691A4B6DE7B2E8E99887F3F8AA466E30D690F0983AA7DDD AFDE1C31D9FA467F052CF089E1349A27DB435F7C3D7EEADBB9D0A438A2C6FB0A 5507882C1F0FDA745E4E452D521B4F4957B4FB98A8345D5DDBE6359ACEEC8B99 F1968B08014532BEDFE87231B91E902A7D5B20E76FACB994CE553819BEF3348B 918D53DE659A66A84789FA3B723DE479F3D9874282B679F9299B475062F0891C B4401A63208D8EDA9E6AB1CBBEE49D316A8C02EB2185F55FD945B4D22DA8B413 0C7A7DB262DB584815AA07F050FB4C5CEE42812D540E49757C35DA0E584E31AF D85E9CA3491E7018B68BEC5C1D1641EF111B3B071DC9C32443A35198E0C6CC49 85F65A6313B5A1AA264A5DD1E91ADD05DCE4FA17508B1BEA9F4C492E1B395CE3 2C5F6C019A2FF86F222C6C0566F97E5E40A2E40918934A7B9D2B640D47C7D8AB 461705A6CDC6291FF43FBAB1A1B28A422EC4DFA44B697F59FA35AAD23CFC173C 781F55F72AB82AB23341C1FD0E6361471538E84B13449D4BEE47C251F0E86B80 438BD7DB968719CA2B9445A879E1FC3F5F7A4FE88885F1B434D0A3AB9602FDBD 39CE5B8DFFF4B71D9C6DA96101D9B796C118327D5C8910BF880C752E82E004C8 9C1A38B8A5FBEB22FD8C50010E0317162F185FC8FF0B36AAE7AD93BD2CE6B84C F0F4E607EF096B4ECC164975FA41250755213740F4CC425EEAD34043858ED999 59917C8B762B11B2EEB055AD2E27EFD20DD33CAFAF026D52A8F222D27007BB05 08E525AAFAAE8A10972FFD837EDFED578CC6CDE759BADE67D39AFC3591962F65 A7D39DACD64A4F776D34B4C59D6602640B73D72C939BDD75760F8041EC003317 598F32EDC2864447F492E922136DD12ABE8BE81899FF5E17B32DE2E0BE1A44AD FD54A299761480A14F033A50687175DE6F99C86FD7EC8FEB6C8A2884E1AB7256 2F419E18AEBD7EFF9E0395E1B80584C4A7BB513E2EB249CF99E9C7F14B7DDBCE DF91385EDCCA36ADA4584D205EF91F279301BB3944504B6DB0B9BE1FB23B0E01 B5988FEE97D611374EA6F91F019733A19A2EE4F3D57B2A9D4CD4F364B5E68135 B05C826ADEFDA173377512D7E18B529A102007A50EC2CD8377018726B2CF1252 557F7FEC9663854828F2A72AC62AE1357D89305A8F8DF6CE58A54C1E24FE63D2 B471D35A08545B3DBAADB68B6ADCE780151E044AE4AD39519231C6C98359E689 A56AB0FE2F262B868794F066BECACD856C30406C4EE7C7FE0D988B2F7F089F08 25186D07DC197A4EE3E6FD7CD0471DE09D46222B4F23A9187EBBF98ABAC38853 30EEFEE0A8B4B4AB04B8A62380D73BEBD6C7565B4826F92492F9C314961491B8 B8B28322AF99F53826A9D2C003A8243991FE22F0D659127056D8AABB6D49ACEA 22609FC6703803285D03173D23E4744F8F24AECC380D01A9D4C8BACBBBBCF1A1 22E1B6176833C6D82AEDF779A4ABEFF2FB7DB9E6FFA1FB14DC01BA12FD215FED 81039373B3187BE1EB48CF8C2EBBA49B640F6453427E6C12FB7BD798DECC2A7F 390775E4EE174F08F72F886AAB60DA22FFCB3428B6E8D3E8553CF0D8B8639312 EAF3A65A5A16B8C419D97671A2368DEFE961736C010DA63EEB91FE443A58C6BA 8DB7BD35D88AA4AEFA93DD6ECE03CC38522B3AE4288E886936AF10265B864E52 7D60A15BF64978CBA446FF8A707AE8370D76722310F422883169C446705EA574 B1CC7F2E7004E07B25FDBCBA4070F197293DE2494E9720703F1E4331A050E26C E388EAB9D884C57FE5C13974EF44B1C48F7BC10A07A85724E9162DFCA4CC4166 B7D9C64DECD1DD701BA90BF6CE4891E253A3FA863AEA872E3988A5855B58BE90 BB88E4415E9BF0D77182C82FBFDAB25DFAF7D63783717039DAC7D1D941CDBCB6 BF4918B13018920656F02FC12B919220373C9E83892659609AD2A547378C3D75 277543BB8CC8ABF80687D67A205C4AE101A1DBF4B01B1385A9484164858B14EC 11B8F012D036F70CB2AB14FA78D223E7D63F9B2B90E34BFEAE2AD9A0BE118510 DA15A0C7E179592D1E722700EADBDAD78F54E25F1B6D3FF3844E94C737A134EB A2DB5A8A75751B3264AECF35615708624252795003204B351F2F64685CE7A6E7 37D348510F9D7DC9CA13CAC3C35F51B91F82641C34FBEDB1CA67C2EE63170B8E FC5565DD5572E35D329340DB4384D0CA0026B74AF84E5FD1414EB43DD4482C67 5E163DFFD6A157FA264712E30D2C34ACC3BD4DB92BA1F655B7CBB8D739AE36E9 70564A1EF91F3B88D0A9DEA8920576783FA3E410B51D3BE4BF527BDF3F0262C8 8513715D032E89279F0A754CDC19EE9A40529E5B754D0A9059E250D862EEAED4 BE3A9ECA53A8526A22FD6C6607647BB94950EBEAE5429536CC23D88EB178E266 A22A9914C768B0017FFE776FD0F6647CCFF0460503E78DFA293AFFBA724F2B8A E209932317B709F1B30FF82E8AD4C367F0D2AEF3993B7EC5B5B1FA9A859E8D97 20154F6717912FF26E947531F213840D3F90B5766C1A53471EE741E39B16824B F94E5E23BD8355227EA388F0F59BB411B816FB7404A354F37A26389AA8CC52F6 C7EB437B18FAAD4F6CA30D4632A2E395A87A1C9340A70590C2F1A3D4B2C6CB8E D993441B6DFBFDADE9FD145745CA92C787DBF8ED2A5FD35CFD080EBB80DC6B7F C87C5316135CAA857790AD666156B5281E349ECD8C3E68AA45676D20E0DD019C 6A06779BBF9419CA08D60CFC813BF503F6C3C7C26323BCB2C25A30EE8E49E199 A2FF5285CA0771B33BEA9525A65958D8C20D8E6DB09F66AED6C61041785323B7 12FBF45C80D61F03D7BCE23A90667339E93348CF8E7565F7449E2194867B6215 AFEBB59B7CFE771C8FF4086AAB7805D53C2ACD7124D9990451D07FECF5569D6B 13B7B5FFF5D517880D866FE28A766704CAEF8D16196AF9BE9E6882FBCAF83E09 458515C385C9375671EEF10D608501290B79CB4F66D6A64AF0BB771C6F95E651 E158C9C0E1C82A57E05895D9C1778EF1A4F9388B083DD91F963174A4E6104B87 DB5C49D0C30EEF6B07C8E719DE1A9F063FF71AF64CF2F76542E1D6852961EC2A 6F7EB71034238615449535898917364509C36A7D675A9980A5D68A5998E47E7C AB1D92D34D73F1A2F4CEA18597DF0D822A991165368126B36AE310789AB4D0DC 6BC13B4E655B9CAC60518668A51F053618091FC567F11F18D9B675696ADED6BB 008E0889467A4E286A1B511BE7777EAACBE15E22EBC8CB39467FB1B737EF50A7 F68EDA452A1BAA26263D644C44AEF32B29E923A2ED67E0D6FFF1CC07DC98303D 537DC031B71D627B6BCCB8F680B92083E0DBEB360E6E1464C6EB8451F4954BDB F83407C53F12AB4A00B6D3C5C9F6972CFA95E1C611FAC8B01DCC3B5F2FFEFA7D 646D0350861259D83AE9AEDD12F9ECABCD3B8C940E0EF70B78EB3BEC72005FC4 363962E1CE2CFC810B449D838E744B8972F239774969E8675C97558B00CB1EEC C0E86B73CBA74982B07F424EFF18CD72F9DD5DC070C776610BBE4500FF31412C 3F7F09E092C7F173E544325F08942AE1CA3FDAEDDB786ACE7724555323D34AE6 FC1A5F06C009ECC12B004C8584498F718DEF4AFFCADCF521D7F8A24092E4D8C5 0C5A47947D51E8B17A51334881FA3D07558975B5592F80211B7F1F599DCAC6D4 A7C25DAFC44DF22320D3DC27E8DD7093CE675831608E085CFA1F3839C93BD312 64AD8DEEEFB06D93455CC89B00C75A9C3C44610609D922983EED094F5A00DF18 3232ECC18F34698F90BFC8C065EA19C1A1C61320BBE482C1F769D63D4E502CBD 5677547A546514660956CC047CAB4DE2AF9F37931DCBCBCE9C70FC17EA6D7EF0 7750CBEC5BB34F83AB0FD7948B247743B801B7CB3C4F411E1DC43893431C2EB8 0EE5F919E572EB44AB6938935E25235C6EB42519E945C40B1350A2FC49AB7DE4 0B9B03AD1255AD6DF329AC150E250051E44D62498EDE25B5EC639E23E53492FB 7A80AC7810886AFD0AD62E86F461F0C4893E38BDA7AAF8EB8C3C305FAD7E88A7 D168EF44D03324B2CDB111C1DDFDC0A771EFDC39F27163466AD4B21689EA9FE9 14D3B77ECDA042126C155338B4CFB0CA9E0C7F0316517DBF28871918C3433074 C7515D38AFE0E97CF599F3D22BF5E84A1298335FAA331E69578681B00CD81EEC 4E9A1F94C48B7431C7A75C3BC43564F2D3CADD24AAB62666247F54402B3431E3 9B024D4E465B4136A52F2AC149FA7F8115F00A88D82B177623989D20A36BBF29 57D93E0EBCA05AFF1EC508849A3CE2DB54CABD33A1A6F102FEEF65E92BFF68E2 D7DEF7460DF5B55884ADB59AE3A269079543B8D4310D05975F6E4491E6C1E96E AE27346F8712A4271A9789396EFDAA76F2743EEB5F91349668E100A873B9B93C BFF3FAEE46A22F5AE5932CDC902DD3E69C5E39501D9207680D2F0545D19E73D0 67795B2D1A34A4FEE914EA9C9366D8B9164831EA6DE6E7F590C7025A872DD007 26474054EA10CDACBC55516BFA0D92D0DD05E828EEF47741C1A149A98476BFAA 56D6C067F445487D6531AF0F3D2E0F88E13832DC2F77B5EF74C880BEDCE3825A 3DF6F3A3BD5B0ABA1EB0767CEE7D833DB78BA5EC3C0777A4090DEB77D43418F2 9B869507A773C8AFECC3B07A84B6998A0972F8F3B384F991B6D6FA2403A3282C 2969A069F4AF42CF0BE1612D57C75FC94EB78E8477187B3D732A6B62A7091413 D94409712876A578EFCDF678B10F8C87D439D464A5DBBDC8C36CB5FFF2464F88 6F3C9E0854B31F033D25ADFD781CA2E9C187F4DC2B407D12E008695972AE2D59 DF22E7C17D25E5EDEC468E2691AADF57F6F0EA36EA4770558D2AA3559DF6DEAA F9EA89CBF0BD87E9C43105654412E6DE234471D76A619FEEE8CE3687C189C3EA 7C151184880935E2A1EFA9DAE3B74C6FAB52C7F7AD03DBD47B03C127703BA940 6040A6D1A434AB89F924A7F65DC1D643646A616760ABF6E734287C89B6214D51 6A706BFD9B2B0E444FEC7AF03BA4493F76A873F82A27BAD049963952BE134B01 F764092731E63A378F70ED94E068CA0956C4FE9F15C7818FFB5C4440EABCBC5D 5B750FD9CE02FC5CEA464CA5E69DF685423067C22F3851B294841421E75C8775 03679DE840ED1A5A747994D2995D4CB4B5878C83BB75F389DE73C2AD3B6E821E 636F971F2692BE048AB63C6DB5763D08900C74E5DAD9C8122D02B2694C4830E0 3332A03C3524DDC6C36F686B0DA71F2F1FE04A6EEBD2B1D49B2C4AFD551B0963 2BFCFFB9325509AE4205FF4B2CF233EEBA122D3CEFEB1CD0969077EFAA401CCD 4BFFE7D98ACF2B47B46B14138FBAE5FE360F7154111378FE6D544689D0A4C470 48BD31BCC802D768BC1296B3E4460EBB2FFCC246200D8D5ECB2F901C2F681746 2F9543D5A6D1EAFB07E181F5C3F6FA73EE123BEB42233B48F0B5E35D68FF1715 56A4CD7777DF51B5C3B54747FCD0CB0CDD553B072A42EEF4923FB791F8FA57E2 99FFABD817D8957C04789AD2DA671D2AA9E517500C095AA3795BA5C6F5FBC145 FF4243BBE151F7FB09CEC673EA7D992F0CD6BB393880BBA313DB909A680A22B8 2F4DC3C5812A65BD4A96ABBCC29840BA845D8F866AC34C3C946036AB1809270F 5EEADF75C73251CABF8A9FBF6D1259B5DA0B21ADEE9FD207BE906A718A858CAA 5279903CCBAD6004A91BDD9FA543C63B213BC7064513BDDCAC0C3AADEF9EB967 A94825C3F239CE08F32A0A20BCF6AF7BAC91E1705B112645AD3CA369B7E84EB1 16962C6E5A21CFD2A5982A86ABE7DF5BA0D00034B02A9BA5D1287467FE4489D7 B773D68008210D9DFABD9772C7DFB3B7D054BE1E9D8A23372B7609539BB196BB 3BD4E1B2E6D147C473A98B21B3E742B90253EA78508EA4A85CCDBFD0158C781A C2B49182789D58D697B95A95CEC97C819878BF8286A635EAB17686461C8E993B 3C388962594218615269010566F631AA9CB64130B7012E5A15D364ED29631183 D28E1C6F89ED87E5C8764D4A1230D4035A1B855743B99E2C086C74516521A860 3BEFAE7EFFEA6C2709D158362BF420DEB20C9696EEFA3BE1A8015921BD5D6072 CFBC23A382BB99CAAE07F0DBBEABFA2CF9D8886CB8225F7A61198050887C122E 09CFBFBDFAE1540F4139DC47A1291575A71BA4D5F4CE91312488A8584853E24C A0E11EB482FE5D0BD21822C84810312051B391E863996F95DA03C126A451000C 923E9DE11D0EA19D75D81F29CB36B419D915179219A427E05D143580B697B9EA 52D0E6E45005BE64C1E9CC8E4B33CC8BA439C4FD54C21ABE6BD78D4C482B9E87 594250743053E39078C39BDA6227865E8CCAC35B6BE88F34DFAF68EB9AF3F471 EFBCA0509931C7163A7AD9523A5E6D949314D84E32307110176A3CC50D27E98F 6DF9738DD0FBE145984DAE820F27D195509D3ADE787D589AAE3DEA88BC52A1BA 775773320E74C38DC33089C17CA92EFF3D6DC8E88DCCF30F94B1C6FF40BD4749 5F6C15638768474AE3E1B921725BA4D9A00BF43FEFC2A556144FA3891E113D6A BA7C40428FFB42CA56CDB0E879C9FCD225F88831EC06234AABE50F8D8CCBB819 7ACEB9FD41FCF466B95F3A0D58E815751C1C8AA7B26B8652DB18FA9E380E90C8 CF 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTI10 %!PS-AdobeFont-1.1: CMTI10 1.00B %%CreationDate: 1992 Feb 19 19:56:16 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMTI10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /fi put dup 45 /hyphen put dup 49 /one put dup 50 /two put dup 67 /C put dup 70 /F put dup 73 /I put dup 74 /J put dup 76 /L put dup 79 /O put dup 80 /P put dup 97 /a put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 120 /x put dup 121 /y put readonly def /FontBBox{-163 -250 1146 969}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F 21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6 06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF 55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5 B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86 0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9 1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961 7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A 7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402 356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B 19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2 C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F 244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95 5C4DD885310A706B320AB25C8D742C6F29953254FA54DAAEE60ED477877D19BC D28E9AB576B0EA088171FD000B60D73B3C57F754BC07EBC9BF751B7D2B32459D 993861B7C4B0D98C422A11BECEF76F4EFC0ECAEE89723E6CED53E3678D733363 2DF068AEF0FE7DFB57393BDAA439A6A4C396F86032A98009EAE1247B7DE83B3B E46DF2898598FF5E6CA6953127432A967E4FD41CDD60D6E413059A58FA556EF3 309178B57C16A763CFC9BEEC276944BDEA255789EF4E1ECDE1EA43EEDB955513 F42EDDCF39AE522A1DC2D80B2772B05DA60F3DC15A815A6BAFEDC399C7956E75 3851CB3588E22936FBFB63A58300298B11C45D82385C083D07AF133BB1BC941A FDD9F34D5E0B8087EF2A58C54D8AB7580EE3ED58AEB83B72CB9028F472ADBF11 05A77651F118824F6CD00209EFB60C1D32D46A78E8C8DCB8B0E742828E3B7D17 DF5200D68189C91FB8489CDEE8BC223C4281DDCA5F7DA80BD5C2D66A14695EA1 5F05E03500579ADD440ED2C57F535807560C6FE3873143D792734FEAB93AE8DD 633BA6FC5683083402BF086D23594AAC84A4868AFAA32AFBDF86142B350F8F62 E2531321E4CCF34293024EF8AB617BAB11A3A5EDA03CAC5AC431C893607DF8E5 C3DC8646027A7554625A16FD184A70DB5FE6DCEA366B64430A147144CC9839F5 72829FFA42BC3A8406D680E44A0305C9C9E265E91AE82EDF30F73730DCD4ABED B34FBFC98EB355638DE8E4B59780336142021F3C225B2CB53F1FA7131729A6E5 50CE729BF2A4C9C3B14140AB7297EE11B55CFFAB5AB751C16EA9021624D17B2C D1C7C0D83F19DD70EFE9F6AF7EBE3EEE20022D8E9A0D651C7D5057903838F381 1E498FE2F5ACF27DAEB3AFA90500EA8E9CD6DA9C7C1E23CC5FDE70572B05851A A57661B31C3904017C64CC153C83AC68832FFCFD96E9F24C706D78CEEB9B299A 184C42E671B8A08D78E2102EE721E638A4090A9577E0B7CF885759E201AE2AA5 3ACBC21EFA0AB4E8419E9ECC1DF3AC04759966F0843D31FFBED93C96F633A816 EB3A06D2F39B9B7DF93514C6ABCE84434DCFCCF4D3AD6582129866CDE7F8FF4B B99C04ECE606902DCF66138A9C48C6171AE3DA87E0D0831E2F51B883C12B76D8 043F3276F84C36BCCB218261B99853EF36383FB66F986B903D55610DF4736A73 7362444530747AF205CA45A07AC76E92EBE6FED92E186D9A9A3BAD8379182515 0E0575ABC93C5EF0FDD2396F09B739E02F9A481148DBCFAB64DEF6F96F11FE4F 0160458A670040F991635391CB3FDCF3BF7FEF15EB5287187627ED1E1C7E2261 4ECCDFD25EF0779704407CC7E468EDE8186AC1A58C13BB5B6CAA9A6481B144A7 7FF09A6645597C43179925F34961516E4D67BC741C6407582EC5617EDCBB7084 BA0C93442A72CFD32F266E7728C1E93D0F6BECC05F344FD5DA1B3DD76CB2841F 6A08155383243DDC5AB8033D4389074D4C9A8275DDE98AD027C4354FFD57237C 64480F0E63E7F26D3BBE8F56A6F11B8FE2496C6FBB169FDB6C7AEC1DDD689C30 CDD980E920F9049CB1B7498F8C990EB16C8C9B34B2921E4DF98EDFDF63ED1739 14121FC4ADCC10C37631934893BDEB9F1CA429130F1FF59F7D98D5E80420DCC7 1477AAAE1415163189FC6CD69FE6950CB8EB99F0F062BF15D3C0586C1ACF841D A09AB3F8D24EA3E1E0B0B843F3348CE53FA7EF471E75D0998FFE2DF8BF8B70F0 861E5C9DB7773A799EE24070BEF81C243C622783C66CC49BBCBF5C9C91B7EC4F 7115A6E16852B8316FEB4F8C9DC76830B24C4EDB11C45D4FD7BC930C72D82A4C FCF2420B8D6EA4DDDBA7EAA4F00B6B19046C7A0BEDBEF590EEA1395C514E3EA6 8BDBFE49A427A5A18E6829E18BEB5D1112222E0A27D08209AFCEAE0DD036FC6A ECE38EB9B0F0785B2024A9244A1902EC964C3646ABA2405171AA908B98F1A43B F85077FC40603C25299E91AE09154650718BC718E32E4676A99A2BD4F3C4EBA9 78B9E0C0FCED7B7A5CD4A3E44E0C5C6DC233A14866C9BE9EDC3CB0AE016BFDA4 15159320533C09F68F7DEF933A4E5F0220597754BC9D00EF3E58B7F5F52A40D5 1BFC1EBBBF9F68EDE0370942293014A29D3FEABD707054F9E7B11F43E17E7A43 F2451000F596F49C9A6EC74B2AC088549888766A42E63AD55C5C5942FD0B8AF4 F0061E3D8C65F392944C94A45DD5E4B4B8AD379A1460E4914936E3D8450D3FD5 DB40B71118AAE7AB6AE6EB6E3EED1521CC110C31E18CD273D391EB39D894DCF7 ED08AA93395996A243F287956A1CA6DD59BB0988BCCA7BA0D8CB4A6871F8BEA9 6DA2252A0DAFBBEEAD4FE023E8A8787C57DEB4866993512EDE27D21226734242 5FEA613DB21F541DB6ECB3EED2DF4445441FD6DC03DBDAE5F98B3CBCBCC6BDCA 1418A67A91DD93E915EA629D6542EDEE50E1FE273190D45BC2F5E3FF6D5E118B B5D21ABEE398BA5132480F93B65D8DADBF2D118CFA3583810E3FD8647383358E D761165406ED30F0CBD12B1CA7F9E7DEF40DF06E6BBD6708C6189C5DEA4F9043 6B1A7B23682D680FC32C94F2EC576C81EB203ED038D3F247DEC3A97EFC08D7D0 38D0D839F8E3CDDA731BAA4467C2FDCBB24C5882C4F9B2A8CCA198F525E43EBE 73D1CC9F5DFA813718B6E1297CF35743528628B4D7A72E5B94E79FD9DDEC4A6E 3827932F70994619F5AC28D7638F932633B080E36EABAE4C274D7F51902B4C50 8327B1BF4EC67CCF252B006841B4499F4A5631929738730F30470F24553E3DF1 959567EC9A280B625728C48558491DB6FD827471A0AAC5DBC6478934E2222FF8 0693588EDB100CC042FF1FD88BD64580794A1A91921DBDC6CB3FE79AD116F7B9 1CB2B3E36A29C121B0EE2ED581B5A11022857726664262D6D1AEF07C486AEDD4 6327B3C606A6B88C151720ABF27C35B421F68044F9BFD22609AB63DB2A41C074 18DAF0651D69B68F4B3E176E66A19E484F549F6A3A2F6EB6C7985EE458851936 5929AD8692329D5E35AA2A06CBFEB33B25E565A6B9B68D9176C59332ED0ED81F 545ADE03E69C08B8CECD6666261199E07D48858EF0EA8C02799267CA1B5F7FAF 78EB42A4D601BDD91BBFB04036DDB50703DE9DBC2885039FAB3EFC67D56F97E0 CA2D3B55BF462026C88FA04EBB7ADD9C5D61D074F2ACEE14A3215BB239C3FAF4 28F5AC9B837E908C89123DCB963AE6AB3A7EC703AAA25277D25A18C2B8E07378 2CD073AB0B11E4D261B1E3C34A40641123BF4E46EC2C30F48C9E3981BC5349FC 46FB1CE16ACA62559C203D9CB5466CD5F75D2AB521AE736FEA680EC587E9453D 27C2BEA73864612C5808C1C83C77C6301B20CEAC4BBD621B653967E8B46D2829 4AAC8A1DAA9B2B0235AA4F91F58ADDFA34BFCDA3AE35D95C18E580BAF480F3F8 7CED0B3A9BCB44DE8942A7D81494E1702584342F55768AD4EB67D7CE7C1C2685 A93C688DE7192B7CA06DBF985D2F1C31B42E46B1D1E7096ECEF81898078E45C6 83A2E9848CC328A545CF08299A85B8216152236DCA132E041E7AFCB2D817D03E 7CBBECE5A81CD4EE792964378657C7DD698A7AAE01BE0FD9B5A4F7179A8EA151 16203DF1FAF6DF2A6620054C528F40E964B7DA6087C93F84F7E09B3911F8FF37 57AAD82B044B8763E75121E7352D65D620E0A8BB2F50C079726A9C1EE63D24F1 C71AFFC2FFC859D2803BD25B46B312D9955EC1C4C0C0C3DFF6E35639D1E22C5A 3C77361B5221ECB587DA749495E1E1AFFF119DE035BCB33FD0B14ABD129BC329 80FE56004E98A24BA29DB02C0CC352743C0C0F929776C091ECAA043BB89CED2A 725DDE050D44CECE477E189B9AD078515698C32AC6928E284D64BE4DB28B4AAD 3363951FA7896C7AFED60D570C8B0A800320CEF4CCB83158BCEA86F17B98AB53 C3578CE91FB2FD79D1E45AB046948C2B40C73FF57CF0BA2040145D984B5DC65F 337EA81FC2D73271324EB48037CD5B316149051729FA9F2024E2B4A436AA239B 948477258061B04B22BCF2B54421771A50214FEE695BC149B4FCC9B6E5433324 497BFD270AD166263768F0B761EABFBF1464738D7A9E6798FCAF4E3130B4E853 41D4FE8387FFF295EEC0D23B3BA76706226F49029A46D531B2BD51A55239BC11 7EA7AC42D95F53E75E37C536A38980E63FC453045D7F64E77C2A5B2939F51429 18ACE4AA3C8C610EC52259A5618415A158D79655BA808155D1B528C6A1F887BC BFE2F22561E2C24DF924233E41EB40D5EBBA0150CCE872A51F476B2F71C68731 E04DFF1E6B0749AA2F05A28105B41FEC547EB4192A44FE543F0C97059AC34F7C D21F722918E1FE0C2B42332B99C81A50A069932DA22FF1249505B14CA1C0CD1F 92077F301827CAC020ED26F656350FE64A76938E8C6F49506271931F3EEDD296 7D4C0D222FFC781A842ABE28024EF4D325A2E531CB044CD4A64C4F5A3944FC4B 9BB93E0153F1089DB41BF54E0FC47147581EA7C0E4F67B213DB4F8457A5159D2 8E7DAF88950127FCDFEED04721407720FE520494801CA37988239702BE447BEF C6317A9A931D795DF6827840B31A6DFCD2DAAA076F1CC97159424BDA036CD6D3 869002AF02EF8264D3E737B058769BE8C0A949CB10925D34E1601C4967AFDA77 3CB0E992554C53BF6202102640959154C9438EC35C1B9C3F2E57227A683DBF74 AB4813B83711D1C72B4A67226269AEF625F22E4FFB45F5DC2903F7121C723D0C 27729AA34A9CC1736A83E886C2A280CFAE2FBBADC682C24A2EA0624FE43053A3 064C45A584C2C698985A2DC9FC41B8EBC05164C71D33F30E79D4475B3DA28A0D 73A68D45559EA33CD10FB9B51E0EDF91050F8B6D3D0E0C0BD4D8B55FFB8030F0 88280FDE04E7E351B938B5B9C460A790E8A818770DF13C76279EAF3A6D2CC66E 612AC46770033591C9C33AA280459FC0029639698DC30BB4CB52EAC70140B34A EC2D7BBE1834458DE340AFD483E3A3D08A4113477F911084BB1B1FC536EC4CAD 28D970AC3F0C81D3513106FF592AB6EFF980C6A5E5A5767B57B0B819EAD0984B 5C3C9526AB9C648B240F77C525C3AFAD7C5590DA2FF91DED9E8006FFAA426E44 D9FB839B1F242D1FFB765956050B8BF2F8CB664677D35E55F308B01139657556 F87F6A093AB283F8708F1CC417A0F411D202D1FAD4EE07BC99F2864759AB9B68 8229A2E02672593692FD744D76619E0493BFDD283452B079F849D73F33085653 E60293B16AC291E57D15508349D7A3786BFBCB95E924CE561E3F1E2A9485245F 5B61EE8A8603CFB7DB945BF0188BC61F0A271750683F1E11A83D1CC9B7C91DD4 834A4F88A295E93BA80FEA9F348FC7F9FA23B7AB58A1A3B86C4C6FCE5EC61476 24F499C43704BF9C616E762CDC679BBEAEE52FBE7B7107AE4DFE294B45E04E31 61C1B927377D082EF3AC0BFD25C0B3DAD9F01B67299CA7A1AF46D42F1E6A500C 998C54BF4040B5CD361A432E72E1E76F17A159FAEDBB293F95E0C5B5D95ED3FB 8A20FC9D1B455D272E8D7E677B751D4672E2EB68F02C8DA6768A97A896D8B04D 9621EB1E2A7728291EBEE2F069131A8FCDD450DC4E9AB01B5811822BE9453821 A906F03A82CE92B076E528C7997FDB021692363E114C1AB07B92F311639E120C 6028891D7A1D8ADC042DA065EAEB9172D9528F2F894CB046A91BD6E1B9B4FBDA 4CE2166F90EAF151236B28715BCD98F3356351AFA1FE8A97C32A4DEA948B1563 3CEA1F954A697955E35222EC07469ED9E94E62FBFF3C0A39EF2F32CCC83FF249 B4240023606F628AC49106C0E408A0CD187D8BD515CFFCA73313DC1A59BA642D 53435F9818C88665F9288B35C1391567BDF6A8A84763009A25831EB822F894D0 9D480FB166B8A9F53BC592509CDF860E6AEF1756E073D4267D7C8966B5DADA5D 9A6F48813E2B8E0F59ECA7B0035E63C116817E7D2513CA106773A677F05FC3CB 0638865E7DB7AF46F46ABE5FB77BA8B45DBBD680332634133FD33940E53C7C63 814785763E095CDB0278414545B0958C282B877CF176C091C852CBBB525DA317 CD15E0CC42388DF66A5988A8EFC2360BA7744AA11FFDFB5C845D2082AE46A273 A74C4E361028DA96F2241A7086E3D1E4589B0974625564F8B32361B69722F235 20FBC8A236C1DDDCC105BE4E0FF3D1A246BB808802DBA3D2EA761095A4E3E7C7 D0DBAF90114B0AB9233863431406A2BBFAC55AA8E4B536BE61EA4B1ECDED5D99 2FC260A033E0C1A23EE63D1242B0DDD50A5AD731864ACD42BDAF3E439C01662E 1C1D34B06D8D79759DEB4C709962321C0340C8E107BC6FFAA26ECCD17A5AA0AF 6522C0A873B8766CEB3D53ED2C9438C9EB9DDCAE8B1A2A43EA1547DD52914C29 0B2870661A267B7C1C5117530D52F10D9DD55BF0CA63E76BA559302A3BBEC9C1 362D8304FB77700F731E3A1895F8F915969D5C74C217506FADAEB2C1BB0CAE39 BC50CCACC446E8782FDF21A586D90EC56539F12FBA9637419D2A46332B5F014E DDB0993E456E709D8935D42472E018D0845F02F50493769C128144F00F715B75 96571E817F39573A870FCAB661BF0696F1B32D48573AB023BEC76C6A79A1302D 46B890CD64E37FD9BC750DC45EE931010F62B84616227DEE7D07D9307EFA9C9D 9230697174D6D2172F2E9EB6152DEA3F35616BEF7E6C198E426BD236672F3ED0 F86CA93137DF107ABCACBE08E4F30ED9F6BCC631AA789682E4DC9C1E3660C8F5 B1E0FF42B454354798E38B99210023126379A108290573DDF5A0D49FB6455233 9A85F1757A1382E9F76F831574856D6E4856B163F748D784FEEA4931444484F0 AA8422998DAC2C4C8D6A816C8BCDE472A7F8A78F513183856D1056B27CBC6F1F 9A56A9182D8EE2E1BC535C83CC9110696A9ED44E68AD0D35D726102F959B9CC7 9DFA5735A0B6EDAFB35C0FF5F0D825B52FFE175F9E7034AE6AF50FC57714ACA6 06467AEDF69935A94E2EBFAF0494DDFE7D517FE17BBBCD3C15921F5768F60200 0A9A83179219C61875D624A1D632E1234D304E1CACBDE8E3F71A13A0E1405BBC 68D48DF2C6A71F31BB2CD1DABD437A6FA8DF8788875B092B1C61B758F3922E6C 6DE36C577DBBBA27255DB5736A87D743551DAF6FECA023E42C0A7D6EC1165D4A D9D4BCA53442310C4F7B6E09501224C72D73E936C8CF12DAABF1C73CFF084467 76D6C57746F42B8E6667DB2FD90ED3A23DF8554A6A68F6A4838EFC5915BE8D11 9EA5563DD3424378B835FC88BF715C79D220209D40BCDC1B30A91B06925D5AE8 738945CF05989D89B0CC4EEFD88150AA2FFB8A91129685DE9805A3C54AD3757B 210EC0C4292C5884C1C16884C87A31C5957CE79CF33EEC1FFDF3EFD996DD46EA 62E4860A81C7DD0CAA343DB732B0B68262C6461D3F022BE1F2B6FD5447EAC1E0 BCAC79002C7B8F12B30666559131F2E20734F46C87685CB16B952EE4B3738036 5234E3E84AA5587918FD9105D2021A8F29E8077447B9ADC82FD6072263923577 B4E8BE8B4FB410276CD420A6830FE4CF1095238F7F2797503CC18D50A8899DBC 67EEB644401552C24E1903BD96CF2278C6DA2A73FD696788DA5C09CCE83358B7 F4DEAB9D3C4B1E24DD63534977F746FB836F4C85519633659A276CAA363B7341 EE6457DD095BF03C36DEA9281EF42F0A500C7A29955359FE5A703FAFA9858A9D D9AD96996410D78F8E71D08778B712E9B7583526BA49BA215607CBD9BF744573 A5D379F74731108302E515A3A514F913E5624BB95B5838B75A5868E6B50921DD 7C0F5ECC7A9DACF50368D0D2909856ACE0758BE333094B56A36BB715389594E1 67FBA9D8CF33F1AD576D8C263E80CF7107C160792BC330EEAC6839557DE3C918 D99DE20AC4FD007E1615EE2C9D12D3047CFA03F37B037AED9719015C3AB04FA0 57C2525CAA44B1F0C67FA7291285B42CA1FA6A8F79E5F9CBE412BE4A16134AC2 296F04F723EFF403A5CFC865DBE839C7B0912BBD678E6E402F537D673A3534D0 C8E401F8F01E027F4416407B22D4BD44B87F6CE7699AD7A9F844A20CB61C6E41 AFB5B55476123A3CECE35E3EEDD1CF83806A529F465E918AEF8399B198DF1DB3 7717DE1D5BEFB4A0F2957B7884CA26695E62E30018250E307C8B5305B58E0C5C A2EBCC484959390C138B78DF6F891F49A82B73DB0021055BD384AEE8156C6C08 402E022BB866A5CA7FEC57DC4454ED69B7B831FA82168D658F064E48EA2635B0 438E5385E73E0DE044DF4761776D0263A7CF306F835AE1073565D7274E089D41 513626D4C2C351C76CA5B57CD725C563CCDE4F807C336F896BFBEF725E6F6028 C1490242350DE9D34E5ACC3D3F0BA3D11D870E7DD8E208EF827977B7CE18BDCD 8E9F97A4B1AD76FBEE9E9FAD7B00749697898DF9F23E704DCD4C8F4446B376B1 167488BA4F24BC11B7F947F039A3FC861E623A6F3ED9B60C0DECB1E5D4E76C19 2A9F7D35BF9D3A46DBBCFED4A67883E342585D38C0120AA2C9B7742A301F3E69 8327F21E14ADADC260F7E86E877983A0F11F8C60350FC2BD8B4C3449305A8490 1469F5DE3C48F8F8D08132AA4A2B34181E1E905347A52005D5BCD0439F1F44E7 394DEC7C7952AD06A5AE6E8C764C2D683AA3220C514E6B3272924F420AA8B2C0 6F9FD8BE372ABA50FBF538F1CBAE096458E8C12A46F7D0E8DD082C4D090BC535 34CD2E2CE1ED648EC5AD8AFF7D39EBBA67CB45A14B07FC08ABF213BE188915EA 3D94741EE273AF2FDA8459582FDAB3509438CF6F12D8BF52DA3EA3681279406D C55C2F0E24B0499CABFAAD31367E8F96B1517DDC544E7FB6E276E2CBC268CB73 5CBE033783AAC333B196318F202F9F9434F0B9EC8B7515347E252C803FFDEE78 AF63CA8FC684703C761997D65ECE53F650C3DD10D64547A58681994352670140 D9DEDF44A3D5E682DD9EE943DEDACFE4ABFA984413E8E43910BC5655ECDD8AFF F6E132C93727BBD3F1DCD51810575D56E1BEE22DF4E1F0D8A31E1858A69B9533 CF9194E3152A7C7C0C91FDAD2CF04E0C0CA0A39C79C25DCE0FF4778EEBE6D7E5 12D56E7AC0720B4385F033AE0F96889040CB8F3580A2F016D4A3C719BD5E0C5F D92C536C70E7356044056C3CC2F9286DFFA5515C4A49130EFA2CE14E0B9E29DF 675A366126501E1EDF15ADD9D3E870EE9E7C0EAD32145768949DD02C44851DB0 CC46D6852D0BB7DE3439D3959BAD4608620F1C2580E95F579B791B35AAE40634 DD806A7DB0DA827FBE7FE540C7D7CDDD1E4E6AD60314FF4F2D18B32F8139AF4A 08AB43B40B8B5564986FA468C6C138EAD5921D4DB519DBF682007D0A3B752097 F8672FE90FB9B1645CBA94195CACD25954696CF1992674BECBD66B1618E28CCA 4EF30B5D901F76C28A1EFA236AAD308E735B9FB51823C5307BD4E019088FF051 75447EF270E20223DDA2CB8E4BB3CC50CDDB7A53E6D53AE3D04C967578ADFD1C C3896CCD482D0028124F162C0712DA7272A50B1FE5DB2CCD7C04D7B50FB897BA 8EE25CC72E5E107796D176AF94DF76D2B319D3397D0736FFE08E00CB2FA73F47 9BAAA67C902E0A500E85F4291D31B6ED1BC8203848A960C2862017D82D3E9CA1 C85D8320D993A9A23C445F46474B 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMBX12 %!PS-AdobeFont-1.1: CMBX12 1.0 %%CreationDate: 1991 Aug 20 16:34:54 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMBX12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /fi put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 73 /I put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def /FontBBox{-53 -251 1139 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26 7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF 20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390 B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D 68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809 D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E 26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26 77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299 BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8 30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5 148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23 337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598 0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6 472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26 30F19E1BCE69BC499D860F9B17E6A78469F652E1F327CC0F46597373C632CB29 0024F4D106BFB1238E71B84E6AA5B2484CF0DD8ACB90BE5E4916214130582DC5 BC26EE23C6ED239A49243B7911EA4121E5BEF60E3379B6685F548F185BE9EA5D C95E517502C6DBF8590DF15D0C02C9DA2A1E8B4DF6BC91BCC47A7CC93B3FBFF1 809BDC20FFC64F51465FAB3E491B746843AC44366FACF4E832A46C41BF4E3C24 63BC9F166A8DDBB29AF7A52C88854A80B3535573458670CEF7803A6247CD6E86 0320A444A86CF586F6D0D9FEEC59076C7EEB564A65C499BDF621E829D81545B5 7871595027B3245C7E73DF1FAE485F6E8053CE609FBF21CA1F67AD65778358D3 116E190C5ECFCB0F6C12B6E334427950F89691C97CBAF3E45B0EF1D35E59E41F 0B8420F7662B60AA4437D55F7667FF734273642706F8F124AC653FB1A85BB05E AD9396BB062D7DACD729472FA829B80410B6306BE143D7501B2A82ECBC9910B2 BF2197A0559D9FBCB302BB9A7FA92F9E33065EB7FDA88C45E024B89E96938889 64101D3F14B32344CE28E796259C8444EA474559FE1D7CC161371047DC9A02F2 15D4E22EF7BFB21875A2FB007405F2E41163A18CCDEC0F83731B0D2A27E90EC4 1B67700E549E6402D2EC130310BCACC65E0667ECA59E9B5FF97F74201B4708B3 AB0CC2BDA16DB17F45EEF56735A278329D0F975611120F7B98458DB3FEC596A8 61E8D15F9DE886C9B4793596A775FD5B1C9C2E8BFB80BAF0869B18FC8B76B8EB 08C50F1DB7D20C0C01E6639F880E187F5C2C9963CA2D3CFDAAA577C9EA55064D CD57B30B7B4B0D65B1F3FB2C815D79467947BF7599AD28363F3D01CA0D5C8491 F3C9E7B572418DA515E7D79CC4D170A168BF9CEEBF3C91DC09E5284004D8A700 7A7358068B67665BC6615679AC0D9DE2C6205DD737E484679CF0AA329E91A4E4 4D12F8AE9077B508C273D9907AADCC0E7DBB77ECFB179C36B8AD6DF355970ED6 ABCFCB837272A26723A5540787C1A1742E7F00B9003C36949A3947C92480153B 6DF7383D12EF1AF57B4212304B45AA310D7A30780592D863E634EB8895AF4374 7AE007DA929E4E68B3E3A97FDBF68E07E39BB515955FC9D993174BFA341462F3 A51F26184DD7B283EA2692BBCEEDA35E22C9F7F0B1323460D618CFC9C17AE710 335111130052D16AE697A17DDFD0F55BE9CF9950BB8F31A95BBA405833D2DC59 2930B6AF96CF1CB1923A6FC34B4ABD6DB772C14088AE7A60BA3B3CEDEC8071B5 411570D9BC7ECA75FF43591F41846890EE41335841307BF406DD50E504AEE234 E3D530EE2AD2C0EF065FA3D8229223F0F6F2C3A2E1ED09B0232A8D92B8C5C387 16B7297F4BB11112FBA13C3A9C55B9679A19ED64D2F9CA7BADB9D24FAC3CDBF6 9757CEBF8D70911FA5AB9BFAE47A942E563D7F9A43F947AE6B643E8C4F49E75D 0F8FD611131FD0F689211107FBB40F179C22ECDD558B8F4F134F5DD57C94DE48 B8CB4C58D6C365406B91AE7CDDC550C2B1577393B849C272AECF6111CF751A84 72FAD31D31A3AC1B1C98CC497DCAE961FB2F30C025DCD8ADF6FA18BC78AAC351 8026537AF897C047CF316EE2821062F0BCF44BDBEB5FAF618F8B3EF72070466C 9D3610751B5A8255C2F75AD8C6861B32541C3FB6B9A4DCD25BDF6BFEB666D127 A2C2F29BDEE3A369541F98D24B7E867504E4883C8579C425A12955BB7438E8F8 209171250042AFB489CEE7F076B21A6FFB253839072D6E1C3DEEDEB779D34961 E91C8D3DA67A3971C11E952500A9BBD14DF3322BC71AD3C8FDA35C26F90C2855 342793BE2082B70D12168ED92AB0A51EC911E07C728BCC46070991C0C6053497 3E971CCB72FB3C5691C52D3E3B0E4A3CE5E2ED573DC95879650C4B7CC28BF13E 8E9B3305860DFAE972CD8048704509BD054939E792849CAE61ECE49E1CEA4B53 C6AAC2AD56DF1BE13543F99DBDBC37B582A36542FD7575F1E84D70A8D91F4D42 57497FD3F9D516647D2A806BA762861A0A328D970CD0868882943A4BA22DD438 1BEB1C1C84BB1E09049A360059A8C6C5D8533F56687E03A190F8F77037FB34B0 440ED37D59CEEE25837C0002DF3EA3994562381AC093D61CE5B781BC2F00B22A 2D8C86D59FCC9CCF02E0A78D6729BBCBB20C2D711A3021782803F0A92F805DF4 1C76254B31A064A092734AE6625883CB63DD3ED3BBDD40CF974A48BCCF97B659 A5EB9A6C0092EE19446CDE609FB4DE155BD185830FD1E722F6C2A4A534FA717E AFBA952DDDA6E1AC8D2EE8341F1C765A9B4EFE453100E4D5208D5AD9209FC235 79FB39D9E1EBD0956ABC0052415D1E67B7DCBAF1D1261C8C2D37BDAB8636AB1D D49B4D724E5218C257710BDBF8166EFD37B0272B5C88ADFD929E3AB9ADC27F60 7ABD687640D4C537ABC661337073314CA74AA1883BF76F74FE45E91DC2E48293 3A1664C53D7C18789F7DDF3BEA23B723CAD1BF099E821984BC6ADE389269A562 0F77EA3F3BC9D96B1E5A51147869E7D654928BAEC0F88A29779E7682B12FFAE1 8CA9B7CA91E9D9D2691AC6B10CD23A7F342A0029BD9874DE936A3D170196D374 3C116FA8DD0D2A4D85129F31B32F11D99A76EE9575D0EB6FC62A43BA92466BEA 6C165C8577ACB28E004DCC5E89A1A7F9EACD5D96A79A0A377502A4B886913150 0B5FC0E00BAE650487F01F3853A51AB66EA3074CDCEFCBD7C9FDAAF1773C8B9D B3B8F2923DE31378D422A5749999E97EF27D79377159BE44168D0767B3F716AC 22382CD2DA85FC84A005C43A618E90AAD10F0C57660584ADFAFA2538BD41882C 5221E69F5A401E9DC5A817F7121E7B467A2D3B4A7A3A8D1BFB34A8A9AED9B979 B5A8F5794423468B868F84E3E7B20CE49103F5CF88E225384CFE6A4ADDD6CB0A 8D60814DF2CC67BCF1FFFCC30AF472E9F4DDD6E7AE19ADE07304E3448D8A54E2 346265CAE55A7EFA12876E6F64E6A0F51D32F0960142FEBBF2E003CFD6CC1B4C 32C125A817A48C1F26C12D876F642EAC0D9940015E5DC72302B43FBCFAB3E678 1022F70CFB037F4C4B98A828EFEA1885EA3A0DCE812E0DDEE41AC93ABB01ACFA 8CAF85D4D2DF0389235BDAC47AF515DF993EE441252D61C9A0FC5DE26E589253 8C55DFDA74F11BC7C1B11DF1B4F3C825C0E378494716A13B321314E9267BA4ED BFB3CCFD57783428DD4D72C87672246C8BB45D9FF7962C38CB86AFDC48401545 4D8AD46DAFF32B7B3A5B93CF387B366D0E9D1B60EEE32B00E61B27A62C0A972F 2CA628D7C3EFF0769719284AFE311750474F2B272EF9B5E5C2723C833FCFEDEF C6D679807A7EE6F43DB9CAF47EA0E182DCBEA6376C7031C23714E883BB5A7689 961F14FD2F9E7DC3952ABD9D6E9F2B44DD1277929CD7A2FE827E9F0FEFDB6FA3 ACAD73849D25E091818AB1C1D6E5668155270D4CF630081789B1EC6D33D3CB69 15F058CE413EB6E0A35AB295C686D5685A2520110FF79C4D145E6ED33D4EFA7A A18F019AB49B982FF82587CB93ACE1C88AD976203045D5CB701450732B9D3A45 67C418D9BD2608063C84C66095BE01E2DCF7B3523B21986B6855C54328E6F6C4 2E547D0A74AB4A960E4036E3D3E9E9A8ED7014639D0A7F82D0517463D46EB36C 4D940FB11C715E257AC6FB22658371EF90219BEBD909ECC966A3F368374934B2 6684F7A3971E0929551A2984C49E1D012A3147879FF6A081B22D5E3E36582333 6AE3D78C963E656D7B9C674C2742C5BF5BB0F46C58154F5A464C4525C9181C91 DA5277EAB061DB9052000ADEFE5C9E9B5CA3E467E8AC0F39460E80F50E630ECD BA3F5D8C44C3EF68CF4951901803C3666B573056EF1C5A43AD12AD1B0A7BB683 C93A6287B2C8BAE2D608D5CC5DE0EEDFE73E552A2B871865D67FAD542BE63C37 B0C5F0E49411953743983D206C92624328E280A2101BD33BE4A67F8D83A41E2C 56B269368D4A9E0275581F4FC679BB7775A81DABD1AD02381732CCE841579686 66B53B336CC012D30DC391570DAF8D2CF8A9EA75F15DD064225C81E012885BEB 8B6C3724772926C3B00485F0393465D7D1DF52A82518AD5211199346A9858777 EB592C491C9AE82C6D59EC4C6D705F485FE31C3087DB096CDAF2C1AE2A8C2BF1 A93079B9839FB4675F4E3EE9270DF9BC64B08F706E3C7D66D8891E383F3BD03A 2FC6DE6E2A391D382A04973D3506FF60D111A6655D8E0C0B1B41FF8C48E3DFB2 B11D9E1FC4FD85646596F5675948E4220F5A23C3F0BB086253C4DC9446C203FF 6F4DABDBCB579BFE7F76478CF6FCA7CAE5FE4E15A00D3FFC2F7600BA18967CF6 5ECD0CC6AA66E11E3EB126F53ED2F94814B9627DCC2E3CCBF1DB37FC8D85D39A 99983E28295F50CC7BE745E4B1CC32A7F417F3713AE872CF8BDDF57390BA22ED A1FB91754CA13BEF7A8B21D3913F9803E5458005E5B1E6B1C9BEF03A754BFBA6 0FE2BAE5937158570DDFE41C92F2E51289780478D56999745570488D26A44F44 32FCAE4DB7A15299B58CFB5FBCFBFCB985C3AFA79E38B336DF86F344FFAED103 FAC04B41559F78F6D7A789D4617D1B4472ABC3B3BFD103EDEA45597ED9DB4200 9DF98F7DF8371B680F2293E042AAA19E4BD026D46F73D01B0CB577896DE40E86 F0D2BE9E661CA63AA6CD11CFEB4626276AD6CD2EFA34C3522CD189A964D94127 9FF962502AB89860254D2CA411917E866AF3BA3FA988FE1CBFFDBBBE52F8A85A 1AB41905C78F3422ECA36B90578D007246B9D768EFC9834CE24547D7FFAECCBA 8378C0DAF891E8CDF9C3B1A2903E6F0EB67117EC26FFECC993C4E62290C6F48B C94F141916A9B170CE9397F4A352FA64D46A61F898AE2E73E3972DA46E6426D4 CF8ECF3D9778DACF490C6756EB9E59ACAD70328AA35C5BE3351D555A42131703 245CE85E20E88929F1A935E4A30704A0E1C254672196A2951BAE98CCA558C40F 8DA67FACBA06A93C74BA5BF7262DC974B9F3E27A8F411FD8F257E78E505AF920 4C46B3B7D9A517B1E633FC9126B0F6BFA03EADE635FA07BD0B6590000AF1CAB8 70824FC6598DFD5915585968509D96A1A9A39FED7C84E7CCE9C41D19A1C371D7 1953D20D2B3682D9C2FB8C9208181A01626EE6641BDB9201AA3A56E76411ACB6 286437167244E6A99EDCC491F53841925820ECC7F3D3506BA9A7360E4318C03D FED2C064E63D75E47B8E6AF6391B86398963486B9712A01C4845D37A84BF22E1 EAE6C7F84F59077DA2CCC40DA79D6D01072A7A2975DE760C154F5E5403C260FE ED17CF6418AB6B66C57D901E4A9C9C09CA45627ED0851133DAB976AF8608A0A6 6D7B374D121F47DDFC266B94133AD92091E2A0C96FF0C5C386AD45BB674D8DCA 4EABE10649591E20D694F0E72213572E30EAEB4C748DB6DFA157DD6543D6F932 770A1C0025BB2BCEEC08FFA67E95F6C47901B9C904D9D1C3660975FE2847FD94 FE88488B3AF6CD384592F2892AAF03EFFCDA805618B2F375F6E1240AD955B85C 84CF71D1F76AD93E2384F44811E07297171BFDADB30CDD36BF52C0005CA67004 E0E6719FF62AEA40657633055A3C445E49FF1363F338E998303FF3D140503A17 46E4BFB0C00A59DEAC17936452D59069744E3D5ACF4C99182A02962276EDB615 991991B9B6BC62300B875BAEAA0DD0C9A942CB90293BD2B223C196C6CD369731 36FCC7B0CE0C4A1293D2DDF1B34E8CA6039DE8A78E1E20CE5402EC195E6EC1D5 C8F7CD4EADF185D4C587BFD36045A3278B52F3194799BCE6D65C226DA101F11D 97931352D9DC8A222A9B360EC733711619A43AED8A9AC154148322710837811E DB837F2BABD996A57564796A6B5DF42E8402FCD00421C991864112FC6D803442 C1E242B8C8EB288B1A57B1DB72A444C592C10A9A8729E66E518797CEA0C6C9FE DB09C8ACA4C35C655F140B8D987207ECFA54E1E33EB1E90D379D434C1B764E10 2E187415A4E4FF5656010436E9F69E09E485DFC5C6DA9285D9976AD07C265B96 BA0F9E7CB012D8BA10280AAFC48BE60E0BF81E5A71B6CEE429C85F574166214E 7886B9951C97429B34B472B5361039C73BCC4099898F1C4F5FB15AA41B630865 235DAD4EF1B3944730538EE59E042C5F7FF17C4546DD12E917A1C57BA7796C62 45032513D7E50820D1C4BE8CCE32696C75C8B3D13C349E5DA075AE0A9BAC5B1A 126F3B7C9313437DC4A72E1CF3E39C856739BC8ABFD717AA7C27A145998B0482 62B97109DBD2D0504DC5690D169D36DA0E74C8BA15FB2588A51CF1D5A84E7CF1 29F459AD875CFA87863F27A185CFE097A321A4AA4997994F07648FFACFFBB934 DA00E7E5EE56D09D1994A3B9866A5EBC90A6135A15A66626F341EA6B09FAD5B5 CF79643B077BC0F3B0259C9D6E7859FAC789AD85607F4DF4DCCD565CC94E5F73 C2CD9A7BACBF4D5D87AC6E1BA746E097E121567A5C8B4D8B313C136904F17FF4 1E9DE336BD330DBD6D8138E18D942E4A329CB6A31ADC27744F4A95CC53750AC3 8BE50D6EEFD04A6B867C6B1155A7BC175527C7B807E7E1AF5B3CDFC6D47BD237 810BAA203AE0F27E6FD6203DEC07F0385F292BDAE64C1C5A2992623871CE8767 898A374A59329628F66B7F67D730C0F53F2366650EEBD027B6B82ED9224A196D 238795A608A5F2120333DE126A5DEEC40D109F548A3C1142820284C1F98BA67F AC790368741D67160E07B505DF02E86E51A69CE8A05D41C63F048B03B0260723 1151846EA27E277121813F21BD51DA80BDEF73E815B803E14234CDC0761F97A4 A5088339EF941D1B57C407CBFAA76F75BD4110BC939B6191D5DD5664DB86054D A20AA61C15F41CBA5D0F4F7A3E869E7D57F62DBA89BE5355582AC458B5A8F5D8 A61D81225FDB77DA57FB3400C3A8FCCDC3F201E82DBBBD91ED234064482B9087 5868C90B1C7E16516B35D47394F1D6CB2D9A21959D89C8B89927B710BA9B9A88 638037365D1BB10126B7A3B589D08E0E3D2C1CB3D9048EABF0A7BF5FC3156736 EBBAD931E53EA71640CB395CD94A13DD3098912BBD0AAD19FB8B33FEBB9BFF22 9A2C0439A6AE9A804AC26AA3EB60491E1FC40BAFC74B2A3DE75816805381D21A 898AB9A79E0AFD479245D278031DC05CE993D268263E0C101D0BA1B53D811964 FFB70FDB4D034F0ECA574F17BBDCA0B94F4F94E53A74AB67F5FBFF36CAD7B4C9 A5AADADD13F92BB4E9804985304C9F219DDF73E9B91F7D25C02B77B7CD2DD5DD 9854975A971463785C794DAA2E5DC295A60D177190ACB1D58C972FA5006634ED 899C16B8E42D9312FF07BFE85A459A078C264A4FA9EB6EEA76D03C128F2F07C9 FB31059049032BCB476AA0D307C22DE0BE53B00FBC8CC627F501606154C317E1 352791A209C3C900FD01496E863D40019283DCF8CAB0CD011ACEEABAA237E928 500DA8CAAC7B74DA618DB3C9BF356194C65C44C8BDE30294CDA4D302CBAFCAC6 8FF5388C97A644574B753D864BDE56783FD05A4375C768A11F38ECCA97F127A0 C8897016D15B74C129E53C54AA6B08A34A06B39E7048F1DC63723A6151A050DF EAF4D7BB928785065F6487A492A2A41AD6B90B090F4825CFA599733A90688C8C 29E45BFEE838009A246839A996042D4E8C145B2936CC5D636FA40EE8F5FDFC98 C4018BDC34F30EA0544D34C2F88394434F5E54A5551E23B363A31DA404EF2342 6D4C2D5DFEAC955BAF7C8C748CFB031634CE313C99F592618B0C33386C0B2785 B6EBBC55568C85BED140107DBE989CE256245A7BD2D7C832321B8CD41C24EDA9 2739984324F4E2DFE311ED5286C4767F51719A12CBBFC8A75DEA88C7516B3070 D2FEE70B101900EE03886BEF456F2CD772BE4C420C4BC907E3C2C821BDA51E04 8E5A08E07B66F8B8023DA11D4DAD7BF49AACFACE007BDFC877B7B6EE82BDB6D4 90BC66BA0B5A49B0EB2D2942CE0805E6737D017E197E8A206EDA14B768542D60 CFC97F488982CB371C9076C90A92FF44DFCA19EE9F2BBB65629D7863702CC515 8346D7DEBBF9A5B2EFEE725491CD2D7002B6CA4098FF80EE50ACF7F20078E0CF F83BF948D80F56CDC4F317D64014758ACA8F330E828139BDB79F00AF8063E9F5 EB21F94AA59F6DF48ACFD3CF553CDE1A11205027EC768ECE036969137AE88267 E75146AF0698BBF89DD38D100505FFBD0BC081B8E0840DEEAF180E97D98FE3DE 3D88A3181DFD6D5DF9755F4949BC25EB6E563EBC6679286DD271DBF36786B210 022B8EEC9CE536AC90EB13AE38224F0056B9CE8E5039A69A0769774C9005C91B 9F02D1A29FA43CEC2108B635F97DFEED6EF6184C328E66843C2CD9072B7DB758 B73994AD63B31AF3F57FA695741626F5E33C48E1B80C7835A6EFD2E3CB8F4385 ACB095C1FA269A952F78C65230EBF4C91524E62B771BE8D12DD5A9E10A010868 5F6AAA6459FCA8AD92992577D1F88BB841C83CDFAD021A7D79AF13B9E3224691 C4F2E2E92C13D5508322F28951DC8901878736FC88D65E8EADB9791080B73053 E8C354001CA0DB52623B7D865730A6596A243F1E6C8597E1A72D6DD2A12248C5 E374A96E98EA668A75B2C0675B2F2A000B821E335F37777413C8C29B1AE9B2CC 2A9AC4395F29F92B7431811D60B24971752EBDAF2A6907EFC4F28D544B50BFED 7104A069794688E9D5AD1C0AABA6E5AA1C67CD26F1EBDC4164D3ADB2E8C66EBB 50D645327DEE224CB061798E0EA3181A9D89A380DDAFD6F4F901E3400F2AC75F BDE4347C393B967616302F798CF37200C294341D3E633AA1C2C437F9D3CD2EFE 1FD4DEA167E309364403BB9F1D72FA63BB595DE76EB5AC29AE5E5FC459979C47 6B96E7A9DB28E3C32C798ABAD7410B75BF61EEC2FEBBCF7D01D2C2BBC395AD45 407C824F947569DC2371D305818CD5C34FB884891742B07A879A1773A150BEBC 1A3431154BC34506A90957B1B6ACA824E9FA0E88DBA3E42759A5CEED8B2843E9 F689AC063FC5609377E8EDBE81C9501C308F7B7A5F065895B853BB9F39C81C5B B3AA9B4F70ADB5E1703A7DE4C1F1FC65A1314DA9A7DCDEB0652C35DB089906EA 51075E49C5FF81D80C33FD6E6AEE1A9F17D100057426710A8DE371997099011D 02A2FC3785DE6F25DF419375B205B6EA707B34A2144DC4DEBACB4A59B1554F53 200B35F2AFA5B15A77980251304771B4CDDD410BFBB6D910F64541A36445F023 14D9B3CC7A644E9BA7EFBB6CDDBFFC54A0E5ABE541428DDCB8C37C4A9F0F8440 BBD19D5903F39F1A12A982EF4B10A754C50A3FD40F32F401DC2D3D0DAB8E905A 721BB4C585AADB7CE0D3479FC46EBAD64AF39A4F742BB66038F5E2B842FD740B D21AE0727C49247906D15A19137A7BBE692705402E17BF580DF20FE47C4645F0 371B54E9AF9F6B3567D983AD567392E32B9ED72BDD9C5D93220DE8760C00D30E EF2EC3039E7DA2D8788A0421DD7A410036C4F6F423B8BA0C6BEC75D9C548F80A 03FC7E803C68018CF29371F7B6346D062C26472FEF6219765064387C6AE11FEA FEEBAEB95341CB1A2E88AEFD37157055F5AECEA6666EC0D7A6CFA01BBD7977DE E9F998A8C145A9D5F0D20E33731F14F24966242DD5AB416CCDF7F75F79346797 96FCF180F935D0890A214BE4B5BEEF60E2DF8B62AD377215FCEB533FB0F24117 53067E32A3FFD980F56E121A39158CFB2039E563AB079F504DEE72CF57A26501 ED56497124854E9D2E705D4C5E14206132896EDD45278D1E5B7724886FEABB5C 1F249837AD046B9923DC501369106A7F7087E1BCD9186DB2A31ECA2EFED49667 CF2EB1C6E660E9CCB376C289F2D029FEF1FBDE27BF7161F9DF8A6C8BA71F9C5B E508862C2123833965DE3BE304A022A2AF9800D2E416DB3147ABDC2338CDFA8C 0B64850E45FA0A6A4EDD4D6F0BE6AE09AD94968D973291DB5C0AF2E9B2F8A942 B88ACC7C2A0F26B2B8035399269BDE5185AB0CF3723C393D7313BF98D6201B83 4C5A7CBC9CAF95C941ABAF0A1FBA82C627BF918A45186B50C8E33502747AE87D 8E115418044496655F1ADAE3FB5CBA8EB3C1EEA588E88CF1DE7074ED0A743198 10277776F54719FC4DB0035A41F90C03234072E825024153ACB14ADE6ABDE58B 26FF464831A5012C5433382A2D87E3425654FA054F075269D61E0169B166BB5A 39E1E4A4D1B5EA78C51F5002DA43A25BD7460198CE2C8A9B171AD3FBCB77B62F 72A7EF3C4FEECBFA6E963DB32498A32AEDE3DA59A0995AB3199603B0DB56F53B F06E62C6FC9A0FC001E763731F4D7FB812D4F5D9AC15DB28F3B284EB82857E17 6F02292812BC62C0EB37921757F978B3D5E49CA6A3AF86974B3956B21E11FC22 2734E0CEEF380CF48FDA1B87B9DAE4940E638E10B92290D69F989BC7E18D15FA 55E3B9B5AEDC5E6256ECCC377C04613C444986368621E39F456EE42CB67E1C02 A0A0B2A4D9E275D0EB84EF45B21171ECB803F2357C6BB54454B8C22F1C1B6E23 BD4E7FA3B89F9DC488BF3126A8E938C10D2A46EAD234C0E2AF5013A79A310068 6DF7E6335DC5F4A3BDD4360A490A2E37D162CA24F1801B23A7AB1FD478A41B8B 197A9D9C37522B14594EC437777A52EC3230FA6B515606719BD71C030BA87CD4 43BDA83E188CE2E4DD33B228A6CF76BBE7C472797264908BA70E7F8A2ECFA682 0B9FC5889309320837F49E4E1532CBB70F326FF35D147F0A781FC440630C7675 6090CF046F54F83490093D8B99C4F68C8249E250D0296A87A2D9688915E4A0E1 1A758BF4F2182E3B6D9F7E968940068396AA0BC67D492A869B9A301A151EF31A 108016570556DC954E9C8B7650F866F1375DCED3F1214BAB0031E74CEF25A4A6 DDA6A25CCE6C1B18D2C7DEDD16D4449D08B6306EACB23B7ECD2ACA9F7DE4CB9A 7B7B7B3EF3DC92B42E01864A5E25DE16849F9383B7EB69D3E29A08E8D94820EE 39A19392ABE953D743956DADE1A1F1F58F66ABE343E9FD8D85DDE3CE849F6AED 2ACEEE2A278AC492AD2928F6AA64E45923D5F0C1C04978F8A76B8D263920DA2F 01106744CF443FDFFDD00D520AA9DC9A6113CF5B3D99A30A602832108E23F22B D10C52BA60FB34AC6E54BE9FA591E4D46686BD6DFFC630368DC00FCF533AB4AF AB0706958E7DBFF87CF8C21BA4231DD2056EED4300A762779828DC2D18D15113 5AD6E0CA506206DF8316EC1DFD5BCE1CD35833D02FD83722074E9C220A144E63 29D438B75ACD6FCE9A52AD902CAEDCDD8490D1E9E11AB57D7F7B0617135F493E 8FBF3DE08B27450A0231A2B4EFA067DD72C4680875C5E9376428AD90E80AEA58 2EBC581635648D751FF1D0094B23002159D9212AFAC7083D34364DBC741CC2A0 928E9DDF9A590E31CF6E09FFBC9BD0820137CFC79291284D226E43E12B857967 4C5948792DB043D7F6A8E5EB10B56A6B973DE769A1B58A96A355EBFA71595251 E60E01AAD39F27B6153E35D271260EFE32D0DBE948D84EB512989A6FC3B1D578 C833C1FFE66C4759B1E8AF8D4F7E74A30D05B181EAE02EDE1BE0D71CC5F69C0F 8C6952DF32A24014F8129E69CF0A9317568E25A769DA6CE5C68D2BB48D073D5B 40CC0558E2D5DCC969010A6053BED8A18BFBE9F664D6CAA9C09622CFC8371337 406F0FF9D4E17FE90FA5D327026A34B19D5BF776E13D908CC624D32F5FBB0519 37F68E2EC0C87A5B5D24A2FD844DDC14B7203DB5BB234415B51BDD35559795F2 C0124DD829BCCA9DBF9F9EEF190C2DEE5151E937F45AFA010D129E52FDE3C371 5EAD62639EEB965C33E53188B50E577BCB05D004987B1A0E1344F3622348E601 8E3602BBBC56F37FE0DCEBE9C62CDF0D55458369001C964FB95BC3A62D0DE963 0B6CDEC9FE91755D4418921954055C583BC3E35EA5037B7309315BDDD4980231 B1EBF3D86192C04C12A040F2485D980E09B03C891F6DC6EB07092C16EA368ED4 F50DCC9484433ACB8EEF9E4351A27A5110013584E49736F06DDDEC1A10561935 62EBAC8549D9C373F5AD07A3918BEF592F004E28CBDCEFDED4EB29B7BADC6B61 3873EFF272E4B79739C8E3D6D38F81C1029ABE873D06E84F34D9E00EF37B8CFA B9CB4FB6AF677693D1827F5F648C4B6B01AD5B83AB72B892061A60C1420A4E72 CA2EB47C536ABE5128646176DF020D7921E917FCBF9653917BAAF86B9699DFEF EAF5E8074DA57EEDFA61921865561AC076DD5CBF54A837783AF8060CD467D52C 6430AC70779344D8A907EF7775AE48B9BE1232AEE8413B44F53E4D57557C2BAE 2798F6D572D3F64D9837AA96A158C0345DF34A9F93BE85C30177FB53A3DF5F21 2343CAA035F68B3694FF1CD5AEBE762565636DE04B3C9ABFC80CCE2CDB80CEDE 0988297E49C01D87CEE1BCF4ADEA70F6EF2894EAD3339B3E41C7A6CE7B6AA19E DEEF35CC41589ADC1EBF1EC7DD04E87CBA75740F15678A7C53D06184185CB565 5CCFEE50F8C4A3ED1D019CEB3A5311967586D5FA9F2F80F5004C248ED62D3B8E 19FE52CE1F4D52AB745521178BBC0CBBDA84FA98D5C9039317026AD0F8971761 0C60CCE2D9B72A634EE5E289F2416885226BCED529CDF49432074FA5174DC0E9 85AB08DC0B62A2E7551EBC94AA36D5FE49 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMSY10 %!PS-AdobeFont-1.1: CMSY10 1.0 %%CreationDate: 1991 Aug 15 07:20:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /CMSY10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /minus put dup 2 /multiply put dup 15 /bullet put dup 20 /lessequal put dup 21 /greaterequal put dup 32 /arrowleft put dup 33 /arrowright put dup 34 /arrowup put dup 35 /arrowdown put dup 36 /arrowboth put dup 44 /arrowdblboth put dup 49 /infinity put dup 54 /negationslash put dup 98 /floorleft put dup 99 /floorright put dup 106 /bar put readonly def /FontBBox{-29 -960 1116 775}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A 27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF 5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A 71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C 515DB70A8D4F6146FE068DC1E5DE8BC57034F1AE2F72595C880BDB91834D0693 0D47BC5206ABD7D3F1356A3CC6CD1111D406758376791CC6BB4424CC2F1003E3 798A105E7A8B7FC00CC024FAD06AA30FA0D8310A1CCC7D10C69D61C2379B0380 35362C37890AD169B538D28DCFEDBD125FC33649C44D4A3D3C3FFB673074E705 F7FA84145966DBD1A5304003D0B5E90B74635AD833B4E509833DB5D87870E095 373A7C6FFA4A18504953954C5BB0D7E0F3668AC9B51D88DE8E48524C328401D7 6E1BC6A2671C8C4048ABAC0D33104D3476C6FD530370A6DDB0D568D350E4766E E74B9ED2B07EF6E30E5F0A868307BD7053FA908D9CE9D1719A1FD20EC5D4BBF3 8DF20412EBC84C83AA2D2DF7934A5111BD91FDDE0DBA2FEED3BF2067E698C3DF EEBA25295B90BF595044A638740052A88B4AE435069F773C33854D30FE6746C7 EF2BF1681719D00E0AC0BF6B752CCCF5FB6E7C7A2B311552598F192FFE5D0647 0E10E651FB51537F4879CC340FD0AAED079E119D99BC2366E52ABD5823A5D832 3E5FDC5E4B9688134995931AE26813AF3D4900B9B8687ADF5786B9D1AF47FC9D 14D15E07E40F21EF30DDE76E400A97482B43AD5AA6D8E156246D2D9AABB8DAF5 4805910D2CF60B740BED2F900EE034B50545BA11B69D06AD66430CDF53E1E5BF 8EEBD31A2EE4CEBDC36287A4A9B6E556BF63534F72B7DDBC342E683207E4D8FF 284A5BE4AE36CDDDB75093F4BF684F6D4CD5027469F2A2501836849DDE154E00 614E8E947DAD73EA8198A9F2A86BC774E62A98968B120957FF4CF7FC3DC7491A 46CDB99EAFBA1893B509BCCE277A24EE30D60CCB07E38187C9650097AE056650 AAA1F2012925E10847DAC9B1A1895CA069E9E629A032AF4D1A8EE7CCC98DF955 0960021CF67A074A8DC90A3A130CD6B1C150921798E27E0F3B82ABE1E390D6A4 DC15A6468FD5A92E56E9EFD014BA6FC25DB57B63F9B8FAD1B0823E755C5968C7 EF298FA95594582ECA80CA0447D40EB04BFDD8A14984AFC92716826AB73283D4 C85805B2AB7FABCEB610B387E47C281F0C5F8AC13BEBC02AECED2E4A0FA7109F 738AD59CDCBB5C32A69D7CF275D42D614BA5CFF17DE0552AFA8E80966C9D9A9E 0E8D23E59354EDA58C6F62B8851A6C555941F467DA9D81A9D6A20EB873790B74 3F52B3F00158F13EC1E053DD6127C4C79990B1B07CAA02A8B40A51042A1434DF 5BB2BE63759FC40CD314994B8BAA4EC1EE5B92D015BC4264562D4F5DA241FA9C 50709C64E7614FF072F867D7383D92D7DFD513B9F2868E9969C7CDAC5BDFCA63 EE3600DBD62CFAD7604E93CF4574B163B758320A190694BE2F2426794B936EF6 B4A80B99B411D638166B883354CEAA794524754C17A85BD5A1328CD08446FC56 A7AA470B0372641F045807C4DF242DA242DF2D1D84319021933A749C6D9CC066 6BFB53402028F14241849F314166C0CB72DCE206F228C9F1761CC4127457E35E BA0F65F13C499EE453B74E98DADA572F4E45D9ECC045EF113F40F732C8393138 973E3D339349D44E5080B9EB64706567CA4150998C917B8070A0A4DC0D48993F B9E43D48CD073960AC6FD32AE03D7B3C275712AAC21CC3C65995AF493E5E395E EAC7C6C6BF43F7447457713FBAB0E0CF71B8A43E8418E3894CF0A0F103A419F8 FAAF6AE6E8FBBD795099620226F42FB87F23104F1EF91CC51069538499227AF5 21B1EABB69CAA258874B6BC497A307C716548419FBF35F98A85858793EE4088E A8F341EC48EEAFD4A8610C3F8208602EE0B4E69829CD27EE824A9A63D04A2B1D 897FCC3B7730B5D5392E3835B1CE6C1877D0C3501FABBFD4123476FE5B4652DB D6C9535B28DFE247D7C00A4C6228F95021D005C751E4AD3BABA3EF379DF2A679 D7BA493EE25A9D371BA35152140BF059D97D730FD1AD926BD9553EE205569E96 CFA055D17E041986DC8B00053403C6051672A6DAE04DB5E54A1A26544C8AF6E5 0F95E31D462E8A146F24E488617D0254247A367C750E69DF36E1A1F0DF99779B 414F65A69334ED46FDBE689E7846DC1FA8FCC4E07BE35A93960A39D11EB78D00 BE8C8E81C245BB157A54AAC24332466252A1BAFFFF1266B6B3DDA1CFD21C4846 DAC0427FBD67DE30FD826750FC7479DCFFA1BFF6424AA67ED7127F6D81A1CCE6 F89838E00C5ACFC21FF815264C723AC006114393C9F89BF7E4352F185FEDCCF6 C68ED1D258F719B78BB34B51E91CBE73EFB87F93C561633857713DF8F27224CD B162786090E949A41E642952DCE82E49BFF744292EEE5492BBD99DFFAFB18B92 05461E06E1CA759EA1BC98086AF182D1CB214FA8B5869D6BF7D5C5B474AD5AE5 4E1D8D4DD0982FC971612920D65129E27DF085ED66F55CE5D317329C7D8F7EDF 286742779F7F2BA348687564321D268107FA34061BDCA2A9A6AE905098297F44 080FE7BD882B2E55981A9255DF2ABD7DAAB6CD9532FFB8237D87D162BFB12CA4 2D9AEF2D73EC97E05FC64D8328CEB50AFADF9DD2893DF52D3C43B49BFB8F80D6 516C9BC9F12C76F296370DDA7CDB1CE5AEF741A2FF5137E63DB5984B753BB9CA FBC14D33ABCEA92AC4F02A7CA18771AF3470EF5307570308761D9B61D5FFD8BD 9DBFFC1E0A5F16C02625D0D33FF7AAEF20AD5FAF60E33F31082CC71A8A377060 686C10BCF8E908F1D05A9AAF2032B16DBC5210A47BFFB8FFC55A1A94091F24B8 837488E6499D9154219EEF29B6BCC003EBF774C9AB9D842E3869BC2568D25160 C8CA6CB8462627808D9A9D7355B54C22B4CBFA04A03DDE7BCB8596798F0F01CF 997076508D070830741B0480ED38EF268A6D11233338CD17C9DBBC1CC64A9CA7 3576597EC940D179EC11B1196A8AFCB2B67509545A1E4F4D05A129D41264E225 1862C8E6F09CA74552F8437E3E554D0C81B43F5555299F230EB9772C0F085526 E9D3867EA229A5310DB7A58A7CAF3B26E7B926E3E6E10B43105323479C3A2B92 14CDF6B1CAF8E794D20D6384BE567178CFD0BF0CD3482425DEB1E358EBFAC35E 0D27ED2A9FF5BA6853817394306ED614CD004DD1CAEA8BD4FC58DE037405DA5E 333B584C7FD8A2B2B690D80A681693B0E03244E400B9EC39B1E170A74BA72E09 61F7D2ECA9848C3E41D2A53FC60B008251D7CF746A 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTT10 %!PS-AdobeFont-1.1: CMTT10 1.00B %%CreationDate: 1992 Apr 26 10:42:42 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /CMTT10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put readonly def /FontBBox{-4 -235 731 800}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19 38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204 EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727 A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593 F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714 4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA 6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F 1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438 452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF 8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369 5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9 BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19 741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79 E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712 E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7 D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DA 726405EFE420635B5B7F0B48752C06083E92BDE06401C42A2C528C8A60381227 CEBEF0C9440DC034DAD9C19FB27DB399BDAEE22053591D6538587C768C1B7B0B 7D1E222D2D8AF3A6473CC4C0D6C3E0DB49068CEB8C9BD1C5CD486A50DAA10BC7 7D6286142355E3F21DD254E27C00C442728A0BAEC9D3F17AE9CE320D365152E9 EB0D5E3874F2BCEDA98521D23FCFC30B4B69DAD2ADBE80E5964ED0ABEF6C73B6 DAD30E2C5061E3747FE536E1A5D190D028F2130AF608F5DDF9DDDF1E77DC8437 ECB3EC93B33505DF47884DDBD1DC6BBE4098DF04A29AF6FA3AE344600D0AAB53 B3820DD7ECB600A3B8001C51AF2CA7A39AE1485A087FD1752DF68F55B52B4DA7 48030F2AA7E570B3D56C4EAD367B9B73FBC0A7356253233006178B9A6BC19081 B815B5988AE76FE6FAFD7AC239072B1106A3F509381AAEE79B2F2154CAC4727B D199CDC8B4D05DF4BA006982512ABD7539E28D937B0F87FF79A3F84C29ECF943 A8DCB8BDF8EA9E7A0E7CD60BC2308C96B3E889C797D0FF28FF4847016B3DA141 E76FC6BE78A6EE9CE07E651FF86E720A1A1F075972D36E5C55162E3FE26BCE3A 814BFEB12D4C5FD24340CFFED499C7CA183E57EC4F12CFFBE3291D43F7270575 C6C3306F832EF182ADD0AA14C4D8669A17C09F632406AFA195F90C4DDC39779E EC0A77E590211592D6EE19563963225C06C2F13265EBB5A6CFB7C17D9E77650D 11958305727AF662AE73AD0E3ED5F7E7086C5A0C3548A8129575980B06C715AF DD55C8DF869BED0A7883491030B1A7E82C5EB04E5A7D952E716DD8F2EF6275EE 087614CFAB55FCE2BBECD7E8D9C90FD8359E929D5E0A416A23BD58158318B4FF 87B095EB63F7F052B3A77F136FD66EB2C52BD46CD7DB3091A4B78A607112B12C 4D171B2A00B78B0E1C44B0D90C20D9244281F5123DC1F6063F91E9E3E48DE78B C862D848BAD073A4FCB5EEC9FF54B5AB8E234CCC3C7439C62ABC4A13EF1B8897 ABBF21F900C564C9A305FC36FC7224932F766E6E72C2EBB55953DFE2AFC2E3FD 33A0C6F0FDFF086E9FD796E7242596AE85B877223532667625E371D2156E4C04 0D7FFCD3337B93DF066CB6FE1E13960719EB7CB409EE805C08ACD2C06303ED9C E34C898787A43C1B428B896551C6FEB50A831C6F8CE2073EFC662EC286CB7555 A3B42E58772E82FEE206948B8C439FEC5E4ECB9E11DC3A4CBC7611E30890E408 637A01A2118441B4F9467A98BB2A1B03BB2F5D8E3DB7D1D15C188D9E856088EC B762F07B1C06024F7EF53A2FBD60C0A1F4C0275D07164545250ECEEF8CB15B04 A2D8AC44DDE818C4E3CBD2A5FA0FE49750886CD7CFAAF8B780255F89DF7F4F5C BB594FE7C1597DA71813C2952AD3E811524459EB71D29696B450C924B6A5C843 8F36A0F1D7DFE796FB9564333666D74AE614D0D698FAFF20F83C86524C894BB0 272221C060544F3B653CB0E4E4F82B20D7530B3806E6A5830852C58070177815 E287C847F19F64E854F1463C23DDD80093D6FEB8BAA22C5F05C21F99FBA7193A EB7CD49CFDF4308C6C68CC955A45FCFB54FCADA9A3BFBDE086B057DE88BE335D 280F5338D7E66AD39FD08F9B55884F1F377FB6869FBABE3EAA4B7ACCD85BE672 724B4B8F236B0889B6E7049CBA558A89F17863E82DF145DB8C7ED1F36332DE23 3C0053B74E850FA14F9EC9EFC23AF18E153CC96FB0FFD910347370E57F0D81E9 4A83E2D189EE5635E85A2BEAB5B1CB974546BFB2FC2ABA1E15DC0EC1BB3AF1DB B2F93538B92F504CBD7AAFE36F5F3AD45EB16378F169B17869FE81464CB826CB 400D2F5441A496B6C60A4F15FD20ECCAC1F8F91015E7E1C1A10B7992A1554E52 9FBEE905A3005336E49CB04BA7223F1674C0BBDFA06ACA34F7BFDA56906E04A7 4DD79EC7E79B021A5008F3B1E04712D689366F520B0FA66A558F957011992728 561BF4B75C2BE07C4024C172085E51CCC5CFA439F570297154CDDBB3AA25CD6A 3004B936488851BA1E814260C06CD5479DCAB1A6AE21A5F4563024F973D738B4 0DDB6C6DD2E3AC21B4F6D95CF9AACA782919F5D3E613D61F3224A982AF485C8D EA0037410EB70AB7D3EC174C6D5DE5C9C5A1220EF7C2B74499ADCEEFF077D1D3 50C1124535F88C3C3F66477E42F1932665AD323E06B398D2805B9CEA632F5B1E 50FA587B102A35E2F15EC22DD66E4DF06A3F4BB717A3ED7FBBE2458EB4D896DD AF00D1BC71FE1CCA27890ECBF9F0AF01D3E65CAA29427FAF06B3BE1E640522E0 73B213D04491B93DB29113EF72211E31F4C5A7FD58451946CFC15FD805112FE2 547D1131A46710DFB75659A33695FFAF3CDD40AE5260AD6766DA81DAB0A6E96B E89D57AAEF32B5EDBBE9F7CC033BB2595CA3FEDA2ABAC8E5395EBC35BC112FE9 67EAF1F123228538091483050847F8FB5194203609502D3A09CDE811EADC18B9 F039593782C27EFA7697182D6367E88E326AD5622C5A457FE2644FEADA88615D 9DE3E483BFD9329667953CDB86F9D2F0D4F02DAB8A98FDEB1D17CAAED9B6E2E6 0C55C1FEE25AB98FF59FC235876029CE03E4A713B75B3163BE3B2DC0D4472DBC 473E10400C0F57E627AE97FD0C1CB0F78FD8E2FA831A3D2B1C2BB3F2D4E812A4 194C8732B0C525361DC8480CB27C30CD4DCFF01318D2EB4F5234B4A42EA8C23E 7B3EECA41B8E4F54D5458B37EF0FB2F49EB19F4EA8AD2B53820FA36E93DD309E 48847F5C01B1118ECE7D0186E6B8953344EB775D655AAAD7BCDA642EA2E39A15 855C027CBC0E3FA752900EEB464E2D39404D1B85072B40834748C6F9C74C5B6C 3CEDE988343FD984CFE4B856A481E60E2E65D3BB41BAF2FA80AC0BFE381071C4 573C6ED65C524FF777F34D82E9661E4A75E3878CC77BC59218244612219C5A92 E95B90EC2C38614665550026F1730D11162F19D841681C04C401E102C047541B 97B9264D86F47E25A347696AE5EF0FF3ECD9BA32C92901DEDD816F7D73ED1216 0A98771892472CD625A8F7F19DEFCF5CA2AE57F8AD3898F2C1005B187DEC6F2A A31C32720EBC934178E0E9979013B3C9AEDA4051DF63D8C903A399DC88F83DCB A73F1B2083819D1BBEA5235F8FE1D098F32A2BA6274424A99A4975FE4BFD59AD 79B40A8003CC0AA728EA79D6BDCBBD73DF45B7918BC099C5BE4A068BF64A30B1 C39442CED98AAE1BD495F6CA32D564A72E3BF753B49E4178927E4BBC0F06048F 96DE7C30AF580B0BFFDB330B3B87D7F6532A24F403680BD9F15E758CDF04EB94 E83C7E644FDE5BEE7CE73EFAC75669E41BDFB20A5B8ADE1137378DD8102A0DBE 19499A623770417CBF5211395A6BA9F4490F4707A46F1F9B3FBE642DEA0CA053 9ABC307B1E71DC2B069DDDBB4EAE378BCC75AD61DA900AF8BA6DF0E27A8D2258 DC80205305AB6ABFE3726703E60869BFAFF1874F3C0E05FAD9C05D7D89ECECA9 DD2AF5F777D7514208697E712B52448B364D3ECEFD8127043DDC9D0757B7CC37 5CDE8001D007A6E961EA24D7FFC92410F3B13A32946F12A50DFFA256249BC8D7 C1842FB84AD51B41008EC4604F6B70990510EE13E6DA34F864A572D99A13FFC7 3609EF2BB1FCDEDF37A6018248C545E086EAD1BA1143E74AC60B684E755E59E7 36557B915F92EF78FC177621D49F777A2AF39F3C2AA6EC74750AAAE08BCC21CA A71CCDC91DD45E6050D83ABA49ECE425B55EEE137C55619037F1C30530BD0A6E CD2004B6A040405064D7E87C55536680364E09248BFAA3FDF95CDA0708E55F4C F7D0A92A93DEE0C7B69638F171B28B7F854CCC6EBC6AEE14864BF5144EA36D46 A9C297225AB0325E28EF6BD06D7E40E3A724EA1E50C4C6163B195CFFD5DD291D D7BBE9AF4324A69394117EFD62F08D6BA6A8F0AC3E2353492999AF28FBA758C3 A50B6840CC72054355E6CBDBD86F683537A4115049BC1616BA35C2B0B6F5CC32 3F6831DE4E6029310738DE23D36D2C6E82F04EB675FB89789F74AFE3B8854250 51812FBEFBCF162947554324FADAB765C74B6DA89F60A734076D44BBE45263B1 3FEFEEA90EC7948F23F34D4049087AF6563692417DDBCDD5A9552A373C2528F8 0318D3C0669279F292127CBA40B0ABE08A1476BC9EBFA8BD5D622BC5CE7DBA20 C689BDAF50D5B1EAA89E296787CC53845DB2BA54FDE363DCC98A7BA256663869 E9E02E09077884DF1A2A41AA698B7EDE8DAFA621B552DDA91AD1E671D636FB36 91C62B4D2D4112F2C169E0023EB7521F570CECC54ECA5EBA462049AABBE2ADEF E3234BFD71B26DFDD9D34DFA69E5E80FD90406E6505A6798F030A4B5172A7BC2 C9B765A86ED55C0590E0432719BCD7BDE7CCC7F6B33BD467063D886276C8879D E04897A4623111C14A1EDBBF69E2FEDDFEAEB2A785C6D2F0711DF4B93AAA291E 7F4E0CF9CC3FF0D31953C594DAD014097DA02CBD5AE8828C7E7B5BDA09188B05 0D7263F164E1E78CC430ACAD1E8FA71001E9BCEFAE47C79846916A5F819CA366 5734089BCDD458CA1A9E8E17BFF357A91F9A7A8A6E1DEFB121353AA80F1906A5 AF7CD2E59EE6776FC0DA6574DA0DE522918CAC4E566F13FB9B64EFE79F3A3BC0 689E3B0676741C90FF3BF85C7A0FA9716F4ED0E329512B66BFB8AEB56C3DD6B2 24F8D6E23751A8485F7EB46719E9D22618FEE86D5E01ECCF4C6E74368A8E9B49 245D80E7484DFBC916FB2447852B36EF3F99A82B6C106F786707D7689DCD7AEC A0C51AC1A3F67034C16B74994403FAE7743BF02149BEBEF554814BEF31B79184 3FAB4D2C887E1BEE81B465D12DCDDAD03DE5ABE9E763C440B2CFD42FD16D96EB C21FE788C8C2688F79F148AA7090BE64B0EA710D376222FD1590301BA9A2E715 D33B8C1D95F2589AB0EE476F7046537E27DBBCDADEA1E7357C9D7FA92C2F93A6 7BDDF58A44966590821023380C97CDE37EF6D449E35EF32BCA6E69DC8458511E 8DC8AB63171A6018AC9A334829E5978484C4C6E917A5F1C254E6669F4037C691 36980250A80673E0F18C9E0FBA1E5CCA3BE30B8E7B7188062B25F8E1E16528A2 F217C18D6A1955482E5463FBF097ABAF7314E449C6FEE56E2695407A8AA9648C 61AC2BF3B2D9CB6317A9B16CE931D318C8BC9676CD908505568C197D90C2BB46 06431C999EB68C8216409E4CABACB2BB34A05B697B9DD1E91471A404B4969519 E25209EF4EDD420944BED17B18DB3566FCB8059699FE416789191EC2B35086AA 2E10C139E3C9FA0A535DEE9255A867A26656213E85851DE5F51F9780D3A6E572 F1F5CE64DA176CA810799DC1C60A8FD2A5ED42E613021A19928EC4572059B2C1 EE441E79CDF7DD4AF7B6E3D3230419ACAED329388044B107DCB4DE91B71EB838 904B1F969738BBDA064FFE75C6623639BE9924602DDF0C166B433B9D54ACDA5E 018680477FB8F10621FF32319E58DB672D744959A33E7314A1B3CDE0C038F7D6 0C8A195AF191E36B0325334A711CD8E25D9C1D257E46A734779E486567481108 E0281DE96907D460546578DE83A0A01A9ABF64402B48DEF739F4308E14145753 719CEF720FE5CF8DAD7845E74D502B69DC18D172C3A27411259B8042F3FF82C3 B157BE242C351830255CF0EDA96577375A70657BD9A2E9FFC54AF0AE563D73F2 E510279FEF48D79F5F7745DBB492F1D74DA738E6A4FE4364799B5BEC93B4CAF6 B06B9B8C8D164F8FA1FBBA693204064F2C1806C39910910E02ECA8D092558CB8 33338B359D56483B7B99A1D8137204EC1AE70ED3D75881FC3B00BB9349AD934C 81A9F285312FDDC77FA923B18B1873D288C2AAF2E6D0AF90BF25A982B843789D 5662D6A2DD58E065026885601ABED4B09CAAA3116DEE6B430B15BE0A121FC1BB FDEA5A501F0798CFFFFEAB5101E707F1A00C8E014A3561FD39972EA9AB108EBB 960AEA7FF60C301AD6CBFCAA7D35CBF6F8462A4D76C4FBA6F3DF6BB762DF7900 9F69529AB4EAF96C2866444B257160E8822533A7A1240C83EC18C364F577407B 4CB314678D2511735308A1660AD94B8B818CEA4A3DC00C5A1C978F8BB4E0491C 49328F6CDF95BF620AE53056364423841D84418B23C2A447B0CCF8D8633FE2E8 4A4AC1C6C74627EECDC994059F1BAE9E6B10FA80D767B3FE97BFFAD413DCB0A8 495039744B48266278194D60422D6E7C74D0DB45ACF217797D0C0678EEB60759 6231438CFEFB346553A7A447B50807EBB6E885B5A49CA9A350EC4A8C76EDFBB3 A4DA1C9E3EFA193CDF08553302998F20055C84420A4C5252F764CC4B7A4BEF6A A09170EC417B296DD9E2301CD8EABE4A087E648E0525A9FFAF26374C47FDC123 82F18C9884843864F418ACB08041E7896FDD395225532460A8194A8DB4DBD824 1C68C6665F85059E365EC0972EC6465E2D8867449907DA6692A021F026F437BD D02654BC11381BB6557663E0B0B8C4F2FF69E4776F4EABA69311BC1AF8155F7D 6D3A418BDC912CC7CF1A4BBC8A1376D8B4DEEB6585416959BCA4AA08D4520C33 EB054DE53140992D0707210593BE62B3659E3E493C4562C2E99CECA143791DAC 679896BCDA0699E405957E17DDBD243E65CDD7C9C8629F29A2078658746A7779 0F75BE24E2DDBB672B95F26366BAF036B3C23BE4132D7362E76D4183A469E0F7 29174711ECAF4FD9A923E72FE58DF2854C5537E3626317D471D1E8A922C9BBA4 CE9163A4086AC4A231C2BF35FBC39A5BBCFE41843CAC7D81A054509D31572BE1 596E0B0B563DF2BF0E57DB4943DAEE35CA26C8433FEE4FC61145C77F65DADE75 62DA18DFABC7F4194906F53884E62E77D8AB3E099776AB93B2B4D0C98FA44C71 597202A2643942795EE8CE098FE26F1AF8134F1E75FAE18D563B1FF43A511C9E EAFB9EFCF61490A1A4FD2CF354927B72C5EDD5D62B2F3F5006D6130562A13BCB 1B988A994A8D68B051A5A821CCD5D0F8D9D49FE7CD04EECCFD7A554CCDFFD77E 27AC4AB5BF9FE40F90EBD066C483796CE1A364E95C5E0CF2154834760522F128 B2DBD1F4F73347D42635B2875A23597C35A0823CC6F71E49598125411BC9B2C2 72470D36DD967C947AFB031BFCF770FE50551A134DF8C5D1AB1F09819569A57E E23D4E87C0B52CD02B0A2E3FAA7D27A94359E82AF047756BB769BC5950A75207 78ABD49D174F2F69810AFFA9336A52D6B93B004DCA5CDE58475C0210E0BA1D20 FD4FFD6838EC56A0922472D4C4EE0CC481574BC30618179E733EA40A48847E14 A75BE7717CC5DDCB5B0718074EAB6FF07CFFE794D335B3A13EB968EA8FC5B08A 13B38AD1C2C964E4B07E90B9732C458216B028E07DD593A5B767A2B415EFE7DA 951FC07800F11C7E2EF9BDD152BC6815B7F32117F49FE08BD79BEB949003512A 327F3F8FAE1767E7842348BA4373649F1A21DB2C56C081BCF9FA4EA86C8DFF00 FF45C4F1386CF8C2C4120F3F6019CEBB639F2D272D08C1763A470D4BF6330DC8 43C069A6333113C3A0C93471486EFE9BFC02B760C7CBB2E9156087D09EE8A178 5EF50B34994094C3F0015EA2ADB6C920F4302FDEF128711994875551C4E883E2 DDEFFAAE11F2234AFDD96400BB69C1B4E6EFD75734C586A10A54A98E7D790F28 DEF7C7DF61FB23BF91AA700AE585EBDE74E215DA49F4ED466F46129022722086 8884D8E026F35C4BEE7E866DF8E0846D5EC3534069B713FAB02D4B4EE3B44E1B 656F30D629D40AA1337786C1FDA08EA1217AFA4A6E2498B334DAB5461A70DFBB 5AA5686C89FFA4EE82D81CE2B28334DC5C032487CCE998616F48150BA1281911 076E626E5BFCC56A0A4CDC559F878F14C2BD7A5148C1D8CC303FF9EC473354D2 D4FB0F0F2AD0CF182A28074ED6552E179222570DE0E0D44E8FF4DB36C3AD6487 C4BA53C8548714A69FCF8E3E5202F09469D7447C6519AE902C1D611A720BAFB5 59E27A6DBA73624F44B4ABE0988BA3450F82E03521CCE8EDE8BE7EE1223B575A DF9A52650E85545525E6F121FF2D1531F156EA9D5594239AEA2CD09EE28ACB15 A445E11FD1C031188DB61881F474D49425C084489A88A47D681EA68E7FC4B1F9 DBB552063A02A0EB51125E9B2CC646B940D46FF457415F9565892DEAC030F08B E4C10DC38D825C7597394C844CB863CE6C843F67F2E1C42C4EF86AC7FB727BF0 224B5E91BAD99CC6638AB2C64469A81D8B1789981872ED037B3A34BDF3130137 80FE80FDA65EFBC11A08B98A1AE595F980B577E22D3CB7FED1D4016F5290ADF5 47D7D9BAFE39F294582F2C084003E9C83FDB9EBC87C8B477CB8BB359EDD9BBC9 9368D6605E1468A20909831BF602EFCEC0D5EBA99A2223E5A269275C8B221B3A F9226654185929F794E1979ED18B4CD36152F973433AC67BE24B9D953254FBBD B644CDF3BF0E29A2C72113DC486E46DED2CE8F8DFA8B0F8478D1F18C9AA8E054 A31C3DBE84ECEDD85DF6AF9467AC2990ECAA3384FBCA1BBE598AA0D6813C859E 1520B88BF30ADA910A6AC3068A5B8CFD76B7F0F6F4AF4C32450D628B5320C384 F23A2B5E8756895584155226A30F8B0437E028978491DCD00E79C0ED58DF261E 79B9DA17E57AEE03EE92102EAB2D63E69A88EE0B1E2087ED0C0CF6475EBDC3BE 0324D1FC8F7B90D8D807533E5436F2C2583B9629EC390403437FDAC908557894 03054A6DD6A3586043A9C8BFD0C7EDE1229DBB9F69F7A5D20F55664D061F6517 0051C6B3CD7338241FB403F2AF77DAB1A8EBE1650156D40863EC1957372BFDEA BA8D0BB1193CC5BEB5A68C8274802E14FFA3ADCEBE19070325B1BDB960CF2988 C0F5A9BFD843C515ADEC8B8AB02B2891EDD7502D9F28F4E58D8F67D1ACAFD0C3 3531E0C7D1554344CCF90AC8696E83A3F968252981CAC09653956F4343B99D3D 4F17CB8BBE4506B354439B70F2024871D16668F9DECD8EDB872BE5E6ACC406F1 1DF4E3ADF60EFED57D1C426292970199BB663405236C6A907B6891C6190E87F2 78D9142220FF295C7BF44AF61470798FB8CFBEE6973C69DA1CC24ECB058AA753 DDBFD92FBB15560EA19D5D92F0005B74F06F0EA5901D231996E0866389DCA433 E62BE48479687084C1D67BC592E592939F806FA8BF5F0D3F644B1FA6F056DE0D 51D3F212C6818CB6166317058C2A0C07AE2E324CD90D4EC83CF4819B10CC348C 6DBABA024A5FCDAE6E288F82DA060BCD16437F07DCA43BF1E5A1B402F16C78FC 075BEE900B4021A1019C4A5ADC33230047FF11FDE8FB775DDA267040A22B4E5D 6012F7E72B8BC8DD3A81369A08FB81C6C4873C2147D03D4181D6D8032DD2B610 9C44CAB50C5BD8F489EBF01C72D4198B66EEA4E976462F8874143640B82AE57C A51EDEDE75A9A55D31587C14F8DEFFE69F75EA7B95BF725CE9991FB2F07AF568 5AFEB39447B728B99BE0502BF28DE1D92B15926BE4E3DA2E7BB44A24836A97C6 EE3A2080E01DC6514180DAF9C055F4C94929D34F193920020505E62804461630 9F42C652F9D5681C91BE23DCB0C634247E739135F925EF3D5424767D5F5C5879 C46F2E32C7B3BE9E90FD6ABE693A6016AB77670129B58B8FE719FA97FE320842 6488CB85B6BCC0012975D22E75A2E086131DE676AB825A386C086FBE1B65DDDD A19F06AA4C1D3EC84751C649F4A62CFDC48A7CF88CFEC68B959C211B60DCB045 6BFF922FD7349B98E1769394E6CEA4F764AC4B6536AAE4E6BE69099A39A6A33C 97671C3AB4E7A94DCB829FBA97DFE5F71B1728FC81F826699DFDB0ACE9BC60E0 6EC15D35EC479F3F53EE4D0398BAC138FED504A84A13B78568E3F9C86BAE8B88 61830A80F8B994D0D66A8FA3FCD6C5099C29FC285ABF096EF9A3BFDBB522157C DCE9F0D6AAFB1F8D7B0A3C573D0C170357175DD56EAF37BAAEF4C92FBE17E26C 7D2BDAACB9B8F33D09651FBE0D49A8BE66B78D075485BCD38DED5056FCE48A12 D28E9670EC7CF4E9A277D6ABC2F7AB30BFF290B5452582F372FC9DE6CEA9EC0B 84328269F14FE7F47620B1042B283C54161AFCF84B46E6B1410587295E4F8958 C1800F120B59639C85D46D46A4C64309931A8C91F138EB52F779189EF75B9157 D624045F4B8846856ADF0AD735FC6FA41F7B6C002E9D1EBD92468E86C843AFB7 4D78E3D54D866029DE5DF865EE3F7313AC358EDA70A792E22F2F806EF86A6B57 64AAD565C57E64B1A6635B7394B4B5729189319FCAC8529ADE30633B9BDEE0D2 AF1F8944EFDC7C408FD8FC270822CC01E7BA355C856219B3AC5D05CA37EB0EF1 6766D62383AEDDA1F7CDAD1DF0172E766BB46C5FCCDDD61BB019D283EDEF312A B2DBA38C9BB0928FB93F50E8516AB353BE04403D132805B5AAAA17163AB9C847 F1B54946B0775FD21325C82E4EC7F2186C54B4396BC4B0B913A59E4444D11B39 8AB56F2FD5788A9BA45DA5499A50BA74D28707F62086907BF8342E0C753A31A8 DE293B592F51D74DECA52858CCF76C69BAF2224F640069BEF2604983FB478173 792D68030D7A6E3FE083AFFE9488D872897ABFC88CA8BFE484A75201D73058D4 72A8A26A50BA1F2B50CBF98D46DFED0BA057619BF370E435A0400147928D7C06 28DF2A03527E3BE925D6A664E4640E63BD22D54A038D934B3DB5B500E075B8AB 06DB5279274E65FF870F1E5106E190AB0FD8849EEE2D605FD4F0DED2C3F86831 4EECBFAAD8B2A895F08DBA692A8176F9080045519CC6C46B52F0F31DF112AD79 8E46B9899C5527A011AB63FA443ACE90F09434C295A5D9E6753AF2645407488E D29E7711546F87265C130B76B4632242E43962A5C886D4DB6316A2F3420FCAEA 3055AB5A9E1325EA870CE87F34BB2B3110E4919E1AFEE67606B00B03DD6824F0 20BA42968B81DAE198C88057438E36056D46C550E3E5E03A99BD4B07E66A2179 BBC5B3FB06D5D72022C53A3F3A1B759472D5A50D7F7A1F4E31D3F7A30EDC1D45 4B00AEB5DF680145A123CCA3BBD801CA64B2CBEEA99842720F8DCE432909AE78 5AD3F29AC69D302C62256CC4D47AC92EE11D2A3E1C666CEA24876491BB167548 9E3A990252DF8254CB5E7141F57B78FD1FEB38BE135815C6FC86EF81B5994711 E43083C3234C55DAD97CCCE4FF3F55C5A6C22ADD2C549513A465CFA3D8A9AEB6 331374DC05A4F496BE33F9263172FB6FE1CCD19EE9515C5155ABECA9492DC743 BE4142D63FB5E17D55C9FE642F07995502AECD9D555603D15B5BE420A65A6E98 4F341BA13E44DBBC1DC8CF0D561198A2B40FAF35F7ED5FEB4429BF71F5C88637 CB114F1377FD3227EDF592733EC68F4EFEAB14FE7C26DA7031075E04289FA6DC 8A79F81E4E18CAE8380CC585E7DA3DCDA3FCB53929AA8D772D53FC6D821EBB14 EB472017FB56CE9410FEEFF14EA69C188993922DAFEC805F4C8028537A9D6365 AE1A6BEF37CE8E02B995C41382984802AD3D12AA9FAA36837F9F9F8F60D16B81 474238F136F442CA9B14620F83E4046E41EB0FD02BD04DA7863DF26624B5489A B8BA35B0B3A8D128FA10E01DC9B622C26CC57CA79CCDEEB7E174698EFDCC0CBE 879AE1434B3EC5AF48E6C2EC5652DEFE0ECD7415FA46BC0C80FCC57CC808B3DE CBE4CC7B62AD3B092487F7A23C38A2D9102DEBB1CF4C1EE7FEDE1E8BBCDF7F73 54CAB1E591F9B3B3159D879A9492394B32F2CC43EE7EBA6E293AF12D7FC4ADF4 DAF8F2F48A777E927A915DE1FD9125B52D406BACB0BEA149F6F6D79D92D06413 5D68461A772D531F2E76D1947D2ED5BFFCD758E062B5435BFD180F7E3734D5DD ABD86A1C2BA643955A36C482BEBAC608F588C43E6EA7EA2AE01D0346D28F50CD BA8F9FD23674AB19A2B879E0DD19029EAC5D74D16B186CF4BE3382E74E361427 536A00347E536701808C1D31A617D1F9269110B76A0D59C7B84D98C8FE308733 C9497B807A77D244FEE03ED7FB5EB4D6ABB74A7129F23AF628BC01BEC6C43ED2 D62F4E2133006FDB94D33CD31F9FFE57C8C9E31DC6D7A81A2C6ABF1D971EE222 96A4D79F7232190EB796A43ECEB88F1C64A88A10C3AE8E98711EFDF984BF270B 55C5B9082D54DA7D32B168CE573597DC5A453D76953DBDDDBC1798F8A645AEB3 78B6B5BAF60C9AFA9D5F818740EDAA977EBEA0F68E531550E607E6FCB04F3E22 BC9D6440E1E153C8D780213DAB08CF8CFEB03018942AF980642745D711C7DB1D BEFD825627798897ED8185D80234B6C087FBB602ADB1263C2A2A0F59AFCA7B09 EA4ED3BCF936C2DAEA9C8DDAA90130C24AD1A1BA47711CC760FF72EB3F27C165 CA1FDCF1250C6CA4A788AAEEE08902AB4EB03C6EDF281CA2F5B074C859DE3963 27F7CFC53CC91C80F779ABB25F7A6601453DF5606B72EC562F615A92C1DCED58 3911BE7784B6E8B17F8993E4D5693A327F9C289701F39ADCF583BB4EFDE1F835 1A59BBC2E6B73CF422D877B0B423E4E8FD116F5C66A4BEB706A3D42E7EFBB5E5 E73CD03D7A91719337CC8E13F9D8DA255185FBE3F4FB6DBE8EA90AF036A09BE3 5047B59BC18C1C3658ACE003B6535E42043E4D7E6D79E0B48B3D0DCA36C046D1 D5ACE0B6F91CB78BCBD144F3FAA3D9D711C9D11EC30B6CCDBF43CD490E9AC229 9ED2CFAC4F53927040CC8FD26004450889A1167FA34247B7C283A46E4C0A8C20 AB43314A34EF0BC02C5558746D35F2315624FB9D4A8ED13E3D1A8B80B872798E CCB9775F985E31E8228B03949B4E35DCF7A41C834E53CE3C163EEECE81A8278C FEA3A9E3264627D33738170C12F4EB23EF8F00811723FA4FE56A0EFE8ED5EBE4 90455B690EAE1E8F1092C1AAC07FC418A6790C2DDA6DF739B9B586B68263EB63 718EAD2B11037C5D26FF31FB2E56AB82773921B00EF07DECAEE2A8FD71AB232C 86865012F1FCC80CBDC4B0E881819601CE2FC5AC36875F2FB5C088436BB11159 813020F0433EDF6D96FD162F5E3241F88BA7025F2B010208DD1DF737FFF1185B 812864C3049CE325E06610404C8DE9322187DAA7FD90FFDF2DF3C86D94E8E792 377C1C1F10FDC78E1FDEAF718A2857C4922FA300C8D3FAC136BA2957C675FBDD 21E3A9E29C797142BA6D30FABB0D5E97AABB49D113A55C4838B253AB8D7443E7 15596B3BDF01C88C17135A74AF78551CEB6B0041BD17ECAF89321E6948E1C531 B227A1F071FC3558501BFFC842A4F8B80C14D9213E0633485A66F899BCB473D7 3C72329610575B6279C781714761468C785E426DC9393564979B1D6A6D55AE9B 4954010208883EC964F35E8363129682AAFA2D40E1ED08A4A1DF27F3DB5474E2 92B917B45D9473AC94EE40662DF06AC9D004541B6F88DF5AA4A36756620CBE83 1254ED1C3C9CA39B09E0D4148DA552B00FC60FF68E7159F556998EB8A66C8EC3 3B7842ACEE888BCBD1FA183BAB95B06B245ACEA49F8CC51A2EB01053E99E9A87 A5198C2FC26E270961FFF61A093A084594E6C0298CF96B251C5F8395ACDA26FC 461E6DB774F6220F8FA04C68519E19CF69EFA73E9A1BDFFE833B228DC19571BA 34B7AC21EB2BF8B1876BD11E128F002AC9AD6A9785CBBFE2D5FBAC307BE7CE5B DDA7C12820028FBDBEF1343638CE166E43B95E6518A83828AA3C3628779FB2E4 CE32DED584715FD18C95D38FA85772DC8650EFC42F980A1ADC012ACD93B7E1E5 FA6453179ADC6F17C94FEA1F4CC2EF6A2A975C687ED81DEB7111F0897742B373 30720766409C534C5E0A42D7221337FF3C4C59BBD239518F3976DC55FDBB8C1C 8DB9CB4B05B1D9AFBAF0FA1D82B1564AD7FC92B6CB3582F7DA309403EB78916B BFDC6F918E26A39755E5AD6394D985C92F7927FB1287FAFF2F60248236F918DC 2E8557C6805B01090A037E8D5C529E2D70976A9CBF3785F4BAFAF9923DB40756 7B6CE8EE83559893E3930790E5917EC3421FEB042C0CBF6CE74F16C44FA08025 82EDA0833C0486CDA66ACB450094BB65F54C83829B47DAAAC9E4CF115FC275C8 6BE583008180F2E2C9B003712ECE32333199BBF9772A471EADE59355FF264DD7 ADFD42FECCD00892FB545DFE555AAA4B273B82BD2740CB8C9ACD144DEEA94188 D1AFEDFA1FC63557F9E527C00AE7D14762FEC2814487CB60E406F8D4A47365B1 F7B0E0A56CEF011CC11345674611EBFB5A7C587C34F786498FEE4F0F999AF42F D955CF2ECC5B64BB1C100310DE5B6C7D106A80FA4ACE0184A6E18FAC544EEDCF 307334E1C2A0CB6E488B21DA3BDDC5B593D5ABD6006D1E2BB56336EA88D56DAA 62DAFDDC379B06EF80E9F3661C6B7AA6787ADD06155F3DBCABAB6BA3A46C9047 5D295774447BC007D5423B9840E2ABACB5B811B30ABFF547A8A6E2C18A92DEF5 D30890D49388E80E6EC7626FE3236AABBF64B21E5525FFB7C802511129EBFAD3 D1E19814500A465DA92054F93FF77864698288510AB599237D0DBE1EECF81C46 F706515DF10A1D0FB06939473BC72429A42CE6E15BA2C97720756D80DDDC171E 7E8202D385C2E5B4A5A011933CE920E98A09527DDBF49FB4DAF2E736B1E42F57 354C91CAACB68BEE8FDD10F4DECF25ABA4EFFC4588DFDB9E98640737C015EA04 A33D5AAAF9AC4A7D288BC9D4A8AAB9B852516E215DF7614B10BEF003EE1D0572 E4654DBA4D71959D403B936339D41C381FC1A206BFA6505DF3082D9FF767EF67 437E8C2A14A8B6F0FB98C80DCC42A30C57C8AC3FE83570A1B4AB404374B85F45 A1056E389A7148CAF714CF6DC26A04E3DE8E2E7FD26F6CDE3E836AE65E593A9D 3FA7A24A32E3E99A152009C8713FF8960FC93A2E49B8F442B81A90F98B99E140 5F0E0253DE8ACE69F1248040510DEAEE069307FBD02B821D1DAEADE6C41111E8 37A80AB702B8D79977DD73429695C13DF81ED3B562FF4C168AE03ECD24909A41 22C579987CBB22700D1D34BB16E5D0B4BEDB4660D34EF5CF0A4FE507198EE14D 9FAF7C97CF769EA9159E1D8210B063141913DD402BAFD515CD746A7CBC061A74 CD6D6DF78AA722FF543C5379A1AF5102B75C06F73E075BD8531353892E1733D5 8143315C0C780BBB21D6954119C0AB1D4C89EA67C0AFDD4607AF07D509F481A9 9045776F08003CB429316307E66E1F9490E8547FE0336BDD8B070290558E0DCE DB08FCF371A8A9FE905E9C3BA4CBD4F12BB2F512838D395BBCAB1488C58122C0 CD6D3634C0F6E193E2F2E8C632BB9185B20D94503E02244938D4400F0DD8FB81 3AB0CBCF32E462A223F9680A14AC8876917ADEDCC9B181D584AA307CFF3B66B6 F59FC840A9E8D1BE101AA1DE41934C22A1017A8AF69D257433C2D2C5A0474F9D 362A669B4044B3990BF83E8906C5B7E2B45D688CF12CC1FF38F2EA47743676CB 55FCD3C6261C6F5AF002869128882E39E089A6FA108195A8B86CB07913FFFA6F 6D8F8D5C9E897D63C174825286953B9DCB09B8475D0675E09C1D26286107E89C C75F92D14002B1289A5E11F059F28FA27DF23FF395EEDFD5F22374FF67F0B60E 81D249898A228A6A89141B23918E977BA79C5F5E6CE84FD35F51B136D81428E4 E4D205612F6DEEC1CE6AE571B30A33DE004A8F096656A3BFAF8BAE8A2C73AA53 D7984D6777540082F3674304D2C3F17775BDF86A27563CC2BF95F190DB3E28E9 FBD0716C0F1B0D56A96E2E870882F03A3E160621FB469355859954858C9CC2AB 06EA8F87EA163B9ABC176D704D3C17A37508864381659070B071B80C79D6D60C 7858A32F5DE87B1F818E78048CE81E229FD7BD91286ECD773147F94E7A184450 D1060F0FBC5A8DB06BB4009B3F5F50EFEECEF8FE970E3FBFEB5ADEDE9EAC6A49 AECCEB5378A9CE274BC7F25D03CF477C2054D313FD988A4D913D20ED3981CE47 8674501E487FEFE5DD91CB0E5ED24BE1D2D45C88DBE1378B11F6B7076FE56BF4 8E8925E65FBF23330B9C4A943CD96EEC06A6073AED304CDF520CD2AC1CFFAC7A 6B8D8FFB7327834C9DADF578F250A51BE64D27A2B65A16DD0204635560B47075 3A054F7159EE483CA06345D3D55EFACD47AD32A9D7D7404ED0CB742A3AB8C47C 2C5CC71EA3E1405D6E114DD53D85C2350D46A8E4BDFD1667C65A8152D9F3331D 6235F40AE36EDB507325E21496725F3351C239207C0C4BBAEE2DC7D2797B8818 BEBAFCA4FEDBBBBBF3FDB633A0C21A8BBA856D4A3119394FB00AD092E314558B 99CD5B138D4A42BB7B621DFCC2A2E2AD262479E878D8F26195A643BA0D13F9C9 FCF3B6BE5774DE6F4564FB82BA3B2B9BA29A5F406F1A135D46DB10C80CA11E1C 39C9A74A18D8EEE86C85556F8B9203E00DE0B1A164134E48FCE7F37AAB98A79B EAD809EA81192ADD3D3C6B35E521AC99E190262E5454C7170B081CB8AE338D09 D489BB694D228CE9C05DA95297BF106A3B71A99A5F199F122971F5C4B0B9C53A 4344FD111B92AF456697E0B85142B71FA56802C392C886A408558A297EC3C717 FB803CA1002361034D40420699FFE3C149800137EBA3AD99AAAD74B471038675 8B073F692D278E0A088D3F51360C2C79A83FCDABE9963A4D636631310E7C6D35 EF02828CD45CEBF9892C2761D934E07AF32BE74852C13FE63BD3DFF3619CEFA1 25F5FAC01306FD99A573F0F5F29116967FFA22C9236EE8EB052488C4CC204855 EEDB80B30838AEF66DD960389684231FAAB83750575E4C9BAE860D9B0F838927 791AE22921BAF254FE561771B7A9164362D6BD462A82763F6D19737ADA1C2B92 BD72443D7521795F9D3702F83B04BCF992667CA255A3AA539CB71F25F2D0ED57 9E0B180D1C199211FBC17EE282E7CA9E078593E6340BA651AB949482A0760790 E4C3F1446653CFF964B9A3142FF4FBE8C75CFBAEFFEEE1810D38033CBDA2FE9F B42BBD97740EF0C118C7954FBE81FDDDC74608D036A3BBB75EEED4E1A4A56381 0F57C993C4651E4753A27684D170EBC495D09202AC0CDC5F10267EF26EF4E7D0 908F4524C91AD27F43737253BF0617559F2EB99EB26643D8C28B61F8968CEE7A A79A818887ED9BC3AECE4A35AB15752A368D09594F93B7A741282DB5C6E42144 EAD79AADE23733A43500563C3AD34E0421D1E3B4642EC1D70F0054E3DB6CC218 FF930B11B1CCC3E4C90BC523D4635161C89CD9FF8F2C4F6E4127ABF479914610 4D95589775902AE3993E1CE3D4868A1055BFF961CCB244AE25C76C4CE556B8AF 98129765EA10B35FFF3D24DE1CA68BA55E133084CD2562832630E302C3823EB2 5D7293D0C760EC1788BA6BC9ADB7AF6DA83C951E0A23AD98EFAD64AD387F7764 21320EAA8DD04EFC4C2BC011185DAC3DC1FEF1461F3F9ED515E2240433D855E2 0229E1D5269092D0FF790539D2946A608E82E1FCA5E3A1254B27AA134C300FFE C7C724824AE8B8436577129608078274BB69FB6A026D0CA48B97314F596EB375 390574158057D3E1C3EA4AC61BEC73F81C706A6C7A9B42EEACD6A4B5C4E69FD2 C68AB11CF02CE3D9B7148BAEC69F92FD7DAF6C9D772BE60AD4579BCE18396E4B 60EED65E6E2E62B283F135675C188F58C831B3A7ADCACACD39871EF8905B3264 567AEEE25FB31D64C6596D60597315F1AD8F74E5577E6C966F8F65B001850D1F 39F0234F0478F6DB136F17F20262CC072B25202BCC8A67EECB03A2834136EE5E 8FDF55397F3572922DF82D25376DA73083419420003E99A020198ED0ECA44A72 DCFF31392F59E14720BA027A5A5E81B3C32BE7DBEE039CEA50AFD5CF9CB9080B 3952949A3165C5AE1EF9D8C76E0C901DF5013469D55C8AFE1554A74D6C565533 FD00D77FAA0311910C9C191ECBE1A0FE30A4FCDC3909D4F6322DE2DE90865099 ABAA1A087DE9B4642DB649ECA28D40631EBA0B3902EA6D70F9260EA9DACBCE35 8EFFA26B2E8BF4567406788443950D8A71339F595C83E28111FC90181AF60EC8 9A7EDDE1989A2678B8C570F5D0BC178C4018626B9AC851604F03C98469EFDFCB BC34589B59973E918756A2C1BB7D1811BEAA17D193DEA92EB273D50AE5C0FC30 661B330B083311E5D971D70DE46E2239532FAC9A6D8FD913E6DD03F42ED6148C 4F04E6D136D41C24BD9B973109A9B63233E51176EE64D247DE1C5CBB43F568BC DBD5A6AEDFB68E5A0C8DC465E9949A96665AB78F41132F96F3680B5A9A79DC44 828FBDA04368F277C40F629961EAA9F3B253276EE252478A9F409C2FB6447C65 37AB9FC9A216970D7BF6912FAFC92BA0C000A58950291FB3E47F0DFD493EC7CC A99555CACEB7EC87F4250AB92E7136500138087A19053E9152B6F007B8D3DE8C 96224FF8D464BD3289C08AD1E05B9D063375F38FD42CE97ADAC4E5B83B8A88D2 B2634B95A0DC0AE6A407E62D153BFC434B42680FD0F62F5FCF0818182F182D1D 6B9EBD47149F8506CF38BA61D8AE460A8B660F40DEFBC9243154E5683EA8D574 8D48276FE5128F972D96E42D89E374F7D8C72E70F84F028263507BC96F6B2B92 EF4B992CA46361BA3EDB888A6E5C57688198EF10A616F7DCCA55B4E1645FFBEA C2201D5503101C400B147CA23A805AA95FF059120C677C32ADC486DCA6E775EC 23BB704624D3755E09505C395CC3AB83D68F10E2D6E1497BC179F3CA82A3DFC2 38275D10D3253264BA9C32DA47C0088660037C7A789C1DAF75D0476BA9ED5B62 CD30BA0E268DF3537F8298BDDCA16B1C970C2863B21CD839FF6B713438447A4C C58C1F0ECE39E126AAC2353E31B6FB808253501CF26AA3AC48433D4CE5A946BF 10347C814A195929213655345791FAEB7986B1DD4F2B0C9E7116B11A4F1157CB 933B48B488B7DFE700423AD4FAA7E26F003B87B6255BB607A3A639830D68D663 A3350CDD992B528E3D2176DAF79AC03F6455B1BD626ED15299042B46F03BB46B 992109329C6F67F1CD92A620FB4D806558D6CFDD75DE4F7D6C558CD5325302BF ABBF40001F90CC940511F63F32F112EB958944E37A603642C0CDFC7941D9EC65 F1F5B2805EC17A6662FABEAC3F1A7CE8A4958D64FCD57759F5CA294236B5834B 0071972DBCFAE0D89A1BA76FA1EEF2C8ACB12E45C8D8939B3EF1DA3970ECD2A3 30AE415757A89E44CED997FFF9F6378FDB532ADAFB25872A690137609D91405F 4FDA7B432D432325F1467A7C85363A9E2825F86D5B9F9523E53FC5B58D82CB28 90D43D172B2CBABDA71E5B83928A6271468C197108584BE45647AF5C9BD930E4 18E321AE20B3D28980B1CA53F8B2696043BCC4C925F218B0AFF8E8C2BC1B85A9 134BD28FC51E5F4E803761720601C5D9D87921116C342D832BB14EFA08032E5D 7C0C4F14F118883DBB1CA0313B6658E3BB5A7ABBA4970CAB64E66515031BEEA7 F0311CD7DF8CCADCB38103DBB1D60CE59FEF567B2755D0A65100C8F8EA622025 4AFEC5D179796C4F87808A76B3F420A228544CC12427AE7A5E2FB6CD76D4668D BD5A22FF8161EF3FB20EE9FE64EFC4D1E466DEF81D20A395B020BDB7358E80D0 6CCBBB8725B9AB973B060770E4CB902F429D75295D1E5ADA0BDC01D0DA7A4ED2 A21346CC735F3E6662B87BCDED41C39EB2174C5ABD9C89A4A6554B3523E08BAD F208FFE1095E6641C548DC0B7116851695AE8813E691347526DA61EC59DB43E1 03BD503968825F7EA207E22EA04656780C15E1E9D0A00CF8CEEC4D3FD48A4E93 7E82A2D0F952F5ED616618739ADDA48480DA4665526260E4269F135C89C2F28C 28B435A1A40C924B79934D6CC536A58D2F102CB46E4C3F6F5390008A7C7B5E28 4044E385A5D6FBE641B6FB074C4E15DB9D25152E503EB7DB52F45913FBD962C4 550310BC3592CF1C56A7E19A73261219812CA9A818856901E9F0FC46FA53FD67 20A7AF35375DC845C8A9BC82F46C061F46233CE3F963C6AC49CCE0936A1813CC F7904CBE756A07106AC3D9B58C28EB405FE50A12710C7FA7B4F6900E163125DC 43672E2C565C6959C412F7CC333F49E0FF5B1AE666E0770255C43E1779A67D7A BD794057140D8D1478B7B3C43C84C2C2E56DCA12A1A536F80B16BF9C5244FFB6 906F2729E0D6C3A6AE9A837CF39F81668CE7B299F4EC9825892A961935E4C81D 7A9FE5D9431283C53770E41DB77A70500A9B21D63B2F073D75D8E11579FF7C63 3D1BD1D11EA3C49A594D1D83A733ADB8D887AABCB81C32E3913FC4B2DD1DFF11 10C193CD5D5D5FDC8080F9B99C9B29A86ACFD94EAC9E052790D6A46E5A5E946F 6AB9541056CC23323C09CBA556F1B0F28BA2C30E039B3552DDBAC17B9311BF1F 648D3527E8650B3FC89CF81256E9A4A9054D9F1A9839BF7E0B875D25EAC8AFA8 2B5663DAD7CC7DED3206BF5957291DF837535DB23BA63F9F7ACA7141E1490A68 327E35FB7888C160C2D47BC4A7CD84194FF52646DF43AC83A51489481CBA4D20 1E5094E7AC3EE66A5828BF1D87A530D7786577F164AC3D5C0D624FC6CF1DDFFF C2 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMBX10 %!PS-AdobeFont-1.1: CMBX10 1.00B %%CreationDate: 1992 Feb 19 19:54:06 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMBX10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 13 /fl put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 123 /endash put readonly def /FontBBox{-301 -250 1164 946}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91 FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68 7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4 9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176 CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D 6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6 E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E 8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E 3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99 EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4 0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9 4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209615BC08173FF 1805BDFCCA4B11F50D6BD483FD8639F9E8D0245B463D65A0F12C26C8A8EE2910 757696C3F13144D8EA5649816AAD61A949C3A723ABB585990593F20A35CD6B7E 0FA0AD8551CEE41F61924DC36A464A10A1B14C33FAFB04862E30C66C1BC55665 6D07D93B8C0D596E109EE2B1AAB479F7FAA35279ADB468A624BE26D527BFF5ED E067598E1B8B78188FA4BCFB0B51692D07B0BEBB930C6F0997B437E2C51B876B 61A563A2673932C2045833FAA35DB22ADE12102335D5DC734AE3AC5EEE6658D7 92EB62131E1DFBA441F53EFF9021D9D4C491F26BE8F54C61165CAD778CE8695C EEAF70E3B20C64D4C2B34A084B5770BAB2A974E898F62BFE90F132A37E2DCA4F 43E13DB13C94DFA8ECE2B7374827AE168634FA007F8981ADA046CED3448BF453 FCD9A4F194FA648F9FC0971734BB69CB73439CB0DD021D44A7C11BF295E81733 4DFBA460FF3D654F9FB337E99E6D66FBA87A817EB9CA1536C84833870E3626DA 55D48DE850D3E6F6B29DA0E7C9D681283586F208DB8D58042E3A7CE55BE84822 C98237911453E479EAB65AFEBA3F61A763B40E74535BE56C9D8D06DDF9441741 5C9D9D917439368736619717FAB4F06E2C329AE0BA411F3FD522D9C33AD8369B D7DCC9DF993778482F35F965973DE876FA19E109AA198A00658AB3F0D8E3DDD1 08A573F2D525202AFC57E05D141E6C0BB811E1FE280EEA002B7A45BB363AD06C 318D320D2C81AA5DCC842CEF66E7DF7670588CB39C9F42EE7763A3A17372432A 173BDEF7ECCEA297CCDD76A835C36DCE9DB8F8CB66CC71B4920CF5BF055A5260 5B41A5373BA6E4F63C85671D979EA5EC30D22163E6D206168A3827F465279870 CA80E6632872F721BBCC622EE4214BF723551C846765495FA9921E11FE1A950A 53150C3F5D8595958A47E0B16064CC3AFD65DA294FFD111153F4F233BC5468AE 69585C16CFBFCA32C4B96C161F47B56661DF84FCD8ADD3EC086CFB6BB5179BC3 A5469A1CFBC8620BC711F42D0D3139BCE4E38698D9C574450DB43B5A19FA6D54 0368BA9F7A8DBF96DCD0B8968CD194264E6DD10A958846C278B8C2BAFE7AAF8B 44C84C955F1A89A13E62A054BC76CABBBF6296DE00A79CD7C8C61C70F127618E 9975B59A880685E126F57AD80F8F4D376E1B476BDFDAC868FB6AFAD9D694B561 001623C4D9F55366D053B52F2B09EC08B81901AE0986C5350312E626006038AD AC15FE313FCEE1A2E61F8992AC00CA7BB7F997707EA377D37EA6FF35BFBC2866 A572B31491F9B80445685DBA5E62F166E80589F768FC95BBC79158C23B2F1BD1 25816F1486A64F76D99A638AC0DC101FDF390811B3C118C2D972B2E7587F6F24 7F1DB2DD922D237A7D18FF08FD665355CFBBEE799D3BFF11CD94CFFDBA3E725E DCF4CDE4307E3B199D91893A365D04F43A5305BDD2538E28A0788E061F3A621A B4A04E5063B47F0109C1693A284FA43E8F1EA9B68145FF51C005D3FA40713BA8 1879BFC3CAA881B9D885A0C1AA8BBEA7EF469AEFA06ECD3C26AABD535E9FBDC5 CF858BFCD827A42CC5CCC4F1353A38204E89F80CAB3A5536F848EDDE1590A2A0 EA53A5B5EE4BA2E44C0C4D37FF0C41E493FEDA6F034B72EE3B707AFEB7C95948 628FF2D0AB46CE262FD48BE38A9EE135DD3B964F2AF6FFF727171FB2CFE03BD8 F283FB6832C3E3F7CBB8BCAB0832CF2A8E614BBB3247CBFF413C62B66BA53CF6 7389EECA675BFB2D7009025507988F15A89EA5E8FF18D4EFF6B7F9ED4839B6A4 4DB456F527A910A57679CAFB925C92C2FD4006211445542DB24AF25F0A8294A0 F1BA550A79E1DF637DA2BE0CBF54E3BC900DE2705FA5D39117C6D60A211DA570 1767730698E8B894239BD9C1479A7699323FF448A4F09CBCD2043D643F79E5E2 CE906E4CB48B87061E31ADC961CA1572AC8421BF39F7B411A9BC24ED53983C6F 280083C9FDB651061980B7EE9E0BE46BAC8438B7132A178EF85333C42EC96662 9492603E81D660C04F6E987221B84C126C873E07F3B98AE2A812AC2568AA2E8A 72C259E8E211C93C5992E5B91E4FDCF0A013C092BFA8D61ADAF8389FE6688DC1 2A12C63DA97FADA57C63B04286013D500D4822CC00B28E69FA8B88476BCBD72C E1B718D6816ED04D0FBE296C78C624CA87F733A380F3C12B78DB753F530193B4 BC9E65854D70F30113CE1588F9D8F4CF58C2957F6D1CB60AD691E34096B2B948 665A1300370E44AE4D60D397F1B658B8357000741C3BE421F43FAD7ADE8D4CA5 741A22D4A3F3AFCB9EBCB3477177A84F830F1ACD31FB2CD8276F2A1760F18DD9 9463F7A5A088FD208BDA366EB3DDB54F282ACFFAAB16D9B87E4AC50CD4A575B0 B007F1B7E01A38E0C8565C6F6585A6C05E135FFE9E6037B329B40186EA50AFD0 C7057CA38298785CECB63CD90655973B685127E2A2A91AC15345BA13809BACBB FDCE0964CAD6AAB6A85272153875509A1116053D567F9FA3EE9DEEE5D12BEF3D 6C5B2A763032B63CFD0B11ED4C637785645834CFD8A747DA02E2F0BF58CF672C 51E70D28F597401FBF69184D107AB428352CF1E5B9701C19D41A876021F51B67 428DA3CA69671A093F1D84EE6E798D4286EE54FCEF336B70AB47BABE86BACCDB A8DB615605BFD7F4527E12C75ACC1CE12B189FE713AC52C6F9A22CD5E9AC3418 5C68D4288C4A4D29D73D7DCE4752341D585C28DB25833B84254A97147281FB0B 1ED5CC4CE8FDD9A4FD8EE732E42B125744B24BD4FA5526F686E48BFD3C3E03B7 F90DC8BDD1B4D7FE9F2B6B10AC6C86D3652D3B7AEDF7AA8E648D07742E8A7AE1 6DBB45F45371CA72152CCBC869D0F6104C18B4B1DA776B20828AD4D9C842F9AC B6DE849631796C7FBEFBA84250099E094B674CE2661E5D372181B53D1C87B7A7 8B89FB2C2F4C554D0070740567A19AFA1E6DCCAE34F7D120816E023DED808FAA 58A41C24C9772D489094C0646F38D7B3F2B03C50FA45C45820952CD8EF75DD39 58FF43220B4B5A2A23973B8184CC672182172B4DDD815C4F3D918846332FF954 91161E6000BF3A2A9550BA1E59A1ED6DD1CB797BB4D370C8B4199CDDCD7C9C32 D649DFE4D65A38795C41F6E1FC4FBB32ABE85139820DBDE6B8EE809921AF1E51 F8ED24B78F545A1FF5D0478AE6A5EC36DCE94FAB6B363A3FBC0850D61D5D4451 53C0076C30AC1ECF2DA02DD70ADF3C50C6BD481A97D5E51BC2B916AC5221112C 8500313FF36734A9F3785DDD41EBDC991ACF3A3AF93F1814E4CF363015D836C8 D4555B03B93097D6F59B4CD4B6C953D3FF18B8E6CB0F07E81CC5AE57C85731BE 55DE2211098D6C0E5D0BCFC7CFC96802116E962EB4487A0FEEF9A107C59828AC 207880407FC37647909143F1084B5DA39EFB2CA4330B9FCF8ED25DDA27101F97 4ACEE685A4F6CDA7CED6BCCADCC4818D751437B472F7E06B13C79A25BFA76436 8C1D5B68BEAE9D9098575C69416E8A1773F34B84CD3292EBD3D32C2B17F29E35 2BD18399FD17B9F765BF925AA30BEC88A9FE1E9000445D740409FF4D2A9AFDD3 3B26D73F0BE22D42A7D54F624AC2062B38586C5195950C19E2EF5548594AA381 B83DCD307B7F753A4032651F32E726E2641945CE2115E14E4096123F6AE6EB02 90A6331C9991520D8981A0B8EDABFF74A776F4F15E76C44AAF7238E2E4A6E9EC 5B596EA5687FD6051A0E34D78CCB8B0194AF45098A1DE9A6ED14C3E2003D20B4 6289B3267FCD8AA061153A1304ECF7C72B52A3637856AD71D43FF43B8A5248FA 8D303651CD74A4778C5712CE1876E29464B745E018487ACB041AAA1A86A112F8 25B8BE04E6045CE3B68934F181C5B946209F9D361F35E446273C1A30F059B3E8 27C8C22EED80B6F3C4570A69F3A76F65BDA7D955455F0905736F73E17CFCE676 5EFC533E3C428BBEEC416644DB111D80AE56684F1AEA0963E8CE098F186A238C 2CCEE5656DD9D88C067E57BB8602E44564FE8B2E05B3496BFD86CC520ECC1FA3 27F467655A343842AC081E5D557B720942386F3BBEC5C66B5D4FEB163330A004 B8EAF57E33A932522BFC800C9FC6FE1E6FD18D9EE74B7097A15341F44F470BFC 8A61ED5E522BDED4A699F7E18FF784B0709380F127193A2BB36788589AD3C08C 995F47D2E28EC89667FDF665249FD806AF8B772FD81B64AFBB842DEAA94242F9 C0A640BAD51542296CAF3FAA2CAC3B67808EC6A2C0945FC8B239C1F4A2C2D6F4 F3FA9D6923EABF0FDC118FBDF10594C1736DAF9F94CB28D5561BEC43E3D9E648 8EAE6FC5900987D5D0191FDFE3AC13C25170E1BB2BA89877F96DFEEDB10E892A D1BBCD458BED94F2D9B48A64E735F5F5E6D8FFEDF21E8C1A9AABFAD01E9A81CE F56624FFEB5234B64E0C309A723F8B85F661BB77D4EDFD02A0869BC0D285F1CA 66213A6104801DDD417563F0A1EB12E22348062F4225A0483A922E960360FA92 48A0F8E8058E6E188691B07860DE293A10A44D173243A43B7106C9CEFB145FD5 6E4A336AB696EA79C704B1E08CE8A7C89FEA8D60407CE3FC59414C79C910037A 3A2DFBEE6E566EF1145E721925D0FDEFE36AB71271D8936CA370B2192044A2A5 28BF047E192D2DC8071AE5CC35FEBD444A6EF62D42D2F49EDD2863A04AFFE4F5 4666D06DBFEFF1A7E7B0224503077AE199198D0FD7ABFCB1FFFD47594A04E5A0 DE9C7070DB49FFDBC1983B90C65A4649C1F407475D413A42C42A488F7B13B0ED F5221712195CBC6E455833AE021CA61F13E3F75E34A67B8F510E6F13ECCAE1A1 F2CB78915BA2125A28576A5F88E20A8BB7B663530FAE4EDD2FE99D6C43CFA087 C65A3DE7E4104C245C3C1D4B189A9A67FA45446D9653890B8DBB00C9956CDC1D 03C47C0B1B425CE3777BB10895E81521E45D695A58FF43ED6677C2010CB2F11C 61BAAFF80C5C0BE8A6A41D1F7C2284F46B5B005E152C10CF79C509E34CDD6395 239B199B53D14CF9F344BCA850C22D639F22963C2DD1C00E7356E66DDDAA32FA D35AF66CE02EC336C587CDA847394C521ACC4B94D7479E907824264533DD8A02 77889D385E8F8A25058BACF4A8334711A8C4F785E75F38AF7157A69B55600E59 9A549ED8B96F2A3C59E79C9EEA7BFADFFB4B71C0D043489437EC1F432AC5281D 3DF7FE5BAC858F4399E5BAF6B601A40DC711E0C95EFE7B02D7B0BEA88DACC708 CE53D1BA85000D06D4F2ABBE62704D9FC49A50F40E94F5AD9DD00AC767D80EEA D84BD73F97DDF02B278C0DB69715BA7402FDF7658CE5EA3128EEA253BA61333B F814AB04FFCB85D73E40CDE20FD7E53530591C8E38D080150730B6C6FD56BA5C 5555348870CC995276D098C8A308B460DEC05D32B499C220E68A6C029459BC21 B09A60153D5FB4B5BC5AE72FEFA92DA4F259C8D89078360F8147A636796F0CA3 6727DE1409280E08E9B697B4C2B675678FA6932CE72E8490CF63601AA5148C37 0A451D16BDA332B671DCD7FD43491A26218DFFE6CCDEE046183568911CFF58BF E89C36547DDCA6B044695CF53326540719DDAAC8D8230436EC3A7813CF452DA9 9170EBDDF4D0D9861552F51E2B59281617C3519675EEA10B657AE1A20DD8B753 9E410DA75470D0729D34CBA455E8E3FFECD19715F2A1347806928A2BC24B47C0 76C078B5D269EA7692B606C923374628E798BF63406B8A264FF40A1929CD1702 9C1842A6CF9A91AED2FBFDE9D6881FC767816A6BA0FD86CEC55A0FB59D00A9C3 3DE782C25404B2E5AD6504CA5C28F8AD41BAF5F987794C98A754A43886CE9F92 8B84664993FD4F4D18C0F8E64E12DA8E517F8D3E0AE1DB2B297C14F5D736C958 2A2D0D7EC611CE03D5509EC5F24B9B37B50B32EA573D12C2F5F97E0EF1BD5BEB 212B28D503C52B0DFF52FC5D93E17001BD120256903F0E2912DD4596BD0CA7A6 822BD53DC607F0B9D0B4C885E6126507DB80DAA99BE7675F7888857A77B56C85 E7AA497D5D058331E2CF16CFCF70C0EF794E936CAED8CB126C1ACAA5A382972E 287EF8221F23AE7A50DD0473140547D7F4C6546A83C1988112C3C41C2988522C 28BD8AEE48A9D9871BAF3940BD8235D74B84B5CE85119EF4A1F9EAA625ECFEE1 01C8EC38530068B0E0A8EC54773A5E7C9CA39F21E3ADD804F0CBE4163363F888 F956F10BD8F9FD7968EE0BCED8665CC6CB4DFB4A7FA35E95348213F8707274BE 737AC0EBDF1DE80EB77662F4B28CFD396A2F2D78B903A32BDAC512838724F496 C6008E7EBF54815A6BD3659DE0B1BD6F41E25974AB69B5D6009E35E127C9ADB8 58886358F5689D326AC39C257B5086290E864AFDDB385B0AFBEFB5FB92388144 0CAD93CA5869A390E77DEC3C0D9F47976FB272B55468497B15C72A6B3C6B8D6A 8209EBC9A64317EDDA8AFB55FE1988D54940062643A53F4C900FC6DFA6BA6490 821E44D9CB541F99377236DAF516C1A54A9E0E8FFE668D8668F458AC2E8B18BD 02294B7E458B085B8D532C28672BFA0E4938F3BC07EBB5385DC59A8975828134 3BE1667E3B80DF9C3ED3E7FDDC81231285EFC1C3BDD6830E6A19C0F9E3603D9C 75B1A325A57C7B1CE74CC316640D0480E1BAA3100320AC3E9978A62E02BD2AF5 F4077E41D575CF21872AC8C0BBD43AFB77828293497F719FA70F401060FF66D5 1ECD343563A44FB3096B0D559A8D545BF5C2AA24639702B3DD7B9A7B35CDF63B 78E0FE01C56447E3A75B0E234926AAE086076122D13DD702DE793EF33F8D338B 7222B7F172521583A24E110F1E47D3787E7D0B754BEC3FCDD2977960FF5F7379 7D070E7C9C2A6E4A5A76AF2D4FAE46784F48B932FBE3BED9BEF7CC9C6C201C71 F5E421C400C42B574EDB018A531F526E872689156A742ADBAB9B0756DFBDE441 9E474CE7696CE619BDA837BDBA7715177EB5678E3499524A4688E0C7654FB8FD A1EF73653F016500AC6750D6863AF5758F21DB57079BA0843E6F7CA650C30401 9874654039522320252C0EBD737BE10C8EA7386CE43DBA57247E925FC10E41A0 C90934B50ACDD7276AE13B415B7920BFBCF4E5AE600D610E5AF87AC812957098 03AC89394A9356182BE57D267AD48171154AFF38E68C0A206972A763AFC41D60 24BBE9477A7574D5294779A97A0AC24D4C8D25807B646CE2B2E3CA2180730303 BEE1E3AF1A5BDA2A89A6659CE89E1885A021166F8C2E601E7C66907F0ADA00B4 7ADE58D0916A851F8529E96ECB0F349C2363506041D795FDA75F501F994472CB C681C14BAEEFEF1E4F5C8EEA9E29092953B5080F999E84976C79523A514784C0 B39A732C56D0C4E66B2CDAD79BF58BE5143414E213D3C1AB235E0F0D0E49DF07 B65A77B6BC38FB775093516C0F5CEE83685C4EE9D7AFD411BCE0A853C5D82D84 6786547ACB732E2D5A6FE77BA001CDECAF471CA5920A539C365279D44FB4A6B8 892FB1ACAF371EFCFB6436B042BCFDCBA87C2A336512B33337E55C959D90CD8C 7FB2F3A3388BC48D21E30E1CAEDD66B9DAC7E1CCC290E4E76D8F70FF55C8183D F43A802E6B1199D0C06C301924CFCC45D5CC1D2F766DAC4695B71522179E6DDE 891356370C21A4F413791EF232256FCB508835544F5D790C0ECD8174217B4508 ABEFDACDF0A13A9FA50FEA468C226D642AF59F128154A545E10EB1C9911999C9 13223EA0F36B53E667C4927846F996E2B894C852C8F62682C00D15897F4786B7 91BE92A9AF22B9B0DE6C51DE226AB4CF4819AF1A166B1D05FAA7AE26CFA454D1 3123A17A971D552B30331520E2390407FFDF77B9615C0CAAC611E8AD247F8D08 51FAB3898C050BB4CF2F40568A84579147D9411D998C634BFC779633C8CC599F 079016EE1F2DD3C15EA092332AF4C92CB8EB4CC19E129B6C930D34F0E28BB101 6E6CF4B30AA8F20F26DFB7F97B39DCBC1994A31CA146740342CC6D60F9DCB1E9 6D0B4FE34C4865793573D796E8B0CDD3CB3FBB5E097318B0D4762B0A507E34B7 12E77152BEF1C0AC1C684E911F4268D069268C7D8D5E66017374D76FD3C9C77C 2816E43B98166ACD5120638C507C95878C70F90F176487043CAD867085319255 FDF1CF144C784FC9474F9E74EF5A744CEC3D02EEAFAA59643A20640A0B722880 F7B370F96E65C714BCCB42FC429ADFB7B3CD3D7949693B7C8F1B9635FA0F4C93 FDAFA1E77794255AE729B8B36C4A7C8D5DED3C44B8CA918DD417455674A99202 5EC1487B18636D33885BB86A533DAB15650AAF3EC4F1947276BFA7C975B7BE45 B266FB90974C8F9207C290CF48DD954527C2750EFBCB7892950223F933A7E0C9 7B9F36E9983F3C0DEF2BD0D37AB17DAA7576C33B2F507ECC3889E4ABB772EB66 4FA7339792AFB8525CB7925AD93E2DDD8FF7A0DB46B267F131B5D127353C6DD6 F97D945B486974163FD678DB63CF6BECEDAE98A32CD8387ED866963389A29942 5EA2C271403829066A41A8E8F2D4DE4BCA1B1F8C92FB612548E5B258BB1A33FB D047B687AD06434BD2E2EC637D77EB649C7425DE34265BF1F1C68F7D1D39FE81 84991923F23E495FDA0BFB86AB92FDE37909790C7C010C59058113F34AFAAA4C 68304430CC4502C838CAB74E2FED54B65861F2F83E25E87563FA16210ACE96ED ADB2B72E11DFDAFE64F1E848EFD62C8A8F130B7EC4C7FEB58BC4C1172C31D05A A5EA82FBDE0CBC6FBBE1688815D726DE9E1FED1965A1A5CE18CD88AC4C7144FD B61BE15E3E7CD9D5B621071D0DAAF31EA5CEC3B74A71A41160560287EDC48E46 31980CCA5582312A51C13779DB7225B566D6CCEEE21EE55DA2EEA974D034D58F 3F3315D5DB0F7BAB48324312A05BDD93C27BCC300014C7FDDBFE406BA0E1D9AE 03FF92EB5D008FA99DC66A8DDC9EA4555EAFD8507CEEA1BB4DA76E2ED7D37AB7 E38FA645A18D95A5BA05D48471FB0EB4A27085E55ABED5733179171D8F2C8E08 BD2ADB2FDC15EFFA94C56BACCB51DAD1102149DFFA95B622C4A52BEB957A6A68 5CA82CDF39BADF03EEF3702E42128C039F6D70D7803C6E8329EDFF01F232B68F 9181086ECE992EA5C7D0646AB18ADF00DDB02F9548A8EB148B240D4B460893A0 23403270A3DCA3AA3A111E6D905D39CF37B2EDA9C02A9998ACF9842BC2860333 A905AFA04EFFE45A32E46CA115B25EBB76C8EC3FC086C982504FC8F5FC16FDA6 FD5D13487157C880D9C60D2FB61124B7AB9FE6132D11F3062412EC9C9B49E4F5 1281D4D635CD25E041A31D871D77AFDFD3FDEC1A8C5A8FC5B58C199412A0D2D0 F546960E71E3AB46DA0B00B9E9D233BA739289A596CC965BFC9904917B0FD7C2 263520B5E946444D30C2779A58B3CCEDB70026EE8845543A67FDD73ECFBCF392 53EEC8E0E8F64EFCD5CB274F23205B28CE5F0C8990ACAB7AD3678BC40B909E89 71BC78031D1CC53CE1E8113302BB98D783726F828B030E9ACCABF1D4B96790EA 99C24E10481FF3F7EA7A1FF9391A68C016679BF78FE9D9BABBFF88DEFBDF83A3 A5EFA48EA61E72DE9CCA4DAF337C3411CD09ED05DF0CF6D33A3546660934C752 1D3E3E5EAABC1C17A9C63EC362B05E0CC2FCE41E19029D45146893798B888D08 93098BFE98D56F1EF85123DD15EFC8A7D981B0548BCE004BCF1332746234E842 2EF6DD417B66ACDF398EB5F15E48E4C022B2256EFD38554031C98E3F6EB4DD55 CB6F74682AB5C188E1C8461FDE0D11A6B72FE585F93E2B78513266A14F826CA5 E774DC9270972866B8C2B006C466797C46629E2F23AD75C2A5E9DAAF63FDE903 5D2657DBCF9EC9BDA54E312B731CB8342B11322666377BA40A0DBE57271C172B 5BC823E0FB1E7C0A0D90CE91DE39393A32211ABED86FBEF6D775FCFC83F43346 83DDCD56C6BF2679FE0826116E3CD26D5A8C073F2C1D4860EA178DC8D7FE06B3 12EDAC5069B59C5B08CD95B5D256EDAE3D41702458D481300D15A2BAC7A41A0E 3C07B203625F44F65A8398F59EC33A85D6C9B81F628335AE90EB470091F49B8C A2A6BA0C84609BE16D6B9D15A52BFD8B8E2C5A6242EFF2FD9712661336691C8F B107CC09BBEB1F81CF9AE9CFC93630EA31C0D06E27B2FF3FE7C3533E20965B9C 1C38FEF4EA3872CDEA07452F01AD7B940E1134C989C29E6809DE868852A0A192 AB1BB0DCE5B31D387A51DE539046B96E97F4B5716B2CE0D823415BCD2703F531 ECE8939FA6A88BABD53FACF8AB53F7508022F96AF9D7483EC3D92F2FE828AADE 9F4BC823B2926D27C6FED784C7F547DD171687F5B6166CEDC183E9D06677ACE3 04A651D6F557D8CEAB85BA65D1290FFAD8317499BFA414B980E5B11FCFCBC9A3 D12B8BE655B1344F873BE186DE81F0F869984360C282E94FDDBBE3496F140702 78ED97BD7A9824C3EB30CDD828A85BF8417EC21BFD355ABEF2D4A859BAAB1A48 92CE05A611130E409B6C1FCFA93E2C5286FF43C61C4EB7CB44E734334A2232BB 62E3DDE12D28A6D4E895477751FDC39AA461CCC9958AA8D3148BF2E64A90B940 CF76A915B7F1B9843723367AF3F02699D24F25FE750C254E92C3D41FEABCCA77 3E738FAE947BF4E898E1DC18E0D231D5421F575CAFA71D0B8F7624CBF426C5A8 E0ED612AEDE24B7DA183CC5AC3EA7D8F66051BFA6069117A0AC6929150636E63 3D82B23DEA382633B700696AC9199DB42A7C92A87DE3FCEB8DDD699579EF1909 080F38172946C1CD7745685B0748988E8181ED1222FF5F221956BC1DF6314619 77BE30EC99A027D5E0DB32C20B30D10913F03960A0B565B347EA072DEBE5A4A8 B3B543BDD11D63DC5678D758883500BD8A43CB9FFEFDA0D93DE8E05FF07F22E8 E76ECBFDFA0D8B3A556A6FB563499A99B6A9872C7F3CF2F4A6B3A127277068CC BFEF0F9AE37E19EB34A2BF7E3C444C0373459510CBCEEC3CAC840E2FE36EB4B4 CBBB6E7B164C6254920F65DA85E5ED67765D80305CAC8D957901C50A9A8A7D19 B62F2A6841D9A08BF563DFF36E8FB9C20F22A17819504FF99C91123DAFAEC33E 9F2BEB418B72699B6397A320DEDB24206F12D8480F43987794E9BA63AD2F5249 123BE8D7FC036980BC7D79E0F4AEE381CE7D01243429624F8B6ECA5A131D34E3 010645E89D5832939A052E62B3EECD0FD885343D09EC2D3DB53FDD30241ADB64 573146DCD8AA7A828623BDEF0C286F5C06DAEC36F87C65FC65DA2DC99DCAC615 2A653C1966B0EF2C538C6E98EB0D659EB31C06517FFD8CAE8EBC96C406E6B21E 6130EB81745119F899968464726882D83CFD3F7EB34A854C49FDD6C85A75E4D7 803E348A320CCF55FE3149995DB02C0327436F06954D23F4CEFC13E40F1DBA04 3C2C74D067734508F3541A3CC504F8796EC68866E15F96324CAC5CE45F880BB7 AAD299ED38BEFE52FFAA41616C2278B5EA7C7C147F8764875650F93FC90A164C BE71F1460DAF03A1AEF7B807AAC658E0DA6303A89805BCF24DE156351BBA85A9 272B4F6986FDA976D4D433BE4A35361828DD8ECCD9A199AD430806DE1086B848 1A464214B3954378FE7CED36319E5FFC30D1E34235DDA29F1C54D6FB374D7EF9 4BBCC0585B1C231A90EA3F888FD3772D040782E12888D1AEBC3DC2BC11EB1F2A F98AC954055A19768A90B157BAC72C0BB23A94D33A14FA20DB4F534D3E71FA62 A712B43FED4240D5C9B5527DF04A7A0BBDC0A6C419CE5A67791C18709186895D 481A790A1DB611CCECD72D0FA67D19C4B353C8B07BD39FB2E0C680CFDF6D594D 62DDBC66655A93F1942DAA54898E85B90EDB09C3DF48577EB396369F911B0E41 873732766541E0B7C4923218DAB5A53567B41CAD600B8AC79B8693A0DC994828 592ED527FB1ED1FAAA4D81F9BDFFEBC2E95CDFD9192D8FD1B27EB71D68F7AEC1 F7369898AB5345AAD7E4A831DF5DF2150E22C1D740683141A4808F48ABB00426 9C6CCCB8DB890D70713E50E78497C8D533357C41F5815F5482C7C8992DDE3278 C03CDB3A6BEC28536D151BD58DE5F05640047DCA4A929AA739EC261056F920A3 8321817210F5D87B752AE755140AA64420616DA69DCBB330351FAFBCC35E85C5 923A6545FFD8D676133A3438B032ACAD63E768691237E9C8201ED2C70247BDED 449C1CD216B9BE9576BED07CDFFFC55EDA74AE7FC4EA976A8887C6F3AA9E072C 5438A496B4B3B3254264E029EFCF924A8422CA110143907A74243C5CDD38C938 AC22138BBCD4E13F4FD1C5BD22520A973EBC7244369B60E67A39A72E4E6B0936 B16314E84AAD4EE60EECCCB55F06056E1A4B16346453738F493CAAA8A5DA656D 9E0ECF40BE7B3A5EF61EB166E3599EFFD43000B3802F65C1B6F9DA050A5B4F35 497054C3864F8780B8F7933873D78DA35892682D7635296DF257660F0DFBC244 36BC679EE621F7BD7B21B5F4831D66E65AF95C2A384EFFB913C9E8C6C7F7972B E84F537B9FC3DFDB135B142536C2B712E529950674E416130EBFD8B77567D109 5D8417C24C75505160C76051704CFC196105A616F9FE4D7440BD1C562A5C09A0 1A47DB3AECA125AABB17500DBC19485308E094634BB8539BA9681BFD89BAA13D F3352E6DC17BFE9F1447C2154140AF8D1FF03CA5589DF9938F16E3BEE4026D87 C995020A6A2A6039B72209FE523750CD9EDE5D913980FC5958D933DCF2DA9D75 BD25C9C082448D424532DD784F5E67BCD75979839E5461B2FC2242FA9C9D14BA 7C3D44B6CCFDED6566C482F672ADA2002C2892BAC450E4568E005439FDEEFBC5 7774E2CEE94EFB3B4D194A76172056AB3501F3FC24A1B31B9CD26F3BF4DEE640 079A17CD27D53AC8CD54A5DD8B8139BB09C9D99081CF793942E26B3C2349DC22 9DCF97ADA05F2F38CCB7C573DA07E62271B58BCD5DDE35890ED6D5C327C5EBC7 F09DD7C30E6E8B56D13D0A7EEB82B89FD473DE94A6C84905E450F1D5A15E3AB9 20776D4282EF5DE97A24633872152EFCF16CC4CFFA7DBD3D63B8A4A2BDD946F1 642676A8D10961C4FF0B1E1299EE165A0AAD4BDB115F48BA9C665E2BA41F5E09 E858B30B5FF79483B40E25EC8B1B206F1B23855406586ED1DB0B7192B55C4161 6E6E482A5C44673507E79B31203D8C7618E4DCD5631BB983F6B8C1998DCEC56C 3A21F7453AFEACDB1D8DCC85AD484B280587750622805CBD08400ADD589B0881 9AEEDDB5B287551202BE2E8EB3E9AB73B96A2E6C51C7DE9CA064F5E9623882DC 656023A82E9C53A5A28C7D4C399CDF5AFAE1EE4788AB0C65031C529CADEB1902 7635D1825907E3B2729033EBE8A7FDB3FB4A0C4FE8425D0A28BA52D3DA73596E 23A414B0811D4E10514113430AC332D0BF99F24CE96194CBF64B20DF7E95B4BC 0CA81AE0F26B02D16F644552E0AC0966EA1F9020220583A2F0AFBE296B565431 259C4131F52C2A68BF0FE441CFC352D054400EC871D30BF9543F0E599D1423CF AA320C930D7D2BAFEA037EFD2645229698258C53F8EFCAF09518640A22FD0FB3 8517A91301D5A6255AAACDED7E0D3B8A966BDB134F81AC62862A500193BC42B3 45DE41EBF2451523D8D76472D0CC0C041B19AA55DE02373D21DAF6542EE9C611 97097D04CC06B4C6D4DE513E0D0CF74F24CA14A82D26AE74F32F5AA734CA18C8 055F3529D53FF41D07B8EACF13F6D4D4A02EDFAD8759DF6FC6943D0E14E3AFBA F1F0C1D90DADA57E8C8396F5130BD04A7753AF229C715EFDF65777AEA9B1F6A2 CB910BF0526C07FA51A7E177D1FC6CBA3EAA42734C5853B83A0D662F6A0CB682 AA309938E785FD07640F7F4DD443AD42856C28FC7B1C017804AC7C363843A55D C214D1B48268E3FB656D5D2F3FA2F769D3EFB49B0D960550BA821D00951633AB 16EF6D0621F870B5BFEB5CE20323776DF21EEDFDB584BAB224B3438ADB9D2567 0A3FA10A1E5FD10FEC04990EEADB84463EAD45216C11AC0F5B08C5E3C9B89607 9107D04F63914BD6F3FA470323EFCAEBFCD31391451CDC1C991B023B306A030A 9495113751C2858ABA81E35988DCF4CE614670E440C721F17EECB7E1AB504E02 0374365E0C9B6EEA6E7740DD592A859533FDC5B683AC3027B02934111EF344C2 EED2DFE85BBE7B051E8C0B59B87CFB6427AEE7B6AAC93229C75913460571C86C DC5D92DD1024E01FFC6C41A4224391694FF08064A86438593C0D89B47EAD2299 27C8EE5888220A8DFAB0D324BC491874532435A421E1855EE71C98E756A0158E 6A9FF3C7F80FD0AA14550A604FB1F6F220FA0962D8776CA0435DA710ED4D2104 2488410FD8B683E039DE520406DA7A56FA0396596052A01C0CCA848B53217826 4E1798D13A14ECC6A9E6B990BEEC7D03725B1DDE722F8CD266FF6662B65BED83 84475D1F517D68394B318567EEFC1D67A6F070FED31859FC3C9DE724E118A114 5EFF5126B52252920DC477B61A4E679CB27781D9EAC73A72C1DA26CAEA5B1D24 62D237CC7F2DFFFD5E6F501D7F6E492E71DBFCFB9D8F03F428031B06C0971B3F EC650ADF1DACCE8C0F2039B614BC07F39CD4752D680B331F7FB914137EA01B9C 0B034A133ADFD4C71A109BE2128CFBC20F05A4CBD73753426AAA0ACB18F59B53 3F4B0E8FEEDD0C917CD1364AD41E0C07C3FA3CEA238F4BBD6C0AB825457EF726 BC3975423F986B5388BCDCCAC94BEE94DA84B8D2F8D8C42F8C4387784148C556 593F6B4B1AF5A4F872D9021296DA30F7A5A58CF8A0E08EA42CC3E45AC587957E 5B20EA85B394D1327524939984414D47192168726B6D1F8F4C5F9DCC61470F87 5F6CD2D065C4FFAA99E4174D35A2449818BC891FC6CA50BDF49C9BF7D3E80719 D96AB5F36A4CA9296C46C9F2016AF081DABE08D2EFB0344643BD96D3E98C0684 FF2F3094CE2599971940D82C34A588E2C4C02F406549F545841CF71C2D36EDCC E05DEC11BF0AD2C3CC78C6D2692A3D61ADF79420BE9CC0610374A46F167EBA1C DC2D2551B0BC3879D9010CBF97533FFBBF0F67FDE17C495EF43F4892C0A760E9 E786FC2D1842308D110090BD6D5B179CC10BD561BC5C45283BDF3CDC72AB707A 93BE3EA5B325F581A2FD30BBD7F1E30721CB0B233EDAB562C45AB690D3BF9B0B CC942C42BA347C365C19FC2BBF0422671F89596C7FF84802726A859E0DA6E19A 3FA2E5694B8ADE0E58DEAA63528F3784189B49C09ECC8446EAB81B3E67604AD1 688EEAD1907852129B372C0192DE03548EB9F937E680B04EFA0C898A53A1FD22 39AEC5CAB3C5272F948264472069E6587B4BEF75CF4ECF308C3471EA142B79C5 F377EBB3802335FB47546A09B15045730BCA4CCF15D86819544E4FB7A4A886B9 CB03FBDBBDBC8346E0F306EA6D2D538F7C4E63F3E3AF41CD4362ECCD662A3D4F 43ACE1AD23315DE76C6F5BB7F66CB5009A2FDD1A896DB6F60B2E19ED07D7ED20 62227A0BB632A285ED396B39D3D2F192018C791870D771FC86B424CAD275CCFF F116AE15954B012589337BD2F9F47ECA45B0D59BCBD9666A277DC5813DAE8239 49F0BFA321EA1952D33B7194B65DE599E530C8179CECD3F8FFFD7914F4DC5A4A B2DE13267A53A40C8FA7CBAC7E721C47C2439419CF71E8BC893F3117A5C46294 5A870C4C988C85C3389A07CF6EEC38EE8CD932C1F9DB8DB138DD8C30861E8E86 3586B2D56D2C8AF774BD52958CA067BE14DB1902DCB16BFBAC1C2241D574F4EE 212571D3FCE65FD24369A06E55FE19289895322D9B405D46C1BBA90E20A505EA 5538036CA0A1D7A1B7FA65C3E61EB3D0D84C0A7F3D3580BF21FCE00AA4E53F32 E0FF54F620ACA31BA018A4F3BF4C1F67ADF35516E8324B7BF41956D2AB340E82 5CB51A157148171C480EB29DE48A5909993C5CF316066F9DAA4F32A6800F5866 6890E0A479B396EB4A09E48B32A761DD53FC214B63C2A486E7973F783241866B 131F216E46FFFD139621C7BB9DA2347C8C74940746F081E2CA51333EE3B7E669 6A9E6D60D0FFB86AF9B5351978CC790C97868E9081D5998292031108D7D4F52C 8FF09328FBDC10CCB20B05B4801D8B8DDED9A0BD0BDC2CA84714D98BC14C4BD1 4D0DC3B6CDE8E6F233FB91EF5775386B5F4AF47DF83B94AF09DB69802FE375EE 7BFDA81F6BC72291187C95473AC36DDA7BE894567048EE321E331DB07D331A00 F9FE3B6EBCDDBAB35788D3D18D09D57F613A10B493BDDF291EC80FAE8A12F0AD 1BF71B64288B09574C842C6AA87351CD7216E2C6B3A4F8D63618055E3D5B4C1F 42D91FD165A92B2D21CA59A2B9673A6C0124A75C1D5E8189D66439A71489460A F0142659DF93E7D3251B42EA71CEC8FCFB274716F7B2FF0F5A5D7AB94E4C71EE 3A706BCB84D68848829C850AEF2090F71ABE9C8EF9BBDB7233F534F3922D252D 0CE8C2DABE73B3A502F8CA15781D98B739F0B0A1D35D4FD87D51503BC99D6B6E 91325E111468C0D79EE546E5B7DED6723C1FD043229A8CFCB5131A69774FC1EE DF84460187BD36F28307520345FFC68F15AED9 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTT8 %!PS-AdobeFont-1.1: CMTT8 1.0 %%CreationDate: 1991 Aug 20 16:46:05 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /CMTT8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 49 /one put dup 58 /colon put dup 64 /at put dup 67 /C put dup 69 /E put dup 70 /F put dup 73 /I put dup 78 /N put dup 79 /O put dup 81 /Q put dup 82 /R put dup 84 /T put dup 85 /U put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 126 /asciitilde put readonly def /FontBBox{-5 -232 545 699}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F0187316F83DDE3E2D27FCDF6C5CE4F95B6EE 3317BD91B7921F3039DD35FEA387D5CFB6C6E9DC84C178F3432994FC7FAC6E5A ED41A1E2EBA350178FBFEB45944511731BA827167DDAC238FC69A5486B995477 C469E2E27493B0B711DF8E267D3D5613B450011921685147114106C9472580BD F531022F6DF5432B2A4EBC51A8032C7F9689B6FA942D849B29709631613DA68D 4DF7B6F059A19304F40A3C3580CE3B51D79D42984194D4F178801720892FB6E7 61FF43C63F9256B5E9F4227B1378222BAAD4D52C77462DF01892220E11129C16 6C9E45BB9F01ED7C1AD5D8B4D72BE0E12969AFEA90FEF170603CDB91CB243173 B19A56084D10293B80A35275F41BF78A054DDC98F4A1FFF592463D944960FB31 6BE5F03960F9B1F213CBCC7FD448657FE388F10104D42B0715FC9571CC60CF23 C72560CBB8835A0CA208FE06676B3B48B093CB7FB2C0C53AF17EC5B372A9771B BFD52FFB7062B4FE0106A01A2A1A1DD4EF5C8C7623EC9324A2CB3B402FCC1FCE 52BFC8662F8A39D5F1B41C97E7CE34E16AC28A1E94007AEA7D4C519399F1B7A9 48FA7DDB671067244F09C29F95DD60668223F45BBDA8B1C452E930A9F3F341C5 351D59EA87462FFB30277D3B24E2104D4AAB873BB2B16DA5B23BEE25BE2C8128 C4CF2F4F438A4E520CD864F3EAFB5363753B82978F6FD664A14E5D6F3A929348 5839EA752FD635619C4FABF1E1454510BD9D6B538A343BE748AE05B47F917367 1BA5EDB15F1BDBE806E51B294257D7087334165419A6520462D794D670A1D6E1 3BB03BF689391D056D55AD660D15A386E6D222C9572BDC4DC8A46EEC75124BB5 F0E8978FD6031A90E4768CCBF62A5ED8C8087FD66D2033011947634878BDC0AB 6501DA7E6D96E227068E993DBB0072F037CA4112F5EB7D630D541F4BD38DDC44 20AE405F0321C26DEED0D6AC82683F260D23CB9446ECB7EA8A383AAB4DBBEB7F 9D86CE5DAF4FC5718AF1B896B641568DBB7964D54B9B4F60A4D8E87D3236CB09 B48E618D22A3E109FD44BB534DB77D73DED93DA0D8FB5DBC11776CBEDE459B67 B5CCC6AAF01F1E90F2EE643D9DC8DE7A13D222D640D3A9B435B0D71F5403FBBD B7D564144BFAFA18621F328B1B4F94625EACC6A514A92980CFB4CF48A741971A 956EB2AF07291C0FF73EFC31D0D037BA9D23811E7C7EB1D3DDF351260DF0A89F 65B9250CD3A458013011E62FF47FFF2E49AB1F4CBC9D6C95B1189194AA7E30A6 7FB8B79CF9AB0D990744D6AB475E4EFEC4C0AEBA970FF3C49B41C3E7ABADAEB5 398AB52840CB363351830FD546246528F81DE6233C25D62373C3BD3BF260EC6C 7100A38CA4DE2022C0D170397B239884BCFEC99FC78D17397C11A7898AC2BCED 56B82A4E2C7A8609F795BC98CD632BB48BA05CF526394617CC0B6E653377FB5B AD2B000E80334B849EACF682A26E97E6D394DE0E89DE311044FB685EE7C43A95 5E4A317EBB90E9B58D76D16B4CDDBEDFAB2047DDB2B5B16CE199BB96BC619CEC 6D763B19C9613EA69575E551466FAC17EB80E0278CF0898111EC6D099389B823 BE8C37C79F501D27DAA3CAC5F57E0D07DCC49B80FF563FFC887277E1BB895964 A2E6A3F3AC125912F24B6CC84496D227CCA9DA171E1C2BC3B6A7182193C75909 87354BABF528BB81AB04BD9F9B225125A6A2A72F054E6323DEF0597BF4E1B56D F7642EB2CA56DD5E4588364DDFC61EEBDF989EA27D0C332A7472B9245940C73C 26E704683F5998F6E8E01519A432C65F33BB680430D024A266260FF6F332B2A3 2C3CB3504A3DCE3D4AE6D0B7530C45A0694C6B51A2C551E8F5D1A441808AD551 4A98E73BC60E075759330532359F057D5195E3D5D558407FAAB93F2DA17D9556 FB02CF71AA16558E888AEAB259E545B8AEF2CD8C9BE3479FDA8A7B40C6351329 AEC1502C3C0F0FB0E5439C26F33AFFE22FBC289100D8F015D7E975223422015D 381F24025918A8082F695018627A88FA68BFAB04F4DEF57CAF6927E48A4D48A8 D7612F059A1FEC8BA5AE5010C849E65F58C1B556D2C48405C3CB74D81B7D44C5 4B8265F38CCBD16A4F2CACBE7D9791CC05A297B4BD23D3C05E2C746BDEC64A57 009703F53701758193E77B10F8F131F34DB122050D0FD68A63D4A893E67542C1 786856DEDFEDD4342B2BA115E857B20391ABA9C0DD9277979DD6600AF8644295 5B17A687A6E75F1FAE97E8BC4B4528AD23FE1A86FFF4947151DA9A6755B03436 FDD0A689603A18A7149B333745AB7BDA6F26317208E705995B68F7B6679F2E22 B1051AE4D512675E165D969A00FA801E6F531F3210381C637227C63D491A9715 5D50D1BE0AF61CDD91BE9FDF09BCE1A2F5FFE7F352E2551A69F64AB98FBA1233 5EA0BB21FCB08B1C0351A1F183E5BDD1576D057831B03C9F131486F8229AF7FF 04166AE8D058B9F5A940C79A300F26B05247EE3E5B0D36ED32F336D24B1B8316 6EFD7B54D8E1C36C78E32CA4364F8D8730EDE55B84899239FC04C304A69FB4B7 66147F043A49F2E3DEF276A683FC29A239F09115E3D2F2C7C40985187E374DE0 6EE172957F0EFB773A645A456DB8B6EF828BE2EEEB0FB34ACC280D3D8FF8CDBF 7C3C76F44E802CF11E6AC55583B4B071D411301287CBCC514659F63C39A33254 E6AA1EFF95EDB205F9E246680DEF0658860D50A2CB299B1D9E4C28B0C2F2C559 635D3AF444742C1E03E253A3B7AFCAE7A77B87CFD4CE8244976B1265D058B021 258E94B020A8E1361AB86ABEBAFEC76D4EF17748F8203EAE02ED5FEF11644AB9 AE5208E3AA9B8B2B50E9DBBFBBCF1C632C7B0804A0449B69FD6D047BD0C26633 3BF55195047E8B01C2036362EA51BDADCA23AFC3A0D14CCD6F6E830CB4C56FA2 21F5DB4E1F98949EC94C63D51ED0554C6699E557A39964C2DE2CC31860E81569 DDDAF2F8C152E23185218C89EE31F287FDDA904BB026D534912343A55BC36309 7D8A47A789E281EFA830A8B418E6079FE194C2FCC15A2B1D7002E9EE4A0EBDC9 131178813801CDEC9CF0D43F5DF4C986A27F59B1EEAFE5028ADAC5BC403728D4 CBA0BD6F36549AABA2C1AF40F37AA2C2A2F942AFC9722370C7AF69F10AD8087A 062E27554DF6EEF9D70B0C2894CAB85F6A5C0C6FCF369E5C1A0F20AD149C190E 81A902887A213EE35687FDE828A6A8A2AD993AD9AF3AEDF3A187437542E8A92B 9B6A67D2F794CC5640C0B54843EC6428D632E3E8148D184BC9EE5DE7613B11AA C543F039F0D2F22822F6B164379474F0D0F57772B818089F2D0BB4FE5380557F 716F9FB1F25B2A947F97BB1C5C3799A0CEAC76E345252D0C9E6B31D7CB522545 FAE6D5B7A5489D22F77BFDACC3284A0B7A424D058F0F0B9A1874B764DFDB07D4 941AD6A54680E74E537E1361B3B0AF333D07548EDF25C0FC711E008AC0EBECFD CD9C8837A9FD08BE581B967AA6D3DF7DCC66DEFC35009DC7859A1FE4D89E8C92 A77F4D8C015F781B8C380E1BD629D29FCAC0FC7B7DFD66402F3E1F864A1CFFBF 65F1D4858925DBD63362D5A3F70875C4DCD54C9C21EBAC20C6A9BF7C2B6E3CCF 751F533C42B1AC5E606555C0A399CCF9F61D77B91F0A3985A9542D6260FEEF8D 62B76D2513BA4B73DC41B2048E46EFC01CB13F5A7C4B77667E56B5AB4D2C504B 91DEAF8C8427C1A7F7447FFF79E6123161C6F00833AD204967002260EBFB43D8 42B9D36607053508DA2C136F122CFB943B1AC53BE8BAB38A828CA53DED3DBBA0 914B34430EC69209C54FEE4C5B38AFEF5B616248CC0991CBA7BE3B102AAB9C12 A89FFAF7D815980AE0E895218ED2C01CFB0114D982D77BD86550C48246992484 D8957125A9CC7E45E87D5A11643620623AF7622F0DA667FAAB030ED461D79EB7 60C89F793D346A35D1075CAB3203E6DCAFE4E686395342E7A81544B13B980F34 BE2EDE63FCBA1E589D0DD786E2945602F43274E96DEF9032AFE6F9DF3628A8D5 B7E71815C6FAA22DC92E5C7183420A3CFBB39A188553A0BAA816843A582497C5 9A2547D9DCD6E95F94F4D784DA4661B195E2C206557C5DFC83677148779D9B72 25C3F564BF880AB2B9662A38CE0155954567D43131850AAC9AC54549CE5FEB38 7F1E3AEA37420C52B0F545258C2CC7463961873C3DE0F59D00AF3B0739B9F5E0 95799E150CA7EDDE174E1F699CC2E7B7AE6487BF11020078EC0EEB6AF014D715 509A419AF5C029635575FE83DBD7288D610E92648810EDF6417ED6951619069C 72903C49E60AD24D92B153A5EB5A0A0583C03297B0138BAC704C505E860EBAB6 9E384E89F46C17F2F64B3D5356E03DCCBECA7F26B7A5AEB5F73675D78258DDB2 4D7EDA94DC37AF3EA4ACB1009115750A956D2859E95250B024AF026F88AE92A9 E56E859C193AA25FDCE230FE199F61EE8AF9E685DC6FBD0BC78B790DBBD5679F 5EF070556A834541936330ED836CE776CDA76B89002EE8D80CBA3A3A5BD968BB 486A32710EDE9E9DA3B2CCC34ECC25C95AB8E3A7E25F075EC2A8435D9FFB38D7 9B48955CA6067B01EEBCFE43C03F592B2B0D406086EC8BBC36322EC9B7280DFF 7E764F3FADD5000C55ED0F227C8F6980C0B66ECFF396761B21471B3A5EEB3D1A F597E588F8CA7904D281D712BFB40DF298287C6F632385F5610769D3FB339CDB 05EBFC4D575979B513894854CFB8DC4BFC0B431B098EFDD222DC6056DF83FE9B 25975926ED03AEB3EEB29ECBCC495F686BBDB4A1AD63CAE852C813615AFA3070 D0188517C3302353DD50D7BD7D1F39DC1BE8CDF1245732176603859E69C7E808 7392F6D2D10025A42D0F37FD012C7F475EFD1FFD824E6526A9C582B33B8AA056 A280AC76A80CD19E30B4181F0E6C6FD4C458CCE2CB1ABAC35D96BCF0C5D2A873 DB7245A66BBA5C844A5B94952F764CD43D46E5E4ABC94C47D0073A14F93D78DF 80C09BC9B85B80F5577E87C6ED2DBEB204CA3E17D64545970B48B8C62567D654 3C53ED6A0A37CB0649E863F114397BE7A9795265E0384B410E2E86FA92473E4C EEF3FFDC33CD1C3F9FA86BA8B02512608DDB6C2684B0D2AD84BE4E9298B3B8F9 D9B6C9128B26523BE08FDEE848891C41634FB5C6FD9B03F63DED3F4CE38E7607 84EB0064FBF6E7740697AF38DC0F4401B8FC6F6530DC75AFFC0722B376A6CF0F C5A18B4F40EFE02A51FDCE605A5ED498942229F9FBBBBFA2574394DD6D6232EC BDE410A6C7856E75C1EA52BCA979ADE4770713BDE5A072442130B14A997D0AC8 51C34222FA9AA40364D732A6E7FED0E548688915666885F5C0DFE17315E185ED B303ED4ED8AA16C3FAAB35AD8DC372AA6CB6C38607F6361AA849BD887142FBD4 10181C06A6434B1D88D53817BA6CAFABE4089D3CDF4ADDCE7D30C8D3696BA346 70609315928FF0BFCB673B979543CC8D8271FE403AB63B074BDEE5E95DC4C997 DC4D7C0C32309311284FB34DC2F39017DF2DC925E36E14C83665B97D14371103 CF9733098F46AF2276BBD636261422F908E98BBBB6DE7EA56F3AE21C3703BDDA F8098432238B531603D25F161014638F100504B550E8606D9CF51FAC5CE54BA9 7937A46186E4FE543167301E5BA7D6542DD51B6009718E2EA178534B3B8D3E6C 65482189AA47BA3E17135CA8168134359B6044557C168901054C4890DA7FD8CA B4936C4C95E8A7F35C22D03DE4BBF8C735F78235B9F06A381608EFDDF297EE86 C6FB8AB6278951B50AE865C2A35C36E069D1B65E94B31E2E041D874FF3865C82 66A816264AAFB0C66F9CCE9BCF404AA8924F8A3C7B65D8D0AB0A2E802F0CF520 E71B6412DD2A8E21A12C4A5748A9A71965A29BB4F1186A6AB13198BD58E04FCB 26557E0BE4736673B76BA3F58446027A751BA40AC6AA17AE21AD6EF4C89C91EB C9A94D7A83CDC7A311CB428365D4880089FEAB7386030461D38F8F6355C67018 D2BAF0BAD27DE4D513C071909DB9F05FE845DEB5D445F8716F70E1D989C74105 595DF000F2560F03CC34BCF4687EF9BC187D1FA1AF8BA9DA51A8202E49997FE3 2176E16D97D77CAA51B5DE94E5C53C65E4D6BF02D510B9278EB142E2BEC06434 9E50DFE200B99E5126D38FF29294488F87F9A5F5616748208960E0E0A9740F7C 865446D565AEE7D9731D8C71EFC55302E2288C1D65D17CA5D4B0E41FD4733A75 B32C98CDD4BBC3927B59FFAD2BAE903110370256C6D190A8B4E67785229C5407 CF98E59D8622A594D0BEC2B0C7A538F845367E983CD73BF9BDF7428196C2DFE4 8FDA99CB5F41B2EE233D84BD915B7B99976654C1463E398689857025E9FFEF5B EFE4733950B6123406D560CEFCD154B6B6AA78CE97908B59F6376D69005869B4 62B5CB0B83B15DDBA2F20BEE60F0587B4941DE6DD8988F682C6D2D4F8301D8DB 74BCDAED71302802AB24F44112D64429E52EA697737306BF919A0AC09A771CA0 144F0389D2AC73D2492036FA611282DCC5BD58AE3DE580265AD43180A2188C49 74ABF4E17125F69E516B630C177F55BBFD7159797013ADD7AA91DEBB0897DCEA 7506972AD139E63709427065048E557151145C62C65EB6DD84986880706E1994 2E3D9E34335D6D1372024825AA2614F2A04A4EDDEB3880B7AA52F7EE14F695E3 A61EFC6C114082CA58152213B98166F60A5A50774FFC4591574612B604E8C4F9 11D5F5FAB18535717B1AA4C0A813DAA5C7AF53979AEB6F24A58659BD4BF13102 CBD6AA37EF06CB5207ABDA046C24DD8EC20FC0E477F15B7616C3752B74727388 552D3A5950D2D744DC034B0433446E6CACBD3D3463F5807A00ED076B3378D4D4 037C23046CBEFAB5EF6D13A48E2754A236742518B8122CFEB6D793966B7B3D38 019B559E3321DD229256628DD9D9FEF6A59977E13F1765008E4192A3B53A224A 97335A56802EF0E91101ED5C312BF4EC9459A6BA8D097EF5EE95BFB49D692AAC 497B82A6F53671ED2324E2714FE118A36CD61C17E97E3DFE7A6F1E2E646E92E5 589667E46A283C88B05813F64340FC2CA787E9350E4F227FBCCEA7D501F70248 B60C6C1DE31D914AC71A0B9138034803B4FE89CECDCC123797F4A7AEF36AFD71 64E74A487A8FE37528E4068BB43F1BA8E9A86443516CA621A0C8DEF6CCB306E7 9474787463FCF9D6B774F06E073E44E8E4708176A05DFAF812A5A64A70C92D72 58C923580E33822E1DFC15DE4FAE2A02D76347D525D3372658B02247F13F37FE FD51AD6F133B1D93B5EB2140E2AFFF23B9D6E3E0B264C5BB99AD4DA24D2ABE95 A044908AED5B5C8B49A9ABAB851EAC80082EC0FA190C59A10BE5786A549193A2 2C157402F6B52621014A5711B9539FE2CE491228FFC6781D635157D530E3F900 3462B6A598CF385BF078822665C8E739ED2C40BE61E18FA167457D878EBC8BF0 1DD1F0EB856C147ED977D407C24BBE767CAD7533769B02251FAA7B6F5DCA7DC6 14970B02AA7410A1B40EACF2C15ABA1656FFAD7FD26358ABEF67CBC2EB4A3ABA E6C61523777DCC5064B6FB7F63CF1A6B14FCF5ED83F0976EFA1E5C4470B54388 67621409444773939F291F8688F3ED4A2D1517214316F1B7F2A877B625603F30 9F171112A65B23F17F82C2A337AEFC862527857A25A1AD904AC0BEE13F3BCFBD 4F77674F1E509DED404B785E1E894D85FA5C50BE106D3307DCDF144691523E31 265585E579CF0D14FC3E6DEC9AE5D986EB3E492FF3874ED02374513B9DE39209 A2B8A94F88799EE91F54A8356BDDD466A332CF33F22B4A030F9E8B634D693DF1 66DAE76A44209550C94E51F8C5BE4D404068463AECE3B2182EF28941AF38B7AB 71E621C15862835FE6AF11890D7FDCF140EB9BC6189984F5EB01278EF97C267B 873A09CEB35A83AD4A95DBDFEA045643914A2D88416E6EB8800631C6E8CF0A22 6104BC503E4DBCC130A6B064A022A5D29E03F4C8AB29C0A8AB11F873D7342657 215BF2A452DD90D9E9FC951A66625B656E80E0BE4FB5E917D14504AE45CFE7D5 37A5426FA507388C467D26E1377492B790C5850DC6433CE2C680B0261D8DF9EC 0B26909FE21F050C4E5A251CC62BA267128EE1CE61E448FC8C3C2DB37E6A9C0B 323FDF156CF1C568F5CC3E00C9B10649DB1EAEB2E24D2D29BE161603D811A70F DBA05FE81802809CE69E5E242F0B7C30E26C7C9A080B4B5D01D0A2B8CE22B7D5 3CF857F8154C88E4121CFB13D79A15822838DDCEC8842A21E4C72C099FC9F590 7395E1736D64D901D5E43D5EA52E914821767F23D7348B9628E591AA7ADCCE39 0A6F31A942D5FA69F4780C30D58E062D4C2F12DFC0B74F1784549B11F7263C9D BF6CA68529A8D6EF59AE9AAA5F34454E5532C2F1FD9016CAC7166B9E0B3061AC 2B2DC8F8F88CC3D9F07FD79C7FBADD94A615EC9C31F2C54BE4C4622A56D9B50F EF1DE4E36052269E1B272FCF06AB140161BA5ABD9275350FA0BE58947BB34620 83226D1AD604563C6EFCF4DA19C0B5D9B1A5A07D82560BD08522D7E650A00472 1003A02966F4D33C1C8A733840D8CB9D64C8A7BAD4FD51B9355E9DE7FD3C3D1D 10E4A93237D35114FBD57CDCA9C11E8255484F40974C2A88124E1761E6450BFC FB6022A7C1059D7FAAA6FA943A38AAFDA4A9D74C82DA70965DF6A2788D6D4DE8 F3D55F70C15601035820A03E4C8AB587E542C6321EDCF608E203FEFF43BC2A47 55E6C1AA6CF1BF8FD26B0E4DB9900A4946E8AEBCF3736273869BA3805F640A93 C956811759C2C9491EF2B0B602FB8D6694F31B44B40F5FA45678E1A77BBFFF6E 609B5CF3038BC04B9537961600D4B345184EA80CC7C6EB84B59D5AAD69D86600 3821A6D396B60FDA915CF92287F85CCB191CA863BE4C9E01E3EF6B2B63AE9C9A 5377E2B057EEDBCDBB13218282257A5BB83E5982BA83C2A1099807B7938389B8 0C70DE4A7A25C87CA4CDE9BE9F4AA59CC8747277832A23D1441C4F18528CB64E 9B8F0976E99E452E6BAB94157D655DA38B119DF006CB242C11BD813116649FF2 BF34A48BA9084E4B9CD31E3A32CA4ECF172C61D21A39DE6E66215B7C751C8CB7 F1E5B4E52AF7769BF3A161DEFF3C4B6964E161D3DDFB1D7852E8EA29B4EAEAEE D319A35EB67649B3267B97569B8B5774C4C261E8CEF208A4741C22DB873E04BD A9F52035A849A8DB903CC1B8AB18D252A7F7C004B2DB25A34DC160CC66E20B09 C6866E77F3F92FBE8534E267E523F55DE4BF69AC24974C84D917857857B58F5A 3BBCA13AA510E7FC2E871C1E21A792DD464906A84A1447FA659FDA1346F7E86E 32C9B2EDED4B98E551FDF1948F02CEB2442A8412B38AD9C62A32D5B974317490 4DF2F3279424382AEF169FEA53E80ABD68661836D2EF70B6FB7FA26ECB65C48E C3C6A3CBAA1C45DB9B0E01EC7319EA438C590D7D4E1651A7ACDA2484618538B1 3866C07B9A3F1C0DBC4EE491AAF87872BB041986791A27F8C5F4F4DE68EC67D9 14EFA2E354C14C0511B36045867A67C854B9FFED8793C65D367FA04DAAA03EAE E60B8C0F7E8BB717295CCE9C82CA8C1CA0D6F656F97271943B696B1A57179BFD B6BD9B738D9FB16CC3911B60015070FD4D0513891EB21EBE62A5FB015DB1F193 8FAB3C8E1BBCDA7E9E2F2F639C30F5051365C214278D4C445E44D916CA5C805F F502733B429E01E641048E1732CFB7140B584F924D46B8C360F4506BAB062F17 C87823AD77AE867D75FEFB6D5B21C168CCDC46A09D2427099EE99C09892078C3 10F8D51509D7415313960508B6776C6E006DDCCA0BB1ADE46678A7E81F96156E D0B41C035F2C436E671FE0AAF803FD7901810047E586A02D3E8CEAA550CD5B7A F6623009C1C3820564B1CF636222E8CF967B3712E97D678973527F011BC74EB0 9C8082D56BC9292B1904E192C4301510A63E7A80E67995F5B8BACC00C1363676 3CF6E1ABCDBB543838254275B32CB34B57FA5DEC43 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR6 %!PS-AdobeFont-1.1: CMR6 1.0 %%CreationDate: 1991 Aug 20 16:39:02 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR6) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR6 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put readonly def /FontBBox{-20 -250 1193 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA17D1AFFF95F4224CF7ECEE45C BFB7C8C77C22A01C345078D28D3ECBF804CDC2FE5025FA0D05CCC5EFC0C4F87E CBED13DDDF8F34E404F471C6DD2E43331D73E89BBC71E7BF889F6293793FEF5A C9DD3792F032E37A364C70914843F7AA314413D022AE3238730B420A7E9D0CF5 D0E24F501451F9CDECE10AF7E14FF15C4F12F3FCA47DD9CD3C7AEA8D1551017D 23131C09ED104C052054520268A4FA3C6338BA6CF14C3DE3BAF2EA35296EE3D8 D6496277E11DFF6076FE64C8A8C3419FA774473D63223FFA41CBAE609C3D976B 93DFB4079ADC7C4EF07303F93808DDA9F651F61BCCF79555059A44CBAF84A711 6D98083CEF58230D54AD486C74C4A257FC703ACF918219D0A597A5F680B606E4 EF94ADF8BF91A5096A806DB64EC96636A98397D22A74932EB7346A9C4B5EE953 CB3C80AA634BFC28AA938C704BDA8DC4D13551CCFE2B2784BE8BF54502EBA9AF D49B79237B9C56310550BC30E9108BB06EAC755D6AA4E688EFE2A0AAB17F20FE 00CD0BFF1B9CB6BDA0FA3A29A3117388B6686657A150CE6421FD5D420F4F7FB5 B0DAA1BA19D638676E9CF159AC7325EF17B9F74E082BEF75E10A31C7011C0FFA 99B797CE549B5C45238DD0FADD6B99D233AC69282DF0D91EA2DBD08CE0083904 A6D968D5AE3BD159D01BDFF42D16111BC0A517C66B43972080D9DD4F3B9AE7FB 11B035CE715C1218B2D779761D8D7E9DEBE277531BD58F313EBD27E33BEF9DC5 50C7821A8BBC3B9FDF899D7EAA0B94493B97AFEAC503EB5ED7A7AB65763C9AE4 247C7C9B60444EFCA66AB8108DF1085D4F3D758CA672BC89FD250646AAFC9585 F7F8583BEF48D4A97DCEAABEB778FDFC2AC2789D6F4E1F0D9237205E6210893F 77BC26458D7CB35B844DE20BC63A4057AEDA379413FB28B0C7C9A6AAC97CEB9D 5F712AB7B25A697092C13D2042A04EA2FB36836E425CB0C97A9F30C6758FD6F5 2E4A4AFF054C14C7507A4D90B76F44A240D2709F26814A24C405E59D5109948F 87A93BFABAFE124C8D58EDF774E060F599847C6DA5E7349BBD7791505BA1AA41 C047310EA5BE5555F3908ABC457CF1E806AE9D9ED134577DA0DCAA9120B78425 571445724A1D1BE4A49A88C16F64C3E73CE74A68CE9F413A0186BF50527E3378 0BDC374D6775CD1A60D04A2936D6613D91023157B2277815D3EACBBD0F5EC49B E10FB601A820B3FBFDE967AE881960711947F2C00DF744E3E29D6783D3F10D95 0140A5B62877AA3A89794368D3866910416393C21EB2C8D48B36A3175ED20B45 D3389ECE0C0FD0B8219CC0FE131BCADF70835C1ECF5B3B45D25467E7035313D4 C9D0DA39FEA7F03DD763174C09C7F59D83D484E2C8151DB2A52428C5EA3A0649 0AE2EA79DE5DC679CF978D3CE71BA42811E1DE2CADA4FD5618AAB6CA11976402 57E5F5448863B4B0123088E8B1C22853F731BA9797197646BD327D873769B322 12479C1813D4DEB5E9C7CFE623DC65CC67B381FD18537BD381FE8B0EB0E65407 D5C970329E61082E5BC69152FE91373CB3773CA987742586E6ED8C3016011724 E3F5266ACC8161A3E60B779F99C62483289B8F5FAB2A65A2B3EF026F50521673 94318A800C2BADBE0F256E2B0B1BB9DB90996B17E39E5732E0932EE71D94AFA8 6B5B0E5DAE5C3DE55A167544D9F315D7DA1DC1DE8B00E14164B941F136801A81 FDBA98CA9A96D881EE331F4B45FF396B54F7BDF32408863D62F39AABCB5B45DB 5E1DFB417F9E79FA062244A32D847C0CE041A90A2375EA44ED95DFD6A7BE97A4 69A896ACA2A8F3D1838AE43D8315F69DEA5DDFDB068CC94C5B0890474075E320 A5EDFB9E13A5060BD2C45E855F51AEF305CA576A9785324F98652B3340F6858C 0F936ACC0280DEBC3084E0C3BEA789D8E5CF803B7D72F2E96AD34D947DAFC787 806C936F0F9D8C7C8C7AF64EBB2EBAD3A97DC56A775279BFE6FE5A17209A5DD7 BA86A542B70E8AEEE4B53A6A7E389709156BD02E37648648A8C4E6366A255D4F B6D33EB9F9A7E96AEFA0E9D68268C3A5A1A8CEC390A244C6CB8F210C608F51B7 769E52259B2EFBF44DE98ADA262AF6132C829EDE71A0883DC517E14DC0312DB3 10899A3662CF88797DDE4BE8507121E7EE58D83F0761A5F9DFE463637560BE31 EA5E7931C115F68D02EE832D60E974D5BB0F6025D28E24058E8E3CEE6B45156A 70B4C4DB0C784FC5D4A95959C6C71C70233E3EBB696E813A2AE3CB830D6D07E7 4F790752D9E8E6BD41C3EA514EFF1ACA2DD8D1111BE62A17120A17A6BF806CF0 9E8FB18AFCBDBF67B15E4D45A3688E4A7108380FD6DE1491CDB932A7A8CBA1C1 5D6770AEE80289FA6D6CF1460C151A78147DCFE4CF3A0A91BD7A14091CC7BA0B 87F2E10493A80BC1E88A382088CA09806D7324018B3C832C984EAF9E801F08CB AB1EABE8C8A6E14AF293B5776C6F75CCDEA7F25431F902A1247CF5A101BAA8AF 846E3366916058BAD88CD99BE5369D7CC3B143CDC0E48DA50BD130997962726E D50E227D7171951F42C60857453E6574084AFFC583423E902277E7F86BCC93F1 C7A8CE812F89B20FD8FBED0005CFE83303F61369405336DF24CC15745443E9AD 8B49D9F29798735EF6892E925C254400DA606C657DE585088692AE468276EEC8 4544F24C068ADBAE403BB7D643AB02A289097A3E87E464D1E2DB0E7885AE8B96 44C08FC42CE55281BC901F194CF9FC24755DB18845D8FFE03F70A9A2D70C7097 46B7CA5F10AAE098D99DFEC165BA71A67381F49D1F09BEEC2C0348A290C1A1EF 298DC0B5931CEE66FB6836A3C7A09CA9D8B37043478539426F6269EAC21F5ED5 59AB35645218CDE8946FD4468608D539E0AFC73812F41C6AB6508CB796B50483 C268C21A06BEA059D0EE331836A4E242E243439655BF0EEB18E45E6DF5BD75D3 1B5E0112FF2080818146214D1A6F1CF66F2FAB4A4A975B99FE8282FB68D29032 EA0AA51B2810F66E0B72A8CEC2BAA30E88AEA22B3A30EE6C66A1DF6D4273EF6A FA09EC1CA0BE4E156FBCD5029381E0368F42E466B2078639AE281C31F5B282C6 6F621D7371113AB536EFC242766FAC1696D1902CC514E8444D8C977FEB555E82 32C08EEEAF5A8820E4341EDCC6E98AB6F0EF6EA5F5CD18D1922FDD273C61ABA3 1AE8EF4874E27B005CE5D1308EC915999E62E44638BCB9116A69A202392A8463 CD263C86FDB8E0CF5E25CAFFD32F824F9475232A27862EF2723B84B35DBB0627 37579F19E21253433D9BF96F4C8841331190F924CBAE983DFB9728B0B896879B DE3A0D087C1E16BC93D734757D327C31866CE6B15DD65EC169CC2B9C5FEEE538 E5B8FFBFD3BE85FDFDFCA09EA4491C539D79D4F7 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR7 %!PS-AdobeFont-1.1: CMR7 1.0 %%CreationDate: 1991 Aug 20 16:39:21 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR7) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR7 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 69 /E put readonly def /FontBBox{-27 -250 1122 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6CC3F1E9AE32F234EB60FE7D E34995B1ACFF52428EA20C8ED4FD73E3935CEBD40E0EAD70C0887A451E1B1AC8 47AEDE4191CCDB8B61345FD070FD30C4F375D8418DDD454729A251B3F61DAE7C 8882384282FDD6102AE8EEFEDE6447576AFA181F27A48216A9CAD730561469E4 78B286F22328F2AE84EF183DE4119C402771A249AAC1FA5435690A28D1B47486 1060C8000D3FE1BF45133CF847A24B4F8464A63CEA01EC84AA22FD005E74847E 01426B6890951A7DD1F50A5F3285E1F958F11FC7F00EE26FEE7C63998EA1328B C9841C57C80946D2C2FC81346249A664ECFB08A2CE075036CEA7359FCA1E90C0 F686C3BB27EEFA45D548F7BD074CE60E626A4F83C69FE93A5324133A78362F30 8E8DCC80DD0C49E137CDC9AC08BAE39282E26A7A4D8C159B95F227BDA2A281AF A9DAEBF31F504380B20812A211CF9FEB112EC29A3FB3BD3E81809FC6293487A7 455EB3B879D2B4BD46942BB1243896264722CB59146C3F65BD59B96A74B12BB2 9A1354AF174932210C6E19FE584B1B14C00E746089CBB17E68845D7B3EA05105 EEE461E3697FCF835CBE6D46C75523478E766832751CF6D96EC338BDAD57D53B 52F5340FAC9FE0456AD13101824234B262AC0CABA43B62EBDA39795BAE6CFE97 563A50AAE1F195888739F2676086A9811E5C9A4A7E0BF34F3E25568930ADF80F 0BDDAC3B634AD4BA6A59720EA4749236CF0F79ABA4716C340F98517F6F06D9AB 7ED8F46FC1868B5F3D3678DF71AA772CF1F7DD222C6BF19D8EF0CFB7A76FC6D1 0AD323C176134907AB375F20CFCD667AB094E2C7CB2179C4283329C9E435E7A4 1E042AD0BAA059B3F862236180B34D3FCED833472577BACD472A4EA3A676F820 89827E7A66934F11BA1A6716C3D750E5AE189E0C21CDF940B9AB45EFF4FFFF84 A7436F5A14304924790925E1461E76D3C4AF6C1C716B20E11F84253BF3C51FC4 46BDD368D85E5C749C7D0E3AFA556B6A975220DCE895B898DF184990276F2B78 28ECD9809FC357F574C9164567A3E5496F115002BEAFB6FDA36918DB28DF7D11 117136E26925FA4DDF96E67A8AF86BDE09160FFFE3CB490662FC4B3D9962FCBE FD574E40415EF6662C19136157A36DE33CCE4CBB8144D1409F3D00713D90EFC5 0DE65779C0C0A3138045FF833660DFAFBFEAD8DAB2905D099464675284237419 CB15660FD434CC404455A27D263D5775055A302B28EEC46784490A52CB2050C3 08792FB23DCEA61B21E0148753C83CC7CCA0819773F5C4C5932B82A83AA32C7B 0DD7166D10CED16D1EEA7EA3F1B4FC1781A2A6A3C31185E52E4DC102406D921D FE2E1265A0950715EE5923428268674E97B04868DF17793E3FBF5678AD8535DD 5911B1ED1874F75BE279E9725CBFC6F81B35DB09B9E4B03DEC68DAE1950A1697 87F029D819DE6CE4E17B523DC7F244901E645F856D582D31A626554D5D7B520D F7E22B61116CAE217BA59D40E1BF681FCB7FA34A033DCB998909EAFCDB06A0ED 400F34B8D5CC6D79025DFFA1673801859C0BE69F3114BF2DCD7D14F472E0D658 8F76B2EBCD68625AFA15B5CACAE5BF73DBCA951D6DA886C7E9B5C506D6BBD42C FB6EE776313F7EC9632433D390252A59D8A6E816BAA845B47ABF962F44953115 4C1E91DDA448B773A4347E2C64E6AB8EDAB092930D6AB7A47C229118D93C4170 B6C0260FA0DF1709BAB185188D1D6B01246422A3B10C4B82C9256B88A7E3546A 2599D86358A238867E1C073E43659629E2C33F5CA047A8C0D10C65AF71D62CE4 AD5827573248C6220C5192132A650F95BE8EF0E737743AD789C9C1F6B6EEC8CA 2348DF6BAFC91CA515F6346BED7BD95770ED2F934118639D587FCCCFFC4D4891 0A00356B83C927530D29B9E4BD85A443E5C0A75CEDB4E46A3C4F4FE4499A9C56 1BB75A5120F91703C080BD5466879EFF9F08EA9E4B718D3345AB7BDA758EE957 4BB62E7C74EA8D952B9D6890E142CFCDDF564A976B423B1D23DDE2FE0BE53911 984A8F463CFC2E8BBDF5AEE11368345DFC68CE93F0099DC9AAF5D22370AFC356 7A2AB2FE563FBE19D18A34FEE4DB16E1D0847E44CF75A2E5551A905743150075 6EAFA102E9F6A6E8D48FFD85DCD460510E35B3E16DEA4BEFE93FDAABDF677045 AA9213DA4F6269EC80883D5C797461B17653700064844134FB63C76FEEDCDA95 4DD9CA5B183FE27C5FCC54E5980CAB5DF3A7C50A10489162DAF0B61A41105C80 594295CB32364CDA9EB4E9BCEF943429274DD4B79DA9BEDEA792853269C79EFA 363359BD66D7EBBE6FF1ADDCCD3579D117DEACB810BE54A1E3D878B6B769CCC6 4849CC9EFF385FBC19B9E9F676BECF950F1FCD20E29543A30EC26B099CE0A2BF C5D270E532CF2C775A1848FCFB923F1BAD4F16ECACB022D11595936F0272D5B5 BF3DEEA219EED8A641F6D6C9068D8259F8490F362435550C14A19CFBA8933BC2 F5CEB54168F061EA44EBF719D638B6F8D6FA573ED3697485E7DC848D26CBCDF2 CBFD84208C8399262B8D7D60D8E14CB390A7B2624B8D5628445171E702E8BBCF 272B361B475EC88B570FE09B13688FF80AE7B4BE5E7AC73ED9BA732C65B2FEAE D8AFB5468DA8CAE427F4A708C9CCF15E86B096C5C8CF02A8334F2C4B6297FEA9 889F58AA8CFFBB39A216C54BD7DD5B74B1ED1709092E946B8215B8B421438558 F12309BDFE967C94FB9FCC35CA4D3854F230D022C22A6612FF6641F2DE3DF0B1 DC2292FB6F9FD437EB714DA848E70C130B47F47E76D92D4DA418CAF34DD47826 AC12B73BA6EA714F992183A5AE6339D65B43005674CD9A26B5BB091576B129F7 D4F11DB766317152396C3C694E0759A7D2532183FF3A6CBFD3B932A5E0669178 679B7359BF3608EC50FC63535D2825C301E408E6C137F20D6F75E7172A3ACFB4 81CB6428B2F8022907D6388387EA94B6141DD7C967DB4D6B159E1DF2CDCB3DC5 73E3D1DD39FC4A42AE1FBC61A7A3A785868C7D264BAA39715683FDABFD61359B CA269AFAEFB1DE88B6C0F9CD4FF5291120B86625C419A80B58E8E592B22FDE4E AF4F70943C7D145FFE96F5499D450009B4228081927812759B4666877FC9C60D 236F1ADDA6A44649D8470C6626D59CB57CE9C269CCFE4ADB028BF518FEF238A6 0DB56D5447355BDD63E9F84A2534EE8C41D7428C52C435426BB413E2304A2523 6777ECA1E13C406F9FFFBC070B500FA2195725949FFF7AFCCF6D6F6B507D39BF C95DA69CE4E68612534C81F140AE04F3F6B95BF7712C06408BA4081FA3A2EEE0 6F5CB4107E29A6EB421AE53A3DC06F828F38B36434C3AA7801B6A89717B4CE6B BE004F15657DA3C100C3C4BE19EA835F86ABD5C748491B2C72A73C1A8FBD9CCD 6547406F6EC362B1DC4400056075C3803CF79932366898EF7387A1A65CD6934C 042ACAFD0A6395A2FBF7E1BC019201678B0E1322A7FE09B2FEEDEAD86FEB85B7 EAFBCF420B11072EC7182B4F2123DAF80229C27A0B1521EF7E9731B644E19943 3E98AB8C4498080D7CACF33E40B069089E607584D2C2B2FF1D1AAD5F8B201128 2ABB90B396E95B3FE940166AAE04808F3F22754907290B64A0D39F4721585FD2 92A83763314C2C23A75623A4EF474A4A9B33F0CAA60EC54B49D5D3E9B58B176F 9F89B04D560C99 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR10 %!PS-AdobeFont-1.1: CMR10 1.00B %%CreationDate: 1992 Feb 19 19:54:52 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 13 /fl put dup 14 /ffi put dup 16 /dotlessi put dup 19 /acute put dup 34 /quotedblright put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 61 /equal put dup 63 /question put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /quotedblleft put dup 93 /bracketright put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /endash put dup 127 /dieresis put readonly def /FontBBox{-251 -250 1009 969}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C 295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C 4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF 2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E 0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B 43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC 96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4 0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F966977BD8C8D07FDBD F4D058444E7D7D91788DEA997CBE0545902E67194B7BA3CD0BF454FCA60B9A20 3E6BB526D2D5B5321EE18DD2A0B15E53BCB8E3E01067B30ED2DD2CB9B06D3122 A737435305D42DE9C6B614926BFD44DF10D14402EBEDFF0B144B1C9BD22D7379 5262FEEAFE31C8A721C2D46AA00C10681BA9970D09F1EA4FA1566B96E221864A 45A24ADAEC63F61C9FD18376D3984449A1F998C318A8FE36D0D5020E18A49625 0F3BB603BA1F3E66FF412F6A32433FF8BD2968D79CE4273AD0E0CDDA5153C2BF F8A46A2244F9394A49D339F763F5A7411A3C29336B21CCB01723705AF589B078 3763035411FE36AB5D744E81379106890688CB5BC41184548B7FEBA08DE7288E E6570FEA20C51FACE8E8F824BB61A4A038AB817C47B87391611B77928B2565A9 3B27A573C05D36ED01D8F27CB2C793370FA9B90021B5696280A55F2CB6117B64 293EAE0EA5A243F56FD007773CA35DF71B3D28643C25210CCE25F37A5095D6E5 9CAFD99DD1DB0D7EAD454C13464DF6FF5DD42339797AE5AE467084550FC00139 6EE818C6365007B2FD6E26285B832CFE6EA7E99665A224C9813C036CED262639 3FB39C1F05FF8F31D2DEF37BB9B883334F51EA124581B786A3D5FE6424B19872 AE7CB657C8D9528934B990B94FA4A6D61BC9D2CA9B4E95A22CBAA066043F44D1 AF32F545B9E123536914A7FD7FE96F12039EC25128C810BFF546AABC609DF57F E19D511F324E32956177C4376D191C691B9F0B21FA84BAF3DCBBA536CD710A80 1DCD4C83C02E69A140E1A4CFFA3B012398F21DDD96ED8060DB98EE133F430022 41BA1DA473F1C99F0D6CDBD35188DAF712AC83E0EDE08EFC3CA2B4A21EE55692 CF22799274A5CFAE84C89C937AEECF9CC71A328015B63C1730FA68A18871E174 D035568A73346EBE4EBCAE410A4F2505370A0ECB487FB40FD823065AC56CE66A 9D8440C5B3F74B855EDAECE69835137D4D76FC0FEBA53998F57EEF25C7E3D9A9 21BFDBD66C84D8AF7D8A3B79FAA9DA2963FD47689E519FBB2B7793CE6DE04A5C 203539BF94A5A700E65B5A5DD37B051EA4348BDC4CA39909ABDF8C4102A58FD6 661206115F7EF6C29E12408BADB83AD40071F53B501C15601338467BED90B659 2708D01CD77E109ABA63C19FE12606511639C5D9D5522C80692D1CA874E17B9C 753AEEF13718DD36A008B2D39D618F4F766174423AE972CB619634766A5DA025 F9682D9E2A3C752D0F6F18B0D58319FCA606BD6DBC4F83D19DCAC84A6165B460 AC1A0057B12E2023F175E6A51FC12A4852043F6F2F2625ECFF6E866293531437 1C060C9383278C81B8DF68BEED88C49F86B7617C5B938457D19FA336C616D2AB 0A430B489EAE7998EAB74FC8C037550E12EF9AC540FD37473DB1A44B1747A4C7 4687624D806FAC32A53BD65A333DA3732ADA2774D6621BB59BDAECA5637F1F41 CD2AAEA8DB9774C2730DBDE3A2F9499C719A0E9D59FF37C4F4E6E54D5EC402C8 6599488AE21DD119CA2BF54EDB306B26351D0CC4C82040835580087C60327110 9F8A1277DDBBD25823AD30F0E960604BFF9CE454C5C841119F73535F3093FBD6 8E47B1357BA56E3D906EC70D68E85465479539187B56EC67A64DE38FC444950E A82B014254689B676BD02A3068ED7ED5D4C9CA1839ACD730A1796A6EDF5E1FDB 0F5B32137A311A8D740D8FE7BEAD6A12B56654FA2FA2369D2081E4CF9B230230 EB7104903C182EA93195587BDF15BC107634681727445D5DDFEBADA80891C452 B03C954CF4366298C914D8C572055E6E3E8FF535A68825E12B39676462109B94 4000FA7B6C159FCFDE22E51EB1F28A6EF079737842167E4C2504ABBC04A73431 E80C26C1F02DE1657E7B85711B1EED248B2F408D8502018B5DD9B0A731D1D3B9 2918736FD4E9171A3F0F52314B0E32F502BC4EA770609F25C0AB41247C6F9CDF 4E28D6BBB150BC1267A28D2C774733C31FA40C576B02B881486937CEEE669DB2 DDF5E9996DFF07515109C8591B4311C9A4E027514AA55E75B017B9530B5FF263 0F26D61D58598934A843F782C9A86312E8D0278D48D4DFA5E57DE3D8405F08DA BDA563045DF4E23F8CC8377E17DA4FD3263E8038D84678CB19FBC5C12CE7B4B4 9CE6D9397B6EEC633A930646D55813E86ECFC0C8BEBC1816FAEEEF1B3562C7EF 0CC93C00285AB898630F7C7E03DA99C8734E1413B2A80CAB2047676C75BA823C 78976F20E3DB5518A8C21F525C32C16B7BC4FD21ECEE0D01EBD97C42F0876F35 6B7369079237FDC610A25FB1D89969EBA69B889366F9CD4979E934CBFD178711 8ED0B53D2C9836711E1A4CE5A85AC440B233FE6205C1DF5CA1DA9D81C381162A 8E96D2A4A1421C3808AB2D6F6D8A4685DE9736E0F64A06E5300238EB4BDBB4D2 9228A97FCE61DD71689195CCE203BBE485AE579C0F2C832C9D731B09C57EF9E9 73FAF0824ABB6152522871FEC9323005C6311A0E365AF5788B4B505B67716184 D60C70AE3F6876FB0FD05EB9FECCC1F83012ED5F7EA1CB493DEC93A097440402 1BDEAA7BE8767A14842E78D4F859EF4077D7F07ACC7FFEF5322E761F8B08C7DD 69C4CBAEA2562B05CC21FEBBDDF94FC08955BF24537EA50305996325DCB24CA9 BA494E4B8A0306138E2CB14D1F952255185A37A6E0A1E2A233D277AC8E5EE7E8 4A4E9A88A9DD0CD30B22AA628965528007F324899FC935F687F22B2803D8CE88 2862BC8712DE670B0F6068216CC4E6A365A639E073D59F4E6ED188DDFA73BEA8 B9C4A4C3E1071C07ED52F7AEAFD0E26AE9DC335E5187A440B8F64F13CEA42B3A C94BE99622F0B1B2118EF4AAFC9B519972157BF93F65DA5ADFB839E1218550B9 33C3A1D0E575A1861FCB76A0992453F610C9B019F143CA15296A52F98D0F54A3 FE09B94782501A914192515558E16EDF275FB68B62EC0ECDD9EC2F75E9B70D4B FC77ED0D00F54BE6750230D55BA028B56FFCFCEAE8D7F1E73545FBFA94EB769F CE7A7F42B0EDD4B4DF1CE527EF389F973B46928E317C03859E790ECE8D406E84 6262A4DC2E22904E192AAB23D9CE3EE779BB70B08E21E4895D966A30E42BB398 58937233E2B1D7ACDA20CED416C936327FC1C2F8E45BF183543C3DFAE950989D 58A9C6769987C7A6CB45B7766B85EAE61D5F561767CD92285E3251A9117E922E 1814BF7E3F1CC44FAC5568D3AF6B10AE66EC81E68B7E4AA9A88C7C6E8906EBA7 4632BB3FA233F18CFD6C7756A89C74F523DA53B827B121C372563825A8981242 FC11379F2661170E96E8EABEB91AC8B2F3B025E0DD9D24DC1914CDEA97FBBF11 F92FBA5B136C742682C1BCE60FD6141657583F0610D64EB66C23F436C7DE739F D6D4D8DDAEC6C6F145BB95DABC85020233FF03442C703414A4FAC1ACC31E7A10 AC2B243BC3659766101767949131C5FF1FF4938399645074638A5D96FAB2CD5E D0A0C8371178E3F6F71DDDE5D07D9D3AA776989EEE0E8F8FA52F512F1A8F5650 FF62DBD7FAEC168B3D070A300955DB0EB75D4B21F8C2A93320A4B32535EAF574 3C0EAD20CD19880821F141ECDBE4512F1F01EC084F21D04AB423A3631579E3E9 509C4B37D921018B0FF6168891EFD59472F1C04F26729A1C49B1EFBD35D1A989 5009B0D29F4305FF1098B3ED6AD4EE2E82A3D12575C425C97D41C861B9693D07 96E726F27420F1F543435C2577FC7032C237392148B6D0A15E4FE27DD2013547 A7C5D1D49BFF8726957FDDD395A255820BA8E4C5B2E8C65E35615F945575D1BD E4D08BFD8B3421CD3CD6C563911C47B1F1304F081EEC79871134236636D7A23D B5B16FC0B686167F34C25627286521BA21D6BC93EF74B7867C96903C2A8B105B 332CD36FEDC7578B191EC7E839FF5E068F1BBCEBF22230375FBAC4965DB346D5 8FE0F5DC4B8846856AE31692EE493ACD20B0F4880BF32A50F8C426E4798EBF3E 7046DCE2C3FD54CC65FC445BE9C47147D12319B4AA1CC8F755325533D629AEFE 8608EC8AF00BE85F7C234BFA6FF51FBDD049FE10CE2C319D5F2A4E006EEFBBDD B56D8217976706EEB1FE44DC879BC1656F99DE600336034B4AE119928ABC0ADB B12F9E70F6782E938E5C5B05240BF0F413514DD4756112DADD83035550D46626 6EE95C45AB51B8032B61865AA5DABC79911C4650D9CE01022268BC1F3924F611 0FD155B64037F9C2E9604399B77CEC1196CA31FECFA286F831B192336248C62D C444F4452074AD92323ED877A11CB990742AD08D639B50C0EC47867BB42B4813 72E5B0ACDA829DCC023A5C20717172914CA46CF7CE32AAB15EE85FDE281FE46F 4176170CD54B0941358DCFA4DE1011929CBD45D40A88457A1109D95AE3EE536D 3BBFC52663D30B89B406FA15D28BDA1B3C8D20443D1DB889B9E87A3D0592E4A5 50A649F43BF4D90F1FDF6A2BFD10A931E5B3623E45AFAFACA208B8361DA7D40F 255B59E551C8C186D05C6B3AF0707BC1C8A4C0D6E3D563C26D744603D55C27F0 DBF34AAF9598252612AA900EBA29FFD327169EDFE2DCA29FD8F4E11E163EEFC7 26E0E22860F77B78CCFE8770BE1E480606E829A9174F833DC3E232AAE1CB41CB 53C4321BA6295674302146998BB426E8064F4ED1A5E1E214CDFF03C2DA140FDB 479EE72EF3322BAE1C09854DD26F388AA3FC7E3F03CAACCB86523280736453D3 022C01673181F20326CCF69006DCF2A4A6E5E9B574D24DDE22359F3BC0DEEE85 40CA155AC9DAD24C735CB33BB6E8434F541B1DBC6753BC46C7C81A338626F29A CBA1073B9BAD2AA7C42838C0448534DA75E333A85CE75D650830B19C343A27EE 2EAFF61488C9604086B8D368BEB539E009D500671D0B85507A13CF3F653E9F52 661236E4689502C76A4949D73302973BDF07B9963EA16C9EE9BB8B148FFC7C6D 0EBBE3B7659B77B4E21F26D953BE1366686260B7E28191B68D002FCD84EA09BF 1BF36B32C6055FA1CAFF6637F316584417467253C908B58C59E8B455E74EA400 5320931088CD0783B2FFA59A4A4E4626C93924E7F90DFF9450C2206A1AF4DB0B 4326F4E12F277141C1B171173E229A39A0C5A4C5973B273D250D82B8246AD778 A01510DE01E318579EA4249A91C57CD2051FA490D081A36DBAE3AF4F92AC767A A53A3233196106A2C0B738A379FB1E6F3EBCC80AF36FCF0497A4FA53A0DFFF73 B2D82A67225DBF54C64009A720450F6C5260346F411D940016CE02BEE326480E 0FB9916E11D7D196824B31AC5BAB91F970A9282E16410726DFB48C17FBA100FF 8172C776D0E7056E7B4B6326C733104D6BEBDEA00902090E522EBB39C827E0B3 6DB457514A0236C9447B7AE78256BE5DD260540817E4B03117ACC63F840EF2AF 852656108998C4C4707507B6D424794115B78D3EB2271BED6909CD4CC72631B9 4884C3F324F903A9FBE3FD4EBD339E22EE0ADFEABCB2D9CCFDB9C9286D76BC2E 5D483A04F7727510BF848BAF35F4879EB7B561B606BDC63BF3ECCD687AE6D8FD 1E83CAC63BF09BA3B1D944F62C177930C91988E3CA67FC862779D02624FC5AB7 5E8A65AD4D0ACD76AE129FB39288668F5755EA09F701BBB4AD4D3AA85DA9D48A 232411AA65567D066AFA3FD213E5D3B9689B3CD9BD11D161B33C612BBCD08EB8 4C9C82D0E4566B4E2F5C103C30FBFD05DA17E128E34991478C2FCDE292C407D1 93EBDA3EA7BD35B45AA4850908D12F071B3D4852CF4E6DF5FD630775130D774F 589D96659B4275920C55E8F22D1EA97D11ED87D45394CE1AD47EDC3BD1CA8C39 05812538F0D9789D1787D02525C248DB59AFCB148BE50F6F6BBF7C5A632B287F 047A63C299117555FD016DB4E151EF4B3853122DD0FFDC1F55A278940B053693 24E83F623115FF20BAFAAD2BE86605FB0F50FDEC19349E8C94524C84A48054AC 4315BCCEF4CB6908B21528AA724294478B6C4FDF29CAFC6A11740F170DB77D07 BB052F39C2F98C1F1011D783AFF5DDA47826746D494C32AE03095AC27EBAAC7D 49521C448CA5B722CA298FD0616BCFBB55CFF2AB179DD652848A7BE78292A576 7CB4A7CC70A13522A7F6B80DCF2758FF1CEFD65974932D751C399CF67A66B1E7 687601E2AD2E0856247442D795765EBA47AE4408A02713AFCDFDFAFBB465DBAB D272A327BAAE9794207C8D0E6CE56ED9E374037FF2FD27DE1B9BB7CB57F02E01 80F9459718F785EFB02145FE17C68842B09390602EEE20B523A8734974E0E2D6 AA9427A2332E0C871A05E0C1A31E14BA037539E190B0EF7A33C1B554BE137CDF C665723F75A0DB30EB45D0A30864750E3B5750369FA1EA55A0C6B49E1C6FBF6B 5F6FB5C8520E5085B1EDB2B23ABF74F236819B180D6725CDD7FF8D9930E5352E D1B03CF04C5C567B21D0B310E2A8A49F253E2F803F55D3FE2AA07A7406F2E396 D67B4A587A30E1C346C3B980F5B36CD7D0CDBCB9377D916A9787264772FE8CF6 65A08F57F6C12479B1DC35A91C1A696BA6494F01E6204D9B81A01588EE8CFAC1 3662D4C1B443113D9B73733F425A89237B3355864B5D5AB1CBD4249EBD0C16E0 BE1E44CAE867B6E6F090922F829C63ABEA8E8DF7ADC35DB611FD656B3056BDD4 88A3B5C3BBDAC0B0A0704B711237ECA92DFECA1376BEB1E1F6AE56E1AB16D0CA 8501295C89FF273E81E63AE03A9C13660D87E5C41BB9B95DE8FE323D0FAFEB87 7AFF9769AFC52C18586934E480CF63641EE8C0BC822CE52979177D530E69DB3B 9A0D6E6482AC933C33CB0F6083F09D101174871A4E7D9CE0FE777486C80F3923 87AC0B751967BBA5A52740B3964C8366FA2E484A412A9815793AA0C35E67F90B 95FEFD08B5C36B01727229EC9883B38E546BBF88E4EAA85626194C167DCA868D BB55660FE9739623611DC0454BD75493E7139452EB78F50E091FC3BAF8FF9801 099B4B511D92335108233557B75D63978AAFE3E335256684CC2927E471DE8A05 775E91369573DB0A0E4A3AF2C7AAE296A29F000373601F12417C01037DBB80BE 1EDB917F92AD21F839512ACE84B1BC1A4A3879F9D34DE9F44B538489B43EF934 3CCD70DE1AD83565D70E098C3A041A7CF79AE7F603B2360644DE481616DF25AA 1AE6BDAE38263A9E0C9D6CF53ABBE314A0301D42048519B1B31000D1280DF7FD 8D07A8F0510C728C0DEA97799F7D2AE85E0CAC610B71CF3528F2D89463EC10AD 2D860DAF4E396C59EDD5E55E6EBB1BEBB6C3500B4BE47802B92D433B193BE1A9 2D681556D3D8687370E6E2119B51A3F4516A2908041DFBBED197F2513B373B8D FAED4C16A94D8D251C56532DC315F0EEDE283A9AEFF47CC118992EA2AA57AA12 D068C5DE6798595055798AF48B3CB7F56FA043C7D3DA8CF25DD486B1C7654BF7 203C057209C287314C85330F93C24FAF8636673A71FCA8863F9089746A12F560 32D984BBE681FA20D860EB0AF3312AB41E57E61237C92010EA6F73C685258706 137EF89815CC2D036218193C731DC556242C062066947A92FAD274F5146B5463 D21A0FF621B6462BF1D7805054AC2557CFA5108ED0C3D1B5792DFC5B554B1CFB 8C67D3F32852017C8F481D7B211AF62D78067799072E6EA04545EC9E2E0967A5 EA7F79A44B79A3D713554037D236F231B9647FBBD89BDC30B0D41E4B999DED40 A9AC30CAFA28D4C37143D6F6B88EA269FC09F2C60F2CCD5A833D66F694C33806 6EC74B42E6CF4380899CFF1CCE13CC0E9B73416A399DC7645A5EA2D9D19D9320 3B0D82EE3AD9D9BB57C6EE248BC17636DF07C050838735700D52AC02C2D3A5C4 3EF8CCA53D512AC292A58D49C81270A87899BCD1B9D891E04AFB7CEEBF35E9E9 D5B2626C103330E306210171AAD66039CA3990D53FE77EE77C9081E7DD02C3A9 0EDFE58AC93E9DD00C6799C3FA65EB2A826E4C7071D7A808A8775AD0F93606F6 EF1B6DE8AAFF05465DFD527BF0E93CCD8ECA725AFBD76F9D756B0F40841291F3 A9AE417C87D2DEC1125F2AF51BFAEFCF252DF6CDD486025E56F63147D60AA3FE 485C7D6E538E616F23EE8AED98E0A87B8361E4F4D14B28B8B052DB5D801AE598 47B619D243E99DF5E6398A030A7218DE8325959DF358CAB29D960DDDF6B1E5F6 52471015BCB1F5336728BB27E5A45E9D473467E69C080958ABDD0C027394C9FE 867A6BDFC36E1DC7D6A1B697C1E11F4AC2E176DF42583AAFD98CE475DAC6DE09 B3B15C8424CD690D56AEF7159CD37EAC7178C3CCB13707AF3EF546A536D72C10 D753DEC6357B8C9B92A4B5E14716F3E364D3DB48A48E81661A0C2620796E66E6 5D2D6A5CAAADE991CB0DFFC4AB9A406FBA386007D143957929D6A7F8400A91DF 52AD0333D45E4229C0458A02D49A009364BF1CCE42ABEB073171D9492E5CF7EB 6655FDD1C3A92032BF5400EEC6E0BB6EEFF7075E1F6FDC9C19A4A612E94C417B 611827E9C3204418252062945BE5D3402C7307C26AE533B6DB5C12A3DB280673 20D981BB84B9155E86AAFAA3871ABDF67842CD5CBC7F05150247A9DD2F166605 2FE1F95BA1DF326E99B898FCFFDFDCEFA69D38DF1121FC5AE40776B8EC39C4A2 2C413056807E38A21FBF4DD6E618C2F7160B09CF66CB009252A5C84C49121730 6107F6ACA86D32B6250C41FE32E79399E437E57B2AFCCBCD5C3B2F3DB3B30D46 6F80EFE9A01C8BD316116143CF3784E4C5558EE543D39E798ED9A4642968AE61 0D0A5770B2B7470ED6E46C9F0A9E5CD2BD3E3024A880C3B481D182F473D22385 5A800BD596F164AAB4B4AD10D5DD70CED4BE6BA062987F510CE92EC6879B843C C56568D6ADF7E558D1AD2A888012AF633AEC177296F2E032111C13D498210020 ED0061D92491889A322271133EC8F6A8742C558E4EFA6417B023159D7FAC5DE0 0DE34B92CD7AB11EBD8EC84A60BF7C23CBE92D90010D69C2092558FC75CEA696 372E34A500FF7C3444970F6538B86794A9E325B770EC6E794E85AC0C5B8CC01A 7CEE06EBE8E5D74D9897E832A26C18C393AC3FB1736631C187B277102081570E E483A28F05E6C128BE81B116CA7251885793A3DB036A6E4EE2CE8A988857D104 C08C3B1C647F00F119DF3907C0DCD8A18D746310724B2F216DA49F711D03EC5E 6895F6EFE1F0D67BCEBCC05194A667142DDF03B35E760E51EEABB8F970238133 75514CC4D7F1B08BFC96B494F755ED86359BF54CA89C807CA9EB0E7D0E69C3D9 B1885DDA5F9E36DCEF1118B855978EB149E5C24EEC93E8239E0919469C5788F7 73A6AF6818E9F0F268E9FF8DD45AEF406420F47162AD0CAD181CFCC373EA840D 0A5FDC651FAD47906872E62DC7DA5A348B5DC241B17F1BC35E228D9206E124B6 CDED5A57C4BC51CF8CF7ECD74C4667401B8753A4834778629CDF19E1156C86BB C8E1A6BD90C0310D1303B116A5E1E69193EEC5EDDF68938AE7F6943386F88067 ED960BBC4396E13A05BCAF1B4F0BE74AD4ED22956AC3EB056A87447B5EA54C8D BE446582C3FF51B30F52775013D7883C65C09E8350C3B592802196C399C2591B 2D9C2F4BBC5D25F5F13EC2F97A79C60FA99520BC943C97ECD6256B0E246DD981 4DCC4F37B47438E71E98218198BDB5AA4E1C7D6A7E002C1F26EBAF47F69418F9 A12E4549557F32155DCB35D2A7D96005F17836E3D12ECB28724BDF86927A7428 E14F5CEA6646F77BA2477C042C323D57B035979987C3D89FB43C34AC97AEC23E CE273B412CE8FE4ACC22F22B5D100F9A4F97B6AF2F8C86A8C49CEACE2DF65D49 BE0EFE748EEAB7A7D967056FBFE5190914D39F07BA032642BCF43AD34189CAC5 8FA330B52764F0344286EB9DF0CD7C70A53FBC5B9E340E28DBFD597E485F9371 49588F0AEDF6D91BC262A4AE87C1B751BCCCC1E1636ACA2FF03B2517EDDEB767 B66EB5FBB3D122B575814C0908CA85D418A67C83313E5C8B8D53BD90893246B4 60E23CCA999AB2C9EF8ADE46D5259F6D0A5045E3A37192F7A6EDFC795EE8403A 6089AF4FCB1BAFBE800E552003AB785599D7B05BE632F26CFA7BB10D3B331EF1 16DB4CD2A48879769496B355C3A28D3EDAB70C7EC95D079A958B8E463D47CF14 09D079E75FC8903AF94CB86374220019C94E70A8BAB290D5B76A49915D6D3FE4 C5EC40E431311DDAC4FF406FE8D7A26602E5BB408FAAE1F0EAE5858114365F3B E0AEE1E005C4D807C2ABDC18935C1C8C91A160495F1ED819E1CF016486AE760F 658E731575B14D5D4F8DA534BF5FB1DBDAFA77A98BBF81928CEC26B7C0FFD4B7 A5660607580BFFFBC6D068417F9FABDF3BBBA9DD8EDF4F30E69FB6EF59D411E4 BB834B08134CA0A33C98D8BC50FCF2C4D8CA5C01F983560330CB70BCCA920434 B406238685EE3EC213FD16CF4BE36023218B0DA6426CCDBEC7C6E41ACF6A9D9F 75049F3D39D0C07501505C7EC659CEDD6B1BBB23041AFD329A0EDA5CCE813253 629011A0B5E1A9E25A348AEA8F686B7AB9D90522293ECE79BF8A575A583627C2 7FDC7D0A48DCA0606141CE9B13D6DD3BF6A014E43632245E61C729996F138FB4 928E85433EDC7B553F963E4AFD0C73A16DB78CB3A60E573A89463370756C4AB4 FCDB39D4FA0FAC41E9777C5D513C4DA07F1977F65BD4D49467379F61A65BDFF2 5053DAB349955706C958952B76A52947B323C9AF70D9D3650DE9AEB4AE9A800A 03CB7FF46762AF1FCB4DA760CCF20D71A53C738CB9B76A074F87215ED97AB1E3 305DFDB76DB0CB2CB279A731A117A8F03C8FF3A5AA2DA44AEDE3EED6B509E98E E76092D890818194DB11E4705FFA11681D7A191F0B4480306D980AF1218C85B3 2B052B73CBA34713863E68FA0EAB402F11367FEF2463509DDD70B9FFF00386E0 AEB467AA3DEB5B02F3932E35F466D4DAC1DA4DE706FFDB9218147B06B67BDD49 645174BB8433A0CF23EFBFB2A3E47CE69DAFA55CFC4BC9EC433032B2B45929AA EBF04D7D3DA5DB47A4ACEE0D1162D1A3B5377DCC08D8448DEEC9CB2D428751C5 F72E015BF50CF0173D212C96AE508C49A39539E51A1F8F093A9DC4D130F29C9F 4375ED6B96C9B6C9C3DDEB7A9EC9072CED555C8585E1328549C8A8E1E5601617 F65205196D30AD33FBEF37BA767F977028ADC45E2AC92D0CFA1CAFD840D78D6E 3CD79EAA4BE120653A1A5224512A3E57DD2BDCD605E8F8973B9435D2E8E4C085 2D281170B6B8EDC67B48430A9C7013DA19B0F438FB96EF32FDC0AC0F61D48466 AAA8690B50714AD53C47A4E998C0EFCB0F815065D7D6867B62B0231FF7895991 2BAD395BD1368EB71B28E02ED4D1242D2B84B7A4B82F437E86C81E83285E733D ECA70BCD8505522E032AFB7096A685830DFD5EBE0C175AB7B558360F60A20360 E69CC13EA554BCA3FAFD4623D75CB4A57D4148E3FCFEFEB6BA7411969CF896FB 4F5AF35EF9F7CDC17B96765B565ADD8AF154F4D0BE5768049CA14BC3FD19E526 AA1885DC72C4A83AA1134AB21AF5153DB784EC60A275EC5D133621AB22C8DBBA 163D97F734C791B6A0CBC48166187261181237A8F895F42DD78D8C676D1C0870 00AC2093DC46744A5DF2CE402CCF4092CDA9166F30F62AC368FAB21121995CB4 4BBCFD36473B01AC40B6C80CD6E2C9264B0BCC100ED2FF910FA6D656B946BCC9 5338240FC39A81567020024759ED3D19A0E9CDD618A10705CD8EE2B4CD43410F 0E671A2AFC7FD7D76EDBC3C8552AE2154206BEE1F8218844142A314C8A04805D A729957377EDD1E73742966C0CD60ED48E92BE0DADCF4E8F53CB672620664A21 64533133B5B745C4CDB00C7F2E0EC5F51221C42C96D9D445A4D036E70319E37D 87F23F18F2D0C286E8CE8A2119C38BB2E1D0EB4542752D28E456EF9752AEB9A3 39B4D2CF88245830E5EA83545C064E445C418897D0EEF47F400162686F0901BC B9A847E8F89323EA58F0F8D52396F65D55B334D1494A146F0AD33DC9ADD3597B 3C5EF4F4D9422EA54F13EB9E9822D8DDD83344BE865D0998FE3ECDED3A15F700 B33610727D573EAA76F17F8F122CC6FD1B0E375239780DA303D2B06B57957D1E DB0BD8EC31AD2529243CE5862A285165587CACE04317C3BC3185D4B411141180 B8E77EA6907C795E4D87ABE2C212681F1F35AFE00901924DEBE0C90B081B77B1 C01E10EA03DD380B9C4B808FD3F1E2DD839B0F7AAEFD31B104B41E2764EA0285 3D81C9F63B1FA7AA9AA910F0AFF4E095A302A3930A555D2F7816C7F9E353AE02 620BCAE10E19C37E17EB3D1675232503CED2B7BD50305C1BDA50E9265F360281 D137F79C34EAE905D18E1479AD042812E069BED02CBF6C5C162EC09CFFAF4CF2 E78C6795482B1B0A554F991C5921CEB322AE09B1DA588FBF806FDF124855A7F7 2DEB753402D8CE7CD47601E98280F96B2B783808FBF4437511B7890F3E0E985A 01F7301BBA8EB217869C7BACD543295B433FBFE900347F517B19EAA0D9BD928E ADC826F5543E2EC84B1306EF503413CF85DCB5DF625F1EF34819DAAFE16D43D8 AD57383AD4A06BE663D60AC89C36A68B7A7270A182F79E1BF6365CA0826F6EF8 F85D0BC2AD88DDF3A14217D4C672CA916A92BAA0B1B4C91FEDD1F6ABC2F12D08 3F2307FF5DE326D652CC59CA73F003C454E5457CBD7A3731B1F7045C227AA07B 8F3665CD0F98388595C0581728D8CBE22BE35217D948AC7814465F61D7678527 7400719354B765AF8099759D1DF8BE9FA6797A4B72B05D967750CAF7E543E479 E8F82D80144F27CEC6ADF42C037AEF35D0E685E7AEFBD9E16C3C752AAF3762FB 859F5DEE2DB28A35CFD99987A17BFACC3EEA10C34CD2F7B23842E9D09F45D341 AD13326BB8299F9F8F5021C784A3ECD71D7938DEBD53A60C1522258AF06BCF0B 4D15555EC8B619481F0C2ED5592301AA5F270257BA66D964EE1F6903B55A1E89 BD545065CCD1DE765A007424641544BD5FD90D5D22C6874523730A511DF0BC22 1482C5EDC8C82B9C162C314A0DF440129AC1E1238B31D2F80A6DE5F5D48E1641 AC3E177850FBE7A43BA27384EA8F53B6388700250A9DDB355EC7A7EE54257759 DC78AACE3DB080DAA334EEAB2F74CC4570DCC984E513AEAFD25CD58B5511880C 4A71386B21E25751385A8BBD5BDB2457833DEBB3D1098A904B30CF8D6C21D91D 4B1FF3126B9C0B0B2C8373F5A8B45777BC97B92F16F60F7A284AB6AC4279E846 6B6EBD3511958427F8B434F6E7C6F442E043E6B525EC0CC826F057AC83E8E267 9B7D54FC47D4AE87F089823B58586DF6CDF7E94E4074B1643AEA46E6D3E5C2FF CDB4284AAB859000366B242F5B7C2850E29686D7DEAFF551C885A4C0A07E6D16 0C96D1FAA06559EAA682998105FC87A2240B21B97C4B1684E6AF01B40A2B9396 5F66EA3AA25F30EF53D775AC1E6907D7ADB311AF9010AE3F6C32FD38ECE6B04A 0CFCB7B37C3BC41ED1EF35DB015ECE0C12441092E60CB7C62066B3AC37605D37 18DB5D47593AD8F31F7CEAD38F85D23BDF351C93B2BA344676D4CCBE4F2B1DB0 532C1E49AAB10E62A48E0CC5AC31FCA98314913FE2FEFE248346C4CDB075499A B15547680683362E5D48969EEAE513977BD000606964D817BEAB51765BE254B7 553CAF443CA7D2D06ED940100A69E2456F54985C98A52053786ED98FD4B0C571 202B9D5327ABE49FDDB8ADA813AF6F831618318528C19F52F015E99EF67E7065 92353183C120887E383AB9392A68C0EB36961BC52E0CC9E87E7793230DCEC596 BD4F7C71B5FC1019EB841300E8349733456D14B0B063BE5B4364498CFBBB0F87 D7E71AA49012AD39A5C360E375706BDD6085CF713274CDF021A277B0D84F137C 896D7FF570C0BDD9537E014C3117D22A614D97F9AFC2AD30DEE63FF7E18097D0 B0AD086A56F6791CE1D680DEC3A22A1BB983D5D7A20E0920FCA1A9D023AC96CE 2297079B1EBF526B61CAD8D7509921BD085BFE5F75821E1A003A183EAF473827 04373976A5D5906379C3F701B62AF35F5F0A5B38E74A262F60249ED642ECDBD3 3D2731BE58D38F5BCB36C4DDC87147E48BDB85A37109F646EFBAED981A204226 21CE63012F26BA6634AA2136180792D2966032E84727F9945485A7314BBC9173 056B9550261C21B0C44B37169FF60D3070A1993AA768C3E54282622450C29530 7ACFC375F52E9B59970C883FABC8FE116F9A25EE640D38B227822E35ACB64340 A63E7C25F024075451C196AC27708EFA975DC1E9C574E71C415AC2167E7BDCA0 28971698ACAB32EE8543A241EDB6F1275107E6183AE074AA8539719352C84880 7B416CBF77F5D41C5C86A3FCEFA1D2BA9F23634E7B3A7BDB1893D61E962A9038 6DB43B4B79FE233C71F040DDE88ACC67E753A6FFE78754A5044DFC3EC316215F 4AFBB920FB05BC5503C885271CE075B64A7639C47CF79F7ED827EE3F1AF87F25 A751DD28203BBFECA4F404970D43F591376B080703FC6CC0D54E23ACD51ACB26 D712F3C313A82775E82717C6A7EC5B774324968C13A387FE2D2A661DE80A5618 A9C30C777F8189465D205BAF0A41242BD272920A9EA8CBCBB1B6D97DB260175A DFA34F0FAAB59D09F3825E5D5B126202183BCF68C300215FE1EF63A217241B2D 3CCFE4A6A0EFD8B6E7BAEE8D108A9B141BBCC6A3B0530418AC9537B38E2566EF 8E319EFB5551C2E9FE8C6842E67F511CFAB197E2836E3BBD620FE40B18EE3922 ED7394FAA5C37861B9C9CCC7C65564F7B38980452BD3E9FFD6BF243EBAF091B2 0FE46CA6CB0A4EC92A955236763D3DB0B2CE20BE8497657C854A433B00987208 A9578CCF8AB29643A1012431F56F06A7821DA51C017E1B862DB31C1F26CC2D97 6B303F1E38FFED42E6331D3BB553C794C6DC13FCF987082469AB555532630B92 F819B91094E21B432C40B8F2CC4E69EC9DF48BBAFA15D8D0B05E47E434B024FB 60E0E1BCB76EF4F17DC6C68AF55054EBA240586D054CD54D640C3853668E2F77 CBCC53DA37CAC2392DA7D7A9538A85184E459C9998958CD4C665D46AC25FBBDF 31C6394342A623349E812208AE90975013B41D919A1DFDF1FA26D9D12FF18F58 E8D9AEB0E56FDDEF4CE5C384B019A78F9C8FA9E9A3D78854124B317A779E2ADD A4B1E46B1E5FF5299B1B6D47704566CCE09BDDB9CBC3C33BB9D84CE709496E3F 63D70E738B9313E3A3E336CEBC8DC9390A41F8B3E51F5394F78F27B9770864F4 6776E280B6511195B7FCDB7200DFF85E30837FDE3CC27C456B7FE9209CDE0C25 C5784F9D4826FADE9F6AD14C04C5CAED8FC45D9B89D8AEB350A9F3F2276DAE90 2A6A18A6AD1990FD0D1B7F5971DAD16C383B6CBB4BAA5F59AC8E538A8ACD1BAE 9CEFC30CDA1A54A99A6BD40FF2576D9F549F34CD1C2B9A87C2B5ACB54A92EA5A 6D72FAEC779135432E41D00C7AA407541628BCC27D4A53CB7BFE7F37D11C3963 DBB3661D10A8D5F6F4826219A61B36B921EFE23173958ECA98919ED95725642B 2D7E722D8B252A5FC46EFCC4859E56F0F38B14659023974F3DDE6CD493E32255 297290699D577F282590D172AB173AF6178C2417C35C44055CC1296FA8A6BD6F F170C92045EF44BCEEB1107A2206E6DB91F4D46B1FF458560026D5E9D625FC11 EF95F77B1468617F19961DA7FB02D86BC8A999613E28878F21A38CA38B4C8DD2 01B3739C6DF45F873F21C18F7C1902E3B8FCDF5AA916CA971A3D596E9B0F4517 7AD31A4539968CEC0CFE2D3B78CBC532B005D535C409CF1DDCA699F017324BFE 0A0081A12EF73415A8B952D2D7594E24A5318DA340AC8B3855EB6D43D0ACE9ED A9DD95A2E2B7EED992FD47819D6EC9F327A5F3F257C18E360857147F43BB406E AC898C3D6263B7D6D548B018DA39FA46A48D38CEABC59296A24F3254A09D5B7B E8802408B97786473B0D44A5A2D01D1F56E984EE6C37FD185DCC7C25234D2CF4 6D0C1E411B4585B6FE598E2D48B605E3CDCD69B49C630D05082076044867263D AE3E637191DC69F6BB19994B00475C255346D70FF98766534E9D53F44F04AE48 D1C5F2988AA4BBA4AC3452A138515FF8E6AB47CF24882355069A414D0037B102 F8D21C4A31BEA098087C248F405E374C67E05158C4CE699D2BD96A99E1B1ED10 A826658DD848F1899BC1D2D7E6CA6E07F468432AF6CED14C310C49F3A0F5B490 DA10AC7EF4EADB9045CC3EC5C1420BC3EC59785BCFB7C9D2751C665F3B64EE0A 3F19096BCC6F48BE9172F582153EDDEF5A57335F1108777A20E2BE7D137D1BAD 1D765F16CA4C2C2AE5C729D1502B34658740FCD5838A3549F5ACA2179914A1C3 E2B55AB3127BD7D9E87A0956A492758467C410A7A8ECBF131D318FD3CBD7F916 744211A131928DC8D4D6160BAF473EE5EFED9F2EA5E7078AD746E0C73CBFC8FD E09D24827286D649D6FD8684D75EEF952D005F05BED30DBC76F4CCBD03E61C2B 6A90546B34889FB7749F00226E2C0641D8ECB42F3AE42402DA778DC025888EE9 6F32500BE5DBA899C7E872D32F32F99AC40579AE84D6B5B0A076E0E7FE3A1FED EAFEA478F02122B670705E7DE045951C4A67958D2ABE84A3F438DC42E2D6EEEC 6AA7C41A9D5A36ACA091D1C34EEC12B6CF2A49F768368F3D6D173C846E191C3D 1A5FB00448B59DE4289A2D205B43E89D45C2A76F487634E6C9DE61B1D293B63D 769C6A4F51D59B9BB4953C830D4451EECA5312B012839BB9345AAFDEBB80AF97 132EAFE6E60B1E60E7BA7AF27694CAE7362BE3C5CAEA2A3440534A57D99E99D5 BE003AA0FDA5F9B2DBC51D971EA3F77A5649C1309C48D1960C315CB1E7241231 F85B0F4C23BF5F398ADF09FF50170CD8FB7D89B50B1EFFA7626CD2E36D5B0142 80A3F35C2FC02CA6594C7AAD463FA351EB2F97B8015A35D798F2E23911242890 49024B884BBBC2A6BDF39CF93578DB9048028F7C7E7F7CF4AD11A9B6AD7F867F 61D13F85AB89F75DCAFAA53B6DC961ABD72569AFA6FC642B346776EBC1751C15 952186AFA48DC427E02E14779C44924786F8023A0D14BC9A24DE7A782906BCEC 8C4D63D7C342C09AAAAD78409EC793FC41F47862A836917969D2EFB721C78D5B 3F73282E49F4EF4932F1DCBFCB5B4E813406778E4DCEB637CE6BC6899631814F E70510715630E2A04DA17E26D764444FD48012D026B01BF07481AD984C38A72E 7AD037BCD5D3847F4D93E72D3FE1A78C2E7C2C2A777FE6707F431F1ACBA47AC6 676D3EA8DA84FEA99F82377D0B0BF96B4976F1C0B27CE3EB18B34AF572DFAE3B D64AF475E5243F235F1B8C4E7340F0EEB36987105889442FA2D22D6D55149DC6 EF4DFBE0826014C60A04C1B8FEC4019CD92C526B01012C928F83CED7AA989A5E 8474D0F210B8CAC531A6E83AD4358B5179156D0ACB31C4BDA47BB718EEB6F0DC 4FC43809B3EBBB14C37FDAF11DC0ECCBBAAD3FC2EF10B05E5E6F0A6FE7151C80 518736D26FC2C4E708DC227B88F483784476DF46F09139B5C935FD7E03B5988E A6C20237733D1AAF4641392A988A337F4C67B33920457E39EBD1168F62B45FC5 0A884F06D02D6ABEBDC6CD8FDB3E32B2FBB32060F290D51E5DA5CCE8F517CC34 CB0E4F94B9F7F95EBFE958EFBB3053B1AFAE41D37E1F34117324FF76D31BC60C B1584C1177A6B63A570E36271C177BFA8D533487BADBF1B11C11D605A5F76816 4BD0BF43980809C5A8FD14C79AE92E0EBEB32E5C5324F9F9AEB0890ABB692856 9491CFF217117276FD178F8ED8018C076B31A45E59D1A672FB33A99B78C8F2F8 3E31D694F4A01307F567FE112A15B00DD5FF8C4BBAF4C6A6FEA92232A1FB1BA7 67A306EDD6E376067154627AC4DFE70E05D59A07BC3375EEA31B1E9F782AA44F 67A603D72A8D794F4D1F0104E7F1333C8A54FE8B0A96935B6EC4D1CEB96E4295 D0C487BEAC775B015DE8E6078B30E34575B888CBAA456D1B5C9AB72F15CFDF79 63AC8056162A485B5EFB7531BA06950C434780C7BE582C922D12452F5356971F 87D891D1708B65FD979DD19991A0BDBCFA8E282DED5A67B0D62EBA933B0EDBC2 F55C98A517AE8B1415EC9B24876DEF6E3590EB56CD4B0676F4F4DDC5740F0C81 17B07718A8603CDF9A1084BD3ADEE37A3928170E73C55C81B71F57F3564B0858 255B2D2D49BC032861DACFEC43AAB2FA35A67DD82936A473AA3DE8E5225B4711 B6A94D814A9AA1B56593F9589EC243EB64E71B1B626939BDCAA918213D8A9C5C DE467F66049E1E2D3E25B50EDC7CE321EE5EE7EF9925DA6890698726F2FC64BC C8F312D50F7F9701B52BB235CF7D3515A19254BAEBA4619826496746C0E9FA85 3EE112266681356A5883D4D24668AC33F13A80A8D18CBCB8984722803CEEDC70 25068CFF2814206E3030BC86F96363E030428BFB7809AF51365157E7AC38D137 58F842D951F5231800CA424667DE3B4D09927AF3C268BBF154A8638595C27814 9E264AC450AA96D1D74BBBE49D8F3FF51F293E3B0002FDB157C38A24856FDDC8 21E3AFD52BD723AF077799EEF93C38898262559152DC7751C89DF1D441D80917 3734585EA46B2876A7E8D7EE19AC8966CF4B0EE7C4FD602801E333FCE1DEFE06 6EB4DEA276F7920014F39CBEAE8F7B31C89AD4677BE99EDAEA21324A18669378 0E615D258D73C67CE6A59DBDE1018A8C41A4DDB05F4B3AA68970C9258A4B05C2 6D66A9E67869BB7E3D79AE5B12B24A91D4674C819757FA830270C1EA068E44E9 8EFF5396A1EC66EA2487ABACFDB1155BDFE6BFEB09DA005758FE117A99930C98 2096AAB68577E1C7ACE12A9577ECD86DF2DB78814BE9124CD02F59CA5563B427 9F5B756352EBD670A0C813169525C44468044C134D0B1B0BCE829D3E2FB29FED 2720966307BA224D6FFBA5CB6BB151ECD9DE935A9C865B762D687FE6849D3972 915FA4A4F383CD9CE7CF5E14F613C0CB9C95CD7589A3A5EE4C381DC550197EEB 2744C24CD7FB797744D0DA80DD492B7DF0BF406B0059FAB576DA271E0DBCE77C D015F4EB79AA08C036E25F797B5094567BCD556893E41F33DD90FBFED22AFF16 6571A9C51CDA4D3ACB72309DF4D662457FDF0FFCD5F45CCC3D7A9256E2BB190F 3DA685EEEDCE16CCC02D1E063E414F86AD84890D3F1BC98FBD8DC907963964D1 7B9484C99008B6F280D8FBC1C32A7371388AD12ADE4119A2BC43E0BD0052C559 B937D5C3010CEA2DC06F379B287538DE805202F1706383AB10BBDA5A4402289D C5A6012A026F6A7B6772E37F88556744865767825E6C475F1F318E1FC46A28F0 8CE18A2C6C4AF9B4B925BB6FB269929C2DFE30B78BA7E7480B27352CFEF4E37C 3B713326012F21A2315E17E742F9B2E2D7AF6D0B192A041B650A108920BE72A9 E70C974052E8B4B2ED1ADE13C29C9DF32D9FB83224A4004669FBB6759F77D750 8B1C8364062ADEF0DA225D19C71A6FBD5A76F14BF5904B0A8A69958294A84299 77E1F24D06D824131C8D97F4DE51483A44A35AB6768F5501BEDBBC39AF79DBB4 9E7C8F63C9234CC59688D4D7090A63FF6C7CF862CCB3CB610757D4BD7BE99A60 EDCF4FC13323415210C36626B103DC98F9DE09A79934DE3DBC0E3DB0C79BDC7E 63161884C6EC1A1160757F86429657A1469250593FCAF9F42C685DABBC626200 8600FE7680E4664948FE46F27D5CB8EC20358D4326D9699E51BA465E6F5C0619 03371464F18B9164875EBA253AFE1BB14F6D497CE1964B34AA0E05B85AE287EF 3F67B4217D065010F52811056AC1490B8B4546933C9AA9BE1DFDCBC2C4EBF8B2 12093F2E333A372442D0A47FCD3E740E5F2083F79DD01179D0ABD2CDB1D34D22 634790F1F724EF45DD10C91336D4A4A33B4E447126756C2C26C8AC796EB20478 2A96E04FA4D25735AF4652B0ECE7FC1844C86B0157CA65DA117CC080FD8EDC98 78A6351EF9949D9A3EB75E43C0079C47C13366057C61591ABC5481512C948CB7 5B2CDBEEB2513E54B1F330537202B54C3685579B75642A4613875EF82A94EC9F 3E0C39DCA273C2F616BED16E8C10F7743ECD33C87D38DD306BDC90BE59634C6A 729B2A05F594529FB0CDAF1F567860BD494305FF65B9A143A06B19668F463757 843F35E79474085975EA3EE23CC090BBCA37181B74B53C01C499CC8DD274D0F6 A2C053FE2D42777998082C059B82C237FBD3C3D290FB06EBC4A7893325028BCF 476E74B79A81E8F7DBE4587AB8593539C89861457F04DC3667D7C4A7DAAAD405 860E20ACB52C5128E94D929F73218D219F766F58C326DAE57225FE3492F69A80 EE737041757B0F1D0C5A4EC330FB31DD9EABD0ACDB5E7238E8DF4D5C7980C257 4AD16A19D09934EE0CD60F4B170EE69FB1E380122FE23A6778C5FCA9061D0F78 6E6A26590C8A643C4584855A62707EA85614DF17FBFA43F60D9FAC0D30D470CC EFC9749375831B89C14C0465785508A8674FEE5C465322DE07ACE853DE79C61F 2E85B208964A1E649E53C42FE1DB80658D7EBE40A32D25D08CC8441BEC8718CA 826CCC95EF5BD8874C3DBA8B153C5963BD4498C80D639589A69CCB9085B44DB2 9CD48BCB3A26B5FDE5781EAB487F8871029A56883E9B210943393C25E396738E F9CC21D1AAE36B9B35DBC534D41731701E85F65B2B0404423BE5F518B98B0FAF 982E93D9C2695CFE5199F5517F1E9783E835D823C56A8EEB6F4B155D5F376E2F 86023762F9110FF4C972C76CBFF9E5DAE5EDFE903DAD397D83C87CE74733C2D8 CC4A1A3622C5BC3A3B3F5201D91275D0D2E941DFE51BF7D8CE8250CC25C95AB8 F964230E825AF9CD5428FA2279FD7A52D2212D9C1AF42E43A6109304A2DE1CC9 68685461A2F592C1044AD35AD0C3AD22FC1B8F7549B1D26E8C052C78EE4AEBBD C9730AF09A654C47549647C9E0A92AF7D8669070323C65FC9B2A93A9143B7E3A D0792B2B66C11E09C350F19B775D0BBC3113F941B9F49148119E12E078CAAEA9 B2EB1BB0E17F58C9A5DD6E46FF26EA80AE52863F96CED6808238888021134DE5 BDE9AEBDAC1555CEC687108D63C2C61D511EF3EBAE2CC6983601AE71FC65501E 425D17FFBA3E061FDFBAE9A5DE46ACEB0248399FE07A74600A1A058F63D59E4D D28295B1B37F400119539E8FECCE2D56FF49571517EF195B8D594683EC395DD5 9953A330F0AFBECE0CACF396CECE0EECFBEC14E844314AA734A9355355E6F993 F429C2139A194ADA0493DD5B4CA1039A845990CEA97739DBDD1A7EC486BAD33B CA8CCF82BC544291021F25760C5A0EA9A8C95FA5FF04DD86D9F1BABE29B22588 15B8454D3704993843B285CB70494DD90793CC39A7C2FA075EECA039595D161D C7233659B161DB1E04200268BFF3A0CC093E4CF49CB8BCAFFBF2B9961A658BD8 7C27D29C9CA459E85A95AB106879C805FBB86F041B4C49502A8739BCB1BF025E C15BEDFB5324CD1FB77B4CE0001BA6DE824FFBDC21765E7AE2BAE63A82F3590E 75067767A1D121DE61007D3CA36322E7CCE0CB8D020065F48DB14221EF65326D B572C8A4C2C4F014F5BF3EDE103175BFCCB61D8373F546EC56553452758A8651 C196A353BED4EAD43B52C029F88BD24116F9A5C360B1DB075E97AC 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR12 %!PS-AdobeFont-1.1: CMR12 1.0 %%CreationDate: 1991 Aug 20 16:38:05 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 44 /comma put dup 46 /period put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 55 /seven put dup 56 /eight put dup 65 /A put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 74 /J put dup 78 /N put dup 80 /P put dup 83 /S put dup 85 /U put dup 97 /a put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 121 /y put readonly def /FontBBox{-34 -251 988 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA04C77322EB2E6A79D73DC194E 59C120A2DABB9BF72E2CF256DD6EB54EECBA588101ABD933B57CE8A3A0D16B28 51D7494F73096DF53BDC66BBF896B587DF9643317D5F610CD9088F9849126F23 DDE030F7B277DD99055C8B119CAE9C99158AC4E150CDFC2C66ED92EBB4CC092A AA078CE16247A1335AD332DAA950D20395A7384C33FF72EAA31A5B89766E635F 45C4C068AD7EE867398F0381B07CB94D29FF097D59FF9961D195A948E3D87C31 821E9295A56D21875B41988F7A16A1587050C3C71B4E4355BB37F255D6B237CE 96F25467F70FA19E0F85785FF49068949CCC79F2F8AE57D5F79BB9C5CF5EED5D 9857B9967D9B96CDCF73D5D65FF75AFABB66734018BAE264597220C89FD17379 26764A9302D078B4EB0E29178C878FD61007EEA2DDB119AE88C57ECFEF4B71E4 140A34951DDC3568A84CC92371A789021A103A1A347050FDA6ECF7903F67D213 1D0C7C474A9053866E9C88E65E6932BA87A73686EAB0019389F84D159809C498 1E7A30ED942EB211B00DBFF5BCC720F4E276C3339B31B6EABBB078430E6A09BB 377D3061A20B1EB98796B8607EECBC699445EAA866C38E02DF59F5EDD378303A 0733B90E7835C0AAF32BA04F1566D8161EA89CD4D14DDB953F8B910BFC8A7F03 5020F55EF8FC2640ADADA156F6CF8F2EB6610F7EE8874A26CBE7CD154469B9F4 ED76886B3FB679FFDEB59BB6C55AF7087BA48B75EE2FB374B19BCC421A963E15 FE05ECAAF9EECDF4B2715010A320102E6F8CCAA342FA11532671CB2E1402F6EF 1C86C12DD93EC6E9E94978D581AE14B1FF467F6E36908DC4D0BEE166931BA22A 0188D6D236E2BADA81390C318DD7E88C1EBD4B6B9FFA5FFE466F7389C89D7C0A 25A3BC4B9425D4AB16830BFAE68574A1EE917DC64353DF4974BEC64E9B47501E 72D049D9051FEBED3F0DEC6BBCEAD42D3FDB18C008FC8E0EBC486E7408AA2F95 A95C52C14C1647C069FCD465D46587E27EA44E0DC41A813758CCACEB6B06F756 D3D9A35BA949E2A034ED3907292AA4464A9E4844CE240D46A5CFC47CEBE8864D 481F5FF2444169C2C6759D88C3A0A22B7827CA721FE27C2F20582578FAC8FD65 3A427B52880DFACE037EDFAAD51CE7EE6580815D57E50A5D65DA4BA9D22114BF 92415E706AF1583B868B862015B6BE393589228D09522CA7028C5005E5C895D0 65F05C0AD0C070C59A03BBE019F6AB26344E3E9F0FEBF58038975F66F7AB5ACF 6B12D93EE890BD5FCA65AC6EDD7EE55684DCDCD5E455F5F228BE8A3E71BA4641 AECCD14DD8065C50B4D95ED3FBDD6C54BC817211A919925694B3C3AC80D751E9 2AC63729DBE43D4466B316973F09BDCBE58DBCB9FF77ADC7AD3656A907F039A5 0DC5228192767BDB50AE7C1669957360BC816C631A6EF047BCC95DED35D4E546 1C659FBE0340F81DC732D2CF4585246573B6B7449E7B2703442B586D90DA009A F8F08192E9B31273F626149F4D674371A39BE67A0A1D5F042C76819B1965219D 0EB5D08C641BE25C6306F3533E33F97F19F8DAD13860A3F076DABC55A954DC94 98635A4419F9A77C7ECDA0F535928D6C98C51F02832162B33C39B286501BE3C5 A52CCC7FD9132FC90610151E2CFA5D2E41533B46175E1A75C56F9F1300B5F8D4 4DF128038068033D07AE26523FDA2593F9E285269233E46E88DADD7CD7E4696E CFF699DD449392E998932D1B0C5D80BA1B12670E48AC6DD5B0F0E33872CBA97E EF43936907EC8220FABC15F34F81ACEA464392BA106ADF6A08FA5D987BCB1D65 6D3D2966E52FE682323EA7E865C5CF0F1FEC83BAE8837647C0590A838213D4CC E4C72951A455B6DF850BC5E0840FDE60F314A67DA456A40ECE9537ED2DDE9F74 8B7D7A1A2F6DD35C46FDE4C939158C033A8B25C4876FA3B0D983EF09373A66CB AA578914AD039799D31E11169800B5ACB748EEAC4079627D1A1E6DBD5DA9D6D4 E3D7CA035B440676770FDAAE44B98B1E5DDB947192BCD7591AC7D140CE067108 C0B556F46679B886270A3B4505593F13B925A7C080D6EEA052ED105F07892854 2FBA0249B61B228F5CC9707CFAA37042E798BDB560591124E4BE426AA0917D98 313C6550F51526CEDB28735A0E103969B0F79D83B412DD04632617BA18E345E4 0B8B39AE12082B003D7E4D8D40B9482D900A02B9F4D54ABC0A5D2B3591963F71 064ED4C01E5D0A30AEFA85ED5472F1649C7BFB141AC785AD961BA4FB5E44DA0F B069E1798DEA77797E2B13BCC22C81DFBD720469512579BBC77E55EF1BA9D27E 8F51B6E3ABC5F479E1AD0F3F98EC1EC52736D1DD42F3FA8B3FE0835F57D4C2D4 A2792D4CC34FD095FDAA1F80FDE5043EA0A00D94EC1F2E4A63315CB27313CE67 62588A285BCEE64DD0FCF25AFEEFB1E9394E86D800F9C60346461AE68CEDA8B3 AFA7234394D193EF0E8CBBE589BEFF0B734F5DB5612FEB812C98147240AEDA4C 73AF6B731A34308B735CE3890C5753162CBF6BBD4B5924068513786FE4789A46 997D74B8C9E4713C847D389B39068BDFC54440C89539FFE08FECD3181EEE8B3A 3358D9C939A9CD27DD1AC003922732E93269CCCBAE223B08A319E93097DEDDCC 78E4C82319273BB107D5BBFAB06DF23EFDF1E27B5DABA3141F7B5791CB8AB0E0 7E9B1B92362497A2F2B4221C69CC11F8D8BC054370F3E3694343D6C0C139C5F7 5229F290BC87558A89B5B8E565B555997F6E3077B75D2DC441832137AEABDE0B D9B6BD4CD125E1160874AABFE5ACDF93012984478095FAE4CB605A389377EA01 6D919207BF28D896B597CDD8B7AF20826D50BBDCD887B1EA92CE598C80A80FE3 144E82451782165FB815E31E873BA8022BC69D8882510F9305D756066F3BB27C 8DE50FFF4AD369BEE1DA909A5F1B6DF597BDD18D5355DC4F08976B05D05E1B1E 9FF9CDFBDF453EDCC8B856E0834A98E4D61447149E81242381C13CE47230E1F6 F9F919DAF5F70404D6FEE2DCA731E782D7A44540EC5A7CF3F7322A8A21B2550C E27E995F67F6AAF324A4376E4AE02AF3FE420E9CD0917185C4AFDE4A40ED4E48 0DFB75533F2F588782BC9C3C05118BD4780765CF469DA3673687F397D55D7493 D08D3CE98538534236450E6FAE1C2E4CF311D613CA2A5637EB6874E17775D476 7F1D03646283406BDB6039881E9B7C34E16F74B9754603778F861A9087C8F5CB 3514BE4DABA9BC00F6E7F77B5E8A155D8EC694E255CFB815ABE162F6E4969D12 FDBA73D0BAE1D0F6C6563808B0445D0ABBE04C3D2484B4FCEC89C509DA1FACEE 38D4D28E5EB53AD2D50D4942414D281C74AEDF032145C6C46300039ADED79F70 6B24054B0F90612494C64EE5F88893BCD8714308671E6A9424CF948F182632D1 8E0216599809DD78D6EF0E1501C69EF3FBC7D1964A3E4E6FEB1E2B294256553D 18A93141E7CECBCCA5803C655C8325BB47BF5164E643037171F22E3A1D3952BC DCD8328649F9084A80FFC419C75B1CF59B9DB95B4983A1B3791FCBFC3A91EC2F 2460DADAC1F9D930B9E60D2CF94BD6623C8D4348D3B7BCC3F42E7671DD554D05 F133E6BAF991311F752F1259FA5628E9CE0455A06E21DB5C5260BF0D4316C23E A8700F73D8D1ECA5C6897A4D92A2850E93FFBFC42ABB13EA8FA107F67B1DE58E A35DBC118CDA430F1B4EF1665E2CBDC12B648E4BFE9CFA034E8E41425EC15BEC 103F989C5319A35B9F4B9ABBE8A918476AE7B23299506448A33AA49A71E5D75A 7967523BD68FE6F7414A5D6705C828E8F1349B310264D885E71BE36920F4A22C 46006735DE7727807CD6A488300C3F82E0FE20A01254FB13E6FAD71202DC902F 4B9F6189E3A08AD5EEACEF3C6793683328A588BE7D39B347F3B1DFEA914A50B6 93A873A2F18DE3B886A451785A85E266F8A95426497E613CD04225AB2F4EDAD9 CDC6F2A4FB9A6F6C9ED6DB4AF85DD0B1FB2C3DDC82544D5AFE4A9C975E78389C 1ED11C62AF3490F9A127911786994AF7E2CCB431DDD2048ECBE0CE271758F2CD BAAC73A49A1FF8A622BA1EFA11F87A781DAB477C8320B492C0BC28F4C18F98A1 29B42EA4EACC899E5ADCEFC3ADA323C52251B9067D37FFC333BC473F67A880AB 96416C1B2EFA78B605CFFD8FF239A51D3B527876B22C62FD0522418D8A90F516 5E9E1A337C57D2BF0317DFA7C8C92868A28ED9639A00C453CA5EABC348A63C10 4A703D6D2C4A6056275255B118FEDCE281D9BF43EF4F509BFE946BCB565A36BA CB097A01AD3F957638AE236B5D2EEAAC93C51ADE56DCB87D1322DA3FE74EF276 3032B5718374FFB60004E6AD7ACE1C7A1A65665782376E905ABE74C028C82205 631AB098670B86504F6E92646B8B4C7C1F1FD3F13586C7A3CF5D5C25A6E5F9DC 126B5D3B6E67C7CD1389261622352D7574639ECD3B981E38E85D0C87BBA981B1 247F31BDED32F67AFACFBC864CD7C19443B75ADA2F57E1A14D118C7A98419B6A 39069D308A7D74C1787094F4ACD13F07FDDECC07111A1C99091465624DF29D1D 2600B8F0380CAB00947EC36AE6CF6DF782ADCEC528A74E4A6649190CEAAD9087 D07C97DC32ED2DF9CF14AD281CF25E29843B6A0CE8C4CA21C97280B659641446 8DB3EF5A8B7CD76CD276D92CEDD4894F3B8DF32C68745C53CE1B506ED65F9BDD E87962F9DD02CE42D0C7A6541A2B243F2639B8F870BE3BC3A0600324F377E27C C52B3D87CBB28C6FF10FD7665C4E52F5869F4CAF4494A63310A0284533667A3B 47B9B6332F24793CCE265BFA6213C3E64131910853050EC445F78D3025181EF4 9D325FD83CFE99CDDFB39AC858F485473BC971C1C9ECE5E59698588F2B430622 E855EBE4A92931699A96B11D2BCA6F4999BDE11241F99C761C6293F820057A35 A82F6970B102B02ED7E7901B9DB189CD7FE723119D7D03608174B79D70F624ED CC5834E7EBBFD2667452650174BB41E86155BE1EB2EC198E31E400396BFA6C56 0F99A75C123870BC8AECC9C2EFC2F2242855B016B21F8389999647CCEDA4A9B1 BA4374832743B804CF3D805FD2E83988D70F3EACF19F26FCDFBF063E9DDC2520 2B342BC8C29FA81C3311DA6C63B5B14FA95BA618C07647D996A7007BF08111FF 271E16D03EC4C5A4881183282D3E1AF656FECE20BB962B111A4354E852048D31 9117736FE242DBE4C5BE1DFEAF4FA179EF82EA5AAFAF9558C86C8892FD22FAD1 0FCCF005F5971A75177061C558FF55C3074BBA2E812C3C5FC7C1ACE3208E97B9 1D4BB7F8228B842B3EF43BF9DA2E53088D80179830BBE3E890FDB69A98981B4D 7905847B4845C2CDBD062234230F33CD6C4049B3AD0540BF0A1EAF3387865E99 36A47982E1E2608ADFAEBF7E038F0AABAABD2336B75E3FF72C2F875C82031FE6 98EA811BB0B5AD5C1768ECC4E1901D9303A39173C840D8F67D2DCD75992B2F07 D2B9E704471ACD79955187D3777D94532C474DF5879EC1A5AAF12FCB5645D430 8943824D883BE1D6FE914636C1BBF8E2B62F0594ABD9E58CCE9E545C456B432F B7F00867FC5F5F0B82E65CCFBFF8A1F150831DC1168F2B15410F25ADBAEB6855 2A8782812B9A4716CDAEFAC87B910F42AEE6BC7716C2E5F0B91E9BF7769CCB85 FB2681C291605339C32D1AD91F845F5D1D2D0459D7CE6946DEB567080C3A6678 33B20CDC79DEA12F931D653471E86731217F26B1F78CCA7260D1861F86CA9BF8 F4C64F8739E481E0D9E38942F76DB56F2808A6926E1BA03B817EEDDDB312213B CFDC1A19C3E9313192BA121384A71BE91A8D36A78E745EA1DE0E50433D6B628B 0ADD3D0824A882925F6F369F8C1C7DFB22EABE1E5F038FCB8150AED8E1E2617D CF82A3074A8A207870237AA14ABF0A6448BA75157542455D7DE50DA4103D1133 C751F54FAF473D8721A90C9B59A50EBA594CCCC7E95D5028B5EE7E43F17B0015 6F991D5699B51D7C12B6E57900BFD1541E636ED7641F97664DB39F024F8E41F6 7BE519780167DABCCA1CE21F2AA3345A8CD86CA80322FE2CE76B8A422BEC1B32 42F4D38AA69189E20687C2E28EF0CE9CA79686058AB5E253B47B79044F0724AF E351DB86E084A179576ECA1F63BCF322FE2B59EEEA83E1710D35E4D7B0194C1C A9054293F664C43940415A877CC576D92F0BD603F3AC5D87501B993725C82FE5 F3925AA44A6DF886AEAB0277B1CBDEB9057E97979B248134CEBB2538BB83EFF7 A31A14BB67F431D620B04A5CE2705D42A4C26659A58C34B69C4EBB2EAE2857EA 7CC96E66FA079C9ED8A2EA2715DE8D08EF54B94A809D3FB482410A62CF41956D FC0E8A19B4F650592C96058D3773248BFB71DCC0E226D351BB95C2E81C80BE87 91E73014FEE65D8814D9497862852288629EC01162AA7561950B1722929708E6 908B71AFFAEB0E6587A91D754D760EA942781535102D89E67564BC12177D5D5B 442FBA8084907DB440DCDA86D463B457255CE30DDB30CEA0B69D10BD692D4574 5B0159A5670566561007B0D984DF7E6B9FD1288891EDE716F31DAE853007A669 14A1BE191F2B20606532F653752DB005E12A9EC540BBFC908370E838799FB494 E7A78D4B4A6D904ADA6756212DB876DDDB6B63BD64AF2F639E32AE7280BCF8C9 B2332E2DB5BDBA9AAB77E9745426C7D0FB5FB8DF5E4EF3B635B79788A7945EFD D245D47A2E52A02BE26E731A19364F78D6A82A58093F3E21E65AC0F349903788 48AAC23ADF10F3AA8B5FA235E6FC52245E07FF78CF97D6A6C311DE8A672CA58A 2EB6033869C4AC8EE2413F459F80B483CC334B91B96175ED276A4FF47BBE08F0 9D22FEE23EFC6C22C7748714D8E16A1B7D384561593BBB8C6C6AF14476646CFD B556AFAAB4A4636EC6A60FF4CB9DCE8F87C289210037E4D988D552CAE2EA07B1 A46469366F3E780532B932F7AC8FDC8BAEE953B64152BF3E67AA8F5818AC9CAB 8ADF13EFE3D463A147DF1A5747380166967F3FBA1AEF4B138B8511AAE46D7ECB DD9BB1A7301E7D85DE1ED6E5271BB3188F81B2CAF0EAE59A24D0ED257BF8B272 543C58B8419634E365D04A2FE2DC2C351214A67458B4E7CCDB86650AF611A0C7 81E7748E2C784D30EBE61F2DDB44E86EC90D48F5796B1FAAC6CF9518601E3236 097E3ADCE39EDB365AC1E6C2958B3C5656F242890D7BC09D475FC423043FBC19 FC995911D2116DBDEC7B55305811B06850BFD920941CF01616A81EB8696D0BE9 8C6E9D9F78BCC4DE3976E68EE2A8FD070FE18004E4518CEE4F792D87BD20F8A3 DB3B2C8E2153EE655FA39C54CFD0BE65DF88CE2B216F415A20EDC1B443B4E767 712C192869994CF617058F6BD196E1586A748FF8E4EAAD9F05D83B5CF70313BD F7105CBF4FB5E09EF3E3C691ADCDD0067719618B4C8F81C86C6290AB1C4B7E49 B377775687B80A4345D60B411838436C09FB789DC0D18A2BE3DA4E24F3FAD7BA 8EA3FF77EE60F5BB8C53B5FF8A7C3B47B15E7DDDA0E51B88D8D66DB36FB568F9 59F74E1201DDAA5DE325BD2702F78C7D9DE574EDAACE1EB37D95AC7632276B1E 4EB0A042C1C8DB284A3DEF3892737E718ED6A047B37E4C1DEC3B7D5F9921D559 7A4C344A9F9E25F7D268D6BC252CA1B6F0238DB02E7D670996C3BED8F73BCBA2 7B7A5B11FF047A74D842E1C9313A7C16D266AAE48A2A412595F917DA64429C18 576F684A22764800867C19893DC951C8A675CE6C171161088377FB6E312000A8 8B31FBFA7D9300415E18F26C0AA721B7122C68B7157D33013C9EBF92E211B773 812AFF797A7A27670626D60583FE989C481BD026B60D185BB94503E41A3B72A4 296266AEB8A927B4EE3CE95E6B6D37BA2011F58CAB151DC774188EA84C9CAD33 4110D90FA8F3084BCBBB553DC0AE6497FE2759107AEBF19B2A46D44D835BFE99 31E160E43D4015BE6A43D4A664E5404AC34DC6F99C8E2C5B504B3941CA750463 5BDA5D9AF4E203FF1ADB0AA8978CFDEC3EBAF1EA843F2C8E29D9E57A28F500EC 270532075E8E43A456E61961E4E48D542232FDEDB8C7E6B1EBFF4F84986E67AE 3C27A34B238D237A210F01061F437B2B5543E5ADEDED7528982E4EF21EDEC074 255B36F7755FD1A29367D203ABDEBB333E95D89A9E817625F7DC117FEDA5E102 8CC480B750D48B83A44C9F32CF2DB34603A5388EF912BFDFC718E7712DC4880D 68D695E5007ED1C558AB4710210D000D379A5100262904FF64560D719745D9A6 93DF9EC50F2647D3C1F4FC5A1D21AC040B5D65C11C84B8A5EE737A10B6368581 E6D28936B56D254CC88499643417ECC7B1AB6EF4870EFD15408E1F7C108E3DB8 9C3EE8F8B39B9F0D4F41E7F596A225EED09913E4B04E6F797746AE44B891FE4D 97B7A346E557945519E1B08657324AE29378B57B1E2E10CCB7D3E545FCF1E761 BF925F643413C4BF87DCDF8080CBFB221457CD07F1D6CD24F1E84E3FF2922C45 1C802C2B53AB8B8146E38A8780C90A069CC9BEEA1EF399DAFB2F05B69E55DB16 44AA294F19F9378AE23C962CCDD057D510A29BC6214F1D0B0A45CAB2A89DF733 64E3C0D7A76E75A684E795CADD238A932369B6A9E624EAD5453A51168BCEAD83 B0BDE569AE4D32025B960D02763A2D0E56CACE0D62ED552AFAAA246179D286DC AA461FBF981DDB756577AEDBBB2C850E5A250AB41A3D38ECB74D6C4AC7DA5587 63127D61844648C07E66E8D58C8706B5E190CEA70ED8BDC57A1E3313B7646663 15588472521F5CD61E23F5D886F5C43062895647F2C43F789F9EEC5D0A214F60 18A3B55C9D39018687C2A9DCB029CD5C500CD45096841E059C6EFEDFAE7245B4 CB0CC4D91E9F25C35EE03292D920DE0DD977B5A93664DB6A54329FCE401F8C78 B9655F45CFDBA5907A155A28CB6F5A2B13AA73F646FA39B702CAF397EE321525 DB98960B92608DE43089759AED96165C61A28CCC7E0A39FEACBAF517C9DD54E3 6788B110B588112C5C0453BF4C98245438D824EBC18F105B4D1D792081F3DEAF 55C898505058B9D9315F898F5B85E78CC33F192316C38C9311B14160993B6CD6 B74DEF3A0B156501F4ED85C342FEF32FDC7FA9C3050AC136FE96CB9973F6A89F 955FDEC598995FB513F137676346FC9C4D6143D529DFA679D69D2BEBB77D5522 BCE91455BFB9433EDFA9CED4487DFFC7A93371EF16FC849B83B928F8A37DCC5C 0BCC2F2271BC2B92973764382390C6B4CB326BF63B9B30033853FA1DCE6E1ABF A96164F9CE7C7315EC8A3F1E05A487AA6C73CF6255609FDDB4B9ABC2E3A85903 C7BE83F04E85645DF36EB2E320213CF2C8D0C86F3C21A5D26A4C3C2137B5E0FA 57D12CAB6B3627F63BA394FD47A9E71B536AA21E976EECA23B86E9317C38A355 A5408DB4A580313D161B7D5F3B9B455B89445EC82A54A656A90F3930BB9D155C 85AAFBED8CBB02B601C9457853227BC5D7B66E7A61F7E49AF76C3E5CAA7D51EB 047394A00E28B27C1D42B95307AA41B4F8ACE22477C4C5B35351F83DF0666975 5A6C90F044E66DD6955645504B3F30A0B72167CC611F5B5B91E63D7089E5B9BC A9F991905DDB7D3F70FC71B2A21546E3AF4FEF1FCBD917158BA79F994E6D288C A396072FA282A8FB639798311A9BD600C8D283AF2467D26E0106B60E159428BE B2063A9F4065F14DBA 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont TeXDict begin 39139632 55387786 1000 300 300 (gprolog.dvi) @start /Fa 145[26 26 3[26 7[26 55[26 26 40[{}6 49.8132 /CMTT12 rf /Fb 144[20 2[12 4[20 1[19 21[32 33 15[32 1[32 60[{}8 41.511 /CMMI10 rf /Fc 139[13 16 15 3[21 4[12 4[17 100[{}6 29.0577 /CMMI7 rf /Fd 134[22 22 1[22 22 22 22 22 1[22 22 22 22 22 22 22 22 22 22 1[22 22 22 22 22 7[22 2[22 22 22 22 22 1[22 22 22 22 22 22 1[22 22 22 22 22 22 22 22 22 14[22 22 49[{}45 41.511 /CMITT10 rf /Fe 134[20 19 1[19 22 14 17 18 19 21 21 23 34 11 2[13 21 19 13 19 21 19 1[21 16[28 32 2[26 1[22 16 2[27 2[30 16[21 21 3[15 32[23 12[{}32 41.511 /CMTI10 rf /Ff 133[25 30 30 40 30 31 22 22 23 1[31 28 31 47 16 30 17 16 31 28 17 26 31 25 31 27 9[58 42 43 39 31 42 1[38 42 44 53 34 2[21 1[44 35 37 43 40 40 42 7[28 28 28 28 28 28 28 28 28 28 28 16 19 16 31[31 12[{}59 49.8132 /CMBX12 rf /Fg 149[12 6[18 18 43[0 4[42 4[42 7[42 21 21 42 42 10[32 32 4[21 12[32 1[32{}16 41.511 /CMSY10 rf /Fh 129[22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 1[22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 33[{}93 41.511 /CMTT10 rf /Fi 132[24 1[25 25 34 25 27 19 19 20 25 27 24 27 40 13 25 15 13 27 24 15 22 27 21 27 23 8[36 49 36 37 33 27 36 1[33 36 37 45 29 2[18 37 38 30 31 37 34 34 36 6[13 24 24 24 24 24 24 24 24 24 24 24 13 16 13 30[27 27 28 11[{}65 41.511 /CMBX10 rf /Fj 129[18 3[18 18 18 18 18 18 18 18 18 1[18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 11[18 18 1[18 18 1[18 18 4[18 2[18 18 1[18 2[18 5[18 8[18 1[18 18 18 45[{}42 33.2088 /CMTT8 rf /Fk 198[15 15 15 15 15 15 15 15 15 15 48[{}10 24.9066 /CMR6 rf /Fl 186[22 11[17 17 17 17 17 17 17 17 17 17 48[{}11 29.0577 /CMR7 rf /Fm 128[21 3[21 18 22 22 30 22 23 16 16 16 22 23 21 23 35 12 22 13 12 23 21 13 18 23 18 23 21 3[12 21 12 25 31 31 43 31 31 30 23 31 32 28 32 31 38 26 32 21 15 31 33 27 28 32 30 29 31 1[20 1[32 1[12 12 21 21 21 21 21 21 21 21 21 21 21 12 14 12 32 21 16 16 12 32 3[21 14[21 2[12 1[35 23 23 24 11[{}88 41.511 /CMR10 rf /Fn 133[30 35 35 49 35 37 26 27 27 1[37 34 37 56 19 35 1[19 1[34 21 31 37 30 37 33 11[52 2[50 1[46 1[53 4[25 1[53 42 1[52 49 1[51 7[34 34 34 34 34 34 34 34 34 3[22 32[37 12[{}44 59.7758 /CMBX12 rf /Fo 134[31 1[42 31 33 23 23 23 1[33 29 33 49 16 2[16 33 29 18 26 33 2[29 11[44 1[33 2[40 1[44 3[30 2[46 38 40 45 42 1[44 8[29 29 2[29 29 29 29 29 1[16 1[16 44[{}39 59.7758 /CMR12 rf /Fp 170[74 2[72 1[66 73 76 1[58 4[76 71[{}7 86.0938 /CMBX12 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 300dpi TeXDict begin %%PaperSize: A4 end %%EndSetup %%Page: 1 1 TeXDict begin 1 0 bop -30 651 a Fp(GNU)33 b(PR)m(OLOG)p -30 712 1890 24 v 18 811 a Fo(A)20 b(Nativ)n(e)g(Prolog)g(Compiler)g (with)f(Constrain)n(t)g(Solving)h(o)n(v)n(er)g(Finite)f(Domains)793 885 y(Edition)g(1.8,)h(for)g(GNU)f(Prolog)h(v)n(ersion)g(1.3.0)1453 942 y(Jan)n(uary)f(4,)h(2007)-30 2485 y Fn(b)n(y)k(Daniel)d(Diaz)p -30 2511 1890 12 v eop end %%Page: 2 2 TeXDict begin 2 1 bop -30 2222 a Fm(Cop)o(yrigh)o(t)13 b(\(C\))i(1999-2007)c(Daniel)i(Diaz)-30 2322 y(P)o(ermission)e(is)g (gran)o(ted)f(to)h(mak)o(e)f(and)h(distribute)g(v)o(erbatim)f(copies)h (of)f(this)h(man)o(ual)e(pro)o(vided)h(the)i(cop)o(yrigh)o(t)e(notice) -30 2372 y(and)k(this)g(p)q(ermission)g(notice)g(are)h(preserv)o(ed)h (on)d(all)g(copies.)-30 2471 y(P)o(ermission)j(is)g(gran)o(ted)g(to)g (cop)o(y)g(and)g(distribute)g(mo)q(di\014ed)g(v)o(ersions)g(of)f(this)h (man)o(ual)f(under)h(the)h(conditions)f(for)-30 2521 y(v)o(erbatim)i(cop)o(ying,)f(pro)o(vided)g(that)h(the)g(en)o(tire)h (resulting)e(deriv)o(ed)h(w)o(ork)g(is)f(distributed)h(under)h(the)f (terms)g(of)f(a)-30 2571 y(p)q(ermission)d(notice)h(iden)o(tical)e(to)h (this)g(one.)-30 2671 y(P)o(ermission)e(is)g(gran)o(ted)g(to)g(cop)o(y) g(and)g(distribute)h(translations)e(of)h(this)g(man)o(ual)e(in)o(to)h (another)i(language,)e(under)i(the)-30 2721 y(ab)q(o)o(v)o(e)g (conditions)g(for)g(mo)q(di\014ed)g(v)o(ersions,)h(except)g(that)g (this)f(p)q(ermission)g(notice)h(ma)o(y)e(b)q(e)i(stated)g(in)f(a)g (translation)-30 2770 y(appro)o(v)o(ed)h(b)o(y)g(the)g(F)m(ree)h(Soft)o (w)o(are)f(F)m(oundation)746 2755 y Fl(1)763 2770 y Fm(,)g(51)f(F)m (ranklin)f(St,)i(Fifth)f(Flo)q(or,)g(Boston,)h(MA)g(02110-1301,)d(USA.) p -30 2869 756 2 v 17 2896 a Fk(1)34 2908 y Fj(http://www)o(.fs)o(f.o)o (rg/)p eop end %%Page: 1 3 TeXDict begin 1 2 bop -30 -45 a Fm(CONTENTS)1634 b(1)p -30 -27 1890 4 v -30 115 a Fn(Con)n(ten)n(ts)-30 206 y Fi(1)39 b(Ac)o(kno)o(wledgemen)o(ts)1404 b(9)-30 298 y(2)39 b(In)o(tro)q(duction)1513 b(11)-30 389 y(3)39 b(Using)15 b(GNU)g(Prolog)1379 b(13)33 439 y Fm(3.1)41 b(In)o(tro)q(duction)13 b(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(13)33 488 y(3.2)41 b(The)15 b(GNU)e(Prolog)g(in)o(teractiv)o(e)i(in)o (terpreter)35 b(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(13)128 538 y(3.2.1)63 b(Starting/exiting)12 b(the)j(in)o(teractiv)o (e)f(in)o(terpreter)29 b(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(13)128 588 y(3.2.2)63 b(The)14 b(in)o(teractiv)o(e)g(in)o(terpreter)i (read-execute-write)g(lo)q(op)41 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(14)128 638 y(3.2.3)63 b(Consulting)13 b(a)g(Prolog)g(program)g(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)50 b(16)128 688 y(3.2.4)63 b(In)o(terrupting)14 b(a)g(query)42 b(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)50 b(17)128 738 y(3.2.5)63 b(The)14 b(line)f(editor)i(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)50 b(18)33 787 y(3.3)41 b(Adjusting)14 b(the)g(size)h(of)e (Prolog)g(stac)o(ks)31 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)50 b(19)33 837 y(3.4)41 b(The)15 b(GNU)e(Prolog)g(compiler)18 b(.)i(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)50 b(20)128 887 y(3.4.1)63 b(Di\013eren)o(t)14 b(kinds)g(of)f(co)q (des)19 b(.)i(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 50 b(20)128 937 y(3.4.2)63 b(Compilation)11 b(sc)o(heme)17 b(.)j(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 50 b(20)128 987 y(3.4.3)63 b(Using)13 b(the)i(compiler)38 b(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)50 b(22)128 1036 y(3.4.4)63 b(Running)13 b(an)g(executable)30 b(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(25)128 1086 y(3.4.5)63 b(Generating)14 b(a)f(new)h(in)o(teractiv)o(e) h(in)o(terpreter)38 b(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(25)128 1136 y(3.4.6)63 b(The)14 b(hexadecimal)f(predicate)i(name)f(enco)q (ding)29 b(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(26)-30 1227 y Fi(4)39 b(Debugging)1554 b(29)33 1277 y Fm(4.1)41 b(In)o(tro)q(duction)13 b(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(29)33 1327 y(4.2)41 b(The)15 b(pro)q(cedure)g(b)q(o)o(x)f(mo)q(del)31 b(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)50 b(29)33 1377 y(4.3)41 b(Debugging)13 b(predicates)h(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)50 b(29)128 1427 y(4.3.1)63 b(Running)13 b(and)g(stopping)h(the)g(debugger)19 b(.)i(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 50 b(29)128 1476 y(4.3.2)63 b(Leashing)13 b(p)q(orts)18 b(.)i(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)50 b(30)128 1526 y(4.3.3)63 b(Sp)o(y-p)q(oin)o(ts)27 b(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)50 b(30)33 1576 y(4.4)41 b(Debugging)13 b(messages)34 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(31)33 1626 y(4.5)41 b(Debugger)15 b(commands)23 b(.)d(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(31)33 1676 y(4.6)41 b(The)15 b(W)-5 b(AM)14 b(debugger)32 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)50 b(32)-30 1767 y Fi(5)39 b(F)l(ormat)15 b(of)g(de\014nitions)1340 b(35)33 1817 y Fm(5.1)41 b(General)14 b(format)28 b(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(35)33 1867 y(5.2)41 b(T)o(yp)q(es)15 b(and)f(mo)q(des)k(.)i(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)50 b(35)33 1916 y(5.3)41 b(Errors)30 b(.)21 b(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)50 b(37)128 1966 y(5.3.1)63 b(General)14 b(format)f(and)g(error)i(con)o(text)34 b(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)50 b(37)128 2016 y(5.3.2)63 b(Instan)o(tiation)13 b(error)i(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)50 b(37)128 2066 y(5.3.3)63 b(T)o(yp)q(e)14 b(error)25 b(.)c(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(38)128 2116 y(5.3.4)63 b(Domain)12 b(error)41 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(38)128 2166 y(5.3.5)63 b(Existence)15 b(error)43 b(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(39)128 2215 y(5.3.6)63 b(P)o(ermission)14 b(error)19 b(.)i(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(39)128 2265 y(5.3.7)63 b(Represen)o(tation)14 b(error)41 b(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(39)128 2315 y(5.3.8)63 b(Ev)n(aluation)12 b(error)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)50 b(40)128 2365 y(5.3.9)63 b(Resource)15 b(error)21 b(.)f(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)50 b(40)128 2415 y(5.3.10)42 b(Syn)o(tax)13 b(error)26 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(40)128 2464 y(5.3.11)42 b(System)14 b(error)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(40)-30 2556 y Fi(6)39 b(Prolog)15 b(directiv)o(es)g(and)g(con)o(trol)f(constructs) 942 b(41)33 2606 y Fm(6.1)41 b(Prolog)13 b(directiv)o(es)35 b(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(41)128 2655 y(6.1.1)63 b(In)o(tro)q(duction)25 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(41)128 2705 y(6.1.2)63 b Fh(dynamic/1)21 b Fm(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(41)128 2755 y(6.1.3)63 b Fh(public/1)11 b Fm(.)20 b(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)50 b(41)128 2805 y(6.1.4)63 b Fh(multifile/1)10 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)50 b(42)128 2855 y(6.1.5)63 b Fh(discontiguous/1)19 b Fm(.)h(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)50 b(42)128 2904 y(6.1.6)63 b Fh(ensure)p 413 2904 14 2 v 14 w(linked/1)27 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(43)p eop end %%Page: 2 4 TeXDict begin 2 3 bop -30 -45 a Fm(2)1633 b(CONTENTS)p -30 -27 1890 4 v 128 115 a(6.1.7)63 b Fh(built)p 391 115 14 2 v 14 w(in/0)p Fm(,)13 b Fh(built)p 628 115 V 15 w(in/1)p Fm(,)f Fh(built)p 865 115 V 15 w(in)p 924 115 V 15 w(fd/0)p Fm(,)h Fh(built)p 1162 115 V 14 w(in)p 1220 115 V 15 w(fd/1)k Fm(.)j(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)50 b(43)128 165 y(6.1.8)63 b Fh(include/1)21 b Fm(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)50 b(44)128 215 y(6.1.9)63 b Fh(ensure)p 413 215 V 14 w(loaded/1)27 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(44)128 264 y(6.1.10)42 b Fh(op/3)35 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(44)128 314 y(6.1.11)42 b Fh(char)p 369 314 V 15 w(conversion/2)14 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)50 b(44)128 364 y(6.1.12)42 b Fh(set)p 347 364 V 15 w(prolog)p 494 364 V 14 w(flag/2)22 b Fm(.)e(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(45)128 414 y(6.1.13)42 b Fh(initialization/1)29 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(45)128 464 y(6.1.14)42 b Fh(foreign/2)p Fm(,)11 b Fh(foreign/1)26 b Fm(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(45)33 513 y(6.2)41 b(Prolog)13 b(con)o(trol)h(constructs)44 b(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)50 b(46)128 563 y(6.2.1)63 b Fh(true/0)p Fm(,)12 b Fh(fail/0)p Fm(,)g Fh(!/0)35 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(46)128 613 y(6.2.2)63 b Fh(\(','\)/2)12 b Fm(-)i(conjunction,)f Fh(\(;\)/2)g Fm(-)h(disjunction,)f Fh(\(->\)/2)f Fm(-)i(if-then)26 b(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(46)128 663 y(6.2.3)63 b Fh(call/1)23 b Fm(.)d(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(47)128 713 y(6.2.4)63 b Fh(catch/3)p Fm(,)12 b Fh(throw/1)17 b Fm(.)j(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)50 b(47)-30 804 y Fi(7)39 b(Prolog)15 b(built-in)g(predicates) 1243 b(49)33 854 y Fm(7.1)41 b(T)o(yp)q(e)14 b(testing)44 b(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(49)128 904 y(7.1.1)63 b Fh(var/1)p Fm(,)12 b Fh(nonvar/1)p Fm(,)g Fh(atom/1)p Fm(,)g Fh(integer/1)p Fm(,)f Fh(float/1)p Fm(,)h Fh(number/1)p Fm(,)g Fh(atomic/1)p Fm(,)278 953 y Fh(compound/1)p Fm(,)f Fh(callable/1)p Fm(,)g Fh(list/1)p Fm(,)h Fh(partial)p 1077 953 V 15 w(list/1)p Fm(,)g Fh(list)p 1336 953 V 15 w(or)p 1395 953 V 15 w(partial)p 1564 953 V 14 w(list/1)17 b Fm(.)k(.)50 b(49)33 1003 y(7.2)41 b(T)m(erm)14 b(uni\014cation)35 b(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(50)128 1053 y(7.2.1)63 b Fh(\(=\)/2)12 b Fm(-)i(Prolog)f(uni\014cation)36 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(50)128 1103 y(7.2.2)63 b Fh(unify)p 391 1103 V 14 w(with)p 493 1103 V 15 w(occurs)p 640 1103 V 15 w(check/2)14 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(50)128 1153 y(7.2.3)63 b Fh(\(\\=\)/2)12 b Fm(-)i(not)g(Prolog)f (uni\014able)42 b(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(50)33 1202 y(7.3)41 b(T)m(erm)14 b(comparison)21 b(.)f(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)50 b(51)128 1252 y(7.3.1)63 b(Standard)14 b(total)f(ordering)h(of)f (terms)j(.)k(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(51)128 1302 y(7.3.2)63 b Fh(\(==\)/2)12 b Fm(-)i(term)g(iden)o(tical,)f Fh(\(\\==\)/2)f Fm(-)i(term)g(not)g(iden)o(tical,)278 1352 y Fh(\(@<\)/2)e Fm(-)i(term)g(less)h(than,)e Fh(\(@=<\)/2)g Fm(-)g(term)i(less)f(than)g(or)g(equal)f(to,)278 1402 y Fh(\(@>\)/2)f Fm(-)i(term)g(greater)h(than,)f Fh(\(@>=\)/2)e Fm(-)i(term)g(greater)h(than)f(or)f(equal)h(to)36 b(.)20 b(.)g(.)h(.)f(.)g(.)h(.)50 b(51)128 1452 y(7.3.3)63 b Fh(compare/3)21 b Fm(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(52)33 1501 y(7.4)41 b(T)m(erm)14 b(pro)q(cessing)42 b(.)20 b(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(52)128 1551 y(7.4.1)63 b Fh(functor/3)21 b Fm(.)g(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(52)128 1601 y(7.4.2)63 b Fh(arg/3)13 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)50 b(53)128 1651 y(7.4.3)63 b Fh(\(=..\)/2)12 b Fm(-)i(univ)c(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(53)128 1701 y(7.4.4)63 b Fh(copy)p 369 1701 V 15 w(term/2)17 b Fm(.)j(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(54)128 1750 y(7.4.5)63 b Fh(setarg/4)p Fm(,)11 b Fh(setarg/3)38 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 50 b(54)33 1800 y(7.5)41 b(V)m(ariable)13 b(naming/n)o(um)o(b)q(ering) 18 b(.)i(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)50 b(55)128 1850 y(7.5.1)63 b Fh(name)p 369 1850 V 15 w(singleton)p 582 1850 V 13 w(vars/1)32 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(55)128 1900 y(7.5.2)63 b Fh(name)p 369 1900 V 15 w(query)p 494 1900 V 14 w(vars/2)22 b Fm(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(55)128 1950 y(7.5.3)63 b Fh(bind)p 369 1950 V 15 w(variables/2)p Fm(,)11 b Fh(numbervars/3)p Fm(,)f Fh(numbervars/1)i Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(56)128 1999 y(7.5.4)63 b Fh(term)p 369 1999 V 15 w(ref/2)39 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(57)33 2049 y(7.6)41 b(Arithmetic)11 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)50 b(57)128 2099 y(7.6.1)63 b(Ev)n(aluation)12 b(of)h(an)h(arithmetic)g(expression)36 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(57)128 2149 y(7.6.2)63 b Fh(\(is\)/2)12 b Fm(-)i(ev)n(aluate)g (expression)22 b(.)f(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(59)128 2199 y(7.6.3)63 b Fh(\(=:=\)/2)12 b Fm(-)i(arithmetic)f (equal,)h Fh(\(=\\=\)/2)e Fm(-)i(arithmetic)f(not)h(equal,)278 2249 y Fh(\(<\)/2)e Fm(-)i(arithmetic)g(less)g(than,)g Fh(\(=<\)/2)e Fm(-)i(arithmetic)g(less)g(than)g(or)g(equal)g(to,)278 2298 y Fh(\(>\)/2)e Fm(-)i(arithmetic)g(greater)h(than,)e Fh(\(>=\)/2)g Fm(-)g(arithmetic)h(greater)h(than)f(or)g(equal)f(to)38 b(.)21 b(.)50 b(60)33 2348 y(7.7)41 b(Dynamic)13 b(clause)i(managemen)o (t)34 b(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)50 b(60)128 2398 y(7.7.1)63 b(In)o(tro)q(duction)25 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)50 b(60)128 2448 y(7.7.2)63 b Fh(asserta/1)p Fm(,)11 b Fh(assertz/1)26 b Fm(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)50 b(61)128 2498 y(7.7.3)63 b Fh(retract/1)21 b Fm(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(62)128 2547 y(7.7.4)63 b Fh(retractall/1)20 b Fm(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(62)128 2597 y(7.7.5)63 b Fh(clause/2)11 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(63)128 2647 y(7.7.6)63 b Fh(abolish/1)21 b Fm(.)g(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(63)33 2697 y(7.8)41 b(Predicate)15 b(information)36 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)50 b(64)128 2747 y(7.8.1)63 b Fh(current)p 435 2747 V 14 w(predicate/1)35 b Fm(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(64)128 2797 y(7.8.2)63 b Fh(predicate)p 479 2797 V 13 w(property/2)14 b Fm(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(65)33 2846 y(7.9)41 b(All)13 b(solutions)f(.)21 b(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)50 b(66)128 2896 y(7.9.1)63 b(In)o(tro)q(duction)25 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)50 b(66)p eop end %%Page: 3 5 TeXDict begin 3 4 bop -30 -45 a Fm(CONTENTS)1634 b(3)p -30 -27 1890 4 v 128 115 a(7.9.2)63 b Fh(findall/3)21 b Fm(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)50 b(66)128 165 y(7.9.3)63 b Fh(bagof/3)p Fm(,)12 b Fh(setof/3)17 b Fm(.)j(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(66)33 215 y(7.10)20 b(Streams)31 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(67)128 264 y(7.10.1)42 b(In)o(tro)q(duction)25 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)50 b(67)128 314 y(7.10.2)42 b Fh(current)p 435 314 14 2 v 14 w(input/1)27 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(69)128 364 y(7.10.3)42 b Fh(current)p 435 364 V 14 w(output/1)37 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)50 b(69)128 414 y(7.10.4)42 b Fh(set)p 347 414 V 15 w(input/1)17 b Fm(.)j(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(69)128 464 y(7.10.5)42 b Fh(set)p 347 464 V 15 w(output/1)27 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(70)128 513 y(7.10.6)42 b Fh(open/4)p Fm(,)12 b Fh(open/3)28 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)50 b(70)128 563 y(7.10.7)42 b Fh(close/2)p Fm(,)12 b Fh(close/1)17 b Fm(.)j(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(72)128 613 y(7.10.8)42 b Fh(flush)p 391 613 V 14 w(output/1)p Fm(,)12 b Fh(flush)p 715 613 V 15 w(output/0)i Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(72)128 663 y(7.10.9)42 b Fh(current)p 435 663 V 14 w(stream/1)37 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)50 b(73)128 713 y(7.10.10)21 b Fh(stream)p 413 713 V 14 w(property/2)15 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(73)128 762 y(7.10.11)21 b Fh(at)p 325 762 V 15 w(end)p 406 762 V 15 w(of)p 465 762 V 15 w(stream/1)p Fm(,)12 b Fh(at)p 724 762 V 15 w(end)p 805 762 V 15 w(of)p 864 762 V 16 w(stream/0)26 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)50 b(74)128 812 y(7.10.12)21 b Fh(stream)p 413 812 V 14 w(position/2)15 b Fm(.)20 b(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(74)128 862 y(7.10.13)21 b Fh(set)p 347 862 V 15 w(stream)p 494 862 V 14 w(position/2)31 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)50 b(75)128 912 y(7.10.14)21 b Fh(seek/4)i Fm(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(75)128 962 y(7.10.15)21 b Fh(character)p 479 962 V 13 w(count/2)16 b Fm(.)k(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(76)128 1012 y(7.10.16)21 b Fh(line)p 369 1012 V 15 w(count/2)27 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)50 b(77)128 1061 y(7.10.17)21 b Fh(line)p 369 1061 V 15 w(position/2)26 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(77)128 1111 y(7.10.18)21 b Fh(stream)p 413 1111 V 14 w(line)p 515 1111 V 15 w(column/3)f Fm(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)50 b(77)128 1161 y(7.10.19)21 b Fh(set)p 347 1161 V 15 w(stream)p 494 1161 V 14 w(line)p 596 1161 V 15 w(column/3)36 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)50 b(78)128 1211 y(7.10.20)21 b Fh(add)p 347 1211 V 15 w(stream)p 494 1211 V 14 w(alias/2)32 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(79)128 1261 y(7.10.21)21 b Fh(current)p 435 1261 V 14 w(alias/2)27 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)50 b(79)128 1310 y(7.10.22)21 b Fh(add)p 347 1310 V 15 w(stream)p 494 1310 V 14 w(mirror/2)10 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 50 b(79)128 1360 y(7.10.23)21 b Fh(remove)p 413 1360 V 14 w(stream)p 559 1360 V 15 w(mirror/2)9 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(80)128 1410 y(7.10.24)21 b Fh(current)p 435 1410 V 14 w(mirror/2)37 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)50 b(80)128 1460 y(7.10.25)21 b Fh(set)p 347 1460 V 15 w(stream)p 494 1460 V 14 w(type/2)h Fm(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 50 b(81)128 1510 y(7.10.26)21 b Fh(set)p 347 1510 V 15 w(stream)p 494 1510 V 14 w(eof)p 574 1510 V 15 w(action/2)26 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(81)128 1559 y(7.10.27)21 b Fh(set)p 347 1559 V 15 w(stream)p 494 1559 V 14 w(buffering/2)9 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)50 b(82)33 1609 y(7.11)20 b(Constan)o(t)14 b(term)g(streams)k(.)i(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(82)128 1659 y(7.11.1)42 b(In)o(tro)q(duction)25 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(82)128 1709 y(7.11.2)42 b Fh(open)p 369 1709 V 15 w(input)p 494 1709 V 14 w(atom)p 596 1709 V 15 w(stream/2)p Fm(,)12 b Fh(open)p 899 1709 V 15 w(input)p 1024 1709 V 14 w(chars)p 1148 1709 V 15 w(stream/2)p Fm(,)278 1759 y Fh(open)p 369 1759 V 15 w(input)p 494 1759 V 14 w(codes)p 618 1759 V 15 w(stream/2)i Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 50 b(83)128 1809 y(7.11.3)42 b Fh(close)p 391 1809 V 14 w(input)p 515 1809 V 15 w(atom)p 618 1809 V 15 w(stream/1)p Fm(,)12 b Fh(close)p 943 1809 V 14 w(input)p 1067 1809 V 15 w(chars)p 1192 1809 V 15 w(stream/1)p Fm(,)278 1858 y Fh(close)p 391 1858 V 14 w(input)p 515 1858 V 15 w(codes)p 640 1858 V 15 w(stream/1)25 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)50 b(83)128 1908 y(7.11.4)42 b Fh(open)p 369 1908 V 15 w(output)p 516 1908 V 14 w(atom)p 618 1908 V 15 w(stream/1)p Fm(,)12 b Fh(open)p 921 1908 V 14 w(output)p 1067 1908 V 15 w(chars)p 1192 1908 V 15 w(stream/1)p Fm(,)278 1958 y Fh(open)p 369 1958 V 15 w(output)p 516 1958 V 14 w(codes)p 640 1958 V 15 w(stream/1)25 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(84)128 2008 y(7.11.5)42 b Fh(close)p 391 2008 V 14 w(output)p 537 2008 V 15 w(atom)p 640 2008 V 15 w(stream/2)p Fm(,)11 b Fh(close)p 964 2008 V 15 w(output)p 1111 2008 V 14 w(chars)p 1235 2008 V 15 w(stream/2)p Fm(,)278 2058 y Fh(close)p 391 2058 V 14 w(output)p 537 2058 V 15 w(codes)p 662 2058 V 14 w(stream/2)36 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)50 b(84)33 2107 y(7.12)20 b(Character)15 b(input/output)32 b(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)50 b(85)128 2157 y(7.12.1)42 b Fh(get)p 347 2157 V 15 w(char/2)p Fm(,)12 b Fh(get)p 584 2157 V 15 w(char/1)p Fm(,)g Fh(get)p 821 2157 V 15 w(code/1)p Fm(,)g Fh(get)p 1058 2157 V 15 w(code/2)38 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(85)128 2207 y(7.12.2)42 b Fh(get)p 347 2207 V 15 w(key/2)p Fm(,)12 b Fh(get)p 562 2207 V 15 w(key/1)h(get)p 766 2207 V 15 w(key)p 847 2207 V 15 w(no)p 906 2207 V 15 w(echo/2)p Fm(,)f Fh(get)p 1143 2207 V 16 w(key)p 1225 2207 V 15 w(no)p 1284 2207 V 15 w(echo/1)38 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)50 b(86)128 2257 y(7.12.3)42 b Fh(peek)p 369 2257 V 15 w(char/2)p Fm(,)12 b Fh(peek)p 628 2257 V 15 w(char/1)p Fm(,)g Fh(peek)p 887 2257 V 14 w(code/1)p Fm(,)h Fh(peek)p 1146 2257 V 14 w(code/2)j Fm(.)k(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(87)128 2307 y(7.12.4)42 b Fh(unget)p 391 2307 V 14 w(char/2)p Fm(,)12 b Fh(unget)p 671 2307 V 15 w(char/1)p Fm(,)g Fh(unget)p 952 2307 V 15 w(code/2)p Fm(,)g Fh(unget)p 1233 2307 V 15 w(code/1)24 b Fm(.)d(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(88)128 2356 y(7.12.5)42 b Fh(put)p 347 2356 V 15 w(char/2)p Fm(,)12 b Fh(put)p 584 2356 V 15 w(char/1)p Fm(,)g Fh(put)p 821 2356 V 15 w(code/1)p Fm(,)g Fh(put)p 1058 2356 V 15 w(code/2)p Fm(,)g Fh(nl/1)p Fm(,)h Fh(nl/0)39 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(88)33 2406 y(7.13)20 b(Byte)15 b(input/output)29 b(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(89)128 2456 y(7.13.1)42 b Fh(get)p 347 2456 V 15 w(byte/2)p Fm(,)12 b Fh(get)p 584 2456 V 15 w(byte/1)28 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(89)128 2506 y(7.13.2)42 b Fh(peek)p 369 2506 V 15 w(byte/2)p Fm(,)12 b Fh(peek)p 628 2506 V 15 w(byte/1)k Fm(.)k(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(90)128 2556 y(7.13.3)42 b Fh(unget)p 391 2556 V 14 w(byte/2)p Fm(,)12 b Fh(unget)p 671 2556 V 15 w(byte/1)38 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)50 b(90)128 2606 y(7.13.4)42 b Fh(put)p 347 2606 V 15 w(byte/2)p Fm(,)12 b Fh(put)p 584 2606 V 15 w(byte/1)28 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(91)33 2655 y(7.14)20 b(T)m(erm)14 b(input/output)19 b(.)i(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)50 b(91)128 2705 y(7.14.1)42 b Fh(read)p 369 2705 V 15 w(term/3)p Fm(,)12 b Fh(read)p 628 2705 V 15 w(term/2)p Fm(,)g Fh(read/2)p Fm(,)g Fh(read/1)27 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)50 b(92)128 2755 y(7.14.2)42 b Fh(read)p 369 2755 V 15 w(atom/2)p Fm(,)12 b Fh(read)p 628 2755 V 15 w(atom/1)p Fm(,)g Fh(read)p 887 2755 V 14 w(integer/2)p Fm(,)g Fh(read)p 1211 2755 V 15 w(integer/1)p Fm(,)278 2805 y Fh(read)p 369 2805 V 15 w(number/2)p Fm(,)f Fh(read)p 671 2805 V 15 w(number/1)26 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)50 b(93)128 2855 y(7.14.3)42 b Fh(read)p 369 2855 V 15 w(token/2)p Fm(,)11 b Fh(read)p 649 2855 V 15 w(token/1)38 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(94)128 2904 y(7.14.4)42 b Fh(syntax)p 413 2904 V 14 w(error)p 537 2904 V 15 w(info/4)10 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(95)p eop end %%Page: 4 6 TeXDict begin 4 5 bop -30 -45 a Fm(4)1633 b(CONTENTS)p -30 -27 1890 4 v 128 115 a(7.14.5)42 b Fh(last)p 369 115 14 2 v 15 w(read)p 472 115 V 14 w(start)p 596 115 V 15 w(line)p 699 115 V 15 w(column/2)30 b Fm(.)20 b(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)50 b(95)128 165 y(7.14.6)42 b Fh(write)p 391 165 V 14 w(term/3)p Fm(,)12 b Fh(write)p 671 165 V 15 w(term/2)p Fm(,)g Fh(write/2)p Fm(,)g Fh(write/1)p Fm(,)g Fh(writeq/2)p Fm(,)g Fh(writeq/1)p Fm(,)278 215 y Fh(write)p 391 215 V 14 w(canonical/2)p Fm(,)f Fh(write)p 780 215 V 15 w(canonical/1)p Fm(,)g Fh(display/2)p Fm(,)h Fh(display/1)p Fm(,)f Fh(print/2)p Fm(,)278 264 y Fh(print/1)33 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(96)128 314 y(7.14.7)42 b Fh(format/3)p Fm(,)11 b Fh(format/2)38 b Fm(.)20 b(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50 b(98)128 364 y(7.14.8)42 b Fh(portray)p 435 364 V 14 w(clause/2)p Fm(,)12 b Fh(portray)p 803 364 V 14 w(clause/1)24 b Fm(.)c(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)50 b(99)128 414 y(7.14.9)42 b Fh(get)p 347 414 V 15 w(print)p 472 414 V 14 w(stream/1)32 b Fm(.)20 b(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(100)128 464 y(7.14.10)21 b Fh(op/3)35 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(100)128 513 y(7.14.11)21 b Fh(current)p 435 513 V 14 w(op/3)28 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(102)128 563 y(7.14.12)21 b Fh(char)p 369 563 V 15 w(conversion/2)14 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(102)128 613 y(7.14.13)21 b Fh(current)p 435 613 V 14 w(char)p 537 613 V 15 w(conversion/2)40 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)29 b(103)33 663 y(7.15)20 b(Input/output)14 b(from/to)f(constan)o(t)i(terms)43 b(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(104)128 713 y(7.15.1)42 b Fh(read)p 369 713 V 15 w(term)p 472 713 V 14 w(from)p 574 713 V 15 w(atom/3)p Fm(,)12 b Fh(read)p 833 713 V 15 w(from)p 936 713 V 15 w(atom/2)p Fm(,)g Fh(read)p 1195 713 V 15 w(token)p 1320 713 V 15 w(from)p 1423 713 V 15 w(atom/2)28 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)29 b(104)128 762 y(7.15.2)42 b Fh(read)p 369 762 V 15 w(term)p 472 762 V 14 w(from)p 574 762 V 15 w(chars/3)p Fm(,)12 b Fh(read)p 855 762 V 15 w(from)p 958 762 V 15 w(chars/2)p Fm(,)g Fh(read)p 1239 762 V 15 w(token)p 1364 762 V 14 w(from)p 1466 762 V 15 w(chars/2)28 b Fm(.)20 b(.)g(.)h(.)29 b(104)128 812 y(7.15.3)42 b Fh(read)p 369 812 V 15 w(term)p 472 812 V 14 w(from)p 574 812 V 15 w(codes/3)p Fm(,)12 b Fh(read)p 855 812 V 15 w(from)p 958 812 V 15 w(codes/2)p Fm(,)g Fh(read)p 1239 812 V 15 w(token)p 1364 812 V 14 w(from)p 1466 812 V 15 w(codes/2)28 b Fm(.)20 b(.)g(.)h(.)29 b(105)128 862 y(7.15.4)42 b Fh(write)p 391 862 V 14 w(term)p 493 862 V 15 w(to)p 552 862 V 15 w(atom/3)p Fm(,)13 b Fh(write)p 834 862 V 14 w(to)p 892 862 V 16 w(atom/2)p Fm(,)f Fh(writeq)p 1196 862 V 14 w(to)p 1254 862 V 15 w(atom/2)p Fm(,)278 912 y Fh(write)p 391 912 V 14 w(canonical)p 603 912 V 14 w(to)p 661 912 V 15 w(atom/2)p Fm(,)h Fh(display)p 987 912 V 14 w(to)p 1045 912 V 15 w(atom/2)p Fm(,)f Fh(print)p 1326 912 V 15 w(to)p 1385 912 V 15 w(atom/2)p Fm(,)278 962 y Fh(format)p 413 962 V 14 w(to)p 471 962 V 15 w(atom/3)g Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)29 b(105)128 1012 y(7.15.5)42 b Fh(write)p 391 1012 V 14 w(term)p 493 1012 V 15 w(to)p 552 1012 V 15 w(chars/3)p Fm(,)12 b Fh(write)p 855 1012 V 15 w(to)p 914 1012 V 15 w(chars/2)p Fm(,)g Fh(writeq)p 1239 1012 V 15 w(to)p 1298 1012 V 15 w(chars/2)p Fm(,)278 1061 y Fh(write)p 391 1061 V 14 w(canonical)p 603 1061 V 14 w(to)p 661 1061 V 15 w(chars/2)p Fm(,)g Fh(display)p 1008 1061 V 15 w(to)p 1067 1061 V 15 w(chars/2)p Fm(,)g Fh(print)p 1370 1061 V 14 w(to)p 1428 1061 V 16 w(chars/2)p Fm(,)278 1111 y Fh(format)p 413 1111 V 14 w(to)p 471 1111 V 15 w(chars/3)22 b Fm(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)29 b(106)128 1161 y(7.15.6)42 b Fh(write)p 391 1161 V 14 w(term)p 493 1161 V 15 w(to)p 552 1161 V 15 w(codes/3)p Fm(,)12 b Fh(write)p 855 1161 V 15 w(to)p 914 1161 V 15 w(codes/2)p Fm(,)g Fh(writeq)p 1239 1161 V 15 w(to)p 1298 1161 V 15 w(codes/2)p Fm(,)278 1211 y Fh(write)p 391 1211 V 14 w(canonical)p 603 1211 V 14 w(to)p 661 1211 V 15 w(codes/2)p Fm(,)g Fh(display)p 1008 1211 V 15 w(to)p 1067 1211 V 15 w(codes/2)p Fm(,)g Fh(print)p 1370 1211 V 14 w(to)p 1428 1211 V 16 w(codes/2)p Fm(,)278 1261 y Fh(format)p 413 1261 V 14 w(to)p 471 1261 V 15 w(codes/3)22 b Fm(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)29 b(106)33 1310 y(7.16)20 b(DEC-10)13 b(compatibilit)o(y)f(input/output)39 b(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)29 b(107)128 1360 y(7.16.1)42 b(In)o(tro)q(duction) 25 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)29 b(107)128 1410 y(7.16.2)42 b Fh(see/1)p Fm(,)12 b Fh(tell/1)p Fm(,)g Fh(append/1)g Fm(.)20 b(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(107)128 1460 y(7.16.3)42 b Fh(seeing/1)p Fm(,)11 b Fh(telling/1)16 b Fm(.)k(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(108)128 1510 y(7.16.4)42 b Fh(seen/0)p Fm(,)12 b Fh(told/0)28 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(108)128 1559 y(7.16.5)42 b Fh(get0/1)p Fm(,)12 b Fh(get/1)p Fm(,)g Fh(skip/1)23 b Fm(.)e(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(108)128 1609 y(7.16.6)42 b Fh(put/1)p Fm(,)12 b Fh(tab/1)40 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)29 b(109)33 1659 y(7.17)20 b(T)m(erm)14 b(expansion)i(.)k(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)29 b(109)128 1709 y(7.17.1)42 b(De\014nite)14 b(clause)g(grammars)19 b(.)h(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)29 b(109)128 1759 y(7.17.2)42 b Fh(expand)p 413 1759 V 14 w(term/2)p Fm(,)12 b Fh(term)p 671 1759 V 15 w(expansion/2)24 b Fm(.)d(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(111)128 1809 y(7.17.3)42 b Fh(phrase/3)p Fm(,)11 b Fh(phrase/2)38 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)29 b(111)33 1858 y(7.18)20 b(Logic,)13 b(con)o(trol)h(and)f(exceptions)33 b(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(112)128 1908 y(7.18.1)42 b Fh(abort/0)p Fm(,)12 b Fh(stop/0)p Fm(,)g Fh(top)p 681 1908 V 15 w(level/0)p Fm(,)g Fh(break/0)p Fm(,)g Fh(halt/1)p Fm(,)g Fh(halt/0)32 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)29 b(112)128 1958 y(7.18.2)42 b Fh(once/1)p Fm(,)12 b Fh(\(\\+\)/1)g Fm(-)i(not)g(pro)o(v)n(able,)f Fh(call/2-11)p Fm(,)e Fh(call)p 1170 1958 V 15 w(with)p 1273 1958 V 15 w(args/1-11)p Fm(,)g Fh(call)p 1597 1958 V 15 w(det/2)38 b Fm(.)29 b(113)128 2008 y(7.18.3)42 b Fh(repeat/0)11 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(113)128 2058 y(7.18.4)42 b Fh(for/3)13 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(114)33 2107 y(7.19)20 b(A)o(tomic)14 b(term)g(pro)q(cessing)36 b(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)29 b(114)128 2157 y(7.19.1)42 b Fh(atom)p 369 2157 V 15 w(length/2)37 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(114)128 2207 y(7.19.2)42 b Fh(atom)p 369 2207 V 15 w(concat/3)37 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(115)128 2257 y(7.19.3)42 b Fh(sub)p 347 2257 V 15 w(atom/5)d Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(115)128 2307 y(7.19.4)42 b Fh(char)p 369 2307 V 15 w(code/2)17 b Fm(.)j(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)29 b(116)128 2356 y(7.19.5)42 b Fh(lower)p 391 2356 V 14 w(upper/2)c Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(116)128 2406 y(7.19.6)42 b Fh(atom)p 369 2406 V 15 w(chars/2)p Fm(,)11 b Fh(atom)p 649 2406 V 15 w(codes/2)38 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)29 b(117)128 2456 y(7.19.7)42 b Fh(number)p 413 2456 V 14 w(atom/2)p Fm(,)12 b Fh(number)p 715 2456 V 15 w(chars/2)p Fm(,)g Fh(number)p 1040 2456 V 14 w(codes/2)35 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)29 b(117)128 2506 y(7.19.8)42 b Fh(name/2)23 b Fm(.)d(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)29 b(118)128 2556 y(7.19.9)42 b Fh(atom)p 369 2556 V 15 w(hash/2)17 b Fm(.)j(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(119)128 2606 y(7.19.10)21 b Fh(new)p 347 2606 V 15 w(atom/3)p Fm(,)12 b Fh(new)p 584 2606 V 15 w(atom/2)p Fm(,)g Fh(new)p 821 2606 V 15 w(atom/1)17 b Fm(.)j(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(119)128 2655 y(7.19.11)21 b Fh(current)p 435 2655 V 14 w(atom/1)16 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(120)128 2705 y(7.19.12)21 b Fh(atom)p 369 2705 V 15 w(property/2)26 b Fm(.)20 b(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(120)33 2755 y(7.20)20 b(List)14 b(pro)q(cessing)36 b(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(121)128 2805 y(7.20.1)42 b Fh(append/3)11 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(121)128 2855 y(7.20.2)42 b Fh(member/2)p Fm(,)11 b Fh(memberchk/2)37 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(121)128 2904 y(7.20.3)42 b Fh(reverse/2)21 b Fm(.)g(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(122)p eop end %%Page: 5 7 TeXDict begin 5 6 bop -30 -45 a Fm(CONTENTS)1634 b(5)p -30 -27 1890 4 v 128 115 a(7.20.4)42 b Fh(delete/3)p Fm(,)11 b Fh(select/3)38 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(122)128 165 y(7.20.5)42 b Fh(permutation/2)30 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(122)128 215 y(7.20.6)42 b Fh(prefix/2)p Fm(,)11 b Fh(suffix/2)38 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 29 b(123)128 264 y(7.20.7)42 b Fh(sublist/2)21 b Fm(.)g(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(123)128 314 y(7.20.8)42 b Fh(last/2)23 b Fm(.)d(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)29 b(124)128 364 y(7.20.9)42 b Fh(length/2)11 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)29 b(124)128 414 y(7.20.10)21 b Fh(nth/3)13 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(124)128 464 y(7.20.11)21 b Fh(max)p 347 464 14 2 v 15 w(list/2)p Fm(,)12 b Fh(min)p 584 464 V 15 w(list/2)p Fm(,)g Fh(sum)p 821 464 V 15 w(list/2)17 b Fm(.)j(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(125)128 513 y(7.20.12)21 b Fh(sort/2)p Fm(,)12 b Fh(sort0/2)p Fm(,)g Fh(keysort/2)g(sort/1)p Fm(,)g Fh(sort0/1)p Fm(,)g Fh(keysort/1)j Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 29 b(125)33 563 y(7.21)20 b(Global)12 b(v)n(ariables)g(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)29 b(126)128 613 y(7.21.1)42 b(In)o(tro)q(duction)25 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(126)128 663 y(7.21.2)42 b Fh(g)p 303 663 V 15 w(assign/2)p Fm(,)12 b Fh(g)p 540 663 V 15 w(assignb/2)p Fm(,)g Fh(g)p 799 663 V 15 w(link/2)39 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(127)128 713 y(7.21.3)42 b Fh(g)p 303 713 V 15 w(read/2)18 b Fm(.)i(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(128)128 762 y(7.21.4)42 b Fh(g)p 303 762 V 15 w(array)p 428 762 V 15 w(size/2)22 b Fm(.)f(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)29 b(128)128 812 y(7.21.5)42 b Fh(g)p 303 812 V 15 w(inc/3)p Fm(,)12 b Fh(g)p 474 812 V 16 w(inc/2)p Fm(,)g Fh(g)p 646 812 V 16 w(inco/2)p Fm(,)g Fh(g)p 840 812 V 15 w(inc/1)p Fm(,)h Fh(g)p 1012 812 V 15 w(dec/3)p Fm(,)g Fh(g)p 1184 812 V 15 w(dec/2)p Fm(,)f Fh(g)p 1355 812 V 16 w(deco/2)p Fm(,)g Fh(g)p 1549 812 V 15 w(dec/1)21 b Fm(.)f(.)h(.)29 b(129)128 862 y(7.21.6)42 b Fh(g)p 303 862 V 15 w(set)p 384 862 V 15 w(bit/2)p Fm(,)13 b Fh(g)p 556 862 V 15 w(reset)p 681 862 V 15 w(bit/2)p Fm(,)f Fh(g)p 852 862 V 15 w(test)p 955 862 V 15 w(set)p 1036 862 V 15 w(bit/2)p Fm(,)h Fh(g)p 1208 862 V 15 w(test)p 1311 862 V 15 w(reset)p 1436 862 V 15 w(bit/2)37 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)29 b(130)128 912 y(7.21.7)42 b(Examples)12 b(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(130)33 962 y(7.22)20 b(Prolog)13 b(state)21 b(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(133)128 1012 y(7.22.1)42 b Fh(set)p 347 1012 V 15 w(prolog)p 494 1012 V 14 w(flag/2)22 b Fm(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(133)128 1061 y(7.22.2)42 b Fh(current)p 435 1061 V 14 w(prolog)p 581 1061 V 14 w(flag/2)32 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)29 b(134)128 1111 y(7.22.3)42 b Fh(set)p 347 1111 V 15 w(bip)p 428 1111 V 15 w(name/2)22 b Fm(.)f(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(135)128 1161 y(7.22.4)42 b Fh(current)p 435 1161 V 14 w(bip)p 515 1161 V 15 w(name/2)32 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(135)128 1211 y(7.22.5)42 b Fh(write)p 391 1211 V 14 w(pl)p 449 1211 V 16 w(state)p 575 1211 V 14 w(file/1)p Fm(,)12 b Fh(read)p 833 1211 V 15 w(pl)p 892 1211 V 16 w(state)p 1018 1211 V 14 w(file/1)i Fm(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)29 b(136)33 1261 y(7.23)20 b(Program)14 b(state)g(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(136)128 1310 y(7.23.1)42 b Fh(consult/1)p Fm(,)11 b Fh('.'/2)i Fm(-)h(program)f(consult)37 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(136)128 1360 y(7.23.2)42 b Fh(load/1)23 b Fm(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(137)128 1410 y(7.23.3)42 b Fh(listing/1)p Fm(,)11 b Fh(listing/0)26 b Fm(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(138)33 1460 y(7.24)20 b(System)15 b(statistics)33 b(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)29 b(138)128 1510 y(7.24.1)42 b Fh(statistics/0)p Fm(,)11 b Fh(statistics/2)24 b Fm(.)c(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)29 b(138)128 1559 y(7.24.2)42 b Fh(user)p 369 1559 V 15 w(time/1)p Fm(,)12 b Fh(system)p 672 1559 V 14 w(time/1)p Fm(,)g Fh(cpu)p 908 1559 V 15 w(time/1)p Fm(,)g Fh(real)p 1167 1559 V 15 w(time/1)26 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(139)33 1609 y(7.25)20 b(Random)13 b(n)o(um)o(b)q(er)h(generator)43 b(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)29 b(139)128 1659 y(7.25.1)42 b Fh(set)p 347 1659 V 15 w(seed/1)p Fm(,)12 b Fh(randomize/0)31 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(139)128 1709 y(7.25.2)42 b Fh(get)p 347 1709 V 15 w(seed/1)d Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)29 b(140)128 1759 y(7.25.3)42 b Fh(random/1)11 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(140)128 1809 y(7.25.4)42 b Fh(random/3)11 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(140)33 1858 y(7.26)20 b(File)14 b(name)f(pro)q(cessing)24 b(.)c(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(141)128 1908 y(7.26.1)42 b Fh(absolute)p 457 1908 V 14 w(file)p 559 1908 V 15 w(name/2)20 b Fm(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(141)128 1958 y(7.26.2)42 b Fh(decompose)p 479 1958 V 13 w(file)p 580 1958 V 15 w(name/4)32 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)29 b(141)128 2008 y(7.26.3)42 b Fh(prolog)p 413 2008 V 14 w(file)p 515 2008 V 15 w(name/2)32 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(142)33 2058 y(7.27)20 b(Op)q(erating)15 b(system)f(in)o(terface)42 b(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)29 b(142)128 2107 y(7.27.1)42 b Fh(argument)p 457 2107 V 14 w(counter/1)25 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(142)128 2157 y(7.27.2)42 b Fh(argument)p 457 2157 V 14 w(value/2)37 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(143)128 2207 y(7.27.3)42 b Fh(argument)p 457 2207 V 14 w(list/1)27 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)29 b(143)128 2257 y(7.27.4)42 b Fh(environ/2)21 b Fm(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(144)128 2307 y(7.27.5)42 b Fh(make)p 369 2307 V 15 w(directory/1)p Fm(,)11 b Fh(delete)p 781 2307 V 14 w(directory/1)p Fm(,)g Fh(change)p 1192 2307 V 15 w(directory/1)20 b Fm(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)29 b(144)128 2356 y(7.27.6)42 b Fh(working)p 435 2356 V 14 w(directory/1)35 b Fm(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(144)128 2406 y(7.27.7)42 b Fh(directory)p 479 2406 V 13 w(files/2)16 b Fm(.)k(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(145)128 2456 y(7.27.8)42 b Fh(rename)p 413 2456 V 14 w(file/2)c Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(145)128 2506 y(7.27.9)42 b Fh(delete)p 413 2506 V 14 w(file/1)p Fm(,)12 b Fh(unlink/1)32 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(146)128 2556 y(7.27.10)21 b Fh(file)p 369 2556 V 15 w(permission/2)p Fm(,)10 b Fh(file)p 758 2556 V 15 w(exists/1)36 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(146)128 2606 y(7.27.11)21 b Fh(file)p 369 2606 V 15 w(property/2)26 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)29 b(147)128 2655 y(7.27.12)21 b Fh(temporary)p 479 2655 V 13 w(name/2)38 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(148)128 2705 y(7.27.13)21 b Fh(temporary)p 479 2705 V 13 w(file/3)38 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(149)128 2755 y(7.27.14)21 b Fh(date)p 369 2755 V 15 w(time/1)c Fm(.)j(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(149)128 2805 y(7.27.15)21 b Fh(host)p 369 2805 V 15 w(name/1)c Fm(.)j(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(150)128 2855 y(7.27.16)21 b Fh(os)p 325 2855 V 15 w(version/1)27 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)29 b(150)128 2904 y(7.27.17)21 b Fh(architecture/1)8 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(151)p eop end %%Page: 6 8 TeXDict begin 6 7 bop -30 -45 a Fm(6)1633 b(CONTENTS)p -30 -27 1890 4 v 128 115 a(7.27.18)21 b Fh(shell/2)p Fm(,)12 b Fh(shell/1)p Fm(,)f Fh(shell/0)33 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(151)128 165 y(7.27.19)21 b Fh(system/2)p Fm(,)11 b Fh(system/1)38 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 29 b(152)128 215 y(7.27.20)21 b Fh(spawn/3)p Fm(,)12 b Fh(spawn/2)17 b Fm(.)j(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)29 b(152)128 264 y(7.27.21)21 b Fh(popen/3)33 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(153)128 314 y(7.27.22)21 b Fh(exec/5)p Fm(,)12 b Fh(exec/4)28 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(153)128 364 y(7.27.23)21 b Fh(fork)p 369 364 14 2 v 15 w(prolog/1)37 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(154)128 414 y(7.27.24)21 b Fh(create)p 413 414 V 14 w(pipe/2)38 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(154)128 464 y(7.27.25)21 b Fh(wait/2)i Fm(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(155)128 513 y(7.27.26)21 b Fh(prolog)p 413 513 V 14 w(pid/1)28 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(155)128 563 y(7.27.27)21 b Fh(send)p 369 563 V 15 w(signal/2)37 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(156)128 613 y(7.27.28)21 b Fh(sleep/1)33 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(156)128 663 y(7.27.29)21 b Fh(select/5)11 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(156)33 713 y(7.28)20 b(So)q(c)o(k)o(ets)15 b(input/output)f(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(157)128 762 y(7.28.1)42 b(In)o(tro)q(duction)25 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)29 b(157)128 812 y(7.28.2)42 b Fh(socket/2)11 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(158)128 862 y(7.28.3)42 b Fh(socket)p 413 862 V 14 w(close/1)16 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(158)128 912 y(7.28.4)42 b Fh(socket)p 413 912 V 14 w(bind/2)c Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)29 b(159)128 962 y(7.28.5)42 b Fh(socket)p 413 962 V 14 w(connect/4)37 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(159)128 1012 y(7.28.6)42 b Fh(socket)p 413 1012 V 14 w(listen/2)27 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)29 b(160)128 1061 y(7.28.7)42 b Fh(socket)p 413 1061 V 14 w(accept/4)p Fm(,)12 b Fh(socket)p 759 1061 V 14 w(accept/3)36 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(160)128 1111 y(7.28.8)42 b Fh(hostname)p 457 1111 V 14 w(address/2)25 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)29 b(161)33 1161 y(7.29)20 b(Linedit)14 b(managemen)o(t)28 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(162)128 1211 y(7.29.1)42 b Fh(get)p 347 1211 V 15 w(linedit)p 516 1211 V 14 w(prompt/1)20 b Fm(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)29 b(162)128 1261 y(7.29.2)42 b Fh(set)p 347 1261 V 15 w(linedit)p 516 1261 V 14 w(prompt/1)20 b Fm(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(162)128 1310 y(7.29.3)42 b Fh(add)p 347 1310 V 15 w(linedit)p 516 1310 V 14 w(completion/1)29 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)29 b(162)128 1360 y(7.29.4)42 b Fh(find)p 369 1360 V 15 w(linedit)p 538 1360 V 14 w(completion/2)e Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(163)33 1410 y(7.30)20 b(Source)15 b(reader)g(facilit)o(y)h(.)k(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)29 b(163)128 1460 y(7.30.1)42 b(In)o(tro)q(duction)25 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)29 b(163)128 1510 y(7.30.2)42 b Fh(sr)p 325 1510 V 15 w(open/3)28 b Fm(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(164)128 1559 y(7.30.3)42 b Fh(sr)p 325 1559 V 15 w(change)p 472 1559 V 14 w(options/2)10 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(164)128 1609 y(7.30.4)42 b Fh(sr)p 325 1609 V 15 w(close/1)d Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(164)128 1659 y(7.30.5)42 b Fh(sr)p 325 1659 V 15 w(read)p 428 1659 V 15 w(term/4)22 b Fm(.)f(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(164)128 1709 y(7.30.6)42 b Fh(sr)p 325 1709 V 15 w(current)p 494 1709 V 14 w(descriptor/1)19 b Fm(.)h(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)29 b(164)128 1759 y(7.30.7)42 b Fh(sr)p 325 1759 V 15 w(get)p 406 1759 V 15 w(stream/2)33 b Fm(.)20 b(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(164)128 1809 y(7.30.8)42 b Fh(sr)p 325 1809 V 15 w(get)p 406 1809 V 15 w(module/3)33 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(164)128 1858 y(7.30.9)42 b Fh(sr)p 325 1858 V 15 w(get)p 406 1858 V 15 w(file)p 509 1858 V 15 w(name/2)c Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(164)128 1908 y(7.30.10)21 b Fh(sr)p 325 1908 V 15 w(get)p 406 1908 V 15 w(position/3)g Fm(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)29 b(164)128 1958 y(7.30.11)21 b Fh(sr)p 325 1958 V 15 w(get)p 406 1958 V 15 w(include)p 575 1958 V 14 w(list/2)38 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)29 b(164)128 2008 y(7.30.12)21 b Fh(sr)p 325 2008 V 15 w(get)p 406 2008 V 15 w(include)p 575 2008 V 14 w(stream)p 721 2008 V 15 w(list/2)f Fm(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)29 b(164)128 2058 y(7.30.13)21 b Fh(sr)p 325 2058 V 15 w(get)p 406 2058 V 15 w(size)p 509 2058 V 15 w(counters/3)15 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)29 b(164)128 2107 y(7.30.14)21 b Fh(sr)p 325 2107 V 15 w(get)p 406 2107 V 15 w(error)p 531 2107 V 15 w(counters/3)k Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)29 b(164)128 2157 y(7.30.15)21 b Fh(sr)p 325 2157 V 15 w(set)p 406 2157 V 15 w(error)p 531 2157 V 15 w(counters/3)k Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)29 b(164)128 2207 y(7.30.16)21 b Fh(sr)p 325 2207 V 15 w(error)p 450 2207 V 15 w(from)p 553 2207 V 14 w(exception/2)14 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)29 b(164)128 2257 y(7.30.17)21 b Fh(sr)p 325 2257 V 15 w(write)p 450 2257 V 15 w(message/8)p Fm(,)11 b Fh(sr)p 730 2257 V 15 w(write)p 855 2257 V 15 w(message/6)p Fm(,)h Fh(sr)p 1136 2257 V 15 w(write)p 1261 2257 V 14 w(message/4)28 b Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(164)128 2307 y(7.30.18)21 b Fh(sr)p 325 2307 V 15 w(write)p 450 2307 V 15 w(error/6)p Fm(,)12 b Fh(sr)p 687 2307 V 15 w(write)p 812 2307 V 14 w(error/4)p Fm(,)g Fh(sr)p 1048 2307 V 16 w(write)p 1174 2307 V 14 w(error/2)30 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(164)-30 2398 y Fi(8)39 b(Finite)15 b(domain)g(solv)o(er)h(and)f (built-in)f(predicates)836 b(165)33 2448 y Fm(8.1)41 b(In)o(tro)q(duction)13 b(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(165)128 2498 y(8.1.1)63 b(Finite)13 b(Domain)g(v)n(ariables)41 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(165)33 2547 y(8.2)41 b(FD)14 b(v)n(ariable)f(parameters)37 b(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)29 b(166)128 2597 y(8.2.1)63 b Fh(fd)p 325 2597 V 15 w(max)p 406 2597 V 15 w(integer/1)11 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 29 b(166)128 2647 y(8.2.2)63 b Fh(fd)p 325 2647 V 15 w(vector)p 472 2647 V 14 w(max/1)34 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(166)128 2697 y(8.2.3)63 b Fh(fd)p 325 2697 V 15 w(set)p 406 2697 V 15 w(vector)p 553 2697 V 14 w(max/1)17 b Fm(.)j(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(167)33 2747 y(8.3)41 b(Initial)13 b(v)n(alue)g(constrain)o(ts)38 b(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)29 b(167)128 2797 y(8.3.1)63 b Fh(fd)p 325 2797 V 15 w(domain/3)p Fm(,)12 b Fh(fd)p 584 2797 V 15 w(domain)p 731 2797 V 14 w(bool/1)f Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(167)128 2846 y(8.3.2)63 b Fh(fd)p 325 2846 V 15 w(domain/2)17 b Fm(.)j(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(168)33 2896 y(8.4)41 b(T)o(yp)q(e)14 b(testing)44 b(.)20 b(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)29 b(168)p eop end %%Page: 7 9 TeXDict begin 7 8 bop -30 -45 a Fm(CONTENTS)1634 b(7)p -30 -27 1890 4 v 128 115 a(8.4.1)63 b Fh(fd)p 325 115 14 2 v 15 w(var/1)p Fm(,)12 b Fh(non)p 540 115 V 15 w(fd)p 599 115 V 16 w(var/1)p Fm(,)g Fh(generic)p 903 115 V 14 w(var/1)p Fm(,)h Fh(non)p 1118 115 V 15 w(generic)p 1287 115 V 14 w(var/1)26 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)29 b(168)33 165 y(8.5)41 b(FD)14 b(v)n(ariable)f(information)24 b(.)d(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)29 b(169)128 215 y(8.5.1)63 b Fh(fd)p 325 215 V 15 w(min/2)p Fm(,)12 b Fh(fd)p 518 215 V 16 w(max/2)p Fm(,)g Fh(fd)p 712 215 V 15 w(size/2)p Fm(,)g Fh(fd)p 927 215 V 16 w(dom/2)29 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(169)128 264 y(8.5.2)63 b Fh(fd)p 325 264 V 15 w(has)p 406 264 V 15 w(extra)p 531 264 V 15 w(cstr/1)p Fm(,)12 b Fh(fd)p 746 264 V 15 w(has)p 827 264 V 15 w(vector/1)p Fm(,)g Fh(fd)p 1086 264 V 15 w(use)p 1167 264 V 15 w(vector/1)i Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(170)33 314 y(8.6)41 b(Arithmetic)14 b(constrain)o(ts)26 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)29 b(170)128 364 y(8.6.1)63 b(FD)13 b(arithmetic)h (expressions)36 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)29 b(170)128 414 y(8.6.2)63 b(P)o(artial)13 b(A)o(C:)g Fh(\(#=\)/2)f Fm(-)i(constrain)o(t)g(equal,)f Fh(\(#\\=\)/2)g Fm(-)h(constrain)o(t)g(not)g(equal,)278 464 y Fh(\(#<\)/2)e Fm(-)i(constrain)o(t)g(less)h(than,)e Fh(\(#=<\)/2)f Fm(-)i(constrain)o(t)g(less)h(than)f(or)g(equal,)278 513 y Fh(\(#>\)/2)e Fm(-)i(constrain)o(t)g(greater)h(than,)e Fh(\(#>=\)/2)g Fm(-)h(constrain)o(t)g(greater)h(than)e(or)h(equal)24 b(.)c(.)h(.)29 b(171)128 563 y(8.6.3)63 b(F)m(ull)12 b(A)o(C:)i Fh(\(#=#\)/2)e Fm(-)i(constrain)o(t)g(equal,)f Fh(\(#\\=#\)/2)f Fm(-)i(constrain)o(t)g(not)g(equal,)278 613 y Fh(\(#<#\)/2)e Fm(-)i(constrain)o(t)g(less)g(than,)g Fh(\(#=<#\)/2)e Fm(-)i(constrain)o(t)g(less)h(than)e(or)h(equal,)278 663 y Fh(\(#>#\)/2)e Fm(-)i(constrain)o(t)g(greater)h(than,)e Fh(\(#>=#\)/2)f Fm(-)i(constrain)o(t)g(greater)h(than)f(or)g(equal)e(.) 21 b(.)29 b(172)128 713 y(8.6.4)63 b Fh(fd)p 325 713 V 15 w(prime/1)p Fm(,)12 b Fh(fd)p 562 713 V 15 w(not)p 643 713 V 15 w(prime/1)f Fm(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)29 b(173)33 762 y(8.7)41 b(Bo)q(olean)14 b(and)g(rei\014ed)g (constrain)o(ts)33 b(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(173)128 812 y(8.7.1)63 b(Bo)q(olean)13 b(FD)h(expressions)e(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(173)128 862 y(8.7.2)63 b Fh(\(#\\\)/1)12 b Fm(-)i(constrain)o(t)g(NOT,)g Fh(\(#<=>\)/2)e Fm(-)i(constrain)o(t)g (equiv)n(alen)o(t,)278 912 y Fh(\(#\\<=>\)/2)e Fm(-)h(constrain)o(t)i (di\013eren)o(t,)f Fh(\(##\)/2)f Fm(-)g(constrain)o(t)h(X)o(OR,)278 962 y Fh(\(#==>\)/2)e Fm(-)i(constrain)o(t)g(imply)m(,)d Fh(\(#\\==>\)/2)h Fm(-)i(constrain)o(t)g(not)g(imply)m(,)278 1012 y Fh(\(#/\\\)/2)e Fm(-)i(constrain)o(t)g(AND,)f Fh(\(#\\/\\\)/2)f Fm(-)i(constrain)o(t)g(NAND,)278 1061 y Fh(\(#\\/\)/2)e Fm(-)i(constrain)o(t)g(OR,)f Fh(\(#\\\\/\)/2)f Fm(-)i(constrain)o(t)g(NOR)e(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)29 b(174)128 1111 y(8.7.3)63 b Fh(fd)p 325 1111 V 15 w(cardinality/2)p Fm(,)11 b Fh(fd)p 693 1111 V 15 w(cardinality/3)p Fm(,)g Fh(fd)p 1061 1111 V 15 w(at)p 1120 1111 V 15 w(least)p 1245 1111 V 15 w(one/1)p Fm(,)h Fh(fd)p 1438 1111 V 15 w(at)p 1497 1111 V 16 w(most)p 1601 1111 V 15 w(one/1)p Fm(,)278 1161 y Fh(fd)p 325 1161 V 15 w(only)p 428 1161 V 15 w(one/1)g Fm(.)20 b(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(175)33 1211 y(8.8)41 b(Sym)o(b)q(olic)13 b(constrain)o(ts)26 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)29 b(176)128 1261 y(8.8.1)63 b Fh(fd)p 325 1261 V 15 w(all)p 406 1261 V 15 w(different/1)31 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 29 b(176)128 1310 y(8.8.2)63 b Fh(fd)p 325 1310 V 15 w(element/3)27 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(176)128 1360 y(8.8.3)63 b Fh(fd)p 325 1360 V 15 w(element)p 494 1360 V 14 w(var/3)12 b Fm(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)29 b(177)128 1410 y(8.8.4)63 b Fh(fd)p 325 1410 V 15 w(atmost/3)p Fm(,)12 b Fh(fd)p 584 1410 V 15 w(atleast/3)p Fm(,)f Fh(fd)p 864 1410 V 16 w(exactly/3)36 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)29 b(177)128 1460 y(8.8.5)63 b Fh(fd)p 325 1460 V 15 w(relation/2)p Fm(,)11 b Fh(fd)p 627 1460 V 16 w(relationc/2)35 b Fm(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(178)33 1510 y(8.9)41 b(Lab)q(eling)13 b(constrain)o(ts)35 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)29 b(179)128 1559 y(8.9.1)63 b Fh(fd)p 325 1559 V 15 w(labeling/2)p Fm(,)11 b Fh(fd)p 627 1559 V 16 w(labeling/1)p Fm(,)g Fh(fd)p 930 1559 V 15 w(labelingff/1)34 b Fm(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)29 b(179)33 1609 y(8.10)20 b(Optimization)13 b(constrain)o(ts)i(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)29 b(180)128 1659 y(8.10.1)42 b Fh(fd)p 325 1659 V 15 w(minimize/2)p Fm(,)11 b Fh(fd)p 627 1659 V 16 w(maximize/2)25 b Fm(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(180)-30 1750 y Fi(9)39 b(In)o(terfacing)14 b(Prolog)h(and)g(C)1235 b(183)33 1800 y Fm(9.1)41 b(Calling)12 b(C)i(from)f(Prolog)30 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)29 b(183)128 1850 y(9.1.1)63 b(In)o(tro)q(duction)25 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)29 b(183)128 1900 y(9.1.2)63 b Fh(foreign/2)12 b Fm(directiv)o(e)17 b(.)j(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)29 b(183)128 1950 y(9.1.3)63 b(The)14 b(C)g(function)38 b(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(184)128 1999 y(9.1.4)63 b(Input)14 b(argumen)o(ts)g(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(185)128 2049 y(9.1.5)63 b(Output)14 b(argumen)o(ts)g(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(185)128 2099 y(9.1.6)63 b(Input/output)14 b(argumen)o(ts)33 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(185)128 2149 y(9.1.7)63 b(W)m(riting)12 b(non-deterministic)i(C)g(co) q(de)32 b(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(186)128 2199 y(9.1.8)63 b(Example:)17 b(input)d(and)g(output)g(argumen)o(ts)32 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(186)128 2249 y(9.1.9)63 b(Example:)17 b(non-deterministic)d(co)q(de)40 b(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(187)128 2298 y(9.1.10)42 b(Example:)17 b(input/output)d(argumen)o(ts)41 b(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(189)33 2348 y(9.2)41 b(Manipulating)12 b(Prolog)h(terms)41 b(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(190)128 2398 y(9.2.1)63 b(In)o(tro)q(duction)25 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(190)128 2448 y(9.2.2)63 b(Managing)12 b(Prolog)h(atoms)f(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(191)128 2498 y(9.2.3)63 b(Reading)13 b(Prolog)g(terms)18 b(.)i(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)29 b(191)128 2547 y(9.2.4)63 b(Unifying)12 b(Prolog)h(terms)43 b(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)29 b(192)128 2597 y(9.2.5)63 b(Creating)13 b(Prolog)h(terms)41 b(.)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)29 b(194)128 2647 y(9.2.6)63 b(T)m(esting)13 b(the)i(t)o(yp)q(e)f(of)f(Prolog)h(terms)h(.)20 b(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)29 b(194)128 2697 y(9.2.7)63 b(Comparing)12 b(Prolog)h(terms)31 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)29 b(195)128 2747 y(9.2.8)63 b(Cop)o(ying)12 b(Prolog)i(terms)i(.)k(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(195)128 2797 y(9.2.9)63 b(Comparing)12 b(and)i(ev)n(aluating)e(arithmetic)i(expressions)34 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(196)33 2846 y(9.3)41 b(Raising)13 b(Prolog)g(errors)18 b(.)i(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)29 b(196)128 2896 y(9.3.1)63 b(Managing)12 b(the)j(error)g(con)o(text)c(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(196)p eop end %%Page: 8 10 TeXDict begin 8 9 bop -30 -45 a Fm(8)1633 b(CONTENTS)p -30 -27 1890 4 v 128 115 a(9.3.2)63 b(Instan)o(tiation)13 b(error)i(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)29 b(196)128 165 y(9.3.3)63 b(T)o(yp)q(e)14 b(error)25 b(.)c(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(196)128 215 y(9.3.4)63 b(Domain)12 b(error)41 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(197)128 264 y(9.3.5)63 b(Existence)15 b(error)43 b(.)21 b(.)f(.)g(.)g(.)h(.)f(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(197)128 314 y(9.3.6)63 b(P)o(ermission)14 b(error)19 b(.)i(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(197)128 364 y(9.3.7)63 b(Represen)o(tation)14 b(error)41 b(.)20 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(197)128 414 y(9.3.8)63 b(Ev)n(aluation)12 b(error)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)h(.)29 b(198)128 464 y(9.3.9)63 b(Resource)15 b(error)21 b(.)f(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(198)128 513 y(9.3.10)42 b(Syn)o(tax)13 b(error)26 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(198)128 563 y(9.3.11)42 b(System)14 b(error)21 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(199)33 613 y(9.4)41 b(Calling)12 b(Prolog)h(from)g(C)31 b(.)20 b(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.) h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(199)128 663 y(9.4.1)63 b(In)o(tro)q(duction)25 b(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)h(.)29 b(199)128 713 y(9.4.2)63 b(Example:)17 b Fh(my)p 513 713 14 2 v 15 w(call/1)c Fm(-)h(a)f Fh(call/1)g Fm(clone)g(.)20 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(200)128 762 y(9.4.3)63 b(Example:)17 b(reco)o(v)o(ering)e(the)f(list)f(of)h (all)e(op)q(erators)33 b(.)20 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(202)33 812 y(9.5)41 b(De\014ning)14 b(a)f(new)i(C)e Fh(main\(\))g Fm(function)37 b(.)20 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h (.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.) 29 b(203)128 862 y(9.5.1)63 b(Example:)17 b(asking)c(for)h(ancestors)30 b(.)20 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)29 b(204)33 953 y Fi(References)1530 b(207)33 1045 y(Index)1637 b(209)p eop end %%Page: 9 11 TeXDict begin 9 10 bop 1839 -45 a Fm(9)p -30 -27 1890 4 v -30 115 a Fn(1)67 b(Ac)n(kno)n(wledgemen)n(ts)-30 256 y Fm(I)15 b(w)o(ould)e(lik)o(e)h(to)g(thank)h(the)g(departmen)o(t)g (of)f(computing)f(science)1040 241 y Fl(2)1075 256 y Fm(at)h(the)h(univ)o(ersit)o(y)g(of)f(P)o(aris)g(1)g(for)g(allo)o(wing) e(me)-30 305 y(the)j(time)f(and)f(freedom)h(necessary)i(to)e(ac)o(hiev) o(e)g(this)g(pro)r(ject.)-30 405 y(I)j(am)f(grateful)h(to)f(the)h(mem)o (b)q(ers)h(of)e(the)h(Lo)q(co)g(pro)r(ject)892 390 y Fl(3)929 405 y Fm(at)f(INRIA)h(Ro)q(cquencourt)1373 390 y Fl(4)1409 405 y Fm(for)f(their)i(encouragemen)o(t.)-30 455 y(Their)d(in)o(v)o(olv)o(emen)o(t)d(in)i(this)g(w)o(ork)f(led)h(to) g(useful)g(feedbac)o(k)g(and)g(exc)o(hange.)-30 555 y(I)e(w)o(ould)f (particularly)g(lik)o(e)f(to)i(thank)f(Jonathan)h(Ho)q(dgson)915 539 y Fl(5)945 555 y Fm(for)f(the)i(time)e(and)g(e\013ort)i(he)f(put)g (in)o(to)e(the)j(pro)q(ofreading)-30 604 y(of)g(this)g(man)o(ual.)j (His)d(suggestions,)h(b)q(oth)f(regarding)g(ISO)g(tec)o(hnical)g(asp)q (ects)i(as)e(w)o(ell)f(as)h(the)h(language)e(in)h(whic)o(h)g(it)-30 654 y(w)o(as)h(expressed,)i(pro)o(v)o(ed)e(in)o(v)n(aluable.)-30 754 y(The)h(on-line)d(HTML)i(v)o(ersion)g(of)f(this)g(do)q(cumen)o(t)i (w)o(as)e(created)i(using)f(H)1148 750 y Fl(E)1164 754 y Fm(V)1189 750 y Fl(E)1205 754 y Fm(A)1236 739 y Fl(6)1268 754 y Fm(dev)o(elop)q(ed)g(b)o(y)g(Luc)g(Maranget)f(who)-30 804 y(kindly)f(dev)o(oted)h(so)g(m)o(uc)o(h)g(of)f(his)g(time)h (extending)g(the)g(capabilities)f(of)g(H)1158 800 y Fl(E)1174 804 y Fm(V)1199 800 y Fl(E)1215 804 y Fm(A)h(in)f(order)i(to)e(handle)h (suc)o(h)g(a)g(sizeable)-30 853 y(man)o(ual.)-30 953 y(Jean-Christophe)k(Aude)f(kindly)e(impro)o(v)o(ed)g(the)i(visual)e (asp)q(ect)j(of)e(b)q(oth)g(the)h(illustrations)e(and)h(the)h(GNU)f (Prolog)-30 1003 y(w)o(eb)g(pages.)-30 1102 y(Thanks)21 b(to)f(Ric)o(hard)h(A.)f(O'Keefe)h(for)f(his)h(advice)g(regarding)f (the)h(implemen)o(tation)e(of)h(some)h(Prolog)e(built-in)-30 1152 y(predicates)d(and)e(for)f(suggesting)h(me)g(the)h(in-place)e (installation)f(feature.)-30 1252 y(Man)o(y)i(thanks)g(to)g(the)g (follo)o(wing)e(con)o(tributors:)33 1335 y Fg(\017)20 b Fm(Alexander)15 b(Diemand)437 1320 y Fl(7)468 1335 y Fm(for)f(his)g(initial)e(p)q(ort)i(to)g(alpha/lin)o(ux.)33 1418 y Fg(\017)20 b Fm(Cliv)o(e)13 b(Co)o(x)252 1403 y Fl(8)284 1418 y Fm(and)h(Edm)o(und)g(Grimley)e(Ev)n(ans)801 1403 y Fl(9)834 1418 y Fm(for)h(their)i(p)q(ort)f(to)g(ix86/SCO.)33 1501 y Fg(\017)20 b Fm(Nicolas)14 b(Ollinger)365 1486 y Fl(10)413 1501 y Fm(to)g(for)f(his)h(p)q(ort)g(to)g(ix86/F)m(reeBSD.) 33 1584 y Fg(\017)20 b Fm(Bro)q(ok)14 b(Milligan)349 1569 y Fl(11)396 1584 y Fm(for)g(his)f(p)q(ort)i(to)e(ix86/NetBSD)h (and)g(for)f(general)h(con\014guration)g(impro)o(v)o(emen)o(ts.)33 1667 y Fg(\017)20 b Fm(Andreas)15 b(Stolc)o(k)o(e)365 1652 y Fl(12)414 1667 y Fm(for)f(his)g(p)q(ort)g(to)f(ix86/Solaris.)33 1750 y Fg(\017)20 b Fm(Lindsey)14 b(Spratt)343 1735 y Fl(13)393 1750 y Fm(for)f(his)h(p)q(ort)g(to)g(p)q(o)o(w)o(erp)q (c/Darwin)g(\(MacOS)h(X\).)33 1833 y Fg(\017)20 b Fm(Gw)o(enol)o(\023) -20 b(e)14 b(Beauc)o(hesne)448 1818 y Fl(14)499 1833 y Fm(for)g(his)f(p)q(ort)i(to)e(x86)p 835 1833 13 2 v 15 w(64/Lin)o(ux.)33 1916 y Fg(\017)20 b Fm(Jason)14 b(Beegan)320 1901 y Fl(15)370 1916 y Fm(for)g(his)g(p)q(ort)g(to)g (sparc/NetBSD)h(and)f(to)f(p)q(o)o(w)o(erp)q(c/NetBSD.)33 1999 y Fg(\017)20 b Fm(Cesar)15 b(Rabak)308 1984 y Fl(16)356 1999 y Fm(for)e(his)h(initial)e(p)q(ort)i(to)g(ix86/MinGW.)-30 2082 y(Man)o(y)g(thanks)g(to)g(all)e(those)j(p)q(eople)f(at)g(GNU)715 2067 y Fl(17)764 2082 y Fm(who)g(help)q(ed)g(me)g(to)g(\014nalize)f (the)i(GNU)f(Prolog)f(pro)r(ject.)-30 2182 y(Finally)m(,)19 b(I)h(w)o(ould)f(lik)o(e)g(to)h(thank)f(ev)o(eryb)q(o)q(dy)i(who)e (tested)j(preliminary)d(releases)i(and)f(help)q(ed)g(me)g(to)g(put)g (the)-30 2232 y(\014nishing)14 b(touc)o(hes)h(to)e(this)h(system.)p -30 2275 756 2 v 17 2302 a Fk(2)34 2314 y Fj(http://pan)o(ora)o(mix)o (.un)o(iv)o(-pa)o(ris)o(1.f)o(r/C)o(RI)o(NFO)o(/)17 2342 y Fk(3)34 2354 y Fj(http://loc)o(o.i)o(nri)o(a.f)o(r/)17 2381 y Fk(4)34 2393 y Fj(http://www)o(.in)o(ria)o(.fr)o(/U)o(nit)o(es/) o(ROC)o(QUE)o(NC)o(OUR)o(T-e)o(ng.)o(htm)o(l)17 2421 y Fk(5)34 2433 y Fj(http://www)o(.sj)o(u.e)o(du/)o(~j)o(hod)o(gso)o(n) 17 2461 y Fk(6)34 2472 y Fj(http://pau)o(ill)o(ac.)o(inr)o(ia)o(.fr)o (/~m)o(ara)o(nge)o(t/)o(hev)o(ea/)17 2500 y Fk(7)34 2512 y Fj(ax@apax.ne)o(t)17 2540 y Fk(8)34 2552 y Fj(clive@lalu)o(na.)o(dem) o(on.)o(co)o(.uk)17 2580 y Fk(9)34 2591 y Fj(http://www)o(.ra)o(no.)o (org)o(/)1 2619 y Fk(10)34 2631 y Fj(nollinge@e)o(ns-)o(lyo)o(n.f)o(r)1 2659 y Fk(11)34 2670 y Fj(brook@nmsu)o(.ed)o(u)1 2698 y Fk(12)34 2710 y Fj(http://www)o(.sp)o(eec)o(h.s)o(ri)o(.co)o(m/p)o (eop)o(le/)o(st)o(olc)o(ke/)1 2738 y Fk(13)34 2750 y Fj(spratt@alu)o(m.m)o(it.)o(edu)1 2778 y Fk(14)34 2789 y Fj(gbeauchesn)o(e@m)o(and)o(rak)o(es)o(oft)o(.co)o(m)1 2817 y Fk(15)34 2829 y Fj(jtb@netbsd)o(.or)o(g)1 2857 y Fk(16)34 2868 y Fj(csrabak@ig)o(.co)o(m.b)o(r)1 2896 y Fk(17)34 2908 y Fj(http://www)o(.gn)o(u.o)o(rg)p eop end %%Page: 10 12 TeXDict begin 10 11 bop -30 -45 a Fm(10)1292 b(1)41 b(A)o(CKNO)o (WLEDGEMENTS)p -30 -27 1890 4 v eop end %%Page: 11 13 TeXDict begin 11 12 bop 1819 -45 a Fm(11)p -30 -27 1890 4 v -30 115 a Fn(2)67 b(In)n(tro)r(duction)-30 256 y Fm(GNU)13 b(Prolog)f([5)o(])g(is)g(a)h(free)g(Prolog)f(compiler)g(with) g(constrain)o(t)h(solving)f(o)o(v)o(er)g(\014nite)h(domains)f(dev)o (elop)q(ed)h(b)o(y)f(Daniel)-30 305 y(Diaz)53 290 y Fl(18)88 305 y Fm(.)18 b(F)m(or)c(recen)o(t)h(information)d(ab)q(out)i(GNU)f (Prolog)h(please)g(consult)g(the)h(GNU)e(Prolog)h(page)1562 290 y Fl(19)1597 305 y Fm(.)-30 405 y(GNU)f(Prolog)f(is)h(a)f(Prolog)g (compiler)h(based)g(on)g(the)g(W)m(arren)g(Abstract)h(Mac)o(hine)f(\(W) -5 b(AM\))13 b([9,)f(1].)17 b(It)c(\014rst)g(compiles)-30 455 y(a)i(Prolog)g(program)f(to)h(a)g(W)-5 b(AM)15 b(\014le)h(whic)o(h) f(is)g(then)g(translated)h(to)f(a)g(lo)o(w-lev)o(el)f(mac)o(hine)h (indep)q(enden)o(t)h(language)-30 505 y(called)g(mini-assem)o(bly)f(sp) q(eci\014cally)i(designed)g(for)f(GNU)g(Prolog.)24 b(The)17 b(resulting)f(\014le)h(is)f(then)h(translated)f(to)h(the)-30 555 y(assem)o(bly)f(language)f(of)g(the)h(target)g(mac)o(hine)g(\(from) f(whic)o(h)g(an)h(ob)r(ject)g(is)g(obtained\).)23 b(This)16 b(allo)o(ws)e(GNU)i(Prolog)-30 604 y(to)g(pro)q(duce)i(a)d(nativ)o(e)h (stand)h(alone)e(executable)i(from)f(a)f(Prolog)h(source)h(\(similarly) d(to)i(what)g(do)q(es)h(a)f(C)g(compiler)-30 654 y(from)d(a)g(C)g (program\).)k(The)d(main)e(adv)n(an)o(tage)g(of)h(this)g(compilation)f (sc)o(heme)i(is)f(to)g(pro)q(duce)i(nativ)o(e)d(co)q(de)i(and)g(to)f(b) q(e)-30 704 y(fast.)19 b(Another)c(in)o(teresting)g(feature)g(is)f (that)g(executables)i(are)e(small.)k(Indeed,)c(the)h(co)q(de)g(of)f (most)f(un)o(used)i(built-in)-30 754 y(predicates)h(is)e(not)f (included)h(in)g(the)g(executables)i(at)e(link-time.)-30 853 y(A)h(lot)g(of)f(w)o(ork)h(has)g(b)q(een)h(dev)o(oted)f(to)g(the)h (ISO)f(compatibilit)o(y)m(.)j(Indeed,)e(GNU)f(Prolog)f(is)h(v)o(ery)g (close)h(to)e(the)i(ISO)-30 903 y(standard)f(for)e(Prolog)326 888 y Fl(20)375 903 y Fm([6)o(].)-30 1003 y(GNU)k(Prolog)e(also)h (o\013ers)h(v)n(arious)f(extensions)h(v)o(ery)g(useful)f(in)g(practice) i(\(global)c(v)n(ariables,)i(OS)h(in)o(terface,)g(so)q(c)o(k-)-30 1053 y(ets,...\).)g(In)c(particular,)f(GNU)g(Prolog)g(con)o(tains)h(an) f(e\016cien)o(t)h(constrain)o(t)g(solv)o(er)g(o)o(v)o(er)f(Finite)h (Domains)e(\(FD\).)h(This)-30 1102 y(op)q(ens)19 b(con)o(train)o(t)e (logic)f(p)q(ogramming)g(to)h(the)h(user)g(com)o(bining)e(the)i(p)q(o)o (w)o(er)f(of)g(constrain)o(t)h(programming)d(to)j(the)-30 1152 y(declarativit)o(y)13 b(of)f(logic)f(programming.)16 b(The)e(k)o(ey)f(feature)g(of)f(the)i(GNU)e(Prolog)g(solv)o(er)h(is)g (the)g(use)h(of)e(a)h(single)f(\(lo)o(w-)-30 1202 y(lev)o(el\))k (primitiv)o(e)f(to)h(de\014ne)h(all)e(\(high-lev)o(el\))g(FD)h (constrain)o(ts.)25 b(There)17 b(are)g(man)o(y)e(adv)n(an)o(tages)g(of) h(this)g(approac)o(h:)-30 1252 y(constrain)o(ts)d(can)e(b)q(e)i (compiled,)d(the)j(user)f(can)g(de\014ne)g(his)g(o)o(wn)f(constrain)o (ts)h(\(in)f(terms)i(of)d(the)j(primitiv)o(e\),)d(the)i(solv)o(er)-30 1302 y(is)i(op)q(en)g(and)g(extensible)h(\(as)f(opp)q(osed)h(to)e(blac) o(k-b)q(o)o(x)g(solv)o(ers)h(lik)o(e)g(CHIP\),.)6 b(.)g(.)h(Moreo)o(v)o (er,)14 b(the)g(GNU)g(Prolog)f(solv)o(er)-30 1352 y(is)h(rather)h (e\016cien)o(t,)f(often)g(more)g(than)g(commercial)f(solv)o(ers.)-30 1451 y(GNU)h(Prolog)f(is)h(inspired)g(from)f(t)o(w)o(o)h(systems)h(dev) o(elop)q(ed)f(b)o(y)g(the)h(same)f(author:)33 1533 y Fg(\017)20 b Fh(wamcc)p Fm(:)g(a)15 b(Prolog)g(to)g(C)h(compiler)f([3)o (].)22 b(the)16 b(k)o(ey)f(p)q(oin)o(t)g(of)j Fh(wamcc)d Fm(w)o(as)g(its)g(abilit)o(y)f(to)h(pro)q(duce)i(stand)f(alone)74 1583 y(executables)j(using)e(an)g(original)f(compilation)f(sc)o(heme:) 26 b(the)18 b(translation)f(of)f(Prolog)h(to)g(C)g(via)g(the)g(W)-5 b(AM.)74 1633 y(Its)15 b(dra)o(wbac)o(k)g(w)o(as)g(the)g(time)g(needed) h(b)o(y)f Fh(gcc)f Fm(to)h(compile)f(the)h(pro)q(duced)h(sources.)22 b(GNU)15 b(Prolog)f(can)h(also)74 1683 y(pro)q(duce)g(stand)g(alone)e (executables)i(but)g(using)e(a)h(faster)g(compilation)e(sc)o(heme.)33 1765 y Fg(\017)20 b Fh(clp\(FD\))p Fm(:)14 b(a)h(constrain)o(t)h (programming)e(language)h(o)o(v)o(er)g(FD)h([4)o(].)23 b(Its)16 b(k)o(ey)g(feature)g(w)o(as)g(the)g(use)g(of)f(a)h(single)74 1815 y(primitiv)o(e)e(to)g(de\014ne)i(FD)e(constrain)o(ts.)21 b(GNU)14 b(Prolog)g(is)g(based)h(on)g(the)g(same)g(idea)f(but)h (o\013ers)g(an)g(extended)74 1865 y(constrain)o(t)g(de\014nition)f (language.)k(In)c(comparison)g(to)g Fh(clp\(FD\))p Fm(,)e(GNU)i(Prolog) f(o\013ers)i(new)g(prede\014ned)h(con-)74 1915 y(strain)o(ts,)e(new)g (prede\014ned)i(heuristics,)f(rei\014ed)f(constrain)o(ts,.)7 b(.)g(.)-30 1997 y(Here)16 b(are)e(some)g(features)h(of)e(GNU)h (Prolog:)33 2079 y Fg(\017)20 b Fm(Prolog)13 b(system:)121 2129 y Fi({)21 b Fm(conforms)12 b(to)g(the)h(ISO)f(standard)h(for)f (Prolog)f(\(\015oating)h(p)q(oin)o(t)f(n)o(um)o(b)q(ers,)i(streams,)g (dynamic)f(co)q(de,.)7 b(.)f(.)h(\).)121 2194 y Fi({)21 b Fm(a)13 b(lot)g(of)g(extensions:)19 b(global)12 b(v)n(ariables,)h (de\014nite)h(clause)g(grammars)f(\(DCG\),)g(so)q(c)o(k)o(ets)i(in)o (terface,)f(op)q(er-)166 2244 y(ating)f(system)h(in)o(terface,.)7 b(.)f(.)121 2310 y Fi({)21 b Fm(more)13 b(than)h(300)f(Prolog)h (built-in)e(predicates.)121 2376 y Fi({)21 b Fm(Prolog)13 b(debugger)h(and)g(a)g(lo)o(w-lev)o(el)e(W)-5 b(AM)14 b(debugger.)121 2442 y Fi({)21 b Fm(line)13 b(editing)g(facilit)o(y)g (under)h(the)h(in)o(teractiv)o(e)f(in)o(terpreter)i(with)d(completion)g (on)h(atoms.)121 2508 y Fi({)21 b Fm(p)q(o)o(w)o(erful)13 b(bidirectional)g(in)o(terface)h(b)q(et)o(w)o(een)i(Prolog)d(and)h(C.) 33 2591 y Fg(\017)20 b Fm(Compiler:)121 2640 y Fi({)h Fm(nativ)o(e-co)q(de)14 b(compiler)f(pro)q(ducing)h(stand)g(alone)g (executables.)121 2706 y Fi({)21 b Fm(simple)c(command-line)f(compiler) i(accepting)g(a)g(wide)f(v)n(ariet)o(y)h(of)f(\014les:)26 b(Prolog)17 b(\014les,)i(C)e(\014les,)i(W)-5 b(AM)166 2756 y(\014les,.)6 b(.)g(.)p -30 2790 756 2 v 1 2817 a Fk(18)34 2829 y Fj(http://pau)o(ill)o(ac.)o(inr)o(ia)o(.fr)o(/~d)o (iaz)1 2857 y Fk(19)34 2868 y Fj(http://www)o(.gn)o(u.o)o(rg/)o(so)o (ftw)o(are)o(/pr)o(olo)o(g)1 2896 y Fk(20)34 2908 y Fj(http://www)o (.lo)o(gic)o(-pr)o(og)o(ram)o(min)o(g.o)o(rg/)o(pr)o(olo)o(g)p 727 2908 11 2 v 10 w(std.html)p eop end %%Page: 12 14 TeXDict begin 12 13 bop -30 -45 a Fm(12)1447 b(2)41 b(INTR)o(ODUCTION)p -30 -27 1890 4 v 121 115 a Fi({)21 b Fm(direct)14 b(generation)g(of)g (assem)o(bly)f(co)q(de)i(15)e(times)h(faster)h(than)f Fh(wamcc)f Fm(+)h Fh(gcc)p Fm(.)121 181 y Fi({)21 b Fm(most)13 b(of)h(un)o(used)g(built-in)f(predicates)i(are)g(not)e(link)o(ed)h (\(to)f(reduce)j(the)f(size)f(of)f(the)i(executables\).)121 248 y Fi({)21 b Fm(compiled)13 b(predicates)i(\(nativ)o(e-co)q(de\))g (as)f(fast)f(as)h Fh(wamcmcc)f Fm(on)h(a)o(v)o(erage.)121 314 y Fi({)21 b Fm(consulted)14 b(predicates)i(\(b)o(yte-co)q(de\))f(5) f(times)f(faster)i(than)f Fh(wamcc)p Fm(.)33 397 y Fg(\017)20 b Fm(Constrain)o(t)14 b(solv)o(er:)121 447 y Fi({)21 b Fm(FD)12 b(v)n(ariables)h(w)o(ell)f(in)o(tegrated)i(in)o(to)e(the)i (Prolog)e(en)o(vironmen)o(t)h(\(full)f(compatibilit)o(y)f(with)i (Prolog)f(v)n(ari-)166 497 y(ables)i(and)f(in)o(tegers\).)19 b(No)14 b(need)h(for)e(explicit)h(FD)f(declarations.)121 563 y Fi({)21 b Fm(v)o(ery)14 b(e\016cien)o(t)g(FD)g(solv)o(er)g (\(comparable)f(to)h(commercial)f(solv)o(ers\).)121 630 y Fi({)21 b Fm(high-lev)o(el)12 b(constrain)o(ts)j(can)f(b)q(e)h (describ)q(ed)g(in)f(terms)g(of)g(simple)f(primitiv)o(es.)121 696 y Fi({)21 b Fm(a)e(lot)h(of)g(prede\014ned)i(constrain)o(ts:)31 b(arithmetic)20 b(constrain)o(ts,)i(b)q(o)q(olean)e(constrain)o(ts,)i (sym)o(b)q(olic)d(con-)166 746 y(strain)o(ts,)13 b(rei\014ed)i (constrain)o(ts,.)7 b(.)f(.)121 812 y Fi({)21 b Fm(sev)o(eral)14 b(prede\014ned)i(en)o(umeration)e(heuristics.)121 879 y Fi({)21 b Fm(the)14 b(user)h(can)f(de\014ne)h(his)f(o)o(wn)f(new)i (constrain)o(ts.)121 945 y Fi({)21 b Fm(more)13 b(than)h(50)g(FD)f (built-in)g(constrain)o(ts/predicates.)p eop end %%Page: 13 15 TeXDict begin 13 14 bop 1819 -45 a Fm(13)p -30 -27 1890 4 v -30 115 a Fn(3)67 b(Using)22 b(GNU)f(Prolog)-30 264 y Ff(3.1)56 b(In)n(tro)r(duction)-30 390 y Fm(GNU)14 b(Prolog)f(o\013ers)i(t)o(w)o(o)f(w)o(a)o(ys)f(to)h(execute)i(a)d (Prolog)g(program:)33 463 y Fg(\017)20 b Fm(in)o(terpreting)15 b(it)e(using)h(the)g(GNU)g(Prolog)f(in)o(teractiv)o(e)h(in)o (terpreter.)33 540 y Fg(\017)20 b Fm(compiling)12 b(it)i(to)g(a)f (\(mac)o(hine-dep)q(enden)o(t\))j(executable)f(using)e(the)i(GNU)f (Prolog)f(nativ)o(e-co)q(de)h(compiler.)-30 613 y(Running)f(a)g (program)f(under)i(the)g(in)o(teractiv)o(e)f(in)o(terpreter)i(allo)o (ws)d(the)i(user)g(to)f(list)g(it)g(and)g(to)g(mak)o(e)f(full)g(use)i (of)f(the)-30 663 y(debugger)k(on)e(it)g(\(section)h(4,)f(page)h(29\).) 22 b(Compiling)14 b(a)h(program)g(to)g(nativ)o(e)g(co)q(de)h(mak)o(es)g (it)f(p)q(ossible)g(to)h(obtain)e(a)-30 712 y(stand)e(alone)f (executable,)h(with)f(a)f(reduced)j(size)f(and)f(optimized)g(for)f(sp)q (eed.)19 b(Running)10 b(a)h(Prolog)f(program)h(compiled)-30 762 y(to)h(nativ)o(e-co)q(de)f(is)g(around)h(3-5)e(times)i(faster)g (than)f(running)g(it)g(under)h(the)g(in)o(terpreter.)19 b(Ho)o(w)o(ev)o(er,)12 b(it)f(is)g(not)g(p)q(ossible)-30 812 y(to)18 b(mak)o(e)e(full)g(use)i(of)f(the)h(debugger)g(on)f(a)g (program)f(compiled)h(to)g(nativ)o(e-co)q(de.)28 b(Nor)17 b(is)h(it)e(p)q(ossible)i(to)f(list)g(the)-30 862 y(program.)31 b(In)18 b(general,)h(it)f(is)g(preferable)h(to)f(run)g(a)g(program)f (under)i(the)g(in)o(terpreter)h(for)e(debugging)g(and)g(then)-30 912 y(use)e(the)e(nativ)o(e-co)q(de)h(compiler)f(to)g(pro)q(duce)h(an)f (autonomous)g(executable.)20 b(It)15 b(is)f(also)f(p)q(ossible)i(to)f (com)o(bine)g(these)-30 961 y(t)o(w)o(o)g(mo)q(des)h(b)o(y)f(pro)q (ducing)g(an)g(executable)i(that)e(con)o(tains)g(some)h(parts)f(of)g (the)h(program)f(\(e.g.)19 b(already)14 b(debugged)-30 1011 y(predicates)h(whose)f(execution-time)f(sp)q(eed)i(is)e(crucial\)) g(and)g(in)o(terpreting)g(the)h(other)g(parts)f(under)h(this)f (executable.)-30 1061 y(In)18 b(that)f(case,)i(the)e(executable)i(has)e (the)h(same)f(facilities)g(as)g(the)h(GNU)f(Prolog)f(in)o(terpreter)j (but)f(also)e(in)o(tegrates)-30 1111 y(the)f(nativ)o(e-co)q(de)f (predicates.)19 b(This)14 b(w)o(a)o(y)f(to)g(de\014ne)i(a)e(new)i (enric)o(hed)f(in)o(terpreter)i(is)d(detailed)h(later)g(\(section)g (3.4.5,)-30 1161 y(page)g(25\).)-30 1324 y Ff(3.2)56 b(The)18 b(GNU)h(Prolog)g(in)n(teractiv)n(e)e(in)n(terpreter)-30 1451 y Fi(3.2.1)48 b(Starting/exiting)14 b(the)h(in)o(teractiv)o(e)f (in)o(terpreter)-30 1577 y Fm(GNU)j(Prolog)g(o\013ers)h(a)f(classical)g (Prolog)f(in)o(teractiv)o(e)i(in)o(terpreter)h(also)e(called)g Fe(top-level)p Fm(.)27 b(It)17 b(allo)o(ws)f(the)i(user)g(to)-30 1627 y(execute)i(queries,)g(to)e(consult)g(Prolog)g(programs,)g(to)g (list)g(them,)h(to)e(execute)j(them)f(and)f(to)g(debug)g(them.)31 b(The)-30 1677 y(top-lev)o(el)14 b(can)g(b)q(e)g(in)o(v)o(ok)o(ed)f (using)h(the)h(follo)o(wing)c(command:)74 1749 y Fh(\045)22 b(gprolog)e Fm([)p Fd(OPTION)6 b Fm(].)g(.)g(.)222 b(\(the)14 b Fh(\045)g Fm(sym)o(b)q(ol)f(is)h(the)g(op)q(erating)g(system)h(shell) f(prompt\))-30 1822 y Fi(Options)p Fm(:)-5 1918 y Fh(--init-goal)e Fd(GOAL)240 b Fm(execute)15 b Fd(GOAL)21 b Fm(b)q(efore)14 b(top)p 1020 1918 13 2 v 15 w(lev)o(el/0)-5 1968 y Fh(--entry-goal)e Fd(GOAL)218 b Fm(execute)15 b Fd(GOAL)21 b Fm(inside)13 b(top)p 1013 1968 V 15 w(lev)o(el/0)-5 2018 y Fh(--query-goal)f Fd(GOAL)218 b Fm(execute)15 b Fd(GOAL)21 b Fm(as)14 b(a)f(query)i(for)e (top)p 1160 2018 V 15 w(lev)o(el/0)-5 2068 y Fh(--help)450 b Fm(prin)o(t)13 b(a)h(help)g(and)g(exit)-5 2118 y Fh(--version)384 b Fm(prin)o(t)13 b(v)o(ersion)h(n)o(um)o(b)q(er)h(and)e(exit)-5 2168 y Fh(--)538 b Fm(do)13 b(not)h(parse)h(the)f(rest)h(of)f(the)g (command-line)-30 2265 y(The)19 b(main)d(role)i(of)g(the)g Fh(gprolog)e Fm(command)h(is)h(to)g(execute)h(the)g(top-lev)o(el)e (itself,)h(i.e.)30 b(to)17 b(execute)j(the)e(built-in)-30 2315 y(predicate)d Fh(top)p 219 2315 14 2 v 16 w(level/0)d Fm(\(section)j(7.18.1,)c(page)j(112\))f(whic)o(h)h(will)e(pro)q(duce)j (something)f(lik)o(e:)74 2387 y Fh(GNU)21 b(Prolog)g(1.2.9)74 2437 y(By)h(Daniel)e(Diaz)74 2487 y(Copyright)g(\(C\))h(1999-2007)f (Daniel)h(Diaz)74 2537 y(|)h(?-)-30 2609 y Fm(The)15 b(top-lev)o(el)e(is)h(ready)g(to)g(execute)i(y)o(our)d(queries)i(as)f (explained)g(in)f(the)i(next)f(section.)-30 2709 y(T)m(o)f(quit)h(the)g (top-lev)o(el)f(t)o(yp)q(e)i(the)f(end-of-\014le)f(k)o(ey)h(sequence)i (\()p Fh(Ctl-D)p Fm(\))d(or)h(its)f(term)h(represen)o(tation:)20 b Fh(end)p 1680 2709 V 15 w(of)p 1739 2709 V 15 w(file.)-30 2759 y Fm(It)14 b(is)g(also)f(p)q(ossible)i(to)e(use)i(the)g(built-in)d (predicate)j Fh(halt/0)e Fm(\(section)h(7.18.1,)e(page)i(112\).)-30 2858 y(Ho)o(w)o(ev)o(er,)j(b)q(efore)g(en)o(tering)g(the)g(top-lev)o (el)e(itself,)h(the)h(command-line)e(is)h(pro)q(cessed)j(to)d(treat)h (all)e(kno)o(wn)h(options)-30 2908 y(\(those)f(listed)f(ab)q(o)o(v)o (e\).)k(All)13 b(unrecognized)j(argumen)o(ts)e(are)g(collected)h (together)g(to)e(form)h(the)g(argumen)o(t)g(list)f(whic)o(h)p eop end %%Page: 14 16 TeXDict begin 14 15 bop -30 -45 a Fm(14)1350 b(3)41 b(USING)14 b(GNU)f(PR)o(OLOG)p -30 -27 1890 4 v -30 115 a(will)f(b)q(e)h(a)o(v)n (ailable)d(using)j Fh(argument)p 559 115 14 2 v 14 w(value/2)e Fm(\(section)j(7.27.2,)c(page)j(143\))f(or)h Fh(argument)p 1435 115 V 14 w(list/1)e Fm(\(section)j(7.27.3,)-30 165 y(page)j(143\).)25 b(The)17 b Fh(--)f Fm(option)g(stops)h(the)g (parsing)f(of)g(the)h(command-line,)f(all)f(remainding)g(options)i(are) f(collected)-30 215 y(in)o(to)e(the)g(argumen)o(t)g(list.)-30 314 y(Sev)o(eral)h(options)e(are)h(pro)o(vided)g(to)g(execute)i(a)d (goal)g(b)q(efore)i(en)o(tering)f(the)g(in)o(teraction)g(with)g(the)g (user:)33 395 y Fg(\017)20 b Fm(The)15 b Fh(--init-goal)e Fm(option)h(executes)i(the)g Fd(GOAL)21 b Fm(as)14 b(so)q(on)h(as)g(it) f(is)g(encoun)o(tered)j(\(while)d(the)i(commnad-line)74 445 y(is)e(pro)q(cessed\).)21 b Fd(GOAL)f Fm(is)13 b(th)o(us)i (executed)h(b)q(efore)e(en)o(tering)h Fh(top)p 1102 445 V 15 w(level/0)p Fm(.)33 527 y Fg(\017)20 b Fm(The)15 b Fh(--entry-goal)d Fm(option)h(executes)j(the)f Fd(GOAL)21 b Fm(at)14 b(the)h(en)o(try)f(of)j Fh(top)p 1262 527 V 15 w(level/0)c Fm(just)h(after)h(the)g(banner)f(is)74 577 y(displa)o(y)o(ed.)33 659 y Fg(\017)20 b Fm(The)15 b Fh(--query-goal)c Fm(option)i(executes)j(the)f Fd(GOAL)20 b Fm(as)14 b(if)f(the)h(user)h(has)f(t)o(yp)q(ed)h(in.)-30 740 y(The)f(ab)q(o)o(v)o(e)f(order)i(is)e(th)o(us)h(the)g(order)g(in)f (whic)o(h)g(eac)o(h)h(kind)f(of)g(goal)f(\(init,)h(en)o(try)m(,)g (query\))h(is)f(executed.)20 b(If)13 b(there)i(are)-30 790 y(sev)o(eral)e(goals)d(of)h(a)h(same)f(kind)h(they)g(are)g (executed)h(in)e(the)i(o)q(der)f(of)f(app)q(earance.)18 b(Th)o(us,)12 b(all)f(init)f(goals)h(are)h(executed)-30 840 y(\(in)h(the)g(order)g(of)f(app)q(earance\))i(b)q(efore)g(all)d(en) o(try)i(goals)f(and)h(all)e(en)o(try)i(goals)f(are)h(executed)i(b)q (efore)e(all)e(query)j(goals.)-30 940 y(Eac)o(h)j Fd(GOAL)22 b Fm(is)16 b(passed)h(as)f(a)f(shell)h(argumen)o(t)g(\(i.e.)24 b(one)16 b(shell)g(string\))g(and)g(should)g(not)f(con)o(tain)h(a)g (terminal)f(dot.)-30 989 y(Example:)22 b Fh(--init-goal)e ('write\(hello\),)f(nl')c Fm(under)i(a)f(sh-lik)o(e.)24 b(T)m(o)16 b(b)q(e)g(executed,)j(a)c Fd(GOAL)23 b Fm(is)16 b(transformed)-30 1039 y(in)o(to)d(a)g(term)h(using)f Fh(read)p 386 1039 V 15 w(term)p 489 1039 V 15 w(from)p 592 1039 V 15 w(atom\(Goal,)19 b(Term,)i([end)p 1065 1039 V 15 w(of)p 1124 1039 V 15 w(term\(eof\)]\))p Fm(.)16 b(Resp)q(ecting)e(b)q(oth)f(the)h(syn-)-30 1089 y(tax)j(of)g(shell)g (strings)h(and)f(of)g(Prolog)f(can)i(b)q(e)f(hea)o(vy)m(.)28 b(F)m(or)17 b(instance,)h(passing)f(a)g(bac)o(kslash)h(c)o(haracter)g Fh(\\)f Fm(can)h(b)q(e)-30 1139 y(di\016cult)e(since)g(it)g(in)o(tro)q (duces)h(an)e(escap)q(e)j(sequence)g(b)q(oth)d(in)h(sh)g(and)g(inside)f (Prolog)g(quoted)i(atoms.)23 b(The)16 b(use)h(of)-30 1189 y(bac)o(k)c(quotes)g(can)g(then)g(b)q(e)g(useful)g(since,)g(b)o(y) f(default,)g(no)h(escap)q(e)h(sequence)h(is)d(pro)q(cessed)j(inside)d (bac)o(k)h(quotes)g(\(this)-30 1239 y(b)q(eha)o(vior)h(can)g(b)q(e)h (con)o(trolled)e(using)h(the)g Fh(back)p 736 1239 V 15 w(quotes)f Fm(Prolog)g(\015ag)h(\(section)g(7.22.1,)e(page)i(133\)\).) -30 1338 y(Since)d(the)g(Prolog)f(argumen)o(t)g(list)g(is)g(created)i (when)f(the)g(whole)f(command-line)f(is)h(parsed,)h(if)f(a)g Fh(--init-goal)e Fm(option)-30 1388 y(uses)16 b Fh(argument)p 238 1388 V 14 w(value/2)e Fm(or)g Fh(argument)p 647 1388 V 14 w(list/1)g Fm(it)g(will)f(obtained)i(the)g(original)e (command-line)g(argumen)o(ts)i(\(i.e.)-30 1438 y(including)e(all)g (recognized)i(argumen)o(ts\).)-30 1537 y(Here)h(is)d(an)h(example)g(of) f(using)g(execution)i(goal)e(options:)74 1619 y Fh(\045)22 b(gprolog)e(--init-goal)g('write\(before\),)e(nl')k(--entry-goal)d ('write\(inside\),)g(nl')74 1668 y(--query-goal)h('append\([a,b],[)o (c,d],)o(X\)')-30 1750 y Fm(will)13 b(pro)q(duce)i(the)f(follo)o(wing:) 74 1831 y Fh(before)74 1881 y(GNU)21 b(Prolog)g(1.2.9)74 1931 y(By)h(Daniel)e(Diaz)74 1980 y(Copyright)g(\(C\))h(1999-2007)f (Daniel)h(Diaz)74 2030 y(inside)74 2080 y(|)h(?-)f(append\([a,b],[c,d]) o(,X\).)74 2180 y(X)h(=)f([a,b,c,d])74 2279 y(yes)74 2329 y(|)h(?-)-30 2486 y Fi(3.2.2)48 b(The)16 b(in)o(teractiv)o(e)e(in) o(terpreter)f(read-execute-write)h(lo)q(op)-30 2613 y Fm(The)f(GNU)e(Prolog)g(top-lev)o(el)g(is)h(built)f(on)g(a)h(classical) f(read-execute-write)j(lo)q(op)d(that)h(also)f(allo)o(ws)f(for)i (re-executions)-30 2663 y(\(when)j(the)f(query)h(is)f(not)f (deterministic\))i(as)f(follo)o(ws:)33 2744 y Fg(\017)20 b Fm(displa)o(y)13 b(the)i(prompt,)e(i.e.)k(')p Fh(|)k(?-)p Fm('.)33 2826 y Fg(\017)f Fm(read)15 b(a)e(query)i(\(i.e.)i(a)d (goal\).)33 2908 y Fg(\017)20 b Fm(execute)c(the)e(query)m(.)p eop end %%Page: 15 17 TeXDict begin 15 16 bop -30 -45 a Fm(3.2)41 b(The)14 b(GNU)g(Prolog)f(in)o(teractiv)o(e)h(in)o(terpreter)1033 b(15)p -30 -27 1890 4 v 33 115 a Fg(\017)20 b Fm(in)14 b(case)h(of)e(success)j(displa)o(y)d(the)i(v)n(alues)e(of)g(the)i(v)n (ariables)e(of)g(the)i(query)m(.)33 193 y Fg(\017)20 b Fm(if)12 b(there)h(are)f(remaining)g(alternativ)o(es)g(\(i.e.)17 b(the)c(query)f(is)g(not)g(deterministic\),)h(displa)o(y)e(a)h Fh(?)17 b Fm(and)12 b(ask)g(the)h(user)74 243 y(who)h(can)g(use)g(one)h (of)e(the)h(follo)o(wing)d(commands:)18 b Fh(RETURN)12 b Fm(to)i(stop)g(the)h(execution,)f Fh(;)f Fm(to)h(compute)g(the)h (next)74 292 y(solution)e(or)h Fh(a)g Fm(to)g(compute)g(all)f (remaining)f(solution.)-30 365 y(Here)j(is)f(an)g(example)f(of)g (execution)i(of)e(a)g(query)i(\(\\\014nd)e(the)i(lists)e Fh(X)h Fm(and)f Fh(Y)h Fm(suc)o(h)g(that)g(the)g(concatenation)h(of)h Fh(X)d Fm(and)-30 415 y Fh(Y)h Fm(is)g Fh([a,b])p Fm("\):)74 487 y Fh(|)22 b(?-)f(append\(X,Y,[a,b,c])o(\).)74 587 y(X)h(=)f([])74 637 y(Y)h(=)f([a,b,c])g(?)43 b(;)124 b Fm(\(here)15 b(the)f(user)h(presses)i Fh(;)c Fm(to)h(compute)g (another)h(solution\))74 736 y Fh(X)22 b(=)f([a])74 786 y(Y)h(=)f([b,c])g(?)44 b(a)167 b Fm(\(here)15 b(the)f(user)h(presses)i Fh(a)c Fm(to)h(compute)g(all)f(remaining)g(solutions\))74 886 y Fh(X)22 b(=)f([a,b])74 935 y(Y)h(=)f([c])320 b Fm(\(here)15 b(the)f(user)h(is)f(not)g(ask)o(ed)g(and)g(the)g(next)h (solution)e(is)h(computed\))74 1035 y Fh(X)22 b(=)f([a,b,c])74 1085 y(Y)h(=)f([])342 b Fm(\(here)15 b(the)f(user)h(is)f(not)g(ask)o (ed)g(and)g(the)g(next)h(solution)e(is)h(computed\))74 1185 y Fh(no)429 b Fm(\(no)13 b(more)h(solution\))-30 1258 y(In)19 b(some)f(cases)h(the)g(top-lev)o(el)e(can)h(detect)i(that) e(the)h(curren)o(t)g(solution)f(is)f(the)i(last)f(one)g(\(no)g(more)g (alternativ)o(es)-30 1307 y(remaining\).)g(In)13 b(suc)o(h)i(a)f(case)h (it)e(do)q(es)i(not)f(displa)o(y)e(the)j Fh(?)j Fm(sym)o(b)q(ol)13 b(\(and)h(do)q(es)h(not)e(ask)h(the)h(user\).)k(Example:)74 1380 y Fh(|)j(?-)f(\(X=1)g(;)h(X=2\).)74 1479 y(X)g(=)f(1)h(?)43 b(;)255 b Fm(\(here)15 b(the)f(user)h(presses)i Fh(;)c Fm(to)h(compute)g(another)h(solution\))74 1579 y Fh(X)22 b(=)f(2)364 b Fm(\(here)15 b(the)f(user)h(is)f(not)g(prompted)g(since)h (there)g(are)f(no)g(more)g(alternativ)o(es\))74 1679 y Fh(yes)-30 1749 y Fm(The)h(user)g(can)f(stop)g(the)h(execution)f(ev)o (en)h(if)e(there)i(are)f(more)g(alternativ)o(es)g(b)o(y)g(t)o(yping)g Fh(RETURN)p Fm(.)74 1819 y Fh(|)22 b(?-)f(\(X=1)g(;)h(X=2\).)74 1919 y(X)g(=)f(1)h(?)320 b Fm(\(here)15 b(the)f(user)h(presses)i Fh(RETURN)12 b Fm(to)i(stop)g(the)h(execution\))74 2019 y Fh(yes)-30 2089 y Fm(The)f(top-lev)o(el)e(tries)i(to)e(displa)o(y)g (the)i(v)n(alues)e(of)h(the)g(v)n(ariables)f(of)h(the)g(query)g(in)g(a) f(readable)i(manner.)j(F)m(or)c(instance,)-30 2139 y(when)k(a)f(v)n (ariable)e(is)i(b)q(ound)g(to)g(a)g(query)g(v)n(ariable,)f(the)h(name)g (of)f(this)h(v)n(ariable)f(app)q(ears.)25 b(When)16 b(a)g(v)n(ariable)f (is)g(a)-30 2189 y(singleton)d(an)g(underscore)j(sym)o(b)q(ol)p 550 2189 14 2 v 39 w(is)d(displa)o(y)o(ed)g(\()p 814 2189 V 28 w(is)g(a)g(generic)h(name)f(for)g(a)g(singleton)g(v)n (ariable,)f(it)h(is)g(also)f(called)-30 2239 y(an)h(anon)o(ymous)f(v)n (ariable\).)16 b(Other)d(v)n(ariables)e(are)h(b)q(ound)g(to)f(new)h (brand)g(v)n(ariable)e(names.)18 b(When)12 b(a)f(query)h(v)n(ariable) -30 2289 y(name)g Fh(X)g Fm(app)q(ears)h(as)f(the)h(v)n(alue)e(of)g (another)i(query)f(v)n(ariable)f Fh(Y)h Fm(it)g(is)f(b)q(ecause)j Fh(X)e Fm(is)g(itself)f(not)h(instan)o(tiated)g(otherwise)-30 2338 y(the)i(v)n(alue)e(of)k Fh(X)d Fm(is)g(displa)o(y)o(ed.)k(In)c (suc)o(h)g(a)g(case,)h(nothing)e(is)h(output)g(for)g Fh(X)g Fm(itself)f(\(since)i(it)f(is)g(a)f(v)n(ariable\).)17 b(Example:)74 2411 y Fh(|)22 b(?-)f(X=f\(A,B,)p 362 2411 V 14 w(,A\),)g(A=k.)74 2510 y(A)h(=)f(k)364 b Fm(\(the)14 b(v)n(alue)g(of)i Fh(A)e Fm(is)f(displa)o(y)o(ed)h(also)f(in)g Fh(f/3)h Fm(for)f Fh(X)p Fm(\))74 2560 y Fh(X)22 b(=)f(f\(k,B,)p 296 2560 V 15 w(,k\))173 b Fm(\(since)15 b Fh(B)e Fm(is)h(a)g(v)n (ariable)e(whic)o(h)i(is)g(also)f(a)h(part)g(of)i Fh(X)p Fm(,)d Fh(B)h Fm(is)g(not)g(displa)o(y)o(ed\))74 2637 y Fh(|)22 b(?-)f(functor\(T,f,3\),)e(arg\(1,T,X\),)g(arg\(3,T,X\).)74 2737 y(T)j(=)f(f\(X,)p 252 2737 V 15 w(,X\))217 b Fm(\(the)14 b(1)655 2722 y Fc(st)699 2737 y Fm(and)g(3)801 2722 y Fc(r)q(d)850 2737 y Fm(args)g(are)g(equal)g(to)g Fh(X)p Fm(,)f(the)h(2)1307 2722 y Fc(nd)1361 2737 y Fm(is)g(an)f(anon)o(ymous) g(v)n(ariable\))74 2814 y Fh(|)22 b(?-)f(read)p 274 2814 V 15 w(from)p 377 2814 V 15 w(atom\('k\(X,Y,X\).',)o(T\).)74 2914 y(T)h(=)f(k\(A,)p 252 2914 V 15 w(,A\))217 b Fm(\(the)14 b(1)655 2899 y Fc(st)699 2914 y Fm(and)g(3)801 2899 y Fc(r)q(d)850 2914 y Fm(args)g(are)g(uni\014ed,)g(a)g(new)g(v)n(ariable) f(name)g Fh(A)h Fm(is)g(in)o(tro)q(duced\))p eop end %%Page: 16 18 TeXDict begin 16 17 bop -30 -45 a Fm(16)1350 b(3)41 b(USING)14 b(GNU)f(PR)o(OLOG)p -30 -27 1890 4 v -30 115 a(The)i(top-lev)o(el)f (uses)i(v)n(ariable)e(binding)f(predicates)j(\(section)g(7.5,)d(page)h (55\).)20 b(T)m(o)14 b(displa)o(y)f(the)j(v)n(alue)e(of)f(a)i(v)n (ariable,)-30 165 y(the)j(top-lev)o(el)f(calls)g Fh(write)p 426 165 14 2 v 15 w(term/3)f Fm(with)h(the)h(follo)o(wing)d(option)h (list:)25 b Fh([quoted\(true\),num)o(berva)o(rs\(f)o(alse\))o(,)-30 215 y(namevars\(true\)])14 b Fm(\(section)k(7.14.6,)d(page)i(96\).)26 b(A)17 b(term)h(of)e(the)h(form)f Fh('$VARNAME'\(Name\))e Fm(where)k Fh(Name)e Fm(is)g(an)-30 264 y(atom)10 b(is)h(displa)o(y)o (ed)f(as)h(a)g(v)n(ariable)e(name)i(while)f(a)h(term)g(of)f(the)h(form) f Fh('$VAR'\(N\))f Fm(where)j Fh(N)f Fm(is)f(an)h(in)o(teger)g(is)g (displa)o(y)o(ed)-30 314 y(as)f(a)g(normal)f(comp)q(ound)g(term)i (\(suc)o(h)f(a)g(term)g(could)g(b)q(e)g(output)g(as)g(a)f(v)n(ariable)g (name)h(b)o(y)g Fh(write)p 1503 314 V 15 w(term/3)p Fm(\).)15 b(Example:)74 397 y Fh(|)22 b(?-)f(X='$VARNAME'\('Y'\),)d (Y='$VAR'\(1\).)74 496 y(X)k(=)f(Y)364 b Fm(\(the)14 b(term)h Fh('$VARNAME'\('Y'\))10 b Fm(is)k(displa)o(y)o(ed)f(as)h Fh(Y)p Fm(\))74 546 y Fh(Y)22 b(=)f('$VAR'\(1\))188 b Fm(\(the)14 b(term)h Fh('$VAR'\(1\))d Fm(is)h(displa)o(y)o(ed)h(as)g (is\))74 633 y Fh(|)22 b(?-)f(X=Y,)g(Y='$VAR'\(1\).)74 733 y(X)h(=)f('$VAR'\(1\))74 783 y(Y)h(=)f('$VAR'\(1\))-30 864 y Fm(In)15 b(the)h(\014rst)f(example,)f Fh(X)h Fm(is)g(explicitly)e (b)q(ound)i(to)g Fh('$VARNAME'\('Y'\))d Fm(b)o(y)i(the)h(query)h(so)f (the)g(top-lev)o(el)f(displa)o(ys)g Fh(Y)-30 914 y Fm(as)i(the)g(v)n (alue)f(of)j Fh(X)p Fm(.)d Fh(Y)g Fm(is)g(uni\014ed)h(with)f Fh('$VAR'\(1\))e Fm(so)j(the)g(top-lev)o(el)f(displa)o(ys)g(it)g(as)g (a)h(normal)e(comp)q(ound)h(term.)-30 964 y(It)g(should)f(b)q(e)g (clear)h(that)f Fh(X)g Fm(is)g(not)g(b)q(ound)g(to)g Fh(Y)g Fm(\(whereas)h(it)f(is)g(in)g(the)g(second)h(query\).)20 b(This)14 b(b)q(eha)o(vior)g(should)g(b)q(e)-30 1013 y(k)o(ept)h(in)e(mind)g(when)i(doing)e(v)n(ariable)f(binding)h(op)q (erations.)-30 1113 y(Finally)m(,)f(the)i(top-lev)o(el)g(computes)g (the)h(user-time)f(\(section)h(7.24.2,)d(page)i(139\))f(tak)o(en)h(b)o (y)f(a)h(query)h(and)e(displa)o(ys)h(it)-30 1163 y(when)h(it)e(is)h (signi\014can)o(t.)k(Example:)74 1243 y Fh(|)k(?-)f(retractall\(p\()p 472 1243 V 13 w(\)\),)g(assertz\(p\(0\)\),)183 1293 y(repeat,)249 1343 y(retract\(p\(X\)\),)249 1393 y(Y)g(is)h(X)f(+)h(1,)249 1442 y(assertz\(p\(Y\)\),)249 1492 y(X)f(=)h(1000,)f(!.)74 1592 y(X)h(=)f(1000)74 1642 y(Y)h(=)f(1001)74 1741 y(\(180)g(ms\))g (yes)211 b Fm(\(the)14 b(query)h(to)q(ok)e(180ms)g(of)h(user)h(time\)) -30 1897 y Fi(3.2.3)48 b(Consulting)15 b(a)h(Prolog)f(program)-30 2024 y Fm(The)f(top-lev)o(el)f(allo)o(ws)g(the)h(user)g(to)g(consult)g (Prolog)e(source)j(\014les.)j(Consulted)c(predicates)h(can)f(b)q(e)g (listed,)f(executed)-30 2073 y(and)g(debugged)h(\(while)e(predicates)j (compiled)d(to)h(nativ)o(e-co)q(de)g(cannot\).)18 b(F)m(or)13 b(more)g(information)e(ab)q(out)h(the)i(di\013er-)-30 2123 y(ence)j(b)q(et)o(w)o(een)f(a)e(nativ)o(e-co)q(de)h(predicate)h (and)f(a)f(consulted)i(predicate)g(refer)g(to)e(the)i(in)o(tro)q (duction)e(of)h(this)f(section)-30 2173 y(\(section)h(3.1,)e(page)g (13\))h(and)g(to)f(the)i(part)f(dev)o(oted)g(to)g(the)h(compiler)e (\(section)i(3.4.1,)d(page)h(20\).)-30 2273 y(T)m(o)k(consult)h(a)f (program)f(use)i(the)g(built-in)e(predicate)j Fh(consult/1)c Fm(\(section)j(7.23.1,)e(page)h(136\).)28 b(The)17 b(argumen)o(t)-30 2322 y(of)e(this)h(predicate)h(is)e(a)h(Prolog)e(\014le)i(name)f(or)h Fh(user)f Fm(to)g(sp)q(ecify)h(the)g(terminal.)23 b(This)15 b(allo)o(ws)g(the)h(user)g(to)g(directly)-30 2372 y(input)e(the)h (predicates)g(from)e(the)h(terminal.)k(In)13 b(that)h(case)h(the)f (input)g(shall)f(b)q(e)h(terminated)h(b)o(y)e(the)i(end-of-\014le)e(k)o (ey)-30 2422 y(sequence)j(\()p Fh(Ctl-D)p Fm(\))d(or)h(its)g(term)g (represen)o(tation:)20 b Fh(end)p 862 2422 V 15 w(of)p 921 2422 V 15 w(file.)d Fm(A)d(shorthand)g(for)g Fh(consult\()p Fd(FILE)5 b Fh(\))13 b Fm(is)h Fh([)p Fd(FILE)6 b Fh(])p Fm(.)-30 2472 y(Example:)p eop end %%Page: 17 19 TeXDict begin 17 18 bop -30 -45 a Fm(3.2)41 b(The)14 b(GNU)g(Prolog)f(in)o(teractiv)o(e)h(in)o(terpreter)1033 b(17)p -30 -27 1890 4 v 74 108 a Fh(|)22 b(?-)f([user].)74 158 y({compiling)f(user)h(for)g(byte)g(code...})74 208 y(even\(0\).)74 258 y(even\(s\(s\(X\)\)\):-)249 308 y(even\(X\).)547 357 y Fm(\(here)15 b(the)f(user)h(presses)i Fh(Ctl-D)12 b Fm(to)i(end)g(the)h(input\))74 407 y Fh({user)21 b(compiled,)f(3)i (lines)e(read)h(-)h(350)f(bytes)g(written,)f(1180)h(ms})74 507 y(|)h(?-)f(even\(X\).)74 606 y(X)h(=)f(0)h(?)43 b(;)255 b Fm(\(here)15 b(the)f(user)h(presses)i Fh(;)c Fm(to)h(compute)g (another)h(solution\))74 706 y Fh(X)22 b(=)f(s\(s\(0\)\))g(?)43 b(;)124 b Fm(\(here)15 b(the)f(user)h(presses)i Fh(;)c Fm(to)h(compute)g(another)h(solution\))74 806 y Fh(X)22 b(=)f(s\(s\(s\(s\(0\)\)\)\))f(?)58 b Fm(\(here)15 b(the)f(user)h (presses)i Fh(RETURN)12 b Fm(to)i(stop)g(the)h(execution\))74 905 y Fh(yes)74 955 y(|)22 b(?-)f(listing.)74 1055 y(even\(0\).)74 1105 y(even\(s\(s\(A\)\)\))e(:-)249 1154 y(even\(A\).)-30 1238 y Fm(When)g Fh(consult/1)e Fm(\(section)i(7.23.1,)f(page)g(136\))g (is)h(in)o(v)o(ok)o(ed)e(on)i(a)f(Prolog)g(\014le)g(it)h(\014rst)g (runs)g(the)h(GNU)e(Prolog)-30 1288 y(compiler)f(\(section)g(3.4,)f (page)g(20\))g(as)h(a)f(c)o(hild)g(pro)q(cess)j(to)d(generate)i(a)e (temp)q(orary)h(W)-5 b(AM)17 b(\014le)f(for)g(b)o(yte-co)q(de.)28 b(If)-30 1337 y(the)20 b(compilation)e(fails)g(a)g(message)i(is)f (displa)o(y)o(ed)g(and)g(nothing)f(is)i(loaded.)33 b(If)19 b(the)h(compilation)d(succeeds,)23 b(the)-30 1387 y(pro)q(duced)17 b(\014le)e(is)h(loaded)f(in)o(to)f(memory)h(using)h Fh(load/1)e Fm(\(section)i(7.23.2,)d(page)j(137\).)21 b(Namely)m(,)14 b(the)i(b)o(yte-co)q(de)h(of)-30 1437 y(eac)o(h)c(predicate)g(is)f (loaded.)17 b(When)12 b(a)g(predicate)h Fd(P)19 b Fm(is)12 b(loaded)g(if)f(there)i(is)f(a)g(previous)g(de\014nition)g(for)g Fd(P)19 b Fm(it)11 b(is)h(remo)o(v)o(ed)-30 1487 y(\(i.e.)20 b(all)14 b(clauses)h(de\014ning)g Fd(P)22 b Fm(are)15 b(erased\).)21 b(W)m(e)15 b(sa)o(y)f(that)h Fd(P)21 b Fm(is)15 b(rede\014ned.)22 b(Note)15 b(that)f(only)g(consulted)i (predicates)-30 1537 y(can)e(b)q(e)g(rede\014ned.)19 b(If)d Fd(P)21 b Fm(is)13 b(a)g(nativ)o(e-co)q(de)g(predicate,)h (trying)f(to)g(rede\014ne)i(it)e(will)e(pro)q(duce)k(an)e(error)h(at)f (load-time:)-30 1586 y(the)i(predicate)g(rede\014nition)f(will)f(b)q(e) h(ignored)g(and)f(the)i(follo)o(wing)c(message)k(displa)o(y)o(ed:)74 1669 y Fh(native)21 b(code)g(procedure)f Fd(P)28 b Fh(cannot)21 b(be)g(redefined)-30 1753 y Fm(Finally)m(,)12 b(an)h(existing)h (predicate)h(will)d(not)i(b)q(e)g(remo)o(v)o(ed)g(if)f(it)g(is)h(not)g (re-loaded.)k(This)13 b(means)h(that)g(if)f(a)h(predicate)g Fd(P)-30 1802 y Fm(is)f(loaded)f(when)g(consulting)h(the)f(\014le)h Fd(F)7 b Fm(,)12 b(and)g(if)f(later)i(the)g(de\014nition)f(of)j Fd(P)k Fm(is)12 b(remo)o(v)o(ed)h(from)e(the)i(\014le)g Fd(F)7 b Fm(,)12 b(consulting)-30 1852 y Fd(F)21 b Fm(again)13 b(will)f(not)i(remo)o(v)o(e)g(the)h(previously)e(loaded)h(de\014nition) f(of)k Fd(P)k Fm(from)13 b(the)h(memory)m(.)-30 1952 y(Consulted)i(predicates)g(can)f(b)q(e)g(debugged)g(using)g(the)g (Prolog)f(debugger.)21 b(Use)16 b(the)f(debugger)h(predicate)g Fh(trace/0)-30 2002 y Fm(or)e Fh(debug/0)f Fm(\(section)h(4.3.1,)e (page)i(29\))g(to)f(activ)n(ate)h(the)g(debugger.)-30 2159 y Fi(3.2.4)48 b(In)o(terrupting)13 b(a)j(query)-30 2286 y Fm(Under)i(the)g(top-lev)o(el)e(it)h(is)g(p)q(ossible)g(to)f(in) o(terrupt)i(the)g(execution)f(of)g(a)f(query)i(b)o(y)e(t)o(yping)h(the) g(in)o(terruption)g(k)o(ey)-30 2336 y(\()p Fh(Ctl-C)p Fm(\).)11 b(This)h(can)g(b)q(e)g(used)h(to)f(ab)q(ort)g(a)g(query)m(,)f (to)h(stop)g(an)g(in\014nite)g(lo)q(op,)f(to)g(activ)n(ate)h(the)h (debugger,.)6 b(.)h(.)f(When)12 b(an)-30 2385 y(in)o(terruption)e(o)q (ccurs)i(the)e(top-lev)o(el)f(displa)o(ys)g(the)i(follo)o(wing)c (message:)16 b Fh(Prolog)21 b(interruption)e(\(h)j(for)f(help\))f(?)-30 2435 y Fm(The)15 b(user)g(can)f(then)g(t)o(yp)q(e)h(one)f(of)f(the)i (follo)o(wing)c(commands:)p -30 2499 1859 2 v -30 2549 2 50 v -3 2534 a(Command)p 209 2549 V 74 w(Name)p 412 2549 V 75 w(Description)p 1827 2549 V -30 2550 1859 2 v -30 2560 V -30 2610 2 50 v 80 2595 a Fh(a)p 209 2610 V 160 w Fm(ab)q(ort)p 412 2610 V 79 w(ab)q(ort)j(the)g(curren)o(t)i (execution.)j(Same)13 b(as)h Fh(abort/0)f Fm(\(section)h(7.18.1,)e (page)i(112\))p 1827 2610 V -30 2612 1859 2 v -30 2662 2 50 v 80 2647 a Fh(e)p 209 2662 V 175 w Fm(exit)p 412 2662 V 94 w(quit)f(the)i(curren)o(t)g(Prolog)e(pro)q(cess.)20 b(Same)14 b(as)g Fh(halt/0)f Fm(\(section)h(7.18.1,)e(page)i(112\))p 1827 2662 V -30 2663 1859 2 v -30 2713 2 50 v 80 2698 a Fh(b)p 209 2713 V 159 w Fm(break)p 412 2713 V 78 w(in)o(v)o(ok)o(e)f (a)h(recursiv)o(e)h(top-lev)o(el.)i(Same)d(as)g Fh(break/0)f Fm(\(section)h(7.18.1,)e(page)i(112\))p 1827 2713 V -30 2715 1859 2 v -30 2765 2 50 v 80 2750 a Fh(c)p 209 2765 V 133 w Fm(con)o(tin)o(ue)p 412 2765 V 52 w(resume)h(the)g(execution)p 1827 2765 V -30 2766 1859 2 v -30 2816 2 50 v 80 2801 a Fh(t)p 209 2816 V 164 w Fm(trace)p 412 2816 V 84 w(start)g(the)f (debugger)h(using)f Fh(trace/0)e Fm(\(section)j(4.3.1,)d(page)i(29\))p 1827 2816 V -30 2818 1859 2 v -30 2867 2 50 v 80 2853 a Fh(d)p 209 2867 V 155 w Fm(debug)p 412 2867 V 74 w(start)h(the)f (debugger)h(using)f Fh(debug/0)e Fm(\(section)j(4.3.1,)d(page)i(29\))p 1827 2867 V -30 2869 1859 2 v -30 2919 2 50 v 36 2904 a Fh(h)g Fm(or)g Fh(?)p 209 2919 V 128 w Fm(help)p 412 2919 V 90 w(displa)o(y)f(a)g(summary)h(of)f(a)o(v)n(ailable)f(commands) p 1827 2919 V -30 2921 1859 2 v eop end %%Page: 18 20 TeXDict begin 18 19 bop -30 -45 a Fm(18)1350 b(3)41 b(USING)14 b(GNU)f(PR)o(OLOG)p -30 -27 1890 4 v -30 115 a Fi(3.2.5)48 b(The)16 b(line)g(editor)-30 241 y Fm(The)21 b(line)f(editor)g(\()p Fh(linedit)p Fm(\))f(allo)o(ws)g(the)i(user)h(to)e(build/up)q(date)g (the)h(curren)o(t)g(input)f(line)g(using)g(a)g(v)n(ariet)o(y)g(of)-30 291 y(commands.)h(This)15 b(facilit)o(y)e(is)i(a)o(v)n(ailable)e(if)h (the)h Fh(linedit)f Fm(part)h(of)f(GNU)h(Prolog)f(has)h(b)q(een)h (installed.)21 b Fh(linedit)13 b Fm(is)-30 341 y(implicitly)g(called)i (b)o(y)f(an)o(y)h(built-in)e(predicate)j(reading)f(from)f(a)h(terminal) f(\(e.g.)21 b Fh(get)p 1363 341 14 2 v 15 w(char/1)p Fm(,)13 b Fh(read/1)p Fm(,.)5 b(.)i(.)f(\).)21 b(This)-30 391 y(is)14 b(the)h(case)g(when)f(the)g(top-lev)o(el)g(reads)h(a)e (query)m(.)-30 490 y Fi(Bindings)p Fm(:)18 b(eac)o(h)c(command)g(of)i Fh(linedit)d Fm(is)h(activ)n(ated)g(using)g(a)f(k)o(ey)m(.)19 b(F)m(or)13 b(some)i(commands)e(another)i(k)o(ey)f(is)g(also)-30 540 y(a)o(v)n(ailable)i(to)h(in)o(v)o(ok)o(e)g(the)h(command)e(\(on)i (some)f(terminals)g(this)h(other)g(k)o(ey)g(ma)o(y)e(not)i(w)o(ork)f (prop)q(erly)h(while)f(the)-30 590 y(primary)d(k)o(ey)g(alw)o(a)o(ys)e (w)o(orks\).)19 b(Here)c(is)f(the)g(list)f(of)h(a)o(v)n(ailable)d (commands:)p -30 656 1720 2 v -30 706 2 50 v 59 691 a(Key)p 218 706 V 114 w(Alternate)j(k)o(ey)p 516 706 V 52 w(Description)p 1688 706 V -30 708 1720 2 v -30 717 V -30 767 2 50 v 41 752 a Fh(Ctl-B)p 218 767 V 196 w Fg( )p 516 767 V 154 w Fm(go)f(to)h(the)h(previous)f(c)o(haracter)p 1688 767 V -30 769 1720 2 v -30 819 2 50 v 41 804 a Fh(Ctl-F)p 218 819 V 196 w Fg(!)p 516 819 V 154 w Fm(go)f(to)h(the)h(next)f(c)o (haracter)p 1688 819 V -30 820 1720 2 v -30 870 2 50 v 41 855 a Fh(Esc-B)p 218 870 V 153 w(Ctl-)p Fg( )p 516 870 V 109 w Fm(go)f(to)h(the)h(previous)f(w)o(ord)p 1688 870 V -30 872 1720 2 v -30 922 2 50 v 41 907 a Fh(Esc-F)p 218 922 V 153 w(Ctl-)p Fg(!)p 516 922 V 109 w Fm(go)f(to)h(the)h(next)f (w)o(ord)p 1688 922 V -30 923 1720 2 v -30 973 2 50 v 41 958 a Fh(Ctl-A)p 218 973 V 174 w(Home)p 516 973 V 130 w Fm(go)f(to)h(the)h(b)q(eginning)e(of)g(the)i(line)p 1688 973 V -30 975 1720 2 v -30 1025 2 50 v 41 1010 a Fh(Ctl-E)p 218 1025 V 184 w(End)p 516 1025 V 142 w Fm(go)e(to)h(the)h (end)f(of)f(the)i(line)p 1688 1025 V -30 1026 1720 2 v -30 1076 2 50 v 41 1061 a Fh(Ctl-H)p 218 1076 V 119 w(Backspace)p 516 1076 V 75 w Fm(delete)g(the)f(previous)h(c)o (haracter)p 1688 1076 V -30 1078 1720 2 v -30 1128 2 50 v 41 1113 a Fh(Ctl-D)p 218 1128 V 152 w(Delete)p 516 1128 V 108 w Fm(delete)g(the)f(curren)o(t)i(c)o(haracter)p 1688 1128 V -30 1129 1720 2 v -30 1179 2 50 v 41 1164 a Fh(Ctl-U)p 218 1179 V 130 w(Ctl-Home)p 516 1179 V 86 w Fm(delete)f(from)e(b)q(eginning)g(of)h(the)g(line)f(to)h(the)h (curren)o(t)g(c)o(haracter)p 1688 1179 V -30 1181 1720 2 v -30 1231 2 50 v 41 1216 a Fh(Ctl-K)p 218 1231 V 141 w(Ctl-End)p 516 1231 V 97 w Fm(delete)g(from)e(the)i(curren)o(t)g(c)o (haracter)g(to)f(the)g(end)h(of)e(the)i(line)p 1688 1231 V -30 1232 1720 2 v -30 1282 2 50 v 41 1267 a Fh(Esc-L)p 218 1282 V 516 1282 V 392 w Fm(lo)o(w)o(er)f(case)g(the)h(next)f(w)o (ord)p 1688 1282 V -30 1284 1720 2 v -30 1333 2 50 v 41 1319 a Fh(Esc-U)p 218 1333 V 516 1333 V 392 w Fm(upp)q(er)h(case)g (the)f(next)h(w)o(ord)p 1688 1333 V -30 1335 1720 2 v -30 1385 2 50 v 41 1370 a Fh(Esc-C)p 218 1385 V 516 1385 V 392 w Fm(capitalize)e(the)i(next)f(w)o(ord)p 1688 1385 V -30 1387 1720 2 v -30 1436 2 50 v 41 1421 a Fh(Ctl-T)p 218 1436 V 516 1436 V 392 w Fm(exc)o(hange)h(last)e(t)o(w)o(o)h(c)o (haracters)p 1688 1436 V -30 1438 1720 2 v -30 1488 2 50 v 41 1473 a Fh(Ctl-V)p 218 1488 V 152 w(Insert)p 516 1488 V 108 w Fm(switc)o(h)g(on/o\013)g(the)g(insert/replace)h(mo)q(de)p 1688 1488 V -30 1490 1720 2 v -30 1539 2 50 v 41 1524 a Fh(Ctl-I)p 218 1539 V 184 w(Tab)p 516 1539 V 142 w Fm(complete)f(w)o(ord)g(\(t)o(wice)g(displa)o(ys)g(all)e(p)q(ossible)i (completions\))p 1688 1539 V -30 1541 1720 2 v -30 1591 2 50 v -3 1576 a Fh(Esc-Ctl-I)p 218 1591 V 97 w(Esc-Tab)p 516 1591 V 97 w Fm(insert)h(spaces)g(to)f(em)o(ulate)f(a)h(tabulation)p 1688 1591 V -30 1593 1720 2 v -30 1642 2 50 v -3 1627 a Fh(Ctl-space)p 218 1642 V 516 1642 V 348 w Fm(mark)f(b)q(eginning)h (of)f(the)h(selection)p 1688 1642 V -30 1644 1720 2 v -30 1694 2 50 v 41 1679 a Fh(Esc-W)p 218 1694 V 516 1694 V 392 w Fm(cop)o(y)g(\(from)f(the)i(b)q(egin)e(selection)i(mark)e(to)h (the)h(curren)o(t)g(c)o(haracter\))p 1688 1694 V -30 1695 1720 2 v -30 1745 2 50 v 41 1730 a Fh(Ctl-W)p 218 1745 V 516 1745 V 392 w Fm(cut)f(\(from)g(the)g(b)q(egin)g(selection)h (mark)e(to)h(the)g(curren)o(t)i(c)o(haracter\))p 1688 1745 V -30 1747 1720 2 v -30 1797 2 50 v 41 1782 a Fh(Ctl-Y)p 218 1797 V 516 1797 V 392 w Fm(paste)p 1688 1797 V -30 1798 1720 2 v -30 1848 2 50 v 41 1833 a Fh(Ctl-P)p 218 1848 V 207 w Fg(")p 516 1848 V 164 w Fm(recall)e(previous)g(history)g (line)p 1688 1848 V -30 1850 1720 2 v -30 1900 2 50 v 41 1885 a Fh(Ctl-N)p 218 1900 V 207 w Fg(#)p 516 1900 V 164 w Fm(recall)g(next)g(history)g(line)p 1688 1900 V -30 1901 1720 2 v -30 1951 2 50 v 41 1936 a Fh(Esc-P)p 218 1951 V 516 1951 V 392 w Fm(recall)g(previous)g(history)g(line)f(b)q (eginning)h(with)f(the)i(curren)o(t)g(pre\014x)p 1688 1951 V -30 1953 1720 2 v -30 2003 2 50 v 41 1988 a Fh(Esc-N)p 218 2003 V 516 2003 V 392 w Fm(recall)f(next)g(history)g(line)f(b)q (eginning)h(with)f(the)i(curren)o(t)g(pre\014x)p 1688 2003 V -30 2004 1720 2 v -30 2054 2 50 v 41 2039 a Fh(Esc-<)p 218 2054 V 141 w(Page)21 b(Up)p 516 2054 V 98 w Fm(recall)14 b(\014rst)g(history)g(line)p 1688 2054 V -30 2056 1720 2 v -30 2106 2 50 v 41 2091 a Fh(Esc->)p 218 2106 V 119 w(Page)21 b(Down)p 516 2106 V 76 w Fm(recall)14 b(last)f(history)h (line)p 1688 2106 V -30 2107 1720 2 v -30 2157 2 50 v 41 2142 a Fh(Ctl-C)p 218 2157 V 516 2157 V 392 w Fm(generate)h(an)f(in) o(terrupt)g(signal)f(\(section)i(3.2.4,)d(page)i(17\))p 1688 2157 V -30 2159 1720 2 v -30 2209 2 50 v 41 2194 a Fh(Ctl-D)p 218 2209 V 516 2209 V 392 w Fm(generate)h(an)f (end-of-\014le)f(c)o(haracter)j(\(at)e(the)g(b)q(egin)g(of)f(the)i (line\))p 1688 2209 V -30 2210 1720 2 v -30 2260 2 50 v 30 2245 a Fh(RETURN)p 218 2260 V 516 2260 V 381 w Fm(v)n(alidate)e(a) g(line)p 1688 2260 V -30 2262 1720 2 v -30 2311 2 50 v 41 2297 a Fh(Esc-?)p 218 2311 V 516 2311 V 392 w Fm(displa)o(y)g(a)g (summary)h(of)f(a)o(v)n(ailable)f(commands)p 1688 2311 V -30 2313 1720 2 v -30 2398 a Fi(History)q Fm(:)17 b(when)c(a)f(line)g (is)h(en)o(tered)h(\(i.e.)j(terminated)c(b)o(y)g Fh(RETURN)p Fm(\),)e Fh(linedit)g Fm(records)j(it)e(in)g(an)g(in)o(ternal)g(list)g (called)-30 2448 y(history)m(.)18 b(It)c(is)f(later)h(p)q(ossible)g(to) f(recall)h(history)f(lines)h(using)f(appropriate)h(commands)f(\(e.g.)18 b Fh(Ctl-P)13 b Fm(recall)g(the)h(last)-30 2498 y(en)o(tered)j(line\))d (and)h(to)g(mo)q(dify)e(them)i(as)g(needed.)23 b(It)15 b(is)f(also)g(p)q(ossible)i(to)e(recall)h(a)g(history)f(line)h(b)q (eginning)f(with)g(a)-30 2548 y(giv)o(en)i(pre\014x.)24 b(F)m(or)16 b(instance)g(to)g(recall)g(the)g(previous)g(line)g(b)q (eginning)f(with)g Fh(write)g Fm(simply)g(t)o(yp)q(e)h Fh(write)f Fm(follo)o(w)o(ed)-30 2597 y(b)o(y)g Fh(Esc-P)p Fm(.)d(Another)j Fh(Esc-P)e Fm(will)f(recall)i(an)f(earlier)h(line)g(b) q(eginning)f(with)h Fh(write)p Fm(,.)5 b(.)h(.)-30 2697 y Fi(Completion)p Fm(:)16 b(another)10 b(imp)q(ortan)o(t)g(feature)h (of)i Fh(linedit)c Fm(is)h(its)g(completion)g(facilit)o(y)m(.)k (Indeed,)e Fh(linedit)d Fm(main)o(tains)-30 2747 y(a)i(list)g(of)g(kno) o(wn)f(w)o(ords)i(and)f(uses)h(it)f(to)g(complete)h(the)g(pre\014x)g (of)e(a)h(w)o(ord.)17 b(Initially)9 b(this)i(list)g(con)o(tains)g(all)f (prede\014ned)-30 2797 y(atoms)i(and)g(the)h(atoms)f(corresp)q(onding)h (to)f(a)o(v)n(ailable)e(predicates.)19 b(This)12 b(list)g(is)g (dynamically)e(up)q(dated)j(when)g(a)f(new)-30 2847 y(atom)i(app)q (ears)h(in)f(the)g(system)h(\(whether)h(read)f(at)f(the)h(top-lev)o (el,)e(created)j(with)e(a)g(built-in)f(predicate,)h(asso)q(ciated)-30 2896 y(with)g(a)f(new)h(consulted)g(predicate,.)8 b(.)e(.)h(\).)18 b(When)13 b(the)i(completion)d(k)o(ey)i(\()p Fh(Tab)p Fm(\))f(is)h(pressed)h Fh(linedit)d Fm(acts)j(as)e(follo)o(ws:)p eop end %%Page: 19 21 TeXDict begin 19 20 bop -30 -45 a Fm(3.3)41 b(Adjusting)14 b(the)g(size)h(of)e(Prolog)g(stac)o(ks)1125 b(19)p -30 -27 1890 4 v 33 115 a Fg(\017)20 b Fm(use)15 b(the)f(curren)o(t)i(w)o (ord)e(as)g(a)f(pre\014x.)33 198 y Fg(\017)20 b Fm(collect)14 b(all)f(w)o(ords)h(of)f(the)i(list)e(that)h(b)q(egin)g(with)g(this)g (pre\014x.)33 281 y Fg(\017)20 b Fm(complete)15 b(the)f(curren)o(t)h(w) o(ord)f(with)g(the)g(longest)g(common)f(part)h(of)f(all)g(matc)o(hing)g (w)o(ords.)33 364 y Fg(\017)20 b Fm(if)13 b(more)h(than)g(one)g(w)o (ord)g(matc)o(hes)g(emit)g(a)g(b)q(eep)h(\(a)e(second)i Fh(Tab)f Fm(will)e(displa)o(y)h(all)f(p)q(ossibilities\).)-30 447 y(Example:)74 527 y Fh(|)22 b(?-)f(argu)276 b Fm(\(here)15 b(the)f(user)h(presses)i Fh(Tab)c Fm(to)g(complete)i(the)f(w)o(ord\))74 577 y Fh(|)22 b(?-)f(argument)p 362 577 14 2 v 188 w Fm(\()p Fh(linedit)12 b Fm(completes)j Fh(argu)e Fm(with)g Fh(argument)p 1295 577 V 28 w Fm(and)h(emits)g(a)g(b)q(eep\))547 627 y(\(the)g(user)h(presses)h(again)d Fh(Tab)g Fm(to)h(see)h(all)e(p)q (ossible)h(completions\))74 677 y Fh(argument)p 253 677 V 14 w(counter)129 b Fm(\()p Fh(linedit)12 b Fm(sho)o(ws)i(3)g(p)q (ossible)g(completions\))74 727 y Fh(argument)p 253 727 V 14 w(list)74 776 y(argument)p 253 776 V 14 w(value)74 826 y(|)22 b(?-)f(argument)p 362 826 V 188 w Fm(\()p Fh(linedit)12 b Fm(redispla)o(ys)i(the)h(input)e(line\))74 926 y Fh(|)22 b(?-)f(argument)p 362 926 V 14 w(c)152 b Fm(\(to)14 b(select)h Fh(argument)p 906 926 V 14 w(counter)d Fm(the)j(user)g(presses)h Fh(c)e Fm(and)f Fh(Tab)p Fm(\))74 976 y Fh(|)22 b(?-)f(argument)p 362 976 V 14 w(counter)f Fm(\()p Fh(linedit)12 b Fm(completes)j(with)e Fh(argument)p 1194 976 V 14 w(counter)p Fm(\))-30 1059 y(Finally)m(,)f Fh(linedit)g Fm(allo)o(ws)g(the)i(user)h(to)f(c)o(hec)o(k)g(that)g (\(square/curly\))g(brac)o(k)o(ets)h(are)f(w)o(ell)f(balanced.)18 b(F)m(or)13 b(this,)h(when)-30 1109 y(a)f(close)h(brac)o(k)o(et)g(sym)o (b)q(ol,)e(i.e.)17 b Fh(\))p Fm(,)c Fh(])g Fm(or)g Fh(})p Fm(,)g(is)g(t)o(yp)q(ed,)g Fh(linedit)f Fm(determines)j(the)e(asso)q (ciated)h(op)q(en)g(brac)o(k)o(et,)g(i.e.)j Fh(\()p Fm(,)12 b Fh([)-30 1159 y Fm(or)i Fh({)p Fm(,)f(and)h(temp)q(orarily)f(rep)q (ositions)i(the)f(cursor)h(on)f(it)f(to)h(sho)o(w)g(the)g(matc)o(h.)-30 1325 y Ff(3.3)56 b(Adjusting)19 b(the)f(size)g(of)h(Prolog)f(stac)n(ks) -30 1451 y Fm(GNU)13 b(Prolog)f(uses)j(sev)o(eral)e(stac)o(ks)h(to)f (execute)h(a)f(Prolog)f(program.)17 b(Eac)o(h)d(stac)o(k)f(has)g(a)g (static)g(size)h(and)e(cannot)i(b)q(e)-30 1501 y(dynamically)d (increased)j(during)e(the)i(execution.)k(F)m(or)12 b(eac)o(h)h(stac)o (k)g(there)h(is)f(a)f(default)g(size)i(but)e(the)i(user)f(can)g (de\014ne)-30 1551 y(a)f(new)h(size)g(b)o(y)f(setting)g(an)g(en)o (vironmen)o(t)g(v)n(ariable.)k(When)c(a)g(GNU)g(Prolog)g(program)f(is)h (run)g(it)g(\014rst)h(consults)g(these)-30 1601 y(v)n(ariables)j(and)h (if)e(they)i(are)g(not)g(de\014ned)h(uses)f(the)g(default)g(sizes.)27 b(The)17 b(follo)o(wing)d(table)i(presen)o(ts)j(eac)o(h)e(stac)o(k)g (of)-30 1650 y(GNU)d(Prolog)f(with)h(its)g(default)f(size)i(and)f(the)g (name)g(of)f(its)h(asso)q(ciated)h(en)o(vironmen)o(t)e(v)n(ariable:)p -30 1714 1851 2 v -30 1764 2 50 v 13 1749 a(Stac)o(k)p 153 1764 V 83 w(Default)p 370 1764 V 67 w(En)o(vironmen)o(t)p 657 1764 V 51 w(Description)p 1819 1764 V -30 1814 V 14 1799 a(name)p 153 1814 V 68 w(size)i(\(Kb\))p 370 1814 V 98 w(v)n(ariable)p 657 1814 V 1819 1814 V -30 1815 1851 2 v -30 1825 V -30 1875 2 50 v 8 1860 a Fh(local)p 153 1875 V 103 w Fm(4096)p 370 1875 V 133 w Fh(LOCALSZ)p 657 1875 V 91 w Fm(con)o(trol)f(stac)o(k)g(\(en)o(vironmen)o(ts)h(and)e (c)o(hoice-p)q(oin)o(ts\))p 1819 1875 V -30 1877 1851 2 v -30 1927 2 50 v -3 1912 a Fh(global)p 153 1927 V 92 w Fm(8192)p 370 1927 V 122 w Fh(GLOBALSZ)p 657 1927 V 80 w Fm(heap)h(\(comp)q(ound)g(terms\))p 1819 1927 V -30 1928 1851 2 v -30 1978 2 50 v 8 1963 a Fh(trail)p 153 1978 V 103 w Fm(3072)p 370 1978 V 133 w Fh(TRAILSZ)p 657 1978 V 91 w Fm(conditional)f(bindings)g(\(bindings)g(to)h(undo)g (at)g(bac)o(ktrac)o(king\))p 1819 1978 V -30 1980 1851 2 v -30 2030 2 50 v 19 2015 a Fh(cstr)p 153 2030 V 114 w Fm(3072)p 370 2030 V 144 w Fh(CSTRSZ)p 657 2030 V 102 w Fm(\014nite)g(domain)f(constrain)o(t)h(stac)o(k)g(\(FD)g(v)n (ariables)f(and)h(constrain)o(ts\))p 1819 2030 V -30 2031 1851 2 v -30 2114 a(If)h(the)g(size)g(of)f(a)h(stac)o(k)g(is)f(to) q(o)g(small)g(an)g(o)o(v)o(er\015o)o(w)g(will)g(o)q(ccur)h(during)g (the)g(execution.)21 b(In)14 b(that)h(case)h(GNU)e(Prolog)-30 2164 y(emits)g(the)h(follo)o(wing)c(error)k(message)g(b)q(efore)f (stopping:)74 2247 y Fd(S)29 b Fh(stack)21 b(overflow)f(\(size:)g Fd(N)29 b Fh(Kb,)21 b(environment)f(variable)g(used:)h Fd(E)7 b Fh(\))-30 2330 y Fm(where)18 b Fd(S)23 b Fm(is)17 b(the)f(name)h(of)e(the)i(stac)o(k,)g Fd(N)24 b Fm(is)16 b(the)h(curren)o(t)h(stac)o(k)e(size)i(in)d(Kb)i(and)f Fd(E)24 b Fm(the)17 b(name)f(of)f(the)i(asso)q(ciated)-30 2380 y(en)o(vironmen)o(t)g(v)n(ariable.)24 b(When)16 b(suc)o(h)h(a)f(message)h(o)q(ccurs)h(it)e(is)g(p)q(ossible)g(to)g (\(re\)de\014ne)i(the)f(v)n(ariable)e Fd(E)24 b Fm(with)16 b(the)-30 2429 y(new)f(size.)k(F)m(or)13 b(instance)i(to)e(allo)q(cate) h(8192)f(Kb)h(to)g(the)g(lo)q(cal)f(stac)o(k)h(under)h(a)f(Unix)f (shell)h(use:)74 2502 y Fh(LOCALSZ=8192;)19 b(export)i(LOCALS)119 b Fm(\(under)15 b Fh(sh)e Fm(or)h Fh(bash)p Fm(\))74 2552 y Fh(setenv)21 b(LOCALSZ)f(8192)294 b Fm(\(under)15 b Fh(csh)e Fm(or)h Fh(tcsh)p Fm(\))-30 2633 y(This)h(metho)q(d)g(allo)o (ws)f(the)h(user)h(to)e(adjust)h(the)h(size)f(of)f(Prolog)g(stac)o(ks.) 22 b(Ho)o(w)o(ev)o(er,)15 b(in)f(some)h(cases)h(it)f(is)f(preferable) -30 2682 y(not)f(to)g(allo)o(w)e(the)i(user)h(to)e(mo)q(dify)g(these)i (sizes.)19 b(F)m(or)12 b(instance,)h(when)h(pro)o(viding)d(a)h(stand)h (alone)g(executable)h(whose)-30 2732 y(b)q(eha)o(vior)h(should)f(b)q(e) h(indep)q(enden)o(t)h(of)e(the)h(en)o(vironmen)o(t)f(in)g(whic)o(h)h (it)f(is)g(run.)20 b(In)14 b(that)h(case)g(the)h(program)d(should)-30 2782 y(not)i(consult)f(en)o(vironmen)o(t)g(v)n(ariables)f(and)h(the)h (programmer)f(should)g(b)q(e)h(able)e(to)h(de\014ne)i(new)e(default)g (stac)o(k)h(sizes.)-30 2832 y(The)h(GNU)f(Prolog)g(compiler)g(o\013ers) h(this)f(facilities)f(via)h(sev)o(eral)h(command-line)d(options)i(suc)o (h)h(as)g Fh(--local-size)-30 2882 y Fm(or)e Fh(--fixed-sizes)d Fm(\(section)k(3.4.3,)d(page)i(22\).)p eop end %%Page: 20 22 TeXDict begin 20 21 bop -30 -45 a Fm(20)1350 b(3)41 b(USING)14 b(GNU)f(PR)o(OLOG)p -30 -27 1890 4 v -30 115 a(Finally)g(note)h(that)g (GNU)g(Prolog)g(stac)o(ks)h(are)f(virtually)f(allo)q(cated)g(\(i.e.)19 b(use)14 b(virtual)g(memory\).)k(This)c(means)g(that)-30 165 y(a)i(ph)o(ysical)f(memory)g(page)g(is)h(allo)q(cated)f(only)g (when)h(needed)h(\(i.e.)22 b(when)16 b(an)g(attempt)f(to)h(read/write)g (it)f(o)q(ccurs\).)-30 215 y(Th)o(us)f(it)e(is)h(p)q(ossible)g(to)g (de\014ne)h(v)o(ery)f(large)g(stac)o(ks.)18 b(A)o(t)c(the)f(execution,) h(only)e(the)h(needed)i(amoun)o(t)d(of)g(space)i(will)e(b)q(e)-30 264 y(ph)o(ysically)h(allo)q(cated.)-30 430 y Ff(3.4)56 b(The)18 b(GNU)h(Prolog)g(compiler)-30 557 y Fi(3.4.1)48 b(Di\013eren)o(t)14 b(kinds)h(of)h(co)q(des)-30 683 y Fm(One)g(of)e(the)i(main)e(adv)n(an)o(tages)g(of)h(GNU)f(Prolog)h(is)f (its)h(abilit)o(y)e(to)i(pro)q(duce)h(stand)g(alone)e(executables.)23 b(A)15 b(Prolog)-30 733 y(program)f(can)g(b)q(e)h(compiled)f(to)g (nativ)o(e)g(co)q(de)h(to)f(giv)o(e)f(rise)i(to)f(a)g(mac)o(hine-dep)q (enden)o(t)h(executable)h(using)e(the)g(GNU)-30 783 y(Prolog)j (compiler.)29 b(Ho)o(w)o(ev)o(er)18 b(nativ)o(e-co)q(de)g(predicates)h (cannot)f(b)q(e)g(listed)g(nor)g(fully)e(debugged.)30 b(So)17 b(there)i(is)e(an)-30 833 y(alternativ)o(e)i(to)f(nativ)o(e-co) q(de)i(compilation:)25 b(b)o(yte-co)q(de)20 b(compilation.)31 b(By)19 b(default)f(the)h(GNU)g(Prolog)f(compiler)-30 882 y(pro)q(duces)g(nativ)o(e-co)q(de)f(but)f(via)f(a)h(command-line)f (option)g(it)h(can)g(pro)q(duce)i(a)e(\014le)g(ready)g(for)g(b)o (yte-co)q(de)h(loading.)-30 932 y(This)e(is)f(exactly)g(what)h Fh(consult/1)d Fm(do)q(es)j(as)g(w)o(as)f(explained)g(ab)q(o)o(v)o(e)g (\(section)h(3.2.3,)e(page)h(16\).)19 b(GNU)14 b(Prolog)g(also)-30 982 y(manages)k(in)o(terpreted)h(co)q(de)f(using)g(a)f(Prolog)g(in)o (terpreter)i(written)f(in)g(Prolog.)28 b(Ob)o(viously)17 b(in)o(terpreted)i(co)q(de)f(is)-30 1032 y(slo)o(w)o(er)c(than)f(b)o (yte-co)q(de)i(but)e(do)q(es)h(not)g(require)g(the)g(in)o(v)o(o)q (cation)e(of)h(the)h(GNU)f(Prolog)g(compiler.)k(This)c(in)o(terpreter) -30 1082 y(is)19 b(used)g(eac)o(h)g(time)f(a)g(meta-call)g(is)g(needed) i(as)e(b)o(y)h Fh(call/1)e Fm(\(section)i(6.2.3,)f(page)g(47\).)31 b(This)19 b(also)e(the)i(case)h(of)-30 1132 y(dynamically)12 b(asserted)k(clauses.)j(The)14 b(follo)o(wing)e(table)h(summarizes)i (these)g(three)g(kinds)f(of)f(co)q(des:)p -30 1195 1577 2 v -30 1245 2 50 v -3 1230 a(T)o(yp)q(e)p 317 1245 V 254 w(Sp)q(eed)p 514 1245 V 91 w(Debug)h(?)p 716 1245 V 51 w(F)m(or)f(what)p 1546 1245 V -30 1247 1577 2 v -30 1257 V -30 1306 2 50 v -3 1292 a(in)o(terpreted-co)q(de)p 317 1306 V 54 w(slo)o(w)p 514 1306 V 166 w(y)o(es)p 716 1306 V 100 w(meta-call)g(and)g(dynamically)f(asserted)k(clauses)p 1546 1306 V -30 1308 1577 2 v -30 1358 2 50 v -3 1343 a(b)o(yte-co)q(de)p 317 1358 V 174 w(medium)p 514 1358 V 98 w(y)o(es)p 716 1358 V 100 w(consulted)e(predicates)p 1546 1358 V -30 1360 1577 2 v -30 1409 2 50 v -3 1394 a(nativ)o(e-co)q(de)p 317 1409 V 141 w(fast)p 514 1409 V 184 w(no)p 716 1409 V 105 w(compiled)f(predicates)p 1546 1409 V -30 1411 1577 2 v -30 1552 a Fi(3.4.2)48 b(Compilation)16 b(sc)o(heme)-30 1678 y(Nativ)o(e-co)q(de)g (compilation)p Fm(:)h(a)d(Prolog)f(source)i(is)e(compiled)h(in)f(sev)o (eral)h(stages)h(to)e(pro)q(duce)i(an)f(ob)r(ject)g(\014le)g(that)-30 1728 y(is)i(link)o(ed)f(to)g(the)h(GNU)g(Prolog)f(libraries)g(to)g(pro) q(duce)i(an)f(executable.)24 b(The)16 b(Prolog)f(source)i(is)e(\014rst) h(compiled)f(to)-30 1778 y(obtain)d(a)g(W)-5 b(AM)12 b([9)o(])g(\014le.)17 b(F)m(or)12 b(a)g(detailed)g(study)h(of)e(the)i (W)-5 b(AM)12 b(the)h(in)o(terested)h(reader)f(can)f(refer)i(to)d(\\W)m (arren's)h(Ab-)-30 1828 y(stract)i(Mac)o(hine:)k(A)13 b(T)m(utorial)e(Reconstruction")765 1813 y Fl(21)814 1828 y Fm([1)o(].)17 b(The)c(W)-5 b(AM)13 b(\014le)g(is)g(translated)g (to)g(a)f(mac)o(hine-indep)q(enden)o(t)-30 1878 y(language)g(sp)q (eci\014cally)h(designed)g(for)f(GNU)g(Prolog.)17 b(This)12 b(language)g(is)g(close)h(to)f(a)g(\(univ)o(ersal\))h(assem)o(bly)f (language)-30 1927 y(and)18 b(is)f(based)i(on)e(a)h(v)o(ery)g(reduced)h (instruction)f(set.)30 b(F)m(or)17 b(this)h(reason)g(this)g(language)f (is)g(called)h(mini-assem)o(bly)-30 1977 y(\(MA\).)h(The)f(mini-assem)o (bly)f(\014le)h(is)g(then)h(mapp)q(ed)g(to)f(the)h(assem)o(bly)f (language)f(of)h(the)h(target)f(mac)o(hine.)31 b(This)-30 2027 y(assem)o(bly)12 b(\014le)h(is)f(assem)o(bled)g(to)g(giv)o(e)g (rise)g(to)g(an)g(ob)r(ject)h(\014le)f(whic)o(h)g(is)g(then)h(link)o (ed)f(with)f(the)i(GNU)f(Prolog)f(libraries)-30 2077 y(to)j(pro)o(vide)f(an)g(executable.)19 b(The)14 b(compiler)f(also)g (tak)o(es)h(in)o(to)f(accoun)o(t)g(Finite)h(Domain)d(constrain)o(t)j (de\014nition)f(\014les.)-30 2127 y(It)j(translates)h(them)f(to)f(C)h (and)f(in)o(v)o(ok)o(e)g(the)h(C)g(compiler)f(to)h(obtain)f(ob)r(ject)h (\014les.)24 b(The)16 b(follo)o(wing)d(\014gure)j(presen)o(ts)-30 2177 y(this)e(compilation)e(sc)o(heme:)p -30 2261 756 2 v 1 2288 a Fk(21)34 2300 y Fj(http://www)o(.is)o(g.s)o(fu.)o(ca)o (/~h)o(ak/)o(doc)o(ume)o(nt)o(s/w)o(am.)o(htm)o(l)p eop end %%Page: 21 23 TeXDict begin 21 22 bop -30 -45 a Fm(3.4)41 b(The)14 b(GNU)g(Prolog)f(compiler)1273 b(21)p -30 -27 1890 4 v 220 75 1391 2 v 220 1826 2 1751 v 234 1813 a @beginspecial 0 @llx 0 @lly 394 @urx 499 @ury 3270 @rwi @setspecial %%BeginDocument: compil-scheme.eps %!PS-Adobe-2.0 EPSF-2.0 %%Title: rfig3.eps %%Creator: fig2dev Version 3.2 Patchlevel 1 %%CreationDate: Mon Mar 8 16:52:59 1999 %%For: aude@borba.inria.fr (Jean-Christophe Aude) %%Orientation: Portrait %%BoundingBox: 0 0 394 499 %%Pages: 0 %%BeginSetup %%EndSetup %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save -69.0 516.0 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /reencdict 12 dict def /ReEncode { reencdict begin /newcodesandnames exch def /newfontname exch def /basefontname exch def /basefontdict basefontname findfont def /newfont basefontdict maxlength dict def basefontdict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName newfontname put newcodesandnames aload pop 128 1 255 { newfont /Encoding get exch /.notdef put } for newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat newfontname newfont definefont pop end } def /isovec [ 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde 8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis 8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron 8#220 /dotlessi 8#230 /oe 8#231 /OE 8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling 8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis 8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot 8#255 /endash 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus 8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph 8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine 8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf 8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute 8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring 8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute 8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute 8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve 8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply 8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex 8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave 8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring 8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute 8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute 8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve 8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide 8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex 8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def /Courier-Bold /Courier-Bold-iso isovec ReEncode /Times-Roman /Times-Roman-iso isovec ReEncode /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog $F2psBegin 10 setmiterlimit n -1000 9594 m -1000 -1000 l 8707 -1000 l 8707 9594 l cp clip 0.06000 0.06000 sc /Times-Roman-iso ff 180.00 scf sf 2325 1950 m gs 1 -1 sc (WAM) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 2175 m gs 1 -1 sc (files) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 450 m gs 1 -1 sc (Prolog) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 675 m gs 1 -1 sc (files) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 3435 m gs 1 -1 sc (mini-assembly) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 3660 m gs 1 -1 sc (files) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 4935 m gs 1 -1 sc (assembly) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 5160 m gs 1 -1 sc (files) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 6525 m gs 1 -1 sc (object) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 6750 m gs 1 -1 sc (files) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 6600 3450 m gs 1 -1 sc (FD constraint) col0 sh gr /Times-Roman-iso ff 180.00 scf sf 6600 3675 m gs 1 -1 sc (definition files) col0 sh gr /Times-Roman-iso ff 180.00 scf sf 5850 8250 m gs 1 -1 sc (Prolog/FD libraries) col0 sh gr /Times-Roman-iso ff 180.00 scf sf 5850 8475 m gs 1 -1 sc (and user libraries) col0 sh gr % Polyline 7.500 slw gs clippath 3499 6601 m 3375 6600 l 3485 6543 l 3353 6574 l 3367 6633 l cp clip n 5850 6000 m 3375 6600 l gs col0 s gr gr % arrowhead n 3499 6601 m 3375 6600 l 3485 6543 l 3492 6572 l 3499 6601 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3029 855 m 3000 975 l 2969 855 l 2970 990 l 3030 990 l cp clip n 2998 671 m 3000 975 l gs col0 s gr gr % arrowhead n 3029 855 m 3000 975 l 2969 855 l 2999 855 l 3029 855 l cp gs 0.00 setgray ef gr col0 s % Polyline n 2287 975 m 3787 975 l 3787 1500 l 2287 1500 l cp gs col0 s gr % Polyline gs clippath 3029 1680 m 3000 1800 l 2969 1680 l 2970 1815 l 3030 1815 l cp clip n 2998 1496 m 3000 1800 l gs col0 s gr gr % arrowhead n 3029 1680 m 3000 1800 l 2969 1680 l 2999 1680 l 3029 1680 l cp gs 0.00 setgray ef gr col0 s % Polyline n 2287 2475 m 3787 2475 l 3787 3000 l 2287 3000 l cp gs col0 s gr % Polyline gs clippath 3029 2355 m 3000 2475 l 2969 2355 l 2970 2490 l 3030 2490 l cp clip n 2998 2171 m 3000 2475 l gs col0 s gr gr % arrowhead n 3029 2355 m 3000 2475 l 2969 2355 l 2999 2355 l 3029 2355 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3029 3180 m 3000 3300 l 2969 3180 l 2970 3315 l 3030 3315 l cp clip n 2998 2996 m 3000 3300 l gs col0 s gr gr % arrowhead n 3029 3180 m 3000 3300 l 2969 3180 l 2999 3180 l 3029 3180 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3029 3855 m 3000 3975 l 2969 3855 l 2970 3990 l 3030 3990 l cp clip n 2998 3671 m 3000 3975 l gs col0 s gr gr % arrowhead n 3029 3855 m 3000 3975 l 2969 3855 l 2999 3855 l 3029 3855 l cp gs 0.00 setgray ef gr col0 s % Polyline n 2287 3975 m 3787 3975 l 3787 4500 l 2287 4500 l cp gs col0 s gr % Polyline gs clippath 3029 4680 m 3000 4800 l 2969 4680 l 2970 4815 l 3030 4815 l cp clip n 2998 4496 m 3000 4800 l gs col0 s gr gr % arrowhead n 3029 4680 m 3000 4800 l 2969 4680 l 2999 4680 l 3029 4680 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3029 5355 m 3000 5475 l 2969 5355 l 2970 5490 l 3030 5490 l cp clip n 2998 5171 m 3000 5475 l gs col0 s gr gr % arrowhead n 3029 5355 m 3000 5475 l 2969 5355 l 2999 5355 l 3029 5355 l cp gs 0.00 setgray ef gr col0 s % Polyline n 2287 5475 m 3787 5475 l 3787 6000 l 2287 6000 l cp gs col0 s gr % Polyline gs clippath 3029 6180 m 3000 6300 l 2969 6180 l 2970 6315 l 3030 6315 l cp clip n 2998 5996 m 3000 6300 l gs col0 s gr gr % arrowhead n 3029 6180 m 3000 6300 l 2969 6180 l 2999 6180 l 3029 6180 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3029 7080 m 3000 7200 l 2969 7080 l 2970 7215 l 3030 7215 l cp clip n 2998 6896 m 3000 7200 l gs col0 s gr gr % arrowhead n 3029 7080 m 3000 7200 l 2969 7080 l 2999 7080 l 3029 7080 l cp gs 0.00 setgray ef gr col0 s % Polyline n 2212 7199 m 3712 7199 l 3712 7724 l 2212 7724 l cp gs col0 s gr % Polyline gs clippath 3029 7905 m 3000 8025 l 2969 7905 l 2970 8040 l 3030 8040 l cp clip n 2998 7721 m 3000 8025 l gs col0 s gr gr % arrowhead n 3029 7905 m 3000 8025 l 2969 7905 l 2999 7905 l 3029 7905 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 5880 3855 m 5851 3975 l 5820 3855 l 5821 3990 l 5881 3990 l cp clip n 5849 3671 m 5851 3975 l gs col0 s gr gr % arrowhead n 5880 3855 m 5851 3975 l 5820 3855 l 5850 3855 l 5880 3855 l cp gs 0.00 setgray ef gr col0 s % Polyline n 5100 3975 m 6600 3975 l 6600 4500 l 5100 4500 l cp gs col0 s gr % Polyline gs clippath 5880 4680 m 5851 4800 l 5820 4680 l 5821 4815 l 5881 4815 l cp clip n 5849 4496 m 5851 4800 l gs col0 s gr gr % arrowhead n 5880 4680 m 5851 4800 l 5820 4680 l 5850 4680 l 5880 4680 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 5880 5355 m 5851 5475 l 5820 5355 l 5821 5490 l 5881 5490 l cp clip n 5849 5171 m 5851 5475 l gs col0 s gr gr % arrowhead n 5880 5355 m 5851 5475 l 5820 5355 l 5850 5355 l 5880 5355 l cp gs 0.00 setgray ef gr col0 s % Polyline n 5100 5475 m 6600 5475 l 6600 6000 l 5100 6000 l cp gs col0 s gr % Polyline gs clippath 3534 8355 m 3414 8325 l 3534 8295 l 3399 8295 l 3399 8355 l cp clip n 4950 8325 m 3414 8325 l gs col0 s gr gr % arrowhead n 3534 8355 m 3414 8325 l 3534 8295 l 3534 8325 l 3534 8355 l cp gs 0.00 setgray ef gr col0 s /Courier-Bold-iso ff 180.00 scf sf 3375 1275 m gs 1 -1 sc (pl2wam) dup sw pop neg 0 rm col0 sh gr /Courier-Bold-iso ff 180.00 scf sf 3352 2775 m gs 1 -1 sc (wam2ma) dup sw pop neg 0 rm col0 sh gr /Courier-Bold-iso ff 180.00 scf sf 2700 4257 m gs 1 -1 sc (ma2asm) col0 sh gr /Courier-Bold-iso ff 180.00 scf sf 2700 7518 m gs 1 -1 sc (linker) col0 sh gr /Courier-Bold-iso ff 180.00 scf sf 5640 4275 m gs 1 -1 sc (fd2c) col0 sh gr /Times-Roman-iso ff 180.00 scf sf 6600 4950 m gs 1 -1 sc (C files) col0 sh gr /Courier-Bold-iso ff 180.00 scf sf 5325 5775 m gs 1 -1 sc (C compiler) col0 sh gr /Courier-Bold-iso ff 180.00 scf sf 2564 5775 m gs 1 -1 sc (assembler) col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 8400 m gs 1 -1 sc (executable) dup sw pop neg 0 rm col0 sh gr % Polyline n 2587 646 m 2587 300 l 3418 300 l 3418 577 l gs col-1 s gr % Polyline n 3418 577 m 3415 576 l 3410 574 l 3400 570 l 3386 566 l 3368 560 l 3349 554 l 3328 548 l 3307 543 l 3286 539 l 3267 537 l 3248 536 l 3229 538 l 3210 542 l 3194 547 l 3177 553 l 3160 560 l 3141 569 l 3122 580 l 3102 591 l 3082 604 l 3061 617 l 3040 631 l 3019 644 l 2998 657 l 2978 670 l 2957 681 l 2938 691 l 2918 700 l 2900 707 l 2882 712 l 2864 716 l 2845 718 l 2825 719 l 2805 717 l 2783 713 l 2760 708 l 2736 701 l 2710 693 l 2685 684 l 2661 675 l 2639 667 l 2620 659 l 2605 653 l 2595 649 l 2590 647 l 2587 646 l gs col-1 s gr % Polyline n 2587 2146 m 2587 1800 l 3418 1800 l 3418 2077 l gs col-1 s gr % Polyline n 3418 2077 m 3415 2076 l 3410 2074 l 3400 2070 l 3386 2066 l 3368 2060 l 3349 2054 l 3328 2048 l 3307 2043 l 3286 2039 l 3267 2037 l 3248 2036 l 3229 2038 l 3210 2042 l 3194 2047 l 3177 2053 l 3160 2060 l 3141 2069 l 3122 2080 l 3102 2091 l 3082 2104 l 3061 2117 l 3040 2131 l 3019 2144 l 2998 2157 l 2978 2170 l 2957 2181 l 2938 2191 l 2918 2200 l 2900 2207 l 2882 2212 l 2864 2216 l 2845 2218 l 2825 2219 l 2805 2217 l 2783 2213 l 2760 2208 l 2736 2201 l 2710 2193 l 2685 2184 l 2661 2175 l 2639 2167 l 2620 2159 l 2605 2153 l 2595 2149 l 2590 2147 l 2587 2146 l gs col-1 s gr % Polyline n 2587 3646 m 2587 3300 l 3418 3300 l 3418 3577 l gs col-1 s gr % Polyline n 3418 3577 m 3415 3576 l 3410 3574 l 3400 3570 l 3386 3566 l 3368 3560 l 3349 3554 l 3328 3548 l 3307 3543 l 3286 3539 l 3267 3537 l 3248 3536 l 3229 3538 l 3210 3542 l 3194 3547 l 3177 3553 l 3160 3560 l 3141 3569 l 3122 3580 l 3102 3591 l 3082 3604 l 3061 3617 l 3040 3631 l 3019 3644 l 2998 3657 l 2978 3670 l 2957 3681 l 2938 3691 l 2918 3700 l 2900 3707 l 2882 3712 l 2864 3716 l 2845 3718 l 2825 3719 l 2805 3717 l 2783 3713 l 2760 3708 l 2736 3701 l 2710 3693 l 2685 3684 l 2661 3675 l 2639 3667 l 2620 3659 l 2605 3653 l 2595 3649 l 2590 3647 l 2587 3646 l gs col-1 s gr % Polyline n 2587 5146 m 2587 4800 l 3418 4800 l 3418 5077 l gs col-1 s gr % Polyline n 3418 5077 m 3415 5076 l 3410 5074 l 3400 5070 l 3386 5066 l 3368 5060 l 3349 5054 l 3328 5048 l 3307 5043 l 3286 5039 l 3267 5037 l 3248 5036 l 3229 5038 l 3210 5042 l 3194 5047 l 3177 5053 l 3160 5060 l 3141 5069 l 3122 5080 l 3102 5091 l 3082 5104 l 3061 5117 l 3040 5131 l 3019 5144 l 2998 5157 l 2978 5170 l 2957 5181 l 2938 5191 l 2918 5200 l 2900 5207 l 2882 5212 l 2864 5216 l 2845 5218 l 2825 5219 l 2805 5217 l 2783 5213 l 2760 5208 l 2736 5201 l 2710 5193 l 2685 5184 l 2661 5175 l 2639 5167 l 2620 5159 l 2605 5153 l 2595 5149 l 2590 5147 l 2587 5146 l gs col-1 s gr % Arc gs n 3019.5 6181.0 678.0 118.1 61.9 arcn gs col-1 s gr gr % Arc gs n 3019.5 5821.0 678.0 118.1 61.9 arcn gs col-1 s gr gr % Arc gs n 3019.5 7017.0 678.0 -61.9 -118.1 arcn gs col-1 s gr gr % Polyline n 3339 6779 m 3339 6419 l gs col-1 s gr % Polyline n 2700 6419 m 2700 6779 l gs col-1 s gr % Arc gs n 3019.5 7907.0 678.0 118.1 61.9 arcn gs col-1 s gr gr % Arc gs n 3019.5 7547.0 678.0 118.1 61.9 arcn gs col-1 s gr gr % Arc gs n 3019.5 8743.0 678.0 -61.9 -118.1 arcn gs col-1 s gr gr % Polyline n 3339 8505 m 3339 8145 l gs col-1 s gr % Polyline n 2700 8145 m 2700 8505 l gs col-1 s gr % Polyline n 5426 3646 m 5426 3300 l 6257 3300 l 6257 3577 l gs col-1 s gr % Polyline n 6257 3577 m 6254 3576 l 6249 3574 l 6239 3570 l 6225 3566 l 6207 3560 l 6188 3554 l 6167 3548 l 6146 3543 l 6125 3539 l 6106 3537 l 6087 3536 l 6068 3538 l 6049 3542 l 6033 3547 l 6016 3553 l 5999 3560 l 5980 3569 l 5961 3580 l 5941 3591 l 5921 3604 l 5900 3617 l 5879 3631 l 5858 3644 l 5837 3657 l 5817 3670 l 5796 3681 l 5777 3691 l 5757 3700 l 5739 3707 l 5721 3712 l 5703 3716 l 5684 3718 l 5664 3719 l 5644 3717 l 5622 3713 l 5599 3708 l 5575 3701 l 5549 3693 l 5524 3684 l 5500 3675 l 5478 3667 l 5459 3659 l 5444 3653 l 5434 3649 l 5429 3647 l 5426 3646 l gs col-1 s gr % Polyline n 5426 5146 m 5426 4800 l 6257 4800 l 6257 5077 l gs col-1 s gr % Polyline n 6257 5077 m 6254 5076 l 6249 5074 l 6239 5070 l 6225 5066 l 6207 5060 l 6188 5054 l 6167 5048 l 6146 5043 l 6125 5039 l 6106 5037 l 6087 5036 l 6068 5038 l 6049 5042 l 6033 5047 l 6016 5053 l 5999 5060 l 5980 5069 l 5961 5080 l 5941 5091 l 5921 5104 l 5900 5117 l 5879 5131 l 5858 5144 l 5837 5157 l 5817 5170 l 5796 5181 l 5777 5191 l 5757 5200 l 5739 5207 l 5721 5212 l 5703 5216 l 5684 5218 l 5664 5219 l 5644 5217 l 5622 5213 l 5599 5208 l 5575 5201 l 5549 5193 l 5524 5184 l 5500 5175 l 5478 5167 l 5459 5159 l 5444 5153 l 5434 5149 l 5429 5147 l 5426 5146 l gs col-1 s gr % Arc gs n 5325.5 7907.0 678.0 118.1 61.9 arcn gs col-1 s gr gr % Arc gs n 5325.5 7547.0 678.0 118.1 61.9 arcn gs col-1 s gr gr % Arc gs n 5325.5 8743.0 678.0 -61.9 -118.1 arcn gs col-1 s gr gr % Polyline n 5645 8505 m 5645 8145 l gs col-1 s gr % Polyline n 5006 8145 m 5006 8505 l gs col-1 s gr $F2psEnd rs %%EndDocument @endspecial 1609 1826 V 220 1828 1391 2 v -30 1913 a(Ob)o(viously)14 b(all)g(in)o(termediate)h(stages)g(are)g(hidden)g(to)f(the)i(user)f (who)g(simply)e(in)o(v)o(ok)o(es)h(the)i(compiler)e(on)g(his)h(Prolog) -30 1963 y(\014le\(s\))21 b(\(plus)f(other)g(\014les:)31 b(C,.)6 b(.)g(.)h(\))36 b(and)20 b(obtains)f(an)h(executable.)37 b(Ho)o(w)o(ev)o(er,)21 b(it)f(is)f(also)h(p)q(ossible)g(to)f(stop)i (the)-30 2012 y(compiler)15 b(at)g(an)o(y)f(giv)o(en)h(stage.)21 b(This)15 b(can)h(b)q(e)f(useful,)g(for)g(instance,)g(to)g(see)h(the)g (W)-5 b(AM)15 b(co)q(de)h(pro)q(duced)g(\(p)q(erhaps)-30 2062 y(when)f(learning)f(the)h(W)-5 b(AM\).)14 b(Finally)f(it)h(is)g(p) q(ossible)h(to)f(giv)o(e)g(an)o(y)g(kind)g(of)g(\014le)g(to)g(the)h (compiler)f(whic)o(h)h(will)d(insert)-30 2112 y(it)i(in)f(the)i (compilation)d(c)o(hain)h(at)h(the)g(stage)g(corresp)q(onding)h(to)f (its)f(t)o(yp)q(e.)19 b(The)14 b(t)o(yp)q(e)h(of)e(a)g(\014le)h(is)g (determined)g(using)-30 2162 y(the)h(su\016x)f(of)f(its)h(\014le)g (name.)k(The)c(follo)o(wing)d(table)j(presen)o(ts)i(all)d(recognized)i (t)o(yp)q(es/su\016xes:)p -30 2228 1806 2 v -30 2278 2 50 v -3 2263 a(Su\016x)f(of)f(the)h(\014le)p 654 2278 V 395 w(T)o(yp)q(e)g(of)g(the)g(\014le)p 1358 2278 V 426 w(Handled)g(b)o(y:)p 1774 2278 V -30 2279 1806 2 v -30 2289 V -30 2339 2 50 v -3 2324 a Fh(.pl)p Fm(,)f Fh(.pro)p 654 2339 V 504 w Fm(Prolog)g(source)i(\014le)p 1358 2339 V 393 w Fh(pl2wam)p 1774 2339 V -30 2341 1806 2 v -30 2391 2 50 v -3 2376 a(.wam)p 654 2391 V 595 w Fm(W)-5 b(AM)14 b(source)h(\014le)p 1358 2391 V 404 w Fh(wam2ma)p 1774 2391 V -30 2392 1806 2 v -30 2442 2 50 v -3 2427 a(.ma)p 654 2442 V 617 w Fm(Mini-assem)o(bly)e(source)i (\014le)p 1358 2442 V 251 w Fh(ma2asm)p 1774 2442 V -30 2444 1806 2 v -30 2494 2 50 v -3 2479 a(.s)p 654 2494 V 639 w Fm(Assem)o(bly)f(source)h(\014le)p 1358 2494 V 339 w(the)f(assem)o(bler)p 1774 2494 V -30 2495 1806 2 v -30 2545 2 50 v -3 2530 a Fh(.c)p Fm(,)f Fh(.C)p Fm(,)g Fh(.CC)p Fm(,)g Fh(.cc)p Fm(,)f Fh(.cxx)p Fm(,)h Fh(.c++)p Fm(,)g Fh(.cpp)p 654 2545 V 50 w Fm(C)h(or)g(C++)g(source)h (\014le)p 1358 2545 V 322 w(the)f(C)g(compiler)p 1774 2545 V -30 2547 1806 2 v -30 2597 2 50 v -3 2582 a Fh(.fd)p 654 2597 V 617 w Fm(Finite)g(Domain)e(constrain)o(t)i(source)h(\014le)p 1358 2597 V 52 w Fh(fd2c)p 1774 2597 V -30 2598 1806 2 v -30 2648 2 50 v -3 2633 a Fm(an)o(y)e(other)i(su\016x)f(\()p Fh(.o)p Fm(,)f Fh(.a)p Fm(,.)5 b(.)i(.)f(\))p 654 2648 V 175 w(an)o(y)14 b(other)g(t)o(yp)q(e)g(\(ob)r(ject,)h(library)m(,.)5 b(.)h(.)h(\))p 1358 2648 V 70 w(the)14 b(link)o(er)g(\(C)g(link)o(er\)) p 1774 2648 V -30 2650 1806 2 v -30 2732 a Fi(Byte-co)q(de)i (compilation)p Fm(:)i(the)d(same)f(compiler)g(can)h(b)q(e)g(used)g(to)f (compile)f(a)h(source)i(Prolog)d(\014le)i(for)f(b)o(yte-co)q(de.)-30 2782 y(In)j(that)f(case)i(the)f(Prolog)f(to)g(W)-5 b(AM)17 b(compiler)f(is)g(in)o(v)o(ok)o(ed)f(using)i(a)f(sp)q(eci\014c)i (option)d(and)i(pro)q(duces)h(a)e(W)-5 b(AM)17 b(for)-30 2832 y(b)o(yte-co)q(de)h(source)h(\014le)d(\(su\016xed)i Fh(.wbc)p Fm(\))e(that)h(can)g(b)q(e)g(later)g(loaded)g(using)g Fh(load/1)f Fm(\(section)h(7.23.2,)e(page)i(137\).)-30 2882 y(Note)11 b(that)g(this)f(is)h(exactly)f(what)g Fh(consult/1)f Fm(\(section)i(7.23.1,)e(page)h(136\))g(do)q(es)h(as)g (explained)f(ab)q(o)o(v)o(e)g(\(section)h(3.2.3,)p eop end %%Page: 22 24 TeXDict begin 22 23 bop -30 -45 a Fm(22)1350 b(3)41 b(USING)14 b(GNU)f(PR)o(OLOG)p -30 -27 1890 4 v -30 115 a(page)h(16\).)-30 270 y Fi(3.4.3)48 b(Using)15 b(the)g(compiler)-30 397 y Fm(The)i(GNU)f(Prolog)f(compiler)h(is)g(a)g(command-line)e(compiler)i (similar)e(in)i(spirit)g(to)g(a)g(Unix)f(C)h(compiler)g(lik)o(e)f Fh(gcc)p Fm(.)-30 446 y(T)m(o)f(in)o(v)o(ok)o(e)f(the)h(compiler)g(use) g(the)h Fh(gplc)e Fm(command)g(as)h(follo)o(ws:)74 519 y Fh(\045)22 b(gplc)f Fm([)p Fd(OPTION)5 b Fm(].)h(.)h(.)28 b Fd(FILE)6 b Fm(.)h(.)f(.)116 b(\(the)14 b Fh(\045)g Fm(sym)o(b)q(ol)f(is)h(the)g(op)q(erating)g(system)h(shell)f(prompt\)) -30 591 y(The)i(argumen)o(ts)f(of)j Fh(gplc)c Fm(are)i(\014le)f(names)g (that)g(are)h(dispatc)o(hed)f(in)g(the)h(compilation)d(sc)o(heme)j(dep) q(ending)g(on)f(the)-30 640 y(t)o(yp)q(e)e(determined)g(from)f(their)h (su\016x)f(as)g(w)o(as)g(explained)g(previously)g(\(section)h(3.4.2,)e (page)h(20\).)17 b(All)11 b(ob)r(ject)i(\014les)g(are)-30 690 y(then)g(link)o(ed)e(to)h(pro)q(duce)h(an)f(executable.)19 b(Note)12 b(ho)o(w)o(ev)o(er)g(that)g(GNU)g(Prolog)f(has)h(no)g(mo)q (dule)g(facilit)o(y)e(\(since)j(there)-30 740 y(is)j(not)f(y)o(et)h(an) f(ISO)h(reference)i(for)d(Prolog)f(mo)q(dules\))i(th)o(us)g(a)f (predicate)h(de\014ned)h(in)e(a)g(Prolog)g(\014le)g(is)g(visible)g (from)-30 790 y(an)o(y)h(other)h(predicate)g(de\014ned)g(in)f(an)o(y)g (other)h(\014le.)24 b(GNU)16 b(Prolog)g(allo)o(ws)e(the)j(user)g(to)f (split)g(a)g(big)f(Prolog)h(source)-30 840 y(in)o(to)e(sev)o(eral)g (\014les)g(but)g(do)q(es)h(not)f(o\013er)g(an)o(y)g(w)o(a)o(y)f(to)h (hide)g(a)f(predicate)i(from)e(others.)-30 939 y(The)i(simplest)f(w)o (a)o(y)f(to)h(obtain)f(an)g(executable)j(from)d(a)g(Prolog)g(source)j (\014le)d Fh(prog.pl)g Fm(is)h(to)f(use:)74 1011 y Fh(\045)22 b(gplc)f(prog.pl)-30 1083 y Fm(This)14 b(will)f(pro)q(duce)i(an)e (nativ)o(e)h(executable)h(called)f Fh(prog)f Fm(whic)o(h)g(can)i(b)q(e) f(executed)i(as)e(follo)o(ws:)74 1155 y Fh(\045)22 b(prog)-30 1228 y Fm(Ho)o(w)o(ev)o(er,)14 b(there)i(are)e(sev)o(eral)g(options)g (that)g(can)g(b)q(e)g(used)h(to)f(con)o(trol)f(the)i(compilation:)-30 1327 y Fi(General)g(options)p Fm(:)-5 1424 y Fh(-o)f Fd(FILE)6 b Fm(,)14 b Fh(--output)e Fd(FILE)128 b Fm(use)14 b Fd(FILE)21 b Fm(as)14 b(the)g(name)g(of)f(the)i(output)f(\014le)-5 1474 y Fh(-W)p Fm(,)f Fh(--wam-for-native)161 b Fm(stop)14 b(after)g(pro)q(ducing)g(W)-5 b(AM)14 b(\014les\(s\))-5 1524 y Fh(-w)p Fm(,)f Fh(--wam-for-byte-code)95 b Fm(stop)14 b(after)g(pro)q(ducing)g(W)-5 b(AM)14 b(for)g(b)o(yte-co)q(de)h (\014le\(s\))f(\(force)h Fh(--no-call-c)p Fm(\))-5 1574 y Fh(-M)p Fm(,)e Fh(--mini-assembly)183 b Fm(stop)14 b(after)g(pro)q(ducing)g(mini-assem)o(bly)e(\014les\(s\))-5 1623 y Fh(-S)p Fm(,)h Fh(--assembly)293 b Fm(stop)14 b(after)g(pro)q(ducing)g(assem)o(bly)g(\014les)g(\(s\))-5 1673 y Fh(-F)p Fm(,)f Fh(--fd-to-c)315 b Fm(stop)14 b(after)g(pro)q (ducing)g(C)g(\014les\(s\))h(from)e(FD)g(constrain)o(t)i(de\014nition)e (\014le\(s\))-5 1723 y Fh(-c)p Fm(,)g Fh(--object)337 b Fm(stop)14 b(after)g(pro)q(ducing)g(ob)r(ject)h(\014les\(s\))-5 1773 y Fh(--temp-dir)d Fd(PATH)262 b Fm(use)14 b Fd(PATH)21 b Fm(as)14 b(directory)g(for)g(temp)q(orary)g(\014les)-5 1823 y Fh(--no-del-temp)296 b Fm(do)13 b(not)h(delete)h(temp)q(orary)f (\014les)-5 1872 y Fh(--no-decode-hexa)230 b Fm(do)13 b(not)h(deco)q(de)h(hexadecimal)f(predicate)h(names)-5 1922 y Fh(-v)p Fm(,)e Fh(--verbose)315 b Fm(prin)o(t)13 b(executed)j(commands)-5 1972 y Fh(-h)p Fm(,)d Fh(--help)381 b Fm(prin)o(t)13 b(a)h(help)g(and)g(exit)-5 2022 y Fh(--version)384 b Fm(prin)o(t)13 b(v)o(ersion)h(n)o(um)o(b)q(er)h(and)e(exit)-30 2120 y Fi(Prolog)j(to)f(W)-5 b(AM)16 b(compiler)g(options)p Fm(:)-5 2216 y Fh(--pl-state)c Fd(FILE)262 b Fm(read)14 b Fd(FILE)20 b Fm(to)14 b(set)h(the)f(initial)e(Prolog)h(state)-5 2266 y Fh(--no-susp-warn)274 b Fm(do)13 b(not)h(sho)o(w)g(w)o(arnings)f (for)h(suspicious)g(predicates)-5 2316 y Fh(--no-singl-warn)252 b Fm(do)13 b(not)h(sho)o(w)g(w)o(arnings)f(for)h(named)g(singleton)f(v) n(ariables)-5 2366 y Fh(--no-redef-error)230 b Fm(no)13 b(not)h(sho)o(w)g(errors)h(for)f(built-in)e(predicate)j (rede\014nitions)-5 2416 y Fh(--foreign-only)274 b Fm(only)13 b(compile)g Fh(foreign/1-2)f Fm(directiv)o(es)-5 2466 y Fh(--no-call-c)340 b Fm(do)13 b(not)h(allo)o(w)e(the)j(use)g(of)h Fh(fd)p 1056 2466 14 2 v 15 w(tell)p Fm(,)d Fh('$call)p 1316 2466 V 14 w(c)p Fm(',.)6 b(.)g(.)-5 2515 y Fh(--no-inline)340 b Fm(do)13 b(not)h(inline)f(predicates)-5 2565 y Fh(--no-reorder)318 b Fm(do)13 b(not)h(reorder)h(predicate)g(argumen)o(ts)-5 2615 y Fh(--no-reg-opt)318 b Fm(do)13 b(not)h(optimize)f(registers)-5 2665 y Fh(--min-reg-opt)296 b Fm(minimally)11 b(optimize)i(registers)-5 2715 y Fh(--no-opt-last-subte)o(rm)121 b Fm(do)13 b(not)h(optimize)f (last)h(subterm)h(compilation)-5 2764 y Fh(--fast-math)340 b Fm(use)14 b(fast)g(mathematical)f(mo)q(de)h(\(assume)g(in)o(teger)h (arithmetics\))-5 2814 y Fh(--keep-void-inst)230 b Fm(k)o(eep)14 b(v)o(oid)f(W)-5 b(AM)14 b(instructions)h(in)e(the)i(output)f(\014le)-5 2864 y Fh(--compile-msg)296 b Fm(prin)o(t)13 b(a)h(compile)f(message)-5 2914 y Fh(--statistics)318 b Fm(prin)o(t)13 b(statistics)i(information) p eop end %%Page: 23 25 TeXDict begin 23 24 bop -30 -45 a Fm(3.4)41 b(The)14 b(GNU)g(Prolog)f(compiler)1273 b(23)p -30 -27 1890 4 v -30 115 a Fi(W)-5 b(AM)17 b(to)e(mini-assem)o(bly)g(translator)f (options)p Fm(:)-5 215 y Fh(--comment)384 b Fm(include)14 b(commen)o(ts)g(in)f(the)i(output)f(\014le)-30 314 y Fi(Mini-assem)o(bly)i(to)f(assem)o(bly)g(translator)g(options)p Fm(:)-5 414 y Fh(--comment)384 b Fm(include)14 b(commen)o(ts)g(in)f (the)i(output)f(\014le)-30 513 y Fi(C)j(compiler)e(options)p Fm(:)-5 610 y Fh(--c-compiler)d Fd(FILE)218 b Fm(use)14 b Fd(FILE)21 b Fm(as)14 b(C)f(compiler)-5 660 y Fh(-C)h Fd(OPTION)392 b Fm(pass)14 b Fd(OPTION)20 b Fm(to)14 b(the)g(C)g(compiler)-30 758 y Fi(Assem)o(bler)h(options)p Fm(:)-5 857 y Fh(-A)f Fd(OPTION)392 b Fm(pass)14 b Fd(OPTION)20 b Fm(to)14 b(the)g(assem)o(bler)-30 957 y Fi(Link)o(er)h(options)p Fm(:)-5 1054 y Fh(--local-size)d Fd(N)284 b Fm(set)14 b(default)g(lo)q(cal)f(stac)o(k)h(size)h(to)f Fd(N)21 b Fm(Kb)-5 1104 y Fh(--global-size)12 b Fd(N)262 b Fm(set)14 b(default)g(global)e(stac)o(k)j(size)f(to)g Fd(N)21 b Fm(Kb)-5 1154 y Fh(--trail-size)12 b Fd(N)284 b Fm(set)14 b(default)g(trail)f(stac)o(k)h(size)h(to)f Fd(N)21 b Fm(Kb)-5 1203 y Fh(--cstr-size)12 b Fd(N)306 b Fm(set)14 b(default)g(constrain)o(t)g(stac)o(k)h(size)f(to)g Fd(N)21 b Fm(Kb)-5 1253 y Fh(--fixed-sizes)296 b Fm(do)13 b(not)h(consult)g(en) o(vironmen)o(t)g(v)n(ariables)f(at)h(run-time)g(\(use)h(default)e (sizes\))-5 1303 y Fh(--no-top-level)274 b Fm(do)13 b(not)h(link)f(the) i(top-lev)o(el)e(\(force)h Fh(--no-debugger)p Fm(\))-5 1353 y Fh(--no-debugger)296 b Fm(do)13 b(not)h(link)f(the)i(Prolog/W)-5 b(AM)13 b(debugger)-5 1403 y Fh(--min-pl-bips)296 b Fm(link)13 b(only)g(used)h(Prolog)g(built-in)e(predicates)-5 1453 y Fh(--min-fd-bips)296 b Fm(link)13 b(only)g(used)h(FD)g(solv)o(er)g (built-in)f(predicates)-5 1502 y Fh(--min-bips)362 b Fm(shorthand)14 b(for:)k Fh(--no-top-level)11 b(--min-pl-bips)g (--min-fd-bips)-5 1552 y(--min-size)362 b Fm(shorthand)14 b(for:)k Fh(--min-bips)12 b(--strip)-5 1602 y(--no-fd-lib)340 b Fm(do)13 b(not)h(lo)q(ok)f(for)h(the)g(FD)g(library)f(\(main)o (tenance)h(only\))-5 1652 y Fh(-s)p Fm(,)f Fh(--strip)359 b Fm(strip)14 b(the)g(executable)-5 1702 y Fh(-L)g Fd(OPTION)392 b Fm(P)o(ass)14 b Fd(OPTION)20 b Fm(to)14 b(the)g(link)o(er)-30 1799 y(It)g(is)g(p)q(ossible)g(to)g(only)f(giv)o(e)g(the)i(pre\014x)g (of)e(an)g(option)h(if)f(there)i(is)f(no)f(am)o(biguit)o(y)m(.)-30 1899 y(The)h(name)e(of)h(the)g(output)g(\014le)g(is)g(con)o(trolled)f (via)g(the)i Fh(-o)e Fd(FILE)19 b Fm(option.)e(If)c(presen)o(t)h(the)g (output)f(\014le)g(pro)q(duced)h(will)-30 1949 y(b)q(e)g(named)e Fd(FILE)7 b Fm(.)12 b(If)g(not)h(sp)q(eci\014ed,)h(the)f(output)g (\014le)g(name)f(dep)q(ends)j(on)d(the)i(last)e(stage)h(reac)o(hed)h(b) o(y)f(the)g(compiler.)-30 1999 y(If)j(the)h(link)e(is)h(not)g(done)g (the)h(output)f(\014le)g(name\(s\))h(is)f(the)h(input)f(\014le)g (name\(s\))g(with)g(the)h(su\016x)f(asso)q(ciated)h(with)-30 2048 y(the)d(last)f(stage.)19 b(If)12 b(the)i(link)e(is)i(done,)f(the)h (name)f(of)f(the)i(executable)g(is)g(the)f(name)g(\(without)g (su\016x\))h(of)e(the)i(\014rst)g(\014le)-30 2098 y(name)f(encoun)o (tered)i(in)d(the)h(command-line.)k(Note)c(that)g(if)f(the)h(link)f(is) g(not)h(done)g Fh(-o)f Fm(has)h(no)g(sense)h(in)e(the)i(presence)-30 2148 y(of)j(m)o(ultiple)f(input)h(\014le)g(names.)28 b(F)m(or)16 b(this)i(reason,)g(sev)o(eral)f(meta)g(c)o(haracters)i(are) f(a)o(v)n(ailable)d(for)h(substitution)i(in)-30 2198 y Fd(FILE)7 b Fm(:)33 2270 y Fg(\017)20 b Fh(\045f)14 b Fm(is)f(substitued)j(b)o(y)d(the)i(whole)e(input)h(\014le)g(name.)33 2348 y Fg(\017)20 b Fh(\045F)14 b Fm(is)f(similar)g(to)h Fh(\045f)f Fm(but)h(the)h(directory)f(part)g(is)g(omitted.)33 2425 y Fg(\017)20 b Fh(\045p)14 b Fm(is)f(substitued)j(b)o(y)d(the)i (whole)e(pre\014x)i(\014le)f(name)f(\(omitting)g(the)h(su\016x\).)33 2503 y Fg(\017)20 b Fh(\045P)14 b Fm(is)f(similar)g(to)h Fh(\045p)f Fm(but)h(the)h(directory)f(part)g(is)g(omitted.)33 2581 y Fg(\017)20 b Fh(\045s)14 b Fm(is)f(substitued)j(b)o(y)d(the)i (\014le)f(su\016x)f(\(including)g(the)i(dot\).)33 2658 y Fg(\017)20 b Fh(\045d)14 b Fm(is)f(substitued)j(b)o(y)d(the)i (directory)f(part)g(\(empt)o(y)g(if)f(no)h(directory)h(is)e(sp)q (eci\014ed\).)33 2736 y Fg(\017)20 b Fh(\045c)14 b Fm(is)f(substitued)j (b)o(y)d(the)i(v)n(alue)e(of)g(an)h(in)o(ternal)f(coun)o(ter)i (starting)f(from)f(1)h(and)f(auto-incremen)o(ted.)-30 2808 y(By)e(default)e(the)i(compiler)f(runs)g(in)g(the)h(nativ)o(e-co)q (de)f(compilation)e(sc)o(heme.)18 b(T)m(o)9 b(generate)j(a)d(W)-5 b(AM)10 b(\014le)g(for)g(b)o(yte-co)q(de)-30 2858 y(use)j(the)e Fh(--wam-for-byte-code)d Fm(option.)16 b(The)c(resulting)f(\014le)h (can)f(then)h(b)q(e)g(loaded)f(using)g Fh(load/1)f Fm(\(section)j (7.23.2,)-30 2908 y(page)h(137\).)p eop end %%Page: 24 26 TeXDict begin 24 25 bop -30 -45 a Fm(24)1350 b(3)41 b(USING)14 b(GNU)f(PR)o(OLOG)p -30 -27 1890 4 v -30 115 a(T)m(o)k(execute)i(the)f (Prolog)f(to)g(W)-5 b(AM)18 b(compiler)f(in)g(a)g(giv)o(en)g Fe(r)n(e)n(ad)g(envir)n(onment)22 b Fm(\(op)q(erator)c(de\014nitions,)g (c)o(haracter)-30 165 y(con)o(v)o(ersion)10 b(table,.)c(.)h(.)f(\))17 b(use)11 b Fh(--pl-state)c Fd(FILE)g Fm(.)i(The)h(state)h(\014le)e (should)h(b)q(e)g(pro)q(duced)h(b)o(y)f Fh(write)p 1534 165 14 2 v 15 w(pl)p 1593 165 V 15 w(state)p 1718 165 V 14 w(file/1)-30 215 y Fm(\(section)15 b(7.22.5,)d(page)i(136\).)-30 314 y(By)e(default)f(the)h(Prolog)f(to)g(W)-5 b(AM)12 b(compiler)f(inlines)g(calls)g(to)g(some)h(deterministic)g(built-in)e (predicates)j(\(e.g.)k Fh(arg/3)-30 364 y Fm(and)e Fh(functor/3)p Fm(\).)k(Namely)14 b(a)g(call)g(to)g(suc)o(h)i(a)e(predicate)i(will)d (not)i(yield)f(a)g(classical)h(predicate)h(call)d(but)i(a)g(simple)-30 414 y(C)f(function)g(call)f(\(whic)o(h)h(is)g(ob)o(viously)e(faster\).) 19 b(It)14 b(is)g(p)q(ossible)g(to)g(a)o(v)o(oid)e(this)i(using)g Fh(--no-inline)p Fm(.)-30 513 y(Another)d(optimization)d(p)q(erformed)j (b)o(y)e(the)h(Prolog)g(to)f(W)-5 b(AM)10 b(compiler)f(is)h (uni\014cation)f(reordering.)18 b(The)10 b(argumen)o(ts)-30 563 y(of)k(a)h(predicate)h(are)f(reordered)h(to)f(optimize)f (uni\014cation.)19 b(This)c(can)g(b)q(e)g(deactiv)n(ated)g(using)g Fh(--no-reorder)p Fm(.)j(The)-30 613 y(compiler)c(also)g(optimizes)f (the)i(uni\014cation/loading)d(of)h(nested)j(comp)q(ound)e(terms.)19 b(More)c(precisely)m(,)f(the)h(compiler)-30 663 y(emits)f(optimized)g (instructions)h(when)f(the)h(last)e(subterm)i(of)f(a)f(comp)q(ound)h (term)g(is)g(itself)g(a)g(comp)q(ound)f(term)i(\(e.g.)-30 713 y(lists\).)k(This)13 b(can)h(b)q(e)h(deactiv)n(ated)f(using)g Fh(--no-opt-last-subte)o(rm)p Fm(.)-30 812 y(By)i(default)e(the)i (Prolog)e(to)h(W)-5 b(AM)15 b(compiler)g(fully)f(optimizes)g(the)i (allo)q(cation)d(of)i(registers)h(to)f(decrease)i(b)q(oth)f(the)-30 862 y(n)o(um)o(b)q(er)e(of)f(instruction)h(pro)q(duced)g(and)g(the)g(n) o(um)o(b)q(er)f(of)g(used)i(registers.)k(A)14 b(go)q(o)q(d)f(allo)q (cation)e(will)h(generate)j(man)o(y)-30 912 y Fe(void)i(instructions)h Fm(that)d(are)h(remo)o(v)o(ed)f(from)g(the)h(pro)q(duced)g(\014le)f (except)i(if)h Fh(--keep-void-ins)o(t)12 b Fm(is)j(sp)q(eci\014ed.)24 b(T)m(o)-30 962 y(prev)o(en)o(t)17 b(an)o(y)f(optimization)e(use)j Fh(--no-reg-opt)d Fm(while)h Fh(--min-reg-opt)f Fm(forces)j(the)f (compiler)g(to)g(only)f(p)q(erform)-30 1012 y(simple)f(register)h (optimizations.)-30 1111 y(The)e(Prolog)e(to)h(W)-5 b(AM)12 b(compiler)f(emits)h(an)g(error)h(when)f(a)g(con)o(trol)f(construct)j (or)e(a)f(built-in)g(predicate)i(is)f(rede\014ned.)-30 1161 y(This)g(can)h(b)q(e)f(a)o(v)o(oided)f(using)i Fh (--no-redef-error)o Fm(.)i(The)d(compiler)g(also)f(emits)h(w)o(arnings) g(for)g(suspicious)g(predicate)-30 1211 y(de\014nitions)j(lik)o(e)f Fh(-/2)g Fm(since)i(this)f(often)f(corresp)q(onds)j(to)e(an)f(earlier)h (syn)o(tax)g(error)h(\(e.g.)k Fh(-)15 b Fm(instead)g(of)p 1657 1211 V 33 w(.)20 b(This)15 b(can)-30 1261 y(b)q(e)f(deactiv)n (ated)f(b)o(y)f(sp)q(ecifying)h Fh(--no-susp-warn)p Fm(.)i(Finally)m(,) 10 b(the)j(compiler)f(w)o(arns)h(when)g(a)f(singleton)h(v)n(ariable)e (has)-30 1310 y(a)j(name)g(\(i.e.)j(not)d(the)h(generic)f(anon)o(ymous) f(name)p 820 1310 V 30 w(\).)18 b(This)c(can)g(b)q(e)g(deactiv)n(ated)h (sp)q(ecifying)f Fh(--no-singl-warn)p Fm(.)-30 1410 y(Predicate)i (names)e(are)g(enco)q(ded)h(with)e(an)h(hexadecimal)f(represen)o (tation.)20 b(This)14 b(is)f(explained)h(in)f(more)h(detail)f(later)-30 1460 y(\(section)f(3.4.6,)d(page)h(26\).)17 b(By)11 b(default)f(the)h (error)g(messages)h(from)e(the)h(link)o(er)f(\(e.g.)17 b(m)o(ultiple)9 b(de\014nitions)h(for)g(a)h(giv)o(en)-30 1510 y(predicate,)j(reference)h(to)d(an)h(unde\014ned)g(predicate,.)7 b(.)g(.)f(\))18 b(are)13 b(\014ltered)h(to)e(replace)i(an)o(y)e (hexadecimal)g(represen)o(tation)-30 1559 y(b)o(y)h(the)g(real)f (predicate)i(name.)j(Sp)q(ecifying)12 b(the)h Fh(--no-decode-hexa)d Fm(prev)o(en)o(ts)j Fh(gplc)f Fm(from)g(\014ltering)g(link)o(er)g (output)-30 1609 y(messages)j(and)f(hexadecimal)g(represen)o(tations)h (are)g(then)f(sho)o(wn.)-30 1709 y(When)j(pro)q(ducing)f(an)g (executable)i(it)e(is)g(p)q(ossible)g(to)g(sp)q(ecify)h(default)f(stac) o(k)g(sizes)i(\(using)f Fh(--)p Fd(STACK)p 1630 1709 V 14 w(NAME)6 b Fh(-size)p Fm(\))-30 1759 y(and)14 b(to)g(prev)o(en)o (t)h(it)f(from)f(consulting)h(en)o(vironmen)o(t)g(v)n(ariables)f (\(using)h Fh(--fixed-sizes)p Fm(\))e(as)i(w)o(as)g(explained)f(ab)q(o) o(v)o(e)-30 1809 y(\(section)j(3.3,)e(page)h(19\).)22 b(By)15 b(default)g(the)h(pro)q(duced)g(executable)g(will)e(include)h (the)h(top-lev)o(el,)e(the)i(Prolog/W)-5 b(AM)-30 1858 y(debugger)19 b(and)e(all)f(Prolog)h(and)g(FD)h(built-in)e(predicates.) 30 b(It)18 b(is)f(p)q(ossible)h(to)f(a)o(v)o(oid)f(linking)g(the)i (top-lev)o(el)f(\(sec-)-30 1908 y(tion)d(3.2,)e(page)i(13\))f(b)o(y)h (sp)q(ecifying)g Fh(--no-top-level)p Fm(.)h(In)f(this)f(case,)i(at)e (least)h(one)g Fh(initialization/1)d Fm(directiv)o(e)-30 1958 y(\(section)h(6.1.13,)d(page)h(45\))g(should)h(b)q(e)g(de\014ned.) 18 b(The)11 b(option)f Fh(--no-debugger)e Fm(do)q(es)j(not)g(link)e (the)i(debugger.)18 b(T)m(o)10 b(in-)-30 2008 y(clude)h(only)e(used)i (built-in)d(predicates)j(that)f(are)g(actually)f(used)i(the)g(options)e Fh(--no-pl-bips)e Fm(and/or)j Fh(--no-fd-bips)-30 2058 y Fm(can)17 b(b)q(e)f(sp)q(eci\014ed.)26 b(F)m(or)15 b(the)i(smallest)e(executable)i(all)e(these)i(options)f(should)f(b)q(e) i(sp)q(eci\014ed.)25 b(This)16 b(can)g(b)q(e)h(abbre-)-30 2107 y(viated)g(b)o(y)f(using)h(the)g(shorthand)g(option)f Fh(--min-bips)p Fm(.)24 b(By)17 b(default,)g(executables)h(are)f(not)g Fe(stripp)n(e)n(d)p Fm(,)f(i.e.)26 b(their)-30 2157 y(sym)o(b)q(ol)14 b(table)g(is)h(not)f(remo)o(v)o(ed.)20 b(This)14 b(table)g(is)h(only)e (useful)i(for)f(the)h(C)f(debugger)i(\(e.g.)j(when)c(in)o(terfacing)f (Prolog)-30 2207 y(and)i(C\).)f(T)m(o)f(remo)o(v)o(e)i(the)g(sym)o(b)q (ol)e(table)h(\(and)h(then)g(to)f(reduce)i(the)f(size)g(of)f(the)h (\014nal)e(executable\))j(use)f Fh(--strip)p Fm(.)-30 2257 y(Finally)e Fh(--min-size)e Fm(is)i(a)g(shortcut)h(for)f Fh(--min-bips)e Fm(and)i Fh(--strip)p Fm(,)f(i.e.)18 b(the)d(pro)q(duced)h(executable)f(is)f(as)g(small)-30 2307 y(as)g(p)q(ossible.)-30 2406 y(Example:)22 b(compile)16 b(and)f(link)g(t)o(w)o(o)h(Prolog)f(sources)j Fh(prog1.pl)c Fm(and)i Fh(prog2.pl)p Fm(.)23 b(The)16 b(resulting)g(executable)i (will)-30 2456 y(b)q(e)d(named)f Fh(prog1)f Fm(\(since)h Fh(-o)g Fm(is)g(not)f(sp)q(eci\014ed\):)74 2539 y Fh(\045)22 b(gplc)f(prog1.pl)f(prog2.pl)-30 2622 y Fm(Example:)h(compile)15 b(the)h(Prolog)f(\014le)h Fh(prog.pl)e Fm(to)h(study)h(basic)g(W)-5 b(AM)16 b(co)q(de.)24 b(The)16 b(resulting)f(\014le)h(will)e(b)q(e)i (named)-30 2672 y Fh(prog.wam)p Fm(:)74 2755 y Fh(\045)22 b(gplc)f(-W)g(--no-inline)f(--no-reorder)f(--keep-void-inst)f(prog.pl) -30 2838 y Fm(Example:)25 b(compile)16 b(the)i(Prolog)e(\014le)h Fh(prog.pl)f Fm(and)h(its)g(C)g(in)o(terface)h(\014le)f Fh(utils.c)f Fm(to)h(pro)o(vide)g(an)g(autonomous)-30 2888 y(executable)f(called)d Fh(mycommand)p Fm(.)j(The)f(executable)g (is)e(not)h(stripp)q(ed)h(to)f(allo)o(w)e(the)j(use)f(of)g(the)g(C)g (debugger:)p eop end %%Page: 25 27 TeXDict begin 25 26 bop -30 -45 a Fm(3.4)41 b(The)14 b(GNU)g(Prolog)f(compiler)1273 b(25)p -30 -27 1890 4 v 74 115 a Fh(\045)22 b(gplc)f(-o)g(mycommand)f(prog.pl)g(utils.c)-30 198 y Fm(Example:)h(detail)15 b(all)g(steps)i(to)e(compile)g(the)h (Prolog)f(\014le)g Fh(prog.pl)g Fm(\(the)h(resulting)g(executable)g(is) g(stripp)q(ed\).)24 b(All)-30 248 y(in)o(termediate)15 b(\014les)f(are)g(pro)q(duced)h(\()p Fh(prog.wam)p Fm(,)d Fh(prog.ma)p Fm(,)g Fh(prog.s)p Fm(,)g Fh(prog.o)h Fm(and)g(the)i (executable)g Fh(prog)p Fm(\):)74 331 y Fh(\045)22 b(gplc)f(-W)g (prog.pl)74 381 y(\045)h(gplc)f(-M)g(--comment)f(prog.wam)74 430 y(\045)i(gplc)f(-S)g(--comment)f(prog.ma)74 480 y(\045)i(gplc)f(-c) g(prog.s)74 530 y(\045)h(gplc)f(-o)g(prog)g(-s)h(prog.o)-30 688 y Fi(3.4.4)48 b(Running)14 b(an)i(executable)-30 814 y Fm(In)11 b(this)g(section)g(w)o(e)g(explain)e(what)i(happ)q(ens)g (when)g(running)f(an)h(executable)g(pro)q(duced)h(b)o(y)f(the)g(GNU)f (Prolog)g(nativ)o(e-)-30 864 y(co)q(de)15 b(compiler.)j(The)c(default)f (main)g(function)h(\014rst)g(starts)h(the)f(Prolog)f(engine.)19 b(This)13 b(function)h(collects)g(all)f(link)o(ed)-30 914 y(ob)r(jects)k(\(issued)f(from)e(the)h(compilation)f(of)g(Prolog)g (\014les\))i(and)f(initializes)e(them.)22 b(The)16 b(initialization)c (of)i(a)h(Prolog)-30 964 y(ob)r(ject)h(\014le)f(consists)h(in)f(adding) f(to)g(appropriate)h(tables)h(new)f(atoms,)f(new)i(predicates)g(and)f (executing)g(its)g(system)-30 1013 y(directiv)o(es.)23 b(A)15 b(system)h(directiv)o(e)f(is)g(generated)i(b)o(y)d(the)i(Prolog) e(to)h(W)-5 b(AM)15 b(compiler)g(to)g(re\015ect)h(a)f(\(user\))i (directiv)o(e)-30 1063 y(executed)g(at)e(compile-time)f(suc)o(h)h(as)g Fh(op/3)f Fm(\(section)i(6.1.10,)d(page)i(44\).)20 b(Indeed,)c(when)f (the)h(compiler)e(encoun)o(ters)-30 1113 y(suc)o(h)19 b(a)f(directiv)o(e)h(it)f(immediately)e(executes)21 b(it)c(and)h(also)g (generates)h(a)f(system)h(directiv)o(e)g(to)f(execute)i(it)e(at)g(the) -30 1163 y(start)f(of)f(the)h(executable.)27 b(When)17 b(all)e(system)i(directiv)o(es)g(ha)o(v)o(e)g(b)q(een)g(executed)h(the) f(Prolog)f(engine)h(executes)h(all)-30 1213 y(initialization)10 b(directiv)o(es)k(de\014ned)f(with)f Fh(initialization/1)e Fm(\(section)j(6.1.13,)d(page)j(45\).)k(If)12 b(sev)o(eral)h (initialization)-30 1262 y(directiv)o(es)k(app)q(ear)f(in)e(the)i(same) g(\014le)f(they)h(are)g(executed)h(in)e(the)h(order)g(of)f(app)q (earance.)23 b(If)15 b(sev)o(eral)h(initialization)-30 1312 y(directiv)o(es)f(app)q(ear)g(in)e(di\013eren)o(t)i(\014les)g(the) f(order)h(in)f(whic)o(h)g(they)g(are)g(executed)i(is)e(mac)o(hine-dep)q (endan)o(t.)19 b(Ho)o(w)o(ev)o(er,)-30 1362 y(on)14 b(most)g(mac)o (hines)g(the)g(order)h(will)d(b)q(e)i(the)h(rev)o(erse)g(order)g(in)e (whic)o(h)h(the)h(asso)q(ciated)f(\014les)g(ha)o(v)o(e)g(b)q(een)h (link)o(ed)e(\(this)-30 1412 y(is)i(not)g(true)h(under)g(nativ)o(e)f (win32\).)21 b(When)15 b(all)f(initialization)e(directiv)o(es)k(ha)o(v) o(e)f(b)q(een)h(executed)h(the)f(default)e(main)-30 1462 y(function)g(lo)q(oks)e(for)h(the)h(GNU)g(Prolog)e(top-lev)o(el.)18 b(If)13 b(presen)o(t)i(\(i.e.)i(it)c(has)h(b)q(een)g(link)o(ed\))f(it)g (is)g(called)g(otherwise)i(the)-30 1512 y(program)e(simply)e(ends.)19 b(Note)13 b(that)g(if)f(the)h(top-lev)o(el)g(is)f(not)h(link)o(ed)f (and)h(if)f(there)i(is)f(no)f(initialization)e(directiv)o(e)k(the)-30 1561 y(program)g(is)g(useless)h(since)g(it)e(simply)g(ends)i(without)f (doing)f(an)o(y)g(w)o(ork.)18 b(The)c(default)g(main)f(function)g (detects)j(suc)o(h)-30 1611 y(a)e(b)q(eha)o(vior)g(and)f(emits)h(a)g(w) o(arning)f(message.)-30 1711 y(Example:)18 b(compile)13 b(an)h(empt)o(y)g(\014le)g Fh(prog.pl)e Fm(without)h(linking)g(the)h (top-lev)o(el)g(and)f(execute)j(it:)74 1794 y Fh(\045)22 b(gplc)f(--no-top-level)e(prog.pl)74 1844 y(\045)j(prog)74 1893 y(Warning:)e(no)i(initial)e(goal)h(executed)140 1943 y(use)g(a)g(directive)f(:-)i(initialization\(G)o(oal\))140 1993 y(or)f(remove)g(the)g(link)g(option)f(--no-top-level)f(\(or)i (--min-bips)f(or)h(--min-size\))-30 2151 y Fi(3.4.5)48 b(Generating)14 b(a)i(new)g(in)o(teractiv)o(e)f(in)o(terpreter)-30 2277 y Fm(In)g(this)f(section)i(w)o(e)e(sho)o(w)h(ho)o(w)f(to)g (de\014ne)i(a)e(new)h(top-lev)o(el)f(extending)g(the)i(GNU)e(Prolog)g (in)o(teractiv)o(e)g(in)o(terpreter)-30 2327 y(with)h(new)g(predicate)g (de\014nitions.)20 b(The)15 b(obtained)f(top-lev)o(el)g(can)h(then)g(b) q(e)g(considered)h(as)e(an)h(enric)o(hed)g(v)o(ersion)g(of)-30 2377 y(the)i(basic)f(GNU)g(Prolog)f(top-lev)o(el)h(\(section)h(3.2,)e (page)h(13\).)24 b(Indeed,)17 b(eac)o(h)g(added)f(predicate)h(can)f(b)q (e)h(view)o(ed)f(as)-30 2427 y(a)h(prede\014ned)i(predicate)f(just)f (lik)o(e)f(an)o(y)h(other)g(built-in)f(predicate.)28 b(This)17 b(can)g(b)q(e)h(ac)o(hiev)o(ed)f(b)o(y)g(compiling)e(these) -30 2476 y(predicates)h(and)e(including)e(the)j(top-lev)o(el)e(at)h (link-time.)-30 2576 y(The)d(real)g(question)f(is:)16 b(wh)o(y)11 b(w)o(ould)e(w)o(e)i(include)f(some)h(predicates)h(in)e(a)g (new)h(top-lev)o(el)f(instead)g(of)g(simply)g(consulting)-30 2626 y(them)15 b(under)f(the)h(GNU)e(Prolog)h(top-lev)o(el)f(?)18 b(There)d(are)f(t)o(w)o(o)g(reasons)h(for)e(this:)33 2709 y Fg(\017)20 b Fm(the)h(predicate)g(cannot)f(b)q(e)h(consulted.)37 b(This)19 b(is)h(the)h(case)g(of)e(a)h(predicate)h(calling)d(foreign)i (co)q(de,)h(lik)o(e)e(a)74 2759 y(predicate)c(in)o(terfacing)f(with)f (C)h(\(section)h(9,)e(page)h(183\))f(or)h(a)f(predicate)i(de\014ning)f (a)g(new)g(FD)g(constrain)o(t.)33 2842 y Fg(\017)20 b Fm(the)13 b(p)q(erformance)g(of)f(the)h(predicate)g(is)f(crucial.)18 b(Since)13 b(it)f(is)g(compiled)f(to)i(nativ)o(e-co)q(de)f(suc)o(h)h(a) f(predicate)i(will)74 2892 y(b)q(e)g(executed)g(v)o(ery)f(quic)o(kly)m (.)k(Consulting)12 b(will)f(load)h(it)g(as)h(b)o(yte-co)q(de.)19 b(The)13 b(gain)f(is)h(m)o(uc)o(h)f(more)h(noticeable)g(if)p eop end %%Page: 26 28 TeXDict begin 26 27 bop -30 -45 a Fm(26)1350 b(3)41 b(USING)14 b(GNU)f(PR)o(OLOG)p -30 -27 1890 4 v 74 115 a(the)i(program)e(is)h(run) g(under)h(the)f(debugger.)19 b(The)14 b(included)g(v)o(ersion)g(will)f (not)g(b)q(e)i(a\013ected)g(b)o(y)f(the)g(debugger)74 165 y(while)g(the)g(consulted)h(v)o(ersion)f(will)e(b)q(e)i(sev)o(eral) h(times)e(slo)o(w)o(er.)18 b(Ob)o(viously)m(,)13 b(a)g(predicate)i (should)f(b)q(e)g(included)74 215 y(in)g(a)f(new)i(top-lev)o(el)e(only) g(when)h(it)g(is)g(itself)f(debugged)i(since)f(it)g(is)g(di\016cult)f (to)h(debug)g(nativ)o(e-co)q(de.)-30 298 y(T)m(o)h(de\014ne)i(a)e(new)h (top-lev)o(el)f(simply)g(compile)g(the)h(set)h(of)e(desired)i (predicates)g(and)e(linking)f(them)i(with)f(the)h(GNU)-30 347 y(Prolog)e(top-lev)o(el)f(\(this)h(is)g(the)g(default\))g(using)g Fh(gplc)f Fm(\(section)i(3.4.3,)d(page)h(22\).)-30 447 y(Example:)18 b(let)c(us)g(de\014ne)h(a)f(new)g(top-lev)o(el)f(called)h Fh(my)p 845 447 14 2 v 15 w(top)p 926 447 V 15 w(level)f Fm(including)g(all)g(predicates)i(de\014ned)g(in)f Fh(prog.pl)p Fm(:)74 530 y Fh(\045)22 b(gplc)f(-o)g(my)p 339 530 V 15 w(top)p 420 530 V 16 w(level)f(prog.pl)-30 613 y Fm(By)14 b(the)f(w)o(a)o(y)m(,)e(note)j(that)f(if)i Fh(prog.pl)c Fm(is)i(an)f(empt)o(y)h(Prolog)f(\014le)h(the)h(previous)f(command)f (will)f(simply)h(create)i(a)f(new)-30 663 y(in)o(teractiv)o(e)i(in)o (terpreter)g(similar)e(to)h(the)g(GNU)g(Prolog)f(top-lev)o(el.)-30 762 y(Example:)18 b(as)c(b)q(efore)h(where)g(some)f(predicates)h(of)i Fh(prog.pl)12 b Fm(call)h(C)h(functions)g(de\014ned)h(in)e Fh(utils.c)p Fm(:)74 845 y Fh(\045)22 b(gplc)f(-o)g(my)p 339 845 V 15 w(top)p 420 845 V 16 w(level)f(prog.pl)h(utils.c)-30 929 y Fm(In)f(conclusion,)g(de\014ning)g(a)f(particular)g(top-lev)o(el) g(is)h(nothing)f(else)h(but)g(a)f(particular)g(case)i(of)e(the)h(nativ) o(e-co)q(de)-30 978 y(compilation.)d(It)d(is)f(simple)h(to)f(do)h(and)g (v)o(ery)g(useful)g(in)f(practice.)-30 1136 y Fi(3.4.6)48 b(The)16 b(hexadecimal)g(predicate)e(name)i(enco)q(ding)-30 1262 y Fm(When)d(the)g(GNU)f(Prolog)g(compiler)f(compiles)h(a)g(Prolog) g(source)i(to)e(an)g(ob)r(ject)h(\014le)f(it)g(has)h(to)f(asso)q(ciate) h(a)f(sym)o(b)q(ol)f(to)-30 1312 y(eac)o(h)16 b(predicate)g(name.)21 b(Ho)o(w)o(ev)o(er,)16 b(the)f(syn)o(tax)g(of)g(sym)o(b)q(ols)f(is)h (restricted)i(to)e(iden)o(ti\014ers:)21 b(string)15 b(con)o(taining)f (only)-30 1362 y(letters,)19 b(digits)e(or)g(underscore)i(c)o (haracters.)29 b(On)17 b(the)h(other)g(hand,)f(predicate)h(names)f (\(i.e.)28 b(atoms\))16 b(can)i(con)o(tain)-30 1412 y(an)o(y)c(c)o (haracter)i(with)e(quotes)i(if)d(necessary)k(\(e.g.)i Fh('x+y=z')13 b Fm(is)i(a)f(v)n(alid)f(predicate)i(name\).)20 b(The)15 b(compiler)f(has)h(then)-30 1462 y(to)j(enco)q(de)h(predicate) g(names)f(resp)q(ecting)i(the)e(syn)o(tax)g(of)f(iden)o(ti\014ers.)31 b(T)m(o)17 b(ac)o(hiev)o(e)h(this,)h(GNU)e(Prolog)g(uses)i(an)-30 1512 y(hexadecimal)e(represen)o(tation)i(where)g(eac)o(h)e(predicate)i (name)e(is)g(translated)h(to)f(a)g(sym)o(b)q(ol)g(b)q(eginning)f(with)h (an)g Fh(X)-30 1561 y Fm(follo)o(w)o(ed)c(b)o(y)g(the)i(hexadecimal)e (notation)g(of)h(the)g(co)q(de)h(of)e(eac)o(h)h(c)o(haracter)i(of)d (the)i(name.)-30 1661 y(Example:)25 b Fh('x+y=z')15 b Fm(will)h(b)q(e)i(enco)q(ded)h(as)e Fh(X782B793D7A)e Fm(since)j Fh(78)f Fm(is)g(the)g(hexadecimal)g(represen)o(tation)i(of)e (the)-30 1711 y(co)q(de)e(of)i Fh(x)p Fm(,)c Fh(2B)g Fm(of)h(the)g(co)q(de)h(of)h Fh(+)p Fm(,)d(etc.)-30 1810 y(Since)j(Prolog)f(allo)o(ws)f(the)j(user)f(to)g(de\014ne)g(sev)o(eral) g(predicates)h(with)e(the)h(same)g(name)f(but)h(with)f(a)g(di\013eren)o (t)i(arit)o(y)-30 1860 y(GNU)c(Prolog)f(enco)q(des)i(predicate)g (indicators)e(\(predicate)i(name)f(follo)o(w)o(ed)e(b)o(y)h(the)h(arit) o(y\).)18 b(The)13 b(sym)o(b)q(ol)e(asso)q(ciated)-30 1910 y(with)j(the)h(predicate)g(name)e(is)h(then)h(follo)o(w)o(ed)d(b)o (y)h(an)h(underscore)i(and)e(b)o(y)f(the)i(decimal)e(notation)g(of)g (the)i(arit)o(y)m(.)-30 2010 y(Example:)j Fh('x+y=z'/3)12 b Fm(will)g(b)q(e)j(enco)q(ded)g(as)f Fh(X782B793D7A)p 960 2010 V 14 w(3)p Fm(.)-30 2109 y(So,)f(from)g(the)h(mini-assem)o (bly)e(stage,)i(eac)o(h)g(predicate)g(indicator)f(is)g(replaced)i(b)o (y)e(its)h(hexadecimal)f(enco)q(ding.)18 b(The)-30 2159 y(kno)o(wledge)c(of)f(this)h(enco)q(ding)g(is)f(normally)g(not)g(of)g (in)o(terest)i(for)f(the)g(user,)g(i.e.)k(the)c(Prolog)f(programmer.)18 b(F)m(or)13 b(this)-30 2209 y(reason)k(the)f(GNU)f(Prolog)g(compiler)g (hides)h(this)g(enco)q(ding.)24 b(When)15 b(an)h(error)g(o)q(ccurs)h (on)f(a)f(predicate)i(\(unde\014ned)-30 2259 y(predicate,)k(predicate)g (with)d(m)o(ultiple)g(de\014nitions,.)6 b(.)g(.)h(\))34 b(the)20 b(compiler)e(has)h(to)g(deco)q(de)i(the)e(sym)o(b)q(ol)f(asso) q(ciated)-30 2309 y(with)h(the)h(predicate)g(indicator.)33 b(F)m(or)18 b(this)h Fh(gplc)f Fm(\014lters)i(eac)o(h)g(message)f (emitted)h(b)o(y)e(the)i(link)o(er)e(to)h(lo)q(cate)g(and)-30 2358 y(deco)q(de)h(ev)o(en)o(tual)f(predicate)g(indicators.)32 b(This)19 b(\014ltering)f(can)h(b)q(e)g(deactiv)n(ated)g(sp)q(ecifying) g Fh(--no-decode-hex)o(a)-30 2408 y Fm(when)c(in)o(v)o(oking)d Fh(gplc)h Fm(\(section)i(3.4.3,)d(page)i(22\).)-30 2508 y(This)g(\014lter)h(is)e(pro)o(vided)h(as)g(an)g(utilit)o(y)e(that)i (can)g(b)q(e)h(in)o(v)o(ok)o(ed)e(using)g(the)i Fh(hexgplc)d Fm(command)h(as)h(follo)o(ws:)74 2591 y Fh(\045)22 b(hexgplc)e Fm([)p Fd(OPTION)6 b Fm(].)g(.)g(.)28 b Fd(FILE)7 b Fm(.)f(.)h(.)50 b(\(the)14 b Fh(\045)g Fm(sym)o(b)q(ol)f(is)h(the)g(op)q(erating)g (system)h(shell)f(prompt\))-30 2674 y Fi(Options)p Fm(:)p eop end %%Page: 27 29 TeXDict begin 27 28 bop -30 -45 a Fm(3.4)41 b(The)14 b(GNU)g(Prolog)f(compiler)1273 b(27)p -30 -27 1890 4 v -5 108 a Fh(--encode)406 b Fm(enco)q(ding)14 b(mo)q(de)g(\(default)f (mo)q(de)h(is)g(deco)q(ding\))-5 158 y Fh(--relax)428 b Fm(deco)q(de)15 b(also)e(predicate)i(names)f(\(not)g(only)f (predicate)i(indicators\))-5 208 y Fh(--printf)e Fd(FORMAT)261 b Fm(pass)14 b(enco)q(ded/deco)q(ded)j(string)d(to)f(C)h Fh(printf\(3\))e Fm(with)i Fd(FORMAT)-5 258 y Fh(--aux-father)318 b Fm(deco)q(de)15 b(an)f(auxiliary)e(predicate)j(as)f(its)f(father)-5 308 y Fh(--aux-father2)296 b Fm(deco)q(de)15 b(an)f(auxiliary)e (predicate)j(as)f(its)f(father)i(+)f(auxiliary)e(n)o(um)o(b)q(er)-5 357 y Fh(--cmd-line)362 b Fm(enco)q(de/deco)q(de)16 b(eac)o(h)e (argumen)o(t)g(of)f(the)i(command-line)-5 407 y Fh(-H)538 b Fm(same)14 b(as:)k Fh(--cmd-line)i(--encode)-5 457 y(-P)538 b Fm(same)14 b(as:)k Fh(--cmd-line)i(--relax)-5 507 y(--help)450 b Fm(prin)o(t)13 b(a)h(help)g(and)g(exit)-5 557 y Fh(--version)384 b Fm(prin)o(t)13 b(v)o(ersion)h(n)o(um)o(b)q(er) h(and)e(exit)-30 654 y(It)h(is)g(p)q(ossible)g(to)g(giv)o(e)f(a)h (pre\014x)h(of)e(an)g(option)h(if)f(there)i(is)f(no)f(am)o(biguit)o(y)m (.)-30 754 y(Without)e(argumen)o(ts)g Fh(hexgplc)f Fm(runs)i(in)e(deco) q(ding)i(mo)q(de)f(reading)g(its)g(standard)g(input)g(and)g(deco)q (ding)g(eac)o(h)h(sym)o(b)q(ol)-30 804 y(corresp)q(onding)i(to)f(a)f (predicate)i(indicator.)j(T)m(o)12 b(use)i Fh(hexgplc)d Fm(in)h(the)h(enco)q(ding)g(mo)q(de)g(the)g Fh(--encode)e Fm(option)h(m)o(ust)-30 854 y(b)q(e)17 b(sp)q(eci\014ed.)25 b(By)16 b(default)g Fh(hexgplc)e Fm(only)h(deco)q(des)j(predicate)e (indicators,)g(this)g(can)g(b)q(e)g(relaxed)h(using)f Fh(--relax)-30 903 y Fm(to)e(also)f(tak)o(e)h(in)o(to)f(accoun)o(t)i (simple)e(predicate)i(names)f(\(the)h(arit)o(y)e(can)h(b)q(e)g (omitted\).)k(It)c(is)g(p)q(ossible)g(to)g(format)f(the)-30 953 y(output)g(of)g(an)f(enco)q(ded/deco)q(ded)k(string)d(using)g Fh(--printf)20 b Fd(FORMAT)f Fm(in)12 b(that)h(case)h(eac)o(h)f(string) h Fd(S)19 b Fm(is)13 b(passed)h(to)f(the)-30 1003 y(C)h Fh(printf\(3\))e Fm(function)i(as)g Fh(printf\()p Fd(FORMAT)t Fh(,)p Fd(S)7 b Fh(\))p Fm(.)-30 1103 y(Auxiliary)14 b(predicates)i(are)f(generated)g(b)o(y)g(the)g(Prolog)f(to)g(W)-5 b(AM)15 b(compiler)f(when)h(simplifying)d(some)j(con)o(trol)f(con-)-30 1152 y(structs)j(lik)o(e)e Fh(';'/2)f Fm(presen)o(t)i(in)f(the)h(b)q(o) q(dy)f(of)f(a)h(clause.)22 b(They)15 b(are)h(of)e(the)i(form)e Fh('$)p Fd(NAME)6 b Fh(/)p Fd(ARITY)p 1588 1152 14 2 v 22 w Fh($aux)p Fd(N)g Fh(')15 b Fm(where)-30 1202 y Fd(NAME)7 b Fh(/)p Fd(ARITY)18 b Fm(is)12 b(the)h(predicate)h (indicator)e(of)g(the)h(simpli\014ed)e(\(i.e.)17 b(father\))c (predicate)h(and)e Fd(N)19 b Fm(is)12 b(a)g(sequen)o(tial)h(n)o(um-)-30 1252 y(b)q(er)k(\(a)e(predicate)h(can)f(giv)o(e)g(rise)h(to)f(sev)o (eral)h(auxiliary)d(predicates\).)24 b(It)15 b(is)g(p)q(ossible)g(to)g (force)h Fh(hexgplc)e Fm(to)h(deco)q(de)-30 1302 y(an)k(auxiliary)d (predicate)j(as)g(its)f(father)h(predicate)g(indicator)f(using)h Fh(--aux-father)c Fm(or)k(as)f(its)g(father)h(predicate)-30 1352 y(indicator)14 b(follo)o(w)o(ed)e(b)o(y)i(the)g(sequen)o(tial)g(n) o(um)o(b)q(er)g(using)h Fh(--aux-father2)p Fm(.)-30 1451 y(If)j(no)g(\014le)g(is)g(sp)q(eci\014ed,)i Fh(hexgplc)d Fm(pro)q(cesses)j(its)e(standard)h(input)f(otherwise)h(eac)o(h)f (\014le)g(is)g(treated)i(sequen)o(tially)m(.)-30 1501 y(Sp)q(ecifying)c(the)g Fh(--cmd-line)e Fm(option)h(informs)g Fh(hexgplc)f Fm(that)i(eac)o(h)h(argumen)o(t)e(is)h(not)g(a)f(\014le)h (name)g(but)g(a)f(string)-30 1551 y(that)f(m)o(ust)g(b)q(e)h(enco)q (ded)g(\(or)f(deco)q(ded\).)20 b(This)14 b(is)g(useful)g(to)g(enco)q (de/deco)q(de)i(a)e(particular)g(string.)k(F)m(or)c(this)g(reason)-30 1601 y(the)i(option)f Fh(-H)g Fm(\(enco)q(de)h(to)f(hexadecimal\))g (and)g Fh(-P)g Fm(\(deco)q(de)i(to)e(Prolog\))f(are)i(pro)o(vided)f(as) g(shorthand.)23 b(Then,)15 b(to)-30 1651 y(obtain)f(the)g(hexadecimal)f (represen)o(tation)j(of)d(a)h(predicate)h Fd(P)21 b Fm(use:)74 1734 y Fh(\045)h(hexgplc)e(-H)i Fd(P)-30 1817 y Fm(Example:)74 1900 y Fh(\045)g(hexgplc)e(-H)i('x+y=z')74 1949 y(X782B793D7A)p eop end %%Page: 28 30 TeXDict begin 28 29 bop -30 -45 a Fm(28)1350 b(3)41 b(USING)14 b(GNU)f(PR)o(OLOG)p -30 -27 1890 4 v eop end %%Page: 29 31 TeXDict begin 29 30 bop 1819 -45 a Fm(29)p -30 -27 1890 4 v -30 115 a Fn(4)67 b(Debugging)-30 264 y Ff(4.1)56 b(In)n(tro)r(duction)-30 390 y Fm(The)10 b(GNU)g(Prolog)e(debugger)j (pro)o(vides)e(information)f(concerning)i(the)g(con)o(trol)f(\015o)o(w) h(of)e(the)j(program.)k(The)10 b(debugger)-30 440 y(can)15 b(b)q(e)g(fully)d(used)j(on)f(consulted)h(predicates)h(\(i.e.)i(b)o (yte-co)q(de\).)i(F)m(or)14 b(nativ)o(e)g(compiled)f(co)q(de)i(only)f (the)g(calls/exits)-30 490 y(are)k(traced,)g(no)e(in)o(ternal)h(b)q (eha)o(vior)f(is)h(sho)o(wn.)27 b(Under)17 b(the)h(debugger)f(it)g(is)f (p)q(ossible)h(to)g(exhaustiv)o(ely)g(trace)h(the)-30 540 y(execution)d(or)e(to)h(set)g(sp)o(y-p)q(oin)o(ts)g(to)g(only)e (debug)i(a)g(sp)q(eci\014c)h(part)f(of)f(the)h(program.)j(Sp)o(y-p)q (oin)o(ts)c(allo)o(w)f(the)j(user)f(to)-30 590 y(indicate)f(on)f(whic)o (h)g(predicates)i(the)f(debugger)g(has)f(to)h(stop)f(to)g(allo)o(w)f (the)i(user)g(to)g(in)o(teract)f(with)g(it.)18 b(The)12 b(debugger)-30 639 y(uses)j(the)e(\\pro)q(cedure)i(b)q(o)o(x)e(con)o (trol)g(\015o)o(w)g(mo)q(del",)f(also)g(called)h(the)h(Byrd)f(Bo)o(x)g (mo)q(del)g(since)h(it)f(is)f(due)i(to)f(La)o(wrence)-30 689 y(Byrd.)-30 855 y Ff(4.2)56 b(The)18 b(pro)r(cedure)g(b)r(o)n(x)g (mo)r(del)-30 982 y Fm(The)h(pro)q(cedure)i(b)q(o)o(x)d(mo)q(del)g(of)g (Prolog)g(execution)h(pro)o(vides)g(a)f(simple)g(w)o(a)o(y)g(to)g(sho)o (w)g(the)i(con)o(trol)e(\015o)o(w.)31 b(This)-30 1032 y(mo)q(del)18 b(is)g(v)o(ery)h(p)q(opular)f(and)g(has)g(b)q(een)h (adopted)g(in)f(man)o(y)f(Prolog)h(systems)h(\(e.g.)31 b(SICStus)19 b(Prolog,)f(Quin)o(tus)-30 1081 y(Prolog,.)6 b(.)g(.)h(\).)17 b(A)d(go)q(o)q(d)e(in)o(tro)q(duction)h(is)g(the)g(c)o (hapter)h(8)f(of)f(\\Programming)g(in)g(Prolog")g(of)h(Clo)q(c)o(ksin)f (&)h(Mellish)g([2)o(].)-30 1131 y(The)21 b(debugger)f(executes)i(a)d (program)g(step)i(b)o(y)e(step)i(tracing)e(an)g(in)o(v)o(o)q(cation)g (to)g(a)g(predicate)i(\()p Fh(call)p Fm(\))e(and)h(the)-30 1181 y(return)g(from)e(this)g(predicate)i(due)f(to)f(either)h(a)f (success)j(\()p Fh(exit)p Fm(\))d(or)h(a)f(failure)f(\()p Fh(fail)p Fm(\).)31 b(When)19 b(a)f(failure)g(o)q(ccurs)-30 1231 y(the)j(execution)f(bac)o(ktrac)o(ks)g(to)g(the)g(last)f (predicate)i(with)f(an)f(alternativ)o(e)g(clause.)36 b(The)20 b(predicate)h(is)e(then)i(re-)-30 1281 y(in)o(v)o(ok)o(ed)13 b(\()p Fh(redo)p Fm(\).)k(Another)d(source)g(of)f(c)o(hange)g(of)g(the) h(con)o(trol)f(\015o)o(w)f(is)i(due)f(to)g(exceptions.)19 b(When)13 b(an)g(exception)h(is)-30 1330 y(raised)g(from)f(a)g (predicate)h(\()p Fh(exception)p Fm(\))e(b)o(y)h Fh(throw/1)f Fm(\(section)i(6.2.4,)d(page)j(47\))e(the)i(con)o(trol)f(is)g(giv)o(en) g(bac)o(k)g(to)h(the)-30 1380 y(most)h(recen)o(t)h(predicate)f(that)f (has)h(de\014ned)g(a)f(handler)h(to)f(reco)o(v)o(er)h(this)g(exception) g(using)f Fh(catch/3)f Fm(\(section)i(6.2.4,)-30 1430 y(page)e(47\).)18 b(The)13 b(pro)q(cedure)i(b)q(o)o(x)e(mo)q(del)f(sho) o(ws)i(these)g(di\013eren)o(t)g(c)o(hanges)g(in)e(the)i(con)o(trol)e (\015o)o(w,)h(as)g(illustrated)f(here:)p 412 1496 1007 2 v 412 1825 2 330 v 426 1813 a @beginspecial 0 @llx 0 @lly 283 @urx 88 @ury 2348 @rwi @setspecial %%BeginDocument: debug-box.eps %!PS-Adobe-2.0 EPSF-2.0 %%Title: fig2.eps %%Creator: fig2dev Version 3.2 Patchlevel 1 %%CreationDate: Fri Feb 19 13:34:02 1999 %%For: aude@borba.inria.fr (Jean-Christophe Aude) %%Orientation: Portrait %%BoundingBox: 0 0 283 88 %%Pages: 0 %%BeginSetup %%EndSetup %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save -152.0 249.0 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog $F2psBegin 10 setmiterlimit n -1000 5149 m -1000 -1000 l 8238 -1000 l 8238 5149 l cp clip 0.06000 0.06000 sc % Polyline 7.500 slw n 4200 2700 m 6000 2700 l 6000 3600 l 4200 3600 l cp gs col0 s gr /Times-Roman ff 180.00 scf sf 4747 3195 m gs 1 -1 sc (predicate) col0 sh gr % Polyline gs clippath 4080 2820 m 4200 2850 l 4080 2880 l 4215 2880 l 4215 2820 l cp clip n 3375 2850 m 4200 2850 l gs col0 s gr gr % arrowhead n 4080 2820 m 4200 2850 l 4080 2880 l 4080 2850 l 4080 2820 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 6705 2820 m 6825 2850 l 6705 2880 l 6840 2880 l 6840 2820 l cp clip n 6000 2850 m 6825 2850 l gs col0 s gr gr % arrowhead n 6705 2820 m 6825 2850 l 6705 2880 l 6705 2850 l 6705 2820 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3495 3480 m 3375 3450 l 3495 3420 l 3360 3420 l 3360 3480 l cp clip n 4200 3450 m 3375 3450 l gs col0 s gr gr % arrowhead n 3495 3480 m 3375 3450 l 3495 3420 l 3495 3450 l 3495 3480 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3495 4080 m 3375 4050 l 3495 4020 l 3360 4020 l 3360 4080 l cp clip n 5100 3600 m 5100 4050 l 3375 4050 l gs col0 s gr gr % arrowhead n 3495 4080 m 3375 4050 l 3495 4020 l 3495 4050 l 3495 4080 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 6120 3480 m 6000 3450 l 6120 3420 l 5985 3420 l 5985 3480 l cp clip n 6825 3450 m 6000 3450 l gs col0 s gr gr % arrowhead n 6120 3480 m 6000 3450 l 6120 3420 l 6120 3450 l 6120 3480 l cp gs 0.00 setgray ef gr col0 s /Times-Roman ff 180.00 scf sf 6900 3495 m gs 1 -1 sc (redo) col0 sh gr /Times-Roman ff 180.00 scf sf 6900 2895 m gs 1 -1 sc (exit) col0 sh gr /Times-Roman ff 180.00 scf sf 3300 2910 m gs 1 -1 sc (call) dup sw pop neg 0 rm col0 sh gr /Times-Roman ff 180.00 scf sf 3300 3495 m gs 1 -1 sc (fail) dup sw pop neg 0 rm col0 sh gr /Times-Roman ff 180.00 scf sf 3300 4095 m gs 1 -1 sc (exception) dup sw pop neg 0 rm col0 sh gr $F2psEnd rs %%EndDocument @endspecial 1417 1825 V 412 1827 1007 2 v -30 1912 a(Eac)o(h)g(arro)o (w)f(corresp)q(onds)h(to)f(a)g Fe(p)n(ort)p Fm(.)17 b(An)11 b(arro)o(w)f(to)h(the)h(b)q(o)o(x)e(indicates)i(that)f(the)g(con)o (trol)g(is)g(giv)o(en)f(to)h(this)g(predicate)-30 1962 y(while)17 b(an)f(arro)o(w)h(from)f(the)h(b)q(o)o(x)f(indicates)h(that) g(the)g(con)o(trol)g(is)f(giv)o(en)h(bac)o(k)f(from)g(the)i(pro)q (cedure.)28 b(This)17 b(mo)q(del)-30 2012 y(visualizes)12 b(the)g(con)o(trol)f(\015o)o(w)f(through)i(these)g(\014v)o(e)g(p)q (orts)g(and)f(the)h(connections)g(b)q(et)o(w)o(een)h(the)f(b)q(o)o(xes) f(asso)q(ciated)i(with)-30 2062 y(subgoals.)18 b(Finally)m(,)11 b(it)i(should)g(b)q(e)h(clear)f(that)g(a)g(b)q(o)o(x)g(is)g(asso)q (ciated)h(with)f(one)h(in)o(v)o(o)q(cation)e(of)h(a)f(giv)o(en)h (predicate.)19 b(In)-30 2112 y(particular,)12 b(a)g(recursiv)o(e)i (predicate)f(will)e(giv)o(e)h(raise)g(to)g(a)g(b)q(o)o(x)g(for)g(eac)o (h)h(in)o(v)o(o)q(cation)e(of)g(the)i(predicate)g(with)f(di\013eren)o (t)-30 2162 y(en)o(tries/exits)i(in)d(the)i(con)o(trol)f(\015o)o(w.)17 b(Since)c(this)f(migh)o(t)f(get)h(confusing)g(for)g(the)h(user,)g(the)f (debugger)h(asso)q(ciates)h(with)-30 2211 y(eac)o(h)h(b)q(o)o(x)e(a)h (unique)g(iden)o(ti\014er)g(\(i.e.)k(the)c(in)o(v)o(o)q(cation)f(n)o (um)o(b)q(er\).)-30 2377 y Ff(4.3)56 b(Debugging)18 b(predicates)-30 2504 y Fi(4.3.1)48 b(Running)14 b(and)h(stopping)f(the)h(debugger)-30 2630 y Fh(trace/0)e Fm(activ)n(ates)h(the)g(debugger.)19 b(The)c(next)f(in)o(v)o(o)q(cation)f(of)g(a)g(predicate)i(will)e(b)q(e) h(traced.)-30 2730 y Fh(debug/0)g Fm(activ)n(ates)i(the)g(debugger.)24 b(The)16 b(next)g(in)o(v)o(o)q(cation)e(of)h(a)g(predicate)h(on)g(whic) o(h)f(a)g(sp)o(y-p)q(oin)o(t)g(has)h(b)q(een)g(set)-30 2780 y(will)d(b)q(e)h(traced.)-30 2879 y(It)e(is)g(imp)q(ortan)o(t)f (to)g(understand)i(that)f(the)g(information)e(asso)q(ciated)i(with)g (the)g(con)o(trol)g(\015o)o(w)f(is)g(only)g(a)o(v)n(ailable)f(when)p eop end %%Page: 30 32 TeXDict begin 30 31 bop -30 -45 a Fm(30)1522 b(4)41 b(DEBUGGING)p -30 -27 1890 4 v -30 115 a(the)12 b(debugger)g(is)e(on.)17 b(F)m(or)11 b(e\016ciency)h(reasons,)g(when)f(the)g(debugger)h(is)f (o\013)g(the)g(information)e(concerning)j(the)f(con)o(trol)-30 165 y(\015o)o(w)j(\(i.e.)k(the)d(b)q(o)o(xes\))g(is)e(not)h(retained.) 20 b(So,)13 b(if)g(the)i(debugger)g(is)e(activ)n(ated)h(in)g(the)h (middle)e(of)g(a)h(computation)f(\(b)o(y)-30 215 y(a)k(call)f(to)g Fh(debug/0)f Fm(or)i Fh(trace/0)e Fm(in)h(the)i(program)e(or)g(after)h (the)g(in)o(terrupt)h(k)o(ey)e(sequence)j(\()p Fh(Ctl-C)p Fm(\))d(b)o(y)g(c)o(ho)q(osing)-30 264 y Fh(trace)d Fm(or)h Fh(debug)p Fm(\),)f(information)f(prior)h(to)h(this)g(p)q(oin)o(t)f(is) h(not)g(a)o(v)n(ailable.)-30 364 y Fh(debugging/0)p Fm(:)28 b(prin)o(ts)20 b(on)o(to)f(the)i(terminal)e(information)f(ab)q(out)i (the)g(curren)o(t)h(debugging)f(state)g(\(whether)i(the)-30 414 y(debugger)15 b(is)f(switc)o(hed)h(on,)e(what)h(are)g(the)g (leashed)h(p)q(orts,)f(sp)o(y-p)q(oin)o(ts)g(de\014ned,.)7 b(.)f(.)h(\).)-30 513 y Fh(notrace/0)12 b Fm(or)i Fh(nodebug/0)e Fm(switc)o(hes)j(the)g(debugger)g(o\013.)-30 613 y Fh(wam)p 39 613 14 2 v 16 w(debug/0)f Fm(in)o(v)o(ok)o(es)i(the)h(sub-debugger)g (dev)o(oted)g(to)f(the)g(W)-5 b(AM)17 b(data)f(structures)i(\(section)f (4.6,)f(page)g(32\).)24 b(It)-30 663 y(can)15 b(b)q(e)f(also)f(in)o(v)o (ok)o(ed)g(using)h(the)g Fh(W)g Fm(debugger)h(command)e(\(section)i (4.5,)d(page)i(31\).)-30 821 y Fi(4.3.2)48 b(Leashing)15 b(p)q(orts)-30 947 y Fh(leash\(Ports\))f Fm(requests)19 b(the)e(debugger)g(to)f(prompt)g(the)h(user,)h(as)e(he)h(creeps)h (through)f(the)g(program,)e(for)h(ev)o(ery)-30 997 y(p)q(ort)e (de\014ned)g(in)e(the)i Fh(Ports)e Fm(list.)17 b(Eac)o(h)d(elemen)o(t)f (of)j Fh(Ports)c Fm(is)h(an)f(atom)h(in)f Fh(call)p Fm(,)g Fh(exit)p Fm(,)g Fh(redo)p Fm(,)g Fh(fail)p Fm(,)g Fh(exception)p Fm(.)-30 1047 y Fh(Ports)h Fm(can)h(also)g(b)q(e)g(an)g(atom)f (de\014ning)h(a)f(shorthand:)33 1130 y Fg(\017)20 b Fh(full)p Fm(:)d(equiv)n(alen)o(t)d(to)f Fh([call,)21 b(exit,)g(redo,)f(fail,)h (exception])33 1213 y Fg(\017)f Fh(half)p Fm(:)d(equiv)n(alen)o(t)d(to) f Fh([call,)21 b(redo])33 1296 y Fg(\017)f Fh(loose)p Fm(:)d(equiv)n(alen)o(t)c(to)h Fh([call])33 1379 y Fg(\017)20 b Fh(none)p Fm(:)d(equiv)n(alen)o(t)d(to)f Fh([])33 1462 y Fg(\017)20 b Fh(tight)p Fm(:)d(equiv)n(alen)o(t)c(to)h Fh([call,)21 b(redo,)f(fail,)h(exception])-30 1545 y Fm(When)13 b(an)g(unleashed)h(p)q(ort)f(is)f(encoun)o(tered)j(the)f (debugger)f(con)o(tin)o(ues)h(to)e(sho)o(w)h(the)h(asso)q(ciated)f (goal)f(but)h(do)q(es)g(not)-30 1595 y(stop)i(the)f(execution)h(to)f (prompt)f(the)i(user.)-30 1752 y Fi(4.3.3)48 b(Sp)o(y-p)q(oin)o(ts)-30 1879 y Fm(When)11 b(dealing)f(with)h(big)f(sources)j(it)d(is)h(not)f(v) o(ery)i(practical)e(to)h(creep)h(through)f(the)h(en)o(tire)f(program.) 17 b(It)11 b(is)f(preferable)-30 1929 y(to)15 b(de\014ne)g(a)f(set)h (of)f(sp)o(y-p)q(oin)o(ts)g(on)g(in)o(teresting)h(predicates)h(to)e(b)q (e)h(prompted)g(when)f(the)h(debugger)g(reac)o(hes)h(one)f(of)-30 1978 y(these)e(predicates.)18 b(Sp)o(y-p)q(oin)o(ts)10 b(can)h(b)q(e)h(added)f(either)g(using)g Fh(spy/1)f Fm(\(or)h Fh(spypoint)p 1316 1978 V 14 w(condition/3)p Fm(\))d(or)j(dynamically) -30 2028 y(when)h(prompted)f(b)o(y)g(the)g(debugger)h(using)e(the)i Fh(+)e Fm(\(or)h Fh(*)p Fm(\))g(debugger)g(command)f(\(section)i(4.5,)e (page)h(31\).)16 b(The)c(curren)o(t)-30 2078 y(mo)q(de)i(of)f(leashing) g(do)q(es)i(not)e(a\013ect)i(sp)o(y-p)q(oin)o(ts)e(in)h(the)g(sense)h (that)f(user)h(in)o(teraction)e(is)h(requested)h(on)f(ev)o(ery)g(p)q (ort.)-30 2178 y Fh(spy\(PredSpec\))9 b Fm(sets)k(a)e(sp)o(y-p)q(oin)o (t)g(on)h(all)e(the)i(predicates)h(giv)o(en)e(b)o(y)h Fh(PredSpec)p Fm(.)k Fh(PredSpec)9 b Fm(de\014nes)k(one)f(or)g(sev)o (eral)-30 2227 y(predicates)k(and)e(has)g(one)g(of)f(the)h(follo)o (wing)e(forms:)33 2310 y Fg(\017)20 b Fh([PredSpec1,)g(PredSpec2,...])p Fm(:)15 b(set)g(a)e(sp)o(y-p)q(oin)o(t)h(for)f(eac)o(h)i(elemen)o(t)f (of)f(the)i(list.)33 2393 y Fg(\017)20 b Fh(Name)p Fm(:)d(set)e(a)f(sp) o(y-p)q(oin)o(t)f(for)h(an)o(y)f(predicate)i(whose)g(name)e(is)h Fh(Name)f Fm(\(whatev)o(er)i(the)f(arit)o(y\).)33 2476 y Fg(\017)20 b Fh(Name/Arity)p Fm(:)c(set)f(a)f(sp)o(y-p)q(oin)o(t)f (for)h(the)g(predicate)h(whose)f(name)g(is)g Fh(Name)f Fm(and)h(arit)o(y)f(is)h Fh(Arity)p Fm(.)33 2559 y Fg(\017)20 b Fh(Name/A1-A2)p Fm(:)i(set)17 b(a)f(sp)o(y-p)q(oin)o(t)h(for)f(the)h (eac)o(h)g(predicate)h(whose)f(name)g(is)f Fh(Name)g Fm(and)g(arit)o(y)g(is)h(b)q(et)o(w)o(een)h Fh(A1)74 2609 y Fm(and)c Fh(A2)p Fm(.)-30 2692 y(It)g(is)g(not)g(p)q(ossible)g (to)g(set)h(a)e(sp)o(y-p)q(oin)o(t)h(on)f(an)h(unde\014ned)h (predicate.)-30 2792 y(The)g(follo)o(wing)c(predicate)k(is)f(used)h(to) e(remo)o(v)o(e)h(one)g(or)g(sev)o(eral)h(sp)o(y-p)q(oin)o(ts:)-30 2892 y Fh(nospy\(PredSpec\))c Fm(remo)o(v)o(es)k(the)f(sp)o(y-p)q(oin)o (ts)g(from)f(the)h(sp)q(eci\014ed)i(predicates.)p eop end %%Page: 31 33 TeXDict begin 31 32 bop -30 -45 a Fm(4.4)41 b(Debugging)13 b(messages)1386 b(31)p -30 -27 1890 4 v -30 115 a Fh(nospyall/0)12 b Fm(remo)o(v)o(es)j(all)d(sp)o(y-p)q(oin)o(ts:)-30 215 y(It)i(is)g(also)f(p)q(ossible)i(to)e(de\014ne)i(conditional)e(sp)o (y-p)q(oin)o(ts.)-30 314 y Fh(spypoint)p 149 314 14 2 v 15 w(condition\(Goal,)18 b(Port,)j(Test\))11 b Fm(sets)j(a)f (conditional)e(sp)o(y-p)q(oin)o(t)h(on)g(the)h(predicate)h(for)e Fh(Goal)p Fm(.)17 b(When)-30 364 y(the)d(debugger)g(reac)o(hes)g(a)f (conditional)f(sp)o(y-p)q(oin)o(t)g(it)h(only)f(sho)o(ws)h(the)h(asso)q (ciated)g(goal)d(if)i(the)g(follo)o(wing)e(conditions)-30 414 y(are)k(v)o(eri\014ed:)33 497 y Fg(\017)20 b Fm(the)15 b(actual)e(goal)g(uni\014es)h(with)g Fh(Goal)p Fm(.)33 580 y Fg(\017)20 b Fm(the)15 b(actual)e(p)q(ort)h(uni\014es)h(with)e Fh(Port)p Fm(.)33 663 y Fg(\017)20 b Fm(the)15 b(Prolog)e(goal)g Fh(Test)g Fm(succeeds.)-30 829 y Ff(4.4)56 b(Debugging)18 b(messages)-30 955 y Fm(W)m(e)11 b(here)h(describ)q(ed)h(whic)o(h)e (information)e(is)i(displa)o(y)o(ed)f(b)o(y)h(the)h(debugger)f(when)h (it)f(sho)o(ws)g(a)g(goal.)k(The)d(basic)f(format)-30 1005 y(is)j(as)g(follo)o(ws:)74 1088 y Fd(S)22 b(N)f(M)h(Port)6 b Fh(:)22 b Fd(Goal)28 b Fh(?)-30 1171 y Fd(S)19 b Fm(is)11 b(a)g(sp)o(y-p)q(oin)o(t)g(indicator:)17 b(if)10 b(there)j(is)e(a)g(sp) o(y-p)q(oin)o(t)g(on)h(the)g(curren)o(t)h(goal)d(the)i Fh(+)f Fm(sym)o(b)q(ol)g(is)g(displa)o(y)o(ed)g(else)h(a)f(space)-30 1221 y(is)h(displa)o(y)o(ed.)k Fd(N)i Fm(is)12 b(the)f(in)o(v)o(o)q (cation)f(n)o(um)o(b)q(er.)18 b(This)11 b(unique)g(n)o(um)o(b)q(er)h (can)f(b)q(e)h(used)h(to)e(correlate)h(the)g(trace)g(messages)-30 1271 y(for)i(the)h(v)n(arious)f(p)q(orts,)g(since)h(it)f(is)g(unique)g (for)g(ev)o(ery)h(in)o(v)o(o)q(cation.)j Fd(M)j Fm(is)14 b(an)g(index)g(n)o(um)o(b)q(er)h(whic)o(h)f(represen)o(ts)j(the)-30 1321 y(n)o(um)o(b)q(er)e(of)f(direct)h(ancestors)h(of)d(the)i(goal)e (\(i.e.)19 b(the)c(curren)o(t)h(depth)f(of)f(the)h(goal\).)j Fd(Port)i Fm(sp)q(eci\014es)d(the)d(particular)-30 1370 y(p)q(ort)j(\()p Fh(call)p Fm(,)f Fh(exit)p Fm(,)g Fh(fail)p Fm(,)f Fh(redo)p Fm(,)h Fh(exception)p Fm(\).)24 b Fd(Goal)e Fm(is)16 b(the)h(curren)o(t)h(goal)d(\(it)i(is)f(then)h(p)q(ossible)f (to)h(insp)q(ect)g(its)-30 1420 y(curren)o(t)k(instan)o(tiation\))d (whic)o(h)h(is)g(displa)o(y)o(ed)f(using)i Fh(write)p 970 1420 V 14 w(term/3)e Fm(with)h Fh(quoted\(true\))e Fm(and)i Fh(max)p 1667 1420 V 15 w(depth\()p Fd(D)5 b Fh(\))-30 1470 y Fm(options)13 b(\(section)h(7.14.6,)d(page)i(96\).)k (Initially)12 b Fd(D)19 b Fm(\(the)14 b(prin)o(t)f(depth\))h(is)f(set)h (to)f(10)f(but)h(can)g(b)q(e)h(rede\014ned)h(using)e(the)-30 1520 y Fh(<)j Fm(debugger)h(command)f(\(section)h(4.5,)e(page)h(31\).) 25 b(The)17 b Fh(?)25 b Fm(sym)o(b)q(ol)15 b(is)h(displa)o(y)o(ed)g (when)h(the)g(debugger)g(is)f(w)o(aiting)-30 1570 y(a)h(command)g(from) f(the)i(user.)29 b(\(i.e.)f Fh(Port)16 b Fm(is)h(a)g(leashed)h(p)q (ort\).)29 b(If)17 b(the)g(p)q(ort)h(is)f(unleashed,)h(this)g(sym)o(b)q (ol)e(is)h(not)-30 1619 y(displa)o(y)o(ed)d(and)f(the)i(debugger)g(con) o(tin)o(ues)f(the)h(execution)f(displa)o(ying)e(the)j(next)f(goal.)-30 1785 y Ff(4.5)56 b(Debugger)18 b(commands)-30 1912 y Fm(When)e(the)f(debugger)h(reac)o(hes)h(a)d(leashed)i(p)q(ort)f(it)g (sho)o(ws)g(the)h(curren)o(t)g(goal)e(follo)o(w)o(ed)g(b)o(y)g(the)i Fh(?)22 b Fm(sym)o(b)q(ol.)e(A)o(t)15 b(this)-30 1962 y(p)q(oin)o(t)h(there)h(are)f(man)o(y)f(commands)h(a)o(v)n(ailable.)22 b(T)o(yping)15 b Fh(RETURN)g Fm(will)f(creep)k(in)o(to)d(the)h (program.)24 b(Con)o(tin)o(uing)14 b(to)-30 2012 y(creep)20 b(will)d(sho)o(w)h(all)f(the)i(con)o(trol)f(\015o)o(w.)31 b(The)19 b(debugger)g(sho)o(ws)f(ev)o(ery)h(p)q(ort)g(for)f(ev)o(ery)h (predicate)g(encoun)o(tered)-30 2061 y(during)14 b(the)h(execution.)j (It)c(is)g(p)q(ossible)g(to)g(select)h(the)g(p)q(orts)f(at)g(whic)o(h)g (the)g(debugger)h(will)d(prompt)i(the)g(user)h(using)-30 2111 y(the)g(built-in)e(predicate)i Fh(leash/1)d Fm(\(section)j(4.3.2,) c(page)j(30\).)k(Eac)o(h)c(command)f(is)h(only)f(one)h(c)o(haracter)h (long:)p eop end %%Page: 32 34 TeXDict begin 32 33 bop -30 -45 a Fm(32)1522 b(4)41 b(DEBUGGING)p -30 -27 1890 4 v -30 75 1880 2 v -30 125 2 50 v -3 110 a(Command)p 209 125 V 152 w(Name)p 568 125 V 153 w(Description)p 1848 125 V -30 127 1880 2 v -30 136 V -30 186 2 50 v 15 171 a Fh(RET)13 b Fm(or)h Fh(c)p 209 186 V 175 w Fm(creep)p 568 186 V 160 w(single-step)g(to)g(the)h(next)f(p)q(ort)p 1848 186 V -30 188 1880 2 v -30 288 2 100 v 80 223 a Fh(l)p 209 288 V 250 w Fm(leap)p 568 288 V 169 w(con)o(tin)o(ue)i(the)g (execution)g(only)f(stopping)g(when)h(a)g(goal)e(with)h(a)h(sp)o(y-p)q (oin)o(t)595 273 y(is)e(reac)o(hed)p 1848 288 V -30 289 1880 2 v -30 389 2 100 v 80 324 a Fh(s)p 209 389 V 251 w Fm(skip)p 568 389 V 169 w(skip)h(o)o(v)o(er)h(the)g(en)o(tire)g (execution)h(of)e(the)h(curren)o(t)h(goal.)22 b(No)15 b(message)i(will)595 374 y(b)q(e)d(sho)o(wn)g(un)o(til)f(con)o(trol)h (returns)p 1848 389 V -30 391 1880 2 v -30 490 2 100 v 80 425 a Fh(G)p 209 490 V 241 w Fm(go)g(to)p 568 490 V 159 w(ask)d(for)g(an)f(in)o(v)o(o)q(cation)g(n)o(um)o(b)q(er)h(and)g (con)o(tin)o(ue)h(the)f(execution)h(un)o(til)e(a)h(p)q(ort)595 475 y(is)j(reac)o(hed)h(for)e(that)h(in)o(v)o(o)q(cation)f(n)o(um)o(b)q (er)p 1848 490 V -30 492 1880 2 v -30 691 2 200 v 80 527 a Fh(r)p 209 691 V 243 w Fm(retry)p 568 691 V 162 w(try)e(to)f(restart)i(the)g(in)o(v)o(o)q(cation)d(of)h(the)h(curren)o (t)h(goal)e(b)o(y)g(failing)f(un)o(til)h(reac)o(h-)595 577 y(ing)16 b(the)h(in)o(v)o(o)q(cation)f(of)g(the)i(goal.)25 b(The)18 b(state)f(of)f(execution)i(is)f(the)g(same)595 626 y(as)12 b(when)h(the)g(goal)e(w)o(as)h(initially)d(in)o(v)o(ok)o (ed)j(\(except)i(when)e(using)g(side-e\013ect)595 676 y(predicates\))p 1848 691 V -30 693 1880 2 v -30 743 2 50 v 80 728 a Fh(f)p 209 743 V 259 w Fm(fail)p 568 743 V 176 w(force)i(the)h(curren)o(t)g(goal)e(to)h(fail)e(immediately)p 1848 743 V -30 744 1880 2 v -30 794 2 50 v 80 779 a Fh(w)p 209 794 V 241 w Fm(write)p 568 794 V 160 w(sho)o(w)i(the)g(curren)o(t)i (goal)c(using)i Fh(write/2)f Fm(\(section)i(7.14.6,)c(page)j(96\))p 1848 794 V -30 796 1880 2 v -30 845 2 50 v 80 831 a Fh(d)p 209 845 V 224 w Fm(displa)o(y)p 568 845 V 141 w(sho)o(w)g(the)g(curren) o(t)i(goal)c(using)i Fh(display/2)e Fm(\(section)j(7.14.6,)d(page)h (96\))p 1848 845 V -30 847 1880 2 v -30 897 2 50 v 80 882 a Fh(p)p 209 897 V 243 w Fm(prin)o(t)p 568 897 V 161 w(sho)o(w)h(the)g(curren)o(t)i(goal)c(using)i Fh(print/2)f Fm(\(section)i(7.14.6,)c(page)j(96\))p 1848 897 V -30 899 1880 2 v -30 948 2 50 v 80 933 a Fh(e)p 209 948 V 201 w Fm(exception)p 568 948 V 121 w(sho)o(w)g(the)g(p)q(ending)g (exception.)19 b(Only)14 b(applicable)f(to)g(an)h Fh(exception)e Fm(p)q(ort)p 1848 948 V -30 950 1880 2 v -30 1000 2 50 v 80 985 a Fh(g)p 209 1000 V 204 w Fm(ancestors)p 568 1000 V 124 w(sho)o(w)i(the)g(list)g(of)f(ancestors)i(of)f(the)g(curren) o(t)i(goal)p 1848 1000 V -30 1002 1880 2 v -30 1101 2 100 v 80 1036 a Fh(A)p 209 1101 V 182 w Fm(alternativ)o(es)p 568 1101 V 101 w(sho)o(w)e(the)h(list)e(of)h(ancestors)i(of)d(the)i (curren)o(t)g(goal)e(com)o(bined)h(with)g(c)o(hoice-)595 1086 y(p)q(oin)o(ts)p 1848 1101 V -30 1103 1880 2 v -30 1252 2 150 v 80 1138 a Fh(u)p 209 1252 V 241 w Fm(unify)p 568 1252 V 159 w(ask)j(for)h(a)f(term)h(and)f(unify)g(the)h(curren)o(t) h(goal)d(with)h(this)h(term.)29 b(This)17 b(is)595 1188 y(con)o(v)o(enien)o(t)f(for)f(getting)h(a)f(sp)q(eci\014c)i(solution.) 22 b(Only)16 b(a)o(v)n(ailable)d(at)j(a)f Fh(call)595 1237 y Fm(p)q(ort)p 1848 1252 V -30 1254 1880 2 v -30 1354 2 100 v 80 1289 a Fh(.)p 209 1354 V 200 w Fm(father)f(\014le)p 568 1354 V 119 w(sho)o(w)j(the)i(Prolog)d(\014le)i(name)f(and)h(the)g (line)f(n)o(um)o(b)q(er)h(where)h(the)f(curren)o(t)595 1339 y(predicate)d(is)f(de\014ned)p 1848 1354 V -30 1355 1880 2 v -30 1405 2 50 v 80 1390 a Fh(n)p 209 1405 V 204 w Fm(no)g(debug)p 568 1405 V 123 w(switc)o(h)e(the)h(debugger)g (o\013.)18 b(Same)12 b(as)g Fh(nodebug/0)e Fm(\(section)j(4.3.1,)d (page)j(29\))p 1848 1405 V -30 1407 1880 2 v -30 1506 2 100 v 80 1442 a Fh(=)p 209 1506 V 195 w Fm(debugging)p 568 1506 V 113 w(sho)o(w)18 b(debugger)h(information.)30 b(Same)18 b(as)g Fh(debugging/0)e Fm(\(section)j(4.3.1,)595 1491 y(page)14 b(29\))p 1848 1506 V -30 1508 1880 2 v -30 1608 2 100 v 80 1543 a Fh(+)p 209 1608 V 217 w Fm(sp)o(y)g(this)p 568 1608 V 135 w(set)23 b(a)f(sp)o(y-p)q(oin)o(t)f(on)h(the)h(curren)o (t)h(goal.)41 b(Uses)23 b Fh(spy/1)e Fm(\(section)i(4.3.3,)595 1593 y(page)14 b(30\))p 1848 1608 V -30 1609 1880 2 v -30 1709 2 100 v 80 1644 a Fh(-)p 209 1709 V 195 w Fm(nosp)o(y)g(this)p 568 1709 V 113 w(remo)o(v)o(e)d(a)h(sp)o(y-p)q(oin)o(t)f(on)g(the)h (curren)o(t)h(goal.)j(Uses)d Fh(nospy/1)d Fm(\(section)i(4.3.3,)595 1694 y(page)i(30\))p 1848 1709 V -30 1711 1880 2 v -30 1910 2 200 v 80 1745 a Fh(*)p 209 1910 V 133 w Fm(sp)o(y)g (conditionally)p 568 1910 V 50 w(ask)27 b(for)g(a)f(term)i Fh(Goal,)20 b(Port,)h(Test)26 b Fm(\(terminated)i(b)o(y)f(a)f(dot\))h (and)595 1795 y(set)c(a)f(conditional)g(sp)o(y-p)q(oin)o(t)g(on)g(the)h (curren)o(t)h(predicate.)45 b Fh(Goal)21 b Fm(and)595 1845 y(the)i(curren)o(t)h(goal)e(m)o(ust)g(ha)o(v)o(e)h(the)g(same)g (predicate)h(indicator.)44 b(Uses)595 1895 y Fh(spypoint)p 774 1895 14 2 v 14 w(condition/3)11 b Fm(\(section)k(4.3.3,)d(page)i (30\))p 1848 1910 2 200 v -30 1911 1880 2 v -30 2011 2 100 v 80 1946 a Fh(L)p 209 2011 V 232 w Fm(listing)p 568 2011 V 149 w(list)23 b(all)f(the)i(clauses)g(asso)q(ciated)g(with)f (the)h(curren)o(t)h(predicate.)48 b(Uses)595 1996 y Fh(listing/1)12 b Fm(\(section)j(7.23.3,)c(page)j(138\))p 1848 2011 V -30 2013 1880 2 v -30 2112 2 100 v 80 2048 a Fh(a)p 209 2112 V 238 w Fm(ab)q(ort)p 568 2112 V 157 w(ab)q(ort)24 b(the)g(curren)o(t)h(execution.)48 b(Same)24 b(as)g Fh(abort/0)e Fm(\(section)j(7.18.1,)595 2097 y(page)14 b(112\))p 1848 2112 V -30 2114 1880 2 v -30 2214 2 100 v 80 2149 a Fh(b)p 209 2214 V 237 w Fm(break)p 568 2214 V 156 w(in)o(v)o(ok)o(e)24 b(a)g(recursiv)o(e)i(top-lev)o(el.)50 b(Same)24 b(as)h Fh(break/0)e Fm(\(section)j(7.18.1,)595 2199 y(page)14 b(112\))p 1848 2214 V -30 2215 1880 2 v -30 2265 2 50 v 80 2250 a Fh(@)p 209 2265 V 176 w Fm(execute)i(goal)p 568 2265 V 93 w(ask)e(for)f(a)h(goal)f(and)g(execute)j(it)p 1848 2265 V -30 2267 1880 2 v -30 2366 2 100 v 80 2302 a Fh(<)p 209 2366 V 152 w Fm(set)f(prin)o(t)e(depth)p 568 2366 V 71 w(ask)k(for)f(an)g(in)o(teger)i(and)e(set)i(the)f(prin)o (t)g(depth)g(to)g(this)g(v)n(alue)f(\()p Fh(-1)g Fm(for)g(no)595 2352 y(depth)f(limit\))p 1848 2366 V -30 2368 1880 2 v -30 2418 2 50 v 36 2403 a Fh(h)f Fm(or)g Fh(?)p 209 2418 V 206 w Fm(help)p 568 2418 V 168 w(displa)o(y)f(a)g(summary)h(of)f (a)o(v)n(ailable)f(commands)p 1848 2418 V -30 2420 1880 2 v -30 2469 2 50 v 80 2454 a Fh(W)p 209 2469 V 145 w Fm(W)-5 b(AM)14 b(debugger)p 568 2469 V 64 w(in)o(v)o(ok)o(e)f(the)h (lo)o(w-lev)o(el)f(W)-5 b(AM)14 b(debugger)h(\(section)f(4.6,)f(page)h (32\))p 1848 2469 V -30 2471 1880 2 v -30 2618 a Ff(4.6)56 b(The)18 b(W)-6 b(AM)19 b(debugger)-30 2744 y Fm(In)f(some)g(cases)h (it)e(is)g(in)o(teresting)h(to)g(ha)o(v)o(e)f(access)i(to)f(the)g(W)-5 b(AM)18 b(data)f(structures.)31 b(This)18 b(sub-debugger)g(allo)o(ws) -30 2794 y(the)h(user)f(to)g(insp)q(ect/mo)q(dify)f(the)h(con)o(ten)o (ts)g(of)f(an)o(y)g(stac)o(k)h(or)g(register)g(of)f(the)h(W)-5 b(AM.)17 b(The)h(W)-5 b(AM)18 b(debugger)g(is)-30 2844 y(in)o(v)o(ok)o(ed)e(using)h(the)g(built-in)e(predicate)j Fh(wam)p 712 2844 14 2 v 15 w(debug/0)d Fm(\(section)j(4.3.1,)d(page)h (29\))g(or)h(the)g Fh(W)g Fm(debugger)g(command)-30 2894 y(\(section)e(4.5,)e(page)g(31\).)18 b(The)c(follo)o(wing)e(table)h (presen)o(ts)j(the)f(sp)q(eci\014c)g(commands)f(of)f(the)h(W)-5 b(AM)15 b(debugger:)p eop end %%Page: 33 35 TeXDict begin 33 34 bop -30 -45 a Fm(4.6)41 b(The)14 b(W)-5 b(AM)14 b(debugger)1385 b(33)p -30 -27 1890 4 v -30 75 1838 2 v -30 125 2 50 v -3 110 a(Command)p 306 125 V 147 w(Description)p 1806 125 V -30 127 1838 2 v -30 136 V -30 186 2 50 v -3 171 a Fh(write)13 b Fd(A)21 b Fm([)p Fd(N)6 b Fm(])p 306 186 V 117 w(write)15 b Fd(N)20 b Fm(terms)15 b(starting)f(at)g(the)g(address)h Fd(A)21 b Fm(using)14 b Fh(write/1)f Fm(\(section)h(7.14.6,)e(page)i(96\))p 1806 186 V -30 188 1838 2 v -30 238 2 50 v -3 223 a Fh(data)f Fd(A)21 b Fm([)p Fd(N)6 b Fm(])p 306 238 V 139 w(displa)o(y)14 b Fd(N)21 b Fm(w)o(ords)14 b(starting)g(at)f(the)i(address)g Fd(A)p 1806 238 V -30 239 1838 2 v -30 289 2 50 v -3 274 a Fh(modify)e Fd(A)20 b Fm([)p Fd(N)7 b Fm(])p 306 289 V 95 w(displa)o(y)13 b(and)h(mo)q(dify)f Fd(N)21 b Fm(w)o(ords)14 b(starting)g(at)g(the)g(address)h Fd(A)p 1806 289 V -30 291 1838 2 v -30 341 2 50 v -3 326 a Fh(where)e Fd(A)p 306 341 V 190 w Fm(displa)o(y)g(the)i(real)f(address)h(corresp)q (onding)g(to)e Fd(A)p 1806 341 V -30 342 1838 2 v -30 392 2 50 v -3 377 a Fh(what)g Fd(RA)p 306 392 V 190 w Fm(displa)o(y)g(what)h(corresp)q(onds)i(to)e(the)g(real)g(address)h Fd(RA)p 1806 392 V -30 394 1838 2 v -30 444 2 50 v -3 429 a Fh(deref)e Fd(A)p 306 444 V 190 w Fm(displa)o(y)g(the)i (dereferenced)i(w)o(ord)c(starting)h(at)g(the)g(address)i Fd(A)p 1806 444 V -30 445 1838 2 v -30 495 2 50 v -3 480 a Fh(envir)d Fm([)p Fd(SA)6 b Fm(])p 306 495 V 138 w(displa)o(y)13 b(the)i(con)o(ten)o(ts)g(of)e(the)h(en)o(vironmen)o(t)g (lo)q(cated)g(at)g Fd(SA)21 b Fm(\(or)14 b(the)g(curren)o(t)i(one\))p 1806 495 V -30 497 1838 2 v -30 547 2 50 v -3 532 a Fh(backtrack)c Fm([)p Fd(SA)6 b Fm(])p 306 547 V 51 w(displa)o(y)13 b(the)i(con)o(ten)o(ts)g(of)e(the)h(c)o(hoice-p)q(oin)o(t)g(lo)q(cated) g(at)g Fd(SA)21 b Fm(\(or)14 b(the)g(curren)o(t)i(one\))p 1806 547 V -30 548 1838 2 v -30 598 2 50 v -3 583 a Fh(backtrack)k(all) p 306 598 V 51 w Fm(displa)o(y)13 b(all)g(c)o(hoice-p)q(oin)o(ts)p 1806 598 V -30 600 1838 2 v -30 650 2 50 v -3 635 a Fh(quit)p 306 650 V 247 w Fm(quit)h(the)g(W)-5 b(AM)14 b(debugger)p 1806 650 V -30 651 1838 2 v -30 701 2 50 v -3 686 a Fh(help)p 306 701 V 247 w Fm(displa)o(y)f(a)h(summary)f(of)g(a)o(v)n(ailable)f (commands)p 1806 701 V -30 703 1838 2 v -30 785 a(In)i(the)h(ab)q(o)o (v)o(e)e(table)h(the)h(follo)o(wing)c(con)o(v)o(en)o(tions)j(apply:)33 869 y Fg(\017)20 b Fm(elemen)o(ts)15 b(b)q(et)o(w)o(een)g([)f(and)f(])h (are)g(optional.)33 952 y Fg(\017)20 b Fd(N)h Fm(is)14 b(an)f(optional)g(in)o(teger)h(\(defaults)g(to)g(1\).)33 1035 y Fg(\017)20 b Fd(A)h Fm(is)13 b(a)g(W)-5 b(AM)14 b(address,)g(its)g(syn)o(tax)f(is:)18 b Fd(BANK)p 811 1035 14 2 v 15 w(NAME)i Fm([)13 b Fh([)21 b Fd(N)29 b Fh(])13 b Fm(],)g(i.e.)k(a)c(bank)h(name)f(p)q(ossibly)g(follo)o(w)o (ed)f(b)o(y)h(an)74 1084 y(index)h(\(defaults)g(to)g(0\).)k Fd(BANK)p 567 1084 V 15 w(NAME)i Fm(is)14 b(either:)121 1134 y Fi({)21 b Fh(reg)p Fm(:)c(W)-5 b(AM)14 b(general)g(register)h (\(stac)o(k)g(p)q(oin)o(ters,)f(con)o(tin)o(uation,)e(...\).)121 1201 y Fi({)21 b Fh(x)p Fm(:)c(W)-5 b(AM)14 b(X)g(register)h(\(temp)q (orary)g(v)n(ariables,)d(i.e.)18 b(argumen)o(ts\).)121 1267 y Fi({)j Fh(y)p Fm(:)c(W)-5 b(AM)14 b(Y)g(register)h(\(p)q (ermanen)o(t)g(v)n(ariables\).)121 1333 y Fi({)21 b Fh(ab)p Fm(:)c(W)-5 b(AM)14 b(X)g(register)h(sa)o(v)o(ed)f(in)g(the)g(curren)o (t)i(c)o(hoice-p)q(oin)o(t.)121 1400 y Fi({)21 b Fd(STACK)p 279 1400 V 14 w(NAME)7 b Fm(:)13 b(W)-5 b(AM)14 b(stac)o(k)g(\()p Fd(STACK)p 766 1400 V 15 w(NAME)20 b Fm(in)14 b Fh(local)p Fm(,)e Fh(global)p Fm(,)g Fh(trail)p Fm(,)h Fh(cstr)p Fm(\).)33 1483 y Fg(\017)20 b Fd(SA)h Fm(is)14 b(a)f(W)-5 b(AM)14 b(stac)o(k)h(address,)f(i.e.)k Fd(STACK)p 787 1483 V 14 w(NAME)j Fm([)13 b Fh([)22 b Fd(N)28 b Fh(])14 b Fm(])f(\(sp)q(ecial)i(case)g(of)e(W)-5 b(AM)14 b(addresses\).)33 1566 y Fg(\017)20 b Fd(RA)25 b Fm(is)17 b(a)g(real)h(address,)h(its)e (syn)o(tax)h(is)f(the)h(syn)o(tax)g(of)f(C)g(in)o(tegers)i(\(in)e (particular)g(the)h(notation)f Fh(0x...)28 b Fm(is)74 1616 y(recognized\).)-30 1699 y(It)12 b(is)f(p)q(ossible)h(to)f(only)f (use)i(the)g(\014rst)g(letters)h(of)e(a)g(commands)f(and)i(bank)f (names)g(when)h(there)h(is)e(no)g(am)o(biguit)o(y)m(.)j(Also)-30 1749 y(the)i(square)g(brac)o(k)o(ets)g Fh([)f(])g Fm(enclosing)g(the)h (index)f(of)f(a)h(bank)g(name)g(can)g(b)q(e)h(omitted.)21 b(F)m(or)15 b(instance)h(the)g(follo)o(wing)-30 1798 y(command)i(\(sho)o(wing)f(the)h(con)o(ten)o(ts)h(of)e(25)h(consecutiv) o(e)h(w)o(ords)f(of)f(the)i(global)d(stac)o(k)i(from)f(the)i(index)e (3\):)26 b Fh(data)-30 1848 y(global[3])20 b(25)14 b Fm(can)g(b)q(e)g(abbreviated)h(as:)j Fh(d)j(g)h(3)g(25)p Fm(.)p eop end %%Page: 34 36 TeXDict begin 34 35 bop -30 -45 a Fm(34)1522 b(4)41 b(DEBUGGING)p -30 -27 1890 4 v eop end %%Page: 35 37 TeXDict begin 35 36 bop 1819 -45 a Fm(35)p -30 -27 1890 4 v -30 115 a Fn(5)67 b(F)-6 b(ormat)23 b(of)f(de\014nitions)-30 264 y Ff(5.1)56 b(General)18 b(format)-30 390 y Fm(The)d(de\014nition)e (of)h(con)o(trol)f(constructs,)j(directiv)o(es)e(and)g(built-in)f (predicates)i(is)f(presen)o(ted)i(as)e(follo)o(ws:)-30 490 y Fi(T)l(emplates)-30 590 y Fm(Sp)q(eci\014es)i(the)f(t)o(yp)q(es)g (of)f(the)g(argumen)o(ts)h(and)f(whic)o(h)g(of)f(them)i(shall)e(b)q(e)i (instan)o(tiated)f(\(mo)q(de\).)19 b(T)o(yp)q(es)c(and)f(mo)q(des)-30 639 y(are)h(describ)q(ed)g(later)f(\(section)h(5.2,)e(page)g(35\).)-30 739 y Fi(Description)-30 839 y Fm(Describ)q(es)j(the)f(b)q(eha)o(vior)f (\(in)g(the)h(absence)h(of)d(an)o(y)h(error)h(conditions\).)k(It)14 b(is)g(explicitly)f(men)o(tioned)h(when)h(a)f(built-)-30 889 y(in)j(predicate)i(is)e(re-executable)i(on)f(bac)o(ktrac)o(king.)28 b(Prede\014ned)19 b(op)q(erators)g(in)o(v)o(olv)o(ed)d(in)h(the)h (de\014nition)f(are)h(also)-30 938 y(men)o(tioned.)-30 1038 y Fi(Errors)-30 1138 y Fm(Details)c(the)h(error)g(conditions.)k(P) o(ossible)14 b(errors)h(are)g(detailed)f(later)g(\(section)h(5.3,)e (page)h(37\).)19 b(F)m(or)13 b(directiv)o(es,)i(this)-30 1187 y(part)g(is)e(omitted.)-30 1287 y Fi(P)o(ortabilit)o(y)-30 1387 y Fm(Sp)q(eci\014es)j(whether)f(the)g(de\014nition)e(conforms)h (to)g(the)g(ISO)g(standard)h(or)e(is)h(a)g(GNU)f(Prolog)h(extension.) -30 1553 y Ff(5.2)56 b(T)n(yp)r(es)18 b(and)h(mo)r(des)-30 1679 y Fm(The)e(templates)g(part)g(de\014nes,)h(for)f(eac)o(h)g (argumen)o(t)f(of)g(the)h(concerned)i(built-in)c(predicate,)j(its)e(mo) q(de)h(and)f(t)o(yp)q(e.)-30 1729 y(The)j(mo)q(de)f(sp)q(eci\014es)j (whether)e(or)g(not)f(the)h(argumen)o(t)f(m)o(ust)g(b)q(e)h(instan)o (tiated)f(when)h(the)g(built-in)e(predicate)i(is)-30 1779 y(called.)f(The)d(mo)q(de)e(is)h(enco)q(ded)h(with)f(a)g(sym)o(b)q (ol)f(just)h(b)q(efore)g(the)h(t)o(yp)q(e.)j(P)o(ossible)c(mo)q(des)h (are:)33 1862 y Fg(\017)20 b Fh(+)p Fm(:)e(the)d(argumen)o(t)e(m)o(ust) h(b)q(e)h(instan)o(tiated.)33 1945 y Fg(\017)20 b Fh(-)p Fm(:)e(the)d(argumen)o(t)e(m)o(ust)h(b)q(e)h(a)e(v)n(ariable)g(\(will)g (b)q(e)h(instan)o(tiated)g(if)f(the)h(built-in)f(predicate)i (succeeds\).)33 2028 y Fg(\017)20 b Fh(?)p Fm(:)e(the)d(argumen)o(t)e (can)h(b)q(e)h(instan)o(tiated)f(or)f(a)h(v)n(ariable.)-30 2111 y(The)h(t)o(yp)q(e)f(of)f(an)h(argumen)o(t)g(is)g(de\014ned)h(b)o (y)e(the)i(follo)o(wing)c(table:)p eop end %%Page: 36 38 TeXDict begin 36 37 bop -30 -45 a Fm(36)1235 b(5)41 b(F)o(ORMA)m(T)13 b(OF)i(DEFINITIONS)p -30 -27 1890 4 v -30 75 1871 2 v -30 125 2 50 v -3 110 a(T)o(yp)q(e)p 430 125 V 366 w(Description)p 1840 125 V -30 127 1871 2 v -30 136 V -30 186 2 50 v -3 171 a Fd(TYPE)p 94 171 14 2 v 22 w Fh(list)p 430 186 2 50 v 261 w Fm(a)f(list)f(whose)i(the)f(t)o(yp)q(e)h(of)e(eac)o(h)i (elemen)o(t)f(is)g Fd(TYPE)p 1840 186 V -30 188 1871 2 v -30 238 2 50 v -3 223 a(TYPE1)p 116 223 14 2 v 22 w Fh(or)p 176 223 V 15 w Fd(TYPE2)p 430 238 2 50 v 158 w Fm(a)g(term)g(whose)h(t)o(yp)q(e)f(is)g(either)h Fd(TYPE1)20 b Fm(or)14 b Fd(TYPE2)p 1840 238 V -30 239 1871 2 v -30 289 2 50 v -3 274 a Fh(atom)p 430 289 V 371 w Fm(an)g(atom)p 1840 289 V -30 291 1871 2 v -30 341 2 50 v -3 326 a Fh(atom)p 88 326 14 2 v 15 w(property)p 430 341 2 50 v 180 w Fm(an)g(atom)f(prop) q(ert)o(y)i(\(section)g(7.19.12,)c(page)j(120\))p 1840 341 V -30 342 1871 2 v -30 392 2 50 v -3 377 a Fh(boolean)p 430 392 V 305 w Fm(the)h(atom)e Fh(true)g Fm(or)h Fh(false)p 1840 392 V -30 394 1871 2 v -30 444 2 50 v -3 429 a(byte)p 430 444 V 371 w Fm(an)g(in)o(teger)g Fg(\025)h Fm(0)e(and)h Fg(\024)g Fm(255)p 1840 444 V -30 445 1871 2 v -30 495 2 50 v -3 480 a Fh(callable)p 176 480 14 2 v 14 w(term)p 430 495 2 50 v 181 w Fm(an)g(atom)f(or)h(a)g(comp)q(ound)f(term)p 1840 495 V -30 497 1871 2 v -30 547 2 50 v -3 532 a Fh(character)p 430 547 V 261 w Fm(a)h(single)g(c)o(haracter)h(atom)p 1840 547 V -30 548 1871 2 v -30 598 2 50 v -3 583 a Fh(character)p 198 583 14 2 v 14 w(code)p 430 598 2 50 v 159 w Fm(an)f(in)o(teger)g Fg(\025)h Fm(1)e(and)h Fg(\024)g Fm(255)p 1840 598 V -30 600 1871 2 v -30 650 2 50 v -3 635 a Fh(clause)p 430 650 V 327 w Fm(a)g(clause)h(\(fact)f(or)f(rule\))p 1840 650 V -30 651 1871 2 v -30 701 2 50 v -3 686 a Fh(close)p 110 686 14 2 v 15 w(option)p 430 701 2 50 v 202 w Fm(a)h(close)g (option)g(\(section)g(7.10.7,)e(page)i(72\))p 1840 701 V -30 703 1871 2 v -30 753 2 50 v -3 738 a Fh(compound)p 176 738 14 2 v 14 w(term)p 430 753 2 50 v 181 w Fm(a)g(comp)q(ound)g (term)p 1840 753 V -30 754 1871 2 v -30 804 2 50 v -3 789 a Fh(evaluable)p 430 804 V 261 w Fm(an)g(arithmetic)g(expression)h (\(section)g(7.6.1,)c(page)j(57\))p 1840 804 V -30 806 1871 2 v -30 855 2 50 v -3 841 a Fh(fd)p 44 841 14 2 v 15 w(bool)p 147 841 V 15 w(evaluable)p 430 855 2 50 v 99 w Fm(a)g(b)q(o)q(olean)g(FD)f(expression)i(\(section)g(8.7.1,)d (page)i(173\))p 1840 855 V -30 857 1871 2 v -30 907 2 50 v -3 892 a Fh(fd)p 44 892 14 2 v 15 w(labeling)p 235 892 V 14 w(option)p 430 907 2 50 v 78 w Fm(an)g(FD)g(lab)q(eling)e (option)i(\(section)g(8.9.1,)e(page)i(179\))p 1840 907 V -30 909 1871 2 v -30 958 2 50 v -3 943 a Fh(fd)p 44 943 14 2 v 15 w(evaluable)p 430 958 2 50 v 202 w Fm(an)g(arithmetic)g (FD)g(expression)h(\(section)f(8.6.1,)e(page)i(170\))p 1840 958 V -30 960 1871 2 v -30 1010 2 50 v -3 995 a Fh(fd)p 44 995 14 2 v 15 w(variable)p 430 1010 2 50 v 224 w Fm(an)g(FD)g(v)n(ariable)p 1840 1010 V -30 1012 1871 2 v -30 1061 2 50 v -3 1046 a Fh(flag)p 430 1061 V 371 w Fm(a)g(Prolog)f(\015ag)h(\(section)g(7.22.1,)e(page)i(133\))p 1840 1061 V -30 1063 1871 2 v -30 1113 2 50 v -3 1098 a Fh(float)p 430 1113 V 349 w Fm(a)g(\015oating)f(p)q(oin)o(t)g(n)o(um) o(b)q(er)p 1840 1113 V -30 1114 1871 2 v -30 1164 2 50 v -3 1149 a Fh(head)p 430 1164 V 371 w Fm(a)h(head)g(of)g(a)f(clause)i (\(atom)e(or)h(comp)q(ound)f(term\))p 1840 1164 V -30 1166 1871 2 v -30 1216 2 50 v -3 1201 a Fh(integer)p 430 1216 V 305 w Fm(an)h(in)o(teger)p 1840 1216 V -30 1217 1871 2 v -30 1267 2 50 v -3 1252 a Fh(in)p 44 1252 14 2 v 15 w(byte)p 430 1267 2 50 v 312 w Fm(an)g(in)o(teger)g Fg(\025)h Fm(0)e(and)h Fg(\024)g Fm(255)f(or)h Fh(-1)f Fm(\(for)h(the)h(end-of-\014le\))p 1840 1267 V -30 1269 1871 2 v -30 1319 2 50 v -3 1304 a Fh(in)p 44 1304 14 2 v 15 w(character)p 430 1319 2 50 v 202 w Fm(a)f(single)g(c)o (haracter)h(atom)e(or)h(the)g(atom)f Fh(end)p 1191 1304 14 2 v 15 w(of)p 1250 1304 V 16 w(file)g Fm(\(for)g(the)i (end-of-\014le\))p 1840 1319 2 50 v -30 1320 1871 2 v -30 1370 2 50 v -3 1355 a Fh(in)p 44 1355 14 2 v 15 w(character)p 257 1355 V 14 w(code)p 430 1370 2 50 v 100 w Fm(an)f(in)o(teger)g Fg(\025)h Fm(1)e(and)h Fg(\024)g Fm(255)f(or)h Fh(-1)f Fm(\(for)h(the)h(end-of-\014le\))p 1840 1370 V -30 1372 1871 2 v -30 1422 2 50 v -3 1407 a Fh(io)p 44 1407 14 2 v 15 w(mode)p 430 1422 2 50 v 312 w Fm(an)f(atom)f(in:)18 b Fh(read)p Fm(,)12 b Fh(write)h Fm(or)h Fh(append)p 1840 1422 V -30 1423 1871 2 v -30 1473 2 50 v -3 1458 a(list)p 430 1473 V 371 w Fm(the)h(empt)o(y)f(list)f Fh([])h Fm(or)g(a)f(non-empt)o(y)h(list)f Fh([)p 1169 1458 14 2 v 16 w(|)p 1207 1458 V 15 w(])p 1840 1473 2 50 v -30 1475 1871 2 v -30 1525 2 50 v -3 1510 a(nonvar)p 430 1525 V 327 w Fm(an)o(y)h(term)g(that)g(is)g(not)g(a)f(v)n(ariable)p 1840 1525 V -30 1526 1871 2 v -30 1576 2 50 v -3 1561 a Fh(number)p 430 1576 V 327 w Fm(an)h(in)o(teger)g(or)g(a)g (\015oating)f(p)q(oin)o(t)g(n)o(um)o(b)q(er)p 1840 1576 V -30 1578 1871 2 v -30 1628 2 50 v -3 1613 a Fh(operator)p 176 1613 14 2 v 14 w(specifier)p 430 1628 2 50 v 71 w Fm(an)h(op)q(erator)h(sp)q(eci\014er)g(\(section)g(7.14.10,)c(page)j (100\))p 1840 1628 V -30 1629 1871 2 v -30 1679 2 50 v -3 1664 a Fh(os)p 44 1664 14 2 v 15 w(file)p 147 1664 V 15 w(property)p 430 1679 2 50 v 121 w Fm(an)g(op)q(erating)g(system)h (\014le)e(prop)q(ert)o(y)i(\(section)g(7.27.11,)c(page)j(147\))p 1840 1679 V -30 1681 1871 2 v -30 1830 2 150 v -3 1716 a Fh(predicate)p 198 1716 14 2 v 14 w(indicator)p 430 1830 2 150 v 49 w Fm(a)j(term)f Fh(Name/Arity)f Fm(where)i Fh(Name)f Fm(is)g(an)g(atom)f(and)i Fh(Arity)e Fm(an)h(in)o(teger)h Fg(\025)f Fm(0.)26 b(A)456 1765 y(callable)19 b(term)h(can)f(b)q(e)h (giv)o(en)f(if)g(the)h Fh(strict)p 1230 1765 14 2 v 14 w(iso)f Fm(Prolog)f(\015ag)h(is)h(switc)o(hed)g(o\013)456 1815 y(\(section)15 b(7.22.1,)d(page)i(133\))p 1840 1830 2 150 v -30 1832 1871 2 v -30 1882 2 50 v -3 1867 a Fh(predicate)p 198 1867 14 2 v 14 w(property)p 430 1882 2 50 v 71 w Fm(a)g(predicate)h(prop)q(ert)o(y)g(\(section)g(7.8.2,)c(page)j(65\))p 1840 1882 V -30 1883 1871 2 v -30 1933 2 50 v -3 1918 a Fh(read)p 88 1918 14 2 v 15 w(option)p 430 1933 2 50 v 224 w Fm(a)g(read)g(option)g(\(section)g(7.14.1,)e(page)i(92\))p 1840 1933 V -30 1935 1871 2 v -30 2034 2 100 v -3 1970 a Fh(socket)p 132 1970 14 2 v 14 w(address)p 430 2034 2 100 v 159 w Fm(a)i(term)h(of)e(the)i(form)f Fh('AF)p 888 1970 14 2 v 15 w(UNIX'\(A\))e Fm(or)i Fh('AF)p 1212 1970 V 15 w(INET'\(A,N\))e Fm(where)k Fh(A)e Fm(is)g(an)g(atom)456 2019 y(and)e Fh(N)g Fm(an)f(in)o(teger)p 1840 2034 2 100 v -30 2036 1871 2 v -30 2086 2 50 v -3 2071 a Fh(socket)p 132 2071 14 2 v 14 w(domain)p 430 2086 2 50 v 181 w Fm(an)h(atom)f(in:) 18 b Fh('AF)p 754 2071 14 2 v 15 w(UNIX')13 b Fm(or)h Fh('AF)p 1009 2071 V 15 w(INET')p 1840 2086 2 50 v -30 2088 1871 2 v -30 2137 2 50 v -3 2122 a(source)p 132 2122 14 2 v 14 w(sink)p 430 2137 2 50 v 225 w Fm(an)g(atom)f(iden)o (tifying)g(a)g(source)i(or)f(a)g(sink)p 1840 2137 V -30 2139 1871 2 v -30 2189 2 50 v -3 2174 a Fh(stream)p 430 2189 V 327 w Fm(a)f(stream-term:)18 b(a)13 b(term)g(of)g(the)g(form)f Fh('$stream'\(N\))e Fm(where)15 b Fh(N)d Fm(is)h(an)g(in)o(teger)g Fg(\025)g Fm(0)p 1840 2189 V -30 2190 1871 2 v -30 2240 2 50 v -3 2225 a Fh(stream)p 132 2225 14 2 v 14 w(option)p 430 2240 2 50 v 181 w Fm(a)h(stream)g(option)g(\(section)g(7.10.6,)e (page)i(70\))p 1840 2240 V -30 2242 1871 2 v -30 2292 2 50 v -3 2277 a Fh(stream)p 132 2277 14 2 v 14 w(or)p 190 2277 V 16 w(alias)p 430 2292 2 50 v 143 w Fm(a)g(stream-term)h(or)f (an)f(alias)g(\(atom\))p 1840 2292 V -30 2293 1871 2 v -30 2393 2 100 v -3 2328 a Fh(stream)p 132 2328 14 2 v 14 w(position)p 430 2393 2 100 v 137 w Fm(a)18 b(stream)f(p)q (osition:)25 b(a)17 b(term)g Fh('$stream)p 1135 2328 14 2 v 14 w(position'\(I1,)j(I2,)h(I3,)g(I4\))c Fm(where)456 2378 y Fh(I1)p Fm(,)c Fh(I2)p Fm(,)g Fh(I3)h Fm(and)g Fh(I4)f Fm(are)h(in)o(tegers)p 1840 2393 2 100 v -30 2395 1871 2 v -30 2444 2 50 v -3 2430 a Fh(stream)p 132 2430 14 2 v 14 w(property)p 430 2444 2 50 v 137 w Fm(a)g(stream)g(prop) q(ert)o(y)h(\(section)g(7.10.10,)c(page)j(73\))p 1840 2444 V -30 2446 1871 2 v -30 2496 2 50 v -3 2481 a Fh(stream)p 132 2481 14 2 v 14 w(seek)p 234 2481 V 15 w(method)p 430 2496 2 50 v 78 w Fm(an)g(atom)f(in:)18 b Fh(bof)p Fm(,)13 b Fh(current)f Fm(or)i Fh(eof)p 1840 2496 V -30 2498 1871 2 v -30 2547 2 50 v -3 2532 a(term)p 430 2547 V 371 w Fm(an)o(y)g(term)p 1840 2547 V -30 2549 1871 2 v -30 2599 2 50 v -3 2584 a Fh(var)p 66 2584 14 2 v 15 w(binding)p 235 2584 V 14 w(option)p 430 2599 2 50 v 78 w Fm(a)g(v)n(ariable)f(binding)g(option)g(\(section)i(7.5.3,)c (page)j(56\))p 1840 2599 V -30 2601 1871 2 v -30 2650 2 50 v -3 2635 a Fh(write)p 110 2635 14 2 v 15 w(option)p 430 2650 2 50 v 202 w Fm(a)g(write)g(option)f(\(section)i(7.14.6,)d (page)h(96\))p 1840 2650 V -30 2652 1871 2 v eop end %%Page: 37 39 TeXDict begin 37 38 bop -30 -45 a Fm(5.3)41 b(Errors)1641 b(37)p -30 -27 1890 4 v -30 115 a Ff(5.3)56 b(Errors)-30 241 y Fi(5.3.1)48 b(General)15 b(format)g(and)g(error)g(con)o(text)-30 368 y Fm(When)h(an)g(error)h(o)q(ccurs)g(an)e(exception)i(of)e(the)h (form:)21 b Fh(error\()p Fd(ErrorTerm)5 b Fh(,)21 b Fd(Caller)6 b Fh(\))16 b Fm(is)f(raised.)24 b Fd(ErrorTerm)d Fm(is)-30 418 y(a)c(term)g(sp)q(ecifying)g(the)g(error)h(\(detailed)f(in)g(next)g (sections\))h(and)f Fd(Caller)23 b Fm(is)16 b(a)h(term)g(sp)q(ecifying) g(the)g(con)o(text)h(of)-30 467 y(the)d(error.)20 b(The)14 b(con)o(text)h(is)f(either)h(the)g(predicate)g(indicator)f(of)f(the)i (last)f(in)o(v)o(ok)o(ed)f(built-in)g(predicate)i(or)f(an)g(atom)-30 517 y(giving)f(general)h(con)o(text)h(information.)-30 617 y(Using)g(exceptions)g(allo)o(ws)f(the)h(user)g(b)q(oth)g(to)f (reco)o(v)o(er)i(an)e(error)i(using)f Fh(catch/3)e Fm(\(section)i (6.2.4,)d(page)j(47\))f(and)g(to)-30 667 y(raise)h(an)e(error)i(using)f Fh(throw/1)f Fm(\(section)h(6.2.4,)e(page)i(47\).)-30 766 y(T)m(o)g(illustrate)f(ho)o(w)h(to)f(write)i(error)f(cases,)h(let)f (us)g(write)h(a)e(predicate)i Fh(my)p 1149 766 14 2 v 16 w(pred\(X\))d Fm(where)j Fh(X)f Fm(m)o(ust)f(b)q(e)i(an)f(in)o (teger:)74 849 y Fh(my_pred\(X\))20 b(:-)249 899 y(\()65 b(nonvar\(X\))20 b(->)336 949 y(true)249 999 y(;)65 b (throw\(error\(inst)o(antia)o(tion_)o(error)o(\),)19 b(my_pred/1\)\),)249 1049 y(\),)249 1098 y(\()65 b(integer\(X\))19 b(->)336 1148 y(true)249 1198 y(;)65 b(throw\(error\(type)o(_erro)o (r\(int)o(eger,)18 b(X\),)j(my_pred/1\)\))249 1248 y(\),)249 1298 y(...)-30 1381 y Fm(T)m(o)14 b(help)h(the)g(user)h(to)f(write)g (these)h(error)f(cases,)h(a)e(set)i(of)e(system)i(predicates)g(is)e (pro)o(vided)h(to)f(raise)h(errors.)22 b(These)-30 1430 y(predicates)15 b(are)e(of)f(the)h(form)f Fh('$pl)p 538 1430 V 15 w(err)p 619 1430 V 15 w(...')17 b Fm(and)c(they)g(all)e (refer)j(to)e(the)i(implicit)d(error)i(con)o(text.)19 b(The)13 b(predicates)-30 1480 y Fh(set)p 39 1480 V 16 w(bip)p 121 1480 V 15 w(name/2)g Fm(\(section)j(7.22.3,)d(page)i(135\)) g(and)g Fh(current)p 998 1480 V 14 w(bip)p 1078 1480 V 15 w(name/2)f Fm(\(section)i(7.22.4,)c(page)j(135\))g(are)g(pro-)-30 1530 y(vided)h(to)f(set)h(and)g(reco)o(v)o(er)g(the)g(name)f(and)g(the) h(arit)o(y)f(asso)q(ciated)h(with)f(this)h(con)o(text)g(\(an)f(arit)o (y)g Fb(<)g Fm(0)h(means)f(that)-30 1580 y(only)f(the)g(atom)g(corresp) q(onding)h(to)f(the)g(functor)h(is)f(signi\014can)o(t\).)k(Using)c (these)h(system)g(predicates)h(the)e(user)h(could)-30 1630 y(de\014ne)g(the)g(ab)q(o)o(v)o(e)e(predicate)i(as)f(follo)o(w:)74 1713 y Fh(my_pred\(X\))20 b(:-)249 1763 y(set_bip_name\(my)o(_pred)o (,1\),)249 1812 y(\()65 b(nonvar\(X\))20 b(->)336 1862 y(true)249 1912 y(;)65 b('$pl_err_instant)o(iatio)o(n')249 1962 y(\),)249 2012 y(\()g(integer\(X\))19 b(->)336 2061 y(true)249 2111 y(;)65 b('$pl_err_type'\(i)o(ntege)o(r,)19 b(X\))249 2161 y(\),)249 2211 y(...)-30 2294 y Fm(The)c(follo)o(wing)c (sections)k(detail)e(eac)o(h)i(kind)e(of)g(errors)j(\(and)d(asso)q (ciated)i(system)g(predicates\).)-30 2452 y Fi(5.3.2)48 b(Instan)o(tiation)14 b(error)-30 2578 y Fm(An)e(instan)o(tiation)e (error)i(o)q(ccurs)g(when)g(an)f(argumen)o(t)g(or)g(one)g(of)g(its)g (comp)q(onen)o(ts)h(is)f(v)n(ariable)f(while)g(an)h(instan)o(tiated)-30 2628 y(argumen)o(t)j(w)o(as)g(exp)q(ected.)20 b Fd(ErrorTerm)f Fm(has)14 b(the)h(follo)o(wing)c(form:)17 b Fh(instantiation)p 1366 2628 V 13 w(error)p Fm(.)-30 2727 y(The)22 b(system)h(predicate)f Fh('$pl)p 487 2727 V 15 w(err)p 568 2727 V 15 w(instantiation')d Fm(raises)j(this)f(error)i(in)e(the)h(curren)o(t)g(error)h(con)o(text)f (\(sec-)-30 2777 y(tion)14 b(5.3.1,)d(page)j(37\).)p eop end %%Page: 38 40 TeXDict begin 38 39 bop -30 -45 a Fm(38)1235 b(5)41 b(F)o(ORMA)m(T)13 b(OF)i(DEFINITIONS)p -30 -27 1890 4 v -30 115 a Fi(5.3.3)48 b(T)o(yp)q(e)16 b(error)-30 241 y Fm(A)h(t)o(yp)q(e)h(error)g(o)q (ccurs)g(when)f(the)h(t)o(yp)q(e)f(of)g(an)f(argumen)o(t)h(or)g(one)g (of)f(its)h(comp)q(onen)o(ts)h(is)e(not)h(the)h(exp)q(ected)h(t)o(yp)q (e)-30 291 y(\(but)e(not)f(a)g(v)n(ariable\).)23 b Fd(ErrorTerm)f Fm(has)16 b(the)h(follo)o(wing)c(form:)22 b Fh(type)p 1129 291 14 2 v 15 w(error\()p Fd(Type)5 b Fh(,)21 b(Culprit\))15 b Fm(where)i Fd(Type)22 b Fm(is)-30 341 y(the)15 b(exp)q(ected)h(t)o (yp)q(e)e(and)g Fd(Culprit)20 b Fm(the)14 b(argumen)o(t)g(whic)o(h)g (caused)h(the)f(error.)19 b Fd(Type)h Fm(is)14 b(one)g(of:)33 441 y Fg(\017)20 b Fh(atom)33 517 y Fg(\017)g Fh(atomic)33 594 y Fg(\017)g Fh(boolean)33 671 y Fg(\017)g Fh(byte)33 747 y Fg(\017)g Fh(callable)33 824 y Fg(\017)g Fh(character)33 900 y Fg(\017)g Fh(compound)676 441 y Fg(\017)h Fh(evaluable)676 519 y Fg(\017)g Fh(fd)p 765 519 V 15 w(bool)p 868 519 V 15 w(evaluable)676 597 y Fg(\017)g Fh(fd)p 765 597 V 15 w(evaluable)676 675 y Fg(\017)g Fh(fd)p 765 675 V 15 w(variable)676 753 y Fg(\017)g Fh(float)676 831 y Fg(\017)g Fh(in)p 765 831 V 15 w(byte)676 910 y Fg(\017)g Fh(in)p 765 910 V 15 w(character)1320 441 y Fg(\017)g Fh(integer)1320 524 y Fg(\017)g Fh(list)1320 607 y Fg(\017)g Fh(number)1320 690 y Fg(\017)g Fh(predicate)p 1563 690 V 14 w(indicator)1320 773 y Fg(\017)g Fh(variable)-30 1009 y Fm(The)f(system)g(predicate)g Fh('$pl)p 480 1009 V 15 w(err)p 561 1009 V 15 w(type'\(Type,)f(Culprit\))f Fm(raises)i(this)f(error)h(in)e(the)i(curren)o(t)g(error)g(con)o(text) -30 1059 y(\(section)15 b(5.3.1,)d(page)i(37\).)-30 1217 y Fi(5.3.4)48 b(Domain)15 b(error)-30 1343 y Fm(A)j(domain)e(error)j(o) q(ccurs)g(when)f(the)g(t)o(yp)q(e)g(of)f(an)g(argumen)o(t)h(is)f (correct)i(but)f(its)g(v)n(alue)f(is)g(outside)h(the)g(exp)q(ected)-30 1393 y(domain.)28 b Fd(ErrorTerm)23 b Fm(has)18 b(the)g(follo)o(wing)d (form:)25 b Fh(domain)p 955 1393 V 14 w(error\()p Fd(Domain)5 b Fh(,)22 b Fd(Culprit)5 b Fh(\))18 b Fm(where)h Fd(Domain)k Fm(is)18 b(the)-30 1443 y(exp)q(ected)e(domain)d(and)h Fd(Culprit)19 b Fm(the)c(argumen)o(t)f(whic)o(h)f(caused)i(the)g (error.)k Fd(Domain)h Fm(is)13 b(one)h(of:)33 1543 y Fg(\017)20 b Fh(atom)p 165 1543 V 15 w(property)33 1623 y Fg(\017)g Fh(buffering)p 275 1623 V 14 w(mode)33 1704 y Fg(\017)g Fh(character)p 275 1704 V 14 w(code)p 377 1704 V 15 w(list)33 1784 y Fg(\017)g Fh(close)p 187 1784 V 15 w(option)33 1865 y Fg(\017)g Fh(date)p 165 1865 V 15 w(time)33 1946 y Fg(\017)g Fh(eof)p 143 1946 V 15 w(action)33 2026 y Fg(\017)g Fh(fd)p 121 2026 V 16 w(labeling)p 313 2026 V 14 w(option)33 2107 y Fg(\017)g Fh(flag)p 165 2107 V 15 w(value)33 2187 y Fg(\017)g Fh(format)p 209 2187 V 15 w(control)p 378 2187 V 14 w(sequence)33 2268 y Fg(\017)g Fh(g)p 99 2268 V 16 w(array)p 225 2268 V 14 w(index)33 2349 y Fg(\017)g Fh(io)p 121 2349 V 16 w(mode)33 2429 y Fg(\017)g Fh(non)p 143 2429 V 15 w(empty)p 268 2429 V 15 w(list)33 2510 y Fg(\017)g Fh(not)p 143 2510 V 15 w(less)p 246 2510 V 15 w(than)p 349 2510 V 15 w(zero)676 1543 y Fg(\017)h Fh(operator)p 897 1543 V 14 w(priority)676 1622 y Fg(\017)g Fh(operator)p 897 1622 V 14 w(specifier)676 1702 y Fg(\017)g Fh(os)p 765 1702 V 15 w(file)p 868 1702 V 15 w(permission)676 1782 y Fg(\017)g Fh(os)p 765 1782 V 15 w(file)p 868 1782 V 15 w(property)676 1862 y Fg(\017)g Fh(os)p 765 1862 V 15 w(path)676 1942 y Fg(\017)g Fh(predicate)p 919 1942 V 14 w(property)676 2021 y Fg(\017)g Fh(prolog)p 853 2021 V 14 w(flag)676 2101 y Fg(\017)g Fh(read)p 809 2101 V 15 w(option)676 2181 y Fg(\017)g Fh(selectable)p 941 2181 V 14 w(item)676 2261 y Fg(\017)g Fh(socket)p 853 2261 V 14 w(address)676 2341 y Fg(\017)g Fh(socket)p 853 2341 V 14 w(domain)676 2421 y Fg(\017)g Fh(source)p 853 2421 V 14 w(sink)676 2500 y Fg(\017)g Fh(statistics)p 941 2500 V 14 w(key)1320 1543 y Fg(\017)g Fh(statistics)p 1585 1543 V 13 w(value)1320 1626 y Fg(\017)g Fh(stream)1320 1709 y Fg(\017)g Fh(stream)p 1497 1709 V 14 w(option)1320 1792 y Fg(\017)g Fh(stream)p 1497 1792 V 14 w(or)p 1555 1792 V 15 w(alias)1320 1875 y Fg(\017)g Fh(stream)p 1497 1875 V 14 w(position)1320 1958 y Fg(\017)g Fh(stream)p 1497 1958 V 14 w(property)1320 2041 y Fg(\017)g Fh(stream)p 1497 2041 V 14 w(seek)p 1599 2041 V 15 w(method)1320 2124 y Fg(\017)g Fh(stream)p 1497 2124 V 14 w(type)1320 2207 y Fg(\017)g Fh(term)p 1453 2207 V 15 w(stream)p 1600 2207 V 14 w(or)p 1658 2207 V 15 w(alias)1320 2290 y Fg(\017)g Fh(var)p 1431 2290 V 15 w(binding)p 1600 2290 V 14 w(option)1320 2373 y Fg(\017)g Fh(write)p 1475 2373 V 14 w(option)-30 2609 y Fm(The)12 b(system)g(predicate)g Fh('$pl)p 456 2609 V 15 w(err)p 537 2609 V 15 w(domain'\(Domain,)19 b(Culprit\))9 b Fm(raises)j(this)f(error)h(in)f(the)h(curren)o(t)g (error)g(con)o(text)-30 2659 y(\(section)j(5.3.1,)d(page)i(37\).)p eop end %%Page: 39 41 TeXDict begin 39 40 bop -30 -45 a Fm(5.3)41 b(Errors)1641 b(39)p -30 -27 1890 4 v -30 115 a Fi(5.3.5)48 b(Existence)16 b(error)-30 241 y Fm(an)k(existence)i(error)f(o)q(ccurs)g(when)g(an)e (ob)r(ject)i(on)f(whic)o(h)g(an)f(op)q(eration)h(is)g(to)g(b)q(e)g(p)q (erformed)h(do)q(es)f(not)g(exist.)-30 291 y Fd(ErrorTerm)g Fm(has)15 b(the)g(follo)o(wing)c(form:)19 b Fh(existence)p 827 291 14 2 v 14 w(error\()p Fd(Object)t Fh(,)j Fd(Culprit)6 b Fh(\))14 b Fm(where)h Fd(Object)21 b Fm(is)14 b(the)h(t)o(yp)q(e)g (of)-30 341 y(the)g(ob)r(ject)g(and)e Fd(Culprit)20 b Fm(the)14 b(argumen)o(t)g(whic)o(h)g(caused)h(the)f(error.)19 b Fd(Object)h Fm(is)14 b(one)g(of:)33 441 y Fg(\017)20 b Fh(procedure)404 b Fg(\017)21 b Fh(source)p 853 441 V 14 w(sink)368 b Fg(\017)21 b Fh(stream)-30 540 y Fm(The)f(system)g (predicate)g Fh('$pl)p 480 540 V 15 w(err)p 561 540 V 15 w(existence'\(Object)o(,)f(Culprit\))e Fm(raises)j(this)f(error)h (in)f(the)h(curren)o(t)g(error)-30 590 y(con)o(text)15 b(\(section)g(5.3.1,)d(page)h(37\).)-30 748 y Fi(5.3.6)48 b(P)o(ermission)14 b(error)-30 874 y Fm(A)20 b(p)q(ermission)g(error)g (o)q(ccurs)h(when)f(an)f(attempt)h(to)f(p)q(erform)h(a)f(prohibited)g (op)q(eration)g(is)h(made.)34 b Fd(ErrorTerm)-30 924 y Fm(has)16 b(the)h(follo)o(wing)c(form:)20 b Fh(permission)p 637 924 V 14 w(error\()p Fd(Operation)t Fh(,)i Fd(Permission)5 b Fh(,)21 b Fd(Culprit)6 b Fh(\))16 b Fm(where)g Fd(Operation)21 b Fm(is)-30 974 y(the)e(op)q(eration)e(whic)o(h)g(caused)i(the)f (error,)g Fd(Permission)23 b Fm(the)18 b(t)o(yp)q(e)g(of)f(the)h(tried) g(p)q(ermission)f(and)g Fd(Culprit)24 b Fm(the)-30 1024 y(argumen)o(t)14 b(whic)o(h)g(caused)h(the)f(error.)19 b Fd(Operation)h Fm(is)13 b(one)h(of:)33 1123 y Fg(\017)20 b Fh(access)33 1206 y Fg(\017)g Fh(add)p 143 1206 V 15 w(alias)33 1289 y Fg(\017)g Fh(close)676 1123 y Fg(\017)h Fh(create)676 1202 y Fg(\017)g Fh(input)676 1280 y Fg(\017)g Fh(modify)1320 1123 y Fg(\017)g Fh(open)1320 1202 y Fg(\017)g Fh(output)1320 1280 y Fg(\017)g Fh(reposition)-30 1389 y Fm(and)14 b Fd(Permission)19 b Fm(is)14 b(one)g(of:)33 1489 y Fg(\017)20 b Fh(binary)p 209 1489 V 15 w(stream)33 1567 y Fg(\017)g Fh(flag)33 1645 y Fg(\017)g Fh(operator)676 1489 y Fg(\017)h Fh(past)p 809 1489 V 15 w(end)p 890 1489 V 15 w(of)p 949 1489 V 15 w(stream)676 1572 y Fg(\017)g Fh(private)p 875 1572 V 14 w(procedure)676 1655 y Fg(\017)g Fh(source)p 853 1655 V 14 w(sink)1320 1489 y Fg(\017)g Fh(static)p 1497 1489 V 14 w(procedure)1320 1572 y Fg(\017)g Fh(stream)1320 1655 y Fg(\017)g Fh(text)p 1453 1655 V 15 w(stream)-30 1754 y Fm(The)d(system)f(predicate)h Fh('$pl)p 473 1754 V 15 w(err)p 554 1754 V 15 w(permission'\(Operati)o (on,)h(Permission,)g(Culprit\))c Fm(raises)j(this)f(error)h(in)-30 1804 y(the)d(curren)o(t)g(error)g(con)o(text)g(\(section)f(5.3.1,)e (page)i(37\).)-30 1962 y Fi(5.3.7)48 b(Represen)o(tation)13 b(error)-30 2088 y Fm(A)19 b(represen)o(tation)h(error)g(o)q(ccurs)g (when)f(an)f(implemen)o(tation)f(limit)g(has)i(b)q(een)h(breac)o(hed.) 33 b Fd(ErrorTerm)24 b Fm(has)19 b(the)-30 2138 y(follo)o(wing)14 b(form:)21 b Fh(representation)p 576 2138 V 13 w(error\()p Fd(Limit)t Fh(\))16 b Fm(where)h Fd(Limit)22 b Fm(is)16 b(the)g(name)g(of)f(the)h(reac)o(hed)h(limit.)22 b Fd(Limit)-30 2188 y Fm(is)14 b(one)g(of:)33 2287 y Fg(\017)20 b Fh(character)33 2362 y Fg(\017)g Fh(character)p 275 2362 V 14 w(code)33 2437 y Fg(\017)g Fh(in)p 121 2437 V 16 w(character)p 335 2437 V 13 w(code)676 2287 y Fg(\017)h Fh(max)p 787 2287 V 15 w(arity)676 2362 y Fg(\017)g Fh(max)p 787 2362 V 15 w(integer)676 2437 y Fg(\017)g Fh(min)p 787 2437 V 15 w(integer)1320 2287 y Fg(\017)g Fh(too)p 1431 2287 V 15 w(many)p 1534 2287 V 15 w(variables)-30 2536 y Fm(The)15 b(errors)g Fh(max)p 243 2536 V 15 w(integer)d Fm(and)i Fh(min)p 571 2536 V 15 w(integer)f Fm(are)h(not)g(curren)o(tly)h (implemen)o(ted.)-30 2636 y(The)h(system)g(predicate)g Fh('$pl)p 468 2636 V 15 w(err)p 549 2636 V 15 w(representation'\(Li)o (mit\))c Fm(raises)j(this)g(error)i(in)d(the)i(curren)o(t)g(error)g (con)o(text)-30 2686 y(\(section)f(5.3.1,)d(page)i(37\).)p eop end %%Page: 40 42 TeXDict begin 40 41 bop -30 -45 a Fm(40)1235 b(5)41 b(F)o(ORMA)m(T)13 b(OF)i(DEFINITIONS)p -30 -27 1890 4 v -30 115 a Fi(5.3.8)48 b(Ev)m(aluation)17 b(error)-30 241 y Fm(An)e(ev)n(aluation)d(error)j(o) q(ccurs)g(when)g(an)f(arithmetic)f(expression)j(giv)o(es)d(rise)i(to)f (an)f(exceptional)h(v)n(alue.)k Fd(ErrorTerm)-30 291 y Fm(has)c(the)g(follo)o(wing)d(form:)17 b Fh(evaluation)p 627 291 14 2 v 14 w(error\()p Fd(Error)5 b Fh(\))13 b Fm(where)h Fd(Error)20 b Fm(is)13 b(the)h(name)f(of)g(the)h(error.)19 b Fd(Error)h Fm(is)13 b(one)-30 341 y(of:)33 441 y Fg(\017)20 b Fh(float)p 187 441 V 15 w(overflow)33 515 y Fg(\017)g Fh(int)p 143 515 V 15 w(overflow)676 441 y Fg(\017)h Fh(undefined)676 515 y Fg(\017)g Fh(underflow)1320 441 y Fg(\017)g Fh(zero)p 1453 441 V 15 w(divisor)-30 615 y Fm(The)15 b(errors)g Fh(float)p 287 615 V 15 w(overflow)p Fm(,)c Fh(int)p 567 615 V 15 w(overflow)p Fm(,)h Fh(undefined)g Fm(and)i Fh(underflow)e Fm(are)i(not)g(curren)o(tly)h(implemen)o(ted.) -30 715 y(The)g(system)g(predicate)g Fh('$pl)p 465 715 V 15 w(err)p 546 715 V 15 w(evaluation'\(Error\))c Fm(raises)k(this)f (error)h(in)f(the)g(curren)o(t)i(error)f(con)o(text)g(\(sec-)-30 764 y(tion)f(5.3.1,)d(page)j(37\).)-30 922 y Fi(5.3.9)48 b(Resource)15 b(error)-30 1049 y Fm(A)e(resource)h(error)g(o)q(ccurs)g (when)f(GNU)f(Prolog)f(do)q(es)j(not)e(ha)o(v)o(e)g(enough)h (resources.)20 b Fd(ErrorTerm)d Fm(has)c(the)g(follo)o(wing)-30 1098 y(form:)18 b Fh(resource)p 264 1098 V 14 w(error\()p Fd(Resource)t Fh(\))c Fm(where)h Fd(Resource)k Fm(is)14 b(the)g(name)g(of)f(the)i(resource.)20 b Fd(Resource)f Fm(is)14 b(one)g(of:)33 1198 y Fg(\017)20 b Fh(print)p 187 1198 V 15 w(object)p 334 1198 V 14 w(not)p 414 1198 V 15 w(linked)118 b Fg(\017)21 b Fh(too)p 787 1198 V 15 w(big)p 868 1198 V 15 w(fd)p 927 1198 V 15 w(constraint)161 b Fg(\017)21 b Fh(too)p 1431 1198 V 15 w(many)p 1534 1198 V 15 w(open)p 1637 1198 V 15 w(streams)-30 1298 y Fm(The)13 b(system)g(predicate)h Fh('$pl)p 460 1298 V 15 w(err)p 541 1298 V 15 w(resource'\(Resourc)o(e\))9 b Fm(raises)k(this)g(error)g(in)f(the)h(curren)o(t)h(error)f(con)o (text)g(\(sec-)-30 1347 y(tion)h(5.3.1,)d(page)j(37\).)-30 1505 y Fi(5.3.10)48 b(Syn)o(tax)15 b(error)-30 1632 y Fm(A)e(syn)o(tax)g(error)g(o)q(ccurs)i(when)e(a)f(sequence)j(of)d(c)o (haracter)i(do)q(es)f(not)g(conform)f(to)h(the)g(syn)o(tax)g(of)f (terms.)18 b Fd(ErrorTerm)-30 1681 y Fm(has)d(the)f(follo)o(wing)d (form:)18 b Fh(syntax)p 541 1681 V 14 w(error\()p Fd(Error)5 b Fh(\))14 b Fm(where)h Fd(Error)20 b Fm(is)13 b(an)h(atom)f (explaining)g(the)h(error.)-30 1781 y(The)22 b(system)h(predicate)f Fh('$pl)p 487 1781 V 15 w(err)p 568 1781 V 15 w(syntax'\(Error\))d Fm(raises)j(this)f(error)i(in)e(the)h(curren)o(t)g(error)h(con)o(text)f (\(sec-)-30 1831 y(tion)14 b(5.3.1,)d(page)j(37\).)-30 1989 y Fi(5.3.11)48 b(System)15 b(error)-30 2115 y Fm(A)d(system)g (error)g(can)f(o)q(ccur)h(at)f(an)o(y)g(stage.)17 b(A)11 b(system)h(error)g(is)f(generally)g(asso)q(ciated)h(with)e(an)h (external)h(comp)q(onen)o(t)-30 2165 y(\(e.g.)33 b(op)q(erating)19 b(system\).)33 b Fd(ErrorTerm)24 b Fm(has)19 b(the)g(follo)o(wing)e (form:)27 b Fh(system)p 1274 2165 V 14 w(error\()p Fd(Error)5 b Fh(\))19 b Fm(where)g Fd(Error)25 b Fm(is)-30 2215 y(an)18 b(atom)f(explaining)g(the)h(error.)31 b(This)18 b(is)g(an)g(extension)g(to)g(ISO)g(whic)o(h)g(only)f(de\014nes)i Fh(system)p 1581 2215 V 15 w(error)e Fm(without)-30 2264 y(argumen)o(ts.)-30 2364 y(The)22 b(system)h(predicate)f Fh('$pl)p 487 2364 V 15 w(err)p 568 2364 V 15 w(system'\(Error\))d Fm(raises)j(this)f(error)i(in)e(the)h(curren)o(t)g(error)h(con)o(text)f (\(sec-)-30 2414 y(tion)14 b(5.3.1,)d(page)j(37\).)p eop end %%Page: 41 43 TeXDict begin 41 42 bop 1819 -45 a Fm(41)p -30 -27 1890 4 v -30 115 a Fn(6)67 b(Prolog)22 b(directiv)n(es)g(and)h(con)n(trol)f (constructs)-30 264 y Ff(6.1)56 b(Prolog)19 b(directiv)n(es)-30 390 y Fi(6.1.1)48 b(In)o(tro)q(duction)-30 517 y Fm(Prolog)16 b(directiv)o(es)h(are)f(annotations)f(inserted)j(in)d(Prolog)h(source)h (\014les)f(for)g(the)g(compiler.)24 b(A)16 b(Prolog)g(directiv)o(e)g (is)-30 567 y(used)f(to)f(sp)q(ecify:)33 637 y Fg(\017)20 b Fm(the)15 b(prop)q(erties)g(of)e(some)h(pro)q(cedures)j(de\014ned)e (in)e(the)h(source)i(\014le.)33 714 y Fg(\017)k Fm(the)15 b(format)e(and)g(the)i(syn)o(tax)f(for)f(read-terms)i(in)f(the)g (source)h(\014le)f(\(using)g(c)o(hangeable)g(Prolog)f(\015ags\).)33 791 y Fg(\017)20 b Fm(included)14 b(source)h(\014les.)33 867 y Fg(\017)20 b Fm(a)14 b(goal)e(to)i(b)q(e)h(executed)h(at)d (run-time.)-30 1023 y Fi(6.1.2)48 b Fh(dynamic/1)-30 1149 y Fi(T)l(emplates)74 1219 y Fh(dynamic\(+predicate)p 472 1219 14 2 v 12 w(indicator\))74 1269 y(dynamic\(+predicate)p 472 1269 V 12 w(indicator)p 683 1269 V 14 w(list\))74 1319 y(dynamic\(+predicate)p 472 1319 V 12 w(indicator)p 683 1319 V 14 w(sequence\))-30 1390 y Fi(Description)-30 1489 y Fh(dynamic\(Pred\))13 b Fm(sp)q(eci\014es)18 b(that)e(the)g(pro) q(cedure)h(whose)g(predicate)f(indicator)g(is)f Fh(Pred)g Fm(is)g(a)h(dynamic)f(pro)q(cedure.)-30 1539 y(This)g(directiv)o(e)f (mak)o(es)g(it)g(p)q(ossible)g(to)g(alter)h(the)f(de\014nition)g(of)j Fh(Pred)c Fm(b)o(y)h(adding)f(or)h(remo)o(ving)g(clauses.)19 b(F)m(or)14 b(more)-30 1589 y(information)e(refer)j(to)f(the)h(section) f(ab)q(out)g(dynamic)f(clause)i(managemen)o(t)e(\(section)i(7.7.1,)c (page)j(60\).)-30 1689 y(This)g(directiv)o(e)h(shall)e(precede)j(the)e (de\014nition)g(of)i Fh(Pred)d Fm(in)h(the)g(source)h(\014le.)-30 1788 y(If)h(there)g(is)g(no)f(clause)h(for)f Fh(Pred)f Fm(in)h(the)h(source)h(\014le,)e Fh(Pred)g Fm(exists)h(ho)o(w)o(ev)o (er)g(as)f(an)g(empt)o(y)h(predicate)g(\(this)g(means)-30 1838 y(that)e Fh(current)p 217 1838 V 15 w(predicate\(Pred\))c Fm(succeeds\).)-30 1938 y(In)18 b(order)g(to)f(allo)o(w)f(m)o(ultiple)g (de\014nitions,)i Fh(Pred)f Fm(can)h(also)e(b)q(e)j(a)e(list)g(of)g (predicate)h(indicators)g(or)f(a)g(sequence)j(of)-30 1987 y(predicate)15 b(indicators)f(using)g Fh(','/2)f Fm(as)h(separator.)-30 2087 y Fi(P)o(ortabilit)o(y)-30 2187 y Fm(ISO)h(directiv)o(e.)-30 2342 y Fi(6.1.3)48 b Fh(public/1)-30 2468 y Fi(T)l(emplates)74 2539 y Fh (public\(+predicate)p 450 2539 V 12 w(indicator\))74 2588 y(public\(+predicate)p 450 2588 V 12 w(indicator)p 661 2588 V 14 w(list\))74 2638 y(public\(+predicate)p 450 2638 V 12 w(indicator)p 661 2638 V 14 w(sequence\))-30 2709 y Fi(Description)-30 2808 y Fh(public\(Pred\))11 b Fm(sp)q(eci\014es)k(that)e(the)g(pro)q(cedure)i(whose)f(predicate)g (indicator)e(is)h Fh(Pred)f Fm(is)h(a)g(public)g(pro)q(cedure.)19 b(This)-30 2858 y(directiv)o(e)13 b(mak)o(es)e(it)g(p)q(ossible)h(to)g (insp)q(ect)h(the)f(clauses)g(of)j Fh(Pred)p Fm(.)h(F)m(or)11 b(more)h(information)e(refer)i(to)g(the)g(section)g(ab)q(out)-30 2908 y(dynamic)i(clause)g(managemen)o(t)f(\(section)i(7.7.1,)d(page)i (60\).)p eop end %%Page: 42 44 TeXDict begin 42 43 bop -30 -45 a Fm(42)692 b(6)41 b(PR)o(OLOG)14 b(DIRECTIVES)g(AND)f(CONTR)o(OL)h(CONSTR)o(UCTS)p -30 -27 1890 4 v -30 115 a(This)i(directiv)o(e)g(shall)e(precede)k(the)e (de\014nition)f(of)j Fh(Pred)c Fm(in)h(the)h(source)g(\014le.)23 b(Since)16 b(a)f(dynamic)f(pro)q(cedure)k(is)d(also)-30 165 y(public.)j(It)12 b(is)h(useless)h(\(but)f(correct\))h(to)f (de\014ne)g(a)f(public)h(directiv)o(e)g(for)f(a)g(predicate)i(already)e (declared)i(as)e(dynamic.)-30 264 y(In)18 b(order)g(to)f(allo)o(w)f(m)o (ultiple)g(de\014nitions,)i Fh(Pred)f Fm(can)h(also)e(b)q(e)j(a)e(list) g(of)g(predicate)h(indicators)g(or)f(a)g(sequence)j(of)-30 314 y(predicate)15 b(indicators)f(using)g Fh(','/2)f Fm(as)h(separator.)-30 414 y Fi(P)o(ortabilit)o(y)-30 513 y Fm(GNU)k(Prolog)f(directiv)o(e.)31 b(The)19 b(ISO)f(reference)i (do)q(es)f(not)f(de\014ne)h(an)o(y)f(directiv)o(e)g(to)g(declare)h(a)e (predicate)j(public)-30 563 y(but)c(it)f(do)q(es)h(distinguish)e (public)h(predicates.)24 b(It)15 b(is)g(w)o(orth)h(noting)e(that)h(in)g (most)g(Prolog)g(systems)h(the)g Fh(public/1)-30 613 y Fm(directiv)o(e)g(is)f(as)g(a)g(visibilit)o(y)e(declaration.)21 b(Indeed,)16 b(declaring)f(a)g(predicate)h(as)f(public)g(mak)o(es)g(it) g(visible)f(from)h(an)o(y)-30 663 y(predicate)h(de\014ned)f(in)f(an)o (y)g(other)h(\014le)f(\(otherwise)i(the)f(predicate)g(is)g(only)e (visible)h(from)f(predicates)j(de\014ned)g(in)e(the)-30 713 y(same)e(source)g(\014le)f(as)g(itself)s(\).)17 b(When)11 b(a)g(mo)q(dule)g(system)g(is)g(incorp)q(orated)h(in)e(GNU)h(Prolog)f (a)h(more)g(general)g(visibilit)o(y)-30 762 y(declaration)j(shall)f(b)q (e)i(pro)o(vided)e(conforming)g(to)h(the)g(ISO)h(reference.)-30 918 y Fi(6.1.4)48 b Fh(multifile/1)-30 1044 y Fi(T)l(emplates)74 1116 y Fh(multifile\(+predicat)o(e)p 516 1116 14 2 v 13 w(indicator\))74 1166 y(multifile\(+predicat)o(e)p 516 1166 V 13 w(indicator)p 727 1166 V 14 w(list\))74 1216 y(multifile\(+predicat)o(e)p 516 1216 V 13 w(indicator)p 727 1216 V 14 w(sequence\))-30 1287 y Fi(Description)-30 1387 y Fh(multifile\(Pred\))13 b Fm(is)i(not)h(supp)q(orted)h(b)o(y)e (GNU)h(Prolog.)22 b(When)16 b(suc)o(h)h(a)e(directiv)o(e)h(is)g(encoun) o(tered)h(it)f(is)f(simply)-30 1437 y(ignored.)j(All)13 b(clauses)i(for)f(a)f(giv)o(en)h(predicate)h(m)o(ust)f(reside)h(in)e(a) h(single)f(\014le.)-30 1536 y Fi(P)o(ortabilit)o(y)-30 1636 y Fm(ISO)i(directiv)o(e.)j(Not)c(supp)q(orted.)-30 1791 y Fi(6.1.5)48 b Fh(discontiguous/1)-30 1918 y Fi(T)l(emplates)74 1989 y Fh(discontiguous\(+pred)o(icat)o(e)p 603 1989 V 13 w(indicator\))74 2039 y(discontiguous\(+pred)o(icat)o(e)p 603 2039 V 13 w(indicator)p 814 2039 V 14 w(list\))74 2089 y(discontiguous\(+pred)o(icat)o(e)p 603 2089 V 13 w(indicator)p 814 2089 V 14 w(sequence\))-30 2161 y Fi(Description)-30 2260 y Fh(discontiguous\(Pred\))11 b Fm(sp)q(eci\014es)16 b(that)f(the)g(pro)q(cedure)h(whose)f(predicate)g(indicator)f(is)h Fh(Pred)e Fm(is)h(a)g(discon)o(tiguous)-30 2310 y(pro)q(cedure.)19 b(Namely)m(,)9 b(the)h(clauses)g(de\014ning)g Fh(Pred)f Fm(are)g(not)h(restricted)h(to)e(b)q(e)h(consecutiv)o(e)h(but)f(can)g (app)q(ear)f(an)o(ywhere)-30 2360 y(in)14 b(the)g(source)i(\014le.)-30 2460 y(This)e(directiv)o(e)h(shall)e(precede)j(the)e(de\014nition)g(of) i Fh(Pred)d Fm(in)h(the)g(source)h(\014le.)-30 2559 y(In)j(order)g(to)f (allo)o(w)f(m)o(ultiple)g(de\014nitions,)i Fh(Pred)f Fm(can)h(also)e(b)q(e)j(a)e(list)g(of)g(predicate)h(indicators)g(or)f (a)g(sequence)j(of)-30 2609 y(predicate)15 b(indicators)f(using)g Fh(','/2)f Fm(as)h(separator.)-30 2709 y Fi(P)o(ortabilit)o(y)-30 2808 y Fm(ISO)i(directiv)o(e.)24 b(The)16 b(ISO)g(reference)i(do)q (cumen)o(t)f(states)g(that)e(if)g(there)i(is)f(no)f(clause)h(for)f Fh(Pred)g Fm(in)g(the)i(source)g(\014le,)-30 2858 y Fh(Pred)f Fm(exists)h(ho)o(w)o(ev)o(er)g(as)g(an)f(empt)o(y)h(predicate)h(\(i.e.) 25 b Fh(current)p 1032 2858 V 14 w(predicate\(Pred\))14 b Fm(will)h(succeed\).)28 b(This)17 b(is)f(not)-30 2908 y(the)f(case)g(for)e(GNU)h(Prolog.)p eop end %%Page: 43 45 TeXDict begin 43 44 bop -30 -45 a Fm(6.1)41 b(Prolog)13 b(directiv)o(es)1452 b(43)p -30 -27 1890 4 v -30 115 a Fi(6.1.6)48 b Fh(ensure)p 251 115 14 2 v 15 w(linked/1)-30 241 y Fi(T)l(emplates)74 324 y Fh(ensure)p 209 324 V 15 w(linked\(+predicat)o(e)p 597 324 V 13 w(indicator\))74 374 y(ensure)p 209 374 V 15 w(linked\(+predicat)o(e)p 597 374 V 13 w(indicator)p 808 374 V 14 w(list\))74 424 y(ensure)p 209 424 V 15 w(linked\(+predicat)o(e)p 597 424 V 13 w(indicator)p 808 424 V 14 w(sequence\))-30 507 y Fi(Description)-30 607 y Fh(ensure)p 105 607 V 15 w(linked\(Pred\))13 b Fm(sp)q(eci\014es)k(that)f(the)g(pro)q(cedure) i(whose)e(predicate)h(indicator)e(is)g Fh(Pred)g Fm(m)o(ust)h(b)q(e)g (included)-30 656 y(b)o(y)11 b(the)h(link)o(er.)17 b(This)11 b(directiv)o(e)h(is)f(useful)g(when)h(compiling)e(to)h(nativ)o(e)g(co)q (de)h(to)f(force)g(the)h(link)o(er)f(to)g(include)h(the)f(co)q(de)-30 706 y(of)k(a)g(giv)o(en)g(predicate.)24 b(Indeed,)16 b(if)e(the)i Fh(gplc)f Fm(is)g(in)o(v)o(ok)o(ed)f(with)h(an)g(option)g (to)g(reduce)i(the)f(size)g(of)f(the)h(executable)-30 756 y(\(section)j(3.4.3,)e(page)h(22\),)g(the)h(link)o(er)e(only)g (includes)i(the)f(co)q(de)h(of)e(predicates)j(that)e(are)g(statically)f (referenced.)-30 806 y(Ho)o(w)o(ev)o(er,)d(the)g(link)o(er)g(cannot)f (detect)j(dynamically)11 b(referenced)17 b(predicates)e(\(used)g(as)e (data)h(passed)g(to)g(a)f(meta-call)-30 856 y(predicate\).)20 b(The)14 b(use)h(of)e(this)h(directiv)o(e)g(prev)o(en)o(ts)i(it)d(to)h (exclude)h(the)f(co)q(de)h(of)e(suc)o(h)i(predicates.)-30 955 y(In)j(order)g(to)f(allo)o(w)f(m)o(ultiple)g(de\014nitions,)i Fh(Pred)f Fm(can)h(also)e(b)q(e)j(a)e(list)g(of)g(predicate)h (indicators)g(or)f(a)g(sequence)j(of)-30 1005 y(predicate)15 b(indicators)f(using)g Fh(','/2)f Fm(as)h(separator.)-30 1105 y Fi(P)o(ortabilit)o(y)-30 1204 y Fm(GNU)g(Prolog)f(directiv)o(e.) -30 1362 y Fi(6.1.7)48 b Fh(built)p 229 1362 V 15 w(in/0)p Fi(,)15 b Fh(built)p 470 1362 V 15 w(in/1)p Fi(,)g Fh(built)p 711 1362 V 15 w(in)p 770 1362 V 15 w(fd/0)p Fi(,)h Fh(built)p 1012 1362 V 14 w(in)p 1070 1362 V 16 w(fd/1)-30 1489 y Fi(T)l(emplates)74 1572 y Fh(built)p 187 1572 V 15 w(in)74 1621 y(built)p 187 1621 V 15 w(in\(+predicate)p 488 1621 V 13 w(indicator\))74 1671 y(built)p 187 1671 V 15 w(in\(+predicate)p 488 1671 V 13 w(indicator)p 699 1671 V 14 w(list\))74 1721 y(built)p 187 1721 V 15 w(in\(+predicate)p 488 1721 V 13 w(indicator)p 699 1721 V 14 w(sequence\))74 1771 y(built)p 187 1771 V 15 w(in)p 246 1771 V 15 w(fd)74 1821 y(built)p 187 1821 V 15 w(in)p 246 1821 V 15 w(fd\(+predicate)p 547 1821 V 13 w(indicator\))74 1870 y(built)p 187 1870 V 15 w(in)p 246 1870 V 15 w(fd\(+predicate)p 547 1870 V 13 w(indicator)p 758 1870 V 14 w(list\))74 1920 y(built)p 187 1920 V 15 w(in)p 246 1920 V 15 w(fd\(+predicate)p 547 1920 V 13 w(indicator)p 758 1920 V 14 w(sequence\))-30 2003 y Fi(Description)-30 2103 y Fh(built)p 83 2103 V 15 w(in)k Fm(sp)q(eci\014es)h(that)f(the)h(pro)q(cedures)h(de\014ned)f (from)e(no)o(w)h(ha)o(v)o(e)f(the)i Fh(built)p 1352 2103 V 14 w(in)f Fm(prop)q(ert)o(y)h(\(section)f(7.8.2,)-30 2153 y(page)14 b(65\).)-30 2252 y Fh(built)p 83 2252 V 15 w(in\(Pred\))j Fm(is)h(similar)f(to)h Fh(built)p 643 2252 V 14 w(in/0)g Fm(but)g(only)g(a\013ects)h(the)g(pro)q(cedure)h (whose)f(predicate)h(indicator)d(is)-30 2302 y Fh(Pred)p Fm(.)-30 2402 y(This)d(directiv)o(e)h(shall)e(precede)j(the)e (de\014nition)g(of)i Fh(Pred)d Fm(in)h(the)g(source)h(\014le.)-30 2501 y(In)j(order)g(to)f(allo)o(w)f(m)o(ultiple)g(de\014nitions,)i Fh(Pred)f Fm(can)h(also)e(b)q(e)j(a)e(list)g(of)g(predicate)h (indicators)g(or)f(a)g(sequence)j(of)-30 2551 y(predicate)15 b(indicators)f(using)g Fh(','/2)f Fm(as)h(separator.)-30 2651 y Fh(built)p 83 2651 V 15 w(in)p 142 2651 V 15 w(fd)k Fm(\(resp.)32 b Fh(built)p 462 2651 V 15 w(in)p 521 2651 V 15 w(fd\(Pred\))p Fm(\))17 b(is)h(similar)f(to)h Fh(built)p 1097 2651 V 14 w(in)g Fm(\(resp.)32 b Fh(built)p 1416 2651 V 15 w(in\(Pred\))p Fm(\))17 b(but)h(sets)i(the)-30 2701 y Fh(built)p 83 2701 V 15 w(in)p 142 2701 V 15 w(fd)14 b Fm(predicate)h(prop)q(ert)o(y)g(\(section)f(7.8.2,)e(page)i(65\).)-30 2800 y Fi(P)o(ortabilit)o(y)-30 2900 y Fm(GNU)g(Prolog)f(directiv)o (es.)p eop end %%Page: 44 46 TeXDict begin 44 45 bop -30 -45 a Fm(44)692 b(6)41 b(PR)o(OLOG)14 b(DIRECTIVES)g(AND)f(CONTR)o(OL)h(CONSTR)o(UCTS)p -30 -27 1890 4 v -30 115 a Fi(6.1.8)48 b Fh(include/1)-30 241 y Fi(T)l(emplates)74 323 y Fh(include\(+atom\))-30 404 y Fi(Description)-30 504 y Fh(include\(File\))16 b Fm(sp)q(eci\014es)21 b(that)d(the)h(con)o(ten)o(t)h(of)e(the)h (Prolog)e(source)j Fh(File)e Fm(shall)g(b)q(e)h(inserted.)33 b(The)19 b(resulting)-30 554 y(Prolog)11 b(text)i(is)e(iden)o(tical)g (to)h(the)g(Prolog)f(text)i(obtained)e(b)o(y)h(replacing)f(the)i (directiv)o(e)f(b)o(y)g(the)g(con)o(ten)o(t)g(of)g(the)g(Prolog)-30 603 y(source)k Fh(File)p Fm(.)-30 703 y(See)f Fh(absolute)p 223 703 14 2 v 14 w(file)p 325 703 V 15 w(name/2)e Fm(for)g (information)f(ab)q(out)i(the)h(syn)o(tax)e(of)k Fh(File)c Fm(\(section)i(7.26.1,)c(page)j(141\).)-30 803 y Fi(P)o(ortabilit)o(y) -30 902 y Fm(ISO)h(directiv)o(e.)-30 1060 y Fi(6.1.9)48 b Fh(ensure)p 251 1060 V 15 w(loaded/1)-30 1186 y Fi(T)l(emplates)74 1268 y Fh(ensure)p 209 1268 V 15 w(loaded\(+atom\))-30 1349 y Fi(Description)-30 1449 y Fh(ensure)p 105 1449 V 15 w(loaded\(File\))16 b Fm(is)j(not)g(supp)q(orted)h(b)o(y)f(GNU)g (Prolog.)33 b(When)19 b(suc)o(h)h(a)e(directiv)o(e)i(is)f(encoun)o (tered)i(it)d(is)-30 1498 y(simply)13 b(ignored.)-30 1598 y Fi(P)o(ortabilit)o(y)-30 1698 y Fm(ISO)i(directiv)o(e.)j(Not)c (supp)q(orted.)-30 1855 y Fi(6.1.10)48 b Fh(op/3)-30 1981 y Fi(T)l(emplates)74 2063 y Fh(op\(+integer,)20 b(+operator)p 559 2063 V 13 w(specifier,)g(+atom)p 922 2063 V 15 w(or)p 981 2063 V 15 w(atom)p 1084 2063 V 15 w(list\))-30 2144 y Fi(Description)-30 2244 y Fh(op\(Priority,)g (OpSpecifier,)f(Operator\))c Fm(alters)i(the)g(op)q(erator)g(table.)25 b(This)17 b(directiv)o(e)g(is)f(executed)j(as)d(so)q(on)-30 2294 y(as)d(it)g(is)g(encoun)o(tered)i(b)o(y)d(calling)g(the)h (built-in)f(predicate)i Fh(op/3)e Fm(\(section)i(7.14.10,)c(page)j (100\).)k(A)c(system)h(directiv)o(e)-30 2344 y(is)g(also)f(generated)j (to)d(re\015ect)j(the)f(e\013ect)g(of)e(this)h(directiv)o(e)h(at)f (run-time)f(\(section)i(3.4.4,)d(page)i(25\).)-30 2443 y Fi(P)o(ortabilit)o(y)-30 2543 y Fm(ISO)h(directiv)o(e.)-30 2700 y Fi(6.1.11)48 b Fh(char)p 231 2700 V 15 w(conversion/2)-30 2827 y Fi(T)l(emplates)74 2908 y Fh(char)p 165 2908 V 15 w(conversion\(+charac)o(ter,)18 b(+character\))p eop end %%Page: 45 47 TeXDict begin 45 46 bop -30 -45 a Fm(6.1)41 b(Prolog)13 b(directiv)o(es)1452 b(45)p -30 -27 1890 4 v -30 115 a Fi(Description)-30 215 y Fh(char)p 61 215 14 2 v 15 w(conversion\(InChar,)18 b(OutChar\))g Fm(alters)h(the)h(c)o (haracter-con)o(v)o(ersion)h(mapping.)32 b(This)19 b(directiv)o(e)h(is) f(exe-)-30 264 y(cuted)14 b(as)e(so)q(on)h(as)f(it)g(is)g(encoun)o (tered)i(b)o(y)e(a)g(call)g(to)g(the)h(built-in)e(predicate)i Fh(char)p 1283 264 V 15 w(conversion/2)d Fm(\(section)j(7.14.12,)-30 314 y(page)18 b(102\).)27 b(A)17 b(system)h(directiv)o(e)f(is)g(also)g (generated)h(to)f(re\015ect)i(the)f(e\013ect)h(of)d(this)h(directiv)o (e)h(at)f(run-time)g(\(sec-)-30 364 y(tion)d(3.4.4,)d(page)j(25\).)-30 464 y Fi(P)o(ortabilit)o(y)-30 563 y Fm(ISO)h(directiv)o(e.)-30 721 y Fi(6.1.12)48 b Fh(set)p 209 721 V 15 w(prolog)p 356 721 V 15 w(flag/2)-30 847 y Fi(T)l(emplates)74 930 y Fh(set)p 143 930 V 15 w(prolog)p 290 930 V 15 w(flag\(+flag,)19 b(+term\))-30 1013 y Fi(Description)-30 1113 y Fh(set)p 39 1113 V 16 w(prolog)p 187 1113 V 14 w(flag\(Flag,)h(Value\))14 b Fm(sets)i(the)g(v)n(alue)e(of)h(the)h(Prolog)e(\015ag)h Fh(Flag)f Fm(to)h Fh(Value)p Fm(.)21 b(This)15 b(directiv)o(e)h(is)f (exe-)-30 1163 y(cuted)h(as)e(so)q(on)g(as)g(it)f(is)h(encoun)o(tered)i (b)o(y)e(a)f(call)h(to)f(the)i(built-in)e(predicate)i Fh(set)p 1285 1163 V 15 w(prolog)p 1432 1163 V 14 w(flag/2)e Fm(\(section)i(7.22.1,)-30 1213 y(page)j(133\).)27 b(A)17 b(system)h(directiv)o(e)f(is)g(also)g(generated)h(to)f(re\015ect)i(the) f(e\013ect)h(of)d(this)h(directiv)o(e)h(at)f(run-time)g(\(sec-)-30 1262 y(tion)d(3.4.4,)d(page)j(25\).)-30 1362 y Fi(P)o(ortabilit)o(y)-30 1462 y Fm(ISO)h(directiv)o(e.)-30 1619 y Fi(6.1.13)48 b Fh(initialization/1)-30 1746 y Fi(T)l(emplates)74 1829 y Fh(initialization\(+cal)o(labl)o(e)p 603 1829 V 13 w(term\))-30 1912 y Fi(Description)-30 2012 y Fh (initialization\(Goal\))7 b Fm(adds)k Fh(Goal)f Fm(to)g(the)h(set)h(of) e(goal)f(whic)o(h)i(shall)f(b)q(e)h(executed)i(at)d(run-time.)17 b(A)11 b(user)h(directiv)o(e)-30 2061 y(is)j(generated)g(to)g(execute)h Fh(Goal)d Fm(at)h(run-time.)20 b(If)14 b(sev)o(eral)g(initialization)e (directiv)o(es)j(app)q(ear)g(in)f(the)h(same)f(\014le)h(they)-30 2111 y(are)g(executed)h(in)d(the)i(order)f(of)f(app)q(earance)i (\(section)g(3.4.4,)d(page)i(25\).)-30 2211 y Fi(P)o(ortabilit)o(y)-30 2310 y Fm(ISO)h(directiv)o(e.)-30 2468 y Fi(6.1.14)48 b Fh(foreign/2)p Fi(,)15 b Fh(foreign/1)-30 2595 y Fi(T)l(emplates)74 2678 y Fh(foreign\(+callable)p 450 2678 V 12 w(term,)21 b(+foreign)p 770 2678 V 14 w(option)p 916 2678 V 15 w(list\))74 2727 y(foreign\(+callable)p 450 2727 V 12 w(term\))-30 2810 y Fi(Description)p eop end %%Page: 46 48 TeXDict begin 46 47 bop -30 -45 a Fm(46)692 b(6)41 b(PR)o(OLOG)14 b(DIRECTIVES)g(AND)f(CONTR)o(OL)h(CONSTR)o(UCTS)p -30 -27 1890 4 v -30 115 a Fh(foreign\(Template,)19 b(Options\))12 b Fm(de\014nes)j(an)f(in)o(terface)g(predicate)i(whose)e(protot)o(yp)q (e)g(is)g Fh(Template)e Fm(according)i(to)-30 165 y(the)20 b(options)e(giv)o(en)g(b)o(y)g Fh(Options)p Fm(.)31 b(Refer)19 b(to)f(the)h(foreign)f(co)q(de)h(in)o(terface)g(for)f(more)h (information)d(\(section)k(9.1,)-30 215 y(page)14 b(183\).)-30 314 y Fh(foreign\(Template\))d Fm(is)j(equiv)n(alen)o(t)f(to)g Fh(foreign\(Template,)19 b([]\))p Fm(.)-30 414 y Fi(P)o(ortabilit)o(y) -30 513 y Fm(GNU)14 b(Prolog)f(directiv)o(e.)-30 679 y Ff(6.2)56 b(Prolog)19 b(con)n(trol)f(constructs)-30 806 y Fi(6.2.1)48 b Fh(true/0)p Fi(,)15 b Fh(fail/0)p Fi(,)g Fh(!/0)-30 932 y Fi(T)l(emplates)74 1015 y Fh(true)74 1065 y(fail)74 1115 y(!)-30 1198 y Fi(Description)-30 1298 y Fh(true)e Fm(alw)o(a)o(ys)g(succeeds.)-30 1397 y Fh(fail)g Fm(alw)o(a)o(ys)g(fails)g(\(enforces)i(bac)o(ktrac)o (king\).)-30 1497 y Fh(!)j Fm(alw)o(a)o(ys)12 b(succeeds)k(and)c(the)i (for)e(side-e\013ect)j(of)d(remo)o(ving)g(all)g(c)o(hoice-p)q(oin)o(ts) h(created)i(since)e(the)h(in)o(v)o(o)q(cation)d(of)i(the)-30 1547 y(predicate)i(activ)n(ating)e(it.)-30 1646 y Fi(Errors)-30 1746 y Fm(None.)-30 1846 y Fi(P)o(ortabilit)o(y)-30 1945 y Fm(ISO)i(con)o(trol)e(constructs.)-30 2103 y Fi(6.2.2)48 b Fh(\(','\)/2)15 b Fi(-)h(conjunction,)d Fh(\(;\)/2)i Fi(-)h(disjunction,)e Fh(\(->\)/2)h Fi(-)h(if-then)-30 2229 y(T)l(emplates)74 2312 y Fh(','\(+callable)p 363 2312 14 2 v 13 w(term,)21 b(+callable)p 705 2312 V 14 w(term\))74 2362 y(;\(+callable)p 319 2362 V 14 w(term,)f(+callable)p 661 2362 V 14 w(term\))74 2412 y(->\(+callable)p 341 2412 V 13 w(term,)h(+callable)p 683 2412 V 14 w(term\))-30 2495 y Fi(Description)-30 2595 y Fh(Goal1)g(,)h(Goal2)13 b Fm(executes)j Fh(Goal1)d Fm(and,)g(in)g(case)i(of)e(success,)j (executes)g Fh(Goal2)p Fm(.)-30 2694 y Fh(Goal1)21 b(;)h(Goal2)13 b Fm(\014rst)h(creates)i(a)e(c)o(hoice-p)q(oin)o(t)f(and)h(executes)i Fh(Goal1)p Fm(.)h(On)d(bac)o(ktrac)o(king)g Fh(Goal2)f Fm(is)h(executed.)-30 2794 y Fh(Goal1)21 b(->)h(Goal2)12 b Fm(\014rst)i(executes)h Fh(Goal1)e Fm(and,)f(in)h(case)h(of)f (success,)j(remo)o(v)o(es)d(all)f(c)o(hoice-p)q(oin)o(ts)i(created)h(b) o(y)e Fh(Goal1)-30 2844 y Fm(and)f(executes)h Fh(Goal2)p Fm(.)j(This)c(con)o(trol)f(construct)i(acts)f(lik)o(e)f(an)g(if-then)g (\()p Fh(Goal1)g Fm(is)g(the)h(test)g(part)g(and)f Fh(Goal2)f Fm(the)j(then)-30 2893 y(part\).)20 b(Note)14 b(that)h(if)h Fh(Goal1)d Fm(fails)g Fh(->/2)h Fm(fails)f(also.)18 b Fh(->/2)13 b Fm(is)h(often)g(com)o(bined)g(with)g Fh(;/2)g Fm(to)g(de\014ne)h(an)f(if-then-else)p eop end %%Page: 47 49 TeXDict begin 47 48 bop -30 -45 a Fm(6.2)41 b(Prolog)13 b(con)o(trol)h(constructs)1299 b(47)p -30 -27 1890 4 v -30 115 a(as)18 b(follo)o(ws:)24 b Fh(Goal1)d(->)g(Goal2)g(;)g(Goal3) p Fm(.)28 b(Note)18 b(that)g Fh(Goal1)j(->)g(Goal2)c Fm(is)g(the)h(\014rst)h(argumen)o(t)e(of)g(the)h Fh(\(;\)/2)-30 165 y Fm(and)g Fh(Goal3)e Fm(\(the)j(else)f(part\))g(is)f(the)i(second) f(argumen)o(t.)29 b(Suc)o(h)18 b(an)g(if-then-else)f(con)o(trol)h (construct)h(\014rst)f(creates)-30 215 y(a)g(c)o(hoice-p)q(oin)o(t)f (for)h(the)g(else-part)h(\(in)o(tuitiv)o(ely)d(asso)q(ciated)i(with)g Fh(;/2)p Fm(\))f(and)h(then)g(executes)i Fh(Goal1)p Fm(.)28 b(In)18 b(case)h(of)-30 264 y(success,)f(all)c(c)o(hoice-p)q(oin)o(ts)h (created)i(b)o(y)f Fh(Goal1)e Fm(together)i(with)f(the)h(c)o(hoice-p)q (oin)o(t)f(for)g(the)g(else-part)h(are)g(remo)o(v)o(ed)-30 314 y(and)e Fh(Goal2)f Fm(is)h(executed.)20 b(If)c Fh(Goal1)d Fm(fails)g(then)h Fh(Goal3)f Fm(is)h(executed.)-30 414 y Fh(',')p Fm(,)f Fh(;)h Fm(and)g Fh(->)f Fm(are)h(prede\014ned)i (in\014x)d(op)q(erators)i(\(section)g(7.14.10,)c(page)j(100\).)-30 513 y Fi(Errors)p -30 569 1890 2 v -30 619 2 50 v -3 604 a Fh(Goal1)f Fm(or)h Fh(Goal2)e Fm(is)i(a)g(v)n(ariable)p 915 619 V 428 w Fh(instantiation)p 1230 604 14 2 v 13 w(error)p 1859 619 2 50 v -30 621 1890 2 v -30 670 2 50 v -3 655 a(Goal1)f Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(a)f (callable)g(term)p 915 670 V 105 w Fh(type)p 1032 655 14 2 v 15 w(error\(callable,)19 b(Goal1\))p 1859 670 2 50 v -30 672 1890 2 v -30 722 2 50 v -3 707 a(Goal2)13 b Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(a)f(callable)g(term)p 915 722 V 105 w Fh(type)p 1032 707 14 2 v 15 w(error\(callable,)19 b(Goal2\))p 1859 722 2 50 v -30 723 1890 2 v -30 923 2 200 v -3 758 a Fm(The)14 b(predicate)h(indicator)f Fh(Pred)f Fm(of)j Fh(Goal1)d Fm(or)h Fh(Goal2)-3 808 y Fm(do)q(es)h(not)e(corresp)q(ond)j(to)e(an)f(existing)h(pro)q(cedure) -3 858 y(and)g(the)g(v)n(alue)f(of)h(the)g Fh(unknown)f Fm(Prolog)g(\015ag)g(is)-3 908 y Fh(error)g Fm(\(section)i(7.22.1,)c (page)j(133\))p 915 923 V 941 758 a Fh(existence)p 1142 758 14 2 v 14 w(error\(procedure,)k(Pred\))p 1859 923 2 200 v -30 924 1890 2 v -30 1007 a Fi(P)o(ortabilit)o(y)-30 1107 y Fm(ISO)d(con)o(trol)e(constructs.)-30 1264 y Fi(6.2.3)48 b Fh(call/1)-30 1391 y Fi(T)l(emplates)74 1474 y Fh(call\(+callable)p 385 1474 14 2 v 13 w(term\))-30 1557 y Fi(Description)-30 1657 y Fh(call\(Goal\))10 b Fm(executes)k Fh(Goal)p Fm(.)i Fh(call/1)11 b Fm(succeeds)j(if)g Fh(Goal)d Fm(represen)o(ts)j(a)d (goal)g(whic)o(h)g(is)h(true.)18 b(When)12 b Fh(Goal)e Fm(con)o(tains)-30 1706 y(a)k(cut)h(sym)o(b)q(ol)e Fh(!)18 b Fm(\(section)d(6.2.1,)c(page)j(46\))g(as)g(a)f(subgoal,)g(the)h (e\013ect)i(of)g Fh(!)j Fm(do)q(es)14 b(not)g(extend)h(outside)f Fh(Goal)p Fm(.)-30 1806 y Fi(Errors)p -30 1862 1890 2 v -30 1911 2 50 v -3 1897 a Fh(Goal)f Fm(is)h(a)f(v)n(ariable)p 915 1911 V 624 w Fh(instantiation)p 1230 1897 14 2 v 13 w(error)p 1859 1911 2 50 v -30 1913 1890 2 v -30 1963 2 50 v -3 1948 a(Goal)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (callable)g(term)p 915 1963 V 127 w Fh(type)p 1032 1948 14 2 v 15 w(error\(callable,)19 b(Goal\))p 1859 1963 2 50 v -30 1965 1890 2 v -30 2164 2 200 v -3 1999 a Fm(The)14 b(predicate)h(indicator)f Fh(Pred)f Fm(of)j Fh(Goal)d Fm(do)q(es)i(not)-3 2049 y(corresp)q(ond)h(to)d(an)h(existing)f(pro)q (cedure)j(and)e(the)-3 2099 y(v)n(alue)f(of)h(the)g Fh(unknown)e Fm(Prolog)i(\015ag)f(is)h Fh(error)-3 2149 y Fm(\(section)h(7.22.1,)c (page)j(133\))p 915 2164 V 941 1999 a Fh(existence)p 1142 1999 14 2 v 14 w(error\(procedure,)k(Pred\))p 1859 2164 2 200 v -30 2166 1890 2 v -30 2248 a Fi(P)o(ortabilit)o(y)-30 2348 y Fm(ISO)d(con)o(trol)e(construct.)-30 2506 y Fi(6.2.4)48 b Fh(catch/3)p Fi(,)15 b Fh(throw/1)-30 2632 y Fi(T)l(emplates)74 2715 y Fh(catch\(?callable)p 407 2715 14 2 v 13 w(term,)21 b(?term,)f(?term\))74 2765 y(throw\(+nonvar\))-30 2848 y Fi(Description)p eop end %%Page: 48 50 TeXDict begin 48 49 bop -30 -45 a Fm(48)692 b(6)41 b(PR)o(OLOG)14 b(DIRECTIVES)g(AND)f(CONTR)o(OL)h(CONSTR)o(UCTS)p -30 -27 1890 4 v -30 115 a Fh(catch\(Goal,)20 b(Catcher,)g(Recovery\))11 b Fm(is)h(similar)f(to)i Fh(call\(Goal\))d Fm(\(section)k(6.2.3,)c (page)j(47\).)k(If)12 b(this)h(succeeds)i(or)-30 165 y(fails,)10 b(so)h(do)q(es)g(the)g(call)f(to)g Fh(catch/3)p Fm(.)16 b(If)10 b(ho)o(w)o(ev)o(er,)h(during)g(the)g(execution)g(of)i Fh(Goal)p Fm(,)d(there)i(is)e(a)h(call)f(to)g Fh(throw\(Ball\))p Fm(,)-30 215 y(the)j(curren)o(t)h(\015o)o(w)e(of)g(con)o(trol)g(is)h (in)o(terrupted,)g(and)f(con)o(trol)h(returns)h(to)e(a)g(call)g(of)j Fh(catch/3)c Fm(that)h(is)g(b)q(eing)h(executed.)-30 264 y(This)h(can)g(happ)q(en)h(in)e(one)h(of)g(t)o(w)o(o)f(w)o(a)o(ys:) 33 347 y Fg(\017)20 b Fm(implicitly)m(,)11 b(when)j(an)g(error)h (condition)e(for)h(a)f(built-in)g(predicate)i(is)e(satis\014ed.)33 430 y Fg(\017)20 b Fm(explicitly)m(,)15 b(when)i(the)g(program)e (executes)k(a)d(call)f(of)k Fh(throw/1)14 b Fm(b)q(ecause)k(the)f (program)f(wishes)h(to)f(abandon)74 480 y(the)f(curren)o(t)g(pro)q (cessing,)g(and)e(instead)i(to)e(tak)o(e)h(an)g(alternativ)o(e)g (action.)-30 563 y Fh(throw\(Ball\))h Fm(causes)k(the)f(normal)e(\015o) o(w)h(of)g(con)o(trol)g(to)g(b)q(e)h(transferred)h(bac)o(k)e(to)h(an)f (existing)g(call)f(of)k Fh(catch/3)p Fm(.)-30 613 y(When)g(a)f(call)f (to)h Fh(throw\(Ball\))e Fm(happ)q(ens,)k Fh(Ball)e Fm(is)g(copied)g (and)g(the)h(stac)o(k)g(is)f(un)o(w)o(ound)g(bac)o(k)g(to)g(the)h(call) e(to)-30 663 y Fh(catch/3)p Fm(,)11 b(whereup)q(on)i(the)g(cop)o(y)f (of)i Fh(Ball)d Fm(is)h(uni\014ed)g(with)g Fh(Catcher)p Fm(.)k(If)11 b(this)h(uni\014cation)g(succeeds,)i(then)f Fh(catch/3)-30 713 y Fm(executes)19 b(the)e(goal)e Fh(Recovery)f Fm(using)j Fh(call/1)e Fm(\(section)i(6.2.3,)e(page)h(47\))g(in)f (order)i(to)f(determine)i(the)e(success)j(or)-30 762 y(failure)e(of)i Fh(catch/3)p Fm(.)26 b(Otherwise,)19 b(in)d(case)i(the)g(uni\014cation)e(fails,)g(the)i(stac)o(k)f(k)o(eeps) h(un)o(winding,)e(lo)q(oking)g(for)g(an)-30 812 y(earlier)f(in)o(v)o(o) q(cation)d(of)17 b Fh(catch/3)p Fm(.)f Fh(Ball)d Fm(ma)o(y)g(b)q(e)i (an)o(y)e(non-v)n(ariable)g(term.)-30 912 y Fi(Errors)p -30 968 1890 2 v -30 1017 2 50 v -3 1002 a Fh(Goal)g Fm(is)h(a)f(v)n(ariable)p 915 1017 V 624 w Fh(instantiation)p 1230 1002 14 2 v 13 w(error)p 1859 1017 2 50 v -30 1019 1890 2 v -30 1069 2 50 v -3 1054 a(Goal)g Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(a)f(callable)g(term)p 915 1069 V 127 w Fh(type)p 1032 1054 14 2 v 15 w(error\(callable,)19 b(Goal\))p 1859 1069 2 50 v -30 1070 1890 2 v -30 1270 2 200 v -3 1105 a Fm(The)14 b(predicate)h(indicator)f Fh(Pred)f Fm(of)j Fh(Goal)d Fm(do)q(es)i(not)-3 1155 y(corresp)q(ond)h(to)d(an)h(existing)f(pro)q(cedure)j(and)e(the)-3 1205 y(v)n(alue)f(of)h(the)g Fh(unknown)e Fm(Prolog)i(\015ag)f(is)h Fh(error)-3 1255 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1270 V 941 1105 a Fh(existence)p 1142 1105 14 2 v 14 w(error\(procedure,)k(Pred\))p 1859 1270 2 200 v -30 1271 1890 2 v -30 1321 2 50 v -3 1306 a(Ball)13 b Fm(is)h(a)f(v)n (ariable)p 915 1321 V 624 w Fh(instantiation)p 1230 1306 14 2 v 13 w(error)p 1859 1321 2 50 v -30 1323 1890 2 v -30 1406 a Fm(If)21 b Fh(Ball)16 b Fm(do)q(es)i(not)f(unify)f(with)h (the)h Fh(Catcher)e Fm(argumen)o(t)h(of)f(an)o(y)h(call)g(of)i Fh(catch/3)p Fm(,)d(a)h(system)h(error)g(message)g(is)-30 1455 y(displa)o(y)o(ed)c(and)f Fh(throw/1)g Fm(fails.)-30 1555 y(When)21 b Fh(catch/3)e Fm(calls)h Fh(Recovery)f Fm(it)h(uses)i Fh(call/1)d Fm(\(section)i(6.2.3,)f(page)g(47\),)i(an)e Fh(instantiation)p 1687 1555 14 2 v 13 w(error)p Fm(,)g(a)-30 1605 y Fh(type)p 61 1605 V 15 w(error)13 b Fm(or)h(an)g Fh(existence)p 506 1605 V 13 w(error)f Fm(can)h(then)h(o)q(ccur)g(dep)q (ending)f(on)g Fh(Recovery)p Fm(.)-30 1705 y Fi(P)o(ortabilit)o(y)-30 1804 y Fm(ISO)h(con)o(trol)e(constructs.)p eop end %%Page: 49 51 TeXDict begin 49 50 bop 1819 -45 a Fm(49)p -30 -27 1890 4 v -30 115 a Fn(7)67 b(Prolog)22 b(built-in)h(predicates)-30 264 y Ff(7.1)56 b(T)n(yp)r(e)18 b(testing)-30 390 y Fi(7.1.1)48 b Fh(var/1)p Fi(,)15 b Fh(nonvar/1)p Fi(,)g Fh(atom/1)p Fi(,)g Fh(integer/1)p Fi(,)f Fh(float/1)p Fi(,)h Fh(number/1)p Fi(,)f Fh(atomic/1)p Fi(,)116 440 y Fh(compound/1)p Fi(,)g Fh(callable/1)p Fi(,)h Fh(list/1)p Fi(,)f Fh(partial)p 927 440 14 2 v 15 w(list/1)p Fi(,)h Fh(list)p 1190 440 V 15 w(or)p 1249 440 V 15 w(partial)p 1418 440 V 14 w(list/1)-30 567 y Fi(T)l(emplates)74 666 y Fh(var\(?term\))74 716 y(nonvar\(?term\))74 766 y(atom\(?term\))74 816 y(integer\(?term\))74 865 y(float\(?term\))74 915 y(number\(?term\))1040 666 y(atomic\(?term\))1040 716 y(compound\(?term\))1040 766 y(callable\(?term\))1040 816 y(list\(?term\))1040 865 y(partial)p 1197 865 V 14 w(list\(?term\))1040 915 y(list)p 1131 915 V 15 w(or)p 1190 915 V 15 w(partial)p 1359 915 V 14 w(list\(?term\))-30 1015 y Fi(Description)-30 1115 y Fh(var\(Term\))10 b Fm(succeeds)15 b(if)f Fh(Term)d Fm(is)h(curren)o(tly)g(uninstan)o(tiated)g(\(whic)o(h)g(therefore)h (has)f(not)g(b)q(een)h(b)q(ound)f(to)g(an)o(ything,)-30 1164 y(except)k(p)q(ossibly)d(another)i(uninstan)o(tiated)e(v)n (ariable\).)-30 1264 y Fh(nonvar\(Term\))f Fm(succeeds)k(if)h Fh(Term)c Fm(is)g(curren)o(tly)i(instan)o(tiated)f(\(opp)q(osite)g(of)j Fh(var/1)p Fm(\).)-30 1364 y Fh(atom\(Term\))12 b Fm(succeeds)17 b(if)f Fh(Term)d Fm(is)h(curren)o(tly)h(instan)o(tiated)e(to)h(an)g (atom.)-30 1463 y Fh(integer\(Term\))e Fm(succeeds)k(if)g Fh(Term)d Fm(is)h(curren)o(tly)h(instan)o(tiated)f(to)f(an)h(in)o (teger.)-30 1563 y Fh(float\(Term\))e Fm(succeeds)17 b(if)f Fh(Term)d Fm(is)h(curren)o(tly)g(instan)o(tiated)g(to)g(a)f (\015oating)g(p)q(oin)o(t)h(n)o(um)o(b)q(er.)-30 1663 y Fh(number\(Term\))e Fm(succeeds)k(if)h Fh(Term)c Fm(is)g(curren)o (tly)i(instan)o(tiated)f(to)g(an)f(in)o(teger)i(or)e(a)h(\015oating)f (p)q(oin)o(t)g(n)o(um)o(b)q(er.)-30 1762 y Fh(atomic\(Term\))8 b Fm(succeeds)13 b(if)g Fh(Term)c Fm(is)h(curren)o(tly)h(instan)o (tiated)g(to)f(an)g(atom,)f(an)h(in)o(teger)h(or)f(a)g(\015oating)g(p)q (oin)o(t)f(n)o(um)o(b)q(er.)-30 1862 y Fh(compound\(Term\))i Fm(succeeds)16 b(if)g Fh(Term)d Fm(is)h(curren)o(tly)g(instan)o(tiated) g(to)f(a)h(comp)q(ound)f(term,)h(i.e.)j(a)c(term)i(of)e(arit)o(y)g Fb(>)g Fm(0)-30 1912 y(\(a)h(list)g(or)f(a)h(structure\).)-30 2011 y Fh(callable\(Term\))9 b Fm(succeeds)k(if)h Fh(Term)c Fm(is)h(curren)o(tly)h(instan)o(tiated)f(to)g(a)g(callable)f(term,)i (i.e.)k(an)11 b(atom)f(or)h(a)g(comp)q(ound)-30 2061 y(term.)-30 2161 y Fh(list\(Term\))j Fm(succeeds)j(if)h Fh(Term)d Fm(is)g(curren)o(tly)h(instan)o(tiated)f(to)g(a)g(list,)g (i.e.)21 b(the)16 b(atom)f Fh([])f Fm(\(empt)o(y)i(list\))f(or)g(a)g (term)-30 2210 y(with)f(principal)f(functor)h Fh('.'/2)f Fm(and)h(with)f(second)i(argumen)o(t)f(\(the)h(tail\))e(a)g(list.)-30 2310 y Fh(partial)p 127 2310 V 15 w(list\(Term\))e Fm(succeeds)17 b(if)f Fh(Term)d Fm(is)h(curren)o(tly)g(instan)o(tiated)g(to)g(a)f (partial)g(list,)g(i.e.)k(a)d(v)n(ariable)f(or)g(a)h(term)-30 2360 y(whose)h(the)f(main)f(functor)h(is)g Fh('.'/2)f Fm(and)h(the)g(second)h(argumen)o(t)f(\(the)h(tail\))e(is)g(a)h (partial)f(list.)-30 2460 y Fh(list)p 61 2460 V 15 w(or)p 120 2460 V 16 w(partial)p 290 2460 V 14 w(list\(Term\))f Fm(succeeds)k(if)g Fh(Term)d Fm(is)h(curren)o(tly)h(instan)o(tiated)f (to)f(a)h(list)f(or)h(a)g(partial)f(list.)-30 2559 y Fi(Errors)-30 2659 y Fm(None.)-30 2758 y Fi(P)o(ortabilit)o(y)-30 2858 y Fh(var/1)p Fm(,)g Fh(nonvar/1)p Fm(,)f Fh(atom/1)p Fm(,)g Fh(integer/1)p Fm(,)g Fh(float/1)p Fm(,)g Fh(number/1)p Fm(,)f Fh(atomic/1)p Fm(,)h Fh(compound/1)g Fm(and)i Fh(callable/1)e Fm(are)-30 2908 y(ISO)j(predicates.)p eop end %%Page: 50 52 TeXDict begin 50 51 bop -30 -45 a Fm(50)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fh(list/1)p Fm(,)f Fh(partial)p 284 115 14 2 v 14 w(list/1)f Fm(and)i Fh(list)p 611 115 V 15 w(or)p 670 115 V 15 w(partial)p 839 115 V 15 w(list/1)e Fm(are)i(GNU)g(Prolog) f(predicates.)-30 281 y Ff(7.2)56 b(T)-5 b(erm)18 b(uni\014cation)-30 407 y Fi(7.2.1)48 b Fh(\(=\)/2)15 b Fi(-)h(Prolog)f(uni\014cation)-30 534 y(T)l(emplates)74 617 y Fh(=\(?term,)20 b(?term\))-30 700 y Fi(Description)-30 799 y Fh(Term1)h(=)h(Term2)12 b Fm(uni\014es)i Fh(Term1)e Fm(and)h Fh(Term2)p Fm(.)k(No)c(o)q(ccurs)i (c)o(hec)o(k)g(is)e(done,)g(i.e.)k(this)d(predicate)g(do)q(es)g(not)g (c)o(hec)o(k)g(if)e(a)-30 849 y(v)n(ariable)h(is)h(uni\014ed)g(with)g (a)f(comp)q(ound)h(term)g(con)o(taining)f(this)h(v)n(ariable)f(\(this)h (can)g(lead)g(to)f(an)h(in\014nite)g(lo)q(op\).)-30 949 y Fh(=)g Fm(is)g(a)f(prede\014ned)j(in\014x)e(op)q(erator)g(\(section)h (7.14.10,)c(page)j(100\).)-30 1049 y Fi(Errors)-30 1148 y Fm(None.)-30 1248 y Fi(P)o(ortabilit)o(y)-30 1347 y Fm(ISO)h(predicate.)-30 1505 y Fi(7.2.2)48 b Fh(unify)p 229 1505 V 15 w(with)p 332 1505 V 15 w(occurs)p 479 1505 V 14 w(check/2)-30 1632 y Fi(T)l(emplates)74 1715 y Fh(unify)p 187 1715 V 15 w(with)p 290 1715 V 15 w(occurs)p 437 1715 V 14 w(check\(?term,)20 b(?term\))-30 1798 y Fi(Description)-30 1897 y Fh(unify)p 83 1897 V 15 w(with)p 186 1897 V 15 w(occurs)p 333 1897 V 14 w(check\(Term1,)g(Term2\))12 b Fm(uni\014es)j Fh(Term1)d Fm(and)i Fh(Term2)p Fm(.)j(The)d(o)q(ccurs) i(c)o(hec)o(k)e(test)h(is)f(done)g(\(i.e.)-30 1947 y(the)h (uni\014cation)e(fails)g(if)g(a)h(v)n(ariable)e(is)i(uni\014ed)g(with)g (a)f(comp)q(ound)h(term)g(con)o(taining)f(this)h(v)n(ariable\).)-30 2047 y Fi(Errors)-30 2146 y Fm(None.)-30 2246 y Fi(P)o(ortabilit)o(y) -30 2346 y Fm(ISO)h(predicate.)-30 2503 y Fi(7.2.3)48 b Fh(\(\\=\)/2)15 b Fi(-)h(not)f(Prolog)g(uni\014able)-30 2630 y(T)l(emplates)74 2713 y Fh(\\=\(?term,)20 b(?term\))-30 2796 y Fi(Description)-30 2895 y Fh(Term1)h(\\=)h(Term2)12 b Fm(succeeds)17 b(if)f Fh(Term1)d Fm(and)h Fh(Term2)f Fm(are)h(not)g(uni\014able)f(\(no)h(o)q(ccurs)h(c)o(hec)o(k)g(is)f (done\).)p eop end %%Page: 51 53 TeXDict begin 51 52 bop -30 -45 a Fm(7.3)41 b(T)m(erm)14 b(comparison)1438 b(51)p -30 -27 1890 4 v -30 115 a Fh(\\=)14 b Fm(is)g(a)f(prede\014ned)j(in\014x)d(op)q(erator)i(\(section)g (7.14.10,)c(page)j(100\).)-30 215 y Fi(Errors)-30 314 y Fm(None.)-30 414 y Fi(P)o(ortabilit)o(y)-30 513 y Fm(ISO)h (predicate.)-30 678 y Ff(7.3)56 b(T)-5 b(erm)18 b(comparison)-30 805 y Fi(7.3.1)48 b(Standard)14 b(total)h(ordering)f(of)i(terms)-30 931 y Fm(The)f(built-in)f(predicates)i(describ)q(ed)g(in)e(this)h (section)g(allo)o(ws)e(the)i(user)h(to)e(compare)h(Prolog)f(terms.)21 b(Prolog)13 b(terms)-30 981 y(are)f(totally)d(ordered)k(according)e(to) f(the)i(standard)f(total)g(ordering)g(of)f(terms)i(whic)o(h)e(is)h(as)g (follo)o(ws)f(\(from)g(the)h(smallest)-30 1031 y(term)k(to)e(the)i (greatest\):)33 1107 y Fg(\017)20 b Fm(v)n(ariables,)13 b(oldest)h(\014rst.)33 1187 y Fg(\017)20 b Fm(\014nite)14 b(domain)f(v)n(ariables)g(\(section)i(8.1.1,)d(page)h(165\),)g(oldest)h (\014rst.)33 1267 y Fg(\017)20 b Fm(\015oating)13 b(p)q(oin)o(t)h(n)o (um)o(b)q(ers,)g(in)f(n)o(umeric)h(order.)33 1347 y Fg(\017)20 b Fm(in)o(tegers,)14 b(in)g(n)o(umeric)g(order.)33 1427 y Fg(\017)20 b Fm(atoms,)13 b(in)h(alphab)q(etical)f(\(i.e.)k(c)o (haracter)f(co)q(de\))e(order.)33 1507 y Fg(\017)20 b Fm(comp)q(ound)f(terms,)i(ordered)g(\014rst)f(b)o(y)f(arit)o(y)m(,)g (then)h(b)o(y)f(the)h(name)g(of)e(the)i(principal)f(functor)g(and)g(b)o (y)h(the)74 1557 y(argumen)o(ts)14 b(in)g(left-to-righ)o(t)f(order.)-30 1634 y(A)h(list)g(is)g(treated)h(as)f(a)f(comp)q(ound)h(term)g(\(whose) h(principal)e(functor)h(is)g Fh('.'/2)p Fm(\).)-30 1733 y(The)i(p)q(ortabilit)o(y)d(of)h(the)h(order)h(of)e(v)n(ariables)g(is)h (not)f(guaran)o(teed)i(\(in)e(the)h(ISO)g(reference)j(the)d(o)q(der)g (of)f(v)n(ariables)g(is)-30 1783 y(system)h(dep)q(enden)o(t\).)-30 1939 y Fi(7.3.2)48 b Fh(\(==\)/2)15 b Fi(-)h(term)f(iden)o(tical,)g Fh(\(\\==\)/2)g Fi(-)g(term)g(not)g(iden)o(tical,)116 1989 y Fh(\(@<\)/2)g Fi(-)h(term)f(less)g(than,)g Fh(\(@=<\)/2)g Fi(-)h(term)e(less)i(than)f(or)g(equal)h(to,)116 2039 y Fh(\(@>\)/2)f Fi(-)h(term)f(greater)f(than,)h Fh(\(@>=\)/2)g Fi(-)h(term)e(greater)h(than)g(or)g(equal)h(to)-30 2165 y(T)l(emplates)74 2260 y Fh(==\(?term,)k(?term\))74 2310 y(\\==\(?term,)g(?term\))74 2360 y(@<\(?term,)g(?term\))1040 2260 y(@=<\(?term,)g(?term\))1040 2310 y(@>\(?term,)g(?term\))1040 2360 y(@>=\(?term,)g(?term\))-30 2460 y Fi(Description)-30 2559 y Fm(These)f(predicates)h(compare)d(t)o(w)o(o)h(terms)g(according) g(to)f(the)i(standard)f(total)f(ordering)g(of)g(terms)i(\(section)f (7.3.1,)-30 2609 y(page)c(51\).)-30 2709 y Fh(Term1)21 b(==)h(Term2)12 b Fm(succeeds)17 b(if)f Fh(Term1)d Fm(and)h Fh(Term2)f Fm(are)h(equal.)-30 2808 y Fh(Term1)21 b(\\==)g(Term2)13 b Fm(succeeds)k(if)f Fh(Term1)d Fm(and)h Fh(Term2)e Fm(are)j (di\013eren)o(t.)-30 2908 y Fh(Term1)21 b(@<)h(Term2)12 b Fm(succeeds)17 b(if)f Fh(Term1)d Fm(is)h(less)g(than)g Fh(Term2)p Fm(.)p eop end %%Page: 52 54 TeXDict begin 52 53 bop -30 -45 a Fm(52)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fh(Term1)21 b(@=<)g(Term2)13 b Fm(succeeds)k(if)f Fh(Term1)d Fm(is)h(less)g(than)g(or)g(equal)f(to)h Fh(Term2)p Fm(.)-30 215 y Fh(Term1)21 b(@>)h(Term2)12 b Fm(succeeds)17 b(if)f Fh(Term1)d Fm(is)h(greater)h(than)f Fh(Term2)p Fm(.)-30 314 y Fh(Term1)21 b(@>=)g(Term2)13 b Fm(succeeds)k(if)f Fh(Term1)d Fm(is)h(greater)g(than)g(or)g(equal)g(to)f Fh(Term2)p Fm(.)-30 414 y Fh(==)p Fm(,)g Fh(\\==)p Fm(,)g Fh(@<)p Fm(,)g Fh(@=<)p Fm(,)g Fh(@>)g Fm(and)h Fh(@>=)f Fm(are)i(prede\014ned)g(in\014x)f(op)q(erators)g(\(section)h(7.14.10,)c (page)j(100\).)-30 513 y Fi(Errors)-30 613 y Fm(None.)-30 713 y Fi(P)o(ortabilit)o(y)-30 812 y Fm(ISO)h(predicates.)-30 969 y Fi(7.3.3)48 b Fh(compare/3)-30 1095 y Fi(T)l(emplates)74 1172 y Fh(compare\(?atom,)19 b(+term,)i(+term\))-30 1249 y Fi(Description)-30 1348 y Fh(compare\(Result,)e(Term1,)i(Term2\))12 b Fm(compares)j Fh(Term1)e Fm(and)h Fh(Term2)f Fm(according)h(to)g(the) g(standard)h(\(section)f(7.3.1,)-30 1398 y(page)g(51\))g(and)g (uni\014es)g Fh(Result)f Fm(with:)33 1475 y Fg(\017)20 b Fm(the)15 b(atom)e Fh(<)g Fm(if)k Fh(Term1)c Fm(is)g(less)i(than)f Fh(Term2)p Fm(.)33 1555 y Fg(\017)20 b Fm(the)15 b(atom)e Fh(=)g Fm(if)k Fh(Term1)c Fm(and)g Fh(Term2)g Fm(are)h(equal.)33 1635 y Fg(\017)20 b Fm(the)15 b(atom)e Fh(>)g Fm(if)k Fh(Term1)c Fm(is)g(greater)i(than)f Fh(Term2)p Fm(.)-30 1712 y Fi(Errors)p -30 1776 1890 2 v -30 1826 2 50 v -3 1811 a Fh(Result)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h (atom)p 915 1826 V 202 w Fh(type)p 1032 1811 14 2 v 15 w(error\(atom,)19 b(Result\))p 1859 1826 2 50 v -30 1828 1890 2 v -30 1911 a Fi(P)o(ortabilit)o(y)-30 2011 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2175 y Ff(7.4)56 b(T)-5 b(erm)18 b(pro)r(cessing)-30 2302 y Fi(7.4.1)48 b Fh(functor/3)-30 2428 y Fi(T)l(emplates)74 2505 y Fh(functor\(+nonvar,)19 b(?atomic,)h(?integer\))74 2555 y(functor\(-nonvar,)f(+atomic,)h (+integer\))-30 2632 y Fi(Description)-30 2732 y Fh(functor\(Term,)g (Name,)g(Arity\))14 b Fm(succeeds)19 b(if)14 b(the)i(principal)f (functor)h(of)i Fh(Term)c Fm(is)h Fh(Name)g Fm(and)g(its)h(arit)o(y)e (is)i Fh(Arity)p Fm(.)-30 2781 y(This)e(predicate)h(can)f(b)q(e)h(used) g(in)e(t)o(w)o(o)g(w)o(a)o(ys:)33 2858 y Fg(\017)20 b Fh(Term)13 b Fm(is)h(not)g(a)f(v)n(ariable:)k(extract)e(the)f(name)g (\(an)g(atom)f(or)g(a)h(n)o(um)o(b)q(er)g(if)i Fh(Term)d Fm(is)h(a)f(n)o(um)o(b)q(er\))i(and)e(the)i(arit)o(y)74 2908 y(of)i Fh(Term)c Fm(\(if)j Fh(Term)d Fm(is)h(atomic)f Fh(Arity)g Fm(=)h(0\).)p eop end %%Page: 53 55 TeXDict begin 53 54 bop -30 -45 a Fm(7.4)41 b(T)m(erm)14 b(pro)q(cessing)1459 b(53)p -30 -27 1890 4 v 33 115 a Fg(\017)20 b Fh(Term)c Fm(is)g(a)g(v)n(ariable:)21 b(unify)16 b Fh(Term)f Fm(with)h(a)g(general)g(term)h(whose)g(principal)e(functor) i(is)f(giv)o(en)g(b)o(y)g Fh(Name)f Fm(and)74 165 y(arit)o(y)f(is)f (giv)o(en)h(b)o(y)g Fh(Arity)p Fm(.)-30 242 y Fi(Errors)p -30 298 1890 2 v -30 347 2 50 v -3 332 a Fh(Term)f Fm(and)h Fh(Name)f Fm(are)h(b)q(oth)g(v)n(ariables)p 915 347 V 335 w Fh(instantiation)p 1230 332 14 2 v 13 w(error)p 1859 347 2 50 v -30 349 1890 2 v -30 399 2 50 v -3 384 a(Term)f Fm(and)h Fh(Arity)f Fm(are)h(b)q(oth)g(v)n(ariables)p 915 399 V 313 w Fh(instantiation)p 1230 384 14 2 v 13 w(error)p 1859 399 2 50 v -30 401 1890 2 v -30 500 2 100 v -3 435 a(Term)f Fm(is)h(a)f(v)n(ariable)g(and)h Fh(Name)f Fm(is)h(neither)g(a)g(v)n(ariable)-3 485 y(nor)g(an)g(atomic) f(term)p 915 500 V 941 435 a Fh(type)p 1032 435 14 2 v 15 w(error\(atomic,)19 b(Name\))p 1859 500 2 100 v -30 502 1890 2 v -30 601 2 100 v -3 537 a(Term)13 b Fm(is)g(a)g(v)n (ariable)g(and)g Fh(Arity)g Fm(is)g(neither)h(a)g(v)n(ariable)-3 587 y(nor)g(an)g(in)o(teger)p 915 601 V 941 537 a Fh(type)p 1032 537 14 2 v 15 w(error\(integer,)19 b(Arity\))p 1859 601 2 100 v -30 603 1890 2 v -30 703 2 100 v -3 638 a(Term)13 b Fm(is)h(a)f(v)n(ariable,)g Fh(Name)g Fm(is)g(a)h(constan)o(t)g(but)h (not)e(an)-3 688 y(atom)g(and)h Fh(Arity)f Fm(is)g(an)h(in)o(teger)g Fb(>)g Fm(0)p 915 703 V 941 638 a Fh(type)p 1032 638 14 2 v 15 w(error\(atom,)19 b(Name\))p 1859 703 2 100 v -30 704 1890 2 v -30 804 2 100 v -3 739 a(Term)13 b Fm(is)h(a)f(v)n(ariable)g(and)h Fh(Arity)f Fm(is)g(an)h(in)o(teger)g Fb(>)-3 789 y Fh(max)p 66 789 14 2 v 15 w(arity)f Fm(\015ag)g (\(section)i(7.22.1,)d(page)h(133\))p 915 804 2 100 v 941 739 a Fh(representation)p 1252 739 14 2 v 13 w(error\(max)p 1463 739 V 14 w(arity\))p 1859 804 2 100 v -30 806 1890 2 v -30 856 2 50 v -3 841 a(Term)g Fm(is)h(a)f(v)n(ariable)g(and)h Fh(Arity)f Fm(is)g(an)h(in)o(teger)g Fb(<)h Fm(0)p 915 856 V 103 w Fh(domain)p 1076 841 14 2 v 15 w(error\(not)p 1289 841 V 13 w(less)p 1390 841 V 15 w(than)p 1493 841 V 15 w(zero,)21 b(Arity\))p 1859 856 2 50 v -30 857 1890 2 v -30 940 a Fi(P)o(ortabilit)o(y)-30 1040 y Fm(ISO)15 b(predicate.)-30 1196 y Fi(7.4.2)48 b Fh(arg/3)-30 1323 y Fi(T)l(emplates)74 1400 y Fh(arg\(+integer,)19 b(+compound)p 580 1400 14 2 v 14 w(term,)i(?term\))-30 1477 y Fi(Description)-30 1577 y Fh(arg\(N,)g(Term,)g(Arg\))13 b Fm(succeeds)j(if)d(the)i Fh(N)p Fe(th)i Fm(argumen)o(t)c(of)k Fh(Term)c Fm(is)h Fh(Arg)p Fm(.)-30 1676 y Fi(Errors)p -30 1732 1890 2 v -30 1782 2 50 v -3 1767 a Fh(N)g Fm(is)f(a)h(v)n(ariable)p 915 1782 V 689 w Fh(instantiation)p 1230 1767 14 2 v 13 w(error)p 1859 1782 2 50 v -30 1783 1890 2 v -30 1833 2 50 v -3 1818 a(Term)f Fm(is)h(a)f(v)n(ariable)p 915 1833 V 624 w Fh(instantiation)p 1230 1818 14 2 v 13 w(error)p 1859 1833 2 50 v -30 1835 1890 2 v -30 1885 2 50 v -3 1870 a(N)h Fm(is)f(neither)i(a)f(v)n(ariable)f(nor)g(an)h(in)o(teger)p 915 1885 V 281 w Fh(type)p 1032 1870 14 2 v 15 w(error\(integer,)19 b(N\))p 1859 1885 2 50 v -30 1886 1890 2 v -30 1936 2 50 v -3 1921 a(Term)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (comp)q(ound)h(term)p 915 1936 V 75 w Fh(type)p 1032 1921 14 2 v 15 w(error\(compound,)19 b(Term\))p 1859 1936 2 50 v -30 1938 1890 2 v -30 1988 2 50 v -3 1973 a(N)14 b Fm(is)f(an)h(in)o(teger)g Fb(<)h Fm(0)p 915 1988 V 604 w Fh(domain)p 1076 1973 14 2 v 15 w(error\(not)p 1289 1973 V 13 w(less)p 1390 1973 V 15 w(than)p 1493 1973 V 15 w(zero,)21 b(N\))p 1859 1988 2 50 v -30 1989 1890 2 v -30 2072 a Fi(P)o(ortabilit)o(y)-30 2172 y Fm(ISO)15 b(predicate.)-30 2328 y Fi(7.4.3)48 b Fh(\(=..\)/2)15 b Fi(-)h(univ)-30 2455 y(T)l(emplates)74 2532 y Fh(=..\(+nonvar,)k (?list\))74 2582 y(=..\(-nonvar,)g(+list\))-30 2659 y Fi(Description)-30 2759 y Fh(Term)h(=..)43 b(List)12 b Fm(succeeds)k(if)f Fh(List)d Fm(is)h(a)f(list)g(whose)i(head)f(is)g (the)g(atom)f(corresp)q(onding)i(to)e(the)i(principal)e(functor)-30 2808 y(of)17 b Fh(Term)c Fm(and)h(whose)g(tail)f(is)h(a)f(list)h(of)f (the)h(argumen)o(ts)h(of)h Fh(Term)p Fm(.)-30 2908 y Fh(=..)i Fm(is)c(a)g(prede\014ned)h(in\014x)f(op)q(erator)g(\(section)h (7.14.10,)c(page)j(100\).)p eop end %%Page: 54 56 TeXDict begin 54 55 bop -30 -45 a Fm(54)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(Errors)p -30 171 1890 2 v -30 220 2 50 v -3 205 a Fh(Term)f Fm(is)h(a)f(v)n(ariable)g(and)h Fh(List)f Fm(is)h(a)f(partial)g(list)p 915 220 V 163 w Fh(instantiation)p 1230 205 14 2 v 13 w(error)p 1859 220 2 50 v -30 222 1890 2 v -30 272 2 50 v -3 257 a(List)g Fm(is)h(neither)h(a)e(partial)g (list)g(nor)h(a)g(list)p 915 272 V 258 w Fh(type)p 1032 257 14 2 v 15 w(error\(list,)19 b(List\))p 1859 272 2 50 v -30 273 1890 2 v -30 373 2 100 v -3 308 a(Term)13 b Fm(is)h(a)f(v)n(ariable)g(and)h Fh(List)f Fm(is)h(a)f(list)h(whose)g (head)-3 358 y(is)g(a)f(v)n(ariable)p 915 373 V 941 308 a Fh(instantiation)p 1230 308 14 2 v 13 w(error)p 1859 373 2 100 v -30 375 1890 2 v -30 474 2 100 v -3 410 a(List)e Fm(is)i(a)f(list)f(whose)i(head)g Fh(H)f Fm(is)g(neither)h(an)f(atom)g (nor)-3 459 y(a)i(v)n(ariable)e(and)i(whose)h(tail)d(is)i(not)g(the)g (empt)o(y)g(list)p 915 474 V 941 410 a Fh(type)p 1032 410 14 2 v 15 w(error\(atom,)19 b(H\))p 1859 474 2 100 v -30 476 1890 2 v -30 576 2 100 v -3 511 a(List)13 b Fm(is)h(a)f(list)h(whose)g(head)g Fh(H)g Fm(is)g(a)f(comp)q(ound)h (term)-3 561 y(and)g(whose)g(tail)f(is)h(the)g(empt)o(y)g(list)p 915 576 V 941 511 a Fh(type)p 1032 511 14 2 v 15 w(error\(atomic,)19 b(H\))p 1859 576 2 100 v -30 577 1890 2 v -30 627 2 50 v -3 612 a(Term)13 b Fm(is)h(a)f(v)n(ariable)g(and)h Fh(List)f Fm(is)h(the)g(empt)o(y)g(list)p 915 627 V 133 w Fh(domain)p 1076 612 14 2 v 15 w(error\(non)p 1289 612 V 13 w(empty)p 1412 612 V 15 w(list,)21 b([]\))p 1859 627 2 50 v -30 629 1890 2 v -30 778 2 150 v -3 664 a(Term)13 b Fm(is)h(a)f(v)n(ariable)g(and)h(the)g(tail)f(of)k Fh(List)c Fm(has)h(a)-3 713 y(length)g Fb(>)g Fh(max)p 239 713 14 2 v 15 w(arity)f Fm(\015ag)g(\(section)i(7.22.1,)-3 763 y(page)f(133\))p 915 778 2 150 v 941 664 a Fh(representation)p 1252 664 14 2 v 13 w(error\(max)p 1463 664 V 14 w(arity\))p 1859 778 2 150 v -30 780 1890 2 v -30 863 a Fi(P)o(ortabilit)o(y)-30 962 y Fm(ISO)h(predicate.)-30 1120 y Fi(7.4.4)48 b Fh(copy)p 207 1120 14 2 v 15 w(term/2)-30 1246 y Fi(T)l(emplates)74 1329 y Fh(copy)p 165 1329 V 15 w(term\(?term,)20 b(?term\))-30 1413 y Fi(Description)-30 1512 y Fh(copy)p 61 1512 V 15 w(term\(Term1,)g(Term2\))12 b Fm(succeeds)17 b(if)f Fh(Term2)d Fm(uni\014es)h(with)g(a)g(term)g Fh(T)f Fm(whic)o(h)h(is)g (a)g(renamed)g(cop)o(y)g(of)i Fh(Term1)p Fm(.)-30 1612 y Fi(Errors)-30 1711 y Fm(None.)-30 1811 y Fi(P)o(ortabilit)o(y)-30 1911 y Fm(ISO)f(predicate.)-30 2068 y Fi(7.4.5)48 b Fh(setarg/4)p Fi(,)15 b Fh(setarg/3)-30 2195 y Fi(T)l(emplates)74 2278 y Fh(setarg\(+integer,)k(+compound)p 646 2278 V 14 w(term,)h(+term,)h (+boolean\))74 2328 y(setarg\(+integer,)e(+compound)p 646 2328 V 14 w(term,)h(+term\))-30 2411 y Fi(Description)-30 2510 y Fh(setarg\(N,)g(Term,)h(NewValue,)f(Undo\))d Fm(replaces)i (destructiv)o(ely)f(the)h Fh(N)p Fe(th)h Fm(argumen)o(t)e(of)i Fh(Term)d Fm(with)g Fh(NewValue)p Fm(.)-30 2560 y(This)d(assignmen)o(t) g(is)g(undone)h(on)f(bac)o(ktrac)o(king)g(if)i Fh(Undo)d Fm(=)i Fh(true)p Fm(.)j(This)c(should)f(only)h(used)h(if)e(there)i(is)f (no)g(further)-30 2610 y(use)i(of)e(the)h(old)f(v)n(alue)g(of)g(the)h (replaced)g(argumen)o(t.)20 b(If)e Fh(Undo)13 b Fm(=)i Fh(false)f Fm(then)h Fh(NewValue)e Fm(m)o(ust)h(b)q(e)h(either)h(an)e (atom)-30 2660 y(or)g(an)g(in)o(teger.)-30 2759 y Fh(setarg\(N,)20 b(Term,)h(NewValue\))12 b Fm(is)i(equiv)n(alen)o(t)f(to)h Fh(setarg\(N,)20 b(Term,)g(NewValue,)g(true\))p Fm(.)-30 2859 y Fi(Errors)p eop end %%Page: 55 57 TeXDict begin 55 56 bop -30 -45 a Fm(7.5)41 b(V)m(ariable)13 b(naming/n)o(um)o(b)q(ering)1241 b(55)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(N)14 b Fm(is)f(a)h(v)n(ariable)p 915 125 V 689 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(N)g Fm(is)f(neither)i(a)f(v)n(ariable) f(nor)g(an)h(in)o(teger)p 915 176 V 281 w Fh(type)p 1032 161 14 2 v 15 w(error\(integer,)19 b(N\))p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(N)14 b Fm(is)f(an)h(in)o(teger)g Fb(<)h Fm(0)p 915 228 V 604 w Fh(domain)p 1076 213 14 2 v 15 w(error\(not)p 1289 213 V 13 w(less)p 1390 213 V 15 w(than)p 1493 213 V 15 w(zero,)21 b(N\))p 1859 228 2 50 v -30 229 1890 2 v -30 279 2 50 v -3 264 a(Term)13 b Fm(is)h(a)f(v)n(ariable)p 915 279 V 624 w Fh(instantiation)p 1230 264 14 2 v 13 w(error)p 1859 279 2 50 v -30 281 1890 2 v -30 331 2 50 v -3 316 a(Term)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (comp)q(ound)h(term)p 915 331 V 75 w Fh(type)p 1032 316 14 2 v 15 w(error\(compound,)19 b(Term\))p 1859 331 2 50 v -30 332 1890 2 v -30 432 2 100 v -3 367 a(NewValue)12 b Fm(is)i(neither)h(an)e(atom)g(nor)h(an)g(in)o(teger)g(and)-3 417 y Fh(Undo)f Fm(=)h Fh(false)p 915 432 V 941 367 a(type)p 1032 367 14 2 v 15 w(error\(atomic,)19 b(NewValue\))p 1859 432 2 100 v -30 434 1890 2 v -30 484 2 50 v -3 469 a(Undo)13 b Fm(is)h(a)f(v)n(ariable)p 915 484 V 624 w Fh(instantiation)p 1230 469 14 2 v 13 w(error)p 1859 484 2 50 v -30 485 1890 2 v -30 535 2 50 v -3 520 a(Undo)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(b)q(o)q(olean)p 915 535 V 221 w Fh(type)p 1032 520 14 2 v 15 w(error\(boolean,)19 b(Undo\))p 1859 535 2 50 v -30 537 1890 2 v -30 619 a Fi(P)o(ortabilit)o(y)-30 719 y Fm(GNU)14 b(Prolog)f(predicate.)-30 885 y Ff(7.5)56 b(V)-5 b(ariable)19 b(naming/n)n(um)n(b)r(ering)-30 1012 y Fi(7.5.1)48 b Fh(name)p 207 1012 14 2 v 15 w(singleton)p 420 1012 V 14 w(vars/1)-30 1138 y Fi(T)l(emplates)74 1221 y Fh(name)p 165 1221 V 15 w(singleton)p 378 1221 V 14 w(vars\(?term\))-30 1304 y Fi(Description)-30 1404 y Fh(name)p 61 1404 V 15 w(singleton)p 274 1404 V 14 w(vars\(Term\))15 b Fm(binds)h(eac)o(h)h(singleton)f(v)n(ariable)g(app) q(earing)g(in)g Fh(Term)g Fm(with)g(a)g(term)h(of)f(the)h(form)-30 1453 y Fh('$VARNAME'\(')p 237 1453 V 14 w('\))p Fm(.)33 b(Suc)o(h)20 b(a)e(term)i(can)f(b)q(e)h(output)f(b)o(y)h Fh(write)p 1048 1453 V 15 w(term/3)e Fm(as)h(a)g(v)n(ariable)f(name)h (\(section)h(7.14.6,)-30 1503 y(page)14 b(96\).)-30 1603 y Fi(Errors)-30 1703 y Fm(None.)-30 1802 y Fi(P)o(ortabilit)o(y)-30 1902 y Fm(GNU)g(Prolog)f(predicates.)-30 2059 y Fi(7.5.2)48 b Fh(name)p 207 2059 V 15 w(query)p 332 2059 V 15 w(vars/2)-30 2186 y Fi(T)l(emplates)74 2269 y Fh(name)p 165 2269 V 15 w(query)p 290 2269 V 15 w(vars\(+list,)19 b(?list\))-30 2352 y Fi(Description)-30 2452 y Fh(name)p 61 2452 V 15 w(query)p 186 2452 V 15 w(vars\(List,)h(Rest\))f Fm(for)h(eac)o(h)h (elemen)o(t)f(of)j Fh(List)c Fm(of)h(the)h(form)e Fh(Name)i(=)h(Var)e Fm(where)h Fh(Name)e Fm(is)h(an)-30 2501 y(atom)c(and)g Fh(Var)f Fm(a)h(v)n(ariable,)f(binds)h Fh(Var)f Fm(with)h(the)g(term)h Fh('$VARNAME'\(Name\))o Fm(.)22 b(Suc)o(h)16 b(a)g(term)g(can)h(b)q(e)f (output)g(b)o(y)-30 2551 y Fh(write)p 83 2551 V 15 w(term/3)h Fm(as)h(a)g(v)n(ariable)g(name)g(\(section)h(7.14.6,)e(page)h(96\).)31 b Fh(Rest)17 b Fm(is)i(uni\014ed)f(with)g(the)h(list)f(of)f(elemen)o (ts)-30 2601 y(of)j Fh(List)c Fm(that)i(ha)o(v)o(e)e(not)h(giv)o(en)g (rise)h(to)f(a)g(binding.)26 b(This)17 b(predicate)h(is)f(pro)o(vided)g (as)h(a)e(w)o(a)o(y)h(to)g(name)g(the)g(v)n(ari-)-30 2651 y(able)c(lists)g(obtained)f(returned)i(b)o(y)f Fh(read)p 626 2651 V 15 w(term/3)f Fm(with)g Fh(variable)p 1054 2651 V 14 w(names\(List\))f Fm(or)h Fh(singletons\(List\))e Fm(options)-30 2701 y(\(section)15 b(7.14.1,)d(page)i(92\).)-30 2800 y Fi(Errors)p eop end %%Page: 56 58 TeXDict begin 56 57 bop -30 -45 a Fm(56)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(List)f Fm(is)h(a)f(partial)g (list)p 915 125 V 577 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(List)g Fm(is)h(neither)h(a)e(partial)g(list)g(nor)h (a)g(list)p 915 176 V 258 w Fh(type)p 1032 161 14 2 v 15 w(error\(list,)19 b(List\))p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(Rest)13 b Fm(is)h(neither)h(a)e (partial)g(list)g(nor)h(a)g(list)p 915 228 V 258 w Fh(type)p 1032 213 14 2 v 15 w(error\(list,)19 b(Rest\))p 1859 228 2 50 v -30 229 1890 2 v -30 312 a Fi(P)o(ortabilit)o(y)-30 412 y Fm(GNU)14 b(Prolog)f(predicate.)-30 570 y Fi(7.5.3)48 b Fh(bind)p 207 570 14 2 v 15 w(variables/2)p Fi(,)14 b Fh(numbervars/3)p Fi(,)g Fh(numbervars/1)-30 696 y Fi(T)l(emplates)74 779 y Fh(bind)p 165 779 V 15 w(variables\(?term,)19 b(+var)p 639 779 V 14 w(binding)p 807 779 V 15 w(option)p 954 779 V 14 w(list\))74 829 y(numbervars\(?term,)g(+integer,)g (?integer\))74 879 y(numbervars\(?term\))-30 962 y Fi(Description)-30 1061 y Fh(bind)p 61 1061 V 15 w(variables\(Term,)g(Options\))12 b Fm(binds)i(eac)o(h)g(v)n(ariable)f(app)q(earing)g(in)h Fh(Term)f Fm(according)g(to)h(the)g(options)g(giv)o(en)-30 1111 y(b)o(y)h Fh(Options)p Fm(.)-30 1211 y Fi(V)l(ariable)g(binding)e (options)p Fm(:)j Fh(Options)11 b Fm(is)i(a)g(list)f(of)g(v)n(ariable)g (binding)g(options.)17 b(If)12 b(this)h(list)f(con)o(tains)h(con)o (tradic-)-30 1261 y(tory)h(options,)f(the)i(righ)o(tmost)e(option)g(is) h(the)h(one)f(whic)o(h)f(applies.)18 b(P)o(ossible)c(options)g(are:)33 1344 y Fg(\017)20 b Fh(numbervars)p Fm(:)c(sp)q(eci\014es)f(that)f(eac) o(h)f(v)n(ariable)g(app)q(earing)g(in)g Fh(Term)f Fm(should)i(b)q(e)g (b)q(ound)f(to)g(a)g(term)h(of)f(the)h(form)74 1393 y Fh('$VAR'\(N\))e Fm(where)j Fh(N)f Fm(is)f(an)h(in)o(teger.)k(Suc)o(h)d (a)e(term)h(can)g(b)q(e)h(output)f(b)o(y)g Fh(write)p 1366 1393 V 15 w(term/3)e Fm(as)i(a)g(v)n(ariable)e(name)74 1443 y(\(section)j(7.14.6,)c(page)j(96\).)k(This)c(is)f(the)i(default.) 33 1526 y Fg(\017)20 b Fh(namevars)p Fm(:)j(sp)q(eci\014es)c(that)e (eac)o(h)h(v)n(ariables)e(app)q(earing)h(in)f Fh(Term)h Fm(shall)f(b)q(e)h(b)q(ound)h(to)f(a)f(term)i(of)e(the)i(form)74 1576 y Fh('$VARNAME'\(Name\))11 b Fm(where)16 b Fh(Name)e Fm(is)g(the)h(atom)f(that)h(w)o(ould)f(b)q(e)h(output)g(b)o(y)f Fh(write)p 1459 1576 V 15 w(term/3)f Fm(seeing)j(a)e(term)74 1626 y(of)f(the)h Fh('$VAR'\(N\))d Fm(where)k Fh(N)e Fm(is)g(an)g(in)o(teger.)19 b(Suc)o(h)13 b(a)h(term)f(can)h(b)q(e)g (output)f(b)o(y)h Fh(write)p 1478 1626 V 15 w(term/3)e Fm(as)h(a)g(v)n(ariable)74 1676 y(name)h(\(section)h(7.14.6,)c(page)j (96\).)k(This)13 b(is)h(the)h(alternativ)o(e)e(to)h Fh(numbervars)p Fm(.)33 1759 y Fg(\017)20 b Fh(from\(From\))p Fm(:)j(the)18 b(\014rst)g(in)o(teger)f Fh(N)g Fm(to)g(use)h(for)f(n)o(um)o(b)q (er/name)g(v)n(ariables)g(of)i Fh(Term)e Fm(is)g Fh(From)p Fm(.)27 b(The)18 b(default)74 1809 y(v)n(alue)13 b(is)h Fh(0)p Fm(.)33 1892 y Fg(\017)20 b Fh(next\(Next\))p Fm(:)15 b(when)e Fh(bind)p 519 1892 V 15 w(variables/2)d Fm(succeeds,)15 b Fh(Next)d Fm(is)g(uni\014ed)g(with)h(the)g(\(last)f (in)o(teger)h Fh(N)p Fm(\)+1)f(used)h(to)74 1941 y(bind)h(the)g(v)n (ariables)f(of)k Fh(Term)p Fm(.)33 2024 y Fg(\017)j Fh(exclude\(List\)) p Fm(:)k(collects)19 b(all)e(v)n(ariable)h(names)g(app)q(earing)g(in)g Fh(List)g Fm(to)g(a)o(v)o(oid)f(a)h(clash)g(when)h(binding)e(a)74 2074 y(v)n(ariable)c(of)k Fh(Term)p Fm(.)g(Precisely)e(a)e(n)o(um)o(b)q (er)h Fh(N)g Fg(\025)g Fh(From)f Fm(will)g(not)g(b)q(e)i(used)g(to)e (bind)h(a)g(v)n(ariable)e(of)17 b Fh(Term)c Fm(if:)121 2124 y Fi({)21 b Fm(there)16 b(is)g(a)f(sub-term)h(of)i Fh(List)d Fm(of)g(the)h(form)f Fh('$VAR'\(N\))e Fm(or)j Fh('$VARNAME'\(Name\))c Fm(where)17 b Fh(Name)d Fm(is)i(the)166 2174 y(constan)o(t)e(that)g(w)o(ould)f(b)q(e)i(output)f(b)o(y)g Fh(write)p 908 2174 V 14 w(term/3)f Fm(seeing)i(a)e(term)h(of)g(the)g Fh('$VAR'\(N\))p Fm(.)121 2240 y Fi({)21 b Fm(an)15 b(elemen)o(t)h(of)i Fh(List)c Fm(is)h(of)g(the)h(form)f Fh(Name)21 b(=)g(Var)15 b Fm(where)i Fh(Name)d Fm(is)h(an)g(atom)g(that)g(w)o(ould)g(b)q(e)h (output)166 2290 y(b)o(y)e Fh(write)p 337 2290 V 15 w(term/3)f Fm(on)h(seeing)g(a)g(term)h(of)e(the)i(from)f Fh('$VAR'\(N\))p Fm(.)d(This)k(case)g(allo)o(ws)e(for)g(lists)h(returned)166 2340 y(b)o(y)e Fh(read)p 313 2340 V 15 w(term/3)f Fm(\(with)h Fh(variable)p 756 2340 V 14 w(names\(List\))e Fm(or)i Fh(singletons\(List\))d Fm(options\))j(\(section)i(7.14.1,)166 2390 y(page)f(92\))h(and)g(b)o(y)g Fh(name)p 564 2390 V 15 w(query)p 689 2390 V 14 w(vars/2)f Fm(\(section)i(7.5.2,)c(page)j (55\).)-30 2473 y Fh(numbervars\(Term,)19 b(From,)i(Next\))10 b Fm(is)h(equiv)n(alen)o(t)g(to)g Fh(bind)p 965 2473 V 15 w(variables\(Term,)19 b([from\(From\),)g(next\(Next\)])p Fm(,)-30 2523 y(i.e.)f(eac)o(h)c(v)n(ariable)f(of)k Fh(Term)c Fm(is)g(b)q(ound)h(to)g Fh('$VAR'\(N\))e Fm(where)j Fh(From)21 b Fg(\024)14 b Fh(N)g Fb(<)g Fh(Next)p Fm(.)-30 2622 y Fh(numbervars\(Term\))d Fm(is)j(equiv)n(alen)o(t)f(to)h Fh(numbervars\(Term,)k(0,)p 1061 2622 V 37 w(\))p Fm(.)-30 2722 y Fi(Errors)p eop end %%Page: 57 59 TeXDict begin 57 58 bop -30 -45 a Fm(7.6)41 b(Arithmetic)1557 b(57)p -30 -27 1890 4 v -30 75 1890 2 v -30 175 2 100 v -3 110 a Fh(Options)12 b Fm(is)i(a)g(partial)f(list)g(or)h(a)f(list)h (with)f(an)h(elemen)o(t)-3 160 y Fh(E)g Fm(whic)o(h)f(is)h(a)g(v)n (ariable)p 915 175 V 941 110 a Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 175 2 100 v -30 176 1890 2 v -30 226 2 50 v -3 211 a(Options)e Fm(is)i(neither)h(a)f(partial)e (list)i(nor)g(a)f(list)p 915 226 V 193 w Fh(type)p 1032 211 14 2 v 15 w(error\(list,)19 b(Options\))p 1859 226 2 50 v -30 228 1890 2 v -30 327 2 100 v -3 263 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Options)f Fm(list)g(is)h (neither)h(a)-3 312 y(v)n(ariable)e(nor)h(a)f(v)n(ariable)g(binding)g (option)p 915 327 V 941 263 a Fh(domain)p 1076 263 14 2 v 15 w(error\(var)p 1289 263 V 13 w(binding)p 1456 263 V 15 w(option,)20 b(E\))p 1859 327 2 100 v -30 329 1890 2 v -30 379 2 50 v -3 364 a(From)13 b Fm(is)h(a)f(v)n(ariable)p 915 379 V 624 w Fh(instantiation)p 1230 364 14 2 v 13 w(error)p 1859 379 2 50 v -30 381 1890 2 v -30 430 2 50 v -3 415 a(From)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in) o(teger)p 915 430 V 215 w Fh(type)p 1032 415 14 2 v 15 w(error\(integer,)19 b(From\))p 1859 430 2 50 v -30 432 1890 2 v -30 482 2 50 v -3 467 a(Next)13 b Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(an)g(in)o(teger)p 915 482 V 215 w Fh(type)p 1032 467 14 2 v 15 w(error\(integer,)19 b(Next\))p 1859 482 2 50 v -30 484 1890 2 v -30 533 2 50 v -3 518 a(List)13 b Fm(is)h(a)f(partial)g(list)p 915 533 V 577 w Fh(instantiation)p 1230 518 14 2 v 13 w(error)p 1859 533 2 50 v -30 535 1890 2 v -30 585 2 50 v -3 570 a(List)g Fm(is)h(neither)h(a)e(partial)g (list)g(nor)h(a)g(list)p 915 585 V 258 w Fh(type)p 1032 570 14 2 v 15 w(error\(list,)19 b(List\))p 1859 585 2 50 v -30 586 1890 2 v -30 669 a Fi(P)o(ortabilit)o(y)-30 769 y Fm(GNU)14 b(Prolog)f(predicates.)-30 927 y Fi(7.5.4)48 b Fh(term)p 207 927 14 2 v 15 w(ref/2)-30 1053 y Fi(T)l(emplates)74 1136 y Fh(term)p 165 1136 V 15 w(ref\(+term,)20 b(?integer\))74 1186 y(term)p 165 1186 V 15 w(ref\(?term,)g(+integer\))-30 1269 y Fi(Description)-30 1369 y Fh(term)p 61 1369 V 15 w(ref\(Term,)g(Ref\))11 b Fm(succeeds)k(if)10 b(the)j(in)o(ternal)e (reference)j(of)h Fh(Term)c Fm(is)g Fh(Ref)p Fm(.)17 b(This)11 b(predicate)i(can)f(b)q(e)h(used)f(either)-30 1418 y(to)j(obtain)f(the)h(in)o(ternal)f(reference)k(of)c(a)g(term)h (or)g(to)f(obtain)g(the)i(term)f(asso)q(ciated)g(with)f(a)h(giv)o(en)f (reference.)23 b(Note)-30 1468 y(that)17 b(t)o(w)o(o)f(iden)o(tical)g (terms)h(can)g(ha)o(v)o(e)f(di\013eren)o(t)i(in)o(ternal)e(references.) 29 b(A)16 b(go)q(o)q(d)g(w)o(a)o(y)g(to)g(use)i(this)e(predicate)i(is)e (to)-30 1518 y(\014rst)f(record)g(the)g(in)o(ternal)e(reference)k(of)c (a)g(giv)o(en)h(term)g(and)g(to)g(later)f(re-obtain)h(the)h(term)f(via) f(this)h(reference.)-30 1618 y Fi(Errors)p -30 1673 1890 2 v -30 1723 2 50 v -3 1708 a Fh(Term)f Fm(and)h Fh(Ref)f Fm(are)h(b)q(oth)g(v)n(ariables)p 915 1723 V 357 w Fh(instantiation)p 1230 1708 14 2 v 13 w(error)p 1859 1723 2 50 v -30 1725 1890 2 v -30 1774 2 50 v -3 1760 a(Ref)f Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(an)g(in)o(teger)p 915 1774 V 237 w Fh(type)p 1032 1760 14 2 v 15 w(error\(integer,)19 b(Ref\))p 1859 1774 2 50 v -30 1776 1890 2 v -30 1826 2 50 v -3 1811 a(Ref)13 b Fm(is)h(an)g(in)o(teger)g Fb(<)g Fm(0)p 915 1826 V 561 w Fh(domain)p 1076 1811 14 2 v 15 w(error\(not)p 1289 1811 V 13 w(less)p 1390 1811 V 15 w(than)p 1493 1811 V 15 w(zero,)21 b(Ref\))p 1859 1826 2 50 v -30 1828 1890 2 v -30 1910 a Fi(P)o(ortabilit)o(y)-30 2010 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2176 y Ff(7.6)56 b(Arithmetic)-30 2302 y Fi(7.6.1)48 b(Ev)m(aluation)17 b(of)e(an)h(arithmetic)e (expression)-30 2429 y Fm(An)19 b(arithmetic)e(expression)i(is)f(a)g (Prolog)f(term)h(built)g(from)f(n)o(um)o(b)q(ers,)i(v)n(ariables,)f (and)f(functors)i(\(or)f(op)q(erators\))-30 2479 y(that)f(represen)o(t) i(arithmetic)e(functions.)26 b(When)17 b(an)g(expression)h(is)e(ev)n (aluated)h(eac)o(h)g(v)n(ariable)f(m)o(ust)g(b)q(e)i(b)q(ound)e(to)-30 2529 y(a)f(non-v)n(ariable)f(expression.)24 b(An)15 b(expression)i(ev)n (aluates)e(to)g(a)g(n)o(um)o(b)q(er,)h(whic)o(h)f(ma)o(y)f(b)q(e)i(an)f (in)o(teger)h(or)f(a)g(\015oating)-30 2578 y(p)q(oin)o(t)j(n)o(um)o(b)q (er.)30 b(The)19 b(follo)o(wing)c(table)j(details)f(the)i(comp)q(onen)o (ts)f(of)g(an)f(arithmetic)h(expression,)i(ho)o(w)d(they)i(are)-30 2628 y(ev)n(aluated,)14 b(the)g(t)o(yp)q(es)h(exp)q(ected/returned)i (and)d(if)f(they)i(are)f(ISO)g(or)g(an)g(extension:)p eop end %%Page: 58 60 TeXDict begin 58 59 bop -30 -45 a Fm(58)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1884 2 v -30 125 2 50 v -3 110 a(Expression)p 533 125 V 367 w(Result)g(=)g Fe(eval)t Fm(\(Expression\))p 1458 125 V 473 w(Signature)p 1731 125 V 75 w(ISO)p 1852 125 V -30 127 1884 2 v -30 136 V -30 236 2 100 v -3 171 a(V)m(ariable)p 533 236 V 411 w(m)o(ust)g(b)q(e)h(b)q(ound)f(to)f(a)h (non-v)n(ariable)f(expression)i Fh(E)p Fm(.)559 221 y(The)g(result)f (is)g Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 236 V 1519 171 a(IF)f Fg(!)h Fm(IF)p 1731 236 V 105 w(Y)p 1852 236 V -30 238 1884 2 v -30 288 2 50 v -3 273 a(in)o(teger)g(n)o(um)o(b)q (er)p 533 288 V 288 w(this)g(n)o(um)o(b)q(er)p 1458 288 V 769 w(I)f Fg(!)h Fm(I)p 1731 288 V 132 w(Y)p 1852 288 V -30 289 1884 2 v -30 339 2 50 v -3 324 a(\015oating)f(p)q(oin)o(t)g (n)o(um)o(b)q(er)p 533 339 V 167 w(this)h(n)o(um)o(b)q(er)p 1458 339 V 757 w(F)f Fg(!)h Fm(F)p 1731 339 V 120 w(Y)p 1852 339 V -30 341 1884 2 v -30 391 2 50 v -3 376 a Fh(+)22 b(E)p 533 391 V 496 w Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 391 V 832 w(IF)13 b Fg(!)h Fm(IF)p 1731 391 V 105 w(N)p 1852 391 V -30 392 1884 2 v -30 442 2 50 v -3 427 a Fh(-)22 b(E)p 533 442 V 496 w Fm(-)14 b Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 442 V 804 w(IF)f Fg(!)h Fm(IF)p 1731 442 V 105 w(Y)p 1852 442 V -30 444 1884 2 v -30 493 2 50 v -3 479 a Fh(inc\(E\))p 533 493 V 430 w Fe(eval)t Fm(\()p Fh(E)p Fm(\))h(+)f(1)p 1458 493 V 750 w(IF)f Fg(!)h Fm(IF)p 1731 493 V 105 w(N)p 1852 493 V -30 495 1884 2 v -30 545 2 50 v -3 530 a Fh(dec\(E\))p 533 545 V 430 w Fe(eval)t Fm(\()p Fh(E)p Fm(\))h(-)e(1)p 1458 545 V 769 w(IF)g Fg(!)h Fm(IF)p 1731 545 V 105 w(N)p 1852 545 V -30 547 1884 2 v -30 596 2 50 v -3 581 a Fh(E1)21 b(+)h(E2)p 533 596 V 409 w Fe(eval)t Fm(\()p Fh(E1)p Fm(\))14 b(+)g Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p 1458 596 V 566 w(IF,)f(IF)h Fg(!)g Fm(IF)p 1731 596 V 71 w(Y)p 1852 596 V -30 598 1884 2 v -30 648 2 50 v -3 633 a Fh(E1)21 b(-)h(E2)p 533 648 V 409 w Fe(eval)t Fm(\()p Fh(E1)p Fm(\))14 b(-)g Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p 1458 648 V 584 w(IF,)f(IF)h Fg(!)g Fm(IF)p 1731 648 V 71 w(Y)p 1852 648 V -30 650 1884 2 v -30 699 2 50 v -3 684 a Fh(E1)21 b(*)h(E2)p 533 699 V 409 w Fe(eval)t Fm(\()p Fh(E1)p Fm(\))14 b(*)g Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p 1458 699 V 577 w(IF,)f(IF)h Fg(!)g Fm(IF)p 1731 699 V 71 w(Y)p 1852 699 V -30 701 1884 2 v -30 751 2 50 v -3 736 a Fh(E1)21 b(/)h(E2)p 533 751 V 409 w Fe(eval)t Fm(\()p Fh(E1)p Fm(\))14 b(/)g Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p 1458 751 V 584 w(IF,)g(IF)g Fg(!)f Fm(F)p 1731 751 V 79 w(Y)p 1852 751 V -30 753 1884 2 v -30 802 2 50 v -3 787 a Fh(E1)21 b(//)h(E2)p 533 802 V 387 w Fe(rnd)t Fm(\()p Fe(eval)t Fm(\()p Fh(E1)p Fm(\))15 b(/)e Fe(eval)t Fm(\()p Fh(E2)p Fm(\)\))p 1458 802 V 519 w(I,)h(I)g Fg(!)f Fm(I)p 1731 802 V 112 w(Y)p 1852 802 V -30 804 1884 2 v -30 854 2 50 v -3 839 a Fh(E1)21 b(rem)h(E2)p 533 854 V 365 w Fe(eval)t Fm(\()p Fh(E1)p Fm(\))14 b(-)g(\()p Fe(rnd)t Fm(\()p Fe(eval)t Fm(\()p Fh(E1)p Fm(\))h(/)e Fe(eval)t Fm(\()p Fh(E2)p Fm(\)\)*)p Fe(eval)t Fm(\()p Fh(E2)p Fm(\)\))p 1458 854 V 124 w(I,)h(I)g Fg(!)f Fm(I)p 1731 854 V 112 w(Y)p 1852 854 V -30 855 1884 2 v -30 905 2 50 v -3 890 a Fh(E1)21 b(mod)h(E2)p 533 905 V 365 w Fe(eval)t Fm(\()p Fh(E1)p Fm(\))14 b(-)g(\()g Fg(b)p Fe(eval)t Fm(\()p Fh(E1)p Fm(\))g(/)g Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p Fg(c)h Fm(*)p Fe(eval)t Fm(\()p Fh(E2)p Fm(\)\))p 1458 905 V 157 w(I,)f(I)g Fg(!)f Fm(I)p 1731 905 V 112 w(Y)p 1852 905 V -30 907 1884 2 v -30 957 2 50 v -3 942 a Fh(E1)21 b(/\\)h(E2)p 533 957 V 387 w Fe(eval)t Fm(\()p Fh(E1)p Fm(\))14 b(bit)o(wise)p 851 942 13 2 v 15 w(and)g Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p 1458 957 2 50 v 430 w(I,)g(I)g Fg(!)f Fm(I)p 1731 957 V 112 w(Y)p 1852 957 V -30 958 1884 2 v -30 1008 2 50 v -3 993 a Fh(E1)21 b(\\/)h(E2)p 533 1008 V 387 w Fe(eval)t Fm(\()p Fh(E1)p Fm(\))14 b(bit)o(wise)p 851 993 13 2 v 15 w(or)g Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p 1458 1008 2 50 v 460 w(I,)g(I)g Fg(!)f Fm(I)p 1731 1008 V 112 w(Y)p 1852 1008 V -30 1010 1884 2 v -30 1060 2 50 v -3 1045 a Fh(E1)21 b(^)h(E2)p 533 1060 V 409 w Fe(eval)t Fm(\()p Fh(E1)p Fm(\))14 b(bit)o(wise)p 851 1045 13 2 v 15 w(xor)g Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p 1458 1060 2 50 v 438 w(I,)g(I)g Fg(!)f Fm(I)p 1731 1060 V 112 w(N)p 1852 1060 V -30 1061 1884 2 v -30 1111 2 50 v -3 1096 a Fh(\\)22 b(E)p 533 1111 V 496 w Fm(bit)o(wise)p 687 1096 13 2 v 15 w(not)14 b Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 1111 2 50 v 644 w(I)f Fg(!)h Fm(I)p 1731 1111 V 132 w(Y)p 1852 1111 V -30 1113 1884 2 v -30 1163 2 50 v -3 1148 a Fh(E1)21 b(<<)h(E2)p 533 1163 V 387 w Fe(eval)t Fm(\()p Fh(E1)p Fm(\))14 b(in)o(teger)p 848 1148 13 2 v 16 w(shift)p 944 1148 V 15 w(left)f Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p 1458 1163 2 50 v 346 w(I,)h(I)g Fg(!)f Fm(I)p 1731 1163 V 112 w(Y)p 1852 1163 V -30 1164 1884 2 v -30 1214 2 50 v -3 1199 a Fh(E1)21 b(>>)h(E2)p 533 1214 V 387 w Fe(eval)t Fm(\()p Fh(E1)p Fm(\))14 b(in)o(teger)p 848 1199 13 2 v 16 w(shift)p 944 1199 V 15 w(righ)o(t)f Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p 1458 1214 2 50 v 318 w(I,)h(I)g Fg(!)f Fm(I)p 1731 1214 V 112 w(Y)p 1852 1214 V -30 1216 1884 2 v -30 1266 2 50 v -3 1251 a Fh(abs\(E\))p 533 1266 V 430 w Fm(absolute)h(v)n(alue)g(of)f Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 1266 V 513 w(IF)g Fg(!)h Fm(IF)p 1731 1266 V 105 w(Y)p 1852 1266 V -30 1267 1884 2 v -30 1317 2 50 v -3 1302 a Fh(sign\(E\))p 533 1317 V 408 w Fm(sign)g(of)f Fe(eval)t Fm(\()p Fh(E)p Fm(\))h(\(-1)g(if)f Fb(<)h Fm(0,)f(0)h(if)f(=)h(0,)f(+1)h(if)f Fb(>)h Fm(0\))p 1458 1317 V 137 w(IF)f Fg(!)h Fm(IF)p 1731 1317 V 105 w(Y)p 1852 1317 V -30 1319 1884 2 v -30 1369 2 50 v -3 1354 a Fh(min\(E1,E2\))p 533 1369 V 342 w Fm(minimal)e(v)n(alue)h(b)q (et)o(w)o(een)i Fe(eval)t Fm(\()p Fh(E1)p Fm(\))f(and)g Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p 1458 1369 V 113 w(IF,)g(IF)f Fg(!)h Fm(?)p 1731 1369 V 82 w(N)p 1852 1369 V -30 1370 1884 2 v -30 1420 2 50 v -3 1405 a Fh(max\(E1,E2\))p 533 1420 V 342 w Fm(maximal)e(v)n(alue)h(b)q(et)o(w)o(een)i Fe(eval)t Fm(\()p Fh(E1)p Fm(\))f(and)g Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p 1458 1420 V 105 w(IF,)g(IF)f Fg(!)h Fm(?)p 1731 1420 V 82 w(N)p 1852 1420 V -30 1422 1884 2 v -30 1471 2 50 v -3 1457 a Fh(E1)21 b(**)h(E2)p 533 1471 V 387 w Fe(eval)t Fm(\()p Fh(E1)p Fm(\))14 b(raised)h(to)e(the)i(p)q(o)o (w)o(er)f(of)f Fe(eval)t Fm(\()p Fh(E2)p Fm(\))p 1458 1471 V 208 w(IF,)h(IF)g Fg(!)f Fm(F)p 1731 1471 V 79 w(Y)p 1852 1471 V -30 1473 1884 2 v -30 1523 2 50 v -3 1508 a Fh(sqrt\(E\))p 533 1523 V 408 w Fm(square)i(ro)q(ot)f(of)f Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 1523 V 572 w(IF)h Fg(!)f Fm(F)p 1731 1523 V 113 w(Y)p 1852 1523 V -30 1525 1884 2 v -30 1574 2 50 v -3 1559 a Fh(atan\(E\))p 533 1574 V 408 w Fm(arc)i(tangen)o(t)f(of)f Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 1574 V 571 w(IF)h Fg(!)f Fm(F)p 1731 1574 V 113 w(Y)p 1852 1574 V -30 1576 1884 2 v -30 1626 2 50 v -3 1611 a Fh(cos\(E\))p 533 1626 V 430 w Fm(cosine)i(of)e Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 1626 V 669 w(IF)h Fg(!)f Fm(F)p 1731 1626 V 113 w(Y)p 1852 1626 V -30 1628 1884 2 v -30 1677 2 50 v -3 1662 a Fh(acos\(E\))p 533 1677 V 408 w Fm(arc)i(cosine)f(of)f Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 1677 V 600 w(IF)h Fg(!)f Fm(F)p 1731 1677 V 113 w(N)p 1852 1677 V -30 1679 1884 2 v -30 1729 2 50 v -3 1714 a Fh(sin\(E\))p 533 1729 V 430 w Fm(sine)i(of)e Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 1729 V 708 w(IF)h Fg(!)f Fm(F)p 1731 1729 V 113 w(Y)p 1852 1729 V -30 1731 1884 2 v -30 1780 2 50 v -3 1765 a Fh(asin\(E\))p 533 1780 V 408 w Fm(arc)i(sine)f(of)f Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 1780 V 639 w(IF)h Fg(!)f Fm(F)p 1731 1780 V 113 w(N)p 1852 1780 V -30 1782 1884 2 v -30 1832 2 50 v -3 1817 a Fh(exp\(E\))p 533 1832 V 430 w Fb(e)i Fm(raised)f(to)g(the)g(p)q(o)o(w)o(er)g(of)f Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 1832 V 395 w(IF)h Fg(!)f Fm(F)p 1731 1832 V 113 w(Y)p 1852 1832 V -30 1833 1884 2 v -30 1883 2 50 v -3 1868 a Fh(log\(E\))p 533 1883 V 430 w Fm(natural)h(logarithms)e(of)i Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 1883 V 440 w(IF)g Fg(!)f Fm(F)p 1731 1883 V 113 w(Y)p 1852 1883 V -30 1885 1884 2 v -30 1935 2 50 v -3 1920 a Fh(float\(E\))p 533 1935 V 386 w Fm(the)i(\015oating)e (p)q(oin)o(t)g(n)o(um)o(b)q(er)h(equal)g(to)g Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 1935 V 197 w(IF)g Fg(!)f Fm(F)p 1731 1935 V 113 w(Y)p 1852 1935 V -30 1936 1884 2 v -30 1986 2 50 v -3 1971 a Fh(ceiling\(E\))p 533 1986 V 342 w Fm(rounds)i Fe(eval)t Fm(\()p Fh(E)p Fm(\))f(up)o(w)o(ard)g(to) f(the)i(nearest)g(in)o(teger)p 1458 1986 V 166 w(F)f Fg(!)f Fm(I)p 1731 1986 V 126 w(Y)p 1852 1986 V -30 1988 1884 2 v -30 2038 2 50 v -3 2023 a Fh(floor\(E\))p 533 2038 V 386 w Fm(rounds)i Fe(eval)t Fm(\()p Fh(E)p Fm(\))f(do)o(wn)o(w)o (ard)f(to)h(the)g(nearest)i(in)o(teger)p 1458 2038 V 116 w(F)e Fg(!)f Fm(I)p 1731 2038 V 126 w(Y)p 1852 2038 V -30 2039 1884 2 v -30 2089 2 50 v -3 2074 a Fh(round\(E\))p 533 2089 V 386 w Fm(rounds)i Fe(eval)t Fm(\()p Fh(E)p Fm(\))f(to)g(the)g(nearest)i(in)o(teger)p 1458 2089 V 313 w(F)e Fg(!)f Fm(I)p 1731 2089 V 126 w(Y)p 1852 2089 V -30 2091 1884 2 v -30 2141 2 50 v -3 2126 a Fh(truncate\(E\))p 533 2141 V 320 w Fm(the)i(in)o(teger)f(v)n(alue)f(of)h Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 2141 V 489 w(F)g Fg(!)f Fm(I)p 1731 2141 V 126 w(Y)p 1852 2141 V -30 2142 1884 2 v -30 2192 2 50 v -3 2177 a Fh(float)p 110 2177 14 2 v 15 w(fractional)p 345 2177 V 13 w(part\(E\))p 533 2192 2 50 v 50 w Fm(the)i(\015oat)e(equal)h(to)g(the)g(fractional)f (part)h(of)f Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 2192 V 126 w(F)g Fg(!)h Fm(F)p 1731 2192 V 120 w(Y)p 1852 2192 V -30 2194 1884 2 v -30 2244 2 50 v -3 2229 a Fh(float)p 110 2229 14 2 v 15 w(integer)p 279 2229 V 14 w(part\(E\))p 533 2244 2 50 v 115 w Fm(the)h(\015oat)e(equal)h(to)g(the)g(in)o(teger) g(part)h(of)e Fe(eval)t Fm(\()p Fh(E)p Fm(\))p 1458 2244 V 174 w(F)g Fg(!)h Fm(F)p 1731 2244 V 120 w(Y)p 1852 2244 V -30 2245 1884 2 v -30 2328 a(The)h(meaning)e(of)g(the)i (signature)f(\014eld)g(is)g(as)f(follo)o(ws:)33 2411 y Fg(\017)20 b Fm(I)14 b Fg(!)f Fm(I:)h(unary)g(function,)f(the)h(op)q (erand)h(m)o(ust)f(b)q(e)g(an)g(in)o(teger)g(and)g(the)g(result)h(is)f (an)f(in)o(teger.)33 2494 y Fg(\017)20 b Fm(F)c Fg(!)f Fm(F:)g(unary)g(function,)g(the)h(op)q(erand)g(m)o(ust)g(b)q(e)g(a)f (\015oating)f(p)q(oin)o(t)h(n)o(um)o(b)q(er)h(and)f(the)h(result)h(is)e (a)g(\015oating)74 2544 y(p)q(oin)o(t)f(n)o(um)o(b)q(er.)33 2627 y Fg(\017)20 b Fm(F)14 b Fg(!)g Fm(I:)f(unary)h(function,)f(the)h (op)q(erand)h(m)o(ust)f(b)q(e)g(a)g(\015oating)f(p)q(oin)o(t)g(n)o(um)o (b)q(er)h(and)g(the)g(result)h(is)f(an)f(in)o(teger.)33 2710 y Fg(\017)20 b Fm(IF)15 b Fg(!)g Fm(F:)f(unary)h(function,)g(the)h (op)q(erand)f(can)g(b)q(e)h(an)f(in)o(teger)g(or)g(a)g(\015oating)f(p)q (oin)o(t)h(n)o(um)o(b)q(er)g(and)g(the)g(result)74 2760 y(is)f(a)g(\015oating)e(p)q(oin)o(t)i(n)o(um)o(b)q(er.)33 2843 y Fg(\017)20 b Fm(IF)14 b Fg(!)g Fm(IF:)g(unary)g(function,)g(the) g(op)q(erand)h(can)g(b)q(e)f(an)g(in)o(teger)h(or)f(a)g(\015oating)f(p) q(oin)o(t)h(n)o(um)o(b)q(er)h(and)f(the)g(result)74 2893 y(has)g(the)h(same)f(t)o(yp)q(e)g(as)g(the)h(op)q(erand.)p eop end %%Page: 59 61 TeXDict begin 59 60 bop -30 -45 a Fm(7.6)41 b(Arithmetic)1557 b(59)p -30 -27 1890 4 v 33 115 a Fg(\017)20 b Fm(I,)14 b(I)f Fg(!)h Fm(I:)f(binary)h(function:)j(eac)o(h)e(op)q(erand)f(m)o (ust)g(b)q(e)g(an)g(in)o(teger)g(and)g(the)h(result)f(is)g(an)g(in)o (teger.)33 198 y Fg(\017)20 b Fm(IF,)f(IF)f Fg(!)h Fm(IF:)f(binary)g (function:)28 b(eac)o(h)19 b(op)q(erand)g(can)g(b)q(e)g(an)g(in)o (teger)g(or)g(a)f(\015oating)g(p)q(oin)o(t)g(n)o(um)o(b)q(er)h(and)74 248 y(the)c(result)h(is)e(a)g(\015oating)g(p)q(oin)o(t)g(n)o(um)o(b)q (er)h(if)f(at)g(least)h(one)g(op)q(erand)g(is)f(a)g(\015oating)g(p)q (oin)o(t)g(n)o(um)o(b)q(er,)g(an)h(in)o(teger)74 298 y(otherwise.)33 381 y Fg(\017)20 b Fm(IF,)15 b(IF)h Fg(!)f Fm(?:)21 b(binary)15 b(function:)21 b(eac)o(h)16 b(op)q(erand)g(can)g (b)q(e)g(an)g(in)o(teger)g(or)f(a)h(\015oating)e(p)q(oin)o(t)h(n)o(um)o (b)q(er)h(and)g(the)74 430 y(result)f(has)g(the)g(same)f(t)o(yp)q(e)h (as)g(the)g(selected)h(op)q(erand.)k(This)14 b(is)g(used)h(for)f Fh(min)g Fm(and)g Fh(max)p Fm(.)19 b(Note)c(that)f(in)g(case)74 480 y(of)g(equalit)o(y)e(b)q(et)o(w)o(een)k(an)d(in)o(teger)i(and)e(a)h (\015oating)f(p)q(oin)o(t)g(n)o(um)o(b)q(er)i(the)f(result)h(is)e(an)h (in)o(teger.)-30 563 y Fh(is)p Fm(,)i Fh(+)p Fm(,)f Fh(-)p Fm(,)g Fh(*)p Fm(,)h Fh(//)p Fm(,)f Fh(/)p Fm(,)g Fh(rem)p Fm(,)g(and)h Fh(mod)f Fm(are)h(prede\014ned)h(in\014x)f(op)q(erators.) 24 b Fh(+)15 b Fm(and)h Fh(-)f Fm(are)h(prede\014ned)i(pre\014x)e(op)q (erators)-30 613 y(\(section)f(7.14.10,)c(page)j(100\).)-30 713 y Fi(In)o(teger)c(division)g(rounding)f(function)p Fm(:)14 b(the)c(in)o(teger)g(division)e(rounding)h(function)g Fd(rnd)e Fh(\(X\))i Fm(rounds)h(the)g(\015oating)-30 762 y(p)q(oin)o(t)15 b(n)o(um)o(b)q(er)f Fh(X)h Fm(to)f(an)h(in)o (teger.)20 b(There)c(are)f(t)o(w)o(o)f(p)q(ossible)h(de\014nitions)f (\(dep)q(ending)i(on)e(the)h(target)g(mac)o(hine\))g(for)-30 812 y(this)f(function)g(whic)o(h)g(di\013er)g(on)g(negativ)o(e)g(n)o (um)o(b)q(ers:)33 895 y Fg(\017)20 b Fd(rnd)7 b Fh(\(X\))13 b Fm(=)h(in)o(teger)h(part)f(of)i Fh(X)p Fm(,)d(e.g.)18 b Fd(rnd)7 b Fh(\(-1.5\))12 b Fm(=)i Fh(-1)g Fm(\(round)g(to)o(w)o(ard) f(0\))33 978 y Fg(\017)20 b Fd(rnd)7 b Fh(\(X\))13 b Fm(=)h Fg(b)p Fh(X)p Fg(c)p Fm(,)g(e.g.)k Fd(rnd)7 b Fh(\(-1.5\))12 b Fm(=)i Fh(-2)g Fm(\(round)g(to)o(w)o(ard)f Fg(\0001)p Fm(\))-30 1061 y(The)h(de\014nition)f(of)f(this)h(function)g (determines)h(the)g(precise)h(de\014nition)d(of)h(the)g(in)o(teger)h (division)e Fh(\(//\)/2)f Fm(and)i(of)g(the)-30 1111 y(in)o(teger)j(remainder)g Fh(\(rem\)/2)p Fm(.)21 b(Rounding)14 b(to)o(w)o(ard)h(zero)h(is)f(the)h(most)f(common)g(case.)23 b(In)16 b(an)o(y)e(case)j(it)e(is)g(p)q(ossible)-30 1161 y(to)i(test)h(the)g(v)n(alue)f(\()p Fh(toward)p 445 1161 14 2 v 14 w(zero)f Fm(or)h Fh(down)p Fm(\))g(of)f(the)i Fh(integer)p 1017 1161 V 14 w(rounding)p 1207 1161 V 14 w(function)d Fm(Prolog)i(\015ag)f(to)h(determine)-30 1211 y(whic)o(h)d(function)g(b)q(eing)g(used)g(\(section)h(7.22.1,)d (page)i(133\).)-30 1310 y Fi(F)l(ast)j(mathematical)f(mo)q(de)p Fm(:)k(in)14 b(order)h(to)g(sp)q(eed-up)h(in)o(teger)f(computations,)g (the)g(GNU)g(Prolog)f(compiler)g(can)-30 1360 y(generate)j(faster)f(co) q(de)g(when)g(in)o(v)o(ok)o(ed)e(with)h(the)h Fh(--fast-math)d Fm(option)i(\(section)h(3.4.3,)d(page)j(22\).)22 b(In)15 b(this)g(mo)q(de)-30 1410 y(only)e(in)o(teger)h(op)q(erations)g(are)g (allo)o(w)o(ed)f(and)g(a)h(v)n(ariable)e(in)h(an)h(expression)h(m)o (ust)e(b)q(e)i(b)q(ound)e(at)h(ev)n(aluation)e(time)h(to)-30 1460 y(an)h(in)o(teger.)19 b(No)13 b(t)o(yp)q(e)i(c)o(hec)o(king)f(is)g (done.)-30 1559 y Fi(Errors)p -30 1615 1890 2 v -30 1665 2 50 v -3 1650 a Fm(a)g(sub-expression)h Fh(E)f Fm(is)f(a)h(v)n (ariable)p 915 1665 V 378 w Fh(instantiation)p 1230 1650 14 2 v 13 w(error)p 1859 1665 2 50 v -30 1667 1890 2 v -30 1766 2 100 v -3 1701 a Fm(a)g(sub-expression)h Fh(E)f Fm(is)f(neither)i(a)f(n)o(um)o(b)q(er)g(nor)g(an)-3 1751 y(ev)n(aluable)f(functor)p 915 1766 V 941 1701 a Fh(type)p 1032 1701 14 2 v 15 w(error\(evaluable,)18 b(E\))p 1859 1766 2 100 v -30 1768 1890 2 v -30 1867 2 100 v -3 1803 a Fm(a)c(sub-expression)h Fh(E)f Fm(is)f(a)h (\015oating)f(p)q(oin)o(t)g(n)o(um)o(b)q(er)-3 1853 y(while)g(an)h(in)o (teger)g(is)g(exp)q(ected)p 915 1867 V 941 1803 a Fh(type)p 1032 1803 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 1867 2 100 v -30 1869 1890 2 v -30 1969 2 100 v -3 1904 a Fm(a)14 b(sub-expression)h Fh(E)f Fm(is)f(an)h(in)o(teger)g(while)g (a)f(\015oating)-3 1954 y(p)q(oin)o(t)g(n)o(um)o(b)q(er)i(is)e(exp)q (ected)p 915 1969 V 941 1904 a Fh(type)p 1032 1904 14 2 v 15 w(error\(float,)19 b(E\))p 1859 1969 2 100 v -30 1970 1890 2 v -30 2020 2 50 v -3 2005 a Fm(a)14 b(division)e(b)o(y)i (zero)h(o)q(ccurs)p 915 2020 V 497 w Fh(evaluation)p 1164 2005 14 2 v 14 w(error\(zero)p 1398 2005 V 13 w(divisor\))p 1859 2020 2 50 v -30 2022 1890 2 v -30 2105 a Fi(P)o(ortabilit)o(y)-30 2204 y Fm(Refer)20 b(to)f(the)g(ab)q(o)o(v)o(e)g(table)g(to)g (determine)h(whic)o(h)f(ev)n(aluable)f(functors)h(are)h(ISO)f(and)g (whic)o(h)g(are)g(GNU)g(Prolog)-30 2254 y(extensions.)36 b(F)m(or)19 b(e\016ciency)h(reasons,)h(GNU)e(Prolog)g(do)q(es)h(not)f (detect)i(the)f(follo)o(wing)d(ISO)i(arithmetic)g(errors:)-30 2304 y Fh(float)p 83 2304 14 2 v 15 w(overflow)p Fm(,)12 b Fh(int)p 364 2304 V 15 w(overflow,)20 b(int)p 663 2304 V 15 w(underflow)p Fm(,)11 b(and)j Fh(undefined)p Fm(.)-30 2462 y Fi(7.6.2)48 b Fh(\(is\)/2)15 b Fi(-)h(ev)m(aluate)g(expression) -30 2588 y(T)l(emplates)74 2671 y Fh(is\(?term,)k(+evaluable\))-30 2754 y Fi(Description)-30 2854 y Fh(Result)h(is)g(Expression)8 b Fm(succeeds)k(if)g Fh(Result)d Fm(can)g(b)q(e)i(uni\014ed)e(with)h Fe(eval)t Fm(\()p Fh(Expression)p Fm(\).)15 b(Refer)10 b(to)f(the)i(ev)n(aluation)-30 2904 y(of)j(an)f(arithmetic)h (expression)h(for)f(the)g(de\014nition)g(of)f(the)i Fe(eval)j Fm(function)13 b(\(section)i(7.6.1,)d(page)i(57\).)p eop end %%Page: 60 62 TeXDict begin 60 61 bop -30 -45 a Fm(60)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fh(is)g Fm(is)g(a)f(prede\014ned)j(in\014x)d(op)q(erator)i (\(section)g(7.14.10,)c(page)j(100\).)-30 215 y Fi(Errors)-30 314 y Fm(Refer)h(to)e(the)i(ev)n(aluation)d(of)i(an)f(arithmetic)h (expression)h(for)f(p)q(ossible)g(errors)h(\(section)g(7.6.1,)c(page)j (57\).)-30 414 y Fi(P)o(ortabilit)o(y)-30 513 y Fm(ISO)h(predicate.)-30 671 y Fi(7.6.3)48 b Fh(\(=:=\)/2)15 b Fi(-)h(arithmetic)e(equal,)j Fh(\(=\\=\)/2)d Fi(-)i(arithmetic)f(not)g(equal,)116 721 y Fh(\(<\)/2)g Fi(-)h(arithmetic)f(less)h(than,)f Fh(\(=<\)/2)f Fi(-)i(arithmetic)f(less)h(than)e(or)i(equal)g(to,)116 770 y Fh(\(>\)/2)f Fi(-)h(arithmetic)f(greater)f(than,)h Fh(\(>=\)/2)g Fi(-)h(arithmetic)f(greater)f(than)h(or)h(equal)g(to)-30 897 y(T)l(emplates)74 995 y Fh(=:=\(+evaluable,)j(+evaluable\))74 1045 y(=\\=\(+evaluable,)g(+evaluable\))74 1095 y(<\(+evaluable,)g (+evaluable\))1040 995 y(=<\(+evaluable,)g(+evaluable\))1040 1045 y(>\(+evaluable,)g(+evaluable\))1040 1095 y(>=\(+evaluable,)g (+evaluable\))-30 1194 y Fi(Description)-30 1294 y Fh(Expr1)i(=:=)g (Expr2)13 b Fm(succeeds)k(if)c Fe(eval)t Fm(\()p Fh(Expr1)p Fm(\))g(=)h Fe(eval)t Fm(\()p Fh(Expr2)p Fm(\).)-30 1394 y Fh(Expr1)21 b(=\\=)g(Expr2)13 b Fm(succeeds)k(if)c Fe(eval)t Fm(\()p Fh(Expr1)p Fm(\))g Fg(6)p Fm(=)h Fe(eval)t Fm(\()p Fh(Expr2)p Fm(\).)-30 1493 y Fh(Expr1)21 b(<)h(Expr2)13 b Fm(succeeds)j(if)d Fe(eval)t Fm(\()p Fh(Expr1)p Fm(\))h Fb(<)g Fe(eval)t Fm(\()p Fh(Expr2)p Fm(\).)-30 1593 y Fh(Expr1)21 b(=<)h(Expr2)12 b Fm(succeeds)17 b(if)c Fe(eval)t Fm(\()p Fh(Expr1)p Fm(\))g Fg(\024)h Fe(eval)t Fm(\()p Fh(Expr2)p Fm(\).)-30 1693 y Fh(Expr1)21 b(>)h(Expr2)13 b Fm(succeeds)j(if)d Fe(eval)t Fm(\()p Fh(Expr1)p Fm(\))h Fb(>)g Fe(eval)t Fm(\()p Fh(Expr2)p Fm(\).)-30 1792 y Fh(Expr1)21 b(>=)h(Expr2)12 b Fm(succeeds)17 b(if)c Fe(eval)t Fm(\()p Fh(Expr1)p Fm(\))g Fg(\025)h Fe(eval)t Fm(\()p Fh(Expr2)p Fm(\).)-30 1892 y(Refer)h(to)g(the)g(ev)n(aluation)e(of)h (an)h(arithmetic)f(expression)i(for)e(the)h(de\014nition)g(of)f(the)h Fe(eval)k Fm(function)14 b(\(section)h(7.6.1,)-30 1942 y(page)f(57\).)-30 2041 y Fh(=:=)p Fm(,)f Fh(=\\=)p Fm(,)g Fh(<)p Fm(,)g Fh(=<)p Fm(,)g Fh(>)h Fm(and)f Fh(>=)h Fm(are)g(prede\014ned)i(in\014x)d(op)q(erators)i(\(section)g(7.14.10,)c (page)j(100\).)-30 2141 y Fi(Errors)-30 2240 y Fm(Refer)h(to)e(the)i (ev)n(aluation)d(of)i(an)f(arithmetic)h(expression)h(for)f(p)q(ossible) g(errors)h(\(section)g(7.6.1,)c(page)j(57\).)-30 2340 y Fi(P)o(ortabilit)o(y)-30 2440 y Fm(ISO)h(predicates.)-30 2605 y Ff(7.7)56 b(Dynamic)18 b(clause)g(managemen)n(t)-30 2732 y Fi(7.7.1)48 b(In)o(tro)q(duction)-30 2858 y(Static)16 b(and)g(dynamic)g(pro)q(cedures)p Fm(:)h(a)d(pro)q(cedure)j(is)d (either)h(dynamic)f(or)g(static.)20 b(All)14 b(built-in)f(predicates)j (are)-30 2908 y(static.)21 b(A)14 b(user-de\014ned)j(pro)q(cedure)f(is) e(static)h(b)o(y)f(default)g(unless)i(a)e Fh(dynamic/1)e Fm(directiv)o(e)j(precedes)i(its)e(de\014nition)p eop end %%Page: 61 63 TeXDict begin 61 62 bop -30 -45 a Fm(7.7)41 b(Dynamic)13 b(clause)h(managemen)o(t)1226 b(61)p -30 -27 1890 4 v -30 115 a(\(section)15 b(6.1.2,)d(page)i(41\).)k(Adding)c(a)f(clause)i (to)f(a)f(non-existen)o(t)i(pro)q(cedure)h(creates)g(a)d(dynamic)h(pro) q(cedure.)20 b(The)-30 165 y(clauses)c(of)e(a)g(dynamic)g(pro)q(cedure) i(can)f(b)q(e)g(altered)g(\(e.g.)k(using)c Fh(asserta/1)p Fm(\),)d(the)j(clauses)h(of)d(a)i(static)f(pro)q(cedure)-30 215 y(cannot)h(b)q(e)f(altered.)-30 314 y Fi(Priv)m(ate)j(and)g(public) f(pro)q(cedures)p Fm(:)i(eac)o(h)e(pro)q(cedure)h(is)e(either)g(public) g(or)g(priv)n(ate.)21 b(A)15 b(dynamic)f(pro)q(cedure)j(is)-30 364 y(alw)o(a)o(ys)12 b(public.)17 b(Eac)o(h)12 b(built-in)f(predicate) i(is)f(priv)n(ate,)g(and)g(a)g(static)g(user-de\014ned)j(pro)q(cedure)f (is)e(priv)n(ate)g(b)o(y)g(default)-30 414 y(unless)20 b(a)e Fh(public/1)e Fm(directiv)o(e)j(precedes)i(its)e(de\014nition)f (\(section)h(6.1.3,)e(page)i(41\).)31 b(If)18 b(a)g(dynamic)f (declaration)-30 464 y(exists)g(it)f(is)g(unnecessary)i(to)e(add)g(a)g (public)f(declaration)h(since)h(a)f(dynamic)f(pro)q(cedure)j(is)e(also) f(public.)24 b(A)17 b(clause)-30 513 y(of)d(a)g(public)f(pro)q(cedure)j (can)e(b)q(e)h(insp)q(ected)h(\(e.g.)i(using)c Fh(clause/2)p Fm(\),)e(a)i(clause)h(of)e(a)h(priv)n(ate)f(pro)q(cedure)j(cannot)f(b)q (e)-30 563 y(insp)q(ected.)-30 663 y Fi(A)j(logical)g(database)e(up)q (date)g(view)q Fm(:)21 b(an)o(y)15 b(c)o(hange)g(in)g(the)h(database)f (that)g(o)q(ccurs)i(as)e(the)h(result)g(of)e(executing)-30 713 y(a)i(goal)f(\(e.g.)23 b(when)17 b(a)e(sub-goal)g(is)h(a)f(call)g (of)k Fh(assertz/1)14 b Fm(or)i Fh(retract/1)p Fm(\))e(only)h (a\013ects)i(subsequen)o(t)h(activ)n(ations.)-30 762 y(The)d(c)o(hange)g(do)q(es)g(not)f(a\013ect)h(an)o(y)f(activ)n(ation)f (that)h(is)g(curren)o(tly)h(b)q(eing)g(executed.)21 b(Th)o(us)14 b(the)h(database)f(is)h(frozen)-30 812 y(during)e(the)h(execution)g(of) f(a)g(goal,)f(and)h(the)h(list)f(of)f(clauses)i(de\014ning)g(a)f (predication)g(is)g(\014xed)h(at)f(the)h(momen)o(t)f(of)f(its)-30 862 y(execution.)-30 1020 y Fi(7.7.2)48 b Fh(asserta/1)p Fi(,)15 b Fh(assertz/1)-30 1146 y Fi(T)l(emplates)74 1229 y Fh(asserta\(+clause\))74 1279 y(assertz\(+clause\))-30 1362 y Fi(Description)-30 1462 y Fh(asserta\(Clause\))g Fm(\014rst)j(con)o(v)o(erts)h(the)f(term)f Fh(Clause)g Fm(to)g(a)g(clause)h(and)f(then)i(adds)e(it)g(to)h(the)g(curren)o(t)h (in)o(ternal)-30 1512 y(database.)f(The)13 b(predicate)h(concerned)g(m) o(ust)f(b)q(e)g(dynamic)f(\(section)h(7.7.1,)e(page)h(60\))g(or)h (unde\014ned)g(and)g(the)g(clause)-30 1561 y(is)f(inserted)h(b)q(efore) f(the)g(\014rst)h(clause)f(of)f(the)h(predicate.)18 b(If)11 b(the)h(predicated)h(is)f(unde\014ned)g(it)g(is)f(created)i(as)f(a)f (dynamic)-30 1611 y(pro)q(cedure.)-30 1711 y Fh(assertz\(Clause\))h Fm(acts)k(lik)o(e)e Fh(asserta/1)f Fm(except)j(that)f(the)g(clause)h (is)e(added)h(at)g(the)h(end)f(of)f(all)g(existing)g(clauses)-30 1761 y(of)g(the)g(concerned)i(predicate.)-30 1860 y Fi(Con)o(v)o (erting)f(a)h(term)e Fh(Clause)h Fi(to)g(a)i(clause)e Fh(Clause1)p Fi(:)33 1943 y Fg(\017)20 b Fm(extract)13 b(the)g(head)f(and)f(the)i(b)q(o)q(dy)f(of)i Fh(Clause)p Fm(:)i(either)d Fh(Clause)d Fm(=)i Fh(\(Head)21 b(:-)g(Body\))11 b Fm(or)h Fh(Clause)e Fm(=)i Fh(Head)f Fm(and)74 1993 y Fh(Body)i Fm(=)h Fh(true)p Fm(.)33 2076 y Fg(\017)20 b Fh(Head)13 b Fm(m)o(ust)h(b)q(e)h(a)e(callable)g(term)h(\(or)g(else)h (the)g(con)o(v)o(ersion)f(fails\).)33 2159 y Fg(\017)20 b Fm(con)o(v)o(ert)15 b Fh(Body)e Fm(to)h(a)f(b)q(o)q(dy)h(clause)h (\(i.e.)i(a)d(goal\))f Fh(Body1)p Fm(.)33 2242 y Fg(\017)20 b Fm(the)15 b(con)o(v)o(erted)g(clause)f Fh(Clause1)f Fm(=)h Fh(\(Head)21 b(:-)g(Body1\))p Fm(.)-30 2325 y Fi(Con)o(v)o(erting)15 b(a)h(term)e Fh(T)i Fi(to)g(a)g(goal:)33 2408 y Fg(\017)k Fm(if)d Fh(T)c Fm(is)h(a)f(v)n(ariable)g(it)h(is)g (replaced)g(b)o(y)g(the)h(term)f Fh(call\(T\))p Fm(.)33 2491 y Fg(\017)20 b Fm(if)h Fh(T)c Fm(is)h(a)g(con)o(trol)g(construct)h Fh(\(','\)/2)p Fm(,)e Fh(\(;\)/2)g Fm(or)h Fh(\(->\)/2)f Fm(eac)o(h)h(argumen)o(t)g(of)f(the)i(con)o(trol)f(construct)h(is)74 2541 y(recursiv)o(ely)c(con)o(v)o(erted)g(to)f(a)g(goal.)33 2624 y Fg(\017)20 b Fm(if)d Fh(T)c Fm(is)h(a)f(callable)g(term)i(it)e (remains)h(unc)o(hanged.)33 2707 y Fg(\017)20 b Fm(otherwise)15 b(the)g(con)o(v)o(ersion)f(fails)e(\()p Fh(T)i Fm(is)g(neither)h(a)e(v) n(ariable)g(nor)h(a)g(callable)f(term\).)-30 2790 y Fi(Errors)p eop end %%Page: 62 64 TeXDict begin 62 63 bop -30 -45 a Fm(62)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(Head)f Fm(is)h(a)f(v)n(ariable)p 915 125 V 624 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(Head)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (callable)g(term)p 915 176 V 127 w Fh(type)p 1032 161 14 2 v 15 w(error\(callable,)19 b(Head\))p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(Body)13 b Fm(cannot)h(b)q(e)h(con)o(v)o(erted)g(to)e(a)h(goal)p 915 228 V 302 w Fh(type)p 1032 213 14 2 v 15 w(error\(callable,)19 b(Body\))p 1859 228 2 50 v -30 229 1890 2 v -30 329 2 100 v -3 264 a Fm(The)14 b(predicate)h(indicator)f Fh(Pred)f Fm(of)j Fh(Head)d Fm(is)h(that)g(of)f(a)-3 314 y(static)h(pro)q(cedure) p 915 329 V 941 264 a Fh(permission)p 1164 264 14 2 v 14 w(error\(modify,)941 314 y(static)p 1076 314 V 15 w(procedure,)19 b(Pred\))p 1859 329 2 100 v -30 331 1890 2 v -30 414 a Fi(P)o(ortabilit)o(y)-30 513 y Fm(ISO)c(predicates.)-30 671 y Fi(7.7.3)48 b Fh(retract/1)-30 797 y Fi(T)l(emplates)74 880 y Fh(retract\(+clause\))-30 963 y Fi(Description)-30 1063 y Fh(retract\(Clause\))12 b Fm(erases)k(the)f(\014rst)g(clause)g (of)f(the)h(database)g(that)f(uni\014es)h(with)f Fh(Clause)p Fm(.)k(The)d(concerned)i(pred-)-30 1113 y(icate)g(m)o(ust)f(b)q(e)h(a)f (dynamic)f(pro)q(cedure)j(\(section)f(7.7.1,)e(page)h(60\).)24 b(Remo)o(ving)15 b(all)g(clauses)i(of)f(a)f(pro)q(cedure)j(do)q(es)-30 1163 y(not)c(erase)g(the)g(pro)q(cedure)h(de\014nition.)i(T)m(o)c(ac)o (hiev)o(e)g(this)h(use)g Fh(abolish/1)d Fm(\(section)j(7.7.6,)d(page)j (63\).)j Fh(retract/1)11 b Fm(is)-30 1212 y(re-executable)16 b(on)e(bac)o(ktrac)o(king.)-30 1312 y Fi(Errors)p -30 1368 V -30 1417 2 50 v -3 1403 a Fh(Head)f Fm(is)h(a)f(v)n(ariable)p 915 1417 V 624 w Fh(instantiation)p 1230 1403 14 2 v 13 w(error)p 1859 1417 2 50 v -30 1419 1890 2 v -30 1469 2 50 v -3 1454 a(Head)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (callable)g(term)p 915 1469 V 127 w Fh(type)p 1032 1454 14 2 v 15 w(error\(callable,)19 b(Head\))p 1859 1469 2 50 v -30 1471 1890 2 v -30 1570 2 100 v -3 1505 a Fm(The)14 b(predicate)h(indicator)f Fh(Pred)f Fm(of)j Fh(Head)d Fm(is)h(that)g(of)f(a)-3 1555 y(static)h(pro)q(cedure)p 915 1570 V 941 1505 a Fh(permission)p 1164 1505 14 2 v 14 w(error\(modify,)941 1555 y(static)p 1076 1555 V 15 w(procedure,)19 b(Pred\))p 1859 1570 2 100 v -30 1572 1890 2 v -30 1655 a Fi(P)o(ortabilit)o(y)-30 1754 y Fm(ISO)g (predicate.)32 b(In)18 b(the)h(ISO)g(reference,)i(the)e(op)q(eration)f (asso)q(ciated)h(with)f(the)h Fh(permission)p 1546 1754 14 2 v 13 w(error)e Fm(is)h Fh(access)-30 1804 y Fm(while)d(it)g(is)g Fh(modify)f Fm(in)h(GNU)g(Prolog.)22 b(This)15 b(seems)i(to)e(b)q(e)h (an)f(error)h(of)f(the)h(ISO)f(reference)j(since)e(for)f Fh(asserta/1)-30 1854 y Fm(\(whic)o(h)f(is)g(similar)f(in)g(spirit)h (to)f Fh(retract/1)p Fm(\))g(the)h(op)q(eration)g(is)g(also)f Fh(modify)p Fm(.)-30 2012 y Fi(7.7.4)48 b Fh(retractall/1)-30 2138 y Fi(T)l(emplates)74 2221 y Fh(retractall\(+head\))-30 2304 y Fi(Description)-30 2404 y Fh(retractall\(Head\))12 b Fm(erases)k(all)d(clauses)i(whose)g(head)g(uni\014es)g(with)f Fh(Head)p Fm(.)k(The)d(concerned)i(predicate)e(m)o(ust)f(b)q(e)h(a)-30 2454 y(dynamic)f(pro)q(cedure)j(\(section)e(7.7.1,)d(page)j(60\).)k (The)c(pro)q(cedure)h(de\014nition)e(is)g(not)h(remo)o(v)o(ed)f(so)h (that)f(it)g(is)h(found)-30 2503 y(b)o(y)h Fh(current)p 187 2503 V 15 w(predicate/1)d Fm(\(section)j(7.8.1,)e(page)h(64\).)22 b Fh(abolish/1)14 b Fm(should)h(b)q(e)h(used)g(to)g(remo)o(v)o(e)f(the) h(pro)q(cedure)-30 2553 y(\(section)f(7.7.6,)d(page)i(63\).)-30 2653 y Fi(Errors)p -30 2708 1890 2 v -30 2758 2 50 v -3 2743 a Fh(Head)f Fm(is)h(a)f(v)n(ariable)p 915 2758 V 624 w Fh(instantiation)p 1230 2743 14 2 v 13 w(error)p 1859 2758 2 50 v -30 2760 1890 2 v -30 2810 2 50 v -3 2795 a(Head)g Fm(is)h(not)g(a)f(callable)g(term)p 915 2810 V 458 w Fh(type)p 1032 2795 14 2 v 15 w(error\(callable,)19 b(Head\))p 1859 2810 2 50 v -30 2811 1890 2 v -30 2911 2 100 v -3 2846 a Fm(The)14 b(predicate)h(indicator)f Fh(Pred)f Fm(of)j Fh(Head)d Fm(is)h(that)g(of)f(a)-3 2896 y(static)h(pro)q(cedure)p 915 2911 V 941 2846 a Fh(permission)p 1164 2846 14 2 v 14 w(error\(modify,)941 2896 y(static)p 1076 2896 V 15 w(procedure,)19 b(Pred\))p 1859 2911 2 100 v -30 2913 1890 2 v eop end %%Page: 63 65 TeXDict begin 63 64 bop -30 -45 a Fm(7.7)41 b(Dynamic)13 b(clause)h(managemen)o(t)1226 b(63)p -30 -27 1890 4 v -30 115 a Fi(P)o(ortabilit)o(y)-30 215 y Fm(GNU)14 b(Prolog)f (predicate.)-30 372 y Fi(7.7.5)48 b Fh(clause/2)-30 499 y Fi(T)l(emplates)74 582 y Fh(clause\(+head,)19 b(?callable)p 580 582 14 2 v 14 w(term\))-30 665 y Fi(Description)-30 764 y Fh(clause\(Head,)h(Body\))14 b Fm(succeeds)k(if)d(there)i(exists) f(a)f(clause)h(in)f(the)i(database)e(that)h(uni\014es)g(with)f Fh(Head)21 b(:-)h(Body)p Fm(.)-30 814 y(The)13 b(predicate)g(in)e (question)i(m)o(ust)e(b)q(e)i(a)f(public)f(pro)q(cedure)j(\(section)f (7.7.1,)d(page)i(60\).)17 b(Clauses)12 b(are)h(deliv)o(ered)f(from)-30 864 y(the)j(\014rst)g(to)e(the)i(last.)j(This)13 b(predicate)i(is)f (re-executable)i(on)d(bac)o(ktrac)o(king.)-30 964 y Fi(Errors)p -30 1019 1890 2 v -30 1069 2 50 v -3 1054 a Fh(Head)g Fm(is)h(a)f(v)n(ariable)p 915 1069 V 624 w Fh(instantiation)p 1230 1054 14 2 v 13 w(error)p 1859 1069 2 50 v -30 1071 1890 2 v -30 1121 2 50 v -3 1106 a(Head)g Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(a)f(callable)g(term)p 915 1121 V 127 w Fh(type)p 1032 1106 14 2 v 15 w(error\(callable,)19 b(Head\))p 1859 1121 2 50 v -30 1122 1890 2 v -30 1222 2 100 v -3 1157 a Fm(The)14 b(predicate)h(indicator)f Fh(Pred)f Fm(of)j Fh(Head)d Fm(is)h(that)g(of)f(a)-3 1207 y(priv)n(ate)h(pro)q(cedure)p 915 1222 V 941 1157 a Fh(permission)p 1164 1157 14 2 v 14 w(error\(access,)941 1207 y(private)p 1098 1207 V 14 w(procedure,)20 b(Pred\))p 1859 1222 2 100 v -30 1223 1890 2 v -30 1273 2 50 v -3 1258 a(Body)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (callable)g(term)p 915 1273 V 127 w Fh(type)p 1032 1258 14 2 v 15 w(error\(callable,)19 b(Body\))p 1859 1273 2 50 v -30 1275 1890 2 v -30 1358 a Fi(P)o(ortabilit)o(y)-30 1457 y Fm(ISO)c(predicate.)-30 1615 y Fi(7.7.6)48 b Fh(abolish/1)-30 1741 y Fi(T)l(emplates)74 1825 y Fh(abolish\(+predicate)p 472 1825 14 2 v 12 w(indicator\))-30 1908 y Fi(Description)-30 2007 y Fh(abolish\(Pred\))14 b Fm(remo)o(v)o(es)i(from)f(the)h (database)g(the)h(pro)q(cedure)h(whose)e(predicate)h(indicator)e(is)h Fh(Pred)p Fm(.)23 b(The)16 b(con-)-30 2057 y(cerned)g(predicate)f(m)o (ust)f(b)q(e)g(a)g(dynamic)f(pro)q(cedure)j(\(section)f(7.7.1,)c(page)j (60\).)-30 2157 y Fi(Errors)p eop end %%Page: 64 66 TeXDict begin 64 65 bop -30 -45 a Fm(64)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(Pred)f Fm(is)h(a)f(v)n(ariable)p 915 125 V 624 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 226 2 100 v -3 161 a(Pred)g Fm(is)h(a)f(term)i Fh(Name/Arity)c Fm(and)j(either)h Fh(Name)e Fm(or)-3 211 y Fh(Arity)g Fm(is)h(a)f(v)n(ariable)p 915 226 V 941 161 a Fh(instantiation)p 1230 161 14 2 v 13 w(error)p 1859 226 2 100 v -30 228 1890 2 v -30 327 2 100 v -3 263 a(Pred)g Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(a)f(predicate)-3 312 y(indicator)p 915 327 V 941 263 a Fh(type)p 1032 263 14 2 v 15 w(error\(predicate)p 1376 263 V 13 w(indicator,)19 b(Pred\))p 1859 327 2 100 v -30 329 1890 2 v -30 429 2 100 v -3 364 a(Pred)13 b Fm(is)h(a)f(term)i Fh(Name/Arity)c Fm(and)j Fh(Arity)f Fm(is)h(neither)-3 414 y(a)g(v)n(ariable)e(nor)i(an)g(in)o(teger)p 915 429 V 941 364 a Fh(type)p 1032 364 14 2 v 15 w(error\(integer,)19 b(Arity\))p 1859 429 2 100 v -30 430 1890 2 v -30 530 2 100 v -3 465 a(Pred)13 b Fm(is)h(a)f(term)h Fh(Name/Arity)e Fm(and)i Fh(Name)f Fm(is)g(neither)i(a)-3 515 y(v)n(ariable)e(nor)h(an) f(atom)p 915 530 V 941 465 a Fh(type)p 1032 465 14 2 v 15 w(error\(atom,)19 b(Name\))p 1859 530 2 100 v -30 532 1890 2 v -30 631 2 100 v -3 567 a(Pred)13 b Fm(is)h(a)f(term)i Fh(Name/Arity)c Fm(and)j Fh(Arity)f Fm(is)h(an)-3 616 y(in)o(teger)g Fb(<)g Fm(0)p 915 631 V 941 567 a Fh(domain)p 1076 567 14 2 v 15 w(error\(not)p 1289 567 V 13 w(less)p 1390 567 V 15 w(than)p 1493 567 V 15 w(zero,)21 b(Arity\))p 1859 631 2 100 v -30 633 1890 2 v -30 782 2 150 v -3 668 a(Pred)13 b Fm(is)h(a)f(term)i Fh(Name/Arity)c Fm(and)j Fh(Arity)f Fm(is)h(an)-3 718 y(in)o(teger)g Fb(>)g Fh(max)p 249 718 14 2 v 16 w(arity)e Fm(\015ag)i(\(section)h(7.22.1,)-3 767 y(page)f(133\))p 915 782 2 150 v 941 668 a Fh(representation)p 1252 668 14 2 v 13 w(error\(max)p 1463 668 V 14 w(arity\))p 1859 782 2 150 v -30 784 1890 2 v -30 884 2 100 v -3 819 a Fm(The)g(predicate)h(indicator)f Fh(Pred)f Fm(is)g(that)h(of)g(a) f(static)-3 869 y(pro)q(cedure)p 915 884 V 941 819 a Fh(permission)p 1164 819 14 2 v 14 w(error\(modify,)941 869 y(static)p 1076 869 V 15 w(procedure,)19 b(Pred\))p 1859 884 2 100 v -30 885 1890 2 v -30 968 a Fi(P)o(ortabilit)o(y)-30 1068 y Fm(ISO)c(predicate.)-30 1234 y Ff(7.8)56 b(Predicate)18 b(information)-30 1360 y Fi(7.8.1)48 b Fh(current)p 273 1360 14 2 v 15 w(predicate/1)-30 1487 y Fi(T)l(emplates)74 1570 y Fh(current)p 231 1570 V 14 w(predicate\(?predicate)p 684 1570 V 12 w(indicator\))-30 1653 y Fi(Description)-30 1752 y Fh(current)p 127 1752 V 15 w(predicate\(Pred\))16 b Fm(succeeds)23 b(if)c(there)i(exists)g(a)e(predicate)i(indicator)f (of)f(a)g(de\014ned)i(pro)q(cedure)h(that)-30 1802 y(uni\014es)c(with)f Fh(Pred)p Fm(.)26 b(All)16 b(user)i(de\014ned)g(pro)q(cedures)h(are)f (found,)e(whether)j(static)e(or)g(dynamic.)26 b(In)o(ternal)17 b(system)-30 1852 y(pro)q(cedures)j(whose)d(name)g(b)q(egins)h(with)e Fh('$')h Fm(are)g(not)g(found.)27 b(A)17 b(user-de\014ned)i(pro)q (cedure)g(is)e(found)g(ev)o(en)h(when)-30 1902 y(it)g(has)f(no)h (clauses.)29 b(A)18 b(user-de\014ned)i(pro)q(cedure)f(is)e(not)h(found) f(if)f(it)i(has)f(b)q(een)i(ab)q(olished.)28 b(T)m(o)17 b(conform)g(to)h(the)-30 1952 y(ISO)i(reference,)j(built-in)18 b(predicates)j(are)f(not)f(found)g(except)i(if)d(the)i Fh(strict)p 1275 1952 V 15 w(iso)e Fm(Prolog)h(\015ag)g(is)g(switc)o (hed)h(o\013)-30 2001 y(\(section)15 b(7.22.1,)d(page)i(133\).)j(This)d (predicate)h(is)e(re-executable)j(on)e(bac)o(ktrac)o(king.)-30 2101 y Fi(Errors)p -30 2157 1890 2 v -30 2256 2 100 v -3 2192 a Fh(Pred)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (predicate)-3 2241 y(indicator)p 915 2256 V 941 2192 a Fh(type)p 1032 2192 14 2 v 15 w(error\(predicate)p 1376 2192 V 13 w(indicator,)19 b(Pred\))p 1859 2256 2 100 v -30 2258 1890 2 v -30 2358 2 100 v -3 2293 a(Pred)13 b Fm(is)h(a)f(term)i Fh(Name/Arity)c Fm(and)j Fh(Arity)f Fm(is)h(neither)-3 2343 y(a)g(v)n(ariable)e(nor)i(an)g(in)o(teger)p 915 2358 V 941 2293 a Fh(type)p 1032 2293 14 2 v 15 w(error\(integer,) 19 b(Arity\))p 1859 2358 2 100 v -30 2359 1890 2 v -30 2459 2 100 v -3 2394 a(Pred)13 b Fm(is)h(a)f(term)h Fh(Name/Arity)e Fm(and)i Fh(Name)f Fm(is)g(neither)i(a)-3 2444 y(v)n(ariable)e(nor)h (an)f(atom)p 915 2459 V 941 2394 a Fh(type)p 1032 2394 14 2 v 15 w(error\(atom,)19 b(Name\))p 1859 2459 2 100 v -30 2460 1890 2 v -30 2560 2 100 v -3 2495 a(Pred)13 b Fm(is)h(a)f(term)i Fh(Name/Arity)c Fm(and)j Fh(Arity)f Fm(is)h(an)-3 2545 y(in)o(teger)g Fb(<)g Fm(0)p 915 2560 V 941 2495 a Fh(domain)p 1076 2495 14 2 v 15 w(error\(not)p 1289 2495 V 13 w(less)p 1390 2495 V 15 w(than)p 1493 2495 V 15 w(zero,)21 b(Arity\))p 1859 2560 2 100 v -30 2562 1890 2 v -30 2711 2 150 v -3 2597 a(Pred)13 b Fm(is)h(a)f(term)i Fh(Name/Arity)c Fm(and)j Fh(Arity)f Fm(is)h(an)-3 2646 y(in)o(teger)g Fb(>)g Fh(max)p 249 2646 14 2 v 16 w(arity)e Fm(\015ag)i(\(section)h(7.22.1,)-3 2696 y(page)f(133\))p 915 2711 2 150 v 941 2597 a Fh(representation)p 1252 2597 14 2 v 13 w(error\(max)p 1463 2597 V 14 w(arity\))p 1859 2711 2 150 v -30 2713 1890 2 v -30 2796 a Fi(P)o(ortabilit)o(y)-30 2895 y Fm(ISO)h(predicate.)p eop end %%Page: 65 67 TeXDict begin 65 66 bop -30 -45 a Fm(7.8)41 b(Predicate)15 b(information)1356 b(65)p -30 -27 1890 4 v -30 115 a Fi(7.8.2)48 b Fh(predicate)p 317 115 14 2 v 14 w(property/2)-30 241 y Fi(T)l(emplates)74 324 y Fh(predicate)p 275 324 V 14 w(property\(?predicat)o(e)p 706 324 V 13 w(indicator,)20 b(?predicate)p 1179 324 V 13 w(property\))-30 407 y Fi(Description)-30 507 y Fh(predicate)p 171 507 V 14 w(property\(Pred,)f(Property\))c Fm(succeeds)k(if)c(there)j(exists)f(a)f(predicate)h(indicator)f(of)g(a) g(de\014ned)h(pro-)-30 557 y(cedure)h(that)e(uni\014es)g(with)g Fh(Pred)f Fm(and)g(if)k Fh(Property)14 b Fm(uni\014es)i(with)g(one)g (of)f(the)h(prop)q(erties)i(of)d(the)h(pro)q(cedure.)26 b(All)-30 607 y(user)13 b(de\014ned)g(pro)q(cedures)h(and)d(built-in)f (predicates)k(are)e(found.)k(In)o(ternal)c(system)g(pro)q(cedures)i (whose)e(name)g(b)q(egins)-30 656 y(with)i Fh('$')f Fm(are)i(not)e (found.)18 b(This)c(predicate)h(is)e(re-executable)j(on)e(bac)o(ktrac)o (king.)-30 756 y Fi(Predicate)h(prop)q(erties)p Fm(:)33 839 y Fg(\017)20 b Fh(static)p Fm(:)d(if)c(the)i(pro)q(cedure)g(is)f (static.)33 922 y Fg(\017)20 b Fh(dynamic)p Fm(:)d(if)c(the)h(pro)q (cedure)i(is)e(dynamic.)33 1005 y Fg(\017)20 b Fh(private)p Fm(:)d(if)c(the)h(pro)q(cedure)i(is)e(priv)n(ate.)33 1088 y Fg(\017)20 b Fh(public)p Fm(:)d(if)c(the)i(pro)q(cedure)g(is)f (public.)33 1171 y Fg(\017)20 b Fh(user)p Fm(:)d(if)c(the)i(pro)q (cedure)h(is)d(a)h(user-de\014ned)i(pro)q(cedure.)33 1254 y Fg(\017)k Fh(built)p 187 1254 V 15 w(in)p Fm(:)d(if)d(the)g(pro) q(cedure)i(is)e(a)f(Prolog)g(built-in)g(predicate.)33 1337 y Fg(\017)20 b Fh(built)p 187 1337 V 15 w(in)p 246 1337 V 15 w(fd)p Fm(:)e(if)13 b(the)h(pro)q(cedure)i(is)e(an)f(FD)h (built-in)f(predicate.)33 1420 y Fg(\017)20 b Fh(native)p 209 1420 V 15 w(code)p Fm(:)d(if)c(the)h(pro)q(cedure)i(is)e(compiled)f (in)h(nativ)o(e)f(co)q(de.)33 1503 y Fg(\017)20 b Fh(prolog)p 209 1503 V 15 w(file\(File\))p Fm(:)c(source)f(\014le)f(from)f(whic)o (h)h(the)g(predicate)h(has)f(b)q(een)h(read.)33 1586 y Fg(\017)20 b Fh(prolog)p 209 1586 V 15 w(line\(Line\))p Fm(:)c(line)d(n)o(um)o(b)q(er)h(of)f(the)i(source)g(\014le.)-30 1669 y Fi(Errors)p -30 1725 1890 2 v -30 1825 2 100 v -3 1760 a Fh(Pred)e Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (predicate)-3 1810 y(indicator)p 915 1825 V 941 1760 a Fh(type)p 1032 1760 14 2 v 15 w(error\(predicate)p 1376 1760 V 13 w(indicator,)19 b(Pred\))p 1859 1825 2 100 v -30 1826 1890 2 v -30 1926 2 100 v -3 1861 a(Pred)13 b Fm(is)h(a)f(term)i Fh(Name/Arity)c Fm(and)j Fh(Arity)f Fm(is)h(neither)-3 1911 y(a)g(v)n(ariable)e(nor)i(an)g(in)o(teger)p 915 1926 V 941 1861 a Fh(type)p 1032 1861 14 2 v 15 w(error\(integer,) 19 b(Arity\))p 1859 1926 2 100 v -30 1928 1890 2 v -30 2027 2 100 v -3 1962 a(Pred)13 b Fm(is)h(a)f(term)h Fh(Name/Arity)e Fm(and)i Fh(Name)f Fm(is)g(neither)i(a)-3 2012 y(v)n(ariable)e(nor)h (an)f(atom)p 915 2027 V 941 1962 a Fh(type)p 1032 1962 14 2 v 15 w(error\(atom,)19 b(Name\))p 1859 2027 2 100 v -30 2029 1890 2 v -30 2128 2 100 v -3 2064 a(Pred)13 b Fm(is)h(a)f(term)i Fh(Name/Arity)c Fm(and)j Fh(Arity)f Fm(is)h(an)-3 2113 y(in)o(teger)g Fb(<)g Fm(0)p 915 2128 V 941 2064 a Fh(domain)p 1076 2064 14 2 v 15 w(error\(not)p 1289 2064 V 13 w(less)p 1390 2064 V 15 w(than)p 1493 2064 V 15 w(zero,)21 b(Arity\))p 1859 2128 2 100 v -30 2130 1890 2 v -30 2280 2 150 v -3 2165 a(Pred)13 b Fm(is)h(a)f(term)i Fh(Name/Arity)c Fm(and)j Fh(Arity)f Fm(is)h(an)-3 2215 y(in)o(teger)g Fb(>)g Fh(max)p 249 2215 14 2 v 16 w(arity)e Fm(\015ag)i(\(section)h(7.22.1,)-3 2265 y(page)f(133\))p 915 2280 2 150 v 941 2165 a Fh(representation)p 1252 2165 14 2 v 13 w(error\(max)p 1463 2165 V 14 w(arity\))p 1859 2280 2 150 v -30 2281 1890 2 v -30 2381 2 100 v -3 2316 a(Property)e Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(a)g (predicate)-3 2366 y(prop)q(ert)o(y)h(term)p 915 2381 V 941 2316 a Fh(domain)p 1076 2316 14 2 v 15 w(error\(predicate)p 1420 2316 V 12 w(property,)941 2366 y(Property\))p 1859 2381 2 100 v -30 2382 1890 2 v -30 2482 2 100 v -3 2417 a(Property)d Fm(=)i Fh(prolog)p 366 2417 14 2 v 15 w(file\(File\))e Fm(and)h Fh(File)g Fm(is)-3 2467 y(neither)i(a)e(v)n(ariable)g(nor)h (an)g(atom)p 915 2482 2 100 v 941 2417 a Fh(type)p 1032 2417 14 2 v 15 w(error\(atom,)19 b(File\))p 1859 2482 2 100 v -30 2484 1890 2 v -30 2583 2 100 v -3 2519 a(Property)12 b Fm(=)i Fh(prolog)p 366 2519 14 2 v 15 w(line\(Line\))e Fm(and)h Fh(Line)g Fm(is)-3 2568 y(neither)i(a)e(v)n(ariable)g(nor)h (an)g(in)o(teger)p 915 2583 2 100 v 941 2519 a Fh(type)p 1032 2519 14 2 v 15 w(error\(integer,)19 b(Line\))p 1859 2583 2 100 v -30 2585 1890 2 v -30 2668 a Fi(P)o(ortabilit)o(y)-30 2767 y Fm(GNU)14 b(Prolog)f(predicate.)p eop end %%Page: 66 68 TeXDict begin 66 67 bop -30 -45 a Fm(66)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Ff(7.9)56 b(All)18 b(solutions)-30 241 y Fi(7.9.1)48 b(In)o(tro)q(duction)-30 368 y Fm(It)13 b(is)f(sometimes)g(useful)h(to) f(collect)g(all)f(solutions)h(for)g(a)g(goal.)k(This)c(can)h(b)q(e)g (done)f(b)o(y)g(rep)q(eatedly)h(bac)o(ktrac)o(king)f(and)-30 418 y(gradually)i(building)g(the)i(list)e(of)h(solutions.)21 b(The)16 b(follo)o(wing)c(built-in)i(predicates)j(are)e(pro)o(vided)g (to)g(automate)g(this)-30 467 y(pro)q(cess.)-30 567 y(The)g(built-in)e (predicates)i(describ)q(ed)h(in)d(this)h(section)h(in)o(v)o(ok)o(e)e Fh(call/1)g Fm(\(section)i(6.2.3,)c(page)j(47\))g(on)g(the)g(argumen)o (t)-30 617 y Fh(Goal)p Fm(.)20 b(When)c(e\016ciency)f(is)g(crucial)g (and)f Fh(Goal)g Fm(is)h(complex)g(it)f(is)h(b)q(etter)h(to)f(de\014ne) h(an)e(auxiliary)f(predicate)j(whic)o(h)-30 667 y(can)f(then)f(b)q(e)h (compiled,)d(and)i(ha)o(v)o(e)g Fh(Goal)f Fm(call)g(this)h(predicate.) -30 824 y Fi(7.9.2)48 b Fh(findall/3)-30 951 y Fi(T)l(emplates)74 1034 y Fh(findall\(?term,)19 b(+callable)p 602 1034 14 2 v 14 w(term,)i(?list\))-30 1117 y Fi(Description)-30 1216 y Fh(findall\(Template,)e(Goal,)i(Instances\))14 b Fm(succeeds)k(if)h Fh(Instances)14 b Fm(uni\014es)j(with)f(the)h (list)f(of)f(v)n(alues)h(to)g(whic)o(h)-30 1266 y(a)j(v)n(ariable)f Fh(X)h Fm(not)g(o)q(ccurring)g(in)g Fh(Template)e Fm(or)i Fh(Goal)f Fm(w)o(ould)h(b)q(e)g(instan)o(tiated)g(b)o(y)g(successiv)o (e)i(re-executions)g(of)-30 1316 y Fh(call\(Goal\),)f(X)i(=)f(Template) 14 b Fm(after)i(systematic)g(replacemen)o(t)g(of)f(all)g(v)n(ariables)g (in)g Fh(X)g Fm(b)o(y)g(new)h(v)n(ariables.)22 b(Th)o(us,)-30 1366 y(the)15 b(order)g(of)e(the)h(list)g Fh(Instances)e Fm(corresp)q(onds)k(to)d(the)i(order)f(in)g(whic)o(h)g(the)g(pro)q(ofs) g(are)g(found.)-30 1466 y Fi(Errors)p -30 1521 1890 2 v -30 1571 2 50 v -3 1556 a Fh(Goal)f Fm(is)h(a)f(v)n(ariable)p 915 1571 V 624 w Fh(instantiation)p 1230 1556 14 2 v 13 w(error)p 1859 1571 2 50 v -30 1573 1890 2 v -30 1622 2 50 v -3 1608 a(Goal)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (callable)g(term)p 915 1622 V 127 w Fh(type)p 1032 1608 14 2 v 15 w(error\(callable,)19 b(Goal\))p 1859 1622 2 50 v -30 1624 1890 2 v -30 1823 2 200 v -3 1659 a Fm(The)14 b(predicate)h(indicator)f Fh(Pred)f Fm(of)j Fh(Goal)d Fm(do)q(es)i(not)-3 1709 y(corresp)q(ond)h(to)d(an)h(existing)f(pro)q (cedure)j(and)e(the)-3 1759 y(v)n(alue)f(of)h(the)g Fh(unknown)e Fm(Prolog)i(\015ag)f(is)h Fh(error)-3 1808 y Fm(\(section)h(7.22.1,)c (page)j(133\))p 915 1823 V 941 1659 a Fh(existence)p 1142 1659 14 2 v 14 w(error\(procedure,)k(Pred\))p 1859 1823 2 200 v -30 1825 1890 2 v -30 1875 2 50 v -3 1860 a(Instances)12 b Fm(is)i(neither)h(a)e(partial)g(list)g(nor)h(a)g(list) p 915 1875 V 149 w Fh(type)p 1032 1860 14 2 v 15 w(error\(list,)19 b(Instances\))p 1859 1875 2 50 v -30 1876 1890 2 v -30 1959 a Fi(P)o(ortabilit)o(y)-30 2059 y Fm(ISO)c(predicate.)-30 2217 y Fi(7.9.3)48 b Fh(bagof/3)p Fi(,)15 b Fh(setof/3)-30 2343 y Fi(T)l(emplates)74 2426 y Fh(bagof\(?term,)20 b(+callable)p 559 2426 14 2 v 13 w(term,)h(?list\))74 2476 y(setof\(?term,)f(+callable)p 559 2476 V 13 w(term,)h(?list\))-30 2559 y Fi(Description)-30 2659 y Fh(bagof\(Template,)e(Goal,)i (Instances\))13 b Fm(assem)o(bles)j(as)g(a)f(list)g(the)h(set)g(of)f (solutions)g(of)j Fh(Goal)c Fm(for)h(eac)o(h)h(di\013eren)o(t)-30 2708 y(instan)o(tiation)11 b(of)g(the)h(free)h(v)n(ariables)e(in)g Fh(Goal)p Fm(.)16 b(The)c(elemen)o(ts)h(of)e(eac)o(h)h(list)g(are)g(in) f(order)h(of)f(solution,)g(but)h(the)g(order)-30 2758 y(in)i(whic)o(h)g(eac)o(h)g(list)f(is)h(found)g(is)f(unde\014ned.)20 b(This)13 b(predicate)i(is)f(re-executable)i(on)d(bac)o(ktrac)o(king.) -30 2858 y Fi(F)l(ree)k(v)m(ariable)g(set)p Fm(:)h Fh(bagof/3)13 b Fm(groups)i(the)g(solutions)f(of)j Fh(Goal)c Fm(according)i(to)f(the) h(free)h(v)n(ariables)d(in)h Fh(Goal)p Fm(.)19 b(This)-30 2908 y(set)c(corresp)q(onds)g(to)e(all)f(v)n(ariables)g(o)q(ccurring)i (in)f Fh(Goal)f Fm(but)h(not)h(in)e Fh(Template)p Fm(.)k(It)e(is)f (sometimes)g(useful)g(to)g(exclude)p eop end %%Page: 67 69 TeXDict begin 67 68 bop -30 -45 a Fm(7.10)41 b(Streams)1588 b(67)p -30 -27 1890 4 v -30 115 a(some)15 b(additional)e(v)n(ariables)h (of)j Fh(Goal)p Fm(.)i(F)m(or)14 b(that,)g Fh(bagof/3)f Fm(recognizes)j(a)f(goal)e(of)h(the)h(form)f Fh(T^Goal)f Fm(and)h(exclude)-30 165 y(all)d(v)n(ariables)g(o)q(ccuring)h(in)f Fh(T)g Fm(from)g(the)h(free)h(v)n(ariable)d(set.)18 b Fh(\(^\)/2)11 b Fm(can)h(b)q(e)g(view)o(ed)g(as)f(an)h Fe(existential)g(quanti\014er)k Fm(\(the)-30 215 y(logical)e(reading)i (of)i Fh(X^Goal)c Fm(b)q(eing)i(\\there)g(exists)h(an)e Fh(X)g Fm(suc)o(h)i(that)e Fh(Goal)g Fm(is)h(true"\).)23 b(The)16 b(use)h(of)e(this)h(existen)o(tial)-30 264 y(quali\014er)e(is) g(sup)q(er\015uous)h(outside)f Fh(bagof/3)f Fm(\(and)h Fh(setof/3)p Fm(\))e(and)i(then)g(is)g(not)g(recognized.)-30 364 y Fh(\(^\)/2)f Fm(is)h(a)g(prede\014ned)h(in\014x)f(op)q(erator)g (\(section)h(7.14.10,)c(page)j(100\).)-30 464 y Fh(setof\(Template,)19 b(Goal,)i(Instances\))8 b Fm(is)h(equiv)n(alen)o(t)g(to)h Fh(bagof\(Template,Goa)o(l,I\),)18 b(sort\(I,Instances\))p Fm(.)-30 513 y(Eac)o(h)d(list)e(is)h(then)g(a)g(sorted)h(list)e (\(duplicate)h(elemen)o(ts)h(are)f(remo)o(v)o(ed\).)-30 613 y(F)m(rom)h(the)g(implemen)o(tation)f(p)q(oin)o(t)g(of)g(view)i Fh(setof/3)d Fm(is)i(as)g(fast)g(as)g Fh(bagof/3)p Fm(.)k(Both)d (predicates)g(use)g(an)f(in-place)-30 663 y(\(i.e.)j(destructiv)o(e\))e (sort)e(\(section)h(7.20.12,)c(page)j(125\))f(and)h(require)h(the)f (same)g(amoun)o(t)f(of)g(memory)m(.)-30 762 y Fi(Errors)p -30 818 1890 2 v -30 868 2 50 v -3 853 a Fh(Goal)g Fm(is)h(a)f(v)n (ariable)p 915 868 V 624 w Fh(instantiation)p 1230 853 14 2 v 13 w(error)p 1859 868 2 50 v -30 870 1890 2 v -30 919 2 50 v -3 904 a(Goal)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor) h(a)f(callable)g(term)p 915 919 V 127 w Fh(type)p 1032 904 14 2 v 15 w(error\(callable,)19 b(Goal\))p 1859 919 2 50 v -30 921 1890 2 v -30 1120 2 200 v -3 956 a Fm(The)14 b(predicate)h(indicator)f Fh(Pred)f Fm(of)j Fh(Goal)d Fm(do)q(es)i(not)-3 1006 y(corresp)q(ond)h(to)d(an)h(existing)f(pro)q (cedure)j(and)e(the)-3 1056 y(v)n(alue)f(of)h(the)g Fh(unknown)e Fm(Prolog)i(\015ag)f(is)h Fh(error)-3 1105 y Fm(\(section)h(7.22.1,)c (page)j(133\))p 915 1120 V 941 956 a Fh(existence)p 1142 956 14 2 v 14 w(error\(procedure,)k(Pred\))p 1859 1120 2 200 v -30 1122 1890 2 v -30 1172 2 50 v -3 1157 a(Instances)12 b Fm(is)i(neither)h(a)e(partial)g(list)g(nor)h(a)g(list)p 915 1172 V 149 w Fh(type)p 1032 1157 14 2 v 15 w(error\(list,)19 b(Instances\))p 1859 1172 2 50 v -30 1173 1890 2 v -30 1256 a Fi(P)o(ortabilit)o(y)-30 1356 y Fm(ISO)c(predicates.)-30 1522 y Ff(7.10)56 b(Streams)-30 1648 y Fi(7.10.1)48 b(In)o(tro)q (duction)-30 1775 y Fm(A)14 b(stream)h(pro)o(vides)f(a)g(logical)e (view)h(of)h(a)f(source/sink.)-30 1874 y Fi(Sources)h(and)h(sinks)p Fm(:)i(a)c(program)g(can)g(output)g(results)i(to)e(a)g(sink)g(or)g (input)g(data)g(from)g(a)g(source.)19 b(A)13 b(source/sink)-30 1924 y(ma)o(y)g(b)q(e)i(a)f(\014le)f(\(regular)h(\014le,)g(terminal,)f (device,.)6 b(.)h(.)f(\),)14 b(a)f(constan)o(t)i(term,)f(a)f(pip)q(e,)h (a)f(so)q(c)o(k)o(et,.)7 b(.)g(.)-30 2024 y Fi(Asso)q(ciating)19 b(a)f(stream)f(to)h(a)g(source/sink)p Fm(:)j(to)16 b(manipulate)f(a)g (source/sink)i(it)f(m)o(ust)g(b)q(e)g(asso)q(ciated)h(with)e(a)-30 2074 y(stream.)22 b(This)15 b(pro)o(vides)h(a)e(logical)g(and)g (uniform)g(view)h(of)g(the)g(source/sink)h(whatev)o(er)g(its)f(t)o(yp)q (e.)22 b(Once)16 b(this)f(asso-)-30 2123 y(ciation)e(has)h(b)q(een)h (established,)f(i.e.)j(a)c(stream)h(has)g(b)q(een)h(created,)g(all)d (subsequen)o(t)j(references)i(to)c(the)h(source/sink)-30 2173 y(are)k(made)f(b)o(y)g(referring)h(the)g(stream.)28 b(A)18 b(stream)g(is)f(unidirectional:)23 b(it)17 b(is)g(either)h(an)f (input)g(stream)h(or)f(an)g(out-)-30 2223 y(put)g(stream.)25 b(F)m(or)15 b(a)h(classical)g(\014le,)g(the)g(asso)q(ciation)g(is)g (done)g(b)o(y)g(op)q(ening)g(the)g(\014le)g(\(whose)h(name)f(is)g(sp)q (eci\014ed)h(as)-30 2273 y(an)g(atom\))g(with)f(the)i Fh(open/4)e Fm(\(section)h(7.10.6,)f(page)h(70\).)27 b(GNU)17 b(Prolog)f(mak)o(es)h(it)f(p)q(ossible)i(to)f(treat)g(a)g (Prolog)-30 2323 y(constan)o(t)c(term)g(as)f(a)g(source/sink)h(and)f (pro)o(vides)g(built-in)f(predicates)i(to)f(asso)q(ciate)h(a)f(stream)h (to)f(suc)o(h)h(a)e(term)i(\(sec-)-30 2372 y(tion)i(7.11,)e(page)i (82\).)21 b(GNU)15 b(Prolog)f(pro)o(vides)i(op)q(erating)e(system)i(in) o(terface)g(predicates)g(de\014ning)f(pip)q(es)h(b)q(et)o(w)o(een)-30 2422 y(GNU)d(Prolog)f(and)g(c)o(hild)g(pro)q(cesses)k(with)c(streams)h (asso)q(ciated)h(with)e(these)i(pip)q(es,)f(e.g.)k Fh(popen/3)11 b Fm(\(section)j(7.27.21,)-30 2472 y(page)d(153\).)16 b(Similarly)m(,)8 b(so)q(c)o(k)o(et)k(in)o(terface)f(predicates)h(asso) q(ciate)f(streams)h(to)e(a)g(so)q(c)o(k)o(et)i(to)e(allo)o(w)f(the)i (comm)o(unication,)-30 2522 y(e.g.)18 b Fh(socket)p 186 2522 14 2 v 15 w(connect/4)12 b Fm(\(section)i(7.28.5,)e(page)i(159\).) -30 2622 y Fi(Stream-term)p Fm(:)23 b(a)18 b(stream-term)g(iden)o (ti\014es)g(a)g(stream)g(during)f(a)g(call)g(of)g(an)h(input/output)f (built-in)g(predicate.)-30 2671 y(It)h(is)f(created)i(as)f(a)f(result)i (of)e(asso)q(ciating)g(a)g(stream)h(to)f(a)h(source/sink)g(\(section)g (ab)q(o)o(v)o(e\).)29 b(A)18 b(stream-term)g(is)f(a)-30 2721 y(comp)q(ound)d(term)h(of)e(the)h(form)f Fh('$stream'\(I\))f Fm(where)j Fh(I)e Fm(is)h(an)g(in)o(teger.)-30 2821 y Fi(Stream)19 b(aliases)p Fm(:)26 b(an)o(y)17 b(stream)h(ma)o(y)f(b)q(e) h(asso)q(ciated)g(with)g(a)f(stream)h(alias)e(whic)o(h)i(is)f(an)h (atom)e(whic)o(h)i(ma)o(y)f(b)q(e)-30 2871 y(used)h(to)e(refer)h(to)f (that)g(stream.)25 b(The)17 b(asso)q(ciation)f(can)g(b)q(e)h(done)f(at) g(op)q(en)h(time)f(or)g(using)g Fh(add)p 1549 2871 V 15 w(stream)p 1696 2871 V 15 w(alias/2)p eop end %%Page: 68 70 TeXDict begin 68 69 bop -30 -45 a Fm(68)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a(\(section)e(7.10.20,)c(page)i(79\).)17 b(Suc)o(h)11 b(an)f(asso)q(ciation)g(automatically)e(ends)j(when)g(the)g(stream)g (is)g(closed.)17 b(A)10 b(particular)-30 165 y(alias)j(only)g(refers)i (to)e(at)g(most)h(one)f(stream)h(at)g(an)o(y)f(one)g(time.)18 b(Ho)o(w)o(ev)o(er,)13 b(more)h(than)f(one)h(alias)f(can)g(b)q(e)h (asso)q(ciated)-30 215 y(with)i(a)g(stream.)24 b(Most)16 b(built-in)f(predicates)i(whic)o(h)f(ha)o(v)o(e)g(a)f(stream-term)i(as) f(an)g(input)f(argumen)o(t)h(also)f(accept)i(a)-30 264 y(stream)e(alias)d(as)i(that)f(argumen)o(t.)18 b(Ho)o(w)o(ev)o(er,)c (built-in)e(predicates)j(whic)o(h)e(return)i(a)e(stream-term)i(do)e (not)h(accept)g(a)-30 314 y(stream)h(alias.)-30 414 y Fi(Standard)21 b(streams)p Fm(:)30 b(t)o(w)o(o)20 b(streams)h(are)g (prede\014ned)h(and)e(op)q(en)g(during)g(the)h(execution)g(of)f(ev)o (ery)h(goal:)30 b(the)-30 464 y(standard)17 b(input)f(stream)h(whic)o (h)f(has)h(the)g(alias)e Fh(user)p 858 464 14 2 v 15 w(input)g Fm(and)h(the)h(standard)g(output)f(stream)h(whic)o(h)f(has)h (the)-30 513 y(alias)d Fh(user)p 157 513 V 15 w(output)p Fm(.)20 b(A)c(goal)d(whic)o(h)i(attempts)h(to)f(close)g(either)h (standard)g(stream)f(succeeds,)j(but)d(do)q(es)h(not)f(close)-30 563 y(the)g(stream.)-30 663 y Fi(Curren)o(t)h(streams)p Fm(:)k(during)15 b(execution)h(there)g(is)g(a)f(curren)o(t)h(input)g (stream)f(and)h(a)f(curren)o(t)i(output)e(stream.)23 b(By)-30 713 y(default,)13 b(the)h(curren)o(t)h(input)e(and)g(output)g (streams)h(are)g(the)g(standard)f(input)g(and)h(output)f(streams,)h (but)f(the)h(built-)-30 762 y(in)h(predicates)i Fh(set)p 287 762 V 15 w(input/1)d Fm(\(section)i(7.10.4,)d(page)i(69\))g(and)g Fh(set)p 1078 762 V 15 w(output/1)f Fm(\(section)i(7.10.5,)d(page)i (70\))g(can)h(b)q(e)-30 812 y(used)g(to)e(c)o(hange)h(them.)20 b(When)14 b(the)i(curren)o(t)f(input)g(stream)g(is)f(closed,)h(the)g (standard)g(input)f(stream)h(b)q(ecomes)h(the)-30 862 y(curren)o(t)i(input)d(stream.)24 b(When)16 b(the)g(curren)o(t)h (output)f(stream)g(is)f(closed,)i(the)f(standard)g(output)g(stream)g(b) q(ecomes)-30 912 y(the)f(curren)o(t)g(output)f(stream.)-30 1012 y Fi(T)l(ext)k(streams)e(and)g(binary)h(streams)p Fm(:)i(a)14 b(text)i(stream)f(is)g(a)g(sequence)i(of)e(c)o(haracters.) 23 b(A)15 b(text)g(stream)h(is)f(also)-30 1061 y(regarded)j(as)e(a)h (sequence)h(of)e(lines)g(where)i(eac)o(h)f(line)f(is)g(a)g(p)q(ossibly) h(empt)o(y)f(sequence)j(of)c(c)o(haracters)k(follo)o(w)o(ed)14 b(b)o(y)-30 1111 y(a)k(new)g(line)g(c)o(haracter.)31 b(GNU)18 b(Prolog)f(ma)o(y)f(add)i(or)g(remo)o(v)o(e)g(space)h(c)o (haracters)g(at)f(the)g(ends)h(of)e(lines)h(in)f(order)-30 1161 y(to)f(conform)g(to)g(the)h(con)o(v)o(en)o(tions)f(for)g(represen) o(ting)h(text)g(streams)g(in)f(the)g(op)q(erating)g(system.)26 b(A)16 b(binary)g(stream)-30 1211 y(is)i(a)e(sequence)k(of)c(b)o(ytes.) 29 b(Only)17 b(a)g(few)g(built-in)f(predicates)j(can)f(deal)f(with)f (binary)h(streams,)i(e.g.)27 b Fh(get)p 1717 1211 V 15 w(byte/2)-30 1261 y Fm(\(section)15 b(7.13,)d(page)i(89\).)-30 1360 y Fi(Stream)h(p)q(ositions)p Fm(:)h(the)e(stream)g(p)q(osition)f (of)g(a)g(stream)h(iden)o(ti\014es)g(an)g(absolute)f(p)q(osition)g(of)g (the)h(source/sink)g(to)-30 1410 y(whic)o(h)i(the)h(stream)f(is)g (connected)h(and)f(de\014nes)h(where)g(in)e(the)i(source/sink)g(the)f (next)g(input)g(or)g(output)g(will)e(tak)o(e)-30 1460 y(place.)27 b(A)17 b(stream)g(p)q(osition)f(is)h(a)f(ground)h(term)g (of)f(the)i(form)d Fh('$stream)p 1181 1460 V 15 w(position'\(I1,)k(I2,) i(I3,)g(I4\))16 b Fm(where)-30 1510 y Fh(I1)p Fm(,)f Fh(I2)p Fm(,)g Fh(I3)g Fm(and)g Fh(I4)g Fm(are)h(in)o(tegers.)23 b(Stream)16 b(p)q(ositions)f(are)h(used)g(to)f(rep)q(osition)h(a)f (stream)h(\(when)g(p)q(ossible\))f(using)-30 1559 y(for)f(instance)h Fh(set)p 265 1559 V 15 w(stream)p 412 1559 V 14 w(position/2)d Fm(\(section)j(7.10.13,)c(page)j(75\).)-30 1659 y Fi(The)19 b(p)q(osition)f(end)g(of)h(stream)p Fm(:)j(when)17 b(all)f(data)g(of)g (a)g(stream)h Fd(S)24 b Fm(has)17 b(b)q(een)h(input)e Fd(S)24 b Fm(has)16 b(a)h(stream)g(p)q(osition)-30 1709 y(end-of-stream.)j(A)o(t)14 b(this)h(stream)g(p)q(osition)e(a)h(goal)f (to)i(input)f(more)g(data)g(will)f(return)j(a)e(sp)q(eci\014c)h(v)n (alue)f(to)g(indicate)-30 1759 y(that)f(end)g(of)f(stream)i(has)e(b)q (een)i(reac)o(hed)g(\(e.g.)k Fh(-1)12 b Fm(for)g Fh(get)p 921 1759 V 15 w(code/2)g Fm(or)g Fh(end)p 1195 1759 V 15 w(of)p 1254 1759 V 15 w(file)g Fm(for)h Fh(get)p 1498 1759 V 15 w(char/2)p Fm(,.)t(.)7 b(.)f(\).)18 b(When)-30 1809 y(this)c(terminating)g(v)n(alue)f(has)h(b)q(een)h(input,)e(the)i (stream)f(has)g(a)g(stream)g(p)q(osition)f(past-end-of-stream.)-30 1908 y Fi(Bu\013ering)20 b(mo)q(de)p Fm(:)25 b(input/output)18 b(on)g(a)g(stream)g(can)h(b)q(e)f(bu\013ered)i(\(line-bu\013ered)f(or)f (blo)q(c)o(k-bu\013ered\))h(or)f(not)-30 1958 y(bu\013ered)i(at)d(all.) 28 b(The)18 b(bu\013ering)g(mo)q(de)g(can)g(b)q(e)g(sp)q(eci\014ed)h (at)f(op)q(en)g(time)f(or)h(using)g Fh(set)p 1462 1958 V 15 w(stream)p 1609 1958 V 15 w(buffering/2)-30 2008 y Fm(\(section)d(7.10.27,)c(page)i(82\).)k(Line)d(bu\013ering)f(is)h (used)g(on)f(output)h(streams,)f(output)h(data)f(are)h(only)e(written)i (to)g(the)-30 2058 y(sink)d(when)g(a)g(new-line)f(c)o(haracter)i(is)f (output)g(\(or)g(at)f(the)i(close)f(time\).)17 b(Blo)q(c)o(k)10 b(bu\013ering)i(is)e(used)i(on)e(input)h(or)f(output.)-30 2107 y(On)i(input)f(streams,)i(when)e(an)h(input)f(is)g(requested)i(on) f(the)g(source,)g(if)f(the)h(bu\013er)g(is)f(empt)o(y)m(,)g(all)f(a)o (v)n(ailable)f(c)o(haracters)-30 2157 y(are)15 b(read)f(\(within)g(the) g(limits)f(of)g(the)h(size)h(of)e(the)i(bu\013er\),)g(subsequen)o(t)g (reads)g(will)d(\014rst)j(use)g(the)f(c)o(haracters)i(in)e(the)-30 2207 y(bu\013er.)29 b(On)17 b(output)h(streams,)g(output)f(data)g(are)g (stored)h(in)f(the)h(bu\013er)g(and)e(only)h(when)g(the)h(bu\013er)g (is)f(full)f(is)h(it)-30 2257 y(ph)o(ysically)12 b(written)h(on)f(the)h (sink.)k(Th)o(us,)c(an)f(output)h(to)f(a)g(bu\013ered)i(stream)f(ma)o (y)f(not)g(b)q(e)h(sen)o(t)g(immediately)e(to)i(the)-30 2307 y(sink)j(connected)i(to)e(that)g(stream.)25 b(When)16 b(it)f(is)h(necessary)i(to)e(b)q(e)g(certain)h(that)f(output)g(has)g(b) q(een)h(deliv)o(ered,)g(the)-30 2356 y(built-in)e(predicate)j Fh(flush)p 416 2356 V 14 w(output/1)d Fm(\(section)i(7.10.8,)d(page)i (72\))g(should)g(b)q(e)h(used.)25 b(Finally)m(,)15 b(it)g(is)h(also)g (p)q(ossible)-30 2406 y(to)g(use)g(non-bu\013ered)g(streams,)h(in)e (that)g(case)h(input/output)f(are)h(directly)g(done)f(on)h(the)g (connected)h(source/sink.)-30 2456 y(This)f(can)h(b)q(e)f(useful)h(for) e(comm)o(unication)g(purp)q(oses)j(\(e.g.)24 b(so)q(c)o(k)o(ets\))18 b(or)e(when)g(a)g(precise)i(con)o(trol)d(is)h(needed,)i(e.g.)-30 2506 y Fh(select/5)13 b Fm(\(section)h(7.27.25,)e(page)h(155\).)-30 2606 y Fi(Stream)18 b(mirrors)p Fm(:)23 b(an)o(y)16 b(stream)h(ma)o(y)f (b)q(e)h(asso)q(ciated)g(with)g(mirror)f(streams)i(sp)q(eci\014ed)g(at) e(op)q(en)h(time)g(or)f(using)-30 2655 y Fh(add)p 39 2655 V 16 w(stream)p 187 2655 V 14 w(mirror/2)f Fm(\(section)j (7.10.22,)d(page)i(79\).)26 b(Then,)18 b(all)e(c)o(haracters/b)o(ytes)j (read)e(from/written)g(to)g(the)-30 2705 y(stream)j(are)g(also)e (written)i(on)f(eac)o(h)h(mirror)f(stream.)34 b(The)20 b(asso)q(ciation)f(automatically)e(ends)j(when)g(either)g(the)-30 2755 y(stream)f(or)e(the)i(mirror)e(stream)h(is)g(closed.)30 b(It)18 b(is)f(also)g(p)q(ossible)h(to)g(explicitely)f(remo)o(v)o(e)h (a)f(mirror)g(stream)h(using)-30 2805 y Fh(remove)p 105 2805 V 15 w(stream)p 252 2805 V 14 w(mirror/2)13 b Fm(\(section)h (7.10.23,)e(page)h(80\).)p eop end %%Page: 69 71 TeXDict begin 69 70 bop -30 -45 a Fm(7.10)41 b(Streams)1588 b(69)p -30 -27 1890 4 v -30 115 a Fi(7.10.2)48 b Fh(current)p 297 115 14 2 v 14 w(input/1)-30 241 y Fi(T)l(emplates)74 318 y Fh(current)p 231 318 V 14 w(input\(?stream\))-30 395 y Fi(Description)-30 495 y Fh(current)p 127 495 V 15 w(input\(Stream\))11 b Fm(uni\014es)j Fh(Stream)f Fm(with)g(the)i(stream-term)g(iden)o(tifying)d(the)i(curren)o(t)i (input)e(stream.)-30 594 y Fi(Errors)p -30 659 1890 2 v -30 709 2 50 v -3 694 a Fh(Stream)f Fm(is)g(neither)i(a)f(v)n (ariable)f(nor)g(a)h(stream)p 915 709 V 196 w Fh(domain)p 1076 694 14 2 v 15 w(error\(stream,)19 b(Stream\))p 1859 709 2 50 v -30 710 1890 2 v -30 794 a Fi(P)o(ortabilit)o(y)-30 893 y Fm(ISO)c(predicate.)-30 1050 y Fi(7.10.3)48 b Fh(current)p 297 1050 14 2 v 14 w(output/1)-30 1176 y Fi(T)l(emplates)74 1253 y Fh(current)p 231 1253 V 14 w(output\(?stream\))-30 1330 y Fi(Description)-30 1430 y Fh(current)p 127 1430 V 15 w(output\(Stream\))11 b Fm(uni\014es)j Fh(Stream)f Fm(with)g(the)i(stream-term)f(iden)o(tifying)f(the)h(curren)o(t)i (output)e(stream.)-30 1529 y Fi(Errors)p -30 1594 1890 2 v -30 1643 2 50 v -3 1628 a Fh(Stream)f Fm(is)g(neither)i(a)f(v)n (ariable)f(nor)g(a)h(stream)p 915 1643 V 196 w Fh(domain)p 1076 1628 14 2 v 15 w(error\(stream,)19 b(Stream\))p 1859 1643 2 50 v -30 1645 1890 2 v -30 1729 a Fi(P)o(ortabilit)o(y)-30 1828 y Fm(ISO)c(predicate.)-30 1985 y Fi(7.10.4)48 b Fh(set)p 209 1985 14 2 v 15 w(input/1)-30 2111 y Fi(T)l(emplates)74 2188 y Fh(set)p 143 2188 V 15 w(input\(+stream)p 444 2188 V 13 w(or)p 501 2188 V 16 w(alias\))-30 2265 y Fi(Description)-30 2364 y Fh(set)p 39 2364 V 16 w(input\(SorA\))9 b Fm(sets)k(the)f (curren)o(t)h(input)e(stream)h(to)f(b)q(e)i(the)f(stream)g(asso)q (ciated)g(with)f(the)h(stream-term)h(or)e(alias)-30 2414 y Fh(SorA)p Fm(.)-30 2514 y Fi(Errors)p -30 2570 1890 2 v -30 2619 2 50 v -3 2604 a Fh(SorA)i Fm(is)h(a)f(v)n(ariable)p 915 2619 V 624 w Fh(instantiation)p 1230 2604 14 2 v 13 w(error)p 1859 2619 2 50 v -30 2621 1890 2 v -30 2721 2 100 v -3 2656 a(SorA)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (stream-term)i(or)-3 2706 y(alias)p 915 2721 V 941 2656 a Fh(domain)p 1076 2656 14 2 v 15 w(error\(stream)p 1355 2656 V 13 w(or)p 1412 2656 V 15 w(alias,)21 b(SorA\))p 1859 2721 2 100 v -30 2722 1890 2 v -30 2772 2 50 v -3 2757 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i (stream)p 915 2772 V 155 w Fh(existence)p 1142 2757 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 2772 2 50 v -30 2774 1890 2 v -30 2824 2 50 v -3 2809 a(SorA)13 b Fm(is)h(an)f(output)i (stream)p 915 2824 V 485 w Fh(permission)p 1164 2809 14 2 v 14 w(error\(input,)k(stream,)h(SorA\))p 1859 2824 2 50 v -30 2825 1890 2 v -30 2908 a Fi(P)o(ortabilit)o(y)p eop end %%Page: 70 72 TeXDict begin 70 71 bop -30 -45 a Fm(70)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a(ISO)h(predicate.)-30 273 y Fi(7.10.5)48 b Fh(set)p 209 273 14 2 v 15 w(output/1)-30 399 y Fi(T)l(emplates)74 482 y Fh(set)p 143 482 V 15 w(output\(+stream)p 466 482 V 13 w(or)p 523 482 V 15 w(alias\))-30 565 y Fi(Description)-30 665 y Fh(set)p 39 665 V 16 w(output\(SorA\))12 b Fm(sets)k(the)f (curren)o(t)h(output)f(stream)h(to)e(b)q(e)i(the)f(stream)g(asso)q (ciated)h(with)e(the)i(stream-term)f(or)-30 715 y(alias)e Fh(SorA)p Fm(.)-30 814 y Fi(Errors)p -30 870 1890 2 v -30 920 2 50 v -3 905 a Fh(SorA)g Fm(is)h(a)f(v)n(ariable)p 915 920 V 624 w Fh(instantiation)p 1230 905 14 2 v 13 w(error)p 1859 920 2 50 v -30 921 1890 2 v -30 1021 2 100 v -3 956 a(SorA)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (stream-term)i(or)-3 1006 y(alias)p 915 1021 V 941 956 a Fh(domain)p 1076 956 14 2 v 15 w(error\(stream)p 1355 956 V 13 w(or)p 1412 956 V 15 w(alias,)21 b(SorA\))p 1859 1021 2 100 v -30 1023 1890 2 v -30 1072 2 50 v -3 1057 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i (stream)p 915 1072 V 155 w Fh(existence)p 1142 1057 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 1072 2 50 v -30 1074 1890 2 v -30 1124 2 50 v -3 1109 a(SorA)13 b Fm(is)h(an)f(input)h (stream)p 915 1124 V 511 w Fh(permission)p 1164 1109 14 2 v 14 w(error\(output,)19 b(stream,)h(SorA\))p 1859 1124 2 50 v -30 1125 1890 2 v -30 1208 a Fi(P)o(ortabilit)o(y)-30 1308 y Fm(ISO)15 b(predicate.)-30 1466 y Fi(7.10.6)48 b Fh(open/4)p Fi(,)15 b Fh(open/3)-30 1592 y Fi(T)l(emplates)74 1675 y Fh(open\(+source)p 341 1675 14 2 v 13 w(sink,)21 b(+io)p 551 1675 V 15 w(mode,)g(-stream,)f(+stream)p 1047 1675 V 14 w(option)p 1193 1675 V 15 w(list\))74 1725 y(open\(+source)p 341 1725 V 13 w(sink,)h(+io)p 551 1725 V 15 w(mode,)g(-stream\))-30 1808 y Fi(Description)-30 1908 y Fh(open\(SourceSink,)e(Mode,)i(Stream,)f(Options\))d Fm(op)q(ens)i(the)h(source/sink)f Fh(SourceSink)e Fm(for)h(input)g(or)h (output)-30 1957 y(as)e(indicated)g(b)o(y)g Fh(Mode)e Fm(and)i(the)g(list)f(of)g(stream-options)g Fh(Options)f Fm(and)i(uni\014es)g Fh(Stream)e Fm(with)h(the)h(stream-term)-30 2007 y(whic)o(h)g(is)g(asso)q(ciated)h(with)f(this)g(stream.)28 b(See)18 b Fh(absolute)p 938 2007 V 14 w(file)p 1040 2007 V 15 w(name/2)d Fm(for)i(information)e(ab)q(out)i(the)h(syn)o(tax) f(of)-30 2057 y Fh(SourceSink)12 b Fm(\(section)j(7.26.1,)c(page)j (141\).)-30 2157 y Fi(Input/output)h(mo)q(des)p Fm(:)21 b Fh(Mode)15 b Fm(is)h(an)g(atom)f(whic)o(h)h(de\014nes)i(the)e (input/output)g(op)q(erations)h(that)f(ma)o(y)f(b)q(e)h(p)q(er-)-30 2206 y(formed)e(the)h(stream.)j(P)o(ossible)c(mo)q(des)g(are:)33 2289 y Fg(\017)20 b Fh(read)p Fm(:)26 b(the)19 b(source/sink)g(is)f(a)g (source)h(and)f(m)o(ust)g(already)g(exist.)31 b(Input)19 b(starts)g(at)f(the)h(b)q(eginning)e(of)h(the)74 2339 y(source.)33 2422 y Fg(\017)i Fh(write)p Fm(:)d(the)e(source/sink)f(is) g(a)g(sink.)k(If)13 b(the)i(sink)e(already)h(exists)h(then)f(it)g(is)f (emptied)h(else)h(an)f(empt)o(y)g(sink)f(is)74 2472 y(created.)20 b(Output)14 b(starts)h(at)f(the)h(b)q(eginning)e(of)g(that)h(sink.)33 2555 y Fg(\017)20 b Fh(append)p Fm(:)d(the)d(source/sink)g(is)g(a)f (sink.)18 b(If)13 b(the)h(sink)f(do)q(es)h(not)g(exist)g(it)f(is)g (created.)20 b(Output)14 b(starts)g(at)g(the)g(end)74 2605 y(of)g(that)f(sink.)-30 2688 y Fi(Stream)19 b(options)p Fm(:)k Fh(Options)15 b Fm(is)i(a)g(list)g(of)f(stream)i(options.)27 b(If)17 b(this)g(list)g(con)o(tains)g(con)o(tradictory)g(options,)h (the)-30 2738 y(righ)o(tmost)c(option)f(is)h(the)g(one)g(whic)o(h)g (applies.)k(P)o(ossible)c(options)f(are:)33 2821 y Fg(\017)20 b Fh(type\(text)p Fm(/)p Fh(binary\))p Fm(:)14 b(sp)q(eci\014es)g (whether)g(the)f(stream)g(is)f(a)g(text)h(stream)g(or)f(a)g(binary)g (stream.)18 b(The)13 b(default)74 2871 y(v)n(alue)g(is)h Fh(text)p Fm(.)p eop end %%Page: 71 73 TeXDict begin 71 72 bop -30 -45 a Fm(7.10)41 b(Streams)1588 b(71)p -30 -27 1890 4 v 33 115 a Fg(\017)20 b Fh(reposition\(true)p Fm(/)p Fh(fa)o(lse\))p Fm(:)g(sp)q(eci\014es)f(whether)f(it)e(is)h(p)q (ossible)g(to)f(rep)q(osition)h(the)g(stream.)27 b(The)18 b(default)74 165 y(v)n(alue)13 b(is)h Fh(true)f Fm(except)j(if)d(the)h (stream)g(cannot)h(b)q(e)f(rep)q(ositioned)g(\(e.g.)k(a)c(terminal\).) 33 243 y Fg(\017)20 b Fh(eof)p 143 243 14 2 v 15 w(action\(error)p Fm(/)p Fh(eof)p 509 243 V 13 w(code)p Fm(/)p Fh(reset\))p Fm(:)25 b(sp)q(eci\014es)20 b(the)g(e\013ect)g(of)e(attempting)g(to)h (input)f(from)g(a)h(stream)74 293 y(whose)c(stream)f(p)q(osition)f(is)h (past-end-of-stream:)121 342 y Fi({)21 b Fh(error)p Fm(:)c(a)c Fh(permission)p 562 342 V 14 w(error)g Fm(is)g(raised)i(signifying)d (that)i(no)f(more)h(input)g(exists)g(in)g(this)g(stream.)121 404 y Fi({)21 b Fh(eof)p 235 404 V 15 w(code)p Fm(:)c(the)d(result)h (of)e(input)h(is)g(as)g(if)f(the)h(stream)h(p)q(osition)e(is)h (end-of-stream.)121 465 y Fi({)21 b Fh(reset)p Fm(:)d(the)d(stream)g(p) q(osition)e(is)i(reset)h(so)e(that)h(it)f(is)g(not)g (past-end-of-stream,)h(and)f(another)h(attempt)166 515 y(is)e(made)h(to)g(input)f(from)h(it)f(\(this)h(is)g(useful)g(when)g (inputting)f(from)h(a)f(terminal\).)74 543 y(The)i(default)e(v)n(alue)g (is)h Fh(eof)p 517 543 V 15 w(code)p Fm(.)33 621 y Fg(\017)20 b Fh(alias\(Alias\))p Fm(:)d(sp)q(eci\014es)f(that)f(the)g(atom)e Fh(Alias)h Fm(is)g(to)g(b)q(e)h(an)g(alias)e(for)h(the)h(stream.)20 b(By)15 b(default)f(no)g(alias)74 671 y(is)g(attac)o(hed)g(to)g(the)h (stream.)j(Sev)o(eral)c(aliases)g(can)g(b)q(e)h(de\014ned)g(for)e(a)h (same)g(stream.)33 749 y Fg(\017)20 b Fh(mirror\(Mirror\))p Fm(:)15 b(sp)q(eci\014es)h(the)f(stream)f(asso)q(ciated)h(with)f(the)g (stream-term)h(or)f(alias)f Fh(Mirror)f Fm(is)i(a)g(mirror)74 799 y(for)f(the)h(stream.)k(By)c(default)e(no)h(mirro)g(is)g(attac)o (hed)h(to)f(the)g(stream.)19 b(Sev)o(eral)13 b(mirrors)g(can)h(b)q(e)f (de\014ned)i(for)d(a)74 849 y(same)i(stream.)33 927 y Fg(\017)20 b Fh(buffering\(none)p Fm(/)p Fh(lin)o(e)p Fm(/)p Fh(blo)o(ck\))p Fm(:)13 b(sp)q(eci\014es)e(whic)o(h)f(t)o(yp)q (e)g(of)f(bu\013ering)i(is)e(used)i(b)o(y)e(input/output)h(op)q (erations)74 976 y(on)k(this)g(stream:)121 1026 y Fi({)21 b Fh(none)p Fm(:)c(no)c(bu\013ering.)121 1088 y Fi({)21 b Fh(line)p Fm(:)c(output)d(op)q(erations)g(bu\013er)h(data)e(emitted)i (un)o(til)e(a)g(new-line)h(o)q(ccurs)121 1149 y Fi({)21 b Fh(block)p Fm(:)15 b(input/output)c(op)q(erations)h(bu\013er)h(data)e (un)o(til)f(a)h(giv)o(en)g(n)o(um)o(b)q(er)h(\(implemen)o(tation)e(dep) q(endan)o(t\))166 1199 y(of)j(c)o(haracters/b)o(ytes)j(ha)o(v)o(e)e(b)q (een)h(treated.)74 1227 y(The)g(default)e(v)n(alue)g(is)h Fh(line)f Fm(for)h(a)f(terminal)g(\(TTY\),)h Fh(block)f Fm(otherwise.)-30 1300 y Fh(open\(SourceSink,)19 b(Mode,)i(Stream,)f (Options\))8 b Fm(is)i(equiv)n(alen)o(t)f(to)h Fh(open\(SourceSink,)18 b(Mode,)j(Stream,)f([]\))p Fm(.)-30 1400 y Fi(Errors)p -30 1455 1890 2 v -30 1505 2 50 v -3 1490 a Fh(SourceSink)12 b Fm(is)i(a)f(v)n(ariable)p 915 1505 V 493 w Fh(instantiation)p 1230 1490 14 2 v 13 w(error)p 1859 1505 2 50 v -30 1507 1890 2 v -30 1557 2 50 v -3 1542 a(Mode)g Fm(is)h(a)f(v)n(ariable)p 915 1557 V 624 w Fh(instantiation)p 1230 1542 14 2 v 13 w(error)p 1859 1557 2 50 v -30 1558 1890 2 v -30 1658 2 100 v -3 1593 a(Options)f Fm(is)i(a)g(partial)f(list)g(or)h(a)f(list) h(with)f(an)h(elemen)o(t)-3 1643 y Fh(E)g Fm(whic)o(h)f(is)h(a)g(v)n (ariable)p 915 1658 V 941 1593 a Fh(instantiation)p 1230 1593 14 2 v 13 w(error)p 1859 1658 2 100 v -30 1660 1890 2 v -30 1709 2 50 v -3 1694 a(Mode)f Fm(is)h(neither)h(a)e(v)n(ariable) g(nor)h(an)g(atom)p 915 1709 V 245 w Fh(type)p 1032 1694 14 2 v 15 w(error\(atom,)19 b(Mode\))p 1859 1709 2 50 v -30 1711 1890 2 v -30 1761 2 50 v -3 1746 a(Options)12 b Fm(is)i(neither)h(a)f(partial)e(list)i(nor)g(a)f(list)p 915 1761 V 193 w Fh(type)p 1032 1746 14 2 v 15 w(error\(list,)19 b(Options\))p 1859 1761 2 50 v -30 1763 1890 2 v -30 1812 2 50 v -3 1797 a(Stream)13 b Fm(is)g(not)h(a)g(v)n(ariable)p 915 1812 V 506 w Fh(type)p 1032 1797 14 2 v 15 w(error\(variable,)19 b(Stream\))p 1859 1812 2 50 v -30 1814 1890 2 v -30 1914 2 100 v -3 1849 a(SourceSink)12 b Fm(is)i(neither)g(a)g(v)n(ariable)f (nor)h(a)-3 1899 y(source/sink)p 915 1914 V 941 1849 a Fh(domain)p 1076 1849 14 2 v 15 w(error\(source)p 1355 1849 V 13 w(sink,)21 b(SourceSink\))p 1859 1914 2 100 v -30 1915 1890 2 v -30 1965 2 50 v -3 1950 a(Mode)13 b Fm(is)h(an)f(atom)h(but)g(not)f(an)h(input/output)g(mo)q(de)p 915 1965 V 78 w Fh(domain)p 1076 1950 14 2 v 15 w(error\(io)p 1267 1950 V 14 w(mode,)20 b(Mode\))p 1859 1965 2 50 v -30 1967 1890 2 v -30 2066 2 100 v -3 2002 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Options)f Fm(list)g(is)h (neither)h(a)-3 2051 y(v)n(ariable)e(nor)h(a)f(stream-option)p 915 2066 V 941 2002 a Fh(domain)p 1076 2002 14 2 v 15 w(error\(stream)p 1355 2002 V 13 w(option,)20 b(E\))p 1859 2066 2 100 v -30 2068 1890 2 v -30 2168 2 100 v -3 2103 a Fm(the)15 b(source/sink)f(sp)q(eci\014ed)i(b)o(y)e Fh(SourceSink)e Fm(do)q(es)-3 2153 y(not)i(exist)p 915 2168 V 941 2103 a Fh(existence)p 1142 2103 14 2 v 14 w(error\(source)p 1420 2103 V 13 w(sink,)21 b(SourceSink\))p 1859 2168 2 100 v -30 2169 1890 2 v -30 2269 2 100 v -3 2204 a Fm(the)15 b(source/sink)f(sp)q(eci\014ed)i(b)o(y)e Fh(SourceSink)e Fm(cannot)-3 2254 y(b)q(e)j(op)q(ened)p 915 2269 V 941 2204 a Fh(permission)p 1164 2204 14 2 v 14 w(error\(open,)k(source)p 1571 2204 V 15 w(sink,)941 2254 y(SourceSink\))p 1859 2269 2 100 v -30 2271 1890 2 v -30 2370 2 100 v -3 2306 a Fm(an)13 b(elemen)o(t)h Fh(E)f Fm(of)g(the)g Fh(Options)f Fm(list)h(is)g Fh(alias\(A\))f Fm(and)-3 2355 y Fh(A)i Fm(is)f(already)h(asso)q(ciated)h(with)e(an)h (op)q(en)g(stream)p 915 2370 V 941 2306 a Fh(permission)p 1164 2306 14 2 v 14 w(error\(open,)19 b(source)p 1571 2306 V 15 w(sink,)941 2355 y(alias\(A\)\))p 1859 2370 2 100 v -30 2372 1890 2 v -30 2472 2 100 v -3 2407 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Options)f Fm(list)g(is)h Fh(mirror\(M\))-3 2457 y Fm(and)g Fh(M)f Fm(is)h(not)g(asso)q(ciated)h(with)e(an)h(op)q(en)g(stream)p 915 2472 V 941 2407 a Fh(existence)p 1142 2407 14 2 v 14 w(error\(stream,)19 b(M\))p 1859 2472 2 100 v -30 2473 1890 2 v -30 2573 2 100 v -3 2508 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Options)f Fm(list)g(is)h Fh(mirror\(M\))-3 2558 y Fm(and)g Fh(M)f Fm(iis)h(an)f(input)h(stream)p 915 2573 V 941 2508 a Fh(permission)p 1164 2508 14 2 v 14 w(error\(output,)19 b(stream,)h(M\))p 1859 2573 2 100 v -30 2575 1890 2 v -30 2724 2 150 v -3 2609 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Options)f Fm(list)g(is)-3 2659 y Fh(reposition\(true\))e Fm(and)i(it)h(is)g(not)f (p)q(ossible)h(to)-3 2709 y(rep)q(osition)g(this)g(stream)p 915 2724 V 941 2609 a Fh(permission)p 1164 2609 14 2 v 14 w(error\(open,)19 b(source)p 1571 2609 V 15 w(sink,)941 2659 y(reposition\(true\)\))p 1859 2724 2 150 v -30 2726 1890 2 v -30 2808 a Fi(P)o(ortabilit)o(y)-30 2908 y Fm(ISO)c (predicates.)k(The)14 b Fh(mirror/1)f Fm(and)g Fh(buffering/1)f Fm(stream)i(options)g(are)g(GNU)g(Prolog)f(extensions.)p eop end %%Page: 72 74 TeXDict begin 72 73 bop -30 -45 a Fm(72)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(7.10.7)48 b Fh(close/2)p Fi(,)15 b Fh(close/1)-30 241 y Fi(T)l(emplates)74 324 y Fh(close\(+stream)p 363 324 14 2 v 13 w(or)p 420 324 V 16 w(alias,)20 b(+close)p 720 324 V 15 w(option)p 867 324 V 14 w(list\))74 374 y(close\(+stream)p 363 374 V 13 w(or)p 420 374 V 16 w(alias\))-30 457 y Fi(Description)-30 557 y Fh(close\(SorA,)g(Options\))f Fm(closes)i(the)g(stream)g(asso)q(ciated)g(with)f(the)h(stream-term)h (or)e(alias)f Fh(SorA)p Fm(.)g(If)24 b Fh(SorA)19 b Fm(is)-30 607 y(the)e(standard)g(input)e(stream)i(or)f(the)h(standard)f(output)g (stream)h Fh(close/2)d Fm(simply)h(succeeds)k(else)e(the)f(asso)q (ciated)-30 656 y(source/sink)h(is)f(ph)o(ysically)e(closed.)24 b(If)19 b Fh(SorA)c Fm(is)g(the)i(curren)o(t)g(input)e(stream)i(the)f (curren)o(t)h(input)f(stream)g(b)q(ecomes)-30 706 y(the)f(standard)g (input)f(stream)h Fh(user)p 555 706 V 15 w(input)p Fm(.)j(If)f Fh(SorA)c Fm(is)h(the)h(curren)o(t)h(output)e(stream)h(the)g(curren)o (t)g(output)g(stream)-30 756 y(b)q(ecomes)h(the)e(standard)g(output)g (stream)h Fh(user)p 744 756 V 15 w(output)p Fm(.)-30 856 y Fi(Close)i(options)p Fm(:)f Fh(Options)d Fm(is)g(a)h(list)f(of)h (close)g(options.)k(F)m(or)13 b(the)i(momen)o(t)e(only)g(one)h(option)f (is)h(a)o(v)n(ailable:)33 939 y Fg(\017)20 b Fh(force\(true)p Fm(/)p Fh(false\))p Fm(:)13 b(with)d Fh(false)p Fm(,)f(if)g(an)h(error) i(o)q(ccurs)f(when)g(trying)f(to)g(close)h(the)f(source/sink,)i(the)f (stream)74 989 y(is)17 b(not)g(closed)h(and)f(an)g(error)h(\()p Fh(system)p 723 989 V 14 w(error)e Fm(or)h Fh(resource)p 1093 989 V 14 w(error)p Fm(\))f(is)h(raised)h(\(but)f Fh(close/2)f Fm(succeeds\).)74 1038 y(With)c Fh(true)p Fm(,)f(if)g(an)g(error)i(o)q(ccurs)h(it)d(is)h(ignored)g(and)g(the)g (stream)h(is)e(closed.)18 b(The)13 b(purp)q(ose)g(of)h Fh(force/1)d Fm(option)74 1088 y(is)h(to)h(allo)o(w)d(an)i(error)i (handling)d(routine)h(to)g(do)g(its)h(b)q(est)g(to)f(reclaim)g (resources.)20 b(The)13 b(default)f(v)n(alue)g(is)g Fh(false)p Fm(.)-30 1171 y Fh(close\(SorA\))g Fm(is)i(equiv)n(alen)o(t)f(to)h Fh(close\(SorA,)19 b([]\))p Fm(.)-30 1271 y Fi(Errors)p -30 1326 1890 2 v -30 1376 2 50 v -3 1361 a Fh(SorA)13 b Fm(is)h(a)f(v)n(ariable)p 915 1376 V 624 w Fh(instantiation)p 1230 1361 14 2 v 13 w(error)p 1859 1376 2 50 v -30 1378 1890 2 v -30 1478 2 100 v -3 1413 a(Options)f Fm(is)i(a)g(partial)f (list)g(or)h(a)f(list)h(with)f(an)h(elemen)o(t)-3 1463 y Fh(E)g Fm(whic)o(h)f(is)h(a)g(v)n(ariable)p 915 1478 V 941 1413 a Fh(instantiation)p 1230 1413 14 2 v 13 w(error)p 1859 1478 2 100 v -30 1479 1890 2 v -30 1529 2 50 v -3 1514 a(Options)e Fm(is)i(neither)h(a)f(partial)e(list)i(nor)g(a)f(list) p 915 1529 V 193 w Fh(type)p 1032 1514 14 2 v 15 w(error\(list,)19 b(Options\))p 1859 1529 2 50 v -30 1531 1890 2 v -30 1630 2 100 v -3 1566 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g (nor)h(a)f(stream-term)i(or)-3 1615 y(alias)p 915 1630 V 941 1566 a Fh(domain)p 1076 1566 14 2 v 15 w(error\(stream)p 1355 1566 V 13 w(or)p 1412 1566 V 15 w(alias,)21 b(SorA\))p 1859 1630 2 100 v -30 1632 1890 2 v -30 1732 2 100 v -3 1667 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Options)f Fm(list)g(is)h(neither)h(a)-3 1717 y(v)n(ariable)e(nor)h (a)f(close-option)p 915 1732 V 941 1667 a Fh(domain)p 1076 1667 14 2 v 15 w(error\(close)p 1333 1667 V 13 w(option,)20 b(E\))p 1859 1732 2 100 v -30 1733 1890 2 v -30 1783 2 50 v -3 1768 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f (op)q(en)i(stream)p 915 1783 V 155 w Fh(existence)p 1142 1768 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 1783 2 50 v -30 1785 1890 2 v -30 1835 2 50 v -3 1820 a(SorA)13 b Fm(needs)i(a)f(sp)q(ecial)g(close)g(\(section)h(7.11,)d(page)i(82\))p 915 1835 V 52 w Fh(system)p 1076 1820 14 2 v 15 w(error\(needs)p 1333 1820 V 13 w(special)p 1500 1820 V 14 w(close\))p 1859 1835 2 50 v -30 1836 1890 2 v -30 1919 a Fi(P)o(ortabilit)o(y)-30 2019 y Fm(ISO)h(predicates.)k(The)14 b Fh(system)p 487 2019 14 2 v 15 w(error\(needs)p 744 2019 V 13 w(special)p 911 2019 V 15 w(close\))e Fm(is)i(a)g(GNU)f(Prolog)g(extension.)-30 2176 y Fi(7.10.8)48 b Fh(flush)p 253 2176 V 15 w(output/1)p Fi(,)14 b Fh(flush)p 581 2176 V 15 w(output/0)-30 2303 y Fi(T)l(emplates)74 2386 y Fh(flush)p 187 2386 V 15 w(output\(+stream)p 510 2386 V 13 w(or)p 567 2386 V 15 w(alias\))74 2436 y(flush)p 187 2436 V 15 w(output)-30 2519 y Fi(Description)-30 2618 y Fh(flush)p 83 2618 V 15 w(output\(SorA\))d Fm(sends)16 b(an)o(y)d(bu\013ered)i(output)g(c)o (haracters/b)o(ytes)h(to)d(the)i(stream.)-30 2718 y Fh(flush)p 83 2718 V 15 w(output/0)d Fm(applies)i(to)g(the)g(curren)o(t)i(output)e (stream.)-30 2817 y Fi(Errors)p eop end %%Page: 73 75 TeXDict begin 73 74 bop -30 -45 a Fm(7.10)41 b(Streams)1588 b(73)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(SorA)13 b Fm(is)h(a)f(v)n(ariable)p 915 125 V 624 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 226 2 100 v -3 161 a(SorA)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(stream-term)i (or)-3 211 y(alias)p 915 226 V 941 161 a Fh(domain)p 1076 161 14 2 v 15 w(error\(stream)p 1355 161 V 13 w(or)p 1412 161 V 15 w(alias,)21 b(SorA\))p 1859 226 2 100 v -30 228 1890 2 v -30 278 2 50 v -3 263 a(SorA)13 b Fm(is)h(not)g(asso)q (ciated)g(with)g(an)f(op)q(en)i(stream)p 915 278 V 155 w Fh(existence)p 1142 263 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 278 2 50 v -30 279 1890 2 v -30 329 2 50 v -3 314 a(SorA)13 b Fm(is)h(an)f(input)h(stream)p 915 329 V 511 w Fh(permission)p 1164 314 14 2 v 14 w(error\(output,)19 b(stream,)h(SorA\))p 1859 329 2 50 v -30 331 1890 2 v -30 414 a Fi(P)o(ortabilit)o(y)-30 513 y Fm(ISO)15 b(predicates.)-30 670 y Fi(7.10.9)48 b Fh(current)p 297 670 14 2 v 14 w(stream/1)-30 797 y Fi(T)l(emplates)74 878 y Fh(current)p 231 878 V 14 w(stream\(?stream\))-30 959 y Fi(Description)-30 1059 y Fh(current)p 127 1059 V 15 w(stream\(Stream\))8 b Fm(succeeds)14 b(if)d(there)h(exists)g(a)f(stream-term)i(that)e(uni\014es)h(with)f Fh(Stream)p Fm(.)16 b(This)11 b(predicate)-30 1109 y(is)j (re-executable)i(on)e(bac)o(ktrac)o(king.)-30 1208 y Fi(Errors)p -30 1273 1890 2 v -30 1322 2 50 v -3 1308 a Fh(Stream)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(a)h (stream-term)p 915 1322 V 97 w Fh(domain)p 1076 1308 14 2 v 15 w(error\(stream,)19 b(Stream\))p 1859 1322 2 50 v -30 1324 1890 2 v -30 1408 a Fi(P)o(ortabilit)o(y)-30 1507 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1665 y Fi(7.10.10)48 b Fh(stream)p 299 1665 14 2 v 15 w(property/2)-30 1791 y Fi(T)l(emplates)74 1872 y Fh(stream)p 209 1872 V 15 w(property\(?stream)o(,)19 b(?stream)p 770 1872 V 14 w(property\))-30 1953 y Fi(Description)-30 2053 y Fh(stream)p 105 2053 V 15 w(property\(Stream,)f(Property\))f Fm(succeeds)22 b(if)f Fh(current)p 1077 2053 V 14 w(stream\(Stream\))16 b Fm(succeeds)21 b(\(section)f(7.10.9,)-30 2103 y(page)13 b(73\))e(and)h(if)j Fh(Property)10 b Fm(uni\014es)j(with)e(one)i(of)e (the)i(prop)q(erties)g(of)f(the)g(stream.)18 b(This)12 b(predicate)h(is)f(re-executable)-30 2153 y(on)i(bac)o(ktrac)o(king.) -30 2252 y Fi(Stream)h(prop)q(erties)p Fm(:)33 2333 y Fg(\017)20 b Fh(file)p 165 2333 V 15 w(name\(F\))p Fm(:)12 b(the)j(name)e(of)g(the)i(connected)h(source/sink.)33 2415 y Fg(\017)k Fh(mode\(M\))p Fm(:)12 b Fh(M)i Fm(is)g(the)g(op)q(en) g(mo)q(de)g(\()p Fh(read)p Fm(,)f Fh(write)p Fm(,)f Fh(append)p Fm(\).)33 2498 y Fg(\017)20 b Fh(input)p Fm(:)d(if)c(it)h(is)g(an)f (input)h(stream.)33 2580 y Fg(\017)20 b Fh(output)p Fm(:)d(if)c(it)h (is)f(an)h(output)g(stream.)33 2662 y Fg(\017)20 b Fh(alias\(A\))p Fm(:)12 b Fh(A)i Fm(is)f(an)h(alias)f(of)g(the)i(stream.)33 2744 y Fg(\017)20 b Fh(mirror\(M\))p Fm(:)12 b Fh(M)h Fm(is)h(a)g(mirror)f(stream)i(of)e(the)h(stream.)33 2826 y Fg(\017)20 b Fh(type\(T\))p Fm(:)12 b Fh(T)i Fm(is)g(the)g(t)o(yp)q (e)g(of)g(the)g(stream)h(\()p Fh(text)p Fm(,)d Fh(binary)p Fm(\).)33 2908 y Fg(\017)20 b Fh(reposition\(R\))p Fm(:)11 b Fh(R)j Fm(is)f(the)i(rep)q(osition)f(b)q(o)q(olean)f(\()p Fh(true)p Fm(,)g Fh(false)p Fm(\).)p eop end %%Page: 74 76 TeXDict begin 74 75 bop -30 -45 a Fm(74)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v 33 115 a Fg(\017)20 b Fh(eof)p 143 115 14 2 v 15 w(action\(A\))p Fm(:)12 b Fh(A)h Fm(is)h(the)h(end-of-\014le)e(action)h(\()p Fh(error)p Fm(,)e Fh(eof)p 1062 115 V 15 w(code)p Fm(,)h Fh(reset)p Fm(\).)33 198 y Fg(\017)20 b Fh(buffering\(B\))p Fm(:)11 b Fh(B)j Fm(is)g(the)g(bu\013ering)g(mo)q(de)g(\()p Fh(none)p Fm(,)f Fh(line)p Fm(,)f Fh(block)p Fm(\).)33 281 y Fg(\017)20 b Fh(end)p 143 281 V 15 w(of)p 202 281 V 16 w(stream\(E\))p Fm(:)11 b Fh(E)j Fm(is)g(the)g(curren)o(t)i (end-of-stream)e(status)h(\()p Fh(not)p Fm(,)e Fh(at)p Fm(,)g Fh(past)p Fm(\).)k(If)d(the)h(stream)f(p)q(osition)f(is)74 331 y(end-of-stream)j(then)h Fh(E)e Fm(is)h(uni\014ed)f(with)h Fh(at)f Fm(else)h(if)f(the)i(stream)f(p)q(osition)f(is)g (past-end-of-stream)i(then)f Fh(E)f Fm(is)74 381 y(uni\014ed)f(with)g Fh(past)f Fm(else)i Fh(E)e Fm(is)h(uni\014ed)g(with)g Fh(not)p Fm(.)33 464 y Fg(\017)20 b Fh(position\(P\))p Fm(:)11 b Fh(P)j Fm(is)g(the)g(stream-p)q(osition)g(term)g(asso)q (ciated)h(with)e(the)i(curren)o(t)g(p)q(osition.)-30 547 y Fi(Errors)p -30 602 1890 2 v -30 652 2 50 v -3 637 a Fh(Stream)e Fm(is)g(a)h(v)n(ariable)p 915 652 V 580 w Fh(instantiation)p 1230 637 14 2 v 13 w(error)p 1859 652 2 50 v -30 654 1890 2 v -30 704 2 50 v -3 689 a(Stream)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(a)h(stream-term)p 915 704 V 97 w Fh(domain)p 1076 689 14 2 v 15 w(error\(stream,)19 b(Stream\))p 1859 704 2 50 v -30 705 1890 2 v -30 805 2 100 v -3 740 a(Property)12 b Fm(is)i(neither)h(a)e(v)n(ariable)g(nor) h(a)g(stream)-3 790 y(prop)q(ert)o(y)p 915 805 V 941 740 a Fh(domain)p 1076 740 14 2 v 15 w(error\(stream)p 1355 740 V 13 w(property,)20 b(Property\))p 1859 805 2 100 v -30 806 1890 2 v -30 1006 2 200 v -3 841 a(Property)12 b Fm(=)i Fh(file)p 322 841 14 2 v 15 w(name\(E\))p Fm(,)20 b Fh(mode\(E\))p Fm(,)12 b Fh(alias\(E\))p Fm(,)-3 891 y Fh(end)p 66 891 V 15 w(of)p 125 891 V 15 w(stream\(E\))p Fm(,)g Fh(eof)p 428 891 V 15 w(action\(E\))p Fm(,)-3 941 y Fh(reposition\(E\))p Fm(,)f Fh(type\(E\))h Fm(or)i Fh(buffering\(E\))d Fm(and)-3 991 y Fh(E)j Fm(is)f(neither)i(a)f(v)n (ariable)f(nor)g(an)h(atom)p 915 1006 2 200 v 941 841 a Fh(type)p 1032 841 14 2 v 15 w(error\(atom,)19 b(E\))p 1859 1006 2 200 v -30 1007 1890 2 v -30 1090 a Fi(P)o(ortabilit)o(y)-30 1190 y Fm(ISO)c(predicate.)k(The)14 b Fh(buffering/1)e Fm(prop)q(ert)o(y)i(is)g(a)g(GNU)f(Prolog)h(extension.)-30 1348 y Fi(7.10.11)48 b Fh(at)p 211 1348 14 2 v 15 w(end)p 292 1348 V 15 w(of)p 351 1348 V 16 w(stream/1)p Fi(,)14 b Fh(at)p 614 1348 V 15 w(end)p 695 1348 V 16 w(of)p 755 1348 V 15 w(stream/0)-30 1474 y Fi(T)l(emplates)74 1557 y Fh(at)p 121 1557 V 16 w(end)p 203 1557 V 15 w(of)p 262 1557 V 15 w(stream\(+stream)p 585 1557 V 13 w(or)p 642 1557 V 15 w(alias\))74 1607 y(at)p 121 1607 V 16 w(end)p 203 1607 V 15 w(of)p 262 1607 V 15 w(stream)-30 1690 y Fi(Description)-30 1789 y Fh(at)p 17 1789 V 16 w(end)p 99 1789 V 15 w(of)p 158 1789 V 15 w(stream\(SorA\))d Fm(succeeds)16 b(if)d(the)h(stream)h(asso)q(ciated)f(with)f (stream-term)i(or)e(alias)g Fh(SorA)g Fm(has)g(a)h(stream)-30 1839 y(p)q(osition)i(end-of-stream)g(or)g(past-end-of-stream.)25 b(This)16 b(predicate)h(can)g(b)q(e)f(de\014ned)h(using)g Fh(stream)p 1631 1839 V 14 w(property/2)-30 1889 y Fm(\(section)e (7.10.10,)c(page)j(73\).)-30 1989 y Fh(at)p 17 1989 V 16 w(end)p 99 1989 V 15 w(of)p 158 1989 V 15 w(stream/0)e Fm(applies)i(to)g(the)g(curren)o(t)h(input)f(stream.)-30 2088 y Fi(Errors)p -30 2144 1890 2 v -30 2194 2 50 v -3 2179 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 2194 V 624 w Fh(instantiation)p 1230 2179 14 2 v 13 w(error)p 1859 2194 2 50 v -30 2195 1890 2 v -30 2295 2 100 v -3 2230 a(SorA)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (stream-term)i(or)-3 2280 y(alias)p 915 2295 V 941 2230 a Fh(domain)p 1076 2230 14 2 v 15 w(error\(stream)p 1355 2230 V 13 w(or)p 1412 2230 V 15 w(alias,)21 b(SorA\))p 1859 2295 2 100 v -30 2297 1890 2 v -30 2347 2 50 v -3 2332 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i (stream)p 915 2347 V 155 w Fh(existence)p 1142 2332 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 2347 2 50 v -30 2348 1890 2 v -30 2398 2 50 v -3 2383 a(SorA)13 b Fm(is)h(an)f(output)i (stream)p 915 2398 V 485 w Fh(permission)p 1164 2383 14 2 v 14 w(error\(input,)k(stream,)h(SorA\))p 1859 2398 2 50 v -30 2400 1890 2 v -30 2482 a Fi(P)o(ortabilit)o(y)-30 2582 y Fm(ISO)15 b(predicates.)k(The)14 b Fh(permission)p 575 2582 14 2 v 14 w(error\(input,)19 b(stream,)i(SorA\))13 b Fm(is)g(a)h(GNU)g(Prolog)f(extension.)-30 2740 y Fi(7.10.12)48 b Fh(stream)p 299 2740 V 15 w(position/2)-30 2866 y Fi(T)l(emplates)p eop end %%Page: 75 77 TeXDict begin 75 76 bop -30 -45 a Fm(7.10)41 b(Streams)1588 b(75)p -30 -27 1890 4 v 74 115 a Fh(stream)p 209 115 14 2 v 15 w(position\(+stream)p 575 115 V 12 w(or)p 632 115 V 15 w(alias,)21 b(?stream)p 954 115 V 14 w(position\))-30 198 y Fi(Description)-30 298 y Fh(stream)p 105 298 V 15 w(position\(SorA,)e(Position\))13 b Fm(succeeds)18 b(unifying)c Fh(Position)g Fm(with)h(the)g(stream-p)q(osition)g(term)h (asso)q(ci-)-30 347 y(ated)j(with)f(the)h(curren)o(t)h(p)q(osition)e (of)f(the)i(stream-term)g(or)g(alias)e Fh(SorA)p Fm(.)g(This)h (predicate)i(can)e(b)q(e)h(de\014ned)g(using)-30 397 y Fh(stream)p 105 397 V 15 w(property/2)12 b Fm(\(section)i(7.10.10,)e (page)i(73\).)-30 497 y Fi(Errors)p -30 552 1890 2 v -30 602 2 50 v -3 587 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 602 V 624 w Fh(instantiation)p 1230 587 14 2 v 13 w(error)p 1859 602 2 50 v -30 604 1890 2 v -30 704 2 100 v -3 639 a(SorA)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (stream-term)i(or)-3 689 y(alias)p 915 704 V 941 639 a Fh(domain)p 1076 639 14 2 v 15 w(error\(stream)p 1355 639 V 13 w(or)p 1412 639 V 15 w(alias,)21 b(SorA\))p 1859 704 2 100 v -30 705 1890 2 v -30 805 2 100 v -3 740 a(Position)12 b Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(a)-3 790 y(stream-p)q(osition)g(term)p 915 805 V 941 740 a Fh(domain)p 1076 740 14 2 v 15 w(error\(stream)p 1355 740 V 13 w(position,)20 b(Position\))p 1859 805 2 100 v -30 806 1890 2 v -30 856 2 50 v -3 841 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i(stream)p 915 856 V 155 w Fh(existence)p 1142 841 14 2 v 14 w(error\(stream,)k (SorA\))p 1859 856 2 50 v -30 858 1890 2 v -30 941 a Fi(P)o(ortabilit)o(y)-30 1040 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1198 y Fi(7.10.13)48 b Fh(set)p 233 1198 14 2 v 15 w(stream)p 380 1198 V 15 w(position/2)-30 1325 y Fi(T)l(emplates)74 1408 y Fh(set)p 143 1408 V 15 w(stream)p 290 1408 V 15 w(position\(+stream)p 656 1408 V 12 w(or)p 713 1408 V 15 w(alias,)21 b(+stream)p 1035 1408 V 14 w(position\))-30 1491 y Fi(Description)-30 1590 y Fh(set)p 39 1590 V 16 w(stream)p 187 1590 V 14 w(position\(SorA,)e(Position\))f Fm(sets)j(the)f(p)q(osition)f(of)h(the)g(stream)g(asso)q(ciated)h(with) e(the)i(stream-)-30 1640 y(term)14 b(or)e(alias)g Fh(SorA)g Fm(to)g Fh(Position)p Fm(.)k Fh(Position)11 b Fm(should)i(ha)o(v)o(e)f (previously)h(b)q(een)g(returned)i(b)o(y)e Fh(stream)p 1631 1640 V 14 w(property/2)-30 1690 y Fm(\(section)i(7.10.10,)c(page)j (73\))g(or)g(b)o(y)g Fh(stream)p 690 1690 V 14 w(position/2)e Fm(\(section)j(7.10.12,)c(page)j(74\).)-30 1789 y Fi(Errors)p -30 1845 1890 2 v -30 1895 2 50 v -3 1880 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 1895 V 624 w Fh(instantiation)p 1230 1880 14 2 v 13 w(error)p 1859 1895 2 50 v -30 1897 1890 2 v -30 1946 2 50 v -3 1931 a(Position)f Fm(is)i(a)g(v)n(ariable)p 915 1946 V 536 w Fh(instantiation)p 1230 1931 14 2 v 13 w(error)p 1859 1946 2 50 v -30 1948 1890 2 v -30 2048 2 100 v -3 1983 a(SorA)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (stream-term)i(or)-3 2033 y(alias)p 915 2048 V 941 1983 a Fh(domain)p 1076 1983 14 2 v 15 w(error\(stream)p 1355 1983 V 13 w(or)p 1412 1983 V 15 w(alias,)21 b(SorA\))p 1859 2048 2 100 v -30 2049 1890 2 v -30 2149 2 100 v -3 2084 a(Position)12 b Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(a)-3 2134 y(stream-p)q(osition)g(term)p 915 2149 V 941 2084 a Fh(domain)p 1076 2084 14 2 v 15 w(error\(stream)p 1355 2084 V 13 w(position,)20 b(Position\))p 1859 2149 2 100 v -30 2151 1890 2 v -30 2200 2 50 v -3 2185 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i(stream)p 915 2200 V 155 w Fh(existence)p 1142 2185 14 2 v 14 w(error\(stream,)k (SorA\))p 1859 2200 2 50 v -30 2202 1890 2 v -30 2302 2 100 v -3 2237 a(SorA)13 b Fm(has)h(stream)g(prop)q(ert)o(y)i Fh(reposition\(false)o(\))p 915 2302 V 89 w(permission)p 1164 2237 14 2 v 14 w(error\(reposition)o(,)j(stream,)941 2287 y(SorA\))p 1859 2302 2 100 v -30 2303 1890 2 v -30 2386 a Fi(P)o(ortabilit)o(y)-30 2486 y Fm(ISO)c(predicate.)-30 2643 y Fi(7.10.14)48 b Fh(seek/4)-30 2770 y Fi(T)l(emplates)74 2853 y Fh(seek\(+stream)p 341 2853 14 2 v 13 w(or)p 398 2853 V 16 w(alias,)20 b(+stream)p 720 2853 V 15 w(seek)p 823 2853 V 14 w(method,)h(+integer,)f(?integer\))p eop end %%Page: 76 78 TeXDict begin 76 77 bop -30 -45 a Fm(76)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(Description)-30 215 y Fh(seek\(SorA,)20 b(Whence,)h(Offset,)f (NewOffset\))12 b Fm(sets)k(the)e(p)q(osition)g(of)g(the)g(stream)h (asso)q(ciated)g(with)f(the)h(stream-)-30 264 y(term)h(or)g(alias)f Fh(SorA)f Fm(to)i Fh(Offset)e Fm(according)i(to)f Fh(Whence)f Fm(and)i(uni\014es)g Fh(NewOffset)e Fm(with)h(the)h(new)g(o\013set)h (from)e(the)-30 314 y(b)q(eginning)f(of)f(the)h(\014le.)19 b Fh(seek/4)12 b Fm(can)i(only)f(b)q(e)i(used)g(on)e(binary)h(streams.) 19 b Fh(Whence)12 b Fm(is)i(an)g(atom)f(from:)33 391 y Fg(\017)20 b Fh(bof)p Fm(:)e(the)c(p)q(osition)f(is)h(set)h(relativ)o (ely)e(to)h(the)g(b)q(egin)g(of)f(the)i(\014le)f(\()p Fh(Offset)e Fm(should)i(b)q(e)h Fg(\025)f Fm(0\).)33 470 y Fg(\017)20 b Fh(current)p Fm(:)d(the)d(p)q(osition)f(is)h(set)h (relativ)o(ely)e(to)h(the)g(curren)o(t)i(p)q(osition)d(\()p Fh(Offset)g Fm(can)h(b)q(e)g Fg(\025)g Fm(0)g(or)g Fg(\024)g Fm(0\).)33 550 y Fg(\017)20 b Fh(eof)p Fm(:)e(the)c(p)q(osition)f(is)h (set)h(relativ)o(ely)e(to)h(the)g(end)h(of)e(the)h(\014le)g(\()p Fh(Offset)f Fm(should)h(b)q(e)g Fg(\024)g Fm(0\).)-30 626 y(This)g(predicate)h(is)f(an)g(in)o(terface)g(to)g(the)g(C)g(Unix)g (function)f Fh(lseek\(2\))p Fm(.)-30 726 y Fi(Errors)p -30 782 1890 2 v -30 832 2 50 v -3 817 a Fh(SorA)g Fm(is)h(a)f(v)n (ariable)p 915 832 V 624 w Fh(instantiation)p 1230 817 14 2 v 13 w(error)p 1859 832 2 50 v -30 833 1890 2 v -30 883 2 50 v -3 868 a(Whence)g Fm(is)g(a)h(v)n(ariable)p 915 883 V 580 w Fh(instantiation)p 1230 868 14 2 v 13 w(error)p 1859 883 2 50 v -30 885 1890 2 v -30 934 2 50 v -3 920 a(Offset)f Fm(is)g(a)h(v)n(ariable)p 915 934 V 580 w Fh(instantiation)p 1230 920 14 2 v 13 w(error)p 1859 934 2 50 v -30 936 1890 2 v -30 1036 2 100 v -3 971 a(SorA)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(stream-term) i(or)-3 1021 y(alias)p 915 1036 V 941 971 a Fh(domain)p 1076 971 14 2 v 15 w(error\(stream)p 1355 971 V 13 w(or)p 1412 971 V 15 w(alias,)21 b(SorA\))p 1859 1036 2 100 v -30 1037 1890 2 v -30 1087 2 50 v -3 1072 a(Whence)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(atom)p 915 1087 V 202 w Fh(type)p 1032 1072 14 2 v 15 w(error\(atom,)19 b(Whence\))p 1859 1087 2 50 v -30 1089 1890 2 v -30 1189 2 100 v -3 1124 a(Whence)13 b Fm(is)g(an)h(atom)f(but)h(not)g(a)g(v)n (alid)e(stream)i(seek)-3 1174 y(metho)q(d)p 915 1189 V 941 1124 a Fh(domain)p 1076 1124 14 2 v 15 w(error\(stream)p 1355 1124 V 13 w(seek)p 1456 1124 V 15 w(method,)20 b(Whence\))p 1859 1189 2 100 v -30 1190 1890 2 v -30 1240 2 50 v -3 1225 a(Offset)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(in)o (teger)p 915 1240 V 172 w Fh(type)p 1032 1225 14 2 v 15 w(error\(integer,)19 b(Offset\))p 1859 1240 2 50 v -30 1242 1890 2 v -30 1291 2 50 v -3 1277 a(NewOffset)12 b Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(an)f(in)o(teger)p 915 1291 V 107 w Fh(type)p 1032 1277 14 2 v 15 w(error\(integer,)19 b(NewOffset\))p 1859 1291 2 50 v -30 1293 1890 2 v -30 1343 2 50 v -3 1328 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g (an)f(op)q(en)i(stream)p 915 1343 V 155 w Fh(existence)p 1142 1328 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 1343 2 50 v -30 1345 1890 2 v -30 1444 2 100 v -3 1379 a(SorA)13 b Fm(has)h(stream)g(prop)q(ert)o(y)i Fh(reposition\(false)o (\))p 915 1444 V 89 w(permission)p 1164 1379 14 2 v 14 w(error\(reposition)o(,)j(stream,)941 1429 y(SorA\))p 1859 1444 2 100 v -30 1446 1890 2 v -30 1546 2 100 v -3 1481 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(text)g(stream)p 915 1546 V 266 w Fh(permission)p 1164 1481 14 2 v 14 w(error\(reposition)o(,)19 b(text)p 1658 1481 V 15 w(stream,)941 1531 y(SorA\))p 1859 1546 2 100 v -30 1547 1890 2 v -30 1630 a Fi(P)o(ortabilit)o(y)-30 1730 y Fm(GNU)14 b(Prolog)f(predicate.) -30 1886 y Fi(7.10.15)48 b Fh(character)p 365 1886 14 2 v 14 w(count/2)-30 2012 y Fi(T)l(emplates)74 2089 y Fh(character)p 275 2089 V 14 w(count\(+stream)p 575 2089 V 13 w(or)p 632 2089 V 15 w(alias,)21 b(?integer\))-30 2165 y Fi(Description)-30 2265 y Fh(character)p 171 2265 V 14 w(count\(SorA,)f(Count\))11 b Fm(uni\014es)h Fh(Count)f Fm(with)h(the)h(n)o(um)o(b)q(er)f(of)f(c)o(haracters/b)o(ytes)k (read/written)e(on)f(the)-30 2315 y(stream)j(asso)q(ciated)g(with)e (stream-term)i(or)f(alias)e Fh(SorA)p Fm(.)-30 2414 y Fi(Errors)p -30 2470 1890 2 v -30 2520 2 50 v -3 2505 a Fh(SorA)h Fm(is)h(a)f(v)n(ariable)p 915 2520 V 624 w Fh(instantiation)p 1230 2505 14 2 v 13 w(error)p 1859 2520 2 50 v -30 2521 1890 2 v -30 2571 2 50 v -3 2556 a(Count)g Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f(in)o(teger)p 915 2571 V 194 w Fh(type)p 1032 2556 14 2 v 15 w(error\(integer,)19 b(Count\))p 1859 2571 2 50 v -30 2573 1890 2 v -30 2672 2 100 v -3 2608 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h (a)f(stream-term)i(or)-3 2658 y(alias)p 915 2672 V 941 2608 a Fh(domain)p 1076 2608 14 2 v 15 w(error\(stream)p 1355 2608 V 13 w(or)p 1412 2608 V 15 w(alias,)21 b(SorA\))p 1859 2672 2 100 v -30 2674 1890 2 v -30 2724 2 50 v -3 2709 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i (stream)p 915 2724 V 155 w Fh(existence)p 1142 2709 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 2724 2 50 v -30 2726 1890 2 v -30 2808 a Fi(P)o(ortabilit)o(y)-30 2908 y Fm(GNU)14 b(Prolog)f(predicate.)p eop end %%Page: 77 79 TeXDict begin 77 78 bop -30 -45 a Fm(7.10)41 b(Streams)1588 b(77)p -30 -27 1890 4 v -30 115 a Fi(7.10.16)48 b Fh(line)p 255 115 14 2 v 15 w(count/2)-30 241 y Fi(T)l(emplates)74 324 y Fh(line)p 165 324 V 15 w(count\(+stream)p 466 324 V 13 w(or)p 523 324 V 15 w(alias,)21 b(?integer\))-30 407 y Fi(Description)-30 507 y Fh(line)p 61 507 V 15 w(count\(SorA,)f(Count\))10 b Fm(uni\014es)j Fh(Count)d Fm(with)i(the)g(n)o(um)o(b)q(er)g(of)g(lines)f(read/written)i(on)f(the) g(stream)g(asso)q(ciated)-30 557 y(with)i(the)h(stream-term)f(or)g (alias)f Fh(SorA)p Fm(.)f(This)i(predicate)h(can)f(only)f(b)q(e)i(used) g(on)e(text)i(streams.)-30 656 y Fi(Errors)p -30 712 1890 2 v -30 762 2 50 v -3 747 a Fh(SorA)e Fm(is)h(a)f(v)n(ariable)p 915 762 V 624 w Fh(instantiation)p 1230 747 14 2 v 13 w(error)p 1859 762 2 50 v -30 764 1890 2 v -30 813 2 50 v -3 798 a(Count)g Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f (in)o(teger)p 915 813 V 194 w Fh(type)p 1032 798 14 2 v 15 w(error\(integer,)19 b(Count\))p 1859 813 2 50 v -30 815 1890 2 v -30 915 2 100 v -3 850 a(SorA)13 b Fm(is)h(neither)h (a)e(v)n(ariable)g(nor)h(a)f(stream-term)i(or)-3 900 y(alias)p 915 915 V 941 850 a Fh(domain)p 1076 850 14 2 v 15 w(error\(stream)p 1355 850 V 13 w(or)p 1412 850 V 15 w(alias,)21 b(SorA\))p 1859 915 2 100 v -30 916 1890 2 v -30 966 2 50 v -3 951 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated) g(with)g(an)f(op)q(en)i(stream)p 915 966 V 155 w Fh(existence)p 1142 951 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 966 2 50 v -30 968 1890 2 v -30 1067 2 100 v -3 1003 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(binary)f(stream)p 915 1067 V 222 w Fh(permission)p 1164 1003 14 2 v 14 w(error\(access,)19 b(binary)p 1615 1003 V 14 w(stream,)941 1052 y(SorA\))p 1859 1067 2 100 v -30 1069 1890 2 v -30 1152 a Fi(P)o(ortabilit)o(y)-30 1251 y Fm(GNU)14 b(Prolog)f(predicate.) -30 1409 y Fi(7.10.17)48 b Fh(line)p 255 1409 14 2 v 15 w(position/2)-30 1536 y Fi(T)l(emplates)74 1619 y Fh(line)p 165 1619 V 15 w(position\(+stream)p 531 1619 V 12 w(or)p 588 1619 V 16 w(alias,)20 b(?integer\))-30 1702 y Fi(Description)-30 1801 y Fh(line)p 61 1801 V 15 w(position\(SorA,)f(Count\))13 b Fm(uni\014es)h Fh(Count)e Fm(with)h(the)i(n)o(um)o(b)q(er)e(of)g(c)o(haracters)j(read/written)e (on)g(the)g(curren)o(t)-30 1851 y(line)e(of)g(the)h(stream)h(asso)q (ciated)f(with)f(the)h(stream-term)g(or)g(alias)e Fh(SorA)p Fm(.)g(This)i(predicate)g(can)g(only)f(b)q(e)h(used)g(on)g(text)-30 1901 y(streams.)-30 2001 y Fi(Errors)p -30 2056 1890 2 v -30 2106 2 50 v -3 2091 a Fh(SorA)g Fm(is)h(a)f(v)n(ariable)p 915 2106 V 624 w Fh(instantiation)p 1230 2091 14 2 v 13 w(error)p 1859 2106 2 50 v -30 2108 1890 2 v -30 2157 2 50 v -3 2143 a(Count)g Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f (in)o(teger)p 915 2157 V 194 w Fh(type)p 1032 2143 14 2 v 15 w(error\(integer,)19 b(Count\))p 1859 2157 2 50 v -30 2159 1890 2 v -30 2259 2 100 v -3 2194 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(stream-term)i(or)-3 2244 y(alias)p 915 2259 V 941 2194 a Fh(domain)p 1076 2194 14 2 v 15 w(error\(stream)p 1355 2194 V 13 w(or)p 1412 2194 V 15 w(alias,)21 b(SorA\))p 1859 2259 2 100 v -30 2260 1890 2 v -30 2310 2 50 v -3 2295 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i(stream)p 915 2310 V 155 w Fh(existence)p 1142 2295 14 2 v 14 w(error\(stream,)k (SorA\))p 1859 2310 2 50 v -30 2312 1890 2 v -30 2412 2 100 v -3 2347 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(binary)f (stream)p 915 2412 V 222 w Fh(permission)p 1164 2347 14 2 v 14 w(error\(access,)19 b(binary)p 1615 2347 V 14 w(stream,)941 2397 y(SorA\))p 1859 2412 2 100 v -30 2413 1890 2 v -30 2496 a Fi(P)o(ortabilit)o(y)-30 2596 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2753 y Fi(7.10.18)48 b Fh(stream)p 299 2753 14 2 v 15 w(line)p 402 2753 V 14 w(column/3)-30 2880 y Fi(T)l(emplates)p eop end %%Page: 78 80 TeXDict begin 78 79 bop -30 -45 a Fm(78)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v 74 115 a Fh(stream)p 209 115 14 2 v 15 w(line)p 312 115 V 15 w(column\(+stream)p 634 115 V 12 w(or)p 691 115 V 16 w(alias,)20 b(?integer,)g(?integer\))-30 198 y Fi(Description)-30 298 y Fh(stream)p 105 298 V 15 w(line)p 208 298 V 15 w(column\(SorA,)f(Line,)i(Column\))14 b Fm(uni\014es)j Fh(Line)e Fm(\(resp.)25 b Fh(Column)p Fm(\))15 b(with)h(the)g(curren)o (t)h(line)f(n)o(um)o(b)q(er)-30 347 y(\(resp.)21 b(column)14 b(n)o(um)o(b)q(er\))g(of)g(the)h(stream)g(asso)q(ciated)g(with)f(the)h (stream-term)g(or)f(alias)f Fh(SorA)p Fm(.)g(This)i(predicate)g(can)-30 397 y(only)g(b)q(e)g(used)h(on)f(text)h(streams.)23 b(Note)15 b(that)g Fh(Line)f Fm(corresp)q(onds)j(to)e(the)h(v)n(alue)e(returned)j (b)o(y)f Fh(line)p 1613 397 V 15 w(count/2)d Fm(+)i(1)-30 447 y(\(section)i(7.10.16,)c(page)i(77\))h(and)f Fh(Column)f Fm(to)h(the)i(v)n(alue)d(returned)k(b)o(y)d Fh(line)p 1236 447 V 15 w(position/2)f Fm(+)h(1)h(\(section)g(7.10.17,)-30 497 y(page)e(77\).)-30 596 y Fi(Errors)p -30 652 1890 2 v -30 702 2 50 v -3 687 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 702 V 624 w Fh(instantiation)p 1230 687 14 2 v 13 w(error)p 1859 702 2 50 v -30 704 1890 2 v -30 753 2 50 v -3 738 a(Line)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in) o(teger)p 915 753 V 215 w Fh(type)p 1032 738 14 2 v 15 w(error\(integer,)19 b(Line\))p 1859 753 2 50 v -30 755 1890 2 v -30 805 2 50 v -3 790 a(Column)13 b Fm(is)g(neither)i(a)f(v)n (ariable)f(nor)g(an)h(in)o(teger)p 915 805 V 172 w Fh(type)p 1032 790 14 2 v 15 w(error\(integer,)19 b(Column\))p 1859 805 2 50 v -30 806 1890 2 v -30 906 2 100 v -3 841 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(stream-term)i (or)-3 891 y(alias)p 915 906 V 941 841 a Fh(domain)p 1076 841 14 2 v 15 w(error\(stream)p 1355 841 V 13 w(or)p 1412 841 V 15 w(alias,)21 b(SorA\))p 1859 906 2 100 v -30 908 1890 2 v -30 958 2 50 v -3 943 a(SorA)13 b Fm(is)h(not)g(asso)q (ciated)g(with)g(an)f(op)q(en)i(stream)p 915 958 V 155 w Fh(existence)p 1142 943 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 958 2 50 v -30 959 1890 2 v -30 1059 2 100 v -3 994 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(binary)f(stream)p 915 1059 V 222 w Fh(permission)p 1164 994 14 2 v 14 w(error\(access,)19 b(binary)p 1615 994 V 14 w(stream,)941 1044 y(SorA\))p 1859 1059 2 100 v -30 1061 1890 2 v -30 1143 a Fi(P)o(ortabilit)o(y)-30 1243 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1401 y Fi(7.10.19)48 b Fh(set)p 233 1401 14 2 v 15 w(stream)p 380 1401 V 15 w(line)p 483 1401 V 14 w(column/3)-30 1527 y Fi(T)l(emplates)74 1610 y Fh(set)p 143 1610 V 15 w(stream)p 290 1610 V 15 w(line)p 393 1610 V 15 w(column\(+stream)p 715 1610 V 12 w(or)p 772 1610 V 16 w(alias,)20 b(+integer,)g(+integer\))-30 1693 y Fi(Description)-30 1793 y Fh(set)p 39 1793 V 16 w(stream)p 187 1793 V 14 w(line)p 289 1793 V 15 w(column\(SorA,)f (Line,)i(Column\))12 b Fm(sets)j(the)f(stream)h(p)q(osition)e(of)g(the) h(stream)g(asso)q(ciated)h(with)-30 1843 y(the)g(stream-term)g(or)f (alias)g Fh(SorA)f Fm(according)h(to)g(the)h(line)f(n)o(um)o(b)q(er)g Fh(Line)g Fm(and)g(the)g(column)g(n)o(um)o(b)q(er)h Fh(Column)p Fm(.)i(This)-30 1892 y(predicate)h(can)e(only)g(b)q(e)g(used)h(on)f (text)h(streams.)26 b(It)16 b(\014rst)h(rep)q(ositions)g(the)g(stream)f (to)g(the)h(b)q(eginning)f(of)f(the)i(\014le)-30 1942 y(and)d(then)h(reads)f(c)o(haracter)i(b)o(y)d(c)o(haracter)j(un)o(til)d (the)h(required)h(p)q(osition)e(is)h(reac)o(hed.)-30 2042 y Fi(Errors)p -30 2097 1890 2 v -30 2147 2 50 v -3 2132 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 2147 V 624 w Fh(instantiation)p 1230 2132 14 2 v 13 w(error)p 1859 2147 2 50 v -30 2149 1890 2 v -30 2199 2 50 v -3 2184 a(Line)g Fm(is)h(a)f(v)n(ariable)p 915 2199 V 624 w Fh(instantiation)p 1230 2184 14 2 v 13 w(error)p 1859 2199 2 50 v -30 2200 1890 2 v -30 2250 2 50 v -3 2235 a(Column)g Fm(is)g(a)h(v)n(ariable)p 915 2250 V 580 w Fh(instantiation)p 1230 2235 14 2 v 13 w(error)p 1859 2250 2 50 v -30 2252 1890 2 v -30 2302 2 50 v -3 2287 a(Line)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in)o(teger)p 915 2302 V 215 w Fh(type)p 1032 2287 14 2 v 15 w(error\(integer,)19 b(Line\))p 1859 2302 2 50 v -30 2303 1890 2 v -30 2353 2 50 v -3 2338 a(Column)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g (an)h(in)o(teger)p 915 2353 V 172 w Fh(type)p 1032 2338 14 2 v 15 w(error\(integer,)19 b(Column\))p 1859 2353 2 50 v -30 2355 1890 2 v -30 2454 2 100 v -3 2390 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(stream-term)i(or)-3 2439 y(alias)p 915 2454 V 941 2390 a Fh(domain)p 1076 2390 14 2 v 15 w(error\(stream)p 1355 2390 V 13 w(or)p 1412 2390 V 15 w(alias,)21 b(SorA\))p 1859 2454 2 100 v -30 2456 1890 2 v -30 2506 2 50 v -3 2491 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i(stream)p 915 2506 V 155 w Fh(existence)p 1142 2491 14 2 v 14 w(error\(stream,)k (SorA\))p 1859 2506 2 50 v -30 2508 1890 2 v -30 2607 2 100 v -3 2542 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(binary)f (stream)p 915 2607 V 222 w Fh(permission)p 1164 2542 14 2 v 14 w(error\(reposition)o(,)941 2592 y(binary)p 1076 2592 V 15 w(stream,)20 b(SorA\))p 1859 2607 2 100 v -30 2609 1890 2 v -30 2708 2 100 v -3 2644 a(SorA)13 b Fm(has)h(stream)g(prop)q(ert)o(y)i Fh(reposition\(false)o(\))p 915 2708 V 89 w(permission)p 1164 2644 14 2 v 14 w(error\(reposition)o (,)j(stream,)941 2694 y(SorA\))p 1859 2708 2 100 v -30 2710 1890 2 v -30 2793 a Fi(P)o(ortabilit)o(y)-30 2893 y Fm(GNU)14 b(Prolog)f(predicate.)p eop end %%Page: 79 81 TeXDict begin 79 80 bop -30 -45 a Fm(7.10)41 b(Streams)1588 b(79)p -30 -27 1890 4 v -30 115 a Fi(7.10.20)48 b Fh(add)p 233 115 14 2 v 15 w(stream)p 380 115 V 15 w(alias/2)-30 241 y Fi(T)l(emplates)74 324 y Fh(add)p 143 324 V 15 w(stream)p 290 324 V 15 w(alias\(+stream)p 591 324 V 13 w(or)p 648 324 V 15 w(alias,)21 b(+atom\))-30 407 y Fi(Description)-30 507 y Fh(add)p 39 507 V 16 w(stream)p 187 507 V 14 w(alias\(SorA,)f(Alias\))13 b Fm(adds)i Fh(Alias)f Fm(as)h(a)f(new)h(alias)f(to)h(the)g(stream)g(asso)q(ciated) h(with)e(the)i(stream-)-30 557 y(term)f(or)f(alias)e Fh(SorA)p Fm(.)-30 656 y Fi(Errors)p -30 712 1890 2 v -30 762 2 50 v -3 747 a Fh(SorA)h Fm(is)h(a)f(v)n(ariable)p 915 762 V 624 w Fh(instantiation)p 1230 747 14 2 v 13 w(error)p 1859 762 2 50 v -30 764 1890 2 v -30 813 2 50 v -3 798 a(Alias)g Fm(is)h(a)f(v)n(ariable)p 915 813 V 602 w Fh(instantiation)p 1230 798 14 2 v 13 w(error)p 1859 813 2 50 v -30 815 1890 2 v -30 865 2 50 v -3 850 a(Alias)g Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f(atom)p 915 865 V 224 w Fh(type)p 1032 850 14 2 v 15 w(error\(atom,)19 b(Alias\))p 1859 865 2 50 v -30 866 1890 2 v -30 966 2 100 v -3 901 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a) f(stream-term)i(or)-3 951 y(alias)p 915 966 V 941 901 a Fh(domain)p 1076 901 14 2 v 15 w(error\(stream)p 1355 901 V 13 w(or)p 1412 901 V 15 w(alias,)21 b(SorA\))p 1859 966 2 100 v -30 968 1890 2 v -30 1018 2 50 v -3 1003 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i (stream)p 915 1018 V 155 w Fh(existence)p 1142 1003 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 1018 2 50 v -30 1019 1890 2 v -30 1119 2 100 v -3 1054 a(Alias)13 b Fm(is)h(already)f (asso)q(ciated)i(with)e(an)h(op)q(en)g(stream)p 915 1119 V 61 w Fh(permission)p 1164 1054 14 2 v 14 w(error\(add)p 1376 1054 V 14 w(alias,)20 b(source)p 1674 1054 V 15 w(sink,)941 1104 y(alias\(Alias\)\))p 1859 1119 2 100 v -30 1121 1890 2 v -30 1203 a Fi(P)o(ortabilit)o(y)-30 1303 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1461 y Fi(7.10.21)48 b Fh(current)p 321 1461 14 2 v 14 w(alias/2)-30 1587 y Fi(T)l(emplates)74 1670 y Fh(current)p 231 1670 V 14 w(alias\(?stream,)19 b(?atom\))-30 1753 y Fi(Description)-30 1853 y Fh(current)p 127 1853 V 15 w(alias\(Stream,)g(Alias\))9 b Fm(succeeds)j(if)h Fh(current)p 942 1853 V 14 w(stream\(Stream\))7 b Fm(succeeds)12 b(\(section)f(7.10.9,)e(page)h(73\))-30 1903 y(and)16 b(if)i Fh(Alias)c Fm(uni\014es)i(with)f(one)h(of)f(the)h (aliases)f(of)g(the)h(stream.)24 b(It)16 b(can)f(b)q(e)h(de\014ned)h (using)f Fh(stream)p 1631 1903 V 14 w(property/2)-30 1952 y Fm(\(section)f(7.10.10,)c(page)j(73\).)k(This)c(predicate)h(is)e (re-executable)j(on)e(bac)o(ktrac)o(king.)-30 2052 y Fi(Errors)p -30 2108 1890 2 v -30 2157 2 50 v -3 2143 a Fh(Stream)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(a)h (stream-term)p 915 2157 V 97 w Fh(domain)p 1076 2143 14 2 v 15 w(error\(stream,)19 b(Stream\))p 1859 2157 2 50 v -30 2159 1890 2 v -30 2209 2 50 v -3 2194 a(Alias)13 b Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f(atom)p 915 2209 V 224 w Fh(type)p 1032 2194 14 2 v 15 w(error\(atom,)19 b(Alias\))p 1859 2209 2 50 v -30 2211 1890 2 v -30 2293 a Fi(P)o(ortabilit)o(y)-30 2393 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2551 y Fi(7.10.22)48 b Fh(add)p 233 2551 14 2 v 15 w(stream)p 380 2551 V 15 w(mirror/2)-30 2677 y Fi(T)l(emplates)74 2760 y Fh(add)p 143 2760 V 15 w(stream)p 290 2760 V 15 w(mirror\(+stream)p 612 2760 V 13 w(or)p 670 2760 V 15 w(alias,)20 b(+stream)p 991 2760 V 15 w(or)p 1050 2760 V 15 w(alias\))-30 2843 y Fi(Description)p eop end %%Page: 80 82 TeXDict begin 80 81 bop -30 -45 a Fm(80)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fh(add)p 39 115 14 2 v 16 w(stream)p 187 115 V 14 w(mirror\(SorA,)19 b(Mirror\))11 b Fm(adds)h(the)h(stream)g(asso)q (ciated)g(with)e(the)i(stream-term)g(or)f(alias)f Fh(Mirror)g Fm(as)-30 165 y(a)k(new)g(mirror)f(to)h(the)g(stream)h(asso)q(ciated)f (with)g(the)g(stream-term)g(or)g(alias)f Fh(SorA)p Fm(.)f(After)j (this,)e(all)g(c)o(haracters)i(\(or)-30 215 y(b)o(ytes\))g(read)e(from) g(\(or)g(written)h(to\))f Fh(SorA)f Fm(are)i(also)f(written)g(to)g Fh(Mirror)p Fm(.)k(This)c(mirroring)f(o)q(ccurs)j(un)o(til)d Fh(Mirror)g Fm(is)-30 264 y(explicitely)e(remo)o(v)o(ed)g(using)g Fh(remove)p 569 264 V 14 w(stream)p 715 264 V 15 w(mirror/2)e Fm(\(section)i(7.10.23,)e(page)i(80\))f(or)h(implicitely)e(when)i Fh(Mirror)-30 314 y Fm(is)k(closed.)22 b(Sev)o(eral)15 b(mirror)g(streams)h(can)f(b)q(e)g(asso)q(ciated)h(with)f(a)f(same)i (stream.)21 b(If)d Fh(Mirror)c Fm(represen)o(ts)j(the)f(same)-30 364 y(stream)f(as)f Fh(SorA)f Fm(or)h(if)i Fh(Mirror)d Fm(is)g(already)h(a)f(mirror)h(for)g Fh(SorA)p Fm(,)e(no)i(mirror)f(is) h(added.)-30 464 y Fi(Errors)p -30 519 1890 2 v -30 569 2 50 v -3 554 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 569 V 624 w Fh(instantiation)p 1230 554 14 2 v 13 w(error)p 1859 569 2 50 v -30 571 1890 2 v -30 621 2 50 v -3 606 a(Mirror)g Fm(is)g(a)h(v)n(ariable)p 915 621 V 580 w Fh(instantiation)p 1230 606 14 2 v 13 w(error)p 1859 621 2 50 v -30 622 1890 2 v -30 722 2 100 v -3 657 a(SorA)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(stream-term)i(or)-3 707 y(alias)p 915 722 V 941 657 a Fh(domain)p 1076 657 14 2 v 15 w(error\(stream)p 1355 657 V 13 w(or)p 1412 657 V 15 w(alias,)21 b(SorA\))p 1859 722 2 100 v -30 723 1890 2 v -30 823 2 100 v -3 758 a(Mirror)12 b Fm(is)h(neither)h(a)f (v)n(ariable)f(nor)h(a)g(stream-term)h(or)-3 808 y(alias)p 915 823 V 941 758 a Fh(domain)p 1076 758 14 2 v 15 w(error\(stream)p 1355 758 V 13 w(or)p 1412 758 V 15 w(alias,)21 b(Mirror\))p 1859 823 2 100 v -30 825 1890 2 v -30 875 2 50 v -3 860 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i(stream) p 915 875 V 155 w Fh(existence)p 1142 860 14 2 v 14 w(error\(stream,)k (SorA\))p 1859 875 2 50 v -30 876 1890 2 v -30 926 2 50 v -3 911 a(Mirror)13 b Fm(is)g(not)h(asso)q(ciated)h(with)e(an)h(op) q(en)g(stream)p 915 926 V 112 w Fh(existence)p 1142 911 14 2 v 14 w(error\(stream,)19 b(Mirror\))p 1859 926 2 50 v -30 928 1890 2 v -30 977 2 50 v -3 963 a(Mirror)13 b Fm(is)g(an)h(input)g(stream)p 915 977 V 467 w Fh(permission)p 1164 963 14 2 v 14 w(error\(output,)19 b(stream,)h(Mirror\))p 1859 977 2 50 v -30 979 1890 2 v -30 1062 a Fi(P)o(ortabilit)o(y)-30 1162 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1318 y Fi(7.10.23)48 b Fh(remove)p 299 1318 14 2 v 15 w(stream)p 446 1318 V 14 w(mirror/2)-30 1445 y Fi(T)l(emplates)74 1523 y Fh(remove)p 209 1523 V 15 w(stream)p 356 1523 V 14 w(mirror\(+stream)p 678 1523 V 13 w(or)p 735 1523 V 15 w(alias,)21 b(+stream)p 1057 1523 V 14 w(or)p 1115 1523 V 15 w(alias\))-30 1601 y Fi(Description)-30 1701 y Fh(remove)p 105 1701 V 15 w(stream)p 252 1701 V 14 w(mirror\(SorA,)f(Mirror\))e Fm(remo)o(v)o(es)h(the)h(stream)g(asso)q(ciated)h(with)e(the)h (stream-term)g(or)f(alias)-30 1751 y Fh(Mirror)9 b Fm(from)h(the)h (list)f(of)g(mirrors)g(of)g(the)g(stream)h(asso)q(ciated)g(with)f(the)h (stream-term)g(or)g(alias)e Fh(SorA)p Fm(.)g(This)h(predicate)-30 1800 y(fails)j(if)j Fh(Mirror)d Fm(is)h(not)g(a)f(mirror)h(stream)g (for)g Fh(SorA)p Fm(.)-30 1900 y Fi(Errors)p -30 1956 1890 2 v -30 2006 2 50 v -3 1991 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 2006 V 624 w Fh(instantiation)p 1230 1991 14 2 v 13 w(error)p 1859 2006 2 50 v -30 2007 1890 2 v -30 2057 2 50 v -3 2042 a(Mirror)g Fm(is)g(a)h(v)n(ariable)p 915 2057 V 580 w Fh(instantiation)p 1230 2042 14 2 v 13 w(error)p 1859 2057 2 50 v -30 2059 1890 2 v -30 2158 2 100 v -3 2094 a(SorA)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (stream-term)i(or)-3 2143 y(alias)p 915 2158 V 941 2094 a Fh(domain)p 1076 2094 14 2 v 15 w(error\(stream)p 1355 2094 V 13 w(or)p 1412 2094 V 15 w(alias,)21 b(SorA\))p 1859 2158 2 100 v -30 2160 1890 2 v -30 2260 2 100 v -3 2195 a(Mirror)12 b Fm(is)h(neither)h(a)f(v)n(ariable)f(nor)h(a)g (stream-term)h(or)-3 2245 y(alias)p 915 2260 V 941 2195 a Fh(domain)p 1076 2195 14 2 v 15 w(error\(stream)p 1355 2195 V 13 w(or)p 1412 2195 V 15 w(alias,)21 b(Mirror\))p 1859 2260 2 100 v -30 2261 1890 2 v -30 2311 2 50 v -3 2296 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i (stream)p 915 2311 V 155 w Fh(existence)p 1142 2296 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 2311 2 50 v -30 2313 1890 2 v -30 2363 2 50 v -3 2348 a(Mirror)13 b Fm(is)g(not)h(asso) q(ciated)h(with)e(an)h(op)q(en)g(stream)p 915 2363 V 112 w Fh(existence)p 1142 2348 14 2 v 14 w(error\(stream,)19 b(Mirror\))p 1859 2363 2 50 v -30 2364 1890 2 v -30 2447 a Fi(P)o(ortabilit)o(y)-30 2547 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2703 y Fi(7.10.24)48 b Fh(current)p 321 2703 14 2 v 14 w(mirror/2)-30 2830 y Fi(T)l(emplates)74 2908 y Fh(current)p 231 2908 V 14 w(mirror\(?stream,)19 b(?stream\))p eop end %%Page: 81 83 TeXDict begin 81 82 bop -30 -45 a Fm(7.10)41 b(Streams)1588 b(81)p -30 -27 1890 4 v -30 115 a Fi(Description)-30 215 y Fh(current)p 127 215 14 2 v 15 w(mirror\(Stream,)19 b(M\))e Fm(succeeds)k(if)g Fh(current)p 901 215 V 14 w(stream\(Stream\))15 b Fm(succeeds)21 b(\(section)e(7.10.9,)d(page)j (73\))-30 264 y(and)h(if)h Fh(M)e Fm(uni\014es)h(with)f(one)g(of)g(the) h(mirrors)f(of)g(the)h(stream.)34 b(It)20 b(can)f(b)q(e)h(de\014ned)g (using)g Fh(stream)p 1631 264 V 14 w(property/2)-30 314 y Fm(\(section)15 b(7.10.10,)c(page)j(73\).)k(This)c(predicate)h(is)e (re-executable)j(on)e(bac)o(ktrac)o(king.)-30 414 y Fi(Errors)p -30 469 1890 2 v -30 519 2 50 v -3 504 a Fh(Stream)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(a)h(stream-term)p 915 519 V 97 w Fh(domain)p 1076 504 14 2 v 15 w(error\(stream,)19 b(Stream\))p 1859 519 2 50 v -30 521 1890 2 v -30 571 2 50 v -3 556 a(M)14 b Fm(is)f(neither)i(a)f(v)n(ariable)f(nor)g(a)h (stream-term)p 915 571 V 206 w Fh(domain)p 1076 556 14 2 v 15 w(error\(stream,)19 b(M\))p 1859 571 2 50 v -30 572 1890 2 v -30 655 a Fi(P)o(ortabilit)o(y)-30 755 y Fm(GNU)14 b(Prolog)f(predicate.)-30 912 y Fi(7.10.25)48 b Fh(set)p 233 912 14 2 v 15 w(stream)p 380 912 V 15 w(type/2)-30 1039 y Fi(T)l(emplates)74 1122 y Fh(set)p 143 1122 V 15 w(stream)p 290 1122 V 15 w(type\(+stream)p 569 1122 V 13 w(or)p 626 1122 V 15 w(alias,)21 b(+atom\))-30 1205 y Fi(Description)-30 1305 y Fh(set)p 39 1305 V 16 w(stream)p 187 1305 V 14 w(type\(SorA,)f(Type\))14 b Fm(up)q(dates)i(the)g(t)o(yp)q(e)f(asso)q(ciated)h(with)f(stream-term)h (or)f(alias)f Fh(SorA)p Fm(.)g(The)i(v)n(alue)-30 1354 y(of)h Fh(Type)c Fm(is)h(an)f(atom)g(in)h Fh(text)e Fm(or)i Fh(binary)f Fm(as)h(for)f Fh(open/4)g Fm(\(section)h(7.10.6,)e(page)i (70\).)j(The)e(t)o(yp)q(e)f(of)f(a)h(stream)g(can)-30 1404 y(only)g(b)q(e)g(c)o(hanged)g(b)q(efore)h(an)o(y)e(input/output)h (op)q(eration)g(is)g(executed.)-30 1504 y Fi(Errors)p -30 1559 1890 2 v -30 1609 2 50 v -3 1594 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 1609 V 624 w Fh(instantiation)p 1230 1594 14 2 v 13 w(error)p 1859 1609 2 50 v -30 1611 1890 2 v -30 1661 2 50 v -3 1646 a(Type)g Fm(is)h(a)f(v)n(ariable)p 915 1661 V 624 w Fh(instantiation)p 1230 1646 14 2 v 13 w(error)p 1859 1661 2 50 v -30 1662 1890 2 v -30 1712 2 50 v -3 1697 a(Type)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (v)n(alid)g(t)o(yp)q(e)p 915 1712 V 182 w Fh(domain)p 1076 1697 14 2 v 15 w(error\(stream)p 1355 1697 V 13 w(type,)21 b(Type\))p 1859 1712 2 50 v -30 1714 1890 2 v -30 1814 2 100 v -3 1749 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(a)f(stream-term)i(or)-3 1799 y(alias)p 915 1814 V 941 1749 a Fh(domain)p 1076 1749 14 2 v 15 w(error\(stream)p 1355 1749 V 13 w(or)p 1412 1749 V 15 w(alias,)21 b(SorA\))p 1859 1814 2 100 v -30 1815 1890 2 v -30 1865 2 50 v -3 1850 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g (with)g(an)f(op)q(en)i(stream)p 915 1865 V 155 w Fh(existence)p 1142 1850 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 1865 2 50 v -30 1867 1890 2 v -30 1966 2 100 v -3 1902 a Fm(An)14 b(I/O)g(op)q(eration)g(has)g(already)f(b)q(een)i(executed)h (on)-3 1951 y Fh(SorA)p 915 1966 V 941 1902 a(permission)p 1164 1902 14 2 v 14 w(error\(modify,)j(stream,)h(SorA\))p 1859 1966 2 100 v -30 1968 1890 2 v -30 2051 a Fi(P)o(ortabilit)o(y)-30 2150 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2308 y Fi(7.10.26)48 b Fh(set)p 233 2308 14 2 v 15 w(stream)p 380 2308 V 15 w(eof)p 461 2308 V 15 w(action/2)-30 2434 y Fi(T)l(emplates)74 2518 y Fh(set)p 143 2518 V 15 w(stream)p 290 2518 V 15 w(eof)p 371 2518 V 15 w(action\(+stream)p 694 2518 V 13 w(or)p 751 2518 V 15 w(alias,)20 b(+atom\))-30 2601 y Fi(Description)-30 2700 y Fh(set)p 39 2700 V 16 w(stream)p 187 2700 V 14 w(eof)p 267 2700 V 15 w(action\(SorA,)f(Action\))g Fm(up)q(dates)i(the)g Fh(eof)p 1044 2700 V 15 w(action)d Fm(option)i(asso)q(ciated)g(with)g(the)h(stream-)-30 2750 y(term)f(or)e(alias)g Fh(SorA)p Fm(.)f(The)i(v)n(alue)g(of)i Fh(Action)c Fm(is)i(one)g(of)f(the)h(atoms)g Fh(error)p Fm(,)f Fh(eof)p 1347 2750 V 15 w(code)p Fm(,)h Fh(reset)e Fm(as)i(for)f Fh(open/4)-30 2800 y Fm(\(section)d(7.10.6,)d(page)i (70\).)-30 2899 y Fi(Errors)p eop end %%Page: 82 84 TeXDict begin 82 83 bop -30 -45 a Fm(82)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 125 V 624 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(Action)g Fm(is)g(a)h(v)n(ariable)p 915 176 V 580 w Fh(instantiation)p 1230 161 14 2 v 13 w(error)p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(Action)e Fm(is)g(neither)i(a)e(v)n(ariable)g(nor)h(a)f(v)n(alid)f (eof)i(action)p 915 228 V 51 w Fh(domain)p 1076 213 14 2 v 15 w(error\(eof)p 1289 213 V 13 w(action,)21 b(Action\))p 1859 228 2 50 v -30 229 1890 2 v -30 329 2 100 v -3 264 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(stream-term)i (or)-3 314 y(alias)p 915 329 V 941 264 a Fh(domain)p 1076 264 14 2 v 15 w(error\(stream)p 1355 264 V 13 w(or)p 1412 264 V 15 w(alias,)21 b(SorA\))p 1859 329 2 100 v -30 331 1890 2 v -30 381 2 50 v -3 366 a(SorA)13 b Fm(is)h(not)g(asso)q (ciated)g(with)g(an)f(op)q(en)i(stream)p 915 381 V 155 w Fh(existence)p 1142 366 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 381 2 50 v -30 382 1890 2 v -30 432 2 50 v -3 417 a(SorA)13 b Fm(is)h(an)f(output)i(stream)p 915 432 V 485 w Fh(permission)p 1164 417 14 2 v 14 w(error\(modify,)k(stream,)h (SorA\))p 1859 432 2 50 v -30 434 1890 2 v -30 516 a Fi(P)o(ortabilit)o(y)-30 616 y Fm(GNU)14 b(Prolog)f(predicate.)-30 774 y Fi(7.10.27)48 b Fh(set)p 233 774 14 2 v 15 w(stream)p 380 774 V 15 w(buffering/2)-30 900 y Fi(T)l(emplates)74 983 y Fh(set)p 143 983 V 15 w(stream)p 290 983 V 15 w (buffering\(+strea)o(m)p 678 983 V 13 w(or)p 735 983 V 15 w(alias,)21 b(+atom\))-30 1066 y Fi(Description)-30 1166 y Fh(set)p 39 1166 V 16 w(stream)p 187 1166 V 14 w(buffering\(SorA,)e(Buffering\))9 b Fm(up)q(dates)k(the)f(bu\013ering) g(mo)q(de)g(asso)q(ciated)h(with)e(the)h(stream-term)-30 1216 y(or)19 b(alias)e Fh(SorA)p Fm(.)h(The)h(v)n(alue)f(of)j Fh(Buffering)16 b Fm(is)j(one)g(of)f(the)h(atoms)f Fh(none)p Fm(,)g Fh(line)g Fm(or)g Fh(block)g Fm(as)h(for)f Fh(open/4)f Fm(\(sec-)-30 1266 y(tion)h(7.10.6,)e(page)i(70\).)30 b(This)18 b(predicate)h(ma)o(y)e(only)g(b)q(e)i(used)g(after)f(op)q (ening)f(a)h(stream)h(and)e(b)q(efore)i(an)o(y)f(other)-30 1315 y(op)q(erations)d(ha)o(v)o(e)e(b)q(een)i(p)q(erformed)g(on)f(it.) -30 1415 y Fi(Errors)p -30 1471 1890 2 v -30 1520 2 50 v -3 1505 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 1520 V 624 w Fh(instantiation)p 1230 1505 14 2 v 13 w(error)p 1859 1520 2 50 v -30 1522 1890 2 v -30 1572 2 50 v -3 1557 a(Buffering)f Fm(is)i(a)f(v)n(ariable)p 915 1572 V 515 w Fh(instantiation)p 1230 1557 14 2 v 13 w(error)p 1859 1572 2 50 v -30 1574 1890 2 v -30 1673 2 100 v -3 1608 a(Buffering)f Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(a)f(v)n (alid)-3 1658 y(bu\013ering)h(mo)q(de)p 915 1673 V 941 1608 a Fh(domain)p 1076 1608 14 2 v 15 w(error\(buffering)p 1420 1608 V 12 w(mode,)21 b(Buffering\))p 1859 1673 2 100 v -30 1675 1890 2 v -30 1774 2 100 v -3 1710 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(stream-term)i(or)-3 1760 y(alias)p 915 1774 V 941 1710 a Fh(domain)p 1076 1710 14 2 v 15 w(error\(stream)p 1355 1710 V 13 w(or)p 1412 1710 V 15 w(alias,)21 b(SorA\))p 1859 1774 2 100 v -30 1776 1890 2 v -30 1826 2 50 v -3 1811 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i(stream)p 915 1826 V 155 w Fh(existence)p 1142 1811 14 2 v 14 w(error\(stream,)k (SorA\))p 1859 1826 2 50 v -30 1828 1890 2 v -30 1910 a Fi(P)o(ortabilit)o(y)-30 2010 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2176 y Ff(7.11)56 b(Constan)n(t)20 b(term)e(streams)-30 2302 y Fi(7.11.1)48 b(In)o(tro)q(duction)-30 2429 y Fm(Constan)o(t)13 b(term)g(streams)h(allo)o(w)d(the)i(user)h(to)e(consider)h(a)g(constan) o(t)g(term)g(\(atom,)f(c)o(haracter)i(list)e(or)g(c)o(haracter)i(co)q (de)-30 2479 y(list\))f(as)h(a)e(source/sink)j(b)o(y)e(asso)q(ciating)f (to)h(them)h(a)f(stream.)18 b(Reading)12 b(from)h(a)g(constan)o(t)g (term)h(stream)f(will)f(deliv)o(er)-30 2529 y(the)18 b(c)o(haracters)g(of)e(the)h(constan)o(t)g(term)g(as)g(if)e(they)j(had) e(b)q(een)i(read)f(from)e(a)i(standard)g(\014le.)26 b(Characters)18 b(written)-30 2578 y(on)f(a)f(constan)o(t)h(term)g(stream)g(are)g (stored)g(to)g(form)f(the)h(\014nal)f(constan)o(t)h(term)g(when)g(the)g (stream)g(is)f(closed.)27 b(The)-30 2628 y(built-in)14 b(predicates)h(describ)q(ed)i(in)d(this)g(section)h(allo)o(w)e(the)i (user)g(to)g(op)q(en)g(and)f(close)h(a)f(constan)o(t)h(term)g(stream)g (for)-30 2678 y(input)f(or)g(output.)k(Ho)o(w)o(ev)o(er,)c(v)o(ery)g (often,)f(a)g(constan)o(t)i(term)f(stream)g(is)f(created)j(to)d(b)q(e)i (only)d(read)j(or)e(written)i(once)-30 2728 y(and)g(then)g(closed.)20 b(T)m(o)13 b(a)o(v)o(oid)g(the)i(creation)g(and)f(the)h(destruction)g (of)f(suc)o(h)h(a)f(stream,)h(GNU)f(Prolog)f(o\013ers)j(sev)o(eral)-30 2778 y(built-in)d(predicates)i(to)f(p)q(erform)g(single)g(input/output) f(from/to)g(constan)o(t)i(terms)f(\(section)h(7.15,)d(page)i(104\).)p eop end %%Page: 83 85 TeXDict begin 83 84 bop -30 -45 a Fm(7.11)41 b(Constan)o(t)14 b(term)g(streams)1317 b(83)p -30 -27 1890 4 v -30 115 a Fi(7.11.2)48 b Fh(open)p 231 115 14 2 v 15 w(input)p 356 115 V 15 w(atom)p 459 115 V 15 w(stream/2)p Fi(,)14 b Fh(open)p 765 115 V 15 w(input)p 890 115 V 15 w(chars)p 1015 115 V 14 w(stream/2)p Fi(,)140 165 y Fh(open)p 231 165 V 15 w(input)p 356 165 V 15 w(codes)p 481 165 V 14 w(stream/2)-30 291 y Fi(T)l(emplates)74 363 y Fh(open)p 165 363 V 15 w(input)p 290 363 V 15 w(atom)p 393 363 V 15 w(stream\(+atom,)19 b(-stream\))74 413 y(open)p 165 413 V 15 w(input)p 290 413 V 15 w(chars)p 415 413 V 14 w(stream\(+character)p 803 413 V 13 w(list,)h(-stream\))74 463 y(open)p 165 463 V 15 w(input)p 290 463 V 15 w(codes)p 415 463 V 14 w(stream\(+character)p 803 463 V 13 w(code)p 904 463 V 14 w(list,)h(-stream\))-30 534 y Fi(Description)-30 634 y Fh(open)p 61 634 V 15 w(input)p 186 634 V 15 w(atom)p 289 634 V 15 w(stream\(Atom,)e(Stream\))12 b Fm(uni\014es)i Fh(Stream)e Fm(with)h(the)h(stream-term)g(whic)o(h)f(is)g(asso)q (ciated)i(with)-30 684 y(a)f(new)g(input)g(text-stream)h(whose)f(data)g (are)g(the)h(c)o(haracters)g(of)i Fh(Atom)p Fm(.)-30 783 y Fh(open)p 61 783 V 15 w(input)p 186 783 V 15 w(chars)p 311 783 V 15 w(stream\(Chars,)i(Stream\))c Fm(is)h(similar)f(to)h Fh(open)p 1124 783 V 15 w(input)p 1249 783 V 15 w(atom)p 1352 783 V 15 w(stream/2)e Fm(except)k(that)f(data)-30 833 y(are)e(the)f(con)o(ten)o(t)h(of)e(the)i(c)o(haracter)g(list)e Fh(Chars)p Fm(.)-30 933 y Fh(open)p 61 933 V 15 w(input)p 186 933 V 15 w(codes)p 311 933 V 15 w(stream\(Codes,)19 b(Stream\))c Fm(is)h(similar)f(to)h Fh(open)p 1124 933 V 15 w(input)p 1249 933 V 15 w(atom)p 1352 933 V 15 w(stream/2)e Fm(except)k(that)f(data)-30 983 y(are)e(the)f(con)o(ten)o(t)h(of)e(the) i(c)o(haracter)g(co)q(de)g(list)e Fh(Codes)p Fm(.)-30 1082 y Fi(Errors)p -30 1138 1890 2 v -30 1188 2 50 v -3 1173 a Fh(Stream)g Fm(is)g(not)h(a)g(v)n(ariable)p 915 1188 V 506 w Fh(type)p 1032 1173 14 2 v 15 w(error\(variable,)19 b(Stream\))p 1859 1188 2 50 v -30 1189 1890 2 v -30 1239 2 50 v -3 1224 a(Atom)13 b Fm(is)h(a)f(v)n(ariable)p 915 1239 V 624 w Fh(instantiation)p 1230 1224 14 2 v 13 w(error)p 1859 1239 2 50 v -30 1241 1890 2 v -30 1341 2 100 v -3 1276 a(Chars)g Fm(is)h(a)f(partial)g(list)g(or)h(a)g(list)f (with)h(an)g(elemen)o(t)g Fh(E)-3 1326 y Fm(whic)o(h)g(is)g(a)f(v)n (ariable)p 915 1341 V 941 1276 a Fh(instantiation)p 1230 1276 14 2 v 13 w(error)p 1859 1341 2 100 v -30 1342 1890 2 v -30 1442 2 100 v -3 1377 a(Codes)g Fm(is)h(a)f(partial)g(list)g(or) h(a)g(list)f(with)h(an)g(elemen)o(t)g Fh(E)-3 1427 y Fm(whic)o(h)g(is)g(a)f(v)n(ariable)p 915 1442 V 941 1377 a Fh(instantiation)p 1230 1377 14 2 v 13 w(error)p 1859 1442 2 100 v -30 1443 1890 2 v -30 1493 2 50 v -3 1478 a(Atom)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(an)h(atom)p 915 1493 V 211 w Fh(type)p 1032 1478 14 2 v 15 w(error\(atom,)19 b(Atom\))p 1859 1493 2 50 v -30 1495 1890 2 v -30 1545 2 50 v -3 1530 a(Chars)13 b Fm(is)h(neither)g(a)g(partial)f(list)g(nor) h(a)g(list)p 915 1545 V 236 w Fh(type)p 1032 1530 14 2 v 15 w(error\(list,)19 b(Chars\))p 1859 1545 2 50 v -30 1546 1890 2 v -30 1596 2 50 v -3 1581 a(Codes)13 b Fm(is)h(neither)g(a)g(partial)f(list)g(nor)h(a)g(list)p 915 1596 V 236 w Fh(type)p 1032 1581 14 2 v 15 w(error\(list,)19 b(Codes\))p 1859 1596 2 50 v -30 1598 1890 2 v -30 1698 2 100 v -3 1633 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Chars)f Fm(list)h(is)f(neither)i(a)-3 1683 y(v)n(ariable)e(nor)h(a)f (c)o(haracter)p 915 1698 V 941 1633 a Fh(type)p 1032 1633 14 2 v 15 w(error\(character,)18 b(E\))p 1859 1698 2 100 v -30 1699 1890 2 v -30 1799 2 100 v -3 1734 a Fm(an)c(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Codes)f Fm(list)h(is)f(neither)i(a)-3 1784 y(v)n(ariable)e(nor)h(an)f(in)o (teger)p 915 1799 V 941 1734 a Fh(type)p 1032 1734 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 1799 2 100 v -30 1800 1890 2 v -30 1900 2 100 v -3 1835 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Codes)f Fm(list)h(is)f(an)h(in)o (teger)g(but)-3 1885 y(not)g(a)f(c)o(haracter)j(co)q(de)p 915 1900 V 941 1835 a Fh(representation)p 1252 1835 14 2 v 13 w(error\(character)p 1594 1835 V 12 w(code\))p 1859 1900 2 100 v -30 1902 1890 2 v -30 1985 a Fi(P)o(ortabilit)o(y)-30 2084 y Fm(GNU)e(Prolog)f(predicates.)-30 2239 y Fi(7.11.3)48 b Fh(close)p 253 2239 14 2 v 15 w(input)p 378 2239 V 15 w(atom)p 481 2239 V 14 w(stream/1)p Fi(,)15 b Fh(close)p 809 2239 V 15 w(input)p 934 2239 V 14 w(chars)p 1058 2239 V 15 w(stream/1)p Fi(,)140 2289 y Fh(close)p 253 2289 V 15 w(input)p 378 2289 V 15 w(codes)p 503 2289 V 14 w(stream/1)-30 2416 y Fi(T)l(emplates)74 2488 y Fh(close)p 187 2488 V 15 w(input)p 312 2488 V 15 w(atom)p 415 2488 V 14 w(stream\(+stream)p 737 2488 V 13 w(or)p 794 2488 V 15 w(alias\))74 2537 y(close)p 187 2537 V 15 w(input)p 312 2537 V 15 w(chars)p 437 2537 V 14 w(stream\(+stream)p 759 2537 V 13 w(or)p 816 2537 V 15 w(alias\))74 2587 y(close)p 187 2587 V 15 w(input)p 312 2587 V 15 w(codes)p 437 2587 V 14 w(stream\(+stream)p 759 2587 V 13 w(or)p 816 2587 V 15 w(alias\))-30 2659 y Fi(Description)-30 2759 y Fh(close)p 83 2759 V 15 w(input)p 208 2759 V 15 w(atom)p 311 2759 V 15 w(stream\(SorA\))g Fm(closes)j(the)g(constan)o (t)g(term)g(stream)g(asso)q(ciated)g(with)f(the)h(stream-term)g(or)-30 2808 y(alias)13 b Fh(SorA)p Fm(.)g Fh(SorA)g Fm(m)o(ust)h(a)f(stream)i (op)q(en)f(with)g Fh(open)p 839 2808 V 14 w(input)p 963 2808 V 15 w(atom)p 1066 2808 V 15 w(stream/2)e Fm(\(section)j(7.11.1,)c (page)j(82\).)-30 2908 y Fh(close)p 83 2908 V 15 w(input)p 208 2908 V 15 w(chars)p 333 2908 V 14 w(stream\(SorA\))e Fm(acts)i(similarly)e(for)i(a)f(c)o(haracter)j(list)d(stream.)p eop end %%Page: 84 86 TeXDict begin 84 85 bop -30 -45 a Fm(84)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fh(close)p 83 115 14 2 v 15 w(input)p 208 115 V 15 w(codes)p 333 115 V 14 w(stream\(SorA\))e Fm(acts)i(similarly)e(for) i(a)f(c)o(haracter)j(co)q(de)e(list)g(stream.)-30 215 y Fi(Errors)p -30 270 1890 2 v -30 320 2 50 v -3 305 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 320 V 624 w Fh(instantiation)p 1230 305 14 2 v 13 w(error)p 1859 320 2 50 v -30 322 1890 2 v -30 421 2 100 v -3 356 a(SorA)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(stream-term)i(or)-3 406 y(alias)p 915 421 V 941 356 a Fh(domain)p 1076 356 14 2 v 15 w(error\(stream)p 1355 356 V 13 w(or)p 1412 356 V 15 w(alias,)21 b(SorA\))p 1859 421 2 100 v -30 423 1890 2 v -30 473 2 50 v -3 458 a(SorA)13 b Fm(is)h(not)g(asso)q (ciated)g(with)g(an)f(op)q(en)i(stream)p 915 473 V 155 w Fh(existence)p 1142 458 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 473 2 50 v -30 474 1890 2 v -30 524 2 50 v -3 509 a(SorA)13 b Fm(is)h(an)f(output)i(stream)p 915 524 V 485 w Fh(permission)p 1164 509 14 2 v 14 w(error\(close,)k(stream,)h (SorA\))p 1859 524 2 50 v -30 526 1890 2 v -30 625 2 100 v -3 561 a(SorA)13 b Fm(is)h(a)f(stream-term)i(or)f(alias)f(but)h (do)q(es)g(not)g(refer)-3 611 y(to)g(a)f(constan)o(t)i(term)f(stream.)p 915 625 V 941 561 a Fh(domain)p 1076 561 14 2 v 15 w(error\(term)p 1311 561 V 13 w(stream)p 1456 561 V 15 w(or)p 1515 561 V 15 w(alias,)20 b(SorA\))p 1859 625 2 100 v -30 627 1890 2 v -30 710 a Fi(P)o(ortabilit)o(y)-30 810 y Fm(GNU)14 b(Prolog)f(predicates.)-30 967 y Fi(7.11.4)48 b Fh(open)p 231 967 14 2 v 15 w(output)p 378 967 V 15 w(atom)p 481 967 V 14 w(stream/1)p Fi(,)15 b Fh(open)p 787 967 V 15 w(output)p 934 967 V 14 w(chars)p 1058 967 V 15 w(stream/1)p Fi(,)140 1017 y Fh(open)p 231 1017 V 15 w(output)p 378 1017 V 15 w(codes)p 503 1017 V 14 w(stream/1)-30 1144 y Fi(T)l(emplates)74 1227 y Fh(open)p 165 1227 V 15 w(output)p 312 1227 V 15 w(atom)p 415 1227 V 14 w(stream\(-stream\))74 1276 y(open)p 165 1276 V 15 w(output)p 312 1276 V 15 w(chars)p 437 1276 V 14 w(stream\(-stream\))74 1326 y(open)p 165 1326 V 15 w(output)p 312 1326 V 15 w(codes)p 437 1326 V 14 w(stream\(-stream\))-30 1409 y Fi(Description)-30 1509 y Fh(open)p 61 1509 V 15 w(output)p 208 1509 V 15 w(atom)p 311 1509 V 15 w(stream\(Stream\))9 b Fm(uni\014es)k Fh(Stream)e Fm(with)h(the)h(stream-term)h(whic)o(h)e(is)g(asso)q (ciated)h(with)g(a)f(new)-30 1559 y(output)j(text-stream.)21 b(All)14 b(c)o(haracters)i(written)f(to)f(this)h(stream)g(are)f (collected)i(and)e(will)f(b)q(e)i(returned)h(as)f(an)f(atom)-30 1608 y(when)h(the)f(stream)h(is)f(closed)g(b)o(y)g Fh(close)p 622 1608 V 15 w(ouput)p 747 1608 V 15 w(atom)p 850 1608 V 14 w(stream/2)f Fm(\(section)h(7.11.5,)e(page)i(84\).)-30 1708 y Fh(open)p 61 1708 V 15 w(output)p 208 1708 V 15 w(chars)p 333 1708 V 14 w(stream\(Stream\))i Fm(is)i(similar)e(to)i Fh(open)p 1000 1708 V 15 w(output)p 1147 1708 V 15 w(atom)p 1250 1708 V 14 w(stream/1)f Fm(except)i(that)g(the)f(result)-30 1758 y(will)13 b(b)q(e)h(a)g(c)o(haracter)h(list.)-30 1858 y Fh(open)p 61 1858 V 15 w(output)p 208 1858 V 15 w(codes)p 333 1858 V 14 w(stream\(Stream\))h Fm(is)i(similar)e(to)i Fh(open)p 1000 1858 V 15 w(output)p 1147 1858 V 15 w(atom)p 1250 1858 V 14 w(stream/1)f Fm(except)i(that)g(the)f(result)-30 1907 y(will)13 b(b)q(e)h(a)g(c)o(haracter)h(co)q(de)g(list.)-30 2007 y Fi(Errors)p -30 2071 1890 2 v -30 2121 2 50 v -3 2106 a Fh(Stream)e Fm(is)g(not)h(a)g(v)n(ariable)p 915 2121 V 506 w Fh(type)p 1032 2106 14 2 v 15 w(error\(variable,)19 b(Stream\))p 1859 2121 2 50 v -30 2123 1890 2 v -30 2206 a Fi(P)o(ortabilit)o(y)-30 2306 y Fm(GNU)14 b(Prolog)f(predicates.)-30 2464 y Fi(7.11.5)48 b Fh(close)p 253 2464 14 2 v 15 w(output)p 400 2464 V 14 w(atom)p 502 2464 V 15 w(stream/2)p Fi(,)15 b Fh(close)p 831 2464 V 14 w(output)p 977 2464 V 15 w(chars)p 1102 2464 V 14 w(stream/2)p Fi(,)140 2513 y Fh(close)p 253 2513 V 15 w(output)p 400 2513 V 14 w(codes)p 524 2513 V 15 w(stream/2)-30 2640 y Fi(T)l(emplates)74 2723 y Fh(close)p 187 2723 V 15 w(output)p 334 2723 V 14 w(atom)p 436 2723 V 15 w(stream\(+stream)p 759 2723 V 13 w(or)p 816 2723 V 15 w(alias,)21 b(?atom\))74 2773 y(close)p 187 2773 V 15 w(output)p 334 2773 V 14 w(chars)p 458 2773 V 15 w(stream\(+stream)p 781 2773 V 13 w(or)p 838 2773 V 15 w(alias,)g(?character)p 1226 2773 V 13 w(list\))74 2822 y(close)p 187 2822 V 15 w(output)p 334 2822 V 14 w(codes)p 458 2822 V 15 w(stream\(+stream)p 781 2822 V 13 w(or)p 838 2822 V 15 w(alias,)g(?character)p 1226 2822 V 13 w(code)p 1327 2822 V 15 w(list\))-30 2905 y Fi(Description)p eop end %%Page: 85 87 TeXDict begin 85 86 bop -30 -45 a Fm(7.12)41 b(Character)15 b(input/output)1299 b(85)p -30 -27 1890 4 v -30 115 a Fh(close)p 83 115 14 2 v 15 w(output)p 230 115 V 15 w(atom)p 333 115 V 14 w(stream\(SorA,)20 b(Atom\))15 b Fm(closes)i(the)f (constan)o(t)h(term)f(stream)h(asso)q(ciated)g(with)e(the)i(stream-)-30 165 y(term)k(or)g(alias)f Fh(SorA)p Fm(.)f Fh(SorA)h Fm(m)o(ust)g(b)q(e)h(asso)q(ciated)h(with)e(a)g(stream)h(op)q(en)g (with)g Fh(open)p 1425 165 V 15 w(output)p 1572 165 V 14 w(atom)p 1674 165 V 15 w(stream/1)-30 215 y Fm(\(section)14 b(7.11.4,)d(page)i(84\).)k Fh(Atom)12 b Fm(is)h(uni\014ed)g(with)f(an)h (atom)f(formed)h(with)f(all)g(c)o(haracters)j(written)e(on)g(the)g (stream.)-30 314 y Fh(close)p 83 314 V 15 w(output)p 230 314 V 15 w(chars)p 355 314 V 14 w(stream\(SorA,)20 b(Chars\))12 b Fm(acts)j(similarly)d(for)h(a)h(c)o(haracter)h(list)e (stream.)-30 414 y Fh(close)p 83 414 V 15 w(output)p 230 414 V 15 w(codes)p 355 414 V 14 w(stream\(SorA,)20 b(Codes\))12 b Fm(acts)j(similarly)d(for)h(a)h(c)o(haracter)h(co)q(de)g (list)e(stream.)-30 513 y Fi(Errors)p -30 569 1890 2 v -30 619 2 50 v -3 604 a Fh(SorA)g Fm(is)h(a)f(v)n(ariable)p 915 619 V 624 w Fh(instantiation)p 1230 604 14 2 v 13 w(error)p 1859 619 2 50 v -30 621 1890 2 v -30 670 2 50 v -3 655 a(Atom)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g (atom)p 915 670 V 245 w Fh(type)p 1032 655 14 2 v 15 w(error\(atom,)19 b(Atom\))p 1859 670 2 50 v -30 672 1890 2 v -30 722 2 50 v -3 707 a(Chars)13 b Fm(is)h(neither)g(a)g (partial)f(list)g(nor)h(a)g(list)p 915 722 V 236 w Fh(type)p 1032 707 14 2 v 15 w(error\(list,)19 b(Chars\))p 1859 722 2 50 v -30 723 1890 2 v -30 773 2 50 v -3 758 a(Codes)13 b Fm(is)h(neither)g(a)g(partial)f(list)g(nor)h(a)g(list)p 915 773 V 236 w Fh(type)p 1032 758 14 2 v 15 w(error\(list,)19 b(Codes\))p 1859 773 2 50 v -30 775 1890 2 v -30 875 2 100 v -3 810 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a) f(stream-term)i(or)-3 860 y(alias)p 915 875 V 941 810 a Fh(domain)p 1076 810 14 2 v 15 w(error\(stream)p 1355 810 V 13 w(or)p 1412 810 V 15 w(alias,)21 b(SorA\))p 1859 875 2 100 v -30 876 1890 2 v -30 926 2 50 v -3 911 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i(stream) p 915 926 V 155 w Fh(existence)p 1142 911 14 2 v 14 w(error\(stream,)k (SorA\))p 1859 926 2 50 v -30 928 1890 2 v -30 977 2 50 v -3 963 a(SorA)13 b Fm(is)h(an)f(input)h(stream)p 915 977 V 511 w Fh(permission)p 1164 963 14 2 v 14 w(error\(close,)19 b(stream,)h(SorA\))p 1859 977 2 50 v -30 979 1890 2 v -30 1079 2 100 v -3 1014 a(SorA)13 b Fm(is)h(a)f(stream-term)i(or)f (alias)f(but)h(do)q(es)g(not)g(refer)-3 1064 y(to)g(a)f(constan)o(t)i (term)f(stream)p 915 1079 V 941 1014 a Fh(domain)p 1076 1014 14 2 v 15 w(error\(term)p 1311 1014 V 13 w(stream)p 1456 1014 V 15 w(or)p 1515 1014 V 15 w(alias,)20 b(SorA\))p 1859 1079 2 100 v -30 1080 1890 2 v -30 1163 a Fi(P)o(ortabilit)o(y)-30 1263 y Fm(GNU)14 b(Prolog)f(predicates.)-30 1429 y Ff(7.12)56 b(Character)19 b(input/output)-30 1555 y Fm(These)f(built-in)c (predicates)j(enable)f(a)g(single)f(c)o(haracter)j(or)d(c)o(haracter)j (co)q(de)e(to)g(b)q(e)g(input)g(from)f(and)h(output)g(to)f(a)-30 1605 y(text)f(stream.)k(The)13 b(atom)f Fh(end)p 466 1605 14 2 v 15 w(of)p 525 1605 V 15 w(file)g Fm(is)h(returned)h(as)f(c) o(haracter)h(to)f(indicate)f(the)i(end-of-\014le.)j Fh(-1)12 b Fm(is)h(returned)h(as)-30 1655 y(c)o(haracter)i(co)q(de)e(to)g (indicate)g(the)g(end-of-\014le.)-30 1813 y Fi(7.12.1)48 b Fh(get)p 209 1813 V 15 w(char/2)p Fi(,)15 b Fh(get)p 450 1813 V 15 w(char/1)p Fi(,)g Fh(get)p 691 1813 V 15 w(code/1)p Fi(,)g Fh(get)p 932 1813 V 15 w(code/2)-30 1939 y Fi(T)l(emplates)74 2022 y Fh(get)p 143 2022 V 15 w(char\(+stream)p 422 2022 V 14 w(or)p 480 2022 V 15 w(alias,)20 b(?in)p 713 2022 V 15 w(character\))74 2072 y(get)p 143 2072 V 15 w(char\(?in)p 334 2072 V 14 w(character\))74 2122 y(get)p 143 2122 V 15 w(code\(+stream)p 422 2122 V 14 w(or)p 480 2122 V 15 w(alias,)g(?in)p 713 2122 V 15 w(character)p 926 2122 V 14 w(code\))74 2172 y(get)p 143 2172 V 15 w(code\(?in)p 334 2172 V 14 w(character)p 546 2172 V 14 w(code\))-30 2255 y Fi(Description)-30 2354 y Fh(get)p 39 2354 V 16 w(char\(SorA,)f(Char\))12 b Fm(succeeds)j(if)g Fh(Char)d Fm(uni\014es)i(with)e(the)h(next)h(c)o (haracter)g(read)f(from)f(the)h(stream)g(asso)q(ciated)-30 2404 y(with)h(the)h(stream-term)f(or)g(alias)f Fh(SorA)p Fm(.)-30 2504 y Fh(get)p 39 2504 V 16 w(code/2)f Fm(is)i(similar)e(to)i Fh(get)p 494 2504 V 15 w(char/2)f Fm(but)h(deals)g(with)f(c)o(haracter) j(co)q(des.)-30 2603 y Fh(get)p 39 2603 V 16 w(char/1)c Fm(and)i Fh(get)p 346 2603 V 15 w(code/1)f Fm(apply)g(to)g(the)i (curren)o(t)g(input)f(stream.)-30 2703 y Fi(Errors)p eop end %%Page: 86 88 TeXDict begin 86 87 bop -30 -45 a Fm(86)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 125 V 624 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(Char)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g (in-c)o(haracter)p 915 176 V 123 w Fh(type)p 1032 161 14 2 v 15 w(error\(in)p 1223 161 V 14 w(character,)20 b(Char\))p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(Code)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g (in)o(teger)p 915 228 V 215 w Fh(type)p 1032 213 14 2 v 15 w(error\(integer,)19 b(Code\))p 1859 228 2 50 v -30 229 1890 2 v -30 329 2 100 v -3 264 a(SorA)13 b Fm(is)h(neither)h (a)e(v)n(ariable)g(nor)h(a)f(stream-term)i(or)-3 314 y(alias)p 915 329 V 941 264 a Fh(domain)p 1076 264 14 2 v 15 w(error\(stream)p 1355 264 V 13 w(or)p 1412 264 V 15 w(alias,)21 b(SorA\))p 1859 329 2 100 v -30 331 1890 2 v -30 381 2 50 v -3 366 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated) g(with)g(an)f(op)q(en)i(stream)p 915 381 V 155 w Fh(existence)p 1142 366 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 381 2 50 v -30 382 1890 2 v -30 432 2 50 v -3 417 a(SorA)13 b Fm(is)h(an)f(output)i(stream)p 915 432 V 485 w Fh(permission)p 1164 417 14 2 v 14 w(error\(input,)k(stream,)h(SorA\))p 1859 432 2 50 v -30 434 1890 2 v -30 533 2 100 v -3 469 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(binary)f(stream)p 915 533 V 222 w Fh(permission)p 1164 469 14 2 v 14 w(error\(input,)19 b(binary)p 1593 469 V 14 w(stream,)941 518 y(SorA\))p 1859 533 2 100 v -30 535 1890 2 v -30 635 2 100 v -3 570 a(SorA)13 b Fm(has)h(stream)g(prop)q(erties)-3 620 y Fh(end)p 66 620 14 2 v 15 w(of)p 125 620 V 15 w(stream\(past\))e Fm(and)h Fh(eof)p 562 620 V 16 w(action\(error\))p 915 635 2 100 v 941 570 a(permission)p 1164 570 14 2 v 14 w(error\(input,)941 620 y(past)p 1032 620 V 15 w(end)p 1113 620 V 15 w(of)p 1172 620 V 15 w(stream,)21 b(SorA\))p 1859 635 2 100 v -30 636 1890 2 v -30 736 2 100 v -3 671 a Fm(The)14 b(en)o(tit)o(y)g(input)g(from)f(the)h(stream)h(is)f (not)f(a)-3 721 y(c)o(haracter)p 915 736 V 941 671 a Fh(representation)p 1252 671 14 2 v 13 w(error\(character\))p 1859 736 2 100 v -30 738 1890 2 v -30 787 2 50 v -3 772 a(Code)g Fm(is)h(an)f(in)o(teger)i(but)f(not)g(an)f(in-c)o(haracter)i (co)q(de)p 915 787 V 88 w Fh(representation)p 1252 772 14 2 v 13 w(error\(in)p 1441 772 V 14 w(character)p 1653 772 V 14 w(code\))p 1859 787 2 50 v -30 789 1890 2 v -30 872 a Fi(P)o(ortabilit)o(y)-30 971 y Fm(ISO)g(predicates.)-30 1129 y Fi(7.12.2)48 b Fh(get)p 209 1129 14 2 v 15 w(key/2)p Fi(,)15 b Fh(get)p 428 1129 V 15 w(key/1)g(get)p 634 1129 V 15 w(key)p 715 1129 V 16 w(no)p 775 1129 V 15 w(echo/2)p Fi(,)g Fh(get)p 1016 1129 V 15 w(key)p 1097 1129 V 15 w(no)p 1156 1129 V 15 w(echo/1)-30 1256 y Fi(T)l(emplates)74 1339 y Fh(get)p 143 1339 V 15 w(key\(+stream)p 400 1339 V 14 w(or)p 458 1339 V 15 w(alias,)21 b(?integer\))74 1388 y(get)p 143 1388 V 15 w(key\(?integer\))74 1438 y(get)p 143 1438 V 15 w(key)p 224 1438 V 15 w(no)p 283 1438 V 16 w(echo\(+stream)p 563 1438 V 13 w(or)p 620 1438 V 15 w(alias,)g(?integer\))74 1488 y(get)p 143 1488 V 15 w(key)p 224 1488 V 15 w(no)p 283 1488 V 16 w(echo\(?integer\))-30 1571 y Fi(Description)-30 1671 y Fh(get)p 39 1671 V 16 w(key\(Code,)e(SorA\))e Fm(succeeds)j(if)f Fh(Code)e Fm(uni\014es)h(with)f(the)h(c)o(haracter)g(co)q(de)g(of)f(the)h(next)g (k)o(ey)f(read)h(from)f(the)-30 1721 y(stream)11 b(asso)q(ciated)g (with)f(the)h(stream-term)g(or)g(alias)e Fh(SorA)p Fm(.)g(It)h(is)g(in) o(tended)h(to)f(read)h(a)f(single)g(k)o(ey)h(from)e(the)i(k)o(eyb)q (oard)-30 1770 y(\(th)o(us)h Fh(SorA)e Fm(should)h(refer)h(to)f(curren) o(t)h(input)f(stream\).)17 b(No)11 b(bu\013ering)g(is)g(p)q(erformed)h (\(a)f(c)o(haracter)h(is)f(read)g(as)g(so)q(on)g(as)-30 1820 y(a)o(v)n(ailable\))g(and)h(function)f(k)o(eys)i(can)f(also)g(b)q (e)h(read)f(\(in)g(that)g(case,)h Fh(Code)f Fm(is)g(an)g(in)o(teger)g Fb(>)h Fm(255\).)k(The)12 b(read)h(c)o(haracter)-30 1870 y(is)h(ec)o(ho)q(ed)h(if)e(it)h(is)g(prin)o(table.)-30 1970 y(This)h(facilit)o(y)e(is)i(only)e(p)q(ossible)i(if)f(the)h Fh(linedit)f Fm(facilit)o(y)f(has)h(b)q(een)i(installed)e(\(section)i (3.2.5,)c(page)j(18\))f(otherwise)-30 2019 y Fh(get)p 39 2019 V 16 w(key/2)h Fm(b)q(eha)o(v)o(es)h(similarly)f(to)g Fh(get)p 627 2019 V 16 w(code/2)f Fm(\(section)j(7.12.1,)d(page)i(85\)) g(\(the)h(co)q(de)g(of)e(the)i(\014rst)g(c)o(haracter)g(is)-30 2069 y(returned\))i(but)e(also)f(pumps)h(remaining)f(c)o(haracters)i (un)o(til)e(a)g(c)o(haracter)i Fb(<)f Fm(space)h(\(0x20\))e(is)h(read)g (\(in)f(particular)-30 2119 y(RETURN\).)c(The)g(same)h(b)q(eha)o(vior)e (o)q(ccurs)j(if)g Fh(SorA)e Fm(do)q(es)g(not)g(refer)i(to)d(the)i (curren)o(t)h(input)e(stream)g(or)g(if)g(this)g(stream)-30 2169 y(is)i(not)g(attac)o(hed)h(to)e(a)h(terminal.)-30 2268 y Fh(get)p 39 2268 V 16 w(key)p 121 2268 V 15 w(no)p 180 2268 V 15 w(echo/2)e Fm(b)q(eha)o(v)o(es)j(similarly)d(to)i Fh(get)p 781 2268 V 15 w(key/2)f Fm(except)i(that)f(the)g(read)h(c)o (haracter)g(is)f(not)g(ec)o(ho)q(ed.)-30 2368 y Fh(get)p 39 2368 V 16 w(key/1)e Fm(and)i Fh(get)p 324 2368 V 15 w(key)p 405 2368 V 15 w(no)p 464 2368 V 15 w(echo/1)f Fm(apply)g(to)h(the)g(curren)o(t)i(input)e(stream.)-30 2468 y Fi(Errors)p eop end %%Page: 87 89 TeXDict begin 87 88 bop -30 -45 a Fm(7.12)41 b(Character)15 b(input/output)1299 b(87)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(SorA)13 b Fm(is)h(a)f(v)n(ariable)p 915 125 V 624 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(Code)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in) o(teger)p 915 176 V 215 w Fh(type)p 1032 161 14 2 v 15 w(error\(integer,)19 b(Code\))p 1859 176 2 50 v -30 178 1890 2 v -30 278 2 100 v -3 213 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(a)f(stream-term)i(or)-3 263 y(alias)p 915 278 V 941 213 a Fh(domain)p 1076 213 14 2 v 15 w(error\(stream)p 1355 213 V 13 w(or)p 1412 213 V 15 w(alias,)21 b(SorA\))p 1859 278 2 100 v -30 279 1890 2 v -30 329 2 50 v -3 314 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i(stream) p 915 329 V 155 w Fh(existence)p 1142 314 14 2 v 14 w(error\(stream,)k (SorA\))p 1859 329 2 50 v -30 331 1890 2 v -30 381 2 50 v -3 366 a(SorA)13 b Fm(is)h(an)f(output)i(stream)p 915 381 V 485 w Fh(permission)p 1164 366 14 2 v 14 w(error\(input,)k (stream,)h(SorA\))p 1859 381 2 50 v -30 382 1890 2 v -30 482 2 100 v -3 417 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g (binary)f(stream)p 915 482 V 222 w Fh(permission)p 1164 417 14 2 v 14 w(error\(input,)19 b(binary)p 1593 417 V 14 w(stream,)941 467 y(SorA\))p 1859 482 2 100 v -30 484 1890 2 v -30 583 2 100 v -3 518 a(SorA)13 b Fm(has)h(stream)g(prop) q(erties)-3 568 y Fh(end)p 66 568 14 2 v 15 w(of)p 125 568 V 15 w(stream\(past\))e Fm(and)h Fh(eof)p 562 568 V 16 w(action\(error\))p 915 583 2 100 v 941 518 a(permission)p 1164 518 14 2 v 14 w(error\(input,)941 568 y(past)p 1032 568 V 15 w(end)p 1113 568 V 15 w(of)p 1172 568 V 15 w(stream,)21 b(SorA\))p 1859 583 2 100 v -30 585 1890 2 v -30 668 a Fi(P)o(ortabilit)o(y)-30 767 y Fm(GNU)14 b(Prolog)f(predicates.)-30 925 y Fi(7.12.3)48 b Fh(peek)p 231 925 14 2 v 15 w(char/2)p Fi(,)15 b Fh(peek)p 494 925 V 15 w(char/1)p Fi(,)g Fh(peek)p 757 925 V 15 w(code/1)p Fi(,)g Fh(peek)p 1020 925 V 14 w(code/2)-30 1051 y Fi(T)l(emplates)74 1134 y Fh(peek)p 165 1134 V 15 w(char\(+stream)p 444 1134 V 13 w(or)p 501 1134 V 16 w(alias,)20 b(?in)p 735 1134 V 15 w(character\))74 1184 y(peek)p 165 1184 V 15 w(char\(?in)p 356 1184 V 14 w(character\))74 1234 y(peek)p 165 1234 V 15 w(code\(+stream)p 444 1234 V 13 w(or)p 501 1234 V 16 w(alias,)g(?in)p 735 1234 V 15 w(character)p 948 1234 V 14 w(code\))74 1284 y(peek)p 165 1284 V 15 w(code\(?in)p 356 1284 V 14 w(character)p 568 1284 V 14 w(code\))-30 1367 y Fi(Description)-30 1466 y Fh(peek)p 61 1466 V 15 w(char\(SorA,)g(Char\))e Fm(succeeds)k(if)f Fh(Char)d Fm(uni\014es)i(with)f(the)g(next)h(c)o (haracter)g(that)f(will)f(b)q(e)i(read)f(from)g(the)-30 1516 y(stream)c(asso)q(ciated)g(with)e(the)i(stream-term)f(or)g(alias)f Fh(SorA)p Fm(.)f(The)j(c)o(haracter)g(is)f(not)g(read.)-30 1616 y Fh(peek)p 61 1616 V 15 w(code/2)f Fm(is)h(similar)e(to)i Fh(peek)p 538 1616 V 15 w(char/2)e Fm(but)i(deals)g(with)g(c)o (haracter)h(co)q(des.)-30 1716 y Fh(peek)p 61 1716 V 15 w(char/1)e Fm(and)h Fh(peek)p 390 1716 V 15 w(code/1)e Fm(apply)h(to)h(the)g(curren)o(t)i(input)e(stream.)-30 1815 y Fi(Errors)p -30 1871 1890 2 v -30 1921 2 50 v -3 1906 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 1921 V 624 w Fh(instantiation)p 1230 1906 14 2 v 13 w(error)p 1859 1921 2 50 v -30 1922 1890 2 v -30 1972 2 50 v -3 1957 a(Char)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in-c)o (haracter)p 915 1972 V 123 w Fh(type)p 1032 1957 14 2 v 15 w(error\(in)p 1223 1957 V 14 w(character,)20 b(Char\))p 1859 1972 2 50 v -30 1974 1890 2 v -30 2024 2 50 v -3 2009 a(Code)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in)o (teger)p 915 2024 V 215 w Fh(type)p 1032 2009 14 2 v 15 w(error\(integer,)19 b(Code\))p 1859 2024 2 50 v -30 2025 1890 2 v -30 2125 2 100 v -3 2060 a(SorA)13 b Fm(is)h(neither)h(a) e(v)n(ariable)g(nor)h(a)f(stream-term)i(or)-3 2110 y(alias)p 915 2125 V 941 2060 a Fh(domain)p 1076 2060 14 2 v 15 w(error\(stream)p 1355 2060 V 13 w(or)p 1412 2060 V 15 w(alias,)21 b(SorA\))p 1859 2125 2 100 v -30 2127 1890 2 v -30 2176 2 50 v -3 2161 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g (with)g(an)f(op)q(en)i(stream)p 915 2176 V 155 w Fh(existence)p 1142 2161 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 2176 2 50 v -30 2178 1890 2 v -30 2228 2 50 v -3 2213 a(SorA)13 b Fm(is)h(an)f(output)i(stream)p 915 2228 V 485 w Fh(permission)p 1164 2213 14 2 v 14 w(error\(input,)k(stream,)h (SorA\))p 1859 2228 2 50 v -30 2229 1890 2 v -30 2329 2 100 v -3 2264 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(binary)f (stream)p 915 2329 V 222 w Fh(permission)p 1164 2264 14 2 v 14 w(error\(input,)19 b(binary)p 1593 2264 V 14 w(stream,)941 2314 y(SorA\))p 1859 2329 2 100 v -30 2331 1890 2 v -30 2430 2 100 v -3 2366 a(SorA)13 b Fm(has)h(stream)g(prop)q (erties)-3 2415 y Fh(end)p 66 2415 14 2 v 15 w(of)p 125 2415 V 15 w(stream\(past\))e Fm(and)h Fh(eof)p 562 2415 V 16 w(action\(error\))p 915 2430 2 100 v 941 2366 a(permission)p 1164 2366 14 2 v 14 w(error\(input,)941 2415 y(past)p 1032 2415 V 15 w(end)p 1113 2415 V 15 w(of)p 1172 2415 V 15 w(stream,)21 b(SorA\))p 1859 2430 2 100 v -30 2432 1890 2 v -30 2532 2 100 v -3 2467 a Fm(The)14 b(en)o(tit)o(y)g(input)g (from)f(the)h(stream)h(is)f(not)f(a)-3 2517 y(c)o(haracter)p 915 2532 V 941 2467 a Fh(representation)p 1252 2467 14 2 v 13 w(error\(character\))p 1859 2532 2 100 v -30 2533 1890 2 v -30 2583 2 50 v -3 2568 a(Code)g Fm(is)h(an)f(in)o(teger)i (but)f(not)g(an)f(in-c)o(haracter)i(co)q(de)p 915 2583 V 88 w Fh(representation)p 1252 2568 14 2 v 13 w(error\(in)p 1441 2568 V 14 w(character)p 1653 2568 V 14 w(code\))p 1859 2583 2 50 v -30 2585 1890 2 v -30 2668 a Fi(P)o(ortabilit)o(y)-30 2767 y Fm(ISO)g(predicates.)p eop end %%Page: 88 90 TeXDict begin 88 89 bop -30 -45 a Fm(88)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(7.12.4)48 b Fh(unget)p 253 115 14 2 v 15 w(char/2)p Fi(,)15 b Fh(unget)p 538 115 V 14 w(char/1)p Fi(,)g Fh(unget)p 822 115 V 15 w(code/2)p Fi(,)g Fh(unget)p 1107 115 V 15 w(code/1)-30 241 y Fi(T)l(emplates)74 313 y Fh(unget)p 187 313 V 15 w(char\(+stream)p 466 313 V 13 w(or)p 523 313 V 15 w(alias,)21 b(+character\))74 363 y(unget)p 187 363 V 15 w(char\(+character\))74 413 y(unget)p 187 413 V 15 w(code\(+stream)p 466 413 V 13 w(or)p 523 413 V 15 w(alias,)g(+character)p 911 413 V 14 w(code\))74 463 y(unget)p 187 463 V 15 w(code\(+character)p 531 463 V 12 w(code\))-30 534 y Fi(Description)-30 634 y Fh(unget)p 83 634 V 15 w(char\(SorA,)f(Char\))c Fm(pushes)i(bac)o(k)f Fh(Char)f Fm(on)o(to)h(the)h(stream)f(asso)q(ciated)h(with)f(the)g (stream-term)h(or)f(alias)-30 684 y Fh(SorA)p Fm(.)11 b Fh(Char)h Fm(will)f(b)q(e)i(the)f(next)h(c)o(haracter)h(read)f(b)o(y) f Fh(get)p 870 684 V 15 w(char/2)p Fm(.)17 b(The)12 b(maxim)o(um)e(n)o (um)o(b)q(er)j(of)f(c)o(haracters)i(that)e(can)-30 734 y(b)q(e)j(cum)o(ulativ)o(ely)d(pushed)j(bac)o(k)f(is)g(giv)o(en)f(b)o (y)h(the)g Fh(max)p 857 734 V 16 w(unget)e Fm(Prolog)h(\015ag)h (\(section)h(7.22.1,)c(page)j(133\).)-30 833 y Fh(unget)p 83 833 V 15 w(code/2)f Fm(is)g(similar)g(to)h Fh(unget)p 582 833 V 14 w(char/2)f Fm(but)h(deals)g(with)g(c)o(haracter)h(co)q (des.)-30 933 y Fh(unget)p 83 933 V 15 w(char/1)e Fm(and)g Fh(unget)p 433 933 V 15 w(code/1)g Fm(apply)g(to)h(the)g(curren)o(t)h (input)f(stream.)-30 1033 y Fi(Errors)p -30 1088 1890 2 v -30 1138 2 50 v -3 1123 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 1138 V 624 w Fh(instantiation)p 1230 1123 14 2 v 13 w(error)p 1859 1138 2 50 v -30 1140 1890 2 v -30 1189 2 50 v -3 1174 a(Char)g Fm(is)h(a)f(v)n(ariable)p 915 1189 V 624 w Fh(instantiation)p 1230 1174 14 2 v 13 w(error)p 1859 1189 2 50 v -30 1191 1890 2 v -30 1241 2 50 v -3 1226 a(Code)g Fm(is)h(a)f(v)n(ariable)p 915 1241 V 624 w Fh(instantiation)p 1230 1226 14 2 v 13 w(error)p 1859 1241 2 50 v -30 1243 1890 2 v -30 1292 2 50 v -3 1277 a(Char)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(c)o(haracter)p 915 1292 V 196 w Fh(type)p 1032 1277 14 2 v 15 w(error\(character,)18 b(Char\))p 1859 1292 2 50 v -30 1294 1890 2 v -30 1344 2 50 v -3 1329 a(Code)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h (an)g(in)o(teger)p 915 1344 V 215 w Fh(type)p 1032 1329 14 2 v 15 w(error\(integer,)19 b(Code\))p 1859 1344 2 50 v -30 1346 1890 2 v -30 1445 2 100 v -3 1380 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(stream-term)i(or)-3 1430 y(alias)p 915 1445 V 941 1380 a Fh(domain)p 1076 1380 14 2 v 15 w(error\(stream)p 1355 1380 V 13 w(or)p 1412 1380 V 15 w(alias,)21 b(SorA\))p 1859 1445 2 100 v -30 1447 1890 2 v -30 1497 2 50 v -3 1482 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i(stream)p 915 1497 V 155 w Fh(existence)p 1142 1482 14 2 v 14 w(error\(stream,)k (SorA\))p 1859 1497 2 50 v -30 1498 1890 2 v -30 1548 2 50 v -3 1533 a(SorA)13 b Fm(is)h(an)f(output)i(stream)p 915 1548 V 485 w Fh(permission)p 1164 1533 14 2 v 14 w(error\(input,)k(stream,)h(SorA\))p 1859 1548 2 50 v -30 1550 1890 2 v -30 1649 2 100 v -3 1585 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(binary)f(stream)p 915 1649 V 222 w Fh(permission)p 1164 1585 14 2 v 14 w(error\(input,)19 b(binary)p 1593 1585 V 14 w(stream,)941 1634 y(SorA\))p 1859 1649 2 100 v -30 1651 1890 2 v -30 1701 2 50 v -3 1686 a(Code)13 b Fm(is)h(an)f(in)o(teger)i(but)f(not)g (a)f(c)o(haracter)j(co)q(de)p 915 1701 V 159 w Fh(representation)p 1252 1686 14 2 v 13 w(error\(character)p 1594 1686 V 12 w(code\))p 1859 1701 2 50 v -30 1703 1890 2 v -30 1785 a Fi(P)o(ortabilit)o(y)-30 1885 y Fm(GNU)e(Prolog)f(predicates.) -30 2040 y Fi(7.12.5)48 b Fh(put)p 209 2040 14 2 v 15 w(char/2)p Fi(,)15 b Fh(put)p 450 2040 V 15 w(char/1)p Fi(,)g Fh(put)p 691 2040 V 15 w(code/1)p Fi(,)g Fh(put)p 932 2040 V 15 w(code/2)p Fi(,)g Fh(nl/1)p Fi(,)h Fh(nl/0)-30 2167 y Fi(T)l(emplates)74 2238 y Fh(put)p 143 2238 V 15 w(char\(+stream)p 422 2238 V 14 w(or)p 480 2238 V 15 w(alias,)k(+character\))74 2288 y(put)p 143 2288 V 15 w(char\(+character\))74 2338 y(put)p 143 2338 V 15 w(code\(+stream)p 422 2338 V 14 w(or)p 480 2338 V 15 w(alias,)g(+character)p 867 2338 V 14 w(code\))74 2388 y(put)p 143 2388 V 15 w(code\(+character)p 488 2388 V 13 w(code\))74 2438 y(nl\(+stream)p 297 2438 V 14 w(or)p 355 2438 V 15 w(alias\))74 2488 y(nl)-30 2559 y Fi(Description)-30 2659 y Fh(put)p 39 2659 V 16 w(char\(SorA,)f(Char\))13 b Fm(writes)i Fh(Char)e Fm(on)o(to)g(the)i(stream)f(asso)q(ciated)h (with)e(the)i(stream-term)f(or)g(alias)f Fh(SorA)p Fm(.)-30 2759 y Fh(put)p 39 2759 V 16 w(code/2)f Fm(is)i(similar)e(to)i Fh(put)p 494 2759 V 15 w(char/2)f Fm(but)h(deals)g(with)f(c)o(haracter) j(co)q(des.)-30 2858 y Fh(nl\(SorA\))h Fm(writes)h(a)f(new-line)h(c)o (haracter)h(on)o(to)f(the)g(stream)g(asso)q(ciated)h(with)e(the)i (stream-term)f(or)g(alias)f Fh(SorA)p Fm(.)-30 2908 y(This)d(is)g (equiv)n(alen)o(t)f(to)h Fh(put)p 424 2908 V 15 w(char\(SorA,)20 b('\\n'\))p Fm(.)p eop end %%Page: 89 91 TeXDict begin 89 90 bop -30 -45 a Fm(7.13)41 b(Byte)15 b(input/output)1393 b(89)p -30 -27 1890 4 v -30 115 a Fh(put)p 39 115 14 2 v 16 w(char/1)p Fm(,)12 b Fh(put)p 277 115 V 15 w(code/1)g Fm(and)i Fh(nl/0)f Fm(apply)g(to)h(the)g (curren)o(t)i(output)e(stream.)-30 215 y Fi(Errors)p -30 270 1890 2 v -30 320 2 50 v -3 305 a Fh(SorA)f Fm(is)h(a)f(v)n (ariable)p 915 320 V 624 w Fh(instantiation)p 1230 305 14 2 v 13 w(error)p 1859 320 2 50 v -30 322 1890 2 v -30 371 2 50 v -3 356 a(Char)g Fm(is)h(a)f(v)n(ariable)p 915 371 V 624 w Fh(instantiation)p 1230 356 14 2 v 13 w(error)p 1859 371 2 50 v -30 373 1890 2 v -30 423 2 50 v -3 408 a(Code)g Fm(is)h(a)f(v)n(ariable)p 915 423 V 624 w Fh(instantiation)p 1230 408 14 2 v 13 w(error)p 1859 423 2 50 v -30 425 1890 2 v -30 474 2 50 v -3 459 a(Char)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(c)o(haracter)p 915 474 V 196 w Fh(type)p 1032 459 14 2 v 15 w(error\(character,)18 b(Char\))p 1859 474 2 50 v -30 476 1890 2 v -30 526 2 50 v -3 511 a(Code)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g (in)o(teger)p 915 526 V 215 w Fh(type)p 1032 511 14 2 v 15 w(error\(integer,)19 b(Code\))p 1859 526 2 50 v -30 528 1890 2 v -30 627 2 100 v -3 562 a(SorA)13 b Fm(is)h(neither)h (a)e(v)n(ariable)g(nor)h(a)f(stream-term)i(or)-3 612 y(alias)p 915 627 V 941 562 a Fh(domain)p 1076 562 14 2 v 15 w(error\(stream)p 1355 562 V 13 w(or)p 1412 562 V 15 w(alias,)21 b(SorA\))p 1859 627 2 100 v -30 629 1890 2 v -30 679 2 50 v -3 664 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated) g(with)g(an)f(op)q(en)i(stream)p 915 679 V 155 w Fh(existence)p 1142 664 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 679 2 50 v -30 680 1890 2 v -30 730 2 50 v -3 715 a(SorA)13 b Fm(is)h(an)f(input)h(stream)p 915 730 V 511 w Fh(permission)p 1164 715 14 2 v 14 w(error\(output,)19 b(stream,)h(SorA\))p 1859 730 2 50 v -30 732 1890 2 v -30 831 2 100 v -3 767 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(binary)f(stream)p 915 831 V 222 w Fh(permission)p 1164 767 14 2 v 14 w(error\(output,)19 b(binary)p 1615 767 V 14 w(stream,)941 816 y(SorA\))p 1859 831 2 100 v -30 833 1890 2 v -30 883 2 50 v -3 868 a(Code)13 b Fm(is)h(an)f(in)o(teger)i(but)f(not)g(a)f(c)o(haracter)j (co)q(de)p 915 883 V 159 w Fh(representation)p 1252 868 14 2 v 13 w(error\(character)p 1594 868 V 12 w(code\))p 1859 883 2 50 v -30 885 1890 2 v -30 967 a Fi(P)o(ortabilit)o(y)-30 1067 y Fm(ISO)f(predicates.)-30 1233 y Ff(7.13)56 b(Byte)18 b(input/output)-30 1359 y Fm(These)h(built-in)d(predicates)j(enable)e (a)g(single)g(b)o(yte)h(to)f(b)q(e)h(input)f(from)f(and)h(output)h(to)f (a)g(binary)g(stream.)29 b Fh(-1)16 b Fm(is)-30 1409 y(returned)g(to)e(indicate)g(the)g(end-of-\014le.)-30 1567 y Fi(7.13.1)48 b Fh(get)p 209 1567 14 2 v 15 w(byte/2)p Fi(,)15 b Fh(get)p 450 1567 V 15 w(byte/1)-30 1693 y Fi(T)l(emplates)74 1776 y Fh(get)p 143 1776 V 15 w(byte\(+stream)p 422 1776 V 14 w(or)p 480 1776 V 15 w(alias,)20 b(?in)p 713 1776 V 15 w(byte\))74 1826 y(get)p 143 1826 V 15 w(byte\(?in)p 334 1826 V 14 w(byte\))-30 1909 y Fi(Description)-30 2009 y Fh(get)p 39 2009 V 16 w(byte\(SorA,)f(Byte\))12 b Fm(succeeds)j(if)f Fh(Byte)e Fm(uni\014es)h(with)f(the)h(next)g(b)o (yte)g(read)g(from)e(the)i(stream)g(asso)q(ciated)h(with)-30 2059 y(the)h(stream-term)g(or)f(alias)e Fh(SorA)p Fm(.)-30 2158 y Fh(get)p 39 2158 V 16 w(byte/1)g Fm(applies)i(to)f(the)i(curren) o(t)g(input)f(stream.)-30 2258 y Fi(Errors)p -30 2314 1890 2 v -30 2363 2 50 v -3 2348 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 2363 V 624 w Fh(instantiation)p 1230 2348 14 2 v 13 w(error)p 1859 2363 2 50 v -30 2365 1890 2 v -30 2415 2 50 v -3 2400 a(Byte)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g (in-b)o(yte)p 915 2415 V 211 w Fh(type)p 1032 2400 14 2 v 15 w(error\(in)p 1223 2400 V 14 w(byte,)21 b(Byte\))p 1859 2415 2 50 v -30 2416 1890 2 v -30 2516 2 100 v -3 2451 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (stream-term)i(or)-3 2501 y(alias)p 915 2516 V 941 2451 a Fh(domain)p 1076 2451 14 2 v 15 w(error\(stream)p 1355 2451 V 13 w(or)p 1412 2451 V 15 w(alias,)21 b(SorA\))p 1859 2516 2 100 v -30 2518 1890 2 v -30 2568 2 50 v -3 2553 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i (stream)p 915 2568 V 155 w Fh(existence)p 1142 2553 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 2568 2 50 v -30 2569 1890 2 v -30 2619 2 50 v -3 2604 a(SorA)13 b Fm(is)h(an)f(output)i (stream)p 915 2619 V 485 w Fh(permission)p 1164 2604 14 2 v 14 w(error\(input,)k(stream,)h(SorA\))p 1859 2619 2 50 v -30 2621 1890 2 v -30 2720 2 100 v -3 2656 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(text)g(stream)p 915 2720 V 266 w Fh(permission)p 1164 2656 14 2 v 14 w(error\(input,)19 b(text)p 1549 2656 V 15 w(stream,)941 2705 y(SorA\))p 1859 2720 2 100 v -30 2722 1890 2 v -30 2822 2 100 v -3 2757 a(SorA)13 b Fm(has)h(stream)g(prop)q(erties)-3 2807 y Fh(end)p 66 2807 14 2 v 15 w(of)p 125 2807 V 15 w(stream\(past\))e Fm(and)h Fh(eof)p 562 2807 V 16 w(action\(error\))p 915 2822 2 100 v 941 2757 a(permission)p 1164 2757 14 2 v 14 w(error\(input,)941 2807 y(past)p 1032 2807 V 15 w(end)p 1113 2807 V 15 w(of)p 1172 2807 V 15 w(stream,)21 b(SorA\))p 1859 2822 2 100 v -30 2823 1890 2 v -30 2906 a Fi(P)o(ortabilit)o(y)p eop end %%Page: 90 92 TeXDict begin 90 91 bop -30 -45 a Fm(90)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a(ISO)h(predicates.)-30 273 y Fi(7.13.2)48 b Fh(peek)p 231 273 14 2 v 15 w(byte/2)p Fi(,)15 b Fh(peek)p 494 273 V 15 w(byte/1)-30 399 y Fi(T)l(emplates)74 482 y Fh(peek)p 165 482 V 15 w(byte\(+stream)p 444 482 V 13 w(or)p 501 482 V 16 w(alias,)20 b(?in)p 735 482 V 15 w(byte\))74 532 y(peek)p 165 532 V 15 w(byte\(?in)p 356 532 V 14 w(byte\))-30 615 y Fi(Description)-30 715 y Fh(peek)p 61 715 V 15 w(byte\(SorA,)g(Byte\))15 b Fm(succeeds)j(if)g Fh(Byte)c Fm(uni\014es)i(with)g(the)g(next)g(b)o(yte)g(that)f(will)f(b) q(e)j(read)f(from)e(the)j(stream)-30 764 y(asso)q(ciated)e(with)f(the)g (stream-term)h(or)f(alias)e Fh(SorA)p Fm(.)h(The)h(b)o(yte)h(is)e(not)h (read.)-30 864 y Fh(peek)p 61 864 V 15 w(byte/1)f Fm(applies)h(to)f (the)i(curren)o(t)g(input)f(stream.)-30 964 y Fi(Errors)p -30 1019 1890 2 v -30 1069 2 50 v -3 1054 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 1069 V 624 w Fh(instantiation)p 1230 1054 14 2 v 13 w(error)p 1859 1069 2 50 v -30 1071 1890 2 v -30 1121 2 50 v -3 1106 a(Byte)g Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(an)g(in-b)o(yte)p 915 1121 V 211 w Fh(type)p 1032 1106 14 2 v 15 w(error\(in)p 1223 1106 V 14 w(byte,)21 b(Byte\))p 1859 1121 2 50 v -30 1122 1890 2 v -30 1222 2 100 v -3 1157 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h (a)f(stream-term)i(or)-3 1207 y(alias)p 915 1222 V 941 1157 a Fh(domain)p 1076 1157 14 2 v 15 w(error\(stream)p 1355 1157 V 13 w(or)p 1412 1157 V 15 w(alias,)21 b(SorA\))p 1859 1222 2 100 v -30 1223 1890 2 v -30 1273 2 50 v -3 1258 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i (stream)p 915 1273 V 155 w Fh(existence)p 1142 1258 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 1273 2 50 v -30 1275 1890 2 v -30 1325 2 50 v -3 1310 a(SorA)13 b Fm(is)h(an)f(output)i (stream)p 915 1325 V 485 w Fh(permission)p 1164 1310 14 2 v 14 w(error\(input,)k(stream,)h(SorA\))p 1859 1325 2 50 v -30 1326 1890 2 v -30 1426 2 100 v -3 1361 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(text)g(stream)p 915 1426 V 266 w Fh(permission)p 1164 1361 14 2 v 14 w(error\(input,)19 b(text)p 1549 1361 V 15 w(stream,)941 1411 y(SorA\))p 1859 1426 2 100 v -30 1428 1890 2 v -30 1527 2 100 v -3 1463 a(SorA)13 b Fm(has)h(stream)g(prop)q(erties)-3 1512 y Fh(end)p 66 1512 14 2 v 15 w(of)p 125 1512 V 15 w(stream\(past\))e Fm(and)h Fh(eof)p 562 1512 V 16 w(action\(error\))p 915 1527 2 100 v 941 1463 a(permission)p 1164 1463 14 2 v 14 w(error\(input,)941 1512 y(past)p 1032 1512 V 15 w(end)p 1113 1512 V 15 w(of)p 1172 1512 V 15 w(stream,)21 b(SorA\))p 1859 1527 2 100 v -30 1529 1890 2 v -30 1612 a Fi(P)o(ortabilit)o(y)-30 1711 y Fm(ISO)15 b(predicates.)-30 1869 y Fi(7.13.3)48 b Fh(unget)p 253 1869 14 2 v 15 w(byte/2)p Fi(,)15 b Fh(unget)p 538 1869 V 14 w(byte/1)-30 1996 y Fi(T)l(emplates)74 2079 y Fh(unget)p 187 2079 V 15 w(byte\(+stream)p 466 2079 V 13 w(or)p 523 2079 V 15 w(alias,)21 b(+byte\))74 2128 y(unget)p 187 2128 V 15 w(byte\(+byte\))-30 2211 y Fi(Description)-30 2311 y Fh(unget)p 83 2311 V 15 w(byte\(SorA,)f(Byte\))c Fm(pushes)i(bac)o(k)f Fh(Byte)f Fm(on)o(to)h(the)h(stream)f(asso)q(ciated)h(with)f(the)g (stream-term)h(or)f(alias)-30 2361 y Fh(SorA)p Fm(.)h Fh(Byte)g Fm(will)g(b)q(e)h(the)h(next)f(b)o(yte)h(read)f(b)o(y)h Fh(get)p 842 2361 V 15 w(byte/2)p Fm(.)32 b(The)19 b(maxim)o(um)e(n)o (um)o(b)q(er)i(of)g(b)o(ytes)g(that)g(can)h(b)q(e)-30 2411 y(successiv)o(ely)c(pushed)f(bac)o(k)f(is)g(giv)o(en)f(b)o(y)h (the)g Fh(max)p 782 2411 V 15 w(unget)f Fm(Prolog)g(\015ag)g(\(section) i(7.22.1,)d(page)i(133\).)-30 2510 y Fh(unget)p 83 2510 V 15 w(byte/1)f Fm(applies)g(to)h(the)h(curren)o(t)g(input)f(stream.) -30 2610 y Fi(Errors)p eop end %%Page: 91 93 TeXDict begin 91 92 bop -30 -45 a Fm(7.14)41 b(T)m(erm)13 b(input/output)1384 b(91)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(SorA)13 b Fm(is)h(a)f(v)n(ariable)p 915 125 V 624 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(Byte)g Fm(is)h(a)f(v)n(ariable)p 915 176 V 624 w Fh(instantiation)p 1230 161 14 2 v 13 w(error)p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(Byte)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(b)o(yte)p 915 228 V 284 w Fh(type)p 1032 213 14 2 v 15 w(error\(byte,)19 b(Byte\))p 1859 228 2 50 v -30 229 1890 2 v -30 329 2 100 v -3 264 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (stream-term)i(or)-3 314 y(alias)p 915 329 V 941 264 a Fh(domain)p 1076 264 14 2 v 15 w(error\(stream)p 1355 264 V 13 w(or)p 1412 264 V 15 w(alias,)21 b(SorA\))p 1859 329 2 100 v -30 331 1890 2 v -30 381 2 50 v -3 366 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i(stream) p 915 381 V 155 w Fh(existence)p 1142 366 14 2 v 14 w(error\(stream,)k (SorA\))p 1859 381 2 50 v -30 382 1890 2 v -30 432 2 50 v -3 417 a(SorA)13 b Fm(is)h(an)f(output)i(stream)p 915 432 V 485 w Fh(permission)p 1164 417 14 2 v 14 w(error\(input,)k (stream,)h(SorA\))p 1859 432 2 50 v -30 434 1890 2 v -30 533 2 100 v -3 469 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g (text)g(stream)p 915 533 V 266 w Fh(permission)p 1164 469 14 2 v 14 w(error\(input,)19 b(text)p 1549 469 V 15 w(stream,)941 518 y(SorA\))p 1859 533 2 100 v -30 535 1890 2 v -30 618 a Fi(P)o(ortabilit)o(y)-30 717 y Fm(GNU)14 b(Prolog)f(predicates.)-30 875 y Fi(7.13.4)48 b Fh(put)p 209 875 14 2 v 15 w(byte/2)p Fi(,)15 b Fh(put)p 450 875 V 15 w(byte/1)-30 1002 y Fi(T)l(emplates)74 1085 y Fh(put)p 143 1085 V 15 w(byte\(+stream)p 422 1085 V 14 w(or)p 480 1085 V 15 w(alias,)20 b(+byte\))74 1134 y(put)p 143 1134 V 15 w(byte\(+byte\))-30 1217 y Fi(Description)-30 1317 y Fh(put)p 39 1317 V 16 w(byte\(SorA,)f(Byte\))13 b Fm(writes)i Fh(Byte)e Fm(on)o(to)g(the)i(stream)f(asso)q(ciated)h (with)e(the)i(stream-term)f(or)g(alias)f Fh(SorA)p Fm(.)-30 1417 y Fh(put)p 39 1417 V 16 w(byte/1)f Fm(applies)i(to)f(the)i(curren) o(t)g(output)f(stream.)-30 1516 y Fi(Errors)p -30 1572 1890 2 v -30 1622 2 50 v -3 1607 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 1622 V 624 w Fh(instantiation)p 1230 1607 14 2 v 13 w(error)p 1859 1622 2 50 v -30 1623 1890 2 v -30 1673 2 50 v -3 1658 a(Byte)g Fm(is)h(a)f(v)n(ariable)p 915 1673 V 624 w Fh(instantiation)p 1230 1658 14 2 v 13 w(error)p 1859 1673 2 50 v -30 1675 1890 2 v -30 1725 2 50 v -3 1710 a(Byte)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(b)o(yte)p 915 1725 V 284 w Fh(type)p 1032 1710 14 2 v 15 w(error\(byte,)19 b(Byte\))p 1859 1725 2 50 v -30 1726 1890 2 v -30 1826 2 100 v -3 1761 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h (a)f(stream-term)i(or)-3 1811 y(alias)p 915 1826 V 941 1761 a Fh(domain)p 1076 1761 14 2 v 15 w(error\(stream)p 1355 1761 V 13 w(or)p 1412 1761 V 15 w(alias,)21 b(SorA\))p 1859 1826 2 100 v -30 1828 1890 2 v -30 1877 2 50 v -3 1862 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i (stream)p 915 1877 V 155 w Fh(existence)p 1142 1862 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 1877 2 50 v -30 1879 1890 2 v -30 1929 2 50 v -3 1914 a(SorA)13 b Fm(is)h(an)f(output)i (stream)p 915 1929 V 485 w Fh(permission)p 1164 1914 14 2 v 14 w(error\(output,)k(stream,)h(SorA\))p 1859 1929 2 50 v -30 1931 1890 2 v -30 2030 2 100 v -3 1965 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(text)g(stream)p 915 2030 V 266 w Fh(permission)p 1164 1965 14 2 v 14 w(error\(output,)19 b(text)p 1571 1965 V 15 w(stream,)941 2015 y(SorA\))p 1859 2030 2 100 v -30 2032 1890 2 v -30 2115 a Fi(P)o(ortabilit)o(y)-30 2214 y Fm(GNU)14 b(Prolog)f (predicates.)-30 2380 y Ff(7.14)56 b(T)-5 b(erm)18 b(input/output)-30 2507 y Fm(These)f(built-in)d(predicates)i(enable)g(a)f(Prolog)f(term)i (to)f(b)q(e)g(input)g(from)g(or)g(output)g(to)g(a)g(text)h(stream.)22 b(The)16 b(atom)-30 2557 y Fh(end)p 39 2557 14 2 v 16 w(of)p 99 2557 V 15 w(file)c Fm(is)h(returned)h(as)f(term)h(to)f (indicate)f(the)i(end-of-\014le.)j(The)d(syn)o(tax)f(of)f(suc)o(h)i (terms)g(can)f(also)f(b)q(e)i(altered)-30 2606 y(b)o(y)h(c)o(hanging)e (the)i(op)q(erators)h(\(section)f(7.14.10,)d(page)i(100\),)f(and)i (making)e(some)h(c)o(haracters)i(equiv)n(alen)o(t)e(to)g(others)-30 2656 y(\(section)i(7.14.12,)d(page)i(102\))f(if)h(the)g Fh(char)p 674 2656 V 15 w(conversion)e Fm(Prolog)h(\015ag)h(is)g Fh(on)f Fm(\(section)i(7.22.1,)d(page)i(133\).)21 b(Double)-30 2706 y(quoted)16 b(tok)o(ens)f(will)f(b)q(e)i(returned)g(as)g(an)e (atom)h(or)g(a)f(c)o(haracter)j(list)d(or)h(a)g(c)o(haracter)i(co)q(de) f(list)e(dep)q(ending)i(on)f(the)-30 2756 y(v)n(alue)j(of)f(the)i Fh(double)p 344 2756 V 14 w(quotes)e Fm(Prolog)g(\015ag)h(\(section)g (7.22.1,)f(page)h(133\).)29 b(Similarly)m(,)16 b(bac)o(k)i(quoted)g (tok)o(ens)h(are)-30 2806 y(returned)d(dep)q(ending)f(on)e(the)i(v)n (alue)e(of)g(the)i Fh(back)p 785 2806 V 15 w(quotes)d Fm(Prolog)h(\015ag.)p eop end %%Page: 92 94 TeXDict begin 92 93 bop -30 -45 a Fm(92)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(7.14.1)48 b Fh(read)p 231 115 14 2 v 15 w(term/3)p Fi(,)15 b Fh(read)p 494 115 V 15 w(term/2)p Fi(,)g Fh(read/2)p Fi(,)g Fh(read/1)-30 241 y Fi(T)l(emplates)74 324 y Fh(read)p 165 324 V 15 w(term\(+stream)p 444 324 V 13 w(or)p 501 324 V 16 w(alias,)20 b(?term,)h(+read)p 932 324 V 14 w(option)p 1078 324 V 15 w(list\))74 374 y(read)p 165 374 V 15 w(term\(?term,)f(+read)p 552 374 V 14 w(option)p 698 374 V 15 w(list\))74 424 y(read\(+stream)p 341 424 V 13 w(or)p 398 424 V 16 w(alias,)g(?term\))74 474 y(read\(?term\))-30 557 y Fi(Description)-30 656 y Fh(read)p 61 656 V 15 w(term\(SorA,)g(Term,)h(Options\))d Fm(is)j(true)g(if)i Fh(Term)c Fm(uni\014es)i(with)f(the)h(next)g(term)f(read)h(from)f(the)h (stream)-30 706 y(asso)q(ciated)15 b(with)f(the)g(stream-term)h(or)f (alias)e Fh(SorA)h Fm(according)h(to)g(the)h(options)e(giv)o(en)h(b)o (y)g Fh(Options)p Fm(.)-30 806 y Fi(Read)f(options)p Fm(:)h Fh(Options)c Fm(is)h(a)g(list)f(of)h(read)g(options.)17 b(If)10 b(this)i(list)e(con)o(tains)h(con)o(tradictory)g(options,)g (the)h(righ)o(tmost)-30 856 y(option)i(is)f(the)i(one)f(whic)o(h)g (applies.)j(P)o(ossible)d(options)g(are:)33 939 y Fg(\017)20 b Fh(variables\(VL\))p Fm(:)8 b Fh(VL)j Fm(is)h(uni\014ed)f(with)g(the) h(list)f(of)g(all)f(v)n(ariables)h(of)g(the)h(input)f(term,)h(in)f (left-to-righ)o(t)f(tra)o(v)o(ersal)74 989 y(order.)19 b(Anon)o(ymous)13 b(v)n(ariables)h(are)g(included)g(in)f(the)i(list)e Fh(VL)p Fm(.)33 1072 y Fg(\017)20 b Fh(variable)p 253 1072 V 14 w(names\(VNL\))p Fm(:)e Fh(VNL)h Fm(is)g(uni\014ed)i(with)e (the)i(list)e(of)g(pairs)h Fh(Name)h(=)h(Var)d Fm(where)i Fh(Var)e Fm(is)h(a)f(named)74 1121 y(v)n(ariable)13 b(of)h(the)h(term)f (and)g Fh(Name)g Fm(is)g(the)g(atom)g(asso)q(ciated)h(with)e(the)i (name)f(of)j Fh(Var)p Fm(.)h(Anon)o(ymous)c(v)n(ariables)74 1171 y(are)h(not)e(included)h(in)g(the)g(list)g Fh(VNL)p Fm(.)33 1254 y Fg(\017)20 b Fh(singletons\(SL\))p Fm(:)7 b Fh(SL)i Fm(is)g(uni\014ed)h(with)g(the)g(list)f(of)h(pairs)f Fh(Name)21 b(=)h(Var)9 b Fm(where)i Fh(Var)e Fm(is)h(a)f(named)h(v)n (ariable)e(whic)o(h)74 1304 y(o)q(ccurs)19 b(only)d(once)i(in)f(the)g (term)h(and)f Fh(Name)f Fm(is)h(the)h(atom)e(asso)q(ciated)i(to)f(the)h (name)f(of)j Fh(Var)p Fm(.)27 b(Anon)o(ymous)74 1354 y(v)n(ariables)13 b(are)i(not)f(included)g(in)f(the)h(list)g Fh(SL)p Fm(.)33 1437 y Fg(\017)20 b Fh(syntax)p 209 1437 V 15 w(error\(error)p Fm(/)p Fh(warn)o(ing)p Fm(/)o Fh(fail\))o Fm(:)15 b(sp)q(eci\014es)h(the)f(e\013ect)g(of)e(a)h(syn)o(tax)g (error:)121 1487 y Fi({)21 b Fh(error)p Fm(:)c(a)c Fh(syntax)p 474 1487 V 15 w(error)f Fm(is)i(raised.)121 1553 y Fi({)21 b Fh(warning)p Fm(:)16 b(a)e(w)o(arning)f(message)h(is)g(displa)o(y)o (ed)f(and)h(the)h(predicate)g(fails.)121 1619 y Fi({)21 b Fh(fail)p Fm(:)c(the)d(predicate)h(quietly)f(fails.)74 1653 y(The)h(default)e(v)n(alue)g(is)h(the)h(v)n(alue)e(of)g(the)i Fh(syntax)p 881 1653 V 14 w(error)e Fm(Prolog)g(\015ag)g(\(section)i (7.22.1,)d(page)h(133\).)33 1736 y Fg(\017)20 b Fh(end)p 143 1736 V 15 w(of)p 202 1736 V 16 w(term\(dot)p Fm(/)p Fh(eof\))p Fm(:)c(sp)q(eci\014es)h(the)e(end-of-term)f(delimiter:)19 b Fh(dot)14 b Fm(is)h(the)g(classical)f(full-stop)g(delimiter)74 1786 y(\(a)h(dot)h(follo)o(w)o(ed)d(with)i(a)g(la)o(y)o(out)g(c)o (haracter\),)h Fh(eof)f Fm(is)g(the)h(end-of-\014le)f(delimiter.)22 b(This)15 b(option)g(is)g(useful)h(for)74 1835 y(predicates)e(lik)o(e)e Fh(read)p 435 1835 V 15 w(term)p 538 1835 V 15 w(from)p 641 1835 V 15 w(atom/3)f Fm(\(section)i(7.15.1,)e(page)h(104\))g(to)h (a)o(v)o(oid)e(to)h(add)h(a)f(terminal)g(dot)g(at)74 1885 y(the)j(end)f(of)f(the)i(atom.)i(The)d(default)g(v)n(alue)f(is)h Fh(dot)p Fm(.)-30 1968 y Fh(read\(SorA,)20 b(Term\))13 b Fm(is)h(equiv)n(alen)o(t)f(to)h Fh(read)p 714 1968 V 15 w(term\(SorA,)19 b(Term,)i([]\))p Fm(.)-30 2068 y Fh(read)p 61 2068 V 15 w(term/2)13 b Fm(and)h Fh(read/1)e Fm(apply)h(to)h(the)h(curren)o(t)g(input)f(stream.)-30 2167 y Fi(Errors)p eop end %%Page: 93 95 TeXDict begin 93 94 bop -30 -45 a Fm(7.14)41 b(T)m(erm)13 b(input/output)1384 b(93)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(SorA)13 b Fm(is)h(a)f(v)n(ariable)p 915 125 V 624 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 226 2 100 v -3 161 a(Options)f Fm(is)i(a)g(partial)f(list)g(or)h(a)f(list)h (with)f(an)h(elemen)o(t)-3 211 y Fh(E)g Fm(whic)o(h)f(is)h(a)g(v)n (ariable)p 915 226 V 941 161 a Fh(instantiation)p 1230 161 14 2 v 13 w(error)p 1859 226 2 100 v -30 228 1890 2 v -30 327 2 100 v -3 263 a(SorA)f Fm(is)h(neither)h(a)e(v)n(ariable)g (nor)h(a)f(stream-term)i(or)-3 312 y(alias)p 915 327 V 941 263 a Fh(domain)p 1076 263 14 2 v 15 w(error\(stream)p 1355 263 V 13 w(or)p 1412 263 V 15 w(alias,)21 b(SorA\))p 1859 327 2 100 v -30 329 1890 2 v -30 379 2 50 v -3 364 a(Options)12 b Fm(is)i(neither)h(a)f(partial)e(list)i(nor)g(a)f(list)p 915 379 V 193 w Fh(type)p 1032 364 14 2 v 15 w(error\(list,)19 b(Options\))p 1859 379 2 50 v -30 381 1890 2 v -30 480 2 100 v -3 415 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Options)f Fm(list)g(is)h(neither)h(a)-3 465 y(v)n(ariable)e(nor)h(a) f(v)n(alid)g(read)h(option)p 915 480 V 941 415 a Fh(domain)p 1076 415 14 2 v 15 w(error\(read)p 1311 415 V 13 w(option,)21 b(E\))p 1859 480 2 100 v -30 482 1890 2 v -30 532 2 50 v -3 517 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en) i(stream)p 915 532 V 155 w Fh(existence)p 1142 517 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 532 2 50 v -30 533 1890 2 v -30 583 2 50 v -3 568 a(SorA)13 b Fm(is)h(an)f(output)i (stream)p 915 583 V 485 w Fh(permission)p 1164 568 14 2 v 14 w(error\(input,)k(stream,)h(SorA\))p 1859 583 2 50 v -30 585 1890 2 v -30 684 2 100 v -3 620 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(binary)f(stream)p 915 684 V 222 w Fh(permission)p 1164 620 14 2 v 14 w(error\(input,)19 b(binary)p 1593 620 V 14 w(stream,)941 669 y(SorA\))p 1859 684 2 100 v -30 686 1890 2 v -30 786 2 100 v -3 721 a(SorA)13 b Fm(has)h(stream)g(prop)q(erties)-3 771 y Fh(end)p 66 771 14 2 v 15 w(of)p 125 771 V 15 w(stream\(past\))e Fm(and)h Fh(eof)p 562 771 V 16 w(action\(error\))p 915 786 2 100 v 941 721 a(permission)p 1164 721 14 2 v 14 w(error\(input,)941 771 y(past)p 1032 771 V 15 w(end)p 1113 771 V 15 w(of)p 1172 771 V 15 w(stream,)21 b(SorA\))p 1859 786 2 100 v -30 787 1890 2 v -30 937 2 150 v -3 822 a Fm(a)14 b(syn)o(tax)f(error)i(o)q(ccurs)h(and)d(the)i(v)n(alue)e (of)g(the)-3 872 y Fh(syntax)p 132 872 14 2 v 14 w(error)g Fm(Prolog)g(\015ag)h(is)g Fh(error)-3 922 y Fm(\(section)h(7.22.1,)c (page)j(133\))p 915 937 2 150 v 941 822 a Fh(syntax)p 1076 822 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 937 2 150 v -30 938 1890 2 v -30 1021 a Fi(P)o(ortabilit)o(y)-30 1121 y Fm(ISO)19 b(predicates.)34 b(The)19 b(ISO)g(reference)j(raises)d(a)f Fh(representation)p 1113 1121 14 2 v 13 w(error\(Flag\))e Fm(where)k Fh(Flag)e Fm(is)h Fh(max)p 1728 1121 V 15 w(arity)p Fm(,)-30 1171 y Fh(max)p 39 1171 V 16 w(integer)p Fm(,)c(or)22 b Fh(min)p 361 1171 V 15 w(integer)16 b Fm(when)h(the)h(read)g(term)f(breac)o(hes) i(an)e(implemen)o(tation)e(de\014ned)j(limit)e(sp)q(eci\014ed)-30 1221 y(b)o(y)h Fh(Flag)p Fm(.)22 b(GNU)16 b(Prolog)f(detects)j(neither) e Fh(min)p 752 1221 V 15 w(integer)f Fm(nor)g Fh(max)p 1077 1221 V 15 w(integer)g Fm(violation)e(and)j(treats)h(a)e Fh(max)p 1739 1221 V 15 w(arity)-30 1270 y Fm(violation)j(as)h(a)h(syn) o(tax)f(error.)36 b(The)20 b(read)f(options)h Fh(syntax)p 993 1270 V 14 w(error/1)e Fm(and)h Fh(end)p 1331 1270 V 15 w(of)p 1390 1270 V 16 w(term/1)f Fm(are)i(GNU)f(Prolog)-30 1320 y(extensions.)-30 1478 y Fi(7.14.2)48 b Fh(read)p 231 1478 V 15 w(atom/2)p Fi(,)15 b Fh(read)p 494 1478 V 15 w(atom/1)p Fi(,)g Fh(read)p 757 1478 V 15 w(integer/2)p Fi(,)f Fh(read)p 1085 1478 V 15 w(integer/1)p Fi(,)140 1528 y Fh(read)p 231 1528 V 15 w(number/2)p Fi(,)h Fh(read)p 538 1528 V 14 w(number/1)-30 1654 y Fi(T)l(emplates)74 1737 y Fh(read)p 165 1737 V 15 w(atom\(+stream)p 444 1737 V 13 w(or)p 501 1737 V 16 w(alias,)20 b(?atom\))74 1787 y(read)p 165 1787 V 15 w(atom\(?atom\))74 1837 y(read)p 165 1837 V 15 w(integer\(+stream)p 510 1837 V 13 w(or)p 567 1837 V 15 w(alias,)h(?integer\))74 1887 y(read)p 165 1887 V 15 w(integer\(?integer\))74 1936 y(read)p 165 1936 V 15 w(number\(+stream)p 488 1936 V 13 w(or)p 545 1936 V 15 w(alias,)g(?number\))74 1986 y(read)p 165 1986 V 15 w(number\(?number\))-30 2069 y Fi(Description)-30 2169 y Fh(read)p 61 2169 V 15 w(atom\(SorA,)f(Atom\))c Fm(succeeds)j(if)h Fh(Atom)15 b Fm(uni\014es)j(with)e(the)i(next)f (atom)f(read)i(from)e(the)h(stream)g(asso)q(ciated)-30 2219 y(with)d(the)h(stream-term)f(or)g(alias)f Fh(SorA)p Fm(.)-30 2318 y Fh(read)p 61 2318 V 15 w(integer\(SorA,)19 b(Integer\))13 b Fm(succeeds)18 b(if)f Fh(Integer)c Fm(uni\014es)i (with)f(the)h(next)g(in)o(teger)g(read)h(from)d(the)j(stream)-30 2368 y(asso)q(ciated)f(with)f(the)g(stream-term)h(or)f(alias)e Fh(SorA)p Fm(.)-30 2468 y Fh(read)p 61 2468 V 15 w(number\(SorA,)20 b(Number\))12 b Fm(succeeds)k(if)g Fh(Number)c Fm(uni\014es)i(with)f (the)i(next)f(n)o(um)o(b)q(er)f(\(in)o(teger)i(or)e(\015oating)g(p)q (oin)o(t)-30 2518 y(n)o(um)o(b)q(er\))i(read)f(from)f(the)i(stream)f (asso)q(ciated)h(with)e(the)i(stream-term)g(or)e(alias)g Fh(SorA)p Fm(.)-30 2617 y Fh(read)p 61 2617 V 15 w(atom/1)p Fm(,)f Fh(read)p 320 2617 V 15 w(integer/1)g Fm(and)i Fh(read)p 714 2617 V 15 w(number/1)e Fm(apply)h(to)h(the)g(curren)o(t)i (input)e(stream.)-30 2717 y Fi(Errors)p eop end %%Page: 94 96 TeXDict begin 94 95 bop -30 -45 a Fm(94)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(SorA)f Fm(is)h(a)f(v)n(ariable)p 915 125 V 624 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(Atom)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g (atom)p 915 176 V 245 w Fh(type)p 1032 161 14 2 v 15 w(error\(atom,)19 b(Atom\))p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(Integer)12 b Fm(is)i(neither)h(a)f(v)n (ariable)e(nor)i(an)g(in)o(teger)p 915 228 V 150 w Fh(type)p 1032 213 14 2 v 15 w(error\(integer,)19 b(Integer\))p 1859 228 2 50 v -30 229 1890 2 v -30 279 2 50 v -3 264 a(Number)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(a)h(n)o(um)o(b) q(er)p 915 279 V 181 w Fh(type)p 1032 264 14 2 v 15 w(error\(number,)19 b(Number\))p 1859 279 2 50 v -30 281 1890 2 v -30 381 2 100 v -3 316 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a) f(stream-term)i(or)-3 366 y(alias)p 915 381 V 941 316 a Fh(domain)p 1076 316 14 2 v 15 w(error\(stream)p 1355 316 V 13 w(or)p 1412 316 V 15 w(alias,)21 b(SorA\))p 1859 381 2 100 v -30 382 1890 2 v -30 432 2 50 v -3 417 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i(stream) p 915 432 V 155 w Fh(existence)p 1142 417 14 2 v 14 w(error\(stream,)k (SorA\))p 1859 432 2 50 v -30 434 1890 2 v -30 484 2 50 v -3 469 a(SorA)13 b Fm(is)h(an)f(output)i(stream)p 915 484 V 485 w Fh(permission)p 1164 469 14 2 v 14 w(error\(input,)k (stream,)h(SorA\))p 1859 484 2 50 v -30 485 1890 2 v -30 585 2 100 v -3 520 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g (binary)f(stream)p 915 585 V 222 w Fh(permission)p 1164 520 14 2 v 14 w(error\(input,)19 b(binary)p 1593 520 V 14 w(stream,)941 570 y(SorA\))p 1859 585 2 100 v -30 586 1890 2 v -30 686 2 100 v -3 621 a(SorA)13 b Fm(has)h(stream)g(prop) q(erties)-3 671 y Fh(end)p 66 671 14 2 v 15 w(of)p 125 671 V 15 w(stream\(past\))e Fm(and)h Fh(eof)p 562 671 V 16 w(action\(error\))p 915 686 2 100 v 941 621 a(permission)p 1164 621 14 2 v 14 w(error\(input,)941 671 y(past)p 1032 671 V 15 w(end)p 1113 671 V 15 w(of)p 1172 671 V 15 w(stream,)21 b(SorA\))p 1859 686 2 100 v -30 688 1890 2 v -30 837 2 150 v -3 723 a Fm(a)14 b(syn)o(tax)f(error)i(o)q(ccurs)h(and)d(the)i (v)n(alue)e(of)g(the)-3 772 y Fh(syntax)p 132 772 14 2 v 14 w(error)g Fm(Prolog)g(\015ag)h(is)g Fh(error)-3 822 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 837 2 150 v 941 723 a Fh(syntax)p 1076 723 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 837 2 150 v -30 839 1890 2 v -30 922 a Fi(P)o(ortabilit)o(y)-30 1021 y Fm(GNU)14 b(Prolog)f(predicates.)-30 1179 y Fi(7.14.3)48 b Fh(read)p 231 1179 14 2 v 15 w(token/2)p Fi(,)15 b Fh(read)p 516 1179 V 15 w(token/1)-30 1305 y Fi(T)l(emplates)74 1388 y Fh(read)p 165 1388 V 15 w(token\(+stream)p 466 1388 V 13 w(or)p 523 1388 V 15 w(alias,)21 b(?nonvar\))74 1438 y(read)p 165 1438 V 15 w(token\(?nonvar\))-30 1521 y Fi(Description)-30 1621 y Fh(read)p 61 1621 V 15 w(token\(SorA,)f (Token\))c Fm(succeeds)k(if)g Fh(Token)c Fm(uni\014es)i(with)f(the)h (enco)q(ding)f(of)g(the)h(next)g(Prolog)e(tok)o(en)i(read)-30 1671 y(from)c(the)g(stream)h(asso)q(ciated)f(with)g(stream-term)g(or)g (alias)f Fh(SorA)p Fm(.)-30 1770 y Fi(T)l(ok)o(en)j(enco)q(ding)q Fm(:)33 1853 y Fg(\017)k Fh(var\(A\))p Fm(:)12 b(a)i(v)n(ariable)f(is)g (read)i(whose)f(name)g(is)g(the)g(atom)f Fh(A)p Fm(.)33 1936 y Fg(\017)20 b Fm(an)14 b(atom)f Fh(A)p Fm(:)g(an)h(atom)f Fh(A)h Fm(is)f(read.)33 2019 y Fg(\017)20 b Fm(in)o(teger)15 b Fh(N)p Fm(:)e(an)g(in)o(teger)i Fh(N)e Fm(is)h(read.)33 2102 y Fg(\017)20 b Fm(\015oating)13 b(p)q(oin)o(t)h(n)o(um)o(b)q(er)g Fh(N)p Fm(:)f(a)g(\015oating)g(p)q(oin)o(t)h(n)o(um)o(b)q(er)g Fh(N)g Fm(is)f(read.)33 2185 y Fg(\017)20 b Fh(string\(A\))p Fm(:)12 b(a)h(string)h(\(double)g(quoted)g(item\))g(is)g(read)g(whose)h (c)o(haracters)g(forms)f(the)g(atom)f Fh(A)p Fm(.)33 2268 y Fg(\017)20 b Fh(punct\(P\))p Fm(:)e(a)h(punctuation)g(c)o (haracter)i Fh(P)f Fm(is)f(read)h(\()p Fh(P)f Fm(is)h(a)f(one-c)o (haracter)i(atom)e(in)g Fh(\(\)[]{|})p Fm(,)g(the)h(atom)74 2318 y Fh(full)p 165 2318 V 15 w(stop)13 b Fm(or)h(the)g(atom)g Fh(end)p 576 2318 V 15 w(of)p 635 2318 V 15 w(file)p Fm(\).)33 2401 y Fg(\017)20 b Fh(back)p 165 2401 V 15 w(quotes\(A\))p Fm(:)12 b(a)h(bac)o(k)h(quoted)g(item)g(is)g(read)g (whose)g(c)o(haracters)i(forms)e(the)g(atom)f Fh(A)p Fm(.)33 2484 y Fg(\017)20 b Fh(extended\(A\))p Fm(:)11 b(an)j(extended)h(c)o(haracter)h Fh(A)d Fm(\(an)h(atom\))f(is)h(read.) -30 2567 y(As)j(for)e Fh(read)p 190 2567 V 15 w(term/3)p Fm(,)g(the)h(b)q(eha)o(vior)g(of)i Fh(read)p 749 2567 V 15 w(token/2)d Fm(can)h(b)q(e)g(a\013ected)i(b)o(y)d(some)h(Prolog)f (\015ags)h(\(section)h(7.14,)-30 2617 y(page)d(91\).)-30 2717 y Fh(read)p 61 2717 V 15 w(token/1)f Fm(applies)g(to)h(the)h (curren)o(t)g(input)f(stream.)-30 2816 y Fi(Errors)p eop end %%Page: 95 97 TeXDict begin 95 96 bop -30 -45 a Fm(7.14)41 b(T)m(erm)13 b(input/output)1384 b(95)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(SorA)13 b Fm(is)h(a)f(v)n(ariable)p 915 125 V 624 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 226 2 100 v -3 161 a(SorA)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (stream-term)i(or)-3 211 y(alias)p 915 226 V 941 161 a Fh(domain)p 1076 161 14 2 v 15 w(error\(stream)p 1355 161 V 13 w(or)p 1412 161 V 15 w(alias,)21 b(SorA\))p 1859 226 2 100 v -30 228 1890 2 v -30 278 2 50 v -3 263 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i(stream) p 915 278 V 155 w Fh(existence)p 1142 263 14 2 v 14 w(error\(stream,)k (SorA\))p 1859 278 2 50 v -30 279 1890 2 v -30 329 2 50 v -3 314 a(SorA)13 b Fm(is)h(an)f(output)i(stream)p 915 329 V 485 w Fh(permission)p 1164 314 14 2 v 14 w(error\(input,)k (stream,)h(SorA\))p 1859 329 2 50 v -30 331 1890 2 v -30 430 2 100 v -3 366 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g (binary)f(stream)p 915 430 V 222 w Fh(permission)p 1164 366 14 2 v 14 w(error\(input,)19 b(binary)p 1593 366 V 14 w(stream,)941 415 y(SorA\))p 1859 430 2 100 v -30 432 1890 2 v -30 532 2 100 v -3 467 a(SorA)13 b Fm(has)h(stream)g(prop) q(erties)-3 517 y Fh(end)p 66 517 14 2 v 15 w(of)p 125 517 V 15 w(stream\(past\))e Fm(and)h Fh(eof)p 562 517 V 16 w(action\(error\))p 915 532 2 100 v 941 467 a(permission)p 1164 467 14 2 v 14 w(error\(input,)941 517 y(past)p 1032 517 V 15 w(end)p 1113 517 V 15 w(of)p 1172 517 V 15 w(stream,)21 b(SorA\))p 1859 532 2 100 v -30 533 1890 2 v -30 683 2 150 v -3 568 a Fm(a)14 b(syn)o(tax)f(error)i(o)q(ccurs)h(and)d(the)i (v)n(alue)e(of)g(the)-3 618 y Fh(syntax)p 132 618 14 2 v 14 w(error)g Fm(Prolog)g(\015ag)h(is)g Fh(error)-3 668 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 683 2 150 v 941 568 a Fh(syntax)p 1076 568 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 683 2 150 v -30 684 1890 2 v -30 767 a Fi(P)o(ortabilit)o(y)-30 867 y Fm(GNU)14 b(Prolog)f(predicates.)-30 1025 y Fi(7.14.4)48 b Fh(syntax)p 275 1025 14 2 v 15 w(error)p 400 1025 V 14 w(info/4)-30 1151 y Fi(T)l(emplates)74 1234 y Fh(syntax)p 209 1234 V 15 w(error)p 334 1234 V 14 w(info\(?atom,)20 b(?integer,)g(?integer,)g(?atom\))-30 1317 y Fi(Description)-30 1416 y Fh(syntax)p 105 1416 V 15 w(error)p 230 1416 V 15 w(info\(FileName,)e(Line,)j(Column,)g(Error\))8 b Fm(returns)k(the)f(information)d(asso)q(ciated)j(with)f(the)g(last)-30 1466 y(syn)o(tax)k(error.)19 b Fh(Line)13 b Fm(is)h(the)g(line)f(n)o (um)o(b)q(er)i(of)e(the)h(error,)g Fh(Column)f Fm(is)h(the)g(column)f (n)o(um)o(b)q(er)h(of)f(the)i(error)g(and)e Fh(Error)-30 1516 y Fm(is)h(an)g(atom)f(explaining)f(the)j(error.)-30 1616 y Fi(Errors)p -30 1671 1890 2 v -30 1721 2 50 v -3 1706 a Fh(FileName)d Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(an)g (atom)p 915 1721 V 158 w Fh(type)p 1032 1706 14 2 v 15 w(error\(atom,)19 b(FileName\))p 1859 1721 2 50 v -30 1723 1890 2 v -30 1773 2 50 v -3 1758 a(Line)13 b Fm(is)h(neither)h(a)e (v)n(ariable)g(nor)h(an)g(in)o(teger)p 915 1773 V 215 w Fh(type)p 1032 1758 14 2 v 15 w(error\(integer,)19 b(Line\))p 1859 1773 2 50 v -30 1774 1890 2 v -30 1824 2 50 v -3 1809 a(Column)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g (an)h(in)o(teger)p 915 1824 V 172 w Fh(type)p 1032 1809 14 2 v 15 w(error\(integer,)19 b(Column\))p 1859 1824 2 50 v -30 1826 1890 2 v -30 1876 2 50 v -3 1861 a(Error)13 b Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f(atom)p 915 1876 V 224 w Fh(type)p 1032 1861 14 2 v 15 w(error\(atom,)19 b(Error\))p 1859 1876 2 50 v -30 1877 1890 2 v -30 1960 a Fi(P)o(ortabilit)o(y)-30 2060 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2217 y Fi(7.14.5)48 b Fh(last)p 231 2217 14 2 v 15 w(read)p 334 2217 V 15 w(start)p 459 2217 V 15 w(line)p 562 2217 V 14 w(column/2)-30 2344 y Fi(T)l(emplates)74 2427 y Fh(last)p 165 2427 V 15 w(read)p 268 2427 V 15 w(start)p 393 2427 V 15 w(line)p 496 2427 V 14 w(column\(?integer,)19 b(?integer\))-30 2510 y Fi(Description)-30 2609 y Fh(last)p 61 2609 V 15 w(read)p 164 2609 V 15 w(start)p 289 2609 V 15 w(line)p 392 2609 V 15 w(column\(Line,)g(Column\))14 b Fm(uni\014es)i Fh(Line)f Fm(and)g Fh(Column)g Fm(with)g(the)h(line)f (n)o(um)o(b)q(er)h(and)g(the)-30 2659 y(column)9 b(n)o(um)o(b)q(er)h (asso)q(ciated)g(with)f(the)h(start)g(of)f(the)h(last)f(read)h (predicate.)17 b(This)10 b(predicate)g(can)g(b)q(e)g(used)g(after)g (calling)-30 2709 y(one)17 b(of)f(the)h(follo)o(wing)d(predicates:)25 b Fh(read)p 660 2709 V 14 w(term/3)p Fm(,)16 b Fh(read)p 922 2709 V 15 w(term/2)p Fm(,)f Fh(read/2)p Fm(,)g Fh(read/1)h Fm(\(section)h(7.14.1,)e(page)h(92\),)-30 2759 y Fh(read)p 61 2759 V 15 w(atom/2)p Fm(,)k Fh(read)p 328 2759 V 15 w(atom/1)p Fm(,)g Fh(read)p 595 2759 V 15 w(integer/2)p Fm(,)g Fh(read)p 928 2759 V 15 w(integer/1)p Fm(,)f Fh(read)p 1260 2759 V 15 w(number/2)p Fm(,)h Fh(read)p 1571 2759 V 14 w(number/1)f Fm(\(sec-)-30 2808 y(tion)14 b(7.14.2,)d(page)j(93\)) g(or)f Fh(read)p 497 2808 V 15 w(token/2)p Fm(,)f Fh(read)p 778 2808 V 15 w(token/1)g Fm(\(section)j(7.14.3,)d(page)i(94\).)-30 2908 y Fi(Errors)p eop end %%Page: 96 98 TeXDict begin 96 97 bop -30 -45 a Fm(96)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(Line)f Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(an)g(in)o(teger)p 915 125 V 215 w Fh(type)p 1032 110 14 2 v 15 w(error\(integer,)19 b(Line\))p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(Column)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(in)o(teger)p 915 176 V 172 w Fh(type)p 1032 161 14 2 v 15 w(error\(integer,)19 b(Column\))p 1859 176 2 50 v -30 178 1890 2 v -30 261 a Fi(P)o(ortabilit)o(y)-30 360 y Fm(GNU)14 b(Prolog)f(predicate.)-30 518 y Fi(7.14.6)48 b Fh(write)p 253 518 14 2 v 15 w(term/3)p Fi(,)15 b Fh(write)p 538 518 V 14 w(term/2)p Fi(,)g Fh(write/2)p Fi(,)g Fh(write/1)p Fi(,)g Fh(writeq/2)p Fi(,)f Fh(writeq/1)p Fi(,)140 568 y Fh(write)p 253 568 V 15 w(canonical/2)p Fi(,)g Fh(write)p 647 568 V 14 w(canonical/1)p Fi(,)g Fh(display/2)p Fi(,)h Fh(display/1)p Fi(,)f Fh(print/2)p Fi(,)140 618 y Fh(print/1)-30 744 y Fi(T)l(emplates)74 827 y Fh(write)p 187 827 V 15 w(term\(+stream)p 466 827 V 13 w(or)p 523 827 V 15 w(alias,)21 b(?term,)f(+write)p 975 827 V 15 w(option)p 1122 827 V 14 w(list\))74 877 y(write)p 187 877 V 15 w(term\(?term,)f(+write)p 595 877 V 15 w(option)p 742 877 V 14 w(list\))74 927 y(write\(+stream)p 363 927 V 13 w(or)p 420 927 V 16 w(alias,)h(?term\))74 977 y(write\(?term\))74 1026 y(writeq\(+stream)p 385 1026 V 13 w(or)p 442 1026 V 15 w(alias,)h(?term\))74 1076 y(writeq\(?term\))74 1126 y(write)p 187 1126 V 15 w(canonical\(+stream)p 575 1126 V 12 w(or)p 632 1126 V 15 w(alias,)g(?term\))74 1176 y(write)p 187 1176 V 15 w(canonical\(?term\))74 1226 y(display\(+stream)p 407 1226 V 13 w(or)p 464 1226 V 15 w(alias,)g(?term\))74 1276 y(display\(?term\))74 1325 y(print\(+stream)p 363 1325 V 13 w(or)p 420 1325 V 16 w(alias,)f(?term\))74 1375 y(print\(?term\))-30 1458 y Fi(Description)-30 1558 y Fh(write)p 83 1558 V 15 w(term\(SorA,)g(Term,)h(Options\))11 b Fm(writes)j Fh(Term)e Fm(to)i(the)f(stream)h(asso)q(ciated)g(with)f (the)h(stream-term)g(or)f(alias)-30 1608 y Fh(SorA)g Fm(according)h(to)g(the)h(options)e(giv)o(en)h(b)o(y)g Fh(Options)p Fm(.)-30 1707 y Fi(W)l(rite)24 b(options)p Fm(:)29 b Fh(Options)19 b Fm(is)h(a)h(list)f(of)f(write)i(options.)38 b(If)20 b(this)g(list)g(con)o(tains)h(con)o(tradictory)f(options,)i (the)-30 1757 y(righ)o(tmost)14 b(option)f(is)h(the)g(one)g(whic)o(h)g (applies.)k(P)o(ossible)c(options)f(are:)33 1840 y Fg(\017)20 b Fh(quoted\(true)p Fm(/)p Fh(false\))o Fm(:)e(if)f Fh(true)d Fm(eac)o(h)i(atom)e(and)h(functor)g(is)g(quoted)g(if)f(this)h(w)o(ould) f(b)q(e)i(necessary)h(for)e(the)74 1890 y(term)d(to)f(b)q(e)h(input)f (b)o(y)h Fh(read)p 528 1890 V 14 w(term/3)p Fm(.)k(If)e Fh(false)d Fm(no)g(extra)g(quotes)h(are)g(written.)17 b(The)12 b(default)f(v)n(alue)g(is)g Fh(false)p Fm(.)33 1973 y Fg(\017)20 b Fh(ignore)p 209 1973 V 15 w(ops\(true)p Fm(/)p Fh(false\))p Fm(:)d(if)h Fh(true)c Fm(eac)o(h)i(comp)q(ound)f (term)h(is)f(output)h(in)e(functional)h(notation)f(\(neither)74 2023 y(op)q(erator)k(notation)e(nor)g(list)h(notation)f(is)g(used\).)28 b(If)20 b Fh(false)15 b Fm(op)q(erator)j(and)e(list)h(notations)f(are)h (used.)28 b(The)74 2073 y(default)14 b(v)n(alue)f(is)h Fh(false)p Fm(.)33 2156 y Fg(\017)20 b Fh(numbervars\(true)p Fm(/)p Fh(fa)o(lse\))p Fm(:)14 b(if)i Fh(true)d Fm(a)g(term)h(of)f(the) h(form)f Fh('$VAR'\(N\))p Fm(,)e(where)k Fh(N)e Fm(is)h(an)f(in)o (teger,)h(is)f(output)74 2205 y(as)j(a)f(v)n(ariable)g(name)g(\(see)i (b)q(elo)o(w\).)24 b(If)18 b Fh(false)d Fm(suc)o(h)h(a)g(term)g(is)f (output)h(normally)e(\(according)i(to)f(the)i(other)74 2255 y(options\).)h(The)c(default)g(v)n(alue)f(is)h Fh(true)p Fm(.)33 2338 y Fg(\017)20 b Fh(namevars\(true)p Fm(/)p Fh(fals)o(e\))p Fm(:)15 b(if)g Fh(true)d Fm(a)h(term)g(of)g(the)g(form) f Fh('$VARNAME'\(Name\))p Fm(,)e(where)k Fh(Name)e Fm(is)h(an)f(atom,)g (is)74 2388 y(output)j(as)f(a)g(v)n(ariable)f(name)h(\(see)i(b)q(elo)o (w\).)i(If)g Fh(false)13 b Fm(suc)o(h)i(a)f(term)g(is)g(output)h (normally)d(\(according)j(to)f(the)74 2438 y(other)h(options\).)j(The)c (default)f(v)n(alue)h(is)f Fh(true)p Fm(.)33 2521 y Fg(\017)20 b Fh(space)p 187 2521 V 15 w(args\(true)p Fm(/)p Fh(false\))p Fm(:)13 b(if)h Fh(true)c Fm(an)h(extra)h(space)g(c)o(haracter)g(is)f (emitted)h(after)f(eac)o(h)h(comma)e(separating)74 2571 y(the)16 b(argumen)o(ts)g(of)f(a)g(comp)q(ound)g(term)h(in)f (functional)f(notation)h(or)g(of)g(a)g(list.)22 b(If)d Fh(false)14 b Fm(no)h(extra)h(space)g(is)74 2620 y(emitted.)j(The)14 b(default)f(v)n(alue)h(is)f Fh(false)p Fm(.)33 2704 y Fg(\017)20 b Fh(portrayed\(true)p Fm(/)p Fh(fal)o(se\))p Fm(:)h(if)f Fh(true)c Fm(and)h(if)g(there)h(exists)g(a)f(predicate)h Fh(portray/1)p Fm(,)e Fh(write)p 1629 2704 V 15 w(term/3)g Fm(acts)74 2753 y(as)h(follo)o(ws:)22 b(if)d Fh(Term)d Fm(is)g(a)g(v)n(ariable)g(it)g(is)h(simply)e(written.)27 b(If)19 b Fh(Term)d Fm(is)g(non-v)n(ariable)g(then)h(it)f(is)h(passed)g (to)74 2803 y Fh(portray/1)p Fm(.)e(If)c(this)f(succeeds)k(then)d(it)f (is)h(assumed)g(that)g Fh(Term)f Fm(has)h(b)q(een)g(output.)18 b(Otherwise)12 b Fh(write)p 1718 2803 V 14 w(term/3)74 2853 y Fm(outputs)23 b(the)g(principal)e(functor)i(of)h Fh(Term)e Fm(\()p Fh(Term)f Fm(itself)h(if)f(it)h(is)g(atomic\))g (according)g(to)g(other)h(options)74 2903 y(and)c(recursiv)o(ely)h (calls)f Fh(portray/1)e Fm(on)i(the)g(comp)q(onen)o(ts)h(of)i Fh(Term)c Fm(\(if)g(it)h(is)g(a)g(comp)q(ound)g(term\).)34 b(With)p eop end %%Page: 97 99 TeXDict begin 97 98 bop -30 -45 a Fm(7.14)41 b(T)m(erm)13 b(input/output)1384 b(97)p -30 -27 1890 4 v 74 115 a Fh(ignore)p 209 115 14 2 v 15 w(ops\(false\))10 b Fm(a)j(list)f(is)g (\014rst)i(passed)f(to)g Fh(portray/1)d Fm(and)j(only)f(if)f(this)i (call)f(fails)f(eac)o(h)i(elemen)o(t)h(of)e(the)74 165 y(list)i(is)f(passed)i(to)f Fh(portray/1)e Fm(\(th)o(us)i(ev)o(ery)h (sub-list)f(is)g(not)f(passed\).)20 b(The)14 b(default)f(v)n(alue)h(is) f Fh(false)p Fm(.)33 248 y Fg(\017)20 b Fh(max)p 143 248 V 15 w(depth\(N\))p Fm(:)c(con)o(trols)h(the)h(depth)g(of)f(output) h(for)f(comp)q(ound)g(terms.)30 b Fh(N)17 b Fm(is)g(an)g(in)o(teger)h (sp)q(ecifying)g(the)74 298 y(depth.)h(The)12 b(output)h(of)f(a)g(term) h(whose)g(depth)g(is)f(greater)h(than)g Fh(N)f Fm(giv)o(es)g(rise)h(to) f(the)h(output)g(of)f Fh(...)17 b Fm(\(3)12 b(dots\).)74 347 y(By)i(default)g(there)h(is)f(no)g(depth)g(limit.)33 430 y Fg(\017)20 b Fh(priority\(N\))p Fm(:)9 b(sp)q(eci\014es)14 b(the)e(starting)f(priorit)o(y)g(to)h(output)g(the)g(term.)17 b(This)12 b(option)f(con)o(trols)h(if)i Fh(Term)c Fm(should)74 480 y(b)q(e)15 b(enclosed)g(in)e(brac)o(k)o(ets.)19 b Fh(N)14 b Fm(is)g(a)f(p)q(ositiv)o(e)h(in)o(teger)g Fg(\024)g Fm(1200.)j(By)d(default)g Fh(N)g Fm(=)g(1200.)-30 563 y Fi(V)l(ariable)i(n)o(um)o(b)q(ering)q Fm(:)f(when)g(the)f Fh(numbervars\(true\))c Fm(option)j(is)h(passed)h(to)f Fh(write)p 1422 563 V 14 w(term/3)f Fm(an)o(y)g(term)h(of)g(the)-30 613 y(form)f Fh('$VAR'\(N\))f Fm(where)i Fh(N)g Fm(is)f(an)g(in)o (teger)h(is)g(output)f(as)h(a)f(v)n(ariable)f(name)i(consisting)f(of)g (a)g(capital)g(letter)h(p)q(ossibly)-30 663 y(follo)o(w)o(ed)d(b)o(y)h (an)g(in)o(teger.)18 b(The)12 b(capital)g(letter)h(is)f(the)h Fh(\(I+1\))p Fe(th)h Fm(letter)f(of)e(the)i(alphab)q(et)f(and)g(the)h (in)o(teger)g(is)f Fh(J)p Fm(,)f(where)-30 713 y Fh(I)22 b(=)g(N)f(mod)g(26)14 b Fm(and)g Fh(J)21 b(=)h(N)f(//)h(26)p Fm(.)17 b(The)e(in)o(teger)f Fh(J)g Fm(is)f(omitted)h(if)f(it)g(is)h (zero.)19 b(F)m(or)13 b(example:)74 793 y Fh('$VAR'\(0\))38 b Fm(is)14 b(written)h(as)f Fh(A)74 843 y('$VAR'\(1\))38 b Fm(is)14 b(written)h(as)f Fh(B)74 893 y(...)74 942 y('$VAR'\(25\))i Fm(is)e(written)h(as)f Fh(Z)74 992 y('$VAR'\(26\))i Fm(is)e(written)h(as)f Fh(A1)74 1042 y('$VAR'\(27\))i Fm(is)e(written)h(as)f Fh(B1)-30 1123 y Fi(V)l(ariable)k(naming)q Fm(:)g(when)e(the)f Fh(namevars\(true\))d Fm(option)i(is)h(passed)h(to) e Fh(write)p 1318 1123 V 15 w(term/3)g Fm(an)o(y)g(term)h(of)f(the)i (form)-30 1173 y Fh('$VARNAME'\(Name\))9 b Fm(where)k Fh(Name)d Fm(is)i(an)f(atom)g(is)g(output)h(as)g(a)f(v)n(ariable)g (name)g(consisting)h(of)f(the)h(c)o(haracters)i Fh(Name)p Fm(.)-30 1223 y(F)m(or)g(example:)k Fh('$VARNAME'\('A'\))10 b Fm(is)k(written)h(as)f Fh(A)f Fm(\(ev)o(en)i(in)e(the)i(presence)h (of)d(the)i Fh(quoted\(true\))c Fm(option\).)-30 1322 y Fh(write\(SorA,)20 b(Term\))13 b Fm(is)h(equiv)n(alen)o(t)f(to)g Fh(write)p 757 1322 V 15 w(term\(SorA,)20 b(Term,)h([]\))p Fm(.)-30 1422 y Fh(writeq\(SorA,)f(Term\))13 b Fm(is)g(equiv)n(alen)o (t)h(to)f Fh(write)p 779 1422 V 15 w(term\(SorA,)20 b(Term,)g ([quoted\(true\)]\))p Fm(.)-30 1522 y Fh(write)p 83 1522 V 15 w(canonical\(SorA,)f(Term\))13 b Fm(is)g(equiv)n(alen)o(t)h(to)f Fh(write)p 969 1522 V 15 w(term\(SorA,)20 b(Term,)g([quoted\(true\),) -30 1571 y(ignore)p 105 1571 V 15 w(ops\(true\),)g(numbervars\(false)o (\)]\))p Fm(.)-30 1671 y Fh(display\(SorA,)g(Term\))12 b Fm(is)i(equiv)n(alen)o(t)f(to)h Fh(write)p 801 1671 V 15 w(term\(SorA,)19 b(Term,)i([ignore)p 1340 1671 V 14 w(ops\(true\),)-30 1721 y(numbervars\(false\)]\))p Fm(.)-30 1821 y Fh(print\(SorA,)f(Term\))13 b Fm(is)h(equiv)n(alen)o(t) f(to)g Fh(write)p 757 1821 V 15 w(term\(SorA,)20 b(Term,)h ([numbervars\(fal)o(se\),)-30 1870 y(portrayed\(true\)]\))p Fm(.)-30 1970 y Fh(write)p 83 1970 V 15 w(term/2)p Fm(,)14 b Fh(write/1)p Fm(,)g Fh(writeq/1)p Fm(,)g Fh(write)p 748 1970 V 15 w(canonical/1)p Fm(,)f Fh(display/1)g Fm(and)j Fh(print/1)e Fm(apply)g(to)i(the)g(curren)o(t)-30 2020 y(output)f(stream.)-30 2119 y Fi(Errors)p -30 2175 1890 2 v -30 2225 2 50 v -3 2210 a Fh(SorA)e Fm(is)h(a)f(v)n(ariable)p 915 2225 V 624 w Fh(instantiation)p 1230 2210 14 2 v 13 w(error)p 1859 2225 2 50 v -30 2227 1890 2 v -30 2326 2 100 v -3 2261 a(Options)f Fm(is)i(a)g(partial)f(list)g(or)h(a)f(list) h(with)f(an)h(elemen)o(t)-3 2311 y Fh(E)g Fm(whic)o(h)f(is)h(a)g(v)n (ariable)p 915 2326 V 941 2261 a Fh(instantiation)p 1230 2261 14 2 v 13 w(error)p 1859 2326 2 100 v -30 2328 1890 2 v -30 2378 2 50 v -3 2363 a(Options)e Fm(is)i(neither)h(a)f(partial)e (list)i(nor)g(a)f(list)p 915 2378 V 193 w Fh(type)p 1032 2363 14 2 v 15 w(error\(list,)19 b(Options\))p 1859 2378 2 50 v -30 2379 1890 2 v -30 2479 2 100 v -3 2414 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(stream-term)i(or)-3 2464 y(alias)p 915 2479 V 941 2414 a Fh(domain)p 1076 2414 14 2 v 15 w(error\(stream)p 1355 2414 V 13 w(or)p 1412 2414 V 15 w(alias,)21 b(SorA\))p 1859 2479 2 100 v -30 2481 1890 2 v -30 2580 2 100 v -3 2515 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Options)f Fm(list)g(is)h (neither)h(a)-3 2565 y(v)n(ariable)e(nor)h(a)f(v)n(alid)g(write-option) p 915 2580 V 941 2515 a Fh(domain)p 1076 2515 14 2 v 15 w(error\(write)p 1333 2515 V 13 w(option,)20 b(E\))p 1859 2580 2 100 v -30 2582 1890 2 v -30 2632 2 50 v -3 2617 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f(op)q(en)i (stream)p 915 2632 V 155 w Fh(existence)p 1142 2617 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 2632 2 50 v -30 2633 1890 2 v -30 2683 2 50 v -3 2668 a(SorA)13 b Fm(is)h(an)f(input)h (stream)p 915 2683 V 511 w Fh(permission)p 1164 2668 14 2 v 14 w(error\(output,)19 b(stream,)h(SorA\))p 1859 2683 2 50 v -30 2685 1890 2 v -30 2784 2 100 v -3 2720 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(binary)f(stream)p 915 2784 V 222 w Fh(permission)p 1164 2720 14 2 v 14 w(error\(output,)19 b(binary)p 1615 2720 V 14 w(stream,)941 2769 y(SorA\))p 1859 2784 2 100 v -30 2786 1890 2 v -30 2869 a Fi(P)o(ortabilit)o(y)p eop end %%Page: 98 100 TeXDict begin 98 99 bop -30 -45 a Fm(98)1117 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a(ISO)22 b(predicates)g(except)h Fh(display/1-2)18 b Fm(and)j Fh(print/1-2)e Fm(that)i(are)h(GNU)f(Prolog)f(predicates.)41 b Fh(namevars/1)p Fm(,)-30 165 y Fh(space)p 83 165 14 2 v 15 w(args/1)p Fm(,)12 b Fh(portrayed/1)p Fm(,)f Fh(max)p 585 165 V 15 w(depth/1)i Fm(and)h Fh(priority/1)d Fm(options)j(are)g (GNU)g(Prolog)f(extensions.)-30 322 y Fi(7.14.7)48 b Fh(format/3)p Fi(,)15 b Fh(format/2)-30 449 y Fi(T)l(emplates)74 532 y Fh(format\(+stream)p 385 532 V 13 w(or)p 442 532 V 15 w(alias,)21 b(+character)p 830 532 V 13 w(code)p 931 532 V 15 w(list)p 1034 532 V 15 w(or)p 1093 532 V 15 w(atom,)g(+list\))74 582 y(format\(+character)p 450 582 V 12 w(code)p 551 582 V 15 w(list)p 654 582 V 15 w(or)p 713 582 V 15 w(atom,)g(+list\))-30 665 y Fi(Description)-30 764 y Fh(format\(SorA,)f(Format,)g(Arguments\))12 b Fm(writes)j(the)g Fh(Format)e Fm(string)i(replacing)f(eac)o(h)g(format)g(con)o(trol)g (sequence)i Fh(F)-30 814 y Fm(b)o(y)c(the)h(corresp)q(onding)g(elemen)o (t)g(of)h Fh(Arguments)d Fm(\(formatted)h(according)g(to)g Fh(F)p Fm(\))g(to)g(the)g(stream)h(asso)q(ciated)g(with)f(the)-30 864 y(stream-term)j(or)f(alias)f Fh(SorA)p Fm(.)-30 964 y Fi(F)l(ormat)j(con)o(trol)e(sequences)p Fm(:)j(the)e(general)f (format)f(of)g(a)h(con)o(trol)f(sequence)k(is)c Fh('~NC')p Fm(.)g(The)h(c)o(haracter)h Fh(C)f Fm(deter-)-30 1013 y(mines)h(the)g(t)o(yp)q(e)g(of)f(the)i(con)o(trol)e(sequence.)22 b Fh(N)15 b Fm(is)f(an)h(optional)e(n)o(umeric)i(argumen)o(t.)20 b(An)14 b(alternativ)o(e)h(form)f(of)j Fh(N)d Fm(is)-30 1063 y Fh('*')p Fm(.)26 b Fh('*')15 b Fm(implies)h(that)g(the)h(next)g (argumen)o(t)g Fh(Arg)f Fm(in)g Fh(Arguments)e Fm(should)i(b)q(e)i (used)f(as)f(a)h(n)o(umeric)f(argumen)o(t)h(in)-30 1113 y(the)e(con)o(trol)e(sequence.)20 b(The)14 b(use)h(of)e(C)g Fh(printf\(\))f Fm(formatting)g(sequence)k(\(b)q(eginning)d(b)o(y)h (the)g(c)o(haracter)h Fh(\045)p Fm(\))e(is)h(also)-30 1163 y(allo)o(w)o(ed.)j(The)e(follo)o(wing)c(con)o(trol)i(sequences)k (are)d(a)o(v)n(ailable:)p -30 1227 1887 2 v -30 1326 2 100 v 14 1261 a(F)m(ormat)1 1311 y(sequence)p 187 1326 V 280 1261 a(t)o(yp)q(e)g(of)g(the)293 1311 y(argumen)o(t)p 569 1326 V 596 1261 a(Description)p 1855 1326 V -30 1328 1887 2 v -30 1338 V -30 1487 2 150 v 47 1373 a Fh(~Na)p 187 1487 V 220 w Fm(atom)p 569 1487 V 170 w(prin)o(t)h(the)g(atom)f (without)h(quoting.)20 b Fh(N)14 b Fm(is)h(minimal)d(n)o(um)o(b)q(er)j (of)f(c)o(haracters)596 1422 y(to)i(prin)o(t)h(using)f(spaces)i(on)e (the)h(rigth)g(if)e(needed)j(\(default:)23 b(the)17 b(length)g(of)596 1472 y(the)e(atom\))p 1855 1487 V -30 1489 1887 2 v -30 1589 2 100 v 47 1524 a Fh(~Nc)p 187 1589 V 135 w Fm(c)o(haracter)g(co)q (de)p 569 1589 V 86 w(prin)o(t)k(the)h(c)o(haracter)h(asso)q(ciated)f (with)f(the)g(co)q(de.)35 b Fh(N)19 b Fm(is)g(the)h(n)o(um)o(b)q(er)g (of)596 1574 y(times)14 b(to)g(prin)o(t)f(the)i(c)o(haracter)g (\(default:)j(1\))p 1855 1589 V -30 1590 1887 2 v -30 1740 2 150 v 58 1625 a Fh(~Nf)3 1675 y(~Ne)k(~NE)3 1725 y(~Ng)g(~NG)p 187 1740 V 239 1625 a Fm(\015oat)13 b(expression)p 569 1740 V 78 w(pass)26 b(the)g(argumen)o(t)f Fh(Arg)g Fm(and)g Fh(N)g Fm(to)g(the)h(C)f Fh(printf\(\))f Fm(function)h(as:)596 1675 y(if)c Fh(N)c Fm(is)h(not)g(sp)q(eci\014ed)i Fh (printf\("\045f",Arg\))15 b Fm(else)j Fh(printf\("\045.Nf",Arg\))p Fm(.)596 1725 y(Similarly)12 b(for)h Fh(~Ne)p Fm(,)g Fh(~NE)p Fm(,)g Fh(~Ng)g Fm(and)h Fh(~NG)p 1855 1740 V -30 1741 1887 2 v -30 1841 2 100 v 47 1776 a(~Nd)p 187 1841 V 104 w Fm(in)o(teger)h(expression)p 569 1841 V 56 w(prin)o(t)c(the)h(argumen)o(t.)17 b Fh(N)11 b Fm(is)g(the)h(n)o (um)o(b)q(er)f(of)g(digits)f(after)i(the)g(decimal)e(p)q(oin)o(t.)596 1826 y(If)17 b Fh(N)c Fm(is)h(0)g(no)f(decimal)h(p)q(oin)o(t)f(is)h (prin)o(ted)g(\(default:)k(0\))p 1855 1841 V -30 1843 1887 2 v -30 1942 2 100 v 47 1877 a Fh(~ND)p 187 1942 V 104 w Fm(in)o(teger)d(expression)p 569 1942 V 56 w(iden)o(tical)g(to) g Fh(~Nd)g Fm(except)i(that)f Fh(',')f Fm(separates)j(groups)d(of)h (three)g(digits)f(to)596 1927 y(the)g(left)e(of)g(the)i(decimal)e(p)q (oin)o(t)p 1855 1942 V -30 1944 1887 2 v -30 2043 2 100 v 47 1979 a Fh(~Nr)p 187 2043 V 104 w Fm(in)o(teger)i(expression)p 569 2043 V 56 w(prin)o(t)d(the)g(argumen)o(t)g(according)g(to)g(the)g (radix)f Fh(N)p Fm(.)g(2)h Fg(\024)g Fh(N)g Fg(\024)g Fm(36)f(\(default:)17 b(8\).)596 2029 y(The)d(letters)i Fh(a-z)d Fm(denote)i(digits)e Fb(>)h Fm(9)p 1855 2043 V -30 2045 1887 2 v -30 2095 2 50 v 47 2080 a Fh(~NR)p 187 2095 V 104 w Fm(in)o(teger)h(expression)p 569 2095 V 56 w(iden)o(tical)e(to)h Fh(~Nr)f Fm(except)i(that)f(the)h(letters)g Fh(A-Z)e Fm(denote)i(digits)e Fb(>)h Fm(9)p 1855 2095 V -30 2097 1887 2 v -30 2146 2 50 v 47 2131 a Fh(~Ns)p 187 2146 V 101 w Fm(c)o(haracter)g(co)q(de)g(list)p 569 2146 V 51 w(prin)o(t)g(exactly)g Fh(N)g Fm(c)o(haracters)i(\(default:)h (the)e(length)f(of)f(the)i(list\))p 1855 2146 V -30 2148 1887 2 v -30 2198 2 50 v 47 2183 a Fh(~NS)p 187 2198 V 148 w Fm(c)o(haracter)g(list)p 569 2198 V 98 w(prin)o(t)f(exactly)g Fh(N)g Fm(c)o(haracters)i(\(default:)h(the)e(length)f(of)f(the)i (list\))p 1855 2198 V -30 2200 1887 2 v -30 2249 2 50 v 58 2234 a Fh(~i)p 187 2249 V 234 w Fm(term)p 569 2249 V 175 w(ignore)f(the)g(curren)o(t)i(argumen)o(t)p 1855 2249 V -30 2251 1887 2 v -30 2301 2 50 v 58 2286 a Fh(~k)p 187 2301 V 234 w Fm(term)p 569 2301 V 175 w(pass)e(the)h(argumen)o(t)f (to)f Fh(write)p 1107 2286 14 2 v 15 w(canonical/1)f Fm(\(section)i(7.14.6,)e(page)i(96\))p 1855 2301 2 50 v -30 2303 1887 2 v -30 2352 2 50 v 58 2337 a Fh(~p)p 187 2352 V 234 w Fm(term)p 569 2352 V 175 w(pass)g(the)h(argumen)o(t)f (to)f Fh(print/1)g Fm(\(section)i(7.14.6,)c(page)j(96\))p 1855 2352 V -30 2354 1887 2 v -30 2404 2 50 v 58 2389 a Fh(~q)p 187 2404 V 234 w Fm(term)p 569 2404 V 175 w(pass)g(the)h (argumen)o(t)f(to)f Fh(writeq/1)g Fm(\(section)h(7.14.6,)e(page)i(96\)) p 1855 2404 V -30 2405 1887 2 v -30 2455 2 50 v 58 2440 a Fh(~w)p 187 2455 V 234 w Fm(term)p 569 2455 V 175 w(pass)g(the)h (argumen)o(t)f(to)f Fh(write/1)g Fm(\(section)i(7.14.6,)c(page)j(96\))p 1855 2455 V -30 2457 1887 2 v -30 2507 2 50 v 58 2492 a Fh(~~)p 187 2507 V 235 w Fm(none)p 569 2507 V 174 w(prin)o(t)g(the)g (c)o(haracter)i Fh('~')p 1855 2507 V -30 2508 1887 2 v -30 2558 2 50 v 47 2543 a(~Nn)p 187 2558 V 224 w Fm(none)p 569 2558 V 174 w(prin)o(t)e Fh(N)f Fm(new-line)h(c)o(haracters)i (\(default:)i(1\))p 1855 2558 V -30 2560 1887 2 v -30 2610 2 50 v 58 2595 a Fh(~N)p 187 2610 V 235 w Fm(none)p 569 2610 V 174 w(prin)o(t)c(a)f(new-line)h(c)o(haracter)h(if)e(not)h (at)g(the)g(b)q(eginning)g(of)f(a)h(line)p 1855 2610 V -30 2611 1887 2 v -30 2661 2 50 v 58 2646 a Fh(~?)p 187 2661 V 231 w Fm(atom)p 569 2661 V 170 w(use)h(the)f(argumen)o(t)g (as)g(a)g(nested)h(format)e(string)p 1855 2661 V -30 2663 1887 2 v -30 2762 2 100 v 58 2698 a Fh(\045F)p 187 2762 V 131 w Fm(atom,)g(in)o(teger)h(or)239 2748 y(\015oat)f (expression)p 569 2762 V 596 2698 a(in)o(terface)24 b(to)g(the)g(C)f (function)h Fh(printf\(3\))d Fm(for)j(outputting)f(atoms)g(\(C)596 2748 y(string\),)14 b(in)o(tegers)g(and)g(\015oating)f(p)q(oin)o(t)g(n) o(um)o(b)q(ers.)19 b Fh(*)14 b Fm(are)g(also)f(allo)o(w)o(ed.)p 1855 2762 V -30 2764 1887 2 v -30 2847 a Fh(format/2)g Fm(applies)g(to)h(the)g(curren)o(t)i(output)e(stream.)p eop end %%Page: 99 101 TeXDict begin 99 100 bop -30 -45 a Fm(7.14)41 b(T)m(erm)13 b(input/output)1384 b(99)p -30 -27 1890 4 v -30 115 a Fi(Errors)p -30 171 1890 2 v -30 220 2 50 v -3 205 a Fh(SorA)13 b Fm(is)h(a)f(v)n(ariable)p 915 220 V 624 w Fh(instantiation)p 1230 205 14 2 v 13 w(error)p 1859 220 2 50 v -30 222 1890 2 v -30 322 2 100 v -3 257 a(Format)g Fm(is)g(a)h(partial)f(list)g(or)h(a)g(list)f(with)h(an)f(elemen)o(t)-3 307 y Fh(E)h Fm(whic)o(h)f(is)h(a)g(v)n(ariable)p 915 322 V 941 257 a Fh(instantiation)p 1230 257 14 2 v 13 w(error)p 1859 322 2 100 v -30 323 1890 2 v -30 373 2 50 v -3 358 a(Arguments)e Fm(is)i(a)f(partial)g(list)p 915 373 V 468 w Fh(instantiation)p 1230 358 14 2 v 13 w(error)p 1859 373 2 50 v -30 375 1890 2 v -30 474 2 100 v -3 410 a(Format)g Fm(is)g(neither)i(a)f(partial)f(list)g(nor)h(a) g(list)f(or)h(an)-3 459 y(atom)p 915 474 V 941 410 a Fh(type)p 1032 410 14 2 v 15 w(error\(list,)19 b(Format\))p 1859 474 2 100 v -30 476 1890 2 v -30 526 2 50 v -3 511 a(Arguments)12 b Fm(is)i(neither)h(a)e(partial)g(list)g(nor)h(a)g(list) p 915 526 V 149 w Fh(type)p 1032 511 14 2 v 15 w(error\(list,)19 b(Arguments\))p 1859 526 2 50 v -30 528 1890 2 v -30 627 2 100 v -3 562 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Format)f Fm(list)g(is)h(neither)h(a)-3 612 y(v)n(ariable)e(nor)h(a)f (c)o(haracter)j(co)q(de)p 915 627 V 941 562 a Fh(representation)p 1252 562 14 2 v 13 w(error\(character)p 1594 562 V 12 w(code,)21 b(E\))p 1859 627 2 100 v -30 629 1890 2 v -30 728 2 100 v -3 664 a(SorA)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g (nor)h(a)f(stream-term)i(or)-3 713 y(alias)p 915 728 V 941 664 a Fh(domain)p 1076 664 14 2 v 15 w(error\(stream)p 1355 664 V 13 w(or)p 1412 664 V 15 w(alias,)21 b(SorA\))p 1859 728 2 100 v -30 730 1890 2 v -30 830 2 100 v -3 765 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(F)m(ormat)g(is)h(not)f(a)h (v)n(alid)e(format)-3 815 y(con)o(trol)i(sequence)p 915 830 V 941 765 a Fh(domain)p 1076 765 14 2 v 15 w(error\(format)p 1355 765 V 13 w(control)p 1522 765 V 14 w(sequence,)20 b(E\))p 1859 830 2 100 v -30 831 1890 2 v -30 931 2 100 v -3 866 a Fm(the)15 b Fh(Arguments)d Fm(list)h(do)q(es)i(not)e(con)o (tain)h(su\016cien)o(t)-3 916 y(elemen)o(ts)p 915 931 V 941 866 a Fh(domain)p 1076 866 14 2 v 15 w(error\(non)p 1289 866 V 13 w(empty)p 1412 866 V 15 w(list,)21 b([]\))p 1859 931 2 100 v -30 933 1890 2 v -30 1032 2 100 v -3 968 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Arguments)e Fm(list)i(is)g(a)f(v)n(ariable)-3 1017 y(while)g(a)h(non-v)n(ariable)f (term)h(w)o(as)g(exp)q(ected)p 915 1032 V 941 968 a Fh(instantiation)p 1230 968 14 2 v 13 w(error)p 1859 1032 2 100 v -30 1034 1890 2 v -30 1134 2 100 v -3 1069 a Fm(an)g(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Arguments)e Fm(list)i(is)g(neither)-3 1119 y(v)n(ariable)d(nor)i(an)f(atom)g(while)f(an)i(atom)e(w)o(as)h (exp)q(ected)p 915 1134 V 941 1069 a Fh(type)p 1032 1069 14 2 v 15 w(error\(atom,)19 b(E\))p 1859 1134 2 100 v -30 1135 1890 2 v -30 1285 2 150 v -3 1170 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Arguments)e Fm(cannot)i(b)q(e)-3 1220 y(ev)n(aluated)g(as)g(an)f(arithmetic)h(expression)h(while)f(an)-3 1270 y(in)o(teger)g(or)g(a)g(\015oating)f(p)q(oin)o(t)g(n)o(um)o(b)q (er)h(w)o(as)g(exp)q(ected)p 915 1285 V 941 1170 a(an)g(arithmetic)f (error)i(\(section)g(7.6.1,)d(page)i(57\))p 1859 1285 V -30 1286 1890 2 v -30 1436 2 150 v -3 1321 a(an)g(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Arguments)e Fm(list)i(is)g(neither)-3 1371 y(v)n(ariable)f(nor)h(c)o(haracter)h(co)q(de)g(while)e(a)h(c)o (haracter)-3 1421 y(co)q(de)h(w)o(as)f(exp)q(ected)p 915 1436 V 941 1321 a Fh(representation)p 1252 1321 14 2 v 13 w(error\(character)p 1594 1321 V 12 w(code,)21 b(E\))p 1859 1436 2 150 v -30 1437 1890 2 v -30 1487 2 50 v -3 1472 a(SorA)13 b Fm(is)h(not)g(asso)q(ciated)g(with)g(an)f (op)q(en)i(stream)p 915 1487 V 155 w Fh(existence)p 1142 1472 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 1487 2 50 v -30 1489 1890 2 v -30 1539 2 50 v -3 1524 a(SorA)13 b Fm(is)h(an)f(input)h(stream)p 915 1539 V 511 w Fh(permission)p 1164 1524 14 2 v 14 w(error\(output,)19 b(stream,)h(SorA\))p 1859 1539 2 50 v -30 1540 1890 2 v -30 1640 2 100 v -3 1575 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g(binary)f(stream)p 915 1640 V 222 w Fh(permission)p 1164 1575 14 2 v 14 w(error\(output,)19 b(binary)p 1615 1575 V 14 w(stream,)941 1625 y(SorA\))p 1859 1640 2 100 v -30 1642 1890 2 v -30 1724 a Fi(P)o(ortabilit)o(y)-30 1824 y Fm(GNU)14 b(Prolog)f (predicates.)-30 1982 y Fi(7.14.8)48 b Fh(portray)p 297 1982 14 2 v 14 w(clause/2)p Fi(,)15 b Fh(portray)p 669 1982 V 14 w(clause/1)-30 2108 y Fi(T)l(emplates)74 2191 y Fh(portray)p 231 2191 V 14 w(clause\(+stream)p 553 2191 V 13 w(or)p 610 2191 V 16 w(alias,)20 b(+clause\))74 2241 y(portray)p 231 2241 V 14 w(clause\(+clause\))-30 2324 y Fi(Description)-30 2424 y Fh(portray)p 127 2424 V 15 w(clause\(SorA,)f(Clause\))d Fm(prett)o(y)j(prin)o(ts)f Fh(Clause)e Fm(to)i(the)h(stream)f(asso)q(ciated)g(with)g(the)g (stream-term)-30 2474 y(or)j(alias)f Fh(SorA)p Fm(.)g Fh(portray)p 407 2474 V 14 w(clause/2)f Fm(uses)k(the)e(v)n(ariable)f (binding)g(predicates)j Fh(name)p 1402 2474 V 14 w(singleton)p 1614 2474 V 14 w(vars/1)d Fm(\(sec-)-30 2523 y(tion)d(7.5.1,)e(page)i (55\))g(and)g Fh(numbervars/1)d Fm(\(section)k(7.5.3,)d(page)i(56\).)27 b(This)17 b(predicate)h(is)f(used)h(b)o(y)f Fh(listing/1)-30 2573 y Fm(\(section)e(7.23.3,)d(page)i(138\).)-30 2673 y Fh(portray)p 127 2673 V 15 w(clause/1)e Fm(applies)h(to)h(the)h (curren)o(t)g(output)f(stream.)-30 2772 y Fi(Errors)p eop end %%Page: 100 102 TeXDict begin 100 101 bop -30 -45 a Fm(100)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(Clause)f Fm(is)g(a)h(v)n(ariable)p 915 125 V 580 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(Clause)f Fm(is)g(neither)i(a)f(v)n (ariable)f(nor)g(a)h(callable)f(term)p 915 176 V 83 w Fh(type)p 1032 161 14 2 v 15 w(error\(callable,)19 b(Clause\))p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(SorA)13 b Fm(is)h(a)f(v)n(ariable)p 915 228 V 624 w Fh(instantiation)p 1230 213 14 2 v 13 w(error)p 1859 228 2 50 v -30 229 1890 2 v -30 329 2 100 v -3 264 a(SorA)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(stream-term)i(or)-3 314 y(alias)p 915 329 V 941 264 a Fh(domain)p 1076 264 14 2 v 15 w(error\(stream)p 1355 264 V 13 w(or)p 1412 264 V 15 w(alias,)21 b(SorA\))p 1859 329 2 100 v -30 331 1890 2 v -30 381 2 50 v -3 366 a(SorA)13 b Fm(is)h(not)g(asso)q (ciated)g(with)g(an)f(op)q(en)i(stream)p 915 381 V 155 w Fh(existence)p 1142 366 14 2 v 14 w(error\(stream,)k(SorA\))p 1859 381 2 50 v -30 382 1890 2 v -30 432 2 50 v -3 417 a(SorA)13 b Fm(is)h(an)f(input)h(stream)p 915 432 V 511 w Fh(permission)p 1164 417 14 2 v 14 w(error\(output,)19 b(stream,)h(SorA\))p 1859 432 2 50 v -30 434 1890 2 v -30 533 2 100 v -3 469 a(SorA)13 b Fm(is)h(asso)q(ciated)g(with)g(a)g (binary)f(stream)p 915 533 V 222 w Fh(permission)p 1164 469 14 2 v 14 w(error\(output,)19 b(binary)p 1615 469 V 14 w(stream,)941 518 y(SorA\))p 1859 533 2 100 v -30 535 1890 2 v -30 618 a Fi(P)o(ortabilit)o(y)-30 717 y Fm(GNU)14 b(Prolog)f(predicates.)-30 875 y Fi(7.14.9)48 b Fh(get)p 209 875 14 2 v 15 w(print)p 334 875 V 15 w(stream/1)-30 1002 y Fi(T)l(emplates)74 1085 y Fh(get)p 143 1085 V 15 w(print)p 268 1085 V 15 w(stream\(?stream\))-30 1168 y Fi(Description)-30 1267 y Fh(get)p 39 1267 V 16 w(print)p 165 1267 V 14 w(stream\(Stream\))9 b Fm(uni\014es)i Fh(Stream)g Fm(with)g(the)h(stream-term)g(asso)q(ciated)g(with)f(the)h(output)f (stream)h(used)-30 1317 y(b)o(y)i Fh(print/2)d Fm(\(section)j(7.14.6,)c (page)j(96\).)k(The)c(purp)q(ose)h(of)f(this)f(predicate)i(is)f(to)g (allo)o(w)e(a)h(user-de\014ned)j Fh(portray/1)-30 1367 y Fm(predicate)g(to)f(iden)o(tify)f(the)i(output)f(stream)g(in)g(use.) -30 1466 y Fi(Errors)p -30 1531 1890 2 v -30 1581 2 50 v -3 1566 a Fh(Stream)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(a)h (stream-term)p 915 1581 V 97 w Fh(domain)p 1076 1566 14 2 v 15 w(error\(stream,)19 b(Stream\))p 1859 1581 2 50 v -30 1582 1890 2 v -30 1666 a Fi(P)o(ortabilit)o(y)-30 1765 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1923 y Fi(7.14.10)48 b Fh(op/3)-30 2050 y Fi(T)l(emplates)74 2133 y Fh(op\(+integer,)20 b(+operator)p 559 2133 14 2 v 13 w(specifier,)g(+atom)p 922 2133 V 15 w(or)p 981 2133 V 15 w(atom)p 1084 2133 V 15 w(list\))-30 2216 y Fi(Description)-30 2315 y Fh(op\(Priority,)g (OpSpecifier,)f(Operator\))10 b Fm(alters)j(the)g(op)q(erator)g(table.) k Fh(Operator)11 b Fm(is)h(declared)h(as)g(an)f(op)q(erator)-30 2365 y(with)j(prop)q(erties)h(de\014ned)f(b)o(y)f(sp)q(eci\014er)j Fh(OpSpecifier)12 b Fm(and)i Fh(Priority)p Fm(.)k Fh(Priority)13 b Fm(m)o(ust)h(b)q(e)h(an)g(in)o(teger)f Fg(\025)h Fm(0)f(and)-30 2415 y Fg(\024)g Fm(1200.)j(If)f Fh(Priority)11 b Fm(is)i(0)g(then)h (the)g(op)q(erator)g(prop)q(erties)g(of)i Fh(Operator)c Fm(\(if)g(an)o(y\))h(are)h(canceled.)19 b Fh(Operator)11 b Fm(ma)o(y)-30 2465 y(also)k(b)q(e)g(a)f(list)g(of)g(atoms)h(in)f (whic)o(h)g(case)i(all)d(of)h(them)h(are)g(declared)h(to)f(b)q(e)g(op)q (erators.)21 b(In)15 b(general,)f(op)q(erators)i(can)-30 2514 y(b)q(e)j(remo)o(v)o(ed)e(from)g(the)h(op)q(erator)g(table)g(and)f (their)h(priorit)o(y)f(or)h(sp)q(eci\014er)h(can)f(b)q(e)g(c)o(hanged.) 29 b(Ho)o(w)o(ev)o(er,)19 b(it)e(is)g(an)-30 2564 y(error)e(to)e (attempt)h(to)g(c)o(hange)g(the)g Fh(',')f Fm(op)q(erator)h(from)f(its) g(initial)f(status.)19 b(An)13 b(atom)g(can)h(ha)o(v)o(e)f(m)o(ultiple) g(op)q(erator)-30 2614 y(de\014nitions)f(\(e.g.)17 b(pre\014x)c(and)f (in\014x)f(lik)o(e)g Fh(+)p Fm(\))h(ho)o(w)o(ev)o(er)g(an)g(atom)f (cannot)h(ha)o(v)o(e)f(b)q(oth)h(an)g(in\014x)f(and)h(a)f(p)q(ost\014x) i(op)q(erator)-30 2664 y(de\014nitions.)-30 2763 y Fi(Op)q(erator)i(sp) q(eci\014ers)p Fm(:)i(the)d(follo)o(wing)e(sp)q(eci\014ers)k(are)e(a)o (v)n(ailable:)p eop end %%Page: 101 103 TeXDict begin 101 102 bop -30 -45 a Fm(7.14)41 b(T)m(erm)13 b(input/output)1363 b(101)p -30 -27 1890 4 v -30 75 667 2 v -30 125 2 50 v -3 110 a(Sp)q(eci\014er)p 175 125 V 68 w(T)o(yp)q(e)p 349 125 V 66 w(Asso)q(ciativit)o(y)p 635 125 V -30 127 667 2 v -30 136 V -30 186 2 50 v 52 171 a Fh(fx)p 175 186 V 116 w Fm(pre\014x)p 349 186 V 157 w(no)p 635 186 V -30 188 667 2 v -30 238 2 50 v 52 223 a Fh(fy)p 175 238 V 116 w Fm(pre\014x)p 349 238 V 151 w(y)o(es)p 635 238 V -30 239 667 2 v -30 289 2 50 v 52 274 a Fh(xf)p 175 289 V 106 w Fm(p)q(ost\014x)p 349 289 V 147 w(no)p 635 289 V -30 291 667 2 v -30 341 2 50 v 52 326 a Fh(yf)p 175 341 V 106 w Fm(p)q(ost\014x)p 349 341 V 141 w(y)o(es)p 635 341 V -30 342 667 2 v -30 392 2 50 v 41 377 a Fh(xfx)p 175 392 V 116 w Fm(in\014x)p 349 392 V 168 w(no)p 635 392 V -30 394 667 2 v -30 444 2 50 v 41 429 a Fh(yfx)p 175 444 V 116 w Fm(in\014x)p 349 444 V 161 w(left)p 635 444 V -30 445 667 2 v -30 495 2 50 v 41 480 a Fh(xfy)p 175 495 V 116 w Fm(in\014x)p 349 495 V 147 w(righ)o(t)p 635 495 V -30 497 667 2 v -30 580 a Fi(Prolog)16 b(prede\014ned)c(op)q(erators)p Fm(:)p -30 643 1751 2 v -30 693 2 50 v -3 678 a(Priorit)o(y)p 163 693 V 51 w(Sp)q(eci\014er)p 368 693 V 53 w(Op)q(erators)p 1719 693 V -30 695 1751 2 v -30 705 V -30 755 2 50 v 51 740 a Fh(1200)p 163 755 V 95 w(xfx)p 368 755 V 95 w(:-)43 b(-->)p 1719 755 V -30 756 1751 2 v -30 806 2 50 v 51 791 a(1200)p 163 806 V 106 w(fx)p 368 806 V 106 w(:-)p 1719 806 V -30 808 1751 2 v -30 857 2 50 v 51 843 a(1100)p 163 857 V 95 w(xfy)p 368 857 V 95 w(;)p 1719 857 V -30 859 1751 2 v -30 909 2 50 v 51 894 a(1050)p 163 909 V 95 w(xfy)p 368 909 V 95 w(->)p 1719 909 V -30 911 1751 2 v -30 960 2 50 v 51 945 a(1000)p 163 960 V 95 w(xfy)p 368 960 V 95 w(,)p 1719 960 V -30 962 1751 2 v -30 1012 2 50 v 73 997 a(900)p 163 1012 V 106 w(fy)p 368 1012 V 106 w(\\+)p 1719 1012 V -30 1014 1751 2 v -30 1113 2 100 v 73 1048 a(700)p 163 1113 V 95 w(xfx)p 368 1113 V 95 w(=)g(\\=)g(=..)65 b(==)43 b(\\==)g(@<)h(@=<)f(@>)g(@>=)g (is)g(=:=)g(=\\=)g(<)g(=<)395 1098 y(>)g(>=)p 1719 1113 V -30 1115 1751 2 v -30 1165 2 50 v 73 1150 a(600)p 163 1165 V 95 w(xfy)p 368 1165 V 95 w(:)p 1719 1165 V -30 1166 1751 2 v -30 1216 2 50 v 73 1201 a(500)p 163 1216 V 95 w(yfx)p 368 1216 V 95 w(+)g(-)h(/\\)f(\\/)p 1719 1216 V -30 1218 1751 2 v -30 1268 2 50 v 73 1253 a(400)p 163 1268 V 95 w(yfx)p 368 1268 V 95 w(*)g(/)h(//)f(rem)g(mod)g(<<)g(>>) p 1719 1268 V -30 1269 1751 2 v -30 1319 2 50 v 73 1304 a(200)p 163 1319 V 95 w(xfy)p 368 1319 V 95 w(**)g(^)p 1719 1319 V -30 1321 1751 2 v -30 1371 2 50 v 73 1356 a(200)p 163 1371 V 106 w(fy)p 368 1371 V 106 w(+)g(-)h(\\)p 1719 1371 V -30 1372 1751 2 v -30 1455 a Fi(FD)16 b(prede\014ned)d(op)q (erators)p Fm(:)p -30 1519 V -30 1569 2 50 v -3 1554 a(Priorit)o(y)p 163 1569 V 51 w(Sp)q(eci\014er)p 368 1569 V 53 w(Op)q(erators)p 1719 1569 V -30 1570 1751 2 v -30 1580 V -30 1630 2 50 v 73 1615 a Fh(750)p 163 1630 V 95 w(xfy)p 368 1630 V 95 w(#<=>)43 b(#\\<=>)p 1719 1630 V -30 1632 1751 2 v -30 1681 2 50 v 73 1666 a(740)p 163 1681 V 95 w(xfy)p 368 1681 V 95 w(#==>)g(#\\==>)p 1719 1681 V -30 1683 1751 2 v -30 1733 2 50 v 73 1718 a(730)p 163 1733 V 95 w(xfy)p 368 1733 V 95 w(##)g(#\\/)g(#\\\\/)p 1719 1733 V -30 1735 1751 2 v -30 1784 2 50 v 73 1769 a(720)p 163 1784 V 95 w(yfx)p 368 1784 V 95 w(#/\\)g(#\\/\\)p 1719 1784 V -30 1786 1751 2 v -30 1836 2 50 v 73 1821 a(710)p 163 1836 V 106 w(fy)p 368 1836 V 106 w(#\\)p 1719 1836 V -30 1838 1751 2 v -30 1887 2 50 v 73 1872 a(700)p 163 1887 V 95 w(xfx)p 368 1887 V 95 w(#=)g(#\\=)g(#<)g(#=<)g (#>)g(#>=)g(#=#)g(#\\=#)g(#<#)g(#=<#)g(#>#)g(#>=#)p 1719 1887 V -30 1889 1751 2 v -30 1939 2 50 v 73 1924 a(500)p 163 1939 V 95 w(yfx)p 368 1939 V 95 w(+)g(-)p 1719 1939 V -30 1940 1751 2 v -30 1990 2 50 v 73 1975 a(400)p 163 1990 V 95 w(yfx)p 368 1990 V 95 w(*)g(/)h(//)f(rem)p 1719 1990 V -30 1992 1751 2 v -30 2042 2 50 v 73 2027 a(200)p 163 2042 V 95 w(xfy)p 368 2042 V 95 w(**)p 1719 2042 V -30 2043 1751 2 v -30 2093 2 50 v 73 2078 a(200)p 163 2093 V 106 w(fy)p 368 2093 V 106 w(+)g(-)p 1719 2093 V -30 2095 1751 2 v -30 2177 a Fi(Errors)p eop end %%Page: 102 104 TeXDict begin 102 103 bop -30 -45 a Fm(102)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(Priority)e Fm(is)i(a)g(v)n(ariable)p 915 125 V 536 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(OpSpecifier)e Fm(is)h(a)h(v)n(ariable) p 915 176 V 471 w Fh(instantiation)p 1230 161 14 2 v 13 w(error)p 1859 176 2 50 v -30 178 1890 2 v -30 278 2 100 v -3 213 a(Operator)e Fm(is)i(a)g(partial)e(list)i(or)g(a)f(list) h(with)f(an)-3 263 y(elemen)o(t)h Fh(E)g Fm(whic)o(h)g(is)g(a)f(v)n (ariable)p 915 278 V 941 213 a Fh(instantiation)p 1230 213 14 2 v 13 w(error)p 1859 278 2 100 v -30 279 1890 2 v -30 329 2 50 v -3 314 a(Priority)f Fm(is)i(neither)h(a)e(v)n (ariable)g(nor)h(an)g(in)o(teger)p 915 329 V 128 w Fh(type)p 1032 314 14 2 v 15 w(error\(integer,)19 b(Priority\))p 1859 329 2 50 v -30 331 1890 2 v -30 381 2 50 v -3 366 a(OpSpecifier)12 b Fm(is)h(neither)i(a)f(v)n(ariable)f(nor)g(an)h(atom) p 915 381 V 93 w Fh(type)p 1032 366 14 2 v 15 w(error\(atom,)19 b(OpSpecifier\))p 1859 381 2 50 v -30 382 1890 2 v -30 482 2 100 v -3 417 a(Operator)12 b Fm(is)i(neither)h(a)e(partial)g (list)h(nor)g(a)f(list)h(nor)-3 467 y(an)g(atom)p 915 482 V 941 417 a Fh(type)p 1032 417 14 2 v 15 w(error\(list,)19 b(Operator\))p 1859 482 2 100 v -30 484 1890 2 v -30 583 2 100 v -3 518 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Operator)f Fm(list)g(is)h(neither)h(a)-3 568 y(v)n(ariable)e(nor)h (an)f(atom)p 915 583 V 941 518 a Fh(type)p 1032 518 14 2 v 15 w(error\(atom,)19 b(E\))p 1859 583 2 100 v -30 585 1890 2 v -30 635 2 50 v -3 620 a(Priority)12 b Fm(is)i(an)g(in)o (teger)g(not)g Fg(\025)g Fm(0)f(and)h Fg(\024)g Fm(1200)p 915 635 V 154 w Fh(domain)p 1076 620 14 2 v 15 w(error\(operator)p 1398 620 V 12 w(priority,)20 b(Priority\))p 1859 635 2 50 v -30 636 1890 2 v -30 736 2 100 v -3 671 a(OpSpecifier)12 b Fm(is)h(not)h(a)g(v)n(alid)e(op)q(erator)i(sp)q(eci\014er)p 915 736 V 128 w Fh(domain)p 1076 671 14 2 v 15 w(error\(operator)p 1398 671 V 12 w(specifier,)941 721 y(OpSpecifier\))p 1859 736 2 100 v -30 738 1890 2 v -30 837 2 100 v -3 772 a(Operator)e Fm(is)i Fh(',')f Fm(or)h(an)g(elemen)o(t)g(of)f(the)i Fh(Operator)-3 822 y Fm(list)e(is)h Fh(',')p 915 837 V 941 772 a(permission)p 1164 772 14 2 v 14 w(error\(modify,)19 b(operator,)h(','\))p 1859 837 2 100 v -30 839 1890 2 v -30 938 2 100 v -3 874 a(OpSpecifier)12 b Fm(is)h(a)h(sp)q(eci\014er) i(suc)o(h)e(that)g Fh(Operator)-3 924 y Fm(w)o(ould)f(ha)o(v)o(e)h(a)f (p)q(ost\014x)i(and)e(an)h(in\014x)f(de\014nition.)p 915 938 V 941 874 a Fh(permission)p 1164 874 14 2 v 14 w(error\(create,)19 b(operator,)941 924 y(Operator\))p 1859 938 2 100 v -30 940 1890 2 v -30 1023 a Fi(P)o(ortabilit)o(y)-30 1123 y Fm(ISO)c(predicate.)-30 1222 y(The)f(ISO)g(reference)i(implies)c (that)i(if)e(a)h(program)g(calls)g Fh(current)p 1029 1222 14 2 v 14 w(op/3)p Fm(,)f(then)i(mo)q(di\014es)f(an)h(op)q(erator) f(de\014nition)g(b)o(y)-30 1272 y(calling)f Fh(op/3)g Fm(and)h(bac)o(ktrac)o(ks)g(in)o(to)f(the)i(call)e(to)g Fh(current)p 920 1272 V 15 w(op/3)p Fm(,)f(then)j(the)f(c)o(hanges)g (are)h(guaran)o(teed)f(not)g(to)f(a\013ect)-30 1322 y(that)i Fh(current)p 217 1322 V 15 w(op/3)f Fm(goal.)j(This)e(is)g(not)g (guaran)o(teed)g(b)o(y)g(GNU)g(Prolog.)-30 1480 y Fi(7.14.11)48 b Fh(current)p 321 1480 V 14 w(op/3)-30 1606 y Fi(T)l(emplates)74 1689 y Fh(current)p 231 1689 V 14 w(op\(?integer,)20 b(?operator)p 727 1689 V 14 w(specifier,)f(?atom\))-30 1772 y Fi(Description)-30 1872 y Fh(current)p 127 1872 V 15 w(op\(Priority,)g(OpSpecifier,)g(Operator\))13 b Fm(succeeds)k(if)g Fh(Operator)c Fm(is)i(an)f(op)q(erator)h(with)g (prop)q(erties)-30 1921 y(de\014ned)g(b)o(y)f(sp)q(eci\014er)i Fh(OpSpecifier)11 b Fm(and)j Fh(Priority)p Fm(.)i(This)e(predicate)h (is)f(re-executable)h(on)f(bac)o(ktrac)o(king.)-30 2021 y Fi(Errors)p -30 2077 1890 2 v -30 2176 2 100 v -3 2112 a Fh(Priority)e Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(an)g(op)q (erator)-3 2161 y(priorit)o(y)p 915 2176 V 941 2112 a Fh(domain)p 1076 2112 14 2 v 15 w(error\(operator)p 1398 2112 V 12 w(priority,)20 b(Priority\))p 1859 2176 2 100 v -30 2178 1890 2 v -30 2278 2 100 v -3 2213 a(OpSpecifier)12 b Fm(is)h(neither)i(a)f(v)n(ariable)f(nor)g(an)-3 2263 y(op)q(erator)h(sp)q(eci\014er)p 915 2278 V 941 2213 a Fh(domain)p 1076 2213 14 2 v 15 w(error\(operator)p 1398 2213 V 12 w(specifier,)941 2263 y(OpSpecifier\))p 1859 2278 2 100 v -30 2279 1890 2 v -30 2329 2 50 v -3 2314 a(Operator)e Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(an)g(atom)p 915 2329 V 158 w Fh(type)p 1032 2314 14 2 v 15 w(error\(atom,)19 b(Operator\))p 1859 2329 2 50 v -30 2331 1890 2 v -30 2414 a Fi(P)o(ortabilit)o(y)-30 2513 y Fm(ISO)c(predicate.)-30 2671 y Fi(7.14.12)48 b Fh(char)p 255 2671 14 2 v 15 w(conversion/2)-30 2797 y Fi(T)l(emplates)74 2880 y Fh(char)p 165 2880 V 15 w(conversion\(+charac)o(ter,)18 b(+character\))p eop end %%Page: 103 105 TeXDict begin 103 104 bop -30 -45 a Fm(7.14)41 b(T)m(erm)13 b(input/output)1363 b(103)p -30 -27 1890 4 v -30 115 a Fi(Description)-30 215 y Fh(char)p 61 215 14 2 v 15 w(conversion\(InChar,)18 b(OutChar\))f Fm(alters)h(the)h(c)o (haracter-con)o(v)o(ersion)g(mapping.)30 b(This)18 b(mapping)e(is)i (used)-30 264 y(b)o(y)c(the)g(follo)o(wing)d(read)j(predicates:)20 b Fh(read)p 670 264 V 14 w(term/3)13 b Fm(\(section)h(7.14.1,)e(page)h (92\),)g Fh(read)p 1382 264 V 15 w(atom/2)p Fm(,)f Fh(read)p 1641 264 V 15 w(integer/2)p Fm(,)-30 314 y Fh(read)p 61 314 V 15 w(number/2)19 b Fm(\(section)i(7.14.2,)e(page)h(93\))g(and) f Fh(read)p 926 314 V 15 w(token/2)g Fm(\(section)i(7.14.3,)e(page)h (94\))g(to)g(replace)h(an)o(y)-30 364 y(o)q(ccurrence)h(of)c(a)g(c)o (haracter)i Fh(InChar)d Fm(b)o(y)h Fh(OutChar)p Fm(.)31 b(Ho)o(w)o(ev)o(er)19 b(the)g(con)o(v)o(ersion)f(mec)o(hanism)h(should) f(ha)o(v)o(e)g(b)q(een)-30 414 y(previously)c(activ)n(ated)g(b)o(y)f (switc)o(hing)g(on)h(the)g Fh(char)p 808 414 V 15 w(conversion)e Fm(Prolog)h(\015ag)g(\(section)i(7.22.1,)c(page)j(133\).)j(When)-30 464 y Fh(InChar)c Fm(and)h Fh(OutChar)e Fm(are)i(the)h(same,)f(the)g (e\013ect)i(is)d(to)h(remo)o(v)o(e)g(an)o(y)f(con)o(v)o(ersion)i(of)e (a)g(c)o(haracter)j Fh(InChar)p Fm(.)-30 563 y(Note)21 b(that)f(the)h(single)f(c)o(haracter)i(read)f(predicates)g(\(e.g.)37 b Fh(get)p 1047 563 V 15 w(char/2)p Fm(\))19 b(nev)o(er)j(do)e(c)o (haracter)h(con)o(v)o(ersion.)38 b(If)-30 613 y(suc)o(h)14 b(b)q(eha)o(vior)e(is)g(required,)h(it)f(m)o(ust)g(b)q(e)h(explicitly)e (done)i(using)g Fh(current)p 1181 613 V 14 w(char)p 1283 613 V 15 w(conversion/2)d Fm(\(section)j(7.14.13,)-30 663 y(page)h(103\).)-30 762 y Fi(Errors)p -30 818 1890 2 v -30 868 2 50 v -3 853 a Fh(InChar)f Fm(is)g(a)h(v)n(ariable)p 915 868 V 580 w Fh(instantiation)p 1230 853 14 2 v 13 w(error)p 1859 868 2 50 v -30 870 1890 2 v -30 919 2 50 v -3 904 a(OutChar)e Fm(is)i(a)g(v)n(ariable)p 915 919 V 558 w Fh(instantiation)p 1230 904 14 2 v 13 w(error)p 1859 919 2 50 v -30 921 1890 2 v -30 971 2 50 v -3 956 a(InChar)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(a)h(c)o(haracter)p 915 971 V 152 w Fh(type)p 1032 956 14 2 v 15 w(error\(character,)k (InChar\))p 1859 971 2 50 v -30 973 1890 2 v -30 1022 2 50 v -3 1007 a(OutChar)12 b Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i (a)g(c)o(haracter)p 915 1022 V 130 w Fh(type)p 1032 1007 14 2 v 15 w(error\(character,)k(OutChar\))p 1859 1022 2 50 v -30 1024 1890 2 v -30 1107 a Fi(P)o(ortabilit)o(y)-30 1206 y Fm(ISO)d(predicate.)21 b(The)15 b Fh(type)p 430 1206 14 2 v 15 w(error\(character,.)o(..\))i Fm(is)d(a)g(GNU)h(Prolog)e (b)q(eha)o(vior,)h(the)h(ISO)g(reference)i(instead)-30 1256 y(de\014nes)g(a)e Fh(representation)p 455 1256 V 13 w(error\(character\))d Fm(in)j(this)g(case.)23 b(This)15 b(seems)i(to)e(b)q(e)h(an)f(error)h(of)f(the)h(ISO)f(refer-)-30 1306 y(ence)i(since,)g(for)e(man)o(y)f(other)i(built-in)f(predicates)h (accepting)h(a)e(c)o(haracter)i(\(e.g.)22 b Fh(char)p 1414 1306 V 15 w(code/2)p Fm(,)14 b Fh(put)p 1653 1306 V 15 w(char/2)p Fm(\),)g(a)-30 1356 y Fh(type)p 61 1356 V 15 w(error)f Fm(is)h(raised.)-30 1455 y(The)e(ISO)g(reference)h (implies)e(that)g(if)f(a)h(program)g(calls)g Fh(current)p 1010 1455 V 14 w(char)p 1112 1455 V 15 w(conversion/2)p Fm(,)e(then)j(mo)q(di\014es)f(the)h(c)o(harac-)-30 1505 y(ter)h(mapping)d(b)o(y)h(calling)g Fh(char)p 477 1505 V 15 w(conversion/2)p Fm(,)d(and)k(bac)o(ktrac)o(ks)g(in)o(to)f(the)h (call)e(to)i Fh(current)p 1485 1505 V 14 w(char)p 1587 1505 V 15 w(conversion/2)-30 1555 y Fm(then)j(the)g(c)o(hanges)g(are)g (guaran)o(teed)g(not)f(to)g(a\013ect)h(that)f Fh(current)p 1059 1555 V 15 w(char)p 1162 1555 V 15 w(conversion/2)d Fm(goal.)18 b(This)c(is)g(not)h(guar-)-30 1605 y(an)o(teed)g(b)o(y)f (GNU)f(Prolog.)-30 1763 y Fi(7.14.13)48 b Fh(current)p 321 1763 V 14 w(char)p 423 1763 V 15 w(conversion/2)-30 1889 y Fi(T)l(emplates)74 1972 y Fh(current)p 231 1972 V 14 w(char)p 333 1972 V 15 w(conversion\(?charact)o(er,)19 b(?character\))-30 2055 y Fi(Description)-30 2155 y Fh(current)p 127 2155 V 15 w(char)p 230 2155 V 15 w(conversion\(InCh)o(ar,)g (OutChar\))8 b Fm(succeeds)k(if)d(the)h(con)o(v)o(ersion)g(of)i Fh(InChar)c Fm(is)i Fh(OutChar)e Fm(according)-30 2205 y(to)15 b(the)g(c)o(haracter-con)o(v)o(ersion)h(mapping.)j(In)c(that)f (case,)h Fh(InChar)f Fm(and)g Fh(OutChar)f Fm(are)i(di\013eren)o(t.)21 b(This)15 b(predicate)g(is)-30 2254 y(re-executable)h(on)e(bac)o(ktrac) o(king.)-30 2354 y Fi(Errors)p -30 2410 1890 2 v -30 2459 2 50 v -3 2444 a Fh(InChar)f Fm(is)g(neither)i(a)f(v)n(ariable)f (nor)g(a)h(c)o(haracter)p 915 2459 V 152 w Fh(type)p 1032 2444 14 2 v 15 w(error\(character,)k(InChar\))p 1859 2459 2 50 v -30 2461 1890 2 v -30 2511 2 50 v -3 2496 a(OutChar)12 b Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i(a)g(c)o (haracter)p 915 2511 V 130 w Fh(type)p 1032 2496 14 2 v 15 w(error\(character,)k(OutChar\))p 1859 2511 2 50 v -30 2513 1890 2 v -30 2595 a Fi(P)o(ortabilit)o(y)-30 2695 y Fm(ISO)d(predicate.)k(Same)13 b(remark)i(as)f(for)f(c)o(har)p 697 2695 13 2 v 15 w(con)o(v)o(ersion/2)h(\(section)h(7.14.12,)c(page)j (102\).)p eop end %%Page: 104 106 TeXDict begin 104 105 bop -30 -45 a Fm(104)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Ff(7.15)56 b(Input/output)19 b(from/to)f(constan)n (t)h(terms)-30 241 y Fm(These)g(built-in)d(predicates)j(enable)e(a)g (Prolog)g(term)g(to)g(b)q(e)h(input)f(from)g(or)g(output)g(to)h(a)e (Prolog)h(constan)o(t)h(term)-30 291 y(\(atom,)g(c)o(haracter)h(list)f (or)g(c)o(haracter)h(co)q(de)f(list\).)30 b(All)17 b(these)i (predicates)g(can)f(b)q(e)h(de\014ned)g(using)e(constan)o(t)i(term)-30 341 y(streams)c(\(section)g(7.11,)d(page)i(82\).)k(They)c(are)g(ho)o(w) o(ev)o(er)g(simpler)g(to)g(use.)-30 495 y Fi(7.15.1)48 b Fh(read)p 231 495 14 2 v 15 w(term)p 334 495 V 15 w(from)p 437 495 V 15 w(atom/3)p Fi(,)15 b Fh(read)p 700 495 V 15 w(from)p 803 495 V 14 w(atom/2)p Fi(,)g Fh(read)p 1065 495 V 15 w(token)p 1190 495 V 15 w(from)p 1293 495 V 15 w(atom/2)-30 622 y Fi(T)l(emplates)74 690 y Fh(read)p 165 690 V 15 w(term)p 268 690 V 15 w(from)p 371 690 V 15 w(atom\(+atom)20 b(?term,)g(+read)p 888 690 V 15 w(option)p 1035 690 V 14 w(list\))74 740 y(read)p 165 740 V 15 w(from)p 268 740 V 15 w(atom\(+atom,)f(?term\))74 790 y(read)p 165 790 V 15 w(token)p 290 790 V 15 w(from)p 393 790 V 15 w(atom\(+atom,)g(?nonvar\))-30 858 y Fi(Description)-30 957 y Fm(Lik)o(e)c Fh(read)p 153 957 V 15 w(term/3)p Fm(,)f Fh(read/2)g Fm(\(section)j(7.14.1,)c(page)i(92\))g(and)g Fh(read)p 1103 957 V 15 w(token/2)f Fm(\(section)i(7.14.3,)d(page)j (94\))f(except)-30 1007 y(that)f(c)o(haracters)i(are)e(not)g(read)h (from)e(a)g(text-stream)i(but)f(from)f Fh(Atom)p Fm(;)g(the)h(atom)f (giv)o(en)h(as)g(\014rst)h(argumen)o(t.)-30 1107 y Fi(Errors)p -30 1162 1890 2 v -30 1212 2 50 v -3 1197 a Fh(Atom)e Fm(is)h(a)f(v)n(ariable)p 915 1212 V 624 w Fh(instantiation)p 1230 1197 14 2 v 13 w(error)p 1859 1212 2 50 v -30 1214 1890 2 v -30 1264 2 50 v -3 1249 a(Atom)g Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(an)g(atom)p 915 1264 V 245 w Fh(type)p 1032 1249 14 2 v 15 w(error\(atom,)19 b(Atom\))p 1859 1264 2 50 v -30 1265 1890 2 v -30 1365 2 100 v -3 1300 a Fm(see)c(asso)q(ciated)g(predicate)g(errors)p 915 1365 V 396 w(\(section)g(7.14.1,)c(page)j(92\))g(and)f(\(section)i(7.14.3,) 941 1350 y(page)f(94\))p 1859 1365 V -30 1367 1890 2 v -30 1449 a Fi(P)o(ortabilit)o(y)-30 1549 y Fm(GNU)g(Prolog)f (predicates.)-30 1703 y Fi(7.15.2)48 b Fh(read)p 231 1703 14 2 v 15 w(term)p 334 1703 V 15 w(from)p 437 1703 V 15 w(chars/3)p Fi(,)15 b Fh(read)p 722 1703 V 14 w(from)p 824 1703 V 15 w(chars/2)p Fi(,)g Fh(read)p 1109 1703 V 15 w(token)p 1234 1703 V 14 w(from)p 1336 1703 V 15 w(chars/2)-30 1830 y Fi(T)l(emplates)74 1898 y Fh(read)p 165 1898 V 15 w(term)p 268 1898 V 15 w(from)p 371 1898 V 15 w(chars\(+character)p 737 1898 V 12 w(list)21 b(?term,)g(+read)p 1122 1898 V 14 w(option)p 1268 1898 V 15 w(list\))74 1948 y(read)p 165 1948 V 15 w(from)p 268 1948 V 15 w(chars\(+character) p 634 1948 V 12 w(list,)g(?term\))74 1998 y(read)p 165 1998 V 15 w(token)p 290 1998 V 15 w(from)p 393 1998 V 15 w(chars\(+character)p 759 1998 V 12 w(list,)g(?nonvar\))-30 2066 y Fi(Description)-30 2165 y Fm(Lik)o(e)15 b Fh(read)p 153 2165 V 15 w(term/3)p Fm(,)f Fh(read/2)g Fm(\(section)j(7.14.1,)c (page)i(92\))g(and)g Fh(read)p 1103 2165 V 15 w(token/2)f Fm(\(section)i(7.14.3,)d(page)j(94\))f(except)-30 2215 y(that)d(c)o(haracters)g(are)g(not)f(read)g(from)f(a)h(text-stream)h (but)f(from)f Fh(Chars)p Fm(;)h(the)h(c)o(haracter)g(list)e(giv)o(en)h (as)g(\014rst)h(argumen)o(t.)-30 2315 y Fi(Errors)p -30 2370 1890 2 v -30 2470 2 100 v -3 2405 a Fh(Chars)h Fm(is)h(a)f (partial)g(list)g(or)h(a)g(list)f(with)h(an)g(elemen)o(t)g Fh(E)-3 2455 y Fm(whic)o(h)g(is)g(a)f(v)n(ariable)p 915 2470 V 941 2405 a Fh(instantiation)p 1230 2405 14 2 v 13 w(error)p 1859 2470 2 100 v -30 2472 1890 2 v -30 2521 2 50 v -3 2506 a(Chars)g Fm(is)h(neither)g(a)g(partial)f(list)g (nor)h(a)g(list)p 915 2521 V 236 w Fh(type)p 1032 2506 14 2 v 15 w(error\(list,)19 b(Chars\))p 1859 2521 2 50 v -30 2523 1890 2 v -30 2623 2 100 v -3 2558 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Chars)f Fm(list)h(is)f(neither)i (a)-3 2608 y(v)n(ariable)e(nor)h(a)f(c)o(haracter)p 915 2623 V 941 2558 a Fh(type)p 1032 2558 14 2 v 15 w(error\(character,)18 b(E\))p 1859 2623 2 100 v -30 2624 1890 2 v -30 2724 2 100 v -3 2659 a Fm(see)d(asso)q(ciated)g(predicate)g(errors)p 915 2724 V 396 w(\(section)g(7.14.1,)c(page)j(92\))g(and)f(\(section)i (7.14.3,)941 2709 y(page)f(94\))p 1859 2724 V -30 2726 1890 2 v -30 2808 a Fi(P)o(ortabilit)o(y)-30 2908 y Fm(GNU)g(Prolog)f (predicates.)p eop end %%Page: 105 107 TeXDict begin 105 106 bop -30 -45 a Fm(7.15)41 b(Input/output)14 b(from/to)f(constan)o(t)h(terms)1031 b(105)p -30 -27 1890 4 v -30 115 a Fi(7.15.3)48 b Fh(read)p 231 115 14 2 v 15 w(term)p 334 115 V 15 w(from)p 437 115 V 15 w(codes/3)p Fi(,)15 b Fh(read)p 722 115 V 14 w(from)p 824 115 V 15 w(codes/2)p Fi(,)g Fh(read)p 1109 115 V 15 w(token)p 1234 115 V 14 w(from)p 1336 115 V 15 w(codes/2)-30 241 y Fi(T)l(emplates)74 317 y Fh(read)p 165 317 V 15 w(term)p 268 317 V 15 w(from)p 371 317 V 15 w(codes\(+character)p 737 317 V 12 w(code)p 838 317 V 15 w(list)21 b(?term,)g(+read)p 1225 317 V 14 w(option)p 1371 317 V 15 w(list\))74 367 y(read)p 165 367 V 15 w(from)p 268 367 V 15 w(codes\(+character)p 634 367 V 12 w(code)p 735 367 V 15 w(list,)g(?term\))74 417 y(read)p 165 417 V 15 w(token)p 290 417 V 15 w(from)p 393 417 V 15 w(codes\(+character)p 759 417 V 12 w(code)p 860 417 V 15 w(list,)g(?nonvar\))-30 492 y Fi(Description)-30 592 y Fm(Lik)o(e)15 b Fh(read)p 153 592 V 15 w(term/3)p Fm(,)f Fh(read/2)g Fm(\(section)j(7.14.1,)c(page)i(92\))g(and)g Fh(read)p 1103 592 V 15 w(token/2)f Fm(\(section)i(7.14.3,)d(page)j (94\))f(except)-30 642 y(that)i(c)o(haracters)i(are)f(not)e(read)i (from)e(a)h(text-stream)h(but)f(from)f Fh(Codes)p Fm(;)h(the)g(c)o (haracter)i(co)q(de)e(list)g(giv)o(en)f(as)h(\014rst)-30 691 y(argumen)o(t.)-30 791 y Fi(Errors)p -30 847 1890 2 v -30 946 2 100 v -3 882 a Fh(Codes)c Fm(is)h(a)f(partial)g(list)g (or)h(a)g(list)f(with)h(an)g(elemen)o(t)g Fh(E)-3 931 y Fm(whic)o(h)g(is)g(a)f(v)n(ariable)p 915 946 V 941 882 a Fh(instantiation)p 1230 882 14 2 v 13 w(error)p 1859 946 2 100 v -30 948 1890 2 v -30 998 2 50 v -3 983 a(Codes)g Fm(is)h(neither)g(a)g(partial)f(list)g(nor)h(a)g(list)p 915 998 V 236 w Fh(type)p 1032 983 14 2 v 15 w(error\(list,)19 b(Codes\))p 1859 998 2 50 v -30 999 1890 2 v -30 1099 2 100 v -3 1034 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Codes)f Fm(list)h(is)f(neither)i(a)-3 1084 y(v)n(ariable)e(nor)h(an) f(in)o(teger)p 915 1099 V 941 1034 a Fh(type)p 1032 1034 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 1099 2 100 v -30 1101 1890 2 v -30 1200 2 100 v -3 1136 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Codes)f Fm(list)h(is)f(an)h(in)o (teger)g(but)-3 1185 y(not)g(a)f(c)o(haracter)j(co)q(de)p 915 1200 V 941 1136 a Fh(representation)p 1252 1136 14 2 v 13 w(error\(character)p 1594 1136 V 12 w(code,)21 b(E\))p 1859 1200 2 100 v -30 1202 1890 2 v -30 1302 2 100 v -3 1237 a Fm(see)15 b(asso)q(ciated)g(predicate)g(errors)p 915 1302 V 396 w(\(section)g(7.14.1,)c(page)j(92\))g(and)f(\(section)i (7.14.3,)941 1287 y(page)f(94\))p 1859 1302 V -30 1303 1890 2 v -30 1386 a Fi(P)o(ortabilit)o(y)-30 1486 y Fm(GNU)g(Prolog)f (predicates.)-30 1642 y Fi(7.15.4)48 b Fh(write)p 253 1642 14 2 v 15 w(term)p 356 1642 V 15 w(to)p 415 1642 V 15 w(atom/3)p Fi(,)15 b Fh(write)p 700 1642 V 15 w(to)p 759 1642 V 15 w(atom/2)p Fi(,)g Fh(writeq)p 1066 1642 V 14 w(to)p 1124 1642 V 16 w(atom/2)p Fi(,)140 1692 y Fh(write)p 253 1692 V 15 w(canonical)p 466 1692 V 14 w(to)p 524 1692 V 15 w(atom/2)p Fi(,)g Fh(display)p 853 1692 V 14 w(to)p 911 1692 V 15 w(atom/2)p Fi(,)g Fh(print)p 1196 1692 V 15 w(to)p 1255 1692 V 15 w(atom/2)p Fi(,)140 1741 y Fh(format)p 275 1741 V 15 w(to)p 334 1741 V 15 w(atom/3)-30 1868 y Fi(T)l(emplates)74 1943 y Fh(write)p 187 1943 V 15 w(term)p 290 1943 V 15 w(to)p 349 1943 V 15 w(atom\(?atom,)20 b(?term,)g(+write)p 910 1943 V 15 w(option)p 1057 1943 V 14 w(list\))74 1993 y(write)p 187 1993 V 15 w(to)p 246 1993 V 15 w(atom\(?atom,)g(?term\))74 2043 y(writeq)p 209 2043 V 15 w(to)p 268 2043 V 15 w(atom\(?atom,)f (?term\))74 2093 y(write)p 187 2093 V 15 w(canonical)p 400 2093 V 14 w(to)p 458 2093 V 15 w(atom\(?atom,)h(?term\))74 2143 y(display)p 231 2143 V 14 w(to)p 289 2143 V 16 w(atom\(?atom,)f (?term\))74 2193 y(print)p 187 2193 V 15 w(to)p 246 2193 V 15 w(atom\(?atom,)h(?term\))74 2242 y(format)p 209 2242 V 15 w(to)p 268 2242 V 15 w(atom\(?atom,)f(+character)p 764 2242 V 14 w(code)p 866 2242 V 15 w(list)p 969 2242 V 15 w(or)p 1028 2242 V 15 w(atom,)i(+list\))-30 2318 y Fi(Description)-30 2418 y Fm(Similar)11 b(to)h Fh(write)p 274 2418 V 15 w(term/3)p Fm(,)f Fh(write/2)p Fm(,)f Fh(writeq/2)p Fm(,)h Fh(write)p 929 2418 V 15 w(canonical/2)p Fm(,)e Fh(display/2)p Fm(,)i Fh(print/2)f Fm(\(section)k(7.14.6,)-30 2467 y(page)d(96\))g(and)g Fh(format/3)e Fm(\(section)j(7.14.7,)d(page) i(98\))g(except)h(that)f(c)o(haracters)i(are)e(not)g(written)h(on)o(to) e(a)h(text-stream)-30 2517 y(but)k(are)f(collected)h(as)e(an)h(atom)f (whic)o(h)h(is)g(then)g(uni\014ed)g(with)g(the)g(\014rst)h(argumen)o(t) f Fh(Atom)p Fm(.)-30 2617 y Fi(Errors)p -30 2672 1890 2 v -30 2722 2 50 v -3 2707 a Fh(Atom)f Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(an)g(atom)p 915 2722 V 245 w Fh(type)p 1032 2707 14 2 v 15 w(error\(atom,)19 b(Atom\))p 1859 2722 2 50 v -30 2724 1890 2 v -30 2824 2 100 v -3 2759 a Fm(see)c(asso)q(ciated)g(predicate)g(errors)p 915 2824 V 396 w(\(section)g(7.14.6,)c(page)j(96\))g(and)f(\(section)i(7.14.7,) 941 2809 y(page)f(98\))p 1859 2824 V -30 2825 1890 2 v -30 2908 a Fi(P)o(ortabilit)o(y)p eop end %%Page: 106 108 TeXDict begin 106 107 bop -30 -45 a Fm(106)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a(GNU)g(Prolog)f(predicates.)-30 273 y Fi(7.15.5)48 b Fh(write)p 253 273 14 2 v 15 w(term)p 356 273 V 15 w(to)p 415 273 V 15 w(chars/3)p Fi(,)15 b Fh(write)p 722 273 V 14 w(to)p 780 273 V 16 w(chars/2)p Fi(,)f Fh(writeq)p 1109 273 V 15 w(to)p 1168 273 V 15 w(chars/2)p Fi(,)140 322 y Fh(write)p 253 322 V 15 w(canonical)p 466 322 V 14 w(to)p 524 322 V 15 w(chars/2)p Fi(,)h Fh(display)p 875 322 V 14 w(to)p 933 322 V 15 w(chars/2)p Fi(,)g Fh(print)p 1240 322 V 15 w(to)p 1299 322 V 15 w(chars/2)p Fi(,)140 372 y Fh(format)p 275 372 V 15 w(to)p 334 372 V 15 w(chars/3)-30 499 y Fi(T)l(emplates)74 582 y Fh(write)p 187 582 V 15 w(term)p 290 582 V 15 w(to)p 349 582 V 15 w(chars\(?character)p 715 582 V 12 w(list,)21 b(?term,)g(+write)p 1144 582 V 14 w(option)p 1290 582 V 15 w(list\))74 632 y(write)p 187 632 V 15 w(to)p 246 632 V 15 w(chars\(?character)p 612 632 V 13 w(list,)f(?term\))74 681 y(writeq)p 209 681 V 15 w(to)p 268 681 V 15 w(chars\(?character)p 634 681 V 12 w(list,)h(?term\))74 731 y(write)p 187 731 V 15 w(canonical)p 400 731 V 14 w(to)p 458 731 V 15 w(chars\(?character)p 824 731 V 12 w(list,)g(?term\))74 781 y(display)p 231 781 V 14 w(to)p 289 781 V 16 w(chars\(?character)p 656 781 V 12 w(list,)g(?term\))74 831 y(print)p 187 831 V 15 w(to)p 246 831 V 15 w(chars\(?character)p 612 831 V 13 w(list,)f(?term\))74 881 y(format)p 209 881 V 15 w(to)p 268 881 V 15 w(chars\(?character)p 634 881 V 12 w(list,)h(+character)p 998 881 V 14 w(code)p 1100 881 V 15 w(list)p 1203 881 V 14 w(or)p 1261 881 V 16 w(atom,)f(+list\))-30 964 y Fi(Description)-30 1063 y Fm(Similar)11 b(to)h Fh(write)p 274 1063 V 15 w(term/3)p Fm(,)f Fh(write/2)p Fm(,)f Fh(writeq/2)p Fm(,)h Fh(write)p 929 1063 V 15 w(canonical/2)p Fm(,)e Fh(display/2)p Fm(,)i Fh(print/2)f Fm(\(section)k(7.14.6,)-30 1113 y(page)d(96\))g(and)g Fh(format/3)e Fm(\(section)j(7.14.7,)d(page)i(98\))g(except)h(that)f(c) o(haracters)i(are)e(not)g(written)h(on)o(to)e(a)h(text-stream)-30 1163 y(but)k(are)f(collected)h(as)e(a)h(c)o(haracter)h(list)f(whic)o(h) g(is)f(then)i(uni\014ed)f(with)f(the)i(\014rst)g(argumen)o(t)e Fh(Chars)p Fm(.)-30 1262 y Fi(Errors)p -30 1318 1890 2 v -30 1368 2 50 v -3 1353 a Fh(Chars)g Fm(is)h(neither)g(a)g(partial) f(list)g(nor)h(a)g(list)p 915 1368 V 236 w Fh(type)p 1032 1353 14 2 v 15 w(error\(list,)19 b(Chars\))p 1859 1368 2 50 v -30 1370 1890 2 v -30 1469 2 100 v -3 1404 a Fm(see)c(asso)q(ciated)g(predicate)g(errors)p 915 1469 V 396 w(\(section)g(7.14.6,)c(page)j(96\))g(and)f(\(section)i(7.14.7,) 941 1454 y(page)f(98\))p 1859 1469 V -30 1471 1890 2 v -30 1554 a Fi(P)o(ortabilit)o(y)-30 1653 y Fm(GNU)g(Prolog)f (predicates.)-30 1811 y Fi(7.15.6)48 b Fh(write)p 253 1811 14 2 v 15 w(term)p 356 1811 V 15 w(to)p 415 1811 V 15 w(codes/3)p Fi(,)15 b Fh(write)p 722 1811 V 14 w(to)p 780 1811 V 16 w(codes/2)p Fi(,)f Fh(writeq)p 1109 1811 V 15 w(to)p 1168 1811 V 15 w(codes/2)p Fi(,)140 1861 y Fh(write)p 253 1861 V 15 w(canonical)p 466 1861 V 14 w(to)p 524 1861 V 15 w(codes/2)p Fi(,)h Fh(display)p 875 1861 V 14 w(to)p 933 1861 V 15 w(codes/2)p Fi(,)g Fh(print)p 1240 1861 V 15 w(to)p 1299 1861 V 15 w(codes/2)p Fi(,)140 1911 y Fh(format)p 275 1911 V 15 w(to)p 334 1911 V 15 w(codes/3)-30 2037 y Fi(T)l(emplates)74 2120 y Fh(write)p 187 2120 V 15 w(term)p 290 2120 V 15 w(to)p 349 2120 V 15 w(codes\(?character)p 715 2120 V 12 w(code)p 816 2120 V 15 w(list,)21 b(?term,)g(+write)p 1247 2120 V 14 w(option)p 1393 2120 V 14 w(list\))74 2170 y(write)p 187 2170 V 15 w(to)p 246 2170 V 15 w(codes\(?character)p 612 2170 V 13 w(code)p 714 2170 V 14 w(list,)g(?term\))74 2220 y(writeq)p 209 2220 V 15 w(to)p 268 2220 V 15 w(codes\(?character) p 634 2220 V 12 w(code)p 735 2220 V 15 w(list,)g(?term\))74 2270 y(write)p 187 2270 V 15 w(canonical)p 400 2270 V 14 w(to)p 458 2270 V 15 w(codes\(?character)p 824 2270 V 12 w(code)p 925 2270 V 15 w(list,)g(?term\))74 2319 y(display)p 231 2319 V 14 w(to)p 289 2319 V 16 w(codes\(?character)p 656 2319 V 12 w(code)p 757 2319 V 15 w(list,)g(?term\))74 2369 y(print)p 187 2369 V 15 w(to)p 246 2369 V 15 w(codes\(?character)p 612 2369 V 13 w(code)p 714 2369 V 14 w(list,)g(?term\))74 2419 y(format)p 209 2419 V 15 w(to)p 268 2419 V 15 w(codes\(?character) p 634 2419 V 12 w(code)p 735 2419 V 15 w(list,)g(+character)p 1101 2419 V 14 w(code)p 1203 2419 V 14 w(list)p 1305 2419 V 15 w(or)p 1364 2419 V 16 w(atom,)f(+list\))-30 2502 y Fi(Description)-30 2602 y Fm(Similar)11 b(to)h Fh(write)p 274 2602 V 15 w(term/3)p Fm(,)f Fh(write/2)p Fm(,)f Fh(writeq/2)p Fm(,)h Fh(write)p 929 2602 V 15 w(canonical/2)p Fm(,)e Fh(display/2)p Fm(,)i Fh(print/2)f Fm(\(section)k(7.14.6,)-30 2651 y(page)d(96\))g(and)g Fh(format/3)e Fm(\(section)j(7.14.7,)d(page)i(98\))g(except)h(that)f(c) o(haracters)i(are)e(not)g(written)h(on)o(to)e(a)h(text-stream)-30 2701 y(but)k(are)f(collected)h(as)e(a)h(c)o(haracter)h(co)q(de)g(list)e (whic)o(h)h(is)g(then)h(uni\014ed)f(with)f(the)i(\014rst)f(argumen)o(t) g Fh(Codes)p Fm(.)-30 2801 y Fi(Errors)p eop end %%Page: 107 109 TeXDict begin 107 108 bop -30 -45 a Fm(7.16)41 b(DEC-10)13 b(compatibilit)o(y)f(input/output)1059 b(107)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(Codes)13 b Fm(is)h(neither)g(a)g(partial)f(list)g(nor)h(a)g(list)p 915 125 V 236 w Fh(type)p 1032 110 14 2 v 15 w(error\(list,)19 b(Codes\))p 1859 125 2 50 v -30 127 1890 2 v -30 226 2 100 v -3 161 a Fm(see)c(asso)q(ciated)g(predicate)g(errors)p 915 226 V 396 w(\(section)g(7.14.6,)c(page)j(96\))g(and)f(\(section)i (7.14.7,)941 211 y(page)f(98\))p 1859 226 V -30 228 1890 2 v -30 311 a Fi(P)o(ortabilit)o(y)-30 410 y Fm(GNU)g(Prolog)f (predicates.)-30 576 y Ff(7.16)56 b(DEC-10)19 b(compatibilit)n(y)d (input/output)-30 703 y Fi(7.16.1)48 b(In)o(tro)q(duction)-30 829 y Fm(The)19 b(DEC-10)e(Prolog)g(I/O)g(predicates)j(manipulate)c (streams)j(implicitly)c(since)k(they)f(only)f(refer)i(to)f(curren)o(t)h (in-)-30 879 y(put/output)f(streams)h(\(section)g(7.10.1,)d(page)i (67\).)29 b(The)19 b(curren)o(t)g(input)e(and)h(output)g(streams)h(are) f(initially)d(set)-30 929 y(to)j Fh(user)p 116 929 14 2 v 15 w(input)e Fm(and)h Fh(user)p 429 929 V 15 w(output)f Fm(resp)q(ectiv)o(ely)m(.)30 b(The)18 b(predicate)h Fh(see/1)d Fm(\(resp.)30 b Fh(tell/1)p Fm(,)17 b Fh(append/1)p Fm(\))f(can)i(b)q (e)-30 979 y(used)h(for)e(setting)h(the)g(curren)o(t)g(input)g(\(resp.) 29 b(output\))18 b(stream)g(to)f(newly)h(op)q(ened)g(streams)g(for)f (particular)g(\014les.)-30 1028 y(The)e(predicate)g Fh(seen/0)e Fm(\(resp.)20 b Fh(told/0)p Fm(\))13 b(close)i(the)g(curren)o(t)h (input)e(\(resp.)20 b(output\))14 b(stream,)h(and)f(resets)i(it)e(to)g (the)-30 1078 y(standard)19 b(input)e(\(resp.)31 b(output\).)e(The)18 b(predicate)h Fh(seeing/1)d Fm(\(resp.)30 b Fh(telling/1)p Fm(\))16 b(is)i(used)g(for)g(retrieving)g(the)-30 1128 y(\014le)f(name)f(asso)q(ciated)i(with)e(the)h(curren)o(t)h(input)f (\(resp.)27 b(output\))17 b(stream.)26 b(The)17 b(\014le)g(name)f Fh(user)g Fm(stands)h(for)g(the)-30 1178 y(standard)f(input)f(or)g (output,)g(dep)q(ending)g(on)g(con)o(text)h(\()p Fh(user)p 973 1178 V 15 w(input)e Fm(and)h Fh(user)p 1282 1178 V 14 w(output)f Fm(can)h(also)g(b)q(e)g(used\).)23 b(The)-30 1228 y(DEC-10)15 b(Prolog)f(I/O)h(predicates)i(are)e(only)f(pro)o (vided)h(for)g(compatibilit)o(y)m(,)d(they)k(are)f(no)o(w)g(obsolete)g (and)g(their)g(use)-30 1277 y(is)j(discouraged.)30 b(The)18 b(predicates)h(for)f(explicit)f(stream)h(manipulation)e(should)h(b)q(e) i(used)f(instead)g(\(section)h(7.10,)-30 1327 y(page)14 b(67\).)-30 1485 y Fi(7.16.2)48 b Fh(see/1)p Fi(,)15 b Fh(tell/1)p Fi(,)g Fh(append/1)-30 1611 y Fi(T)l(emplates)74 1694 y Fh(see\(+source)p 319 1694 V 14 w(sink\))74 1744 y(see\(+stream\))74 1794 y(tell\(+source)p 341 1794 V 13 w(sink\))74 1844 y(tell\(+stream\))74 1894 y(append\(+source)p 385 1894 V 13 w(sink\))74 1943 y(append\(+stream\))-30 2027 y Fi(Description)-30 2126 y Fh(see\(FileName\))c Fm(sets)k(the)f(curren)o(t)g(input)f(stream)h(to)f Fh(FileName)p Fm(.)j(If)d(there)i(is)e(a)g(stream)h(op)q(ened)g(b)o(y)g Fh(see/1)e Fm(asso)q(ci-)-30 2176 y(ated)k(with)f(the)h(same)f Fh(FileName)f Fm(already)m(,)g(then)i(it)f(b)q(ecomes)h(the)g(curren)o (t)h(input)e(stream.)22 b(Otherwise,)17 b Fh(FileName)-30 2226 y Fm(is)d(op)q(ened)h(for)f(reading)f(and)h(b)q(ecomes)h(the)g (curren)o(t)g(input)f(stream.)-30 2325 y Fh(tell\(FileName\))h Fm(sets)j(the)g(curren)o(t)g(output)g(stream)f(to)g Fh(FileName)p Fm(.)26 b(If)17 b(there)i(is)d(a)h(stream)h(op)q(ened)g(b)o(y)f Fh(tell/1)-30 2375 y Fm(asso)q(ciated)j(with)f(the)h(same)f Fh(FileName)e Fm(already)m(,)j(then)f(it)g(b)q(ecomes)h(the)g(curren)o (t)h(output)e(stream.)34 b(Otherwise,)-30 2425 y Fh(FileName)13 b Fm(is)g(op)q(ened)i(for)f(writing)f(and)h(b)q(ecomes)h(the)f(curren)o (t)i(output)e(stream.)-30 2525 y Fh(append\(FileName\))d Fm(lik)o(e)i Fh(tell/1)g Fm(but)h Fh(FileName)e Fm(is)i(op)q(ened)h (for)e(writing)g(+)h(app)q(end.)-30 2624 y(A)i(stream-term)h (\(obtained)f(with)f(an)o(y)g(other)i(built-in)d(predicate\))j(can)f (also)f(b)q(e)i(pro)o(vided)e(as)h Fh(FileName)e Fm(to)i(these)-30 2674 y(predicates.)-30 2774 y Fi(Errors)-30 2873 y Fm(See)f(errors)g (asso)q(ciated)g(with)f Fh(open/4)e Fm(\(section)j(7.10.6,)c(page)j (70\).)p eop end %%Page: 108 110 TeXDict begin 108 109 bop -30 -45 a Fm(108)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(P)o(ortabilit)o(y)-30 215 y Fm(GNU)g(Prolog)f (predicates.)-30 372 y Fi(7.16.3)48 b Fh(seeing/1)p Fi(,)15 b Fh(telling/1)-30 499 y Fi(T)l(emplates)74 582 y Fh(seeing\(?source)p 385 582 14 2 v 13 w(sink\))74 632 y(telling\(?source)p 407 632 V 13 w(sink\))-30 715 y Fi(Description)-30 814 y Fh(seeing\(FileName\))10 b Fm(succeeds)16 b(if)f Fh(FileName)c Fm(uni\014es)j(with)e(the)i(name)f(of)f(the)i(curren)o(t)g(input)f (\014le,)g(if)f(it)g(w)o(as)h(op)q(ened)-30 864 y(b)o(y)i Fh(see/1)p Fm(;)d(else)j(with)e(the)i(curren)o(t)g(input)f (stream-term,)g(if)f(this)h(is)g(not)g Fh(user)p 1236 864 V 14 w(input)p Fm(,)f(otherwise)i(with)e Fh(user)p Fm(.)-30 964 y Fh(telling\(FileName\))j Fm(succeeds)22 b(if)f Fh(FileName)d Fm(uni\014es)h(with)g(the)h(name)f(of)g(the)g (curren)o(t)i(output)e(\014le,)h(if)f(it)f(w)o(as)-30 1013 y(op)q(ened)g(b)o(y)f Fh(tell/1)e Fm(or)i Fh(append/1)p Fm(;)f(else)h(with)f(the)h(curren)o(t)h(output)f(stream-term,)h(if)d (this)i(is)g(not)f Fh(user)p 1706 1013 V 15 w(output)p Fm(,)-30 1063 y(otherwise)f(with)f Fh(user)p Fm(.)-30 1163 y Fi(Errors)-30 1262 y Fm(None.)-30 1362 y Fi(P)o(ortabilit)o(y) -30 1462 y Fm(GNU)g(Prolog)f(predicates.)-30 1619 y Fi(7.16.4)48 b Fh(seen/0)p Fi(,)15 b Fh(told/0)-30 1746 y Fi(T)l(emplates)74 1829 y Fh(seen)74 1879 y(told)-30 1962 y Fi(Description)-30 2061 y Fh(seen)e Fm(closes)i(the)g(curren)o(t)g(input,)e(and)h(resets)i (it)d(to)h Fh(user)p 905 2061 V 15 w(input)p Fm(.)-30 2161 y Fh(told)f Fm(closes)i(the)g(curren)o(t)g(output,)f(and)f(resets) j(it)e(to)g Fh(user)p 931 2161 V 14 w(output)p Fm(.)-30 2261 y Fi(Errors)-30 2360 y Fm(None.)-30 2460 y Fi(P)o(ortabilit)o(y) -30 2559 y Fm(GNU)g(Prolog)f(predicates.)-30 2717 y Fi(7.16.5)48 b Fh(get0/1)p Fi(,)15 b Fh(get/1)p Fi(,)g Fh(skip/1)-30 2844 y Fi(T)l(emplates)p eop end %%Page: 109 111 TeXDict begin 109 110 bop -30 -45 a Fm(7.17)41 b(T)m(erm)13 b(expansion)1424 b(109)p -30 -27 1890 4 v 74 115 a Fh(get0\(?in)p 253 115 14 2 v 14 w(character)p 465 115 V 14 w(code\))74 165 y(get\(?in)p 231 165 V 14 w(character)p 443 165 V 14 w(code\))74 215 y(skip\(+character)p 407 215 V 13 w(code\))-30 294 y Fi(Description)-30 394 y Fh(get0\(Code\))14 b Fm(succeeds)19 b(if)f Fh(Code)e Fm(uni\014es)g(with)g(the)h(next)f(c) o(haracter)h(co)q(de)g(read)g(from)e(the)i(curren)o(t)g(input)f (stream.)-30 444 y(Th)o(us)f(it)e(is)h(equiv)n(alen)o(t)f(to)h Fh(get)p 476 444 V 15 w(code\(Code\))e Fm(\(section)i(7.12.1,)e(page)i (85\).)-30 543 y Fh(get\(Code\))d Fm(succeeds)k(if)g Fh(Code)c Fm(uni\014es)i(with)f(the)h(next)g(c)o(haracter)h(co)q(de)f (read)g(from)e(the)i(curren)o(t)h(input)e(stream)h(that)-30 593 y(is)h(not)g(a)g(la)o(y)o(out)e(c)o(haracter.)-30 693 y Fh(skip\(Code\))g Fm(skips)i(just)g(past)h(the)f(next)g(c)o (haracter)i(co)q(de)e Fh(Code)f Fm(from)h(the)g(curren)o(t)h(input)f (stream.)-30 792 y Fi(Errors)-30 892 y Fm(See)h(errors)g(for)f Fh(get)p 295 892 V 15 w(code/2)f Fm(\(section)h(7.12.1,)e(page)i(85\).) -30 991 y Fi(P)o(ortabilit)o(y)-30 1091 y Fm(GNU)g(Prolog)f (predicates.)-30 1248 y Fi(7.16.6)48 b Fh(put/1)p Fi(,)15 b Fh(tab/1)-30 1375 y Fi(T)l(emplates)74 1454 y Fh(put\(+character)p 385 1454 V 13 w(code\))74 1504 y(tab\(+evaluable\))-30 1584 y Fi(Description)-30 1683 y Fh(put\(Code\))f Fm(writes)i(the)g(c)o (haracter)g(whose)g(co)q(de)g(is)f Fh(Code)g Fm(on)o(to)g(the)g(curren) o(t)i(output)f(stream.)22 b(It)16 b(is)f(equiv)n(alen)o(t)f(to)-30 1733 y Fh(put)p 39 1733 V 16 w(code\(Code\))d Fm(\(section)k(7.12.5,)d (page)h(88\).)-30 1833 y Fh(tab\(N\))g Fm(writes)i Fh(N)e Fm(spaces)j(on)o(to)d(the)h(curren)o(t)i(output)e(stream.)k Fh(N)c Fm(ma)o(y)f(b)q(e)i(an)e(arithmetic)h(expression.)-30 1932 y Fi(Errors)-30 2032 y Fm(See)f(errors)f(for)f Fh(put)p 287 2032 V 15 w(code/2)f Fm(\(section)i(7.12.5,)d(page)j(88\))e(and)h (for)g(arithmetic)g(expressions)i(\(section)f(7.6.1,)e(page)h(57\).)-30 2131 y Fi(P)o(ortabilit)o(y)-30 2231 y Fm(GNU)j(Prolog)f(predicates.) -30 2396 y Ff(7.17)56 b(T)-5 b(erm)18 b(expansion)-30 2523 y Fi(7.17.1)48 b(De\014nite)14 b(clause)i(grammars)-30 2649 y Fm(De\014nite)c(clause)g(grammars)e(are)i(a)f(useful)g(notation) g(to)g(express)i(grammar)d(rules.)18 b(Ho)o(w)o(ev)o(er)11 b(the)h(ISO)g(reference)h(do)q(es)-30 2699 y(not)g(include)g(them,)f (so)h(they)g(should)f(b)q(e)h(considered)h(as)f(a)f(system)h(dep)q (enden)o(t)i(feature.)j(De\014nite)13 b(clause)g(grammars)-30 2749 y(are)i(an)e(extension)i(of)e(con)o(text-free)j(grammars.)h(A)d (grammar)f(rule)h(is)g(of)f(the)h(form:)74 2828 y(head)22 b Fh(-->)g Fm(b)q(o)q(dy)p Fh(.)-30 2908 y(-->)14 b Fm(is)f(a)h (prede\014ned)i(in\014x)d(op)q(erator)i(\(section)f(7.14.10,)e(page)h (100\).)p eop end %%Page: 110 112 TeXDict begin 110 111 bop -30 -45 a Fm(110)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a(Here)i(are)e(some)g(features)h(of)e(de\014nite)i (clause)f(grammars:)33 198 y Fg(\017)20 b Fm(a)14 b(non-terminal)f(sym) o(b)q(ol)g(ma)o(y)g(b)q(e)h(an)o(y)g(callable)f(term.)33 281 y Fg(\017)20 b Fm(a)15 b(terminal)g(sym)o(b)q(ol)f(ma)o(y)g(b)q(e)i (an)o(y)f(Prolog)f(term)i(and)f(is)g(written)h(as)f(a)g(list.)22 b(The)16 b(empt)o(y)f(list)g(represen)o(ts)i(an)74 331 y(empt)o(y)d(sequence)i(of)d(terminals.)33 414 y Fg(\017)20 b Fm(a)14 b(sequence)i(is)e(expressed)i(using)d(the)i(Prolog)e (conjunction)h(op)q(erator)g Fh(\()p Fm(\(','\)/2\).)33 497 y Fg(\017)20 b Fm(the)12 b(head)f(of)g(a)g(grammar)f(rule)h (consists)h(of)f(a)f(non-terminal)h(optionally)e(follo)o(w)o(ed)g(b)o (y)i(a)g(sequence)i(of)e(terminals)74 547 y(\(i.e.)18 b(a)13 b(Prolog)h(list\).)33 630 y Fg(\017)20 b Fm(the)h(b)q(o)q(dy)f (of)g(a)f(grammar)g(rule)i(consists)g(of)e(a)h(sequence)i(of)e (non-terminals,)g(terminals,)h(predicate)g(call,)74 679 y(disjunction)14 b(\(using)g Fh(;/2)p Fm(\),)f(if-then)h(\(using)g Fh(\(->\)/2)p Fm(\))f(or)h(cut)g(\(using)g Fh(!)p Fm(\).)33 762 y Fg(\017)20 b Fm(a)14 b(predicate)h(call)e(m)o(ust)g(b)q(e)i (enclosed)g(in)e(curly)h(brac)o(k)o(ets)h(\(using)f Fh({}/1)p Fm(\).)j(This)d(mak)o(es)f(it)h(p)q(ossible)g(to)f(express)74 812 y(an)h(extra)g(condition.)-30 895 y(A)i(grammar)f(rule)h(is)g (nothing)f(but)h(a)f(\\syn)o(tactic)h(sugar")g(for)f(a)h(Prolog)f (clause.)24 b(Eac)o(h)16 b(grammar)f(rule)h(accepts)h(as)-30 945 y(input)i(a)f(list)g(of)g(terminals)g(\(tok)o(ens\),)i(parses)f(a)g (pre\014x)g(of)e(this)i(list)f(and)g(giv)o(es)g(as)h(output)g(the)g (rest)g(of)f(this)h(list)-30 995 y(\(p)q(ossibly)f(enlarged\).)30 b(This)17 b(rest)i(is)e(generally)h(parsed)g(later.)29 b(So,)18 b(eac)o(h)g(a)g(grammar)e(rule)i(is)f(translated)i(in)o(to)d (a)-30 1045 y(Prolog)c(clause)h(that)f(explicitly)g(the)h(manages)f (the)h(list.)k(Tw)o(o)12 b(argumen)o(ts)g(are)h(then)g(added:)18 b(the)13 b(input)f(list)g(\()p Fh(Start)p Fm(\))-30 1095 y(and)i(the)h(output)f(list)f(\()p Fh(Stop)p Fm(\).)18 b(F)m(or)13 b(instance:)74 1178 y Fh(p)22 b(-->)f(q.)-30 1261 y Fm(is)14 b(translated)h(in)o(to:)74 1344 y Fh(p\(Start,)20 b(End\))h(:-)h(q\(Start,)e(End\).)-30 1427 y Fm(Extra)15 b(argumen)o(ts)f(can)g(b)q(e)g(pro)o(vided)g(and)g(the)g(b)q(o)q(dy)g (of)f(the)i(rule)f(can)g(con)o(tain)f(sev)o(eral)i(non-terminals.)i (Example:)74 1510 y Fh(p\(X,)k(Y\))h(-->)249 1559 y(q\(X\),)249 1609 y(r\(X,)f(Y\),)249 1659 y(s\(Y\).)-30 1742 y Fm(is)14 b(translated)h(in)o(to:)74 1825 y Fh(p\(X,)21 b(Y,)h(Start,)e(End\))h (:-)249 1875 y(q\(X,)g(Start,)f(A\),)249 1925 y(r\(X,)h(Y,)g(A,)g(B\),) 249 1975 y(s\(Y,)g(B,)g(End\).)-30 2058 y Fm(T)m(erminals)13 b(are)i(translated)f(using)g(uni\014cation:)74 2141 y Fh(assign\(X,Y\))20 b(-->)h(left\(X\),)f([:=],)h(right\(Y\),)f([;].)-30 2224 y Fm(is)14 b(translated)h(in)o(to:)74 2307 y Fh (assign\(X,Y,Start,En)o(d\))k(:-)249 2356 y(left\(X,)h(Start,)g(A\),) 249 2406 y(A=[:=|B],)249 2456 y(right\(Y,)g(B,)h(C\),)249 2506 y(C=[;|End].)-30 2589 y Fm(T)m(erminals)13 b(app)q(earing)h(on)g (the)g(left-hand)g(side)g(of)f(a)h(rule)g(are)g(connected)i(to)e(the)g (output)g(argumen)o(t)g(of)f(the)i(head.)-30 2689 y(It)i(is)f(p)q (ossible)h(to)f(include)h(a)f(call)f(to)h(a)h(prolog)e(predicate)j (enclosing)e(it)g(in)g(curly)g(brac)o(k)o(ets)i(\(to)e(distinguish)g (them)-30 2738 y(from)e(non-terminals\):)74 2821 y Fh(assign\(X,Y\))20 b(-->)h(left\(X\),)f([:=],)h(right\(Y0\),)f({Y)h(is)g(Y0)h(},)f([;].) -30 2904 y Fm(is)14 b(translated)h(in)o(to:)p eop end %%Page: 111 113 TeXDict begin 111 112 bop -30 -45 a Fm(7.17)41 b(T)m(erm)13 b(expansion)1424 b(111)p -30 -27 1890 4 v 74 115 a Fh (assign\(X,Y,Start,En)o(d\))19 b(:-)249 165 y(left\(X,)h(Start,)g(A\),) 249 215 y(A=[:=|B],)249 264 y(right\(Y0,)g(B,)h(C\),)249 314 y(Y)g(is)h(Y0,)249 364 y(C=[;|End].)-30 447 y Fm(Cut,)g (disjunction)f(and)f(if-then\(-else\))h(are)g(translated)g(literally)f (\(and)g(do)h(not)f(need)i(to)e(b)q(e)h(enclosed)h(in)e(curly)-30 497 y(brac)o(k)o(ets\).)-30 655 y Fi(7.17.2)48 b Fh(expand)p 275 655 14 2 v 15 w(term/2)p Fi(,)15 b Fh(term)p 538 655 V 14 w(expansion/2)-30 781 y Fi(T)l(emplates)74 864 y Fh(expand)p 209 864 V 15 w(term\(?term,)k(?term\))74 914 y(term)p 165 914 V 15 w(expansion\(?term,)g(?term\))-30 997 y Fi(Description)-30 1096 y Fh(expand)p 105 1096 V 15 w(term\(Term1,)g(Term2\))13 b Fm(succeeds)j(if)h Fh(Term2)12 b Fm(is)i(a)f(transformation)g(of)k Fh(Term1)p Fm(.)g(The)d(transformation)f(steps)-30 1146 y(are)i(as)f(follo)o(ws:) 33 1229 y Fg(\017)20 b Fm(if)d Fh(Term1)12 b Fm(is)i(a)g(v)n(ariable,)e (it)h(is)h(uni\014ed)g(with)g Fh(Term2)33 1312 y Fg(\017)20 b Fm(if)c Fh(term)p 206 1312 V 15 w(expansion\(Term1,)j(Term2\))12 b Fm(succeeds)k Fh(Term2)d Fm(is)g(assumed)h(to)g(b)q(e)g(the)g (transformation)f(of)j Fh(Term1)p Fm(.)33 1395 y Fg(\017)k Fm(if)d Fh(Term1)12 b Fm(is)i(a)g(DCG)f(then)h Fh(Term2)f Fm(is)h(its)g(translation)f(\(section)i(7.17.1,)c(page)j(109\).)33 1478 y Fg(\017)20 b Fm(otherwise)15 b Fh(Term2)e Fm(is)h(uni\014ed)g (with)f Fh(Term1)p Fm(.)-30 1561 y Fh(term)p 61 1561 V 15 w(expansion\(Term1,)19 b(Term2\))9 b Fm(is)i(a)f(ho)q(ok)g (predicate)i(allo)o(wing)d(the)i(user)h(to)e(de\014ne)i(a)e(sp)q (eci\014c)j(transformation.)-30 1661 y(The)21 b(GNU)g(Prolog)f (compiler)g(\(section)h(3.4,)g(page)f(20\))h(automatically)d(calls)i Fh(expand)p 1424 1661 V 15 w(term/2)f Fm(on)h(eac)o(h)h Fh(Term1)-30 1711 y Fm(read)h(in.)39 b(Ho)o(w)o(ev)o(er,)23 b(in)e(the)h(curren)o(t)g(release,)i(only)c(DCG)h(transformation)f(are) h(done)h(b)o(y)f(the)g(compiler)g(\(i.e.)-30 1761 y Fh(term)p 61 1761 V 15 w(expansion/2)15 b Fm(cannot)i(b)q(e)g(used\).)28 b(T)m(o)16 b(use)i Fh(term)p 894 1761 V 15 w(expansion/2)p Fm(,)c(it)j(is)f(necessary)j(to)e(call)f Fh(expand)p 1718 1761 V 14 w(term/2)-30 1810 y Fm(explicitly)m(.)-30 1910 y Fi(Errors)-30 2010 y Fm(None.)-30 2109 y Fi(P)o(ortabilit)o(y) -30 2209 y Fm(GNU)e(Prolog)f(predicate.)-30 2367 y Fi(7.17.3)48 b Fh(phrase/3)p Fi(,)15 b Fh(phrase/2)-30 2493 y Fi(T)l(emplates)74 2576 y Fh(phrase\(?term,)k(?list,)i(?list\))74 2626 y(phrase\(?term,)e (?list\))-30 2709 y Fi(Description)-30 2809 y Fh(phrase\(Phrase,)g (List,)i(Remainder\))11 b Fm(succeeds)k(if)d(the)h(list)f Fh(List)g Fm(is)g(in)g(the)h(language)f(de\014ned)i(b)o(y)e(the)h (grammar)-30 2858 y(rule)i(b)q(o)q(dy)f Fh(Phrase)p Fm(.)j Fh(Remainder)12 b Fm(is)i(what)f(remains)h(of)f(the)i(list)e(after)i(a) e(phrase)i(has)f(b)q(een)h(found.)p eop end %%Page: 112 114 TeXDict begin 112 113 bop -30 -45 a Fm(112)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fh(phrase\(Phrase,)19 b(List\))13 b Fm(is)h(equiv)n(alen)o(t)f(to)h Fh(phrase\(Phrase,)19 b(List,)h([]\))p Fm(.)-30 215 y Fi(Errors)p -30 270 1890 2 v -30 320 2 50 v -3 305 a Fh(List)13 b Fm(is)h(neither)h(a)e(list)h (nor)g(a)f(partial)g(list)p 915 320 V 258 w Fh(type)p 1032 305 14 2 v 15 w(error\(list,)19 b(List\))p 1859 320 2 50 v -30 322 1890 2 v -30 371 2 50 v -3 356 a(Remainder)12 b Fm(is)i(neither)h(a)e(list)h(nor)f(a)h(partial)f(list)p 915 371 V 149 w Fh(type)p 1032 356 14 2 v 15 w(error\(list,)19 b(Remainder\))p 1859 371 2 50 v -30 373 1890 2 v -30 456 a Fi(P)o(ortabilit)o(y)-30 556 y Fm(GNU)14 b(Prolog)f(predicates.) -30 722 y Ff(7.18)56 b(Logic,)18 b(con)n(trol)g(and)h(exceptions)-30 848 y Fi(7.18.1)48 b Fh(abort/0)p Fi(,)15 b Fh(stop/0)p Fi(,)g Fh(top)p 551 848 14 2 v 15 w(level/0)p Fi(,)g Fh(break/0)p Fi(,)f Fh(halt/1)p Fi(,)h Fh(halt/0)-30 974 y Fi(T)l(emplates)74 1057 y Fh(abort)74 1107 y(stop)74 1157 y(top)p 143 1157 V 15 w(level)74 1207 y(break)74 1257 y(halt\(+integer\))74 1306 y(halt)-30 1390 y Fi(Description)-30 1489 y Fh(abort)e Fm(ab)q(orts)h(the)h(curren)o(t)g(execution.)k(If)13 b(this)h(execution)h(w)o(as)f(initiated)f(under)h(a)g(top-lev)o(el)f (the)h(con)o(trol)g(is)g(giv)o(en)-30 1539 y(bac)o(k)k(to)g(the)g (top-lev)o(el)f(and)h(the)g(message)h Fh({execution)h(aborted})c Fm(is)h(displa)o(y)o(ed.)29 b(Otherwise,)20 b(e.g.)29 b(execution)-30 1589 y(started)19 b(b)o(y)f(a)f Fh(initialization/1)d Fm(directiv)o(e)19 b(\(section)f(6.1.13,)e(page)i(45\),)g Fh(abort/0)e Fm(is)h(equiv)n(alen)o(t)g(to)h Fh(halt\(1\))-30 1639 y Fm(\(see)e(b)q(elo)o(w\).)-30 1738 y Fh(stop)g Fm(stops)h(the)g(curren)o(t)g(execution.)26 b(If)16 b(this)g(execution) h(w)o(as)g(initiated)e(under)i(a)f(top-lev)o(el)g(the)h(con)o(trol)f (is)g(giv)o(en)-30 1788 y(bac)o(k)e(to)g(the)h(top-lev)o(el.)i (Otherwise,)e Fh(stop/0)e Fm(is)g(equiv)n(alen)o(t)g(to)h Fh(halt\(0\))f Fm(\(see)i(b)q(elo)o(w\).)-30 1888 y Fh(top)p 39 1888 V 16 w(level)i Fm(starts)i(a)f(new)g(recursiv)o(e)i(top-lev)o (el)e(\(including)f(the)i(banner)g(displa)o(y\).)30 b(T)m(o)17 b(end)i(this)f(new)h(top-lev)o(el)-30 1937 y(simply)13 b(t)o(yp)q(e)i(the)f(end-of-\014le)g(k)o(ey)g(sequence)i(\()p Fh(Ctl-D)p Fm(\))d(or)h(its)g(term)g(represen)o(tation:)19 b Fh(end)p 1427 1937 V 16 w(of)p 1487 1937 V 15 w(file.)-30 2037 y(break)g Fm(in)o(v)o(ok)o(es)f(a)h(recursiv)o(e)i(top-lev)o(el)d (\(no)h(banner)h(is)f(displa)o(y)o(ed\).)33 b(T)m(o)19 b(end)g(this)g(new)h(lev)o(el)f(simply)f(t)o(yp)q(e)i(the)-30 2087 y(end-of-\014le)14 b(k)o(ey)g(sequence)i(\()p Fh(Ctl-D)p Fm(\))d(or)h(its)g(term)g(represen)o(tation:)20 b Fh(end)p 1130 2087 V 15 w(of)p 1189 2087 V 15 w(file.)-30 2187 y(halt\(Status\))10 b Fm(causes)k(the)e(GNU)g(Prolog)g(pro)q(cess)i(to) e(immediately)e(exit)j(bac)o(k)f(to)g(the)g(shell)g(with)g(the)h (return)g(co)q(de)-30 2236 y Fh(Status)p Fm(.)-30 2336 y Fh(halt)g Fm(is)h(equiv)n(alen)o(t)f(to)h Fh(halt\(0\))p Fm(.)-30 2436 y Fi(Errors)p -30 2491 1890 2 v -30 2541 2 50 v -3 2526 a Fh(Status)f Fm(is)g(a)h(v)n(ariable)p 915 2541 V 580 w Fh(instantiation)p 1230 2526 14 2 v 13 w(error)p 1859 2541 2 50 v -30 2543 1890 2 v -30 2592 2 50 v -3 2578 a(Status)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an) h(in)o(teger)p 915 2592 V 172 w Fh(type)p 1032 2578 14 2 v 15 w(error\(integer,)19 b(Status\))p 1859 2592 2 50 v -30 2594 1890 2 v -30 2677 a Fi(P)o(ortabilit)o(y)-30 2777 y Fh(halt/1)c Fm(and)h Fh(halt/0)e Fm(are)i(ISO)g(predicates.)25 b Fh(abort/0)p Fm(,)15 b Fh(stop/0)p Fm(,)f Fh(top)p 1129 2777 14 2 v 15 w(level/0)g Fm(and)i Fh(break/0)e Fm(are)i(GNU)g(Prolog)-30 2826 y(predicates.)p eop end %%Page: 113 115 TeXDict begin 113 114 bop -30 -45 a Fm(7.18)41 b(Logic,)13 b(con)o(trol)g(and)h(exceptions)1182 b(113)p -30 -27 1890 4 v -30 115 a Fi(7.18.2)48 b Fh(once/1)p Fi(,)15 b Fh(\(\\+\)/1)g Fi(-)h(not)e(pro)o(v)m(able,)i Fh(call/2-11)p Fi(,)e Fh(call)p 1085 115 14 2 v 15 w(with)p 1188 115 V 15 w(args/1-11)p Fi(,)g Fh(call)p 1516 115 V 15 w(det/2)-30 241 y Fi(T)l(emplates)74 324 y Fh(once\(+callable)p 385 324 V 13 w(term\))74 374 y(\\+\(+callable)p 341 374 V 13 w(term\))74 424 y(call\(+callable)p 385 424 V 13 w(term,)21 b(+term,...,)f(+term\))74 474 y(call)p 165 474 V 15 w(with)p 268 474 V 15 w(args\(+atom,)f(+term,...,)h(+term\))74 524 y(call)p 165 524 V 15 w(det\(+callable)p 466 524 V 13 w(term,)h(?boolean\))-30 607 y Fi(Description)-30 706 y Fh(once\(Goal\))9 b Fm(succeeds)14 b(if)f Fh(call\(Goal\))c Fm(succeeds.)19 b(Ho)o(w)o(ev)o(er)12 b Fh(once/1)d Fm(is)i(not)g (re-executable)h(on)f(bac)o(ktrac)o(king)f(since)-30 756 y(all)j(alternativ)o(es)h(of)j Fh(Goal)c Fm(are)h(cut.)19 b Fh(once\(Goal\))11 b Fm(is)j(equiv)n(alen)o(t)f(to)h Fh(call\(Goal\),)20 b(!)p Fm(.)-30 856 y Fh(\\+)i(Goal)9 b Fm(succeeds)k(if)g Fh(call\(Goal\))8 b Fm(fails)h(and)i(fails)e (otherwise.)18 b(This)10 b(built-in)f(predicate)i(giv)o(es)g(negation)e (b)o(y)h(failure.)-30 955 y Fh(call\(Closure,)20 b(Arg1,...,)g(ArgN\)) 15 b Fm(calls)h(the)i(goal)d Fh(call\(Goal\))g Fm(where)j Fh(Goal)d Fm(is)i(constructed)i(b)o(y)d(app)q(ending)-30 1005 y Fh(Arg1,...,)k(ArgN)13 b Fm(\(1)f Fg(\024)g Fh(N)f Fg(\024)h Fm(10\))h(additional)f(argumen)o(ts)i(to)g(the)h(argumen)o (ts)f(\(if)f(an)o(y\))h(of)i Fh(Closure)p Fm(.)-30 1105 y Fh(call)p 61 1105 V 15 w(with)p 164 1105 V 15 w(args\(Functor,)j (Arg1,...,)h(ArgN\))14 b Fm(calls)h(the)h(goal)e(whose)i(functor)g(is)f Fh(Functor)f Fm(and)h(whose)h(argu-)-30 1155 y(men)o(ts)f(are)f Fh(Arg1)p Fm(,.)5 b(.)i(.)f(,)13 b Fh(ArgN)h Fm(\(0)d Fg(\024)h Fh(N)f Fg(\024)h Fm(10\).)-30 1254 y Fh(call)p 61 1254 V 15 w(det\(Goal,)20 b(Deterministic\))e Fm(succeeds)24 b(if)f Fh(call\(Goal\))c Fm(succeeds)k(and)e(uni\014es)g Fh(Deterministic)e Fm(with)-30 1304 y Fh(true)13 b Fm(if)k Fh(Goal)c Fm(has)h(not)g(created)h(an)o(y)e(c)o(hoice-p)q(oin)o(ts,)h (with)g Fh(false)e Fm(otherwise.)-30 1404 y Fh(\\+)i Fm(is)g(a)f(prede\014ned)j(pre\014x)f(op)q(erator)f(\(section)h (7.14.10,)c(page)j(100\).)-30 1503 y Fi(Errors)p -30 1559 1890 2 v -30 1609 2 50 v -3 1594 a Fh(Goal)f Fm(is)h(a)f(v)n (ariable)p 915 1609 V 624 w Fh(instantiation)p 1230 1594 14 2 v 13 w(error)p 1859 1609 2 50 v -30 1610 1890 2 v -30 1660 2 50 v -3 1645 a(Goal)g Fm(is)h(neither)h(a)e(v)n(ariable)g (nor)h(a)f(callable)g(term)p 915 1660 V 127 w Fh(type)p 1032 1645 14 2 v 15 w(error\(callable,)19 b(Goal\))p 1859 1660 2 50 v -30 1662 1890 2 v -30 1861 2 200 v -3 1697 a Fm(The)14 b(predicate)h(indicator)f Fh(Pred)f Fm(of)j Fh(Goal)d Fm(do)q(es)i(not)-3 1747 y(corresp)q(ond)h(to)d(an)h (existing)f(pro)q(cedure)j(and)e(the)-3 1796 y(v)n(alue)f(of)h(the)g Fh(unknown)e Fm(Prolog)i(\015ag)f(is)h Fh(error)-3 1846 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1861 V 941 1697 a Fh(existence)p 1142 1697 14 2 v 14 w(error\(procedure,)k (Pred\))p 1859 1861 2 200 v -30 1863 1890 2 v -30 1913 2 50 v -3 1898 a(Functor)12 b Fm(is)i(a)g(v)n(ariable)p 915 1913 V 558 w Fh(instantiation)p 1230 1898 14 2 v 13 w(error)p 1859 1913 2 50 v -30 1914 1890 2 v -30 1964 2 50 v -3 1949 a(Functor)e Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i (an)g(atom)p 915 1964 V 180 w Fh(type)p 1032 1949 14 2 v 15 w(error\(atom,)19 b(Functor\))p 1859 1964 2 50 v -30 1966 1890 2 v -30 2065 2 100 v -3 2001 a(Deterministic)11 b Fm(is)j(neither)h(a)e(v)n(ariable)g(nor)h(a)-3 2050 y(b)q(o)q(olean)p 915 2065 V 941 2001 a Fh(type)p 1032 2001 14 2 v 15 w(error\(boolean,)19 b(Deterministic\))p 1859 2065 2 100 v -30 2067 1890 2 v -30 2216 2 150 v -3 2102 a Fm(for)14 b Fh(call/2-11)e Fm(the)i(resulting)g(arit)o(y)f (of)k Fh(Goal)c Fm(\(arit)o(y)-3 2152 y(of)g Fh(Closure)8 b Fm(+)i Fh(N)o Fm(\))k(is)g(an)g(in)o(teger)g Fb(>)g Fh(max)p 651 2152 14 2 v 15 w(arity)f Fm(\015ag)-3 2201 y(\(section)i(7.22.1,)c(page)j(133\))p 915 2216 2 150 v 941 2102 a Fh(representation)p 1252 2102 14 2 v 13 w(error\(max)p 1463 2102 V 14 w(arity\))p 1859 2216 2 150 v -30 2218 1890 2 v -30 2301 a Fi(P)o(ortabilit)o(y)-30 2401 y Fh(once/1)j Fm(and)i Fh(\(\\+\)/1)e Fm(are)h(ISO)h(predicates,)h Fh(call/2-11)p Fm(,)d Fh(call)p 1047 2401 14 2 v 15 w(with)p 1150 2401 V 15 w(args/1-11)f Fm(and)j Fh(call)p 1553 2401 V 14 w(det/2)f Fm(are)g(GNU)-30 2450 y(Prolog)c(predicates.)-30 2608 y Fi(7.18.3)48 b Fh(repeat/0)-30 2734 y Fi(T)l(emplates)74 2817 y Fh(repeat)-30 2901 y Fi(Description)p eop end %%Page: 114 116 TeXDict begin 114 115 bop -30 -45 a Fm(114)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fh(repeat)c Fm(generates)j(an)d(in\014nite)h (sequence)i(of)d(bac)o(ktrac)o(king)h(c)o(hoices.)18 b(The)11 b(purp)q(ose)h(is)f(to)g(rep)q(eatedly)h(p)q(erform)f(some)-30 165 y(action)16 b(on)f(elemen)o(ts)h(whic)o(h)g(are)g(someho)o(w)f (generated,)i(e.g.)22 b(b)o(y)16 b(reading)f(them)h(from)f(a)g(stream,) h(un)o(til)e(some)i(test)-30 215 y(b)q(ecomes)i(true.)27 b(Rep)q(eat)16 b(lo)q(ops)g(cannot)h(con)o(tribute)g(to)f(the)h(logic)f (of)g(the)h(program.)25 b(They)16 b(are)h(only)f(meaningful)-30 264 y(if)e(the)h(action)g(in)o(v)o(olv)o(es)e(side-e\013ects.)22 b(The)15 b(only)f(reason)h(for)g(using)f(rep)q(eat)i(lo)q(ops)e (instead)h(of)f(a)g(more)g(natural)g(tail-)-30 314 y(recursiv)o(e)i (form)o(ulation)c(is)i(e\016ciency:)20 b(when)14 b(the)h(test)g(fails)f (bac)o(k,)f(the)i(Prolog)e(engine)i(immediately)e(reclaims)h(an)o(y)-30 364 y(w)o(orking)f(storage)i(consumed)f(since)h(the)g(call)e(to)g Fh(repeat/0)p Fm(.)-30 464 y Fi(Errors)-30 563 y Fm(None.)-30 663 y Fi(P)o(ortabilit)o(y)-30 762 y Fm(ISO)i(predicate.)-30 918 y Fi(7.18.4)48 b Fh(for/3)-30 1045 y Fi(T)l(emplates)74 1119 y Fh(for\(?integer,)19 b(+integer,)h(+integer\))-30 1193 y Fi(Description)-30 1293 y Fh(for\(Counter,)g(Lower,)g(Upper\))15 b Fm(generates)i(an)f(sequence)i(of)d(bac)o(ktrac)o(king)h(c)o(hoices)h (instan)o(tiating)e Fh(Counter)f Fm(to)-30 1343 y(the)h(v)n(alues)f Fh(Lower)p Fm(,)e Fh(Lower+1)p Fm(,.)t(.)7 b(.)f(,)14 b Fh(Upper)p Fm(.)-30 1442 y Fi(Errors)p -30 1498 1890 2 v -30 1548 2 50 v -3 1533 a Fh(Counter)e Fm(is)i(neither)h(a)f(v)n (ariable)e(nor)i(an)g(in)o(teger)p 915 1548 V 150 w Fh(type)p 1032 1533 14 2 v 15 w(error\(integer,)19 b(Counter\))p 1859 1548 2 50 v -30 1549 1890 2 v -30 1599 2 50 v -3 1584 a(Lower)13 b Fm(is)h(a)f(v)n(ariable)p 915 1599 V 602 w Fh(instantiation)p 1230 1584 14 2 v 13 w(error)p 1859 1599 2 50 v -30 1601 1890 2 v -30 1651 2 50 v -3 1636 a(Lower)g Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f(in)o (teger)p 915 1651 V 194 w Fh(type)p 1032 1636 14 2 v 15 w(error\(integer,)19 b(Lower\))p 1859 1651 2 50 v -30 1652 1890 2 v -30 1702 2 50 v -3 1687 a(Upper)13 b Fm(is)h(a)f(v)n(ariable)p 915 1702 V 602 w Fh(instantiation)p 1230 1687 14 2 v 13 w(error)p 1859 1702 2 50 v -30 1704 1890 2 v -30 1754 2 50 v -3 1739 a(Upper)g Fm(is)h(neither)g(a)g(v)n (ariable)f(nor)h(an)f(in)o(teger)p 915 1754 V 194 w Fh(type)p 1032 1739 14 2 v 15 w(error\(integer,)19 b(Upper\))p 1859 1754 2 50 v -30 1755 1890 2 v -30 1838 a Fi(P)o(ortabilit)o(y)-30 1938 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2102 y Ff(7.19)56 b(A)n(tomic)19 b(term)e(pro)r(cessing)-30 2228 y Fm(These)f(built-in)c (predicates)k(enable)e(atomic)f(terms)i(to)e(b)q(e)i(pro)q(cessed)h(as) e(a)g(sequence)i(of)d(c)o(haracters)j(and)e(c)o(haracter)-30 2278 y(co)q(des.)19 b(F)m(acilities)11 b(exist)h(to)g(split)f(and)h (join)f(atoms,)g(to)h(con)o(v)o(ert)g(a)g(single)f(c)o(haracter)i(to)f (and)g(from)f(the)h(corresp)q(onding)-30 2328 y(c)o(haracter)k(co)q (de,)e(and)g(to)f(con)o(v)o(ert)i(a)f(n)o(um)o(b)q(er)g(to)f(and)h (from)f(a)h(list)f(of)h(c)o(haracters)h(and)f(c)o(haracter)h(co)q(des.) -30 2484 y Fi(7.19.1)48 b Fh(atom)p 231 2484 14 2 v 15 w(length/2)-30 2610 y Fi(T)l(emplates)74 2684 y Fh(atom)p 165 2684 V 15 w(length\(+atom,)19 b(?integer\))-30 2759 y Fi(Description)-30 2858 y Fh(atom)p 61 2858 V 15 w(length\(Atom,)h (Length\))14 b Fm(succeeds)19 b(if)g Fh(Length)c Fm(uni\014es)h(with)g (the)h(n)o(um)o(b)q(er)g(of)e(c)o(haracters)j(of)e(the)h(name)f(of)-30 2908 y Fh(Atom)p Fm(.)p eop end %%Page: 115 117 TeXDict begin 115 116 bop -30 -45 a Fm(7.19)41 b(A)o(tomic)13 b(term)h(pro)q(cessing)1283 b(115)p -30 -27 1890 4 v -30 115 a Fi(Errors)p -30 171 1890 2 v -30 220 2 50 v -3 205 a Fh(Atom)13 b Fm(is)h(a)f(v)n(ariable)p 915 220 V 624 w Fh(instantiation)p 1230 205 14 2 v 13 w(error)p 1859 220 2 50 v -30 222 1890 2 v -30 272 2 50 v -3 257 a(Atom)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(atom)p 915 272 V 245 w Fh(type)p 1032 257 14 2 v 15 w(error\(atom,)19 b(Atom\))p 1859 272 2 50 v -30 273 1890 2 v -30 323 2 50 v -3 308 a(Length)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an) h(in)o(teger)p 915 323 V 172 w Fh(type)p 1032 308 14 2 v 15 w(error\(integer,)19 b(Length\))p 1859 323 2 50 v -30 325 1890 2 v -30 375 2 50 v -3 360 a(Length)13 b Fm(is)g(an)h(in)o(teger)g Fb(<)g Fm(0)p 915 375 V 496 w Fh(domain)p 1076 360 14 2 v 15 w(error\(not)p 1289 360 V 13 w(less)p 1390 360 V 15 w(than)p 1493 360 V 15 w(zero,)21 b(Length\))p 1859 375 2 50 v -30 376 1890 2 v -30 459 a Fi(P)o(ortabilit)o(y)-30 559 y Fm(ISO)15 b(predicate.)-30 717 y Fi(7.19.2)48 b Fh(atom)p 231 717 14 2 v 15 w(concat/3)-30 843 y Fi(T)l(emplates)74 926 y Fh(atom)p 165 926 V 15 w(concat\(+atom,)19 b(+atom,)i(?atom\))74 976 y(atom)p 165 976 V 15 w(concat\(?atom,)e(?atom,)i(+atom\))-30 1059 y Fi(Description)-30 1158 y Fh(atom)p 61 1158 V 15 w(concat\(Atom1,)e(Atom2,)i(Atom12\))11 b Fm(succeeds)16 b(if)c(the)h(name)g(of)i Fh(Atom12)d Fm(is)g(the)i(concatenation)f(of)f (the)h(name)-30 1208 y(of)20 b Fh(Atom1)d Fm(with)g(the)g(name)h(of)h Fh(Atom1)p Fm(.)28 b(This)17 b(predicate)h(is)f(re-executable)i(on)f (bac)o(ktrac)o(king)f(\(e.g.)28 b(if)19 b Fh(Atom12)d Fm(is)-30 1258 y(instan)o(tiated)e(and)g(b)q(oth)g Fh(Atom1)f Fm(and)g Fh(Atom2)g Fm(are)i(v)n(ariables\).)-30 1358 y Fi(Errors)p -30 1413 1890 2 v -30 1463 2 50 v -3 1448 a Fh(Atom1)e Fm(and)h Fh(Atom12)e Fm(are)i(v)n(ariables)p 915 1463 V 368 w Fh(instantiation)p 1230 1448 14 2 v 13 w(error)p 1859 1463 2 50 v -30 1465 1890 2 v -30 1515 2 50 v -3 1500 a(Atom2)f Fm(and)h Fh(Atom12)e Fm(are)i(v)n(ariables)p 915 1515 V 368 w Fh(instantiation)p 1230 1500 14 2 v 13 w(error)p 1859 1515 2 50 v -30 1516 1890 2 v -30 1566 2 50 v -3 1551 a(Atom1)f Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f (atom)p 915 1566 V 224 w Fh(type)p 1032 1551 14 2 v 15 w(error\(atom,)19 b(Atom1\))p 1859 1566 2 50 v -30 1568 1890 2 v -30 1618 2 50 v -3 1603 a(Atom2)13 b Fm(is)h(neither)g(a)g(v)n (ariable)f(nor)h(an)f(atom)p 915 1618 V 224 w Fh(type)p 1032 1603 14 2 v 15 w(error\(atom,)19 b(Atom2\))p 1859 1618 2 50 v -30 1619 1890 2 v -30 1669 2 50 v -3 1654 a(Atom12)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(atom)p 915 1669 V 202 w Fh(type)p 1032 1654 14 2 v 15 w(error\(atom,)19 b(Atom12\))p 1859 1669 2 50 v -30 1671 1890 2 v -30 1754 a Fi(P)o(ortabilit)o(y)-30 1853 y Fm(ISO)c(predicate.)-30 2011 y Fi(7.19.3)48 b Fh(sub)p 209 2011 14 2 v 15 w(atom/5)-30 2137 y Fi(T)l(emplates)74 2220 y Fh(sub)p 143 2220 V 15 w(atom\(+atom,)20 b(?integer,)g(?integer,)g(?integer,)g(?atom\))-30 2303 y Fi(Description)-30 2403 y Fh(sub)p 39 2403 V 16 w(atom\(Atom,)f(Before,)i(Length,)f(After,)h(SubAtom\))e Fm(succeeds)24 b(if)c(atom)h Fh(Atom)f Fm(can)i(b)q(e)f(split)g(in)o (to)g(three)-30 2453 y(atoms,)14 b Fh(AtomL)p Fm(,)g Fh(SubAtom)f Fm(and)h Fh(AtomR)g Fm(suc)o(h)h(that)g Fh(Before)e Fm(is)i(the)g(n)o(um)o(b)q(er)g(of)f(c)o(haracters)j(of)d (the)h(name)f(of)k Fh(AtomL)p Fm(,)-30 2503 y Fh(Length)12 b Fm(is)g(the)h(n)o(um)o(b)q(er)g(of)e(c)o(haracters)j(of)e(the)h(name) f(of)j Fh(SubAtom)c Fm(and)i Fh(After)e Fm(is)h(the)h(n)o(um)o(b)q(er)g (of)f(c)o(haracters)i(of)e(the)-30 2552 y(name)i(of)j Fh(AtomR)p Fm(.)12 b(This)i(predicate)h(is)f(re-executable)h(on)f(bac)o (ktrac)o(king.)-30 2652 y Fi(Errors)p eop end %%Page: 116 118 TeXDict begin 116 117 bop -30 -45 a Fm(116)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(Atom)f Fm(is)h(a)f(v)n(ariable)p 915 125 V 624 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(Atom)g Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(an)g(atom)p 915 176 V 245 w Fh(type)p 1032 161 14 2 v 15 w(error\(atom,)19 b(Atom\))p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(SubAtom)12 b Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i(an)g(atom)p 915 228 V 180 w Fh(type)p 1032 213 14 2 v 15 w(error\(atom,)19 b(SubAtom\))p 1859 228 2 50 v -30 229 1890 2 v -30 279 2 50 v -3 264 a(Before)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g (an)h(in)o(teger)p 915 279 V 172 w Fh(type)p 1032 264 14 2 v 15 w(error\(integer,)19 b(Before\))p 1859 279 2 50 v -30 281 1890 2 v -30 331 2 50 v -3 316 a(Length)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(in)o(teger)p 915 331 V 172 w Fh(type)p 1032 316 14 2 v 15 w(error\(integer,)19 b(Length\))p 1859 331 2 50 v -30 332 1890 2 v -30 382 2 50 v -3 367 a(After)13 b Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h (an)f(in)o(teger)p 915 382 V 194 w Fh(type)p 1032 367 14 2 v 15 w(error\(integer,)19 b(After\))p 1859 382 2 50 v -30 384 1890 2 v -30 434 2 50 v -3 419 a(Before)13 b Fm(is)g(an)h(in)o(teger)g Fb(<)g Fm(0)p 915 434 V 496 w Fh(domain)p 1076 419 14 2 v 15 w(error\(not)p 1289 419 V 13 w(less)p 1390 419 V 15 w(than)p 1493 419 V 15 w(zero,)21 b(Before\))p 1859 434 2 50 v -30 435 1890 2 v -30 485 2 50 v -3 470 a(Length)13 b Fm(is)g(an)h(in)o(teger)g Fb(<)g Fm(0)p 915 485 V 496 w Fh(domain)p 1076 470 14 2 v 15 w(error\(not)p 1289 470 V 13 w(less)p 1390 470 V 15 w(than)p 1493 470 V 15 w(zero,)21 b(Length\))p 1859 485 2 50 v -30 487 1890 2 v -30 537 2 50 v -3 522 a(After)13 b Fm(is)h(an)f(in)o(teger)i Fb(<)f Fm(0)p 915 537 V 517 w Fh(domain)p 1076 522 14 2 v 15 w(error\(not)p 1289 522 V 13 w(less)p 1390 522 V 15 w(than)p 1493 522 V 15 w(zero,)21 b(After\))p 1859 537 2 50 v -30 538 1890 2 v -30 621 a Fi(P)o(ortabilit)o(y)-30 721 y Fm(ISO)15 b(predicate.)-30 876 y Fi(7.19.4)48 b Fh(char)p 231 876 14 2 v 15 w(code/2)-30 1003 y Fi(T)l(emplates)74 1075 y Fh(char)p 165 1075 V 15 w(code\(+character,)19 b(?character)p 771 1075 V 13 w(code\))74 1125 y(char)p 165 1125 V 15 w(code\(-character,)g(+character)p 771 1125 V 13 w(code\))-30 1197 y Fi(Description)-30 1297 y Fh(char)p 61 1297 V 15 w(code\(Char,)h(Code\))13 b Fm(succeeds)j(if)d(the)i(c)o(haracter)g (co)q(de)g(for)e(the)i(one-c)o(har)f(atom)f Fh(Char)g Fm(is)h Fh(Code)p Fm(.)-30 1396 y Fi(Errors)p -30 1452 1890 2 v -30 1502 2 50 v -3 1487 a Fh(Char)f Fm(and)h Fh(Code)f Fm(are)h(v)n(ariables)p 915 1502 V 433 w Fh(instantiation)p 1230 1487 14 2 v 13 w(error)p 1859 1502 2 50 v -30 1503 1890 2 v -30 1553 2 50 v -3 1538 a(Char)f Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(a)f(one-c)o(har)i(atom)p 915 1553 V 101 w Fh(type)p 1032 1538 14 2 v 15 w(error\(character,)j(Char\))p 1859 1553 2 50 v -30 1555 1890 2 v -30 1605 2 50 v -3 1590 a(Code)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in)o (teger)p 915 1605 V 215 w Fh(type)p 1032 1590 14 2 v 15 w(error\(integer,)19 b(Code\))p 1859 1605 2 50 v -30 1606 1890 2 v -30 1656 2 50 v -3 1641 a(Code)13 b Fm(is)h(an)f(in)o (teger)i(but)f(not)g(a)f(c)o(haracter)j(co)q(de)p 915 1656 V 159 w Fh(representation)p 1252 1641 14 2 v 13 w(error\(character)p 1594 1641 V 12 w(code\))p 1859 1656 2 50 v -30 1658 1890 2 v -30 1740 a Fi(P)o(ortabilit)o(y)-30 1840 y Fm(ISO)f(predicate.)-30 1996 y Fi(7.19.5)48 b Fh(lower)p 253 1996 14 2 v 15 w(upper/2)-30 2122 y Fi(T)l(emplates)74 2194 y Fh(lower)p 187 2194 V 15 w(upper\(+character,)18 b(?character\))74 2244 y(lower)p 187 2244 V 15 w(upper\(-character,)g (+character\))-30 2316 y Fi(Description)-30 2416 y Fh(lower)p 83 2416 V 15 w(upper\(Char1,)h(Char2\))12 b Fm(succeeds)j(if)g Fh(Char1)c Fm(and)i Fh(Char2)e Fm(are)i(one-c)o(har)g(atoms)f(and)g(if) j Fh(Char2)d Fm(is)g(the)h(upp)q(er)-30 2466 y(con)o(v)o(ersion)i(of)j Fh(Char1)p Fm(.)h(If)e Fh(Char1)d Fm(\(resp.)22 b Fh(Char2)p Fm(\))13 b(is)i(a)f(c)o(haracter)i(that)f(is)f(not)h(a)f(lo)o(w)o(er)h (\(resp.)21 b(upp)q(er\))16 b(letter)g(then)-30 2516 y Fh(Char2)d Fm(is)h(equal)g(to)f Fh(Char1)p Fm(.)-30 2615 y Fi(Errors)p -30 2671 1890 2 v -30 2721 2 50 v -3 2706 a Fh(Char1)g Fm(and)h Fh(Char2)e Fm(are)j(v)n(ariables)p 915 2721 V 389 w Fh(instantiation)p 1230 2706 14 2 v 13 w(error)p 1859 2721 2 50 v -30 2722 1890 2 v -30 2772 2 50 v -3 2757 a(Char1)e Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(a)f (one-c)o(har)i(atom)p 915 2772 V 79 w Fh(type)p 1032 2757 14 2 v 15 w(error\(character,)j(Char1\))p 1859 2772 2 50 v -30 2774 1890 2 v -30 2824 2 50 v -3 2809 a(Char2)13 b Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(a)f(one-c)o(har)i(atom)p 915 2824 V 79 w Fh(type)p 1032 2809 14 2 v 15 w(error\(character,)j (Char2\))p 1859 2824 2 50 v -30 2825 1890 2 v -30 2908 a Fi(P)o(ortabilit)o(y)p eop end %%Page: 117 119 TeXDict begin 117 118 bop -30 -45 a Fm(7.19)41 b(A)o(tomic)13 b(term)h(pro)q(cessing)1283 b(117)p -30 -27 1890 4 v -30 115 a(GNU)14 b(Prolog)f(predicate.)-30 270 y Fi(7.19.6)48 b Fh(atom)p 231 270 14 2 v 15 w(chars/2)p Fi(,)15 b Fh(atom)p 516 270 V 15 w(codes/2)-30 397 y Fi(T)l(emplates)74 468 y Fh(atom)p 165 468 V 15 w(chars\(+atom,)k(?character)p 683 468 V 14 w(list\))74 518 y(atom)p 165 518 V 15 w(chars\(-atom,)g (+character)p 683 518 V 14 w(list\))74 568 y(atom)p 165 568 V 15 w(codes\(+atom,)g(?character)p 683 568 V 14 w(code)p 785 568 V 15 w(list\))74 618 y(atom)p 165 618 V 15 w(codes\(-atom,)g(+character)p 683 618 V 14 w(code)p 785 618 V 15 w(list\))-30 689 y Fi(Description)-30 789 y Fh(atom)p 61 789 V 15 w(chars\(Atom,)h(Chars\))10 b Fm(succeeds)k(if)f Fh(Chars)d Fm(is)h(the)h(list)f(of)f(one-c)o(har)i (atoms)f(whose)g(names)h(are)f(the)h(successiv)o(e)-30 839 y(c)o(haracters)k(of)d(the)i(name)f(of)i Fh(Atom)p Fm(.)-30 938 y Fh(atom)p 61 938 V 15 w(codes\(Atom,)k(Codes\))12 b Fm(is)i(similar)f(to)g Fh(atom)p 799 938 V 15 w(chars/2)g Fm(but)h(deals)g(with)f(a)h(list)f(of)h(c)o(haracter)h(co)q(des.)-30 1038 y Fi(Errors)p -30 1094 1890 2 v -30 1243 2 150 v -3 1128 a Fh(Atom)e Fm(is)h(a)f(v)n(ariable)g(and)h Fh(Chars)f Fm(\(or)h Fh(Codes)p Fm(\))f(is)g(a)-3 1178 y(partial)g(list)g(or)h(a)g (list)f(with)h(an)f(elemen)o(t)i(whic)o(h)f(is)f(a)-3 1228 y(v)n(ariable)p 915 1243 V 941 1128 a Fh(instantiation)p 1230 1128 14 2 v 13 w(error)p 1859 1243 2 150 v -30 1245 1890 2 v -30 1294 2 50 v -3 1280 a(Atom)g Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(an)g(atom)p 915 1294 V 245 w Fh(type)p 1032 1280 14 2 v 15 w(error\(atom,)19 b(Atom\))p 1859 1294 2 50 v -30 1296 1890 2 v -30 1346 2 50 v -3 1331 a(Chars)13 b Fm(is)h(neither)g(a)g(list)f(nor)h(a)g(partial)f(list)p 915 1346 V 236 w Fh(type)p 1032 1331 14 2 v 15 w(error\(list,)19 b(Chars\))p 1859 1346 2 50 v -30 1348 1890 2 v -30 1397 2 50 v -3 1382 a(Codes)13 b Fm(is)h(neither)g(a)g(list)f(nor)h(a)g (partial)f(list)p 915 1397 V 236 w Fh(type)p 1032 1382 14 2 v 15 w(error\(list,)19 b(Codes\))p 1859 1397 2 50 v -30 1399 1890 2 v -30 1499 2 100 v -3 1434 a(Atom)13 b Fm(is)h(a)f(v)n(ariable)g(and)h(an)g(elemen)o(t)g Fh(E)g Fm(of)f(the)h(list)-3 1484 y Fh(Chars)f Fm(is)h(neither)g(a)g(v)n (ariable)f(nor)h(a)f(one-c)o(har)i(atom)p 915 1499 V 941 1434 a Fh(type)p 1032 1434 14 2 v 15 w(error\(character,)j(E\))p 1859 1499 2 100 v -30 1500 1890 2 v -30 1600 2 100 v -3 1535 a(Atom)13 b Fm(is)h(a)f(v)n(ariable)g(and)h(an)g(elemen)o(t)g Fh(E)g Fm(of)f(the)h(list)-3 1585 y Fh(Codes)f Fm(is)h(neither)g(a)g(v) n(ariable)f(nor)h(an)f(in)o(teger)p 915 1600 V 941 1535 a Fh(type)p 1032 1535 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 1600 2 100 v -30 1602 1890 2 v -30 1701 2 100 v -3 1637 a(Atom)13 b Fm(is)h(a)f(v)n(ariable)g(and)h(an)g (elemen)o(t)g Fh(E)g Fm(of)f(the)h(list)-3 1686 y Fh(Codes)f Fm(is)h(an)f(in)o(teger)i(but)f(not)f(a)h(c)o(haracter)h(co)q(de)p 915 1701 V 941 1637 a Fh(representation)p 1252 1637 14 2 v 13 w(error\(character)p 1594 1637 V 12 w(code\))p 1859 1701 2 100 v -30 1703 1890 2 v -30 1786 a Fi(P)o(ortabilit)o(y)-30 1885 y Fm(ISO)j(predicates.)28 b(The)17 b(ISO)g(reference)i(only)d (causes)i(a)f Fh(type)p 984 1885 14 2 v 15 w(error\(list,)i(Chars\))d Fm(if)j Fh(Atom)d Fm(is)g(a)h(v)n(ariable)e(and)-30 1935 y Fh(Chars)j Fm(is)g(neither)h(a)f(list)f(nor)h(a)g(partial)f(list.)31 b(GNU)18 b(Prolog)f(alw)o(a)o(ys)g(c)o(hec)o(ks)j(if)g Fh(Chars)d Fm(is)h(a)g(list.)31 b(Similarly)16 b(for)-30 1985 y Fh(Codes)p Fm(.)h(The)12 b Fh(type)p 283 1985 V 15 w(error\(integer,)19 b(E\))11 b Fm(when)i(an)e(elemen)o(t)i Fh(E)e Fm(of)h(the)g Fh(Codes)f Fm(is)h(not)g(an)f(in)o(teger)i(is)f(a) f(GNU)h(Prolog)-30 2035 y(extension.)19 b(This)14 b(seems)h(to)f(b)q(e) h(an)f(omission)e(in)i(the)h(ISO)f(reference)i(since)f(this)f(error)h (is)f(detected)i(for)d(man)o(y)h(other)-30 2085 y(built-in)f (predicates)i(accepting)g(a)f(c)o(haracter)h(co)q(de)f(\(e.g.)k Fh(char)p 998 2085 V 15 w(code/2)p Fm(,)12 b Fh(put)p 1235 2085 V 15 w(code/2)p Fm(\).)-30 2240 y Fi(7.19.7)48 b Fh(number)p 275 2240 V 15 w(atom/2)p Fi(,)15 b Fh(number)p 582 2240 V 14 w(chars/2)p Fi(,)g Fh(number)p 910 2240 V 14 w(codes/2)-30 2366 y Fi(T)l(emplates)74 2438 y Fh(number)p 209 2438 V 15 w(atom\(+number,)k(?atom\))74 2488 y(number)p 209 2488 V 15 w(atom\(-number,)g(+atom\))74 2538 y(number)p 209 2538 V 15 w(chars\(+number,)g(?character)p 771 2538 V 13 w(list\))74 2587 y(number)p 209 2587 V 15 w(chars\(-number,)g (+character)p 771 2587 V 13 w(list\))74 2637 y(number)p 209 2637 V 15 w(codes\(+number,)g(?character)p 771 2637 V 13 w(code)p 872 2637 V 15 w(list\))74 2687 y(number)p 209 2687 V 15 w(codes\(-number,)g(+character)p 771 2687 V 13 w(code)p 872 2687 V 15 w(list\))-30 2759 y Fi(Description)-30 2858 y Fh(number)p 105 2858 V 15 w(atom\(Number,)g(Atom\))14 b Fm(succeeds)j(if)g Fh(Atom)c Fm(is)i(an)f(atom)g(whose)h(name)f (corresp)q(onds)j(to)d(the)h(c)o(haracters)i(of)-30 2908 y Fh(Number)p Fm(.)p eop end %%Page: 118 120 TeXDict begin 118 119 bop -30 -45 a Fm(118)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fh(number)p 105 115 14 2 v 15 w(chars\(Number,)19 b(Chars\))13 b Fm(is)g(similar)g(to)h Fh(number)p 931 115 V 14 w(atom/2)f Fm(but)h(deals)g(with)f(a)h(list)f(of)h(c)o (haracter)h(co)q(des.)-30 215 y Fh(number)p 105 215 V 15 w(codes\(Number,)k(Codes\))13 b Fm(is)g(similar)g(to)h Fh(number)p 931 215 V 14 w(atom/2)f Fm(but)h(deals)g(with)f(a)h(list)f (of)h(c)o(haracters.)-30 314 y Fi(Errors)p -30 370 1890 2 v -30 420 2 50 v -3 405 a Fh(Number)f Fm(and)g Fh(Atom)g Fm(are)i(v)n(ariables)p 915 420 V 389 w Fh(instantiation)p 1230 405 14 2 v 13 w(error)p 1859 420 2 50 v -30 421 1890 2 v -30 571 2 150 v -3 456 a(Number)e Fm(is)g(a)h(v)n(ariable)f (and)g Fh(Chars)g Fm(\(or)h Fh(Codes)p Fm(\))f(is)h(a)-3 506 y(partial)f(list)g(or)h(a)g(list)f(with)h(an)f(elemen)o(t)i(whic)o (h)f(is)f(a)-3 556 y(v)n(ariable)p 915 571 V 941 456 a Fh(instantiation)p 1230 456 14 2 v 13 w(error)p 1859 571 2 150 v -30 572 1890 2 v -30 622 2 50 v -3 607 a(Number)g Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(n)o(um)o(b)q(er)p 915 622 V 158 w Fh(type)p 1032 607 14 2 v 15 w(error\(number,)19 b(Number\))p 1859 622 2 50 v -30 624 1890 2 v -30 674 2 50 v -3 659 a(Atom)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an) g(atom)p 915 674 V 245 w Fh(type)p 1032 659 14 2 v 15 w(error\(atom,)19 b(Atom\))p 1859 674 2 50 v -30 675 1890 2 v -30 775 2 100 v -3 710 a(Number)13 b Fm(is)g(a)h(v)n(ariable)f (and)g Fh(Chars)g Fm(is)h(neither)h(a)e(list)-3 760 y(nor)h(a)g (partial)e(list)p 915 775 V 941 710 a Fh(type)p 1032 710 14 2 v 15 w(error\(list,)19 b(Chars\))p 1859 775 2 100 v -30 777 1890 2 v -30 876 2 100 v -3 811 a(Number)13 b Fm(is)g(a)h(v)n(ariable)f(and)g Fh(Codes)g Fm(is)h(neither)h(a)e (list)-3 861 y(nor)h(a)g(partial)e(list)p 915 876 V 941 811 a Fh(type)p 1032 811 14 2 v 15 w(error\(list,)19 b(Codes\))p 1859 876 2 100 v -30 878 1890 2 v -30 977 2 100 v -3 913 a(Number)13 b Fm(is)g(a)h(v)n(ariable)f(and)g(an)h (elemen)o(t)g Fh(E)g Fm(of)f(the)i(list)-3 963 y Fh(Chars)e Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(a)f(one-c)o(har)i(atom)p 915 977 V 941 913 a Fh(type)p 1032 913 14 2 v 15 w(error\(character,)j (E\))p 1859 977 2 100 v -30 979 1890 2 v -30 1079 2 100 v -3 1014 a(Number)13 b Fm(is)g(a)h(v)n(ariable)f(and)g(an)h(elemen)o (t)g Fh(E)g Fm(of)f(the)i(list)-3 1064 y Fh(Codes)e Fm(is)h(neither)g (a)g(v)n(ariable)f(nor)h(an)f(in)o(teger)p 915 1079 V 941 1014 a Fh(type)p 1032 1014 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 1079 2 100 v -30 1080 1890 2 v -30 1180 2 100 v -3 1115 a(Number)13 b Fm(is)g(a)h(v)n(ariable)f(and)g(an)h (elemen)o(t)g Fh(E)g Fm(of)f(the)i(list)-3 1165 y Fh(Codes)e Fm(is)h(an)f(in)o(teger)i(but)f(not)f(a)h(c)o(haracter)h(co)q(de)p 915 1180 V 941 1115 a Fh(representation)p 1252 1115 14 2 v 13 w(error\(character)p 1594 1115 V 12 w(code\))p 1859 1180 2 100 v -30 1182 1890 2 v -30 1381 2 200 v -3 1217 a(Number)e Fm(is)g(a)h(v)n(ariable,)e Fh(Atom)h Fm(\(or)h Fh(Chars)f Fm(or)h Fh(Codes)p Fm(\))-3 1266 y(cannot)g(b)q(e)h(parsed)f(as)g(a)g(n)o(um)o(b)q(er)g(and)g(the)g(v)n (alue)g(of)-3 1316 y(the)h Fh(syntax)p 204 1316 14 2 v 14 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1366 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1381 2 200 v 941 1217 a Fh(syntax)p 1076 1217 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1381 2 200 v -30 1383 1890 2 v -30 1465 a Fi(P)o(ortabilit)o(y)-30 1565 y Fh(number)p 105 1565 14 2 v 15 w(atom/2)13 b Fm(is)g(a)h(GNU)g (Prolog)f(predicate.)19 b Fh(number)p 910 1565 V 14 w(chars/2)13 b Fm(and)g Fh(number)p 1303 1565 V 15 w(codes/2)f Fm(are)j(ISO)f (predicates.)-30 1665 y(GNU)19 b(Prolog)e(only)h(raises)h(an)g(error)g (ab)q(out)f(an)g(elemen)o(t)h Fh(E)g Fm(of)e(the)j Fh(Chars)d Fm(\(or)i Fh(Codes)p Fm(\))e(list)h(when)h Fh(Number)e Fm(is)h(a)-30 1715 y(v)n(ariable)11 b(while)h(the)g(ISO)h(reference)h (alw)o(a)o(ys)d(c)o(hec)o(k)i(this.)18 b(This)11 b(seems)j(an)d(error)i (since)g(the)g(list)e(itself)h(is)g(only)f(c)o(hec)o(k)o(ed)-30 1764 y(if)17 b Fh(Number)12 b Fm(is)i(a)g(v)n(ariable.)-30 1864 y(The)21 b Fh(type)p 153 1864 V 15 w(error\(integer,)e(E\))h Fm(when)h(an)g(elemen)o(t)g Fh(E)f Fm(of)g(the)h Fh(Codes)f Fm(is)g(not)h(an)f(in)o(teger)h(is)f(a)h(GNU)f(Prolog)-30 1914 y(extension.)f(This)14 b(seems)h(to)f(b)q(e)h(an)f(omission)e(in)i (the)h(ISO)f(reference)i(since)f(this)f(error)h(is)f(detected)i(for)d (man)o(y)h(other)-30 1964 y(built-in)f(predicates)i(accepting)g(a)f(c)o (haracter)h(co)q(de)f(\(e.g.)k Fh(char)p 998 1964 V 15 w(code/2)p Fm(,)12 b Fh(put)p 1235 1964 V 15 w(code/2)p Fm(\).)-30 2121 y Fi(7.19.8)48 b Fh(name/2)-30 2247 y Fi(T)l(emplates)74 2329 y Fh(name\(+atomic,)19 b(?character)p 602 2329 V 14 w(code)p 704 2329 V 15 w(list\))74 2378 y(name\(-atomic,)g(+character)p 602 2378 V 14 w(code)p 704 2378 V 15 w(list\))-30 2460 y Fi(Description)-30 2559 y Fh(name\(Constant,)g(Codes\))10 b Fm(succeeds)k(if)f Fh(Codes)d Fm(is)h(a)g(list)f(whose)i(elemen)o(ts)g(are)f(the)h(c)o (haracter)g(co)q(des)g(corresp)q(onding)-30 2609 y(to)17 b(the)g(successiv)o(e)h(c)o(haracters)g(of)h Fh(Constant)c Fm(\(a)h(n)o(um)o(b)q(er)h(or)f(an)g(atom\).)25 b(Ho)o(w)o(ev)o(er,)17 b(there)h(atoms)e(are)g(for)g(whic)o(h)-30 2659 y Fh(name\(Constant,)j (Codes\))c Fm(is)i(true,)g(but)g(whic)o(h)f(will)f(not)h(b)q(e)h (constructed)i(if)f Fh(name/2)e Fm(is)g(called)g(with)g Fh(Constant)-30 2709 y Fm(uninstan)o(tiated,)k(e.g.)32 b(the)20 b(atom)d Fh('1024')p Fm(.)32 b(F)m(or)18 b(this)h(reason)g (the)h(use)f(of)j Fh(name/2)17 b Fm(is)i(discouraged)g(and)f(should)-30 2759 y(b)q(e)e(limited)e(to)i(compatibilit)o(y)d(purp)q(oses.)24 b(It)15 b(is)g(preferable)h(to)g(use)g(atom)p 1175 2759 13 2 v 14 w(co)q(des/2)g(\(section)g(7.19.6,)d(page)j(117\))e(or)-30 2808 y(n)o(um)o(b)q(er)p 109 2808 V 16 w(c)o(hars/2)g(\(section)h (7.19.7,)c(page)j(117\).)-30 2908 y Fi(Errors)p eop end %%Page: 119 121 TeXDict begin 119 120 bop -30 -45 a Fm(7.19)41 b(A)o(tomic)13 b(term)h(pro)q(cessing)1283 b(119)p -30 -27 1890 4 v -30 75 1890 2 v -30 175 2 100 v -3 110 a Fh(Constant)12 b Fm(is)i(a)g(v)n(ariable)e(and)i Fh(Codes)f Fm(is)h(a)f(partial)g (list)-3 160 y(or)h(a)f(list)h(with)f(an)h(elemen)o(t)g(whic)o(h)g(is)g (a)g(v)n(ariable)p 915 175 V 941 110 a Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 175 2 100 v -30 176 1890 2 v -30 276 2 100 v -3 211 a(Constant)e Fm(is)i(neither)h(a)e(v)n (ariable)g(nor)h(an)g(atomic)-3 261 y(term)p 915 276 V 941 211 a Fh(type)p 1032 211 14 2 v 15 w(error\(atomic,)19 b(Constant\))p 1859 276 2 100 v -30 278 1890 2 v -30 377 2 100 v -3 312 a(Constant)12 b Fm(is)h(a)g(v)n(ariable)g(and)g Fh(Codes)f Fm(is)i(neither)g(a)f(list)-3 362 y(nor)h(a)g(partial)e (list)p 915 377 V 941 312 a Fh(type)p 1032 312 14 2 v 15 w(error\(list,)19 b(Codes\))p 1859 377 2 100 v -30 379 1890 2 v -30 479 2 100 v -3 414 a(Constant)12 b Fm(is)i(a)g(v)n (ariable)e(and)i(an)g(elemen)o(t)g Fh(E)g Fm(of)f(the)-3 464 y(list)g Fh(Codes)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g (in)o(teger)p 915 479 V 941 414 a Fh(type)p 1032 414 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 479 2 100 v -30 480 1890 2 v -30 580 2 100 v -3 515 a(Constant)12 b Fm(is)i(a)g(v)n(ariable)e(and)i(an)g(elemen)o(t)g Fh(E)g Fm(of)f(the)-3 565 y(list)g Fh(Codes)g Fm(is)h(an)g(in)o(teger)g(but)g (not)g(a)f(c)o(haracter)j(co)q(de)p 915 580 V 941 515 a Fh(representation)p 1252 515 14 2 v 13 w(error\(character)p 1594 515 V 12 w(code\))p 1859 580 2 100 v -30 581 1890 2 v -30 664 a Fi(P)o(ortabilit)o(y)-30 764 y Fm(GNU)e(Prolog)f (predicate.)-30 919 y Fi(7.19.9)48 b Fh(atom)p 231 919 14 2 v 15 w(hash/2)-30 1046 y Fi(T)l(emplates)74 1118 y Fh(atom)p 165 1118 V 15 w(hash\(+atom,)20 b(?integer\))74 1168 y(atom)p 165 1168 V 15 w(hash\(?atom,)g(+integer\))-30 1240 y Fi(Description)-30 1340 y Fh(atom)p 61 1340 V 15 w(hash\(Atom,)g(Hash\))15 b Fm(succeeds)20 b(if)e Fh(Hash)e Fm(is)g(the)h(in)o(ternal)f(k)o(ey)h(asso)q(ciated)g(with)f Fh(Atom)g Fm(\(an)g(existing)g(atom\).)-30 1390 y(The)g(in)o(ternal)e (k)o(ey)h(of)g(an)g(atom)f(is)h(a)f(unique)h(in)o(teger)h Fg(\025)f Fm(0)g(and)f Fb(<)i Fm(to)e(the)i Fh(max)p 1260 1390 V 15 w(atom)e Fm(Prolog)g(\015ag)h(\(section)h(7.22.1,)-30 1440 y(page)e(133\).)-30 1539 y Fi(Errors)p -30 1595 1890 2 v -30 1645 2 50 v -3 1630 a Fh(Atom)f Fm(and)h Fh(Hash)f Fm(are)h(b)q(oth)g(v)n(ariables)p 915 1645 V 335 w Fh(instantiation)p 1230 1630 14 2 v 13 w(error)p 1859 1645 2 50 v -30 1646 1890 2 v -30 1696 2 50 v -3 1681 a(Atom)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(atom)p 915 1696 V 245 w Fh(type)p 1032 1681 14 2 v 15 w(error\(atom,)19 b(Atom\))p 1859 1696 2 50 v -30 1698 1890 2 v -30 1748 2 50 v -3 1733 a(Hash)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h (an)g(in)o(teger)p 915 1748 V 215 w Fh(type)p 1032 1733 14 2 v 15 w(error\(integer,)19 b(Hash\))p 1859 1748 2 50 v -30 1749 1890 2 v -30 1799 2 50 v -3 1784 a(Hash)13 b Fm(is)h(an)f(in)o(teger)i Fb(<)f Fm(0)p 915 1799 V 539 w Fh(domain)p 1076 1784 14 2 v 15 w(error\(not)p 1289 1784 V 13 w(less)p 1390 1784 V 15 w(than)p 1493 1784 V 15 w(zero,)21 b(Hash\))p 1859 1799 2 50 v -30 1801 1890 2 v -30 1884 a Fi(P)o(ortabilit)o(y)-30 1983 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2139 y Fi(7.19.10)48 b Fh(new)p 233 2139 14 2 v 15 w(atom/3)p Fi(,)15 b Fh(new)p 474 2139 V 15 w(atom/2)p Fi(,)g Fh(new)p 715 2139 V 15 w(atom/1)-30 2265 y Fi(T)l(emplates)74 2337 y Fh(new)p 143 2337 V 15 w(atom\(+atom,)20 b(+integer,)g(-atom\))74 2387 y(new)p 143 2387 V 15 w(atom\(+atom,)g(-atom\))74 2437 y(new)p 143 2437 V 15 w(atom\(-atom\))-30 2510 y Fi(Description)-30 2609 y Fh(new)p 39 2609 V 16 w(atom\(Prefix,)f (Hash,)i(Atom\))13 b Fm(uni\014es)i Fh(Atom)f Fm(with)h(a)f(new)h(atom) f(whose)h(name)g(b)q(egins)g(with)f(the)h(c)o(haracters)-30 2659 y(of)f(the)g(name)g(of)j Fh(Prefix)c Fm(and)g(whose)i(in)o(ternal) f(k)o(ey)g(is)f Fh(Hash)h Fm(\(section)g(7.19.9,)e(page)i(119\).)k (This)c(predicate)h(is)f(then)-30 2709 y(a)g(sym)o(b)q(ol)e(generator.) 19 b(It)14 b(is)f(guaran)o(teed)h(that)g Fh(Atom)f Fm(do)q(es)h(not)f (exist)h(b)q(efore)g(the)h(in)o(v)o(o)q(cation)d(of)k Fh(new)p 1616 2709 V 15 w(atom/3)p Fm(.)h(The)-30 2759 y(c)o(haracters)e(app)q(ended)f(to)f Fh(Prefix)e Fm(to)i(form)f Fh(Atom)g Fm(are)h(in:)k Fh(A)p Fm(-)p Fh(Z)12 b Fm(\(capital)h (letter\),)g Fh(a)p Fm(-)p Fh(z)f Fm(\(small)g(letter\),)i Fh(0)p Fm(-)p Fh(9)e Fm(\(digit\),)g Fh(#)p Fm(,)-30 2808 y Fh($)p Fm(,)i Fh(&)p Fm(,)p 67 2808 V 28 w(,)g Fh(@)p Fm(.)-30 2908 y Fh(new)p 39 2908 V 16 w(atom/2)e Fm(is)i(similar)e(to)i Fh(new)p 494 2908 V 15 w(atom/3)p Fm(,)e(but)i(the)h(atom)e(generated)i(can)f(ha)o(v)o(e)g(an)o(y)f (\(free\))i(in)o(ternal)f(k)o(ey)m(.)p eop end %%Page: 120 122 TeXDict begin 120 121 bop -30 -45 a Fm(120)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fh(new)p 39 115 14 2 v 16 w(atom/1)e Fm(is)i(similar)e(to)i Fh(new)p 494 115 V 15 w(atom\(atom)p 707 115 V 14 w(,)22 b(Atom\))p Fm(,)12 b(i.e.)17 b(the)e(generated)g (atom)e(b)q(egins)h(with)g Fh(atom)p 1648 115 V 15 w Fm(.)-30 215 y Fi(Errors)p -30 270 1890 2 v -30 320 2 50 v -3 305 a Fh(Prefix)f Fm(is)g(a)h(v)n(ariable)p 915 320 V 580 w Fh(instantiation)p 1230 305 14 2 v 13 w(error)p 1859 320 2 50 v -30 322 1890 2 v -30 371 2 50 v -3 356 a(Hash)f Fm(is)h(a)f(v)n(ariable)p 915 371 V 624 w Fh(instantiation)p 1230 356 14 2 v 13 w(error)p 1859 371 2 50 v -30 373 1890 2 v -30 423 2 50 v -3 408 a(Prefix)g Fm(is)g(neither)i(a)f(v)n (ariable)f(nor)g(an)h(atom)p 915 423 V 202 w Fh(type)p 1032 408 14 2 v 15 w(error\(atom,)19 b(Prefix\))p 1859 423 2 50 v -30 425 1890 2 v -30 474 2 50 v -3 459 a(Hash)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in)o(teger)p 915 474 V 215 w Fh(type)p 1032 459 14 2 v 15 w(error\(integer,)19 b(Hash\))p 1859 474 2 50 v -30 476 1890 2 v -30 526 2 50 v -3 511 a(Hash)13 b Fm(is)h(an)f(in)o(teger)i Fb(<)f Fm(0)p 915 526 V 539 w Fh(domain)p 1076 511 14 2 v 15 w(error\(not)p 1289 511 V 13 w(less)p 1390 511 V 15 w(than)p 1493 511 V 15 w(zero,)21 b(Hash\))p 1859 526 2 50 v -30 528 1890 2 v -30 577 2 50 v -3 562 a(Atom)13 b Fm(is)h(not)g(a)f(v)n (ariable)p 915 577 V 550 w Fh(type)p 1032 562 14 2 v 15 w(error\(variable,)19 b(Atom\))p 1859 577 2 50 v -30 579 1890 2 v -30 662 a Fi(P)o(ortabilit)o(y)-30 761 y Fm(GNU)14 b(Prolog)f(predicate.)-30 919 y Fi(7.19.11)48 b Fh(current)p 321 919 14 2 v 14 w(atom/1)-30 1045 y Fi(T)l(emplates)74 1126 y Fh(current)p 231 1126 V 14 w(atom\(?atom\))-30 1207 y Fi(Description)-30 1307 y Fh(current)p 127 1307 V 15 w(atom\(Atom\))10 b Fm(succeeds)15 b(if)c(there)j(exists)f(an)f(atom)f(that)i(uni\014es)f(with)g Fh(Atom)p Fm(.)17 b(All)11 b(atoms)h(are)h(found)f(except)-30 1356 y(those)j(b)q(eginning)e(with)h(a)f Fh('$')h Fm(\(system)h (atoms\).)i(This)d(predicate)h(is)f(re-executable)h(on)f(bac)o(ktrac)o (king.)-30 1456 y Fi(Errors)p -30 1520 1890 2 v -30 1570 2 50 v -3 1555 a Fh(Atom)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h (an)g(atom)p 915 1570 V 245 w Fh(type)p 1032 1555 14 2 v 15 w(error\(atom,)19 b(Atom\))p 1859 1570 2 50 v -30 1572 1890 2 v -30 1655 a Fi(P)o(ortabilit)o(y)-30 1755 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1912 y Fi(7.19.12)48 b Fh(atom)p 255 1912 14 2 v 15 w(property/2)-30 2039 y Fi(T)l(emplates)74 2119 y Fh(atom)p 165 2119 V 15 w(property\(?atom,) 19 b(?atom)p 639 2119 V 14 w(property\))-30 2200 y Fi(Description)-30 2300 y Fh(atom)p 61 2300 V 15 w(property\(Atom,)g(Property\))11 b Fm(succeeds)16 b(if)f Fh(current)p 972 2300 V 15 w(atom\(Atom\))c Fm(succeeds)k(\(section)f(7.19.11,)d(page)i(120\))-30 2350 y(and)20 b(if)j Fh(Property)18 b Fm(uni\014es)j(with)f(one)g(of)f (the)i(prop)q(erties)h(of)d(the)i(atom.)35 b(This)20 b(predicate)i(is)e(re-executable)h(on)-30 2400 y(bac)o(ktrac)o(king.) -30 2499 y Fi(A)o(tom)15 b(prop)q(erties)p Fm(:)33 2580 y Fg(\017)20 b Fh(length\(Length\))p Fm(:)15 b Fh(Length)e Fm(is)h(the)g(length)g(of)f(the)i(name)e(of)h(the)g(atom.)33 2662 y Fg(\017)20 b Fh(hash\(Hash\))p Fm(:)c Fh(Hash)d Fm(is)h(the)g(in)o(ternal)g(k)o(ey)g(of)f(the)i(atom)e(\(section)h (7.19.9,)e(page)i(119\).)33 2744 y Fg(\017)20 b Fh(prefix)p 209 2744 V 15 w(op)p Fm(:)d(if)c(there)j(is)d(a)h(pre\014x)g(op)q (erator)h(curren)o(tly)g(de\014ned)g(with)e(this)h(name.)33 2826 y Fg(\017)20 b Fh(infix)p 187 2826 V 15 w(op)p Fm(:)d(if)d(there)h (is)e(an)h(in\014x)g(op)q(erator)g(curren)o(tly)h(de\014ned)g(with)e (this)h(name.)33 2908 y Fg(\017)20 b Fh(postfix)p 231 2908 V 14 w(op)p Fm(:)e(if)13 b(there)i(is)f(a)g(p)q(ost\014x)g(op)q (erator)g(curren)o(tly)h(de\014ned)g(with)f(this)g(name.)p eop end %%Page: 121 123 TeXDict begin 121 122 bop -30 -45 a Fm(7.20)41 b(List)14 b(pro)q(cessing)1443 b(121)p -30 -27 1890 4 v 33 115 a Fg(\017)20 b Fh(needs)p 187 115 14 2 v 15 w(quotes)p Fm(:)d(if)c(the)h(atom)f(m)o(ust)h(b)q(e)h(quoted)f(to)g(b)q(e)g(read)g (later.)33 198 y Fg(\017)20 b Fh(needs)p 187 198 V 15 w(scan)p Fm(:)27 b(if)18 b(the)i(atom)e(m)o(ust)h(b)q(e)g(scanned)h (when)g(output)f(to)f(b)q(e)i(read)f(later)g(\(e.g.)33 b(con)o(tains)19 b(sp)q(ecial)74 247 y(c)o(haracters)d(that)e(m)o(ust)g (b)q(e)g(output)g(with)g(a)f Fh(\\)h Fm(escap)q(e)i(sequence\).)-30 330 y Fi(Errors)p -30 385 1890 2 v -30 435 2 50 v -3 420 a Fh(Atom)d Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(atom)p 915 435 V 245 w Fh(type)p 1032 420 14 2 v 15 w(error\(atom,)19 b(Atom\))p 1859 435 2 50 v -30 437 1890 2 v -30 536 2 100 v -3 472 a(Property)12 b Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h (a)g(n)g(atom)-3 521 y(prop)q(ert)o(y)h(term)p 915 536 V 941 472 a Fh(domain)p 1076 472 14 2 v 15 w(error\(atom)p 1311 472 V 13 w(property,)20 b(Property\))p 1859 536 2 100 v -30 538 1890 2 v -30 638 2 100 v -3 573 a(Property)12 b Fm(=)i Fh(length\(E\))e Fm(or)i Fh(hash\(E\))f Fm(and)g Fh(E)h Fm(is)-3 623 y(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in)o (teger)p 915 638 V 941 573 a Fh(type)p 1032 573 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 638 2 100 v -30 639 1890 2 v -30 722 a Fi(P)o(ortabilit)o(y)-30 822 y Fm(GNU)14 b(Prolog)f(predicate.)-30 988 y Ff(7.20)56 b(List)18 b(pro)r(cessing)-30 1114 y Fm(These)i(predicates)f (manipulate)f(lists.)30 b(They)19 b(are)f(b)q(o)q(otstrapp)q(ed)i (predicates)f(\(i.e.)31 b(written)18 b(in)g(Prolog\))f(and)h(no)-30 1164 y(error)f(cases)g(are)e(tested)i(\(for)f(the)g(momen)o(t\).)22 b(Ho)o(w)o(ev)o(er,)16 b(since)g(they)g(are)g(written)g(in)f(Prolog)f (using)h(other)h(built-in)-30 1214 y(predicates,)f(some)f(errors)i(can) e(o)q(ccur)h(due)f(to)g(those)g(built-in)f(predicates.)-30 1371 y Fi(7.20.1)48 b Fh(append/3)-30 1498 y Fi(T)l(emplates)74 1580 y Fh(append\(?list,)19 b(?list,)i(?list\))-30 1662 y Fi(Description)-30 1762 y Fh(append\(List1,)f(List2,)g(List12\))c Fm(succeeds)j(if)e(the)g(concatenation)h(of)e(the)i(list)e Fh(List1)g Fm(and)h(the)h(list)e Fh(List2)g Fm(is)-30 1812 y(the)f(list)e Fh(List12)p Fm(.)k(This)c(predicate)i(is)f (re-executable)h(on)f(bac)o(ktrac)o(king)f(\(e.g.)18 b(if)e Fh(List12)c Fm(is)i(instan)o(tiated)g(and)f(b)q(oth)-30 1862 y Fh(List1)g Fm(and)h Fh(List2)f Fm(are)h(v)n(ariable\).)-30 1961 y Fi(Errors)-30 2061 y Fm(None.)-30 2161 y Fi(P)o(ortabilit)o(y) -30 2260 y Fm(GNU)g(Prolog)f(predicate.)-30 2418 y Fi(7.20.2)48 b Fh(member/2)p Fi(,)15 b Fh(memberchk/2)-30 2544 y Fi(T)l(emplates)74 2626 y Fh(member\(?term,)k(?list\))74 2676 y(memberchk\(?term,)g (?list\))-30 2759 y Fi(Description)-30 2858 y Fh(member\(Element,)g (List\))d Fm(succeeds)k(if)f Fh(Element)c Fm(b)q(elongs)i(to)g(the)h Fh(List)p Fm(.)26 b(This)17 b(predicate)h(is)f(re-executable)h(on)-30 2908 y(bac)o(ktrac)o(king)c(and)g(can)g(b)q(e)g(th)o(us)h(used)f(to)g (en)o(umerate)h(the)g(elemen)o(ts)f(of)j Fh(List)p Fm(.)p eop end %%Page: 122 124 TeXDict begin 122 123 bop -30 -45 a Fm(122)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fh(memberchk/2)e Fm(is)i(similar)e(to)i Fh(member/2)e Fm(but)i(only)f(succeeds)k(once.)-30 215 y Fi(Errors)-30 314 y Fm(None.)-30 414 y Fi(P)o(ortabilit)o(y)-30 513 y Fm(GNU)d(Prolog)f(predicate.)-30 669 y Fi(7.20.3)48 b Fh(reverse/2)-30 796 y Fi(T)l(emplates)74 871 y Fh(reverse\(?list,)19 b(?list\))-30 947 y Fi(Description)-30 1046 y Fh(reverse\(List1,)g (List2\))13 b Fm(succeeds)j(if)h Fh(List2)c Fm(uni\014es)h(with)f(the)i (list)e Fh(List1)g Fm(in)h(rev)o(erse)h(order.)-30 1146 y Fi(Errors)-30 1246 y Fm(None.)-30 1345 y Fi(P)o(ortabilit)o(y)-30 1445 y Fm(GNU)f(Prolog)f(predicate.)-30 1601 y Fi(7.20.4)48 b Fh(delete/3)p Fi(,)15 b Fh(select/3)-30 1727 y Fi(T)l(emplates)74 1803 y Fh(delete\(?list,)k(?term,)i(?list\))74 1853 y(select\(?term,)e (?list,)i(?list\))-30 1928 y Fi(Description)-30 2028 y Fh(delete\(List1,)f(Element,)g(List2\))c Fm(remo)o(v)o(es)i(all)e(o)q (ccurrences)21 b(of)f Fh(Element)c Fm(in)i Fh(List1)e Fm(to)i(pro)o(vide)f Fh(List2)p Fm(.)28 b(A)-30 2078 y(strict)15 b(term)f(equalit)o(y)f(is)h(required,)h(cf.)j Fh(\(==\)/2)12 b Fm(\(section)j(7.3.2,)d(page)i(51\).)-30 2177 y Fh(select\(Element,)19 b(List1,)i(List2\))12 b Fm(remo)o(v)o(es)i(one)g(o)q(ccurrence)i(of)g Fh(Element)c Fm(in)h Fh(List1)g Fm(to)g(pro)o(vide)g Fh(List2)p Fm(.)k(This)-30 2227 y(predicate)e(is)f(re-executable)i(on)e(bac)o(ktrac)o(king.)-30 2327 y Fi(Errors)-30 2426 y Fm(None.)-30 2526 y Fi(P)o(ortabilit)o(y) -30 2626 y Fm(GNU)g(Prolog)f(predicate.)-30 2782 y Fi(7.20.5)48 b Fh(permutation/2)-30 2908 y Fi(T)l(emplates)p eop end %%Page: 123 125 TeXDict begin 123 124 bop -30 -45 a Fm(7.20)41 b(List)14 b(pro)q(cessing)1443 b(123)p -30 -27 1890 4 v 74 115 a Fh(permutation\(?list,)18 b(?list\))-30 192 y Fi(Description)-30 291 y Fh(permutation\(List1,)h(List2\))8 b Fm(succeeds)k(if)g Fh(List2)d Fm(is)g(a)h(p)q(erm)o(utation)f(of)g(the)h(elemen)o(ts)h(of) h Fh(List1)p Fm(.)k(This)9 b(predicate)-30 341 y(is)14 b(re-executable)i(on)e(bac)o(ktrac)o(king.)-30 441 y Fi(Errors)-30 540 y Fm(None.)-30 640 y Fi(P)o(ortabilit)o(y)-30 740 y Fm(GNU)g(Prolog)f(predicate.)-30 896 y Fi(7.20.6)48 b Fh(prefix/2)p Fi(,)15 b Fh(suffix/2)-30 1023 y Fi(T)l(emplates)74 1099 y Fh(prefix\(?list,)k(?list\))74 1149 y(suffix\(?list,)g(?list\)) -30 1226 y Fi(Description)-30 1326 y Fh(prefix\(Prefix,)g(List\))13 b Fm(succeeds)k(if)g Fh(Prefix)12 b Fm(is)i(a)g(pre\014x)h(of)i Fh(List)p Fm(.)g(This)d(predicate)i(is)e(re-executable)i(on)d(bac)o(k-) -30 1376 y(trac)o(king.)-30 1475 y Fh(suffix\(Suffix,)19 b(List\))14 b Fm(succeeds)j(if)g Fh(Suffix)c Fm(is)h(a)h(su\016x)f(of)j Fh(List)p Fm(.)i(This)c(predicate)g(is)g(re-executable)h(on)e(bac)o(k-) -30 1525 y(trac)o(king.)-30 1625 y Fi(Errors)-30 1724 y Fm(None.)-30 1824 y Fi(P)o(ortabilit)o(y)-30 1924 y Fm(GNU)g(Prolog)f(predicate.)-30 2080 y Fi(7.20.7)48 b Fh(sublist/2)-30 2206 y Fi(T)l(emplates)74 2283 y Fh(sublist\(?list,) 19 b(?list\))-30 2360 y Fi(Description)-30 2460 y Fh(sublist\(List1,)g (List2\))e Fm(succeeds)k(if)f Fh(List1)d Fm(is)h(a)g(sub-list)g(of)j Fh(List2)p Fm(.)29 b(This)18 b(predicate)i(is)e(re-executable)h(on)-30 2510 y(bac)o(ktrac)o(king.)-30 2609 y Fi(Errors)-30 2709 y Fm(None.)-30 2808 y Fi(P)o(ortabilit)o(y)-30 2908 y Fm(GNU)14 b(Prolog)f(predicate.)p eop end %%Page: 124 126 TeXDict begin 124 125 bop -30 -45 a Fm(124)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(7.20.8)48 b Fh(last/2)-30 241 y Fi(T)l(emplates)74 324 y Fh(last\(?list,)20 b(?term\))-30 407 y Fi(Description)-30 507 y Fh(last\(List,)g(Element\))12 b Fm(succeeds)17 b(if)f Fh(Element)d Fm(is)g(the)i(last)e(elemen)o(t)i (of)h Fh(List)p Fm(.)-30 607 y Fi(Errors)-30 706 y Fm(None.)-30 806 y Fi(P)o(ortabilit)o(y)-30 906 y Fm(GNU)e(Prolog)f(predicate.)-30 1063 y Fi(7.20.9)48 b Fh(length/2)-30 1190 y Fi(T)l(emplates)74 1273 y Fh(length\(?list,)19 b(?integer\))-30 1356 y Fi(Description)-30 1455 y Fh(length\(List,)h(Length\))12 b Fm(succeeds)17 b(if)f Fh(Length)d Fm(is)g(the)i(length)f(of)i Fh(List)p Fm(.)-30 1555 y Fi(Errors)-30 1655 y Fm(None.)-30 1754 y Fi(P)o(ortabilit)o(y)-30 1854 y Fm(GNU)e(Prolog)f(predicate.)-30 2012 y Fi(7.20.10)48 b Fh(nth/3)-30 2138 y Fi(T)l(emplates)74 2221 y Fh(nth\(?integer,)19 b(?list,)i(?term\))-30 2304 y Fi(Description)-30 2404 y Fh(nth\(N,)g(List,)g(Element\))12 b Fm(succeeds)k(if)e(the)g Fh(N)p Fe(th)j Fm(argumen)o(t)d(of)i Fh(List)d Fm(is)h Fh(Element)p Fm(.)-30 2503 y Fi(Errors)-30 2603 y Fm(None.)-30 2703 y Fi(P)o(ortabilit)o(y)-30 2802 y Fm(GNU)g(Prolog)f(predicate.)p eop end %%Page: 125 127 TeXDict begin 125 126 bop -30 -45 a Fm(7.20)41 b(List)14 b(pro)q(cessing)1443 b(125)p -30 -27 1890 4 v -30 115 a Fi(7.20.11)48 b Fh(max)p 233 115 14 2 v 15 w(list/2)p Fi(,)15 b Fh(min)p 474 115 V 15 w(list/2)p Fi(,)g Fh(sum)p 715 115 V 15 w(list/2)-30 241 y Fi(T)l(emplates)74 324 y Fh(min)p 143 324 V 15 w(list\(+list,)20 b(?number\))74 374 y(max)p 143 374 V 15 w(list\(+list,)g(?number\))74 424 y(sum)p 143 424 V 15 w(list\(+list,)g(?number\))-30 507 y Fi(Description)-30 607 y Fh(min)p 39 607 V 16 w(list\(List,)f (Min\))13 b Fm(succeeds)k(if)f Fh(Min)d Fm(is)h(the)h(smallest)e(n)o (um)o(b)q(er)h(in)g Fh(List)p Fm(.)-30 706 y Fh(max)p 39 706 V 16 w(list\(List,)19 b(Max\))13 b Fm(succeeds)k(if)f Fh(Max)d Fm(is)h(the)h(largest)f(n)o(um)o(b)q(er)g(in)f Fh(List)p Fm(.)-30 806 y Fh(sum)p 39 806 V 16 w(list\(List,)19 b(Sum\))13 b Fm(succeeds)k(if)f Fh(Sum)d Fm(is)h(the)h(sum)e(of)h(all)e (the)j(elemen)o(ts)g(in)e Fh(List)p Fm(.)-30 906 y Fh(List)g Fm(m)o(ust)h(b)q(e)h(a)e(list)h(of)f(arithmetic)h(ev)n(aluable)f(terms) i(\(section)f(7.6.1,)e(page)i(57\).)-30 1005 y Fi(Errors)-30 1105 y Fm(None.)-30 1204 y Fi(P)o(ortabilit)o(y)-30 1304 y Fm(GNU)g(Prolog)f(predicate.)-30 1462 y Fi(7.20.12)48 b Fh(sort/2)p Fi(,)15 b Fh(sort0/2)p Fi(,)g Fh(keysort/2)f(sort/1)p Fi(,)h Fh(sort0/1)p Fi(,)f Fh(keysort/1)-30 1588 y Fi(T)l(emplates)74 1671 y Fh(sort\(+list,)20 b(?list\))74 1721 y(sort0\(+list,)g(?list\)) 74 1771 y(keysort\(+list,)f(?list\))74 1821 y(sort\(+list\))74 1870 y(sort0\(+list\))74 1920 y(keysort\(+list\))-30 2003 y Fi(Description)-30 2103 y Fh(sort\(List1,)h(List2\))9 b Fm(succeeds)j(if)h Fh(List2)c Fm(is)g(the)i(sorted)g(list)f(corresp)q (onding)g(to)g Fh(List1)f Fm(where)i(duplicate)f(elemen)o(ts)-30 2153 y(are)15 b(merged.)-30 2252 y Fh(sort0/2)e Fm(is)h(similar)e(to)i Fh(sort/2)e Fm(except)k(that)e(duplicate)f(elemen)o(ts)i(are)f(not)g (merged.)-30 2352 y Fh(keysort\(List1,)19 b(List2\))d Fm(succeeds)j(if)g Fh(List2)d Fm(is)h(the)g(sorted)h(list)e(of)k Fh(List1)15 b Fm(according)i(to)g(the)g(k)o(eys.)27 b(The)18 b(list)-30 2402 y Fh(List1)e Fm(consists)i(of)e(items)h(of)f(the)i (form)e Fh(Key-Value)p Fm(.)25 b(These)18 b(items)e(are)i(sorted)f (according)g(to)g(the)g(v)n(alue)f(of)k Fh(Key)-30 2452 y Fm(yielding)12 b(the)h Fh(List2)p Fm(.)k(Duplicate)12 b(k)o(eys)h(are)g(not)f(merged.)18 b(This)13 b(predicate)g(is)g (stable,)g(i.e.)k(if)e Fh(K-A)c Fm(o)q(ccurs)k(b)q(efore)e Fh(K-B)-30 2501 y Fm(in)h(the)g(input,)g(then)g Fh(K-A)f Fm(will)g(o)q(ccur)i(b)q(efore)f Fh(K-B)g Fm(in)f(the)i(output.)-30 2601 y Fh(sort/1)p Fm(,)f Fh(sort0/1)g Fm(and)h Fh(keysort/1)e Fm(are)j(similar)e(to)h Fh(sort/2)p Fm(,)e Fh(sort0/2)h Fm(and)h Fh(keysort/2)e Fm(but)j(ac)o(hiev)o(e)f(a)g(sort)h(in-)-30 2651 y(place)c(destructing)h(the)g(original)d Fh(List1)h Fm(\(this)h(in-place)f(assignmen)o(t)h(is)f(not)h(undone)g(at)g(bac)o (ktrac)o(king\).)17 b(The)12 b(sorted)-30 2701 y(list)i(o)q(ccupies)h (the)g(same)f(memory)f(space)i(as)f(the)g(original)e(list)i(\(sa)o (ving)f(th)o(us)h(memory)g(consumption\).)-30 2800 y(The)h(time)e (complexit)o(y)g(of)h(these)h(sorts)g(is)e Fb(O)q Fm(\()p Fb(N)19 b(l)q(og)d(N)5 b Fm(\),)13 b Fb(N)19 b Fm(b)q(eing)14 b(the)g(length)g(of)f(the)i(list)e(to)h(sort.)-30 2900 y(These)i(predicates)f(refer)g(to)f(the)g(standard)g(ordering)g(of)g (terms)g(\(section)h(7.3.1,)d(page)i(51\).)p eop end %%Page: 126 128 TeXDict begin 126 127 bop -30 -45 a Fm(126)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(Errors)p -30 171 1890 2 v -30 220 2 50 v -3 205 a Fh(List1)f Fm(is)h(a)f(partial)g(list)p 915 220 V 555 w Fh(instantiation)p 1230 205 14 2 v 13 w(error)p 1859 220 2 50 v -30 222 1890 2 v -30 272 2 50 v -3 257 a(List1)g Fm(is)h(neither)g(a)g(partial)f(list)g(nor)h(a)g (list)p 915 272 V 236 w Fh(type)p 1032 257 14 2 v 15 w(error\(list,)19 b(List1\))p 1859 272 2 50 v -30 273 1890 2 v -30 323 2 50 v -3 308 a(List2)13 b Fm(is)h(neither)g(a)g (partial)f(list)g(nor)h(a)g(list)p 915 323 V 236 w Fh(type)p 1032 308 14 2 v 15 w(error\(list,)19 b(List2\))p 1859 323 2 50 v -30 325 1890 2 v -30 408 a Fi(P)o(ortabilit)o(y)-30 507 y Fm(GNU)14 b(Prolog)f(predicates.)-30 673 y Ff(7.21)56 b(Global)18 b(v)m(ariables)-30 800 y Fi(7.21.1)48 b(In)o(tro)q(duction) -30 926 y Fm(GNU)13 b(Prolog)f(pro)o(vides)h(a)f(simple)g(and)h(p)q(o)o (w)o(erful)f(w)o(a)o(y)g(to)g(assign)h(and)f(read)h(global)e(v)n (ariables.)17 b(A)c(global)e(v)n(ariable)g(is)-30 976 y(asso)q(ciated)i(with)f(eac)o(h)h(atom,)e(its)h(initial)e(v)n(alue)i (is)g(the)g(in)o(teger)h(0.)k(A)12 b(global)f(v)n(ariable)g(can)h (store)h(3)f(kinds)g(of)f(ob)r(jects:)33 1059 y Fg(\017)20 b Fm(a)14 b(cop)o(y)g(of)f(a)h(term)g(\(the)g(assignmen)o(t)g(can)g(b)q (e)h(made)f(bac)o(ktrac)o(k)n(able)f(or)h(not\).)33 1142 y Fg(\017)20 b Fm(a)14 b(link)f(to)g(a)h(term)g(\(the)h(assignmen)o(t)f (is)f(alw)o(a)o(ys)g(bac)o(ktrac)o(k)n(able\).)33 1225 y Fg(\017)20 b Fm(an)14 b(arra)o(y)g(of)f(ob)r(jects)i(\(recursiv)o (ely\).)-30 1308 y(The)e(space)g(necessary)h(for)e(copies)g(and)g(arra) o(ys)g(is)g(dynamically)e(allo)q(cated)i(and)g(reco)o(v)o(ered)i(as)e (so)q(on)g(as)g(p)q(ossible.)18 b(F)m(or)-30 1358 y(instance,)c(when)f (an)f(atom)g(is)g(asso)q(ciated)h(with)f(a)h(global)d(v)n(ariable)i (whose)h(curren)o(t)h(v)n(alue)e(is)g(an)g(arra)o(y)m(,)g(the)h(space)h (for)-30 1408 y(this)g(arra)o(y)g(is)g(reco)o(v)o(ered)h(\(unless)g (the)g(assignmen)o(t)e(is)h(to)g(b)q(e)g(undone)h(when)f(bac)o(ktrac)o (king)g(o)q(ccurs\).)-30 1507 y(When)h(a)f(link)f(to)h(a)g(term)h(is)f (asso)q(ciated)h(with)f(a)g(global)f(v)n(ariable,)f(the)j(reference)i (to)d(this)h(term)f(is)g(stored)i(and)e(th)o(us)-30 1557 y(the)h(original)d(term)i(is)g(returned)i(when)e(the)g(con)o(ten)o(t)h (of)e(the)i(v)n(ariable)e(is)g(read.)-30 1657 y Fi(Global)j(v)m (ariable)g(naming)g(con)o(v)o(en)o(tion)p Fm(:)f(a)f(global)e(v)n (ariable)h(is)g(referenced)k(b)o(y)c(an)h(atom.)-30 1756 y(If)d(the)g(v)n(ariable)f(con)o(tains)g(an)h(arra)o(y)m(,)f(an)g (index)h(\(ranging)f(from)g(0\))g(can)h(b)q(e)h(pro)o(vided)e(using)h (a)f(comp)q(ound)h(term)g(whose)-30 1806 y(principal)h(functor)h(is)f (the)h(correp)q(onding)g(atom)f(and)g(the)h(argumen)o(t)f(is)h(the)g (index.)k(In)c(case)g(of)f(a)g(m)o(ulti-dimensional)-30 1856 y(arra)o(y)m(,)h(eac)o(h)i(index)e(is)h(giv)o(en)g(as)g(the)g (argumen)o(ts)g(of)f(the)i(comp)q(ound)f(term.)-30 1956 y(If)j(the)h(v)n(ariable)e(con)o(tains)h(a)f(term)i(\(link)e(or)h(cop)o (y\),)g(it)g(is)g(p)q(ossible)g(to)g(only)f(reference)j(a)e(sub-term)h (b)o(y)f(giving)e(its)-30 2006 y(argumen)o(t)g(n)o(um)o(b)q(er)h (\(also)e(called)h(argumen)o(t)g(selector\).)22 b(Suc)o(h)16 b(a)e(sub-term)i(is)f(sp)q(eci\014ed)i(using)d(a)h(comp)q(ound)g(term) -30 2055 y(whose)c(principal)e(functor)h(is)g Fh(-/2)f Fm(and)h(whose)g(\014rst)h(argumen)o(t)e(is)h(a)g(global)e(v)n(ariable) h(name)g(and)h(the)g(second)h(argumen)o(t)-30 2105 y(is)i(the)h (argumen)o(t)e(n)o(um)o(b)q(er)i(\(from)e(1\).)17 b(This)c(can)g(b)q(e) h(applied)e(recursiv)o(ely)i(to)f(sp)q(ecify)g(a)g(sub-term)g(of)f(an)o (y)h(depth.)18 b(In)-30 2155 y(case)f(of)d(a)h(list,)f(a)h(argumen)o(t) g(n)o(um)o(b)q(er)g(I)g(represen)o(ts)j(the)e(Ith)f(elemen)o(t)g(of)g (the)h(list.)21 b(In)15 b(the)g(rest)i(of)d(this)h(section)h(w)o(e)-30 2205 y(use)f(the)g(op)q(erator)f(notation)f(since)i Fh(-)e Fm(is)h(a)g(prede\014ned)i(in\014x)d(op)q(erator)h(\(section)h (7.14.10,)c(page)j(100\).)-30 2304 y(In)g(the)h(follo)o(wing,)c Fd(GVarName)19 b Fm(represen)o(ts)e(a)c(reference)k(to)c(a)h(global)e (v)n(ariable)h(and)h(its)f(syn)o(tax)h(is)g(as)g(follo)o(ws:)74 2385 y Fd(GVarName)56 b Fm(::=)49 b Fd(atom)518 b Fm(whole)14 b(con)o(ten)o(t)g(of)f(a)h(v)n(ariable)411 2435 y Fd(atom)6 b Fh(\()p Fd(Integer)g Fh(,)p Fm(.)g(.)g(.)h Fh(,)p Fd(Integer)e Fh(\))50 b Fm(elemen)o(t)14 b(of)g(an)f(arra)o(y)411 2484 y Fd(GVarName)5 b Fh(-)p Fd(Integer)249 b Fm(sub-term)15 b(selection)74 2534 y Fd(Integer)78 b Fm(::=)49 b Fd(integer)452 b Fm(immediate)13 b(v)n(alue)411 2584 y Fd(GVarName)430 b Fm(indirect)14 b(v)n(alue)-30 2667 y(When)e(a)g Fd(GVarName)17 b Fm(is)12 b(used)h(as)f(an)f(index)h(or)g(an)f(argumen)o(t)h(n)o(um)o (b)q(er)g(\(i.e.)17 b(indirection\),)12 b(the)g(v)n(alue)f(of)g(this)h (v)n(ariable)-30 2717 y(m)o(ust)i(b)q(e)h(an)e(in)o(teger.)-30 2817 y(Here)j(are)e(some)g(examples)g(of)f(the)i(naming)d(con)o(v)o(en) o(tion:)p eop end %%Page: 127 129 TeXDict begin 127 128 bop -30 -45 a Fm(7.21)41 b(Global)12 b(v)n(ariables)1419 b(127)p -30 -27 1890 4 v -5 108 a Fh(a)137 b Fm(the)15 b(con)o(ten)o(t)f(of)g(v)n(ariable)e(asso)q (ciated)j(with)e Fh(a)h Fm(\(an)o(y)g(kind\))-5 158 y Fh(t\(1\))71 b Fm(the)15 b(2nd)e(elemen)o(t)i(of)e(the)h(arra)o(y)g (asso)q(ciated)h(with)e Fh(t)-5 208 y(t\(k\))71 b Fm(if)13 b(the)i(v)n(alue)e(asso)q(ciated)i(with)e Fh(k)h Fm(is)g(I,)f(the)h (Ith)g(elemen)o(t)h(of)e(the)i(arra)o(y)e(asso)q(ciated)i(with)e Fh(t)-5 258 y(a-1-2)49 b Fm(if)13 b(the)i(v)n(alue)e(asso)q(ciated)i (with)e Fh(a)h Fm(is)g Fh(f\(g\(a,b,c\),2\))p Fm(,)c(the)15 b(sub-term)f Fh(b)-30 355 y Fm(Here)i(are)e(the)g(errors)i(asso)q (ciated)e(with)g(global)e(v)n(ariable)h(names)h(and)g(common)f(to)g (all)g(predicates.)p -30 419 1890 2 v -30 469 2 50 v -3 454 a Fh(GVarName)f Fm(is)i(a)g(v)n(ariable)p 915 469 V 536 w Fh(instantiation)p 1230 454 14 2 v 13 w(error)p 1859 469 2 50 v -30 471 1890 2 v -30 520 2 50 v -3 505 a(GVarName)d Fm(is)h(neither)h(a)f(v)n(ariable)f(nor)i(a)f(callable)f (term)p 915 520 V 52 w Fh(type)p 1032 505 14 2 v 15 w(error\(callable,) 19 b(GVarName\))p 1859 520 2 50 v -30 522 1890 2 v -30 622 2 100 v -3 557 a(GVarName)12 b Fm(con)o(tains)i(an)g(in)o(v)n(alid) d(argumen)o(t)j(n)o(um)o(b)q(er)-3 607 y(\(or)g Fh(GVarName)e Fm(is)i(an)g(arra)o(y\))p 915 622 V 941 557 a Fh(domain)p 1076 557 14 2 v 15 w(error\(g)p 1245 557 V 14 w(argument)p 1435 557 V 14 w(selector,)941 607 y(GVarName\))p 1859 622 2 100 v -30 623 1890 2 v -30 723 2 100 v -3 658 a(GVarName)e Fm(con)o(tains)h(an)g(in)o(v)n(alid)e(index)j(\(or)f Fh(GVarName)-3 708 y Fm(is)h(not)g(an)f(arra)o(y\))p 915 723 V 941 658 a Fh(domain)p 1076 658 14 2 v 15 w(error\(g)p 1245 658 V 14 w(array)p 1369 658 V 14 w(index,)21 b(GVarName\))p 1859 723 2 100 v -30 725 1890 2 v -30 824 2 100 v -3 760 a(GVarName)12 b Fm(is)i(used)h(as)f(an)f(indirect)i(index)f(or)-3 809 y(argumen)o(t)g(selector)h(and)f(is)g(not)f(an)h(in)o(teger)p 915 824 V 941 760 a Fh(type)p 1032 760 14 2 v 15 w(error\(integer,)19 b(GVarName\))p 1859 824 2 100 v -30 826 1890 2 v -30 911 a Fi(Arra)o(ys)p Fm(:)h(the)15 b(predicates)i Fh(g)p 439 911 14 2 v 15 w(assign/2)p Fm(,)c Fh(g)p 677 911 V 15 w(assignb/2)g Fm(and)i Fh(g)p 1007 911 V 16 w(link/2)e Fm(\(section)j(7.21.2,)d(page)h(127\))h(can)g(b)q(e)g(used)-30 961 y(to)f(create)i(an)e(arra)o(y)m(.)j(They)e(recognize)g(some)f (terms)h(as)f(v)n(alues.)k(F)m(or)c(instance,)g(a)g(comp)q(ound)g(term) g(with)g(principal)-30 1011 y(functor)h Fh(g)p 140 1011 V 15 w(array)e Fm(is)h(used)h(to)e(de\014ne)i(an)f(arra)o(y)f(of)h (\014xed)g(size.)19 b(There)c(are)f(3)g(forms)f(for)h(the)g(term)h Fh(g)p 1589 1011 V 15 w(array)p Fm(:)33 1094 y Fg(\017)20 b Fh(g)p 99 1094 V 16 w(array\(Size\))p Fm(:)j(if)d Fh(Size)d Fm(is)h(an)f(in)o(teger)h Fb(>)g Fm(0)g(then)g(de\014nes)h(an)f(arra)o (y)f(of)j Fh(Size)d Fm(elemen)o(ts)i(whic)o(h)e(are)h(all)74 1143 y(initialized)13 b(with)g(the)i(in)o(teger)f Fh(0)p Fm(.)33 1227 y Fg(\017)20 b Fh(g)p 99 1227 V 16 w(array\(Size,)f (Initial\))p Fm(:)c(as)d(ab)q(o)o(v)o(e)g(but)g(the)g(elemen)o(ts)h (are)f(initialized)e(with)h(the)i(term)f Fh(Initial)e Fm(instead)74 1276 y(of)k(0.)j Fh(Initial)c Fm(can)h(con)o(tain)f (other)i(arra)o(y)e(de\014nitions)h(allo)o(wing)e(th)o(us)i(for)g(m)o (ulti-dimensional)d(arra)o(ys.)33 1359 y Fg(\017)20 b Fh(g)p 99 1359 V 16 w(array\(List\))p Fm(:)c(as)e(ab)q(o)o(v)o(e)g(if)i Fh(List)d Fm(is)h(a)g(list)f(of)h(length)g Fh(Size)f Fm(except)i(that)f(the)h(elemen)o(ts)g(of)e(the)i(arra)o(y)f(are)74 1409 y(initialized)f(according)h(to)f(the)i(elemen)o(ts)g(of)h Fh(List)d Fm(\(whic)o(h)h(can)g(con)o(tain)g(other)g(arra)o(y)g (de\014nitions\).)-30 1492 y(An)19 b(arra)o(y)f(can)g(b)q(e)h(extended) h(explicitely)e(using)g(a)g(comp)q(ound)g(term)g(with)g(principal)g (functor)g Fh(g)p 1592 1492 V 16 w(array)p 1718 1492 V 14 w(extend)-30 1542 y Fm(whic)o(h)e(accept)h(the)f(same)g(3)f(forms) g(detailed)h(ab)q(o)o(v)o(e.)22 b(In)16 b(that)g(case,)g(the)g (existing)f(elemen)o(ts)i(of)e(the)h(arra)o(y)f(are)h(not)-30 1592 y(initialized.)h(If)g Fh(g)p 248 1592 V 15 w(array)p 373 1592 V 15 w(extend)c Fm(is)g(used)i(with)f(an)f(ob)r(ject)i(whic)o (h)f(is)f(not)h(an)g(arra)o(y)g(it)f(is)h(similar)e(to)i Fh(g)p 1640 1592 V 15 w(array)p Fm(.)-30 1691 y(Finally)m(,)20 b(an)h(arra)o(y)f(can)h(b)q(e)h Fe(automatic)n(al)r(ly)i Fm(expanded)d(when)h(needed.)40 b(The)21 b(programmer)f(do)q(es)i(not)f (need)g(to)-30 1741 y(explicitely)c(con)o(trol)g(the)h(expansion)g(of)e (an)h(automatic)g(arra)o(y)m(.)28 b(An)17 b(arra)o(y)g(is)g(expanded)i (as)e(so)q(on)g(as)h(an)f(index)g(is)-30 1791 y(outside)g(the)h(curren) o(t)g(size)f(of)f(this)h(arra)o(y)m(.)26 b(Suc)o(h)17 b(an)f(arra)o(y)h(is)f(de\014ned)i(using)f(a)f(comp)q(ound)h(term)g (with)f(principal)-30 1841 y(functor)f Fh(g)p 140 1841 V 15 w(array)p 265 1841 V 15 w(auto)p Fm(:)33 1924 y Fg(\017)20 b Fh(g)p 99 1924 V 16 w(array)p 225 1924 V 14 w(auto\(Size\))p Fm(:)15 b(if)g Fh(Size)c Fm(is)h(an)g(in)o(teger)h Fb(>)g Fm(0)f(then)g(de\014nes)i(an)e(automatic)f(arra)o(y)h(whose)h (initial)d(size)j(is)74 1974 y Fh(Size)p Fm(.)19 b(All)14 b(elemen)o(ts)h(are)g(initialized)e(with)i(the)g(in)o(teger)g Fh(0)p Fm(.)20 b(Elemen)o(ts)15 b(created)h(during)e(implicit)f (expansions)74 2024 y(will)g(b)q(e)h(initialized)f(with)g Fh(0)p Fm(.)33 2107 y Fg(\017)20 b Fh(g)p 99 2107 V 16 w(array)p 225 2107 V 14 w(auto\(Size,)g(Initial\))p Fm(:)f(as)c(ab)q(o) o(v)o(e)g(but)g(the)h(elemen)o(ts)g(are)g(initialized)e(with)g(the)i (term)g Fh(Initial)74 2156 y Fm(instead)11 b(of)f(0.)17 b Fh(Initial)9 b Fm(can)i(con)o(tain)f(other)h(arra)o(y)g (de\014nitions)f(allo)o(wing)e(th)o(us)j(for)g(m)o(ulti-dimensional)d (arra)o(ys.)74 2206 y(Elemen)o(ts)15 b(created)g(during)f(implicit)e (expansions)i(will)f(b)q(e)h(initialized)e(with)i Fh(Initial)p Fm(.)33 2289 y Fg(\017)20 b Fh(g)p 99 2289 V 16 w(array)p 225 2289 V 14 w(auto\(List\))p Fm(:)25 b(as)19 b(ab)q(o)o(v)o(e)f(if)j Fh(List)d Fm(is)g(a)g(list)g(of)g(length)g Fh(Size)g Fm(except)i(that)e(the)h(elemen)o(ts)h(of)e(the)74 2339 y(arra)o(y)c(are)g(initialized)e(according)i(to)f(the)h(elemen)o(ts)h (of)h Fh(List)d Fm(\(whic)o(h)h(can)g(con)o(tain)f(other)h(arra)o(y)g (de\014nitions\).)74 2389 y(Elemen)o(ts)h(created)g(during)f(implicit)e (expansions)i(will)f(b)q(e)h(initialized)e(with)i Fh(0)p Fm(.)-30 2472 y(In)f(an)o(y)e(case,)j(when)e(an)g(arra)o(y)g(is)g (read,)h(a)f(term)g(of)g(the)h(form)e Fh(g)p 975 2472 V 16 w(array\([Elem0,...,)18 b(ElemSize-1]\))10 b Fm(is)i(returned.)-30 2571 y(Some)i(examples)g(using)g(global)e(v)n(ariables)h(are)h(presen)o (ted)i(later)e(\(section)h(7.21.7,)d(page)h(130\).)-30 2729 y Fi(7.21.2)48 b Fh(g)p 165 2729 V 16 w(assign/2)p Fi(,)14 b Fh(g)p 406 2729 V 16 w(assignb/2)p Fi(,)g Fh(g)p 669 2729 V 15 w(link/2)-30 2856 y Fi(T)l(emplates)p eop end %%Page: 128 130 TeXDict begin 128 129 bop -30 -45 a Fm(128)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v 74 115 a Fh(g)p 99 115 14 2 v 16 w(assign\(+callable)p 466 115 V 12 w(term,)21 b(?term\))74 165 y(g)p 99 165 V 16 w(assignb\(+callabl)o(e)p 488 165 V 13 w(term,)g(?term\))74 215 y(g)p 99 215 V 16 w(link\(+callable)p 422 215 V 13 w(term,)f(?term\))-30 298 y Fi(Description)-30 397 y Fh(g)p -5 397 V 16 w(assign\(GVarName,)e(Value\))f Fm(assigns)h(a)g (cop)o(y)g(of)f(the)i(term)f Fh(Value)f Fm(to)g Fh(GVarName)p Fm(.)29 b(This)18 b(assignmen)o(t)g(is)f(not)-30 447 y(undone)e(when)f(bac)o(ktrac)o(king)g(o)q(ccurs.)-30 547 y Fh(g)p -5 547 V 16 w(assignb/2)e Fm(is)i(similar)e(to)i Fh(g)p 472 547 V 15 w(assign/2)e Fm(but)j(the)f(assignmen)o(t)g(is)g (undone)g(at)g(bac)o(ktrac)o(king.)-30 646 y Fh(g)p -5 646 V 16 w(link\(GVarName,)19 b(Value\))13 b Fm(mak)o(es)i(a)g(link)f (b)q(et)o(w)o(een)i Fh(GVarName)d Fm(to)i(the)g(term)h Fh(Value)p Fm(.)k(This)14 b(allo)o(ws)g(the)h(user)h(to)-30 696 y(giv)o(e)d(a)h(name)f(to)h(an)o(y)f(Prolog)f(term)i(\(in)g (particular)f(non-ground)g(terms\).)19 b(Suc)o(h)14 b(an)f(assignmen)o (t)h(is)f(alw)o(a)o(ys)g(undone)-30 746 y(when)20 b(bac)o(ktrac)o(king) f(o)q(ccurs)i(\(since)f(the)g(term)f(ma)o(y)f(no)h(longer)g(exist\).)35 b(If)22 b Fh(Value)c Fm(is)h(an)g(atom)f(or)h(an)g(in)o(teger,)-30 796 y Fh(g)p -5 796 V 16 w(link/2)12 b Fm(and)g Fh(g)p 256 796 V 16 w(assignb/2)f Fm(ha)o(v)o(e)h(the)i(same)f(b)q(eha)o (vior.)k(Since)d Fh(g)p 1064 796 V 15 w(link/2)e Fm(only)g(handles)h (links)f(to)h(existing)f(terms)-30 845 y(it)i(do)q(es)h(not)e(require)i (extra)g(memory)e(space)i(and)f(is)f(not)h(exp)q(ensiv)o(e)h(in)f (terms)g(of)f(execution)i(time.)-30 945 y(NB:)e(argumen)o(t)f (selectors)j(can)d(only)g(b)q(e)h(used)g(with)g(g)p 834 945 13 2 v 14 w(assign/2)f(\(i.e.)17 b(when)c(using)g(an)f(argumen)o(t) g(selector)i(inside)e(an)-30 995 y(assignmen)o(t,)i(this)g(one)g(m)o (ust)g(not)f(b)q(e)i(bac)o(ktrac)o(k)n(able\).)-30 1095 y Fi(Errors)-30 1194 y Fm(See)g(common)e(errors)j(detailed)d(in)h(the)g (in)o(tro)q(duction)g(\(section)h(7.21.1,)c(page)j(126\))p -30 1260 1890 2 v -30 1360 2 100 v -3 1295 a Fh(GVarName)e Fm(con)o(tains)i(an)g(argumen)o(t)f(selector)j(and)d(the)-3 1345 y(assignmen)o(t)h(is)g(bac)o(ktrac)o(k)n(able)p 915 1360 V 941 1295 a Fh(domain)p 1076 1295 14 2 v 15 w(error\(g)p 1245 1295 V 14 w(argument)p 1435 1295 V 14 w(selector,)941 1345 y(GVarName\))p 1859 1360 2 100 v -30 1361 1890 2 v -30 1444 a Fi(P)o(ortabilit)o(y)-30 1544 y Fm(GNU)g(Prolog)f(predicates.)-30 1702 y Fi(7.21.3)48 b Fh(g)p 165 1702 14 2 v 16 w(read/2)-30 1828 y Fi(T)l(emplates)74 1911 y Fh(g)p 99 1911 V 16 w(read\(+callable)p 422 1911 V 13 w(term,)20 b(?term\))-30 1994 y Fi(Description)-30 2094 y Fh(g)p -5 2094 V 16 w(read\(GVarName,)f(Value\))12 b Fm(uni\014es)j Fh(Value)e Fm(with)g(the)i(term)f(assigned)g(to)g Fh(GVarName)p Fm(.)-30 2193 y Fi(Errors)-30 2293 y Fm(See)h(common)e (errors)j(detailed)d(in)h(the)g(in)o(tro)q(duction)g(\(section)h (7.21.1,)c(page)j(126\))-30 2393 y Fi(P)o(ortabilit)o(y)-30 2492 y Fm(GNU)g(Prolog)f(predicate.)-30 2650 y Fi(7.21.4)48 b Fh(g)p 165 2650 V 16 w(array)p 291 2650 V 14 w(size/2)-30 2776 y Fi(T)l(emplates)74 2859 y Fh(g)p 99 2859 V 16 w(array)p 225 2859 V 14 w(size\(+callable)p 547 2859 V 13 w(term,)21 b(?integer\))p eop end %%Page: 129 131 TeXDict begin 129 130 bop -30 -45 a Fm(7.21)41 b(Global)12 b(v)n(ariables)1419 b(129)p -30 -27 1890 4 v -30 115 a Fi(Description)-30 215 y Fh(g)p -5 215 14 2 v 16 w(array)p 121 215 V 15 w(size\(GVarName,)19 b(Value\))10 b Fm(uni\014es)j Fh(Size)e Fm(with)h(the)h(dimension)f(\(an)g(in)o(teger)g Fb(>)h Fm(0\))f(of)f(the)i(arra)o(y)f(assigned)-30 264 y(to)i Fh(GVarName)p Fm(.)j(F)m(ails)12 b(if)k Fh(GVarName)d Fm(is)g(not)h(an)g(arra)o(y)m(.)-30 364 y Fi(Errors)-30 464 y Fm(See)h(common)e(errors)j(detailed)d(in)h(the)g(in)o(tro)q (duction)g(\(section)h(7.21.1,)c(page)j(126\))p -30 528 1890 2 v -30 578 2 50 v -3 563 a Fh(Size)f Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(an)g(in)o(teger)p 915 578 V 215 w Fh(type)p 1032 563 14 2 v 15 w(error\(integer,)19 b(Size\))p 1859 578 2 50 v -30 579 1890 2 v -30 663 a Fi(P)o(ortabilit)o(y)-30 762 y Fm(GNU)14 b(Prolog)f(predicate.)-30 920 y Fi(7.21.5)48 b Fh(g)p 165 920 14 2 v 16 w(inc/3)p Fi(,)15 b Fh(g)p 341 920 V 15 w(inc/2)p Fi(,)g Fh(g)p 516 920 V 16 w(inco/2)p Fi(,)g Fh(g)p 714 920 V 15 w(inc/1)p Fi(,)g Fh(g)p 889 920 V 16 w(dec/3)p Fi(,)g Fh(g)p 1065 920 V 16 w(dec/2)p Fi(,)g Fh(g)p 1241 920 V 15 w(deco/2)p Fi(,)g Fh(g)p 1438 920 V 16 w(dec/1)-30 1047 y Fi(T)l(emplates)74 1130 y Fh(g)p 99 1130 V 16 w(inc\(+callable)p 401 1130 V 13 w(term,)20 b(?integer,)g(?integer\))74 1179 y(g)p 99 1179 V 16 w(inc\(+callable)p 401 1179 V 13 w(term,)g(?integer\))74 1229 y(g)p 99 1229 V 16 w(inco\(+callable)p 422 1229 V 13 w(term,)g(?integer\))74 1279 y(g)p 99 1279 V 16 w(inc\(+callable)p 401 1279 V 13 w(term\))74 1329 y(g)p 99 1329 V 16 w(dec\(+callable)p 401 1329 V 13 w(term,)g(?integer,)g (?integer\))74 1379 y(g)p 99 1379 V 16 w(dec\(+callable)p 401 1379 V 13 w(term,)g(?integer\))74 1429 y(g)p 99 1429 V 16 w(deco\(+callable)p 422 1429 V 13 w(term,)g(?integer\))74 1478 y(g)p 99 1478 V 16 w(dec\(+callable)p 401 1478 V 13 w(term\))-30 1561 y Fi(Description)-30 1661 y Fh(g)p -5 1661 V 16 w(inc\(GVarName,)f(Old,)i(New\))16 b Fm(uni\014es)h Fh(Old)f Fm(with)g(the)h(in)o(teger)g(assigned)g(to)f Fh(GVarName)p Fm(,)f(incremen)o(ts)j Fh(GVarName)-30 1711 y Fm(and)c(then)h(uni\014es)f Fh(New)f Fm(with)h(the)g(incremen)o (ted)i(v)n(alue.)-30 1810 y Fh(g)p -5 1810 V 16 w(inc\(GVarName,)j (New\))13 b Fm(is)h(equiv)n(alen)o(t)f(to)h Fh(g)p 729 1810 V 15 w(inc\(GVarName,)p 1049 1810 V 35 w(,)22 b(New\))p Fm(.)-30 1910 y Fh(g)p -5 1910 V 16 w(inco\(GVarName,)d(Old\))13 b Fm(is)h(equiv)n(alen)o(t)f(to)h Fh(g)p 751 1910 V 15 w(inc\(GVarName,)19 b(Old,)p 1180 1910 V 37 w(\))p Fm(.)-30 2010 y Fh(g)p -5 2010 V 16 w(inc\(GVarName\))11 b Fm(is)j(equiv)n(alen) o(t)f(to)h Fh(g)p 620 2010 V 15 w(inc\(GVarName,)p 940 2010 V 35 w(,)p 999 2010 V 37 w(\))p Fm(.)-30 2109 y(Predicates)i Fh(g)p 197 2109 V 16 w(dec)d Fm(are)h(similar)e(but)j(decremen)o(t)g (the)g(con)o(ten)o(t)f(of)j Fh(GVarName)12 b Fm(instead.)-30 2209 y Fi(Errors)-30 2309 y Fm(See)j(common)e(errors)j(detailed)d(in)h (the)g(in)o(tro)q(duction)g(\(section)h(7.21.1,)c(page)j(126\))p -30 2375 1890 2 v -30 2424 2 50 v -3 2409 a Fh(Old)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in)o(teger)p 915 2424 V 237 w Fh(type)p 1032 2409 14 2 v 15 w(error\(integer,)19 b(Old\))p 1859 2424 2 50 v -30 2426 1890 2 v -30 2476 2 50 v -3 2461 a(New)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an) g(in)o(teger)p 915 2476 V 237 w Fh(type)p 1032 2461 14 2 v 15 w(error\(integer,)19 b(New\))p 1859 2476 2 50 v -30 2478 1890 2 v -30 2527 2 50 v -3 2512 a(GVarName)12 b Fm(stores)j(an)f(arra)o(y)p 915 2527 V 485 w Fh(type)p 1032 2512 14 2 v 15 w(error\(integer,)19 b(g)p 1396 2512 V 15 w(array\))p 1859 2527 2 50 v -30 2529 1890 2 v -30 2579 2 50 v -3 2564 a(GVarName)12 b Fm(stores)j(a)f(term)g Fh(T)g Fm(whic)o(h)g(is)f(not)h(an)g(in)o(teger)p 915 2579 V 53 w Fh(type)p 1032 2564 14 2 v 15 w(error\(integer,)19 b(T\))p 1859 2579 2 50 v -30 2580 1890 2 v -30 2663 a Fi(P)o(ortabilit)o(y)-30 2763 y Fm(GNU)14 b(Prolog)f(predicates.)p eop end %%Page: 130 132 TeXDict begin 130 131 bop -30 -45 a Fm(130)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(7.21.6)48 b Fh(g)p 165 115 14 2 v 16 w(set)p 247 115 V 15 w(bit/2)p Fi(,)15 b Fh(g)p 422 115 V 15 w(reset)p 547 115 V 15 w(bit/2)p Fi(,)g Fh(g)p 722 115 V 16 w(test)p 826 115 V 15 w(set)p 907 115 V 15 w(bit/2)p Fi(,)g Fh(g)p 1082 115 V 15 w(test)p 1185 115 V 15 w(reset)p 1310 115 V 15 w(bit/2)-30 241 y Fi(T)l(emplates)74 310 y Fh(g)p 99 310 V 16 w(set)p 181 310 V 15 w(bit\(+callable)p 482 310 V 13 w(term,)21 b(+integer\))74 360 y(g)p 99 360 V 16 w(reset)p 225 360 V 14 w(bit\(+callable)p 525 360 V 13 w(term,)g(+integer\))74 410 y(g)p 99 410 V 16 w(test)p 203 410 V 15 w(set)p 284 410 V 15 w(bit\(+callable)p 585 410 V 13 w(term,)f(+integer\))74 459 y(g)p 99 459 V 16 w(test)p 203 459 V 15 w(reset)p 328 459 V 14 w(bit\(+callable)p 628 459 V 13 w(term,)h(+integer\))-30 528 y Fi(Description)-30 628 y Fh(g)p -5 628 V 16 w(set)p 77 628 V 15 w(bit\(GVarName,)e(Bit\))11 b Fm(sets)h(to)f(1)g(the)h(bit) f(n)o(um)o(b)q(er)h(sp)q(eci\014ed)h(b)o(y)e Fh(Bit)g Fm(of)g(the)g(in)o(teger)h(assigned)g(to)f Fh(GVarName)-30 677 y Fm(to)21 b(1.)37 b(Bit)20 b(n)o(um)o(b)q(ers)i(range)e(from)g(0)g (to)g(the)h(maxim)o(um)d(n)o(um)o(b)q(er)j(allo)o(w)o(ed)e(for)h(in)o (tegers)i(\(this)e(is)g(arc)o(hitecture)-30 727 y(dep)q(enden)o(t\).)g (If)d Fh(Bit)c Fm(is)h(greater)h(than)f(this)g(limit,)e(the)i(mo)q (dulo)f(with)g(this)h(limit)e(is)i(tak)o(en.)-30 827 y Fh(g)p -5 827 V 16 w(reset)p 121 827 V 15 w(bit\(GVarName,)19 b(Bit\))13 b Fm(is)g(similar)g(to)h Fh(g)p 793 827 V 15 w(set)p 874 827 V 15 w(bit/2)f Fm(but)h(sets)h(the)g(sp)q(eci\014ed) g(bit)f(to)f(0.)-30 926 y Fh(g)p -5 926 V 16 w(test)p 99 926 V 15 w(set)p 180 926 V 15 w(bit/2)g Fm(succeeds)j(if)d(the)i(sp) q(eci\014ed)g(bit)f(is)f(set)i(to)f(1.)-30 1026 y Fh(g)p -5 1026 V 16 w(test)p 99 1026 V 15 w(reset)p 224 1026 V 14 w(bit/2)f Fm(succeeds)k(if)c(the)h(sp)q(eci\014ed)i(bit)d(is)h (set)h(to)f(0.)-30 1126 y Fi(Errors)-30 1225 y Fm(See)h(common)e (errors)j(detailed)d(in)h(the)g(in)o(tro)q(duction)g(\(section)h (7.21.1,)c(page)j(126\))p -30 1291 1890 2 v -30 1341 2 50 v -3 1326 a Fh(Bit)f Fm(is)h(a)g(v)n(ariable)p 915 1341 V 645 w Fh(instantiation)p 1230 1326 14 2 v 13 w(error)p 1859 1341 2 50 v -30 1343 1890 2 v -30 1393 2 50 v -3 1378 a(Bit)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in)o(teger) p 915 1393 V 237 w Fh(type)p 1032 1378 14 2 v 15 w(error\(integer,)19 b(Bit\))p 1859 1393 2 50 v -30 1394 1890 2 v -30 1444 2 50 v -3 1429 a(Bit)13 b Fm(is)h(an)g(in)o(teger)g Fb(<)g Fm(0)p 915 1444 V 561 w Fh(domain)p 1076 1429 14 2 v 15 w(error\(not)p 1289 1429 V 13 w(less)p 1390 1429 V 15 w(than)p 1493 1429 V 15 w(zero,)21 b(Bit\))p 1859 1444 2 50 v -30 1446 1890 2 v -30 1496 2 50 v -3 1481 a(GVarName)12 b Fm(stores)j(an)f(arra)o(y)p 915 1496 V 485 w Fh(type)p 1032 1481 14 2 v 15 w(error\(integer,)19 b(g)p 1396 1481 V 15 w(array\))p 1859 1496 2 50 v -30 1497 1890 2 v -30 1547 2 50 v -3 1532 a(GVarName)12 b Fm(stores)j(a)f(term)g Fh(T)g Fm(whic)o(h)g(is)f(not)h(an)g(in)o(teger) p 915 1547 V 53 w Fh(type)p 1032 1532 14 2 v 15 w(error\(integer,)19 b(T\))p 1859 1547 2 50 v -30 1549 1890 2 v -30 1632 a Fi(P)o(ortabilit)o(y)-30 1731 y Fm(GNU)14 b(Prolog)f(predicates.)-30 1886 y Fi(7.21.7)48 b(Examples)-30 2012 y(Sim)o(ulating)15 b Fh(g)p 235 2012 14 2 v 16 w(inc/3)p Fm(:)i(this)d(predicate)h(b)q (eha)o(v)o(es)g(lik)o(e:)i(global)12 b(v)n(ariable:)74 2081 y Fh(my_g_inc\(Var,)19 b(Old,)i(New\))g(:-)249 2131 y(g_read\(Var,)e(Old\),)249 2180 y(N)i(is)h(Value)e(+)i(1,)249 2230 y(g_assign\(Var,)d(X\),)74 2280 y(New)i(=)h(N.)-30 2349 y Fm(The)17 b(query:)23 b Fh(my)p 241 2349 V 15 w(g)p 278 2349 V 15 w(inc\(c,)e(X,)p 511 2349 V 37 w(\))16 b Fm(will)e(succeed)k(unifying)d Fh(X)h Fm(with)g Fh(0)p Fm(,)f(another)i(call)e(to)h Fh(my)p 1475 2349 V 15 w(g)p 1512 2349 V 15 w(inc\(a,)21 b(Y,)p 1745 2349 V 37 w(\))16 b Fm(will)-30 2398 y(then)f(unify)f Fh(Y)f Fm(with)h Fh(1)p Fm(,)f(and)h(so)g(on.)-30 2498 y Fi(Di\013erence)k(b)q(et)o(w)o (een)f Fh(g)p 414 2498 V 15 w(assign/2)g Fi(and)h Fh(g)p 739 2498 V 16 w(assignb/2)p Fm(:)j Fh(g)p 1008 2498 V 15 w(assign/2)15 b Fm(do)q(es)i(not)f(undo)g(its)h(assignmen)o(t)f (when)-30 2548 y(bac)o(ktrac)o(king)e(o)q(ccurs)h(whereas)h Fh(g)p 526 2548 V 15 w(assignb/2)c Fm(undo)q(es)j(it.)74 2615 y Fh(test\(Old\))20 b(:-)490 b(testb\(Old\))20 b(:-)249 2665 y(g)p 274 2665 V 15 w(assign\(x,1\),)451 b(g)p 1026 2665 V 15 w(assign\(x,1\),)249 2715 y(\()65 b(g)p 361 2715 V 15 w(read\(x,)21 b(Old\),)343 b(\()65 b(g)p 1113 2715 V 15 w(read\(x,)21 b(Old\),)336 2764 y Fd(g)p 361 2764 V 15 w(assign)6 b Fh(\(x,)21 b(2\))446 b Fd(g)p 1113 2764 V 15 w(assignb)6 b Fh(\(x,)21 b(2\))249 2814 y(;)65 b(g)p 361 2814 V 15 w(read\(x,)21 b(Old\),)343 b(;)65 b(g)p 1113 2814 V 15 w(read\(x,)21 b(Old\),)336 2864 y(g)p 361 2864 V 15 w(assign\(x,)f(3\))453 b(g)p 1113 2864 V 15 w(assign\(x,)20 b(3\))249 2914 y(\).)708 b(\).)p eop end %%Page: 131 133 TeXDict begin 131 132 bop -30 -45 a Fm(7.21)41 b(Global)12 b(v)n(ariables)1419 b(131)p -30 -27 1890 4 v -30 115 a(The)15 b(query)h Fh(test\(Old\))c Fm(will)h(succeed)j(unifying)d Fh(Old)h Fm(with)g Fh(1)g Fm(and)g(on)g(bac)o(ktrac)o(king)g(with)g Fh(2)g Fm(\(i.e.)k(the)d(assignmen)o(t)-30 165 y(of)h(the)h(v)n(alue)f Fh(2)g Fm(has)g(not)g(b)q(een)h(undone\).)26 b(The)17 b(query)g Fh(testb\(Old\))d Fm(will)h(succeed)k(unifying)c Fh(Old)g Fm(with)h Fh(1)g Fm(and)g(on)-30 215 y(bac)o(ktrac)o(king)e (with)g Fh(1)f Fm(\(i.e.)18 b(the)c(assignmen)o(t)g(of)f(the)i(v)n (alue)e Fh(2)h Fm(has)g(b)q(een)h(undone\).)-30 314 y Fi(Di\013erence)21 b(b)q(et)o(w)o(een)g Fh(g)p 421 314 14 2 v 16 w(assign/2)f Fi(and)i Fh(g)p 754 314 V 15 w(link/2)p Fm(:)28 b Fh(g)p 963 314 V 15 w(assign/2)18 b Fm(\(and)h Fh(g)p 1296 314 V 16 w(assignb/2)p Fm(\))e(creates)k(a)e(cop)o(y)h(of) -30 364 y(the)d(term)g(whereas)h Fh(g)p 331 364 V 15 w(link/2)d Fm(do)q(es)i(not.)26 b Fh(g)p 709 364 V 15 w(link/2)15 b Fm(can)i(b)q(e)g(used)g(to)f(a)o(v)o(oid)f(passing)h(big) g(data)g(structures)j(\(e.g.)-30 414 y(dictionaries,.)6 b(.)h(.)f(\))19 b(as)14 b(argumen)o(ts)g(to)g(predicates.)74 496 y Fh(test\(B\))21 b(:-)533 b(test\(B\))21 b(:-)249 546 y Fd(g)p 274 546 V 15 w(assign)6 b Fh(\(b,)21 b(f\(X\)\),)358 b Fd(g)p 1026 546 V 15 w(link)7 b Fh(\(b,)21 b(f\(X\)\),)249 596 y(X)g(=)h(12,)599 b(X)21 b(=)h(12,)249 646 y(g)p 274 646 V 15 w(read\(b,)e(B\).)475 b(g)p 1026 646 V 15 w(read\(b,)21 b(B\).)-30 729 y Fm(The)d(query)h Fh(test\(B\))d Fm(will)g(succeed)k(unifying)c Fh(B)h Fm(with)g Fh(f\()p 934 729 V 16 w(\))g Fm(\()p Fh(g)p 1027 729 V 16 w(assign/2)e Fm(assigns)j(a)f(cop)o(y)h(of)e(the)j(v)n(alue\).)28 b(The)-30 779 y(query)15 b Fh(testl\(B\))e Fm(will)f(succeed)k (unifying)d Fh(B)h Fm(with)f Fh(f\(12\))g Fm(\()p Fh(g)p 959 779 V 16 w(link/2)f Fm(assigns)i(a)g(p)q(oin)o(ter)g(to)g(the)g (term\).)-30 879 y Fi(Simple)i(arra)o(y)f(de\014nition)p Fm(:)h(here)f(are)f(some)g(queries)h(to)f(sho)o(w)g(ho)o(w)f(arra)o(ys) h(can)g(b)q(e)h(handled:)74 962 y Fh(|)22 b(?-)f(g_assign\(w,)f (g_array\(3\)\),)f(g_read\(w,)h(X\).)74 1061 y(X)i(=)f (g_array\([0,0,0]\))74 1161 y(|)h(?-)f(g_assign\(w\(0\),)e(16\),)i (g_assign\(w\(1\),)e(32\),)i(g_assign\(w\(2\),)e(64\),)i(g_read\(w,)f (X\).)74 1261 y(X)i(=)f(g_array\([16,32,64]\))-30 1344 y Fm(this)14 b(is)g(equiv)n(alen)o(t)f(to:)74 1427 y Fh(|)22 b(?-)f(g_assign\(k,)f(g_array\([16,32,6)o(4]\)\),)e(g_read\(k,) i(X\).)74 1526 y(X)i(=)f(g_array\([16,32,64]\))74 1626 y(|)h(?-)f(g_assign\(k,)f(g_array\(3,null\)\))o(,)f(g_read\(k,)h(X\),)h (g_array_size\(k,)e(S\).)74 1726 y(S)j(=)f(3)74 1775 y(X)h(=)f(g_array\([null,null,)o(null])o(\))-30 1858 y Fi(2-D)16 b(arra)o(y)f(de\014nition)p Fm(:)74 1941 y Fh(|)22 b(?-)f(g_assign\(w,)f(g_array\(2,)f(g_array\(3\)\)\),)h (g_read\(w,)f(X\).)74 2041 y(X)j(=)f(g_array\([g_array\([0)o(,0,0])o (\),g_a)o(rray\()o([0,0,)o(0]\)]\))74 2141 y(|)h(?-)f(\()65 b(for\(I,0,1\),)20 b(for\(J,0,2\),)f(K)j(is)f(I*3+J,)g (g_assign\(w\(I,J\),)d(K\),)270 2190 y(fail)183 2240 y(;)65 b(g_read\(w,)20 b(X\))183 2290 y(\).)74 2390 y(X)i(=)f (g_array\([g_array\([0)o(,1,2])o(\),g_a)o(rray\()o([3,4,)o(5]\)]\))74 2489 y(|)h(?-)f(g_read\(w\(1\),X\).)74 2589 y(X)h(=)f (g_array\([3,4,5]\))-30 2672 y Fi(Hybrid)16 b(arra)o(y)q Fm(:)74 2755 y Fh(|)22 b(?-)f(g_assign\(w,g_array)o(\([1,2)o(,g_ar)o (ray\([)o(a,b,c)o(]\),)e(g_array\(2,z\),5])o(\)\),)g(g_read\(w,)h(X\).) 74 2855 y(X)i(=)f(g_array\([1,2,g_arra)o(y\([a,)o(b,c]\))o(,)e (g_array\([z,z]\),5])o(\))p eop end %%Page: 132 134 TeXDict begin 132 133 bop -30 -45 a Fm(132)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v 74 115 a Fh(|)22 b(?-)f(g_read\(w\(1\),)f(X\),)h (g_read\(w\(2,1\),)e(Y\),)i(g_read\(w\(3,1\),)e(Z\).)74 215 y(X)j(=)f(2)74 264 y(Y)h(=)f(b)74 314 y(Z)h(=)f(z)74 414 y(|)h(?-)f(g_read\(w\(1,2\),X\).)74 464 y(uncaught)f(exception:)g (error\(domain_error)o(\(g_ar)o(ray_i)o(ndex)o(,w\(1,)o(2\)\),g)o (_read)o(/2\))-30 539 y Fi(Arra)o(y)c(extension)p Fm(:)74 615 y Fh(|)22 b(?-)f(g_assign\(a,)f(g_array\([10,20,3)o(0]\)\),)e (g_read\(a,)i(X\).)74 714 y(X)i(=)f(g_array\([10,20,30]\))74 814 y(|)h(?-)f(g_assign\(a,)f(g_array_extend\(5)o(,null)o(\)\),)f (g_read\(a,)g(X\).)74 914 y(X)j(=)f(g_array\([10,20,30,n)o(ull,n)o (ull]\))74 1013 y(|)h(?-)f(g_assign\(a,)f(g_array\([10,20,3)o(0]\)\),)e (g_read\(a,)i(X\).)74 1113 y(X)i(=)f(g_array\([10,20,30]\))74 1213 y(|)h(?-)f(g_assign\(a,)f(g_array_extend\([)o(1,2,3)o(,4,5,)o (6]\)\),)e(g_read\(a,)i(X\).)74 1312 y(X)i(=)f(g_array\([10,20,30,4)o (,5,6])o(\))-30 1388 y Fi(Automatic)15 b(arra)o(y)q Fm(:)74 1463 y Fh(|)22 b(?-)f(g_assign\(t,)f(g_array_auto\(3\)\))o(,)f (g_assign\(t\(1\),)g(foo\),)i(g_read\(t,X\).)74 1563 y(X)h(=)f(g_array\([0,foo,0]\))74 1663 y(|)h(?-)f(g_assign\(t\(5\),)e (bar\),)i(g_read\(t,X\).)74 1762 y(X)h(=)f(g_array\([0,foo,0,0,)o (0,bar)o(,0,0])o(\))74 1862 y(|)h(?-)f(g_assign\(t,)f(g_array_auto\(2,) e(g_array\(2\)\)\),)i(g_assign\(t\(1,1\))o(,)f(foo\),)183 1912 y(g_read\(t,X\).)74 2011 y(X)j(=)f(g_array\([g_array\([0)o(,0]\),) o(g_arr)o(ay\([0)o(,foo])o(\)]\))74 2111 y(|)h(?-)f (g_assign\(t\(3,0\),)e(bar\),)h(g_read\(t,X\).)74 2211 y(X)i(=)f(g_array\([g_array\([0)o(,0]\),)o(g_arr)o(ay\([0)o(,foo])o (\),g_a)o(rray)o(\([0,0)o(]\),g_)o(array)o(\([bar)o(,0]\)])o(\))74 2310 y(|)h(?-)f(g_assign\(t\(3,4\),)e(bar\),)h(g_read\(t,X\).)74 2360 y(uncaught)g(exception:)g(error\(domain_error)o(\(g_ar)o(ray_i)o (ndex)o(,t\(3,)o(4\)\),g)o(_assi)o(gn/2\))74 2460 y(|)i(?-)f (g_assign\(t,)f(g_array_auto\(2,)e(g_array_auto\(2\)\)\),)g (g_assign\(t\(1,1\),)h(foo\),)183 2510 y(g_read\(t,X\).)74 2609 y(X)j(=)f(g_array\([g_array\([0)o(,0]\),)o(g_arr)o(ay\([0)o(,foo]) o(\)]\))74 2709 y(|)h(?-)f(g_assign\(t\(3,3\),)e(bar\),)h (g_read\(t,X\).)74 2808 y(X)i(=)f(g_array\([g_array\([0)o(,0]\),)o (g_arr)o(ay\([0)o(,foo])o(\),g_a)o(rray)o(\([0,0)o(]\),)161 2858 y(g_array\([0,0,0,bar])o(\)]\))p eop end %%Page: 133 135 TeXDict begin 133 134 bop -30 -45 a Fm(7.22)41 b(Prolog)13 b(state)1493 b(133)p -30 -27 1890 4 v 74 115 a Fh(|)22 b(?-)f(g_assign\(t,)f(g_array_auto\(2,)e(g_array_auto\(2,)h (null\)\)\),)h(g_read\(t\(2,3\),)f(U\),)183 165 y(g_read\(t,)h(X\).)74 264 y(U)i(=)f(null)74 314 y(X)h(=)f(g_array\([g_array\([n)o(ull,n)o (ull]\))o(,g_ar)o(ray\([)o(null,)o(null)o(]\),)358 364 y(g_array\([null,n)o(ull,n)o(ull,n)o(ull]\))o(,g_ar)o(ray\()o([null)o (,null)o(]\)]\))-30 530 y Ff(7.22)56 b(Prolog)19 b(state)-30 656 y Fi(7.22.1)48 b Fh(set)p 209 656 14 2 v 15 w(prolog)p 356 656 V 15 w(flag/2)-30 783 y Fi(T)l(emplates)74 866 y Fh(set)p 143 866 V 15 w(prolog)p 290 866 V 15 w(flag\(+flag,)19 b(+term\))-30 949 y Fi(Description)-30 1049 y Fh(set)p 39 1049 V 16 w(prolog)p 187 1049 V 14 w(flag\(Flag,)h(Value\))12 b Fm(sets)j(the)g(v)n(alue)e(of)g(the)i(Prolog)e(\015ag)h Fh(Flag)f Fm(to)g Fh(Value)p Fm(.)-30 1148 y Fi(Prolog)g(\015ags)p Fm(:)k(a)12 b(Prolog)f(\015ag)h(is)g(an)f(atom)h(whic)o(h)g(is)g(asso)q (ciated)g(with)g(a)g(v)n(alue)f(that)i(is)e(either)i(implemen)o(tation) e(de-)-30 1198 y(\014ned)h(or)f(de\014ned)h(b)o(y)e(the)i(user.)18 b(Eac)o(h)11 b(\015ag)f(has)h(a)g(p)q(ermitted)h(range)f(of)f(v)n (alues;)h(an)o(y)f(other)i(v)n(alue)e(is)h(a)f Fh(domain)p 1728 1198 V 15 w(error)p Fm(.)-30 1248 y(The)15 b(follo)o(wing)c(t)o(w) o(o)i(tables)h(presen)o(t)h(a)o(v)n(ailable)d(\015ags,)h(the)h(p)q (ossible)g(v)n(alues,)f(a)g(description)i(and)e(if)g(they)h(are)g(ISO)g (or)-30 1298 y(an)g(extension.)19 b(The)14 b(\014rst)h(table)f(presen)o (ts)i(unc)o(hangeable)e(\015ags)g(while)f(the)i(second)g(one)f(the)g(c) o(hangeable)h(\015ags.)j(F)m(or)-30 1347 y(\015ags)c(whose)h(default)e (v)n(alues)h(is)g(mac)o(hine)f(indep)q(enden)o(t,)i(this)f(v)n(alue)f (is)h(underlined)p 1132 1354 192 2 v(.)-30 1447 y Fi(Unc)o(hangeable)g (\015ags)p Fm(:)p -30 1511 1838 2 v -30 1561 2 50 v -3 1546 a(Flag)p 553 1561 V 573 w(V)m(alues)p 865 1561 V 122 w(Description)p 1684 1561 V 613 w(ISO)p 1806 1561 V -30 1562 1838 2 v -30 1572 V -30 1622 2 50 v -3 1607 a Fh(bounded)p 553 1622 V 437 w(true)p 588 1614 88 2 v 13 w Fm(/)f Fh(false)p 865 1622 2 50 v 58 w Fm(are)i(in)o(tegers)f(b) q(ounded)h(?)p 1684 1622 V 426 w(Y)p 1806 1622 V -30 1624 1838 2 v -30 1673 2 50 v -3 1659 a Fh(max)p 66 1659 14 2 v 15 w(integer)p 553 1673 2 50 v 387 w Fm(an)f(in)o(teger)p 865 1673 V 91 w(greatest)h(in)o(teger)p 1684 1673 V 559 w(Y)p 1806 1673 V -30 1675 1838 2 v -30 1725 2 50 v -3 1710 a Fh(min)p 66 1710 14 2 v 15 w(integer)p 553 1725 2 50 v 387 w Fm(an)f(in)o(teger)p 865 1725 V 91 w(smallest)g(in)o (teger)p 1684 1725 V 556 w(Y)p 1806 1725 V -30 1727 1838 2 v -30 1826 2 100 v -3 1761 a Fh(integer)p 154 1761 14 2 v 14 w(rounding)p 344 1761 V 14 w(function)p 553 1826 2 100 v 62 w(toward)p 728 1761 14 2 v 15 w(zero)666 1811 y(down)p 865 1826 2 100 v 891 1761 a Fd(rnd)7 b Fh(\(X\))13 b Fm(=)h(in)o(teger)h(part)f(of)i Fh(X)891 1811 y Fd(rnd)7 b Fh(\(X\))13 b Fm(=)h Fg(b)p Fh(X)p Fg(c)h Fm(\(section)g(7.6.1,)c(page)j(57\))p 1684 1826 V 1730 1761 a(Y)p 1806 1826 V -30 1828 1838 2 v -30 1878 2 50 v -3 1863 a Fh(max)p 66 1863 14 2 v 15 w(arity)p 553 1878 2 50 v 431 w Fm(an)g(in)o(teger)p 865 1878 V 91 w(maxim)o(um)e(arit)o(y)h(for)g(comp)q(ound)h(terms)g(\(255\))p 1684 1878 V 71 w(Y)p 1806 1878 V -30 1879 1838 2 v -30 1929 2 50 v -3 1914 a Fh(max)p 66 1914 14 2 v 15 w(atom)p 553 1929 2 50 v 453 w Fm(an)g(in)o(teger)p 865 1929 V 91 w(maxim)o(um)e(n)o(um)o(b)q(er)i(of)f(atoms)p 1684 1929 V 338 w(N)p 1806 1929 V -30 1931 1838 2 v -30 1981 2 50 v -3 1966 a Fh(max)p 66 1966 14 2 v 15 w(unget)p 553 1981 2 50 v 431 w Fm(an)h(in)o(teger)p 865 1981 V 91 w(maxim)o(um)e(n)o(um)o(b)q(er)i(of)f(successiv)o(e)k(ungets)p 1684 1981 V 137 w(N)p 1806 1981 V -30 1982 1838 2 v -30 2032 2 50 v -3 2017 a Fh(prolog)p 132 2017 14 2 v 14 w(name)p 553 2032 2 50 v 404 w Fm(an)d(atom)p 865 2032 V 105 w(name)g(of)f(the)i(Prolog)e(system)p 1684 2032 V 354 w(N)p 1806 2032 V -30 2034 1838 2 v -30 2084 2 50 v -3 2069 a Fh(prolog)p 132 2069 14 2 v 14 w(version)p 553 2084 2 50 v 338 w Fm(an)h(atom)p 865 2084 V 105 w(v)o(ersion)g(n)o (um)o(b)q(er)h(of)e(the)h(Prolog)f(system)p 1684 2084 V 173 w(N)p 1806 2084 V -30 2085 1838 2 v -30 2135 2 50 v -3 2120 a Fh(prolog)p 132 2120 14 2 v 14 w(date)p 553 2135 2 50 v 404 w Fm(an)h(atom)p 865 2135 V 105 w(date)h(of)e(the)h (Prolog)f(system)p 1684 2135 V 373 w(N)p 1806 2135 V -30 2137 1838 2 v -30 2187 2 50 v -3 2172 a Fh(prolog)p 132 2172 14 2 v 14 w(copyright)p 553 2187 2 50 v 294 w Fm(an)h(atom)p 865 2187 V 105 w(cop)o(yrigh)o(t)g(message)g(of)g(the) g(Prolog)f(system)p 1684 2187 V 122 w(N)p 1806 2187 V -30 2188 1838 2 v -30 2271 a Fi(Changeable)j(\015ags)p Fm(:)p eop end %%Page: 134 136 TeXDict begin 134 135 bop -30 -45 a Fm(134)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1873 2 v -30 125 2 50 v -3 110 a(Flag)p 553 125 V 608 w(V)m(alues)p 936 125 V 158 w(Description)p 1719 125 V 577 w(ISO)p 1842 125 V -30 127 1873 2 v -30 136 V -30 186 2 50 v -3 171 a Fh(char)p 88 171 14 2 v 15 w(conversion)p 553 186 2 50 v 347 w(on)f Fm(/)h Fh(off)p 759 178 66 2 v 936 186 2 50 v 137 w Fm(is)g(c)o(haracter)h(con)o(v)o (ersion)f(activ)n(ated)g(?)p 1719 186 V 180 w(Y)p 1842 186 V -30 188 1873 2 v -30 238 2 50 v -3 223 a Fh(debug)p 553 238 V 560 w(on)f Fm(/)h Fh(off)p 759 230 66 2 v 936 238 2 50 v 137 w Fm(is)g(the)g(debugger)h(activ)n(ated)f(?)p 1719 238 V 314 w(Y)p 1842 238 V -30 239 1873 2 v -30 289 2 50 v -3 274 a Fh(singleton)p 198 274 14 2 v 14 w(warning)p 553 289 2 50 v 304 w(on)p 667 281 44 2 v 13 w Fm(/)g Fh(off)p 936 289 2 50 v 137 w Fm(w)o(arn)g(ab)q(out)g (named)f(singleton)h(v)n(ariables)f(?)p 1719 289 V 81 w(N)p 1842 289 V -30 291 1873 2 v -30 341 2 50 v -3 326 a Fh(strict)p 132 326 14 2 v 14 w(iso)p 553 341 2 50 v 458 w(on)p 667 333 44 2 v 13 w Fm(/)h Fh(off)p 936 341 2 50 v 137 w Fm(strict)h(ISO)f(b)q(eha)o(vior)g(?)p 1719 341 V 421 w(N)p 1842 341 V -30 342 1873 2 v -30 691 2 349 v -3 427 a Fh(double)p 132 427 14 2 v 14 w(quotes)p 553 691 2 349 v 427 w(atom)691 477 y(chars)691 527 y(codes)p 691 534 109 2 v 599 577 a(atom)p 690 577 14 2 v 15 w(no)p 749 577 V 15 w(escape)588 626 y(chars)p 701 626 V 15 w(no)p 760 626 V 15 w(escape)588 676 y(codes)p 701 676 V 15 w(no)p 760 676 V 15 w(escape)p 936 691 2 349 v 962 377 a Fm(a)g(double)g(quoted)g(constan)o(t)g(is)g(returned)i(as:)962 427 y(an)e(atom)962 477 y(a)g(list)f(of)g(c)o(haracters)962 527 y(a)h(list)f(of)g(c)o(haracter)j(co)q(des)962 577 y(as)e Fh(atom)f Fm(but)h(ignore)g(escap)q(e)h(sequences)962 626 y(as)f Fh(chars)f Fm(but)h(ignore)g(escap)q(e)h(sequences)962 676 y(as)f Fh(code)f Fm(but)h(ignore)g(escap)q(e)h(sequences)p 1719 691 V 1766 427 a(Y)1766 577 y(N)p 1842 691 V -30 693 1873 2 v -30 1041 2 349 v -3 777 a Fh(back)p 88 777 14 2 v 15 w(quotes)p 553 1041 2 349 v 470 w(atom)691 827 y(chars)691 877 y(codes)599 927 y(atom)p 690 927 14 2 v 15 w(no)p 749 927 V 15 w(escape)p 599 943 293 2 v 588 977 a(chars)p 701 977 14 2 v 15 w(no)p 760 977 V 15 w(escape)588 1026 y(codes)p 701 1026 V 15 w(no)p 760 1026 V 15 w(escape)p 936 1041 2 349 v 962 728 a Fm(a)f(bac)o(k)g (quoted)g(constan)o(t)g(is)g(returned)i(as:)962 777 y(an)e(atom)962 827 y(a)g(list)f(of)g(c)o(haracters)962 877 y(a)h(list)f(of)g(c)o (haracter)j(co)q(des)962 927 y(as)e Fh(atom)f Fm(but)h(ignore)g(escap)q (e)h(sequences)962 977 y(as)f Fh(chars)f Fm(but)h(ignore)g(escap)q(e)h (sequences)962 1026 y(as)f Fh(code)f Fm(but)h(ignore)g(escap)q(e)h (sequences)p 1719 1041 V 1766 777 a(N)p 1842 1041 V -30 1043 1873 2 v -30 1242 2 200 v -3 1128 a Fh(unknown)p 553 1242 V 540 w(error)p 691 1135 109 2 v 669 1178 a(warning)702 1227 y(fail)p 936 1242 2 200 v 962 1078 a Fm(a)f(predicate)h(calls)e (an)h(unkno)o(wn)f(pro)q(cedure:)962 1128 y(an)h Fh(existence)p 1221 1128 14 2 v 14 w(error)e Fm(is)i(raised)962 1178 y(a)g(message)g(is)g(displa)o(y)o(ed)f(then)i(fails)962 1227 y(quietly)f(fails)p 1719 1242 2 200 v 1766 1128 a(Y)p 1842 1242 V -30 1244 1873 2 v -30 1443 2 200 v -3 1329 a Fh(syntax)p 132 1329 14 2 v 14 w(error)p 553 1443 2 200 v 438 w(error)p 691 1336 109 2 v 669 1378 a(warning)702 1428 y(fail)p 936 1443 2 200 v 962 1279 a Fm(a)g(predicate)h(causes)g(a)f(syn)o(tax)g(error:)962 1329 y(a)g Fh(syntax)p 1132 1329 14 2 v 14 w(error)f Fm(is)h(raised)962 1378 y(a)g(message)g(is)g(displa)o(y)o(ed)f(then)i (fails)962 1428 y(quietly)f(fails)p 1719 1443 2 200 v 1766 1329 a(N)p 1842 1443 V -30 1445 1873 2 v -30 1644 2 200 v -3 1530 a Fh(os)p 44 1530 14 2 v 15 w(error)p 553 1644 2 200 v 525 w(error)p 691 1537 109 2 v 669 1579 a(warning)702 1629 y(fail)p 936 1644 2 200 v 962 1480 a Fm(a)g(predicate)h(causes)g(an)f(O.S.)f(error:)962 1530 y(a)h Fh(system)p 1132 1530 14 2 v 14 w(error)f Fm(is)h(raised)962 1579 y(a)g(message)g(is)g(displa)o(y)o(ed)f(then)i (fails)962 1629 y(quietly)f(fails)p 1719 1644 2 200 v 1766 1530 a(N)p 1842 1644 V -30 1646 1873 2 v -30 1729 a(The)h Fh(strict)p 191 1729 14 2 v 14 w(iso)e Fm(\015ag)h(is)f(in)o (tro)q(duced)i(to)f(allo)o(w)e(a)i(compatibilit)o(y)d(with)j(other)g (Prolog)f(systems.)19 b(When)14 b(turned)h(o\013)-30 1778 y(the)g(follo)o(wing)c(relaxations)j(apply:)33 1861 y Fg(\017)20 b Fm(a)14 b(callable)f(term)h(can)g(b)q(e)h(giv)o(en)e(as) h(a)g(predicate)h(indicator.)33 1944 y Fg(\017)20 b Fm(built-in)13 b(predicates)i(are)g(found)e(b)o(y)h Fh(current)p 819 1944 V 14 w(predicate/1)e Fm(\(section)j(7.8.1,)c(page)j(64\).)-30 2027 y Fi(Errors)p -30 2083 1890 2 v -30 2133 2 50 v -3 2118 a Fh(Flag)f Fm(is)h(a)f(v)n(ariable)p 915 2133 V 624 w Fh(instantiation)p 1230 2118 14 2 v 13 w(error)p 1859 2133 2 50 v -30 2134 1890 2 v -30 2184 2 50 v -3 2169 a(Value)g Fm(is)h(a)f(v)n(ariable)p 915 2184 V 602 w Fh(instantiation)p 1230 2169 14 2 v 13 w(error)p 1859 2184 2 50 v -30 2186 1890 2 v -30 2236 2 50 v -3 2221 a(Flag)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(atom)p 915 2236 V 245 w Fh(type)p 1032 2221 14 2 v 15 w(error\(atom,)19 b(Flag\))p 1859 2236 2 50 v -30 2237 1890 2 v -30 2287 2 50 v -3 2272 a(Flag)13 b Fm(is)h(an)f(atom)h(but)g(not)f(a)h(v)n (alid)e(\015ag)p 915 2287 V 288 w Fh(domain)p 1076 2272 14 2 v 15 w(error\(prolog)p 1355 2272 V 13 w(flag,)21 b(Flag\))p 1859 2287 2 50 v -30 2289 1890 2 v -30 2339 2 50 v -3 2324 a(Value)13 b Fm(is)h(inappropriate)f(for)h(Flag)p 915 2339 V 376 w Fh(domain)p 1076 2324 14 2 v 15 w(error\(flag)p 1311 2324 V 13 w(value,)21 b(Flag+Value\))p 1859 2339 2 50 v -30 2340 1890 2 v -30 2440 2 100 v -3 2375 a(Value)13 b Fm(is)h(appropriate)g(for)f Fh(Flag)g Fm(but)h(\015ag)g Fh(Flag)f Fm(is)-3 2425 y(not)h(mo)q(di\014able)p 915 2440 V 941 2375 a Fh(permission)p 1164 2375 14 2 v 14 w(error\(modify,)19 b(flag,)i(Flag\))p 1859 2440 2 100 v -30 2441 1890 2 v -30 2524 a Fi(P)o(ortabilit)o(y)-30 2624 y Fm(ISO)15 b(predicate.)k(All)13 b(ISO)h(\015ags)g(are)g (implemen)o(ted.)-30 2782 y Fi(7.22.2)48 b Fh(current)p 297 2782 14 2 v 14 w(prolog)p 443 2782 V 15 w(flag/2)-30 2908 y Fi(T)l(emplates)p eop end %%Page: 135 137 TeXDict begin 135 136 bop -30 -45 a Fm(7.22)41 b(Prolog)13 b(state)1493 b(135)p -30 -27 1890 4 v 74 115 a Fh(current)p 231 115 14 2 v 14 w(prolog)p 377 115 V 15 w(flag\(?flag,)19 b(?term\))-30 186 y Fi(Description)-30 286 y Fh(current)p 127 286 V 15 w(prolog)p 274 286 V 14 w(flag\(Flag,)h(Value\))c Fm(succeeds)j(if)e(there)h(exists)g(a)f(Prolog)f(\015ag)h(that)g (uni\014es)g(with)g Fh(Flag)f Fm(and)-30 336 y(whose)f(v)n(alue)e (uni\014es)i(with)e Fh(Value)p Fm(.)k(This)d(predicate)h(is)f (re-executable)h(on)f(bac)o(ktrac)o(king.)-30 435 y Fi(Errors)p -30 491 1890 2 v -30 541 2 50 v -3 526 a Fh(Flag)f Fm(is)h(neither)h(a) e(v)n(ariable)g(nor)h(an)g(atom)p 915 541 V 245 w Fh(type)p 1032 526 14 2 v 15 w(error\(atom,)19 b(Flag\))p 1859 541 2 50 v -30 542 1890 2 v -30 592 2 50 v -3 577 a(Flag)13 b Fm(is)h(an)f(atom)h(but)g(not)f(a)h(v)n(alid)e(\015ag)p 915 592 V 288 w Fh(domain)p 1076 577 14 2 v 15 w(error\(prolog)p 1355 577 V 13 w(flag,)21 b(Flag\))p 1859 592 2 50 v -30 594 1890 2 v -30 677 a Fi(P)o(ortabilit)o(y)-30 776 y Fm(ISO)15 b(predicate.)-30 932 y Fi(7.22.3)48 b Fh(set)p 209 932 14 2 v 15 w(bip)p 290 932 V 15 w(name/2)-30 1058 y Fi(T)l(emplates)74 1129 y Fh(set)p 143 1129 V 15 w(bip)p 224 1129 V 15 w(name\(+atom,)20 b(+arity\))-30 1201 y Fi(Description)-30 1300 y Fh(set)p 39 1300 V 16 w(bip)p 121 1300 V 15 w(name\(Functor,)f(Arity\))10 b Fm(initializes)g(the)j (con)o(text)f(of)f(the)h(error)g(\(section)h(5.3.1,)d(page)h(37\))g (with)h Fh(Functor)-30 1350 y Fm(and)i Fh(Arity)f Fm(\(if)j Fh(Arity)d Fb(<)h Fm(0)g(only)g Fh(Functor)e Fm(is)i(signi\014can)o (t\).)-30 1450 y Fi(Errors)p -30 1505 1890 2 v -30 1555 2 50 v -3 1540 a Fh(Functor)e Fm(is)i(a)g(v)n(ariable)p 915 1555 V 558 w Fh(instantiation)p 1230 1540 14 2 v 13 w(error)p 1859 1555 2 50 v -30 1557 1890 2 v -30 1607 2 50 v -3 1592 a(Arity)f Fm(is)h(a)f(v)n(ariable)p 915 1607 V 602 w Fh(instantiation)p 1230 1592 14 2 v 13 w(error)p 1859 1607 2 50 v -30 1608 1890 2 v -30 1658 2 50 v -3 1643 a(Functor)f Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i(an)g(atom)p 915 1658 V 180 w Fh(type)p 1032 1643 14 2 v 15 w(error\(atom,)19 b(Functor\))p 1859 1658 2 50 v -30 1660 1890 2 v -30 1710 2 50 v -3 1695 a(Arity)13 b Fm(is)h(neither)g(a)g(v)n(ariable)f (nor)h(an)f(in)o(teger)p 915 1710 V 194 w Fh(type)p 1032 1695 14 2 v 15 w(error\(integer,)19 b(Arity\))p 1859 1710 2 50 v -30 1711 1890 2 v -30 1794 a Fi(P)o(ortabilit)o(y)-30 1894 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2049 y Fi(7.22.4)48 b Fh(current)p 297 2049 14 2 v 14 w(bip)p 377 2049 V 16 w(name/2)-30 2175 y Fi(T)l(emplates)74 2247 y Fh(current)p 231 2247 V 14 w(bip)p 311 2247 V 16 w(name\(?atom,)19 b(?arity\))-30 2318 y Fi(Description)-30 2418 y Fh(current)p 127 2418 V 15 w(bip)p 208 2418 V 15 w(name\(Functor,)g(Arity\))c Fm(succeeds)k(if)g Fh(Functor)14 b Fm(and)j Fh(Arity)e Fm(corresp)q(ond)j(to)e(the)h(con)o(text)g(of)f(the)-30 2467 y(error)f(\(section)g(5.3.1,)d(page)i(37\))f(\(if)k Fh(Arity)12 b Fb(<)i Fm(0)g(only)g Fh(Functor)e Fm(is)i(signi\014can)o (t\).)-30 2567 y Fi(Errors)p -30 2623 1890 2 v -30 2672 2 50 v -3 2658 a Fh(Functor)e Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i (an)g(atom)p 915 2672 V 180 w Fh(type)p 1032 2658 14 2 v 15 w(error\(atom,)19 b(Functor\))p 1859 2672 2 50 v -30 2674 1890 2 v -30 2724 2 50 v -3 2709 a(Arity)13 b Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f(in)o(teger)p 915 2724 V 194 w Fh(type)p 1032 2709 14 2 v 15 w(error\(integer,)19 b(Arity\))p 1859 2724 2 50 v -30 2726 1890 2 v -30 2808 a Fi(P)o(ortabilit)o(y)-30 2908 y Fm(GNU)14 b(Prolog)f(predicate.)p eop end %%Page: 136 138 TeXDict begin 136 137 bop -30 -45 a Fm(136)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(7.22.5)48 b Fh(write)p 253 115 14 2 v 15 w(pl)p 312 115 V 15 w(state)p 437 115 V 15 w(file/1)p Fi(,)15 b Fh(read)p 700 115 V 15 w(pl)p 759 115 V 15 w(state)p 884 115 V 15 w(file/1)-30 241 y Fi(T)l(emplates)74 324 y Fh(write)p 187 324 V 15 w(pl)p 246 324 V 15 w(state)p 371 324 V 15 w(file\(+source)p 650 324 V 13 w(sink\))74 374 y(read)p 165 374 V 15 w(pl)p 224 374 V 15 w(state)p 349 374 V 15 w(file\(+source)p 628 374 V 13 w(sink\))-30 457 y Fi(Description)-30 557 y Fh(write)p 83 557 V 15 w(pl)p 142 557 V 15 w(state)p 267 557 V 15 w(file\(FileName\))h Fm(writes)j(on)o(to)f Fh(FileName)e Fm(all)i(information)e(that)j (in\015uences)h(the)f(parsing)f(of)-30 607 y(a)f(term)h(\(section)g (7.14,)e(page)h(91\).)27 b(This)17 b(allo)o(ws)f(a)h(sub-pro)q(cess)i (written)f(in)e(Prolog)h(to)g(read)g(this)g(\014le)h(and)f(then)-30 656 y(pro)q(cess)g(an)o(y)d(Prolog)g(term)h(as)f(done)h(b)o(y)f(the)h (paren)o(t)h(pro)q(cess.)21 b(This)15 b(\014le)f(can)h(also)f(b)q(e)h (passed)h(as)e(argumen)o(t)h(of)f(the)-30 706 y Fh(--pl-state)g Fm(option)g(when)i(in)o(v)o(oking)e Fh(gplc)h Fm(\(section)h(3.4.3,)e (page)h(22\).)22 b(More)16 b(precisely)h(the)f(follo)o(wing)c(elemen)o (ts)-30 756 y(are)j(sa)o(v)o(ed:)33 839 y Fg(\017)20 b Fm(all)13 b(op)q(erator)h(de\014nitions)g(\(section)h(7.14.10,)c (page)j(100\).)33 922 y Fg(\017)20 b Fm(the)15 b(c)o(haracter)g(con)o (v)o(ersion)f(table)g(\(section)h(7.14.12,)c(page)j(102\).)33 1005 y Fg(\017)20 b Fm(the)13 b(v)n(alue)f(of)j Fh(char)p 390 1005 V 15 w(conversion)p Fm(,)c Fh(double)p 780 1005 V 14 w(quotes)p Fm(,)g Fh(back)p 1037 1005 V 15 w(quotes)g Fm(and)i Fh(singleton)p 1473 1005 V 13 w(warning)e Fm(Prolog)h(\015ags) 74 1055 y(\(section)j(7.22.1,)c(page)j(133\).)-30 1138 y Fh(read)p 61 1138 V 15 w(pl)p 120 1138 V 16 w(state)p 246 1138 V 14 w(file\(FileName\))19 b Fm(reads)j(\(restores\))h(from)e Fh(FileName)e Fm(all)h(information)g(previously)h(sa)o(v)o(ed)g(b)o(y) -30 1188 y Fh(write)p 83 1188 V 15 w(pl)p 142 1188 V 15 w(state)p 267 1188 V 15 w(file/1.)-30 1287 y Fi(Errors)p -30 1343 1890 2 v -30 1393 2 50 v -3 1378 a Fh(FileName)12 b Fm(is)i(a)g(v)n(ariable)p 915 1393 V 536 w Fh(instantiation)p 1230 1378 14 2 v 13 w(error)p 1859 1393 2 50 v -30 1395 1890 2 v -30 1444 2 50 v -3 1429 a(FileName)e Fm(is)i(neither)h(a)e(v)n (ariable)g(nor)h(an)g(atom)p 915 1444 V 158 w Fh(type)p 1032 1429 14 2 v 15 w(error\(atom,)19 b(FileName\))p 1859 1444 2 50 v -30 1446 1890 2 v -30 1595 2 150 v -3 1481 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs)g(and)f (the)g(v)n(alue)-3 1531 y(of)f(the)i Fh(os)p 163 1531 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1580 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1595 2 150 v 941 1481 a Fh(system)p 1076 1481 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1595 2 150 v -30 1597 1890 2 v -30 1680 a Fi(P)o(ortabilit)o(y)-30 1780 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1946 y Ff(7.23)56 b(Program)19 b(state)-30 2072 y Fi(7.23.1)48 b Fh(consult/1)p Fi(,)15 b Fh('.'/2)f Fi(-)i(program)f(consult)-30 2198 y(T)l(emplates)74 2281 y Fh(consult\(+atom)p 363 2281 14 2 v 13 w(or)p 420 2281 V 16 w(atom)p 524 2281 V 14 w(list\))74 2331 y('.'\(+atom,)20 b(+atom)p 427 2331 V 15 w(list\))-30 2414 y Fi(Description)-30 2514 y Fh(consult\(Files\)) 14 b Fm(compiles)i(and)g(loads)g(in)o(to)g(memory)g(eac)o(h)h(\014le)g (of)e(the)i(list)f Fh(Files)p Fm(.)25 b(Eac)o(h)17 b(\014le)f(is)h (compiled)f(for)-30 2564 y(b)o(yte-co)q(de)d(using)d(the)i(GNU)f (Prolog)f(compiler)h(\(section)h(3.4,)e(page)h(20\))g(then)h(loaded)e (using)i Fh(load/1)e Fm(\(section)i(7.23.2,)-30 2613 y(page)j(137\).)k(It)14 b(is)g(p)q(ossible)h(to)f(sp)q(ecify)i Fh(user)d Fm(as)i(a)f(\014le)g(name)h(to)f(directly)g(en)o(ter)i(the)f (program)f(from)f(the)i(terminal.)-30 2663 y Fh(Files)i Fm(can)g(b)q(e)h(also)f(a)g(single)g(\014le)g(name)g(\(i.e.)28 b(an)17 b(atom\).)28 b(Refer)17 b(to)g(the)h(section)g(concerning)g (the)g(consult)g(of)e(a)-30 2713 y(Prolog)e(program)f(for)g(more)h (information)e(\(section)j(3.2.3,)d(page)i(16\).)-30 2813 y(The)23 b(\014nal)e(\014le)g(name)h(of)f(a)h(\014le)f(is)h (computed)g(using)g(the)g(predicates)h Fh(prolog)p 1313 2813 V 15 w(file)p 1416 2813 V 15 w(name/2)d Fm(\(section)j(7.26.3,)-30 2863 y(page)14 b(142\))g(and)f Fh(absolute)p 419 2863 V 14 w(file)p 521 2863 V 15 w(name/2)g Fm(\(section)i(7.26.1,)c(page)j (141\).)p eop end %%Page: 137 139 TeXDict begin 137 138 bop -30 -45 a Fm(7.23)41 b(Program)13 b(state)1454 b(137)p -30 -27 1890 4 v -30 115 a Fh([)22 b(File)f(|)h(Files)e(])p Fm(,)14 b(i.e.)j Fh('.'\(File,)j(Files\))13 b Fm(is)g(equiv)n(alen)o(t)g(to)h Fh(consult\([)20 b(File)h(|)h(Files)e (]\))p Fm(.)-30 215 y Fi(Errors)p -30 270 1890 2 v -30 370 2 100 v -3 305 a Fh(Files)13 b Fm(is)h(a)f(partial)g(list)g(or)h(a) g(list)f(with)h(an)g(elemen)o(t)g Fh(E)-3 355 y Fm(whic)o(h)g(is)g(a)f (v)n(ariable)p 915 370 V 941 305 a Fh(instantiation)p 1230 305 14 2 v 13 w(error)p 1859 370 2 100 v -30 371 1890 2 v -30 471 2 100 v -3 406 a(Files)g Fm(is)h(neither)g(a)g (partial)f(list)g(nor)h(a)g(list)f(nor)h(an)-3 456 y(atom)p 915 471 V 941 406 a Fh(type)p 1032 406 14 2 v 15 w(error\(list,)19 b(Files\))p 1859 471 2 100 v -30 473 1890 2 v -30 572 2 100 v -3 508 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Files)f Fm(list)h(is)f(neither)i(a)-3 557 y(v)n(ariable)e(nor)h(an)f (atom)p 915 572 V 941 508 a Fh(type)p 1032 508 14 2 v 15 w(error\(atom,)19 b(E\))p 1859 572 2 100 v -30 574 1890 2 v -30 674 2 100 v -3 609 a Fm(an)13 b(elemen)o(t)h Fh(E)f Fm(of)g(the)g Fh(Files)g Fm(list)f(is)i(an)f(atom)f(but)i(not)-3 659 y(a)g(v)n(alid)e(pathname)p 915 674 V 941 609 a Fh(domain)p 1076 609 14 2 v 15 w(error\(os)p 1267 609 V 14 w(path,)20 b(E\))p 1859 674 2 100 v -30 675 1890 2 v -30 825 2 150 v -3 710 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Files)f Fm(list)h(is)f(a)h(v)n(alid)-3 760 y(pathname)f(but)h(do)q (es)g(not)f(corresp)q(ond)i(to)e(an)g(existing)-3 810 y(source)p 915 825 V 941 710 a Fh(existence)p 1142 710 14 2 v 14 w(error\(source)p 1420 710 V 13 w(sink,)21 b(E\))p 1859 825 2 150 v -30 826 1890 2 v -30 876 2 50 v -3 861 a Fm(an)14 b(error)h(o)q(ccurs)g(executing)f(a)g(directiv)o(e) p 915 876 V 282 w(see)h Fh(call/1)e Fm(errors)i(\(section)g(6.2.3,)c (page)j(47\))p 1859 876 V -30 878 1890 2 v -30 961 a Fi(P)o(ortabilit)o(y)-30 1060 y Fm(GNU)g(Prolog)f(predicates.)-30 1218 y Fi(7.23.2)48 b Fh(load/1)-30 1344 y Fi(T)l(emplates)74 1427 y Fh(load\(+atom)p 297 1427 14 2 v 14 w(or)p 355 1427 V 15 w(atom)p 458 1427 V 15 w(list\))-30 1510 y Fi(Description)-30 1610 y Fh(load\(Files\))10 b Fm(loads)i(in)o(to)f (memory)g(eac)o(h)i(\014le)f(of)f(the)i(list)e Fh(Files)p Fm(.)17 b(Eac)o(h)12 b(\014le)g(m)o(ust)g(ha)o(v)o(e)g(b)q(een)h (previously)f(compiled)-30 1660 y(for)h(b)o(yte-co)q(de)g(using)g(the)g (GNU)g(Prolog)e(compiler)i(\(section)g(3.4,)f(page)g(20\).)17 b Fh(Files)12 b Fm(can)h(b)q(e)g(also)f(a)g(single)h(\014le)f(name)-30 1710 y(\(i.e.)18 b(an)c(atom\).)-30 1809 y(The)20 b(\014nal)e(\014le)g (name)h(of)f(a)g(\014le)h(is)f(computed)h(using)g(the)g(predicates)h Fh(absolute)p 1320 1809 V 14 w(file)p 1422 1809 V 15 w(name/2)d Fm(\(section)j(7.26.1,)-30 1859 y(page)14 b(141\).)k(If)13 b(no)h(su\016x)g(is)f(giv)o(en)h Fh('.wbc')e Fm(is)i(app)q(ended)h(to)f(the)g(\014le)g(name.)-30 1959 y Fi(Errors)p -30 2014 1890 2 v -30 2114 2 100 v -3 2049 a Fh(Files)f Fm(is)h(a)f(partial)g(list)g(or)h(a)g(list)f(with)h(an)g (elemen)o(t)g Fh(E)-3 2099 y Fm(whic)o(h)g(is)g(a)f(v)n(ariable)p 915 2114 V 941 2049 a Fh(instantiation)p 1230 2049 14 2 v 13 w(error)p 1859 2114 2 100 v -30 2116 1890 2 v -30 2215 2 100 v -3 2151 a(Files)g Fm(is)h(neither)g(a)g(partial)f (list)g(nor)h(a)g(list)f(nor)h(an)-3 2200 y(atom)p 915 2215 V 941 2151 a Fh(type)p 1032 2151 14 2 v 15 w(error\(list,)19 b(Files\))p 1859 2215 2 100 v -30 2217 1890 2 v -30 2317 2 100 v -3 2252 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Files)f Fm(list)h(is)f(neither)i(a)-3 2302 y(v)n(ariable)e(nor)h(an) f(atom)p 915 2317 V 941 2252 a Fh(type)p 1032 2252 14 2 v 15 w(error\(atom,)19 b(E\))p 1859 2317 2 100 v -30 2318 1890 2 v -30 2418 2 100 v -3 2353 a Fm(an)13 b(elemen)o(t)h Fh(E)f Fm(of)g(the)g Fh(Files)g Fm(list)f(is)i(an)f(atom)f(but)i(not)-3 2403 y(a)g(v)n(alid)e(pathname)p 915 2418 V 941 2353 a Fh(domain)p 1076 2353 14 2 v 15 w(error\(os)p 1267 2353 V 14 w(path,)20 b(E\))p 1859 2418 2 100 v -30 2420 1890 2 v -30 2569 2 150 v -3 2454 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Files)f Fm(list)h(is)f(a)h(v)n(alid)-3 2504 y(pathname)f(but)h(do)q(es)g(not)f(corresp)q(ond)i(to)e(an)g (existing)-3 2554 y(source)p 915 2569 V 941 2454 a Fh(existence)p 1142 2454 14 2 v 14 w(error\(source)p 1420 2454 V 13 w(sink,)21 b(E\))p 1859 2569 2 150 v -30 2571 1890 2 v -30 2620 2 50 v -3 2606 a Fm(an)14 b(error)h(o)q(ccurs)g(executing)f (a)g(directiv)o(e)p 915 2620 V 282 w(see)h Fh(call/1)e Fm(errors)i(\(section)g(6.2.3,)c(page)j(47\))p 1859 2620 V -30 2622 1890 2 v -30 2705 a Fi(P)o(ortabilit)o(y)-30 2805 y Fm(GNU)g(Prolog)f(predicate.)p eop end %%Page: 138 140 TeXDict begin 138 139 bop -30 -45 a Fm(138)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(7.23.3)48 b Fh(listing/1)p Fi(,)15 b Fh(listing/0)-30 241 y Fi(T)l(emplates)74 324 y Fh (listing\(+predicate)p 472 324 14 2 v 12 w(indicator\))74 374 y(listing\(+atom\))74 424 y(listing)-30 507 y Fi(Description)-30 607 y Fh(listing\(Pred\))d Fm(lists)j(the)g(clauses)h(of)e(the)h (consulted)h(predicate)g(whose)f(predicate)h(indicator)e(is)h Fh(Pred)p Fm(.)k Fh(Pred)14 b Fm(can)-30 656 y(also)j(b)q(e)h(a)f (single)g(atom)g(in)g(whic)o(h)g(case)i(all)d(predicates)j(whose)f (name)f(is)g Fh(Pred)g Fm(are)h(listed)f(\(of)g(an)o(y)g(arit)o(y\).)28 b(This)-30 706 y(predicate)15 b(uses)h Fh(portray)p 396 706 V 14 w(clause/2)c Fm(\(section)j(7.14.8,)c(page)j(99\))g(to)f (output)h(the)h(clauses.)-30 806 y Fh(listing)e Fm(lists)h(all)e (clauses)j(of)e(all)g(consulted)i(predicates.)-30 906 y Fi(Errors)p -30 961 1890 2 v -30 1011 2 50 v -3 996 a Fh(Pred)e Fm(is)h(a)f(v)n(ariable)p 915 1011 V 624 w Fh(instantiation)p 1230 996 14 2 v 13 w(error)p 1859 1011 2 50 v -30 1013 1890 2 v -30 1112 2 100 v -3 1047 a(Pred)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(predicate)h (indicator)-3 1097 y(or)f(an)g(atom)p 915 1112 V 941 1047 a Fh(type)p 1032 1047 14 2 v 15 w(error\(predicate)p 1376 1047 V 13 w(indicator,)19 b(Pred\))p 1859 1112 2 100 v -30 1114 1890 2 v -30 1197 a Fi(P)o(ortabilit)o(y)-30 1296 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1462 y Ff(7.24)56 b(System)18 b(statistics)-30 1589 y Fi(7.24.1)48 b Fh(statistics/0)p Fi(,)14 b Fh(statistics/2)-30 1715 y Fi(T)l(emplates)74 1798 y Fh(statistics)74 1848 y(statistics\(?atom,)19 b(?list\))-30 1931 y Fi(Description)-30 2031 y Fh(statistics)12 b Fm(displa)o(ys)i(statistics)g(ab)q(out)g(memory)f(usage)i(and)e(run)i (times.)-30 2130 y Fh(statistics\(Key,)k(Value\))13 b Fm(uni\014es)h Fh(Value)f Fm(with)h(the)h(curren)o(t)g(v)n(alue)f(of)f (the)i(statistics)g(k)o(ey)g Fh(Key)p Fm(.)i Fh(Value)c Fm(a)h(list)g(of)-30 2180 y(t)o(w)o(o)g(elemen)o(ts.)19 b(Times)14 b(are)g(in)f(milliseconds,)g(sizes)i(of)e(areas)i(in)e(b)o (ytes.)p -30 2244 1789 2 v -30 2294 2 50 v -3 2279 a(Key)p 277 2294 V 235 w(Description)p 1204 2294 V 720 w(V)m(alue)p 1757 2294 V -30 2295 1789 2 v -30 2305 V -30 2355 2 50 v -3 2340 a Fh(user)p 88 2340 14 2 v 15 w(time)p 277 2355 2 50 v 116 w Fm(user)i(CPU)f(time)p 1204 2355 V 655 w Fh([SinceStart,)19 b(SinceLast])p 1757 2355 V -30 2357 1789 2 v -30 2407 2 50 v -3 2392 a(system)p 132 2392 14 2 v 14 w(time)p 277 2407 2 50 v 73 w Fm(system)c(CPU)f(time)p 1204 2407 V 605 w Fh([SinceStart,)19 b(SinceLast])p 1757 2407 V -30 2408 1789 2 v -30 2458 2 50 v -3 2443 a(cpu)p 66 2443 14 2 v 15 w(time)p 277 2458 2 50 v 138 w Fm(total)13 b(CPU)h(time)g(\(user)h(+)f(system\))p 1204 2458 V 341 w Fh([SinceStart,)19 b(SinceLast])p 1757 2458 V -30 2460 1789 2 v -30 2509 2 50 v -3 2495 a(real)p 88 2495 14 2 v 15 w(time)p 277 2509 2 50 v 116 w Fm(absolute)14 b(time)p 1204 2509 V 682 w Fh([SinceStart,)19 b(SinceLast])p 1757 2509 V -30 2511 1789 2 v -30 2561 2 50 v -3 2546 a(local)p 110 2546 14 2 v 15 w(stack)p 277 2561 2 50 v 72 w Fm(lo)q(cal)13 b(stac)o(k)h(sizes)h(\(con)o(trol,)f(en)o (vironmen)o(ts,)f(c)o(hoices\))p 1204 2561 V 53 w Fh([UsedSize,)20 b(FreeSize])p 1757 2561 V -30 2563 1789 2 v -30 2612 2 50 v -3 2597 a(global)p 132 2597 14 2 v 14 w(stack)p 277 2612 2 50 v 51 w Fm(global)12 b(stac)o(k)i(sizes)h(\(comp)q(ound)f (terms\))p 1204 2612 V 269 w Fh([UsedSize,)20 b(FreeSize])p 1757 2612 V -30 2614 1789 2 v -30 2664 2 50 v -3 2649 a(trail)p 110 2649 14 2 v 15 w(stack)p 277 2664 2 50 v 72 w Fm(trail)13 b(stac)o(k)h(sizes)h(\(v)n(ariable)e(bindings)h(to)f (undo\))p 1204 2664 V 141 w Fh([UsedSize,)20 b(FreeSize])p 1757 2664 V -30 2666 1789 2 v -30 2715 2 50 v -3 2700 a(cstr)p 88 2700 14 2 v 15 w(stack)p 277 2715 2 50 v 94 w Fm(constrain)o(t)14 b(trail)f(sizes)i(\(\014nite)f(domain)f (constrain)o(ts\))p 1204 2715 V 64 w Fh([UsedSize,)20 b(FreeSize])p 1757 2715 V -30 2717 1789 2 v -30 2800 a Fm(Note)15 b(that)f(the)g(k)o(ey)h Fh(runtime)d Fm(is)i(recognized)h (as)f Fh(user)p 861 2800 14 2 v 15 w(time)f Fm(for)g(compatibilit)o(y)f (purp)q(ose.)-30 2899 y Fi(Errors)p eop end %%Page: 139 141 TeXDict begin 139 140 bop -30 -45 a Fm(7.25)41 b(Random)12 b(n)o(um)o(b)q(er)j(generator)1224 b(139)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(Key)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)g(v)n(alid)e(k)o(ey)p 915 125 V 222 w Fh(domain)p 1076 110 14 2 v 15 w(error\(statistic)o(s)p 1442 110 V 13 w(key,)21 b(Key\))p 1859 125 2 50 v -30 127 1890 2 v -30 226 2 100 v -3 161 a(Value)13 b Fm(is)h(neither)g(a)g (v)n(ariable)f(nor)h(a)f(list)h(of)f(t)o(w)o(o)-3 211 y(elemen)o(ts)p 915 226 V 941 161 a Fh(domain)p 1076 161 14 2 v 15 w(error\(statistic)o(s)p 1442 161 V 13 w(value,)20 b(Value\))p 1859 226 2 100 v -30 228 1890 2 v -30 327 2 100 v -3 263 a(Value)13 b Fm(is)h(a)f(list)h(of)f(t)o(w)o (o)g(elemen)o(ts)i(and)f(an)f(elemen)o(t)i Fh(E)-3 312 y Fm(is)f(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in)o(teger)p 915 327 V 941 263 a Fh(type)p 1032 263 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 327 2 100 v -30 329 1890 2 v -30 412 a Fi(P)o(ortabilit)o (y)-30 512 y Fm(GNU)14 b(Prolog)f(predicates.)-30 669 y Fi(7.24.2)48 b Fh(user)p 231 669 14 2 v 15 w(time/1)p Fi(,)15 b Fh(system)p 538 669 V 14 w(time/1)p Fi(,)g Fh(cpu)p 778 669 V 15 w(time/1)p Fi(,)g Fh(real)p 1041 669 V 15 w(time/1)-30 796 y Fi(T)l(emplates)74 879 y Fh(user)p 165 879 V 15 w(time\(?integer\))74 928 y(system)p 209 928 V 15 w(time\(?integer\))74 978 y(cpu)p 143 978 V 15 w(time\(?integer\))74 1028 y(real)p 165 1028 V 15 w(time\(?integer\))-30 1111 y Fi(Description)-30 1211 y Fh(user)p 61 1211 V 15 w(time\(Time\))d Fm(uni\014es)i Fh(Time)f Fm(with)h(the)h(user)g(CPU)f(time)f(elapsed)i(since)f(the)h (start)f(of)g(Prolog.)-30 1310 y Fh(system)p 105 1310 V 15 w(time\(Time\))e Fm(uni\014es)i Fh(Time)f Fm(with)h(the)g(system)h (CPU)f(time)g(elapsed)g(since)h(the)f(start)h(of)e(Prolog.)-30 1410 y Fh(cpu)p 39 1410 V 16 w(time\(Time\))e Fm(uni\014es)k Fh(Time)e Fm(with)g(the)i(CPU)f(time)f(\(user)j(+)e(system\))h(elapsed) f(since)h(the)f(start)h(of)e(Prolog.)-30 1510 y Fh(real)p 61 1510 V 15 w(time\(Time\))f Fm(uni\014es)i Fh(Time)f Fm(with)h(the)h(absolute)f(time)f(elapsed)i(since)f(the)h(start)f(of)g (Prolog.)-30 1609 y Fi(Errors)p -30 1674 1890 2 v -30 1723 2 50 v -3 1708 a Fh(Time)f Fm(is)h(neither)h(a)e(v)n(ariable)g (nor)h(an)g(in)o(teger)p 915 1723 V 215 w Fh(type)p 1032 1708 14 2 v 15 w(error\(integer,)19 b(Time\))p 1859 1723 2 50 v -30 1725 1890 2 v -30 1809 a Fi(P)o(ortabilit)o(y)-30 1908 y Fm(GNU)14 b(Prolog)f(predicates.)-30 2074 y Ff(7.25)56 b(Random)19 b(n)n(um)n(b)r(er)g(generator)-30 2201 y Fi(7.25.1)48 b Fh(set)p 209 2201 14 2 v 15 w(seed/1)p Fi(,)15 b Fh(randomize/0)-30 2327 y Fi(T)l(emplates)74 2410 y Fh(set)p 143 2410 V 15 w(seed\(+integer\))74 2460 y(randomize)-30 2543 y Fi(Description)-30 2643 y Fh(set)p 39 2643 V 16 w(seed\(Seed\))c Fm(reinitializes)j(the)g(random)g(n)o(um) o(b)q(er)g(generator)g(seed)i(with)d Fh(Seed)p Fm(.)-30 2742 y Fh(randomize)g Fm(reinitializes)h(the)h(random)f(n)o(um)o(b)q (er)h(generator.)20 b(This)14 b(predicates)i(calls)e Fh(set)p 1434 2742 V 15 w(seed/1)g Fm(with)g(a)g(random)-30 2792 y(v)n(alue)g(dep)q(ending)g(on)g(the)g(absolute)g(time.)-30 2892 y Fi(Errors)p eop end %%Page: 140 142 TeXDict begin 140 141 bop -30 -45 a Fm(140)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(Seed)f Fm(is)h(a)f(v)n(ariable)p 915 125 V 624 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(Seed)g Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(an)g(in)o(teger)p 915 176 V 215 w Fh(type)p 1032 161 14 2 v 15 w(error\(integer,)19 b(Seed\))p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(Seed)13 b Fm(is)h(an)f(in)o(teger)i Fb(<)f Fm(0)p 915 228 V 539 w Fh(domain)p 1076 213 14 2 v 15 w(error\(not)p 1289 213 V 13 w(less)p 1390 213 V 15 w(than)p 1493 213 V 15 w(zero,)21 b(Seed\))p 1859 228 2 50 v -30 229 1890 2 v -30 312 a Fi(P)o(ortabilit)o(y)-30 412 y Fm(GNU)14 b(Prolog)f(predicates.)-30 567 y Fi(7.25.2)48 b Fh(get)p 209 567 14 2 v 15 w(seed/1)-30 693 y Fi(T)l(emplates)74 762 y Fh(get)p 143 762 V 15 w(seed\(?integer\))-30 831 y Fi(Description)-30 931 y Fh(get)p 39 931 V 16 w(seed\(Seed\))11 b Fm(uni\014es)k Fh(Seed)e Fm(with)g(the)i(curren)o(t)g(random)e(n)o (um)o(b)q(er)i(generator)f(seed.)-30 1031 y Fi(Errors)p -30 1086 1890 2 v -30 1136 2 50 v -3 1121 a Fh(Seed)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(in)o(teger)p 915 1136 V 215 w Fh(type)p 1032 1121 14 2 v 15 w(error\(integer,)19 b(Seed\))p 1859 1136 2 50 v -30 1138 1890 2 v -30 1188 2 50 v -3 1173 a(Seed)13 b Fm(is)h(an)f(in)o(teger)i Fb(<)f Fm(0)p 915 1188 V 539 w Fh(domain)p 1076 1173 14 2 v 15 w(error\(not)p 1289 1173 V 13 w(less)p 1390 1173 V 15 w(than)p 1493 1173 V 15 w(zero,)21 b(Seed\))p 1859 1188 2 50 v -30 1189 1890 2 v -30 1272 a Fi(P)o(ortabilit)o(y)-30 1372 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1526 y Fi(7.25.3)48 b Fh(random/1)-30 1653 y Fi(T)l(emplates)74 1722 y Fh(random\(-float\)) -30 1791 y Fi(Description)-30 1891 y Fh(random\(Number\))11 b Fm(uni\014es)k Fh(Number)d Fm(with)i(a)g(random)f(\015oating)g(p)q (oin)o(t)g(n)o(um)o(b)q(er)h(suc)o(h)h(that)f(0.0)f Fg(\024)h Fh(Number)e Fb(<)j Fm(1.0.)-30 1990 y Fi(Errors)p -30 2055 V -30 2105 2 50 v -3 2090 a Fh(Number)e Fm(is)g(not)h(a)g(v)n (ariable)p 915 2105 V 506 w Fh(type)p 1032 2090 14 2 v 15 w(error\(variable,)19 b(Number\))p 1859 2105 2 50 v -30 2106 1890 2 v -30 2190 a Fi(P)o(ortabilit)o(y)-30 2289 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2444 y Fi(7.25.4)48 b Fh(random/3)-30 2570 y Fi(T)l(emplates)74 2640 y Fh(random\(+number,) 19 b(+number,)h(-number\))-30 2709 y Fi(Description)-30 2808 y Fh(random\(Base,)g(Max,)h(Number\))14 b Fm(uni\014es)j Fh(Number)d Fm(with)i(a)f(random)h(n)o(um)o(b)q(er)g(suc)o(h)g(that)g Fh(Base)f Fg(\024)i Fh(Number)d Fb(<)i Fh(Max)p Fm(.)-30 2858 y(If)g(b)q(oth)g Fh(Base)f Fm(and)h Fh(Max)f Fm(are)h(in)o(tegers) h Fh(Number)e Fm(will)f(b)q(e)j(an)e(in)o(teger,)i(otherwise)g Fh(Number)d Fm(will)h(b)q(e)h(a)g(\015oating)f(p)q(oin)o(t)-30 2908 y(n)o(um)o(b)q(er.)p eop end %%Page: 141 143 TeXDict begin 141 142 bop -30 -45 a Fm(7.26)41 b(File)13 b(name)h(pro)q(cessing)1334 b(141)p -30 -27 1890 4 v -30 115 a Fi(Errors)p -30 171 1890 2 v -30 220 2 50 v -3 205 a Fh(Base)13 b Fm(is)h(a)f(v)n(ariable)p 915 220 V 624 w Fh(instantiation)p 1230 205 14 2 v 13 w(error)p 1859 220 2 50 v -30 222 1890 2 v -30 272 2 50 v -3 257 a(Base)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f(n)o(um)o(b)q(er) p 915 272 V 225 w Fh(type)p 1032 257 14 2 v 15 w(error\(number,)19 b(Base\))p 1859 272 2 50 v -30 273 1890 2 v -30 323 2 50 v -3 308 a(Max)13 b Fm(is)h(a)g(v)n(ariable)p 915 323 V 645 w Fh(instantiation)p 1230 308 14 2 v 13 w(error)p 1859 323 2 50 v -30 325 1890 2 v -30 375 2 50 v -3 360 a(Max)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)g(n)o(um)o(b)q(er)p 915 375 V 246 w Fh(type)p 1032 360 14 2 v 15 w(error\(number,)19 b(Max\))p 1859 375 2 50 v -30 376 1890 2 v -30 426 2 50 v -3 411 a(Number)13 b Fm(is)g(not)h(a)g(v)n(ariable)p 915 426 V 506 w Fh(type)p 1032 411 14 2 v 15 w(error\(variable,)19 b(Number\))p 1859 426 2 50 v -30 428 1890 2 v -30 511 a Fi(P)o(ortabilit)o(y)-30 610 y Fm(GNU)14 b(Prolog)f(predicate.)-30 776 y Ff(7.26)56 b(File)18 b(name)g(pro)r(cessing)-30 903 y Fi(7.26.1)48 b Fh(absolute)p 319 903 14 2 v 14 w(file)p 421 903 V 15 w(name/2)-30 1029 y Fi(T)l(emplates)74 1112 y Fh(absolute)p 253 1112 V 14 w(file)p 355 1112 V 15 w(name\(+atom,)20 b(atom\))-30 1195 y Fi(Description)-30 1295 y Fh(absolute)p 149 1295 V 15 w(file)p 252 1295 V 14 w(name\(File1,)g(File2\))9 b Fm(succeeds)14 b(if)f Fh(File2)d Fm(is)g(the)h(absolute)g(pathname)g(asso)q(ciated)g(with)g (the)g(rel-)-30 1345 y(ativ)o(e)h(\014le)g(name)f Fh(File1)p Fm(.)17 b Fh(File1)10 b Fm(can)i(con)o(tain)g Fh($)p Fd(VAR)p 812 1345 V 14 w(NAME)19 b Fm(sub-strings.)f(When)12 b(suc)o(h)g(a)g(sub-string)g(is)g(encoun)o(tered,)-30 1394 y(it)k(is)g(expanded)g(with)f(the)i(v)n(alue)e(of)g(the)i(en)o (vironmen)o(t)e(v)n(ariable)g(whose)h(name)g(is)f Fd(VAR)p 1394 1394 V 16 w(NAME)22 b Fm(if)15 b(exists)h(\(otherwise)-30 1444 y(no)i(expansion)f(is)g(done\).)29 b Fh(File1)17 b Fm(can)g(also)g(b)q(egin)h(with)f(a)g(sub-string)h Fh(~)p Fd(USER)p 1271 1444 V 15 w(NAME)6 b Fh(/)p Fm(,)18 b(this)g(is)f(expanded)h(as)g(the)-30 1494 y(home)c(directory)h(of)e (the)i(user)g Fd(USER)p 556 1494 V 15 w(NAME)6 b Fm(.)13 b(If)k Fd(USER)p 823 1494 V 15 w(NAME)j Fm(do)q(es)15 b(not)f(exist)g Fh(File1)f Fm(is)h(an)f(in)o(v)n(alid)f(pathname.)18 b(If)13 b(no)-30 1544 y Fd(USER)p 61 1544 V 15 w(NAME)21 b Fm(is)14 b(giv)o(en)g(\(i.e.)19 b Fh(File1)14 b Fm(b)q(egins)g(with)g Fh(~/)p Fm(\))g(the)h Fh(~)f Fm(c)o(haracter)i(is)e(expanded)i(as)e (the)h(v)n(alue)f(of)g(the)h(en)o(viron-)-30 1594 y(men)o(t)e(v)n (ariable)f Fh(HOME)p Fm(.)f(If)i(the)g Fh(HOME)f Fm(v)n(ariable)g(is)h (not)f(de\014ned)i Fh(File1)e Fm(is)h(an)f(in)o(v)n(alid)f(pathname.)17 b(Relativ)o(e)12 b(references)-30 1644 y(to)h(the)h(curren)o(t)g (directory)g(\()p Fh(/./)e Fm(sub-string\))i(and)e(to)h(the)h(paren)o (t)f(directory)h(\()p Fh(/../)e Fm(sub-strings\))i(are)f(remo)o(v)o(ed) g(and)-30 1693 y(no)k(longer)g(app)q(ear)g(in)g Fh(File2)p Fm(.)26 b Fh(File1)16 b Fm(is)h(also)f(in)o(v)n(alid)f(if)h(it)h(con)o (tains)g(to)q(o)f(man)o(y)h Fh(/../)f Fm(consecutiv)o(e)i(sub-strings) -30 1743 y(\(i.e.)j(paren)o(t)15 b(directory)g(relativ)o(e)g (references\).)23 b(Finally)13 b(if)k Fh(File1)d Fm(is)g Fh(user)g Fm(then)i Fh(File2)d Fm(is)i(also)f(uni\014ed)h(with)f Fh(user)-30 1793 y Fm(to)g(allo)o(w)e(this)i(predicate)h(to)f(b)q(e)g (called)g(on)g(Prolog)f(\014le)h(names)g(\(since)h Fh(user)e Fm(in)g(DEC-10)g(input/output)h(predicates)-30 1843 y(denotes)i(the)e (curren)o(t)h(input/output)f(stream\).)-30 1942 y(Most)h(predicates)g (using)f(a)f(\014le)h(name)g(implicitly)d(call)j(this)f(predicate)i(to) f(obtain)f(the)i(desired)g(\014le,)e(e.g.)18 b Fh(open/4)p Fm(.)-30 2042 y Fi(Errors)p -30 2098 1890 2 v -30 2148 2 50 v -3 2133 a Fh(File1)13 b Fm(is)h(a)f(v)n(ariable)p 915 2148 V 602 w Fh(instantiation)p 1230 2133 14 2 v 13 w(error)p 1859 2148 2 50 v -30 2149 1890 2 v -30 2199 2 50 v -3 2184 a(File1)g Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f (atom)p 915 2199 V 224 w Fh(type)p 1032 2184 14 2 v 15 w(error\(atom,)19 b(File1\))p 1859 2199 2 50 v -30 2201 1890 2 v -30 2250 2 50 v -3 2236 a(File2)13 b Fm(is)h(neither)g(a)g(v)n (ariable)f(nor)h(an)f(atom)p 915 2250 V 224 w Fh(type)p 1032 2236 14 2 v 15 w(error\(atom,)19 b(File2\))p 1859 2250 2 50 v -30 2252 1890 2 v -30 2302 2 50 v -3 2287 a(File1)13 b Fm(is)h(an)f(atom)g(but)h(not)g(a)g(v)n(alid)e(pathname)p 915 2302 V 151 w Fh(domain)p 1076 2287 14 2 v 15 w(error\(os)p 1267 2287 V 14 w(path,)20 b(File1\))p 1859 2302 2 50 v -30 2304 1890 2 v -30 2386 a Fi(P)o(ortabilit)o(y)-30 2486 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2644 y Fi(7.26.2)48 b Fh(decompose)p 341 2644 14 2 v 14 w(file)p 443 2644 V 15 w(name/4)-30 2770 y Fi(T)l(emplates)74 2853 y Fh(decompose)p 275 2853 V 14 w(file)p 377 2853 V 15 w(name\(+atom,)19 b(?atom,)i(?atom,)g(?atom\))p eop end %%Page: 142 144 TeXDict begin 142 143 bop -30 -45 a Fm(142)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(Description)-30 215 y Fh(decompose)p 171 215 14 2 v 14 w(file)p 273 215 V 15 w(name\(File,)20 b(Directory,)g(Prefix,)g(Suffix\))d Fm(decomp)q(oses)j(the)f(pathname)g Fh(File)f Fm(and)g(ex-)-30 264 y(tracts)c(the)f Fh(Directory)e Fm(part)i(\(c)o(haracters)h(b)q(efore)f(the)h(last)e Fh(/)p Fm(\),)g(the)h Fh(Prefix)f Fm(part)g(\(c)o(haracters)j(after)e (the)g(last)f Fh(/)g Fm(and)-30 314 y(b)q(efore)i(the)g(last)e Fh(.)18 b Fm(or)13 b(un)o(til)f(the)i(end)f(if)f(there)j(is)d(no)h (su\016x\))g(and)g(the)g Fh(Suffix)f Fm(part)h(\(c)o(haracters)i(from)d (the)i(last)e Fh(.)18 b Fm(to)-30 364 y(the)d(end)f(of)g(the)g (string\).)-30 464 y Fi(Errors)p -30 519 1890 2 v -30 569 2 50 v -3 554 a Fh(File)f Fm(is)h(a)f(v)n(ariable)p 915 569 V 624 w Fh(instantiation)p 1230 554 14 2 v 13 w(error)p 1859 569 2 50 v -30 571 1890 2 v -30 621 2 50 v -3 606 a(File)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g (atom)p 915 621 V 245 w Fh(type)p 1032 606 14 2 v 15 w(error\(atom,)19 b(File\))p 1859 621 2 50 v -30 622 1890 2 v -30 672 2 50 v -3 657 a(Directory)12 b Fm(is)i(neither)h(a)e (v)n(ariable)g(nor)h(an)f(atom)p 915 672 V 137 w Fh(type)p 1032 657 14 2 v 15 w(error\(atom,)19 b(Directory\))p 1859 672 2 50 v -30 674 1890 2 v -30 723 2 50 v -3 709 a(Prefix)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(atom)p 915 723 V 202 w Fh(type)p 1032 709 14 2 v 15 w(error\(atom,)19 b(Prefix\))p 1859 723 2 50 v -30 725 1890 2 v -30 775 2 50 v -3 760 a(Suffix)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g (an)h(atom)p 915 775 V 202 w Fh(type)p 1032 760 14 2 v 15 w(error\(atom,)19 b(Suffix\))p 1859 775 2 50 v -30 777 1890 2 v -30 859 a Fi(P)o(ortabilit)o(y)-30 959 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1116 y Fi(7.26.3)48 b Fh(prolog)p 275 1116 14 2 v 15 w(file)p 378 1116 V 15 w(name/2)-30 1242 y Fi(T)l(emplates)74 1320 y Fh(prolog)p 209 1320 V 15 w(file)p 312 1320 V 15 w(name\(+atom,)19 b(?atom\))-30 1399 y Fi(Description)-30 1498 y Fh(prolog)p 105 1498 V 15 w(file)p 208 1498 V 15 w(name\(File1,)g(File2\))11 b Fm(uni\014es)i Fh(File2)e Fm(with)h(the)g(Prolog)g(\014le)g(name)g (asso)q(ciated)h(with)e Fh(File1)p Fm(.)17 b(More)-30 1548 y(precisely)f Fh(File2)d Fm(is)g(computed)i(as)f(follo)o(ws:)33 1626 y Fg(\017)20 b Fm(if)d Fh(File1)12 b Fm(has)i(a)g(su\016x)g(or)g (if)f(it)g(is)h Fh(user)f Fm(then)h Fh(File2)f Fm(is)h(uni\014ed)g (with)g Fh(File1)p Fm(.)33 1707 y Fg(\017)20 b Fm(else)15 b(if)e(the)h(\014le)g(whose)h(name)e(is)h Fh(File1)f Fm(+)h Fh('.pl')f Fm(exists)i(then)f Fh(File2)f Fm(is)h(uni\014ed)g (with)f(this)h(name.)33 1788 y Fg(\017)20 b Fm(else)15 b(if)e(the)h(\014le)g(whose)h(name)e(is)h Fh(File1)f Fm(+)h Fh('.pro')f Fm(exists)h(then)h Fh(File2)e Fm(is)g(uni\014ed)i (with)e(this)h(name.)33 1868 y Fg(\017)20 b Fm(else)15 b Fh(File2)e Fm(is)g(uni\014ed)h(with)g(the)h(name)e Fh(File1)g Fm(+)h Fh('.pl')p Fm(.)-30 1947 y(This)g(predicate)h(uses)g Fh(absolute)p 512 1947 V 14 w(file)p 614 1947 V 15 w(name/2)e Fm(to)h(c)o(hec)o(k)g(the)h(existence)h(of)d(a)g(\014le)h(\(section)h (7.26.1,)d(page)h(141\).)-30 2046 y Fi(Errors)p -30 2102 1890 2 v -30 2152 2 50 v -3 2137 a Fh(File1)g Fm(is)h(a)f(v)n(ariable)p 915 2152 V 602 w Fh(instantiation)p 1230 2137 14 2 v 13 w(error)p 1859 2152 2 50 v -30 2153 1890 2 v -30 2203 2 50 v -3 2188 a(File1)g Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f (atom)p 915 2203 V 224 w Fh(type)p 1032 2188 14 2 v 15 w(error\(atom,)19 b(File1\))p 1859 2203 2 50 v -30 2205 1890 2 v -30 2255 2 50 v -3 2240 a(File2)13 b Fm(is)h(neither)g(a)g(v)n (ariable)f(nor)h(an)f(atom)p 915 2255 V 224 w Fh(type)p 1032 2240 14 2 v 15 w(error\(atom,)19 b(File2\))p 1859 2255 2 50 v -30 2256 1890 2 v -30 2306 2 50 v -3 2291 a(File1)13 b Fm(is)h(an)f(atom)g(but)h(not)g(a)g(v)n(alid)e(pathname)p 915 2306 V 151 w Fh(domain)p 1076 2291 14 2 v 15 w(error\(os)p 1267 2291 V 14 w(path,)20 b(File1\))p 1859 2306 2 50 v -30 2308 1890 2 v -30 2391 a Fi(P)o(ortabilit)o(y)-30 2490 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2655 y Ff(7.27)56 b(Op)r(erating)18 b(system)f(in)n(terface)-30 2782 y Fi(7.27.1)48 b Fh(argument)p 319 2782 14 2 v 14 w(counter/1)-30 2908 y Fi(T)l(emplates)p eop end %%Page: 143 145 TeXDict begin 143 144 bop -30 -45 a Fm(7.27)41 b(Op)q(erating)14 b(system)h(in)o(terface)1223 b(143)p -30 -27 1890 4 v 74 115 a Fh(argument)p 253 115 14 2 v 14 w(counter\(?integer\))-30 183 y Fi(Description)-30 283 y Fh(argument)p 149 283 V 15 w(counter\(Counter)o(\))7 b Fm(succeeds)12 b(if)g Fh(Counter)c Fm(is)i(the)g(n)o(um)o(b)q(er)g(of)f(argumen)o(ts)h(of)f (the)h(command-line.)16 b(Since)-30 333 y(the)f(\014rst)g(argumen)o(t)g (is)f(alw)o(a)o(ys)f(the)i(name)f(of)g(the)g(running)g(program,)g Fh(Counter)f Fm(is)h(alw)o(a)o(ys)f Fg(\025)h Fm(1.)19 b(See)d(\(section)f(3.2,)-30 383 y(page)f(13\))g(for)f(more)h (information)e(ab)q(out)i(command-line)f(argumen)o(ts)h(retriev)o(ed)h (under)g(the)f(top)p 1544 383 13 2 v 15 w(lev)o(el.)-30 482 y Fi(Errors)p -30 547 1890 2 v -30 596 2 50 v -3 582 a Fh(Counter)e Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i(an)g(in)o (teger)p 915 596 V 150 w Fh(type)p 1032 582 14 2 v 15 w(error\(integer,)19 b(Counter\))p 1859 596 2 50 v -30 598 1890 2 v -30 682 a Fi(P)o(ortabilit)o(y)-30 781 y Fm(GNU)14 b(Prolog)f(predicate.)-30 936 y Fi(7.27.2)48 b Fh(argument)p 319 936 14 2 v 14 w(value/2)-30 1062 y Fi(T)l(emplates)74 1131 y Fh(argument)p 253 1131 V 14 w(value\(+integer,)19 b(?atom\))-30 1199 y Fi(Description)-30 1299 y Fh(argument)p 149 1299 V 15 w(value\(N,)h(Arg\))12 b Fm(succeeds)k(if)d(the)h Fh(N)p Fe(th)i Fm(argumen)o(t)d(on)g(the)h (command-line)e(uni\014es)i(with)f Fh(Arg)p Fm(.)18 b(The)13 b(\014rst)-30 1349 y(argumen)o(t)h(is)f(alw)o(a)o(ys)g(the)h(name)g(of) f(the)h(running)f(program)g(and)h(its)f(n)o(um)o(b)q(er)h(is)g(0.)k (The)c(n)o(um)o(b)q(er)g(of)f(argumen)o(ts)g(on)-30 1398 y(the)i(command-line)d(can)j(b)q(e)f(obtained)g(using)g Fh(argument)p 901 1398 V 14 w(counter/1)e Fm(\(section)j(7.27.1,)c (page)j(142\).)-30 1498 y Fi(Errors)p -30 1554 1890 2 v -30 1604 2 50 v -3 1589 a Fh(N)g Fm(is)f(a)h(v)n(ariable)p 915 1604 V 689 w Fh(instantiation)p 1230 1589 14 2 v 13 w(error)p 1859 1604 2 50 v -30 1605 1890 2 v -30 1655 2 50 v -3 1640 a(N)g Fm(is)f(neither)i(a)f(v)n(ariable)f(nor)g(an)h(in) o(teger)p 915 1655 V 281 w Fh(type)p 1032 1640 14 2 v 15 w(error\(integer,)19 b(N\))p 1859 1655 2 50 v -30 1657 1890 2 v -30 1706 2 50 v -3 1692 a(N)14 b Fm(is)f(an)h(in)o(teger) g Fb(<)h Fm(0)p 915 1706 V 604 w Fh(domain)p 1076 1692 14 2 v 15 w(error\(not)p 1289 1692 V 13 w(less)p 1390 1692 V 15 w(than)p 1493 1692 V 15 w(zero,)21 b(N\))p 1859 1706 2 50 v -30 1708 1890 2 v -30 1758 2 50 v -3 1743 a(Arg)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(atom)p 915 1758 V 267 w Fh(type)p 1032 1743 14 2 v 15 w(error\(atom,)19 b(Arg\))p 1859 1758 2 50 v -30 1760 1890 2 v -30 1842 a Fi(P)o(ortabilit)o(y)-30 1942 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2097 y Fi(7.27.3)48 b Fh(argument)p 319 2097 14 2 v 14 w(list/1)-30 2223 y Fi(T)l(emplates)74 2292 y Fh(argument)p 253 2292 V 14 w(list\(?list\))-30 2360 y Fi(Description)-30 2460 y Fh(argument)p 149 2460 V 15 w(list\(Args\))12 b Fm(succeeds)17 b(if)g Fh(Args)d Fm(uni\014es)h(with)f(the)h(list)f (of)g(atoms)g(asso)q(ciated)i(with)e(eac)o(h)h(argumen)o(t)f(on)-30 2510 y(the)h(command-line)d(other)j(than)f(the)g(\014rst)h(argumen)o(t) f(\(the)g(name)g(of)f(the)i(running)e(program\).)-30 2609 y Fi(Errors)p -30 2673 1890 2 v -30 2723 2 50 v -3 2708 a Fh(Args)g Fm(is)h(neither)h(a)e(partial)g(list)g(nor)h(a)g (list)p 915 2723 V 258 w Fh(type)p 1032 2708 14 2 v 15 w(error\(list,)19 b(Args\))p 1859 2723 2 50 v -30 2725 1890 2 v -30 2808 a Fi(P)o(ortabilit)o(y)-30 2908 y Fm(GNU)14 b(Prolog)f(predicate.)p eop end %%Page: 144 146 TeXDict begin 144 145 bop -30 -45 a Fm(144)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(7.27.4)48 b Fh(environ/2)-30 241 y Fi(T)l(emplates)74 324 y Fh(environ\(?atom,)19 b(?atom\))-30 407 y Fi(Description)-30 507 y Fh(environ\(Name,)h(Value\))13 b Fm(succeeds)18 b(if)f Fh(Name)e Fm(is)f(the)i(name)f(of)f(an)h(en)o (vironmen)o(t)g(v)n(ariable)f(whose)h(v)n(alue)g(is)g Fh(Value)p Fm(.)-30 557 y(This)f(predicate)h(is)f(re-executable)i(on)d (bac)o(ktrac)o(king.)-30 656 y Fi(Errors)p -30 712 1890 2 v -30 762 2 50 v -3 747 a Fh(Name)g Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(an)g(atom)p 915 762 V 245 w Fh(type)p 1032 747 14 2 v 15 w(error\(atom,)19 b(Name\))p 1859 762 2 50 v -30 764 1890 2 v -30 813 2 50 v -3 798 a(Value)13 b Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f(atom)p 915 813 V 224 w Fh(type)p 1032 798 14 2 v 15 w(error\(atom,)19 b(Value\))p 1859 813 2 50 v -30 815 1890 2 v -30 898 a Fi(P)o(ortabilit)o(y)-30 997 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1155 y Fi(7.27.5)48 b Fh(make)p 231 1155 14 2 v 15 w(directory/1)p Fi(,)14 b Fh(delete)p 647 1155 V 14 w(directory/1)p Fi(,)g Fh(change)p 1062 1155 V 15 w(directory/1)-30 1282 y Fi(T)l(emplates)74 1365 y Fh(make)p 165 1365 V 15 w(directory\(+atom\))74 1414 y(delete)p 209 1414 V 15 w(directory\(+atom\))74 1464 y(change)p 209 1464 V 15 w(directory\(+atom\))-30 1547 y Fi(Description)-30 1647 y Fh(make)p 61 1647 V 15 w(directory\(PathName\))c Fm(creates)16 b(the)e(directory)h(whose)g (pathname)e(is)h Fh(PathName)p Fm(.)-30 1747 y Fh(delete)p 105 1747 V 15 w(directory\(PathNam)o(e\))d Fm(remo)o(v)o(es)j(the)h (directory)f(whose)h(pathname)e(is)h Fh(PathName)p Fm(.)-30 1846 y Fh(change)p 105 1846 V 15 w(directory\(PathNam)o(e\))d Fm(sets)k(the)f(curren)o(t)i(directory)e(to)g(the)g(directory)h(whose)f (pathname)g(is)f Fh(PathName)p Fm(.)-30 1946 y(See)i Fh(absolute)p 223 1946 V 14 w(file)p 325 1946 V 15 w(name/2)e Fm(for)g(information)f(ab)q(out)i(the)h(syn)o(tax)e(of)k Fh(PathName)12 b Fm(\(section)j(7.26.1,)c(page)j(141\).)-30 2045 y Fi(Errors)p -30 2101 1890 2 v -30 2151 2 50 v -3 2136 a Fh(PathName)e Fm(is)i(a)g(v)n(ariable)p 915 2151 V 536 w Fh(instantiation)p 1230 2136 14 2 v 13 w(error)p 1859 2151 2 50 v -30 2152 1890 2 v -30 2202 2 50 v -3 2187 a(PathName)e Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(an)g(atom)p 915 2202 V 158 w Fh(type)p 1032 2187 14 2 v 15 w(error\(atom,)19 b(PathName\))p 1859 2202 2 50 v -30 2204 1890 2 v -30 2254 2 50 v -3 2239 a(PathName)12 b Fm(is)i(an)g(atom)f(but)h(not)g(a)f (v)n(alid)g(pathname)p 915 2254 V 85 w Fh(domain)p 1076 2239 14 2 v 15 w(error\(os)p 1267 2239 V 14 w(path,)20 b(PathName\))p 1859 2254 2 50 v -30 2255 1890 2 v -30 2405 2 150 v -3 2290 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q (ccurs)g(and)f(the)g(v)n(alue)-3 2340 y(of)f(the)i Fh(os)p 163 2340 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 2390 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 2405 2 150 v 941 2290 a Fh(system)p 1076 2290 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 2405 2 150 v -30 2407 1890 2 v -30 2489 a Fi(P)o(ortabilit)o(y)-30 2589 y Fm(GNU)14 b(Prolog)f(predicates.)-30 2747 y Fi(7.27.6)48 b Fh(working)p 297 2747 14 2 v 14 w(directory/1)-30 2873 y Fi(T)l(emplates)p eop end %%Page: 145 147 TeXDict begin 145 146 bop -30 -45 a Fm(7.27)41 b(Op)q(erating)14 b(system)h(in)o(terface)1223 b(145)p -30 -27 1890 4 v 74 115 a Fh(working)p 231 115 14 2 v 14 w(directory\(?atom\))-30 198 y Fi(Description)-30 298 y Fh(working)p 127 298 V 15 w(directory\(PathNa)o(me\))11 b Fm(succeeds)16 b(if)g Fh(PathName)d Fm(is)g(the)i(pathname)f(of)f(the)h(curren)o(t)i (directory)m(.)-30 397 y Fi(Errors)p -30 462 1890 2 v -30 511 2 50 v -3 496 a Fh(PathName)c Fm(is)i(neither)h(a)e(v)n (ariable)g(nor)h(an)g(atom)p 915 511 V 158 w Fh(type)p 1032 496 14 2 v 15 w(error\(atom,)19 b(PathName\))p 1859 511 2 50 v -30 513 1890 2 v -30 596 a Fi(P)o(ortabilit)o(y)-30 696 y Fm(GNU)14 b(Prolog)f(predicate.)-30 854 y Fi(7.27.7)48 b Fh(directory)p 341 854 14 2 v 14 w(files/2)-30 980 y Fi(T)l(emplates)74 1063 y Fh(directory)p 275 1063 V 14 w(files\(+atom,)19 b(?list\))-30 1146 y Fi(Description)-30 1246 y Fh(directory)p 171 1246 V 14 w(files\(PathName,)g(Files\))10 b Fm(succeeds)15 b(if)f Fh(Files)c Fm(is)i(the)g(list)f(of)g(all)g(en)o (tries)h(\(\014les,)h(sub-directories,.)7 b(.)g(.)f(\))-30 1296 y(in)18 b(the)g(directory)h(whose)f(pathname)g(is)f Fh(PathName)p Fm(.)28 b(See)19 b Fh(absolute)p 1121 1296 V 14 w(file)p 1223 1296 V 15 w(name/2)e Fm(for)g(information)f(ab)q (out)i(the)-30 1345 y(syn)o(tax)c(of)j Fh(PathName)12 b Fm(\(section)j(7.26.1,)c(page)j(141\).)-30 1445 y Fi(Errors)p -30 1501 1890 2 v -30 1551 2 50 v -3 1536 a Fh(PathName)e Fm(is)i(a)g(v)n(ariable)p 915 1551 V 536 w Fh(instantiation)p 1230 1536 14 2 v 13 w(error)p 1859 1551 2 50 v -30 1552 1890 2 v -30 1602 2 50 v -3 1587 a(PathName)e Fm(is)i(neither)h(a)e(v)n (ariable)g(nor)h(an)g(atom)p 915 1602 V 158 w Fh(type)p 1032 1587 14 2 v 15 w(error\(atom,)19 b(PathName\))p 1859 1602 2 50 v -30 1604 1890 2 v -30 1654 2 50 v -3 1639 a(PathName)12 b Fm(is)i(an)g(atom)f(but)h(not)g(a)f(v)n(alid)g (pathname)p 915 1654 V 85 w Fh(domain)p 1076 1639 14 2 v 15 w(error\(os)p 1267 1639 V 14 w(path,)20 b(PathName\))p 1859 1654 2 50 v -30 1655 1890 2 v -30 1705 2 50 v -3 1690 a(Files)13 b Fm(is)h(neither)g(a)g(partial)f(list)g(nor)h(a)g (list)p 915 1705 V 236 w Fh(type)p 1032 1690 14 2 v 15 w(error\(list,)19 b(Files\))p 1859 1705 2 50 v -30 1707 1890 2 v -30 1856 2 150 v -3 1742 a Fm(an)14 b(op)q(erating)f(system)i (error)g(o)q(ccurs)g(and)f(the)g(v)n(alue)-3 1791 y(of)f(the)i Fh(os)p 163 1791 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1841 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1856 2 150 v 941 1742 a Fh(system)p 1076 1742 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1856 2 150 v -30 1858 1890 2 v -30 1941 a Fi(P)o(ortabilit)o(y)-30 2040 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2198 y Fi(7.27.8)48 b Fh(rename)p 275 2198 14 2 v 15 w(file/2)-30 2324 y Fi(T)l(emplates)74 2407 y Fh(rename)p 209 2407 V 15 w(file\(+atom,)19 b(+atom\))-30 2490 y Fi(Description)-30 2590 y Fh(rename)p 105 2590 V 15 w(file\(PathName1,) g(PathName2\))14 b Fm(renames)k(the)g(\014le)f(or)g(directory)g(whose)h (pathname)f(is)f Fh(PathName1)f Fm(to)-30 2640 y Fh(PathName2)p Fm(.)i(See)e Fh(absolute)p 450 2640 V 14 w(file)p 552 2640 V 15 w(name/2)e Fm(for)h(information)e(ab)q(out)i(the)h(syn)o(tax) f(of)j Fh(PathName1)12 b Fm(and)i Fh(PathName2)-30 2690 y Fm(\(section)h(7.26.1,)d(page)i(141\).)-30 2789 y Fi(Errors)p eop end %%Page: 146 148 TeXDict begin 146 147 bop -30 -45 a Fm(146)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(PathName1)e Fm(is)i(a)f(v)n(ariable)p 915 125 V 515 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(PathName1)f Fm(is)i(neither)h(a)e(v)n (ariable)g(nor)h(an)f(atom)p 915 176 V 137 w Fh(type)p 1032 161 14 2 v 15 w(error\(atom,)19 b(PathName1\))p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(PathName1)12 b Fm(is)i(an)f(atom)g(but)i(not)e(a)h(v)n(alid)e (pathname)p 915 228 V 64 w Fh(domain)p 1076 213 14 2 v 15 w(error\(os)p 1267 213 V 14 w(path,)20 b(PathName1\))p 1859 228 2 50 v -30 229 1890 2 v -30 279 2 50 v -3 264 a(PathName2)12 b Fm(is)i(a)f(v)n(ariable)p 915 279 V 515 w Fh(instantiation)p 1230 264 14 2 v 13 w(error)p 1859 279 2 50 v -30 281 1890 2 v -30 331 2 50 v -3 316 a(PathName2)f Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(an)f(atom)p 915 331 V 137 w Fh(type)p 1032 316 14 2 v 15 w(error\(atom,)19 b(PathName2\))p 1859 331 2 50 v -30 332 1890 2 v -30 382 2 50 v -3 367 a(PathName2)12 b Fm(is)i(an)f(atom)g(but)i(not)e(a)h (v)n(alid)e(pathname)p 915 382 V 64 w Fh(domain)p 1076 367 14 2 v 15 w(error\(os)p 1267 367 V 14 w(path,)20 b(PathName2\))p 1859 382 2 50 v -30 384 1890 2 v -30 533 2 150 v -3 419 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q (ccurs)g(and)f(v)n(alue)f(of)-3 469 y(the)i Fh(os)p 116 469 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 518 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 533 2 150 v 941 419 a Fh(system)p 1076 419 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 533 2 150 v -30 535 1890 2 v -30 618 a Fi(P)o(ortabilit)o(y)-30 717 y Fm(GNU)14 b(Prolog)f(predicate.)-30 875 y Fi(7.27.9)48 b Fh(delete)p 275 875 14 2 v 15 w(file/1)p Fi(,)15 b Fh(unlink/1)-30 1002 y Fi(T)l(emplates)74 1084 y Fh(delete)p 209 1084 V 15 w(file\(PathName\))74 1134 y(unlink\(PathName\))-30 1217 y Fi(Description)-30 1317 y Fh(delete)p 105 1317 V 15 w(file\(PathName\))c Fm(remo)o(v)o(es)j(the)h(existing)e(\014le)h (whose)h(pathname)e(is)h Fh(PathName)p Fm(.)-30 1416 y Fh(unlink/1)d Fm(is)g(similar)g(to)h Fh(delete)p 515 1416 V 14 w(file/1)f Fm(except)i(that)f(it)g(nev)o(er)g(causes)i(a)d Fh(system)p 1326 1416 V 15 w(error)g Fm(\(e.g.)17 b(if)d Fh(PathName)c Fm(do)q(es)-30 1466 y(not)k(refer)h(to)f(an)g(existing)f (\014le\).)-30 1566 y(See)i Fh(absolute)p 223 1566 V 14 w(file)p 325 1566 V 15 w(name/2)e Fm(for)g(information)f(ab)q(out)i (the)h(syn)o(tax)e(of)k Fh(PathName)12 b Fm(\(section)j(7.26.1,)c(page) j(141\).)-30 1665 y Fi(Errors)p -30 1721 1890 2 v -30 1771 2 50 v -3 1756 a Fh(PathName)e Fm(is)i(a)g(v)n(ariable)p 915 1771 V 536 w Fh(instantiation)p 1230 1756 14 2 v 13 w(error)p 1859 1771 2 50 v -30 1773 1890 2 v -30 1822 2 50 v -3 1807 a(PathName)e Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h (an)g(atom)p 915 1822 V 158 w Fh(type)p 1032 1807 14 2 v 15 w(error\(atom,)19 b(PathName\))p 1859 1822 2 50 v -30 1824 1890 2 v -30 1874 2 50 v -3 1859 a(PathName)12 b Fm(is)i(an)g(atom)f(but)h(not)g(a)f(v)n(alid)g(pathname)p 915 1874 V 85 w Fh(domain)p 1076 1859 14 2 v 15 w(error\(os)p 1267 1859 V 14 w(path,)20 b(PathName\))p 1859 1874 2 50 v -30 1876 1890 2 v -30 2025 2 150 v -3 1910 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs)g(and)f(the)g(v)n(alue)-3 1960 y(of)f(the)i Fh(os)p 163 1960 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 2010 y Fm(\(section)h(7.22.1,)c (page)j(133\))p 915 2025 2 150 v 941 1910 a Fh(system)p 1076 1910 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 2025 2 150 v -30 2027 1890 2 v -30 2109 a Fi(P)o(ortabilit)o(y)-30 2209 y Fm(GNU)14 b(Prolog)f(predicates.)-30 2367 y Fi(7.27.10)48 b Fh(file)p 255 2367 14 2 v 15 w(permission/2)p Fi(,)14 b Fh(file)p 649 2367 V 14 w(exists/1)-30 2493 y Fi(T)l(emplates)74 2576 y Fh(file)p 165 2576 V 15 w (permission\(+atom,)k(+atom\))74 2626 y(file)p 165 2626 V 15 w(permission\(+atom,)g(+atom)p 682 2626 V 15 w(list\))74 2676 y(file)p 165 2676 V 15 w(exists\(+atom\))-30 2759 y Fi(Description)-30 2858 y Fh(file)p 61 2858 V 15 w (permission\(PathName)o(,)h(Permission\))11 b Fm(succeeds)16 b(if)g Fh(PathName)11 b Fm(is)j(the)g(pathname)f(of)g(an)g(existing)g (\014le)g(\(or)-30 2908 y(directory\))i(whose)g(p)q(ermissions)f (include)g Fh(Permission)p Fm(.)p eop end %%Page: 147 149 TeXDict begin 147 148 bop -30 -45 a Fm(7.27)41 b(Op)q(erating)14 b(system)h(in)o(terface)1223 b(147)p -30 -27 1890 4 v -30 115 a Fi(File)18 b(p)q(ermissions)p Fm(:)h Fh(Permission)13 b Fm(can)i(b)q(e)h(a)f(single)f(p)q(ermission)h(or)g(a)g(list)g(of)f(p) q(ermissions.)22 b(A)15 b(p)q(ermission)h(is)e(an)-30 165 y(atom)g(among:)33 246 y Fg(\017)20 b Fh(read)p Fm(:)d(the)e (\014le)f(or)g(directory)g(can)g(b)q(e)h(read.)33 327 y Fg(\017)20 b Fh(write)p Fm(:)d(the)e(\014le)f(or)f(directory)i(can)f (b)q(e)h(written.)33 409 y Fg(\017)20 b Fh(execute)p Fm(:)d(the)d(\014le)g(can)g(b)q(e)h(executed.)33 491 y Fg(\017)20 b Fh(search)p Fm(:)d(the)d(directory)h(can)f(b)q(e)h (searc)o(hed.)-30 572 y(If)i Fh(PathName)12 b Fm(do)q(es)j(not)f (exists)g(or)g(if)f(it)h(its)g(p)q(ermissions)g(do)g(not)g(include)g Fh(Permission)d Fm(this)j(predicate)h(fails.)-30 672 y Fh(file)p 61 672 14 2 v 15 w(exists\(PathName\))9 b Fm(is)k(equiv)n(alen)o(t)e(to)i Fh(file)p 811 672 V 15 w(permission\(PathN)o(ame,)18 b([]\))p Fm(,)12 b(i.e.)17 b(it)12 b(succeeds)j(if)g Fh(PathName)-30 721 y Fm(is)f(the)h(pathname) e(of)h(an)f(existing)h(\014le)g(\(or)g(directory\).)-30 821 y(See)h Fh(absolute)p 223 821 V 14 w(file)p 325 821 V 15 w(name/2)e Fm(for)g(information)f(ab)q(out)i(the)h(syn)o(tax)e(of) k Fh(PathName)12 b Fm(\(section)j(7.26.1,)c(page)j(141\).)-30 921 y Fi(Errors)p -30 976 1890 2 v -30 1026 2 50 v -3 1011 a Fh(PathName)e Fm(is)i(a)g(v)n(ariable)p 915 1026 V 536 w Fh(instantiation)p 1230 1011 14 2 v 13 w(error)p 1859 1026 2 50 v -30 1028 1890 2 v -30 1078 2 50 v -3 1063 a(PathName)e Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(an)g(atom)p 915 1078 V 158 w Fh(type)p 1032 1063 14 2 v 15 w(error\(atom,)19 b(PathName\))p 1859 1078 2 50 v -30 1079 1890 2 v -30 1129 2 50 v -3 1114 a(PathName)12 b Fm(is)i(an)g(atom)f(but)h(not)g(a)f (v)n(alid)g(pathname)p 915 1129 V 85 w Fh(domain)p 1076 1114 14 2 v 15 w(error\(os)p 1267 1114 V 14 w(path,)20 b(PathName\))p 1859 1129 2 50 v -30 1131 1890 2 v -30 1230 2 100 v -3 1166 a(Permission)12 b Fm(is)i(a)f(partial)g(list)g(or) h(a)g(list)f(with)h(an)-3 1215 y(elemen)o(t)g(whic)o(h)g(is)g(a)g(v)n (ariable)p 915 1230 V 941 1166 a Fh(instantiation)p 1230 1166 14 2 v 13 w(error)p 1859 1230 2 100 v -30 1232 1890 2 v -30 1332 2 100 v -3 1267 a(Permission)e Fm(is)i(neither)g(an)g (atom)f(nor)h(partial)f(list)g(or)-3 1317 y(a)h(list)p 915 1332 V 941 1267 a Fh(type)p 1032 1267 14 2 v 15 w(error\(list,)19 b(Permission\))p 1859 1332 2 100 v -30 1333 1890 2 v -30 1433 2 100 v -3 1368 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Permission)e Fm(list)i(is)f(neither)i(a)-3 1418 y(v)n(ariable)e(nor)h(an)f(atom)p 915 1433 V 941 1368 a Fh(type)p 1032 1368 14 2 v 15 w(error\(atom,)19 b(E\))p 1859 1433 2 100 v -30 1435 1890 2 v -30 1534 2 100 v -3 1470 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Permission)e Fm(is)i(an)g(atom)f(but)-3 1519 y(not)h(a)f(v)n(alid)g (p)q(ermission)p 915 1534 V 941 1470 a Fh(domain)p 1076 1470 14 2 v 15 w(error\(os)p 1267 1470 V 14 w(file)p 1369 1470 V 14 w(permission,)941 1519 y(Permission\))p 1859 1534 2 100 v -30 1536 1890 2 v -30 1685 2 150 v -3 1571 a Fm(an)h(op)q(erating)f(system)i(error)g(o)q(ccurs)g(and)f (the)g(v)n(alue)-3 1621 y(of)f(the)i Fh(os)p 163 1621 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1670 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1685 2 150 v 941 1571 a Fh(system)p 1076 1571 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1685 2 150 v -30 1687 1890 2 v -30 1770 a Fi(P)o(ortabilit)o(y)-30 1869 y Fm(GNU)14 b(Prolog)f(predicates.)-30 2027 y Fi(7.27.11)48 b Fh(file)p 255 2027 14 2 v 15 w(property/2)-30 2153 y Fi(T)l(emplates)74 2234 y Fh(file)p 165 2234 V 15 w(property\(+atom,) 19 b(?os)p 595 2234 V 15 w(file)p 698 2234 V 15 w(property\))-30 2315 y Fi(Description)-30 2414 y Fh(file)p 61 2414 V 15 w(property\(PathName,)f(Property\))c Fm(succeeds)k(if)g Fh(PathName)c Fm(is)h(the)h(pathname)f(of)g(an)h(existing)f(\014le)g (\(or)h(di-)-30 2464 y(rectory\))f(and)e(if)j Fh(Property)c Fm(uni\014es)i(with)f(one)h(of)e(the)j(prop)q(erties)f(of)f(the)h (\014le.)k(This)13 b(predicate)i(is)e(re-executable)i(on)-30 2514 y(bac)o(ktrac)o(king.)-30 2614 y Fi(File)i(prop)q(erties)p Fm(:)33 2694 y Fg(\017)j Fh(absolute)p 253 2694 V 14 w(file)p 355 2694 V 15 w(name\(File\))p Fm(:)15 b Fh(File)c Fm(is)h(the)g(absolute)g(\014le)g(name)g(of)j Fh(PathName)10 b Fm(\(section)j(7.26.1,)c(page)j(141\).)33 2776 y Fg(\017)20 b Fh(real)p 165 2776 V 15 w(file)p 268 2776 V 15 w(name\(File\))p Fm(:)c Fh(File)d Fm(is)h(the)g(real)g(\014le)g(name)g(of)i Fh(PathName)c Fm(\(follo)o(ws)h(sym)o(b)q(olic)g(links\).)33 2858 y Fg(\017)20 b Fh(type\(Type\))p Fm(:)14 b Fh(Type)9 b Fm(is)g(the)h(t)o(yp)q(e)g(of)i Fh(PathName)p Fm(.)j(P)o(ossible)10 b(v)n(alues)f(are:)16 b Fh(regular)p Fm(,)9 b Fh(directory)p Fm(,)f Fh(fifo)p Fm(,)h Fh(socket)p Fm(,)74 2908 y Fh(character)p 275 2908 V 14 w(device)p Fm(,)j Fh(block)p 555 2908 V 15 w(device)g Fm(or)i Fh(unknown)p Fm(.)p eop end %%Page: 148 150 TeXDict begin 148 149 bop -30 -45 a Fm(148)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v 33 115 a Fg(\017)20 b Fh(size\(Size\))p Fm(:)c Fh(Size)d Fm(is)h(the)g(size)h(\(in)f(b)o(ytes\))g(of)j Fh(PathName)p Fm(.)33 198 y Fg(\017)j Fh(permission\(Permissi)o(on\))p Fm(:)15 b Fh(Permission)c Fm(is)j(a)g(p)q(ermission)g(of)i Fh(PathName)c Fm(\(section)j(7.27.10,)c(page)j(146\).)33 281 y Fg(\017)20 b Fh(last)p 165 281 14 2 v 15 w(modification\(DT\))p Fm(:)10 b Fh(DT)k Fm(is)f(the)i(last)e(mo)q(di\014cation)g(date)h(and)g (time)g(\(section)g(7.27.14,)e(page)h(149\).)-30 364 y(See)i Fh(absolute)p 223 364 V 14 w(file)p 325 364 V 15 w(name/2)e Fm(for)g(information)f(ab)q(out)i(the)h(syn)o(tax)e(of)k Fh(PathName)12 b Fm(\(section)j(7.26.1,)c(page)j(141\).)-30 464 y Fi(Errors)p -30 519 1890 2 v -30 569 2 50 v -3 554 a Fh(PathName)e Fm(is)i(a)g(v)n(ariable)p 915 569 V 536 w Fh(instantiation)p 1230 554 14 2 v 13 w(error)p 1859 569 2 50 v -30 571 1890 2 v -30 621 2 50 v -3 606 a(PathName)e Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(an)g(atom)p 915 621 V 158 w Fh(type)p 1032 606 14 2 v 15 w(error\(atom,)19 b(PathName\))p 1859 621 2 50 v -30 622 1890 2 v -30 672 2 50 v -3 657 a(PathName)12 b Fm(is)i(an)g(atom)f(but)h(not)g(a)f(v)n (alid)g(pathname)p 915 672 V 85 w Fh(domain)p 1076 657 14 2 v 15 w(error\(os)p 1267 657 V 14 w(path,)20 b(PathName\))p 1859 672 2 50 v -30 674 1890 2 v -30 773 2 100 v -3 709 a(Property)12 b Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(a)g(\014le)g (prop)q(ert)o(y)-3 758 y(term)p 915 773 V 941 709 a Fh(domain)p 1076 709 14 2 v 15 w(error\(os)p 1267 709 V 14 w(file)p 1369 709 V 14 w(property,)20 b(Property\))p 1859 773 2 100 v -30 775 1890 2 v -30 924 2 150 v -3 810 a(Property)12 b Fm(=)i Fh(absolute)p 410 810 14 2 v 14 w(file)p 512 810 V 15 w(name\(E\))p Fm(,)-3 860 y Fh(real)p 88 860 V 15 w(file)p 191 860 V 15 w(name\(E\))p Fm(,)e Fh(type\(E\))g Fm(or)i Fh(permission\(E\))-3 909 y Fm(and)g Fh(E)f Fm(is)h(neither)h (a)f(v)n(ariable)e(nor)i(an)g(atom)p 915 924 2 150 v 941 810 a Fh(type)p 1032 810 14 2 v 15 w(error\(atom,)19 b(E\))p 1859 924 2 150 v -30 926 1890 2 v -30 1075 2 150 v -3 961 a(Property)12 b Fm(=)i Fh(last)p 322 961 14 2 v 15 w(modification\(DateT)o(ime\))-3 1011 y Fm(and)g Fh(DateTime)e Fm(is)i(neither)g(a)g(v)n(ariable)f(nor)h(a)-3 1061 y(comp)q(ound)g(term)p 915 1075 2 150 v 941 961 a Fh(type)p 1032 961 14 2 v 15 w(error\(compound,)19 b(DateTime\))p 1859 1075 2 150 v -30 1077 1890 2 v -30 1227 2 150 v -3 1112 a(Property)12 b Fm(=)i Fh(last)p 322 1112 14 2 v 15 w(modification\(DateT)o(ime\))-3 1162 y Fm(and)g Fh(DateTime)e Fm(is)i(a)f(comp)q(ound)h(term)g(but)g(not)g (a)-3 1212 y(structure)i Fh(dt/6)p 915 1227 2 150 v 941 1112 a(domain)p 1076 1112 14 2 v 15 w(error\(date)p 1311 1112 V 13 w(time,)21 b(DateTime\))p 1859 1227 2 150 v -30 1228 1890 2 v -30 1427 2 200 v -3 1263 a(Property)12 b Fm(=)i Fh(size\(E\))f Fm(or)-3 1313 y Fh(last)p 88 1313 14 2 v 15 w(modification\(Date)o(Time\))d Fm(and)k Fh(DateTime)e Fm(is)-3 1363 y(a)i(structure)i Fh(dt/6)d Fm(but)h(an)f(elemen)o(t)i Fh(E)e Fm(is)h(neither)h(a)-3 1413 y(v)n(ariable)e(nor)h(an)f(in)o(teger)p 915 1427 2 200 v 941 1263 a Fh(type)p 1032 1263 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 1427 2 200 v -30 1429 1890 2 v -30 1579 2 150 v -3 1464 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs) g(and)f(the)g(v)n(alue)-3 1514 y(of)f(the)i Fh(os)p 163 1514 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1564 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1579 2 150 v 941 1464 a Fh(system)p 1076 1464 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1579 2 150 v -30 1580 1890 2 v -30 1663 a Fi(P)o(ortabilit)o(y)-30 1763 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1920 y Fi(7.27.12)48 b Fh(temporary)p 365 1920 14 2 v 14 w(name/2)-30 2047 y Fi(T)l(emplates)74 2130 y Fh(temporary)p 275 2130 V 14 w(name\(+atom,)20 b(?atom\))-30 2213 y Fi(Description)-30 2312 y Fh(temporary)p 171 2312 V 14 w(name\(Template,)f(PathName\))10 b Fm(creates)k(a)d(unique)h(\014le)g(name)f Fh(PathName)f Fm(whose)j(pathname)e(b)q(egins)h(b)o(y)-30 2362 y Fh(Template)p Fm(.)k Fh(Template)11 b Fm(should)i(con)o(tain)f(a)h(pathname)f(with)h (six)f(trailing)g Fh(X)p Fe(s)p Fm(.)17 b Fh(PathName)11 b Fm(is)i Fh(Template)e Fm(with)h(the)h(six)-30 2412 y Fh(X)p Fe(s)k Fm(replaced)c(with)g(a)g(letter)h(and)e(the)i(pro)q (cess)h(iden)o(ti\014er.)j(This)13 b(predicate)h(is)e(an)h(in)o (terface)h(to)f(the)g(C)g(Unix)f(function)-30 2462 y Fh(mktemp\(3\))p Fm(.)-30 2562 y(See)j Fh(absolute)p 223 2562 V 14 w(file)p 325 2562 V 15 w(name/2)e Fm(for)g(information)f (ab)q(out)i(the)h(syn)o(tax)e(of)k Fh(Template)12 b Fm(\(section)j (7.26.1,)c(page)j(141\).)-30 2661 y Fi(Errors)p eop end %%Page: 149 151 TeXDict begin 149 150 bop -30 -45 a Fm(7.27)41 b(Op)q(erating)14 b(system)h(in)o(terface)1223 b(149)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(Template)12 b Fm(is)i(a)g(v)n(ariable)p 915 125 V 536 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(Template)e Fm(is)i(neither)h(a)e(v)n (ariable)g(nor)h(an)g(atom)p 915 176 V 158 w Fh(type)p 1032 161 14 2 v 15 w(error\(atom,)19 b(Template\))p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(Template)12 b Fm(is)i(an)g(atom)f(but)h(not)g(a)f(v)n(alid)g(pathname)p 915 228 V 85 w Fh(domain)p 1076 213 14 2 v 15 w(error\(os)p 1267 213 V 14 w(path,)20 b(Template\))p 1859 228 2 50 v -30 229 1890 2 v -30 279 2 50 v -3 264 a(PathName)12 b Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(an)g(atom)p 915 279 V 158 w Fh(type)p 1032 264 14 2 v 15 w(error\(atom,)19 b(PathName\))p 1859 279 2 50 v -30 281 1890 2 v -30 430 2 150 v -3 316 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs)g (and)f(the)g(v)n(alue)-3 366 y(of)f(the)i Fh(os)p 163 366 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 415 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 430 2 150 v 941 316 a Fh(system)p 1076 316 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 430 2 150 v -30 432 1890 2 v -30 515 a Fi(P)o(ortabilit)o(y)-30 614 y Fm(GNU)14 b(Prolog)f(predicate.)-30 772 y Fi(7.27.13)48 b Fh(temporary)p 365 772 14 2 v 14 w(file/3)-30 899 y Fi(T)l(emplates)74 982 y Fh(temporary)p 275 982 V 14 w(file\(+atom,)20 b(+atom,)g(?atom\))-30 1065 y Fi(Description)-30 1164 y Fh(temporary)p 171 1164 V 14 w(file\(Directory,)f(Prefix,)h (PathName\))8 b Fm(creates)k(a)e(unique)g(\014le)g(name)g Fh(PathName)e Fm(whose)i(pathname)-30 1214 y(b)q(egins)16 b(b)o(y)f Fh(Directory/Prefix)o Fm(.)j(If)g Fh(Directory)12 b Fm(is)j(the)g(empt)o(y)g(atom)f Fh('')g Fm(a)h(standard)g(temp)q (orary)g(directory)h(will)-30 1264 y(b)q(e)h(used)g(\(e.g.)25 b Fh(/tmp)p Fm(\).)f Fh(Prefix)15 b Fm(can)h(b)q(e)h(the)g(empt)o(y)f (atom)f Fh('')p Fm(.)25 b(This)16 b(predicate)h(is)f(an)g(in)o(terface) h(to)f(the)h(C)f(Unix)-30 1314 y(function)e Fh(tempnam\(3\))p Fm(.)-30 1413 y(See)h Fh(absolute)p 223 1413 V 14 w(file)p 325 1413 V 15 w(name/2)e Fm(for)g(information)f(ab)q(out)i(the)h(syn)o (tax)e(of)k Fh(Directory)12 b Fm(\(section)j(7.26.1,)c(page)j(141\).) -30 1513 y Fi(Errors)p -30 1569 1890 2 v -30 1618 2 50 v -3 1603 a Fh(Directory)e Fm(is)i(a)f(v)n(ariable)p 915 1618 V 515 w Fh(instantiation)p 1230 1603 14 2 v 13 w(error)p 1859 1618 2 50 v -30 1620 1890 2 v -30 1670 2 50 v -3 1655 a(Directory)f Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h (an)f(atom)p 915 1670 V 137 w Fh(type)p 1032 1655 14 2 v 15 w(error\(atom,)19 b(Directory\))p 1859 1670 2 50 v -30 1672 1890 2 v -30 1721 2 50 v -3 1706 a(Directory)12 b Fm(is)i(an)f(atom)g(but)i(not)e(a)h(v)n(alid)e(pathname)p 915 1721 V 64 w Fh(domain)p 1076 1706 14 2 v 15 w(error\(os)p 1267 1706 V 14 w(path,)20 b(Directory\))p 1859 1721 2 50 v -30 1723 1890 2 v -30 1773 2 50 v -3 1758 a(Prefix)13 b Fm(is)g(a)h(v)n(ariable)p 915 1773 V 580 w Fh(instantiation)p 1230 1758 14 2 v 13 w(error)p 1859 1773 2 50 v -30 1774 1890 2 v -30 1824 2 50 v -3 1809 a(Prefix)f Fm(is)g(neither)i(a)f(v)n (ariable)f(nor)g(an)h(atom)p 915 1824 V 202 w Fh(type)p 1032 1809 14 2 v 15 w(error\(atom,)19 b(Prefix\))p 1859 1824 2 50 v -30 1826 1890 2 v -30 1876 2 50 v -3 1861 a(PathName)12 b Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(an)g(atom)p 915 1876 V 158 w Fh(type)p 1032 1861 14 2 v 15 w(error\(atom,)19 b(PathName\))p 1859 1876 2 50 v -30 1877 1890 2 v -30 2027 2 150 v -3 1912 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q (ccurs)g(and)f(the)g(v)n(alue)-3 1962 y(of)f(the)i Fh(os)p 163 1962 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 2012 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 2027 2 150 v 941 1912 a Fh(system)p 1076 1912 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 2027 2 150 v -30 2029 1890 2 v -30 2111 a Fi(P)o(ortabilit)o(y)-30 2211 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2369 y Fi(7.27.14)48 b Fh(date)p 255 2369 14 2 v 15 w(time/1)-30 2495 y Fi(T)l(emplates)74 2578 y Fh(date)p 165 2578 V 15 w(time\(?compound\))-30 2661 y Fi(Description)-30 2761 y Fh(date)p 61 2761 V 15 w(time\(DateTime\))14 b Fm(uni\014es)k Fh(DateTime)d Fm(with)i(a)g(comp)q(ound)f(term)i(con)o (taining)e(the)h(curren)o(t)i(date)e(and)g(time.)-30 2811 y Fh(DateTime)f Fm(is)h(a)f(structure)k Fh(dt\(Year,)g(Month,)g (Day,)h(Hour,)g(Minute,)f(Second\))p Fm(.)26 b(Eac)o(h)18 b(sub-argumen)o(t)f(of)g(the)-30 2860 y(term)e Fh(dt/6)e Fm(is)h(an)f(in)o(teger.)p eop end %%Page: 150 152 TeXDict begin 150 151 bop -30 -45 a Fm(150)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(Errors)p -30 171 1890 2 v -30 270 2 100 v -3 205 a Fh(DateTime)e Fm(is)i(neither)h(a)e(v)n(ariable)g(nor) h(a)g(comp)q(ound)-3 255 y(term)p 915 270 V 941 205 a Fh(type)p 1032 205 14 2 v 15 w(error\(compound,)19 b(DateTime\))p 1859 270 2 100 v -30 272 1890 2 v -30 371 2 100 v -3 307 a(DateTime)12 b Fm(is)i(a)g(comp)q(ound)f(term)i(but)f(not)g(a)-3 356 y(structure)i Fh(dt/6)p 915 371 V 941 307 a(domain)p 1076 307 14 2 v 15 w(error\(date)p 1311 307 V 13 w(time,)21 b(DateTime\))p 1859 371 2 100 v -30 373 1890 2 v -30 473 2 100 v -3 408 a(DateTime)12 b Fm(is)h(a)f(structure)k Fh(dt/6)c Fm(and)h(an)g(elemen)o(t)h Fh(E)f Fm(is)-3 458 y(neither)i(a)e(v)n(ariable)g(nor)h(an)g(in)o(teger)p 915 473 V 941 408 a Fh(type)p 1032 408 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 473 2 100 v -30 474 1890 2 v -30 557 a Fi(P)o(ortabilit)o (y)-30 657 y Fm(GNU)14 b(Prolog)f(predicate.)-30 813 y Fi(7.27.15)48 b Fh(host)p 255 813 14 2 v 15 w(name/1)-30 940 y Fi(T)l(emplates)74 1016 y Fh(host)p 165 1016 V 15 w(name\(?atom\))-30 1093 y Fi(Description)-30 1192 y Fh(host)p 61 1192 V 15 w(name\(HostName\))12 b Fm(uni\014es)j Fh(HostName)d Fm(with)i(the)h(name)f(of)g(the)h(host)g(mac)o(hine)f (executing)h(the)g(curren)o(t)g(GNU)-30 1242 y(Prolog)h(pro)q(cess.)28 b(If)16 b(the)i(so)q(c)o(k)o(ets)f(are)g(a)o(v)n(ailable)e(\(section)i (7.28.1,)e(page)h(157\),)g(the)i(name)e(returned)i(will)d(b)q(e)j (fully)-30 1292 y(quali\014ed.)f(In)12 b(that)g(case,)h Fh(host)p 480 1292 V 15 w(name/1)d Fm(will)h(also)g(succeed)j(if)h Fh(HostName)10 b Fm(is)i(instan)o(tiated)g(to)f(the)i(unquali\014ed)e (name)-30 1342 y(\(or)j(an)g(alias\))f(of)g(the)i(mac)o(hine.)-30 1441 y Fi(Errors)p -30 1497 1890 2 v -30 1547 2 50 v -3 1532 a Fh(Hostname)d Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(an)g (atom)p 915 1547 V 158 w Fh(type)p 1032 1532 14 2 v 15 w(error\(atom,)19 b(HostName\))p 1859 1547 2 50 v -30 1549 1890 2 v -30 1698 2 150 v -3 1583 a Fm(an)14 b(op)q(erating)f (system)i(error)g(o)q(ccurs)g(and)f(the)g(v)n(alue)-3 1633 y(of)f(the)i Fh(os)p 163 1633 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1683 y Fm(\(section)h(7.22.1,)c (page)j(133\))p 915 1698 2 150 v 941 1583 a Fh(system)p 1076 1583 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1698 2 150 v -30 1700 1890 2 v -30 1782 a Fi(P)o(ortabilit)o(y)-30 1882 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2038 y Fi(7.27.16)48 b Fh(os)p 211 2038 14 2 v 15 w(version/1)-30 2165 y Fi(T)l(emplates)74 2241 y Fh(os)p 121 2241 V 16 w(version\(?atom\))-30 2318 y Fi(Description)-30 2418 y Fh(os)p 17 2418 V 16 w(version\(OSVersio)o(n\))11 b Fm(uni\014es)j Fh(OSVersion)f Fm(with)g(the)i(op)q(erating)f(system)h (v)o(ersion)f(of)f(the)i(mac)o(hine)e(executing)-30 2467 y(the)i(curren)o(t)g(GNU)f(Prolog)f(pro)q(cess.)-30 2567 y Fi(Errors)p -30 2623 1890 2 v -30 2672 2 50 v -3 2658 a Fh(OSVersion)f Fm(is)i(neither)h(a)e(v)n(ariable)g(nor)h(an)f(atom)p 915 2672 V 137 w Fh(type)p 1032 2658 14 2 v 15 w(error\(atom,)19 b(OSVersion\))p 1859 2672 2 50 v -30 2674 1890 2 v -30 2824 2 150 v -3 2709 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q (ccurs)g(and)f(the)g(v)n(alue)-3 2759 y(of)f(the)i Fh(os)p 163 2759 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 2809 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 2824 2 150 v 941 2709 a Fh(system)p 1076 2709 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 2824 2 150 v -30 2825 1890 2 v -30 2908 a Fi(P)o(ortabilit)o(y)p eop end %%Page: 151 153 TeXDict begin 151 152 bop -30 -45 a Fm(7.27)41 b(Op)q(erating)14 b(system)h(in)o(terface)1223 b(151)p -30 -27 1890 4 v -30 115 a(GNU)14 b(Prolog)f(predicate.)-30 273 y Fi(7.27.17)48 b Fh(architecture/1)-30 399 y Fi(T)l(emplates)74 482 y Fh(architecture\(?atom\))-30 565 y Fi(Description)-30 665 y Fh(architecture\(Archite)o(cture)o(\))7 b Fm(uni\014es)k Fh(Architecture)c Fm(with)j(the)h(name)f(of)f(the)i(mac)o(hine)f (executing)h(the)g(curren)o(t)-30 715 y(GNU)j(Prolog)f(pro)q(cess.)-30 814 y Fi(Errors)p -30 870 1890 2 v -30 920 2 50 v -3 905 a Fh(Architecture)e Fm(is)j(neither)h(a)f(v)n(ariable)e(nor)i(an)g (atom)p 915 920 V 71 w Fh(type)p 1032 905 14 2 v 15 w(error\(atom,)19 b(Architecture\))p 1859 920 2 50 v -30 921 1890 2 v -30 1071 2 150 v -3 956 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q (ccurs)g(and)f(the)g(v)n(alue)-3 1006 y(of)f(the)i Fh(os)p 163 1006 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1056 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1071 2 150 v 941 956 a Fh(system)p 1076 956 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1071 2 150 v -30 1072 1890 2 v -30 1155 a Fi(P)o(ortabilit)o(y)-30 1255 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1412 y Fi(7.27.18)48 b Fh(shell/2)p Fi(,)15 b Fh(shell/1)p Fi(,)g Fh(shell/0)-30 1539 y Fi(T)l(emplates)74 1622 y Fh(shell\(+atom,)20 b(?integer\))74 1672 y(shell\(+atom\))74 1722 y(shell)-30 1805 y Fi(Description)-30 1904 y Fh(shell\(Command,)f (Status\))i Fm(in)o(v)o(ok)o(es)h(a)g(new)h(shell)f(\(named)g(b)o(y)h (the)f Fh(SHELL)g Fm(en)o(vironmen)o(t)g(v)n(ariable\))f(passing)-30 1954 y Fh(Command)c Fm(for)h(execution)h(and)g(uni\014es)f Fh(Status)f Fm(with)h(the)h(result)g(of)f(the)h(execution.)32 b(If)21 b Fh(Command)c Fm(is)h(the)h(empt)o(y)-30 2004 y(atom)c Fh('')f Fm(a)h(new)h(in)o(teractiv)o(e)f(shell)g(is)g (executed.)24 b(The)16 b(con)o(trol)e(is)h(returned)i(to)e(Prolog)g(up) q(on)g(termination)f(of)h(the)-30 2054 y(called)f(pro)q(cess.)-30 2153 y Fh(shell\(Command\))d Fm(is)j(equiv)n(alen)o(t)f(to)h Fh(shell\(Command,)19 b(0\))p Fm(.)-30 2253 y Fh(shell)13 b Fm(is)h(equiv)n(alen)o(t)f(to)h Fh(shell\('',)20 b(0\))p Fm(.)-30 2353 y Fi(Errors)p -30 2408 V -30 2458 2 50 v -3 2443 a Fh(Command)12 b Fm(is)i(a)g(v)n(ariable)p 915 2458 V 558 w Fh(instantiation)p 1230 2443 14 2 v 13 w(error)p 1859 2458 2 50 v -30 2460 1890 2 v -30 2509 2 50 v -3 2495 a(Command)e Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i (an)g(atom)p 915 2509 V 180 w Fh(type)p 1032 2495 14 2 v 15 w(error\(atom,)19 b(Command\))p 1859 2509 2 50 v -30 2511 1890 2 v -30 2561 2 50 v -3 2546 a(Status)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(in)o(teger)p 915 2561 V 172 w Fh(type)p 1032 2546 14 2 v 15 w(error\(integer,)19 b(Status\))p 1859 2561 2 50 v -30 2563 1890 2 v -30 2645 a Fi(P)o(ortabilit)o(y)-30 2745 y Fm(GNU)14 b(Prolog)f(predicates.)p eop end %%Page: 152 154 TeXDict begin 152 153 bop -30 -45 a Fm(152)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(7.27.19)48 b Fh(system/2)p Fi(,)15 b Fh(system/1)-30 241 y Fi(T)l(emplates)74 316 y Fh(system\(+atom,)k (?integer\))74 366 y(system\(+atom\))-30 440 y Fi(Description)-30 540 y Fh(system\(Command,)g(Status\))10 b Fm(in)o(v)o(ok)o(es)h(a)h (new)g(default)f(shell)h(passing)g Fh(Command)e Fm(for)h(execution)i (and)e(uni\014es)h Fh(Status)-30 589 y Fm(with)h(the)g(result)h(of)e (the)i(execution.)k(The)13 b(con)o(trol)g(is)f(returned)j(to)e(Prolog)f (up)q(on)g(termination)h(of)f(the)h(shell)g(pro)q(cess.)-30 639 y(This)h(predicate)h(is)f(an)g(in)o(terface)g(to)g(the)g(C)g(Unix)g (function)f Fh(system\(3\))p Fm(.)-30 739 y Fh(system\(Command\))e Fm(is)j(equiv)n(alen)o(t)f(to)h Fh(system\(Command,)19 b(0\))p Fm(.)-30 838 y Fi(Errors)p -30 894 1890 2 v -30 944 2 50 v -3 929 a Fh(Command)12 b Fm(is)i(a)g(v)n(ariable)p 915 944 V 558 w Fh(instantiation)p 1230 929 14 2 v 13 w(error)p 1859 944 2 50 v -30 946 1890 2 v -30 995 2 50 v -3 980 a(Command)e Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i(an)g (atom)p 915 995 V 180 w Fh(type)p 1032 980 14 2 v 15 w(error\(atom,)19 b(Command\))p 1859 995 2 50 v -30 997 1890 2 v -30 1047 2 50 v -3 1032 a(Status)13 b Fm(is)g(neither)i(a)f(v) n(ariable)f(nor)g(an)h(in)o(teger)p 915 1047 V 172 w Fh(type)p 1032 1032 14 2 v 15 w(error\(integer,)19 b(Status\))p 1859 1047 2 50 v -30 1049 1890 2 v -30 1131 a Fi(P)o(ortabilit)o(y)-30 1231 y Fm(GNU)14 b(Prolog)f(predicates.)-30 1387 y Fi(7.27.20)48 b Fh(spawn/3)p Fi(,)15 b Fh(spawn/2)-30 1513 y Fi(T)l(emplates)74 1588 y Fh(spawn\(+atom,)20 b(+atom)p 471 1588 14 2 v 14 w(list,)h(?integer\))74 1637 y(spawn\(+atom,)f(+atom)p 471 1637 V 14 w(list\))-30 1712 y Fi(Description)-30 1812 y Fh(spawn\(Command,)f(Arguments,)h(Status\))8 b Fm(executes)k Fh(Command)c Fm(passing)h(as)h(argumen)o(ts)g(of)e(the)j (command-line)d(eac)o(h)-30 1861 y(elemen)o(t)k(of)f(the)h(list)f Fh(Arguments)f Fm(and)h(uni\014es)h Fh(Status)e Fm(with)h(the)h(result) g(of)f(the)h(execution.)18 b(The)12 b(con)o(trol)f(is)g(returned)-30 1911 y(to)j(Prolog)f(up)q(on)h(termination)f(of)h(the)g(command.)-30 2011 y Fh(spawn\(Command,)19 b(Arguments\))12 b Fm(is)i(equiv)n(alen)o (t)f(to)h Fh(spawn\(Command,)19 b(Arguments,)g(0\))p Fm(.)-30 2110 y Fi(Errors)p -30 2166 1890 2 v -30 2216 2 50 v -3 2201 a Fh(Command)12 b Fm(is)i(a)g(v)n(ariable)p 915 2216 V 558 w Fh(instantiation)p 1230 2201 14 2 v 13 w(error)p 1859 2216 2 50 v -30 2218 1890 2 v -30 2267 2 50 v -3 2252 a(Command)e Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i (an)g(atom)p 915 2267 V 180 w Fh(type)p 1032 2252 14 2 v 15 w(error\(atom,)19 b(Command\))p 1859 2267 2 50 v -30 2269 1890 2 v -30 2369 2 100 v -3 2304 a(Arguments)12 b Fm(is)i(a)f(partial)g(list)h(or)f(a)h(list)f(with)h(an)-3 2354 y(elemen)o(t)g(whic)o(h)g(is)g(a)g(v)n(ariable)p 915 2369 V 941 2304 a Fh(instantiation)p 1230 2304 14 2 v 13 w(error)p 1859 2369 2 100 v -30 2370 1890 2 v -30 2420 2 50 v -3 2405 a(Arguments)e Fm(is)i(neither)h(a)e(partial)g (list)g(nor)h(a)g(list)p 915 2420 V 149 w Fh(type)p 1032 2405 14 2 v 15 w(error\(list,)19 b(Arguments\))p 1859 2420 2 50 v -30 2422 1890 2 v -30 2521 2 100 v -3 2457 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Arguments)e Fm(list)i(is)g(neither)g(a)-3 2506 y(v)n(ariable)f(nor)h(an)f(atom)p 915 2521 V 941 2457 a Fh(type)p 1032 2457 14 2 v 15 w(error\(atom,)19 b(E\))p 1859 2521 2 100 v -30 2523 1890 2 v -30 2573 2 50 v -3 2558 a(Status)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g (an)h(in)o(teger)p 915 2573 V 172 w Fh(type)p 1032 2558 14 2 v 15 w(error\(integer,)19 b(Status\))p 1859 2573 2 50 v -30 2575 1890 2 v -30 2724 2 150 v -3 2609 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs)g(and)f(the)g(v)n(alue)-3 2659 y(of)f(the)i Fh(os)p 163 2659 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 2709 y Fm(\(section)h(7.22.1,)c (page)j(133\))p 915 2724 2 150 v 941 2609 a Fh(system)p 1076 2609 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 2724 2 150 v -30 2726 1890 2 v -30 2808 a Fi(P)o(ortabilit)o(y)-30 2908 y Fm(GNU)14 b(Prolog)f(predicates.)p eop end %%Page: 153 155 TeXDict begin 153 154 bop -30 -45 a Fm(7.27)41 b(Op)q(erating)14 b(system)h(in)o(terface)1223 b(153)p -30 -27 1890 4 v -30 115 a Fi(7.27.21)48 b Fh(popen/3)-30 241 y Fi(T)l(emplates)74 324 y Fh(popen\(+atom,)20 b(+io)p 427 324 14 2 v 15 w(mode,)g (-stream\))-30 407 y Fi(Description)-30 507 y Fh(popen\(Command,)f (Mode,)i(Stream\))15 b Fm(in)o(v)o(ok)o(es)h(a)g(new)h(default)f(shell) g(\(b)o(y)g(creating)h(a)f(pip)q(e\))h(passing)g Fh(Command)e Fm(for)-30 557 y(execution)k(and)e(asso)q(ciates)h(a)f(stream)h(either) g(to)g(the)f(standard)h(input)f(or)h(the)g(standard)f(output)h(of)f (the)h(created)-30 607 y(pro)q(cess.)24 b(if)18 b Fh(Mode)c Fm(is)h Fh(read)g Fm(\(resp.)23 b Fh(write)p Fm(\))14 b(an)h(input)g(\(resp.)24 b(output\))15 b(stream)h(is)f(created)i(and)e Fh(Stream)f Fm(is)h(uni\014ed)-30 656 y(with)h(the)h(stream-term)g (asso)q(ciated.)26 b(W)m(riting)15 b(to)h(the)h(stream)g(writes)g(to)f (the)h(standard)f(input)g(of)g(the)h(command)-30 706 y(while)d(reading)g(from)g(the)h(stream)g(reads)g(the)g(command's)e (standard)i(output.)k(The)c(stream)f(m)o(ust)h(b)q(e)g(closed)f(using) -30 756 y Fh(close/2)f Fm(\(section)i(7.10.7,)c(page)j(72\).)k(This)13 b(predicate)i(is)f(an)g(in)o(terface)g(to)g(the)g(C)g(Unix)g(function)f Fh(popen\(3\))p Fm(.)-30 856 y Fi(Errors)p -30 911 1890 2 v -30 961 2 50 v -3 946 a Fh(Command)f Fm(is)i(a)g(v)n(ariable)p 915 961 V 558 w Fh(instantiation)p 1230 946 14 2 v 13 w(error)p 1859 961 2 50 v -30 963 1890 2 v -30 1013 2 50 v -3 998 a(Command)e Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i(an)g (atom)p 915 1013 V 180 w Fh(type)p 1032 998 14 2 v 15 w(error\(atom,)19 b(Command\))p 1859 1013 2 50 v -30 1014 1890 2 v -30 1064 2 50 v -3 1049 a(Mode)13 b Fm(is)h(a)f(v)n (ariable)p 915 1064 V 624 w Fh(instantiation)p 1230 1049 14 2 v 13 w(error)p 1859 1064 2 50 v -30 1066 1890 2 v -30 1116 2 50 v -3 1101 a(Mode)g Fm(is)h(neither)h(a)e(v)n(ariable)g (nor)h(an)g(atom)p 915 1116 V 245 w Fh(type)p 1032 1101 14 2 v 15 w(error\(atom,)19 b(Mode\))p 1859 1116 2 50 v -30 1117 1890 2 v -30 1167 2 50 v -3 1152 a(Mode)13 b Fm(is)h(an)f(atom)h(but)g(neither)g Fh(read)f Fm(nor)h Fh(write)p Fm(.)p 915 1167 V 124 w Fh(domain)p 1076 1152 14 2 v 15 w(error\(io)p 1267 1152 V 14 w(mode,)20 b(Mode\))p 1859 1167 2 50 v -30 1169 1890 2 v -30 1219 2 50 v -3 1204 a(Stream)13 b Fm(is)g(not)h(a)g(v)n(ariable)p 915 1219 V 506 w Fh(type)p 1032 1204 14 2 v 15 w(error\(variable,)19 b(Stream\))p 1859 1219 2 50 v -30 1220 1890 2 v -30 1370 2 150 v -3 1255 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs) g(and)f(the)g(v)n(alue)-3 1305 y(of)f(the)i Fh(os)p 163 1305 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1355 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1370 2 150 v 941 1255 a Fh(system)p 1076 1255 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1370 2 150 v -30 1371 1890 2 v -30 1454 a Fi(P)o(ortabilit)o(y)-30 1554 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1711 y Fi(7.27.22)48 b Fh(exec/5)p Fi(,)15 b Fh(exec/4)-30 1838 y Fi(T)l(emplates)74 1921 y Fh(exec\(+atom,)20 b(-stream,)g(-stream,)g(-stream,)g (-integer\))74 1971 y(exec\(+atom,)g(-stream,)g(-stream,)g(-stream\)) -30 2054 y Fi(Description)-30 2153 y Fh(exec\(Command,)g(StreamIn,)g (StreamOut,)f(StreamErr,)h(Pid\))11 b Fm(in)o(v)o(ok)o(es)h(a)g(new)h (default)f(shell)g(passing)h Fh(Command)-30 2203 y Fm(for)18 b(execution)g(and)g(asso)q(ciates)h(streams)g(to)e(standard)h(streams)h (of)e(the)i(created)g(pro)q(cess.)31 b Fh(StreamIn)16 b Fm(is)i(uni\014ed)-30 2253 y(with)f(the)g(stream-term)h(asso)q (ciated)f(with)g(the)g(standard)h(input)e(stream)i(of)h Fh(Command)c Fm(\(it)i(is)f(an)h(output)g(stream\).)-30 2303 y Fh(StreamOut)e Fm(is)g(uni\014ed)i(with)e(the)i(stream-term)g (asso)q(ciated)g(with)e(the)i(standard)f(output)h(stream)f(of)j Fh(Command)14 b Fm(\(it)-30 2353 y(is)20 b(an)g(input)g(stream\).)36 b Fh(StreamErr)18 b Fm(is)i(uni\014ed)g(with)g(the)g(stream-term)h (asso)q(ciated)g(with)e(the)i(standard)f(error)-30 2402 y(stream)15 b(of)j Fh(Command)13 b Fm(\(it)h(is)g(an)g(input)h (stream\).)20 b Fh(Pid)14 b Fm(is)g(uni\014ed)h(with)f(the)h(pro)q (cess)h(iden)o(ti\014er)f(of)f(the)h(new)g(pro)q(cess.)-30 2452 y(This)20 b(information)d(is)j(only)e(useful)i(if)e(it)i(is)f (necessary)i(to)f(obtain)e(the)i(status)h(of)d(the)j(execution)f(using) f Fh(wait/2)-30 2502 y Fm(\(section)e(7.27.25,)c(page)i(155\).)22 b(Un)o(til)15 b(a)g(call)g(to)g Fh(wait/2)f Fm(is)i(done)f(the)i(pro)q (cess)g(remains)e(in)g(the)h(system)h(pro)q(cesses)-30 2552 y(table)e(\(as)g(a)g(zom)o(bie)g(pro)q(cess)h(if)e(terminated\).) 22 b(F)m(or)15 b(this)g(reason,)g(if)f(the)h(status)h(is)f(not)g (needed)h(it)f(is)g(preferable)g(to)-30 2602 y(use)g Fh(exec/4)p Fm(.)-30 2701 y Fh(exec/4)c Fm(is)h(similar)f(to)g Fh(exec/5)g Fm(but)h(the)h(pro)q(cess)h(is)e(remo)o(v)o(ed)g(from)f (system)i(pro)q(cesses)i(as)d(so)q(on)g(as)g(it)f(is)h(terminated.)-30 2801 y Fi(Errors)p eop end %%Page: 154 156 TeXDict begin 154 155 bop -30 -45 a Fm(154)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(Command)e Fm(is)i(a)g(v)n(ariable)p 915 125 V 558 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(Command)e Fm(is)i(neither)h(a)f(v)n (ariable)e(nor)i(an)g(atom)p 915 176 V 180 w Fh(type)p 1032 161 14 2 v 15 w(error\(atom,)19 b(Command\))p 1859 176 2 50 v -30 178 1890 2 v -30 228 2 50 v -3 213 a(StreamIn)12 b Fm(is)i(not)g(a)f(v)n(ariable)p 915 228 V 463 w Fh(type)p 1032 213 14 2 v 15 w(error\(variable,)19 b(StreamIn\))p 1859 228 2 50 v -30 229 1890 2 v -30 279 2 50 v -3 264 a(StreamOut)12 b Fm(is)i(not)g(a)f(v)n(ariable)p 915 279 V 441 w Fh(type)p 1032 264 14 2 v 15 w(error\(variable,)19 b(StreamOut\))p 1859 279 2 50 v -30 281 1890 2 v -30 331 2 50 v -3 316 a(StreamErr)12 b Fm(is)i(not)g(a)f(v)n(ariable)p 915 331 V 441 w Fh(type)p 1032 316 14 2 v 15 w(error\(variable,)19 b(StreamErr\))p 1859 331 2 50 v -30 332 1890 2 v -30 382 2 50 v -3 367 a(Pid)13 b Fm(is)h(not)g(a)f(v)n(ariable)p 915 382 V 572 w Fh(type)p 1032 367 14 2 v 15 w(error\(variable,)19 b(Pid\))p 1859 382 2 50 v -30 384 1890 2 v -30 533 2 150 v -3 419 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs)g (and)f(the)g(v)n(alue)-3 469 y(of)f(the)i Fh(os)p 163 469 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 518 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 533 2 150 v 941 419 a Fh(system)p 1076 419 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 533 2 150 v -30 535 1890 2 v -30 618 a Fi(P)o(ortabilit)o(y)-30 717 y Fm(GNU)14 b(Prolog)f(predicates.)-30 875 y Fi(7.27.23)48 b Fh(fork)p 255 875 14 2 v 15 w(prolog/1)-30 1002 y Fi(T)l(emplates)74 1085 y Fh(fork)p 165 1085 V 15 w(prolog\(-integer\))-30 1168 y Fi(Description)-30 1267 y Fh(fork)p 61 1267 V 15 w(prolog\(Pid\))15 b Fm(creates)k(a)d(c)o(hild)h(pro)q(cess)i(that)e (di\013ers)g(from)g(the)g(paren)o(t)h(pro)q(cess)h(only)d(in)g(its)h (PID.)g(In)g(the)-30 1317 y(paren)o(t)i(pro)q(cess)g Fh(Pid)e Fm(is)h(uni\014ed)g(with)f(the)h(PID)g(of)f(the)h(c)o(hild)g (while)f(in)g(the)h(c)o(hild)f(pro)q(cess)j Fh(Pid)d Fm(is)h(uni\014ed)g(with)-30 1367 y(0.)k(In)15 b(the)g(paren)o(t)h(pro) q(cess,)h(the)e(status)h(of)e(the)i(c)o(hild)f(pro)q(cess)h(can)g(b)q (e)f(on)o(tained)g(using)g Fh(wait/2)f Fm(\(section)i(7.27.25,)-30 1417 y(page)g(155\).)22 b(Un)o(til)14 b(a)h(call)g(to)g Fh(wait/2)f Fm(is)h(done)h(the)g(c)o(hild)f(pro)q(cess)i(remains)f(in)e (the)i(system)h(pro)q(cesses)h(table)d(\(as)g(a)-30 1466 y(zom)o(bie)f(pro)q(cess)i(if)d(terminated\).)18 b(This)c(predicate)h (is)f(an)g(in)o(terface)g(to)g(the)g(C)g(Unix)f(function)h Fh(fork\(2\))p Fm(.)-30 1566 y Fi(Errors)p -30 1622 1890 2 v -30 1672 2 50 v -3 1657 a Fh(Pid)f Fm(is)h(not)g(a)f(v)n(ariable)p 915 1672 V 572 w Fh(type)p 1032 1657 14 2 v 15 w(error\(variable,)19 b(Pid\))p 1859 1672 2 50 v -30 1673 1890 2 v -30 1823 2 150 v -3 1708 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs) g(and)f(the)g(v)n(alue)-3 1758 y(of)f(the)i Fh(os)p 163 1758 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1808 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1823 2 150 v 941 1708 a Fh(system)p 1076 1708 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1823 2 150 v -30 1824 1890 2 v -30 1907 a Fi(P)o(ortabilit)o(y)-30 2007 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2164 y Fi(7.27.24)48 b Fh(create)p 299 2164 14 2 v 15 w(pipe/2)-30 2291 y Fi(T)l(emplates)74 2374 y Fh(create)p 209 2374 V 15 w(pipe\(-stream,)19 b(-stream\))-30 2457 y Fi(Description)-30 2557 y Fh(create)p 105 2557 V 15 w(pipe\(StreamIn,)g(StreamOut\))c Fm(creates)j(a)f(pair)f (of)g(streams)i(p)q(oin)o(ting)e(to)h(a)f(pip)q(e)h(ino)q(de.)27 b Fh(StreamIn)15 b Fm(is)-30 2606 y(uni\014ed)d(with)g(the)g (stream-term)h(asso)q(ciated)f(with)g(the)g(input)g(side)g(of)f(the)h (pip)q(e)g(and)g Fh(StreamOut)e Fm(is)h(uni\014ed)h(with)g(the)-30 2656 y(stream-term)i(asso)q(ciated)g(with)f(output)h(side.)k(This)13 b(predicate)h(is)f(an)g(in)o(terface)h(to)f(the)g(C)h(Unix)e(function)h Fh(pipe\(2\))p Fm(.)-30 2756 y Fi(Errors)p eop end %%Page: 155 157 TeXDict begin 155 156 bop -30 -45 a Fm(7.27)41 b(Op)q(erating)14 b(system)h(in)o(terface)1223 b(155)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(StreamIn)12 b Fm(is)i(not)g(a)f(v)n(ariable)p 915 125 V 463 w Fh(type)p 1032 110 14 2 v 15 w(error\(variable,)19 b(StreamIn\))p 1859 125 2 50 v -30 127 1890 2 v -30 176 2 50 v -3 161 a(StreamOut)12 b Fm(is)i(not)g(a)f(v)n(ariable)p 915 176 V 441 w Fh(type)p 1032 161 14 2 v 15 w(error\(variable,)19 b(StreamOut\))p 1859 176 2 50 v -30 178 1890 2 v -30 327 2 150 v -3 213 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q (ccurs)g(and)f(the)g(v)n(alue)-3 263 y(of)f(the)i Fh(os)p 163 263 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 312 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 327 2 150 v 941 213 a Fh(system)p 1076 213 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 327 2 150 v -30 329 1890 2 v -30 412 a Fi(P)o(ortabilit)o(y)-30 512 y Fm(GNU)14 b(Prolog)f(predicate.)-30 669 y Fi(7.27.25)48 b Fh(wait/2)-30 796 y Fi(T)l(emplates)74 879 y Fh(wait\(+integer,)19 b(?integer\))-30 962 y Fi(Description)-30 1061 y Fh(wait\(Pid,)h(Status\))e Fm(w)o(aits)g(for)g(the)i(c)o(hild)e (pro)q(cess)i(whose)g(iden)o(ti\014er)f(is)f Fh(Pid)g Fm(to)h(terminate.)33 b Fh(Status)17 b Fm(is)i(then)-30 1111 y(uni\014ed)c(with)e(the)i(exit)e(status.)19 b(This)14 b(predicate)h(is)f(an)f(in)o(terface)i(to)f(the)g(C)g(Unix)f(function)h Fh(waitpid\(2\))p Fm(.)-30 1211 y Fi(Errors)p -30 1266 V -30 1316 2 50 v -3 1301 a Fh(Pid)f Fm(is)h(a)g(v)n(ariable)p 915 1316 V 645 w Fh(instantiation)p 1230 1301 14 2 v 13 w(error)p 1859 1316 2 50 v -30 1318 1890 2 v -30 1368 2 50 v -3 1353 a(Pid)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g (in)o(teger)p 915 1368 V 237 w Fh(type)p 1032 1353 14 2 v 15 w(error\(integer,)19 b(Pid\))p 1859 1368 2 50 v -30 1369 1890 2 v -30 1419 2 50 v -3 1404 a(Status)13 b Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(in)o(teger)p 915 1419 V 172 w Fh(type)p 1032 1404 14 2 v 15 w(error\(integer,)19 b(Status\))p 1859 1419 2 50 v -30 1421 1890 2 v -30 1570 2 150 v -3 1456 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs) g(and)f(the)g(v)n(alue)-3 1505 y(of)f(the)i Fh(os)p 163 1505 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1555 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1570 2 150 v 941 1456 a Fh(system)p 1076 1456 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1570 2 150 v -30 1572 1890 2 v -30 1655 a Fi(P)o(ortabilit)o(y)-30 1754 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1912 y Fi(7.27.26)48 b Fh(prolog)p 299 1912 14 2 v 15 w(pid/1)-30 2038 y Fi(T)l(emplates)74 2122 y Fh(prolog)p 209 2122 V 15 w(pid\(?integer\))-30 2205 y Fi(Description)-30 2304 y Fh(prolog)p 105 2304 V 15 w(pid\(Pid\))12 b Fm(uni\014es)i Fh(Pid)g Fm(with)f(the)i(pro)q (cess)g(iden)o(ti\014er)g(of)e(the)h(curren)o(t)i(GNU)d(Prolog)h(pro)q (cess.)-30 2404 y Fi(Errors)p -30 2468 1890 2 v -30 2518 2 50 v -3 2503 a Fh(Pid)f Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an) g(in)o(teger)p 915 2518 V 237 w Fh(type)p 1032 2503 14 2 v 15 w(error\(integer,)19 b(Pid\))p 1859 2518 2 50 v -30 2520 1890 2 v -30 2603 a Fi(P)o(ortabilit)o(y)-30 2703 y Fm(GNU)14 b(Prolog)f(predicate.)p eop end %%Page: 156 158 TeXDict begin 156 157 bop -30 -45 a Fm(156)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(7.27.27)48 b Fh(send)p 255 115 14 2 v 15 w(signal/2)-30 241 y Fi(T)l(emplates)74 324 y Fh(send)p 165 324 V 15 w(signal\(+integer,)19 b(+integer\))74 374 y(send)p 165 374 V 15 w(signal\(+integer,)g(+atom\))-30 457 y Fi(Description)-30 557 y Fh(send)p 61 557 V 15 w(signal\(Pid,)h(Signal\))9 b Fm(sends)j Fh(Signal)e Fm(to)g(the)i(pro)q(cess)g(whose)g(iden)o(ti\014er)f(is)f Fh(Pid.)17 b(Signal)9 b Fm(can)i(b)q(e)h(sp)q(eci\014ed)-30 607 y(directly)h(as)f(an)g(in)o(teger)h(or)f(sym)o(b)q(olically)e(as)i (an)g(atom.)k(Allo)o(w)o(ed)c(atoms)f(dep)q(end)j(on)e(the)g(mac)o (hine)g(\(e.g.)17 b Fh('SIGINT')p Fm(,)-30 656 y Fh('SIGQUIT')p Fm(,)12 b Fh('SIGKILL')p Fm(,)f Fh('SIGUSR1')p Fm(,)h Fh('SIGUSR2')p Fm(,)f Fh('SIGALRM')p Fm(,.)5 b(.)h(.)g(\).)19 b(This)13 b(predicate)i(is)f(an)g(in)o(terface)g(to)g(the)g(C)-30 706 y(Unix)g(function)g Fh(kill\(2\))p Fm(.)-30 806 y Fi(Errors)p -30 862 1890 2 v -30 911 2 50 v -3 896 a Fh(Pid)f Fm(is)h(a)g(v)n(ariable)p 915 911 V 645 w Fh(instantiation)p 1230 896 14 2 v 13 w(error)p 1859 911 2 50 v -30 913 1890 2 v -30 963 2 50 v -3 948 a(Pid)f Fm(is)h(neither)h(a)e(v)n (ariable)g(nor)h(an)g(in)o(teger)p 915 963 V 237 w Fh(type)p 1032 948 14 2 v 15 w(error\(integer,)19 b(Pid\))p 1859 963 2 50 v -30 964 1890 2 v -30 1014 2 50 v -3 999 a(Signal)13 b Fm(is)g(a)h(v)n(ariable)p 915 1014 V 580 w Fh(instantiation)p 1230 999 14 2 v 13 w(error)p 1859 1014 2 50 v -30 1016 1890 2 v -30 1116 2 100 v -3 1051 a(Signal)f Fm(is)g(neither)i(a)f(v)n (ariable)f(nor)g(an)h(in)o(teger)g(or)g(an)-3 1101 y(atom)p 915 1116 V 941 1051 a Fh(type)p 1032 1051 14 2 v 15 w(error\(integer,) 19 b(Signal\))p 1859 1116 2 100 v -30 1117 1890 2 v -30 1267 2 150 v -3 1152 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q (ccurs)g(and)f(the)g(v)n(alue)-3 1202 y(of)f(the)i Fh(os)p 163 1202 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1252 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1267 2 150 v 941 1152 a Fh(system)p 1076 1152 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1267 2 150 v -30 1268 1890 2 v -30 1351 a Fi(P)o(ortabilit)o(y)-30 1451 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1608 y Fi(7.27.28)48 b Fh(sleep/1)-30 1735 y Fi(T)l(emplates)74 1818 y Fh(sleep\(+number\))-30 1901 y Fi(Description)-30 2001 y Fh(sleep\(Seconds\))11 b Fm(puts)k(the)f(GNU)f(Prolog)g(pro)q (cess)j(to)e(sleep)g(for)f Fh(Second)p Fm(s)g(seconds.)20 b Fh(Seconds)12 b Fm(can)i(b)q(e)g(an)g(in)o(teger)-30 2050 y(or)i(a)f(\015oating)g(p)q(oin)o(t)g(n)o(um)o(b)q(er)h(\(in)f (whic)o(h)h(case)h(it)e(can)h(b)q(e)g Fb(<)g Fm(1\).)23 b(This)15 b(predicate)i(is)f(an)f(in)o(terface)h(to)g(the)g(C)g(Unix) -30 2100 y(function)e Fh(usleep\(3\))p Fm(.)-30 2200 y Fi(Errors)p -30 2255 V -30 2305 2 50 v -3 2290 a Fh(Seconds)e Fm(is)i(a)g(v)n(ariable)p 915 2305 V 558 w Fh(instantiation)p 1230 2290 14 2 v 13 w(error)p 1859 2305 2 50 v -30 2307 1890 2 v -30 2357 2 50 v -3 2342 a(Seconds)e Fm(is)i(neither)h(a)f(v)n (ariable)e(nor)i(a)g(n)o(um)o(b)q(er)p 915 2357 V 159 w Fh(type)p 1032 2342 14 2 v 15 w(error\(number,)19 b(Seconds\))p 1859 2357 2 50 v -30 2358 1890 2 v -30 2408 2 50 v -3 2393 a(Seconds)12 b Fm(is)i(a)g(n)o(um)o(b)q(er)g Fb(<)g Fm(0)p 915 2408 V 483 w Fh(domain)p 1076 2393 14 2 v 15 w(error\(not)p 1289 2393 V 13 w(less)p 1390 2393 V 15 w(than)p 1493 2393 V 15 w(zero,)21 b(Seconds\))p 1859 2408 2 50 v -30 2410 1890 2 v -30 2493 a Fi(P)o(ortabilit)o(y)-30 2592 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2750 y Fi(7.27.29)48 b Fh(select/5)-30 2876 y Fi(T)l(emplates)p eop end %%Page: 157 159 TeXDict begin 157 158 bop -30 -45 a Fm(7.28)41 b(So)q(c)o(k)o(ets)15 b(input/output)1324 b(157)p -30 -27 1890 4 v 74 115 a Fh(select\(+list,)19 b(?list,)i(+list,)f(?list,)h(+number\))-30 198 y Fi(Description)-30 298 y Fh(select\(Reads,)f(ReadyReads,)f (Writes,)h(ReadyWrites,)g(TimeOut\))12 b Fm(w)o(aits)i(for)f(a)h(n)o (um)o(b)q(er)g(of)f(streams)i(\(or)f(\014le)-30 347 y(descriptors\))23 b(to)e(c)o(hange)g(status.)39 b Fh(ReadyReads)18 b Fm(is)j(uni\014ed)g (with)f(the)i(list)e(of)g(elemen)o(ts)i(listed)e(in)h Fh(Reads)e Fm(that)-30 397 y(ha)o(v)o(e)i(c)o(haracters)h(a)o(v)n (ailable)c(for)i(reading.)37 b(Similarly)19 b Fh(ReadyWrites)f Fm(is)i(uni\014ed)h(with)f(the)h(list)f(of)g(elemen)o(ts)h(of)-30 447 y Fh(Writes)15 b Fm(that)g(are)h(ok)f(for)g(immediate)f(writing.)22 b(The)15 b(elemen)o(ts)i(of)h Fh(Reads)c Fm(and)h Fh(Writes)f Fm(are)i(either)g(stream-terms)-30 497 y(or)d(aliases)f(or)h(in)o (tegers)g(considered)h(as)f(\014le)f(descriptors,)j(e.g.)i(for)12 b(so)q(c)o(k)o(ets)i(\(section)f(7.28,)e(page)i(157\).)k(Streams)c (that)-30 547 y(m)o(ust)k(b)q(e)f(tested)i(with)e Fh(select/5)e Fm(should)i(not)g(b)q(e)h(bu\013ered.)26 b(This)16 b(can)g(b)q(e)h (done)f(at)g(the)h(op)q(ening)f(using)g Fh(open/4)-30 596 y Fm(\(section)g(7.10.6,)c(page)j(70\))f(or)h(later)f(using)h Fh(set)p 756 596 14 2 v 15 w(stream)p 903 596 V 15 w(buffering/2)d Fm(\(section)k(7.10.27,)c(page)i(82\).)20 b Fh(TimeOut)13 b Fm(is)-30 646 y(an)j(upp)q(er)h(b)q(ound)f(on)g(the)h(amoun)o(t)e(of) g(time)h(\(in)g(milliseconds\))f(elapsed)i(b)q(efore)g Fh(select/5)d Fm(returns.)26 b(If)19 b Fh(TimeOut)-30 696 y Fg(\024)14 b Fm(0)g(\(no)f(timeout\))h Fh(select/5)e Fm(w)o(aits)h(un)o(til)g(something)g(is)g(a)o(v)n(ailable)f(\(either)i (or)g(reading)f(or)h(for)f(writing\))g(and)h(th)o(us)-30 746 y(can)h(blo)q(c)o(k)e(inde\014nitely)m(.)k(This)d(predicate)h(is)f (an)g(in)o(terface)g(to)g(the)g(C)g(Unix)g(function)f Fh(select\(2\))p Fm(.)-30 845 y Fi(Errors)p -30 901 1890 2 v -30 1001 2 100 v -3 936 a Fh(Reads)g Fm(\(or)h Fh(Writes)p Fm(\))f(is)g(a)h(partial)f(list)g(or)h(a)g(list)f(with)-3 986 y(an)h(elemen)o(t)g Fh(E)g Fm(whic)o(h)f(is)h(a)g(v)n(ariable)p 915 1001 V 941 936 a Fh(instantiation)p 1230 936 14 2 v 13 w(error)p 1859 1001 2 100 v -30 1002 1890 2 v -30 1052 2 50 v -3 1037 a(Reads)f Fm(is)h(neither)g(a)g(partial)f(list)g (nor)h(a)g(list)p 915 1052 V 236 w Fh(type)p 1032 1037 14 2 v 15 w(error\(list,)19 b(Reads\))p 1859 1052 2 50 v -30 1054 1890 2 v -30 1104 2 50 v -3 1089 a(Writes)13 b Fm(is)g(neither)i(a)f(partial)f(list)g(nor)h(a)g(list)p 915 1104 V 214 w Fh(type)p 1032 1089 14 2 v 15 w(error\(list,)19 b(Writes\))p 1859 1104 2 50 v -30 1105 1890 2 v -30 1155 2 50 v -3 1140 a(ReadyReads)12 b Fm(is)i(neither)g(a)g(partial)f(list)g (nor)h(a)g(list)p 915 1155 V 127 w Fh(type)p 1032 1140 14 2 v 15 w(error\(list,)19 b(ReadyReads\))p 1859 1155 2 50 v -30 1157 1890 2 v -30 1207 2 50 v -3 1192 a(ReadyWrites)12 b Fm(is)h(neither)i(a)f(partial)f(list)g(nor)h(a)g(list)p 915 1207 V 105 w Fh(type)p 1032 1192 14 2 v 15 w(error\(list,)19 b(ReadyWrites\))p 1859 1207 2 50 v -30 1208 1890 2 v -30 1308 2 100 v -3 1243 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Reads)f Fm(\(or)h Fh(Writes)p Fm(\))f(list)g(is)-3 1293 y(neither)i(a)e(stream-term)i(or)f(alias)f(nor)h(an)f(in)o(teger)p 915 1308 V 941 1243 a Fh(domain)p 1076 1243 14 2 v 15 w(error\(stream)p 1355 1243 V 13 w(or)p 1412 1243 V 15 w(alias,)21 b(E\))p 1859 1308 2 100 v -30 1310 1890 2 v -30 1409 2 100 v -3 1344 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Reads)f Fm(\(or)h Fh(Writes)p Fm(\))f(list)g(is)h(not)-3 1394 y(a)g(selectable)h(item)p 915 1409 V 941 1344 a Fh(domain)p 1076 1344 14 2 v 15 w(error\(selectabl)o(e)p 1442 1344 V 13 w(item,)21 b(E\))p 1859 1409 2 100 v -30 1411 1890 2 v -30 1510 2 100 v -3 1446 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Reads)f Fm(\(or)h Fh(Writes)p Fm(\))f(list)g(is)h(an)-3 1496 y(in)o(teger)g Fb(<)g Fm(0)p 915 1510 V 941 1446 a Fh(domain)p 1076 1446 14 2 v 15 w(error\(not)p 1289 1446 V 13 w(less)p 1390 1446 V 15 w(than)p 1493 1446 V 15 w(zero,)21 b(E\))p 1859 1510 2 100 v -30 1512 1890 2 v -30 1662 2 150 v -3 1547 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Reads)f Fm(\(or)h Fh(Writes)p Fm(\))f(list)g(is)h(a)-3 1597 y(stream-tern)h(or)f(alias)f(not)h(asso)q (ciated)g(with)g(an)f(op)q(en)-3 1647 y(stream)p 915 1662 V 941 1547 a Fh(existence)p 1142 1547 14 2 v 14 w(error\(stream,)19 b(E\))p 1859 1662 2 150 v -30 1663 1890 2 v -30 1763 2 100 v -3 1698 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Reads)f Fm(list)h(is)f(asso)q(ciated)i(with)-3 1748 y(an)f(output)g(stream)p 915 1763 V 941 1698 a Fh(permission)p 1164 1698 14 2 v 14 w(error\(input,)19 b(stream,)h(E\))p 1859 1763 2 100 v -30 1765 1890 2 v -30 1864 2 100 v -3 1799 a Fm(an)13 b(elemen)o(t)h Fh(E)e Fm(of)h(the)h Fh(Writes)d Fm(list)i(is)g(asso)q(ciated)h(with)-3 1849 y(an)g(input)f(stream)p 915 1864 V 941 1799 a Fh(permission)p 1164 1799 14 2 v 14 w(error\(output,)19 b(stream,)h(E\))p 1859 1864 2 100 v -30 1866 1890 2 v -30 1916 2 50 v -3 1901 a(TimeOut)12 b Fm(is)i(a)g(v)n(ariable)p 915 1916 V 558 w Fh(instantiation)p 1230 1901 14 2 v 13 w(error)p 1859 1916 2 50 v -30 1917 1890 2 v -30 1967 2 50 v -3 1952 a(TimeOut)e Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i(a)g(n)o(um)o (b)q(er)p 915 1967 V 159 w Fh(type)p 1032 1952 14 2 v 15 w(error\(number,)19 b(TimeOut\))p 1859 1967 2 50 v -30 1969 1890 2 v -30 2118 2 150 v -3 2004 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs)g(and)f(the)g(v)n(alue)-3 2053 y(of)f(the)i Fh(os)p 163 2053 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 2103 y Fm(\(section)h(7.22.1,)c (page)j(133\))p 915 2118 2 150 v 941 2004 a Fh(system)p 1076 2004 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 2118 2 150 v -30 2120 1890 2 v -30 2203 a Fi(P)o(ortabilit)o(y)-30 2302 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2468 y Ff(7.28)56 b(So)r(c)n(k)n(ets)18 b(input/output)-30 2595 y Fi(7.28.1)48 b(In)o(tro)q(duction)-30 2721 y Fm(This)12 b(set)g(of)e(predicates)j(pro)o(vides)f(a)e(w)o(a)o(y)h(to)g (manipulate)f(so)q(c)o(k)o(ets.)19 b(The)11 b(predicates)i(are)f (straigh)o(tforw)o(ard)e(in)o(terfaces)-30 2771 y(to)g(the)g(corresp)q (onding)g(BSD-t)o(yp)q(e)g(so)q(c)o(k)o(et)g(functions.)16 b(This)10 b(facilit)o(y)d(is)j(a)o(v)n(ailable)d(if)h(the)i(so)q(c)o(k) o(ets)h(part)e(of)g(GNU)g(Prolog)-30 2821 y(has)17 b(b)q(een)g (installed.)23 b(A)16 b(reader)h(familiar)d(with)h(BSD)h(so)q(c)o(k)o (ets)h(will)e(understand)i(them)f(immediately)f(otherwise)h(a)-30 2871 y(study)f(of)e(so)q(c)o(k)o(ets)i(is)f(needed.)p eop end %%Page: 158 160 TeXDict begin 158 159 bop -30 -45 a Fm(158)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a(The)f(domain)e(is)i(either)g(the)g(atom)f Fh('AF)p 601 115 14 2 v 15 w(INET')f Fm(or)i Fh('AF)p 853 115 V 15 w(UNIX')e Fm(corresp)q(onding)i(to)g(the)g(same)f(domains) g(in)g(BSD-t)o(yp)q(e)-30 165 y(so)q(c)o(k)o(ets.)-30 264 y(An)i(address)h(is)e(either)i(of)e(the)h(form)e Fh('AF)p 629 264 V 16 w(INET'\(HostName,)18 b(Port\))13 b Fm(or)g Fh('AF)p 1232 264 V 15 w(UNIX'\(SocketName\))p Fm(.)i Fh(HostName)c Fm(is)-30 314 y(an)h(atom)g(denoting)g(a)g(mac)o (hine)g(name,)g Fh(Port)f Fm(is)h(a)g(p)q(ort)h(n)o(um)o(b)q(er)f(and)g Fh(SocketName)e Fm(is)i(an)g(atom)g(denoting)g(a)g(so)q(c)o(k)o(et.)-30 414 y(By)h(default,)f(streams)i(asso)q(ciated)f(with)f(so)q(c)o(k)o (ets)i(are)f Fh(block)e Fm(bu\013ered.)19 b(The)13 b(predicate)h Fh(set)p 1462 414 V 15 w(stream)p 1609 414 V 15 w(buffering/2)-30 464 y Fm(\(section)i(7.10.27,)c(page)i(82\))g(can)h(b)q(e)g(used)g(to)f (c)o(hange)h(this)g(mo)q(de.)k(They)c(are)g(also)e(text)j(streams)f(b)o (y)f(default.)19 b(Use)-30 513 y Fh(set)p 39 513 V 16 w(stream)p 187 513 V 14 w(type/2)13 b Fm(\(section)h(7.10.25,)e(page)h (81\))h(to)g(c)o(hange)g(the)g(t)o(yp)q(e)h(if)e(binary)g(streams)i (are)f(needed.)-30 671 y Fi(7.28.2)48 b Fh(socket/2)-30 798 y Fi(T)l(emplates)74 881 y Fh(socket\(+socket)p 385 881 V 13 w(domain,)20 b(-integer\))-30 964 y Fi(Description)-30 1063 y Fh(socket\(Domain,)f(Socket\))13 b Fm(creates)j(a)e(so)q(c)o(k)o (et)h(whose)f(domain)f(is)h Fh(Domain)f Fm(\(section)i(7.28,)d(page)i (157\))g(and)g(uni\014es)-30 1113 y Fh(Socket)f Fm(with)h(the)h (descriptor)h(iden)o(tifying)d(the)i(so)q(c)o(k)o(et.)20 b(This)14 b(predicate)h(is)f(an)g(in)o(terface)h(to)g(the)f(C)h(Unix)e (function)-30 1163 y Fh(socket\(2\))p Fm(.)-30 1262 y Fi(Errors)p -30 1318 1890 2 v -30 1368 2 50 v -3 1353 a Fh(Domain)g Fm(is)g(a)h(v)n(ariable)p 915 1368 V 580 w Fh(instantiation)p 1230 1353 14 2 v 13 w(error)p 1859 1368 2 50 v -30 1370 1890 2 v -30 1419 2 50 v -3 1404 a(Domain)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(atom)p 915 1419 V 202 w Fh(type)p 1032 1404 14 2 v 15 w(error\(atom,)19 b(Domain\))p 1859 1419 2 50 v -30 1421 1890 2 v -30 1471 2 50 v -3 1456 a(Domain)13 b Fm(is)g(an)h(atom)f(but)h(not)f(a)h(v)n (alid)e(so)q(c)o(k)o(et)j(domain)p 915 1471 V 50 w Fh(domain)p 1076 1456 14 2 v 15 w(error\(socket)p 1355 1456 V 13 w(domain,)20 b(Domain\))p 1859 1471 2 50 v -30 1473 1890 2 v -30 1522 2 50 v -3 1507 a(Socket)13 b Fm(is)g(not)h(a)g(v)n (ariable)p 915 1522 V 506 w Fh(type)p 1032 1507 14 2 v 15 w(error\(variable,)19 b(Socket\))p 1859 1522 2 50 v -30 1524 1890 2 v -30 1673 2 150 v -3 1559 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs)g(and)f(the)g(v)n(alue)-3 1609 y(of)f(the)i Fh(os)p 163 1609 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1658 y Fm(\(section)h(7.22.1,)c (page)j(133\))p 915 1673 2 150 v 941 1559 a Fh(system)p 1076 1559 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1673 2 150 v -30 1675 1890 2 v -30 1758 a Fi(P)o(ortabilit)o(y)-30 1858 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2015 y Fi(7.28.3)48 b Fh(socket)p 275 2015 14 2 v 15 w(close/1)-30 2142 y Fi(T)l(emplates)74 2225 y Fh(socket)p 209 2225 V 15 w(close\(+integer\))-30 2308 y Fi(Description)-30 2407 y Fh(socket)p 105 2407 V 15 w(close\(Socket\))11 b Fm(closes)j(the)h(so)q(c)o(k)o(et)f(whose)g(descriptor)h(is)f Fh(Socket)p Fm(.)j(This)c(predicate)i(should)e(not)h(b)q(e)g(used)-30 2457 y(if)j Fh(Socket)c Fm(has)i(giv)o(en)e(rise)i(to)f(a)g(stream,)h (e.g.)k(b)o(y)c Fh(socket)p 928 2457 V 14 w(connect/4)d Fm(\(section)k(7.28.5,)c(page)i(159\).)19 b(In)14 b(that)g(case)-30 2507 y(simply)f(use)i Fh(close/2)d Fm(\(section)j(7.10.7,)d(page)h (72\))h(on)g(the)g(asso)q(ciated)h(stream.)-30 2607 y Fi(Errors)p -30 2662 1890 2 v -30 2712 2 50 v -3 2697 a Fh(Socket)e Fm(is)g(a)h(v)n(ariable)p 915 2712 V 580 w Fh(instantiation)p 1230 2697 14 2 v 13 w(error)p 1859 2712 2 50 v -30 2714 1890 2 v -30 2763 2 50 v -3 2749 a(Socket)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(in)o(teger)p 915 2763 V 172 w Fh(type)p 1032 2749 14 2 v 15 w(error\(integer,)19 b(Socket\))p 1859 2763 2 50 v -30 2765 1890 2 v -30 2915 2 150 v -3 2800 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs) g(and)f(the)g(v)n(alue)-3 2850 y(of)f(the)i Fh(os)p 163 2850 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 2900 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 2915 2 150 v 941 2800 a Fh(system)p 1076 2800 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 2915 2 150 v -30 2916 1890 2 v eop end %%Page: 159 161 TeXDict begin 159 160 bop -30 -45 a Fm(7.28)41 b(So)q(c)o(k)o(ets)15 b(input/output)1324 b(159)p -30 -27 1890 4 v -30 115 a Fi(P)o(ortabilit)o(y)-30 215 y Fm(GNU)14 b(Prolog)f(predicate.)-30 372 y Fi(7.28.4)48 b Fh(socket)p 275 372 14 2 v 15 w(bind/2)-30 499 y Fi(T)l(emplates)74 582 y Fh(socket)p 209 582 V 15 w(bind\(+integer,)19 b(+socket)p 705 582 V 14 w(address\))-30 665 y Fi(Description)-30 764 y Fh(socket)p 105 764 V 15 w(bind\(Socket,)g(Address\))d Fm(binds)h(the)h(so)q(c)o(k)o(et)g (whose)g(descriptor)h(is)e Fh(Socket)f Fm(to)h(the)h(address)h(sp)q (eci\014ed)-30 814 y(b)o(y)h Fh(Address)d Fm(\(section)j(7.28,)f(page)f (157\).)33 b(If)22 b Fh(Address)17 b Fm(if)h(of)h(the)g(form)g Fh('AF)p 1262 814 V 15 w(INET'\(HostName,)f(Port\))g Fm(and)h(if)-30 864 y Fh(HostName)13 b Fm(is)h(uninstan)o(tiated)h (then)g(it)f(is)g(uni\014ed)h(with)f(the)h(curren)o(t)h(mac)o(hine)e (name.)20 b(If)d Fh(Port)c Fm(is)i(uninstan)o(tiated,)-30 914 y(it)h(is)h(uni\014ed)f(to)g(a)g(p)q(ort)h(n)o(um)o(b)q(er)g(pic)o (k)o(ed)f(b)o(y)g(the)h(op)q(erating)f(system.)26 b(This)17 b(predicate)g(is)f(an)g(in)o(terface)h(to)f(the)h(C)-30 964 y(Unix)d(function)g Fh(bind\(2\))p Fm(.)-30 1063 y Fi(Errors)p -30 1119 1890 2 v -30 1169 2 50 v -3 1154 a Fh(Socket)f Fm(is)g(a)h(v)n(ariable)p 915 1169 V 580 w Fh(instantiation)p 1230 1154 14 2 v 13 w(error)p 1859 1169 2 50 v -30 1170 1890 2 v -30 1220 2 50 v -3 1205 a(Socket)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(in)o(teger)p 915 1220 V 172 w Fh(type)p 1032 1205 14 2 v 15 w(error\(integer,)19 b(Socket\))p 1859 1220 2 50 v -30 1222 1890 2 v -30 1272 2 50 v -3 1257 a(Address)12 b Fm(is)i(a)g(v)n(ariable)p 915 1272 V 558 w Fh(instantiation)p 1230 1257 14 2 v 13 w(error)p 1859 1272 2 50 v -30 1273 1890 2 v -30 1323 2 50 v -3 1308 a(Address)e Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i(a) g(v)n(alid)e(address)p 915 1323 V 63 w Fh(domain)p 1076 1308 14 2 v 15 w(error\(socket)p 1355 1308 V 13 w(address,)20 b(Address\))p 1859 1323 2 50 v -30 1325 1890 2 v -30 1375 2 50 v -3 1360 a(Address)12 b Fm(=)j Fh('AF)p 279 1360 14 2 v 15 w(UNIX'\(E\))d Fm(and)i Fh(E)f Fm(is)h(a)f(v)n(ariable)p 915 1375 2 50 v 127 w Fh(instantiation)p 1230 1360 14 2 v 13 w(error)p 1859 1375 2 50 v -30 1376 1890 2 v -30 1476 2 100 v -3 1411 a(Address)f Fm(=)j Fh('AF)p 279 1411 14 2 v 15 w(UNIX'\(E\))d Fm(or)i Fh('AF)p 599 1411 V 15 w(INET'\(E,)p 809 1411 V 36 w(\))-3 1461 y Fm(and)g Fh(E)f Fm(is)h(neither)h(a)f(v)n(ariable)e(nor)i(an)g(atom)p 915 1476 2 100 v 941 1411 a Fh(type)p 1032 1411 14 2 v 15 w(error\(atom,)19 b(E\))p 1859 1476 2 100 v -30 1478 1890 2 v -30 1577 2 100 v -3 1512 a(Address)12 b Fm(=)j Fh('AF)p 279 1512 14 2 v 15 w(UNIX'\(E\))d Fm(and)i Fh(E)f Fm(is)h(an)g(atom)f(but)-3 1562 y(not)h(a)f(v)n(alid)g(pathname) p 915 1577 2 100 v 941 1512 a Fh(domain)p 1076 1512 14 2 v 15 w(error\(os)p 1267 1512 V 14 w(path,)20 b(E\))p 1859 1577 2 100 v -30 1579 1890 2 v -30 1678 2 100 v -3 1614 a(Address)12 b Fm(=)j Fh('AF)p 279 1614 14 2 v 15 w(INET'\()p 426 1614 V 14 w(,)22 b(E\))13 b Fm(and)h Fh(E)f Fm(is)h(neither)h(a)-3 1663 y(v)n(ariable)e(nor)h(an)f(in)o (teger)p 915 1678 2 100 v 941 1614 a Fh(type)p 1032 1614 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 1678 2 100 v -30 1680 1890 2 v -30 1830 2 150 v -3 1715 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs)g(and)f(the)g(v)n(alue)-3 1765 y(of)f(the)i Fh(os)p 163 1765 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1815 y Fm(\(section)h(7.22.1,)c (page)j(133\))p 915 1830 2 150 v 941 1715 a Fh(system)p 1076 1715 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1830 2 150 v -30 1831 1890 2 v -30 1914 a Fi(P)o(ortabilit)o(y)-30 2014 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2171 y Fi(7.28.5)48 b Fh(socket)p 275 2171 14 2 v 15 w(connect/4)-30 2298 y Fi(T)l(emplates)74 2381 y Fh(socket)p 209 2381 V 15 w(connect\(+integer)o(,)19 b(+socket)p 770 2381 V 14 w(address,)h(-stream,)g(-stream\))-30 2464 y Fi(Description)-30 2563 y Fh(socket)p 105 2563 V 15 w(connect\(Socket,)f(Address,)h(StreamIn,)g(StreamOut\))e Fm(connects)k(the)f(so)q(c)o(k)o(et)h(whose)f(descriptor)g(is)-30 2613 y Fh(Socket)13 b Fm(to)g(the)h(address)g(sp)q(eci\014ed)h(b)o(y)f Fh(Address)e Fm(\(section)i(7.28,)e(page)h(157\).)k Fh(StreamIn)12 b Fm(is)h(uni\014ed)h(with)f(a)g(stream-)-30 2663 y(term)20 b(asso)q(ciated)f(with)g(the)g(input)g(of)f(the)i(connection)f(\(it)g (is)g(an)f(input)h(stream\).)34 b(Reading)18 b(from)g(this)h(stream)-30 2713 y(gets)j(data)e(from)g(the)h(so)q(c)o(k)o(et.)39 b Fh(StreamOut)18 b Fm(is)j(uni\014ed)g(with)f(a)g(stream-term)h(asso)q (ciated)h(with)e(the)h(output)g(of)-30 2763 y(the)d(connection)g(\(it)f (is)f(an)h(output)g(stream\).)29 b(W)m(riting)15 b(to)i(this)g(stream)h (sends)g(data)f(to)f(the)i(so)q(c)o(k)o(et.)28 b(The)18 b(use)g(of)-30 2812 y Fh(select/5)11 b Fm(can)i(b)q(e)g(useful)g (\(section)g(7.27.29,)e(page)h(156\).)17 b(This)c(predicate)g(is)g(an)f (in)o(terface)h(to)g(the)g(C)f(Unix)g(function)-30 2862 y Fh(connect\(2\))p Fm(.)p eop end %%Page: 160 162 TeXDict begin 160 161 bop -30 -45 a Fm(160)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(Errors)p -30 171 1890 2 v -30 220 2 50 v -3 205 a Fh(Socket)f Fm(is)g(a)h(v)n(ariable)p 915 220 V 580 w Fh(instantiation)p 1230 205 14 2 v 13 w(error)p 1859 220 2 50 v -30 222 1890 2 v -30 272 2 50 v -3 257 a(Socket)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h (in)o(teger)p 915 272 V 172 w Fh(type)p 1032 257 14 2 v 15 w(error\(integer,)19 b(Socket\))p 1859 272 2 50 v -30 273 1890 2 v -30 323 2 50 v -3 308 a(Address)12 b Fm(is)i(a)g(v)n(ariable)p 915 323 V 558 w Fh(instantiation)p 1230 308 14 2 v 13 w(error)p 1859 323 2 50 v -30 325 1890 2 v -30 375 2 50 v -3 360 a(Address)e Fm(is)i(neither)h(a)f(v)n (ariable)e(nor)i(a)g(v)n(alid)e(address)p 915 375 V 63 w Fh(domain)p 1076 360 14 2 v 15 w(error\(socket)p 1355 360 V 13 w(address,)20 b(Address\))p 1859 375 2 50 v -30 376 1890 2 v -30 476 2 100 v -3 411 a(Address)11 b Fm(=)i Fh('AF)p 276 411 14 2 v 15 w(UNIX'\(E\))e Fm(or)i Fh('AF)p 594 411 V 15 w(INET'\(E,)p 805 411 V 36 w(\))g Fm(or)-3 461 y Fh(Address)f Fm(=)j Fh('AF)p 279 461 V 15 w(INET'\()p 426 461 V 14 w(,)22 b(E\))13 b Fm(and)h Fh(E)f Fm(is)h(a)g(v)n(ariable)p 915 476 2 100 v 941 411 a Fh(instantiation)p 1230 411 14 2 v 13 w(error)p 1859 476 2 100 v -30 478 1890 2 v -30 577 2 100 v -3 513 a(Address)e Fm(=)j Fh('AF)p 279 513 14 2 v 15 w(UNIX'\(E\))d Fm(or)i Fh('AF)p 599 513 V 15 w(INET'\(E,)p 809 513 V 36 w(\))-3 562 y Fm(and)g Fh(E)f Fm(is)h(neither)h(a)f(v)n(ariable)e (nor)i(an)g(atom)p 915 577 2 100 v 941 513 a Fh(type)p 1032 513 14 2 v 15 w(error\(atom,)19 b(E\))p 1859 577 2 100 v -30 579 1890 2 v -30 679 2 100 v -3 614 a(Address)12 b Fm(=)j Fh('AF)p 279 614 14 2 v 15 w(UNIX'\(E\))d Fm(and)i Fh(E)f Fm(is)h(an)g(atom)f(but)-3 664 y(not)h(a)f(v)n(alid)g(pathname)p 915 679 2 100 v 941 614 a Fh(domain)p 1076 614 14 2 v 15 w(error\(os)p 1267 614 V 14 w(path,)20 b(E\))p 1859 679 2 100 v -30 680 1890 2 v -30 780 2 100 v -3 715 a(Address)12 b Fm(=)j Fh('AF)p 279 715 14 2 v 15 w(INET'\()p 426 715 V 14 w(,)22 b(E\))13 b Fm(and)h Fh(E)f Fm(is)h(neither)h(a)-3 765 y(v)n(ariable)e(nor)h(an)f(in)o(teger)p 915 780 2 100 v 941 715 a Fh(type)p 1032 715 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 780 2 100 v -30 782 1890 2 v -30 831 2 50 v -3 816 a(StreamIn)12 b Fm(is)i(not)g(a)f(v)n(ariable)p 915 831 V 463 w Fh(type)p 1032 816 14 2 v 15 w(error\(variable,)19 b(StreamIn\))p 1859 831 2 50 v -30 833 1890 2 v -30 883 2 50 v -3 868 a(StreamOut)12 b Fm(is)i(not)g(a)f(v)n(ariable)p 915 883 V 441 w Fh(type)p 1032 868 14 2 v 15 w(error\(variable,)19 b(StreamOut\))p 1859 883 2 50 v -30 885 1890 2 v -30 1034 2 150 v -3 919 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q (ccurs)g(and)f(the)g(v)n(alue)-3 969 y(of)f(the)i Fh(os)p 163 969 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1019 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1034 2 150 v 941 919 a Fh(system)p 1076 919 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1034 2 150 v -30 1036 1890 2 v -30 1118 a Fi(P)o(ortabilit)o(y)-30 1218 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1376 y Fi(7.28.6)48 b Fh(socket)p 275 1376 14 2 v 15 w(listen/2)-30 1502 y Fi(T)l(emplates)74 1585 y Fh(socket)p 209 1585 V 15 w(listen\(+integer,)18 b(+integer\))-30 1668 y Fi(Description)-30 1768 y Fh(socket)p 105 1768 V 15 w(listen\(Socket,)h(Length\))e Fm(de\014nes)j(the)g(so)q(c)o(k)o (et)f(whose)h(descriptor)g(is)e Fh(Socket)g Fm(to)g(ha)o(v)o(e)h(a)f (maxim)o(um)-30 1818 y(bac)o(klog)f(queue)i(of)i Fh(Length)16 b Fm(p)q(ending)j(connections.)31 b(This)18 b(predicate)h(is)e(an)h(in) o(terface)h(to)f(the)g(C)g(Unix)f(function)-30 1867 y Fh(listen\(2\))p Fm(.)-30 1967 y Fi(Errors)p -30 2023 1890 2 v -30 2073 2 50 v -3 2058 a Fh(Socket)c Fm(is)g(a)h(v)n(ariable) p 915 2073 V 580 w Fh(instantiation)p 1230 2058 14 2 v 13 w(error)p 1859 2073 2 50 v -30 2074 1890 2 v -30 2124 2 50 v -3 2109 a(Socket)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor) g(an)h(in)o(teger)p 915 2124 V 172 w Fh(type)p 1032 2109 14 2 v 15 w(error\(integer,)19 b(Socket\))p 1859 2124 2 50 v -30 2126 1890 2 v -30 2175 2 50 v -3 2161 a(Length)13 b Fm(is)g(a)h(v)n(ariable)p 915 2175 V 580 w Fh(instantiation)p 1230 2161 14 2 v 13 w(error)p 1859 2175 2 50 v -30 2177 1890 2 v -30 2227 2 50 v -3 2212 a(Length)f Fm(is)g(neither)i(a)f(v)n (ariable)f(nor)g(an)h(in)o(teger)p 915 2227 V 172 w Fh(type)p 1032 2212 14 2 v 15 w(error\(integer,)19 b(Length\))p 1859 2227 2 50 v -30 2229 1890 2 v -30 2378 2 150 v -3 2263 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q(ccurs)g(and)f (the)g(v)n(alue)-3 2313 y(of)f(the)i Fh(os)p 163 2313 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 2363 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 2378 2 150 v 941 2263 a Fh(system)p 1076 2263 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 2378 2 150 v -30 2380 1890 2 v -30 2463 a Fi(P)o(ortabilit)o(y)-30 2562 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2720 y Fi(7.28.7)48 b Fh(socket)p 275 2720 14 2 v 15 w(accept/4)p Fi(,)14 b Fh(socket)p 625 2720 V 15 w(accept/3)-30 2846 y Fi(T)l(emplates)p eop end %%Page: 161 163 TeXDict begin 161 162 bop -30 -45 a Fm(7.28)41 b(So)q(c)o(k)o(ets)15 b(input/output)1324 b(161)p -30 -27 1890 4 v 74 115 a Fh(socket)p 209 115 14 2 v 15 w(accept\(+integer,)18 b(-atom,)j(-stream,)f(-stream\))74 165 y(socket)p 209 165 V 15 w(accept\(+integer,)e(-stream,)i(-stream\))-30 248 y Fi(Description)-30 347 y Fh(socket)p 105 347 V 15 w(accept\(Socket,)f(Client,)h(StreamIn,)g(StreamOut\))d Fm(extracts)k(the)e(\014rst)h(connection)g(to)f(the)g(so)q(c)o(k)o(et) -30 397 y(whose)d(descriptor)f(is)g Fh(Socket)p Fm(.)j(If)c(the)h (domain)e(is)i Fh('AF)p 867 397 V 15 w(INET')p Fm(,)e Fh(Client)g Fm(is)h(uni\014ed)h(with)f(an)g(atom)g(whose)h(name)f(is) -30 447 y(the)i(In)o(ternet)g(host)e(address)i(in)f(n)o(um)o(b)q (ers-and-dots)g(notation)e(of)h(the)i(connecting)f(mac)o(hine.)20 b Fh(StreamIn)13 b Fm(is)h(uni\014ed)-30 497 y(with)e(a)f(stream-term)h (asso)q(ciated)g(with)f(the)h(input)g(of)f(the)h(connection)g(\(it)f (is)g(an)h(input)f(stream\).)18 b(Reading)10 b(from)h(this)-30 547 y(stream)16 b(gets)g(data)f(from)g(the)h(so)q(c)o(k)o(et.)23 b Fh(StreamOut)13 b Fm(is)i(uni\014ed)h(with)f(a)g(stream-term)h(asso)q (ciated)g(with)f(the)h(output)-30 596 y(of)f(the)g(connection)h(\(it)e (is)h(an)g(output)g(stream\).)21 b(W)m(riting)13 b(to)i(this)g(stream)g (sends)h(data)f(to)g(the)g(so)q(c)o(k)o(et.)22 b(The)15 b(use)h(of)-30 646 y Fh(select/5)11 b Fm(can)i(b)q(e)g(useful)g (\(section)g(7.27.29,)e(page)h(156\).)17 b(This)c(predicate)g(is)g(an)f (in)o(terface)h(to)g(the)g(C)f(Unix)g(function)-30 696 y Fh(accept\(2\))p Fm(.)-30 796 y Fh(socket)p 105 796 V 15 w(accept\(Socket,)19 b(StreamIn,)h(StreamOut\))12 b Fm(is)h(equiv)n(alen)o(t)g(to)h Fh(socket)p 1318 796 V 15 w(accept\(Socket,)p 1659 796 V 34 w(,)-30 845 y(StreamIn,)20 b(StreamOut\))p Fm(.)-30 945 y Fi(Errors)p -30 1001 1890 2 v -30 1051 2 50 v -3 1036 a Fh(Socket)13 b Fm(is)g(a)h(v)n(ariable)p 915 1051 V 580 w Fh(instantiation)p 1230 1036 14 2 v 13 w(error)p 1859 1051 2 50 v -30 1052 1890 2 v -30 1102 2 50 v -3 1087 a(Socket)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an) h(in)o(teger)p 915 1102 V 172 w Fh(type)p 1032 1087 14 2 v 15 w(error\(integer,)19 b(Socket\))p 1859 1102 2 50 v -30 1104 1890 2 v -30 1154 2 50 v -3 1139 a(Client)13 b Fm(is)g(not)h(a)g(v)n(ariable)p 915 1154 V 506 w Fh(type)p 1032 1139 14 2 v 15 w(error\(variable,)19 b(Client\))p 1859 1154 2 50 v -30 1155 1890 2 v -30 1205 2 50 v -3 1190 a(StreamIn)12 b Fm(is)i(not)g(a)f(v)n(ariable)p 915 1205 V 463 w Fh(type)p 1032 1190 14 2 v 15 w(error\(variable,)19 b(StreamIn\))p 1859 1205 2 50 v -30 1207 1890 2 v -30 1256 2 50 v -3 1242 a(StreamOut)12 b Fm(is)i(not)g(a)f(v)n(ariable)p 915 1256 V 441 w Fh(type)p 1032 1242 14 2 v 15 w(error\(variable,)19 b(StreamOut\))p 1859 1256 2 50 v -30 1258 1890 2 v -30 1408 2 150 v -3 1293 a Fm(an)14 b(op)q(erating)f(system)i(error)g(o)q (ccurs)g(and)f(the)g(v)n(alue)-3 1343 y(of)f(the)i Fh(os)p 163 1343 14 2 v 15 w(error)e Fm(Prolog)g(\015ag)g(is)h Fh(error)-3 1393 y Fm(\(section)h(7.22.1,)c(page)j(133\))p 915 1408 2 150 v 941 1293 a Fh(system)p 1076 1293 14 2 v 15 w(error\()p Fd(atom)19 b(explaining)h(the)h(error)6 b Fh(\))p 1859 1408 2 150 v -30 1409 1890 2 v -30 1492 a Fi(P)o(ortabilit)o(y)-30 1592 y Fm(GNU)14 b(Prolog)f(predicates.)-30 1749 y Fi(7.28.8)48 b Fh(hostname)p 319 1749 14 2 v 14 w(address/2)-30 1876 y Fi(T)l(emplates)74 1959 y Fh(hostname)p 253 1959 V 14 w(address\(+atom,)19 b(?atom\))74 2009 y(hostname)p 253 2009 V 14 w(address\(?atom,)g(+atom\))-30 2092 y Fi(Description)-30 2191 y Fh(hostname)p 149 2191 V 15 w(address\(HostNam)o(e,)g(HostAddress\))9 b Fm(succeeds)15 b(if)c(the)i(In)o(ternet)g(host)g(address)g(in)f(n)o(um)o(b)q (ers-and-dots)-30 2241 y(notation)f(of)k Fh(HostName)10 b Fm(is)h Fh(HostAddress)p Fm(.)k Fh(Hostname)10 b Fm(can)i(b)q(e)g (giv)o(en)g(as)f(a)h(fully)e(quali\014ed)h(name,)h(or)f(an)h (unquali\014ed)-30 2291 y(name)19 b(or)g(an)g(alias)f(of)h(the)g(mac)o (hine.)34 b(The)19 b(predicate)h(will)e(fail)f(if)i(the)g(mac)o(hine)g (name)g(or)g(address)h(cannot)g(b)q(e)-30 2341 y(resolv)o(ed.)-30 2440 y Fi(Errors)p -30 2496 1890 2 v -30 2546 2 50 v -3 2531 a Fh(HostName)12 b Fm(and)i Fh(HostAddress)d Fm(are)k(v)n(ariables)p 915 2546 V 193 w Fh(instantiation)p 1230 2531 14 2 v 13 w(error)p 1859 2546 2 50 v -30 2547 1890 2 v -30 2597 2 50 v -3 2582 a(HostName)d Fm(is)i(neither)h(a)e(v)n (ariable)g(nor)h(an)g(atom)p 915 2597 V 158 w Fh(type)p 1032 2582 14 2 v 15 w(error\(atom,)19 b(HostName\))p 1859 2597 2 50 v -30 2599 1890 2 v -30 2649 2 50 v -3 2634 a(HostAddress)12 b Fm(is)h(neither)i(a)f(v)n(ariable)f(nor)g(an)h (atom)p 915 2649 V 93 w Fh(type)p 1032 2634 14 2 v 15 w(error\(atom,)19 b(HostAddress\))p 1859 2649 2 50 v -30 2650 1890 2 v -30 2700 2 50 v -3 2685 a(Address)12 b Fm(is)i(neither)h(a)f(v)n(ariable)e(nor)i(a)g(v)n(alid)e(address)p 915 2700 V 63 w Fh(domain)p 1076 2685 14 2 v 15 w(error\(socket)p 1355 2685 V 13 w(address,)20 b(Address\))p 1859 2700 2 50 v -30 2702 1890 2 v -30 2785 a Fi(P)o(ortabilit)o(y)-30 2884 y Fm(GNU)14 b(Prolog)f(predicate.)p eop end %%Page: 162 164 TeXDict begin 162 163 bop -30 -45 a Fm(162)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Ff(7.29)56 b(Linedit)17 b(managemen)n(t)-30 241 y Fm(The)e(follo)o(wing)c(predicates)k(are)g(only)e(a)o(v)n (ailable)e(if)j(the)g Fh(linedit)e Fm(part)i(of)g(GNU)f(Prolog)h(has)g (b)q(een)h(installed.)-30 398 y Fi(7.29.1)48 b Fh(get)p 209 398 14 2 v 15 w(linedit)p 378 398 V 15 w(prompt/1)-30 525 y Fi(T)l(emplates)74 605 y Fh(get)p 143 605 V 15 w(linedit)p 312 605 V 15 w(prompt\(?atom\))-30 684 y Fi(Description)-30 784 y Fh(get)p 39 784 V 16 w(linedit)p 209 784 V 14 w(prompt\(Prompt\))17 b Fm(succeeds)22 b(if)g Fh(Prompt)d Fm(is)h(the)g(curren)o(t)i Fh(linedit)c Fm(prompt,)j(e.g.) 35 b(the)21 b(top-lev)o(el)-30 834 y(prompt)14 b(is)g Fh('|)21 b(?-')p Fm(.)d(By)c(default)f(all)g(other)h(reads)h(ha)o(v)o (e)f(an)g(empt)o(y)f(prompt.)-30 934 y Fi(Errors)p -30 998 1890 2 v -30 1048 2 50 v -3 1033 a Fh(Prompt)g Fm(is)g(neither)i(a) f(v)n(ariable)f(nor)g(an)h(atom)p 915 1048 V 202 w Fh(type)p 1032 1033 14 2 v 15 w(error\(atom,)19 b(Pred\))p 1859 1048 2 50 v -30 1049 1890 2 v -30 1133 a Fi(P)o(ortabilit)o(y)-30 1232 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1389 y Fi(7.29.2)48 b Fh(set)p 209 1389 14 2 v 15 w(linedit)p 378 1389 V 15 w(prompt/1)-30 1516 y Fi(T)l(emplates)74 1596 y Fh(set)p 143 1596 V 15 w(linedit)p 312 1596 V 15 w(prompt\(+atom\))-30 1676 y Fi(Description)-30 1775 y Fh(set)p 39 1775 V 16 w(linedit)p 209 1775 V 14 w(prompt\(Prompt\))7 b Fm(sets)k(the)f (curren)o(t)i Fh(linedit)c Fm(prompt)i(to)f Fh(Prompt)p Fm(.)16 b(This)9 b(prompt)h(will)e(b)q(e)j(displa)o(y)o(ed)-30 1825 y(for)j(reads)h(from)e(a)g(terminal)h(\(except)h(for)f(top-lev)o (el)f(reads\).)-30 1925 y Fi(Errors)p -30 1980 1890 2 v -30 2030 2 50 v -3 2015 a Fh(Prompt)g Fm(is)g(a)h(v)n(ariable)p 915 2030 V 580 w Fh(instantiation)p 1230 2015 14 2 v 13 w(error)p 1859 2030 2 50 v -30 2032 1890 2 v -30 2082 2 50 v -3 2067 a(Prompt)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an) h(atom)p 915 2082 V 202 w Fh(type)p 1032 2067 14 2 v 15 w(error\(atom,)19 b(Pred\))p 1859 2082 2 50 v -30 2083 1890 2 v -30 2166 a Fi(P)o(ortabilit)o(y)-30 2266 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2423 y Fi(7.29.3)48 b Fh(add)p 209 2423 14 2 v 15 w(linedit)p 378 2423 V 15 w(completion/1)-30 2549 y Fi(T)l(emplates)74 2629 y Fh(add)p 143 2629 V 15 w(linedit)p 312 2629 V 15 w(completion\(+ato)o (m\))-30 2709 y Fi(Description)-30 2808 y Fh(add)p 39 2808 V 16 w(linedit)p 209 2808 V 14 w(completion\(Word\))9 b Fm(adds)k Fh(Word)g Fm(in)f(the)i(list)e(of)g(completion)g(w)o(ords)i (main)o(tained)d(b)o(y)j Fh(linedit)d Fm(\(sec-)-30 2858 y(tion)17 b(3.2.5,)f(page)i(18\).)28 b(Only)17 b(w)o(ords)g(con)o (taining)f(letters,)j(digits)e(and)g(the)h(underscore)i(c)o(haracter)e (are)g(added)g(\(if)-30 2908 y Fh(Word)13 b Fm(do)q(es)i(not)f(resp)q (ect)i(this)e(restriction)h(the)f(predicate)h(fails\).)p eop end %%Page: 163 165 TeXDict begin 163 164 bop -30 -45 a Fm(7.30)41 b(Source)15 b(reader)g(facilit)o(y)1326 b(163)p -30 -27 1890 4 v -30 115 a Fi(Errors)p -30 171 1890 2 v -30 220 2 50 v -3 205 a Fh(Word)13 b Fm(is)h(a)f(v)n(ariable)p 915 220 V 624 w Fh(instantiation)p 1230 205 14 2 v 13 w(error)p 1859 220 2 50 v -30 222 1890 2 v -30 272 2 50 v -3 257 a(Word)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(an)g(atom)p 915 272 V 245 w Fh(type)p 1032 257 14 2 v 15 w(error\(atom,)19 b(Word\))p 1859 272 2 50 v -30 273 1890 2 v -30 356 a Fi(P)o(ortabilit)o(y)-30 456 y Fm(GNU)14 b(Prolog)f(predicate.)-30 614 y Fi(7.29.4)48 b Fh(find)p 231 614 14 2 v 15 w(linedit)p 400 614 V 14 w(completion/2)-30 740 y Fi(T)l(emplates)74 823 y Fh(find)p 165 823 V 15 w(linedit)p 334 823 V 14 w(completion\(+atom,)19 b(?atom\))-30 906 y Fi(Description)-30 1006 y Fh(find)p 61 1006 V 15 w(linedit)p 230 1006 V 15 w(completion\(Pref)o(ix,)g(Word\))11 b Fm(succeeds)k(if)g Fh(Word)d Fm(is)g(a)g(w)o(ord)h(b)q(eginning)f(b)o(y)h Fh(Prefix)e Fm(and)h(b)q(elongs)-30 1056 y(to)18 b(the)g(list)f(of)f (completion)h(w)o(ords)h(main)o(tained)e(b)o(y)i Fh(linedit)e Fm(\(section)i(3.2.5,)e(page)h(18\).)29 b(This)17 b(predicate)h(is)g (re-)-30 1105 y(executable)e(on)d(bac)o(ktrac)o(king.)-30 1205 y Fi(Errors)p -30 1261 1890 2 v -30 1310 2 50 v -3 1295 a Fh(Prefix)g Fm(is)g(a)h(v)n(ariable)p 915 1310 V 580 w Fh(instantiation)p 1230 1295 14 2 v 13 w(error)p 1859 1310 2 50 v -30 1312 1890 2 v -30 1362 2 50 v -3 1347 a(Prefix)f Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)g(an)h(atom)p 915 1362 V 202 w Fh(type)p 1032 1347 14 2 v 15 w(error\(atom,)19 b(Prefix\))p 1859 1362 2 50 v -30 1364 1890 2 v -30 1413 2 50 v -3 1398 a(Word)13 b Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h (an)g(atom)p 915 1413 V 245 w Fh(type)p 1032 1398 14 2 v 15 w(error\(atom,)19 b(Word\))p 1859 1413 2 50 v -30 1415 1890 2 v -30 1498 a Fi(P)o(ortabilit)o(y)-30 1597 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1763 y Ff(7.30)56 b(Source)18 b(reader)g(facilit)n(y)-30 1890 y Fi(7.30.1)48 b(In)o(tro)q(duction)-30 2016 y Fm(T)m(o)14 b(b)q(e)g(written...)p eop end %%Page: 164 166 TeXDict begin 164 165 bop -30 -45 a Fm(164)1096 b(7)41 b(PR)o(OLOG)14 b(BUIL)m(T-IN)g(PREDICA)m(TES)p -30 -27 1890 4 v -30 115 a Fi(7.30.2)48 b Fh(sr)p 187 115 14 2 v 15 w(open/3)-30 241 y Fi(7.30.3)g Fh(sr)p 187 241 V 15 w(change)p 334 241 V 15 w(options/2)-30 368 y Fi(7.30.4)g Fh(sr)p 187 368 V 15 w(close/1)-30 494 y Fi(7.30.5)g Fh(sr)p 187 494 V 15 w(read)p 290 494 V 15 w(term/4)-30 621 y Fi(7.30.6)g Fh(sr)p 187 621 V 15 w(current)p 356 621 V 15 w(descriptor/1)-30 747 y Fi(7.30.7)g Fh(sr)p 187 747 V 15 w(get)p 268 747 V 16 w(stream/2)-30 874 y Fi(7.30.8)g Fh(sr)p 187 874 V 15 w(get)p 268 874 V 16 w(module/3)-30 1000 y Fi(7.30.9)g Fh(sr)p 187 1000 V 15 w(get)p 268 1000 V 16 w(file)p 372 1000 V 14 w(name/2)-30 1126 y Fi(7.30.10)g Fh(sr)p 211 1126 V 15 w(get)p 292 1126 V 15 w(position/3)-30 1253 y Fi(7.30.11)g Fh(sr)p 211 1253 V 15 w(get)p 292 1253 V 15 w(include)p 461 1253 V 15 w(list/2)-30 1379 y Fi(7.30.12)g Fh(sr)p 211 1379 V 15 w(get)p 292 1379 V 15 w(include)p 461 1379 V 15 w(stream)p 608 1379 V 14 w(list/2)-30 1506 y Fi(7.30.13)g Fh(sr)p 211 1506 V 15 w(get)p 292 1506 V 15 w(size)p 395 1506 V 15 w(counters/3)-30 1632 y Fi(7.30.14)g Fh(sr)p 211 1632 V 15 w(get)p 292 1632 V 15 w(error)p 417 1632 V 15 w(counters/3)-30 1759 y Fi(7.30.15)g Fh(sr)p 211 1759 V 15 w(set)p 292 1759 V 15 w(error)p 417 1759 V 15 w(counters/3)-30 1885 y Fi(7.30.16)g Fh(sr)p 211 1885 V 15 w(error)p 336 1885 V 15 w(from)p 439 1885 V 15 w(exception/2)-30 2011 y Fi(7.30.17)g Fh(sr)p 211 2011 V 15 w(write)p 336 2011 V 15 w(message/8)p Fi(,)14 b Fh(sr)p 620 2011 V 16 w(write)p 746 2011 V 14 w(message/6)p Fi(,)h Fh(sr)p 1030 2011 V 15 w(write)p 1155 2011 V 14 w(message/4)-30 2138 y Fi(7.30.18)48 b Fh(sr)p 211 2138 V 15 w(write)p 336 2138 V 15 w(error/6)p Fi(,)15 b Fh(sr)p 577 2138 V 15 w(write)p 702 2138 V 15 w(error/4)p Fi(,)f Fh(sr)p 942 2138 V 16 w(write)p 1068 2138 V 14 w(error/2)p eop end %%Page: 165 167 TeXDict begin 165 166 bop 1798 -45 a Fm(165)p -30 -27 1890 4 v -30 115 a Fn(8)67 b(Finite)23 b(domain)f(solv)n(er)g(and)h (built-in)g(predicates)-30 264 y Ff(8.1)56 b(In)n(tro)r(duction)-30 390 y Fm(The)11 b(\014nite)f(domain)e(\(FD\))i(constrain)o(t)g(solv)o (er)g(extends)i(Prolog)d(with)g(constrain)o(ts)i(o)o(v)o(er)f(FD.)f (This)h(facilit)o(y)e(is)h(a)o(v)n(ailable)-30 440 y(if)18 b(the)h(FD)f(part)g(of)g(GNU)g(Prolog)f(has)i(b)q(een)g(installed.)31 b(The)19 b(solv)o(er)f(is)g(an)g(instance)h(of)f(the)h(Constrain)o(t)f (Logic)-30 490 y(Programming)d(sc)o(heme)i(in)o(tro)q(duced)f(b)o(y)g (Ja\013ar)g(and)f(Lassez)i(in)f(1987)e([7].)23 b(Constrain)o(ts)16 b(on)f(FD)h(are)g(solv)o(ed)f(using)-30 540 y(propagation)10 b(tec)o(hniques,)i(in)e(particular)g(arc-consistency)i(\(A)o(C\).)e (The)h(in)o(terested)h(reader)g(can)f(refer)g(to)g(\\Constrain)o(t)-30 590 y(Satisfaction)h(in)g(Logic)f(Programming")g(of)g(P)m(.)h(V)m(an)g (Hen)o(tenryc)o(k)h(\(1989\))f([8)o(].)17 b(The)c(solv)o(er)f(is)g (based)h(on)f(the)h Fh(clp\(FD\))-30 639 y Fm(solv)o(er)d([4)o(].)16 b(The)10 b(GNU)g(Prolog)e(FD)i(solv)o(er)f(o\013ers)i(arithmetic)e (constrain)o(ts,)i(b)q(o)q(olean)e(constrain)o(ts,)h(rei\014ed)g (constrain)o(ts)-30 689 y(and)k(sym)o(b)q(olic)f(constrain)o(ts)i(on)e (an)h(new)g(kind)g(of)f(v)n(ariables:)k(Finite)d(Domain)e(v)n (ariables.)-30 847 y Fi(8.1.1)48 b(Finite)16 b(Domain)f(v)m(ariables) -30 973 y Fm(A)20 b(new)g(t)o(yp)q(e)g(of)f(data)h(is)f(in)o(tro)q (duced:)31 b(FD)19 b(v)n(ariables)g(whic)o(h)g(can)h(only)f(tak)o(e)h (v)n(alues)f(in)g(their)h(domains.)35 b(The)-30 1023 y(initial)16 b(domain)f(of)i(an)g(FD)f(v)n(ariable)g(is)h Fh(0..fd)p 748 1023 14 2 v 15 w(max)p 829 1023 V 15 w(integer)e Fm(where)k Fh(fd)p 1181 1023 V 15 w(max)p 1262 1023 V 15 w(integer)d Fm(represen)o(ts)j(the)f(greatest)-30 1073 y(v)n(alue)c(that)g(an)o(y)g(FD)g(v)n(ariable)f(can)h(tak)o(e.)19 b(The)c(predicate)g Fh(fd)p 972 1073 V 15 w(max)p 1053 1073 V 16 w(integer/1)d Fm(returns)k(this)e(v)n(alue)f(whic)o(h)h(ma)o (y)g(b)q(e)-30 1123 y(di\013eren)o(t)k(from)f(the)g Fh(max)p 382 1123 V 15 w(integer)f Fm(Prolog)g(\015ag)h(\(section)h(7.22.1,)d (page)i(133\).)27 b(The)18 b(domain)d(of)i(an)f(FD)h(v)n(ariable)-30 1173 y Fh(X)e Fm(is)g(reduced)i(step)f(b)o(y)f(step)i(b)o(y)e (constrain)o(ts)g(in)g(a)g(monotonic)f(w)o(a)o(y:)20 b(when)c(a)f(v)n(alue)f(has)i(b)q(een)g(remo)o(v)o(ed)f(from)g(the)-30 1222 y(domain)h(of)k Fh(X)d Fm(it)g(will)f(nev)o(er)i(reapp)q(ear)h(in) e(the)g(domain)f(of)k Fh(X)p Fm(.)d(An)g(FD)g(v)n(ariable)f(is)i(fully) e(compatible)g(with)h(b)q(oth)-30 1272 y(Prolog)12 b(in)o(tegers)i(and) e(Prolog)g(v)n(ariables.)17 b(Namely)m(,)12 b(when)h(an)f(FD)h(v)n (ariable)e(is)i(exp)q(ected)i(b)o(y)d(an)h(FD)f(constrain)o(t)h(it)f (is)-30 1322 y(p)q(ossible)i(to)f(pass)h(a)f(Prolog)g(in)o(teger)h (\(considered)g(as)g(an)f(FD)g(v)n(ariable)f(whose)i(domain)e(is)h(a)g (singleton\))h(or)f(a)g(Prolog)-30 1372 y(v)n(ariable)i(\(immediately)f (b)q(ound)i(to)f(an)g(initial)f(range)i Fh(0..fd)p 973 1372 V 14 w(max)p 1053 1372 V 15 w(integer)p Fm(\).)22 b(This)15 b(a)o(v)o(oids)g(the)h(need)h(for)e(sp)q(eci\014c)-30 1422 y(t)o(yp)q(e)i(declaration.)22 b(Although)15 b(it)h(is)f(not)g (necessary)j(to)d(declare)i(the)f(initial)e(domain)g(of)h(an)g(FD)h(v)n (ariable)e(\(since)j(it)-30 1472 y(will)12 b(b)q(e)h(b)q(ound)g Fh(0..fd)p 343 1472 V 15 w(max)p 424 1472 V 15 w(integer)e Fm(when)j(app)q(earing)f(for)f(the)i(\014st)f(time)g(in)f(a)h (constrain)o(t\))g(it)f(is)h(adv)n(an)o(tageous)f(to)-30 1521 y(do)j(so)h(and)f(th)o(us)g(reduce)i(as)e(so)q(on)g(as)g(p)q (ossible)h(the)g(size)f(of)g(its)g(domain:)k(particularly)c(b)q(ecause) h(GNU)f(Prolog,)g(for)-30 1571 y(e\016ciency)e(reasons,)g(do)q(es)g (not)f(c)o(hec)o(k)h(for)f(o)o(v)o(er\015o)o(ws.)18 b(F)m(or)11 b(instance,)i(without)f(an)o(y)f(preliminary)g(domain)g(de\014nitions) -30 1621 y(for)k Fh(X)p Fm(,)f Fh(Y)h Fm(and)g Fh(Z)p Fm(,)f(the)i(non-linear)e(constrain)o(t)i Fh(X*Y#=Z)e Fm(will)f(fail)h(due)h(to)g(an)g(o)o(v)o(er\015o)o(w)g(when)g (computing)g(the)g(upp)q(er)-30 1671 y(b)q(ound)h(of)f(the)h(domain)e (of)k Fh(Z)p Fm(:)d Fh(fd)p 519 1671 V 15 w(max)p 600 1671 V 15 w(integer)21 b Fg(\002)h Fh(fd)p 888 1671 V 15 w(max)p 969 1671 V 15 w(integer)p Fm(.)f(This)16 b(o)o(v)o(er\015o)o (w)f(causes)i(a)e(negativ)o(e)g(result)-30 1721 y(for)f(the)g(upp)q(er) h(b)q(ound)f(and)g(the)h(constrain)o(t)f(then)g(fails.)-30 1820 y(There)i(are)e(t)o(w)o(o)f(in)o(ternal)h(represen)o(tations)i (for)d(an)h(FD)f(v)n(ariable:)33 1903 y Fg(\017)20 b Fi(in)o(terv)m(al)i(represen)o(tation)o Fm(:)k(only)19 b(the)h Fe(min)i Fm(and)d(the)h Fe(max)25 b Fm(of)19 b(the)h(v)n(ariable)e(are)i(main)o(tained.)33 b(In)19 b(this)74 1953 y(represen)o(tation)d(it)d(is)h(p)q(ossible)g(to)g (store)h(v)n(alues)e(included)h(in)g Fh(0..fd)p 1189 1953 V 14 w(max)p 1269 1953 V 15 w(integer)p Fm(.)33 2036 y Fg(\017)20 b Fi(sparse)g(represen)o(tation)p Fm(:)j(an)18 b(additional)f(bit-v)o(ector)i(is)f(used)h(to)f(store)h(the)g(set)g(of) f(p)q(ossible)h(v)n(alues)f(for)74 2086 y(the)i(v)n(ariable)e(\(i.e.)33 b(the)20 b(domain\).)33 b(In)19 b(this)g(represen)o(tation)h(it)f(is)g (p)q(ossible)h(to)e(store)j(v)n(alues)d(included)i(in)74 2136 y Fh(0..vector)p 275 2136 V 14 w(max)p Fm(.)34 b(By)20 b(default)f Fh(vector)p 749 2136 V 14 w(max)g Fm(is)g(set)i(to)e(127.) 34 b(This)19 b(v)n(alue)g(can)h(b)q(e)g(rede\014ned)h(via)e(an)g(en-)74 2186 y(vironmen)o(t)f(v)n(ariable)f Fh(VECTORMAX)f Fm(or)i(via)g(the)g (built-in)f(predicate)j Fh(fd)p 1238 2186 V 15 w(set)p 1319 2186 V 15 w(vector)p 1466 2186 V 14 w(max/1)d Fm(\(section)i (8.2.3,)74 2235 y(page)13 b(167\).)18 b(The)13 b(predicate)i Fh(fd)p 590 2235 V 15 w(vector)p 737 2235 V 14 w(max/1)e Fm(returns)h(the)g(curren)o(t)h(v)n(alue)d(of)k Fh(vector)p 1519 2235 V 15 w(max)c Fm(\(section)i(8.2.1,)74 2285 y(page)g(166\).)-30 2368 y(The)k(initial)c(represen)o(tation)19 b(for)d(an)g(FD)h(v)n(ariable)e Fh(X)i Fm(is)f(alw)o(a)o(ys)g(an)h(in)o (terv)n(al)e(represen)o(tation)k(and)d(is)h(switc)o(hed)g(to)-30 2418 y(a)i(sparse)h(represen)o(tation)g(when)f(a)f(\\hole")g(app)q (ears)h(in)g(the)g(domain)e(\(e.g.)32 b(due)19 b(to)g(an)f(inequalit)o (y)f(constrain)o(t\).)-30 2468 y(Once)f(a)e(v)n(ariable)f(uses)j(a)e (sparse)h(represen)o(tation)h(it)e(will)f(not)h(switc)o(h)g(bac)o(k)h (to)f(an)g(in)o(terv)n(al)f(represen)o(tation)j(ev)o(en)f(if)-30 2518 y(there)h(are)e(no)g(longer)f(holes)h(in)g(its)g(domain.)j(When)d (this)g(switc)o(hing)f(o)q(ccurs)j(some)e(v)n(alues)f(in)h(the)g (domain)f(of)j Fh(X)e Fm(can)-30 2567 y(b)q(e)j(lost)f(since)h Fh(vector)p 349 2567 V 15 w(max)f Fm(is)g(less)h(than)f Fh(fd)p 712 2567 V 15 w(max)p 793 2567 V 15 w(integer)p Fm(.)24 b(W)m(e)16 b(sa)o(y)g(that)g(\\)p Fh(X)g Fm(is)g (extra-constrained")h(since)g Fh(X)f Fm(is)-30 2617 y(constrained)11 b(b)o(y)f(the)g(solv)o(er)g(to)f(the)i(domain)d Fh(0..vector)p 881 2617 V 14 w(max)h Fm(\(via)g(an)h(imaginary)e(constrain)o(t)i Fh(X)21 b(#=<)h Fd(vector)p 1749 2617 V 14 w(max)7 b Fm(\).)-30 2667 y(An)k Fh(extra)p 148 2667 V 14 w(cstr)f Fm(is)g(asso)q(ciated)g(with)g(eac)o(h)h(FD)f(v)n(ariable)f(to)h (indicate)g(that)g(v)n(alues)g(ha)o(v)o(e)f(b)q(een)j(lost)e(due)g(to)g (the)h(switc)o(h)-30 2717 y(to)h(a)g(sparse)i(represen)o(tation.)19 b(This)12 b(\015ag)f(is)h(up)q(dated)h(on)f(ev)o(ery)h(op)q(erations.)k (The)c(domain)e(of)g(an)h(extra-constrained)-30 2767 y(FD)i(v)n(ariable)f(is)h(output)g(follo)o(w)o(ed)e(b)o(y)h(the)i Fh(@)e Fm(sym)o(b)q(ol.)18 b(When)c(a)f(constrain)o(t)h(fails)f(on)h(a) f(extra-constrained)i(v)n(ariable)-30 2816 y(a)d(message)h Fh(Warning:)41 b(Vector)21 b(too)g(small)g(-)h(maybe)e(lost)h (solutions)f(\(FD)h(Var:)p Fd(N)7 b Fh(\))k Fm(is)h(displa)o(y)o(ed)f (\()p Fd(N)19 b Fm(is)12 b(the)-30 2866 y(address)k(of)d(the)h(in)o(v)o (olv)o(ed)f(v)n(ariable\).)p eop end %%Page: 166 168 TeXDict begin 166 167 bop -30 -45 a Fm(166)649 b(8)41 b(FINITE)14 b(DOMAIN)g(SOL)-5 b(VER)15 b(AND)f(BUIL)m(T-IN)g(PREDICA)m (TES)p -30 -27 1890 4 v -30 115 a(Example)g(1)f(\()p Fh(vector)p 328 115 14 2 v 15 w(max)g Fm(=)h Fh(127)p Fm(\):)p -30 181 1170 2 v -30 231 2 50 v -3 216 a(Constrain)o(t)g(on)f Fh(X)p 308 231 V 52 w Fm(Domain)f(of)k Fh(X)p 621 231 V 85 w(extra)p 761 216 14 2 v 14 w(cstr)p 884 231 2 50 v 51 w Fm(Lost)e(v)n(alues)p 1139 231 V -30 232 1170 2 v -30 242 V -30 292 2 50 v -3 277 a Fh(X)22 b(#=<)f(512)p 308 292 V 141 w(0..512)p 621 292 V 254 w(off)p 884 292 V 124 w Fm(none)p 1139 292 V -30 294 1170 2 v -30 344 2 50 v -3 329 a Fh(X)h(#\\=)f(10)p 308 344 V 163 w(0..9:11..127)p 621 344 V 133 w(on)p 884 344 V 135 w(128..512)p 1139 344 V -30 345 1170 2 v -30 395 2 50 v -3 380 a(X)h(#=<)f(100)p 308 395 V 141 w(0..9:11..100)p 621 395 V 122 w(off)p 884 395 V 124 w Fm(none)p 1139 395 V -30 397 1170 2 v -30 480 a(In)c(this)f(example,)g(when)h(the)f(constrain)o(t)h Fh(X)22 b(#\\=)f(10)16 b Fm(is)g(p)q(osted)h(some)f(v)n(alues)g(are)h (lost,)f(the)g Fh(extra)p 1620 480 14 2 v 15 w(cstr)f Fm(is)i(then)-30 529 y(switc)o(hed)e(on.)j(Ho)o(w)o(ev)o(er,)c(p)q (osting)g(the)g(constrain)o(t)g Fh(X)22 b(#=<)f(100)13 b Fm(will)g(turn)h(o\013)g(the)g(\015ag)g(\(no)f(v)n(alues)h(are)g (lost\).)-30 629 y(Example)g(2:)p -30 693 1541 2 v -30 742 2 50 v -3 728 a(Constrain)o(t)g(on)f Fh(X)p 308 742 V 52 w Fm(Domain)f(of)k Fh(X)p 992 742 V 455 w(extra)p 1131 728 14 2 v 15 w(cstr)p 1255 742 2 50 v 50 w Fm(Lost)f(v)n(alues)p 1509 742 V -30 744 1541 2 v -30 794 2 50 v -3 779 a Fh(X)22 b(#=<)f(512)p 308 794 V 141 w(0..512)p 992 794 V 624 w(off)p 1255 794 V 124 w Fm(none)p 1509 794 V -30 796 1541 2 v -30 845 2 50 v -3 831 a Fh(X)h(#\\=)f(10)p 308 845 V 163 w(0..9:11..127)p 992 845 V 503 w(on)p 1255 845 V 135 w(128..512)p 1509 845 V -30 847 1541 2 v -30 897 2 50 v -3 882 a(X)h(#>=)f(256)p 308 897 V 141 w(Warning:)42 b(Vector)20 b(too)h(small...)p 992 897 V 134 w(on)p 1255 897 V 135 w(128..512)p 1509 897 V -30 899 1541 2 v -30 981 a Fm(In)c(this)g(example,)f(the)i(constrain)o(t)e Fh(X)22 b(#>=)f(256)16 b Fm(fails)g(due)h(to)f(the)h(lost)g(of)i Fh(128..512)c Fm(so)i(a)f(message)h(is)g(displa)o(y)o(ed)-30 1031 y(on)o(to)f(the)g(terminal.)23 b(The)17 b(solution)e(w)o(ould)g (consist)h(in)g(increasing)g(the)g(size)h(of)e(the)h(v)o(ector)h (either)g(b)o(y)e(setting)i(the)-30 1081 y(en)o(vironmen)o(t)d(v)n (ariable)f Fh(VECTORMAX)f Fm(\(e.g.)18 b(to)c Fh(512)p Fm(\))f(or)h(using)g Fh(fd)p 1025 1081 14 2 v 15 w(set)p 1106 1081 V 15 w(vector)p 1253 1081 V 15 w(max\(512\))p Fm(.)-30 1181 y(Finally)m(,)i(bit-v)o(ectors)i(are)g(not)f(dynamic,)g (i.e.)28 b(all)16 b(v)o(ectors)i(ha)o(v)o(e)f(the)h(same)g(size)g(\()p Fh(0..vector)p 1534 1181 V 14 w(max)p Fm(\).)27 b(So)17 b(the)h(use)-30 1230 y(of)k Fh(fd)p 73 1230 V 15 w(set)p 154 1230 V 15 w(vector)p 301 1230 V 14 w(max/1)c Fm(is)g(limited)f(to)i (the)g(initial)d(de\014nition)i(of)g(v)o(ector)h(sizes)h(and)e(m)o(ust) h(o)q(ccur)g(b)q(efore)h(an)o(y)-30 1280 y(constrain)o(t.)f(As)14 b(seen)h(b)q(efore,)f(the)g(solv)o(er)f(tries)i(to)e(displa)o(y)g(a)g (message)h(when)g(a)g(failure)e(o)q(ccurs)j(due)g(to)e(a)g(to)q(o)h (short)-30 1330 y Fh(vector)p 105 1330 V 15 w(max)p Fm(.)k (Unfortunately)m(,)13 b(in)g(some)h(cases)h(it)f(cannot)g(detect)i(the) e(lost)g(of)g(v)n(alues)f(and)h(no)g(message)h(is)e(emitted.)-30 1380 y(So)h(the)h(user)g(should)e(alw)o(a)o(ys)g(tak)o(e)h(care)h(to)f (this)f(parameter)i(to)f(b)q(e)g(sure)h(that)f(it)g(is)f(large)h(to)g (enco)q(de)h(an)o(y)e(v)o(ector.)-30 1546 y Ff(8.2)56 b(FD)19 b(v)m(ariable)e(parameters)-30 1672 y Fi(8.2.1)48 b Fh(fd)p 163 1672 V 16 w(max)p 245 1672 V 15 w(integer/1)-30 1799 y Fi(T)l(emplates)74 1880 y Fh(fd)p 121 1880 V 16 w(max)p 203 1880 V 15 w(integer\(?intege)o(r\))-30 1962 y Fi(Description)-30 2062 y Fh(fd)p 17 2062 V 16 w(max)p 99 2062 V 15 w(integer\(N\))12 b Fm(succeeds)k(if)g Fh(N)e Fm(is)g(the)g(curren)o(t)i(v)n(alue)d(of)j Fh(fd)p 1048 2062 V 16 w(max)p 1130 2062 V 15 w(integer)c Fm(\(section)j(8.1,)d (page)i(165\).)-30 2162 y Fi(Errors)p -30 2226 1890 2 v -30 2276 2 50 v -3 2261 a Fh(N)g Fm(is)f(neither)i(a)f(v)n(ariable)f (nor)g(an)h(in)o(teger)p 915 2276 V 281 w Fh(type)p 1032 2261 14 2 v 15 w(error\(integer,)19 b(N\))p 1859 2276 2 50 v -30 2277 1890 2 v -30 2361 a Fi(P)o(ortabilit)o(y)-30 2460 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2618 y Fi(8.2.2)48 b Fh(fd)p 163 2618 14 2 v 16 w(vector)p 311 2618 V 14 w(max/1)-30 2744 y Fi(T)l(emplates)74 2826 y Fh(fd)p 121 2826 V 16 w(vector)p 269 2826 V 14 w(max\(?integer\))-30 2908 y Fi(Description)p eop end %%Page: 167 169 TeXDict begin 167 168 bop -30 -45 a Fm(8.3)41 b(Initial)12 b(v)n(alue)i(constrain)o(ts)1305 b(167)p -30 -27 1890 4 v -30 115 a Fh(fd)p 17 115 14 2 v 16 w(vector)p 165 115 V 14 w(max\(N\))13 b Fm(succeeds)j(if)h Fh(N)c Fm(is)h(the)g (curren)o(t)i(v)n(alue)d(of)k Fh(vector)p 1115 115 V 14 w(max)c Fm(\(section)i(8.1,)d(page)i(165\).)-30 215 y Fi(Errors)p -30 279 1890 2 v -30 329 2 50 v -3 314 a Fh(N)g Fm(is)f(neither)i(a)f(v)n(ariable)f(nor)g(an)h(in)o(teger)p 915 329 V 281 w Fh(type)p 1032 314 14 2 v 15 w(error\(integer,)19 b(N\))p 1859 329 2 50 v -30 330 1890 2 v -30 414 a Fi(P)o(ortabilit)o (y)-30 513 y Fm(GNU)14 b(Prolog)f(predicate.)-30 671 y Fi(8.2.3)48 b Fh(fd)p 163 671 14 2 v 16 w(set)p 245 671 V 15 w(vector)p 392 671 V 14 w(max/1)-30 798 y Fi(T)l(emplates)74 881 y Fh(fd)p 121 881 V 16 w(set)p 203 881 V 15 w(vector)p 350 881 V 14 w(max\(+integer\))-30 964 y Fi(Description)-30 1063 y Fh(fd)p 17 1063 V 16 w(set)p 99 1063 V 15 w(vector)p 246 1063 V 14 w(max\(N\))9 b Fm(initializes)f Fh(vector)p 713 1063 V 15 w(max)h Fm(based)i(on)e(the)i(v)n(alue)e Fh(N)g Fm(\(section)i(8.1,)e(page)h(165\).)16 b(More)10 b(precisely)m(,)-30 1113 y(on)k(32)f(bit)h(mac)o(hines,)g Fh(vector)p 474 1113 V 14 w(max)f Fm(is)h(set)h(to)e(the)i(smallest)f (v)n(alue)f(of)j Fh(\(32*k\)-)p Fm(1)c(whic)o(h)i(is)g Fg(\025)g Fh(N)p Fm(.)-30 1213 y Fi(Errors)p -30 1268 1890 2 v -30 1318 2 50 v -3 1303 a Fh(N)g Fm(is)f(a)h(v)n(ariable)p 915 1318 V 689 w Fh(instantiation)p 1230 1303 14 2 v 13 w(error)p 1859 1318 2 50 v -30 1320 1890 2 v -30 1370 2 50 v -3 1355 a(N)g Fm(is)f(neither)i(a)f(v)n(ariable)f(nor)g(an)h(in) o(teger)p 915 1370 V 281 w Fh(type)p 1032 1355 14 2 v 15 w(error\(integer,)19 b(N\))p 1859 1370 2 50 v -30 1371 1890 2 v -30 1421 2 50 v -3 1406 a(N)14 b Fm(is)f(an)h(in)o(teger) g Fb(<)h Fm(0)p 915 1421 V 604 w Fh(domain)p 1076 1406 14 2 v 15 w(error\(not)p 1289 1406 V 13 w(less)p 1390 1406 V 15 w(than)p 1493 1406 V 15 w(zero,)21 b(N\))p 1859 1421 2 50 v -30 1423 1890 2 v -30 1505 a Fi(P)o(ortabilit)o(y)-30 1605 y Fm(GNU)14 b(Prolog)f(predicate.)-30 1771 y Ff(8.3)56 b(Initial)18 b(v)m(alue)f(constrain)n(ts)-30 1898 y Fi(8.3.1)48 b Fh(fd)p 163 1898 14 2 v 16 w(domain/3)p Fi(,)14 b Fh(fd)p 426 1898 V 15 w(domain)p 573 1898 V 15 w(bool/1)-30 2024 y Fi(T)l(emplates)74 2107 y Fh(fd)p 121 2107 V 16 w(domain\(+fd)p 357 2107 V 13 w(variable)p 546 2107 V 14 w(list)p 648 2107 V 15 w(or)p 707 2107 V 15 w(fd)p 766 2107 V 16 w(variable,)20 b(+integer,)f(+integer\))74 2157 y(fd)p 121 2157 V 16 w(domain\(?fd)p 357 2157 V 13 w(variable,)h(+integer,)g(+integer\))74 2207 y(fd)p 121 2207 V 16 w(domain)p 269 2207 V 14 w(bool\(+fd)p 459 2207 V 14 w(variable)p 649 2207 V 14 w(list\))74 2256 y(fd)p 121 2256 V 16 w(domain)p 269 2256 V 14 w(bool\(?fd)p 459 2256 V 14 w(variable\))-30 2339 y Fi(Description)-30 2439 y Fh(fd)p 17 2439 V 16 w(domain\(Vars,)f(Lower,)i(Upper\))12 b Fm(constrain)o(ts)j(eac)o(h)f(elemen)o(t)h Fh(X)e Fm(of)k Fh(Vars)c Fm(to)h(tak)o(e)g(a)f(v)n(alue)h(in)f Fh(Lower..Upper)p Fm(.)-30 2489 y(This)i(predicate)h(is)e(generally)h(used)g(to)g(set)g (the)g(initial)e(domain)g(of)h(v)n(ariables)g(to)h(an)f(in)o(terv)n (al.)20 b Fh(Vars)13 b Fm(can)i(b)q(e)g(also)f(a)-30 2539 y(single)g(FD)g(v)n(ariable)e(\(or)i(a)g(single)g(Prolog)f(v)n (ariable\).)-30 2638 y Fh(fd)p 17 2638 V 16 w(domain)p 165 2638 V 14 w(bool\(Vars\))19 b Fm(is)h(equiv)n(alen)o(t)g(to)h Fh(fd)p 772 2638 V 15 w(domain\(Vars,)f(0,)h(1\))f Fm(and)h(is)f(used)i (to)e(declare)i(b)q(o)q(olean)e(FD)-30 2688 y(v)n(ariables.)-30 2788 y Fi(Errors)p eop end %%Page: 168 170 TeXDict begin 168 169 bop -30 -45 a Fm(168)649 b(8)41 b(FINITE)14 b(DOMAIN)g(SOL)-5 b(VER)15 b(AND)f(BUIL)m(T-IN)g(PREDICA)m (TES)p -30 -27 1890 4 v -30 75 1890 2 v -30 125 2 50 v -3 110 a Fh(Vars)f Fm(is)h(not)g(a)f(v)n(ariable)g(but)h(is)g(a)f (partial)g(list)p 915 125 V 195 w Fh(instantiation)p 1230 110 14 2 v 13 w(error)p 1859 125 2 50 v -30 127 1890 2 v -30 226 2 100 v -3 161 a(Vars)g Fm(is)g(neither)i(a)f(v)n (ariable)e(nor)i(an)f(FD)h(v)n(ariable)f(nor)-3 211 y(an)h(in)o(teger)g (nor)g(a)g(list)p 915 226 V 941 161 a Fh(type)p 1032 161 14 2 v 15 w(error\(list,)19 b(Vars\))p 1859 226 2 100 v -30 228 1890 2 v -30 327 2 100 v -3 263 a Fm(an)13 b(elemen)o(t)i Fh(E)e Fm(of)g(the)h Fh(Vars)f Fm(list)g(is)h(neither)g (a)g(v)n(ariable)-3 312 y(nor)g(an)g(FD)f(v)n(ariable)g(nor)h(an)g(in)o (teger)p 915 327 V 941 263 a Fh(type)p 1032 263 14 2 v 15 w(error\(fd)p 1223 263 V 14 w(variable,)20 b(E\))p 1859 327 2 100 v -30 329 1890 2 v -30 379 2 50 v -3 364 a(Lower)13 b Fm(is)h(a)f(v)n(ariable)p 915 379 V 602 w Fh(instantiation)p 1230 364 14 2 v 13 w(error)p 1859 379 2 50 v -30 381 1890 2 v -30 430 2 50 v -3 415 a(Lower)g Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f(in)o(teger)p 915 430 V 194 w Fh(type)p 1032 415 14 2 v 15 w(error\(integer,)19 b(Lower\))p 1859 430 2 50 v -30 432 1890 2 v -30 482 2 50 v -3 467 a(Upper)13 b Fm(is)h(a)f(v)n(ariable)p 915 482 V 602 w Fh(instantiation)p 1230 467 14 2 v 13 w(error)p 1859 482 2 50 v -30 484 1890 2 v -30 533 2 50 v -3 518 a(Upper)g Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f (in)o(teger)p 915 533 V 194 w Fh(type)p 1032 518 14 2 v 15 w(error\(integer,)19 b(Upper\))p 1859 533 2 50 v -30 535 1890 2 v -30 618 a Fi(P)o(ortabilit)o(y)-30 717 y Fm(GNU)14 b(Prolog)f(predicate.)-30 875 y Fi(8.3.2)48 b Fh(fd)p 163 875 14 2 v 16 w(domain/2)-30 1002 y Fi(T)l(emplates)74 1085 y Fh(fd)p 121 1085 V 16 w(domain\(+fd)p 357 1085 V 13 w(variable)p 546 1085 V 14 w(list,)21 b(+integer)p 867 1085 V 14 w(list\))74 1134 y(fd)p 121 1134 V 16 w(domain\(?fd)p 357 1134 V 13 w(variable,)f(+integer)p 764 1134 V 14 w(list\))-30 1217 y Fi(Description)-30 1317 y Fh(fd)p 17 1317 V 16 w(domain\(Vars,)f(Values\))11 b Fm(constrain)o(ts)j(eac)o (h)f(elemen)o(t)h Fh(X)e Fm(of)h(the)g(list)f Fh(Vars)g Fm(to)h(tak)o(e)g(a)g(v)n(alue)f(in)g(the)i(list)e Fh(Values)p Fm(.)-30 1367 y(This)j(predicate)i(is)d(generally)h(used)h(to)f(set)h (the)g(initial)d(domain)g(of)i(v)n(ariables)f(to)h(a)g(set)h(of)e(v)n (alues.)22 b(The)15 b(domain)f(of)-30 1417 y(eac)o(h)k(v)n(ariable)d (of)k Fh(Vars)d Fm(uses)i(a)e(sparse)i(represen)o(tation.)28 b Fh(Vars)16 b Fm(can)h(b)q(e)g(also)f(a)g(single)h(FD)f(v)n(ariable)f (\(or)i(a)g(single)-30 1466 y(Prolog)d(v)n(ariable\).)-30 1566 y Fi(Errors)p -30 1622 1890 2 v -30 1672 2 50 v -3 1657 a Fh(Vars)f Fm(is)h(not)g(a)f(v)n(ariable)g(but)h(is)g(a)f (partial)g(list)p 915 1672 V 195 w Fh(instantiation)p 1230 1657 14 2 v 13 w(error)p 1859 1672 2 50 v -30 1673 1890 2 v -30 1773 2 100 v -3 1708 a(Vars)g Fm(is)g(neither)i(a)f(v)n (ariable)e(nor)i(an)f(FD)h(v)n(ariable)f(nor)-3 1758 y(an)h(in)o(teger)g(nor)g(a)g(list)p 915 1773 V 941 1708 a Fh(type)p 1032 1708 14 2 v 15 w(error\(list,)19 b(Vars\))p 1859 1773 2 100 v -30 1774 1890 2 v -30 1874 2 100 v -3 1809 a Fm(an)13 b(elemen)o(t)i Fh(E)e Fm(of)g(the)h Fh(Vars)f Fm(list)g(is)h(neither)g(a)g(v)n(ariable)-3 1859 y(nor)g(an)g(FD)f(v)n(ariable)g(nor)h(an)g(in)o(teger)p 915 1874 V 941 1809 a Fh(type)p 1032 1809 14 2 v 15 w(error\(fd)p 1223 1809 V 14 w(variable,)20 b(E\))p 1859 1874 2 100 v -30 1876 1890 2 v -30 1975 2 100 v -3 1911 a(Values)13 b Fm(is)g(a)h(partial)f(list)g(or)h(a)g(list)f(with)h(an)f(elemen)o(t) -3 1960 y Fh(E)h Fm(whic)o(h)f(is)h(a)g(v)n(ariable)p 915 1975 V 941 1911 a Fh(instantiation)p 1230 1911 14 2 v 13 w(error)p 1859 1975 2 100 v -30 1977 1890 2 v -30 2027 2 50 v -3 2012 a(Values)f Fm(is)g(neither)i(a)f(partial)f (list)g(nor)h(a)g(list)p 915 2027 V 214 w Fh(type)p 1032 2012 14 2 v 15 w(error\(list,)19 b(Values\))p 1859 2027 2 50 v -30 2029 1890 2 v -30 2128 2 100 v -3 2063 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Values)f Fm(list)g(is)h(neither) h(a)-3 2113 y(v)n(ariable)e(nor)h(an)f(in)o(teger)p 915 2128 V 941 2063 a Fh(type)p 1032 2063 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 2128 2 100 v -30 2130 1890 2 v -30 2213 a Fi(P)o(ortabilit)o(y)-30 2312 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2478 y Ff(8.4)56 b(T)n(yp)r(e)18 b(testing)-30 2605 y Fi(8.4.1)48 b Fh(fd)p 163 2605 14 2 v 16 w(var/1)p Fi(,)15 b Fh(non)p 383 2605 V 15 w(fd)p 442 2605 V 15 w(var/1)p Fi(,)g Fh(generic)p 749 2605 V 14 w(var/1)p Fi(,)h Fh(non)p 968 2605 V 15 w(generic)p 1137 2605 V 14 w(var/1)-30 2731 y Fi(T)l(emplates)p eop end %%Page: 169 171 TeXDict begin 169 170 bop -30 -45 a Fm(8.5)41 b(FD)14 b(v)n(ariable)e(information)1292 b(169)p -30 -27 1890 4 v 74 115 a Fh(fd)p 121 115 14 2 v 16 w(var\(?term\))74 165 y(non)p 143 165 V 15 w(fd)p 202 165 V 16 w(var\(?term\))1040 115 y(generic)p 1197 115 V 14 w(var\(?term\))1040 165 y(non)p 1109 165 V 15 w(generic)p 1278 165 V 14 w(var\(?term\))-30 264 y Fi(Description)-30 364 y Fh(fd)p 17 364 V 16 w(var\(Term\))12 b Fm(succeeds)k(if)h Fh(Term)c Fm(is)g(curren)o(tly)i(an)f(FD)f(v)n (ariable.)-30 464 y Fh(non)p 39 464 V 16 w(fd)p 99 464 V 15 w(var\(Term\))f Fm(succeeds)k(if)h Fh(Term)c Fm(is)g(curren)o(tly) i(not)f(an)g(FD)f(v)n(ariable)g(\(opp)q(osite)h(of)j Fh(fd)p 1488 464 V 15 w(var/1)p Fm(\).)-30 563 y Fh(generic)p 127 563 V 15 w(var\(Term\))12 b Fm(succeeds)k(if)g Fh(Term)d Fm(is)h(either)h(a)f(Prolog)f(v)n(ariable)f(or)i(an)g(FD)g(v)n (ariable.)-30 663 y Fh(non)p 39 663 V 16 w(generic)p 209 663 V 14 w(var\(Term\))h Fm(succeeds)k(if)h Fh(Term)c Fm(is)g(neither)i(a)f(Prolog)f(v)n(ariable)g(nor)g(an)h(FD)g(v)n (ariable)f(\(opp)q(osite)h(of)-30 713 y Fh(generic)p 127 713 V 15 w(var/1)p Fm(\).)-30 812 y Fi(Errors)-30 912 y Fm(None.)-30 1012 y Fi(P)o(ortabilit)o(y)-30 1111 y Fm(GNU)d(Prolog)f(predicate.)-30 1277 y Ff(8.5)56 b(FD)19 b(v)m(ariable)e(information)-30 1404 y Fm(These)h(predicate)f(allo)o(w) d(the)j(user)g(to)e(get)i(some)f(information)e(ab)q(out)h(FD)h(v)n (ariables.)23 b(They)17 b(are)f(not)g(constrain)o(ts,)-30 1453 y(they)f(only)e(return)i(the)g(curren)o(t)g(state)g(of)e(a)g(v)n (ariable.)-30 1611 y Fi(8.5.1)48 b Fh(fd)p 163 1611 V 16 w(min/2)p Fi(,)15 b Fh(fd)p 361 1611 V 15 w(max/2)p Fi(,)g Fh(fd)p 558 1611 V 15 w(size/2)p Fi(,)g Fh(fd)p 777 1611 V 16 w(dom/2)-30 1738 y Fi(T)l(emplates)74 1821 y Fh(fd)p 121 1821 V 16 w(min\(+fd)p 291 1821 V 14 w(variable,)20 b(?integer\))74 1870 y(fd)p 121 1870 V 16 w(max\(+fd)p 291 1870 V 14 w(variable,)g(?integer\))74 1920 y(fd)p 121 1920 V 16 w(size\(+fd)p 313 1920 V 14 w(variable,)f(?integer\))74 1970 y(fd)p 121 1970 V 16 w(dom\(+fd)p 291 1970 V 14 w(variable,)h(?integer)p 699 1970 V 14 w(list\))-30 2053 y Fi(Description)-30 2153 y Fh(fd)p 17 2153 V 16 w(min\(X,)g(N\))14 b Fm(succeeds)i(if)h Fh(N)c Fm(is)h(the)g(minimal)e(v)n(alue)h(of)g (the)i(curren)o(t)g(domain)e(of)j Fh(X)p Fm(.)-30 2252 y Fh(fd)p 17 2252 V 16 w(max\(X,)k(N\))14 b Fm(succeeds)i(if)h Fh(N)c Fm(is)h(the)g(maximal)e(v)n(alue)h(of)g(the)i(curren)o(t)g (domain)e(of)j Fh(X)p Fm(.)-30 2352 y Fh(fd)p 17 2352 V 16 w(size\(X,)k(N\))14 b Fm(succeeds)i(if)g Fh(N)e Fm(is)g(the)g(n)o(um)o(b)q(er)g(of)g(elemen)o(ts)g(of)g(the)g(curren)o (t)h(domain)e(of)k Fh(X)p Fm(.)-30 2452 y Fh(fd)p 17 2452 V 16 w(dom\(X,)j(Values\))13 b Fm(succeeds)j(if)g Fh(Values)d Fm(is)h(the)g(list)g(of)f(v)n(alues)h(of)f(the)h(curren)o (t)i(domain)c(of)17 b Fh(X)p Fm(.)-30 2551 y Fi(Errors)p -30 2607 1890 2 v -30 2657 2 50 v -3 2642 a Fh(X)d Fm(is)f(a)h(v)n (ariable)p 915 2657 V 689 w Fh(instantiation)p 1230 2642 14 2 v 13 w(error)p 1859 2657 2 50 v -30 2658 1890 2 v -30 2708 2 50 v -3 2693 a(X)g Fm(is)f(neither)i(an)f(FD)g(v)n (ariable)e(nor)i(an)g(in)o(teger)p 915 2708 V 185 w Fh(type)p 1032 2693 14 2 v 15 w(error\(fd)p 1223 2693 V 14 w(variable,)20 b(X\))p 1859 2708 2 50 v -30 2710 1890 2 v -30 2760 2 50 v -3 2745 a(N)14 b Fm(is)f(neither)i(a)f(v)n(ariable)f(nor)g(an)h (in)o(teger)p 915 2760 V 281 w Fh(type)p 1032 2745 14 2 v 15 w(error\(integer,)19 b(N\))p 1859 2760 2 50 v -30 2761 1890 2 v -30 2861 2 100 v -3 2796 a Fm(an)13 b(elemen)o(t)i Fh(E)e Fm(of)g(the)h Fh(Vars)f Fm(list)g(is)h(neither)g (a)g(v)n(ariable)-3 2846 y(nor)g(an)g(FD)f(v)n(ariable)g(nor)h(an)g(in) o(teger)p 915 2861 V 941 2796 a Fh(type)p 1032 2796 14 2 v 15 w(error\(fd)p 1223 2796 V 14 w(variable,)20 b(E\))p 1859 2861 2 100 v -30 2863 1890 2 v -30 2912 2 50 v -3 2897 a(Values)13 b Fm(is)g(neither)i(a)f(partial)f(list)g(nor)h(a)g (list)p 915 2912 V 214 w Fh(type)p 1032 2897 14 2 v 15 w(error\(list,)19 b(Values\))p 1859 2912 2 50 v -30 2914 1890 2 v eop end %%Page: 170 172 TeXDict begin 170 171 bop -30 -45 a Fm(170)649 b(8)41 b(FINITE)14 b(DOMAIN)g(SOL)-5 b(VER)15 b(AND)f(BUIL)m(T-IN)g(PREDICA)m (TES)p -30 -27 1890 4 v -30 115 a Fi(P)o(ortabilit)o(y)-30 215 y Fm(GNU)g(Prolog)f(predicate.)-30 372 y Fi(8.5.2)48 b Fh(fd)p 163 372 14 2 v 16 w(has)p 245 372 V 15 w(extra)p 370 372 V 14 w(cstr/1)p Fi(,)15 b Fh(fd)p 588 372 V 16 w(has)p 670 372 V 15 w(vector/1)p Fi(,)f Fh(fd)p 932 372 V 15 w(use)p 1013 372 V 15 w(vector/1)-30 499 y Fi(T)l(emplates)74 582 y Fh(fd)p 121 582 V 16 w(has)p 203 582 V 15 w(extra)p 328 582 V 14 w(cstr\(+fd)p 518 582 V 14 w(variable\))74 632 y(fd)p 121 632 V 16 w(has)p 203 632 V 15 w(vector\(+fd)p 438 632 V 13 w(variable\))74 681 y(fd)p 121 681 V 16 w(use)p 203 681 V 15 w(vector\(+fd)p 438 681 V 13 w(variable\))-30 764 y Fi(Description)-30 864 y Fh(fd)p 17 864 V 16 w(has)p 99 864 V 15 w(extra)p 224 864 V 14 w(cstr\(X\))f Fm(succeeds)j(if)d (the)i Fh(extra)p 791 864 V 15 w(cstr)e Fm(of)j Fh(X)e Fm(is)f(curren)o(tly)i(on)f(\(section)h(8.1,)d(page)i(165\).)-30 964 y Fh(fd)p 17 964 V 16 w(has)p 99 964 V 15 w(vector\(X\))8 b Fm(succeeds)13 b(if)c(the)i(curren)o(t)h(domain)d(of)k Fh(X)d Fm(uses)h(a)f(sparse)i(represen)o(tation)f(\(section)h(8.1,)d (page)h(165\).)-30 1063 y Fh(fd)p 17 1063 V 16 w(use)p 99 1063 V 15 w(vector\(X\))i Fm(enforces)j(a)f(sparse)h(represen)o (tation)g(for)f(the)g(domain)f(of)j Fh(X)e Fm(\(section)h(8.1,)d(page)i (165\).)-30 1163 y Fi(Errors)p -30 1218 1890 2 v -30 1268 2 50 v -3 1253 a Fh(X)g Fm(is)f(a)h(v)n(ariable)p 915 1268 V 689 w Fh(instantiation)p 1230 1253 14 2 v 13 w(error)p 1859 1268 2 50 v -30 1270 1890 2 v -30 1320 2 50 v -3 1305 a(X)g Fm(is)f(neither)i(an)f(FD)g(v)n(ariable)e(nor)i (an)g(in)o(teger)p 915 1320 V 185 w Fh(type)p 1032 1305 14 2 v 15 w(error\(fd)p 1223 1305 V 14 w(variable,)20 b(X\))p 1859 1320 2 50 v -30 1321 1890 2 v -30 1404 a Fi(P)o(ortabilit)o(y)-30 1504 y Fm(GNU)14 b(Prolog)f(predicates.)-30 1670 y Ff(8.6)56 b(Arithmetic)17 b(constrain)n(ts)-30 1796 y Fi(8.6.1)48 b(FD)16 b(arithmetic)f(expressions)-30 1923 y Fm(An)d(FD)g(arithmetic)g(expression)h(is)e(a)h(Prolog)f(term)h (built)f(from)g(in)o(tegers,)i(v)n(ariables)e(\(Prolog)g(or)h(FD)f(v)n (ariables\),)g(and)-30 1973 y(functors)16 b(\(or)f(op)q(erators\))h (that)f(represen)o(t)j(arithmetic)c(functions.)22 b(The)15 b(follo)o(wing)d(table)j(details)g(the)h(comp)q(onen)o(ts)-30 2022 y(of)e(an)f(FD)h(arithmetic)g(expression:)p eop end %%Page: 171 173 TeXDict begin 171 172 bop -30 -45 a Fm(8.6)41 b(Arithmetic)14 b(constrain)o(ts)1325 b(171)p -30 -27 1890 4 v -30 75 1651 2 v -30 125 2 50 v -3 110 a(FD)14 b(Expression)p 386 125 V 148 w(Result)p 1619 125 V -30 127 1651 2 v -30 136 V -30 186 2 50 v -3 171 a(Prolog)f(v)n(ariable)p 386 186 V 141 w(domain)f Fh(0..fd)p 673 171 14 2 v 15 w(max)p 754 171 V 15 w(integer)p 1619 186 2 50 v -30 188 1651 2 v -30 238 2 50 v -3 223 a Fm(FD)i(v)n(ariable)e Fh(X)p 386 238 V 166 w Fm(domain)g(of)17 b Fh(X)p 1619 238 V -30 239 1651 2 v -30 289 2 50 v -3 274 a Fm(in)o(teger)d(n)o(um)o (b)q(er)h Fh(N)p 386 289 V 105 w Fm(domain)d Fh(N..N)p 1619 289 V -30 291 1651 2 v -30 341 2 50 v -3 326 a(+)22 b(E)p 386 341 V 350 w Fm(same)14 b(as)g Fh(E)p 1619 341 V -30 342 1651 2 v -30 392 2 50 v -3 377 a(-)22 b(E)p 386 392 V 350 w Fm(opp)q(osite)14 b(of)j Fh(E)p 1619 392 V -30 394 1651 2 v -30 444 2 50 v -3 429 a(E1)k(+)h(E2)p 386 444 V 263 w Fm(sum)14 b(of)i Fh(E1)e Fm(and)f Fh(E2)p 1619 444 V -30 445 1651 2 v -30 495 2 50 v -3 480 a(E1)21 b(-)h(E2)p 386 495 V 263 w Fm(subtraction)14 b(of)j Fh(E2)c Fm(from)g Fh(E1)p 1619 495 V -30 497 1651 2 v -30 547 2 50 v -3 532 a(E1)21 b(*)h(E2)p 386 547 V 263 w Fm(m)o(ultiplication) 11 b(of)17 b Fh(E1)c Fm(b)o(y)h Fh(E2)p 1619 547 V -30 548 1651 2 v -30 598 2 50 v -3 583 a(E1)21 b(/)h(E2)p 386 598 V 263 w Fm(in)o(teger)14 b(division)f(of)j Fh(E1)e Fm(b)o(y)g Fh(E2)f Fm(\(only)h(succeeds)i(if)d(the)i(remainder)f(is)g (0\))p 1619 598 V -30 600 1651 2 v -30 650 2 50 v -3 635 a Fh(E1)21 b(**)h(E2)p 386 650 V 241 w(E1)13 b Fm(raised)i(to)e (the)i(p)q(o)o(w)o(er)f(of)j Fh(E2)k Fm(\()p Fh(E1)13 b Fm(or)h Fh(E2)g Fm(m)o(ust)g(b)q(e)g(an)g(in)o(teger\))p 1619 650 V -30 651 1651 2 v -30 701 2 50 v -3 686 a Fh(min\(E1,E2\))p 386 701 V 196 w Fm(minim)o(um)e(of)k Fh(E1)d Fm(and)h Fh(E2)p 1619 701 V -30 703 1651 2 v -30 753 2 50 v -3 738 a(max\(E1,E2\))p 386 753 V 196 w Fm(maxim)o(um)e(of)k Fh(E1)e Fm(and)f Fh(E2)p 1619 753 V -30 754 1651 2 v -30 804 2 50 v -3 789 a(dist\(E1,E2\))p 386 804 V 174 w Fm(distance,)h(i.e.)k Fg(j)p Fh(E1)i(-)i(E2)p Fg(j)p 1619 804 V -30 806 1651 2 v -30 855 2 50 v -3 841 a Fh(E1)f(//)h(E2)p 386 855 V 241 w Fm(quotien)o(t)14 b(of)f(the)h(in)o(teger)h(division)d (of)17 b Fh(E1)c Fm(b)o(y)h Fh(E2)p 1619 855 V -30 857 1651 2 v -30 907 2 50 v -3 892 a(E1)21 b(rem)h(E2)p 386 907 V 219 w Fm(remainder)14 b(of)f(the)i(in)o(teger)f(division)f(of)j Fh(E1)e Fm(b)o(y)g Fh(E2)p 1619 907 V -30 909 1651 2 v -30 1008 2 100 v -3 943 a(quot)p 88 943 14 2 v 15 w(rem\(E1,E2,R\))p 386 1008 2 100 v 49 w Fm(quotien)o(t)g(of)f(the)h(in)o(teger)h (division)d(of)17 b Fh(E1)c Fm(b)o(y)h Fh(E2)413 993 y Fm(\()p Fh(R)g Fm(is)f(the)i(remainder)f(of)f(the)i(in)o(teger)f (division)f(of)j Fh(E1)e Fm(b)o(y)g Fh(E2)p Fm(\))p 1619 1008 V -30 1010 1651 2 v -30 1093 a(FD)d(expressions)h(are)g(not)e (restricted)j(to)e(b)q(e)g(linear.)17 b(Ho)o(w)o(ev)o(er)11 b(non-linear)f(constrain)o(ts)h(usually)f(yield)g(less)i(constrain)o(t) -30 1142 y(propagation)h(than)h(linear)f(constrain)o(ts.)-30 1242 y Fh(+)p Fm(,)22 b Fh(-)p Fm(,)g Fh(*)p Fm(,)f Fh(/)p Fm(,)h Fh(//)p Fm(,)f Fh(rem)f Fm(and)g Fh(**)h Fm(are)g(prede\014ned)h (in\014x)e(op)q(erators.)39 b Fh(+)21 b Fm(and)f Fh(-)g Fm(are)h(prede\014ned)i(pre\014x)e(op)q(erators)-30 1292 y(\(section)15 b(7.14.10,)c(page)j(100\).)-30 1392 y Fi(Errors)p -30 1447 1890 2 v -30 1547 2 100 v -3 1482 a Fm(a)g(sub-expression)h(is)f(of)f(the)i(form)p 569 1482 14 2 v 50 w Fh(**)22 b(E)13 b Fm(and)h Fh(E)g Fm(is)f(a)-3 1532 y(v)n(ariable)p 915 1547 2 100 v 941 1482 a Fh(instantiation)p 1230 1482 14 2 v 13 w(error)p 1859 1547 2 100 v -30 1548 1890 2 v -30 1648 2 100 v -3 1583 a Fm(a)h(sub-expression)h Fh(E)f Fm(is)f(neither)i(a)f(v)n(ariable)f(nor)g(an)-3 1633 y(in)o(teger)h(nor)g(an)g(FD)g(arithmetic)f(functor)p 915 1648 V 941 1583 a Fh(type)p 1032 1583 14 2 v 15 w(error\(fd)p 1223 1583 V 14 w(evaluable,)20 b(E\))p 1859 1648 2 100 v -30 1650 1890 2 v -30 1700 2 50 v -3 1685 a Fm(an)14 b(expression)h(is)e(to)q(o)h(complex)p 915 1700 V 423 w Fh(resource)p 1120 1685 14 2 v 14 w(error\(too)p 1332 1685 V 14 w(big)p 1412 1685 V 15 w(fd)p 1471 1685 V 15 w(constraint\))p 1859 1700 2 50 v -30 1701 1890 2 v -30 1842 a Fi(8.6.2)48 b(P)o(artial)16 b(A)o(C:)g Fh(\(#=\)/2)f Fi(-)h(constrain)o(t)d(equal,)k Fh(\(#\\=\)/2)d Fi(-)i(constrain)o(t)e (not)h(equal,)116 1892 y Fh(\(#<\)/2)g Fi(-)h(constrain)o(t)e(less)h (than,)g Fh(\(#=<\)/2)g Fi(-)h(constrain)o(t)d(less)j(than)f(or)g (equal,)116 1942 y Fh(\(#>\)/2)g Fi(-)h(constrain)o(t)e(greater)g (than,)h Fh(\(#>=\)/2)g Fi(-)h(constrain)o(t)d(greater)i(than)g(or)g (equal)-30 2068 y(T)l(emplates)74 2151 y Fh(#=\(?fd)p 209 2151 14 2 v 15 w(evaluable,)k(?fd)p 529 2151 V 15 w(evaluable\))74 2201 y(#\\=\(?fd)p 231 2201 V 14 w(evaluable,)h(?fd)p 551 2201 V 15 w(evaluable\))74 2251 y(#<\(?fd)p 209 2251 V 15 w(evaluable,)f(?fd)p 529 2251 V 15 w(evaluable\))74 2301 y(#=<\(?fd)p 231 2301 V 14 w(evaluable,)h(?fd)p 551 2301 V 15 w(evaluable\))74 2350 y(#>\(?fd)p 209 2350 V 15 w(evaluable,)f(?fd)p 529 2350 V 15 w(evaluable\))74 2400 y(#>=\(?fd)p 231 2400 V 14 w(evaluable,)h(?fd)p 551 2400 V 15 w(evaluable\))-30 2483 y Fi(Description)-30 2583 y Fh(FdExpr1)h(#=)g(FdExpr2)13 b Fm(constrains)h Fh(FdExpr1)f Fm(to)g(b)q(e)i(equal)e(to)h Fh(FdExpr2)p Fm(.)-30 2683 y Fh(FdExpr1)21 b(#\\=)g(FdExpr2)12 b Fm(constrains)j Fh(FdExpr1)d Fm(to)i(b)q(e)h(di\013eren)o(t)f(from)g Fh(FdExpr2)p Fm(.)-30 2782 y Fh(FdExpr1)21 b(#<)g(FdExpr2)13 b Fm(constrains)h Fh(FdExpr1)f Fm(to)g(b)q(e)i(less)f(than)g Fh(FdExpr2)p Fm(.)-30 2882 y Fh(FdExpr1)21 b(#=<)g(FdExpr2)12 b Fm(constrains)j Fh(FdExpr1)d Fm(to)i(b)q(e)h(less)f(than)g(or)g (equal)f(to)h Fh(FdExpr2)p Fm(.)p eop end %%Page: 172 174 TeXDict begin 172 173 bop -30 -45 a Fm(172)649 b(8)41 b(FINITE)14 b(DOMAIN)g(SOL)-5 b(VER)15 b(AND)f(BUIL)m(T-IN)g(PREDICA)m (TES)p -30 -27 1890 4 v -30 115 a Fh(FdExpr1)21 b(#>)g(FdExpr2)13 b Fm(constrains)h Fh(FdExpr1)f Fm(to)g(b)q(e)i(greater)g(than)f Fh(FdExpr2)p Fm(.)-30 215 y Fh(FdExpr1)21 b(#>=)g(FdExpr2)12 b Fm(constrains)j Fh(FdExpr1)d Fm(to)i(b)q(e)h(greater)g(than)e(or)h (equal)g(to)g Fh(FdExpr2)p Fm(.)-30 314 y Fh(FdExpr1)f Fm(and)h Fh(FdExpr2)e Fm(are)i(arithmetic)g(FD)g(expressions)h (\(section)g(8.6.1,)d(page)h(170\).)-30 414 y Fh(#=)p Fm(,)g Fh(#\\=)p Fm(,)g Fh(#<)p Fm(,)g Fh(#=<)p Fm(,)g Fh(#>)g Fm(and)h Fh(#>=)f Fm(are)i(prede\014ned)g(in\014x)f(op)q (erators)g(\(section)h(7.14.10,)c(page)j(100\).)-30 513 y(These)d(predicates)g(p)q(ost)f(arithmetic)f(constrain)o(ts)h(that)g (are)f(managed)g(b)o(y)g(the)h(solv)o(er)g(using)f(a)g(partial)f (arc-consistency)-30 563 y(algorithm)14 b(to)g(reduce)j(the)f(domain)d (of)h(in)o(v)o(olv)o(ed)g(v)n(ariables.)20 b(In)15 b(this)g(sc)o(heme)h (only)e(the)i(b)q(ounds)f(of)g(the)g(domain)f(of)-30 613 y(v)n(ariables)g(are)g(up)q(dated.)19 b(This)14 b(leads)g(to)g (less)g(propagation)f(than)h(full)f(arc-consistency)i(tec)o(hniques)h (\(section)e(8.6.3,)-30 663 y(page)20 b(172\))f(but)h(is)g(generally)f (more)h(e\016cien)o(t)g(for)f(arithmetic.)35 b(These)21 b(arithmetic)f(constrain)o(ts)g(can)g(b)q(e)g(rei\014ed)-30 713 y(\(section)15 b(8.7,)e(page)g(173\).)-30 812 y Fi(Errors)-30 912 y Fm(Refer)i(to)e(the)i(syn)o(tax)f(of)f(arithmetic)h(FD)f (expressions)j(for)d(p)q(ossible)i(errors)g(\(section)f(8.6.1,)e(page)i (170\).)-30 1012 y Fi(P)o(ortabilit)o(y)-30 1111 y Fm(GNU)g(Prolog)f (predicates.)-30 1269 y Fi(8.6.3)48 b(F)l(ull)16 b(A)o(C:)h Fh(\(#=#\)/2)d Fi(-)i(constrain)o(t)e(equal,)i Fh(\(#\\=#\)/2)e Fi(-)i(constrain)o(t)e(not)h(equal,)116 1319 y Fh(\(#<#\)/2)g Fi(-)h(constrain)o(t)d(less)j(than,)f Fh(\(#=<#\)/2)f Fi(-)i(constrain)o(t)e(less)i(than)e(or)i(equal,)116 1369 y Fh(\(#>#\)/2)f Fi(-)h(constrain)o(t)d(greater)i(than,)g Fh(\(#>=#\)/2)f Fi(-)i(constrain)o(t)e(greater)h(than)f(or)i(equal)-30 1495 y(T)l(emplates)74 1578 y Fh(#=#\(?fd)p 231 1578 14 2 v 14 w(evaluable,)k(?fd)p 551 1578 V 15 w(evaluable\))74 1628 y(#\\=#\(?fd)p 253 1628 V 14 w(evaluable,)g(?fd)p 573 1628 V 15 w(evaluable\))74 1678 y(#<#\(?fd)p 231 1678 V 14 w(evaluable,)g(?fd)p 551 1678 V 15 w(evaluable\))74 1727 y(#=<#\(?fd)p 253 1727 V 14 w(evaluable,)g(?fd)p 573 1727 V 15 w(evaluable\))74 1777 y(#>#\(?fd)p 231 1777 V 14 w(evaluable,)g(?fd)p 551 1777 V 15 w(evaluable\))74 1827 y(#>=#\(?fd)p 253 1827 V 14 w(evaluable,)g(?fd)p 573 1827 V 15 w(evaluable\))-30 1910 y Fi(Description)-30 2010 y Fh(FdExpr1)h(#=#)g(FdExpr2)12 b Fm(constrains)j Fh(FdExpr1)d Fm(to)i(b)q(e)h(equal)e(to)h Fh(FdExpr2)p Fm(.)-30 2109 y Fh(FdExpr1)21 b(#\\=#)g(FdExpr2)12 b Fm(constrains)j Fh(FdExpr1)d Fm(to)i(b)q(e)g(di\013eren)o(t)h(from)e Fh(FdExpr2)p Fm(.)-30 2209 y Fh(FdExpr1)21 b(#<#)g(FdExpr2)12 b Fm(constrains)j Fh(FdExpr1)d Fm(to)i(b)q(e)h(less)f(than)g Fh(FdExpr2)p Fm(.)-30 2309 y Fh(FdExpr1)21 b(#=<#)g(FdExpr2)12 b Fm(constrains)j Fh(FdExpr1)d Fm(to)i(b)q(e)g(less)h(than)f(or)g (equal)f(to)h Fh(FdExpr2)p Fm(.)-30 2408 y Fh(FdExpr1)21 b(#>#)g(FdExpr2)12 b Fm(constrains)j Fh(FdExpr1)d Fm(to)i(b)q(e)h (greater)g(than)e Fh(FdExpr2)p Fm(.)-30 2508 y Fh(FdExpr1)21 b(#>=#)g(FdExpr2)12 b Fm(constrains)j Fh(FdExpr1)d Fm(to)i(b)q(e)g (greater)h(than)f(or)g(equal)g(to)f Fh(FdExpr2)p Fm(.)-30 2607 y Fh(FdExpr1)g Fm(and)h Fh(FdExpr2)e Fm(are)i(arithmetic)g(FD)g (expressions)h(\(section)g(8.6.1,)d(page)h(170\).)-30 2707 y Fh(#=#)p Fm(,)g Fh(#\\=#)p Fm(,)g Fh(#<#)p Fm(,)g Fh(#=<#)p Fm(,)f Fh(#>#)h Fm(and)h Fh(#>=#)f Fm(are)h(prede\014ned)i (in\014x)d(op)q(erators)i(\(section)g(7.14.10,)c(page)j(100\).)-30 2807 y(These)h(predicates)h(p)q(ost)e(arithmetic)g(constrain)o(ts)g (that)g(are)g(managed)f(b)o(y)h(the)g(solv)o(er)g(using)f(a)h(full)e (arc-consistency)-30 2856 y(algorithm)18 b(to)g(reduce)j(the)e(domain)e (of)h(in)o(v)o(olv)o(ed)g(v)n(ariables.)32 b(In)18 b(this)h(sc)o(heme)h (the)f(full)f(domain)f(of)h(v)n(ariables)g(is)-30 2906 y(up)q(dated.)g(This)11 b(leads)g(to)g(more)g(propagation)f(than)h (partial)f(arc-consistency)i(tec)o(hniques)h(\(section)f(8.6.1,)d(page) i(170\))p eop end %%Page: 173 175 TeXDict begin 173 174 bop -30 -45 a Fm(8.7)41 b(Bo)q(olean)14 b(and)f(rei\014ed)i(constrain)o(ts)1171 b(173)p -30 -27 1890 4 v -30 115 a(but)17 b(is)g(generally)f(less)h(e\016cien)o(t)g (for)g(arithmetic.)26 b(These)18 b(arithmetic)e(constrain)o(ts)h(can)g (b)q(e)h(rei\014ed)f(\(section)g(8.7.1,)-30 165 y(page)d(173\).)-30 264 y Fi(Errors)-30 364 y Fm(Refer)h(to)e(the)i(syn)o(tax)f(of)f (arithmetic)h(FD)f(expressions)j(for)d(p)q(ossible)i(errors)g (\(section)f(8.6.1,)e(page)i(170\).)-30 464 y Fi(P)o(ortabilit)o(y)-30 563 y Fm(GNU)g(Prolog)f(predicates.)-30 721 y Fi(8.6.4)48 b Fh(fd)p 163 721 14 2 v 16 w(prime/1)p Fi(,)14 b Fh(fd)p 404 721 V 16 w(not)p 486 721 V 15 w(prime/1)-30 847 y Fi(T)l(emplates)74 930 y Fh(fd)p 121 930 V 16 w(prime\(?fd)p 335 930 V 13 w(variable\))74 980 y(fd)p 121 980 V 16 w(not)p 203 980 V 15 w(prime\(?fd)p 416 980 V 13 w(variable\))-30 1063 y Fi(Description)-30 1163 y Fh(fd)p 17 1163 V 16 w(prime\(X\))h Fm(constrain)o(ts)j Fh(X)f Fm(to)g(b)q(e)g(a)g(prime)g (n)o(um)o(b)q(er)g(b)q(et)o(w)o(een)i Fh(0..vector)p 1266 1163 V 14 w(max)p Fm(.)27 b(This)17 b(constrain)o(t)g(enforces)h (a)-30 1213 y(sparse)e(represen)o(tation)f(for)f(the)g(domain)f(of)j Fh(X)e Fm(\(section)h(8.1,)d(page)i(165\).)-30 1312 y Fh(fd)p 17 1312 V 16 w(not)p 99 1312 V 15 w(prime\(X\))k Fm(constrain)o(ts)i Fh(X)f Fm(to)h(b)q(e)g(a)f(non)g(prime)h(n)o(um)o (b)q(er)f(b)q(et)o(w)o(een)i Fh(0..vector)p 1455 1312 V 14 w(max)p Fm(.)34 b(This)20 b(constrain)o(t)-30 1362 y(enforces)c(a)d(sparse)i(represen)o(tation)h(for)d(the)i(domain)e(of)j Fh(X)e Fm(\(section)g(8.1,)f(page)h(165\).)-30 1462 y Fi(Errors)p -30 1526 1890 2 v -30 1576 2 50 v -3 1561 a Fh(X)g Fm(is)f(neither)i(an)f(FD)g(v)n(ariable)e(nor)i(an)g(in)o (teger)p 915 1576 V 185 w Fh(type)p 1032 1561 14 2 v 15 w(error\(fd)p 1223 1561 V 14 w(variable,)20 b(X\))p 1859 1576 2 50 v -30 1578 1890 2 v -30 1661 a Fi(P)o(ortabilit)o(y)-30 1761 y Fm(GNU)14 b(Prolog)f(predicates.)-30 1927 y Ff(8.7)56 b(Bo)r(olean)18 b(and)h(rei\014ed)e(constrain)n(ts)-30 2053 y Fi(8.7.1)48 b(Bo)q(olean)16 b(FD)g(expressions)-30 2179 y Fm(An)c(b)q(o)q(olean)e(FD)h(expression)h(is)f(a)f(Prolog)h (term)g(built)f(from)g(in)o(tegers)i(\(0)f(for)g(false,)f(1)h(for)g (true\),)h(v)n(ariables)e(\(Prolog)g(or)-30 2229 y(FD)j(v)n (ariables\),)f(partial)g(A)o(C)g(arithmetic)h(constrain)o(ts)h (\(section)f(8.6.2,)e(page)i(171\),)f(full)f(A)o(C)i(arithmetic)f (constrain)o(ts)-30 2279 y(\(section)20 b(8.6.3,)d(page)i(172\))f(and)g (functors)i(\(or)e(op)q(erators\))i(that)f(represen)o(t)h(b)q(o)q (olean)f(functions.)32 b(When)19 b(a)f(sub-)-30 2329 y(expression)h(of)d(a)h(b)q(o)q(olean)g(expression)h(is)f(an)g (arithmetic)g(constrain)o(t)h Fd(c)7 b Fm(,)17 b(it)g(is)g(rei\014ed.) 29 b(Namely)m(,)16 b(as)h(so)q(on)g(as)h(the)-30 2379 y(solv)o(er)c(detects)i(that)d Fd(c)21 b Fm(is)13 b(true)i(\(i.e.)i Fe(entaile)n(d)t Fm(\))d(the)g(sub-expression)h(has)f(the)g(v)n(alue)f Fh(1)p Fm(.)18 b(Similarly)11 b(when)j(the)g(solv)o(er)-30 2429 y(detects)j(that)e Fd(c)21 b Fm(is)15 b(false)f(\(i.e.)20 b Fe(disentaile)n(d)t Fm(\))15 b(the)g(sub-expression)i(ev)n(aluates)d (as)h Fh(0)p Fm(.)20 b(While)14 b(neither)i(the)f(en)o(tailmen)o(t)-30 2478 y(nor)g(the)h(disen)o(tailmen)o(t)e(can)h(b)q(e)h(detected)h(the)e (sub-expression)i(is)d(ev)n(aluated)h(as)g(a)g(domain)e Fh(0..1)p Fm(.)20 b(The)c(follo)o(wing)-30 2528 y(table)e(details)g (the)g(comp)q(onen)o(ts)h(of)e(an)h(FD)g(b)q(o)q(olean)f(expression:)p eop end %%Page: 174 176 TeXDict begin 174 175 bop -30 -45 a Fm(174)649 b(8)41 b(FINITE)14 b(DOMAIN)g(SOL)-5 b(VER)15 b(AND)f(BUIL)m(T-IN)g(PREDICA)m (TES)p -30 -27 1890 4 v -30 75 1288 2 v -30 125 2 50 v -3 110 a(FD)g(Expression)p 296 125 V 58 w(Result)p 1256 125 V -30 127 1288 2 v -30 136 V -30 186 2 50 v -3 171 a(Prolog)f(v)n(ariable)p 296 186 V 51 w(domain)f Fh(0..1)p 1256 186 V -30 188 1288 2 v -30 238 2 50 v -3 223 a Fm(FD)i(v)n(ariable)e Fh(X)p 296 238 V 76 w Fm(domain)g(of)17 b Fh(X)p Fm(,)c Fh(X)g Fm(is)h(constrained)h(to)f(b)q (e)g(in)g Fh(0..1)p 1256 238 V -30 239 1288 2 v -30 289 2 50 v -3 274 a(0)g Fm(\(in)o(teger\))p 296 289 V 135 w Fh(0)f Fm(\(false\))p 1256 289 V -30 291 1288 2 v -30 341 2 50 v -3 326 a Fh(1)h Fm(\(in)o(teger\))p 296 341 V 135 w Fh(1)f Fm(\(true\))p 1256 341 V -30 342 1288 2 v -30 392 2 50 v -3 377 a Fh(#\\)21 b(E)p 296 392 V 239 w Fm(not)13 b Fh(E)p 1256 392 V -30 394 1288 2 v -30 444 2 50 v -3 429 a(E1)21 b(#<=>)g(E2)p 296 444 V 108 w(E1)13 b Fm(equiv)n(alen)o(t)g(to)h Fh(E2)p 1256 444 V -30 445 1288 2 v -30 495 2 50 v -3 480 a(E1)21 b(#\\<=>)g(E2)p 296 495 V 86 w(E1)13 b Fm(not)h(equiv)n(alen)o(t)f(to)h Fh(E2)f Fm(\(i.e.)18 b Fh(E1)13 b Fm(di\013eren)o(t)i(from)e Fh(E2\))p 1256 495 V -30 497 1288 2 v -30 547 2 50 v -3 532 a(E1)21 b(##)h(E2)p 296 547 V 151 w(E1)13 b Fm(exclusiv)o(e)h (OR)g Fh(E2)f Fm(\(i.e.)18 b Fh(E1)c Fm(not)f(equiv)n(alen)o(t)h(to)f Fh(E2\))p 1256 547 V -30 548 1288 2 v -30 598 2 50 v -3 583 a(E1)21 b(#==>)g(E2)p 296 598 V 108 w(E1)13 b Fm(implies)g Fh(E2)p 1256 598 V -30 600 1288 2 v -30 650 2 50 v -3 635 a(E1)21 b(#\\==>)g(E2)p 296 650 V 86 w(E1)13 b Fm(do)q(es)i(not)e(imply)g Fh(E2)p 1256 650 V -30 651 1288 2 v -30 701 2 50 v -3 686 a(E1)21 b(#/\\)h(E2)p 296 701 V 129 w(E1)13 b Fm(AND)h Fh(E2)p 1256 701 V -30 703 1288 2 v -30 753 2 50 v -3 738 a(E1)21 b(#\\/\\)g(E2)p 296 753 V 108 w(E1)13 b Fm(NAND)h Fh(E2)p 1256 753 V -30 754 1288 2 v -30 804 2 50 v -3 789 a(E1)21 b(#\\/)h(E2)p 296 804 V 129 w(E1)13 b Fm(OR)h Fh(E2)p 1256 804 V -30 806 1288 2 v -30 855 2 50 v -3 841 a(E1)21 b(#\\\\/)g(E2)p 296 855 V 108 w(E1)13 b Fm(NOR)h Fh(E2)p 1256 855 V -30 857 1288 2 v -30 940 a(#<=>)p Fm(,)e Fh(#\\<=>)p Fm(,)f Fh(##)p Fm(,)h Fh(#==>)p Fm(,)f Fh(#\\==>)p Fm(,)g Fh(#/\\)p Fm(,)h Fh(#\\/\\)p Fm(,)f Fh(#\\/)h Fm(and)h Fh(#\\\\/)e Fm(are)i(prede\014ned)h(in\014x)e(op)q(erators.)19 b Fh(#\\)12 b Fm(is)g(a)g(prede\014ned)-30 990 y(pre\014x)j(op)q(erator)f (\(section)h(7.14.10,)c(page)j(100\).)-30 1089 y Fi(Errors)p -30 1145 1890 2 v -30 1294 2 150 v -3 1180 a Fm(a)g(sub-expression)h Fh(E)f Fm(is)f(neither)i(a)f(v)n(ariable)f(nor)g(an)-3 1230 y(in)o(teger)h(\(0)g(or)g(1\))g(nor)g(an)f(FD)h(b)q(o)q(olean)f (functor)i(nor)-3 1279 y(rei\014ed)g(constrain)o(t)p 915 1294 V 941 1180 a Fh(type)p 1032 1180 14 2 v 15 w(error\(fd)p 1223 1180 V 14 w(bool)p 1325 1180 V 15 w(evaluable,)20 b(E\))p 1859 1294 2 150 v -30 1296 1890 2 v -30 1346 2 50 v -3 1331 a Fm(an)14 b(expression)h(is)e(to)q(o)h(complex)p 915 1346 V 423 w Fh(resource)p 1120 1331 14 2 v 14 w(error\(too)p 1332 1331 V 14 w(big)p 1412 1331 V 15 w(fd)p 1471 1331 V 15 w(constraint\))p 1859 1346 2 50 v -30 1348 1890 2 v -30 1447 2 100 v -3 1382 a Fm(a)g(sub-expression)h(is)f(an)f(in)o (v)n(alid)f(rei\014ed)j(constrain)o(t)p 915 1447 V 94 w(an)f(arithmetic)f(constrain)o(t)i(error)g(\(section)f(8.6.1,)941 1432 y(page)g(170\))p 1859 1447 V -30 1449 1890 2 v -30 1588 a Fi(8.7.2)48 b Fh(\(#\\\)/1)15 b Fi(-)h(constrain)o(t)e(NOT,)i Fh(\(#<=>\)/2)e Fi(-)i(constrain)o(t)e(equiv)m(alen)o(t,)116 1638 y Fh(\(#\\<=>\)/2)g Fi(-)i(constrain)o(t)e(di\013eren)o(t,)g Fh(\(##\)/2)h Fi(-)g(constrain)o(t)f(X)o(OR,)116 1687 y Fh(\(#==>\)/2)h Fi(-)g(constrain)o(t)f(imply)l(,)i Fh(\(#\\==>\)/2)e Fi(-)i(constrain)o(t)e(not)h(imply)l(,)116 1737 y Fh(\(#/\\\)/2)g Fi(-)h(constrain)o(t)d(AND,)k Fh(\(#\\/\\\)/2)d Fi(-)i(constrain)o(t)e(NAND,)116 1787 y Fh(\(#\\/\)/2)h Fi(-)h(constrain)o(t)d(OR,)j Fh(\(#\\\\/\)/2)f Fi(-)g(constrain)o(t)f(NOR)-30 1913 y(T)l(emplates)74 1987 y Fh(#\\\(?fd)p 209 1987 14 2 v 15 w(bool)p 312 1987 V 15 w(evaluable\))74 2037 y(#<=>\(?fd)p 253 2037 V 14 w(bool)p 355 2037 V 15 w(evaluable,)20 b(?fd)p 676 2037 V 15 w(bool)p 779 2037 V 15 w(evaluable\))74 2087 y(#\\<=>\(?fd)p 275 2087 V 14 w(bool)p 377 2087 V 15 w(evaluable,)g(?fd)p 698 2087 V 15 w(bool)p 801 2087 V 15 w(evaluable\))74 2137 y(##\(?fd)p 209 2137 V 15 w(bool)p 312 2137 V 15 w(evaluable,)f(?fd)p 632 2137 V 15 w(bool)p 735 2137 V 15 w(evaluable\))74 2187 y(#==>\(?fd)p 253 2187 V 14 w(bool)p 355 2187 V 15 w(evaluable,)h(?fd)p 676 2187 V 15 w(bool)p 779 2187 V 15 w(evaluable\))74 2236 y(#\\==>\(?fd)p 275 2236 V 14 w(bool)p 377 2236 V 15 w(evaluable,)g(?fd)p 698 2236 V 15 w(bool)p 801 2236 V 15 w(evaluable\))74 2286 y(#/\\\(?fd)p 231 2286 V 14 w(bool)p 333 2286 V 15 w(evaluable,)g(?fd)p 654 2286 V 15 w(bool)p 757 2286 V 15 w(evaluable\))74 2336 y(#\\/\\\(?fd)p 253 2336 V 14 w(bool)p 355 2336 V 15 w(evaluable,)g(?fd)p 676 2336 V 15 w(bool)p 779 2336 V 15 w(evaluable\))74 2386 y(#\\/\(?fd)p 231 2386 V 14 w(bool)p 333 2386 V 15 w(evaluable,)g(?fd)p 654 2386 V 15 w(bool)p 757 2386 V 15 w(evaluable\))74 2436 y(#\\\\/\(?fd)p 253 2436 V 14 w(bool)p 355 2436 V 15 w(evaluable,)g(?fd)p 676 2436 V 15 w(bool)p 779 2436 V 15 w(evaluable\))-30 2510 y Fi(Description)-30 2609 y Fh(#\\=)i(FdBoolExpr1)11 b Fm(constrain)o(ts)k Fh(FdBoolExpr1)c Fm(to)j(b)q(e)h(false.)-30 2709 y Fh(FdBoolExpr1)20 b(#<=>)h(FdBoolExpr2)12 b Fm(constrains)i Fh(FdBoolExpr1)e Fm(to)h(b)q(e)i(equiv)n(alen)o(t)e(to)h Fh(FdBoolExpr2)p Fm(.)-30 2808 y Fh(FdBoolExpr1)20 b(#\\<=>)h (FdBoolExpr2)11 b Fm(constrains)k Fh(FdBoolExpr1)c Fm(to)j(b)q(e)h (equiv)n(alen)o(t)e(to)h(not)f Fh(FdBoolExpr2)p Fm(.)-30 2908 y Fh(FdBoolExpr1)20 b(##)h(FdBoolExpr2)12 b Fm(constrains)j Fh(FdBoolExpr1)c Fm(X)o(OR)j Fh(FdBoolExpr2)d Fm(to)j(b)q(e)h(true)p eop end %%Page: 175 177 TeXDict begin 175 176 bop -30 -45 a Fm(8.7)41 b(Bo)q(olean)14 b(and)f(rei\014ed)i(constrain)o(ts)1171 b(175)p -30 -27 1890 4 v -30 115 a Fh(FdBoolExpr1)20 b(#==>)h(FdBoolExpr2)12 b Fm(constrains)i Fh(FdBoolExpr1)e Fm(to)h(imply)g Fh(FdBoolExpr2)p Fm(.)-30 215 y Fh(FdBoolExpr1)20 b(#\\==>)h(FdBoolExpr2)11 b Fm(constrains)k Fh(FdBoolExpr1)c Fm(to)j(not)g(imply)f Fh(FdBoolExpr2)p Fm(.)-30 314 y Fh(FdBoolExpr1)20 b(#/\\)h(FdBoolExpr2) 12 b Fm(constrains)i Fh(FdBoolExpr1)e Fm(AND)i Fh(FdBoolExpr2)d Fm(to)j(b)q(e)g(true.)-30 414 y Fh(FdBoolExpr1)20 b(#\\/\\)h (FdBoolExpr2)12 b Fm(constrains)i Fh(FdBoolExpr1)e Fm(AND)h Fh(FdBoolExpr2)f Fm(to)i(b)q(e)g(false.)-30 513 y Fh(FdBoolExpr1)20 b(#\\/)h(FdBoolExpr2)12 b Fm(constrains)i Fh(FdBoolExpr1)e Fm(OR)i Fh(FdBoolExpr2)d Fm(to)j(b)q(e)g(true.)-30 613 y Fh(FdBoolExpr1)20 b(#\\\\/)h(FdBoolExpr2)12 b Fm(constrains)i Fh(FdBoolExpr1)e Fm(OR)h Fh(FdBoolExpr2)f Fm(to)i(b)q(e)g(false.)-30 713 y Fh(FdBoolExpr1)e Fm(and)i Fh(FdBoolExpr2)d Fm(are)k(b)q(o)q (olean)e(FD)h(expressions)h(\(section)g(8.7.1,)d(page)i(173\).)-30 812 y(Note)h(that)f Fh(#\\<=>)f Fm(\(not)g(equiv)n(alen)o(t\))h(and)g Fh(##)f Fm(\(exclusiv)o(e)h(or\))g(are)h(synon)o(ymous.)-30 912 y(These)23 b(predicates)g(p)q(ost)f(b)q(o)q(olean)g(constrain)o(ts) g(that)f(are)h(managed)f(b)o(y)h(the)g(FD)f(solv)o(er)h(using)f(a)g (partial)g(arc-)-30 962 y(consistency)f(algorithm)c(to)i(reduce)i(the)e (domain)f(of)g(in)o(v)o(olv)o(ed)g(v)n(ariables.)29 b(The)19 b(\(dis\)en)o(tailmen)o(t)e(of)g(rei\014ed)i(con-)-30 1012 y(strain)o(ts)f(is)f(detected)i(using)d(either)i(the)g(b)q(ounds)f (\(for)g(partial)f(A)o(C)h(arithmetic)g(constrain)o(ts\))g(or)g(the)h (full)d(domain)-30 1061 y(\(for)f(full)f(A)o(C)h(arithmetic)f (constrain)o(ts\).)-30 1161 y Fh(#<=>)p Fm(,)f Fh(#\\<=>)p Fm(,)f Fh(##)p Fm(,)h Fh(#==>)p Fm(,)f Fh(#\\==>)p Fm(,)g Fh(#/\\)p Fm(,)h Fh(#\\/\\)p Fm(,)f Fh(#\\/)h Fm(and)h Fh(#\\\\/)e Fm(are)i(prede\014ned)h(in\014x)e(op)q(erators.)19 b Fh(#\\)12 b Fm(is)g(a)g(prede\014ned)-30 1211 y(pre\014x)j(op)q (erator)f(\(section)h(7.14.10,)c(page)j(100\).)-30 1310 y Fi(Errors)-30 1410 y Fm(Refer)h(to)e(the)i(syn)o(tax)f(of)f(b)q(o)q (olean)h(FD)f(expressions)j(for)d(p)q(ossible)h(errors)h(\(section)g (8.7.1,)d(page)i(173\).)-30 1510 y Fi(P)o(ortabilit)o(y)-30 1609 y Fm(GNU)g(Prolog)f(predicates.)-30 1767 y Fi(8.7.3)48 b Fh(fd)p 163 1767 14 2 v 16 w(cardinality/2)p Fi(,)13 b Fh(fd)p 535 1767 V 15 w(cardinality/3)p Fi(,)h Fh(fd)p 907 1767 V 15 w(at)p 966 1767 V 15 w(least)p 1091 1767 V 15 w(one/1)p Fi(,)h Fh(fd)p 1288 1767 V 15 w(at)p 1347 1767 V 16 w(most)p 1451 1767 V 15 w(one/1)p Fi(,)116 1817 y Fh(fd)p 163 1817 V 16 w(only)p 267 1817 V 14 w(one/1)-30 1943 y Fi(T)l(emplates)74 2026 y Fh(fd)p 121 2026 V 16 w(cardinality\(+fd)p 466 2026 V 12 w(bool)p 567 2026 V 15 w(evaluable)p 780 2026 V 14 w(list,)21 b(?fd)p 991 2026 V 15 w(variable\))74 2076 y(fd)p 121 2076 V 16 w(cardinality\(+in) o(teger)o(,)e(?fd)p 682 2076 V 15 w(variable,)h(+integer\))74 2126 y(fd)p 121 2126 V 16 w(at)p 181 2126 V 15 w(least)p 306 2126 V 14 w(one\(+fd)p 474 2126 V 15 w(bool)p 577 2126 V 15 w(evaluable)p 790 2126 V 13 w(list\))74 2176 y(fd)p 121 2176 V 16 w(at)p 181 2176 V 15 w(most)p 284 2176 V 15 w(one\(+fd)p 453 2176 V 14 w(bool)p 555 2176 V 15 w(evaluable)p 768 2176 V 14 w(list\))74 2226 y(fd)p 121 2226 V 16 w(only)p 225 2226 V 14 w(one\(+fd)p 393 2226 V 15 w(bool)p 496 2226 V 14 w(evaluable)p 708 2226 V 14 w(list\))-30 2309 y Fi(Description)-30 2408 y Fh(fd)p 17 2408 V 16 w(cardinality\(List)o(,)f(Count\))g Fm(uni\014es)h Fh(Count)f Fm(with)g(the)i(n)o(um)o(b)q(er)f(of)f(constrain)o(ts)h (that)g(are)g(true)h(in)f Fh(List)p Fm(.)-30 2458 y(This)14 b(is)g(equiv)n(alen)o(t)f(to)g(p)q(ost)h(the)h(constrain)o(t)f Fh(B)734 2464 y Fl(1)774 2458 y Fh(+)22 b(B)840 2464 y Fl(2)880 2458 y Fh(+)f(...+)g(B)1054 2464 y Fc(n)1099 2458 y Fh(#=)g(Count)13 b Fm(where)i(eac)o(h)f(v)n(ariable)e Fh(Bi)i Fm(is)f(a)h(new)-30 2508 y(v)n(ariable)f(de\014ned)i(b)o(y)f (the)g(constrain)o(t)g Fh(B)615 2514 y Fc(i)651 2508 y Fh(#<=>)21 b(C)782 2514 y Fc(i)809 2508 y Fm(where)15 b Fh(C)951 2514 y Fc(i)978 2508 y Fm(is)f(the)g Fh(i)p Fe(th)j Fm(constrain)o(t)d(of)j Fh(List)p Fm(.)g(Eac)o(h)d Fh(C)1653 2514 y Fc(i)1680 2508 y Fm(m)o(ust)g(b)q(e)g(a)-30 2558 y(b)q(o)q(olean)g(FD)g(expression)h(\(section)f(8.7.1,)e(page)i (173\).)-30 2657 y Fh(fd)p 17 2657 V 16 w(cardinality\(Lowe)o(r,)19 b(List,)i(Upper\))f Fm(is)h(equiv)n(alen)o(t)f(to)h Fh(fd)p 1085 2657 V 15 w(cardinality\(List,)e(Count\),)h(Lower)h(#=<)-30 2707 y(Count,)g(Count)g(#=<)g(Upper)-30 2807 y(fd)p 17 2807 V 16 w(at)p 77 2807 V 15 w(least)p 202 2807 V 15 w(one\(List\))12 b Fm(is)h(equiv)n(alen)o(t)h(to)f Fh(fd)p 760 2807 V 16 w(cardinality\(Lis)o(t,)19 b(Count\),)h(Count)h(#>=)g(1)p Fm(.)-30 2906 y Fh(fd)p 17 2906 V 16 w(at)p 77 2906 V 15 w(most)p 180 2906 V 15 w(one\(List\))12 b Fm(is)i(equiv)n(alen)o(t)f (to)h Fh(fd)p 739 2906 V 15 w(cardinality\(List)o(,)19 b(Count\),)h(Count)h(#=<)g(1)p Fm(.)p eop end %%Page: 176 178 TeXDict begin 176 177 bop -30 -45 a Fm(176)649 b(8)41 b(FINITE)14 b(DOMAIN)g(SOL)-5 b(VER)15 b(AND)f(BUIL)m(T-IN)g(PREDICA)m (TES)p -30 -27 1890 4 v -30 115 a Fh(fd)p 17 115 14 2 v 16 w(only)p 121 115 V 15 w(one\(List\))e Fm(is)h(equiv)n(alen)o(t)h (to)f Fh(fd)p 679 115 V 16 w(cardinality\(Lis)o(t,)19 b(1\))p Fm(.)-30 215 y Fi(Errors)p -30 270 1890 2 v -30 320 2 50 v -3 305 a Fh(List)13 b Fm(is)h(a)f(partial)g(list)p 915 320 V 577 w Fh(instantiation)p 1230 305 14 2 v 13 w(error)p 1859 320 2 50 v -30 322 1890 2 v -30 371 2 50 v -3 356 a(List)g Fm(is)h(neither)h(a)e(partial)g(list)g(nor)h(a)g (list)p 915 371 V 258 w Fh(type)p 1032 356 14 2 v 15 w(error\(list,)19 b(List\))p 1859 371 2 50 v -30 373 1890 2 v -30 423 2 50 v -3 408 a(Count)13 b Fm(is)h(neither)g(an)g(FD)g (v)n(ariable)e(nor)i(an)g(in)o(teger)p 915 423 V 98 w Fh(type)p 1032 408 14 2 v 15 w(error\(fd)p 1223 408 V 14 w(variable,)20 b(Count\))p 1859 423 2 50 v -30 425 1890 2 v -30 474 2 50 v -3 459 a(Lower)13 b Fm(is)h(a)f(v)n(ariable)p 915 474 V 602 w Fh(instantiation)p 1230 459 14 2 v 13 w(error)p 1859 474 2 50 v -30 476 1890 2 v -30 526 2 50 v -3 511 a(Lower)g Fm(is)h(neither)g(a)g(v)n(ariable)f(nor)h(an)f (in)o(teger)p 915 526 V 194 w Fh(type)p 1032 511 14 2 v 15 w(error\(integer,)19 b(Lower\))p 1859 526 2 50 v -30 528 1890 2 v -30 577 2 50 v -3 562 a(Upper)13 b Fm(is)h(a)f(v)n (ariable)p 915 577 V 602 w Fh(instantiation)p 1230 562 14 2 v 13 w(error)p 1859 577 2 50 v -30 579 1890 2 v -30 629 2 50 v -3 614 a(Upper)g Fm(is)h(neither)g(a)g(v)n(ariable)f (nor)h(an)f(in)o(teger)p 915 629 V 194 w Fh(type)p 1032 614 14 2 v 15 w(error\(integer,)19 b(Upper\))p 1859 629 2 50 v -30 630 1890 2 v -30 730 2 100 v -3 665 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(List)f Fm(list)h(is)g(an)f(in)o (v)n(alid)-3 715 y(b)q(o)q(olean)h(expression)p 915 730 V 941 665 a(an)g(FD)f(b)q(o)q(olean)h(constrain)o(t)g(\(section)h (8.7.1,)941 715 y(page)f(173\))p 1859 730 V -30 732 1890 2 v -30 815 a Fi(P)o(ortabilit)o(y)-30 914 y Fm(GNU)g(Prolog)f (predicates.)-30 1080 y Ff(8.8)56 b(Sym)n(b)r(olic)17 b(constrain)n(ts)-30 1207 y Fi(8.8.1)48 b Fh(fd)p 163 1207 14 2 v 16 w(all)p 245 1207 V 15 w(different/1)-30 1333 y Fi(T)l(emplates)74 1416 y Fh(fd)p 121 1416 V 16 w(all)p 203 1416 V 15 w(different\(+fd)p 504 1416 V 13 w(variable)p 693 1416 V 14 w(list\))-30 1499 y Fi(Description)-30 1599 y Fh(fd)p 17 1599 V 16 w(all)p 99 1599 V 15 w(different\(List\))13 b Fm(constrains)j(all)f(v)n(ariables)g(in)h Fh(List)f Fm(to)h(tak)o(e)g(distinct)g(v)n(alues.)24 b(This)16 b(is)g(equiv)n(alen)o(t)f(to)-30 1649 y(p)q(osting)h(an)f(inequalit)o (y)f(constrain)o(t)i(for)f(eac)o(h)h(pair)f(of)g(v)n(ariables.)22 b(This)16 b(constrain)o(t)g(is)f(triggered)h(when)g(a)f(v)n(ariable)-30 1698 y(b)q(ecomes)h(ground,)d(remo)o(ving)g(its)h(v)n(alue)f(from)g (the)i(domain)d(of)i(the)g(other)h(v)n(ariables.)-30 1798 y Fi(Errors)p -30 1854 1890 2 v -30 1903 2 50 v -3 1888 a Fh(List)e Fm(is)h(a)f(partial)g(list)p 915 1903 V 577 w Fh(instantiation)p 1230 1888 14 2 v 13 w(error)p 1859 1903 2 50 v -30 1905 1890 2 v -30 1955 2 50 v -3 1940 a(List)g Fm(is)h(neither)h(a)e(partial)g(list)g(nor)h(a)g(list)p 915 1955 V 258 w Fh(type)p 1032 1940 14 2 v 15 w(error\(list,)19 b(List\))p 1859 1955 2 50 v -30 1957 1890 2 v -30 2056 2 100 v -3 1991 a Fm(an)13 b(elemen)o(t)i Fh(E)e Fm(of)g(the)h Fh(List)f Fm(list)g(is)h(neither)g(a)g(v)n(ariable)-3 2041 y(nor)g(an)g(in)o(teger)g(nor)g(an)g(FD)f(v)n(ariable)p 915 2056 V 941 1991 a Fh(type)p 1032 1991 14 2 v 15 w(error\(fd)p 1223 1991 V 14 w(variable,)20 b(E\))p 1859 2056 2 100 v -30 2058 1890 2 v -30 2141 a Fi(P)o(ortabilit)o(y)-30 2240 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2398 y Fi(8.8.2)48 b Fh(fd)p 163 2398 14 2 v 16 w(element/3)-30 2524 y Fi(T)l(emplates)74 2607 y Fh(fd)p 121 2607 V 16 w(element\(?fd)p 379 2607 V 13 w(variable,)20 b(+integer)p 786 2607 V 14 w(list,)h(?fd)p 997 2607 V 15 w(variable\))-30 2690 y Fi(Description)-30 2790 y Fh(fd)p 17 2790 V 16 w(element\(I,)e(List,)i(X\))14 b Fm(constrain)o(ts)g Fh(X)g Fm(to)g(b)q(e)g(equal)g(to)f(the)i Fh(I)p Fe(th)i Fm(in)o(teger)d(\(from)f(1\))h(of)j Fh(List)p Fm(.)-30 2890 y Fi(Errors)p eop end %%Page: 177 179 TeXDict begin 177 178 bop -30 -45 a Fm(8.8)41 b(Sym)o(b)q(olic)13 b(constrain)o(ts)1357 b(177)p -30 -27 1890 4 v -30 75 1890 2 v -30 175 2 100 v -3 110 a Fh(I)14 b Fm(is)f(neither)i(a)f(v)n (ariable)f(nor)g(an)h(FD)g(v)n(ariable)f(nor)g(an)-3 160 y(in)o(teger)p 915 175 V 941 110 a Fh(type)p 1032 110 14 2 v 15 w(error\(fd)p 1223 110 V 14 w(variable,)20 b(I\))p 1859 175 2 100 v -30 176 1890 2 v -30 276 2 100 v -3 211 a(X)14 b Fm(is)f(neither)i(a)f(v)n(ariable)f(nor)g(an)h(FD)g (v)n(ariable)f(nor)g(an)-3 261 y(in)o(teger)p 915 276 V 941 211 a Fh(type)p 1032 211 14 2 v 15 w(error\(fd)p 1223 211 V 14 w(variable,)20 b(X\))p 1859 276 2 100 v -30 278 1890 2 v -30 377 2 100 v -3 312 a(List)13 b Fm(is)h(a)f (partial)g(list)h(or)g(a)f(list)h(with)f(an)h(elemen)o(t)g Fh(E)-3 362 y Fm(whic)o(h)g(is)g(a)f(v)n(ariable)p 915 377 V 941 312 a Fh(instantiation)p 1230 312 14 2 v 13 w(error)p 1859 377 2 100 v -30 379 1890 2 v -30 429 2 50 v -3 414 a(List)g Fm(is)h(neither)h(a)e(partial)g(list)g(nor)h(a)g (list)p 915 429 V 258 w Fh(type)p 1032 414 14 2 v 15 w(error\(list,)19 b(List\))p 1859 429 2 50 v -30 430 1890 2 v -30 530 2 100 v -3 465 a Fm(an)13 b(elemen)o(t)i Fh(E)e Fm(of)g(the)h Fh(List)f Fm(list)g(is)h(neither)g(a)g(v)n (ariable)-3 515 y(nor)g(an)g(in)o(teger)p 915 530 V 941 465 a Fh(type)p 1032 465 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 530 2 100 v -30 532 1890 2 v -30 614 a Fi(P)o(ortabilit)o (y)-30 714 y Fm(GNU)14 b(Prolog)f(predicate.)-30 872 y Fi(8.8.3)48 b Fh(fd)p 163 872 14 2 v 16 w(element)p 333 872 V 14 w(var/3)-30 998 y Fi(T)l(emplates)74 1081 y Fh(fd)p 121 1081 V 16 w(element)p 291 1081 V 14 w(var\(?fd)p 459 1081 V 14 w(variable,)20 b(+fd)p 757 1081 V 15 w(variable)p 948 1081 V 14 w(list,)h(?fd)p 1159 1081 V 15 w(variable\))-30 1164 y Fi(Description)-30 1264 y Fh(fd)p 17 1264 V 16 w(element)p 187 1264 V 14 w(var\(I,)g(List,)f(X\))f Fm(constrain)o(ts)i Fh(X)e Fm(to)h(b)q(e)g(equal)f(to)h(the)g Fh(I)p Fe(th)j Fm(v)n(ariable)18 b(\(from)h(1\))h(of)i Fh(List)p Fm(.)34 b(This)-30 1314 y(constrain)o(t)17 b(is)e(similar)f(to)i Fh(fd)p 449 1314 V 15 w(element/3)e Fm(\(section)j(8.8.2,)d(page)h (176\))g(but)h Fh(List)f Fm(can)h(also)f(con)o(tain)g(FD)h(v)n (ariables)-30 1364 y(\(rather)f(than)f(just)g(in)o(tegers\).)-30 1463 y Fi(Errors)p -30 1519 1890 2 v -30 1618 2 100 v -3 1554 a Fh(I)g Fm(is)f(neither)i(a)f(v)n(ariable)f(nor)g(an)h(FD)g(v) n(ariable)f(nor)g(an)-3 1603 y(in)o(teger)p 915 1618 V 941 1554 a Fh(type)p 1032 1554 14 2 v 15 w(error\(fd)p 1223 1554 V 14 w(variable,)20 b(I\))p 1859 1618 2 100 v -30 1620 1890 2 v -30 1720 2 100 v -3 1655 a(X)14 b Fm(is)f(neither)i(a)f(v)n(ariable)f(nor)g(an)h(FD)g(v)n(ariable)f(nor)g (an)-3 1705 y(in)o(teger)p 915 1720 V 941 1655 a Fh(type)p 1032 1655 14 2 v 15 w(error\(fd)p 1223 1655 V 14 w(variable,)20 b(X\))p 1859 1720 2 100 v -30 1721 1890 2 v -30 1771 2 50 v -3 1756 a(List)13 b Fm(is)h(a)f(partial)g(list)p 915 1771 V 577 w Fh(instantiation)p 1230 1756 14 2 v 13 w(error)p 1859 1771 2 50 v -30 1773 1890 2 v -30 1823 2 50 v -3 1808 a(List)g Fm(is)h(neither)h(a)e(partial)g(list)g(nor)h(a) g(list)p 915 1823 V 258 w Fh(type)p 1032 1808 14 2 v 15 w(error\(list,)19 b(List\))p 1859 1823 2 50 v -30 1824 1890 2 v -30 1924 2 100 v -3 1859 a Fm(an)13 b(elemen)o(t)i Fh(E)e Fm(of)g(the)h Fh(List)f Fm(list)g(is)h(neither)g(a)g(v)n (ariable)-3 1909 y(nor)g(an)g(in)o(teger)g(nor)g(an)g(FD)f(v)n(ariable) p 915 1924 V 941 1859 a Fh(type)p 1032 1859 14 2 v 15 w(error\(fd)p 1223 1859 V 14 w(variable,)20 b(E\))p 1859 1924 2 100 v -30 1926 1890 2 v -30 2008 a Fi(P)o(ortabilit)o(y)-30 2108 y Fm(GNU)14 b(Prolog)f(predicate.)-30 2266 y Fi(8.8.4)48 b Fh(fd)p 163 2266 14 2 v 16 w(atmost/3)p Fi(,)14 b Fh(fd)p 426 2266 V 15 w(atleast/3)p Fi(,)h Fh(fd)p 711 2266 V 15 w(exactly/3)-30 2392 y Fi(T)l(emplates)74 2475 y Fh(fd)p 121 2475 V 16 w(atmost\(+integer)o(,)k(+fd)p 573 2475 V 15 w(variable)p 764 2475 V 14 w(list,)i(+integer\))74 2525 y(fd)p 121 2525 V 16 w(atleast\(+intege)o(r,)e(+fd)p 595 2525 V 15 w(variable)p 786 2525 V 14 w(list,)i(+integer\))74 2575 y(fd)p 121 2575 V 16 w(exactly\(+intege)o(r,)e(+fd)p 595 2575 V 15 w(variable)p 786 2575 V 14 w(list,)i(+integer\))-30 2658 y Fi(Description)-30 2757 y Fh(fd)p 17 2757 V 16 w(atmost\(N,)f(List,)g(V\))14 b Fm(p)q(osts)h(the)f(constrain)o(t)g (that)g(at)g(most)g Fh(N)f Fm(v)n(ariables)g(of)k Fh(List)c Fm(are)h(equal)g(to)g(the)g(v)n(alue)f Fh(V)p Fm(.)-30 2857 y Fh(fd)p 17 2857 V 16 w(atleast\(N,)19 b(List,)i(V\))13 b Fm(p)q(osts)h(the)g(constrain)o(t)f(that)h(at)f(least)g Fh(N)g Fm(v)n(ariables)g(of)j Fh(List)c Fm(are)i(equal)e(to)h(the)h(v)n (alue)f Fh(V)p Fm(.)p eop end %%Page: 178 180 TeXDict begin 178 179 bop -30 -45 a Fm(178)649 b(8)41 b(FINITE)14 b(DOMAIN)g(SOL)-5 b(VER)15 b(AND)f(BUIL)m(T-IN)g(PREDICA)m (TES)p -30 -27 1890 4 v -30 115 a Fh(fd)p 17 115 14 2 v 16 w(exactly\(N,)19 b(List,)i(V\))13 b Fm(p)q(osts)h(the)g(constrain) o(t)f(that)h(at)f(exactly)h Fh(N)f Fm(v)n(ariables)f(of)k Fh(List)c Fm(are)i(equal)f(to)g(the)h(v)n(alue)-30 165 y Fh(V)p Fm(.)-30 264 y(These)h(constrain)o(ts)e(are)h(sp)q(ecial)f (cases)h(of)i Fh(fd)p 703 264 V 15 w(cardinality/2)10 b Fm(\(section)k(8.7.3,)d(page)i(175\))f(but)h(their)g(implemen)o(ta-) -30 314 y(tion)h(is)g(more)f(e\016cien)o(t.)-30 414 y Fi(Errors)p -30 469 1890 2 v -30 519 2 50 v -3 504 a Fh(N)h Fm(is)f(a)h(v)n(ariable)p 915 519 V 689 w Fh(instantiation)p 1230 504 14 2 v 13 w(error)p 1859 519 2 50 v -30 521 1890 2 v -30 571 2 50 v -3 556 a(N)g Fm(is)f(neither)i(a)f(v)n(ariable) f(nor)g(an)h(in)o(teger)p 915 571 V 281 w Fh(type)p 1032 556 14 2 v 15 w(error\(integer,)19 b(N\))p 1859 571 2 50 v -30 572 1890 2 v -30 622 2 50 v -3 607 a(V)14 b Fm(is)f(a)h(v)n(ariable)p 915 622 V 689 w Fh(instantiation)p 1230 607 14 2 v 13 w(error)p 1859 622 2 50 v -30 624 1890 2 v -30 674 2 50 v -3 659 a(V)g Fm(is)f(neither)i(a)f(v)n(ariable) f(nor)g(an)h(in)o(teger)p 915 674 V 281 w Fh(type)p 1032 659 14 2 v 15 w(error\(integer,)19 b(V\))p 1859 674 2 50 v -30 675 1890 2 v -30 725 2 50 v -3 710 a(List)13 b Fm(is)h(a)f(partial)g(list)p 915 725 V 577 w Fh(instantiation)p 1230 710 14 2 v 13 w(error)p 1859 725 2 50 v -30 727 1890 2 v -30 777 2 50 v -3 762 a(List)g Fm(is)h(neither)h(a)e(partial)g (list)g(nor)h(a)g(list)p 915 777 V 258 w Fh(type)p 1032 762 14 2 v 15 w(error\(list,)19 b(List\))p 1859 777 2 50 v -30 778 1890 2 v -30 878 2 100 v -3 813 a Fm(an)13 b(elemen)o(t)i Fh(E)e Fm(of)g(the)h Fh(List)f Fm(list)g(is)h(neither)g (a)g(v)n(ariable)-3 863 y(nor)g(an)g(FD)f(v)n(ariable)g(nor)h(an)g(in)o (teger)p 915 878 V 941 813 a Fh(type)p 1032 813 14 2 v 15 w(error\(fd)p 1223 813 V 14 w(variable,)20 b(E\))p 1859 878 2 100 v -30 880 1890 2 v -30 962 a Fi(P)o(ortabilit)o(y)-30 1062 y Fm(GNU)14 b(Prolog)f(predicates.)-30 1220 y Fi(8.8.5)48 b Fh(fd)p 163 1220 14 2 v 16 w(relation/2)p Fi(,)14 b Fh(fd)p 470 1220 V 15 w(relationc/2)-30 1346 y Fi(T)l(emplates)74 1429 y Fh(fd)p 121 1429 V 16 w(relation\(+integ)o(er)p 510 1429 V 13 w(list)p 611 1429 V 15 w(list,)20 b(?fd)p 822 1429 V 15 w(variable)p 1013 1429 V 14 w(list\))74 1479 y(fd)p 121 1479 V 16 w(relationc\(+inte)o(ger)p 531 1479 V 12 w(list)p 632 1479 V 15 w(list,)h(?fd)p 844 1479 V 15 w(variable)p 1035 1479 V 14 w(list\))-30 1562 y Fi(Description)-30 1662 y Fh(fd)p 17 1662 V 16 w(relation\(Relatio)o(n,)e(Vars\))c Fm(constrain)o(ts)h(the)h(tuple)f (of)g(v)n(ariables)f Fh(Vars)g Fm(to)h(b)q(e)g(equal)g(to)g(one)g (tuple)g(of)g(the)-30 1711 y(list)e Fh(Relation)p Fm(.)i(A)e(tuple)g (is)g(represen)o(ted)j(b)o(y)c(a)h(list.)-30 1811 y(Example:)k (de\014nition)13 b(of)h(the)g(b)q(o)q(olean)g(AND)g(relation)f(so)h (that)g(X)g(AND)g(Y)g Fg(,)f Fm(Z:)74 1894 y Fh(and\(X,Y,Z\):-)249 1944 y(fd_relation\([[0)o(,0,0])o(,[0,1)o(,0],[)o(1,0,0)o(],[1,)o(1,1]) o(],)19 b([X,Y,Z]\).)-30 2027 y(fd)p 17 2027 V 16 w(relationc\(Column)o (s,)g(Vars\))12 b Fm(is)i(similar)e(to)i Fh(fd)p 842 2027 V 15 w(relation/2)d Fm(except)16 b(that)d(the)h(relation)g(is)f (not)h(giv)o(en)f(as)h(the)-30 2077 y(list)g(of)f(tuples)i(but)f(as)g (the)g(list)g(of)f(the)h(columns)g(of)f(the)i(relation.)i(A)d(column)g (is)f(represen)o(ted)k(b)o(y)d(a)f(list.)-30 2176 y(Example:)74 2259 y Fh(and\(X,Y,Z\):-)249 2309 y(fd_relationc\([[)o(0,0,1)o(,1],[)o (0,1,0)o(,1],[)o(0,0,0)o(,1]])o(,)19 b([X,Y,Z]\).)-30 2392 y Fi(Errors)p -30 2448 1890 2 v -30 2547 2 100 v -3 2483 a Fh(Relation)12 b Fm(is)i(a)g(partial)e(list)i(or)g(a)f(list)h (with)f(a)-3 2532 y(sub-term)i Fh(E)e Fm(whic)o(h)h(is)g(a)f(v)n (ariable)p 915 2547 V 941 2483 a Fh(instantiation)p 1230 2483 14 2 v 13 w(error)p 1859 2547 2 100 v -30 2549 1890 2 v -30 2599 2 50 v -3 2584 a(Relation)f Fm(is)i(neither)h(a)e(partial) g(list)h(nor)g(a)f(list)p 915 2599 V 171 w Fh(type)p 1032 2584 14 2 v 15 w(error\(list,)19 b(Relation\))p 1859 2599 2 50 v -30 2601 1890 2 v -30 2700 2 100 v -3 2635 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Relation)f Fm(list)g(is)h(neither)h(a)-3 2685 y(v)n(ariable)e(nor)h(an)f(in)o (teger)p 915 2700 V 941 2635 a Fh(type)p 1032 2635 14 2 v 15 w(error\(integer,)19 b(E\))p 1859 2700 2 100 v -30 2702 1890 2 v -30 2752 2 50 v -3 2737 a(Vars)13 b Fm(is)h(a)f(partial)g(list)p 915 2752 V 577 w Fh(instantiation)p 1230 2737 14 2 v 13 w(error)p 1859 2752 2 50 v -30 2753 1890 2 v -30 2803 2 50 v -3 2788 a(Vars)g Fm(is)h(neither)h(a)e (partial)g(list)g(nor)h(a)g(list)p 915 2803 V 258 w Fh(type)p 1032 2788 14 2 v 15 w(error\(list,)19 b(Vars\))p 1859 2803 2 50 v -30 2805 1890 2 v -30 2904 2 100 v -3 2840 a Fm(an)13 b(elemen)o(t)i Fh(E)e Fm(of)g(the)h Fh(Vars)f Fm(list)g(is)h(neither)g(a)g(v)n(ariable)-3 2889 y(nor)g(an)g(in)o (teger)g(nor)g(an)g(FD)f(v)n(ariable)p 915 2904 V 941 2840 a Fh(type)p 1032 2840 14 2 v 15 w(error\(fd)p 1223 2840 V 14 w(variable,)20 b(E\))p 1859 2904 2 100 v -30 2906 1890 2 v eop end %%Page: 179 181 TeXDict begin 179 180 bop -30 -45 a Fm(8.9)41 b(Lab)q(eling)13 b(constrain)o(ts)1366 b(179)p -30 -27 1890 4 v -30 115 a Fi(P)o(ortabilit)o(y)-30 215 y Fm(GNU)14 b(Prolog)f(predicates.)-30 381 y Ff(8.9)56 b(Lab)r(eling)17 b(constrain)n(ts)-30 507 y Fi(8.9.1)48 b Fh(fd)p 163 507 14 2 v 16 w(labeling/2)p Fi(,)14 b Fh(fd)p 470 507 V 15 w(labeling/1)p Fi(,)g Fh(fd)p 776 507 V 15 w(labelingff/1)-30 633 y Fi(T)l(emplates)74 716 y Fh(fd)p 121 716 V 16 w(labeling\(+fd)p 401 716 V 13 w(variable)p 590 716 V 14 w(list,)21 b(+fd)p 801 716 V 15 w(labeling)p 992 716 V 14 w(option)p 1138 716 V 14 w(list\))74 766 y(fd)p 121 766 V 16 w(labeling\(+fd)p 401 766 V 13 w(variable,)f(+fd)p 698 766 V 15 w(labeling)p 889 766 V 14 w(option)p 1035 766 V 14 w(list\))74 816 y(fd)p 121 816 V 16 w(labeling\(+fd)p 401 816 V 13 w(variable)p 590 816 V 14 w(list\))74 866 y(fd)p 121 866 V 16 w(labeling\(+fd)p 401 866 V 13 w(variable\))74 916 y(fd)p 121 916 V 16 w(labelingff\(+fd)p 444 916 V 12 w(variable)p 633 916 V 14 w(list\))74 965 y(fd)p 121 965 V 16 w(labelingff\(+fd)p 444 965 V 12 w(variable\))-30 1049 y Fi(Description)-30 1148 y Fh(fd)p 17 1148 V 16 w(labeling\(Vars,)f(Options\))12 b Fm(assigns)i(a)f(v)n(alue)g(to)h(eac)o(h)g(v)n(ariable)f Fh(X)g Fm(of)g(the)i(list)e Fh(Vars)g Fm(according)h(to)f(the)i(list)e (of)-30 1198 y(lab)q(eling)e(options)h(giv)o(en)f(b)o(y)i Fh(Options)p Fm(.)j Fh(Vars)11 b Fm(can)h(b)q(e)h(also)e(a)h(single)f (FD)h(v)n(ariable.)17 b(This)11 b(predicate)j(is)d(re-executable)-30 1248 y(on)j(bac)o(ktrac)o(king.)-30 1347 y Fi(FD)j(lab)q(eling)g (options)p Fm(:)h Fh(Options)13 b Fm(is)i(a)g(list)f(of)g(lab)q(eling)f (options.)21 b(If)14 b(this)h(list)f(con)o(tains)h(con)o(tradictory)g (options,)-30 1397 y(the)g(righ)o(tmost)e(option)g(is)h(the)h(one)f (whic)o(h)g(applies.)j(P)o(ossible)d(options)g(are:)33 1480 y Fg(\017)20 b Fh(variable)p 253 1480 V 14 w(method\(V\))p Fm(:)12 b(sp)q(eci\014es)k(the)e(heuristics)h(to)f(select)h(the)g(v)n (ariable)d(to)i(en)o(umerate:)121 1530 y Fi({)21 b Fh(standard)p Fm(:)16 b(no)e(heuristics,)g(the)h(leftmost)e(v)n(ariable)g(is)h (selected.)121 1596 y Fi({)21 b Fh(first)p 279 1596 V 14 w(fail)14 b Fm(\(or)h Fh(ff)p Fm(\):)k(selects)d(the)f(v)n(ariable)e (with)i(the)g(smallest)f(n)o(um)o(b)q(er)h(of)f(elemen)o(ts)h(in)f(its) h(domain.)166 1646 y(If)e(sev)o(eral)h(v)n(ariables)g(ha)o(v)o(e)f(the) i(same)f(n)o(um)o(b)q(er)g(of)f(elemen)o(ts)i(the)g(leftmost)e(v)n (ariable)g(is)h(selected.)121 1713 y Fi({)21 b Fh(most)p 257 1713 V 14 w(constrained)p Fm(:)28 b(lik)o(e)19 b Fh(first)p 745 1713 V 15 w(fail)g Fm(but)h(when)g(sev)o(eral)g(v)n (ariables)g(ha)o(v)o(e)f(the)i(same)f(n)o(um)o(b)q(er)g(of)166 1763 y(elemen)o(ts)14 b(selects)i(the)e(v)n(ariable)f(that)h(app)q (ears)h(in)e(most)h(constrain)o(ts.)121 1829 y Fi({)21 b Fh(smallest)p Fm(:)15 b(selects)g(the)e(v)n(ariable)f(that)h(has)g (the)h(smallest)e(v)n(alue)g(in)h(its)g(domain.)j(If)c(there)j(is)d (more)h(than)166 1879 y(one)h(suc)o(h)g(v)n(ariable)f(selects)j(the)e (v)n(ariable)f(that)h(app)q(ears)h(in)e(most)h(constrain)o(ts.)121 1945 y Fi({)21 b Fh(largest)p Fm(:)c(selects)f(the)f(v)n(ariable)e (that)i(has)f(the)h(greatest)h(v)n(alue)e(in)f(its)i(domain.)j(If)c (there)i(is)e(more)g(than)166 1995 y(one)g(suc)o(h)g(v)n(ariable)f (selects)j(the)e(v)n(ariable)f(that)h(app)q(ears)h(in)e(most)h (constrain)o(ts.)121 2061 y Fi({)21 b Fh(max)p 235 2061 V 15 w(regret)p Fm(:)g(selects)e(the)e(v)n(ariable)e(that)h(has)h(the)g (greatest)h(di\013erence)g(b)q(et)o(w)o(een)g(the)f(smallest)f(v)n (alue)166 2111 y(and)e(the)h(next)g(v)n(alue)f(of)g(its)h(domain.)k(If) 14 b(there)i(is)f(more)f(than)h(one)g(suc)o(h)g(v)n(ariable)f(selects)i (the)f(v)n(ariable)166 2161 y(that)f(app)q(ears)g(in)g(most)f (constrain)o(ts.)121 2227 y Fi({)21 b Fh(random)p Fm(:)16 b(selects)g(randomly)d(a)g(v)n(ariable.)k(Eac)o(h)d(v)n(ariable)f(is)h (only)f(c)o(hosen)i(once.)74 2261 y(The)g(default)e(v)n(alue)g(is)h Fh(standard)p Fm(.)33 2344 y Fg(\017)20 b Fh(reorder\(true/false\))o Fm(:)j(sp)q(eci\014es)d(if)d(the)i(v)n(ariable)e(heuristics)i(should)e (dynamically)f(reorder)k(the)e(list)g(of)74 2393 y(v)n(ariable)13 b(\()p Fh(true)p Fm(\))g(or)h(not)f(\()p Fh(false)p Fm(\).)k(Dynamic)c (reordering)i(is)e(generally)h(more)f(e\016cien)o(t)h(but)g(in)g(some)f (cases)i(a)74 2443 y(static)f(ordering)g(is)g(faster.)19 b(The)14 b(default)g(v)n(alue)f(is)h Fh(true)p Fm(.)33 2526 y Fg(\017)20 b Fh(value)p 187 2526 V 15 w(method\(V\))p Fm(:)11 b(sp)q(eci\014es)16 b(the)f(heuristics)g(to)e(select)j(the)e(v) n(alue)f(to)h(assign)g(to)g(the)g(c)o(hosen)h(v)n(ariable:)121 2576 y Fi({)21 b Fh(min)p Fm(:)c(en)o(umerates)e(the)g(v)n(alues)e (from)g(the)i(smallest)f(to)f(the)i(greatest)g(\(default\).)121 2643 y Fi({)21 b Fh(max)p Fm(:)c(en)o(umerates)e(the)g(v)n(alues)e (from)g(the)i(greatest)g(to)f(the)g(smallest.)121 2709 y Fi({)21 b Fh(middle)p Fm(:)16 b(en)o(umerates)g(the)e(v)n(alues)g (from)f(the)h(middle)f(to)h(the)h(b)q(ounds.)121 2775 y Fi({)21 b Fh(bounds)p Fm(:)16 b(en)o(umerates)g(the)e(v)n(alues)g (from)f(the)h(b)q(ounds)h(to)e(the)i(middle.)121 2842 y Fi({)21 b Fh(random)p Fm(:)16 b(en)o(umerates)g(the)e(v)n(alues)g (randomly)m(.)i(Eac)o(h)e(v)n(alue)g(is)f(only)g(tried)i(once.)74 2875 y(The)g(default)e(v)n(alue)g(is)h Fh(min)p Fm(.)p eop end %%Page: 180 182 TeXDict begin 180 181 bop -30 -45 a Fm(180)649 b(8)41 b(FINITE)14 b(DOMAIN)g(SOL)-5 b(VER)15 b(AND)f(BUIL)m(T-IN)g(PREDICA)m (TES)p -30 -27 1890 4 v 33 115 a Fg(\017)20 b Fh(backtracks\(B\))p Fm(:)11 b(uni\014es)j Fh(B)g Fm(with)f(the)i(n)o(um)o(b)q(er)f(of)f (bac)o(ktrac)o(ks)i(during)f(the)g(en)o(umeration.)-30 194 y Fh(fd)p 17 194 14 2 v 16 w(labeling\(Vars\))d Fm(is)i(equiv)n (alen)o(t)h(to)f Fh(fd)p 685 194 V 16 w(labeling\(Vars,)19 b([]\))p Fm(.)-30 294 y Fh(fd)p 17 294 V 16 w(labelingff\(Vars\))10 b Fm(is)k(equiv)n(alen)o(t)f(to)h Fh(fd)p 729 294 V 15 w(labeling\(Vars,)19 b([variable)p 1269 294 V 14 w(method\(ff\)]\))p Fm(.)-30 394 y Fi(Errors)p -30 449 1890 2 v -30 549 2 100 v -3 484 a Fh(Vars)13 b Fm(is)h(a)f(partial)g(list)h(or)g(a)f(list) h(with)f(an)h(elemen)o(t)g Fh(E)-3 534 y Fm(whic)o(h)g(is)g(a)f(v)n (ariable)p 915 549 V 941 484 a Fh(instantiation)p 1230 484 14 2 v 13 w(error)p 1859 549 2 100 v -30 551 1890 2 v -30 600 2 50 v -3 585 a(Vars)g Fm(is)h(neither)h(a)e(partial)g (list)g(nor)h(a)g(list)p 915 600 V 258 w Fh(type)p 1032 585 14 2 v 15 w(error\(list,)19 b(Vars\))p 1859 600 2 50 v -30 602 1890 2 v -30 702 2 100 v -3 637 a Fm(an)13 b(elemen)o(t)i Fh(E)e Fm(of)g(the)h Fh(Vars)f Fm(list)g(is)h(neither)g (a)g(v)n(ariable)-3 687 y(nor)g(an)g(in)o(teger)g(nor)g(an)g(FD)f(v)n (ariable)p 915 702 V 941 637 a Fh(type)p 1032 637 14 2 v 15 w(error\(fd)p 1223 637 V 14 w(variable,)20 b(E\))p 1859 702 2 100 v -30 703 1890 2 v -30 803 2 100 v -3 738 a(Options)12 b Fm(is)i(a)g(partial)f(list)g(or)h(a)f(list)h(with)f (an)h(elemen)o(t)-3 788 y Fh(E)g Fm(whic)o(h)f(is)h(a)g(v)n(ariable)p 915 803 V 941 738 a Fh(instantiation)p 1230 738 14 2 v 13 w(error)p 1859 803 2 100 v -30 805 1890 2 v -30 854 2 50 v -3 839 a(Options)e Fm(is)i(neither)h(a)f(partial)e(list)i (nor)g(a)f(list)p 915 854 V 193 w Fh(type)p 1032 839 14 2 v 15 w(error\(list,)19 b(Options\))p 1859 854 2 50 v -30 856 1890 2 v -30 956 2 100 v -3 891 a Fm(an)14 b(elemen)o(t)g Fh(E)g Fm(of)f(the)h Fh(Options)f Fm(list)g(is)h (neither)h(a)-3 941 y(v)n(ariable)e(nor)h(a)f(lab)q(eling)g(option)p 915 956 V 941 891 a Fh(domain)p 1076 891 14 2 v 15 w(error\(fd)p 1267 891 V 14 w(labeling)p 1457 891 V 14 w(option,)20 b(E\))p 1859 956 2 100 v -30 957 1890 2 v -30 1040 a Fi(P)o(ortabilit)o(y)-30 1140 y Fm(GNU)14 b(Prolog)f(predicates.)-30 1305 y Ff(8.10)56 b(Optimization)17 b(constrain)n(ts)-30 1431 y Fi(8.10.1)48 b Fh(fd)p 187 1431 14 2 v 15 w(minimize/2)p Fi(,)15 b Fh(fd)p 494 1431 V 15 w(maximize/2)-30 1558 y Fi(T)l(emplates)74 1637 y Fh(fd)p 121 1637 V 16 w(minimize\(+calla)o (ble)p 531 1637 V 12 w(term,)21 b(?fd)p 741 1637 V 15 w(variable\))74 1687 y(fd)p 121 1687 V 16 w(maximize\(+calla)o(ble)p 531 1687 V 12 w(term,)g(?fd)p 741 1687 V 15 w(variable\))-30 1767 y Fi(Description)-30 1866 y Fh(fd)p 17 1866 V 16 w(minimize\(Goal,)e(X\))e Fm(rep)q(eatedly)h(calls)f Fh(Goal)g Fm(to)g(\014nd)g(a)g(v)n(alue)g(that)g(minimizes)g(the)h(v)n (ariable)e Fh(X)p Fm(.)h Fh(Goal)f Fm(is)h(a)-30 1916 y(Prolog)g(goal)g(that)h(should)f(instan)o(tiate)h Fh(X)p Fm(,)f(a)g(common)g(case)i(b)q(eing)f(the)g(use)h(of)h Fh(fd)p 1357 1916 V 15 w(labeling/2)c Fm(\(section)i(8.9.1,)-30 1966 y(page)j(179\).)38 b(This)20 b(predicate)i(uses)g(a)e(branc)o (h-and-b)q(ound)h(algorithm)e(with)h(restart:)33 b(eac)o(h)21 b(time)f Fh(call\(Goal\))-30 2016 y Fm(succeeds)d(the)e(computation)f (restarts)i(with)e(a)g(new)h(constrain)o(t)f Fh(X)22 b(#<)f(V)14 b Fm(where)i Fh(V)e Fm(is)g(the)h(v)n(alue)f(of)j Fh(X)d Fm(at)g(the)h(end)g(of)-30 2066 y(the)e(last)f(call)f(of)k Fh(Goal)p Fm(.)i(When)12 b(a)g(failure)f(o)q(ccurs)i(\(either)g(b)q (ecause)h(there)g(are)e(no)g(remaining)f(c)o(hoice-p)q(oin)o(ts)h(for)g Fh(Goal)-30 2115 y Fm(or)h(b)q(ecause)i(the)e(added)g(constrain)o(t)h (is)e(inconsisten)o(t)i(with)e(the)i(rest)g(of)e(the)h(store\))h(the)g (last)e(solution)g(is)h(recomputed)-30 2165 y(since)i(it)f(is)f (optimal.)-30 2265 y Fh(fd)p 17 2265 V 16 w(maximize\(Goal,)19 b(X\))13 b Fm(is)h(similar)e(to)i Fh(fd)p 690 2265 V 15 w(minimize/2)e Fm(but)i Fh(X)g Fm(is)f(maximized)p Fh(.)-30 2364 y Fi(Errors)p -30 2420 1890 2 v -30 2470 2 50 v -3 2455 a Fh(Goal)g Fm(is)h(a)f(v)n(ariable)p 915 2470 V 624 w Fh(instantiation)p 1230 2455 14 2 v 13 w(error)p 1859 2470 2 50 v -30 2472 1890 2 v -30 2521 2 50 v -3 2506 a(Goal)g Fm(is)h(neither)h(a)e(v)n(ariable)g(nor)h(a)f (callable)g(term)p 915 2521 V 127 w Fh(type)p 1032 2506 14 2 v 15 w(error\(callable,)19 b(Goal\))p 1859 2521 2 50 v -30 2523 1890 2 v -30 2722 2 200 v -3 2558 a Fm(The)14 b(predicate)h(indicator)f Fh(Pred)f Fm(of)j Fh(Goal)d Fm(do)q(es)i(not)-3 2608 y(corresp)q(ond)h(to)d(an)h(existing)f(pro)q (cedure)j(and)e(the)-3 2658 y(v)n(alue)f(of)h(the)g Fh(unknown)e Fm(Prolog)i(\015ag)f(is)h Fh(error)-3 2707 y Fm(\(section)h(7.22.1,)c (page)j(133\))p 915 2722 V 941 2558 a Fh(existence)p 1142 2558 14 2 v 14 w(error\(procedure,)k(Pred\))p 1859 2722 2 200 v -30 2724 1890 2 v -30 2824 2 100 v -3 2759 a(X)c Fm(is)f(neither)i(a)f(v)n(ariable)f(nor)g(an)h(FD)g(v)n(ariable)f (nor)g(an)-3 2809 y(in)o(teger)p 915 2824 V 941 2759 a Fh(type)p 1032 2759 14 2 v 15 w(error\(fd)p 1223 2759 V 14 w(variable,)20 b(X\))p 1859 2824 2 100 v -30 2825 1890 2 v -30 2908 a Fi(P)o(ortabilit)o(y)p eop end %%Page: 181 183 TeXDict begin 181 182 bop -30 -45 a Fm(8.10)41 b(Optimization)12 b(constrain)o(ts)1262 b(181)p -30 -27 1890 4 v -30 115 a(GNU)14 b(Prolog)f(predicates.)p eop end %%Page: 182 184 TeXDict begin 182 183 bop -30 -45 a Fm(182)649 b(8)41 b(FINITE)14 b(DOMAIN)g(SOL)-5 b(VER)15 b(AND)f(BUIL)m(T-IN)g(PREDICA)m (TES)p -30 -27 1890 4 v eop end %%Page: 183 185 TeXDict begin 183 184 bop 1798 -45 a Fm(183)p -30 -27 1890 4 v -30 115 a Fn(9)67 b(In)n(terfacing)22 b(Prolog)g(and)h(C)-30 264 y Ff(9.1)56 b(Calling)18 b(C)i(from)e(Prolog)-30 390 y Fi(9.1.1)48 b(In)o(tro)q(duction)-30 517 y Fm(This)14 b(in)o(terface)h(allo)o(ws)d(a)i(Prolog)f(predicate)i(to)f(call)f(a)g (C)h(function.)k(Here)d(are)f(some)g(features)h(of)f(this)g(facilit)o (y:)33 587 y Fg(\017)20 b Fm(implicit)12 b(Prolog)i Fg($)f Fm(C)h(data)f(con)o(v)o(ersions)i(for)e(simple)h(t)o(yp)q(es.)33 664 y Fg(\017)20 b Fm(functions)14 b(to)g(handle)g(complex)f(t)o(yp)q (es.)33 740 y Fg(\017)20 b Fm(error)15 b(detection)g(dep)q(ending)f(on) g(the)h(t)o(yp)q(e)f(of)f(the)i(argumen)o(t.)33 817 y Fg(\017)20 b Fm(di\013eren)o(t)15 b(kinds)f(of)f(argumen)o(ts:)18 b(input,)c(output)g(or)g(input/output.)33 894 y Fg(\017)20 b Fm(p)q(ossibilit)o(y)13 b(to)h(write)g(non-deterministic)g(co)q(de.) -30 964 y(This)k(in)o(terface)g(can)f(then)h(b)q(e)g(used)g(to)g(write) f(b)q(oth)h(simple)f(and)g(complex)g(C)g(routines.)29 b(A)18 b(simple)e(routine)i(uses)-30 1014 y(either)13 b(input)e(or)g(output)g(argumen)o(ts)h(whic)o(h)f(t)o(yp)q(e)h(is)f (simple.)16 b(In)c(that)f(case)h(the)g(user)g(do)q(es)g(not)f(need)i (an)o(y)d(kno)o(wledge)-30 1063 y(of)15 b(Prolog)f(data)g(structures)j (since)f(all)e(Prolog)g Fg($)g Fm(C)h(data)f(con)o(v)o(ersions)h(are)h (implicitly)c(ac)o(hiev)o(ed.)21 b(T)m(o)14 b(manipulate)-30 1113 y(complex)i(terms)g(\(lists,)g(structures\))i(a)d(set)h(of)f (functions)h(is)f(pro)o(vided.)23 b(Finally)14 b(it)h(is)h(also)f(p)q (ossible)g(to)h(write)g(non-)-30 1163 y(deterministic)f(C)f(co)q(de.) -30 1318 y Fi(9.1.2)48 b Fh(foreign/2)14 b Fi(directiv)o(e)-30 1444 y Fh(foreign/2)20 b Fm(directiv)o(e)i(\(section)g(6.1.14,)e(page)i (45\))e(declares)j(a)e(C)g(function)g(in)o(terface.)41 b(The)21 b(general)h(form)e(is)-30 1494 y Fh(foreign\(Template,)f (Options\))e Fm(whic)o(h)i(de\014nes)i(an)e(in)o(terface)g(predicate)i (whose)e(protot)o(yp)q(e)h(is)f Fh(Template)e Fm(ac-)-30 1544 y(cording)e(to)f(the)h(options)f(giv)o(en)g(b)o(y)g Fh(Options)p Fm(.)k Fh(Template)13 b Fm(is)h(a)g(callable)f(term)i(sp)q (ecifying)f(the)h(t)o(yp)q(e/mo)q(de)g(of)f(eac)o(h)-30 1594 y(argumen)o(t)g(of)g(the)g(asso)q(ciated)h(Prolog)e(predicate.)-30 1693 y Fi(F)l(oreign)19 b(options)p Fm(:)j Fh(Options)15 b Fm(is)i(a)f(list)h(of)f(foreign)g(options.)27 b(If)16 b(this)h(list)f(con)o(tains)h(con)o(tradictory)g(options,)g(the)-30 1743 y(righ)o(tmost)d(option)f(is)h(the)g(one)g(whic)o(h)g(applies.)k (P)o(ossible)c(options)f(are:)33 1814 y Fg(\017)20 b Fh(fct)p 143 1814 14 2 v 15 w(name\(F\))p Fm(:)11 b Fh(F)i Fm(is)f(an)h(atom)f(represen)o(ting)i(the)g(name)e(of)g(the)i(C)e (function)h(to)g(call.)j(By)d(default)g(the)g(name)g(of)74 1863 y(the)i(C)f(function)g(is)g(the)h(same)f(as)g(the)h(principal)e (functor)i(of)i Fh(Template)p Fm(.)g(In)d(an)o(y)g(case,)g(the)h(atom)e (asso)q(ciated)74 1913 y(with)h(the)g(name)g(of)f(the)i(function)e(m)o (ust)h(conforms)g(to)g(the)g(syn)o(tax)g(of)f(C)h(iden)o(ti\014ers.)33 1990 y Fg(\017)20 b Fh(return\(boolean)p Fm(/)p Fh(non)o(e)p Fm(/)p Fh(jum)o(p\))p Fm(:)15 b(sp)q(eci\014es)h(the)e(v)n(alue)f (returned)j(b)o(y)e(the)g(C)g(function:)121 2040 y Fi({)21 b Fh(boolean)p Fm(:)16 b(the)f(t)o(yp)q(e)f(of)f(the)i(function)e(is)h Fh(Bool)f Fm(\(returns)j Fh(TRUE)d Fm(on)g(success,)j Fh(FALSE)d Fm(otherwise\).)121 2100 y Fi({)21 b Fh(none)p Fm(:)c(the)d(t)o(yp)q(e)h(of)e(the)h(function)g(is)g Fh(void)f Fm(\(no)h(returned)h(v)n(alue\).)121 2160 y Fi({)21 b Fh(jump)p Fm(:)16 b(the)d(t)o(yp)q(e)g(of)f(the)h(function)f (is)g Fh(void\(*\)\(\))f Fm(\(returns)j(the)f(address)h(of)d(a)h (Prolog)g(co)q(de)h(to)g(execute\).)74 2186 y(The)i(default)e(v)n(alue) g(is)h Fh(boolean)p Fm(.)33 2263 y Fg(\017)20 b Fh(bip)p 143 2263 V 15 w(name\(Name,)g(Arity\))p Fm(:)c(initializes)c(the)h (error)h(con)o(text)g(with)e Fh(Name)g Fm(and)h Fh(Arity)p Fm(.)j(If)d(an)f(error)i(o)q(ccurs)g(this)74 2313 y(information)e(is)h (used)i(to)e(indicate)h(from)f(whic)o(h)g(predicate)i(the)f(error)h(o)q (ccurred)g(\(section)g(5.3.1,)c(page)j(37\).)j(It)74 2363 y(is)d(also)e(p)q(ossible)i(to)f(prev)o(en)o(t)i(the)f (initialization)d(of)i(the)h(error)g(con)o(text)g(using)g Fh(bip)p 1410 2363 V 15 w(name\(none\))p Fm(.)i(By)e(default)74 2412 y Fh(Name)f Fm(and)h Fh(Arity)f Fm(are)h(set)h(to)f(the)g(functor) g(and)g(arit)o(y)f(of)k Fh(Template)p Fm(.)33 2489 y Fg(\017)j Fh(choice)p 209 2489 V 15 w(size\(N\))p Fm(:)12 b(this)i(option)g(sp)q(eci\014es)i(that)f(the)g(function)f(implemen)o (ts)f(a)i(non-deterministic)f(co)q(de.)20 b Fh(N)14 b Fm(is)74 2539 y(an)f(in)o(teger)g(sp)q(ecifying)f(the)h(size)h(needed)g (b)o(y)e(the)h(non-deterministic)g(C)f(function.)18 b(This)12 b(facilit)o(y)f(is)h(explained)74 2589 y(later)i(\(section)h(9.1.7,)d (page)i(186\).)j(By)d(default)g(a)f(foreign)h(function)f(is)h (deterministic.)-30 2659 y Fh(foreign\(Template\))d Fm(is)j(equiv)n (alen)o(t)f(to)g Fh(foreign\(Template,)19 b([]\))p Fm(.)-30 2759 y Fi(F)l(oreign)h(mo)q(des)f(and)g(t)o(yp)q(es)p Fm(:)24 b(eac)o(h)18 b(argumen)o(t)g(of)i Fh(Template)c Fm(sp)q(eci\014es)j(the)f(foreign)f(mo)q(de)g(and)h(t)o(yp)q(e)g(of)f (the)-30 2808 y(corresp)q(onding)g(argumen)o(t.)k(This)15 b(information)e(is)i(used)h(to)f(c)o(hec)o(k)i(the)e(t)o(yp)q(e)h(of)e (e\013ectiv)o(e)j(argumen)o(ts)e(at)g(run-time)-30 2858 y(and)d(to)f(p)q(erform)h(Prolog)f Fg($)g Fm(C)h(data)f(con)o(v)o (ersions.)18 b(Eac)o(h)12 b(argumen)o(t)f(of)j Fh(Template)c Fm(is)i(formed)f(with)g(a)g(mo)q(de)h(sym)o(b)q(ol)-30 2908 y(follo)o(w)o(ed)h(b)o(y)g(a)h(t)o(yp)q(e)g(name.)k(P)o(ossible)c (foreign)g(mo)q(des)g(are:)p eop end %%Page: 184 186 TeXDict begin 184 185 bop -30 -45 a Fm(184)1123 b(9)41 b(INTERF)-5 b(A)o(CING)14 b(PR)o(OLOG)f(AND)h(C)p -30 -27 1890 4 v 33 115 a Fg(\017)20 b Fh(+)p Fm(:)e(input)c(argumen)o(t.) 33 198 y Fg(\017)20 b Fh(-)p Fm(:)e(output)c(argumen)o(t.)33 281 y Fg(\017)20 b Fh(?)p Fm(:)e(input/output)c(argumen)o(t.)-30 364 y(P)o(ossible)g(foreign)g(t)o(yp)q(es)h(are:)p -30 428 1816 2 v -30 477 2 50 v -3 463 a(F)m(oreign)e(t)o(yp)q(e)p 250 477 V 52 w(Prolog)h(t)o(yp)q(e)p 697 477 V 235 w(C)g(t)o(yp)q(e)p 879 477 V 60 w(Description)g(of)f(the)i(C)e(t)o(yp)q(e)p 1784 477 V -30 479 1816 2 v -30 489 V -30 539 2 50 v -3 524 a Fh(integer)p 250 539 V 125 w Fm(in)o(teger)p 697 539 V 324 w Fh(long)p 879 539 V 95 w Fm(v)n(alue)g(of)g(the)i(in)o (teger)p 1784 539 V -30 541 1816 2 v -30 590 2 50 v -3 575 a Fh(positive)p 250 590 V 103 w Fm(p)q(ositiv)o(e)f(in)o(teger)p 697 590 V 170 w Fh(long)p 879 590 V 95 w Fm(v)n(alue)f(of)g(the)i(in)o (teger)p 1784 590 V -30 592 1816 2 v -30 642 2 50 v -3 627 a Fh(float)p 250 642 V 169 w Fm(\015oating)e(p)q(oin)o(t)h(n)o(um)o (b)q(er)p 697 642 V 51 w Fh(double)p 879 642 V 51 w Fm(v)n(alue)f(of)g (the)i(\015oating)e(p)q(oin)o(t)g(n)o(um)o(b)q(er)p 1784 642 V -30 644 1816 2 v -30 693 2 50 v -3 678 a Fh(number)p 250 693 V 147 w Fm(n)o(um)o(b)q(er)p 697 693 V 310 w Fh(double)p 879 693 V 51 w Fm(v)n(alue)g(of)g(the)i(n)o(um)o(b)q(er)p 1784 693 V -30 695 1816 2 v -30 745 2 50 v -3 730 a Fh(atom)p 250 745 V 191 w Fm(atom)p 697 745 V 354 w Fh(int)p 879 745 V 117 w Fm(in)o(ternal)e(k)o(ey)h(of)f(the)i(atom)p 1784 745 V -30 746 1816 2 v -30 796 2 50 v -3 781 a Fh(boolean)p 250 796 V 125 w Fm(b)q(o)q(olean)p 697 796 V 306 w Fh(int)p 879 796 V 117 w Fm(v)n(alue)e(of)g(the)i(b)q(o)q(olean)e(\(0=)p Fh(false)p Fm(,)g(1=)p Fh(true)p Fm(\))p 1784 796 V -30 798 1816 2 v -30 848 2 50 v -3 833 a Fh(char)p 250 848 V 191 w Fm(c)o(haracter)p 697 848 V 281 w Fh(int)p 879 848 V 117 w Fm(v)n(alue)g(of)g(\(the)i(co)q(de)g(of)s(\))e(the)i(c)o (haracter)p 1784 848 V -30 849 1816 2 v -30 899 2 50 v -3 884 a Fh(code)p 250 899 V 191 w Fm(c)o(haracter)h(co)q(de)p 697 899 V 184 w Fh(int)p 879 899 V 117 w Fm(v)n(alue)d(of)g(the)i(c)o (haracter-co)q(de)p 1784 899 V -30 901 1816 2 v -30 951 2 50 v -3 936 a Fh(byte)p 250 951 V 191 w Fm(b)o(yte)p 697 951 V 369 w Fh(int)p 879 951 V 117 w Fm(v)n(alue)e(of)g(the)i(b)o (yte)p 1784 951 V -30 952 1816 2 v -30 1002 2 50 v -3 987 a Fh(in)p 44 987 14 2 v 15 w(char)p 250 1002 2 50 v 132 w Fm(in-c)o(haracter)p 697 1002 V 232 w Fh(int)p 879 1002 V 117 w Fm(v)n(alue)e(of)g(the)i(c)o(haracter)g(or)f Fh(-1)f Fm(for)h(end-of-\014le)p 1784 1002 V -30 1004 1816 2 v -30 1054 2 50 v -3 1039 a Fh(in)p 44 1039 14 2 v 15 w(code)p 250 1054 2 50 v 132 w Fm(in-c)o(haracter)h(co)q(de)p 697 1054 V 136 w Fh(int)p 879 1054 V 117 w Fm(v)n(alue)e(of)g(the)i(c)o (haracter-co)q(de)h(or)e Fh(-1)f Fm(for)g(end-of-\014le)p 1784 1054 V -30 1055 1816 2 v -30 1105 2 50 v -3 1090 a Fh(in)p 44 1090 14 2 v 15 w(byte)p 250 1105 2 50 v 132 w Fm(in-b)o(yte)p 697 1105 V 320 w Fh(int)p 879 1105 V 117 w Fm(v)n(alue)g(of)g(the)i(b)o(yte)f(or)g Fh(-1)f Fm(for)h(the)g(end-of-\014le)p 1784 1105 V -30 1107 1816 2 v -30 1157 2 50 v -3 1142 a Fh(string)p 250 1157 V 147 w Fm(atom)p 697 1157 V 354 w Fh(char)21 b(*)p 879 1157 V 52 w Fm(C)14 b(string)f(con)o(taining)g(the)i(name)e(of)h(the)g (atom)p 1784 1157 V -30 1158 1816 2 v -30 1208 2 50 v -3 1193 a Fh(chars)p 250 1208 V 169 w Fm(c)o(haracter)i(list)p 697 1208 V 209 w Fh(char)21 b(*)p 879 1208 V 52 w Fm(C)14 b(string)f(con)o(taining)g(the)i(c)o(haracters)g(of)f(the)g(list)p 1784 1208 V -30 1210 1816 2 v -30 1260 2 50 v -3 1245 a Fh(codes)p 250 1260 V 169 w Fm(c)o(haracter-co)q(de)i(list)p 697 1260 V 114 w Fh(char)21 b(*)p 879 1260 V 52 w Fm(C)14 b(string)f(con)o(taining)g(the)i(c)o(haracters)g(of)f(the)g(list)p 1784 1260 V -30 1261 1816 2 v -30 1311 2 50 v -3 1296 a Fh(term)p 250 1311 V 191 w Fm(Prolog)g(term)p 697 1311 V 229 w Fh(PlTerm)p 879 1311 V 51 w Fm(generic)g(Prolog)g(term)p 1784 1311 V -30 1313 1816 2 v -30 1395 a Fi(Simple)f(foreign)f(t)o(yp)q (e)p Fm(:)k(a)11 b(simple)g(t)o(yp)q(e)h(is)f(an)o(y)g(foreign)g(t)o (yp)q(e)h(listed)g(in)f(the)h(ab)q(o)o(v)o(e)f(tabled)h(except)h Fh(term)p Fm(.)j(A)c(simple)-30 1445 y(foreign)k(t)o(yp)q(e)h(is)f(an)h (atomic)e(term)i(\(c)o(haracter)h(and)e(c)o(haracter-co)q(de)j(lists)d (are)h(in)f(fact)g(lists)g(of)g(constan)o(ts\).)27 b(Eac)o(h)-30 1495 y(simple)14 b(foreign)f(t)o(yp)q(e)i(is)e(con)o(v)o(erted)i (to/from)e(a)h(C)g(t)o(yp)q(e)g(to)g(simplify)e(the)i(writing)f(of)h (the)g(C)g(function.)-30 1595 y Fi(Complex)20 b(foreign)e(t)o(yp)q(e)p Fm(:)23 b(t)o(yp)q(e)17 b(foreign)f(t)o(yp)q(e)i Fh(term)e Fm(refers)i(to)e(an)o(y)h(Prolog)f(term)h(\(e.g.)27 b(lists,)17 b(structures.)9 b(.)d(.)h(\).)-30 1645 y(When)17 b(suc)o(h)f(an)g(t)o (yp)q(e)g(is)g(sp)q(eci\014ed)h(the)g(argumen)o(t)f(is)f(passed)i(to)f (the)h(C)e(function)h(as)g(a)g Fh(PlTerm)e Fm(\(GNU)i(Prolog)f(C)-30 1694 y(t)o(yp)q(e)h(equiv)n(alen)o(t)e(to)h(a)f Fh(long)p Fm(\).)20 b(Sev)o(eral)15 b(functions)g(are)g(pro)o(vided)g(to)g (manipulate)e Fh(PlTerm)h Fm(v)n(ariables)g(\(section)i(9.2,)-30 1744 y(page)e(190\).)k(Since)d(the)f(original)e(term)j(is)f(passed)h (to)e(the)i(function)f(it)f(is)h(p)q(ossible)g(to)g(read)h(its)f(v)n (alue)f(or)h(to)g(unify)f(it.)-30 1794 y(So)j(the)h(meaning)f(of)f(the) i(mo)q(de)f(sym)o(b)q(ol)g(is)g(less)g(signi\014can)o(t.)25 b(F)m(or)16 b(this)g(reason)h(it)f(is)g(p)q(ossible)g(to)g(omit)f(the)i (mo)q(de)-30 1844 y(sym)o(b)q(ol.)h(In)c(that)g(case)g Fh(term)f Fm(is)h(equiv)n(alen)o(t)f(to)h Fh(+term)p Fm(.)-30 2001 y Fi(9.1.3)48 b(The)16 b(C)g(function)-30 2128 y Fm(The)f(C)e(co)q(de)i(is)e(written)h(in)f(a)h(C)f(\014le)h (whic)o(h)g(m)o(ust)f(\014rst)i(include)e(the)i(GNU)e(Prolog)g(header)i (\014le)e(called)h Fh(gprolog.h)p Fm(.)-30 2178 y(This)g(\014le)g(con)o (tains)g(all)f(GNU)g(Prolog)g(C)h(de\014nitions)g(\(constan)o(ts,)h(t)o (yp)q(es,)f(protot)o(yp)q(es,.)7 b(.)f(.)h(\).)-30 2277 y(The)19 b(t)o(yp)q(e)f(returned)h(b)o(y)f(a)f(C)h(function)f(dep)q (ends)j(on)d(the)i(v)n(alue)e(of)g(the)h Fh(return)f Fm(foreign)g(option)g(\(section)h(9.1.2,)-30 2327 y(page)d(183\).)20 b(If)15 b(it)f(is)h Fh(boolean)e Fm(then)i(the)h(C)f(function)f(is)h (of)f(t)o(yp)q(e)h Fh(Bool)f Fm(and)h(shall)f(return)i Fh(TRUE)d Fm(in)i(case)h(of)e(success)-30 2377 y(and)h Fh(FALSE)e Fm(otherwise.)22 b(If)14 b(the)h Fh(return)e Fm(option)h(is)h Fh(none)e Fm(the)i(C)g(function)f(is)h(of)f(t)o(yp)q (e)h Fh(void)p Fm(.)k(Finally)13 b(if)h(it)g(is)h Fh(jump)p Fm(,)-30 2427 y(the)f(function)f(shall)g(return)h(the)g(address)h(of)e (a)g(Prolog)f(predicate)j(and,)e(at)g(the)h(exit)f(of)g(the)h (function,)e(the)i(con)o(trol)f(is)-30 2477 y(giv)o(en)h(to)g(that)g (predicate.)-30 2576 y(The)19 b(t)o(yp)q(e)g(of)e(the)i(argumen)o(ts)f (of)g(the)h(C)f(function)g(dep)q(ends)i(on)d(the)i(mo)q(de)f(and)g(t)o (yp)q(e)h(declaration)f(sp)q(eci\014ed)i(in)-30 2626 y Fh(Template)13 b Fm(for)g(the)i(corresp)q(onding)g(argumen)o(t)e(as)h (explained)g(in)f(the)i(follo)o(wing)c(sections.)p eop end %%Page: 185 187 TeXDict begin 185 186 bop -30 -45 a Fm(9.1)41 b(Calling)12 b(C)i(from)f(Prolog)1329 b(185)p -30 -27 1890 4 v -30 115 a Fi(9.1.4)48 b(Input)14 b(argumen)o(ts)-30 241 y Fm(An)20 b(input)f(argumen)o(t)g(is)g(tested)i(at)e(run-time)g(to)g(c)o (hec)o(k)h(if)f(its)g(t)o(yp)q(e)h(conforms)f(to)g(the)h(foreign)f(t)o (yp)q(e)g(and)h(then)-30 291 y(it)g(is)f(passed)i(to)e(the)h(C)f (function.)35 b(The)20 b(t)o(yp)q(e)g(of)f(the)h(asso)q(ciated)g(C)g (argumen)o(t)f(is)h(giv)o(en)f(b)o(y)g(the)h(ab)q(o)o(v)o(e)f(table)-30 341 y(\(section)f(9.1.2,)e(page)h(183\).)27 b(F)m(or)17 b(instance,)h(the)f(e\013ectiv)o(e)i(argumen)o(t)e Fh(Arg)f Fm(asso)q(ciated)i(with)f Fh(+positive)e Fm(foreign)-30 391 y(declaration)f(is)g(submitted)g(to)g(the)g(follo)o(wing)e(pro)q (cess:)33 474 y Fg(\017)20 b Fm(if)d Fh(Arg)c Fm(is)g(a)h(v)n(ariable)f (an)h Fh(instantiation)p 773 474 14 2 v 13 w(error)e Fm(is)i(raised.)33 557 y Fg(\017)20 b Fm(if)d Fh(Arg)c Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)h(an)f(in)o(teger)i(a)e Fh(type)p 962 557 V 15 w(error\(integer,)19 b(Arg\))13 b Fm(is)h(raised.)33 640 y Fg(\017)20 b Fm(if)d Fh(Arg)c Fm(is)g(an)h(in)o(teger)g Fb(<)h Fm(0)e(a)h Fh(domain)p 682 640 V 14 w(error\(not)p 894 640 V 14 w(less)p 996 640 V 15 w(than)p 1099 640 V 15 w(zero,)21 b(Arg\))13 b Fm(is)g(raised.)33 723 y Fg(\017)20 b Fm(otherwise)15 b(the)g(v)n(alue)e(of)j Fh(Arg)e Fm(is)f(passed)i(to)f(the)g(C)g(is)g (passed)h(to)f(the)g(C)g(function)g(as)f(an)h(in)o(teger)g(\()p Fh(long)p Fm(\).)-30 806 y(When)i Fh(+string)f Fm(is)g(sp)q(eci\014ed)j (the)e(string)g(passed)h(to)e(the)i(function)e(is)h(the)g(in)o(ternal)g (string)g(of)f(the)h(corresp)q(onding)-30 856 y(atom)e(and)f(should)h (not)g(b)q(e)g(mo)q(di\014ed.)-30 955 y(When)19 b Fh(+term)e Fm(is)g(sp)q(eci\014ed)j(the)f(term)f(passed)h(to)f(the)g(function)g (is)g(the)h(original)d(Prolog)h(term.)31 b(It)18 b(can)g(b)q(e)h(read) -30 1005 y(and/or)14 b(uni\014ed.)k(It)c(is)g(also)f(the)i(case)f(when) h Fh(term)e Fm(is)h(sp)q(eci\014ed)h(without)f(an)o(y)f(mo)q(de)h(sym)o (b)q(ol.)-30 1163 y Fi(9.1.5)48 b(Output)14 b(argumen)o(ts)-30 1289 y Fm(An)e(output)f(argumen)o(t)g(is)g(tested)i(at)e(run-time)g(to) g(c)o(hec)o(k)h(if)f(its)g(t)o(yp)q(e)h(conforms)f(to)g(the)h(foreign)e (t)o(yp)q(e)i(and)f(it)g(is)g(uni\014ed)-30 1339 y(with)16 b(the)h(v)n(alue)f(set)h(b)o(y)f(the)h(C)g(function.)25 b(The)17 b(t)o(yp)q(e)f(of)g(the)h(asso)q(ciated)g(C)g(argumen)o(t)f (is)g(a)g(p)q(oin)o(ter)h(to)f(the)h(t)o(yp)q(e)-30 1389 y(giv)o(en)f(b)o(y)f(the)h(ab)q(o)o(v)o(e)g(table)g(\(section)g(9.1.2,) e(page)i(183\).)23 b(F)m(or)15 b(instance,)h(the)h(e\013ectiv)o(e)g (argumen)o(t)e Fh(Arg)g Fm(asso)q(ciated)-30 1439 y(with)f Fh(-positive)e Fm(foreign)h(declaration)h(is)g(handled)f(as)h(follo)o (ws:)33 1522 y Fg(\017)20 b Fm(if)d Fh(Arg)c Fm(is)g(neither)i(a)f(v)n (ariable)f(nor)h(an)f(in)o(teger)i(a)e Fh(type)p 962 1522 V 15 w(error\(integer,)19 b(Arg\))13 b Fm(is)h(raised.)33 1605 y Fg(\017)20 b Fm(if)d Fh(Arg)c Fm(is)g(an)h(in)o(teger)g Fb(<)h Fm(0)e(a)h Fh(domain)p 682 1605 V 14 w(error\(not)p 894 1605 V 14 w(less)p 996 1605 V 15 w(than)p 1099 1605 V 15 w(zero,)21 b(Arg\))13 b Fm(is)g(raised.)33 1688 y Fg(\017)20 b Fm(otherwise)14 b(a)f(p)q(oin)o(ter)g(to)g(an)g(in)o (teger)g(\()p Fh(long)f(*)p Fm(\))h(is)g(passed)h(to)f(the)g(C)g (function.)18 b(If)12 b(the)i(function)f(returns)h Fh(TRUE)74 1738 y Fm(the)h(in)o(teger)f(stored)h(at)f(this)g(lo)q(cation)f(is)g (uni\014ed)h(with)g Fh(Arg)p Fm(.)-30 1821 y(When)g Fh(-term)d Fm(is)i(sp)q(eci\014ed,)h(the)g(function)e(m)o(ust)h(construct)h(a)f (term)g(in)o(to)f(the)i(its)f(corresp)q(onding)g(argumen)o(t)g(\(whic)o (h)-30 1870 y(is)18 b(of)g(t)o(yp)q(e)h Fh(PlTerm)h(*)p Fm(\).)31 b(A)o(t)18 b(the)h(exit)f(of)f(the)i(function)f(this)g(term)g (will)f(b)q(e)i(uni\014ed)f(with)g(the)g(actual)g(predicate)-30 1920 y(argumen)o(t.)-30 2078 y Fi(9.1.6)48 b(Input/outpu)o(t)13 b(argumen)o(ts)-30 2204 y Fm(Basically)h(an)g(input/output)g(argumen)o (t)g(is)h(treated)g(as)g(in)e(input)i(argumen)o(t)f(if)f(it)h(is)g(not) h(a)f(v)n(ariable,)f(as)h(an)g(output)-30 2254 y(argumen)o(t)i (otherwise.)26 b(The)17 b(t)o(yp)q(e)f(of)g(the)g(asso)q(ciated)h(C)f (argumen)o(t)g(is)g(a)g(p)q(oin)o(ter)g(to)g(a)g Fh(FIOArg)f Fm(\(GNU)h(Prolog)f(C)-30 2304 y(t)o(yp)q(e\))g(de\014ned)g(as)f(follo) o(ws:)74 2387 y Fh(typedef)21 b(struct)161 2437 y({)183 2487 y(Bool)g(is_var;)183 2536 y(Bool)g(unify;)183 2586 y(union)249 2636 y({)270 2686 y(long)65 b(l;)270 2736 y(char)43 b(*s;)270 2786 y(double)21 b(d;)249 2835 y(}value;)161 2885 y(}FIOArg;)p eop end %%Page: 186 188 TeXDict begin 186 187 bop -30 -45 a Fm(186)1123 b(9)41 b(INTERF)-5 b(A)o(CING)14 b(PR)o(OLOG)f(AND)h(C)p -30 -27 1890 4 v -30 115 a(The)k(\014eld)f Fh(is)p 199 115 14 2 v 15 w(var)g Fm(is)f(set)i(to)f Fh(TRUE)f Fm(if)g(the)i(argumen)o (t)f(is)g(a)f(v)n(ariable)g(and)h Fh(FALSE)f Fm(otherwise.)28 b(This)17 b(v)n(alue)f(can)i(b)q(e)-30 165 y(tested)d(b)o(y)d(the)h(C)g (function)f(to)h(determine)g(whic)o(h)g(treatmen)o(t)g(to)g(p)q (erform.)18 b(The)13 b(\014eld)f Fh(unify)g Fm(con)o(trols)h(whether)h (the)-30 215 y(e\013ectiv)o(e)i(argumen)o(t)d(m)o(ust)h(b)q(e)g (uni\014ed)g(at)g(the)g(exit)g(of)f(the)h(C)g(function.)j(Initially)12 b Fh(unify)h Fm(is)h(set)g(to)g(the)g(same)g(v)n(alue)-30 264 y(as)j Fh(is)p 71 264 V 15 w(var)f Fm(\(i.e.)26 b(a)17 b(v)n(ariable)e(argumen)o(t)i(will)e(b)q(e)i(uni\014ed)g(while)f(a)g (non-v)n(ariable)g(argumen)o(t)g(will)f(not\))i(but)g(it)f(can)-30 314 y(b)q(e)g(mo)q(di\014ed)f(b)o(y)g(the)h(C)f(function.)21 b(The)16 b(\014eld)f Fh(value)f Fm(stores)j(the)e(v)n(alue)g(of)f(the)i (argumen)o(t.)22 b(It)15 b(is)g(declared)h(as)f(a)g(C)-30 364 y Fh(union)d Fm(since)h(there)g(are)g(sev)o(eral)g(kinds)f(of)g(v)n (alue)g(t)o(yp)q(es.)18 b(The)13 b(\014eld)f Fh(s)g Fm(is)g(used)i(for) e(C)g(strings,)g Fh(d)h Fm(for)e(C)i(doubles)f(and)g Fh(l)-30 414 y Fm(otherwise)k(\()p Fh(int)p Fm(,)d Fh(long)p Fm(,)g Fh(PlTerm)p Fm(\).)k(if)g Fh(is)p 642 414 V 15 w(var)c Fm(is)h Fh(FALSE)f Fm(then)i Fh(value)e Fm(con)o(tains)h(the)h (input)f(v)n(alue)f(of)h(the)g(argumen)o(t)-30 464 y(with)e(the)h(same) f(con)o(v)o(en)o(tions)g(as)g(for)f(input)h(argumen)o(ts)g(\(section)h (9.1.4,)d(page)i(185\).)17 b(A)o(t)12 b(the)h(exit)f(of)f(the)h (function,)g(if)-30 513 y(unify)i(is)f Fh(TRUE)g(value)g Fm(m)o(ust)h(con)o(tain)g(the)g(v)n(alue)f(to)h(unify)f(with)h(the)g (same)g(con)o(v)o(en)o(tions)g(as)g(for)g(output)g(argumen)o(ts)-30 563 y(\(section)h(9.1.5,)d(page)i(185\).)-30 663 y(F)m(or)k(instance,)i (the)e(e\013ectiv)o(e)i(argumen)o(t)e Fh(Arg)f Fm(asso)q(ciated)i(with) f Fh(?positive)e Fm(foreign)h(declaration)h(is)g(handled)g(as)-30 713 y(follo)o(ws:)33 782 y Fg(\017)i Fm(if)i Fh(Arg)c Fm(is)h(a)f(v)n(ariable)g Fh(is)p 499 782 V 16 w(var)g Fm(and)h Fh(unify)f Fm(are)h(set)h(to)f Fh(TRUE)f Fm(else)i(to)f Fh(FALSE)e Fm(and)i(its)g(v)n(alue)g(is)f(copied)i(in)74 832 y Fh(value.l)p Fm(.)33 908 y Fg(\017)g Fm(if)d Fh(Arg)c Fm(is)g(neither)i(a)f(v)n(ariable)f(nor)h(an)f(in)o(teger)i(a)e Fh(type)p 962 908 V 15 w(error\(integer,)19 b(Arg\))13 b Fm(is)h(raised.)33 985 y Fg(\017)20 b Fm(if)d Fh(Arg)c Fm(is)g(an)h(in)o(teger)g Fb(<)h Fm(0)e(a)h Fh(domain)p 682 985 V 14 w(error\(not)p 894 985 V 14 w(less)p 996 985 V 15 w(than)p 1099 985 V 15 w(zero,)21 b(Arg\))13 b Fm(is)g(raised.)33 1061 y Fg(\017)20 b Fm(otherwise)c(a)f(p)q(oin)o (ter)g(to)g(the)g Fh(FIOArg)f Fm(\()p Fh(FIOArg)g(*)p Fm(\))h(is)g(passed)h(to)e(the)i(C)f(function.)21 b(If)14 b(the)i(function)f(returns)74 1111 y Fh(TRUE)e Fm(and)h(if)i Fh(unify)d Fm(is)h(TR)o(UE)f(the)i(v)n(alue)e(stored)i(in)e Fh(value.l)g Fm(is)h(uni\014ed)g(with)f Fh(Arg)p Fm(.)-30 1265 y Fi(9.1.7)48 b(W)l(riting)16 b(non-determinist)o(ic)e(C)i(co)q (de)-30 1392 y Fm(The)d(in)o(terface)g(allo)o(ws)e(the)i(user)h(to)e (write)h(non-deterministic)f(C)h(co)q(de.)18 b(When)13 b(a)f(C)g(function)g(is)g(non-deterministic,)-30 1442 y(a)17 b(c)o(hoice-p)q(oin)o(t)g(is)f(created)j(for)d(this)h(function.) 26 b(When)17 b(a)g(failure)f(o)q(ccurs,)i(if)e(all)g(more)h(recen)o(t)h (non-deterministic)-30 1491 y(co)q(de)h(are)f(\014nished,)h(the)g (function)e(is)h(re-in)o(v)o(ok)o(ed.)30 b(It)17 b(is)h(then)h(imp)q (ortan)o(t)e(to)g(inform)g(Prolog)g(when)i(there)g(is)e(no)-30 1541 y(more)i(solution)e(\(i.e.)30 b(no)18 b(more)g(c)o(hoice\))g(for)g (a)g(non-deterministic)g(co)q(de.)31 b(So,)19 b(when)f(no)g(more)g(c)o (hoices)h(remains)-30 1591 y(the)e(function)f(m)o(ust)g(remo)o(v)o(e)h (the)f(c)o(hoice-p)q(oin)o(t.)25 b(The)17 b(in)o(terface)g(incremen)o (ts)g(a)f(coun)o(ter)h(eac)o(h)g(time)f(the)g(function)-30 1641 y(is)f(re-in)o(v)o(ok)o(ed.)20 b(A)o(t)15 b(the)g(\014rst)h(call)e (this)g(coun)o(ter)i(is)f(equal)f(to)g(0.)21 b(This)14 b(information)f(allo)o(ws)g(the)j(function)e(to)h(detect)-30 1691 y(its)g(\014rst)g(call.)j(When)d(writing)e(non-deterministic)i(co) q(de,)g(it)f(is)g(often)g(useful)g(to)h(record)g(data)f(b)q(et)o(w)o (een)i(consecutiv)o(e)-30 1741 y(re-in)o(v)o(o)q(cations)e(of)g(the)h (function.)k(The)c(in)o(terface)g(main)o(tains)e(a)h(bu\013er)h(to)f (record)i(suc)o(h)f(an)f(information.)k(The)c(size)-30 1790 y(of)h(this)g(bu\013er)h(is)f(giv)o(en)g(b)o(y)g Fh(choice)p 568 1790 V 15 w(size\(N\))e Fm(when)j(using)f Fh(foreign/2)e Fm(\(section)j(9.1.2,)d(page)j(183\).)21 b(This)14 b(size)i(is)-30 1840 y(the)e(n)o(um)o(b)q(er)f(of)f (\(consecutiv)o(e\))i Fh(long)p Fe(s)h Fm(needed)f(b)o(y)e(the)i(C)e (function.)17 b(Inside)c(the)h(function)e(it)g(is)h(p)q(ossible)f(to)h (call)f(the)-30 1890 y(follo)o(wing)g(functions/macros:)74 1960 y Fh(void)21 b(Get_Choice_Counter)o(\(void)o(\))74 2009 y(TYPE)g(Get_Choice_Buffer)d(\(TYPE\))74 2059 y(void)j (No_More_Choice)84 b(\(void\))-30 2129 y Fm(The)15 b(function)e Fh(Get)p 287 2129 V 15 w(Choice)p 434 2129 V 15 w(Counter\(\))f Fm(returns)j(the)g(v)n(alue)e(of)g(the)i(in)o(v)o(o)q(cation)d(coun)o (ter)j(\(0)f(at)g(the)g(\014rst)h(call\).)-30 2228 y(The)g(macro)e Fh(Get)p 249 2228 V 16 w(Choice)p 397 2228 V 14 w(Buffer\()p Fd(TYPE)5 b Fh(\))14 b Fm(returns)h(a)f(p)q(oin)o(ter)g(to)f(the)i (bu\013er)g(\(casted)g(to)f Fd(TYPE)6 b Fm(\).)-30 2328 y(The)15 b(function)e Fh(No)p 265 2328 V 16 w(More)p 369 2328 V 15 w(Choice\(\))f Fm(deletes)j(the)f(c)o(hoice)h(p)q(oin)o (t)e(asso)q(ciated)i(with)e(the)i(function.)-30 2483 y Fi(9.1.8)48 b(Example:)22 b(input)14 b(and)h(output)f(argumen)o(ts) -30 2609 y Fm(All)f(examples)g(presen)o(ted)i(here)g(can)e(b)q(e)h (found)f(in)f(the)i Fh(ExamplesC)d Fm(sub-directory)k(of)d(the)i (distribution,)e(in)h(the)h(\014les)-30 2659 y Fh(examp.pl)f Fm(\(Prolog)g(part\))h(and)g Fh(examp)p 607 2659 V 15 w(c.c)f Fm(\(C)h(part\).)-30 2759 y(Let)h(us)f(de\014ne)g(a)g (predicate)h Fh(first)p 545 2759 V 14 w(occurrence\(A,)k(C,)j(P\))13 b Fm(whic)o(h)h(uni\014es)g Fh(P)f Fm(with)h(the)g(p)q(osition)f (\(from)g(0\))g(of)h(the)-30 2808 y(\014rst)h(o)q(ccurrence)i(of)c(the) i(c)o(haracter)g Fh(C)e Fm(in)h(the)g(atom)f Fh(A)p Fm(.)h(The)g (predicate)h(m)o(ust)f(fail)e(if)k Fh(C)e Fm(do)q(es)h(not)e(app)q(ear) i(in)e Fh(A)p Fm(.)-30 2908 y(In)h(the)h(prolog)e(\014le)h Fh(examp.pl)p Fm(:)p eop end %%Page: 187 189 TeXDict begin 187 188 bop -30 -45 a Fm(9.1)41 b(Calling)12 b(C)i(from)f(Prolog)1329 b(187)p -30 -27 1890 4 v 74 115 a Fh(:-)22 b(foreign\(first)p 429 115 14 2 v 13 w (occurrence\(+stri)o(ng,)c(+char,)j(-positive\)\).)-30 195 y Fm(In)14 b(the)h(C)f(\014le)g Fh(examp)p 318 195 V 14 w(c.c)p Fm(:)74 274 y Fh(#include)20 b()74 324 y(#include)g("gprolog.h")74 424 y(Bool)74 473 y (first_occurrence\(ch)o(ar)f(*str,)h(long)h(c,)h(long)f(*pos\))74 523 y({)118 573 y(char)g(*p;)118 673 y(p)g(=)h(strchr\(str,)e(c\);)118 722 y(if)h(\(p)h(==)f(NULL\))348 b(/*)21 b(C)h(does)f(not)g(appear)f (in)i(A)f(*/)161 772 y(return)g(FALSE;)326 b(/*)21 b(fail)g(*/)118 872 y(*pos)g(=)g(p)h(-)g(str;)326 b(/*)21 b(set)g(the)g(output)g (argument)f(*/)118 922 y(return)g(TRUE;)392 b(/*)21 b(succeed)f(*/)74 971 y(})-30 1051 y Fm(The)15 b(compilation)d(pro)q(duces)j(an)f (executable)h(called)f Fh(examp)p Fm(:)74 1131 y Fh(\045)22 b(gplc)f(examp.pl)f(examp)p 536 1131 V 15 w(c.c)-30 1210 y Fm(Examples)14 b(of)g(use:)74 1290 y Fh(|)22 b(?-)f (first_occurrence\(p)o(rolog)o(,)e(p,)i(X\).)74 1390 y(X)h(=)f(0)74 1489 y(|)h(?-)f(first_occurrence\(p)o(rolog)o(,)e(k,)i (X\).)74 1589 y(no)74 1688 y(|)h(?-)f(first_occurrence\(p)o(rolog)o(,)e (A,)i(X\).)74 1738 y({exception:)f(error\(instantiat)o(ion_e)o(rror,)o (first)o(_occu)o(rren)o(ce/3\))o(})74 1838 y(|)i(?-)f (first_occurrence\(p)o(rolog)o(,)e(1)j(,X\).)74 1888 y({exception:)e(error\(type_error)o(\(char)o(acter)o(,1\),f)o(irst_)o (occu)o(rrenc)o(e/3\)})-30 2045 y Fi(9.1.9)48 b(Example:)22 b(non-deterministic)13 b(co)q(de)-30 2171 y Fm(W)m(e)20 b(here)g(de\014ne)h(a)e(predicate)h Fh(occurrence\(A,)f(C,)j(P\))d Fm(whic)o(h)g(uni\014es)h Fh(P)f Fm(with)g(the)h(p)q(osition)f(\(from)g (0\))g(of)g(one)-30 2221 y(o)q(ccurrence)14 b(of)c(the)h(c)o(haracter)h Fh(C)e Fm(in)h(the)g(atom)f Fh(A)p Fm(.)g(The)h(predicate)g(will)f (fail)f(if)k Fh(C)d Fm(do)q(es)h(not)g(app)q(ear)g(in)f Fh(A)p Fm(.)g(The)h(predicate)-30 2271 y(is)i(re-executable)i(on)e(bac) o(ktrac)o(king.)k(The)d(information)d(that)i(m)o(ust)g(b)q(e)g (recorded)i(b)q(et)o(w)o(een)g(t)o(w)o(o)d(in)o(v)o(o)q(cations)g(of)h (the)-30 2321 y(function)h(is)g(the)g(next)h(starting)f(p)q(osition)f (in)g Fh(A)h Fm(to)g(searc)o(h)h(for)e Fh(C)p Fm(.)-30 2420 y(In)h(the)h(prolog)e(\014le)h Fh(examp.pl)p Fm(:)74 2500 y Fh(:-)22 b(foreign\(occurren)o(ce\(+)o(strin)o(g,)d(+char,)h (-positive\),)g([choice)p 1321 2500 V 14 w(size\(1\)]\).)-30 2579 y Fm(In)14 b(the)h(C)f(\014le)g Fh(examp)p 318 2579 V 14 w(c.c)p Fm(:)74 2659 y Fh(#include)20 b()74 2709 y(#include)g("gprolog.h")74 2808 y(Bool)74 2858 y(occurrence\(char)f(*str,)i(long)g(c,)g(long)g(*pos\))74 2908 y({)p eop end %%Page: 188 190 TeXDict begin 188 189 bop -30 -45 a Fm(188)1123 b(9)41 b(INTERF)-5 b(A)o(CING)14 b(PR)o(OLOG)f(AND)h(C)p -30 -27 1890 4 v 118 115 a Fh(char)21 b(**info_pos;)118 165 y(char)g(*p;)118 264 y(info_pos)f(=)i(Get_Choice_Buff)o(er\(ch)o(ar)d (**\);)i(/*)g(recover)f(the)i(buffer)e(*/)118 364 y(if)h (\(Get_Choice_Counte)o(r\(\))e(==)i(0\))174 b(/*)21 b(first)g (invocation)f(?)h(*/)161 414 y(*info_pos)f(=)i(str;)118 513 y(p)f(=)h(strchr\(*info_pos,)c(c\);)118 563 y(if)j(\(p)h(==)f (NULL\))348 b(/*)21 b(C)h(does)f(not)g(appear)f(*/)161 613 y({)205 663 y(No_More_Choice\(\);)193 b(/*)21 b(remove)g (choice-point)e(*/)205 713 y(return)i(FALSE;)282 b(/*)21 b(fail)g(*/)161 762 y(})118 862 y(*pos)g(=)g(p)h(-)g(str;)326 b(/*)21 b(set)g(the)g(output)g(argument)f(*/)118 912 y(*info_pos)g(=)h(p)h(+)g(1;)261 b(/*)21 b(update)g(next)g(starting)f (pos)h(*/)118 962 y(return)f(TRUE;)392 b(/*)21 b(succeed)f(*/)74 1012 y(})-30 1093 y Fm(The)15 b(compilation)d(pro)q(duces)j(an)f (executable)h(called)f Fh(examp)p Fm(:)74 1175 y Fh(\045)22 b(gplc)f(examp.pl)f(examp)p 536 1175 14 2 v 15 w(c.c)-30 1257 y Fm(Examples)14 b(of)g(use:)74 1336 y Fh(|)22 b(?-)f (occurrence\(prolog,)d(o,)k(X\).)74 1435 y(X)g(=)f(2)h(?)320 b Fm(\(here)15 b(the)f(user)h(presses)i Fh(;)c Fm(to)h(compute)g (another)h(solution\))74 1535 y Fh(X)22 b(=)f(4)h(?)320 b Fm(\(here)15 b(the)f(user)h(presses)i Fh(;)c Fm(to)h(compute)g (another)h(solution\))74 1634 y Fh(no)429 b Fm(\(no)13 b(more)h(solution\))74 1734 y Fh(|)22 b(?-)f(occurrence\(prolog,)d(k,)k (X\).)74 1834 y(no)-30 1916 y Fm(In)16 b(the)f(\014rst)h(example)f (when)h(the)g(second)g(\(the)g(last\))f(o)q(ccurrence)j(is)d(found)g (\()p Fh(X=4)p Fm(\))f(the)i(c)o(hoice-p)q(oin)o(t)f(remains)g(and)-30 1966 y(the)g(failure)f(is)g(detected)i(only)e(when)g(another)h (solution)e(is)h(requested)j(\(b)o(y)d(pressing)h Fh(;)p Fm(\).)k(It)14 b(is)g(p)q(ossible)h(to)f(impro)o(v)o(e)-30 2015 y(this)f(b)q(eha)o(vior)f(b)o(y)h(deleting)f(the)h(c)o(hoice-p)q (oin)o(t)g(when)g(there)h(is)e(no)h(more)f(o)q(ccurrence.)20 b(T)m(o)12 b(do)h(this)f(it)g(is)h(necessary)h(to)-30 2065 y(do)g(one)f(searc)o(h)i(ahead.)i(The)d(information)e(stored)i(is) f(the)h(p)q(osition)f(of)f(the)i(next)g(o)q(ccurrence.)21 b(Let)13 b(us)h(de\014ne)g(suc)o(h)g(a)-30 2115 y(b)q(eha)o(vior)g(for) g(the)g(predicate)h Fh(occurrence2/3)p Fm(.)-30 2215 y(In)f(the)h(prolog)e(\014le)h Fh(examp.pl)p Fm(:)74 2296 y Fh(:-)22 b(foreign\(occurren)o(ce2\()o(+stri)o(ng,)d(+char,)h (-positive\),)g([choice)p 1343 2296 V 14 w(size\(1\)]\).)-30 2378 y Fm(In)14 b(the)h(C)f(\014le)g Fh(examp)p 318 2378 V 14 w(c.c)p Fm(:)74 2460 y Fh(#include)20 b()74 2510 y(#include)g("gprolog.h")74 2609 y(Bool)74 2659 y(occurrence2\(char)f(*str,)h(long)h(c,)h(long)f(*pos\))74 2709 y({)118 2759 y(char)g(**info_pos;)118 2808 y(char)g(*p;)118 2908 y(info_pos)f(=)i(Get_Choice_Buff)o(er\(ch)o(ar)d(**\);)i(/*)g (recover)f(the)i(buffer)e(*/)p eop end %%Page: 189 191 TeXDict begin 189 190 bop -30 -45 a Fm(9.1)41 b(Calling)12 b(C)i(from)f(Prolog)1329 b(189)p -30 -27 1890 4 v 118 165 a Fh(if)21 b(\(Get_Choice_Counte)o(r\(\))e(==)i(0\))g(/*)h(first)f (invocation)e(?)j(*/)161 215 y({)205 264 y(p)g(=)f(strchr\(str,)f(c\);) 205 314 y(if)h(\(p)h(==)f(NULL\))261 b(/*)21 b(C)h(does)f(not)g(appear) f(at)i(all)f(*/)249 364 y({)292 414 y(No_More_Choice\(\);)106 b(/*)21 b(remove)g(choice-point)e(*/)292 464 y(return)i(FALSE;)195 b(/*)21 b(fail)g(*/)249 513 y(})205 613 y(*info_pos)f(=)i(p;)161 663 y(})772 713 y(/*)f(info_pos)f(=)i(an)f(occurrence)f(*/)118 762 y(*pos)h(=)g(*info_pos)f(-)i(str;)152 b(/*)21 b(set)g(the)g(output) g(argument)f(*/)118 862 y(p)h(=)h(strchr\(*info_pos)c(+)k(1,)f(c\);)118 912 y(if)g(\(p)h(==)f(NULL\))348 b(/*)21 b(no)g(more)g(occurrence)f(*/) 161 962 y(No_More_Choice\(\);)237 b(/*)21 b(remove)g(choice-point)e(*/) 118 1012 y(else)161 1061 y(*info_pos)h(=)i(p;)305 b(/*)21 b(else)g(update)g(next)f(solution)h(*/)118 1161 y(return)f(TRUE;)392 b(/*)21 b(succeed)f(*/)74 1211 y(})-30 1294 y Fm(Examples)14 b(of)g(use:)74 1374 y Fh(|)22 b(?-)f(occurrence2\(prolog)o(,)e(l,)i (X\).)74 1474 y(X)h(=)f(3)364 b Fm(\(here)15 b(the)f(user)h(is)f(not)g (prompted)g(since)h(there)g(is)f(no)f(more)h(alternativ)o(e\))74 1573 y Fh(|)22 b(?-)f(occurrence2\(prolog)o(,)e(o,)i(X\).)74 1673 y(X)h(=)f(2)h(?)320 b Fm(\(here)15 b(the)f(user)h(presses)i Fh(;)c Fm(to)h(compute)g(another)h(solution\))74 1773 y Fh(X)22 b(=)f(4)364 b Fm(\(here)15 b(the)f(user)h(is)f(not)g (prompted)g(since)h(there)g(is)f(no)f(more)h(alternativ)o(e\))-30 1931 y Fi(9.1.10)48 b(Example:)22 b(input/outpu)o(t)13 b(argumen)o(ts)-30 2057 y Fm(W)m(e)d(here)i(de\014ne)f(a)g(predicate)g Fh(char)p 540 2057 14 2 v 15 w(ascii\(Char,)19 b(Code)p Fm(\))10 b(whic)o(h)g(con)o(v)o(erts)i(in)e(b)q(oth)g(directions)h(the) g(c)o(haracter)h Fh(Char)-30 2107 y Fm(and)i(its)g(c)o(haracter-co)q (de)i Fh(Code)p Fm(.)h(This)d(predicate)h(is)f(then)g(similar)f(to)g Fh(char)p 1192 2107 V 15 w(code/2)g Fm(\(section)i(7.19.4,)c(page)j (116\).)-30 2207 y(In)g(the)h(prolog)e(\014le)h Fh(examp.pl)p Fm(:)74 2290 y Fh(:-)22 b(foreign\(char)p 407 2290 V 13 w(ascii\(?char,)d(?code\),)h([fct)p 965 2290 V 15 w(name\('Char)p 1200 2290 V 14 w(Ascii'\)]\).)-30 2373 y Fm(In)14 b(the)h(C)f(\014le)g Fh(examp)p 318 2373 V 14 w(c.c)p Fm(:)74 2456 y Fh(#include)20 b("gprolog.h")74 2555 y(Bool)74 2605 y(char_ascii\(FIOArg)f(*c,)i(FIOArg)f(*ascii\))74 2655 y({)118 2705 y(if)h(\(!c->is_var\))325 b(/*)21 b(Char)g(is)g(not)h (a)f(variable)f(*/)161 2755 y({)205 2804 y(ascii->unify)f(=)j(TRUE;)130 b(/*)21 b(enforce)f(unif.)h(of)g(Code)g(*/)205 2854 y(ascii->value.l)e (=)i(c->value.l;)f(/*)h(set)h(Code)f(*/)205 2904 y(return)g(TRUE;)304 b(/*)21 b(succeed)f(*/)p eop end %%Page: 190 192 TeXDict begin 190 191 bop -30 -45 a Fm(190)1123 b(9)41 b(INTERF)-5 b(A)o(CING)14 b(PR)o(OLOG)f(AND)h(C)p -30 -27 1890 4 v 161 115 a Fh(})118 215 y(if)21 b(\(ascii->is_var\))259 b(/*)21 b(Code)g(is)g(also)g(a)h(variable)e(*/)161 264 y(Pl_Err_Instantiatio)o(n\(\);)106 b(/*)21 b(emit)g(instantiation_err)o (or)e(*/)118 364 y(c->value.l)h(=)h(ascii->value.l;)41 b(/*)21 b(set)g(Char)g(*/)118 414 y(return)f(TRUE;)392 b(/*)21 b(succeed)f(*/)74 464 y(})-30 547 y Fm(If)g Fh(Char)c Fm(is)g(instan)o(tiated)h(it)f(is)g(necessary)j(to)e(enforce)g(the)g (uni\014cation)f(of)k Fh(Code)15 b Fm(since)j(it)e(could)h(b)q(e)g (instan)o(tiated.)-30 596 y(Recall)i(that)h(b)o(y)f(default)g(if)g(an)g (input/output)g(argumen)o(t)g(is)h(instan)o(tiated)f(it)g(will)f(not)h (b)q(e)h(uni\014ed)g(at)f(the)h(exit)-30 646 y(of)e(the)h(function)f (\(section)h(9.1.6,)e(page)h(185\).)30 b(If)18 b(b)q(oth)g Fh(Char)g Fm(and)g Fh(Code)f Fm(are)h(v)n(ariables)g(the)h(function)f (raises)g(an)-30 696 y Fh(instantiation)p 259 696 14 2 v 13 w(error)p Fm(.)f(The)e(w)o(a)o(y)e(to)h(raise)g(Prolog)f(errors) i(is)f(describ)q(ed)i(later)e(\(section)g(9.3,)f(page)h(196\).)-30 796 y(The)h(compilation)d(pro)q(duces)j(an)f(executable)h(called)f Fh(examp)p Fm(:)74 879 y Fh(\045)22 b(gplc)f(examp.pl)f(examp)p 536 879 V 15 w(c.c)-30 962 y Fm(Examples)14 b(of)g(use:)74 1045 y Fh(|)22 b(?-)f(char_ascii\(a,)e(X\).)74 1144 y(X)j(=)f(97)74 1244 y(|)h(?-)f(char_ascii\(X,)e(65\).)74 1343 y(X)j(=)f('A')74 1443 y(|)h(?-)f(char_ascii\(a,)e(12\).)74 1543 y(no)74 1642 y(|)j(?-)f(char_ascii\(X,)e(X\).)74 1692 y({exception:)h (error\(instantiat)o(ion_e)o(rror,)o(char_)o(ascii)o(/2\)})74 1792 y(|)i(?-)f(char_ascii\(1,)e(12\).)74 1842 y({exception:)h (error\(type_error)o(\(char)o(acter)o(,1\),c)o(har_a)o(scii)o(/2\)})-30 2008 y Ff(9.2)56 b(Manipulating)18 b(Prolog)h(terms)-30 2134 y Fi(9.2.1)48 b(In)o(tro)q(duction)-30 2260 y Fm(In)14 b(the)h(follo)o(wing)c(w)o(e)j(presen)o(ts)h(a)f(set)g(of)g(functions)f (to)h(manipulate)f(Prolog)g(terms.)18 b(F)m(or)c(simple)f(foreign)g (terms)i(the)-30 2310 y(functions)f(manipulate)f(simple)h(C)f(t)o(yp)q (es)i(\(section)g(9.1.2,)d(page)h(183\).)-30 2410 y(F)m(unctions)e (managing)f(lists)g(handle)h(an)g(arra)o(y)f(of)h(2)f(elemen)o(ts)i (\(of)f(t)o(yp)q(e)g Fh(PlTerm)p Fm(\))f(con)o(taining)g(the)h(terms)h (corresp)q(ond-)-30 2460 y(ing)j(to)f(the)i(head)f(and)f(the)i(tail)d (of)i(the)g(list.)20 b(F)m(or)15 b(the)g(empt)o(y)g(list)f Fh(NULL)g Fm(is)h(passed)h(as)f(the)g(arra)o(y)m(.)20 b(These)c(functions)-30 2510 y(require)f(to)e(\015atten)g(a)g(list)g (in)g(eac)o(h)g(sub-list.)18 b(T)m(o)13 b(simplify)e(the)j(managemen)o (t)e(of)h(prop)q(er)h(lists)f(\(i.e.)18 b(lists)13 b(terminated)-30 2559 y(b)o(y)j Fh([])p Fm(\))e(a)g(set)i(of)e(functions)h(is)f(pro)o (vided)h(that)g(handle)f(the)i(n)o(um)o(b)q(er)f(of)f(elemen)o(ts)h(of) f(the)i(list)e(\(an)h(in)o(teger\))g(and)f(an)-30 2609 y(arra)o(y)i(whose)h(elemen)o(ts)f(\(of)g(t)o(yp)q(e)g Fh(PlTerm)p Fm(\))f(are)h(the)h(elemen)o(ts)g(of)e(the)i(list.)23 b(The)17 b(caller)f(of)f(these)i(functions)f(m)o(ust)-30 2659 y(pro)o(vide)e(the)h(arra)o(y)m(.)-30 2759 y(F)m(unctions)f (managing)e(comp)q(ound)i(terms)g(handle)g(a)f(functor)h(\(the)h (principal)e(functor)h(of)f(the)h(term\),)g(an)g(arit)o(y)f Fd(N)21 b Fg(\025)-30 2808 y Fm(0)16 b(and)f(an)g(arra)o(y)h(of)i Fd(N)k Fm(elemen)o(ts)17 b(\(of)e(t)o(yp)q(e)h Fh(PlTerm)p Fm(\))e(con)o(taining)h(the)h(sub-terms)h(of)e(the)h(comp)q(ound)f (term.)24 b(Since)-30 2858 y(a)14 b(list)g(is)h(a)f(sp)q(ecial)g(case)h (of)f(comp)q(ound)g(term)h(\(functor)g(=)f Fh('.')20 b Fm(and)14 b(arit)o(y=2\))g(it)g(is)g(p)q(ossible)g(to)g(use)i(an)o(y) d(function)-30 2908 y(managing)k(comp)q(ound)g(terms)i(to)f(deal)f (with)h(a)f(list)h(but)g(the)g(error)h(detection)g(is)f(not)g(the)g (same.)30 b(Indeed)19 b(man)o(y)p eop end %%Page: 191 193 TeXDict begin 191 192 bop -30 -45 a Fm(9.2)41 b(Manipulating)12 b(Prolog)h(terms)1243 b(191)p -30 -27 1890 4 v -30 115 a(functions)18 b(c)o(hec)o(k)g(if)e(the)i(Prolog)e(argumen)o(t)h(is)g (correct.)29 b(The)18 b(name)e(of)h(a)g(read)g(or)g(unify)f(function)h (c)o(hec)o(king)h(the)-30 165 y(Prolog)f(argumen)o(ts)g(is)h(of)e(the)i (form)e Fd(Name)p 680 165 14 2 v 23 w Fh(Check\(\))p Fm(.)26 b(F)m(or)17 b(eac)o(h)h(of)e(these)j(functions)e(there)i(is)e (a)g(also)g(c)o(hec)o(k-free)-30 215 y(v)o(ersion)d(called)g Fd(Name)6 b Fh(\(\))p Fm(.)18 b(W)m(e)c(then)g(only)f(presen)o(t)j(the) e(name)g(of)f(c)o(hec)o(king)h(functions.)-30 371 y Fi(9.2.2)48 b(Managing)16 b(Prolog)f(atoms)-30 498 y Fm(Eac)o(h)h(atom)e(has)h(a)g (unique)g(in)o(ternal)g(k)o(ey)g(whic)o(h)g(corresp)q(onds)i(to)e(its)g (index)g(in)g(the)g(GNU)g(Prolog)f(atom)h(table.)21 b(It)-30 547 y(is)14 b(p)q(ossible)g(to)g(obtain)f(the)i(information)d(ab)q(out) h(an)h(atom)f(and)h(to)g(create)h(new)f(atoms)g(using:)74 626 y Fh(char)21 b(*Atom_Name)238 b(\(int)21 b(atom\))74 675 y(int)65 b(Atom_Length)194 b(\(int)21 b(atom\))74 725 y(Bool)43 b(Atom_Needs_Quote)84 b(\(int)21 b(atom\))74 775 y(Bool)43 b(Atom_Needs_Scan)106 b(\(int)21 b(atom\))74 825 y(Bool)43 b(Is_Valid_Atom)150 b(\(int)21 b(atom\))74 875 y(int)65 b(Create_Atom)194 b(\(char)21 b(*str\))74 924 y(int)65 b(Create_Allocate_A)o(tom\(c)o(har)19 b(*str\))74 974 y(int)65 b(Find_Atom)238 b(\(char)21 b(*str\))74 1024 y(int)65 b(ATOM_CHAR)238 b(\(char)21 b(c\))74 1074 y(int)65 b(atom_nil)74 1124 y(int)g(atom_false)74 1174 y(int)g(atom_true)74 1223 y(int)g(atom_end_of_file)-30 1301 y Fm(The)18 b(macro)f Fh(Atom)p 278 1301 V 15 w(Name\(atom\))e Fm(returns)k(the)f(in)o(ternal)f(string)g(of)j Fh(atom)c Fm(\(this)i(string)f(should)g(not)g(b)q(e)h(mo)q(di\014ed\).)-30 1351 y(The)d(function)e Fh(Atom)p 309 1351 V 15 w(Lengh\(atom\))f Fm(returns)j(the)g(length)f(\(of)f(the)h(name\))g(of)j Fh(atom)p Fm(.)-30 1451 y(The)c(function)f Fh(Atom)p 306 1451 V 15 w(Needs)p 431 1451 V 14 w(Scan\(atom\))e Fm(indicates)j(if)e(the)i(canonical)e(form)h(of)j Fh(atom)c Fm(needs)i(to)f(b)q(e)h(quoted)g(as)f(done)-30 1501 y(b)o(y)19 b Fh(writeq/2)e Fm(\(section)j(7.14.6,)d(page)i(96\).)32 b(In)18 b(that)h(case)h Fh(Atom)p 1062 1501 V 15 w(Needs)p 1187 1501 V 14 w(Scan\(atom\))d Fm(indicates)i(if)f(this)g(simply)-30 1551 y(comes)g(do)o(wn)f(to)f(write)i(quotes)f(around)g(the)h(name)f (of)i Fh(atom)d Fm(or)h(if)f(it)h(necessary)i(to)e(scan)g(eac)o(h)h(c)o (haracter)g(of)f(the)-30 1600 y(name)j(b)q(ecause)h(there)g(are)f(some) g(non-prin)o(table)f(c)o(haracters)i(\(or)f(included)g(quote)f(c)o (haracters\).)37 b(The)20 b(function)-30 1650 y Fh(Is)p 17 1650 V 16 w(Valid)p 143 1650 V 14 w(Atom\(atom\))12 b Fm(is)i(true)h(only)e(if)j Fh(atom)d Fm(is)h(the)g(in)o(ternal)g(k)o (ey)g(of)f(an)h(existing)f(atom.)-30 1750 y(The)i(function)g Fh(Create)p 355 1750 V 14 w(Atom\(str\))e Fm(adds)i(a)f(new)h(atom)f (whose)h(name)f(is)h(the)g(con)o(ten)o(t)g(of)i Fh(str)d Fm(to)h(the)g(system)g(and)-30 1800 y(returns)i(its)e(in)o(ternal)f(k)o (ey)m(.)21 b(If)15 b(the)g(atom)f(already)h(exists)h(its)f(k)o(ey)g(is) f(simply)g(returned.)23 b(The)16 b(string)f Fh(str)f Fm(passed)i(to)-30 1849 y(the)g(function)e(should)g(not)h(b)q(e)g(mo)q (di\014ed)f(later.)20 b(The)15 b(function)g Fh(Create)p 1140 1849 V 14 w(Allocate)p 1330 1849 V 14 w(Atom\(str\))e Fm(is)h(pro)o(vided)h(when)-30 1899 y(this)f(condition)g(cannot)g(b)q (e)g(ensured.)20 b(It)14 b(simply)f(mak)o(es)g(a)h(dynamic)f(cop)o(y)h (of)j Fh(str)p Fm(.)-30 1999 y(The)e(function)f Fh(Find)p 310 1999 V 15 w(Atom\(str\))e Fm(returns)k(the)f(in)o(ternal)f(k)o(ey)g (of)g(the)h(atom)e(whose)i(name)f(is)g Fh(str)g Fm(or)g Fh(-1)g Fm(if)f(do)q(es)i(not)-30 2049 y(exist.)-30 2148 y(All)e(atoms)h(corresp)q(onding)g(to)g(a)f(single)h(c)o(haracter)h (already)e(exist)h(and)g(their)g(k)o(ey)g(can)f(b)q(e)i(obtained)e(via) g(the)h(macro)-30 2198 y Fh(ATOM)p 61 2198 V 15 w(CHAR)p Fm(.)h(F)m(or)g(instance)h Fh(ATOM)p 518 2198 V 15 w(CHAR\('.'\))21 b Fm(is)16 b(the)g(atom)f(asso)q(ciated)h(with)f Fh('.')23 b Fm(\(this)16 b(atom)e(is)i(the)g(functor)g(of)-30 2248 y(lists\).)i(The)c(other)h(v)n(ariables)e(corresp)q(ond)i(to)e(the)h (in)o(ternal)f(k)o(ey)h(of)f(frequen)o(tly)h(used)g(atoms:)k Fh([])p Fm(,)13 b Fh(false)p Fm(,)f Fh(true)g Fm(and)-30 2298 y Fh(end)p 39 2298 V 16 w(of)p 99 2298 V 15 w(file)p Fm(.)-30 2454 y Fi(9.2.3)48 b(Reading)15 b(Prolog)g(terms)-30 2581 y Fm(The)e(name)e(of)g(all)g(functions)h(presen)o(ted)i(here)f (are)f(of)f(the)h(form)f Fh(Rd)p 1036 2581 V 16 w Fd(Name)p 1146 2581 V 22 w Fh(Check\(\))p Fm(.)k(They)e(all)d(c)o(hec)o(k)j(the)f (v)n(alidit)o(y)e(of)-30 2631 y(the)15 b(Prolog)f(term)h(to)f(read)h (emitting)e(appropriate)i(errors)g(if)f(necessary)m(.)21 b(Eac)o(h)14 b(function)h(has)f(a)g(c)o(hec)o(k-free)i(v)o(ersion)-30 2680 y(called)e Fh(Rd)p 135 2680 V 15 w Fd(Name)7 b Fh(\(\))p Fm(.)-30 2780 y Fi(Simple)18 b(foreign)f(t)o(yp)q(es)p Fm(:)k(for)16 b(eac)o(h)g(simple)g(foreign)f(t)o(yp)q(e)i(\(section)g (9.1.2,)d(page)i(183\))f(there)i(is)f(a)g(read)g(function)-30 2830 y(\(used)f(b)o(y)f(the)h(in)o(terface)f(when)g(an)g(input)g (argumen)o(t)g(is)f(pro)o(vided\):)74 2908 y Fh(long)87 b(Rd_Integer_Chec)o(k)41 b(\(PlTerm)20 b(term\))p eop end %%Page: 192 194 TeXDict begin 192 193 bop -30 -45 a Fm(192)1123 b(9)41 b(INTERF)-5 b(A)o(CING)14 b(PR)o(OLOG)f(AND)h(C)p -30 -27 1890 4 v 74 115 a Fh(long)87 b(Rd_Positive_Che)o(ck)19 b(\(PlTerm)h(term\))74 165 y(double)43 b(Rd_Float_Check)84 b(\(PlTerm)20 b(term\))74 215 y(double)43 b(Rd_Number_Check)62 b(\(PlTerm)20 b(term\))74 264 y(int)109 b(Rd_Atom_Check)d(\(PlTerm)20 b(term\))74 314 y(int)109 b(Rd_Boolean_Chec)o(k)41 b(\(PlTerm)20 b(term\))74 364 y(int)109 b(Rd_Char_Check)d(\(PlTerm)20 b(term\))74 414 y(int)109 b(Rd_In_Char_Chec)o(k)41 b(\(PlTerm)20 b(term\))74 464 y(int)109 b(Rd_Code_Check)d(\(PlTerm)20 b(term\))74 513 y(int)109 b(Rd_In_Code_Chec)o(k)41 b(\(PlTerm)20 b(term\))74 563 y(int)109 b(Rd_Byte_Check)d(\(PlTerm)20 b(term\))74 613 y(int)109 b(Rd_In_Byte_Chec)o(k)41 b(\(PlTerm)20 b(term\))74 663 y(char)65 b(*Rd_String_Check)d(\(PlTerm)20 b(term\))74 713 y(char)65 b(*Rd_Chars_Check)84 b(\(PlTerm)20 b(term\))74 762 y(char)65 b(*Rd_Codes_Check)84 b(\(PlTerm)20 b(term\))74 812 y(int)109 b(Rd_Chars_Str_Ch)o(eck\(P)o(lTerm)18 b(term,)j(char)g(*str\))74 862 y(int)109 b(Rd_Codes_Str_Ch)o(eck\(P)o (lTerm)18 b(term,)j(char)g(*str\))-30 942 y Fm(All)16 b(functions)g(returning)g(a)g(C)g(string)g(\()p Fh(char)21 b(*)p Fm(\))16 b(use)h(a)f(same)g(bu\013er.)26 b(The)16 b(function)g Fh(Rd)p 1446 942 14 2 v 15 w(Chars)p 1571 942 V 15 w(Str)p 1652 942 V 15 w(Check\(\))e Fm(is)-30 991 y(similar)e(to)i Fh(Rd)p 204 991 V 15 w(Chars)p 329 991 V 15 w(Check\(\))e Fm(but)h(accepts)i(as)f(argumen)o(t)f(a)g (string)h(to)f(store)i(the)f(result)g(and)f(returns)i(the)f(length)-30 1041 y(of)g(that)g(string)g(\(whic)o(h)g(is)f(also)h(the)g(length)g(of) f(the)i(Prolog)e(list\).)k(Similarly)12 b(for)i Fh(Rd)p 1324 1041 V 15 w(Codes)p 1449 1041 V 15 w(Str)p 1530 1041 V 15 w(Check\(\))p Fm(.)-30 1141 y Fi(Complex)22 b(terms)p Fm(:)k(the)20 b(follo)o(wing)c(functions)j(return)h(the)f (sub-argumen)o(ts)h(\(terms\))f(of)g(complex)f(terms)i(as)e(an)-30 1191 y(arra)o(y)e(of)h Fh(PlTerm)e Fm(except)h Fh(Rd)p 457 1191 V 16 w(Proper)p 605 1191 V 14 w(List)p 707 1191 V 15 w(Check\(\))e Fm(whic)o(h)h(returns)i(the)f(size)g(of)e(the)i (list)f(read)h(\(and)f(initializes)-30 1240 y(the)g(arra)o(y)f Fh(element)p Fm(\).)k(Refer)c(to)g(the)g(in)o(tro)q(duction)g(of)g (this)g(section)h(for)e(more)h(information)e(ab)q(out)i(the)h(argumen)o (ts)-30 1290 y(of)f(complex)f(functions)h(\(section)h(9.2.1,)d(page)i (190\).)74 1370 y Fh(int)109 b(Rd_Proper_List_)o(Check)o(\(PlTe)o(rm)19 b(term,)i(PlTerm)f(*arg\))74 1420 y(PlTerm)h(*Rd_List_Check)149 b(\(PlTerm)21 b(term\))74 1469 y(PlTerm)g(*Rd_Compound_Che)o(ck)62 b(\(PlTerm)21 b(term,)g(int)g(*functor,)f(int)h(*arity\))74 1519 y(PlTerm)g(*Rd_Callable_Che)o(ck)62 b(\(PlTerm)21 b(term,)g(int)g(*functor,)f(int)h(*arity\))-30 1676 y Fi(9.2.4)48 b(Unifying)15 b(Prolog)g(terms)-30 1803 y Fm(The)e(name)e(of)g(all)g(functions)h(presen)o(ted)i(here)f(are)f(of)f (the)h(form)f Fh(Un)p 1036 1803 V 16 w Fd(Name)p 1146 1803 V 22 w Fh(Check\(\))p Fm(.)k(They)e(all)d(c)o(hec)o(k)j(the)f(v)n (alidit)o(y)e(of)-30 1852 y(the)15 b(Prolog)d(term)i(to)f(unify)g (emitting)g(appropriate)g(errors)i(if)e(necessary)m(.)19 b(Eac)o(h)14 b(function)f(has)h(a)f(c)o(hec)o(k-free)i(v)o(ersion)-30 1902 y(called)f Fh(Un)p 135 1902 V 15 w Fd(Name)7 b Fh(\(\))p Fm(.)-30 2002 y Fi(Simple)16 b(foreign)e(t)o(yp)q(es)p Fm(:)j(for)d(eac)o(h)g(simple)f(foreign)h(t)o(yp)q(e)g(\(section)h (9.1.2,)d(page)i(183\))f(there)i(is)f(an)f(unify)g(function)-30 2052 y(\(used)i(b)o(y)f(the)h(in)o(terface)f(when)g(an)g(output)g (argumen)o(t)g(is)g(pro)o(vided\):)74 2131 y Fh(Bool)21 b(Un_Integer_Check)e(\(long)h(n,)87 b(PlTerm)21 b(term\))74 2181 y(Bool)g(Un_Positive_Check\()o(long)d(n,)87 b(PlTerm)21 b(term\))74 2231 y(Bool)g(Un_Float_Check)63 b(\(double)20 b(n,)43 b(PlTerm)21 b(term\))74 2281 y(Bool)g(Un_Number_Check)41 b(\(double)20 b(n,)43 b(PlTerm)21 b(term\))74 2330 y(Bool)g (Un_Atom_Check)85 b(\(int)21 b(atom,)42 b(PlTerm)21 b(term\))74 2380 y(Bool)g(Un_Boolean_Check)e(\(int)i(b,)108 b(PlTerm)21 b(term\))74 2430 y(Bool)g(Un_Char_Check)85 b(\(int)21 b(c,)108 b(PlTerm)21 b(term\))74 2480 y(Bool)g(Un_In_Char_Check)e (\(int)i(c,)108 b(PlTerm)21 b(term\))74 2530 y(Bool)g(Un_Code_Check)85 b(\(int)21 b(c,)108 b(PlTerm)21 b(term\))74 2579 y(Bool)g (Un_In_Code_Check)e(\(int)i(c,)108 b(PlTerm)21 b(term\))74 2629 y(Bool)g(Un_Byte_Check)85 b(\(int)21 b(b,)108 b(PlTerm)21 b(term\))74 2679 y(Bool)g(Un_In_Byte_Check)e(\(int)i(b,)108 b(PlTerm)21 b(term\))74 2729 y(Bool)g(Un_String_Check)41 b(\(char)20 b(*str,)h(PlTerm)g(term\))74 2779 y(Bool)g(Un_Chars_Check) 63 b(\(char)20 b(*str,)h(PlTerm)g(term\))74 2829 y(Bool)g (Un_Codes_Check)63 b(\(char)20 b(*str,)h(PlTerm)g(term\))-30 2908 y Fm(The)15 b(function)f Fh(Un)p 266 2908 V 16 w(Number)p 414 2908 V 14 w(Check\(n,)20 b(term\))13 b Fm(uni\014es)i Fh(term)f Fm(with)g(an)g(in)o(teger)h(if)h Fh(n)e Fm(is)h(an)f(in)o (teger,)g(with)g(a)g(\015oating)p eop end %%Page: 193 195 TeXDict begin 193 194 bop -30 -45 a Fm(9.2)41 b(Manipulating)12 b(Prolog)h(terms)1243 b(193)p -30 -27 1890 4 v -30 115 a(p)q(oin)o(t)13 b(n)o(um)o(b)q(er)h(otherwise.)k(The)c(function)f Fh(Un)p 723 115 14 2 v 15 w(String)p 870 115 V 14 w(Check\(str,)20 b(term\))12 b Fm(creates)j(the)f(atom)e(corresp)q(onding)i(to)-30 165 y Fh(str)g Fm(and)f(then)i(uni\014es)f(term)h(with)e(it)h(\(same)g (as)g Fh(Un)p 808 165 V 15 w(Atom)p 911 165 V 15 w(Check\(Create)p 1190 165 V 13 w(Allocate)p 1379 165 V 14 w(Atom\(str\),)20 b(term\))p Fm(\).)-30 264 y Fi(Complex)i(terms)p Fm(:)k(the)19 b(follo)o(wing)d(functions)j(accept)h(the)f(sub-argumen)o(ts)g (\(terms\))h(of)e(complex)g(terms)i(as)e(an)-30 314 y(arra)o(y)d(of)i Fh(PlTerm)p Fm(.)i(Refer)c(to)g(the)g(in)o(tro)q(duction)g(of)f(this)h (section)g(for)f(more)h(information)e(ab)q(out)i(the)g(argumen)o(ts)g (of)-30 364 y(complex)f(functions)g(\(section)h(9.2.1,)c(page)j(190\).) 74 442 y Fh(Bool)21 b(Un_Proper_List_Che)o(ck\(in)o(t)e(size,)i(PlTerm) f(*arg,)h(PlTerm)g(term\))74 492 y(Bool)g(Un_List_Check)150 b(\(PlTerm)20 b(*arg,)h(PlTerm)g(term\))74 542 y(Bool)g (Un_Compound_Check)62 b(\(int)21 b(functor,)f(int)h(arity,)g(PlTerm)f (*arg,)641 592 y(PlTerm)g(term\))74 642 y(Bool)h(Un_Callable_Check)62 b(\(int)21 b(functor,)f(int)h(arity,)g(PlTerm)f(*arg,)641 691 y(PlTerm)g(term\))-30 770 y Fm(All)12 b(these)i(functions)e(c)o (hec)o(k)i(the)f(t)o(yp)q(e)g(of)f(the)h(term)g(to)f(unify)g(and)g (return)i(the)f(result)g(of)f(the)h(uni\014cation.)k(Generally)-30 819 y(if)h(an)g(uni\014cation)g(fails)f(the)h(C)h(function)f(returns)h Fh(FALSE)f Fm(to)g(enforce)h(a)f(failure.)30 b(Ho)o(w)o(ev)o(er)19 b(if)e(there)j(are)f(sev)o(eral)-30 869 y(argumen)o(ts)e(to)e(unify)g (and)h(if)f(an)h(uni\014cation)f(fails)g(then)h(the)h(C)f(function)f (returns)j Fh(FALSE)d Fm(and)g(the)i(t)o(yp)q(e)f(of)g(other)-30 919 y(argumen)o(ts)h(has)e(not)h(b)q(een)h(c)o(hec)o(k)o(ed.)25 b(Normally)15 b(all)f(error)j(cases)g(are)f(tested)i(b)q(efore)e(doing) f(an)o(y)g(w)o(ork)h(to)g(b)q(e)g(sure)-30 969 y(that)c(the)g (predicate)h(fails/succeeds)f(only)f(if)f(no)i(error)g(condition)f(is)g (satis\014ed.)18 b(So)11 b(a)g(go)q(o)q(d)g(metho)q(d)h(is)f(to)h(c)o (hec)o(k)g(if)f(the)-30 1019 y(v)n(alidit)o(y)i(of)g(all)g(argumen)o (ts)i(to)f(unify)f(and)h(later)g(to)g(do)g(the)h(uni\014cation)f (\(using)g(c)o(hec)o(k-free)i(functions\).)j(Ob)o(viously)-30 1069 y(if)c(there)i(is)f(only)f(one)h(to)g(unify)e(it)i(is)f(more)h (e\016cien)o(t)g(to)g(use)h(a)e(unify)g(function)g(c)o(hec)o(king)h (the)h(argumen)o(t.)23 b(F)m(or)16 b(the)-30 1118 y(other)f(cases)g (the)g(in)o(terface)f(pro)o(vides)g(a)g(set)h(of)e(functions)h(to)g(c)o (hec)o(k)g(the)h(t)o(yp)q(e)f(of)g(a)f(term.)-30 1218 y Fi(Simple)e(foreign)f(t)o(yp)q(es)p Fm(:)15 b(for)10 b(eac)o(h)g(simple)f(foreign)h(t)o(yp)q(e)g(\(section)h(9.1.2,)d(page)i (183\))f(there)j(is)d(c)o(hec)o(k-for-uni\014cation)-30 1268 y(function)14 b(\(used)h(b)o(y)f(the)g(in)o(terface)h(when)f(an)g (output)g(argumen)o(t)f(is)h(pro)o(vided\):)74 1346 y Fh(void)21 b(Check_For_Un_Integ)o(er)e(\(PlTerm)h(term\))74 1396 y(void)h(Check_For_Un_Posit)o(ive\(P)o(lTerm)d(term\))74 1446 y(void)j(Check_For_Un_Float)62 b(\(PlTerm)20 b(term\))74 1495 y(void)h(Check_For_Un_Numbe)o(r)41 b(\(PlTerm)20 b(term\))74 1545 y(void)h(Check_For_Un_Atom)84 b(\(PlTerm)20 b(term\))74 1595 y(void)h(Check_For_Un_Boole)o(an)e(\(PlTerm)h(term\)) 74 1645 y(void)h(Check_For_Un_Char)84 b(\(PlTerm)20 b(term\))74 1695 y(void)h(Check_For_Un_In_Ch)o(ar)e(\(PlTerm)h(term\))74 1745 y(void)h(Check_For_Un_Code)84 b(\(PlTerm)20 b(term\))74 1794 y(void)h(Check_For_Un_In_Co)o(de)e(\(PlTerm)h(term\))74 1844 y(void)h(Check_For_Un_Byte)84 b(\(PlTerm)20 b(term\))74 1894 y(void)h(Check_For_Un_In_By)o(te)e(\(PlTerm)h(term\))74 1944 y(void)h(Check_For_Un_Strin)o(g)41 b(\(PlTerm)20 b(term\))74 1994 y(void)h(Check_For_Un_Chars)62 b(\(PlTerm)20 b(term\))74 2043 y(void)h(Check_For_Un_Codes)62 b(\(PlTerm)20 b(term\))-30 2122 y Fi(Complex)c(terms)p Fm(:)h(the)e(follo)o(wing)c (functions)j(c)o(hec)o(k)h(the)f(v)n(alidit)o(y)e(of)h(complex)h (terms:)74 2200 y Fh(void)21 b(Check_For_Un_List)84 b(\(PlTerm)20 b(term\))74 2250 y(void)h(Check_For_Un_Compo)o(und\(P)o(lTerm)d(term\)) 74 2300 y(void)j(Check_For_Un_Calla)o(ble\(P)o(lTerm)d(term\))74 2349 y(void)j(Check_For_Un_Varia)o(ble\(P)o(lTerm)d(term\))-30 2428 y Fm(The)e(function)f Fh(Check)p 334 2428 V 15 w(For)p 415 2428 V 15 w(Un)p 474 2428 V 15 w(List\(term\))e Fm(c)o(hec)o(ks)k (if)h Fh(term)c Fm(can)h(b)q(e)h(uni\014ed)g(with)f(a)g(list.)21 b(This)16 b(test)g(is)f(done)h(for)-30 2478 y(the)h(en)o(tire)h(list)e (\(not)g(only)g(for)g(the)h(functor/arit)o(y)f(of)j Fh(term)c Fm(but)i(also)f(recursiv)o(ely)h(on)f(the)h(tail)f(of)f(the)i(list\).) 26 b(The)-30 2527 y(function)12 b Fh(Check)p 244 2527 V 15 w(For)p 325 2527 V 15 w(Un)p 384 2527 V 15 w(Variable\(term\))d Fm(ensures)14 b(that)e Fh(term)f Fm(is)h(not)g(curren)o(tly)h(instan)o (tiated.)k(These)c(functions)-30 2577 y(can)g(b)q(e)f(de\014ned)i (using)d(functions)h(to)g(test)i(the)e(t)o(yp)q(e)h(of)e(a)h(Prolog)f (term)i(\(section)g(9.2.6,)d(page)i(194\))f(and)h(functions)g(to)-30 2627 y(raise)j(Prolog)e(errors)i(\(section)g(9.3,)d(page)i(196\).)j(F)m (or)d(instance)h Fh(Check)p 1106 2627 V 14 w(For)p 1186 2627 V 15 w(Un)p 1245 2627 V 16 w(List\(term\))c Fm(is)j(de\014ned)h (as)f(follo)o(ws:)74 2705 y Fh(void)21 b(Check_For_Un_List\()o(PlTer)o (m)e(term\))74 2755 y({)96 2805 y(if)i(\(!Blt_List_Or_Parti)o(al_Li)o (st\(te)o(rm\)\))183 2855 y(Pl_Err_Type\(type_l)o(ist,)d(term\);)74 2905 y(})p eop end %%Page: 194 196 TeXDict begin 194 195 bop -30 -45 a Fm(194)1123 b(9)41 b(INTERF)-5 b(A)o(CING)14 b(PR)o(OLOG)f(AND)h(C)p -30 -27 1890 4 v -30 115 a Fi(9.2.5)48 b(Creating)16 b(Prolog)f(terms)-30 241 y Fm(These)k(functions)e(are)g(pro)o(vided)g(to)g(creates)i(Prolog) d(terms.)28 b(Eac)o(h)17 b(function)g(returns)h(a)f Fh(PlTerm)f Fm(con)o(taining)g(the)-30 291 y(created)g(term.)-30 391 y Fi(Simple)d(foreign)e(t)o(yp)q(es)p Fm(:)16 b(for)11 b(eac)o(h)g(simple)g(foreign)g(t)o(yp)q(e)g(\(section)h(9.1.2,)e(page)h (183\))g(there)h(is)f(a)g(creation)h(function:)74 474 y Fh(PlTerm)21 b(Mk_Integer)f(\(long)g(n\))74 524 y(PlTerm)h (Mk_Positive\(long)d(n\))74 573 y(PlTerm)j(Mk_Float)64 b(\(double)20 b(n\))74 623 y(PlTerm)h(Mk_Number)42 b(\(double)20 b(n\))74 673 y(PlTerm)h(Mk_Atom)86 b(\(int)20 b(atom\))74 723 y(PlTerm)h(Mk_Boolean)f(\(int)g(b\))74 773 y(PlTerm)h(Mk_Char)86 b(\(int)20 b(c\))74 822 y(PlTerm)h(Mk_In_Char)f(\(int)g(c\))74 872 y(PlTerm)h(Mk_Code)86 b(\(int)20 b(c\))74 922 y(PlTerm)h (Mk_In_Code)f(\(int)g(c\))74 972 y(PlTerm)h(Mk_Byte)86 b(\(int)20 b(b\))74 1022 y(PlTerm)h(Mk_In_Byte)f(\(int)g(b\))74 1072 y(PlTerm)h(Mk_String)42 b(\(char)20 b(*str\))74 1121 y(PlTerm)h(Mk_Chars)64 b(\(char)20 b(*str\))74 1171 y(PlTerm)h(Mk_Codes)64 b(\(char)20 b(*str\))-30 1254 y Fm(The)13 b(function)e Fh(Mk)p 261 1254 14 2 v 16 w(Number\(n,)20 b(term\))10 b Fm(initializes)h Fh(term)g Fm(with)g(an)h(in)o(teger)g (if)j Fh(n)c Fm(is)h(an)g(in)o(teger,)g(with)f(a)h(\015oating)f(p)q (oin)o(t)-30 1304 y(n)o(um)o(b)q(er)17 b(otherwise.)25 b(The)16 b(function)g Fh(Mk)p 630 1304 V 15 w(String\(str\))e Fm(\014rst)i(creates)i(an)e(atom)f(corresp)q(onding)i(to)f Fh(str)f Fm(and)h(then)-30 1354 y(returns)g(that)e(Prolog)f(atom)g (\(i.e.)18 b(equiv)n(alen)o(t)13 b(to)h Fh(Mk)p 825 1354 V 15 w(Atom\(Create)p 1082 1354 V 13 w(Allocate)p 1271 1354 V 14 w(Atom\(str\)\))p Fm(\).)-30 1453 y Fi(Complex)22 b(terms)p Fm(:)k(the)19 b(follo)o(wing)d(functions)j(accept)h(the)f (sub-argumen)o(ts)g(\(terms\))h(of)e(complex)g(terms)i(as)e(an)-30 1503 y(arra)o(y)d(of)i Fh(PlTerm)p Fm(.)i(Refer)c(to)g(the)g(in)o(tro)q (duction)g(of)f(this)h(section)g(for)f(more)h(information)e(ab)q(out)i (the)g(argumen)o(ts)g(of)-30 1553 y(complex)f(functions)g(\(section)h (9.2.1,)c(page)j(190\).)74 1636 y Fh(PlTerm)21 b(Mk_Proper_List\(i)o (nt)e(size,)i(PlTerm)f(*arg\))74 1686 y(PlTerm)h(Mk_List)151 b(\(PlTerm)20 b(*arg\))74 1736 y(PlTerm)h(Mk_Compound)63 b(\(int)21 b(functor,)f(int)h(arity,)g(PlTerm)f(*arg\))74 1786 y(PlTerm)h(Mk_Callable)63 b(\(int)21 b(functor,)f(int)h(arity,)g (PlTerm)f(*arg\))-30 1943 y Fi(9.2.6)48 b(T)l(esting)15 b(the)g(t)o(yp)q(e)g(of)h(Prolog)f(terms)-30 2070 y Fm(The)k(follo)o (wing)d(functions)i(test)i(the)f(t)o(yp)q(e)g(of)e(a)h(Prolog)g(term.) 32 b(Eac)o(h)18 b(function)g(corresp)q(onds)j(to)d(a)g(t)o(yp)q(e)h (testing)-30 2120 y(built-in)13 b(predicate)i(\(section)g(7.1.1,)d (page)h(49\).)74 2203 y Fh(Bool)21 b(Blt_Var)369 b(\(PlTerm)21 b(term\))74 2252 y(Bool)g(Blt_Non_Var)281 b(\(PlTerm)21 b(term\))74 2302 y(Bool)g(Blt_Atom)347 b(\(PlTerm)21 b(term\))74 2352 y(Bool)g(Blt_Integer)281 b(\(PlTerm)21 b(term\))74 2402 y(Bool)g(Blt_Float)325 b(\(PlTerm)21 b(term\))74 2452 y(Bool)g(Blt_Number)303 b(\(PlTerm)21 b(term\))74 2501 y(Bool)g(Blt_Atomic)303 b(\(PlTerm)21 b(term\))74 2551 y(Bool)g(Blt_Compound)259 b(\(PlTerm)21 b(term\))74 2601 y(Bool)g(Blt_Callable)259 b(\(PlTerm)21 b(term\))74 2651 y(Bool)g(Blt_List)347 b(\(PlTerm)21 b(term\))74 2701 y(Bool)g(Blt_Partial_List)171 b(\(PlTerm)21 b(term\))74 2750 y(Bool)g(Blt_List_Or_Partia)o(l_Lis)o(t\(PlT)o(erm)e (term\))74 2800 y(Bool)i(Blt_Fd_Var)303 b(\(PlTerm)21 b(term\))74 2850 y(Bool)g(Blt_Non_Fd_Var)215 b(\(PlTerm)21 b(term\))74 2900 y(Bool)g(Blt_Generic_Var)193 b(\(PlTerm)21 b(term\))p eop end %%Page: 195 197 TeXDict begin 195 196 bop -30 -45 a Fm(9.2)41 b(Manipulating)12 b(Prolog)h(terms)1243 b(195)p -30 -27 1890 4 v 74 115 a Fh(Bool)21 b(Blt_Non_Generic_Va)o(r)106 b(\(PlTerm)21 b(term\))74 165 y(int)43 b(Type_Of_Term)259 b(\(PlTerm)21 b(term\))74 215 y(int)43 b(List_Length)281 b(\(PlTerm)21 b(list\))-30 298 y Fm(The)15 b(function)e Fh(Type)p 309 298 14 2 v 15 w(Of)p 368 298 V 16 w(Term\(term\))e Fm(returns)16 b(the)e(t)o(yp)q(e)h(of)h Fh(term)p Fm(,)d(the)i(follo)o(wing)c (constan)o(ts)k(can)f(b)q(e)h(used)f(to)g(test)-30 347 y(this)g(t)o(yp)q(e)h(\(e.g.)j(in)13 b(a)h Fh(switch)e Fm(instruction\):)33 430 y Fg(\017)20 b Fh(PLV)p Fm(:)13 b(Prolog)g(v)n(ariable.)33 513 y Fg(\017)20 b Fh(FDV)p Fm(:)13 b(\014nite)h(domain)f(v)n(ariable.)33 596 y Fg(\017)20 b Fh(INT)p Fm(:)13 b(in)o(teger.)33 679 y Fg(\017)20 b Fh(FLT)p Fm(:)13 b(\015oating)g(p)q(oin)o(t)g(n)o(um)o(b)q(er.)33 762 y Fg(\017)20 b Fh(ATM)p Fm(:)13 b(atom.)33 845 y Fg(\017)20 b Fh(LST)p Fm(:)13 b(list.)33 929 y Fg(\017)20 b Fh(STC)p Fm(:)13 b(structure)-30 1012 y(The)h(tag)f Fh(LST)f Fm(means)g(a)h(term)g(whose)g(principal)f(functor)h(is)g Fh('.')k Fm(and)c(whose)g(arit)o(y)f(is)h(2)f(\(recall)h(that)g(the)g (empt)o(y)g(list)-30 1061 y(is)h(the)h(atom)e Fh([])p Fm(\).)k(The)e(tag)f Fh(STC)f Fm(means)h(an)o(y)g(other)g(comp)q(ound)g (term.)-30 1161 y(The)i(function)e Fh(List)p 311 1161 V 15 w(Length\(list\))f Fm(returns)j(the)f(n)o(um)o(b)q(er)h(of)e (elemen)o(ts)i(of)e(the)h Fh(list)f Fm(\()p Fh(0)h Fm(for)g(the)g(empt) o(y)g(list\).)21 b(If)-30 1211 y(list)14 b(is)g(not)f(a)h(list)f(this)h (function)g(returns)h Fh(-1)p Fm(.)-30 1369 y Fi(9.2.7)48 b(Comparing)15 b(Prolog)g(terms)-30 1495 y Fm(The)20 b(follo)o(wing)c(functions)j(compares)h(Prolog)e(terms.)34 b(Eac)o(h)20 b(function)e(corresp)q(onds)j(to)e(a)g(comparison)f (built-in)-30 1545 y(predicate)d(\(section)g(7.3.2,)d(page)i(51\).)74 1628 y Fh(Bool)21 b(Blt_Term_Eq)f(\(PlTerm)g(term1,)h(PlTerm)f(term2\)) 74 1678 y(Bool)h(Blt_Term_Neq\(PlTer)o(m)e(term1,)i(PlTerm)f(term2\))74 1727 y(Bool)h(Blt_Term_Lt)f(\(PlTerm)g(term1,)h(PlTerm)f(term2\))74 1777 y(Bool)h(Blt_Term_Lte\(PlTer)o(m)e(term1,)i(PlTerm)f(term2\))74 1827 y(Bool)h(Blt_Term_Gt)f(\(PlTerm)g(term1,)h(PlTerm)f(term2\))74 1877 y(Bool)h(Blt_Term_Gte\(PlTer)o(m)e(term1,)i(PlTerm)f(term2\))-30 1960 y Fm(All)15 b(these)i(functions)e(are)h(based)g(on)f(a)g(general)h (comparison)f(function)g(returning)h(a)f(negativ)o(e)g(in)o(teger)h(if) i Fh(term1)c Fm(is)-30 2010 y(less)h(than)f Fh(term2)p Fm(,)e(0)i(if)f(they)h(are)h(equal)e(and)h(a)f(p)q(ositiv)o(e)h(in)o (teger)g(otherwise:)74 2093 y Fh(int)21 b(Term_Compare\(PlTerm)d (term1,)j(PlTerm)f(term2\))-30 2250 y Fi(9.2.8)48 b(Cop)o(ying)16 b(Prolog)f(terms)-30 2377 y Fm(The)g(follo)o(wing)c(functions)j(mak)o (e)f(a)h(cop)o(y)g(of)f(a)h(Prolog)f(term:)74 2460 y Fh(void)21 b(Copy_Term)238 b(\(PlTerm)20 b(*dst_adr,)g(PlTerm)h (*src_adr\))74 2510 y(void)g(Copy_Contiguous_Te)o(rm\(Pl)o(Term)d (*dst_adr,)i(PlTerm)h(*src_adr\))74 2559 y(int)43 b(Term_Size)238 b(\(PlTerm)20 b(term\))-30 2643 y Fm(The)e(function)f Fh(Copy)p 316 2643 V 15 w(Term\(dst)p 507 2643 V 14 w(adr,)k(src)p 696 2643 V 15 w(adr\))16 b Fm(mak)o(es)h(a)g(cop)o(y)h(of)e(the)i(term) g(lo)q(cated)f(at)g Fh(src)p 1577 2643 V 15 w(adr)g Fm(and)g(stores)-30 2692 y(it)g(from)f(the)i(address)g(giv)o(en)f(b)o(y)g Fh(dst)p 584 2692 V 15 w(adr)p Fm(.)27 b(The)18 b(result)f(is)g(a)g (con)o(tiguous)g(term.)28 b(If)16 b(it)h(can)g(b)q(e)h(ensured)g(that)g (the)-30 2742 y(source)f(term)e(is)g(a)f(con)o(tiguous)h(term)g(\(i.e.) 21 b(result)16 b(of)e(a)h(previous)g(cop)o(y\))g(the)g(function)g Fh(Copy)p 1484 2742 V 15 w(Contiguous)p 1719 2742 V 13 w(Term\(\))-30 2792 y Fm(can)f(b)q(e)h(used)f(instead)g(\(it)f(is)h (faster\).)19 b(In)13 b(an)o(y)g(case,)i(su\016cien)o(t)f(space)g (should)g(b)q(e)g(a)o(v)n(ailable)d(for)j(the)g(cop)o(y)f(\(i.e.)18 b(from)-30 2842 y Fh(dst)p 39 2842 V 16 w(adr)p Fm(\).)f(The)d (function)g Fh(Term)p 502 2842 V 15 w(Size\(term\))e Fm(returns)j(the)g(n)o(um)o(b)q(er)f(of)i Fh(PlTerm)d Fm(needed)i(b)o(y)f Fh(term)p Fm(.)p eop end %%Page: 196 198 TeXDict begin 196 197 bop -30 -45 a Fm(196)1123 b(9)41 b(INTERF)-5 b(A)o(CING)14 b(PR)o(OLOG)f(AND)h(C)p -30 -27 1890 4 v -30 115 a Fi(9.2.9)48 b(Comparing)15 b(and)h(ev)m (aluating)f(arithmetic)g(expressions)-30 241 y Fm(The)20 b(follo)o(wing)c(functions)j(compare)h(arithmetic)e(expressions.)35 b(Eac)o(h)20 b(function)e(corresp)q(onds)j(to)e(a)g(comparison)-30 291 y(built-in)13 b(predicate)i(\(section)g(7.6.3,)d(page)h(60\).)74 374 y Fh(Bool)21 b(Blt_Eq)g(\(PlTerm)f(expr1,)h(PlTerm)f(expr2\))74 424 y(Bool)h(Blt_Neq\(PlTerm)e(expr1,)i(PlTerm)f(expr2\))74 474 y(Bool)h(Blt_Lt)g(\(PlTerm)f(expr1,)h(PlTerm)f(expr2\))74 524 y(Bool)h(Blt_Lte\(PlTerm)e(expr1,)i(PlTerm)f(expr2\))74 573 y(Bool)h(Blt_Gt)g(\(PlTerm)f(expr1,)h(PlTerm)f(expr2\))74 623 y(Bool)h(Blt_Gte\(PlTerm)e(expr1,)i(PlTerm)f(expr2\))-30 706 y Fm(The)14 b(follo)o(wing)c(function)j(ev)n(aluates)f(the)i (expression)g Fh(expr)e Fm(and)h(stores)h(its)f(result)g(as)g(a)g (Prolog)f(n)o(um)o(b)q(er)h(\(in)o(teger)g(or)-30 756 y(\015oating)g(p)q(oin)o(t)h(n)o(um)o(b)q(er\))g(in)g Fh(result)p Fm(:)74 839 y Fh(void)21 b(Math_Load_Value\(Pl)o(Term)d (expr,)j(PlTerm)g(*result\))-30 922 y Fm(This)14 b(function)g(can)g(b)q (e)g(follo)o(w)o(ed)f(b)o(y)g(a)h(read)g(function)g(\(section)h(9.2.3,) c(page)j(191\))f(to)h(obtain)f(the)i(result.)-30 1088 y Ff(9.3)56 b(Raising)18 b(Prolog)h(errors)-30 1215 y Fm(The)12 b(follo)o(wing)d(functions)i(allo)o(ws)f(a)h(C)g(function)g (to)g(raise)g(a)g(Prolog)g(error.)18 b(Refer)11 b(to)g(the)h(section)g (concerning)g(Prolog)-30 1264 y(errors)k(for)d(more)h(information)e(ab) q(out)i(the)g(e\013ect)i(of)d(raising)g(an)h(error)h(\(section)f(5.3,)f (page)h(37\).)-30 1422 y Fi(9.3.1)48 b(Managing)16 b(the)f(error)g(con) o(text)-30 1549 y Fm(When)g(one)g(of)f(the)h(follo)o(wing)d(error)k (function)e(is)h(in)o(v)o(ok)o(ed)e(it)i(refers)h(to)e(the)h(implicit)e (error)j(con)o(text)f(\(section)g(5.3.1,)-30 1598 y(page)k(37\).)32 b(This)19 b(con)o(text)g(indicates)g(the)h(name)e(and)h(the)g(arit)o(y) f(of)g(the)i(concerned)g(predicate.)34 b(When)19 b(using)f(a)-30 1648 y Fh(foreign/2)g Fm(declaration)h(this)g(con)o(text)h(is)f(set)h (b)o(y)f(default)g(to)g(the)h(name)f(and)g(arit)o(y)g(of)f(the)i(asso)q (ciated)g(Prolog)-30 1698 y(predicate.)j(This)15 b(can)g(b)q(e)h(con)o (trolled)f(using)g(the)g Fh(bip)p 846 1698 14 2 v 15 w(name)g Fm(option)f(\(section)i(9.1.2,)d(page)i(183\).)21 b(In)15 b(an)o(y)g(case,)h(the)-30 1748 y(follo)o(wing)c(functions)i (can)g(also)f(b)q(e)i(used)f(to)g(mo)q(dify)f(this)h(con)o(text:)74 1831 y Fh(void)21 b(Set_C_Bip_Name)41 b(\(char)21 b(*functor,)f(int)h (arity\))74 1881 y(void)g(Unset_C_Bip_Name\(v)o(oid\))-30 1964 y Fm(The)d(function)g Fh(Set)p 295 1964 V 15 w(C)p 332 1964 V 15 w(Bip)p 413 1964 V 15 w(Name\(functor,)h(arity\))e Fm(initializes)f(the)i(con)o(text)h(of)d(the)j(error)f(with)f Fh(functor)f Fm(and)-30 2013 y Fh(arity)i Fm(\(if)k Fh(arity)p Fb(<)p Fm(0)c(only)h Fh(functor)f Fm(is)h(signi\014can)o(t\).)33 b(The)19 b(function)g Fh(Unset)p 1274 2013 V 15 w(C)p 1311 2013 V 15 w(Bip)p 1392 2013 V 15 w(Name\(\))f Fm(remo)o(v)o(es)i (suc)o(h)f(an)-30 2063 y(initialization)f(\(the)k(con)o(text)f(is)g (then)g(reset)i(to)d(the)i(last)e Fh(Functor)p Fm(/)p Fh(Arity)e Fm(set)k(b)o(y)e(a)h(call)f(to)g Fh(set)p 1636 2063 V 15 w(bip)p 1717 2063 V 15 w(name/2)-30 2113 y Fm(\(section)13 b(7.22.3,)d(page)i(135\).)17 b(This)11 b(is)h(useful)g(when)g(writing)g(a)f(C)h(routine)g(to)g(de\014ne)h(a)e (con)o(text)i(for)e(errors)j(o)q(ccurring)-30 2163 y(in)g(this)g (routine)g(and,)f(b)q(efore)i(exiting)e(to)h(restore)h(the)g(previous)f (con)o(text.)-30 2321 y Fi(9.3.2)48 b(Instan)o(tiation)14 b(error)-30 2447 y Fm(The)h(follo)o(wing)c(function)j(raises)g(an)g (instan)o(tiation)e(error)j(\(section)g(5.3.2,)d(page)i(37\):)74 2530 y Fh(void)21 b(Pl)p 230 2530 V 15 w(Err)p 311 2530 V 16 w(Instantiation\(v)o(oid\))-30 2688 y Fi(9.3.3)48 b(T)o(yp)q(e)16 b(error)-30 2814 y Fm(The)f(follo)o(wing)c(function)j (raises)g(a)g(t)o(yp)q(e)g(error)h(\(section)g(5.3.3,)c(page)j(38\):)74 2897 y Fh(void)21 b(Pl)p 230 2897 V 15 w(Err)p 311 2897 V 16 w(Type\(int)f(atom)p 611 2897 V 15 w(type,)g(PlTerm)h(culprit\))p eop end %%Page: 197 199 TeXDict begin 197 198 bop -30 -45 a Fm(9.3)41 b(Raising)12 b(Prolog)i(errors)1349 b(197)p -30 -27 1890 4 v -30 115 a Fh(atom)p 61 115 14 2 v 15 w(type)16 b Fm(is)g(\(the)h(in)o(ternal)e (k)o(ey)i(of)s(\))f(the)g(atom)g(asso)q(ciated)h(with)f(the)g(exp)q (ected)j(t)o(yp)q(e.)25 b(F)m(or)16 b(eac)o(h)h(t)o(yp)q(e)f(name)g Fd(T)-30 165 y Fm(there)g(is)f(a)f(corresp)q(onding)i(prede\014ned)g (atom)e(stored)i(in)e(a)g(global)f(v)n(ariable)h(whose)h(name)f(is)h (of)f(the)h(form)f Fh(type)p 1808 165 V 15 w Fd(T)7 b Fm(.)-30 215 y Fh(culprit)13 b Fm(is)h(the)g(argumen)o(t)g(whic)o(h)g (caused)h(the)f(error.)-30 314 y Fi(Example)p Fm(:)19 b Fh(x)13 b Fm(is)h(an)g(atom)f(while)g(an)h(in)o(teger)g(w)o(as)g(exp) q(ected:)20 b Fh(Pl)p 1042 314 V 15 w(Err)p 1123 314 V 15 w(Type\(type)p 1336 314 V 14 w(integer,)g(x\))p Fm(.)-30 472 y Fi(9.3.4)48 b(Domain)15 b(error)-30 598 y Fm(The)g(follo)o(wing)c(function)j(raises)g(a)g(domain)e(error)j (\(section)g(5.3.4,)d(page)i(38\):)74 681 y Fh(void)21 b(Pl)p 230 681 V 15 w(Err)p 311 681 V 16 w(Domain\(int)e(atom)p 654 681 V 15 w(domain,)h(PlTerm)h(culprit\))-30 764 y(atom)p 61 764 V 15 w(domain)15 b Fm(is)h(\(the)h(in)o(ternal)f(k)o(ey)g(of)s (\))g(the)h(atom)e(asso)q(ciated)i(with)f(the)g(exp)q(ected)j(domain.)k (F)m(or)16 b(eac)o(h)g(domain)-30 814 y(name)f Fd(D)22 b Fm(there)16 b(is)f(a)f(corresp)q(onding)i(prede\014ned)g(atom)e (stored)i(in)e(a)h(global)e(v)n(ariable)h(whose)h(name)g(is)f(of)h(the) g(form)-30 864 y Fh(domain)p 105 864 V 15 w Fd(D)7 b Fm(.)13 b Fh(culprit)g Fm(is)g(the)i(argumen)o(t)f(whic)o(h)f(caused)i (the)g(error.)-30 964 y Fi(Example)p Fm(:)k Fh(x)13 b Fm(is)h Fb(<)g Fm(0)g(but)g(should)g(b)q(e)g Fg(\025)g Fm(0:)k Fh(Pl)p 748 964 V 15 w(Err)p 829 964 V 15 w(Domain\(domain)p 1130 964 V 13 w(not)p 1209 964 V 15 w(less)p 1312 964 V 15 w(than)p 1415 964 V 15 w(zero,)j(x\))p Fm(.)-30 1121 y Fi(9.3.5)48 b(Existence)16 b(error)-30 1248 y Fm(The)f(follo)o(wing)c(function)j(raises)g(an)g(existence)i(error)e (\(section)h(5.3.5,)d(page)i(39\):)74 1331 y Fh(void)21 b(Pl)p 230 1331 V 15 w(Err)p 311 1331 V 16 w(Existence\(int)e(atom)p 720 1331 V 15 w(object,)h(PlTerm)g(culprit\))-30 1414 y(atom)p 61 1414 V 15 w(object)15 b Fm(is)h(\(the)h(in)o(ternal)f(k)o (ey)g(of)s(\))g(the)h(atom)e(asso)q(ciated)i(with)f(the)g(t)o(yp)q(e)h (of)f(the)g(ob)r(ject.)26 b(F)m(or)16 b(eac)o(h)g(ob)r(ject)-30 1464 y(name)f Fd(O)22 b Fm(there)16 b(is)f(a)f(corresp)q(onding)i (prede\014ned)g(atom)e(stored)i(in)e(a)h(global)e(v)n(ariable)h(whose)h (name)g(is)f(of)h(the)g(form)-30 1513 y Fh(existence)p 171 1513 V 14 w Fd(O)7 b Fm(.)14 b Fh(culprit)e Fm(is)i(the)g(argumen)o (t)g(whic)o(h)g(caused)h(the)f(error.)-30 1613 y Fi(Example)p Fm(:)19 b Fh(x)13 b Fm(do)q(es)i(not)f(refer)h(to)e(an)h(existing)g (source:)19 b Fh(Pl)p 933 1613 V 15 w(Err)p 1014 1613 V 15 w(Existence\(existence)p 1446 1613 V 12 w(source)p 1591 1613 V 15 w(sink,)h(x\))p Fm(.)-30 1771 y Fi(9.3.6)48 b(P)o(ermission)14 b(error)-30 1897 y Fm(The)h(follo)o(wing)c(function) j(raises)g(a)g(p)q(ermission)g(error)h(\(section)f(5.3.6,)e(page)i (39\):)74 1980 y Fh(void)21 b(Pl)p 230 1980 V 15 w(Err)p 311 1980 V 16 w(Permission\(int)d(atom)p 741 1980 V 15 w(operation,)i(int)h(atom)p 1171 1980 V 15 w(permission,)f(PlTerm)g (culprit\))-30 2063 y(atom)p 61 2063 V 15 w(operation)12 b Fm(is)i(\(the)h(in)o(ternal)f(k)o(ey)g(of)s(\))f(the)i(atom)e(asso)q (ciated)i(with)f(the)g(op)q(eration)g(whic)o(h)g(caused)h(the)g(error.) -30 2113 y(F)m(or)h(eac)o(h)g(op)q(eration)g(name)g Fd(O)23 b Fm(there)17 b(is)f(a)f(corresp)q(onding)i(prede\014ned)h(atom)d (stored)i(in)e(a)h(global)e(v)n(ariable)h(whose)-30 2163 y(name)f(is)f(of)g(the)h(form)f Fh(permission)p 561 2163 V 14 w(operation)p 773 2163 V 14 w Fd(O)7 b Fm(.)13 b Fh(atom)p 929 2163 V 15 w(permission)e Fm(is)j(\(the)g(in)o(ternal)f(k) o(ey)h(of)s(\))f(the)h(atom)f(asso-)-30 2213 y(ciated)i(with)f(the)h (tried)g(p)q(ermission.)20 b(F)m(or)14 b(eac)o(h)g(p)q(ermission)h (name)f Fd(P)21 b Fm(there)16 b(is)e(a)g(corresp)q(onding)i (prede\014ned)g(atom)-30 2262 y(stored)c(in)f(a)f(global)f(v)n(ariable) h(whose)h(name)g(is)g(of)f(the)h(form)f Fh(permission)p 1137 2262 V 14 w(type)p 1239 2262 V 15 w Fd(P)d Fm(.)j Fh(culprit)g Fm(is)g(the)i(argumen)o(t)e(whic)o(h)-30 2312 y(caused)15 b(the)g(error.)-30 2412 y Fi(Example)p Fm(:)k(reading)13 b(from)g(an)h(output)g(stream)h Fh(x)p Fm(:)i Fh(Pl)p 856 2412 V 16 w(Err)p 938 2412 V 15 w(Permission\(permi) o(ssion)p 1413 2412 V 12 w(operation)p 1624 2412 V 14 w(input,)-30 2462 y(permission)p 193 2462 V 14 w(type)p 295 2462 V 15 w(stream,)j(x\))p Fm(.)-30 2619 y Fi(9.3.7)48 b(Represen)o(tation)13 b(error)-30 2746 y Fm(The)i(follo)o(wing)c (function)j(raises)g(a)g(represen)o(tation)h(error)g(\(section)g (5.3.7,)d(page)h(39\):)74 2829 y Fh(void)21 b(Pl)p 230 2829 V 15 w(Err)p 311 2829 V 16 w(Representation\()o(int)e(atom)p 829 2829 V 14 w(limit\))p eop end %%Page: 198 200 TeXDict begin 198 199 bop -30 -45 a Fm(198)1123 b(9)41 b(INTERF)-5 b(A)o(CING)14 b(PR)o(OLOG)f(AND)h(C)p -30 -27 1890 4 v -30 115 a Fh(atom)p 61 115 14 2 v 15 w(limit)j Fm(is)g(\(the)i(in)o(ternal)e(k)o(ey)h(of)s(\))f(the)i(atom)d(asso)q (ciated)j(with)e(the)h(reac)o(hed)h(limit.)28 b(F)m(or)17 b(eac)o(h)h(limit)e(name)-30 165 y Fd(L)29 b Fm(there)22 b(is)g(a)f(corresp)q(onding)h(prede\014ned)h(atom)e(stored)h(in)f(a)g (global)f(v)n(ariable)g(whose)i(name)f(is)g(of)g(the)h(form)-30 215 y Fh(representation)p 281 215 V 13 w Fd(L)7 b Fm(.)-30 314 y Fi(Example)p Fm(:)19 b(an)13 b(arit)o(y)h(to)q(o)f(big)g(o)q (ccurs:)20 b Fh(Pl)p 672 314 V 15 w(Err)p 753 314 V 15 w(Representation\(repr)o(esen)o(tatio)o(n)p 1403 314 V 13 w(max)p 1482 314 V 15 w(arity\))p Fm(.)-30 472 y Fi(9.3.8)48 b(Ev)m(aluation)17 b(error)-30 598 y Fm(The)e(follo)o(wing) c(function)j(raises)g(an)g(ev)n(aluation)e(error)j(\(section)g(5.3.8,)d (page)h(40\):)74 681 y Fh(void)21 b(Pl)p 230 681 V 15 w(Err)p 311 681 V 16 w(Evaluation\(int)d(atom)p 741 681 V 15 w(error\))-30 764 y(atom)p 61 764 V 15 w(error)i Fm(is)i(\(the)g(in)o(ternal)e(k)o(ey)i(of)s(\))f(the)h(atom)e(asso)q (ciated)i(with)f(the)h(error.)41 b(F)m(or)21 b(eac)o(h)g(ev)n(aluation) f(error)-30 814 y(name)15 b Fd(E)22 b Fm(there)16 b(is)f(a)f(corresp)q (onding)i(prede\014ned)g(atom)e(stored)i(in)e(a)h(global)e(v)n(ariable) h(whose)h(name)g(is)f(of)h(the)g(form)-30 864 y Fh(evaluation)p 193 864 V 14 w Fd(E)7 b Fm(.)-30 964 y Fi(Example)p Fm(:)19 b(a)13 b(division)g(b)o(y)g(zero)i(o)q(ccurs:)20 b Fh(Pl)p 707 964 V 15 w(Err)p 788 964 V 15 w(Evaluation\(evluati)o(on)p 1242 964 V 13 w(zero)p 1343 964 V 14 w(divisor\))p Fm(.)-30 1121 y Fi(9.3.9)48 b(Resource)15 b(error)-30 1248 y Fm(The)g(follo)o (wing)c(function)j(raises)g(a)g(resource)i(error)f(\(section)f(5.3.9,)e (page)i(40\):)74 1331 y Fh(void)21 b(Pl)p 230 1331 V 15 w(Err)p 311 1331 V 16 w(Resource\(int)e(atom)p 698 1331 V 15 w(resource\))-30 1414 y(atom)p 61 1414 V 15 w(resource)c Fm(is)h(\(the)g(in)o(ternal)g(k)o(ey)g(of)s(\))g(the)h (atom)e(asso)q(ciated)i(with)f(the)g(resource.)27 b(F)m(or)16 b(eac)o(h)g(resource)i(error)-30 1464 y(name)d Fd(R)22 b Fm(there)16 b(is)f(a)f(corresp)q(onding)i(prede\014ned)g(atom)e (stored)i(in)e(a)h(global)e(v)n(ariable)h(whose)h(name)g(is)f(of)h(the) g(form)-30 1513 y Fh(resource)p 149 1513 V 15 w Fd(R)7 b Fm(.)-30 1613 y Fi(Example)p Fm(:)19 b(to)q(o)13 b(man)o(y)g(op)q(en) i(streams:)k Fh(Pl)p 684 1613 V 15 w(Err)p 765 1613 V 15 w(Resource\(resource)p 1153 1613 V 12 w(too)p 1232 1613 V 15 w(many)p 1335 1613 V 15 w(open)p 1438 1613 V 15 w(streams\))p Fm(.)-30 1771 y Fi(9.3.10)48 b(Syn)o(tax)15 b(error)-30 1897 y Fm(The)g(follo)o(wing)c(function)j(raises)g(a)g(syn) o(tax)g(error)g(\(section)h(5.3.10,)d(page)i(40\):)74 1980 y Fh(void)21 b(Pl)p 230 1980 V 15 w(Err)p 311 1980 V 16 w(Syntax\(int)e(atom)p 654 1980 V 15 w(error\))-30 2063 y(atom)p 61 2063 V 15 w(error)c Fm(is)h(\(the)h(in)o(ternal)f(k)o (ey)g(of)s(\))g(the)h(atom)e(asso)q(ciated)i(with)f(the)h(error.)26 b(There)17 b(is)f(no)g(prede\014ned)i(syn)o(tax)-30 2113 y(error)d(atoms.)-30 2213 y Fi(Example)p Fm(:)k(a)13 b Fh(/)h Fm(is)g(exp)q(ected:)20 b Fh(Pl)p 530 2213 V 15 w(Err)p 611 2213 V 15 w(Syntax\(Create)p 912 2213 V 13 w(Atom\("/)g(expected"\)\))p Fm(.)-30 2312 y(The)g(follo)o(wing)d (function)j(emits)f(a)h(syn)o(tax)f(error)i(according)e(to)h(the)g(v)n (alue)f(of)g(the)h Fh(syntax)p 1518 2312 V 14 w(error)f Fm(Prolog)g(\015ag)-30 2362 y(\(section)h(7.22.1,)e(page)i(133\).)33 b(This)19 b(function)g(can)g(then)h(return)g(\(if)f(the)g(v)n(alue)g (of)f(the)i(\015ag)f(is)g(either)h Fh(warning)-30 2412 y Fm(or)f Fh(fail)p Fm(\).)31 b(In)19 b(that)g(case)g(the)g(calling)e (function)i(should)f(fail)f(\(e.g.)32 b(returning)20 b Fh(FALSE)p Fm(\).)d(This)h(function)h(accepts)-30 2462 y(a)f(\014le)g(name)f(\(the)i(empt)o(y)f(string)g(C)f Fh("")h Fm(can)g(b)q(e)g(passed\),)i(a)d(line)h(and)f(column)g(n)o(um)o (b)q(er)i(and)e(an)h(error)g(message)-30 2512 y(string.)i(Using)14 b(this)g(function)g(mak)o(es)g(it)g(p)q(ossible)g(to)h(further)g(call)e (the)i(built-in)e(predicate)i Fh(syntax)p 1593 2512 V 15 w(error)p 1718 2512 V 14 w(info/4)-30 2561 y Fm(\(section)g(7.14.4,) d(page)i(95\):)74 2644 y Fh(void)21 b(Emit)p 274 2644 V 15 w(Syntax)p 421 2644 V 15 w(Error\(char)e(*file)p 785 2644 V 15 w(name,)i(int)g(line,)g(int)g(column,)f(char)h (*message\))-30 2727 y Fi(Example)p Fm(:)e(a)13 b Fh(/)h Fm(is)g(exp)q(ected:)20 b Fh(Emit)p 574 2727 V 15 w(Syntax)p 721 2727 V 14 w(Error\("data",)f(10,)i(30,)g("/)h(expected"\))p Fm(.)p eop end %%Page: 199 201 TeXDict begin 199 200 bop -30 -45 a Fm(9.4)41 b(Calling)12 b(Prolog)h(from)g(C)1330 b(199)p -30 -27 1890 4 v -30 115 a Fi(9.3.11)48 b(System)15 b(error)-30 241 y Fm(The)g(follo)o(wing) c(function)j(raises)g(a)g(system)h(error)f(\(4.3.11,)e(page)i(*\):)74 319 y Fh(void)21 b(Pl)p 230 319 14 2 v 15 w(Err)p 311 319 V 16 w(System\(int)e(atom)p 654 319 V 15 w(error\))-30 397 y(atom)p 61 397 V 15 w(error)c Fm(is)h(\(the)h(in)o(ternal)e(k)o (ey)h(of)s(\))g(the)g(atom)f(asso)q(ciated)i(with)f(the)g(error.)25 b(There)17 b(is)f(no)g(prede\014ned)h(system)-30 447 y(error)e(atoms.)-30 547 y Fi(Example)p Fm(:)k(an)13 b(in)o(v)n(alid)f(pathname)i(is)g(giv)o(en:)j Fh(Pl)p 780 547 V 15 w(Err)p 861 547 V 15 w(System\(Create)p 1162 547 V 13 w(Atom\("invalid)j(path)g(name"\)\))p Fm(.)-30 646 y(The)c(follo)o(wing)c(function)i(emits)h(a)f(system)h(error)h (asso)q(ciated)f(with)g(an)f(op)q(erating)g(system)i(error)f(according) g(to)g(the)-30 696 y(v)n(alue)f(of)g(the)g Fh(os)p 244 696 V 16 w(error)f Fm(Prolog)g(\015ag)h(\(section)h(7.22.1,)d(page)i (133\).)k(This)c(function)g(can)g(then)h(return)h(\(if)d(the)i(v)n (alue)-30 746 y(of)d(the)h(\015ag)e(is)h(either)h Fh(warning)d Fm(or)i Fh(fail)p Fm(\).)17 b(In)12 b(that)g(case)h(the)g(calling)d (function)i(should)g(fail)e(\(e.g.)17 b(returning)d Fh(FALSE)p Fm(\).)-30 796 y(This)g(function)g(uses)h(the)f(v)n(alue)g(of)f(the)h Fh(errno)f Fm(C)h(library)f(v)n(ariable:)74 873 y Fh(void)21 b(Os)p 230 873 V 15 w(Error\(void\))-30 951 y Fi(Example)p Fm(:)e(a)13 b(call)g(to)h(the)h(C)e(Unix)h(function)f Fh(chdir\(3\))g Fm(returns)i Fh(-1)p Fm(:)j Fh(Os)p 1175 951 V 15 w(Error\(\))p Fm(.)-30 1116 y Ff(9.4)56 b(Calling)18 b(Prolog)h(from)f(C)-30 1243 y Fi(9.4.1)48 b(In)o(tro)q(duction)-30 1369 y Fm(The)15 b(follo)o(wing)c(functions)j(allo)o(ws)f(a)g(C)h (function)g(to)f(call)g(a)h(Prolog)f(predicate:)74 1447 y Fh(void)65 b(Pl_Query_Begin)171 b(\(Bool)21 b(recoverable\))74 1497 y(int)87 b(Pl_Query_Call)193 b(\(int)21 b(functor,)f(int)i(arity,) e(PlTerm)h(*arg\))74 1547 y(int)87 b(Pl_Query_Next_So)o(lutio)o(n\(voi) o(d\))74 1596 y(void)65 b(Pl_Query_End)215 b(\(int)21 b(op\))74 1646 y(PlTerm)g(Pl_Get_Exception)127 b(\(void\))74 1696 y(void)65 b(Pl_Exec_Continua)o(tion)40 b(\(int)21 b(functor,)f(int)i(arity,)e(PlTerm)h(*arg\))-30 1774 y Fm(The)15 b(in)o(v)o(o)q(cation)d(of)i(a)f(Prolog)g(predicate)i (should)f(b)q(e)h(done)f(as)g(follo)o(ws:)33 1852 y Fg(\017)20 b Fm(op)q(en)15 b(a)e(query)i(using)f Fh(Pl)p 481 1852 V 15 w(Query)p 606 1852 V 15 w(Begin\(\))33 1932 y Fg(\017)20 b Fm(compute)15 b(the)f(\014rst)h(solution)e(using)h Fh(Pl)p 713 1932 V 15 w(Query)p 838 1932 V 15 w(Call\(\))33 2013 y Fg(\017)20 b Fm(ev)o(en)o(tually)14 b(compute)g(next)g (solutions)g(using)g Fh(Pl)p 864 2013 V 15 w(Query)p 989 2013 V 15 w(Next)p 1092 2013 V 15 w(Solution\(\))33 2093 y Fg(\017)20 b Fm(close)15 b(the)f(query)h(using)f Fh(Pl)p 517 2093 V 15 w(Query)p 642 2093 V 15 w(End\(\))-30 2171 y Fm(The)j(function)e Fh(Pl)p 269 2171 V 15 w(Query)p 394 2171 V 15 w(Begin\(recoverabl)o(e\))e Fm(is)i(used)i(to)e (initialize)f(a)i(query)m(.)23 b(The)16 b(argumen)o(t)g Fh(recoverable)-30 2221 y Fm(shall)f(b)q(e)i(set)f(to)g Fh(TRUE)e Fm(if)h(the)i(user)f(w)o(an)o(ts)g(to)f(reco)o(v)o(er,)i(at)f (the)g(end)g(of)f(the)i(query)m(,)e(the)i(memory)e(space)h(consumed)-30 2271 y(b)o(y)i(the)h(query)f(\(in)f(that)h(case)h(an)f(additional)e(c)o (hoice-p)q(oin)o(t)h(is)h(created\).)32 b(All)17 b(terms)h(created)i (in)d(the)h(heap,)h(e.g.)-30 2321 y(using)e Fh(Mk)p 129 2321 V 15 w(...)24 b Fm(family)14 b(functions)i(\(section)h(9.2.5,)d (page)i(194\),)f(after)i(the)f(in)o(v)o(o)q(cation)f(of)k Fh(Pl)p 1493 2321 V 15 w(Query)p 1618 2321 V 15 w(Begin\(\))14 b Fm(can)-30 2370 y(b)q(e)h(reco)o(v)o(ered)h(when)e(calling)f Fh(Pl)p 498 2370 V 15 w(Query)p 623 2370 V 15 w(End\(TRUE\))f Fm(\(see)j(b)q(elo)o(w\).)-30 2470 y(The)20 b(function)f Fh(Pl)p 276 2470 V 15 w(Query)p 401 2470 V 14 w(Call\(functor,)h (arity,)g(arg\))e Fm(calls)h(a)f(predicate)i(passing)f(argumen)o(ts.)34 b(It)19 b(is)g(then)-30 2520 y(used)e(to)e(compute)h(the)g(\014rst)g (solution.)21 b(The)16 b(argumen)o(ts)f Fh(functor)p Fm(,)f Fh(arity)g Fm(and)h Fh(arg)g Fm(are)h(similar)e(to)h(those)h(of) f(the)-30 2570 y(functions)f(handling)f(complex)h(terms)g(\(section)h (9.2.1,)d(page)i(190\).)j(This)d(function)f(returns:)33 2648 y Fg(\017)20 b Fh(PL)p 121 2648 V 16 w(FAILURE)12 b Fm(\(a)i(constan)o(t)g(equal)g(to)f Fh(FALSE)p Fm(,)g(i.e.)k(0\))d (if)f(the)h(query)h(fails.)33 2728 y Fg(\017)20 b Fh(PL)p 121 2728 V 16 w(SUCCESS)13 b Fm(\(a)i(constan)o(t)h(equal)e(to)h Fh(TRUE)p Fm(,)f(i.e.)21 b(1\))15 b(in)f(case)i(of)f(success.)24 b(In)15 b(that)g(case)h(the)g(argumen)o(t)e(arra)o(y)74 2778 y Fh(arg)f Fm(can)i(b)q(e)f(used)h(to)f(obtain)f(the)h (uni\014cation)f(p)q(erformed)i(b)o(y)f(the)g(query)m(.)33 2858 y Fg(\017)20 b Fh(PL)p 121 2858 V 16 w(EXCEPTION)13 b Fm(\(a)i(constan)o(t)h(equal)e(to)h(2\).)22 b(In)15 b(that)h(case)g(function)f Fh(Pl)p 1244 2858 V 15 w(Get)p 1325 2858 V 15 w(Exception\(\))e Fm(can)i(b)q(e)h(used)g(to)74 2908 y(obtained)e(the)g(exceptional)g(term)h(raised)f(b)o(y)g Fh(throw/1)e Fm(\(section)j(6.2.4,)d(page)i(47\).)p eop end %%Page: 200 202 TeXDict begin 200 201 bop -30 -45 a Fm(200)1123 b(9)41 b(INTERF)-5 b(A)o(CING)14 b(PR)o(OLOG)f(AND)h(C)p -30 -27 1890 4 v -30 115 a(The)k(function)f Fh(Pl)p 272 115 14 2 v 16 w(Query)p 398 115 V 14 w(Next)p 500 115 V 15 w(Solution\(\))f Fm(is)h(used)h(to)f(compute)h(a)f(new)h(solution.)28 b(It)18 b(m)o(ust)f(b)q(e)h(only)f(used)h(if)-30 165 y(the)g(result)g(of)e(the)i(previous)f(solution)g(w)o(as)g Fh(PL)p 748 165 V 15 w(SUCCESS)p Fm(.)e(This)i(functions)g(returns)i (the)e(same)g(kind)g(of)f(v)n(alues)h(as)-30 215 y Fh(Pl)p 17 215 V 16 w(Query)p 143 215 V 14 w(Call\(\))c Fm(\(see)i(ab)q(o)o(v)o (e\).)-30 314 y(The)h(function)e Fh(Pl)p 267 314 V 16 w(Query)p 393 314 V 14 w(End\(op\))g Fm(is)g(used)i(to)f(\014nish)g(a)f (query)m(.)22 b(This)14 b(function)h(mainly)e(manages)i(the)g (remaining)-30 364 y(alternativ)o(es)h(of)f(the)h(query)m(.)23 b(Ho)o(w)o(ev)o(er,)16 b(ev)o(en)g(if)e(the)i(query)g(has)g(no)f (alternativ)o(es)h(this)f(function)g(m)o(ust)h(b)q(e)g(used)g(to)-30 414 y(correctly)g(\014nish)d(the)i(query)m(.)j(The)c(v)n(alue)g(of)i Fh(op)e Fm(is:)33 497 y Fg(\017)20 b Fh(PL)p 121 497 V 16 w(RECOVER)p Fm(:)13 b(to)i(reco)o(v)o(er)i(the)f(memory)f(space)i (consumed)f(b)o(y)f(the)h(query)m(.)23 b(After)16 b(that)g(the)g(state) g(of)f(Prolog)74 547 y(stac)o(ks)j(is)f(exactly)g(the)g(same)g(as)g(b)q (efore)h(op)q(ening)f(the)g(query)m(.)27 b(T)m(o)17 b(use)g(this)g (option)f(the)i(query)f(m)o(ust)g(ha)o(v)o(e)74 596 y(b)q(een)e (initialized)e(sp)q(ecifying)h Fh(TRUE)f Fm(for)h Fh(recoverable)d Fm(\(see)k(ab)q(o)o(v)o(e\).)33 679 y Fg(\017)20 b Fh(PL)p 121 679 V 16 w(CUT)p Fm(:)12 b(to)i(cut)h(remaining)d(alternativ)o(es.) 19 b(The)14 b(e\013ect)h(of)f(this)g(option)f(is)h(similar)e(to)i(a)f (cut)i(after)f(the)g(query)m(.)33 762 y Fg(\017)20 b Fh(PL)p 121 762 V 16 w(KEEP)p 225 762 V 14 w(FOR)p 305 762 V 15 w(PROLOG)p Fm(:)10 b(to)h(k)o(eep)h(the)g(alternativ)o(es)g (for)f(Prolog.)16 b(This)11 b(is)h(useful)f(when)h(the)g(query)g(w)o (as)f(in)o(v)o(ok)o(ed)74 812 y(in)k(a)g(foreign)f(C)h(function.)22 b(In)15 b(that)g(case,)h(when)g(the)g(predicate)g(corresp)q(onding)g (to)f(the)h(C)f(foreign)f(function)74 862 y(is)h(in)o(v)o(ok)o(ed)f(a)h (query)g(is)g(executed)i(and)e(the)h(remaining)e(alternativ)o(es)h(are) g(then)h(a)o(v)n(ailable)d(as)i(alternativ)o(es)g(of)74 912 y(that)f(predicate.)-30 995 y(Note)g(that)f(sev)o(eral)g(queries)h (can)g(b)q(e)f(nested)i(since)f(a)e(stac)o(k)i(of)e(queries)i(is)f (main)o(tained.)j(F)m(or)d(instance,)g(it)g(is)g(p)q(ossible)-30 1045 y(to)21 b(call)e(a)h(query)h(and)f(b)q(efore)h(terminating)e(it)h (to)g(call)g(another)g(query)m(.)37 b(In)21 b(that)f(case)h(the)g (\014rst)g(execution)g(of)-30 1095 y Fh(Pl)p 17 1095 V 16 w(Query)p 143 1095 V 14 w(End\(\))14 b Fm(will)g(\014nish)h(the)g (second)h(query)g(\(i.e.)k(the)c(inner\))f(and)g(the)h(next)f (execution)h(of)h Fh(Pl)p 1614 1095 V 16 w(Query)p 1740 1095 V 14 w(End\(\))-30 1144 y Fm(will)c(\014nish)h(the)g(\014rst)h (query)m(.)-30 1244 y(Finally)m(,)i(the)i(function)g Fh(Pl)p 416 1244 V 15 w(Exec)p 519 1244 V 15 w(Continuation\(fun)o (ctor,)f(arity,)j(arg\))c Fm(replaces)j(the)f(curren)o(t)h(calculus)e (b)o(y)-30 1294 y(the)d(execution)g(of)e(the)i(sp)q(eci\014ed)h (predicate.)k(The)14 b(argumen)o(ts)g Fh(functor)p Fm(,)f Fh(arity)g Fm(and)h Fh(arg)f Fm(are)h(similar)f(to)h(those)h(of)-30 1344 y(the)g(functions)f(handling)f(complex)g(terms)i(\(section)g (9.2.1,)c(page)j(190\).)-30 1501 y Fi(9.4.2)48 b(Example:)22 b Fh(my)p 379 1501 V 15 w(call/1)15 b Fi(-)h(a)g Fh(call/1)f Fi(clone)-30 1628 y Fm(W)m(e)j(here)h(de\014ne)f(a)g(predicate)h Fh(my)p 533 1628 V 15 w(call\(Goal\))d Fm(whic)o(h)h(acts)i(lik)o(e)e Fh(call\(Goal\))e Fm(except)k(that)f(w)o(e)g(do)g(not)f(handle)-30 1678 y(exceptions)e(\(if)f(an)f(exception)i(o)q(ccurs)g(the)g(goal)d (simply)h(fails\):)-30 1777 y(In)h(the)h(prolog)e(\014le)h Fh(examp.pl)p Fm(:)74 1860 y Fh(:-)22 b(foreign\(my)p 363 1860 V 13 w(call\(term\)\).)-30 1943 y Fm(In)14 b(the)h(C)f(\014le) g Fh(examp)p 318 1943 V 14 w(c.c)p Fm(:)74 2026 y Fh(#include)20 b()74 2076 y(#include)g("gprolog.h")74 2176 y(Bool)74 2226 y(my_call\(PlTerm)f(goal\))74 2325 y({)118 2375 y(PlTerm)h(*arg;)118 2425 y(int)h(functor,)f(arity;)118 2475 y(int)h(result;)118 2574 y(arg)g(=)h(Rd_Callable_Che)o(ck\(go)o (al,)d(&functor,)h(&arity\);)118 2624 y(Pl_Query_Begin\(FA)o(LSE\))o(;) 118 2674 y(result)g(=)i(Pl_Query_Call\(fun)o(ctor,)c(arity,)j(arg\);) 118 2724 y(Pl_Query_End\(PL_K)o(EEP_)o(FOR_P)o(ROLOG)o(\);)118 2773 y(return)f(\(result)h(==)g(PL_SUCCESS\);)74 2823 y(})-30 2906 y Fm(The)15 b(compilation)d(pro)q(duces)j(an)f(executable) h(called)f Fh(examp)p Fm(:)p eop end %%Page: 201 203 TeXDict begin 201 202 bop -30 -45 a Fm(9.4)41 b(Calling)12 b(Prolog)h(from)g(C)1330 b(201)p -30 -27 1890 4 v 74 115 a Fh(\045)22 b(gplc)f(examp.pl)f(examp)p 536 115 14 2 v 15 w(c.c)-30 197 y Fm(Examples)14 b(of)g(use:)74 277 y Fh(|)22 b(?-)f(my)p 230 277 V 15 w(call\(write\(hello\)\).)74 327 y(hello)74 427 y(|)h(?-)f(my)p 230 427 V 15 w (call\(for\(X,1,3\)\).)74 526 y(X)h(=)f(1)h(?)320 b Fm(\(here)15 b(the)f(user)h(presses)i Fh(;)c Fm(to)h(compute)g(another)h(solution\)) 74 626 y Fh(X)22 b(=)f(2)h(?)320 b Fm(\(here)15 b(the)f(user)h(presses) i Fh(;)c Fm(to)h(compute)g(another)h(solution\))74 726 y Fh(X)22 b(=)f(3)364 b Fm(\(here)15 b(the)f(user)h(is)f(not)g (prompted)g(since)h(there)g(is)f(no)f(more)h(alternativ)o(e\))74 825 y Fh(|)22 b(?-)f(my)p 230 825 V 15 w(call\(1\).)74 875 y({exception:)f(error\(type)p 559 875 V 13 w(error\(callable,1\),m) o(y)p 1011 875 V 13 w(call/1\)})74 975 y(|)i(?-)f(my)p 230 975 V 15 w(call\(call\(1\)\).)74 1074 y(no)-30 1155 y Fm(When)13 b Fh(my)p 137 1155 V 16 w(call\(1\))e Fm(is)h(called)h(an) f(error)h(is)g(raised)g(due)g(to)g(the)g(use)g(of)j Fh(Rd)p 1152 1155 V 15 w(Callable)p 1343 1155 V 14 w(Check\(\))p Fm(.)g(Ho)o(w)o(ev)o(er)d(the)g(error)-30 1205 y(raised)i(b)o(y)f Fh(my)p 196 1205 V 15 w(call\(call\(1\)\))d Fm(is)j(ignored)g(and)g Fh(FALSE)e Fm(\(i.e.)18 b(a)c(failure\))f(is)h(returned)h(b)o(y)f(the)g (foreign)g(function.)-30 1304 y(T)m(o)i(really)g(sim)o(ulate)g(the)h(b) q(eha)o(vior)f(of)j Fh(call/1)c Fm(when)i(an)g(exception)g(is)f(reco)o (v)o(ered)i(it)e(should)h(b)q(e)g(re-raised)g(to)g(b)q(e)-30 1354 y(captured)e(b)o(y)e(an)h(earlier)f(handler.)18 b(The)c(idea)g(is)f(then)h(to)f(execute)j(a)d Fh(throw/1)f Fm(as)i(the)g(con)o(tin)o(uation.)j(This)c(is)g(what)-30 1404 y(it)h(is)g(done)g(b)o(y)g(the)g(follo)o(wing)d(co)q(de:)74 1487 y Fh(#include)20 b()74 1536 y(#include)g("gprolog.h")74 1636 y(Bool)74 1686 y(my_call\(PlTerm)f(goal\))74 1736 y({)118 1785 y(PlTerm)h(*args;)118 1835 y(int)h(functor,)f(arity;)118 1885 y(int)h(result;)118 1985 y(args)g(=)g(Rd_Callable_Check\(g)o(oal,) d(&functor,)i(&arity\);)118 2035 y(Pl_Query_Begin\(FA)o(LSE\))o(;)118 2084 y(result)g(=)i(Pl_Query_Call\(fun)o(ctor,)c(arity,)j(args\);)118 2134 y(Pl_Query_End\(PL_K)o(EEP_)o(FOR_P)o(ROLOG)o(\);)118 2184 y(if)g(\(result)g(==)g(PL_EXCEPTION\))161 2234 y({)205 2284 y(PlTerm)g(except)f(=)i(Pl_Get_Exception)o(\(\);)205 2333 y(Pl_Exec_Continuat)o(ion\(F)o(ind_A)o(tom\(")o(throw)o("\),)d(1,) i(&except\);)161 2383 y(})118 2483 y(return)f(result;)74 2533 y(})-30 2615 y Fm(The)15 b(follo)o(wing)c(co)q(de)k(propagates)f (the)g(error)h(raised)g(b)o(y)f Fh(call/1)p Fm(.)74 2695 y Fh(|)22 b(?-)f(my)p 230 2695 V 15 w(call\(call\(1\)\).)74 2745 y({exception:)f(error\(type)p 559 2745 V 13 w (error\(callable,1\),m)o(y)p 1011 2745 V 13 w(call/1\)})-30 2825 y Fm(Finally)13 b(note)h(that)g(a)g(simpler)f(w)o(a)o(y)g(to)h (de\014ne)h Fh(my)p 776 2825 V 15 w(call/1)e Fm(is)h(to)f(use)i Fh(Pl)p 1144 2825 V 15 w(Exec)p 1247 2825 V 15 w(Continuation\(\))c Fm(as)j(follo)o(ws:)74 2908 y Fh(#include)20 b()p eop end %%Page: 202 204 TeXDict begin 202 203 bop -30 -45 a Fm(202)1123 b(9)41 b(INTERF)-5 b(A)o(CING)14 b(PR)o(OLOG)f(AND)h(C)p -30 -27 1890 4 v 74 115 a Fh(#include)20 b("gprolog.h")74 215 y(Bool)74 264 y(my_call\(PlTerm)f(goal\))74 314 y({)118 364 y(PlTerm)h(*args;)118 414 y(int)h(functor,)f(arity;)118 513 y(args)h(=)g(Rd_Callable_Check\(g)o(oal,)d(&functor,)i(&arity\);) 118 563 y(Pl_Exec_Continuat)o(ion\()o(funct)o(or,)f(arity,)h(args\);) 118 613 y(return)g(TRUE;)74 663 y(})-30 819 y Fi(9.4.3)48 b(Example:)22 b(reco)o(v)o(ering)14 b(the)h(list)h(of)f(all)i(op)q (erators)-30 946 y Fm(W)m(e)10 b(here)i(de\014ne)f(a)g(predicate)g Fh(all)p 518 946 14 2 v 15 w(op\(List\))e Fm(whic)o(h)h(uni\014es)h Fh(List)f Fm(with)g(the)h(list)f(of)f(all)g(curren)o(tly)j(de\014ned)f (op)q(erators)-30 996 y(as)j(w)o(ould)g(b)q(e)g(done)g(b)o(y:)k Fh(findall\(X,current)p 748 996 V 12 w(op\()p 827 996 V 15 w(,)p 864 996 V 16 w(,X\),List\))p Fm(.)-30 1095 y(In)c(the)h(prolog)e(\014le)h Fh(examp.pl)p Fm(:)74 1173 y Fh(:-)22 b(foreign\(all)p 385 1173 V 13 w(op\(term\)\).)-30 1251 y Fm(In)14 b(the)h(C)f(\014le)g Fh(examp)p 318 1251 V 14 w(c.c)p Fm(:)74 1329 y Fh(#include)20 b()74 1379 y(#include)g("gprolog.h")74 1479 y(Bool)74 1528 y(all_op\(PlTerm)f(list\))74 1578 y({)118 1628 y(PlTerm)h(op[1024];)118 1678 y(PlTerm)g(args[3];)118 1728 y(int)h(n)h(=)f(0;)118 1778 y(int)g(result;)118 1877 y(Pl_Query_Begin\(TR)o(UE\);)118 1927 y(args[0])f(=)i(Mk_Variable\(\);)118 1977 y(args[1])e(=)i (Mk_Variable\(\);)118 2027 y(args[2])e(=)i(Mk_Variable\(\);)118 2076 y(result)e(=)i(Pl_Query_Call\(Fin)o(d_Ato)o(m\("cu)o(rrent)o (_op"\))o(,)d(3,)i(args\);)118 2126 y(while)g(\(result\))161 2176 y({)205 2226 y(op[n++])f(=)i(Mk_Atom\(Rd_Atom\(a)o(rgs[2)o(]\)\);) c(/*)k(arg)f(#2)g(is)h(the)f(name)g(of)g(the)g(op)h(*/)205 2276 y(result)f(=)g(Pl_Query_Next_Solu)o(tion\()o(\);)161 2325 y(})118 2375 y(Pl_Query_End\(PL_R)o(ECOV)o(ER\);)118 2475 y(return)f(Un_Proper_List_Chec)o(k\(n,)e(op,)k(list\);)74 2525 y(})-30 2603 y Fm(Note)15 b(that)g(w)o(e)g(kno)o(w)f(here)i(that)e (there)i(is)f(no)f(source)i(for)e(exception.)21 b(In)14 b(that)h(case)g(the)h(result)f(of)i Fh(Pl)p 1636 2603 V 15 w(Query)p 1761 2603 V 15 w(Call)-30 2652 y Fm(and)d Fh(Pl)p 98 2652 V 15 w(Query)p 223 2652 V 15 w(Next)p 326 2652 V 15 w(Solution)e Fm(can)i(b)q(e)h(considered)g(as)f(a)g(b)q (o)q(olean.)-30 2752 y(The)h(compilation)d(pro)q(duces)j(an)f (executable)h(called)f Fh(examp)p Fm(:)74 2830 y Fh(\045)22 b(gplc)f(examp.pl)f(examp)p 536 2830 V 15 w(c.c)-30 2908 y Fm(Example)14 b(of)f(use:)p eop end %%Page: 203 205 TeXDict begin 203 204 bop -30 -45 a Fm(9.5)41 b(De\014ning)13 b(a)h(new)g(C)g Fh(main\(\))f Fm(function)1110 b(203)p -30 -27 1890 4 v 74 115 a Fh(|)22 b(?-)f(all_op\(L\).)74 215 y(L)h(=)f([:-,:-,\\=,=:=,#>=,#)o(<#,@>)o(=,-->)o(,mod,)o(#>=#,)o (**,*,)o(+,+,)o(',',.)o(..])74 314 y(|)h(?-)f(findall\(X,current_)o (op\(_,)o(_,X\),)o(L\).)74 414 y(L)h(=)f([:-,:-,\\=,=:=,#>=,#)o(<#,@>)o (=,-->)o(,mod,)o(#>=#,)o(**,*,)o(+,+,)o(',',.)o(..])-30 580 y Ff(9.5)56 b(De\014ning)18 b(a)h(new)g(C)g Fa(main\(\))e Ff(function)-30 706 y Fm(GNU)f(Prolog)g(allo)o(ws)f(the)i(user)g(to)f (de\014ne)h(his)f(o)o(wn)g Fh(main\(\))f Fm(function.)25 b(This)16 b(can)g(b)q(e)h(useful)f(to)g(p)q(erform)h(sev)o(eral)-30 756 y(tasks)d(b)q(efore)f(starting)g(the)h(Prolog)e(engine.)18 b(T)m(o)12 b(do)h(this)g(simply)e(de\014ne)j(a)f(classical)f Fh(main\(argc,)20 b(argv\))12 b Fm(function.)-30 806 y(The)j(follo)o(wing)c(functions)j(can)g(then)h(b)q(e)f(used:)74 889 y Fh(int)43 b(Start_Prolog)194 b(\(int)21 b(argc,)g(char)g (*argv[]\))74 939 y(void)g(Stop_Prolog)216 b(\(void\))74 989 y(void)21 b(Reset_Prolog)194 b(\(void\))74 1038 y(Bool)21 b(Try_Execute_Top_Le)o(vel\(v)o(oid\))-30 1121 y Fm(The)12 b(function)f Fh(Start)p 326 1121 14 2 v 14 w(Prolog\(argc,)19 b(argv\))10 b Fm(initializes)g(the)i(Prolog)e(engine)h(\()p Fh(argc)f Fm(and)h Fh(argv)f Fm(are)i(the)f(command-)-30 1171 y(line)j(v)n(ariables\).)k(This)c(function)f(collects)i(all)e (link)o(ed)g(ob)r(jects)i(\(issued)g(from)e(the)i(compilation)d(of)i (Prolog)f(\014les\))h(and)-30 1221 y(initializes)i(them.)26 b(The)17 b(initialization)d(of)i(a)g(Prolog)g(ob)r(ject)h(\014le)g (consists)g(in)f(adding)g(to)g(appropriate)h(tables)g(new)-30 1271 y(atoms,)12 b(new)h(predicates)i(and)d(executing)h(its)g(system)g (directiv)o(es.)19 b(A)12 b(system)i(directiv)o(e)f(is)f(generated)i(b) o(y)f(the)g(Prolog)-30 1321 y(to)18 b(W)-5 b(AM)19 b(compiler)e(to)h (re\015ect)i(a)e(\(user\))i(directiv)o(e)e(executed)i(at)e (compile-time)f(suc)o(h)i(as)f Fh(op/3)g Fm(\(section)h(6.1.10,)-30 1370 y(page)g(44\).)30 b(Indeed,)19 b(when)g(the)g(compiler)e(encoun)o (ters)j(suc)o(h)f(a)f(directiv)o(e)h(it)e(immediately)g(executes)j(it)e (and)g(also)-30 1420 y(generates)d(a)d(system)i(directiv)o(e)f(to)g (execute)h(it)f(at)f(the)i(start)f(of)f(the)i(executable.)19 b(When)13 b(all)e(system)j(directiv)o(es)f(ha)o(v)o(e)-30 1470 y(b)q(een)20 b(executed)h(the)e(Prolog)f(engine)g(executes)j(all)c (initialization)f(directiv)o(es)k(de\014ned)f(with)g Fh(initialization/)o(1)-30 1520 y Fm(\(section)e(6.1.13,)d(page)i (45\).)23 b(The)16 b(function)g(returns)h(the)f(n)o(um)o(b)q(er)g(of)g (user)g(directiv)o(es)h(\(i.e.)23 b Fh(initialization/1)p Fm(\))-30 1570 y(executed.)d(This)14 b(function)g(m)o(ust)g(b)q(e)g (called)g(only)f(once.)-30 1669 y(The)k(function)e Fh(Stop)p 313 1669 V 15 w(Prolog\(\))f Fm(stops)j(the)f(Prolog)f(engine.)25 b(This)15 b(function)h(m)o(ust)g(b)q(e)g(called)g(only)f(once)h(after)g (all)-30 1719 y(Prolog)e(treatmen)o(t)g(ha)o(v)o(e)g(b)q(een)h(done.) -30 1819 y(The)g(function)e Fh(Reset)p 331 1819 V 15 w(Prolog\(\))f Fm(reinitializes)i(the)g(Prolog)f(engine)h(\(i.e.)k (reset)e(all)c(Prolog)h(stac)o(ks\).)-30 1918 y(The)21 b(function)f Fh(Try)p 300 1918 V 15 w(Execute)p 469 1918 V 15 w(Top)p 550 1918 V 15 w(Level\(\))f Fm(executes)j(the)f(top-lev)o (el)f(if)f(link)o(ed)h(\(section)h(3.4.3,)f(page)g(22\))g(and)-30 1968 y(returns)c Fh(TRUE)p Fm(.)c(If)i(the)g(top-lev)o(el)g(is)g(not)f (presen)o(t)j(the)e(functions)g(returns)i Fh(FALSE)p Fm(.)-30 2068 y(Here)g(is)d(the)i(de\014nition)e(of)h(the)g(default)g (GNU)f(Prolog)h Fh(main\(\))f Fm(function:)74 2151 y Fh(int)74 2201 y(Main_Wrapper\(int)19 b(argc,)h(char)h(*argv[]\))74 2250 y({)118 2300 y(int)g(nb_user_directive)o(;)118 2350 y(Bool)g(top_level;)118 2450 y(nb_user_directive)d(=)k (Start_Prolog\(arg)o(c,)d(argv\);)118 2549 y(top_level)h(=)h (Try_Execute_Top_Lev)o(el\(\);)118 2649 y(Stop_Prolog\(\);)118 2749 y(if)g(\(top_level)f(||)h(nb_user_directive\))161 2798 y(return)g(0;)118 2898 y(fprintf\(stderr,)p eop end %%Page: 204 206 TeXDict begin 204 205 bop -30 -45 a Fm(204)1123 b(9)41 b(INTERF)-5 b(A)o(CING)14 b(PR)o(OLOG)f(AND)h(C)p -30 -27 1890 4 v 292 115 a Fh("Warning:)20 b(no)h(initial)g(goal)g (executed\\n")292 165 y(")65 b(use)22 b(a)f(directive)f(:-)h (initialization\(Goal)o(\)\\n")292 215 y(")65 b(or)22 b(remove)e(the)h(link)g(option)g(--no-top-level")292 264 y(")h(\(or)f(--min-bips)f(or)h(--min-size\)\\n"\);)118 364 y(return)f(1;)74 414 y(})74 513 y(int)74 563 y(main\(int)g(argc,)h (char)g(*argv[]\))74 613 y({)118 663 y(return)f(Main_Wrapper\(argc,)e (argv\);)74 713 y(})-30 792 y Fm(Note)11 b(that)g(under)g(some)g (circumstances)i(it)d(is)g(necessary)j(to)d(encapsulate)i(the)f(co)q (de)g(of)i Fh(main\(\))d Fm(inside)g(an)g(in)o(termedi-)-30 842 y(ate)j(function)f(called)g(b)o(y)h Fh(main\(\))p Fm(.)j(Indeed,)d(some)g(C)f(compilers)g(\(e.g.)18 b(gcc\))13 b(treats)g Fh(main\(\))e Fm(particularly)m(,)g(pro)q(ducing)-30 892 y(an)i(uncompatible)f(co)q(de)i(w.r.t)e(GNU)g(Prolog.)17 b(So)c(it)f(is)h(a)f(go)q(o)q(d)g(idea)h(to)g(alw)o(a)o(ys)e(use)j(a)e (wrapp)q(er)i(function)e(as)h(sho)o(wn)-30 942 y(ab)q(o)o(v)o(e.)-30 1099 y Fi(9.5.1)48 b(Example:)22 b(asking)16 b(for)f(ancestors)-30 1225 y Fm(In)f(this)g(example)g(w)o(e)g(use)h(the)f(follo)o(wing)d (Prolog)j(co)q(de)g(\(in)g(a)g(\014le)f(called)h Fh(new)p 1226 1225 14 2 v 15 w(main.pl)p Fm(\):)74 1304 y Fh(parent\(bob,)63 b(mary\).)74 1354 y(parent\(jane,)41 b(mary\).)74 1404 y(parent\(mary,)g(peter\).)74 1454 y(parent\(paul,)g(peter\).)74 1504 y(parent\(peter,)19 b(john\).)74 1603 y(anc\(X,)i(Y\):-)249 1653 y(parent\(X,)f(Y\).)74 1753 y(anc\(X,)h(Z\))g(:-)249 1803 y(parent\(X,)f(Y\),)249 1852 y(anc\(Y,)g(Z\).)-30 1932 y Fm(The)f(follo)o(wing)d(\014le)i(\(called)h Fh(new)p 519 1932 V 15 w(main)p 622 1932 V 15 w(c.c)p Fm(\))f(de\014nes)h(a)f Fh(main\(\))g Fm(function)g(readinf)g(the)h(name)f(of)g(a)g(p)q(erson)h (and)-30 1982 y(displa)o(ying)13 b(all)f(successors)17 b(of)c(that)h(p)q(erson.)19 b(This)14 b(is)g(equiv)n(alen)o(t)f(to)h (the)g(Prolog)g(query:)k Fh(anc\(Result,)i(Name\))p Fm(.)74 2061 y Fh(static)h(int)74 2111 y(Main_Wrapper\(int)e(argc,)h(char)h (*argv[]\))74 2161 y({)118 2211 y(int)g(func;)118 2260 y(WamWord)f(arg[10];)118 2310 y(char)h(str[100];)118 2360 y(char)g(*sol[100];)118 2410 y(int)g(i,)g(nb_sol)g(=)h(0;)118 2460 y(Bool)f(res;)118 2559 y(Start_Prolog\(argc)o(,)e(argv\);)118 2659 y(func)i(=)g(Find_Atom\("anc"\);)118 2709 y(for)g(\(;;\))161 2759 y({)205 2808 y(printf\("\\nEnter)e(a)i(name)g(\(or)g('end')g(to)h (finish\):)e("\);)205 2858 y(scanf\("\045s",)g(str\);)p eop end %%Page: 205 207 TeXDict begin 205 206 bop -30 -45 a Fm(9.5)41 b(De\014ning)13 b(a)h(new)g(C)g Fh(main\(\))f Fm(function)1110 b(205)p -30 -27 1890 4 v 205 115 a Fh(if)21 b(\(strcmp\(str,)f("end"\))g(==)i (0\))249 165 y(break;)205 264 y(Pl_Query_Begin\(TR)o(UE\);)205 364 y(arg[0])f(=)g(Mk_Variable\(\);)205 414 y(arg[1])g(=)g (Mk_String\(str\);)205 464 y(nb_sol)g(=)g(0;)205 513 y(res)g(=)h(Pl_Query_Call\(fu)o(nc,)d(2,)i(arg\);)205 563 y(while)g(\(res\))249 613 y({)292 663 y(sol[nb_sol++])e(=)j (Rd_String\(arg[0]\))o(;)292 713 y(res)f(=)h(Pl_Query_Next_Sol)o(ution) o(\(\);)249 762 y(})205 812 y(Pl_Query_End\(PL_R)o(ECOVE)o(R\);)205 912 y(for)f(\(i)h(=)f(0;)h(i)f(<)h(nb_sol;)e(i++\))249 962 y(printf\(")42 b(solution:)19 b(\045s\\n",)i(sol[i]\);)205 1012 y(printf\("\045d)f(solution\(s\)\\n",)e(nb_sol\);)161 1061 y(})118 1161 y(Stop_Prolog\(\);)118 1211 y(return)i(0;)74 1261 y(})74 1360 y(int)74 1410 y(main\(int)g(argc,)h(char)g(*argv[]\)) 74 1460 y({)118 1510 y(return)f(Main_Wrapper\(argc,)e(argv\);)74 1559 y(})-30 1643 y Fm(The)d(compilation)d(pro)q(duces)j(an)f (executable)h(called)f Fh(new)p 905 1643 14 2 v 15 w(main)p Fm(:)74 1726 y Fh(\045)22 b(gplc)f(new)p 296 1726 V 15 w(main.pl)f(new)p 551 1726 V 15 w(main)p 654 1726 V 15 w(c.c)-30 1809 y Fm(Examples)14 b(of)g(use:)74 1892 y Fh(Enter)21 b(a)h(name)f(\(or)g('end')f(to)i(finish\):)e(john)118 1941 y(solution:)g(peter)118 1991 y(solution:)g(bob)118 2041 y(solution:)g(jane)118 2091 y(solution:)g(mary)118 2141 y(solution:)g(paul)74 2190 y(5)i(solution\(s\))74 2290 y(Enter)f(a)h(name)f(\(or)g('end')f(to)i(finish\):)e(mary)118 2340 y(solution:)g(bob)118 2390 y(solution:)g(jane)74 2440 y(2)i(solution\(s\))74 2539 y(Enter)f(a)h(name)f(\(or)g('end')f (to)i(finish\):)e(end)p eop end %%Page: 206 208 TeXDict begin 206 207 bop -30 -45 a Fm(206)1123 b(9)41 b(INTERF)-5 b(A)o(CING)14 b(PR)o(OLOG)f(AND)h(C)p -30 -27 1890 4 v eop end %%Page: 207 209 TeXDict begin 207 208 bop -30 -45 a Fm(REFERENCES)1543 b(207)p -30 -27 1890 4 v -30 115 a Fn(References)-9 256 y Fm([1])20 b(H.)13 b(A)-5 b(\177)-16 b(\020t-Kaci.)18 b(\\W)m(arren's)13 b(Abstract)j(Mac)o(hine,)d(A)h(T)m(utorial)e (Reconstruction".)56 305 y(Logic)h(Programming)f(Series,)j(MIT)f (Press,)h(1991.)56 355 y Fh(http://www.vanx.)o(org/a)o(rchiv)o(e/wam)o (/wam.)o(html)-9 438 y Fm([2])20 b(W.F.)12 b(Clo)q(c)o(ksin)i(and)g (C.S.)f(Mellish.)k(Programming)12 b(in)i(Prolog,)f(Springer-V)m(erlag,) g(1981.)-9 521 y([3])20 b(P)m(.)13 b(Co)q(dognet)h(and)g(D.)f(Diaz.)k (\\)p Fh(wamcc)p Fm(:)g(Compiling)11 b(Prolog)j(to)f(C".)56 571 y(In)h Fe(12th)h(International)g(Confer)n(enc)n(e)g(on)g(L)n(o)n (gic)g(Pr)n(o)n(gr)n(amming)p Fm(,)e(T)m(oky)o(o,)f(Japan,)h(MIT)h (Press,)h(1995.)56 621 y Fh(ftp://ftp.inria.)o(fr/IN)o(RIA/P)o(rojec)o (ts/lo)o(co/pu)o(blic)o(ation)o(s/WAM)o(CC/ic)o(lp95.)o(pdf)-9 704 y Fm([4])20 b(P)m(.)13 b(Co)q(dognet)h(and)g(D.)f(Diaz.)k (\\Compiling)11 b(Constrain)o(t)j(in)g Fh(clp\(FD\))p Fm(".)56 754 y Fe(Journal)h(of)f(L)n(o)n(gic)h(Pr)n(o)n(gr)n(amming)p Fm(,)e(V)m(ol.)f(27,)h(No.)g(3,)h(June)g(1996.)56 804 y Fh(ftp://ftp.inria.)o(fr/IN)o(RIA/P)o(rojec)o(ts/lo)o(co/pu)o(blic)o (ation)o(s/CLP)o(-FD/j)o(lp96.)o(pdf)-9 887 y Fm([5])20 b(D.)13 b(Diaz)g(and)h(P)m(.)f(Co)q(dognet.)18 b(\\Design)c(and)f (Implemen)o(tation)g(of)g(the)i(GNU)f(Prolog)f(System".)56 936 y Fe(Journal)i(of)f(F)m(unctional)i(and)f(L)n(o)n(gic)g(Pr)n(o)n (gr)n(amming)p Fm(,)e(V)m(ol.)f(2001,)h(No.)g(6,)g(Octob)q(er)i(2001.) 56 986 y Fh(ftp://ftp.inria.)o(fr/IN)o(RIA/P)o(rojec)o(ts/lo)o(co/pu)o (blic)o(ation)o(s/GNU)o(-PROL)o(OG/jf)o(lp01.)o(pdf)-9 1069 y Fm([6])24 b(Information)13 b(tec)o(hnology)g(-)h(Programming)e (languages)i(-)f(Prolog)h(-)f(P)o(art)h(1:)k(General)c(Core.)56 1119 y(ISO/IEC)g(13211-1,)e(1995.)-9 1202 y([7])20 b(J.)14 b(Ja\013ar)g(and)f(J-L.)h(Lassez.)19 b(\\Constrain)o(t)14 b(Logic)f(Programming".)56 1252 y(In)h Fe(Principles)g(Of)g(Pr)n(o)n (gr)n(amming)h(L)n(anguages)p Fm(,)f(Munic)o(h,)g(German)o(y)m(,)e(Jan) o(uary)i(1987.)-9 1335 y([8])20 b(P)m(.)13 b(V)m(an)g(Hen)o(tenryc)o (k.)20 b(\\Constrain)o(t)13 b(Satisfaction)g(in)h(Logic)f (Programming".)56 1385 y(Logic)g(Programming)f(Series,)j(The)f(MIT)g (Press,)h(1989.)-9 1468 y([9])20 b(D.)13 b(H.)g(D.)g(W)m(arren.)18 b(\\An)c(Abstract)h(Prolog)e(Instruction)i(Set".)56 1518 y(T)m(ec)o(hnical)e(Rep)q(ort)i(309,)d(SRI)i(In)o(ternational,)e(Oct.)j (1983.)p eop end %%Page: 208 210 TeXDict begin 208 209 bop -30 -45 a Fm(208)1542 b(REFERENCES)p -30 -27 1890 4 v eop end %%Page: 209 211 TeXDict begin 209 210 bop -30 -45 a Fm(INDEX)1691 b(209)p -30 -27 1890 4 v -30 177 a Fn(Index)-30 260 y Fh(!/0)p Fm(,)13 b Fi(46)p Fm(,)g(47)-30 310 y Fh('.'/2)p Fm(,)g Fi(136)-30 360 y Fh(\(','\)/2)p Fm(,)f Fi(46)-30 410 y Fh(\(-->\)/2)p Fm(,)g Fi(109)-30 459 y Fh(\(->\)/2)p Fm(,)h Fi(46)-30 509 y Fh(\(;\)/2)p Fm(,)g Fi(46)-30 559 y Fh(\(=\)/2)p Fm(,)g Fi(50)-30 609 y Fh(\(=..\)/2)p Fm(,)f Fi(53)-30 659 y Fh(\(=:=\)/2)p Fm(,)g Fi(60)-30 708 y Fh(\(==\)/2)p Fm(,)h Fi(51)p Fm(,)g(122)-30 758 y Fh(\(=<\)/2)p Fm(,)g Fi(60)-30 808 y Fh(\(=\\=\)/2)p Fm(,)f Fi(60)-30 858 y Fh(\(@=<\)/2)p Fm(,)g Fi(51)-30 908 y Fh(\(@<\)/2)p Fm(,)h Fi(51)-30 957 y Fh(\(@>\)/2)p Fm(,)g Fi(51)-30 1007 y Fh(\(@>=\)/2)p Fm(,)f Fi(51)-30 1057 y Fh(\(#/\\\)/2)21 b Fm(\(FD\),)13 b Fi(174)-30 1107 y Fh(\(#=\)/2)21 b Fm(\(FD\),)13 b Fi(171)-30 1157 y Fh(\(#==>\)/2)21 b Fm(\(FD\),)13 b Fi(174)-30 1207 y Fh(\(#=#\)/2)21 b Fm(\(FD\),)13 b Fi(172)-30 1256 y Fh(\(#=<\)/2)21 b Fm(\(FD\),)13 b Fi(171)-30 1306 y Fh(\(#=<#\)/2)21 b Fm(\(FD\),)13 b Fi(172)-30 1356 y Fh(\(##\)/2)21 b Fm(\(FD\),)13 b Fi(174)-30 1406 y Fh(\(#<\)/2)21 b Fm(\(FD\),)13 b Fi(171)-30 1456 y Fh(\(#<=>\)/2)21 b Fm(\(FD\),)13 b Fi(174)-30 1505 y Fh(\(#<#\)/2)21 b Fm(\(FD\),)13 b Fi(172)-30 1555 y Fh(\(#>\)/2)21 b Fm(\(FD\),)13 b Fi(171)-30 1605 y Fh(\(#>=\)/2)21 b Fm(\(FD\),)13 b Fi(171)-30 1655 y Fh(\(#>=#\)/2)21 b Fm(\(FD\),)13 b Fi(172)-30 1705 y Fh(\(#>#\)/2)21 b Fm(\(FD\),)13 b Fi(172)-30 1754 y Fh(\(#\\\)/1)21 b Fm(\(FD\),)13 b Fi(174)-30 1804 y Fh(\(#\\/\)/2)21 b Fm(\(FD\),)13 b Fi(174)-30 1854 y Fh(\(#\\/\\\)/2)21 b Fm(\(FD\),)13 b Fi(174)-30 1904 y Fh(\(#\\=\)/2)21 b Fm(\(FD\),)13 b Fi(171)-30 1954 y Fh(\(#\\==>\)/2)20 b Fm(\(FD\),)14 b Fi(174)-30 2004 y Fh(\(#\\=#\)/2)21 b Fm(\(FD\),)13 b Fi(172)-30 2053 y Fh(\(#\\<=>\)/2)20 b Fm(\(FD\),)14 b Fi(174)-30 2103 y Fh(\(#\\\\/\)/2)21 b Fm(\(FD\),)13 b Fi(174)-30 2153 y Fh(\(is\)/2)p Fm(,)g Fi(59)-30 2203 y Fh(\(<\)/2)p Fm(,)g Fi(60)-30 2253 y Fh(\(>\)/2)p Fm(,)g Fi(60)-30 2302 y Fh(\(>=\)/2)p Fm(,)g Fi(60)-30 2352 y Fh(\(\\+\)/1)p Fm(,)g Fi(113)-30 2402 y Fh(\(\\=\)/2)p Fm(,)g Fi(50)-30 2452 y Fh(\(\\==\)/2)p Fm(,)f Fi(51)-30 2502 y Fh(--)p Fm(,)h Fi(13)-30 2551 y Fh(--assembly)p Fm(,)f Fi(22)-30 2601 y Fh(--aux-father)p Fm(,)f Fi(27)-30 2651 y Fh(--aux-father2)p Fm(,)g Fi(27)-30 2701 y Fh(--c-compiler)p Fm(,)g Fi(23)-30 2751 y Fh(--cmd-line)p Fm(,)h Fi(27)-30 2801 y Fh(--comment)p Fm(,)g(23,)h Fi(23)-30 2850 y Fh(--compile-msg)p Fm(,)e Fi(22)-30 2900 y Fh(--cstr-size)p Fm(,)h Fi(23)988 260 y Fh(--encode)p Fm(,)g Fi(27)988 310 y Fh(--entry-goal)p Fm(,)f Fi(13)988 360 y Fh(--fast-math)p Fm(,)g Fi(22)p Fm(,)i(59)988 410 y Fh(--fd-to-c)p Fm(,)f Fi(22)988 459 y Fh(--fixed-sizes)p Fm(,)f(19,)i Fi(23)988 509 y Fh(--foreign-only)p Fm(,)d Fi(22)988 559 y Fh(--global-size)p Fm(,)h Fi(23)988 609 y Fh(--help)p Fm(,)h Fi(13)p Fm(,)h Fi(22)p Fm(,)g Fi(27)988 659 y Fh(--init-goal)p Fm(,)e Fi(13)988 708 y Fh(--keep-void-inst)p Fm(,)f Fi(22)988 758 y Fh(--local-size)p Fm(,)h(19,)i Fi(23)988 808 y Fh(--min-bips)p Fm(,)e Fi(23)988 858 y Fh(--min-fd-bips)p Fm(,)g Fi(23)988 908 y Fh(--min-pl-bips)p Fm(,)g Fi(23)988 957 y Fh(--min-reg-opt)p Fm(,)g Fi(22)988 1007 y Fh(--min-size)p Fm(,)g Fi(23)988 1057 y Fh(--mini-assembly)p Fm(,)f Fi(22)988 1107 y Fh(--no-call-c)p Fm(,)h Fi(22)988 1157 y Fh(--no-debugger)p Fm(,)g(23,)i Fi(23)988 1207 y Fh(--no-decode-hexa)p Fm(,)d Fi(22)988 1256 y Fh(--no-del-temp)p Fm(,)h Fi(22)988 1306 y Fh(--no-fd-lib)p Fm(,)g Fi(23)988 1356 y Fh(--no-inline)p Fm(,)g Fi(22)988 1406 y Fh(--no-opt-last-sub)o(term)p Fm(,)f Fi(22)988 1456 y Fh(--no-redef-error)p Fm(,)g Fi(22)988 1505 y Fh(--no-reg-opt)p Fm(,)h Fi(22)988 1555 y Fh(--no-reorder)p Fm(,)g Fi(22)988 1605 y Fh(--no-singl-warn)p Fm(,)f Fi(22)988 1655 y Fh(--no-susp-warn)p Fm(,)g Fi(22)988 1705 y Fh(--no-top-level)p Fm(,)g Fi(23)988 1754 y Fh(--object)p Fm(,)i Fi(22)988 1804 y Fh(--output)p Fm(,)g Fi(22)988 1854 y Fh(--pl-state)p Fm(,)f Fi(22)p Fm(,)i(136)988 1904 y Fh(--printf)p Fm(,)f Fi(27)988 1954 y Fh(--query-goal)p Fm(,)f Fi(13)988 2004 y Fh(--relax)p Fm(,)h Fi(27)988 2053 y Fh(--statistics)p Fm(,)f Fi(22)988 2103 y Fh(--strip)p Fm(,)h Fi(23)988 2153 y Fh(--temp-dir)p Fm(,)f Fi(22)988 2203 y Fh(--trail-size)p Fm(,)g Fi(23)988 2253 y Fh(--verbose)p Fm(,)h Fi(22)988 2302 y Fh(--version)p Fm(,)g Fi(13)p Fm(,)h Fi(22)p Fm(,)g Fi(27)988 2352 y Fh(--wam-for-byte-co)o(de)p Fm(,)d Fi(22)988 2402 y Fh(--wam-for-native)p Fm(,)g Fi(22)988 2452 y Fh(-A)p Fm(,)j Fi(23)988 2502 y Fh(-C)p Fm(,)g Fi(23)988 2551 y Fh(-F)p Fm(,)g Fi(22)988 2601 y Fh(-H)p Fm(,)g Fi(27)988 2651 y Fh(-L)p Fm(,)g Fi(23)988 2701 y Fh(-M)p Fm(,)g Fi(22)988 2751 y Fh(-P)p Fm(,)g Fi(27)988 2801 y Fh(-S)p Fm(,)g Fi(22)988 2850 y Fh(-W)p Fm(,)g Fi(22)988 2900 y Fh(-c)p Fm(,)g Fi(22)p eop end %%Page: 210 212 TeXDict begin 210 211 bop -30 -45 a Fm(210)1690 b(INDEX)p -30 -27 1890 4 v -30 115 a Fh(-h)p Fm(,)13 b Fi(22)-30 165 y Fh(-o)p Fm(,)g Fi(22)-30 215 y Fh(-s)p Fm(,)g Fi(23)-30 264 y Fh(-v)p Fm(,)g Fi(22)-30 314 y Fh(-w)p Fm(,)g Fi(22)-30 405 y Fh(abolish/1)p Fm(,)f Fi(63)-30 455 y Fh(abort/0)p Fm(,)g(17,)h(32,)g Fi(112)-30 505 y Fh(absolute)p 149 505 14 2 v 15 w(file)p 252 505 V 14 w(name)21 b Fm(\(prop)q(ert)o(y\),) 15 b Fi(147)-30 555 y Fh(absolute)p 149 555 V 15 w(file)p 252 555 V 14 w(name/2)p Fm(,)k(44,)g(70,)g(136,)g(137,)g Fi(141)p Fm(,)137 605 y(142,)12 b(144{149)-30 655 y Fh(add)p 39 655 V 16 w(linedit)p 209 655 V 14 w(completion/1)p Fm(,)f Fi(162)-30 704 y Fh(add)p 39 704 V 16 w(stream)p 187 704 V 14 w(alias/2)p Fm(,)h(67,)h Fi(79)-30 754 y Fh(add)p 39 754 V 16 w(stream)p 187 754 V 14 w(mirror/2)p Fm(,)f(68,)h Fi(79)-30 804 y Fh(alias)21 b Fm(\(option\),)13 b Fi(71)-30 854 y Fh(alias)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(73)-30 904 y Fh(append)21 b Fm(\(mo)q(de\),)14 b Fi(70)-30 953 y Fh(append/1)p Fm(,)e Fi(107)-30 1003 y Fh(append/3)p Fm(,)g Fi(121)-30 1053 y Fh(architecture/1)p Fm(,)f Fi(151)-30 1103 y Fh(arg/3)p Fm(,)i Fi(53)-30 1153 y Fm(argumen)o(t)h(selector,)h Fi(126)-30 1202 y Fh(argument)p 149 1202 V 15 w(counter/1)p Fm(,)c Fi(142)-30 1252 y Fh(argument)p 149 1252 V 15 w(list/1)p Fm(,)h(14,)h Fi(143)-30 1302 y Fh(argument)p 149 1302 V 15 w(value/2)p Fm(,)e(14,)i Fi(143)-30 1352 y Fh(asserta/1)p Fm(,)f Fi(61)-30 1402 y Fh(assertz/1)p Fm(,)g Fi(61)-30 1452 y Fh(at)p 17 1452 V 16 w(end)p 99 1452 V 15 w(of)p 158 1452 V 15 w(stream/0)p Fm(,)g Fi(74)-30 1501 y Fh(at)p 17 1501 V 16 w(end)p 99 1501 V 15 w(of)p 158 1501 V 15 w(stream/1)p Fm(,)g Fi(74)-30 1551 y Fh(atom/1)p Fm(,)h Fi(49)-30 1601 y Fh(atom)p 61 1601 V 15 w(chars/2)p Fm(,)f Fi(117)-30 1651 y Fh(atom)p 61 1651 V 15 w(codes/2)p Fm(,)g Fi(117)-30 1701 y Fh(atom)p 61 1701 V 15 w(concat/3)p Fm(,)g Fi(115)-30 1750 y Fh(atom)p 61 1750 V 15 w(hash/2)p Fm(,)g Fi(119)-30 1800 y Fh(atom)p 61 1800 V 15 w(length/2)p Fm(,)g Fi(114)-30 1850 y Fh(atom)p 61 1850 V 15 w(property/2)p Fm(,)g Fi(120)-30 1900 y Fh(atomic/1)p Fm(,)g Fi(49)-30 1991 y Fh(back)p 61 1991 V 15 w(quotes)21 b Fm(\(\015ag\),)13 b(14,)g(91,)g Fi(134)p Fm(,)g(136)-30 2041 y Fh(back)p 61 2041 V 15 w(quotes)21 b Fm(\(tok)o(en\),)14 b Fi(94)-30 2091 y Fh(backtracks)20 b Fm(\(FD)14 b(option\),)f Fi(180)-30 2141 y Fh(bagof/3)p Fm(,)f Fi(66)-30 2190 y Fh(binary)21 b Fm(\(option\),)13 b Fi(70)p Fm(,)g(81)-30 2240 y Fh(bind)p 61 2240 V 15 w(variables/2)p Fm(,)e Fi(56)-30 2290 y Fh(bip)p 39 2290 V 16 w(name)21 b Fm(\(option\),)12 b Fi(183)p Fm(,)h(196)-30 2340 y Fh(block)21 b Fm(\(option\),)13 b Fi(71)p Fm(,)g(82)-30 2390 y Fh(block)p 83 2390 V 15 w(device)21 b Fm(\(p)q(ermission\),)13 b Fi(147)-30 2440 y Fh(bof)22 b Fm(\(whence\),)15 b Fi(76)-30 2489 y Fh(boolean)21 b Fm(\(option\),)13 b Fi(183)p Fm(,)g(184)-30 2539 y Fh(bounded)21 b Fm(\(\015ag\),)13 b Fi(133)-30 2589 y Fh(bounds)21 b Fm(\(FD)14 b(option\),)f Fi(179)-30 2639 y Fh(break/0)p Fm(,)f(17,)h(32,)g Fi(112)-30 2689 y Fh(buffering)20 b Fm(\(option\),)13 b Fi(71)-30 2738 y Fh(buffering)20 b Fm(\(prop)q(ert)o(y\),)15 b Fi(74)-30 2788 y Fh(built)p 83 2788 V 15 w(in)22 b Fm(\(prop)q(ert)o(y\),)14 b(43,)f Fi(65)-30 2838 y Fh(built)p 83 2838 V 15 w(in/0)21 b Fm(\(directiv)o(e\),)14 b Fi(43)-30 2888 y Fh(built)p 83 2888 V 15 w(in/1)21 b Fm(\(directiv)o(e\),)14 b Fi(43)988 115 y Fh(built)p 1101 115 V 15 w(in)p 1160 115 V 15 w(fd)21 b Fm(\(prop)q(ert)o(y\),)15 b(43,)e Fi(65)988 165 y Fh(built)p 1101 165 V 15 w(in)p 1160 165 V 15 w(fd/0)21 b Fm(\(directiv)o(e\),)14 b Fi(43)988 215 y Fh(built)p 1101 215 V 15 w(in)p 1160 215 V 15 w(fd/1)21 b Fm(\(directiv)o(e\),)14 b Fi(43)988 306 y Fh(call/1)p Fm(,)e Fi(47)988 356 y Fh(call/2-11)p Fm(,)g Fi(113)988 405 y Fh(call)p 1079 405 V 15 w(det/2)p Fm(,)g Fi(113)988 455 y Fh(call)p 1079 455 V 15 w(with)p 1182 455 V 15 w(args/1-11)p Fm(,)f Fi(113)988 505 y Fh(callable/1)p Fm(,)g Fi(49)988 555 y Fh(catch/3)p Fm(,)h(29,)h(37,)g Fi(47)988 605 y Fh(change)p 1123 605 V 14 w(directory/1)p Fm(,)f Fi(144)988 655 y Fh(char)p 1079 655 V 15 w(code/2)p Fm(,)g Fi(116)p Fm(,)h(189)988 704 y Fh(char)p 1079 704 V 15 w(conversion)20 b Fm(\(\015ag\),)13 b(91,)g(103,)f Fi(134)p Fm(,)h(136)988 754 y Fh(char)p 1079 754 V 15 w(conversion/2)19 b Fm(\(directiv)o(e\),)14 b Fi(44)988 804 y Fh(char)p 1079 804 V 15 w(conversion/2)p Fm(,)d(45,)i Fi(102)988 854 y Fh(character)p 1189 854 V 14 w(count/2)p Fm(,)f Fi(76)988 904 y Fh(character)p 1189 904 V 14 w(device)20 b Fm(\(p)q(ermission\),)14 b Fi(147)988 953 y Fh(choice)p 1123 953 V 14 w(size)21 b Fm(\(option\),)13 b Fi(183)p Fm(,)g(186)988 1003 y Fh(clause/2)p Fm(,)f Fi(63)988 1053 y Fh(close/1)p Fm(,)g Fi(72)988 1103 y Fh(close/2)p Fm(,)g Fi(72)p Fm(,)h(153,)g(158)988 1153 y Fh(close)p 1101 1153 V 15 w(input)p 1226 1153 V 14 w(atom)p 1328 1153 V 15 w(stream/1)p Fm(,)f Fi(83)988 1202 y Fh(close)p 1101 1202 V 15 w(input)p 1226 1202 V 14 w(chars)p 1350 1202 V 15 w(stream/1)p Fm(,)g Fi(83)988 1252 y Fh(close)p 1101 1252 V 15 w(input)p 1226 1252 V 14 w(codes)p 1350 1252 V 15 w(stream/1)p Fm(,)g Fi(83)988 1302 y Fh(close)p 1101 1302 V 15 w(output)p 1248 1302 V 14 w(atom)p 1350 1302 V 15 w(stream/2)p Fm(,)g Fi(84)988 1352 y Fh(close)p 1101 1352 V 15 w(output)p 1248 1352 V 14 w(chars)p 1372 1352 V 15 w(stream/2)p Fm(,)f Fi(84)988 1402 y Fh(close)p 1101 1402 V 15 w(output)p 1248 1402 V 14 w(codes)p 1372 1402 V 15 w(stream/2)p Fm(,)g Fi(84)988 1452 y Fh(compare/3)p Fm(,)h Fi(52)988 1501 y Fm(completion,)h Fi(18)p Fm(,)g(162,)f(163)988 1551 y Fh(compound/1)p Fm(,)f Fi(49)988 1601 y Fh(consult/1)p Fm(,)h(16,)g(17,)h(20,)g(21,)g Fi(136)988 1651 y Fh(copy)p 1079 1651 V 15 w(term/2)p Fm(,)f Fi(54)988 1701 y Fh(cpu)p 1057 1701 V 15 w(time/1)p Fm(,)g Fi(139)988 1750 y Fh(create)p 1123 1750 V 14 w(pipe/2)p Fm(,)h Fi(154)988 1800 y Fh(current)20 b Fm(\(whence\),)15 b Fi(76)988 1850 y Fh(current)p 1145 1850 V 14 w(alias/2)p Fm(,)d Fi(79)988 1900 y Fh(current)p 1145 1900 V 14 w(atom/1)p Fm(,)g Fi(120)988 1950 y Fh(current)p 1145 1950 V 14 w(bip)p 1225 1950 V 15 w(name/2)p Fm(,)g(37,)h Fi(135)988 1999 y Fh(current)p 1145 1999 V 14 w(char)p 1247 1999 V 15 w(conversion/2)p Fm(,)e Fi(103)988 2049 y Fh(current)p 1145 2049 V 14 w(input/1)p Fm(,)h Fi(69)988 2099 y Fh(current)p 1145 2099 V 14 w(mirror/2)p Fm(,)g Fi(80)988 2149 y Fh(current)p 1145 2149 V 14 w(op/3)p Fm(,)h Fi(102)988 2199 y Fh(current)p 1145 2199 V 14 w(output/1)p Fm(,)f Fi(69)988 2249 y Fh(current)p 1145 2249 V 14 w(predicate/1)p Fm(,)f(62,)i Fi(64)988 2298 y Fh(current)p 1145 2298 V 14 w(prolog)p 1291 2298 V 15 w(flag/2)p Fm(,)f Fi(134)988 2348 y Fh(current)p 1145 2348 V 14 w(stream/1)p Fm(,)g Fi(73)988 2440 y Fh(date)p 1079 2440 V 15 w(time/1)p Fm(,)g Fi(149)988 2489 y Fh(debug)21 b Fm(\(\015ag\),)13 b Fi(134)988 2539 y Fh(debug/0)20 b Fm(\(debug\),)14 b(17,)f Fi(29)988 2589 y Fh(debugging/0)20 b Fm(\(debug\),)14 b Fi(29)p Fm(,)f(32)988 2639 y Fh(decompose)p 1189 2639 V 14 w(file)p 1291 2639 V 15 w(name/4)p Fm(,)f Fi(141)988 2689 y Fm(De\014nite)i(clause)h(grammars,)d Fe(se)n(e)17 b Fm(DCG)988 2738 y Fh(delete/3)p Fm(,)12 b Fi(122)988 2788 y Fh(delete)p 1123 2788 V 14 w(directory/1)p Fm(,)g Fi(144)988 2838 y Fh(delete)p 1123 2838 V 14 w(file/1)p Fm(,)h Fi(146)988 2888 y Fh(directory)20 b Fm(\(p)q(ermission\),)14 b Fi(147)p eop end %%Page: 211 213 TeXDict begin 211 212 bop -30 -45 a Fm(INDEX)1691 b(211)p -30 -27 1890 4 v -30 115 a Fh(directory)p 171 115 14 2 v 14 w(files/2)p Fm(,)12 b Fi(145)-30 165 y Fh(discontiguous/1)19 b Fm(\(directiv)o(e\),)14 b Fi(42)-30 215 y Fh(display/1)p Fm(,)e Fi(96)-30 264 y Fh(display/2)p Fm(,)g Fi(96)p Fm(,)h(105,)g(106)-30 314 y Fh(display)p 127 314 V 15 w(to)p 186 314 V 15 w(atom/2)p Fm(,)f Fi(105)-30 364 y Fh(display)p 127 364 V 15 w(to)p 186 364 V 15 w(chars/2)p Fm(,)g Fi(106)-30 414 y Fh(display)p 127 414 V 15 w(to)p 186 414 V 15 w(codes/2)p Fm(,)g Fi(106)-30 464 y Fh(double)p 105 464 V 15 w(quotes)20 b Fm(\(\015ag\),)14 b(91,)f Fi(134)p Fm(,)g(136)-30 513 y Fh(dynamic)21 b Fm(\(prop)q(ert)o(y\),)14 b Fi(65)-30 563 y Fh(dynamic/1)20 b Fm(\(directiv)o(e\),)15 b Fi(41)p Fm(,)e(60)-30 655 y Fh(end)p 39 655 V 16 w(of)p 99 655 V 15 w(stream)20 b Fm(\(prop)q(ert)o(y\),)15 b Fi(74)-30 704 y Fh(end)p 39 704 V 16 w(of)p 99 704 V 15 w(term)21 b Fm(\(option\),)13 b Fi(92)-30 754 y Fh(ensure)p 105 754 V 15 w(linked/1)20 b Fm(\(directiv)o(e\),)14 b Fi(43)-30 804 y Fh(ensure)p 105 804 V 15 w(loaded/1)20 b Fm(\(directiv)o(e\),)14 b Fi(44)-30 854 y Fh(environ/2)p Fm(,)e Fi(144)-30 904 y Fh(eof)22 b Fm(\(whence\),)15 b Fi(76)-30 953 y Fh(eof)p 39 953 V 16 w(action)20 b Fm(\(option\),)13 b Fi(71)-30 1003 y Fh(eof)p 39 1003 V 16 w(action)20 b Fm(\(prop)q(ert)o(y\),)15 b Fi(74)-30 1053 y Fh(eof)p 39 1053 V 16 w(code)21 b Fm(\(option\),)12 b Fi(71)p Fm(,)i(81)-30 1103 y Fh(error)21 b Fm(\(option\),)13 b Fi(71)p Fm(,)g(81,)g Fi(92)-30 1153 y Fm(escap)q(e)j(sequence,)g(14,) c(121,)h Fi(134)-30 1202 y Fh(exclude)21 b Fm(\(option\),)13 b Fi(56)-30 1252 y Fh(exec/4)p Fm(,)g Fi(153)-30 1302 y Fh(exec/5)p Fm(,)g Fi(153)-30 1352 y Fh(execute)21 b Fm(\(p)q(ermission\),)14 b Fi(147)-30 1402 y Fh(expand)p 105 1402 V 15 w(term/2)p Fm(,)e Fi(111)-30 1452 y Fh(extended)21 b Fm(\(tok)o(en\),)13 b Fi(94)-30 1501 y Fm(extra-constrained,)i Fe(se)n(e)i Fh(extra)p 494 1501 V 15 w(cstr)-30 1551 y(extra)p 83 1551 V 15 w(cstr)k Fm(\(FD\),)14 b Fi(165)p Fm(,)f(170)-30 1643 y Fh(fail)21 b Fm(\(option\),)13 b Fi(92)-30 1692 y Fh(fail/0)p Fm(,)g Fi(46)-30 1742 y Fh(fct)p 39 1742 V 16 w(name)21 b Fm(\(option\),)12 b Fi(183)-30 1792 y Fh(fd)p 17 1792 V 16 w(all)p 99 1792 V 15 w(different/1)19 b Fm(\(FD\),)14 b Fi(176)-30 1842 y Fh(fd)p 17 1842 V 16 w(at)p 77 1842 V 15 w(least)p 202 1842 V 15 w(one/1)20 b Fm(\(FD\),)14 b Fi(175)-30 1892 y Fh(fd)p 17 1892 V 16 w(at)p 77 1892 V 15 w(most)p 180 1892 V 15 w(one/1)21 b Fm(\(FD\),)13 b Fi(175)-30 1941 y Fh(fd)p 17 1941 V 16 w(atleast/3)20 b Fm(\(FD\),)13 b Fi(177)-30 1991 y Fh(fd)p 17 1991 V 16 w(atmost/3)20 b Fm(\(FD\),)13 b Fi(177)-30 2041 y Fh(fd)p 17 2041 V 16 w(cardinality/2)19 b Fm(\(FD\),)13 b Fi(175)p Fm(,)g(178)-30 2091 y Fh(fd)p 17 2091 V 16 w(cardinality/3)19 b Fm(\(FD\),)13 b Fi(175)-30 2141 y Fh(fd)p 17 2141 V 16 w(dom/2)21 b Fm(\(FD\),)13 b Fi(169)-30 2190 y Fh(fd)p 17 2190 V 16 w(domain/2)20 b Fm(\(FD\),)13 b Fi(168)-30 2240 y Fh(fd)p 17 2240 V 16 w(domain/3)20 b Fm(\(FD\),)13 b Fi(167)-30 2290 y Fh(fd)p 17 2290 V 16 w(domain)p 165 2290 V 14 w(bool/1)21 b Fm(\(FD\),)13 b Fi(167)-30 2340 y Fh(fd)p 17 2340 V 16 w(element/3)20 b Fm(\(FD\),)13 b Fi(176)-30 2390 y Fh(fd)p 17 2390 V 16 w(element)p 187 2390 V 14 w(var/3)21 b Fm(\(FD\),)13 b Fi(177)-30 2440 y Fh(fd)p 17 2440 V 16 w(exactly/3)20 b Fm(\(FD\),)13 b Fi(177)-30 2489 y Fh(fd)p 17 2489 V 16 w(has)p 99 2489 V 15 w(extra)p 224 2489 V 14 w(cstr/1)21 b Fm(\(FD\),)13 b Fi(170)-30 2539 y Fh(fd)p 17 2539 V 16 w(has)p 99 2539 V 15 w(vector/1)20 b Fm(\(FD\),)13 b Fi(170)-30 2589 y Fh(fd)p 17 2589 V 16 w(labeling/1)19 b Fm(\(FD\),)14 b Fi(179)-30 2639 y Fh(fd)p 17 2639 V 16 w(labeling/2)19 b Fm(\(FD\),)14 b Fi(179)p Fm(,)f(180)-30 2689 y Fh(fd)p 17 2689 V 16 w(labelingff/1)19 b Fm(\(FD\),)14 b Fi(179)-30 2738 y Fh(fd)p 17 2738 V 16 w(max/2)21 b Fm(\(FD\),)13 b Fi(169)-30 2788 y Fh(fd)p 17 2788 V 16 w(max)p 99 2788 V 15 w(integer)20 b Fm(\(FD\),)14 b Fi(165)p Fm(,)f(166)-30 2838 y Fh(fd)p 17 2838 V 16 w(max)p 99 2838 V 15 w(integer/1)20 b Fm(\(FD\),)13 b Fi(166)-30 2888 y Fh(fd)p 17 2888 V 16 w(maximize/2)19 b Fm(\(FD\),)14 b Fi(180)988 115 y Fh(fd)p 1035 115 V 15 w(min/2)21 b Fm(\(FD\),)13 b Fi(169)988 165 y Fh(fd)p 1035 165 V 15 w(minimize/2)20 b Fm(\(FD\),)13 b Fi(180)988 215 y Fh(fd)p 1035 215 V 15 w(not)p 1116 215 V 15 w(prime/1)21 b Fm(\(FD\),)13 b Fi(173)988 264 y Fh(fd)p 1035 264 V 15 w(only)p 1138 264 V 15 w(one/1)21 b Fm(\(FD\),)13 b Fi(175)988 314 y Fh(fd)p 1035 314 V 15 w(prime/1)21 b Fm(\(FD\),)13 b Fi(173)988 364 y Fh(fd)p 1035 364 V 15 w(relation/2)20 b Fm(\(FD\),)13 b Fi(178)988 414 y Fh(fd)p 1035 414 V 15 w(relationc/2)20 b Fm(\(FD\),)13 b Fi(178)988 464 y Fh(fd)p 1035 464 V 15 w(set)p 1116 464 V 15 w(vector)p 1263 464 V 15 w(max/1)21 b Fm(\(FD\),)13 b(165,)g Fi(167)988 513 y Fh(fd)p 1035 513 V 15 w(size/2)21 b Fm(\(FD\),)13 b Fi(169)988 563 y Fh(fd)p 1035 563 V 15 w(use)p 1116 563 V 15 w(vector/1)20 b Fm(\(FD\),)14 b Fi(170)988 613 y Fh(fd)p 1035 613 V 15 w(var/1)21 b Fm(\(FD\),)13 b Fi(168)988 663 y Fh(fd)p 1035 663 V 15 w(vector)p 1182 663 V 15 w(max/1)20 b Fm(\(FD\),)14 b(165,)f Fi(166)988 713 y Fh(fifo)21 b Fm(\(p)q(ermission\),)14 b Fi(147)988 762 y Fh(file)p 1079 762 V 15 w(exists/1)p Fm(,)e Fi(146)988 812 y Fh(file)p 1079 812 V 15 w(name)21 b Fm(\(prop)q(ert)o(y\),)14 b Fi(73)988 862 y Fh(file)p 1079 862 V 15 w(permission/2)p Fm(,)d Fi(146)988 912 y Fh(file)p 1079 912 V 15 w(property/2)p Fm(,)g Fi(147)988 962 y Fh(find)p 1079 962 V 15 w(linedit)p 1248 962 V 14 w(completion/2)p Fm(,)g Fi(163)988 1012 y Fh(findall/3)p Fm(,)h Fi(66)988 1061 y Fh(first)p 1101 1061 V 15 w(fail)21 b Fm(\(FD)13 b(option\),)g Fi(179)988 1111 y Fm(\015ag,)g Fe(se)n(e)k Fm(Prolog)c(\015ag)988 1161 y Fh(float/1)p Fm(,)f Fi(49)988 1211 y Fh(flush)p 1101 1211 V 15 w(output/0)p Fm(,)f Fi(72)988 1261 y Fh(flush)p 1101 1261 V 15 w(output/1)p Fm(,)g(68,)i Fi(72)988 1310 y Fh(for/3)p Fm(,)f Fi(114)988 1360 y Fh(force)21 b Fm(\(option\),)13 b Fi(72)988 1410 y Fh(foreign/1)20 b Fm(\(directiv)o(e\),)14 b Fi(45)p Fm(,)f Fi(183)988 1460 y Fh(foreign/2)20 b Fm(\(directiv)o(e\),)14 b Fi(45)p Fm(,)f Fi(183)988 1510 y Fh(fork)p 1079 1510 V 15 w(prolog/1)p Fm(,)f Fi(154)988 1559 y Fh(format/2)p Fm(,)g Fi(98)988 1609 y Fh(format/3)p Fm(,)g Fi(98)p Fm(,)h(105,)f(106)988 1659 y Fh(format)p 1123 1659 V 14 w(to)p 1181 1659 V 16 w(atom/3)p Fm(,)g Fi(105)988 1709 y Fh(format)p 1123 1709 V 14 w(to)p 1181 1709 V 16 w(chars/3)p Fm(,)g Fi(106)988 1759 y Fh(format)p 1123 1759 V 14 w(to)p 1181 1759 V 16 w(codes/3)p Fm(,)g Fi(106)988 1809 y Fh(from)21 b Fm(\(option\),)13 b Fi(56)988 1858 y Fh(full)21 b Fm(\(debug\),)14 b Fi(30)988 1908 y Fh(functor/3)p Fm(,)e Fi(52)988 1999 y Fh(g)p 1013 1999 V 15 w(array)21 b Fm(\(global)13 b(v)n(ar.\),)f Fi(127)988 2049 y Fh(g)p 1013 2049 V 15 w(array)p 1138 2049 V 15 w(auto)21 b Fm(\(global)12 b(v)n(ar.\),)h Fi(127)988 2099 y Fh(g)p 1013 2099 V 15 w(array)p 1138 2099 V 15 w(extend)21 b Fm(\(global)12 b(v)n(ar.\),)h Fi(127)988 2149 y Fh(g)p 1013 2149 V 15 w(array)p 1138 2149 V 15 w(size/2)p Fm(,)f Fi(128)988 2199 y Fh(g)p 1013 2199 V 15 w(assign/2)p Fm(,)g Fi(127)988 2249 y Fh(g)p 1013 2249 V 15 w(assignb/2)p Fm(,)g Fi(127)988 2298 y Fh(g)p 1013 2298 V 15 w(dec/1)p Fm(,)h Fi(129)988 2348 y Fh(g)p 1013 2348 V 15 w(dec/2)p Fm(,)g Fi(129)988 2398 y Fh(g)p 1013 2398 V 15 w(dec/3)p Fm(,)g Fi(129)988 2448 y Fh(g)p 1013 2448 V 15 w(deco/2)p Fm(,)g Fi(129)988 2498 y Fh(g)p 1013 2498 V 15 w(inc/1)p Fm(,)g Fi(129)988 2547 y Fh(g)p 1013 2547 V 15 w(inc/2)p Fm(,)g Fi(129)988 2597 y Fh(g)p 1013 2597 V 15 w(inc/3)p Fm(,)g Fi(129)988 2647 y Fh(g)p 1013 2647 V 15 w(inco/2)p Fm(,)g Fi(129)988 2697 y Fh(g)p 1013 2697 V 15 w(link/2)p Fm(,)g Fi(127)988 2747 y Fh(g)p 1013 2747 V 15 w(read/2)p Fm(,)g Fi(128)988 2797 y Fh(g)p 1013 2797 V 15 w(reset)p 1138 2797 V 15 w(bit/2)p Fm(,)f Fi(130)988 2846 y Fh(g)p 1013 2846 V 15 w(set)p 1094 2846 V 16 w(bit/2)p Fm(,)g Fi(130)988 2896 y Fh(g)p 1013 2896 V 15 w(test)p 1116 2896 V 15 w(reset)p 1241 2896 V 15 w(bit/2)p Fm(,)g Fi(130)p eop end %%Page: 212 214 TeXDict begin 212 213 bop -30 -45 a Fm(212)1690 b(INDEX)p -30 -27 1890 4 v -30 115 a Fh(g)p -5 115 14 2 v 16 w(test)p 99 115 V 15 w(set)p 180 115 V 15 w(bit/2)p Fm(,)12 b Fi(130)-30 165 y Fh(generic)p 127 165 V 15 w(var/1)20 b Fm(\(FD\),)14 b Fi(168)-30 215 y Fh(get/1)p Fm(,)f Fi(108)-30 264 y Fh(get0/1)p Fm(,)g Fi(108)-30 314 y Fh(get)p 39 314 V 16 w(byte/1)p Fm(,)f Fi(89)-30 364 y Fh(get)p 39 364 V 16 w(byte/2)p Fm(,)g(68,)h Fi(89)-30 414 y Fh(get)p 39 414 V 16 w(char/1)p Fm(,)f Fi(85)-30 464 y Fh(get)p 39 464 V 16 w(char/2)p Fm(,)g Fi(85)-30 513 y Fh(get)p 39 513 V 16 w(code/1)p Fm(,)g Fi(85)-30 563 y Fh(get)p 39 563 V 16 w(code/2)p Fm(,)g Fi(85)p Fm(,)h(86)-30 613 y Fh(get)p 39 613 V 16 w(key/1)p Fm(,)f Fi(86)-30 663 y Fh(get)p 39 663 V 16 w(key/2)p Fm(,)g Fi(86)-30 713 y Fh(get)p 39 713 V 16 w(key)p 121 713 V 15 w(no)p 180 713 V 15 w(echo/1)p Fm(,)g Fi(86)-30 762 y Fh(get)p 39 762 V 16 w(key)p 121 762 V 15 w(no)p 180 762 V 15 w(echo/2)p Fm(,)g Fi(86)-30 812 y Fh(get)p 39 812 V 16 w(linedit)p 209 812 V 14 w(prompt/1)p Fm(,)f Fi(162)-30 862 y Fh(get)p 39 862 V 16 w(print)p 165 862 V 14 w(stream/1)p Fm(,)h Fi(100)-30 912 y Fh(get)p 39 912 V 16 w(seed/1)p Fm(,)g Fi(140)-30 962 y Fh(gplc)p Fm(,)h Fi(22)p Fm(,)g(24,)g(26,)g(136)-30 1052 y Fh(half)21 b Fm(\(debug\),)14 b Fi(30)-30 1102 y Fh(halt/0)p Fm(,)f(13,)f(17,)h Fi(112)-30 1152 y Fh(halt/1)p Fm(,)g Fi(112)-30 1202 y Fh(hash)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(120)-30 1251 y Fh(hexgplc)p Fm(,)d Fi(26)-30 1301 y Fh(host)p 61 1301 V 15 w(name/1)p Fm(,)g Fi(150)-30 1351 y Fh(hostname)p 149 1351 V 15 w(address/2)p Fm(,)f Fi(161)-30 1441 y Fh(ignore)p 105 1441 V 15 w(ops)21 b Fm(\(option\),)13 b Fi(96)-30 1491 y Fh(include/1)20 b Fm(\(directiv)o(e\),)15 b Fi(44)-30 1541 y Fh(infix)p 83 1541 V 15 w(op)22 b Fm(\(prop)q(ert)o(y\),)14 b Fi(120)-30 1591 y Fh(initialization/1)19 b Fm(\(directiv)o(e\),)14 b(24,)f(25,)g Fi(45)p Fm(,)g(203)-30 1641 y Fh(input)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(73)-30 1690 y Fh(integer/1)p Fm(,)d Fi(49)-30 1740 y Fh(integer)p 127 1740 V 15 w(rounding)p 318 1740 V 14 w(function)20 b Fm(\(\015ag\),)13 b(59,)g Fi(133)-30 1790 y Fm(in)o(terpreter,)j Fe(se)n(e)h Fm(top-lev)o(el)-30 1880 y Fh(jump)k Fm(\(option\),)13 b Fi(183)p Fm(,)g(184)-30 1971 y Fh(keysort/1)p Fm(,)f Fi(125)-30 2021 y Fh(keysort/2)p Fm(,)g Fi(125)-30 2111 y Fh(largest)21 b Fm(\(FD)14 b(option\),)e Fi(179)-30 2161 y Fh(last/2)p Fm(,)h Fi(124)-30 2211 y Fh(last)p 61 2211 V 15 w(modification)20 b Fm(\(prop)q(ert)o(y\),)14 b Fi(148)-30 2260 y Fh(last)p 61 2260 V 15 w(read)p 164 2260 V 15 w(start)p 289 2260 V 15 w(line)p 392 2260 V 15 w(column/2)p Fm(,)d Fi(95)-30 2310 y Fh(leash/1)21 b Fm(\(debug\),)14 b Fi(30)p Fm(,)f(31)-30 2360 y Fh(length)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(120)-30 2410 y Fh(length/2)p Fm(,)d Fi(124)-30 2460 y Fh(line)21 b Fm(\(option\),)13 b Fi(71)p Fm(,)h(82)-30 2510 y Fh(line)p 61 2510 V 15 w(count/2)p Fm(,)e Fi(77)p Fm(,)h(78)-30 2559 y Fh(line)p 61 2559 V 15 w(position/2)p Fm(,)f Fi(77)-30 2609 y Fh(linedit)p Fm(,)g Fi(18)p Fm(,)h(86,)g(162,)g(163)-30 2659 y Fh(list/1)p Fm(,)g Fi(49)-30 2709 y Fh(list)p 61 2709 V 15 w(or)p 120 2709 V 16 w(partial)p 290 2709 V 14 w(list/1)p Fm(,)f Fi(49)-30 2759 y Fh(listing/0)p Fm(,)g Fi(138)-30 2808 y Fh(listing/1)p Fm(,)g(32,)h(99,)g Fi(138)-30 2858 y Fh(load/1)p Fm(,)g(17,)f(21,)h(23,)g Fi(137)-30 2908 y Fh(loose)21 b Fm(\(debug\),)14 b Fi(30)988 115 y Fh(lower)p 1101 115 V 15 w(upper/2)p Fm(,)e Fi(116)988 206 y Fm(MA,)i Fi(20)988 256 y Fh(make)p 1079 256 V 15 w(directory/1)p Fm(,)d Fi(144)988 306 y Fh(max)21 b Fm(\(FD)14 b(option\),)f Fi(179)988 356 y Fh(max)p 1057 356 V 15 w(arity)21 b Fm(\(\015ag\),)13 b Fi(133)988 405 y Fh(max)p 1057 405 V 15 w(atom)21 b Fm(\(\015ag\),)13 b(119,)g Fi(133)988 455 y Fh(max)p 1057 455 V 15 w(depth)21 b Fm(\(option\),)13 b Fi(97)988 505 y Fh(max)p 1057 505 V 15 w(integer)20 b Fm(\(\015ag\),)14 b Fi(133)p Fm(,)f(165)988 555 y Fh(max)p 1057 555 V 15 w(list/2)p Fm(,)f Fi(125)988 605 y Fh(max)p 1057 605 V 15 w(regret)21 b Fm(\(FD)13 b(option\),)g Fi(179)988 655 y Fh(max)p 1057 655 V 15 w(unget)21 b Fm(\(\015ag\),)13 b(88,)g(90,)g Fi(133)988 704 y Fh(member/2)p Fm(,)f Fi(121)988 754 y Fh(memberchk/2)p Fm(,)f Fi(121)988 804 y Fh(middle)21 b Fm(\(FD)13 b(option\),)g Fi(179)988 854 y Fh(min)21 b Fm(\(FD)14 b(option\),)f Fi(179)988 904 y Fh(min)p 1057 904 V 15 w(integer)20 b Fm(\(\015ag\),)14 b Fi(133)988 953 y Fh(min)p 1057 953 V 15 w(list/2)p Fm(,)e Fi(125)988 1003 y Fm(mini-assem)o(bly)m(,)f(11,)i Fi(20)p Fm(,)g(26)988 1053 y Fh(mirror)21 b Fm(\(option\),)13 b Fi(71)988 1103 y Fh(mirror)21 b Fm(\(prop)q(ert)o(y\),)14 b Fi(73)988 1153 y Fh(mode)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(73)988 1202 y Fh(most)p 1079 1202 V 15 w(constrained)k Fm(\(FD)14 b(option\),)f Fi(179)988 1252 y Fh(multifile/1)20 b Fm(\(directiv)o(e\),)14 b Fi(42)988 1344 y Fh(name/2)p Fm(,)e Fi(118)988 1393 y Fh(name)p 1079 1393 V 15 w(query)p 1204 1393 V 15 w(vars/2)p Fm(,)g Fi(55)988 1443 y Fh(name)p 1079 1443 V 15 w(singleton)p 1292 1443 V 14 w(vars/1)p Fm(,)g Fi(55)p Fm(,)h(99)988 1493 y Fh(namevars)20 b Fm(\(option\),)13 b(16,)g Fi(56)p Fm(,)g Fi(96)988 1543 y Fh(native)p 1123 1543 V 14 w(code)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(65)988 1593 y Fh(needs)p 1101 1593 V 15 w(quotes)20 b Fm(\(prop)q(ert)o(y\),)15 b Fi(121)988 1643 y Fh(needs)p 1101 1643 V 15 w(scan)21 b Fm(\(prop)q(ert)o(y\),)14 b Fi(121)988 1692 y Fh(new)p 1057 1692 V 15 w(atom/1)p Fm(,)e Fi(119)988 1742 y Fh(new)p 1057 1742 V 15 w(atom/2)p Fm(,)g Fi(119)988 1792 y Fh(new)p 1057 1792 V 15 w(atom/3)p Fm(,)g Fi(119)988 1842 y Fh(next)21 b Fm(\(option\),)13 b Fi(56)988 1892 y Fh(nl/0)p Fm(,)g Fi(88)988 1941 y Fh(nl/1)p Fm(,)g Fi(88)988 1991 y Fh(nodebug/0)20 b Fm(\(debug\),)14 b Fi(29)p Fm(,)f(32)988 2041 y Fh(non)p 1057 2041 V 15 w(fd)p 1116 2041 V 15 w(var/1)21 b Fm(\(FD\),)14 b Fi(168)988 2091 y Fh(non)p 1057 2091 V 15 w(generic)p 1226 2091 V 14 w(var/1)21 b Fm(\(FD\),)14 b Fi(168)988 2141 y Fh(none)21 b Fm(\(debug\),)14 b Fi(30)988 2190 y Fh(none)21 b Fm(\(option\),)13 b Fi(71)p Fm(,)g(82,)g Fi(183)p Fm(,)g(184)988 2240 y Fh(nonvar/1)p Fm(,)f Fi(49)988 2290 y Fh(nospy/1)20 b Fm(\(debug\),)14 b Fi(30)p Fm(,)f(32)988 2340 y Fh(nospyall/0)20 b Fm(\(debug\),)14 b Fi(30)988 2390 y Fh(notrace/0)20 b Fm(\(debug\),)14 b Fi(29)988 2440 y Fh(nth/3)p Fm(,)e Fi(124)988 2489 y Fh(number/1)p Fm(,)g Fi(49)988 2539 y Fh(number)p 1123 2539 V 14 w(atom/2)p Fm(,)h Fi(117)988 2589 y Fh(number)p 1123 2589 V 14 w(chars/2)p Fm(,)f Fi(117)988 2639 y Fh(number)p 1123 2639 V 14 w(codes/2)p Fm(,)g Fi(117)988 2689 y Fh(numbervars)20 b Fm(\(option\),)13 b(16,)g Fi(56)p Fm(,)g Fi(96)988 2738 y Fh(numbervars/1)p Fm(,)e Fi(56)p Fm(,)i(99)988 2788 y Fh(numbervars/3)p Fm(,)e Fi(56)988 2880 y Fh(once/1)p Fm(,)h Fi(113)p eop end %%Page: 213 215 TeXDict begin 213 214 bop -30 -45 a Fm(INDEX)1691 b(213)p -30 -27 1890 4 v -30 115 a Fh(op/3)21 b Fm(\(directiv)o(e\),)15 b Fi(44)-30 165 y Fh(op/3)p Fm(,)e(44,)g Fi(100)-30 215 y Fh(open/3)p Fm(,)g Fi(70)-30 264 y Fh(open/4)p Fm(,)g(67,)f Fi(70)p Fm(,)i(81,)e(82,)h(157)-30 314 y Fh(open)p 61 314 14 2 v 15 w(input)p 186 314 V 15 w(atom)p 289 314 V 15 w(stream/2)p Fm(,)f Fi(83)-30 364 y Fh(open)p 61 364 V 15 w(input)p 186 364 V 15 w(chars)p 311 364 V 15 w(stream/2)p Fm(,)f Fi(83)-30 414 y Fh(open)p 61 414 V 15 w(input)p 186 414 V 15 w(codes)p 311 414 V 15 w(stream/2)p Fm(,)g Fi(83)-30 464 y Fh(open)p 61 464 V 15 w(output)p 208 464 V 15 w(atom)p 311 464 V 15 w(stream/1)p Fm(,)g Fi(84)-30 513 y Fh(open)p 61 513 V 15 w(output)p 208 513 V 15 w(chars)p 333 513 V 14 w(stream/1)p Fm(,)h Fi(84)-30 563 y Fh(open)p 61 563 V 15 w(output)p 208 563 V 15 w(codes)p 333 563 V 14 w(stream/1)p Fm(,)g Fi(84)-30 613 y Fh(os)p 17 613 V 16 w(error)21 b Fm(\(\015ag\),)13 b Fi(134)p Fm(,)g(199)-30 663 y Fh(os)p 17 663 V 16 w(version/1)p Fm(,)e Fi(150)-30 713 y Fh(output)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(73)-30 804 y Fh(partial)p 127 804 V 15 w(list/1)p Fm(,)d Fi(49)-30 854 y Fh(peek)p 61 854 V 15 w(byte/1)p Fm(,)g Fi(90)-30 904 y Fh(peek)p 61 904 V 15 w(byte/2)p Fm(,)g Fi(90)-30 953 y Fh(peek)p 61 953 V 15 w(char/1)p Fm(,)g Fi(87)-30 1003 y Fh(peek)p 61 1003 V 15 w(char/2)p Fm(,)g Fi(87)-30 1053 y Fh(peek)p 61 1053 V 15 w(code/1)p Fm(,)g Fi(87)-30 1103 y Fh(peek)p 61 1103 V 15 w(code/2)p Fm(,)g Fi(87)-30 1153 y Fh(permission)20 b Fm(\(prop)q(ert)o(y\),)15 b Fi(148)-30 1202 y Fh(permutation/2)p Fm(,)c Fi(122)-30 1252 y Fh(phrase/2)p Fm(,)h Fi(111)-30 1302 y Fh(phrase/3)p Fm(,)g Fi(111)-30 1352 y Fh(popen/3)p Fm(,)g(67,)h Fi(153)-30 1402 y Fh(portray/1)p Fm(,)f Fi(96)p Fm(,)h(100)-30 1452 y Fh(portray)p 127 1452 V 15 w(clause/1)p Fm(,)e Fi(99)-30 1501 y Fh(portray)p 127 1501 V 15 w(clause/2)p Fm(,)g Fi(99)p Fm(,)j(138)-30 1551 y Fh(portrayed)20 b Fm(\(option\),)13 b Fi(96)-30 1601 y Fh(position)21 b Fm(\(prop)q(ert)o(y\),)14 b Fi(74)-30 1651 y Fh(postfix)p 127 1651 V 15 w(op)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(120)-30 1701 y Fh(predicate)p 171 1701 V 14 w(property/2)p Fm(,)d Fi(65)-30 1750 y Fh(prefix/2)p Fm(,)g Fi(123)-30 1800 y Fh(prefix)p 105 1800 V 15 w(op)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(120)-30 1850 y Fh(print/1)p Fm(,)d Fi(96)p Fm(,)h(98)-30 1900 y Fh(print/2)p Fm(,)f Fi(96)p Fm(,)h(100,)g(105,)g(106)-30 1950 y Fh(print)p 83 1950 V 15 w(to)p 142 1950 V 15 w(atom/2)p Fm(,)g Fi(105)-30 1999 y Fh(print)p 83 1999 V 15 w(to)p 142 1999 V 15 w(chars/2)p Fm(,)f Fi(106)-30 2049 y Fh(print)p 83 2049 V 15 w(to)p 142 2049 V 15 w(codes/2)p Fm(,)g Fi(106)-30 2099 y Fh(priority)21 b Fm(\(option\),)13 b Fi(97)-30 2149 y Fh(private)21 b Fm(\(prop)q(ert)o(y\),)14 b Fi(65)-30 2199 y Fm(Prolog)d(\015ag,)g(14,)g(36,)g(45,)f(59,)h(64,)g (88,)g(90{92,)f(94,)h(103,)137 2249 y(119,)h Fi(133)p Fm(,)h(135,)g(136,)f(165,)h(198,)g(199)-30 2298 y Fh(prolog)p 105 2298 V 15 w(copyright)20 b Fm(\(\015ag\),)13 b Fi(133)-30 2348 y Fh(prolog)p 105 2348 V 15 w(date)21 b Fm(\(\015ag\),)13 b Fi(133)-30 2398 y Fh(prolog)p 105 2398 V 15 w(file)21 b Fm(\(prop)q(ert)o(y\),)14 b Fi(65)-30 2448 y Fh(prolog)p 105 2448 V 15 w(file)p 208 2448 V 15 w(name/2)p Fm(,)e(136,)h Fi(142)-30 2498 y Fh(prolog)p 105 2498 V 15 w(line)21 b Fm(\(prop)q(ert)o(y\),)14 b Fi(65)-30 2547 y Fh(prolog)p 105 2547 V 15 w(name)21 b Fm(\(\015ag\),)13 b Fi(133)-30 2597 y Fh(prolog)p 105 2597 V 15 w(pid/1)p Fm(,)f Fi(155)-30 2647 y Fh(prolog)p 105 2647 V 15 w(version)20 b Fm(\(\015ag\),)13 b Fi(133)-30 2697 y Fh(public)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(65)-30 2747 y Fh(public/1)21 b Fm(\(directiv)o(e\),)14 b Fi(41)p Fm(,)f(61)-30 2797 y Fh(punct)21 b Fm(\(tok)o(en\),)14 b Fi(94)-30 2846 y Fh(put/1)p Fm(,)f Fi(109)-30 2896 y Fh(put)p 39 2896 V 16 w(byte/1)p Fm(,)f Fi(91)988 115 y Fh(put)p 1057 115 V 15 w(byte/2)p Fm(,)g Fi(91)988 165 y Fh(put)p 1057 165 V 15 w(char/1)p Fm(,)g Fi(88)988 215 y Fh(put)p 1057 215 V 15 w(char/2)p Fm(,)g Fi(88)988 264 y Fh(put)p 1057 264 V 15 w(code/1)p Fm(,)g Fi(88)988 314 y Fh(put)p 1057 314 V 15 w(code/2)p Fm(,)g Fi(88)988 405 y Fh(quoted)21 b Fm(\(option\),)13 b(16,)f Fi(96)988 497 y Fh(random)21 b Fm(\(FD)13 b(option\),)g Fi(179)988 547 y Fh(random/1)p Fm(,)f Fi(140)988 596 y Fh(random/3)p Fm(,)g Fi(140)988 646 y Fh(randomize/0)p Fm(,)f Fi(139)988 696 y Fh(read)21 b Fm(\(mo)q(de\),)14 b Fi(70)988 746 y Fh(read)21 b Fm(\(p)q(ermission\),)14 b Fi(147)988 796 y Fh(read/1)p Fm(,)e Fi(92)p Fm(,)h(95)988 845 y Fh(read/2)p Fm(,)f Fi(92)p Fm(,)h(95,)g(104,)g(105)988 895 y Fh(read)p 1079 895 V 15 w(atom/1)p Fm(,)f Fi(93)p Fm(,)h(95)988 945 y Fh(read)p 1079 945 V 15 w(atom/2)p Fm(,)f Fi(93)p Fm(,)h(95,)g(103)988 995 y Fh(read)p 1079 995 V 15 w(from)p 1182 995 V 15 w(atom/2)p Fm(,)f Fi(104)988 1045 y Fh(read)p 1079 1045 V 15 w(from)p 1182 1045 V 15 w(chars/2)p Fm(,)g Fi(104)988 1095 y Fh(read)p 1079 1095 V 15 w(from)p 1182 1095 V 15 w(codes/2)p Fm(,)g Fi(105)988 1144 y Fh(read)p 1079 1144 V 15 w(integer/1)p Fm(,)f Fi(93)p Fm(,)i(95)988 1194 y Fh(read)p 1079 1194 V 15 w(integer/2)p Fm(,)e Fi(93)p Fm(,)i(95,)g(103)988 1244 y Fh(read)p 1079 1244 V 15 w(number/1)p Fm(,)f Fi(93)p Fm(,)h(95)988 1294 y Fh(read)p 1079 1294 V 15 w(number/2)p Fm(,)f Fi(93)p Fm(,)h(95,)g(103)988 1344 y Fh(read)p 1079 1344 V 15 w(pl)p 1138 1344 V 15 w(state)p 1263 1344 V 15 w(file/1)p Fm(,)f Fi(136)988 1393 y Fh(read)p 1079 1393 V 15 w(term/2)p Fm(,)g Fi(92)p Fm(,)h(95)988 1443 y Fh(read)p 1079 1443 V 15 w(term/3)p Fm(,)f Fi(92)p Fm(,)h(95,)g(103{105)988 1493 y Fh(read)p 1079 1493 V 15 w(term)p 1182 1493 V 15 w(from)p 1285 1493 V 15 w(atom/3)p Fm(,)f(14,)h(92,)f Fi(104)988 1543 y Fh(read)p 1079 1543 V 15 w(term)p 1182 1543 V 15 w(from)p 1285 1543 V 15 w(chars/3)p Fm(,)g Fi(104)988 1593 y Fh(read)p 1079 1593 V 15 w(term)p 1182 1593 V 15 w(from)p 1285 1593 V 15 w(codes/3)p Fm(,)g Fi(105)988 1643 y Fh(read)p 1079 1643 V 15 w(token/1)p Fm(,)g Fi(94)p Fm(,)h(95)988 1692 y Fh(read)p 1079 1692 V 15 w(token/2)p Fm(,)f Fi(94)p Fm(,)h(95,)g (103{105)988 1742 y Fh(read)p 1079 1742 V 15 w(token)p 1204 1742 V 15 w(from)p 1307 1742 V 14 w(atom/2)p Fm(,)g Fi(104)988 1792 y Fh(read)p 1079 1792 V 15 w(token)p 1204 1792 V 15 w(from)p 1307 1792 V 14 w(chars/2)p Fm(,)f Fi(104)988 1842 y Fh(read)p 1079 1842 V 15 w(token)p 1204 1842 V 15 w(from)p 1307 1842 V 14 w(codes/2)p Fm(,)g Fi(105)988 1892 y Fh(real)p 1079 1892 V 15 w(file)p 1182 1892 V 15 w(name)21 b Fm(\(prop)q(ert)o(y\),)14 b Fi(147)988 1941 y Fh(real)p 1079 1941 V 15 w(time/1)p Fm(,)e Fi(139)988 1991 y Fh(regular)20 b Fm(\(p)q(ermission\),)14 b Fi(147)988 2041 y Fh(remove)p 1123 2041 V 14 w(stream)p 1269 2041 V 15 w(mirror/2)p Fm(,)e(68,)g(80,)h Fi(80)988 2091 y Fh(rename)p 1123 2091 V 14 w(file/2)p Fm(,)g Fi(145)988 2141 y Fh(reorder)20 b Fm(\(FD)14 b(option\),)f Fi(179)988 2190 y Fh(repeat/0)p Fm(,)f Fi(113)988 2240 y Fh(reposition)20 b Fm(\(option\),)13 b Fi(71)988 2290 y Fh(reposition)20 b Fm(\(prop)q(ert)o(y\),)14 b Fi(73)988 2340 y Fh(reset)21 b Fm(\(option\),)13 b Fi(71)p Fm(,)g(81)988 2390 y Fh(retract/1)p Fm(,)f Fi(62)988 2440 y Fh(retractall/1)p Fm(,)f Fi(62)988 2489 y Fh(return)21 b Fm(\(option\),)13 b Fi(183)p Fm(,)f(184)988 2539 y Fh(reverse/2)p Fm(,)g Fi(122)988 2630 y Fh(search)21 b Fm(\(p)q(ermission\),)13 b Fi(147)988 2680 y Fh(see/1)p Fm(,)f Fi(107)988 2730 y Fh(seeing/1)p Fm(,)g Fi(108)988 2780 y Fh(seek/4)p Fm(,)g Fi(75)988 2830 y Fh(seen/0)p Fm(,)g Fi(108)988 2880 y Fh(select/3)p Fm(,)g Fi(122)p eop end %%Page: 214 216 TeXDict begin 214 215 bop -30 -45 a Fm(214)1690 b(INDEX)p -30 -27 1890 4 v -30 115 a Fh(select/5)p Fm(,)12 b(68,)h Fi(156)p Fm(,)g(159,)g(161)-30 165 y Fh(send)p 61 165 14 2 v 15 w(signal/2)p Fm(,)f Fi(156)-30 215 y Fh(set)p 39 215 V 16 w(bip)p 121 215 V 15 w(name/2)p Fm(,)g(37,)h Fi(135)p Fm(,)g(196)-30 264 y Fh(set)p 39 264 V 16 w(input/1)p Fm(,)e(68,)i Fi(69)-30 314 y Fh(set)p 39 314 V 16 w(linedit)p 209 314 V 14 w(prompt/1)p Fm(,)e Fi(162)-30 364 y Fh(set)p 39 364 V 16 w(output/1)p Fm(,)g(68,)i Fi(70)-30 414 y Fh(set)p 39 414 V 16 w(prolog)p 187 414 V 14 w(flag/2)21 b Fm(\(directiv)o(e\),)14 b Fi(45)-30 464 y Fh(set)p 39 464 V 16 w(prolog)p 187 464 V 14 w(flag/2)p Fm(,)e(45,)h Fi(133)-30 513 y Fh(set)p 39 513 V 16 w(seed/1)p Fm(,)f Fi(139)-30 563 y Fh(set)p 39 563 V 16 w(stream)p 187 563 V 14 w(buffering/2)p Fm(,)f(68,)i Fi(82)p Fm(,)g(157,)g(158)-30 613 y Fh(set)p 39 613 V 16 w(stream)p 187 613 V 14 w(eof)p 267 613 V 15 w(action/2)p Fm(,)f Fi(81)-30 663 y Fh(set)p 39 663 V 16 w(stream)p 187 663 V 14 w(line)p 289 663 V 15 w(column/3)p Fm(,)g Fi(78)-30 713 y Fh(set)p 39 713 V 16 w(stream)p 187 713 V 14 w(position/2)p Fm(,)f(68,)i Fi(75)-30 762 y Fh(set)p 39 762 V 16 w(stream)p 187 762 V 14 w(type/2)p Fm(,)f Fi(81)p Fm(,)h(158)-30 812 y Fh(setarg/3)p Fm(,)f Fi(54)-30 862 y Fh(setarg/4)p Fm(,)g Fi(54)-30 912 y Fh(setof/3)p Fm(,)g Fi(66)-30 962 y Fh(shell/0)p Fm(,)g Fi(151)-30 1012 y Fh(shell/1)p Fm(,)g Fi(151)-30 1061 y Fh(shell/2)p Fm(,)g Fi(151)-30 1111 y Fh(singleton)p 171 1111 V 14 w(warning)21 b Fm(\(\015ag\),)13 b Fi(134)p Fm(,)g(136)-30 1161 y Fh(singletons)20 b Fm(\(option\),)13 b(55,)g(56,)g Fi(92)-30 1211 y Fh(size)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(148)-30 1261 y Fh(skip/1)p Fm(,)e Fi(108)-30 1310 y Fh(sleep/1)p Fm(,)f Fi(156)-30 1360 y Fh(smallest)21 b Fm(\(FD)13 b(option\),)g Fi(179)-30 1410 y Fh(socket)21 b Fm(\(p)q(ermission\),)14 b Fi(147)-30 1460 y Fh(socket/2)p Fm(,)e Fi(158)-30 1510 y Fh(socket)p 105 1510 V 15 w(accept/3)p Fm(,)g Fi(160)-30 1559 y Fh(socket)p 105 1559 V 15 w(accept/4)p Fm(,)g Fi(160)-30 1609 y Fh(socket)p 105 1609 V 15 w(bind/2)p Fm(,)g Fi(159)-30 1659 y Fh(socket)p 105 1659 V 15 w(close/1)p Fm(,)g Fi(158)-30 1709 y Fh(socket)p 105 1709 V 15 w(connect/4)p Fm(,)f(67,)i(158,)g Fi(159)-30 1759 y Fh(socket)p 105 1759 V 15 w(listen/2)p Fm(,)f Fi(160)-30 1809 y Fh(sort/1)p Fm(,)h Fi(125)-30 1858 y Fh(sort/2)p Fm(,)g Fi(125)-30 1908 y Fh(sort0/1)p Fm(,)f Fi(125)-30 1958 y Fh(sort0/2)p Fm(,)g Fi(125)-30 2008 y Fh(space)p 83 2008 V 15 w(args)21 b Fm(\(option\),)13 b Fi(96)-30 2058 y Fh(spawn/2)p Fm(,)f Fi(152)-30 2107 y Fh(spawn/3)p Fm(,)g Fi(152)-30 2157 y Fh(spy/1)21 b Fm(\(debug\),)14 b Fi(30)p Fm(,)f(32)-30 2207 y Fh(spypoint)p 149 2207 V 15 w(condition/3)19 b Fm(\(debug\),)14 b Fi(30)p Fm(,)f(32)-30 2257 y Fh(sr)p 17 2257 V 16 w(change)p 165 2257 V 14 w(options/2)p Fm(,)f Fi(164)-30 2307 y Fh(sr)p 17 2307 V 16 w(close/1)p Fm(,)g Fi(164)-30 2356 y Fh(sr)p 17 2356 V 16 w(current)p 187 2356 V 14 w(descriptor/1)p Fm(,)f Fi(164)-30 2406 y Fh(sr)p 17 2406 V 16 w(error)p 143 2406 V 14 w(from)p 245 2406 V 15 w(exception/2)p Fm(,)g Fi(164)-30 2456 y Fh(sr)p 17 2456 V 16 w(get)p 99 2456 V 15 w(error)p 224 2456 V 14 w(counters/3)p Fm(,)h Fi(164)-30 2506 y Fh(sr)p 17 2506 V 16 w(get)p 99 2506 V 15 w(file)p 202 2506 V 15 w(name/2)p Fm(,)g Fi(164)-30 2556 y Fh(sr)p 17 2556 V 16 w(get)p 99 2556 V 15 w(include)p 268 2556 V 14 w(list/2)p Fm(,)g Fi(164)-30 2606 y Fh(sr)p 17 2606 V 16 w(get)p 99 2606 V 15 w(include)p 268 2606 V 14 w(stream)p 414 2606 V 15 w(list/2)p Fm(,)g Fi(164)-30 2655 y Fh(sr)p 17 2655 V 16 w(get)p 99 2655 V 15 w(module/3)p Fm(,)g Fi(164)-30 2705 y Fh(sr)p 17 2705 V 16 w(get)p 99 2705 V 15 w(position/3)p Fm(,)f Fi(164)-30 2755 y Fh(sr)p 17 2755 V 16 w(get)p 99 2755 V 15 w(size)p 202 2755 V 15 w(counters/3)p Fm(,)g Fi(164)-30 2805 y Fh(sr)p 17 2805 V 16 w(get)p 99 2805 V 15 w(stream/2)p Fm(,)h Fi(164)-30 2855 y Fh(sr)p 17 2855 V 16 w(open/3)p Fm(,)g Fi(164)-30 2904 y Fh(sr)p 17 2904 V 16 w(read)p 121 2904 V 15 w(term/4)p Fm(,)g Fi(164)988 115 y Fh(sr)p 1035 115 V 15 w(set)p 1116 115 V 15 w(error)p 1241 115 V 15 w(counters/3)p Fm(,)f Fi(164)988 165 y Fh(sr)p 1035 165 V 15 w(write)p 1160 165 V 15 w(error/2)p Fm(,)h Fi(164)988 215 y Fh(sr)p 1035 215 V 15 w(write)p 1160 215 V 15 w(error/4)p Fm(,)g Fi(164)988 264 y Fh(sr)p 1035 264 V 15 w(write)p 1160 264 V 15 w(error/6)p Fm(,)g Fi(164)988 314 y Fh(sr)p 1035 314 V 15 w(write)p 1160 314 V 15 w(message/4)p Fm(,)f Fi(164)988 364 y Fh(sr)p 1035 364 V 15 w(write)p 1160 364 V 15 w(message/6)p Fm(,)g Fi(164)988 414 y Fh(sr)p 1035 414 V 15 w(write)p 1160 414 V 15 w(message/8)p Fm(,)g Fi(164)988 464 y Fh(standard)20 b Fm(\(FD)14 b(option\),)f Fi(179)988 513 y Fh(static)21 b Fm(\(prop)q(ert)o(y\),)14 b Fi(65)988 563 y Fh(statistics/0)p Fm(,)d Fi(138)988 613 y Fh(statistics/2)p Fm(,)g Fi(138)988 663 y Fh(stop/0)p Fm(,)h Fi(112)988 713 y Fh(stream)p 1123 713 V 14 w(line)p 1225 713 V 15 w(column/3)p Fm(,)g Fi(77)988 762 y Fh(stream)p 1123 762 V 14 w(position/2)p Fm(,)g Fi(74)p Fm(,)h(75)988 812 y Fh(stream)p 1123 812 V 14 w(property/2)p Fm(,)f Fi(73)p Fm(,)h(74,)g(75,)g(79,)f(81)988 862 y Fh(strict)p 1123 862 V 14 w(iso)22 b Fm(\(\015ag\),)13 b(36,)g(64,)g Fi(134)988 912 y Fh(string)21 b Fm(\(tok)o(en\),)13 b Fi(94)988 962 y Fh(sub)p 1057 962 V 15 w(atom/5)p Fm(,)f Fi(115)988 1012 y Fh(sublist/2)p Fm(,)g Fi(123)988 1061 y Fh(suffix/2)p Fm(,)g Fi(123)988 1111 y Fh(sum)p 1057 1111 V 15 w(list/2)p Fm(,)g Fi(125)988 1161 y Fh(syntax)p 1123 1161 V 14 w(error)21 b Fm(\(\015ag\),)13 b(92,)g Fi(134)p Fm(,)g(198)988 1211 y Fh(syntax)p 1123 1211 V 14 w(error)21 b Fm(\(option\),)13 b Fi(92)988 1261 y Fh(syntax)p 1123 1261 V 14 w(error)p 1247 1261 V 15 w(info/4)p Fm(,)f Fi(95)p Fm(,)h(198)988 1310 y Fh(system/1)p Fm(,)f Fi(152)988 1360 y Fh(system/2)p Fm(,)g Fi(152)988 1410 y Fh(system)p 1123 1410 V 14 w(time/1)p Fm(,)h Fi(139)988 1501 y Fh(tab/1)p Fm(,)f Fi(109)988 1551 y Fh(tell/1)p Fm(,)g Fi(107)988 1601 y Fh(telling/1)p Fm(,)g Fi(108)988 1651 y Fh(temporary)p 1189 1651 V 14 w(file/3)p Fm(,)g Fi(149)988 1701 y Fh(temporary)p 1189 1701 V 14 w(name/2)p Fm(,)g Fi(148)988 1750 y Fh(term)p 1079 1750 V 15 w(ref/2)p Fm(,)g Fi(57)988 1800 y Fh(text)21 b Fm(\(option\),)13 b Fi(70)p Fm(,)g(81)988 1850 y Fh(throw/1)p Fm(,)f(29,)h(37,)g Fi(47)p Fm(,)g(199)988 1900 y Fh(tight)21 b Fm(\(debug\),)14 b Fi(30)988 1950 y Fh(told/0)p Fm(,)e Fi(108)988 1999 y Fm(top-lev)o(el,)h Fi(13)p Fm(,)g(18,)g(23,)g(25,)g(112,)f(162,)h (203)988 2049 y Fh(top)p 1057 2049 V 15 w(level/0)p Fm(,)f(13,)h Fi(112)988 2099 y Fh(trace/0)20 b Fm(\(debug\),)14 b(17,)f Fi(29)988 2149 y Fh(true/0)p Fm(,)f Fi(46)988 2199 y Fh(type)21 b Fm(\(option\),)13 b Fi(70)988 2249 y Fh(type)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(73)p Fm(,)e Fi(147)988 2340 y Fh(unget)p 1101 2340 V 15 w(byte/1)p Fm(,)f Fi(90)988 2390 y Fh(unget)p 1101 2390 V 15 w(byte/2)p Fm(,)g Fi(90)988 2440 y Fh(unget)p 1101 2440 V 15 w(char/1)p Fm(,)g Fi(88)988 2489 y Fh(unget)p 1101 2489 V 15 w(char/2)p Fm(,)g Fi(88)988 2539 y Fh(unget)p 1101 2539 V 15 w(code/1)p Fm(,)g Fi(88)988 2589 y Fh(unget)p 1101 2589 V 15 w(code/2)p Fm(,)g Fi(88)988 2639 y Fh(unify)p 1101 2639 V 15 w(with)p 1204 2639 V 15 w(occurs)p 1351 2639 V 14 w(check/2)p Fm(,)g Fi(50)988 2689 y Fh(unknown)20 b Fm(\(\015ag\),)14 b Fi(134)988 2738 y Fh(unknown)20 b Fm(\(p)q(ermission\),)14 b Fi(147)988 2788 y Fh(unlink/1)p Fm(,)e Fi(146)988 2838 y Fh(user)21 b Fm(\(prop)q(ert)o(y\),)15 b Fi(65)988 2888 y Fh(user)p Fm(,)e Fi(107)p Fm(,)g(108,)f(136,)h(141,)f(142)p eop end %%Page: 215 217 TeXDict begin 215 216 bop -30 -45 a Fm(INDEX)1691 b(215)p -30 -27 1890 4 v -30 115 a Fh(user)p 61 115 14 2 v 15 w(input)p Fm(,)13 b Fi(68)p Fm(,)g(72,)g(107,)f(108)-30 165 y Fh(user)p 61 165 V 15 w(output)p Fm(,)g Fi(68)p Fm(,)i(72,)e(107,)h(108)-30 215 y Fh(user)p 61 215 V 15 w(time/1)p Fm(,)f Fi(139)-30 306 y Fh(value)p 83 306 V 15 w(method)21 b Fm(\(FD)13 b(option\),)g Fi(179)-30 356 y Fh(var)22 b Fm(\(tok)o(en\),)13 b Fi(94)-30 405 y Fh(var/1)p Fm(,)g Fi(49)-30 455 y Fh(variable)p 149 455 V 15 w(method)20 b Fm(\(FD)14 b(option\),)f Fi(179)-30 505 y Fh(variable)p 149 505 V 15 w(names)20 b Fm(\(option\),)13 b(55,)g(56,)g Fi(92)-30 555 y Fh(variables)20 b Fm(\(option\),)13 b Fi(92)-30 605 y Fh(vector)p 105 605 V 15 w(max)21 b Fm(\(FD\),)14 b Fi(165)p Fm(,)f(167,)f(173)-30 696 y Fh(wait/2)p Fm(,)h Fi(155)-30 746 y Fm(W)-5 b(AM,)14 b Fi(11)p Fm(,)f(20,)g(21,)g(32)-30 796 y Fh(wam)p 39 796 V 16 w(debug/0)20 b Fm(\(debug\),)14 b Fi(29)p Fm(,)f(32)-30 845 y Fh(warning)21 b Fm(\(option\),)13 b Fi(92)-30 895 y Fm(W)m(arren)h(Abstract)h(Mac)o(hine,)f Fe(se)n(e)j Fm(W)-5 b(AM)-30 945 y Fh(working)p 127 945 V 15 w(directory/1)p Fm(,)11 b Fi(144)-30 995 y Fh(write)21 b Fm(\(mo)q(de\),)14 b Fi(70)-30 1045 y Fh(write)21 b Fm(\(p)q(ermission\),)14 b Fi(147)-30 1095 y Fh(write/1)p Fm(,)e Fi(96)p Fm(,)h(98)-30 1144 y Fh(write/2)p Fm(,)f Fi(96)p Fm(,)h(105,)g(106)-30 1194 y Fh(write)p 83 1194 V 15 w(canonical/1)p Fm(,)e Fi(96)p Fm(,)i(98)-30 1244 y Fh(write)p 83 1244 V 15 w(canonical/2)p Fm(,)e Fi(96)p Fm(,)i(105,)g(106)-30 1294 y Fh(write)p 83 1294 V 15 w(canonical)p 296 1294 V 14 w(to)p 354 1294 V 15 w(atom/2)p Fm(,)f Fi(105)-30 1344 y Fh(write)p 83 1344 V 15 w(canonical)p 296 1344 V 14 w(to)p 354 1344 V 15 w(chars/2)p Fm(,)g Fi(106)-30 1393 y Fh(write)p 83 1393 V 15 w(canonical)p 296 1393 V 14 w(to)p 354 1393 V 15 w(codes/2)p Fm(,)g Fi(106)-30 1443 y Fh(write)p 83 1443 V 15 w(pl)p 142 1443 V 15 w(state)p 267 1443 V 15 w(file/1)p Fm(,)g(24,)h Fi(136)-30 1493 y Fh(write)p 83 1493 V 15 w(term/2)p Fm(,)f Fi(96)-30 1543 y Fh(write)p 83 1543 V 15 w(term/3)p Fm(,)g(16,)h(31,)g Fi(96)p Fm(,)g(105,)g(106)-30 1593 y Fh(write)p 83 1593 V 15 w(term)p 186 1593 V 15 w(to)p 245 1593 V 15 w(atom/3)p Fm(,)f Fi(105)-30 1643 y Fh(write)p 83 1643 V 15 w(term)p 186 1643 V 15 w(to)p 245 1643 V 15 w(chars/3)p Fm(,)g Fi(106)-30 1692 y Fh(write)p 83 1692 V 15 w(term)p 186 1692 V 15 w(to)p 245 1692 V 15 w(codes/3)p Fm(,)g Fi(106)-30 1742 y Fh(write)p 83 1742 V 15 w(to)p 142 1742 V 15 w(atom/2)p Fm(,)h Fi(105)-30 1792 y Fh(write)p 83 1792 V 15 w(to)p 142 1792 V 15 w(chars/2)p Fm(,)f Fi(106)-30 1842 y Fh(write)p 83 1842 V 15 w(to)p 142 1842 V 15 w(codes/2)p Fm(,)g Fi(106)-30 1892 y Fh(writeq/1)p Fm(,)g Fi(96)p Fm(,)h(98)-30 1941 y Fh(writeq/2)p Fm(,)f Fi(96)p Fm(,)h(105,)g(106,)g(191)-30 1991 y Fh(writeq)p 105 1991 V 15 w(to)p 164 1991 V 15 w(atom/2)p Fm(,)f Fi(105)-30 2041 y Fh(writeq)p 105 2041 V 15 w(to)p 164 2041 V 15 w(chars/2)p Fm(,)g Fi(106)-30 2091 y Fh(writeq)p 105 2091 V 15 w(to)p 164 2091 V 15 w(codes/2)p Fm(,)g Fi(106)p eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF ./gprolog-1.3.0/doc/version_no.tex0000644004425400513100000000000610547152502015436 0ustar diazloco1.3.0 ./gprolog-1.3.0/doc/the-index.tex0000644004425400513100000000001410547152502015141 0ustar diazloco\printindex ./gprolog-1.3.0/doc/c-interface.tex0000644004425400513100000016757510547152502015466 0ustar diazloco\newpage \section{Interfacing Prolog and C} \label{Interfacing-Prolog-and-C} %HEVEA\cutdef[1]{subsection} \subsection{Calling C from Prolog} \label{Calling-C-from-Prolog} \subsubsection{Introduction} This interface allows a Prolog predicate to call a C function. Here are some features of this facility: \begin{itemize} \item implicit Prolog $\leftrightarrow$ C data conversions for simple types. \item functions to handle complex types. \item error detection depending on the type of the argument. \item different kinds of arguments: input, output or input/output. \item possibility to write non-deterministic code. \end{itemize} This interface can then be used to write both simple and complex C routines. A simple routine uses either input or output arguments which type is simple. In that case the user does not need any knowledge of Prolog data structures since all Prolog $\leftrightarrow$ C data conversions are implicitly achieved. To manipulate complex terms (lists, structures) a set of functions is provided. Finally it is also possible to write non-deterministic C code. \subsubsection{\texttt{foreign/2} directive} \label{foreign/2-directive} \AddDiD{foreign/2} \AddDiD{foreign/1} \texttt{foreign/2} directive \RefSP{foreign/2} declares a C function interface. The general form is \texttt{foreign(Template, Options)} which defines an interface predicate whose prototype is \texttt{Template} according to the options given by \texttt{Options}. \texttt{Template} is a callable term specifying the type/mode of each argument of the associated Prolog predicate. \SPart{Foreign options}: \texttt{Options} is a list of foreign options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are: \begin{itemize} \item \IdxPOD[fct\_name]{fct\_name(F)}: \texttt{F} is an atom representing the name of the C function to call. By default the name of the C function is the same as the principal functor of \texttt{Template}. In any case, the atom associated with the name of the function must conforms to the syntax of C identifiers. \item \IdxPOD[return]{return(boolean}/\texttt{none}/\texttt{jump)}: specifies the value returned by the C function: \begin{itemize} \item \IdxPOD{boolean}: the type of the function is \texttt{Bool} (returns \texttt{TRUE} on success, \texttt{FALSE} otherwise). \item \IdxPOD{none}: the type of the function is \texttt{void} (no returned value). \item \IdxPOD{jump}: the type of the function is \texttt{void(*)()} (returns the address of a Prolog code to execute). \end{itemize} The default value is \texttt{boolean}. \item \IdxPOD[bip\_name]{bip\_name(Name, Arity)}: initializes the error context with \texttt{Name} and \texttt{Arity}. If an error occurs this information is used to indicate from which predicate the error occurred \RefSP{General-format-and-error-context}. It is also possible to prevent the initialization of the error context using \texttt{bip\_name(none)}. By default \texttt{Name} and \texttt{Arity} are set to the functor and arity of \texttt{Template}. \item \IdxPOD[choice\_size]{choice\_size(N)}: this option specifies that the function implements a non-deterministic code. \texttt{N} is an integer specifying the size needed by the non-deterministic C function. This facility is explained later \RefSP{Writing-non-deterministic-C-code}. By default a foreign function is deterministic. \end{itemize} \texttt{foreign(Template)} is equivalent to \texttt{foreign(Template, [])}. \SPart{Foreign modes and types}: each argument of \texttt{Template} specifies the foreign mode and type of the corresponding argument. This information is used to check the type of effective arguments at run-time and to perform Prolog $\leftrightarrow$ C data conversions. Each argument of \texttt{Template} is formed with a mode symbol followed by a type name. Possible foreign modes are: \begin{itemize} \item \texttt{+}: input argument. \item \texttt{-}: output argument. \item \texttt{?}: input/output argument. \end{itemize} Possible foreign types are: \begin{tabular}{|l|l|l|l|} \hline Foreign type & Prolog type & C type & Description of the C type \\ \hline\hline \texttt{integer} & integer & \texttt{long} & value of the integer \\ \hline \texttt{positive} & positive integer & \texttt{long} & value of the integer \\ \hline \texttt{float} & floating point number & \texttt{double} & value of the floating point number \\ \hline \texttt{number} & number & \texttt{double} & value of the number \\ \hline \texttt{atom} & atom & \texttt{int} & internal key of the atom \\ \hline \texttt{boolean} & boolean & \texttt{int} & value of the boolean (0=\texttt{false}, 1=\texttt{true}) \\ \hline \texttt{char} & character & \texttt{int} & value of (the code of) the character \\ \hline \texttt{code} & character code & \texttt{int} & value of the character-code \\ \hline \texttt{byte} & byte & \texttt{int} & value of the byte \\ \hline \texttt{in\_char} & in-character & \texttt{int} & value of the character or \texttt{-1} for end-of-file \\ \hline \texttt{in\_code} & in-character code & \texttt{int} & value of the character-code or \texttt{-1} for end-of-file \\ \hline \texttt{in\_byte} & in-byte & \texttt{int} & value of the byte or \texttt{-1} for the end-of-file \\ \hline \texttt{string} & atom & \texttt{char *} & C string containing the name of the atom \\ \hline \texttt{chars} & character list & \texttt{char *} & C string containing the characters of the list \\ \hline \texttt{codes} & character-code list & \texttt{char *} & C string containing the characters of the list \\ \hline \texttt{term} & Prolog term & \texttt{PlTerm} & generic Prolog term \\ \hline \end{tabular} \SPart{Simple foreign type}: a simple type is any foreign type listed in the above tabled except \texttt{term}. A simple foreign type is an atomic term (character and character-code lists are in fact lists of constants). Each simple foreign type is converted to/from a C type to simplify the writing of the C function. \SPart{Complex foreign type}: type foreign type \texttt{term} refers to any Prolog term (e.g. lists, structures\ldots). When such an type is specified the argument is passed to the C function as a \texttt{PlTerm} (GNU Prolog C type equivalent to a \texttt{long}). Several functions are provided to manipulate \texttt{PlTerm} variables \RefSP{Manipulating-Prolog-terms}. Since the original term is passed to the function it is possible to read its value or to unify it. So the meaning of the mode symbol is less significant. For this reason it is possible to omit the mode symbol. In that case \texttt{term} is equivalent to \texttt{+term}. \subsubsection{The C function} The C code is written in a C file which must first include the GNU Prolog header file called \texttt{gprolog.h}. This file contains all GNU Prolog C definitions (constants, types, prototypes,\ldots). The type returned by a C function depends on the value of the \IdxPO{return} foreign option \RefSP{foreign/2-directive}. If it is \IdxPO{boolean} then the C function is of type \texttt{Bool} and shall return \texttt{TRUE} in case of success and \texttt{FALSE} otherwise. If the \texttt{return} option is \IdxPO{none} the C function is of type \texttt{void}. Finally if it is \IdxPO{jump}, the function shall return the address of a Prolog predicate and, at the exit of the function, the control is given to that predicate. The type of the arguments of the C function depends on the mode and type declaration specified in \texttt{Template} for the corresponding argument as explained in the following sections. \subsubsection{Input arguments} \label{Input-arguments} An input argument is tested at run-time to check if its type conforms to the foreign type and then it is passed to the C function. The type of the associated C argument is given by the above table \RefSP{foreign/2-directive}. For instance, the effective argument \texttt{Arg} associated with \texttt{+positive} foreign declaration is submitted to the following process: \begin{itemize} \item if \texttt{Arg} is a variable an \texttt{instantiation\_error} is raised. \item if \texttt{Arg} is neither a variable nor an integer a \texttt{type\_error(integer, Arg)} is raised. \item if \texttt{Arg} is an integer $<$ 0 a \texttt{domain\_error(not\_less\_than\_zero, Arg)} is raised. \item otherwise the value of \texttt{Arg} is passed to the C is passed to the C function as an integer (\texttt{long}). \end{itemize} When \texttt{+string} is specified the string passed to the function is the internal string of the corresponding atom and should not be modified. When \texttt{+term} is specified the term passed to the function is the original Prolog term. It can be read and/or unified. It is also the case when \texttt{term} is specified without any mode symbol. \subsubsection{Output arguments} \label{Output-arguments} An output argument is tested at run-time to check if its type conforms to the foreign type and it is unified with the value set by the C function. The type of the associated C argument is a pointer to the type given by the above table \RefSP{foreign/2-directive}. For instance, the effective argument \texttt{Arg} associated with \texttt{-positive} foreign declaration is handled as follows: \begin{itemize} \item if \texttt{Arg} is neither a variable nor an integer a \texttt{type\_error(integer, Arg)} is raised. \item if \texttt{Arg} is an integer $<$ 0 a \texttt{domain\_error(not\_less\_than\_zero, Arg)} is raised. \item otherwise a pointer to an integer (\texttt{long} \texttt{*}) is passed to the C function. If the function returns \texttt{TRUE} the integer stored at this location is unified with \texttt{Arg}. \end{itemize} When \texttt{-term} is specified, the function must construct a term into the its corresponding argument (which is of type \texttt{PlTerm *}). At the exit of the function this term will be unified with the actual predicate argument. \subsubsection{Input/output arguments} \label{Input/output-arguments} Basically an input/output argument is treated as in input argument if it is not a variable, as an output argument otherwise. The type of the associated C argument is a pointer to a \texttt{FIOArg} (GNU Prolog C type) defined as follows: \begin{Indentation} \begin{verbatim} typedef struct { Bool is_var; Bool unify; union { long l; char *s; double d; }value; }FIOArg; \end{verbatim} \end{Indentation} The field \texttt{is\_var} is set to \texttt{TRUE} if the argument is a variable and \texttt{FALSE} otherwise. This value can be tested by the C function to determine which treatment to perform. The field \texttt{unify} controls whether the effective argument must be unified at the exit of the C function. Initially \texttt{unify} is set to the same value as \texttt{is\_var} (i.e. a variable argument will be unified while a non-variable argument will not) but it can be modified by the C function. The field \texttt{value} stores the value of the argument. It is declared as a C \texttt{union} since there are several kinds of value types. The field \texttt{s} is used for C strings, \texttt{d} for C doubles and \texttt{l} otherwise (\texttt{int}, \texttt{long}, \texttt{PlTerm}). if \texttt{is\_var} is \texttt{FALSE} then \texttt{value} contains the input value of the argument with the same conventions as for input arguments \RefSP{Input-arguments}. At the exit of the function, if unify is \texttt{TRUE} \texttt{value} must contain the value to unify with the same conventions as for output arguments \RefSP{Output-arguments}. For instance, the effective argument \texttt{Arg} associated with \texttt{?positive} foreign declaration is handled as follows: \begin{itemize} \item if \texttt{Arg} is a variable \texttt{is\_var} and \texttt{unify} are set to \texttt{TRUE} else to \texttt{FALSE} and its value is copied in \texttt{value.l}. \item if \texttt{Arg} is neither a variable nor an integer a \texttt{type\_error(integer, Arg)} is raised. \item if \texttt{Arg} is an integer $<$ 0 a \texttt{domain\_error(not\_less\_than\_zero, Arg)} is raised. \item otherwise a pointer to the \texttt{FIOArg} (\texttt{FIOArg} \texttt{*}) is passed to the C function. If the function returns \texttt{TRUE} and if \texttt{unify} is TRUE the value stored in \texttt{value.l} is unified with \texttt{Arg}. \end{itemize} \subsubsection{Writing non-deterministic C code} \label{Writing-non-deterministic-C-code} The interface allows the user to write non-deterministic C code. When a C function is non-deterministic, a choice-point is created for this function. When a failure occurs, if all more recent non-deterministic code are finished, the function is re-invoked. It is then important to inform Prolog when there is no more solution (i.e. no more choice) for a non-deterministic code. So, when no more choices remains the function must remove the choice-point. The interface increments a counter each time the function is re-invoked. At the first call this counter is equal to 0. This information allows the function to detect its first call. When writing non-deterministic code, it is often useful to record data between consecutive re-invocations of the function. The interface maintains a buffer to record such an information. The size of this buffer is given by \IdxPO[choice\_size]{choice\_size(N)} when using \texttt{foreign/2} \RefSP{foreign/2-directive}. This size is the number of (consecutive) \texttt{long}\emph{s} needed by the C function. Inside the function it is possible to call the following functions/macros: \begin{Indentation} \begin{verbatim} void Get_Choice_Counter(void) TYPE Get_Choice_Buffer (TYPE) void No_More_Choice (void) \end{verbatim} \end{Indentation} The function \texttt{Get\_Choice\_Counter()} returns the value of the invocation counter (0 at the first call). The macro \texttt{Get\_Choice\_Buffer(\Param{TYPE})} returns a pointer to the buffer (casted to \Param{TYPE}). The function \texttt{No\_More\_Choice()} deletes the choice point associated with the function. \subsubsection{Example: input and output arguments} All examples presented here can be found in the \texttt{ExamplesC} sub-directory of the distribution, in the files \texttt{examp.pl} (Prolog part) and \texttt{examp\_c.c} (C part). Let us define a predicate \texttt{first\_occurrence(A, C, P)} which unifies \texttt{P} with the position (from 0) of the first occurrence of the character \texttt{C} in the atom \texttt{A}. The predicate must fail if \texttt{C} does not appear in \texttt{A}. In the prolog file \texttt{examp.pl}: \OneLine{:- foreign(first\_occurrence(+string, +char, -positive)).} In the C file \texttt{examp\_c.c}: \begin{Indentation} \begin{verbatim} #include #include "gprolog.h" Bool first_occurrence(char *str, long c, long *pos) { char *p; p = strchr(str, c); if (p == NULL) /* C does not appear in A */ return FALSE; /* fail */ *pos = p - str; /* set the output argument */ return TRUE; /* succeed */ } \end{verbatim} \end{Indentation} The compilation produces an executable called \texttt{examp}: \OneLine{\% gplc examp.pl examp\_c.c} Examples of use: \begin{Indentation} \begin{verbatim} | ?- first_occurrence(prolog, p, X). X = 0 | ?- first_occurrence(prolog, k, X). no | ?- first_occurrence(prolog, A, X). {exception: error(instantiation_error,first_occurrence/3)} | ?- first_occurrence(prolog, 1 ,X). {exception: error(type_error(character,1),first_occurrence/3)} \end{verbatim} \end{Indentation} \subsubsection{Example: non-deterministic code} We here define a predicate \texttt{occurrence(A, C, P)} which unifies \texttt{P} with the position (from 0) of one occurrence of the character \texttt{C} in the atom \texttt{A}. The predicate will fail if \texttt{C} does not appear in \texttt{A}. The predicate is re-executable on backtracking. The information that must be recorded between two invocations of the function is the next starting position in \texttt{A} to search for \texttt{C}. In the prolog file \texttt{examp.pl}: \OneLine{:- foreign(occurrence(+string, +char, -positive), [choice\_size(1)]).} In the C file \texttt{examp\_c.c}: \begin{Indentation} \begin{verbatim} #include #include "gprolog.h" Bool occurrence(char *str, long c, long *pos) { char **info_pos; char *p; info_pos = Get_Choice_Buffer(char **); /* recover the buffer */ if (Get_Choice_Counter() == 0) /* first invocation ? */ *info_pos = str; p = strchr(*info_pos, c); if (p == NULL) /* C does not appear */ { No_More_Choice(); /* remove choice-point */ return FALSE; /* fail */ } *pos = p - str; /* set the output argument */ *info_pos = p + 1; /* update next starting pos */ return TRUE; /* succeed */ } \end{verbatim} \end{Indentation} The compilation produces an executable called \texttt{examp}: \OneLine{\% gplc examp.pl examp\_c.c} Examples of use: \begin{CodeTwoCols} \One{| ?- occurrence(prolog, o, X).} \SkipLine \Two{X = 2 ?}{(here the user presses \texttt{;} to compute another solution)} \SkipLine \Two{X = 4 ?}{(here the user presses \texttt{;} to compute another solution)} \SkipLine \Two{no} {(no more solution)} \SkipLine \One{| ?- occurrence(prolog, k, X).} \SkipLine \One{no} \end{CodeTwoCols} In the first example when the second (the last) occurrence is found (\texttt{X=4}) the choice-point remains and the failure is detected only when another solution is requested (by pressing \texttt{;}). It is possible to improve this behavior by deleting the choice-point when there is no more occurrence. To do this it is necessary to do one search ahead. The information stored is the position of the next occurrence. Let us define such a behavior for the predicate \texttt{occurrence2/3}. In the prolog file \texttt{examp.pl}: \OneLine{:- foreign(occurrence2(+string, +char, -positive), [choice\_size(1)]).} In the C file \texttt{examp\_c.c}: \begin{Indentation} \begin{verbatim} #include #include "gprolog.h" Bool occurrence2(char *str, long c, long *pos) { char **info_pos; char *p; info_pos = Get_Choice_Buffer(char **); /* recover the buffer */ if (Get_Choice_Counter() == 0) /* first invocation ? */ { p = strchr(str, c); if (p == NULL) /* C does not appear at all */ { No_More_Choice(); /* remove choice-point */ return FALSE; /* fail */ } *info_pos = p; } /* info_pos = an occurrence */ *pos = *info_pos - str; /* set the output argument */ p = strchr(*info_pos + 1, c); if (p == NULL) /* no more occurrence */ No_More_Choice(); /* remove choice-point */ else *info_pos = p; /* else update next solution */ return TRUE; /* succeed */ } \end{verbatim} \end{Indentation} Examples of use: \begin{CodeTwoCols} \One{| ?- occurrence2(prolog, l, X).} \SkipLine \Two{X = 3}{(here the user is not prompted since there is no more alternative)} \SkipLine \One{| ?- occurrence2(prolog, o, X).} \SkipLine \Two{X = 2 ?}{(here the user presses \texttt{;} to compute another solution)} \SkipLine \Two{X = 4}{(here the user is not prompted since there is no more alternative)} \end{CodeTwoCols} \subsubsection{Example: input/output arguments} We here define a predicate \texttt{char\_ascii(Char, Code}) which converts in both directions the character \texttt{Char} and its character-code \texttt{Code}. This predicate is then similar to \IdxPB{char\_code/2} \RefSP{char-code/2}. In the prolog file \texttt{examp.pl}: \OneLine{:- foreign(char\_ascii(?char, ?code), [fct\_name('Char\_Ascii')]).} In the C file \texttt{examp\_c.c}: \begin{Indentation} \begin{verbatim} #include "gprolog.h" Bool char_ascii(FIOArg *c, FIOArg *ascii) { if (!c->is_var) /* Char is not a variable */ { ascii->unify = TRUE; /* enforce unif. of Code */ ascii->value.l = c->value.l; /* set Code */ return TRUE; /* succeed */ } if (ascii->is_var) /* Code is also a variable */ Pl_Err_Instantiation(); /* emit instantiation_error */ c->value.l = ascii->value.l; /* set Char */ return TRUE; /* succeed */ } \end{verbatim} \end{Indentation} If \texttt{Char} is instantiated it is necessary to enforce the unification of \texttt{Code} since it could be instantiated. Recall that by default if an input/output argument is instantiated it will not be unified at the exit of the function \RefSP{Input/output-arguments}. If both \texttt{Char} and \texttt{Code} are variables the function raises an \texttt{instantiation\_error}. The way to raise Prolog errors is described later \RefSP{Raising-Prolog-errors}. The compilation produces an executable called \texttt{examp}: \OneLine{\% gplc examp.pl examp\_c.c} Examples of use: \begin{Indentation} \begin{verbatim} | ?- char_ascii(a, X). X = 97 | ?- char_ascii(X, 65). X = 'A' | ?- char_ascii(a, 12). no | ?- char_ascii(X, X). {exception: error(instantiation_error,char_ascii/2)} | ?- char_ascii(1, 12). {exception: error(type_error(character,1),char_ascii/2)} \end{verbatim} \end{Indentation} \subsection{Manipulating Prolog terms} \label{Manipulating-Prolog-terms} \subsubsection{Introduction} \label{Introduction:(Manipulating-Prolog-terms)} In the following we presents a set of functions to manipulate Prolog terms. For simple foreign terms the functions manipulate simple C types \RefSP{foreign/2-directive}. Functions managing lists handle an array of 2 elements (of type \texttt{PlTerm}) containing the terms corresponding to the head and the tail of the list. For the empty list \texttt{NULL} is passed as the array. These functions require to flatten a list in each sub-list. To simplify the management of proper lists (i.e. lists terminated by \texttt{[]}) a set of functions is provided that handle the number of elements of the list (an integer) and an array whose elements (of type \texttt{PlTerm}) are the elements of the list. The caller of these functions must provide the array. Functions managing compound terms handle a functor (the principal functor of the term), an arity \Param{N} $\geq$ 0 and an array of \Param{N} elements (of type \texttt{PlTerm}) containing the sub-terms of the compound term. Since a list is a special case of compound term (functor = \texttt{'.'} and arity=2) it is possible to use any function managing compound terms to deal with a list but the error detection is not the same. Indeed many functions check if the Prolog argument is correct. The name of a read or unify function checking the Prolog arguments is of the form \texttt{\Param{Name}\_Check()}. For each of these functions there is a also check-free version called \texttt{\Param{Name}()}. We then only present the name of checking functions. \subsubsection{Managing Prolog atoms} Each atom has a unique internal key which corresponds to its index in the GNU Prolog atom table. It is possible to obtain the information about an atom and to create new atoms using: \begin{Indentation} \begin{verbatim} char *Atom_Name (int atom) int Atom_Length (int atom) Bool Atom_Needs_Quote (int atom) Bool Atom_Needs_Scan (int atom) Bool Is_Valid_Atom (int atom) int Create_Atom (char *str) int Create_Allocate_Atom(char *str) int Find_Atom (char *str) int ATOM_CHAR (char c) int atom_nil int atom_false int atom_true int atom_end_of_file \end{verbatim} \end{Indentation} The macro \texttt{Atom\_Name(atom)} returns the internal string of \texttt{atom} (this string should not be modified). The function \texttt{Atom\_Lengh(atom)} returns the length (of the name) of \texttt{atom}. The function \texttt{Atom\_Needs\_Scan(atom)} indicates if the canonical form of \texttt{atom} needs to be quoted as done by \IdxPB{writeq/2} \RefSP{write-term/3}. In that case \texttt{Atom\_Needs\_Scan(atom)} indicates if this simply comes down to write quotes around the name of \texttt{atom} or if it necessary to scan each character of the name because there are some non-printable characters (or included quote characters). The function \texttt{Is\_Valid\_Atom(atom)} is true only if \texttt{atom} is the internal key of an existing atom. The function \texttt{Create\_Atom(str)} adds a new atom whose name is the content of \texttt{str} to the system and returns its internal key. If the atom already exists its key is simply returned. The string \texttt{str} passed to the function should not be modified later. The function \texttt{Create\_Allocate\_Atom(str)} is provided when this condition cannot be ensured. It simply makes a dynamic copy of \texttt{str}. The function \texttt{Find\_Atom(str)} returns the internal key of the atom whose name is \texttt{str} or \texttt{-1} if does not exist. All atoms corresponding to a single character already exist and their key can be obtained via the macro \texttt{ATOM\_CHAR}. For instance \texttt{ATOM\_CHAR('.')} is the atom associated with \texttt{'.'} (this atom is the functor of lists). The other variables correspond to the internal key of frequently used atoms: \texttt{[]}, \texttt{false}, \texttt{true} and \texttt{end\_of\_file}. \subsubsection{Reading Prolog terms} \label{Reading-Prolog-terms} The name of all functions presented here are of the form \texttt{Rd\_\Param{Name}\_Check()}. They all check the validity of the Prolog term to read emitting appropriate errors if necessary. Each function has a check-free version called \texttt{Rd\_\Param{Name}()}. \SPart{Simple foreign types}: for each simple foreign type \RefSP{foreign/2-directive} there is a read function (used by the interface when an input argument is provided): \begin{Indentation} \begin{verbatim} long Rd_Integer_Check (PlTerm term) long Rd_Positive_Check (PlTerm term) double Rd_Float_Check (PlTerm term) double Rd_Number_Check (PlTerm term) int Rd_Atom_Check (PlTerm term) int Rd_Boolean_Check (PlTerm term) int Rd_Char_Check (PlTerm term) int Rd_In_Char_Check (PlTerm term) int Rd_Code_Check (PlTerm term) int Rd_In_Code_Check (PlTerm term) int Rd_Byte_Check (PlTerm term) int Rd_In_Byte_Check (PlTerm term) char *Rd_String_Check (PlTerm term) char *Rd_Chars_Check (PlTerm term) char *Rd_Codes_Check (PlTerm term) int Rd_Chars_Str_Check(PlTerm term, char *str) int Rd_Codes_Str_Check(PlTerm term, char *str) \end{verbatim} \end{Indentation} All functions returning a C string (\texttt{char *}) use a same buffer. The function \texttt{Rd\_Chars\_Str\_Check()} is similar to \texttt{Rd\_Chars\_Check()} but accepts as argument a string to store the result and returns the length of that string (which is also the length of the Prolog list). Similarly for \texttt{Rd\_Codes\_Str\_Check()}. \SPart{Complex terms}: the following functions return the sub-arguments (terms) of complex terms as an array of \texttt{PlTerm} except \texttt{Rd\_Proper\_List\_Check()} which returns the size of the list read (and initializes the array \texttt{element}). Refer to the introduction of this section for more information about the arguments of complex functions \RefSP{Introduction:(Manipulating-Prolog-terms)}. \begin{Indentation} \begin{verbatim} int Rd_Proper_List_Check(PlTerm term, PlTerm *arg) PlTerm *Rd_List_Check (PlTerm term) PlTerm *Rd_Compound_Check (PlTerm term, int *functor, int *arity) PlTerm *Rd_Callable_Check (PlTerm term, int *functor, int *arity) \end{verbatim} \end{Indentation} \subsubsection{Unifying Prolog terms} The name of all functions presented here are of the form \texttt{Un\_\Param{Name}\_Check()}. They all check the validity of the Prolog term to unify emitting appropriate errors if necessary. Each function has a check-free version called \texttt{Un\_\Param{Name}()}. \SPart{Simple foreign types}: for each simple foreign type \RefSP{foreign/2-directive} there is an unify function (used by the interface when an output argument is provided): \begin{Indentation} \begin{verbatim} Bool Un_Integer_Check (long n, PlTerm term) Bool Un_Positive_Check(long n, PlTerm term) Bool Un_Float_Check (double n, PlTerm term) Bool Un_Number_Check (double n, PlTerm term) Bool Un_Atom_Check (int atom, PlTerm term) Bool Un_Boolean_Check (int b, PlTerm term) Bool Un_Char_Check (int c, PlTerm term) Bool Un_In_Char_Check (int c, PlTerm term) Bool Un_Code_Check (int c, PlTerm term) Bool Un_In_Code_Check (int c, PlTerm term) Bool Un_Byte_Check (int b, PlTerm term) Bool Un_In_Byte_Check (int b, PlTerm term) Bool Un_String_Check (char *str, PlTerm term) Bool Un_Chars_Check (char *str, PlTerm term) Bool Un_Codes_Check (char *str, PlTerm term) \end{verbatim} \end{Indentation} The function \texttt{Un\_Number\_Check(n, term)} unifies \texttt{term} with an integer if \texttt{n} is an integer, with a floating point number otherwise. The function \texttt{Un\_String\_Check(str, term)} creates the atom corresponding to \texttt{str} and then unifies term with it (same as \texttt{Un\_Atom\_Check(Create\_Allocate\_Atom(str), term)}). \SPart{Complex terms}: the following functions accept the sub-arguments (terms) of complex terms as an array of \texttt{PlTerm}. Refer to the introduction of this section for more information about the arguments of complex functions \RefSP{Introduction:(Manipulating-Prolog-terms)}. \begin{Indentation} \begin{verbatim} Bool Un_Proper_List_Check(int size, PlTerm *arg, PlTerm term) Bool Un_List_Check (PlTerm *arg, PlTerm term) Bool Un_Compound_Check (int functor, int arity, PlTerm *arg, PlTerm term) Bool Un_Callable_Check (int functor, int arity, PlTerm *arg, PlTerm term) \end{verbatim} \end{Indentation} All these functions check the type of the term to unify and return the result of the unification. Generally if an unification fails the C function returns \texttt{FALSE} to enforce a failure. However if there are several arguments to unify and if an unification fails then the C function returns \texttt{FALSE} and the type of other arguments has not been checked. Normally all error cases are tested before doing any work to be sure that the predicate fails/succeeds only if no error condition is satisfied. So a good method is to check if the validity of all arguments to unify and later to do the unification (using check-free functions). Obviously if there is only one to unify it is more efficient to use a unify function checking the argument. For the other cases the interface provides a set of functions to check the type of a term. \SPart{Simple foreign types}: for each simple foreign type \RefSP{foreign/2-directive} there is check-for-unification function (used by the interface when an output argument is provided): \begin{Indentation} \begin{verbatim} void Check_For_Un_Integer (PlTerm term) void Check_For_Un_Positive(PlTerm term) void Check_For_Un_Float (PlTerm term) void Check_For_Un_Number (PlTerm term) void Check_For_Un_Atom (PlTerm term) void Check_For_Un_Boolean (PlTerm term) void Check_For_Un_Char (PlTerm term) void Check_For_Un_In_Char (PlTerm term) void Check_For_Un_Code (PlTerm term) void Check_For_Un_In_Code (PlTerm term) void Check_For_Un_Byte (PlTerm term) void Check_For_Un_In_Byte (PlTerm term) void Check_For_Un_String (PlTerm term) void Check_For_Un_Chars (PlTerm term) void Check_For_Un_Codes (PlTerm term) \end{verbatim} \end{Indentation} \SPart{Complex terms}: the following functions check the validity of complex terms: \begin{Indentation} \begin{verbatim} void Check_For_Un_List (PlTerm term) void Check_For_Un_Compound(PlTerm term) void Check_For_Un_Callable(PlTerm term) void Check_For_Un_Variable(PlTerm term) \end{verbatim} \end{Indentation} The function \texttt{Check\_For\_Un\_List(term)} checks if \texttt{term} can be unified with a list. This test is done for the entire list (not only for the functor/arity of \texttt{term} but also recursively on the tail of the list). The function \texttt{Check\_For\_Un\_Variable(term)} ensures that \texttt{term} is not currently instantiated. These functions can be defined using functions to test the type of a Prolog term \RefSP{Testing-the-type-of-Prolog-terms} and functions to raise Prolog errors \RefSP{Raising-Prolog-errors}. For instance \texttt{Check\_For\_Un\_List(term)} is defined as follows: \begin{Indentation} \begin{verbatim} void Check_For_Un_List(PlTerm term) { if (!Blt_List_Or_Partial_List(term)) Pl_Err_Type(type_list, term); } \end{verbatim} \end{Indentation} \subsubsection{Creating Prolog terms} \label{Creating-Prolog-terms} These functions are provided to creates Prolog terms. Each function returns a \texttt{PlTerm} containing the created term. \SPart{Simple foreign types}: for each simple foreign type \RefSP{foreign/2-directive} there is a creation function: \begin{Indentation} \begin{verbatim} PlTerm Mk_Integer (long n) PlTerm Mk_Positive(long n) PlTerm Mk_Float (double n) PlTerm Mk_Number (double n) PlTerm Mk_Atom (int atom) PlTerm Mk_Boolean (int b) PlTerm Mk_Char (int c) PlTerm Mk_In_Char (int c) PlTerm Mk_Code (int c) PlTerm Mk_In_Code (int c) PlTerm Mk_Byte (int b) PlTerm Mk_In_Byte (int b) PlTerm Mk_String (char *str) PlTerm Mk_Chars (char *str) PlTerm Mk_Codes (char *str) \end{verbatim} \end{Indentation} The function \texttt{Mk\_Number(n, term)} initializes \texttt{term} with an integer if \texttt{n} is an integer, with a floating point number otherwise. The function \texttt{Mk\_String(str)} first creates an atom corresponding to \texttt{str} and then returns that Prolog atom (i.e. equivalent to \texttt{Mk\_Atom(Create\_Allocate\_Atom(str))}). \SPart{Complex terms}: the following functions accept the sub-arguments (terms) of complex terms as an array of \texttt{PlTerm}. Refer to the introduction of this section for more information about the arguments of complex functions \RefSP{Introduction:(Manipulating-Prolog-terms)}. \begin{Indentation} \begin{verbatim} PlTerm Mk_Proper_List(int size, PlTerm *arg) PlTerm Mk_List (PlTerm *arg) PlTerm Mk_Compound (int functor, int arity, PlTerm *arg) PlTerm Mk_Callable (int functor, int arity, PlTerm *arg) \end{verbatim} \end{Indentation} \subsubsection{Testing the type of Prolog terms} \label{Testing-the-type-of-Prolog-terms} The following functions test the type of a Prolog term. Each function corresponds to a type testing built-in predicate \RefSP{var/1}. \begin{Indentation} \begin{verbatim} Bool Blt_Var (PlTerm term) Bool Blt_Non_Var (PlTerm term) Bool Blt_Atom (PlTerm term) Bool Blt_Integer (PlTerm term) Bool Blt_Float (PlTerm term) Bool Blt_Number (PlTerm term) Bool Blt_Atomic (PlTerm term) Bool Blt_Compound (PlTerm term) Bool Blt_Callable (PlTerm term) Bool Blt_List (PlTerm term) Bool Blt_Partial_List (PlTerm term) Bool Blt_List_Or_Partial_List(PlTerm term) Bool Blt_Fd_Var (PlTerm term) Bool Blt_Non_Fd_Var (PlTerm term) Bool Blt_Generic_Var (PlTerm term) Bool Blt_Non_Generic_Var (PlTerm term) int Type_Of_Term (PlTerm term) int List_Length (PlTerm list) \end{verbatim} \end{Indentation} The function \texttt{Type\_Of\_Term(term)} returns the type of \texttt{term}, the following constants can be used to test this type (e.g. in a \texttt{switch} instruction): \begin{itemize} \item \texttt{PLV}: Prolog variable. \item \texttt{FDV}: finite domain variable. \item \texttt{INT}: integer. \item \texttt{FLT}: floating point number. \item \texttt{ATM}: atom. \item \texttt{LST}: list. \item \texttt{STC}: structure \end{itemize} The tag \texttt{LST} means a term whose principal functor is \texttt{'.'} and whose arity is 2 (recall that the empty list is the atom \texttt{[]}). The tag \texttt{STC} means any other compound term. The function \texttt{List\_Length(list)} returns the number of elements of the \texttt{list} (\texttt{0} for the empty list). If list is not a list this function returns \texttt{-1}. \subsubsection{Comparing Prolog terms} The following functions compares Prolog terms. Each function corresponds to a comparison built-in predicate \RefSP{(==)/2}. \begin{Indentation} \begin{verbatim} Bool Blt_Term_Eq (PlTerm term1, PlTerm term2) Bool Blt_Term_Neq(PlTerm term1, PlTerm term2) Bool Blt_Term_Lt (PlTerm term1, PlTerm term2) Bool Blt_Term_Lte(PlTerm term1, PlTerm term2) Bool Blt_Term_Gt (PlTerm term1, PlTerm term2) Bool Blt_Term_Gte(PlTerm term1, PlTerm term2) \end{verbatim} \end{Indentation} All these functions are based on a general comparison function returning a negative integer if \texttt{term1} is less than \texttt{term2}, 0 if they are equal and a positive integer otherwise: \begin{Indentation} \begin{verbatim} int Term_Compare(PlTerm term1, PlTerm term2) \end{verbatim} \end{Indentation} \subsubsection{Copying Prolog terms} The following functions make a copy of a Prolog term: \begin{Indentation} \begin{verbatim} void Copy_Term (PlTerm *dst_adr, PlTerm *src_adr) void Copy_Contiguous_Term(PlTerm *dst_adr, PlTerm *src_adr) int Term_Size (PlTerm term) \end{verbatim} \end{Indentation} The function \texttt{Copy\_Term(dst\_adr, src\_adr)} makes a copy of the term located at \texttt{src\_adr} and stores it from the address given by \texttt{dst\_adr}. The result is a contiguous term. If it can be ensured that the source term is a contiguous term (i.e. result of a previous copy) the function \texttt{Copy\_Contiguous\_Term()} can be used instead (it is faster). In any case, sufficient space should be available for the copy (i.e. from \texttt{dst\_adr}). The function \texttt{Term\_Size(term)} returns the number of \texttt{PlTerm} needed by \texttt{term}. \subsubsection{Comparing and evaluating arithmetic expressions} The following functions compare arithmetic expressions. Each function corresponds to a comparison built-in predicate \RefSP{(=:=)/2}. \begin{Indentation} \begin{verbatim} Bool Blt_Eq (PlTerm expr1, PlTerm expr2) Bool Blt_Neq(PlTerm expr1, PlTerm expr2) Bool Blt_Lt (PlTerm expr1, PlTerm expr2) Bool Blt_Lte(PlTerm expr1, PlTerm expr2) Bool Blt_Gt (PlTerm expr1, PlTerm expr2) Bool Blt_Gte(PlTerm expr1, PlTerm expr2) \end{verbatim} \end{Indentation} The following function evaluates the expression \texttt{expr} and stores its result as a Prolog number (integer or floating point number) in \texttt{result}: \begin{Indentation} \begin{verbatim} void Math_Load_Value(PlTerm expr, PlTerm *result) \end{verbatim} \end{Indentation} This function can be followed by a read function \RefSP{Reading-Prolog-terms} to obtain the result. \subsection{Raising Prolog errors} \label{Raising-Prolog-errors} The following functions allows a C function to raise a Prolog error. Refer to the section concerning Prolog errors for more information about the effect of raising an error \RefSP{Errors}. \subsubsection{Managing the error context} When one of the following error function is invoked it refers to the implicit error context \RefSP{General-format-and-error-context}. This context indicates the name and the arity of the concerned predicate. When using a \texttt{foreign/2} declaration this context is set by default to the name and arity of the associated Prolog predicate. This can be controlled using the \IdxPO{bip\_name} option \RefSP{foreign/2-directive}. In any case, the following functions can also be used to modify this context: \begin{Indentation} \begin{verbatim} void Set_C_Bip_Name (char *functor, int arity) void Unset_C_Bip_Name(void) \end{verbatim} \end{Indentation} The function \texttt{Set\_C\_Bip\_Name(functor, arity)} initializes the context of the error with \texttt{functor} and \texttt{arity} (if \texttt{arity}$<$0 only \texttt{functor} is significant). The function \texttt{Unset\_C\_Bip\_Name()} removes such an initialization (the context is then reset to the last \texttt{Functor}/\texttt{Arity} set by a call to \IdxPB{set\_bip\_name/2} \RefSP{set-bip-name/2}. This is useful when writing a C routine to define a context for errors occurring in this routine and, before exiting to restore the previous context. \subsubsection{Instantiation error} The following function raises an instantiation error \RefSP{Instantiation-error}: \OneLine{void Pl\_Err\_Instantiation(void)} \subsubsection{Type error} The following function raises a type error \RefSP{Type-error}: \OneLine{void Pl\_Err\_Type(int atom\_type, PlTerm culprit)} \texttt{atom\_type} is (the internal key of) the atom associated with the expected type. For each type name \Param{T} there is a corresponding predefined atom stored in a global variable whose name is of the form \texttt{type\_\Param{T}}. \texttt{culprit} is the argument which caused the error. \SPart{Example}: \texttt{x} is an atom while an integer was expected: \texttt{Pl\_Err\_Type(type\_integer, x)}. \subsubsection{Domain error} The following function raises a domain error \RefSP{Domain-error}: \OneLine{void Pl\_Err\_Domain(int atom\_domain, PlTerm culprit)} \texttt{atom\_domain} is (the internal key of) the atom associated with the expected domain. For each domain name \Param{D} there is a corresponding predefined atom stored in a global variable whose name is of the form \texttt{domain\_\Param{D}}. \texttt{culprit} is the argument which caused the error. \SPart{Example}: \texttt{x} is $<$ 0 but should be $\geq$ 0: \texttt{Pl\_Err\_Domain(domain\_not\_less\_than\_zero, x)}. \subsubsection{Existence error} The following function raises an existence error \RefSP{Existence-error}: \OneLine{void Pl\_Err\_Existence(int atom\_object, PlTerm culprit)} \texttt{atom\_object} is (the internal key of) the atom associated with the type of the object. For each object name \Param{O} there is a corresponding predefined atom stored in a global variable whose name is of the form \texttt{existence\_\Param{O}}. \texttt{culprit} is the argument which caused the error. \SPart{Example}: \texttt{x} does not refer to an existing source: \texttt{Pl\_Err\_Existence(existence\_source\_sink, x)}. \subsubsection{Permission error} The following function raises a permission error \RefSP{Permission-error}: \OneLine{void Pl\_Err\_Permission(int atom\_operation, int atom\_permission, PlTerm culprit)} \texttt{atom\_operation} is (the internal key of) the atom associated with the operation which caused the error. For each operation name \Param{O} there is a corresponding predefined atom stored in a global variable whose name is of the form \texttt{permission\_operation\_\Param{O}}. \texttt{atom\_permission} is (the internal key of) the atom associated with the tried permission. For each permission name \Param{P} there is a corresponding predefined atom stored in a global variable whose name is of the form \texttt{permission\_type\_\Param{P}}. \texttt{culprit} is the argument which caused the error. \SPart{Example}: reading from an output stream \texttt{x}: \texttt{Pl\_Err\_Permission(permission\_operation\_input, \\ permission\_type\_stream, x)}. \subsubsection{Representation error} The following function raises a representation error \RefSP{Representation-error}: \OneLine{void Pl\_Err\_Representation(int atom\_limit)} \texttt{atom\_limit} is (the internal key of) the atom associated with the reached limit. For each limit name \Param{L} there is a corresponding predefined atom stored in a global variable whose name is of the form \texttt{representation\_\Param{L}}. \SPart{Example}: an arity too big occurs: \texttt{Pl\_Err\_Representation(representation\_max\_arity)}. \subsubsection{Evaluation error} The following function raises an evaluation error \RefSP{Evaluation-error}: \OneLine{void Pl\_Err\_Evaluation(int atom\_error)} \texttt{atom\_error} is (the internal key of) the atom associated with the error. For each evaluation error name \Param{E} there is a corresponding predefined atom stored in a global variable whose name is of the form \texttt{evaluation\_\Param{E}}. \SPart{Example}: a division by zero occurs: \texttt{Pl\_Err\_Evaluation(evluation\_zero\_divisor)}. \subsubsection{Resource error} The following function raises a resource error \RefSP{Resource-error}: \OneLine{void Pl\_Err\_Resource(int atom\_resource)} \texttt{atom\_resource} is (the internal key of) the atom associated with the resource. For each resource error name \Param{R} there is a corresponding predefined atom stored in a global variable whose name is of the form \texttt{resource\_\Param{R}}. \SPart{Example}: too many open streams: \texttt{Pl\_Err\_Resource(resource\_too\_many\_open\_streams)}. \subsubsection{Syntax error} The following function raises a syntax error \RefSP{Syntax-error}: \OneLine{void Pl\_Err\_Syntax(int atom\_error)} \texttt{atom\_error} is (the internal key of) the atom associated with the error. There is no predefined syntax error atoms. \SPart{Example}: a \texttt{/} is expected: \texttt{Pl\_Err\_Syntax(Create\_Atom("/ expected"))}. The following function emits a syntax error according to the value of the \IdxPF{syntax\_error} \Idx{Prolog flag} \RefSP{set-prolog-flag/2}. This function can then return (if the value of the flag is either \texttt{warning} or \texttt{fail}). In that case the calling function should fail (e.g. returning \texttt{FALSE}). This function accepts a file name (the empty string C \texttt{""} can be passed), a line and column number and an error message string. Using this function makes it possible to further call the built-in predicate \IdxPB{syntax\_error\_info/4} \RefSP{syntax-error-info/4}: \OneLine{void Emit\_Syntax\_Error(char *file\_name, int line, int column, char *message)} \SPart{Example}: a \texttt{/} is expected: \texttt{Emit\_Syntax\_Error("data", 10, 30, "/ expected")}. \subsubsection{System error} The following function raises a system error (4.3.11, page *): \OneLine{void Pl\_Err\_System(int atom\_error)} \texttt{atom\_error} is (the internal key of) the atom associated with the error. There is no predefined system error atoms. \SPart{Example}: an invalid pathname is given: \texttt{Pl\_Err\_System(Create\_Atom("invalid path name"))}. The following function emits a system error associated with an operating system error according to the value of the \IdxPF{os\_error} \Idx{Prolog flag} \RefSP{set-prolog-flag/2}. This function can then return (if the value of the flag is either \texttt{warning} or \texttt{fail}). In that case the calling function should fail (e.g. returning \texttt{FALSE}). This function uses the value of the \texttt{errno} C library variable: \OneLine{void Os\_Error(void)} \SPart{Example}: a call to the C Unix function \texttt{chdir(3)} returns \texttt{-1}: \texttt{Os\_Error()}. \subsection{Calling Prolog from C} \subsubsection{Introduction} The following functions allows a C function to call a Prolog predicate: \begin{Indentation} \begin{verbatim} void Pl_Query_Begin (Bool recoverable) int Pl_Query_Call (int functor, int arity, PlTerm *arg) int Pl_Query_Next_Solution(void) void Pl_Query_End (int op) PlTerm Pl_Get_Exception (void) void Pl_Exec_Continuation (int functor, int arity, PlTerm *arg) \end{verbatim} \end{Indentation} The invocation of a Prolog predicate should be done as follows: \begin{itemize} \item open a query using \texttt{Pl\_Query\_Begin()} \item compute the first solution using \texttt{Pl\_Query\_Call()} \item eventually compute next solutions using \texttt{Pl\_Query\_Next\_Solution()} \item close the query using \texttt{Pl\_Query\_End()} \end{itemize} The function \texttt{Pl\_Query\_Begin(recoverable)} is used to initialize a query. The argument \texttt{recoverable} shall be set to \texttt{TRUE} if the user wants to recover, at the end of the query, the memory space consumed by the query (in that case an additional choice-point is created). All terms created in the heap, e.g. using \texttt{Mk\_...} family functions \RefSP{Creating-Prolog-terms}, after the invocation of \texttt{Pl\_Query\_Begin()} can be recovered when calling \texttt{Pl\_Query\_End(TRUE)} (see below). The function \texttt{Pl\_Query\_Call(functor, arity, arg)} calls a predicate passing arguments. It is then used to compute the first solution. The arguments \texttt{functor}, \texttt{arity} and \texttt{arg} are similar to those of the functions handling complex terms \RefSP{Introduction:(Manipulating-Prolog-terms)}. This function returns: \begin{itemize} \item \texttt{PL\_FAILURE} (a constant equal to \texttt{FALSE}, i.e. 0) if the query fails. \item \texttt{PL\_SUCCESS} (a constant equal to \texttt{TRUE}, i.e. 1) in case of success. In that case the argument array \texttt{arg} can be used to obtain the unification performed by the query. \item \texttt{PL\_EXCEPTION} (a constant equal to 2). In that case function \texttt{Pl\_Get\_Exception()} can be used to obtained the exceptional term raised by \IdxPB{throw/1} \RefSP{catch/3}. \end{itemize} The function \texttt{Pl\_Query\_Next\_Solution()} is used to compute a new solution. It must be only used if the result of the previous solution was \texttt{PL\_SUCCESS}. This functions returns the same kind of values as \texttt{Pl\_Query\_Call()} (see above). The function \texttt{Pl\_Query\_End(op)} is used to finish a query. This function mainly manages the remaining alternatives of the query. However, even if the query has no alternatives this function must be used to correctly finish the query. The value of \texttt{op} is: \begin{itemize} \item \texttt{PL\_RECOVER}: to recover the memory space consumed by the query. After that the state of Prolog stacks is exactly the same as before opening the query. To use this option the query must have been initialized specifying \texttt{TRUE} for \texttt{recoverable} (see above). \item \texttt{PL\_CUT}: to cut remaining alternatives. The effect of this option is similar to a cut after the query. \item \texttt{PL\_KEEP\_FOR\_PROLOG}: to keep the alternatives for Prolog. This is useful when the query was invoked in a foreign C function. In that case, when the predicate corresponding to the C foreign function is invoked a query is executed and the remaining alternatives are then available as alternatives of that predicate. \end{itemize} Note that several queries can be nested since a stack of queries is maintained. For instance, it is possible to call a query and before terminating it to call another query. In that case the first execution of \texttt{Pl\_Query\_End()} will finish the second query (i.e. the inner) and the next execution of \texttt{Pl\_Query\_End()} will finish the first query. Finally, the function \texttt{Pl\_Exec\_Continuation(functor, arity, arg)} replaces the current calculus by the execution of the specified predicate. The arguments \texttt{functor}, \texttt{arity} and \texttt{arg} are similar to those of the functions handling complex terms \RefSP{Introduction:(Manipulating-Prolog-terms)}. \subsubsection{Example: \texttt{my\_call/1} - a \texttt{call/1} clone} We here define a predicate \texttt{my\_call(Goal)} which acts like \texttt{call(Goal)} except that we do not handle exceptions (if an exception occurs the goal simply fails): In the prolog file \texttt{examp.pl}: \OneLine{:- foreign(my\_call(term)).} In the C file \texttt{examp\_c.c}: \begin{Indentation} \begin{verbatim} #include #include "gprolog.h" Bool my_call(PlTerm goal) { PlTerm *arg; int functor, arity; int result; arg = Rd_Callable_Check(goal, &functor, &arity); Pl_Query_Begin(FALSE); result = Pl_Query_Call(functor, arity, arg); Pl_Query_End(PL_KEEP_FOR_PROLOG); return (result == PL_SUCCESS); } \end{verbatim} \end{Indentation} The compilation produces an executable called \texttt{examp}: \OneLine{\% gplc examp.pl examp\_c.c} Examples of use: \begin{CodeTwoCols} \One{| ?- my\_call(write(hello)).} \One{hello} \SkipLine \One{| ?- my\_call(for(X,1,3)).} \SkipLine \Two{X = 1 ?}{(here the user presses \texttt{;} to compute another solution)} \SkipLine \Two{X = 2 ?}{(here the user presses \texttt{;} to compute another solution)} \SkipLine \Two{X = 3}{(here the user is not prompted since there is no more alternative)} \SkipLine \One{| ?- my\_call(1).} \One{{\lb}exception:~error(type\_error(callable,1),my\_call/1){\rb}} \SkipLine \One{| ?- my\_call(call(1)).} \SkipLine \One{no} \end{CodeTwoCols} When \texttt{my\_call(1)} is called an error is raised due to the use of \texttt{Rd\_Callable\_Check()}. However the error raised by \texttt{my\_call(call(1))} is ignored and \texttt{FALSE} (i.e. a failure) is returned by the foreign function. To really simulate the behavior of \texttt{call/1} when an exception is recovered it should be re-raised to be captured by an earlier handler. The idea is then to execute a \texttt{throw/1} as the continuation. This is what it is done by the following code: \begin{Indentation} \begin{verbatim} #include #include "gprolog.h" Bool my_call(PlTerm goal) { PlTerm *args; int functor, arity; int result; args = Rd_Callable_Check(goal, &functor, &arity); Pl_Query_Begin(FALSE); result = Pl_Query_Call(functor, arity, args); Pl_Query_End(PL_KEEP_FOR_PROLOG); if (result == PL_EXCEPTION) { PlTerm except = Pl_Get_Exception(); Pl_Exec_Continuation(Find_Atom("throw"), 1, &except); } return result; } \end{verbatim} \end{Indentation} The following code propagates the error raised by \texttt{call/1}. \begin{CodeTwoCols} \One{| ?- my\_call(call(1)).} \One{{\lb}exception:~error(type\_error(callable,1),my\_call/1){\rb}} \end{CodeTwoCols} Finally note that a simpler way to define \texttt{my\_call/1} is to use \texttt{Pl\_Exec\_Continuation()} as follows: \begin{Indentation} \begin{verbatim} #include #include "gprolog.h" Bool my_call(PlTerm goal) { PlTerm *args; int functor, arity; args = Rd_Callable_Check(goal, &functor, &arity); Pl_Exec_Continuation(functor, arity, args); return TRUE; } \end{verbatim} \end{Indentation} \subsubsection{Example: recovering the list of all operators} We here define a predicate \texttt{all\_op(List)} which unifies \texttt{List} with the list of all currently defined operators as would be done by: \texttt{findall(X,current\_op(\_,\_,X),List)}. In the prolog file \texttt{examp.pl}: \OneLine{:- foreign(all\_op(term)).} In the C file \texttt{examp\_c.c}: \begin{Indentation} \begin{verbatim} #include #include "gprolog.h" Bool all_op(PlTerm list) { PlTerm op[1024]; PlTerm args[3]; int n = 0; int result; Pl_Query_Begin(TRUE); args[0] = Mk_Variable(); args[1] = Mk_Variable(); args[2] = Mk_Variable(); result = Pl_Query_Call(Find_Atom("current_op"), 3, args); while (result) { op[n++] = Mk_Atom(Rd_Atom(args[2])); /* arg #2 is the name of the op */ result = Pl_Query_Next_Solution(); } Pl_Query_End(PL_RECOVER); return Un_Proper_List_Check(n, op, list); } \end{verbatim} \end{Indentation} Note that we know here that there is no source for exception. In that case the result of \texttt{Pl\_Query\_Call} and \texttt{Pl\_Query\_Next\_Solution} can be considered as a boolean. The compilation produces an executable called \texttt{examp}: \OneLine{\% gplc examp.pl examp\_c.c} Example of use: \begin{Indentation} \begin{verbatim} | ?- all_op(L). L = [:-,:-,\=,=:=,#>=,#<#,@>=,-->,mod,#>=#,**,*,+,+,',',...] | ?- findall(X,current_op(_,_,X),L). L = [:-,:-,\=,=:=,#>=,#<#,@>=,-->,mod,#>=#,**,*,+,+,',',...] \end{verbatim} \end{Indentation} \subsection{Defining a new C \texttt{main()} function} GNU Prolog allows the user to define his own \texttt{main()} function. This can be useful to perform several tasks before starting the Prolog engine. To do this simply define a classical \texttt{main(argc, argv)} function. The following functions can then be used: \begin{Indentation} \begin{verbatim} int Start_Prolog (int argc, char *argv[]) void Stop_Prolog (void) void Reset_Prolog (void) Bool Try_Execute_Top_Level(void) \end{verbatim} \end{Indentation} The function \texttt{Start\_Prolog(argc, argv)} initializes the Prolog engine (\texttt{argc} and \texttt{argv} are the command-line variables). This function collects all linked objects (issued from the compilation of Prolog files) and initializes them. The initialization of a Prolog object file consists in adding to appropriate tables new atoms, new predicates and executing its system directives. A system directive is generated by the Prolog to WAM compiler to reflect a (user) directive executed at compile-time such as \texttt{op/3} \RefSP{op/3}. Indeed, when the compiler encounters such a directive it immediately executes it and also generates a system directive to execute it at the start of the executable. When all system directives have been executed the Prolog engine executes all initialization directives defined with \IdxDi{initialization/1} \RefSP{initialization/1}. The function returns the number of user directives (i.e. \texttt{initialization/1}) executed. This function must be called only once. The function \texttt{Stop\_Prolog()} stops the Prolog engine. This function must be called only once after all Prolog treatment have been done. The function \texttt{Reset\_Prolog()} reinitializes the Prolog engine (i.e. reset all Prolog stacks). The function \texttt{Try\_Execute\_Top\_Level()} executes the \Idx{top-level} if linked \RefSP{Using-the-compiler} and returns \texttt{TRUE}. If the top-level is not present the functions returns \texttt{FALSE}. Here is the definition of the default GNU Prolog \texttt{main()} function: \begin{Indentation} \begin{verbatim} int Main_Wrapper(int argc, char *argv[]) { int nb_user_directive; Bool top_level; nb_user_directive = Start_Prolog(argc, argv); top_level = Try_Execute_Top_Level(); Stop_Prolog(); if (top_level || nb_user_directive) return 0; fprintf(stderr, "Warning: no initial goal executed\n" " use a directive :- initialization(Goal)\n" " or remove the link option --no-top-level" " (or --min-bips or --min-size)\n"); return 1; } int main(int argc, char *argv[]) { return Main_Wrapper(argc, argv); } \end{verbatim} \end{Indentation} Note that under some circumstances it is necessary to encapsulate the code of \texttt{main()} inside an intermediate function called by \texttt{main()}. Indeed, some C compilers (e.g. gcc) treats \texttt{main()} particularly, producing an uncompatible code w.r.t GNU Prolog. So it is a good idea to always use a wrapper function as shown above. \subsubsection{Example: asking for ancestors} In this example we use the following Prolog code (in a file called \texttt{new\_main.pl}): \begin{Indentation} \begin{verbatim} parent(bob, mary). parent(jane, mary). parent(mary, peter). parent(paul, peter). parent(peter, john). anc(X, Y):- parent(X, Y). anc(X, Z) :- parent(X, Y), anc(Y, Z). \end{verbatim} \end{Indentation} The following file (called \texttt{new\_main\_c.c}) defines a \texttt{main()} function readinf the name of a person and displaying all successors of that person. This is equivalent to the Prolog query: \texttt{anc(Result, Name)}. \begin{Indentation} \begin{verbatim} static int Main_Wrapper(int argc, char *argv[]) { int func; WamWord arg[10]; char str[100]; char *sol[100]; int i, nb_sol = 0; Bool res; Start_Prolog(argc, argv); func = Find_Atom("anc"); for (;;) { printf("\nEnter a name (or 'end' to finish): "); scanf("%s", str); if (strcmp(str, "end") == 0) break; Pl_Query_Begin(TRUE); arg[0] = Mk_Variable(); arg[1] = Mk_String(str); nb_sol = 0; res = Pl_Query_Call(func, 2, arg); while (res) { sol[nb_sol++] = Rd_String(arg[0]); res = Pl_Query_Next_Solution(); } Pl_Query_End(PL_RECOVER); for (i = 0; i < nb_sol; i++) printf(" solution: %s\n", sol[i]); printf("%d solution(s)\n", nb_sol); } Stop_Prolog(); return 0; } int main(int argc, char *argv[]) { return Main_Wrapper(argc, argv); } \end{verbatim} \end{Indentation} The compilation produces an executable called \texttt{new\_main}: \OneLine{\% gplc new\_main.pl new\_main\_c.c} Examples of use: \begin{Indentation} \begin{verbatim} Enter a name (or 'end' to finish): john solution: peter solution: bob solution: jane solution: mary solution: paul 5 solution(s) Enter a name (or 'end' to finish): mary solution: bob solution: jane 2 solution(s) Enter a name (or 'end' to finish): end \end{verbatim} \end{Indentation} %HEVEA\cutend ./gprolog-1.3.0/doc/html_node/0000777004425400513100000000000010547442375014526 5ustar diazloco./gprolog-1.3.0/doc/html_node/gprolog046.html0000644004425400513100000002425110547441640017311 0ustar diazloco Program state Previous Up Next

7.23  Program state

7.23.1  consult/1, '.'/2 - program consult

Templates
consult(+atom_or_atom_list)
'.'(+atom, +atom_list)
Description

consult(Files) compiles and loads into memory each file of the list Files. Each file is compiled for byte-code using the GNU Prolog compiler (section 3.4) then loaded using load/1 (section 7.23.2). It is possible to specify user as a file name to directly enter the program from the terminal. Files can be also a single file name (i.e. an atom). Refer to the section concerning the consult of a Prolog program for more information (section 3.2.3).

The final file name of a file is computed using the predicates prolog_file_name/2 (section 7.26.3) and absolute_file_name/2 (section 7.26.1).

[ File | Files ], i.e. '.'(File, Files) is equivalent to consult([ File | Files ]).

Errors
Files is a partial list or a list with an element E which is a variable    instantiation_error
Files is neither a partial list nor a list nor an atom    type_error(list, Files)
an element E of the Files list is neither a variable nor an atom    type_error(atom, E)
an element E of the Files list is an atom but not a valid pathname    domain_error(os_path, E)
an element E of the Files list is a valid pathname but does not correspond to an existing source    existence_error(source_sink, E)
an error occurs executing a directive    see call/1 errors (section 6.2.3)

Portability

GNU Prolog predicates.

7.23.2  load/1

Templates
load(+atom_or_atom_list)
Description

load(Files) loads into memory each file of the list Files. Each file must have been previously compiled for byte-code using the GNU Prolog compiler (section 3.4). Files can be also a single file name (i.e. an atom).

The final file name of a file is computed using the predicates absolute_file_name/2 (section 7.26.1). If no suffix is given '.wbc' is appended to the file name.

Errors
Files is a partial list or a list with an element E which is a variable    instantiation_error
Files is neither a partial list nor a list nor an atom    type_error(list, Files)
an element E of the Files list is neither a variable nor an atom    type_error(atom, E)
an element E of the Files list is an atom but not a valid pathname    domain_error(os_path, E)
an element E of the Files list is a valid pathname but does not correspond to an existing source    existence_error(source_sink, E)
an error occurs executing a directive    see call/1 errors (section 6.2.3)

Portability

GNU Prolog predicate.

7.23.3  listing/1, listing/0

Templates
listing(+predicate_indicator)
listing(+atom)
listing
Description

listing(Pred) lists the clauses of the consulted predicate whose predicate indicator is Pred. Pred can also be a single atom in which case all predicates whose name is Pred are listed (of any arity). This predicate uses portray_clause/2 (section 7.14.8) to output the clauses.

listing lists all clauses of all consulted predicates.

Errors
Pred is a variable    instantiation_error
Pred is neither a variable nor predicate indicator or an atom    type_error(predicate_indicator, Pred)

Portability

GNU Prolog predicate.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog062.html0000644004425400513100000003711310547441640017310 0ustar diazloco Symbolic constraints Previous Up Next

8.8  Symbolic constraints

8.8.1  fd_all_different/1

Templates
fd_all_different(+fd_variable_list)
Description

fd_all_different(List) constrains all variables in List to take distinct values. This is equivalent to posting an inequality constraint for each pair of variables. This constraint is triggered when a variable becomes ground, removing its value from the domain of the other variables.

Errors
List is a partial list    instantiation_error
List is neither a partial list nor a list    type_error(list, List)
an element E of the List list is neither a variable nor an integer nor an FD variable    type_error(fd_variable, E)

Portability

GNU Prolog predicate.

8.8.2  fd_element/3

Templates
fd_element(?fd_variable, +integer_list, ?fd_variable)
Description

fd_element(I, List, X) constraints X to be equal to the Ith integer (from 1) of List.

Errors
I is neither a variable nor an FD variable nor an integer    type_error(fd_variable, I)
X is neither a variable nor an FD variable nor an integer    type_error(fd_variable, X)
List is a partial list or a list with an element E which is a variable    instantiation_error
List is neither a partial list nor a list    type_error(list, List)
an element E of the List list is neither a variable nor an integer    type_error(integer, E)

Portability

GNU Prolog predicate.

8.8.3  fd_element_var/3

Templates
fd_element_var(?fd_variable, +fd_variable_list, ?fd_variable)
Description

fd_element_var(I, List, X) constraints X to be equal to the Ith variable (from 1) of List. This constraint is similar to fd_element/3 (section 8.8.2) but List can also contain FD variables (rather than just integers).

Errors
I is neither a variable nor an FD variable nor an integer    type_error(fd_variable, I)
X is neither a variable nor an FD variable nor an integer    type_error(fd_variable, X)
List is a partial list    instantiation_error
List is neither a partial list nor a list    type_error(list, List)
an element E of the List list is neither a variable nor an integer nor an FD variable    type_error(fd_variable, E)

Portability

GNU Prolog predicate.

8.8.4  fd_atmost/3, fd_atleast/3, fd_exactly/3

Templates
fd_atmost(+integer, +fd_variable_list, +integer)
fd_atleast(+integer, +fd_variable_list, +integer)
fd_exactly(+integer, +fd_variable_list, +integer)
Description

fd_atmost(N, List, V) posts the constraint that at most N variables of List are equal to the value V.

fd_atleast(N, List, V) posts the constraint that at least N variables of List are equal to the value V.

fd_exactly(N, List, V) posts the constraint that at exactly N variables of List are equal to the value V.

These constraints are special cases of fd_cardinality/2 (section 8.7.3) but their implementation is more efficient.

Errors
N is a variable    instantiation_error
N is neither a variable nor an integer    type_error(integer, N)
V is a variable    instantiation_error
V is neither a variable nor an integer    type_error(integer, V)
List is a partial list    instantiation_error
List is neither a partial list nor a list    type_error(list, List)
an element E of the List list is neither a variable nor an FD variable nor an integer    type_error(fd_variable, E)

Portability

GNU Prolog predicates.

8.8.5  fd_relation/2, fd_relationc/2

Templates
fd_relation(+integer_list_list, ?fd_variable_list)
fd_relationc(+integer_list_list, ?fd_variable_list)
Description

fd_relation(Relation, Vars) constraints the tuple of variables Vars to be equal to one tuple of the list Relation. A tuple is represented by a list.

Example: definition of the boolean AND relation so that X AND Y ⇔ Z:
and(X,Y,Z):-
        fd_relation([[0,0,0],[0,1,0],[1,0,0],[1,1,1]], [X,Y,Z]).
fd_relationc(Columns, Vars) is similar to fd_relation/2 except that the relation is not given as the list of tuples but as the list of the columns of the relation. A column is represented by a list.

Example:
and(X,Y,Z):-
        fd_relationc([[0,0,1,1],[0,1,0,1],[0,0,0,1]], [X,Y,Z]).
Errors
Relation is a partial list or a list with a sub-term E which is a variable    instantiation_error
Relation is neither a partial list nor a list    type_error(list, Relation)
an element E of the Relation list is neither a variable nor an integer    type_error(integer, E)
Vars is a partial list    instantiation_error
Vars is neither a partial list nor a list    type_error(list, Vars)
an element E of the Vars list is neither a variable nor an integer nor an FD variable    type_error(fd_variable, E)

Portability

GNU Prolog predicates.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog051.html0000644004425400513100000006310210547441640017303 0ustar diazloco Sockets input/output Previous Up Next

7.28  Sockets input/output

7.28.1  Introduction

This set of predicates provides a way to manipulate sockets. The predicates are straightforward interfaces to the corresponding BSD-type socket functions. This facility is available if the sockets part of GNU Prolog has been installed. A reader familiar with BSD sockets will understand them immediately otherwise a study of sockets is needed.

The domain is either the atom 'AF_INET' or 'AF_UNIX' corresponding to the same domains in BSD-type sockets.

An address is either of the form 'AF_INET'(HostName, Port) or 'AF_UNIX'(SocketName). HostName is an atom denoting a machine name, Port is a port number and SocketName is an atom denoting a socket.

By default, streams associated with sockets are block buffered. The predicate set_stream_buffering/2 (section 7.10.27) can be used to change this mode. They are also text streams by default. Use set_stream_type/2 (section 7.10.25) to change the type if binary streams are needed.

7.28.2  socket/2

Templates
socket(+socket_domain, -integer)
Description

socket(Domain, Socket) creates a socket whose domain is Domain (section 7.28) and unifies Socket with the descriptor identifying the socket. This predicate is an interface to the C Unix function socket(2).

Errors
Domain is a variable    instantiation_error
Domain is neither a variable nor an atom    type_error(atom, Domain)
Domain is an atom but not a valid socket domain    domain_error(socket_domain, Domain)
Socket is not a variable    type_error(variable, Socket)
an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

Portability

GNU Prolog predicate.

7.28.3  socket_close/1

Templates
socket_close(+integer)
Description

socket_close(Socket) closes the socket whose descriptor is Socket. This predicate should not be used if Socket has given rise to a stream, e.g. by socket_connect/4 (section 7.28.5). In that case simply use close/2 (section 7.10.7) on the associated stream.

Errors
Socket is a variable    instantiation_error
Socket is neither a variable nor an integer    type_error(integer, Socket)
an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

Portability

GNU Prolog predicate.

7.28.4  socket_bind/2

Templates
socket_bind(+integer, +socket_address)
Description

socket_bind(Socket, Address) binds the socket whose descriptor is Socket to the address specified by Address (section 7.28). If Address if of the form 'AF_INET'(HostName, Port) and if HostName is uninstantiated then it is unified with the current machine name. If Port is uninstantiated, it is unified to a port number picked by the operating system. This predicate is an interface to the C Unix function bind(2).

Errors
Socket is a variable    instantiation_error
Socket is neither a variable nor an integer    type_error(integer, Socket)
Address is a variable    instantiation_error
Address is neither a variable nor a valid address    domain_error(socket_address, Address)
Address = 'AF_UNIX'(E) and E is a variable    instantiation_error
Address = 'AF_UNIX'(E) or 'AF_INET'(E, _) and E is neither a variable nor an atom    type_error(atom, E)
Address = 'AF_UNIX'(E) and E is an atom but not a valid pathname    domain_error(os_path, E)
Address = 'AF_INET'(_, E) and E is neither a variable nor an integer    type_error(integer, E)
an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

Portability

GNU Prolog predicate.

7.28.5  socket_connect/4

Templates
socket_connect(+integer, +socket_address, -stream, -stream)
Description

socket_connect(Socket, Address, StreamIn, StreamOut) connects the socket whose descriptor is Socket to the address specified by Address (section 7.28). StreamIn is unified with a stream-term associated with the input of the connection (it is an input stream). Reading from this stream gets data from the socket. StreamOut is unified with a stream-term associated with the output of the connection (it is an output stream). Writing to this stream sends data to the socket. The use of select/5 can be useful (section 7.27.29). This predicate is an interface to the C Unix function connect(2).

Errors
Socket is a variable    instantiation_error
Socket is neither a variable nor an integer    type_error(integer, Socket)
Address is a variable    instantiation_error
Address is neither a variable nor a valid address    domain_error(socket_address, Address)
Address = 'AF_UNIX'(E) or 'AF_INET'(E, _) or Address = 'AF_INET'(_, E) and E is a variable    instantiation_error
Address = 'AF_UNIX'(E) or 'AF_INET'(E, _) and E is neither a variable nor an atom    type_error(atom, E)
Address = 'AF_UNIX'(E) and E is an atom but not a valid pathname    domain_error(os_path, E)
Address = 'AF_INET'(_, E) and E is neither a variable nor an integer    type_error(integer, E)
StreamIn is not a variable    type_error(variable, StreamIn)
StreamOut is not a variable    type_error(variable, StreamOut)
an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

Portability

GNU Prolog predicate.

7.28.6  socket_listen/2

Templates
socket_listen(+integer, +integer)
Description

socket_listen(Socket, Length) defines the socket whose descriptor is Socket to have a maximum backlog queue of Length pending connections. This predicate is an interface to the C Unix function listen(2).

Errors
Socket is a variable    instantiation_error
Socket is neither a variable nor an integer    type_error(integer, Socket)
Length is a variable    instantiation_error
Length is neither a variable nor an integer    type_error(integer, Length)
an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

Portability

GNU Prolog predicate.

7.28.7  socket_accept/4, socket_accept/3

Templates
socket_accept(+integer, -atom, -stream, -stream)
socket_accept(+integer, -stream, -stream)
Description

socket_accept(Socket, Client, StreamIn, StreamOut) extracts the first connection to the socket whose descriptor is Socket. If the domain is 'AF_INET', Client is unified with an atom whose name is the Internet host address in numbers-and-dots notation of the connecting machine. StreamIn is unified with a stream-term associated with the input of the connection (it is an input stream). Reading from this stream gets data from the socket. StreamOut is unified with a stream-term associated with the output of the connection (it is an output stream). Writing to this stream sends data to the socket. The use of select/5 can be useful (section 7.27.29). This predicate is an interface to the C Unix function accept(2).

socket_accept(Socket, StreamIn, StreamOut) is equivalent to socket_accept(Socket, _,
StreamIn, StreamOut)
.

Errors
Socket is a variable    instantiation_error
Socket is neither a variable nor an integer    type_error(integer, Socket)
Client is not a variable    type_error(variable, Client)
StreamIn is not a variable    type_error(variable, StreamIn)
StreamOut is not a variable    type_error(variable, StreamOut)
an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

Portability

GNU Prolog predicates.

7.28.8  hostname_address/2

Templates
hostname_address(+atom, ?atom)
hostname_address(?atom, +atom)
Description

hostname_address(HostName, HostAddress) succeeds if the Internet host address in numbers-and-dots notation of HostName is HostAddress. Hostname can be given as a fully qualified name, or an unqualified name or an alias of the machine. The predicate will fail if the machine name or address cannot be resolved.

Errors
HostName and HostAddress are variables    instantiation_error
HostName is neither a variable nor an atom    type_error(atom, HostName)
HostAddress is neither a variable nor an atom    type_error(atom, HostAddress)
Address is neither a variable nor a valid address    domain_error(socket_address, Address)

Portability

GNU Prolog predicate.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog043.html0000644004425400513100000003017210547441640017305 0ustar diazloco List processing Previous Up Next

7.20  List processing

These predicates manipulate lists. They are bootstrapped predicates (i.e. written in Prolog) and no error cases are tested (for the moment). However, since they are written in Prolog using other built-in predicates, some errors can occur due to those built-in predicates.

7.20.1  append/3

Templates
append(?list, ?list, ?list)
Description

append(List1, List2, List12) succeeds if the concatenation of the list List1 and the list List2 is the list List12. This predicate is re-executable on backtracking (e.g. if List12 is instantiated and both List1 and List2 are variable).

Errors

None.

Portability

GNU Prolog predicate.

7.20.2  member/2, memberchk/2

Templates
member(?term, ?list)
memberchk(?term, ?list)
Description

member(Element, List) succeeds if Element belongs to the List. This predicate is re-executable on backtracking and can be thus used to enumerate the elements of List.

memberchk/2 is similar to member/2 but only succeeds once.

Errors

None.

Portability

GNU Prolog predicate.

7.20.3  reverse/2

Templates
reverse(?list, ?list)
Description

reverse(List1, List2) succeeds if List2 unifies with the list List1 in reverse order.

Errors

None.

Portability

GNU Prolog predicate.

7.20.4  delete/3, select/3

Templates
delete(?list, ?term, ?list)
select(?term, ?list, ?list)
Description

delete(List1, Element, List2) removes all occurrences of Element in List1 to provide List2. A strict term equality is required, cf. (==)/2 (section 7.3.2).

select(Element, List1, List2) removes one occurrence of Element in List1 to provide List2. This predicate is re-executable on backtracking.

Errors

None.

Portability

GNU Prolog predicate.

7.20.5  permutation/2

Templates
permutation(?list, ?list)
Description

permutation(List1, List2) succeeds if List2 is a permutation of the elements of List1. This predicate is re-executable on backtracking.

Errors

None.

Portability

GNU Prolog predicate.

7.20.6  prefix/2, suffix/2

Templates
prefix(?list, ?list)
suffix(?list, ?list)
Description

prefix(Prefix, List) succeeds if Prefix is a prefix of List. This predicate is re-executable on backtracking.

suffix(Suffix, List) succeeds if Suffix is a suffix of List. This predicate is re-executable on backtracking.

Errors

None.

Portability

GNU Prolog predicate.

7.20.7  sublist/2

Templates
sublist(?list, ?list)
Description

sublist(List1, List2) succeeds if List1 is a sub-list of List2. This predicate is re-executable on backtracking.

Errors

None.

Portability

GNU Prolog predicate.

7.20.8  last/2

Templates
last(?list, ?term)
Description

last(List, Element) succeeds if Element is the last element of List.

Errors

None.

Portability

GNU Prolog predicate.

7.20.9  length/2

Templates
length(?list, ?integer)
Description

length(List, Length) succeeds if Length is the length of List.

Errors

None.

Portability

GNU Prolog predicate.

7.20.10  nth/3

Templates
nth(?integer, ?list, ?term)
Description

nth(N, List, Element) succeeds if the Nth argument of List is Element.

Errors

None.

Portability

GNU Prolog predicate.

7.20.11  max_list/2, min_list/2, sum_list/2

Templates
min_list(+list, ?number)
max_list(+list, ?number)
sum_list(+list, ?number)
Description

min_list(List, Min) succeeds if Min is the smallest number in List.

max_list(List, Max) succeeds if Max is the largest number in List.

sum_list(List, Sum) succeeds if Sum is the sum of all the elements in List.

List must be a list of arithmetic evaluable terms (section 7.6.1).

Errors

None.

Portability

GNU Prolog predicate.

7.20.12  sort/2, sort0/2, keysort/2 sort/1, sort0/1, keysort/1

Templates
sort(+list, ?list)
sort0(+list, ?list)
keysort(+list, ?list)
sort(+list)
sort0(+list)
keysort(+list)
Description

sort(List1, List2) succeeds if List2 is the sorted list corresponding to List1 where duplicate elements are merged.

sort0/2 is similar to sort/2 except that duplicate elements are not merged.

keysort(List1, List2) succeeds if List2 is the sorted list of List1 according to the keys. The list List1 consists of items of the form Key-Value. These items are sorted according to the value of Key yielding the List2. Duplicate keys are not merged. This predicate is stable, i.e. if K-A occurs before K-B in the input, then K-A will occur before K-B in the output.

sort/1, sort0/1 and keysort/1 are similar to sort/2, sort0/2 and keysort/2 but achieve a sort in-place destructing the original List1 (this in-place assignment is not undone at backtracking). The sorted list occupies the same memory space as the original list (saving thus memory consumption).

The time complexity of these sorts is O(N log N), N being the length of the list to sort.

These predicates refer to the standard ordering of terms (section 7.3.1).

Errors
List1 is a partial list    instantiation_error
List1 is neither a partial list nor a list    type_error(list, List1)
List2 is neither a partial list nor a list    type_error(list, List2)

Portability

GNU Prolog predicates.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog026.html0000644004425400513100000001351610547441640017311 0ustar diazloco Term comparison Previous Up Next

7.3  Term comparison

7.3.1  Standard total ordering of terms

The built-in predicates described in this section allows the user to compare Prolog terms. Prolog terms are totally ordered according to the standard total ordering of terms which is as follows (from the smallest term to the greatest):
  • variables, oldest first.

  • finite domain variables (section 8.1.1), oldest first.

  • floating point numbers, in numeric order.

  • integers, in numeric order.

  • atoms, in alphabetical (i.e. character code) order.

  • compound terms, ordered first by arity, then by the name of the principal functor and by the arguments in left-to-right order.
A list is treated as a compound term (whose principal functor is '.'/2).

The portability of the order of variables is not guaranteed (in the ISO reference the oder of variables is system dependent).

7.3.2  (==)/2 - term identical, (\==)/2 - term not identical,
(@<)/2 - term less than, (@=<)/2 - term less than or equal to,
(@>)/2 - term greater than, (@>=)/2 - term greater than or equal to

Templates
==(?term, ?term)
\==(?term, ?term)
@<(?term, ?term)
@=<(?term, ?term)
@>(?term, ?term)
@>=(?term, ?term)
Description

These predicates compare two terms according to the standard total ordering of terms (section 7.3.1).

Term1 == Term2 succeeds if Term1 and Term2 are equal.

Term1 \== Term2 succeeds if Term1 and Term2 are different.

Term1 @< Term2 succeeds if Term1 is less than Term2.

Term1 @=< Term2 succeeds if Term1 is less than or equal to Term2.

Term1 @> Term2 succeeds if Term1 is greater than Term2.

Term1 @>= Term2 succeeds if Term1 is greater than or equal to Term2.

==, \==, @<, @=<, @> and @>= are predefined infix operators (section 7.14.10).

Errors

None.

Portability

ISO predicates.

7.3.3  compare/3

Templates
compare(?atom, +term, +term)
Description

compare(Result, Term1, Term2) compares Term1 and Term2 according to the standard (section 7.3.1) and unifies Result with:
  • the atom < if Term1 is less than Term2.

  • the atom = if Term1 and Term2 are equal.

  • the atom > if Term1 is greater than Term2.
Errors
Result is neither a variable nor an atom    type_error(atom, Result)

Portability

GNU Prolog predicate.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog052.html0000644004425400513100000001642110547441640017306 0ustar diazloco Linedit management Previous Up Next

7.29  Linedit management

The following predicates are only available if the linedit part of GNU Prolog has been installed.

7.29.1  get_linedit_prompt/1

Templates
get_linedit_prompt(?atom)
Description

get_linedit_prompt(Prompt) succeeds if Prompt is the current linedit prompt, e.g. the top-level prompt is '| ?-'. By default all other reads have an empty prompt.

Errors
Prompt is neither a variable nor an atom    type_error(atom, Pred)

Portability

GNU Prolog predicate.

7.29.2  set_linedit_prompt/1

Templates
set_linedit_prompt(+atom)
Description

set_linedit_prompt(Prompt) sets the current linedit prompt to Prompt. This prompt will be displayed for reads from a terminal (except for top-level reads).

Errors
Prompt is a variable    instantiation_error
Prompt is neither a variable nor an atom    type_error(atom, Pred)

Portability

GNU Prolog predicate.

7.29.3  add_linedit_completion/1

Templates
add_linedit_completion(+atom)
Description

add_linedit_completion(Word) adds Word in the list of completion words maintained by linedit (section 3.2.5). Only words containing letters, digits and the underscore character are added (if Word does not respect this restriction the predicate fails).

Errors
Word is a variable    instantiation_error
Word is neither a variable nor an atom    type_error(atom, Word)

Portability

GNU Prolog predicate.

7.29.4  find_linedit_completion/2

Templates
find_linedit_completion(+atom, ?atom)
Description

find_linedit_completion(Prefix, Word) succeeds if Word is a word beginning by Prefix and belongs to the list of completion words maintained by linedit (section 3.2.5). This predicate is re-executable on backtracking.

Errors
Prefix is a variable    instantiation_error
Prefix is neither a variable nor an atom    type_error(atom, Prefix)
Word is neither a variable nor an atom    type_error(atom, Word)

Portability

GNU Prolog predicate.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog061.html0000644004425400513100000003460110547441640017306 0ustar diazloco Boolean and reified constraints Previous Up Next

8.7  Boolean and reified constraints

8.7.1  Boolean FD expressions

An boolean FD expression is a Prolog term built from integers (0 for false, 1 for true), variables (Prolog or FD variables), partial AC arithmetic constraints (section 8.6.2), full AC arithmetic constraints (section 8.6.3) and functors (or operators) that represent boolean functions. When a sub-expression of a boolean expression is an arithmetic constraint c, it is reified. Namely, as soon as the solver detects that c is true (i.e. entailed) the sub-expression has the value 1. Similarly when the solver detects that c is false (i.e. disentailed) the sub-expression evaluates as 0. While neither the entailment nor the disentailment can be detected the sub-expression is evaluated as a domain 0..1. The following table details the components of an FD boolean expression:
FD Expression Result
Prolog variable domain 0..1
FD variable X domain of X, X is constrained to be in 0..1
0 (integer) 0 (false)
1 (integer) 1 (true)
#\ E not E
E1 #<=> E2 E1 equivalent to E2
E1 #\<=> E2 E1 not equivalent to E2 (i.e. E1 different from E2)
E1 ## E2 E1 exclusive OR E2 (i.e. E1 not equivalent to E2)
E1 #==> E2 E1 implies E2
E1 #\==> E2 E1 does not imply E2
E1 #/\ E2 E1 AND E2
E1 #\/\ E2 E1 NAND E2
E1 #\/ E2 E1 OR E2
E1 #\\/ E2 E1 NOR E2

#<=>, #\<=>, ##, #==>, #\==>, #/\, #\/\, #\/ and #\\/ are predefined infix operators. #\ is a predefined prefix operator (section 7.14.10).

Errors
a sub-expression E is neither a variable nor an integer (0 or 1) nor an FD boolean functor nor reified constraint    type_error(fd_bool_evaluable, E)
an expression is too complex    resource_error(too_big_fd_constraint)
a sub-expression is an invalid reified constraint    an arithmetic constraint error (section 8.6.1)

8.7.2  (#\)/1 - constraint NOT, (#<=>)/2 - constraint equivalent,
(#\<=>)/2 - constraint different, (##)/2 - constraint XOR,
(#==>)/2 - constraint imply, (#\==>)/2 - constraint not imply,
(#/\)/2 - constraint AND, (#\/\)/2 - constraint NAND,
(#\/)/2 - constraint OR, (#\\/)/2 - constraint NOR

Templates
#\(?fd_bool_evaluable)
#<=>(?fd_bool_evaluable, ?fd_bool_evaluable)
#\<=>(?fd_bool_evaluable, ?fd_bool_evaluable)
##(?fd_bool_evaluable, ?fd_bool_evaluable)
#==>(?fd_bool_evaluable, ?fd_bool_evaluable)
#\==>(?fd_bool_evaluable, ?fd_bool_evaluable)
#/\(?fd_bool_evaluable, ?fd_bool_evaluable)
#\/\(?fd_bool_evaluable, ?fd_bool_evaluable)
#\/(?fd_bool_evaluable, ?fd_bool_evaluable)
#\\/(?fd_bool_evaluable, ?fd_bool_evaluable)
Description

#\= FdBoolExpr1 constraints FdBoolExpr1 to be false.

FdBoolExpr1 #<=> FdBoolExpr2 constrains FdBoolExpr1 to be equivalent to FdBoolExpr2.

FdBoolExpr1 #\<=> FdBoolExpr2 constrains FdBoolExpr1 to be equivalent to not FdBoolExpr2.

FdBoolExpr1 ## FdBoolExpr2 constrains FdBoolExpr1 XOR FdBoolExpr2 to be true

FdBoolExpr1 #==> FdBoolExpr2 constrains FdBoolExpr1 to imply FdBoolExpr2.

FdBoolExpr1 #\==> FdBoolExpr2 constrains FdBoolExpr1 to not imply FdBoolExpr2.

FdBoolExpr1 #/\ FdBoolExpr2 constrains FdBoolExpr1 AND FdBoolExpr2 to be true.

FdBoolExpr1 #\/\ FdBoolExpr2 constrains FdBoolExpr1 AND FdBoolExpr2 to be false.

FdBoolExpr1 #\/ FdBoolExpr2 constrains FdBoolExpr1 OR FdBoolExpr2 to be true.

FdBoolExpr1 #\\/ FdBoolExpr2 constrains FdBoolExpr1 OR FdBoolExpr2 to be false.

FdBoolExpr1 and FdBoolExpr2 are boolean FD expressions (section 8.7.1).

Note that #\<=> (not equivalent) and ## (exclusive or) are synonymous.

These predicates post boolean constraints that are managed by the FD solver using a partial arc-consistency algorithm to reduce the domain of involved variables. The (dis)entailment of reified constraints is detected using either the bounds (for partial AC arithmetic constraints) or the full domain (for full AC arithmetic constraints).

#<=>, #\<=>, ##, #==>, #\==>, #/\, #\/\, #\/ and #\\/ are predefined infix operators. #\ is a predefined prefix operator (section 7.14.10).

Errors

Refer to the syntax of boolean FD expressions for possible errors (section 8.7.1).

Portability

GNU Prolog predicates.

8.7.3  fd_cardinality/2, fd_cardinality/3, fd_at_least_one/1, fd_at_most_one/1,
fd_only_one/1

Templates
fd_cardinality(+fd_bool_evaluable_list, ?fd_variable)
fd_cardinality(+integer, ?fd_variable, +integer)
fd_at_least_one(+fd_bool_evaluable_list)
fd_at_most_one(+fd_bool_evaluable_list)
fd_only_one(+fd_bool_evaluable_list)
Description

fd_cardinality(List, Count) unifies Count with the number of constraints that are true in List. This is equivalent to post the constraint B1 + B2 + ...+ Bn #= Count where each variable Bi is a new variable defined by the constraint Bi #<=> Ci where Ci is the ith constraint of List. Each Ci must be a boolean FD expression (section 8.7.1).

fd_cardinality(Lower, List, Upper) is equivalent to fd_cardinality(List, Count), Lower #=< Count, Count #=< Upper

fd_at_least_one(List) is equivalent to fd_cardinality(List, Count), Count #>= 1.

fd_at_most_one(List) is equivalent to fd_cardinality(List, Count), Count #=< 1.

fd_only_one(List) is equivalent to fd_cardinality(List, 1).

Errors
List is a partial list    instantiation_error
List is neither a partial list nor a list    type_error(list, List)
Count is neither an FD variable nor an integer    type_error(fd_variable, Count)
Lower is a variable    instantiation_error
Lower is neither a variable nor an integer    type_error(integer, Lower)
Upper is a variable    instantiation_error
Upper is neither a variable nor an integer    type_error(integer, Upper)
an element E of the List list is an invalid boolean expression    an FD boolean constraint (section 8.7.1)

Portability

GNU Prolog predicates.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog-idx.html0000644004425400513100000024376310547441640017654 0ustar diazloco Index Previous Up

Index



Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up ./gprolog-1.3.0/doc/html_node/gprolog019.html0000644004425400513100000003676210547441640017323 0ustar diazloco Errors Previous Up

5.3  Errors

5.3.1  General format and error context

When an error occurs an exception of the form: error(ErrorTerm, Caller) is raised. ErrorTerm is a term specifying the error (detailed in next sections) and Caller is a term specifying the context of the error. The context is either the predicate indicator of the last invoked built-in predicate or an atom giving general context information.

Using exceptions allows the user both to recover an error using catch/3 (section 6.2.4) and to raise an error using throw/1 (section 6.2.4).

To illustrate how to write error cases, let us write a predicate my_pred(X) where X must be an integer:
my_pred(X) :-
        (   nonvar(X) ->
            true
        ;   throw(error(instantiation_error), my_pred/1)),
        ),
        (   integer(X) ->
            true
        ;   throw(error(type_error(integer, X), my_pred/1))
        ),
        ...
To help the user to write these error cases, a set of system predicates is provided to raise errors. These predicates are of the form '$pl_err_...' and they all refer to the implicit error context. The predicates set_bip_name/2 (section 7.22.3) and current_bip_name/2 (section 7.22.4) are provided to set and recover the name and the arity associated with this context (an arity < 0 means that only the atom corresponding to the functor is significant). Using these system predicates the user could define the above predicate as follow:
my_pred(X) :-
        set_bip_name(my_pred,1),
        (   nonvar(X) ->
            true
        ;   '$pl_err_instantiation'
        ),
        (   integer(X) ->
            true
        ;   '$pl_err_type'(integer, X)
        ),
        ...
The following sections detail each kind of errors (and associated system predicates).

5.3.2  Instantiation error

An instantiation error occurs when an argument or one of its components is variable while an instantiated argument was expected. ErrorTerm has the following form: instantiation_error.

The system predicate '$pl_err_instantiation' raises this error in the current error context (section 5.3.1).

5.3.3  Type error

A type error occurs when the type of an argument or one of its components is not the expected type (but not a variable). ErrorTerm has the following form: type_error(Type, Culprit) where Type is the expected type and Culprit the argument which caused the error. Type is one of:
  • atom

  • atomic

  • boolean

  • byte

  • callable

  • character

  • compound

  • evaluable

  • fd_bool_evaluable

  • fd_evaluable

  • fd_variable

  • float

  • in_byte

  • in_character

  • integer

  • list

  • number

  • predicate_indicator

  • variable
The system predicate '$pl_err_type'(Type, Culprit) raises this error in the current error context (section 5.3.1).

5.3.4  Domain error

A domain error occurs when the type of an argument is correct but its value is outside the expected domain. ErrorTerm has the following form: domain_error(Domain, Culprit) where Domain is the expected domain and Culprit the argument which caused the error. Domain is one of:
  • atom_property

  • buffering_mode

  • character_code_list

  • close_option

  • date_time

  • eof_action

  • fd_labeling_option

  • flag_value

  • format_control_sequence

  • g_array_index

  • io_mode

  • non_empty_list

  • not_less_than_zero

  • operator_priority

  • operator_specifier

  • os_file_permission

  • os_file_property

  • os_path

  • predicate_property

  • prolog_flag

  • read_option

  • selectable_item

  • socket_address

  • socket_domain

  • source_sink

  • statistics_key

  • statistics_value

  • stream

  • stream_option

  • stream_or_alias

  • stream_position

  • stream_property

  • stream_seek_method

  • stream_type

  • term_stream_or_alias

  • var_binding_option

  • write_option
The system predicate '$pl_err_domain'(Domain, Culprit) raises this error in the current error context (section 5.3.1).

5.3.5  Existence error

an existence error occurs when an object on which an operation is to be performed does not exist. ErrorTerm has the following form: existence_error(Object, Culprit) where Object is the type of the object and Culprit the argument which caused the error. Object is one of:
  • procedure

  • source_sink

  • stream
The system predicate '$pl_err_existence'(Object, Culprit) raises this error in the current error context (section 5.3.1).

5.3.6  Permission error

A permission error occurs when an attempt to perform a prohibited operation is made. ErrorTerm has the following form: permission_error(Operation, Permission, Culprit) where Operation is the operation which caused the error, Permission the type of the tried permission and Culprit the argument which caused the error. Operation is one of:
  • access

  • add_alias

  • close

  • create

  • input

  • modify

  • open

  • output

  • reposition
and Permission is one of:
  • binary_stream

  • flag

  • operator

  • past_end_of_stream

  • private_procedure

  • source_sink

  • static_procedure

  • stream

  • text_stream
The system predicate '$pl_err_permission'(Operation, Permission, Culprit) raises this error in the current error context (section 5.3.1).

5.3.7  Representation error

A representation error occurs when an implementation limit has been breached. ErrorTerm has the following form: representation_error(Limit) where Limit is the name of the reached limit. Limit is one of:
  • character

  • character_code

  • in_character_code

  • max_arity

  • max_integer

  • min_integer

  • too_many_variables
The errors max_integer and min_integer are not currently implemented.

The system predicate '$pl_err_representation'(Limit) raises this error in the current error context (section 5.3.1).

5.3.8  Evaluation error

An evaluation error occurs when an arithmetic expression gives rise to an exceptional value. ErrorTerm has the following form: evaluation_error(Error) where Error is the name of the error. Error is one of:
  • float_overflow

  • int_overflow

  • undefined

  • underflow

  • zero_divisor
The errors float_overflow, int_overflow, undefined and underflow are not currently implemented.

The system predicate '$pl_err_evaluation'(Error) raises this error in the current error context (section 5.3.1).

5.3.9  Resource error

A resource error occurs when GNU Prolog does not have enough resources. ErrorTerm has the following form: resource_error(Resource) where Resource is the name of the resource. Resource is one of:
  • print_object_not_linked

  • too_big_fd_constraint

  • too_many_open_streams
The system predicate '$pl_err_resource'(Resource) raises this error in the current error context (section 5.3.1).

5.3.10  Syntax error

A syntax error occurs when a sequence of character does not conform to the syntax of terms. ErrorTerm has the following form: syntax_error(Error) where Error is an atom explaining the error.

The system predicate '$pl_err_syntax'(Error) raises this error in the current error context (section 5.3.1).

5.3.11  System error

A system error can occur at any stage. A system error is generally associated with an external component (e.g. operating system). ErrorTerm has the following form: system_error(Error) where Error is an atom explaining the error. This is an extension to ISO which only defines system_error without arguments.

The system predicate '$pl_err_system'(Error) raises this error in the current error context (section 5.3.1).


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up ./gprolog-1.3.0/doc/html_node/gprolog042.html0000644004425400513100000011214010547441640017300 0ustar diazloco Atomic term processing Previous Up Next

7.19  Atomic term processing

These built-in predicates enable atomic terms to be processed as a sequence of characters and character codes. Facilities exist to split and join atoms, to convert a single character to and from the corresponding character code, and to convert a number to and from a list of characters and character codes.

7.19.1  atom_length/2

Templates
atom_length(+atom, ?integer)
Description

atom_length(Atom, Length) succeeds if Length unifies with the number of characters of the name of Atom.

Errors
Atom is a variable    instantiation_error
Atom is neither a variable nor an atom    type_error(atom, Atom)
Length is neither a variable nor an integer    type_error(integer, Length)
Length is an integer < 0    domain_error(not_less_than_zero, Length)

Portability

ISO predicate.

7.19.2  atom_concat/3

Templates
atom_concat(+atom, +atom, ?atom)
atom_concat(?atom, ?atom, +atom)
Description

atom_concat(Atom1, Atom2, Atom12) succeeds if the name of Atom12 is the concatenation of the name of Atom1 with the name of Atom1. This predicate is re-executable on backtracking (e.g. if Atom12 is instantiated and both Atom1 and Atom2 are variables).

Errors
Atom1 and Atom12 are variables    instantiation_error
Atom2 and Atom12 are variables    instantiation_error
Atom1 is neither a variable nor an atom    type_error(atom, Atom1)
Atom2 is neither a variable nor an atom    type_error(atom, Atom2)
Atom12 is neither a variable nor an atom    type_error(atom, Atom12)

Portability

ISO predicate.

7.19.3  sub_atom/5

Templates
sub_atom(+atom, ?integer, ?integer, ?integer, ?atom)
Description

sub_atom(Atom, Before, Length, After, SubAtom) succeeds if atom Atom can be split into three atoms, AtomL, SubAtom and AtomR such that Before is the number of characters of the name of AtomL, Length is the number of characters of the name of SubAtom and After is the number of characters of the name of AtomR. This predicate is re-executable on backtracking.

Errors
Atom is a variable    instantiation_error
Atom is neither a variable nor an atom    type_error(atom, Atom)
SubAtom is neither a variable nor an atom    type_error(atom, SubAtom)
Before is neither a variable nor an integer    type_error(integer, Before)
Length is neither a variable nor an integer    type_error(integer, Length)
After is neither a variable nor an integer    type_error(integer, After)
Before is an integer < 0    domain_error(not_less_than_zero, Before)
Length is an integer < 0    domain_error(not_less_than_zero, Length)
After is an integer < 0    domain_error(not_less_than_zero, After)

Portability

ISO predicate.

7.19.4  char_code/2

Templates
char_code(+character, ?character_code)
char_code(-character, +character_code)
Description

char_code(Char, Code) succeeds if the character code for the one-char atom Char is Code.

Errors
Char and Code are variables    instantiation_error
Char is neither a variable nor a one-char atom    type_error(character, Char)
Code is neither a variable nor an integer    type_error(integer, Code)
Code is an integer but not a character code    representation_error(character_code)

Portability

ISO predicate.

7.19.5  lower_upper/2

Templates
lower_upper(+character, ?character)
lower_upper(-character, +character)
Description

lower_upper(Char1, Char2) succeeds if Char1 and Char2 are one-char atoms and if Char2 is the upper conversion of Char1. If Char1 (resp. Char2) is a character that is not a lower (resp. upper) letter then Char2 is equal to Char1.

Errors
Char1 and Char2 are variables    instantiation_error
Char1 is neither a variable nor a one-char atom    type_error(character, Char1)
Char2 is neither a variable nor a one-char atom    type_error(character, Char2)

Portability

GNU Prolog predicate.

7.19.6  atom_chars/2, atom_codes/2

Templates
atom_chars(+atom, ?character_list)
atom_chars(-atom, +character_list)
atom_codes(+atom, ?character_code_list)
atom_codes(-atom, +character_code_list)
Description

atom_chars(Atom, Chars) succeeds if Chars is the list of one-char atoms whose names are the successive characters of the name of Atom.

atom_codes(Atom, Codes) is similar to atom_chars/2 but deals with a list of character codes.

Errors
Atom is a variable and Chars (or Codes) is a partial list or a list with an element which is a variable    instantiation_error
Atom is neither a variable nor an atom    type_error(atom, Atom)
Chars is neither a list nor a partial list    type_error(list, Chars)
Codes is neither a list nor a partial list    type_error(list, Codes)
Atom is a variable and an element E of the list Chars is neither a variable nor a one-char atom    type_error(character, E)
Atom is a variable and an element E of the list Codes is neither a variable nor an integer    type_error(integer, E)
Atom is a variable and an element E of the list Codes is an integer but not a character code    representation_error(character_code)

Portability

ISO predicates. The ISO reference only causes a type_error(list, Chars) if Atom is a variable and Chars is neither a list nor a partial list. GNU Prolog always checks if Chars is a list. Similarly for Codes. The type_error(integer, E) when an element E of the Codes is not an integer is a GNU Prolog extension. This seems to be an omission in the ISO reference since this error is detected for many other built-in predicates accepting a character code (e.g. char_code/2, put_code/2).

7.19.7  number_atom/2, number_chars/2, number_codes/2

Templates
number_atom(+number, ?atom)
number_atom(-number, +atom)
number_chars(+number, ?character_list)
number_chars(-number, +character_list)
number_codes(+number, ?character_code_list)
number_codes(-number, +character_code_list)
Description

number_atom(Number, Atom) succeeds if Atom is an atom whose name corresponds to the characters of Number.

number_chars(Number, Chars) is similar to number_atom/2 but deals with a list of character codes.

number_codes(Number, Codes) is similar to number_atom/2 but deals with a list of characters.

Errors
Number and Atom are variables    instantiation_error
Number is a variable and Chars (or Codes) is a partial list or a list with an element which is a variable    instantiation_error
Number is neither a variable nor an number    type_error(number, Number)
Atom is neither a variable nor an atom    type_error(atom, Atom)
Number is a variable and Chars is neither a list nor a partial list    type_error(list, Chars)
Number is a variable and Codes is neither a list nor a partial list    type_error(list, Codes)
Number is a variable and an element E of the list Chars is neither a variable nor a one-char atom    type_error(character, E)
Number is a variable and an element E of the list Codes is neither a variable nor an integer    type_error(integer, E)
Number is a variable and an element E of the list Codes is an integer but not a character code    representation_error(character_code)
Number is a variable, Atom (or Chars or Codes) cannot be parsed as a number and the value of the syntax_error Prolog flag is error (section 7.22.1)    syntax_error(atom explaining the error)

Portability

number_atom/2 is a GNU Prolog predicate. number_chars/2 and number_codes/2 are ISO predicates.

GNU Prolog only raises an error about an element E of the Chars (or Codes) list when Number is a variable while the ISO reference always check this. This seems an error since the list itself is only checked if Number is a variable.

The type_error(integer, E) when an element E of the Codes is not an integer is a GNU Prolog extension. This seems to be an omission in the ISO reference since this error is detected for many other built-in predicates accepting a character code (e.g. char_code/2, put_code/2).

7.19.8  name/2

Templates
name(+atomic, ?character_code_list)
name(-atomic, +character_code_list)
Description

name(Constant, Codes) succeeds if Codes is a list whose elements are the character codes corresponding to the successive characters of Constant (a number or an atom). However, there atoms are for which name(Constant, Codes) is true, but which will not be constructed if name/2 is called with Constant uninstantiated, e.g. the atom '1024'. For this reason the use of name/2 is discouraged and should be limited to compatibility purposes. It is preferable to use atom_codes/2 (section 7.19.6) or number_chars/2 (section 7.19.7).

Errors
Constant is a variable and Codes is a partial list or a list with an element which is a variable    instantiation_error
Constant is neither a variable nor an atomic term    type_error(atomic, Constant)
Constant is a variable and Codes is neither a list nor a partial list    type_error(list, Codes)
Constant is a variable and an element E of the list Codes is neither a variable nor an integer    type_error(integer, E)
Constant is a variable and an element E of the list Codes is an integer but not a character code    representation_error(character_code)

Portability

GNU Prolog predicate.

7.19.9  atom_hash/2

Templates
atom_hash(+atom, ?integer)
atom_hash(?atom, +integer)
Description

atom_hash(Atom, Hash) succeeds if Hash is the internal key associated with Atom (an existing atom). The internal key of an atom is a unique integer ≥ 0 and < to the max_atom Prolog flag (section 7.22.1).

Errors
Atom and Hash are both variables    instantiation_error
Atom is neither a variable nor an atom    type_error(atom, Atom)
Hash is neither a variable nor an integer    type_error(integer, Hash)
Hash is an integer < 0    domain_error(not_less_than_zero, Hash)

Portability

GNU Prolog predicate.

7.19.10  new_atom/3, new_atom/2, new_atom/1

Templates
new_atom(+atom, +integer, -atom)
new_atom(+atom, -atom)
new_atom(-atom)
Description

new_atom(Prefix, Hash, Atom) unifies Atom with a new atom whose name begins with the characters of the name of Prefix and whose internal key is Hash (section 7.19.9). This predicate is then a symbol generator. It is guaranteed that Atom does not exist before the invocation of new_atom/3. The characters appended to Prefix to form Atom are in: A-Z (capital letter), a-z (small letter), 0-9 (digit), #, $, &, _, @.

new_atom/2 is similar to new_atom/3, but the atom generated can have any (free) internal key.

new_atom/1 is similar to new_atom(atom_, Atom), i.e. the generated atom begins with atom_.

Errors
Prefix is a variable    instantiation_error
Hash is a variable    instantiation_error
Prefix is neither a variable nor an atom    type_error(atom, Prefix)
Hash is neither a variable nor an integer    type_error(integer, Hash)
Hash is an integer < 0    domain_error(not_less_than_zero, Hash)
Atom is not a variable    type_error(variable, Atom)

Portability

GNU Prolog predicate.

7.19.11  current_atom/1

Templates
current_atom(?atom)
Description

current_atom(Atom) succeeds if there exists an atom that unifies with Atom. All atoms are found except those beginning with a '$' (system atoms). This predicate is re-executable on backtracking.

Errors
Atom is neither a variable nor an atom    type_error(atom, Atom)

Portability

GNU Prolog predicate.

7.19.12  atom_property/2

Templates
atom_property(?atom, ?atom_property)
Description

atom_property(Atom, Property) succeeds if current_atom(Atom) succeeds (section 7.19.11) and if Property unifies with one of the properties of the atom. This predicate is re-executable on backtracking.

Atom properties:
  • length(Length): Length is the length of the name of the atom.

  • hash(Hash): Hash is the internal key of the atom (section 7.19.9).

  • prefix_op: if there is a prefix operator currently defined with this name.

  • infix_op: if there is an infix operator currently defined with this name.

  • postfix_op: if there is a postfix operator currently defined with this name.

  • needs_quotes: if the atom must be quoted to be read later.

  • needs_scan: if the atom must be scanned when output to be read later (e.g. contains special characters that must be output with a \ escape sequence).
Errors
Atom is neither a variable nor an atom    type_error(atom, Atom)
Property is neither a variable nor a n atom property term    domain_error(atom_property, Property)
Property = length(E) or hash(E) and E is neither a variable nor an integer    type_error(integer, E)

Portability

GNU Prolog predicate.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog049.html0000644004425400513100000002413510547441640017315 0ustar diazloco File name processing Previous Up Next

7.26  File name processing

7.26.1  absolute_file_name/2

Templates
absolute_file_name(+atom, atom)
Description

absolute_file_name(File1, File2) succeeds if File2 is the absolute pathname associated with the relative file name File1. File1 can contain $VAR_NAME sub-strings. When such a sub-string is encountered, it is expanded with the value of the environment variable whose name is VAR_NAME if exists (otherwise no expansion is done). File1 can also begin with a sub-string ~USER_NAME/, this is expanded as the home directory of the user USER_NAME. If USER_NAME does not exist File1 is an invalid pathname. If no USER_NAME is given (i.e. File1 begins with ~/) the ~ character is expanded as the value of the environment variable HOME. If the HOME variable is not defined File1 is an invalid pathname. Relative references to the current directory (/./ sub-string) and to the parent directory (/../ sub-strings) are removed and no longer appear in File2. File1 is also invalid if it contains too many /../ consecutive sub-strings (i.e. parent directory relative references). Finally if File1 is user then File2 is also unified with user to allow this predicate to be called on Prolog file names (since user in DEC-10 input/output predicates denotes the current input/output stream).

Most predicates using a file name implicitly call this predicate to obtain the desired file, e.g. open/4.

Errors
File1 is a variable    instantiation_error
File1 is neither a variable nor an atom    type_error(atom, File1)
File2 is neither a variable nor an atom    type_error(atom, File2)
File1 is an atom but not a valid pathname    domain_error(os_path, File1)

Portability

GNU Prolog predicate.

7.26.2  decompose_file_name/4

Templates
decompose_file_name(+atom, ?atom, ?atom, ?atom)
Description

decompose_file_name(File, Directory, Prefix, Suffix) decomposes the pathname File and extracts the Directory part (characters before the last /), the Prefix part (characters after the last / and before the last . or until the end if there is no suffix) and the Suffix part (characters from the last . to the end of the string).

Errors
File is a variable    instantiation_error
File is neither a variable nor an atom    type_error(atom, File)
Directory is neither a variable nor an atom    type_error(atom, Directory)
Prefix is neither a variable nor an atom    type_error(atom, Prefix)
Suffix is neither a variable nor an atom    type_error(atom, Suffix)

Portability

GNU Prolog predicate.

7.26.3  prolog_file_name/2

Templates
prolog_file_name(+atom, ?atom)
Description

prolog_file_name(File1, File2) unifies File2 with the Prolog file name associated with File1. More precisely File2 is computed as follows:
  • if File1 has a suffix or if it is user then File2 is unified with File1.

  • else if the file whose name is File1 + '.pl' exists then File2 is unified with this name.

  • else if the file whose name is File1 + '.pro' exists then File2 is unified with this name.

  • else File2 is unified with the name File1 + '.pl'.
This predicate uses absolute_file_name/2 to check the existence of a file (section 7.26.1).

Errors
File1 is a variable    instantiation_error
File1 is neither a variable nor an atom    type_error(atom, File1)
File2 is neither a variable nor an atom    type_error(atom, File2)
File1 is an atom but not a valid pathname    domain_error(os_path, File1)

Portability

GNU Prolog predicate.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/next_motif.gif0000644004425400513100000000047510547441640017365 0ustar diazlocoGIF89añp€ÿÿp€!þ# Imported from XPM image: next.xpm!ù,@çÜ63333ÆB! Ã0 A0 Ã0 Ã0  0 ƒÁ`0 ƒÁ`0 ƒA @ ƒÁ`0 ƒÁ`00000000000000000000000000000000000000000000  000000 0000000000000000000000000000`À€ ;./gprolog-1.3.0/doc/html_node/gprolog021.html0000644004425400513100000003611610547441640017305 0ustar diazloco Prolog directives Up Next

6.1  Prolog directives

6.1.1  Introduction

Prolog directives are annotations inserted in Prolog source files for the compiler. A Prolog directive is used to specify:
  • the properties of some procedures defined in the source file.

  • the format and the syntax for read-terms in the source file (using changeable Prolog flags).

  • included source files.

  • a goal to be executed at run-time.

6.1.2  dynamic/1

Templates
dynamic(+predicate_indicator)
dynamic(+predicate_indicator_list)
dynamic(+predicate_indicator_sequence)
Description

dynamic(Pred) specifies that the procedure whose predicate indicator is Pred is a dynamic procedure. This directive makes it possible to alter the definition of Pred by adding or removing clauses. For more information refer to the section about dynamic clause management (section 7.7.1).

This directive shall precede the definition of Pred in the source file.

If there is no clause for Pred in the source file, Pred exists however as an empty predicate (this means that current_predicate(Pred) succeeds).

In order to allow multiple definitions, Pred can also be a list of predicate indicators or a sequence of predicate indicators using ','/2 as separator.

Portability

ISO directive.

6.1.3  public/1

Templates
public(+predicate_indicator)
public(+predicate_indicator_list)
public(+predicate_indicator_sequence)
Description

public(Pred) specifies that the procedure whose predicate indicator is Pred is a public procedure. This directive makes it possible to inspect the clauses of Pred. For more information refer to the section about dynamic clause management (section 7.7.1).

This directive shall precede the definition of Pred in the source file. Since a dynamic procedure is also public. It is useless (but correct) to define a public directive for a predicate already declared as dynamic.

In order to allow multiple definitions, Pred can also be a list of predicate indicators or a sequence of predicate indicators using ','/2 as separator.

Portability

GNU Prolog directive. The ISO reference does not define any directive to declare a predicate public but it does distinguish public predicates. It is worth noting that in most Prolog systems the public/1 directive is as a visibility declaration. Indeed, declaring a predicate as public makes it visible from any predicate defined in any other file (otherwise the predicate is only visible from predicates defined in the same source file as itself). When a module system is incorporated in GNU Prolog a more general visibility declaration shall be provided conforming to the ISO reference.

6.1.4  multifile/1

Templates
multifile(+predicate_indicator)
multifile(+predicate_indicator_list)
multifile(+predicate_indicator_sequence)
Description

multifile(Pred) is not supported by GNU Prolog. When such a directive is encountered it is simply ignored. All clauses for a given predicate must reside in a single file.

Portability

ISO directive. Not supported.

6.1.5  discontiguous/1

Templates
discontiguous(+predicate_indicator)
discontiguous(+predicate_indicator_list)
discontiguous(+predicate_indicator_sequence)
Description

discontiguous(Pred) specifies that the procedure whose predicate indicator is Pred is a discontiguous procedure. Namely, the clauses defining Pred are not restricted to be consecutive but can appear anywhere in the source file.

This directive shall precede the definition of Pred in the source file.

In order to allow multiple definitions, Pred can also be a list of predicate indicators or a sequence of predicate indicators using ','/2 as separator.

Portability

ISO directive. The ISO reference document states that if there is no clause for Pred in the source file, Pred exists however as an empty predicate (i.e. current_predicate(Pred) will succeed). This is not the case for GNU Prolog.

6.1.6  ensure_linked/1

Templates
ensure_linked(+predicate_indicator)
ensure_linked(+predicate_indicator_list)
ensure_linked(+predicate_indicator_sequence)
Description

ensure_linked(Pred) specifies that the procedure whose predicate indicator is Pred must be included by the linker. This directive is useful when compiling to native code to force the linker to include the code of a given predicate. Indeed, if the gplc is invoked with an option to reduce the size of the executable (section 3.4.3), the linker only includes the code of predicates that are statically referenced. However, the linker cannot detect dynamically referenced predicates (used as data passed to a meta-call predicate). The use of this directive prevents it to exclude the code of such predicates.

In order to allow multiple definitions, Pred can also be a list of predicate indicators or a sequence of predicate indicators using ','/2 as separator.

Portability

GNU Prolog directive.

6.1.7  built_in/0, built_in/1, built_in_fd/0, built_in_fd/1

Templates
built_in
built_in(+predicate_indicator)
built_in(+predicate_indicator_list)
built_in(+predicate_indicator_sequence)
built_in_fd
built_in_fd(+predicate_indicator)
built_in_fd(+predicate_indicator_list)
built_in_fd(+predicate_indicator_sequence)
Description

built_in specifies that the procedures defined from now have the built_in property (section 7.8.2).

built_in(Pred) is similar to built_in/0 but only affects the procedure whose predicate indicator is Pred.

This directive shall precede the definition of Pred in the source file.

In order to allow multiple definitions, Pred can also be a list of predicate indicators or a sequence of predicate indicators using ','/2 as separator.

built_in_fd (resp. built_in_fd(Pred)) is similar to built_in (resp. built_in(Pred)) but sets the built_in_fd predicate property (section 7.8.2).

Portability

GNU Prolog directives.

6.1.8  include/1

Templates
include(+atom)
Description

include(File) specifies that the content of the Prolog source File shall be inserted. The resulting Prolog text is identical to the Prolog text obtained by replacing the directive by the content of the Prolog source File.

See absolute_file_name/2 for information about the syntax of File (section 7.26.1).

Portability

ISO directive.

6.1.9  ensure_loaded/1

Templates
ensure_loaded(+atom)
Description

ensure_loaded(File) is not supported by GNU Prolog. When such a directive is encountered it is simply ignored.

Portability

ISO directive. Not supported.

6.1.10  op/3

Templates
op(+integer, +operator_specifier, +atom_or_atom_list)
Description

op(Priority, OpSpecifier, Operator) alters the operator table. This directive is executed as soon as it is encountered by calling the built-in predicate op/3 (section 7.14.10). A system directive is also generated to reflect the effect of this directive at run-time (section 3.4.4).

Portability

ISO directive.

6.1.11  char_conversion/2

Templates
char_conversion(+character, +character)
Description

char_conversion(InChar, OutChar) alters the character-conversion mapping. This directive is executed as soon as it is encountered by a call to the built-in predicate char_conversion/2 (section 7.14.12). A system directive is also generated to reflect the effect of this directive at run-time (section 3.4.4).

Portability

ISO directive.

6.1.12  set_prolog_flag/2

Templates
set_prolog_flag(+flag, +term)
Description

set_prolog_flag(Flag, Value) sets the value of the Prolog flag Flag to Value. This directive is executed as soon as it is encountered by a call to the built-in predicate set_prolog_flag/2 (section 7.22.1). A system directive is also generated to reflect the effect of this directive at run-time (section 3.4.4).

Portability

ISO directive.

6.1.13  initialization/1

Templates
initialization(+callable_term)
Description

initialization(Goal) adds Goal to the set of goal which shall be executed at run-time. A user directive is generated to execute Goal at run-time. If several initialization directives appear in the same file they are executed in the order of appearance (section 3.4.4).

Portability

ISO directive.

6.1.14  foreign/2, foreign/1

Templates
foreign(+callable_term, +foreign_option_list)
foreign(+callable_term)
Description

foreign(Template, Options) defines an interface predicate whose prototype is Template according to the options given by Options. Refer to the foreign code interface for more information (section 9.1).

foreign(Template) is equivalent to foreign(Template, []).

Portability

GNU Prolog directive.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Up Next ./gprolog-1.3.0/doc/html_node/gprolog007.html0000644004425400513100000001204010547441640017277 0ustar diazloco Adjusting the size of Prolog stacks Previous Up Next

3.3  Adjusting the size of Prolog stacks

GNU Prolog uses several stacks to execute a Prolog program. Each stack has a static size and cannot be dynamically increased during the execution. For each stack there is a default size but the user can define a new size by setting an environment variable. When a GNU Prolog program is run it first consults these variables and if they are not defined uses the default sizes. The following table presents each stack of GNU Prolog with its default size and the name of its associated environment variable:
Stack Default Environment Description
name size (Kb) variable  
local 4096 LOCALSZ control stack (environments and choice-points)
global 8192 GLOBALSZ heap (compound terms)
trail 3072 TRAILSZ conditional bindings (bindings to undo at backtracking)
cstr 3072 CSTRSZ finite domain constraint stack (FD variables and constraints)

If the size of a stack is too small an overflow will occur during the execution. In that case GNU Prolog emits the following error message before stopping:
S stack overflow (size: N Kb, environment variable used: E)
where S is the name of the stack, N is the current stack size in Kb and E the name of the associated environment variable. When such a message occurs it is possible to (re)define the variable E with the new size. For instance to allocate 8192 Kb to the local stack under a Unix shell use:
LOCALSZ=8192; export LOCALS    (under sh or bash)
setenv LOCALSZ 8192    (under csh or tcsh)
This method allows the user to adjust the size of Prolog stacks. However, in some cases it is preferable not to allow the user to modify these sizes. For instance, when providing a stand alone executable whose behavior should be independent of the environment in which it is run. In that case the program should not consult environment variables and the programmer should be able to define new default stack sizes. The GNU Prolog compiler offers this facilities via several command-line options such as –local-size or –fixed-sizes (section 3.4.3).

Finally note that GNU Prolog stacks are virtually allocated (i.e. use virtual memory). This means that a physical memory page is allocated only when needed (i.e. when an attempt to read/write it occurs). Thus it is possible to define very large stacks. At the execution, only the needed amount of space will be physically allocated.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog010.html0000644004425400513100000000320610547441640017275 0ustar diazloco Introduction Up Next

4.1  Introduction

The GNU Prolog debugger provides information concerning the control flow of the program. The debugger can be fully used on consulted predicates (i.e. byte-code). For native compiled code only the calls/exits are traced, no internal behavior is shown. Under the debugger it is possible to exhaustively trace the execution or to set spy-points to only debug a specific part of the program. Spy-points allow the user to indicate on which predicates the debugger has to stop to allow the user to interact with it. The debugger uses the “procedure box control flow model”, also called the Byrd Box model since it is due to Lawrence Byrd.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Up Next ./gprolog-1.3.0/doc/html_node/gprolog044.html0000644004425400513100000007177210547441640017321 0ustar diazloco Global variables Previous Up Next

7.21  Global variables

7.21.1  Introduction

GNU Prolog provides a simple and powerful way to assign and read global variables. A global variable is associated with each atom, its initial value is the integer 0. A global variable can store 3 kinds of objects:
  • a copy of a term (the assignment can be made backtrackable or not).

  • a link to a term (the assignment is always backtrackable).

  • an array of objects (recursively).
The space necessary for copies and arrays is dynamically allocated and recovered as soon as possible. For instance, when an atom is associated with a global variable whose current value is an array, the space for this array is recovered (unless the assignment is to be undone when backtracking occurs).

When a link to a term is associated with a global variable, the reference to this term is stored and thus the original term is returned when the content of the variable is read.

Global variable naming convention: a global variable is referenced by an atom.

If the variable contains an array, an index (ranging from 0) can be provided using a compound term whose principal functor is the correponding atom and the argument is the index. In case of a multi-dimensional array, each index is given as the arguments of the compound term.

If the variable contains a term (link or copy), it is possible to only reference a sub-term by giving its argument number (also called argument selector). Such a sub-term is specified using a compound term whose principal functor is -/2 and whose first argument is a global variable name and the second argument is the argument number (from 1). This can be applied recursively to specify a sub-term of any depth. In case of a list, a argument number I represents the Ith element of the list. In the rest of this section we use the operator notation since - is a predefined infix operator (section 7.14.10).

In the following, GVarName represents a reference to a global variable and its syntax is as follows:
GVarName ::= atom whole content of a variable
    atom(Integer,...,Integer) element of an array
    GVarName-Integer sub-term selection
Integer ::= integer immediate value
    GVarName indirect value
When a GVarName is used as an index or an argument number (i.e. indirection), the value of this variable must be an integer.

Here are some examples of the naming convention:
a the content of variable associated with a (any kind)
t(1) the 2nd element of the array associated with t
t(k) if the value associated with k is I, the Ith element of the array associated with t
a-1-2 if the value associated with a is f(g(a,b,c),2), the sub-term b

Here are the errors associated with global variable names and common to all predicates.
GVarName is a variable    instantiation_error
GVarName is neither a variable nor a callable term    type_error(callable, GVarName)
GVarName contains an invalid argument number (or GVarName is an array)    domain_error(g_argument_selector, GVarName)
GVarName contains an invalid index (or GVarName is not an array)    domain_error(g_array_index, GVarName)
GVarName is used as an indirect index or argument selector and is not an integer    type_error(integer, GVarName)

Arrays: the predicates g_assign/2, g_assignb/2 and g_link/2 (section 7.21.2) can be used to create an array. They recognize some terms as values. For instance, a compound term with principal functor g_array is used to define an array of fixed size. There are 3 forms for the term g_array:
  • g_array(Size): if Size is an integer > 0 then defines an array of Size elements which are all initialized with the integer 0.

  • g_array(Size, Initial): as above but the elements are initialized with the term Initial instead of 0. Initial can contain other array definitions allowing thus for multi-dimensional arrays.

  • g_array(List): as above if List is a list of length Size except that the elements of the array are initialized according to the elements of List (which can contain other array definitions).
An array can be extended explicitely using a compound term with principal functor g_array_extend which accept the same 3 forms detailed above. In that case, the existing elements of the array are not initialized. If g_array_extend is used with an object which is not an array it is similar to g_array.

Finally, an array can be automatically expanded when needed. The programmer does not need to explicitely control the expansion of an automatic array. An array is expanded as soon as an index is outside the current size of this array. Such an array is defined using a compound term with principal functor g_array_auto:
  • g_array_auto(Size): if Size is an integer > 0 then defines an automatic array whose initial size is Size. All elements are initialized with the integer 0. Elements created during implicit expansions will be initialized with 0.

  • g_array_auto(Size, Initial): as above but the elements are initialized with the term Initial instead of 0. Initial can contain other array definitions allowing thus for multi-dimensional arrays. Elements created during implicit expansions will be initialized with Initial.

  • g_array_auto(List): as above if List is a list of length Size except that the elements of the array are initialized according to the elements of List (which can contain other array definitions). Elements created during implicit expansions will be initialized with 0.
In any case, when an array is read, a term of the form g_array([Elem0,..., ElemSize-1]) is returned.

Some examples using global variables are presented later (section 7.21.7).

7.21.2  g_assign/2, g_assignb/2, g_link/2

Templates
g_assign(+callable_term, ?term)
g_assignb(+callable_term, ?term)
g_link(+callable_term, ?term)
Description

g_assign(GVarName, Value) assigns a copy of the term Value to GVarName. This assignment is not undone when backtracking occurs.

g_assignb/2 is similar to g_assign/2 but the assignment is undone at backtracking.

g_link(GVarName, Value) makes a link between GVarName to the term Value. This allows the user to give a name to any Prolog term (in particular non-ground terms). Such an assignment is always undone when backtracking occurs (since the term may no longer exist). If Value is an atom or an integer, g_link/2 and g_assignb/2 have the same behavior. Since g_link/2 only handles links to existing terms it does not require extra memory space and is not expensive in terms of execution time.

NB: argument selectors can only be used with g_assign/2 (i.e. when using an argument selector inside an assignment, this one must not be backtrackable).

Errors

See common errors detailed in the introduction (section 7.21.1)
GVarName contains an argument selector and the assignment is backtrackable    domain_error(g_argument_selector, GVarName)

Portability

GNU Prolog predicates.

7.21.3  g_read/2

Templates
g_read(+callable_term, ?term)
Description

g_read(GVarName, Value) unifies Value with the term assigned to GVarName.

Errors

See common errors detailed in the introduction (section 7.21.1)

Portability

GNU Prolog predicate.

7.21.4  g_array_size/2

Templates
g_array_size(+callable_term, ?integer)
Description

g_array_size(GVarName, Value) unifies Size with the dimension (an integer > 0) of the array assigned to GVarName. Fails if GVarName is not an array.

Errors

See common errors detailed in the introduction (section 7.21.1)
Size is neither a variable nor an integer    type_error(integer, Size)

Portability

GNU Prolog predicate.

7.21.5  g_inc/3, g_inc/2, g_inco/2, g_inc/1, g_dec/3, g_dec/2, g_deco/2, g_dec/1

Templates
g_inc(+callable_term, ?integer, ?integer)
g_inc(+callable_term, ?integer)
g_inco(+callable_term, ?integer)
g_inc(+callable_term)
g_dec(+callable_term, ?integer, ?integer)
g_dec(+callable_term, ?integer)
g_deco(+callable_term, ?integer)
g_dec(+callable_term)
Description

g_inc(GVarName, Old, New) unifies Old with the integer assigned to GVarName, increments GVarName and then unifies New with the incremented value.

g_inc(GVarName, New) is equivalent to g_inc(GVarName, _, New).

g_inco(GVarName, Old) is equivalent to g_inc(GVarName, Old, _).

g_inc(GVarName) is equivalent to g_inc(GVarName, _, _).

Predicates g_dec are similar but decrement the content of GVarName instead.

Errors

See common errors detailed in the introduction (section 7.21.1)
Old is neither a variable nor an integer    type_error(integer, Old)
New is neither a variable nor an integer    type_error(integer, New)
GVarName stores an array    type_error(integer, g_array)
GVarName stores a term T which is not an integer    type_error(integer, T)

Portability

GNU Prolog predicates.

7.21.6  g_set_bit/2, g_reset_bit/2, g_test_set_bit/2, g_test_reset_bit/2

Templates
g_set_bit(+callable_term, +integer)
g_reset_bit(+callable_term, +integer)
g_test_set_bit(+callable_term, +integer)
g_test_reset_bit(+callable_term, +integer)
Description

g_set_bit(GVarName, Bit) sets to 1 the bit number specified by Bit of the integer assigned to GVarName to 1. Bit numbers range from 0 to the maximum number allowed for integers (this is architecture dependent). If Bit is greater than this limit, the modulo with this limit is taken.

g_reset_bit(GVarName, Bit) is similar to g_set_bit/2 but sets the specified bit to 0.

g_test_set_bit/2 succeeds if the specified bit is set to 1.

g_test_reset_bit/2 succeeds if the specified bit is set to 0.

Errors

See common errors detailed in the introduction (section 7.21.1)
Bit is a variable    instantiation_error
Bit is neither a variable nor an integer    type_error(integer, Bit)
Bit is an integer < 0    domain_error(not_less_than_zero, Bit)
GVarName stores an array    type_error(integer, g_array)
GVarName stores a term T which is not an integer    type_error(integer, T)

Portability

GNU Prolog predicates.

7.21.7  Examples

Simulating g_inc/3: this predicate behaves like: global variable:
my_g_inc(Var, Old, New) :-
        g_read(Var, Old),
        N is Value + 1,
        g_assign(Var, X),
 New = N.
The query: my_g_inc(c, X, _) will succeed unifying X with 0, another call to my_g_inc(a, Y, _) will then unify Y with 1, and so on.

Difference between g_assign/2 and g_assignb/2: g_assign/2 does not undo its assignment when backtracking occurs whereas g_assignb/2 undoes it.
test(Old) :-    testb(Old) :-
        g_assign(x,1),            g_assign(x,1),
        (   g_read(x, Old),            (   g_read(x, Old),
            g_assign(x, 2)                g_assignb(x, 2)
        ;   g_read(x, Old),            ;   g_read(x, Old),
            g_assign(x, 3)                g_assign(x, 3)
        ).            ).
The query test(Old) will succeed unifying Old with 1 and on backtracking with 2 (i.e. the assignment of the value 2 has not been undone). The query testb(Old) will succeed unifying Old with 1 and on backtracking with 1 (i.e. the assignment of the value 2 has been undone).

Difference between g_assign/2 and g_link/2: g_assign/2 (and g_assignb/2) creates a copy of the term whereas g_link/2 does not. g_link/2 can be used to avoid passing big data structures (e.g. dictionaries,...) as arguments to predicates.
test(B) :-    test(B) :-
        g_assign(b, f(X)),            g_link(b, f(X)),
        X = 12,            X = 12,
        g_read(b, B).            g_read(b, B).
The query test(B) will succeed unifying B with f(_) (g_assign/2 assigns a copy of the value). The query testl(B) will succeed unifying B with f(12) (g_link/2 assigns a pointer to the term).

Simple array definition: here are some queries to show how arrays can be handled:
| ?- g_assign(w, g_array(3)), g_read(w, X).

X = g_array([0,0,0])

| ?- g_assign(w(0), 16), g_assign(w(1), 32), g_assign(w(2), 64), g_read(w, X).

X = g_array([16,32,64])
this is equivalent to:
| ?- g_assign(k, g_array([16,32,64])), g_read(k, X).

X = g_array([16,32,64])

| ?- g_assign(k, g_array(3,null)), g_read(k, X), g_array_size(k, S).

S = 3
X = g_array([null,null,null])
2-D array definition:
| ?- g_assign(w, g_array(2, g_array(3))), g_read(w, X).

X = g_array([g_array([0,0,0]),g_array([0,0,0])])

| ?- (   for(I,0,1), for(J,0,2), K is I*3+J, g_assign(w(I,J), K),
         fail
     ;   g_read(w, X)
     ).

X = g_array([g_array([0,1,2]),g_array([3,4,5])])

| ?- g_read(w(1),X).

X = g_array([3,4,5])
Hybrid array:
| ?- g_assign(w,g_array([1,2,g_array([a,b,c]), g_array(2,z),5])), g_read(w, X).

X = g_array([1,2,g_array([a,b,c]), g_array([z,z]),5])

| ?- g_read(w(1), X), g_read(w(2,1), Y), g_read(w(3,1), Z).

X = 2
Y = b
Z = z

| ?- g_read(w(1,2),X).
uncaught exception: error(domain_error(g_array_index,w(1,2)),g_read/2)
Array extension:
| ?- g_assign(a, g_array([10,20,30])), g_read(a, X).

X = g_array([10,20,30])

| ?- g_assign(a, g_array_extend(5,null)), g_read(a, X).

X = g_array([10,20,30,null,null])

| ?- g_assign(a, g_array([10,20,30])), g_read(a, X).

X = g_array([10,20,30])

| ?- g_assign(a, g_array_extend([1,2,3,4,5,6])), g_read(a, X).

X = g_array([10,20,30,4,5,6])
Automatic array:
| ?- g_assign(t, g_array_auto(3)), g_assign(t(1), foo), g_read(t,X).

X = g_array([0,foo,0])

| ?- g_assign(t(5), bar), g_read(t,X).                              

X = g_array([0,foo,0,0,0,bar,0,0])

| ?- g_assign(t, g_array_auto(2, g_array(2))), g_assign(t(1,1), foo), 
     g_read(t,X).

X = g_array([g_array([0,0]),g_array([0,foo])])

| ?- g_assign(t(3,0), bar), g_read(t,X).

X = g_array([g_array([0,0]),g_array([0,foo]),g_array([0,0]),g_array([bar,0])])

| ?- g_assign(t(3,4), bar), g_read(t,X).
uncaught exception: error(domain_error(g_array_index,t(3,4)),g_assign/2)

| ?- g_assign(t, g_array_auto(2, g_array_auto(2))), g_assign(t(1,1), foo), 
     g_read(t,X).

X = g_array([g_array([0,0]),g_array([0,foo])])

| ?- g_assign(t(3,3), bar), g_read(t,X).

X = g_array([g_array([0,0]),g_array([0,foo]),g_array([0,0]),
    g_array([0,0,0,bar])])

| ?- g_assign(t, g_array_auto(2, g_array_auto(2, null))), g_read(t(2,3), U),
     g_read(t, X).

U = null
X = g_array([g_array([null,null]),g_array([null,null]),
             g_array([null,null,null,null]),g_array([null,null])])

Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog047.html0000644004425400513100000001463510547441640017317 0ustar diazloco System statistics Previous Up Next

7.24  System statistics

7.24.1  statistics/0, statistics/2

Templates
statistics
statistics(?atom, ?list)
Description

statistics displays statistics about memory usage and run times.

statistics(Key, Value) unifies Value with the current value of the statistics key Key. Value a list of two elements. Times are in milliseconds, sizes of areas in bytes.
Key Description Value
user_time user CPU time [SinceStart, SinceLast]
system_time system CPU time [SinceStart, SinceLast]
cpu_time total CPU time (user + system) [SinceStart, SinceLast]
real_time absolute time [SinceStart, SinceLast]
local_stack local stack sizes (control, environments, choices) [UsedSize, FreeSize]
global_stack global stack sizes (compound terms) [UsedSize, FreeSize]
trail_stack trail stack sizes (variable bindings to undo) [UsedSize, FreeSize]
cstr_stack constraint trail sizes (finite domain constraints) [UsedSize, FreeSize]

Note that the key runtime is recognized as user_time for compatibility purpose.

Errors
Key is neither a variable nor a valid key    domain_error(statistics_key, Key)
Value is neither a variable nor a list of two elements    domain_error(statistics_value, Value)
Value is a list of two elements and an element E is neither a variable nor an integer    type_error(integer, E)

Portability

GNU Prolog predicates.

7.24.2  user_time/1, system_time/1, cpu_time/1, real_time/1

Templates
user_time(?integer)
system_time(?integer)
cpu_time(?integer)
real_time(?integer)
Description

user_time(Time) unifies Time with the user CPU time elapsed since the start of Prolog.

system_time(Time) unifies Time with the system CPU time elapsed since the start of Prolog.

cpu_time(Time) unifies Time with the CPU time (user + system) elapsed since the start of Prolog.

real_time(Time) unifies Time with the absolute time elapsed since the start of Prolog.

Errors
Time is neither a variable nor an integer    type_error(integer, Time)

Portability

GNU Prolog predicates.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog037.html0000644004425400513100000021472210547441640017315 0ustar diazloco Term input/output Previous Up Next

7.14  Term input/output

These built-in predicates enable a Prolog term to be input from or output to a text stream. The atom end_of_file is returned as term to indicate the end-of-file. The syntax of such terms can also be altered by changing the operators (section 7.14.10), and making some characters equivalent to others (section 7.14.12) if the char_conversion Prolog flag is on (section 7.22.1). Double quoted tokens will be returned as an atom or a character list or a character code list depending on the value of the double_quotes Prolog flag (section 7.22.1). Similarly, back quoted tokens are returned depending on the value of the back_quotes Prolog flag.

7.14.1  read_term/3, read_term/2, read/2, read/1

Templates
read_term(+stream_or_alias, ?term, +read_option_list)
read_term(?term, +read_option_list)
read(+stream_or_alias, ?term)
read(?term)
Description

read_term(SorA, Term, Options) is true if Term unifies with the next term read from the stream associated with the stream-term or alias SorA according to the options given by Options.

Read options: Options is a list of read options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are:
  • variables(VL): VL is unified with the list of all variables of the input term, in left-to-right traversal order. Anonymous variables are included in the list VL.

  • variable_names(VNL): VNL is unified with the list of pairs Name = Var where Var is a named variable of the term and Name is the atom associated with the name of Var. Anonymous variables are not included in the list VNL.

  • singletons(SL): SL is unified with the list of pairs Name = Var where Var is a named variable which occurs only once in the term and Name is the atom associated to the name of Var. Anonymous variables are not included in the list SL.

  • syntax_error(error/warning/fail): specifies the effect of a syntax error:
    • error: a syntax_error is raised.

    • warning: a warning message is displayed and the predicate fails.

    • fail: the predicate quietly fails.

    The default value is the value of the syntax_error Prolog flag (section 7.22.1).

  • end_of_term(dot/eof): specifies the end-of-term delimiter: dot is the classical full-stop delimiter (a dot followed with a layout character), eof is the end-of-file delimiter. This option is useful for predicates like read_term_from_atom/3 (section 7.15.1) to avoid to add a terminal dot at the end of the atom. The default value is dot.
read(SorA, Term) is equivalent to read_term(SorA, Term, []).

read_term/2 and read/1 apply to the current input stream.

Errors
SorA is a variable    instantiation_error
Options is a partial list or a list with an element E which is a variable    instantiation_error
SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
Options is neither a partial list nor a list    type_error(list, Options)
an element E of the Options list is neither a variable nor a valid read option    domain_error(read_option, E)
SorA is not associated with an open stream    existence_error(stream, SorA)
SorA is an output stream    permission_error(input, stream, SorA)
SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)
a syntax error occurs and the value of the syntax_error Prolog flag is error (section 7.22.1)    syntax_error(atom explaining the error)

Portability

ISO predicates. The ISO reference raises a representation_error(Flag) where Flag is max_arity, max_integer, or min_integer when the read term breaches an implementation defined limit specified by Flag. GNU Prolog detects neither min_integer nor max_integer violation and treats a max_arity violation as a syntax error. The read options syntax_error/1 and end_of_term/1 are GNU Prolog extensions.

7.14.2  read_atom/2, read_atom/1, read_integer/2, read_integer/1,
read_number/2, read_number/1

Templates
read_atom(+stream_or_alias, ?atom)
read_atom(?atom)
read_integer(+stream_or_alias, ?integer)
read_integer(?integer)
read_number(+stream_or_alias, ?number)
read_number(?number)
Description

read_atom(SorA, Atom) succeeds if Atom unifies with the next atom read from the stream associated with the stream-term or alias SorA.

read_integer(SorA, Integer) succeeds if Integer unifies with the next integer read from the stream associated with the stream-term or alias SorA.

read_number(SorA, Number) succeeds if Number unifies with the next number (integer or floating point number) read from the stream associated with the stream-term or alias SorA.

read_atom/1, read_integer/1 and read_number/1 apply to the current input stream.

Errors
SorA is a variable    instantiation_error
Atom is neither a variable nor an atom    type_error(atom, Atom)
Integer is neither a variable nor an integer    type_error(integer, Integer)
Number is neither a variable nor a number    type_error(number, Number)
SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
SorA is not associated with an open stream    existence_error(stream, SorA)
SorA is an output stream    permission_error(input, stream, SorA)
SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)
a syntax error occurs and the value of the syntax_error Prolog flag is error (section 7.22.1)    syntax_error(atom explaining the error)

Portability

GNU Prolog predicates.

7.14.3  read_token/2, read_token/1

Templates
read_token(+stream_or_alias, ?nonvar)
read_token(?nonvar)
Description

read_token(SorA, Token) succeeds if Token unifies with the encoding of the next Prolog token read from the stream associated with stream-term or alias SorA.

Token encoding:
  • var(A): a variable is read whose name is the atom A.

  • an atom A: an atom A is read.

  • integer N: an integer N is read.

  • floating point number N: a floating point number N is read.

  • string(A): a string (double quoted item) is read whose characters forms the atom A.

  • punct(P): a punctuation character P is read (P is a one-character atom in ()[]{|}, the atom full_stop or the atom end_of_file).

  • back_quotes(A): a back quoted item is read whose characters forms the atom A.

  • extended(A): an extended character A (an atom) is read.
As for read_term/3, the behavior of read_token/2 can be affected by some Prolog flags (section 7.14).

read_token/1 applies to the current input stream.

Errors
SorA is a variable    instantiation_error
SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
SorA is not associated with an open stream    existence_error(stream, SorA)
SorA is an output stream    permission_error(input, stream, SorA)
SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)
a syntax error occurs and the value of the syntax_error Prolog flag is error (section 7.22.1)    syntax_error(atom explaining the error)

Portability

GNU Prolog predicates.

7.14.4  syntax_error_info/4

Templates
syntax_error_info(?atom, ?integer, ?integer, ?atom)
Description

syntax_error_info(FileName, Line, Column, Error) returns the information associated with the last syntax error. Line is the line number of the error, Column is the column number of the error and Error is an atom explaining the error.

Errors
FileName is neither a variable nor an atom    type_error(atom, FileName)
Line is neither a variable nor an integer    type_error(integer, Line)
Column is neither a variable nor an integer    type_error(integer, Column)
Error is neither a variable nor an atom    type_error(atom, Error)

Portability

GNU Prolog predicate.

7.14.5  last_read_start_line_column/2

Templates
last_read_start_line_column(?integer, ?integer)
Description

last_read_start_line_column(Line, Column) unifies Line and Column with the line number and the column number associated with the start of the last read predicate. This predicate can be used after calling one of the following predicates: read_term/3, read_term/2, read/2, read/1 (section 7.14.1), read_atom/2, read_atom/1, read_integer/2, read_integer/1, read_number/2, read_number/1 (section 7.14.2) or read_token/2, read_token/1 (section 7.14.3).

Errors
Line is neither a variable nor an integer    type_error(integer, Line)
Column is neither a variable nor an integer    type_error(integer, Column)

Portability

GNU Prolog predicate.

7.14.6  write_term/3, write_term/2, write/2, write/1, writeq/2, writeq/1,
write_canonical/2, write_canonical/1, display/2, display/1, print/2,
print/1

Templates
write_term(+stream_or_alias, ?term, +write_option_list)
write_term(?term, +write_option_list)
write(+stream_or_alias, ?term)
write(?term)
writeq(+stream_or_alias, ?term)
writeq(?term)
write_canonical(+stream_or_alias, ?term)
write_canonical(?term)
display(+stream_or_alias, ?term)
display(?term)
print(+stream_or_alias, ?term)
print(?term)
Description

write_term(SorA, Term, Options) writes Term to the stream associated with the stream-term or alias SorA according to the options given by Options.

Write options: Options is a list of write options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are:
  • quoted(true/false): if true each atom and functor is quoted if this would be necessary for the term to be input by read_term/3. If false no extra quotes are written. The default value is false.

  • ignore_ops(true/false): if true each compound term is output in functional notation (neither operator notation nor list notation is used). If false operator and list notations are used. The default value is false.

  • numbervars(true/false): if true a term of the form '$VAR'(N), where N is an integer, is output as a variable name (see below). If false such a term is output normally (according to the other options). The default value is true.

  • namevars(true/false): if true a term of the form '$VARNAME'(Name), where Name is an atom, is output as a variable name (see below). If false such a term is output normally (according to the other options). The default value is true.

  • space_args(true/false): if true an extra space character is emitted after each comma separating the arguments of a compound term in functional notation or of a list. If false no extra space is emitted. The default value is false.

  • portrayed(true/false): if true and if there exists a predicate portray/1, write_term/3 acts as follows: if Term is a variable it is simply written. If Term is non-variable then it is passed to portray/1. If this succeeds then it is assumed that Term has been output. Otherwise write_term/3 outputs the principal functor of Term (Term itself if it is atomic) according to other options and recursively calls portray/1 on the components of Term (if it is a compound term). With ignore_ops(false) a list is first passed to portray/1 and only if this call fails each element of the list is passed to portray/1 (thus every sub-list is not passed). The default value is false.

  • max_depth(N): controls the depth of output for compound terms. N is an integer specifying the depth. The output of a term whose depth is greater than N gives rise to the output of ... (3 dots). By default there is no depth limit.

  • priority(N): specifies the starting priority to output the term. This option controls if Term should be enclosed in brackets. N is a positive integer ≤ 1200. By default N = 1200.
Variable numbering: when the numbervars(true) option is passed to write_term/3 any term of the form '$VAR'(N) where N is an integer is output as a variable name consisting of a capital letter possibly followed by an integer. The capital letter is the (I+1)th letter of the alphabet and the integer is J, where I = N mod 26 and J = N // 26. The integer J is omitted if it is zero. For example:
'$VAR'(0)    is written as A
'$VAR'(1)    is written as B
...
'$VAR'(25)    is written as Z
'$VAR'(26)    is written as A1
'$VAR'(27)    is written as B1
Variable naming: when the namevars(true) option is passed to write_term/3 any term of the form '$VARNAME'(Name) where Name is an atom is output as a variable name consisting of the characters Name. For example: '$VARNAME'('A') is written as A (even in the presence of the quoted(true) option).

write(SorA, Term) is equivalent to write_term(SorA, Term, []).

writeq(SorA, Term) is equivalent to write_term(SorA, Term, [quoted(true)]).

write_canonical(SorA, Term) is equivalent to write_term(SorA, Term, [quoted(true),
ignore_ops(true), numbervars(false)])
.

display(SorA, Term) is equivalent to write_term(SorA, Term, [ignore_ops(true),
numbervars(false)])
.

print(SorA, Term) is equivalent to write_term(SorA, Term, [numbervars(false),
portrayed(true)])
.

write_term/2, write/1, writeq/1, write_canonical/1, display/1 and print/1 apply to the current output stream.

Errors
SorA is a variable    instantiation_error
Options is a partial list or a list with an element E which is a variable    instantiation_error
Options is neither a partial list nor a list    type_error(list, Options)
SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
an element E of the Options list is neither a variable nor a valid write-option    domain_error(write_option, E)
SorA is not associated with an open stream    existence_error(stream, SorA)
SorA is an input stream    permission_error(output, stream, SorA)
SorA is associated with a binary stream    permission_error(output, binary_stream, SorA)

Portability

ISO predicates except display/1-2 and print/1-2 that are GNU Prolog predicates. namevars/1, space_args/1, portrayed/1, max_depth/1 and priority/1 options are GNU Prolog extensions.

7.14.7  format/3, format/2

Templates
format(+stream_or_alias, +character_code_list_or_atom, +list)
format(+character_code_list_or_atom, +list)
Description

format(SorA, Format, Arguments) writes the Format string replacing each format control sequence F by the corresponding element of Arguments (formatted according to F) to the stream associated with the stream-term or alias SorA.

Format control sequences: the general format of a control sequence is '~NC'. The character C determines the type of the control sequence. N is an optional numeric argument. An alternative form of N is '*'. '*' implies that the next argument Arg in Arguments should be used as a numeric argument in the control sequence. The use of C printf() formatting sequence (beginning by the character %) is also allowed. The following control sequences are available:
Format sequence
type of the argument
Description
~Na
atom
print the atom without quoting. N is minimal number of characters to print using spaces on the rigth if needed (default: the length of the atom)
~Nc
character code
print the character associated with the code. N is the number of times to print the character (default: 1)
~Nf
~Ne ~NE ~Ng ~NG
float expression
pass the argument Arg and N to the C printf() function as:
if N is not specified printf("%f",Arg) else printf("%.Nf",Arg).
Similarly for ~Ne, ~NE, ~Ng and ~NG
~Nd
integer expression
print the argument. N is the number of digits after the decimal point. If N is 0 no decimal point is printed (default: 0)
~ND
integer expression
identical to ~Nd except that ',' separates groups of three digits to the left of the decimal point
~Nr
integer expression
print the argument according to the radix N. 2 ≤ N ≤ 36 (default: 8). The letters a-z denote digits > 9
~NR
integer expression
identical to ~Nr except that the letters A-Z denote digits > 9
~Ns
character code list
print exactly N characters (default: the length of the list)
~NS
character list
print exactly N characters (default: the length of the list)
~i
term
ignore the current argument
~k
term
pass the argument to write_canonical/1 (section 7.14.6)
~p
term
pass the argument to print/1 (section 7.14.6)
~q
term
pass the argument to writeq/1 (section 7.14.6)
~w
term
pass the argument to write/1 (section 7.14.6)
~~
none
print the character '~'
~Nn
none
print N new-line characters (default: 1)
~N
none
print a new-line character if not at the beginning of a line
~?
atom
use the argument as a nested format string
%F
atom, integer or float expression
interface to the C function printf(3) for outputting atoms (C string), integers and floating point numbers. * are also allowed.

format/2 applies to the current output stream.

Errors
SorA is a variable    instantiation_error
Format is a partial list or a list with an element E which is a variable    instantiation_error
Arguments is a partial list    instantiation_error
Format is neither a partial list nor a list or an atom    type_error(list, Format)
Arguments is neither a partial list nor a list    type_error(list, Arguments)
an element E of the Format list is neither a variable nor a character code    representation_error(character_code, E)
SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
an element E of Format is not a valid format control sequence    domain_error(format_control_sequence, E)
the Arguments list does not contain sufficient elements    domain_error(non_empty_list, [])
an element E of the Arguments list is a variable while a non-variable term was expected    instantiation_error
an element E of the Arguments list is neither variable nor an atom while an atom was expected    type_error(atom, E)
an element E of the Arguments cannot be evaluated as an arithmetic expression while an integer or a floating point number was expected    an arithmetic error (section 7.6.1)
an element E of the Arguments list is neither variable nor character code while a character code was expected    representation_error(character_code, E)
SorA is not associated with an open stream    existence_error(stream, SorA)
SorA is an input stream    permission_error(output, stream, SorA)
SorA is associated with a binary stream    permission_error(output, binary_stream, SorA)

Portability

GNU Prolog predicates.

7.14.8  portray_clause/2, portray_clause/1

Templates
portray_clause(+stream_or_alias, +clause)
portray_clause(+clause)
Description

portray_clause(SorA, Clause) pretty prints Clause to the stream associated with the stream-term or alias SorA. portray_clause/2 uses the variable binding predicates name_singleton_vars/1 (section 7.5.1) and numbervars/1 (section 7.5.3). This predicate is used by listing/1 (section 7.23.3).

portray_clause/1 applies to the current output stream.

Errors
Clause is a variable    instantiation_error
Clause is neither a variable nor a callable term    type_error(callable, Clause)
SorA is a variable    instantiation_error
SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
SorA is not associated with an open stream    existence_error(stream, SorA)
SorA is an input stream    permission_error(output, stream, SorA)
SorA is associated with a binary stream    permission_error(output, binary_stream, SorA)

Portability

GNU Prolog predicates.

7.14.9  get_print_stream/1

Templates
get_print_stream(?stream)
Description

get_print_stream(Stream) unifies Stream with the stream-term associated with the output stream used by print/2 (section 7.14.6). The purpose of this predicate is to allow a user-defined portray/1 predicate to identify the output stream in use.

Errors
Stream is neither a variable nor a stream-term    domain_error(stream, Stream)

Portability

GNU Prolog predicate.

7.14.10  op/3

Templates
op(+integer, +operator_specifier, +atom_or_atom_list)
Description

op(Priority, OpSpecifier, Operator) alters the operator table. Operator is declared as an operator with properties defined by specifier OpSpecifier and Priority. Priority must be an integer ≥ 0 and ≤ 1200. If Priority is 0 then the operator properties of Operator (if any) are canceled. Operator may also be a list of atoms in which case all of them are declared to be operators. In general, operators can be removed from the operator table and their priority or specifier can be changed. However, it is an error to attempt to change the ',' operator from its initial status. An atom can have multiple operator definitions (e.g. prefix and infix like +) however an atom cannot have both an infix and a postfix operator definitions.

Operator specifiers: the following specifiers are available:
Specifier Type Associativity
fx prefix no
fy prefix yes
xf postfix no
yf postfix yes
xfx infix no
yfx infix left
xfy infix right

Prolog predefined operators:
Priority Specifier
Operators
1200 xfx
:-  –>
1200 fx
:-
1100 xfy
;
1050 xfy
->
1000 xfy
,
900 fy
\+
700 xfx
=  \=  =..  ==  \==  @<  @=<  @>  @>=  is  =:=  =\=  <  =<  >  >=
600 xfy
:
500 yfx
+  -  /\  \/
400 yfx
*  /  //  rem  mod  <<  >>
200 xfy
**  ^
200 fy
+  -  \

FD predefined operators:
Priority Specifier
Operators
750 xfy
#<=>  #\<=>
740 xfy
#==>  #\==>
730 xfy
##  #\/  #\\/
720 yfx
#/\  #\/\
710 fy
#\
700 xfx
#=  #\=  #<  #=<  #>  #>=  #=#  #\=#  #<#  #=<#  #>#  #>=#
500 yfx
+  -
400 yfx
*  /  //  rem
200 xfy
**
200 fy
+  -

Errors
Priority is a variable    instantiation_error
OpSpecifier is a variable    instantiation_error
Operator is a partial list or a list with an element E which is a variable    instantiation_error
Priority is neither a variable nor an integer    type_error(integer, Priority)
OpSpecifier is neither a variable nor an atom    type_error(atom, OpSpecifier)
Operator is neither a partial list nor a list nor an atom    type_error(list, Operator)
an element E of the Operator list is neither a variable nor an atom    type_error(atom, E)
Priority is an integer not ≥ 0 and ≤ 1200    domain_error(operator_priority, Priority)
OpSpecifier is not a valid operator specifier    domain_error(operator_specifier, OpSpecifier)
Operator is ',' or an element of the Operator list is ','    permission_error(modify, operator, ',')
OpSpecifier is a specifier such that Operator would have a postfix and an infix definition.    permission_error(create, operator, Operator)

Portability

ISO predicate.

The ISO reference implies that if a program calls current_op/3, then modifies an operator definition by calling op/3 and backtracks into the call to current_op/3, then the changes are guaranteed not to affect that current_op/3 goal. This is not guaranteed by GNU Prolog.

7.14.11  current_op/3

Templates
current_op(?integer, ?operator_specifier, ?atom)
Description

current_op(Priority, OpSpecifier, Operator) succeeds if Operator is an operator with properties defined by specifier OpSpecifier and Priority. This predicate is re-executable on backtracking.

Errors
Priority is neither a variable nor an operator priority    domain_error(operator_priority, Priority)
OpSpecifier is neither a variable nor an operator specifier    domain_error(operator_specifier, OpSpecifier)
Operator is neither a variable nor an atom    type_error(atom, Operator)

Portability

ISO predicate.

7.14.12  char_conversion/2

Templates
char_conversion(+character, +character)
Description

char_conversion(InChar, OutChar) alters the character-conversion mapping. This mapping is used by the following read predicates: read_term/3 (section 7.14.1), read_atom/2, read_integer/2, read_number/2 (section 7.14.2) and read_token/2 (section 7.14.3) to replace any occurrence of a character InChar by OutChar. However the conversion mechanism should have been previously activated by switching on the char_conversion Prolog flag (section 7.22.1). When InChar and OutChar are the same, the effect is to remove any conversion of a character InChar.

Note that the single character read predicates (e.g. get_char/2) never do character conversion. If such behavior is required, it must be explicitly done using current_char_conversion/2 (section 7.14.13).

Errors
InChar is a variable    instantiation_error
OutChar is a variable    instantiation_error
InChar is neither a variable nor a character    type_error(character, InChar)
OutChar is neither a variable nor a character    type_error(character, OutChar)

Portability

ISO predicate. The type_error(character,...) is a GNU Prolog behavior, the ISO reference instead defines a representation_error(character) in this case. This seems to be an error of the ISO reference since, for many other built-in predicates accepting a character (e.g. char_code/2, put_char/2), a type_error is raised.

The ISO reference implies that if a program calls current_char_conversion/2, then modifies the character mapping by calling char_conversion/2, and backtracks into the call to current_char_conversion/2 then the changes are guaranteed not to affect that current_char_conversion/2 goal. This is not guaranteed by GNU Prolog.

7.14.13  current_char_conversion/2

Templates
current_char_conversion(?character, ?character)
Description

current_char_conversion(InChar, OutChar) succeeds if the conversion of InChar is OutChar according to the character-conversion mapping. In that case, InChar and OutChar are different. This predicate is re-executable on backtracking.

Errors
InChar is neither a variable nor a character    type_error(character, InChar)
OutChar is neither a variable nor a character    type_error(character, OutChar)

Portability

ISO predicate. Same remark as for char_conversion/2 (section 7.14.12).


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog014.html0000644004425400513100000002043010547441640017277 0ustar diazloco Debugger commands Previous Up Next

4.5  Debugger commands

When the debugger reaches a leashed port it shows the current goal followed by the ? symbol. At this point there are many commands available. Typing RETURN will creep into the program. Continuing to creep will show all the control flow. The debugger shows every port for every predicate encountered during the execution. It is possible to select the ports at which the debugger will prompt the user using the built-in predicate leash/1 (section 4.3.2). Each command is only one character long:
Command Name Description
RET or c creep single-step to the next port
l leap continue the execution only stopping when a goal with a spy-point is reached
s skip skip over the entire execution of the current goal. No message will be shown until control returns
G go to ask for an invocation number and continue the execution until a port is reached for that invocation number
r retry try to restart the invocation of the current goal by failing until reaching the invocation of the goal. The state of execution is the same as when the goal was initially invoked (except when using side-effect predicates)
f fail force the current goal to fail immediately
w write show the current goal using write/2 (section 7.14.6)
d display show the current goal using display/2 (section 7.14.6)
p print show the current goal using print/2 (section 7.14.6)
e exception show the pending exception. Only applicable to an exception port
g ancestors show the list of ancestors of the current goal
A alternatives show the list of ancestors of the current goal combined with choice-points
u unify ask for a term and unify the current goal with this term. This is convenient for getting a specific solution. Only available at a call port
. father file show the Prolog file name and the line number where the current predicate is defined
n no debug switch the debugger off. Same as nodebug/0 (section 4.3.1)
= debugging show debugger information. Same as debugging/0 (section 4.3.1)
+ spy this set a spy-point on the current goal. Uses spy/1 (section 4.3.3)
- nospy this remove a spy-point on the current goal. Uses nospy/1 (section 4.3.3)
* spy conditionally ask for a term Goal, Port, Test (terminated by a dot) and set a conditional spy-point on the current predicate. Goal and the current goal must have the same predicate indicator. Uses spypoint_condition/3 (section 4.3.3)
L listing list all the clauses associated with the current predicate. Uses listing/1 (section 7.23.3)
a abort abort the current execution. Same as abort/0 (section 7.18.1)
b break invoke a recursive top-level. Same as break/0 (section 7.18.1)
@ execute goal ask for a goal and execute it
< set print depth ask for an integer and set the print depth to this value (-1 for no depth limit)
h or ? help display a summary of available commands
W WAM debugger invoke the low-level WAM debugger (section 4.6)


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog004.html0000644004425400513100000000423410547441640017302 0ustar diazloco Using GNU Prolog Previous Up Next

3  Using GNU Prolog


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog012.html0000644004425400513100000001424710547441640017306 0ustar diazloco Debugging predicates Previous Up Next

4.3  Debugging predicates

4.3.1  Running and stopping the debugger

trace/0 activates the debugger. The next invocation of a predicate will be traced.

debug/0 activates the debugger. The next invocation of a predicate on which a spy-point has been set will be traced.

It is important to understand that the information associated with the control flow is only available when the debugger is on. For efficiency reasons, when the debugger is off the information concerning the control flow (i.e. the boxes) is not retained. So, if the debugger is activated in the middle of a computation (by a call to debug/0 or trace/0 in the program or after the interrupt key sequence (Ctl-C) by choosing trace or debug), information prior to this point is not available.

debugging/0: prints onto the terminal information about the current debugging state (whether the debugger is switched on, what are the leashed ports, spy-points defined,...).

notrace/0 or nodebug/0 switches the debugger off.

wam_debug/0 invokes the sub-debugger devoted to the WAM data structures (section 4.6). It can be also invoked using the W debugger command (section 4.5).

4.3.2  Leashing ports

leash(Ports) requests the debugger to prompt the user, as he creeps through the program, for every port defined in the Ports list. Each element of Ports is an atom in call, exit, redo, fail, exception. Ports can also be an atom defining a shorthand:
  • full: equivalent to [call, exit, redo, fail, exception]

  • half: equivalent to [call, redo]

  • loose: equivalent to [call]

  • none: equivalent to []

  • tight: equivalent to [call, redo, fail, exception]
When an unleashed port is encountered the debugger continues to show the associated goal but does not stop the execution to prompt the user.

4.3.3  Spy-points

When dealing with big sources it is not very practical to creep through the entire program. It is preferable to define a set of spy-points on interesting predicates to be prompted when the debugger reaches one of these predicates. Spy-points can be added either using spy/1 (or spypoint_condition/3) or dynamically when prompted by the debugger using the + (or *) debugger command (section 4.5). The current mode of leashing does not affect spy-points in the sense that user interaction is requested on every port.

spy(PredSpec) sets a spy-point on all the predicates given by PredSpec. PredSpec defines one or several predicates and has one of the following forms:
  • [PredSpec1, PredSpec2,...]: set a spy-point for each element of the list.

  • Name: set a spy-point for any predicate whose name is Name (whatever the arity).

  • Name/Arity: set a spy-point for the predicate whose name is Name and arity is Arity.

  • Name/A1-A2: set a spy-point for the each predicate whose name is Name and arity is between A1 and A2.
It is not possible to set a spy-point on an undefined predicate.

The following predicate is used to remove one or several spy-points:

nospy(PredSpec) removes the spy-points from the specified predicates.

nospyall/0 removes all spy-points:

It is also possible to define conditional spy-points.

spypoint_condition(Goal, Port, Test) sets a conditional spy-point on the predicate for Goal. When the debugger reaches a conditional spy-point it only shows the associated goal if the following conditions are verified:
  • the actual goal unifies with Goal.

  • the actual port unifies with Port.

  • the Prolog goal Test succeeds.

Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog058.html0000644004425400513100000000440210547441640017310 0ustar diazloco Type testing Previous Up Next

8.4  Type testing

8.4.1  fd_var/1, non_fd_var/1, generic_var/1, non_generic_var/1

Templates
fd_var(?term)
non_fd_var(?term)
generic_var(?term)
non_generic_var(?term)
Description

fd_var(Term) succeeds if Term is currently an FD variable.

non_fd_var(Term) succeeds if Term is currently not an FD variable (opposite of fd_var/1).

generic_var(Term) succeeds if Term is either a Prolog variable or an FD variable.

non_generic_var(Term) succeeds if Term is neither a Prolog variable nor an FD variable (opposite of generic_var/1).

Errors

None.

Portability

GNU Prolog predicate.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog039.html0000644004425400513100000001753410547441640017321 0ustar diazloco DEC-10 compatibility input/output Previous Up Next

7.16  DEC-10 compatibility input/output

7.16.1  Introduction

The DEC-10 Prolog I/O predicates manipulate streams implicitly since they only refer to current input/output streams (section 7.10.1). The current input and output streams are initially set to user_input and user_output respectively. The predicate see/1 (resp. tell/1, append/1) can be used for setting the current input (resp. output) stream to newly opened streams for particular files. The predicate seen/0 (resp. told/0) close the current input (resp. output) stream, and resets it to the standard input (resp. output). The predicate seeing/1 (resp. telling/1) is used for retrieving the file name associated with the current input (resp. output) stream. The file name user stands for the standard input or output, depending on context (user_input and user_output can also be used). The DEC-10 Prolog I/O predicates are only provided for compatibility, they are now obsolete and their use is discouraged. The predicates for explicit stream manipulation should be used instead (section 7.10).

7.16.2  see/1, tell/1, append/1

Templates
see(+source_sink)
see(+stream)
tell(+source_sink)
tell(+stream)
append(+source_sink)
append(+stream)
Description

see(FileName) sets the current input stream to FileName. If there is a stream opened by see/1 associated with the same FileName already, then it becomes the current input stream. Otherwise, FileName is opened for reading and becomes the current input stream.

tell(FileName) sets the current output stream to FileName. If there is a stream opened by tell/1 associated with the same FileName already, then it becomes the current output stream. Otherwise, FileName is opened for writing and becomes the current output stream.

append(FileName) like tell/1 but FileName is opened for writing + append.

A stream-term (obtained with any other built-in predicate) can also be provided as FileName to these predicates.

Errors

See errors associated with open/4 (section 7.10.6).

Portability

GNU Prolog predicates.

7.16.3  seeing/1, telling/1

Templates
seeing(?source_sink)
telling(?source_sink)
Description

seeing(FileName) succeeds if FileName unifies with the name of the current input file, if it was opened by see/1; else with the current input stream-term, if this is not user_input, otherwise with user.

telling(FileName) succeeds if FileName unifies with the name of the current output file, if it was opened by tell/1 or append/1; else with the current output stream-term, if this is not user_output, otherwise with user.

Errors

None.

Portability

GNU Prolog predicates.

7.16.4  seen/0, told/0

Templates
seen
told
Description

seen closes the current input, and resets it to user_input.

told closes the current output, and resets it to user_output.

Errors

None.

Portability

GNU Prolog predicates.

7.16.5  get0/1, get/1, skip/1

Templates
get0(?in_character_code)
get(?in_character_code)
skip(+character_code)
Description

get0(Code) succeeds if Code unifies with the next character code read from the current input stream. Thus it is equivalent to get_code(Code) (section 7.12.1).

get(Code) succeeds if Code unifies with the next character code read from the current input stream that is not a layout character.

skip(Code) skips just past the next character code Code from the current input stream.

Errors

See errors for get_code/2 (section 7.12.1).

Portability

GNU Prolog predicates.

7.16.6  put/1, tab/1

Templates
put(+character_code)
tab(+evaluable)
Description

put(Code) writes the character whose code is Code onto the current output stream. It is equivalent to put_code(Code) (section 7.12.5).

tab(N) writes N spaces onto the current output stream. N may be an arithmetic expression.

Errors

See errors for put_code/2 (section 7.12.5) and for arithmetic expressions (section 7.6.1).

Portability

GNU Prolog predicates.


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog054.html0000644004425400513100000001135210547441640017306 0ustar diazloco Finite domain solver and built-in predicates Previous Up Next

8  Finite domain solver and built-in predicates


Copyright (C) 1999-2007 Daniel Diaz

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

More about the copyright
Previous Up Next ./gprolog-1.3.0/doc/html_node/hh-gprolog.hhk0000644004425400513100000037255110547441641017274 0ustar diazloco
  • rgument selector
  • ./gprolog-1.3.0/doc/html_node/gprolog017.html0000644004425400513100000000360710547441640017311 0ustar diazloco General format Up Next

    5.1  General format

    The definition of control constructs, directives and built-in predicates is presented as follows:

    Templates

    Specifies the types of the arguments and which of them shall be instantiated (mode). Types and modes are described later (section 5.2).

    Description

    Describes the behavior (in the absence of any error conditions). It is explicitly mentioned when a built-in predicate is re-executable on backtracking. Predefined operators involved in the definition are also mentioned.

    Errors

    Details the error conditions. Possible errors are detailed later (section 5.3). For directives, this part is omitted.

    Portability

    Specifies whether the definition conforms to the ISO standard or is a GNU Prolog extension.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Up Next ./gprolog-1.3.0/doc/html_node/gprolog048.html0000644004425400513100000001747610547441640017326 0ustar diazloco Random number generator Previous Up Next

    7.25  Random number generator

    7.25.1  set_seed/1, randomize/0

    Templates
    set_seed(+integer)
    randomize
    Description

    set_seed(Seed) reinitializes the random number generator seed with Seed.

    randomize reinitializes the random number generator. This predicates calls set_seed/1 with a random value depending on the absolute time.

    Errors
    Seed is a variable    instantiation_error
    Seed is neither a variable nor an integer    type_error(integer, Seed)
    Seed is an integer < 0    domain_error(not_less_than_zero, Seed)

    Portability

    GNU Prolog predicates.

    7.25.2  get_seed/1

    Templates
    get_seed(?integer)
    Description

    get_seed(Seed) unifies Seed with the current random number generator seed.

    Errors
    Seed is neither a variable nor an integer    type_error(integer, Seed)
    Seed is an integer < 0    domain_error(not_less_than_zero, Seed)

    Portability

    GNU Prolog predicate.

    7.25.3  random/1

    Templates
    random(-float)
    Description

    random(Number) unifies Number with a random floating point number such that 0.0 ≤ Number < 1.0.

    Errors
    Number is not a variable    type_error(variable, Number)

    Portability

    GNU Prolog predicate.

    7.25.4  random/3

    Templates
    random(+number, +number, -number)
    Description

    random(Base, Max, Number) unifies Number with a random number such that BaseNumber < Max. If both Base and Max are integers Number will be an integer, otherwise Number will be a floating point number.

    Errors
    Base is a variable    instantiation_error
    Base is neither a variable nor a number    type_error(number, Base)
    Max is a variable    instantiation_error
    Max is neither a variable nor a number    type_error(number, Max)
    Number is not a variable    type_error(variable, Number)

    Portability

    GNU Prolog predicate.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog060.html0000644004425400513100000003260610547441640017310 0ustar diazloco Arithmetic constraints Previous Up Next

    8.6  Arithmetic constraints

    8.6.1  FD arithmetic expressions

    An FD arithmetic expression is a Prolog term built from integers, variables (Prolog or FD variables), and functors (or operators) that represent arithmetic functions. The following table details the components of an FD arithmetic expression:
    FD Expression
    Result
    Prolog variable
    domain 0..fd_max_integer
    FD variable X
    domain of X
    integer number N
    domain N..N
    + E
    same as E
    - E
    opposite of E
    E1 + E2
    sum of E1 and E2
    E1 - E2
    subtraction of E2 from E1
    E1 * E2
    multiplication of E1 by E2
    E1 / E2
    integer division of E1 by E2 (only succeeds if the remainder is 0)
    E1 ** E2
    E1 raised to the power of E2 (E1 or E2 must be an integer)
    min(E1,E2)
    minimum of E1 and E2
    max(E1,E2)
    maximum of E1 and E2
    dist(E1,E2)
    distance, i.e. |E1 - E2|
    E1 // E2
    quotient of the integer division of E1 by E2
    E1 rem E2
    remainder of the integer division of E1 by E2
    quot_rem(E1,E2,R)
    quotient of the integer division of E1 by E2
    (R is the remainder of the integer division of E1 by E2)

    FD expressions are not restricted to be linear. However non-linear constraints usually yield less constraint propagation than linear constraints.

    +, -, *, /, //, rem and ** are predefined infix operators. + and - are predefined prefix operators (section 7.14.10).

    Errors
    a sub-expression is of the form _ ** E and E is a variable    instantiation_error
    a sub-expression E is neither a variable nor an integer nor an FD arithmetic functor    type_error(fd_evaluable, E)
    an expression is too complex    resource_error(too_big_fd_constraint)

    8.6.2  Partial AC: (#=)/2 - constraint equal, (#\=)/2 - constraint not equal,
    (#<)/2 - constraint less than, (#=<)/2 - constraint less than or equal,
    (#>)/2 - constraint greater than, (#>=)/2 - constraint greater than or equal

    Templates
    #=(?fd_evaluable, ?fd_evaluable)
    #\=(?fd_evaluable, ?fd_evaluable)
    #<(?fd_evaluable, ?fd_evaluable)
    #=<(?fd_evaluable, ?fd_evaluable)
    #>(?fd_evaluable, ?fd_evaluable)
    #>=(?fd_evaluable, ?fd_evaluable)
    Description

    FdExpr1 #= FdExpr2 constrains FdExpr1 to be equal to FdExpr2.

    FdExpr1 #\= FdExpr2 constrains FdExpr1 to be different from FdExpr2.

    FdExpr1 #< FdExpr2 constrains FdExpr1 to be less than FdExpr2.

    FdExpr1 #=< FdExpr2 constrains FdExpr1 to be less than or equal to FdExpr2.

    FdExpr1 #> FdExpr2 constrains FdExpr1 to be greater than FdExpr2.

    FdExpr1 #>= FdExpr2 constrains FdExpr1 to be greater than or equal to FdExpr2.

    FdExpr1 and FdExpr2 are arithmetic FD expressions (section 8.6.1).

    #=, #\=, #<, #=<, #> and #>= are predefined infix operators (section 7.14.10).

    These predicates post arithmetic constraints that are managed by the solver using a partial arc-consistency algorithm to reduce the domain of involved variables. In this scheme only the bounds of the domain of variables are updated. This leads to less propagation than full arc-consistency techniques (section 8.6.3) but is generally more efficient for arithmetic. These arithmetic constraints can be reified (section 8.7).

    Errors

    Refer to the syntax of arithmetic FD expressions for possible errors (section 8.6.1).

    Portability

    GNU Prolog predicates.

    8.6.3  Full AC: (#=#)/2 - constraint equal, (#\=#)/2 - constraint not equal,
    (#<#)/2 - constraint less than, (#=<#)/2 - constraint less than or equal,
    (#>#)/2 - constraint greater than, (#>=#)/2 - constraint greater than or equal

    Templates
    #=#(?fd_evaluable, ?fd_evaluable)
    #\=#(?fd_evaluable, ?fd_evaluable)
    #<#(?fd_evaluable, ?fd_evaluable)
    #=<#(?fd_evaluable, ?fd_evaluable)
    #>#(?fd_evaluable, ?fd_evaluable)
    #>=#(?fd_evaluable, ?fd_evaluable)
    Description

    FdExpr1 #=# FdExpr2 constrains FdExpr1 to be equal to FdExpr2.

    FdExpr1 #\=# FdExpr2 constrains FdExpr1 to be different from FdExpr2.

    FdExpr1 #<# FdExpr2 constrains FdExpr1 to be less than FdExpr2.

    FdExpr1 #=<# FdExpr2 constrains FdExpr1 to be less than or equal to FdExpr2.

    FdExpr1 #># FdExpr2 constrains FdExpr1 to be greater than FdExpr2.

    FdExpr1 #>=# FdExpr2 constrains FdExpr1 to be greater than or equal to FdExpr2.

    FdExpr1 and FdExpr2 are arithmetic FD expressions (section 8.6.1).

    #=#, #\=#, #<#, #=<#, #># and #>=# are predefined infix operators (section 7.14.10).

    These predicates post arithmetic constraints that are managed by the solver using a full arc-consistency algorithm to reduce the domain of involved variables. In this scheme the full domain of variables is updated. This leads to more propagation than partial arc-consistency techniques (section 8.6.1) but is generally less efficient for arithmetic. These arithmetic constraints can be reified (section 8.7.1).

    Errors

    Refer to the syntax of arithmetic FD expressions for possible errors (section 8.6.1).

    Portability

    GNU Prolog predicates.

    8.6.4  fd_prime/1, fd_not_prime/1

    Templates
    fd_prime(?fd_variable)
    fd_not_prime(?fd_variable)
    Description

    fd_prime(X) constraints X to be a prime number between 0..vector_max. This constraint enforces a sparse representation for the domain of X (section 8.1).

    fd_not_prime(X) constraints X to be a non prime number between 0..vector_max. This constraint enforces a sparse representation for the domain of X (section 8.1).

    Errors
    X is neither an FD variable nor an integer    type_error(fd_variable, X)

    Portability

    GNU Prolog predicates.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog050.html0000644004425400513100000023344410547441640017312 0ustar diazloco Operating system interface Previous Up Next

    7.27  Operating system interface

    7.27.1  argument_counter/1

    Templates
    argument_counter(?integer)
    Description

    argument_counter(Counter) succeeds if Counter is the number of arguments of the command-line. Since the first argument is always the name of the running program, Counter is always ≥ 1. See (section 3.2) for more information about command-line arguments retrieved under the top_level.

    Errors
    Counter is neither a variable nor an integer    type_error(integer, Counter)

    Portability

    GNU Prolog predicate.

    7.27.2  argument_value/2

    Templates
    argument_value(+integer, ?atom)
    Description

    argument_value(N, Arg) succeeds if the Nth argument on the command-line unifies with Arg. The first argument is always the name of the running program and its number is 0. The number of arguments on the command-line can be obtained using argument_counter/1 (section 7.27.1).

    Errors
    N is a variable    instantiation_error
    N is neither a variable nor an integer    type_error(integer, N)
    N is an integer < 0    domain_error(not_less_than_zero, N)
    Arg is neither a variable nor an atom    type_error(atom, Arg)

    Portability

    GNU Prolog predicate.

    7.27.3  argument_list/1

    Templates
    argument_list(?list)
    Description

    argument_list(Args) succeeds if Args unifies with the list of atoms associated with each argument on the command-line other than the first argument (the name of the running program).

    Errors
    Args is neither a partial list nor a list    type_error(list, Args)

    Portability

    GNU Prolog predicate.

    7.27.4  environ/2

    Templates
    environ(?atom, ?atom)
    Description

    environ(Name, Value) succeeds if Name is the name of an environment variable whose value is Value. This predicate is re-executable on backtracking.

    Errors
    Name is neither a variable nor an atom    type_error(atom, Name)
    Value is neither a variable nor an atom    type_error(atom, Value)

    Portability

    GNU Prolog predicate.

    7.27.5  make_directory/1, delete_directory/1, change_directory/1

    Templates
    make_directory(+atom)
    delete_directory(+atom)
    change_directory(+atom)
    Description

    make_directory(PathName) creates the directory whose pathname is PathName.

    delete_directory(PathName) removes the directory whose pathname is PathName.

    change_directory(PathName) sets the current directory to the directory whose pathname is PathName.

    See absolute_file_name/2 for information about the syntax of PathName (section 7.26.1).

    Errors
    PathName is a variable    instantiation_error
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    PathName is an atom but not a valid pathname    domain_error(os_path, PathName)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.27.6  working_directory/1

    Templates
    working_directory(?atom)
    Description

    working_directory(PathName) succeeds if PathName is the pathname of the current directory.

    Errors
    PathName is neither a variable nor an atom    type_error(atom, PathName)

    Portability

    GNU Prolog predicate.

    7.27.7  directory_files/2

    Templates
    directory_files(+atom, ?list)
    Description

    directory_files(PathName, Files) succeeds if Files is the list of all entries (files, sub-directories,...) in the directory whose pathname is PathName. See absolute_file_name/2 for information about the syntax of PathName (section 7.26.1).

    Errors
    PathName is a variable    instantiation_error
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    PathName is an atom but not a valid pathname    domain_error(os_path, PathName)
    Files is neither a partial list nor a list    type_error(list, Files)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.8  rename_file/2

    Templates
    rename_file(+atom, +atom)
    Description

    rename_file(PathName1, PathName2) renames the file or directory whose pathname is PathName1 to PathName2. See absolute_file_name/2 for information about the syntax of PathName1 and PathName2 (section 7.26.1).

    Errors
    PathName1 is a variable    instantiation_error
    PathName1 is neither a variable nor an atom    type_error(atom, PathName1)
    PathName1 is an atom but not a valid pathname    domain_error(os_path, PathName1)
    PathName2 is a variable    instantiation_error
    PathName2 is neither a variable nor an atom    type_error(atom, PathName2)
    PathName2 is an atom but not a valid pathname    domain_error(os_path, PathName2)
    an operating system error occurs and value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.9  delete_file/1, unlink/1

    Templates
    delete_file(PathName)
    unlink(PathName)
    Description

    delete_file(PathName) removes the existing file whose pathname is PathName.

    unlink/1 is similar to delete_file/1 except that it never causes a system_error (e.g. if PathName does not refer to an existing file).

    See absolute_file_name/2 for information about the syntax of PathName (section 7.26.1).

    Errors
    PathName is a variable    instantiation_error
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    PathName is an atom but not a valid pathname    domain_error(os_path, PathName)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.27.10  file_permission/2, file_exists/1

    Templates
    file_permission(+atom, +atom)
    file_permission(+atom, +atom_list)
    file_exists(+atom)
    Description

    file_permission(PathName, Permission) succeeds if PathName is the pathname of an existing file (or directory) whose permissions include Permission.

    File permissions: Permission can be a single permission or a list of permissions. A permission is an atom among:
    • read: the file or directory can be read.

    • write: the file or directory can be written.

    • execute: the file can be executed.

    • search: the directory can be searched.
    If PathName does not exists or if it its permissions do not include Permission this predicate fails.

    file_exists(PathName) is equivalent to file_permission(PathName, []), i.e. it succeeds if PathName is the pathname of an existing file (or directory).

    See absolute_file_name/2 for information about the syntax of PathName (section 7.26.1).

    Errors
    PathName is a variable    instantiation_error
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    PathName is an atom but not a valid pathname    domain_error(os_path, PathName)
    Permission is a partial list or a list with an element which is a variable    instantiation_error
    Permission is neither an atom nor partial list or a list    type_error(list, Permission)
    an element E of the Permission list is neither a variable nor an atom    type_error(atom, E)
    an element E of the Permission is an atom but not a valid permission    domain_error(os_file_permission, Permission)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.27.11  file_property/2

    Templates
    file_property(+atom, ?os_file_property)
    Description

    file_property(PathName, Property) succeeds if PathName is the pathname of an existing file (or directory) and if Property unifies with one of the properties of the file. This predicate is re-executable on backtracking.

    File properties:
    • absolute_file_name(File): File is the absolute file name of PathName (section 7.26.1).

    • real_file_name(File): File is the real file name of PathName (follows symbolic links).

    • type(Type): Type is the type of PathName. Possible values are: regular, directory, fifo, socket, character_device, block_device or unknown.

    • size(Size): Size is the size (in bytes) of PathName.

    • permission(Permission): Permission is a permission of PathName (section 7.27.10).

    • last_modification(DT): DT is the last modification date and time (section 7.27.14).
    See absolute_file_name/2 for information about the syntax of PathName (section 7.26.1).

    Errors
    PathName is a variable    instantiation_error
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    PathName is an atom but not a valid pathname    domain_error(os_path, PathName)
    Property is neither a variable nor a file property term    domain_error(os_file_property, Property)
    Property = absolute_file_name(E), real_file_name(E), type(E) or permission(E) and E is neither a variable nor an atom    type_error(atom, E)
    Property = last_modification(DateTime) and DateTime is neither a variable nor a compound term    type_error(compound, DateTime)
    Property = last_modification(DateTime) and DateTime is a compound term but not a structure dt/6    domain_error(date_time, DateTime)
    Property = size(E) or last_modification(DateTime) and DateTime is a structure dt/6 but an element E is neither a variable nor an integer    type_error(integer, E)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.12  temporary_name/2

    Templates
    temporary_name(+atom, ?atom)
    Description

    temporary_name(Template, PathName) creates a unique file name PathName whose pathname begins by Template. Template should contain a pathname with six trailing Xs. PathName is Template with the six Xs replaced with a letter and the process identifier. This predicate is an interface to the C Unix function mktemp(3).

    See absolute_file_name/2 for information about the syntax of Template (section 7.26.1).

    Errors
    Template is a variable    instantiation_error
    Template is neither a variable nor an atom    type_error(atom, Template)
    Template is an atom but not a valid pathname    domain_error(os_path, Template)
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.13  temporary_file/3

    Templates
    temporary_file(+atom, +atom, ?atom)
    Description

    temporary_file(Directory, Prefix, PathName) creates a unique file name PathName whose pathname begins by Directory/Prefix. If Directory is the empty atom a standard temporary directory will be used (e.g. /tmp). Prefix can be the empty atom . This predicate is an interface to the C Unix function tempnam(3).

    See absolute_file_name/2 for information about the syntax of Directory (section 7.26.1).

    Errors
    Directory is a variable    instantiation_error
    Directory is neither a variable nor an atom    type_error(atom, Directory)
    Directory is an atom but not a valid pathname    domain_error(os_path, Directory)
    Prefix is a variable    instantiation_error
    Prefix is neither a variable nor an atom    type_error(atom, Prefix)
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.14  date_time/1

    Templates
    date_time(?compound)
    Description

    date_time(DateTime) unifies DateTime with a compound term containing the current date and time. DateTime is a structure dt(Year, Month, Day, Hour, Minute, Second). Each sub-argument of the term dt/6 is an integer.

    Errors
    DateTime is neither a variable nor a compound term    type_error(compound, DateTime)
    DateTime is a compound term but not a structure dt/6    domain_error(date_time, DateTime)
    DateTime is a structure dt/6 and an element E is neither a variable nor an integer    type_error(integer, E)

    Portability

    GNU Prolog predicate.

    7.27.15  host_name/1

    Templates
    host_name(?atom)
    Description

    host_name(HostName) unifies HostName with the name of the host machine executing the current GNU Prolog process. If the sockets are available (section 7.28.1), the name returned will be fully qualified. In that case, host_name/1 will also succeed if HostName is instantiated to the unqualified name (or an alias) of the machine.

    Errors
    Hostname is neither a variable nor an atom    type_error(atom, HostName)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.16  os_version/1

    Templates
    os_version(?atom)
    Description

    os_version(OSVersion) unifies OSVersion with the operating system version of the machine executing the current GNU Prolog process.

    Errors
    OSVersion is neither a variable nor an atom    type_error(atom, OSVersion)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.17  architecture/1

    Templates
    architecture(?atom)
    Description

    architecture(Architecture) unifies Architecture with the name of the machine executing the current GNU Prolog process.

    Errors
    Architecture is neither a variable nor an atom    type_error(atom, Architecture)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.18  shell/2, shell/1, shell/0

    Templates
    shell(+atom, ?integer)
    shell(+atom)
    shell
    Description

    shell(Command, Status) invokes a new shell (named by the SHELL environment variable) passing Command for execution and unifies Status with the result of the execution. If Command is the empty atom a new interactive shell is executed. The control is returned to Prolog upon termination of the called process.

    shell(Command) is equivalent to shell(Command, 0).

    shell is equivalent to shell(”, 0).

    Errors
    Command is a variable    instantiation_error
    Command is neither a variable nor an atom    type_error(atom, Command)
    Status is neither a variable nor an integer    type_error(integer, Status)

    Portability

    GNU Prolog predicates.

    7.27.19  system/2, system/1

    Templates
    system(+atom, ?integer)
    system(+atom)
    Description

    system(Command, Status) invokes a new default shell passing Command for execution and unifies Status with the result of the execution. The control is returned to Prolog upon termination of the shell process. This predicate is an interface to the C Unix function system(3).

    system(Command) is equivalent to system(Command, 0).

    Errors
    Command is a variable    instantiation_error
    Command is neither a variable nor an atom    type_error(atom, Command)
    Status is neither a variable nor an integer    type_error(integer, Status)

    Portability

    GNU Prolog predicates.

    7.27.20  spawn/3, spawn/2

    Templates
    spawn(+atom, +atom_list, ?integer)
    spawn(+atom, +atom_list)
    Description

    spawn(Command, Arguments, Status) executes Command passing as arguments of the command-line each element of the list Arguments and unifies Status with the result of the execution. The control is returned to Prolog upon termination of the command.

    spawn(Command, Arguments) is equivalent to spawn(Command, Arguments, 0).

    Errors
    Command is a variable    instantiation_error
    Command is neither a variable nor an atom    type_error(atom, Command)
    Arguments is a partial list or a list with an element which is a variable    instantiation_error
    Arguments is neither a partial list nor a list    type_error(list, Arguments)
    an element E of the Arguments list is neither a variable nor an atom    type_error(atom, E)
    Status is neither a variable nor an integer    type_error(integer, Status)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.27.21  popen/3

    Templates
    popen(+atom, +io_mode, -stream)
    Description

    popen(Command, Mode, Stream) invokes a new default shell (by creating a pipe) passing Command for execution and associates a stream either to the standard input or the standard output of the created process. if Mode is read (resp. write) an input (resp. output) stream is created and Stream is unified with the stream-term associated. Writing to the stream writes to the standard input of the command while reading from the stream reads the command's standard output. The stream must be closed using close/2 (section 7.10.7). This predicate is an interface to the C Unix function popen(3).

    Errors
    Command is a variable    instantiation_error
    Command is neither a variable nor an atom    type_error(atom, Command)
    Mode is a variable    instantiation_error
    Mode is neither a variable nor an atom    type_error(atom, Mode)
    Mode is an atom but neither read nor write.    domain_error(io_mode, Mode)
    Stream is not a variable    type_error(variable, Stream)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.22  exec/5, exec/4

    Templates
    exec(+atom, -stream, -stream, -stream, -integer)
    exec(+atom, -stream, -stream, -stream)
    Description

    exec(Command, StreamIn, StreamOut, StreamErr, Pid) invokes a new default shell passing Command for execution and associates streams to standard streams of the created process. StreamIn is unified with the stream-term associated with the standard input stream of Command (it is an output stream). StreamOut is unified with the stream-term associated with the standard output stream of Command (it is an input stream). StreamErr is unified with the stream-term associated with the standard error stream of Command (it is an input stream). Pid is unified with the process identifier of the new process. This information is only useful if it is necessary to obtain the status of the execution using wait/2 (section 7.27.25). Until a call to wait/2 is done the process remains in the system processes table (as a zombie process if terminated). For this reason, if the status is not needed it is preferable to use exec/4.

    exec/4 is similar to exec/5 but the process is removed from system processes as soon as it is terminated.

    Errors
    Command is a variable    instantiation_error
    Command is neither a variable nor an atom    type_error(atom, Command)
    StreamIn is not a variable    type_error(variable, StreamIn)
    StreamOut is not a variable    type_error(variable, StreamOut)
    StreamErr is not a variable    type_error(variable, StreamErr)
    Pid is not a variable    type_error(variable, Pid)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.27.23  fork_prolog/1

    Templates
    fork_prolog(-integer)
    Description

    fork_prolog(Pid) creates a child process that differs from the parent process only in its PID. In the parent process Pid is unified with the PID of the child while in the child process Pid is unified with 0. In the parent process, the status of the child process can be ontained using wait/2 (section 7.27.25). Until a call to wait/2 is done the child process remains in the system processes table (as a zombie process if terminated). This predicate is an interface to the C Unix function fork(2).

    Errors
    Pid is not a variable    type_error(variable, Pid)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.24  create_pipe/2

    Templates
    create_pipe(-stream, -stream)
    Description

    create_pipe(StreamIn, StreamOut) creates a pair of streams pointing to a pipe inode. StreamIn is unified with the stream-term associated with the input side of the pipe and StreamOut is unified with the stream-term associated with output side. This predicate is an interface to the C Unix function pipe(2).

    Errors
    StreamIn is not a variable    type_error(variable, StreamIn)
    StreamOut is not a variable    type_error(variable, StreamOut)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.25  wait/2

    Templates
    wait(+integer, ?integer)
    Description

    wait(Pid, Status) waits for the child process whose identifier is Pid to terminate. Status is then unified with the exit status. This predicate is an interface to the C Unix function waitpid(2).

    Errors
    Pid is a variable    instantiation_error
    Pid is neither a variable nor an integer    type_error(integer, Pid)
    Status is neither a variable nor an integer    type_error(integer, Status)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.26  prolog_pid/1

    Templates
    prolog_pid(?integer)
    Description

    prolog_pid(Pid) unifies Pid with the process identifier of the current GNU Prolog process.

    Errors
    Pid is neither a variable nor an integer    type_error(integer, Pid)

    Portability

    GNU Prolog predicate.

    7.27.27  send_signal/2

    Templates
    send_signal(+integer, +integer)
    send_signal(+integer, +atom)
    Description

    send_signal(Pid, Signal) sends Signal to the process whose identifier is Pid. Signal can be specified directly as an integer or symbolically as an atom. Allowed atoms depend on the machine (e.g. 'SIGINT', 'SIGQUIT', 'SIGKILL', 'SIGUSR1', 'SIGUSR2', 'SIGALRM',...). This predicate is an interface to the C Unix function kill(2).

    Errors
    Pid is a variable    instantiation_error
    Pid is neither a variable nor an integer    type_error(integer, Pid)
    Signal is a variable    instantiation_error
    Signal is neither a variable nor an integer or an atom    type_error(integer, Signal)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.28  sleep/1

    Templates
    sleep(+number)
    Description

    sleep(Seconds) puts the GNU Prolog process to sleep for Seconds seconds. Seconds can be an integer or a floating point number (in which case it can be < 1). This predicate is an interface to the C Unix function usleep(3).

    Errors
    Seconds is a variable    instantiation_error
    Seconds is neither a variable nor a number    type_error(number, Seconds)
    Seconds is a number < 0    domain_error(not_less_than_zero, Seconds)

    Portability

    GNU Prolog predicate.

    7.27.29  select/5

    Templates
    select(+list, ?list, +list, ?list, +number)
    Description

    select(Reads, ReadyReads, Writes, ReadyWrites, TimeOut) waits for a number of streams (or file descriptors) to change status. ReadyReads is unified with the list of elements listed in Reads that have characters available for reading. Similarly ReadyWrites is unified with the list of elements of Writes that are ok for immediate writing. The elements of Reads and Writes are either stream-terms or aliases or integers considered as file descriptors, e.g. for sockets (section 7.28). Streams that must be tested with select/5 should not be buffered. This can be done at the opening using open/4 (section 7.10.6) or later using set_stream_buffering/2 (section 7.10.27). TimeOut is an upper bound on the amount of time (in milliseconds) elapsed before select/5 returns. If TimeOut ≤ 0 (no timeout) select/5 waits until something is available (either or reading or for writing) and thus can block indefinitely. This predicate is an interface to the C Unix function select(2).

    Errors
    Reads (or Writes) is a partial list or a list with an element E which is a variable    instantiation_error
    Reads is neither a partial list nor a list    type_error(list, Reads)
    Writes is neither a partial list nor a list    type_error(list, Writes)
    ReadyReads is neither a partial list nor a list    type_error(list, ReadyReads)
    ReadyWrites is neither a partial list nor a list    type_error(list, ReadyWrites)
    an element E of the Reads (or Writes) list is neither a stream-term or alias nor an integer    domain_error(stream_or_alias, E)
    an element E of the Reads (or Writes) list is not a selectable item    domain_error(selectable_item, E)
    an element E of the Reads (or Writes) list is an integer < 0    domain_error(not_less_than_zero, E)
    an element E of the Reads (or Writes) list is a stream-tern or alias not associated with an open stream    existence_error(stream, E)
    an element E of the Reads list is associated with an output stream    permission_error(input, stream, E)
    an element E of the Writes list is associated with an input stream    permission_error(output, stream, E)
    TimeOut is a variable    instantiation_error
    TimeOut is neither a variable nor a number    type_error(number, TimeOut)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog032.html0000644004425400513100000002036110547441640017302 0ustar diazloco All solutions Previous Up Next

    7.9  All solutions

    7.9.1  Introduction

    It is sometimes useful to collect all solutions for a goal. This can be done by repeatedly backtracking and gradually building the list of solutions. The following built-in predicates are provided to automate this process.

    The built-in predicates described in this section invoke call/1 (section 6.2.3) on the argument Goal. When efficiency is crucial and Goal is complex it is better to define an auxiliary predicate which can then be compiled, and have Goal call this predicate.

    7.9.2  findall/3

    Templates
    findall(?term, +callable_term, ?list)
    Description

    findall(Template, Goal, Instances) succeeds if Instances unifies with the list of values to which a variable X not occurring in Template or Goal would be instantiated by successive re-executions of call(Goal), X = Template after systematic replacement of all variables in X by new variables. Thus, the order of the list Instances corresponds to the order in which the proofs are found.

    Errors
    Goal is a variable    instantiation_error
    Goal is neither a variable nor a callable term    type_error(callable, Goal)
    The predicate indicator Pred of Goal does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)
    Instances is neither a partial list nor a list    type_error(list, Instances)

    Portability

    ISO predicate.

    7.9.3  bagof/3, setof/3

    Templates
    bagof(?term, +callable_term, ?list)
    setof(?term, +callable_term, ?list)
    Description

    bagof(Template, Goal, Instances) assembles as a list the set of solutions of Goal for each different instantiation of the free variables in Goal. The elements of each list are in order of solution, but the order in which each list is found is undefined. This predicate is re-executable on backtracking.

    Free variable set: bagof/3 groups the solutions of Goal according to the free variables in Goal. This set corresponds to all variables occurring in Goal but not in Template. It is sometimes useful to exclude some additional variables of Goal. For that, bagof/3 recognizes a goal of the form T^Goal and exclude all variables occuring in T from the free variable set. (^)/2 can be viewed as an existential quantifier (the logical reading of X^Goal being “there exists an X such that Goal is true”). The use of this existential qualifier is superfluous outside bagof/3 (and setof/3) and then is not recognized.

    (^)/2 is a predefined infix operator (section 7.14.10).

    setof(Template, Goal, Instances) is equivalent to bagof(Template,Goal,I), sort(I,Instances). Each list is then a sorted list (duplicate elements are removed).

    From the implementation point of view setof/3 is as fast as bagof/3. Both predicates use an in-place (i.e. destructive) sort (section 7.20.12) and require the same amount of memory.

    Errors
    Goal is a variable    instantiation_error
    Goal is neither a variable nor a callable term    type_error(callable, Goal)
    The predicate indicator Pred of Goal does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)
    Instances is neither a partial list nor a list    type_error(list, Instances)

    Portability

    ISO predicates.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog036.html0000644004425400513100000003466510547441640017322 0ustar diazloco Byte input/output Previous Up Next

    7.13  Byte input/output

    These built-in predicates enable a single byte to be input from and output to a binary stream. -1 is returned to indicate the end-of-file.

    7.13.1  get_byte/2, get_byte/1

    Templates
    get_byte(+stream_or_alias, ?in_byte)
    get_byte(?in_byte)
    Description

    get_byte(SorA, Byte) succeeds if Byte unifies with the next byte read from the stream associated with the stream-term or alias SorA.

    get_byte/1 applies to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Byte is neither a variable nor an in-byte    type_error(in_byte, Byte)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a text stream    permission_error(input, text_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)

    Portability

    ISO predicates.

    7.13.2  peek_byte/2, peek_byte/1

    Templates
    peek_byte(+stream_or_alias, ?in_byte)
    peek_byte(?in_byte)
    Description

    peek_byte(SorA, Byte) succeeds if Byte unifies with the next byte that will be read from the stream associated with the stream-term or alias SorA. The byte is not read.

    peek_byte/1 applies to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Byte is neither a variable nor an in-byte    type_error(in_byte, Byte)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a text stream    permission_error(input, text_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)

    Portability

    ISO predicates.

    7.13.3  unget_byte/2, unget_byte/1

    Templates
    unget_byte(+stream_or_alias, +byte)
    unget_byte(+byte)
    Description

    unget_byte(SorA, Byte) pushes back Byte onto the stream associated with the stream-term or alias SorA. Byte will be the next byte read by get_byte/2. The maximum number of bytes that can be successively pushed back is given by the max_unget Prolog flag (section 7.22.1).

    unget_byte/1 applies to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Byte is a variable    instantiation_error
    Byte is neither a variable nor a byte    type_error(byte, Byte)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a text stream    permission_error(input, text_stream, SorA)

    Portability

    GNU Prolog predicates.

    7.13.4  put_byte/2, put_byte/1

    Templates
    put_byte(+stream_or_alias, +byte)
    put_byte(+byte)
    Description

    put_byte(SorA, Byte) writes Byte onto the stream associated with the stream-term or alias SorA.

    put_byte/1 applies to the current output stream.

    Errors
    SorA is a variable    instantiation_error
    Byte is a variable    instantiation_error
    Byte is neither a variable nor a byte    type_error(byte, Byte)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(output, stream, SorA)
    SorA is associated with a text stream    permission_error(output, text_stream, SorA)

    Portability

    GNU Prolog predicates.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog067.html0000644004425400513100000005221010547441640017310 0ustar diazloco Manipulating Prolog terms Previous Up Next

    9.2  Manipulating Prolog terms

    9.2.1  Introduction

    In the following we presents a set of functions to manipulate Prolog terms. For simple foreign terms the functions manipulate simple C types (section 9.1.2).

    Functions managing lists handle an array of 2 elements (of type PlTerm) containing the terms corresponding to the head and the tail of the list. For the empty list NULL is passed as the array. These functions require to flatten a list in each sub-list. To simplify the management of proper lists (i.e. lists terminated by []) a set of functions is provided that handle the number of elements of the list (an integer) and an array whose elements (of type PlTerm) are the elements of the list. The caller of these functions must provide the array.

    Functions managing compound terms handle a functor (the principal functor of the term), an arity N ≥ 0 and an array of N elements (of type PlTerm) containing the sub-terms of the compound term. Since a list is a special case of compound term (functor = '.' and arity=2) it is possible to use any function managing compound terms to deal with a list but the error detection is not the same. Indeed many functions check if the Prolog argument is correct. The name of a read or unify function checking the Prolog arguments is of the form Name_Check(). For each of these functions there is a also check-free version called Name(). We then only present the name of checking functions.

    9.2.2  Managing Prolog atoms

    Each atom has a unique internal key which corresponds to its index in the GNU Prolog atom table. It is possible to obtain the information about an atom and to create new atoms using:
    char *Atom_Name           (int atom)
    int   Atom_Length         (int atom)
    Bool  Atom_Needs_Quote    (int atom)
    Bool  Atom_Needs_Scan     (int atom)
    Bool  Is_Valid_Atom       (int atom)
    int   Create_Atom         (char *str)
    int   Create_Allocate_Atom(char *str)
    int   Find_Atom           (char *str)
    int   ATOM_CHAR           (char c)
    int   atom_nil
    int   atom_false
    int   atom_true
    int   atom_end_of_file
    
    The macro Atom_Name(atom) returns the internal string of atom (this string should not be modified). The function Atom_Lengh(atom) returns the length (of the name) of atom.

    The function Atom_Needs_Scan(atom) indicates if the canonical form of atom needs to be quoted as done by writeq/2 (section 7.14.6). In that case Atom_Needs_Scan(atom) indicates if this simply comes down to write quotes around the name of atom or if it necessary to scan each character of the name because there are some non-printable characters (or included quote characters). The function Is_Valid_Atom(atom) is true only if atom is the internal key of an existing atom.

    The function Create_Atom(str) adds a new atom whose name is the content of str to the system and returns its internal key. If the atom already exists its key is simply returned. The string str passed to the function should not be modified later. The function Create_Allocate_Atom(str) is provided when this condition cannot be ensured. It simply makes a dynamic copy of str.

    The function Find_Atom(str) returns the internal key of the atom whose name is str or -1 if does not exist.

    All atoms corresponding to a single character already exist and their key can be obtained via the macro ATOM_CHAR. For instance ATOM_CHAR('.') is the atom associated with '.' (this atom is the functor of lists). The other variables correspond to the internal key of frequently used atoms: [], false, true and end_of_file.

    9.2.3  Reading Prolog terms

    The name of all functions presented here are of the form Rd_Name_Check(). They all check the validity of the Prolog term to read emitting appropriate errors if necessary. Each function has a check-free version called Rd_Name().

    Simple foreign types: for each simple foreign type (section 9.1.2) there is a read function (used by the interface when an input argument is provided):
    long    Rd_Integer_Check  (PlTerm term)
    long    Rd_Positive_Check (PlTerm term)
    double  Rd_Float_Check    (PlTerm term)
    double  Rd_Number_Check   (PlTerm term)
    int     Rd_Atom_Check     (PlTerm term)
    int     Rd_Boolean_Check  (PlTerm term)
    int     Rd_Char_Check     (PlTerm term)
    int     Rd_In_Char_Check  (PlTerm term)
    int     Rd_Code_Check     (PlTerm term)
    int     Rd_In_Code_Check  (PlTerm term)
    int     Rd_Byte_Check     (PlTerm term)
    int     Rd_In_Byte_Check  (PlTerm term)
    char   *Rd_String_Check   (PlTerm term)
    char   *Rd_Chars_Check    (PlTerm term)
    char   *Rd_Codes_Check    (PlTerm term)
    int     Rd_Chars_Str_Check(PlTerm term, char *str)
    int     Rd_Codes_Str_Check(PlTerm term, char *str)
    
    All functions returning a C string (char *) use a same buffer. The function Rd_Chars_Str_Check() is similar to Rd_Chars_Check() but accepts as argument a string to store the result and returns the length of that string (which is also the length of the Prolog list). Similarly for Rd_Codes_Str_Check().

    Complex terms: the following functions return the sub-arguments (terms) of complex terms as an array of PlTerm except Rd_Proper_List_Check() which returns the size of the list read (and initializes the array element). Refer to the introduction of this section for more information about the arguments of complex functions (section 9.2.1).
    int     Rd_Proper_List_Check(PlTerm term, PlTerm *arg)
    PlTerm *Rd_List_Check       (PlTerm term)
    PlTerm *Rd_Compound_Check   (PlTerm term, int *functor, int *arity)
    PlTerm *Rd_Callable_Check   (PlTerm term, int *functor, int *arity)
    

    9.2.4  Unifying Prolog terms

    The name of all functions presented here are of the form Un_Name_Check(). They all check the validity of the Prolog term to unify emitting appropriate errors if necessary. Each function has a check-free version called Un_Name().

    Simple foreign types: for each simple foreign type (section 9.1.2) there is an unify function (used by the interface when an output argument is provided):
    Bool Un_Integer_Check (long n,    PlTerm term)
    Bool Un_Positive_Check(long n,    PlTerm term)
    Bool Un_Float_Check   (double n,  PlTerm term)
    Bool Un_Number_Check  (double n,  PlTerm term)
    Bool Un_Atom_Check    (int atom,  PlTerm term)
    Bool Un_Boolean_Check (int b,     PlTerm term)
    Bool Un_Char_Check    (int c,     PlTerm term)
    Bool Un_In_Char_Check (int c,     PlTerm term)
    Bool Un_Code_Check    (int c,     PlTerm term)
    Bool Un_In_Code_Check (int c,     PlTerm term)
    Bool Un_Byte_Check    (int b,     PlTerm term)
    Bool Un_In_Byte_Check (int b,     PlTerm term)
    Bool Un_String_Check  (char *str, PlTerm term)
    Bool Un_Chars_Check   (char *str, PlTerm term)
    Bool Un_Codes_Check   (char *str, PlTerm term)
    
    The function Un_Number_Check(n, term) unifies term with an integer if n is an integer, with a floating point number otherwise. The function Un_String_Check(str, term) creates the atom corresponding to str and then unifies term with it (same as Un_Atom_Check(Create_Allocate_Atom(str), term)).

    Complex terms: the following functions accept the sub-arguments (terms) of complex terms as an array of PlTerm. Refer to the introduction of this section for more information about the arguments of complex functions (section 9.2.1).
    Bool Un_Proper_List_Check(int size, PlTerm *arg, PlTerm term)
    Bool Un_List_Check       (PlTerm *arg, PlTerm term)
    Bool Un_Compound_Check   (int functor, int arity, PlTerm *arg,
                              PlTerm term)
    Bool Un_Callable_Check   (int functor, int arity, PlTerm *arg,
                              PlTerm term)
    
    All these functions check the type of the term to unify and return the result of the unification. Generally if an unification fails the C function returns FALSE to enforce a failure. However if there are several arguments to unify and if an unification fails then the C function returns FALSE and the type of other arguments has not been checked. Normally all error cases are tested before doing any work to be sure that the predicate fails/succeeds only if no error condition is satisfied. So a good method is to check if the validity of all arguments to unify and later to do the unification (using check-free functions). Obviously if there is only one to unify it is more efficient to use a unify function checking the argument. For the other cases the interface provides a set of functions to check the type of a term.

    Simple foreign types: for each simple foreign type (section 9.1.2) there is check-for-unification function (used by the interface when an output argument is provided):
    void Check_For_Un_Integer (PlTerm term)
    void Check_For_Un_Positive(PlTerm term)
    void Check_For_Un_Float   (PlTerm term)
    void Check_For_Un_Number  (PlTerm term)
    void Check_For_Un_Atom    (PlTerm term)
    void Check_For_Un_Boolean (PlTerm term)
    void Check_For_Un_Char    (PlTerm term)
    void Check_For_Un_In_Char (PlTerm term)
    void Check_For_Un_Code    (PlTerm term)
    void Check_For_Un_In_Code (PlTerm term)
    void Check_For_Un_Byte    (PlTerm term)
    void Check_For_Un_In_Byte (PlTerm term)
    void Check_For_Un_String  (PlTerm term)
    void Check_For_Un_Chars   (PlTerm term)
    void Check_For_Un_Codes   (PlTerm term)
    
    Complex terms: the following functions check the validity of complex terms:
    void Check_For_Un_List    (PlTerm term)
    void Check_For_Un_Compound(PlTerm term)
    void Check_For_Un_Callable(PlTerm term)
    void Check_For_Un_Variable(PlTerm term)
    
    The function Check_For_Un_List(term) checks if term can be unified with a list. This test is done for the entire list (not only for the functor/arity of term but also recursively on the tail of the list). The function Check_For_Un_Variable(term) ensures that term is not currently instantiated. These functions can be defined using functions to test the type of a Prolog term (section 9.2.6) and functions to raise Prolog errors (section 9.3). For instance Check_For_Un_List(term) is defined as follows:
    void Check_For_Un_List(PlTerm term)
    {
     if (!Blt_List_Or_Partial_List(term))
         Pl_Err_Type(type_list, term);
    }
    

    9.2.5  Creating Prolog terms

    These functions are provided to creates Prolog terms. Each function returns a PlTerm containing the created term.

    Simple foreign types: for each simple foreign type (section 9.1.2) there is a creation function:
    PlTerm Mk_Integer (long n)
    PlTerm Mk_Positive(long n)
    PlTerm Mk_Float   (double n)
    PlTerm Mk_Number  (double n)
    PlTerm Mk_Atom    (int atom)
    PlTerm Mk_Boolean (int b)
    PlTerm Mk_Char    (int c)
    PlTerm Mk_In_Char (int c)
    PlTerm Mk_Code    (int c)
    PlTerm Mk_In_Code (int c)
    PlTerm Mk_Byte    (int b)
    PlTerm Mk_In_Byte (int b)
    PlTerm Mk_String  (char *str)
    PlTerm Mk_Chars   (char *str)
    PlTerm Mk_Codes   (char *str)
    
    The function Mk_Number(n, term) initializes term with an integer if n is an integer, with a floating point number otherwise. The function Mk_String(str) first creates an atom corresponding to str and then returns that Prolog atom (i.e. equivalent to Mk_Atom(Create_Allocate_Atom(str))).

    Complex terms: the following functions accept the sub-arguments (terms) of complex terms as an array of PlTerm. Refer to the introduction of this section for more information about the arguments of complex functions (section 9.2.1).
    PlTerm Mk_Proper_List(int size, PlTerm *arg)
    PlTerm Mk_List       (PlTerm *arg)
    PlTerm Mk_Compound   (int functor, int arity, PlTerm *arg)
    PlTerm Mk_Callable   (int functor, int arity, PlTerm *arg)
    

    9.2.6  Testing the type of Prolog terms

    The following functions test the type of a Prolog term. Each function corresponds to a type testing built-in predicate (section 7.1.1).
    Bool Blt_Var                 (PlTerm term)
    Bool Blt_Non_Var             (PlTerm term)
    Bool Blt_Atom                (PlTerm term)
    Bool Blt_Integer             (PlTerm term)
    Bool Blt_Float               (PlTerm term)
    Bool Blt_Number              (PlTerm term)
    Bool Blt_Atomic              (PlTerm term)
    Bool Blt_Compound            (PlTerm term)
    Bool Blt_Callable            (PlTerm term)
    Bool Blt_List                (PlTerm term)
    Bool Blt_Partial_List        (PlTerm term)
    Bool Blt_List_Or_Partial_List(PlTerm term)
    Bool Blt_Fd_Var              (PlTerm term)
    Bool Blt_Non_Fd_Var          (PlTerm term)
    Bool Blt_Generic_Var         (PlTerm term)
    Bool Blt_Non_Generic_Var     (PlTerm term)
    int  Type_Of_Term            (PlTerm term)
    int  List_Length             (PlTerm list)
    
    The function Type_Of_Term(term) returns the type of term, the following constants can be used to test this type (e.g. in a switch instruction):
    • PLV: Prolog variable.

    • FDV: finite domain variable.

    • INT: integer.

    • FLT: floating point number.

    • ATM: atom.

    • LST: list.

    • STC: structure
    The tag LST means a term whose principal functor is '.' and whose arity is 2 (recall that the empty list is the atom []). The tag STC means any other compound term.

    The function List_Length(list) returns the number of elements of the list (0 for the empty list). If list is not a list this function returns -1.

    9.2.7  Comparing Prolog terms

    The following functions compares Prolog terms. Each function corresponds to a comparison built-in predicate (section 7.3.2).
    Bool Blt_Term_Eq (PlTerm term1, PlTerm term2)
    Bool Blt_Term_Neq(PlTerm term1, PlTerm term2)
    Bool Blt_Term_Lt (PlTerm term1, PlTerm term2)
    Bool Blt_Term_Lte(PlTerm term1, PlTerm term2)
    Bool Blt_Term_Gt (PlTerm term1, PlTerm term2)
    Bool Blt_Term_Gte(PlTerm term1, PlTerm term2)
    
    All these functions are based on a general comparison function returning a negative integer if term1 is less than term2, 0 if they are equal and a positive integer otherwise:
    int Term_Compare(PlTerm term1, PlTerm term2)
    

    9.2.8  Copying Prolog terms

    The following functions make a copy of a Prolog term:
    void Copy_Term           (PlTerm *dst_adr, PlTerm *src_adr)
    void Copy_Contiguous_Term(PlTerm *dst_adr, PlTerm *src_adr)
    int  Term_Size           (PlTerm term)
    
    The function Copy_Term(dst_adr, src_adr) makes a copy of the term located at src_adr and stores it from the address given by dst_adr. The result is a contiguous term. If it can be ensured that the source term is a contiguous term (i.e. result of a previous copy) the function Copy_Contiguous_Term() can be used instead (it is faster). In any case, sufficient space should be available for the copy (i.e. from dst_adr). The function Term_Size(term) returns the number of PlTerm needed by term.

    9.2.9  Comparing and evaluating arithmetic expressions

    The following functions compare arithmetic expressions. Each function corresponds to a comparison built-in predicate (section 7.6.3).
    Bool Blt_Eq (PlTerm expr1, PlTerm expr2)
    Bool Blt_Neq(PlTerm expr1, PlTerm expr2)
    Bool Blt_Lt (PlTerm expr1, PlTerm expr2)
    Bool Blt_Lte(PlTerm expr1, PlTerm expr2)
    Bool Blt_Gt (PlTerm expr1, PlTerm expr2)
    Bool Blt_Gte(PlTerm expr1, PlTerm expr2)
    
    The following function evaluates the expression expr and stores its result as a Prolog number (integer or floating point number) in result:
    void Math_Load_Value(PlTerm expr, PlTerm *result)
    
    This function can be followed by a read function (section 9.2.3) to obtain the result.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/hh_do_hhc_hhk0000755004425400513100000000110410542254111017161 0ustar diazloco#!/bin/sh p=${1:-manual} sed -e 's!^\([^ ]*\) \(.*\)$!\\remember{\1}{\2}!' $p.hrf >/tmp/$p.hrf.hh hevea -text -w 1000 hh-$p.hhc sed -e 's!^\\indexitem \([^,]*\)\(, .*\)!\\indexitem{\1}\2£\\enditem!' \ -e 's!^\\indexitem \([^,]*,[^,]*\)\(, .*\)!\\indexitem{\1}\2£\\enditem!' \ -e 's!^\\indexitem{\([^}]*\)}\(, \\see *{\(.*\)} *{\\@locref\)!\\indexitem{\1, see \3}\2!' \ -e 's!, \\!£\\!g' \ ../$p.hind \ | tr '£' '\n' \ >/tmp/$p.hind.hh hevea -text -w 1000 hh-$p.hhk ./gprolog-1.3.0/doc/html_node/gprolog020.html0000644004425400513100000000516110547441640017300 0ustar diazloco Prolog directives and control constructs Previous Up Next

    6  Prolog directives and control constructs




    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog005.html0000644004425400513100000000507110547441640017303 0ustar diazloco Introduction Up Next

    3.1  Introduction

    GNU Prolog offers two ways to execute a Prolog program:
    • interpreting it using the GNU Prolog interactive interpreter.

    • compiling it to a (machine-dependent) executable using the GNU Prolog native-code compiler.
    Running a program under the interactive interpreter allows the user to list it and to make full use of the debugger on it (section 4). Compiling a program to native code makes it possible to obtain a stand alone executable, with a reduced size and optimized for speed. Running a Prolog program compiled to native-code is around 3-5 times faster than running it under the interpreter. However, it is not possible to make full use of the debugger on a program compiled to native-code. Nor is it possible to list the program. In general, it is preferable to run a program under the interpreter for debugging and then use the native-code compiler to produce an autonomous executable. It is also possible to combine these two modes by producing an executable that contains some parts of the program (e.g. already debugged predicates whose execution-time speed is crucial) and interpreting the other parts under this executable. In that case, the executable has the same facilities as the GNU Prolog interpreter but also integrates the native-code predicates. This way to define a new enriched interpreter is detailed later (section 3.4.5).


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Up Next ./gprolog-1.3.0/doc/html_node/gprolog008.html0000644004425400513100000010757610547441640017323 0ustar diazloco The GNU Prolog compiler Previous Up

    3.4  The GNU Prolog compiler

    3.4.1  Different kinds of codes

    One of the main advantages of GNU Prolog is its ability to produce stand alone executables. A Prolog program can be compiled to native code to give rise to a machine-dependent executable using the GNU Prolog compiler. However native-code predicates cannot be listed nor fully debugged. So there is an alternative to native-code compilation: byte-code compilation. By default the GNU Prolog compiler produces native-code but via a command-line option it can produce a file ready for byte-code loading. This is exactly what consult/1 does as was explained above (section 3.2.3). GNU Prolog also manages interpreted code using a Prolog interpreter written in Prolog. Obviously interpreted code is slower than byte-code but does not require the invocation of the GNU Prolog compiler. This interpreter is used each time a meta-call is needed as by call/1 (section 6.2.3). This also the case of dynamically asserted clauses. The following table summarizes these three kinds of codes:
    Type Speed Debug ? For what
    interpreted-code slow yes meta-call and dynamically asserted clauses
    byte-code medium yes consulted predicates
    native-code fast no compiled predicates

    3.4.2  Compilation scheme

    Native-code compilation: a Prolog source is compiled in several stages to produce an object file that is linked to the GNU Prolog libraries to produce an executable. The Prolog source is first compiled to obtain a WAM [9] file. For a detailed study of the WAM the interested reader can refer to “Warren's Abstract Machine: A Tutorial Reconstruction” [1]. The WAM file is translated to a machine-independent language specifically designed for GNU Prolog. This language is close to a (universal) assembly language and is based on a very reduced instruction set. For this reason this language is called mini-assembly (MA). The mini-assembly file is then mapped to the assembly language of the target machine. This assembly file is assembled to give rise to an object file which is then linked with the GNU Prolog libraries to provide an executable. The compiler also takes into account Finite Domain constraint definition files. It translates them to C and invoke the C compiler to obtain object files. The following figure presents this compilation scheme:



    Obviously all intermediate stages are hidden to the user who simply invokes the compiler on his Prolog file(s) (plus other files: C,...) and obtains an executable. However, it is also possible to stop the compiler at any given stage. This can be useful, for instance, to see the WAM code produced (perhaps when learning the WAM). Finally it is possible to give any kind of file to the compiler which will insert it in the compilation chain at the stage corresponding to its type. The type of a file is determined using the suffix of its file name. The following table presents all recognized types/suffixes:
    Suffix of the file Type of the file Handled by:
    .pl, .pro Prolog source file pl2wam
    .wam WAM source file wam2ma
    .ma Mini-assembly source file ma2asm
    .s Assembly source file the assembler
    .c, .C, .CC, .cc, .cxx, .c++, .cpp C or C++ source file the C compiler
    .fd Finite Domain constraint source file fd2c
    any other suffix (.o, .a,...) any other type (object, library,...) the linker (C linker)

    Byte-code compilation: the same compiler can be used to compile a source Prolog file for byte-code. In that case the Prolog to WAM compiler is invoked using a specific option and produces a WAM for byte-code source file (suffixed .wbc) that can be later loaded using load/1 (section 7.23.2). Note that this is exactly what consult/1 (section 7.23.1) does as explained above (section 3.2.3).

    3.4.3  Using the compiler

    The GNU Prolog compiler is a command-line compiler similar in spirit to a Unix C compiler like gcc. To invoke the compiler use the gplc command as follows:
    % gplc [OPTION]... FILE...    (the % symbol is the operating system shell prompt)
    The arguments of gplc are file names that are dispatched in the compilation scheme depending on the type determined from their suffix as was explained previously (section 3.4.2). All object files are then linked to produce an executable. Note however that GNU Prolog has no module facility (since there is not yet an ISO reference for Prolog modules) thus a predicate defined in a Prolog file is visible from any other predicate defined in any other file. GNU Prolog allows the user to split a big Prolog source into several files but does not offer any way to hide a predicate from others.

    The simplest way to obtain an executable from a Prolog source file prog.pl is to use:
    % gplc prog.pl
    This will produce an native executable called prog which can be executed as follows:
    % prog
    However, there are several options that can be used to control the compilation:

    General options:
    -o FILE, –output FILE use FILE as the name of the output file
    -W, –wam-for-native stop after producing WAM files(s)
    -w, –wam-for-byte-code stop after producing WAM for byte-code file(s) (force –no-call-c)
    -M, –mini-assembly stop after producing mini-assembly files(s)
    -S, –assembly stop after producing assembly files (s)
    -F, –fd-to-c stop after producing C files(s) from FD constraint definition file(s)
    -c, –object stop after producing object files(s)
    –temp-dir PATH use PATH as directory for temporary files
    –no-del-temp do not delete temporary files
    –no-decode-hexa do not decode hexadecimal predicate names
    -v, –verbose print executed commands
    -h, –help print a help and exit
    –version print version number and exit

    Prolog to WAM compiler options:
    –pl-state FILE read FILE to set the initial Prolog state
    –no-susp-warn do not show warnings for suspicious predicates
    –no-singl-warn do not show warnings for named singleton variables
    –no-redef-error no not show errors for built-in predicate redefinitions
    –foreign-only only compile foreign/1-2 directives
    –no-call-c do not allow the use of fd_tell, '$call_c',...
    –no-inline do not inline predicates
    –no-reorder do not reorder predicate arguments
    –no-reg-opt do not optimize registers
    –min-reg-opt minimally optimize registers
    –no-opt-last-subterm do not optimize last subterm compilation
    –fast-math use fast mathematical mode (assume integer arithmetics)
    –keep-void-inst keep void WAM instructions in the output file
    –compile-msg print a compile message
    –statistics print statistics information

    WAM to mini-assembly translator options:
    –comment include comments in the output file

    Mini-assembly to assembly translator options:
    –comment include comments in the output file

    C compiler options:
    –c-compiler FILE use FILE as C compiler
    -C OPTION pass OPTION to the C compiler

    Assembler options:
    -A OPTION pass OPTION to the assembler

    Linker options:
    –local-size N set default local stack size to N Kb
    –global-size N set default global stack size to N Kb
    –trail-size N set default trail stack size to N Kb
    –cstr-size N set default constraint stack size to N Kb
    –fixed-sizes do not consult environment variables at run-time (use default sizes)
    –no-top-level do not link the top-level (force –no-debugger)
    –no-debugger do not link the Prolog/WAM debugger
    –min-pl-bips link only used Prolog built-in predicates
    –min-fd-bips link only used FD solver built-in predicates
    –min-bips shorthand for: –no-top-level –min-pl-bips –min-fd-bips
    –min-size shorthand² for: –min-bips –strip
    –no-fd-lib do not look for the FD library (maintenance only)
    -s, –strip strip the executable
    -L OPTION Pass OPTION to the linker

    It is possible to only give the prefix of an option if there is no ambiguity.

    The name of the output file is controlled via the -o FILE option. If present the output file produced will be named FILE. If not specified, the output file name depends on the last stage reached by the compiler. If the link is not done the output file name(s) is the input file name(s) with the suffix associated with the last stage. If the link is done, the name of the executable is the name (without suffix) of the first file name encountered in the command-line. Note that if the link is not done -o has no sense in the presence of multiple input file names. For this reason, several meta characters are available for substitution in FILE:
    • %f is substitued by the whole input file name.
    • %F is similar to %f but the directory part is omitted.
    • %p is substitued by the whole prefix file name (omitting the suffix).
    • %P is similar to %p but the directory part is omitted.
    • %s is substitued by the file suffix (including the dot).
    • %d is substitued by the directory part (empty if no directory is specified).
    • %c is substitued by the value of an internal counter starting from 1 and auto-incremented.
    By default the compiler runs in the native-code compilation scheme. To generate a WAM file for byte-code use the –wam-for-byte-code option. The resulting file can then be loaded using load/1 (section 7.23.2).

    To execute the Prolog to WAM compiler in a given read environment (operator definitions, character conversion table,...) use –pl-state FILE. The state file should be produced by write_pl_state_file/1 (section 7.22.5).

    By default the Prolog to WAM compiler inlines calls to some deterministic built-in predicates (e.g. arg/3 and functor/3). Namely a call to such a predicate will not yield a classical predicate call but a simple C function call (which is obviously faster). It is possible to avoid this using –no-inline.

    Another optimization performed by the Prolog to WAM compiler is unification reordering. The arguments of a predicate are reordered to optimize unification. This can be deactivated using –no-reorder. The compiler also optimizes the unification/loading of nested compound terms. More precisely, the compiler emits optimized instructions when the last subterm of a compound term is itself a compound term (e.g. lists). This can be deactivated using –no-opt-last-subterm.

    By default the Prolog to WAM compiler fully optimizes the allocation of registers to decrease both the number of instruction produced and the number of used registers. A good allocation will generate many void instructions that are removed from the produced file except if –keep-void-inst is specified. To prevent any optimization use –no-reg-opt while –min-reg-opt forces the compiler to only perform simple register optimizations.

    The Prolog to WAM compiler emits an error when a control construct or a built-in predicate is redefined. This can be avoided using –no-redef-error. The compiler also emits warnings for suspicious predicate definitions like -/2 since this often corresponds to an earlier syntax error (e.g. - instead of _. This can be deactivated by specifying –no-susp-warn. Finally, the compiler warns when a singleton variable has a name (i.e. not the generic anonymous name _). This can be deactivated specifying –no-singl-warn.

    Predicate names are encoded with an hexadecimal representation. This is explained in more detail later (section 3.4.6). By default the error messages from the linker (e.g. multiple definitions for a given predicate, reference to an undefined predicate,...) are filtered to replace any hexadecimal representation by the real predicate name. Specifying the –no-decode-hexa prevents gplc from filtering linker output messages and hexadecimal representations are then shown.

    When producing an executable it is possible to specify default stack sizes (using STACK_NAME-size) and to prevent it from consulting environment variables (using –fixed-sizes) as was explained above (section 3.3). By default the produced executable will include the top-level, the Prolog/WAM debugger and all Prolog and FD built-in predicates. It is possible to avoid linking the top-level (section 3.2) by specifying –no-top-level. In this case, at least one initialization/1 directive (section 6.1.13) should be defined. The option –no-debugger does not link the debugger. To include only used built-in predicates that are actually used the options –no-pl-bips and/or –no-fd-bips can be specified. For the smallest executable all these options should be specified. This can be abbreviated by using the shorthand option –min-bips. By default, executables are not stripped, i.e. their symbol table is not removed. This table is only useful for the C debugger (e.g. when interfacing Prolog and C). To remove the symbol table (and then to reduce the size of the final executable) use –strip. Finally –min-size is a shortcut for –min-bips and –strip, i.e. the produced executable is as small as possible.

    Example: compile and link two Prolog sources prog1.pl and prog2.pl. The resulting executable will be named prog1 (since -o is not specified):
    % gplc prog1.pl prog2.pl
    Example: compile the Prolog file prog.pl to study basic WAM code. The resulting file will be named prog.wam:
    % gplc -W –no-inline –no-reorder –keep-void-inst prog.pl
    Example: compile the Prolog file prog.pl and its C interface file utils.c to provide an autonomous executable called mycommand. The executable is not stripped to allow the use of the C debugger:
    % gplc -o mycommand prog.pl utils.c
    Example: detail all steps to compile the Prolog file prog.pl (the resulting executable is stripped). All intermediate files are produced (prog.wam, prog.ma, prog.s, prog.o and the executable prog):
    % gplc -W prog.pl
    % gplc -M --comment prog.wam
    % gplc -S --comment prog.ma
    % gplc -c prog.s
    % gplc -o prog -s prog.o
    

    3.4.4  Running an executable

    In this section we explain what happens when running an executable produced by the GNU Prolog native-code compiler. The default main function first starts the Prolog engine. This function collects all linked objects (issued from the compilation of Prolog files) and initializes them. The initialization of a Prolog object file consists in adding to appropriate tables new atoms, new predicates and executing its system directives. A system directive is generated by the Prolog to WAM compiler to reflect a (user) directive executed at compile-time such as op/3 (section 6.1.10). Indeed, when the compiler encounters such a directive it immediately executes it and also generates a system directive to execute it at the start of the executable. When all system directives have been executed the Prolog engine executes all initialization directives defined with initialization/1 (section 6.1.13). If several initialization directives appear in the same file they are executed in the order of appearance. If several initialization directives appear in different files the order in which they are executed is machine-dependant. However, on most machines the order will be the reverse order in which the associated files have been linked (this is not true under native win32). When all initialization directives have been executed the default main function looks for the GNU Prolog top-level. If present (i.e. it has been linked) it is called otherwise the program simply ends. Note that if the top-level is not linked and if there is no initialization directive the program is useless since it simply ends without doing any work. The default main function detects such a behavior and emits a warning message.

    Example: compile an empty file prog.pl without linking the top-level and execute it:
    % gplc --no-top-level prog.pl
    % prog
    Warning: no initial goal executed
       use a directive :- initialization(Goal)
       or remove the link option --no-top-level (or --min-bips or --min-size)
    

    3.4.5  Generating a new interactive interpreter

    In this section we show how to define a new top-level extending the GNU Prolog interactive interpreter with new predicate definitions. The obtained top-level can then be considered as an enriched version of the basic GNU Prolog top-level (section 3.2). Indeed, each added predicate can be viewed as a predefined predicate just like any other built-in predicate. This can be achieved by compiling these predicates and including the top-level at link-time.

    The real question is: why would we include some predicates in a new top-level instead of simply consulting them under the GNU Prolog top-level ? There are two reasons for this:
    • the predicate cannot be consulted. This is the case of a predicate calling foreign code, like a predicate interfacing with C (section 9) or a predicate defining a new FD constraint.

    • the performance of the predicate is crucial. Since it is compiled to native-code such a predicate will be executed very quickly. Consulting will load it as byte-code. The gain is much more noticeable if the program is run under the debugger. The included version will not be affected by the debugger while the consulted version will be several times slower. Obviously, a predicate should be included in a new top-level only when it is itself debugged since it is difficult to debug native-code.
    To define a new top-level simply compile the set of desired predicates and linking them with the GNU Prolog top-level (this is the default) using gplc (section 3.4.3).

    Example: let us define a new top-level called my_top_level including all predicates defined in prog.pl:
    % gplc -o my_top_level prog.pl
    By the way, note that if prog.pl is an empty Prolog file the previous command will simply create a new interactive interpreter similar to the GNU Prolog top-level.

    Example: as before where some predicates of prog.pl call C functions defined in utils.c:
    % gplc -o my_top_level prog.pl utils.c
    In conclusion, defining a particular top-level is nothing else but a particular case of the native-code compilation. It is simple to do and very useful in practice.

    3.4.6  The hexadecimal predicate name encoding

    When the GNU Prolog compiler compiles a Prolog source to an object file it has to associate a symbol to each predicate name. However, the syntax of symbols is restricted to identifiers: string containing only letters, digits or underscore characters. On the other hand, predicate names (i.e. atoms) can contain any character with quotes if necessary (e.g. 'x+y=z' is a valid predicate name). The compiler has then to encode predicate names respecting the syntax of identifiers. To achieve this, GNU Prolog uses an hexadecimal representation where each predicate name is translated to a symbol beginning with an X followed by the hexadecimal notation of the code of each character of the name.

    Example: 'x+y=z' will be encoded as X782B793D7A since 78 is the hexadecimal representation of the code of x, 2B of the code of +, etc.

    Since Prolog allows the user to define several predicates with the same name but with a different arity GNU Prolog encodes predicate indicators (predicate name followed by the arity). The symbol associated with the predicate name is then followed by an underscore and by the decimal notation of the arity.

    Example: 'x+y=z'/3 will be encoded as X782B793D7A_3.

    So, from the mini-assembly stage, each predicate indicator is replaced by its hexadecimal encoding. The knowledge of this encoding is normally not of interest for the user, i.e. the Prolog programmer. For this reason the GNU Prolog compiler hides this encoding. When an error occurs on a predicate (undefined predicate, predicate with multiple definitions,...) the compiler has to decode the symbol associated with the predicate indicator. For this gplc filters each message emitted by the linker to locate and decode eventual predicate indicators. This filtering can be deactivated specifying –no-decode-hexa when invoking gplc (section 3.4.3).

    This filter is provided as an utility that can be invoked using the hexgplc command as follows:
    % hexgplc [OPTION]... FILE...    (the % symbol is the operating system shell prompt)
    Options:
    –encode encoding mode (default mode is decoding)
    –relax decode also predicate names (not only predicate indicators)
    –printf FORMAT pass encoded/decoded string to C printf(3) with FORMAT
    –aux-father decode an auxiliary predicate as its father
    –aux-father2 decode an auxiliary predicate as its father + auxiliary number
    –cmd-line encode/decode each argument of the command-line
    -H same as: –cmd-line –encode
    -P same as: –cmd-line –relax
    –help print a help and exit
    –version print version number and exit

    It is possible to give a prefix of an option if there is no ambiguity.

    Without arguments hexgplc runs in decoding mode reading its standard input and decoding each symbol corresponding to a predicate indicator. To use hexgplc in the encoding mode the –encode option must be specified. By default hexgplc only decodes predicate indicators, this can be relaxed using –relax to also take into account simple predicate names (the arity can be omitted). It is possible to format the output of an encoded/decoded string using –printf FORMAT in that case each string S is passed to the C printf(3) function as printf(FORMAT,S).

    Auxiliary predicates are generated by the Prolog to WAM compiler when simplifying some control constructs like ';'/2 present in the body of a clause. They are of the form '$NAME/ARITY_$auxN' where NAME/ARITY is the predicate indicator of the simplified (i.e. father) predicate and N is a sequential number (a predicate can give rise to several auxiliary predicates). It is possible to force hexgplc to decode an auxiliary predicate as its father predicate indicator using –aux-father or as its father predicate indicator followed by the sequential number using –aux-father2.

    If no file is specified, hexgplc processes its standard input otherwise each file is treated sequentially. Specifying the –cmd-line option informs hexgplc that each argument is not a file name but a string that must be encoded (or decoded). This is useful to encode/decode a particular string. For this reason the option -H (encode to hexadecimal) and -P (decode to Prolog) are provided as shorthand. Then, to obtain the hexadecimal representation of a predicate P use:
    % hexgplc -H P
    Example:
    % hexgplc -H 'x+y=z'
    X782B793D7A
    

    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up ./gprolog-1.3.0/doc/html_node/gprolog003.html0000644004425400513100000001511710547441640017303 0ustar diazloco Introduction Previous Up Next

    2  Introduction

    GNU Prolog [5] is a free Prolog compiler with constraint solving over finite domains developed by Daniel Diaz. For recent information about GNU Prolog please consult the GNU Prolog page.

    GNU Prolog is a Prolog compiler based on the Warren Abstract Machine (WAM) [9, 1]. It first compiles a Prolog program to a WAM file which is then translated to a low-level machine independent language called mini-assembly specifically designed for GNU Prolog. The resulting file is then translated to the assembly language of the target machine (from which an object is obtained). This allows GNU Prolog to produce a native stand alone executable from a Prolog source (similarly to what does a C compiler from a C program). The main advantage of this compilation scheme is to produce native code and to be fast. Another interesting feature is that executables are small. Indeed, the code of most unused built-in predicates is not included in the executables at link-time.

    A lot of work has been devoted to the ISO compatibility. Indeed, GNU Prolog is very close to the ISO standard for Prolog [6].

    GNU Prolog also offers various extensions very useful in practice (global variables, OS interface, sockets,...). In particular, GNU Prolog contains an efficient constraint solver over Finite Domains (FD). This opens contraint logic pogramming to the user combining the power of constraint programming to the declarativity of logic programming. The key feature of the GNU Prolog solver is the use of a single (low-level) primitive to define all (high-level) FD constraints. There are many advantages of this approach: constraints can be compiled, the user can define his own constraints (in terms of the primitive), the solver is open and extensible (as opposed to black-box solvers like CHIP),...Moreover, the GNU Prolog solver is rather efficient, often more than commercial solvers.

    GNU Prolog is inspired from two systems developed by the same author:
    • wamcc: a Prolog to C compiler [3]. the key point of wamcc was its ability to produce stand alone executables using an original compilation scheme: the translation of Prolog to C via the WAM. Its drawback was the time needed by gcc to compile the produced sources. GNU Prolog can also produce stand alone executables but using a faster compilation scheme.

    • clp(FD): a constraint programming language over FD [4]. Its key feature was the use of a single primitive to define FD constraints. GNU Prolog is based on the same idea but offers an extended constraint definition language. In comparison to clp(FD), GNU Prolog offers new predefined constraints, new predefined heuristics, reified constraints,...
    Here are some features of GNU Prolog:
    • Prolog system:
      • conforms to the ISO standard for Prolog (floating point numbers, streams, dynamic code,...).

      • a lot of extensions: global variables, definite clause grammars (DCG), sockets interface, operating system interface,...

      • more than 300 Prolog built-in predicates.

      • Prolog debugger and a low-level WAM debugger.

      • line editing facility under the interactive interpreter with completion on atoms.

      • powerful bidirectional interface between Prolog and C.


    • Compiler:
      • native-code compiler producing stand alone executables.

      • simple command-line compiler accepting a wide variety of files: Prolog files, C files, WAM files,...

      • direct generation of assembly code 15 times faster than wamcc + gcc.

      • most of unused built-in predicates are not linked (to reduce the size of the executables).

      • compiled predicates (native-code) as fast as wamcmcc on average.

      • consulted predicates (byte-code) 5 times faster than wamcc.


    • Constraint solver:
      • FD variables well integrated into the Prolog environment (full compatibility with Prolog variables and integers). No need for explicit FD declarations.

      • very efficient FD solver (comparable to commercial solvers).

      • high-level constraints can be described in terms of simple primitives.

      • a lot of predefined constraints: arithmetic constraints, boolean constraints, symbolic constraints, reified constraints,...

      • several predefined enumeration heuristics.

      • the user can define his own new constraints.

      • more than 50 FD built-in constraints/predicates.

    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog011.html0000644004425400513100000000617710547441640017310 0ustar diazloco The procedure box model Previous Up Next

    4.2  The procedure box model

    The procedure box model of Prolog execution provides a simple way to show the control flow. This model is very popular and has been adopted in many Prolog systems (e.g. SICStus Prolog, Quintus Prolog,...). A good introduction is the chapter 8 of “Programming in Prolog” of Clocksin & Mellish [2]. The debugger executes a program step by step tracing an invocation to a predicate (call) and the return from this predicate due to either a success (exit) or a failure (fail). When a failure occurs the execution backtracks to the last predicate with an alternative clause. The predicate is then re-invoked (redo). Another source of change of the control flow is due to exceptions. When an exception is raised from a predicate (exception) by throw/1 (section 6.2.4) the control is given back to the most recent predicate that has defined a handler to recover this exception using catch/3 (section 6.2.4). The procedure box model shows these different changes in the control flow, as illustrated here:



    Each arrow corresponds to a port. An arrow to the box indicates that the control is given to this predicate while an arrow from the box indicates that the control is given back from the procedure. This model visualizes the control flow through these five ports and the connections between the boxes associated with subgoals. Finally, it should be clear that a box is associated with one invocation of a given predicate. In particular, a recursive predicate will give raise to a box for each invocation of the predicate with different entries/exits in the control flow. Since this might get confusing for the user, the debugger associates with each box a unique identifier (i.e. the invocation number).


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog034.html0000644004425400513100000004036210547441640017307 0ustar diazloco Constant term streams Previous Up Next

    7.11  Constant term streams

    7.11.1  Introduction

    Constant term streams allow the user to consider a constant term (atom, character list or character code list) as a source/sink by associating to them a stream. Reading from a constant term stream will deliver the characters of the constant term as if they had been read from a standard file. Characters written on a constant term stream are stored to form the final constant term when the stream is closed. The built-in predicates described in this section allow the user to open and close a constant term stream for input or output. However, very often, a constant term stream is created to be only read or written once and then closed. To avoid the creation and the destruction of such a stream, GNU Prolog offers several built-in predicates to perform single input/output from/to constant terms (section 7.15).

    7.11.2  open_input_atom_stream/2, open_input_chars_stream/2,
    open_input_codes_stream/2

    Templates
    open_input_atom_stream(+atom, -stream)
    open_input_chars_stream(+character_list, -stream)
    open_input_codes_stream(+character_code_list, -stream)
    Description

    open_input_atom_stream(Atom, Stream) unifies Stream with the stream-term which is associated with a new input text-stream whose data are the characters of Atom.

    open_input_chars_stream(Chars, Stream) is similar to open_input_atom_stream/2 except that data are the content of the character list Chars.

    open_input_codes_stream(Codes, Stream) is similar to open_input_atom_stream/2 except that data are the content of the character code list Codes.

    Errors
    Stream is not a variable    type_error(variable, Stream)
    Atom is a variable    instantiation_error
    Chars is a partial list or a list with an element E which is a variable    instantiation_error
    Codes is a partial list or a list with an element E which is a variable    instantiation_error
    Atom is neither a variable nor a an atom    type_error(atom, Atom)
    Chars is neither a partial list nor a list    type_error(list, Chars)
    Codes is neither a partial list nor a list    type_error(list, Codes)
    an element E of the Chars list is neither a variable nor a character    type_error(character, E)
    an element E of the Codes list is neither a variable nor an integer    type_error(integer, E)
    an element E of the Codes list is an integer but not a character code    representation_error(character_code)

    Portability

    GNU Prolog predicates.

    7.11.3  close_input_atom_stream/1, close_input_chars_stream/1,
    close_input_codes_stream/1

    Templates
    close_input_atom_stream(+stream_or_alias)
    close_input_chars_stream(+stream_or_alias)
    close_input_codes_stream(+stream_or_alias)
    Description

    close_input_atom_stream(SorA) closes the constant term stream associated with the stream-term or alias SorA. SorA must a stream open with open_input_atom_stream/2 (section 7.11.1).

    close_input_chars_stream(SorA) acts similarly for a character list stream.

    close_input_codes_stream(SorA) acts similarly for a character code list stream.

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(close, stream, SorA)
    SorA is a stream-term or alias but does not refer to a constant term stream.    domain_error(term_stream_or_alias, SorA)

    Portability

    GNU Prolog predicates.

    7.11.4  open_output_atom_stream/1, open_output_chars_stream/1,
    open_output_codes_stream/1

    Templates
    open_output_atom_stream(-stream)
    open_output_chars_stream(-stream)
    open_output_codes_stream(-stream)
    Description

    open_output_atom_stream(Stream) unifies Stream with the stream-term which is associated with a new output text-stream. All characters written to this stream are collected and will be returned as an atom when the stream is closed by close_ouput_atom_stream/2 (section 7.11.5).

    open_output_chars_stream(Stream) is similar to open_output_atom_stream/1 except that the result will be a character list.

    open_output_codes_stream(Stream) is similar to open_output_atom_stream/1 except that the result will be a character code list.

    Errors
    Stream is not a variable    type_error(variable, Stream)

    Portability

    GNU Prolog predicates.

    7.11.5  close_output_atom_stream/2, close_output_chars_stream/2,
    close_output_codes_stream/2

    Templates
    close_output_atom_stream(+stream_or_alias, ?atom)
    close_output_chars_stream(+stream_or_alias, ?character_list)
    close_output_codes_stream(+stream_or_alias, ?character_code_list)
    Description

    close_output_atom_stream(SorA, Atom) closes the constant term stream associated with the stream-term or alias SorA. SorA must be associated with a stream open with open_output_atom_stream/1 (section 7.11.4). Atom is unified with an atom formed with all characters written on the stream.

    close_output_chars_stream(SorA, Chars) acts similarly for a character list stream.

    close_output_codes_stream(SorA, Codes) acts similarly for a character code list stream.

    Errors
    SorA is a variable    instantiation_error
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    Chars is neither a partial list nor a list    type_error(list, Chars)
    Codes is neither a partial list nor a list    type_error(list, Codes)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an input stream    permission_error(close, stream, SorA)
    SorA is a stream-term or alias but does not refer to a constant term stream    domain_error(term_stream_or_alias, SorA)

    Portability

    GNU Prolog predicates.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog006.html0000644004425400513100000010422610547441640017306 0ustar diazloco The GNU Prolog interactive interpreter Previous Up Next

    3.2  The GNU Prolog interactive interpreter

    3.2.1  Starting/exiting the interactive interpreter

    GNU Prolog offers a classical Prolog interactive interpreter also called top-level. It allows the user to execute queries, to consult Prolog programs, to list them, to execute them and to debug them. The top-level can be invoked using the following command:
    % gprolog [OPTION]...    (the % symbol is the operating system shell prompt)
    Options:
    –init-goal GOAL execute GOAL before top_level/0
    –entry-goal GOAL execute GOAL inside top_level/0
    –query-goal GOAL execute GOAL as a query for top_level/0
    –help print a help and exit
    –version print version number and exit
    do not parse the rest of the command-line

    The main role of the gprolog command is to execute the top-level itself, i.e. to execute the built-in predicate top_level/0 (section 7.18.1) which will produce something like:
    
    GNU Prolog 1.2.9
    By Daniel Diaz
    Copyright (C) 1999-2007 Daniel Diaz
    | ?-
    
    The top-level is ready to execute your queries as explained in the next section.

    To quit the top-level type the end-of-file key sequence (Ctl-D) or its term representation: end_of_file. It is also possible to use the built-in predicate halt/0 (section 7.18.1).

    However, before entering the top-level itself, the command-line is processed to treat all known options (those listed above). All unrecognized arguments are collected together to form the argument list which will be available using argument_value/2 (section 7.27.2) or argument_list/1 (section 7.27.3). The option stops the parsing of the command-line, all remainding options are collected into the argument list.

    Several options are provided to execute a goal before entering the interaction with the user:
    • The –init-goal option executes the GOAL as soon as it is encountered (while the commnad-line is processed). GOAL is thus executed before entering top_level/0.

    • The –entry-goal option executes the GOAL at the entry of top_level/0 just after the banner is displayed.

    • The –query-goal option executes the GOAL as if the user has typed in.
    The above order is thus the order in which each kind of goal (init, entry, query) is executed. If there are several goals of a same kind they are executed in the oder of appearance. Thus, all init goals are executed (in the order of appearance) before all entry goals and all entry goals are executed before all query goals.

    Each GOAL is passed as a shell argument (i.e. one shell string) and should not contain a terminal dot. Example: –init-goal 'write(hello), nl' under a sh-like. To be executed, a GOAL is transformed into a term using read_term_from_atom(Goal, Term, [end_of_term(eof)]). Respecting both the syntax of shell strings and of Prolog can be heavy. For instance, passing a backslash character \ can be difficult since it introduces an escape sequence both in sh and inside Prolog quoted atoms. The use of back quotes can then be useful since, by default, no escape sequence is processed inside back quotes (this behavior can be controlled using the back_quotes Prolog flag (section 7.22.1)).

    Since the Prolog argument list is created when the whole command-line is parsed, if a –init-goal option uses argument_value/2 or argument_list/1 it will obtained the original command-line arguments (i.e. including all recognized arguments).

    Here is an example of using execution goal options:
    % gprolog –init-goal 'write(before), nl' –entry-goal 'write(inside), nl'
    –query-goal 'append([a,b],[c,d],X)'
    will produce the following:
    
    before
    GNU Prolog 1.2.9
    By Daniel Diaz
    Copyright (C) 1999-2007 Daniel Diaz
    inside
    | ?- append([a,b],[c,d],X).
    
    X = [a,b,c,d]
    
    yes
    | ?-
    

    3.2.2  The interactive interpreter read-execute-write loop

    The GNU Prolog top-level is built on a classical read-execute-write loop that also allows for re-executions (when the query is not deterministic) as follows:
    • display the prompt, i.e. '| ?-'.

    • read a query (i.e. a goal).

    • execute the query.

    • in case of success display the values of the variables of the query.

    • if there are remaining alternatives (i.e. the query is not deterministic), display a ? and ask the user who can use one of the following commands: RETURN to stop the execution, ; to compute the next solution or a to compute all remaining solution.
    Here is an example of execution of a query (“find the lists X and Y such that the concatenation of X and Y is [a,b]”):
    | ?- append(X,Y,[a,b,c]).
     
    X = []
    Y = [a,b,c] ? ;    (here the user presses ; to compute another solution)
     
    X = [a]
    Y = [b,c] ? a    (here the user presses a to compute all remaining solutions)
     
    X = [a,b]
    Y = [c]    (here the user is not asked and the next solution is computed)
     
    X = [a,b,c]
    Y = []    (here the user is not asked and the next solution is computed)
     
    no    (no more solution)
    In some cases the top-level can detect that the current solution is the last one (no more alternatives remaining). In such a case it does not display the ? symbol (and does not ask the user). Example:
    | ?- (X=1 ; X=2).
     
    X = 1 ? ;    (here the user presses ; to compute another solution)
     
    X = 2    (here the user is not prompted since there are no more alternatives)
     
    yes
    The user can stop the execution even if there are more alternatives by typing RETURN.
    | ?- (X=1 ; X=2).
     
    X = 1 ?    (here the user presses RETURN to stop the execution)
     
    yes
    The top-level tries to display the values of the variables of the query in a readable manner. For instance, when a variable is bound to a query variable, the name of this variable appears. When a variable is a singleton an underscore symbol _ is displayed (_ is a generic name for a singleton variable, it is also called an anonymous variable). Other variables are bound to new brand variable names. When a query variable name X appears as the value of another query variable Y it is because X is itself not instantiated otherwise the value of X is displayed. In such a case, nothing is output for X itself (since it is a variable). Example:
    | ?- X=f(A,B,_,A), A=k.
     
    A = k    (the value of A is displayed also in f/3 for X)
    X = f(k,B,_,k)    (since B is a variable which is also a part of X, B is not displayed)
    | ?- functor(T,f,3), arg(1,T,X), arg(3,T,X).
     
    T = f(X,_,X)    (the 1st and 3rd args are equal to X, the 2nd is an anonymous variable)
    | ?- read_from_atom('k(X,Y,X).',T).
     
    T = k(A,_,A)    (the 1st and 3rd args are unified, a new variable name A is introduced)
    The top-level uses variable binding predicates (section 7.5). To display the value of a variable, the top-level calls write_term/3 with the following option list: [quoted(true),numbervars(false), namevars(true)] (section 7.14.6). A term of the form '$VARNAME'(Name) where Name is an atom is displayed as a variable name while a term of the form '$VAR'(N) where N is an integer is displayed as a normal compound term (such a term could be output as a variable name by write_term/3). Example:
    | ?- X='$VARNAME'('Y'), Y='$VAR'(1).
     
    X = Y    (the term '$VARNAME'('Y') is displayed as Y)
    Y = '$VAR'(1)    (the term '$VAR'(1) is displayed as is)
    | ?- X=Y, Y='$VAR'(1).
     
    X = '$VAR'(1)
    Y = '$VAR'(1)
    In the first example, X is explicitly bound to '$VARNAME'('Y') by the query so the top-level displays Y as the value of X. Y is unified with '$VAR'(1) so the top-level displays it as a normal compound term. It should be clear that X is not bound to Y (whereas it is in the second query). This behavior should be kept in mind when doing variable binding operations.

    Finally, the top-level computes the user-time (section 7.24.2) taken by a query and displays it when it is significant. Example:
    | ?- retractall(p(_)), assertz(p(0)),
         repeat,
            retract(p(X)),
            Y is X + 1,
            assertz(p(Y)),
            X = 1000, !.
     
    X = 1000
    Y = 1001
     
    (180 ms) yes    (the query took 180ms of user time)

    3.2.3  Consulting a Prolog program

    The top-level allows the user to consult Prolog source files. Consulted predicates can be listed, executed and debugged (while predicates compiled to native-code cannot). For more information about the difference between a native-code predicate and a consulted predicate refer to the introduction of this section (section 3.1) and to the part devoted to the compiler (section 3.4.1).

    To consult a program use the built-in predicate consult/1 (section 7.23.1). The argument of this predicate is a Prolog file name or user to specify the terminal. This allows the user to directly input the predicates from the terminal. In that case the input shall be terminated by the end-of-file key sequence (Ctl-D) or its term representation: end_of_file. A shorthand for consult(FILE) is [FILE]. Example:
    | ?- [user].
    {compiling user for byte code...}
    even(0).
    even(s(s(X))):-
            even(X).
         (here the user presses Ctl-D to end the input)
    {user compiled, 3 lines read - 350 bytes written, 1180 ms}
     
    | ?- even(X).
     
    X = 0 ? ;    (here the user presses ; to compute another solution)
     
    X = s(s(0)) ? ;    (here the user presses ; to compute another solution)
     
    X = s(s(s(s(0)))) ?    (here the user presses RETURN to stop the execution)
     
    yes
    | ?- listing.
     
    even(0).
    even(s(s(A))) :-
            even(A).
    When consult/1 (section 7.23.1) is invoked on a Prolog file it first runs the GNU Prolog compiler (section 3.4) as a child process to generate a temporary WAM file for byte-code. If the compilation fails a message is displayed and nothing is loaded. If the compilation succeeds, the produced file is loaded into memory using load/1 (section 7.23.2). Namely, the byte-code of each predicate is loaded. When a predicate P is loaded if there is a previous definition for P it is removed (i.e. all clauses defining P are erased). We say that P is redefined. Note that only consulted predicates can be redefined. If P is a native-code predicate, trying to redefine it will produce an error at load-time: the predicate redefinition will be ignored and the following message displayed:
    native code procedure P cannot be redefined
    Finally, an existing predicate will not be removed if it is not re-loaded. This means that if a predicate P is loaded when consulting the file F, and if later the definition of P is removed from the file F, consulting F again will not remove the previously loaded definition of P from the memory.

    Consulted predicates can be debugged using the Prolog debugger. Use the debugger predicate trace/0 or debug/0 (section 4.3.1) to activate the debugger.

    3.2.4  Interrupting a query

    Under the top-level it is possible to interrupt the execution of a query by typing the interruption key (Ctl-C). This can be used to abort a query, to stop an infinite loop, to activate the debugger,...When an interruption occurs the top-level displays the following message: Prolog interruption (h for help) ? The user can then type one of the following commands:
    Command Name Description
    a abort abort the current execution. Same as abort/0 (section 7.18.1)
    e exit quit the current Prolog process. Same as halt/0 (section 7.18.1)
    b break invoke a recursive top-level. Same as break/0 (section 7.18.1)
    c continue resume the execution
    t trace start the debugger using trace/0 (section 4.3.1)
    d debug start the debugger using debug/0 (section 4.3.1)
    h or ? help display a summary of available commands

    3.2.5  The line editor

    The line editor (linedit) allows the user to build/update the current input line using a variety of commands. This facility is available if the linedit part of GNU Prolog has been installed. linedit is implicitly called by any built-in predicate reading from a terminal (e.g. get_char/1, read/1,...). This is the case when the top-level reads a query.

    Bindings: each command of linedit is activated using a key. For some commands another key is also available to invoke the command (on some terminals this other key may not work properly while the primary key always works). Here is the list of available commands:
    Key Alternate key Description
    Ctl-B go to the previous character
    Ctl-F go to the next character
    Esc-B Ctl-← go to the previous word
    Esc-F Ctl-→ go to the next word
    Ctl-A Home go to the beginning of the line
    Ctl-E End go to the end of the line
    Ctl-H Backspace delete the previous character
    Ctl-D Delete delete the current character
    Ctl-U Ctl-Home delete from beginning of the line to the current character
    Ctl-K Ctl-End delete from the current character to the end of the line
    Esc-L   lower case the next word
    Esc-U   upper case the next word
    Esc-C   capitalize the next word
    Ctl-T   exchange last two characters
    Ctl-V Insert switch on/off the insert/replace mode
    Ctl-I Tab complete word (twice displays all possible completions)
    Esc-Ctl-I Esc-Tab insert spaces to emulate a tabulation
    Ctl-space   mark beginning of the selection
    Esc-W   copy (from the begin selection mark to the current character)
    Ctl-W   cut (from the begin selection mark to the current character)
    Ctl-Y   paste
    Ctl-P recall previous history line
    Ctl-N recall next history line
    Esc-P   recall previous history line beginning with the current prefix
    Esc-N   recall next history line beginning with the current prefix
    Esc-< Page Up recall first history line
    Esc-> Page Down recall last history line
    Ctl-C   generate an interrupt signal (section 3.2.4)
    Ctl-D   generate an end-of-file character (at the begin of the line)
    RETURN   validate a line
    Esc-?   display a summary of available commands

    History: when a line is entered (i.e. terminated by RETURN), linedit records it in an internal list called history. It is later possible to recall history lines using appropriate commands (e.g. Ctl-P recall the last entered line) and to modify them as needed. It is also possible to recall a history line beginning with a given prefix. For instance to recall the previous line beginning with write simply type write followed by Esc-P. Another Esc-P will recall an earlier line beginning with write,...

    Completion: another important feature of linedit is its completion facility. Indeed, linedit maintains a list of known words and uses it to complete the prefix of a word. Initially this list contains all predefined atoms and the atoms corresponding to available predicates. This list is dynamically updated when a new atom appears in the system (whether read at the top-level, created with a built-in predicate, associated with a new consulted predicate,...). When the completion key (Tab) is pressed linedit acts as follows:
    • use the current word as a prefix.

    • collect all words of the list that begin with this prefix.

    • complete the current word with the longest common part of all matching words.

    • if more than one word matches emit a beep (a second Tab will display all possibilities).
    Example:
    | ?- argu    (here the user presses Tab to complete the word)
    | ?- argument_    (linedit completes argu with argument_ and emits a beep)
         (the user presses again Tab to see all possible completions)
    argument_counter    (linedit shows 3 possible completions)
    argument_list
    argument_value
    | ?- argument_    (linedit redisplays the input line)
     
    | ?- argument_c    (to select argument_counter the user presses c and Tab)
    | ?- argument_counter    (linedit completes with argument_counter)
    Finally, linedit allows the user to check that (square/curly) brackets are well balanced. For this, when a close bracket symbol, i.e. ), ] or }, is typed, linedit determines the associated open bracket, i.e. (, [ or {, and temporarily repositions the cursor on it to show the match.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog045.html0000644004425400513100000005264310547441640017316 0ustar diazloco Prolog state Previous Up Next

    7.22  Prolog state

    7.22.1  set_prolog_flag/2

    Templates
    set_prolog_flag(+flag, +term)
    Description

    set_prolog_flag(Flag, Value) sets the value of the Prolog flag Flag to Value.

    Prolog flags: a Prolog flag is an atom which is associated with a value that is either implementation defined or defined by the user. Each flag has a permitted range of values; any other value is a domain_error. The following two tables present available flags, the possible values, a description and if they are ISO or an extension. The first table presents unchangeable flags while the second one the changeable flags. For flags whose default values is machine independent, this value is underlined.

    Unchangeable flags:
    Flag
    Values
    Description
    ISO
    bounded
    true / false
    are integers bounded ?
    Y
    max_integer
    an integer
    greatest integer
    Y
    min_integer
    an integer
    smallest integer
    Y
    integer_rounding_function
    toward_zero
    down
    rnd(X) = integer part of X
    rnd(X) = ⌊X⌋ (section 7.6.1)
    Y
    max_arity
    an integer
    maximum arity for compound terms (255)
    Y
    max_atom
    an integer
    maximum number of atoms
    N
    max_unget
    an integer
    maximum number of successive ungets
    N
    prolog_name
    an atom
    name of the Prolog system
    N
    prolog_version
    an atom
    version number of the Prolog system
    N
    prolog_date
    an atom
    date of the Prolog system
    N
    prolog_copyright
    an atom
    copyright message of the Prolog system
    N

    Changeable flags:
    Flag
    Values
    Description
    ISO
    char_conversion
    on / off
    is character conversion activated ?
    Y
    debug
    on / off
    is the debugger activated ?
    Y
    singleton_warning
    on / off
    warn about named singleton variables ?
    N
    strict_iso
    on / off
    strict ISO behavior ?
    N
     
    double_quotes
     
    atom
    chars
    codes
    atom_no_escape
    chars_no_escape
    codes_no_escape
    a double quoted constant is returned as:
    an atom
    a list of characters
    a list of character codes
    as atom but ignore escape sequences
    as chars but ignore escape sequences
    as code but ignore escape sequences
     
    Y
     
     
    N
     
    back_quotes
     
    atom
    chars
    codes
    atom_no_escape
    chars_no_escape
    codes_no_escape
    a back quoted constant is returned as:
    an atom
    a list of characters
    a list of character codes
    as atom but ignore escape sequences
    as chars but ignore escape sequences
    as code but ignore escape sequences
     
    N
     
    unknown
     
    error
    warning
    fail
    a predicate calls an unknown procedure:
    an existence_error is raised
    a message is displayed then fails
    quietly fails
     
    Y
     
    syntax_error
     
    error
    warning
    fail
    a predicate causes a syntax error:
    a syntax_error is raised
    a message is displayed then fails
    quietly fails
     
    N
     
    os_error
     
    error
    warning
    fail
    a predicate causes an O.S. error:
    a system_error is raised
    a message is displayed then fails
    quietly fails
     
    N

    The strict_iso flag is introduced to allow a compatibility with other Prolog systems. When turned off the following relaxations apply:
    • a callable term can be given as a predicate indicator.

    • built-in predicates are found by current_predicate/1 (section 7.8.1).
    Errors
    Flag is a variable    instantiation_error
    Value is a variable    instantiation_error
    Flag is neither a variable nor an atom    type_error(atom, Flag)
    Flag is an atom but not a valid flag    domain_error(prolog_flag, Flag)
    Value is inappropriate for Flag    domain_error(flag_value, Flag+Value)
    Value is appropriate for Flag but flag Flag is not modifiable    permission_error(modify, flag, Flag)

    Portability

    ISO predicate. All ISO flags are implemented.

    7.22.2  current_prolog_flag/2

    Templates
    current_prolog_flag(?flag, ?term)
    Description

    current_prolog_flag(Flag, Value) succeeds if there exists a Prolog flag that unifies with Flag and whose value unifies with Value. This predicate is re-executable on backtracking.

    Errors
    Flag is neither a variable nor an atom    type_error(atom, Flag)
    Flag is an atom but not a valid flag    domain_error(prolog_flag, Flag)

    Portability

    ISO predicate.

    7.22.3  set_bip_name/2

    Templates
    set_bip_name(+atom, +arity)
    Description

    set_bip_name(Functor, Arity) initializes the context of the error (section 5.3.1) with Functor and Arity (if Arity < 0 only Functor is significant).

    Errors
    Functor is a variable    instantiation_error
    Arity is a variable    instantiation_error
    Functor is neither a variable nor an atom    type_error(atom, Functor)
    Arity is neither a variable nor an integer    type_error(integer, Arity)

    Portability

    GNU Prolog predicate.

    7.22.4  current_bip_name/2

    Templates
    current_bip_name(?atom, ?arity)
    Description

    current_bip_name(Functor, Arity) succeeds if Functor and Arity correspond to the context of the error (section 5.3.1) (if Arity < 0 only Functor is significant).

    Errors
    Functor is neither a variable nor an atom    type_error(atom, Functor)
    Arity is neither a variable nor an integer    type_error(integer, Arity)

    Portability

    GNU Prolog predicate.

    7.22.5  write_pl_state_file/1, read_pl_state_file/1

    Templates
    write_pl_state_file(+source_sink)
    read_pl_state_file(+source_sink)
    Description

    write_pl_state_file(FileName) writes onto FileName all information that influences the parsing of a term (section 7.14). This allows a sub-process written in Prolog to read this file and then process any Prolog term as done by the parent process. This file can also be passed as argument of the –pl-state option when invoking gplc (section 3.4.3). More precisely the following elements are saved:
    • all operator definitions (section 7.14.10).

    • the character conversion table (section 7.14.12).

    • the value of char_conversion, double_quotes, back_quotes and singleton_warning Prolog flags (section 7.22.1).
    read_pl_state_file(FileName) reads (restores) from FileName all information previously saved by write_pl_state_file/1.

    Errors
    FileName is a variable    instantiation_error
    FileName is neither a variable nor an atom    type_error(atom, FileName)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/hh-mktoc.tex0000644004425400513100000000216710547152502016752 0ustar diazloco% use filter mode: hevea -text -w 1000 hh-gprolog.hhc \documentclass{article} \def\bs{\char'134} \def\lt{\char'074} \def\gt{\char'076} \def\lb{\char'173} \def\rb{\char'175} \def\us{\char'137} \newcommand{\Tag}[1]{{\lt}#1{\gt}} \renewenvironment{tocenv}{\Tag{ul}\\}{\Tag{/ul}\\} \renewcommand{\tocitem}[1][]{} \renewcommand{\@locref}[2]{\OneEntry{\csname#1\endcsname\#{}#1}{#2}} \renewcommand{\ahrefloc}[2]{\@locref{#1}{#2}} \newcommand{\OneEntry}[2]{% \Tag{li}\Tag{object type="text/sitemap"}\\% ~~~~\Tag{param name="Name" value="{\def\\{}#2}"}\\% ~~~~\Tag{param name="Local" value="#1"}\\% ~~~~\Tag{/object}\\} \newcommand{\remember}[2]{\def\csname#1\endcsname{#2}} \input{/tmp/gprolog.hrf.hh} \begin{document} \Tag{HTML}\\ \Tag{HEAD}\\ \Tag{!-- Sitemap 1.0 --}\\ \Tag{/HEAD}\\ \Tag{BODY}\\ %\Tag{object type="text/site properties"}\\ %~~~~\Tag{param name="FrameName" value="right"}\\ %~~~~\Tag{param name="Window Styles" value="0x800025"}\\ %\Tag{/object}\\ \begin{tocenv} \OneEntry{index.html}{The GNU Prolog Manual} \input{../gprolog.htoc} %\input{foo.htoc} \end{tocenv} \Tag{/BODY}\\ \Tag{/HTML}\\ \end{document} ./gprolog-1.3.0/doc/html_node/gprolog068.html0000644004425400513100000003031010547441640017306 0ustar diazloco Raising Prolog errors Previous Up Next

    9.3  Raising Prolog errors

    The following functions allows a C function to raise a Prolog error. Refer to the section concerning Prolog errors for more information about the effect of raising an error (section 5.3).

    9.3.1  Managing the error context

    When one of the following error function is invoked it refers to the implicit error context (section 5.3.1). This context indicates the name and the arity of the concerned predicate. When using a foreign/2 declaration this context is set by default to the name and arity of the associated Prolog predicate. This can be controlled using the bip_name option (section 9.1.2). In any case, the following functions can also be used to modify this context:
    void Set_C_Bip_Name  (char *functor, int arity)
    void Unset_C_Bip_Name(void)
    
    The function Set_C_Bip_Name(functor, arity) initializes the context of the error with functor and arity (if arity<0 only functor is significant). The function Unset_C_Bip_Name() removes such an initialization (the context is then reset to the last Functor/Arity set by a call to set_bip_name/2 (section 7.22.3). This is useful when writing a C routine to define a context for errors occurring in this routine and, before exiting to restore the previous context.

    9.3.2  Instantiation error

    The following function raises an instantiation error (section 5.3.2):
    void Pl_Err_Instantiation(void)

    9.3.3  Type error

    The following function raises a type error (section 5.3.3):
    void Pl_Err_Type(int atom_type, PlTerm culprit)
    atom_type is (the internal key of) the atom associated with the expected type. For each type name T there is a corresponding predefined atom stored in a global variable whose name is of the form type_T. culprit is the argument which caused the error.

    Example: x is an atom while an integer was expected: Pl_Err_Type(type_integer, x).

    9.3.4  Domain error

    The following function raises a domain error (section 5.3.4):
    void Pl_Err_Domain(int atom_domain, PlTerm culprit)
    atom_domain is (the internal key of) the atom associated with the expected domain. For each domain name D there is a corresponding predefined atom stored in a global variable whose name is of the form domain_D. culprit is the argument which caused the error.

    Example: x is < 0 but should be ≥ 0: Pl_Err_Domain(domain_not_less_than_zero, x).

    9.3.5  Existence error

    The following function raises an existence error (section 5.3.5):
    void Pl_Err_Existence(int atom_object, PlTerm culprit)
    atom_object is (the internal key of) the atom associated with the type of the object. For each object name O there is a corresponding predefined atom stored in a global variable whose name is of the form existence_O. culprit is the argument which caused the error.

    Example: x does not refer to an existing source: Pl_Err_Existence(existence_source_sink, x).

    9.3.6  Permission error

    The following function raises a permission error (section 5.3.6):
    void Pl_Err_Permission(int atom_operation, int atom_permission, PlTerm culprit)
    atom_operation is (the internal key of) the atom associated with the operation which caused the error. For each operation name O there is a corresponding predefined atom stored in a global variable whose name is of the form permission_operation_O. atom_permission is (the internal key of) the atom associated with the tried permission. For each permission name P there is a corresponding predefined atom stored in a global variable whose name is of the form permission_type_P. culprit is the argument which caused the error.

    Example: reading from an output stream x: Pl_Err_Permission(permission_operation_input,
    permission_type_stream, x)
    .

    9.3.7  Representation error

    The following function raises a representation error (section 5.3.7):
    void Pl_Err_Representation(int atom_limit)
    atom_limit is (the internal key of) the atom associated with the reached limit. For each limit name L there is a corresponding predefined atom stored in a global variable whose name is of the form representation_L.

    Example: an arity too big occurs: Pl_Err_Representation(representation_max_arity).

    9.3.8  Evaluation error

    The following function raises an evaluation error (section 5.3.8):
    void Pl_Err_Evaluation(int atom_error)
    atom_error is (the internal key of) the atom associated with the error. For each evaluation error name E there is a corresponding predefined atom stored in a global variable whose name is of the form evaluation_E.

    Example: a division by zero occurs: Pl_Err_Evaluation(evluation_zero_divisor).

    9.3.9  Resource error

    The following function raises a resource error (section 5.3.9):
    void Pl_Err_Resource(int atom_resource)
    atom_resource is (the internal key of) the atom associated with the resource. For each resource error name R there is a corresponding predefined atom stored in a global variable whose name is of the form resource_R.

    Example: too many open streams: Pl_Err_Resource(resource_too_many_open_streams).

    9.3.10  Syntax error

    The following function raises a syntax error (section 5.3.10):
    void Pl_Err_Syntax(int atom_error)
    atom_error is (the internal key of) the atom associated with the error. There is no predefined syntax error atoms.

    Example: a / is expected: Pl_Err_Syntax(Create_Atom("/ expected")).

    The following function emits a syntax error according to the value of the syntax_error Prolog flag (section 7.22.1). This function can then return (if the value of the flag is either warning or fail). In that case the calling function should fail (e.g. returning FALSE). This function accepts a file name (the empty string C "" can be passed), a line and column number and an error message string. Using this function makes it possible to further call the built-in predicate syntax_error_info/4 (section 7.14.4):
    void Emit_Syntax_Error(char *file_name, int line, int column, char *message)
    Example: a / is expected: Emit_Syntax_Error("data", 10, 30, "/ expected").

    9.3.11  System error

    The following function raises a system error (4.3.11, page *):
    void Pl_Err_System(int atom_error)
    atom_error is (the internal key of) the atom associated with the error. There is no predefined system error atoms.

    Example: an invalid pathname is given: Pl_Err_System(Create_Atom("invalid path name")).

    The following function emits a system error associated with an operating system error according to the value of the os_error Prolog flag (section 7.22.1). This function can then return (if the value of the flag is either warning or fail). In that case the calling function should fail (e.g. returning FALSE). This function uses the value of the errno C library variable:
    void Os_Error(void)
    Example: a call to the C Unix function chdir(3) returns -1: Os_Error().


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog041.html0000644004425400513100000003035110547441640017302 0ustar diazloco Logic, control and exceptions Previous Up Next

    7.18  Logic, control and exceptions

    7.18.1  abort/0, stop/0, top_level/0, break/0, halt/1, halt/0

    Templates
    abort
    stop
    top_level
    break
    halt(+integer)
    halt
    Description

    abort aborts the current execution. If this execution was initiated under a top-level the control is given back to the top-level and the message {execution aborted} is displayed. Otherwise, e.g. execution started by a initialization/1 directive (section 6.1.13), abort/0 is equivalent to halt(1) (see below).

    stop stops the current execution. If this execution was initiated under a top-level the control is given back to the top-level. Otherwise, stop/0 is equivalent to halt(0) (see below).

    top_level starts a new recursive top-level (including the banner display). To end this new top-level simply type the end-of-file key sequence (Ctl-D) or its term representation: end_of_file.

    break invokes a recursive top-level (no banner is displayed). To end this new level simply type the end-of-file key sequence (Ctl-D) or its term representation: end_of_file.

    halt(Status) causes the GNU Prolog process to immediately exit back to the shell with the return code Status.

    halt is equivalent to halt(0).

    Errors
    Status is a variable    instantiation_error
    Status is neither a variable nor an integer    type_error(integer, Status)

    Portability

    halt/1 and halt/0 are ISO predicates. abort/0, stop/0, top_level/0 and break/0 are GNU Prolog predicates.

    7.18.2  once/1, (\+)/1 - not provable, call/2-11, call_with_args/1-11, call_det/2

    Templates
    once(+callable_term)
    \+(+callable_term)
    call(+callable_term, +term,..., +term)
    call_with_args(+atom, +term,..., +term)
    call_det(+callable_term, ?boolean)
    Description

    once(Goal) succeeds if call(Goal) succeeds. However once/1 is not re-executable on backtracking since all alternatives of Goal are cut. once(Goal) is equivalent to call(Goal), !.

    \+ Goal
    succeeds if call(Goal) fails and fails otherwise. This built-in predicate gives negation by failure.

    call(Closure, Arg1,..., ArgN) calls the goal call(Goal) where Goal is constructed by appending Arg1,..., ArgN (1 ≤ N ≤ 10) additional arguments to the arguments (if any) of Closure.

    call_with_args(Functor, Arg1,..., ArgN) calls the goal whose functor is Functor and whose arguments are Arg1,..., ArgN (0 ≤ N ≤ 10).

    call_det(Goal, Deterministic) succeeds if call(Goal) succeeds and unifies Deterministic with true if Goal has not created any choice-points, with false otherwise.

    \+
    is a predefined prefix operator (section 7.14.10).

    Errors
    Goal is a variable    instantiation_error
    Goal is neither a variable nor a callable term    type_error(callable, Goal)
    The predicate indicator Pred of Goal does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)
    Functor is a variable    instantiation_error
    Functor is neither a variable nor an atom    type_error(atom, Functor)
    Deterministic is neither a variable nor a boolean    type_error(boolean, Deterministic)
    for call/2-11 the resulting arity of Goal (arity of Closure + N) is an integer > max_arity flag (section 7.22.1)    representation_error(max_arity)

    Portability

    once/1 and (\+)/1 are ISO predicates, call/2-11, call_with_args/1-11 and call_det/2 are GNU Prolog predicates.

    7.18.3  repeat/0

    Templates
    repeat
    Description

    repeat generates an infinite sequence of backtracking choices. The purpose is to repeatedly perform some action on elements which are somehow generated, e.g. by reading them from a stream, until some test becomes true. Repeat loops cannot contribute to the logic of the program. They are only meaningful if the action involves side-effects. The only reason for using repeat loops instead of a more natural tail-recursive formulation is efficiency: when the test fails back, the Prolog engine immediately reclaims any working storage consumed since the call to repeat/0.

    Errors

    None.

    Portability

    ISO predicate.

    7.18.4  for/3

    Templates
    for(?integer, +integer, +integer)
    Description

    for(Counter, Lower, Upper) generates an sequence of backtracking choices instantiating Counter to the values Lower, Lower+1,..., Upper.

    Errors
    Counter is neither a variable nor an integer    type_error(integer, Counter)
    Lower is a variable    instantiation_error
    Lower is neither a variable nor an integer    type_error(integer, Lower)
    Upper is a variable    instantiation_error
    Upper is neither a variable nor an integer    type_error(integer, Upper)

    Portability

    GNU Prolog predicate.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog053.html0000644004425400513100000001126010547441640017303 0ustar diazloco Source reader facility Previous Up

    7.30  Source reader facility

    7.30.1  Introduction

    To be written...

    7.30.2  sr_open/3

    7.30.3  sr_change_options/2

    7.30.4  sr_close/1

    7.30.5  sr_read_term/4

    7.30.6  sr_current_descriptor/1

    7.30.7  sr_get_stream/2

    7.30.8  sr_get_module/3

    7.30.9  sr_get_file_name/2

    7.30.10  sr_get_position/3

    7.30.11  sr_get_include_list/2

    7.30.12  sr_get_include_stream_list/2

    7.30.13  sr_get_size_counters/3

    7.30.14  sr_get_error_counters/3

    7.30.15  sr_set_error_counters/3

    7.30.16  sr_error_from_exception/2

    7.30.17  sr_write_message/8, sr_write_message/6, sr_write_message/4

    7.30.18  sr_write_error/6, sr_write_error/4, sr_write_error/2


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up ./gprolog-1.3.0/doc/html_node/gprolog070.html0000644004425400513100000001515210547441640017306 0ustar diazloco Defining a new C main() function Previous Up

    9.5  Defining a new C main() function

    GNU Prolog allows the user to define his own main() function. This can be useful to perform several tasks before starting the Prolog engine. To do this simply define a classical main(argc, argv) function. The following functions can then be used:
    int  Start_Prolog         (int argc, char *argv[])
    void Stop_Prolog          (void)
    void Reset_Prolog         (void)
    Bool Try_Execute_Top_Level(void)
    
    The function Start_Prolog(argc, argv) initializes the Prolog engine (argc and argv are the command-line variables). This function collects all linked objects (issued from the compilation of Prolog files) and initializes them. The initialization of a Prolog object file consists in adding to appropriate tables new atoms, new predicates and executing its system directives. A system directive is generated by the Prolog to WAM compiler to reflect a (user) directive executed at compile-time such as op/3 (section 6.1.10). Indeed, when the compiler encounters such a directive it immediately executes it and also generates a system directive to execute it at the start of the executable. When all system directives have been executed the Prolog engine executes all initialization directives defined with initialization/1 (section 6.1.13). The function returns the number of user directives (i.e. initialization/1) executed. This function must be called only once.

    The function Stop_Prolog() stops the Prolog engine. This function must be called only once after all Prolog treatment have been done.

    The function Reset_Prolog() reinitializes the Prolog engine (i.e. reset all Prolog stacks).

    The function Try_Execute_Top_Level() executes the top-level if linked (section 3.4.3) and returns TRUE. If the top-level is not present the functions returns FALSE.

    Here is the definition of the default GNU Prolog main() function:
    int
    Main_Wrapper(int argc, char *argv[])
    {
      int nb_user_directive;
      Bool top_level;
    
      nb_user_directive = Start_Prolog(argc, argv);
    
      top_level = Try_Execute_Top_Level();
    
      Stop_Prolog();
    
      if (top_level || nb_user_directive)
        return 0;
    
      fprintf(stderr,
              "Warning: no initial goal executed\n"
              "   use a directive :- initialization(Goal)\n"
              "   or remove the link option --no-top-level"
              " (or --min-bips or --min-size)\n");
    
      return 1;
    }
    
    int
    main(int argc, char *argv[])
    {
      return Main_Wrapper(argc, argv);
    }
    
    Note that under some circumstances it is necessary to encapsulate the code of main() inside an intermediate function called by main(). Indeed, some C compilers (e.g. gcc) treats main() particularly, producing an uncompatible code w.r.t GNU Prolog. So it is a good idea to always use a wrapper function as shown above.

    9.5.1  Example: asking for ancestors

    In this example we use the following Prolog code (in a file called new_main.pl):
    parent(bob,   mary).
    parent(jane,  mary).
    parent(mary,  peter).
    parent(paul,  peter).
    parent(peter, john).
    
    anc(X, Y):-
            parent(X, Y).
    
    anc(X, Z) :-
            parent(X, Y),
            anc(Y, Z).
    
    The following file (called new_main_c.c) defines a main() function readinf the name of a person and displaying all successors of that person. This is equivalent to the Prolog query: anc(Result, Name).
    static int
    Main_Wrapper(int argc, char *argv[])
    {
      int func;
      WamWord arg[10];
      char str[100];
      char *sol[100];
      int i, nb_sol = 0;
      Bool res;
    
      Start_Prolog(argc, argv);
    
      func = Find_Atom("anc");
      for (;;)
        {
          printf("\nEnter a name (or 'end' to finish): ");
          scanf("%s", str);
    
          if (strcmp(str, "end") == 0)
            break;
    
          Pl_Query_Begin(TRUE);
    
          arg[0] = Mk_Variable();
          arg[1] = Mk_String(str);
          nb_sol = 0;
          res = Pl_Query_Call(func, 2, arg);
          while (res)
            {
              sol[nb_sol++] = Rd_String(arg[0]);
              res = Pl_Query_Next_Solution();
            }
          Pl_Query_End(PL_RECOVER);
    
          for (i = 0; i < nb_sol; i++)
            printf("  solution: %s\n", sol[i]);
          printf("%d solution(s)\n", nb_sol);
        }
    
      Stop_Prolog();
      return 0;
    }
    
    int
    main(int argc, char *argv[])
    {
      return Main_Wrapper(argc, argv);
    }
    
    The compilation produces an executable called new_main:
    % gplc new_main.pl new_main_c.c
    Examples of use:
    Enter a name (or 'end' to finish): john
      solution: peter
      solution: bob
      solution: jane
      solution: mary
      solution: paul
    5 solution(s)
    
    Enter a name (or 'end' to finish): mary
      solution: bob
      solution: jane
    2 solution(s)
    
    Enter a name (or 'end' to finish): end
    

    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up ./gprolog-1.3.0/doc/html_node/gprolog009.html0000644004425400513100000000323610547441640017310 0ustar diazloco Debugging Previous Up Next

    4  Debugging


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog024.html0000644004425400513100000001013710547441640017303 0ustar diazloco Type testing Up Next

    7.1  Type testing

    7.1.1  var/1, nonvar/1, atom/1, integer/1, float/1, number/1, atomic/1,
    compound/1, callable/1, list/1, partial_list/1, list_or_partial_list/1

    Templates
    var(?term)
    nonvar(?term)
    atom(?term)
    integer(?term)
    float(?term)
    number(?term)
    atomic(?term)
    compound(?term)
    callable(?term)
    list(?term)
    partial_list(?term)
    list_or_partial_list(?term)
    Description

    var(Term) succeeds if Term is currently uninstantiated (which therefore has not been bound to anything, except possibly another uninstantiated variable).

    nonvar(Term) succeeds if Term is currently instantiated (opposite of var/1).

    atom(Term) succeeds if Term is currently instantiated to an atom.

    integer(Term) succeeds if Term is currently instantiated to an integer.

    float(Term) succeeds if Term is currently instantiated to a floating point number.

    number(Term) succeeds if Term is currently instantiated to an integer or a floating point number.

    atomic(Term) succeeds if Term is currently instantiated to an atom, an integer or a floating point number.

    compound(Term) succeeds if Term is currently instantiated to a compound term, i.e. a term of arity > 0 (a list or a structure).

    callable(Term) succeeds if Term is currently instantiated to a callable term, i.e. an atom or a compound term.

    list(Term) succeeds if Term is currently instantiated to a list, i.e. the atom [] (empty list) or a term with principal functor '.'/2 and with second argument (the tail) a list.

    partial_list(Term) succeeds if Term is currently instantiated to a partial list, i.e. a variable or a term whose the main functor is '.'/2 and the second argument (the tail) is a partial list.

    list_or_partial_list(Term) succeeds if Term is currently instantiated to a list or a partial list.

    Errors

    None.

    Portability

    var/1, nonvar/1, atom/1, integer/1, float/1, number/1, atomic/1, compound/1 and callable/1 are ISO predicates.

    list/1, partial_list/1 and list_or_partial_list/1 are GNU Prolog predicates.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Up Next ./gprolog-1.3.0/doc/html_node/gprolog013.html0000644004425400513100000000527410547441640017307 0ustar diazloco Debugging messages Previous Up Next

    4.4  Debugging messages

    We here described which information is displayed by the debugger when it shows a goal. The basic format is as follows:
    S N M PortGoal ?
    S is a spy-point indicator: if there is a spy-point on the current goal the + symbol is displayed else a space is displayed. N is the invocation number. This unique number can be used to correlate the trace messages for the various ports, since it is unique for every invocation. M is an index number which represents the number of direct ancestors of the goal (i.e. the current depth of the goal). Port specifies the particular port (call, exit, fail, redo, exception). Goal is the current goal (it is then possible to inspect its current instantiation) which is displayed using write_term/3 with quoted(true) and max_depth(D) options (section 7.14.6). Initially D (the print depth) is set to 10 but can be redefined using the < debugger command (section 4.5). The ? symbol is displayed when the debugger is waiting a command from the user. (i.e. Port is a leashed port). If the port is unleashed, this symbol is not displayed and the debugger continues the execution displaying the next goal.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog025.html0000644004425400513100000000652410547441640017311 0ustar diazloco Term unification Previous Up Next

    7.2  Term unification

    7.2.1  (=)/2 - Prolog unification

    Templates
    =(?term, ?term)
    Description

    Term1 = Term2 unifies Term1 and Term2. No occurs check is done, i.e. this predicate does not check if a variable is unified with a compound term containing this variable (this can lead to an infinite loop).

    = is a predefined infix operator (section 7.14.10).

    Errors

    None.

    Portability

    ISO predicate.

    7.2.2  unify_with_occurs_check/2

    Templates
    unify_with_occurs_check(?term, ?term)
    Description

    unify_with_occurs_check(Term1, Term2) unifies Term1 and Term2. The occurs check test is done (i.e. the unification fails if a variable is unified with a compound term containing this variable).

    Errors

    None.

    Portability

    ISO predicate.

    7.2.3  (\=)/2 - not Prolog unifiable

    Templates
    \=(?term, ?term)
    Description

    Term1 \= Term2 succeeds if Term1 and Term2 are not unifiable (no occurs check is done).

    \=
    is a predefined infix operator (section 7.14.10).

    Errors

    None.

    Portability

    ISO predicate.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog029.html0000644004425400513100000005316710547441640017322 0ustar diazloco Arithmetic Previous Up Next

    7.6  Arithmetic

    7.6.1  Evaluation of an arithmetic expression

    An arithmetic expression is a Prolog term built from numbers, variables, and functors (or operators) that represent arithmetic functions. When an expression is evaluated each variable must be bound to a non-variable expression. An expression evaluates to a number, which may be an integer or a floating point number. The following table details the components of an arithmetic expression, how they are evaluated, the types expected/returned and if they are ISO or an extension:
    Expression
    Result = eval(Expression)
    Signature ISO
    Variable
    must be bound to a non-variable expression E.
    The result is eval(E)
    IF → IF Y
    integer number
    this number
    I → I Y
    floating point number
    this number
    F → F Y
    + E
    eval(E)
    IF → IF N
    - E
    - eval(E)
    IF → IF Y
    inc(E)
    eval(E) + 1
    IF → IF N
    dec(E)
    eval(E) - 1
    IF → IF N
    E1 + E2
    eval(E1) + eval(E2)
    IF, IF → IF Y
    E1 - E2
    eval(E1) - eval(E2)
    IF, IF → IF Y
    E1 * E2
    eval(E1) * eval(E2)
    IF, IF → IF Y
    E1 / E2
    eval(E1) / eval(E2)
    IF, IF → F Y
    E1 // E2
    rnd(eval(E1) / eval(E2))
    I, I → I Y
    E1 rem E2
    eval(E1) - (rnd(eval(E1) / eval(E2))*eval(E2))
    I, I → I Y
    E1 mod E2
    eval(E1) - ( ⌊eval(E1) / eval(E2)⌋ *eval(E2))
    I, I → I Y
    E1 /\ E2
    eval(E1) bitwise_and eval(E2)
    I, I → I Y
    E1 \/ E2
    eval(E1) bitwise_or eval(E2)
    I, I → I Y
    E1 ^ E2
    eval(E1) bitwise_xor eval(E2)
    I, I → I N
    \ E
    bitwise_not eval(E)
    I → I Y
    E1 << E2
    eval(E1) integer_shift_left eval(E2)
    I, I → I Y
    E1 >> E2
    eval(E1) integer_shift_right eval(E2)
    I, I → I Y
    abs(E)
    absolute value of eval(E)
    IF → IF Y
    sign(E)
    sign of eval(E) (-1 if < 0, 0 if = 0, +1 if > 0)
    IF → IF Y
    min(E1,E2)
    minimal value between eval(E1) and eval(E2)
    IF, IF → ? N
    max(E1,E2)
    maximal value between eval(E1) and eval(E2)
    IF, IF → ? N
    E1 ** E2
    eval(E1) raised to the power of eval(E2)
    IF, IF → F Y
    sqrt(E)
    square root of eval(E)
    IF → F Y
    atan(E)
    arc tangent of eval(E)
    IF → F Y
    cos(E)
    cosine of eval(E)
    IF → F Y
    acos(E)
    arc cosine of eval(E)
    IF → F N
    sin(E)
    sine of eval(E)
    IF → F Y
    asin(E)
    arc sine of eval(E)
    IF → F N
    exp(E)
    e raised to the power of eval(E)
    IF → F Y
    log(E)
    natural logarithms of eval(E)
    IF → F Y
    float(E)
    the floating point number equal to eval(E)
    IF → F Y
    ceiling(E)
    rounds eval(E) upward to the nearest integer
    F → I Y
    floor(E)
    rounds eval(E) downward to the nearest integer
    F → I Y
    round(E)
    rounds eval(E) to the nearest integer
    F → I Y
    truncate(E)
    the integer value of eval(E)
    F → I Y
    float_fractional_part(E)
    the float equal to the fractional part of eval(E)
    F → F Y
    float_integer_part(E)
    the float equal to the integer part of eval(E)
    F → F Y

    The meaning of the signature field is as follows:
    • I → I: unary function, the operand must be an integer and the result is an integer.

    • F → F: unary function, the operand must be a floating point number and the result is a floating point number.

    • F → I: unary function, the operand must be a floating point number and the result is an integer.

    • IF → F: unary function, the operand can be an integer or a floating point number and the result is a floating point number.

    • IF → IF: unary function, the operand can be an integer or a floating point number and the result has the same type as the operand.

    • I, I → I: binary function: each operand must be an integer and the result is an integer.

    • IF, IF → IF: binary function: each operand can be an integer or a floating point number and the result is a floating point number if at least one operand is a floating point number, an integer otherwise.

    • IF, IF → ?: binary function: each operand can be an integer or a floating point number and the result has the same type as the selected operand. This is used for min and max. Note that in case of equality between an integer and a floating point number the result is an integer.
    is, +, -, *, //, /, rem, and mod are predefined infix operators. + and - are predefined prefix operators (section 7.14.10).

    Integer division rounding function: the integer division rounding function rnd(X) rounds the floating point number X to an integer. There are two possible definitions (depending on the target machine) for this function which differ on negative numbers:
    • rnd(X) = integer part of X, e.g. rnd(-1.5) = -1 (round toward 0)

    • rnd(X) = ⌊X⌋, e.g. rnd(-1.5) = -2 (round toward −∞)
    The definition of this function determines the precise definition of the integer division (//)/2 and of the integer remainder (rem)/2. Rounding toward zero is the most common case. In any case it is possible to test the value (toward_zero or down) of the integer_rounding_function Prolog flag to determine which function being used (section 7.22.1).

    Fast mathematical mode: in order to speed-up integer computations, the GNU Prolog compiler can generate faster code when invoked with the –fast-math option (section 3.4.3). In this mode only integer operations are allowed and a variable in an expression must be bound at evaluation time to an integer. No type checking is done.

    Errors
    a sub-expression E is a variable    instantiation_error
    a sub-expression E is neither a number nor an evaluable functor    type_error(evaluable, E)
    a sub-expression E is a floating point number while an integer is expected    type_error(integer, E)
    a sub-expression E is an integer while a floating point number is expected    type_error(float, E)
    a division by zero occurs    evaluation_error(zero_divisor)

    Portability

    Refer to the above table to determine which evaluable functors are ISO and which are GNU Prolog extensions. For efficiency reasons, GNU Prolog does not detect the following ISO arithmetic errors: float_overflow, int_overflow, int_underflow, and undefined.

    7.6.2  (is)/2 - evaluate expression

    Templates
    is(?term, +evaluable)
    Description

    Result is Expression succeeds if Result can be unified with eval(Expression). Refer to the evaluation of an arithmetic expression for the definition of the eval function (section 7.6.1).

    is is a predefined infix operator (section 7.14.10).

    Errors

    Refer to the evaluation of an arithmetic expression for possible errors (section 7.6.1).

    Portability

    ISO predicate.

    7.6.3  (=:=)/2 - arithmetic equal, (=\=)/2 - arithmetic not equal,
    (<)/2 - arithmetic less than, (=<)/2 - arithmetic less than or equal to,
    (>)/2 - arithmetic greater than, (>=)/2 - arithmetic greater than or equal to

    Templates
    =:=(+evaluable, +evaluable)
    =\=(+evaluable, +evaluable)
    <(+evaluable, +evaluable)
    =<(+evaluable, +evaluable)
    >(+evaluable, +evaluable)
    >=(+evaluable, +evaluable)
    Description

    Expr1 =:= Expr2 succeeds if eval(Expr1) = eval(Expr2).

    Expr1 =\= Expr2 succeeds if eval(Expr1) ≠ eval(Expr2).

    Expr1 < Expr2 succeeds if eval(Expr1) < eval(Expr2).

    Expr1 =< Expr2 succeeds if eval(Expr1) ≤ eval(Expr2).

    Expr1 > Expr2 succeeds if eval(Expr1) > eval(Expr2).

    Expr1 >= Expr2 succeeds if eval(Expr1) ≥ eval(Expr2).

    Refer to the evaluation of an arithmetic expression for the definition of the eval function (section 7.6.1).

    =:=, =\=, <, =<, > and >= are predefined infix operators (section 7.14.10).

    Errors

    Refer to the evaluation of an arithmetic expression for possible errors (section 7.6.1).

    Portability

    ISO predicates.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog040.html0000644004425400513100000002102310547441640017275 0ustar diazloco Term expansion Previous Up Next

    7.17  Term expansion

    7.17.1  Definite clause grammars

    Definite clause grammars are a useful notation to express grammar rules. However the ISO reference does not include them, so they should be considered as a system dependent feature. Definite clause grammars are an extension of context-free grammars. A grammar rule is of the form:
    head –> body.
    –> is a predefined infix operator (section 7.14.10).

    Here are some features of definite clause grammars:
    • a non-terminal symbol may be any callable term.

    • a terminal symbol may be any Prolog term and is written as a list. The empty list represents an empty sequence of terminals.

    • a sequence is expressed using the Prolog conjunction operator ((',')/2).

    • the head of a grammar rule consists of a non-terminal optionally followed by a sequence of terminals (i.e. a Prolog list).

    • the body of a grammar rule consists of a sequence of non-terminals, terminals, predicate call, disjunction (using ;/2), if-then (using (->)/2) or cut (using !).

    • a predicate call must be enclosed in curly brackets (using {}/1). This makes it possible to express an extra condition.
    A grammar rule is nothing but a “syntactic sugar” for a Prolog clause. Each grammar rule accepts as input a list of terminals (tokens), parses a prefix of this list and gives as output the rest of this list (possibly enlarged). This rest is generally parsed later. So, each a grammar rule is translated into a Prolog clause that explicitly the manages the list. Two arguments are then added: the input list (Start) and the output list (Stop). For instance:
    p –> q.
    is translated into:
    p(Start, End) :- q(Start, End).
    Extra arguments can be provided and the body of the rule can contain several non-terminals. Example:
    p(X, Y) -->
            q(X),
            r(X, Y),
            s(Y).
    
    is translated into:
    p(X, Y, Start, End) :-
            q(X, Start, A),
            r(X, Y, A, B),
            s(Y, B, End).
    
    Terminals are translated using unification:
    assign(X,Y) –> left(X), [:=], right(Y), [;].
    is translated into:
    assign(X,Y,Start,End) :-
            left(X, Start, A),
            A=[:=|B],
            right(Y, B, C),
            C=[;|End].
    
    Terminals appearing on the left-hand side of a rule are connected to the output argument of the head.

    It is possible to include a call to a prolog predicate enclosing it in curly brackets (to distinguish them from non-terminals):
    assign(X,Y) –> left(X), [:=], right(Y0), {Y is Y0 }, [;].
    is translated into:
    assign(X,Y,Start,End) :-
            left(X, Start, A),
            A=[:=|B],
            right(Y0, B, C),
            Y is Y0,
            C=[;|End].
    
    Cut, disjunction and if-then(-else) are translated literally (and do not need to be enclosed in curly brackets).

    7.17.2  expand_term/2, term_expansion/2

    Templates
    expand_term(?term, ?term)
    term_expansion(?term, ?term)
    Description

    expand_term(Term1, Term2) succeeds if Term2 is a transformation of Term1. The transformation steps are as follows:
    • if Term1 is a variable, it is unified with Term2

    • if term_expansion(Term1, Term2) succeeds Term2 is assumed to be the transformation of Term1.

    • if Term1 is a DCG then Term2 is its translation (section 7.17.1).

    • otherwise Term2 is unified with Term1.
    term_expansion(Term1, Term2) is a hook predicate allowing the user to define a specific transformation.

    The GNU Prolog compiler (section 3.4) automatically calls expand_term/2 on each Term1 read in. However, in the current release, only DCG transformation are done by the compiler (i.e. term_expansion/2 cannot be used). To use term_expansion/2, it is necessary to call expand_term/2 explicitly.

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.17.3  phrase/3, phrase/2

    Templates
    phrase(?term, ?list, ?list)
    phrase(?term, ?list)
    Description

    phrase(Phrase, List, Remainder) succeeds if the list List is in the language defined by the grammar rule body Phrase. Remainder is what remains of the list after a phrase has been found.

    phrase(Phrase, List) is equivalent to phrase(Phrase, List, []).

    Errors
    List is neither a list nor a partial list    type_error(list, List)
    Remainder is neither a list nor a partial list    type_error(list, Remainder)

    Portability

    GNU Prolog predicates.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog038.html0000644004425400513100000004154110547441640017313 0ustar diazloco Input/output from/to constant terms Previous Up Next

    7.15  Input/output from/to constant terms

    These built-in predicates enable a Prolog term to be input from or output to a Prolog constant term (atom, character list or character code list). All these predicates can be defined using constant term streams (section 7.11). They are however simpler to use.

    7.15.1  read_term_from_atom/3, read_from_atom/2, read_token_from_atom/2

    Templates
    read_term_from_atom(+atom ?term, +read_option_list)
    read_from_atom(+atom, ?term)
    read_token_from_atom(+atom, ?nonvar)
    Description

    Like read_term/3, read/2 (section 7.14.1) and read_token/2 (section 7.14.3) except that characters are not read from a text-stream but from Atom; the atom given as first argument.

    Errors
    Atom is a variable    instantiation_error
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    see associated predicate errors    (section 7.14.1) and (section 7.14.3)

    Portability

    GNU Prolog predicates.

    7.15.2  read_term_from_chars/3, read_from_chars/2, read_token_from_chars/2

    Templates
    read_term_from_chars(+character_list ?term, +read_option_list)
    read_from_chars(+character_list, ?term)
    read_token_from_chars(+character_list, ?nonvar)
    Description

    Like read_term/3, read/2 (section 7.14.1) and read_token/2 (section 7.14.3) except that characters are not read from a text-stream but from Chars; the character list given as first argument.

    Errors
    Chars is a partial list or a list with an element E which is a variable    instantiation_error
    Chars is neither a partial list nor a list    type_error(list, Chars)
    an element E of the Chars list is neither a variable nor a character    type_error(character, E)
    see associated predicate errors    (section 7.14.1) and (section 7.14.3)

    Portability

    GNU Prolog predicates.

    7.15.3  read_term_from_codes/3, read_from_codes/2, read_token_from_codes/2

    Templates
    read_term_from_codes(+character_code_list ?term, +read_option_list)
    read_from_codes(+character_code_list, ?term)
    read_token_from_codes(+character_code_list, ?nonvar)
    Description

    Like read_term/3, read/2 (section 7.14.1) and read_token/2 (section 7.14.3) except that characters are not read from a text-stream but from Codes; the character code list given as first argument.

    Errors
    Codes is a partial list or a list with an element E which is a variable    instantiation_error
    Codes is neither a partial list nor a list    type_error(list, Codes)
    an element E of the Codes list is neither a variable nor an integer    type_error(integer, E)
    an element E of the Codes list is an integer but not a character code    representation_error(character_code, E)
    see associated predicate errors    (section 7.14.1) and (section 7.14.3)

    Portability

    GNU Prolog predicates.

    7.15.4  write_term_to_atom/3, write_to_atom/2, writeq_to_atom/2,
    write_canonical_to_atom/2, display_to_atom/2, print_to_atom/2,
    format_to_atom/3

    Templates
    write_term_to_atom(?atom, ?term, +write_option_list)
    write_to_atom(?atom, ?term)
    writeq_to_atom(?atom, ?term)
    write_canonical_to_atom(?atom, ?term)
    display_to_atom(?atom, ?term)
    print_to_atom(?atom, ?term)
    format_to_atom(?atom, +character_code_list_or_atom, +list)
    Description

    Similar to write_term/3, write/2, writeq/2, write_canonical/2, display/2, print/2 (section 7.14.6) and format/3 (section 7.14.7) except that characters are not written onto a text-stream but are collected as an atom which is then unified with the first argument Atom.

    Errors
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    see associated predicate errors    (section 7.14.6) and (section 7.14.7)

    Portability

    GNU Prolog predicates.

    7.15.5  write_term_to_chars/3, write_to_chars/2, writeq_to_chars/2,
    write_canonical_to_chars/2, display_to_chars/2, print_to_chars/2,
    format_to_chars/3

    Templates
    write_term_to_chars(?character_list, ?term, +write_option_list)
    write_to_chars(?character_list, ?term)
    writeq_to_chars(?character_list, ?term)
    write_canonical_to_chars(?character_list, ?term)
    display_to_chars(?character_list, ?term)
    print_to_chars(?character_list, ?term)
    format_to_chars(?character_list, +character_code_list_or_atom, +list)
    Description

    Similar to write_term/3, write/2, writeq/2, write_canonical/2, display/2, print/2 (section 7.14.6) and format/3 (section 7.14.7) except that characters are not written onto a text-stream but are collected as a character list which is then unified with the first argument Chars.

    Errors
    Chars is neither a partial list nor a list    type_error(list, Chars)
    see associated predicate errors    (section 7.14.6) and (section 7.14.7)

    Portability

    GNU Prolog predicates.

    7.15.6  write_term_to_codes/3, write_to_codes/2, writeq_to_codes/2,
    write_canonical_to_codes/2, display_to_codes/2, print_to_codes/2,
    format_to_codes/3

    Templates
    write_term_to_codes(?character_code_list, ?term, +write_option_list)
    write_to_codes(?character_code_list, ?term)
    writeq_to_codes(?character_code_list, ?term)
    write_canonical_to_codes(?character_code_list, ?term)
    display_to_codes(?character_code_list, ?term)
    print_to_codes(?character_code_list, ?term)
    format_to_codes(?character_code_list, +character_code_list_or_atom, +list)
    Description

    Similar to write_term/3, write/2, writeq/2, write_canonical/2, display/2, print/2 (section 7.14.6) and format/3 (section 7.14.7) except that characters are not written onto a text-stream but are collected as a character code list which is then unified with the first argument Codes.

    Errors
    Codes is neither a partial list nor a list    type_error(list, Codes)
    see associated predicate errors    (section 7.14.6) and (section 7.14.7)

    Portability

    GNU Prolog predicates.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog035.html0000644004425400513100000006115210547441640017310 0ustar diazloco Character input/output Previous Up Next

    7.12  Character input/output

    These built-in predicates enable a single character or character code to be input from and output to a text stream. The atom end_of_file is returned as character to indicate the end-of-file. -1 is returned as character code to indicate the end-of-file.

    7.12.1  get_char/2, get_char/1, get_code/1, get_code/2

    Templates
    get_char(+stream_or_alias, ?in_character)
    get_char(?in_character)
    get_code(+stream_or_alias, ?in_character_code)
    get_code(?in_character_code)
    Description

    get_char(SorA, Char) succeeds if Char unifies with the next character read from the stream associated with the stream-term or alias SorA.

    get_code/2 is similar to get_char/2 but deals with character codes.

    get_char/1 and get_code/1 apply to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Char is neither a variable nor an in-character    type_error(in_character, Char)
    Code is neither a variable nor an integer    type_error(integer, Code)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)
    The entity input from the stream is not a character    representation_error(character)
    Code is an integer but not an in-character code    representation_error(in_character_code)

    Portability

    ISO predicates.

    7.12.2  get_key/2, get_key/1 get_key_no_echo/2, get_key_no_echo/1

    Templates
    get_key(+stream_or_alias, ?integer)
    get_key(?integer)
    get_key_no_echo(+stream_or_alias, ?integer)
    get_key_no_echo(?integer)
    Description

    get_key(Code, SorA) succeeds if Code unifies with the character code of the next key read from the stream associated with the stream-term or alias SorA. It is intended to read a single key from the keyboard (thus SorA should refer to current input stream). No buffering is performed (a character is read as soon as available) and function keys can also be read (in that case, Code is an integer > 255). The read character is echoed if it is printable.

    This facility is only possible if the linedit facility has been installed (section 3.2.5) otherwise get_key/2 behaves similarly to get_code/2 (section 7.12.1) (the code of the first character is returned) but also pumps remaining characters until a character < space (0x20) is read (in particular RETURN). The same behavior occurs if SorA does not refer to the current input stream or if this stream is not attached to a terminal.

    get_key_no_echo/2 behaves similarly to get_key/2 except that the read character is not echoed.

    get_key/1 and get_key_no_echo/1 apply to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Code is neither a variable nor an integer    type_error(integer, Code)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)

    Portability

    GNU Prolog predicates.

    7.12.3  peek_char/2, peek_char/1, peek_code/1, peek_code/2

    Templates
    peek_char(+stream_or_alias, ?in_character)
    peek_char(?in_character)
    peek_code(+stream_or_alias, ?in_character_code)
    peek_code(?in_character_code)
    Description

    peek_char(SorA, Char) succeeds if Char unifies with the next character that will be read from the stream associated with the stream-term or alias SorA. The character is not read.

    peek_code/2 is similar to peek_char/2 but deals with character codes.

    peek_char/1 and peek_code/1 apply to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Char is neither a variable nor an in-character    type_error(in_character, Char)
    Code is neither a variable nor an integer    type_error(integer, Code)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)
    The entity input from the stream is not a character    representation_error(character)
    Code is an integer but not an in-character code    representation_error(in_character_code)

    Portability

    ISO predicates.

    7.12.4  unget_char/2, unget_char/1, unget_code/2, unget_code/1

    Templates
    unget_char(+stream_or_alias, +character)
    unget_char(+character)
    unget_code(+stream_or_alias, +character_code)
    unget_code(+character_code)
    Description

    unget_char(SorA, Char) pushes back Char onto the stream associated with the stream-term or alias SorA. Char will be the next character read by get_char/2. The maximum number of characters that can be cumulatively pushed back is given by the max_unget Prolog flag (section 7.22.1).

    unget_code/2 is similar to unget_char/2 but deals with character codes.

    unget_char/1 and unget_code/1 apply to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Char is a variable    instantiation_error
    Code is a variable    instantiation_error
    Char is neither a variable nor a character    type_error(character, Char)
    Code is neither a variable nor an integer    type_error(integer, Code)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
    Code is an integer but not a character code    representation_error(character_code)

    Portability

    GNU Prolog predicates.

    7.12.5  put_char/2, put_char/1, put_code/1, put_code/2, nl/1, nl/0

    Templates
    put_char(+stream_or_alias, +character)
    put_char(+character)
    put_code(+stream_or_alias, +character_code)
    put_code(+character_code)
    nl(+stream_or_alias)
    nl
    Description

    put_char(SorA, Char) writes Char onto the stream associated with the stream-term or alias SorA.

    put_code/2 is similar to put_char/2 but deals with character codes.

    nl(SorA) writes a new-line character onto the stream associated with the stream-term or alias SorA. This is equivalent to put_char(SorA, '\n').

    put_char/1, put_code/1 and nl/0 apply to the current output stream.

    Errors
    SorA is a variable    instantiation_error
    Char is a variable    instantiation_error
    Code is a variable    instantiation_error
    Char is neither a variable nor a character    type_error(character, Char)
    Code is neither a variable nor an integer    type_error(integer, Code)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an input stream    permission_error(output, stream, SorA)
    SorA is associated with a binary stream    permission_error(output, binary_stream, SorA)
    Code is an integer but not a character code    representation_error(character_code)

    Portability

    ISO predicates.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog056.html0000644004425400513100000001231510547441640017310 0ustar diazloco FD variable parameters Previous Up Next

    8.2  FD variable parameters

    8.2.1  fd_max_integer/1

    Templates
    fd_max_integer(?integer)
    Description

    fd_max_integer(N) succeeds if N is the current value of fd_max_integer (section 8.1).

    Errors
    N is neither a variable nor an integer    type_error(integer, N)

    Portability

    GNU Prolog predicate.

    8.2.2  fd_vector_max/1

    Templates
    fd_vector_max(?integer)
    Description

    fd_vector_max(N) succeeds if N is the current value of vector_max (section 8.1).

    Errors
    N is neither a variable nor an integer    type_error(integer, N)

    Portability

    GNU Prolog predicate.

    8.2.3  fd_set_vector_max/1

    Templates
    fd_set_vector_max(+integer)
    Description

    fd_set_vector_max(N) initializes vector_max based on the value N (section 8.1). More precisely, on 32 bit machines, vector_max is set to the smallest value of (32*k)-1 which is ≥ N.

    Errors
    N is a variable    instantiation_error
    N is neither a variable nor an integer    type_error(integer, N)
    N is an integer < 0    domain_error(not_less_than_zero, N)

    Portability

    GNU Prolog predicate.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog063.html0000644004425400513100000001704110547441640017307 0ustar diazloco Labeling constraints Previous Up Next

    8.9  Labeling constraints

    8.9.1  fd_labeling/2, fd_labeling/1, fd_labelingff/1

    Templates
    fd_labeling(+fd_variable_list, +fd_labeling_option_list)
    fd_labeling(+fd_variable, +fd_labeling_option_list)
    fd_labeling(+fd_variable_list)
    fd_labeling(+fd_variable)
    fd_labelingff(+fd_variable_list)
    fd_labelingff(+fd_variable)
    Description

    fd_labeling(Vars, Options) assigns a value to each variable X of the list Vars according to the list of labeling options given by Options. Vars can be also a single FD variable. This predicate is re-executable on backtracking.

    FD labeling options: Options is a list of labeling options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are:
    • variable_method(V): specifies the heuristics to select the variable to enumerate:
      • standard: no heuristics, the leftmost variable is selected.

      • first_fail (or ff): selects the variable with the smallest number of elements in its domain. If several variables have the same number of elements the leftmost variable is selected.

      • most_constrained: like first_fail but when several variables have the same number of elements selects the variable that appears in most constraints.

      • smallest: selects the variable that has the smallest value in its domain. If there is more than one such variable selects the variable that appears in most constraints.

      • largest: selects the variable that has the greatest value in its domain. If there is more than one such variable selects the variable that appears in most constraints.

      • max_regret: selects the variable that has the greatest difference between the smallest value and the next value of its domain. If there is more than one such variable selects the variable that appears in most constraints.

      • random: selects randomly a variable. Each variable is only chosen once.

      The default value is standard.

    • reorder(true/false): specifies if the variable heuristics should dynamically reorder the list of variable (true) or not (false). Dynamic reordering is generally more efficient but in some cases a static ordering is faster. The default value is true.

    • value_method(V): specifies the heuristics to select the value to assign to the chosen variable:
      • min: enumerates the values from the smallest to the greatest (default).

      • max: enumerates the values from the greatest to the smallest.

      • middle: enumerates the values from the middle to the bounds.

      • bounds: enumerates the values from the bounds to the middle.

      • random: enumerates the values randomly. Each value is only tried once.

      The default value is min.

    • backtracks(B): unifies B with the number of backtracks during the enumeration.
    fd_labeling(Vars) is equivalent to fd_labeling(Vars, []).

    fd_labelingff(Vars) is equivalent to fd_labeling(Vars, [variable_method(ff)]).

    Errors
    Vars is a partial list or a list with an element E which is a variable    instantiation_error
    Vars is neither a partial list nor a list    type_error(list, Vars)
    an element E of the Vars list is neither a variable nor an integer nor an FD variable    type_error(fd_variable, E)
    Options is a partial list or a list with an element E which is a variable    instantiation_error
    Options is neither a partial list nor a list    type_error(list, Options)
    an element E of the Options list is neither a variable nor a labeling option    domain_error(fd_labeling_option, E)

    Portability

    GNU Prolog predicates.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog066.html0000644004425400513100000007043310547441640017316 0ustar diazloco Calling C from Prolog Up Next

    9.1  Calling C from Prolog

    9.1.1  Introduction

    This interface allows a Prolog predicate to call a C function. Here are some features of this facility:
    • implicit Prolog ↔ C data conversions for simple types.

    • functions to handle complex types.

    • error detection depending on the type of the argument.

    • different kinds of arguments: input, output or input/output.

    • possibility to write non-deterministic code.
    This interface can then be used to write both simple and complex C routines. A simple routine uses either input or output arguments which type is simple. In that case the user does not need any knowledge of Prolog data structures since all Prolog ↔ C data conversions are implicitly achieved. To manipulate complex terms (lists, structures) a set of functions is provided. Finally it is also possible to write non-deterministic C code.

    9.1.2  foreign/2 directive

    foreign/2 directive (section 6.1.14) declares a C function interface. The general form is foreign(Template, Options) which defines an interface predicate whose prototype is Template according to the options given by Options. Template is a callable term specifying the type/mode of each argument of the associated Prolog predicate.

    Foreign options: Options is a list of foreign options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are:
    • fct_name(F): F is an atom representing the name of the C function to call. By default the name of the C function is the same as the principal functor of Template. In any case, the atom associated with the name of the function must conforms to the syntax of C identifiers.

    • return(boolean/none/jump): specifies the value returned by the C function:
      • boolean: the type of the function is Bool (returns TRUE on success, FALSE otherwise).

      • none: the type of the function is void (no returned value).

      • jump: the type of the function is void(*)() (returns the address of a Prolog code to execute).

      The default value is boolean.

    • bip_name(Name, Arity): initializes the error context with Name and Arity. If an error occurs this information is used to indicate from which predicate the error occurred (section 5.3.1). It is also possible to prevent the initialization of the error context using bip_name(none). By default Name and Arity are set to the functor and arity of Template.

    • choice_size(N): this option specifies that the function implements a non-deterministic code. N is an integer specifying the size needed by the non-deterministic C function. This facility is explained later (section 9.1.7). By default a foreign function is deterministic.
    foreign(Template) is equivalent to foreign(Template, []).

    Foreign modes and types: each argument of Template specifies the foreign mode and type of the corresponding argument. This information is used to check the type of effective arguments at run-time and to perform Prolog ↔ C data conversions. Each argument of Template is formed with a mode symbol followed by a type name. Possible foreign modes are:
    • +: input argument.

    • -: output argument.

    • ?: input/output argument.
    Possible foreign types are:
    Foreign type Prolog type C type Description of the C type
    integer integer long value of the integer
    positive positive integer long value of the integer
    float floating point number double value of the floating point number
    number number double value of the number
    atom atom int internal key of the atom
    boolean boolean int value of the boolean (0=false, 1=true)
    char character int value of (the code of) the character
    code character code int value of the character-code
    byte byte int value of the byte
    in_char in-character int value of the character or -1 for end-of-file
    in_code in-character code int value of the character-code or -1 for end-of-file
    in_byte in-byte int value of the byte or -1 for the end-of-file
    string atom char * C string containing the name of the atom
    chars character list char * C string containing the characters of the list
    codes character-code list char * C string containing the characters of the list
    term Prolog term PlTerm generic Prolog term

    Simple foreign type: a simple type is any foreign type listed in the above tabled except term. A simple foreign type is an atomic term (character and character-code lists are in fact lists of constants). Each simple foreign type is converted to/from a C type to simplify the writing of the C function.

    Complex foreign type: type foreign type term refers to any Prolog term (e.g. lists, structures...). When such an type is specified the argument is passed to the C function as a PlTerm (GNU Prolog C type equivalent to a long). Several functions are provided to manipulate PlTerm variables (section 9.2). Since the original term is passed to the function it is possible to read its value or to unify it. So the meaning of the mode symbol is less significant. For this reason it is possible to omit the mode symbol. In that case term is equivalent to +term.

    9.1.3  The C function

    The C code is written in a C file which must first include the GNU Prolog header file called gprolog.h. This file contains all GNU Prolog C definitions (constants, types, prototypes,...).

    The type returned by a C function depends on the value of the return foreign option (section 9.1.2). If it is boolean then the C function is of type Bool and shall return TRUE in case of success and FALSE otherwise. If the return option is none the C function is of type void. Finally if it is jump, the function shall return the address of a Prolog predicate and, at the exit of the function, the control is given to that predicate.

    The type of the arguments of the C function depends on the mode and type declaration specified in Template for the corresponding argument as explained in the following sections.

    9.1.4  Input arguments

    An input argument is tested at run-time to check if its type conforms to the foreign type and then it is passed to the C function. The type of the associated C argument is given by the above table (section 9.1.2). For instance, the effective argument Arg associated with +positive foreign declaration is submitted to the following process:
    • if Arg is a variable an instantiation_error is raised.

    • if Arg is neither a variable nor an integer a type_error(integer, Arg) is raised.

    • if Arg is an integer < 0 a domain_error(not_less_than_zero, Arg) is raised.

    • otherwise the value of Arg is passed to the C is passed to the C function as an integer (long).
    When +string is specified the string passed to the function is the internal string of the corresponding atom and should not be modified.

    When +term is specified the term passed to the function is the original Prolog term. It can be read and/or unified. It is also the case when term is specified without any mode symbol.

    9.1.5  Output arguments

    An output argument is tested at run-time to check if its type conforms to the foreign type and it is unified with the value set by the C function. The type of the associated C argument is a pointer to the type given by the above table (section 9.1.2). For instance, the effective argument Arg associated with -positive foreign declaration is handled as follows:
    • if Arg is neither a variable nor an integer a type_error(integer, Arg) is raised.

    • if Arg is an integer < 0 a domain_error(not_less_than_zero, Arg) is raised.

    • otherwise a pointer to an integer (long *) is passed to the C function. If the function returns TRUE the integer stored at this location is unified with Arg.
    When -term is specified, the function must construct a term into the its corresponding argument (which is of type PlTerm *). At the exit of the function this term will be unified with the actual predicate argument.

    9.1.6  Input/output arguments

    Basically an input/output argument is treated as in input argument if it is not a variable, as an output argument otherwise. The type of the associated C argument is a pointer to a FIOArg (GNU Prolog C type) defined as follows:
    typedef struct
        {
         Bool is_var;
         Bool unify;
         union
            {
             long   l;
             char  *s;
             double d;
            }value;
        }FIOArg;
    
    The field is_var is set to TRUE if the argument is a variable and FALSE otherwise. This value can be tested by the C function to determine which treatment to perform. The field unify controls whether the effective argument must be unified at the exit of the C function. Initially unify is set to the same value as is_var (i.e. a variable argument will be unified while a non-variable argument will not) but it can be modified by the C function. The field value stores the value of the argument. It is declared as a C union since there are several kinds of value types. The field s is used for C strings, d for C doubles and l otherwise (int, long, PlTerm). if is_var is FALSE then value contains the input value of the argument with the same conventions as for input arguments (section 9.1.4). At the exit of the function, if unify is TRUE value must contain the value to unify with the same conventions as for output arguments (section 9.1.5).

    For instance, the effective argument Arg associated with ?positive foreign declaration is handled as follows:
    • if Arg is a variable is_var and unify are set to TRUE else to FALSE and its value is copied in value.l.

    • if Arg is neither a variable nor an integer a type_error(integer, Arg) is raised.

    • if Arg is an integer < 0 a domain_error(not_less_than_zero, Arg) is raised.

    • otherwise a pointer to the FIOArg (FIOArg *) is passed to the C function. If the function returns TRUE and if unify is TRUE the value stored in value.l is unified with Arg.

    9.1.7  Writing non-deterministic C code

    The interface allows the user to write non-deterministic C code. When a C function is non-deterministic, a choice-point is created for this function. When a failure occurs, if all more recent non-deterministic code are finished, the function is re-invoked. It is then important to inform Prolog when there is no more solution (i.e. no more choice) for a non-deterministic code. So, when no more choices remains the function must remove the choice-point. The interface increments a counter each time the function is re-invoked. At the first call this counter is equal to 0. This information allows the function to detect its first call. When writing non-deterministic code, it is often useful to record data between consecutive re-invocations of the function. The interface maintains a buffer to record such an information. The size of this buffer is given by choice_size(N) when using foreign/2 (section 9.1.2). This size is the number of (consecutive) longs needed by the C function. Inside the function it is possible to call the following functions/macros:
    void Get_Choice_Counter(void)
    TYPE Get_Choice_Buffer (TYPE)
    void No_More_Choice    (void)
    
    The function Get_Choice_Counter() returns the value of the invocation counter (0 at the first call).

    The macro Get_Choice_Buffer(TYPE) returns a pointer to the buffer (casted to TYPE).

    The function No_More_Choice() deletes the choice point associated with the function.

    9.1.8  Example: input and output arguments

    All examples presented here can be found in the ExamplesC sub-directory of the distribution, in the files examp.pl (Prolog part) and examp_c.c (C part).

    Let us define a predicate first_occurrence(A, C, P) which unifies P with the position (from 0) of the first occurrence of the character C in the atom A. The predicate must fail if C does not appear in A.

    In the prolog file examp.pl:
    :- foreign(first_occurrence(+string, +char, -positive)).
    In the C file examp_c.c:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    first_occurrence(char *str, long c, long *pos)
    {
      char *p;
    
      p = strchr(str, c);
      if (p == NULL)                /* C does not appear in A */
        return FALSE;               /* fail */
    
      *pos = p - str;               /* set the output argument */
      return TRUE;                  /* succeed */
    }
    
    The compilation produces an executable called examp:
    % gplc examp.pl examp_c.c
    Examples of use:
    | ?- first_occurrence(prolog, p, X).
    
    X = 0
    
    | ?- first_occurrence(prolog, k, X).
    
    no
    
    | ?- first_occurrence(prolog, A, X).
    {exception: error(instantiation_error,first_occurrence/3)}
    
    | ?- first_occurrence(prolog, 1 ,X).
    {exception: error(type_error(character,1),first_occurrence/3)}
    

    9.1.9  Example: non-deterministic code

    We here define a predicate occurrence(A, C, P) which unifies P with the position (from 0) of one occurrence of the character C in the atom A. The predicate will fail if C does not appear in A. The predicate is re-executable on backtracking. The information that must be recorded between two invocations of the function is the next starting position in A to search for C.

    In the prolog file examp.pl:
    :- foreign(occurrence(+string, +char, -positive), [choice_size(1)]).
    In the C file examp_c.c:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    occurrence(char *str, long c, long *pos)
    {
      char **info_pos;
      char *p;
    
      info_pos = Get_Choice_Buffer(char **); /* recover the buffer */
    
      if (Get_Choice_Counter() == 0)        /* first invocation ? */
        *info_pos = str;
    
      p = strchr(*info_pos, c);
      if (p == NULL)                /* C does not appear */
        {
          No_More_Choice();         /* remove choice-point */
          return FALSE;             /* fail */
        }
    
      *pos = p - str;               /* set the output argument */
      *info_pos = p + 1;            /* update next starting pos */
      return TRUE;                  /* succeed */
    }
    
    The compilation produces an executable called examp:
    % gplc examp.pl examp_c.c
    Examples of use:
    | ?- occurrence(prolog, o, X).
     
    X = 2 ?    (here the user presses ; to compute another solution)
     
    X = 4 ?    (here the user presses ; to compute another solution)
     
    no    (no more solution)
     
    | ?- occurrence(prolog, k, X).
     
    no
    In the first example when the second (the last) occurrence is found (X=4) the choice-point remains and the failure is detected only when another solution is requested (by pressing ;). It is possible to improve this behavior by deleting the choice-point when there is no more occurrence. To do this it is necessary to do one search ahead. The information stored is the position of the next occurrence. Let us define such a behavior for the predicate occurrence2/3.

    In the prolog file examp.pl:
    :- foreign(occurrence2(+string, +char, -positive), [choice_size(1)]).
    In the C file examp_c.c:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    occurrence2(char *str, long c, long *pos)
    {
      char **info_pos;
      char *p;
    
      info_pos = Get_Choice_Buffer(char **); /* recover the buffer */
    
      if (Get_Choice_Counter() == 0) /* first invocation ? */
        {
          p = strchr(str, c);
          if (p == NULL)            /* C does not appear at all */
            {
              No_More_Choice();     /* remove choice-point */
              return FALSE;         /* fail */
            }
    
          *info_pos = p;
        }
                                    /* info_pos = an occurrence */
      *pos = *info_pos - str;       /* set the output argument */
    
      p = strchr(*info_pos + 1, c);
      if (p == NULL)                /* no more occurrence */
        No_More_Choice();           /* remove choice-point */
      else
        *info_pos = p;              /* else update next solution */
    
      return TRUE;                  /* succeed */
    }
    
    Examples of use:
    | ?- occurrence2(prolog, l, X).
     
    X = 3    (here the user is not prompted since there is no more alternative)
     
    | ?- occurrence2(prolog, o, X).
     
    X = 2 ?    (here the user presses ; to compute another solution)
     
    X = 4    (here the user is not prompted since there is no more alternative)

    9.1.10  Example: input/output arguments

    We here define a predicate char_ascii(Char, Code) which converts in both directions the character Char and its character-code Code. This predicate is then similar to char_code/2 (section 7.19.4).

    In the prolog file examp.pl:
    :- foreign(char_ascii(?char, ?code), [fct_name('Char_Ascii')]).
    In the C file examp_c.c:
    #include "gprolog.h"
    
    Bool
    char_ascii(FIOArg *c, FIOArg *ascii)
    {
      if (!c->is_var)               /* Char is not a variable */
        {
          ascii->unify = TRUE;      /* enforce unif. of Code */
          ascii->value.l = c->value.l; /* set Code */
          return TRUE;              /* succeed */
        }
    
      if (ascii->is_var)            /* Code is also a variable */
        Pl_Err_Instantiation();     /* emit instantiation_error */
    
      c->value.l = ascii->value.l;  /* set Char */
      return TRUE;                  /* succeed */
    }
    
    If Char is instantiated it is necessary to enforce the unification of Code since it could be instantiated. Recall that by default if an input/output argument is instantiated it will not be unified at the exit of the function (section 9.1.6). If both Char and Code are variables the function raises an instantiation_error. The way to raise Prolog errors is described later (section 9.3).

    The compilation produces an executable called examp:
    % gplc examp.pl examp_c.c
    Examples of use:
    | ?- char_ascii(a, X).
    
    X = 97
    
    | ?- char_ascii(X, 65).
    
    X = 'A'
    
    | ?- char_ascii(a, 12).
    
    no
    
    | ?- char_ascii(X, X).
    {exception: error(instantiation_error,char_ascii/2)}
    
    | ?- char_ascii(1, 12).
    {exception: error(type_error(character,1),char_ascii/2)}
    

    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Up Next ./gprolog-1.3.0/doc/html_node/gprolog055.html0000644004425400513100000002143110547441640017306 0ustar diazloco Introduction Up Next

    8.1  Introduction

    The finite domain (FD) constraint solver extends Prolog with constraints over FD. This facility is available if the FD part of GNU Prolog has been installed. The solver is an instance of the Constraint Logic Programming scheme introduced by Jaffar and Lassez in 1987 [7]. Constraints on FD are solved using propagation techniques, in particular arc-consistency (AC). The interested reader can refer to “Constraint Satisfaction in Logic Programming” of P. Van Hentenryck (1989) [8]. The solver is based on the clp(FD) solver [4]. The GNU Prolog FD solver offers arithmetic constraints, boolean constraints, reified constraints and symbolic constraints on an new kind of variables: Finite Domain variables.

    8.1.1  Finite Domain variables

    A new type of data is introduced: FD variables which can only take values in their domains. The initial domain of an FD variable is 0..fd_max_integer where fd_max_integer represents the greatest value that any FD variable can take. The predicate fd_max_integer/1 returns this value which may be different from the max_integer Prolog flag (section 7.22.1). The domain of an FD variable X is reduced step by step by constraints in a monotonic way: when a value has been removed from the domain of X it will never reappear in the domain of X. An FD variable is fully compatible with both Prolog integers and Prolog variables. Namely, when an FD variable is expected by an FD constraint it is possible to pass a Prolog integer (considered as an FD variable whose domain is a singleton) or a Prolog variable (immediately bound to an initial range 0..fd_max_integer). This avoids the need for specific type declaration. Although it is not necessary to declare the initial domain of an FD variable (since it will be bound 0..fd_max_integer when appearing for the fist time in a constraint) it is advantageous to do so and thus reduce as soon as possible the size of its domain: particularly because GNU Prolog, for efficiency reasons, does not check for overflows. For instance, without any preliminary domain definitions for X, Y and Z, the non-linear constraint X*Y#=Z will fail due to an overflow when computing the upper bound of the domain of Z: fd_max_integer × fd_max_integer. This overflow causes a negative result for the upper bound and the constraint then fails.

    There are two internal representations for an FD variable:
    • interval representation: only the min and the max of the variable are maintained. In this representation it is possible to store values included in 0..fd_max_integer.

    • sparse representation: an additional bit-vector is used to store the set of possible values for the variable (i.e. the domain). In this representation it is possible to store values included in 0..vector_max. By default vector_max is set to 127. This value can be redefined via an environment variable VECTORMAX or via the built-in predicate fd_set_vector_max/1 (section 8.2.3). The predicate fd_vector_max/1 returns the current value of vector_max (section 8.2.1).
    The initial representation for an FD variable X is always an interval representation and is switched to a sparse representation when a “hole” appears in the domain (e.g. due to an inequality constraint). Once a variable uses a sparse representation it will not switch back to an interval representation even if there are no longer holes in its domain. When this switching occurs some values in the domain of X can be lost since vector_max is less than fd_max_integer. We say that “X is extra-constrained” since X is constrained by the solver to the domain 0..vector_max (via an imaginary constraint X #=< vector_max). An extra_cstr is associated with each FD variable to indicate that values have been lost due to the switch to a sparse representation. This flag is updated on every operations. The domain of an extra-constrained FD variable is output followed by the @ symbol. When a constraint fails on a extra-constrained variable a message Warning: Vector too small - maybe lost solutions (FD Var:N) is displayed (N is the address of the involved variable).

    Example 1 (vector_max = 127):
    Constraint on X Domain of X extra_cstr Lost values
    X #=< 512 0..512 off none
    X #\= 10 0..9:11..127 on 128..512
    X #=< 100 0..9:11..100 off none

    In this example, when the constraint X #\= 10 is posted some values are lost, the extra_cstr is then switched on. However, posting the constraint X #=< 100 will turn off the flag (no values are lost).

    Example 2:
    Constraint on X Domain of X extra_cstr Lost values
    X #=< 512 0..512 off none
    X #\= 10 0..9:11..127 on 128..512
    X #>= 256 Warning: Vector too small... on 128..512

    In this example, the constraint X #>= 256 fails due to the lost of 128..512 so a message is displayed onto the terminal. The solution would consist in increasing the size of the vector either by setting the environment variable VECTORMAX (e.g. to 512) or using fd_set_vector_max(512).

    Finally, bit-vectors are not dynamic, i.e. all vectors have the same size (0..vector_max). So the use of fd_set_vector_max/1 is limited to the initial definition of vector sizes and must occur before any constraint. As seen before, the solver tries to display a message when a failure occurs due to a too short vector_max. Unfortunately, in some cases it cannot detect the lost of values and no message is emitted. So the user should always take care to this parameter to be sure that it is large to encode any vector.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Up Next ./gprolog-1.3.0/doc/html_node/gprolog022.html0000644004425400513100000002677610547441640017321 0ustar diazloco Prolog control constructs Previous Up

    6.2  Prolog control constructs

    6.2.1  true/0, fail/0, !/0

    Templates
    true
    fail
    !
    Description

    true always succeeds.

    fail always fails (enforces backtracking).

    ! always succeeds and the for side-effect of removing all choice-points created since the invocation of the predicate activating it.

    Errors

    None.

    Portability

    ISO control constructs.

    6.2.2  (',')/2 - conjunction, (;)/2 - disjunction, (->)/2 - if-then

    Templates
    ','(+callable_term, +callable_term)
    ;(+callable_term, +callable_term)
    ->(+callable_term, +callable_term)
    Description

    Goal1 , Goal2 executes Goal1 and, in case of success, executes Goal2.

    Goal1 ; Goal2 first creates a choice-point and executes Goal1. On backtracking Goal2 is executed.

    Goal1 -> Goal2 first executes Goal1 and, in case of success, removes all choice-points created by Goal1 and executes Goal2. This control construct acts like an if-then (Goal1 is the test part and Goal2 the then part). Note that if Goal1 fails ->/2 fails also. ->/2 is often combined with ;/2 to define an if-then-else as follows: Goal1 -> Goal2 ; Goal3. Note that Goal1 -> Goal2 is the first argument of the (;)/2 and Goal3 (the else part) is the second argument. Such an if-then-else control construct first creates a choice-point for the else-part (intuitively associated with ;/2) and then executes Goal1. In case of success, all choice-points created by Goal1 together with the choice-point for the else-part are removed and Goal2 is executed. If Goal1 fails then Goal3 is executed.

    ',', ; and -> are predefined infix operators (section 7.14.10).

    Errors
    Goal1 or Goal2 is a variable    instantiation_error
    Goal1 is neither a variable nor a callable term    type_error(callable, Goal1)
    Goal2 is neither a variable nor a callable term    type_error(callable, Goal2)
    The predicate indicator Pred of Goal1 or Goal2 does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)

    Portability

    ISO control constructs.

    6.2.3  call/1

    Templates
    call(+callable_term)
    Description

    call(Goal) executes Goal. call/1 succeeds if Goal represents a goal which is true. When Goal contains a cut symbol ! (section 6.2.1) as a subgoal, the effect of ! does not extend outside Goal.

    Errors
    Goal is a variable    instantiation_error
    Goal is neither a variable nor a callable term    type_error(callable, Goal)
    The predicate indicator Pred of Goal does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)

    Portability

    ISO control construct.

    6.2.4  catch/3, throw/1

    Templates
    catch(?callable_term, ?term, ?term)
    throw(+nonvar)
    Description

    catch(Goal, Catcher, Recovery) is similar to call(Goal) (section 6.2.3). If this succeeds or fails, so does the call to catch/3. If however, during the execution of Goal, there is a call to throw(Ball), the current flow of control is interrupted, and control returns to a call of catch/3 that is being executed. This can happen in one of two ways:
    • implicitly, when an error condition for a built-in predicate is satisfied.

    • explicitly, when the program executes a call of throw/1 because the program wishes to abandon the current processing, and instead to take an alternative action.
    throw(Ball) causes the normal flow of control to be transferred back to an existing call of catch/3. When a call to throw(Ball) happens, Ball is copied and the stack is unwound back to the call to catch/3, whereupon the copy of Ball is unified with Catcher. If this unification succeeds, then catch/3 executes the goal Recovery using call/1 (section 6.2.3) in order to determine the success or failure of catch/3. Otherwise, in case the unification fails, the stack keeps unwinding, looking for an earlier invocation of catch/3. Ball may be any non-variable term.

    Errors
    Goal is a variable    instantiation_error
    Goal is neither a variable nor a callable term    type_error(callable, Goal)
    The predicate indicator Pred of Goal does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)
    Ball is a variable    instantiation_error

    If Ball does not unify with the Catcher argument of any call of catch/3, a system error message is displayed and throw/1 fails.

    When catch/3 calls Recovery it uses call/1 (section 6.2.3), an instantiation_error, a type_error or an existence_error can then occur depending on Recovery.

    Portability

    ISO control constructs.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up ./gprolog-1.3.0/doc/html_node/gprolog015.html0000644004425400513100000001236710547441640017312 0ustar diazloco The WAM debugger Previous Up

    4.6  The WAM debugger

    In some cases it is interesting to have access to the WAM data structures. This sub-debugger allows the user to inspect/modify the contents of any stack or register of the WAM. The WAM debugger is invoked using the built-in predicate wam_debug/0 (section 4.3.1) or the W debugger command (section 4.5). The following table presents the specific commands of the WAM debugger:
    Command Description
    write A [N] write N terms starting at the address A using write/1 (section 7.14.6)
    data A [N] display N words starting at the address A
    modify A [N] display and modify N words starting at the address A
    where A display the real address corresponding to A
    what RA display what corresponds to the real address RA
    deref A display the dereferenced word starting at the address A
    envir [SA] display the contents of the environment located at SA (or the current one)
    backtrack [SA] display the contents of the choice-point located at SA (or the current one)
    backtrack all display all choice-points
    quit quit the WAM debugger
    help display a summary of available commands

    In the above table the following conventions apply:
    • elements between [ and ] are optional.

    • N is an optional integer (defaults to 1).

    • A is a WAM address, its syntax is: BANK_NAME [ [ N ] ], i.e. a bank name possibly followed by an index (defaults to 0). BANK_NAME is either:
      • reg: WAM general register (stack pointers, continuation, ...).

      • x: WAM X register (temporary variables, i.e. arguments).

      • y: WAM Y register (permanent variables).

      • ab: WAM X register saved in the current choice-point.

      • STACK_NAME: WAM stack (STACK_NAME in local, global, trail, cstr).


    • SA is a WAM stack address, i.e. STACK_NAME [ [ N ] ] (special case of WAM addresses).

    • RA is a real address, its syntax is the syntax of C integers (in particular the notation 0x... is recognized).
    It is possible to only use the first letters of a commands and bank names when there is no ambiguity. Also the square brackets [ ] enclosing the index of a bank name can be omitted. For instance the following command (showing the contents of 25 consecutive words of the global stack from the index 3): data global[3] 25 can be abbreviated as: d g 3 25.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up ./gprolog-1.3.0/doc/html_node/gprolog.css0000644004425400513100000000230310547441640016675 0ustar diazloco .toc{list-style:none;} .title{margin:auto;text-align:center} .center{text-align:center;margin-left:auto;margin-right:auto;} .flushleft{text-align:left;margin-left:0ex;margin-right:auto;} .flushright{text-align:right;margin-left:auto;margin-right:0ex;} DIV TABLE{margin-left:inherit;margin-right:inherit;} PRE{text-align:left;margin-left:0ex;margin-right:auto;} BLOCKQUOTE{margin-left:4ex;margin-right:4ex;text-align:left;} .part{margin:auto;text-align:center} BODY{backgroundcolor:white} .title{padding:1ex;background:#00B200} .titlemain{padding:1ex;background:#00B200} .titlerest{padding:1ex;background:#00B200} .part{padding:1ex;background:#00CC00} .section{padding:.5ex;background:#2DE52D} .subsection{padding:0.3ex;background:#66FF66} .subsubsection{padding:0.5ex;background:#98FF98} .ftoc1{list-style:none;margin:0ex 1ex;padding:0ex 1ex;border-left:1ex solid #00CC00;} .ftoc2{list-style:none;margin:0ex 1ex;padding:0ex 1ex;border-left:1ex solid #2DE52D;} .ftoc3{list-style:none;margin:0ex 1ex;padding:0ex 1ex;border-left:1ex solid #66FF66;} .ftoc4{list-style:none;margin:0ex 1ex;padding:0ex 1ex;border-left:1ex solid #98FF98;} .ftoc5{list-style:none;margin:0ex 1ex;padding:0ex 1ex;border-left:1ex solid #CCFFCC;} ./gprolog-1.3.0/doc/html_node/gprolog057.html0000644004425400513100000001760110547441640017314 0ustar diazloco Initial value constraints Previous Up Next

    8.3  Initial value constraints

    8.3.1  fd_domain/3, fd_domain_bool/1

    Templates
    fd_domain(+fd_variable_list_or_fd_variable, +integer, +integer)
    fd_domain(?fd_variable, +integer, +integer)
    fd_domain_bool(+fd_variable_list)
    fd_domain_bool(?fd_variable)
    Description

    fd_domain(Vars, Lower, Upper) constraints each element X of Vars to take a value in Lower..Upper. This predicate is generally used to set the initial domain of variables to an interval. Vars can be also a single FD variable (or a single Prolog variable).

    fd_domain_bool(Vars) is equivalent to fd_domain(Vars, 0, 1) and is used to declare boolean FD variables.

    Errors
    Vars is not a variable but is a partial list    instantiation_error
    Vars is neither a variable nor an FD variable nor an integer nor a list    type_error(list, Vars)
    an element E of the Vars list is neither a variable nor an FD variable nor an integer    type_error(fd_variable, E)
    Lower is a variable    instantiation_error
    Lower is neither a variable nor an integer    type_error(integer, Lower)
    Upper is a variable    instantiation_error
    Upper is neither a variable nor an integer    type_error(integer, Upper)

    Portability

    GNU Prolog predicate.

    8.3.2  fd_domain/2

    Templates
    fd_domain(+fd_variable_list, +integer_list)
    fd_domain(?fd_variable, +integer_list)
    Description

    fd_domain(Vars, Values) constraints each element X of the list Vars to take a value in the list Values. This predicate is generally used to set the initial domain of variables to a set of values. The domain of each variable of Vars uses a sparse representation. Vars can be also a single FD variable (or a single Prolog variable).

    Errors
    Vars is not a variable but is a partial list    instantiation_error
    Vars is neither a variable nor an FD variable nor an integer nor a list    type_error(list, Vars)
    an element E of the Vars list is neither a variable nor an FD variable nor an integer    type_error(fd_variable, E)
    Values is a partial list or a list with an element E which is a variable    instantiation_error
    Values is neither a partial list nor a list    type_error(list, Values)
    an element E of the Values list is neither a variable nor an integer    type_error(integer, E)

    Portability

    GNU Prolog predicate.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/hh-mkind.tex0000644004425400513100000000217310547152502016734 0ustar diazloco% usefilter mode: hevea -text -w 1000 hh-gprolog.hhk \documentclass{article} \def\bs{\char'134} \def\lt{\char'074} \def\gt{\char'076} \def\lb{\char'173} \def\rb{\char'175} \def\us{\char'137} \newcommand{\Tag}[1]{{\lt}#1{\gt}} \renewenvironment{indexenv}{\Tag{ul}\\}{\Tag{/ul}\\} \renewcommand{\indexspace}{\\} \renewcommand{\indexitem}[1]{% \Tag{li}\Tag{object type="text/sitemap"}\\% ~~~~\Tag{param name="Name" value="#1"}\\} \newcommand{\OneEntry}[1]{% ~~~~\Tag{param name="Local" value="#1"}\\} \newcommand{\enditem}{% ~~~~\Tag{/object}\\} \renewcommand{\@locref}[2]{\OneEntry{\csname#1\endcsname\#{}#1}} \newcommand{\see}[2]{% ~~~~\Tag{param name="See Also" value="#1"}\\} \newcommand{\remember}[2]{\def\csname#1\endcsname{#2}} \input{/tmp/gprolog.hrf.hh} \begin{document} \Tag{HTML}\\ \Tag{HEAD}\\ \Tag{!-- Sitemap 1.0 --}\\ \Tag{/HEAD}\\ \Tag{BODY}\\ %\Tag{object type="text/site properties"}\\ %~~~~\Tag{param name="FrameName" value="right"}\\ %~~~~\Tag{param name="Window Styles" value="0x800025"}\\ %\Tag{/object}\\ \input{/tmp/gprolog.hind.hh} %\input{foo.hind.hh} \Tag{/BODY}\\ \Tag{/HTML}\\ \end{document} ./gprolog-1.3.0/doc/html_node/gprolog028.html0000644004425400513100000003130010547441640017302 0ustar diazloco Variable naming/numbering Previous Up Next

    7.5  Variable naming/numbering

    7.5.1  name_singleton_vars/1

    Templates
    name_singleton_vars(?term)
    Description

    name_singleton_vars(Term) binds each singleton variable appearing in Term with a term of the form '$VARNAME'('_'). Such a term can be output by write_term/3 as a variable name (section 7.14.6).

    Errors

    None.

    Portability

    GNU Prolog predicates.

    7.5.2  name_query_vars/2

    Templates
    name_query_vars(+list, ?list)
    Description

    name_query_vars(List, Rest) for each element of List of the form Name = Var where Name is an atom and Var a variable, binds Var with the term '$VARNAME'(Name). Such a term can be output by write_term/3 as a variable name (section 7.14.6). Rest is unified with the list of elements of List that have not given rise to a binding. This predicate is provided as a way to name the variable lists obtained returned by read_term/3 with variable_names(List) or singletons(List) options (section 7.14.1).

    Errors
    List is a partial list    instantiation_error
    List is neither a partial list nor a list    type_error(list, List)
    Rest is neither a partial list nor a list    type_error(list, Rest)

    Portability

    GNU Prolog predicate.

    7.5.3  bind_variables/2, numbervars/3, numbervars/1

    Templates
    bind_variables(?term, +var_binding_option_list)
    numbervars(?term, +integer, ?integer)
    numbervars(?term)
    Description

    bind_variables(Term, Options) binds each variable appearing in Term according to the options given by Options.

    Variable binding options: Options is a list of variable binding options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are:
    • numbervars: specifies that each variable appearing in Term should be bound to a term of the form '$VAR'(N) where N is an integer. Such a term can be output by write_term/3 as a variable name (section 7.14.6). This is the default.

    • namevars: specifies that each variables appearing in Term shall be bound to a term of the form '$VARNAME'(Name) where Name is the atom that would be output by write_term/3 seeing a term of the '$VAR'(N) where N is an integer. Such a term can be output by write_term/3 as a variable name (section 7.14.6). This is the alternative to numbervars.

    • from(From): the first integer N to use for number/name variables of Term is From. The default value is 0.

    • next(Next): when bind_variables/2 succeeds, Next is unified with the (last integer N)+1 used to bind the variables of Term.

    • exclude(List): collects all variable names appearing in List to avoid a clash when binding a variable of Term. Precisely a number NFrom will not be used to bind a variable of Term if:
      • there is a sub-term of List of the form '$VAR'(N) or '$VARNAME'(Name) where Name is the constant that would be output by write_term/3 seeing a term of the '$VAR'(N).

      • an element of List is of the form Name = Var where Name is an atom that would be output by write_term/3 on seeing a term of the from '$VAR'(N). This case allows for lists returned by read_term/3 (with variable_names(List) or singletons(List) options) (section 7.14.1) and by name_query_vars/2 (section 7.5.2).
    numbervars(Term, From, Next) is equivalent to bind_variables(Term, [from(From), next(Next)], i.e. each variable of Term is bound to '$VAR'(N) where From ≤ N < Next.

    numbervars(Term) is equivalent to numbervars(Term, 0, _).

    Errors
    Options is a partial list or a list with an element E which is a variable    instantiation_error
    Options is neither a partial list nor a list    type_error(list, Options)
    an element E of the Options list is neither a variable nor a variable binding option    domain_error(var_binding_option, E)
    From is a variable    instantiation_error
    From is neither a variable nor an integer    type_error(integer, From)
    Next is neither a variable nor an integer    type_error(integer, Next)
    List is a partial list    instantiation_error
    List is neither a partial list nor a list    type_error(list, List)

    Portability

    GNU Prolog predicates.

    7.5.4  term_ref/2

    Templates
    term_ref(+term, ?integer)
    term_ref(?term, +integer)
    Description

    term_ref(Term, Ref) succeeds if the internal reference of Term is Ref. This predicate can be used either to obtain the internal reference of a term or to obtain the term associated with a given reference. Note that two identical terms can have different internal references. A good way to use this predicate is to first record the internal reference of a given term and to later re-obtain the term via this reference.

    Errors
    Term and Ref are both variables    instantiation_error
    Ref is neither a variable nor an integer    type_error(integer, Ref)
    Ref is an integer < 0    domain_error(not_less_than_zero, Ref)

    Portability

    GNU Prolog predicate.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/previous_motif.gif0000644004425400513100000000047510547441640020263 0ustar diazlocoGIF89añp€ÿÿp€!þ# Imported from XPM image: prev.xpm!ù,@çÜ63333Æ# „B Ã0 AÀ0 Ã0 Ã0 À0 ƒÁ`0 ƒÁ`0 ƒA  ƒ €Á`0 ƒ`00000000000000000000000000000000000000000000  000 0000000000000000000000000000000`À€ ;./gprolog-1.3.0/doc/html_node/hh-gprolog.hhp0000755004425400513100000000071610547155132017270 0ustar diazloco[OPTIONS] Compatibility=1.1 or later Compiled file=gprolog.chm Contents file=hh-gprolog.hhc Default Window=mainwindow Default topic=index.html Display compile progress=No Enhanced decompilation=Yes Full-text search=Yes Index file=hh-gprolog.hhk Language=0x409 Anglais (États-Unis) Title=GNU Prolog Manual [WINDOWS] mainwindow=,"hh-gprolog.hhc","hh-gprolog.hhk","index.html",,,,,,0x22520,,0x387e,,,,,,,,0 [FILES] index.html [INFOTYPES] ./gprolog-1.3.0/doc/html_node/gprolog002.html0000644004425400513100000001014210547441640017273 0ustar diazloco Acknowledgements Previous Up Next

    1  Acknowledgements

    I would like to thank the department of computing science at the university of Paris 1 for allowing me the time and freedom necessary to achieve this project.

    I am grateful to the members of the Loco project at INRIA Rocquencourt for their encouragement. Their involvement in this work led to useful feedback and exchange.

    I would particularly like to thank Jonathan Hodgson for the time and effort he put into the proofreading of this manual. His suggestions, both regarding ISO technical aspects as well as the language in which it was expressed, proved invaluable.

    The on-line HTML version of this document was created using HEVEA developed by Luc Maranget who kindly devoted so much of his time extending the capabilities of HEVEA in order to handle such a sizeable manual.

    Jean-Christophe Aude kindly improved the visual aspect of both the illustrations and the GNU Prolog web pages.

    Thanks to Richard A. O'Keefe for his advice regarding the implementation of some Prolog built-in predicates and for suggesting me the in-place installation feature.

    Many thanks to the following contributors: Many thanks to all those people at GNU who helped me to finalize the GNU Prolog project.

    Finally, I would like to thank everybody who tested preliminary releases and helped me to put the finishing touches to this system.
    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog018.html0000644004425400513100000002256610547441640017317 0ustar diazloco Types and modes Previous Up Next

    5.2  Types and modes

    The templates part defines, for each argument of the concerned built-in predicate, its mode and type. The mode specifies whether or not the argument must be instantiated when the built-in predicate is called. The mode is encoded with a symbol just before the type. Possible modes are:
    • +: the argument must be instantiated.

    • -: the argument must be a variable (will be instantiated if the built-in predicate succeeds).

    • ?: the argument can be instantiated or a variable.
    The type of an argument is defined by the following table:
    Type Description
    TYPE_list a list whose the type of each element is TYPE
    TYPE1_or_TYPE2 a term whose type is either TYPE1 or TYPE2
    atom an atom
    atom_property an atom property (section 7.19.12)
    boolean the atom true or false
    byte an integer ≥ 0 and ≤ 255
    callable_term an atom or a compound term
    character a single character atom
    character_code an integer ≥ 1 and ≤ 255
    clause a clause (fact or rule)
    close_option a close option (section 7.10.7)
    compound_term a compound term
    evaluable an arithmetic expression (section 7.6.1)
    fd_bool_evaluable a boolean FD expression (section 8.7.1)
    fd_labeling_option an FD labeling option (section 8.9.1)
    fd_evaluable an arithmetic FD expression (section 8.6.1)
    fd_variable an FD variable
    flag a Prolog flag (section 7.22.1)
    float a floating point number
    head a head of a clause (atom or compound term)
    integer an integer
    in_byte an integer ≥ 0 and ≤ 255 or -1 (for the end-of-file)
    in_character a single character atom or the atom end_of_file (for the end-of-file)
    in_character_code an integer ≥ 1 and ≤ 255 or -1 (for the end-of-file)
    io_mode an atom in: read, write or append
    list the empty list [] or a non-empty list [_|_]
    nonvar any term that is not a variable
    number an integer or a floating point number
    operator_specifier an operator specifier (section 7.14.10)
    os_file_property an operating system file property (section 7.27.11)
    predicate_indicator a term Name/Arity where Name is an atom and Arity an integer ≥ 0. A callable term can be given if the strict_iso Prolog flag is switched off (section 7.22.1)
    predicate_property a predicate property (section 7.8.2)
    read_option a read option (section 7.14.1)
    socket_address a term of the form 'AF_UNIX'(A) or 'AF_INET'(A,N) where A is an atom and N an integer
    socket_domain an atom in: 'AF_UNIX' or 'AF_INET'
    source_sink an atom identifying a source or a sink
    stream a stream-term: a term of the form '$stream'(N) where N is an integer ≥ 0
    stream_option a stream option (section 7.10.6)
    stream_or_alias a stream-term or an alias (atom)
    stream_position a stream position: a term '$stream_position'(I1, I2, I3, I4) where I1, I2, I3 and I4 are integers
    stream_property a stream property (section 7.10.10)
    stream_seek_method an atom in: bof, current or eof
    term any term
    var_binding_option a variable binding option (section 7.5.3)
    write_option a write option (section 7.14.6)


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog059.html0000644004425400513100000001422110547441640017311 0ustar diazloco FD variable information Previous Up Next

    8.5  FD variable information

    These predicate allow the user to get some information about FD variables. They are not constraints, they only return the current state of a variable.

    8.5.1  fd_min/2, fd_max/2, fd_size/2, fd_dom/2

    Templates
    fd_min(+fd_variable, ?integer)
    fd_max(+fd_variable, ?integer)
    fd_size(+fd_variable, ?integer)
    fd_dom(+fd_variable, ?integer_list)
    Description

    fd_min(X, N) succeeds if N is the minimal value of the current domain of X.

    fd_max(X, N) succeeds if N is the maximal value of the current domain of X.

    fd_size(X, N) succeeds if N is the number of elements of the current domain of X.

    fd_dom(X, Values) succeeds if Values is the list of values of the current domain of X.

    Errors
    X is a variable    instantiation_error
    X is neither an FD variable nor an integer    type_error(fd_variable, X)
    N is neither a variable nor an integer    type_error(integer, N)
    an element E of the Vars list is neither a variable nor an FD variable nor an integer    type_error(fd_variable, E)
    Values is neither a partial list nor a list    type_error(list, Values)

    Portability

    GNU Prolog predicate.

    8.5.2  fd_has_extra_cstr/1, fd_has_vector/1, fd_use_vector/1

    Templates
    fd_has_extra_cstr(+fd_variable)
    fd_has_vector(+fd_variable)
    fd_use_vector(+fd_variable)
    Description

    fd_has_extra_cstr(X) succeeds if the extra_cstr of X is currently on (section 8.1).

    fd_has_vector(X) succeeds if the current domain of X uses a sparse representation (section 8.1).

    fd_use_vector(X) enforces a sparse representation for the domain of X (section 8.1).

    Errors
    X is a variable    instantiation_error
    X is neither an FD variable nor an integer    type_error(fd_variable, X)

    Portability

    GNU Prolog predicates.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog023.html0000644004425400513100000005124110547441640017303 0ustar diazloco Prolog built-in predicates Previous Up Next

    7  Prolog built-in predicates


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/index.html0000644004425400513100000000607610547441640016522 0ustar diazloco GNU-Prolog Manual

    GNU PROLOG


    A Native Prolog Compiler with Constraint Solving over Finite Domains

    Edition 1.8, for GNU Prolog version 1.3.0
    5th January, 2007
    by Daniel Diaz






    Copyright (C) 1999-2007 Daniel Diaz

    Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

    Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

    Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Free Software Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.





    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    This document was translated from LATEX by HEVEA.
    ./gprolog-1.3.0/doc/html_node/gprolog030.html0000644004425400513100000004203310547441640017300 0ustar diazloco Dynamic clause management Previous Up Next

    7.7  Dynamic clause management

    7.7.1  Introduction

    Static and dynamic procedures: a procedure is either dynamic or static. All built-in predicates are static. A user-defined procedure is static by default unless a dynamic/1 directive precedes its definition (section 6.1.2). Adding a clause to a non-existent procedure creates a dynamic procedure. The clauses of a dynamic procedure can be altered (e.g. using asserta/1), the clauses of a static procedure cannot be altered.

    Private and public procedures: each procedure is either public or private. A dynamic procedure is always public. Each built-in predicate is private, and a static user-defined procedure is private by default unless a public/1 directive precedes its definition (section 6.1.3). If a dynamic declaration exists it is unnecessary to add a public declaration since a dynamic procedure is also public. A clause of a public procedure can be inspected (e.g. using clause/2), a clause of a private procedure cannot be inspected.

    A logical database update view: any change in the database that occurs as the result of executing a goal (e.g. when a sub-goal is a call of assertz/1 or retract/1) only affects subsequent activations. The change does not affect any activation that is currently being executed. Thus the database is frozen during the execution of a goal, and the list of clauses defining a predication is fixed at the moment of its execution.

    7.7.2  asserta/1, assertz/1

    Templates
    asserta(+clause)
    assertz(+clause)
    Description

    asserta(Clause) first converts the term Clause to a clause and then adds it to the current internal database. The predicate concerned must be dynamic (section 7.7.1) or undefined and the clause is inserted before the first clause of the predicate. If the predicated is undefined it is created as a dynamic procedure.

    assertz(Clause) acts like asserta/1 except that the clause is added at the end of all existing clauses of the concerned predicate.

    Converting a term Clause to a clause Clause1:
    • extract the head and the body of Clause: either Clause = (Head :- Body) or Clause = Head and Body = true.

    • Head must be a callable term (or else the conversion fails).

    • convert Body to a body clause (i.e. a goal) Body1.

    • the converted clause Clause1 = (Head :- Body1).
    Converting a term T to a goal:
    • if T is a variable it is replaced by the term call(T).

    • if T is a control construct (',')/2, (;)/2 or (->)/2 each argument of the control construct is recursively converted to a goal.

    • if T is a callable term it remains unchanged.

    • otherwise the conversion fails (T is neither a variable nor a callable term).
    Errors
    Head is a variable    instantiation_error
    Head is neither a variable nor a callable term    type_error(callable, Head)
    Body cannot be converted to a goal    type_error(callable, Body)
    The predicate indicator Pred of Head is that of a static procedure    permission_error(modify, static_procedure, Pred)

    Portability

    ISO predicates.

    7.7.3  retract/1

    Templates
    retract(+clause)
    Description

    retract(Clause) erases the first clause of the database that unifies with Clause. The concerned predicate must be a dynamic procedure (section 7.7.1). Removing all clauses of a procedure does not erase the procedure definition. To achieve this use abolish/1 (section 7.7.6). retract/1 is re-executable on backtracking.

    Errors
    Head is a variable    instantiation_error
    Head is neither a variable nor a callable term    type_error(callable, Head)
    The predicate indicator Pred of Head is that of a static procedure    permission_error(modify, static_procedure, Pred)

    Portability

    ISO predicate. In the ISO reference, the operation associated with the permission_error is access while it is modify in GNU Prolog. This seems to be an error of the ISO reference since for asserta/1 (which is similar in spirit to retract/1) the operation is also modify.

    7.7.4  retractall/1

    Templates
    retractall(+head)
    Description

    retractall(Head) erases all clauses whose head unifies with Head. The concerned predicate must be a dynamic procedure (section 7.7.1). The procedure definition is not removed so that it is found by current_predicate/1 (section 7.8.1). abolish/1 should be used to remove the procedure (section 7.7.6).

    Errors
    Head is a variable    instantiation_error
    Head is not a callable term    type_error(callable, Head)
    The predicate indicator Pred of Head is that of a static procedure    permission_error(modify, static_procedure, Pred)

    Portability

    GNU Prolog predicate.

    7.7.5  clause/2

    Templates
    clause(+head, ?callable_term)
    Description

    clause(Head, Body) succeeds if there exists a clause in the database that unifies with Head :- Body. The predicate in question must be a public procedure (section 7.7.1). Clauses are delivered from the first to the last. This predicate is re-executable on backtracking.

    Errors
    Head is a variable    instantiation_error
    Head is neither a variable nor a callable term    type_error(callable, Head)
    The predicate indicator Pred of Head is that of a private procedure    permission_error(access, private_procedure, Pred)
    Body is neither a variable nor a callable term    type_error(callable, Body)

    Portability

    ISO predicate.

    7.7.6  abolish/1

    Templates
    abolish(+predicate_indicator)
    Description

    abolish(Pred) removes from the database the procedure whose predicate indicator is Pred. The concerned predicate must be a dynamic procedure (section 7.7.1).

    Errors
    Pred is a variable    instantiation_error
    Pred is a term Name/Arity and either Name or Arity is a variable    instantiation_error
    Pred is neither a variable nor a predicate indicator    type_error(predicate_indicator, Pred)
    Pred is a term Name/Arity and Arity is neither a variable nor an integer    type_error(integer, Arity)
    Pred is a term Name/Arity and Name is neither a variable nor an atom    type_error(atom, Name)
    Pred is a term Name/Arity and Arity is an integer < 0    domain_error(not_less_than_zero, Arity)
    Pred is a term Name/Arity and Arity is an integer > max_arity flag (section 7.22.1)    representation_error(max_arity)
    The predicate indicator Pred is that of a static procedure    permission_error(modify, static_procedure, Pred)

    Portability

    ISO predicate.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog033.html0000644004425400513100000025053710547441640017315 0ustar diazloco Streams Previous Up Next

    7.10  Streams

    7.10.1  Introduction

    A stream provides a logical view of a source/sink.

    Sources and sinks: a program can output results to a sink or input data from a source. A source/sink may be a file (regular file, terminal, device,...), a constant term, a pipe, a socket,...

    Associating a stream to a source/sink: to manipulate a source/sink it must be associated with a stream. This provides a logical and uniform view of the source/sink whatever its type. Once this association has been established, i.e. a stream has been created, all subsequent references to the source/sink are made by referring the stream. A stream is unidirectional: it is either an input stream or an output stream. For a classical file, the association is done by opening the file (whose name is specified as an atom) with the open/4 (section 7.10.6). GNU Prolog makes it possible to treat a Prolog constant term as a source/sink and provides built-in predicates to associate a stream to such a term (section 7.11). GNU Prolog provides operating system interface predicates defining pipes between GNU Prolog and child processes with streams associated with these pipes, e.g. popen/3 (section 7.27.21). Similarly, socket interface predicates associate streams to a socket to allow the communication, e.g. socket_connect/4 (section 7.28.5).

    Stream-term: a stream-term identifies a stream during a call of an input/output built-in predicate. It is created as a result of associating a stream to a source/sink (section above). A stream-term is a compound term of the form '$stream'(I) where I is an integer.

    Stream aliases: any stream may be associated with a stream alias which is an atom which may be used to refer to that stream. The association can be done at open time or using add_stream_alias/2 (section 7.10.20). Such an association automatically ends when the stream is closed. A particular alias only refers to at most one stream at any one time. However, more than one alias can be associated with a stream. Most built-in predicates which have a stream-term as an input argument also accept a stream alias as that argument. However, built-in predicates which return a stream-term do not accept a stream alias.

    Standard streams: two streams are predefined and open during the execution of every goal: the standard input stream which has the alias user_input and the standard output stream which has the alias user_output. A goal which attempts to close either standard stream succeeds, but does not close the stream.

    Current streams: during execution there is a current input stream and a current output stream. By default, the current input and output streams are the standard input and output streams, but the built-in predicates set_input/1 (section 7.10.4) and set_output/1 (section 7.10.5) can be used to change them. When the current input stream is closed, the standard input stream becomes the current input stream. When the current output stream is closed, the standard output stream becomes the current output stream.

    Text streams and binary streams: a text stream is a sequence of characters. A text stream is also regarded as a sequence of lines where each line is a possibly empty sequence of characters followed by a new line character. GNU Prolog may add or remove space characters at the ends of lines in order to conform to the conventions for representing text streams in the operating system. A binary stream is a sequence of bytes. Only a few built-in predicates can deal with binary streams, e.g. get_byte/2 (section 7.13).

    Stream positions: the stream position of a stream identifies an absolute position of the source/sink to which the stream is connected and defines where in the source/sink the next input or output will take place. A stream position is a ground term of the form '$stream_position'(I1, I2, I3, I4) where I1, I2, I3 and I4 are integers. Stream positions are used to reposition a stream (when possible) using for instance set_stream_position/2 (section 7.10.13).

    The position end of stream: when all data of a stream S has been input S has a stream position end-of-stream. At this stream position a goal to input more data will return a specific value to indicate that end of stream has been reached (e.g. -1 for get_code/2 or end_of_file for get_char/2,...). When this terminating value has been input, the stream has a stream position past-end-of-stream.

    Buffering mode: input/output on a stream can be buffered (line-buffered or block-buffered) or not buffered at all. The buffering mode can be specified at open time or using set_stream_buffering/2 (section 7.10.27). Line buffering is used on output streams, output data are only written to the sink when a new-line character is output (or at the close time). Block buffering is used on input or output. On input streams, when an input is requested on the source, if the buffer is empty, all available characters are read (within the limits of the size of the buffer), subsequent reads will first use the characters in the buffer. On output streams, output data are stored in the buffer and only when the buffer is full is it physically written on the sink. Thus, an output to a buffered stream may not be sent immediately to the sink connected to that stream. When it is necessary to be certain that output has been delivered, the built-in predicate flush_output/1 (section 7.10.8) should be used. Finally, it is also possible to use non-buffered streams, in that case input/output are directly done on the connected source/sink. This can be useful for communication purposes (e.g. sockets) or when a precise control is needed, e.g. select/5 (section 7.27.25).

    Stream mirrors: any stream may be associated with mirror streams specified at open time or using add_stream_mirror/2 (section 7.10.22). Then, all characters/bytes read from/written to the stream are also written on each mirror stream. The association automatically ends when either the stream or the mirror stream is closed. It is also possible to explicitely remove a mirror stream using remove_stream_mirror/2 (section 7.10.23).

    7.10.2  current_input/1

    Templates
    current_input(?stream)
    Description

    current_input(Stream) unifies Stream with the stream-term identifying the current input stream.

    Errors
    Stream is neither a variable nor a stream    domain_error(stream, Stream)

    Portability

    ISO predicate.

    7.10.3  current_output/1

    Templates
    current_output(?stream)
    Description

    current_output(Stream) unifies Stream with the stream-term identifying the current output stream.

    Errors
    Stream is neither a variable nor a stream    domain_error(stream, Stream)

    Portability

    ISO predicate.

    7.10.4  set_input/1

    Templates
    set_input(+stream_or_alias)
    Description

    set_input(SorA) sets the current input stream to be the stream associated with the stream-term or alias SorA.

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)

    Portability

    ISO predicate.

    7.10.5  set_output/1

    Templates
    set_output(+stream_or_alias)
    Description

    set_output(SorA) sets the current output stream to be the stream associated with the stream-term or alias SorA.

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an input stream    permission_error(output, stream, SorA)

    Portability

    ISO predicate.

    7.10.6  open/4, open/3

    Templates
    open(+source_sink, +io_mode, -stream, +stream_option_list)
    open(+source_sink, +io_mode, -stream)
    Description

    open(SourceSink, Mode, Stream, Options) opens the source/sink SourceSink for input or output as indicated by Mode and the list of stream-options Options and unifies Stream with the stream-term which is associated with this stream. See absolute_file_name/2 for information about the syntax of SourceSink (section 7.26.1).

    Input/output modes: Mode is an atom which defines the input/output operations that may be performed the stream. Possible modes are:
    • read: the source/sink is a source and must already exist. Input starts at the beginning of the source.

    • write: the source/sink is a sink. If the sink already exists then it is emptied else an empty sink is created. Output starts at the beginning of that sink.

    • append: the source/sink is a sink. If the sink does not exist it is created. Output starts at the end of that sink.
    Stream options: Options is a list of stream options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are:
    • type(text/binary): specifies whether the stream is a text stream or a binary stream. The default value is text.

    • reposition(true/false): specifies whether it is possible to reposition the stream. The default value is true except if the stream cannot be repositioned (e.g. a terminal).

    • eof_action(error/eof_code/reset): specifies the effect of attempting to input from a stream whose stream position is past-end-of-stream:
      • error: a permission_error is raised signifying that no more input exists in this stream.

      • eof_code: the result of input is as if the stream position is end-of-stream.

      • reset: the stream position is reset so that it is not past-end-of-stream, and another attempt is made to input from it (this is useful when inputting from a terminal).

      The default value is eof_code.

    • alias(Alias): specifies that the atom Alias is to be an alias for the stream. By default no alias is attached to the stream. Several aliases can be defined for a same stream.

    • mirror(Mirror): specifies the stream associated with the stream-term or alias Mirror is a mirror for the stream. By default no mirro is attached to the stream. Several mirrors can be defined for a same stream.

    • buffering(none/line/block): specifies which type of buffering is used by input/output operations on this stream:
      • none: no buffering.

      • line: output operations buffer data emitted until a new-line occurs

      • block: input/output operations buffer data until a given number (implementation dependant) of characters/bytes have been treated.

      The default value is line for a terminal (TTY), block otherwise.
    open(SourceSink, Mode, Stream, Options) is equivalent to open(SourceSink, Mode, Stream, []).

    Errors
    SourceSink is a variable    instantiation_error
    Mode is a variable    instantiation_error
    Options is a partial list or a list with an element E which is a variable    instantiation_error
    Mode is neither a variable nor an atom    type_error(atom, Mode)
    Options is neither a partial list nor a list    type_error(list, Options)
    Stream is not a variable    type_error(variable, Stream)
    SourceSink is neither a variable nor a source/sink    domain_error(source_sink, SourceSink)
    Mode is an atom but not an input/output mode    domain_error(io_mode, Mode)
    an element E of the Options list is neither a variable nor a stream-option    domain_error(stream_option, E)
    the source/sink specified by SourceSink does not exist    existence_error(source_sink, SourceSink)
    the source/sink specified by SourceSink cannot be opened    permission_error(open, source_sink, SourceSink)
    an element E of the Options list is alias(A) and A is already associated with an open stream    permission_error(open, source_sink, alias(A))
    an element E of the Options list is mirror(M) and M is not associated with an open stream    existence_error(stream, M)
    an element E of the Options list is mirror(M) and M iis an input stream    permission_error(output, stream, M)
    an element E of the Options list is reposition(true) and it is not possible to reposition this stream    permission_error(open, source_sink, reposition(true))

    Portability

    ISO predicates. The mirror/1 and buffering/1 stream options are GNU Prolog extensions.

    7.10.7  close/2, close/1

    Templates
    close(+stream_or_alias, +close_option_list)
    close(+stream_or_alias)
    Description

    close(SorA, Options) closes the stream associated with the stream-term or alias SorA. If SorA is the standard input stream or the standard output stream close/2 simply succeeds else the associated source/sink is physically closed. If SorA is the current input stream the current input stream becomes the standard input stream user_input. If SorA is the current output stream the current output stream becomes the standard output stream user_output.

    Close options: Options is a list of close options. For the moment only one option is available:
    • force(true/false): with false, if an error occurs when trying to close the source/sink, the stream is not closed and an error (system_error or resource_error) is raised (but close/2 succeeds). With true, if an error occurs it is ignored and the stream is closed. The purpose of force/1 option is to allow an error handling routine to do its best to reclaim resources. The default value is false.
    close(SorA) is equivalent to close(SorA, []).

    Errors
    SorA is a variable    instantiation_error
    Options is a partial list or a list with an element E which is a variable    instantiation_error
    Options is neither a partial list nor a list    type_error(list, Options)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    an element E of the Options list is neither a variable nor a close-option    domain_error(close_option, E)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA needs a special close (section 7.11)    system_error(needs_special_close)

    Portability

    ISO predicates. The system_error(needs_special_close) is a GNU Prolog extension.

    7.10.8  flush_output/1, flush_output/0

    Templates
    flush_output(+stream_or_alias)
    flush_output
    Description

    flush_output(SorA) sends any buffered output characters/bytes to the stream.

    flush_output/0 applies to the current output stream.

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an input stream    permission_error(output, stream, SorA)

    Portability

    ISO predicates.

    7.10.9  current_stream/1

    Templates
    current_stream(?stream)
    Description

    current_stream(Stream) succeeds if there exists a stream-term that unifies with Stream. This predicate is re-executable on backtracking.

    Errors
    Stream is neither a variable nor a stream-term    domain_error(stream, Stream)

    Portability

    GNU Prolog predicate.

    7.10.10  stream_property/2

    Templates
    stream_property(?stream, ?stream_property)
    Description

    stream_property(Stream, Property) succeeds if current_stream(Stream) succeeds (section 7.10.9) and if Property unifies with one of the properties of the stream. This predicate is re-executable on backtracking.

    Stream properties:
    • file_name(F): the name of the connected source/sink.

    • mode(M): M is the open mode (read, write, append).

    • input: if it is an input stream.

    • output: if it is an output stream.

    • alias(A): A is an alias of the stream.

    • mirror(M): M is a mirror stream of the stream.

    • type(T): T is the type of the stream (text, binary).

    • reposition(R): R is the reposition boolean (true, false).

    • eof_action(A): A is the end-of-file action (error, eof_code, reset).

    • buffering(B): B is the buffering mode (none, line, block).

    • end_of_stream(E): E is the current end-of-stream status (not, at, past). If the stream position is end-of-stream then E is unified with at else if the stream position is past-end-of-stream then E is unified with past else E is unified with not.

    • position(P): P is the stream-position term associated with the current position.
    Errors
    Stream is a variable    instantiation_error
    Stream is neither a variable nor a stream-term    domain_error(stream, Stream)
    Property is neither a variable nor a stream property    domain_error(stream_property, Property)
    Property = file_name(E), mode(E), alias(E), end_of_stream(E), eof_action(E), reposition(E), type(E) or buffering(E) and E is neither a variable nor an atom    type_error(atom, E)

    Portability

    ISO predicate. The buffering/1 property is a GNU Prolog extension.

    7.10.11  at_end_of_stream/1, at_end_of_stream/0

    Templates
    at_end_of_stream(+stream_or_alias)
    at_end_of_stream
    Description

    at_end_of_stream(SorA) succeeds if the stream associated with stream-term or alias SorA has a stream position end-of-stream or past-end-of-stream. This predicate can be defined using stream_property/2 (section 7.10.10).

    at_end_of_stream/0 applies to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)

    Portability

    ISO predicates. The permission_error(input, stream, SorA) is a GNU Prolog extension.

    7.10.12  stream_position/2

    Templates
    stream_position(+stream_or_alias, ?stream_position)
    Description

    stream_position(SorA, Position) succeeds unifying Position with the stream-position term associated with the current position of the stream-term or alias SorA. This predicate can be defined using stream_property/2 (section 7.10.10).

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    Position is neither a variable nor a stream-position term    domain_error(stream_position, Position)
    SorA is not associated with an open stream    existence_error(stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.13  set_stream_position/2

    Templates
    set_stream_position(+stream_or_alias, +stream_position)
    Description

    set_stream_position(SorA, Position) sets the position of the stream associated with the stream-term or alias SorA to Position. Position should have previously been returned by stream_property/2 (section 7.10.10) or by stream_position/2 (section 7.10.12).

    Errors
    SorA is a variable    instantiation_error
    Position is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    Position is neither a variable nor a stream-position term    domain_error(stream_position, Position)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA has stream property reposition(false)    permission_error(reposition, stream, SorA)

    Portability

    ISO predicate.

    7.10.14  seek/4

    Templates
    seek(+stream_or_alias, +stream_seek_method, +integer, ?integer)
    Description

    seek(SorA, Whence, Offset, NewOffset) sets the position of the stream associated with the stream-term or alias SorA to Offset according to Whence and unifies NewOffset with the new offset from the beginning of the file. seek/4 can only be used on binary streams. Whence is an atom from:
    • bof: the position is set relatively to the begin of the file (Offset should be ≥ 0).

    • current: the position is set relatively to the current position (Offset can be ≥ 0 or ≤ 0).

    • eof: the position is set relatively to the end of the file (Offset should be ≤ 0).
    This predicate is an interface to the C Unix function lseek(2).

    Errors
    SorA is a variable    instantiation_error
    Whence is a variable    instantiation_error
    Offset is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    Whence is neither a variable nor an atom    type_error(atom, Whence)
    Whence is an atom but not a valid stream seek method    domain_error(stream_seek_method, Whence)
    Offset is neither a variable nor an integer    type_error(integer, Offset)
    NewOffset is neither a variable nor an integer    type_error(integer, NewOffset)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA has stream property reposition(false)    permission_error(reposition, stream, SorA)
    SorA is associated with a text stream    permission_error(reposition, text_stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.15  character_count/2

    Templates
    character_count(+stream_or_alias, ?integer)
    Description

    character_count(SorA, Count) unifies Count with the number of characters/bytes read/written on the stream associated with stream-term or alias SorA.

    Errors
    SorA is a variable    instantiation_error
    Count is neither a variable nor an integer    type_error(integer, Count)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.16  line_count/2

    Templates
    line_count(+stream_or_alias, ?integer)
    Description

    line_count(SorA, Count) unifies Count with the number of lines read/written on the stream associated with the stream-term or alias SorA. This predicate can only be used on text streams.

    Errors
    SorA is a variable    instantiation_error
    Count is neither a variable nor an integer    type_error(integer, Count)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is associated with a binary stream    permission_error(access, binary_stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.17  line_position/2

    Templates
    line_position(+stream_or_alias, ?integer)
    Description

    line_position(SorA, Count) unifies Count with the number of characters read/written on the current line of the stream associated with the stream-term or alias SorA. This predicate can only be used on text streams.

    Errors
    SorA is a variable    instantiation_error
    Count is neither a variable nor an integer    type_error(integer, Count)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is associated with a binary stream    permission_error(access, binary_stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.18  stream_line_column/3

    Templates
    stream_line_column(+stream_or_alias, ?integer, ?integer)
    Description

    stream_line_column(SorA, Line, Column) unifies Line (resp. Column) with the current line number (resp. column number) of the stream associated with the stream-term or alias SorA. This predicate can only be used on text streams. Note that Line corresponds to the value returned by line_count/2 + 1 (section 7.10.16) and Column to the value returned by line_position/2 + 1 (section 7.10.17).

    Errors
    SorA is a variable    instantiation_error
    Line is neither a variable nor an integer    type_error(integer, Line)
    Column is neither a variable nor an integer    type_error(integer, Column)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is associated with a binary stream    permission_error(access, binary_stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.19  set_stream_line_column/3

    Templates
    set_stream_line_column(+stream_or_alias, +integer, +integer)
    Description

    set_stream_line_column(SorA, Line, Column) sets the stream position of the stream associated with the stream-term or alias SorA according to the line number Line and the column number Column. This predicate can only be used on text streams. It first repositions the stream to the beginning of the file and then reads character by character until the required position is reached.

    Errors
    SorA is a variable    instantiation_error
    Line is a variable    instantiation_error
    Column is a variable    instantiation_error
    Line is neither a variable nor an integer    type_error(integer, Line)
    Column is neither a variable nor an integer    type_error(integer, Column)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is associated with a binary stream    permission_error(reposition, binary_stream, SorA)
    SorA has stream property reposition(false)    permission_error(reposition, stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.20  add_stream_alias/2

    Templates
    add_stream_alias(+stream_or_alias, +atom)
    Description

    add_stream_alias(SorA, Alias) adds Alias as a new alias to the stream associated with the stream-term or alias SorA.

    Errors
    SorA is a variable    instantiation_error
    Alias is a variable    instantiation_error
    Alias is neither a variable nor an atom    type_error(atom, Alias)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    Alias is already associated with an open stream    permission_error(add_alias, source_sink, alias(Alias))

    Portability

    GNU Prolog predicate.

    7.10.21  current_alias/2

    Templates
    current_alias(?stream, ?atom)
    Description

    current_alias(Stream, Alias) succeeds if current_stream(Stream) succeeds (section 7.10.9) and if Alias unifies with one of the aliases of the stream. It can be defined using stream_property/2 (section 7.10.10). This predicate is re-executable on backtracking.

    Errors
    Stream is neither a variable nor a stream-term    domain_error(stream, Stream)
    Alias is neither a variable nor an atom    type_error(atom, Alias)

    Portability

    GNU Prolog predicate.

    7.10.22  add_stream_mirror/2

    Templates
    add_stream_mirror(+stream_or_alias, +stream_or_alias)
    Description

    add_stream_mirror(SorA, Mirror) adds the stream associated with the stream-term or alias Mirror as a new mirror to the stream associated with the stream-term or alias SorA. After this, all characters (or bytes) read from (or written to) SorA are also written to Mirror. This mirroring occurs until Mirror is explicitely removed using remove_stream_mirror/2 (section 7.10.23) or implicitely when Mirror is closed. Several mirror streams can be associated with a same stream. If Mirror represents the same stream as SorA or if Mirror is already a mirror for SorA, no mirror is added.

    Errors
    SorA is a variable    instantiation_error
    Mirror is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    Mirror is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, Mirror)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    Mirror is not associated with an open stream    existence_error(stream, Mirror)
    Mirror is an input stream    permission_error(output, stream, Mirror)

    Portability

    GNU Prolog predicate.

    7.10.23  remove_stream_mirror/2

    Templates
    remove_stream_mirror(+stream_or_alias, +stream_or_alias)
    Description

    remove_stream_mirror(SorA, Mirror) removes the stream associated with the stream-term or alias Mirror from the list of mirrors of the stream associated with the stream-term or alias SorA. This predicate fails if Mirror is not a mirror stream for SorA.

    Errors
    SorA is a variable    instantiation_error
    Mirror is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    Mirror is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, Mirror)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    Mirror is not associated with an open stream    existence_error(stream, Mirror)

    Portability

    GNU Prolog predicate.

    7.10.24  current_mirror/2

    Templates
    current_mirror(?stream, ?stream)
    Description

    current_mirror(Stream, M) succeeds if current_stream(Stream) succeeds (section 7.10.9) and if M unifies with one of the mirrors of the stream. It can be defined using stream_property/2 (section 7.10.10). This predicate is re-executable on backtracking.

    Errors
    Stream is neither a variable nor a stream-term    domain_error(stream, Stream)
    M is neither a variable nor a stream-term    domain_error(stream, M)

    Portability

    GNU Prolog predicate.

    7.10.25  set_stream_type/2

    Templates
    set_stream_type(+stream_or_alias, +atom)
    Description

    set_stream_type(SorA, Type) updates the type associated with stream-term or alias SorA. The value of Type is an atom in text or binary as for open/4 (section 7.10.6). The type of a stream can only be changed before any input/output operation is executed.

    Errors
    SorA is a variable    instantiation_error
    Type is a variable    instantiation_error
    Type is neither a variable nor a valid type    domain_error(stream_type, Type)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    An I/O operation has already been executed on SorA    permission_error(modify, stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.26  set_stream_eof_action/2

    Templates
    set_stream_eof_action(+stream_or_alias, +atom)
    Description

    set_stream_eof_action(SorA, Action) updates the eof_action option associated with the stream-term or alias SorA. The value of Action is one of the atoms error, eof_code, reset as for open/4 (section 7.10.6).

    Errors
    SorA is a variable    instantiation_error
    Action is a variable    instantiation_error
    Action is neither a variable nor a valid eof action    domain_error(eof_action, Action)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(modify, stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.27  set_stream_buffering/2

    Templates
    set_stream_buffering(+stream_or_alias, +atom)
    Description

    set_stream_buffering(SorA, Buffering) updates the buffering mode associated with the stream-term or alias SorA. The value of Buffering is one of the atoms none, line or block as for open/4 (section 7.10.6). This predicate may only be used after opening a stream and before any other operations have been performed on it.

    Errors
    SorA is a variable    instantiation_error
    Buffering is a variable    instantiation_error
    Buffering is neither a variable nor a valid buffering mode    domain_error(buffering_mode, Buffering)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)

    Portability

    GNU Prolog predicate.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog064.html0000644004425400513100000001017210547441640017306 0ustar diazloco Optimization constraints Previous Up

    8.10  Optimization constraints

    8.10.1  fd_minimize/2, fd_maximize/2

    Templates
    fd_minimize(+callable_term, ?fd_variable)
    fd_maximize(+callable_term, ?fd_variable)
    Description

    fd_minimize(Goal, X) repeatedly calls Goal to find a value that minimizes the variable X. Goal is a Prolog goal that should instantiate X, a common case being the use of fd_labeling/2 (section 8.9.1). This predicate uses a branch-and-bound algorithm with restart: each time call(Goal) succeeds the computation restarts with a new constraint X #< V where V is the value of X at the end of the last call of Goal. When a failure occurs (either because there are no remaining choice-points for Goal or because the added constraint is inconsistent with the rest of the store) the last solution is recomputed since it is optimal.

    fd_maximize(Goal, X) is similar to fd_minimize/2 but X is maximized.

    Errors
    Goal is a variable    instantiation_error
    Goal is neither a variable nor a callable term    type_error(callable, Goal)
    The predicate indicator Pred of Goal does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)
    X is neither a variable nor an FD variable nor an integer    type_error(fd_variable, X)

    Portability

    GNU Prolog predicates.
    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up ./gprolog-1.3.0/doc/html_node/gprolog069.html0000644004425400513100000003065610547441640017324 0ustar diazloco Calling Prolog from C Previous Up Next

    9.4  Calling Prolog from C

    9.4.1  Introduction

    The following functions allows a C function to call a Prolog predicate:
    void   Pl_Query_Begin        (Bool recoverable)
    int    Pl_Query_Call         (int functor, int arity, PlTerm *arg)
    int    Pl_Query_Next_Solution(void)
    void   Pl_Query_End          (int op)
    PlTerm Pl_Get_Exception      (void)
    void   Pl_Exec_Continuation  (int functor, int arity, PlTerm *arg)
    
    The invocation of a Prolog predicate should be done as follows:
    • open a query using Pl_Query_Begin()

    • compute the first solution using Pl_Query_Call()

    • eventually compute next solutions using Pl_Query_Next_Solution()

    • close the query using Pl_Query_End()
    The function Pl_Query_Begin(recoverable) is used to initialize a query. The argument recoverable shall be set to TRUE if the user wants to recover, at the end of the query, the memory space consumed by the query (in that case an additional choice-point is created). All terms created in the heap, e.g. using Mk_... family functions (section 9.2.5), after the invocation of Pl_Query_Begin() can be recovered when calling Pl_Query_End(TRUE) (see below).

    The function Pl_Query_Call(functor, arity, arg) calls a predicate passing arguments. It is then used to compute the first solution. The arguments functor, arity and arg are similar to those of the functions handling complex terms (section 9.2.1). This function returns:
    • PL_FAILURE (a constant equal to FALSE, i.e. 0) if the query fails.

    • PL_SUCCESS (a constant equal to TRUE, i.e. 1) in case of success. In that case the argument array arg can be used to obtain the unification performed by the query.

    • PL_EXCEPTION (a constant equal to 2). In that case function Pl_Get_Exception() can be used to obtained the exceptional term raised by throw/1 (section 6.2.4).
    The function Pl_Query_Next_Solution() is used to compute a new solution. It must be only used if the result of the previous solution was PL_SUCCESS. This functions returns the same kind of values as Pl_Query_Call() (see above).

    The function Pl_Query_End(op) is used to finish a query. This function mainly manages the remaining alternatives of the query. However, even if the query has no alternatives this function must be used to correctly finish the query. The value of op is:
    • PL_RECOVER: to recover the memory space consumed by the query. After that the state of Prolog stacks is exactly the same as before opening the query. To use this option the query must have been initialized specifying TRUE for recoverable (see above).

    • PL_CUT: to cut remaining alternatives. The effect of this option is similar to a cut after the query.

    • PL_KEEP_FOR_PROLOG: to keep the alternatives for Prolog. This is useful when the query was invoked in a foreign C function. In that case, when the predicate corresponding to the C foreign function is invoked a query is executed and the remaining alternatives are then available as alternatives of that predicate.
    Note that several queries can be nested since a stack of queries is maintained. For instance, it is possible to call a query and before terminating it to call another query. In that case the first execution of Pl_Query_End() will finish the second query (i.e. the inner) and the next execution of Pl_Query_End() will finish the first query.

    Finally, the function Pl_Exec_Continuation(functor, arity, arg) replaces the current calculus by the execution of the specified predicate. The arguments functor, arity and arg are similar to those of the functions handling complex terms (section 9.2.1).

    9.4.2  Example: my_call/1 - a call/1 clone

    We here define a predicate my_call(Goal) which acts like call(Goal) except that we do not handle exceptions (if an exception occurs the goal simply fails):

    In the prolog file examp.pl:
    :- foreign(my_call(term)).
    In the C file examp_c.c:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    my_call(PlTerm goal)
    
    {
      PlTerm *arg;
      int functor, arity;
      int result;
    
      arg = Rd_Callable_Check(goal, &functor, &arity);
      Pl_Query_Begin(FALSE);
      result = Pl_Query_Call(functor, arity, arg);
      Pl_Query_End(PL_KEEP_FOR_PROLOG);
      return (result == PL_SUCCESS);
    }
    
    The compilation produces an executable called examp:
    % gplc examp.pl examp_c.c
    Examples of use:
    | ?- my_call(write(hello)).
    hello
     
    | ?- my_call(for(X,1,3)).
     
    X = 1 ?    (here the user presses ; to compute another solution)
     
    X = 2 ?    (here the user presses ; to compute another solution)
     
    X = 3    (here the user is not prompted since there is no more alternative)
     
    | ?- my_call(1).
    {exception: error(type_error(callable,1),my_call/1)}
     
    | ?- my_call(call(1)).
     
    no
    When my_call(1) is called an error is raised due to the use of Rd_Callable_Check(). However the error raised by my_call(call(1)) is ignored and FALSE (i.e. a failure) is returned by the foreign function.

    To really simulate the behavior of call/1 when an exception is recovered it should be re-raised to be captured by an earlier handler. The idea is then to execute a throw/1 as the continuation. This is what it is done by the following code:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    my_call(PlTerm goal)
    {
      PlTerm *args;
      int functor, arity;
      int result;
    
      args = Rd_Callable_Check(goal, &functor, &arity);
      Pl_Query_Begin(FALSE);
      result = Pl_Query_Call(functor, arity, args);
      Pl_Query_End(PL_KEEP_FOR_PROLOG);
      if (result == PL_EXCEPTION)
        {
          PlTerm except = Pl_Get_Exception();
          Pl_Exec_Continuation(Find_Atom("throw"), 1, &except);
        }
    
      return result;
    }
    
    The following code propagates the error raised by call/1.
    | ?- my_call(call(1)).
    {exception: error(type_error(callable,1),my_call/1)}
    Finally note that a simpler way to define my_call/1 is to use Pl_Exec_Continuation() as follows:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    my_call(PlTerm goal)
    {
      PlTerm *args;
      int functor, arity;
    
      args = Rd_Callable_Check(goal, &functor, &arity);
      Pl_Exec_Continuation(functor, arity, args);
      return TRUE;
    }
    

    9.4.3  Example: recovering the list of all operators

    We here define a predicate all_op(List) which unifies List with the list of all currently defined operators as would be done by: findall(X,current_op(_,_,X),List).

    In the prolog file examp.pl:
    :- foreign(all_op(term)).
    In the C file examp_c.c:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    all_op(PlTerm list)
    {
      PlTerm op[1024];
      PlTerm args[3];
      int n = 0;
      int result;
    
      Pl_Query_Begin(TRUE);
      args[0] = Mk_Variable();
      args[1] = Mk_Variable();
      args[2] = Mk_Variable();
      result = Pl_Query_Call(Find_Atom("current_op"), 3, args);
      while (result)
        {
          op[n++] = Mk_Atom(Rd_Atom(args[2])); /* arg #2 is the name of the op */
          result = Pl_Query_Next_Solution();
        }
      Pl_Query_End(PL_RECOVER);
    
      return Un_Proper_List_Check(n, op, list);
    }
    
    Note that we know here that there is no source for exception. In that case the result of Pl_Query_Call and Pl_Query_Next_Solution can be considered as a boolean.

    The compilation produces an executable called examp:
    % gplc examp.pl examp_c.c
    Example of use:
    | ?- all_op(L).
    
    L = [:-,:-,\=,=:=,#>=,#<#,@>=,-->,mod,#>=#,**,*,+,+,',',...]
    
    | ?- findall(X,current_op(_,_,X),L).
    
    L = [:-,:-,\=,=:=,#>=,#<#,@>=,-->,mod,#>=#,**,*,+,+,',',...]
    

    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog001.html0000644004425400513100000013070010547441640017275 0ustar diazloco Contents Up Next

    Contents


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Up Next ./gprolog-1.3.0/doc/html_node/gprolog016.html0000644004425400513100000000365610547441640017314 0ustar diazloco Format of definitions Previous Up Next

    5  Format of definitions


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog027.html0000644004425400513100000003577110547441640017321 0ustar diazloco Term processing Previous Up Next

    7.4  Term processing

    7.4.1  functor/3

    Templates
    functor(+nonvar, ?atomic, ?integer)
    functor(-nonvar, +atomic, +integer)
    Description

    functor(Term, Name, Arity) succeeds if the principal functor of Term is Name and its arity is Arity. This predicate can be used in two ways:
    • Term is not a variable: extract the name (an atom or a number if Term is a number) and the arity of Term (if Term is atomic Arity = 0).

    • Term is a variable: unify Term with a general term whose principal functor is given by Name and arity is given by Arity.
    Errors
    Term and Name are both variables    instantiation_error
    Term and Arity are both variables    instantiation_error
    Term is a variable and Name is neither a variable nor an atomic term    type_error(atomic, Name)
    Term is a variable and Arity is neither a variable nor an integer    type_error(integer, Arity)
    Term is a variable, Name is a constant but not an atom and Arity is an integer > 0    type_error(atom, Name)
    Term is a variable and Arity is an integer > max_arity flag (section 7.22.1)    representation_error(max_arity)
    Term is a variable and Arity is an integer < 0    domain_error(not_less_than_zero, Arity)

    Portability

    ISO predicate.

    7.4.2  arg/3

    Templates
    arg(+integer, +compound_term, ?term)
    Description

    arg(N, Term, Arg) succeeds if the Nth argument of Term is Arg.

    Errors
    N is a variable    instantiation_error
    Term is a variable    instantiation_error
    N is neither a variable nor an integer    type_error(integer, N)
    Term is neither a variable nor a compound term    type_error(compound, Term)
    N is an integer < 0    domain_error(not_less_than_zero, N)

    Portability

    ISO predicate.

    7.4.3  (=..)/2 - univ

    Templates
    =..(+nonvar, ?list)
    =..(-nonvar, +list)
    Description

    Term =.. List succeeds if 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.

    =.. is a predefined infix operator (section 7.14.10).

    Errors
    Term is a variable and List is a partial list    instantiation_error
    List is neither a partial list nor a list    type_error(list, List)
    Term is a variable and List is a list whose head is a variable    instantiation_error
    List is a list whose head H is neither an atom nor a variable and whose tail is not the empty list    type_error(atom, H)
    List is a list whose head H is a compound term and whose tail is the empty list    type_error(atomic, H)
    Term is a variable and List is the empty list    domain_error(non_empty_list, [])
    Term is a variable and the tail of List has a length > max_arity flag (section 7.22.1)    representation_error(max_arity)

    Portability

    ISO predicate.

    7.4.4  copy_term/2

    Templates
    copy_term(?term, ?term)
    Description

    copy_term(Term1, Term2) succeeds if Term2 unifies with a term T which is a renamed copy of Term1.

    Errors

    None.

    Portability

    ISO predicate.

    7.4.5  setarg/4, setarg/3

    Templates
    setarg(+integer, +compound_term, +term, +boolean)
    setarg(+integer, +compound_term, +term)
    Description

    setarg(N, Term, NewValue, Undo) replaces destructively the Nth argument of Term with NewValue. This assignment is undone on backtracking if Undo = true. This should only used if there is no further use of the old value of the replaced argument. If Undo = false then NewValue must be either an atom or an integer.

    setarg(N, Term, NewValue) is equivalent to setarg(N, Term, NewValue, true).

    Errors
    N is a variable    instantiation_error
    N is neither a variable nor an integer    type_error(integer, N)
    N is an integer < 0    domain_error(not_less_than_zero, N)
    Term is a variable    instantiation_error
    Term is neither a variable nor a compound term    type_error(compound, Term)
    NewValue is neither an atom nor an integer and Undo = false    type_error(atomic, NewValue)
    Undo is a variable    instantiation_error
    Undo is neither a variable nor a boolean    type_error(boolean, Undo)

    Portability

    GNU Prolog predicate.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/contents_motif.gif0000644004425400513100000000047410547441640020243 0ustar diazlocoGIF89añp€ÿÿ!þ" Imported from XPM image: toc.xpm!ù,@çÜ6313Æc „BÃ0 Ã0‚ A0 Ã0 Ã0 €Á0 ƒÁ`0€@`0 ƒÁ`  ƒÁ`0€@`0 ƒÁ`0€@`0000000000 0000000000 00000000 000000 0000 000000000 00000000000 00000000000000`À€ ;./gprolog-1.3.0/doc/html_node/gprolog065.html0000644004425400513100000000732110547441640017311 0ustar diazloco Interfacing Prolog and C Previous Up Next

    9  Interfacing Prolog and C




    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/gprolog031.html0000644004425400513100000002271410547441640017305 0ustar diazloco Predicate information Previous Up Next

    7.8  Predicate information

    7.8.1  current_predicate/1

    Templates
    current_predicate(?predicate_indicator)
    Description

    current_predicate(Pred) succeeds if there exists a predicate indicator of a defined procedure that unifies with Pred. All user defined procedures are found, whether static or dynamic. Internal system procedures whose name begins with '$' are not found. A user-defined procedure is found even when it has no clauses. A user-defined procedure is not found if it has been abolished. To conform to the ISO reference, built-in predicates are not found except if the strict_iso Prolog flag is switched off (section 7.22.1). This predicate is re-executable on backtracking.

    Errors
    Pred is neither a variable nor a predicate indicator    type_error(predicate_indicator, Pred)
    Pred is a term Name/Arity and Arity is neither a variable nor an integer    type_error(integer, Arity)
    Pred is a term Name/Arity and Name is neither a variable nor an atom    type_error(atom, Name)
    Pred is a term Name/Arity and Arity is an integer < 0    domain_error(not_less_than_zero, Arity)
    Pred is a term Name/Arity and Arity is an integer > max_arity flag (section 7.22.1)    representation_error(max_arity)

    Portability

    ISO predicate.

    7.8.2  predicate_property/2

    Templates
    predicate_property(?predicate_indicator, ?predicate_property)
    Description

    predicate_property(Pred, Property) succeeds if there exists a predicate indicator of a defined procedure that unifies with Pred and if Property unifies with one of the properties of the procedure. All user defined procedures and built-in predicates are found. Internal system procedures whose name begins with '$' are not found. This predicate is re-executable on backtracking.

    Predicate properties:
    • static: if the procedure is static.

    • dynamic: if the procedure is dynamic.

    • private: if the procedure is private.

    • public: if the procedure is public.

    • user: if the procedure is a user-defined procedure.

    • built_in: if the procedure is a Prolog built-in predicate.

    • built_in_fd: if the procedure is an FD built-in predicate.

    • native_code: if the procedure is compiled in native code.

    • prolog_file(File): source file from which the predicate has been read.

    • prolog_line(Line): line number of the source file.
    Errors
    Pred is neither a variable nor a predicate indicator    type_error(predicate_indicator, Pred)
    Pred is a term Name/Arity and Arity is neither a variable nor an integer    type_error(integer, Arity)
    Pred is a term Name/Arity and Name is neither a variable nor an atom    type_error(atom, Name)
    Pred is a term Name/Arity and Arity is an integer < 0    domain_error(not_less_than_zero, Arity)
    Pred is a term Name/Arity and Arity is an integer > max_arity flag (section 7.22.1)    representation_error(max_arity)
    Property is neither a variable nor a predicate property term    domain_error(predicate_property, Property)
    Property = prolog_file(File) and File is neither a variable nor an atom    type_error(atom, File)
    Property = prolog_line(Line) and Line is neither a variable nor an integer    type_error(integer, Line)

    Portability

    GNU Prolog predicate.


    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/hh-gprolog.hhc0000644004425400513100000020732710547441641017262 0ustar diazloco
    ./gprolog-1.3.0/doc/html_node/gprolog071.html0000644004425400513100000000755010547441640017312 0ustar diazloco References Previous Up Next

    References

    [1]
    H. Aït-Kaci. “Warren's Abstract Machine, A Tutorial Reconstruction”.
    Logic Programming Series, MIT Press, 1991.
    http://www.vanx.org/archive/wam/wam.html

    [2]
    W.F. Clocksin and C.S. Mellish. Programming in Prolog, Springer-Verlag, 1981.

    [3]
    P. Codognet and D. Diaz. “wamcc: Compiling Prolog to C”.
    In 12th International Conference on Logic Programming, Tokyo, Japan, MIT Press, 1995.
    ftp://ftp.inria.fr/INRIA/Projects/loco/publications/WAMCC/iclp95.pdf

    [4]
    P. Codognet and D. Diaz. “Compiling Constraint in clp(FD)”.
    Journal of Logic Programming, Vol. 27, No. 3, June 1996.
    ftp://ftp.inria.fr/INRIA/Projects/loco/publications/CLP-FD/jlp96.pdf

    [5]
    D. Diaz and P. Codognet. “Design and Implementation of the GNU Prolog System”.
    Journal of Functional and Logic Programming, Vol. 2001, No. 6, October 2001.
    ftp://ftp.inria.fr/INRIA/Projects/loco/publications/GNU-PROLOG/jflp01.pdf

    [6]
    Information technology - Programming languages - Prolog - Part 1: General Core.
    ISO/IEC 13211-1, 1995.

    [7]
    J. Jaffar and J-L. Lassez. “Constraint Logic Programming”.
    In Principles Of Programming Languages, Munich, Germany, January 1987.

    [8]
    P. Van Hentenryck. “Constraint Satisfaction in Logic Programming”.
    Logic Programming Series, The MIT Press, 1989.

    [9]
    D. H. D. Warren. “An Abstract Prolog Instruction Set”.
    Technical Report 309, SRI International, Oct. 1983.

    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    Previous Up Next ./gprolog-1.3.0/doc/html_node/README0000644004425400513100000000065710542450316015377 0ustar diazlocoIn this directory everything can be removed except : compile-scheme.gif and debug_box.gif (they should also be in the parent directory) and some files needed to build a .chm : hh_do_hhc_hhk a script to create hh-gprolog.hhc (toc) hh-gprolog.hhk (index) hh-mkind.tex used by the script to create .hhc hh-mktoc.tex used by the script to create .hhk hh-gprolog.hhp a HTMLHelp project to build the .chm ./gprolog-1.3.0/doc/direct-cc.tex0000644004425400513100000004162310547152502015124 0ustar diazloco\newpage \section{Prolog directives and control constructs} %HEVEA\cutdef[1]{subsection} \subsection{Prolog directives} \subsubsection{Introduction} Prolog directives are annotations inserted in Prolog source files for the compiler. A Prolog directive is used to specify: \begin{itemize} \item the properties of some procedures defined in the source file. \item the format and the syntax for read-terms in the source file (using changeable Prolog flags). \item included source files. \item a goal to be executed at run-time. \end{itemize} \subsubsection{\texttt{dynamic/1}} \label{dynamic/1} \AddDiD{dynamic/1} \begin{TemplatesOneCol} dynamic(+predicate\_indicator)\\ dynamic(+predicate\_indicator\_list)\\ dynamic(+predicate\_indicator\_sequence) \end{TemplatesOneCol} \Description \texttt{dynamic(Pred)} specifies that the procedure whose predicate indicator is \texttt{Pred} is a dynamic procedure. This directive makes it possible to alter the definition of \texttt{Pred} by adding or removing clauses. For more information refer to the section about dynamic clause management \RefSP{Introduction:(Dynamic-clause-management)}. This directive shall precede the definition of \texttt{Pred} in the source file. If there is no clause for \texttt{Pred} in the source file, \texttt{Pred} exists however as an empty predicate (this means that \texttt{current\_predicate(Pred)} succeeds). In order to allow multiple definitions, \texttt{Pred} can also be a list of predicate indicators or a sequence of predicate indicators using \texttt{','/2} as separator. \Portability ISO directive. \subsubsection{\texttt{public/1}} \label{public/1} \AddDiD{public/1} \begin{TemplatesOneCol} public(+predicate\_indicator)\\ public(+predicate\_indicator\_list)\\ public(+predicate\_indicator\_sequence) \end{TemplatesOneCol} \Description \texttt{public(Pred)} specifies that the procedure whose predicate indicator is \texttt{Pred} is a public procedure. This directive makes it possible to inspect the clauses of \texttt{Pred}. For more information refer to the section about dynamic clause management \RefSP{Introduction:(Dynamic-clause-management)}. This directive shall precede the definition of \texttt{Pred} in the source file. Since a dynamic procedure is also public. It is useless (but correct) to define a public directive for a predicate already declared as dynamic. In order to allow multiple definitions, \texttt{Pred} can also be a list of predicate indicators or a sequence of predicate indicators using \texttt{','/2} as separator. \Portability GNU Prolog directive. The ISO reference does not define any directive to declare a predicate public but it does distinguish public predicates. It is worth noting that in most Prolog systems the \texttt{public/1} directive is as a visibility declaration. Indeed, declaring a predicate as public makes it visible from any predicate defined in any other file (otherwise the predicate is only visible from predicates defined in the same source file as itself). When a module system is incorporated in GNU Prolog a more general visibility declaration shall be provided conforming to the ISO reference. \subsubsection{\texttt{multifile/1}} \AddDiD{multifile/1} \begin{TemplatesOneCol} multifile(+predicate\_indicator)\\ multifile(+predicate\_indicator\_list)\\ multifile(+predicate\_indicator\_sequence) \end{TemplatesOneCol} \Description \texttt{multifile(Pred)} is not supported by GNU Prolog. When such a directive is encountered it is simply ignored. All clauses for a given predicate must reside in a single file. \Portability ISO directive. Not supported. \subsubsection{\texttt{discontiguous/1}} \AddDiD{discontiguous/1} \begin{TemplatesOneCol} discontiguous(+predicate\_indicator)\\ discontiguous(+predicate\_indicator\_list)\\ discontiguous(+predicate\_indicator\_sequence) \end{TemplatesOneCol} \Description \texttt{discontiguous(Pred)} specifies that the procedure whose predicate indicator is \texttt{Pred} is a discontiguous procedure. Namely, the clauses defining \texttt{Pred} are not restricted to be consecutive but can appear anywhere in the source file. This directive shall precede the definition of \texttt{Pred} in the source file. In order to allow multiple definitions, \texttt{Pred} can also be a list of predicate indicators or a sequence of predicate indicators using \texttt{','/2} as separator. \Portability ISO directive. The ISO reference document states that if there is no clause for \texttt{Pred} in the source file, \texttt{Pred} exists however as an empty predicate (i.e. \texttt{current\_predicate(Pred)} will succeed). This is not the case for GNU Prolog. \subsubsection{\texttt{ensure\_linked/1}} \AddDiD{ensure\_linked/1} \begin{TemplatesOneCol} ensure\_linked(+predicate\_indicator)\\ ensure\_linked(+predicate\_indicator\_list)\\ ensure\_linked(+predicate\_indicator\_sequence) \end{TemplatesOneCol} \Description \texttt{ensure\_linked(Pred)} specifies that the procedure whose predicate indicator is \texttt{Pred} must be included by the linker. This directive is useful when compiling to native code to force the linker to include the code of a given predicate. Indeed, if the \texttt{gplc} is invoked with an option to reduce the size of the executable \RefSP{Using-the-compiler}, the linker only includes the code of predicates that are statically referenced. However, the linker cannot detect dynamically referenced predicates (used as data passed to a meta-call predicate). The use of this directive prevents it to exclude the code of such predicates. In order to allow multiple definitions, \texttt{Pred} can also be a list of predicate indicators or a sequence of predicate indicators using \texttt{','/2} as separator. \Portability GNU Prolog directive. \subsubsection{\texttt{built\_in/0}, \texttt{built\_in/1}, \texttt{built\_in\_fd/0}, \texttt{built\_in\_fd/1}} \AddDiD{built\_in/0} \AddDiD{built\_in/1} \AddDiD{built\_in\_fd/0} \AddDiD{built\_in\_fd/1} \begin{TemplatesOneCol} built\_in\\ built\_in(+predicate\_indicator)\\ built\_in(+predicate\_indicator\_list)\\ built\_in(+predicate\_indicator\_sequence)\\ built\_in\_fd\\ built\_in\_fd(+predicate\_indicator)\\ built\_in\_fd(+predicate\_indicator\_list)\\ built\_in\_fd(+predicate\_indicator\_sequence) \end{TemplatesOneCol} \Description \texttt{built\_in} specifies that the procedures defined from now have the \IdxPP{built\_in} property \RefSP{predicate-property/2}. \texttt{built\_in(Pred)} is similar to \texttt{built\_in/0} but only affects the procedure whose predicate indicator is \texttt{Pred}. This directive shall precede the definition of \texttt{Pred} in the source file. In order to allow multiple definitions, \texttt{Pred} can also be a list of predicate indicators or a sequence of predicate indicators using \texttt{','/2} as separator. \texttt{built\_in\_fd} (resp. \texttt{built\_in\_fd(Pred)}) is similar to \texttt{built\_in} (resp. \texttt{built\_in(Pred)}) but sets the \IdxPP{built\_in\_fd} predicate property \RefSP{predicate-property/2}. \Portability GNU Prolog directives. \subsubsection{\texttt{include/1}} \AddDiD{include/1} \begin{TemplatesOneCol} include(+atom) \end{TemplatesOneCol} \Description \texttt{include(File)} specifies that the content of the Prolog source \texttt{File} shall be inserted. The resulting Prolog text is identical to the Prolog text obtained by replacing the directive by the content of the Prolog source \texttt{File}. See \IdxPB{absolute\_file\_name/2} for information about the syntax of \texttt{File} \RefSP{absolute-file-name/2}. \Portability ISO directive. \subsubsection{\texttt{ensure\_loaded/1}} \AddDiD{ensure\_loaded/1} \begin{TemplatesOneCol} ensure\_loaded(+atom) \end{TemplatesOneCol} \Description \texttt{ensure\_loaded(File)} is not supported by GNU Prolog. When such a directive is encountered it is simply ignored. \Portability ISO directive. Not supported. \subsubsection{\texttt{op/3}} \label{op/3} \AddDiD{op/3} \begin{TemplatesOneCol} op(+integer, +operator\_specifier, +atom\_or\_atom\_list) \end{TemplatesOneCol} \Description \texttt{op(Priority, OpSpecifier, Operator)} alters the operator table. This directive is executed as soon as it is encountered by calling the built-in predicate \IdxPB{op/3} \RefSP{op/3:(Term-input/output)}. A system directive is also generated to reflect the effect of this directive at run-time \RefSP{Running-an-executable}. \Portability ISO directive. \subsubsection{\texttt{char\_conversion/2}} \AddDiD{char\_conversion/2} \begin{TemplatesOneCol} char\_conversion(+character, +character) \end{TemplatesOneCol} \Description \texttt{char\_conversion(InChar, OutChar)} alters the character-conversion mapping. This directive is executed as soon as it is encountered by a call to the built-in predicate \IdxPB{char\_conversion/2} \RefSP{char-conversion/2}. A system directive is also generated to reflect the effect of this directive at run-time \RefSP{Running-an-executable}. \Portability ISO directive. \subsubsection{\texttt{set\_prolog\_flag/2}} \AddDiD{set\_prolog\_flag/2} \begin{TemplatesOneCol} set\_prolog\_flag(+flag, +term) \end{TemplatesOneCol} \Description \texttt{set\_prolog\_flag(Flag, Value)} sets the value of the \Idx{Prolog flag} \texttt{Flag} to \texttt{Value}. This directive is executed as soon as it is encountered by a call to the built-in predicate \IdxPB{set\_prolog\_flag/2} \RefSP{set-prolog-flag/2}. A system directive is also generated to reflect the effect of this directive at run-time \RefSP{Running-an-executable}. \Portability ISO directive. \subsubsection{\texttt{initialization/1}} \label{initialization/1} \AddDiD{initialization/1} \begin{TemplatesOneCol} initialization(+callable\_term) \end{TemplatesOneCol} \Description \texttt{initialization(Goal)} adds \texttt{Goal} to the set of goal which shall be executed at run-time. A user directive is generated to execute \texttt{Goal} at run-time. If several initialization directives appear in the same file they are executed in the order of appearance \RefSP{Running-an-executable}. \Portability ISO directive. \subsubsection{\texttt{foreign/2}, \texttt{foreign/1}} \label{foreign/2} \AddDiD{foreign/2} \AddDiD{foreign/1} \begin{TemplatesOneCol} foreign(+callable\_term, +foreign\_option\_list)\\ foreign(+callable\_term) \end{TemplatesOneCol} \Description \texttt{foreign(Template, Options)} defines an interface predicate whose prototype is \texttt{Template} according to the options given by \texttt{Options}. Refer to the foreign code interface for more information \RefSP{Calling-C-from-Prolog}. \texttt{foreign(Template)} is equivalent to \texttt{foreign(Template, [])}. \Portability GNU Prolog directive. \subsection{Prolog control constructs} \subsubsection{\texttt{true/0}, \texttt{fail/0}, \texttt{!/0}} \label{true/0} \AddCCD{true/0} \AddCCD{fail/0} \AddCCD{"!/0} \begin{TemplatesOneCol} true\\ fail\\ ! \end{TemplatesOneCol} \Description \texttt{true} always succeeds. \texttt{fail} always fails (enforces backtracking). \texttt{!} always succeeds and the for side-effect of removing all choice-points created since the invocation of the predicate activating it. \PlErrorsNone \Portability ISO control constructs. \subsubsection{\texttt{(',')/2} - conjunction, \texttt{(;)/2} - disjunction, \texttt{(-{\gt})/2} - if-then} \AddCCD{(',')/2} \AddCCD{(;)/2} \AddCCD{(-{\gt})/2} \begin{TemplatesOneCol} ','(+callable\_term, +callable\_term)\\ ;(+callable\_term, +callable\_term)\\ -{\gt}(+callable\_term, +callable\_term) \end{TemplatesOneCol} \Description \texttt{Goal1 , Goal2} executes \texttt{Goal1} and, in case of success, executes \texttt{Goal2}. \texttt{Goal1 ; Goal2} first creates a choice-point and executes \texttt{Goal1}. On backtracking \texttt{Goal2} is executed. \texttt{Goal1 -{\gt} Goal2} first executes \texttt{Goal1} and, in case of success, removes all choice-points created by \texttt{Goal1} and executes \texttt{Goal2}. This control construct acts like an if-then (\texttt{Goal1} is the test part and \texttt{Goal2} the then part). Note that if \texttt{Goal1} fails \texttt{-{\gt}/2} fails also. \texttt{-{\gt}/2} is often combined with \texttt{;/2} to define an if-then-else as follows: \texttt{Goal1 -{\gt} Goal2 ; Goal3}. Note that \texttt{Goal1 -{\gt} Goal2} is the first argument of the \texttt{(;)/2} and \texttt{Goal3} (the else part) is the second argument. Such an if-then-else control construct first creates a choice-point for the else-part (intuitively associated with \texttt{;/2}) and then executes \texttt{Goal1}. In case of success, all choice-points created by \texttt{Goal1} together with the choice-point for the else-part are removed and \texttt{Goal2} is executed. If \texttt{Goal1} fails then \texttt{Goal3} is executed. \texttt{','}, \texttt{;} and \texttt{-{\gt}} are predefined infix operators \RefSP{op/3:(Term-input/output)}. \begin{PlErrors} \ErrCond{\texttt{Goal1} or \texttt{Goal2} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Goal1} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Goal1)} \ErrCond{\texttt{Goal2} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Goal2)} \ErrCond{The predicate indicator \texttt{Pred} of \texttt{Goal1} or \texttt{Goal2} does not correspond to an existing procedure and the value of the \texttt{unknown} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{existence\_error(procedure, Pred)} \end{PlErrors} \Portability ISO control constructs. \subsubsection{\texttt{call/1}} \label{call/1} \AddCCD{call/1} \begin{TemplatesOneCol} call(+callable\_term) \end{TemplatesOneCol} \Description \texttt{call(Goal)} executes \texttt{Goal}. \texttt{call/1} succeeds if \texttt{Goal} represents a goal which is true. When \texttt{Goal} contains a cut symbol \IdxCC["!/0]{!} \RefSP{true/0} as a subgoal, the effect of \texttt{!} does not extend outside \texttt{Goal}. \begin{PlErrors} \ErrCond{\texttt{Goal} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Goal} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Goal)} \ErrCond{The predicate indicator \texttt{Pred} of \texttt{Goal} does not correspond to an existing procedure and the value of the \texttt{unknown} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{existence\_error(procedure, Pred)} \end{PlErrors} \Portability ISO control construct. \subsubsection{\texttt{catch/3}, \texttt{throw/1}} \label{catch/3} \AddCCD{catch/3} \AddCCD{throw/1} \begin{TemplatesOneCol} catch(?callable\_term, ?term, ?term)\\ throw(+nonvar) \end{TemplatesOneCol} \Description \texttt{catch(Goal, Catcher, Recovery)} is similar to \texttt{call(Goal)} \RefSP{call/1}. If this succeeds or fails, so does the call to \texttt{catch/3}. If however, during the execution of \texttt{Goal}, there is a call to \texttt{throw(Ball)}, the current flow of control is interrupted, and control returns to a call of \texttt{catch/3} that is being executed. This can happen in one of two ways: \begin{itemize} \item implicitly, when an error condition for a built-in predicate is satisfied. \item explicitly, when the program executes a call of \texttt{throw/1} because the program wishes to abandon the current processing, and instead to take an alternative action. \end{itemize} \texttt{throw(Ball)} causes the normal flow of control to be transferred back to an existing call of \texttt{catch/3}. When a call to \texttt{throw(Ball)} happens, \texttt{Ball} is copied and the stack is unwound back to the call to \texttt{catch/3}, whereupon the copy of \texttt{Ball} is unified with \texttt{Catcher}. If this unification succeeds, then \texttt{catch/3} executes the goal \texttt{Recovery} using \texttt{call/1} \RefSP{call/1} in order to determine the success or failure of \texttt{catch/3}. Otherwise, in case the unification fails, the stack keeps unwinding, looking for an earlier invocation of \texttt{catch/3}. \texttt{Ball} may be any non-variable term. \begin{PlErrors} \ErrCond{\texttt{Goal} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Goal} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Goal)} \ErrCond{The predicate indicator \texttt{Pred} of \texttt{Goal} does not correspond to an existing procedure and the value of the \texttt{unknown} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{existence\_error(procedure, Pred)} \ErrCond{\texttt{Ball} is a variable} \ErrTerm{instantiation\_error} \end{PlErrors} If \texttt{Ball} does not unify with the \texttt{Catcher} argument of any call of \texttt{catch/3}, a system error message is displayed and \texttt{throw/1} fails. When \texttt{catch/3} calls \texttt{Recovery} it uses \texttt{call/1} \RefSP{call/1}, an \texttt{instantiation\_error}, a \texttt{type\_error} or an \texttt{existence\_error} can then occur depending on \texttt{Recovery}. \Portability ISO control constructs. %HEVEA\cutend ./gprolog-1.3.0/doc/cover.tex0000644004425400513100000000314510547152502014402 0ustar diazloco\pagestyle{empty} \setlength{\parskip}{0pt} %BEGIN LATEX ~ \vspace{4cm} %END LATEX %HEVEA\begin{center}\begin{bgcolor}{part}\begin{center} {\huge\bf GNU PROLOG} %BEGIN LATEX \vspace{3mm} %END LATEX \rule[2mm]{\linewidth}{2mm} %BEGIN LATEX \begin{flushright} %END LATEX {\Large A Native Prolog Compiler with Constraint Solving over Finite Domains Edition 1.8, for GNU Prolog version \input{version_no}\\ \today } %BEGIN LATEX \end{flushright} %END LATEX %BEGIN LATEX \vspace{13cm} %END LATEX {\Large\bf by \MyUrlHtml{http://pauillac.inria.fr/\~{}diaz}{Daniel Diaz}} \rule[2mm]{\linewidth}{1mm} %HEVEA\end{center}\end{bgcolor}\end{center} \newpage %BEGIN LATEX ~ \vspace{17cm} %END LATEX \setlength{\parskip}{\saveparskip} %HEVEA\anchor{copyright} \input{copyright} Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the \MyUrl{http://www.fsf.org/}{Free Software Foundation}, 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. %HEVEA\rule[2mm]{\linewidth}{1mm} \newpage \pagestyle{fancy} %BEGIN LATEX \setcounter{page}{1} %END LATEX ./gprolog-1.3.0/doc/gprolog.pdf0000644004425400513100000530005510547153034014714 0ustar diazloco%PDF-1.4 5 0 obj << /S /GoTo /D (section.1) >> endobj 8 0 obj (Acknowledgements) endobj 9 0 obj << /S /GoTo /D (section.2) >> endobj 12 0 obj (Introduction) endobj 13 0 obj << /S /GoTo /D (section.3) >> endobj 16 0 obj (Using GNU Prolog) endobj 17 0 obj << /S /GoTo /D (subsection.3.1) >> endobj 20 0 obj (Introduction) endobj 21 0 obj << /S /GoTo /D (subsection.3.2) >> endobj 24 0 obj (The GNU Prolog interactive interpreter) endobj 25 0 obj << /S /GoTo /D (subsubsection.3.2.1) >> endobj 28 0 obj (Starting/exiting the interactive interpreter) endobj 29 0 obj << /S /GoTo /D (subsubsection.3.2.2) >> endobj 32 0 obj (The interactive interpreter read-execute-write loop) endobj 33 0 obj << /S /GoTo /D (subsubsection.3.2.3) >> endobj 36 0 obj (Consulting a Prolog program) endobj 37 0 obj << /S /GoTo /D (subsubsection.3.2.4) >> endobj 40 0 obj (Interrupting a query) endobj 41 0 obj << /S /GoTo /D (subsubsection.3.2.5) >> endobj 44 0 obj (The line editor) endobj 45 0 obj << /S /GoTo /D (subsection.3.3) >> endobj 48 0 obj (Adjusting the size of Prolog stacks) endobj 49 0 obj << /S /GoTo /D (subsection.3.4) >> endobj 52 0 obj (The GNU Prolog compiler) endobj 53 0 obj << /S /GoTo /D (subsubsection.3.4.1) >> endobj 56 0 obj (Different kinds of codes) endobj 57 0 obj << /S /GoTo /D (subsubsection.3.4.2) >> endobj 60 0 obj (Compilation scheme) endobj 61 0 obj << /S /GoTo /D (subsubsection.3.4.3) >> endobj 64 0 obj (Using the compiler) endobj 65 0 obj << /S /GoTo /D (subsubsection.3.4.4) >> endobj 68 0 obj (Running an executable) endobj 69 0 obj << /S /GoTo /D (subsubsection.3.4.5) >> endobj 72 0 obj (Generating a new interactive interpreter) endobj 73 0 obj << /S /GoTo /D (subsubsection.3.4.6) >> endobj 76 0 obj (The hexadecimal predicate name encoding) endobj 77 0 obj << /S /GoTo /D (section.4) >> endobj 80 0 obj (Debugging) endobj 81 0 obj << /S /GoTo /D (subsection.4.1) >> endobj 84 0 obj (Introduction) endobj 85 0 obj << /S /GoTo /D (subsection.4.2) >> endobj 88 0 obj (The procedure box model) endobj 89 0 obj << /S /GoTo /D (subsection.4.3) >> endobj 92 0 obj (Debugging predicates) endobj 93 0 obj << /S /GoTo /D (subsubsection.4.3.1) >> endobj 96 0 obj (Running and stopping the debugger) endobj 97 0 obj << /S /GoTo /D (subsubsection.4.3.2) >> endobj 100 0 obj (Leashing ports) endobj 101 0 obj << /S /GoTo /D (subsubsection.4.3.3) >> endobj 104 0 obj (Spy-points) endobj 105 0 obj << /S /GoTo /D (subsection.4.4) >> endobj 108 0 obj (Debugging messages) endobj 109 0 obj << /S /GoTo /D (subsection.4.5) >> endobj 112 0 obj (Debugger commands) endobj 113 0 obj << /S /GoTo /D (subsection.4.6) >> endobj 116 0 obj (The WAM debugger) endobj 117 0 obj << /S /GoTo /D (section.5) >> endobj 120 0 obj (Format of definitions) endobj 121 0 obj << /S /GoTo /D (subsection.5.1) >> endobj 124 0 obj (General format) endobj 125 0 obj << /S /GoTo /D (subsection.5.2) >> endobj 128 0 obj (Types and modes) endobj 129 0 obj << /S /GoTo /D (subsection.5.3) >> endobj 132 0 obj (Errors) endobj 133 0 obj << /S /GoTo /D (subsubsection.5.3.1) >> endobj 136 0 obj (General format and error context) endobj 137 0 obj << /S /GoTo /D (subsubsection.5.3.2) >> endobj 140 0 obj (Instantiation error) endobj 141 0 obj << /S /GoTo /D (subsubsection.5.3.3) >> endobj 144 0 obj (Type error) endobj 145 0 obj << /S /GoTo /D (subsubsection.5.3.4) >> endobj 148 0 obj (Domain error) endobj 149 0 obj << /S /GoTo /D (subsubsection.5.3.5) >> endobj 152 0 obj (Existence error) endobj 153 0 obj << /S /GoTo /D (subsubsection.5.3.6) >> endobj 156 0 obj (Permission error) endobj 157 0 obj << /S /GoTo /D (subsubsection.5.3.7) >> endobj 160 0 obj (Representation error) endobj 161 0 obj << /S /GoTo /D (subsubsection.5.3.8) >> endobj 164 0 obj (Evaluation error) endobj 165 0 obj << /S /GoTo /D (subsubsection.5.3.9) >> endobj 168 0 obj (Resource error) endobj 169 0 obj << /S /GoTo /D (subsubsection.5.3.10) >> endobj 172 0 obj (Syntax error) endobj 173 0 obj << /S /GoTo /D (subsubsection.5.3.11) >> endobj 176 0 obj (System error) endobj 177 0 obj << /S /GoTo /D (section.6) >> endobj 180 0 obj (Prolog directives and control constructs) endobj 181 0 obj << /S /GoTo /D (subsection.6.1) >> endobj 184 0 obj (Prolog directives) endobj 185 0 obj << /S /GoTo /D (subsubsection.6.1.1) >> endobj 188 0 obj (Introduction) endobj 189 0 obj << /S /GoTo /D (subsubsection.6.1.2) >> endobj 192 0 obj (dynamic/1) endobj 193 0 obj << /S /GoTo /D (subsubsection.6.1.3) >> endobj 196 0 obj (public/1) endobj 197 0 obj << /S /GoTo /D (subsubsection.6.1.4) >> endobj 200 0 obj (multifile/1) endobj 201 0 obj << /S /GoTo /D (subsubsection.6.1.5) >> endobj 204 0 obj (discontiguous/1) endobj 205 0 obj << /S /GoTo /D (subsubsection.6.1.6) >> endobj 208 0 obj (ensure\137linked/1) endobj 209 0 obj << /S /GoTo /D (subsubsection.6.1.7) >> endobj 212 0 obj (built\137in/0, built\137in/1, built\137in\137fd/0, built\137in\137fd/1) endobj 213 0 obj << /S /GoTo /D (subsubsection.6.1.8) >> endobj 216 0 obj (include/1) endobj 217 0 obj << /S /GoTo /D (subsubsection.6.1.9) >> endobj 220 0 obj (ensure\137loaded/1) endobj 221 0 obj << /S /GoTo /D (subsubsection.6.1.10) >> endobj 224 0 obj (op/3) endobj 225 0 obj << /S /GoTo /D (subsubsection.6.1.11) >> endobj 228 0 obj (char\137conversion/2) endobj 229 0 obj << /S /GoTo /D (subsubsection.6.1.12) >> endobj 232 0 obj (set\137prolog\137flag/2) endobj 233 0 obj << /S /GoTo /D (subsubsection.6.1.13) >> endobj 236 0 obj (initialization/1) endobj 237 0 obj << /S /GoTo /D (subsubsection.6.1.14) >> endobj 240 0 obj (foreign/2, foreign/1) endobj 241 0 obj << /S /GoTo /D (subsection.6.2) >> endobj 244 0 obj (Prolog control constructs) endobj 245 0 obj << /S /GoTo /D (subsubsection.6.2.1) >> endobj 248 0 obj (true/0, fail/0, !/0) endobj 249 0 obj << /S /GoTo /D (subsubsection.6.2.2) >> endobj 252 0 obj (\(','\)/2 - conjunction, \(;\)/2 - disjunction, \(-'076\)/2 - if-then) endobj 253 0 obj << /S /GoTo /D (subsubsection.6.2.3) >> endobj 256 0 obj (call/1) endobj 257 0 obj << /S /GoTo /D (subsubsection.6.2.4) >> endobj 260 0 obj (catch/3, throw/1) endobj 261 0 obj << /S /GoTo /D (section.7) >> endobj 264 0 obj (Prolog built-in predicates) endobj 265 0 obj << /S /GoTo /D (subsection.7.1) >> endobj 268 0 obj (Type testing) endobj 269 0 obj << /S /GoTo /D (subsubsection.7.1.1) >> endobj 272 0 obj (var/1, nonvar/1, atom/1, integer/1, float/1, number/1, atomic/1, \040compound/1, callable/1, list/1, partial\137list/1, list\137or\137partial\137list/1) endobj 273 0 obj << /S /GoTo /D (subsection.7.2) >> endobj 276 0 obj (Term unification) endobj 277 0 obj << /S /GoTo /D (subsubsection.7.2.1) >> endobj 280 0 obj (\(=\)/2 - Prolog unification) endobj 281 0 obj << /S /GoTo /D (subsubsection.7.2.2) >> endobj 284 0 obj (unify\137with\137occurs\137check/2) endobj 285 0 obj << /S /GoTo /D (subsubsection.7.2.3) >> endobj 288 0 obj (\('134=\)/2 - not Prolog unifiable) endobj 289 0 obj << /S /GoTo /D (subsection.7.3) >> endobj 292 0 obj (Term comparison) endobj 293 0 obj << /S /GoTo /D (subsubsection.7.3.1) >> endobj 296 0 obj (Standard total ordering of terms) endobj 297 0 obj << /S /GoTo /D (subsubsection.7.3.2) >> endobj 300 0 obj (\(==\)/2 - term identical, \('134==\)/2 - term not identical, \040\(@'074\)/2 - term less than, \(@='074\)/2 - term less than or equal to, \040\(@'076\)/2 - term greater than, \(@'076=\)/2 - term greater than or equal to) endobj 301 0 obj << /S /GoTo /D (subsubsection.7.3.3) >> endobj 304 0 obj (compare/3) endobj 305 0 obj << /S /GoTo /D (subsection.7.4) >> endobj 308 0 obj (Term processing) endobj 309 0 obj << /S /GoTo /D (subsubsection.7.4.1) >> endobj 312 0 obj (functor/3) endobj 313 0 obj << /S /GoTo /D (subsubsection.7.4.2) >> endobj 316 0 obj (arg/3) endobj 317 0 obj << /S /GoTo /D (subsubsection.7.4.3) >> endobj 320 0 obj (\(=..\)/2 - univ) endobj 321 0 obj << /S /GoTo /D (subsubsection.7.4.4) >> endobj 324 0 obj (copy\137term/2) endobj 325 0 obj << /S /GoTo /D (subsubsection.7.4.5) >> endobj 328 0 obj (setarg/4, setarg/3) endobj 329 0 obj << /S /GoTo /D (subsection.7.5) >> endobj 332 0 obj (Variable naming/numbering) endobj 333 0 obj << /S /GoTo /D (subsubsection.7.5.1) >> endobj 336 0 obj (name\137singleton\137vars/1) endobj 337 0 obj << /S /GoTo /D (subsubsection.7.5.2) >> endobj 340 0 obj (name\137query\137vars/2) endobj 341 0 obj << /S /GoTo /D (subsubsection.7.5.3) >> endobj 344 0 obj (bind\137variables/2, numbervars/3, numbervars/1) endobj 345 0 obj << /S /GoTo /D (subsubsection.7.5.4) >> endobj 348 0 obj (term\137ref/2) endobj 349 0 obj << /S /GoTo /D (subsection.7.6) >> endobj 352 0 obj (Arithmetic) endobj 353 0 obj << /S /GoTo /D (subsubsection.7.6.1) >> endobj 356 0 obj (Evaluation of an arithmetic expression) endobj 357 0 obj << /S /GoTo /D (subsubsection.7.6.2) >> endobj 360 0 obj (\(is\)/2 - evaluate expression) endobj 361 0 obj << /S /GoTo /D (subsubsection.7.6.3) >> endobj 364 0 obj (\(=:=\)/2 - arithmetic equal, \(='134=\)/2 - arithmetic not equal, \040\('074\)/2 - arithmetic less than, \(='074\)/2 - arithmetic less than or equal to, \040\('076\)/2 - arithmetic greater than, \('076=\)/2 - arithmetic greater than or equal to) endobj 365 0 obj << /S /GoTo /D (subsection.7.7) >> endobj 368 0 obj (Dynamic clause management) endobj 369 0 obj << /S /GoTo /D (subsubsection.7.7.1) >> endobj 372 0 obj (Introduction) endobj 373 0 obj << /S /GoTo /D (subsubsection.7.7.2) >> endobj 376 0 obj (asserta/1, assertz/1) endobj 377 0 obj << /S /GoTo /D (subsubsection.7.7.3) >> endobj 380 0 obj (retract/1) endobj 381 0 obj << /S /GoTo /D (subsubsection.7.7.4) >> endobj 384 0 obj (retractall/1) endobj 385 0 obj << /S /GoTo /D (subsubsection.7.7.5) >> endobj 388 0 obj (clause/2) endobj 389 0 obj << /S /GoTo /D (subsubsection.7.7.6) >> endobj 392 0 obj (abolish/1) endobj 393 0 obj << /S /GoTo /D (subsection.7.8) >> endobj 396 0 obj (Predicate information) endobj 397 0 obj << /S /GoTo /D (subsubsection.7.8.1) >> endobj 400 0 obj (current\137predicate/1) endobj 401 0 obj << /S /GoTo /D (subsubsection.7.8.2) >> endobj 404 0 obj (predicate\137property/2) endobj 405 0 obj << /S /GoTo /D (subsection.7.9) >> endobj 408 0 obj (All solutions) endobj 409 0 obj << /S /GoTo /D (subsubsection.7.9.1) >> endobj 412 0 obj (Introduction) endobj 413 0 obj << /S /GoTo /D (subsubsection.7.9.2) >> endobj 416 0 obj (findall/3) endobj 417 0 obj << /S /GoTo /D (subsubsection.7.9.3) >> endobj 420 0 obj (bagof/3, setof/3) endobj 421 0 obj << /S /GoTo /D (subsection.7.10) >> endobj 424 0 obj (Streams) endobj 425 0 obj << /S /GoTo /D (subsubsection.7.10.1) >> endobj 428 0 obj (Introduction) endobj 429 0 obj << /S /GoTo /D (subsubsection.7.10.2) >> endobj 432 0 obj (current\137input/1) endobj 433 0 obj << /S /GoTo /D (subsubsection.7.10.3) >> endobj 436 0 obj (current\137output/1) endobj 437 0 obj << /S /GoTo /D (subsubsection.7.10.4) >> endobj 440 0 obj (set\137input/1) endobj 441 0 obj << /S /GoTo /D (subsubsection.7.10.5) >> endobj 444 0 obj (set\137output/1) endobj 445 0 obj << /S /GoTo /D (subsubsection.7.10.6) >> endobj 448 0 obj (open/4, open/3) endobj 449 0 obj << /S /GoTo /D (subsubsection.7.10.7) >> endobj 452 0 obj (close/2, close/1) endobj 453 0 obj << /S /GoTo /D (subsubsection.7.10.8) >> endobj 456 0 obj (flush\137output/1, flush\137output/0) endobj 457 0 obj << /S /GoTo /D (subsubsection.7.10.9) >> endobj 460 0 obj (current\137stream/1) endobj 461 0 obj << /S /GoTo /D (subsubsection.7.10.10) >> endobj 464 0 obj (stream\137property/2) endobj 465 0 obj << /S /GoTo /D (subsubsection.7.10.11) >> endobj 468 0 obj (at\137end\137of\137stream/1, at\137end\137of\137stream/0) endobj 469 0 obj << /S /GoTo /D (subsubsection.7.10.12) >> endobj 472 0 obj (stream\137position/2) endobj 473 0 obj << /S /GoTo /D (subsubsection.7.10.13) >> endobj 476 0 obj (set\137stream\137position/2) endobj 477 0 obj << /S /GoTo /D (subsubsection.7.10.14) >> endobj 480 0 obj (seek/4) endobj 481 0 obj << /S /GoTo /D (subsubsection.7.10.15) >> endobj 484 0 obj (character\137count/2) endobj 485 0 obj << /S /GoTo /D (subsubsection.7.10.16) >> endobj 488 0 obj (line\137count/2) endobj 489 0 obj << /S /GoTo /D (subsubsection.7.10.17) >> endobj 492 0 obj (line\137position/2) endobj 493 0 obj << /S /GoTo /D (subsubsection.7.10.18) >> endobj 496 0 obj (stream\137line\137column/3) endobj 497 0 obj << /S /GoTo /D (subsubsection.7.10.19) >> endobj 500 0 obj (set\137stream\137line\137column/3) endobj 501 0 obj << /S /GoTo /D (subsubsection.7.10.20) >> endobj 504 0 obj (add\137stream\137alias/2) endobj 505 0 obj << /S /GoTo /D (subsubsection.7.10.21) >> endobj 508 0 obj (current\137alias/2) endobj 509 0 obj << /S /GoTo /D (subsubsection.7.10.22) >> endobj 512 0 obj (add\137stream\137mirror/2) endobj 513 0 obj << /S /GoTo /D (subsubsection.7.10.23) >> endobj 516 0 obj (remove\137stream\137mirror/2) endobj 517 0 obj << /S /GoTo /D (subsubsection.7.10.24) >> endobj 520 0 obj (current\137mirror/2) endobj 521 0 obj << /S /GoTo /D (subsubsection.7.10.25) >> endobj 524 0 obj (set\137stream\137type/2) endobj 525 0 obj << /S /GoTo /D (subsubsection.7.10.26) >> endobj 528 0 obj (set\137stream\137eof\137action/2) endobj 529 0 obj << /S /GoTo /D (subsubsection.7.10.27) >> endobj 532 0 obj (set\137stream\137buffering/2) endobj 533 0 obj << /S /GoTo /D (subsection.7.11) >> endobj 536 0 obj (Constant term streams) endobj 537 0 obj << /S /GoTo /D (subsubsection.7.11.1) >> endobj 540 0 obj (Introduction) endobj 541 0 obj << /S /GoTo /D (subsubsection.7.11.2) >> endobj 544 0 obj (open\137input\137atom\137stream/2, open\137input\137chars\137stream/2, \040open\137input\137codes\137stream/2) endobj 545 0 obj << /S /GoTo /D (subsubsection.7.11.3) >> endobj 548 0 obj (close\137input\137atom\137stream/1, close\137input\137chars\137stream/1, \040close\137input\137codes\137stream/1) endobj 549 0 obj << /S /GoTo /D (subsubsection.7.11.4) >> endobj 552 0 obj (open\137output\137atom\137stream/1, open\137output\137chars\137stream/1, \040open\137output\137codes\137stream/1) endobj 553 0 obj << /S /GoTo /D (subsubsection.7.11.5) >> endobj 556 0 obj (close\137output\137atom\137stream/2, close\137output\137chars\137stream/2, \040close\137output\137codes\137stream/2) endobj 557 0 obj << /S /GoTo /D (subsection.7.12) >> endobj 560 0 obj (Character input/output) endobj 561 0 obj << /S /GoTo /D (subsubsection.7.12.1) >> endobj 564 0 obj (get\137char/2, get\137char/1, get\137code/1, get\137code/2) endobj 565 0 obj << /S /GoTo /D (subsubsection.7.12.2) >> endobj 568 0 obj (get\137key/2, get\137key/1 get\137key\137no\137echo/2, get\137key\137no\137echo/1) endobj 569 0 obj << /S /GoTo /D (subsubsection.7.12.3) >> endobj 572 0 obj (peek\137char/2, peek\137char/1, peek\137code/1, peek\137code/2) endobj 573 0 obj << /S /GoTo /D (subsubsection.7.12.4) >> endobj 576 0 obj (unget\137char/2, unget\137char/1, unget\137code/2, unget\137code/1) endobj 577 0 obj << /S /GoTo /D (subsubsection.7.12.5) >> endobj 580 0 obj (put\137char/2, put\137char/1, put\137code/1, put\137code/2, nl/1, nl/0) endobj 581 0 obj << /S /GoTo /D (subsection.7.13) >> endobj 584 0 obj (Byte input/output) endobj 585 0 obj << /S /GoTo /D (subsubsection.7.13.1) >> endobj 588 0 obj (get\137byte/2, get\137byte/1) endobj 589 0 obj << /S /GoTo /D (subsubsection.7.13.2) >> endobj 592 0 obj (peek\137byte/2, peek\137byte/1) endobj 593 0 obj << /S /GoTo /D (subsubsection.7.13.3) >> endobj 596 0 obj (unget\137byte/2, unget\137byte/1) endobj 597 0 obj << /S /GoTo /D (subsubsection.7.13.4) >> endobj 600 0 obj (put\137byte/2, put\137byte/1) endobj 601 0 obj << /S /GoTo /D (subsection.7.14) >> endobj 604 0 obj (Term input/output) endobj 605 0 obj << /S /GoTo /D (subsubsection.7.14.1) >> endobj 608 0 obj (read\137term/3, read\137term/2, read/2, read/1) endobj 609 0 obj << /S /GoTo /D (subsubsection.7.14.2) >> endobj 612 0 obj (read\137atom/2, read\137atom/1, read\137integer/2, read\137integer/1, \040read\137number/2, read\137number/1) endobj 613 0 obj << /S /GoTo /D (subsubsection.7.14.3) >> endobj 616 0 obj (read\137token/2, read\137token/1) endobj 617 0 obj << /S /GoTo /D (subsubsection.7.14.4) >> endobj 620 0 obj (syntax\137error\137info/4) endobj 621 0 obj << /S /GoTo /D (subsubsection.7.14.5) >> endobj 624 0 obj (last\137read\137start\137line\137column/2) endobj 625 0 obj << /S /GoTo /D (subsubsection.7.14.6) >> endobj 628 0 obj (write\137term/3, write\137term/2, write/2, write/1, writeq/2, writeq/1, \040write\137canonical/2, write\137canonical/1, display/2, display/1, print/2, \040print/1) endobj 629 0 obj << /S /GoTo /D (subsubsection.7.14.7) >> endobj 632 0 obj (format/3, format/2) endobj 633 0 obj << /S /GoTo /D (subsubsection.7.14.8) >> endobj 636 0 obj (portray\137clause/2, portray\137clause/1) endobj 637 0 obj << /S /GoTo /D (subsubsection.7.14.9) >> endobj 640 0 obj (get\137print\137stream/1) endobj 641 0 obj << /S /GoTo /D (subsubsection.7.14.10) >> endobj 644 0 obj (op/3) endobj 645 0 obj << /S /GoTo /D (subsubsection.7.14.11) >> endobj 648 0 obj (current\137op/3) endobj 649 0 obj << /S /GoTo /D (subsubsection.7.14.12) >> endobj 652 0 obj (char\137conversion/2) endobj 653 0 obj << /S /GoTo /D (subsubsection.7.14.13) >> endobj 656 0 obj (current\137char\137conversion/2) endobj 657 0 obj << /S /GoTo /D (subsection.7.15) >> endobj 660 0 obj (Input/output from/to constant terms) endobj 661 0 obj << /S /GoTo /D (subsubsection.7.15.1) >> endobj 664 0 obj (read\137term\137from\137atom/3, read\137from\137atom/2, read\137token\137from\137atom/2) endobj 665 0 obj << /S /GoTo /D (subsubsection.7.15.2) >> endobj 668 0 obj (read\137term\137from\137chars/3, read\137from\137chars/2, read\137token\137from\137chars/2) endobj 669 0 obj << /S /GoTo /D (subsubsection.7.15.3) >> endobj 672 0 obj (read\137term\137from\137codes/3, read\137from\137codes/2, read\137token\137from\137codes/2) endobj 673 0 obj << /S /GoTo /D (subsubsection.7.15.4) >> endobj 676 0 obj (write\137term\137to\137atom/3, write\137to\137atom/2, writeq\137to\137atom/2, \040write\137canonical\137to\137atom/2, display\137to\137atom/2, print\137to\137atom/2, \040format\137to\137atom/3) endobj 677 0 obj << /S /GoTo /D (subsubsection.7.15.5) >> endobj 680 0 obj (write\137term\137to\137chars/3, write\137to\137chars/2, writeq\137to\137chars/2, \040write\137canonical\137to\137chars/2, display\137to\137chars/2, print\137to\137chars/2, \040format\137to\137chars/3) endobj 681 0 obj << /S /GoTo /D (subsubsection.7.15.6) >> endobj 684 0 obj (write\137term\137to\137codes/3, write\137to\137codes/2, writeq\137to\137codes/2, \040write\137canonical\137to\137codes/2, display\137to\137codes/2, print\137to\137codes/2, \040format\137to\137codes/3) endobj 685 0 obj << /S /GoTo /D (subsection.7.16) >> endobj 688 0 obj (DEC-10 compatibility input/output) endobj 689 0 obj << /S /GoTo /D (subsubsection.7.16.1) >> endobj 692 0 obj (Introduction) endobj 693 0 obj << /S /GoTo /D (subsubsection.7.16.2) >> endobj 696 0 obj (see/1, tell/1, append/1) endobj 697 0 obj << /S /GoTo /D (subsubsection.7.16.3) >> endobj 700 0 obj (seeing/1, telling/1) endobj 701 0 obj << /S /GoTo /D (subsubsection.7.16.4) >> endobj 704 0 obj (seen/0, told/0) endobj 705 0 obj << /S /GoTo /D (subsubsection.7.16.5) >> endobj 708 0 obj (get0/1, get/1, skip/1) endobj 709 0 obj << /S /GoTo /D (subsubsection.7.16.6) >> endobj 712 0 obj (put/1, tab/1) endobj 713 0 obj << /S /GoTo /D (subsection.7.17) >> endobj 716 0 obj (Term expansion) endobj 717 0 obj << /S /GoTo /D (subsubsection.7.17.1) >> endobj 720 0 obj (Definite clause grammars) endobj 721 0 obj << /S /GoTo /D (subsubsection.7.17.2) >> endobj 724 0 obj (expand\137term/2, term\137expansion/2) endobj 725 0 obj << /S /GoTo /D (subsubsection.7.17.3) >> endobj 728 0 obj (phrase/3, phrase/2) endobj 729 0 obj << /S /GoTo /D (subsection.7.18) >> endobj 732 0 obj (Logic, control and exceptions) endobj 733 0 obj << /S /GoTo /D (subsubsection.7.18.1) >> endobj 736 0 obj (abort/0, stop/0, top\137level/0, break/0, halt/1, halt/0) endobj 737 0 obj << /S /GoTo /D (subsubsection.7.18.2) >> endobj 740 0 obj (once/1, \('134+\)/1 - not provable, call/2-11, call\137with\137args/1-11, call\137det/2) endobj 741 0 obj << /S /GoTo /D (subsubsection.7.18.3) >> endobj 744 0 obj (repeat/0) endobj 745 0 obj << /S /GoTo /D (subsubsection.7.18.4) >> endobj 748 0 obj (for/3) endobj 749 0 obj << /S /GoTo /D (subsection.7.19) >> endobj 752 0 obj (Atomic term processing) endobj 753 0 obj << /S /GoTo /D (subsubsection.7.19.1) >> endobj 756 0 obj (atom\137length/2) endobj 757 0 obj << /S /GoTo /D (subsubsection.7.19.2) >> endobj 760 0 obj (atom\137concat/3) endobj 761 0 obj << /S /GoTo /D (subsubsection.7.19.3) >> endobj 764 0 obj (sub\137atom/5) endobj 765 0 obj << /S /GoTo /D (subsubsection.7.19.4) >> endobj 768 0 obj (char\137code/2) endobj 769 0 obj << /S /GoTo /D (subsubsection.7.19.5) >> endobj 772 0 obj (lower\137upper/2) endobj 773 0 obj << /S /GoTo /D (subsubsection.7.19.6) >> endobj 776 0 obj (atom\137chars/2, atom\137codes/2) endobj 777 0 obj << /S /GoTo /D (subsubsection.7.19.7) >> endobj 780 0 obj (number\137atom/2, number\137chars/2, number\137codes/2) endobj 781 0 obj << /S /GoTo /D (subsubsection.7.19.8) >> endobj 784 0 obj (name/2) endobj 785 0 obj << /S /GoTo /D (subsubsection.7.19.9) >> endobj 788 0 obj (atom\137hash/2) endobj 789 0 obj << /S /GoTo /D (subsubsection.7.19.10) >> endobj 792 0 obj (new\137atom/3, new\137atom/2, new\137atom/1) endobj 793 0 obj << /S /GoTo /D (subsubsection.7.19.11) >> endobj 796 0 obj (current\137atom/1) endobj 797 0 obj << /S /GoTo /D (subsubsection.7.19.12) >> endobj 800 0 obj (atom\137property/2) endobj 801 0 obj << /S /GoTo /D (subsection.7.20) >> endobj 804 0 obj (List processing) endobj 805 0 obj << /S /GoTo /D (subsubsection.7.20.1) >> endobj 808 0 obj (append/3) endobj 809 0 obj << /S /GoTo /D (subsubsection.7.20.2) >> endobj 812 0 obj (member/2, memberchk/2) endobj 813 0 obj << /S /GoTo /D (subsubsection.7.20.3) >> endobj 816 0 obj (reverse/2) endobj 817 0 obj << /S /GoTo /D (subsubsection.7.20.4) >> endobj 820 0 obj (delete/3, select/3) endobj 821 0 obj << /S /GoTo /D (subsubsection.7.20.5) >> endobj 824 0 obj (permutation/2) endobj 825 0 obj << /S /GoTo /D (subsubsection.7.20.6) >> endobj 828 0 obj (prefix/2, suffix/2) endobj 829 0 obj << /S /GoTo /D (subsubsection.7.20.7) >> endobj 832 0 obj (sublist/2) endobj 833 0 obj << /S /GoTo /D (subsubsection.7.20.8) >> endobj 836 0 obj (last/2) endobj 837 0 obj << /S /GoTo /D (subsubsection.7.20.9) >> endobj 840 0 obj (length/2) endobj 841 0 obj << /S /GoTo /D (subsubsection.7.20.10) >> endobj 844 0 obj (nth/3) endobj 845 0 obj << /S /GoTo /D (subsubsection.7.20.11) >> endobj 848 0 obj (max\137list/2, min\137list/2, sum\137list/2) endobj 849 0 obj << /S /GoTo /D (subsubsection.7.20.12) >> endobj 852 0 obj (sort/2, sort0/2, keysort/2 sort/1, sort0/1, keysort/1) endobj 853 0 obj << /S /GoTo /D (subsection.7.21) >> endobj 856 0 obj (Global variables) endobj 857 0 obj << /S /GoTo /D (subsubsection.7.21.1) >> endobj 860 0 obj (Introduction) endobj 861 0 obj << /S /GoTo /D (subsubsection.7.21.2) >> endobj 864 0 obj (g\137assign/2, g\137assignb/2, g\137link/2) endobj 865 0 obj << /S /GoTo /D (subsubsection.7.21.3) >> endobj 868 0 obj (g\137read/2) endobj 869 0 obj << /S /GoTo /D (subsubsection.7.21.4) >> endobj 872 0 obj (g\137array\137size/2) endobj 873 0 obj << /S /GoTo /D (subsubsection.7.21.5) >> endobj 876 0 obj (g\137inc/3, g\137inc/2, g\137inco/2, g\137inc/1, g\137dec/3, g\137dec/2, g\137deco/2, g\137dec/1) endobj 877 0 obj << /S /GoTo /D (subsubsection.7.21.6) >> endobj 880 0 obj (g\137set\137bit/2, g\137reset\137bit/2, g\137test\137set\137bit/2, g\137test\137reset\137bit/2) endobj 881 0 obj << /S /GoTo /D (subsubsection.7.21.7) >> endobj 884 0 obj (Examples) endobj 885 0 obj << /S /GoTo /D (subsection.7.22) >> endobj 888 0 obj (Prolog state) endobj 889 0 obj << /S /GoTo /D (subsubsection.7.22.1) >> endobj 892 0 obj (set\137prolog\137flag/2) endobj 893 0 obj << /S /GoTo /D (subsubsection.7.22.2) >> endobj 896 0 obj (current\137prolog\137flag/2) endobj 897 0 obj << /S /GoTo /D (subsubsection.7.22.3) >> endobj 900 0 obj (set\137bip\137name/2) endobj 901 0 obj << /S /GoTo /D (subsubsection.7.22.4) >> endobj 904 0 obj (current\137bip\137name/2) endobj 905 0 obj << /S /GoTo /D (subsubsection.7.22.5) >> endobj 908 0 obj (write\137pl\137state\137file/1, read\137pl\137state\137file/1) endobj 909 0 obj << /S /GoTo /D (subsection.7.23) >> endobj 912 0 obj (Program state) endobj 913 0 obj << /S /GoTo /D (subsubsection.7.23.1) >> endobj 916 0 obj (consult/1, '.'/2 - program consult) endobj 917 0 obj << /S /GoTo /D (subsubsection.7.23.2) >> endobj 920 0 obj (load/1) endobj 921 0 obj << /S /GoTo /D (subsubsection.7.23.3) >> endobj 924 0 obj (listing/1, listing/0) endobj 925 0 obj << /S /GoTo /D (subsection.7.24) >> endobj 928 0 obj (System statistics) endobj 929 0 obj << /S /GoTo /D (subsubsection.7.24.1) >> endobj 932 0 obj (statistics/0, statistics/2) endobj 933 0 obj << /S /GoTo /D (subsubsection.7.24.2) >> endobj 936 0 obj (user\137time/1, system\137time/1, cpu\137time/1, real\137time/1) endobj 937 0 obj << /S /GoTo /D (subsection.7.25) >> endobj 940 0 obj (Random number generator) endobj 941 0 obj << /S /GoTo /D (subsubsection.7.25.1) >> endobj 944 0 obj (set\137seed/1, randomize/0) endobj 945 0 obj << /S /GoTo /D (subsubsection.7.25.2) >> endobj 948 0 obj (get\137seed/1) endobj 949 0 obj << /S /GoTo /D (subsubsection.7.25.3) >> endobj 952 0 obj (random/1) endobj 953 0 obj << /S /GoTo /D (subsubsection.7.25.4) >> endobj 956 0 obj (random/3) endobj 957 0 obj << /S /GoTo /D (subsection.7.26) >> endobj 960 0 obj (File name processing) endobj 961 0 obj << /S /GoTo /D (subsubsection.7.26.1) >> endobj 964 0 obj (absolute\137file\137name/2) endobj 965 0 obj << /S /GoTo /D (subsubsection.7.26.2) >> endobj 968 0 obj (decompose\137file\137name/4) endobj 969 0 obj << /S /GoTo /D (subsubsection.7.26.3) >> endobj 972 0 obj (prolog\137file\137name/2) endobj 973 0 obj << /S /GoTo /D (subsection.7.27) >> endobj 976 0 obj (Operating system interface) endobj 977 0 obj << /S /GoTo /D (subsubsection.7.27.1) >> endobj 980 0 obj (argument\137counter/1) endobj 981 0 obj << /S /GoTo /D (subsubsection.7.27.2) >> endobj 984 0 obj (argument\137value/2) endobj 985 0 obj << /S /GoTo /D (subsubsection.7.27.3) >> endobj 988 0 obj (argument\137list/1) endobj 989 0 obj << /S /GoTo /D (subsubsection.7.27.4) >> endobj 992 0 obj (environ/2) endobj 993 0 obj << /S /GoTo /D (subsubsection.7.27.5) >> endobj 996 0 obj (make\137directory/1, delete\137directory/1, change\137directory/1) endobj 997 0 obj << /S /GoTo /D (subsubsection.7.27.6) >> endobj 1000 0 obj (working\137directory/1) endobj 1001 0 obj << /S /GoTo /D (subsubsection.7.27.7) >> endobj 1004 0 obj (directory\137files/2) endobj 1005 0 obj << /S /GoTo /D (subsubsection.7.27.8) >> endobj 1008 0 obj (rename\137file/2) endobj 1009 0 obj << /S /GoTo /D (subsubsection.7.27.9) >> endobj 1012 0 obj (delete\137file/1, unlink/1) endobj 1013 0 obj << /S /GoTo /D (subsubsection.7.27.10) >> endobj 1016 0 obj (file\137permission/2, file\137exists/1) endobj 1017 0 obj << /S /GoTo /D (subsubsection.7.27.11) >> endobj 1020 0 obj (file\137property/2) endobj 1021 0 obj << /S /GoTo /D (subsubsection.7.27.12) >> endobj 1024 0 obj (temporary\137name/2) endobj 1025 0 obj << /S /GoTo /D (subsubsection.7.27.13) >> endobj 1028 0 obj (temporary\137file/3) endobj 1029 0 obj << /S /GoTo /D (subsubsection.7.27.14) >> endobj 1032 0 obj (date\137time/1) endobj 1033 0 obj << /S /GoTo /D (subsubsection.7.27.15) >> endobj 1036 0 obj (host\137name/1) endobj 1037 0 obj << /S /GoTo /D (subsubsection.7.27.16) >> endobj 1040 0 obj (os\137version/1) endobj 1041 0 obj << /S /GoTo /D (subsubsection.7.27.17) >> endobj 1044 0 obj (architecture/1) endobj 1045 0 obj << /S /GoTo /D (subsubsection.7.27.18) >> endobj 1048 0 obj (shell/2, shell/1, shell/0) endobj 1049 0 obj << /S /GoTo /D (subsubsection.7.27.19) >> endobj 1052 0 obj (system/2, system/1) endobj 1053 0 obj << /S /GoTo /D (subsubsection.7.27.20) >> endobj 1056 0 obj (spawn/3, spawn/2) endobj 1057 0 obj << /S /GoTo /D (subsubsection.7.27.21) >> endobj 1060 0 obj (popen/3) endobj 1061 0 obj << /S /GoTo /D (subsubsection.7.27.22) >> endobj 1064 0 obj (exec/5, exec/4) endobj 1065 0 obj << /S /GoTo /D (subsubsection.7.27.23) >> endobj 1068 0 obj (fork\137prolog/1) endobj 1069 0 obj << /S /GoTo /D (subsubsection.7.27.24) >> endobj 1072 0 obj (create\137pipe/2) endobj 1073 0 obj << /S /GoTo /D (subsubsection.7.27.25) >> endobj 1076 0 obj (wait/2) endobj 1077 0 obj << /S /GoTo /D (subsubsection.7.27.26) >> endobj 1080 0 obj (prolog\137pid/1) endobj 1081 0 obj << /S /GoTo /D (subsubsection.7.27.27) >> endobj 1084 0 obj (send\137signal/2) endobj 1085 0 obj << /S /GoTo /D (subsubsection.7.27.28) >> endobj 1088 0 obj (sleep/1) endobj 1089 0 obj << /S /GoTo /D (subsubsection.7.27.29) >> endobj 1092 0 obj (select/5) endobj 1093 0 obj << /S /GoTo /D (subsection.7.28) >> endobj 1096 0 obj (Sockets input/output) endobj 1097 0 obj << /S /GoTo /D (subsubsection.7.28.1) >> endobj 1100 0 obj (Introduction) endobj 1101 0 obj << /S /GoTo /D (subsubsection.7.28.2) >> endobj 1104 0 obj (socket/2) endobj 1105 0 obj << /S /GoTo /D (subsubsection.7.28.3) >> endobj 1108 0 obj (socket\137close/1) endobj 1109 0 obj << /S /GoTo /D (subsubsection.7.28.4) >> endobj 1112 0 obj (socket\137bind/2) endobj 1113 0 obj << /S /GoTo /D (subsubsection.7.28.5) >> endobj 1116 0 obj (socket\137connect/4) endobj 1117 0 obj << /S /GoTo /D (subsubsection.7.28.6) >> endobj 1120 0 obj (socket\137listen/2) endobj 1121 0 obj << /S /GoTo /D (subsubsection.7.28.7) >> endobj 1124 0 obj (socket\137accept/4, socket\137accept/3) endobj 1125 0 obj << /S /GoTo /D (subsubsection.7.28.8) >> endobj 1128 0 obj (hostname\137address/2) endobj 1129 0 obj << /S /GoTo /D (subsection.7.29) >> endobj 1132 0 obj (Linedit management) endobj 1133 0 obj << /S /GoTo /D (subsubsection.7.29.1) >> endobj 1136 0 obj (get\137linedit\137prompt/1) endobj 1137 0 obj << /S /GoTo /D (subsubsection.7.29.2) >> endobj 1140 0 obj (set\137linedit\137prompt/1) endobj 1141 0 obj << /S /GoTo /D (subsubsection.7.29.3) >> endobj 1144 0 obj (add\137linedit\137completion/1) endobj 1145 0 obj << /S /GoTo /D (subsubsection.7.29.4) >> endobj 1148 0 obj (find\137linedit\137completion/2) endobj 1149 0 obj << /S /GoTo /D (subsection.7.30) >> endobj 1152 0 obj (Source reader facility) endobj 1153 0 obj << /S /GoTo /D (subsubsection.7.30.1) >> endobj 1156 0 obj (Introduction) endobj 1157 0 obj << /S /GoTo /D (subsubsection.7.30.2) >> endobj 1160 0 obj (sr\137open/3) endobj 1161 0 obj << /S /GoTo /D (subsubsection.7.30.3) >> endobj 1164 0 obj (sr\137change\137options/2) endobj 1165 0 obj << /S /GoTo /D (subsubsection.7.30.4) >> endobj 1168 0 obj (sr\137close/1) endobj 1169 0 obj << /S /GoTo /D (subsubsection.7.30.5) >> endobj 1172 0 obj (sr\137read\137term/4) endobj 1173 0 obj << /S /GoTo /D (subsubsection.7.30.6) >> endobj 1176 0 obj (sr\137current\137descriptor/1) endobj 1177 0 obj << /S /GoTo /D (subsubsection.7.30.7) >> endobj 1180 0 obj (sr\137get\137stream/2) endobj 1181 0 obj << /S /GoTo /D (subsubsection.7.30.8) >> endobj 1184 0 obj (sr\137get\137module/3) endobj 1185 0 obj << /S /GoTo /D (subsubsection.7.30.9) >> endobj 1188 0 obj (sr\137get\137file\137name/2) endobj 1189 0 obj << /S /GoTo /D (subsubsection.7.30.10) >> endobj 1192 0 obj (sr\137get\137position/3) endobj 1193 0 obj << /S /GoTo /D (subsubsection.7.30.11) >> endobj 1196 0 obj (sr\137get\137include\137list/2) endobj 1197 0 obj << /S /GoTo /D (subsubsection.7.30.12) >> endobj 1200 0 obj (sr\137get\137include\137stream\137list/2) endobj 1201 0 obj << /S /GoTo /D (subsubsection.7.30.13) >> endobj 1204 0 obj (sr\137get\137size\137counters/3) endobj 1205 0 obj << /S /GoTo /D (subsubsection.7.30.14) >> endobj 1208 0 obj (sr\137get\137error\137counters/3) endobj 1209 0 obj << /S /GoTo /D (subsubsection.7.30.15) >> endobj 1212 0 obj (sr\137set\137error\137counters/3) endobj 1213 0 obj << /S /GoTo /D (subsubsection.7.30.16) >> endobj 1216 0 obj (sr\137error\137from\137exception/2) endobj 1217 0 obj << /S /GoTo /D (subsubsection.7.30.17) >> endobj 1220 0 obj (sr\137write\137message/8, sr\137write\137message/6, sr\137write\137message/4) endobj 1221 0 obj << /S /GoTo /D (subsubsection.7.30.18) >> endobj 1224 0 obj (sr\137write\137error/6, sr\137write\137error/4, sr\137write\137error/2) endobj 1225 0 obj << /S /GoTo /D (section.8) >> endobj 1228 0 obj (Finite domain solver and built-in predicates) endobj 1229 0 obj << /S /GoTo /D (subsection.8.1) >> endobj 1232 0 obj (Introduction) endobj 1233 0 obj << /S /GoTo /D (subsubsection.8.1.1) >> endobj 1236 0 obj (Finite Domain variables) endobj 1237 0 obj << /S /GoTo /D (subsection.8.2) >> endobj 1240 0 obj (FD variable parameters) endobj 1241 0 obj << /S /GoTo /D (subsubsection.8.2.1) >> endobj 1244 0 obj (fd\137max\137integer/1) endobj 1245 0 obj << /S /GoTo /D (subsubsection.8.2.2) >> endobj 1248 0 obj (fd\137vector\137max/1) endobj 1249 0 obj << /S /GoTo /D (subsubsection.8.2.3) >> endobj 1252 0 obj (fd\137set\137vector\137max/1) endobj 1253 0 obj << /S /GoTo /D (subsection.8.3) >> endobj 1256 0 obj (Initial value constraints) endobj 1257 0 obj << /S /GoTo /D (subsubsection.8.3.1) >> endobj 1260 0 obj (fd\137domain/3, fd\137domain\137bool/1) endobj 1261 0 obj << /S /GoTo /D (subsubsection.8.3.2) >> endobj 1264 0 obj (fd\137domain/2) endobj 1265 0 obj << /S /GoTo /D (subsection.8.4) >> endobj 1268 0 obj (Type testing) endobj 1269 0 obj << /S /GoTo /D (subsubsection.8.4.1) >> endobj 1272 0 obj (fd\137var/1, non\137fd\137var/1, generic\137var/1, non\137generic\137var/1) endobj 1273 0 obj << /S /GoTo /D (subsection.8.5) >> endobj 1276 0 obj (FD variable information) endobj 1277 0 obj << /S /GoTo /D (subsubsection.8.5.1) >> endobj 1280 0 obj (fd\137min/2, fd\137max/2, fd\137size/2, fd\137dom/2) endobj 1281 0 obj << /S /GoTo /D (subsubsection.8.5.2) >> endobj 1284 0 obj (fd\137has\137extra\137cstr/1, fd\137has\137vector/1, fd\137use\137vector/1) endobj 1285 0 obj << /S /GoTo /D (subsection.8.6) >> endobj 1288 0 obj (Arithmetic constraints) endobj 1289 0 obj << /S /GoTo /D (subsubsection.8.6.1) >> endobj 1292 0 obj (FD arithmetic expressions) endobj 1293 0 obj << /S /GoTo /D (subsubsection.8.6.2) >> endobj 1296 0 obj (Partial AC: \(\043=\)/2 - constraint equal, \(\043'134=\)/2 - constraint not equal, \040\(\043'074\)/2 - constraint less than, \(\043='074\)/2 - constraint less than or equal, \040\(\043'076\)/2 - constraint greater than, \(\043'076=\)/2 - constraint greater than or equal) endobj 1297 0 obj << /S /GoTo /D (subsubsection.8.6.3) >> endobj 1300 0 obj (Full AC: \(\043=\043\)/2 - constraint equal, \(\043'134=\043\)/2 - constraint not equal, \040\(\043'074\043\)/2 - constraint less than, \(\043='074\043\)/2 - constraint less than or equal, \040\(\043'076\043\)/2 - constraint greater than, \(\043'076=\043\)/2 - constraint greater than or equal) endobj 1301 0 obj << /S /GoTo /D (subsubsection.8.6.4) >> endobj 1304 0 obj (fd\137prime/1, fd\137not\137prime/1) endobj 1305 0 obj << /S /GoTo /D (subsection.8.7) >> endobj 1308 0 obj (Boolean and reified constraints) endobj 1309 0 obj << /S /GoTo /D (subsubsection.8.7.1) >> endobj 1312 0 obj (Boolean FD expressions) endobj 1313 0 obj << /S /GoTo /D (subsubsection.8.7.2) >> endobj 1316 0 obj (\(\043'134\)/1 - constraint NOT, \(\043'074='076\)/2 - constraint equivalent, \040\(\043'134'074='076\)/2 - constraint different, \(\043\043\)/2 - constraint XOR, \040\(\043=='076\)/2 - constraint imply, \(\043'134=='076\)/2 - constraint not imply, \040\(\043/'134\)/2 - constraint AND, \(\043'134/'134\)/2 - constraint NAND, \040\(\043'134/\)/2 - constraint OR, \(\043'134'134/\)/2 - constraint NOR) endobj 1317 0 obj << /S /GoTo /D (subsubsection.8.7.3) >> endobj 1320 0 obj (fd\137cardinality/2, fd\137cardinality/3, fd\137at\137least\137one/1, fd\137at\137most\137one/1, \040fd\137only\137one/1) endobj 1321 0 obj << /S /GoTo /D (subsection.8.8) >> endobj 1324 0 obj (Symbolic constraints) endobj 1325 0 obj << /S /GoTo /D (subsubsection.8.8.1) >> endobj 1328 0 obj (fd\137all\137different/1) endobj 1329 0 obj << /S /GoTo /D (subsubsection.8.8.2) >> endobj 1332 0 obj (fd\137element/3) endobj 1333 0 obj << /S /GoTo /D (subsubsection.8.8.3) >> endobj 1336 0 obj (fd\137element\137var/3) endobj 1337 0 obj << /S /GoTo /D (subsubsection.8.8.4) >> endobj 1340 0 obj (fd\137atmost/3, fd\137atleast/3, fd\137exactly/3) endobj 1341 0 obj << /S /GoTo /D (subsubsection.8.8.5) >> endobj 1344 0 obj (fd\137relation/2, fd\137relationc/2) endobj 1345 0 obj << /S /GoTo /D (subsection.8.9) >> endobj 1348 0 obj (Labeling constraints) endobj 1349 0 obj << /S /GoTo /D (subsubsection.8.9.1) >> endobj 1352 0 obj (fd\137labeling/2, fd\137labeling/1, fd\137labelingff/1) endobj 1353 0 obj << /S /GoTo /D (subsection.8.10) >> endobj 1356 0 obj (Optimization constraints) endobj 1357 0 obj << /S /GoTo /D (subsubsection.8.10.1) >> endobj 1360 0 obj (fd\137minimize/2, fd\137maximize/2) endobj 1361 0 obj << /S /GoTo /D (section.9) >> endobj 1364 0 obj (Interfacing Prolog and C) endobj 1365 0 obj << /S /GoTo /D (subsection.9.1) >> endobj 1368 0 obj (Calling C from Prolog) endobj 1369 0 obj << /S /GoTo /D (subsubsection.9.1.1) >> endobj 1372 0 obj (Introduction) endobj 1373 0 obj << /S /GoTo /D (subsubsection.9.1.2) >> endobj 1376 0 obj (foreign/2 directive) endobj 1377 0 obj << /S /GoTo /D (subsubsection.9.1.3) >> endobj 1380 0 obj (The C function) endobj 1381 0 obj << /S /GoTo /D (subsubsection.9.1.4) >> endobj 1384 0 obj (Input arguments) endobj 1385 0 obj << /S /GoTo /D (subsubsection.9.1.5) >> endobj 1388 0 obj (Output arguments) endobj 1389 0 obj << /S /GoTo /D (subsubsection.9.1.6) >> endobj 1392 0 obj (Input/output arguments) endobj 1393 0 obj << /S /GoTo /D (subsubsection.9.1.7) >> endobj 1396 0 obj (Writing non-deterministic C code) endobj 1397 0 obj << /S /GoTo /D (subsubsection.9.1.8) >> endobj 1400 0 obj (Example: input and output arguments) endobj 1401 0 obj << /S /GoTo /D (subsubsection.9.1.9) >> endobj 1404 0 obj (Example: non-deterministic code) endobj 1405 0 obj << /S /GoTo /D (subsubsection.9.1.10) >> endobj 1408 0 obj (Example: input/output arguments) endobj 1409 0 obj << /S /GoTo /D (subsection.9.2) >> endobj 1412 0 obj (Manipulating Prolog terms) endobj 1413 0 obj << /S /GoTo /D (subsubsection.9.2.1) >> endobj 1416 0 obj (Introduction) endobj 1417 0 obj << /S /GoTo /D (subsubsection.9.2.2) >> endobj 1420 0 obj (Managing Prolog atoms) endobj 1421 0 obj << /S /GoTo /D (subsubsection.9.2.3) >> endobj 1424 0 obj (Reading Prolog terms) endobj 1425 0 obj << /S /GoTo /D (subsubsection.9.2.4) >> endobj 1428 0 obj (Unifying Prolog terms) endobj 1429 0 obj << /S /GoTo /D (subsubsection.9.2.5) >> endobj 1432 0 obj (Creating Prolog terms) endobj 1433 0 obj << /S /GoTo /D (subsubsection.9.2.6) >> endobj 1436 0 obj (Testing the type of Prolog terms) endobj 1437 0 obj << /S /GoTo /D (subsubsection.9.2.7) >> endobj 1440 0 obj (Comparing Prolog terms) endobj 1441 0 obj << /S /GoTo /D (subsubsection.9.2.8) >> endobj 1444 0 obj (Copying Prolog terms) endobj 1445 0 obj << /S /GoTo /D (subsubsection.9.2.9) >> endobj 1448 0 obj (Comparing and evaluating arithmetic expressions) endobj 1449 0 obj << /S /GoTo /D (subsection.9.3) >> endobj 1452 0 obj (Raising Prolog errors) endobj 1453 0 obj << /S /GoTo /D (subsubsection.9.3.1) >> endobj 1456 0 obj (Managing the error context) endobj 1457 0 obj << /S /GoTo /D (subsubsection.9.3.2) >> endobj 1460 0 obj (Instantiation error) endobj 1461 0 obj << /S /GoTo /D (subsubsection.9.3.3) >> endobj 1464 0 obj (Type error) endobj 1465 0 obj << /S /GoTo /D (subsubsection.9.3.4) >> endobj 1468 0 obj (Domain error) endobj 1469 0 obj << /S /GoTo /D (subsubsection.9.3.5) >> endobj 1472 0 obj (Existence error) endobj 1473 0 obj << /S /GoTo /D (subsubsection.9.3.6) >> endobj 1476 0 obj (Permission error) endobj 1477 0 obj << /S /GoTo /D (subsubsection.9.3.7) >> endobj 1480 0 obj (Representation error) endobj 1481 0 obj << /S /GoTo /D (subsubsection.9.3.8) >> endobj 1484 0 obj (Evaluation error) endobj 1485 0 obj << /S /GoTo /D (subsubsection.9.3.9) >> endobj 1488 0 obj (Resource error) endobj 1489 0 obj << /S /GoTo /D (subsubsection.9.3.10) >> endobj 1492 0 obj (Syntax error) endobj 1493 0 obj << /S /GoTo /D (subsubsection.9.3.11) >> endobj 1496 0 obj (System error) endobj 1497 0 obj << /S /GoTo /D (subsection.9.4) >> endobj 1500 0 obj (Calling Prolog from C) endobj 1501 0 obj << /S /GoTo /D (subsubsection.9.4.1) >> endobj 1504 0 obj (Introduction) endobj 1505 0 obj << /S /GoTo /D (subsubsection.9.4.2) >> endobj 1508 0 obj (Example: my\137call/1 - a call/1 clone) endobj 1509 0 obj << /S /GoTo /D (subsubsection.9.4.3) >> endobj 1512 0 obj (Example: recovering the list of all operators) endobj 1513 0 obj << /S /GoTo /D (subsection.9.5) >> endobj 1516 0 obj (Defining a new C main\(\) function) endobj 1517 0 obj << /S /GoTo /D (subsubsection.9.5.1) >> endobj 1520 0 obj (Example: asking for ancestors) endobj 1521 0 obj << /S /GoTo /D (subsubsection.9.5.1) >> endobj 1523 0 obj (References) endobj 1524 0 obj << /S /GoTo /D (section*.3) >> endobj 1527 0 obj (Index) endobj 1528 0 obj << /S /GoTo /D [1529 0 R /Fit ] >> endobj 1531 0 obj << /Length 375 /Filter /FlateDecode >> stream xÚuRËNÃ0¼÷+|L¤Æøý8Rú*ÔVNˆC )XJ”†¢òõ¬í*!ä‹g׳;;ÞI9ºšSƒÁJ1‰ÊR[Ê’Šc£¤@åö1[¬ò‚k‘mîrN³õíz‘?•ËѬQDàÐ_ž°˜h©ÐË~2Br,çHB ËQW£Ý©8³ŠKÚ$ª²ˆ Ì…bA•VXPÃd ÍUTu š˜ÊVUïŽ93Y°Î6]›Ó¬i_Sú¦Ý¿»¦îútýÛ9î}WÁSçs õ)|ß6GçnÊCöÌŸ;ïú:ݧíØ•ó‡`¢FbKŒAÕØrf¢ÈÙÖõ®õ‰Aá=6ãvyA³ u(½8 †hBn2h8¸óiÎXŒc’šKƒ¹Ñà$¿½—•|TÝ)•@'6ƒ+!:ã \˜]p)±!ð=\̬f±ÚsøúSÚƒiÐZyW7ƒ.¾þÛ –peôŸ­`Ø@Û´ßé—¨endstream endobj 1529 0 obj << /Type /Page /Contents 1531 0 R /Resources 1530 0 R /MediaBox [0 0 612 792] /Parent 1541 0 R /Annots [ 1540 0 R ] >> endobj 1540 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [86.333 119.8688 171.0901 134.6135] /Subtype/Link/A<> >> endobj 1532 0 obj << /D [1529 0 R /XYZ 64.9134 727.2935 null] >> endobj 1533 0 obj << /D [1529 0 R /XYZ 64.9134 702.3869 null] >> endobj 1530 0 obj << /Font << /F18 1536 0 R /F19 1539 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1544 0 obj << /Length 822 /Filter /FlateDecode >> stream xÚUMo›@½çWp)vÙc8&is¨T©RÜS“ÃÚ`³ °¬“¦¿¾óÁ+õbvfvgfß{;¾Ý\}ºÏƒbYd: 6û K—…JÒ@åÙ2Ó©6åÏðÎ#‡o}¤B{¨qí£E’$ác¼ŠïàG¡™†ª(Š…Žã5G?›ÎV¬­ù=m¾q°Ð ‰SÊý³U}k‡!Z@z×E ½JC;àwzÓEº}…á’ƒÞq°5Ïtœ-ÓI¸´ƒï-4»=Á§p¾p¥-¸Œ·-ŸÙ9L{Ä‹UR‘<{)TcD-¸›“i؇'{‡™_l ë³.kv`ñÝEqWç¼ÝU#4J-‹ÕJ4tŸ$Ñ[@pæ\è /'""L/ ꯢ½UÏ”|b0·c(̺âÅ}”ã#?`Ï{_nÓG“Âa'h÷DÄ3לdüû¤-Üçscå±`N/ïí­Z¬Æ ³¥ìº%bï:q|ƒØ —ˆµRñB%±’؇zFW_6WLß endstream endobj 1543 0 obj << /Type /Page /Contents 1544 0 R /Resources 1542 0 R /MediaBox [0 0 612 792] /Parent 1541 0 R /Annots [ 1549 0 R ] >> endobj 1549 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [137.8345 52.1839 251.6856 63.0321] /Subtype/Link/A<> >> endobj 1545 0 obj << /D [1543 0 R /XYZ 64.9134 727.2935 null] >> endobj 1542 0 obj << /Font << /F8 1548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1552 0 obj << /Length 1891 /Filter /FlateDecode >> stream xÚí›Ks›8Àïþí=‘Ž}¤vv»Ù;{h{ 6qØp7É~úÕ_ štf·³¹$²°…øéÿ–x±œ={-<H޹·¼ò8 $"Ô‹H"o¹þ8ùÛûåÙûåÅâóòG©Ç^¨/!è›-gHu„: €y@%gÞ*›}™}üzëYè½›…A$#ïVµÃ€HÁ¼lF %Äõlg³ß›}7¢ßòL Ñ€P5›ÖÔ¹ÄÅ”˜© ÍóAó:±M<¯¡UÁÔŸ½Æ¨õø¡çc¤†‰¤}:_b6¾‚ßßä 4/ u«[=ÚZµ6º•%fäÊBЍ°”¤îô›^{¡/bs“·æ÷¥š°ú¿Þ¯ê´Èí`8'9r£ÙîÎhÄŒö¡R3KõoÔ€‚Ìß¼ÿ`çe±-6ƒ#ƒ¤->ÅQ€(V·Aê6Œas›@±A!Æ0o,Ô¼5_5×{Õ\Á­ë:suÛP̃…ϰÿJù¯_{ C#ŒC»" –>²ð±…¿¼VÂG¿Q¤õ«ö¹j›5VÉ<5 ¤:µ –±’¬¯Ð•t®'å®tßQ¾é“‚ˆ±ÒŠŽåkIf”Î/€Q\Ö)(úæ™&q"¬z,ËúÚ Ì ·.PuafF_ÓÀÕÇ#´œ¢ŸIꨰEÕÈ]ëYý€`x:8ù¹LͳÁƒ%õ¡•Ü%z°"æ»þm™ÖVX·ÆÆ;eæ†êG¢#zKèe‘Wû­†á„'6ÿÎ[º©‘›2ÎÀêã'iÂø˜0Q‹ê­Ö|§½F‡Q]û¤¼³×ñ%§á¢1„ìX·Zଲ4!JZ p4š|k‹ª0qÔ‘_pªL¬‹}¾þ „¯²nÁ`nû*ý[Û-ü¸:h9D?öU­¬#Žæ7 <ýEO™¬–WúQ˪Ȁ*Èt >S… §-¯8üVC›0æUú)D$)mºƒ%¤;@øFÛ†µ‘@èp²º²{¢ú)¡§F´çÅiç¼lKa|Èg´ .¬Às]'™3>máì«|}¨ZQ´5–:Ð+²]ºm²H_é©BÄc]¨ôÇœP~pE*BÊ[ξ;Ç—–*—ât²1•v¡Ò›$W©JÝAhÌaî„ðö(1î%xƪ¶²»ÄdÌ‚þ„ˆRÆ£ÉkGä2ãµ®4‹·6{iÒ7dê«q}ˆŒò8³­$w>Æ÷\ü¿!ñê ²ï`u+nÔTÜ^%—ûÍlÜ@e ËGWÖèTYû! <£Ò~eͤèšÿ*Yï˃x_ªÎH-úsg"³ëäÔBéID'Й6ùè ˜âM ›N±“(L ç&1 Ö6š­‹Ý®]¬jb´µ[ŸQ"žšÒ“&àÿ%‰u`Ýf±3Š^Ö…|’½QŽhw÷_ì Xº÷w¦pkc'E’GbrOpõG”šŽÏL«i¥…8ހьš÷£aSÀŽÉ¶·+lQ*‹]…ñhbû [gøqlõç!<þ눧‰žèöéâ¡ÔÑ@RÚÍL˜ÉL^/$WÞK¡Íl†¦ÏèêŸÊX×ɧÑ<­õq"‡â &”Ì ë'-î6m¥aMÆbrk›^uoÉE4å&\áÁ rÈ ïCMl-7†¨Îsšy¡ƒSÓ¥óïeŽ,s—¦œ•:,Á¡žÿ|4ž½°Vöò-Ûbë 4•¹²h¸Ù~[§Wé6Z T<­Fÿš±Cæh­/y@˜}M`›£´RN¼N7ûb_ ­P).‘'¾FÚ-m„dÀCÊû¸ùƒ¸“¼Ú—Éñëå( N¹Ð>›Pѽ\¿BnÞ/GRb/›©°™ì>½]Þ è·FÔo—wæ†"µ¸j`÷%˜á6Ío’õ iÊlÐ$ Jˆ[ÂeÒ‹endstream endobj 1551 0 obj << /Type /Page /Contents 1552 0 R /Resources 1550 0 R /MediaBox [0 0 612 792] /Parent 1541 0 R /Annots [ 1554 0 R 1558 0 R 1559 0 R 1560 0 R 1561 0 R 1562 0 R 1563 0 R 1564 0 R 1565 0 R 1566 0 R 1567 0 R 1568 0 R 1569 0 R 1570 0 R 1571 0 R 1572 0 R 1573 0 R 1574 0 R 1575 0 R 1576 0 R 1577 0 R 1578 0 R 1579 0 R 1580 0 R 1581 0 R 1582 0 R 1583 0 R 1584 0 R 1585 0 R 1586 0 R 1587 0 R 1588 0 R 1589 0 R 1590 0 R 1591 0 R 1592 0 R 1593 0 R 1594 0 R 1595 0 R 1596 0 R 1597 0 R 1598 0 R 1599 0 R 1600 0 R 1601 0 R 1602 0 R 1603 0 R 1607 0 R 1608 0 R 1609 0 R 1610 0 R ] >> endobj 1554 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 667.573 175.9839 678.4212] /Subtype /Link /A << /S /GoTo /D (section.1) >> >> endobj 1558 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 647.5924 144.0192 656.5034] /Subtype /Link /A << /S /GoTo /D (section.2) >> >> endobj 1559 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 623.7374 176.8072 634.5856] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 1560 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 613.7194 158.3134 622.6304] /Subtype /Link /A << /S /GoTo /D (subsection.3.1) >> >> endobj 1561 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 599.827 277.3532 610.6752] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 1562 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 587.3184 325.4647 599.2735] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.1) >> >> endobj 1563 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 575.9167 360.6383 586.7649] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.2) >> >> endobj 1564 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 563.9615 266.6573 574.8097] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.3) >> >> endobj 1565 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 552.0063 228.8269 562.7438] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.4) >> >> endobj 1566 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 541.9884 204.4183 550.8994] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.5) >> >> endobj 1567 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 528.096 254.9788 538.9442] /Subtype /Link /A << /S /GoTo /D (subsection.3.3) >> >> endobj 1568 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 516.1408 219.1547 526.989] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj 1569 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 506.1229 242.3041 515.0339] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.1) >> >> endobj 1570 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 492.2305 227.4155 503.0787] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.2) >> >> endobj 1571 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 480.2753 221.9083 491.1235] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 1572 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 468.3202 239.6751 479.1684] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.4) >> >> endobj 1573 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 456.365 315.2944 467.1025] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.5) >> >> endobj 1574 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 444.4098 325.0772 455.258] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.6) >> >> endobj 1575 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 422.492 134.3541 433.3402] /Subtype /Link /A << /S /GoTo /D (section.4) >> >> endobj 1576 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 412.474 158.3134 421.385] /Subtype /Link /A << /S /GoTo /D (subsection.4.1) >> >> endobj 1577 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 398.5817 215.903 409.4299] /Subtype /Link /A << /S /GoTo /D (subsection.4.2) >> >> endobj 1578 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 386.6265 197.2507 397.4747] /Subtype /Link /A << /S /GoTo /D (subsection.4.3) >> >> endobj 1579 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 374.6713 296.49 385.5195] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 1580 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 362.7162 203.8372 373.5644] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.2) >> >> endobj 1581 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 350.761 185.6277 361.4985] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 1582 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 338.8058 192.3524 349.654] /Subtype /Link /A << /S /GoTo /D (subsection.4.4) >> >> endobj 1583 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 326.8507 194.4833 337.6989] /Subtype /Link /A << /S /GoTo /D (subsection.4.5) >> >> endobj 1584 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 314.8955 192.6291 325.7437] /Subtype /Link /A << /S /GoTo /D (subsection.4.6) >> >> endobj 1585 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 294.9149 185.7735 303.8259] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 1586 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 282.9597 170.0333 291.8707] /Subtype /Link /A << /S /GoTo /D (subsection.5.1) >> >> endobj 1587 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 269.0673 180.2589 279.9155] /Subtype /Link /A << /S /GoTo /D (subsection.5.2) >> >> endobj 1588 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 259.0493 131.1651 267.8497] /Subtype /Link /A << /S /GoTo /D (subsection.5.3) >> >> endobj 1589 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 247.0942 285.1297 256.0052] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 1590 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 235.139 220.0265 243.9393] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.2) >> >> endobj 1591 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 221.2467 186.4855 231.9842] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.3) >> >> endobj 1592 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 211.2287 198.247 220.029] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.4) >> >> endobj 1593 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 199.2735 205.4976 208.0738] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.5) >> >> endobj 1594 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 187.3183 211.1154 196.1187] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.6) >> >> endobj 1595 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 173.426 229.325 184.1635] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.7) >> >> endobj 1596 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 163.408 210.9771 172.319] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.8) >> >> endobj 1597 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 151.4528 203.0346 160.2531] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.9) >> >> endobj 1598 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 137.5605 194.2343 148.298] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.10) >> >> endobj 1599 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 125.6053 195.3966 136.3428] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.11) >> >> endobj 1600 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 103.6875 281.3549 114.5357] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 1601 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 91.7323 176.5229 102.5805] /Subtype /Link /A << /S /GoTo /D (subsection.6.1) >> >> endobj 1602 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 81.7143 194.179 90.6254] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.1) >> >> endobj 1603 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 67.5452 186.7065 78.6702] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.2) >> >> endobj 1607 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 55.5901 181.4761 66.715] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.3) >> >> endobj 1608 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 45.0186 197.1671 54.7599] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.4) >> >> endobj 1609 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 31.6797 218.0885 42.8047] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.5) >> >> endobj 1610 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 21.1083 216.624 30.8495] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.6) >> >> endobj 1553 0 obj << /D [1551 0 R /XYZ 64.9134 682.5585 null] >> endobj 1550 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1613 0 obj << /Length 2945 /Filter /FlateDecode >> stream xÚíÉrãÆõ®¯`N¦ªŒVïK2šJœŒ«âƒãÔ¨rñø‘‡4 8ùëóº±$H¢’²ˆ)zýöøîîêæ{=3ÈH*gw3É‘!ŒÏÃHkLfwËŸçôú—»fÌHd¸13ì.þõ?Þ}øñî£ýíêÃÝëxF^!P‰¸‘b¶X_}¾úù<[^áÙW)£f_á;FÌh1[_qÁàŒUWVW¯þY *ˆAäwû˜L‘RD̤¡ˆSΖ¤,Š7ßSÚ¸› ¤¥%-÷Ûx•ïB¤@œHþ °E‰Ã¶ …C†Ó´ú{bÐé(ÙAŽH„àj—”8¹Á%M²)F†Vò­‡T‰°Ö쥔RÄ8“ãQZCì¡”Ràˆ&ºE)颔ŸG©2ˆ*¬G¤´‚ØG©†_±Ù'´… a âŠˆ`±A0oÉÄžý<,»•îœsù?!ç÷ º/„ 5’÷ÚB0½Bˆ’Í6‹Z1Oa$¹ÿhCaæü˜WA š =1O1Pzñz°Er•†ËÈ«÷î2„\¸¢ì(!I ÆSj©µà^uHŸo˜Ç»ZOæxhB)®Å9ø}£$¤W*‹§0k§¥`hZÚD¢ †ëü´´„4AúÒR†˜ GõmÇ4ùe›8Mnh[ƒ¤Dc~©´k T!È=<îšÐ^UØDíEp œ5£àc5?_*ˆA¤G„FØð׃-†ÏYºJ[HBž@¬®Œ‡d±IH|)'fˇUøèSTŠª©¹lE;ŠÊ<ŠÊdwq‡«ø·0·>Á» šOɉÕŸÐÚ¼—ÕiÅ^¿ËdçŒ ­Ð*H¾”œ!MÙyð]ù@øVÒÖ”»¦@á>Léü§ìšÌß có\ž§É5Õó~¸{Ì7ö[nÿk»ÈíøD4ßN¢$«)E†pÒb4êO“òlùÚŒ FÚ@¯Î‡òo¿„#jÄåy¼¦|B#âñž«£¨?ûù„þæÛoàƒxƒ7|e¬A`mŽÛÄôWkfÖêœýå±µÕÄ+BÈlkžö§®³lM¤¨Ü=k ãͯ³ì…޳  –D4Î ÞwÆ‘ÂuVRfÉxò§(¹¶ûèÒ. ¥¢”•alÚNõ§‹pµò…¦ 9S|*-‚.„¢ (H k‹ƒG¾xò•úÿJB·tó§,ýêmÌ„™fSc¦’p‘4ø5–BÜvŸ Ò#J;F©ëÀPéD™Kh>¿·Î+¶f¸Êû'ö…V´ŒAöZ)ƒ‚ιi ƒ@9·ßzPP‹ÜåΦ)/Ï×|DEž’Gè&­#{t÷éÉ8KgŒ/!ï¤3_ÂÌÛꇪ@5ÔB“4é&ª9 (Ìӵ׃•ÅI=F~|ެUVi˜{r.lð(4ٮ/NÆËUj×Féú9Ý&ËŽ üÏ`Gmãox¿ŠFµŠ7ùùŠðf¶?ж1ŒÃzÆ ØˆÒçOjˆA¤gÜÆ@Ò¼ÜO+9†e-J d¼ö–ñ(­ öQjâTÊ]RÓV‹™c‰á#Ê¢†Øƒ!ÇI¾`Õá\"mš7Ÿf±M!Ë!l Î»ò"Z)Q‘$á8$Q¤¬i¬!òGÙº(¶ž“ø&¼*8²â¸´äSî Ò ÒCz¶n»=ªFü©hU­"W+Ÿâo8).9ïÆbÖ÷Õ}@3`›Ä/ÛZ\d».6Þ¶Väm­ú6‹ä×8꜅Œ‡c= éÁ±š…ìà˜.ÛlÓÞˆ "ÆÃ²†Øƒ%¥¢«Ùãäâ)ZüÛÛãÆ`eúmî4½h"$F²¶±°A~ê°òö¨“õMi^8*[“Ú?=¡Çf–6@ù&”]ÓTîÇæÉ6i³¸êñ[W.à¦)÷(9énÿ«]·Bp>ÿhœ0Y†vv²,Ûi––4³=X×¾°7ÄIfÓ‡ª³‘­m¯DÒ7Å6Üfذnúíq!/ÕœÍãeTÌ·b(-}bˆIföýÏíQÍû×ó’Êŵ€Ëóë¼É‹FåÂïewŸ?¿;‘öUÑ۔ןœFzyÀ‘uèμ}w"¼‡VJ_|º;>Û~aeyÚÁ»Ñµ?Îtø½?‘'Yæ¥ÝGw³²öº T{ª^tÛÏ["ÉfÂ¥Éc¤Áÿ·MoÀ8ĉÈןv_‡ÅfZ­;$ì6Ú^pæÞàüìŠ/×ê^”öäB„Ñfbn_¨¡‡"4P,?l“Ežf“ÖŸ­õÞo+„þ¨fÓŽïÈ–Á¼;¾µ+XŸÝ"tT,J°/àÍ„zÓL>ÖHJq(ÛpÕ¦m$æãéóKçÆ5xZ>âÆuäëú67{‡¨æÕ OžÔ»Ñbµ\Ã61¯¥bȶõ¢üì‘a È ¤È‚^æªX%"·_NZ}Q¦vÿ²©ëÄáýª¨ ]×*\‹ 7e•hæÛµ­ï‹‡¬ZkàŠ^jÄ\®•Fˆ¹09êô\/¸B3¢‡l‚<à!ëÛœyAn¿Šò´ýx-Ћ©Ï `š”@š,ÝEóK˜m¼Cƒ(¾ˆÝ¸"lW»Ö#a ik%=S+íþ"ÃjL­l€<¤•ÕmÇÏÛ({éœ ‡d=êA²š í étrz>Æ»+>cµ?ß¿“e·¢B5Œ•ó‘¾&ÈCŠZÝVê€ ¬‘WÐɘ>nËÊi•'Û‘Ô>]q,â}Ô§ÿ¿×,T¥Zøjd[Uúk×ëìT_(³i‚<¤*ÕmÇ,z˜J‘ãKõúÈ6U´U©Ê2Ñý‹'æOë¨~~aa«~6UýçäÀêÐò¬'޾\ 9W¶ÝRîæ4'ŠÕ¨¡(DÜôaíV²óxQÔ#Ñ\Û¹ê7»å®~wŒjÍåÀc¼9j¦UüvszzS2Ñ Õ & bÞdûª\TK-Ú\ØMüãq#µJ× ÅýlÇeÄ‘5Cu·¸X‚;¸]2ðÄ×…wúu÷TÂâR¶§ºïŽÚÆóà O=d “ò xlBš#ÌÛã¦Éýï0Kf”¿[6uò…iiÚ“Ý÷çòå1«ï`˜õ°µ“CÀ»ÃÛTÉ÷·ç²¨‡>f]fg9ÉYš,÷{(³Âí^ *ãïß^,‘¡sëeðu›>î¡ûËvS¶žÖa>:üÖåzDíë/)´Êƒ{µª­/x”‚¯ËíÞSšÞ¨)yéâp+&«!ÀÍ&Êòp„gp H¿u¿/@\Øûd¹B8EZ`ÑOð΢< ùô^´“3(韒¿ú>TO-Km[fÓ°¼í–ª­Ìi½в¾º¶XÙxêÝôæÈ˜Iûº¢r ®10—ȶ$d ¸OWñæiòD§{"vxKM7ßãòF÷ ‰EYúò¹U>¤Ùºì<L§4¨áoø¡4=`޹ØfY”´_ª¦à.¥ˆ}M‡2tŒ`–ƒDßû/ ÂD°úÜâ•jÅ“þQG¿[b©.-Ñâ‡-= ®ÙÚ¾–ˆ1¥íëE5S#Ìâ*€A¢GøÚ–â²>¶|Þ3äØ/ÞŒDä’|p!ùÝWrµ›©šæ«rÓ{“®¶e5Y¼%cj—Ÿäj塚ÞL5ýH¶Žè¿ÉðUendstream endobj 1612 0 obj << /Type /Page /Contents 1613 0 R /Resources 1611 0 R /MediaBox [0 0 612 792] /Parent 1541 0 R /Annots [ 1614 0 R 1615 0 R 1616 0 R 1617 0 R 1618 0 R 1619 0 R 1620 0 R 1621 0 R 1622 0 R 1623 0 R 1624 0 R 1625 0 R 1626 0 R 1627 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R 1632 0 R 1633 0 R 1634 0 R 1635 0 R 1636 0 R 1637 0 R 1638 0 R 1639 0 R 1640 0 R 1641 0 R 1642 0 R 1643 0 R 1644 0 R 1645 0 R 1646 0 R 1647 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R 1652 0 R 1653 0 R 1654 0 R 1655 0 R 1656 0 R 1657 0 R 1658 0 R 1659 0 R 1660 0 R 1661 0 R 1662 0 R 1663 0 R 1664 0 R 1665 0 R 1666 0 R 1667 0 R 1668 0 R 1669 0 R ] >> endobj 1614 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 689.4908 389.7068 700.339] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.7) >> >> endobj 1615 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 678.6427 186.7065 688.3839] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.8) >> >> endobj 1616 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 666.6875 216.624 676.4287] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.9) >> >> endobj 1617 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 653.3486 160.5547 664.4735] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.10) >> >> endobj 1618 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 642.7771 227.0847 652.5184] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.11) >> >> endobj 1619 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 629.4382 225.6202 640.5632] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.12) >> >> endobj 1620 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 618.8668 223.3188 628.608] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.13) >> >> endobj 1621 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 605.5279 239.8678 616.6529] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.14) >> >> endobj 1622 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 593.8495 213.4124 604.6977] /Subtype /Link /A << /S /GoTo /D (subsection.6.2) >> >> endobj 1623 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 581.8943 230.2651 592.7425] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.1) >> >> endobj 1624 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 569.9391 402.9233 580.7873] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.2) >> >> endobj 1625 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 559.091 171.0154 568.8322] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 1626 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 546.0288 218.9464 556.877] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.4) >> >> endobj 1627 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 524.111 209.0957 534.9592] /Subtype /Link /A << /S /GoTo /D (section.7) >> >> endobj 1628 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 512.1558 158.8945 522.8933] /Subtype /Link /A << /S /GoTo /D (subsection.7.1) >> >> endobj 1629 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 499.9239 519.453 511.0489] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.1.1) >> >> endobj 1630 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 487.9687 482.4096 499.0937] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.1.1) >> >> endobj 1631 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 478.2275 176.0247 487.1385] /Subtype /Link /A << /S /GoTo /D (subsection.7.2) >> >> endobj 1632 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 464.3351 253.4012 475.1833] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.2.1) >> >> endobj 1633 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 452.1032 265.9984 463.2282] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.2.2) >> >> endobj 1634 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 440.4248 267.4872 451.273] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.2.3) >> >> endobj 1635 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 428.4696 179.4286 439.2071] /Subtype /Link /A << /S /GoTo /D (subsection.7.3) >> >> endobj 1636 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 416.5145 281.7674 427.3627] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.1) >> >> endobj 1637 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 404.5593 519.453 415.4075] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.2) >> >> endobj 1638 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 392.6041 519.453 403.4523] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.2) >> >> endobj 1639 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 380.649 439.4532 391.4972] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.2) >> >> endobj 1640 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 368.4171 186.7065 379.542] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.3) >> >> endobj 1641 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 356.7386 174.7794 367.4761] /Subtype /Link /A << /S /GoTo /D (subsection.7.4) >> >> endobj 1642 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 345.8905 186.7065 355.6317] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.4.1) >> >> endobj 1643 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 332.5515 165.7851 343.6765] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.4.2) >> >> endobj 1644 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 321.9801 205.3035 331.7213] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.4.3) >> >> endobj 1645 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 308.6412 195.7026 319.7662] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.4.4) >> >> endobj 1646 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 296.686 229.4071 307.811] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.4.5) >> >> endobj 1647 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 284.4541 226.4192 296.4093] /Subtype /Link /A << /S /GoTo /D (subsection.7.5) >> >> endobj 1648 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 272.7757 246.5415 283.9007] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.5.1) >> >> endobj 1649 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 260.8205 225.6202 271.9455] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.5.2) >> >> endobj 1650 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 249.1421 359.5591 259.9903] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.5.3) >> >> endobj 1651 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 238.2939 190.4723 248.0352] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.5.4) >> >> endobj 1652 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 227.169 151.1181 236.08] /Subtype /Link /A << /S /GoTo /D (subsection.7.6) >> >> endobj 1653 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 213.2766 307.9194 224.1248] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 1654 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 201.3214 264.6921 212.1697] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.2) >> >> endobj 1655 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 189.3663 519.453 200.2145] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.3) >> >> endobj 1656 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 177.4111 519.453 188.2593] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.3) >> >> endobj 1657 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 165.4559 477.6989 176.3041] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.3) >> >> endobj 1658 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 153.5008 230.4319 164.349] /Subtype /Link /A << /S /GoTo /D (subsection.7.7) >> >> endobj 1659 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 143.4828 194.179 152.3938] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 1660 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 129.5904 239.8678 140.4386] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.2) >> >> endobj 1661 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 118.7423 186.7065 128.4835] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.3) >> >> endobj 1662 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 106.7871 202.3975 116.5283] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.4) >> >> endobj 1663 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 94.8319 181.4761 104.5731] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.5) >> >> endobj 1664 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 82.8768 186.7065 92.618] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.6) >> >> endobj 1665 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 71.7518 198.8835 80.6628] /Subtype /Link /A << /S /GoTo /D (subsection.7.8) >> >> endobj 1666 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 57.5827 237.5453 68.7076] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.8.1) >> >> endobj 1667 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 45.6275 242.7757 56.7525] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.8.2) >> >> endobj 1668 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 35.8863 158.3964 44.7973] /Subtype /Link /A << /S /GoTo /D (subsection.7.9) >> >> endobj 1669 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 23.9311 194.179 32.8421] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.9.1) >> >> endobj 1611 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1672 0 obj << /Length 3963 /Filter /FlateDecode >> stream xÚí]Ks7¾ëWð(U-! ñ¾&•TmÙÚŠn©‰vT–H‡¢v×ÿ~CƒÑ`º¦•‡Ä‹-ÓÐǯýÆc¾¹¹¸þÞ-<óÌâæÃÂ(æ…T +9sŽ‹ÅÍÝÏ—ßþëÇ›ï~¼ùéê—›J9¦ ,x÷_2|vñÝÍ…ÀøBô`˜òF/n/~¿øù¾¸»à‹.8³Þ.þ‹?s&½Ó‹Ç ¥%ÓJÊøÉÃÅOÿN€Ëˆ¸Ì!¿yI\p`Ö ½0˜%;z–yâõ÷Ùh©™3Ú…øp¿¹[=<\ËÃÈV#ªRq »Zjγ¿”÷ãgþßß Z€ð—Ætº±tŽœ‰ÅR浆4 ²9 ¿®>n?”¦@ÄuöaÜ9yð´Þ—q”`\¦aïu*Ó%0-œ}9_‚ãx€ËŸöWâr·Æßº\=>]¡¾5íý£¡à#4¶{üèØ”ˆ_¤‡ÏäJ]þssîr¿ÃYØ^-ñÇ»güñ6ÌÇþ>|¸A|oÏxêó±fŸnŸw»õfÿ2´ ‹£0Æ`ŒSÌpiƱ­‹_‡à&¼ n’ é þûEhKˆË²‹mzÂzÆ…–ý7š÷›ÏÏûkQðt’IÃÝÙÓ¡§óGO'<>8 äc}óõA3Ê)J}È kú‡šÛçý„Bh‚zõ^b¨ `™Ô š šš€ÉÅH ´ 0na€3ã1­q™C´@;f5ª;…þyÎdKú"ÆQ?¼Aõp® zžzpǬt‚R=2ÈŠzÄQueuÊŸõãe*aùÑqp…Z`UA3LS3¶Ÿ×›kU(nÙ§7L©FšÎS—œ}š3œ*§M!Ŷí¨ÿ°}Z_Ãì‚ô€#Îi%M³ÐLÓ\»óðüôÛÈÿÍ”0j¡-`nI{D\æÿkÐ(µ²ý770ªª{ªZ¥LýÁh:a#`CVP†)ŽIUIV^U3‹þôï®úCÝužI¢ »~v‰¡ ¢KYbä•# ëœýn½z<—åÃÊf‰!x;‰ìžñX0ÍPÆ-4&jø‹eFD\æ%M˜êþ‹ÉÏ;LEvû/¥ø¨1ƒF.gUèUA–TA4Ua5vÊ3 Ù´ŒsKPNDÄeY*'гiúo ×›»qÄõL8Ô:бEƒ®‡·F Äh…5ÈØbè ëR‚œà´SýÊ”`¬.€VC8 ±!)„z’+ÝTÌ.))FÄELЄª¥.€¡”·„ #b‹¡C…vÖõ…kxtèö/íyîQÜ#€CÖ¥œIÀìH ¨ZxÊH™AV"eÕEÊíÓýþ~»9Gʺ*Ô"¥œÕyÓB2î%ì¼åÓ·4ª¢¬>ä„!ª’‘Œˆ-’+;…J:`YÓVŒò/î]h ЩЩ9ÓÞ×iOY1X*6þ,>}«Î=»¡S‚~Vˆ¢§h÷èo[íV·ûõnœolFÑn‚Z;".sÈRV虲¦ÿâŽçöy³/™¡ Áè]˜a%h˜v¥ÝnÊ?ÜoÖãê…‡9 eÑB¥‚ê券Ì!KýB‰Õ‹’ý7×Õ@†îâygÚx½Æ–×kr¿mgêV` Ô ²¦qX3µô!=ï ÎÂ6„›[l„M¬8e±‘CNiÔ¤ÖzQH2<¶z¬F-~4`x»}x~,®a*œ õžŠ¡¡r*`Ns]RN?«üQJ0i4eù“CN—?iÔ åÉTþ4HÆògÀ²d? ³ž>È„ØàÂ2/(NÖ)^º·i@‡ÈbL¨Xe!²C{}euw7m+€™¸à†ÒV2ÈŠ­ÄQ§Ø ÉÞVê$“­ä,W÷«§bfª˜‘B¿»Ôã £q›!*àøÌ Åìå`…žAaúO¸œCV–ƒÓ°º œw §ßÞ 0ÏiqÍðÒie§Gâ´ÈHöN«N29­œåãýn·Ý½Ö‰^+¬í&üný¸ýÏz²D’>œóÓ‚°DÊ!§K¤4jZO•Äz´N2’ ±A¸Ã´ ³¼˪ž*ißMÞñr>wŸjv<•N0í¼'Œ§9d%ž¦aõY?o¯ÊTaºé óöèKƒ1Z*ÊR9‡œŽ¤iÔ ‘”ŽdФ ’1’Xî¿|žÚíø÷­©¢¹¦ fž¦jËŒõ”…jYÑÔ8êM%#ÙkjdÒԜ庰¥‡{¦ ×tbƒ"`Æ;;¤¸ºêã‡-=aKÛ6§¡É ž¡‹±%“±óL&l:¥(M&ƒ¬˜LuŠÉ‘ìM¦N2™LÎò×çÖ»ûÍÇó>K÷÷c5¡E!í‡Ë¾Ýnžö«Ã‰ý«¥”òr¿Þ=†ŸTœõ¥¸|¯:ïæÈkÏãóº AœoC zÄãÛÄ ·!„3‡“+áÞÃú…p%<‡¬¬„§aéÔó´S%#Ù;Õ:ÉäTs’«ýöqrq‰Œc¿¸Tç—[‹aj+ºkmE‡ŠÒ`Ì`Š{BQ€-IqÖ´²p‚ÊH|( ¡Ê$ÄI œ)£Üdجö4"©ÂÞAEh| ±ERóp\Y~ÒÔÎ/,!\þ¶¸\SÕç€GÍåÒúœ²âsÒ°¶Ï¡#™|Nƒdô9’·Û»õH0$0Ž…É„Ø €0sâÉŠaNÊz»KÚN–—´³-O;©>yðœf^9ʃÏ9dåàsV1—ÃV":ŽqoRƒbÜ›4 X ÐÉV¨(f¶RåØÛJΑì°XQi‚Y:ã-¡´±!­ä"œpò'(ˬ³„S’[$%ÇœIë!ÉrÖ6œs„$#b‹$F5‚•Ú,Á(ÆÒÀ95¼VËÞKEéu2Ț׉ÃÚ^‡Œcò:uŠÉëä'B´f …¦ã˜$Ñ<éü‹çXÑÇÌë?²oü8¥|!6«yÕ3WÀPž1È!k™lÖßÓ1i%d$“•Ô9&+É9Öc3Å,6W9ö±9çH›‹Õ³f¤'œ„ØçÍZkNQš>6S±Ìbs•e›s–ØLF²Íu’16S©ÍDl®{¬â¹“”N§G¬ùœã¨\Ãäqª“ÃÉ6¢2Á,(×ö19cø.C²*‡älµ@Ï-—¥c¬§L\3ÈZâ‡Mpδ ¶DÅ2!6X—èá@Y–£r42޽•Ô9&3É9ÎiO¶+f‰ÏEЉz€kÈ)¹an5Bä„ppØJ&gBlÈ B»#AÅkŠ݉à†Èˆ-A1†zÒ‘ è¥§3$•˜Zi%¤ ±!©ÄÓÙÐcIZ¾¨Å‚ú¯åÎÝΦaÜxûœ°¨æ@µä–òøY9í@Ò¨ÀðÓºxiÉZØ9v…ɶÑ8–L΄Ø3l)îvòŒ‡ÀYb«5ÓøÍtd€-®8'­bÄu|™¢/OÈ0"¶(ZÌðÃÑœÅÍv¼Mɇ+¯!ÈØb^]¶z ®oÛ¾Jh” ÃSjvBl*•gR4{\jf”'œ‹„Ø¢hÂû0¬ii‹´>„B}Nˆ-†N2.´Eƒ‘M×<äýÇk¸$ÆS…ØÒÞ½òy½þ4Ù«h´RS.eˆ•^uÕÎMOÎdJrfõR‹'’3Öå µ®¶É)^GN CA7Ÿ °!§³‡%®œÕÌtŽ˜Áÿíè¦3ÖÅ þÔzãÇb–ÔV³?ô#Oq¼æ¨»Ñ¸»m|Tƶ×ÒŸ7¥<4v¼Â:]-‡¬ôÐÒ0ºJ¶(*H`ŽïD%jBlˆ 2ì%]u¾Ã(Ê*y`Œ¿D&kBlÈZ𘜨²NYÓüi•ƲPG‘ zÀk‰i±< bŠâuµXî¾Ö1ÄC¡z¼ÝI†û:¬(ªíµ½Ò¢r*Tñ¥åéî²R¨ÆQtþ¡Ô¦})29ûNW]ÎÔé *^CÐØ—¢4uº‚ÆN×PPšNWq7ͱ/E&ißéªKš:]cIgëîæ¡ô´ lßê+@ /@è–l”"®r¢cR’y,¢FŽIV7¾ù²_Ž{Þo®Äåaã:¬©uËWK+äùRïI÷ï«Ëræ2‡@ÕÐRP.säçGuçªQE^w™ƒLÎÌùWåìÿHPQ|Q¥Tï⛃ëðÛ‹ä Í÷zƒD`b i‡$ƒ¬µHâ°¶bõH¨DÍš$UQû.ÉHTQ¬«|ÛotètÚóÆMò„¦_£”+$ (+ù±VÈGѹêFO$gVÆ×äì«ø—r–ÆÆJÿ7‘&ž:×!OèEÕ M¯˜1Ú¦ât¦Ñio­Ê¤²Ï3ªB¦4c$å9Ëð¢qC:(7WN^¦;i•)›¾Hé*,R”Uç"eªH9>éEJÿœO(RvëÕÝd6zr«nºd.C¬ärqTw±jHñó_—Ê•äL‰•œ}&W•3%r#9DÎùž¶C){2áà/z”ã`Çë±Brᤴ£€yFáÍq®"C¬E:)ˤQPÉÙEUÎd#9ÅëÈ—lÉäLkÀu9ãp.çýf¿þ¸._°l·rŽ¤Ò„ /Œ%’4Ö% {[T÷ºØ‚¤bJRQ?Ì ™ù"G®š«2˜U“nÙÈ«¯Æ:ŒêºÃÏ¿NÌî×ù)*r¬¶¨$íË·ª¤©|+H*&ný–Îøx"?\ší¥.Ä9/ÖHÅh/³‹xµ›ìº1]J²ý´ÞL\ªl¨yaÆ2m‘„­&`8@c1G (Š=yþgî•~½nƒjtÔ Ý†§/›ýê“oVõÆÂ+dˆÓïUˆƒº}‡áæúÊÉ1‚ùÁ± ÁìÜXÏð~óa[|/Vm–û÷ùâ¯ãœýÛñÉendstream endobj 1671 0 obj << /Type /Page /Contents 1672 0 R /Resources 1670 0 R /MediaBox [0 0 612 792] /Parent 1541 0 R /Annots [ 1674 0 R 1675 0 R 1676 0 R 1677 0 R 1678 0 R 1679 0 R 1680 0 R 1681 0 R 1682 0 R 1683 0 R 1684 0 R 1685 0 R 1686 0 R 1687 0 R 1688 0 R 1689 0 R 1690 0 R 1691 0 R 1692 0 R 1693 0 R 1694 0 R 1695 0 R 1696 0 R 1697 0 R 1698 0 R 1699 0 R 1700 0 R 1701 0 R 1702 0 R 1703 0 R 1704 0 R 1705 0 R 1706 0 R 1707 0 R 1708 0 R 1709 0 R 1710 0 R 1711 0 R 1712 0 R 1713 0 R 1714 0 R 1715 0 R 1716 0 R 1717 0 R 1718 0 R 1719 0 R 1720 0 R 1721 0 R 1722 0 R 1723 0 R 1724 0 R 1725 0 R 1726 0 R 1727 0 R 1728 0 R 1729 0 R 1730 0 R ] >> endobj 1674 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 690.5978 186.7065 700.339] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.9.2) >> >> endobj 1675 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 677.2589 218.9464 688.3839] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.9.3) >> >> endobj 1676 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 667.5177 138.7201 676.318] /Subtype /Link /A << /S /GoTo /D (subsection.7.10) >> >> endobj 1677 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 655.5625 194.179 664.4735] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.1) >> >> endobj 1678 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 641.3934 216.624 652.5184] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.2) >> >> endobj 1679 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 629.4382 221.8543 640.5632] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.3) >> >> endobj 1680 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 617.4831 195.7026 628.608] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.4) >> >> endobj 1681 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 605.5279 200.933 616.6529] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.5) >> >> endobj 1682 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 593.5727 208.4858 604.6977] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 1683 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 581.8943 218.9464 592.7425] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.7) >> >> endobj 1684 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 569.6624 289.2422 580.7873] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.8) >> >> endobj 1685 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 559.091 221.8543 568.8322] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.9) >> >> endobj 1686 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 545.7521 227.0847 556.877] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 1687 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 534.0736 325.2269 544.9218] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.11) >> >> endobj 1688 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 521.8417 227.0847 532.9667] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.12) >> >> endobj 1689 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 509.8866 246.5415 521.0115] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.13) >> >> endobj 1690 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 499.3151 171.0154 509.0563] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.14) >> >> endobj 1691 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 487.36 227.0847 497.1012] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.15) >> >> endobj 1692 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 475.4048 200.933 485.146] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.16) >> >> endobj 1693 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 462.0659 216.624 473.1908] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.17) >> >> endobj 1694 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 451.4945 241.3112 461.2357] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.18) >> >> endobj 1695 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 439.5393 260.768 449.2805] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.19) >> >> endobj 1696 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 427.5841 230.8505 437.3253] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.20) >> >> endobj 1697 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 415.629 216.624 425.3702] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.21) >> >> endobj 1698 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 403.6738 236.0808 413.415] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.22) >> >> endobj 1699 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 391.7186 251.7719 401.4598] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.23) >> >> endobj 1700 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 379.7634 221.8543 389.5047] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.24) >> >> endobj 1701 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 366.4245 225.6202 377.5495] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.25) >> >> endobj 1702 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 355.8531 255.5377 365.5943] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.26) >> >> endobj 1703 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 342.5142 251.7719 353.6392] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.27) >> >> endobj 1704 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 332.773 203.8925 341.5733] /Subtype /Link /A << /S /GoTo /D (subsection.7.11) >> >> endobj 1705 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 320.8178 194.179 329.7288] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.1) >> >> endobj 1706 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 306.6487 519.453 317.7737] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.2) >> >> endobj 1707 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 294.6935 265.9984 305.8185] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.2) >> >> endobj 1708 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 282.7384 519.453 293.8633] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.3) >> >> endobj 1709 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 270.7832 271.2287 281.9081] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.3) >> >> endobj 1710 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 258.828 519.453 269.953] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.4) >> >> endobj 1711 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 246.8729 271.2287 257.9978] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.4) >> >> endobj 1712 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 234.9177 519.453 246.0426] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.5) >> >> endobj 1713 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 222.9625 276.4591 234.0875] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.5) >> >> endobj 1714 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 210.7306 207.8776 222.6858] /Subtype /Link /A << /S /GoTo /D (subsection.7.12) >> >> endobj 1715 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 199.0522 361.2538 210.1771] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.1) >> >> endobj 1716 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 187.097 415.3925 198.222] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.2) >> >> endobj 1717 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 175.1418 382.1752 186.2668] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.3) >> >> endobj 1718 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 163.1867 403.0965 174.3116] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.4) >> >> endobj 1719 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 151.2315 415.2731 162.3565] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.5) >> >> endobj 1720 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 138.9996 185.2679 150.9548] /Subtype /Link /A << /S /GoTo /D (subsection.7.13) >> >> endobj 1721 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 127.3212 247.3995 138.4461] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.13.1) >> >> endobj 1722 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 115.366 257.8601 126.491] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.13.2) >> >> endobj 1723 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 103.4108 268.3208 114.5358] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.13.3) >> >> endobj 1724 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 91.4557 247.3995 102.5806] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.13.4) >> >> endobj 1725 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 79.2238 187.6479 91.1789] /Subtype /Link /A << /S /GoTo /D (subsection.7.14) >> >> endobj 1726 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 67.8221 332.8008 78.6703] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 1727 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 55.5902 519.453 66.7151] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.2) >> >> endobj 1728 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 43.9117 278.7815 54.76] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.2) >> >> endobj 1729 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 31.9566 268.3208 42.8048] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 1730 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 19.7247 236.0808 30.8496] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.4) >> >> endobj 1673 0 obj << /D [1671 0 R /XYZ 64.9134 727.2935 null] >> endobj 1670 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1733 0 obj << /Length 4044 /Filter /FlateDecode >> stream xÚí]Ks7¾ëWð(Õ†Ðx7¯ª¤¶vk+¾%9ÐÒØfY"’Š“¿ j0i¶jË/¶LÁͯÑîþðüöÍÕínâ™7`&oÞMŒb^H5±’3縘¼¹ÿõZÝüþæç‰ô†yåý„ï>üî?ÿ~óÿßü~wõÛ+Ÿó‰è%€aÊ=¹{¼úãê×ßùäþŠO~¾âÌz;ù„?s&½Ó“Ç+¥%ÓJÊ«_®þN;‰ÓTä·Ï‘ ÌZ¡'ÆS ä¥eB10Þþ4—š9£Í^™‡Ùfû\a8Έ^à@“ÚVá= *’ é û÷3E¢Äi*r§É6a$“á·ª¬›Ùý£SÌY) 1vkc\<ïîÍv¶t$  ¬çŽd”X Â2þãÃ|Ñ JÏ”¥D¸X¨€aàáÝòáéqq ­Û¦N®Pª·jïµìfª9OþÂÑ9üðÌß½„hÂ_ûݰ ç™T|O0¯5ô×Tî§õ|Û G®fJ51Ž3e¼ ¹{‰ÓTdnä:¦µ²ý7Ûfýx+‡Ö”‚í¾r×蛌®†qçdIUÀ¡‚JÕ(±¢* !¼QÆT'éš•cp¼€„{÷êâ©Åp*8¯ÆSÁ«>º\å2ºíÜ¥ú8Mô]6H£TÎ,¢j–»§õºÉ Í.+io˜uà ó\*²çb³‚÷XTE^jסkÀ~Èò06mÖ7 îfëÑ9[B-XG8g›Š,ÌÙÆfíLÞâÏf½™/³³yÆ0ǹz­b±Àè}G‹Ôr¾ ÏðüŸ„q"YŠ]³1—Ι6JÒaŒ+Kf9èg‹.‹-}˜äøª\¶uD¹wÄØõ°ÒÕØàú§ÅêF\?mo—Oø÷vµûóf*¥¼~·^>Þn—í?î°‚¾^.ð·›ðÓv¶¸ß¶T»YÒð1öëÊùíJ!'Qâp†'t!«güì*WŒêH£ð¿Q®Ä¥"KQ½kÖMr²:Œ‘-T0vlácpÆa¨ñ¸¦Ã%V0þh¼³‡gÛ%ÁºHÎcÀ f‘ Ð)ºXÓӢʹ#laF…I0:ˆÄFïÃj»ÊØ^Â7v‰¥Ó4J¬h* sÿlô.?6‹HDÊqBsD‰5^0$ïG _%ð Ut£Ä F%L˜±µGº Zœ=©FhSp›>оÀ¸Lfpf‘–qneID–H׬ž@È0ö ¤Œ1&c9PaLHcŸ@RŒ¡žÞd3ÈiË»ù¶;9B{D‰5]GpÆÔí!9Æ© í%V0J¤îÖJ—³|¶= ”F 2*i‹L×NbMW$=",§ŽálñUÈ8d ;‰ŠcÌ´^ÔFda0Œk©•1òH§QCƒ–•<’4© áDd2‡<3s€f\ O™9‘¥ÌÑ5«g2Œ}æ(cŒ™#ÅXÎT“ÌQÄØgŽãÝò¾yùÌA¦kŸ9ʺÆÌQ³GŸ9¨0&™£ˆ±ÏC{¼tæ ÓµÏe]cæ8ÃåÌA²ÏE}æ¨9MŸ9¨0&™£Œ1fŽ£œæ”Ì¡«™C¹ U#ËâÞXÂ-x©È¼Øl4uxü&. !ÆNb £— òãr˜8“[èF‰„À-SÆ©C„4sVù-ŒÝ¤™¦qÒª¬hœ´ª˜Â…¿Jì$Ö:Œ·lÆD{ÿŸµ¢R6™µ**ÛÏZ•Í’‹uvk-𠬢2Ç0` êpÅ U±ÞøeTMD–¢j×ì`§ïðÔ‹a Ã Ð(±„GÑ!¨§@3ãYr¦\8d;‰5„2¤ýÔS„4SÐû]ÎÂׅ¨Oè7QbEY‰>y¤j €þeNy„:YŠ­]³ãhОf•Fšu´@³èFšUAØÑ¬Ã®$Z¤#Z"L¾rK§n”XQW¢áŒw¾f kM „;‰5„h8¾õ2É2-…å¿ÂúŸNÙ(±¢¬â»[]lÍ*\ô …'DØI¬!h6ËÌ誚YÁN![:¬ôrOI¶‘²Õµª‘-2€=Ù*Œd+E8Z*LåBÂë>Ga*ç(ôÙ·©(%°|ДëX©ÈR)Ð5«Ó,2Œ=Í*cŒ4ëcfQ!LhVaO³R„çn€8’f‘)ÛÓ¬²²‘fUÌižf•Fš54ÇËÓ,*mšUÔ¶§Ye{ô4‹ aO³Ê#Í"²ÇçѬpÔƒ8elMD–bk×ìHšE4¡YE =ÍJ–hžf•FšuЕD;šª4‹JÝ„fÕíiVÙ =Í"CØÓ¬2ÂH³^ šE¥lB³ŠÊö4«lŽžf‘!ìiVa¤YDæøLš…0ðÿ®i%" 4«kU£Yd{šUiVŠp´2¼Ð¬„fiÎÀX9 Y¦=&üý7âú»pòw*xz"øq5ÛÎñwoçøç|{îúïöTpø8ºØë¯óŠ[<.l˜g¤•ºþiºi»ÆÞXÞ`}u}:fס»Î\.P¾·—[Xƺ˜ýôˆ£t›&{— a´8ú¸mó½ñ´m=³ÕªYÜgo?Ò‰ˆW–Údû¤½ÏVcØùâýçÝB:°íˆ¤×zÉ_;ìF.ùKb›:ÆJ‹[~îÀÙ.î³RÂ)]..·õ#«3ÚÊi“Yú˜»îøùÁ¥ÞÍÇù*‹Å2ÀêùõXþкXÆ:ÍUƼõ òÕ…a¶³·#wRs..·Í £©ï×68=ˆ¦¶-ºßÜ8yVvåtóW¨¥g‹p•~âÌåæ>~Jw?+Ëã8±±,ÿ¾ù µØñ˜¦íôöÔöç÷ëÙããl½AéÚ½šn㙫—Ú謳ÅýèÜxË<—–pî"9>w[Õ/÷?¾f®ßÅGÈíŸ1(+Ÿ18ÐtgŽÑkû$ o¿Ø8½K‡a _‹îÊ3Œ«>Ìü<·Î%VÖ³MCp_ø^Ðå¾ðð":#…‹‹û;Ýcîsmîû×òýüî›Ã»çœ çõò¡ý›íï¶¿Ë¿mvñ‰OèšO±Îüôvôå'a±ÖÑ@øðS"qüݧ®Q<½¯³W\yq† ÛÜe½kxƒ]é\&…¨ó^oÈë¤7”—m¦"Ká¢kÖí„©í¿”Ù£îa²î‘DŽ#d_~jÖ£»åØWJPžDJEvËÇfäÓjÕ¬³÷"…µp©ÿ“lbjÙÄœYa(` S†ŒDd)dtÍ(¯KÈé `™¶ŠNÕN`EÓp üèPÓÑË75ó\ÁWøDè¶ÞYÉœR>“øêïë.žßfB[·.+°³µ”»ÔS‘ã+½±ÝUlyUqÌìÈ4íVÞGÁÿ@Sª›×U‚{æ •+Úbhbö$j[´ÿ×çiÛÂa?¾ <Œ2Y¢þ4òbö˜/Ú,eÕ%'Ÿñö›æ0F!3öðgfmŽ£ (ŸcI$–rö¾U»z·ùp©òO¯ò}­Ê?âÙÝEóit‚À+fŒö„‰Äñ ‚®ÝeÏ%!”ÁáõX*%£À²’ Âa C-á%´DÖätZv+ZZÑ^0ÐRd‡¹1ðî†>…á2'}.D<³ì ·„¯§& §v­jö ää§»¤ ¼ÆµÅ™ÓùH-¬Ö”\;‘XHÛ]«öörÕ¬·gWx|x$Â]®_MœA…Í&n°Çßîœo’í7S°í.Âf÷zí~y)€Ž Ë Jk¬ÀYcm<ÊË.ó‚¡(îò@SÔcác¸}–6Ÿ¶Å¹t÷áãèkð ^Ë9VÅs¬h˜cvB…§Êó{ƱtPê2JjV€.ÉÿA”cºendstream endobj 1732 0 obj << /Type /Page /Contents 1733 0 R /Resources 1731 0 R /MediaBox [0 0 612 792] /Parent 1541 0 R /Annots [ 1735 0 R 1736 0 R 1737 0 R 1738 0 R 1739 0 R 1740 0 R 1741 0 R 1742 0 R 1743 0 R 1744 0 R 1745 0 R 1746 0 R 1747 0 R 1748 0 R 1749 0 R 1750 0 R 1751 0 R 1752 0 R 1753 0 R 1754 0 R 1755 0 R 1756 0 R 1757 0 R 1758 0 R 1759 0 R 1760 0 R 1761 0 R 1762 0 R 1763 0 R 1764 0 R 1765 0 R 1766 0 R 1767 0 R 1768 0 R 1769 0 R 1770 0 R 1771 0 R 1772 0 R 1773 0 R 1774 0 R 1775 0 R 1776 0 R 1777 0 R 1778 0 R 1779 0 R 1780 0 R 1781 0 R 1782 0 R 1783 0 R 1784 0 R 1785 0 R 1786 0 R 1787 0 R 1788 0 R 1789 0 R 1790 0 R 1791 0 R ] >> endobj 1735 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 690.5978 285.4552 700.339] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.5) >> >> endobj 1736 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 677.2589 519.453 688.3839] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 1737 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 665.3037 519.453 676.4287] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 1738 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 653.3486 176.2458 664.4735] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 1739 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 641.6702 229.4071 652.5184] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 1740 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 629.4382 310.1635 640.5632] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.8) >> >> endobj 1741 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 617.4831 230.8505 628.608] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.9) >> >> endobj 1742 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 605.5279 160.5547 616.6529] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 1743 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 593.5727 200.933 604.6977] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.11) >> >> endobj 1744 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 583.0013 227.0847 592.7425] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.12) >> >> endobj 1745 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 571.0461 267.4629 580.7873] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.13) >> >> endobj 1746 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 557.4305 267.4875 569.3857] /Subtype /Link /A << /S /GoTo /D (subsection.7.15) >> >> endobj 1747 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 546.0288 448.684 556.877] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.1) >> >> endobj 1748 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 534.0736 464.375 544.9218] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.2) >> >> endobj 1749 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 522.1185 464.375 532.9667] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.3) >> >> endobj 1750 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 509.8866 519.453 521.0115] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.4) >> >> endobj 1751 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 497.9314 519.453 509.0563] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.4) >> >> endobj 1752 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 487.36 220.3898 497.1012] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.4) >> >> endobj 1753 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 474.0211 519.453 485.146] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.5) >> >> endobj 1754 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 462.0659 519.453 473.1908] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.5) >> >> endobj 1755 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 451.4945 225.6202 461.2357] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.5) >> >> endobj 1756 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 438.1555 519.453 449.2805] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.6) >> >> endobj 1757 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 426.2004 519.453 437.3253] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.6) >> >> endobj 1758 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 415.629 225.6202 425.3702] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.6) >> >> endobj 1759 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 402.0133 260.403 413.9685] /Subtype /Link /A << /S /GoTo /D (subsection.7.16) >> >> endobj 1760 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 392.5488 194.179 401.4598] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.16.1) >> >> endobj 1761 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 378.3797 251.1864 389.5047] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.16.2) >> >> endobj 1762 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 366.4245 234.6375 377.5495] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.16.3) >> >> endobj 1763 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 354.7461 208.4858 365.5943] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.16.4) >> >> endobj 1764 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 342.5142 240.7257 353.6392] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.16.5) >> >> endobj 1765 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 330.559 198.0251 341.684] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.16.6) >> >> endobj 1766 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 318.8806 173.0359 329.6181] /Subtype /Link /A << /S /GoTo /D (subsection.7.17) >> >> endobj 1767 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 306.9254 249.8038 317.7737] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.17.1) >> >> endobj 1768 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 294.6935 294.4725 305.8185] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.17.2) >> >> endobj 1769 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 282.7384 229.4071 293.8633] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.17.3) >> >> endobj 1770 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 271.0599 231.2898 281.9081] /Subtype /Link /A << /S /GoTo /D (subsection.7.18) >> >> endobj 1771 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 258.828 393.5149 269.953] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 1772 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 246.8729 485.3415 257.9978] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.2) >> >> endobj 1773 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 234.9177 181.4761 246.0426] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.3) >> >> endobj 1774 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 224.3463 165.7851 234.0875] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.4) >> >> endobj 1775 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 211.2841 207.158 222.0216] /Subtype /Link /A << /S /GoTo /D (subsection.7.19) >> >> endobj 1776 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 199.0522 206.1633 210.1771] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.1) >> >> endobj 1777 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 188.4808 206.1633 198.222] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.2) >> >> endobj 1778 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 176.5256 190.4723 186.2668] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.3) >> >> endobj 1779 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 164.5704 195.7026 174.3116] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.4) >> >> endobj 1780 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 151.2315 206.1633 162.3565] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.5) >> >> endobj 1781 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 139.5531 268.3208 150.4013] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.6) >> >> endobj 1782 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 127.5979 361.8604 138.4461] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.7) >> >> endobj 1783 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 116.7497 171.0154 126.491] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.8) >> >> endobj 1784 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 104.7946 195.7026 114.5358] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.9) >> >> endobj 1785 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 91.7324 304.3266 102.5806] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.10) >> >> endobj 1786 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 80.8842 211.3936 90.6255] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.11) >> >> endobj 1787 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 67.5453 216.624 78.6703] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.12) >> >> endobj 1788 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 55.8669 168.5804 66.6044] /Subtype /Link /A << /S /GoTo /D (subsection.7.20) >> >> endobj 1789 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 43.635 181.4761 54.76] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.1) >> >> endobj 1790 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 31.9566 245.0981 42.8048] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.2) >> >> endobj 1791 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 21.1084 186.7065 30.8496] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.3) >> >> endobj 1734 0 obj << /D [1732 0 R /XYZ 64.9134 727.2935 null] >> endobj 1731 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1794 0 obj << /Length 3469 /Filter /FlateDecode >> stream xÚí]K“Û6¾Ï¯Ð-3U+Ýx_³•lmÉîfn©d =VY/%%öþúm‡A‚“Á¤bK'%èc7Ð~üöþæÍ÷væ˜Ó¨g÷ïfZ2BÎŒàÌZ³û‡_nÿþÓ÷ßýxÿóݯ÷?̤´Liœñê+å?»ùîþè>ƒ'ÔL:­fËÍÍo~ù•Ïnøì‡ÎŒ3³ßéo΄³j¶¹‘J0%…Ÿ¬o~¾ùw 8ˆó.ä·ç„Gf ¨™vÈ$JQ‘gr&=o¾Gì ŠY­tÃÅC±.ÅQìÂJ`V¢iÆý-‚¤·V4ö´<Ä€0ÁU˜6v7Wœwþ‘Îõ?|áw hƒü+Ñ™M;p°ô0§h:ÚERÉEúX”›ãaqXí¶o°?ÁF1縼¸ Ž~gÀuf&ÛÒ4ö']§'½,Þ­>Åæû¹šq|7tÙš!âšO‹d’‹´?¾]¯ö‡èäÒ®(¥¾jÅàwµª4Ë`-ÓdI"ªb“«°^Ä—@Ð凉nLS¡ë‘õ‚ÁDd=\z=Šíãá}të"Â]ub¢iVÂ’hБ xr-¶´§9tÖ^WâyеåhÖE+&´”H®ËfñéÜ%=Žin™ú|å¥×.<8‡ä“– ‹áÿg|‹8ïBVü i ,ãN>=¸ÒâÃ&Èk°8Õûج¶ç|¢÷Š,º||¶ˆ >ãøŒî›£Ú2K¾EFFbŠQC")‰¶iŒ*¦5ª/o3¨ÕQÕêˆ\2+\Ìd¦=¹]™C…Ga4¹7(§â|(>7Í…5qÐGµ@‘·Nâ q8ˆFˆðº‚TÛÆ»9Ü6 /¼«.´éH ß Þþc½{{·‹u=™¿Ý)}»(W ÿáºð@û»9:}µí_¼Î™ =uFó\ÊÛnïÐÞJšçͰ½}8ÒŸK?㇕ÿpKøÎ\§xhŠydrÓ[Ùcϱ ·[:Ò ¥É}Šˆ^ìXÄy2âXHÃ4)ÝÓ“=‹ý~õ¸ÍÚèqŠ˜DúA6N[ħÞúÐãôm”UøœS-˜2Îfä4 ¦8Õš°§Œ®WÛQ.)vqh¿T×Â$\ r^¢ŽÒú߈œêØSÇ0ÌX‹‡·Ð9w'Fë6­wDE¾DTmÜ@NQé@މJVíge¹øÜ#Ò$™¬ŒDÄ‘Æ0¥¸=%r¿ú_1äF›«<÷dv¨NŠC#2‹m+p9e¶9&³a˜'pµ]F3`š‚?îj€Uufd3 ¦Ø´–À©>›˜ŸM$§ÉÊgc³EL°‰Â'8IÎÎÙܽ"[Ä‘Hß´t“¤EøŠ½{^CPe»ol·BFž`¿YŒ½)z|÷Éך6¾Èñ±*0íïH7å5c–ȵ†)*+a]ÌûWUMZï›ÊhULZ ³â뜞WŸy1ZÏC–îf‰y}¡÷Dñi|Ý,]Èán–vTÝN[ Í9‘Îç„ÎHd@Lé¹CäžPùn½xh¨ú[.4uYïÁ¡a JˆÞŒj£ËcYÛ¾°RLf {R+F®^Žvƒ8ïBÆRØŽqPâéÉÃÒêÛœ8ª|DÀÞgxJã ¬:†ü"ºnk±lºAq¦œ‹íŸâeû§ä q—sÿì@ŽìŸaTíQ}¬û䣰­û$( uŸ·‹Íµî3©î#ÔxÝ'Ô*“;©r¶•ɹ“v ÇvÒ0lHn…Bf¤°Lè,“>6F`‚Oß6ÉÑàD> ³Ðòñ'\<"B;ÐÖ]5Ymª¶‘ÿYl|hÕØÇêH£÷¥7whnßÞQ`v[!-k¯û±Øåâ°+};\¬Ut£VQ½°¤,$Ðç+‰t!‡K"í¨šÂâ!ƒÊ’|í6þÈJÌø+Ÿ2üªë¾'ÊèçYHÓïUSνŽI wÌ*›³ˆÖ…‘˜0jLb$0.´¸† ñðÛ‰lzƒœfBY‘Žt¸YëYtö¯—M-ÃR ]J¤&”›¥ץȲÀ3Fõ7M]{0߯Öä¯ÿ²ØÝ|au/ò¾£Êø‹¶ôK!®á~ϱ‘0šÖ›ÅÛýn}ŒT&-0àFÍB~î-ÐË6ˆó.d¬îWÕÌÓ“C•$vÆÁ8©óÑØ"&hôgœ@wJã`ñ\3m\XÚ¯Î9HŠ0WñÄ 7ò.w›»}D>Éú cg¨8ó§ù^.ž ༃“N_íÐíce³ifËE^Û7J]Û×%¯Kyñ­q­<žµÆÁ“<Š ÷àFw gZj[+49zÏÄy2ÖfDÖ–ÛQCòº‚òQÚŒ†6£ ¯mF1kŽOa'ÜÙajê§Ý4Ü.+_V}l*&>“ê¿jꮫúÖ«¢|·ð~•³îR}%õ•Ì_©|ý;±ë¼žN\Œn¦¼iTXdZ«œqcqDXè¦öDòzøM08+¤½ærHL2—3á <‡bóqW.F\a<¸Éè w‡á0h¬ŒvuƒI lÜ îŠÈ ä­¥rDÄa1ƒZ§G\Å *.-^ ½8 Ûr‘,ç9OâtGlC5zØà×¼ó`+¯oå%áHgœßïö‡Aáä‡I……£ƒ8"aTk&®Âñ\áP<)éŒênß¿#Ûy^Îy«9^GÑÀÍ[¼Xÿ¿?å%tó̪>\”UÜ‹ds½ ÆY ¡Úgéë±±;˜ uãåûÕ¡XŽeT-¯o°?7â ‚ýLŠŠendstream endobj 1793 0 obj << /Type /Page /Contents 1794 0 R /Resources 1792 0 R /MediaBox [0 0 612 792] /Parent 1853 0 R /Annots [ 1796 0 R 1797 0 R 1798 0 R 1799 0 R 1800 0 R 1801 0 R 1802 0 R 1803 0 R 1804 0 R 1805 0 R 1806 0 R 1807 0 R 1808 0 R 1809 0 R 1810 0 R 1811 0 R 1812 0 R 1813 0 R 1814 0 R 1815 0 R 1816 0 R 1817 0 R 1818 0 R 1819 0 R 1820 0 R 1821 0 R 1822 0 R 1823 0 R 1824 0 R 1825 0 R 1826 0 R 1827 0 R 1828 0 R 1829 0 R 1830 0 R 1831 0 R 1832 0 R 1833 0 R 1834 0 R 1835 0 R 1836 0 R 1837 0 R 1838 0 R 1839 0 R 1840 0 R 1841 0 R 1842 0 R 1843 0 R 1844 0 R 1845 0 R 1846 0 R 1847 0 R 1848 0 R 1849 0 R 1850 0 R 1851 0 R 1852 0 R ] >> endobj 1796 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 689.4908 229.4071 700.339] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.4) >> >> endobj 1797 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 677.2589 207.6278 688.3839] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.5) >> >> endobj 1798 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 665.3037 229.4071 676.4287] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.6) >> >> endobj 1799 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 654.7323 186.7065 664.4735] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.7) >> >> endobj 1800 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 642.7771 171.0154 652.5184] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.8) >> >> endobj 1801 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 629.4382 181.4761 640.5632] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.9) >> >> endobj 1802 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 618.8668 165.7851 628.608] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.10) >> >> endobj 1803 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 605.8046 304.3266 616.6529] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.11) >> >> endobj 1804 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 593.5727 397.4424 604.6977] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.12) >> >> endobj 1805 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 583.8315 173.9354 592.7425] /Subtype /Link /A << /S /GoTo /D (subsection.7.21) >> >> endobj 1806 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 571.8763 194.179 580.7873] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.1) >> >> endobj 1807 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 557.7072 299.0963 568.8322] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.2) >> >> endobj 1808 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 545.7521 180.0116 556.877] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.3) >> >> endobj 1809 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 533.7969 209.9291 544.9218] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.4) >> >> endobj 1810 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 521.8417 473.895 532.9667] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.5) >> >> endobj 1811 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 509.8866 446.6129 521.0115] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.6) >> >> endobj 1812 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 498.2081 181.6149 509.0563] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.7) >> >> endobj 1813 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 486.253 156.5699 497.1012] /Subtype /Link /A << /S /GoTo /D (subsection.7.22) >> >> endobj 1814 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 474.0211 225.6202 485.146] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 1815 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 462.0659 246.5415 473.1908] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.2) >> >> endobj 1816 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 450.1107 209.9291 461.2357] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.3) >> >> endobj 1817 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 438.1555 230.8505 449.2805] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.4) >> >> endobj 1818 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 426.2004 351.3786 437.3253] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.5) >> >> endobj 1819 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 414.522 166.0067 425.2594] /Subtype /Link /A << /S /GoTo /D (subsection.7.23) >> >> endobj 1820 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 402.5668 299.8654 413.415] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.1) >> >> endobj 1821 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 391.7186 171.0154 401.4598] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.2) >> >> endobj 1822 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 378.3797 239.8678 389.5047] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.3) >> >> endobj 1823 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 366.7013 176.7719 377.4388] /Subtype /Link /A << /S /GoTo /D (subsection.7.24) >> >> endobj 1824 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 354.7461 271.2498 365.5943] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.24.1) >> >> endobj 1825 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 342.5142 387.4055 353.6392] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.24.2) >> >> endobj 1826 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 330.8358 221.0504 341.684] /Subtype /Link /A << /S /GoTo /D (subsection.7.25) >> >> endobj 1827 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 318.8806 254.0943 329.7288] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.25.1) >> >> endobj 1828 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 306.6487 190.4723 317.7737] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.25.2) >> >> endobj 1829 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 296.0773 181.4761 305.8185] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.25.3) >> >> endobj 1830 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 284.1221 181.4761 293.8633] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.25.4) >> >> endobj 1831 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 271.0599 194.8154 281.9081] /Subtype /Link /A << /S /GoTo /D (subsection.7.26) >> >> endobj 1832 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 260.2118 241.3112 269.953] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 1833 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 246.8729 246.5415 257.9978] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.2) >> >> endobj 1834 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 234.9177 230.8505 246.0426] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.3) >> >> endobj 1835 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 223.2393 221.2718 234.0875] /Subtype /Link /A << /S /GoTo /D (subsection.7.27) >> >> endobj 1836 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 211.0074 232.315 222.1323] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.1) >> >> endobj 1837 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 199.0522 221.8543 210.1771] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.2) >> >> endobj 1838 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 187.097 216.624 198.222] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.3) >> >> endobj 1839 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 176.5256 186.7065 186.2668] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.4) >> >> endobj 1840 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 163.1867 419.3941 174.3116] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.5) >> >> endobj 1841 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 151.2315 237.5453 162.3565] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.6) >> >> endobj 1842 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 139.2763 227.0847 150.4013] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.7) >> >> endobj 1843 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 128.7049 206.1633 138.4461] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.8) >> >> endobj 1844 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 115.6428 254.0943 126.491] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.9) >> >> endobj 1845 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 103.4108 299.7029 114.5358] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.10) >> >> endobj 1846 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 91.4557 216.624 102.5806] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.11) >> >> endobj 1847 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 79.5005 221.8543 90.6255] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.12) >> >> endobj 1848 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 67.5453 221.8543 78.6703] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.13) >> >> endobj 1849 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 56.9739 195.7026 66.7151] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.14) >> >> endobj 1850 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 45.0187 195.7026 54.76] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.15) >> >> endobj 1851 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 33.0636 200.933 42.8048] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.16) >> >> endobj 1852 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 21.1084 212.8582 30.8496] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.17) >> >> endobj 1795 0 obj << /D [1793 0 R /XYZ 64.9134 727.2935 null] >> endobj 1792 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1856 0 obj << /Length 3267 /Filter /FlateDecode >> stream xÚí]Ko#7¾ûWè(+šïÇ5› °Á"‹E| rÐHm§1²¤mÉ“dý["›r³I9ÍX»/3²T(}ÍúªXU|蛇»ûOzf‘TÎg’#CŸ)†‘Ö˜Ì6?Íåâç‡ïgÌHd¸13ܾù÷ýððÝ?ÚÏî¾{¸#ð>ž‘N•ˆ)fëç»ÿÜýô3žmîðìû;Œ”Q³_á5FÌh1{¾ã‚!Ásïlï~¼û·W¸t—¡Êo^#'˜"¥ˆ˜IC§œµ(¢ mAÞ¢4gi)äåiŽ¿TÛí==Ë…j™D’P~û[D‘DXkv¥‡üa=ôJîëáijœ´X ŒƒÿÀ>ý7G~ö—©Vωho¶$ÄH¯2BÐÀž&oÏß§ê9fPNæTÝlг¢ˆEA ú.-‘·½X †`¢#V¢8o¥Ãê×Ý=ïu­ž¸±1óbÇF×o*b‹ƒ$æÒYŒ#Y‹ö‡*j1ˆKÆÈ>Ð7|v¶;ÛBÃ$+‰Œ9Íš¢ú­Zß‹ˆï@\òóHÖuZ-<¢E#A1™ Ú3ci5Ëíqß|y1‰!E‘:1Š$×¼Ÿ2µiÑ9g"ÆPÈ™"­•Ͽʘ¼Æe¨²M™®°É³©’k}¼Ùo÷OƒS£):Rð,)x–ë¦Zª-›H=“^HGÓÂi\†*#´P )Ðì¥ZVÔ‡*:Åb›O‰‰oá„Èrâ×U}ŠÖ#–QŠOÃ}£ê³EÄÙ"ÀkBb•ùÌ§ŠƒN* :VP™tÒPå°“z©³“n¢Å'ƒRŠ™‰4½2æB ‚9”1àVj¨|Sí6ƒ“ºÐ¶bWºà¤ªLLê^¬ÅX?íVÑÇ4©÷Â…Ìð:JÛª:Äœqª”þ€)•Ò Í j[­O±Zi²Åq 3ª×AÐ OéüÇýbIÕ|½€¾,¨žW§ãbɟ׻™^Nðïýþåt€ÿáøˆMÙJnj'ž¥ÈNzÌ׈,ì¼ÅçÿØÙA>50šväõ|ó/×ðéüTÛ7w ß¨iˆ‡†G7ß9î×_ªhŽ>E•·Dð]PAìFS çæÄæ¿R•ÌÍ•‰ÜÜIµUþv¬¢ ÁTApâUp‚æ&ª,ɉ@e‚NÊ‚ü\ï6SSå&J˜tN®‘K ®-°xAJ„*‡)á¥Ú0±ßíl¶éÉ ‰@ù¨¬¸æ¤þL0!‚Me{ù„–$B 2A'eAnë㩊¯jÙ !ÓªæœHœYÕÔH¦ƒPhJR’Êœ”¹Z¯«C4,¼uGCôi©€ï¤PÔ{Z¯1ó´š–ÌD7²Ò,0R\þ63ےÖbŽ43±ø•ï-ý²?žv«çþ’‘&¶ ̶ˆ t£Æe¨2BYÍå–>N¬5âfÓTÇc´ëȤJ}ÌÝ3ÒíqáHWËœ)ÿlû%•-ä7𢾴Jží+ûÑê©ýð¹:wK©åTæ÷‡›Æ:)~Š€ä+ëqO‘ùAp«æÐÀ .PJ8ËPeÄÙ,m ï¾øœ.ìªMÝGi$¼ È‹ÂFEš‚·®@šý3DõX¬ *úH¹í9}q›²8…ª‹~$¸¥•â&Qˆ ÁKr3P™à¦“º…›Å@zn¦1zn† 'n¾™›ùÎdÃÜÄÁÒ’Ü T&¸é¤náf1ž›iŒž›!È5Ps[êý.ÆOeÁù~÷„{*¾ÚLáù†àcX¥‡L .HÁUúPeb•Þ‹%ÈH1FB†Â£‹3§1“Úµ>LÅ5Ì€Ž‘Ô^Ù<ë½í69‡D·Ôî¹æuDdØ-€Ú¸f]W=›jµ©šsîþ¸Z×[»(w²«£¿ÃW“ií3âð,µöÉð´öYjˆñëX ƒ{CÊÙô")7¶ÛÃAP!©LBÃi\†*c³:µý#Ù}³E8tNÁîk'zÚמë«^ö°j$$¤ïlI¸€œ—$I 2E'ÖÎc¿¬vO‘.GZ1V¥Ó˜C©m?ˆˆk”ûƒi£]4xzÈ5ôí¢ñô4 )ER¹4´$I•)’:±ô¾‰¨”j e‘¥Â¬1¡cô£èA Ò6;)H@eŠNÌ"´ÙeéŠ#N¨,ˆÑiÌaT õ5ÆSÕäIJ>T bçCiˆÞ‡Bˆ‡ý±n—…bAòeÌÙ‡Þ½ì©:°{ÙR•Œ¢ªZ5+ÉÔNcЍ©,OKáëhšÄçYà«wëí˦ê/²$d ;~õ¢0‘ФÑê £Ýü=è%0é8Ñ«Ú#a ‰,V‘Q«U”iРJ6DB•)qbY—)±ó™4Dï4!Ĭה‚¸Mfç7!ÌsÜCÉ9RX´·×˜CÉaÚãò•½‡Ü›I»:ù^nw¹vaMÀ…™ˆMy£Ö)•([´¨L¹°˺p1ˆ §!z!ëÿ&*œb» 'ÑW8!Æõþewªšc4ƒ”ˆIúá'¿ÐsF-pRÂ%J”ôœ@eÊsœXÖsŠAì<' Ñ{N±jš}AØ]¤Ó˜I1E0Ÿ\cLzŽFZúa×*Â|qÔ¢o;ò’m§*S.ãƶü{—)±s™4Dï2!ÄŒËÙ¹L¤w™ãä27-ï‘QkÎv –aU²{ªL¸Œæ£2HrH)Êts 5EÊòë äc³ï×.˜#Æ0)‡ÑkÌ`¤X!.55¿Ù“¹{¿%0ïùzzï.×Ó[wµNø¡(ê-Æ”³\¤ÚËG›:v­ó•R;WI"ôž |®ŽÇÕSu¯£§µ°ß–‘? ßô{ €a]ì9½ÂôsÚöL¹yCPeˆž @§0PÛþ¤”QCÈò†`܆)I‹=§W˜~N˜Wœç-Áäß‚©r BÆÄ="vo ‡/“nºJ˜½ª€DSìQ,ldeF–lɆ*S!ЉÝ‹ì‚`¤‚!È6©‰ùÞ[n¦m+RÙ¬£Ô“z™'¥ÌØÎ*»Á$¸†œµH§1j#I…‰™ƒÿ=“~,¤ qÂu¹'õ3OÊ(˜M0rƒ9˜½ûƒÑ‚.ì5æ@ 0›Â2fŽø„²?ùzµ XZ|ý’A0”+ÛçA†\®hÖ‹¥¡bþ©ÞÙ›>Ú‹?˜fóÍþyUÛ¿wç¿ûí×£óöH!ü½ÚmÎ/>¿ÔÛöàÛ2?4U{yˆ}k½:UÇäÿDHÀ¹—pÈ^]ƒ}¹i”Ò›NÛA¢ó>OÍýé•…>ó&h 8·üh/ƒ¹œ.ýÖŽûùJ˜zw>dúuæ]Y+Õ«Ï[kq‚Vyo#¸Œ^ôb¯t=³øÓ·WÃc#µ½ §½“xÕØ»•,©«Ok2Ô¯L”Þp‹Îãf0ë30C ]²¯hLä|NªM¡W¿ vU‹áóMÕ4>×S ñÕ»SõTE#L;j»)W¦vÔZ¢Ò1DÕvÝŸ•ìÏDuRÞ×j}Š43Ý)Óbý±Õ4Dwj5„¾ý%¨À%—O{<•}ž²1<…¢¸.HÓNa‚¥¡ÜU)p>˜&Á¹X€‹{oŒÂ×5ÚSø|›=À7ä>q,>è6o½4ÑewÌ×(íõ*õjfyÛ—K~·ÞfeeÎÅ $x›)ÁëFx Ácã<®‘fªä.­@c""9©ö@§-¥ã?_ÚÞ¡«oí—õŸ“Ú»ög¸J=§W˜~NJ”ÐÈs.lƒè6Ò/ !ÂÏûýv ? ïæ§3ÎÓ¼Jí´n5*eÒ²¤ä®@cê<÷E*p+:]Qñæ+*t—REÍëI_&µ;Uý~h{nÕy^;µŠã©í=µrzá·ÍwÚ¹Õÿ¸c ©endstream endobj 1855 0 obj << /Type /Page /Contents 1856 0 R /Resources 1854 0 R /MediaBox [0 0 612 792] /Parent 1853 0 R /Annots [ 1858 0 R 1859 0 R 1860 0 R 1861 0 R 1862 0 R 1863 0 R 1864 0 R 1865 0 R 1866 0 R 1867 0 R 1868 0 R 1869 0 R 1870 0 R 1871 0 R 1872 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 1892 0 R 1893 0 R 1894 0 R 1895 0 R 1896 0 R 1897 0 R 1898 0 R 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R 1905 0 R 1906 0 R 1907 0 R 1908 0 R 1909 0 R 1910 0 R 1911 0 R 1912 0 R 1913 0 R ] >> endobj 1858 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 689.4908 261.6471 700.339] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.18) >> >> endobj 1859 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 677.2589 229.4071 688.3839] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.19) >> >> endobj 1860 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 665.3037 218.9464 676.4287] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.20) >> >> endobj 1861 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 653.3486 176.2458 664.4735] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.21) >> >> endobj 1862 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 641.6702 208.4858 652.5184] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.22) >> >> endobj 1863 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 629.4382 206.1633 640.5632] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.23) >> >> endobj 1864 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 617.4831 206.1633 628.608] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.24) >> >> endobj 1865 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 606.9116 171.0154 616.6529] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.25) >> >> endobj 1866 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 593.5727 200.933 604.6977] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.26) >> >> endobj 1867 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 581.6176 206.1633 592.7425] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.27) >> >> endobj 1868 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 569.6624 176.2458 580.7873] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.28) >> >> endobj 1869 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 559.091 181.4761 568.8322] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.29) >> >> endobj 1870 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 545.4753 196.808 557.4305] /Subtype /Link /A << /S /GoTo /D (subsection.7.28) >> >> endobj 1871 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 536.0108 194.179 544.9218] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.1) >> >> endobj 1872 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 523.2255 181.4761 532.9667] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.2) >> >> endobj 1873 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 511.2703 211.3936 521.0115] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.3) >> >> endobj 1874 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 499.3151 206.1633 509.0563] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.4) >> >> endobj 1875 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 487.36 221.8543 497.1012] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.5) >> >> endobj 1876 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 475.4048 216.624 485.146] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.6) >> >> endobj 1877 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 462.0659 299.7029 473.1908] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.7) >> >> endobj 1878 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 451.4945 232.315 461.2357] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.8) >> >> endobj 1879 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 438.4323 193.2934 449.2805] /Subtype /Link /A << /S /GoTo /D (subsection.7.29) >> >> endobj 1880 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 426.2004 241.3112 437.3253] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.29.1) >> >> endobj 1881 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 414.2452 241.3112 425.3702] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.29.2) >> >> endobj 1882 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 402.29 262.2325 413.415] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.29.3) >> >> endobj 1883 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 390.3349 267.4629 401.4598] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.29.4) >> >> endobj 1884 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 378.6565 196.0054 389.5047] /Subtype /Link /A << /S /GoTo /D (subsection.7.30) >> >> endobj 1885 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 368.6385 194.179 377.5495] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.1) >> >> endobj 1886 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 354.4694 185.2419 365.5943] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.2) >> >> endobj 1887 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 342.5142 236.0808 353.6392] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.3) >> >> endobj 1888 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 331.9428 190.4723 341.684] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.4) >> >> endobj 1889 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 319.9876 209.9291 329.7288] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.5) >> >> endobj 1890 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 306.6487 257.0022 317.7737] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.6) >> >> endobj 1891 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 294.6935 215.1595 305.8185] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.7) >> >> endobj 1892 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 282.7384 215.1595 293.8633] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.8) >> >> endobj 1893 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 270.7832 229.386 281.9081] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.9) >> >> endobj 1894 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 258.828 225.6202 269.953] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.10) >> >> endobj 1895 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 246.8729 245.077 257.9978] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.11) >> >> endobj 1896 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 234.9177 280.2249 246.0426] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.12) >> >> endobj 1897 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 222.9625 250.3073 234.0875] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.13) >> >> endobj 1898 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 211.0074 255.5377 222.1323] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.14) >> >> endobj 1899 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 200.4359 255.5377 210.1771] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.15) >> >> endobj 1900 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 187.097 265.9984 198.222] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.16) >> >> endobj 1901 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 175.1418 425.4613 186.2668] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.17) >> >> endobj 1902 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 163.4634 394.0792 174.3116] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.30.18) >> >> endobj 1903 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 141.5456 301.4654 152.3938] /Subtype /Link /A << /S /GoTo /D (section.8) >> >> endobj 1904 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 131.5276 158.3134 140.4386] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 1905 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 119.5724 244.3244 128.4835] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.1.1) >> >> endobj 1906 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 105.6801 206.8536 116.5283] /Subtype /Link /A << /S /GoTo /D (subsection.8.2) >> >> endobj 1907 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 93.4482 220.3898 104.5731] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.1) >> >> endobj 1908 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 82.8768 215.1595 92.618] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.2) >> >> endobj 1909 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 70.9216 234.6163 80.6628] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.3) >> >> endobj 1910 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 59.7966 206.5769 68.7076] /Subtype /Link /A << /S /GoTo /D (subsection.8.3) >> >> endobj 1911 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 45.9043 282.5473 56.7525] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.3.1) >> >> endobj 1912 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 35.0561 195.7026 44.7973] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.3.2) >> >> endobj 1913 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 21.9939 158.8945 32.7314] /Subtype /Link /A << /S /GoTo /D (subsection.8.4) >> >> endobj 1857 0 obj << /D [1855 0 R /XYZ 64.9134 727.2935 null] >> endobj 1854 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1916 0 obj << /Length 3201 /Filter /FlateDecode >> stream xÚí\[oÛ8~ϯ0ÐX3¼_m6Ó3Ømºm»ÀtÔDIø’±n;¿~)‘Ö]žŠé6q^ZG¦Îùx.ß¡H½‚OÌ$3cTiá!ZQ 03¥Pæ8i€<²~IA`î"Ö¯’Ⱦúå‡Y Ùò„ŽN%-v`ˆ‰h§—8d§1ˆ1 HU;“/wb'åçBGœÏ qÀNÊ06Y›ÏMögÚf(#nIFj8bÖûãê%j°K&ª†^®­v2Ä$‹žv£&¥<‡çÉeF©àEH/$¤:*½‰„*1½”Dö¥?Ìjø)Ù4T”MYD½Ä!EŒZb[V1ý²]'Íôe6FGTÒKP’B»D™®êx±Ù¶“ŒÑQ-p‘DbÙ$Ù ½¥aÜ ú UÁ`QE/qHEÉÄ@u¨¨ø9½Ø®Zgƒ¤9QLFœ1š¥^à€¡ ÒŠàðóŠ¡·›´¡ ¥25ô‡Ta,ÉÞsÁ ;-.+\pq ~ÏlGW¥‰²àâ/Ö–^o?-RK¶׾ȉø…½°²l|㾂ëØ9ÕÓ-\‘÷‹9ß5)/ðî å@çCÁyè}’NÜÝ…/ð÷Í:uÈo2? °ðâ:å€f²ï­u¾Ä¶†Û,™ç@¾°×N-N?µd6mçÔ“Xà'Ïà_ÒÊÑ8R˜šb쬈‚ÕŠ\bç'wýü®n’þ¸…«É¼-£j Ù xwß„ñî{ÃGÈŠ{Ý{¹ª(ßÞ¶+1£‚_r]uG§ÍÓ(Ì›M>hûɱlÓ¨2R™†§ýX°o× ÿjµÞ%Ë¿1¬¥ç1Pº^§ùB\wŸ Åzð"J<´ Øóg1P¦ ºÜË!d•êXøQÄ7 iªšÌ|ö;Ö|z;¯„n[Ø*‰8ÖUy#v¾5n;oØö"ràbmÚâöÉ…MwàVã6 QfË(cÚ7Š·D‹Ü(]†E#fi³Ê¨V-AËÇ4ú‚kû£˜ÏÁÊ"{ý0Ìjx³Îik‹*‘$”hQ1HTƳ4H°”b@Ä`]µÔ&—ºŠv›ˆ“$©H ¢œjÏÉ0HRüc¯Ž£¶,6|Ìëý*º±—«ãüjžúxN–—ù‡µúì&ÜÿQ|ÙÈW•&‡Ó}±¾îK…¯ïÇò®ëÆ6¹õ®‹Jzh@6z0µÇ²o`K®Ø‘q¤ùÍÙy+?­Œ®TקϞǨ®»‚™åÏ%çiþu;õv}ˆ«êaèÑIؤËöáÒÆ:+j}ñð½iWÊØµ%YÁæIŒþå?ÇTMÏàâ;{ÿ&†‘ÔmÔ³8³“¹gÁ6<ç_mÑêÀ¼41 îg.yÏ7Ý:@3 ^ §ÌIˆ‘´ôÅ›Ÿ;zÂd#{oûWæàMÇ}!”}ÞÏ;‚á$†ÍgïÚn­8’’7Pß]ÿ’ÉgàóÔÐïÿNñ‚1@TKªš%açv‘—Eö°ó0Ì=?JÖ—Ù2™gÛ¯m3ne #8:Ó3.ãÙ$ØK9AÐb™n{Y—½#zôœqfâÙ$ØË€ðsûȯboÒhIÇH(уÄ! 9ƒ’§kDpÓTRa0FÅ„ÑKRR1ˆvYƒqµL#ì«kº 'r 8A“b„ •Cî„‘Æg"HÒ³Kp «¦·pa³®&uô‡tÆ>|d‘¼BI"aÅTŠM_,ǤP1ËHId_ñÃr‹ÕujÀ •uô‡tT u]ÇöY10qúa®||ëwy#* þC”ˆzCª‹“÷_ÝFQèP>SSÐÚg”Î=´fäÞM¿ì[=Ñã6”r¢$43G”Döå?ÌÕ–ù¼sÇW<ÃŽ¯ýŽ¯ŠŠ—ÙÕUºN—Û¶D!¡¹¡a?œDQvЯ#˜˜¦‹ŽÚ”È1€‹1é¢%‘}.ꇹótag¿¥3a"Øc™èô ÌÁ3o”‰q}23ö¤H‹çe‘=ž†•<£¹n†ËƒÇï-$© ßB‹kªjÚ#'¬•ã{Œå°7_ÕQ…»ƒ$¶ËõD6ê¡+Ó mb.ë”Eö¹«–÷q¶Ojs…|+ªjYi÷Šàß›x¦‰¦ÚC€@DiÝT·‚Ðj+WÅF,^)ƒ¨‚>"ž©^⩚"ŽMÕÒôKr±·®[ {Fþ ž— å7;@(1¦šq'FÅð>ÉxÌ>¸,²/îü0«á:'ÛlÕzr ~À0³ßÚÆË·¿™ 8`,¥qMt»±­+Ç}ßKN^3ŠS•{µék¾kŠNøïIÞ»§„s×ö^»j;¹í³ÄÒNnMÈcSÜL­§,=¯4ãšbfÉQ³).‹ìK~˜[ýN>¦óly}Ç #–±¥„Ñkì.a´KîÂXÃahù–1Ž!:‰CÆH»¥WWm¶*‚ÀÏÕÿ/7–ÃkF580§¬žÕ†ŸAV;»q»ýÙŸaï£Ý˜³O^c‚=f2€Zã¾LFðÈTF?[¹SYId_*óÊãÖIÒ;Ne±Œ-¥²^cw©¬blò¥ÛXmwl?”nÛ1 ÜR=ÜbDÚOàÙ*oS€ *¦¿,nÓõUr‘¹mS– i6}»^ÍWî3/öVÂÅS»ÉCÁˆnio$b^[Y2nK¡¥]§É|îÞYQ­ÓüéÕMF«EþÇ[»­0¿¯bò‘e•rSÏÆMÀ8lÜü%ÏêT·…óò6?1Wœ³%AõÈc»ÆMl÷X3_­ÓìzÙ¹uΧÔËÌí›-¦ã³*èBøÁ.ó˜Ï´„ŽÍÈFêç¡Î?o½9͓ǕõêåÅÖQÃù‹ó`ÞåÁ¢iÑ]hŠÍ3‹ÞöÆý›{§;r{}»(m@¶ˆþes³¼…RÖódµ'¦JËCvAUàöo»¿zmËÄj¹ZÎ.ý.x`v–ñ‡Ö/ßôØ×EA`¬â¾Ã%»àÒ\¯ìë’Ýùô'ÀÅÔ-tšhoTìþµ‹G3ÔÒQÈÙeº ‡-Ü `¶Ùîöå~•»¡a÷>U—kÙõ‚÷ó-ÈnÛ¶ì])/ÀÆð{ Sx)Vk›B‹Vð‰õ£ÌbN”’Wh;íy]È]Á´nšž)@ó±é‹…p#®ix•Jî«Éuæ•Ö(\ oW.æ-Ï;$àHp¾e{—·%`à¼_­ŽŠœÒƒóBÒ^ihÜþå(ÜÕ×òÓJ›*mpÀÙìG»¼Ð÷h§ëÔ˜öØm:ŸÑæpÀã]àù®ìüX³iº uÄøõ«1[[wìÆòWvŠ«««´ƒ2®&~»¨õÝÙé*ÐÁd=ÀrTÛæ‚çr¢Ëåt€ìÆùT­œÚ„KÞ—49¸ZÑ ¡òºÐÔ¦Ÿ¡ÙOæî•AÛruvÍmæ^”“/ †Ž.-Þù¿([-­ÏJó]¡jƒC¶v>YÑq¼K²Í® 8¢0õj½©¯Æ?å Î ­Hƒ.;_JKol,ïcq­Kx—#tÆTè¤}hþ? $8“endstream endobj 1915 0 obj << /Type /Page /Contents 1916 0 R /Resources 1914 0 R /MediaBox [0 0 612 792] /Parent 1853 0 R /Annots [ 1918 0 R 1919 0 R 1920 0 R 1921 0 R 1922 0 R 1923 0 R 1924 0 R 1925 0 R 1926 0 R 1927 0 R 1928 0 R 1929 0 R 1930 0 R 1931 0 R 1932 0 R 1933 0 R 1934 0 R 1935 0 R 1936 0 R 1937 0 R 1938 0 R 1939 0 R 1940 0 R 1941 0 R 1942 0 R 1943 0 R 1944 0 R 1945 0 R 1946 0 R 1947 0 R 1948 0 R 1949 0 R 1950 0 R 1951 0 R 1952 0 R 1953 0 R 1954 0 R 1955 0 R 1956 0 R 1957 0 R 1958 0 R 1959 0 R 1960 0 R 1961 0 R 1962 0 R 1963 0 R 1964 0 R 1965 0 R 1966 0 R 1967 0 R 1968 0 R 1969 0 R 1970 0 R 1971 0 R 1972 0 R 1973 0 R ] >> endobj 1918 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 689.2141 410.6282 700.339] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.1) >> >> endobj 1919 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 679.4728 209.2613 688.3839] /Subtype /Link /A << /S /GoTo /D (subsection.8.5) >> >> endobj 1920 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 665.5805 324.6414 676.4287] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.5.1) >> >> endobj 1921 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 653.6253 397.8451 664.4735] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.5.2) >> >> endobj 1922 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 643.6073 201.9 652.5184] /Subtype /Link /A << /S /GoTo /D (subsection.8.6) >> >> endobj 1923 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 629.715 253.8719 640.5632] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 1924 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 617.7598 519.453 628.608] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.2) >> >> endobj 1925 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 605.8046 519.453 616.6529] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.2) >> >> endobj 1926 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 593.8495 473.3263 604.6977] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.2) >> >> endobj 1927 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 581.8943 519.453 592.7425] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.3) >> >> endobj 1928 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 569.9391 519.453 580.7873] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.3) >> >> endobj 1929 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 557.984 483.787 568.8322] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.3) >> >> endobj 1930 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 545.7521 266.8563 556.877] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.4) >> >> endobj 1931 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 536.0108 238.8448 544.9218] /Subtype /Link /A << /S /GoTo /D (subsection.8.7) >> >> endobj 1932 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 522.1185 244.0199 532.9667] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 1933 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 510.1633 519.453 521.0115] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.2) >> >> endobj 1934 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 498.2081 519.453 509.0563] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.2) >> >> endobj 1935 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 486.253 519.453 497.1012] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.2) >> >> endobj 1936 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 474.2978 519.453 485.146] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.2) >> >> endobj 1937 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 462.3426 375.4431 473.1908] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.2) >> >> endobj 1938 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 450.1107 519.453 461.2357] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.3) >> >> endobj 1939 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 438.1555 204.6988 449.2805] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.3) >> >> endobj 1940 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 426.4771 194.1236 437.3253] /Subtype /Link /A << /S /GoTo /D (subsection.8.8) >> >> endobj 1941 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 415.629 230.8505 425.3702] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.8.1) >> >> endobj 1942 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 403.6738 200.933 413.415] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.8.2) >> >> endobj 1943 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 391.7186 220.3898 401.4598] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.8.3) >> >> endobj 1944 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 378.3797 330.4783 389.5047] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.8.4) >> >> endobj 1945 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 366.7013 284.0118 377.5495] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.8.5) >> >> endobj 1946 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 354.7461 192.048 365.5943] /Subtype /Link /A << /S /GoTo /D (subsection.8.9) >> >> endobj 1947 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 342.5142 361.8604 353.6392] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.9.1) >> >> endobj 1948 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 330.8358 212.1117 341.5733] /Subtype /Link /A << /S /GoTo /D (subsection.8.10) >> >> endobj 1949 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 318.8806 278.7815 329.7288] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.10.1) >> >> endobj 1950 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 296.9628 206.0571 307.811] /Subtype /Link /A << /S /GoTo /D (section.9) >> >> endobj 1951 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 285.0076 200.544 295.8558] /Subtype /Link /A << /S /GoTo /D (subsection.9.1) >> >> endobj 1952 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 274.9896 194.179 283.9007] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.1) >> >> endobj 1953 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 260.8205 227.1382 271.9455] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 1954 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 251.0793 206.3278 259.9903] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.3) >> >> endobj 1955 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 237.1869 212.2224 247.9244] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.4) >> >> endobj 1956 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 225.2318 220.2479 235.9693] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.5) >> >> endobj 1957 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 212.7231 246.5383 224.6783] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.6) >> >> endobj 1958 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 201.3214 285.5863 212.1697] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.7) >> >> endobj 1959 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 189.3663 308.6666 200.2145] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.8) >> >> endobj 1960 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 177.4111 283.7599 188.2593] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.9) >> >> endobj 1961 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 164.9025 290.9552 176.8576] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.10) >> >> endobj 1962 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 153.5008 221.6316 164.349] /Subtype /Link /A << /S /GoTo /D (subsection.9.2) >> >> endobj 1963 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 143.4828 194.179 152.3938] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.1) >> >> endobj 1964 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 129.5904 243.6325 140.4386] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.2) >> >> endobj 1965 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 117.6353 234.6661 128.4835] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.3) >> >> endobj 1966 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 105.6801 236.4649 116.5283] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.4) >> >> endobj 1967 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 93.7249 236.7693 104.5731] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.5) >> >> endobj 1968 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 81.7698 281.9057 92.618] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.6) >> >> endobj 1969 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 69.8146 247.2855 80.6628] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.7) >> >> endobj 1970 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 57.8594 235.0812 68.7076] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.8) >> >> endobj 1971 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 45.9043 355.1866 56.7525] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.9) >> >> endobj 1972 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 33.9491 196.1437 44.7973] /Subtype /Link /A << /S /GoTo /D (subsection.9.3) >> >> endobj 1973 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 21.9939 259.5451 32.8421] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.3.1) >> >> endobj 1917 0 obj << /D [1915 0 R /XYZ 64.9134 727.2935 null] >> endobj 1914 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1976 0 obj << /Length 883 /Filter /FlateDecode >> stream xÚí˜Ks›0Çï| ဢ'’zÌk&9¤pKr`lœ2Åbçõí»’ãWêé¡m22I¬Åÿîj÷8 ŽÎ52Ø$,Aé %ÊRœ`­ Eéô&ÔÑ]z‰¸I°Æ âO>_¥gWéµ ÎÒ€Â8Ate%X˜D¢É<øÜÜ4 º VF¡g¸'˜-Ñ<’c)8ïFÊà:øÚŒ;‹ñÐäñæÎ)aX)*QbLp·Kƒ9fQL¥áEµXfUÄt¸,"fË¢®¢˜sæ°"l`¬©;"CÅ’í ¼ÿÞ¹–üéÜ_3­ ©IÜ'(¦)Y’·(SKñõ!Šá’ïb( }¿þ_Ñò=­çYщ³qDM’Œ  Õ:CÚ3”-óc±°²\ÂÓg7{ãD+,[±x)¡j»ìJœI ö‹uþ¼™ wE{˜ÐG–o²T-ËoN–6læŽfîTæRÔz~êè©Goï@êÎÛŸ"™„Yù¸‘Ù}ð>xŽ‚ÔûiÖ¹¨›µP¹©A¡ÇltWJln°×¯‘Í?ι_>2dõ>ϧtHÖçù|Þçu§R%F¤ÛHC3u• ›šµgPÂXx’•eaL÷^­_šº´ÞïÏœn[Þ'`šaò>ƘöE© .®ºrjúØÞþ e¼ðVd}Áï*€lÞ°Êü“}â蜱Aß@Sˆ$Lµ]ùëf?ƒbI¡íC|»¡áš¾£»bh@tâšuÿoô3z‹ñФkh¬í bl¨Õ/ÛNÀ-¨‘aÿƒ ¬ëº3±÷ËlÇ Søu!Úu‡Y›”ue„½'Y)jBFˆvTœh³íˆ|¿Xb!¤ËÏ.QOꈩðÉ?Ö5«60.¿·Õd9(8ÝL=ó×ÌΔ~Qm»& Ld˺Åêÿ;Í[÷b„½™%d›%Nó[B…MEÇ#ó—*î’ðƸìÜ.+ª[" üýVŒ3 «‰?ãk“|Ì>“ÿ¼/…Š‘BØu²O#ûÔ›-~¬r¸OھŠŸ©šø³¾×a¢äGJŒˆVvt ¤•š€„˜à@úšg–79 Y8äæÄðVsŒø4îÇ[ÚM_TÓüe÷s¦Ë'¿ýö©óendstream endobj 1975 0 obj << /Type /Page /Contents 1976 0 R /Resources 1974 0 R /MediaBox [0 0 612 792] /Parent 1853 0 R /Annots [ 1978 0 R 1979 0 R 1980 0 R 1981 0 R 1982 0 R 1983 0 R 1984 0 R 1985 0 R 1986 0 R 1987 0 R 1988 0 R 1989 0 R 1990 0 R 1991 0 R 1992 0 R 1993 0 R 1994 0 R 1995 0 R ] >> endobj 1978 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 691.428 220.0265 700.2283] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.3.2) >> >> endobj 1979 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 677.5357 186.4855 688.2731] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.3.3) >> >> endobj 1980 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 667.5177 198.247 676.318] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.3.4) >> >> endobj 1981 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 655.5625 205.4976 664.3628] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.3.5) >> >> endobj 1982 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 643.6073 211.1154 652.4076] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.3.6) >> >> endobj 1983 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 629.715 229.325 640.4525] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.3.7) >> >> endobj 1984 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 619.697 210.9771 628.608] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.3.8) >> >> endobj 1985 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 607.7418 203.0346 616.5421] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.3.9) >> >> endobj 1986 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 593.8495 194.2343 604.587] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.3.10) >> >> endobj 1987 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 581.8943 195.3966 592.6318] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.3.11) >> >> endobj 1988 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 569.9391 200.544 580.7873] /Subtype /Link /A << /S /GoTo /D (subsection.9.4) >> >> endobj 1989 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 559.9212 194.179 568.8322] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.4.1) >> >> endobj 1990 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 545.7521 305.596 556.877] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.4.2) >> >> endobj 1991 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 534.0736 332.0511 544.9218] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.4.3) >> >> endobj 1992 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [78.8611 522.1185 253.1796 532.9667] /Subtype /Link /A << /S /GoTo /D (subsection.9.5) >> >> endobj 1993 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7752 510.1633 270.8914 521.0115] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.5.1) >> >> endobj 1994 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 490.1827 134.6461 499.0937] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.5.1) >> >> endobj 1995 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [63.9171 468.2648 109.2263 477.1759] /Subtype /Link /A << /S /GoTo /D (section*.3) >> >> endobj 1977 0 obj << /D [1975 0 R /XYZ 64.9134 727.2935 null] >> endobj 1974 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1998 0 obj << /Length 2561 /Filter /FlateDecode >> stream xÚÅYIoã8¾ûWø62Pf$QkŸ’Ôž®TÕTÒ3tõ–e›YJkÉÒ¿~ÞBÊò†r  DI½å{+éËÛÑÙ»dœŠ4ò£ñíbzRqŒcéŠ$q½ñíüw'üq{5z{;òÆ.üyã(©'a—‰ Âq¶ý5úýw<¹ã«‘+â4?ÂØ2MÂñz„R„”v¦ÝŒþÙœZŠÓ!ÉKÏKÆ^ dù( Ý¥¾ü@’|Þdêy~è\dé9we…Çf|¾¤Ç:ÇG9‘¾Óâ¨A•¶uwÇS)EG¬ôÇÉTÆ@fâ'NÕs|uBßáD΋mež+UN€³}ƒ1íð9=çªn­~ŠràîjÁϬZÛ}]«á¹ä…&Ãy—™áªZËÇLtÈ\?`uC»a¢Å÷çm&_‘±ªuï?UÍÚ©¢¨ð«Gm™ƒ¼bãy" CŸ°é5”Ó굩A„uNj¢ò¨.–ˆŒþ7$¦ªaE”’±D*J°Òùƒ™ C’^¢v‡‘ógOµVP_‚‹¸ÒÑæŸ¡³¬;óÅ.xyÓÅÁšfâÇÎ gW$HÒVøœw‡Î'úÜ!;J÷¨™‘1ÏZÞ§Z^üøùÛÇ ~Ãý úJf®ºÚlDÑ6F6m†¼jIª JL¦„Â-í>`:]"¬„mU ‹ò6š¼ÐXg…/ƈKU‡‰Â‚:ÚR:‹ ¼{awçó*‘!¹;þ‚âÈP¡=Oì4ÏÚ3´tíhuÁ ä`­&xIUÆå`÷ ˜á„Æ'ZV•wLâª*yŸ*yù{¾l*3c­DÛÈp#‡¢˜=‰9@€hþÝõ$y ÉÇ«+³ë¾ÛÌi6‡•¬ßb¼ •]ÔN…ñ†‘{Àì”<HžtÖŠœ¡SzŒv¥é–˼iuU6¯pƆAßžéRÕ–--|¼ùb8ådWäWêL<«NrS¸†¥2ÏÇÞ!‹Á7¸Òc ã‚¢£À ]òæGRа¦Ý„Ø(ãÐìiðá}“€M>ÅNh r)Æ7Ù0“¬ŠÕ©Yô–l„å´ À2ïnñ›k˜ùÄ»yœÜ ?DB>Ù„b˜pŠåÒí0|BJJÂKVçªí£u&\ãq$ÒX&Xý$„nÀ‹¡f'aœ’o÷ §IäFãé`׿ö‰…0Š‚Ô‹×R†§¨>dô™Ù‚Û?ae<¾Võ }´¼ùÇ+B­5õÓTx1òzÉ!4äŒ9×¥ª%O€‰Æ' æj|Ïåjß›ìPZÈŸZc9`Õ›d'™dê^a¶Ô…&\E‡\Âc&tý(ø¿›“QÕ½1kž± ŽÓü¼0À4ÝK(âfRÿMØÙ€3ÖKDì‡ÒZ[¸M~›ìEe@;®rUN_¯jm U[Ý›Â.£È¹@{ÎÍËŽ/ÀŒ^›VÄVÔÞ£ñ`ãƒn:Ê€0¿•3ë‘‘±"r³ñ)Xàʲ³ûýçßxð•¤,ªÊàm! >3oÓX4A»5Ý.ðR6>¿iSªk.á8w…%•ΗüÚýEÎk¶lâØV%«ù§pŽœV›a{£1ŽußB9G9@Ëh‘$ˆ2>›j=`°AˆgEZ;F »¯7ýJjÒjcÛàM õÜT*“ð¾îÛÜ”é}ÁÝдﭩN4-´åFê®!wu~Ð4׊Òÿ³!n;™^6Û˜¶ÆÛ]?,gãFq1ëZ²ùí/ð^0ˆx8ž¥Ý<˜òMâ„'ÞÏ färV(ò'ôÛA*ÖoQîGqq/%‘ˆ“0…4y¡=þí1Šáêúp ÛìêM1QŠø4)þ$•gçÆgg ©*ªzy"Ÿä4Sf C> endobj 2000 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [178.2454 655.7147 325.3504 666.5629] /Subtype/Link/A<> >> endobj 2001 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [219.5501 619.8492 275.9146 630.6974] /Subtype/Link/A<> >> endobj 2002 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [288.2421 619.8492 382.9345 630.6974] /Subtype/Link/A<> >> endobj 2003 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [211.1568 583.9837 294.4212 594.8319] /Subtype/Link/A<> >> endobj 2004 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [343.4112 536.163 372.5523 547.0113] /Subtype/Link/A<> >> endobj 2011 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [158.6039 376.2073 265.3566 388.8001] /Subtype/Link/A<> >> endobj 2012 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [88.8238 316.4315 160.6379 328.3867] /Subtype/Link/A<> >> endobj 2013 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [219.8328 217.3586 244.5872 228.2068] /Subtype/Link/A<> >> endobj 1999 0 obj << /D [1997 0 R /XYZ 64.9134 727.2935 null] >> endobj 6 0 obj << /D [1997 0 R /XYZ 64.9134 702.3869 null] >> endobj 1996 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F7 2007 0 R /F14 2010 0 R /F24 2016 0 R /F29 2019 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2022 0 obj << /Length 148 /Filter /FlateDecode >> stream xÚEŒ»Â0 Ew…Çd¨±ë$MF©@j$†ª˜ø}Ê€ÐÎÑî¦Àj1Q uÀòÀà(‰:l”)F,Ó`„m¥"âØJ˜Ù¬mÍöØ]¾¾²³;äó¢Ü•ÞŽ¥…\@äZr)x¼Ïð‚adœ€±¦&5ø^šISô8ƒóJÞ©þ–'ôp…¯Æ$dendstream endobj 2021 0 obj << /Type /Page /Contents 2022 0 R /Resources 2020 0 R /MediaBox [0 0 612 792] /Parent 1853 0 R >> endobj 2023 0 obj << /D [2021 0 R /XYZ 64.9134 727.2935 null] >> endobj 2020 0 obj << /Font << /F8 1548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2026 0 obj << /Length 3555 /Filter /FlateDecode >> stream xÚµZIsÜ6¾ëWô‘ªQs¸€›oŽ4Nœª,SÑTŠè&»Å1 ɶ¬ÌŸŸ·»iÇIyJU"‰åxë÷ú›û«¿¿É7…_¤Qº¹?l’ ÷U¡6Yøy„›ûòÁ Ãëw÷ß_ýãþ*ÜðnRåa ↧Éfß^ýçêá]°)¯‚Í÷WŸÙæÞ?.òdÓ^©$öǦ¥¹úåꟖàÖPܺ$¿Áí…ù&T~¬Ò7hÆ¥Eä«HÅ´Áèz†Qâ½í®ãЛàËúëmyåi?ÕøÝwx†åaƒÍ6Žý,Kù˜ßþø/˜„ÞÏCß\Ô#~FÞCòŽÛë‘4?0f¨*þ8›³ï[\õ šê¦¸ñ¹žàûÑŒèÆiÐ5´t×QŽ»Ææ±o>P›ê±ïþ3T~ B…pÔ$«—}«ëN¶WBG…«ó´¦ºÞF7•|’ö¼ðû&RÔÝ “/aèI_îjý»½UJyo®óØëq#qì fÖžþÛS@WÝAß¡ÇÄ=á êÕ;ØPîõ§ëÐL`ÞËËÇX"¯ÇŠ›q§FæM¼ ìph …Æ¥¡DÄ7ç‹bP£ våž-e˜‹¸swîýŒâª0xOZÕ>ÕaÃÀ;Ú©°:ãCÃsz¬˜Î¯×¹òô0TÒñz‡z°Ÿ¸÷½G>>eÆoAüz†¡÷úh…Ï;Ц¾CÅ©÷vâT’ašKe×dŒgLÕâŒ)snèƒnù{êùI£cÏî‰E/QZøùüXóIø“˜‰$ »:&gÇ£Ž¤~z2½¥ôº+*¯!sxÞ6®~sW‹ŒË<$_w²bbY=‘ºU]9/¤yHRwÇ“hÈ cöºi*ÜL!ªLÆYoõH;®Z\t‡ç~áA#³š,Žt¤ÆÐ‡nœ¡e5ŠÇÎ,r ó‚—o¡™4³`ÔAÆi˜y÷8Éè}Ívˆfa}G’Dšy‰šA;ysy<˜,ï±m§ŠÔüa§¹Î‡,[ðÀÜøLŲœèë sâI !ÊÎ36€uË  \ÄQK3uÇÔ{ð-IêýÛú&¡L‡‡g¿›´!’«DsÎ&0ùžÈ޼žµM¾­<2׬¨ élžxOƒ`‡ƒðyJZ ŽX]³úrÓ8é®äiºéÍÑ¡ƒ¶ù±ÚŸ&½3Ö͇XùÁõyH¯? Fçd 2q¬ÛºÑƒ´šÍ>?ê‰ßÊžÍe\ìù–û3·rüYP!ûNPÙ[~9¾>!€GîÐB-¯$Ù‡^ôÞŠSŒ³qâO .HçdÆ‚¢ËéRKR›RYH ™‰gœoÁ|S³L‚ ü_S¦šWkæ,‰p²©­]Ä•Xàcݪɫ+ÃÐèsE “^·‹EÌ ßñœ‹œ~Dï]¬ØÌC~˜1^Ë ç…‰]Ÿ‘g{rÌ jiÑè@¾’2¾ZÍ_fåcÄ=¢¶‚á ˆóÐB—I-²çý–d°8J¢þ€_‰ä5”èU”àW\ÇÀ4œ×£uN®OâlnG0=f'§-qfŠX ¡—" g?ï·;ãQ2ï#[ß³ELØQ#Fr·8à»·?‹!@DÙ†iæÑ#5ú¡rü6Ѽ‘m=V‹ÂÌ2´@û01r˜¨h·Ú ÞØš\º¯”üFXu˜*xm?À#Ÿ¡¥Y•¡Ü°¯)Bã¶–NGdòDr^.Ší†k+R*œ |Îù nÊz}‘ãøb£&í¡jeåVãà¥4rË?ƒ³DE·ò¥ Þ?RAí2CåT2CåJã¡)Jø|ÀÜŒ‡F‘3TÞó¬Ûýþ²0¥~˜„™ z>,d·œ =€OÒ_xÞòÃ: PÞiá=ÄX¢J’¹g¡Äž+æ1CŒòË#DAê«8ùƒ3~g±„4É3 ™#S×K´=6ÌÙ;zNà3ɤ&›û! “­£†m£”ªÒg¨Îf&‚GA£öQ³-Œë#uif‚"–9.¶ÑvØùWä+UäÑ$T᛹üJ+.qôžðçÃøzË>ÔZ¨r¦â篹˷ÄÖ„Cê É2vâÒ°C9RH'ëH|·|ÃÈ®²ÑÇzKhÞ¡—xYQ pg`©ÑëãšF€qDaQÈN~”ÕX.Ž^nk KU°ûY”YÄÕl:’š©…¹5 »ØyOÏ:æ`miš¬$Ëkå ã{g-ÄŠú\3ÂT˜ò#[sJG0Àíœ$-¶×è"‘c:5/fÜö‚[ V¦¤?Úº{½Ê_ñR[yýÓnjß<9éÂ…`ãÔOC°:ë®âŒëbYrލm.ks.€m”OuÇ“”+ï<0rëvǯŠ<øV|hZÂèLqýfŠ&´ •*h"ðW° ÎÑü)ΡÏbÎx©$Kd›ˆSÅ‹aÁÔ$X©¢¹ Ò^‹èa ‹è EFhvo8 ™t@¹e„À _ðU—•–©hB“ÌÃdŸ³-!¬…‚ª«=+^æB *pNZ‹JBcCB¥ºWÆY´šƒ—Fž"ßVb Þ=EôW4Q*l–£*\` øäz_aêñÌ/O6\á «Ir[‰4Ièa˜ž—iΠ>w4P¦-·a«äaµ_Êùêqª÷.¡2wî¤umºá¬~:yãU‚ôÌ |W”§×Éõ]䣫¸>¯€¹O¤¸0kGg(?÷?!DÚÚË8qÌ•…¢Ð](ô£ _Êæ¿+)ð³ ÈnõseŠNÁWnôÙDE¥èXRæ’Sq8ÇvT]8nÒk{O„ÍçÀ ÛŸ¤úAÙÏ`U!pKC,•v¼‘Ëç$¬[,?à^—%eªm¹)ˆ¨—º.ù¸5Ú† ˆ.øBN¢³‰L7’Ê‚qÍËÂ!Êo«Tä¹¥>òü«¥¾8*Þ¦â¦}£ÙÃ;ÅM6 _Èò;J Ù·&ã5LåÓmø˜dö'ª‰Øå&¥(åÕ¢ÈÙ†u…¹ '«­-£ i[­n–‚ùŠBùD&ÁêÍ?EŠº™èhŒO(EßhKµzªæïëlóÌÖËŠn5ŽG‹âØ[@¯9çúÆÅåt¼¸)GšÆèŒ@zøŠûoj –õ|#Œ¹«Þ»éŽà?µÃejµCï|!75Òg”o¾Ú±Hñ¹žM€°Me¯¸ r´? ™úö‹e/žæ:Ê3—¦í%bàºäÄ~ïlÊæ(ʇtLÄ$î”ÆÏ€Ê­)³«0·«Ð8ñ÷VÉŸM·Ë}µ`Ôq¦9à­ñäög8ç¿}³¹É’ÍZ\ü«©Ë×¶ò±^褊讕R&lnkíˆúÖÊ áüž2šøb!¢R‰"“Ó—BÆk,bˆ8˜²ò(s´!óùå%Ûå¼^J(ÂØ¾ÊÄj¨Ú:Ÿ•qFéÿæüÉe[K#ÁmÝÔº'¡4Àný÷%6ïäAyÂD¼XÝ|ˆ÷Òm·îÖ€¾R~FùV•TfóÒ¿­U"—§Åç ‰Ÿ¡ŒXerŒT’äχØÑa°aáêm},9Jöl¿gWôsŒel>ª½£—{uë'¤®¸‡kÛÊ[åZZ¬.«¸—ß­‡±½ý…ßò_üÜ!œá#þFõKTœZendstream endobj 2025 0 obj << /Type /Page /Contents 2026 0 R /Resources 2024 0 R /MediaBox [0 0 612 792] /Parent 2039 0 R /Annots [ 2028 0 R 2029 0 R 2030 0 R 2031 0 R 2032 0 R 2033 0 R 2034 0 R 2035 0 R 2036 0 R 2037 0 R 2038 0 R ] >> endobj 2028 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [123.8494 657.6519 130.8232 666.0648] /Subtype /Link /A << /S /GoTo /D (cite.gnu-prolog) >> >> endobj 2029 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [489.3713 655.1612 519.453 667.1164] /Subtype/Link/A<> >> endobj 2030 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [63.9171 643.7596 85.6966 654.6078] /Subtype/Link/A<> >> endobj 2031 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [342.4703 643.7596 439.3433 654.6078] /Subtype/Link/A<> >> endobj 2032 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [423.8048 621.7864 430.7787 630.1993] /Subtype /Link /A << /S /GoTo /D (cite.Warren83) >> >> endobj 2033 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [434.619 621.7864 441.5929 630.1993] /Subtype /Link /A << /S /GoTo /D (cite.Ait-Kaci91) >> >> endobj 2034 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [500.5792 512.2527 519.453 523.1009] /Subtype/Link/A<> >> endobj 2035 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [63.9171 499.7441 151.1458 511.6992] /Subtype/Link/A<> >> endobj 2036 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [155.2415 502.2347 162.2154 510.6476] /Subtype /Link /A << /S /GoTo /D (cite.iso-part1) >> >> endobj 2037 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [230.6322 350.8026 237.6061 359.2155] /Subtype /Link /A << /S /GoTo /D (cite.wamcc) >> >> endobj 2038 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [334.1343 295.0118 341.1081 303.4247] /Subtype /Link /A << /S /GoTo /D (cite.long-clp-fd) >> >> endobj 2027 0 obj << /D [2025 0 R /XYZ 64.9134 727.2935 null] >> endobj 10 0 obj << /D [2025 0 R /XYZ 64.9134 702.3869 null] >> endobj 2024 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F14 2010 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2048 0 obj << /Length 977 /Filter /FlateDecode >> stream xÚ­VËrÛ: Ýë+´”f"–¤¨W–}d¦]¤÷á»j»eÙÖŒ®DÇ7sþ (+‰Ód:Y "A8çÒû•÷î&÷ V¤2õW[?U¬±ò³˜³<çÂ_m¾B†?V_ü8ɘŒ³Ôç¸*ÃHp΃Ϸ«¿B™_C|üçƒY VŸ¿ÞÂïÓÊÆûâ|³L™*Òį:ï§÷í÷7÷¿xœeE柌ÍY\ä‰ßy*‰Y¢âØ­´ÞßÞŸó…‘»1Z^ù*’bQ’à‚q™ûi!™’*Æäÿƒô–.L¼È©ºjè ’ƒ)ªiëMÅqFóZÃúÖ+°J]O°«‚ï<á}+Í](ó Ž`¿Âȼlj³-ì5%Ø–“žW0)— 1S".(£SÙU]U=M<6f (¡ÛÐÓ•‚ÍÒ€ÌËšŒb-AФRŒ'™‰„Š¿¥~:¶ú9| 6ð²ÀÇ,¯!§{ý,:‰õÖpràðÝB ¬èz´¾z_ö“ÒØ™ˆÈ]ÀͨF$"#'BE¨¨ä9ã4&̪L$º~ç"{zYö¶=–MÊ"Ð6ÿih-ãõ„`’ç&`EB^Äÿ棹Z(Ãs’娔kƒQ;ƒ.’à4+ …-»Ø³‡ ËÏÅ¡‰8¼ðì1Ø#@Ǿ¶öà?´ÃξÖèxGÆ¡ïì«¶{Äùö¸ˆnZë`zd­Õh”ƒzjôÞZBP}p"ÂYÄU®[§<K H²l(#òØÕãrca¤TÜÖ«wûNÍÛTVÿ{hç~‡2‰Ð˜xÖܸÃU[Ž%j×(àb§9©Ó^É4)çž2‚PF†iÕ ¹”Ù"«³âì1`‹ô5ˆ;i°G 9¶éƪ)[»‡=7‹yB¾Y{v·Úún!YŒ_›ÉÒHÛùKónmIÔè˜*7üšÙa© ó”ÔàÔ-4lí.VßtRláœkºÆ úéÙ±ú{X”F™y´ƒ¶¤¢rõh¾:(èU-¸V&vF™Ê`<˜î¢k jÆHnoQï õtF‰tØÚQ=´5@¾Œ5Ï ç7Ýc,sŽN·O#^ìå'T‹àÊò5Ö •»dñBÅW¦µEšóã͘™025•ëh™3> endobj 2049 0 obj << /D [2047 0 R /XYZ 64.9134 727.2935 null] >> endobj 2046 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2052 0 obj << /Length 3287 /Filter /FlateDecode >> stream xÚÍËŽÛFò>_¡K`Òd?øØË"v6N‚…íÝLNމ#¡D™¤<c?~ëÕMRâxl$ ,’ÝÕÕÕõ®j½¸¹zþc¾*¢"Uéêæneã<2…Ye:Žò«=´ûöÔó{4‡p ôh ß?¼EMàšÝa/´ÑžËÞ@]¬)ÇÓݧÈÎmÜ/[d¡™C´wÞFȹ¥„ÔþÚÇ ÏŸ L¸ð¸gšÊA¨nYJ"Yvä³ïøH~n9 »$ÖÝÔËâ7Ô*Ú{¤Æ«Y‰*%GAK3ßçÞ2ĘXÙ ui¤K3ŽÁ<{oÎŽd¥#àK¡6Zb ù‡¥ßCË˾z&)ä˜/n`€²„$3Iñ½/÷ÂXÄqW®!Å¡˜è¤€ÃK ]VŒóPRZ±å©Iˆºð;M.FÎS6}+žXV€WÀ–¬Ç Bä`Ø»„ 9<¦V¨¨ ¶7; KY:ÓC*Zžð^*Cõ— v¨îù»:t´ &㾄ç*fÁº"NМ°©À()ªáhSzJWI>kάaÊZaNG&²ÏMŠóX¨O”å<ö‘²¼ˆTû“²\IY~CfGi¦uµ¾å⇸ÝÐéÔ\Ãó ¡â ?õÇA=ù¤ø”/¦L%×ø:RcÇÀÆÁ¯CÙ¡q>¯>Q›@ 57}r2e­Ü~¨÷#Mä-X`œ‚ÎÈyªã€éÀ¤¤´eÖqð lSö¾´dë•Üh’¾šä‘²œ ㉄O¶ó†´.ÉzŸÿ¨Õä(ªM•g¹”àC{ ›êcÕ\ZÛ(Ç&Rúd(tòNRö³tˆÞOý˜ËQ}Bå®¶:JòTϵtÖg1P+8U]]õ”$ÅœwiñxíÁ…iÊ.žšr>§¡  -×§>ë½ÛÒe\‰iåÓŸ½¤aRÙiá“bÜfÌM&öôXÚ8PuD%„DßHû€b¼ÆÄ@:Ô#!u À–Sïô„úi+ÅûKx§\Ï ®v-Écö%UÒÇRS™v*·±¾ƒª\ÄöÈê¡ÔC¸mËfA@iåÖ¸^Ý«7ßÿórç,RìlÆÆ|‰üIZö‹ø”Š,)ævä1—)•kÒÏ›å:I£"-`("›À/ºåÔçvyRjµ¿R°$ÏÝ÷Y³Üc §(_œ7óu‚ï !…”; &kÒŸÇKBQ¦ˆâ,?s‰aX†îáQ±¤Qœ›âËb´@ú$–Úûáz3ZÄ¢P,Í,’E©Š“¿@(‚1œ¢\JiÚqão ˜œ±vžv†!¦ÿc¡”ý¬IþáäËéq…>uµdeãÈš"Y)Ü{é¶é[E册—’Â+~ÛoT®¢Ô¤Å¹õ€»=^r+'iã=yb×/xt@«y€ŠBíJknÆ.Ðá1ŸÑñ²ÀzéþêIR¤Mç3ÆVâ?Áœ¸ã0 ?B.§#tÃñm;’ÔMëI° &…Ã@Vv½ó;):ºÊ_hi"h= ¡“¼#lø"‡3ÅÄØ'§`e¬(Å •¸P'í©Ím€ {Èu‘»¥ È£XçÎRÍY ^Çj5¿œÚsãKê4Ü‹r=§žç"Î;B%£k&­×†gjé/š;JQUPGc# Ì´ä¾XW~ijžÖÍ‘\˜§ó¨ÀdàÉþÊ%ŸŒfKö¥Á¹“H 4²¥$5‘Æ*â+¼ Õ¹zÄKxŒá%¹‰i‰Ê"›fÜYEÕ8ïp–Z;_{yߪ˜A5‚,OžIn&õ²  ø/ ïwXÑç·óg=ÏåÎ:s¢üc?MÚöÓŒœt}¼ëYL×2[¹ÊæwƒTvbÖýVjN|O 2.–%/à‡òP£ÞÑ{]~^ª=^¶Ç‡®ÞîC~½dÐEQ„*޳¯Gøžþû‚K9¿÷LGëö÷½Çs£™¦á—ÍE­åÞÞ\ Ž=Pt?ùOTcJÀìÝÊ#Æp.®ª—NëP}—6Q(ß¹U$±á]ç:Ò‡݃’á:\±«½'¡ŽA¨uk½ØyÕ8¨ÀW¶w®N”†T#“£N=0&&qL35I΋å^Ù]6ïáp©v½j˜'ùÁ“ï It|gÏò#—sjCTŒ>và™²Jþ8ð¡üÙRO‚ļ|g¦j^¢úæ8f®·¬K¾ŸUÉï.ŒÉ‚ï›fÔ¥CW­Ûí~\0.ï¶§½0–ÔÔòE}Åïë¶i¤qÎŽKÕm.µ›þäË %ç &?¤!l[Ü|?qWr¹Ùñ?Vºß±æÒ €8ÿ͸õendstream endobj 2051 0 obj << /Type /Page /Contents 2052 0 R /Resources 2050 0 R /MediaBox [0 0 612 792] /Parent 2039 0 R /Annots [ 2054 0 R 2055 0 R 2056 0 R 2057 0 R 2064 0 R 2065 0 R 2066 0 R 2067 0 R ] >> endobj 2054 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [169.0194 557.5072 175.9933 569.4624] /Subtype /Link /A << /S /GoTo /D (section.4) >> >> endobj 2055 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [204.1893 557.5072 216.1445 569.4624] /Subtype /Link /A << /S /GoTo /D (section.4) >> >> endobj 2056 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 449.9107 516.6856 461.8659] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.5) >> >> endobj 2057 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 437.9556 99.1185 449.9107] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.5) >> >> endobj 2064 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [203.645 160.9009 231.0977 172.856] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2065 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [258.4396 160.9009 275.3762 172.856] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2066 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [339.1905 54.4505 366.6432 66.4057] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2067 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [393.9851 54.4505 410.9217 66.4057] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2053 0 obj << /D [2051 0 R /XYZ 64.9134 727.2935 null] >> endobj 14 0 obj << /D [2051 0 R /XYZ 64.9134 702.3869 null] >> endobj 18 0 obj << /D [2051 0 R /XYZ 64.9134 679.769 null] >> endobj 22 0 obj << /D [2051 0 R /XYZ 64.9134 425.5634 null] >> endobj 26 0 obj << /D [2051 0 R /XYZ 64.9134 393.3924 null] >> endobj 2050 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F14 2010 0 R /F21 1557 0 R /F32 2060 0 R /F22 1606 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2070 0 obj << /Length 3275 /Filter /FlateDecode >> stream xÚ­kÛÆñûý })ÌŽkî‹EѼÜAâ& €ë´Ä;±¦HY¤îrA|ç±KRâú”ÖFŒÜr³3³ó}y{õòÛ|Uˆ"Uéêön•QHmV™NDž'ru»yIskeeéëX&Iýú˵Œ¾ûñÌk½úñW¼þùZåÑO?üôêúíí÷WßÜ^ÉUÿÉ ®J…)R»Zï®>\½y›¬6WÉêû«DdE¶z„q"t‘ÛÕîÊX-¬ÑÚÏ4W¿\ýs{ˆñä—£'-”0Êh¢ç±n@8ÑÑ»ëXeQ…6*ù‡k›FeÝ”ï€Â†VLt„q¤Gu £{$îå·JÍî)r¡m¸Òåáþ¸«Úᜠ*±"3JNè,Ø@¤2dQ(àƒRçÊŸqa„ÏANðSIŽï©OñP6Çê¥bzælÓ…HuZ8rþ•ؤ¯þõPw-³. þÝàGíË{Ç*i4l—¼§;X%•¹5ö¯Œ´"7êó±Ê¼À)#sQ,8ÕÔýðRe„IÒô"£ô ž]Å:Ï…É´]ÅRŠÂZEçûŠÔ³O\Ç)èÓíÄ­ ð0S"O­tׯñ1IˆånG·£·ôC·ïy8lÝÍûòÐ;ñ¦ïîîlÃéêv»²ÝÀ®¿ÚV Fª¨$­*lt ìJ·9ºjøêZº=ƒÇ'i¼îš¦¢K†jÃÜÊ‘w²8eÀ=Ez:´:0t@`ŒÒ_;S¹dšðAM@k4X…„_ö—ê·U‡²á'8È üþ@ׂÍx@Ò7€(:þK„ÿÎT ƒG‹—ï; ¸ô®›wøŒqöÞAŸè¨t½ˆÁ†Ç¶ðVعu[G«U¾`‘æTB öS`>ëXfKY¢QæDévH•ˆÔfjȺ­‡˜È]@K¥H´–É´€êï¬>Ç¡Bö[å‰'0à &8 IZf^õ^ýô÷–wk6ñh•dß÷ý< H î¯ÛVµëîèÙM/ ‹¨âÛÚ;‡ A¯;’¼][žë ´,¡\žI´“´=l=0nëŠ^Ž Âb«°äB F*Môó\°¢È¤·þ6¤îè&ª3ÁÅ‹aA……×9…XdIrÒH·ûëÁôœ›z­S¡ò"Ñ n³â“mý1žƒ\{ ŽÎ¨,Ÿn&c_=TÍË$`íS‘‚ûr”ˆ€RÅ _8W9éU–8ˆÏèUzI¯¬•“^£<<}L±P¶2P,“,¾º‘dßÊ•‰ùzA¹cFåø"öf4¿‡'ž²$/ÍDŽìÑÈŒH30,¶ÐÂØO /žÄ"ËD.­ñ·>+&Ibý3þ{´ºŽåX3Ö`lY¶-k{ZÅäAåñÌFlj­DC±ê9.o!‚âè†NóO6ò&˳Q?«ç„1Ém@G/é©÷¶~òäAqÌr%ÿ+W:õÛ°!à›-oEß ~ýé9LöÎùvŠ_8tˆ\¢0&<ñš·[é¨ä|¢ãD‚ç»ÃfþÖÊùE®-0ãä&äÇŽ)Ä…Ž?âî¬×ˆô–W«rú’ÑûºÝðˆB9XwáŒÐ‹‹F;pC¹Ý¨­0õt눦Môá8bðä¼ãVO(/Ÿsñ«‰þÎ] Ì?T<,•ÂæâÍŽn‰©¬`|é•“Ùc)\ìË]Å ïÉÃnx®zâ >nÃñÒúmxÊǦÍì7(ôéïÝï9[,e»&ˆH¦J1LŸQ"ëÀ÷p8Œ£'šz Çn z6!æðka6áå8YÎÜñ–Q\#.x|§ÌÌ%¾àÒ¸Ò§Äs³(/¦v%…ó'ÛÕŒ²CËã)ÍTâñpx‘¨) —ц×þ=¾ÃŠLÍÛ³:уjƒ,íª/¸úKnͤFÏ£%Ї}Ù÷#Ò¹bû’sdŸ½WHÚCÌÁMÁl Ñ‹¢Yñbd ñhÅ«gÀpa8p6å¦ÊÖ!Ôo»cãæq[çn[w|wIB„xñ<8¦]Ý–ÙMç¤"ÍLÙôT¿A /w£ª¾x“ ­Hb FæÅã¡*$~[5M‡TÜðJÛ¼ä°i"2ðÖÜ‘äÌvž1 ÙÄ«)Ø~?ºEL£Ý¢Aëx¿‹eù#`0—MÀk„GÚ}Œ?¶Ué `)¢‘ÍÓè[2²ÞCWõƒ;ШºúFÉu ªmþX¢èõ}ß”ýÖ#Aá,F1åÚÆ^GЉ|¬ÂJmBù¶ÖÛÆõ9eÄ`£ŒPÚ˜@æ9SÊ1Zñœ†À¨XW<¤ÚÇ“>ra$úb&%9°¯Ö>&í×å~òH‰‹ƒ?À™c5gŸÅ‚w syèÞšÆ øõ¾Þ¸Ó¯©ªÔàÃâê‡c7xápÐzô>Hàv&AáØ»+éž²ÃzÇñÖ{ Ï$g ?VÏSÄm £XÒD2│Yfvwô‘‰ÊÈAê6 Â¨‚#MÎ|Çб<6”Ï$Ç?¼Å1šz?]è/›Rœé"^¯þûé9Ç—ÄÚÜÆmkÇö(<{‘+hMˆ!.ï? úgQ1iÀXtî\Þ:jè¬DÇ)®÷í¦ñ‰,‡ óŠr X—*‘$Úw~€ˆ÷ ßgrÑ0+%2†ü“}Ÿ‡ÏA|¦ibìt3âˆ]õÁÖL–(OÉkfFçúlËql…YI=ƒ<_`tŠd¸îw¥¦ÍXŪ€’ÍY_ÔUÈã´ 3<ð“Ò3l€Mi.dÔ¯à-.ÓV¦ˆÖÓqê óseÂ#ã[2åîË÷mœ¸€„ÆMÝNëuÏ÷„ 3Ã`•rõA—QW/ò1Ú|¾ä%²±Š9UƒœÕE8AÎÅlN*A§õhÆ?Ö;”*™,ìJç-ŸÞ<!ÆsRK‘[ÈÆmÏöY Ü ©gL¸] ¸fòRgòŽÜBÐòÙ(!^ X)çs^_è—ÂÞ1?¸mòè'%Î⌆²nçžÊúꇥ@NÜÓ†ÒòÍ—eƒ’×CºÆÖØšEFîÚ5Ö— Hç'š#58¹óA–‚ë"08pVÙÝãæú—õñžeU Ÿ¬ÉY1ã\9ÃJ¦+S–'UÔr·÷½(ÍÁ™ú³,,û;£¡›z’£^ö¡Ôb£;Ý'•Ï¿p‚q¿w~<“õ¿£‚ÓYÚïÍ:g§j f–Å‚syRfå~¹ySÞ¼{{óf}³y{ó Ôâ î×"Î ¸þJØq]ù²uÅîÀÛRñ÷‘ùþ§ùÈŒ E¿­AZ^ÏX,…E(ûò‰7|]¶uå˜ðu]þ‚üU·:Ô÷Û·!“¾âº]QE¬’$ûóùBhý‡þ-æ¿Ï¼Ê™:þû«ËfáÌ ž©ËS ¦&øAdðÕ!¿ÊlÆ/¢Å¨, þ'mâjü9¾Éz`K¡¢ÚªKèpªâ¢`í×÷oÀ¸ çÇ™©EŒŠy*?¢ŒÕƒÔ`«"î‹ +P‰4d+³„Êeô  Ìàxúc¡|èöqS=Œå±†§)ȹ+u$+<¸Š{ËK^_7>y[—îèaFɲ˜ÆQÞ98ì×zß;Œ(´xm*ëvî^¯MA¬ ñµž‡ñ¢÷€v ¡|¤Œþ¸­Úå*|u»=ÎʶûáȦâÂ;¨üZ½våW4Ʈ̈́šïò؆Ÿ[ød6Ü÷sTóß ìöƒ WkáB}½ÅI!äÔ–?Óü´íW(éûÊ/‚}FI]Ðÿ£íMUJf%ÿ™½ÿsZf?¥™ý&â¹®çŸÆeÖ‡9ã0'ä€è¤ð±×ÝÜ\endstream endobj 2069 0 obj << /Type /Page /Contents 2070 0 R /Resources 2068 0 R /MediaBox [0 0 612 792] /Parent 2039 0 R /Annots [ 2072 0 R 2073 0 R 2074 0 R 2075 0 R 2076 0 R 2077 0 R ] >> endobj 2072 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [284.3632 688.9373 311.8159 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.2) >> >> endobj 2073 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [338.6245 688.9373 355.5611 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.2) >> >> endobj 2074 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 688.9373 516.6856 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.3) >> >> endobj 2075 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.7886 676.9822 104.7252 688.9373] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.3) >> >> endobj 2076 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [372.9825 419.2579 400.4352 431.213] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2077 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.7772 419.2579 444.7137 431.213] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2071 0 obj << /D [2069 0 R /XYZ 64.9134 727.2935 null] >> endobj 30 0 obj << /D [2069 0 R /XYZ 64.9134 146.3581 null] >> endobj 2068 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F14 2010 0 R /F33 2063 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2080 0 obj << /Length 2841 /Filter /FlateDecode >> stream xÚåZÝã¶ß¿ÂèKdÀfø)Q Ápi›‡´M7èîîAk{wµ%Ÿ$ßÞýã;3$õaÓÞ öšü ‰"‡3?Îü8ùÍåÅ·?ØIÎòT¦“Ë›IªY.”ždŠ3k¹˜\.ß'ŠÉé\pΓ˻Õt®”JþòÓ/îæuµ™Š¤ºÅG¬Ë©Ì“z‰¤†öbwín?O¥MV}7 Ý꼨W¡ÿ\j+U"Ìôãåo//Ä„ÃOôjÉ”é<5“ÅöâÓÅû|²¼à“/8Ëòlò÷œ©ÜšÉöBÅŒV*´l.þuñÏNàp‘¡†cèü§.` Á³(4Í£Vݸ+µíÁtBgAÖ7ƒf Íkê€Øl êÑ kúŸ§Æ$Å%¸±cñýpÖÅõfÔ[÷½¡ýί˧N$zœZ•0g镹¿ ËR«í³Q)eÎAÁá4+lW©ýM^n €t/oݰbƒ-E»ÞDæàËÜð5[±é\+î ÀæOûUýènדªÖµ-W½¯nñÆÍØ´ë3ì•'Kôßã5!­ÉRlVÚ2“ é­þ>†ŠÆø÷E¹Y6Oœ¯ÜŒ¼ûÆkR&se,<Í{Árc$‰x¸«p½C¥{Ø­iueR•ÓþþÆ]ûÕ—É …ò¦Bó x,oÝËEµÝzá"Y6ŽØ-rË4ç™·ëç·—¿üüÓ±ñJƒÓ˜€Në5'EÛjçž‚‡àÌdþ—Õb߮ɂYdj˜Y*n½ÌïŽ'…Q¹>˜“Ъ¶;ªõ³µ2¸á|ëÑWÈ©£ßT›=Q\壾ª#*jš§*,zTE#ư¨ˆŠâ`ã^F#¥#ZÍsXŔѨÆ´ö|ö×UM’]ˆ 0äA@ä«/Ŷs{ßÇy‡w«Eà1š„F„·…»|B(ñ cô°.P…F×Zº1ržl ðštÒ xæ*ŠHÓA@ż“)•üß=!£Ù/¦2KE{ «[˜2xцµðå|àŠè¢Rf…Ê^d,b.ÕØß=áYë‚3.Bø¼/f×¥ÀF)Œ:ÿ ù1ÆsÚ ­ÈÇ”ÖuÿÏtn¤I¾Ÿ»k±Û­Ê%úÃÕìÝ 'œ->¢Dç§|2— 6h®<>4è•»¼ÿúŒÍõqý¤˜½£! ¬É½Q¨P¿7­FÛ©ðiíÞìºl\{ ÚÚŸ°gôyjR,Z†qT)8îP¯‹kÚNuÔ(ýTl…7…»tkSàŽU\oüÀmQ–C¡Ra–ü0µC…úÛ7mQº¢ì,–u>ÜQZIÂ%VfUÖÓœUaOÝSåÌ ¡uÔ°Lâä pŠÌUÞ“ Ž)‹­¿#ˆPè¯ccÒC2ìŽÔqÕ  `r‘ü;bÔX‰¡EE  ëÛͪEÎ’¹¢$O‚ÎÎìUÝ,†œ$ss”rý%ßÕ™ˆ\38A«ãª?Uö]Ù_乜l/ƒV†çƒ¢'q>ùæð#ˆ¤jˆLìë&dÏ“ûs¾A92"Í õW´Á |„ è è7jAá.·]¹ª ‰õ½r¾…kt3¥5Ž;XçøGtX.)žZ7¬›}ã²÷´€ã÷j鎒cý8KÇnE~”At—}\zÜV{eù¡†DS¦Éß].„ã"Ñä‡ÁᾋѥÕ†d—÷=„®VáƒÙÏp„ $a:¯”‹1²Å]Âljˆ–‘Ó‰‹äù)"µçJ‰à…ýºØùð‡Ðï¿:Hë o:¢vÈ.x-0Û§dÃ=å»=×D”ä–6ÍÎU_Zây¯½n×=e- ü r<ƒ1LçB?ƒé‹ n‚Ö^7ddæN4ô¢+óÀf@ß4×EKŽ w=¬ÈpHdD*Ç~ÛqµP¤}K´,l4S™QçlPÐa`ƒòÄש°a/ÃNgݹTˆÈ¹T¢}!»s)ƯH»®&d8_“”„¸cˆ{yýî!1¯Èlþ„UýÒû¹7N.òj³îJí+¯ŠŸ5Àà 8Á °Ñ¿ýRlwAÅOž)p¯”úìÉóêÕ jôzöfvÈöƒiä]-ð{±x1ÝwçC‘Ä÷ã~*˜±wÝPóÙkÿõ~ýêÞÊËRè;Êœ_2çûgÕʇ¯møÑ·Ìæ]”¿~úKÅà“ønèÙ¡ò¶iªîÇÓY«ÙÅÓÍ·*bT[½6Å=X@2­íj1øñQ÷¸DsrÅ¡´2c–ŸWȱîcŽ¥%Ë` Ä›¾Ü¯¼ÀùPbÄ­à am®ú‰É­î{#G8¦qø)X&mwêyóLG(º¿5¤¦ðîáÎå/}¥mÝtNâŽAýmWÔíG&…5ϲ'Ö<¸Vì“tʸµêWZ8¬ˆÄÍ“ÎY‘(þ%Ck_‰8 ®›}¹h+¬ÇñËÙÍL ¸¡¨±€ÉÅìrvuܬBsäÖŒsÿ÷ Ëc¾:v`%™ÄÐG†Yþrç‰Vuü6ô¢åºŠû/¤ÖYÖ}">$8?@ð nhÊúä‹ •NK…q§ì¦° r¶pîôóuU™¨˜\ÈŒ’C¹xBÅí<ÂËÌfy>^ßﵡէ}á˺mñ¡ <^hõlÿÕHÆŒ€ —Ùœ2¦¿„MAˆ‘þ]Ä—#—ü[Jþ§Ý_˜z"è¶õÓìkYfuz6@êU±ïæ¥ý©®¶G ¦<Ë¿ž‚Aà ¦R¤TŒ,Új‹qóÍ}ø¶ïxã›ÙeÏó ö‰ÿ¢9M#÷.Å:I#’ã¤ò+ÒÈ@â ½úìêF#~åÚÿƒ§;aÌ›«˜Oý‘úÅO´èY9ïÍ禉T»£ƒuEçÅå~Ñï˜èEÿäç)endstream endobj 2079 0 obj << /Type /Page /Contents 2080 0 R /Resources 2078 0 R /MediaBox [0 0 612 792] /Parent 2039 0 R >> endobj 2081 0 obj << /D [2079 0 R /XYZ 64.9134 727.2935 null] >> endobj 2078 0 obj << /Font << /F8 1548 0 R /F14 2010 0 R /F22 1606 0 R /F10 2084 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2087 0 obj << /Length 2832 /Filter /FlateDecode >> stream xÚµYéoÜÆÿ®¿B ˜‹xÇsrÈAᤶá uÒD)"¸þ@íR‘½Lrí¸èßwÌðØ)5ÒB€–œãÍ›wüÞÁ¯¯.ž½,.KQæ:¿¼º½Ì­(•±—ÞHQR]^­ßf*_,vªÈÌb©¤”ÙÏ?-TöúÍ+7&{õæg~øáÇ….²ï¿ûþÕâÝÕ·/®.Ô¥„?5ÒÕ¹°eî.WÛ‹÷oßÉËõ…¼üöB _úËð,…) w¹½°Îg‰#›‹Ÿ.þ>\FŠË)ɯºO^jaµ5tŸ«ûøu2ë÷¸Çr¯*û€¼×˜±evìh¬ãu.Ϫ¶ÅÕÍ&l¾·fÿÖôÿŽG‘`[¯›UÕ€Þ?¥“¾×+üß#©ýŽç¼pOq³ÉÕ] îìPb±´¥Î®…Éö<±ÆS»Ã¦Bn?1žîÀ§Ëª ,9:û[ž©¦ Z¤âñ)j ¤ºTJ”ÎiRÏÓÔr!±€pÇóŒ®RmN‡$ž½Ôz"ûB «#½m91 å œhóË¼Âæ¥:· Ò=†*K †a„2…Žï'f1P\NI’]̘SÞ Yêb<™.]·Ûg†ï25#ã„3E¼I²ø™ŒnQ£›Í…ô±ÙÝñ 2°¾AUã놴GðeBbp/a ç¼}Ü÷õM§o5ÄÓÝq{S·ª¶ÃáÛjÓñ8ip©‹\(¯í\“»j[Ç‘лó;‚ºlᢺÈ`IÙ«À¾´`©ÊŠŒÕjM–Nöj¥ËÊ<ØkîŠì9¡0ù ­÷ò‚±Û=Ìž‹@K/àÑ6žüùÏ|óüo/ž Coà&xN‚y/¼ÊuÔÐ}ÝÖ)â¥ËÃ*¤vNIb8­ÂTr[íXÂÖ€Q£Ù ³ÙTýnª]Iëñ÷ÄMÑqÖ¥²¿UÛçR¹4äÞ G–¢ÐŽOú÷bé´Ëþ²äß_¾šÉ“ë' ›4{ýÕè ŠO' “r¸³¯QÒá_xËWaçù]”2p™ŽFØ3Ʋ_¤{ò$êf §„÷ùıð€4ò`vV¥‚tî„w&ºxâ>Nh3ØØÈljÀ¥tf‹×3YÈøÿ(¹Çqhñ¦ü¡ÑЦ{èîZ"7¥Å'Qjõ€^?nl2š™I˜YâV§éÚgÊz‰aNæ9yõŠû5f¤!"sŽì@ ʶ]Ï/5ùcý4!H° tCø?·Vásç§‚G‚è׿Áq‡MC8 ¯Mÿ‰Ü˜¦D;p·OŸ‹ÒšÏöŸ²”1rÝÄŒÚÙQÃYïuÆ(ì Ñ.‰³ä‡ç&•r=•CÒbeþ°ï-­-„Qºˆ,!d4R* ¡E¦gaêW2‘CÏ€Ïì™lÛ숄Î>"[÷Q5aÍh?þ ÎyäÁ:v ÂÒý!jžÈŠ*¬nž„æ—´JíO‹ÂfOC@œÇ„±—ƒÑ‚öu÷…MÇxfÝ.ûfFlU=/ nèpþPâ‹2%y)ŸP±LîY1žòŠ÷Ç(Ï6N z· ÅÜÏ㞊EI8¥‰ ë»ænžUÅe‘µV.ÈÇ!w?m¥³Ëi”Ô^ëThoë¾­V=(%w Òá´ÍQXáJN«Ák,þx›#R\NI&ÚXCTVÅ,n’þV]W·ý¿îå8O^ã!Í„~Žim}¨«žW('òR©¹b‚Xª¿Ì©¦ÓÔ¥Küóÿ¤·œ²}ýÀ*‘Pa3ÜþOº­…ÕÅcÙ>îJѾ>]¥R>L‘¬¼hËé$=ª»ÏN†Ïý ›àüW~…“¶±ÿˆsËXv þö4Ó~ `“Ô{QºÔ+,°NÏB7B ¤€`ådö CwÜL 8"ÂìåT?´Ô#X3‡vG˜·=¿3Ì€'Xë&mZ7®b·­£öôˆ‡ð<¶HƒÇ3÷›ž§·Ä)èöÇ6¦¤„’M`DeßÐå±´'ο4^²^élÅÀ …ˆN Jô²iº¸Y´ëòln½h¯“¶O±I–Ùº¾Á+ÜÝ ÇKn6A‹úGFI`*š Áë”7˜e¹lÍf\EÄHp°`QŠU°\…L^ÖAäP«Ãí8»ˆÑÚøì%†+ŠÌ@a»o+Í.ô¨8òÑXu36dzâ@kq3ÄËeJ$õnE y>æUHíc0œ:Ô7ÿà•±ñóãÍÛX‡¬$ÚÚ{1!í`5ðhG.5E©ÅùRübbÕ ~©ø‡t€ˆÒQƒß‰c| 'k6ý²¡F¾=óðTî r,·€.ž¥ê%´ôùƒw…wͪ²Æ! [Ê m÷¢„Ky*~ž!ÝÜ·!mÕàË¡J³tùILFåCZɵ[4æ4ئ½ ,WJ.ûÊØéP3ñ±™‰O€‰Z¦ÐÂa%p„¸žìËCUdS>å!ææÁmèø˜èz7¶—ÛmH¤Ad.÷±šð'ÁÄ»¸×Æ/m Î%å·ÁT7Ÿbõç…rV͉NŒí_4èÑô Ç:^tKÂÝžïÆÊ³ÙÑm¬5ܾ1XW=?­ªhΧ[Wa]wŸñèqR•WV“L^ͨƒ[,÷·Ë©öaò×_?¥€›å;&4»iÐ5*‹ õißÏA~ M¿«c–ütGI5ô!ëÝú´оÎÊ’¾òyõÇ[ñÁå„ây   Hý=l«‚³Ÿ²WjHó½ýß± þ{¥ƒËù{·µˆÄw)œ—QÏ£íÒ70ú¡‚TáXª™a„ÄZe†Ê£‰351* âq/_÷"ópIõÇçý§íäX¢{)ÊREÛy›`eÖ™ûo8y÷@wÏN»{Põ`Í»“#×ÇCë`S­å?ÞP2pendstream endobj 2086 0 obj << /Type /Page /Contents 2087 0 R /Resources 2085 0 R /MediaBox [0 0 612 792] /Parent 2039 0 R /Annots [ 2089 0 R 2090 0 R 2091 0 R 2092 0 R 2093 0 R 2094 0 R 2095 0 R 2096 0 R 2097 0 R 2098 0 R 2099 0 R 2100 0 R ] >> endobj 2089 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [304.697 688.9373 319.4196 700.8925] /Subtype /Link /A << /S /GoTo /D (subsection.7.5) >> >> endobj 2090 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [347.1223 688.9373 359.0775 700.8925] /Subtype /Link /A << /S /GoTo /D (subsection.7.5) >> >> endobj 2091 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [184.2515 665.027 211.7042 676.9822] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2092 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [240.6434 665.027 252.5986 676.9822] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2093 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [299.7767 449.3912 327.2294 461.3464] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.24.2) >> >> endobj 2094 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [354.578 449.3912 371.5145 461.3464] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.24.2) >> >> endobj 2095 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 195.0049 115.7783 206.9601] /Subtype /Link /A << /S /GoTo /D (subsection.3.1) >> >> endobj 2096 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [143.1203 195.0049 155.0755 206.9601] /Subtype /Link /A << /S /GoTo /D (subsection.3.1) >> >> endobj 2097 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [374.586 195.0049 397.0574 206.9601] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.1) >> >> endobj 2098 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [424.3993 195.0049 436.3545 206.9601] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.1) >> >> endobj 2099 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [369.826 171.0946 397.2787 183.0498] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.1) >> >> endobj 2100 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [426.4514 171.0946 443.3879 183.0498] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.1) >> >> endobj 2088 0 obj << /D [2086 0 R /XYZ 64.9134 727.2935 null] >> endobj 34 0 obj << /D [2086 0 R /XYZ 64.9134 284.5718 null] >> endobj 2085 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2103 0 obj << /Length 3353 /Filter /FlateDecode >> stream xÚí[éoãÆÿî¿Âe`5™“GŠ"ȵEt±M¼H€$h‰¶‰¥%-%y×hû¿÷3ÃC¤¤Ü¶ AÌápŽß¼û½Ñ~u}ñÙËì2y¢“ËëÛËÄŠ\{™)²LªËëõ/ #ôÕRI)×÷åÕÒ³øË«7ÜxÝlë+µØÞá«]T›+/0J-è/VØ:TÐ|¼ÒÙ¢l‡e0¬ÙÁ‡¦ ã—ÚfÚ,TzõÛõ÷ß^_¨K ÿ©–N„Íw¹z¸xwñËoòr}!/¿¿"ÍÓË÷ЖÂä™»|¸°Îg =õÅ‹ .ÊËî’_!9´îÐ#ËE¦ In…T™!züãjé´[|±äç/Ç}Ùü&3¬½TJäÎiù÷ÕöaWÕտއâHnÝn}ãæ O­Õv] !þÙ_ˆYP>–›_¥“þ¨Ñ­Âˆ}üó3Ž ÿ¾¤IV‰Ìêt|êÏqñ¾P¤ )©úˆpÂ=pYçÅâpï|„/{ü‚çÅ/»&ŒÝsÿž÷éQ;O…JŒƒ£á_êå7§ht.lªÃ Ã–×§¥7°Çº‡Ä€¨¡Œx¶‘-Aä¤ZeƵœb–ëüjø<…#P³)‹5·¼@'[ÞúAï›êp(7~¥2?äaù­ ˆ¤±Sµ,Mø™þ™~ñ/Pm\ü锊Ja2—y2~|nŽ`È“0’ ÷<øý dìàøíiO²;ÇCµÅ“ÜU¹ËåúÔí«Õ´åÿäû#ä!ä ÿ}Bþðíõ›^1V¤RçrÒª‡íßt ¤üP¡‰Ê@Âiãâ„vÐ×ÓÕ'†9´ñ¯«ýǨ¶ŸsjÂ|yÊß㾜p Ë$©ÍÁƒj4 6§Y?EæmFèA…Êåi¼ÚnöÇúð™:]vª™ŽPìiÑÉëÒÚd‘ ˆ{jS»Øw%v§ e>Ž©öÜÉá Û·†¬y/–. ~}â´­1˜ÁÞ_¥²ÐQû¥«ÂîfàNœqܰ\â;‰6(Bê/Š´^f ä,³}bƒÁã¡§WƒÂgtì(ðm…˜ñ³ðb‘ÊÒL¢~Ñ’I€íbïŸøHÁ<ètqOÛ¬¹‡"0v Ê*jÎ €ç]¹)›âPöÖ9”ðÖÛ6EóÄý?])¥_þ5œ _o½?Ü Æ‰Oø-W¼?„?WËĤ‹ïnÇ"œƒ—-›è>ÁŠH›¨ÅmoõžÜùP÷,'Ð_y–As‹ìÃruòäƒUŠ'l"Á†úÆfK8(¤Ã•IÆàYo‹u}lÀQ2 Íwø~ËSY6`ì=C—Ìj´)ÄmfG¹Þ#sÎ?¢ìd= ãt”q“0jFf’œðâñ†!>ßòÛíû°%žÂûq‡=Õf•e¢qc-ÅÇtÙ8!I¦tw ]ÖpL“¦Q”ʤl–ñ«‚±ÕOW™]øñl”al©%­DŠ¿mY¢–`T„“ní•…× ˜’5Ëu¨H‚¯3¦>GølDÁ_Ü—Sðƒ“›uµÂEˆ.Žôé—µ.çõ)é ù0‰õßÇâê–Ÿèâp{P«íÑ÷Ç%¼Žnª¨DøÙ«êè\@2dŸL7ÚLBè·m¼lE{ìAÌ» ÔÀ ¡¼T"€EbçÉ¢¨k`+Ī.Ž,M(ÕN móÝØAd"òܦÓQÅ;œ´ hÄaìQì#÷½p"¨Ÿ®2JCpÌÞz!½-c”2±Ùs\GpŦ+€½ã–kæÕöPö·§ŠöjŒ°9sšö¤–(Ëšc•µ}˳*P…U ʇž·TÙ³øLîMü€ ÎJ{–:u©¡ÈyãcSôÊ èV(Î%`d`ÐP·Ñ†h°ÌÍö¢MÇQd á ƒKD¾ñæކÃüõ}Eb¨z>O|\ùÁLœÄG³MpˆÙ¯á•yy¨Ø²}ÎÄEHÜ0HþÐ]ÄUkª0h°+žr·Ç ­–YX‹¹£ô )}æLžŽÃîv¿[JjÒÛ÷¸Y$ |àЛ¼[n˜Á^u×u§ëÏG¼ˆ¶"—IG…>í8Ã@^>vÊ"ÜÚ5ÛU¹>6£ÆT›IR×—¾¿ÒBå2X&\på>O/C&¿.o!±_„»ÊÁt–ÿЗd_ÀEd³|ñçCb¸ƒ·E4¦¯eØØÃe „†í«p‹t´žkþ€{ܶM?—d°^S.Ùó£Z³¸¾£X ËbÏážÄNRÝò³ðàG¥/D'ÎX› £Ì´R/Èže!‘§'îlÛûN’A¬è›@h êHm\$ˆ2¶ÛxhDŠl" g æå)Xp!”yÁ›“¾`ƒ¼0HÎ9Ú\YÝò´5½§>–vº%+ôÈÒ¡ êcŽÒ‚UŽšõ»hrŽ!§;,­4Âf°EÏÞ½µÿ:“=Å]Qµ¶ ÷`ÓÓÊ»Q3nL‰)Ç=yH˜ƒdhŸa!~e!¤Åp­Îz´Î‰"w†;19Øá]r*…ƒ¹_ùšÓêŽÎgF¼:u¯¼ÎÓKkkœm{ƒíî®ô a6à͘ë`„ökò‚”=ãÀuyƒ|¿»‹—ÅK·x³/O'GC§>ÄOºU }FƺMS¬ÊÏ䘑 {2bÜ¡£Ð2j"»["c&‹(VP–®^ørUôŽ:÷):úY_kêÝ•8×úóXv:áIã 3 a£¢§2¨M&™SñGàT „yßm®°¢URXrÜÁ¶KïÑ!Œ-øñîX‚À²O#…±ÖÑÊo6ðÍJ0{” a;¥â™ZPNVG5#E¬y0•U¤/ÖÈ4Ô8_¯nü$^Ê ·G ŠÌÎÏå™z϶[Û$cKςǾÃóã9©óÆî| lïb¶/½AÃÐÝàm4ºOcu ªëŒÇD–Ƽ ï>¾¹ûH„r*mE“9tãllu–pP޽7’–ürÜ·)£%ZboÁc¶ ‡ ÔÅ«Dºp`£s'q8ƒ'Þù)~Ê‹É1Wœ:'ÄwŽŽ·;Z©³ý˜ÌãvMÐ85#/PŽ“tAdáß: 8ááŒK“ÉàæÊ³.Ê,+@ •5s®‡Åo³ç~F…¶™¥ºî‹3YÇx¯SMÚûY! éEÔ˜I„X¥¦C¹j4fNHU”ƒ×Þêb[mH&w|ìá’zÿÒñ¾¬wgËò˸EOt¯'+ñœ2‰BË«O'רnÊè-û¦ µO0ªYøBÙCA&f3¤±»a¥Á•¦VÞ Óý/_«<×x9l*=ýËᎾN®Åó$¬å›aÆÔ=³’äfy¼gܰê,w°¬"óŽ<þÊ—HºÇVZ ™çÐè,üïaKž ÇÊf¦–jsCŒ ä™vsb K>ƒ1M…q=÷0~Ãjµjª¨îÄ .)Äcó!FYs.ðsçO “þW%=7Ž«ÇP‘+1ˆTéRèLqü¤lw–šK´‡è†’'6í£»ñ—‡Iñžf”î³0ƒpOÀìÿ¢ubMé=_û‹‰^ŒD ÕìâG*µÓíñتJªU»‹Ø÷ÆÈp†l¸XÖ*ÞNêÙ|8£žÅô¬ ôôç^/XJ›ÖG5! ¨;ã ƒLì3©²þ½þË@zË–7MY¼ýû¯Ùhÿ‰ø/—`¹ò™À0‘(îÓ¬&Õ«³Ô\ê5D— Jñ6…Ù=t[v,¾Çp¥0ªfóájvoP³.Þ¦ŒÅø‡X/»Á`ÿGm“r;Ûa>¹µïºü™¸Ë¦"µ ‡I¹í,5—ÜÑõÝ‚cûÕC‡5òIIa”Ô³ƒ¤vîÅICeø»PnŠ·#¦]æ"ËãŽ&of(ßO)Èl4üDâ&£ hvÏÄM Š&×ìñ§«Y¥æR!º¾‚@`À–õÐù’ó¤ŽÌ2êÈYAGº çÔ‘yÅ5¥#³Ñðq"*çKŽÿ3# Ñ(4µÒdì®ïŸùÅÿ™«ËÀ°/¦‹Æ-šÙjƃöÕ,‰L,ëÝtÅx6€mÁøÀ b]€£W9½Ôd|xàß>wî4 Îfð6‹~‰\ÜÔeïgàuÆ~ºò<×ÉçSŒ¾z݉endstream endobj 2102 0 obj << /Type /Page /Contents 2103 0 R /Resources 2101 0 R /MediaBox [0 0 612 792] /Parent 2123 0 R /Annots [ 2105 0 R 2106 0 R 2107 0 R 2108 0 R 2109 0 R 2110 0 R 2111 0 R 2112 0 R 2113 0 R 2114 0 R 2115 0 R 2116 0 R 2117 0 R 2118 0 R 2119 0 R 2120 0 R 2121 0 R 2122 0 R ] >> endobj 2105 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [183.8924 419.4479 211.3451 431.4031] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.1) >> >> endobj 2106 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [241.2257 419.4479 258.1623 431.4031] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.1) >> >> endobj 2107 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [142.7663 407.4928 157.4889 419.4479] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj 2108 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [186.2696 407.4928 198.2248 419.4479] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj 2109 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [324.9122 383.5824 352.3649 395.5376] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.2) >> >> endobj 2110 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [380.4959 383.5824 397.4324 395.5376] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.2) >> >> endobj 2111 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [153.1932 236.1354 175.6646 248.0905] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 2112 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [203.0065 236.1354 214.9617 248.0905] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 2113 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [419.3401 92.5779 446.7927 106.5256] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2114 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [474.1347 92.5779 491.0712 106.5256] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2115 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [429.8839 80.2243 457.3366 94.172] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2116 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [484.6785 80.2243 501.6151 94.172] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2117 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [417.1538 67.8706 444.6065 81.8183] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2118 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [471.9484 67.8706 488.8849 81.8183] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2119 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [363.3278 43.1633 385.7991 57.111] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 2120 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [413.1411 43.1633 425.0963 57.111] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 2121 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [363.3278 30.8096 385.7991 44.7573] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 2122 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [413.1411 30.8096 425.0963 44.7573] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 2104 0 obj << /D [2102 0 R /XYZ 64.9134 727.2935 null] >> endobj 38 0 obj << /D [2102 0 R /XYZ 64.9134 223.1909 null] >> endobj 2101 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F33 2063 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2126 0 obj << /Length 4642 /Filter /FlateDecode >> stream xÚÕ]moä¶þî_á¶_Ö@­ã›Dª(Zä’Krm‘¦©¯EÑôƒnW¶…ÓJÎJŽãþúÎðM”VÒÞ5 àÅg-E gȇÃ!9¾¾¹xõ¥ºÌ“¨êüÿêñáê¾Ü}é¾øß>àÇAÓh®X¾éMžªy€ôÇÞ­u…™â´ôw–1óçÇ«4Û‡ªìÏ&±½E/¡úyBÏð)ÉÓÔnÛî±È}Ñ >C{¥4ßÜà3rXA*OóÍm±­j]Ë–:&š— 8`®ü +©x_—6Ç­Éa¥=nªÀŽ‹S­"ð/¨ÍöP4+ºŒÖ–ñ$éißb}¶u{g^ÝVŒ÷ºtE—yW5]m[î’9ö¤Jˆð}{P/ºÖµ |Ì\­3óvÿ€•Tmu'@9êgÃÊVóÏ_ÏP¿ÿáQÕ_WIx8$ÑÍΓ-z“†2û×…~ßÜ™ÏnØú¦ùL¹|‡½†WQ›tìNer7W=œÊ$K]—º+û©>ú ÔW Írq¬´Î1 ‰æ9…H効ßuä^‡:b£ö` aä³i¼ß‡Wt¦ËÓJt­÷ÛA3à“¥6á,vËdÔ|Y¶ÑäÆþBu¢»˜Ufº—A É–¥b‚D-ºe´ê„çm¡ûiiF‚'×O­îЉaö¾Erok—íGDSY›Ì‡¶´Â¼øá±<<_)±q OÇj™qÐøÄ(ú×Uctxs×Ítž¨TºÚûh¦TXDn‘•{,Ð)í^k#`”פ%”L8VÔ)-Š©¡CÅÊë+£§úÒ2èRÁ$~Ð5Òsl8èK|Ɔsi4e»/Í7GZTjZÓ ‡"æ{6 †%è|µ¡fõ´¤ #©ã À~åjGFuSãhÃtl“ þk]i˜îȬj^ ygÞc÷n9Ô~gDq_–^tŽVeŸÚÞ£î`¾Iˆ ¦$7AV‰~xÂñ¢=|0¿´þjq|„ïµÍüt_…rúñ¡Žaúëj_ž l'ÍQQS¢áÅ¢üIWÔáCg»¤bóµ•Çv/1tÀû!M‚ºÍzS€° ÙVÒ}6@¶ýöwK–[š±$MùÇ(JAY"iNçU%0´HË|G€–}t_,iJ’4—Êkݰϩ,¡DÉË48ûgèFQÁº‹ŒÞÚÏcГ\ç‚-)) È#?«éç½m0×ÿ§Œçi’ÃGù¶×Ùf0šq¦+,`û‹R#i{¨PÅ÷tâ ¿BÊ„ñ˜ü"䀰#í·1` $áí ïëëעFÃü”I*BЧ) ™c¿'‚,¢;‡ÝSçÑrx×Zc¦=¶ôléǪ}ìL¦-ª÷{=)(´²…½Ø¢‰÷‹t†_Â`©‰|ÉRöff:™Gð—ËèECð”ÇY,þj½ñ¸óè27Þ€»5ð6Înú©÷àÅêŒÓÔFëD-‰ZÈ@EªN –ŠDrfÄ7ÝvMñ£Áv•I*D¢òœ¹ÄÎeæ+#Œ3’äŒËN+ú9ž áS9æŠñIúÙüzÒ±ðhR‰Z¹J$4ù €cåK%=À—õrH0À×™rùQ_Ôߥpè>bÝ¡ Ÿ¤ÀíTrÚñD:hÃLPpuÂâ9IK=f>[Fv@/²Wy¤"Ç}™lÄä׸ä³Ûx,zØN9œ…mÈàjƒ•ï;\Áh¿¬aŒ:·è2‹êhŸ‰E"¤À½€ VO&é0Ö¿Y†u@0¬W™¤)+Ù—ošÝ"¬ã±èa=åpÖ!ƒk¸.Íjqáà¥^«k–!MºsQÌ ”Ó6‡È`ºEå0š½ á€`4¯2Iy–(m6âòu±ýÐ=ÛeýQä)Ÿó@ÙÜ•uéÖCU;láýˆˆµv³ø¸©a<ÑÎÅ08s)O™ ëòlÐÃ_,ƒ8  Ä«<¢áœ¥„˜ü€c Àñ˜ôžò8à€Å%üê57Ü—>†½H¦6}¸<‡‹sÉf“e ÍÑä<³‚K0àø)³B$£d€ó»e8£Áy•IŠ ·@è˜ËU“9ŸÑS6çrBúV{ì?Í`¶;ñÞ!ÉìºÞ ïásÜ+>nÑ:^]‹Žèe’œ²T˜JXš –ÊŸ—{E@0Z¯Xe’ –žÒc.× îxlúN1år¾S„L.vŠ‘Ò\ÔöÞh±þÎ.o©ÛïŸ0VYçÒ+Mš²|(´¼õÌÁ%ÿ,wŠ€ÞÏbQÒ$#Ým"á–ç3ÒÎ7¶n{OÞÄB/ô™ú¹ky±jì\Ìžë:?ežt"·}˜eó$$øò0w$î<æBqq»ãa°âƒ.Z•‹žãJBÛæ'FžS —{#Ÿ/ƒ. øA7wt#q·ÅCÕk×¶ê¿?hŒ1ë(=¸¼-Ã,V% Ìd 6Ozb8åR%J0o½Ý,£, ÷Q6•ve´åOÃ̽¹s6YÑõ΢3ƒ­Ü´+ó|tx\\¬ú:›Á4c`«Ðƒ)ϲD “»CÜ?–Œ5«YgÒ/]¸|Ûtå¡_šÔDäÒMjŽ˜œsÈc÷ä\X šyªÊWí÷„r7;±Ê´j:áþÕ¡|¨qYçÙ·Ú]y·85‰'ò¹èRô1êÔ¬\ Sá·ËÐFƒö*“~wlÄåMñ~×ñXô¸žr8ëA{þ­Ðº4~éÞì o4¦ÑÛßèmsPÈB}Wu€îÁ?žëãnúÁ8æ·]çz9Ü¥Õ½vk¨Kí|l=Ûõ‰¹¥^­ÂÎ¥Wàñ#lØYÀáa•§—\@÷Pt°c×;F@3ZÇXåÓ¯dM]ëñ¸ô}cÊä|ßx¬<*qtÒ í\_1k®e7^±-÷Øcëð4€=Õúè]]¬¹ÚÇû\L–‚½HÔ „³<L&Íüf­‡x@ôÒS‘çqм/ð´¢h´­€ðl†ógGÛ bÓ•F§oWA«ºÎF­Rvf·ŸØ¸ïͱ»»Êž5¯?*j`§ß þ¿w·VMƒX-p6&l8~jñˆDk+Ƚ@O…Gð ìö±_„î`ÞF@/ÊE¯…À®†Œ«@ŽÕçd¦T"1¬È*YÂd÷Pþ×"”C‚/ÊGâÎBy$îCÑõ‹+Ѥ=‹‘É £ìÄàÍIeÃJÁ·Ëx Æš199&•BM¸üõÒ\("ƒn.tÄß< Cö¥ ‚êÑÍíÍ)!öÃýp¸]¯<{ç–eüFî\ô<ÉN Ü,ÃÐ(¹‡ï7Ëð èEƒï”ÇøLþf½ñøóè²7Þ€»ð6¥Û?½¯:€«ÇêªÏwMLðå*)1þ0Ž-:à²M om øù¨ùJ¥.¤ö =×âšã5Ûž±çÙ¸ü„Њr_:Ù»ÞÖcZ/F/'Ƽ­ùkÃ’E®¹ùL@öÔ\l÷;ÖËí³}w_îÍÅæ®… jÌ_Jàtì{aš ²T6«‚®™³t­Nê*HH;¼ôµýÞü™[¤‡¯†®yÖé!›]îÔäfßU&n>¢[bÔr³H¿ÄHù:>¼"f¶ÔõE£ @‚æþN[M áÙ¹¢AÜD»ñ ˆÛaPd- Ì7Ãá†û9ˆ(éâá?ª¾œ…XÎ…ëã]5ø•?›BÌå6TûL1) ŒˆO)å¶Õ•Ñú³D¥U‚âÍ r¢–U"Oréïð;X“¢³„Ⓓɔ˜Áî³fÌþ˜´HÁ`ÍN‘†î)™ëžOUíïWØzWz?OÑ @„Ö•›„ŒâG~M#Q»™4wOI–ä`œ¨ù‘øG7T_óp>…ŠÈ||ÝÃçÆé_#Îx¥ŽËIñÒ^ø@¬6„šF™Èð£•õñšÂm%à«Û²è­ZbBÎ_A9KÒŒ~ÌM$Ëdp’Ô=Å> ÐA˜ËŒ¾ùÆ^{£¯Ãh¦›·Í®,wsã)®•sIù§1¶/ì8YX§uÛ 0*j–MfY>¾‰€eú ýâCcn*RF+4æ­;þÙ™Lî|~ônòöeÕ›¿¨¸ðïÖ´xiSïíÃÌžN7Œ(Ǩ+«ŽÁ@ÝTº†¡_<[‚8tU«ë]©ã*1|coÒ…km¹Ój¸±ZƒL*ªo÷øY.qóa¯Ó]gõÛ²ˆoŽþ¸5'×=XðàôÐhoâ)ÝÅJ‚“ñÅJ˜ÙJ O.e÷¬ ¥½Sèôlr—IY‰FV(Ë™®ù7ŸæÆ2ô‰ Ú„ñÃJq°ãXSÚŠt°* ­{îŒÉ`?F›æé¾4}ðfK··Ÿ»á >ï¢)í%4¸(lÕ >·c²0f5ÐÀz~Ô7ƒô×®‚,§Ó{ ë-¡èœ‰Òš«—t13¨±…2cWÀ¿Êód~.;· Z^Yfñ8S>\dù‹GèæŸ÷Ú¬`ÙP_LÎì2K©ÓÝQ¡,\yÆ^'ã%{Zgr%Fšd9Ýv†!–MÅ™ªšŽ÷,!èEqZÓ©ASÛ¾³ö³-lktþ^”ÿn¾endstream endobj 2125 0 obj << /Type /Page /Contents 2126 0 R /Resources 2124 0 R /MediaBox [0 0 612 792] /Parent 2123 0 R /Annots [ 2128 0 R 2129 0 R ] >> endobj 2128 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [362.8572 201.3078 385.3285 215.2555] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.4) >> >> endobj 2129 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [412.6705 201.3078 424.6257 215.2555] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.4) >> >> endobj 2127 0 obj << /D [2125 0 R /XYZ 64.9134 727.2935 null] >> endobj 42 0 obj << /D [2125 0 R /XYZ 64.9134 702.3869 null] >> endobj 2124 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2132 0 obj << /Length 4201 /Filter /FlateDecode >> stream xÚÕksëFõ{~E>:3µØ§¤…a˜nKi 7 3”~Pl%Qk[©,ßÜ[à¿s»«•-;) Lfâ•´³ç½çœýäöêgŸ–×.s¹Ê¯oï¯s“9©Íu¡EV–B^ß®¿^èLß,¥bññúF.¾=À¿=¼YôÍš7K­õ¢¬±aûæßjïùÓWtk7­ïÉc«Õ*ßÁƒ*D!ÒÝ|sû»«7·WòZÀŸ€Qyf\n¯W۫ﯾþF\¯¯Äõï®DV¸âúÚ"Ó®´×Û+cufÖáÍæêíÕã„Ë0ã2òD‚4  —•¶0×¹S™QFþ&dŽæ[‚ºö~ãý#lØ·W‡®ã'¹Øá–{ÆÂ3¶ÛnÍOÕž{Wüø#:ËxxŸñÚ#8—¾¹”ÐPöÕp®Úͦ^üê›Í¨=?FÚn”fŸŒ¤V=½CZ.ê` ž­ÏC·Æï‘7‡›yW[ gßÔ b$‚߀^Ю‘»®>¢F‡ëSØýØM»{¨ÓÍû·ín ZÕõcÜEÜn«~…«*v'ëîçDFãWß¶]¶Qy0ÛÝ€˜“}o«€:¶öD«i«Íß|äTOsüX?ñ«¿ +ªDÔ™ÕhÕ5ƒ­T·ÒE– g<ä·ÕÝéÞ`÷BJç»<7§ëÈDö )úáï2õ~ßÜ5Ä¿}ÃT8%áü:È̪Â<+ZçÍ{$hÂU?ŸtŠÈ™BªP<ò7K«ìâWKþ­º‡ÃĦ$hÖÒ†]!Úƒ¦¨æ •nÝùmE­²ç÷û à\‘É\Û×£¶o9i·O›°H PÔ_ŒÈ‰Å—J¹ÌæRndæ¬=‹›m½ëµ¿´efŒ’×hcœ-OÕ?©xÖÿÒ9ú_gR—*<iÿ8ã2ò“c¨„Δ²Ä^:{ÔYY˜Àº›fW¯›þÇšZ«øtc3çÀñØiNTF©( º&Ue`Њd¢)´ú2$› ëaÂËH×e ˜L©M@îH+)ÆÎ¶é÷çuO`B si³<ÏU`; ˜Úe2Ö h©Á%AÚ{R°y¨Àš"S •IY¨/Y,¬ˆ‘’EÌ4wž5ÈH¹¥oÚÝþ¬¸i“YiÇÒvV¼´Ê”æÚÚ"³¥µ?]¼ÂŒËtJ¢ôuÚ‚WUæÃÊ,‡]ºí‹y‘E¡%9“î[TaÏž§tpN˜D‰cB<½@ ;’ÌGñ\ =' ’)/‘ tc¼í{– |+Ê|,@/oCë,/`Ó3n#™òÒ6B7„ó]µ9Ô“ûø7í’Y¡æ´>q ¶‡ûÌÌòt ~Dâ0íOO-Í¿¼/»ÁQ»ú¶·¨‚à€åÙéÇâÙ€³R 8Ñ͇étÊ öÉÁé+ÚØÑ)ÌreóD•y+L{¤y™åå‹) C¢œ½qÆЫ½Z¸WbWçY.•9â´kˆLàbJdBGŸ?¥ÈxnJ³øhŠ6+Jç^Aˆ²ˆ„€ ŸƒAD¡ "Šâ Î )/xC¸ÇšÎùßùO1œŸCöß(¨Qÿlˆœl>Ðîh:H]å§€1uï—®è ¯)ÂP“Ÿ‹ý+ tîµØ¶Ì´TnÌŠç褀P~²¿¿È+|öÜù˜\DÏÖDzˆ¡;Šf}` ƒAáüÒÐAå(f³:tA®Ú.é7‰ìár­åû3Òð!L•F3Cà²¼Žˆ@¯lª6à|£Ž2:÷¹\ó LêÇëoû¾¡Ð8D ‹0øEàÁ§ Õâë{nuCž¦è?Ìa[’G§h œýŽÑà‹a¼:ÿì÷F‹¯:’~šLJÔ–{n±&yá~ã¿õž+}_Ò¬0u|H²:Pð ¾WüCðùèM‘¼ö¡«¶¨ u±xù‘GþB‹ 6©p,zæÆ°žrˆOåP8ã—ºé2|‡‹àoÈ ¹Å»¦#”lG©"ìóîÆæ(ïHÝ»MM8‹¿<i%Ð Ž’‹Ïà5r5ŽL¸Ÿ:`3ÓÆ®ˆA|ß!"<@_Ô'žºðÀw+P)œ°ßó}„a?É:òŠ)H0çpï¬ê]Á‰ ‡&¿FÖrè9x®öŽØ>§´XÆÁ‡!Vç+í3À3kè ÈËAÄn}Ç{BÐ&¨9RF8c@ð”Dܪõ~ñÚk/·¸d¸k{?… Ö?§9ÒJÈBÅØç:q„'äqÊË+8 ¹œ¿#“­ºÃd㎠¶@Ak û|Ãñ)ƒ‘ÌÓŒQš ýú3¡±LƒMÊ9vðÀO¨Ï Â0Ûlrp@)Ad1™;‚4eÔƒœ¬þâ.থb6¨¡¸uç>]Œ¡>Ò°ça&`@átg¨ÔCû+$ÿWíHŽä,Ïd_ \€ÖúˆÐ¦ïú¼à$Î&9Ç@Ž˜PèHkÇ@áòób2Œƒœ\D¤,ŠLZáÆ@~ù‡_üåÛ¿ž—ÙàLLÅ%\FS1|i2i衳—ø‹^1q‰Bô w#Cc«ÑÝcß³m8´¶ô€†ûï§4Ü`‹fCÉDÔÿj‹,—&?# œ¼ŸCCHöÔ6íÝ% MfœMB¡œ–ÐÊR:u^BçƒqЋ˜”…É,8 c ?ûòŸ\ÑÙMDô2Má|¬«¤¤-f9H®èÄZu·eç…l¶Mý¿™±™ÊA=_¶‚Î*¦àp\ßUÍ£ ç=F S^°D-Š 6„ƒ€AxƦ ÞþéãÏ/Š×\P&Òuƒp¥@‚ý£b<$U›PÐ…¥±TÔI¡2oâPúîèÍš£3¡`ÁgáôÉ?T>$qç#¦}çÍîá²|Î…•ÿñÔ X¬8ç¤æ™•ÒX)¯½Ï²ï»óÒ™Ì7›xÃ8-Ÿ)Œ—ås>½ˆGY¸¬Èó1Œ¿~{û§Kò9”‰€^Âä ¡)”!âÚôõzl·U(ïʺcò¡«š4,8áÒ~ú›Éˆá‰3Ûîöh n‚Ãû û:Öæà±ÔYä›):„^J* d2|Ž‘Z+|ÖÂÊ4€O­ÿ\ù Ê­ÏõZÎLaæß2·\|j9ASÑiƒ2]ßRRøôù™Ž›Ð—âĘQ¤9޲?¸d€·~_ÇâÔö˜¿pùâó]Ø©lhqöeï‡qhܦ鲉º¿—ˆâ}û6”C ÷” lNS>ý¹õ¥óÔ¯êÑ=–d÷W( à¶}zâÛþ&€ÖgnÄ»o§³ÁÒÅÜ3Rì;.1jßÕÝý¦}æ'ª¿h~¨§Ö¢ÐV^„Êþß¿¸Êwñ¬õŽ«TjC/Þ‘b’Ÿûz=¹`ÓªÞL•óUœ»XAÕ0i7BÒ3%õ&0ê2#byÃÛ‰ê.åJáÎ ¥bBº‹¤ ‰KR"Î$’"CþÿÅXU/Š1Š_¿úäÅ/§Nò¹NOdjá%©YèÿÅ?WÉš1 ¶Äkå˜4gMq0N ¥ˆ ©~ÇwÓ@<¼ÄP«Þgâ|•“ÉJ,t¥H/Ä/`æ©Äf.í8± ZÑsˆW’xlÅ?Ûä 0¼ Ê)–,mHMÐw_]„¯Ž ï77>™O‰P+:ª}©7ŸÝ…žÃ¨£-MˬJ/Ëä6½ÎAøu¸´Y‚¥6ÅQÉ"%£‡K˜¾ºÊ$ÕU˜JÓÊX©Mµc±&§ 6Ÿ ÔøÐW£´§ÃôàË © À®z¸ÃTñÐ?“—ñ>9 XœÑ ¨Ë×°ŠLk›F‰{ø…×~ïŸÚÎ+>þ<þBd¢(ˤ|ˆOûõTiØs©\/ϳ¢”ö…:.%â%Ÿ»jj§’ú…RVe\&Ñ) â¾îAï§Ûþ+?„xÑ|XM¢`tæ%Rýê< Nk,8Ù ¶CVÅÒƒÙû±^I·2—¢—i͸^ä6j=kÓ’fë¥ÞVëo±dßócì3ðÐb—ÌŒê| óP-R ‡öÅo}ÕA(-ò®–å‚õ?ÌÂiù­kð‘X…Á+ÒjÐ1ìö©«ïë.IûL\U!,ï ~ÑL|=‘lLä)&ð‹ø° Èé½ÿ0ÈEØ+-½0Ú¦µ>&ÑE\y)—zÒ\\…P½Ã%ÖCm‘墟qŠIh-édhr½Q½:$5Ðÿù±ÝOVó$>UWÅU RS z©¥ ˜5¿åÂÑš8t‘”áy#†/š=S0˜Â» ¦H|ZÒç½I×¥ãˆ#à÷™Êc£1Ä/¡Çž»C(®*ÁѦÔäÁÙ6Eêl›¤vÆ”I=?ï)Ú¹YŸç%í’Ú %¢í'@w3ž ÝI23TŠ»pt @‚ï@ÛášKà¢ÇHA2ØÄ¹q~ˆõDÏ¡CR5¤Ý‰«^ ®Ú>V#†+Œò"Öca;­òÉóx˶‰×l;þР:–îypÏú Z÷lV=$£¿¼k*ž!-[ìÈ&ëm}•ðårÓ|Àèö©oÈUó³í‘É`t5uü’¬(\ÐÛË%%2—$ôîè=’½W˜Äåò¾y_¯iÞ‰ªÎBfZÚô’ 묕`_çŽ ö¦}qíS<í)/‚c\á_0pøendstream endobj 2131 0 obj << /Type /Page /Contents 2132 0 R /Resources 2130 0 R /MediaBox [0 0 612 792] /Parent 2123 0 R /Annots [ 2134 0 R 2135 0 R ] >> endobj 2134 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [184.5753 24.8984 207.0466 36.8536] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 2135 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [234.3886 24.8984 246.3438 36.8536] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 2133 0 obj << /D [2131 0 R /XYZ 64.9134 727.2935 null] >> endobj 46 0 obj << /D [2131 0 R /XYZ 64.9134 426.0413 null] >> endobj 2130 0 obj << /Font << /F8 1548 0 R /F14 2010 0 R /F22 1606 0 R /F18 1536 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2139 0 obj << /Length 3240 /Filter /FlateDecode >> stream xÚÍZYãÆ~Ÿ_!ä%qÙ/¿k;»±{7Þ1ü°Þ‡–Ä™a–"Ç$åñä×§®æ¡¡ä‘`€ûª®®®¯ººª¿¼½yõ&[åažèdu{·Jl˜+cW©‰Â,‹Ôêvÿ1ÐÑzct¬²À¬7*Š¢àÇk|óý[¨7&xûýüñþ‡µÎ‚wÿx÷výéöÛ›¿ÝÞ¨Uj¤«“ÐæI¼Ún~¹ùø)Zío¢Õ·7Q˜æéê ¾£ÐäY¼:ÜØØ„±5Æ×T7nþ9ÜxŠ›)É/Ï­'Éuhµ5´ž7e 컪zF¶Ó nú¿² p=×Éš²à} }›ª¹çb×»ÝZ§ÁçŽË®•¡¿–ر?Yø}–ÖªjÖè¾Á®/ö\ÿsG%t ¬×§Á±#R9‚¦I1/ìTšöÆ)ê·ЩìxÄ¡pu7YH¤´Q*ÌãXÓ¢4§&x|À-z†±R-w4 4ˆœD:ºû‚¿h’Ô¼2\Oæ×e¶çž ʵOEÍ_u!¦½5 !,`=qbƒ'lyð]jîâ„‚ëû‚¤ðˆ2溾a¶Z?Æá¯ˆÖ•´©Ð¡ôcl0ٌݱõB`©.Èì–„uÄõ+$ˆ¿ËC!/(‰¦ëÊmUpñ]öÅÏ‘²µÔþŠT ,”Pˆ®½—6b€t*½… ¥^HŠLŒÒAñ[A¼qEeSÿ«ã‰Ø±?|?ñ%ÁwîÐëaŠ(hî„—G·“‘$E\UqÅ–$WÌ¥ÄæU*ž;?„uc„ñ0µqýÀIüÕ•­‘ß!i“‡™5 ‘6!ö¶ðOé8¸%¡] ðñÁ‚-MEÿ¨iìV˜’j‹–gÓjbp20.ÖÆ2™¥éNGÁ×%l¢)ZPc£IV™ >—¤ž{ÔL³è2 ³¡‰„}ïxžli^Ó»Z64Îy8ü› ßĶCAÖ\Azýë:N¸k„LR‘F&‰ç ÚKéWö¬ï& Ø"@*Fìë3$õ…®ˆ²–w ç>î„5QV\ÀžG¸ª©¥”“q…ó8€D'¶-Öh4õ¡½"Ö–ôˆø¾oHÀØHô¨æ‚׿±¥9àÞN4z6PÆ¢ðÐ@•Œ½é°aYw¤ECëý¬o[v'íŽlÿÉúÖÅf†¯Gf²Þ¼`Ä µŽmT»²¾¶FvpLÑdS­6ƒh‹¤œ*ü½ÁiŸdƒáá!5Hcíë°u3È#ÅåNm±1Üã± ¸­QžMϽ¶$CR•5”5œ¦2áªN%¦ +öÅep?±Ä÷Þ6œ‰ÍW[p©d•ÅOP„¥S­ê‹öd«m<(~ÎZi¿v3À>ÞX8YNMýÅz“€!Ù’uëEd2ÇÙ|TD\¥C“,‹Êuðå3÷´ãÎá꫞«ýžãôoáÑ‹õïk6cÂÙDÍÛó¸a¾Ž~ï 2Pî:.jºëã°Z‚#·ÇŽÛD,Wã"Hvë=·7rñ¨RÈŒÀ…¢-±2ž“²<,¶…Û?óÀ;Ô#üØ’ÇÒ›üª! `:s†“´qà‹ßÜ®§ã Oâ.ÁÑ '6ÝE£³‰4vMÝ«þ•ziÜã(Œ£ÌwÜ7ÞL±©… œü>¡Õp ›xò±8ðh‡br’Ȳ Õä68U ÙʪÀ 7`38ûn6 T‚Î +¥Ms9$l<±ÄPDß®cá¢7Êj ÑsI‚ÝŽ±\²…+ZÚßbfNð½ÅÖa£ãŸ©š#9:÷ß‘j˽'N]^%Ö•ò;¬„Œ‰ Þ‘¾Ý;¶=ú¿â·®ÝʺÊ×”LªÑ蛑–ëhÔÑ—öÅI²{=Ús+Í¥ØUlj‹_Žäû˰á\ä¬3|PO®€V³q¼ãP9Ýq­æ&N '‘ E«S‘ò1C¬8ÐZCÇk,Š×‚×êOL*õå¡àŽŽ+øâÑ»Í}Fªò¤j?a±÷Äœ4±À«£½‘±×@–¦û?Åh”€—»q£* #Ë%÷2ŽÍé•Èßçp<™úZ8¾´šÇÓå >É9_ËÁ—¸Ô lz|"óç5{;g{5&'À½ÈåÜ)›'n¹µµ¨ Ï/d>OdDû±“sô,诶æ?ôÞï½TMnÃ(Ë/"Õäi˜¤1GÉÄ¡öH=‰UœAåd–+òß&gŒcRç€y=F=./1êa9ãó÷`y5GT^äуrƤ\¼=ÂÛ1ÞG¹‹þwpvµEü0»æ‰h2p¡L|Ùk5èŒVì¯\ŠCÙd’kÁìß#ΦŒß¹®? ¯ëq8àë‡Z‡IbNDÛœ×Õœ ë"‡¼¦Îcg@6D‚Ï‚ìj‹¹>ÊæÐ0”Í‹g– òÝŒMÃX'j–Ò’ú /ÒÓ¬’ó±Ot;L=p–rH“MÓKßc¬†‚òÐ±Ø #/q^¾Ñs·¦~´PpWÈ#G-¾â(ÆD³ø»æØR¬Õø4qt’5Øs%ÆÑhÀ4eÀ©çÓÝòC*”ºåx3·9!Öl×›8þ%QK®ÄX/FÀ…+ õK²z3,íEL ó¶UY&Æö\ö¹ß!Ð5&íL4ÊÛÖQøpˆoLˆœ]Oj%m¿y`ìŽ=eÐ*N^§nIãÓ¹qN(ò’b/Œ¶óJíI°\ëB8²ÙR‡6/g€ŸŸÖJ©àõwXÒÁÇüWOO¢D›ÉEu¾/z'Š¥®GiP8>7âÉ1¨U¼œËŒ;‘Ûi0—‡]ïib|¿IwN˜ ÎÝ`d¢ðÐü ùum;¾PÁŸ»¥@äëm×·n2ÕI|ǹõ‡r&"lsn¿]z}Cêj•?°ÞR:‡7¨¥ÜâýOÜå#T¨O!‡¯oeõ:É'rÑ ”ß(xn=þwኅPµ¨aBÉ$5Ë5®pY¿L8ŽR¡ûí‚T*šóþH!LçA'¡ª¦¹­Ültž «®¼§üVR6?|® ILCïŒÙ­wÐJ¡Ã‹I%¡‡ŸÃu©ñQF¬Å-Çiÿ``öXÏ=”á݆«(¹Áýå:v@m%éˆ ÀÂýQB· 8¢;e (±ÓX7Ưµ¥è:e ùg|Í¥¶˜Ø P.© 7uC ²)ÂМ1•ägÙyÊ2öC{/Xä’®™ã¨ηáVzVÄK¹aR<û°­ž—´åýÝëIÎÈälÜðãà_xÔåfQÞØibk°È‘ñHòºµrc¢ Y5üø‡¨9|û¨÷Œmê]ÍVoøÄl8NJFÿ^dNãøuÅ©IÀÍHÔð¦j)Ѽ¬_jšÀÔ¹ÍWKœ3””¨¸š<8À?8@ÞäüþIç Ç©ŸY$}Ÿ8qÏ©ì0€mLEУlã<îp¨bÕSÙ?ðtdã±ê-#]MÓu4ºÜ¶ôŒ©,“ed¸µ†£µ’qäéhÃGªž> endobj 2141 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [371.3303 492.7634 393.8016 504.7185] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.3) >> >> endobj 2142 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [421.4004 492.7634 433.3556 504.7185] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.3) >> >> endobj 2143 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [347.5712 456.8979 370.0425 468.853] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 2144 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [399.8276 456.8979 411.7828 468.853] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 2145 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [136.823 292.275 143.7969 300.6879] /Subtype /Link /A << /S /GoTo /D (cite.Warren83) >> >> endobj 2146 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [473.6247 289.7844 519.453 301.7395] /Subtype/Link/A<> >> endobj 2147 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [63.9171 277.8292 268.4752 289.7844] /Subtype/Link/A<> >> endobj 2148 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [271.9204 280.3198 278.8943 288.7327] /Subtype /Link /A << /S /GoTo /D (cite.Ait-Kaci91) >> >> endobj 2140 0 obj << /D [2138 0 R /XYZ 64.9134 727.2935 null] >> endobj 50 0 obj << /D [2138 0 R /XYZ 64.9134 640.6809 null] >> endobj 54 0 obj << /D [2138 0 R /XYZ 64.9134 607.9564 null] >> endobj 58 0 obj << /D [2138 0 R /XYZ 64.9134 367.3961 null] >> endobj 2137 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2151 0 obj << /Length 2323 /Filter /FlateDecode >> stream xÚÕZKsÛF¾óWàVÄ1æ—o±²Ù$UÉz+JåÍ! k`0’ö×o?ÀIÙ†.U ƒyôôãëž&zÞÝ,Þ|Ÿx©H#y7w^dD*µñbˆ$ ¤w³þÃ×Â,W2ÿæ¡X®´Öþ?ùZJ¿¾ÇWãçõ¦ú;è*«¢Î ŠB_ÉåŸ7?-þq³^rÜHE¤Qèå›Å_‹?þ ¼õ"ð~Z"NcïÚÐiz›… µÖ}Oµøuñï`˜Š$6Æ[)# ‘/ Ò"¦(ÓTE¶1aßsH1ðVFÁˆ‰ÃÓÄxaÄlsXrHL ÄÚS"M’ÉyÁ®‰¦á¡AÛŒûSÇ›7Òû®ZžCìI â?A´&,м•]ûÙú[I0EœÄ 0™HaŒ2HôÝ)Ì©(€Fjsÿº]ªÄÿqTïÛêJ?«*n”[îŠfS ÞÖ8/뜡òÛ.»§î–ß³†íØC‰s×Å–ét5wwã”}K‹žñˆ#vV[èî9bFþÆõü_´=EK\bg}æ×vã‡ÒÎ{ÄÀ‡ÀÀCsRŠ4 iá?4s&á% Zø'—+ÇôJœì[î¨a˦“‡é¿]®b-ýkl_A·€Fó#êߘp‡~¶]#•ȯo»¬„ù[»A¶ågñTäHkc]v[‚þP/Uì?’H#¬Ç«å*”Ê/;^]öÔª¶æÖn¹Bõµm ´¸«³CmWïl[hBI/cN˜ú즣yV©ÿÌ/÷(ÍÈÙ–§p1B¥ Èá´–— ™y ŒÆÙó$`ê›ÕvGþÂÅ2Qnö6/Xñ0ZÀ¥v¥%e±’ú¿/¥”þ·?óí]Óžk;sGh!}!Ž÷¹…?ÍgD‹ÍC¶#þôÅáüñÐoBÀGÖlÉÂ÷ÜÁŒ˜ˆQÀ¢BðØ÷uòÀg~G{Ò³å%¼sM‚% ~¡NƒóÃ,^:D#læuÓôÞÜZÔ“ÜÄØ=“$I‘‡®í‰¡ž¬aÁƘþ –‡ƒ<ŸÔC?œ‚£d.!°³aNúä?„ƒbÍ£û¶ÜNF¤AÿpØ·}€-"l?qNÀ h¢ÈB˜C.Œ¿Í6,J8æwuE©‘Q#†´™QhÀ7rlŸv‹ WWL«!Ùòúžàý?𼿡#%ÞLÒ[éí©ÄE&¡ÐJ_sNR‰R‰H"£=wÓÏ“c y^¥C¡L`%¹,ÌÁÆd×ƒÍÆ–#I€MÈTÎ(É@ò¼$ †å’ü€g1ªÜb—’¢ç˜4i Éo¢fdÛhH,#“|L:xæ ÉFÍé0a"¢@ËÁ:JMyL¤„Là— ZGì*´Ä¡!e(¢ÉãŒ+? ‰ ¡tŸIÀi~Ò–fs§c1§ÝÉó=”¡)XÖ,šÜ‰ çœi69g:k®Ñ›\Av•zÌ6§g66¿ˆó|ț̚ 7ðËZG × ýpuÈÍ×c§áê°è¤ÐÖzè¥ôíÒ16âu6A¼žÕõˆWGеÚd§á:—_®³¦4°%2¹W “(>?ÅKýpuÈÍ×c§áê²ø3åÝå*ãNÅÓß[LeŸ_ÆÛÆ—˜Ù¤s0|Ö#†]ñ6™ÊÚ31w66¿–˜«¤º”f¨PH•Ø4£=a‡Úl>æpÃ.‡ß¶üsŒ±Ûû´\a6‰Üž“h„­+‘û3·÷Lü¿Áüvø$לölr|-ÀRÈ´’KÉ„T"ŽCÆu>‘=ÂDAüêôùú“I¨Äõ©$^¾šFžÏ@ãéé%ˆTIój}äß|sŠˆ~=‘ÝîtÄqÌ<[Ä9†ÎtÄq sm?Q4f®AêÏH÷fÉ 9çDCŽ#’q®§‹i'cÍl|%±& I6ñ…P@ @ئïÖ'!íP› ÑÇ NÚe¿®—EÀwø“›¬o¿-+û zø‚Ý!Ð3[ûÔÓv6ÑG䟵͈|Wö»µÊO‚{6¿’_9‰äYʳßmPvs¦2–Qð3gE¸|‰˜ØŸt5ˆ&¢Š«í6üן,gIíÕ O¹©£˜¹Üôœ®7ýe¿(ÆRy}»\…¡ÿß~vÞ]ñüŠÊdMÖÛô)Q‡ÅËÁ.8@…mhŒ…mX<¶×<ʵW‡ÎPÛÕTd„!L¼rÛ5Þh ¡1£Ñ¡>NÛ¢¿8š°em[Çòãjö  ù#2ž†,4U]á…kõmÑÙ†{E)µ•dx: qíxK#µ5í4œ¸Ý±æAGCõ:3~ØÊ.ß‘(¹¨fr«w¶vœ¾g]c‹üûœn¤QOÊåÑøwu3U’µZìõ¶:º6`‚è8/6Aèdq].á³¢XOÄw°ˆU8üZy¼Í/ýаWUÇJø2ܨ€hBÀKz–ót›u6aÍ]Ç*ŸàÑD"Òqj÷GoäK.!° Y÷ÀeÐÚ°L¦Á½b{(-j£4¥àTÅGUIóµ§ֱˆ!tÞ±ø¥ÆLN…x…çfx-¿ôOÚù)Ë;üd‚VWâ©Thõ¿(ózÛî«nJB“Š0Òú”„ʤ !ˆ'A<gÌŽdÃÝ¥ŽØlø²f,,«=Á(O»ŠsOôáøQÎRðLÞ™ >î Zúª÷ÿß³æ6endstream endobj 2150 0 obj << /Type /Page /Contents 2151 0 R /Resources 2149 0 R /MediaBox [0 0 612 792] /Parent 2123 0 R /Annots [ 2153 0 R 2154 0 R 2155 0 R 2156 0 R 2157 0 R ] >> endobj 2136 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./compil-scheme.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2158 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 394.00000000 499.00000000] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R4 2159 0 R >>/Font << /R11 2160 0 R /R9 2161 0 R >> >> /Length 2162 0 R /Filter /FlateDecode >> stream xœ­šKs¹ €ïó+æè¤J³ Èæã˜ç-UqÖU{–ey­FÞ•¼µÉ¿@€$È™4²Ëe«Ñ 6ø¡¦ ·þ£?oŽ»_vßý+ì|Úý²wUÕ~Ü÷~GÊB7yÿîãNlÜ>à¡@ÜûRö7?üéx÷Ó.J‰!쯜?lûwvo>ÞÝß>±êŠf@²pÐTÿ|ü|ÿùGÖ©êœUØ~#]ܱ*wwW×OO·Ç÷÷ÿåAcÌ©=:²ºJQÖLTglÒ!•´‘.»C©ºÏﺽùÂÊ®;µÃDë(yïè/+þþ×ýÍ燧/×wՌՇÛô_î>?ìíÃî¯0…)>ßÑ4÷wï¯ïd”åúáÃþ×§ÛÇyÄßÞíßîÞÒ®þ°ãÍ:Ò¿¡Øßï| ó5_|Ú¹åöÎþqÜ9OÑt¬%£kÈ’§¨Ñ#¢ãÝ`ÙÓÞ‘e†ªÿ´{ Dîvü ¿í0#±²EXæü¾®ŽÇ]à9ÀÆžÐEZÀýby¿ûøGuúí¦ü¤ }q&2 1$öë(‰Â–6žŠkš*!ib  ÃÜ®çà‘y¦e…´%y3Ÿ àK}šq6X¯2çÀÄŒ»€´¹…bëݶ¼}eÀ܆Ý;d0ÞYÓÉõ€Éõù€aD0™ï4`Ïú4ãÎì2ó0ï¿AÀ|Ûå£Ý®ªÑ€ù8Óë³óÙ¦óìyŸfÜiÀ.4eêyÛâÝ–ªiqƒ$½>oIÒùNó¬O3îL`.3e`0ðc²á¯ ¦AŒ^Ÿ KŒÎw˜ç}šq§¹Ð|¤†obèǶ Úm©š0$éõù€K’Îw°g}šqgv™ù+Irel‹Ëv[ªFãò I¯Ï,I:ßI`ž÷iÆæBóARm]¾–$ƶ8o·¥jZÀü I¯ÏŒ–dHÒùNö¬O3îLÀ.3%IÅu'9|_£’}Š\ž  ‰‰Ìu’g¼A§á¸À´²ã±³!wÈ_ߪl[æF™÷£ÊûßM´ mç›Èÿïl :×½ØôRZ0ûÜŠPPTµÐ;Û럯«¦¾kØfHëG‰ãö¾×°yΔ—úm£LP.7å  Oð•ÅK¦”:ÐK%Çòæo±’‚Õbu®|µXµò5ϹÆêy¿mÔI¬.1}@ZÔƒVêAßú-V”³¥«f€NŠ×Ký¶QkP.2í}eÍ ô=Ï/öšÎ~Ë,ĚЪɞʉ ë˜BÅ;ÉöËdöàeǰéSÿrcÔïs9wrÎUÂ!"¸}ð…Ï\Ž»7?ßão×G9Ò:Ð\Q ù,†nâñºÞ‡ —Þþ*ç½¢ë©Õ5^?ÛN¡â §Y÷wÿ¾}¬§`)JrØäéã¼a…=#æâþ*€ýeœMË—¯«Pú¸›ÏÇŸiè£,"Y‚(¥ël>ÊxL ú$C¸e±Ïâ C­g¹Vz–}”Ùd4FÑ:•]¬³aÖÑûJy»ë3fñLÄÖ±ÚZ$W%ØÄ¯ÛJ uÑçrR.â‰ÂÂ’ÓÑXKpJ^Gëm~–å€I¤\c’6µÚOÖõ ²SI; Þ‹äÛL^ÖåQeÌÕ³×ݪü!a‘çØX’'.ŋРK*Õ‡Ç:²Ä(Nª°Õ=J^ç ‡<ÙÀ‚Ž…"3‚eãA.¾®d9ó2c¨sb×Qv%G^bÑÄ7Ù¿‰o†Vnø<â“äË ¼ÞQàI2À“d€'ÉïË <Éx’&à}™'yžä x’'àIž€¯ú|Í_½ài5ø¶RžŸÊï‹Þ—xŸgà}¶À“4O3ïó ¼Ïx’&à}ž÷yïó <Éð$à}¶Àûl€¯ª|§_ àIÀÓbð$XàéAð$ à)xðª< xå{e¾V)г'ÀÃ1¥É'F0>E2>UÝ|6ëæSç¿©ÉiîÉwi³òôQåü¾OJ‰j|Št³ëK’}Åj==S4>ƒéÊÚôxÎ>\¥ÑÍwŽ,cm´&xNå0Ú ’½È¹Jamv4Ú\x>ùΣ "mk¤*hÑÛ ê¶ÑißЛ ª”(ÖR¨¦JË¥5A+soƒ´¨÷6‹+Ò²eÚ¤ÕÙrÉ£ œ£´Er¼—¤IÒª€ü‚Š£ Â\›­ Èßݦ Bú–®M…V*}Rϵ*P¥i|ª”r’îA­Sªµ¬µA˜¢´Iµ*`Ú¤½Ðº€)ÈÊ´./NPëºQ½¢²+’ÖŒ%6}µR[C„1–æOäm-F/Z-1ˆ\tvþÝŸôE¸µæO=my«cµTà–d%Z-H–•kÁ Æ%ÊZ3æ°YsVhg¤Ô/’[³¢÷Iš½SҬ轒f…vK5+z¯¤€k¢YÑ{%ÍŠÞ+)V½WªYÑ;%ŨwJš½SÒ¬è’nNï•tk{¯¤YÑ{%Í ]kÍŠÞ+iVh¯¤YÑ{¥–0e,YKVÀ’°dLYKVÀ’0e,YKVÀ’°d,YKVÀ’0e,YKVÀ”0e,YKVÀ’°d,Y1Z)ä¢Bõqlô¤Œ[/Ø¥Q°q£ ö¦`“S<¸Q°‘¥XFÁ®á*sÁnnGÁînµ`7·\—Õ¥ìæ®*š+)ØÍ“-Øã^+ØÍ¨ÕÞ6!×eõ$»-¡*tyݨ?@/ØÈ;Êu[±–áZ¯U°%ûíîÚ7|õendstream endobj 2158 0 obj << /Producer (GNU Ghostscript 6.52) >> endobj 2159 0 obj << /Type /ExtGState /Name /R4 /TR /Identity /OPM 1 /SM 0.02 >> endobj 2160 0 obj << /Subtype /Type1 /BaseFont /Courier-Bold /Type /Font /Name /R11 /FirstChar 32 /LastChar 255 /Widths [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 1000 600 600 600 600 600 600 600 600 600 600 600 600 600 1000 1000 1000 600 1000 1000 1000 1000 1000 1000 1000 600 600 1000 1000 1000 1000 1000 1000 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] >> endobj 2161 0 obj << /Subtype /Type1 /BaseFont /Times-Roman /Type /Font /Name /R9 /FirstChar 32 /LastChar 255 /Widths [ 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 1000 333 333 333 333 333 333 333 333 333 333 333 333 333 1000 1000 1000 278 1000 1000 1000 1000 1000 1000 1000 722 889 1000 1000 1000 1000 1000 1000 250 333 500 500 500 500 200 500 333 760 276 500 564 500 760 333 400 564 300 300 333 500 453 250 333 300 310 500 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500] >> endobj 2162 0 obj 2712 endobj 2153 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [439.4722 36.8154 466.9249 48.7706] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.2) >> >> endobj 2154 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [495.8746 36.8154 512.8112 48.7706] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.2) >> >> endobj 2155 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [279.1345 24.8602 306.5872 36.8154] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.1) >> >> endobj 2156 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [332.4341 24.8602 349.3706 36.8154] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.1) >> >> endobj 2157 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 24.8602 516.6856 36.8154] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.3) >> >> endobj 2152 0 obj << /D [2150 0 R /XYZ 64.9134 727.2935 null] >> endobj 2149 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /XObject << /Im1 2136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2165 0 obj << /Length 2958 /Filter /FlateDecode >> stream xÚ½Ù’Û6ò}¾B› §Ê¤ ‚gÞœlì8»W?P"$1á¡%©k¿~ûxHk4;Ž]5q4º}?Þ\=/' ½pq³^„¾“é/"é:qìŠÅMöÉò¼k[zˆ-ym ×u­®…õúí+è—Òzõö#7ÞÿûÚ‹­w¿½{uýùæ×«Ÿo®ÄÂ…ÿb€ë…ŽŸ„ÁbU^ýçêÓgw‘]¹‹_¯\'J¢Å´]G&q°(¯ü@:/¥é)®>\ý«hˆöä÷Ñ&žã{¾$zvéF1Â"üà „ƒØ>é‰ÑBwaËÈñb?¤%Òñ  `@ ȱ§Ú¨XZÝVqc…½u¹Ë l¨†ÇG°(ßö ¯ 5¡ñ€7uQoøsU—j‡[:ó–S=‡w-Ó*ƒi6~9´*5ßa_¡ðƒàV‹í¼l…•ØÕhŒ¶mòއ:øª';¬ò/Üúé+è2¡x(ÍmoÄ_Žû °9²Y­N¹&'L„žAG¶°ý' ’œŠ“Ç ½†c¨ù„ØóÿÔz{è÷‰Ž­nŸ" ÷­™¹…þ9¤ˆôCiÞ3X{¾ãù°Œçèè”h—´åßu]ÄY/²îÚfv³… 0HkäˆDÆñ»k;ð‚{6ÇÂóõæŸxhÔ=' #3áÝû›×ïÞ΀‘Ž"Ò³>£"„¡E?‘åÌA 9Âýòõo?Ï0ÆsÂ`8Î)HÛ‹’ÐÝtïå~è:ð €ïN7ˆ èqh%²v‰­ºÐ²ÑNN˜Úõަh •èrÒp˜ÞH:UòÔv« i‡S)êЪ°„zÍWÒ©ÉDz#•=иÍÐJE¢Úµ…ØþÂý¨ ¸è71ê W¤ÃøÝÌ[$¢Þ·ÅGPˆ[Y1+°S:0 ,Ã3 ÑÚ!!dÏ%Ѩ¾Ö ”0\Qƒèõ§"CÞØý™Ò9 3ËÚÄhD r5Xd>Mìîjü´DcÛÊ-´­â±TƒPÌ' wµïÒe âkßÖ^´­q«;uÛïÚè]·({žñ8äi9 `ËíJãXjü`h_èmÖé*'_ÓáNJgW+škÛ?Ï'² ‘ {tÜ8®ú)Çß×Þq£1Ô¯M£ï¡ídÄCuÃóÇž>ˇõ)ÒùÓ ŒíYPÊý»fÐ@µUÚéz…ÒrAÒ‰+rv:‹Î.´(†·y›/Gýkmã&Lc LÉrÐÓƒuCÐpsרÌà|ÏnUíLâ`#:20”zKbº‘‰”âi¤0Š‚ÅŒ‚£dðò0uߎÁu5ÿöÖ­à'æ°\E®a¾øHù†‡Ûz߬æE‡í·ÐAhƒ€Ô¤ÚUë,ö-÷7²^éÆÃ,‹Ð¨a±ÔQ%‡=ÏàƒM”{ìèt „¬Ì3íàRí±zƒ5"7ÇÌÞp| Ú8†vOBlíÊ‘CCšórW˜5mdzxŠ™V 45%`rèW}a3·§Ñe¡£õuÃxI&Ÿœ>:h>Ø|êE½BÉ01.r×Ô>{ )¥‰ïúha8à½á‰šØ$øþ¾È÷ƒmN"6jÝ»¿ ®‰‡ÍI B†ã#˜Çvžë¿Ü㾄õL‹4yfu30‘ÅãÈÔ».ç“Bw¬õÜaÈ}£ KØÄµ*›ªÐªf³CG_ô¸ô™Íc0ŠIªæóܱ¿R•F3ö ͺjOY%NàÆF1fAò.݈ {AÄÒ®g’!(ÁÓ…gsÙ¤=B¶]ï»ØÔÓÍüÀ!HÁ×6 „{I¬ç Û˜ADCÈ3Nà$‘09m:“lpN†p­On”–Ö$ø;ú{Þ¨Ù"&%‰œ:%û÷™Lt¼è9vz=;ïÒÒ^×M¶CÍ„óIÂÀð¿í0‹";½îŒ«šµMT¡ÐÖû÷kH2­o79ø à8²áÄê49N0ô¦q‰}÷„Ä/²Wuö÷п®£þ^bØþÁö @˜¤¦ÌÑËaçjÖÊ3úƪ¶W;Ù3éd"K£ ÷ñß—¾#‚Ä;¾7OÀHãr;m[U.!§ú6¼/ûÜŠDŽ^¢i%Ÿx8Ò@Ãp·}¨Hj–|x–|cnÌpàpðúXÝ|ùŒXgvWÏIí“ðá§c«{jŠXWMug¿„ö®¹íš”@rjÀA>§A”¤rq䘳‘«Õ°³^þ©VÝ7âæIc°`—ÛwM´Ý©rggy3ã¢ò!ìÔ8¿qóËLP:qr£Ÿ‡2ïè)¯j4µuclÈÈ´S%Ñ”¿ê&ÍÑ|yˆŸƒ ÏTA™9AÃ?Æ1Ó™!Ÿu7àKÒ×»ÝnT+gc°£ó%bÒæ0ç©/9<Â=ª½U_ÒÿéÕP ÒX#LŸ—:¥½Ù(ßEh)×_/Aþö ÔíV5˺=Ojåc©‘.¹™t`|³ðÀcЂ³}J¶ªØ=‚ ]‹ Õº S<.-rï‰޶hRωÒ)*:CkÕ2v™æìÙ ŽoL½B'¥rc1Á2?1%D~rVù¾¯]aèoë«5ŠaÃØóFß*Žo©çÞìL„Xµ8úZz&Bà›'ÄQ~fï »íP7î³§ò«)ÚÓ81–°Qi6w;äA&äN¦ÅÉtw”ärÜFµQóqÍ“ð¤c[9( §†©Ý·;ý›êQf©5ÕnS˜‹,E2'¬M_¿Ðr„›å«¼Þµ€ã"/±N]¢ØDF^mŠ¿Ž‘-ÍF'ÆQ@¡:£T·×A€r}_p©Ó®Ö¶jšº9KUu–*VhŠ^C©ØSm–î±:Û)ï­œ"Z¦ÀSdw¡?>ª|SÙu5ÚO ƒIC¸0zs0[ÄŽL<£¼z£çÂöN÷ ]'|S"¡+@ÅèÂá,Ql…hQN„ð¾ÔòÈåÇḦõ“þŽ~ö²T¸Ò‰àŸ!:;~”"ÁÊx¤Á`l¡!£ÓW)ôò„Ÿ¥ˆÒÛòJ:B¢çãï£G)=D{ ’^¥LP“0껉?ìLfï“OM¡‹–Úhñëû »OHCç{àžŽTñ©‰ëhî'¤ÎOº†Ì„æ•ÁQ}+µs‘p^y¥%rd­øvTK׬Æ_ë6ªn2Õ< ©ÞPì I—"5îaTÞìK}Ýë%ø¨àR\76µ¦'y™ÿ·7Œ›œŸNô—Iù±2¯ŒV‹ÌƒŠ´™H —ŽPêF[—±€ÙEÚv&,ñ¥ÁÓð !jµ_ö— “sòP‰_V\â^á2í¶g±ííêZߺ÷ù:.笕/Vãäª<®N®.%íM;gq$Â6ý-&¾.Ö–¶ëº½°¢dÿ¥Ôξ­ó ô¿=/+üøÁ> endobj 2167 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 688.9373 99.1185 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.3) >> >> endobj 2168 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [368.8793 562.811 391.3506 574.7661] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.2) >> >> endobj 2169 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [417.9742 562.811 429.9294 574.7661] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.2) >> >> endobj 2166 0 obj << /D [2164 0 R /XYZ 64.9134 727.2935 null] >> endobj 62 0 obj << /D [2164 0 R /XYZ 64.9134 676.5594 null] >> endobj 2163 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2172 0 obj << /Length 2645 /Filter /FlateDecode >> stream xÚÕZKoÛH¾ûW貄öƒlroIv²Èl’ñb<ØÃÌ(‘–‰ð¡å#±ç×oUu7II´e'ñA€ˆl6««¾zýúêâåÛx•°$Ñêêz)–p©VZ,޾ºÊ~÷$SkŸAà]Ýäk_Jéýóãoæâ²mÊ5÷šÞ*oÛT°ÕÛÃRQæ-,QzB®ÿ¼úùâ§« ¾ àŸSI®¶ÕÅ/~ÿ3XeÁêç‹€éD¯¾ÀuÀd‡«êB…’…JJ·R^üzñï‘ ï(ús’¯Q@Á$ŒÁ”P’$üÏš‹Ø{…¬žcéõù­ \¬ Òäêòj-…·)qåÎînÓŸÑZÚ7­Ynö}ÑÀýfÁ9K4ŠBÇÿÝìb¶ÅAÈ’$Ôp%YÌM[} ®òº?%ÊeÂB®„%ZÔÀÐ*¸Ê¬æhHàO^¯Aì¾3Oàúí’›¡GE½¹ý#àªÌ-«sH}®B@œÇÀªbÖh>gA#ˆÕwDUhk¥DUp'šÿ ¨¾1·{2Lãcâa ˜$dR¨‡`‰&U¤jáPñé$<…^‹yRÄpCCõí»÷?¬!tˆÄa7tù®™à£+,Óà 0{ÒΛ7Ø ˆÞ´K"òX°(I$\ó…¡•ñÍK’é˜Gö¸_.¯ÞýòqÁ2€+-…Û¶O»nØ[„ÁèaZB–nyÆÜfÞ,G×£d‘bÒ¤ á`$øªýËF#ÐhðnÙ›p”(ˆ´š’„Í–²DtAË"a\èû9âqØ ÿÚ,h³DÀšuSn¡Ø•Íæ~,4g’‡òþ££˜ñ$y æ +4a G ÎÈ/¡¶qt€øab^ õQœò!ßh â1òÓ9_%¾ÀH®¿U|­ÁÏàæHüm×·÷JÅj¨8l* “è1âogžŒ»Z¸J “Ò—Q!Ç€]Qò P`H–ßæ 2€pɱƒ\·yFug«˜ÌÆC³é]r©»ky{oʘÏ(YÛÔaK‰{þyF^Šð)DO›“S R‹˜Ö~_T‘?‚0ªv-[Ó%÷®äùáÆÔ`7¼Æ³¹èÈLêÆï›½_æŸóò«`@&0¾Û|±ž©”È"(ÄZéê·0@ö›v›/0Ê!i©kƒY¾v;—o¢”†’_¹LqŸìR)&TÄd¿Ÿô·ˆ~‰ZnÊf÷%νW¬ï8ým° Î}XUÎ`«¢ö÷¥¿)öç ¶¤ºÛ²ÖÔ幚 *sí¨åÔÜn* {ßUáûÖ±Œ¼Û´7föC¾¯³ïË÷ÛØ`Ò”“…µV· çð]¬ÅɳÂ5$ Ë“åx”ÝMÓ’9¤µe×üR%‰‚“ž›ûäôî¡âɾN05ݯ†˜½d4Sx&¦Gd,ÃzŠý2_3ßþËbóÕžgJ°ÆÚÊuÓžú¡³<Ì#mï¦TIÊxM²oí«d{Ü{b8íS”ЇՋ%4¡‰åæÞq±/à:ÕE»N$ÎoI–í€bašyB€yo#>®qB^"®÷4#ÐS>²‰îëEJŒ¹èó­31ÅÂ8Q‡-Ü;›X ë3Ô écÈÊ©ö8 7;Œ.®Ð–›ÜQ;Êqqk_º¶ ’0 îÀy‹= $ÐZ…u“Ú›VX!CÅŽÂo÷wëXyŒ H°„Š33Å 1[¹ò ˆ /ðÛ» ÆÍ~?Ø:Ùé =-LPÅKWÄaµÒ6e9}z‹ŠšÔlµÖvjV8£ yäŠ1¹âg¡ɹمΰ㦆›­}%#ïÑè¡›ž$:½næµa;—ö åŽÒW0­E|èè2&"yuZAZ:V…Œç5à!·[Ò ­Œ!Ho.º=qšo ”!Ï^À2œ¬Ñ‰¬áLÖØ3û²|ïø6á.ë,ÚlE¬Ñ2íÜñ¦ú ØÙgmn*úJǰeƒ*¸³D\8‚GcÏ>Tm:Tò0üÔqd¥Š5¸9æíOf•œ &°5µÝ7ž×óY!laÀ7'oÁðo ezâhÏ õcéà•£í•C9º^nÍ FEßä.m¼®Hû¹·9ÖñçF7òÇcÔŽëɸžkˆ#gI ¤\[Vð­±`åVlnÀD£üàk9ÜF–9¥)Ϥc(…eGs™ âEÂqTÔŒõ2-ðúÖ‚ ÏNNE= ç’eN÷&ËÃ5Ùýhï&ÌQ§E1brf¶În-·Âjˆ{P¨ÔÕÐûØôvOCݾ¾ÆžÌ.:ó×3¼taͺuä€_¥ ‹¥:¥ñQ$'7©£mê"¼´±±³¬¸"øˆÃƒ8j²&,&•8ª%QŠÛñßPR\Þ£âq‘Êö=*UAdrþ‚OŒ Ó|‘޽·˜Ø°XÃ‡Ä £¸ðÆV#íšú‚ØÑƒIÅ-N™ˆƒ|´wó&ÍÝn¨·NIÇ ÙÎìMÛÜìI©;§¼(G£Å-׎›nØŒc JăIä(xá,î!ÞVÓ\Íë1‡ޝ4“!.Q+Ëõ‚aЕ+³þv½h³zÍÕ>sÁð~p}Ô¸êÈ/7M™»2 Ÿ_LcUË–„‚’E+ª1cÉ8y¼Xo-VQ*]Ýß,qÀ(ÏâåJÍK¡S¹i†.E›oûƵ{²4ÛŠ¸* {†Êµ›}?öÌ‹àà·Ô0Ž-8OÀfÿPùB•;ZznC«R5UÑÓõî¨R? î¶¥úÎsù\³ÿñ-¦{>‹¡X0Ý.h{ì¶)ýlË!;´“éå¬éŸÁ0²çžæH­©‚fŠÆÔö“àæ‹Ù~jëLLµõ¬ ÌŠ1ÿÍè¹f±3eôX½›V`>›{ô¶Ï‡žIÄåà¦-¶Mv]táê3ª¶K7pL‡:öu=ÀMÖeêš&š•y…»æÜ²C_.úƌNJp¾²½ä¡+BAÈű8LѯA,¡‚ƒ"xOa/–¾³ÓwÈendstream endobj 2171 0 obj << /Type /Page /Contents 2172 0 R /Resources 2170 0 R /MediaBox [0 0 612 792] /Parent 2176 0 R /Annots [ 2174 0 R 2175 0 R ] >> endobj 2174 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 30.5402 516.6856 42.4954] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.2) >> >> endobj 2175 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 18.585 104.0999 30.5402] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.2) >> >> endobj 2173 0 obj << /D [2171 0 R /XYZ 64.9134 727.2935 null] >> endobj 2170 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F33 2063 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2179 0 obj << /Length 4836 /Filter /FlateDecode >> stream xÚ­[Ý“Û6’Ÿ¿b^®JSeÒ$‚ä¾%¾8•½M6wñVv÷#Q3¬P¢N¤<ÿõ×_A²s•”«,F÷¯?€ùöÃÝÛ÷Õ}ÖVÙûû{kÒ:׿¾ÔYZUY~ÿa÷Ï2‰VE^môC’gY¶ùÇ/ù懟¾‡~­7ßÿônüü?ªÚüýoÿþáßþz÷݇»ü>ƒùLWÙÔÔ¶¸ßîþ÷îŸÿÎîwwÙý_ï²´¬Ëûhg©®«âþpg Fk×Óßýr÷ßž`â(&!Éoo­ÇÖ*5ÊhZχ‡Jo†‡Ää妅m>Áj¨±½L-öW› ºž¥ý3´ÏC?<ñ'“|úëCžç›o~ä§íp@ 'Ûõí™;»#ÿ6üóÔ}DÑTGÑÛ÷ZÜ*]¤*ϬùäyZ…¢¹¶@Ö7/òì"íDé|35Ð×·oRè¶å†~ìFž€ÙË6—±å•©P@yV§:Ë*Y[’œúdœšIÆ‚²Ìc “ZØ úþ‡¿}·•R©-Ü”9ü€ü>³F(­˜šƒQ^´yû<\úÚ||t‚Ƈ.”¤±»@s‹”ÚOóˆBz­Ñæi¡­[ã˹ãå…ædt £@¯«,5¶Î×öD6Õ׵ƒÒi®+垯ÌÉSLB’dO îŒQi­3;ÏŒLžú‡ þ,¯ê?‘CGñkeše¾äÐkÉ‚ÉJÃbìŸ)FGñkLVeš•¦\2¹äx›¯Õ41 ¨ zinhÚ#ã/ap™ÂXP¶â ?Ÿš§[f“k‹ö•’g÷ …€Câ·¯¨¸àÁ¾AUí'~ž±ñ³è2¼ÂÆ“¼øw†B|ZA!vv.}wlG|¶›mÓ÷ã’ YÚphyÀÎòÔžôuǦˆ­-A,¹tÈÑ”Ì Ê”†-¯eÐäÑznj”[›>¥ã3ª„-Ï­_s~z«£û!ÃûÑw1{®ÓªB(î/Ç- oŒªA•ÐùŒÛ°UI‘©ÍOÍ¡íaƒ4{]h’w ð°g¼lQžÃp ÎÅðÅKç¾?7^»¶ß_+Æ«¾G |q“¨…:B´=Ó‚£±;œú–ˆµ©Õ…"ÛÀ;VÖ=~zt 9u¨t¢áËi`,î'<½8àîÄoÑèŽ]Žs?vÃŹ%$òÊãöÍ8yŸ%·ùa:£Øáù0²[ƒ±½Ø×Ä‚ÍÆ»Á¡ÛñwÓ³h0¾÷ ãSDk´ÎÓÊ–Ê{ºãtG´ŸµâàZ—Þ±‡®êÔdYíìÜÐËop»1²A«„`bÀÍœºC÷¹™ÄG›ÍU´°ÎöZÆy-j36‘ >¢þP€§-w ð¥l6i³;ô®Û€oÇÃÙãöuÇ'Ü ÿ¹0h«ˆÁitjÖ°GÌYžÎí®s &:Œ‘NËúzn¯¦§QltÀÕ‰Ðèà¶ò3yx&€{|ìH™Üšåº–I 7÷‘|ì€_û©!ð‚¨±°Ì¢p€ñQ×[@à^šPoh)íy­8V¥¥5AüCÜÍñ)’QIÅu¨w…ñâŦn`pé,˜Ï-©}Í6Ðr›Å#Ñ”ìÁŠoû¡ÙñãÐ’7ˆ‚ï˜eý^¥PnÃå(Ýè/ȸpAEµùq8ÏÓ2xÑ—ûNÆÈÞ¬™„UžÈ½±o¶DËkœÌØåÚ½RsâÙ!WòÜ#¿{ "OLUž[~ @ÌîžÆ ‚ëŒX™{ϯþñ»$zÙ$$áHØvK€éû+*Wr^SYúÔkÃë»q=¤šYÃnöÙ w×63øƒ h‚¦3€"7O7Â躴 …I@ŒSÒ#ÖW F¥Ë|‰¥ª0Î!»X`)ÆLÚfÀ'2‚«¡TwÈæ³A›£'BHü‚àº!!$ö:1w’^àÆÒ ò…½óU6P›†2¡¤¬Ønh8çb\Þ…ERø=·OsPÅSŽK=mÏ-+`ËÙNÏ2~FŒ«Ý'D¾ŠÂÞ>†¾%ÑJ1/ðXÚèÅÅ´J"I¤Èh< ÀËÆé#´ÙX”ÆIb¯f»Œ! ’ôLYIY³Í7Lð‰§§HÕÏÜ÷"áfæU"+h=µÇöÌŽšcñ-Òþ+DùÈ1C…åƒq:Sæ890ÁiÁ•æ–ej´Õ¢¸´ i"x‡Ð>·‡¥Â9:Îc R°3BŽ˜ÕÈ~AðÖ_£Ø(p…_Ÿœ ¶ì#–© AÉæ;I~kÛS‚«NpÁ‘‚ÛÊ44¬d A¨²uÎć¦>ÃJ¹G¢"›VE^-%>§ ,"pŠÛ6zˆB»Û|xïa)Z¼€®6U¾tÍOˆJ× ±q¦y/‘¦…àoF9È”nEGêRò‹\”@™VvÆ,hÇáéâ\C£^„Ñq{Fm\0k ˆYê%&Œ\ôì·€,ñÌ0òö±©·ËEþÊXÌQ pÆ¢•¤–ÐÄ¢U,A­D…Ý4òè’¨û|dÄËs+ ‘z× a’ÙÊÅóhGF>æÜ•rí¤ºë˜Gº(a‘×RC”þØî¢¾—cMUUs¬‰t½‰~}•­Ì‘.¼gæ¹IËUœ¹k÷ lmÄ:µUa‚XZ¶ÍZ¼.ŽÄÖbSjˆ€Éæ|äèP¶ä³ñ2žº­OïðƒëB€@Fu•šR]A´ª!òèq~ãºæZ`¬UU;€JÞªH`Q§JežA¨Û–)Ïy!< {ÔQR¡ÑpöK%÷$‡7ò{ÎD I"´ä gªµÁÒÅWr‰Só‰û¼¯#íÆž/TE$ ªœ7;²»iYÔÑOÞ6;¦>ìWÅ7[§E]÷ ©É3ûÇ‹oŽb’\ À¶§¥.ÊybÑÈ"+}nf¼½p”•i¥ÔUnW3„«.]Ã¥g¾ÒKƒÆ…ÃÚ¿Jš±/U@ú®á+êwò‚ê¿Fv êeÊÀºRßõ¦_d8Y5£|¦n |–{Syc¾hd%À·ÏŒ¦A^òÒÏTùyès3ÎFgUY_•ÍëÍ¡ë9]êhKÒÀu*WH‘‘Ob*ae`+%˜#GK(ûÃp‘L;›ƒ÷С>*‹J a‰ÉŠ´È2õ‡õÑSLB’+}¤ì¢ª«yâ þGùÒ³+>Íõ‚U²ô¥z þýЇGfYmЇ{}KóGq' “)@X&WË"óÏ0æmýÈM®¿hŸ‹/œcÐyQ'̨¹”…h'š ‰þÔÌ Lw  ¦ÆÀìF™Hñ™Ÿ¯ÓíåîUµi?Pç›îȉ(Wœ‘•©œj"LM'óõÍôŪ¯ µÑh&µ`´ HRÇÇÊ:ÝÈËÍ·„íüÂ/Urщ»]@¯Ð=7!‡ o,‚j ?òŸ àCøqOJÃ^P(x§AÌP¾ÅÇ‹íðÃU°ÒI©gd*{ÇPÃ?îœô‹hb.,uHûUíÎ+SËXåâØLô&˸( ­øíS…7Ë3Ly’£L*L>ø9)gZn¼>g’tg˜–³š…Ü6ä¿_yÀ³?¶nvRÌbåæ×ÊžŸT+¢}¾¦[×’@G+f;g®ÐƒæJ.Fo~‰ÃЧÁÈÀ ªB|5 »6yn?5‘Ð2¡2wç'ñTmŒUBkÈ•˶žNý6rþ 蔕þl†lãÀ‹¤‚DD*ôÔweØEÁæt¢ÿ%ÅÔ šúÊÉ­MÍ;)Ah\½ÛL—c2`éYQ¾´µþœC0ÔxW)ÅD9Ë~&½‡]{9>¬Ò)Fê_º8úú(Û‹¦ÎØ‚`àê>Å À¨n’ß‘¥¤Hl]8’L~Ã,Ÿ'ÝK ^Fy{:ûMÈtŸ}ž[g[˜Ùܨj›¥¡ŠFnäxl›¹€ë—ß¼û¯u€«Rkrs¯±¨XTõŸà Å$$IÅ‚9c‹´,Á‡ûaÈäOßüø]´ÜWÿ9r¤lšyMŠŸ7ujmU¯ÏA¹<ÿ·f“×îL€‹×:jBÖRáýÍ;,8Š×ÁvIØ<ö®Ôh°*g´@§óÞ;/;!?É¡=œ’¾/õ²ˆ¹ ©çBú[_щx´]ûˆì<=¹„Æä5k%5°@kT¶¼× xÿŸü^nàüþv¾¿Œ Ú23tbŒŸ#Èáïȉ„ŒâcDqu\Œsô$°ßœÎã(ÚjPý?q KhE“«V× *ê Ǩ³ªÀC®£$îÐY¤æJh|ûoµ½lsÛßÊb« ‹…(ü‰°ƒt˜XÎ"Þð;ªtÃ/g°Í(Ã1àݵÒÛjÑh×ôReŒ]¿Áˆ¥ôeS*ÐÉâÔ…j°Æ;T_4QŒˆOè)´¯}ho6¦`¹ãÙWû f… .˜&(W…5o¼²È…5¬»ðQÑpŒ!œ„Cï°Å/`7‘^™¥…§vì#ÏDùöÄm*—A Ä)„ãÅc Î⸕ ™8º;&‚w@jyGmûËÎÝÍÃúsÿ*×|å}Ç„«­ê"~mE®È©ª¥ {!™¾¸ú u¬¦™žnN>‹»ÖàNª"ö©O»SÌ›i>çà ¥$o]Uuª¨TÙ|q¦°ßÝ Š¡ÆêJ¤»åsQ"«‚êV˜“¢ª6ï*C9$~Äž?€ „\,ŸþÀ«öÓ:¬ã/³øÊkëÈ#BØÍL– &å+%q¯Â ן6¤I,ÇüØÍ;r6à ¶¹(NM·)Úø<œY(‚H΋¢Ö—[HPŒ5‹£›øÆ*Õóa,Òš‚<8r0_ÙÃ[»¹õ^ù2»c’$&ÍF^ÅZׇ‘祕¯;Ž%@'Æ}wy·fQƒv—µÃÈ7rýÉñ¬¡Ë ÝÙUTUíõºñ58³ÅS…-7i_M)Õ@³:ÏD@©|å&þ-€†¤¦ z‘h†RA‚>wñ }Ç?kã¡T ¡µ> R3Å©9(å³1Në}4 $ç@$â¬Y™lµy'á¶bbûÌWP€úƒ‹,VR"”mÊͦ O¸Ÿ“Z¬Ó °5ðˆEèCçÁ<•›‡®$`‹¯Tó+WM¡œÖV73E‰býÜÆ’k<òŽùí‚o¶È_”©*¯whq5ÂØ p•V©P‘rCg³6ø >0H· ñ M†ÈÁ«NËÊ_6é‚s w ôõ‹$I‰ÌžÔ}Õ }tBôJsüˆ[\q¤–ßsÿßµDáÑ‹½"Õae¯.1`ªì. B#ÔÒÒø²s425 [Y[ש,ÕºtCþ(Åã¯üôØÐ]qlÎ7.t©£‡8¨–Örª‚_€>^úÉlÃcá®V•:ˆTËÛª–äxÚåõù,ð¥9ܲ·Ñ ‡ ¯Ö6ÿʆ'¿Êopk{îp×q¥çêö“ב?¨"6Ó+1ù\qÁv %ø8ÿiSDK ô0:+~‡–”*3 ­ønäiÞñOǵëùšy³mg>âLd&U™qèq™º~L·_c‚ÿ^]‡HÈËN¦jŽüŽ"èi8tT,u|ü{ŒëÃê6Ò VÈ}bJXRâfåð [rðؾþë°ôaÄ4€|Ì‘ú¿IÎÆÙ§çî*–ûÓƒé¾"¹39Ho¯þAÈò%â`À;~¾.«ål#Xóþ?V]Ffendstream endobj 2178 0 obj << /Type /Page /Contents 2179 0 R /Resources 2177 0 R /MediaBox [0 0 612 792] /Parent 2176 0 R /Annots [ 2181 0 R 2182 0 R 2183 0 R 2184 0 R 2185 0 R 2186 0 R 2187 0 R 2188 0 R 2189 0 R 2190 0 R ] >> endobj 2181 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 665.027 128.5084 676.9822] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.5) >> >> endobj 2182 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.8503 665.027 172.7869 676.9822] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.5) >> >> endobj 2183 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [100.2465 366.1478 122.7179 378.103] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.6) >> >> endobj 2184 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [148.6033 366.1478 160.5585 378.103] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.6) >> >> endobj 2185 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3488 282.4616 116.0714 294.4168] /Subtype /Link /A << /S /GoTo /D (subsection.3.3) >> >> endobj 2186 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [144.0729 282.4616 156.0281 294.4168] /Subtype /Link /A << /S /GoTo /D (subsection.3.3) >> >> endobj 2187 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [84.3635 258.5513 99.0861 270.5065] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 2188 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [126.3696 258.5513 138.3248 270.5065] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 2189 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [100.2614 246.5961 127.7141 258.5513] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.13) >> >> endobj 2190 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [153.6263 246.5961 165.5815 258.5513] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.13) >> >> endobj 2180 0 obj << /D [2178 0 R /XYZ 64.9134 727.2935 null] >> endobj 2177 0 obj << /Font << /F8 1548 0 R /F32 2060 0 R /F22 1606 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2193 0 obj << /Length 3415 /Filter /FlateDecode >> stream xÚ•ZKsäD¾ûWôe#äˆi¡R•^sÙf!‚]¼1à ·d»µÔHjŒùõ›¯*•ºåaZªGVfV>¾Lù‹»›Ï¾.wU\åi¾»{Øå&®”6»B'qY&jw×üéØÜîU’$ÑÝS{»×ZGï¾ÿ?ü0Ý­Š†G|5Ña8ÂÒèC¶kGLò<‹Òìö—»oo¾º»Q»þÔrPšÇ¦Ê³ÝáxóÛÍO¿$»æ&Ù}{“ÄEUìžá9‰uUf»ãÉtœ­ÝHwóãÍ<Á½£¸I~¦i aYÅeºË«46©Ñ$ß?n÷YšE§îÀOû/ ϱî~=Ãc|êøå<ÛnŠ(×Z…û©w{ƒiÆg|õ¨¤öÊéÚ·H&xiqt®-ŽƒÆ Õó*.ÊnV©¸Ê²”±ý-lœÝñã±ml=‹y’ÜíÄ6Y2 "ÂiEÔœmãfɆn”Q`%UêænïZ9°Î¤…¬{³A*“²Ô!¡c}MGçq®@Ä¿CgÚ £b Öýw¨ TL\$i%«ÈüµNÅÈôÖÕ^Tfq¦Ò28éúœ4ÿPf±,õvƒÒ^—y¬òÔùSúŠÏ¾_;)šN²6™ë=ßÉïý¼í瀄\÷_Óøñu|Ó õ ‰C°gú´S‡e‹ŒL¹ÔTmÆ%]Äe¦|lñ.1«,‰þ{î{öá<§Ç_M~ƛƕíõE·/4D¢ù lƒ{Š(N ÃCŒ&rÓÃlšUÑó-¸bË+iî Œµõó0†ê™=ÕAÀè'|~jå´ͱï] ¡Z¦6bŸ(X½§h Fœ¼Çðò"‚ÀäSËr¼ƒgL~8$?œê‰Yû;îl÷[÷xÓÈ‘äÀáx²cpÆh—hÓ%?< ñ3.œyæHšÒ:‰νã~Æ$2ôL£ Š8Ñ Ms=Γ8´ˆ…Ï?Àó(‰–µý£íÝÑž'+‘—WÎd‘(zË…Ëžº“ô‹:Û %5[þ1܃%gѯ|g3  sEÁÚN“»I¢±)Oˆ£#®óù)TL¶ÅÖ‡†þ å†×%abJÃÄdj”Vβ=›mÝÙ?ÛÉÙEUè„|}0Ž+{KÂå Ô¼pácÃl.5²×YI¬ŠšuV‰ ½»nëï}âyâ„wÖMã35¼°€ì^ä§‘8ž…6¹¾S yãxš3Ã’é Êc¢¾}æ…§q¹*8”جç j^½@‰c²ÀÇ…}' Éõâl7uƒ;Fјøä3èúœu>½L3vä«h¬çõà¶È5N¼â‘&½ìã"ˆØ†‹øša“Ñ\^òþV)}þ¿]ƒg¤2ðÏÜ{¶°)æé¬7KÎhqùb¾¤zP†—jÃí HÉóLà(+(ðâïʇhÑ~¶Ç–¯k:ä“l™6ÑTgZ;@1œ>Ó`ÀĦTy3W‰ ˆ•ˆ¡¢êGáÃ!UÈÇͶ¡ÕZ2Òa  ¶Ä_žhûÃpf€ÙŽœ‘÷ªÐ1¨>[›‰_ ø¡&þä^Ý>::[ÂI;ãoÙãqq‹š ùxáéÅ 0Æ„ Ñi9ÀÀÃmß‚AºÕ5^ûÊ_s8W,œ}ˆ ‰Dø,†¾á„”m@¥•áxWiQ> 0uoɈ/Ⱦà Á$¢÷|]•Y2ä”Fð.2ÖV¸aI‘xÎõþɱßm¹íµ”EàáO‹>“B­}å³BR¦\,ÀÐh©*ÆLtKO[~˜•±Ò•ó1Ûóñœ•>S×> À;Ï«ò5ŸÄÑ'•~C…~àÀ¤ÉÄ!¡d¾yàåtmí"ÐH‰‘7læJ®‰Ë¤2ŸáÑ×]*c¤XS -#BK¹ó~ ^jŠc°%L§ðê‚·âh ntѼ Bå*ü—>É£?f›0ºàȃt\Š)ÖcíAºAf*R1*4æŽÛÒXòišÒÅ8ž{I0VXÊ%J_c+…7Í­ñI˜£äí5¹ç'ë3­Ë)¸ÛV´Ð ޵D`„4»%¤¶œJI0Ê5ó Xýß¾={²RÆ7›€T°íq )IS®®Y”+;hír?<{5X²@à{6ÎëÕcxÑÓB"´!­Øš‘â“%“á„#³ƒôõäÒC*©ÓL³ÔÒ!ÁÊ ôR§W’A;œôÁ3ç ICÈnV®ŒœRÂLƒ •y< ,:÷kßP늷>ÓÁ:uù=­7EœüN¥ÀÜ#mõz®“Â"u9"PAžºr§¸d¸ÄøÆCÞpYª‰´T§mhæêUoRNþ\±” ­aäio$0Îí×T­r®Nû.0 ŽJ·„£HÊÐrl'¹VqãT*«xUï%„7pò©žø!ÔHºer¦Êï¶"Ê®‰T–¢!x§Ÿí$BmÁ%í#ÂÎ#öOuRH…s< \Â!Ì›)f°òý@åK‚Ÿ,<ÙNT|g8u©0Y7ño?ÈFJÒ¾h¥!î‹1&Z‘llC2%¿ mØh’¿Vz$åGÀÕJ+('þ=;xÔv|Õ2>Ù%»ÈŽ™z“]Ó/Òã[ôÉkŸ-q2œeO3øòŒ0é-¸å‹,Eö‡ñÙQݹFŽœÚ´5òHﮑa®ú ƒŒ/MòVú lÏKìÛPPÍ=^1[ rÖ¹ÌHkSG\¼û“‘Sá†@ÀH#a˜l1Ï ~`ëĽ^¸Á«ÙqE™\\ãÎb„B{ÃN«óT³ÂpÓë˜+ÐD½´z´YeÇlugŠè3‚ ü—ÔWB &Ú%MpÚ!;;Jw`tÜñ7ªT‡)-5UôÛ¹\˜àž ZBD’à4÷¡ËT wgM0"d/E’ái8¶üÉ.¼¶Éï!:5¿R‘Ü5=× ð‡M«W OØ?Á_ÿ¡c…^q3FþV†Yê#á€{ÿpTŒ­‹l½DÁ¼,%®ÙJÿd¼w·Ô )ù‡¸~߃xÀ[W= ý´€âÁ3ä¿ëÆRf… ãʘ5À.®sª<%+e˜2Ù6pœ8Ô½«áMQ-ý |¹øöÄàÞç-Ë”U¦‡Ôè·¨Ø<‰z’Ãð†MA)'OhTÎö˜#¿…šÃ„EpŒ•ÕÚÇ^Ö¸®oðÃâ)™Jüöö©.Žá³ïƒOÏ¡S‡½Wø’·]Ê€¹êüKŠï˜ÂJUj©ŸaÆ×(> endobj 2195 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [274.3107 461.3395 301.7634 473.2947] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.10) >> >> endobj 2196 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [329.6441 461.3395 341.5993 473.2947] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.10) >> >> endobj 2197 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5286 425.474 372.9813 437.4292] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.13) >> >> endobj 2198 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [399.7176 425.474 411.6728 437.4292] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.13) >> >> endobj 2199 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [244.4575 146.0704 259.1801 158.0256] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 2200 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [287.6775 146.0704 299.6326 158.0256] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 2201 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [251.6578 54.4142 258.6317 66.3693] /Subtype /Link /A << /S /GoTo /D (section.9) >> >> endobj 2202 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [285.9737 54.4142 302.9102 66.3693] /Subtype /Link /A << /S /GoTo /D (section.9) >> >> endobj 2194 0 obj << /D [2192 0 R /XYZ 64.9134 727.2935 null] >> endobj 66 0 obj << /D [2192 0 R /XYZ 64.9134 576.6432 null] >> endobj 70 0 obj << /D [2192 0 R /XYZ 64.9134 225.5086 null] >> endobj 2191 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2205 0 obj << /Length 3597 /Filter /FlateDecode >> stream xÚ­ZësÛÆÿ®¿‚_2¡¦æ÷À+3ýP·±ëL&rkeš™$`’Ѐ€–Õ¿¾û¸;È£•6͈Àa±···ûÛÇáåíÕW¯ŠU)ÊLe«Û»UfD)µYå:E‘ÈÕíʮ7Z¥²XëëL’dýûk¹~óýk×zýúûøâí?¯U±¾ùîæõõ/·ß^}s{%W üÉ™¯Ê„)³tµÝ_ývõÓ/Éjw•¬¾½JD^æ«G¸N„.‹tµ¿2©©ÑÚ´Wï®þánÇMÈòåézŠRj••Je4­fzÙkجp9ô÷Cµç4#ÿGxÐñ5]îêï&¸{¨ùzW¿?Þß׃¸ÞcÖ·n¼é€h ªZ·pqÜÕ;ÿ€Ú©‡±é‰µZ?"M4mËøb?ñõûë ’óMõs"uäÛ‰~vÌá=²|âë)” hH9à^€Î6RŠ2M)áñ¡iü›Vè¥ñ ¹´Á|òt rýذì’äÍÇ‘^²Ô•¥˜š= |KS´=Ò<^óRQZ¹¶ú¼¡Å}€¦?ŽíÓuaÖ/˜}ůÅ*’¾šê€=îulw#»QTc­ ²T?²å ô‡M¬Óîaß!¿'&{|pZ>Í´´´fbUµwvïý{ ¶ÐÚÎØt[k´K†×ö‘mç=³ÆÚ†:[X…t¸€æƒ×ûfÛ“½íjAjØ(ð¯$Ë@àMÊjãöº€§<J˜ÓtÖŠòŒTã¬"¸¿ " ›=Ž¡÷µO<´íýPÓÖ<Æf œÆz⋵”Ã’kÚÝ&Ø? õ®qÛ –0ZÉPÊ3miߥÿ÷VP¿I{¦yl`ÈŠ0¯a.b!oQˆ¾íïÎqɳb­Uüœ¤ 1s»æ Àúž™wþ·èØ¢úà-ÉOÎ'qyÝ= òÕ+¥¨“E&d†xIbÝÚ-S…x»ªŒr4(ÔhQÅz´^kaÌ¡_ðí¡º·*…â8ó‰0I ö¡4qÂØúÍG”}ÞÜúktåtݺµYÃ<ŽÎ0ɆêÀÇ̺sÄŸÔè¶j[öÙSE”…È$˜./rÿtŒTn€ Ð«L*‘+-Ï£EG²,„#-¤†PbïO‚‘ç¸ YR4Zˆ¦ò\ä)Ä*OF©?œ‰X‘ä`aŸODÇñ9Ë\( ¬ Aÿà¼çæT ñ×j:@T4×5UÞ[â.`öxâhøºÃ?àÙé45eΜÊÅ!"¦Î`w”±d_G8mÀ)Dšš|‰w_\oR•²/ÑÕ¦çßs£’®()óU É$3åÞ1Ïq²<ß1™fB§ó¼LJæJdY‘}FÇçÌSQ$Y±‘MŠ´yqãh!-1Íãma˜y‰A#),v&”?ä” Ù,AB¬ë§Ú".M|ÓÜÅL)É ˜yÖ”J‘R9‹™eÕñoí¡or‰Œ†nÑ´ÛP0º.9µÁ’s¦á¤l¿¯:ô…$?I†eXÅw‡š"à_ñP¯„äÒd"/Lv–÷À&G;T![Äçõ0ûóärdÞIÂjX¦">ܽ†§\7˜õ[JÃ?B1'´¡÷÷„›j\¤Ðwý0§üõ`/GÎ9ÂZÒ‡íŒF}ÌRT‘O¦¿ÇRJíÃñÖà_™7FùcÇqצÄf™Sù$?Ž}2YžHËÿ85í(¶—°O ûtVÒ›tédÿöPI!‹Ï‰}ËËØçˆžÅ¾Ï&àŒ}ŸÐc_(bûèæâ.^Â7€;&+!{î¶í«2€¾4ÑçqÔå»&Oð%4øj˜ší‘¼‡PuP œ¤ìø‘ßå õ!dW·˜Câ•¿PñP0 ]Yy)ê»×0«§Ùð¢«Ølü¸4¡5E2ðEíPY²Eä›É¦Û³“EÐÒB€¯—ì/#î\¹?ÍbRßQµåqNp*’{òµWU`2ØTX†ÎE‘rŠEy7fðÛN€zë¡þXíêmC ÕÒ…±iÔŽ· ñ@ÚUÑà®î°¨Ù5®b(N¦»À¤ùÿ–ªªœkUríCƒA,Ã[›Ïðû`QÏÌ¥rÑŽ€‡°5ôH §g뿟ô=¬…aæ’åsZYK{‚p R}ä1ªƒéx"*Ûxf«Ì ½> ^ ) .À‚l~›]Í!½±Jõí‑µ´™s£Ì^t=#’¯é|Òú®}Š©­­'Hˆ,Ø o7÷øâ„(#áŹ÷æ…·=Æn|bõn›Ë_Pq–ëõMǤ®eGŒc7¤Cq&ÊEôgR·aV$¬•QDáv§¨¦~?2Ìb¡Žly×»àfÖÍRìöUç2E“«Â„Ëù>ylh|óÛ±çÅP6 ¿TJì@læÕ`9¢Øµ¸Ñ:Ù9'2_~üÓÓŸÿóå9N,²T¦¼0oÅü?\§àPæfÐêÎ64HYriAhµ¸m qÔ· ÷qöAÞNX9üŽ©õƒk RÄÅ5åÂ\ŒOìè}h¬¯`¼Ù͈‰ôä9l¹–¾Y†¤•ßÙÆ'¶(•m ¡¦¶‘Ž3‰oÇPùE  #3Xåê¤ÄUPç¯ïø±M‡ñ’hPÐí GâÊ”y¸©LIéüNCå»Çбz§ák âxY1‡Sä‚ÁÔåë÷M×ÂØ½@1`OV´*–S(ü¬¥þI£ÅÂïHÙ¾ ưsõƒë®ëű‹È¤jÑ»¯æFZwþf`­!ÉRõÔÝ"{©Àv™í\U’¹T%ET—‰Â@eþ<äZ»†7ÿ +Œ4S±©À»Ïg.2¡òÒÕ1?æ…z™—úoù_ÎgϤÈRãŠon‰G ´T¨¤(,U^œó‘F¤EXãÔNŸxm7x‘(Vv©ìPdûΡ†Ê08H¿=ŒaPhj–†f·°… ŦNER&{?ž/Öªgñ/"2¨: G ^F”¡¡ü—nK£FërðüÓÂfZ¤¥q6ô§ Â/ìlú“ËÿlwYªR$2SKC~G¹ƒ@ì »*¹Â#;ðÈçÎ}˜°LLIüžœaèȹPæuÕä±rµ„&bÎÇЧ$ÏDÖ>á«”¢ *+\C'R³äÖÚ,ÉÐØS$¥àóX¨þJ¢]¨’Ë ¥.“¹¼ºî”a4¦ÀÞ#óÃÜâôÄ…Ÿ0ákw´I§ØšØš{/äÙŹ„A»ÃUx~8A5Žó’Øm)øÄN>ùlçÄÄ£[<#ëÉxˆ¥qYœÉGâF厑I°òƒŽ”¯2ßcñ4Ÿ/ž Ù°NÑ&jÔÜ] µˆiÈïmŸE8­Éå20|¥#Î=].BƒkÂån­A¾f RÎ<Ç„°±£)à‰^)í0õ?ÚØñ7!ËóÆØ¢(µL癩ˆ¡ýá*jµ0Ëýx׿ -Èi, µ2vOábO.Øll%k,Ѩ۫½¦ŠÏü-Ÿ“´BéuÄ]ÕÒ·™ŽŒž@°k} B[ƒÞN÷U&K|)j"Ã(öp†GL—íy}´Çókç=­­w|$É#M©º?YM"Sq&â|ÆÑväˆNRÛ7×Ið!Æ<‰oyÛššGïXe¥ó½$Œ6/ìl¢¦E†˜#茕 ~ˆâro?+ÑëWTF Ë…FP¨Ù0rg7yjÃ\„ž¹<øÐLÁÉxcoi”ÿØÉÈÊeß'&ÄVõ0ô–kÌÛ£í)Ðy¾%µŸœT0‚!Æ"'ŸG1ýB€Æªª(NKû´°1À¤9ûŸµ7‡¶æÁ9+hæö<°Ãö\–­ÃŸÜVþ9ö}ß³­)*â ÔÉTÞ¢T¾âLÙƒ*6Í«"R&ÁÓÿ9Ú™4u,³àh×£Ðð wbR\wP#m„RÌ2{滃T˜Ìgît†Àö˜pes? EÞ‡ {«šzßL\W‚T.Ð.h¿ð>)âØ)lЮ>wˆ06CH³$]zàZ°E¬{>ŸòGeGªŒ‰é^Y¤PØ$È Èk¨þ0©ïeÀøÊ†·ÔK2éGñfWWÛà+ìÁøï´P€ñÀ™ã»'Ë4Rcd¥(ÒÜL›M×op¹»zƒˆ©¢ý'ß”¹Äˆ‘’Ôÿj{…‘rì&ñ|ê{õÇ¿W)`dŠeÀeåóç9`‘¾Ävßèðç´–fwr(W.{³ùUm3-zÕä>Vé"_õ-õ$DZqNÌuäi™ …³Q™+§`«â*<9‡dÐßû¤Ó•.’Ù1~NžaR-é ªPPÏç„çOÔ¾þ`ý'&y‚•ˆ<ËÁÍÛÛ77ßG–Y2Õ/K1®R¨Â7ƒ^½ùy)‘¥ÒçfK–P…*9¸UGN 7Åçü øáûˆå¹õã¾]šZXŒôAK’2‚É[ÃøÄ¹G½·gYõâÚ9¤O˜ÎèË-]Ò—[‰HþÜСƨõ(PCx|Œù÷ÕÀNendstream endobj 2204 0 obj << /Type /Page /Contents 2205 0 R /Resources 2203 0 R /MediaBox [0 0 612 792] /Parent 2176 0 R /Annots [ 2207 0 R 2208 0 R 2209 0 R 2210 0 R ] >> endobj 2207 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [311.4613 633.1466 333.9326 645.1017] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 2208 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2746 633.1466 373.2298 645.1017] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 2209 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [191.3006 138.55 213.7719 150.5051] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 2210 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [241.1139 138.55 253.0691 150.5051] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 2206 0 obj << /D [2204 0 R /XYZ 64.9134 727.2935 null] >> endobj 74 0 obj << /D [2204 0 R /XYZ 64.9134 469.3234 null] >> endobj 2203 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2213 0 obj << /Length 2707 /Filter /FlateDecode >> stream xÚÍY[oÛÈ~ׯÐÖ°3W’Ó¢N›t³@Rwãb[ìî#ÑQ‰ÔêÛýõ=—™áETœ,Š¢0`Q£™3ç~¾søêvòòM>u‰KU:½½›¦&qR›i¦E’çBNoW?Ítbæ )„˜Ý®ËùBk=ûËû¿óÃ;ÙÌ嬹ǯf¶l¶°u¶ƒ¥jSîaQ¤©©lþËí÷“×·9ð'Û‹Tš—Úér;ùuòÓ/bºšˆé÷‘d.›>À³H´Ëít;1V'ÖhV6““¿E‚‹@qÑ%ù Tª#a‚9¸ß™DÈ\“€‹EY/›U‰Löõ!µK¬4 ®À¸m¾PùlUÕ â=ë€Döë°Z²*~Vø¯rvÅisôüf¯ÌêÀ'VeŸ:PÌRO‚Edj!eâ¬U^ˆ}¹)Ÿ•¡½Å3Z ^äg·l#ÿÕŸŠc+Y]lé×oGAëÆ‹ÖÔHí‰7¢ìËUµ,Žþh+õ ÿ{ªÍ>\þ¥ÒJ/ín_ÕÇ;>NÑž06‘©N½¸oþúûëÛs­€ýµa×®8x#´&.W/£ý–=ó¢bHÚÃqOyG86LãO#rH+åL¸˜GÍéVî.{<ì~¨ŽëA•JR§²AûÔ©Ÿ7nè/ÅéqqW×§_ï45~*pêÇ -^û'ï=dôÖ{¢í ¯áêèï Ý£·Œ«ÿÎié[þ(N°„jˆ=«çpÿi‹ÿ?/åþk<}¹]-6Uý5é©| r‡´”EÙËb9‡¯kÏ+²xâ`&Cßy^·Aï3û¶¨Q9 |&í¶¾Èrß=+¡ k¢â?BÝÈD¤ºÅP? «l/™Ãõ¹Hl®ì€‘›ÿ #1!Ÿól».7»gy¡„\u-Tðæ…zÅnMÆ|ĬtüšúTîUSÿV>ÍÉ¡)‡ãµM=êôY/Z ,p>‰8Î ƒ'óéBô°PÉñæ·Ç~µÜцî=TáøÆëèëØ}ży‹ÛÏB Vïó\¦95xšÝ±j|º¨bL”ûAÝ®ý} [Ýc¨ŽøåižëYBb ÇIÁ˜ãÇ +êº9X*MÏ‚ÑÍ Ùœ0Ï-Tî­±.ïw›å¹ÕÀh*5¡4ì‘¡úÀñèsˆ6xuÛO*ÍfQa¥ÅÚï¤dˆd#[”¤X…‹0¡Fùêö—~nê^Ï÷„$¥:õ§Nî¼É^0Ϧ٠²—Í~_ƒ’ÔÌ´Gk²wÀgÁ;(-)y•piöÉ|a´Ý¢)ýÙS-cÉO d”Ûçm”Zéw¡U´0è^|…÷ÏØ@U¸a`)m=Æ”:‘Öɘ¦.]cóËÎÀùQsäÿt†óÁ‡¨21iªûÊq®s1ëÍ]ù€‹kA§¯°Jf¤¸ˆ|!qIá 'Øô9¥ÄMµhºæüû­ÂJ× /`ÍI®‰•?²¤L¼û²Î«1`0ûw#싎ã-9â=i–£Òh­ ¨~adš8-\¿¢p9ø¬t,þ³  ©;ìZ²>Nœp<¨­¶»ß>”ÚáËY@ù¬ì@‹‰SðÉ´u̲Ûêx,Wˆƒ1ÔŒñ©^ù«cªg͵©^GA°¿jöÛâØ.>ív]ó-¸%f%-2F:"gÆD6u=Ð/gC\µâóØÄØÄ8Á49âÅ9x±Ö.÷r^égz&2s¶—B2žÔl,‹e×~ž[n[Î/†úÍB #€@$Be¡‘‰€$7P (¯Ôrã׋鎺Aªòn¯þpõr¤£T.Élfº˜s_«ñM‚©ôU>Ž7ÜÑe;VI4>ëà‘WߌF;”q¶¼¿~÷zŒê•—Ï9öõooÿ9÷áìpH  =>œÍûh¦Ç?pi5ÝNàˆFÛð÷Á¸/R\tIžÏû €H—®½™üºÿ±‰ŠHœŠèýçCôêÜSò$×6hó:…óKF剰v€\ÿ»Ê ‘äFÚNÎV.c‡ó*«U=ÿ§Ñèƒ|žýR¹¼Ï} ¿§ª¤$,­úóJuÌG!Yß5ŒXÊåI견oªÞ€L)ä@äÂs[þz*9©Tņ¢8>m¾V ÓF¤}t5hdSžòR v°ÚâØÝéH¡Ù!Œtð_É`¿CÔ}S¼ábœ*!ð¢qÞ×Ó¤# ¬vŒ `•g ~A¥6ÞËydy©©Ñ™„0Œ™âsø[ÅÖ'Ð>CÞЭÑ6z€Ê2Fœ ‹}¡‘4œÃ_¨ŇÁp.1 ¨Ãœ=W·]ÂåtGVäº}nz Î#M؈?ËèPèÐ#:m§*ðÍv¦Ú>׊ÆwŒœìlؘ†~Ú"¢ r••ÿlgXÔ1m˜ 7ÔÆO´xé¥Ò,øðŽë‘¡/<“QCž³74Tó?ÒÙ³þELqà™ôßÇDµ §´¯¿}ú㿯ÆÂçY®^eNÿ9»Ú·{Uðendstream endobj 2212 0 obj << /Type /Page /Contents 2213 0 R /Resources 2211 0 R /MediaBox [0 0 612 792] /Parent 2176 0 R >> endobj 2214 0 obj << /D [2212 0 R /XYZ 64.9134 727.2935 null] >> endobj 2211 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2217 0 obj << /Length 147 /Filter /FlateDecode >> stream xÚEŒ± Â0@÷ûŠ“¡ñ.—¤—UÐb‘Vm:•N';8ùûDä-7¼}ÝQ1»œ|ÂòÀ\f X 9Ub,Ëd¼ÚJ|d5b+&"3–Í©k¶.bšnüÊåf½šþÜ7v.- 0Òÿ¿>¹SÄû /˜fÂ[ Wçß›““¬WQ\ "¿ò„®ð"%endstream endobj 2216 0 obj << /Type /Page /Contents 2217 0 R /Resources 2215 0 R /MediaBox [0 0 612 792] /Parent 2176 0 R >> endobj 2218 0 obj << /D [2216 0 R /XYZ 64.9134 727.2935 null] >> endobj 2215 0 obj << /Font << /F8 1548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2222 0 obj << /Length 3160 /Filter /FlateDecode >> stream xڥˎÛFò>_!ä° ‹Ã~ðµ7;‰vÎz‚l8G"B‘ Iy<ûõ[¯n’å5 ’ÕÝÕõ®êêyópwÿ6[åažèdõð´Š£,´¹]¥& ³,R«‡ÝÇ@çëÏ¿Üýüp§Vü©UbÃ\˜¦˜žÄ«íñîÏ»Ÿ£Õî.Zýr…iž®žá= MžÅ«ãM[c¤¾ûp÷«G¸q7S”o<•­” M4èæ%¹­¶†´ëR:~‚gP>ž÷øÜWøÛì‘vÆ¢Â<Ž K´Ú˜8L“,åõ!NU‚å]³6*ÔµëÑÁî¼[Û0¶©ÈðdmL¸åz£uüãß¿ñËûn +ëvÏŸ; û}I;0ð´¦Ít|©vðNc=UÍ"èŽÅP۶ͶìšjMhpo…RC×Ö ü©˜ð?ówûäVñn†˜ˆ}WA6ÊG^.i! ß^¢À÷¶ÒŒÉƒGX’!Jc£)?×5ü¾0Ñô¤¦OoepÔŸëÁO“Š£"žŠa"Dö)Š#AH@$:Ѱ?lÿ2”–QãE +”Ì{»Î H•·kÖˆ¾ú²Iß¶G\B©jG–lj2áy-®­_xœ”@«‹ºîïiϯˆaèçBcÏ*º%m@QÅÖsû `ÛòXŪѼ¨yà‘è 8j±XÃ×Ü ¹¢•=>mÐXõ °žÄ6ø­ñ¡™šéÆ©~à5 w¨†9ÊíÝ’*û 'ׂa²=ï‡Â+ÝIÅÅl#Ý$T·šíqÁÀʯ„q{Påd6HAÇÏ¡å'ÛÖ0ù8¡ô^6'2„V„‰ŸnUÛ8;O)¯/·x’Ý2ðTt²º‘ü–¼rîNV„¦Šä7'lÆù¨q/çÞéJX]O…f¸«¶ŠÎ’>Ÿì@°ò€ø†o•=Ïç8/W¦àâ 8nvËVo{â/†&Èê ÷~vØ%ÞÀûÈÖt Š$ ¼«ƒc ÂH5Õ€… ýàlß‘ü­8Å.›¢´U,â…—OP$£ŽGG<‹ p‡5RÏW„XŒXD)ÅX`Œ°‹ ã4^Ô?¼B(ê¹o+† Š-ÊŽô¼yÁ}ú†1ŒÛ%¤•²+Iž´ïüq  ã«°¼; BÂ? 2¹®„Œ²dX@ Ê"¼•Gó0³&™äQ-y”•ƒ»¥ds, КøÜÑX‚¢58fñ³’wÇïÊ·ð|Sƒ8a®Ak'Ú™dˆš‡Ð¡ñ9IÞˆ‚IåÈÙ'‘C¹ìæ…S ~ôÕñT Ïk (˜Ÿ0Ð:žwp®O‡‘nŸÏ3Ž—mÍðÑÜh%À4Í@"èÕý’.§¶cMÆÑž.ïq‚ya DÌ¥ðó€IƒRRÆ¡åù4• (ÐöDùœvjx=‰¼ ¨'Û¼Gÿ¹{ÆÕ¿ôœêŽB&yÎï{d0΂ï~ü€’;ËöïIó #Lœ‰ ~EíHáÔ³¼b_¡Ñ&I@4/W(ɯÑêÏá’±»¥êºŒµi4æ|—ªÉREÎvä‚¿{'©Rr""yt‚†òÄo“R‚Ý^7¼ˆ5Av,KµŒƒT’L¨@a•.W"mŒ#Ö“Pc²<´i–ƒ¸Ä­⑎Â\++sÐndË-)mK1U*q¬¬¨à%'ÜÓP"CÉ$§—E\<;(ãäªççX:Éa`å×méΈ¨û^Hý‡3èP X}`äí4žax 2¸$ ³D; E5;2CùÈÁ I|ä !7 ¢4Tyâýx‹”,55lFéÜ—q? Í I7±,]û|¯®Ñ‚¤™MF¼¶ƒ¤Ê,HB;Ke­‰µb/\Ùt$Eªå|Ô ”Fóù6öÕXÜ4Ž ï‚«q’&ÀÁ S5wýc+ù Bƒo¥à¡ã Àì¥",õ…̧#‚&Íe1ä“^a p)sÔ· Wø*{¶Þíü—%ðôzieõ‡pi-¸glÂHåÖ§»a{¸7 Æ…‘IôM-¨EP!ÇÑÐÆq2·ë“hU‰V¥ØšÆ*¬MNcm5­êe” Ïñt¤.\<Ë•Ö=ŽQ¤4;<Ô›²u @)Î\ƒÒ¾xòG}œ;"j~|%± —¢±®Ç†%‡A8£áIŒ“—¿_¶_U îële dä±Í¯û¯Ôcå¬Ês½:Þi«Â$S“@æ XˆìiÚOãÛ¸x]¸äÕ­˜£2¡X°Òažeb[ý {f††ý í2îN€ûwG½ú©\«6)Ä–,¯ôÿ}”„NÀeé_ÞÆ+ìT…±a*ß\v×]óZ' ‹3r„Ÿ ¶4°ÙŠ´Îw‚ŸÂOಟ´Ž¨‡‡]˜„{n:Á"‡œÕÌb¾¶¡Õ°»ëi#º…NAnÈbçý!7!_7‚¹ë¦œÄÈžÆû¾Ïظ®jnôoi)Gœ68 ×ÍkV#§{|ŸEtZîhqa?®J)ŠF 5©ÔE–}>Tµ@‘æ"+RÈ´?”çå‘+ܢ˄Š®—}5n±’«O>Ç,x öJV\óŠ£³ìÅd¡f޳F®ž·CvgL°l±Iàv9^5@*½/U.PBÕ)µ ˆ©€•Þ¼ÏØÐitÙC9ïî{Šuês¢ãZ§Êõ!på ûº³ã hüÑ“R[ •ã¾A1°BP±P›`‰f&ìØ,ú~ìm«‚º8™êò…æB~Ü·$¯ÞÝL˜Ö)ø~]óhrâ! EÁ‡Y7™pø¸šK‰…€s¹„Ð})/à†të×SŸ 7ù9'Ëq°ì^ák>–nž>q>1ÄjžH`Î-?fÌ¥fRðãŒüVºž±Áx ëo#èâ‡êmÃ-‹*,CîÿòY—­eÁ‚Uà2ÃmŽHÄ$*¡Â¹ þÞ.»ùæ÷¤çÎ'Q›‹~u»nC3^†ÇQðŸsÓpÃB5Mf@ìrAÞžè~ÔïšÌÞ•£&¯~_fŠ.@ï£Å#cnŒ;Š[ìsĉ e=ËÕ+àÚˆDEn†O_^ËWpS…ùZÅëâÝh/×M„γ7¾N67¼á‚@6ŽÓ6P&Fü¯ ØfÝ/É›SJ©oÈÅ5˜Lª—åÇ™È%ÅS( $U·ã’$ óŒ÷âÀ 7q~íh¸ûŠþDM!»ö>FÃ|L–œ Òów\ZÒCæç5\5|ê\™¿óÍì©pßaÈÊ"Žl{”Úº GŽS†€'ʼn]Ùõy ¹ªŽ?JA„L=QÉrœ[N+øÖü¢œ€YFž Œfw@Üêgøìß:dcaÆßiãGÁ*E©êÂ]×ãÈ3öªä|ù?azÏÊendstream endobj 2221 0 obj << /Type /Page /Contents 2222 0 R /Resources 2220 0 R /MediaBox [0 0 612 792] /Parent 2229 0 R /Annots [ 2224 0 R 2225 0 R 2226 0 R 2227 0 R 2228 0 R ] >> endobj 2219 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./debug-box.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2230 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 283.00000000 88.00000000] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R4 2231 0 R >>/Font << /R9 2232 0 R >> >> /Length 2233 0 R /Filter /FlateDecode >> stream xœTÁNÃ0 ½ç+|¤…Äi–äŠÄ•8O¥cEí`c|>v’Š´hÒêØ~/yql%5(þåo3ˆƒ¸¼­àñUhèD%-¼ ­”chåØJÁ±wâ@ëˆÊŸf€«šÐÒC½‰Tƒ6(=‚uÒ@=ˆ³—cûÐ5›S{^?‰ënÄ í{/8{ OÛô½™˜lìD@.xÊ‹Çr1k$‹œabR*Ãö…«lÄM(îâ8éÆp/¶™p6b—·™'­2™­³™7y#1Z_MÌÄ"×,©-H>ÕÎØ$'‚—€–i¶ÎA¥ò¸J²7ú sUa]Z ¿É`XIð©öwú1Z( ø‡J”tÖ‘y­Ò*q:?®Xçt5â¾)çÆä.’Y0Nø¿\ƬS”™_/ç Û@[Ì5ˆ9!ycP9=1¸øLÓ»(HŠ6øs“1¡lƒ Ý¢‰‰ÔE&äqIÓò™'%•w õƒ8kß»;Vh´´ÁÂJÉ#ͦï9¢¥ÞÃÊXšìØnº>A!L ÐÈÕ´/§îy_Ìâµ8lendstream endobj 2230 0 obj << /Producer (GNU Ghostscript 6.52) >> endobj 2231 0 obj << /Type /ExtGState /Name /R4 /TR /Identity /OPM 1 /SM 0.02 >> endobj 2232 0 obj << /Subtype /Type1 /BaseFont /Times-Roman /Type /Font /Name /R9 >> endobj 2233 0 obj 427 endobj 2224 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [506.9443 459.4854 513.9181 467.8983] /Subtype /Link /A << /S /GoTo /D (cite.Clock) >> >> endobj 2225 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [315.8343 397.2189 338.3056 409.1741] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.4) >> >> endobj 2226 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.3801 397.2189 377.3353 409.1741] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.4) >> >> endobj 2227 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 385.2637 516.6856 397.2189] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.4) >> >> endobj 2228 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [86.9453 373.3086 98.9005 385.2637] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.4) >> >> endobj 2223 0 obj << /D [2221 0 R /XYZ 64.9134 727.2935 null] >> endobj 78 0 obj << /D [2221 0 R /XYZ 64.9134 702.3869 null] >> endobj 82 0 obj << /D [2221 0 R /XYZ 64.9134 679.769 null] >> endobj 86 0 obj << /D [2221 0 R /XYZ 64.9134 538.7022 null] >> endobj 90 0 obj << /D [2221 0 R /XYZ 64.9134 172.8534 null] >> endobj 94 0 obj << /D [2221 0 R /XYZ 64.9134 140.6824 null] >> endobj 2220 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F22 1606 0 R /F32 2060 0 R /F21 1557 0 R >> /XObject << /Im2 2219 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2237 0 obj << /Length 3094 /Filter /FlateDecode >> stream xÚÅZIsãÆ¾ëWð&bzÁæÛر]vÅ®¤F)&>@$$¢B4Z£Ÿ·u A‹»’ Ñh¼ÞÞú½×üòáîÝ7ù¢PEjÒÅÃÓ"uªÐÖ-2«<õâaó1²ñòç‡ï6K”NÒdS¯[®tÇÑß¾^êèKx‰þõí·ÐüîÇo‘üîë‡; ¤ñB³šT¹fXïï~¹ûøs¼ØÜÅ‹ïïb•ÙâÚ±²Ež,öw.±*qÖúžÝ݇»† W~ÆÕxÊ/¯&-ŒrÆYÚw¿…MVË•IM´©OÏÏU‹o:ª;îm@¡–+gtôÍ2wQ#žòß±Nר¨—ÒƒäÔóÊdmUvøJóPë>dIô‚íí0Œ¨Ï÷o°%$8߬lýPãO°?íqHÙ㮚]7‡uÕ°ëðÌ]=´ý`ø¼4yÔ·ÍŽ/VZ«"I 1 –K$€m[›Á{×Êïù“$¼üúˆGŒ€>‹>yš†hþŒ‡Àç¡é¹ÑV}I»'ÊÍ2Ìø¡¹GŠ<ªŸð™K\p¿òÄyT®ûú×e’ ª¬y8›`_op¡¼6Oü,ùA"löG 8õÀÈF†ã¹‘¯s\‚Á¬`]îvÜê${÷1#Mt â6vb:¤vïb¦Ë§d Ì,d ÖË™´QyŒ°oËuõöLĉ¢`Nà&ñmóÜ–{~G G‚ò©Gk sˆ^b»fE©Úpì¹÷?ØY½òKWýrª@Ýø y6³yc­Òq^ȶ¾êw«¯.÷&­ ëN B("YnІ;l@ïò¨éjÐðËáPNňMl›Y¸P.3o±ßÄàIF‚¼å¤Ò6˜ë>¨—‰Ž-™lË =ðtÌ}ÖmÒ"Û)ÈT?Å ,("| H¢'Ü•»Jͱ$ÍTn#Æ‚{¥ 'y&Î)S’©,DÎóÅrº,ûæ-Á^\–EâO|³ÃîÞ[y»'”;&¨OtrÏ ì+Åœú³IÖ'trmåy€}?ñ#Ú,l_$¿ f,ÃI!õ™îC«õ«QšùÊz¢83.ÈR IѪ/uO5”}‘Öˆ ¼àeÏäeË`‰WL±£¹Ë.Œñ·}'sÐ*GvI:ZñÛXED76øp7q²÷àeušEôH#y#C|©.ñTO@Ý®¹œCµ-n·žCsÕNçê^|¼í…«ÝÈJ„³¢¡˜9köRFûã18x‡x^r­Œ5`àxm\bÂ' ^4ÌàœœÍ?ƒ.2ßjþ¹Üïëçmÿ¿åþï²—|Šã3•‡˜ó§q•ÍB¬.åy:Pˆ tÛqÐ…ãÈ ÐÁçuq~VçkN!ó­&XBæ ÈF^â¿Ø—šXÏè–¨ˆ‡äʰOª¬½øùeò²ó~¦X×RúŠç“l$!(Õsï† +YK“Šã“®oŽ"=Ÿ’ÒÎ>UkŸ6 µoxÚN¡Ù0 vÕÎ¡ÖØ£Õ)\µW?—K_WOcð˜ WŸ&—Z`’„Qî<È7iŒ™ú–¿<ÖCodÜ®½L° ÑÖòN¥l0ök_ù3¡Ô’³ŸzrÀ^dÒžƒOùºmiÁç­¯˜\¬©nå}(ÜQ:Æ´h²©c[=UmùÈuΙ‚%IÌ€e”áÁºg"*‘³ãjJÓ§Iå‘:8αŠs«èúš¿³Ì›PŒ¨×\³ë>Læw8à è<ÇþÁÞœÔT‚µ»QJàæê@ÐVe¨ Ž—nFü`ð{Á¾aŠ$Éß:ÊI¨Ã×ë5l8ÙZÒBxI‡d¿”8û Ü$ÀÐ\º·€ö©ž+¸pôU”ãë»™Íä*ÓÉP«Œç+7‰²ÄÂLGØz^*l^Y]d 㥋<ûÃÅ’0ãj<åe¹Ä±rI>,Lpµ9ljtUïì[5M.2#3aêEu(÷"ÏÚ“du6·€²s;UŒ—mu9€U%?#5l4Õáæ'ž¹ùâ¡0áopÄ5ÌÈö¤]ìS„¿^ü«vÅ-rvÆ‹¿ÌðMÛ3¶óû_3öåANÏ5q°ËáRBWd`æTã@ŽøYσ÷‡ëSÛÆŽ¾†eb@‰Éòi(ÛsÀÛ E£ßBof7ŽÿìšÌ48š\êêÐ(±„({fÊQùuuYw…'%ïf„`Ÿ]uè¤Iwp¥L?ŠŒ2xÀ­DÜ&yX3€h¶øª¸ÜMáßd‘'¾¨JPo€97Ô{ÁÔ©ÀÈìñZÏ×x2È(‡Š—th]®á£›å¾¤|]‰¤x…f†2<´sxÕi_uÜEuþád4\Ñ«t‘+gCuÔe&yÖ*wÏ1²ë83oO9kQ$¡8)ð_|¤¡v+L"AåN¼MjTjo#E¤³ Sö!ŒqêŠÛ²óWÆøÞÓ†»`ì£ZÖnÇ÷½µÏÓG7ËÝ\vÉyálñûSŒžyZ0¾7÷J©œ¯1åáæP²6œ~ZT¸¢iþ< h}øç·]Egœ¤.Ká^†Êg³% Ø[¢?£Fñc¹¿5Kü죖 9|“8X÷¼l›Nš‡Pà¬Âã ¤Ð9D¿°½+GpÊ83 ñ x žÅ{›s´À¿‘¨ëè‹[.øo‚|¹VY–†›‘=•§~ —Ígwó^JÅhgŒÞ…øÉ§LWF’îó¿îDX!ÿ÷ŧ#Ê03ý/’Aó¦endstream endobj 2236 0 obj << /Type /Page /Contents 2237 0 R /Resources 2235 0 R /MediaBox [0 0 612 792] /Parent 2229 0 R /Annots [ 2239 0 R 2240 0 R 2241 0 R 2242 0 R 2243 0 R 2244 0 R ] >> endobj 2239 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [444.033 569.3857 458.7556 581.3408] /Subtype /Link /A << /S /GoTo /D (subsection.4.6) >> >> endobj 2240 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [487.3227 569.3857 499.2779 581.3408] /Subtype /Link /A << /S /GoTo /D (subsection.4.6) >> >> endobj 2241 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [328.9238 557.4305 343.6464 569.3857] /Subtype /Link /A << /S /GoTo /D (subsection.4.5) >> >> endobj 2242 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.9883 557.4305 382.9435 569.3857] /Subtype /Link /A << /S /GoTo /D (subsection.4.5) >> >> endobj 2243 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [404.8648 229.7566 419.5874 241.7118] /Subtype /Link /A << /S /GoTo /D (subsection.4.5) >> >> endobj 2244 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [445.6041 229.7566 457.5593 241.7118] /Subtype /Link /A << /S /GoTo /D (subsection.4.5) >> >> endobj 2238 0 obj << /D [2236 0 R /XYZ 64.9134 727.2935 null] >> endobj 98 0 obj << /D [2236 0 R /XYZ 64.9134 544.486 null] >> endobj 102 0 obj << /D [2236 0 R /XYZ 64.9134 321.4267 null] >> endobj 2235 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2247 0 obj << /Length 2748 /Filter /FlateDecode >> stream xÚ­Yݓ۶¿¿Bº©ã‹ééL§©ÝN2O_'IxOâŒ$Ê$Õóý÷ÝÅ.@òˆ³SÇ/"‹Å~üöƒßÝݼþg±*E™ë|u÷°Ê­(•±+g¤( ©Vw»_×VØÛ’R®ßÖ÷×[µÞï›óþvcŒYŸjxµî{ü­öuûûÝ+kÈ ™¯¤ßoÎÞ¼»»Q0#WjÞüú»\ínäê‡)\éV0–”E¶:ÝØ hZcÂÌñæÃÍ¿#ÁM ¸™’ü¯§uâ~y©…ÕÖxþÎmyªŽÇ×ùœ $ËDŽëè&]}joµ[ÿ÷Vk¸,ˆÀ®a'É¢¿àôÓær»5msÆ¿CÿÆËd(m´¤õ¿hkiõ-Í ‘bÝ’dúý±¦5üii¸ƒ¡WÀoRYŸyɶ=ã«fhÚ3<«À .%&avCÿf¼ ’ÀLf2°LÒY]`ýð\§J:a ã@ÆVäÒäK¥zÅ‘VUYjЪÊ:ü¦ÓHq3%¹TªRRd0W!›(ÿßd&ÿÕVÇW·›LgëŸÚnàá]ÝðV-µ®€’Ök½÷"PER¯+z¤D Ói w°ž@é@jùKWïP»[ï@Ï>´]BZâXif /µd]KQjey¸ÝX°‡_à„C}&C´°Ä©\ƒ€•(³Lû•‘)eF³º‡Áu¿¯;œW`þÕÍÿàM_‘,TZj. 0e¼f¼Æÿ<ôÛŽO¼íÐâªG>c8Ô|ùBë%ëåÕTCàtGîÛp8R ÉHá¡=â9D>ø•G²å%Éd!aÕÕäIH¢Cè~õî i„?µ$QZ€%S:#‚Õn©8ɹ6ü]‡ëÄ‘ùš0º"¯?Ÿ!ä±ÍKãQZ‰BÿŸÆ³¼ÏFeZ8™éo}%6’ŽÂ_-ŠöKWÓ"w¥âƒÐÿòjbr£þÔÕ~´ÇvO÷QÎó8CiïG Jp duPXÝz¡ÕlîŠÐ<\¤XEgÆ›Àdf²ÕÆ”¢° ‰VàŒå Ðï­§vÝãsßà¯w—­Oþ¸Æt/Ù×€$ÁX›yâ¿Üe ól}^ÙÑç"¦ôÛð¦¹÷:¯w¸ÂGâÖ†@†f4pÀÃS哿z|Bøkú zt…ëŸn#- À¥K˜ñã dÃ5ˆŽ~Ĩ„Ã>04\Ñ•‹«ÕúîPóÉUüûჷæ!ûNscÔïÉ⟎tœøc8”gf¥Ìó`¡Dæ…³÷ôøqŒs ÃˬÆWIÁÔæÒ-pbФ‡*¤EK‹:¡ åæÞô!åJyi &åU &ˆvöË -óF²k¶ÕÐvo@!* øoÿ·‘ìב÷vG„hûöŠšíêqQƘ–-Ef¤»á¢Y ÂÁ( ‚ïŸNh÷ÄSì¿`øÎ’q:Ô©Û*†ßšÒ£ aœ3KÓÔŽ€¦‰É*?|+ÊÏrR]òUÞ'užev¦ó1/Â1É߇ÙÖ£Ä6ø¿“”E\½oEE¼ñiÁ!™s¤FQò㕉Ÿ®'¤ÂÔÑ‹mÅ'ð4ïŽâÜÑÛ¡ååm×ÕGŸµ=çèª-M=|Äi“çB«â™Ô16ÆJNY¬ d9¤MËL«ƒ‰vCàëÍS©pÙ$Sh~ŽÖ¹ùˆÈ‹ø`ØD™M÷Ä›¼¨¦j`4ƒWí9¥z ³ÎÝÿ˜H®!j@˜(OBÉ6Ï»úý‹šŠjf>”5S À™.@ûÅ»&)ŒËZÁ~ åŒËE‚˜'wŸ±*ØnÖíIo×tõÖ Õ"×AÚ=`OO³´ÒŒyµ!eƒY,H¸Esuv¶ÔÓCFºx§˜7ÛIvŽSæ–Gb}“R“Ñ…(òìó)S.¤ ¡¢§­Þ†¼9&fÖs…,®òVÙÄ+«Ža"Oiò¹½– ‰ I&lraBªµÅjû ÉÝ«T ]ý©¾šHàä¡j^äÄüQ"Pýµßà:ÛúâÑqAÉ:Pa ÷/ƒÒ¢È²òó¥Bº›ymiXñ0˜ØlŒŠ8ÏfÏÊ %_Ér4|´q˜Ð/5>ð°–·žûËèÛ@p`dÕÚˆÂ=+o!b/œÉf%ÁM?T4%Nø¦¢4[|wàõÀ¤G/Ó€¸£×›c +);íB|ìš¡~ÞC1Ò (ÏíʸR(€Ñ?ÝC‰7S’ËŠ‘NdY‘'û¦îN¯ÍÒL’7IWeØ3²y0ª×v¨whCw­Ó]—Ü c† ªñT DŒeשúô\€Ö)ál®¾#Å/@RbkæÜcFX›C°plðÍ·I//ó‰ë.%¶±’7õ,‹h/Ÿ¹ƒ‚çS8ÜR…“#²"ÇäAå€Ü{î’”9áÄÆ·þÞáàÇãS 9 +2;½o“Ñ^ޏá `Òiò±zl’)Eóá=Ðwrøtîy,€§’ôôõ¿óYM2Jà€ÚcÖ¹ÞÑDLë¦] fn© ¨b@X ÜyÒð×Tn«dÒü]è˜ÇL¢(!oŸeBÚlñ,fîXW±}äcÕ¼ÍÅn†,}ÿ@ÛF®³ir„;逌’w$¨w¯¨½;„ZIøcŸ&Å êqJ®¥~ÄF9#,Àô\À_Ö´1£ñšÀ`©a˜Ü¶]c†]s/e²J×OuÌ"§ŒI ¾ÈáÛ´ùv´? c£4Ù"“©ÖX–lù’ÃåS{ûí°™@Â0ø<ŽUº¿kb}*¢\ù6;¼>†i¯{š›fÐð·ágºuåù &d:cƒyÎØ`4o—#’ò¡÷dLïÀ4?ØåŸAl4)•†A]¬¿O VNå‰ÕIªžJ¡B÷B-·ïap¢|ï‰VxI$Wgn«šÂ¬+ê?`õÝ+TÔ±F¦©î|×Í‘í0»P^Aupõçwwÿùù}2š¬zlü—ÄÀQÌWë ÍòµÚx/ºŒ¡í¾«NÌß?þFŸkqSËÀš¨©òb̶]<Ïš‚ùÁÑœ¬)é»'¾õœàLptjÓ„Ü,ö4Aš¼ (<Ï«—Oú¸pþÕ<à®.½xñ­Í/:oÛ+Lh[×»T»vwål…±ç3Ø…ÙÔÅÏ?ï²}rmCFÅ(ÆŸ}é[ã‘ ü±7}‘³â5³¦9ñ5bblŒ?€…Ï×—®=]Âç—ùÉcŒ7Ç"繌¦'{Å6ÇaÓœÃ7/[ìÓ¦£Ì„se(|ˆ{Hz·Kcô$£ì¹ŒA²Loõ+>—²&`ÉÈÛ‚vÞU¡²óQj‚¤4ƒ `ÿq&Ûóx¿ˆÕUWm‡iÄó]üóþM(Oþ·fendstream endobj 2246 0 obj << /Type /Page /Contents 2247 0 R /Resources 2245 0 R /MediaBox [0 0 612 792] /Parent 2229 0 R /Annots [ 2249 0 R 2250 0 R 2251 0 R 2252 0 R 2253 0 R 2254 0 R ] >> endobj 2249 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [135.5539 363.7056 163.0066 375.6608] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2250 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [189.9646 363.7056 201.9198 375.6608] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2251 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [199.8726 351.7505 214.5952 363.7056] /Subtype /Link /A << /S /GoTo /D (subsection.4.5) >> >> endobj 2252 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [243.1941 351.7505 255.1493 363.7056] /Subtype /Link /A << /S /GoTo /D (subsection.4.5) >> >> endobj 2253 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [236.7688 209.8313 259.2402 221.7865] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.2) >> >> endobj 2254 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [286.5821 209.8313 298.5373 221.7865] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.2) >> >> endobj 2248 0 obj << /D [2246 0 R /XYZ 64.9134 727.2935 null] >> endobj 106 0 obj << /D [2246 0 R /XYZ 64.9134 545.0395 null] >> endobj 110 0 obj << /D [2246 0 R /XYZ 64.9134 315.4491 null] >> endobj 2245 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F14 2010 0 R /F18 1536 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2257 0 obj << /Length 4581 /Filter /FlateDecode >> stream xÚÕ]Y“ã¶~Ÿ_1Ú$Ââ$ÈTR‰;[v%ŽË¶8w†µ:&:<žŸnx€Z{±®èeD‘`ëØºÑÝà|zwóúïåmEª‚·woo I*&ä­””%e·wëï‚¿úñîË[¡aªP·Ôœ•¯–ŒRºøìóWlñ)|Y|ûæ ~ñÕl~óùÝ ƒ¦ô–©¼ ² «íÍo¾ÿ‘Þ®oèí—7”èJß>Ã1%¢*ÕíöF*A”ŸÙÜ|sóïN ½]rI-ÙX”ine±ªâF#TT…?3’Å©”âiYö> ²Ü¡¿£/jé;º,* ?)ŒÈO‡ƒ¬áe¥n‹J‚U¥οí·8†Ûzc¸Ž ãœÐª‚¡ŒÖNä{°k~>Ù#hÁK|DÐ!–—%E/öš¡J<#úöˆ”’‹ƒÿz…m›ušXÙÆýZˆNc¡iuX¬Ãs8£¥‰ ËF¬!À!±4åzð];ìl#fÍa Ìa´\Aü ÿ=س§Ç@6Ç£æ@²Ã<õÞz®ÙêŒúðBªÅ)¢[WKU”‹¯ööìÖ´;ëwû3~GÊn6S»7,l,Ñ Ù Ùì³§µà‹³›GPŽmë§·ßXÛgAžpž9 £~Ló4ÛS¼žRðS Î.ð”iŸÖE“æi$,O‡‡>œÐ°žì|ØwÞP’­ÙFlCØ#­ï@Ï µx‹Úz°Ç°–„O¹h « ƒ÷Æy[[Ó±ÛXû¹Å¿÷¦Ms°êÝÚLšZüCd<¾Ég¿à2÷-§Û“gÛ:ãxø¥vÑ<·ØCëž¾21_,°¸›µEaüWº¨Ã¤€ÓY’ÂÙíG¡°Ô¤äô—8þŽ…¡×„I~ÁÔ*Xe«Êº_‡$ƒcY/0x„oÈ`](ÕÇל/IîæÃ¸;‹±ãnŒ.¹RfÍÅU´þxªöšá\(¹ö\FÃemÐÂÚ›I•³Ò¦õa±å½ñXíYœAêvã`<…¼qäw7¤¤^<.'ù‹¶î•Ô™yuJ´ÆY~eF ÂO³ä„—eÂ˽R’]Vü„'øÊÚ·é/–+î4ØŸñJRº¬­›œô²ÁŒ&½9˜aÒëÁ4$«ü½P“MUxÑ-·áª[ªã¡›©œõßZ~¯[ãØuß¼¤u=Û0\‹®óŠH¡Ô]‚PÎí´øœÖõHX6]ùç…<´§t""ÈHÓç@MAýbÓ¨¯_6[E?c3VöØX‹:D ˜i‘×|`pˆ)Û -ÐÑ™ÎEÖ0ùø™â.Ðk—Ø´*æíF¶þˆ\b9¹K/Z²KŽ2‡Î¥4#žNéŲqi°Ï%#f°õº†1ÐMm=Â$·²Ž¸5:p+ý›rkÝŸ6õË»ö[T‡]Ù†úZ,…GÍËK^ê “Ö›xJ³+–]C€£u¨®ä *c” ˜&U6¬©æ°RÅXSR=ÚÝé77XÙúJ(%+®·¼àüÉJÁ9fÝ–&I©XX.Jö(%%)U€?û¥³‹}¤h•o Õ,ÞŽV=¼1­¢ÄúSEšÒ;Ák6H°Â.îw6"¥\ük‡y‘Û¦~2ö–ø÷›¦Ÿ¼¯wüã\‘RJæˆÕtâ'Z‰jê¦Ø(`;ɪ|ã|-¬*)¸ù´¼ÀªR‚jë°<¤Ye…euc™¬RD*˜a{ëÝÊNÌý˜fU6¼«æðVÅxÓÆjÓy2GÇ•‹«îÇþ¥ËÁ‡¤Ög‡˜è“}R)¢ÙïLb‘£rÉ©OÒJdåJó áõUžÎyÙ‡WoNÉæÖ§Ö¦¹g´>àHégÇ:_yÕ­:…¯œV—c…—º»>;ÃyïÓA‹½Ë™¡WgSpeȺ›âle2tûÖþâdZ _“ÎgäÂ(ö³øEÁG’Q¬"R^2#² •”•ÉsšQAÖ‡¡‹5€7™7ïÃC6µo“’dR. “f€&Å@MÚ\rÖ¥Í%§˜¡Æ“KcÊØ´1™pø è*þÛ×Î'™¸‹g›ê`A°%Ùj±î>“©âXxyØ‚w§©ZÜù$”¿Öz;<ä“ËȇÒ3ìÁté¢ë—©§i|©Û©õåmµmvŒ¼ÐUûeråjÙðÌ~Óeôm9Žfàƒ¾2ñu'ÅÀPpd’àŠúâ Â¦çñsÊÕ‚”%ó>檶5<ýG·ìZõ’vïáæR±+)Á°Ü`âR:K2èLI-Hr"‰…å²Í#€ÃUž’}xoM.ç±q娘›tÀ?ä0§ÌB“J :˜gÉ]ú¾¶…dûûÕôÅÏÂP×g¨Íu;ÛpÍ/ba³ò®Å d§«g1wõSÙ‡ "ˆãSÓÕDv|2—Œ¾²/ÓYûëØ'0]¿šï]É"Q”œèòRÞM”ØQ—1Ú¥I ˵H.çrк¾áù!MÌl°#bÎÁîˆÙƒ} N«-^ñ®L¦õèÁTÁA›=Ö[ày Áºøw@™;êãT†ií»ýº¹??¼¦cã&á°”©('þ´ q Â0ÈI© râ/ój6È™oЯÅü©’H]\Ø‚!´$”¹üÑŸÓL‹„e3C€}¦ "(ˆîD½ÁxàCˆ§O3,܈aspÃb¸‘é“Ô€·Âo¦¶ìc׬¡Û[HÇ()Y‚Q°–àFú\œ nì§ PcÖ5‘JÂjV-È(´v ‰0ò¨ö}«ç’ —y–m诅gBVè Ùo3›¦•ÝLðû4Ï"aÙx6ØçYIc¼ÐíÙñÁÀ6Ê8bÚàÀ´`·˜[*Áp§Om<2MPññÓ¸£x0µTÅó®ððV‹oÍ9¥¤ªÊÒìøôòšM$ð€°2IBü)$!Ú¶Ž‡î€õZ?hÔñPÐyf{0Wˆ´"¥ºDC®ˆ¤Ô—iYÙX8€74vT o·ÐÐA’LÌ…9"â æÀÃó¡ÙîÑ—ôA®µÙâ`ƒ*K ã«4ÇËÆ¿ƒO[_¬õä>(<öAI^ 'MHwÊFÂÚª`•ì¼Î3+"Š$3Óˆ™ s%,Î%3s=¨+ÙGÁÁ)àî ̤xÀlÌàwIfÆÂrm¤ìq“£?ϸ°ÇLc;ö6]í¼8ŒÜÍ…{óu#°u¶®q7LÀ·P´ Œ²B¾âGð“Kk"Uå_?ð8 2ÅÕâëýáäïšãiL· ú£º„;ò £½í.Ô)¯-¿ #„ëÑýɰËÀ¯çYh »°28Ò„²ñcòyÙK®âf›0QùÉ@;¿Áe™ðÄ0AŠBžÍÚÄ…È”· Ð¬wîø—L<-X¦Ség.Œ}Ù‰G—D=s¿^WRO ñÛZ`â±{½º’¤“=ùXÇAs¼!x4ËY)4—€÷©Lj k6¤[çº&.•¦Î)Ñt:˜ç‡o 0œRjñɶ56•=o,@Ùymõ=üèdüžÞy…ã(`ÐÈ,V†p#ׄjÍR‹)Æø<å²=‹+‰s°œ@&ÄÎQI¸w‹…åâÜàs¢Rz0¼Úà]’uù°ÖÍb ¬‹±Æ·ý^fUq³¸€Cxéá۰ܹ×–#c…òÒØRßk{Ý9gŽ.ûmd§8)dáãŽ÷‡¦~—à¤bL'I òǤ,À…Aý•¤Ì÷¨®$­Í4¬Øüä,)™†s²°£ù×4)#a¹ÒÚ#€=R x\’kѤ ;³ŽØ9ºcg´‰høÝÐþ½(õp×´‹Ø]Ãn¶éª|¼×30a\ˆÝa覛ŠùSZ¯#aÙŒÍ`_¯aqƒ»Ú{»ñíãh¶Š£y‚õIRͳõ!Ró¹>5û`+5)·ïþ‘”™·á§ëKóЕ?Q_« ]ßñ‹{»7[\Ý à%;¶ÕÞ6 šðå§Wª€EâÙ @£2뤬¤ßµ¶œXA¾2¤ëÍnï Qƒ¤†Þ!¢³«I|`›vÛžæÍQ¶‡v-æHT¤¨t"„RR¬'/lÚ©6„ò8~6°ÔPŒ¿ÿKhÿ’f~„'›Eöqø¢A¾æ Í&ý¢Á|#fÏa ÌŽ1No<fL.Žçí¶>¼ 6óŒkŽ›8;·ìÖé=ù:%ï,`°ìR\¨Cd‚’J¸¿—VïHX6õì6ÜÿRÈ!@ÆØâ“NV#báQRõ³áTPýÿÔʪ·mc_U©ÏËMêüÝfë‹ÝwEÓ°þ1K«^h¾Û4K¯.0a•“mØò“&ÖtÜáž+;Ñ¿8׊ZçBâ:tQ`pˆû îí¢0ÆpÊŒ1|3egxù!¼;°ÿ qƒ€—Ò¾Üí‹-Ƕñâ­¯»®»p2~mOn£‡ÿÞU ÄÅÛ¸«{±–ïí]ý|–)_­¼xó˦Š|ïËÑCùwÐl±6;àj{éx:œ},=óÁJ3{TÊÅÝ£Çz<£º-£R?nÞƒfë'·­ÄfÎÇÎkcU×%3G›Žl: ¯·>è^ÚJônŽ Ù›8î-•ßdfΚwÅÁÔ;g]ð¶îÍÏöUvïìY¿ èÐ<´ÇS(©§“ÿ-?ãGìõ;{žöÆ•NòÏ·Ç©bûñ”€«¶ª¿O†ÜQ+¾Åã´ìÚÙfSü¾MÁˆÐÌÿƒçz;š?%'X£Jd¥ÊÏOzËHâDzR*X®}«®t2üC‰*uúÍUéË?áq*äar…žæØ¬¤ÃOŒ`QÊûñßM¤ýÑSTQ½ª©ãí^¡\•±£bÎ?,îÎ"·ª&'p†]pï ¸ófÄ„<'íÞ/´25ªÌƵ :rŒ*Žã}ÕÎU3NlîËmûXù÷&ûÿd²¶*‹'Ã>ë è’ùú£W¿ÿA 6ðendstream endobj 2256 0 obj << /Type /Page /Contents 2257 0 R /Resources 2255 0 R /MediaBox [0 0 612 792] /Parent 2229 0 R /Annots [ 2259 0 R 2260 0 R 2261 0 R 2262 0 R 2263 0 R 2264 0 R 2265 0 R 2266 0 R 2267 0 R 2268 0 R 2269 0 R 2270 0 R 2271 0 R 2272 0 R 2273 0 R 2274 0 R 2275 0 R 2276 0 R 2277 0 R 2278 0 R 2279 0 R 2280 0 R 2281 0 R 2282 0 R 2283 0 R 2284 0 R 2285 0 R 2286 0 R ] >> endobj 2259 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [414.5801 528.4393 442.0328 542.387] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2260 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [469.3748 528.4393 481.33 542.387] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2261 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [425.0408 516.0856 452.4935 530.0333] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2262 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [479.8354 516.0856 491.7906 530.0333] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2263 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [414.5801 503.7319 442.0328 517.6796] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2264 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [469.3748 503.7319 481.33 517.6796] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2265 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [445.6682 381.7893 468.1395 395.7369] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 2266 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.7436 381.7893 506.6988 395.7369] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 2267 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [485.3344 370.5315 507.8058 383.3833] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 2268 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [237.0239 357.4804 248.9791 370.5315] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 2269 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [485.3344 346.2227 507.8058 359.0744] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 2270 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [237.0239 333.1716 248.9791 346.2227] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 2271 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [485.3344 321.9138 507.8058 334.7656] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 2272 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [237.0239 308.8627 248.9791 321.9138] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 2273 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [357.3794 260.6436 379.8508 273.6947] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 2274 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [407.1927 260.6436 419.1479 273.6947] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 2275 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [301.3102 236.3347 328.7629 249.3858] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.3) >> >> endobj 2276 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.1048 236.3347 373.0414 249.3858] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.3) >> >> endobj 2277 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [480.3531 225.077 507.8058 237.9288] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2278 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [237.0239 212.0259 253.9604 225.077] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2279 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [480.3531 200.7682 507.8058 213.6199] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2280 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [237.0239 187.7171 253.9604 200.7682] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.18.1) >> >> endobj 2281 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [411.1766 126.3472 425.8992 140.2949] /Subtype /Link /A << /S /GoTo /D (subsection.4.6) >> >> endobj 2282 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [453.2412 126.3472 465.1964 140.2949] /Subtype /Link /A << /S /GoTo /D (subsection.4.6) >> >> endobj 2283 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [323.1252 34.0089 345.5965 45.964] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 2284 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [374.4098 34.0089 386.365 45.964] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 2285 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 22.0537 115.7783 34.0089] /Subtype /Link /A << /S /GoTo /D (subsection.4.5) >> >> endobj 2286 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [143.1203 22.0537 155.0755 34.0089] /Subtype /Link /A << /S /GoTo /D (subsection.4.5) >> >> endobj 2258 0 obj << /D [2256 0 R /XYZ 64.9134 727.2935 null] >> endobj 114 0 obj << /D [2256 0 R /XYZ 64.9134 113.0043 null] >> endobj 2255 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2289 0 obj << /Length 2905 /Filter /FlateDecode >> stream xÚÕ[ÛrÛ8}÷WèQªŠÜ æÍÉNªf¶fªvâªÝ-¯h‰–YÑÅ¡è8ÞýùíÆ…)è’1³;ÎCLA ˆnœÓ8Ý„Þ_]¼ýhF9É5×£«»‘–$gBŽ2A‰1”®æ×cIôdÊ(¥ã«ûr2BŒÿ>aŒ/uŸæåíã„ ø–ëÉÍÕ/#)Q†êµc­?]]0h¡#¶{×DæZf«‹/×7t4¿ £_.(Éòlô×”ˆÜ¨ÑêB*S Z–Ÿ.þÖHGS.‰¢†íe»»±XžsK2B©d¡eo,ÆH®?<–»ÂXþ2ÜÑj êœ*„ò}ßó#Üäj¤sA4ËõÚ‡Í =º*ÖàÞy߃L*"Œæ£xà—͵òød™b$Ó\tgû—r‹³ÕÕL·©6ëþŒUD±œ 8c))ÑTe£©¿wˆµçpÓŸE™¤8CíÂpž‚QfˆÉ”#ðS]5%®ÅÛ@ž]gž ôó½t=:ëLa4j|‡ëÔ€ƒLú¿í áÊ{s¿‘Iƒá·ï¦4~Ïr“"ÒdÙa#›rß¡)ëÕ£[>4@†¢n*äðµ œÍ=´•¾m>‡µãÐ61 Ëe˜ÉO-Wèð¸õ´ý:(Ëi&|Gk÷[¶?ž€K$©ëö/ªèÖFø™å¶µ #LxŠ~ã>? oO®áv8 ¶æ?$¸g±!y«9xSæ'x«5Qœ)ëñyÑ)56¡^ }óük¡0„óì”*„‰&½Ü¹/ë3UaÝÑ#Cwߌ4ºc3Ž ÛKŽ[TË€4L¨Z±eÛfx½©­³Í@‰l¼YÛ'Ð6›. ' Àw—ƒù쵨Ï&§Tb¬ñ¸„ÀpJõü~—Ñ#Ãeߌ4.c3Žàò [Qú‡è¡· ~-ô¶-ê,1—hA]îÐ|*uÈ3Ø…8è¼@sÞk œL€”¤§tƒD‡j¿ŸBܼ{IàŒ9@ûf¤Ú1ãŒÀ9ˆl¡y·×‚I¦p9ðFìÖ¶dõ}»ÿ.ö¦PÌ…"T(}:Êæà×bÊ@îéS»?]¬„Û6ËõתÞWq] ŸTÆŸRâöœŠÓê8šô`4è;"MƒØçÐ`¶YcsSº?¾º³¹óÝ¢ ìz k! ¯Wž <7îû%¶[©m)S44é=CÈäQo#æY\£æí—ìðF_G´ES\×Í:´¯Ù ¶b¯D½(c@hòêEåX/Îݶ[Ì>75ü·¿T g"òÿ·â‰Å­=g$¹Õqưܚa‡ûM5³HzTÅ@^zn¯°å?Ä-X>®ÅŸ„[íØ+Ù³T¦‰´œà–¡„JezÜš*® ™[&@4ú`èÏ8M€xÆÇJ/Ëeÿc€u+£¦®‹îYq7ƒúZpWŒªZGéŒèœ»-þËcÕFJ4Þ`HéÏ1”îaý«¦ñ=;?öž=‰ÁLz-û4ºL? ë#ŒÛšîËåÃaLDã †‰þÓ˜ˆçx,zøŒ«UQû¶°gÚ~_' "deï»]–qnÁÂÂAô füðèé.¹Pp•rgèŸH#œ7^'^ºÞZ½°qƒÿÊ]%¸­[uÁüw³\Ú;žÚdÖ9ÖÆê0L«€Ö›µ—5.ä&ÏïœÞ`2†ÌÔþ”AWÂË–íKå”I¹´Ï[u%Ô­ÝAJ÷ gÛN¬ôž¸î½¸ñŸëƒ6MeS™bIžúË3î®Î”O¾E¯‚ÇÖNÃáD¬” E/¯ûÊ m#j´y\ª(—ÍÄ—x¥/£‰1C)–´‡Ã$$ælƒ²£o™XÇ.-oAºDq÷_ýã›t®a/غ¾ÛçHÅ7wCe{¾KUú¤$øãûþò·¿ö‰Îµæ@<”3šésh)† e;â4Ò²²+¹uNdže»'[(\þúS¢¡ˆ1Œu“¥NXW$ϳc• ð¿Ô´wn£3D"êÎÂàÁ™7o¼÷I@™@ŒcnQpö˜Ög÷a]`òë畜[ÜêÖ’ßõ¹ƒ@bëðýŽHF.€¾>ÚsK€ßÅ2¬ nÝ„ ÍH&(Ú„ýË—Ã&Œ8‡LÀÒh#vO> ›~»±W…ßz|'‚¨%Ñúw­ÇS˜¢ïfžKz®ñßeÂEË™¤åÿˆl'¤ú¦7åêÁí͵=?å5Ž“5ØT–Je3qO ¥¥¤ï²xŒ pÛƒ'íf§ýÏÄþžaÿÃn÷FSì9ÐbÚ’"¸Dƒ½•—,­™¸ÜZ R)µÃEö­õ¶@€;Ñ4owöý"Ëc§ºÒ´&”:#,£*i~ûˆÌÿtuùa/&BpÍœñ‘0’P¡_Û§ñû1‘LÖJÉÝ“ÄDØ4TŠöp÷â â/áPÕJ¨£á¾h<˜5˜CÚO8„+{,×9±›D0¤Z§°îå"8m¹™ËÄ8š@âàÿ&1Œ&Ô˜ /ËÍmjHR¬ýçÒÔEõò¹Ì¶MêíÑËÄ®à™ÉBä òïɧ‹¬­ì?¦þGtbþow‚FK¥5DdǹÍ5·¹Àj ü@&û§ñ)™,|Fïž|®Þ¹>µì‡e²~™L†tœ·ßïô‹ÛÂK+Pª6yƒ°]lËn¡¿»ÒÝó9eëîål2èïÏBOá”°Q2£äVâKλ‰lû J)¬ÁÍÖÝ’8Ìàð¾0®­ôá…½ñÙmm¡úÿ~ð÷ô2^{Ž®¶g”\¿ÿ¦½}1±„ÿ47Q¼ µÄ¦)ÂÏ4zK.2N„ÌÚÓo„Dä„S©m›¥À“H.rÝÒµCÁf®þíShYíÏwrªÛj‚»ïç÷tç1ü›H§Jlâ6ÉÁ¶L°|vC ­tŸ­Ãñð!ëð¥}»:J³Ó(þ™¸ø}á>†2Z«É澟­¤`Ç6ÄVL·nŠO÷;c;6ö^d _?Þ ÃÝ-:lñháä’B#lê YâåÒÎßJ‹ëív§úIËñöËcQÛkÈ,­¢ö‘éÙl0@jš©6pØ[ÜgXÄÖ!—ëÙÒ­M{hN‡z¶Fi×Vg¾¹ËÍmÀǹëÏ®Á'ЃÅÚ颉¿qU5M9?(#'FŽíÛ9û”v]‹Ýé”ÞT:É÷î—àBŠ¿Ž½ø/ïé°§endstream endobj 2288 0 obj << /Type /Page /Contents 2289 0 R /Resources 2287 0 R /MediaBox [0 0 612 792] /Parent 2229 0 R /Annots [ 2291 0 R 2292 0 R ] >> endobj 2291 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [429.9135 674.2923 457.3662 688.24] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2292 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [484.7082 674.2923 496.6634 688.24] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2290 0 obj << /D [2288 0 R /XYZ 64.9134 727.2935 null] >> endobj 2287 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F33 2063 0 R /F14 2010 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2295 0 obj << /Length 143 /Filter /FlateDecode >> stream xÚEŒ;Â@ {ŸÂå¦Àر÷×F„ˆHˆ¥ŠR%¢"×gABtóF£×ØfÊ¡ X¨aT¦”X°¬“Skæ2¢FOâƒGþZkvÂÌîÐ7âº:Üm*žÎÃ'‡¾€Ô”Qþ¯m ËõaÙà Ó̸ãL1G|UfÒœ> endobj 2296 0 obj << /D [2294 0 R /XYZ 64.9134 727.2935 null] >> endobj 2293 0 obj << /Font << /F8 1548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2299 0 obj << /Length 1510 /Filter /FlateDecode >> stream xÚ­XKoÛF¾ëWðH¡Kr—/_ M‚äЦ°zJr ¨•Å–U’¶ìŸy-¹²¤¸EƒÖr9;;óÍ7æÍröó»Ü+‚"So¹ñ’0t¡½L…Až‡‘·\öU2ÿºü8{»œE^ÿ"/ÕA)‹SO¯ÚÍþ™}þzëYè}œ…AVdÞÖa Š<ñv3¨ ÑJÙfv7ûcT¸°®Ê7h^”{‘”Nc4ÐÊ¥EèX+20™/¢(NüwóBùmOþ®æ •¥~»ÁßÄ_›/a¤÷5¾èo»ïÑ/¾! Š$¡Bo¡’ KóŒu(É ïñÁì ÝQ6¬z3]Iú\@Qx¬uBÚ–[g”ö×sЃ§Ð*XƒahW»Ç׊­†ß 6âܺ¶7ú¡{áŠ<éox]wVc5ÔxÈô|U¹_³Ì $ðžfXÔrÑa<†Õ¤ü=Ñ€gd9É÷ô—Í›tÒR„7°ß6M‹2Çn¡8:…(VÕƒ¹œ©ov(}@[Ù"Ó_Ä–j:xw˜/âÌ7äC-¸ŽnèÐ|\ AÏ"îê$È'•†«»{D{çx+Ò‚káñÕ–á[Þ}© tðFoÅ˦ᕵ/„ÈD,ƒ°–|e ¬YøK˜„»Nä.‰’xªS ðªç9‚·°$Ф‡ÃìiÆadús¶—J²¢êêÕ„¹û ؃‹¢MÖjÆ@ÎX6'A,4=”÷’*a£¿Ã믦¯t”³J‘ëLPöÈ©åBìÄ5¶˜oKÄ÷±Æ¶èRnL|ðV½ÙWrÐÆ•#ó̦CYI„Iº¶ùܱÉüƒ„Xò ´™'"y]ÕCó,ááÃqo÷nnÁÛãÖìÅ*þá¬nðºÅiŸu H0³;4ÔÂé‘×!ŠÌŽe\°o0o ¿'¯Ê±¯ÂQéþaLà‚xz©0ƒÀ5ìMÑ¡•éNÊ)ŸTOÁmϯPÈj{ÌëêAüÛ(?ŽMx9`—²‚ÒnCæÇ^Zwe Bˆ! )zœè:®+GÇçÑvàµÂ5Ž2;i,r1®zyÛ¼–µG‚ºó‡¦d¯Ýóµƒuã –øêÀ}Ávع\(*˜‰°$€ˆž†åÓq‡&RÉ0hË;I¡c=läQœÏ”™q&>Úiú¯‡iÖ’y ³Ðœ§ï…à’¹Ÿ¨}õcúQë<7,>%‡N6e2Ž´“PðÝShø&Š`+„€ ™TÌØ•UH2?ç&Œ` z¿¿eƒ¥Ä©ÄÀŠˆaQÉ}®OXáÎÁQD…²>¨W}ÈÄÆÅÔðAêêã> endobj 2301 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [185.0464 563.0484 199.769 575.0035] /Subtype /Link /A << /S /GoTo /D (subsection.5.2) >> >> endobj 2302 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [227.111 563.0484 239.0662 575.0035] /Subtype /Link /A << /S /GoTo /D (subsection.5.2) >> >> endobj 2303 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [372.7426 443.4967 387.4652 455.4518] /Subtype /Link /A << /S /GoTo /D (subsection.5.3) >> >> endobj 2304 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [414.9597 443.4967 426.9149 455.4518] /Subtype /Link /A << /S /GoTo /D (subsection.5.3) >> >> endobj 2300 0 obj << /D [2298 0 R /XYZ 64.9134 727.2935 null] >> endobj 118 0 obj << /D [2298 0 R /XYZ 64.9134 702.3869 null] >> endobj 122 0 obj << /D [2298 0 R /XYZ 64.9134 682.5585 null] >> endobj 126 0 obj << /D [2298 0 R /XYZ 64.9134 371.3298 null] >> endobj 2297 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F21 1557 0 R /F14 2010 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2308 0 obj << /Length 4759 /Filter /FlateDecode >> stream xÚÕ]mo#9rþî_áNV<¾¿Ü·9ìà2·É9@‚Ýý ÛíaeË‘ä™ Ÿb7Ùªî&›ž5'¸Æ;²D•Ÿ*V‘Eö_o.þüÞ^:â4×—7—ZÇ„¼4‚k)»¼¹ÿe%ôÕš;#ÍJ]­¥tõþŠÛÕ߯Øêßáտ‹wWV¬n®ÖBÈöƒ÷þ¥XýøÓûë×7×ÿð«ßnþvñÓÍ»¤ð;ÿ×D:­.ï/þûâ—ßèåý½üÛ%Æ™Ë/ðšᬺ|¼J%…ˆïì.þqño½@z¹æ’(jÙTTÛ¼“Åœã^–t„RߘˆbŒ8¥x^T÷= ¢ÂËø¡¨uìçZ;J¨­È¿ŽoáÖ©KíÑÌÙVñ7^Í_ŸAûvÕŒõÇŒ"̸K,ömH£Äy¤Ì2¢”bC¨?6GO…»ÃöFÿ´Ý?ñ*ƒÇLE¼RZ¢©Ð—ëðÝ ÃÎá;ÿ¬üáá¶ëf;*` K¬QåÞü×Ï?ÇÁh°‘¾á+:+6Ó×u¸Æ[€œ#€ÎCµÜm§,±Qk{¬Â4±1ÂMçÈZ ­wûò ¾oÙÞtïœàOýëh²&~¼èD4›»+x÷Søk×<¶2žü7NݛۣWÆhd™3® /¹1ím«šÊ¾‡mu?Åjš„æÄ é &¡5Qœ©^}lb&+Ï-ßlAàKœÚ£¿6CˆûÃÄ$˜$”«zø¢À)¾!õ˜!Lƒ¯ž¨g­ I-«rÚj1Ä`µ§Æ›Øìó1ïþ˜·T0¿ößf{òF¾œ°HÎ §V#‹d]3ŒLý(ç¡Ñ>-šHŽäð¬iWÓë÷3íª³¢DYÆÓ†Ó›¶’@PÓÅ ›Óþ1KK$®-ÇÓ´ |êx™BÚt5¤ ha çFZ2b™dÙvœXaQÃ7»ð p%&ÂEœñ|>쟛Ãék–¨ÏµØ8Vcš5b6¶¯<îÎ!:÷ؽý+U´ xîüÿ}¼ãüö3˜ aü‡ >Ú| î”q ßdY¢WSÂB‚® ¬®@tîˆÔ´›Æn÷û]³yÊÒI¬E£1È40È8Wú!–9êœä)Zæ¹ÓᥙN—»s9™.‡áÒ`º|ØìŽM–\ÕT³/êû áF\>ž£º›Œn¿žò‹ H\-f¦™…Fµ…É…`îc˜Á$&˜†x¾Õ1ãWm§€T»´Ñàûžîâ¸!ÚHv'Kâ¸RY*VÓåB¨HD<º4¡SIŒÝLt·Ùí6·»)AuF9{nýöÄ'H\c‘‰ÌŒib_&Á8OÍ!a¢n×2™±&Ó&ƒNçtð¤Ý;‡¾Û·ËÝ4¿× ’¥C>(­Ö¹eÌÕÊZˆ“xa®VÎ/ºn¼û´9lîNÍ!G,³A&0“À ™qÎ_‡º s÷øúNó”zÝY†[SF ª,PÂRB¥²J0Kœø}ó·ûµ qE&üç­[9º¿Ï†¸ßµh;Veš¶á÷ Øÿ[(PO— ±xŨ*„JƒŽ¡ÀnórÌ“ ¬EÆ1Æ41ÆàCÛdà‚=otÙò˜ýpú=¼ìâ’â\R\¯ƒ ™hƒà…•&Z¥ˆð‹1CöS‚8 &hí¹å›—‚À5–˜ZÁ÷«¼fˆpÿœÚí9Œº\‹Ãc-¦9Œ18Ü/ŠïûÝÛóÂOËÙ»Zñ6Ì¿Iý+—~úuÃg^­û ñÂù/—âɉ³2NÇÏû—n:J¦C}ëzé9“ pÎ¥C¸ÛµX>Ödšå!f9(5$=]ÆÃÛC9¶VëÆBØ ñ•²4c J´`ÝlØ|Þì^’Ù{¤’Y‹ c˜i*`˜}f|Øz÷é±éײï¶ßÿ<â}ì¤ÎçñÉ ¸qö‡š°‘+ef`5•,dšgÂ'Zšæ!‰áÆtÔÃÄýYHc±çfoõ~QàKœÂ³ ÆLÑù•ù ß) ªVõðE|ŒQˆA",›%“Zf9æ´Yb˜ÁCß¶EnûÎAïZŒûlíÇÞBáCWkvœS,镺¯w¦Œ˜µÎjšYˆÓ§`”Bªˆã–¬36«gHbÞ:1ºÝæ¶ÙmŸ>N¨n×Y-êì%P2Áãr„³( a©e ã‘N(ÆØ›á¡nsÛm· îrÜWd –¸st³æXMË0GiaL¬(Ä`ÒvL(ÑΛc߬š9b‰Ys +NE¸Ç•˜>Qb’é˜å1Ú@6RìÈß/MƒE› ™™­”¨§ž…€˜š;[0Dδ,@lVÏļ`tŸR³üG®Åÿ±ÓüÇ(Çžþó•Ò«9x—-µ¨~¹ŒÔ ÂW]ˆ–¤¶Äj¢¥Ýæcv쑸Zc?F˜{Œ0„á?ö~™zÿ±ów¿R¦Ú‰:þ9ëÛ ñ›KSç&fƒízý_ˆsS‚+^šÝ•&Šº0»ïö›ì1 ,¯ÆÓüÁ7qöc °v˱$°ÍìÂÆ]G¤öõË£ßpî¿éiOjÝ[=$õÇiJsŸ”„)ÕùíOÍæ>ËŽN\Í$‹œaFØÑí2†T”2»“ Yd¿“6ª`ñTC,³®¦š2Â%navW¥™ RSKY7lŸNÍÇ| –X‹Nci:a3ÅÉa¯z!ÃÎLì¬4Ã0G ?, {6|ŽÍê…ÏHb>|Æèæ*Uqgk1r¬¿4#1Â…UªÆÊ„i‰µ Djå­ÇšüŽ¡eºÿEE| œó)„l.[­Û7ß` ¡Ü5³î¹ÚP.ÄN)ô›šÒTï7œ”%;ÍêÙ)’˜·SŒ®Xz\5A"gŒÃüöÈAüñŠóL9b™‰FÒL·ò…òõD`ÊÕÆ­—X8¡)±Ü†ltŒèºA«…0J,!„±¥JFía»+ž©êªquÞH8»,‹ÂIb$µoÔ7«æ°Ä¬7 Ë{#!ü¢—©‡²—X€É„&BI7:S}‹G¥’Çœ tÒc.¬úöŸ3¼©7” q(þ J iˆðnMHCöY‡›Õs(HbÞ¡`tsvŠ:[ËNÇúKÛ)F8=ý³}úK ض“&üÖF3+%Ž3Úü¢ µ66ørØžRó3$I†ëןêÜn?_µW¯=þösß•‡ ¨[¶Iív‚¨^×ÇÓa{wš.@hb8c0xšê\…ˆ qE¦ `Fœ¹cÄ>¹æ)x¿Êó³WÚ~ç‹a}ÿQ1¬ÿÓSÊÿ{ü²=…‹Ãpß©n_ÝPq°-` ûr丹8]~ ?(3Úæëhë9‚em\["Yé¤27p±×zý¾y=¯EÎxýÐùè÷½Rt4QgÒéPn⥡ U`lçWNÍ®…%u‘¨V³Ä¯¦Œ…&Iªi!kçÊ-ìð¤.ÌíV»0KÌ_˜;8÷¸ÝÇJLÓc t?œ‹˜ŸO¯¼ Àgá“(ÞÍ^“R¯Ïßå1ÈHÅ7€‹ßȲZøka 1<‡ ‰»p0õ¸¿û½™nuQMüƶoÏsƒÄ5™º H)€,”›ûûCs¤{ ¾†ùsÅ´K¨>y7>Ã)‹S.àN›ùC©¤ˆ,±Î™aâÒ • ¿iXŸêMÓ¡Ç ØëT3¾…¬½ËH|,ç]búÛVô±HäœÅ(ï÷›m>z@Ý®=Œ5™v²ã+ÍI9T¾@[YOù½Ä‚ò¹ïBµv¬õ¨ RŽìÔRÎêuµ—Xèª`0¯I0ôAW[Gšu&Õh¶ŒcМ¶WX™‚7aí\"x“—Ã]“÷&±mEo‚DÎy“ÊíÓïY_‚:]Ë—Œõ˜ö%a—܇çˆm}1êW¼5O;ìýdè·Ãý 4LÎCüžåxµî/cÆdÎ_Åæ)Î\{•Ž‹ŸÍ&{)"’W‰=c„Iò úѦnÕïZºË¶׃…b¶úËÕZBbš‡ä^µÉ§MàE>9`Š¡i?™ýK§6ÍD¢>€•–"QÛ•”ÍD…‚á8`¶Fÿnû•ùÔª¼ÏºŸ_”÷çgl¿(Ÿ³•jc½S±í%M…à’Ùöf)7g+Ñy÷mëMXäÌt0@9¿4…»]ˤǚLÛ4ƈ=ø©¿™hó8^§å+<ü<3Yªš¿ž¨ž–ù0Ý^ÇTˆ|˜i¯–¯¢zl[‘êHäÕ1ÊTY—!Š+Sa”XBèë04ð{€p³Ûn²kix\jÙâx¨Ó¶8€˜±Åõäa”}üù¶s£›/毋¯×åe¬3©ü°Â=²L··ZéW™^l[ÑôÈ9ÓÃ(Ÿ÷Çíì<ÓuÜV\(Æ"g¸Q·%Ó©yF2‹pCGÚR3¿4ºl{R%æ‰< '+Rã4«7l½Ä° é·q¤H[Ò^û=ðm«k_ˆøB¦Ã] 5qÔ” ^ p¥D:=ªõ¸fÉèTžCîâ±­kþv¢tç5K»×²tsshΫ»¸¶Æ‡39ÿXÍlšøR+^zj®?†ìhx&mÉ?ƶý#9ç1ÊREîx­¹¬Ë´Ä(çãð?ötUŠ ¸qQÄüÖõô±ôÓWÕ¥§3îKæÂãoKÄm+‰œ#þeÓüž½ÆºÆþëÆxõãcsú´Ï^A‡‡¦–iŽG;mšãÛ¹íîEý€"ç;ŠÓãÝËáÐ<µ£ðRˆW<ð6Jj¦—´ôæ^MÇ 1w_PÉD¡еú£²ø°,®EÇÓŧg&s£] î2¢§ ×¥g;G¬ Nµ:jYßìͧs‚¼5˜(v£ÄH-àn}Mÿ̳ j!<ûôYˆ½KÇç=ÑxT²–ñ'<ŸVø©/z÷ÁÑm[‚ß–¥žRðÚj=ED*àRz.દ“e8` Y-=ãlDºð`âþ~ÔSûbÃjíCóÏìÃðæ z[‰ðcý% ‰)ïöôÍì““•}¹r³¤®Öïj¤þ?OÅ€„endstream endobj 2307 0 obj << /Type /Page /Contents 2308 0 R /Resources 2306 0 R /MediaBox [0 0 612 792] /Parent 2305 0 R /Annots [ 2310 0 R 2311 0 R 2312 0 R 2313 0 R 2314 0 R 2315 0 R 2316 0 R 2317 0 R 2318 0 R 2319 0 R 2320 0 R 2321 0 R 2322 0 R 2323 0 R 2324 0 R 2325 0 R 2326 0 R 2327 0 R 2328 0 R 2329 0 R 2330 0 R 2331 0 R 2332 0 R 2333 0 R 2334 0 R 2335 0 R 2336 0 R 2337 0 R 2338 0 R 2339 0 R 2340 0 R 2341 0 R ] >> endobj 2310 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [297.7308 637.2313 330.1648 651.179] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.12) >> >> endobj 2311 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [357.5068 637.2313 374.4433 651.179] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.12) >> >> endobj 2312 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [280.8496 550.7556 308.3023 564.7033] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.7) >> >> endobj 2313 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [335.6442 550.7556 347.5994 564.7033] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.7) >> >> endobj 2314 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [327.7294 526.0483 350.2008 539.996] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 2315 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [377.5428 526.0483 389.498 539.996] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 2316 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [328.532 513.6946 351.0034 527.6423] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 2317 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [378.3453 513.6946 395.2819 527.6423] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 2318 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [317.3241 501.3409 339.7954 515.2886] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.9.1) >> >> endobj 2319 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [367.1374 501.3409 384.0739 515.2886] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.9.1) >> >> endobj 2320 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.1641 488.9873 367.6355 502.935] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 2321 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [394.9774 488.9873 411.9139 502.935] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 2322 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [276.5325 464.2799 303.9852 478.2276] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2323 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [331.3271 464.2799 348.2637 478.2276] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2324 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [310.2671 328.3896 342.7011 342.3373] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2325 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.0431 328.3896 386.9796 342.3373] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2326 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.9473 316.0359 398.3814 329.9836] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.11) >> >> endobj 2327 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [425.7233 316.0359 442.6598 329.9836] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.11) >> >> endobj 2328 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [217.6974 279.7719 245.1501 292.823] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2329 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [272.4921 279.7719 289.4286 292.823] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2330 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [309.935 267.4182 332.4064 281.3659] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.8.2) >> >> endobj 2331 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [359.7483 267.4182 371.7035 281.3659] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.8.2) >> >> endobj 2332 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [279.1615 255.0646 306.6142 269.0123] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2333 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [333.9561 255.0646 345.9113 269.0123] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2334 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [289.733 181.3411 317.1857 195.2888] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 2335 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [344.5276 181.3411 356.4828 195.2888] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 2336 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [299.4742 132.3249 331.9083 146.2726] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 2337 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [359.2502 132.3249 371.2054 146.2726] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 2338 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [330.3586 95.2639 352.8299 109.2116] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.5.3) >> >> endobj 2339 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [380.1719 95.2639 392.1271 109.2116] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.5.3) >> >> endobj 2340 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [282.4824 82.9102 309.9351 96.8579] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2341 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [337.277 82.9102 349.2322 96.8579] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2309 0 obj << /D [2307 0 R /XYZ 64.9134 727.2935 null] >> endobj 2306 0 obj << /Font << /F8 1548 0 R /F33 2063 0 R /F22 1606 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2344 0 obj << /Length 2470 /Filter /FlateDecode >> stream xÚ­YYoãÈ~÷¯ÐC€¡€a»o’› @6˜ ²oAd€Ý…Á‘h›X‰THz¼þ÷©êªæ!qÆŒ_$²êººê«â7W×?å›B^ûÍÍÝÆ[Q(c7™‘"Ï¥ÚÜìIœ0ÛTI)“[•t]ÛÁ_¿ýíæçµF¸\ú +M†£Wn®ŒÈšj/láÝfw¼úßÕ/¿ÉÍþJn~¾’"+²ÍúÇPâ¦CxÞã¼Mê†þô´ðD²†ƒ\Þ6}ÐW ‡îz©íA½Òè+Ì5`2¡¬µ3 ’ß!+^X:0ó=6¨ÕH)´Í|T+…¨¸ÕX9ª ®)8Prƒ‡ÅiS$áp¦Õ‡‡““oÀš*2÷££¡aFâÔU{œ ¤ÊGAá üzWán¾e¸&xÕ¡ì‡q½.’ÏÈHûûVgà†´íÞãú0¤hB8u‘Q4x½<6Vòb8>ø(“¹çÝן£²1É=Ç&nææªH5†¤£ø†QD%"¢ ZIñõ?}°9+6j â»Îxøk‹gœ³(ÂÂ)^h§Ø÷ðêtr*ï+š°]º …à2£DäàZb¾òKëuá‚“FÐ –ímfQ߃.%Ë3ˆ·EŒ¦ÃC×>]¯DJƘ/ '̃W "ÁÈ-R¥3‘AÒ]xÇÍ`Ëþt8Œ6ÆûѱCÛpW[¼O´ràOÑ’u\Ó úlIŒöÌ…Bö]>·:Æf°@›3^È—H' ‚:ª(4@®/ãûÐ)¦s’é,3 奛NF1F¡ý>®§Ä¥¡Ÿ Ì­JY:^óñ’L)RÅìpD£ÍŒÔK÷öÌg)ô Aë÷U·†:0– m ÞÕΰâo—’¥€Ü)¡Q@Åâæ¨’*ÈäIÓ6ŸËîloú×°n]¡•=K+ÝcEþ|6M¤ÿÌtÃuB²#6ª›~(›¡Áò6«÷t$ q­pŒÆWöÊ„:—¨n† ø*‘ô÷‰4<ŸªÛ™€á`èãׄû‚ëB !.½,õ‚Ia—®0F¯Õá„OŠ3ˆ3gÖ ¼Bfv^6Œ»ç‘U\Lð³Èâ²6€J?x ‰Ÿ{rê#Gý³Ä]ÒlO³m8Ž@”Áêý´Äa¦!þ/ùcáä8¹9A’Õ~…‡%Æ@|²Àÿx$Õ5+wT)+ úÄ<øîO§ÃyXÔ×r¥-@D/|@ý{ÃâH1“¼ ‹ZBæq±Çe\½\°Aû¼!‹‘âK,Br´JŒ‹pÞ]Þí„vcCÅ¥œ»ï3Û1+zàühÍ–ÿ#Å áx:Ô»z ·Ž€·G7 œ6.¹ÝÂqêÜÏ\i%Ž«ÜÀåug€½¯†s;ä â½Þ(Ü3³Ö)øF+0½tNðÒ9¸pød\…Ü}ªOçÜ)p;ŸçÅÛñ7R|C@O"ü±d±)Õµ^IìVù—œWI&t@pš/‚ Äy(ãžÂ ÃÓ•‹§(ÑÐî±ëªæÂ JøÂÛìíT6R|Ae“’ºxÑªÆ Ø†‹÷v,FŠ/±h `§"k«Ú—­ÊyŸCNhÓXZœÅ"8ËIžk/8‚²ë@/‘|ÎXz7«È·ÓÖ{`9 Š}9Õ@¾˜¦K€é¸÷™_ûžû\±0/cÝ01V$Ouo‘WLxÈ¢€³¨Ã€FÃa¡¨ ó‚êÕ¼h0DXµÿ—K뀺¬ö1 J¢z œ阉«Ë•]8@íþLÙmƒáû™*ù©åÀU}xÚµpÙ‚êOTSÛJZÚ ¦Œµ ØÜ{lb)Î퉌»yÒ×÷ êêW©ì®$EQ)—Z<±¦'Š=Ó  Ü9ÆŲ'ÒGxýŽ-ªÛqø°_ƒˆû ùi¶cÁ;©²·°âˆNй•Î ¬îiö®=pËaµÏ wLúo¯7ò¥ !³ÝB¤¹EÇmLá½z ž¹B1_‡ófÎ#4Cð~»(LÞ}4ÿ¶²ãµ|ªu>±Úx÷…Bã•ÅÒ7´ôæý%4ã«L7Ë&ó¨;¶öÕPÖÜ:«Êºä½ý^ÇØ/Ô \ÀwÜM(¬ÑÁQaæ<Ö cƒý‹#¸üjs0P ÚâVÝÊgLäN©Åg ÍŸ5þÙôÛPÞ„†,ê2¼QÂÉ£/}Âø¬Ö>£ö!õJ*þÉivžø6íÓ<ž*^_ÆÿîÈ1Äné‰Hª©øáŽù˜Ø®=R7ºm¦,Üæ%5ÿÞ: MñéPEfB“–ß"C¡ÃÚDAÄj¿æ”«|S žKv{ÏÛæÃúÇ % ¡Tž¿êk…Ò&B·‡‡ÿ+Ÿˆ”´Â*A‹ s¹ àpS^£òïÇ[L.è]‚-+µ`6:~ÇZ©³¼PNÅ–w3°æ/ngÚ)^@M¶È…NùÕJ{Mi`‰é»ÚZõ ^åÙÆ;,¿¿2 ¦3Š+%G¡Dæ|1žû¥ÒYæêW÷fü¿ÎŸ†Ë9$[ðw™Ú––Íra¦ïyó†zOf £æî¡yÃ¥¦Ç!š|úÞÚ…0=î¶—_Sp~á|k€Þeg`bj»»P² uÑv7Ù<Ê£uþßù¡¤endstream endobj 2343 0 obj << /Type /Page /Contents 2344 0 R /Resources 2342 0 R /MediaBox [0 0 612 792] /Parent 2305 0 R /Annots [ 2346 0 R 2347 0 R 2348 0 R 2349 0 R 2350 0 R 2351 0 R 2352 0 R 2353 0 R 2357 0 R 2358 0 R ] >> endobj 2346 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [421.6291 568.4725 444.1004 580.4276] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.4) >> >> endobj 2347 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [471.7773 568.4725 483.7325 580.4276] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.4) >> >> endobj 2348 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [228.7987 556.5173 251.27 568.4725] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.4) >> >> endobj 2349 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [278.612 556.5173 290.5672 568.4725] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.4) >> >> endobj 2350 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [175.2325 361.2495 202.6851 373.2047] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.3) >> >> endobj 2351 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [230.6572 361.2495 247.5938 373.2047] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.3) >> >> endobj 2352 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [404.9651 361.2495 432.4178 373.2047] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.4) >> >> endobj 2353 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [460.3899 361.2495 477.3264 373.2047] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.4) >> >> endobj 2357 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [84.3959 49.9655 106.8673 61.9207] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2358 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [134.2093 49.9655 146.1645 61.9207] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2345 0 obj << /D [2343 0 R /XYZ 64.9134 727.2935 null] >> endobj 130 0 obj << /D [2343 0 R /XYZ 64.9134 702.3869 null] >> endobj 134 0 obj << /D [2343 0 R /XYZ 64.9134 685.9901 null] >> endobj 138 0 obj << /D [2343 0 R /XYZ 64.9134 153.0373 null] >> endobj 2342 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F21 1557 0 R /F22 1606 0 R /F33 2063 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2361 0 obj << /Length 3282 /Filter /FlateDecode >> stream xÚÕ[Ýoã6Ï_á‡êß÷Ö^»@ \‹»æ­×­­$ÂÚV*+ÝÍýõ7C‰2É’°Ø(ÎøÇùq†Ã™ùíÝÍ_?Ø•#Ns½º»_iIre%ÖR¶ºÛþºö6ãÎH³V·£”®?Ür»þù–­ÿ¬ÿßÜZ±¾»Í„þðQ¬¿ûþÃ?ýp÷ÃÏ?ýrûÛÝ7ßßݰ…ì4×D:­V›ýÍï7¿þFWÛºúñ†ãÌê3¶"Ÿ‹C€`ëÇ"†C,°ªûög~hóúqö ßt#ÕÝðçW_.ᣦÙ«RíÛAªC‡Ñý±ì~ªµ ª_zµØzÓøÛNf 5ÌNcÄ)Õ:׿©¢A…çg¹CLJ¼ýñÇ­‚çºÌQhW€8#­ÀN&p`q© #è÷8ÉwE½ÛJq¢¥³àc~l‡ñ\ðá¾ÚíÐÌ· ðççë!ü¡Þÿ­Åã<dÔ*•î›—§âµ« ƒRiVZQÂ8¸ÉÈ×½?·ÎΜãàì‚0ayøý•«÷ˆY Ùúz¬œŠÉÝidÔÑû NüÄD F`XÖ±¹ëؼ‚å0º 2_ßfŠ«õߟwOuÙ &f]XUªû8x]LŒÍB†ŽüʶahpIt© LO¬Ô<¸oMñØz;Æ$ï“_N‹Ñ{zSlÛ0õjmár4ývBI€Ì<¨£=ÖT2¢5ë2¹LQÏå}lõ:æ(zô¢AYïªðà9uAijM0mˆ5ÔÌO¨"Î0wšP¯bþùž;Ïg2ú*ÄFF(³b•q1•ŠnE33á3ÝS;NÞTû)Äî1cV„¼ ¦.àǪÚà _š"!Ü&ßíò»¤yCô®SbÂfR=¶LJ¢‹1Z¸‹A‹?òÝó,yã5¸ü–@Ãê¸ß¾ŽÚ\)"Ñ©•S˜N°wGí1‹!ÇQ›+ y@÷bÁ'G:ZJ¨3*¡ŽqIG+Ê uœ5´Ž´èlsy°˜3ÑÄ‘Ô4äœi‚Ø"m. ³Ž_LûT¢6å)iGs´ƒjø‡Ï˳ÞUy³¸°/Ç+çg‘ÃN.eÒYŒ çf1ˆÍí oÁ9Æ’Ë’2Ž ç±¥†a%Ÿ…meŒ»‚wS<Ìì^è;ðÀÕåS¹+MJ¼ÃóþcZ Ÿêb[nòfTs`J¬8TJI"­x¿Í{Ä,†Û\J×f¾½Xk¯g5É^Sb)Ó>¿˜þ0ÙAr*|N  P|kÚH}çkVeÛ”ú%äÖM±Ç”RGS:*öpáê°3}õ—§Ñ–̬&Žº•4†ï÷˜Åˆãig6niøià®ÔEª!ßR 5ìTäÔE%ªˆóWXbrI1Ɇi| Î˾D:¶VôÕ–ïW(;(“ÚOJì—(Ó50àƒS ¦në¶îÛ'ˆ0øö¦jÿÖ—”M[„²…8Må°EbÇ®1RÂ7}åæ»Ml;n}ʺZK˜¨Á1èZa ʹ®kÚU²kW}Wía¼Ú×÷ª8ºøýCûÜÎN†gÌYhTyÏu;Ù’óШ‚§PÞúçW*øÈ÷š(ïÄsyxÞ‡™v~¦áe‡¼©N–Øt ]"*›N°mힻʓrÕss,·ÅX¿³­€‰îT7/l=U_C…ïpƒZî9 (“aeF='ÉE¤”Ķö·*œ»Ï¨29<´‚÷Þ–gºOTŸú5¾¯ûOã+ìÖÂ*Íêýí§˜EˆÝ' !$úq¯k>}דy Ê1¦ûþÓT“†HÝw>=š!”³2f:Ú8ÌÔìrç ’b>¡x  XpÍ£^KëE×Åâè9Ü`ãÒ6WÑOûÆ*ÆŒ-ú„o!ùð×–ü°nŽ ªÌÿ]Çêì f1ä{I‰VÖFFE÷Õ¶8Ÿ\ªë™Ê”iæ`-°OÉ<‚œcÄÚ.Ûv”ÿ3Í º„:Ä%5d'R³¡ŽçJ)ؤµæ ÖÙUÇ1k5Šs2ƒd̰ ²CÌbÈ© Q}•¬ž|Ò7µ¾`å×óÞN{!jpƒ¯4Eº(Ρ å·r_$?Äò×t¡ÞíÍ Snj¬}?ဘÅ”¡ôàg:ˆùasÎÊH殈=ç›Xz:jÁµ!ý1Ò„÷“î³rŠ´„ÊÒ·^Ì/èüc±›Ú°MÀpŠ’é—ôÄÆfî=Ï/A[§yCè¹ßåg— , á¨N¸#ĹEÄÚ¾–D)—!¾þn³ÖœË¡'o}äÝ´bCNðæža7êÅÚðÐÔã×$ýÖ•NÍ~3\P3l†5ÅïÏÅaS\°!ò‹-4rIQ»bFaqòþ]¡ÃËbÀ1c)ÌÎiX!ë:;‚­U©töˆ :2¬´„0C%Ëöø2ÿâêÊESVg£8SP”)ËFñr&Š÷bsIsûò]OùPÎnטåR&YÂí:†œÙ®{1ŸQ쟚±3BQIúm2%â’’ 2'åPÉsù²Â32æ-viÎÛ…XÙ)­ÒÎÙ¤òd‹ãql¨Û¸rÉ´ xóÚá[-Y¬]ó˜}ZA¤a"™rܼnÊâ±+ëöŸ¢®&Üć5‹™'ŒwíKÜá-Íð †d e²NG¸Ðêàžä5¯ZeU—Ó­œKÃÚÒŠ)§’ÒÀ3%ùrŽ|óéÃS±)ïËé7‰og<ûÞ+yi“ž7ˆ!gÞ÷b>-wÅÙ0étìOÀ,èNÀ tÚ—Çã™’#Î$R‡;NOPqœŒCΧ[4N:{ã,èŒ3Ðq®Aú§˜Æâ ëÉ4äœi‚˜§7ó'L.¤¼xêg›rŽÈ6){Jß#f1äs¨N<á^lÉàñ¡ƒ+ÙW»jTmAN™êPc[ÉÞŸôˆY 9AÝ8"µs§‘ã&ÅÈÏažU×ûy]äãiPÞâÑ Î 6Ä7wïæÜf1âeíÀÈŽŸ^è¶Fm m.&},vŦ GL†®nžÔaÅp™ÀÓ[À,Fœz©ŠÈ°Á÷b¾ÒÄ,SN5ˆ`özk«Í§¢9ëäÌ"4· <†œqò^Ì÷¶Ûº«’ùùs±œ&8O1 瘱á›þâWøzõ\oŠóÄ¡N¥R¨”Ä#È9âAÌkY>¥µw“7Pl—›ãÙ%Îðep —x„8·Äƒêù©˜ÚƬ%ÒPЕÃgL]¾‹§-#F©t¥^\¨ô$ìÜÖ‰W/µÏ¶²ÛÐæ®?3yl`+Û§<…yBÌ#v„€â‚´´ï÷Ÿ1‹!'f»x«§›ßÛµ£“çx&‘ x 9C¼óÄëñéXE¨†’-†qIC¨3˜³r¨a¾+óãùv»þdì’e ÖQV¦´L9g™ æSéêXþϯBšwF"êäõ ¶X‹þYÔáKcSR 稱6©.>7…'`lBâ’Ž¾­êØPÇ}ÑÙtgb¤9Œh„?´.œIp9¡ÌbÄ Ê\Å|ñÔ‰Í&øO:%{\Ð2xä@ˉ] ]Q&Æ€¸¤¡á˜B¶9Ððì.f%luR¼é~Lj4TüL‚,ƒD¦à³q‚2ƒêË¢;tRþp$^kŸ9¹N*Ož3«cï8‘ŽK`ÞÉ>×åÄ#®ˆ¦_mS¢d‚·b=bCN­j ^ËÔiä×¼‡7ƒ´ –[6q3ˆkÓÝ :ú+A\Û¥+ANÂØÔÎÞbmÝî”A.ÁÑ ˜Eˆï aÙ ‰&ï¤Î^¢DëdÚupóºúà{V tk{þ.P{ôû¢Û@`|fÝôe ´_9]åASã•üκ£D{Ã¥î¹ã߇Wbð“þЗpûGBp‰nÿ }þ =^ä™endstream endobj 2360 0 obj << /Type /Page /Contents 2361 0 R /Resources 2359 0 R /MediaBox [0 0 612 792] /Parent 2305 0 R /Annots [ 2363 0 R 2364 0 R 2365 0 R 2366 0 R ] >> endobj 2363 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 462.3288 123.5271 474.284] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2364 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [150.869 462.3288 162.8242 474.284] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2365 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 78.3175 123.5271 90.2727] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2366 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [150.869 78.3175 162.8242 90.2727] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2362 0 obj << /D [2360 0 R /XYZ 64.9134 727.2935 null] >> endobj 142 0 obj << /D [2360 0 R /XYZ 64.9134 702.3869 null] >> endobj 146 0 obj << /D [2360 0 R /XYZ 64.9134 449.3843 null] >> endobj 2359 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F33 2063 0 R /F22 1606 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2369 0 obj << /Length 2815 /Filter /FlateDecode >> stream xÚ½ZKsãÈ ¾ûW誕«†~?r˦&‡­Te³ñm³Z¢ÇL,Ñ¡èñ¿Ð¾Ô¢¤±*›"›h  ?|ÍîþøW»rÄi®WO+-‰cB®Œ ÄZÊVÛ_׊ˆû‚QJןïÙºm›þî{øi%¥ ÊR½¢~¤px÷îóÃ;tÅ\é´Zmvwÿ½ûõ7ºÚÞÑÕOw”gV_ášá¬ZíRˆtçåîŸwÿèIb1ù#ÂYÆí8‘\Šd SÖ þ0ìùVã\uxQí7Õ}!¬XW-Ú Æ‚IS/ÑUþRj/µÜßÒ¸uõ­>tá}i)¾/ûnî n×”¿y ÞóC¾>WñÝ F>ÞJ­ÿ]ùÁ]xØÄ‡_ñÞ3¼^oî¹+7Mß¼Â,f]á œ£ìê&>ª‡)»&ÜzLƒñf|³}òK»ó~؆q[ôW¿Šöx'jæ'ûѾ$8 oâ-ƈS*DÓgtËCÕîŽýª8á°ú1˜žK)¤/€ÕU¸~j^à×KsÏ£;pîý|¨àa»ûSËùH.£ŠPÎM<¬Ó,X¹võFZQÂ8,ïQ´úˆ áʜ㮂0ayú= Ö^b1¢u¬!74¤b˜Ù+Š®úU4ãUÁˆŸÖüû#L—±\€vŒ%Ã?eä0J¤¦iÄ_Þ^^Û:+ÉBÀ§ù@'v¼|–hÃ]¡ÝV™ù¸%NP™Q|,Jh¢T?]c¿JAðÞ‡<Þjž|M*„SDijSÜq/¤YÈã,B@m3újM´“2矱’­{ãÇs•í—·>©ö¨uœïë3¦±Å4ÆŸ^•ò-¥æÞî|äÃEÈëP’riÆ´!Öô+¹àY)¸{²9ç ®c19zµàÎô†+Õ•Š Ìd&^…y^ÛfSmßRDLÄ2)‰Nô±uZ\2îмµ™ô5šÑ®™$\9öñôM‹±È\ú:È"熙½–õþ?9{©=˜¼ÆÞ®­ÊLÁÄÀÀ…èWDúá3R¹õá ÆÍ.ü~Åý»ÚÖ›²«²u‹Ošýð‡×—¹™ÕÄqiVÊáh͇}ÜK,Æ"}Ìà)Õb˜8VÈ£( °f–éÛiØK<£!‡…UÌÙ™Ši·ù+yHËOP~¸JÕ$_M™TÄX“Ò¢-û]ÖoİšÝsí¯ì¤6„;õ>üïR(ÜÑú‘P…œÇp? _79ªí„™î×›&­°ÕßÇr)×~_J…:Š"äÀr…P‹} ׯå—XÄ„Accùšà5ÄTPÀc¤¦#Rûù^pÐu׃µƒ7§-‚4åþÌÕf=ÃH¾*ׇ Ÿ'З:mÚ&Ð#Êô¿ëªÝk~x€u<b“8:>oåñOð.B.­ƒEmËÞ£øBçß•ÛP¬Ù:·HˆVihÚ;àVÑl”w™ÑvkÌ÷„æ%â®Ú.áïžÂ\°…CÖ¤ ×.øyž¯\"’Q+é,À?n?ž¯Ib1™ÉWnˆâ°cöî]¯~…‚E3ÑÒKùå¸ëç‰{f”$Tˆÿ†sFŸƒpŽp¨y7Ìð¼’V X×h›ˆ•šåá™ä´ïdÚÔÂ0;FK’A9+ß¾Eanx•¹!ß`³®2œP{Òïí!(¨Ô3H‡úͰ'Î  É«ê-*…JÔ}ZãÅÒÃ| ˆcsÈvHÚï§1(¸›‰™ÂÁ僛礲™˜qìö,8…¶Æ°/Ç ãB}>evÀS4t À*7›êpÈɌà <ÆêE·Û#ì%ÊÔؘ¤ÓîãØ)I,Æ"3Ø `Y7ÌìU|©ËCçH•Œ½yi‹âÐ*ª/¸·«×*-³—«Xï_ߺó/]³­ŸÞ6D m.–ؼVû[šÜ¼u7¶¹­^›COàqO¢‘Ëà‘$Ë–6h… ³—TcCxó»ê‚f€¤a–«ËÂc½/Û÷£<æŒXè…¡—æÄ(zƒÃœ ÎjRqCæl,r9ë‡]œ] # ÍÍÜjCV}»Hï%ž‰t‰[¤a³:¾¸â¡”ëïXñ“ù3…¶—KìªoG…Ú"ØÉÅí( <?¶tÅŸÅÏI¾š:åŒ2Ø/¥zÊ—R+Rm‘‚ P–3u°e)S(Ðh(‡±î`!É+¨€åÞh™f=É–BíqŠÝJ¹^Þ¢rœâ v•¢@”¦1r¥6¼„<åxÌ${¸8'O)’[éP~ŒÛ×°òõ>ž%h˜µX8Kò±ñæÆ'Mtd}(ÔoñxqŠÇ¸_âDp§êÔDêô— Âøº ¾Æ:ˆÏFÜéegÜHŸJÀeEÙ¢<¤9<…!üˆgráä{pz\šõ×çÄaÆWËø¿Þ¡Ñ/! «4I?žþÖ»tðÛa(«Œ‚–¥Šï<¶i®2ÐÕ6ÇQ@‹»µ<Ï›*A84ÑãcjéO'Û¥Ë"3a[NŸ\wòäÚ€$Ý뽿ïzîdšÊ4¼ŽçÖÊ%‰ÅXd&ìbúª~ØUDêßê]–®äÓàÇE¾`7ë¹î%ÂR÷´æh:;U Ð17˜ø¹DÊôøáCزpI?\½ñ ØxâÇ1æ¶aÌ,pO‘d€g岞^Qž–¤«:bm¤”×ãnžË¶ÜtU»ØbmdúÕB'§ˆü<ƒŒ£V}üd —XŒEf6OI‰VÖ 3‡“°mšiHRÊT²Ü\ly½?¦) h¬™¼§»E%c‘9ŠP*µf^^؉Œ4ü†Š&‰çUÊ‚’3EókƒÝ…C­VêrR¯üvL-@LXX1€”Ù[|%c‘9rA@yÅhLÃ{_wïËì핉¸hô­Rpdôb FS°ÞwÕ—|ù™™}yîŽÓp0ûVÑ=2{1º³ÇÑ}ÚlÆxöŒk#¼kš£ŽÁ”’ß0Â{‰g"\2K¸¥vá»rÿ~ܳ;dJí uLÏé(¡ÁÔ3‡,,_ªC®×4–P%ýg#°¦Ê ½¦?2‹ÐûpâøXÊ…¼d€Í©Ñ°5à€n°5F‰ÅXd¦ü @¿Lºa棠*=:=˜}Ù3>È¥#pùͬí%ž±–#ă³k¬Mp´lãW/û¦¤NzE„…ï! êt ñ±llXâÇRW鈿ZLø ü}æ{/h¿÷Yâ.(ÍVÖhúqò" ,Fsì…×¥èç=I_ ý#n¦^’·¬¶9Z1>ÑnÚœyÃ#ø_w1üZÖÉ> endobj 2371 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.4785 574.9066 158.9498 586.8618] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2372 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [186.2918 574.9066 198.247 586.8618] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2373 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [212.7204 283.5479 235.1918 295.5031] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2374 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [262.5337 283.5479 274.4889 295.5031] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2375 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 71.8903 123.5271 83.8455] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2376 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [150.869 71.8903 162.8242 83.8455] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2370 0 obj << /D [2368 0 R /XYZ 64.9134 727.2935 null] >> endobj 150 0 obj << /D [2368 0 R /XYZ 64.9134 702.3869 null] >> endobj 154 0 obj << /D [2368 0 R /XYZ 64.9134 561.9622 null] >> endobj 158 0 obj << /D [2368 0 R /XYZ 64.9134 270.6034 null] >> endobj 2367 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F33 2063 0 R /F22 1606 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2379 0 obj << /Length 2617 /Filter /FlateDecode >> stream xÚíZKoãF¾ûWè°@d ìôû1·ëYL€Ùñž’‰¶´+‰Eíüú­ê—H‘–ì˜È^Œ[ÍfuUw=¾¯›?\_|÷ÞÎqšëÙõÍLKâ˜3#(±–²Ùõò§¹¤—wFš¹º,¥tþþ’Ûù§K6ÿ ó¿CãûK+æ×—…Ò?xM1ÿëÕû?\øôñËå/×?^\]_°…ì0×D:­f‹íÅo?ýBgË :ûñ‚ãÌìÚ”gÕl{!• J ‘z6_.þ™IbÑùšÈÙˆÚq"¹ÞFEA[,üÇ_ _/µœ—Ø»¹/Û56êØ–V ؇þìXA‡eVºŒbÊfÝâ³­Ø®éÐ×T{lï×iâÛµ7¦òƒâ$Íz_aKÏÛ:JNŠ>zª»Þ)å&ô'³’b$¬ìÑaI$…í0”ÃÚà’\5`ìuÕl‡‹Wä¡° Ä)pU¢~\ÌqòUÚ7õ~mj´Á/Z´»Å‡6ÛwA>ç •„ c£*Õ×°#°*GÞÉ9ƒàb¦%ŒÃnÜÓ»`ðOæÿ„ ËÓï#ïÌ‹®Èàž]9W„rª3{MqÑ~¦ŠŽ¬¯`ÄO{XÝ˹ٙˆ£@.¿%R ‡<¬ª¦™[b(cÃél_%êdµNÛýÛ»r[õMس6í,ØŠ!ÒŒù£Ð¶Rü‘éa—qz Žfhk]r4îGÖ7Ñi˜ìÎ CBZáq™YåØ óÞlê²=v,Æ4QÎcX®{³ce‰EWäбsÄ£3{“¿V (ú0bw! FCœàöÅ–¯wC»!²Á3SNÁµx»ÝIbÑ9b7¸ 7Úf>c7ô\Í^köýnYݬwÕrl1c³ø#BŸÕTJ¢„“¯Öô÷ª©wHrØ3¡c&güRB\)Æxß/—ë¯ëýXlBYðwÈá…„Œ*Eí³ÔÄ”=ö#k -¼ Oǧ¤°¤FΔxÀÞž÷³À¢#qÄK¥ Ú(ç:iw¼éÓ”è~›ã&zx´Ž?<à ›ímh¶É:vàèAáqz[¸0²ŽîõŸ£ª{ÿÖ¢Ç" êõw ƒ‚óÀ:~~Þ•·1ß ãÍÍпǵ ð„ôÞcY.²¬ÏÕ¾¾oU"U!sŸ U**ä£vž-OB°³Ï¨°• ˰¸o¢sçàî<±ÿíã¿ÂÐø÷6õmø‰±øX"IØ‹(ãÛ«×5ñ¨<¿r» â#ùªýv-‚¨1l œXçy’bMJežáÜ _£u7¨Â&Ò£5*t3‹…zd¹ì#_ L)+½g2+Ö¤];ÎBKI@Ë{söH‹®È‘ìN†x?zeúܱç041\žaM-üƶ*Q«Ò‹j«&LÕ¡dQr8s¡"/;ó·?a¸¿ÆÂ¿éæ§<Ò>MÚæÜ>KÑÞp•Å;WY]´>FÔž¿Æ’PF¢`Z3ºÏ_CM›$v½Ä¢+rRb€ãk…×%Ý<4Y‰éW–+Ì^lý"ls‘yÉ÷ÛµF¨åÓ~Z‚mè>ªµÐ³À€ÄÆÑ)ô)Òð¬ô‹ôE·ÞB4«œå}Ø¥óÑz(~î!þ½Í§|Y£r³‰”û}¬‚é«„²ñëµÊ+´«¬ž?×8T"ÿ…·³Ž7he½;r ÜhÚÇè¹# à›:¼X5e›²”T,/sµÅ­=!‚ ¹òO…<ù:‡S¤Ê‹í›A ½'£„ë|ø¸©ñ(qc€.AôRJ$fš·æ$°èJ¦ > endobj 2381 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [84.3959 533.0636 106.8673 545.0187] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2382 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [134.2093 533.0636 146.1645 545.0187] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2383 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [84.3959 393.137 106.8673 405.0921] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2384 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [134.2093 393.137 146.1645 405.0921] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2385 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [84.3959 277.1207 106.8673 289.0759] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2386 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [134.2093 277.1207 146.1645 289.0759] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2387 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [84.3959 137.1941 106.8673 149.1493] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2388 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [134.2093 137.1941 146.1645 149.1493] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 2380 0 obj << /D [2378 0 R /XYZ 64.9134 727.2935 null] >> endobj 162 0 obj << /D [2378 0 R /XYZ 64.9134 702.3869 null] >> endobj 166 0 obj << /D [2378 0 R /XYZ 64.9134 520.1191 null] >> endobj 170 0 obj << /D [2378 0 R /XYZ 64.9134 380.1925 null] >> endobj 174 0 obj << /D [2378 0 R /XYZ 64.9134 264.1762 null] >> endobj 2377 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F33 2063 0 R /F22 1606 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2391 0 obj << /Length 2112 /Filter /FlateDecode >> stream xÚ½YK“Û6¾ëWè©Ö‚ñ˜Û¦vSå\Ö[™[6ŽÄѰV"e’²=ÿ~»ÑŽd'Ú”«<$vý@÷×ÔO‹÷?ûeÆ2+íòáii¸g:ÓK§8óž‹åÃî·•ëß~Yüóa!–þ‰¥Õ, ¶I Û­Yn‹O‹ß~çËÝ‚/Ypæ2·üל©Ì›åq¡bF+•ž¿.þÝ Ü$‰›±ÈŸžðK¡™ÒV"À´Ïf’i©Uh×!¤Y}làbUÂÿûõF9»Ú•M÷Û®Ä?Ÿ×J®Âƒ×õ*¯vxaVÛŸV¸ÞáUî“Ŷ ÎÛ®E—8Á2c8¾Ü(ÜõŽ`1Ü,zp$0ü¿'±»€éM€A…£ø p Ö&jƒÃW>j‚¿»óÄâzWÖIóo ï¡ó‚ã¼FÇÁ}‚öy-ýª@Ÿy³Ê1îÉ«ªî`WŽ ZzVVmx ßîÂ:Ø+X  zÚ-„Ú¬Qô¸Ð‡¤ð ßhh¡{Ž;Âîúx* ' ˜Ì¯þu¡Ø±Mx_DŸMuð6º¤'¸äÜ^©U‡.U€ö´ÞHÝR>½€¼c*è‘k!c3 Ù,,ˤ#a`‘{„xÅÖî™LAM§à&T ›® ¾€çõ!jëãdgØH oÒ »}Y%'EƒÐU´í9 jës“R¦ 5 ›1q/7J†´êØøT£¾#êË;RH糸GõRa ºü+íè“®›"ßmº>øÇt°UL·Á:5I´(š¬K–~nËjO·Û5„¡æÕ¾ÈèÑÝXb!Qwïƒ&¾Áißœe•âr@v)-1bcc`í@Åãž!ËIÙ¾ÎÓÓð˜Þ_é`'CCÛàJµéÊcXe3õm#áàp •c’7)s2¾!Go@ÁåÜéˆt÷RåÇrû^ÌÉN['UïaÙUç´õs±hgTõØÆ§:jÄìùÛ©)våÞ¾ì—Âkf2å—Z:¦¤Ë^7ÌЩcŠ,“Ð1ÊËtÑ/{‰›±ÈÐ0'˜…wÌ)9(¦l 0ëÓ4Ô½Mæ ¯ÊTýÄ1M¦œô÷4m$òŠii×Ä´Kœ¢¯Á÷ÃÙK¼S*ÏŒãÙè¡l»ÁýB{æ ì™´Ÿï WL gÈ+H»¾1÷Â9 ÀUœCÆ@ÛâÓ¹¨¶E ÂeµN1kœ™÷íëàj§WMrÄç‰ëË0~„( Ç× æ4O·}?TlÕXÜCCwŽ:h(ªÀo©½ÁÅ[,€V¿à#|¯nSwOïÄR z¶±ÇuGm'Å3¼Xfk#ô;›iñ£¯m„j-x4ö´–D摨¿ ²ü˜,Þ„Óš¨8šÕ#=÷¸çGpyQÀžƒ•Í’YXÑ|uÌÿïˆ9À#ÔÞÑ%±½º N+c{ÅjÙ*?tEC— XÛ%]±%We‡2ëŠöƒ›s $¹“Ù-*®’“øK„± Dî DQ5űF.ó9¬ïéá6Ñ—üÜ&¾°ÑV­~^N¯†XÔä¹àfé4ÓÎN«TP Lî¦"o4Ò< Äœhe(’…1 ¤ŒÜ¦·0¯¨Ï‘8ìf‡3D/l¯y•ï©Ä:צ€'ÁP¯ˆï"q„- ²¼'mÃV“’xÅíi×·ùý^(Ç_EÙ{~Œòæpkñ  ÓÓý}ÃíeEx»U[mžû›³­P£ÙVȶÂÂÕ97|™N·ðúÕéV¨Ô”iŒC®ñÇ€WõÐ2㜿E¹ôãpä’ÃÖ¡_ÌëáG ­Ìëʸ²8{] _ó¿hH—]¶øúXø;?ÕâJWÇ=•ÿÞ_Oa‘ž‡Q¬çø-=›Ÿo‹ºLߘ^8$£HÓ zAZIUà&ÀWǺ)Dú! ¸úzìħɨ1î¶~ ›F3'Qm-™öÕ'ÑÿÇ$ Ù=7†buùø! ›endstream endobj 2390 0 obj << /Type /Page /Contents 2391 0 R /Resources 2389 0 R /MediaBox [0 0 612 792] /Parent 2397 0 R /Annots [ 2393 0 R 2394 0 R 2395 0 R 2396 0 R ] >> endobj 2393 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [397.0851 335.1828 419.5564 347.1379] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2394 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [446.8984 335.1828 458.8536 347.1379] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2395 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [228.9652 18.585 251.4365 30.5402] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2396 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [278.7785 18.585 290.7337 30.5402] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2392 0 obj << /D [2390 0 R /XYZ 64.9134 727.2935 null] >> endobj 178 0 obj << /D [2390 0 R /XYZ 64.9134 702.3869 null] >> endobj 182 0 obj << /D [2390 0 R /XYZ 64.9134 679.769 null] >> endobj 186 0 obj << /D [2390 0 R /XYZ 64.9134 647.8969 null] >> endobj 190 0 obj << /D [2390 0 R /XYZ 64.9134 496.5729 null] >> endobj 194 0 obj << /D [2390 0 R /XYZ 64.9134 181.9123 null] >> endobj 2389 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F21 1557 0 R /F14 2010 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2400 0 obj << /Length 2464 /Filter /FlateDecode >> stream xÚíËrÛFò®¯à-`­9Æ<0Ž‰í¤”Ú’½‘²9$9@$(¢$d´Ö¿ý˜|É^k÷”ÒƒAOwO¿»¡î®^ÿ˜Ír‘[egwë™5"—ÚÌR‹,‹åìnõ{dÔ|!­MãÈÂ"ŽãèÃ/s•Eïÿþþ§ùBk½½þåÝ\FoàutwýÏw·¸­¢ïoÞâÂDoÞßܹ#|€ ßÑ›[|‘F¿¾¹»ÿy÷óÕ»»+9‹áOÌ(+Ln“Ùr{õñê÷?ãÙê*žý|‹4OgO°Ž…γd¶½2‰‰ÑÚïÔW·WÿãbŒò‡sB°¹FMB¸ÛTðn³hUµÀx‰7XöÕ'¼V‰oò¨ÛuÍ@Ò–K*Wîu¿ás¸^•ÄÒì`£ê«fLJš5ŠàõJ¸‘y&L–&päãC[®j̲2"É¥‡©¾1Á®Ù·K·FÒµ¿ƒ˜/“G·lìŽeÇ»¦g²ÎÊÑkF,°G_Ä7èÔ|xêWÈQÁ¯Ñ1½'±-iöؽ=λØ8ÛÝ£†1ªX‹„ßdÌ9n¯Àr«ÝV݆÷mˆ#¸s`Uދޮâ`‡4Ò'Lƒ¤ñÞ¡Dãkz²ÁÞé7…?…ÖÇËmCöèXé_Ò«ÏÞfûrKÔRŸŽ­×€,Ò8ö† ±.ôZÑ"@N|é´Æ´Õ!ªÃ²ð¿üó© N…¬êŠTòÀài í°F¿À×Íåú¼&-ƒ _Á‘4vA®4ÈÐÑT'ŒcÌØ¡6u´-þåînQyC9ºAíЭ)_nî"ø<µ¹KÈ$Ó”Å)ÃÎïðë1ÒCÓo0à’ò»Ã€‰²ÁôoŸ*bѽáM^Ÿ¶Õy€%#…ßfW;r§n kDD7>‹µì¾änƒ:hÇ9) ³ÁtE*opË_רPü­zWH@ªIS”Šœ[~ÛxvJ‚'¶ìó«½»;ô&‡ÜÙ-›ö‘R]f ™’·ç·áP‹DFnJlzš­£ôà8òQ͸æWŸªÎ»IÖ¢ÀüÙU¨¶7!Ž7„¦æüžc?<¶T4|ªVc}À9.¬‘uÓnƒ#A®¢² ކ*ö®oßóf[®KúO§0àW§BÙŒs¨™!I'"ŽSŸO·X̬«ºôAiš=0ÔTìÈrñ>ÏmTn}n­ƒ!S˜X-5àNfé”&zÓßCÁwаȈ'ÆÌL¢„LsܱPWÂ-‹Ìs-‹RgÊ?4,ãbŒ’:–£&AæP¥0î\íBµ0@q&t €kùêû™X(eÇ Þo„òÒý<Øä~‡Œ*“ˆ,‡6ðÅ ŸaT™\ÄZÚ)£XêŽtä`ZÒ~£Tî1ñu0ByIì uðRŒŽtp‘ÑAcF»ò#5^G%uf„”@|âùoËn‰Á·¢ØAáô8fÔÓMbÃ4P™Â[úÆŠ2lj¹*Öi“ϣÏ(”PæÞ§}£Œ‚›¨Ö¨›¬‹RýFé}Ç/»ýÏlø©àJÊ¡Tƒ‡P­A†ôÕ,AjÍžJ~¨êWLž*äÔö»jˆ²œ˜þž“$^=Pu x0 C¾ÿÞ§¥¡ls½¿kBóÍ>þ<„ú’‹a­ûq8Ç 0¶šø*’Îg:×çñŽú»ÚA`MA…À™\6Öÿ×÷a®¯÷Éó¬bxRÒº!+ñ¬ZÉWäÛäÙ| ÍβÙõÕþÙwÿÇœ;¡{9&*è¸ó4É‘‰Ê’o5ãbŒòD¨‘9 3>—v¡ÝW¹9l•þ‹‚ˆ“T›—¼áå…z¨ËAßZ‘I“¾ Ÿãs|ZX'*Ÿ2zx3 ¡Uþj™°˜,^P #”ÔࡾP /Æç †Ë|5Œ}.÷ª"ˆÎ“oɽú´2Ïç_+‘)éã\÷ÈýÐÒ ùÜ«ºq Í^Œxqf"npžã®fhº­ËOG¾E]N盾ï>.!˜dF=÷E@[«ÇÕ…áÌo\æ'¶@X”ØñÂ$3öHå¤òÔœÔ_ÖßaßâPÐÄytSlKHú™ÆŒB©¹ ƒRv’ÖIïFѧ§©©F'ùåË‚í¦±/¥ŠÖÑä¯Û’{v2¨eï[\¥jd$ ©¿ÃhœÍ‚Fƒ¡è 3nZHGpìÌ©hÝ5Ÿ6ÐûYt",§½‘Œ})2îªÃ·›q!röó€ûR…uÄé/ˆqCjj~:úX…ݽŸÁ:Ìñ]åFpLæÌg++b£òçŒ2§¶úº«ƒh¡ÍÊ@v}!ùë Éÿì WæÐîœò(×oÝùxï(ÿY»¢Ñ4 _­†0ºßºî…º«¡ñëÝœ4 Cÿ”‡þk¿9´bÓl×ðï².‚&Èš+…£ròàsnj­ÍÆn |ö‡–?÷†¬¦ùªsÕSƒ ÂIKx–v–O»ü7¸^4Ï9·²£ç =æÎ`u:ø#H×ÿâTƒ d´:HzãˆÏñ«+»~uÀæhÔá¤ýÆ—b¤endstream endobj 2399 0 obj << /Type /Page /Contents 2400 0 R /Resources 2398 0 R /MediaBox [0 0 612 792] /Parent 2397 0 R >> endobj 2401 0 obj << /D [2399 0 R /XYZ 64.9134 727.2935 null] >> endobj 198 0 obj << /D [2399 0 R /XYZ 64.9134 521.7118 null] >> endobj 202 0 obj << /D [2399 0 R /XYZ 64.9134 312.0649 null] >> endobj 2398 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2404 0 obj << /Length 2792 /Filter /FlateDecode >> stream xÚí[Ks㸾ûWè¶tÅÂàý¸nåµ{HM*Îiw‰«V=¢´Îä×§”(r´F©ÊÉ4¾îþÐh éïï>üÙ.qšëÅãÓBK☠#(±–²Åãæ§Jv¿d”Òêã=«Í®ù|¿BT›-þ®áeµ>n»ç¶ªÛû_\H)ˆ²T/¨— ¶ÞýéñŽA ]°~"®‰tZ-Ö/w_î~ú….6wtñã%Æ™ÅeΈåàG-9L*ÕûÍ’$.s‘#fA”Ú¸~æÞ,?SEÿðz¨7Û5¨xŽ™3Ic¢æNâ fÎ ÑÒ©!æíÞãlÛû`ÐÀ $Qßèáщ’.ÈDN¹ u»Ý¥0g.˜ÄÜ» Çܹà¨VD(Ê Mç€jK¤µòܸí1£‰±DkèsM˜%\JV’&™È)š¤n·Ó¤æŒ&“˜{šä˜¿&Å€ö4™ÚÑ$ÚÖ_Nõ~]'ªœïœÂFkTŠð[¬Ûõ¶†­ß#ŽÛf?²7P,`¥b‚kNƒTÁÊH"©}€M—¹Ä¦Q [%x·ë6dÚǃÿM2ÈŠ4Q”™˜´¯÷KÌtÖh Ì€~¦LÂV¹FWÇçÕŸTu„7Ïuh}õy“¶öéÒNhÎØáí¹ió¾‰ò¾e»‡&Ÿk­Ã¾ óS`Óè­Ñ\Ù»T ÖV.vy¹ç¦:yq0CÔà6 !ε_ïN›UðQF‰Š<‹2Ÿ0ü 㵓ÔáMísÄ$[’‹êñ Õâ4<$Ñ]2Þ5ýã©õžÐ|» õ žÓÐ}h\7/¯ÛÇü9¢h‚´åj(<³‰?}OñÔ’ÉÓ›8 >ï¼W~bÀeÙ4ðw‹¶B· õ"㜾 I“ÃmžÀìÚV«ðçs¼?_½À‚*¬³*éª<_êîýzÐTÛ(2ó’6L"¬J<ÿüº[ÒFY—ú óP&àyŒM°É&¼xÛ‚æA“ˆ½A‚ûøÐ4áï@£®‘¸ƒ¯Û´ØþýáE%R//à_õút\}Â4¶Ž;¡ËuÆQ\ómâ‘‚U‚À8IØLª°WŸk|Ç+Î1<ø7ªs(¾á‚´jö»¯AêÅâiC»Ž”ðrQ?ä·À~ù×mxí!`¸A «CÔÞëÕ.ÍÝö)=úÅ’ø½!C ýµA•Þ06Ô¿eÚJñäx1b£`|µoŽ¡gg‚c Yó×ýê%!ÇчyØað0dzëb3:Fì´jæ7Ú*Ž\µmdÿk£‰ýC÷—ú¸Zz’°±•ze-"U0ÌI a®çe½„¸Ðp|ޱ Ç ¾ úõ€Å¶Ã¶Ç(« Ãè£öIdÅç,Úa÷Å/°“·,˜þ94¾vçûnmÇ–°ÛKoˆp 1W5‡M+€ÓdN|ëE6ùŸ/ø|Ú·¯aúÆM[)ºwëWdÜŽÆb•ôBÓ[œ"ŠðØg(@i#¨n‡óÍá&ÑáÉ/?PhÔÃ’ÇeÚº9¬m}ˆ 4û‚Á s¯n† 0…a°Ï3Ë»<$>ÙŒ,èöî¸çXŒ)"¹Mß=|÷˜Ìixº·YE鼆‡¨%Ë™ÄË6äÅÇ{ eÉ[¯„…°ôõrî³ìñ/ûg`áGœ/¿uº\'ch(&'ÄBB?¸ã1³w<ŸNÛÝñò„¤‰¡ ›p‚P›ÉûOHQâ29vBrÄ p\×-œ6>Ð¥9…\rÜ ÉØÊ1 *S“ªZØã%UUMçTµp°2Ö\¨Ê®ª*ߥ*—RêÊ©ÚIœQ•KgMÇÎU½@¨4ÑÈÍr“Ä9„ÊIÐáÓf‚wïs†€ã·”Æ–Sµ“8£ª€½²zÎ=¥(0Iœ(üv§.|1~€‡«uŽ¥;^õÎ;^1+œñþIï-Pëý±"I\æ"Gb`3p2ígî&€ŽÌè³Sé´Xó0T•Ô 9¥Aê4˜¾öbÖ¡œ.ˆ7IœÃë‘×çïå5eÀj\v7XŸYLDIëg"§¬ŸºÝfýbx{ëOãí¬?Ä{íÒQ8˜ÚIœêw@¡ÍèÙÝ´â°ûAŸ[B!IÖ”•dH&rŠ!©Ûm )†·gÈ4ÞŽ!C¼³ )4cÈ$О!9ÐókéßÇî0—/Ä3‰I½Æ3†ªrð’ÀxTZ²¼§xu ‡5†5[¬k!ýΖ4o&rʾ©Ûœ‹!ì-<°3qŽði®xE9fœ¬ÞNâ ^N1ø¡À™E/wq¦ ÄÜô~é©,™æ"§ø‘ºÍñ£žÓ;~ä¿¥ðfü˜ÄÛóchÑk»ˆDÂÁ¤Î(p&œb•|ó,Ë€s®øM †S/N–dp&rŠÁ©Ûƒ‹!ì<°cpŽðÛ\ oÆàI¼=ƒ‡cp1œƒ§av ÎaÎç1ÉÓµß_ÝV—××JwÜ,8AÅû·¥$p™K¼4†“Ä êúyûE0¼$†÷œK6W‹—Æeõ1üËñø<(ÇoN‡¼*glV†H¥!iLõth^Âû}WȀϫ®òYgÓÖ£eyG¸š¼eNj­(gÿN⌄p\ë[=à‹MtÃáëþh™P_ E¾P_+b ˆŸHG”0â¬êáë­xѯU(¢½ÉÌ8"…嘜K¼Îä®Wh¼þ…‰Ô„3©²ªº®j·/‰×»Õ!´›{( >Vzò¦›«PZ)fNâŒA8wg‚è3‹¤{䳊w‚uŠÜû1êíË¡¦íª,P+@ÑV±”î®}k߯m|dzªzhÍkkØbÑ—‡C¹ÃrÚYnq¥9¸'ñ†26j^Ïþ‹Š+U®XŒ{^íÂým_ŽåðTîMŸaU9IÁ˜†µÁí•öŸ_„òïH©c†änîû!8ǧJÓvŸ*Ú}¥¹mN‡u|޳ïâw*Á`nÁrü¿Œ\¬ŒÌÿwÊÈ|¢Œ,æƒ<eñÿŠ…ø^Þõû\ÉÖ)G˜¡²NÞ$4F!Ô*#slO#Œf 3iíâÖt¨Û×1_à¿!ƦËÅ¿6,§j’7­ª…$_ 9ãXV±béäMcƒ\ÊYç†n˜É É.ù>°û˜˜ X̶1 0ãIvùŒ«`Ì Y#‰›4†œpÆ/õ_䤄¨¬+¥h7©¨ 7gŠþ>¯÷™ ñ¸>F\=]@¦ÑKiõ ·)Îáî'YÁC^&ðzàLf"g)p}èœD×ÅÎÞhð÷Z¦óóÏØî:~0ÂéâÃSlă à}ZBòì 4¸P/ôp«¼ý‹+yóWm—È¡óþ¸: ºendstream endobj 2403 0 obj << /Type /Page /Contents 2404 0 R /Resources 2402 0 R /MediaBox [0 0 612 792] /Parent 2397 0 R /Annots [ 2406 0 R 2407 0 R 2408 0 R 2409 0 R 2410 0 R 2411 0 R ] >> endobj 2406 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [102.0301 535.0561 124.5015 547.0113] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 2407 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [154.0358 535.0561 165.991 547.0113] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 2408 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 211.8169 516.6856 223.7721] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.8.2) >> >> endobj 2409 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 199.8617 99.1185 211.8169] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.8.2) >> >> endobj 2410 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [242.9167 68.3549 265.388 80.3101] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.8.2) >> >> endobj 2411 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [292.73 68.3549 304.6852 80.3101] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.8.2) >> >> endobj 2405 0 obj << /D [2403 0 R /XYZ 64.9134 727.2935 null] >> endobj 206 0 obj << /D [2403 0 R /XYZ 64.9134 702.3869 null] >> endobj 210 0 obj << /D [2403 0 R /XYZ 64.9134 415.0686 null] >> endobj 2402 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2414 0 obj << /Length 1705 /Filter /FlateDecode >> stream xÚÍXKsÛF ¾ëWèHMÂõ¾Ióžd:¶)í!É¢(›3”¨RTÿû .EJ´}°:ÓñAK | `?~»˜\}Œ§ K¬´ÓÅzj5K„ÒÓHqÇ\L«ïÖ³PXñÀ‚sÜ~É8¸ùíæÓ,TJï?ý0Á;ø,>ÿñaޝeðæú=.tðîæzÑn¡ Nò¶\ÏñC|{·˜Ï~.¾L>,&bÊáOÁHËtbÍ4ÛLþš|ÿɧ« Ÿ~™p%ÑôXs¦’ØL7m3Z)ÿ¦œÌ'¿w C¯1ì«|‹NbÄ 6‘LK­œ, QÇ6ÈÞeç‘#(Yl³ò°Ê¯D+ÙWzÑ<¬´¶nÇb–Ø ß ú8¥ÄEÚäûS°qk§¡Hà¤Bõ-þà†¿J›j‹Qã'›µÛü>ßg5X-œù¦¨¶#f9lVà®O ~,Êüh¯ŸLxOqÛze¿›…y†f °÷ƒ G Á AsŸ6¸2°‚O9½Í lirÜË$h…ªµn%oaS]•Õ½ßW<‘3•9Q4žÈá¾4L™Èxø÷iY’ö%$ò‹-Ú;Cu“¯ E¢˜ f‚:wßÕÆÉÞ¡%¿àL$‘‚X–CWíaÓ9d,áä¿ZûöwEîqþ×`ÜÜ1ÓDÐTíVD€‹GUVKøÐ¤Å6_Ñ‹%zøÖu¾+ásJÑ"ÜC½+ŒaMálŠ¿MÞé‰I8Š;¹Š‚8ˆ§ƒ²öÊét2V½¢¿¸÷“¤h@€³±È­2Rë§ËY"…—a#Ä+öiN÷jžÙ‹D·?]î«òÐä§ì% xq…Ø2 —C}‰’q3QL¨Xúçòê†=D^t2f8¶³‹ ×­#u¢XªËô Ÿh$øŸ›ÀmºÉ¯äy¬”f—IëëuUSýÀÜÛ®1±ëMê(˽NéjV‡†ž]öáÂ]ÂJ¹ô½ƒ¤‰­‰"µy:4“ÎI2H‚{—ÒÙI'c€O¼¦ç]z—S-Z ]²ÑâÀ ‹‡d{;ƒZZÕMº,\e(š™‚ÓœãâÃìý<¿!ãÈEwUáÁßVŒÁ5 RÜÆzPø’g _¾Ýêóy¼Ë±SBD¾÷ÆÆDV̪¡õþ€iCíO…n¢¸Â¯¶«º(ù ;âo´îê\¾X¨àÏû|K;ºŽ"ÃÎùž^¦ô³*jß dǪŒú™m›‡¬:ôjq·§ÅT4í£àÐ/™Äžáâx'Z^¾s¯±%–~ü·¼í—®«¦WÐg»•jÖž ?3 ?ÁG2ZâŒ/NÕîJÝ/Õrй§T;wS‹m“ßå5#MðªÚå5\ÞúôVAµeF@ë ²—SM§0ìi<¿U’Ç̘¤¼ yV¬‹#j¤›3Ä0z%ÖêË!ö ŸA |uן;Tñ¬@_r)x§ááÔ €nðÆüB4À_  Wø @,¹"V€e±oI±är¼¼ Ð•¸­‹ª.š‡6¹nvó“t»iïÈ8›‹8‚ŽÆßÜ—M^w¨ÄvÉJ€>v~$òt—ޤðiYæÀèmq_Ð|ˆ»|…kÏW¸±hÍ8¿HèàŠÅŠ>¤­€£²ŠXlÛò³G=àg·ApÇæŠ'džó'Øåüü†ë ¦^?þáÞÎ °^"¼¢lÂbKÂ;7®Š,mF§nh‰ã8g|yÒ[s®Å£½5˜›¢]oͱ¹Ú7× Ê85סV6xCòÔüï¤[­‘ÎÒp'B‡rç7èÜÓÒú•»výDè< Ño*ÚÙÙûÁ…9Ú ):€C(÷Ÿú¤Ý\ìD`Ͻ‡á³èXÞ¸V[AÙ†M±i?ŒŽ'Š9ê×$ƒëi›Oøÿr.âÙҜݧõyÿŒ La¨£K´ß­Â°§ql(A ·¦³ëVÛ¿h >~>éº ÓÔÅ^𿆣^ÄWëãÑË»o¯.<êñ\gƒ_[¡¡C\ŸƒPÓ¬9ö Ý Oãxˆ÷¤Rjendstream endobj 2413 0 obj << /Type /Page /Contents 2414 0 R /Resources 2412 0 R /MediaBox [0 0 612 792] /Parent 2397 0 R /Annots [ 2416 0 R 2417 0 R 2418 0 R 2419 0 R 2420 0 R 2421 0 R ] >> endobj 2416 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [406.9125 547.779 434.3652 559.7342] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 2417 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [461.7071 547.779 478.6437 559.7342] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 2418 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [351.7088 166.0152 384.1428 177.9704] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2419 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [411.0561 166.0152 427.9927 177.9704] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2420 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.3751 154.06 408.8464 166.0152] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.4) >> >> endobj 2421 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [436.1884 154.06 448.1436 166.0152] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.4) >> >> endobj 2415 0 obj << /D [2413 0 R /XYZ 64.9134 727.2935 null] >> endobj 214 0 obj << /D [2413 0 R /XYZ 64.9134 702.3869 null] >> endobj 218 0 obj << /D [2413 0 R /XYZ 64.9134 489.5872 null] >> endobj 222 0 obj << /D [2413 0 R /XYZ 64.9134 296.7681 null] >> endobj 226 0 obj << /D [2413 0 R /XYZ 64.9134 95.8682 null] >> endobj 2412 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2424 0 obj << /Length 1814 /Filter /FlateDecode >> stream xÚíXI“ÚF¾ó+tåQ»÷å'qʾ8)S¹Ø>h@èJDo¿>ïõ"ˆk8$U9ÌÐËë¯ßë~˧~5›¼|m3Gœæ:›=dZDŽ̌ ÄZʲÙâC® ›ŒRšÿ>ey»nÖËi!„È5ö+˜Ìç]ýyÊm^m§Ÿfo3)Q–êŒz©ptòëlÂ`„fl¿×D:­²ùÓä¯É‡O4[LhövB‰q&ûmJ„³*{šH˜Rˆ4ÒLÞOþè‹„X !_¡œX¨'’Káõû¥ÚÎ[°¥FS6]½^¡¾°’VÒ¬àSé×ÌËöØ* ;kàÚÅ„;µÊkÌbÎq0K&,Oý#£`1D F U³Žh §ÝKy׫ÏU»c>RE߬~…礪â*·ë°ã,:ô&1Ö¨xweÓÊ´ÊåÝ#RÚó)79ö˶œã¹ua<¢€­Ñ‚Gø!˜Ûb=&=ÂS¹Þ¦^Áÿ%™–Ó|öXǽxm qYBÃÉ$äÁ¿¦ ï{3”H# ´qJ/žïºj1-¸“y¹Å_4ZCÛz†SuúuìW«ùzç‚ÓH8÷Øÿ¹yÙ4¡…DZŽÍxlؾߡ-MWÔqÇ Àá7´ìªÏãœÄiodÌó„P\Oi¢”µÏv½±Bžú @¬j³ßùÐù^òSÓŠhgM´Ýs›²HºC˜$Œß…+ó O7ÊýºM¹Dw`,g”£/ƒicòŸÂ ¿ÝoÛ®zÂ>¿àP0é •Mr ì-«UÕ–Þo°ÛÅá69ÜGÊTjÏ»(ô•J"nF×øKA,m¹¨Û=F½W ½!î·Ã)ºú)j;8±àóôðdÂ1bŠVJ"ïB7™2çÊG?ËIt86–êBzü}*x¾n»ò¾n|wSG{z¯GëÞ¼ Ź£?»½0Ä*Öׂ¢ŒÄ†„J!”‹®´­ºãÈ`F—)©‰3à¨ÏŒ±BžFãŠ0ªù~gﵡ€k©Àᙲ7Ô2!^ÓRS•ü=b„X(Ôö̵ RuJ¤ˆqÏr}c–&~èw?b É„ÿMW€÷ÐÜA…ŠÄ–WAl3‡‰ù9¦h‰šŸ/‡ÂRB58°„ÊéÊgÅ„X !Lj¢ œb®Lbç#S2E8ŠÜLËñŠ–’Y"à3óPËa=ú¨Ä3?GdÑ áœ°žÇZW%²BüOdm7#²ò_EdÅU"[¯ê®.›ú{‰Gðr´v§7¥b‡{.9«¼oªã åRÎÃäP™©–üÙAÚ#CÈÓ å 1²–^ÊûʚÔ„ÜCõóyÎéùü¶.›3/)(¸’éNËÅÂ?ƒŒÜ”rnSÉDÀ‘r(ˆÔNíËjÁ¡´÷O Ðö_u¡ƒáɕʗæG¾<†gÿlãçüÿ„ÓD™{ø1 ïðq%½Ÿ ŸèÂúv‡õ)†3FĴŬ…B»ôäSµaà\ì„7¨Ððwô…ï ­”ùÒã¯ú¦ix)‰•VŠPLA0¨ö@F‹$\%N_$Ï7ÐHÙ7ZŒø#¿y³!“³Z'‰eÈ7nY#⎋ƒ/K¡ñ…ßÀÑ-Þ3`1@ù²²K)|6$©TÒ×pTþ¤˜)¼ïfê&¼ËÚråˆtð7ÔvÝ—¢CÃÜí4L€WTÒ’²›zÛ¥šH¼ŒÓ£Ï«ò­ˆz~C/ ^ð’$u•@0C”µâŸ4ðoïÿXŸendstream endobj 2423 0 obj << /Type /Page /Contents 2424 0 R /Resources 2422 0 R /MediaBox [0 0 612 792] /Parent 2397 0 R /Annots [ 2426 0 R 2427 0 R 2428 0 R 2429 0 R 2430 0 R 2431 0 R 2432 0 R 2433 0 R 2434 0 R 2435 0 R ] >> endobj 2426 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [484.2515 653.0718 516.6856 665.027] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.12) >> >> endobj 2427 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.9379 641.1167 104.8745 653.0718] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.12) >> >> endobj 2428 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [84.3959 629.1615 106.8673 641.1167] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.4) >> >> endobj 2429 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [134.2093 629.1615 146.1645 641.1167] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.4) >> >> endobj 2430 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 437.4292 516.6856 449.3843] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2431 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.9379 425.474 104.8745 437.4292] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2432 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [84.3959 413.5188 106.8673 425.474] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.4) >> >> endobj 2433 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [134.2093 413.5188 146.1645 425.474] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.4) >> >> endobj 2434 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [277.4501 209.8313 299.9214 221.7865] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.4) >> >> endobj 2435 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [327.2634 209.8313 339.2186 221.7865] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.4) >> >> endobj 2425 0 obj << /D [2423 0 R /XYZ 64.9134 727.2935 null] >> endobj 230 0 obj << /D [2423 0 R /XYZ 64.9134 570.887 null] >> endobj 234 0 obj << /D [2423 0 R /XYZ 64.9134 355.2444 null] >> endobj 238 0 obj << /D [2423 0 R /XYZ 64.9134 151.5569 null] >> endobj 2422 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2438 0 obj << /Length 1965 /Filter /FlateDecode >> stream xÚ­YÝÓHÏ_‘}ZG‡›þn[HH·À!V«ŽÉÞ ËƒÇñ ¾ÍسŽîþû«ªn;vÒ™ B§?ª~õ]Õü²^<ÿG¶ÌYn¥]®o–V³\(½tг,ãb¹Þ|L´]¥ÂZÇüàœ'ï?¬d–\þvùv•*¥’×ï>¼Y‰äl'ëwÿzs…Ë2ùûÅküÐɫˋu¸â/ÐÉK¸rq….ùýÕújõiýëâÍz!–þˆ=i™Î­Y–w‹¿?ñåfÁ—¿.8s¹[~…oÎTž™åÝBÅŒVjXÙ.®ÿ ¦ÅtJòT‚”-Ø\2-µ"-Ü´]Uß6pÃ×ÕÝý¶è«g«ÔH“\Þ÷uÛì`G s •3%œHeSýÁ…n@ò U°óú)ÿoݬdžô´ÕÁ™›¢¬pÇ$÷ÝpeuYôaãëçv7œ®íÛ5ýßûU z [õ y¸™¤R¦”Ý Ø±Ú0á„犲D(mG`Pš[ϧ‡Ïo/S•ç,“àB©,7FÒÍþ³—Ck“´UGàhé~Aü$kƒ«*¹&"ðs°¢y@ìp ^Yf…À³UêœI> ƒê¦ê<¾Å5¬üÇ ŠB&÷¿K806{üˆµAh}ÕyKѽ6P¼ó*:8ïÉÞ$7CÚRjÇÚÀ4gðC<óJ1ž;Î4z_ÜV>¨D¦ÐYDQ|™JNÍOúrÜ{!¤².h®îZýõ€vÿ²26)¶ÁRè¸~{t‚ðʙNb§ãéã§¡ÄÁ£”£= 19./˜ÉÅ\Ü÷+HFm××õÁÖýJ‰Á¡²˜š4Ý{{ñ»×ì{´b»moýÏM=FcÙ×Þ]‘-Gã=0™%z–á  ó}×âÏ-ý”Á)ËÖ+àõùÏ7,l4;¿òPö»ˆäÈ ’øY`%‰™ˆØAƹ¡ïªç 䥖ƒþŠíWt·‚2bÇ݃OÇÕX(Äò@:P›ùù î·2†{¨õð #¹ ù­œV·kX*J¬òöÝþÛ×S멚`–¢˜q6;…RpRÁ©6¸Âs(·üÈ|²ÇÚïêM•Ò(Õ*D¹ßjoü½Îû\‹l¾PZ¿ ”·[‚DüÜâž·MêkrÊ|ÀWvøìf`Þ”Ó®¦"Ci¦%¥÷sª Èl€…7¨RÌëD¼ƒÐh,;ûŒÞ×MHtuÏâ©fj“7õݾÅÈN¾h›êQšúÿÌØžü»«Kò%U推_€ú0Ø£ß@¡ËŒ³$*Ï&QôýŸŸýŒÎü\FkδÛ'ð•aGÑüû¡ B¾„ÑÍŽ’e.F/N²‘ð鸛³ÙÔ»'°âì,—6éË“|@xèìÄœO}C>NØx/”™‚Îó›³½šùßJˆµâz[N ÂdLk€+,˜H‹ã©&?6ˆ<—06(&¨DùßCÃH0P<„…Î#?NQJ¯º»ÐÕœ,Á9¬U? ï@ïq¸0Ö0ðäÜ¡÷BÁ!²282Ë#/×¾vxG/ñ2ÏLöýê(¦S’ýC"·{ÎO6¸§äRý8Ì#Å3˜%tôJssŒyb0”‘pff ÎÇ‚BOö­(H ßb:%3ƒeÊìù>ÝR¤üˆGŠgK•A¹äù1æýrÐŒ:Ŭqæû[¾·m±^3AA¸"ëŒ5 L2nõß–<Äó&ÌVæC.÷<ŽÛ»fg9¼K`K„…Á—ý&ÔÌÂÏ¥¾O .Ê2­…4tz´®ºr8Ó‡Fð¤ÐüZLQFä––A`»ƒ‘oÖ(B‹ÄÀzóÉm¯×ß W|›é†þ¹J ölúXÖ©Ãþ±ö:H'Ý]6Üö­æÓ•â,sÙ(ï)Ó(…ž .ƒÑí¶#,3ɬÒîŒfÎ2¾É„N7R†iÁžôþôåãf²Lsž2“ïE€çDHø„nþlH@¾pG!!exëNù4*D €<*Âm˜Z´‚*Øù›~V@‚¸úù„…Ã{/Üx~'ßÄ$ô!ΊìqQS-$Taçe…ÜU:u.Ãè’…qß»ÀSCûd1lЉ¤Ó^_­Ÿˆ¨[§Åƒn݃ “J¸¸­ÿ …ø ŸPñ t¡Ã#Y ×°TÆ‚-L}Æ'2l¿ó‰ç#7šÍè£ÚMÞ݉5 ‰ÙœÑÚŒá ‹t&™ÊE­ŽYnåü‘@`<úÁ:ÕÖÀÐE³žÆæ¼ÀxÑôÃg Hev6J xÏþÙÇ¿D<ÿa?%¼|.£ jÿ4;yP°Åvׯ’‰†±@’O¡[Ší eªÆ«À{Þ:ÑuÝì§cÚüZƒº#>Ã%sCyã -ß?›á³2’›½û“pÍh‘„ÁioÞ°Tmwc£ô?|endstream endobj 2437 0 obj << /Type /Page /Contents 2438 0 R /Resources 2436 0 R /MediaBox [0 0 612 792] /Parent 2397 0 R /Annots [ 2440 0 R 2441 0 R ] >> endobj 2440 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [501.9629 676.9822 516.6856 688.9373] /Subtype /Link /A << /S /GoTo /D (subsection.9.1) >> >> endobj 2441 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 665.027 104.0999 676.9822] /Subtype /Link /A << /S /GoTo /D (subsection.9.1) >> >> endobj 2439 0 obj << /D [2437 0 R /XYZ 64.9134 727.2935 null] >> endobj 242 0 obj << /D [2437 0 R /XYZ 64.9134 580.905 null] >> endobj 246 0 obj << /D [2437 0 R /XYZ 64.9134 548.1805 null] >> endobj 250 0 obj << /D [2437 0 R /XYZ 64.9134 239.2211 null] >> endobj 2436 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2444 0 obj << /Length 2483 /Filter /FlateDecode >> stream xÚÕZ[oÛÈ~ׯPŸ–BMfî3l€.°èn‘}h·ˆ>ìî-ѶPYtI*Nþ}Ï™ 5”F”+ÝbŠœ9sæÌùÎå#¸ž½ùÉÌË¢TLͯoçJ%åb®9)Œ!t~½ú5S[ä”’ý² YÛlš»EÎ9Ï–p;k¶ Vf=Üö7›m×·»eßÁoÊË„^ü~ýóìÇëøG÷Ë0UˆRÉùòaößÙ¯¿“ùjFæ?ÏH¡K=‚kRðÒÈùÃLH^HÁy¸³™½Ÿýk˜‰y,ò‡SÛS%+Ün¯EãÙ-l®Ùlš3ÙS‡[û êýæ'Æ"’B3«âÜ¿7Õ†.rÉd–ÿÕýÅ[Ì]¾ÝßáNT¬ ¥² JK/ªXäšÒìM_£>,ëï«>¥€.˜ág8ZNëBpRúyë.,R»ÝÿF¨ÀÓíz÷ jïvðûíPoÑ&þAsfÂã:¡ … \)¿ÒoD’·ð}“P $i8Oªæ9¥E)%sG²]%3R0©£'Œ ~Ë¥6ÑÚ^O»ÉzcÏÕø±j{x†º¹kï ñ”®ÆàÔ«`xv·{°·ëû“{öZ.˜ÎîýÐ-þ¥Ùú6q Ír«Ä¦óKÁ'{Y‘ðØO è¢{˶®z+»C{ÌsI E…90)V¨ŸÉî›õÒNÈ9èÛ¬÷,³Û¦uÞ7”W‡ÛÝ÷î.w½°F€¹;¼ì×ð‡¼ßŸÜȪ³ú6v1»5h¼r«<­Á8‰ÃV²ÐZ ’oSÞR%ÝŸ5õË¡WöîÊ*õ±^îúºK¬AªÁi¬ŽDÏ–TGˆ…ã}ç°«:o3€‰= AHAÐá4\HívK;¼¶†é® TjžUŒ¡JNŸRÆÀ£6¸•³'Þ¿A?ú”Â¥B¿(Ù™-–…6&l±oîj0aëDÛ£‚+á\ÃkªQÓà§µõíC·Â‘6¼zA%Î…#ªÖ?vø`óÞ¿Vξ´$… º|N¡eÁ5C'K¼Šâ$ç"«ÁspUdï×§èBˆìÝmb1ð_£ÄykG‹ÝVhÇ_2ŽÇâ¤CÂÕt4|Ù^ŽÉÕàñò*ã:‰Ë˜ß]}wŒW)ƒÄð|,À€Ž`¯ç $¼c-8¸/ ;v^EÉc[¯j žÛ`Ó•{`˜Ï}yç½u[õMÛ¹aë\êpѧAĶÏÀB¢ äʯOª»Ú‰‚¢ ÃR0-M«x! /ƒe…UøÇÖVX.ÄŸ(š¤™PÕL¶.rE-磢ÉÞMd™“²Ü<²üe˜qªþ’ $ÈÀ¡þ îWŽ¥ð|Ê$š>¦œŸeBË Ý‘¬üõ:Eä”Ã2hð‘%‡êoêülcå(6[ÑúŽ ‚è@COµo¨8O¡}€±ó¿Oû˜z¨15†”=öz»<¬B§Ã_XƒÄ<™¬ÂÀ!s h¬m³¬Wà‹>²"ˆ'ëåL}ùÀ:ކT²¨Ç¢‰÷Bˆ‹¬tî¿Ð5m_ݬ7¶4èœF-öd2fEÞ½ÿçðÄò^‡¯D.·K ƒ}$^º8˜'Ç¡Ç":P£˜ßÐÅÆåÈŠ !]´_”*«M‡4­cSÀ†]…Ü<Üc’Ë¡Ãü9¤âC¡ŠJ3aÛQ†ték]|˜Ç"]œÂSˆèj¿²­oêö!xò¡…(¡…)5oñou·´UŸ5Rè´;8ý`Ì6ûÕbw‘pf ¸ê.ê £!"£â–ˆ¤TÒeŠ¿Ó¡‚'üdü ¤ 9b`¦‡üÔa¾"¶H%m +†ÉiMáüÊynëÇÕí¢÷(~¡ 3ªÉîP\•ÙÓýÚâîçz¯Srvuá(÷#ןâ½%z¿z†ÁÕz»^«ª‘GïU†º`çùkHTݧ”pcs}³I½Ç+!|ZýéX¥²PÒЩ€;|·uß6OiRH¨3!°^˜ÅÑõ¾?Í ˜Çôþb£õzNÈËË÷ŒfñcäqñýáuÉ<7¬Àb|߬Q-õµm¶ªö©”´PšSB ý\QÑendstream endobj 2443 0 obj << /Type /Page /Contents 2444 0 R /Resources 2442 0 R /MediaBox [0 0 612 792] /Parent 2454 0 R /Annots [ 2446 0 R 2447 0 R 2448 0 R 2449 0 R 2450 0 R 2451 0 R 2452 0 R 2453 0 R ] >> endobj 2446 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [295.8807 617.2063 328.3147 629.1615] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2447 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [355.6566 617.2063 372.5932 629.1615] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2448 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.9044 497.5551 164.357 510.6061] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2449 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [191.699 497.5551 208.6355 510.6061] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2450 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [170.2684 306.974 192.7398 318.9291] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.1) >> >> endobj 2451 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [220.0818 306.974 232.037 318.9291] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.1) >> >> endobj 2452 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 199.6764 134.8845 212.7274] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2453 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 199.6764 179.163 212.7274] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2445 0 obj << /D [2443 0 R /XYZ 64.9134 727.2935 null] >> endobj 254 0 obj << /D [2443 0 R /XYZ 64.9134 440.4318 null] >> endobj 258 0 obj << /D [2443 0 R /XYZ 64.9134 142.5531 null] >> endobj 2442 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2457 0 obj << /Length 2802 /Filter /FlateDecode >> stream xÚÕZKsÛȾëWðV™ãyc&·Øëly+e9–’6{€HHB™´¬Ÿîy ARŠ˜CÊUæ`0èéîéÇ×=úp}ñþ/ff‰Õ\Ï®ogZË„œå‚c(›]¯~Ϥ™/˜Ö9Í4 (¥Ù×osn²Ë¿^þ:_!²_>û4gÙGx]þǧ+œæÙŸ¿ü‚™}¼ür>ñ¸•—ðÉ—+|‘gÿx}5ÿãú·‹O×lFáÛ2Ã5‘V«Ùòáâß¿ÿAg« :ûí‚’Üæ³'S"¬Q³‡ ©QRˆ8³¾¸ºø["¸ˆC’P œOhA[N$—ÂiaYôËûQEmŠõ»ùBq•}Ĺ² OßÊeó£lŸaCYƪe Æø@bUz <ëPÕCµU­Ÿëÿñˆ%ËZ«ÃçËb½Ž¬Lï¦LÄípmWâ^˾jj¿&°)'â>šì±¸+ý ™#M2_H8ºÏ·«{XíÙY·Y.‘ZY®ÂLÓ"³×–pÁÍlÁ±Jq·ÿmQÁ×k'-l‹²®_%³þš¬ìüc_úŠˆ#1­Fᆱ¤8ˆ÷b_B͸ËP&fœLHù¾A›|Âÿœr~¸Q8\m€ç¶ªáÿ»æÊŸ¥“Wx…"¹ævŠQeˆ6VðÄö¹äLƒÉ°&컵a¿*h§ë8¦Ô“+’‹Ü‚ý}Û<¡ |ðv3e/9QB˜Ä;L©ÀÅreLJé,³6[nÚÖ?±¬žs`ç SA¹î¹¹õ¿KÐÌöm³öh§UyŽm7¨^÷¼š;ÃTeE½ÂõyæN ñ%z‰›Þ^Ýùé¾ñ¿E`Ã+Ð3¶¯=ÁD?£N—%Ê0•´ŒNP¡nà'Ïʪ¾óó#ËI¢¯o^+ó¨m|¯ïÓAÌtßµp{=>zê^û.äVá}S—apë{Œ²ÎÔ?ñ„N€<œJB…Ý9˜.b«!ì–ÙxM:¸drwhP™IÜ&¶ã²Dupí—4xZÑ^|d¡ÇÍßßb¢¨Ö] –¾ëúmú øk©ò±Pv±©ò˜.¦q¤³öi¾ùˬ¸¢=M¨Ôn *‹v]•m@éG@¸â›ÚÂâÇ\ARn+‡²Öa!jä… Ý‹NÃ)Tá -£Ì~rU•ƒÝ¡^‹+Î-¤Ì½^‹ë§øf ³–›-nfÜl¡ÛXs–ÿŽ­0Œ§{¨o.BŒ8Էɱ'¥¶„ŠfÇ*nw£vŒ±¶ØUöŽ®¸esÌlÈÍÛL$OHu/1šÙ±ˆU nX÷•7ön…Ö@Z >yÁÑ €AXLì"Q\ Iî3+´%šƒeŽ˜ôéCæIÅ ¡ v<ŸJÑ:™¬µߞϢù9-†4Üœ°hÀÇÊW[t3ƒG:å°ˆ–ÑÐ1*7ëPùÔ;•v‚ÚðZ´-œ»Ç@´³¹ÇQumÝc¨¯þùqχm’ÑÁÊ7{E¤¸’œð ÎÁÆ,óè¼a âTsè);¼Ós6%ÿOF昈òWp¿8è0 ‘ ÐI»fÊ_”$9Syh¡…|é[D«aoÁɪÚbž¦,;¢„è[_±|>áÓå T—œ‰ã­à™U³->ÝôsB${5ó²ß¿Xp­<ò ‘m $÷y% ;/Ø"võ_ÆÞŠ/ :.*|LYovû~õîµJ›ºø›ú{Ý<Õ“V+„HúG¬›;O»"EWÝT-G‰R4Ö)ÿì”H MÛ8#]îW° }ŽÅ ͨPj€~˜SÞº ‰ã}›? Bâ®C‰C—p'_ÖËý¸e›ÂOÓò7ÇÅHq1$9¡–Í)Ó˜ÑÛfY®6m Œè„ÇãÙTýÿ‚$('–BtIÐpóyªNy+6FnØYS¢xÌʽxú5¸8~rF\< y ™=‹Ï¤ÎóÛòØcj23ÇU >¢%ó2žÌ’ ¯"Å©>*†MgIÉÄö~à·ÏþéÉ]ÐÜû‡é”ŽÈ<Õú[’Bºˆƒ¢½ÛÄn}ºËÀ=|‹Þ]sq›.ÍkvèÚ¸`,]2½¼Û*=pGÂ<§ë‘ò§e04òÀ¯ïf¹†ï}!bëÌwÀÅ*u–,¬ýbêú¬Ò¥Ž'R1'&WòÔýÔ8ßÿz \005CM>np / &n'(Ñ"µhjT‚ù1šÚ‘S˜Â5™ùé&¨&¹ŒfZ¡MXTñÂg‚G½šªS½P ±œÊCÍPÜV¸N¨þ üéÚøÇáM1ÙTæ‚M\ ¢2×iá@Jšë·7ÅÅä~Åž‚KïiÙpǦJ×Qø©Ë n­(Ûý“‡‰ Ò@ìÖày5Ø7K .†÷7<(ÕÛ}ÉíBY¼ÅHu}=Ý…§2Õ&ñ!³àx Ëó‰(ž›YAáõ‚/cÁã®Q|Y⋜í´Ÿ^•þÊ4´ªïâ_SðµÅIG‚#Fr³Ó<5l…€56W1žù¦À×9¶­Û¾¸©ÖᯠFô½è8~¾º ­›áÅp˜èúvëݾ#ñ€ÿkÅSÒendstream endobj 2456 0 obj << /Type /Page /Contents 2457 0 R /Resources 2455 0 R /MediaBox [0 0 612 792] /Parent 2454 0 R /Annots [ 2459 0 R 2460 0 R 2461 0 R 2462 0 R 2463 0 R 2464 0 R 2465 0 R 2466 0 R ] >> endobj 2459 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [369.9774 688.9373 392.4487 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 2460 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [419.2307 688.9373 431.1859 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 2461 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [288.9042 545.4753 311.3756 557.4305] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 2462 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [339.9889 545.4753 351.9441 557.4305] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 2463 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 414.2674 134.8845 427.3185] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2464 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 414.2674 179.163 427.3185] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2465 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [315.8329 343.2891 338.3043 355.2443] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 2466 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [369.1955 343.2891 381.1507 355.2443] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 2458 0 obj << /D [2456 0 R /XYZ 64.9134 727.2935 null] >> endobj 2455 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F14 2010 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2469 0 obj << /Length 2192 /Filter /FlateDecode >> stream xÚÕZKoãF¾ëWè °zúý¸d`³@rH²ˆo³s %Ú& ‰Z‰Ž3ÿ~«úA5%R”×Á#‰,~Uýu=Ûüá~öé_vîˆÓ\ÏïçŠZ"œA‰µ”Íïן é_îžýx?cs ÿØ\Kâ˜1®A\«ùj;ûïìó:_Ïèüç%Æ™ù+|§D8«æÛ™T‚()Dº²™ý>ûw¸LˆËò4Ù9“DHÍÑÀ$§'’Ká 4‹%c\¿àKÑlüÿO‹¥0ºxx©ýïvYïðŠ*ö^ªZ×ø±*ÛêˆË ŠqJyEt¾ŠmMPAPšEE÷ A‹¯ Vì’Un+”9¶x÷P9ËèEPX¿”*‚²Dy& Ê)5AÉ?ÊÃ'6d1ÅL”ºÀ1ÃTØ5»1$Ɉ•üf¤²m¶ƒ8‚aù­0õ®­žª‹@Òv+Ôã¦)Ûa“4ь˛IzÙ>TFR½ú?‘ÀS,1J‹ù²sK]5Û}ó²[¢*N7¯tUn6åæú¬M}l?À!öå¡­ËÍyÂáN‚£KÈ<˜ ”¾L8>©„ŒÃœãqa^qø}–o:Àe†èóMÏ6î ᎋNï Keo¡ì|¡BB.í‡-´¼¾P¡Y Ö[hs¸0Ï0"“g^œ0ÏH¢¬Ó=óF|EB¸XžÉ¾×Æðºn:mìm¾C UR¦’äïNÕ«Âê‹/]§Õ÷MPG5XÅÔD*R¡øUômuØÂ¯ËNžBB¸"ƺì5‰ø¤œÏΓ*Cê½ãYF‰¹rÄe³ä:©8åËIÝ)N"â–N ø¦P–X aœpKå„w\æˆCá¶1~R<¾’¥+ h¼XõÅj$Øz…'8ìÏ»W—9âÀj¤&\ÓLñH¶‚Ü'$Xðq&Ä) !J«MßÂ1§€"m¯ù@3â„™îZ-]ßÌA·¸H_Р‚G©”~‚Gý³:®·| ¼oëf7¸è`ʺï)ˇéˆuNĪy|Y­|ï»í5(;.–ÜÊ¢~Ð%!<ŒK] ê¸ÄcŒ4:µ¤nõrÀ•x-»wE»ùî¼ÀåL^3Lð¥ [Àæ¶Õ…DKzÅÛÏHÇjÁ |ówÚçÛá?—æPøç2Z€š6|€„«]~©ñÖD¥mnsp@iŸ½¡Ow!´!¸ˆâç=eõg`tÊ„8Õ ²_ݱ~À:ô5Ü)wMn¾¿vNGØŠ\ Ä ¥ŠÒûdØô8n6™vSµ÷­ µêšƒ1æ à\Úêë" —œg‚pà €}¨ÂÖ'†®«hö9½5îQ›!û˜DJq9ÚÑ1pŒXU¡~:ªú§:?N¯RDs)þþü¢ÿã£%Žú0˜ãÒPt †lÅú,khÆ ¦U0õ R‡ga…)ÿ S#‘\³¾£t=Ü•@„z¢¤þ†ˆIÉfÛ²­wO½$ ×üwÌw[ÌçYNgRàP äYNëú܉œ¥ù¯¥Rüõ>æ…šø™ñd/üAYÇ·¾¬¸¤|‹ÿ?x‰ê0â²Ø ÁlЋæÓp…hE8ƒ¯µÒŒ¶LP1Õ^#rŸåR^ ºÒ!'›KüÛS?‘ªå:<†¿›`òò¸Æ;øªewéb ðÑæåÃÏ´¾=—¶/ŸmArù×Ä0hÖzþžaW²ªÆžùºÇƒ coSϬP¹ÇÜ€ÇÃÏ<ÞzâÑéã^ Œw|ø,Ç·HLm™sî¢ñ¤"‹%ôôÞ · ü¸ƒo BN¦{G¾ÖÀŒÔµÃß_®Z;Êhâ‘Æ¡\UiæúnH I?à]ƪ,Žíã—×z­nlÝò‘úʶ+b-“WãOÇŸ’”OÅŸ2–åñp#í=*ÂËCзôZ‡îZûýö~uØWáBÜf¯Ó6sB­Šù8L0:wìæÑïÖ±Y—†8çLËPË Ü§!îjW甸ÞÄŒñ®(Žv*Ü”a½x?7 a¼ÀDÞE âÊ0šŒŒ4+)»¡ÊË!ÕçeÀ"ï|åó—ÀÁhÖFÓÓI\ŒÇÎÏ©WçÃw8ZÉÀÃM„Æ3æ|ÿ^k°5V< ¯Ü3_ãïrî=úü±jáÆÙJ µ§vÿ;òÝ'>@¿#ÒðÔ”>Au~í¦Žh…g½ ^œ/ÿá)4:aâ<d¤¥cÒC[Ö›HÆ©¾#C#M·%g‰ž³ŽŒ0Êa®† E”¥êÝ#â2‡¼<ašÇôIóÍ1¥©š˜DùxÓÖý¹k¼gãÝßdêˆ6Ô³±é 2¡uca×X؆Πy£zÝqÜEÛc“é)˜î5­.¢T¨!™]“bƒJ¨°¬ûúÜ“[e.æ° mÉyt„þtè|œ1è ]o “ö9ê>z³WMºq±ˆS4 §€Hu Œ½?ñÎ>(0‚) 9£×ÏÂZh›`<Ÿûy–½?FÞ2¼ŒëÀÓ©î´ŸÀ2J‰¶Ö}˜qàuë ±Ë ë™7–e$ôK:“}· pÂF ÑL•èÙx[Šù¶c’§ŸL‡FÂ~òéGFïä™SG(7ý ò£7¯9xk:ë~iv~=#¶ß>‘µåCx…¤nѾÞt¢=}J7ôça€¸|YþéåPþ®†}Ë_æ{(g¯jØ7½©ÑC꽩aßô¢†Ç‘ƒ/j\dßBÐé=w0}þrÆyÜJųB3P²äšÎîó×3.ÑR(Ušò(႟µœ?ýþkÖqVëzÛ€#IÉð¨ÙŽendstream endobj 2468 0 obj << /Type /Page /Contents 2469 0 R /Resources 2467 0 R /MediaBox [0 0 612 792] /Parent 2454 0 R >> endobj 2470 0 obj << /D [2468 0 R /XYZ 64.9134 727.2935 null] >> endobj 262 0 obj << /D [2468 0 R /XYZ 64.9134 702.3869 null] >> endobj 266 0 obj << /D [2468 0 R /XYZ 64.9134 679.769 null] >> endobj 270 0 obj << /D [2468 0 R /XYZ 64.9134 647.8969 null] >> endobj 2467 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F21 1557 0 R /F22 1606 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2473 0 obj << /Length 1566 /Filter /FlateDecode >> stream xÚÅXÛŽÓH}ÏWäÑ–&Mß/hµ,³hf!<&ñ0I<›x–åï·ª/Ž8˜H«‘&v»}êTuUõi?›Ožüi§Ž8Íõt~;Õ’8&äÔJ¬¥l:_¾ÏÍg\;ª3“Ï¥4»y“s›½~õúE>BdÏÞ]½Ê­Èæ3˜]]‡Ñ›7—9Ëž_ýƒ¿çVfóË·ùÇùËÉå|¦þØÞ"×D:­¦‹õäïÉûtºœÐéË %Æ™éW¸¦D8«¦ë‰T‚()DYMÞNþjg qÖ…|†žr>àªvœH.…wuUíš' 9öã"–>NºÏûh„Z+â„ûbÛTÅêÐU&Ñ\˜½É#_½?ÁYægaÞr¸?pµEœu!}e’£™ûAg%1”»èL±YøË†¥9ˆtè-gb¦Îèm‹8â-çŒ(.¼­·G 'šÁ«çc˜Ç EŒ¢Éw"m¸áĹîäGÓLˆc4&Œ[ýKi³-Cxqý/dvÍ`[¯êÏaüoKl K¸ªEãov$ 3;eŒ8¥8bϸTP®ÈCÊ[)´7b¾Âáã*›çNdå‡Ö`èìaSáÝÊ$àûëz³™u¨S€…(J©",÷Àl ñaå(52zù*úþ±'|–Ã¥¡&Î…Þ( ÞlÁÝzå¹`( mÍHG«@142ã]öÜ‚Ëà¤ÎÊ5NÄzÝn€*‡÷©ÖÐ&`Œc á}dKkÊíú"Ÿ)ˆš¿F˜@„x^îè„ç}Sµ!åýrKFÃ;s0‚Á§áGøqF˜u)f´ƒÁßCkBœLïSGÀ°¢s²©q©yg€ l*L±y"%Í®kXI+ ;¥Í‹‡í. ,rn²»D~Ûæ—ð¤ÊѸä¾êMyw"«HQ›»Î¤P/ËX(ˆ° ÖÊhjS7xA£ÍÒÿ| CÕmø-Bf1(l«œ€«TcàË?¹ÒP·Uñ « U[íB¹îW¢\†‘¯Us®Šð³ð9½¾V&«6~ÏB]c¬ä"Ö!wYSTôq›ÂÞc˜7ÈÓ·Á€Vq֢؄wWÞN‘¬Öáqzê­ÄDÚTMlN«ÂúÞËÈx&?=N K”b)m¯b¨Í•©!‹È C‹ƒÿ†û:D° [ æÈ6LÀìp°ô¡l*Ÿ?á™!LF/öÖ‹Ï1t ÝÐM2TèÑ…è©ôž\n}ÇÞæmÕÙÓa¹†&íµ;í&‡µ©·Mñ©ò­«jrÁ²oß\®Þ¾îÆsÙî'l  ÎzÝœvsè÷ߎT¼¡ ……²Än¯Ú⬠9 Ú eYØ2ö–‘¤/»CŽ õ©gä˜Ç8* ZKé>Ç:tÀC–V% ÙœeBciA'qÉôÈ/ƒ7,ˆÝW¿¾óŠïdtbA¡éŽ pÖAˆ03\L³N¦–d$ :Á8BPJ”œ¶GðD^Án&a™ÎG1ŽP4Ž(8dö(ú¤ú)Å ak,-²3Ì1òÝ€n3zÝc£“g]Äãè8 Í‹º½Ý“+ŒsçcØ"ŽPÄ"Px¨èq<‘d •Æž‘eBc©ð©î“lÓÌ«Ý‹Ž¤Þ§Yw;eN¦úôOéjF(¸GuµÔtük¦ì§…µÌæweÐsIY#×Ô»$:a¸#v½àÜÅäï‚‘]o‚¯IAU$ùN‚*æÎ)ì«âæ.½&;aÃãd’\·(²ªUÔ}(Æn;ºx¯cqÚ§UddâñJœ”×uÜ{¢¼ÎÛ©Ø]¢FYm½¬Fؽ¬îæY}Jô–óŠAù‹bPPú²–ºw6>:ªâ“x­}áz'ã÷оzgõ¶3ˆ}ì‰5Š;Ò7k8endstream endobj 2472 0 obj << /Type /Page /Contents 2473 0 R /Resources 2471 0 R /MediaBox [0 0 612 792] /Parent 2454 0 R /Annots [ 2475 0 R 2476 0 R ] >> endobj 2475 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [238.7064 488.7783 271.1404 500.7335] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2476 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [298.4823 488.7783 315.4189 500.7335] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2474 0 obj << /D [2472 0 R /XYZ 64.9134 727.2935 null] >> endobj 274 0 obj << /D [2472 0 R /XYZ 64.9134 676.2696 null] >> endobj 278 0 obj << /D [2472 0 R /XYZ 64.9134 646.1465 null] >> endobj 282 0 obj << /D [2472 0 R /XYZ 64.9134 380.746 null] >> endobj 286 0 obj << /D [2472 0 R /XYZ 64.9134 141.193 null] >> endobj 2471 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F18 1536 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2479 0 obj << /Length 1795 /Filter /FlateDecode >> stream xÚÍXKoÛF¾ëWè ˆ6ÜEœ¦AS 9´)â[’-R2‰t$º©ÿ}çµ$%Ñ)Ћ½.wg¾ùæÛY½¹œ½ø-›ç*OL2¿\ϧrmÝ<µ±Ê²XÏ/ËQªìb©ã8Ž.™ªýn±´ÖF+°Fíî¦Ø/tTè©Y|¾|7wÎ*ŸÅÉ<¦¼FëìíåLƒ%žëa“(—'~¾Ú;Ì>~Žçå,ž¿›Å*ÍÓùWÇÊæ™ŸïfÎÚÎÚ`ÙÎ>Ìþê\†—ã%ß`|ÆL˜äF9ã,ù÷ ,èâ1Úª4Ó! ÐZü ļ¯0æF4økã¦*yJÝ,Øø?·7‹¥Iy.BVtížß|Š}LøU„iW/Jz—*픎ŸÛ›Š]œÀ—Z±ëF|_ç—ÆBı£Þâ¶ûÿÎãÃdFå¶©¦–>™ö~aMÔî»âªÞ¢óu·°:º{`yöå÷Ž‘,ëUÑ4²§ÎæZ«Ü{#Û\ycr¡$ÎDZjã–9ÒMHÍÔG«–šèÒ›é`€êÖ9¨N+k\ÙÇч®hJâ7æ4sQ×vÅ–‡cYík^[G±¯ñ¿:J(NÚáhðñæ—טW—GW·XPÛnY#\ÝìÇl5‘¤è‚íÀ_•Qhµ¯¯˜g%Û‘L »k©T|˜$Ø!>mÛ…É¢¯£åé[t`¹%qxü²eG$A&¿'ÎmÛ Oézþ3,€·Ëõñ,XT†CzHI gb{Çí¾¯ÂTôªX±S”­ZòdÌXe(±á˜âÂw£Ì÷ûMîV7±¯e*9O«‚ל4ÈÉ5Z9ø¶ÿkte+˜‹ 5aË·»à¤DNî øJ|€©•vœ;Ĉ¶Í¾’b;t¨ ?Iɹ±úR:ÐS)g=×,ˆYzNc±Lþ½ð $©.®Eì¡hW»ía;tAø´Û:5±ÿR†K+‰Ø<Á\³\wlIµè鉃á¨p¦´Ò“œxDp±âØ\8žžû†ð|KµO´c°Ü[è#ÀÒøv‡¯F§Îáy4¦…ZD-ÓXÃèþ˜ä?2€à¦¬½©Ä)× Õà>8Ô{Ãbû#™çïnÌOc{ƒµR pYTup2m†ÔªBÉrpÈ “פ3¦Ú;#½¬ßÄ“á\µ”:áÀmÂåTˆÂsyÚï^É{ª½ äÛ®0¤;ĆŽ-pžÉ2AG(Wtiü išbG#O¢È¯ø;´Ý°l®j*¥-OX“ó« ¿Ø‘Myî›,6y>l>3ÕÇœßVënÙµË}½¹Ủ¨SŽ cŒ“äX‘…êPêõBD<#i•°8îÃéH¼jÑÍF&v}SûzÝD^¤ñ¬!ZÈzèéŽ^“9dB—gêÙ sN)虵×i¯1ÒTB¢c¥óL÷|Ü©xh‡Ýµ,µÐ^Zn„¼\8ûâ£) Ê>â{Dqµ76ðY-ÿ1è¶ã1%¹Øœá*ø¸i¶}ˆ“†ŒÜ¶¯Ï†Tù`üqK9+©À½ûH¡€ßÕàð3w\iÕn8—ª¡v«¦¾Þ×Óc»˜*o% ¡W5Y·^Åqê†|ƸlÈýѺ0ÙÄZæ.¥ÏeBfH,„\e)DI9߈–úLö¤{ÕýûºJJ»û6n(×`ªûÝ©¿-¶S»/u‚ÃØƒŽn¼~ù¡S¨Tfbhéélh&€›gš$#^_¼üÞðÚ¼¿€Ð‹êË-ßIdN{>®‘ù<¯¾î"ʼnîz¸î©$OÍ”WqÂ>yË3$ä@Ớh¸öÊÚ$?¹m-ò$ªäðÔ 7¬=©¡á0F¥9Wñ:þ]ƒƒÑÃ-”ÆtØ¿~bxê'œ¢íÓÕPpv>fæÛÓݢ܃K¯áôGã•ø<9>=~­+’z¾«ÛæÑ àÀ9ˆ2;ƒ§bUÖA­)i`öÃùªùšˆ¶Žï±xàŠÛ"öWCºUËÕæ´¼Oß³€Å» +Ü iß q8>ߨ™Ýˆ}-SO®¾l=½v /xíÀw¨ñúùTænäb#¯Ç†yDˆ\sÖ..ø?š&Ú4QÞù d‡[Ʃ궦^Olêr•%Yø–÷<ï7rPÊ¡‡6hB9reS2.´LÈSƒ)d–d)µÚœô5B\°¢”Aý¥ÿ9Hþ åßRYÃÀžö@&º{ ÃÜ Ùë—ÿ'R…ßk‡n2tèr†žïU”Ø<}Ì£VY…_¶ÿmÏ¥¿endstream endobj 2478 0 obj << /Type /Page /Contents 2479 0 R /Resources 2477 0 R /MediaBox [0 0 612 792] /Parent 2454 0 R /Annots [ 2481 0 R 2482 0 R 2483 0 R 2484 0 R 2485 0 R 2486 0 R ] >> endobj 2481 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [243.9367 688.9373 276.3707 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2482 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [303.7127 688.9373 320.6492 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2483 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [228.1626 431.5579 250.634 443.5131] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.1.1) >> >> endobj 2484 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [277.9759 431.5579 294.9125 443.5131] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.1.1) >> >> endobj 2485 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 102.2712 516.6856 114.2264] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.1) >> >> endobj 2486 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 90.316 99.1185 102.2712] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.1) >> >> endobj 2480 0 obj << /D [2478 0 R /XYZ 64.9134 727.2935 null] >> endobj 290 0 obj << /D [2478 0 R /XYZ 64.9134 581.2257 null] >> endobj 294 0 obj << /D [2478 0 R /XYZ 64.9134 548.5013 null] >> endobj 298 0 obj << /D [2478 0 R /XYZ 64.9134 275.9566 null] >> endobj 2477 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2489 0 obj << /Length 1694 /Filter /FlateDecode >> stream xÚÍX[sÓ8~ϯȣ=m„®–ÄÐ.°t™2La!<&u[Ï$qqJÿýÝ|I”^ÙéL#ËòÑ9ßùÎEz9=ùG5ÒÍÆÓ³qÆ‘&Œ%ÃH)LÆÓÓω é„fg‰L'cœ¼ÿR•¼{ûîu:aŒ%/?¿MK¦XŸ¸Ù÷ŽR’¼:þÛL¾HO¦GÓ¯Ó7££éˆŒ1ü‘nGš!®31ž-FßGŸ¿âñéߌ0’Zޝ`ŒÓJŒ#.œ±03}ýÛ œ‰“¾È—ÆRJ#¦fš"N9³¦N‹zAÒ‰ "y~ðÌ Ì5j¡RI™Á–æ»Õz63V…ù f¯ <)ÏÜ—ƒ­¹F*Sá[·ç–|ª ü¢ÒË›ƒh»ÇÊO40“/âUí~íŠïkófîfš*¢Á1‚uO‘ˆ¡€"DúE("gB•FBj#¨b¾æáXÊ *äïSl€y^4ó¦ðÐ<·7Ê$Šü°@cB#Ö6óþ‡Ì» ¬‘H${4œ „)øeçÁÁ¶0‚Ïp¶s1xX•¾@vˆŠ(Óä®Rž?{´"&=V‹Ãˆ†¤"!&òåiÌI1ÙrÞs[ŒF˜´Kòºp>¿¬‹Óâ &|hsê^”ð¼4/à÷§£Vu F&E7U½r˾`W–Ø–Þù¬òL“ˆpDð¾ßÉ0í¼p¢ <Á—$0…ô™B¨BªÇ—¥Ž ¯ëª¶‘³eÒê¤Z1ÙËÞ§ŒB<4ù·rn´/›”‘äúñN—ãï:›Àr±f³ýŽM™D‚1j?–ˆ!³–EüÈ F° ¾žU‹KpÔC),…ÀBŒsáÂ3ÕYR,Œx£ÚܧUd+ ugàVˆs%û;§þN^ì»·™d06¾‹)µ!TY¡¯ŠÕ̸­´j5eËÚžé)ò¡X­çÍ~—jIoL;M†Qg’ Cƒ3¤X[xnH¸ZÞˆ:»-[为PÕ¦&”& Ï ·2“Ýï…‹LÆd²jÌ¶Æ ¥Â…Ÿ¥ÞÌk' ÈÍ5ª”ˆr¨ø„ -„£à¥C–b´1™›Í}ô¯Í¸ôá僧VC÷I[k£¶ÍeILCæ¹*­AOÝ:‘W(Pr@JÐBnKµ£b‡˜¼y˜¢Œ(¿>’¨‚ÂD‹2Œ°äi`vvƒÛ›@NÌ [~@¹Ý€R*Ä04ß $ù}Hü$ïRönˆ¶®Mj _¿ý‰#MÙoGððÏrñ5ÓÀÊ”æÃÈÞ¬é±'Õ :()·œöPéNœDk:óé)äeÕÂáÛiyåÛi³˜Ã?bzÂTCj¯Í´|L iÛ+x É¬€ìÑåùŽV½×NKÄ­t²³U)øl½œÁ¡è¦V?²Uφ¹Óïhȸ·¬–?òÚóÑ6îå,<•˦8/êÀÏ~Ü3ˆÙˆÙÛoü7T¼_ãÏ7õ™v‡Ž“|Qøá‹ºl®wtýÀ‹L¶§íø•‹$¦¢Â/î*5Ì]ZE—³òÒÞ†ÀÛ3˜°m°;ØÚœ ÓU¬‘A€Ë~Û)“ª>éÕãØMbª%•±ú61¦1²zÙòà Ì#só{í_ŶʠÉPY¨6Õ;Uv“ƒ0’Rè@$— ¦å*ÅnÖ=ù‚ôÍ]$¸¶vžW„«¿ÊÚp•ÂÊÊM\™‰ÜL\‡obçdä|×!b³ê:·n£Ý!ÇI¡Æ6f@\!¦¡C6Á\7®µ#[M–nœ7&.ú÷tíË”êd½0Æ{ôj÷"ÚRÈ×RPúËv´wT³`xáéˆg™ÂCož>ãD¡äv}9mïý¸¨íîÂ,»‡¨ÐkµøC*˜íèÛ%ã·ÄÌ í>pÎìn»Lƒðu0endstream endobj 2488 0 obj << /Type /Page /Contents 2489 0 R /Resources 2487 0 R /MediaBox [0 0 612 792] /Parent 2454 0 R /Annots [ 2491 0 R 2492 0 R 2493 0 R 2494 0 R ] >> endobj 2491 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2186 617.2063 393.6526 629.1615] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2492 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [420.9946 617.2063 437.9311 629.1615] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2493 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 392.8795 516.6856 404.8346] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.1) >> >> endobj 2494 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 380.9243 99.1185 392.8795] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.1) >> >> endobj 2490 0 obj << /D [2488 0 R /XYZ 64.9134 727.2935 null] >> endobj 302 0 obj << /D [2488 0 R /XYZ 64.9134 509.4919 null] >> endobj 306 0 obj << /D [2488 0 R /XYZ 64.9134 221.8487 null] >> endobj 310 0 obj << /D [2488 0 R /XYZ 64.9134 189.1242 null] >> endobj 2487 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2497 0 obj << /Length 2520 /Filter /FlateDecode >> stream xÚå[K“ã¶¾ëWè(Õ.1x?\N\vÅ[Wj“”çæõ«áβj$M(ή7¿> € A‰5ìx’Ë EþÝ ò»ÛÅͽ4ÈH*—·–’#C_*†‘Ö˜,oï~Z)Ä×Á¯nך­ªf».c«Çf¿.¨Zmàéª:Ø¿‡zw¿þùö‡%ç å;‚Ù»‹ïoîà%F¢q#År³]ükñÓÏxy·ÀË)£–Ÿá#f´Xn\€LÎX¸ó°øqñÏ^`$±Èïì ¦¨ ÒBñ¥4qÊ™Ã÷eÞ¼¡4jÛ]ù9ÜÚ‰»6±Æ( ‚wmjÐÓfUúŸÖB®Ê¦.߯Éê¡új]¸ñ?võøûebL­áþòA?×íG;žÃÞWv-v0€»hà¢|ðZ¿zpõùãþ™Á«GhÐÔ¶½[Ê.C ó©Ôî?R˜è}ýiMõªÐ=zooLÍŒ Œ¨`ê·å¶š›Y¹»sÖTpBÁœ„Z„ #õ µ]ƒ ~ñ&i[dŒ÷ÈvþÉYTŠ!Íx@õmS·_&`IDQ]#Ô‰!Q‹‚tmàGA4˜)W®é÷Vù;q¸ÎP@rè øœ™{cè˜îΘxÐÏYY¾YÝeèqŽN’I$‰a=Æê#ˆj#`°¸X˜´ÕRNéxmă˜"fÎFb9MV¸€%Þ;.ÀÏŽ{ x ßCu¢}jâZèe<¿ëTÖ‹œÑ5 ixM³¨ËÆÂašN›JÑK,b‘§`™4HRJÆ`«ÆõH–Œ˜O¥ÖÞ ç Ò®ï”#Ö&¥3¡°î‚Ò¬9ç± âªß»®'I4Ál$I*m I¬µ Iºd$I$2E’ì I²©ô7! e`Ûø9=ΑDP˜z†$D@ôC\J’ºÛðË‘I‡˜«{f#˜).)° 4ç÷v4\^¹äcÕøáKÿôˆX>Š! !!9 ȇ׻}èêBº*Ûý6ÞxqmÈmÏR4Vïu+6P4½dEã5k¿KÑAÙšZ¡ž £%J´o™ ±ÈAG{‚Ö;«Ö¦c¨[î4E>”ùÿ¡¨ ˆ1Ð_š£ÈhM¦]õõ1…†ˆs>½??Æfï‚;G¥.Z}rù}¿ßîÛžwžžX+ÍqYÀíŸÉmŸC®Îès"èëyÊß¼!qE@€Æ ˜ïÿçÓ3–& €Ï{h…³¹¤Õ ~#6›´ß-3úHdÊoÄGûÅÛz6¿ŸY fx¦¤#8hXÑÿF þ{Rr£ ölØØ¥lË_Ž­G+h§ÁŠF’Èë ?,b‰§«c0Ä?’ ãv•Ðy}½ÃD”÷~q,ENO—I»› Áâ­Èë®À_ÞwËF›bÐà¢"ƒÊ梒F:¸¨ÈJ›ê±©Õ®.€a+ÂYßåjW‘Ä O!«G4‚Ú;ª ÓâÖµ ØŸrí¦r ¶o-çC®l‹ÿBª}‚p$•œ©öYýPÉþwýç×W„4‘s•Ó«2ø‹xYîöÛ²>u '­H´„W{Š ±ˆEN¸ ÆÆFQö¾bð1V ûÁ<#Ö q«fHs­ÆXªÃI™c ”̇±—8ƒ‘cGúl?–'kÎa;Å0ŒƒÄ9Œ°æ”²1ÄWÍþòœ7›ò;à±×¤JG)™xó€Ž`Õ¼þ±·´oÚò}ýà*¢íšõ§æ±ßé£dîúýõÇ¿wŒ=}­îêMé+¨S'·Ønäv{Ôámd›Ò 'ËÀÉbÕŸN7÷7lê(84+Àç]){mäªr…]‹ÊÍP¦ÊAX$ÃhÖ¼D^möÛÇý“?'¹ZbãD!€¦¬„__Ðé%±È OKÀ/h¦†‘ç`ì0c¯ƒAŸ£sŒÂl<ù¿T‡«Î9õ…àîhà(UŠö¶õvð­{BNÍÈPD™ ›èáiã_mq¦s7¼ZPðÖÕUO‘@FJ Ûà[ß‚Š%0µsº“RØÖ¤LíÉÿ-œ¸B²ÿ0U‰‘HaNç^!‡çŒà¿ˆî#Šû .^L½A5…m×fó1?/y+‚an“rþ)Ø 8MÇ€ÔkÍ:¶ƒX`â‚\ÿ‹¥b$¹b©ôìúXj4½ËŽfû.ùŽfc‘‰£ÙØôÑl>•¾Œ†BÌ)œ˜±fˆø$Q$WFsÖ¢=š¬ÙA,3eÑñ/´èÐ%£EG"Sƒ±èl*})-•‰ÍŒEÛ ÉijüóóNþݳ£CærmÓëC4wž Ñ4²Q!©š ±n’µÿ¾e¾Ú,2Qûa¬}íuk¨½Ž°&k¯Ù0µ×4ƾö:˜¬½æÃØ×^g0vµ×Ĩö:;dcÒoYw¥î0ÌÔ])ì ò+ë®ìŠº«Õ]ÙlÝÕ²ñOÙ¥¹¡‚9Fœ‘к°_%qÿ “+~òï)­´Î[¤õ°ð«Ý~÷© è7õ¡ †ïPQbÔãUÜ㤤65ð¯)º°Î ì~¯þŸ.³’°Å)™¬‹bm뢯ZÄ «1-ߢÒ|´7bÿ5V+« õÙŽgk®{÷±aå›õ¯t–w¾Y= ‚´“ÕÚn[ÿØ®é?[ìBÍ‹ý‚щi÷Ýÿ ãø3¹Çð]4úà>êÛ´>·el›£¯zûÅž¬ÖŠ%—TkYôYˆ‹&bËÒ¥e­Ë2Çõ—N“¾lÜU°«>ôö±õýÓ¶û˜Ïæ§]ÿiÜ#aIÇÈО‹hêÊ!:pÛId›Ö"§„2~­w˜œw9Á"ÝÅ;L¸]–ê®OºýÍ_:-øu>’lC&â^q*õŸ=Z“Þ’!üzvxMcËZvŒÿGñendstream endobj 2496 0 obj << /Type /Page /Contents 2497 0 R /Resources 2495 0 R /MediaBox [0 0 612 792] /Parent 2503 0 R /Annots [ 2499 0 R 2500 0 R 2501 0 R 2502 0 R ] >> endobj 2499 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [175.1796 526.034 202.6323 539.0851] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2500 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [229.9742 526.034 246.9108 539.0851] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2501 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [250.274 18.585 282.708 30.5402] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2502 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [310.05 18.585 326.9865 30.5402] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2498 0 obj << /D [2496 0 R /XYZ 64.9134 727.2935 null] >> endobj 314 0 obj << /D [2496 0 R /XYZ 64.9134 454.9171 null] >> endobj 318 0 obj << /D [2496 0 R /XYZ 64.9134 183.2101 null] >> endobj 2495 0 obj << /Font << /F8 1548 0 R /F14 2010 0 R /F22 1606 0 R /F21 1557 0 R /F11 2356 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2506 0 obj << /Length 2405 /Filter /FlateDecode >> stream xÚÕZK“Û¸¾ëWè(Õš0ÞC²gìl¹ÆÎZ›‹×Z¢G¬Hâ¬ÄÙÉüû4‚%ˆš)ÑUq¹ÊâP@£ÑÝß×Ý€Þ,&¯ÿ¡§Iåtñu*92„ñ©biÉt±ú4|žQi°œ©yF0Ƴ¿Î©ž½÷þŸóŒ16{óÛÍ»¹f³Ef7·þí‡_ßÎÉì§›¿Û—›k>[¼ý8ÿ¼øeòv1!S ÿH·"•ˆ)¦ËíäɧÏxºšàé/Œ”QÓGxƈ-¦Û  ÎXx³™|œü«˜‰Y,òÝ)%‰­JC§œ¹­¾ÝƒÆûÊþ8§©TaN4uÚxU‰1´¯ª{ÓWO3B‚œ—åçaÕ<úô쮥TˆØîšF»VQml ‹…v»^û­Ým?(G”S»¶S¬Sù,÷¾ýs.ä,ß—ù0Õ¦h¾ÛÁ+/©¿ª‹½¨wå¡>·K/w‚ó}]æÿ÷¦t‚¸ªÝD A\ÃÎbC\gÛVäãR£–Äô­[îu¾Ýë²ÚkË$ĨfÑ”gDC„išŽ©¬•˜Å"O•eÒ I=e‹½þ#%ÑÐMjA8“6sÇL‚#%…¸&¡”\Œîc0Y¼6Šm8×ëbï£;÷߆ ·ÿjÏe÷n¨•Põ§= ѾFÃÆ ­:lÄÆªŸî‹Hƒ8ÁÑÈ«!$f±È$(…3¤¯£ƒÄïXà xöÕ<T8'Ã+r)£ø› …2pÌ^ ]˜q)P1p!Õ¤pŒÑü;I;1”Ü‹ÇuuhV]¹[hl#$§=Có³ÈŒìxk"dú¦Cfìœgf­0eĬ‰ÊZ±²²Öh&ý†XäcbKPSé X¤Imä8Ò {j„hjlž)îéÑ"dm3‘ÃJá߀-¯%¢Ô˜FæÏ§‹jD$5Gk&2¥] ï?ëjÛ ô`±¨ÙŠôQÙ¡öaË|äÆËöT² @·c¿ªm.›ú³MàUC õºRlí4›½kÛ&=¦î³à7øƒ¡ Ãi9Œ1-G"‡Òr¬c›–­ï›´üópNͺßINš Ë©ƒ4 ˜ÆêÅÅë rä1XˆÃÒ=ñ™õ–U¯ŒªYõàs¿Ç`SOØŒŒ­,Óõ×ûÜ4ÁWnú ºÇuä…±0=èØÒ=ÏBº9¤c‘îéØƒt¹|¨G³îwÒ‘ (€ ØP+¥/ÄÀÿym“êzaÌWg¡c¬6vØÀ¸b ¯ªm^žVÉÔ ­Hä«á$f±È¼|‹îkÙÂk—¨è5FÊV¡ãé$^ÒUC‘ɵ:Òu{_?+ ÌÅ¿OÇ ð‚Šœ0hæ%í«|ú<ÌQ£…é7!)& ¤_tTfœ%)ˆ?hÒ.‘”´¢é· ©¦(?IíÕ×ÈFXaö  ª¬óC8tó‡ÂP³pÕï66ÅîŠ'‹Ä—¶#å$T@MéD–PêúÛü¿ÇÑE€ ÜY¬à¢“]LÖJÌb‘§þ#Œ"*ïVvÕÕ¾ôˆ=2„¾¢a¿c"ò;o9ËD×Ó-݃{©¸ÜA^y»k(,úf½ÏïÇÆRÈëDˆ×Åv” ƒ»Kqtï‹û}q(vuú8¡ôÙ휫É7HÌb‘ òU:|z„Å6Q$ÂŽÛÊM0:ž®­Ä ºr*4„÷uua7̾£ÅÀøìS&EšR=|Y ]À€úôa½Lµ¯ó/–Ý ©çŒÌŒšK;ïæãûîVm_¬Êe^;¢†‡H.ƒˆÄ£\!ŽìPž ,°Æ@ êËêþ锳Dê.˜ƒˆ8«‘˜Å"œô-q´°ë‰ 缦‰MC÷¡Æ%ì4âÜ_ÌŒªTgs°Ü!a XÍ` ó¡2T°ó^cÒL9†Ž•’ë;° 0‹%&ìA8XÑná`‹ûíCSÛüؼ$);qƒ„aº¿ÏŸŠÃÒ­9KÂ;Rà(&S¶Ñ\K9Ä•B8õjÛY,ñÔ6œ±ìÖMcëÒ˜Æ>ÓÎ41ä p:¢ÃÃréÊVþ¼Ä+eª›j©CÆtk\J«î¤„äÊÃ1i³Àc å‡;óh.ë¶ÌêoOÑP,.œÈ<®Ë¥mÑÖýã’¦,Û»|[4%˜Ûwu5tg+0I™Š60*•ˆ¡d@rn‘+ºcõÔÏ:éñ¶Úg˜0öröåW°o|ÅEò=u¾¿{Í"9v‹#¾Jµó ©­MI,elÛ¹ Ò²¤¼’%i´ …Úå®.îŠ}ƒ¶–Õö¾zØ­Nª=û;&Å”@{Æ(»¾/l%f±ÈD±0„BXu+ª:ÇÏ_ªjSä»@ œ¤Nš†k -ùk5¦"‘CÃR8—=”5RBevuúèlvqsóx[<þ;ß<ÍŸ¿íVU𴉔ˆ)BŠv{¾›{î’ãT:öö [ïàÙ}é~£ñ§%9÷ÕæÉŽå®ÿLuvÉ·~‹‡DX dOS·ö vn5q+vV‹Ú®/ÒT+€Ê©æÓ&ˆVѶ÷~.‰$ÐË Mò D0ò©°>á ú\@ ¯„é‡þbís‰™å‡C¸í»ÛmUÃÎÓ³0ÌÿW»pNof¾‘4³/ÞsTÍþSï»çÒ½óC’Ù—bèœD{˜iƒ%}` ôcþ’nß eÁ‚* ÃPWyñÖ0—è³¹›[<´—›p´á¶éãÌY!ÜÀø¬«íÎܧ½(mìÄí*ÿÕW;iïnRC(ÄÁøèG î&G`J㦻±ï6v9®›ÛÔÍCôUbxN+? »Ö†În’Þì]™KÞḵëï@«ü÷5ߊd‰%Ñ à§èÊÈ„ÏÀ‚€4AƒÌ­ ɇøúŒÛÀµ[ÍŠ²ùU˜5Õ®ù´wÝÎg0qjdÿš«ý9Xs¤!OÁNwH&hˆMùóÙô …2nïøÑ‰]ñ‡ÝféOì6ÎÆÃÙ_T ½$d¢h¯yÉ[Ä#y M<–CU$d>¤,ÜK2©ÿÆu´endstream endobj 2505 0 obj << /Type /Page /Contents 2506 0 R /Resources 2504 0 R /MediaBox [0 0 612 792] /Parent 2503 0 R /Annots [ 2508 0 R 2509 0 R ] >> endobj 2508 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [216.6907 545.2762 244.1433 557.2313] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2509 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [93.5394 532.2251 110.476 545.2762] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2507 0 obj << /D [2505 0 R /XYZ 64.9134 727.2935 null] >> endobj 322 0 obj << /D [2505 0 R /XYZ 64.9134 473.1646 null] >> endobj 326 0 obj << /D [2505 0 R /XYZ 64.9134 245.5668 null] >> endobj 2504 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F11 2356 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2512 0 obj << /Length 2696 /Filter /FlateDecode >> stream xÚÕ[[oã6~ϯðÃ#cÇÞ/@‹¢Eg(vƒn'—¶J¬I Ør*+ fýžCŠ2ÉR2V ÉyøñÜøRóÃÕŻ؅#Ns½¸ú´Ð’8&äÂJ¬¥lqµþ-3D-WŒRš}\Z™åÕ&¿^²l[,WBȬÌw›~ß¾+—Üf;ü{½\ÁߢÚÀ‹ò~8't¦Ôò«Ÿ.Þ_]°…ì8 ×D:­7»‹?/~ûƒ.ÖtñÓ%Æ™ÅÜS"œU‹Ý…T‚()D|²½øpñŸV ]¬¸$ŠZÖå›YÌ9Þ•åŸôd1FœRü´¬Ð‚¬æ6öèŠZʼn®´£„ áEþ€úç<1€a„[§Ú ¢™³Þ—¨µ®¡,QŠá¸ø~s–Èñ"²Ç¥Ò©•ž©œ;F¤Uv‘"9or­È‰Ùqgˆ…iu§·)u^Ö›¼ÞìËçh…ǰ"éò³ „åÃF]µW©È>X¡Ñœ³.Ø¢ªöÕsŠYBŒ8ŸJÑ3™” Ò¦ï|ÞÌæôfcˆ6NOx³…­ù«¼s ¤–a©ïŠ*xwÞ6N¯ÀÏC*Y¹Êp…ÄÄ]V{1·Eu:’iÌ £ª9†Bª›úó}/^sD2š´<;¢ÄU*r 8r¬‹ÑGÀïTÑMY Ô·Ë•â*»„Gìt`̦à¿00fMóZÁ•› m¡=W¯KóÞ¹¹wn›¡ н«Ð›±¤»ÒÄ2PUèÿM_>Ì‚j°Jh@OÇG2›ÙâcTCÇøHU´ÞïòMàŽXÃuž!Qâ*9!BJí¢l#¤Ü×=¬( £rF¬QâV+ˆ•Öt±n‹Ãá9FIÁ2Îèù0¶'0J /Ô3}ÖwyÏæ*…é̈1JœÂ6ç\t!þ·¨ö/K„³EÒ×’'Îð)¾ ©J)8ÖUQíú¹ h=—ü\Λ ™-‘Îð˜ÈÒ)¾óÆ.3rÞDäçMÁNpÞÙTúµp^I¡°SœW‚¿RÅ_íÑgñÞp¹ÁîûÝ=ÔÝ&Û?”ë@ê†(°lw:@’ÉÍ £ ;Hª±q&[ÎÈ„‘cL8ÅØ®ó7 kTs³ µÇÙ”ü—„ àéT¼]ìq2d˜&‚žª´ÛŒXÅ6\<}Ì·E?l¤"L ý°i*Á¼ÞïŽ ‡êÄ”JÇ—,[‡ñ;xWA»\"_Ëõ~*Æ¿ÖåàŸòíadùJôxži’èµÍ1:SãŒGgl9ct&"Ç¢3ÅØF'š~sÙYãVãñTbÎWóײ¤Q€¯4›ˆOj7/v÷/%i šÙ֠ѽ<â IZì2#IKDŽ‘´ìI›M¥_IÙ¡Àòšr9îÑÊA&·îÕ=G '$û@Ѷ^X¿Êmý7Î\!1®¢6$RæýØp¾´ŸHÉú)À6é_ïA©yÙd}´íhÆŸO¿óÇGש9‰BØÀáï7ôúøy ¼_Õùõfëýµ^ –}îûyKûB¿^þÜôgtãýv~ÞWÅ}ÞWy]f×Ѷ겄#VC ç‡ØÏ˜âãÒá¢ÑWŒ£üA"þ,oßù BØ-ÅXÔEèTÞ6$Šuá Ь”*YúAÙߊPjdÑ0hÏ£‡ÑÀˆ¤1„ u>“i%®R‘}Ÿfn4MFˆ˜ò¶¨ûK3hŠ53⌧pE$L¨ ô1¯ïØ€uÀò”(!T×JWK§³b‡†ºGFÐøÔaÀh G52nxÆ•8m;ðCÀ¸†ÎêüU9 \¥4ÂðÔÙðãÀã¦Ó"Ù̉3JœŠ˜@(šÓæwuR»ö¬H)‘øFÇ ?‡¿Öy;FªôlÔ¤ªŽ;n8a B˜˜f+q'“¨} - ÑpW»Ùî!˜Ê4ùîÚ‘±†?Heœ 4&¿Y ¹Ã'玟sNRcú/CÓ>¯‡9†nØi ¢Úo>PÖfȘMX!ܳ†Å²øiS7èòpI÷²<Žý§æÅ]쓯ówCõ;ø?,O”u ø7ûøý/—ßÿûýTè›þª`ÁNPv X_™‘n†U¡‘¸JEXÊZ‰ô mæá›2­„ Ñ¬‚Ý ‹‡hc©jZuµI!»Á|Ó|À~ìj´òCßÁ«ÏC†U’H'ãàOÕ¦îÓEÈÌØù´N(Q@º$»JÄt÷Nôµ$Ái'’‚v­Å:v韰,~ …ï|fóщ^¿7>)ú×À…€•À"ÿÇD6npuQ]O¼Ïo›ªÁi´2fƒ=a‹<K@á»äÁOkÔ7IÒYͽv¾òL£ ·cÃn,Õ©©p§€B¬^ã(ù¦DPø Šv¯Ñª2qAG‚™ó+ Á`‰ªÈ×½ƒÎ ÕLøÑ"nŽœíÀU"qàÔœÄw­FcHþ¿€$ï'’¶Çû>ª·U1VÎv¾ù¶Çç+¸µÙ°Î|уZ"2¼hÈÆø}lêáïg1ÜÚ µ Á@ò oyÍþ]r\“`!$N%¾mŠÏ¦¦–™ã_XS£ÁþD„´•endstream endobj 2511 0 obj << /Type /Page /Contents 2512 0 R /Resources 2510 0 R /MediaBox [0 0 612 792] /Parent 2503 0 R /Annots [ 2514 0 R 2515 0 R 2516 0 R 2517 0 R 2518 0 R 2519 0 R ] >> endobj 2514 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 367.688 516.6856 379.6432] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2515 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 355.7328 99.1185 367.688] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2516 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [256.5039 104.2247 283.9566 116.1798] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2517 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [313.6756 104.2247 325.6308 116.1798] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2518 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 68.3592 128.5084 80.3143] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2519 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.8503 68.3592 167.8055 80.3143] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2513 0 obj << /D [2511 0 R /XYZ 64.9134 727.2935 null] >> endobj 330 0 obj << /D [2511 0 R /XYZ 64.9134 531.5457 null] >> endobj 334 0 obj << /D [2511 0 R /XYZ 64.9134 498.1571 null] >> endobj 338 0 obj << /D [2511 0 R /XYZ 64.9134 247.7005 null] >> endobj 2510 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F11 2356 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2522 0 obj << /Length 3716 /Filter /FlateDecode >> stream xÚÕ[YoG~ׯàÃ!O§ï#ØElœÀAÖñ:J^’-ÿdD‹1â”â‡i…ï(Њ—é‹>©&-´I*„'ù*€óB†nšh'ˆfÎz |¿Øv(¸¾²`™\rœÇ,¶(u9á¿ÑÏ7Ýb¾ ÷Ë<Ø¢&º¡ ¸cDZe'%gÏ[l&ybµÜba™ýå.VÛn¾Þ»Åz5äVh0+ŠOÎP³ LX^Wr“)6%É1³B;¢9g}fÛÍf½2©˜%TÁŒ—)Z*“D¿½œu³KZ·1D§OX·… ­ùG[÷ ¬¸E+FsîÛM°îyx›Œ–áÑ®ÑîýP¤°îv–o뺘o•ÕÞ7JauÞµ#—`ŽHF‹‘Ïv‰D±)IV\‚s00Çúî)ðå=¥4o¸âFîÅÁ*‰¦– e‚4ÞÌ‹ëæ7‹¥·Ün&ØôÃØâ1Ç@€JÿÝ·¯ŠçMv¹~ˆ9Ц½Cƒ½Ebó®%R %ÀzTHu Q‹8²§Aà”Âz‚›Ý,VwC 1öª!/PVî4{¶ueŠMIrl] 0@Óbbdñùf1¿Y¶ÛÏxeá Ö*„ËyQY°õ2¬vO7íHn?jš£%û ÔX…Zà ÃrNA!"¤Ôþ«ë™ÓÓö „øµŒjÝVfy@Á¢‘X¡â‡u®‰ÝdA(×âù*‹›’bEc ‹Ã÷÷T†˜ðE×nž"(| oFˆ‹‹,)<—õDðëœ[°ŽÂ]¬FL"X)zI.ÅSlÐJkeŸÍõ»jQA)TŸP2^ŒËLñ—‚B-!àmËe‘-ÁŠ™ –Á«œ…ô}hd,‹U×>´›xûE¼ÍéIBièÐ/«nõu»½Eà]xÇLâ¬sÙ5W´P†i.'Ì-}¾Á¦¤8V…²ŽR½Ÿwä‰×{Ùþà¸Ý Èö`Ø‚¢,Ï1¤ëô)“1›ßbóäŸÐé3¥§~*´6 ›#º½›50¬…w˜‡=„ዚh!‚£Dœ™­'‰€9qÌüÖÇÄõ™ÛOiÝ:LÔ=†ôŸËà(Xux÷°øWà³ * NY,${†uƒÃ>Ô8K0*1E:æYh(³yV‹Þ¢DYc“qÝý„D+󑪃áùÞŠät³xxôô}ü^o»ô©ÿÎ_/’§H,XâûUüþ½_øŽ ¾#¢›ø’ÄÛ¢‚TFÂ4kÏÇv‘%$p.LW©U¶IŸFƒ”nEœ”}¨û•2S1‡x5ÌmÆ¡8À—Ù²@i6H ÝÝL[/õL#óªfè] y®ÚyÜ„óCÂÙ±XAZs @À1´m×;”ì] {æ*oÖ»~{{ä->ÁIüo÷qÌc\À½/=Ÿ*¼Bø§D9°ÅOþöó—o?A¬~]‡f a22¿‡z¸­¥–—üúõ˜Š…œYõ*–ù*àä"8„ZÔÚ–7H9ýqçý)Y. Õ4O2€«Û@ƒ{Ù™`¯ ™]‡ŠÜuéØuN.*“Y½ß,ºqåëQ}…UDwQ¢Ø”$ÇáURN´´z?³X{ª$z˜ …Œ5IOó$âðS‰–|ºš?µ1 I¨iö JÓ@£Øz•Üî¡Æ@ÝK€ˆŽHõnþAÂi4 ¨¹ëÇ d‘Û*%¤Ýµ÷sTí²#ühü¥9@’ÿá‚êð!!ÊÊ<àC9Óƒ¿Ê!|HF#|àÕ>$uc‰æ/æï"Í=€àã:€€Rqí€`ýœƒþöq¾\2x ýxà{ÌI>/¾ß¬±¯@¿ ¿ìŒìXSY€;Š×¶ÍÖÇ21ʸÆXŒ˜Æö0GDv°hÄt·óÝÇ|è§Úy ÿºÙÇ[ĕς à7»Ù†§.5 6D¨, Ãaû‰*t(±,“AùVÈPÐYµÆó…lï’má¢ç»e-xÔßû¹Üµ99ªöË¡ÆOŒÓŠº u36@Q'K¶&ÎO¡Ú?;Îá÷[ˆ ëL‚¨e:‚cñaŽm8€*i°ó© åæù[L™bS’¬´”!!—2¬<¬º Ð;ïã›”9|îB[¨õË¿Ûóc9HN¤I¹(æŠÉ b­.÷%¹ .´ê¥¨wøÂLß/ÀÕýUryî7Çæ©O‚o£Ó§¯!úU;L —³Í׬/½Gù”ú»mÉU·NÈoÀÉœt¸©Èt;yuDó* 8;½ü8xï= ̸ÄŒ_o´Þ.ww˜öÒr—~`)†8'KlV6¶–¹t¸íî$î)/CF2Œ¢þaËPiÈQ»%ú(6 ·*qàôˆ÷Îå¾v‰éÌácæzq—ù¿°³Çp Û*\E —\ÍcWÞ È5¬¨!c¯D= wéð”š;CïjcQú&·­nC±]~(véS¨zÂÿ{qªj{Æš—ôìÊ¥ÏnÂUM# 2vw"þøC 9!^,—Å!ƒ.ˆ©h~HauɽÖá7öA{+î÷LSë°sQ,CÞáfyq¢#âçµî³°šh»Ý¥ ü§ÒR¦ÄP—J¾.‡˜ ²jxH÷LXÜúu£nš²vñCê«¢ŸÙã>Y¨ÈºôåÌ•Q h߯s‘4˜@Hqæ>¢ü1–'!¯«͉r‚—Ï«ÂÅÖÖUØ®6úT^H#) æÛò-ÇÄÙîÉáÈÛµ?bPÄýy¼Jz4Ξ=j,oî‡ tÈØ·Å± B ¤®ÌAejÙó ôL±)IÖNÛ`Ñ#;QcÊ]­@ß»oßÈ`–!µ\hïBŸkÒj;¶“$´€”Æ÷•dq+é¤/ûzZ;À`¿†§6[†¡u_…y¬'=  g›¡Ý…Sí=–iwÁ4ŠÑžø Ì„ŸŸç›ŠÛÂÊ­0gx—¶ì¤wW„û[~-Þwàªôí ß1¾³…)Â.Ö$ØÈ3ÔópËB*µ=æM Ê¥å„p{”‰`SR¬¤ì qp¾Ÿø”/™œƒùö¤#!H¦¦WèùÈÜó+o7²è0³{RꩊË»¤ò¯º–Ÿê:R^óûNÍp7÷)ãö>íqI–Ëm¤€–ññ¦ívÈ‹ú‡hd¸çï6C¤Iúß´óqÍ&5þ¹ƒ}X"ÅÎm%‚MA±¦~€1†œFоØ×¨_1UüSHpRðMõß(€€…:w¹%'zÇWÌ0'$ï­ëí‰ò Õ½•Õ F,ÏEÍüaÙvá¨Æ˜Áñ\Ðï:øÑPªñþ>4¸yÀÂ^Ä\ "û&™š}bêx èûxEþzÐh ˜¸Ê™Úãê)‚ç¡>ÐØ¤QÏÿCˆL±)IV”!aã4Cßµ›#&¡q˜ 2™(žbR‚o9áúLú#‡üTšr`ËP¡Òù¨‘«TØ1¬m9Q8 §ú®ŠÃEX:ÅËÃ+&1þæìÐ÷U smß-b[.ç Ð#™kq "m/ðç ‰^³'Xûc€5 ˆƒR õ¼ÿàH)îÅr­úZx‰ ߯·#¶iÍÿµ*Kendstream endobj 2521 0 obj << /Type /Page /Contents 2522 0 R /Resources 2520 0 R /MediaBox [0 0 612 792] /Parent 2503 0 R /Annots [ 2524 0 R 2525 0 R 2526 0 R 2527 0 R 2528 0 R 2529 0 R 2530 0 R 2531 0 R ] >> endobj 2524 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [125.9623 370.1371 153.415 382.0923] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2525 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [180.757 370.1371 192.7122 382.0923] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2526 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [152.5294 314.3463 179.9821 326.3015] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2527 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [207.3241 314.3463 219.2793 326.3015] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2528 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 154.9441 516.6856 166.8992] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2529 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.9878 142.9889 145.943 154.9441] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2530 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [310.9391 142.9889 333.4105 154.9441] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.5.2) >> >> endobj 2531 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [360.7524 142.9889 372.7076 154.9441] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.5.2) >> >> endobj 2523 0 obj << /D [2521 0 R /XYZ 64.9134 727.2935 null] >> endobj 342 0 obj << /D [2521 0 R /XYZ 64.9134 605.2692 null] >> endobj 2520 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2534 0 obj << /Length 2788 /Filter /FlateDecode >> stream xÚÕ[KoãF¾ûWè(!QO¿Ù\,L°“Å‹ÉìÆ‹=$9Ðm D/Egòë·ª_l>Dy`_,©Ù]¬úº¾ªê"ýýõÕ›Ì"'¹æzq}»Ð’äLÈE&(1†²Åõö—eFôjÍ(¥Ë·õŠ-wÍý¡lv›Õo×?.¤DªÔNUŽ^½»¾b0B¬•È5‘¹V‹ÍáêW¿üFÛ+ºøñŠ’,ÏOð‘µ8\I2¥adõóÕ¿¢@ºXsI5l(ÊNw²Xžó®,;2”%@?*ÎËrë(Èò_Ê®¨u0t­3ChæÔûæö|튳ìÔŠd\Ê ì(cÏ '*ß!ç|¸lùU¦”‘³ø±wC{Œ©)mQBÕ]–Rû,;Ë^VÂŽI´Zv$p5Ÿ ,'’Ñvâ‹)®‰#Œàü+g-!~¥Šb<üvµV\…=†Qvž*³áûU¨ò™7`JGlÍS”3a¡}~Q”h)”çÎ¥ôQÝ:¹®\Cq¦S¨x±Aj›‡Ümà[Â],uÖŒC%.ÕM}ýäõ(æ!óoÂ<\³ÃÉ[û÷ÎV%ÆrKËõdkfË„ýí>ÃõtÃ·Õ¡Ø S ωÉXâ/æ{¸NEŽ^B)d¾Ž–‘ñ‹A&*PF区‰—t5‚i²®®7»#øÂ]_MÉ¡ÆèùÔŒ/¨)¡Úæ\÷6¾²óÑóÝtÜœÍW_K‰ÎJ‘*Ó%†àáçuu†+D^r>^ý?»hN´™­,˜´° ©‰Ï,šÃ’‹æDäTÑœ*{¡hž Ò×âÑL“Œ~Á£9%<—æ‹=zºdöŽŽ™2$N¨‘cvõ%d!ž/+殬ÏÓ!1e6:LÂÓÒ!ÅgºL3g¬“‘S…rªcÌ›»cS¨>ÜãÖNGüÙ0þŠü`sòƒJ"”ÔøA3’KæÊÆ÷å§æOÉÄ”Ùø1 OËŸi~„™3ò#9ÅTÇ3üÀ­æÇl¿’ü¡re9½P©\e2—ÿ‰‡³/«ˆ¦ú¡çÜ=Õl.wŸ¶6º{ÇÜçUGqÉ|ÕQ*r¢:ê(;]Íékñî @’Ù…êHÁq a¾Ø»ÿ°†bj×lܘĪåF Öd*ˆ3çK©È‰TÐÑq¬©ˆ›<™æx~¦tÝ›cŸ"ÂÁFž*•‘‡Æ‡•ààqMq³Ûûvš`ËÏCOú–¸îïïÿã¼ô–3Õ¾ºó‘½.·è°V4¥u\âû€¬+O€ )ž\*‚SåHËP(ˆR™ôdkÊúÐß'ÆÁkunÜR³L¾ØÇ¢Äu*rèc "¦ÉQź¼}ÃGl†NtÕÄZ€BRº}½Êõ²< õ"ö¹‘æ)l!Õ°s%ÎÞa!e7ÊôËñðשÄ8>ðžÄi$Ü7¨©gÜw¾ ¬³ŠµÉz-ÛIÛÀ/DÎ匶%§l ÓÛ¾Klû¦g[ß dNTѨ³‹+O{2°~j‹ž =Ž¡c \Р›€@®”~y´ שÄ!:\›RÝÞ7çºÅæßv„ ãK¦ ñ1Ãéqc#HiÓéÖe@n„ͬ·ø•‡G n893!ŠG̰8©)ù6|‰#ǦJ7µºAœAèͳ,dúkx¯$”µÕÀPl9$?@ a bC±Pòly}¿;9å¢ÚÆnS4Þò qÆ |dÁ–Ç“Ÿ ¿úJ,ÛP.bêЭ‚(®Š›¦@¤î'”2øÅ¡ï•µ…¯Ž@\7~…}“ / ñsj?o‰5>¢HoÉ“=õ ‹“Í)š¶Ü@^nÝ̧}G¢½ÙÝî#êZz‘àŒeÝÛyÀYQ¶|_5¶nI{t±k³<ƒò „=­dTbönÛºbÒæ½½›ÐÑݺ0ʱ;†—ï \ætt—lêü•2a•«ÃC9{mˆ=ˆp6Y´A>X£¡b|ëÜ9ˆ*ë[7ö„ìm?£˜3's>cÇî}ɉ?ú Ý+ã¯Âîu`snȺ÷†K]nªzÛy8hËÛ]´)ÖÅ8ù2eíã7û´‘‡R9Ýp¼s6Êú^/•¾ šøKxàQòñ¸iªÚ+…1ë6¼X=x‰ESÅÓvì§žëdHštl°ß\»}ì5HÊFQƒuNàb¶ßQm×AæËÿÚöÒÑ ðŸý³&:œ©«TON®åðØ?®|›ÁØ­ŒbƒM—{÷kPËâà'<&ô€§?*œsôrÇ{X2ë ªc´sÝ*–¾¬3oX‚†Ý$©¬ïã/kÝ#¡ëKÀ¥ €õœ•·-6÷\3üDdÿWÇn†CWboG›vþ°dÓzPÙeUݹ÷¯”)Ü[à­{¿µÒƒ•\í¢Ï€;N* ÈdB-¯±«gIb#×¾²-5¼‰ÑD.àœØ]s½È½§@hËà÷Må›XuŽÞ‡Ož·>´¡`åBLôÞÉh`a–J.ïšm¸/?‘£mCÜ]…Í,  ö'¿i(Ù}zhQò¥*¨ÒŽmšØñ}S—Í£íl—Ûpló_|KÜÝ5³Wk£ü —òí²Î‰ÏóîSSOÎÞ¿„ü›ìƒŒendstream endobj 2533 0 obj << /Type /Page /Contents 2534 0 R /Resources 2532 0 R /MediaBox [0 0 612 792] /Parent 2503 0 R >> endobj 2535 0 obj << /D [2533 0 R /XYZ 64.9134 727.2935 null] >> endobj 346 0 obj << /D [2533 0 R /XYZ 64.9134 519.5906 null] >> endobj 350 0 obj << /D [2533 0 R /XYZ 64.9134 221.7119 null] >> endobj 354 0 obj << /D [2533 0 R /XYZ 64.9134 191.312 null] >> endobj 2532 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F11 2356 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2538 0 obj << /Length 5067 /Filter /FlateDecode >> stream xÚímo#·ÇßûS¸ïä$âñ™Ü"IÑ´wÅAÓ&n¢I­ó °%G–ÓË·/¹Ü!ÅåêîF¶Ä>Yýgfç·C.—ûÍåÙ‹Wö¼"•æúüòí¹–¤bBžA‰µ”_^ÿg¦ìÅœëŠê™¹˜3Jéìïß_p;ûîÛïþr1B̾ùçëo/¬˜]ÎÝf¯ÿÖ¼ú÷ï_^°ÙŸ_ÿÉ¿øÇ +g—/¸øéò¯g//ÏØ9uÿ±þ¹&²Òêüêîìç³ÿüDϯÏèù_Ï(1•9ÿŸûQYu~w&• J ѽr{öÃÙ?‚Az>ç’(jÙ¾©úí-VU¼¶Å U¼ê^ٳũ”âöšÏQg«ýµûDljÞ9:w‘$TˆÚä7i #ÜVê\W‚hVÙ:/ß»8Þo—>’«Í: ¢û^bµæçÐö§É &Ëz9Õ„K.bÁß/½Ð‡Ç[§{ç9ûÊk~ñÊ™é?,9áʺ<ÖZþ²¸mÞ¿€bE÷–©¢þ˜z¿uÿo¾$Ä„ù?³44’;ÿ¬Pˆ¡ &Ë¡‘BjÝa…懕z³^ìÝÏírO®5ÄÕ¦ÚÖâˆX§ÑÐ*ûú‡ïRŠi¢´±˜ #ZIWíg1ꖻဠW¸T|€ŸÝ'  …O‰,ÀXbjü/O×…?èW‹7·õ±?ˆ`üÓô”÷€Šï.¸™ùc¼®Ï]sFxãN$Æ×­'BóÍ£¯Üëæï»MósѼÃÿe³žÿr¡Tâ|ýçºþsh|ñŠC̰JÎÜ©¥ÈË}È(•í߉ÿ{ã½”ºêN[—ïÚ/ï)·ªÞ'²ŽtÂ~é2®`)G6 8D;LK‡‰îïNÛñaòúUã“0‚8£UëÆï2¡®FD—ÐÆF–¢xNŠ}¬,‘L˜ØÇ3Oß1z„ÞGQRù†®H>åú7š:x«µo5w]µÝ,· "ê—ïüÿ=HìÌýa‰à[Ѻ¢’'=¡+»waÛ¼~÷B ÊF× —,š dKnH× UʘØ×™ŠÕ.¿V\°ƒõŠça¨×¢ƒ¡^¡ƒ…zÅÓ7‘z–øXËÕ·ñÌ¿VŸs˜Ú,|¹®Ö7M¥Þ7çù®sÕ;tè÷Üë@+à‚k}ýBß>¹~±œå[pBJ× +wœÈo]H¸‡VïðÙÍ¿P¼%÷BíB÷ µ‹¦îx¥Ë0K—»cØð¾Q‰ÉP¼Ü%_Uuì>¿˜+®š¶2_…À$Z¦2£¾¹/D ó$Úg´P€bNC‘oŸA$ŽÜ=ãù ºèb¨hàâ߆ OÞDNÆÌ÷þÖŒT´+EUÓÊÌGKØD+éTgþÔëÜ3k¢%;©!3Z¬@Í—bÕ×<ŒÕ‘‹ÏÉPôECÑC §q<}©zÊœçj¤è©"ÌŨ2_Õ幃¹/üÞ,ZÝ'JÎäPêS–u=ðø¼ùQ(r¬¸€Oâ’/q–#—8š‹¡ÂK†‡Nëhê¦Ñ§+[¹á éÓUʼni¯Ê\/¨oh«À÷¤æ+j}òŸ7ÃóáÇ L_á{É–8ŒËq+ÑÇ®ÄË.v5].qDyÓ8‡+£Ý€ÆŒtîÊR"¥l: —¬iÝ»A9®t`­ÒSÁ•c•:Ëq_£©ÉœÍ÷‡ Ì®e…3nèÞÓ„TÔ sÐR˜“¦(*Hn‰P•Ž3ôúÕMܲôqƒnÍ£§ž·>Eg} ³ÃCD}Áö ¢Æ: m ­¨Žè3§Oo >‰Üö@½ÏÀžÜ”…«+ ò”Å'¢+?€ñ +ùý, MÝDn®¨­ÆnÌmb~m—wãÖÑ–*@ü,3Fõ¥©0º¯6þšý °Ø€ÍŽ™¹8QvzÌG+ý´<òÔÕñ$ÐÇó4P¿èhÀ>p´@}ÇEãòÙ­hÀÙ -šüÙÖÌ“œð\ §ƒ¢§át=-œðôMã| +÷aË˧¿o@¥m2ñ£30zBö±Î©äüé Òü §ƒ7«¿y쫇½»ø¹ÑŽõ.úAãÇw…mmþȘ‹shrY¾©\5pgÑBbôWDVÔŒ/ÚÁÔs2=˜²˜ŒÂõ˜Äs´£dÑÏ’‘ŸÃÄS7FK¨KÛ$­s†É*‚¤gäøt/ü4J¦¢0 UŸ*&;ˆ˜& ˜„ÁÙló œJqZ”D;š&Ó£)ÏI¯'á$ž«”EO)¡§Râ雯¬²ÔŠh#G¦¤®×,ž^øï8&q4L¦‚0 Ÿ*&;ˆ˜& ˜„ÁyŸç¤q~ñÓZ?€w8N¦‡Sž“0`OÂI¸„!TSÖü“ÁÕYœC“ûºýž)ÒV±îõf7zÁînPGK2 V!Éa{¨(XGÜ Ï¿€ª’{TнBG‡¦n" rµRi36ö•’(%â±ï—_ŽwtuÔeÐf©£ƒ’Ÿ¡£kwÊZÞä÷“âFéüô®®µ8‡&3]u^3èáÝêmõT¦+e*L™Å²LQß@n™·Ë·—Bš“º[ïÐOý|÷ #ö$Ý'ž«éEOÓ¡§¦ãé›Ô¹%Ú¨ uá'·he¨w:¡L 4u4™=ÔK2{¨C™Ûz3õwÍÆ’ûpç’0*ÙiM- •€{Zy¸ÃÈ= Üñ\ p/zà=-ÀOßDàî<»iæÑÎX¥n¯ÿ¾yßi¦·Š†ôXg~b!ѹ¹õ›±îÚÝÙ¹Pz¶¸}\6Gùæm†~*S¨SÚ`+’€ Ñ ÛÒD‘<î¾4hü 4€þh€¥m", ‚TTÞ©U¼é­nÖà 1Œ;p6 HHÅŠ_0ÿ|#õ Å_kòÖæ¬}fD«Ïõ`±>®ºE¡_fÄ1BuÕÝHÛÓ9m›Í·ÍϯÚWÛ¿~Ο÷¿Ñ·‹\wEþõè7–I†v–•‚žfð 82Íðœ <+úˆ}, Oß4˜&*7HP|dð**E˜¨šîðnÕ }ñ’±mcamOok©ÞU½é¼D:fÕåÜ5;ý“qÚ'b´—ZüÎôËunò‹º¡™D_Äý£âüC^À§5nÃËO´bþ¥¿9Q¹2ŽòzKù†È†èlG¶²¯Ù"_‡/ #ê›ÙLåß86ˉ±ªitïï[ok‰Ú<Öµ«;À3åáÆfÑ£Â<ÏŒç™C[=‹–gšt4¿1í¦a¥ ­úžh0õOD44WÐJžžAO Ìq \0uJHÀŠ" B!Š=` 4J@ 8@S7¸Ðر}]˜‰ë´š.ëjsÀõöÖ.îðØ,ð ÑZ/â_÷­B’#4?%  À0€ÇEžE  ‹àé› ê•ÆtlÔà7b¦é¬‡áFÃA*6ƒHl×\y*lVëÒÚåŽ)mÅ)A-Œ ¥0öP€a<.ð| P(º ],Lƒâ雨r©1&PK´º]ÖrÈx¡7‹F„Di‰ÒR[ Üœ°‚ê¿´¾üaÐŽ[þh†ê/9Š:XèÐÔM£ö¹T#Ã^i"hÕ´S‹ƒªÆ*ÿ=±ÙúÅv ÁÃã$Tì„€€ÇžÅ8$Dq<*}ì˜Pv±ƒBäâpG€¨o»¤pë>¬«‘–À¥Ö™ÑíÍLï‹…Tk´ž´§B$6·7§+üîÚÁvÑï pÝÎ7nÚŸï>æ¦;à´ §4ý€— À•4y®ÀL—+x>®] \.7ˆú&ÒmøgÔ±‘{¸ûESÞtj·››°Ò›E£J¢4ßi@¥ëÅίÛvëÇœòúæª^õP/•}(t•"ÊžÔ%ZT Qíù£z\> yðPr0Ð:X šº‰ÀA)7BãcCU¹â³MËööv³8`I´ŒˆTmžP-\þô#eÊi÷mÆú¦Æ}³Â¡~ \׬¼óÿoÔ·F½ÂêgÏœ9®GÉm‘îP©SÚ!/-¥|ôlù8.[ð| p)ºè],ÐOßDÆ4þ9qÔŽi¤öÕÒtnWËÕíj}Hl£&Õ› Ô»Ýø»oÖ×õØ%3Ùé·Ž·ò¹î6|¼oÇJv¶Øv£*'5³8t½\l—õðk×ï[QÕ÷U³ÙÍr;L´D²”!%óS¶q"r`qyåaožßÎÑÃÀ•¢ƒ+ÐÁWðôM¤mÔ¿a+B%™îº–Íö¨ô†Ñ˜’hÍ#j=m¤\7Ó/ë XâéÑ ¥„íÚ §G VQ ièÓpL  ùxRr/àºWÀ šº‰ÐÄ?Œ²±Aç„YSu%º¾>'À2ORµy $jO({³¼í#6ë£@ÐR |øc"ÏÃÀ¢ƒ"ÐÁDðôMd¬S—ÞØ’N]þ…l:ºÝöq}µØ- 0Ž’Tp$‘`0^HKq`C‚ìÄ«;â8¥Õ)M £à0ÀÇž‡E0 ƒ`àé›FÛÁ*?I8ò¬eV"-ÕýÔk@fª­íßy€·Â/Ççû2vçÐâ¾BFDj…ÛÅÕnµY7¡LÉú4™Á1™Ê±Æhë¼_r[ÈtÓ¤g™IÍÌ`·sÑ?ÃIèxäÕåá¢ß+Æ»\ºÝ×B™=¥‹aháï‘\ ¿ßñ×É©âð:‘§«ñüë€\t¯ãqäÞ0ñÔMÇÖ%2«ó›¥ó¸{'Å¡ÂÕÚ7h{ã$÷mDJƒ§±38¦Ñ7=V‰Xä0ùA£qšó<Ž¡ØÂq¶W¾÷p.3Y3çœ:¥¥‘xYP.e¡§2ÌÂ1©ŒçaÀrÑÁÀeè`ËxúÐÁÓÔU{þþÑî]þøæ¦Ýgâ²›þ¹[.Öõ¢á›0‚lv4éÞPoðéj§¹Vå×ÿ,»½5™\Þ¶³Ñ«våÏâ¡m‰6··ÍÔõÃïs× &Ywå¤âígÏìGíoë™7¿o/ÕÕ>mmÕÖ3v]÷E{¹ÎýÚaÓ¬…lÂê½§êOÖ«› ³°VŠv_Ô~¹CL¤…ÿ®ëd6®Ÿƒ{¼½h/Êî N‘ÕÄ$›‘Lpæ~C]Ÿ*‹´›&ºScÅPkM»%¦¯|¨;`¼ÿM¨Ý¿üv÷uðëû×êå!›µ¸¥mÜ›6÷í:#㘹Ø>v«VwÍ‹}Ä ÷Ǩ­;QøÕð7ÍKíRÖUXvbÚœ<^´†ßÀׇßÎCî[Úë¶þ“·­©úè7¬ÀkޯŮ­,)ÑÀ]ù…Ù°úlœ ëa²Â²Ü¦#É8ÿñ„å¨%·]V”aXS2{Håí ÔÄלÛª>8C«ut¥L1!Ê? ¦.!õt¾OˆîŠ&DÛþ˜Ö¹‚s/^Õ~kXdšÍºÓ móõ‹æŸi²t¦Ý»ó À¼™ú¸ÐÜÇãâkêÊø•O²¥Ô­øÃÞQÓUäèQ“«¼ÊŽjž]ob‹yv‘èwKö‰–]%…•ç³,»ó¸Ì¥X¶®3ê>ܧÙ}®y‘Á³WŸiÙfZ6™–!Ó¡“,»ÚO²BeJÀ\ ˜ëÔÄÅÙ¤]«üóL`ÚßuýGß¾,î–€ÜWþz1åaeNĦFéÚÃÿ*cÛ´endstream endobj 2537 0 obj << /Type /Page /Contents 2538 0 R /Resources 2536 0 R /MediaBox [0 0 612 792] /Parent 2503 0 R >> endobj 2539 0 obj << /D [2537 0 R /XYZ 64.9134 727.2935 null] >> endobj 2536 0 obj << /Font << /F8 1548 0 R /F32 2060 0 R /F22 1606 0 R /F14 2010 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2542 0 obj << /Length 3741 /Filter /FlateDecode >> stream xÚÕËnãFòî¯ÐÞäͨÍ~“Á;LI6ñ’h‰¶‰H¢CÒcO¾~«úÅ&Ù’Xƒ`/"ÙlVW×ûÑúúúâê}¾(H¡˜Z\ß.” åb¡yFò<£‹ëÍ/KMÔåŠfY¶üW{I—u¿«úz}ùÛõ· !8‘y¦™™* ½xw}Aa$[Ð"SDJ.Ö»‹?.~ù-[l.²Å·Ñ…^<Á}Fx‘ËÅîBH€)8÷#Û‹Ÿ.þ®<ÄU òkÜ ÑVtAr©ÅBŒ&¸Áï׌jÄp¼kwg·ðáÍåŠs¾ü`ç`RET&„›ù9$Ê ËyõÖ‚º©÷@·²ýdoááq¿îë‡aŽbY‰—åú’éå=NcËG.W0Rµå~cGw8ã±ëdxã·øPîíVƒÁ¾º30Ûð’.7ö¾¿‡{ó‘X¶U‡³adë€Ö}Ã+λ«Z’ ÌŠ#µA V™<ÚïÜBfp“Ë))Œ ¤· ð1 ÀÞZ`75lgoŽ3‚+],«@lœÒ8B[Š'ÞøbT00=©ñÁÎHm`¹ki/@Ù”½‘;ò\mÜ×vš¹G6ßÄèø%‘¨t+¡@3P(HJfv¸ “§\ETá¾³·¥½ b0ᆣSܸ(Žâ†ïë[{-ÝümUšõÝc³¯Ü̓%b¤?þ XÑ%j±t2Œ‹ @Œy…”Ì< ­¥k< áýSÝUIQ7·údI×±¤s-HzFŠçG-‹*Üë¯@„%S±˜#`+æð³6´Ç—ÍÞM¤g6c³¢¹ýÄKÇVE; ÂÕ“ÞÑ ƒå®¥½xiGÌîìÐŒw0vT¢4_:Ä„—j+ö‚P D‰ýTÔÁ–Þ£ôq!áãÊÞtåÎÜ)XþtiuÐnÞ8‚™]µ5­ûjcߎÈF—SçËkœ„ßÕˆ¿>vþCäLÓZ¦2q•”Ê_w@¢9ã B™ðR„+ÏÁÀ‘‡9»ò9F‚üxCé0ÿ®é+¿ïÒÑ®ÞÛ«ˆÎQæ hLÔåÖ:ˆêÇrk"KÜØ5™¡'dre¨¹}{ÙW•Ö%¬OH|pT²ÐùÁ«{ïü¼4wcçwØ™"Ûç X1J25ñkÎPt•yV½IÀ‚ƒq/_Ì!HÂxÆO°z-€ Npuõj*\½vmµ{A%Ð8ç:ò²SMUh ½†5›¤¢ ˆW½¢¶Æ~ªåC[m*_±÷Âf,˜‰=ŽÂà³88Ǿi­³N åšèœ–œº`/Y ]dW`Г7/p8ÞJMÁŽ:gIhN”V#þk&³ÎY[ŒÒŒêiá|M3’?”wNq!O¨§—Î8d™ÕÁûK03¨¿ ÿLñ妯e>ÖYGÚæq¿©Ñ[áÓ­ñ&‘mRFYåàŠu0Ê/Xð —Óá}F†$Mc–Úx«†Ã·h½\¸jV†8^º rÛ6Í^ Òô ©û3Ò+± |;JàÒ+}¸‘xS3lª9ÉtVŒ:³Ì‡"Ü”WT tWzìN §¦Ê¿ï?úP/a±W¢Ëë!¸ó‘2u¢ Ÿ{G•/›!䄇Îè!Æ37[7uPÚå†„ÞøEœ€hùXs‡¤LpÙ²½«v.H3T†afüÖÆñRÂÅÔ ÷!öňeÇèÌ“y;ä•ÜŠ!l€Ç^ÑOz}\þx9$—–y;üuž½íÞ¦Rdp„BŠŽG’mÀ#Aw>ò"Í˨èœ`ò¬†€ƒC :Ê<÷¬ÜÍvÛ %W¤Ó.ZÀ;ɺ¤¶.cóë¹Éö¹z¶a‘¡€-ZàkÛ€ôQRoç½М9€½½šDÞ°ìо6õyÜo3nÌ0îhEšÞéwRÔ¸¶Ï±µ¹oe.¿ÇVÁçÌ£ Õ Å¤w¨­«Îhtƒ1ø@ÈSÌtÔéNêˆaÙï2€åný‡šæœª &?Ö Ž!ƒÏ™. K{K­Ðe¹Yò?#céHäÓ‚(ºVïRu°ÁMû¶³]o*£r›ÎI.óE¼¡×Ñ(€œiÒ´Ñ$WxŽÈT﻾Ü÷uéãØ‰+Í£O^ïÄÄU 2åÄ ¢õÙªm›Y@$!,É$¬x>’¢€S1ÁÊ}{¥ðy:vþ‹CJÁ E(Íäq¥€=*ɨߢ!u5‰è½/h•þ-XÅqqÎUíš¡¥fÜNüÈs:¶®èš\šÞcy³‡øøj.+AWbÒ½ŽƒúÍØq@ýb†ôŸªy„_€gÑÌ×Gøâ*™Ð:&!ë¤cÖaPQ}”®Þ`w^.ßùBHRÏGâϨŽâœê*—gTUG–C.¸ø;}TÜqAÅ_lIVJHu"Mœ´£ÇEœ(–Á -€_÷.í9¨¼¡Ï¦¼S楕wľ£ÊfžOycG”w„cP^WN8MuÏFàÿO*4Ë«®â$ƒÿïQÝc'OžLïm[Í´|Òôœh,M÷›ÞN9w@ocÞ×[?óŒz<¦·1ŽAoo·ÀÄÓ´öläý,Z{þ¤q ÊÕZžÍ\ЩƦþèšÏ62êpÃA°?M¥u9º-„¬×^ÝÛî°”GX+³›íô€”Ç{µÑZ2­“x|Eó_-ëâ*™u’‚Ë ¦^Ö}Y>FVd 6Çèù _@”ROGÈn°1fÐ=¢‰gókb¬>‚h ư{šøO£‚ä:³›ÿO%5m_Þ@”·2G'9Vþf>lRúÑ8ŠÛ¨,¤r4¸ÕáÀÞ—®‡®ÇŸå0ÓKs”ÅÜ6öº©úÐv3µ^ß,E8Ö+ÇåU:cÄ©CÆØ9Úá凟¾·Ÿûžx•ôÍ«ÖMþ¦`9ï0e7,G'jƒÕsïN–ºš¤+n“KpÓzùþ2·‡”…‚ð|¹²}Þj¿þd[wZ½ ð? …²åpœ1¬o7—¾pñ‰PÒ¬Ýôî­#åÚ=Ž(wØWhM΀3>üÃßÛû²­Í Õ]q¯í·¶fã0|›ˆ‡&t1þnªY`v¨¨Ò${½köàV¼¹úc9žƒûvsL¡ûcÕ~O‰&Ì‚åGvfyõöf-RYÀ ÐÆ3í1À;ºIªa¦v邎® ÿg%²ü\¸xGqeœÛÓ®ûÍA–À$=9õ”>U:>Ú‚ oë}µ9r8Ž>¯¼ƒváAQŠ¥pÊ’†ÿ¢”–êúb×YGíâ¬îâC #ø0™LWxøW UC Dg_¹‘çc¿:Ÿ‚,V:ƒs¬¤w„ 2¯±ùW…&™1é¤KÑ(}RÑý › NX¾5¢áÔÏ„@)@ÿ®ºµù“žA¥O'N3Ÿb¿í\€üŒÉW—>ü n¿ÈrO¼îÑFs•+6¸³£ ÿ”8pÌd…—&·ôü '*ü2ÿÁbàCþ„à§©ÝjßßÅsª¦?hÏ]ŽW@RP„ö4’7y> endobj 2544 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 569.3857 133.4897 581.3408] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2545 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [160.8317 569.3857 177.7682 581.3408] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2546 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [218.1723 425.9236 245.625 437.8788] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2547 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [272.9669 425.9236 289.9035 437.8788] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2548 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [388.7481 390.0581 411.2195 402.0133] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 2549 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [439.3259 390.0581 451.2811 402.0133] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 2550 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [387.7975 19.6514 410.2688 31.6066] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 2551 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [437.6108 19.6514 449.566 31.6066] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 2543 0 obj << /D [2541 0 R /XYZ 64.9134 727.2935 null] >> endobj 358 0 obj << /D [2541 0 R /XYZ 64.9134 151.1721 null] >> endobj 2540 0 obj << /Font << /F8 1548 0 R /F14 2010 0 R /F22 1606 0 R /F21 1557 0 R /F33 2063 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2555 0 obj << /Length 1563 /Filter /FlateDecode >> stream xÚíY[oÛ6~÷¯ð£„Õ,ï‹Ø@»fCŠbíï©éƒ"+ÇÎd¹KÿýÎáE¾I©Ñ¦XZ š<äùΕ‡G/¦ƒ§¿eCK¬æz8½jI,rh%YFÙp:{ŸhšŽ¸¶T'&1Jiòö]ʳäÍë7¿§#!Dò⯳×i&’é’³?üìÛw§)K^žýŠ“ÏÓL&ÓÓóôÃôÕàt:`C ÿ؆#×DZ­†ÅÍàïÁût8Ðá«%Æšá?0¦DØL oR ¢¤qf>8üÙ8Š'޶|’rÞ!ª¶œH.…µZ!¾]0ALÆ4(@8™ä^Æ[°.QÀŒÜà‚2 ãE9ó$Õ"õ“wþ÷òÔi·[j›ŒJm}@üÆ^Å!c bN ‘pÕH©ÏijuRºÔ…ñìì,V’q¸c¨öÙWYãÔÇ(ý¥ü”Ï×ù弄„¤¸J6(»@wMÔ†Ø×l>9vŒ%†Ûl|ò•\'_»ïX1÷/<® 3)«w3÷ËrU´>rëî„CkíeûÓ»Ûšy¶`2?À9~˜ï3И‰Âj]¸ë»lË‚p+UW~§Øf*-¡VÄÀBñ:*C2,wÚðèº HfdÌ<úÁ9P1ÅÌæ 毥q.–®¥}x\ü\¤+oq)I¦x¶WÌl™ÉÅÇOj)Gè†JB áâitWâ—:ÍËÕÖÊê*0okãÞwQ-¶1Lè¢")~¾`pù½ÄŸyÔžÓQIá{9ëU0†ÑÉM¾È?: ûĹ@øMOÛv«IdˆgÉ%$ª3¿±F{ód†É-8¨oEìï?oòMËf.Ì``’à¾Ù^¹­ƒñ¤(gëºìú„¡ Mnž ÏÒ‘ÔÖ}ÂX:ŸðW½ƒæ¢–ÜÇ !VEõÎ+âÀòúóÒ å2,;÷jü•TøV÷HfŸ{‚Ë5.Í›Qµ0¶ìØbVp©½Å¿“ÚWx~áVÉsÊzÕ~Wõ•³;<ój &‡•(t!^•0u‰Ÿ½>ûq{2†u¾ž7ÀÂ…”¿ FWgP")iØ[µxÚQê(J×1•Î*§¦à;ŸO¹%PŒ5X5a°i‡¯pÿéµ½endstream endobj 2554 0 obj << /Type /Page /Contents 2555 0 R /Resources 2553 0 R /MediaBox [0 0 612 792] /Parent 2552 0 R /Annots [ 2557 0 R 2558 0 R 2559 0 R 2560 0 R 2561 0 R 2562 0 R 2563 0 R 2564 0 R 2565 0 R 2566 0 R ] >> endobj 2557 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [243.9367 688.9373 276.3707 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2558 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [303.7127 688.9373 320.6492 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2559 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [407.186 641.1167 429.6574 653.0718] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 2560 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [456.9993 641.1167 468.9545 653.0718] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 2561 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 262.4898 516.6856 274.445] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 2562 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 250.5346 99.1185 262.4898] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 2563 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5276 226.6243 377.9616 238.5795] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2564 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [405.3035 226.6243 422.2401 238.5795] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2565 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [407.186 178.8036 429.6574 190.7588] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 2566 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [456.9993 178.8036 468.9545 190.7588] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 2556 0 obj << /D [2554 0 R /XYZ 64.9134 727.2935 null] >> endobj 362 0 obj << /D [2554 0 R /XYZ 64.9134 580.9949 null] >> endobj 366 0 obj << /D [2554 0 R /XYZ 64.9134 118.6819 null] >> endobj 370 0 obj << /D [2554 0 R /XYZ 64.9134 85.9574 null] >> endobj 2553 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F32 2060 0 R /F14 2010 0 R /F11 2356 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2569 0 obj << /Length 2853 /Filter /FlateDecode >> stream xÚÅZÝoÜ6÷_á·jqY†ß’z¸’4Å]ŸîP¿µ}we[¸õ®+i“¸ýÍ)Q»\; ¼5Î g~3CåýÍÕÛ«ëZÔ^ûë›»koE­Œ½.U%ÕõÍö—¢åj­¤”ÅÏ+Uì›Çn³Zc‹Í®9-›}sß>eÑîWº*ÆÕZ×Θ«Õo7?]}¼¹R×þ©yí…­½»Þ<^ý~õËoòz{%¯º’¢¬ËëÏ0–ÂÔ•»~¼²Îg‰3»«Ÿ¯þ;1\GŽë”åûKêùZ «­!õ~•N¢ªØŒÝaڸ %ôûâ ”ÕøÁ* Wbµ¶Nï¶[x×íïyQÃ$³U|1ø·aŠ=ðWÅšŒô¥ÆÉRqŸèafCò ócˆYYlú¶Û!áè‹íâH€ Ò&´ÍöˆlÛ ñ Î=K8°ÝZ)Q;§ÉQrUà&¶,wøËšÁ# ô7ƒç—%¡A›Z_Üaß4»‘ÉP¸-àI´âE­lrø¾C ïQÞ·?j§vNX cIÒ7ÃÐöcóV1izð¶²4ÖÖÅøÍã~íBy¶4üл±Qœ¨?)_.-M†]©…SΟ¸ÙïtÜ&1D˜£;ˆ ¥Jd‡3ÒüV²»þ§ï>­<¬a©U0Øoyðt¼ÝáÉÐ%3ŽeËç1œE9-Œ†Xb³|+ë’¤Ù _> /_9eÏ4ð°íƇé\aÊÕ L€dÁl@tˆohã¢Î%ê¬kx*v;ø;®' iÛm·!™q¦’7“>èb€™t<Ȳa¢]hÃãÙåúõ¶ýU*»Æ ‹^´½®M´=mßãlïŠI´Û•®‹go#ï;´#àì(Á®@xàç¡g`(cà±ãeãÎ „Y&Ûvd9:½Ì:µ¼ÃÓü¢Ý¶aÛn ƒÙ2´µêµqQۀݭ¯Š'‚l\?AvéëâßwLÚÞ‰‹ñ^$|Ó7Ä™üªÖ¶^z!8ú}åA2üuä øLfÜ•ؘMÿÌ4”à·ÙnÀנŽèxÅ83ÀHƒ k÷T‰3§EàTˤxQdá ÃfG|ƒ€!DpÛMˆNýŽiC²È¤Î9E€)/&©æ(a˜4aÀ,éJÒ=Åi<û,˜]) ”CœIr®Îæ­„-U|”•z«3®¬Deuy’C@°˜õ'¿ É¿<³CŸsVÕ(úaœMR…ä½ÖÞ£¬[Fð%C½œ\,­}‡Ù£5Ð îâv8Q“¿4œÿn›eGÂãe™mHFUñ©k?ç2M8àíœiœÄÄExŒnоX-P©®Ûó+´ÕC˜#AHˆ0Aé¦ù!Xqsì^Ú ‘*÷1¢†#{XwÇäíŽX<€±ãšsJ~af 5ð©ÚÈT2©^DÇç‡vÏóp Ð^ß(¿†5 Šid(—P°σ`ç.«*)\].ªž?rèë ˆ÷VBȺ^ZøÒƃéÛ±o6ãå J%îÏ"ö»ç ' ´ ÎÔ¢1oªGØ™k^T|3Æ„Ù&ÇÁ¿k(ÂeuRCÝpͦÏ\á›=€+8SL‘ƒY,/ÌLþg©â i‰…Á•{¦›]Ìr®ç̓j}ÚN!D¹+°ÁÝRÇÂH\ÛR‚&¸ð8$Û´,øÒÍí”æqxG%Á¡ÑÊÀ/ãG@¼µQõÌZË'!n)€²áôj„7­¸~A’”É®‹G5ò^_t9ès8f¥T®°ÛS?W=1×$Ù(¢úZF>_¨i@㉎0¦.ôðH,÷XH‰¥E¦öÓÃñ_LSŠÊ©©7¸Fçj$'¤,m¾;Y0]×› / ÊåC~Áj]ÕBVa,ä ™Uí îÍŸ\ÐÀ±'XæC‹…†ÌigRÙáþÆ'Lñ½ Z†òTΓxùí°¡¦€Då׉ˆ'9+îÃÉŽ)€U€tP$L¦lŸø0&¹Í9¦Š’¡àv”Ajœ^=æðTZ0¿Œàüaª‘–€k8/£0XZÜ*ÆŽŒ–mØ™R Ò½C¬ â”4¤Kbuì§ØŠ@køaReI‡!Wk¡K[ž Ec€#ª-4° ÄRžtD8¦ÜÌÌ[jf0,°ÃÈO±”¡‹›ÉÉtjŽ4GH†×t þP &}¨õñ…—œšpl3ñ—jñ\{UOæÅñÕɶ¡´ÂN«ÄZt˜dâWNåÙÝ!vh匛8àÕ“ ÊÐɦW<8…¿éÒ¥‘ù´£~æ5Ò K_òïÏp™ u ¢ÅÆð½S© /&MÚ $\j>ÄK¡mNÑä•ЖøtäòÕœ¥þ·Šóy «Ý ¦6Ê(¯edß~á*ý s Ô suZÞ}ºt“1qØlÉcÛÂÍÀÙâ–².LRÊB¢ÝŽ'¨ëœ’¨;»ºâ’µ„n¥4u®/3óFx…K©rî#û4D8u¦¯¸žú¼`Õ§´sŒžSAT.v±¬§ý.ií¡-«20ºØpTK•À¨©lä¿I¥¬GUÛï\Š2^x¥ç¦…(”]$1¥¸ñÕ2]BH•çnFÑ‹¨Òƨ°sìBÏ=Ýž5kh­}>!9·ÅQ„›<ï¬V–úµ|¤„©´Jn!¡‹û¼LYQ*Y½ÆÞÂ1Õ‘êÙ¼)\éýÜ^ȵh÷ýšß¶Ïy(½@ñb££@P¥ÿdAIÈ3.¥­£5ñÏù€…µp•;É´¨c†!ˆeµyI,%¤¯£XcÌ(§%¸¨Šþ,rþì½Pµ«—EÙìÎËÅQù²!HîhtNÿiãpv ÎsIÜÜîÚZIÝEÄè$t“ /Û]LŸŒoÜÒŠ®Â×h¡d^Ãwƒ[/Øú«C;š"_FæûUš¸ì¥“×)ÂFP“‚É|Ë¢§Ñ^ AÖFØè%úòjdmt"_&ô4xŒSåKN¥A‰J÷Í–Ìå)([ËŽ'Éê"æ×Jøjº Y`~ur­m&•_´Ë@¥. U%,V“ s6F€f¶*—梼ªC^ý3rêMfohmmòé=%›k@Äʘo>Ýî.*󇺛L©'Àzñ|è.f† ¾ºé»†îЃßtá–/ ʾ}Ú5›Ôs⇒~ŒmŸmò|-*¨ÅbÀCm†Žp“?òe‘ÀšÊ×úî~› ~»¯.Û°†’EÖ‰ ­ÑÔ{â÷B¯±?àͯQI}P¢î¸ÉÁY |çÛF4Èwo¾C“änÓ—FÉßxµàö÷‹¼$ÄÔ´ùìo ä³uÂmýÏ‹ì@…™ µé³ Z£éïÓ& kj|Ã÷_cAŒN´ QÇï–Ú¡ÒËj Ÿ¯ê {1îíR”_ä·± ¾|’&èŠZå=/xÓ_»C‹¸¥Ð;àé.㱜W¹wÁ3¢nþ~ê1󡬕þfIü¹‹ÿée‘¡ryŸ?>qÝ¡±îØ s6Î:*ÔS½þµVœš62ÖCÛ/ #Þ«ÍõÔþME}ÁÊ]‹Zi™³”¯ –qKüúØÓM5›!ü ÿ÷Ûæendstream endobj 2568 0 obj << /Type /Page /Contents 2569 0 R /Resources 2567 0 R /MediaBox [0 0 612 792] /Parent 2552 0 R /Annots [ 2571 0 R 2572 0 R 2573 0 R 2574 0 R 2575 0 R 2576 0 R ] >> endobj 2571 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0784 688.9373 123.5497 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.2) >> >> endobj 2572 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [150.9426 688.9373 162.8978 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.2) >> >> endobj 2573 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [331.1376 617.2063 353.6089 629.1615] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.3) >> >> endobj 2574 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [383.3794 617.2063 395.3346 629.1615] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.3) >> >> endobj 2575 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [332.5942 353.743 355.0655 365.6982] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2576 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [381.8004 353.743 393.7556 365.6982] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2570 0 obj << /D [2568 0 R /XYZ 64.9134 727.2935 null] >> endobj 374 0 obj << /D [2568 0 R /XYZ 64.9134 499.156 null] >> endobj 2567 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2579 0 obj << /Length 2584 /Filter /FlateDecode >> stream xÚíZKsÜ6¾ëWÌ‘SÂxcœx¥R±×VNIô e±v¤Ñ’œ8ú÷Û €$8CR²D¥¬ª”ª$ l4ýîoæõÅÙ«›•%Vqµº¸\)I,r¥%ÆP¶ºØþ–(¾N¹²T%z2Jiòîýš›äíÏoX§Bˆäõ¯ç?¯H.R HÎñ«ïÞ¿Y³äûóïpñÛµ‘ÉÅ›ë?.~:{sqÆV~X"WDZ•­6×gÿ;ûíºÚžÑÕOg”h«WŸá™aM¶º>“™ ™¢]Ù}8ûOÇ®R.IF ;eåÈ=/f-òr+'¼#6Ëø4/¿¯ðØî²JÛ‹¦ IB…p,_£8, áÆf+eQÌg‹|‹Š ®É%dz‘¦¬Që2ɽòÿ\g*É«2ÿ6ØÇjç–i2³Š¥yÚ;–÷Ü[M \mxÅò¦nò›¦Ì›rs,­PàFD[`ZA˜0|ܰiÇ1Yž +”%Šs6¶¨ª}u,dÆ ¡œ¸œJÑ;™” Ò°w9fKz´ÖDi«îñhJñ/öèðàsH ÍUQyÏýÛàèð |ݽ»ÙÇD"Ùàö|·ªž¨qLqçõtxDW[,9*ZŽiÌr$*8³l(£‹ŠßiF7 iTó7ë4㙳5,³é€YLÉÏ0‹–•Á3{OÀ(ôíóÝtLDÒ/³éc"VÉ|L´” ÆDÄr.&b§bÍ9‹)ùYb‚ ¸#_ ]»c2&$#”iÖi׌…D¦H–_…/®B"¿o®Šm¹É›°‚•âf‹¿}æo|¹>2£Ñ’ª>ï€Çxˆ .ÍþrŒ'Œ±–dº´õl|iƒ^åAàíþæ¸Ò´(‚)Ó' Ü ]RSn|°º{CàBToB0³äP¹r9¼‘šŸf¹(xM7¼±ñn‹êº¬ë±f/ÞŸGôOá–c³ aðz+JÚ…ðõ~[^Þ}ã­TÁQcÆ9¾·ÄhÞ+%QTè§_¨å˜Æ,G.$¡Ôšþd§új¿)¶‡ªÍEè÷ó¹h1ŸY>Å „B‡n¢¶ŠL¶Šƒ/H r¿Æ°«šüc¹s f³,©³QÆÃ}çÞŽe–Ô$¤6Ü, 2æÇiM4AZ1’IDöÒm–¨Š¦Ê7Í+6Â4mISÕ…”¾Ü\¬­JŠkd¢í|ò+ê‘£ !ÁH¯Àag">½ý_›]~¨‹Ö1ŽÝþ}Qo\'îh'¹£ƒtùÝщ± Ñ´T´©º¨òÏ(0Jíóh៧L¢YjL«Rù œaÍïñË.ÛÂßæjÖ´ËŸ9xC^‡÷2Œ7XP}{ìçÆTˉ¦ÒaýµN¯$q!îˆÀ%$"(‘4еù´^uvk2ƒ.¶©ÏC"ˈµ4&¢¶ ³ ”‡ƒS†1®-t= þ“û?Û;äŸ_»²;æÊŠ#@[ÕîÍÆÙØq§fð‹AR‘”;&ù§°AQ4*\QQ“¼w;¯÷®#-ñèOA˜Ï܃·28øcj¿îLÖË}‹"9a·ŽáVþ÷ýxîEýø6™é¾Î;ß`¦÷ 6{ ¼Ýèx‰Ò©‚9C ‘ÖÜ{¢|ƒw½*‹¶÷g”Þ#ñŸÎ?†~$ ¤y<$ÿ¸ß•õÕ«‘à€úÆ…ðÔ¼ôúN¥TÄHņ~Y©ì¯Âé5 á¶ Ú†–Ɖ‹ã‹×ÙñT÷àe"½ÆùäMåÜ·rÊ´.:S_)œ"4Tw(ÛóÓ¡0҇Ξ Œ¥YjÚ›¿a×0®ø0€°Û²@³œÂ΄˩ô…àBA2‘úÈ[À¼(€0¾Úbá1«®>J…¾óïGSáP¨^EmîséáÌGðT ÉŠf£xª P‚§1pÚ¢žûKÅ›ydòà °#Œûº1ׄ‰Ùèßšh)è£s_‡’ò ”ƒ£Øz‰Žº`X¹ÆàêîÒxqûœ—öÍ ¶rЩa&ÜÞ!û’±íf`å 8§ ? ”âBÞ¡Ó"J*¤m‘8à×A¤.FNÙv,BÕGÀ£cÝ"ŠðÞ#œ°VµêðáPO[A;ÜcÜÚOÐýc`v¹?¸b¥zÅ|D¾wcæ•I¦ýÍ¡‚üÚ×YÆT;Ž–0Ãå“ëlÇ1YžÖY|«$DMGæ;Âà4cRÁàÅÍ$ʪ)ØÖxÛ!àš'JN­ ®È´zÊ«U´ÖWûÖJ´¨fÑ÷=àŸ›o½P®@j 1ö¾î7t€7<ß:‡ÓGh· 5ìqZÀ†š€báR3KäŒS©×TŠ!ä̦›Ë‡¹ wë¯õ‚¹‰2fîù’#™5ò¹QÜH–¥PªÙëõúG÷{àw<ÃŽ¿âÙsœû†g$é<~»˜2_È÷;a"QxïYG–ÜT>¼m¿´[z‡v Ìi“®I·”kÏ^¸síøÆ³ðkK¸úqœ_c½.¦Þ½rF¤½yUÄXöðúhà5RòR¸ë±Ý&`×ÈrA]ù‚ kÏqsÄ\rÅ!SÌ}¥ô‹!׈ã äÚR= rõv_âú..ìèendstream endobj 2578 0 obj << /Type /Page /Contents 2579 0 R /Resources 2577 0 R /MediaBox [0 0 612 792] /Parent 2552 0 R /Annots [ 2581 0 R 2582 0 R 2583 0 R 2584 0 R 2585 0 R 2586 0 R 2587 0 R 2588 0 R 2589 0 R 2590 0 R ] >> endobj 2581 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [261.6202 449.4397 284.0916 461.3949] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2582 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [312.661 449.4397 324.6162 461.3949] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2583 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [390.0145 437.4846 412.4858 449.4397] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.6) >> >> endobj 2584 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [439.5459 437.4846 451.5011 449.4397] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.6) >> >> endobj 2585 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [187.8442 127.6507 210.3156 139.6059] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2586 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [237.9501 127.6507 249.9053 139.6059] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2587 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [217.384 115.6955 239.8553 127.6507] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.8.1) >> >> endobj 2588 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [268.0373 115.6955 279.9925 127.6507] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.8.1) >> >> endobj 2589 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 103.7404 123.5271 115.6955] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.6) >> >> endobj 2590 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [150.869 103.7404 162.8242 115.6955] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.6) >> >> endobj 2580 0 obj << /D [2578 0 R /XYZ 64.9134 727.2935 null] >> endobj 378 0 obj << /D [2578 0 R /XYZ 64.9134 580.9604 null] >> endobj 382 0 obj << /D [2578 0 R /XYZ 64.9134 258.6179 null] >> endobj 2577 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2593 0 obj << /Length 1603 /Filter /FlateDecode >> stream xÚÕYKÛ6¾ûWè(£÷¨^ ¤I9´)âž’dY µ-GÒ&ÙŸ’’h[önkh ’©ápæ›'g_,fÏ2QF2Íu´¸‹´$2J%ÆP-Vï┤ó„QJã—sïòmUÌ!d\lòû¶tïÛ|—,·@—»97q7Ox¦„ˆµ˜X¼ž½ZÌXDáášÈL«¨ØÎ>ÍÞ} ÑjF£×3JÒ,¾À;%"3*ÚΤDI!ú•ÍìíìaÒsLB–/P=Î&ôÓ'’Kaõ{3<®›._V¿êæ‚Å(ô!:4J¸TÚ}?ÿö'ª.â7 ÀRoêîç¾)W¬È,ïJâ8¬DJŒ&H¬<%(…"”¦v ¥Cü9Ÿ`™ô” OH©í†Å<Ó±3ËdÚx™Ú‰“8€CµŽk\ñàÀ÷TÑïÖe¾z6OWñE¾ÙäËMylYÎÀvR©H4”`§¦µæs¶eYÆÁ¶‚0axÿûȲÇ$déL{ =à²"OFñ»²Ù‚ðl /& ÉR*z…7¼,ÛíYYȺªÞM@5x‚8é—£õêa<:ô£ -o„7i{_XO)KüG·àG©ˆ«;|ò¸[—Mé–ʯUÛùϹ{ 1ˆ;v÷€Ürpì¼§èÖyçhîw¨ä{Êdé~©ºõ”[d`%”5t ~ŸŒŠž*©9Iµd~—(‘ Œ™ª g$SÞÇ(.7ú$rÜ*j…ÏOðåÞ‚ÔZ³À¢Š·sžÆ÷4fsP.á‘Æv{Š8YÞ¸{¹A¥ ÷WšßãbÀþmïw¢A[û¥èÔ«@ö̦·xIÏQkj­Í@×Dò,þ ÓË…[Y¯ÓªÜTŸ1K‚iWnéÎf‘­Šv±BažE‹5¾˜qºÚ?מÕÌJ#%`\yÏ‚Ï{¯$¨|72©¢!Çd¦Yv¨bµk»|×UyŸ?Ci…†mD°åÚ1pLB–§Â ÍÁ#„-tÁ#!3„*8ñv¢w2)R¿÷vÍoéÑŠššGZI¢µï1þŽCïú̃‰+›sðÜ}õ~ŽIÚvöÛ®‰„OW›ã¢Î2ÅÛóÑ1jv³à¸Ö!ZÝÃþ$€t ’Ñ€òêè9&!ˉà,c‡2ÚÀò×÷y¾§AK÷=Ít´Ü â%XúÚótéúgƒ®)Ü&pÍT°HNÚbhvì5kô;ÅXyñvVd—–Ž,ƨ‚†˜jXo°˜ >Áû[C}7ŇƘ ÛºGظ†X ]‰§;÷Ì]‡Ç  åú ± G墻óíÙöëBq °¾Î|AüÛïL‡Üâj۩ʆímÆú«Ã¸ç˜„,'Â\î<ìPÒ!Œó¢(Ûö™3‘Ò„¢ÊGª>£iŽ5‚K%£ˆ^*•2×kÔsLB– õƒ²ñd'f]”+ðŸÐû/'¤›9Íÿ¥|3 ‰_©Gê7âC¹»$O_àþƒõ;Pífü"\cñº\Á{ÊVð€å¥ Êx®‚‡S‰é€¹È·˜C/§ádjÊ'2 ¤ìª)߯oŸª×,~úXO?:ÖË—õ¦j×ÏÙæzêʹžO´ƒ½ý Ö‘S0#‰Ê„‰¸ÁfA]_ÏŽIÈòÔ©™ðv·J+¦õë鉄‚aF_?Ñ à KÌI—¦YæmؔۇQn¬ƒéÒ°øÎ69[üAýx^Çr†Ã.¥à˺n=£Ó®Úù‹‡Ê¯Lù…`‚P©.÷‘pdb˜â%ÊHßÂ[{l§%~¾g{S}Ô[85š¡t¬\Ç8!<þá»oýdkiq(Š âñüâ2`vdv4ÇCf68YŒs¼ž‰åá7Êû‡¬o†•ºñendstream endobj 2592 0 obj << /Type /Page /Contents 2593 0 R /Resources 2591 0 R /MediaBox [0 0 612 792] /Parent 2552 0 R /Annots [ 2595 0 R 2596 0 R 2597 0 R 2598 0 R ] >> endobj 2595 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [333.9886 521.1154 356.46 533.0705] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2596 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [382.9552 521.1154 394.9104 533.0705] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2597 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [308.7771 222.8382 331.2484 234.7933] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2598 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [358.5904 222.8382 370.5456 234.7933] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.7.1) >> >> endobj 2594 0 obj << /D [2592 0 R /XYZ 64.9134 727.2935 null] >> endobj 386 0 obj << /D [2592 0 R /XYZ 64.9134 652.636 null] >> endobj 390 0 obj << /D [2592 0 R /XYZ 64.9134 354.3588 null] >> endobj 2591 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2601 0 obj << /Length 2869 /Filter /FlateDecode >> stream xÚí[moÜ6þî_±¨ˆ¾¿‡;$×Ü!EÑäß§¶”]9Î^ù´r“ô×ßðEµ«•ì˜â"ÕjÉáÙy†Crüòüìù?õÊ #©\_¬$G†0¾R #­1YoÉ$_çT,3µÎ Æ8{ûóšêìÍoþµÎcÙËÿ¼þq­YvžCƒìõOþíÛŸ_­IöýëØ—/Öšgç¯Þ­;ÿáìÕùYaøG†©DÜH±Ú\Ÿýïì—ßðj{†W?œa¤ŒZ}„gŒ˜Ñbu}ÆC‚3Ö½¹:{wöï^ ^å”#59åš{YÄ:–åÞÉ"!èiY¾Yá±ë1•wÍA“3æD¾´ 4²€"ˆj#VÒ0$‰ÑÎo›rk76L“rjǶmª½Õ:Ï ¯üß×BfESïÁWå¡Ú©!ˆk¡W1š‡M°¹0CjÒ0µñ«Ý¾-vmU´U½;DË$8‡fQ—;˜–!Â46lÞKÌc‘Ç`™4HRJÆ`˦©›C‚h„Œ˜N¥Ö; ç ÒÐ7…GSŽˆÙ=Ðu=Nz´HQÎu-Æ¢Hä\,Š1ö±¨ÚYÅvwvŸçx2%?‘5]j7ÖfãX#Æ`ÿ=ÏqŠÉˆ<Äóh|›d'¨»tvGªcºLun–sôc°»²êÒ‹ÜÓ’<®ØÍ³î>Pò֗듌ŽuŸŠÑóötžÑ]Ë„ŒŽDÎ1:ÆØ3Új4ÐÙÚv–ÍéüTØ,5ø!ólš#̰þ³®ØÅnn‰®üzÛ­êʰC'dä„ÐÁt£ÿõxdˆ¥éFƧ9Y$Çg­Üs|dæm}]TÇnP V$r‰³¼“˜Ç"'XÎÂ4‡˜,¤]šî/öÖ\›Ó =´˜&Mè#‘s }×ÌûK½)·à w=dOç/écȘø‚¨èƒLÏÀ–I®Â>{ÍhV7mñ¾ºòÍkF²‰<:°ý^¿{î¶F!ƒd(¤9º/ðØ‹3é:Ãê-5üG¼òe­û`#@]ÔîxîÚžÊ~x¢LÌJµq.‚tí䓉@cÅC ÚÜ6 ¬ÆÇ)•BDÂF€«wäTAb‹œH©8FÔ˜a`ï¬A½ÏÉÄäs;1-äXçk#³ÒiÎè*\<î'TaÙ`)íí?2T°YÍPœ_1;&e~œäå±À©DÓö!}³‘Zl`úûÉÛ= &猪t {‰ °)ƒ½¯Âf »¿ßëâÍ¡=‰bH ›~{ƒø¸ú}¹ß¸‹gÒ.}<1Ê&挈!¯ÀÓçÌ<ÜŒÄ<9aHH`½”ÃÈG†Œ#ñ8iP"î÷JûÛKHÊ~¹‡d‚ZV]ØO•Å3îÁþX~ªömhXøv7M×Î ©ú+z÷#˽ti{Sñ¡÷@¾Dx™6&§#®hCJ6;ÚÛÜZ™•Þɶ°±Ê>w~[^J–ò0 nÕßk@¨”Rd/®®¼ü[¯J´ñ/¶€fWný'fY … ëöá¢v“ÙÂZ |öñ²ô×ö·.¸ç:ð󮸮6ÛëpÙsW8¬Òãü¼oËk¯I%ÁKI¿'³¹¡…I0À©íîÓ>î쥌{zÍUظ» ¸k\MjHf¯à;µ÷—ï&NfÍ»»¯;¦×Úé˜^QvÚŠf/|‹È ù„»A¿ywU€a»Ý…nåïV­åÎs~Õs¦;ÚÒ- Â*‹—bHÛ­\Jü$üãæª¸õ»ù=LC‘^øÆá-ÌaÒŸ(OcÛã‡_ªnœ:Œ šrûÿÍQÞ~ZVø–Ž_¡×{'² ór- oàúªÚ_–ÛôÜ–×¾Á&$†ò÷ƒNTf‚‹ÕëÆåEœ¶)/Jˆ¾Þ ÖõÎìµÜmue·<®¹Úù¶qeAKüœ¡Q4gøV~òáï&üêtŸ²ÃÕÈ*ëîfß6Õæø0[ÙÔÐhA¤,ÅD˜Ç"§³ž‚Ô§oæ7‰õdüb°…ícœu¾«úƒW—=Y²¶_«°0È,€Àëõ—eÐc ˜wvÆ |ÁÇáãÄñ¥ö„Š< Ip8‰âÝI¸ç6Ö~›;Qæë,Â&¸)s7ħÒýn ÝŽ*4ºßþÛ&<¸z±h:+Ž“W£Wãr¢ÈÂ:X¥×ˆDiÄó§ÎÄØc|Cÿ …~ñŒSSÌk±?¦©qö*¾o™î*>9s?ÂxB¿dˆ‡B¿yÄ¡Ðo„÷Þ…~éœá‰” Á!ûÐ …~DBfÅB”ûVè÷h…~±5’Å¢Y ±(6ñ|,êZ&ŒE‘ȹXcüâB¿tJ~"wÄãžúó¦žã\ È»å·B¿”…~±î“1zÖž£cƒÎ3ºk™Ñ‘È9FÇ¿¨Ð/‚ŸÊŠj¡,„P‚¡ê[]Èã×ùEIÆð9¼På×·Mw)‹œ¹¡¼S•_:¬}•ßÖ®Êo„u¶Ê/Æ¡Êoc_å7Â8[å—c_å·€1Tù Þ«Ê/—žH‘$´ /l¾ŒD‡{œo¡ü±Kü4÷¡ ]…_$q¦À¯kõÕÖ÷ ®šªºoÎùûE.öþ;Ööu]ÒÕöEgjûb¨wªíKt¨í›Ú×öÅ@—kûRþ1«r¤FÇ(8Y”cfÝ_«>JMŽÕßÿi ¼endstream endobj 2600 0 obj << /Type /Page /Contents 2601 0 R /Resources 2599 0 R /MediaBox [0 0 612 792] /Parent 2552 0 R /Annots [ 2603 0 R 2604 0 R 2605 0 R 2606 0 R 2607 0 R 2608 0 R ] >> endobj 2603 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [219.209 544.2799 246.6617 556.2351] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2604 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [93.5394 531.2288 110.476 544.2799] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2605 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 236.1812 128.5084 248.1363] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2606 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.8503 236.1812 172.7869 248.1363] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2607 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [219.209 81.3618 246.6617 93.317] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2608 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [93.5394 68.3107 110.476 81.3618] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2602 0 obj << /D [2600 0 R /XYZ 64.9134 727.2935 null] >> endobj 394 0 obj << /D [2600 0 R /XYZ 64.9134 447.8595 null] >> endobj 398 0 obj << /D [2600 0 R /XYZ 64.9134 417.4597 null] >> endobj 2599 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F11 2356 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2611 0 obj << /Length 2736 /Filter /FlateDecode >> stream xÚí[ÛŽãÆ}Ÿ¯ÐCK€ÙÛWvw lØÄŒ5UuªºH}{{óæ­™XbK^Nnï'¥$– 9Ñ‚c(›Ü.~™jbf£”NßÍØtW/šyu¨g…rÚ¬áÔýfŸ+4­Íf —xií´T³_o¸ùþö†M(ü±N>/‰´¥šÌW7ÿ¾ùåW:YÜÐÉ7”h«'á˜aš¬n¤DI!â™åÍÏ7?µ‹(±HE~‹ëâ,³°Òr"¹qa•æ¨&ÜÀ“„"”j “àÈm»ê£1©Iə꟬Èií—Ĭå°$A˜0<~?ZP+±HEú¥ 2`)@«·¤ín³­w‡ç7qM)…QÄÈRL 0¯²t·ÜÎl9­õ¶`Æ¥7c½Ï€ÂEZ– $œãŠ_ÀFh¢8 %'LIõzl¢Ä"™ÁFRR*c»™SlÞSEÿzVkŽ÷F£)^Ð,H âx_çfí´Ü쾞Š«éy½…’„ƒmFÓ; ¼ ·PšH*ùY¬YÎ9:­¥&º’÷Þïêý©¤qÎè¨äÔ )Ü- š©¸à~Œ“’I6QÖÁÀ^í~Qb‘ŠÌ¸Sš\t3»ß;P:XôÝ R)!3n‰šÚ?ÍçˆM]ãç ÚÙZ1mîñ?Ÿ᜻¸óxÑ}ÿ qÝãÑaïÇVþê¶Oê( I=øº¹OnáÓEýž2¹ŽS-üY'hSà"+C ×HŒX¨bÞªý´Ã¹ (_«~¡Ó'Ù ìzï/l`E§>À¨!ZÛ2À‚pžbl¥µaLµF5µE¨2tÚ2HQž·É©L©H)À²~\§o„"UÛ-iP³E8„ç¶h§ÍvVp3…)›¸ðócÝÐ’Ä”QÓo–K=§–0dü§} ÖäÚdÌǵFÿă©w°Å“s‹°&¼ËˆïðR³<à'îJêAn°Vx+^»ßàè5j jJ^Nÿ¾žÁ­“®«¥ºÞû³« 6YnªS˜âããf_ûC\Jµ _îÜ*œ çÉ.“!mx4|QsƱ8D¸å:Ø÷«?|• IK(c­[9GbºÞüÁÑŠ¥šÞ>†ØÃŠi»ëp‡³óÊ…d02VTa\;¬hÃ×ÌŸÕæé0Þ•[0-ž«æ3Xú¿»îØ!ð@r,ÑŠ€@§² ¥HFvî)¸sOg‡} |NM  ?úLöªH%ä‡^õž¨3vGõPVÎO'ŒY³vN[z&<ÚÀ‰˜g<) h÷ÑnÂ-˜YÕ“îç®k²x^W«ìJJH,\ޏ’ų ­ÕÐ2J¢´zù*¶»æCÈ·Ÿzn`óa¦Êiå¹aÜ•<Ý-?cmñǘÀ†To(^–xǃ?‹yÁa™ooÖÑ<@ôÑ!¸²VQ¸O„êjÔW™EXÈ¡°µÏ*‰Ä£ÄQMúûUðA®ìxêEÔKØV¤êÝ/>‹Ë„âáíw¡ˆHK;<‘–vY)%Q¥~AàFõ×b?œnÚ8Ȭž@¥N`o^o„(±HEf¬€ÍRÛnf·cÙ,êÏÁ¬îêfµuð× /)¡‚ °n®ÓñŽ_g S*˜ý=é}³ò8kea«¤Ô˜†ID&sñ0áNú­ÿŸÙ:+NGFrž+Ðwó%æ®eg²{g²•ÿòñÊ@ý1š6ûÛ~-^í#ß¶Û:ØoWW‹¬,TÄL| @ÊR>¦‘C6ŠÃPËe³v6ú‡ÿ­–ͺ3‡Û,>¹ö2Àš€»óØn2Q·ß<õ¬vKmåÑßaWG(}d…ïw®›±‹ûÇ\[Pˆ1vU$$]ì ÎIKë¬,Yá0Þq®!Î '°«Óy‹iF¸±jÆ%%lˆû(\rŒ÷§m¹‡ÔìQù«¾dwÕ{u·l·Èé qR‚„îE˜®×¼èµ¤Ž;¶–i”™¤+~ˆ­È ("z¦–íÁxxÞž¶gÁ¹$v£Ú‘¯îÏF‰E*2Ó å\ϲ¾ŽõœƒólÿTRFJÁÌx·/h,©$Z÷õ=n„£«FNIµVPwS*Œç »LJP;Ü;^¼Ë1ã]i¢­2â] "°~i¼‡˜=Ô»U&;aï_ꘞ~¬Võ›ovM®ƒª)ñiUוʹw-üÄ9#;ãºÍˆçiÉ·£5”âʨ>«„5Y©Ž¬’ÜÓòUHä(3t/B:ËE‰5Fã¢A w\”šx˜‹âȹ(9ÄE©Ž-5k6†¸³ûpŒò'ŒñQs:l¥¹”Ò%l#9ŒqNY/v˜–´æÏD:5L\é”_Žtiu"íZe×u«ÔÜGy©€„ê·úC-ÒôÚæÈÇá éeu> ;èG‹ç!kv᜚s8œãÈÃ99ΩŽm8#ž!–Ѳá<¼_J$SK˜6üB(»g˜Öþ¯fëj=”žŸkcFˆMnÆz>7Ø8ûŸ2]3FhÙ>*¦ç<±Èh>hå.ÄS3/6«ê´9)@£Yâ¯ò(±HEf‚"“R@¸§eäøÜóXWCñÉ»Q×(ñ’®Fƒ4ÒÓuYï÷§»J@ Œ¦c+ñ‚Ž’¢„:ÂóðXØ\ ¹VšuŒ/é6çº{*þ§Þm®/ÍF‹¦OBèBAä 51O´‹wœ#t¦ˆ˜¼Dè”Bfeìÿ„~%¡ÿ%§_ÑWÕo§Or°Ñ Õ„C¤R#¼ú%©Èܳl](ÝÍì_¹Â÷”©êÁ›‰Õ?d‡já¤&T\ìk±E ŒéC¼­B· ‘‹Ð69‡e¯.ߥ2‡ò]»z»«÷õúPÅþz¹"G3pØöžWç’(±HEfr‰–àÂü(fÛ¼—q;‰å°|<][‰t•€ïëZ]déñ|à )»™4°)Ub˜¥Œ>e—_d¥(?WcÕ4W>Iô>RŽI:‰È!ÎIí0Ì9cùJÂ9ƒ¾ÒqNªã™çˆ©ëdig4„ÇgU(cÙðÏ[µÅv](Jf‚ƒÓª»Æý¦³9Ì›fˆãèuûñŸñEbôÚåæ!¿)!Ïÿtw"endstream endobj 2610 0 obj << /Type /Page /Contents 2611 0 R /Resources 2609 0 R /MediaBox [0 0 612 792] /Parent 2615 0 R /Annots [ 2613 0 R 2614 0 R ] >> endobj 2613 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [219.209 184.969 246.6617 196.9241] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2614 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [93.5394 171.9179 110.476 184.969] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2612 0 obj << /D [2610 0 R /XYZ 64.9134 727.2935 null] >> endobj 402 0 obj << /D [2610 0 R /XYZ 64.9134 702.3869 null] >> endobj 2609 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F14 2010 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2618 0 obj << /Length 2876 /Filter /FlateDecode >> stream xÚÍ]oã6ò=¿Â2n­å7ÅE÷º[¤(º{]-ÐöA¶åDXÇÊÉr³ù÷7Ã!e*–ãÍ&bФ†3Ãù½™_¼~WL\îŒ0“ùzbTî¸T+Y^ŒOæ«ß3c¦3a3™Î8c,ûðóTÙûß?I)³7¿\þ8-d6ŸÁ†ìò'šýðóÛ)Ͼ»ü7N~;-T6ûqúçü‡‹·ó >aðÇ' “+gôdysñß‹ßÿd“Õ›üpÁrëìäÆ,—®Ð“› ¥e®•”qfsññâ?=ÀY„8KA¾AJy1á ÍAû]ˆ~‚ò7›z×yË0v1.˜±žxÁïªÝí…#n¾pî+œ0l^޳(Yax¹ÝuåvYíø¤ÒÆ ž[®£ÞîöK/UU/å(sŽŒÅz% &É©húÃŽÂÚFÑߣ­©ƒj“·ÁsXvWƒ‹ò#ôaÞ”ÂùI#ït :¦5(û* è-‚8ÒzQÈÜk†6lžÒ¨­hMÚº\vӍе¨¿Óær[°è>¶M‡€Mô¥Þ‘ìñnÛWà±õØ£+(D<)^êñÊ€hËèÖ ±52WR™ÇM›-tØsç}é~³"ôƒeî± a ^Ké}oWn+Z_ {»§q/C~ÿ®æÐ¯µ•ªÏäÑcÌ´£Õf=ê ÁíI.l6I>R†¢Äý7úùýœæ Ìlät¹î¢¢²ÔÝï(â„Ø dÉϵÕí†bN$Âjâ­{Ù´"#“ D åÔªñ› LJ¡íi!+r§t¼ò*ã)ÛˆúÝðTDu±©ú`BÕù5¾·wùŠÔC*›C2£‡ îB\°iW)d Õ{¥Ã.¯¥Ç¤+û2!aƲi[BžR€fÍåuvÀ§]Uµ:¸ð»kr’Þ!›„»Í:8VŠ«eÈmöþÀqç* PyUD{Là­Wò¦õhžHi%XìùW•¤´#Î*IiN¢÷À ÃøÆ©ìXB¤çŒ)ÆÝx;Q8 á²Éµ–êl#ÒhPú4ÙY¢{Û‹¦ŒQ0A%­AÇpİ~mÛ¤›Bõ…*‡M]°µàN«GBÚ‹©Ç£ì:¨GʯîþöH‡%Ķгdç³µ"Bœ¥ G´B1LJ8z­Àp!&I ãq…y1&ÿ- ž»Ì>»øÆ)…… /¹[Œé‹€Ä'Ô3C-H=Ì¿%U%·iª:©2[ÛÇÏÆ9õ ¹È¹àò ’ëfÕÄ,¿,P¡›. ÀC\ô0ð‰KàUb•ÅbBõ⡾””VØ|²=Ä$})!ä>#U:2)›}õ0 K\0ÓTüs}Ú6w#5eé°R {þ# 6ÍA†M—a\åò†óa10íÝÏðŸõZLv¼)µÉÌæ Â€–XnS—rLY{ó•ÊîóÔá`ôá„EL4Â_|1î‘UT:×øfÜýl£Îˆ#62XËàŽXF“xÛ6Ëjµo£MD|Ô&¾›ÿÆ ‚¿`!,Ë™bòñ BX ñ˜qOKs¾,’@ÓQ¶]_²•û’òÀføÚ¦>¤í'•&!î¥ÂˆÇÖ+Í€c†ýΗ #R„{ÁT÷Tm\g^ŒË/¯3‰ cJ¡x’ñ‘F°P6'–|ÀîeÓvå¢öߺ›Jì©u.ÓâååÇ÷Á¼†ñ„›Å*ö ˆ-ϱåU³-aKa]_i{5V‹@<ÖÆvUwÐÌ v š¼__ Ä¿¼”æÀ\²Š=?Úî!ÎR#ªÌ€zL=ûm•ÂÑ6yá»ià¹ûÔ  ­_’ÚäcÔÆmO*ü+™cÏ$íy<­ì/‡²ñõEpY°Ãà’:½ ®Âf‹¾ÇåË• V±uì¼K±làRü|h»Ð©íh5ÇÿnàPäÅ™ñؽŤ:¼ÆcI{í}¬Ê¾ÆO«ÐX”AÇ-:­Ë9ÄKCéKjÛ%µiC¥b?"=™¢à¾6ØVáÚ1ÃOz¸8ZèåZƒó“gz€¾Ñ+^ÎCõAûc6Uß[áßWð‰(¸^¶(u¤qPÞM©>þ¶á~YÁ³…Ÿ"0]‚ÕaI×­Á"©:âv¨Î&]Ê—Êôi(g”|¤µYß«,ì}¶yÔ6^!û”Â/Rv%ªaq¬Cq¨ËÄe¸Ù§.~u‚Äl¯Nø®T{ß¡gðw€-Æ@„ü^~f” :‡&q¤ ÀU±GðÏQ§¥lßx¿Aûb¥ëªmÈ[¤_‡¶ŒýG?ôÑEXW^!’ÒâœòzL‡:D$w}ŠŒ§c­l0*0X{UÃ¥‘f ÌŽë¤ÌùD+ øm@+ùFÏ€aâG+ &ß8øÚÿx¿‚[¢‹›Ð‚Á5°-zÉkû–!¾3N«`ËÝÙ²³}´uaúnåIàžç»‘˜T ›pR:ÿeš‡»£ßÓŸ¥!á}KªZï)^Âwˆk”q¹Ù“f‡XàâÀ…endstream endobj 2617 0 obj << /Type /Page /Contents 2618 0 R /Resources 2616 0 R /MediaBox [0 0 612 792] /Parent 2615 0 R /Annots [ 2620 0 R 2621 0 R 2622 0 R 2623 0 R ] >> endobj 2620 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [378.1201 580.4276 400.5915 592.3828] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 2621 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.9815 580.4276 439.9367 592.3828] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 2622 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 281.3977 134.8845 294.4488] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2623 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 281.3977 179.163 294.4488] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2619 0 obj << /D [2617 0 R /XYZ 64.9134 727.2935 null] >> endobj 406 0 obj << /D [2617 0 R /XYZ 64.9134 702.3869 null] >> endobj 410 0 obj << /D [2617 0 R /XYZ 64.9134 685.9901 null] >> endobj 414 0 obj << /D [2617 0 R /XYZ 64.9134 544.1263 null] >> endobj 418 0 obj << /D [2617 0 R /XYZ 64.9134 209.9836 null] >> endobj 2616 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2626 0 obj << /Length 3872 /Filter /FlateDecode >> stream xÚÕioãÆõ»…Qˆ X4çâÑo ›íër´DÛÄJ¤—¤âl}ß5áDÙ ÖZ`aRÙ7oÞ}Ì~s{qó]qY&e¦³ËÛûËÌ&¥2ö27iR©º¼Ýþ´Ê•^­Uš¦«Wj5öuµ‡ß«áê—Û.­5‰+Òì2¥ÉYŽ£ßÞ^(I/ÕSg‰-3w¹Ù_|ºøé—ôr{‘^þp‘&y™_>Ã{š˜²p—û ë¦5Æì.>\ü3\{ˆëä7çÎ’•:±ÚBoèõújml¹ª¶[8P36] ÏjÇ£¿]¹lUõMuƒ»šJ_º{<ÜÍwZGû(@"Íåøßw…æÄ¨è4)µ²2'¹ZÛR­¾»*̪ër±«ñz¸Km­–•wÕCwcN7°i’¥’i}½A¤»ðx_@?µIÇóèŸb^$iªŒ|¿ïJ î6>^‘Ðàû=îV‹ÅyÁYÍ“%D”MtæüF?§.ýþ¨½ 9HŽñüßT-oyG§÷û7õó•ÎWõ–Wƒ<… &޼ȓ"Õ~ïú÷f@•¦Ó´cCR‘f«O‡ª¥A¤úÏ©²4¡?Åt èZFGR1cK £Ê9gwÝC³¡r ”¬¶žuø{QÅòlDêõçÇs‚ç¥R/xH¢œ¥.†ÿ3˜„ñ±FšÜÆß«e© ,JoÞ~\’šÒ^ÿ‡ÃYñÈ›‘RUãX J’ëòe«a“Ì¥ž÷Í 0ûCý0#.ËW·rÔ‚Á7¦$/xløK8/¥½ ¶{Ä-]š$“ê¹ÅÖÿÓ¦4$Š ŠFËF žƒWÂ'Ëæ:øyè2£;ŒCÃê~L_àšÑ™zÍÂx5APÐ*äêv¤6`33?u¨Ç3³$SÚNãÊ ^¼Ò#­`@ËyíªíFžÑû °µbhÑ£,iýZ“|æ%¾gq~]ûÁàæÚÅÛW¼ùS°C[†ð¨­å$ø8ø»°áiRоBéì„•ˆ YT’‹®åoàÿ-hùõ´mõP3* ,ŠKçäå¸fânv[ïŸvÕXT§i€¼¾k‡±j7õ@,9¡‰ÊÀèQ´ÉøLŸPè¶Ç»š%œ?ÝŠH@ZÚXôf¨Rï Amèúg¼»~Ipö‰µ“ÃgkÎ<ÏÝ‘5ü¶Ú žLݨg¬\öX g?ââùìWYâ#ŠÃÙ´3; §jdöB/J"ÁøÞ×uøý7üSooá 36Bì Ð;‡Þ±æ”B»3<Ù°¢ f+®ñüÁ12VN|Ù‚•È!Ð3EöšNC¤ §b…´*y¢ç®HÊe×jX ¹ÀìšÒ½jfæ±NWßt㣲¯·v€ ‚ÂaRUíD²v ò¶ŸiRðÐ¹ËæR‚|m/ AZ ñ“´ù°æÚdÉè+ˆI¤âl­„¤Û°ÂS¥½zOº­]lÉØ²Õ«?šHp¼„â;mYíåWµïËhîù¹QC Ÿ1 öDE>¹oqrOK†s)†ƒ™ËõiŠAiçª,õ<Ç ‘yŽ‘Nä? ‹×¥K^ýŠs銃 yªC¶2qÆîÒ)/ ê/Új½ìŽ£Ñ#RéR%âóË™/;^€øòùt rA,8;`CvOÉ#\ h[˜hÉà«I”)ô2W×â:yЬ'“iDzuòw„¤S68ØñÍŠ’©¬‚ÊÚÿMi¶e™@bg^çTCàŸçÖ;´±GÞÏz)Çü“BþÖvýÌE²í…<’3G‰ê$‚EOuN7⣽•r¼L®I;bzŸŸNҩĪ4šùÅJá!®c J¡5ÈX©æ8’R o”n‡dŽ":-êËÛù¿¢0¢ÓüO`çWœU¦ÄbµÊë‹-ÓÄн>çv îëo£xŽâ†8ÂèúÅìÕAÈrÈ÷ã5ý;SãÌCiä¨ñ¶›RH£»‘£†ØœÄ›®ï9¦‘‘S1á;û8 [( i½'Ô„BNtˆ‚”)«ãB—µq¦+yáž+ãc½%j«|¤yh?¶Ýs{.m5þH‚]÷à#2媇î/$( .T4‚û™o±V€ $Zú4b\÷@‡uí³¤­“IŒ„÷Ëô!2‰Ç ±lg*ÁŒvsj­K. Ó¿Ø.zˆëä‚]´8þ´8BÔÛŧ¾ÛÔÛCï #*áˆñÍHýÿI˜cûr$a­NLÆÄ é÷©:8DÄ”*š šFï‹a4„ACrE .¢j‰,Û5¾ä6ž×>›{ÓP"‚ù’Þ0ÁÔë¡D˜ùv¡D ò…Pb†cP¬gœ«-«Ì›QùíUf.ç&Ï'’¨…v•…3¹4gм¿ç|u×ìHzÇ+ƒ)ó‰Ô§óªâ»ÿˆ‹„>pi•L[¼UaM& ?œJM?¥³Õ‡±§BNÔõ;MÕ ÆZ† !¸˜ˆçÑAÃs{ðQ‹OúNÎCû:*fŒ¡âŠÈÐ{.X5ÔOŠSaÖaì5p éqã!<Ïݼ¬:ŠhM}3x“Ñ~|±DÁTÿ kCГ9‰;²l54íÇsU‰Î2ß>øÛIN¸(¬!Ñz:«*¹ýƒºÃˆŒ=ŒüSb&$ëŽ*{0—"&ø& †Ðù( z~6m i[² ´¿X ¤£nÓëP¦$Á¬³¤ãÏŸtsí+l—|f„–MTÎÀêõn ãÐ:ôõÃaWõÓw*t\K1*ô(ö 7u%ÔÙÖ¿5Ì™kªÐCšó#ó¿¤Òg™Ÿ¨„§+žþÔLMë#±âØOû‘Êtãõ|ó? __kÐë%T~ÀJ`Š»àc˜Úóøsäzîñ `ÓùƒìY{þÙ±¯g2;‰%Ø7–©BÓÚ†¤fÇéHÁÇ„/±„¡nPìù[3Êj¤Áaòœ48±Ñ—@2‘#±`[^ðÜP¥Þ*É(<Ê3ùÂmªÐfR‰c7™C|~ÃQ¶0^ñãÄ~d©×ç”NÐ"^Ô-§ù$ؘC¶ž\ Ï©ÈÆë†×F˜ðŒÓ!¹’ÛóÇf´Fýõpö‘ÿÀp˜g„^_¦×ódGR­ÆWä(R7X8:𹸛‚ÐÀ Ű:ªMk"!,õô7Ô=ÙE4u3Ç9Üœo oáÕZ<8£¯ïëž2±¾:c‰Å'1Àƒ‰M è*ì­YeAÚ·òvGôç÷àˆî§¦ht §Ð¦ø2¬ÈÐ`ZµèÒp:J'>t}ƒrü¾žü%Ê"(d–:R©xEÝph‹ïè+pÂèéÀ]~Â&ô f»v=Ïçu–‰4®—eÍöô (“eÝn)ؖÃo~„&Ì · 7·â°šù…+ϘÝ‚ŽÏm×ÊÏ%|ïÄ“¢¢±ÄAíêºô…´ mt%‚ïåïæVƒÀÝP[œÚpŒì’ !AÓK4{n¨Ø´û…ãÓ…‰£ ¹È’T•>ûïžêöÆ.Þz°.ncϳ~Üâ± HkA£Bÿ±È¥}»ÎòtõýßÿÅóß÷›>ž´¯Øc‰^áP#â¯R©Žú+0ø•ž“tŒB þðžŠ6Xa ®vŒõqM(vÁ Fƒ‹otÓ¥$cƒ?—1²4[zXø.õ"ŠCû|àow(ÞÍn\7m4Y‚hÙÏÆ âd,Ÿ•„ 1bb¦•édÐü…w|ˆŸ‹ªè»ª%2™‚ˆ(¤ª®£Ðþ¦ˆ¶Ì_ËPðóœô·új*µe‚øçà¿kq~¤aÄ¥º¿¯¼C:"ÜVˆ?5²©LŽüy¿ç ‰u»¤l|ÆTÇ2lR©Æ…ÚÈ`‘ãS3K XùÓÅÔ…ER¤áŽé»¥;¨Àû“ !þÚ¢¸å‡¦,j™·;,ÐÄ×n>xa/°7Fƒ KK¥÷\'íD¤mzÅ¡ÛgæÇ¤:†J?áCðó¤)Cl«/°Þ“2cOàU”¡²LƒÛ~l¢Ø ç™hå9v{ë³Úfš/õ%IñüYg’u8(¤TR,¦‰ð!ðâ?,eRËÜ.Š]ä$HJ~„»á¸fÛI烌ü Y‘ @N=¤> endobj 2628 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [259.6277 629.1615 292.0618 641.1167] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2629 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [319.4037 629.1615 336.3402 641.1167] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2630 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [196.9739 557.4305 229.408 569.3857] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.12) >> >> endobj 2631 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [256.7499 557.4305 273.6864 569.3857] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.20.12) >> >> endobj 2632 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 450.1329 134.8845 463.184] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2633 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 450.1329 179.163 463.184] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2634 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [223.2773 171.0255 250.73 182.9806] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 2635 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [279.7582 171.0255 291.7134 182.9806] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 2636 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [84.6614 147.1151 104.3653 159.0703] /Subtype /Link /A << /S /GoTo /D (subsection.7.11) >> >> endobj 2637 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [132.3045 147.1151 144.2597 159.0703] /Subtype /Link /A << /S /GoTo /D (subsection.7.11) >> >> endobj 2638 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [484.2515 135.16 516.6856 147.1151] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.21) >> >> endobj 2639 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [86.3642 123.2048 103.3007 135.16] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.21) >> >> endobj 2640 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [205.9693 111.2496 233.422 123.2048] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.5) >> >> endobj 2641 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [260.764 111.2496 277.7005 123.2048] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.5) >> >> endobj 2627 0 obj << /D [2625 0 R /XYZ 64.9134 727.2935 null] >> endobj 422 0 obj << /D [2625 0 R /XYZ 64.9134 378.7188 null] >> endobj 426 0 obj << /D [2625 0 R /XYZ 64.9134 348.3189 null] >> endobj 2624 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F32 2060 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2644 0 obj << /Length 4939 /Filter /FlateDecode >> stream xÚ­[Ks丑¾÷¯Ða#\ŠPQx}s{g¼í˜uϺåðÁöª¢$Æ”Š’5šÞ_¿ù@EIãUG D"Ìü2~¼ùpý½¿¨ŠÊ*{qswaMQIm.œ…÷B^Üìÿ±±þr«l%ìÆ]n¥bóã_/•ß|þáóŸ.·ZëÍÇ¿}úáÒëÍÍl>ý…küëw—róŸŸþˆ•¸ôfsóÝ—ËÝüùÃw7ä…€ŸœFT¶0•-/v~þð‰‹ýqñç¢p•»x†²(tåˋǦÔEi´Ž5‡_>üO"¸·9É/ÍÔVª0Êhšé?E)†ÙÝmw„i›jã ˜……W(»y‚çúš©Rl\dq¹5Òn¾œàÕîR¹Í÷­‰†ßÔ:xò›][OÔkì2vPµ«‡¯\Û÷—žšÐr|€–aÔaì›ú‘Ëmh¹Ã!ÝÐì7àú§ºÇ!Zz£ V¤µ•²¨ÊRÑäëC‹lje6Ýñí¾òCßÜ5=½(Q®«Gþì†1vi¸Id-ob€yµ4ÀÒ#ÉÙ5ró_6zFé5¿`±é¯°¡…QúØå%ÊTX8dÜæËÍ.6¹…ù»Ôf %討D«Ðì×ñÜ‚¨·ÚÃ*óõ{jãÒW›ÿ†šŽ_rÃ[o{·í‘+p«ôÔiov0$m|«`m©2ìl5>³2.T¬ÜlǦäÊ:ªÃ€-8>Ñž /íûK–¡J/PhQ&4 IeG Ÿ2s±I˜ÙNûÆnâ?,ÓÄÞß#3ÄvC»`Ì–Ûár{–j¾äÖöj‹,ŽdSh^Lò©oö-é®ÅØ„1Ÿñq.PhœmD6ú@¢æ.ç…J\¨Ž‹Ç.Î"ˆæi ó\Û6I&Ú°L luý½’™Ù>Jƒålp¾Œõq_÷{ØO´§‹Dî™Û+E À~¿¿ÜºRÁ±ÆxäØxw¾S¬÷¼ .óžÜ7ÿÒA¨cêÊÝST’¹ñ ’^‹î¹ÑøÐpšýGÜØ´a§î.´ø%-rÏfkï»ú§Á– eºó\ˆÄ„ª’Ò¬1ròtù)I¾BÂõ÷´þðê¶d•Æ 2ïX^•ÉXV²Êù äÓÐôKw¥œ+ÊJ¨ +|á@mÎýù$vX²ª8,]HФø¼pW‰â6'IþjÆœòà •7ÓÈÈc{D)œípßà•L˜ ¤1‚ ‚ÎdÚÆÿ§Piá”) o­Ys*ç¢%J—¯HZŠª0¾¬.ÊÊΫêÝ’N·9ÉsIK© «ŒœFFA<뢖 )ÃLÐ3€î€ëÕVÒçH0ƒXScTšÇ§qàJò¯ð¿;°_iø±‰&´®çªùòÙl½l0ë§h#Ù¤7ûm«õl[Gn¬]ÔÏÀ>°H S𻪕òó%NšvoÅS¾iÿH¶¥ï Ñ¢mÒa2kf—–6™AØå ë¤-à§_›wØ áÄ#§2ºlÚü_s›Ý©Oì'w‰ÍfŽžM•«Y×°èE6fd}¤Òʼnn¦Žû°ÛGlÿ5XÆ0õ™ð÷Í!ÈÃHŽS°]Ör6p“F”-F\é“ÝÇò‚¨™äšGÁÉ RCãI#‘=™È±làMnjäš×¢É<:OÃUst°O~Ù5¨pn‰J0 BGS94ã™!2¢°º4¥v…îý&?QÜæ$W ‘Ñ…sÚN#'“-Ïu¨*€¥a&g± ÄÈ”®3ܓإ †Ë¸H+®<Š÷ó²˜4´(Õ7”R$ø† Ò,¬…ª™ØZ¯J©'Pé7¥TžIɉIJd@!¤¢ZšB¡kžé(x7Ü÷Ʊy7.úØ“G"nO¡Ò#nú;yéc¬ÛÞmJñD²Mf¦Òð”¾BO²á! Á‰•ÑR·¢¼Ææ žÖŒq4yð»Žñ},C ˆ¼0®l“\¹°.GæhØüm™mh¥1²K–QÂ2I{.¥áíDvîXaÀ×iÞNXyÊIʽäªiÖzfµž á/jˆþÍeeÁí¡ÿ”„ãp5¡ Œ¤aë‹…Û–ä_G0ŽíyrÁ1F“¦;ÒÚ¢‚)Mî×TÁsÂ~¢Ñ—P¤ "4b¹ÿ|švA°Îé`ÌÀÀáfÝ×;ˆÌBU6¢ª„›~ (%„àQ5xh1 }:ÖÏÄÿliúæ;%4l8”­,ñ]•¯ó ï‰oø?NhBçg€k¡s6¡hlSвå`<‘ƒ0†C{2‘`ƘS©îj~>5Ç] È ™ÌÔÄåå`v䜻ëö!˾ìùÅ-°–*B”æažÏX¨¦©àÃ4"­^ÖÐi±ùÿò7nù#.Ywèî™Ü#e>¾òC½)·=ÿ÷Í#ç+ cJ¤3<Õ»×øm=òŒƒ°Ü¶‡²á4¡ðƤ`^öˆ\ ™xowÝñ±5'j\ªO!˜i¨Ž,ù"³AÀýÐnw‡@#Õ7OÉ~™h÷ÁŠMzáí¹^zœŠ6oñÓ™(Œ@c¬‰FÙ Cúè9WÓ&s‚5Á¬!³hŒøï5µÂ÷´R‡­H¹Ý—›Ï1I™Ñ»‹„žƒ©[O#á«ÉsrXMŽ i™1„Cž§ l"Nû¤î^·bÀÔ7Å}±§ŒP…&¢Îûs8e<w á4lËÂHaß§ÅmNòP8Ê7Œ,Þ‚ô¯Õ¹KbªV깜ã*ph€«ôSý¡9ôß.‹Ž)@ˆ€öeËaÞZÀݽÎòfƈI ùê'Â3ÝО!%;ª § MÖPË~(¶˜QkBºýëÛ¡;œÆf õ6(yÈg‡qf¬uqX!®‡´ MƒW‹Sœ'±³”üðbÌùà.½HV ýXp„„ª¿A!$3‰£·CZdž%0Õǵ4WEK$`H6^b™Éä°-BûwqÔöpDêŸØŠ®˜å§Cò| ÚÀ¿`½ŒkÒ휯TÊ"`2aB‘É¿ûžæDàJÈÍäs!2abJ@b :6XÉ‹WXoc:éwÿ1™ÒY°U–…°•¿Ð¶‚P”õÝÑV¤¸ÍI®„[¥/”È&é•ùªý'y…p­Ü|R± cÁPuŽ+µ)œ1tåt.tÀ…('üÆkûi"„¹VDµ¿Z!f‹RÛØà“z? ½BÂëë, »–t.ÙHżI¥‰+F Í}Žr8`*šÊyjªZX7V[­ÁÓ0&Ž|–TvÙybÚÈêR¨„F\@¬Çš8Üb¨ªÙPZçc) –„ôeÕìTÚGfÂQKS-93¹‡< ì³ño&uË«€^à ¤T‹¤4H~Û!'Ì=Ëå‡a|Hy<Ðç•YO1½ˆ˜ #2ø g,Æ„ìšYd“LïÀ«=-–žÛ°”øÐ7ã‰Î†Žd>Ÿ’;„î!Í_.K<ú>Åì\9>Äk"E§ÈDP)èA£+ÚÌ„2¯Œ0yª‰’aP5‰‹Á!5¨Gå{!ô¥1Ñ×nWÝqa¼-Ðà®10%í_`T¥ /…‚+*¡ßQÅmNr头*QÜÕ42å»ýjÐÃr}®°|¢Š.ºa7>‡c¾(+e¾Ý\Å7檭Døàæs…m´äСìªoÈ` øש9wí¡9_ 4î`޷팖øVõífš(¾1U÷ -K³Øvu¿ºífÇÆW`¥µús›ðo–w¤ü7™\0È…óF®X2¥Ð/³´Çš¬%åqÀÑF{¼-¡Ð|iW[Åì?çÇu—j3»é’ªÏ_GóÝNà)ôÀœ {ŠíoÌt³ßÿxK¬›>þ8CLC?Ò­ˆMÏ…í< UMÞšÙ¡ÃuSLÄYê5?®…ˆ:¦ŠrÒRDIž=]°h‘³¬âö…f”êÔœ[:„나Òü)zSÊh‘²sl>É`4½™Š¦s|>¸˜í™Ä“"Â¥=ú?0g+Ýæ&ƒB¸EǸͰÓãtÉnZ³˜Â}¼³}É¿.yè8fi¾1ˆD9%l f™†¥é1,»yåÈSW¢ UŠ}À»ME$¸Í(®X ˆÚA<[½ŒÿMéPÛÝ·c1|ƒE èP釷§»»¦o÷«y@]Y@Ñà%gÑÚy ät£Ö]q’,DJm¼¢]œ.…þÀç)ñ:k~ºé¡‚̓Ž)€$¤bbM.ï”\I‹_…ÜYÓ€•œn>ÀX=¾ò‹ç¾Ç& Æ÷cå+G œóR¥‹7{¡TãŸß$ãð¼M–ëWÏ4¨#]ý-]žÃGzšÔ¡Ž2lD?±/à¦ÌÕæã!Þ%£C]¦*J)„c+,NÙ∦f³£iªíük"úŒ}šãxˆXÓ­ -y%åÍy†ýêØŸâ£8luuw:„T’÷ÚÆ‡Ót߉Îî«Í÷äé‹#vJ8DOÛ|ØO_ž¡šx|€—QÂ}7Y–Àìjå DžÓç ¤nǵÈgº÷šôß…k tm·wcwõÐð1C–û¼Î¯MáÅÛxžAªb%¸o÷éÃ! ²¼Œu»î˜€ØnLܽt[¬©ý g5½ û9Ü·È”ÏeÒa#ÌMÒU]÷øˆ^ît …}ÁŸŸúXO°nÊúÁ ëôµ#9Ü ã7 C1¤6?«ñ|ý(Œd×MºÓB&±ï·q–Ç&m¯ü^æŽ_ÈB.Qqshvãu¹ª(Bª×éŠ*Ï`ƒ¾xª)¯Þ00¬}Ícßõ+W œƒ`OÈüØ š>u£$úùÅ4<#NN¦äùWjü`Ž•Òa&ôoSù(‹~âÉöZ {‚‚#mh¯…Cn}^à,öJÀ½™ßÛŸ¥K½,”Vx—ßIñ~Èm3zçÚ›´[§A_9r“šVÕ7ã/|C)«¢”^ÎX„¥†u^ ¸ñsoË—ÈpY©+N•$ÿþlúlÕÂF¿Y`HV^‚#l Efׯ³[YH3G÷4þÖð¥Øë%8Ä÷è(zþ‘¢0•Tëß֫ؾS\–0¿Œw/ެ½]øŸ_¼$½ŽÖ»g²+)Œ¸ËgŒ8ÖÚç£ñ4 )Ô§ÙG¼id:Ü›ñ›ózðå+ 2N^Ù÷*'„ŸÇfæ »Ð„¯Òc޾ãIŸ«Ò'ÂÂýOáãUlÓÆk6JV• §ÏC‡Wéÿ§CBn-ƒc“yù¸¸¯iùúhöv–\¤X¡ Z›û·ÝGß> endobj 2646 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [100.2168 688.9373 132.6508 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.20) >> >> endobj 2647 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [158.4828 688.9373 170.438 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.20) >> >> endobj 2648 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [220.5005 533.5202 247.9532 545.4753] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.4) >> >> endobj 2649 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [276.028 533.5202 287.9832 545.4753] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.4) >> >> endobj 2650 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [415.6195 533.5202 443.0721 545.4753] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.5) >> >> endobj 2651 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [471.1469 533.5202 483.1021 545.4753] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.5) >> >> endobj 2652 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 413.9685 120.7596 425.9236] /Subtype /Link /A << /S /GoTo /D (subsection.7.13) >> >> endobj 2653 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [148.1016 413.9685 160.0568 425.9236] /Subtype /Link /A << /S /GoTo /D (subsection.7.13) >> >> endobj 2654 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [265.3321 342.2375 297.7661 354.1926] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.13) >> >> endobj 2655 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [325.1081 342.2375 337.0633 354.1926] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.13) >> >> endobj 2656 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [100.9337 234.641 133.3677 246.5961] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.27) >> >> endobj 2657 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [160.4901 234.641 172.4453 246.5961] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.27) >> >> endobj 2658 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [256.9439 150.9548 284.3966 162.9099] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.8) >> >> endobj 2659 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [312.9677 150.9548 324.9229 162.9099] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.8) >> >> endobj 2660 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [146.2193 115.0893 178.6533 127.0444] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.25) >> >> endobj 2661 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [205.9953 115.0893 222.9318 127.0444] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.25) >> >> endobj 2662 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [202.2698 79.2238 234.7038 91.1789] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.22) >> >> endobj 2663 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [263.6722 79.2238 275.6274 91.1789] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.22) >> >> endobj 2664 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [216.515 43.3583 248.9491 55.3134] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.23) >> >> endobj 2665 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [276.291 43.3583 288.2462 55.3134] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.23) >> >> endobj 2645 0 obj << /D [2643 0 R /XYZ 64.9134 727.2935 null] >> endobj 2642 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2668 0 obj << /Length 1678 /Filter /FlateDecode >> stream xÚÕZMsÛ6½ëWðHMKß§N3MgšKÛ±oIŒÄ4œ±)W¤›æßw— (P¢(9¤“ôbR$ð°û°»xýòvõâW›8â4×Éí‡DK☉”XKYr»}“Âè:c”ÒôfÍÒf_ä÷ð;­×ïn_'R ¢,Õ mk‡OW¯nW žÐ„0¹&Òi•lîW¯Þ¼£ÉvE“×+JŒ3É'¸§D8«’û•T€)…OîV7«?{À, f1äKô…³g´ãDr)zgZÏÑNèÁ£lÊu®l÷û¢jŽýa’7NpOjö1ç8x$–‡ßGþôˆY éŠÍcRÊzTVÍ Ö¹YF“0L§R·ío×N§E;ƒ0wx“7E=©Ö`¡%Rs;I 7¢@C8h¦Ý|R<^ŽP"°7€ôÍzJÞREªÛh…ÛQ~´"ÜJüó)ê͈)[†šrW0C“Œ /*'9¡œ0…!HùÒóY ˆY 9 ×Ó‡‘¼ÜÑ×È€!º$x¬Š·”I¸}Ú 'ÔÐÇ£Ÿ" I å!½>•ÍÇu&„HáÚb !Óº//YSìïýÃr¯ÖÜ¥Mùá3ZUýúþfƒMáÎÆšÛ´ñÏKt\÷¿C± `ÆÈfØgÙ+ ‰ýÿÖç*œÒŒXÇø5³•¸‘y†ðbŒ8¥&°|? XÝmèq®Z* ^ž ˜unJÚŹ~ÂD–µŸ¥*LR‰«ÄÇbïéÎýÛÖJ§y›Xùû»nª]ܦ»7ûäÇŽ©†˜&Ò*›DÎÌ£§Gœæ‡;C¬fnHÐvwŸ—Õ±‘‚;b ‹Èœ›ö=bCžZ JZYì!p1í}äÿ¸ÎWé°Äö+(‡T1‹‘ŒÑÎ$VÚ®ïì †µæ‚PÀ b!¬Owû&_¶Ë_Ù¬K?Ÿ:ßn~÷qŠ ç¾Ø–X8Ïè+ X¦„‡˜-<¤†ùÑzAÝ!NÈŽÐ mÜ=6×Ê5Sv¸+d‡dŽpeõb²#œ}³'_Gwˆ«t‡0fXÉuG 9¡;úfCb&…‡†|Wæ „¿Fxˆ¯¯;Ðoxz­ð°œhcØÓ…‡h øNu‡àŠ(cì´ðÀ%Ži)¿wá{³”ò˜f¨—Š.H¾írÒ#†œ+¿Xz,Gósj´’'¦µ‡€¢ÈTÇÈ7Õò¢ö¨‹‘%ˆÕÆÁº, ý¦æäêE¶CÌbÈ‘Õ饚F¾pà¡qD½€­Ú¸™×Ì8b¤rÕêàí”3N‰ãLv¤jÁÐäÉRÚÁ˜ùNµ H¡âû1)ˆy(›bP.9?Ò–ë¨=¬öÅY%çmYô)‚œÐq±eU7yÕ@`võb æ´`qè1[ÌÀ,BÑrÚÍ1"#K[)wV¯-Fæòr-:«¿ÞºwçYB¥1Ó :…×§òslh2¯ñI·»õ³‰ÌÛ0¨\}MÈûy|Rg’Ð>ubF/ì€BÓå6@âÄþ'6ñhûsb«ƒt¤Pæ³5^°Õá‘©3[O“[®¿ú-e]À›6N2ÐúDl\Ža÷‰‘ÑZ´Xt>K-zŽ;D;yỎ…+Õ_TŠvÝùUÞ•z×ʰMÙí?·ø’§Ÿõªk]u‡`^¶UƒC°óßuжìwrê»NDPñoY7Eµ9ÑB*¢°gh=;a`!Ž$¬´°ÿ¥vhåøÙÊ¥ìXŒáÿIvHN„¤Ò¦ÁqótÅYùà?>è½ú412n©pŸô·÷ÈáØä”u=¦?þsï[ÏŽö€—G‚bÄÁ&¶±õvKÚ…úÓâ~1ªŸó@QÂ’¹éóDÎ ív觉H„U¡endstream endobj 2667 0 obj << /Type /Page /Contents 2668 0 R /Resources 2666 0 R /MediaBox [0 0 612 792] /Parent 2615 0 R >> endobj 2669 0 obj << /D [2667 0 R /XYZ 64.9134 727.2935 null] >> endobj 430 0 obj << /D [2667 0 R /XYZ 64.9134 702.3869 null] >> endobj 434 0 obj << /D [2667 0 R /XYZ 64.9134 490.0392 null] >> endobj 438 0 obj << /D [2667 0 R /XYZ 64.9134 265.681 null] >> endobj 2666 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2672 0 obj << /Length 2802 /Filter /FlateDecode >> stream xÚµZKsÛ8¾ûWèHÕ„0Þs›ìd¶<5»Î޽§™9Ðí°F½½‰ÿývãA‚&l9k¥RK ÐøÐýõM}¸>;ÿÙ.*Ri®×· -IÅ„\A‰µ”-®×¿†.K®+ª ³,¥´øôÛ’Ûâò×Ë¿/K!Dñáß¿.­(®K˜P\üÓ~úíã’?]ü \ZY\¼ZþyýËÙÇë3¶ ð;rMd¥Õbµ=ûÏÙïÒÅúŒ.~9£ÄTfñ>S"*«Û3©QRˆ8²9»:û× °ŒËTä‡çNª+N$—ÂôâêÒC¿àûfÝ®ê¾AôaŸÿÌY".JaˆU,h‰0Jp® sy2WÂ1„ª` N=4ýS50Î`²©ZI¢Œàs=¸³zE°ªâ A˜°<~¢†Ab™Štz˜@c\rÍÇb÷Ðß?ôç,sîRã†ÜÂñ””Ê-¸^Vºh¶¨TÞ?€òepP=Õ ÂWâYP4 M%ŒõfD‰e*2£Znt5î<êäªè‡~ßÔÛ` »óJœp”x °Õ„k£žÞÏV†¥ì F‰GrJÁå`½ië(4K3&Q–>áÉOÍaµ‚µŽi}Ûí2 ×äü›>Ë-˪+à²ÔƾY A^™ œ+ÁÂÙ €fMiuÕíµ1‰V`ÞJ™!~àáûÄ*¥Šþ3¨£ñŸWøàƒ×Þ²b‡¡ºÇÇÒmãáëÁ‰q¡Î¹ëÖ÷vaßDÉýç&]4ˆ÷‹TQ܃έq0Zpÿµ_ó¥^vv&©ŒxÜ÷}€ãY *VÄ(Žt€À¦”‹1œiYP*v®TNVL„9¹_JA´ÖNèô!ï;üÿð\:ƒ¬@¸ââ5ÄJòY†Z4˜=/˯£ +|Œ*z.5Ê \ežI °ÛJ-åPû’%á’ó Ã))dQû,úߥÒE½oëÌÍS]ñŠi!t¤hÞvÀAä‘Âb5«¦Glw‡¾Þõ@ÜVR´|PZ‘,ykÌ$–©È9X¡+¢9s¶Ùïçñ]1K¨‚O§Rd'“TÖž‚ÑÑ^.®x–Ñ>Y+_f´¬(Q"ÔµßÂè]ŒJ-|€X¸÷ ¯ýÓ@tLKõͦñÏv]:Id¯-qdëåÄP1äC]Þ‡’ó¿M¥‰½¨ÓÁ‡&J]wÛº;¯ˆ5,1À›'J,S‘ç‚PZÙ)Jç<˜r󅜨À3)“'„%ƒ ~«Üx&pçŽ.Ს¹=À(ð>É1Zó)>GÍwËRqU¤EL>4yVÀù¿KhúÉVs¢…4GBÖxXŽü?¡©ëC¨qAæ€U˜-Vm¸½b&xñeŒ_aöÎÿíîÝü&|ÍûÄi’ãœ,[¿¨¢1Ò¤:j¾¶‡¾Ù­fu…pqÀ¥Ãô7{o”X¦"3Þ+-1”Ú'@§ÁæÕ~r2=G?á§ôEÁØ7\Výí5éÎ{A»®@CRN¯@ÏÒ~Dw2Ö¿tà‘ôé‰ï›ý¶=rõ©ÂVOæ¿™õQb™ŠÌ°žV‚±)Òõþ~Xÿ.p*ŸÞÚJ¨D,ÛŒ“+dœ&%”q¯›OK b·ïë›Ö5ÊÚ~)Xñ8§òP*Ë7ô'§íI}´=ÙÝ7»s™‘(qlq³Þeä(µ $KĈܭÚT„1¼UŸ²ˆÛùÞ\÷°Ÿ'ÖäŒ8„òƒ ó%–©ÈLoNi"Ô¸¯ëà´»¿‚üÐv³˜C%ðŸêÓa$ÁÊ)ðÄZ;E»íÖM@[Nø™>¨àîžZÿ ñ~Á5¡†&ø»ûì…^A”Ìže”x ¥f$e"bÜ@1c!Ø Òpfrÿ{5Á)ê@óS<ù<Áã¤o!ø©°&ëHðíœàÏ6¥%'Ü(ùö¦t4畳æÕ¨¯Œ`®Rg»t‚ù1§–HÉÌ{cï–¹û”9ý|? …`Øõi›sWµ8ï¯ nFQ†›¡—ñÎQŒþû™·Ø‘ÒxÑ÷Ø–îýöñAçÆÂG|쉣Ÿ¶>°†«¬´n#òÐ`®LqƒMîÇ\F‚²±°£j³õ¢µ4æµzçdêÐñ†]7­× ƒ»u·þoˆ~ð Äƒ÷°]._á› ¤ó;CÎ@V†Í€<ìPô”Él6TŒèjluy*!HS|hÈÆ†<tV O:TÞ> r·ªtbŸ/ŸÛZdÂ®äÆ¿ÓÛh¼}Ž—RIíôRŠ‹ 'ÑDÃP»hÊ+·¶É)ÙV„c‡%hïæÐmúLÓY…EjKz‚Ð%–©È\A_ឦ9'içqÁµ0õt‰G0 ðлšbÜÕÛæœg9%•5w§è¥·è û­ï£{*ø—IÞ»+7ÁÈþUýÕ?÷š›Ô,‘pvìÐFŠh|³ïá¹ ¸cÏÊÃÂ:Ú( {êêú®ñ×E&FÚì[¡(xZ›ïð…¹¿ì`t“U@/ÖMÆÕ! EMôÇ÷™ƒ$;¸ŒV,½èZí/ºVŸu[?â|̹x©A/ÅçëCÊÐØ«‡x`sËÎx0Ä{¿8¶Œöõ÷Âò:Ìp^[û¸ì¯áK’Ÿö¥-L€a‡4µïmÚãjím4 ™7˜Ä«þîÛùW’mxûäl}0Z§§ÆæÀЖ–‰±€yòIÊÝ™ŒÑܧè»ÖÇ^;¾‡¸¦èèÂd“3Zâ/|¬}l„¿µÿã_»ºw¾«  viÒ?ޢŒæ–nF•¡*ý°ë¨@çhn·I_ïûPGàa8E}3ZôÎÁuYkwçgbÊLVø"7(b’JBq;Þi'–(ƒ~ƒ)ø«Mñeßö9Ò„©¡jzïÉãlÕc` qÏ|[ixtðåS ßξõý¦ m˜–mþ‹Ó{`"L±©í§;9¥l}1¶ua|shÒ—HnÑ}ô¿xšC{vJ˜ØaèÑ»¹$ ×õâÒ5Ðæm4çEñ uÝ5hóÆGŒ»v‡»ðÚë6ñ캟Á}^ï”õ=Þ·œ47¨‹,>—OýŒ‘ <˜JôÚ@A¬¸¸õB†Øö€u7ºÐÁí\cŸã¢ð¸]Žà GTà”ÆaïË´ÈwƳS‡eutAGx•uz™^EçK\ “1ŸtlxZª–Òà+ˆÞ©#[ •}1WBÌ’¯¨¯¡¼I¾”Œ»8ʘ»€û«`$Ÿnl¨ï]!Z9‹â¤þs”³ u«²ðhÕ…º¦ÝˆãE_©×íªïöþ)êÀ«àK6 – Ì(Ø“žÀAÝ}v·Ý@ ÷N'Nƒˆœ$Ïn<3S`ˆB¿w§ò”œæV74É­‹8­¯PÀþdU›õ÷ r}óµÏØ×jD¬‡ÎsNl¸DÜ´»zÿ˜¿OC-¢—I8àáKIå²j±‚JJ ¸ À]¨ñ¿àÕ˜ yr[Äñ6L®Ã4<Žû4N2î–Ì+'ݸ|Z#[ptös4ä›ëdË¡ÌÁ‚¼~Ø„K¶µDkm§Tò¿aØ<4ir˜uúÁÏd,ZóFÈüª ï6ÿ’óendstream endobj 2671 0 obj << /Type /Page /Contents 2672 0 R /Resources 2670 0 R /MediaBox [0 0 612 792] /Parent 2615 0 R /Annots [ 2674 0 R 2675 0 R ] >> endobj 2674 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [156.68 222.8382 184.1327 234.7933] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 2675 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [211.4746 222.8382 228.4112 234.7933] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 2673 0 obj << /D [2671 0 R /XYZ 64.9134 727.2935 null] >> endobj 442 0 obj << /D [2671 0 R /XYZ 64.9134 676.5464 null] >> endobj 446 0 obj << /D [2671 0 R /XYZ 64.9134 390.2243 null] >> endobj 2670 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2678 0 obj << /Length 3962 /Filter /FlateDecode >> stream xÚí\KoãF¾ûWè(QO¿›Ì-&‹ MöI´E‰‘DG¤ãìŸßª~MªEÉcÎb½Ø‹M‘ÍbuõW_Uu7ùýíÕ»²ENrÍõâv³Ð’äLÈ…”de‹Ûõ¯KC½^1Jéòæš-ÛCYìà÷²¹þýöÇ…”‚¨Œêuž½z{Åà ]°^&×DæZ-îwW\ýú;]¬¯èâÇ+JLnÏpL‰È3µØ]I2¥áÌöêæêïÀU¸ŠE~}a2êŒÉI¦Œ\èœÉ¥°úýF™A ßýÀyÔÖ¹>ÊǺ©ÚªÞÿFmO¥»#¶”ɈTŠù;Þ%D‚’èãlŠmS‚4v,I0"2îÛ}{½c‚iÁ¾×+n–å=W ·ã—Îð+Iùòù!œh»£^‚æ8N®úP`¶¬›¦ºÛ–®a[»K‡ À=´¶ X)`ßÔ?›ÛË-ü>Ø›Š¹†QÉ–·¾Á:ÈÛÀAñ´m-VVŒI’1Q8"¹RÜvúÏk¥—Å̼B,«&aM¡ˆQ2÷fJ —„KLY~²–+[/vãþ£ÚöQrÙx0ãñ}±ß×¾í3½»pˆ‚÷ƒQʵkŠ)É0€”rY¸[Úò°«öØõ-:qºйÒp¬ù+–ÃÅåð,ëÍØÇÕ„‰Ì,´fÄH•;™u$çe,Ï9x™À[xø=ò±Nâ*il £9áFçý“QÅâ>xOy8Ô‡ã¡Òœ-Ϻ˜èr.ˆ4Ÿ±ËAâ¹.çÀ:îtù¾^§ IIλnœ¥‰CÙ”íe4¡Z6Σ=EÜ%Jôv™ƒ¿–îx‡ ë ÷Îmá,ÐÀÆý/ÚÖ:êîÑ{ÿÁ¶Ä7[?>y>¤Šzç~îŸw#çâZ\Š|èâÏu“ð¹¡cam< øàDŽnVVOÔg½ª7«¦ Dßz³²xá4 J¸@ö¯„ù„šggi´B˜aŠ™ÞøÎÕÒÄ#£|ÃGd`[èÓ¼¼K°l¡…!™PêÕØ W±ÄcèrðV©4ï<Õkhk:Ö ‚Ã_T OMõac·ùŒA–g ϦûÚýßÕªð’÷ÉÇ*8ëfåqþªÅmÔ-Œ?ÇX1èdN- $1h¼ Q`žª ÓÐ\šñz¶ W±ÈÛ€ã³\šþÉçØFqÚ>ø¸êbuó´ f—–„€$a~öÔ}¯hF‘3H:2ÿЛ+—4Ø[û1;å½É¡ƒ˜I³Œ]:ryÌŸ—ø¯¡¾7Òô„ÇéôGHíŒ-º^;hÝÕ¦vWm’dq?|½—dÀ=EsÄicÃ~ƒMg÷kwOwcþrp üÕ¸eàÐÛ‡1Ý>5³iŠwÌáðw o=°íÓÛ¹ (ü >[nðpëš??”û¡ì6æ†Á# .ŸÀBO¬õGéô ºÃ r䙣ôÛÉÎã!»ì»L0³œ–ó©„Ca=‘/4Õb–„ÃK\Å"S GFrøÑ?ùÒ„#™x2I Õ”½<ó,¶UÑ ¾óì\fg}¯gŽ|'T¦(- ïG÷Ïhè®U+È4Õ*døï²}®þ´÷ÿ@Uá›nêƒs¿#Î@úZÉL.¿ÇãϮպÜÖ|_Éuë5Ä àP4æ(÷ZÇ.î¯A·‡Pk=Mľ ¹)ÿ¼ÆÄÐzTá}²ï4oº¢§¯x²¥»Æ”QîƒXÿtô,k”åãp±+§#òzþðÅÀÛU˜¢ ò~ G èA8—YþŒË‘Óê¾ ²ª‡'#š‚ˆÄ†é2ì¢íM"—ÏqT:%l5à6lâì({<Œ5#‰Â`ïúâz( :2))š ƒ³ :‡{+à"¢„ÕßÞLy\1máÝJd=¼¡ÕÞÐØ¦wð æYeà?ÔÅ1œða¾áࡽOÁC(¶Ñ {ûãA zWf:bxªï«vé;nà}{þ R™È!÷¸{ÚlÊTYˆå}½/O¡Ø\Z2n«ýëëλm}ÿñ²ºSäê„Oq€ž“ªüxÃp ÂÏÝ ÜgøÿîÉ•¬®8=؈ÿÁ]ª¼¼>»Xû{¬8ß3 —]¼«m1J û_ ›Ä…ùJ¨ °HëkCçuWfD9Î×(1ÓƒžÌÜCÝ4¶“M¤’i3 –Œ¿´à™ÂÐH§ú©sÅ:B‚uQ´uÔFK1ÖE[DµÞ®jÛÖžl•cÕVÛ(¼@áX>cÛÕÖvÙ{¥'äû§C3£ ¬\R9‡LàÎ qg'4w~4ŠîäÚÚ¬p?žÀ¹3þôg?TŽ÷øS8C=íð¯Ù^2J²gÔn[:2s¦u^`E¬ËhÔlíQ¸6NÔµ¯;:/Å}Ú¬Ÿ¾»Ã>|n»ÄÚ?(=p¹°^Ü=?Ô èj€ˆÿ`®/¦Ñ?˜LÞ á'xCf…¦¿½ý'šï›TÈ Tûê ÒìlKhTGSúÏUS’„X$C¤Î1‘7D!ÝÛ[K;ózS?îË›jÿŠHÅÕò'(üá%6ÿãçGë´iú·K¢›xw¼¬f  TÞæfî2Äöc}µ†4<|òb5ý=­!38•Åô°ä’‚TàìFA®Í‹:K½wùÊ!ĆԪ•0HY~I±-[%Ê=Ú;ÓIYî> ²üa¸ãÔ ƒÄ(aÒ…£•åj! (Ò÷º7ø±-•"WʆS~ón UqgÉåhN3gDfPœÆ:½®›È3ýä9@@³|ØÑjߴž­ó´€F™‰è–×VóÄU,òXY¡¡åœ •íæ`c%Ã9Bxâ|&EŒBÅ&õ÷·k6'®%“Rv×ÎeÚ¸)=2 ñ/Et¤Ílˆžìa踋":Ü2#¢#‘SˆŽ•=ƒèÙLúUÂÄåÚ…;N"šsBáð ¢…ôÕQ‚ˉ’ EWRŽ0mÌ€Ÿ›lûEŸ²3™mÕø Ïݤ÷ƒoáS³rëRöâ©HPi/¾?V=#ÀÁŸ°RÌ–£e‡:gdØ×U䜓ƒÕ;g4Zú¦¿cF×ì%Nyf¤éÇt]ç¯7ç[ 5ªaôÇd‚ˆ$/5Ý”ó¬r8êAn'fí¦·^z:`ѺÙï4þ#ýg N“6éñ¥ýüx䤂AUÃhÔòÕÀW±ÈòÆJæl¨c¦‘Ñ¢Q½*‹´GÌfà¯ès8¾ÉeÚ#(%¹¡ê‚X%Ä‹œ"„°0å §¶~V®‹bûãň8Òr–¸ks9Ë´¹zg‰í5í,¡åŒÎ‰œr–XÇÎY0EHÏ$ýe>¿É¡‚òiáYF4Ónñö¦Û1u¼ Cyžp—°5q8¬ÜMdG±n³~²¿àž|×r>ÀÇ"'?бüŸ6íܧ¡¦1?›™ßH9Ã5%W¦1o4áZð/œxzUîä&’ƒàAaÒXMìtucW>žöŸ¨ŸsUÓ¶ëý'6ÞºÞÕq]Ás’úÕ$®b‘ ‚P\>hÙy·ðX]Ü9K¡ãó©$žS7ω¹ªÛô³Î=8§ý|68¼•Ø&3"´93ÁÌŠñ¯X¼h"nï6 Ú Ç- E»B»ýøE·™ÌîŽ1ïF+‘v­«¶ëJë‰pug¶p8i¢ÞcsçÐvFwŽDN¹s¬eçÎU}¤ªQÐ}ÊfT5H<§ªÁ‰¡ª»~ÕèlA7ÞJ°烞÷J–òaÛ䨛¼½|êOQ¢¥ë–ç¦üêM´Í¢Lm|‚æ´KΔ•¼[ÁmF[—ûÌ¡ß.Û'Œãlç©×ú Ç>õmz³éàÊòÍcØ#|’p"ÓÏ–?Œ‡óáÄzŽpBÛ '9E8±–}þÐÕGéüa6uûüaZÝ.ˆÕ­-<=í¼ŸæœÙpðF8£¢õ­$ç0E×¾D|è·mØi»·&JÔ?úM¯Ç»ÏÖa«Ý–ØëÖŒ…Í>—W"ëºVØ?f{4’G—ª”ŸŒNÑAl•¹èàÈÒ'è ¶µÕ²Ü'Rt©ˆÂ[»æ¯v± q‹L¸Deƒoë ®($ÃÕ ®æS·“xF]‰WÁ@Ý—Wó!â+ƒœ“0Ï“ŒOË)É3ñ_Ë þeá B¼B\6ÜùÉ'Y"2Ñl,16{š%bß~Qà~ªœ÷Í_MAà*’˜à€k6P³£ÜRæï[XŠ‘ó©Ý œV[B¥’I1TÛQ…Cv+c£|ôR™ ,o%³k2Áå4ànCã—ýÜûþM‚m¹ó~xº¢œÉ©ŠFvß»° ˆÆ·’Õ gÝËPSՌɲQ5ÃrÿÖ`B¬&"3æè­¬ôIˆ¿”e¡?ø*ab¾cÆ´íŠÿîL9×Mãlí· Šõg_)YžïÎTE·Õ;¼0ÓOé ©Ñy2ùïÙ1ÿÙØqŒ©ì£êz ígäÇHäAÆš~ CÎ¥yD‘“š÷k~–$‡àŸ&ÊÙpóVˆx"ãBO¥äDh%Þú´O’%µ1Ùñ+„iš€a28‚W’-YN„鲯Ÿ.$ÉÁ*îAvoòÓñ«%òd4ü³ñäR'x2ÕùZ³k>_­‹œ¨5‡ŠgŸÂtò4©Ìfä·R¾QN“fšT˜ÿ¸ÅÿIåk‘JÕŒ—ÆâÕ°sÔ âlÔ0Æ jˆ¡qI ÚϘBE"§R¨XÓ>…zjŸÂv¨—Ål&ÿ*D! ÏÔ‡ˆŽ´ wœ" H㸢Ó<‘ b¤Ñÿ{4qb‰éøË‚iÚÈ ¡T‹¨dsŸé¯r…t"þlMSÅëWîM¼Å*H¼­<þ²]ü®éï-d–hÔ_‡£žXÆ@JóJ ¥ h%4ŸU"‰¤«ùeÙ\j÷UÙ¤Ú]Q«}¶&K£|’gƒÍüä1~®‡Gõ+K|:2ÐBkˆ_®ÁiëC[Üá;Ýv1Z°0û{”©á}½ù¹™çP®«{_ 4þû.·ÉÙ&ðu³M.7y—žbZèÉ ¡a6Ò}¶"%NS0K÷ÁŠøó~¸>^·ÓD‡~&ÿ/û‡ëã/ö[ÛúƒÿLØ'¨šðņð}0Í¿QÁendstream endobj 2677 0 obj << /Type /Page /Contents 2678 0 R /Resources 2676 0 R /MediaBox [0 0 612 792] /Parent 2680 0 R >> endobj 2679 0 obj << /D [2677 0 R /XYZ 64.9134 727.2935 null] >> endobj 2676 0 obj << /Font << /F8 1548 0 R /F14 2010 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2683 0 obj << /Length 3306 /Filter /FlateDecode >> stream xÚÕ[I“Û¶¾Ï¯ÐQª˜0ö%·,NÊ©TœOê’d Ç£Š–‰¤yŽÿ}º± ‘㈩z©9ˆÄ½7~y{óò;sÄi®g·÷3-‰cBÎŒ ÄZÊf·w¿Ì _T\;ªçfQ1JéüÇŸÜÎß|ÿæÛE%„˜ùóëïVÌo+è0ýChýñ§W 6ÿúõWØøÅÂÊùí«·‹ßn¿»yu{ÃfþX;#×D:­f«íÍ7¿üFgw7töÝ %Æ™Ùx¦D8«fÛ©QRˆÔ²¹y{óŸ†`•(V9É/q¥œ–ª'’K–J%× NÁ³°å`ìºÚìõKûå”…&šqû½(P2„R¦:„XPe%ÒÙYâRjßÿváô¼Þ"ÊGàï–§úX˜‡Ã©Ö³ŠAW¼ïWªègÇÓ¡^nûaÊ)9І¦dA$žíA&Ì92„ ËÓ{O" Å*'D’Ãeše©hgF¼ûÃBÉÖVOˆ0QCh±TÛ.Âåf½<¾XTŠ«ùgž½}Ä\JP2k§CÜPAÌ¥!JÖãéãi½ß¡4Ž(£Í„(Å1”–äë¢Ü¬'PTo¨ÃœX}*ƈSŸ¬ÍÂCSjsFrH›S·1mž a«ÍÃmÎzmNlï{$þÑ:ô®Á¥„!_×ÇÕ|ÑÚ;¥¤Z½Ù(¨ƒŸKEWpo÷‡/¢ñ¼ñc³ÉóØÄ(è¥:s›88¾J:>?=€:ŽêÃ6t¡ù_Ïš’Ÿ5”h‘".è>§À/–¢ _ߨ!g ÓÃÔ@rL¤>ëc0ÄJÍ»&’8#¬†å-wwðº<Üaƒš¯wðöø´@.øÏ-äÈ¡ö‘eš‘ø;Hlïét¨5FÙg™r„J]Œ¦¶t¥´&v;®Û¸÷1Îð´Zy=ðpÎ1 «7Lj3Çœ©ƒ™ûA%<ÿ¸s1(ÝåßqÿtXyê/ž]¿)cAÛÃ\ðøø€ ÑÇÐ$WËÇgLXY‚bWÐV»ÒDhj‡å.‰¶¬»Ÿ½Y<¯ž‡ðÆæ;u 0ºr†ŽÉFÎàHì÷7è¼ó\õcVûm´Îà¼-q3›8˺š)yÔ»%’¿[âÔ¨Sx¹Ci?Â[èÕ +ªc–ËxäÒÓ±>ó¹œJ0°¥@¿xÒ«#]¢Xå$ ‘Žâ,0¢éæ%¹{„žK[C0d&óÚ]PK¸ÒjLw¹îHÞAQw€éû§“z’A’¸^‡ÆLmêÞØQù÷@+Œs=Ã+ª”²E Ï]/uG^/º ¦1F © Ȉ #gJX,9®×’D°Ê(”*aÀ¥^>sN–”D0ÐvÎ%)Dm!ÅJ Ó‰À_Ï$ pÃ|лÅwagsh(Œ˜M®éóbIÜJ&ãx+< ÑÑAà2j³Nþ3Jn~›P›C†û¢UH9ÿëK¤ GÐJ ¼Ýo»ÚŒÃw)zø—ØsZêéúöäÛ=:û¿…Ró%¶n–ï6uä„óŒË<…ÅuR£_)+Õ’þ)öýâ ¦B§ÃS}Î4Å‘nÊ^–*St)‰«÷ËO¬Ø˜ª|œƒbÞçA… š§›j×sP/pŸ€Ï× 6.];ü•óúp@Áàc̼E?¹Ôó­ßñO‡ÈìÝû@ê´Í~dP[ßüBL÷î§Ô¿Ã«‡$Ñô=wAL‚Í‘t]ª¨d èŸð™æ |”¶·šgÿ×(Ü’sHIrÇÇS½=¯¡à¦$ÖHŠOª"Á*§Xª!¦0ÁÛ‰cXÔ¹f_“4-$õè-ÒÚFùuL«z«ãƒôn²å6GÖ+„!`fìYëí*¾·6/è¤/‡eãÌê»VÞ…Ä©à>áÖ˜gdÆ&3_æÁ ÓÕtG§ÿ»öO1)'Ü$!–Q(cDfñN‹Çäz~= ´°`øÖäùvkø6äЧÐe}Œ¿ï½±’yEÂñÙ´¶ Ïç¶Ü!ÕŽ;Œàynñ-ïÙã×Ä·”d üq.÷Ú/Y1ÈAžÖØÂ#r;–Ä3ô¸¡c'ö€‘ÞÏ9p›Í÷Ðìù Í=¾BËCàÌÆ§åïCoìÉ‚oªsºÚ+I|\ŸâœY–u<Åîm·CÜ&XX|…¶3{D >¿}¨Û™üîqäÓæðBÕïŧØy]*ªÄSÃŒþ”D t* Iäy®˜;ûåp©)±Jê^¶Rÿë^‡•lRzáBz!#ïÎahG'Ï-¼·ûñËoeƉŠ2”àQK,‡jº“à½JªsºÒ¾»¤Œh¥Ÿ•ÚfïGK[•¾H+Œ£@+>&¿ti_X‡ï‚Ëö^Ó)PîÓ?\r^Î<ƒ,ëå;LðÎwo#Ò*;ËÑ\·À†äÈ ¹3ÄjæºK\ï°è9­—¥]\¡5Ù«#h¢Xå$ t\sÐÌØ&‚æ ¬TÁŒÓ±µ“I ,c§ÐèdNÏG—F\Ôh 1Ùq9¢ÑÂ&#ãåTSFô”úÑ×Ä $›KåU¬–šòëÿñÁïaad~ˆ=bUTw·M~ÁÙ&HŒãÕ9t¨.T³Eóáa½BŠqº¿kg¯VfƒÒj­3×3­3 ™Ð:3’CÖ™ƒ±ÎÉXúXgÒ± ã LI…5#Ö©4°2&Ÿ¸Ù±K‰Q0°:7BÙ-þlB&JëÜnCzÜ–ÛöEóÈ–6YðdWk9¿NÏ«>ÈÌ FÊz^m‰b•“,Xç cŽu1z«Àô bùpªl/“ñøß͸%k¢a{‘}á‘Ö§ægÃÆÚnÊEëè…µ³±:5eÔ6îýâ.tÄЉ]Í™_Ù¨²õOsyÚUÎÔ»ýv¹>6ÜkX&€«Í*Q¬r’¥Í0êlecVå³zá ’Q&'„›(ŽÁ…ZS gºpÏ#xpv:€‰à>É1Zó.¾üÞI^Å–]SÐ*ûÊÿ×Dñ†L› Ù’cb¾-*ÏÏrMŠtr4–ݦcŒ¸qUÞj§R<ïð$QmÓõsg.44~0ìosC´è{·~nÝê%Í)våŠüIÑEŸØ2~2—Ø“å˜KsÌ#¦¾zÄŒäGÌQ6±xmL˜alB´‰âZ'‰ Ntц“·èq^ »›©”à_R8pÇ ÕF 'BÜ)¢!Ðü­Dhí}éSšcv£)s¸\»ï}ÿz×?/Úp¾œ©Š…a5VÜáQý'¸¹zW8'’Š(Út¿Ú4Å*'Y0 ”RÛÚMmž•§ãó¿ÅN îê =b'V€û¡üÙv²«ë»î®Ñ1\ógñž×¦½N#X¸`Òžýã]‡ÙÚûØÙò’([“ÉV6™É r«5™œ]åSä&L5}§ |9ÉÀ×AÙØKÜ¥À7Ú&ð M¯ËÓÇz…úÓ/ÃÍ1̆âL)ð" éYJ:Uð7“)éôþ¦ë$SløË ¼B*eLd\@ðÛNËwëMÌ›<÷½kȯ߾iMýPß­W1žãÅ"<Ñ,ÜßaÀ~É/n0k‰¦”X@dòúÕP¬r’…‹ÝÏH%Û™ÇMŽK‡‹˜éÐ6GÐâm7*á¿´LŽ; !"ï|5ÌDq ¦Ñ Þ…Ù1¹^½&!Oà®|:óí?ǯ¤üqýfÿ>Ÿ¨{žÚëPéJ±¿¶V>üÕ‚p†g.âb¬û)“ý”é~ót|8Ó^ßEY Ê…£×× Å*'YÐ^ä¯Ö®¹½þXüNJ2b%7Ïýસ\¼Ê•Ó-·¡8²\Îð^nÎèl¹´ø†Ä½mp|ñ»0uåwab@ ˜& ¿ aÒÀœòz%H«ŒbA™F7ó¶<úØLTYç¦C›Ž ušT:h ·ÎÁ>™V“ÁkÃãà œ’¦¯ó™n¶ Ù;¸Ñ 0T ì™R)2’CZ‘ºõ/Fw EIb¡H¸þc¥"0pàvðãµ\HôªŒà9 ?µ 6³v cà2“&Ô&xl‚KS5íÂ,>áfàÓ¯”‰æ¤¤Ýbý¯|°¢Z@•õàOb–«øéÔñå;OñÔÜÙßw.gNfŠ··À´ ½UŸ m Åån:yd/Ë#u:wÞ œŠ0Ý|·µ|ôžz}‘Eů*Â'ÍWífNu!A0 DïKŸ‘Ëa6äendstream endobj 2682 0 obj << /Type /Page /Contents 2683 0 R /Resources 2681 0 R /MediaBox [0 0 612 792] /Parent 2680 0 R /Annots [ 2685 0 R 2686 0 R ] >> endobj 2685 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [223.4411 278.7174 243.145 292.6651] /Subtype /Link /A << /S /GoTo /D (subsection.7.11) >> >> endobj 2686 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [270.487 278.7174 282.4422 292.6651] /Subtype /Link /A << /S /GoTo /D (subsection.7.11) >> >> endobj 2684 0 obj << /D [2682 0 R /XYZ 64.9134 727.2935 null] >> endobj 450 0 obj << /D [2682 0 R /XYZ 64.9134 702.3869 null] >> endobj 454 0 obj << /D [2682 0 R /XYZ 64.9134 219.3802 null] >> endobj 2681 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2689 0 obj << /Length 2205 /Filter /FlateDecode >> stream xÚÍZK“ÛÆ¾óWàHV £y?|qÉ;W9Q¼›“íDb%”—€‘öß§çH€äŠP* zº¿~}=Ћ·?éÌ #©ÌŸ2É‘!ŒgŠa¤5&Ùãæ·¥B¯r‚1^>¬È²kÊb /ÛÕ?gœ3$4–ö‹™½»øñqAàÎÈQ&•ˆ)²õvñïÅoàl³ÀÙÏ Œ”QÙg¸Æˆ-²í‚ É‹wž‹öq–SŽÖä\”[îecèP–»s&‹d„ Ó²ü{d…ËøÆPT Í¥Á3æDþ`!¦4ÁXDµ™4 Ib´ƒí¡nÞYà†î3)§4@[µ«œ1¾,ì[þg%ä²hªâ8å¹<…‚¸:Kµ¹ÏÀ^ä ©QHƒiC«]Û»®*ºªÞjË$‡fÉ+7¸–!Â4wlÞKÌS‘çÊ2i¤” •-›¦nN•D#,`Çù µÑI8HûsD4eˆ˜½B»øÆdDKåüJDk¸’¾:¢wÁ¥-)•­/ŸÊÆGxំ@‡GëèîÙ®N1(F¹-MQP±Í;waïl½ïPW<œ}æ[UŠçªh§s(±ÿ>H“ºˆé1‡RP7õ¶¨Î“‡¤IpwòD‰y*r$yCCÎ ´tÉó;¸õ½âT]™‰ ŸQÝ(ñšºÆ Á Û Ô=OtN0Ô=Ÿ‚Qàý8aHÙ§ý\h¾Yå‚ —U€,™.M³Eê7)Mß Ù–Lau¥4 bûªÒTw¡Ô¸"ÓÖ«œê噫0û.?ëWX½ó¿õÞ­/ßã9q¬4‰9³uë‹+MŠQù¥j»r·>㌠$ì«ýò»³7JÌS‘#ÙË5RëE‡Åææ<™ ço˜'dÎ<áa¢È•<áIÌÔëIéΧAµÛCº´+Ã&tåé¸OÔ›-î/š|ŒûÔæ}Ùl«¶£¨ÂN*4YwàG‰y*r$ð!Z #d¨iøõ¡Ûºø¯Ì‚ÙPŸ? ÒÐ…îI´<¢CFfVIM«,8ïW‹uÓªgW˜»#Ë—óhNè²}ïoÿð‘»wA»©Ö¡Ê·È¿;Ø^f )!D?(#»Ø„µƒÞÚ1aBÚ¬MSîºSÇNaî6, ¬éýcP/1OEžÇáaªÄqg«¦¦·dÄö( !܆1(ʇàqeä²tÇA‡= ØŽuÄ` UŸÈWB/âBÂ2Ø *¹//OŽ`ÂìÛ ¤_vÄÄ&Þ÷ýå(@ÀĨ¶‘ø—²]»QÆAGá“O‚r LùvÒÐï‡%JÌS‘#À`0ÍyÜyÌà .iÂ)µÌðía½¶H”JÙS¥œ*¶¬žì/uÓ`éo9Jþé•©Ï®ì>_|°\®úæ„2Hù\Y‰L&‘f¾×ñ¡glCKA% « ñ9åËÇOUë·ÛÛò;®Cøá“i#ÈpöŒ=´·#/¿¸ßõ¡‹§;~‚ ÒÞ+Ö+ª–ºæ®ín»…* ¨íNö€#â×qŠ ýÊú9DªÄSÅ,²Ž%"‚í¢9°Jjþ×GSD(µl."t­ž àºrÔЯï¨!yá¨a åûÔŸQæ3Ìß’ùX-)æì2ópQ‘¯e>ýû¿|ؾ·ñY?×:)c¯áA!‰8ÙØFÇaÂa:ÓÀF:AØ ­-JÌS‘ã<BHwvSASÃ`н¼¥LHÊæeBÀP‚4$lFpb­Ì T(HÌS‘#ÀX-%<í—¥À$t(äà÷0»3ÁçÓ? ¼¢>ZË 8iJýQ G 4A¥Íýn #訥FÞ_M£À<•8Fà0ð_ÂŽŸ:ó!õåû3˜ô e0âö(å¥ãÂwÒ§¤T/ƒÅåÉȶ xAÌU/ñ V¶ñ^jˆÕdª¢Íì+ȸVºg.šrί¢æM ˆ¶±_³Râ¸/>ZnlðR1§@´gYì6þ¢C[*d¸ÔA¥èÙsÕ9Ð"j¢WŽÜ9Ò™Öoì(´Û­Þ]ê'X“¿±w%ƒ6]u"âl}Ûb¶¤ša Õv÷6J;áÕîn|šphûï—2áÐIB ñ+ÉŽglîÀ³nŽ×•5ÿ2³L ùÌ¥\Qgs,ü)Ä:ŒÑ1o¾ó O LKRpëWÜ F<뮢´§êü“0‹™4Zh îïA`žJ©6v”ÀŠ7¶îŠmiÿ§ñÔ š*ïÁqîq!â¸6¼f¢§øÈ{ÞÞs¡Q[ŸíBVŨØj^šuùÖ1tçÛ?Ñ(úö+ŒûRh »Š~Ìôm½q¶ýr›m#YаÖqýå\‚†ÙŒœžÁZ+?EXlº)ot8šuå?^lŽXY5GNcT_”!¨7#'ÁPŸ(‰f¼¹fÆç¦òSð‰ ó‚¨[¥û}¹ÛLMãa‘…}Ô£й&RE—Ò›]Zíö‡îšößÙÒÍÝá… ³*ƒ{? ’'ånDeH özý¹ðµs‹U¶Â.ìªÎ‰åÃêöü‰8ºOž62ß'Öœª[èÝ ?bøÿ 0Y^®8ÌþÇhà·;,Ú±­â4;Q7¸BX±¹ËF8®°»Û>ÝLœ^„8xTâÆTù”JÐ×ѽì]ù|¼«|F;¿¢|v+¨’/} ½  ©m~ Ç㥮üÒMRvk üPíŠæåëK G jÖëÝÒ”ûº­,Cµ¶þ:îË/ ¿¹·ýúÎéƒÒû§nûsºêÈãÜ×ìêç2V± >â¬ÿ¦Ù5‡òîn÷T<·W»]ï$KÓþ  >]þendstream endobj 2688 0 obj << /Type /Page /Contents 2689 0 R /Resources 2687 0 R /MediaBox [0 0 612 792] /Parent 2680 0 R /Annots [ 2691 0 R 2692 0 R ] >> endobj 2691 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 223.8095 516.6856 235.7647] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.9) >> >> endobj 2692 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [86.7292 211.8543 98.6844 223.8095] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.9) >> >> endobj 2690 0 obj << /D [2688 0 R /XYZ 64.9134 727.2935 null] >> endobj 458 0 obj << /D [2688 0 R /XYZ 64.9134 581.056 null] >> endobj 462 0 obj << /D [2688 0 R /XYZ 64.9134 342.4868 null] >> endobj 2687 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2695 0 obj << /Length 3206 /Filter /FlateDecode >> stream xÚÕ\YoG~ׯà#‰õ´û>Ø{£‚Ø+OI(i+‘Z’ÚÄÿ~«¦é!{f(q¼ˆaÀæÑSýUuÝ]ôÛ«‹×ßÚ™#Ns=»º›iIrf%ÖR6»ºýenä¢âÚQ=7‹ŠQJç~Zp;ÿÃûï•bþöçw?,¬˜_U°`þîGÿ釟.lþÍ»â‡oVί.?.~»úþâòê‚Í(üaíŽ\é´šÝ<\üçâ—ßèìö‚ξ¿ Ä83û^S"œU³‡ ©QRˆøÉýÅÇ‹%‚U¤Xå$ß"§Lf¬G¬2r¦'’KѰú+e¾þ–ólmxE›5õæî F5aš–Ø RÏsŽáñý‰b•“l¸è cÔn´ë²±¼Ù¯6ë_©¢oà/æ9ÊÏYB`£¿XÖ„Z+‚7Ç,QŠñðýj‡'.ç{8ïOµ]¯oá]£ °ð ä+áõ}XãqzmA´Œ”pQøÛíf{ŒNš)f¢WcüŽP Cùt' Ž à ‡2ßÞlnë—”8J|"—ÛzWïÇd…úAü¢ŽyT‚{R >åjÜ@"Éë§»»z»ZÿŽGú¶¬€š£åÉ øö x ¯Ÿ¯¨Qó¶ð y]{Ø€G³óÛzPõœƒtÑì×›õùGr¿ê'"N%r}¿¹ù÷‹Ï•kC¸ÔöôsMŽ,º×ñ)N”fJÇ—‘r|qB,¸f®€5"ŒÇrSQán¿­—¨q—/wÍÀ¼ .‹–a¸ìX†žï?ÔþõÍÓvëß±ù#ù?WxÀUë«=RÿÄn¿Ü?J}ŽZYÐ?®’¹\SD;Æ1iÂe‰%RSs*‰Çån?fpÞT*© u¹ó’È¥•Ëá±ñ›Ýj¿‚/Àæ |¿ÃÀs2N¬ T…§@S‚õ”„klÚ i³c!‰ÑÚ·³ZäÇmÌüiþÃm}ë?ùcû¤¥‰6Éu%. g&Z}¿C¤µ'ººóÿ&¿ ì´¬™\^Mœ7:!Ä“iDq”(4쓆FZûOuI>\ŒŠÓÔ’äp6Â¥Cò©n+¶¸û­=ÒSŠiÙ°²ü$ç‡ò+X%ÝÄa‡¼'@ºFíK‡pqü°|æ€Zk6n©aE1Ž0g m”ü™éÁcPô#Ê>P¢D’ÄhvðáÙAÔRÐ7TRJšd–rÒ}½}™ê®ùzÓ,½iV.÷u®þä7ä¡—uÞËÊyÜÎÛ‹Òå,—®Ã(à\Wº—HóßàjJu”2 üw§„¹¬*:Úú¯^Zþ9 ´ÂËøD_M¦4EÓ2 #Ü‚M*ÈQ¨ ¹ðGRGG,$æ×îàŒ—þ þ»Pz¾Ü®–×¾Ü8wŒH«ì,Çs‹‰äŽÖjæºL®Öb×{P*TŠÃÚœ´´"{äìâ$R¬r’…êD;¢9¨fl*Âr ÜU°ãt"Eý„Džý‹ê4¤LÉ•V ®’ê¨ô:zïÐë­Wñ¥ÿ6h:Æ­åõ}¨hÖ›|‘˜…ÔjŸª¢‡~ãh›Ì6†dÕšF.¬ÛÍÃrulX7– öü‚=P¬r’›‚PêlecÒ|`yµ¨ ƒ\Ù\¦ò±¨a&W§£‹OôZ Ô©Vz0É VMxßnëíþs¡VR„i¡ÿö’ư_'±ÄeŸéL¬§>÷›TÆýyÍljP¢­Qe"³©°tB“j)YTñÀ Ž°:ˆ`ñN‡5Áêä¦Ît°> VvØî'Ó„/bø´†ÓçñøDŸáKc qØîQ<Ʋgþ?JÅ#T§æÝÝê8dÒÁVÌ´{žÝŠ«œd¡3¤8á²û·ëåC=ÐjÊ\>Ôi4Ä9‹¦‡ÍíyÔ:Öò~µÜ 5­è2êÊTœQll¹£®Èá¹XC4™(ìòÓ*™Ác‰«œâñ©8 Ñ\‹vßž†"^…ÔÓáKG2 ¦dàÛŠg\0# 8*;!Ç‘âÇÆ… ÃÇííÖK9®¸?a¤îv¶uÞ›è!®ÑÌäÉ–³ÿü8h‡ðRˆ¸8^mô‘ÁYH^º\郈b#vé-ìHÂÅ.vnާ6ÎJ±Bse¹ßô—Y°8/ü´iÒ`üi³¤Ü%ãá%Ìɨ›.l$Š#aCp1Û±.Æ”'¡¾÷ùˆíµúvu³ôÕ1^ H9¿úTêÖBT1*ùd–¯KöH‰U2æ"Åz¡Ùß[W2£ï~ü9 R4m¿ûM¸½l°ý‰†z‹Ì×+íD&áÈQܤba®ƒ@HÆ+ð'ñÞ!ñç/ºk/&|&®à© .ÖÅ*'YºXSÀŒíÎ}·“–8ŒÓAŒÇ B‚J!ÁêB,„VqMBÞ;ÂHq ¡rqCºØA蓉¨ÃOñ êR¦z†ƒ›ãœòéxMGxå XBY9ª0\€™ä29a 8… 9ɘºp(^ºL0RCjE%³Eu¡E——qz%•”ªyâjáô¼nî]ÐÛ6~¼í®t±>žjݽ)ø!Jaä[AÁµœ «œd9§R«vç>?'¦ƒ˜fF ƄĂm3!ÂHq !D$¨i\a[Ôü­ÜþáµB.3á©'Š#€9“˜œúñ}‡(e¡˜a¤8†[â¤éŒ<óL…oÞÉþ‡Œ ŽSƧ4®ŒäqÅe£Æ5ÄÖ¸†!&ãÊ!×d[ãF˜Œ+G¸ËnŸº>ÛpCúàNÿ›zwÓÔrÓŽ÷“;¤ÔÇšd4f -J”Pç_×D‚UN±ÐX= ´ªGœ"PL¨éðE‚#øœÅpj»øJ]'G4dîÓáKG2œfâP°u¶úãfû¦¿ Áyìmìžnš¹‰:ŒÕ4E‹€â§™!â8¡†nÂåKS‹¥ùø8Á°ó›8~ÁM¿ÃלÍnM©Ý7í‰b⡱SIcéƒ §z˜ISxŸ–»@¶?§Í,gHùü >äçO¬.ÏP§ù*XÐpÿ6ÃT©ÄA³ã)*(õ4åÁ;SiªM|K^xr1ÿ©×àPók_¬úo°¯Ìä:‚%O;œ®=&NPûGå`.µ P9€rCѯ,=?T&ŠUNòX¹¡ÜÄérÑîœ_ç¼æÇç^IÊÎu[‡ÍEU#l¤ÝØP_ÓW¡Á°ü= ‘ è–=©ó¤’¥Þ„ž4£8àIãª1O:¾Ö“âKž4Ç7äI§Â—yÒA€­'Ívk¨þK®åcS0­ê8̶‰#g¡ÁÚX,Nn·u;Õ+æ+4Õǧð®{+Ï l«n4?eî 2b8%iþ¢3: “ΩáÛG†cwV³a¿ŸMs¾pê,G3ÕdÍ0‡©¿Ýañ´©³ôÈtSg9É©³Øá©³éDú•ÌÑ0std’’Y¨V—ÏÖè/>tÖÐñŠŽÓcè–£÷!?+ÛPÆÿT“4Ã2mm(êÈ(MZ;Ý,MNr`˜¦ƒòÔišéà¦qš¸qž¦÷ØÐ%¤RšÛéF‚#ø$ÄhÍ»øÕŒ3~YTvM“iêW2‹wVŒy&¨²$úEži²™eãcvYM˜~³Á;?‚èÜ<ÇË·u'%êu4-7“Åê!µn&—Pýçj·¯×7Ç÷Ñ&*|4-?Ût#Å*'Y0]i‰¡Ô-ÂŽÉTRþZlDJ̅Ĉ‘€ˆ©vîù éÚÛÀæieCÊþKs­e­ÏðM¦öƒ<·zŸ3 …øÃj·+å§ ÿož­?[ñ#Å*'YP|P'ë"MŠ¿ZCµôþ™F0™Ð¿äh¢¤hŽf0TÌXäN>š±œÍÓ6ýº¼_…8TðVBPy¾ïL«œd鉭µiw~¾ übO8 äl¹2mgIšé“ƒY’}û;µñYn¡(Ó‚õ “ðÑa’rÀeRà@µÂÿTQM0¬VÅÒ¬††#S&í›ÿH1¶»"° §gÅéWÛÈçÿ‡Bãendstream endobj 2694 0 obj << /Type /Page /Contents 2695 0 R /Resources 2693 0 R /MediaBox [0 0 612 792] /Parent 2680 0 R /Annots [ 2697 0 R 2698 0 R ] >> endobj 2697 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 263.1384 133.4897 275.0935] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 2698 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [160.8317 263.1384 172.7869 275.0935] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 2696 0 obj << /D [2694 0 R /XYZ 64.9134 727.2935 null] >> endobj 466 0 obj << /D [2694 0 R /XYZ 64.9134 418.2926 null] >> endobj 470 0 obj << /D [2694 0 R /XYZ 64.9134 84.1499 null] >> endobj 2693 0 obj << /Font << /F8 1548 0 R /F14 2010 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2701 0 obj << /Length 2529 /Filter /FlateDecode >> stream xÚÝ[Ks㸾ëWè(U–¼§T¶²IeÉnsÚÝ-sƬآCÒ3ñ¿Oƒ HP„HÙÂT­÷2#QÀ‡îF?èïo6þ¦·IåöæÓVrdã[Å0Ò“íÍÝ/;…Þgc¼û¸'»¶.òGø¾kö¿Ýü¸åœ!¡±Üb7Xا›n6žà-1©DÜH±=n¸LΘò°ù¸ùyÌB»&§U×+ê{ñL¤iF¼ì™8E¬ÿcnÙSRçÔy‹ gá{k×ñqUèÄÎ:§@ɜӢXGçÈuÍ7õCº¦qÉ3/vL©¸Ž~i‘ëà–®>M=“žÆ?™&|ë÷ÚŸ0Ò&qCÄŠõ[ù(MÞ—TmoÊ“ô¹ÌÛ>õ‡é4=îF÷ö[¹4¸è¿ž)Á –l'Y¨¾(¢Ñ’Cÿ+›¶8fIO&ìÔaøÕ&â³2b#\#…±>!:5è‹/ÉdrNo'SåÆ&ÈâI¤¾Î h®Íú»«mºXÕm~[>¸»dÏÈîe®î'e»¿ÿóßN?²7MõP}î“x[']4>–Äd,ñ#;œ°H}„ƒ?”|¨¢í¼€® ð‘°/Fa(Q è=bBFÊ"¶QÁ¸W^(óK ~–³„,=âK)ÑTLYú»Âo¦U‚ ÂÒtedÄ8wîÍÞÈ]ÑŶöÐq´Öº†¥œ–‡c‡‡¥Ý£ÚÂ>a—Ä\/˜…±š–-_J3®¼pxÜ^ R$dé×Xrn‹òzÊò’ çÇ”NGy@\¡ ž¢-9eiÒ@à6ÆôˆkÁ¥LO†)Ó™2«Ì‚›t”ÄÊ \/øurV âM¡±ýÍë›4sËÕ ÀŒBЬòúRt—…€‘¶*GL©aÔ‚Ñ cIGq@\!I@Ü8)Ë·5‘ÀÿR54¸]½µÍ%û† |è“Á.Ú“AûK×?±C}ÿ>Ïê^îñÙh•+Ñ·“Î ðûžóÑ m’¶ö %,º. Ã|,HN(Û ËÐK1´ÕÚ*‹kCÈzÇ Æqª†fO¤÷ž_d·=ôÞšûêùaï"}Ø´í¿å¶ÍõeïDö!ÄI_ÊêÙµá.}q‚¹íN²“|—À£Ú9Œ|®‡Âˆ/1 (ÆCص.Á«a3î.é¼>4³2Rµ’à‚ijðµ†R£ÀAXã Uëm¥>Ñê+.ç…ÈÁø%‹B¤Êe…h3.Üc1 !c÷@Û€~ ìæ]9zQWŽÎeÇÏvåì-ò«ÛrTÁŠZ¨ßiµ ëƒ½.W ¨ÔHE¾u_.d“*Ù_ÞáìO¶xY_n˜’®/B.ôå&d—ûréDúNê_àÐlx®W4ZØ´Æ¿¥üýZ­%ÓêÅ]ŽZnóB­öSju¹¤Õ!Ù­N&ÒwÒӱɩXUjÓˆ-ðÿášÍÁöSµs%:P(Ò•vÎ06]?'„\hèLX^ÚÑIGwhé¬Ðõ= Ýó­æd‡Vó2¿¡Õ<á÷ªVs2=}/n ƒ- ³Òj¦ôõÙkeÌ9-ÊuôN¡`×¼“›Ð;KÞ)dy±wJFwôNËtïÒ}KË9B¼“›€Þ,V’Hbâ†þþ[ÎávRÅëË" z"£õ–ó0<]Ë9„\h9O‰¾­åœNÎïä¶$R!a_Ð_¶Ý¿ØNîóæL î[Ö•»áŠº=W „£`¶“âë",æÊš"v’£ÅKu. k´˜PZOEýX6M,½ö/áh0þj“ñˆY1Ð3Ù2Lfuo6Þ†ºÈ2b,ÍIª´nXÉŽã[¾ËaY£éòË„+Ähÿ¯™ÃIûÿÕ›ÂäÏ[Ènñí“—7ø/oÿùÀcõc?®Ý@^ùº–[è8Jˆ Dö¯%¯îz¼lŒôAe™ðkÆ<{òÜ.”Š™Ç[f¦0JN¸]Ð§Ý Z§";à-’¥ öB*’µç=c' "D&#×Ã-sSâ[ûfÃÈí±hï«;/ÉòØŸ‹ÚÿIhÿ5ôYÿÕ}`¤endstream endobj 2700 0 obj << /Type /Page /Contents 2701 0 R /Resources 2699 0 R /MediaBox [0 0 612 792] /Parent 2680 0 R /Annots [ 2703 0 R 2704 0 R 2705 0 R 2706 0 R 2707 0 R 2708 0 R ] >> endobj 2703 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [191.8279 621.1914 224.2619 633.1466] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 2704 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [251.6038 621.1914 263.559 633.1466] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 2705 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 310.959 133.4897 322.9142] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 2706 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [160.8317 310.959 172.7869 322.9142] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 2707 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [332.0799 310.959 364.514 322.9142] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.12) >> >> endobj 2708 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [391.8559 310.959 403.8111 322.9142] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.12) >> >> endobj 2702 0 obj << /D [2700 0 R /XYZ 64.9134 727.2935 null] >> endobj 474 0 obj << /D [2700 0 R /XYZ 64.9134 454.4349 null] >> endobj 478 0 obj << /D [2700 0 R /XYZ 64.9134 107.54 null] >> endobj 2699 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2711 0 obj << /Length 2888 /Filter /FlateDecode >> stream xÚå[ÝsÛ6÷_¡GiîãD_nš4×I§“ägî¡éƒlѶ&2å£è:ùï»ø"A‰"% iâ¹ñŒEQÀrñÃþ°‹ÅòÅÅÙù¿ó‰FZR9¹¸žHŽ4a|¢FyŽÉäbñûTÉYF¥ÆrªfÁOßý6£ùôí¯ožeŒ±é‹¯ålz‘Aƒéë7îî»ß^ÍÈô§×/ÍÍg9Ÿ^¼z?ûãâ—³Wgd‚á´O¤q-Åäêîìg¿ÿ'‹3<ùå #¥Õä®1b:“»3.œ±pguöþì?À,HÌb‘/ÌH)éªÔqÊ™êOÅæª¥—Fåûz¹.¾Ð“F=ñ$£ :cnûlŠâÓG,ðûuõã?g™ búßÛ¢¼*ü—·××›¢ö_Þî;ô NvŒ?Ñi¸Ä^²Q£ÞœœNë[P¬p×÷0#ùt½YZá™®¯ÝgÜlcûWî™ÎïÜíùÆþ°¶B®–óºX¸¾æörf…xaAR]¦;™fFëI4ÍAZg)uQ™G(1]Wîs¾2hÎ7=0JŒ0ÑÌÕ ·‹åH á›Ôë)„"‘ëÜ7qØîÊa"‰o5¿º²ã¯F¹þÝ8m{Ÿ Êe3'njGŸPDŸ>€ðrù&¡ Aåygc#»O@K¬¨oø¸´óqó#(‹G?ðLf§äØ;× Aµöóc:ØydT!Nx3‘ÔJ¾ÓPNß Pi¬¢¼qͦŸî©paÆ·*PÏÈ4GX“¼1èâÓ9ï#…©ö­®æ¥N¹úâ®}s˜º‘-B;ßÊ*9¯|§Öf7}ªIaÊøèÄvt[nœNE Rm…;׆fkû¸œÂ#1#I™S:GŒseårª6wåžy xï®IÌí‡YÆ9oçc{y€[KšÑ´µ ¸_«y½üÓ¬çE@hÏ/ðSØ2¿Ö@gÁî’h%åY;ˆon×fY´–ªö Ì’H>b*zP#KÀfF½“%`Y‘R›u&FçJÛ}¨ª¢ì”D’Pþ7M¨aØ^”¦Y½÷{çI!¢9=džØ6i÷O#(§â¨ òæVõH£ ,E+Ÿ0ÝhÎÈÑÓ]|sjå"æ$mñNgÕ|íŸkXÿµ äoâä“dX¨¸EÖ]2/nÝ" XVÅ€g½9D1ÎÎÍŒƒ§zZ[gfXq=¿ò80áîÔ^ºNÊågweÜæCž²'$¤Œ!.òÀ˜Uˆ i˜Ç ¼1¢àœâèÖ[ƺk¾²´^W3GôEÒ‚QÄr¦w#i-»PšhM»¡´½Ó ¥qì•åúaå/C}Q¹ârš«6*T åZLD~˜6RNé¶cv³öçLÈé¼ZÎ/¶°¢šËÊ'±6§ °92BªMžD£IE“A€Z–ÄŸ—›:l :Tá Óµi~2U‚Ä,ÙCžƒ›Çù–¢Ý¸õÐlI2”ŸÉ¶)†XŽé0IXž#MéÁ¹o7u÷•µ}³T›JŒ/}%!1S¥ê$VŽ/ï0sz=_mzcæ–-ѸRmò†±jøƒu_TwËͦïpC˜"\Ú6?™.A`Iìa ؘf„tÔlÈÒÂì ØcwÞB𢒭<ù8¥’MÅsá׫±£>í%aäøbŒMp4Á±Äþ†…V“Šñ•8Åç:¦£-bótÜËŸh Éø3ˆKËŸ˜CÚ'dP$rˆB±¦û9dñßÎIØ3FIÓißHÑž+Д伫}‡çD)c*Ž%z2›IOô˜9’ŠêáÍQŽ]Ôýn\ZWõür¹²”«gŒŸ•ï‡áç7ü;¶Šyµ¾é¯°ë+UÃÆÝ Aüé³B¼›æDô¸J.73ê‹FoçÕüªÞÝr“óV€• Väy°Fb‹Üµ9SN‰Tí“­¢ë‡²>§}…z°0 s™1lj]ªÿb¦å´°Åà÷¦ºÁÃ×WûOKÙ­qÜŒšbPšKMO]‰Y,²Ž‘4ÇM³³”ücÏžkð!$ºAàˆ¶”PؼÚÆÚîž–R`0Å=é Ç4¤Ò ©®†ñyé¿üÖ¹­!íZ‘)F›òØü ¯0±s%áp¡€¸L~„ÖHÌb‘=æFR×4ë˜[ô²ÕK¯§Î¸‰Y󆇭â}h,‰ o¬Xá=á,&wßÃPÉ_S§¶ðþáÎüÞ¥©\+Sªm]ÍàsäÐ%6ô9¿t» âóR×8¶8¬ìÝýPz™¥kà_ÉpÅ"¨ÍÈ–s ¯Å¸m;°™ÅoÑôV¥¸4ÁÊÆv}pÍa¥bø5/ ñ=áƒõÐÄÔC3Ý5ÜCê¡ Uˆš©ï3õc šWMCpÏ…3á+ÖCÇÚ¤ÊÝ ° ¦;C<¬Ú®é’®Ü.9Po×Qv¸à.¤Ï$™I05W#‰‚ÍÛ¹:Yfa ¿aÊ?K2> âÓò!h0åß´L—òE¤ü;:îIùwüs?C’üLÒ. ">ÌG².à8 —äy¤’ R£Ñ§Ê× Ú0*Ft¤¤%4MWÑI(h‰U<´ž%™®M9˰®¡š%Öuj*íš2ÔAåš*ÔX¹£ŠP“Yç3ñÖùPد¯EöäL±ïþä1L*o=ˆO³´Ä<†ÖéÎ#‰ÇŽ-Ÿvê˜ á¯™8•‚óøX©/oÊMM}jÞ”Ÿ75xþ`½µendstream endobj 2710 0 obj << /Type /Page /Contents 2711 0 R /Resources 2709 0 R /MediaBox [0 0 612 792] /Parent 2680 0 R >> endobj 2712 0 obj << /D [2710 0 R /XYZ 64.9134 727.2935 null] >> endobj 482 0 obj << /D [2710 0 R /XYZ 64.9134 289.355 null] >> endobj 2709 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2715 0 obj << /Length 2192 /Filter /FlateDecode >> stream xÚÝZMs㸽ëWð(UB ¾?N©l²IÕR›ïiw´Ì]³Ê"ŠÎìüû4%Š”Gp•“)h¾nöëðüÝÝæÓ?tf‘Tfw¿e’#CÏÃHkL²»‡Ÿ· ¼Ë ÆxûyG¶][ø½=î~½û!ãœ!¡±Ì°¬ìÝÍ÷wwpFF›T"n¤Èö‡Í6?ÿг‡ Î~Ø`¤ŒÊ¾À5FÌh‘6\€MΘ¿ó´ù¼ùw0˜{‹ylò;ë %3ÎHC§œgEO¤ Sh4…ƒ=ÉùàËSU—§ÞF‘¡RVÏÜé!;ˆ1üaˆ0Mýïo‚Å<6é܉±&_'îì›—ºûDWbïsEDf9|KƹìÇßíŒÜ–ýç{†oùd/Š®<ÎÄ‚Bø°„ùîQA/‡„ĤxSx#·Gd0˜ÇgB8XÑñÅ!"¿`ÿtt™zŠVû©a áz‹kxµDT*1ÅÛ´gBL¡·¸‚b |âS€ÅSUÿ¼ËÛ¿TuWþ^¶_2—s„ W †¤qIú÷ò¸o!Ûª>íºª©gÒ g9e@XÌ.&š¶ì¤<F#F´¹9.Þ`[<‹6Hbp*ŒšäÙç¦ýëž¿ ÷†ØÄ•ÕHd5Cey©m8~Á„Ãß2Ó“÷q…d˜Ó?7L5Ö¾d}©ºÇ]N5Ûv¥½àÛzGõöÞsØQµ½‡›Ê½²u›ßÜ_ˆø¦Ÿ ôyøô¥­lÑïúõ0¥>yÇ@µþº8ö&ûk»¯ 7ó¡oÀ¨J†Û!Ȉ¡ª8ÔŒY‹c£Q²Í»²=¸›@—~ d%Œ,æÂF˜-Z !±ßg&lò“°a rFï«£»znËû‚ýP ÝË÷Eí76TO_ÝûÞÓaˆ t€ò! už•tîªÜÁ¸¶Lq8¢Y. Š a&¬øÞÒ¨mÚÝ0s}Vp=.®`GÔhgøÇ¯tÑ–›‡ÁÖpég\êÙ‚A æšÎS šÕF€°,`\/}AŽ(§tø‚îÃAö¹ÿw'ä¶h«âÞ~¨³JB A\CAŒÑÜæ`0¹â!…Z¬%1S«úØulªcŒ–I¨SšESn-|Áb›< ]I y9[¶íy×D#,àéBj³“pxi>ÌM—Ñ$eFC&*[Ó–3 5Ó„.Örƒ8¬iOR:”å¾?–¾º§C¦Û~RÜ?•îYÊäP} ¶S³u¥ú÷e>D¾$ãÃb|F>Äê¾>Ÿ‘–Áš‚¼™Þb›œ¡¥T†L1ö4°+€aQ4·˜gH² ¿ C|ùŸq‘!v]isa™!68T‰W×ü›÷äÖ*y7¬‘ìºÉ¯<ú%ŒÇ0YÁô‹äˬŠü¿-¤«c:²*êCs(ªóöeG+}€›yå-æ±É^1†06zŠ2ðj~Ç`)Ía圮·¸×$˜QS¸ç­J tM 7¸‚†””tŠ/Þ¿YV-—&—UêöLý Í›k ‘§d¹4AíGŠÀ–â[JS3¬û/mŒà!Ý~ë×´s7Ïn{1üœçD( ±;©ú÷rˆB¥™Ä¨ü£:ve½?oâ\ a§†á7³×[Ìc“3ìå)Œõ Ði±¹–'éâüAZ8— iÊØ O”­÷ë;xqô´ð4ˆÙÁÂõMÝn몺ïê_'§‰áOÕ‚—c2# ÊsÙªãqn“'ìA8‡ßÌ o0,ÎÐrÉ0B&0+Šý¾<úîqo#þõ¬Û ƒˆ"ð`p8—1Ìô¸g±;l‚ìå¾Àd©¶Îm÷Yé{ìSBrÊÕ²öÑ«3bØ·ÿ¸5mWÜWýÁÕí˜åÏIOÎbÿù¯Ÿ ´|kžšßçɿޱÀBNäu›ü»0ÈîëN¹®”_b“—å—0ª§ss¬ì‰ÍU Œ¸Qa« c Êd:&¶¸ À„aqP–D£b^é{‹+)¶¥LO Ÿ¯á)¬¥1·‰– a°¸†ïäà«DÝX‘7a¨VHjNƒ‰ ^–`ü Ó<»N„!öhùjÆ(CWTcwb¢Â0*G=ƒªy!¦uã¬cÿîí#;§h‹ýxqtf>÷"CÿºÒÛ‡ö]m[öï톖4!¶LZb~&N2f°…qÐaìCX¨YËMÞ-ÖŠÎGïÁMœneÀ@8u`@D*`•Ï´|¥¨Fï«!‚Ø•\ÛµöNÓÇ®yÕzS÷¢Ü:™ýñrŒýëƒmÝ²ŠŽ;RĘqƒ:®Eú´ºÐ×øÕÒ¥ ¢Þ«´Cm;tEÚ¡°Î"\¿¹´£Iµ^ö0¬ø'.^'í„)館䂴3»,í¤ éž%ÍhLÅZ¬d4°$Xÿn¥Ø—d|XŒÏȇ8@‹ÒN™NÚ‰M.H;Œß,í¤ ò9" ¾±1j™!Ä0»ÿ?”vbÿS+-Ç4°jÔi'ŒM'íÄ&¤ Êk¥tpƒ´³×K;¸—¥dƒ´³Œ/H;|¯’vÒeêiÞD–aíß2,ƒ£òÝ+;‘7©º÷b€Æ2Gh]× ÃÓé:±É]g ôÛtdQþ(훘ZÙ²!‘RæÊ:1þdíw1&#/¢ \!ëøáédÈ€Ãü&Y'ðQÖYdx Y']ª¼¥¬C8FšéY‡Ø“.úzY‡§“uNT½ªê\8CàµÈ I(V do0,Î(8 Â{/J,ÒHq™ 7¸ÐÖ`tî›§—Cý‰Ížþc‰¨¢}µêdÝüÀMÎEendstream endobj 2714 0 obj << /Type /Page /Contents 2715 0 R /Resources 2713 0 R /MediaBox [0 0 612 792] /Parent 2717 0 R >> endobj 2716 0 obj << /D [2714 0 R /XYZ 64.9134 727.2935 null] >> endobj 486 0 obj << /D [2714 0 R /XYZ 64.9134 702.3869 null] >> endobj 490 0 obj << /D [2714 0 R /XYZ 64.9134 403.7666 null] >> endobj 494 0 obj << /D [2714 0 R /XYZ 64.9134 81.1805 null] >> endobj 2713 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2720 0 obj << /Length 3200 /Filter /FlateDecode >> stream xÚÝ\[sÛ6~÷¯Ð£4 Ü/O;M›í¤“i³ûÔö–[3²äRô¦ù÷=¸´(RŽÙx§35E‡Î9p~ÊëË‹WÿÖ3ƒŒ¤rvùq&92„ñ™biÉìòú÷¹Ò‹ŠJƒå\-*‚1ž¿ÿuAõü—w¿ü¸¨có׿½}·Ðl~YAƒùÛŸýÝ÷¿¾Yùo¿·7¿[h>¿|óañçåOo./È Ã¤{"•ˆ)fË»‹¿.~ÿÏ®/ðì§ Œ”Q³Op3ZÌî.¸`HpÆâÍŇ‹ÿ$ƒU´Xå&_Û‘Rš U¤éLŠ8åÌ tß6«úî1BB ´©íDÃc$ÆPÀÈa`>|~„0Y¬r“‡ …¡Heú(7ëíê#—Hi bŒ§0rƒ¤¤q¹Û<ÜmÿÀ¿v*¥C¬D9ÀÉâ` Y!¹P}À»æ!SHA• Náã@=E¥f½Y×û—‹JP1ÿ×zÛ®nVÍ£àmböHf¯"J #´†+¸K…7øÃj¿l€žkKÎûv½Û†¾9lQ›ð?Œ«Ì2Y#xŒ:ÛQÑ`•[È<Œ–„u>Êà›$˜–ƒ˜,Na+¦{;v|Ø5ß…0¾àáòûø}ˆg>Cf`F4pXS[Ã?0áðwec¹ˆ##0abú¼ .ê¶Hm,¸fµ¿GCÖÀ] Ù·ô`íÁ3Á™=«‚¦óOäж·þF{»²l¾|° Ù¸QlÔÌ[c‡¸ ¶våy€;w ªæW°2©ùÊ‘wV1¢„yâC å}4”Š+áœïº»§TŒ3ÿ°‡žÁ€¾Ü}ô=LÎ# Üu½ß[;;×kéFV·«kßãÓÚ ÑõõÑqÝm«¶‰áªïªÖ]4”m“‘ëæH?.ãXßÚ$ˆ';|ä-^Þ®÷þ÷ÎÕ×ëeÝ`ËzÜ(%¢’’¾w[‡ÏÐVRç&íFön×þÓÎ:UÂÝÍ¿[×;Í Fæ?ïÚп½­ÛQ «$Wz*kâ@¬"íf4‘Ýöza ìâãB0àÞB‚›’fÕ>4Ûšk?+›qŸ‡J˜X ,ÏøèÌÃ…FJh˜£¨TúüU$Y¬r“‡3—à=[ü¤fÞAÛö=ô#,:´Ë–ÞÄ燅‹bÎiå¿t«GÅ™+D¶|i¹ A¨o¬c+×5eÀ™L À<9«„µŠ³Š ©ÊBªºvw×Z{³_5_.§ŠŽÄ—I8 u& EÊ.ZçÆ7Y¬r“‡ñäH(ɺ'[Œ÷»ýÚFc(ÄB"ŒµÈB¬lˆÝLÏð›ÇZ;Eû°ÒVõ2Î2Ф|öÁ†ºß Ô"©žà®Ë7ßïšEXµ†öBº²î¤%;Û ¸wù{Ô–ï‡ÁV¸Œ=Ží1`ô¾?²Ç€Q kµbnÈØtÍå4æš›¥¬/Þ£>§›u}®Úd!5¨ZèYŽæ¼&“#„] Ò’˜þ×Û}[o[X C]Ùç lË4˺œÏ™`±ÊMpF[>ØUÓVÿ‚h„<±œKmvÎÁ¥¡o¹Œ&%3 Lb´™Èh³Žb|iÈè4ûúpÕø ¯ý·!ÑmÁW_mÂ|²ÝÅF[ÿwí«CgæfÕ§C6”btuOG‡Ü?íçûÕ6cœà¬åÙ,ˆ«Üä (…œ‚äïat,°Ë@siC7"Ãü(æã¯È¢3>•P–z“#ü€MgD3°åÂÔü/’ ¦CFÔ1$÷Ð8CbË‚ ÉLŽ1$Çx„!ýÍú0GŠyù«p$ñœŽ.ö8Ê d’OpÄúGé§WEg1Äÿ™Ú…3ŽÁ=Co÷“¶æÃ´ÊÆžK3Zú´£UîÔëÝ]½>,À¨A°‡Êp6±¢Å*79@,Æ`bte"Öðù"3PÝaØn”ƒ-NÁ5\nTîa±s Ô•ºÀhp' ))i_~TlY5>5ËÔg²|s 5UãS7Ö³†}ÑÔ´kÃTã&™ýΕ-×u›NØãcÐléÞÝû³µðñÈë“8-äÃ)µ€»(Í4=­þ^ïÛÕvy¸Šs„íššŸÍÞh±ÊM°—k(¯°~´?ٜʓr~~&K8—¦t6± ä’†ùôƒ}äEäANtvD «ú•{ à–õÏþÎ3²”ZƒÇÒ1#÷Êýª¹[ï÷C!¾ܦYû³©-V¹Éj@>FHi¢F½\®öq ¹²^ÿ|x° Û>)D9ìÉâv.)b˜é>öÈfW±ÈbÎ!½’mšãÅ2¦<ÇûÄäJdu pp˜$%{û÷ àÑ®ië«õÆÑ­]0¼õñóÙþ-(9,ív›Ýÿxo_ÁÇ]àí‘£^t$hHì ²mNÌÀI;‡zLòxö¿_µ‡op’ʦl¥x¸Á`•Yxku0Œ«ôÜ™ä%´`å Fƒí[(MEâà[p­ Ô#¢Àhp ,Rš¾ý+ðWlP°@RBÚ&Èd×ãraä|uç_î‘ù&äÞÐûQ+›ÁRöCY…¥Ÿrû¡8=ß%Ñb•›Ò.D¡&éž<’XÜ.¶RD-N¡äÜ*Ptå`nÙ$T¬¤'£Å)Œ– Bû§åGœ‚KÖRx“Å ¼æ:‚áºx@~$`Ê4XD-N!”`jž>Â|Wù¢öbJ€d„]¨Uä#ý?Æa((ƒ…X¤˜>¿ öªÜà€x#¦`ÝO­FèK$´5¦Ädq$wCqCú(‡åƒa©HAŒÑâF˜b(]¡Ëž®ÐµþüÛ Àendstream endobj 2719 0 obj << /Type /Page /Contents 2720 0 R /Resources 2718 0 R /MediaBox [0 0 612 792] /Parent 2717 0 R /Annots [ 2722 0 R 2723 0 R 2724 0 R 2725 0 R ] >> endobj 2722 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.4399 609.2362 133.8739 621.1914] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.16) >> >> endobj 2723 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.0803 609.2362 174.0355 621.1914] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.16) >> >> endobj 2724 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [484.2515 609.2362 516.6856 621.1914] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.17) >> >> endobj 2725 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 597.2811 99.1185 609.2362] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.17) >> >> endobj 2721 0 obj << /D [2719 0 R /XYZ 64.9134 727.2935 null] >> endobj 498 0 obj << /D [2719 0 R /XYZ 64.9134 405.8172 null] >> endobj 2718 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2728 0 obj << /Length 2296 /Filter /FlateDecode >> stream xÚÕZK“Û6¾ëWè(ULïÇ)•T²[›ÃV¶<9%9h$ÚVeFš¥8ëøßï‚ À!EÊœ²O¢@ ùu£Ÿhüp·øövéˆÓ\/ïÞ,µ$Ž ¹4‚k)[Þí~[Âèº`”ÒÕë5[ÕU¹yÄÿÕiýÇÝÏK)Q–ê% “]üt·`¡Kv¦É5‘N«åöqñßÅoÐånA—?/(1Î,ßã™á¬Z>.¤M)DyX¼^ü§#XDŠEJòÏ g#ÌhljäRtÌžSKx²D‚ž–²åe³Û½d†qC´Ó Ñ7 âÀsŽƒA˜°<þÁLG±HInRhÌo‰¦ÏÎ)ìÆK”š‹Éˆ2RœC©q–«>ÊÍÃ~sú–·O÷jÅÕŸBJÝ,¸[;½*-{‚Ê=ø‡M]žF¶Œc—©Ö „1®øÅ£Ú3ùIN˜’êv™DŠEJrD&Ôn´;ybç$#ÜB£ó¡ŒçPJé7ÌöQ6;÷;Uô›q¼œ B¥¶ùðvgðré[Õ‡{¬a^ÜÀ•ä)΄BKÆÔˆ@_­ ÅÕê›M}|„pÙ¨aÀ’¤³,*v°¤ËÓ¶‚EìÓ¨÷ÇÈIP€ð}T\2 |©œ%‚Yw³LZzEJp(+‰0ÕÍš°ì®0ÎåƒØQœÉ nÅ ÷ÊÎ^«ïÛíû¾k·/£>Ý*Ä‘6\t„(NY;¯!8$Æ‹“0£J¯6þG­åûð°ññàU#ΨáMý£e;ùY5þWeãSÛÅÍø ¸]m÷pµ»ðâý«ç©M*Ppªˆ¢PyH›8Õ:㺬üg„ôæ‰_i¶8‡Q–Ÿf½´GBaL´sȘõG e};øÉNu¬â^Œ%)J:$x¸BÝ’,eDáèYi…u´ÚǸâR£òiù¸êïéÈ©\ù„%á’óV„ûSØŸMØžÿ­½~Uûͽ½åÀ¥:F¤Uv™¢¹ÁŽä ‡†e5s}÷‡S½9ÔPÛÖ¦h…FNgE²äVOÒQ,R’C°BÃp9ô²¶¬ªa”‚Ã!Tá‹ùDêµ1"m׿Óh–S£¡‰Æ!í›Öh_lŸq“Á*Àɦғ,žU:åñJ•ŽK2ªtBrJ¥S°3*M¤ŸQ¥³:i†ÒGR7£ÒÈG(7êãUú±O…ß•1¨†·­¦7öþ¡ ï]ä=´¿ÈnöÀGc K6àf£Š‹”äˆQ TûÔÙ>ÊΨƋCá­(“áFŠspŠCò¤wüàO'm>€‘à >É1Zó>¾ôÌÁ[Õ¤kʧ©_I¸–F¡ä´rÚ5IT”B«OòLǺõ4ƒ*Ûÿ÷•¶à«÷g÷ÕÕǧf~Ùþ½p×9š„›\±{ZB£IETþµ?Õåa;ŒßRåWÆÙ7›n$X$G,WZb(µ}”}?sµ‰d“ñ×½TA»™"MjC(c⊴‡æ,i³ûpÉPváE{õÒ:LˆÙWZHÂL¶P<) ³…¤z*«Çýé4Vß)ßãÉü›$R,R’#VÝr‚±>ÒsŽ;„Ap¤ˆ–šù‘b‘’k\ƒ5ÇôùËýVX*¢‰f˜ï“;'Tk§çmcue›ýún JjºÚ¿3,x6JÅ´aù«|‹4›ˆ:Š3"u™/D”ç,£q¹`…öýá±4ùiófÛn^ :.8%‡-àÊ®ž6o˰ĈøEo ù.3/âÊÁgT† ¶Aµt³mI«UtyϾÐÙÿŽ:ž øÜÎt)>u<”aèø& ÔïÚF¥ÒEƒ§îÖ|0ÒýÕ¿êðbÛ$‚x¸y ÿ³+=’îT¨åõáCoG9Öð,öÇSH©B7âǃ0ŽÝžû¢vsÿÐöýAZûáûÍv ÿϺjÂþ\Æ©¯¼¦—˙Ğ ó…ž;pxaN­š.ª|Kݸv÷^wjÙßlL˜r÷wŠ^ª°RÎrALK««°zâš9ììææ;ìLINvöP^8„èŽÑd?Ÿ˜¿’^1³³’35æ‘’}‰µ”\†1-”Î0zR™l¬u3ó5ÖR’µÆOk¬å“ðç,€=J©´œ.€Q•eÛ£Ê/©æ7Ýœf4y·{¾9’œ¸9ÝM»âæt>”ÝÍé”ñætåãÞ›Á—ruZ¡(RJd¼9Pœ¸8g]qo:ÄîÚô4Äxk:…6mòÖ´c†eCÛœFË9¢CÍ–¢¹3-à)ŠÚlð"Áx±dýýî]˜¾Ð†žH'y6¼Ái¼‚q¢W3âðljZ>x‘à <®á¼G¤yé$‹k„BÄ¥k®œ{ÿî^ûendstream endobj 2727 0 obj << /Type /Page /Contents 2728 0 R /Resources 2726 0 R /MediaBox [0 0 612 792] /Parent 2717 0 R /Annots [ 2730 0 R 2731 0 R 2732 0 R 2733 0 R ] >> endobj 2730 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [450.5103 271.8474 477.9629 283.8026] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.9) >> >> endobj 2731 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [503.6234 271.8474 515.5786 283.8026] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.9) >> >> endobj 2732 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 247.9371 133.4897 259.8922] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 2733 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [160.8317 247.9371 172.7869 259.8922] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 2729 0 obj << /D [2727 0 R /XYZ 64.9134 727.2935 null] >> endobj 502 0 obj << /D [2727 0 R /XYZ 64.9134 702.3869 null] >> endobj 506 0 obj << /D [2727 0 R /XYZ 64.9134 391.4129 null] >> endobj 510 0 obj << /D [2727 0 R /XYZ 64.9134 129.7982 null] >> endobj 2726 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2736 0 obj << /Length 2967 /Filter /FlateDecode >> stream xÚÝ\K“Û6¾Ï¯Ð‘ª5¼§-{ãM9•M¼ñä”ÍA3ñY¥Ç,¥ñÄÿ> ‚‰"5#xËÚJ•EQ@ãC£ûk4Г7×WßýSÏ 2’ÊÙõýLrdã3Å0Ò“ÙõÝï…Æó’Jƒe¡æ%ÁïS]üòÓ/?ÌKÆXñæ·w?Í5+®KhP¼ûÙ½}ÿëÛ9)¾÷ûòõ\óâúí‡ù×?^½½¾"3 ÿ‘~D*7RÌnWWÿ½úý<»»Â³¯0RFÍžà#f´˜­®¸`HpÆü›åÕ‡«¥—XÆ"ߨ™R:0Ui(┳vª‹»»}€š Êhßì_‹Á$ÆPÈašúï{ð:ye,ðæˆ)ÌRtÛ]S-Vû ‘ÐÖ˜|ƒÄ „$ˆ&)ÊUÝ4›æ?Xà›æõ«y)¨(þå_ ?5:‚ØÀz†5 ÅlÎÐb÷ ž+÷¼µv´ƒïMeŸ@ð>Û÷Û |ÓÅm½ØUwî‡'û¾†ö ¤}±ûT¹'©q¢­¤Ò‹n¿7äMÓ°¬aw2Ê5¬%Óp7ÇÃù1ލæÂO¯•4+9çH2ʬº‘‚º_Áu/ÖÊ“ûîtjŸY±Û¸w^5LoíûT^ ûxçd<ÕV'­´O•ëv¨×þY¹Q<‚cú`ÌÊ0ÙÍÔ.ÿ¡6(F†ÞµAnð×÷v™ºñ:\õ¼[¨WöQáÅÒµ¿SUØù/šÅmsëpZÛs 1+刑jùÆÒ×—°ÞÛÖ.KÆiÑÏßjŠ“Âk6+÷«›{ƒÄ2yȽàQAM?òñÌŒ¨í—¥—8…Žc¬S”ŽÍ¾£‡ËœqÄëܺ۶]²Û]½Y»eUVŒ` ^àªxñ°øX¹Ÿ4vŽlŸ[î†Ïz5j$OŸzO°#å†LmÉ)ß&4e™Ö‡`ŒvèåfÛ±^&(->T½MZc],]ûU µó;÷Êó{GqÌÅÚ}¹±ŠhCÄ@ÿž,à›õ"LûÎuðô¯Ûx¶NxÕ¶ :Àïî‡HŸQÄ6ÓŽmd ý¦zâ·ú-ulœ.(uH«ªãr©löBfˆ}Œƒa ŒÊؽÔñR˜·U;ì`ë¡ Ûµ†Ò D†©é‰Ìá[¶Û—ÅÝ7ÀÂ}ì¯8¼ºwqæpxc¦S³Ibì+'q½éÄ>ˆÙ9zhí¶+²Q74‰íܺ³’ȉ2Ø=c·á{ë[ë<²½F@˜>9y¢ýý÷à~õÊrý0Èê}c©‚Ð ÙILÓj#fB+„N6£ Z§éÏs!!¨×‹»‘9Œ%† ®…žE`Λ^8>?jÒ’˜t‚õz»[¬w@–z÷°2 ¼®YÔå܈$–±ÈC°L$)˜e¶òNƒ„Ôa#fS¨µLÂ9(´ëûZ3X,VfÊœ$ R˜—ÐØ3 :“͢GçØ›t<ÉMÚwÉhÒ‘È1“ŽÁN˜t6•~›öáátt¾ÇQ›¶¡Ga1aÓ6#„ÒgStH¸ÝyAÕDñ™{C·™ÞâfYùxÚ$A|*9>)õ’t&dÕÃ>Íÿ<•F>4ªÓÞ‡b¥ÞmV‹úÐy »ÓŠD p¶óx‰e,rÀyƒ,×èeå †"flZ¤|p½Ä)¸°}̨î¡£sÈp$Õùzø8a°ÃƒL;Áךfw’g½Êq SS6K½j‚Œ€K¢&¨‰~0´Ÿ· Ç$ÜQ¬«zòTK:Ä…`øi?»ö-3Áõ=á¸Ó¶Gfˆô`rœ"dc§QµöìëuŠ|ÛŒì‰c§åÉì” nÏNãp;ÅpGØ)ÀžFñõìã‹Ù)½gæ§l¶z)é(—`=AO Zi¸|ÑÎi³ëvBW1þЉÑô:¦m½vŸ›‡¶}Õ}=r†¨¦ŸM¶\bLA=ÑĪþ¬·»j}{ô0.°]Có³×K,c‘ÎË5äjXïM¹æä žKËâ#VY >•2c‚Ç/I™ÿ×nO(—ŸŒ+©w”XK'8ŠožÑQ"‘cŽ’t”âI>M_Нha/u丯p­‘ÑŠ¾äxií\¡^?€<îâü:¾þ?jûÀl¶?:é`ûɬªfUo·C‡MÂֵШýÙÆï%–±Èã{1Œi0þÍãîáq×ÿ³=!›Þó{Bj¾SÒë‡ ”q)@Ý]þû~Ö¸iv‹›zÙÝ#2R|9´gœÞŒüðóo])T{ã²Ü|t_šê.\Jý]¶€(¦ÄBµ¢„cd›S6tÅû{Éùè]µ-@`ZgbØy¾Í‰e,r Nà ©~ä‘j&¥!,#J/q ¥&H*&S”é]uzf뤔ÄV Pq.Ú×s#‹ª½Ò{p+í!ƒ%,ð ¥[=Jšæ@Iòüœ+H,c‘z±(¥2ýÈ#«'$2JÉŒ(½Ä)”Û:¢ìkÑþvd¿ º‘0z6ÀAâ`ʬKï àÃ\Û™Ã3.|8…PÀöˆÑ½…³í#Je¸Óšs6ÈAâdF5b”‰)¥2f'DgDè%N!ä 1 Ò¨l,½sWXO®Ë÷Õö¶½hiÆßgíµ†‰Å€Q*P¬ Vgk ,c‰‹1Â’°~àZaaõl ƒÄ)”L Š¡‚ò%®ÑPŠgÂ0ºòŸ­­¹S®æÅ>øzûóôµ­\Ê4K´/º“¢ÜUM'ÇÛVÇ*7!H0Kȉ’CߣÛvfËñ| Ê}»¹±5³\÷»ð¼„ÔÏ>Áø÷îsåa7¾^¤mèvºðppbíÚ:Ž–µÚn®®‰ré%éCu´ã5®}[Žs¤–•Áz+NŸWËj…ºâIû´¿ÍëŽ×5ì†81éíßý¶\vÐ`ál2 ¥šg?¸W«´àh ºº­C,B‚H‹°‘üí° !rƒ œ3­=Qñ“ Ѝ°'Ƙ|£92eIÉÍxŽL!@”_»¢(F“+!ŸaHˆ“)žV€ºä+ÀˆEŽ`$`Ç 0ò©ôBN}(•‚ °h{1f”þúEE1žl6=:ÇÞ¦ãIžhÓ¾KF›ŽDŽÙt v¦³©ôBnî)¦ö(ˆOØ4QŒ_XQÑ)×öñüs]Ûë´÷¡X©×ö¡m¾kûXäȵ}‚òÔkû|põý\mŸÀ=~mŸ `¸¶Ç®í|Ï**Êg©BMĦýöoéF©‰†(ëÿߊŠbäb§qµvJô:ÁN¡m>vŠEްS‚òTvÊ7°Ó\ÏN Üãì” ``§q||Ï,*Êg«’)ƒ¥à'©‘¡R|óUEñtreã*ê¹&ÖÑt¹Dhž¯\"9R.‘}Y]Q>=_ŠŸŠŒ–i³½åŠê (,Š'”ÍSF•Ô{J¬¥<Å7Ïè)‘È1OI€¾´°(Ÿ¦¿f9…E)ìö–SØûEºSˆoªœ‚O–SÜ>6MµÞÖSh$픬c¢3”StËHâÀ•” H †ªRÐöÿ`7g‘Â1P…°´"3Ô4uÒÊ^ÜÐíÛ^µÒ빿'>×}‹î/L{Òendstream endobj 2735 0 obj << /Type /Page /Contents 2736 0 R /Resources 2734 0 R /MediaBox [0 0 612 792] /Parent 2717 0 R /Annots [ 2738 0 R 2739 0 R ] >> endobj 2738 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [326.229 653.0718 358.663 665.027] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.23) >> >> endobj 2739 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [384.675 653.0718 396.6302 665.027] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.23) >> >> endobj 2737 0 obj << /D [2735 0 R /XYZ 64.9134 727.2935 null] >> endobj 514 0 obj << /D [2735 0 R /XYZ 64.9134 425.5894 null] >> endobj 518 0 obj << /D [2735 0 R /XYZ 64.9134 93.175 null] >> endobj 2734 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2742 0 obj << /Length 2721 /Filter /FlateDecode >> stream xÚÕ[Isܸ¾ëWô±»Æ„±/GOe’š©r2)+§™9ÐjÊfEêVØT<ú÷yØH°$e NÙ5‚Þ‚·àñÇë«×ÕƒŒ¤rs}»‘ÂøF1Œ´Æds½ÿm«Á»Š`Œ·ïvdÛwM}ÿoO»?®ÙpÎÐXn°›¬‰½úéúŠÀÞ‘&•ˆ)67÷Wÿ¹úí¼Ù_áÍ/W)£6Ÿà#f´ØÜ_q49cqäîêÝÕ?‚U¤X¥$´k¡$³i(â”3‡ï/Í馃U´v}{— bõ‡Æ?¢X|ã¦b˜!®‰‘+…ð†Vöö!šg:#H ‘½ÍH­£>¬’ÿŽ ‡ßÆ›+ÐfÛOmÿÑ¿åxhüÐñÖôÃh<Êtš™p6´«4£ÛŸ{ã¦>ø©ïw ®m˜¾žC³÷7=G­9Âè‡Üª)5‘& Ä¿øLՀ¸(…DBhýbU(V)ÉKUãRZ‹eã›-ʇîøÐtýÓkz)¥Šc‚(3&ÊžºGœB9ݸM©bŒyMÎüÊxmbŒmîsη×ÛS˜Ð5{ËK§•ußøQ—o»¦r¯øÓk­å~_¿¿óÒ±â‹ß×7;ß¿û.\´V>  ’Û+ýþúSМ]ð9O ±BÌnïÏRâ 2rÂ#giùç0Ð —ñ‰9¯"Œ@Lk’—¸éi#6ÂhdWnÕﵜ ›q¤0ÊÅpˆæ`%6Õy¦×þîwBnkç£@6A‚‡c:‰y£é»H¨¾¯zwaG.Ì\ì6BoÂÊ 0k Y¥4s[±BZ3e×þx_·‡s˜ŒÂ¦HÂÚ—Zñ@±JI^¢Ž"Œž¢l¢;=¥îtê ¢Œ×PJŒ¦bвzhbÀ7‘ ¤u0Mkd€‰séæ_ïŒÜ6.ˆ~éÞéž2ƒò- ”`Œ†ˆ1'8,íúÔ† Ȫ/‘‘ŠUJ2—‘D„éôÁqë “)‡2R\Cɹ­è)J+8»uý‡K!ZÕ¤$Üâ \jóHÁÕ.x·s„”" j[` ¸† D4¸ì ¾ú®­OÁüP÷Ç$Ñ>3 ‰•JGµþòMÆ´M²诶+|)K½*%xÉ ɪ‚Lh˜µ`DÂ\H‹A(®€$ÀnpÂdŠ2ZÁ»c÷&HïÚeª$8Âc^óøÉ¾rY~ÝÇZ“bÛÈ-økÈ#ŸüÌ0TŸ\hvtcλµðüÞÞä¡Na¯<ÿ*Å5ݽt1ü:mËn™œ %¢]Õå2(Ø%Ñ"Oñ:"öÁåÝ£ ]Ù†cP:ÎÈ´lsÌUk…׫ÍZNf^Ï¥šM"^º­áLÇ_µ9¶B;¬¯oþìç^Aø#ƒÓàˆá}{¨»§l+µŽò®ÒÛ,Epõ\ÐHñøÐ^ó5Š™êñQŒ|åß+t«ð¤ò‹ìBÃlvxébÙÊ^ûhêàKÁ1s)é´&s<ØÒÈS(‰Ä‚–Í;\QäcíŠ"¡48L‚—cÂD˜BM$Ѭ£ì_]ååÁý …—»«ÇêOë‹cö¶¯ÚÄ ææ¬¤P-âo¤ÀwÌ,IÁÌÒfJ±•Ì’AìËd8®˜1u0NϳË!†4rHˆ5³9aЦTN¸¼Â!'œ,±=œúúзut“ÔPB|¯YòÈ‹SÃH±JIfRCi #œ€u©álXŽ¥ßI­„Q<1zE£!´ÂXòïñrNÐÓèÅŽ.ñ™)¨Ñ É%NÁ®ht1–~/ ¹¶Åe†HC ª>[£ TaD›Ö™·û\¬0kÉÊŠYÇ"·FëHÙµRæ–«¦$j€”g5À ¸lC´]n¤¸×@ÂÃŒšÂµ O&ÑÉÛt1Eø*6ƒ¾ç£‹OÌÙ4…LV ÅVlCoÌg‡]_½¨ïcê.÷Ãô¬=æYÃO—ÿ2ŽŽ†¿ÌÒÑðž®Ù}˜ZÐìGŠKVŸ@|¶Ñ—Â:Úü"ÖÁ䬗N›Û “êbè"½epœ0{Z@'àÒ²™µ¥Åý¨œ~~'1UÄžÃäö#ª2Ó/ÚŽ}Ø`ÜÖr:º|ÿ¦ ­½¯|w­0;$ë.×Û&ü;SJö—d9¥‹e ûË„GÍŸí©o7!- ûè0ýņ)V)ÉŒårÆú hþ,~ÕNŠñù{ñÛÀ=lø˜{霙Hf4…ãì› ±?¿þG¢Éʻծ¶%Ü¡"õ±mFõHaÿ4)z¹n¸01S¯ Ägªù©kކ›·œdÅ<ó9Óf,'eÛCÓÝ·§S.[µ‡!†&ó_l:‘b•’̘è›a„L‘¦sÜ··OÁt>ÓŽŠqýkÕSîN™ÙòY=¥ ORùoé¬^¾è¬žH )Š(xTŸP\8©³žqP_ âpN¿ 1Ó§Z3Á§)b˜Ðrø"Á|Z Î Ÿà«ÝÈLÅHXúÿj# DÀÆ#hÁ6‚”äBÁ0ímåPm+(cÁeN³$lÜöœr#Å5ˆà´&r Ñ+×R¯lLª$ÞHp.å°›(J§p3öˉ Ê| ¸†Pð€©M|^¯ƒ×kÁ¾f¯ƒ²1”ÅZzóqÒ3Jáûm)Äœ‘2žLêrø"Á|Ìö‹ ¼Ñ@“6Œ7q0Óˆa7LHpÈR'×öËØÅpþ)—Âc>œa£QŠË‰o ¸Ì{â„¡þdº À½(͇žƒ!kášdú½¿1Iæí€ÿ¾EÓ¡åÄ×mtågDߊÂv­(öw®¢*…xF' ;Q,A׉b/b'Jø7Ûp" Â*x3Ç'ÐL Žk¬~8z‡‘°û Ú×Vl€;~ðwöZH¢Œ–*êO<;[ýH†ÄI¯2d@ 9V Zh`ûeBÙ¶ŒyÀH°J(æêˆ4‹™á½îƒ·ã¾Yk&Z]dׄüLB2·áû³:Hh¦ÓÆ Ûë´©8‘„}ÆGòò{£ÐuóEM'ÿº[Ò`endstream endobj 2741 0 obj << /Type /Page /Contents 2742 0 R /Resources 2740 0 R /MediaBox [0 0 612 792] /Parent 2717 0 R /Annots [ 2744 0 R 2745 0 R 2746 0 R 2747 0 R 2748 0 R 2749 0 R 2750 0 R 2751 0 R ] >> endobj 2744 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [446.5363 665.027 473.989 676.9822] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.9) >> >> endobj 2745 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [503.6234 665.027 515.5786 676.9822] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.9) >> >> endobj 2746 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 641.1167 133.4897 653.0718] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 2747 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [160.8317 641.1167 172.7869 653.0718] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.10) >> >> endobj 2748 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [331.5078 391.4571 358.9605 403.4123] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 2749 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.2772 391.4571 398.2324 403.4123] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 2750 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 44.5623 128.5084 56.5174] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 2751 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.8503 44.5623 167.8055 56.5174] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 2743 0 obj << /D [2741 0 R /XYZ 64.9134 727.2935 null] >> endobj 522 0 obj << /D [2741 0 R /XYZ 64.9134 522.9778 null] >> endobj 526 0 obj << /D [2741 0 R /XYZ 64.9134 188.0381 null] >> endobj 2740 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2754 0 obj << /Length 3028 /Filter /FlateDecode >> stream xÚÝZÝsÛ6÷_¡Gj!ø&𘤹^:6—¸Omh‰v8•DŸD×—ÿþvñA‚MÚ5s“ÜxÆ"A`ñÛÅîbw×—/ÿa–XÍõâòz¡%±LÈE.(1†²Ååæ·ÌðåŠkKu–/WŒRš½ÿ°ä&ûå§_~X®„Ùë_ßý´4"»\A‡ìÝϾõý‡·K–}ÿî 6¾Z™]¾ý¸üãòÇ‹·—lAáu3rM¤Õj±Þ]üûâ·?èbsA?^P’Û|qÏ”kÔbw!• J [¶/þÕ¤‹—DQÃÎI¹îž³–÷i¹–3ZŒ«˜–GVxŒ#ú¤V‘ÑH’P!É׸œ'+3ÂU mÑÌ·ëÃ+\±€M.9Î}ª#J]f…þ_K¥³âPW°ÛòTìÜ2"2‹ÍólINpÈmN °Ög±Ú›bßTESÕûS´Bƒr‘ yÄÒ Â„áà »j)®R’ç`…¶DsÎú`Ëá>œ‚T̪`ÆùDŠÚɤ‘†±ói4›S£óœèÜê 6ð 5w|µŽëÜ×i!IN¹}¦N'xfÓéQ;N™|¤NÇ!3êtBrL§S°:=›H¿ NÏꥵ"‚+;¡ÓÚ@®¦tZ –§: {龬šOåÁ¿þçTÁ}Çz¨Ó¶Úà«ÊJÜ]ëëÐe=¤ja$LÍf£‚ê #•Ô¦ÞÕ¹EpKLΩ>Û""ÅUJrÀ"„ ”ZÓGé,âwªh â=Åj 0aTΈ5RœÂj1Òä}¬~á_,WŠ« ˆ€œ=lϳi±g.€5*ž€.ŽxО%#”ålž•&J™§G]{0Xg‰<»†«ð_ƒ]Ã'0mg×ðÍÛuì$²#o‘P±[5î[vžŽwÐ.ÀuZ¿çT`[LJM?áÿy"MLT¦é§B2ýØwFÓOHŽ™~в5ýcs(‹Ý\ ;-erF¸‘â\k‰õàžoÜ’QØãÍ|#Á |’ ’cHÑÃçT38'´ªq×4›¦~+¡7DkxwM‚“àìŸê˜ê&8çbŽ5¤ó&[CXêü Æ‚g÷÷ ½÷þ·¾uýËð:lŸI˜™-ÄPçg: •ÿ©ŽM¹_ŸåB*¢p`èül»ôVÁ«•Òjzû.æÑÖ1›|¿ë`š oÜ:¸{«ÅÓË%{¯þõ]s Ê×<°?¬ð ¾Ù~”çNáS¦oËî:‡2M…E4žô¶ÖGŠ«”ä€ÞƒºXÁXi«ù»zS]šÿD3˜Mêó›Aª» žX’‡³b«‚½ŸÂÆé„ó~‰ÊxhŠ«jë_ÝÁóï” ü´ámƒŸ\ÉöA—ºlºç)ÐÆwï¥?ØÐ| C¼ÐÝÉf1–¯À0+@¨¹í—`°¢#%Vg]©gÈ£)Z‹T)(1‹[,ñ4/ÛRæ±|×µø åÉ\X ¤6ÎÕŠÿ|B°>ÅTã„õ¾ ×ø«¼D{`ŠC¼Aüšqï‘Ào/¨ä[:l«A"ŠáWâÈÎb¬oÆy®¶õúÏÊ<%ÊŠ8W¿$È-É9BªoËýK9@Q‘N.»sª»^yµ˜1¤‹©Ú8×ߨ½4Ø‹T*»-nPàþåM!Á­4ß¶ù jxB¼ FîŠ%XÐgß¹ÆJÀ6¼\9Û ÝPœY -à×âí ý`oŒå¾B*7¡›œ’oÚoz€(Ëø¯ D,цqLr,é¥ñùò§;@;ú€öS„þÂ¥OᮺαH‘ŽGfêî«u”…KúªæpØo Òy‹ðl ¥ôÀí¡sáMþ•æÐB)B­Pã9´P†èxéã ^9HÑÌ•1sØfÌ=w<Û™ïx6%9r<Û;~<;ŸH¿‘+Br’ ;q<+ Y\«Éý‘ˆgÞ:H!֣ͦlvjòùHµŽCfTë„ä˜Z§`'Ôz6‘~#§”8—X0WkÌûrnþžZÏpT Tr7>°‰Sõâš6:÷qŒÎ‘BC„?bR‰8æ:´qgR©Œ'-Û¾óZ¦$G-{(ÛºêUªýSAÛŸqKq±d ²^š÷ïêMùPr8ìüâ}¥Gƒóûn%aœOÜ\«–ÿ—Röç²ÿq‘vöŸÈtÊüC×­¿£8fü ÄÇ^X˜ k{_ak¼®b}ø¶Â\èÚË £àÚ» )¸']U˜O?¿‘ÃXnˆÌL$’Ü("b.ÿ5_VHÙ™+dQë_z2š¾®ÐvŸïÂBJräÊBèß»´0Ÿœ¿äi-¢ùøY-׌(ròÿÑY-3­4Âa-ìRèpX‹ƒÿŒëìM¯.D,hK¹Â,ãÿoõsmÅÎWÖ‡…“£Æœ0æ§Â™ÍÞí‘ûæÂïæ.â¾ÝRó¨ßÔ"˜*B¤<ë‡ t ²8úöb»­qÜ}÷©ôí]óà°ZûÇ5LWmüîïQûÆ ¨éXì~¯øƒt+—Å¡X·õQ¹­âìT>ø!.Š*Öá!~99Ÿ¨ƒnÁ-8¬E;(Xîðë›®F¶k‡ååÑUgÿô½®–Üb½5ŽìùÒXÆÅŽMí;u5Ù]å¿Çú.s'Âdü‚¸š³Ëç ïµ«‘îzOŒSôœÐÆçûj»õÝ6ˆk,õžÕŠCñ<À†P¥mN¥B³Æß·yÐh8A‡Ÿzè KÆVÝØÏ¾Å)ÁÆ·^ùÇ Þû¦NkCŸkg葬ÿÁÙÝéÖ!t‚LYnÁèWZäÙ›O^É"þûCÕÀ1$WͶ~½€ŒW¬}« úœÇv`dq(ýƒX'Ç ~p¸©hfŸÊŽœ¸ØCYÆs€Vâ‡0µÛÐ[ uK›â4Y06·ŠÛúØž€8ѩ첣5`S®(Qm›U…³H5zŠâç‘ ’¥ã`}¨ÂiÃÆ·G"ª c$ˆ¯ì<¡ûšú,™ð}ûnK!Ø4’Á37”b˜40ËÐÒWfÔ[h™˜ZwÂuªHÎ+Ü""$îÃy1ü—ãÜY$ÏþY£[»w†™˜ç ß;5Xæ\’¸í  ÿ3¤¨6N}’FÒ?Ê\ƒ>áv"‰5åxxUW-Ò[G޽ëhK¯A2Y~™¨ê\%ˆ'Ù‚“‘ÎñɰŸú.ns…ïs¶×¾ðzâè*H³+ê…•(žo¿øð“¶çÎé€=kwkÉånýÂR Çwþ#ìp7ÛÀ=¼…Ec}yr³õ¸ð)’<±héiYÐ)¿í{›<'|ƒ8H½Ýù,â`Tºm—<ÄÀÿ¬˜¤Gendstream endobj 2753 0 obj << /Type /Page /Contents 2754 0 R /Resources 2752 0 R /MediaBox [0 0 612 792] /Parent 2717 0 R /Annots [ 2756 0 R 2757 0 R 2758 0 R 2759 0 R ] >> endobj 2756 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.3703 412.7772 112.823 424.7324] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 2757 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [142.3572 412.7772 154.3124 424.7324] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 2758 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.4159 49.884 447.1198 61.8392] /Subtype /Link /A << /S /GoTo /D (subsection.7.15) >> >> endobj 2759 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [474.4618 49.884 491.3983 61.8392] /Subtype /Link /A << /S /GoTo /D (subsection.7.15) >> >> endobj 2755 0 obj << /D [2753 0 R /XYZ 64.9134 727.2935 null] >> endobj 530 0 obj << /D [2753 0 R /XYZ 64.9134 556.2531 null] >> endobj 534 0 obj << /D [2753 0 R /XYZ 64.9134 221.7119 null] >> endobj 538 0 obj << /D [2753 0 R /XYZ 64.9134 191.312 null] >> endobj 2752 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2762 0 obj << /Length 3492 /Filter /FlateDecode >> stream xÚí\K7¾Ï¯ÐQÂF ßcâõ.Ã"‹8§$Y£Ø4£YIŽ“¿UÝM6Ùb“š ƒõ –FbúX¬¯ÈâëÛww_ÿÃ.qšëÅ»_ZÇ„\A‰µ”-ÞÝÿ´4„±ÕšQJ—oŽçËæqÅíò²Z !–—ÝéßÉåùrÚmÎðÓÎ.­Xýòî»»·ïîØ‚Â?6‚sM¤Ój±}¸ûÏÝO¿ÐÅý]|wG‰qfñÞS"œU‹‡;©QRÿÉáÀµG\Çßb¥8ËÔJ;N$—"ÔŠ@µ–yÂí§•aœ#èUm:Æ}u˜sª#–û¿'• ˆë²¯MÌAÛuMª³|út¹"©°–Ê6$ék$5%\ML¾¹®(ZF,miưFЂSHÆS†½í]"v" °’ÛÁ%¾Ê8!”2Yð®´œ”í*+µåÊ "¹Ág¸UÐrÌ5$ék$­h:i’íÇÍé<%)˜"eT;’±BR0 Iy¦ß˜‚ß@+J¢(CçeÄ)Åoˆ:–©ku"ÈRÔñÅnˆ:ÍHŽQ§LÒG˜ãöx¿;_‡P«²!GXãèàyÃtJ²à@ÐD¨øá5¶”ª{âÝÊéåî{°§[ðÍæÒ×t*,uTk@2„ açÝ üOh¾àÄ:j_n”p#flÂP†?<ï\ 'nÑ›qôˆ5’R¢àmJ2Û§iEœ¦!GXã¨ebÇÞ·~¦Šþ Ù~µZ+®–ëð1Cþ0†r„;ŒÒÕ ä½„Sâ„Ò ½$B,y‰/vƒ—4ã8zI™dð’˜d¶ƒ(@8•¬!IX#i$.R’‘Ÿ ßÍÆöW£- 1P¦ç€XáÌ5ÄW.\Êù°?_æšwT<Ç£©%ÎRÕУ#Ä’Gûb7xt3Ž£G—IŽIæ{ÕàÑÍHŽ]&<:&ùÁ—þƒ‹¯ò煟þx<ïú·÷›Ë³9í†I¼Ãw[œÙƒH (›-Â@…ÎýWÇ_s™d®s˜Þ>ß Þ•Úûk&FH66};ˆ.·K^€YLƒ¡õ(ù± y_êÉ·¢I¾Èq”|L2?ö”Fû¦¡b¤tD è’£æß Ý[DÏ1’áÞ­öè¦N.;eíöpbø|û˜q8½’â¢0W' „)ÊT;ÄŠ Ã'Z8sƒ« IÖÐÓ<`"Œ¶ÄÅ”b®oNF5oHÑ#Ö8:Èg¥”9?óó,±?IEŒ¡>’í~ïÂßîéÒ»Uï7Ã]í¢´°@òjæ.WýšÉ.^:ˆ—˾·H£oÿ ¸2nŒóbÖRZßx¥Oâ/L1SŠ¿8N¡gº=þÊ®TÃ!WŒ8C©zümFqŒ¿eŽ!þ&$ó™’–íH†ø[!éãoB2Š¿H÷ Š¿Í 4Æß²Bü­»š—í8úø[¡èãoB±ÛQ ñ·ÂÑÇߌŸ½ºøÛý…Ãu³¼ 8¾ï¼=™˜•Î/¾ñ1à–Èœ&д[VœŒŒß"ÇÓñ´r›Ü2»„€`-D­Z«ì"æö²êÈJ}!r«1”ľüñ´»^ú„øÍhTòåKŸâ:†Ì(šCJ*!ÙK8îNà‡Øqü†E«fûޏÐEŠëYíÌŒþˤ3Ï~¡>Ï»¤¾âò´Ñ¥Œ²nÀš8üÕ{'ß¼ÇeÁ‚“dšùx©~£‹ÇÜwŠ.ûŸL|]ÃàЊè‘ûºG\Ç_×0Þ䊲¯Ï»s+ƒþ%Þì»ÛÙù'æ¼$Üp^qg'Z&‹ Šë7§dÝ·7'pƒO…úy4ºñSã‡T©Ÿóêgëð«G|åýÌØa÷нCLßm ÑÌ«ëí5ß¾S¶R§ÃŽÏ÷ýüYÿ£R–±U_ÖP£.Ë-5 3jªu9<ÑP–#bI•Ó²(Û™óµ¨Ò@-dY•òi}sqtúYF²ŒÌÚL–Ŧ ²LÚê6]†GÚ 3†,(3![‘f3“¾’áŸÐŒhê*)и2¬…=gü÷è×~PŠÔžr¹f­]îÓ/$MTÚ+Rd§F)DÕh5r,›f”Bl›bvJ¶ËŽbÈBv”p ÙQ´ó Û´˜µ3ðk†t„Ïmü ºPwÒêç$ËÂð=¾®çvzà\BúXÜáÍ*e¬W3¡”L5ê$¶UY'¾dCD%ăN¢­%]—…Òʾ¯E'BG¹¨ERpëž?¶ûß ¥¯˜lª”³$•ØZe©ø’ ¥A–¤sÌJ[¹,•fþ ó Ù2b`<'Æ}m6'n¡¡üúÉ0øÙ: <ìfSE‰–Bͧ"–(R•q¡“Wf §RTVqÅútJd´‹{€"íö{a™éO$©Ñ4ùçÍS ûmAù ”Ađś¥HÓVœqÜŽeû’ EA–Ds "ûR%¿-«¸™‰_ÉlîSå6Z5ɪ˜ b¹–_”Šoéw_ªbv£Š“ì‡EÐÝ/Ì 96z+!_5äŒã¦, Ù—l(ä²$ä˜còþ {›ŒÛøµÈXC£\QÆÜàö™a©åuË8(nå'4»Z|ðz~ßoÙ-tÍÉҵߛÐÀ±»èÜÓo#¾ŸŸ»Œ­ßLÏÓÍë9iÓÓîé´;ï/ùÉKƒG Àòá™»i:Äu ™ßNcAµ)Ûë.zÊ…1oÇ8 VKe5 ¬„1î4+ǾÑì—wÒ`¡Œå˸ÄPÓGáïW‚Cwwټ߆ÞS°å×Â*ùç¿~ìEô=NŒÇÃêÆiwÚ݆SµðšÛŸCÑË7̤—Jˆê¥ÛîÈŸn x¨Üê³ÐÙàQæo ôˆë2w¾[¥µy~ƒ¥æDHÍ’ôˆ5’ZAø‘2%™¿Vb8ÝŽc8ß]áèÏw'‡}oìO]0ì+ø çX»êÄJu¹¶±@Ôu¿á oèܱFÒYðtâÜù›%¸"ZІÎ+$1?4ÚʆŽ­ÑR3›Ž-*¡ÇP¿”· =d)ôøb7„žf$ÇÐS&BOL2¿·Ûq}˜iHÒ#ÖH‚$eK\h×zH dšÞ-‘w0¦‰r"$Roh±/¿C\Çù}ùFÀ )+³H†¾ØŒ¤G¬‘”ŽhLé’پ͟‰nÇ1œ²®pô§¬ŽÑ)ësØ¡›~iág!ÝmF8 VsňÜ¥„™CઠIlÇÐ#ÖB\QÊÉI³ö›s|“ôsÂÉ[ÂxP¥BÛ–*‹ K*óÅnPY3’£ÊÊ$ƒÊb’3×sh"ñn­v$=b$&u8½¬Ë ò+ Yl3¾°B—+°½<¥›™Û³–=b!t‡Æ:“2œŠÌRxÀ™çˆÌ9B-Ó 5!$æKÕÖŒaX™¡×WÌpæ®A Íu•zqÅ oÖV+²AZE®AY1ׂ°š± º*Óó²Šé%ªº>ͤˆ5Z¤ÃÅ?sHV—Ží #RrRóò[R<Þ:¼6ƒ“Ä H.}¡yQrÀc0*oÅ/– 2¤ È1ÃüM þV€VÇKŠÃÁQ“?Oßä¡jÓ¥"šéN Âÿ’¹þ`¾Ù&×Öv_uuà;K†ät¹9û;9ü&˜M?Õ~eí°ußè«Ë?ðÃ^¢xo!#R™ÉÔ~§\*ű•ü H¬ôÜ]¢p–[ƒ­(ƒ$ÛGpeáÓd÷ö°ê0|Ä–§Î ým"by|ꬴV9ü­%W½ *]ˆj`Ì«ŒÀßÎòWzÀu„˜ \`%hð»ó'|)‡€%]3†°ÌPP`ÈKfør]oÇoÀ«Ðù) ½âÙ^¦…_.CIŸ;Úv±¾ó¡~æœ-ÙWà üæÃ°’m9j?{m` 5½6¦Ø5€Èðµf=È7ß1 eêýB#rc·Pbz…ˆ^>ë+nl3z¯LOI¢µŽÙÝØ#PëcÎf{dÏ> ?ø7‡ÍéðGïk¿Öv> endobj 2764 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [412.0062 42.4954 439.4589 54.4505] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.1) >> >> endobj 2765 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [466.8008 42.4954 478.756 54.4505] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.1) >> >> endobj 2763 0 obj << /D [2761 0 R /XYZ 64.9134 727.2935 null] >> endobj 542 0 obj << /D [2761 0 R /XYZ 64.9134 702.3869 null] >> endobj 546 0 obj << /D [2761 0 R /XYZ 64.9134 204.4986 null] >> endobj 2760 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2769 0 obj << /Length 3198 /Filter /FlateDecode >> stream xÚÕœ]o·†ïý+t)ád~\$§9EŠ¢ÍiÜ«¶ЬÔdËG’›æßwÈ%¹¤–âÊ5¤ËZîì³Üw†CrÖ¯¯¯^þWÏ 2’ÊÙõÇ™äÈÆgŠa¤5&³ë›_æš/:* –sµèÆxþî§Õó¿ÿñÛEÇ›¿þùí÷ Íæ×4˜¿ý¡ÿöÝOodþÍÛÿØ/_-4Ÿ_¿y¿øíú»«7×Wd†á®H%âFŠÙêîêÿW¿ü†g7WxöÝFʨÙ'øŒ3ZÌ`HpÆÂ7Û«÷Wÿ‹»`±KM¾¶wJiáV¥¡ˆSÎÜ­®¶»ÃúÑÔÐr„è0zFb F†Ó4ü~B v©Å1¡áH3lrÂÍýÃãñ”P°H0m‡-N0Ê‘â`:ïÆÝÍú0‚ ªtCÈ`q Rp$¥ÌÇýzy÷+øýnÿ ~ |âa Âî„åêx°Âæóƒô´}>l—ûíç^õá×ݾÿ¼ìÛ¯¬·Ü.÷`aí¬ì™;ð+=¿Ö}Ãíæpì»K÷ý!2_Þ¡žŽ’:@€D”œu”š1w oìiûýÿpÎÝ$œI$¿ä$îVx(2BÐó¶úó0ØòÃçD ‰Ž·ë<øx•Ã!úvÝ»Ï"T!ÜtG÷aß9k§šÐ7ž!º½‹ÛÍòpÞÂÍ?¯3ï9ß›ƒë¤Ýy³»[nÆ>C ÒŠ$]ÿlŸ »ÔdÁgCS:Ÿ±#R?6p 8$&¼!n°8…k  ò° wìßœ`º`08ÁÇ CJJšó9Q¾Xt‚Šy:Æ—#R~‘pôX,á’’MD$è}’þ[iç3™¥‹-‡>×YÁàåË=H矆°å[ß÷?w®ýÚÿZvˆ!À$·Ól„®vÑfÒ>Zÿ Üú~5Ê%HØScóg»n°Ø¥& ®Ë5RëÐ<Ò\ì$Íúùâ'æ`Ä@OVýD€”2ôé‰è}ï»Çã8Áã¹äÿ¬ð=Ÿj)üÔfEøÙM?¬÷w›Ã¡”— ;ƒ§Iûg+?XìR“åƒ\ #$'ÊwS}/ü§yA»Nÿ‚É+o˜¼ ÈðµfÓ1¡Ì®…ü»Ó1ãAð|³¶.õg|x´CFä¦YÖaè ãNtŸáC-=îòûÎ͵ì¼Ý›zNtÞ'“Þj•ðÖŸÀà“é#˜ÈycÛv9oj²’óf”Ñ]ŸÂBKñn,NÁjƒ°:éÑrÂ)A0••í £Å Hn¥Lå e!-g1JoG,N2 `ñœðI‰y;wjmó ®šd‹¤°Ö,¸A’ø’w ;òïË›­Kƒ FæŸÇQ3Y°ç}ûÃÏ~}݆¸Ýv÷{ÿëÃ~}cSi·´i¶Ë"Jˆ`AÀ¤_ÞW¡mË}ÛìÂXË„ñ{÷°¾¯=ƒ£ÙŒkk”7Xzö»ÄbaQ—e&E¼®„Dª°<.)b¦‡ÍƒÁ D ¢×œgˆËãnBÇ0¶´ ' œ®ˆÌû(÷’”à ÒŸ^ / zËb"*r¡üœ°Õ­Fƒõ[¥’Á<ˆ] jR„Êv„Áà¡Ñp› qu»ÜÆc¸@’ávzŽ넌Â\RjÞN.ðô 4J¢ól¬g”@ÚhÝ2Ð$&k‘&4»$Ô4£bM2›”²¼g(P !ƒÅ)HpŽ!SÍ +êlçs 0} œ wÆõÂÈùÚMìÄy‡¼±Ä G2XJˈ ì¼À@ ’)n¡Á M°×% =B8XÑxÙŠ¶¸D‚´$ 'mÖ"ɋØ bNÚƒ€Šƒ4(ˇýÝ.~$ý PC—Sh>s‚$CR±–šH,ÖDš]¢Šfƒ,ê”Q)eqÄ"J"Îlpj,NA*ƒ„²£y Y‡AJØÁúbq`ûV Å‘X¬‰#4»DÍ qÔ)£8RÊòpÅÑ rG2Š#…<+ŽÑØOB Có±å›õaå¶[ÝèöêO®|2§+éKÃ=HÊgL(;&Ïî•`°K-Ž;@b,‡ëV䪄š1uGuÈXw”Q%,5ªa?F‹SŒàšäŒIÝщ¸Ò9?.æÝvCmó+&<¬e–2HæÒŸó>.Vå–Œ• yßêÓÆî¼ÁÔÃØÆºJ¾~ÑÓ~ùé¶_Z jîÛÛÕ[{dy8 µLnï¦oíí¹–ý÷÷ëO~!Fk³‰<Ò‚ÊÀmÜVW@ðç±ë÷ClQS,†‚‰Šœ¿ÚnûVž ¹«P¹`—„9€ì7Ç£ÛI´wþ§»!ßb¼áâÚ,íõìñÕn»]¯ú¹ñÇîÝ9Üf€ùЯG÷¿ôÄ–ýqë4‚‰C0åzõ¦[Yî݆mP÷ŒÊ;Dîë°¢n÷6ì÷¾ÿ`²?$C¨)3âÕP,¤#cW¡í®Qôùá9ZìR“…189±0´êRš³ °ˆkÈ,N1 Ž C9d)Q˜òƒECÆ`qŠQÁ¼Âè–1úY‡nkY$n›ØÉlå3§¨~ÑÌÅ ¿ø¸üÝ×0jn#*Nö…†Ëkó„±`„í‡vc_b±2ö…V—Œ}­“±¯ 9Œ})e9ï²í cÍí¤¯¹Í/ûR‰d—3Y.ºíAL« Æ\ctm)’„•Ʀ]çD‹ÈÝ0ôÁ¹¥nø£Å)Jaª²Ù˜²Â• ½Á)@˜÷+ÁiId/ ‚û&ZI¬ÿt#úúáhU$`p]½žnû•35l#·nÓÙ¥.LH„©PÆVÊfŒC ¬CÆ@™QÖ_Nh夔ãW(›uÎ(ëå:‹a­e ””>Pfµ@ÙŽ0Ê À( "û'Ê•c&¼.cgÅqrxf«; —¼C)…ɺa_iE"…¡Î0NêµXÔ®R¬¦V¦¦V»›½B`C‰{…à\åSÊÖª±~¿±ò)»áãç‡q.1ˆœ´|~ ó»Ôdi×”‚H ÉcÝÓî ¤m(EÌã}±"¦]7ÉŠK)XZTªˆ±‚ø>ùê*bÄdELqÅ„0ûž¡–€ÀÄ››o:‹]j²´Um«Â!¾Çfµ­jH” )ƒÅ)J}H¸Ê)‹‹·a_¹cÜ©ž` ;Õc¾fòœÚ˜òRÄoLow»ÑâÄíºÄ ëèJ¢…!=PšQF‹” ©£È)Ë52 ƒuCÈ`q ’Dak¨·ÒÇ)y5|ˆ}““–Á'1Y >¡Ù%Á§å|ê”1ø¤”gêdâ†7dô')ÆH2ÊrÄŠ‚:ÛõŠØ•Õ–U2e}“0 j ?›¼Å v‰ÅÒ¶·WÉxÝŠ¸`ê­¸¢íƒÁ D˜Êk[—"– eüþt3À¸á] ûÝ)à°Öð¯3¯ÙAÆÇ!ö´‚ öê¬f޼ Þûq=©BR†tÁàž #Ú¾›>뤰ýßöÁe%DCÒ. œ\àa '!¼15xXb±âa¡ÕÖ 1zX1xXŠXÞùÐI[ÜŒ0œ Ô@ˆYx‡i[,Óî‰GƒuX*¡× ;yâcSvIľ_Ô /œÀSvñ“ /ó±Uü«*£?‡as&š!Gƒud&íë¶DeÈv}ˆv7n^]’ËÇåI‚Á`%øF„V|1 TùBHøÊù[pÙVx1Tñ|Hè.Hÿ¯‘F÷OôyïoÅ¿Ê|?a{¢ë7â<¿ÆÿD”ã?âX5£ öêt†!¦µIéÒ¨t:Ÿ°ozp%Ä%•öîþjÌçLendstream endobj 2768 0 obj << /Type /Page /Contents 2769 0 R /Resources 2767 0 R /MediaBox [0 0 612 792] /Parent 2766 0 R /Annots [ 2771 0 R 2772 0 R ] >> endobj 2771 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [360.0346 330.4858 387.4873 342.441] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.5) >> >> endobj 2772 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [414.8293 330.4858 426.7845 342.441] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.5) >> >> endobj 2770 0 obj << /D [2768 0 R /XYZ 64.9134 727.2935 null] >> endobj 550 0 obj << /D [2768 0 R /XYZ 64.9134 509.8271 null] >> endobj 554 0 obj << /D [2768 0 R /XYZ 64.9134 150.7225 null] >> endobj 2767 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2775 0 obj << /Length 3171 /Filter /FlateDecode >> stream xÚÕ[[ã¶~Ÿ_áG]qy¿<›mZ EŠLŸ’$e/„PD Ñ-ë>´ºY GÕŽ©/^è뱆çý‚ ¯vþLë&à¨t´×=€Áë'{::¯ ‡aû½?µµÖølcø¹Üztö¶ie|9×Mgyí¤O퓼c‚A^—©¹„I˜,˜~AÄZ|Kˆåà©1“Cl$q&ĆQ·„Ø\£; ²±1Ê-d_—iŒÇ!4É2H\) ÒF²!Èdµyã%e ¦ðÞT9@JËEÆ}¸°pûò¼ÿêSNOv\úñ[Ÿ=­Û+ûúÒ´Âf8 q|{ g!LJÃr¦…‘ÄΆQ·p6ƈ³³ {ÎÆ(·§]5ÃÙl {Î΃ì8ƒLsÖ"ÿÿsvR! ^Üyb;00™µYÔ98éžÔdŽÔÜýÞÞv>y‡¥*Âìmo$ªÊï÷õª,Yía¸ãZ'D_È“Òo.RmÄJ(0x¥¹•#Ê)#.ãþµ°õ7²Òs]~²opâ(˜-×B¯b4÷M°¹0C¨¨‘–P ¦X» ¤¬Ù¦*#´LBM¬Yt˽ÆÖI,b‘S°L$)s¶:[Ž@ ¢ðÄ|*µì$Ø®ŠöÞ?)£Á#ÊÉ£%EŠ@1›C&} ŽÂ:#Há†þ§%úÆV\Ÿö•¿vìœÔ±ý›Èï{ðøiVˆdÎÙ@¬”æëËÄP¡XFœàhäÝÔ‹Xd‚ú”‘ ø`tÔ·aÆj4±þ¶ˆl þV,‚ÛR‹‹ððN±Cf<2 xY ßb/®6jìµrß_kaõÂYÈ4’ïë~…㪩DËf*³ÊêM%ÖÖ¼©„‘M%9g*1ÆÎTl擪"Ò¶’MÃߊ­0J–Kùý`æãïÇ‘ÿ¹m%šX6[™UVo+±¶æm%ŒÌh+‘È9[‰1&m%®^Ò¶’MÈ­„büvtᎫ¶B` ^2*äF½¹t¸+ѺRÚýÝÁËñ™3h§Åк”v6,ü§-ªŸþ} jN£½=Å*Ýe=­QÀûhE"õßmQAb‹LXc`HFQvÕî2Œá(€0áá‰KpA‚ÁÕÜi=ÎJ/`¸€Ïnw()éŸ#f똬MÍû¥\<ýFB8( )qm#³óK˜ Æ!Bü¿tjcñõ-HF×_zç5,ÿÜîšv»kÎK%M¢s ñtrîyõŽ&ÖQõÃê¸Fo.°·vÃï6Þ ±ˆE&Œ×î²a öèÐ×Üj&ùôü­Ø‰à"±œ·®52ZÑ·/ý½ÔÇ®¥ ÉvÕ´ É×yÁËÆûÙ)w¼Ìù¥:êË%µ(lg ÆßMü ±ˆE&ˆl1Œ!ÒŽøn¯¥åý ›Ò¿‘–K‚°! I¬Ûgí†ÜïXÿŽZOÚ^Ÿzú°àJ¼²½ã“kûòWv>°T!ò„°Óe´Oá Ŷ -§áɰ½.ô–BQ¤¬\)ïü èM2~ 9o76_΋œÉy(;stúƒC3ëŒ`ƒÄ%°Ú ¬FM¿xNáÝØ.–l ;‰ ¹e2•#”‰´œ Ä= q !Óü"|SbžÏœò;ÛØCŽ÷I¢”sŒ4m×O~Ü@Ü?›òS½wIp³adýuê4ñp;õÿü·÷H?ZwÚŸ>ûŸ/çjgi·• I¶K"ÚmZP_çìœ@6ËÛסéºm •¾ÛÖŠèu ¦äè¶9çåµyï¶ŠmªbÛo›$^ºä\8ñÏŠk0ÄÞu×û¦¨mê£L 7Ó0üöAÝÏÒß}q]¿ŸÃÙ°“=ꆧöïx¯Ûžj÷¹[@Îó[`>ŒøQs±?ñtvOpTwxÜtÉ)]”Áã~Éßì0ìS°…níôÓn¸cÙíyû0ELªÐ©U‚qoƒžp®  6úþÞ† ±ˆE&z´DŠEv>èiÐÆ(*YF€Aâ@Š1Ÿj¿Ã>ÊOÀÎ$惎8Yxóz>F­¡ sWÕÚWv…‚p›#üu\ÚÕ[Wøº ÏíAÛðW‹ÓSa[îöUª[ˆB@ X…¦à"ÕÂ7F¥ƒüã¹Ëƒ˜}Ðù€©ÉV=ß#2é IS}´'ëÖ‚£ëÏíAåL'IFnÞ¨ }ÿ¿wL …€UL˜v¶Ÿ«DCLIB§|¯d"CCR+±ˆE¦’"XÒþÉ¡‰î=MÌšAMÞuG¿Kv>cLÄÌL¸r¬YÆ™‰K3Õr))3%WgJî˜*~H®U¾©v¦J-á´4£©žvÕ5U%¦6$ãTƒÄ¥©$U,1ÕA… ¼ˆmËý‘ëÊs6Fî»Øžpnð,m#4œ£‚]%:–v~ðöÁC®uÿêr'±ˆE&ˆŽ ¢Ê¾ý0,Ý.I—DQ$%$ñùà‰Kp•û•zwZØÈ u;Ɉ0H\Bh0Â8†ã²à¯ÓÊjvÇY>¸Ä¸”O0•Ó÷ï²ÊP¾ø~Pªé¨©–Ë”ÚìIæär$rŽËaXÌå„Úí·OŠ+šj¸Up¤µàS¨#µKÛçãn×:±î<Ãz¤õHäœÖðàToò ÙàödnçAb¸s$ÂÞƒÌ#ìÒëV#dßK–ªKaK²[pË åÎßûä>ñ8øM·¢¥úo‘íêÖ¤`׿Mʶ‚7x”¢Ý{yî×v‰\W`ªÌ ¶(“ZÝð!2›ùøA‘Ý{¼‘žÄ¶Qgèkíè œ¡g5®Ýô 1)LÍh3îRê}Ùê³9%T`©ÏØÌŠÄfF¹Î7ùNâÂô D9.ÇÓ–^®O°£X•ûV=oúh Ø&dˆ‚_¸•6P«ÓÙ&É7²&’w4aÐxçºÒJ¿=y ¯ûô8Eab™Ì6ÍNàüD‰PÈ`b†3qffúâ–1¾vfÑú¥*b‚eÐù\śƣ¶ŽÎu¥¿ž£ ªK›W-}=÷?„>.Qendstream endobj 2774 0 obj << /Type /Page /Contents 2775 0 R /Resources 2773 0 R /MediaBox [0 0 612 792] /Parent 2766 0 R /Annots [ 2777 0 R 2778 0 R ] >> endobj 2777 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [100.8151 665.027 128.2678 676.9822] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.4) >> >> endobj 2778 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.1768 665.027 167.132 676.9822] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.11.4) >> >> endobj 2776 0 obj << /D [2774 0 R /XYZ 64.9134 727.2935 null] >> endobj 558 0 obj << /D [2774 0 R /XYZ 64.9134 401.0351 null] >> endobj 562 0 obj << /D [2774 0 R /XYZ 64.9134 308.8739 null] >> endobj 2773 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2781 0 obj << /Length 3740 /Filter /FlateDecode >> stream xÚÕ\YoãF~÷¯Ð£„uú>€Å.rL³’ìŒó”ä–h[ˆ,y):3óï·ªª)Q¤ w̃Úd³øUu]]]œo®¯¾úÞÎqšëÙõíLKâ˜3#(±–²Ùõú×¹Õ‹%׎ê¹Y,¥tþóû·óŸ~øé_‹¥bþÍ/ï~XX1¿^„ù»ÃÕŸß¿]°ùwï¾Å‹_/¬œ_¿ý°øýúßWo¯¯ØŒÂ?v|#×D:­f«‡«ÿ^ýú;­¯èìßW”gfaL‰pVÍ®¤DI!Ò•íÕ‡«ÿtélÉ%QÔ²sR~z Åœã}ZþÊ-ƈSŠ_¦ž£@+Ó}RËÄè$I¨žä7¸œg+`áÖ©™v‚hæ¬_ûæk\±€M.9¾çl(u9¯‚ðÿ\(=¯šMuk°­OÅÎ#Ò*;ËѼŽÁŽä‡Übµ>‹›Ý¡­ví¦j7ûÝ)Z¡A9¬ÈyÆÒ „åà »ì(.s’ç`…vDsÎú`ë¦Ù7§ ³„*xc9‘¢v2)A¤ñÙrÍJj´1D§'4ÚÂ@kî%øí}Õ¸©xºôÄEû üaö¡4Qʾ<‰{•}„ŸƒmM"T=,ƒ©à•‡@'ä0>_ö:?‚Pªí¦:\6ªŒÿ׉43ªQ™*êzÿP Äîˆ5,[€W›U¢¸ÌI˜•„RH{(;³:´M]=œÁuŒR& ÂM§à:G”€ Vîyn Ò`[`"8O2A Fí>¯šÑ5¡U»¦bšú¥„nn‰Ö0wM‚“èô_ê˜ömt4ÞÅö‹%dÔ+عyÿ²Æ›|þñè½úa{ÿèç×ñÏa‹8ú™Œ™bÁ{T@G?s”PýishëÝê<~KE>'¿Ún½å‘à€ÕJK ¥¶±ïbžmÅäû¥XÓDPðxãÖY”uZ¼¼ú² ê¿jAùŸÚ Áø²ÂgøŠ)ü(ÏG…Ï™~¬›‡Íá0TŒQX“ãÙüWk}¢¸ÌIè=¨‹Œõ‘f9ëãSÿ…VPLè_Húª‡4…Nmï¨`Ü¼Ü )*¤(1ÿ¸ Q§Œ‹”›Oi?‡+q!g Tþ9.”£™äRyŽ™¤ùÍ$#9f&9ÒA3¹A¡>Ëö<PîbÐ;ŠÐ¥2„ÐÐôdÌ~³Â”#œa&žïV&M¼œÂ|)&® ÑŽOìP•„ ñüê}u¸ÒüåÇÆ'xô­ÝÔ‡@®÷êáíf½[Ÿ®ðG!Xcõ«µ0\æÏeãÀÌ$—n–ßÝžÂc”+¤.‡¯£8QXdŽ ‡0X Zøcuh“1œœïiB­tq-« óSêŽÃlœSŸ3ΩYQŽñŽâãœBÜ·Zõ¯Vxf„Œ'Ç.ÇÌ*ŠÅQKëâFÏÔž7ºùåâFNr$nôžÆ ï„a7Nå¾ £Ú],pÓ•cs\WºgOWÜ 0 dLAˆ‰âD‰1I¹)Oƒ Cä&ŠSa¡¹àrÈÓ<7¹.graä•%#¯DØìøÛ^e‰‹{÷ëû:$½õ'[_6Y@ ýO:ào0>Õ_¸mö1ܶéј/û1ÎOõš®Xã —ö-v…/¹Çô܇…òðE×™±UÌužŠê‚ëÌ„ÕÔM}¨wíp§È×0)ºG^m)‰à2£8`(F æÐƒÚ¹Îî¼qÜPŠ ø ©Å(ÁåNM¤¨BØ ³2¦ZÌ&XU}ÜÛÃMV9Éóºüÿ×Þ§ºëËí5‘Å¢ 9Í1£Éåö\«IÏ4›Œä˜ÝähGZ $3B»-µ£8UrJ$Üì!í,û '6hf âL§p¢á8w¢«©#ÜršZÞûä.ƒ9jÇ:h_T 2^Íç?/°Û´ÕÍfëËQíB`™éÌ‹dÛp|î݇Ÿâ–Œ¿©×›U,bHÜ5±þà OÅ—Â8ÁÉ|`‡%PivWŸeÍŒƒdµq3"¥|}¦£¸ÌIl-¹"Œj~|3Bü£þü`škÂhd`äÍ«\¦F8ûWÆd4œâÓðOC|2Xt+†°r3®«r`;Šh9}’ž¡=ƒ)„Ô¯—ƒ˜(NA”šhJuân†PÁnÀÚ‚ªÝQœB¨)±Ü°>Âzu¿Ômp‡ðNö ÝLÅ(ÇjGq‚UÁðTϨI}4‰8È BL§ ™q)§ôEH,÷r]a¢8…Pq"uúÂôeÉ­!R€Ð—£„”qo·pz^?`(À8â#Ä‘¡Â(8G5àb·â¢Ï¤ù33`œõ ‘â2'9TxÑíŽoŽz…¹Ú߆l˜F±À«Ë¡M§Ð ¡@«>ÚóæfX ä+å&ŠS-d¿nôæÝ-ÿŒ}x)s›-š—èoãGuÄjbŒ´%u$#9¦#iZ¦#çü`5OÁìç3„;ætI†2’c ¥iœ)æN x(1Qœ‚ÈA„0}ˆçΔ ! Ná“ƨè9>t¥#Ž„b®ÚŽâ\ÜsÇÁ9:[pÁ;ŠSa£éëÉ‚{&6M˜˜šæÄj)KšZFrÌÔÒ´IS+ñhjã;SË!Ž˜Z1€©ãëL-Ç—LíT+Nsc •Þg)Èwõaå›}“êG'ï=Ù<¨~€!¸?¢¼@ i¤·Ì žË"¬0(Ž4+‹FXL8ÅèW,½p2¦ù‡§•/üÕ±ÅÚ%3óÍí€P#Çíñ…Ò¥"ó¥]Ä7¿Q&Ó¹º'¯ûí”x¡½3ð݃e|¸£ŽEJë±ÆùûÛp× ±]ý© £?°Þ öæÿ¯¼£[\ *ÍÒB’@ñ]~±fŒ¯÷G-¡\¼['¤í>üyx áç°ÙÝmƒ\ñá <„þ9Ü¿ÅÊÑ>2ÑM>íÆ×÷U³Žøø¬’Çô*ª*ˆ zòú6À?($…£Ü ”Pšs¸ß?!pdGs`ìËÚ8ô¼Âïê©éz;‚@ÂõÞY^} ¾Dú@ÐŒ@º’Óù‘ØÍ¨´¨_W¿Ãk"Rá06Œ¤¯n÷ÍC‘!ïUD4¨å S$—.V‡ _Ð>p\p‰ÍƒÁþt—©“dºBfÛmu³MBðÞaÉÇS‚ 9ã {£ ‡ˆÄ¿nESBNÌWU¼\mÚ .Ü$îñ(DOÝ¿Kà~ÜÞWmùWU?óÍ 6`(sãnrîlvb9ó¿™d_W}õ=˃¾Å˜ä¹þqþlñW&ʪ¤‚¶èFvÎ÷¥sÉÐ ­µ8éþJ'>u÷`Xð:ö‚s¿ñœ'Í÷•Ýø~ICÒ!iÊ®ïýt;œmp¼ãs¸—æìw[…ÍCŸû>¸?”høTçÞ†èúoµ´ÉQm7»z½iÏÅ+!,2›ä[­6ÛxpÜ ÍZ*Ó1ïg\ñVÛ­– &”Ë÷Õ¨‚@|ƒc=¬î"#Ì«ðŒãgJ7‡!– à5=c›ƒ:ŠÉu±$!'x9Ièf½{–CgS]0¬×WÔ¿?½á£ä-†ˆp#èÖ¼^Xö\BŽ­Œ pΚ+'šŽâ„p8DiÁô{ÒÁó¤!ñÀÎ;­<×%€! Æ C}r.éܱ*êŒCÔ‹7ú‡­þ&1^œifMÍQ§ãsáø6ÑùK›C*<(bu_%›º}B"`sФ`¸1ÜIŠî[›qäûû᯦ÆѼ㼠Wzž‚¯Áƒ($\u3Ý݉ÃåRvyð¸ŒÙyþÃcµÂ /L O?qšØêÂ&Þ?¶q®²ypü葵›•Oªä‰±YÑ1ÓÏUÞ¿½þåýÑÑ`ðžÉÉÃË*_­ÃaÓWé³=˜ÖÛ/=d#‡pq0ÏÆÓË& K»<~½?¾=Rö]8è„q›ȺÁ„ÉÁ`0I‚‰›]úøguÙ0òÔtl’÷)yAùtu¬U0ü'äp ë}†Õ¶U§Ay—=ÂÍ>í}þ"Ò®Ú’×ìå˜ÁÏ•t¹½\Nð²›îf]ªPN„Šáë(N ‘…3¦ÄêÓjHôË!L§úó~¡ûóS°ž7—ÄPîžì° -»múŒC\v”PãØH°SŽ/¬£8!Ø1ÈG噎]H¤évõ§PxlSkžÿî%H&mqqÜs¶¡•è)²¥¡6¾˜áfÞ ÷õd°Íö’V1}lqœ0f…9ˆ–åŒ9#8bÌiÖñþ‚ Õ3ÚÖÇš*$~ë,D9F;ЬúŒ??åõü¬ OiÁµè(NA4qØtô 8.l ÇÂs9„‰âB‹Å{éúóãØËŽ«z|L xcïllåïiêÆC`ïÎÆæÖ+2¥±ëIöcçÛÆ—€šT¸AYþ˜ìóeendstream endobj 2780 0 obj << /Type /Page /Contents 2781 0 R /Resources 2779 0 R /MediaBox [0 0 612 792] /Parent 2766 0 R /Annots [ 2783 0 R 2784 0 R 2785 0 R 2786 0 R ] >> endobj 2783 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [408.8466 243.8109 431.3179 255.766] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.5) >> >> endobj 2784 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [459.0767 243.8109 471.0319 255.766] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.5) >> >> endobj 2785 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [297.3776 231.8557 324.8302 243.8109] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.1) >> >> endobj 2786 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [353.3548 231.8557 365.31 243.8109] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.1) >> >> endobj 2782 0 obj << /D [2780 0 R /XYZ 64.9134 727.2935 null] >> endobj 566 0 obj << /D [2780 0 R /XYZ 64.9134 470.9729 null] >> endobj 2779 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2789 0 obj << /Length 3200 /Filter /FlateDecode >> stream xÚÝ\Ks#·¾ëWðHVL,ÞSÊvœT|HœZådû@‘³«©H$CRYï¿O3Àœ µ„\K—«¼6¿î鯻të»û»wÕ3ƒŒ¤rvÿa&92„ñ™biÉì~óó\!BK‚1žÿ¸:,È|µ†Ÿç§ê°X2ÆæõÞÛ¿ÀÿNïv/§=¼x9Á¯5j®Õâ×ûï~¸¿#3 ÿ‘îK¨DÜH1[?ßý÷îç_ñls‡g?Þa¤Œš}‚×1£ÅìùŽ †gÌ¿ót÷þî_A ž-)GkÒå–7²ˆ14•åÞéÉ"!踬æsdµ/ý'RQK¯èRŒ0cNäwÖæ”FFWQmÄL†$1Úýýîð­5\ú|@MÊ©ýn»¦>Zûóùªy ÿ[9_êÕ<€§êÜìÔĵгÍu ‘‚ ª¥*ÖÛãiµ=Õ«S½Ûž£eœC³è#§Ïûg1ˆ­¼š^â29ÀJÁ§ I1:ü‚®·§ ŒúÍb)¨pÞ%ãü(fã7áeàÖ˜½ÿÄ(?à+™Âz‚RÃz*^ñ¯âGóÏÑ¥ðƒ´z^6T±ï<7rš€ç’«Ã2£…²zªWÇqREú_gÒˆTY›v¤ŠºÙ=¯ê~r¡iE¢p5­¼Äe,r€VŒ!Œ!§$(­Ž§CµzîÁ5¹0ááz‰SpA‚A5–Àí'Bˆ(3u9€^à>NR68%øœk¶¡É²*š¯R×{ê­¤nN&ŠL„&ΑÄL}QhÚÚPã‚Ìq·XR=_C¡ç"ÌÆþ’Î?uñ+MÜ»½[_µ?s¢‹4‘:ÅÒwÖD]¤‰mTýVOÕvÝÏá\ a?–_Í^/q‹`/×Ha¬Ï€¦Áæbž³óò¤è¦j$%¼Êó„Qô ¼ñu:·ËCIyÜí#tÅÜ>«qçöÊûêð\Cû7a·ñ4¬¾Úç½¼e'pÀãÁM #$ÆÕ¬û—Sëî¯ôýbƾ•òsÄŸÚÞÁ^BÉ^ïýGŸ|ˆS›ª›œ@}EkO4ê­+i?7ïLe…HbõgÖ(=b«\B¿¾ E"‘9’ÄHiò`þ¹Wí9àÜÅ ‰йP+ðк'³Û¬a%¶w+Ó/æ0oHq^âBc„ÁžyŠ ¥†V—'¸ÇÕq,•¹·÷WÞ)ð·S]qÉWo7«íæüÙiE†g¨‚x½zËXbß6hÆÁõÂ*·'úp`‚4*†/HœŽ‚Œ‚@ lXb¾_Ož gçÿaÍMû,WÍÏ¥Ø/Ý®©úŠS,Á@š•Sl8-ˆÐKœBš2ʇ"Í¥Åu9ʕϼQºTI®¢Ór2po* øPJ5føia7x‡Óê¡~ruîiÁlýÚ‹ºQ~·ŸûÛ?þÝäÊŸlöÜ=í>úÔYml­ìŠf(˜]†Em„&©<AEt×·È.eÁœõ™ð_Uÿé¥1  Ä^nàAuu}ó—±È4Æ@4ƒh–YŒëÇÕáКä¾Ó­úf@W(AJNUÈìTš‚š¶§5 q ¾ÕW”Œ*J®Ñ”ÚCO{®[LÕ qBW ƒ+}¦ênSeT½FSF¤M¼œ¦AΩ6 ®Õ€ªCî äBÐÂú=çMz½_9¯ž-íAÑSà~ßP7,¥u;dàyŒû9defýœ+[É’ëý¼¸Œ%ø9±]ÖÏý2ïç¶~øÓð–ž(eF—Dë%NÁÕa(uS¸ýËb(„XÁ "ô§B!F%S)ÂøúãÏýË/Ê5|)Wåà‰p©7aÔôŸ?”èU(ÌAI ¶"MêÇœ+35,6]9’˜se¿,v嫈{F)Y©—8UÂç lDzPϬ® Y»a¹ØèPµh&tA£GsF÷Ë|D½(~CÛÅ<Ü?b¸¹øQ a?òCüˆ^?JÁâGn?’çï=¹¿©7¶)Kê%NeìoÏH†µe…ªœÁ&ètƒµÆ² Ý"‰9ºùe1ݲ1®Ò.Æå¡†—@õ &vgQ h8” Û’gÀ¦Cð’p ÛcÂÒ²î/Õqí|\aè(Ͼ,ºó- µ¬„ý;“Ún¯?Bmå-#}+hØKcÐÝ/Šs§=/ðmeÍ[ç”Z#jÏnšºÿø²v{⪽C"öð™ 3¯? XEXÞqÖ~Öu4÷Ï´…=»k—¼Ø–†úL¸?ÌvâuÚÁ`߀Ý ûÝÛê·SóîzAõ<¸b»pÕþòSýÔ”õö‡‡¦ñ¡ù’Ù¦yõVvÏÜüðXµu’=ŠVB¦1¤ÍƒíMÛyÆÙ  Ý­ÚEMaM·†ïÿêy8Ôn¶G8wg, Ä¯AÄûÇÅ™Á\3g¯»„Ï;˜ö‘£Á«FÁm½˜̆nS’ ‘Ä üªóM¢N‘ÂԜݦëçúiÕê´ryØ2–;ÀàHZˆrê‰úS †B ’ :ä7Àƒ9hôÞT«§Ök8’  6΃¾CCŠ0šÎe}k{ÜC úN$1ã;~Õù±Ñ¸érW;ÙÓ@ #…èYL× qBY¹‚Ùש¶ÑÉQFÛ½;;ù(Ò¾*ò ëK‡Cµµ.sòäIoNV‡Ï\— ""‚’4Ôüpp±ûàrÒÈ U°OÀÚ|¥}PT@Ñ+ØÄE1•IŽÙ[¯ÄhJõ=å5 t‰Š— ¯„”^‰Ef†W°ùá•r&½‘Î> %õ”; /¤ÌÕˆo9¹BæK+Ä'°dæn”^­b¼·SGŠØPÙ–°²Ü o,2sÛ`Œî«û´à Bõ§ J›<`Ÿ›@ û×ýÐ0“ËxÀ­Ð’<ãc­bÉLAñKÍW=ƒÖªR´›7–™#plŸ<ýÊ‚ŽDæcüÒ´r6¾‘?{Ö„ÙX7OàH(Ãþx3h±þ¥z¹ò6íHub-¬-7ƒ‹ÌÌ %(/A+7Ì MÀõ3h Üñ´bà Z_˜AKð½j­œ§ÞHê&@©ÙÄx,ÅðBµ/_ó Z«Ž)™¾c™¹HÛhz-,/7ƒ‹ÌÌ ¥@¿l­œo…'Z ÆðÄ!Ú¿JýûO¡ÅøŠ9~Vçàø‰Ò´K‡õåÚ¥c‘™véii´rF¿‘i4Û„íuQžJBDbä+œF‹(U‰æÒÑ$¶Ê%4ñë Ò$™£IŒôK¦ÑŠAï¦ÑòÐÃ4Z½Ä4Z9‡¹‘½*a©Ñ?ó(.ìT/g_ó4á¶®Ä% ŸF‹%ŽO£…UÓhÅðuÓhy€a-AøûO£S¼›FË+¦ÑÅ_3³¢XÞÈ2­Ë1Õ.É~}Á¼‰Ìåi¡i´b¾Òuæ}%u&¾’›F+1L£M@ôÓh‘&ÌŽ•C¦Ñ&úi´Hsqq]Œr·R\Šxü'dôP⥠.šÍ{èÓj›%ÜùÉ’hÛ_aÞî£Þœ®y-j¹àIZÝ4칃›pjã˜ýý#wf¿Äv«5×bÍIñhìŒô*;Ïm5;ckªý¡:VÛÓp§XX^á3W“ÅK\Æ"È¢8Ò@‰mˆŸ½ù€a¶3ò­È` šOT©ØÎÂúÞWÜ8ú㘺áUõ±uqLj‡è€¦£Éei盚oÆûk:‹çdLÖQ&¶Ù¥”ñŸ)H™HdŽ21ÚLC' Af×å ‰P9Ŷñ5E:ÚÏmû$ª N/q §%1g°žºË-å¥o91n ’‚ˆüÀ¸2Hi"¯šÿûû¶»YÛkXmêu{~ÕôµZþ qËLendstream endobj 2788 0 obj << /Type /Page /Contents 2789 0 R /Resources 2787 0 R /MediaBox [0 0 612 792] /Parent 2766 0 R >> endobj 2790 0 obj << /D [2788 0 R /XYZ 64.9134 727.2935 null] >> endobj 570 0 obj << /D [2788 0 R /XYZ 64.9134 519.9891 null] >> endobj 2787 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2793 0 obj << /Length 3255 /Filter /FlateDecode >> stream xÚÕ\KsÛF¾ëWð²bLæý8ÆŽ7åT*ñÆÊ)΢‰µ$¨Plýût`@ÊU­k«b’šit7¾¯»§Þ××WßýÇÎqšëÙõ_3-‰cBÎŒ ÄZÊf×·Ì­]d\;ªçf‘1Jéüýo nç¿þüë‹L1ýû»ŸV̯3X0÷KýëûßÞ.Øü‡woðÇïVίß~XüyýÓÕÛë+6£ð?Ö]‘k"V³Õöêï«?þ¤³Û+:ûéŠãÌì|¦D8«fÛ+©QRÿËæêÃÕ[™—˜…"_£¥œELÕŽÉ¥¨L5„q‚êJÔvð`‡]„rp\úXÜåå±5L 0«;©'æT*×ö0ç8Ø#–ûïGÖ´³PdmN¨Š(­]ßžÕýrÿol ­ŒT׬V½Šk¥LÙÊ)øƒÃÍIfk+qÂVN±ÚÄle/d«v„ šÒV/qÊVà ;¹­»Ûü¥n«†Ál:S[‰¦ ˜4Kc75ãˆù ‘”ºZ½pzžo‘Â|6øaY懈+8Šû™!ta5ÓD9' fHbáJ“Ú Ì‰N3Çèöºæ©¢ßÊ}¾ÜžèjáÊ<¥®^à„®V®êéºÛŸ¨ç JÙtêyãêah‘Nö´[nÖËëE¦¸š‹n]®Ê}[á ï%ÚHü@œRü€@´¶ŽÚ” DŽAÄ/ëa$b‡ÍÌègYÅ)qB%Å} rÌ*¿ÌÇ‚³ŸLÝúãê¶ØÕ2 ;ôjØÂ?T0Žÿ“Ôç($*#Ó)ÝJœRÚ£â(ðh†Rð<8SKœ¥*%œ‘cpöËzpt=s–X°0¡Æ^â„Æœ¢7AtLãh:fä©ŢSWíø!?¬ö‡×UB.×»"’ˆ)ÜFA‰Šá›çºÀÌ”6Ä }yQâf¡ÄSG8H‚ºîºaxý°ÛßðçMýSãšðHe 1ZÛ¦äzxoÐ÷ð!ÇðM2:¿ïËÕ‚›ùÿ">Rš8ãt#¯vz%® ¸“ê5àj8£•;Nݼ¼ÏëË4±³ú¼¬9ÀX¹ZC„ßoëŸÖå½ß[«ZmÇåÞë¾ÜV'¾Òß7’!öU[«1€èˆÖúˆ·èЈ]À~Îdc‰y‡ŠçÁ1çÀ‘A¿æÓz¥!wÜŽÆçøEµ–âç"ÿ\ÖŸVèÈ–£ÕOn½XóQI þþÇÎÊ fìL)‡nÆ.°^bŠŒ°òÆ×vÕñ‘Ñž-X{2)”Û’Ñ/Uá½üŒŒß"”íÛÆŸè¡Ç-þ·ñù¾vÝ›þ†,ËzÕª’\4Q_QÂ9œôÔš£XƒšѬ¯/ßè±Y–ëðùæ©nPDÈx‹áóÏÄjÝúPÿ{×ìÇ…EýÜw7oÄ!Ç"pšÈÓã¶àc'ÁMBä ¬˜c·`âÚ«öbïy̸?6¾Gôï6»»Úìp \¶Ÿ­š¯ª`_ýùΰ¯Ÿc˜»knƒfŒÒ—Špé˜OòŒä‘”Ñ “C q$9øUÇgó$)î»G5¤äü°Þ®7¯jíb± Ž©ml‹7'€\j–ÎþVâ„ *CPòÈC¤ç$_Y~›/7Cê´ƒ?…Ýú'€V®nÛôE³jG¨BÎ/-$•Q•°´%£§]uÜÄöݲ¸F" ïOE4“ÌV/pÂVHFPw ~dlÐÜ1ö¡êä<µiƒm‡ ÄÒ~Ÿ×%O´ ÜöØ|óekë‡~õ YZ3¼g!\Þb ÛïöU–è[K–ɳ*ó oq%í’Ù ¬zYÍG_< µÀ¥ÔÙ‹ß,·Р°ñ¦ÕX &! p~½–µsÿY(=_î×K¬a7ùé ’iájs™­È 9œ­NôL\‡rY”Pð6’^ÿSk-‚-÷?½Ä,éj¨‰9³§l¾ßŸv³„*¸b:—":™”àÒfo:D󔈆ࠄ或0ÎíØ ¢m’!zÔÂÑ¡‰g"ÚoIˆè@ä¢Ce'Ì¥_ ¢±:¶\M N÷F»ú¤óçK!:Ð&¢G-ìšx&¢ý–„ˆDŽ!:TvÑÉ\ú‚ˆNZuPÕžª:˜ ’)õì]øÒ'ˆ{8XÖm€Ž-ˆåͦ)‹]¸¨:[<[Ô=7ì`Åßž9É(1ꢎ¡Ê§‡Þ (ú%£ÁÊ‹™à%f¡ÈÕ Ïç=+&` mjG¤q–$óòW÷ÜdiÔT%C¡šÙgÇý‹XRø3¶·ê¶ðÝCBSR1dÜ=CBÿŒ3įLÈ@äCB[†¬‹2¿ëø<[‰ò#_„þÜ|¾v~Ç ? ¨©µ燰–jٳϮ ²ÈéÚ*ûºërê²»™µ½ÇíÓ‘8©û/si@ªQŸ¶¤ê9õv·]®OK0áÚ°à\L+/1 EFh%¡ÔÙ¾–-­â/õe2¡º^┺ÎÁyÆ™¾º§å¢Ä·M¸M§ 8¡¦o£á¼ÕÓ/|7Y5š’!õkIÝš‹íÂñÐë¾ð%¡i×4.ŸÑâcªO]üê'îÝCýˆ­èu?#M`N²ô=ê¢.Ò„>Ê?¯e^¬Ns¸Ä—[ak»üböz‰Y(2öN"’‚Ú#EûÁælž$óó×ÂðžTç@¡8¾9¢Ÿß}.jìË^«ÿ8+ã¾S/ìÇ,îPšüï·ëÃ!ÖæPøö;Ö_ {/1 EF`Xq‚±¾¦AéúðX6¨&R¹ük)bºLщCžŽhÇÜó)pð™Ág‚0Aˆöi*÷u-vÿÖEUØ>5O 'rC`@²*tÔ)KB¯œÃ¿>!K‘c, 5²äþtRóUÜÉTo%N¨.•!ÔB{ª{.ׯ?+G8Ãz<|ÉfšáÉóµ$9X`œžèß ¦ˆ°â ú÷M–[×·ó»æˆÙ¼~Ôå½¢-Ã'†&íZõ‚æMŠá‡¡iÉ2䨻:ò‡þÚçûüeüiøØ0)º=/1 EF€‘ĽûÚžö@‡yŸJã€÷£w¼5^M6Ÿ’!=©ûL„Ýãó~ˆDÅ›cîûÖûry³®F…ÖåB0ÿ§~GùÇ_~ofûïÂLo1 ¯Ú¹£7N(‚ŒpÃLîPMÎBN9y«‡ƒ¯qŽW£Púr8µ³Pdä½®£šwWN8u³Ô8b© -õ§,µœ8 8µtxæ]`*|hiM:S[‰¦rœÕîÈÔ¡I¼¦:ÉÁ±„¦z‰S¦:K47"bêåø-6Qõ_g?G ½²&(%´å¨çÕ…óvsT£«ME£M‚á6/1 EF8G¡5ÄvÙ9†­­N¨®—8¥®QJ´í«³š@IÈjè%NiXM^A"íi89 Hã võ^Œ"ÅT.)È1¤øeScø OÁ†ómÂ=•‘)m DŽÙä—3Ù¢?™ºúÇÕmѪ;†þdvè×°E¨á™SP&(`L:­[‰Zs¤*“q´`Æá_ù4K ÑŸ‹”hDŽ¡Ù/;sÒZůN¨±—8¥1YÄȘÆmhdDœ´ _lÆ*á~"üä_iT°À,”1Gâ—Ý…øYPA/qJC ûå} +~v‡øÅ݉ãÿ±çK&R#D²Œà8üce‚ÞˆËy§þ±’*ùE_2ŠJ©ng ÷ëÂ_o1j|œ²×«êfMëÑŒúÙKÕ]>ysîSMœ)½ïÍzø^uÖt±YíK³¦\1€•ôféŒi&'€N}.6”!N• ¼aløE/>‰K._—6™å­ÀqÛ™Dê#Ûÿfд »ƒ½ Æ:9„mô¾†l¨SG$Í$7ØÇÅм"H¶ÁFS‘×?F_h­þÒpsQ)?Ô£àð!ÂÍê2‡CgbÅÍÛúÍD8׈v¬*« Y]±¹ò!E5vìøs YÏÏØÚ$q}ït=–ó¿Ñ9ÿ,”-¼átXàPEq­Æn–bÆ9¡†'¨­yY'0VYk¢…Rþªqÿ›7‹oB¿À1½ž;Ѱðç¹endstream endobj 2792 0 obj << /Type /Page /Contents 2793 0 R /Resources 2791 0 R /MediaBox [0 0 612 792] /Parent 2766 0 R /Annots [ 2795 0 R 2796 0 R ] >> endobj 2795 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [396.8377 540.4391 424.2904 552.3942] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2796 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [451.6323 540.4391 468.5689 552.3942] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2794 0 obj << /D [2792 0 R /XYZ 64.9134 727.2935 null] >> endobj 574 0 obj << /D [2792 0 R /XYZ 64.9134 702.3869 null] >> endobj 578 0 obj << /D [2792 0 R /XYZ 64.9134 252.3192 null] >> endobj 2791 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2799 0 obj << /Length 2995 /Filter /FlateDecode >> stream xÚÝ\Ms㸽ûWè(U–|œR™Í¦*{IRãÛîh‰3f•-9Ùù÷é 4)PÁ©u.c‰[¯›ï5@k>ÞÞ|ø›]9â4׫ÛÏ+-‰cB®Œ ÄZÊV·»_Ö†0±)¥týñ[Sm !äºÞ°õþ þyn>žáoóôÜl~»ýy%¥ ÊR½¢þnëðêÍO·7 ®Ð¾„k"V«íãÍ¿o~ù®v7tõó %Æ™ÕWxM‰pV­o¤›RˆpåáæÓÍ¿zƒE°XÄ&?¢sœÏx§'’Káñu°c€–.ø0l‚Ïch2ç8#ËÃûð:{ElpŠÎJ" ctÛûòø!ÀñƒŒøïóƒ~h?ûJ¨µ¢0ã#À%L¹Œ^öüdÂá̋ǰ=ìªYG%1”»Î‘r¿›ñ•9ˆ cöèÔ—„K"V>!u¾!—ź9tï«öÅè¾FRÕ~Ãíºi¯ž›–òíÛkpX…¯ÊGÒcÑL¡  .€~Tz?ñ¶þ{:§­aZ^ò`"}Ì< qJñó¶Úû(Øê^†;ÎIMƒÌ9plþ!xÆÖ)ðEƒšUëô§Ãñ/KO¦>µù¥lCüŸÒëòX—wø¼ª—¡âŽi•]Åh®s°7¹à!P˜X ¬¹XïOM¹o격û—h…†ìdEt˵šë-±É)X¡Ñœ³1Øêˆ |R1K¨‚oÌRd'“BÚÝ›Ñ,'£qÒëD’`4d$)™õüÒó[1:B“ÑIFÇ.^ÈèpKFFG&SŒŽÁ.0:[HßÑYs4x®(S Œæ‹…¶Øûæá·bt„&£“ŒŽ]¼Ñá–ŒŒŽL¦ƒ]`t¶¾FS 0ÍRÕA1BÊWçè=0Ø×r¸¼rðØ2¼l?íˆ×ºZqˆaíÈÍúÞ*}ÙTÇó’ˆÜÉ&‰dˆIÄ1j¾=Mt+ ¬–ŒF#¯VB°XÄ&g”PÒ±1F¯„_©¢¸&*·Ö6…âÊ?`¸ÎΫ$[”߉J”PåI–V‰*KÍ«óþU*Ù·kXW¹uãÍ|I($v%—BÒáé2ŠOR!ýÈ| ‰M&2ÂØ+¤Þ7Õ—Aðh“úÈã7ÑG»n¯@î8«˜j bAVÊ {õÚ5Ã,Òn-ƒ¡ò±h¥‚W[;mYáé0ôyÄop<Ôå鼨"ÿ¯ i$ªdLQÅAÝËzZ‚qG¬aѸZVÁb›œ‘•„RgÇ({YšcU>Nà:¨ï(“á‹Kp#J83†;-!£@eió ðIyEk>Æç©Ù¥&TU:5ecê{™ºn·3½š4%†Yþ]©éÐm_–>Éœ›‚Ûõ–C>ÃìðC¾þ:ä¯ñÄ}xòã«îí¼&†LÓºc²Nß‘ÍT¦‰cTý^Ÿšj¿ÎáR…·öïVo°XÄ&gÔ+-1”Ú@ÇÉæbd‹ó{щ”Ä,­„Xh©_¿û¼oUPï“ûýçi? ËÆú”ÃécŸªãc}:Íír(7àŸºöZ.Ì9UˆP¡cêK5mã€Y«T ¦ä×þô‹ØäL{W„Q[? !Þ->ð§á 'áéyO ¨‡Z‘ÑÓ`qÉSËáS­f÷øÆ¶å¾ØW¿7í«®¾jï ›îÚúJ /7÷ÃPáëòä Áƒ/ÈÚm¡²Š?oÈo µ:…i©ë4ØöûCr¶ëÎpž9Qš…<~kpf‹QYè…Ÿ«ñ 8qPÂq1C)'”é|? ˆ &F½,óm§{]uKþ‹{Ý}iþÔo}OjäQN€$”³¯ïqÇ £ôtû…)ó;]8eÀ &…7ïqÑäÚ1I{Øï˜Œ\¼¬²¿%_ÿdl2Ñ?9›îŸÌÒwÒãÎ`å'±,H3ZJ¬mjJzËÎ0¶.Ðȶˆuß>¯ˆÈ›lŠHFhPD¢dsX?2_sXl2Ñ6Â5‡M5«`Zq2#Ô`q ªÆßŒÁü=‚Š3ÛLÍ5¯àlxÃc?™ñØ1¿Yè]c‚~ÀùÕ»ûŸëÔ0ÓAóqPz×ú±ùz×b“‰ÞµÊK{×òÁí{×à†ÞµÜó½kÙö½ki|}ïÚß«z×ò1õ½bf¥YHMÔàÏužw-v'[u‘ Ñiâ-÷®õÃóõ®Å&½kc ß×»–/ÎïäTÙ ~œá°€2ßß¹6ûSõhN>Ëú\.ΧÜíû{ACNž¯'²˜hljaFõ÷ö¬å ö;iYÓ†0ΟÏ^Äÿ a­ñ£¯kìŒ<ÈU|&ƒÒë#ŽÊúÃóé#²˜ÐG sV>è/k<)ˆ4ReCÝL£Æz͸¡÷©á<§¨}eŸZ6–¼“5©äÄ2±øs*"”º|Ez_žÎÍ]m{ÌÑ—sxÖÔ³çÝóË˪ý?dF»ú†hjˆbà®ç_°WD§q -©Eÿ­~ôyzŠÉˆRg×L£†à9ŸÁkÅš~*OÍüa˜ÆÿzH^ò?öØnL5õšS Á±"›×½Á´×œÂjÛj5òºÜâN7zR;;ADRÈ5A$Õý°n×%ÍÝðŒ ̓ÅT?sóåáS®ú`‹ïH³È¶³¬¹(2ì¯&)Òo¯Æ™I*BXx2Æäà .à¾PªÜB^Á'Bäùàƒ ð°}Cp9“W.­š³iì-F¤„ò!Ý0ê©$ÝR¿(Fῌ2Çendstream endobj 2798 0 obj << /Type /Page /Contents 2799 0 R /Resources 2797 0 R /MediaBox [0 0 612 792] /Parent 2801 0 R >> endobj 2800 0 obj << /D [2798 0 R /XYZ 64.9134 727.2935 null] >> endobj 582 0 obj << /D [2798 0 R /XYZ 64.9134 448.0588 null] >> endobj 586 0 obj << /D [2798 0 R /XYZ 64.9134 367.8527 null] >> endobj 2797 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2804 0 obj << /Length 2631 /Filter /FlateDecode >> stream xÚÕ[[sÛ6~ׯÐ#5 Ü/O;Í6ÝI§³É6Þ§¦´ÍĜڒW¢ûßï@P ‘r…Î4“SøáœçàäÍÕâõzi‘T.¯>/%G†0¾T #­1Y^ÝþZ¼*©4XjUŒqñá—ÕÅûŸßÿkU2ÆŠ7ÿ}÷óJ³âª„Å»ûo?üòvEŠÞýÓ~ùýJóâêíÇÕoW?-Þ^-ÈÃ?r˜‘JÄË›‡Åÿ¿þ†—· ¼üi‘2jùž1bF‹å †g,|s¿ø¸øOXÄ2†|sJSi(â”3§é»ï½è ø¶¾mnª¶¶Òï•ûõ”DxY2…´ ž&…Cv0íÆÒh,=˜0ðŽúX׿A(Í–Rp$£c&œ¶ž b *Ì©iø|DDXÆŽ‰l›1à©fe¼~në×4¡6#ÈÍéF½JèªÆDL©j0ƒÊ¨i8§¨aˆcEŠ’„¢@ bÖDâ\¸ñW+#‹úÁ®´5“{ûf²K0AÁȰ”V@d¨`§!@ªesÄ0˜åÅŒt€eŒ˜`„Ž‘0,0ò üÝ®ÝÖÕÃHXVotNi✸š ÌŠ»ÙŽ Œ"BÏ(a@œ“аD¦†V÷Mµ{µ*Å?šõ±¸”k˜”«|âöˆ3âRf¨I®¿ó P]$Œ£BF:kÅÈb\Ó|V#NXq?,¶âáDHd”’% ˆs¢JxŸ5„¬Aaʇ1ä‡zw³…àÓ¸(Ô6›u"ú@~¢ ²>w4dH àìÖX^ÌC,cÄ1 Ú ‰±<Ì/ØÇÍöûÎYÞ ˆ‰ó·VÊu—dvû›ËDí’õ-³ƒ<®xÑ|Nð"0’*$0;÷ä,¤ëýÚRý }=àá¿6í}bE{Wû¯ÖaÈ<´þ»k[-=·þ¦Daïª6€Üû4⇖Tß[ÿôÙÖ#›ÿæ$aÈÎNÕnä>Xƒ­XzÀ{†>[íÜð Ì¡‹›’Ö­/w:=;`³€í*!]úbÈÎöà‡@èu¯¹— š(4\Û…MpÁ® ïÆ xu× ܙ®‘ûÔìüÏëMë,E(11x‹AŠÚ2ðl ’K>ˆ'| Œ:.Fb’G Ó`Õ£«<šzçii7aõjÿà¼ao—n[¯­õut5Ö<÷ݧ.½ÃÐTy ‘ 4ÇdÈàÛ­3Å­ó±µ?ŽDdP‚q‚£‘{A@,cÈ„P 6eÈPFç¶bj+À[ Ï(j@œUÂÖC@%<ÕæµDM—vß\ð—xoH†çKÞ8é½T"% q_k*/ÍG¹oW(W™ÉJÐUžA†aáÊôÃGú_Fiäñ“œ\>&õvóP%<‰¤‰àbO ˆe ™ð$ÆÆF¥ì>}8à äUØ©d7 Ή ·`F ŧiˆwÑu>àŒ|œ00 I‡òÅG3Ö«¦#S6KýV Â!? 1š,?˜’?šÂN®rAfmNý^~¤Å×CüÖ›G7¾^v4'#M¤N¶Úb’¢C¤‰9ªŸš][¯oÆHØWûá{o@,cÈ„÷r ;L¬›³ý$ÏߊŸ`а$s8°Ó×üå[ʵwƒÍ¾µÿ~ÿž:üI~$_6ßÔù`ø±Òõö¡ÙíR;Laoúh4þbˈe ™°|0ÃJÕÖû¶3üzA6Ò¿‘B–)…”`ÓNÀ CÔ€./v‚]H!Ä9âpˆICiÛÖOG‰N2O:J¤B®Rt’•ÞM´œá&ýø|nCN¸É@Ò¤›8â«>ÎW\ä¼Gœœs‰$¡j(xpe\n“Ÿ€ä7صÌ:x6cùVü¦äP=Ï8¸Ôf8£zWíNå3ߌ±uUžck›ä={z×Y¯oGgý I¬­)„V—Ÿõw€eŒ8æÆ€qÉóº­Ñçѽ$&H3.óÉ×#ÎH0,²²q%–Ð;‰uïÇjצ/â¤DXóþfÂs>ºGL‘p[W§6V\³|Š÷ˆ3ŠS ›q-ÅPñêÆž‚[ÅC€#§SFäÙrƤ§’Fìjç$0>cÒˆ §’F,éqÒp1X€Ù­õ°ËÌîä)l6[9œÂNÛJ ;°•D˜aLÃ)•QÄ€8'"‡š 3iìÂ`–O€8'!,4e”§"͹•u>—ËŸy‡ésñ@ ˆö”(áiø°²»¼m[]7®¯¬iWŒÏã¨{ÔÛ‘§q‘Í6.î×_ê‘Cf[(µ\R(`ëùå`XÆ©ÎE{¸!Ía挋I])> þæÓµGœÑ•bf#@J×tó"D #\yœ±y1mD"a [RJ¬7‰ _bC¦:¿ ˜§’‡™Ïé_Ô07Í*n@œWCì“J ÅMõ/*Äù$ ˆ3Zk䆌ÏÈ¿;j´göŒ‘@ÅE´á9$‚œ2’0l`$SÍw‚#MmN»´ù.I ”{Pñ¨%‘‡]žƒ`#&v# ƒr§õgºï””¡ ÜûŽ;RÜE rPQ¶÷¥ºYÁÞí÷T#ží™4rºOØÓhÕÙøf¦  cãÛì4¡‘É>Ÿ¼G°oø3"ÿ®Õ½>ºÞ çEþ–³C¶—¢öÕSÍn®çLJ2»¦¥ó»ÞRɈªçÈá‡eøÚÜC<çBº¡ú8h Ïkw$æ‡ØžD{£Òýä› £ŸÛ8[„b#•WÓ`ÒPû€ñ^ÞvÐ#–1d"p)‰´‚R v\ èS•Ô>št-‡V—«§Æ]n{Ëíø³ÔìÃ=Íö&ܽ …6ü¡ãÓöçõKPµþÃ=ÍW©»7±áÕa$í[½Q7XÜúþ¹+öÆ~×…Æ~çûoºCÔ/V+b‡¯Ãp·âqhº—“Ò¾çö¡z­¾€}”›%Jž£= –1dbõ%ìÌ Ô³ý°AÐ=òÀT4„Öï7÷›/^ýOPVý³ÀŽÞÚø/€È«C¹]}éšS c6Z&ÛQ©ý¿8³—d¢`ŒdÌ âDV£þný¨°c’÷½üd?êÿXíôïendstream endobj 2803 0 obj << /Type /Page /Contents 2804 0 R /Resources 2802 0 R /MediaBox [0 0 612 792] /Parent 2801 0 R /Annots [ 2806 0 R 2807 0 R ] >> endobj 2806 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [378.7388 137.9565 406.1915 149.9116] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2807 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [433.5334 137.9565 450.47 149.9116] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2805 0 obj << /D [2803 0 R /XYZ 64.9134 727.2935 null] >> endobj 590 0 obj << /D [2803 0 R /XYZ 64.9134 676.5464 null] >> endobj 594 0 obj << /D [2803 0 R /XYZ 64.9134 293.3875 null] >> endobj 2802 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2810 0 obj << /Length 2968 /Filter /FlateDecode >> stream xÚÝ\KsÛF¾ëWðHV‚ñ¼ÇM%»U9líV´§$H¤c”ùPH(¶ÿývÏ Y£-k/33Ýô·7ïþnŽ8ÍõâöýBK☠#(±–²Åíú×¥!L®*F)]Þ®¬XnŽ»U%„X6û‡[>¶ïð·}ðÿ®~¿ýy!¥ ÊR½ ž‚cøôæ§ÛOè‚õâšH§Õâ~wóçͯ¿ÓÅú†.~¾¡Ä8³ø×”gÕbw#ДB¤'Û›_nþݤ‹ŠK¢¨e—¤üð@‹9LJ´ü“ ZŒ§¿N+Ì£@+^¦CRU´ÒŽ*„'ùêóLñ†nZh'ˆfÎzµýr8þ 7\#“KΣj›®…\ÖaIþZ)½¬M}k±Ýœ«;F¤Uv‘só2;’3rgˆц"6ûS[ïÛ¦n›Ãþœ[¡VdSž°´‚0aùøÂVÅ*'yɬЎhÎÙÙÍñx8ž3©˜%TÁË©Ñɤ•ƹåÍJ"Ú¢Ó3ˆ¶p¡5÷üáK»y-DgÜCô¤„=¢sŸˆè4¥ ¢3’SˆÎ™At1•¾"¢‹úh­ˆàÊÍ Z[ÏÕ³½o ’. ”6Ç€ð:¼@‡W€uº·?äƒÄònÅí2~rÜ 2Š™Á¤Zz3ÈõÒ~y¸`R0G$£ÙÈ£?Q¬r’#èç°äØGþߨ¢w ÑïW•âʯ']·¨Lþ—©4³¨Iö•+u}ØÕÍeDáŽXòx±M%ŠUNrĦ„ ”Bj4ಳ©S{ÜÔ» v„+ÊdAvÅ9v#JÀ¦bÀîeôwÒ–c0œáO2A ÆåšÑ5¡UM»¦bH}+ñš[¢5\M»&ÁIôøÏuL‡6:ïbN‡Uá÷r;ï_Öø’/?õÞ+ŽÞ‡¿‡?~oÇ-¢÷3™0Å"÷¤‚z?Ókhó¹9µ›ýýeð–Š(œ¿Øn½ª'8bµÒC©°8t1O¶Žbú}+ÖÁ4<Þ´u@ eÏ?qØøÛp t%_|Æ_1ÀOÊÜ>úasÜ5§ÓØvMá9ÏÆ¿õ‰b•“Á=ÀŠƆœvÈoömþ3­ ˜ÒßHúª‡4…Îíé¨Ƹy¾œRTHQ bù© Q§Œ¶Ý|X Ì8ÎYJ.C©tZ/½¥äŠyŠ¥¤ñ-%#9e)9§£–âUžîIA¤‘ªãÅÆ¥ÔD3x;`š¥}W‚% ÁÁµúa/ß{FzUNðR$2ÀT7*×á‘#ãa²è!!wòÓ±¹â<ðÛ$Gú”ŠèRÎöÂd˜~·…éååö멘‰~H5ï*O³+ûw§¯éØô\Åc2‰}%›¦€&ã2B¦’°åg ]E˯ÃCXŠi+œàuxt£ÎCŒœc€‹à)+¨|ÎiJA8g$§àœ3;çR }#A²MjÌLYF@®©µü&»(r ŠÙÀ¤Vz#ÈÔ2ÙD‘–ë¡È(N´Pä ~UE9å¾â´,xÍ!¡4Úªi{@ˆ”¥ý_uPäò—:¾žÖigM¥ÎtPtcËuPä$':(\>µƒ¢»]Å »©ƒbÀîõŠb vÓüuþžÕAQ©o$TsÎ_ÎTǸá¨÷[ï¡ÈÅ)·§UÔ{š\Gó]Ýðr}9ɉNŠ!£_×KQNÏodƒÆ•!T³™_op ŽJû¿ï¥Èù+üI™{àçB?¡BÜ/W!ÎINTˆœvÈGe3E9­¿‘f .81ŠÏìì8¸î$û6›)rŠe£“zéM%WÌSL%/h*É)SÉ97•ñn 2² çÅÎ¥bÄâ!Ë€óa7 gf7E9¼¼f7r «ç¦»)8ãá”ëëº)ÄWwS0Ûy¾ØNáp¹tì§À‘þG¦Œk,»§™½ô <øþÝÁEÚXº`1TîCZsû!|·»Z.ï°”ÒlÛªÙ‡ÞQ¬›ûÀ¦Ð 2LØÇ:ÜÖa`.¢F“ïŠa˜¯ÜàÀm™4•°¿†õoß{*qŠßzÃÃÁfõH¬Î?ö9¾ PM)aP¾8´=ìÆKª9Æ7ûõ•š†¥(°GK5³œàõšY7Êï ߟ3ç‘ >_Œ»Dp†=g‰rÚÙ{ßlÇÏ&)s:` 1Õ>âZï7ëð Ž/†Àa<¬5 An?0›8áC¼€µ«@Clé«°¿Á>=œÞ{ÛªÀ„À^*¬ÜèéÓ—X2rŸ àÿžïñÕ‡ÄÔqw sî}Š oO‘³Òð¾Þ¶) » þ’\ËÒÂÉê w% ÌG¾êý îш¤îËÕp¶wGr(IúÇ~Gâ øÞÿ{zø;tÂè÷xg—õ‘£x|^ï×aø®þ˜õtØ%wA þX¬¾åíøíÍŸ¸­xm’º«ÂÊhôȼ/™ãDÔG¶?GMxüÔ$‚¦Qެjã½PBƒû£Ü‡!Ó¼㣪. œIÈ<%K Ô=Šržðˆ\¬åD½ü‡¦¹ª£7’é 68û0ƳvØÿ*êZ?r#R ;mlbàk=Ô•WPTÉX«f\ªê»".>ú¦J°8âÊ¢pNØèšk‚Nâ҇Ǿr†ñöÑ’Ÿ5gþùè<º¬¨´‡+„á# ‡,vºÉð& üÌ}èè>à…·N¼oCá1а+x‡çú¾õç¿ð?ÒÄ´ØŸr²ïu ƒ@¤9µáj,á!qÌüñκ32ä*òÙãö<…ãèíã}WpLøÝÝåò‚‡a¦[¼5èÿ²lɬ°Ó°Y¢©{y%°#XeGZ¥€9 G÷ݰú‡®ÅgÐþ¡ˆ¶”_eG ×ÝuçøüÊ¡'B¥â»§TØáTB×ãÔ·ü~×l½wÛ~Áÿ²ÃORË»ÚûäÞT!àuPM‹{ ôëcÄ<ãÏŽøÐÕ a ™àzs$XIˆgyÁ{æUŠícßÈäCVì‰ñ¼‘a&jûxáÿ4öçɶY+ùòƒ¶D¯ÊŽx@ D Ýg'a1è :K§,Hë¿hç;endstream endobj 2809 0 obj << /Type /Page /Contents 2810 0 R /Resources 2808 0 R /MediaBox [0 0 612 792] /Parent 2801 0 R /Annots [ 2812 0 R 2813 0 R 2814 0 R 2815 0 R 2816 0 R 2817 0 R 2818 0 R 2819 0 R ] >> endobj 2812 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [218.5593 90.9882 250.9933 102.9434] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2813 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [278.6091 90.9882 295.5456 102.9434] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2814 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3272 79.033 133.7613 90.9882] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.12) >> >> endobj 2815 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [161.7142 79.033 178.6507 90.9882] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.12) >> >> endobj 2816 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [404.37 79.033 431.8227 90.9882] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2817 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [459.7756 79.033 476.7121 90.9882] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2818 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [282.5217 55.1227 309.9744 67.0779] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2819 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [339.5153 55.1227 356.4518 67.0779] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2811 0 obj << /D [2809 0 R /XYZ 64.9134 727.2935 null] >> endobj 598 0 obj << /D [2809 0 R /XYZ 64.9134 531.9442 null] >> endobj 602 0 obj << /D [2809 0 R /XYZ 64.9134 172.6957 null] >> endobj 2808 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2822 0 obj << /Length 3138 /Filter /FlateDecode >> stream xÚ­ZYÛ8~ï_áG1¼‹d'»È H²Io^2yPluZX·Õ#«“ öÏo6mç0ú¡i‰*ÖùUɧ×WÿiŽ8Íõâúf¡%qLÈ…”XKÙâzý¾p|Yrí¨.̲d”Òâõ›%·Å«¯þµ,…ÅÓÿ<±´¢¸.aBñüexúúͳ%+~{þ|ødieqýìíòÃõïWÏ®¯Ø‚ÂWäšH§ÕbuwõçÕût±¾¢‹ß¯(1Î,¾À˜á¬ZÜ]I%ˆ’B¤'›«·Wÿ–‰b9%ù%å,#ªvœH.…Õ& ²ËOø‚O¾À‹PVÁ©]]­÷…a8+F¢ÒxŽƒ8Ì9â„åé÷ž0ÅrJ2H3åÁ„Ygâôuw÷XDQ¦Â Füš~Ö£Œ¬†PÊÔ)Q%à”4<'¨DRÃ3‚ò£‚²ï‘ôï"Ã2dJNHIAL4˜”ÚÏ¿^:]Ôwèx÷2T}½Ë¬ÃÁm©Ö¨/â¸âÇ Ä€e4ä„)©~Þ@‘`9¥˜1DòJÓ’þ Šþ²ëÙ»f!ÖÙKr›(žc×2B…asvÛîÐßá5Wò‚&Šç8tè2ÂÌ9¬6Mµ{´,WÅßQ»qüKθ'aÌå˜(žaž; áª÷´{ß7ívŸI!™Ò—cr x†IHVD)aç\nš].ëÃ–Ðæ@§¾%ð„çJ\0ð&O^š6 ¼ó>B%yúr|Ï0Î)ä8kíœñ¼“pá0ª r™(žã|2¬™s9w¦8Q æ8É)ìƒr†3„™%\Jöó“(–S’Qš5®{ù´!»‰â9þ %Êè=oÔ¿… MÁü¬úgsòr.­þVïVäãÆ'æäŽ{LRt!(%©<ŠêPÍåBi(Y”øyŸMË)ÅCýYG4…øfMámÛ=‰Z¼¡á•s7ªÉΊLE`˜ªœf·,¥uE:z¨Ãæ&W9ϾÃå‰sEŒ…¨ s¶¨÷?(“ð¿FýÇž4ý-Žlÿý+éh±M³þ‚AÙÂeü¨KoÁ4þÓ|ÒÆ·ýmd} O4)#’\r¥èz»’i¡²ÅªmZÀŽWBÈÂOîáwV¿+{?ÀÕïÂ7ÿ™wêŒæ˜±ÄÒTx¢Í2š“ÖÓAÐ=J΋çqŠWv"´Á9Ñ)üÛ`©í’ƒVÍv·÷Ôç©ÖøÚ·è;_¹ D¥Hb˜›10pN×|ºõä}sÑ‚!QWséØÜ½AŠ¥Wq°~bæ0Ûqüå¶Y!“Ñó«ûû ~¢õ eñ'´!lšØÛ ž™ßů»:ÚÉ™£‡¾`9  ‚ɘ8Ž‚í>W]S}ÜÔˆdôÝ‹<žArNªn£ˆt2ùû9H„ÒEÛ©ÇY<€lÛz¡Ÿ˜„8ò¨ƒsçNo¼wÁ‹jZA^*]x‘¼ ý2*Î#g6[TìC¤5Ûà V!*ø·ÿö Qöm™¦z—±‰¾«ðWÀ…4Åó †¬ AnÔ^Ö ø3|àÝAO¶ËäÚ_ïÚ‡h{¢Ì/ 6›>:JÕçáÌÂU¼NðÛl¡Í‡k¦æj£NÙºMÍ´f^ å‚»S;¯¾Ç1ª,Á w€~€?ÄâFÈOWY‰b9%™Û:/çV+#ŸÛê.ÏË#ѵ® BžˆC ¤HŠ~™Ñ4MKæõàW6z¤1)÷ÃhÈý0=à2Ž0ð-F@ÕtÙ| ¥…ä—| R†Âçoáß»ªËHjÕé“/·uWg(CWÀ¡ÈJâæèxq­Þ· Lo=+(«*‰_k¾‡Ð{8ž.™[Hê“Åm|Š|Zm×9=P%øÀ®×C®°ŒMÍã—IkT¸`‹<§¥<,ìöÊ#xË#ÿqŒPø>H%È•>Pc(ëNi”Aaéd4‚LH© a`¤7t Ì QÇÜå´œ#WÕÕM¶mŸàeõÃxà ´îT)Ná º-·Ø¤~o"Ü5ÛO›º5=}{$– 4Œ€i'3!u:Iñ6'ŸÖï>‚VÆ:uDZTö¥æœÛ0eÈ^b¨±D¬±`ú=²O8Õ‚ù(7ßʬ!΄2¤ËÌÉPf¸4Õ{ÒVáÊ\ù„„–ûþBýäÓ7PB‡Dg¡¸i9K¥!ž|ÞC7ì8‡<º Å`ø‘Rc JÆF¨„g³r€vƒå$8 ò˜á “Õª¾MËCBud°MŒÆï&ꋲåáÐI(vFtÐÆEtÀ¶&EíCò/0”„Vwu‡Â$F¾¯i¦P±žä-ÿZBŒ.ÇàBSXwhæÞþXy‚›ÚÂ(ýpñuÛWžk1¨ œYQÀde.p®)–S’™â7fÀlãÊÈeÝum‡xæÙ„­„H*zœÛ‘ βT»|©º-Àä¹öõ(d­›ªÙäñ•klPÍ€¯¾7څ󨲋ÚGîþ~ÇÄadQÃKá߬úØBaÞQÇï6| -#˜ÏtÃ4ŸuÝ €Sº—úþ—­ˆ¡.¥†# ÏÊWe¡:ª¡ú>âmV;ið6-É µ$Šå”dî0 LÖôS2CefˆVè|í¹‹áÏò{ŒiâŒCí+èoé·jÿuÐhÓÑ+àC¿ô)øF(5C[^}ªçýþ:nYÄÃÈ* ejÿ"¦UHo½j÷]=îUx”ǧ»¬¤!‚ƒ¼ß©$˜­®b1êà$k²ø{å¦î7_VQd/< )ABS$p§Ä€Éâˆë”Òc]=lÂ6•2¾/Sóš¶SR™ž‚:è4—aÌŠ“ñÃ-mÚ…à·÷ú€$’+Gz™Ó« µš§E¿9n^û­ØM@NUÃXQo‰zÕ›R UÂE£.÷•Á7߯C Æû¤z{xÀG5ê ð‰ ¼‚pl˜(–S’|‚®(Çi¾>¼9Ì×À‚P¿‡‰â9Áü wf¦3‡uÛúƒ„J@òoNÖu{s$ÇÄ?tÕÓësçAŽU©£…»l1”ý^Xì¡áùºÞ4w üþ5“’P™ü%+"83³}ŽÙ²«M,›Uµ n6›r×·÷‘‡Ä´ß0ô•kÓ[láÔÂB{£Ø^ÿ€šÇ\ ­çÎnZ¿»Ø"¬ÁÄ·¶ð"¶êÚïKà¿ þ·ñëØ³@ðuÕjl*Ð.¹»1 R°-˜U‘ÐtÚ> íF¬„1Fb´Ìh£hÍMœ3* sØÝÐjN÷!•tÅ5þN[óøá¸—î mñ°Ðýa“4—”MQxZ0ëî»±øò«Øë =ʃíþriæB£‡Ú?{·À P€“sãˆbR^àžL¤XNIæÎb^ÏRãÊ)°/PhŸ­ºÅ35Y¼¨Å^«Pÿ‰25±ŒêÁ³º±Nls(~3øDö*Ô¬ñò/nwýüYÂ@±œ’Ì]’4á’+Ÿ¿rðþÑÛ’ÎÖò¶ÆÎ2£Òá±8{ƒÃDÃ…¾ÜŒ)Åãw0†Yû×U÷ÂÝPžòä‘Í9H”†¹ÌMÓ”î}'›œñ"@ìÆÅ®ŽÇÎq3+%â¯x=¢<ÚÓBÁ§¥›Ÿã?Cøû»d’ÿ6ƒ»«endstream endobj 2821 0 obj << /Type /Page /Contents 2822 0 R /Resources 2820 0 R /MediaBox [0 0 612 792] /Parent 2801 0 R /Annots [ 2824 0 R 2825 0 R 2826 0 R 2827 0 R ] >> endobj 2824 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [402.2339 319.8631 429.6866 331.8182] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2825 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [457.0286 319.8631 473.9651 331.8182] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2826 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [298.8577 276.0274 326.3103 287.9826] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.1) >> >> endobj 2827 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [353.084 276.0274 370.0205 287.9826] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.15.1) >> >> endobj 2823 0 obj << /D [2821 0 R /XYZ 64.9134 727.2935 null] >> endobj 606 0 obj << /D [2821 0 R /XYZ 64.9134 702.3869 null] >> endobj 2820 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2830 0 obj << /Length 3799 /Filter /FlateDecode >> stream xÚÕ\K“Û6¾Ï¯ÐQª a¼§­¤ÖÙrI¶<{Jr Ç´­ª‘4+ibÏ¿ßn€ A"5øàË E‚ÍîÆ×4šüéöæÕÏvåˆÓ\¯n?¬´$Ž ¹2‚k)[ݾÿcm“›ŠQJ×·+ÖÍq·©„ëíþaÃÖçW‡Gø~ð7Ýþ²’Re©^QOÁ <{óúö†Áºbýƒ¸&ÒiµºÛÝüïæ¿èêý ]ýrC‰qfõŽ)ΪÕîF* )…ˆgîoÞÞü§#HW—DQ˦¤üð@‹9LJ´ü™ -ƈSŠ_¦î£@«=Œw IUQÐJ;J¨žäO¨wÎÅF¸uj¥ š9ëÕööpü7œ#“KÎ[ÕnO8r]‡)ù{£ôº>nëw0÷ÍXíÜ1"­²«”›— Ø‘\;C,ˆ6q»?ëýy[Ÿ·‡ý˜[¡V$·\1µ‚0ay~b«Žb•’œ2+´#šs6d¶9Ç1“ŠYB<±œJLJPi{o Ds@¤âÜÅ;."Z+b¸” ˆ¶p 5÷üíçù4µ€CÁMÔèeê#€ä>ü¾ß ‚ÞÆŸ€YñÿëxýÔ^øŒƒpôùS;bþ7`pi×ì7ܧ5⿊,u¾9{=eÝ¥X4ÇÏŸ¶wH±}Ü×Zg¢Ù—MVb³³Õ[g:]WZg¼¥ u&$ç¬3evÁ:‹©ô{±N 3Ï”^°N¥ÜF<;ÞìÁMo]Mj2.ÖÑÔðÚ~d¦Á‚‘P½«ÎþÏì0¡>´{¶XßoëÓeJä/fC³:ím(UêûîÞN‡;b K&àÅÆ)V)ÉŒñA(…ˆ6àÒÏŸTÑÓùØÔ» »,“2YÝHq‰]çˆ Øºd|‚-Ç`$¸ÀŸd‚tAþ<4ØTŠ+oU YvÙ5Cê7qMß ¨R4”y×$8Ñ`wW$Èý3¼SÌ'ðß}8u®*M)Âax[šv\ô:‰hÅòêYuõ^'Õ×ùéa’^æg4ùb#Ž«”dƈ9Œ96ä±ó9˜¯µÆÒÎó¼½Óñ÷Ê©$F Ö)×æÌ…S +•ëÓ\^N ÕÚÏRz{øèB:6%Ça8•Ѭ6Ríóõ©ýžá(±_Ÿ 0n i”Œ“ëŽÐ!—›xc~.@ÄÃgù_|}xÈe»½…'“Q,¯Oð O§x)¯ˆc æ ɹ¼"å²³qÐñû ³V'©-Èl¤¸Ä¬bF ß:¢×ó.¨¾“­‡›ÝÂZ_9P¿Õ_µ˜8´. öötØTà±î`éÙ$¶yq=xðã›ög>‹í .•¦T”ž×PgÃ©Šš/àøšýÝ4RKEÞG¿Ø."Á*¡˜1 i‰¡Ô¹. ®ÍjËéø{1K •Ê,˜ˆ»ž¿àH‡ðôxU÷ ‹èË Oø+úY™{ЧB?4ÇÝötÊU”–ýy2þŸ«”dø'rÚ!»xŒê3­ ˜Ò¿“\U)EŒÐ k;…æ+"E}Š‘!F‚4@ˆõçmˆ n¤¦vMÜˆã Æ„ä\ÜH9Ç ï„àH»‘ #ì.V3‹a¥¯fÎc¥«f°’q3BX˜ c ²).±(9¡T¹%OƒCä9Œ—8„‰æ‚Ëœ§¹:¹.frß$ò‚`àQÔ3¸‹w\м–åLËùB°xj’—t§õi¿án}®¿´¥á¸ÕzŒõÑ6±ö™5¶rû•g—_Ÿ?5ƒ*êcˆÒ~¯v©6L‡F}zÚ#3“Ø'wh\ | LsØ×R¬R’¹Ø§‰FöOtŒRp†Ç²ùï¨ÇÃýácÐÀŸ”©úcWÑžjBS¢ÁòÂ#*Æa¶ CµùJŒŸ<œÂS IØm®Tlg… 1¶RH½ ¥}ØšÀôBØJ€šCW{ŽC˳Š3µì”Å.\…©ÃOn`Ä?4Ýù° ¬ùòp_o÷ÛýÇðÛ[¿ÐOùƒ‚ƒ-k)Íz¿r3WÞû¥.K£Ó– –é7•Fð]!ü¾Á2×ñ\¿ÛÞ·{@Wï IV7xß›·¿m*V qíðWÿÞ¡ÕçæD6•ql}‹¿ƒ“‚áný¿…ß¿…ßÝÝâAw=¡'×Þz¬·ÁOáwÍzîyÆ^ØcóplN À=ÛT^2)`½J (]I<Å*%™K8%8î† @ÿó}ýñBæïS Û5À5ÇìÆ *G!µŒSU  ¡+ùd”Éó.ZÚnê2@Ñ¡ì\LÅJ‹*f¤Àú¸=g Ë5aŠÅ~Çr‹Y$c äp÷Ÿ›àøáôåN²¥W¥§âZ ‹9°¼nTh<7›L0šhÆe'o%!ɺ@3¬dô€»é'Sh¥d9;Š "3 &ℾRfI‰vª· ˆÕ°¼X‡ípìwEÃYßUGX±<†ÊGh%mNáBÝØîÚî~g?8“JR·~ß@þ!÷½ ôgï·;ð£þÐgƒm)Åç[¼¡ŠaÂÀüªÑBì>ì)g—2qÎæÍÌ‚³ØÎX·þ7<÷×ÿB®Ç¿ûl4¤QÆzçíY:7w¡ëÆûY¹o¶mšé½s.b»§–—aÄ'0…q¬ ¾¼¦#X%3éRDJÀNµ„!7fŠû|Ò` ³Ê\ö‰BŽA¥¨ÁyQ1’xü¢þ½=Üûê~ÈqÝ2Žq™xn±‹¹r!&™¹0á èr³ßœW‰Ä]Qª¹"KñƒRÂvç…åRãë=Ca‡µÇA¼Äî:]Týà O­%–(Ö}Ïì1~jað…ÄÁ[É04·Uqü¢f#›x{tÑßµªü?†…÷—endstream endobj 2829 0 obj << /Type /Page /Contents 2830 0 R /Resources 2828 0 R /MediaBox [0 0 612 792] /Parent 2801 0 R /Annots [ 2832 0 R 2833 0 R ] >> endobj 2832 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 494.1678 134.8845 507.2189] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2833 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 494.1678 179.163 507.2189] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2831 0 obj << /D [2829 0 R /XYZ 64.9134 727.2935 null] >> endobj 610 0 obj << /D [2829 0 R /XYZ 64.9134 389.2239 null] >> endobj 2828 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F33 2063 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2836 0 obj << /Length 3293 /Filter /FlateDecode >> stream xÚÕ[K“Û6¾Ï¯ÐQª¼{Ùr6Þ”S)g6™œ’èŽÍòŒ¤HTl×îþ÷í¤@J“¡®T9 l4>ô×/@ßÜ\}ý/»pÄi®7÷ -‰cB.Œ ÄZÊ7w¿.\­¹vT/ÍjÍ(¥ËëŸVÜ.üáÇïVk!Äò›_^ý°²by³†ËW¯ÃÓëŸ^®ØòÛWÿć/VV.o^þ¼úýæû«—7WlAá?ÖÍÈ5‘N«ÅíãÕW¿þNwWtñý%Æ™ÅøL‰pV-¯¤DI!Ⓡ«Ÿ¯þÝ ¤‹5—DQËNEùáAsŽ÷eù''²#N)>.+¼GAVó1¾ÑµŽ ]’„ áE~ƒÀy²†nZh'ˆfÎúøy»Àõ7 –É%ǹqLu@Ôå²àÿ¹RzYì«â ìÁC9„;F¤Uv‘jó¼¶"Ϭ;C,,­¿Äjs¨‹M]uµÝ µŒÃŠä• ¶V&,Ïo캕¸NEž*+´#šsÖW¶Üï·û¡’ŠYBÌ8¤hLJ€´yw>‹fsZ´1D§ÏX´…Zsà‹zûx©EoÀ‚Kô!|¨ß•û`áEø¶1tø l Ý·ÙÆA›æÿÍ|y$úÏÆIL:¤ ÔŸv'DÌÉh2òÙ¦%®S‘Óç ɱ¾ŽÞô£Š"¢_­ÖŠ+¿™ðˆ3b6€?##fõñZÁ•;Ãma>¾É’DC¹›“$Íߘéñß7ÛåO’õÌÆ“IŒ:ž¤ Mó$Žœ‘'‰È)ž¤:¶<Ùømh¶wš%³üYXÂ7OÐ.¾1Ên‰Öðiš%r'ªø“ë…8rÀ×ë}T<®CLÁ'ANH—}iæuh½ ªRŽ$'(’ª™eÈüÓIÊçß»žKïVà´ÞRB ˜fªw$±/W˜r„3ÌÅÓzå,µç³”/¤FUJ!ì™U™äTñn¿+c¡Ì?Þí}‚gÀØêª<q½©‡g˜»ÜÜ ÷΢ñÌP)KÜ ]Ä(oŸzQàõ`ƒ¹à2ã].M¡çcÚg‰³BÁ6)õíâ£q,“Ù¹› ³ReX(ÑÓí§pÞW| ÏÚí>ös›ÚgÐGü¢+0Û<º~W¦­á‡cʾÉ{‡øg§>Ÿöó¨Ã§ *síái%$ÑL³Â]#qŠÌÅ;M¤0²›¹wÙc©€0`µ!~]#ŽÛ‡íÛ€Ào”©¢ù\åòM‰R4FÈ‘)ÖŒC^Š;Ùó¾áâ7Ï¥0‹!à@öU“o›]aBL‡«Ä¦žg¦I¸ÚéH¸J-5o m7¼;_=9Ñ_ïiÙ†ª°]Àþä Fü´xxãÄ»±òã6ÕæmøÛ3ÈÑm{ß-k$M»ÀÙvo~˜ú-K´IOûYæÖ¡tר„ZaCk_oª_Ð×+…ú I’V¾÷Ýë_šÛ‡}Fîöå6¼o+êÒ;DÒ€Ïúò˜gÃ5*2û$!ç*’×Ièg8H9Á­*¥~¾/‹שȌ/ Z@Ûó'ÃÛ÷åækžY¶Ðàñ ‡µ|•Y-ˆ¯6µX¨¢¥ss.6J<·X0-ŒÎ-–e»ŸH ÇaŠ/ܬœ^–¸ÝØG}hMå (+ÕUÄÜ…ƒž[h·Š¨>žI#pJÌ@Âð¬áÝÄ-$è½þ–ïu1 ss|>u£Äsú·\D_ßÓãA±C@Æ8£†Qâ 9¥`Œ²¯`z>øÍvógÑÖ†¸U¼žì'=“Fb$±Ìé$‘8e$qXÏH ’H:¢œ°‘!>~[nýuÏ¢x™÷4Œyø$²ÔàÔMeø—öcyëDà) ÖM!ÅA=8°i¶ú¦y–é}€+âNF?y8†lºlZÑ 3qÉ̲ºÏà¢Q\˜æ]?I檬 ú±Û÷x)ÊÚà#ûè=æ]sÕƒ‚MQ5èÞû°ÜÜ i …Ð|÷->œ£×â;=÷ýüá™ïe·P‚ÐxádHqH¨‹ÐŽt(Á28‹2—A¬9¶.0˜ö¬ÜG òmE¯ÉJ`âÜyæÀΜÌl,šp¼ú÷04IfÖŽ1LRJ‚q˜Ìb›OAZ 9}‘·éزvæôò”ª»!Ôíg<—é6$nÜ»í¡ìø oãK Á6ÊþÕ퓘ϡ„Šúg6J.¨èïS-.¸ 6†–‚eÚ†æ¤f *vF39@sZ¦T°JŽË´ž‰¥Ø³<Œ‚UqmŸ BåoFÖq†öêò EÌwñ•×Oƒâ¢'“õÑþ:0Þ¬cýï`°ößµ?]ŒÅ‡?¤ØÆå.–šØŽÉ"Š¡ú ˆ"ËÎF™ ™ö6¬=QÆeˆð•1Q™l]Ê8Ñš}°96\°>¼ØqE´!˜'|—ôg|YpºˆÑî ºÛbO+õe·­6^¬ªË𛇡ßòÉÌÐÑÝ"²ìŠ}qÛ…¥æ•ûm£:çׄlß|ñ2ÌnÅsüŸ0ØO}wÜÜâѽÁœ+ÛѺÔA—†úÊêØÆ¼úèê} Ý"Þ”ò&ˆ²&šØu–‹xy¯3Aœ´„pž®ƒÓÕBjßæV—J/‚Ìí¦\‡öá° Ä µ~ù¾„Ã}æ•[f ÒÚ®íCÞ_ÿÏÿ—‰Éƒ‚}­hÓœmgˇ K §L’²ãÃÃXMÂ4þðÍX“¤'j’vX ùv7vZmÄ÷c½u!ÌæŒk¦ ¿0ÿö¿Lú˜(ˆ©œÑÄh6ÈÅ_à+–7{• ZÈ13Ù††\A8PO¬Pst!‰ëTd†à·²›Ù·TÊýã×â\‰'Y.8Zõ®@Cþ³òîos¨•!˜pl¶hˆ¶³aÒJ<ƒ Wøc53€$íÌÛþ!ƒ´›•Üz³êÀ¦QDÙäwq|ÿ)|>lÛ"þºnº8øë´þ·‘ù³E?6ž- <i.e½ñÇ¢Ÿ?ÄÃF±t,ññµç§ q†Šùz~‰Àñž_trt0þcÜbçÏ ðêYp ÛÞ¹Xv'éû2-þ|=¶k/j‡^üÈž¢iÀ¼Îõ2ÜcÍÐàøf“ô•endstream endobj 2835 0 obj << /Type /Page /Contents 2836 0 R /Resources 2834 0 R /MediaBox [0 0 612 792] /Parent 2801 0 R /Annots [ 2838 0 R 2839 0 R 2840 0 R 2841 0 R ] >> endobj 2838 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 518.0781 134.8845 531.1292] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2839 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 518.0781 179.163 531.1292] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2840 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [496.9816 100.3489 516.6856 112.304] /Subtype /Link /A << /S /GoTo /D (subsection.7.14) >> >> endobj 2841 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 88.3937 99.1185 100.3489] /Subtype /Link /A << /S /GoTo /D (subsection.7.14) >> >> endobj 2837 0 obj << /D [2835 0 R /XYZ 64.9134 727.2935 null] >> endobj 614 0 obj << /D [2835 0 R /XYZ 64.9134 459.0177 null] >> endobj 2834 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F33 2063 0 R /F21 1557 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2844 0 obj << /Length 3299 /Filter /FlateDecode >> stream xÚÕ\I“ÛÆ¾Ï¯à‘¬2Z½/¹¸âDN•+årÊ““å5‚dV¸LHLdýû¼×D˜[Nt‘H ñáí[7ç»û»WßÛ•#Ns½º¿Ò’8&äÊJ¬¥luÿî—µ!Ln*F)]ßo¬X×çæB¬wÇÇ [?5¯NOðóèÿÝüzÿÃJJA”¥zE=‚Sxõîõýƒ+tÅúqM¤Ójõp¸û÷Ý/¿ÒÕ»;ºúáŽãÌê#|¦D8«V‡;©S ¯ìï~¾ûGHW—DQËÆP~yÀbÎñ!–¿2ÂbŒ8¥ø4VxŽVû1>1„ª"£•v”P!<äw(wÎÁF¸uj¥ š9ëÅöóéügÜPGÀ&—œ·¢Ý]Pr½ *ùÏFéõö¼Û¾]ìëk±sLj´Ê®Rjnc°ƒ\à;C,°6dqw¼4Ûc³Û6»ÓñšZ¡Á8¬Hy†jaÂò¼b«±J!ÇÄ íˆæœ ‰­ÏçÓùšHÅ,¡ ÞXN¤hLJiûl ‹æ ‘ŠPŸ˜´h­ˆáR.X´…Zó[ô,¸†¸³ÞaXù­> ߆»­¡Ã-°u0tïxJ‰õoÎh{¨ÿ¯NP¨ž†Îó‘”í~·½LûPÂÿm"M|hV¦½¥B}w:lwcçáŽXÃÜì<±J!3Î#¡|f@¥wž7TÑKs®·‡¹<“2Y܈¸D®sD È6rÇŽ.…˜`Ëè“LƒwôyÓüfS)®¼WdÙth*f©_$4}d ¯†š…Ф4ÀñY¡éÔ´¡Æ™ËiSq»~€Dæ#Ì;¼É×ûøÕ®>†ÿO~}Ý~ÍûDivŠeëYõ‘&•QýûîÒÔLJQ]!¤" í–ßì½±J!3Þ+-1”Ú+B‡ÁæÙ~RLÎ_ÐOXI?‘ŒPfØ‚ŸHI4æåEé1¸Áé© ÂDZž6ü„¾b†?Ësoø)ÓÐóì.—\ª°UáÉú›-?"V)dÆòÁ\œ`lHigùМ=5­á¿Ð Š ý ²²d!Ë4ĻԚ N¸z¹\bnˆ¹ Mbýqr•-vn»£/m?…+KÙ!!¿X:+’ÞIz™<ÇEÂê‚ÒιGOcÖ9Þ¢°?ª=ÿ8˜t!¢;¼Y¢¥2„°É„èè¼¾MaÊΰOû”e—.f"_Ioª‡‡ÝRoJ q’=¿7ým{™JaþòãÙv,­ÙÕ—7xu¾Ñ¬ï®ug u :tŠ8«o6ÀˆW%€cÉ8p-©E÷Vß ½¿¦QF¬ºqà´CèF¤µ¬EšÅ´W>¦qK#´ë%Í2ÛàÊS+?mpun¶ow{ßÉ7úÈI’>÷·ÿàÊ#Ïõ;œøØ¶mjI+|6Ä`žRu›ñ—ÊŒž$Ôk•*G`\ P)B¹0/Íö<¡@ZP‚-Þ}V†)}û¶6¿>G"åÅèëç Äs$š[9 0 T^ñìt[B…„ûR%‡ÛY›‡Ø‚›1~+aölçs5ÖV)bFe 2hxÿâI£§æIŒˆK4 ÏK9¤1o÷ZgÐCŠ—ˆ„@ÍØ•s¶Ï%ZÓ’ªŽˆK$:A î¹h|ˆå#Ø!˜Ú`ÜbÐ2·ï äÂêàfKoßaŽpU7Å,Ju|ç¤'€k1ét)Ú:¼YâÐS¹56¥.ïxx]ƒ:J‘ñæÉƒHÉ©)yYóÇbAåSŒºˆ7Oö³`•R×þhßdb¯„Z¨l<ù„MÀî e26¹  úÆM¦…M ­„X:›ilתO6ô ‚lµçêl÷Œ‚\…'ëÛ/ùÍ ¸Ñ-jõû3¼ö'v"¹­4 }jç-Y>‘ûß®â3.ðé  q^F|ò)>_Âæ4Ê‹¤õŠe㞦¢‡ÙÀP}O‡'Ù$ eo8ÌÖé8†ËÜ«+<îê½Ú#Ì©,ægeˆƒT.ß'€Ó ?.ЇÄ>K_€á¬›1K†;Ü‚ªbLv€ó\2% >´fÌ&ûƒZä“cO§‡KñÙÎóÉ™ 'ÚR>Û"6§Qéit§N¡ &+Æi\àÔü›1YFÙ£7éTøÓ`‰loùEÀyN…1„càHY=>ÞN¨”+»ãŸÅ©”–h<¨QŠÓpžS‰§½¬Ì1šS©&Úq6ŽØU¨Ö$¤\h­Í0ò¦g“ñ`2”죳É.M‡Ï³Ga)”«Bé¹Hç epÏ%8[à|pÄ«À\ üÍ»×z–OÿªÙxd\ÎfNjíl¡l­—Ⳝg”kF ¹± £¹ˆñòй“ê8°ek1¶‰ÖùBñ”ø—„–Næüƒàyôendstream endobj 2843 0 obj << /Type /Page /Contents 2844 0 R /Resources 2842 0 R /MediaBox [0 0 612 792] /Parent 2854 0 R /Annots [ 2846 0 R 2847 0 R 2848 0 R 2849 0 R 2850 0 R 2851 0 R 2852 0 R 2853 0 R ] >> endobj 2846 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 555.1391 134.8845 568.1902] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2847 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 555.1391 179.163 568.1902] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2848 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [444.6663 66.4057 472.119 78.3609] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2849 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [500.856 66.4057 512.8112 78.3609] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2850 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [84.3959 42.4954 111.8486 54.4505] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.2) >> >> endobj 2851 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [139.1906 42.4954 151.1458 54.4505] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.2) >> >> endobj 2852 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [337.6996 42.4954 365.1523 54.4505] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2853 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [392.4943 42.4954 404.4495 54.4505] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2845 0 obj << /D [2843 0 R /XYZ 64.9134 727.2935 null] >> endobj 618 0 obj << /D [2843 0 R /XYZ 64.9134 496.0848 null] >> endobj 622 0 obj << /D [2843 0 R /XYZ 64.9134 209.8252 null] >> endobj 2842 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F33 2063 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2857 0 obj << /Length 3849 /Filter /FlateDecode >> stream xÚÅ[KoãF¾ûWè°@$$êé÷c/‹I2»˜ ;3›8›C’-Ë6IÔHTÿû­ê—H‰¤ì˜Áb€!Õݬ®î®úêÕþúúêÍ?íħ¹ž\ßM´$Ž 91‚k)›\ßþ2uz6çÚQ=5³9£”N?ý0ãvúñûÿšÍ…Ó¯zÿýÌŠéõLß­Ÿ~x7cÓo߃ogVN¯ßý8ûíú»«w×WlBá;ÎÈ5‘N«Éb}õùê—ßèäöŠN¾»¢Ä83y„wJ„³j²¾’J%…H-««¯þ“ ÒÉœK¢¨eç¤üð@‹9ÇÛ´|Ë-ƈSŠ÷Ó ßQ _ÓmRó´Ð9ì$¡Bx’_ãpÞ8÷NM´D3gý |_n–¸qíÂerÉqnSîq×åt{¾Ä/á¥~XîÂa¡÷÷™ÒÓb]eq³Z†¾M•m³Ü̸›ÖžÌ=P893î‘VÙIs)¯ÛLòÂöpgˆ…}iïOý´]ž2)˜#’ÑÆÈgˆƒ LXÞ- óLqÞ$yΣàdʱ6ËÝ®ÚýJ-7õ6õ«Ù\qåZÙ)ûŠYBð2Þ£¬3)aã·ãéS?Œ!Ú8}A?,¼hÍýÞ~S­ë͹†I åîÿ©!ÅŒ¦!ƒtÔæ kH9¢†4HiH“Ç ‡;¬#£íòø:Òln;î ë0½ZØC¶äÓLðiµ«‹›rå%¶ž 6}:—t´zPé¿ûׇŸ¢ FA®VÕ}ø¹Ý-oQêH¬¨—$Pj1¤ˆ ÆßÀv­ãÐæ9J°ÎB%ýzÜ•õ™1Á‰äVO”SDË`8Sœ7Iž Š(­Ýqf¯ËÝúèX¶`ÄÏéG}Õ±XC(ejh­œÂ~€þ·ÖLñÂZ9 ô¦k­|œµvÓÑ`߸|!6¡Ï,IF¬ä慔؟¢xž&Óöè&>C,8Nê1õ ArHÒ0drQlªM¹(V»¤„0¯Óðè­er¼gŠVÌ!z¡Ì龳ׯø¶ÜoWÅS·ÂH#ØKI±^RÏ¥´Ýåü“ŠŠæhmÚ¢(vq6OØ?‡ÍR*?þzæôt¹F{±3³Šffß1!D/R‚ô‚ÏสÃ4QΉ‰âài7‚ê$Šó&ÉÕÞŒ0ú8s‚UtS¾Ü×»e±>c„ŽñQÙM/±k5xSFµÙ­Î¼S.¢PàJŽÇa¢xC´gÒÉ6ƒÅª,öÑÙûnn|ÿ²SU`­ùLñó‚Z0²úDªm]V›3.A=¬Ñ# A¦x‰K)ü䉬Ê}\hR%aó »••:°uRŽ©| ’CÊ—†5•ï² poœÙˆœgŠ8çÌ ¦Úœw —ŽhsÇe¢x‰KÅ1·&Û\¶…iNœ19ÎÏ‚2„€Ê)Á\H€¥à¨_-3‰â¼I²Cf4#ÊRqœ¹ c¾Óx&Š—84ŠX .c‹Ã3<UÄÙN3«AL;F}:( 6߀_ ¼Hë^¿ ‰â¼I²ë À•cTgî;(EtÇa¢x‰Cˆµ98(Ç(>ë;‚ž“bÏ€^) í˜~O“äôæa-z@¢8` ·l<–Á sÁƒÏ[ŸËç‚( .Òx &Š—8„àEKeÚȧÝre^b¤¥0ÄX1¦‘n’’”4ìLRN–Åácft{U1„* ñ„ã’€r;b'Šó&É.Äæ„Jvœ¸©’“>ƒÙí¿À`rû[!•cz4êgG0hT|Hø,ãOž´Óø7Hÿ4ì’ñãñæ0ÿ&‡/5þùZƒOãó“ø:|úír¿ð¥ ¡'ô„Ë“\r'‱ÓtGH 2jØ«·0œ7)žï “Ä êŽó6c‚«ÝÛ¸×Çèà£_çþ¸O¶•ƒ•rc›‰¬ÎlX!3ÝH½³KM)¤ºšÍ³Óú!”›sÓ¨1þ½Øïñ`·ÓEYÔËÛðÁc ŸÀ›ÁÚThò#ë]ª[k_g¯ÓïÝ: óE*x‚@AWѵŽ9Æ&œ2×ö?pç.˜‹…¯T»[ ,¢Ý‡Š™_©Ç•B;XyØÄšÛ}ù;^XÆòÙ þxêàqd4ŸG<»ŽÊ^+¡E:€ú²-Í?c†ÊKô\iƒ²Ž %Òä þÞÅ*æ½´»Ä©P¢Ž5jÒq,6JÇ|´ª»ÐˆUÉelÍÛHf "nú>«¥žFе¥†Ý­ FqT8ºÐrTÜ–‹ºÚ=…O*LÖyþQgKGüΉð鑦Äx6ï<Áu•æÇ³Í<ÇJi”€–tlb]õ¿ÃŽr1ãfú‹¬ÈÎÖ/ÌË7.^J9ý„³…¹öå æ³´%þ#ÿ.ž“-#NÊvÖñWÊLÇÇ·ppŸh(¢L½;t\Æùã$·oºŠeå,årïŠÕ~Ù I¡8òäa@éKÕw]BÁŒMùßnÎüm˜œŽ^y§€P]!vhŠ…m6½ ïwðzؤ2aíaû“„îÏØ]¼Âæ»ð‘ ò†cq’ê€g‡Ýx [†›¥'½ gY bó]šª% ëÜÂQµŒ b>P4ÔÃ>qƒàrƒ"q¨Swpž““YËœoÏs¥–ÌùpˆX%#U λ2¥ œ§ó¼§ÅKÛWÏCeá‘¢S\¨uMì &Ö%3¶©üå¯`hþ@“³+¦~ÆÓ­Âˆ}hòz‡/hG#Œ1ß"2uô=Ž»]ÞTôxPáòÅêN±ÓðcÄ…U€ ˜iˆ@dÞ˜ð¦ð™`È•÷›jw…qî7ìçDQð^-+‰â¼I²Ã¯DgË¿yXH8îûñª]ÝìÅ+ù\¼:•b 1¡Cø,˜ö ‘ý`eô9Vivm½õâaeã±JGÀþOˆ:uÒ}ߌƒÃkÀµ…w{Á®BëÆ‹qá[=IܴͲL $>‘Òx˶ aµM¸ƒ±Ü… &)^BªÑ†ßÓ٧²=9vy³‡€¥Àú£•ìVjŸûprXH˜Î–¢Ÿé7_Ú~rß`5øÀ¦×xì=ì=±Û ëÈëõCpð!!:â'Õ¯úh¢ÛÐPýè6œ¯Tƒ.©zµæ3ªˆPxËç¥nÀæ°¾Yî~/vªe \Eé_µ¤¤=ªvÌR~Iµ˜¦i!xÛ ‚£¨>\{Tpƒèc¼î2™ÐW'æ¿øÛßþðîŇî%œÃ=éLJånÙAïë‹ðΩÙPÑjÜçjþN<ËàÞÆ«c‚ÝßÇåÐ má/“Â_à'ÙÚã7ÇètÐSá* 4nŠõ2ŒÂU©]ÑÅYUÈÇcT[eúl±R„rÆ.H³#Ö%‹½?d@4*piNÂ@`Ãï‹Ñ- DÆ+Ôt_›/P¹WO¡—‘c;tsl>¶‹“<ÄuWáGBE Ò ÞÊ)*â wGÿ½iýÑm¿Mœ#0ƒð$ÀË/ÂeûÕ#ñ8Ë.w7hA¸9½†ð,$9ÆmˆÃXã/ÀÜ–0F™K8@¹ `ÉS‹"XˆG}GÈApF½ˆ@tMDøðößï*À.u¯ ¯æX%ÀÀ4Cæ|PTf|@M¼°<¯ À½Çæ Ý:ÎÀ! Fûú´vs„Œ¹,€>äTµï CcÉ#8Ä7GkÛ©m8€ViÎìEpPŠv ؉"L^cŽ-Þ}ª·‡àu{®›È€ÐðÚ2`ó"e}îC‡ÙÎ`uœnN€ éFÅü@ Ö›Ðð0&`žX÷ Lƒ˜`DhöåaÁ~[,úk3 SN¸k3M’µ™<Ì+üî~(,h^8²z£p×ðo$MeÓ.£*sÕé”%‘BË>Ý; B‹A$èWT hÝ‹„s~GP,ðÏE½ì<'CŒ:Ù²7ì´õÜ¥5vð¤†H–‚;nû%ÞLpÞ xŽäR+b¤eyÞÁd "Ò©ìß-ê¨E€ÀD¢@Ÿ‡<S¯«èšì1‡ƒaD×Ùk’cr°·fnV‰‡#ªî|NqI)ÀVq›°íN—Ý'Öä¸ö9tÊ:¸J+_Åò,–í×:¾îÃÃ´Ò ³7V~‘ç‘¶b$â—ÜŠ3°'Þ·ÍA§–K'‰Š`š@Hw¡$…;¹ÛÇjuâË¤ÊÆ¿šó¹“.Á©yÍ* ¡E6Y>ó ÔSŠ%Ï”¾ü«áNÑ<*×sÈ”.z,„Íq’ÿ‹Ë»° ˆ8¿ÏBóˆìTñO:澪K…žéxtØ2;ý³æQÿJKé4endstream endobj 2856 0 obj << /Type /Page /Contents 2857 0 R /Resources 2855 0 R /MediaBox [0 0 612 792] /Parent 2854 0 R >> endobj 2858 0 obj << /D [2856 0 R /XYZ 64.9134 727.2935 null] >> endobj 626 0 obj << /D [2856 0 R /XYZ 64.9134 617.6229 null] >> endobj 2855 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2861 0 obj << /Length 3817 /Filter /FlateDecode >> stream xÚÕ\KoãF¾ûWè°ÀÈØ¨Ý/ö#@3ÀØ6ûˆ‘Ã&9ж<&V5Çûë·ª_jŠ­‡×r°sÑT³ººª¾ª¯š­ùp}qõ½™XbW“ëû‰’Ä2!'ZPb e“뻟§š0y9c”Òéõ¥Óy·¼œ !¦Íj}ɦýUûŸýÚý{ùëõ§‰”‚T†ª u¬Æ»¯/Ü¡¶ˆ+"­ª&·Ë‹/?ÿJ'wtòé‚mõä ®)ÖT“å…¬@¦"ÞY\üxñ$p%Îr‘pœg+4–>Q–É¥pÚ5ŸWm7ßÕq#A‰4v¤¢SÃëȬ堣 L€øð÷ކIâ,9V‘qXŠÒv¨e»ÞüB+z_/6s¸`¨ïÐyUE³2ؼQ1]4à” ¸<7ø´Ùø/~¡Lv›Þÿ~¬Ý¨Íÿ½ócûÖÏ2PÏjpƒ‰Ó¬Û®ïêç«’>”PcYÔg„¶+˜lñì'Fíîýeÿ×Q»[Ô¢^àHã5Ä›øÄ"ŒrºÖ·—ÜLÂÅ|‰7ç+¼V×Þ‡åà ÎÑ“†0* ¸…[UÜ)¹hœE0¶q !‹–¯{¸]2ަ¤b¢:É8 ¢gA;PùÑ» §žÿ†7ܬÜ}öw77ðÇ,j*§Íö‰U´_×§óüÎ… ›’Ë™”ÕôÚ[À ¾›ß×8Û"<óÛeUy“?ÎsÉãEBH+•Ê»¯`È*?€ÉlÄLR @,ÍÜ啯`ºwþÊ‹[Ö¿K¢«(& ózÀF‰³\d°Ô®•ÝÎŒ*ÞÍ×ý:ö‡2\%dÉ£}¾1;½m}à¢Ã[ sÉ© ¶‡¹à¤â¥qa·Ù×ݹo;?ÄÁ¨]®/g\Ã8DÞÒCw!BJš(štûa¬¼%’&g VPf½òŸ7~óÏ!|6n>¯‹»}Û ªŸ›Õgÿ}ÿÀ)¨!bN\:ZcYpˆeÂ-Øáo¯á_øS;³àgí?ú ¥þôÐn“Á˜8, ï~îæu|Ê‹@ÔÀâJH°D³Êì7d‹5Ë}ÿ¹ñuMTm˜)­)÷iXÖx~Æc!„Œ5@hY«³L#¼Ä»¶Ç’ÂH0º…€¬*î‹ÿ‡gŸ\¶Xxu07ø˜ìb¦ØøQ«6Žv†ÅKW€–1s÷Å<à.õéY .fÝ5m×ôÏPVAµ"C×vº!VBç³…šåªf¡Ó»åÚà”M˜=ùìG:÷é]$ºoBÂu²r»\Aì¢ÅÜ#ëÞ \ù?þÛEHx°)¹J=a<¬ë9Ù8 ¾yh÷1ñŠJè!Àn¢U\õÁÕcÂp9ŸmCI‰äÏb5ê°ëé¿]p÷›RJaTceT‡1dz”‚ZÔ¡žù¶IaÔÄÚè¢lfÐ?Ï»B„€!d˜„. 8a„ª„ÆÁDX4åôÊ0ðîdž<.úP„K~âB¿órýt^Ë¡! jÅ"8¼§~º´P«12Gnh ƒƒÌø¸¼ ½)Ø–>¸ÅãTn Õ"+CRLŸpðC\«ó4ËèÓ΂‘Ëð(aõ¸¼™w¿Õ£«}÷¸‡­E¬11sµ.µ7m˜Ê»Ÿg<&¨Pâ\F­MtÜ@sDæ%ãÛ”œT0ØŽ_Í ’ÄY.rÌ $« ýJµ•ÄTp%ÆF’(S% ¿ 9Æ-=´]ÜÓYçX.ME´Rjˆf$˜yKåÈÊDbþîO?½ÿç»C)ŒCSÀ>¹¬_j *v(ìaÒ*Ç7—Ž2àç.„ýÍ0 ¼o4Ã3ñYÿ¼Uš3‘ï\âª}'àGy&´ŠÍж+rdås˜è~ ù¶^7–õÂÿ½˜÷‰@À»¬¥z“$Þ@[ã<Â[ô~Ç#®¡iÑ«O˜01¬¹E¨†Zb¹³ÞÛ±ˆ#=4’îuCÅp¬S¬ó_$"Ãc€ì: X-D%ËÁ_þ̶®|/‰‡ 0N›ÒGŠŽ\OÄØ¶âêkG¦nœéæ}Z³#¦~t: g•R?Â4‡Ú"£–Ÿ !L84‚áûo¼¨aŽëöä6(ל#†¬è/—³ ¢ì;ÿñƒÿX¶wþ‚«±JA3\e½pa–ŠÔ§ÒWWûg2P»\¼ì­‘ƒé¡wQB˜ýF,èvÙô}4b¤÷>Q5;½ô¼¥Û Û÷—žïü÷Õïõr@Ì ¼ÁŒ&\ëÊ!לï¤0º'…)¢,·;º?¹º¨L] ® ·¿Ã~ñ-ˆŠ1ŒŠ­ìÕøPVƒç] ÜÞjÇ«7Vï_§Y‰«·ö;d§LýÖþb%nô‚h©üö‡„>r?·“ŒNWõr/‰3e¾—€ n@à Hî'pŒð´QÓÌÓ7 ¹Z+S o0‘³T¥‡ô (Ò7 /:¹Hßðwj¨œHà"Rò×Ó·$q–‹Ó7lŠ93j;óúfŘ½áÊ={«üö„wÆÜ_O+‘´™P0µÕÇAûÃû¿~ôŒ |µ—^Cd©ã¤«¥(­ÜERšïõ`£Z‡†µîÛ¥¿Jí–­¹ñÿ1bkxCηºÐÿnšÍ¶Ývb§v½¦cÐwn·wŠ;•à>(àòð«q&óJZWv˜»Ê%kqöm¹¬j¬S´à¾wïßíñCt©\¨â¨D¶Íûý;¿Ïùº´›{4¯nÃM߉ˆý‰…að˜¸/mïv¤äÇ“ä¨-LûT#”XhíâŽ>± ²NôcÛ½ÿÆs&Ü#)Ïi9-mgGsÏ¿à>Nãvìƒj»VJgÊÕüP:ã4`ú5I9QŠÂkÓY’8ËEŽÓ‡Š¨ÙÎÓYÁXáòç_ËV[ES (z‡[,Í$Q¾œîMäêCîæ --3gðN8ËE¼ß`g–†à1¨öùKiè/¨=ä/¡$²jUð×®™ ³7ÒQIb(«^m¥(p–KÉ—V‘F¡†·õª]5·õâä BJȶ› oVàÂMUÏ`Iâ‹ âBMöâ°ú&¼8•ØlS1¤%åwè€~ˬž1R½þz8Ë%–^ÈQBÛ‰³7èÛõ¸•÷+Óëõ} ‚ ¸à‡@Ä žP ­ˆîšÍzQ?Ÿ ˜¡mÚ˜ýòžmq'X04V½>íE³Lb)ëiB%#Œ:!:Ëá&¬ œ²ó­ <¼a)„®`m~«V !uÛùz^ƒ÷‰Tu(ãA®»fÕÿÿ“"n¡šVg$E¹È¤( ;!÷¸,¸™a1ÓLÝŽƒœT­¡?µÛËE'Ç!§×j.5ÄóKu&p¥ŽƒRçÌ 3#0K;´…"•J¨n•¥c5BÅR¿wšœ/W{Og˜ ‡4Ž!Îfö(ï°Ù9Tyè{ÅÀî‰ ]}G~t­¡’í9Õ¤‘îÙæÖ•Ú¾Á_õEûƒu˜Næëu<4¦yÈ2þÒõ§páÞï`nêºxöË'\`´tw¶þ²##Ø¿núnîß•ÞÁÒ!Â>bÞµiË¡t¬‘AÏb=ÉåٹƂӳMܽ²üsd…ËøÄ¾#’Ì@—-ö?Ô h%èÎŒ…Œ«Æ4XØ:‘øª{ÏKûÝ­ž]tàÞŒü´‘¯_`9Ëe î1ŠÙá›Õ¦¯W}S÷¸‘¹Ë-”Ñ"{äÕä"Jœå" ìBYߪ”w‚;JVÀ?€yò3š£“I<Šž=GDÇ­šÓµ‹ÜÑÐ:k^UG"ZãÛ#íqü·5úyS¨!p)¸Þw÷!HÙñ¦t¾nÄÝÁ:~O”>¥Ã+ádTöØæžG-³¼5Þåò* ’ØÇ#›{OM:›½…{):3˾ÎY:zk‹ÎÜ]'¢3>rFtf"¡3Wö:ÏfÒ7AçÔ^mFgÅAŒ‘' Sì¶Å«¸ï6ÏA(hãY¸µ‡ÍnWîXßà±Û{á‘-ílÅë ¹¶ðÈíÕ?¯Çý0¾Vd4ùjTD‰³\dßGZ6ÔÑ¡{LŠ¡‘ ~ŽMP/g³ñV3qÎjÆ+BÕ1zYá!é—Ò³ÃX uᎺs½ÃªæAÑEAõr68fíÞ uq¿Ðë0(]õ¢©7û1µ]þÙ*Î!‹n•›ô®]Ö͸ÒpK ¾ªOc_©(q–‹,`JB©5C-¦B3Úƒ2F™<£ºQâ1u­…®Ò꡺ãªé ¨9Ÿ‚Qàý$xh’õsRbêp^:Wœ~-i‰B{_Iž jJi‰)Âmeãˆ)nNé‡SǨíÑφSYÂ2‘/Ž~ýµM•á÷1 ú]>®‰ÛܿߦŽÏ£Am)Ñ:Žq—uþ%ÿ|æÎ«®ÝY÷1ßݦÊÌ%gË•»nÞ“,sGK–qì“e&òP²ÌµLɲü†,À4cgÔ6J<¦­•DP+†Ú¶.jC2úx8- ¾’ŽÂ(BôH»Ö·,ÿAŠ¿¤ ¿ýlÝyåÛ&ü0ìÎpÝÛÒ·þhx<©S®Í qÙbÎÕB´O‚pn ùïýÜÑž]XÈŠTødýjTD³LbÒàÁ33ÔrHwN­Ôg³ðW­•êH¿­-ø–/ßÞ]…ãÝ«ô«ŒÔ¸Sb¾%Øî™rç ÷ƒëMáž/x=ï–ÍfSÚK—xê7u¼G³Lb!Þ!L¬€b‘«™âOU>ƦùeÁ6{%4µbD‹#±¯4áÚ¾¼w®7±ÄÔŸW p/<²<$ͪÎÀ¸lµ?Ÿ;d„Ü '`#?62‰°‘«YÆÆ ZûyÔeV–0UUgS< <¬¸T˜X?W<Â×7·R²ŸŠõ¹Âäü˜Ñ‹I–a…ÿjÄ(ëÏÌü½Úv}}Ó,B×%7ÁÿNËêendstream endobj 2860 0 obj << /Type /Page /Contents 2861 0 R /Resources 2859 0 R /MediaBox [0 0 612 792] /Parent 2854 0 R >> endobj 2862 0 obj << /D [2860 0 R /XYZ 64.9134 727.2935 null] >> endobj 2859 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F14 2010 0 R /F21 1557 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2865 0 obj << /Length 4721 /Filter /FlateDecode >> stream xÚå\YG’~ï_A `ˆ=#–*ïL?ì–-Cƒì±z^æx(7«[…e“-’mIû ß¾yUV1«¨²ÛXP눌Ȍã‹Èãû«‹¯ôÂTFR¹¸ºYH^ÂøB±ºÒº&‹«õ?–F_®¨4µ\ªË©ëzù˯—T/þËÏ?]®cËïÿöú/—š-¯VðÂòõw÷—_¼$Ë^¿Ä›ß]j¾¼úñíå¿®þ|ñãÕYÔðô-RYq#ÅâúîâýÅ?þU/ÖõâÏu¥ŒZ|€ëºbF‹Åݬœ±pgsñö⯑à*P\¥$¿Ÿ’TZqÊ™•ôõÛŸ/W¢æËû}»î€ùkd½9¶¼-—íÇëïÜã#Jò⥠QR³J1b€$·î÷›æÓ ²¢îå´À›{³Ù®3ä(©j wÜ;÷ûn{ÌÓ´"5Èà^<¾»D¦‘e±lö­»øéÍßÜÅ/{x¼ÛìnÝÏ{üi¥ZÃEç%÷UNL¡+£ ñím›»ö÷fxA²œ±ºÙ½ù4¾WˆvGj©…UKFA-m€÷$À}ï½ÕÊÌP ‰YÐÉo/AÕSŒw6©ËÛvÛî›Ú™¼ï€Ÿ¸÷†÷ÇaßêÙ\R-C/<ûüæå³LW×DÅ®²\6Á\ÕÒV l\Ʀ÷¹£ÆòB“—§­hðH4(öº…ñ^9Õà>j=5P»nk]– }§ ¬¨7Ÿ.E꥿k{ ŸzƯb·…>?ƒ ~jÊ7m¶„¡$$ˆuè˜79™•!C뮑f뙲 pøvŒE½´ü€áï±€bßt~À² ÝÎZ~ç?†oàc×Û[[ªé~¿ìŽ~%ͺ*(øsòo0Ÿ+»@PÐ\Ò04. >ûcF‰ ‘—±Ú“ëMƒƒô#OÂT’ÅØÒÝÝct®Ä’‚YƪUüѺëmûÑÞƒ>ÍzbZIIHï‰Ïò‘ ض¼Á¾ÀŸ ÈÞÀû‡xùn÷€B­¯¿EBý õO/tãE´ÚÜ’W"|Œš€í;…¦féûÇ1Ž¥„#fd_±÷€ê‰©€y'“5Ð ê¼ùpðÖ áïËl9WFÅÀfë”7Þò† È{4í+‰;F£²ˆ‚ÊhÐÞBãHÓ÷ë­Å&ÛˆPàiøøí1ð…¢ –Šƒ 3Kù –"ýÎ,ö´5k<óe³—tlšÍf‡Œ~ðïÊ®¶ßÁ1ãïw}mêf‡4Ã)â‚ê€ŒÓ ?ØŒŒ¥¯6D úû¥-ë6ÍoØNûíTužS¬§™/Aëƒü7‹×4#f‘2òu²E’óÂf*j(•îh-ÁáÚ6Å,Åm 3¢Ç¡v‚·‹n¨w´Ã¹Ö¬¢E™©]nŠóùM3i()¹¯ã°7”‡´œ31dÓÿIý.Çc¯ß³³Î£½iÐSY¯€žÌÛ~±aÛQSH³j=aû¢25‘ FឆAv¶ï‡€Ÿ9kró,ž„ª$Q¡ßЛÌ?Ï®Àò~èëHäë–59£øÃÕQמbÎâAgÉ Uº"SëæDR”…¸³ž  µRsÌà0\àz1ƒ§ù qpˆ[·vßÏoº™°QL”>j̉ƒÆ@”!î¤ÒÄi!¼Τœª½ÆL•Íø{tDZތ¾Ñ¶È'µw[DöE3 à©Ô6‹Å¿ëî¶;º,”B>ØÜô“8î…Hq N6fÈøÄÏ0w‰ ‹•‘•Äe¢çÿzÂù+¦ä\ª0!jíÔÁÆw'"o`¯ñõb,knrÞ 5mÆ#cç.¦€n= t‹iÙÉq©`bL-E‰þFšŠ`Ìù›¦ýMB®˜Ã³˜÷8)‹…H'’×’-y#,ÖÝh„¤ ƒû•ؙԬ(›PYx;i„)¹RFxÂâpöœWÂØ–§§Ïí2á36WNˆÞæf…ˆ67âÿ‹Í•ëî'øˆ†¹‘ó³ÖDãÙÒcÛnÚäjÅLnÌápö zL3äÐîÉ™´¨b<&5ÇcoQ)Ý­­^‡Ë©–^?ì÷#8ë6VÌÏÕÊIùTY*H„9£ÈÊ`áÜM+rB­˜"9Ì+rÊá¼"ã1Qä9{ENyt«"Æ:œ[1ˆáv/§¹ì¶ÏÓ­âªÂƒbÛ_¿SÜ\¥3Å9–‚ }ÝlwÛîºÙäÎç5à6žî…tÅl¿N{Á A–ò¹¯&7·¾ãŒœPÅý©€B!`˜(;c×€6jª=(¼Ÿ¶ë„Z1»s˜·ë”Ãy».Æcb×s<övòXÞ®ý!OSÇãÐÇ1˜b½ùT!g¸âæ¢ãUÃ#º÷Ó“P+f0có“r8o0ÅxL fŽÇÞ`R)¾‘ßgH${¤S¬;ŸŠÅ°Ú59o1Ý3yg1¦-&¡VÌbÆæ-&åpÞbŠñ˜X̽Ť<>’Åü¯‡˜b½ùT0Ñ…É9LFŒT“}ž6˜„Z1ƒsxb0xd̀í= ozK96›™c³·™”ÍÓJÜ t–Ñ\e‘,'w†ÃH1ï>ûülZÅ‹ ÿTbB- «3s¾¤6à}x˜óÝNëxB®˜ŽYÌëxÊâY/Æf¢ãslö:ž²9ÐñìaR|ñšÑmûÁžÜk«íÛ6œ/€vb jÞNpº6Öšñ¨ ,7ÛÃLl¹YœÙîT®çžˆ<¨’ÁLÆîeó¥“Ö‘Ð*ecö²¶‘²wÎ4ŠñØ[ÆÑ0RO}ãB·ö•ÅÝNíããq›0~² $Ž£¥Žý)$[ל;…$9hÁ·ºé²]m¢X—=“РmMçMBÛ“fµ3‰ÿœ4‰„V)“³—=B eoöb öö0Ç`´‡”Aw‚Ï—¦Í!9ž mæ0Hët;U<Ó O t»ò§´¼XG<‘¾Báê$>¯åŠBf.šójRËZ¥V÷ŽÙŸlgpTÊž?&Ç>l¹MgéÝÞºŒ2¯ÿº]­Å„ï-hNøhA©ð£E€û›ˆpï1nüÙá_å¢Þxé~§;?3«Ü #6Òœî‡dùm¨Å4.\Ãc³l#îÔ{û¿;; ïâ€3Hò¥_ݘ\%Ojt Ûå¸Êwú]@DàØ5Ç4úVüûH“¬F§ª73*Ü¥Vþñ ‚õÇZáÉ’áT÷+ÚÖ”£*¦oåUâ]$¤tV†·˜¬g™Cá§K¤Í½=ÛµŸƒQUzÉý~5vGüòÁÿìOþŒý?l$Hendstream endobj 2864 0 obj << /Type /Page /Contents 2865 0 R /Resources 2863 0 R /MediaBox [0 0 612 792] /Parent 2854 0 R /Annots [ 2867 0 R 2868 0 R 2869 0 R 2870 0 R 2871 0 R 2872 0 R 2873 0 R 2874 0 R ] >> endobj 2867 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [437.5801 166.7997 465.0328 180.7474] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2868 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [492.3748 166.7997 504.33 180.7474] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2869 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.7412 154.446 414.1939 168.3937] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2870 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [441.5359 154.446 453.4911 168.3937] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2871 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [391.9716 142.0923 419.4243 156.04] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2872 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [446.7662 142.0923 458.7214 156.04] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2873 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.7412 129.7387 414.1939 143.6864] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2874 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [441.5359 129.7387 453.4911 143.6864] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2866 0 obj << /D [2864 0 R /XYZ 64.9134 727.2935 null] >> endobj 630 0 obj << /D [2864 0 R /XYZ 64.9134 664.3144 null] >> endobj 2863 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2877 0 obj << /Length 3166 /Filter /FlateDecode >> stream xÚå\K“Û6¾Ï¯ÐQª„0ÞÉ®³U9le+³§$ކ¶U¥ÇXâÄÉ¿ßn€ Á·foev/‡[F_w£A÷î»ÊI®¹^ÝXiIr&äÊJ¬¥luÿøËÚ&7£”®ï7V¬Ëóa“ !Ö»ãÓ†­Ÿ«w§gø¬žÜ¿›ßî\I)ˆ²T¯¨“çx÷îýýƒ;tÅÚâšÈ\«Õöp÷ùî—ßèêñŽ®~¼£Ääfõ®)¹U«ÃT S îìï~¾ûW#0 ³Xä÷8AÎFf¨sN$—Âé÷þ šŸOøïeJSmrB <0ÐÔiãUeyλªº;]Ué*cŒäJ±iYþ9 ²êKÿŸœµÖ°L 6³æÑ¬ #Üæ &†¥ÊºYÿ|:‡³íº—„KÎë•Û]p©åºð+þûFéuqÞ`ª}Ù·Ï‘ÄÇÚÜ6ÁFä ynˆÕ,ïNqw¼TűÚÕîtìk+48ŠÑ#W,­ LX>¾°Y#1‹E•:'šƒ_v”-Ïè‚=%³ð„&EïdR‚IëgSx4àˆT¾@;ÿ„˜öhɉÅó­,Š{¦úát>ÕЧ…+ó|ܧ‘Ê3øÈÞÿ½ß9ÈËÜ X÷Y„ï/•ðeW}ª¿:â'_—øØ¾<¸Ïã†Ûu­MG÷,è“…r$4ÔÛ ‰Å/Ÿv[”Xÿäk‘Yõ¶…Š9»R-2㥺™á‘„ÈŒDÎ!3Vv™ÉLúUùb dRi³€LðrŠŠ¡¿;|>”Çê2tr…šˆW€sÒÅ#õ’ŸÙ)·.ÏùJ$tñH䜋ÇÊ.¸x2“¾•àC5¨iì‚‹sF´Íõ+‚ÏüØE tèêSÇÙ¸=~ìý­=\ïâ°„NÝǦC—ó¿‰ÀST§Ã4˜"C$‹³ÆmÁ[·úóiÔˉd4y3†‚Ä,9‚!ÎÁ#sÖÕÑaèWª(¦ßn2ÅUíp“Mƒ+™‰¿büà ã‡Ê”w’̓KKÍëâÇWÇ×`âÉ¥Š>ókÓ±Ø,`š‘鋜LGÇ1À4+=‹™tVþŠI$ H ¢68CÓíd¬"”Ÿ´úšD¬Ë½ÃØtªi)T ¥:äôÁË…Ú!6Ça8äõðëÂb(ªÄ€+¸Šì’”õ"Y¿jõpìë¨â\l« w‹?uÚdðÅc˜×8¾£…H‹;ïxyÏåÓ¹¼PÆÓKp Ã`šgnFz˜Å"Gn$±ä®¶ Ò·Ù{#¦r¨¸ÒiÜH\ÐX*C¨u4ޞ˚’ÞÏSQ2‡x+T$a&Þ` ßš‚¿Xþâ­ÆùÈ]Cƒuñà!¡º·EãCô9*Yå.ðÎÁËñŘ§Ö¡)“uîwÅeš¢ù'c€Y›¶ õñt(vCäóœXâ¸ùAb‹A¾„ÒÜvµl©Îe1(4D®‘ÈeBuƒÄ%uóœ(‘›®ºÃ"Ò¨—m:ƒÀý$ƒGkÞÕϹfÍKˆªyjJæ©o…š8 3Ÿ% t\þW²¤6ÉS Ç;uáˆîTuXËSÛ~÷èÿüpªé ÌwÕ Ç3HÓMz¶'¯òùTï‘]ÜL>?úCBuéÍLRÙ-¥õ×b‚ÒâÕX¢´06!¥E"ç(-Ö²¡´Mn;NiÉÔm)m^݆ÒbuÁAœsôy ƾ™Ø‚Ä5¥€kfzk)??—Çí•IW2‡}#’\@)kç™qÂ(­w̦ê3fS&T^Wהּ%Ú£¯“Ê(a;ÕôȨ@ž;Fٲѯ”i¼Þî"–Å^)§í²Z§³±Ø0©¨k`ì êŠÍ½D]alBêŠDÎQW¬eC]Ç‘šÑbž^›N× qIW+ˆ•Öôt=×ÛVåã4U6K’Œ(»‹¾7¬P‹B5h÷çwµ5k‚úöÉ{­.¨¹Ögo‘Ì>†þ7NïdÔýn¸~v[NðÝCË4ç&é°“IÇE¾s›;FT4ç-9äÌš¸€ï¹-ëzz̓5aßÖ§ÓŠõ)3ÏÉ ðFØBt,Ø‚rþÿ•*°ëÕ[Äà'×ç*ÜÞmÛ¨®›ÔõC=ªˆŸvg\Šmh}pH_Öë¯w*„|h"Ùh½èÊžxýDºŽx+p¦éù‚nx"]Û^øœ®M'<Òõê>x:x#ÇØdTMmr’à TKýª6xÓ réÁÅ£u µsF÷ÎÁ—¶W¿Œ™À“ߦ Û°£ý×Á~6*å¹µXæ ‚kÕØø¨ûøJE>Ú ¿ÀAb‹°´ÄPj{ŠvÛ×ödÓÙù­ÀDͽ ÕÀD r._þfZýêMx1>‚oõÕ'@¦ý^-½üõ ¿Ÿrë÷ñœŸÊóaw¹ŒÅ-”†)D3þfdzXäˆã»¨ÁXWÓÆñOÏÕÓsØÿ~! ’Yýìž ® vfçA aŽÂš—ƒà‚CqŒÍ›j<”…˜wîŽ.¿üÓßY ­þ©6“fMÒ‚$¶É5 ã‚$9’XÓq< Í‡=-<×yP2݉ ºK͉ ÂvuPö ¸°”ý“¶ËOå/éñƒR‘¼–9ýª¸À÷3¸õ)ÜOÑé\»}]í ÄШÑ)|îÿü·‡âOˆ¹Óþô±ÞB8—»p@@ë© UÖ•'е/åkGŠZ ž+T¨UŸ@Ýs1ð:†¯-Ú\¥H"t‚·Ä,9ô:&5ž³Uí/»Bc_<_Êw|dîàœVr[ÏçÛ‘CÝ‚çcf'Ì'Œ1“nÂÄ… s(tøøtÙÈt3f@H6aÉáBJ垸ßäz]ºa˜êìÙÕ×¥ø<ƒ{\‰Y?à`<½b¹$47·¿‡XËËb#> ðiÒ k‚´ùÍD<¢0Z¥T·‘¸ 0§9kmWáa{rÜêK§a¸¤!‡ÈÊ”ìjý¦±/ »SŒ@-"»ä¾à(œSdŽ œs”0¬ç(Ý9õ¡¤y£GŒ„¿——­;Bî°öŠz?¥sF¡ •‚(})Ôíf ³Xäˆa(L-gºýå®a0D×ëþ·ž‰lGŒ%ÖP¸³95_U¸Ù¡änû]ÍY¬ž2¦ Ô_ ñ¿7ò΂ò¹‰KÕ eÛ°7 ×yÈBÝõ\R‹:u6>ÆeõÖé!öGo¦»‹{®ŠÊöÔÿàt`þ/›‰´œ‚w±°LF#”ÉÙRHÖ9á\ƒ¯cö¤Øí•^#1‹EŽ8“DPKÙþò0$ÛNâˆÇ/Cƒ.hC…ïkxcúæXxOï xpm¨ÇЌ¡ÃhäÌ¢6rì‹Ã`HR·Ó.Ó¯‘¸`<ìîpÔï²;~Ü—Õ°T‘ÊbÁ *$.) é>ÕPhvý½8_Þ0ƒ;œ«ƒßGý°Ì£ lÜ>ëG÷Í2Io–)×,“\ûwn±_f]+åØÈ+Žc+ŽçòF9>Ê󔦼‘³Mceª#F•Ѩ dÓZëõý',ªñ‘¾_ú»þ[ß)uÉ:v~ñ‹O—#ɇÕi [Gàcó9`sCyפ­HˆNõŒº½Hp?Ÿ›cš±D‰o ·!-’8ѨažÜá ð--‚Y‹'—ï©dŒ.¾óWFoxâªÏeÜ÷Æ=Þ9¬#Ðx–Y•%VŽí8öÿ‡ý½qóöendstream endobj 2876 0 obj << /Type /Page /Contents 2877 0 R /Resources 2875 0 R /MediaBox [0 0 612 792] /Parent 2854 0 R /Annots [ 2879 0 R 2880 0 R 2881 0 R 2882 0 R 2883 0 R 2884 0 R 2885 0 R 2886 0 R ] >> endobj 2879 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [420.4579 434.5912 442.9293 448.5389] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 2880 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [470.2712 434.5912 482.2264 448.5389] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 2881 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.1326 110.9093 107.6039 122.8645] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.5.1) >> >> endobj 2882 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.6032 110.9093 148.5584 122.8645] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.5.1) >> >> endobj 2883 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [279.3029 110.9093 301.7743 122.8645] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.5.3) >> >> endobj 2884 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [330.7736 110.9093 342.7288 122.8645] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.5.3) >> >> endobj 2885 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 98.9541 128.5084 110.9093] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.3) >> >> endobj 2886 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.8503 98.9541 172.7869 110.9093] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.3) >> >> endobj 2878 0 obj << /D [2876 0 R /XYZ 64.9134 727.2935 null] >> endobj 634 0 obj << /D [2876 0 R /XYZ 64.9134 266.3403 null] >> endobj 2875 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2889 0 obj << /Length 2917 /Filter /FlateDecode >> stream xÚÕZK“Û6¾Ï¯Ð-T%„ñ&°—-'ñfJÅÞxrJr %Î k%QKqìÌ¿O7(Q’'¢«Öž* "Ƈ~wCßÞÞ¼ø—™Yb5׳ۻ™–Ä2!g… ÄÊf·Ëß2Fé<çZRó¾Ñìí/sn²7?½ùaž !²o}ýÓ܈ì6‡ ÙëŸýÓ·¿¼š³ìû×ßá×s#³ÛWïæÜþxóêö†Í(ü±ý–\iµš-Ö7ÿ»ùí:[ÞÐÙ7”¶˜}„1%Â5[ßH%ˆ’BÄ'«›w7ÿé ÒYÎ%QÔ°cRnº§Å¬åCZîÉ-ƈUŠŸ¦å×Q †qÅTškK ‘ü%Ày"‚‚n¬ši+ˆfÖ8|·*w²n(/!IA¹… pV½C¾Ë¬ôìÿ0W:+Ûº|RXU‡Œç–i”™¥x®;bOò¹-ˆÃ Yov]¹é겫›Í!Z¡A=ŒH–|‚paÂðqÑæ=Å<%y VhK4çl¶jÛ¦=©˜!TÁŽÓ±õ“I , k§Ói6¥NÑ…ÕtÚÀ@kþ7tz:\¡©aÐ=T­×ñÒ¿ ª¯@ÛAÕÝ»M“NÙ——«ÌÚOêQ\¹>m Éá&3³ ÛHʱîi{dÅ‚Y"Mf^m‘bž’± ÎAË,btvñ;UtœF63ÏWAÚð‚6šÉØüfÒ@ \Ù F£ Ìçʱ÷]Ó¾<6ˆw\r~eHÐL¦ågO¸×òôˆŸâ’ Ã@Bò\HÁ^“±ô³h4p*ž.®8©Ñ’Ê vA£•&Jólž ìpy×FBå:O#€£ãê²H‡¡·|„R®êrwÚ†’ó_ÇÒĆÎòtoC)S—ͺ¬‡[b –àjã‰ó”äˆñA(…Ôi€²»®­Ê£ø+,X&erB¸‘â%¸Ö% ìÀ=6t“àÌt#Á ø$¤Àˆ;ÀçT3„[´ªóÁv2MýR‚-7DkwM‚“¿jÑ15]p4ÎÅ쨙M¶€0æüË_òìãÞ{…ÙÿÙlÝü*|·ˆ½ŸI3Y¬>Ë ½ŸÙs¨ú³ÞuÕfqœ”JE. “¯¶ÛH/ß±Zi r fqèb>Ù:&ãï—bLAÁã·( ŒÕâù©èÆ«½Ù‚î?vi,†mˆÅ§õ=7™¾Ÿ=ò^ßÓ3o«v]ïvc‰©ÂFOæ_­ô‘bž’Q{Ð+"í¿yì¶]PügZÁd\ÿBÒWe9¤)ôRAF Æ‹ç[Á.F…Òà ²µ ù'âBz€©òÏóLÙÛIÊ•O±“8B;IHž³“鸼G®?¥{ʦ•š{Oñv©9X¢0CìÑš]µÂ@‹¥A Ê•‹6>ÆLoã©a2¢)Or6rk¡ÀB "ÿÛ9ØQÓvåûzåÌ­› 4£#[í=‰të~øù×p{f׬š{ÿuÛVK4YßEì*¼ˆ'7@ôØ„ò—'ð„àT¦Ä š+TluÞWÝ¡˜YêÂÎ…UcWk\O1OIkãŠ0 %F?ÍÙu[oŽA*FŒ%žd¤x ¤R„rQ Az³xÁFd“[Øu7JJíÜέΪ5J Ó“U/ác‰c·TC" ±Öò`dc‚£X8ŸQPv}:ÐSÌS’#<VðBÛýΧ'48ñt #ÅK ø=+å¤:ãöÃQ)^ ‹Bð‹¿¯v ×ûqbŒ½Ãƒ}“¬á„à°—-€#LAXSújŽzyJð˜FQ¨~Öi™wgÒêéö/`d ¹^˜!ȽÌÞˆ,õ±…"V²àç±Z®§LÆ.ܘ¥J ›ø5ïú¼ç貈Z#Â,Ÿ@ñ‚cs±v×Ò$%þ!$bø“±"$c`ïK¿t„HóˆûÖýŸ’õc¼ÅrIœÃ²peÅþ– ‘½Çûò§‘cb'‡ àDþ‚œÓ]0¦¹‚ÖmºpŠÞ¬€Hð@FrÁx¶-ï+ÿÆj” D!)tvûà¹.¨qÞî±Ý:64»ð°¹ó«°0{p©+|ÙöÓ% /Aÿ2NêÿY®V ž÷cøê?›Ú|IØTË1ùCj@Š¢ÝB(o˧#Ê•Kp² ÚCÈ.äÐ&DôzYmfWßÅ[x™».ð@棭ã@&´lÂùN¤©Ûy…4ðÞ hþØÏ!„â˜ñØÿÓ~€ÔEËâB¿",x?).™ðç¹ï=ßê?UB¥'›ªÕpž[} 5`×…~?wº~JòL €òDm FëŽéØü9ëDÉ¥åçëÁay~Ý!žUwœ-9jFÇŠp–ZÆPÒl_ˆ±+Î ‰²º2Qa3T•¯!ÆU÷U”åëf[µew|»Â©" J“¸¾®è)æ)É‹„·Zdûi.ÕÙV‹ú®ÞÐ#~„-')^m¡@ PÒ @³b1¼‡;žâ„‚iìÀ ŽqfùßN‡1R¼„Q@IÉ £`\Õ»îT1 Š|·×—#Þ<Þ¶uÓÖÝSв7Ûwz÷&ØËxªÍ äÚVÇxZ® í…HÈ­Â;' qåÁ#È‹â/D’,fXpB…1ò›Äl‡ @ð/‰è¸cŸö-Veë’m+Ýe¾Ä ‚V‘í)£æÄ8oœfw¡W* ç‰Ú¸.Æ÷®……›²¬0ÕÄ<Ó} ɸï® ©Ú±s+Ml!öçîr|tMù2&­åf,³5OSþ(î6‚ÆJ·“HA4ë7;CHaó0Î[ÏQ.÷Ì}nëXØ'¤ñ·5ðÒnÃ/äîãi¡IêVI*c}YÂÕˆBB2HmÜzÒ=gär ɘÀ¬®¡K1ÂDö0N©«plöún¬œ^õèYVQJSÕ¬p áÒÐM…"Š™•u¯O©ä.¬¸;¡eœÉâ²u ¢Ç¨±bc冊íü‚ÃQ¶{˜‹/jsŒÚIY4¦Uƒ¤0ϲ.Q¯ž¼ÍJð¢¼0rX—+¼ÿ€ÊÆ©›qÈ”¿ì€ô±~ä*P|‘a燮ȂϾü„­ü“Eé W%ÜO;aÀúõ ¯u Ô†½–•Ë£VeRº5ݲ‚Õ€¦)J³×Õ}µ&­°ð†ºäPð¸pç!‚ƒèPÁ{ë“\d=²uƒÇü€2EÏ%9Ïîœb­ýWªâà&¦m˜Õ‘'‡”K,ª–ýâÚMbØtpK Sõ~ÑÑ v íÞGº7x7 _ ·Ó}¢eyÁXöïÐð fáhÖ¤”˜(;rhtø9Î*ÿƒ;¨Z´kP4~XvÞK­·ÝÁ»â> æ;ÖÑD ƒçWß|5`°}þ|,láÎåñk¿£«bwaìú_]]®üÄ]Wv‰fIɳ—¨Yë]räfùüã¿ þÏõ!0é®qü¸êp¯­+й>ˆó¾C¥ÀÀ Äñq†é¡5‡å~}Ìhp!¶ö~ŽyšN´€áH‘ü{—J (Ç:|YDz þH'0Oê¹qí¿„“WZÙ›‘ûØBë’i#© ÓAYvШåü'5’ÞlQÈxrT<×ÒDå3ØûÀͽ\Ô±×Võ§!£Áá3Óÿðæa"»kb;Ï1â>\Dø…xÍ£Žû ²ã±MFµ\õþˆÁ>!éÿ sÅNendstream endobj 2888 0 obj << /Type /Page /Contents 2889 0 R /Resources 2887 0 R /MediaBox [0 0 612 792] /Parent 2854 0 R /Annots [ 2891 0 R 2892 0 R ] >> endobj 2891 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [154.1787 400.4236 181.6314 412.3787] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2892 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [208.5019 400.4236 220.4571 412.3787] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2890 0 obj << /D [2888 0 R /XYZ 64.9134 727.2935 null] >> endobj 638 0 obj << /D [2888 0 R /XYZ 64.9134 531.9442 null] >> endobj 642 0 obj << /D [2888 0 R /XYZ 64.9134 280.4361 null] >> endobj 2887 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2895 0 obj << /Length 2327 /Filter /FlateDecode >> stream xÚå›KsÇ€ïø[… Ãy?A•¸b|I\æÍvª\"ä°JˆNÄŸÞÇÌö˜^Òj&ÞÊ…X€ÜÆ·³ßôôÌ¿¼^]}›$’×¾¹~Ûx+’2¶ FŠ¥j®o¾ß¡ìv§¤”›ëm4›Ãén»3ÆlnßتÍ/÷WÇ_àõþC÷sûãõ75Q¸”L#»JªöãÕW×+ÉFߤ½°É»æÍÝ꟫ï”ÍÍJ6߬¤)4ÿ†c)LŠ®¹[Yg„³ÆäOÞ­¾[}[Êf§­p2ª_‡êþ¼¥RÒK9¸høîüɯb)%’sº«?OB¬á0Ÿ1 µËºóI iLòËó†Jè˜\ã“^¥Ø5Ûw¶;6‡7Ðú›Û$ܵ9´oNçÍ©”ÐʺÁßòyà%$M®´ck¦è×[7-âsXçD´6rÂæ3°^ ­ešÂþùãǶQí›ÛŸîoÿ }{ß]Ã9¼Ël Ž> , çr¬á¤ßmWtï/´»GZ£›¡ƒ•CÐÐ}zû©®<ŠÆ¦ü9áTy ²7%üpʽs詟êÞóÞ“ÄÑÁ…3%~¬ËÍHø r÷ߥ8•„ÌŒM3Jz/œV®Wò¡®$ŠÆ¦ä9áe%1áS”ä#•$‰#dàä§ÀmÊ=|¬kÉHùlZ²fJ'…‹JÏhé@èÚ]~z[×EcÓòœpª¥Â6ï`¾¬9vƒîý¼™|У™$tI–šJ–Œ„˰Ê{­ÃÜøm•ˆÊöcÍa%ŠÆfå9áe+1á­äƒ­$¡s¾œ´ê\¾d¤\Æ0®¡1ƒ© ãÐt^ÁäS'a½tC¾$JKŽMÍsÄ©šNxmÃñöý¶ ùHGIÒ’%1)•% —‘%•ÊFêU€vôqÈ’„‹(›‹çˆ—]Ĉq‘tt‘$…Üh$„ž¾;¼½¯ÛÈȸ ¥‚bÆ»¥Á5dFb†ƒÂ±ÙxŽxÙFŒøùHGIÒÐÞ\§¤§[ ýùí€MXÉÈÊm%VIЬ˜¤.,!»(EL±¿ø¿ŽïŽ?ow&˜”ní-{¸é?9Béeôæpúéþxꊙ³µªh÷~5ùem-ÙyPD=jÑËB (½ŒÿÅèpÎErý×¹ ´ÕvhµvòØ™s¿…âôBw„ó´Ñ þ¹ÝqI+È´Ý ÿ„ø)+ÖŠp¸YŒäCÄpïEˆAMÁÿ:€÷¨jSLÄÈf6.¸ÀÈlUÞkó”n:ë~ÿ½f$IõôâÔÑÀ=iœÕ¦ú§GZʺø(›ø$£ÒQ¨6¼4‹È†ó!Ãi¢8&|¹kâ9¹Ùí^×Ífc}³ù'ŒN{™ÀÍøh œ&Ý´(›$£¶ý”‘°‘°ØHó1 ØXuðd͉Pki⌃0â†$ûñJ)ÊAÍA’q̉òÒü![ȇX,¤ ‹…˜ðu Ù—"!L="ü˜‘P:afMê¢xl’Œ£„’’±HH 1!5³.d8¶1•í@u m2BÆabÝnLªZˆãqYH3 '„…ŒˆÙÂÂlá„ðU ù’ mh·¼éÚxœ :±šê.ú$Q¢pl’ˆ¹$œ òi¾b üÿ‹º…lÏ3ç6 4O ËgT-tZD8 %ôQ˜¶yºš”„c´ÏãCR€cÄ„Ä,™°8Hò1ß~˜"·*æã½pnö“_ç7z•öåèu9Èuû1‡{YãoɧBŒv-Êk-WŽáªýƒ«ý–’¤-ÜæØ÷8¢X `>u­è©þ±%iqì!˜‘*øK¡ KÁ„/ë ².ÅÁöjïg4Jeúžì(Q86IÄÑAÌø@di>Äâ MXÄ„_ä¥ÌáõªM¥(9_Õe»€¥8ªœPcÍ8 c\ê7qXÊÑ.ošCR†bBÊP6À"(ÉWüÄ|/²—ù5œwÃÑÝñ&ýyì]_`»ª¥X+ 4~šÝeRº~\¢Våq86mIÄÑ[ÌHî|ˆE\š°˜‹ _duÿ^w‘t!2š¤à+ÝÌ0o’Þi=+#Ç%#˜×&ˆu³Š3|YÅ àù ßñ5)ù˜ù¥Ä&Iˆ½uÆ„î¿ûVøú/yÛL»•b²sÆö;g±sF·ã´™Û9cœNÉßë¦cMÛǹuÆØvhøG’'lÁÁÙº#\¶ÎLˆÃÖFòÒOIðÒM1øÓ¶Îð1ÿßm1PRDUÝOœ‡!Ó^ð6èp86ïIÄRM‰šˆ±NÃ1áúÕ>/À­ÛA¨}[õ› y)Å‘òºê»le f‡GMÁVöáx‹#“²3RVò!+iÂb%&\ï§Vî)+Ù—b¥l7•Ï­z˜ùø8ÌÙƒ!¬DáØ¬$G+1#e%b±’&,VbÂõ;y…ßÐ s|ü QTÃŒ%Ø43œëä„1nÎu]QŽKQ±(:a$–æ³¢3„YÑ á¯÷š’SK>쥘œìf†tµHQCº"ÌDáØÌ$ózDZž:‹—4_ñ®i Ù ²LûÅŽšÂuÂëèf7@àpl’ˆc~ÄŒÄFÄâ!MX<Ä„ëý¤¬ÌoòSŠuÙæ°.õgÙæ°ÞOÆÿñÝ«õxz9|=Á_VÍgk–¥ä_g¡ Šs•‹Bg+ãpl擈£ù˜‘ª ø‹ù4a1Ž+ÎUÙ@—â¢ÕP9Ù¹ZÀ:‘´R³q86IÄÑEÌH¹È‡X\¤ ‹‹˜|„\Õ“})E‚†vŒr®H0F8Üì£9ŽMOqÔ3ó|FÄ¢'MXôÄ„/^Ô%d#\JŽTª§07^k0B™8/! Ç&!‰XæK‘P°(Hó1à#Fk6Ðç|(ÜRjýPX¥ ¬Uý¥Õ>h;ÛŸåQÛ’èÁÛendstream endobj 2894 0 obj << /Type /Page /Contents 2895 0 R /Resources 2893 0 R /MediaBox [0 0 612 792] /Parent 2897 0 R >> endobj 2896 0 obj << /D [2894 0 R /XYZ 64.9134 727.2935 null] >> endobj 2893 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2900 0 obj << /Length 2814 /Filter /FlateDecode >> stream xÚÕ\_sÛ6÷§Ð[¥¹Á‚OËÕ×I§Óä÷©é#ÑçdÉG1Ióí» ‚ (QÁÓót&¦Ap±ØÝßîbî«›«—ÿ6³‚šëÙÍíLKR0!g¹ ÄÊf7«ßçŒòEƵ¤zž/2F)¿ýuÁÍüÍÏo~\dBˆù«ß^ÿ¼0b~“Á„ùë_ºÑ·¿^/Øü‡×ÿÂÁ.Œœß\¿[üqóÓÕõÍ›Qø KrMd¡Õlyõ¿«ßÿ ³ÕýtEI^ä³/ðL‰(ŒšÝ_I%ˆ’Bô#ë«wWÿñé,ã’(jØ!);½£ÅŠ‚iÙ‘ZŒ‘B)~œV÷Zî±ÿbL*ë7šé‚*„%ù 5Ày ‚œn 5Ó… šƪàmSo›ºýŠÂkL*´аΫw(y9/;|^(=/›ºüzXWû¢ç#Ò(3 9ºl“žä‰]ò"'¶7Þf½Ùµå¦­Ë¶Þnö¹ Ĉà“3Ô+†O+7ó³ä!³BDsÎÆÌVM³mö™T̪`Åt"E eR‚Hݷ鬚¥´ê<':/ô «6ð 5·|óðî¡ZÖ·uÕ¶¤ä¥†0•̰£ ;Ü陆Ý’а’1Ù=aØÉDú$†ÍØ#à®ÿâ¨aÃ’"§æ„akó¹r†]5e»mé®À˜Ë¬dÝý¾®a`‡Á³í€¢ýYöïwmGàKÝ~t¯¬y¡p»…|ü²š¨µûjƒá»íØÛ³b(Ꮏëà nƒ»÷_>ÖK¤äÖþV¾LgH£J@jíLöŸ$i@2ÒÙ M&Ò'Œ>Is*Ée9;R)‰¦"ÿ¦œjVlშl?V!eoìð ìa†ï6°‡^1o-™»ª9‰`;ÉâVTD$Bµ_p+XA$£ÁÌ‹‘ÐSÌB’Hàìª`c-ÞSEëM[P_,2Å•W/¼aÇq’LÎÏ'Ü­á)ŽÁ‰eÎÑR¢çýqt›H†Ž¨`t ’‰c£›—ž` w(I‰@—qT$“ïsIñ¨$ 9Ž P†)´ø¦/Š>óÃënh “?¤°v n:†Ž¤ç+E²l,*ß\¡€ãðêg&X@2±G2ÌÄ=È:È#,™Ÿa2!”¡„J5v30U(¢L®FÆzúÌ¢(ÑRœ{fÙÞvtáÀ„ˆ<$ÎOQ)ÜôsqÞŸÅÄâ[x oÊÀU¤4Bèþ‘ÉzT| …  œ†ðH…Qû™é ’Œ@xÄãTœ¼Žb7tŸIΨtNtq¢\­ð!7úÛÊÕÖª¹=Æ!‹GÜ4AÜs¸g2\ZÅuë÷”«Ãõ`oTýz´Ñj‚Ǻ–d9yŠã”á µT9jTCM¬¶÷e}XÌàÄrhíbö³ä… ”fÌ¥á6ð¶!Ã’jô–,Þ⠆Á³Ã G ?8ÌY3™A<“¤–#œjs)eHqÙYsÛN0mj¼reÓ‡E~Å™–Ú¹¡eýž2©Ä„»HK£’€ˆæŽÝÔ„0(ÆP°ø'â6ÀpŒÛ·»ÞÒ^¸|Œq\Jó±sOÌé¬ä¹€’.šËu$%$ÑL³Çž˜“rT!3nÆw/¾›ÍÀÔ¸,/_Þ?Et~Á¦ÎW¡øÉc@Æ4¤“R©¡©zp˜8dhH6ò½ M; @ÒÉPT{ƒ Õ¸¯w»©ÖˆÂ;<˜±ê)f!É ?†_ÆÆœzGt¿]Õ·}Œî½’ûDGt2±?DËB’\«50@4öï}øí+b. w/qð .<ï{‹ö¸^¶“®‚WÏÏB*#¹72òñ_Ð#l?­]²`×Á¡ÏøO°eº 8ÚîZd÷Oïa|¢1´ypŒ»9« ljµí-²99Š÷P©ð×í€÷P¹çཟŸïÉÞCN=Þ—MU¶ÕÞm|WOn|?¼ŸQ«K§ôž` _¡Ã×'áÌ,‹¼ó“opäÞ6mù¡^»:•`ó‰C{àoð»×ïÞ ÷šjU/Ë®£izöÍGÄgðLÓ=7}mì¶ð# üÌþ†Sëû[ ·/wݘ-¨•_9×·Ýϲ{g™ÚÞ5å}÷û²\¯'#0ÓD0ѻ姦©6ía¹Ê©µžI±uŠr•£˜…$§ÊUŒh Æâ§Ù¼æá¥8TGȤÛÊ Ü¸/pZ‘ZÝo­Ó]yë¤Yº÷ûÇ$Zõ$œ?ÛÔ¶G±Ýt_~Ànö×`ï1¾ç\Qú5ªônê² ø'æ/›Ù˜’÷íX¸ÉUó¥ ÿÅ^J3<ã†hÞ—‘Ñn >#Gø¤çív*š@&a ™ÇÍ‚œHfÁÀ9pv¹ ô³ä”³†l3G³è§=Æ,˜í=mÜþ-2áÁÅY´„»ÊɰlÜË»OeSתU7¾±ÇîNŒög 6"ì”eëLB1tÏ$ŽGrŽÓ•‰‹žEä()¿œ Ûô³ä¡èÑä¹VŽˆ^.yo·wÛrM™”Üa— ‰‰†aÛF`éê Vš«®6ú‡¾vŸþøËoî†u³E總#Nœ¡ÓÏŒ&œjØ—€¯XÇo!ˆ ]Æ&T 58')O¨@€:œ^„+—ûDO0 (N(ì)‡@ÜO‹ÿ`ïFb{E7Rv“o…žW÷¸{ 6êAìš °E8Â9 àJÄM2‡äÜB¤â ÒÒËB‚Òø5ñÓ:y`&ôýø.Ì÷ÇJ2ŽÞ¦€ì"ïžâ ó•`zÌ}P•éÇ®LŸí«˜I3¼×QGâ‡j·´·K¬–û«|{«=Θ^ç Ž–3žÃa†—W=Å,$9¡[ª¤ïzXyÐíÛqí98„é@ïÕIJ«â»OË.Ûr¾¦ ¢ŠcZ5ÙjåB˜sz£BúÖLíHÚDC±.ÑÈ]ÞW¶}{f¸{¬ªOã‰mÚðbz|ÿ’ÃpÖ:æ=wþ=å®<$¢‡Û‘å”Û>ûØë;McíDä¾Ti–1ôa}*²@ä^ú#î:>6•ýSœêÏîŒq¥î[mÝAõHUo¦ §†äüëÆªªY8ÅLýqÇÐ^HþZû`pÖx7Zû€d‹p®ôßv{t›DE¯û–>¯Ü`Ž0IÙª'˜§ 5Ø{R~YËßvó¹j°»ö’O´À‡0ÅR—¯¦„ö&t·žsÎ.ÿ[®ž^œ ÃÿCœ$ûYc™ ÔþÜ–ËÖ—5†r¡ê¸Ôendstream endobj 2899 0 obj << /Type /Page /Contents 2900 0 R /Resources 2898 0 R /MediaBox [0 0 612 792] /Parent 2897 0 R >> endobj 2901 0 obj << /D [2899 0 R /XYZ 64.9134 727.2935 null] >> endobj 646 0 obj << /D [2899 0 R /XYZ 64.9134 386.6115 null] >> endobj 650 0 obj << /D [2899 0 R /XYZ 64.9134 100.9647 null] >> endobj 2898 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F14 2010 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2904 0 obj << /Length 3544 /Filter /FlateDecode >> stream xÚÕË’ã¶ñ>_¡£TµÄâýÈÅUNœÄ>ØNyR9Ø>pFœÕê1–¨µý÷îÆƒ%ˆÚ]Ñ)ïe†"€Fw£ß ~y÷öŸvæˆÓ\ÏîŸfZÇ„œA‰µ”Íî—?Î arQ1Jéü~ażÙo•b¾Ú¾.ØüؾÝáûêÿ.~¾ÿf&…%Ê91££_ß}uÇà±~'®‰tZÍ7w¿Üýø3-ïèì›;JŒ3³_á™ᬚmî¤DI!Ò›õÝwÿéV b•ƒü)ä¬@¢vœH.…GðÍáqد€Îùk»Úm_Xɳ•tVq‹©ôk_êý)UvÖ€k Ÿ wN•Ç<Åœã@– LXž~Ÿ•V9Ä@TŽšuDSªû}=‚»íûfb~¢Š~½ý; üfQ)®æß[üïY 4&QBéxxõº(‹ 8?o_|óÇ·s€P?Â`õˆlžÁ»÷ø'ì–lêW”’Õö™,*#åüþœ~4Ì^ÅŽ‡a.½4UÌPÂ9·ðĈS*Èånõ;ˆ"7€@iðÙΟàq·^ïpø×Õ~=‡}˜Ãæõ_èùk÷f‰Hx2ê¶9ü­púÈ'\Ù7õòôô¹‘b 5Zi¢”µ7±ÊAžŸ?pdÒŠ~gÄŽfóVœ°DKš”…#pûÑ ¾ç§!À& {X÷Z?7aÄq”š7%Ááh!F›aPN§bPñ ƒ$…Q £Õínó–ÄlÉ"%%Z5¡Â²1Rµ"(-ÓQ^#,€fš ]mÛæ¹Ù—h•†P#Æh­¤kl”KêÇ/RÝÙ? "F…žÐþeGì_š…n›‡ 4kPÇ.)€´Ü;=Ôî-& €#Nx³ Ïb^£uY–tAhÂ53cÖÂIBÙé˜ÕA¼Â-î€:gOØÕîÞ5Û"·Ø k>„[âœ[²çV» ïöÍëº~l:z3î =7‚*N$ –Á”Gož1ÆØï›­_Þd÷„ÿLø~É _‚YµŸ6°hªcQ@ )øÆ‚PÄÒÎP>tˆžBS B<1(úÖ4:ÆÓžè šÿ;¸)ï5ßè?5ÁÝ•CçŠW ïrý¼ ¾híHùvuØ„…‡—ÝqíeÔO|©{0aÂðÖ„­›m< RÁ쉷í}å{ô•»ãaí}¯KŒ^½_(îs^÷îÙÍ=Æ¿®Ú6t>YÐyp8ΓZà¬qb4yV ¹8ØEC!ZÑœíÀÿܬF b•ƒ,¨˜Z ‘n¿ó0ê:—^Úšdw¾ßû@e9ñe ¯ûyæ–èçÞ3£[ªúMXºFÂQÿï%W)–­¸r)5Ô´‹Š #Ü¥ˆp[4y<1³WµE%Ôû&ä^ÔA#ç‡zã±~“ÞÇÀ†ü{`“h‚ÄÅ,äFѺàï}³Ù¡&$)ÇwÉÈø—¢UCs⤩I¥|¤‹ Kæ„;F ã×¬É ª AÙ$Z"ÊYÊ-‚}»k½yŒmÝf?â@g¶Ïëøj”‡WƒWÚó·TÂtº†<“à¬rÉÊ=7í©&  €:e%±ÜÜót«ä¹&B,O¸è÷M¶ârl×;3ø²mÞw6x^-wáÿ@‚à±ÁÄN Ü<ÂâíÐÜV:*ç_?E Ù§F”º˜Û¹óBB–Š/ç °µD £¢º”†úÖ9A±Ÿq»aí V9Èsa '¾SÕM» 0„ Ý` ¢)¥É­4^£áß¿¾ýoxÈ‹™ð3++êX˜P4Vû`^ävV¨zê‹+]ý’…K\ƒñ\ªi…b j…vr˜Ö.›Ÿ(“ÕB¼5â}~€’myßÙ…“?4Û¶/2 |q€E–(jn?É°Ê Sw«m·oùËgh D¬3èXëÔa™òXûªJº’j~ï-véq<Œz6nâ+_mÕ&©"s#äp~ûX±Â_Wõ{Æ©áàõ¥ƒ¯R+B8D3lE„îhz,°õ‚âe”ßÖ¶}á~í¢×‚Ç,…­Ömå™/ÊWráíêЃj^ÛPxo„b­ØŒTUë«ØXƒCé +=¾‡­ØíJ±ÊAzÉ ¬.8Š~çP–Z6ŸÚ4Wèi„×c{Þ3ÇÛ+zJJÄk”B€¤•<¥t´„œµY”»ºØ=–0.N:-%7‘šÝÂI¢œ6ÓuÏsˆ—»çݬA":¤ƒ7@;Œ }D·:tú›à™rvX:¼GÀ &öÍS[ºÜ„øÒw4C=º9„×]'—¬žÂÿ:ü{õÕÈç}½ ¿ƒúbãs}(•¬±4äº÷RÉšÖØ! ¡åa^„Xå a3„Zéú/–¬A¸´nBÄk8‚×4†³ÇkÖXå–½‰×!|7å¥Ù†ƒÛ„^ÿr…¾;³¾8Ö&ÁXÚè)c¬¦Ø-C{Ï òT£˜¼¦î3¾N=j|Ž2³Ž×ÑÎ¥ÆÁJ‰SÍ@á3Æ÷Œ˜ î V9ÈRxàÀT+×ïüI§¡Ó–ÀÚsúæ{ûþÙ‡B· ÌÃ8ç¦Ö$ŽdÚ^àd@Ö¨¹Ò:’3˜5W;ˆW¸*ÁÒSªä WKNZAª¤œÇñŽJíàù#NüÞèr' 6»2‘6ª‰Ï"5—½òt1Ì |˜ð| Ä¢ñ×@`|»k#°]\à;ø¡UG¢e/jl!u­·ÈøX 55A:žVÄR6nábò4뢕VÂe§C0¼‚ Âœâ7nÀÜôîýyW¯1û5ô$'€ã^-¢Ÿ ¥S~>Öûd’•ÏËù0xïä#Ä `¸yUHˆ˜QÂÃ÷ûšÝó…v¤V¬¿¢N ¥üà )Ç…ˆI¼8i,D8VºÛo/t«dÁv+ð¤J÷_t/FAÕ„F€×4À@¼…5ÄðL'Táu`Å1ú€˜”*D ùaÞ¥+×Å'ÄQŒÝ¼ãJŒžXtˆ`9 úíl ÀªZ%—„0çâ‰áÑB¼<b Ü(j vÖ‚Ög¨ ¾øâ´LøE¡|0ÓÍLŸŒØù»‰ÀC8̉î*1¬;aÿ¢mp4FØ+mp:¡ëçÐÏ šª»7Τ®½7àÒh{¯›9]{/9ÒÞàxK|:>&FðËa/ݹé4L‘3L}}ðœ¢ÉTe”K½ªälW•4sBUÉ@Ž©JŽãMðéýg¶ÂƒlP•-µÂñ /¦Õ'vÂEÖ qõÕõØ G$|:ôŠï&5fý—¾CXïßEió”Ã/*Î?Ÿ…£wÆÍ +åTÙåÀ ˆŒ/}=VÄ/O¿yç’ƒV@Ø“&Åèz$¼csHy=9þÞuüúÊ¿ÊÂ1_”`<~È’ß²æÝ-k¤ÿõšH­endstream endobj 2903 0 obj << /Type /Page /Contents 2904 0 R /Resources 2902 0 R /MediaBox [0 0 612 792] /Parent 2897 0 R /Annots [ 2906 0 R 2907 0 R 2908 0 R 2909 0 R 2910 0 R 2911 0 R 2912 0 R 2913 0 R 2914 0 R 2915 0 R 2916 0 R 2917 0 R ] >> endobj 2906 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [306.2683 653.0718 333.721 665.027] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2907 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [360.9502 653.0718 372.9054 665.027] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2908 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [173.8774 641.1167 201.3301 653.0718] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.2) >> >> endobj 2909 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [232.0144 641.1167 243.9696 653.0718] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.2) >> >> endobj 2910 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.2451 641.1167 403.6978 653.0718] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2911 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [434.382 641.1167 446.3372 653.0718] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2912 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [410.9946 617.2063 438.4473 629.1615] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2913 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [465.7223 617.2063 482.6589 629.1615] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 2914 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [484.2515 569.3857 516.6856 581.3408] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.13) >> >> endobj 2915 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 557.4305 104.0999 569.3857] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.13) >> >> endobj 2916 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [337.1043 69.7193 369.5383 81.6744] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.12) >> >> endobj 2917 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [396.8802 69.7193 413.8168 81.6744] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.12) >> >> endobj 2905 0 obj << /D [2903 0 R /XYZ 64.9134 727.2935 null] >> endobj 654 0 obj << /D [2903 0 R /XYZ 64.9134 318.943 null] >> endobj 2902 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2920 0 obj << /Length 2938 /Filter /FlateDecode >> stream xÚå[Ks7¾ëWðHVLïGå°e;Ú”S®Ä›(§$‡EK¬P-9òãß§€r8ì ì¦¶\e ‡@χFw£»¿áë«‹—ÿ´Gœæzrõa¢%qLȉ”XKÙäêæ—)£r6çZR=5³9£”Nßÿ8ãvúû¾Í…Ó×?¿}7³bz5‡ӷ߇»ï¼œ±é7oßàÍW3+§W—?Í~»úîâòê‚M(ücûGrM¤Ój²¸¿ø÷Å/¿ÑÉÍ|wA‰qfò ®)ΪÉý…T‚()D¼³¾øéâ_IàT·Ë0ÇòvåRJ´¾/a@µm¿GÔˆénÀòã,˜ˆ×>Ü­îÖËöšþ}Üù!$˜;gön5&:SÁÿÚ±<+!å`…ÅÞ†ÆA€³b¢)#ÔÁ“Žb‰!˜0ç8A˜°<~>%Iâ<écIC¯iÒ0ÄØ £bõZ«TAŒQâF¥åÂt1~ØÖÇ&ÊpSc”8†Ñ8bu]Œèø/EùFü3ý¨=6¶E™0.ÑRKMG–Ê%'Æ2=¾pô‚qQ]c”8†Q"µµ=ÛÁŸe;ø›¤¬ '‰#Ku%Ü¡׿/7G •!‚åZy2È(q ¤¦D*ÃÆmžº.h2QàB«“Rœi1°=”pßÍ{fNO—þ0Ã3víOÒf¹ë1)IÕ€‹i0iÆNpX í&JI"™–Oi­Ày.±'¤1I5|ÿà“GƒÐ„*Í BŒÇ0BÌbNÊ.ÆÞ£,Ð`t+‡1Jès/;Ѳ0Ñù /fsÅÕô¨Ûáú«Þ˜o%±Ô”[B8²n qP»tWP?4«ú8Æ0˜§dAsMGP .Àq뢌I±Ï<ጄÁºè ×Ái'5ã½.“8äuqØI‹N^W âÞë†1&¯Ë1v,úEfÒ{õKG„yçk7Þ唿8¤ûvÔÉ“”IF¸…´¹À(p¡”XñÛÂþp§ˆ33ŽÔ`¬«Á^ÃØÔ›Õ6šÆáéʨÄòåàtüf¹[`¹òçkŒ>GˆŽÑP˜½[ýJ½žò£ÌPYF-¤Vv"œõZPb+pžKì³CF´?LÃâÉ‹ {”¼²ìJnò…Æ”¦#Š,¾ISÛ"T¿ ¯ç¹Ð«\ج½ñùM(¿ :_~‡QÕæ¦ƒ/4©Ì¡v½LA}'‰# Xú} otü>MA=§Õ”èÕ”ÜkjùÙw7–M‚ÁPs}û¦jB£Ó jû%UÛLÃëM݄ޅW°¿JM/?¶ípxÀŸ±Ó矱ƒC®ÛfX>·Ç{'Ú±hU¯š8*×äÈIG›úº}öݲmÎ4Õí*4dÚO•A¾Ë´Ý5ÙBoï=ø¶ÃÔßž™Ã!O4¬ .QÀ¶ÞÎÚf_;WB$¦ÒUxdýÜóËú\'e…ydµ—qƩְä³×oÈO¨¥€Ý±T í$PÉÇ¢wµëØÇǙҠîUìÃ&¢Žixj†æi L"GVÈ!V3×]âÊ÷›UÕ›’jˆVdSžW¢Äy.²¯ì…¸ÂÁ2;`—[4ÁŠYˆ¿ðÄr*Eë„„TÚÎ-gѬ¤EÃo$xè°EC,R¸?kћسÆ2Äž¶Ç[…o[CǤ¢º^·iSÇA›,Rô 1ÔÉÞr¥4_–}՘ĶdY¢óç¹È¾jŒƒ!Aí`ô¦ŸQ"˜ ¾ é!;íÅü,˜óÑŧ> endobj 2922 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [137.7238 634.6825 157.4277 646.6377] /Subtype /Link /A << /S /GoTo /D (subsection.7.11) >> >> endobj 2923 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [184.7697 634.6825 196.7249 646.6377] /Subtype /Link /A << /S /GoTo /D (subsection.7.11) >> >> endobj 2924 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [221.1342 486.7776 248.5869 498.7328] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2925 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [276.7198 486.7776 288.675 498.7328] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2926 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [416.4146 486.7776 443.8673 498.7328] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2927 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [472.0002 486.7776 483.9554 498.7328] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2928 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [334.0042 404.4863 361.4569 417.3381] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2929 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [388.7988 404.4863 400.754 417.3381] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2930 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [462.4671 404.4863 489.9198 417.3381] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2931 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [320.1118 391.4352 332.067 404.4863] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2932 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [221.1342 196.8609 248.5869 208.8161] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2933 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [276.7198 196.8609 288.675 208.8161] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2934 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [416.4146 196.8609 443.8673 208.8161] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2935 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [472.0002 196.8609 483.9554 208.8161] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2936 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [334.0042 78.3056 361.4569 91.1573] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2937 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [388.7988 78.3056 400.754 91.1573] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2938 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [462.4671 78.3056 489.9198 91.1573] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2939 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [320.1118 65.2545 332.067 78.3056] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2921 0 obj << /D [2919 0 R /XYZ 64.9134 727.2935 null] >> endobj 658 0 obj << /D [2919 0 R /XYZ 64.9134 702.3869 null] >> endobj 662 0 obj << /D [2919 0 R /XYZ 64.9134 622.5117 null] >> endobj 666 0 obj << /D [2919 0 R /XYZ 64.9134 333.1485 null] >> endobj 2918 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2942 0 obj << /Length 3570 /Filter /FlateDecode >> stream xÚÝ\ÝÛÆ¿¿B:ÄZï÷ú$©[4(ŠqŸ’<ÐwôYˆN:Ktÿ÷!wWKqÉ•{ë¢)Ä”´þfv¾9{ß¾¾yù»rÄi®W¯ß®´$Ž ¹2‚k)[½¾ÿimS·F)]ÿmËÖO:øÿËÇî þ…!Äúí>`Ýúñew¾»Ã¼ç„Wx[³¿åvíïéZüo|Ä XÄ¥erͨºýåõ÷7¯^ß°…ÿØ×D:­Vw7ïo~ú…®îoèêûJŒ3«pM‰pV­o¤DI!Â7»›oþ nÅMJò[”g‘hljäRD‘„,'ÜÁ“;$`ÊÁSpé±mî/™a8+ÎD'Üôˆv˜sØ„ ËÃç f"ÅMJrà&ÅÆ`c…^Gìtíñq‚Q1P¥*b K•"” 3Æøöx˜b4š(ÃMEŒb £qÄ0êÆï÷íéeЉT‹„&šqéuâEFk ¡”©¥áRkDEf#ų`”„2^Þ®Q:•ʳ!Š%ˆ†íËíÿ2û!„!Vóz¼‚V…d^lGwøµÝO jCŒqm8R,4ܦ¹Â†.к¢ZGŠ%ŒNM¥»Vg`ƒ(((ލ”º¿áõ­Óë¶`wxÑtí)£Sb ÕÜŒ%LªùøÀ€IAœæùnÍܤ3^I¢¨áçÏF0 ª4¯1P,aî—rŒ14b)dEŒb £é˜cì5ëgªèWwïšcsrúx‹Ì™z#ÅdÁYî¦'ÁÕsµ3R,a„àL9ecŒ»í ÒIÅÕúkÔÔÃõWY—­D¡êA Ð…¶ÄPfÆÐOÝö0ñÚ’‚–)ÖC)PJ z ©ðTÀ ¶ qÇà#(wèÄqJñ²°cF=/–P\òbaÙ¬‡ˆ^¬ij[ƽXŠñÁ2§êAŽ 9”IZ*3…<ïŪa<{±eŒÑ‹¥Q_$.â¬ÌL3¢¬÷ÊÌÊÊÌ)¨?l\=eN(.)sX6›í1H ¹ÅÚ®Æ@± H ìd>&+Ø,bªa K¡’`ìBŽ×œÀ[E¡‚¼\iŒ,ÀÓ€l‘3^b XÂhA?•cŒ©¹íûßšc0¸Ë„š3 æjB>µðì#P´C§߈šè˜çzjÈ„aZh³Z[MZõµv¬jœ:¹ê nŠÞÐ5kãâsç„ï‡à«Á‹SõËðÂP} ïÉC–jäÅ´XAñw§\MÅOH.)~X¶\i(Gð©õ€Š% PÏ*ƒ/šQ æ¡1æ$Õðs’e„1'I^!{%ñ¨æE"Ÿ-°¢A1ˆÌÓÛz&š’\0Ѹ¬›ê!Œ±©€0ĦÂÏMl©Ž ¡ÍÑ *+§”äBtŠË á©ÂŸ C€!ÌÉé< x/|OY }¤X@Ï!a§xÊ`„>"Åa ¨¨‘b £åø®ÿBúÉŒËdœJµpõ0FŠŒ‚b3œ³1ÆéT¬€úW:*+" K96ížêiPÏ´t˜œêQö@ñgëùqÆõñb×o¡,ÓÞ¢'£ÄZx/‰/9…éÍÐU¥ÃÓÜ$óM™‹Ï-õYhjŸÖê”ÏìQŸâß·˜ÒyŸ=  ¹)2‹ï÷ sR@¥šà#ÁeÁã˜ƒá …Tð1eÎq« QBØkÅæ³¿¬ÜúÉv-¥>•Én$ø=Å;ÑàN Cú…?cdû9·ËL©®àZ®¦6ð:Œ d`¨ Mì!Èç4S¹3‡SdÚ{˜8/cÏǤ¸VkgÏ0ÚßïÚÐ솯ºw¿ÎiøXxò¸žJ?Ýê¢æuí~ø¸CG1¬÷D‡cPø”Mÿ禆ÓPÃôåxbH3?Ÿ7Œ¸ýÜËÝa·ó£-­Ÿzi.æýú© áoa _Ì8ñӇá&üŸ·ßú#Mç±"¾þx⃋m˜¸aòxŠ >,ÌH ® —.L5~Ó…3_£á Н ‚ë Ù?„"qV‘šÏ?)e,æñòô4†ÆîŽ/Æ€ú– e—$y€äü³Îbøém Í›ßÛýåèvÓeþèR˜ùJÐ×:r±(8E–JdqX;,¬7«P\ÕNÆyÎ$ùfÈÀçgΪ‰ö2(ɉIv˜›“„8a­?Æòß“<ƒª6%¹Àçù°]Âè⌤žÎHêÿpFÒ”f$íòŒd-Q}ÑIàL2·> endobj 2944 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [221.1342 574.4821 248.5869 586.4372] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2945 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [276.7198 574.4821 288.675 586.4372] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2946 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [416.4146 574.4821 443.8673 586.4372] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2947 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [472.0002 574.4821 483.9554 586.4372] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2948 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [334.0042 419.6627 361.4569 432.5145] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2949 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [388.7988 419.6627 400.754 432.5145] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.1) >> >> endobj 2950 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [462.4671 419.6627 489.9198 432.5145] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2951 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [320.1118 406.6116 332.067 419.6627] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.3) >> >> endobj 2952 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 136.2881 516.6856 148.2432] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2953 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [86.4728 124.3329 98.428 136.2881] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2954 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [202.5428 124.3329 229.9955 136.2881] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 2955 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [256.0945 124.3329 268.0497 136.2881] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 2956 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [334.0042 54.3952 361.4569 67.247] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2957 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [388.7988 54.3952 400.754 67.247] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2958 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [462.4671 54.3952 489.9198 67.247] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 2959 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [320.1118 41.3441 332.067 54.3952] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 2943 0 obj << /D [2941 0 R /XYZ 64.9134 727.2935 null] >> endobj 670 0 obj << /D [2941 0 R /XYZ 64.9134 702.3869 null] >> endobj 674 0 obj << /D [2941 0 R /XYZ 64.9134 347.9344 null] >> endobj 2940 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2962 0 obj << /Length 3289 /Filter /FlateDecode >> stream xÚí›]s#µ†ïó+|iXèûãŠ:»,{ \&1»®JâàxkáßÓ=3Òh<3’½é=çTqj/ÖI4=Z­VK~õâúê³/ý"°`¥]\ÿ¾°š¡ôÂ)μçbq}ûóRp»ZK«¹]ºÕZpΗ¯XI¿üþÛï¿Z­•RË?}ýíÊ«åõ,¿þ®ýíë^­Äò‹¯_â/ÿµòzyýêÇÕ¯×ß\½º¾ ÿDÿJi™Ö,nî¯þ¸úùW¾¸½â‹o®8sÁ-ÞÃgÎTðfq¥bF+swõãÕ¿“Áu´¸ÎM¾˜ëª ’i©UÓÕ¯¾û©C?ùþnÿ¦ýññ°½ÝÁon°'›ãö ÿgؕϾ”"³Êkå˜7¢ucÂ0lkº¶2k«¡kÊx›¾?ìŽÛSç…pÞ.¬ÑÌ8%ÇÞi<кG„ Á=Š åeüùÄ9Éâ:7Ùxg'”aÆÚп!ÛÃýˆÑ@/…ñ„ŒÑbÑr&>AÜ`JKE-ÖfÚs;$¼y»9<}¦&¢GYf…Ô]D|:3Žq.t)d¤ÖÌ;åèz›,Vz+µg\ÈÚpH$I-Ö­dRé‰áDÃñÇiwæKØÛh°ÒY¥Àñêp(#÷¹Sž -ÖaRZG7kHlLø™CŒ‘ç¤V-Á®§Ì¬½ÅRbíZ5Þ<ìv7›»¥W \dè(£Á %8Rs㔩58Xa5]g¯ '9gVaBÏ]H5owOw›¿FiË ÈåVõ5¬tÖkf±>)„ †9!éÂ9¬àå…ª…é<vÇQƲÁšDÖÓh¯ÜQå$µqP0¿´ãt6¬àÁ„µuÉæÄZ YY„a.ý}¸ßÇÉÔ1 ¥¬…}ƒµ2$ÓÖà:·8‘¦t³=ý‹gò”°Ÿ1†0Z¬Â"Ç%–c9á| ¸ð>Á¡´„öJkÛ´¿^»ÜÞãNâ¶!wi27 ûn-æRdq–™ÔÂxì¾ÏwJ´¸ÎMN8Ø  ´ý›g7PÅÀšj£Å#T½°/ô'Œ¡ë¹ tbg°Æg<ÌüÅ)°~ᆎŸ67àÓñA‚MHœ,V¥†êŒË“a¿Û=?]­4ËÏ1ºÏŸLƬjLXKŸ,Và•nV‰0„ß?wû‡ñ" pcJµÉbª¤»‚B '®ìXnC›3Šä”"¬gZ¹@™"2“¥›ÍL?<©‚ !a´X#T £^ Ï™€Â3霠CN+ÈRBÉ)Œ"ŸNÀ>R„0XÐ~)£}®Û^ˆ<[áõìˆ׹ɉÀ%ÏBgR³¹P±ŒØ9ÓF‹5Bày(1„焊TÌpØ­‘!'‹dؘ3«"—BÅ⬹,©Àk$Ìq¤’™,%•ج¼ù¶°Å·ÒF‹5PÇ!EcÙ“ƒN„4, Öb‘BF-Öa¡ñ\xòŒˆ†Í p4Xá•°}ƒô¸Ï^ÂHaM“ÇóÌÙ€°k…>)‰ «&È|½unp*«àÓž±ÙL¤šŒ¯¯¡Ë„©†Î ÏÊ{'ª§CN+È–<ïì¸&Pú 0Œ’ÉS‹>ëIØ ')³^f²”õb³Z)EFØ—ReÂTJå„•RTÈY)UDîK©ùÒRjæ4%•RÜã™ ,¥2“¥R*6«•Rd„})U&L¥TNxQ)E…œ•RE侔ʑ³PùdZ Áâ=t²XVB3N˜oö·ã¹2Ø»@ˆ-Ö¤t¯åدãc€P°¦cŒkŒOoÅI¸îÇí *1ÁF‹5Bç˜ §S~sܧƒ˜üôàô´R ‰c`âqc+£øbûtƒŠ]s`OH†ú ²¾àíû#Ê+šNüp·9¬Ö2Ø.õœ ' sŽW„Ph[åÚB*­&9‘n,®s“ÓGÒ–‹Ð¿9žmÆó^?˜f¬yåì1on§¸Àk\ÇïÜÚšd*X±šï{8&³ª%s9¤óÍW†Yßclÿ¼ÙÆï2Ží¯Žo7ݧ”–Åñ©ã>tVP–Õ5Äà;nÚ@LmûÎhó–?ñ-0íéxØnŒK&œ;)Ý{×"¡è«y©R@´¿»Û6Ò¯ãö¶ûÛSû§Mû#0»å[ìnƒMí_î05r±Îêû·»¶‡í»ÎПn|À_Èå»|ò.t|çûݱ{(6ƱÅáä›Ã›w1‚ƒàmljaGý…tãùk¨ñ Cñ"ŒˆØä"à¡¶µøµ}›ÑÛEàRö-ÛŒèOsÅ,Dû9"SýMäÞ‡ÿ¬­ö9¶ºqäç„*˜|æˆÌá&8˜°>t;€9/˜:2Îý8èqÌq¨o·]ÌlÚ¿6ÓçpÄ¿mîÚ_Ýᢚt3†å7ÊÌ(9wç{ž¯’ÉŠ³05{ ËâÀ[Ç¿Ç%TZð¬åókÞÎâ:79Q IØóë †ŒÛ1&»¬bÙí7Ä)<äaØÆ ‡1î…Æ¹îYйK¯óéâÔž+ÖÁÙ<ÁOM/YPª=|k.mžšÅüíZ™í„nzt ' qo6Çî©fl¦LéÖózšEz©«} ç}-–ØŸf±zXÉÛþ5‹%ö+®ÙÍ´~èº6âÔî–#œêk®- øÉTgXÅUx6jɼEµy¨YÀµý,Ân™ª­_¯`IÝŽ›ßvxbw\)±ü«°-ùÈ‚pûLA¸ô†)K©Ï,T‹±UU N˜ÄàeÀN >à›—‚“Ñ%%x™. Ás< œ¯ÿ‚p ,¼ T{æ& …Ô¬*§cLb– c³ gát€Q^á‹‚ð_Xg ÂɈ{Ax9 ÂGÈcÙNA8ìÉbÑAFñÁ /­£‰ <|²XWüƒ’CöiÍ:{,háè “Å ¤æqÂØÃ½|pa‹.‘—S»Å Ëb¹ÉBKÍ*B+:Â$´ªF¡Õ€ðœeQdȽЪŒœ„V#äÙY¬1B)«”<øB8C%k„¼,9;Ô°Š29g&KÉ96;OûOš´ÿШý€´ÿt„Iû_!ì´ÿCOž1ë:©>pÒþ—y“ö<>=QØ3ÂQOkŒÁb±¤‡ŒósNrüvKè¡ê§|?¬2»|²û ¹ÁÂý„Ô¬r?Ž/mé*„qK7 ‰­þ±—O¨ßß=):>]=Éÿ»y"ÿóäCnžˆsóä‰üòv/¢<Û'ßcó]÷`{ ¥•·÷P¶žøöx‡×KNdØÙ=øËÛì ê³ã[6˜€ß¼»ïî´ÌÝAqr‹Iè%{tEs˜¦Ê‡aVŸºƒò7ªž£endstream endobj 2961 0 obj << /Type /Page /Contents 2962 0 R /Resources 2960 0 R /MediaBox [0 0 612 792] /Parent 2897 0 R /Annots [ 2964 0 R 2965 0 R 2966 0 R 2967 0 R 2968 0 R 2969 0 R 2970 0 R 2971 0 R 2972 0 R 2973 0 R 2974 0 R 2975 0 R ] >> endobj 2964 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 461.3395 516.6856 473.2947] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2965 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [86.4728 449.3843 98.428 461.3395] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2966 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [202.5428 449.3843 229.9955 461.3395] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 2967 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [256.0945 449.3843 268.0497 461.3395] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 2968 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [334.0042 379.4467 361.4569 392.2984] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2969 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [388.7988 379.4467 400.754 392.2984] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2970 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [462.4671 379.4467 489.9198 392.2984] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 2971 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [320.1118 366.3956 332.067 379.4467] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 2972 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 92.1283 516.6856 104.0835] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2973 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [86.4728 80.1731 98.428 92.1283] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2974 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [202.5428 80.1731 229.9955 92.1283] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 2975 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [256.0945 80.1731 268.0497 92.1283] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 2963 0 obj << /D [2961 0 R /XYZ 64.9134 727.2935 null] >> endobj 678 0 obj << /D [2961 0 R /XYZ 64.9134 676.5464 null] >> endobj 682 0 obj << /D [2961 0 R /XYZ 64.9134 307.3351 null] >> endobj 2960 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2978 0 obj << /Length 2842 /Filter /FlateDecode >> stream xÚµZKsÛF¾ëWðHUŒÑ¼ÇMìl9‡$[Ñž²9@$l£‘Z²ã¿Ý=3ÀIíZ[®2À §_?¡ïïoî~ô«À‚•vuÿae5 Bé•SœyÏÅê~ûûÚ1ao+Á9_¿}w+Ö?Tpµü¶RJ­7x±|‚uß>´,ÚþVúõ׸¡Ýá³çþnÿ ¿ýý[Ic¤*îöûŸnÞÝ߈‡bäAZ¦ƒ5«ÍãÍ¿o~ÿƒ¯¶7|õÓ g.¸ÕXs¦‚7«Çm3Z©|§»ùíæA¾ª¤f†{qJжGZ"9¥EwNh Áð~žV|­´ÌoLIUYÐÊθRDò{4‰”…Mœ`Ò³²A1+‚'›ü°ß6GÔÜÔ~20 zú¸©=¢ôzoÐL-ªþSsˆ†©ãS²Ü¡Çguo‘ øF·"…ýôµ_H{f”A0í_•‚}›®’W”%ƒc´4ÕVÿõ©™3©èJðbç À¡˜P^.C£(V%ÉS•”€° ¦<6‡Ãþð/nx×û7·zYî‰9óFxÆ pòzFÜ ­AÃéÝ×ð©â\ýÜå7ÎúŠ5ÌI­Õú%Wñ°°V’bý&¢¶>d÷\ ]mÝg÷ØF€£Cšm»©ûôÙ†à~é[ß&iôK¢Ž@/eEüDy7}»ßEy ~kÜÛ7I¾úc’+XWtë]id×nHE&ÔÜÔD ñôLX­ƒ¿ŒÚWÓÖë£v 5%M½X,¤J« ÓÆ’~½Uâd_c¬(*yð$N®¡é½¿ÿüϨ·_eûnÿ1Y awÈ €F² ‹ä„<9Ty­lJÙ”¢1m i1mW˜·þ`Þvf½ÙãÅãÀ9}hñ§kc@'®idïgÚqGûŸ{¼$&ÚÀóA×Z›¡dˆ, †¯ßïP5ýˆÀïö9 E(]ROIíþÀJƒÃ¾…×Þå‡Ñ áåû»_âbAuHá±ÞµTŽtäܸ3æ°CõcÚÚ>>QÜ ™³ûZ¼wv›Ä$Õôl¿Ë»ŠòâôûøK„Q‡aëë¦>>n1éV‹~F%ÔS¹È<ÈCÊÅ» 9üiLÀÍ` @?mD¬>6q»uèº`<ÛîñµO‘;|X°ÜŒ¼º¡Æ‹WJp–÷—5í¡úHäIä¶oë5ÿ5ÞŒ¼÷SEÄÊ4¡X¦W¡×B¦èùåÎ,…Õ 2+P Ò}sæÏ«’âiâ‡'ÌjpÜaUi»Á¥J@PN$1P¥§¢JΤ‚ ù¼¨ÂA°¶Z½ž¬ÅkÂ:LJõDØ}@&Òf¬Ë’b¤{¢,]ä Ï9‚8™×kD)72BáÃ˜Í³ó¦ ¿ Þ†Œ•cÓ܉k–@wþžØ=©Û8ŸvöM×-Ò Ô›é½Y ƒá3dË?=5»í- àƒ^¾ª€¯7õ..¢þÈs* Ym§¡0ƒ¾*þ-Ë §ÀÓ>¡!†É±b#~ªZ¦Âø²¿ÂWW2ŸBãu‘ZçÑ–²ÒbZžÍ*æE0#–vw|Áøà=N¹€ z9î¬Ê`ÚwÛEz0¥rNó(j·?&Þûä"¸^ âø Y›Ò ^ZP[3Fôñ¤“¨Že¦–© „ #•&§¨cä¤Mg¡Õ . ¯Â€üFØiÄ?öH J)FM2^`Ú‰Óé^ª)ôI¡°d Ì•’a¢Ý}\ôH˸Õáe‘â]("Å9’P f>®×©ùÖÐ$>Åú6>ÀëAd ¶ù ÇDÅ¡?“¢¡`^ÎâúE— 9\t0º)›NætÕ à_ˆ´à±ÜbŽ…{Ò¨,?šã»#@is2ŸùƒÄPp&×ßÞ¹eŠUIr¡sC ìx2qÛîþÌC½Ue“!Ì‹³,ÁxØ<Úë’ÜF1)ÀüÒ¦ß.w¦X•$—ä¶ šøaÓ‚Ô–íÎHsFhQ ë’ØÐ>X'5 Zá×ø1P¬J’ bƒT^p;ž|*¸³,€§¢—2M„Ÿ»Ï"úß6Ç Õ¤ä?ãpÂ[ñ ¡Øm×ü •ÝxÞì#€@±y1ýï1#‰jRX\˜½áãØÏ¦ÆoäȬ$?3u‚n<™c[fñZ׎mÔ¸ï㜎¢rò¸lÛubbÞiÅÛç:c$ö?Ä.ñËÜ]}@]¥dÈ›Š'XôWi°€æ•^ÏÀ;k±#¸Å!"]в‰ëcb©@÷žIåíueüV’+¡ºu³¥¢WT28jw¨L2±é„ãF­AÅѤé1™›ek—›kо¯N,ƒ4´¿ 1¿´„K)Hâ”Ì ]ÆyI+(o™ãÜž&ø%'c`פ¯8òçÚ©J¨ý›|îy(†l…”JÎÄçŸò«~¼:™=³Kά'‘óŠ7c=,‰7ƒ:òHJ.Œ¤Ädö —ãIžq`ü*$ÌÿàÀÖùõû™¥qØË@8ªGø­OY9?Õâ—|2”ç׿Œà™ª1¡f©hêÅÑQµ ©u×&ÏúL¸ä¢P™4/ xZ›«>ªO>Šç¶i’Ë©›Rq‹êÄê=ÅܵøaÂL‡…H3Wõò®ªõ³6ébp‚WæŒqÞS¿HìWsÑÂ^ì£Ufz’wÇLÙY=VÔÃȲkÿŒóúð@|egå"Þ€°‡hÄkÄþöø.™åi>‹‰cãJrÅ4~ñ˜„¹¿aþñ§°«²9b´xŒÛPÇû‡¾n'‰Üù"‹ÂE½Ë_åâÑñ ÛÞgä»ë«v·ÏÛó4Esi4W§mu‡ó¼H$Ïà"·ì~ý9õëŽæ c5)‘!,~:Ï“íH°{×ü½Â3è§õ4xÍ?ïÔ±½=žéLKC¼#ÿŽãÌùˆøßš“?ý˜ÿýH1÷D°`ð\Š’–.²KìÁîô5¤Ÿû+¾üW޽9vÿg­s=endstream endobj 2977 0 obj << /Type /Page /Contents 2978 0 R /Resources 2976 0 R /MediaBox [0 0 612 792] /Parent 2990 0 R /Annots [ 2980 0 R 2981 0 R 2982 0 R 2983 0 R 2984 0 R 2985 0 R 2986 0 R 2987 0 R 2988 0 R 2989 0 R ] >> endobj 2980 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [334.0042 677.7792 361.4569 690.631] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2981 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [388.7988 677.7792 400.754 690.631] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 2982 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [462.4671 677.7792 489.9198 690.631] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 2983 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [320.1118 664.7281 332.067 677.7792] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.7) >> >> endobj 2984 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [193.1235 505.5709 220.5762 517.5261] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.1) >> >> endobj 2985 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [250.0323 505.5709 261.9875 517.5261] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.1) >> >> endobj 2986 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [496.9816 409.9296 516.6856 421.8847] /Subtype /Link /A << /S /GoTo /D (subsection.7.10) >> >> endobj 2987 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 397.9744 99.1185 409.9296] /Subtype /Link /A << /S /GoTo /D (subsection.7.10) >> >> endobj 2988 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [251.9619 26.9145 279.4146 38.8697] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 2989 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [306.7565 26.9145 318.7117 38.8697] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 2979 0 obj << /D [2977 0 R /XYZ 64.9134 727.2935 null] >> endobj 686 0 obj << /D [2977 0 R /XYZ 64.9134 605.6677 null] >> endobj 690 0 obj << /D [2977 0 R /XYZ 64.9134 572.2791 null] >> endobj 694 0 obj << /D [2977 0 R /XYZ 64.9134 385.0299 null] >> endobj 2976 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2993 0 obj << /Length 1401 /Filter /FlateDecode >> stream xÚÍXMoÛ8½ûWè(Ã!)b‹Í6-Ri¶uOm®­$BeË+ËúïwHJ²,3¶»É‹±DÞ çãñÉ—ÓÉÅ›,2Ä(®¢é]¤€& Ò‚’,£,š.¾ÄŒfIÊPë$e”Òøöc³øÃûo“T_~¾~Ÿd"ž¦h_ßøÕÛW ‹__ÿiÿH2ˆ§WŸ’oÓw“«é„EÿØÎ%WŒ’Ñ|9ù{òå½›P¢Žñša2-' ‘ D·RN>MþêÓ1B^Ú­rØ«2œáöz›Wu3û^”6ê¢I‹Ú ÷3E£”  àž{{ó¹Ýs[®ÊêÞß®ë|QàÊ܂͚|c?‰‡Û‹ñ„&™ô)ׄ)bMEkʦ€)Òà#Öt“çÅêþ‚0‘ ¸n _ 4¡”ÉÖ ÉËò)¨43DÚ†H±3€rOL£â|i]ã&Ë~“‡ž8f›*¥ ×¸äƒØ¿RIßTÛzž›ƒ)A”æ¡o¬µ`‡Ýá:À·3†c{ÂDÆ»ûQsôˆéÒwÇ0^¦ÉU;Ï.àbõÃuÂþRÄঔ#Û=µY<º© su‘xB›ØT‹˜!›ÒœP`;Çã=«Î(v"×}Ùü¼Î7sÛæ…+|ST«@Áû£R¿)Êüf¶Ìw>‡s•)¢3ͺæÞÎÝää¹ý¿@Ÿ8@‚ñ¸¸ †Á]µOv^=v"ôvÛ•ÝÈWÊ?—ÖÃcÑ<Ø+7¹_²¦3×ínçüζí˜oѬ®ó•¥ÈƯ+;Ûö®õV:w¯ìš´ò–­Í£}zÖÆR­‘€µoÕŹðMÈ2†dÁ`¿ ¿ÛÇrİ&ZÂŽ<.E@Þd’uÄñ›§2ç´ô%ð`³„+Þ§Wç[Ûƒà—ƒàݦ©Þl™6îÂ>°ìòaÍñþ®ƒ-6íâÆãÛTMeQ`ºÈ·›¼OŸÀÞçgH2޶úù”Ò#¦CÈÃéš¡5ì<Û1/ÛæT Ú¤T˜áú±Øì’ÿ"uŒ¸å`OqœY7$€’† ´‘ûs< ·ãƒlž½FdP,<È’c àô$ãñÎÕÑIEq”ìAžØ1õ øé,¬ÿ½™¶_Ú™a?×h×Ó M\m›µöÆ?b}—– ŒÛŸû®hº`ü\ûÙEé!˜ OL{ŠmiçÚç¹¹ŠŽòÐ` I„¤YkUÕ!‚à¨Bx4[¯óÕ"µ/.#…R^ºÞ4¦£O ¹K¤] ò#ÚØDv쀷–|Qê¥MeG‘Fw|€pE{ àå*ÌÒmø€ãO¶'SϦƒ0"²d@Õ|çØ•ÄvT€RGÆÙPÊ¡‰JP£ÜoŸ.á˜å“\¡PJàgpŒ¸b_j{ª¨}ª¸r‡@U»"=- ½ñMµÊŸÐÅCýëú\¼°> t8G ¯.hÒ×ôlu^•‹ Lª a 鲕æò™Ò¼×kNÕÙïÉ[ #DPßÿšP„=Ç£¡g¥yYyÒêžb¬öØQ̘²½ ÁUOÚí¡:[-üEoœyÓ¢žÙÛ4!²ÔxôC&ð ÏP›K|à\®ñ…ó¹Ó#¦CÈC†áxºP|ÅÝy>[o¶ÜŒ¦|×ÿI½*WªAÁ –øóÐ×̇j,˜e]lÇ f¤}Iä=Põïœ=b:„ ,#Lc‚{³ÓGÂ1Væ Pg¢Í¿¡e8–Åÿ“–åIZ¾Ïü©ã×ha‚(cý~fó£X‡xa(ȸƛ³éÝ6ó?«Š¨‘endstream endobj 2992 0 obj << /Type /Page /Contents 2993 0 R /Resources 2991 0 R /MediaBox [0 0 612 792] /Parent 2990 0 R >> endobj 2994 0 obj << /D [2992 0 R /XYZ 64.9134 727.2935 null] >> endobj 698 0 obj << /D [2992 0 R /XYZ 64.9134 652.636 null] >> endobj 702 0 obj << /D [2992 0 R /XYZ 64.9134 353.3072 null] >> endobj 706 0 obj << /D [2992 0 R /XYZ 64.9134 89.8438 null] >> endobj 2991 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 2997 0 obj << /Length 2066 /Filter /FlateDecode >> stream xÚÅYKs㸾ëWð(U†¼9$•Ín’ÝÃdSãœv÷À‘(›‰$jHjìù÷éÆƒ"%Èž-»*‹ÝF÷×àïîïÿf Gœæº¸ÛZÇ„,Œ ÄZÊŠ»Í/KC˜Y•ŒRº¼[Y±¬»ýª`tùt\±euè›ö°úíî§B K”s¢ ~2£‡?Ü- Ñ‚pM¤ÓªXüF‹Í‚?-(1ÎðL‰pVû…T‚()DÙ->.þ5*,“Ærªò;\ç“ÕYG,/´ãDr)¼{÷õ@¥Šþ¹9\ºÉ'ÜQyžpå§÷%8ÊœãਠL€ø~áæ¨±œª¼ö“ _­ž»º~¨ºj=ÔÝ•£¬rˆøÛ9š4¾ä¨Õ„k£.m75Ä”ùt(ìˆ4°fƈSЧ°ßŠ:7„ÂÊ-%R;öú¥}åTa.â8“#‰=qcˆuÖ½¡›IãKŽZF¨0ìÂÑyÄá̰yÄûÿ6G ùn/J[â(7…†Å„{ý¢’Ærª2³(à •ìlørM Ï&ò€E€IÜÀ¶2G˜´Ÿñ}ݯ;£aé8D@º°E‹’ @ ¨Âiýÿufm ‰J&©ŠpÖŸÖkT_{ìÛ€µ°Ðêe³ÍSÖÏâT4q­žKb”•Qæt@ÿ¥L¯7áÕ«å#>708<„ᡇúiOë7ËDc¿Á8£Ã/ré]nW%·Þå:¸ÜÕÕ&ÌÜÂ`×î/4ûY'üÔÕ‡Ìvtòˆ† ¨@Õž„ìc‚~;—Ò/dèÝ*8õ¡q4CüõïrY>áÚ¾¬”ZV»´ôÑ&Hm&¼°‰ÄÅàÁ^^C£O6cߣÆrª2W¨ŽPkíÙò$©ŸK7E4iXÊö>kŸÏ>˜û‚ÄÞ…÷cu_‡8Z…JI&T0·Å\¥ÿ îPBùálösgòÙ/òùìÄížË~TÿØ`Ús§CrâÐ!‰<…<ı|à´uLþ89d>~Øú´Ç±æ%å“Ì¿LFœÔóœâ[Ÿ‡Q°Jú¼#C, X(•BÍ19¥?®¥‰^…!,‚ —óí¶©Ø@ ,²B{•÷ œ<tb†ÿßšy(«õ?§°Ñ£ ǪOeùPŸ—0Ý[£ëÑÓÂu—ÖpG™Ú†ž|I½ž\òäò-yã>üuräævzšáÈOðì²óp(/76îÐÎÇéÊË‹–ó±ŽnÕ]šâ_·m—‰ƒf¢ðÄIN”2J‘‰ñ×C\ÒXNUf NBÆ8åΖĽç×Q€Õ”»·¶9`@–­’óùy%ø²í†êS³ó­sX Åt{s¼¿øw°ý³O¦]{]éê ¶(ŸJÕPûrÈùú„!ÚÎNš ¬Î$œt„J!9ž†÷9¶G¦˜‰Rï2z€áR–*–œUSÀZ‹™ \WH©B_^‚Õ{Ϙ`y»qy×V ØÕ#ç2Éé—X¥€hpYi%”±7èÀIc9U™IO­‰eЩG±kªl4T36ó),Cýšê/ÕîT}Úݤ¡Ùˆü>*¦Q|¶ ®Rr2ÖOPK&9SÅØ{ºtu_Í:öù§ãègß§ƒ\{¸A0áZº× n( 4Ôõáuë_rÇTØ jô¹]s J´pø:'бäpŒ¨±œªÌq AŒÓÓ(öÇ Zè[µÁµƒÚ@‚ç"!µ_Bm„çê€çm=) #]8}ïë@„a×1Ê7¶7F½Hü¹„=|Oþ@{O¾ S¾›§Ì3”‡Çíÿñ@/!5PG´Öéº%ý•1ãFº26ƒåïŠCÍæéÓ„žàÕsP‡Ú…îŠÇÃC3ÔñfcWzÿ,–÷]µ÷}¤º]'Ayº/òº|½Æ 'uøìÕU©xª¸Çþ9üŒÇ¢z{ Ü 7ôÐÕl‡ºð÷|[Þ…`öÉÎ*œÀK̶Î+L1/ጳüG‹ ïÿxM_üS”ÇbPöãG˜øÏ¨¤ÞÖ]DǸ1Õ7´Æ°L¯jþ(Ji8ùi;tÇ“ÊFw±¿P‚ІIàÉ× ×?x Þm‡3ZR I°IzÆò‰¢U4TQÑ×>Õ\0†ÇéǤ9,ts¦ µÏå8ÿÔÕNåïÓx¼nˆ)3Æ”‚ç1fq D¢êêù‡é¿C†sKŠé1öåv‹¿<ƒ—õÓPnÇÄf2O‰]^ô—ÜÇ 9æKhÎgÊ`q<§ ijýýj²äõ/F2\A£w© –åŸ2„$±t›Éæ×œFF,>ñxuè´¼¢šÞêf­0úÄ<Ò=J‘Ë—Xº¡šmr½™ùqð)îÌ$‡|x‡6FÖ7‘ vGž%ÁÑwg³#Ñ÷GøÆNú?Pƒr®endstream endobj 2996 0 obj << /Type /Page /Contents 2997 0 R /Resources 2995 0 R /MediaBox [0 0 612 792] /Parent 2990 0 R /Annots [ 2999 0 R 3000 0 R 3001 0 R 3002 0 R 3003 0 R 3004 0 R 3005 0 R 3006 0 R 3007 0 R 3008 0 R 3009 0 R 3010 0 R ] >> endobj 2999 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [280.8554 610.0608 308.3081 622.016] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.1) >> >> endobj 3000 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [335.65 610.0608 347.6052 622.016] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.1) >> >> endobj 3001 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [216.5411 502.4643 243.9938 514.4195] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.1) >> >> endobj 3002 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [271.3358 502.4643 283.291 514.4195] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.1) >> >> endobj 3003 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [176.1368 300.6035 203.5895 312.5587] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.5) >> >> endobj 3004 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [230.9315 300.6035 242.8867 312.5587] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.5) >> >> endobj 3005 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [213.3444 228.8725 240.7971 240.8277] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.5) >> >> endobj 3006 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [266.9882 228.8725 278.9434 240.8277] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.12.5) >> >> endobj 3007 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [452.1935 228.8725 474.6649 240.8277] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 3008 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [500.856 228.8725 512.8112 240.8277] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 3009 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [249.167 18.585 281.6011 30.5402] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3010 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [308.943 18.585 325.8796 30.5402] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 2998 0 obj << /D [2996 0 R /XYZ 64.9134 727.2935 null] >> endobj 710 0 obj << /D [2996 0 R /XYZ 64.9134 442.4302 null] >> endobj 714 0 obj << /D [2996 0 R /XYZ 64.9134 168.8384 null] >> endobj 718 0 obj << /D [2996 0 R /XYZ 64.9134 136.1139 null] >> endobj 2995 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3013 0 obj << /Length 2098 /Filter /FlateDecode >> stream xÚ½Y[oÛF~ׯP÷¥`Ѽ oRÀÎ:mŠbëm´@ƒÄc‰–¸¥H…¤mÿûžÛð"QŽÛE æpnçöoÎPW‹ÉùëxšØIè…ÓÅý4TvâújùŽÇŽ;]¬Þ[®ëÌæ^¨œÐŠfs×qëæ§™[?þðã·³¹ïûÖÕÞü0‹}k1‡ Ö›qïÍO×3×úç›WØy9‹•µ¸~;»]|?¹^LÜ©n'Ò m•„Át¹|œ¼¿u¦«‰3ý~âØQM?CÛ±ý$¦Û‰ |;P¾ozòÉÛÉ¿Û çfÇyË«S¦†‰g+Oùdêwi•¢îÊÒÜð­•/·Ò}¥Ø£›=4«´æþòžg¯ÒŽ« ÊY²Ìõ¾–öº‚½Å ¶ºª/Ðç¯]ÕÓ˽(ïB—°Z°gÄSûHË¡)šå%ʦ(4iµÍðMç,¼~ÜbÔî ˜±Uæ¼`«±ï‘gàPd3/1#Kçú6Ëew·GÔŸKóÏè†JC¹ÿ:@÷H,e¬Ó^:Ýè§;ŒÜ` Ê¼\w"¸¥QЊÛYÍÏÏUMCA.°/°´Œ‰ŽyV7öl(ÏZl(3Ýîšž>9b€´ox—*Ý\`AóšºÕ\n˜»®GþH $;Ô¥ :ý¸O‹e:;M£DÚÿqñþ ®Xï¾prŒ£v&@êA·úžµ¯³b-Zn$£n 0âÐ*‹ÿÂ냱$eeÁ«Ëa5­tSV¬¨çõ4õ"ÀMD×Nà›Øžï¨Þ”¯Ï@Ò×ÐrÏ=ü?ê./Ží VÉr#ð›T¯°R¨<†>Ö•ÞðKµÏ»%äJbrffˆ–£" '–żEÏ!Ø€ ù#÷Þ—9¹óè3b*Ýî`=ý†áFAFn/Aë1Ü¢ƒ3Û°$¤‰RÊ€è ðygÜÉ0üIÔš ¨ØZIHZÍL Û'ƒð©ù1dfìóºÀà6ÓÚä3©¼‰g61n3æ·N‡2¢VŸ›xŽuø¾«ÌF¨w¶äs§§òÙXV­gOe†‰só8«b׆ð¸âÊçÞ±³ÝÀ·Ë)÷Œ#œÝ·§Ï¦sÂ%F®‡IÐËÑù7œŸÇ¢}Ð.öz¢Y2ð=ÉÎýŒYÞŸ†vè·f|u‚:üž¬TáÙ®GÏ¦Š¨Ï­æ”&ñ%–t)¸…Øw¸=wŒìpyÒöjLø¥<¯¾à23íË9sàDÞd,3øÒûŽ7<˜Ä·½tGʤ¼B<£kø³¯¡|]ì€ÄQ#Oï›À¨ïýÅË[iVÙzÓ´Ð1ã/nÿfš±åŒcÿ Üp ZCŸ FÛåKpÆoW·ã¸js’W'1õêåû¿Î·ÿ/€v;ë.3q š²8äPEÆÏ7}†m¿ã¬>Ûiæ½Ïªºê1kû)¨H—æÃCÇã¾Ü‘†òË}³3×::Ž*š>¯×âç*Ûø*‘Äuyæ .JÚ:›í•¬k¿ Ãi• è–ù^Žì×ü{mÂ@-c»Þ—ÚÄ»Ã$¾ìrPŒÑ­à÷Þ7Qt5¿ô&r1mWPñnŸÕi;Õ{ªT·ì´§O1„çßÏ NoÂ¯ïø‰ô@¬ìðó÷¿bð÷ÿ…v¡endstream endobj 3012 0 obj << /Type /Page /Contents 3013 0 R /Resources 3011 0 R /MediaBox [0 0 612 792] /Parent 2990 0 R >> endobj 3014 0 obj << /D [3012 0 R /XYZ 64.9134 727.2935 null] >> endobj 3011 0 obj << /Font << /F8 1548 0 R /F14 2010 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3017 0 obj << /Length 2124 /Filter /FlateDecode >> stream xÚ­YÝoÛF×_ÁG 07ûM2‡ hÒ\EQä®:à‚4´D[¼R¤¢ëè3³KŠ”VrûÅ\‘³3;³3¿ùðÛÕâÕß³(g¹•6ZÝDV³\(¥Š³,ã"Zm>Å)é2œóxµÌT\v»e¢,àmüçÝRÄE³¯ÚfùyõS¤UÆLž«ˆÓf!¾^¼_-¼â‘8‘–éÜšh½[üoñé36 ý´à,ÍÓèÖœ©<3Ñn¡bF+5¼©¿.þ92LŽÉ”å[TNʉvYÎ2Ù\2-µ¢ãû}uÛüÆ ÿÏÕÇ«_û¢ë¯Þ7x!–‰‘&~8­Ë´Ì¢D–#is]Þôn«£uÛÝú{dqE{ù|×÷o>½~ó×ÛÏG­»êvK¢ \7LÃ7­–èk;¼pÄÇàèû€A$€·vˆ=uÉ$À™FHfu*žïÇdÊ2àxJ2Í@6\Æåw¸ð8õI°F1LhØ7 ¥ÐµC¢` Lnà²l.^À¿=ÃdÊ1 ™ÐÌpôïlvéÕ;öCêSÙF(÷k„ŽŠœ¡÷yòè€RÏq}áús \•ˆ´±,V=ÛDÃdÊ1`"° ·BO/Oá­ƒky°Î4Çä)Ó:µ>ð÷÷kÂÛ°E¼ÇšBÆÕMsç¤n/ 9 seÂ=•çWàVG¹ƒû3G·+è*èkšgL¦#(“–¡– #†“Àk­ãÕÖ¥0”YðÞå¾;¢pñ¢,SÜÎã…’&V\i¥ã›¶®)ÿA2zØ¿vçzÛ,×G ý7…ÜéÅàjÐ h~XñT=b°>T_3ëkg}ÿ±4”¨ŠkÄÂòʽ…Lïžž˜Ê‹ ©‡ `ãª~8–P×0'^13D"2ˆ} °ßn‹L y!}!¢BÂ‘Ô ƒð°/‚ÑÄ1™² c´RÀz$;A²¯ŒU!±Ü–—‚õÔ2 L“ùh*¬Ï'n"-VáCñE)³Ä‹‡#b‡ßÇ @qéçC öcZ¤’©TgO ê€SiÈkàùK9Õ3ì‡w?ºVÞPßçf&A~­¬è{¿žZñgD2Eå¹+«×‡—®è±ðWÜ–Ž“àù¤p> XmXšJódÛ¶ývì*8M “@ˆØ±ü|’!Ð;´"T9@ #…ÊfÅ7xÛŒ Ø3i23‡óúdÐÿZ©#6”èèÏŸa2ål­-Ä©¾z$”ROŒ/MŠ~.!‡l[B‚öw÷ófWnª5õD7É‹úê­{MåÖÓÜ.\vŽ+ ~Ø ÞãsPS΄ï]ª&("<rÕÚË8‡GÂÝ*zvÊ àß¼Ø[mK×þøË¿ÝâêÕÖí­ïLÛ±‘¨j<4¾< 8«X1M-»&bŠ6ì€%p@ T¿w êãI—I¯ ÁŒAˆà Ùßá*U 8ÏM¤$àP„<×GŽÉ”å©j8žÑiv|ܪN= -5`bë§¥ëð·áæ#a¢e ú‰£ ®+ @ è3âª*Z©ø-NPZù :¼;#h"¤”é Ïâõ}GžŽÕ,eîLﻲ. çÊ~kÛàâfJ ÄålšÄ¯TZ"¯ 9ªÿqçùâÖ¨ÒAI»»«¨Ž# ulÐ+6Ä w8ÓA×%ð’Ø+-^¼¦σ×HlûgsRÁŒ±ƒ+¬‹Æ ¸¢R%£aפٸl—XcܵõÁ,%ÀáÁÜÙ¥) è&x׋käøˆµ$˜KÄ<Á\aOeãT‚DPù&@ˆÇg3xÏšþº’°@Çÿâzo3D§Ñ°êEp½NÐ ä /g¶‘ã#fÓYÊxªÓ¹ÙÎXH2=÷ F@©º†°4)…po:3€tYÆÕOï BÚîP½gçç¿´MùÄd>¨9ý)sUõè\õnÛûò• 0uãýôkÇ–žSpÑað?'/:tOfQuµï§ëqìv4º¾°ýÜ(ëèß>Ê:Èþ@+/üçÃÑÿUٔݙŠªha¸¼89ä…Î žÂ÷‡\ƨ^à|™`ÖÚŒ~‰f59Æ´Ób^ÆçQjMÉõöÞu6ðqSbUØLGp¨!¡ºížô¶+v;@8ª e Ϊ3qT7ÜûL‹ˆkƒ[Ê0›åhs—÷õ·;¹3y ö™NéYÐÝE>öòãñRuJ[ê Ýn°òæ|Ûsß°³2í.Ì͹nz¬sié¾aØ8eè'IØOÍB2JßxÞ´Ô­m†ÒSÀÿ„¼Óíendstream endobj 3016 0 obj << /Type /Page /Contents 3017 0 R /Resources 3015 0 R /MediaBox [0 0 612 792] /Parent 2990 0 R /Annots [ 3019 0 R 3020 0 R 3021 0 R 3022 0 R ] >> endobj 3019 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [336.1323 381.6384 363.585 393.5936] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.17.1) >> >> endobj 3020 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [390.9269 381.6384 407.8635 393.5936] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.17.1) >> >> endobj 3021 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [227.7641 317.8775 242.4867 329.8327] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj 3022 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [273.4297 317.8775 285.3849 329.8327] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj 3018 0 obj << /D [3016 0 R /XYZ 64.9134 727.2935 null] >> endobj 722 0 obj << /D [3016 0 R /XYZ 64.9134 584.3366 null] >> endobj 726 0 obj << /D [3016 0 R /XYZ 64.9134 173.9797 null] >> endobj 3015 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3025 0 obj << /Length 2584 /Filter /FlateDecode >> stream xÚÍYKsÛ8¾ûWèHÕ¼{ÛL²SžJM²‰ç”É–›šr(*ŽgkÿûvàK‚äÌZÙJ¥*¦Àf£ÑÝ_ãkàùÅÙ³Ú…#Ns½¸ø¸Ð’8&äÂJ¬¥lqqõ>cŒ/s®%Õ™YæŒRš½y»ä6{ýêõ/Ë\‘=ÿýüÕÒŠì"ìü·0úæíË%Ë^œÿŒƒÿXZ™]¼|·üpñëÙË‹3¶ ðSrM¤Ój±º=û|öþ]\Ñůg”g÷ðL‰pV-nϤDI!ú‘úìÝÙ¿…y¯1Ÿª|ŽKå<±Ví8‘\ ¿Ö»›¶Ø”PEßø§Ÿ–¹â*{Um:dhüÜcŒâ¸105~_mpé2+?oaéÕ—¥ÒYQ—è€fÉ]Ö…×¼\es›QÌð¨ìˆ1ññý‡VqE·½"§b‘\PNœà0.ÀTzÑ—-˜Ö®ñÿÍ¡Pi¥Ór?R>!TÌ9>•™‡Š.rƈSŠÖ¾£ +>ö_Šº–‚pjm:ê†n‚µhH,Ýw"—„KÎw"Û€g|<+xènÊ6äzÞÖõ ¾îÂ8Нç2w0T´]UÔa¸®¼³ý7;çŽi•]Lõ4? *qw†XÍÜÜSÝÃ]¹k¤`ŽHF'’ß‚0ù™J‹|ИOUîÛ(8‡ìrlncÙBþ"jê(SOmW̪ÀÓ9SžI Žßž&ì”0Á‘w&B)™õŽ}[ÞUs)¿‡…–÷c`e²²“a娷F¬LÝu+½ä ±2Qy +SSXÂ|0'óòé3Ïr©´}ÂR€Q¢,H¡KÞ,‡4ìŠËªö¹Û-Ëösžö;g ¿üö{¤=¸y®ëõuøy×–W˜µ+TVt¥ÏÞ¸#Cz§…Â+…ö AIfáÆuö ‚9+“0:[­4¬ÃÁvÿ#FŒÊŠæ*<”_Wå_ù÷Í&ÁpRð°”*N öó&è‰2&Tòâ¼ôŒ&t M4ã2Êý”Ðd¥LEM·¾KëaD $æQ5 e¯&PVÒ¨ µâÉp4æS•‰’¼2C3£‰uù¥¬Ÿâ²^à²-‹O§ðýMQwÏØ“}ïÕ¤ÌÆj#>K³‹¥ÓYy‹‰†%¾°±?Ð0Gµ†=Ƹcî¡ð”Cö¹4g‡’ƒQ‘6 )9Ôò''Ç 1ŸªÜO(ׄíÆ™‡äð¶ãR¡j¹ùÒ|ÌSkFçc ÿ[ÕtåõX·w}€rÉ¥<ü¢Ü¬°U>F]Õf?6;%pˆÊ‘ÆÕLÊt“+¬g ˆA  X,W[ß” ö—]x_~-}íÄŽ í€ò$¥ÈÎ?ÆÏaø¦Ú ²(ºÚvXrÁf?zÚŠ(R!ͨ€Rt%ÖI(¡[(˜‘¨´a¤U¯ïòп}A%e€Ì¬Âhj»ŽozK®«ðA"Úû`Ñb…2Ÿ`Aà‘nÿâ‚Ê~ §šb‰—°ø]/xë_oüæR\—‰X1# ¸ØÆ0üݺõqõ»¾]yõŸT‹+ˆæVOÈÎx5P1àm| EB  h~ÝÝË ‘úo±©•І×F¯ãW~àkÿáÐàMcÐ<¹‹ý¢õA…v>» öøç"áe‰†/ûE5˜uõgy–h©-ÌÈ¢´_z²²«úèàLÃM°8¸5®‹AeÀµJHíµÿBeR!\S–)C¸¦2µÝÚù®l…v³ðÈà¶Ï0Óv8…èA…¯»Ôñƒá„sË&5×ÃÒg ¹„Í êæEfô@(|€{Y¯qv|¯oà@é‚"gÕ|¯1·Ôñ {@Ì96 ŸûJ2;zq1Ñv*JÈUÍT(* ÕÝÄ EU‡RÑKBm1¡¶ÀL#¬.P[raÔ»òÝÈÑÖ5¦Á^mñs—áÁÛ¸Ƈú‚SD£®Ñˆ±0ôÀˆ®™…d,3Xb±ÌôgP71FјPaâ:£M¾ÚJqÙÞW!²ÉlÅ\©§›ÆšC¹ûÇe}¾Òt¾µv;†¤)”s {¦uótM ´à ®5ÒFódŠõåS…ûÃB©7°)R3~±ãè}¨ÔCÜ ¿1Ka0SñOSÞ‡‡vDM»é«øPý„=–FAzÝï¿«^f‹EÕ\‡÷ýNÊ.±J6Ídg†ÆJïæ¿+vË%Ü2”RiE¶šby š«ÍΊö·W"‰Þn;ß]ª‘®>D(ù=æ.dNLÕÌȉ ùúcþàz|ùi˜4*ÛŒ»lVQ –›…šÏ‡³ÉŸ»:‘¨“ÀFcƳ0SÆRu~]ÙÞ†¡¶„v5lÌa·(b±û{Ê îén©HÉNöK&‘óCþ+E(£êÉù?ḩ*÷ ™¶  †&®?îYÈ-Q†šZØk|ÌBè° ìž3?VuIB íÏ4õœbMÀˆºÃÊÇΧõ:ä&¾ö{þ oÛÍH\`h ÝrÄ,¼Áô'sáçe?ÜÍðgÜ&ñÑCsB¯"4-#4A®ôäU¹ &a4`vé.Åf†@oö~( 0ø0ºed˜ðدa‰ g°ì!éðùð ÐÆþèxÐoZëì‚C«ÇäÓ“}P˜O4&P>N›Æ¢Â˘§³®Wøˆuš®àíÔ¼ ¹SPs›#±§ï &ÛMšshE´:§U± EÊÝØøâ³?=ć7þþÍŸr ywm€ÄÞï™å¦ÿxþV··CÃ…¼‘ãåW ¢^ÅHÿüwQßÎü>dž>­®Ã§÷Èø§©l Õ¨hÛ6áõ*˜x•j<óÞ 3·%*ÙôÜ)ɽ¢Ä^0¾õïÿB6g§pÉûW†ça†Ù¿~ÿÊ8' ÉçyË*aŽß,1&ˆ‘1|“!Ù-¡6†¶Uqê÷¡û ©=§º:¾Æá>h¶ÈªrÝàÁSÇÄbòÉ“‹_¯1ŸªLU?G4‡Üœë/†^þœÎ¥ßñ¶ô”9}$Ÿ)–%­ÿ‡|>~MÓÜ—÷Ë:ž“6Ã=i¹C(a^ÍuÙ.„RvJ,LTƒÂÔ?G¯FÉÓ]NU¹Ù8\ÆSõx;:ßî“è8™¿çÍ())ÓÇ/F!J0ýø½è±[éÓ épOŽŠÀVw)­ƒ>—¦n™ŽhB~"ŒÍÎÑÌwœ×á·çR#YJ]ÈÎ&w”PKÅcç¯ß¸€žŒyZþUM⬠ɸáÖ,Ø3qvïæ)v¯Þž÷B{7;§ÕÂ2÷¢>»ëÜSÅw£îá›0éÐ ZÉlç,t7%âÁí†ô¾ý/-äjmendstream endobj 3024 0 obj << /Type /Page /Contents 3025 0 R /Resources 3023 0 R /MediaBox [0 0 612 792] /Parent 2990 0 R /Annots [ 3027 0 R 3028 0 R ] >> endobj 3027 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [289.9003 335.2098 317.353 347.1649] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.13) >> >> endobj 3028 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [346.7281 335.2098 358.6833 347.1649] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.13) >> >> endobj 3026 0 obj << /D [3024 0 R /XYZ 64.9134 727.2935 null] >> endobj 730 0 obj << /D [3024 0 R /XYZ 64.9134 570.7985 null] >> endobj 734 0 obj << /D [3024 0 R /XYZ 64.9134 538.074 null] >> endobj 3023 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3031 0 obj << /Length 3169 /Filter /FlateDecode >> stream xÚÕ[Ks㸾ûW(7ºfã â’T6ûH¶¶&I­sÚÝ-qlÖÊ¢—’×3ÿ>Ýx QöŠS•ÔT) ht7úk| €_Ý^Ý|[.,±šëÅíÇ…–Ä2!FPR–”-n×?†°òzÉ(¥Åí}³z½B+ø®h·×Üû®Ýø/«íÚ?ÔŸV56xºfžf¬Ø]/y)eY0&®¹ýþê›Û+¶ ð sM¤Õj±z¼úíê§_èb}Eß_Qb¬Y¼À3%–jñx%• J ¿Ù\ýxõï^à2J\¦"¿Bƒ9ËX¬-'’KÑ[LP{ŽzBžô ‹PFÁ¦ívUß°Ð,,%­ÞgäB)S¡ÁÏTÑŸAwðÀòòá”…æKpr)‹m»ÇQ´Qc}`üå®m7uµsp˜ï¿(Éb¾ö¹âëz·ê Ñ7.ã;yœéébÉÐ7*F9þ»¶Ú £¥ôVIRâÂë—ÉÝóÊqØÚÕu`¨ý˜£}%‘ ¥ªsc±©±X$SrZü½½æeñ‚ÿ¹ßwO]F ˜ Ó•!ŸåˆkdZ5Î,êÙ">tõÒéò©v:=#EwQå~W»¿wÕ Õøuß…‡Iü½wÑÎ}ð&ydq£0 …Èò…ÁbûTûÆ›·ÃdÑæœm,P†h%úøØFXæ¹äq.«®NªgÉȆh-eâ¾3“¨ˆFÆ28U®ÃÀ ¥Á.7c¾ ò?ïáÇ63¸¶D1ÃODP€ËŸŽ•ÐÖŽ^éœY8,1àŽ x±yBR¥¥°“xö$€¼ Y¹oÿ±jÄñ†ÅŸËâ#FHiÑ•u÷Ò8´Ô¦‹Û‡fP ¶tQÝ`øJ%Ñ5+zKšU`Œ~˜û!QÆ66½¯\ªqî°Åç‘Z8í]í›™Žò²Œ³ GÎùÛ¦Ý=wu˜ç¿v÷,Y¦àㇼçÆ I©=(-)/¼oðÙ¡b.Nñ8ê€tSû†¼ù×ßþ¼_çH¶%²êB-3,ª· BÜã4=¯öa¦  í=Í+¤ûO¸sPÔ[7“Ûû,8T¥ä1ýx‚–ñò±žÀÍ€u›¤nar´0C*}#.3Z0 ïsþ‡Œ„²1GRÊ#!¡ £n–| ];ûÃnJkwÿü˜ä £ö­ÿyÿP§í¶èÚØMlcm D§£eó2”qD”}. !I,šèa±Ì§,¨™Åà,‡ä†„,¼¸¤*}9·‰—©ÄcjSZ¢)pö¾ÕIR ±Á¤ÕóiØK<£"²E^šr¬cäÅß>oWû¶û#ÂCŽSŽÐ&<Ü·.üàéå¡Ý…/?bzt#úÏM®:G¾/‡¬Tå¶g8n^ÙDö‡s„çžLCì5yhŽ4ÄFy(¿ê)A ¥å€ 5´µLÌäDâc«¤¤Â¥+ âëË–fÛìöÍê4x…[5ŘyÆ„['CßW¬Ä†*͹±"}RÀ ›Ÿ)“‘Ñä0hîÃÅò`dvfuäà³~uŒéï0$P@õûßwÏõ¹@Ϻ ž†è)þÛ°1œöTÝ×^ F=‡Hó¸þš¬üÕéÚî:pî¨H@Â.µÒ¯É"ÉYQ&Ð!jOÊòý(È ±Ç©c'!B6̦$ÃpKA¥nˆ´æÕuîÁÌú´k*¬‚Ž·…¸e@ÓU¹H•¹Ì¾^ä¹50;ÌŽ,l¶»}µÝ7UÜÐÇh5ÅÐãâã˜(p™HÌœÆ@]®9g#Më®ó¬$ÕPÁúAŒ7Ÿ;10™„\¼ }ÿGƒ™3¢”6g‚™+0Fˆ7Gs_û,[‡LSù_Ccíãw©|žO…tœƒC#_UbÏÇÓÐHL› “î ‘úkÿùé¿‚Á²ÁhÒòbLD‰ËTdÀX•´l¬£Cæÿ¸ý~Ø]Š&˜ÙœüE#aB8}‹v±Ç)Àp# †2Ñ_™Ã ã°öÙpÂùÖK¿Z¯›•Û­ÂoÛu7\«¾`: ýPÀ±õ/qÙ”bœ‰7l¾®[Ç›ßì LÌ•fxv®°‡.m×Õ; ëX—¿9ÂÃÎ…D¢n’ 3 {ϽƒZÇKV=«yÆ÷ ¬&l‘¡t\†½ÛçºßìèwK2Ä­e‘á=oݶ/ÛìnªBôþGlÚûÈš˜ªÂs¶0ÖPY(Iy¿þŒ‡€bKƒ‡Úã“à<% #+;fdBäÐÚç¯4x/ÃÃq"%¦p3_oWÇy¨ŸÂ®}ó‹ób”¸LEfò¢,}±;V4æÅ§®]Õëa—A8™çsõdlF&Á!Î-’²I&Á¡½2TMï÷©qªÐ\ëÿ´‘}°¬|7î»ÌGŽS‘ìx¤ì4=žÏ¥ÿ'ô˜CVЂò3A­8á,ìѾ1¨/bÈaAÀ[§a˜0 &Ý2À õË$ î[ÎGƒS‘4x¤cŸî“{'a>§“ýl>þ"¸ˆ0¯×.ö8‰ à‰÷˧q!_jÁ^µɈ`jVt„ ZAðˆ%Þyfꨦ»Är>‰¥—9/Ϥ÷ø¤î›†Ol9#|‘SðIuìánMm¿çq4›³¿Ž„Û—| ¥‹=Nሕh¹‘“Õ$g@aU¸^û1_"*(dJ™¿>:z@eû‹!q·Áj6]{‰gt•\maYéêânr9™/æ_NÒ5À­Òûѹט˜6¸-áw ð• ¶ÛWw{_’³`Åç©‹´rúZ©"Fs–ÜÉÈÜt D Ʀ^kš‰§”RÒâ?šÿéŸÇû¡¬Øå.XXŠÇÏöüÊöŠw›$ãbêÝ&pÅ»ŒRšr†Í§(q™ŠÌÑ) E°¨¾ÙÉw›ÀLç×ùtŒÏéÔÁR`Z#^n-š6Üçƒjêí&é.Ÿ«ùìí%ž±W‚_¤2²7y»ií”(ÁÊÃhÿ"üàbÁR6^õ6“ŸÃq@½K¯¤²1°,7Š_kg_k„õ¨®ö74wb[Îú‚–07ÜAó©÷0$þ ê‰7Éendstream endobj 3030 0 obj << /Type /Page /Contents 3031 0 R /Resources 3029 0 R /MediaBox [0 0 612 792] /Parent 3039 0 R /Annots [ 3033 0 R 3034 0 R 3035 0 R 3036 0 R 3037 0 R 3038 0 R ] >> endobj 3033 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [249.4992 379.6389 281.9332 391.5941] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3034 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [309.2752 379.6389 326.2117 391.5941] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3035 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 272.3413 134.8845 285.3924] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3036 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 272.3413 179.163 285.3924] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3037 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 187.0611 134.8845 200.1122] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3038 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 187.0611 179.163 200.1122] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3032 0 obj << /D [3030 0 R /XYZ 64.9134 727.2935 null] >> endobj 738 0 obj << /D [3030 0 R /XYZ 64.9134 702.3869 null] >> endobj 742 0 obj << /D [3030 0 R /XYZ 64.9134 116.0455 null] >> endobj 3029 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F14 2010 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3042 0 obj << /Length 2371 /Filter /FlateDecode >> stream xÚÕZ[sÛ6~÷¯Ð#5 ÜûÒIÚ´“N&É&ÎSÛZ¢eîJ¤CQõæßï¹eÑr2Öv¶“‰ ¾sŒãW—/~v3Ÿy«ììòzfMæ¥6³B‹Ì9!g—Ëß)Í®˜Cì_ 8Ú FyÕí*Ð<)ùxhî_£•\ÒÞ²á´Ï“EÙ #´A‚Ì$ƒTŸ»½g‡v$ü6dK*²éËá!{”ªÄâq°B3Žxè¼®Ëò\¸éóz!3å|>Ó9ÒX˜Ó^a㵎¦¬·ìCM : ßT§¾rìaÝåÕ:lM…~Ö|:$˜O=¦Zy a»Ùx5O#h€|„!å!QYÈõ_o«ûJjé!ÅHò%¸o8]œÌ‡`2øù^Œ”ìæ! p®vó‘:gsó“KÜ»ùx¼Kõu÷ä· õhÈ“ý="¦cÈ ·>³ ò÷²äï»ôÙ(ýº´<§KÃ>æŒÎqiUdF‡K©ïré¿4íÖr¶x8ÉÏ>ÆNûQòŒiy*íu| í“mO'ý³‘üwIú}Á?v4’y& kNž/Ï’ôGêœÍÉO.qïäã5~cÒCΘôG§’þXÙG’þÙ(ý›¸´ò¸¶c„Ê ¥Šïwé¿2é×r®x8ÍÏ>ÆNúQòŒIy*éu| éÜLFÈùH>„ŒÝÚe….ìž9QtR…óÅ“®î~y÷9Ú¨¢Áw²x“×ñýë"\›…Ké>ÂUžÏ´óE¸ÊCaéá§T6y‰*õ\’!•°žPäü C)TSr˜Œ¤à& ·øðŸîÇâ=ѽ5ðMŸå›¾®©PæTÛÑmyŸÖ ‡êípq¼äêQ¼ ¤U7+z-ûvCÊB~uÜ)ª‘Ö•Z‚,ÝxrñeÁZlÃ4¼'†±!cœ¼c1ºc£f¼F+CQkU‘pL@nÛÊ.ˆEànª¨²`=—¬'‹äg¬¹–‹z]ÓÍ\¬¡(g¸ýŸ:Þ÷ü• ‚ðÜÞâe¾–Í:ùW‹œc i$4ˆNå÷í¾xSuq|­›šäÆ«ëò9"…I Õ9:œ¼ЫèJ‹—ªœÍ’ËOSƒéIÉ&½HÒó˜æÉjp£åv Ú vT µ¾n("°¿ Ö×÷‡«u½ ˆºÊ šþŽEm¿íÆÞs¤?zcO.p/K…NCóPnŸ¼— ˆéòx/‘˜4´Í÷3£ŽëªYõ7/ÔÔ-©Í3£´Ë½vO/tL±ãàÈl•™i“ U<ý7Έ—ŽÙqp³’órÏÍÛøqªö"ÉeˆínÁù~Ø‹¨Z/°à}LM.2~k 4ÍÄ5už)kb)aGµuü ’Q6Çîêÿ^ÂùXäÇ"3Ä>—<3ôq¹ÇOçŽ*©¡È‚¨å¦0Ž•*<úÁ¹î0ñ¾ v¿w,”4ãJ:ÆM«eÜendstream endobj 3041 0 obj << /Type /Page /Contents 3042 0 R /Resources 3040 0 R /MediaBox [0 0 612 792] /Parent 3039 0 R >> endobj 3043 0 obj << /D [3041 0 R /XYZ 64.9134 727.2935 null] >> endobj 746 0 obj << /D [3041 0 R /XYZ 64.9134 521.5831 null] >> endobj 750 0 obj << /D [3041 0 R /XYZ 64.9134 239.5333 null] >> endobj 754 0 obj << /D [3041 0 R /XYZ 64.9134 145.8888 null] >> endobj 3040 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3046 0 obj << /Length 2249 /Filter /FlateDecode >> stream xÚÕZmÛ6þî_á6Z1|\hQà^²ßzý õjw…fíTÖ^Ûûõ7CŠeÓÒVr]ˆ¹5œyfr8ã÷7«7³kGœæz}s¿Ö’8&äÚJ¬¥l}s÷ÓÆæ¶£”nÞm¹Ý´‡§z·-„›¶jžp$6ŸšÃ¶àfئ:âÿÇzÿ©ÕnØÚþ|óÃê»›[SøÇ†µ¸&ÒiµÞ=­~]ýô3]ß­èú‡%Æ™õo0¦D8«ÖO+©QRˆøÍÇÕ‡Õ?{E”X¤"ߣœeŒÔŽÉ¥ðF~×lÙ¦9àÿÇKšjã5ð™¦^› *sŽUõߌU¥ë‚1â”b—e…÷(Èê†á ~Ñj­ÁS &öVóÄj÷N,UÖ[ý|‰ÖŽ£€KÂ%ǵqN} ¾.ƒ£ÿ³UzS6uy P}¬N±âŽiA|ªÍuö"g,äΫ™›Xïm¹oë²­ûSm…†@±"y宄 ËóŽ-z‰E*ò\Y¡Ñâr¤lÕ`ž(©˜%0/)F'“ íÞ].¢ù’­$1Z©™ˆV–ÅÙgGô"¸Âª†AûX5!ÂËð´ tx±îŸíqÒ¾ûìÖËs Ñ1Lb2p ¥ýãÓQsD2šÌ¼:ô£Ä"™ }Î!ëèCÿßTQDôÛm¡¸ò΄¯ØeF,ðka„„3‹1;éˆsVz`¬öíã9'@G¹ûœ¨÷[î 7@1Us™‰1‹Ñc )BÓôˆ3¤G"rŠ©Ž==ê}[¨C‚s§9²Ê_#‹æA¼z˧9"ÑhÌçs$Ä9÷qé0¸#½ ¯³4ÕTšXk„÷ÿr¾ØBµÓÝz™*‰M‹Qe§*)Pw‡§²>O£¸#Ö°Ô«É%©È Yà)¥Î޵ìɲ?´gºZÈ·• ê%Îéj±Ò𱮫ãÙ…CRJ½œŽ½Ä%µD u‚gûXžù\bô€9 ê%ÎéO9cÿ[5‡ÏØ£Óò{b²‘ ´‚Kðô5–:b¬ 0üc ûÒ¡iËÛú£?ÅÛ­`›?Î7Øy¹4/ßø{wÇkpuWïÊp~“ðêhexWÀæ ØP 8—wsÇEŒPqÍeËŒ£+ÖJ‚w¸WR/±HEžƒ(B«aeÔqw؃ñoDÆpHl‰ä9oJ©ü 7[§7Õ"€èyܽc ¸‡8ª…€˜ãJ\ ®ˆk »°Q/ «iL:E*1 “DQÇ…HpCý&ÉÎÓñÛ2IÕ!´$Ѥôð¬VK…\ÐÎDâ”qÚØÎ·§¶¥6G;O£C:¢œ°cïþµ:î|Âìã#!NÔéÙx9"¬&Rs¹– ÕÆ\TX¤Ï‘²°Qª‡uÇ@á%×5žŒ%=u¢ÛŽÏ»P5ôίÀaÙpSßã§ÆkÌf_>UáÑá>ƒ"ÀG´¬“TÈ&u`ŒM“:Ý/âu9à=h×1y_¶x:ìÄÃ}|#Ü•Pœ^ú-  ŒnÞ˜àâbyµ9q’Ž´Î(M dnª›ô[ ‹’©^ Ét޲ëX†É¨œ^‡kÂ3Ý$ØÖµc››Ç:xeÂã!A'|›Lh¼‹êwÿ¹{n[ôªíƒâX>,w[n6¿´Í0®ɇ0ã«"¸BÎ,®!¾¹6s^WDñÔëÞMRB†4ïT^ _ÃnËp—­ÁлxËí·¾à}ˆ÷†‘R”Þ]—°† ¡á1ùG¹™àpDæAü’ ¸ZÙT}©V ·õx±?")sÇzÁŒ†ó6‘Ñfô’ʸOaҡмRvºÆ¾ ¯¤ (by)Cî¹{,5ÒÍoB&n$¦-FŽI¸v¤x½ñ•Ù‘ˆœbGªì ;ƒôµÐCJÀZêzH¸,qÆ_~t|µTjÀb$˜e AŠÊd½Ÿ¹\=9Qcéx©Å&kIË!üJêëB0b,›¡äÛBýòãëQbÐ1FLA2"Ådšqæ‚„HDN"Õñ!ø4!–Â÷µœˆ17s)Ü©(î32Ÿ¯ÇˆÄ‚Å(1‰ÊÀ‰–iNÄ™ r"9ʼnTÇ‹‡Ä )ƒøKvPKÊ­î8pçSÖý:ㆃ˜m8ŸoÏû ¾éÖD g¨­G‰E*2StæŠ0ªù°r,ö¾QÙn.Çmì6è+» ü""T£yfÍ,@˨-÷‹Tdê7Ú +GDN› oÇ¿{˜ùs²J/á€êú*}I ›½æJA¸»>íĉ¼Lì1 Rœ”"ønð}uhªQ‹4î^÷m܇çÛw#ìFùÇ_[õuÆlÝ^1ÞUjaˆ‘‰…s|þ”Ô8à´NªÙz4¥.wwxœ¡ÜP{­ÂÇž °ùÀ74þ2ãžûySÅʼÂ6³bãÊ<"æå|›ÑSpðœHýq®rž£!ÖMìztHŸË‘XÎæb®Ž¢4Më(ÿʦ×Z39x ì°é*¾A·<–mnÿ”D »!j²‰Šu£ßS*„Vaìð¼E¿Ãª»š°¸o Àg§DISúHjc¢ÓÇ3Cs]È·R ý`âZ?Á ‡ˆCdÔ˜ø‘*í'qgûÆ Ž³`„ß ÁóÐQÂÏ m7ÃÇ7J‰³<AìÐtŠ32˜Xˆ;&Õ\Ü ˆ)£Ù\ÜQ&ûV nÙ¸cLɯŠG`6µ„k­ÆnëB2å,<­i*vÅ0q¹y ºÈ´Äp¹®%†Ã¦*¼›~¯ü4½’õC—£ßbÌb?¬Ôû‡l£1+ç»4ÿØ‚endstream endobj 3045 0 obj << /Type /Page /Contents 3046 0 R /Resources 3044 0 R /MediaBox [0 0 612 792] /Parent 3039 0 R >> endobj 3047 0 obj << /D [3045 0 R /XYZ 64.9134 727.2935 null] >> endobj 758 0 obj << /D [3045 0 R /XYZ 64.9134 570.0015 null] >> endobj 762 0 obj << /D [3045 0 R /XYZ 64.9134 259.3706 null] >> endobj 3044 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3050 0 obj << /Length 2634 /Filter /FlateDecode >> stream xÚÕ\mÛ6þî_á6zbùþ(’4wH\rÍÞ§^?8^mc`×ÞÚÚ½_CI”FMy³ÌmŒ±"“£™gæGt^^;ÿ»;â4×ó«›¹–Ä1!çFPb-eó«ë_ŒéeÁµ¤za–£”.Þÿ²ävñîí», !Äâå¿ß¼]Z±¸*`ÀâÍ?›»ïy½d‹ŸÞ¼ò7_,­\\½þ°üíêçÙë«›SøÃúGrM¤Ój¾¾›ý1ûõ7:¿žÑùÏ3JŒ3óÏpM‰pVÍïfR ¢¤áÎíìÃì_@:/¸$ŠZ6Uod1çøPV}g$‹1â”â§e5ó(Èj/ÃŒ¡¨"ZhG ¢ùÒ{€sä÷N͵D3gk¼¨vw¸¡·ÀL.¹¶³9xÔåbÕ€ÿçRéÅj¿Y}ܖǰsLj´Êα6O3°9a!w†X0mhâf{¨VÛj³ª6»í±¶BCpX¦œáZA˜°<îØ¢“X`‘ce…vDsΆʖûýn¬¤b–POÌ©N&%@ÚÎÍÑ,gDC´qz"¢-\hÍÑ[ˆàÒç \TŸÊ}á«æÛ6Ðá+ˆuôú»í. Ú¶Ÿíóâ@úgã@“ž”ê¯ûQsD2ŠF>9ôƒÄ‹Œ„>çHŽ u¬Cÿ?TQèß–…âªv&Üb§‘ à¯Èˆ¬9^+"¸rŒÐÆsUûáácœ.…×þÿL dB6R$aéIqI“"ŒÌH $2E ¬cŒ­?ӼȆñ¥ðBqâ Ÿª}”&JÙf­}YÞìöe„’ÊÝW Åf»änQÕb~/÷§‚ŒÉÆ$@=C0Bi†„‘‚D¦‚uì²ÙV%€Ú’¤qnš#ÙP¾”jJR¨4íT5%¡V¢ªY”ß–Ûß«Oß$G1Ù8’¨çF(Í‘02#GÈG°Ž'8Ò87Í‘l(_Ê:Â-”¤rª¾ŒXÅš5úÅMÕÄéÑ–=E0@iŠ„‘)‚D¦(‚uç\ Uüo¹ß=¢²ÎF§K©¬)'b ¦rb›1'"‘©œˆµ%¦uìRâ@ÇdJ̧c—'tlSâ@E”§wÎùØ”?#â4F‰¥Jö(°È¹e(qB5(¼_BZÚí«ÕÇÍmÝê©–‚-þç¢D€ˆZ?ï͇wMƒç~ ‰¬¼Þ¬WM“‡4SO†¹ÂîTS Ãºäˆ+Û±Ãx"F¨PS®?­F=#ƽ îē㨓X`‘ã8boBhÕ?¹Öqw]~Ï#fZÉ…'<Ì“²Aüjéô¢¼óö{ìjÔ»C £(È Ìoß=G!`ÚÍa ¡"Õ=‘V`%Faþ‘áýƒ >—~çU]­«®Cõcwc´lÁº' p³NÀ•ß8BjˆP§ÀŸ~10¦+<&Ý |^2£Ä”Â0ì†âØ ßM»!—½’ônˆÀbÔbÊ•±nÈŸÊúîH×ì ‡¨ŽÖe2qÒ‘V)ëÅÍr힌CX`‰c,D¥º.öã+P´õà«28M[Õç$뵇¢¬Só5 Ó¤››&{î¾îñû{ë%7 ÿï&8š µµÞ- ¨[¯û±7¡Ïì¶eÑYí‡g+ŽÝ ùÐHÍZ-_µˆƒB'>Ær µ²Ç$"Ö:΂”ØâT@•C4g|¯}ùn³Ç5ì ”ÖúíôÀ2J4;õn!ìj„~ñc“®'ÒVÛë˜/8\ÚC9û²;¥©ú7Iá¥ÓáäÖÛ•kk“ƪÛÚ À:ï´f7%ßiM,2qZs lú´f>H/dÇ/$¤êT_¹ã,GVJy67²¼:m>|6õÖ¾e0ʨqb £²# TO ŒTò%j72ßKT,2ñu c·ã?®Ž¼›“{Á|(_ W„߇H6Áa¡†£æìüÿÇ °)Ù’„§gÆ'Í02#CÈC°Ž'ŽàÚ3Îl_ȵ>E§ê,®ÁW†=š§šÇuàû¶ÏÜ×ÅN-¾ˈ¥îˆrë]]dýéÿ*CÕt¨†/ØÓSC:¤| wXp3]/²P`ö›¨Ù–@–µ“nÔJ‡A> Dº'±,ê·ÚN€8ЮŽM°—7xÂçªù툦¬©oÕH¯ªáð¦U,Ì»Ýù‰Ÿ}@„y^åzõ¬#4/¤sC_õjt}Áª}n½WŒeH×à éx_ë§c'r`£üãÁÛtÛ6¹w1ªÁVÉJ÷8—ÇÞdPI`ƇõÅ9ígã|йoõì5Ô™Ò˜ô¦È×¢]ON‡9rPªùl'³ô¥ÝgdW¾ŸI' ê6D«óZÏaF¾Î3’˜h> endobj 3051 0 obj << /D [3049 0 R /XYZ 64.9134 727.2935 null] >> endobj 766 0 obj << /D [3049 0 R /XYZ 64.9134 531.7024 null] >> endobj 770 0 obj << /D [3049 0 R /XYZ 64.9134 263.049 null] >> endobj 3048 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F11 2356 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3054 0 obj << /Length 3113 /Filter /FlateDecode >> stream xÚå[K“㶾ϯÐQ*›0ÞN);Y§âƒ½©œ¸Î+3ÒDÒz³ÿÞÝ‚Dj<ت¸\[5K‘`óëÆ×n<¾»½ùæ{³²Äj®W·÷+-‰eB®jA‰1”­nï~^ׄÙMÅ(¥ëo7ܬOû§n»©„ëS{xÂ+±~>ì7¯×ð€­Û#þ=v»ðm׌՛_n¸ys{ÃVþ±á[\iµZmŸnþ{óó/tuwCW?ÜPRÛzõ ®)Ö¨ÕÓT‚()D¸óxóîæŸQ`$V©Èï.é¨-'’Kátüûÿòz¼=lØzÿ¸ÿÔjï:¸ãÔjN-A-¾ùž³D ]U¢&\3ÍE°¹îÛò¤­­„²ð6mÀ”S³0ŽŒXi¥ÓÜœÛÅéî ìå`A˜0<üž˜%J¬R‘Î.#l :]°Zl†·Íáø Ïè-4ÑŒË^—¯3ÚÖ„R°ÊŒ²VAGْʉKÊZC´¨õDÙý]›W¶bBšK  ¤ô}»±zÝ>aw?M{š3ÆàÀ;ª5H‚î0š_6 cDh»Ò´ˆ€âÕ6éV©ÄŒI˜$ŠÖ|øpìÿSE¿B¬_o*ÅÕú/x·Ù‚ûOÁsö¼.‡>J\€Ï…!ª¦v ÿ±;ž=Cœ` iH­  Ø„X¥–;AŸt Å:!•8Ó ±Ù¨ª¤¾Zî„bè‡N˜‡;aÿÕ`Ð÷X]°‰sšÅàð;<¡ú¤fá0…†Q×àS1‰Kµ \6Æ8!J-@_ÃQØ2QjFj A¶Q‰sD ÍFDy©·–BŸeþ@”)üËD)†q Ê<ÆH”cJ”³‘†v ë0Òú ïoíq‹¹]çÆêS·ßeÆhжƒôŠ‹T3ZjÈz¤úõþÄUƒ¼sK4¥:|s4"|;Pì¯ý½Þ*iÒk51 ’ŸŠ?n}žÞâß;° $ìÒtLuïsi+ðDó¶ºïœƒø†5}£Î‰„jád¶^ücç?ÅÖ'¼Q¯÷÷¾t†kÄÖÕvU¾Óü3ì„^Ö'lÏöNHëïâ»ÍS¨;Ü+‡6|¼¿ˆ÷•ɯXÈ´}˜¾#Ùx=·!Æ ÍcîÿmÏ­‰ )±œ…œšdÄ@"ª ªÅõT•VC¥*GÖTâeºÆV£ ˜¶¿—#l Ÿª.¡]ÝS÷ˆ¼p¦ßg¬£ ÉÆúð¢M0œ(iU9£D‰ Váê%S›‰YÒò*5€°¨IðØ÷7ÎiPñ»¶yì ò©º›ÿ㢿 ñØ»^ïj½·X¸ê\#WàV\Bè¥P,õ”“Óô‡ÃÞ{Å…â^ªŒç +'Õ}ÆÎXe+b \»,Ë¿GAVÞ¸4Q 9ƒ€j.„]p¸AªHKX­ôœßJµ!Ÿðµï”_7Jƒù»æ=–ˆ}Œh0lÝåŠfE(Î|ÌÇZKd —¾ºÕþ‹9d™Ð̹[F–&L±zÅ<ìA‹>c„riÆaò¹Áþ?uÍã 3%”ÆÌIŒ4N¸»óÿ·¾’nwnš©oöÐmñçC§†SCO}ß2"LºýuLŠ"¨Ä!žÍì˜KÝîxjv`¼Ž¤hÄ iDòÊk#U”X¥"ÏÁBâ #„€Øöp؟宊B|±œI1 0‰<ëß-:e¯GÞ¸:¨%‚«…ÈÁ84g/1ÂŒ ²˜±/õ÷è½;_Ñú>k“ë½kÙ˜¾¸æ]ÿÿ>j#àú'ÿà Ü›@ú‹]8åÐúvèôîé¡ëaÅ·¾Tëðä®õêö»¦î<ÒûÐì©q6þìíO”Ì’¾ÛøÒ=žª®Ï¹qŽelÝ6{ŸÂ:„Ûöùäð~%óÙ}\£4uH³ÑZ¿ Äì ‰‰ ÄÄD켨„q”A:¥ ¤6%jJ/°J%æ†HI¤‚[±YÈÀ²Û‹@¦á3g74¡Æ„Øûüñt¾=Á€ 3^PÏ qIQH¢a䔿CQ lÙNB@‚Écö$O½x’g÷ñéýy:Î@š†6Ìp"½X¥sÑÞžâÇÃv¸üAž%.ŒÎñäUå@Rf!ÀÓ5J\P–ïÄⱲŎ-]P×@srË©$.© ©µðt¬îåƒKP‘†'1 \s„‡Â@© ̇8imøAb•ŠÌPQêÚ_”w'6<Üpf£I¶o¸m…LÖ“ã(Kúqõˆ”%õKDÎ隥úU#ý¾* Ö[Æò’ú%"çô ÍÆ‡ÏÆxù,…Ò²ürøƒÀø\Y¨U¸ßgÁmu5´yIGXÈ[EIš g:¡o4>z6æØbB;`x4|ÞøìãœÓ2¶ õ‰3æ­Æ§Î^è¥ÀǘÅ{`Šý|ädP&C–W _¸ÐH­œpÄB&¡¬|‘ƒB%˸¨ r$‘8ÑÐj|àì…>Z |äÈ,öÈ‘)ö‹)†/rd`àH pî¨V |šýž“fy’á9. Ö’„òúõ³EA^•ÌPŒRB5ñ³i¦ñcJ°tìÙñ¸bsçÍ„¢ùÉAEÑ–fiVR–N ¢87+"ý‘1çÓÃ'¾ñ29&æol÷‡8ûq|vsîÚJ“ÖO¼@»8“‚ï\>O³ç¾*Nk"4Ÿœ/û1öøL½J#~cÀàendstream endobj 3053 0 obj << /Type /Page /Contents 3054 0 R /Resources 3052 0 R /MediaBox [0 0 612 792] /Parent 3039 0 R >> endobj 3055 0 obj << /D [3053 0 R /XYZ 64.9134 727.2935 null] >> endobj 774 0 obj << /D [3053 0 R /XYZ 64.9134 677.136 null] >> endobj 778 0 obj << /D [3053 0 R /XYZ 64.9134 203.85 null] >> endobj 3052 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3058 0 obj << /Length 3591 /Filter /FlateDecode >> stream xÚå\YsÛF~ׯà[¨J8™ûxÚŠ'ëTÊöÆÊS’˜‚$ÔR¤–„âøß§{`@A*‚+›J¹ÊÄ1hôt÷×× ôâêâËoí̧¹ž]ÝÌ´$Ž 93‚k)›]]ÿ·BCdµ"{ä¹Àë(.r’‡Ì íŒ`Cfë-šó“ŠF¼q:‘¢¥3)A¤ñÙ)Ð!ˆ_=…»ôÄ1t(+ò:%J0ùt$÷]u¶­Á¶Á°Á®Wu¼·†“ˆŒ"s¹@Êç+9"!o‹ƒ0Òl¶%@j eÓ0 ´4aŠ™ž l÷³€GÀ;YÕû)þà1 ö¿:ðÆÛÌMË9bºÙoì¯gŽ|~ëU}ê5¦ÍiØ]³ÄÓ»SÓ ö½/ècÎ#Wüól©wãÆÔ;ÜšÎté‘ GFrÌyäÌŽ;éDúIœÇô¡UJ´¥vÜy(áN›?ã<Ö)6°»z§hê1^Æ ºî0å„yÔ=¦Dï!ã6) ?Šl^SÖqYuØ«ýøp`J2š|6$ÅEN² £J:6äÑCï:OóƒšSž_FËdBþ» EY"¸a'ТŽ7g§Sb¥Šï+£"ðÏ'EEFs ¹PÆQ‘FNˆŠŒä*r;T D#&P™ãˆ˜LÀŸ©q>w©’<Šðú”YqÒ¥)û?N>ÏÃ`žþ…tR@µê¤“ëAÖ(澊ÏÓK_'2e¬f’}ž²2¬Žj«Çj®®q¬¦‘b5#9†ÕœÇ«˜·—Z¤e°N&áOV1%X©ˆ¹•"Lšñ¿¬Gª»OV6X3ÉNÖQmõ`ÍÕ5Ö4rB°f$ÇÀšóXkÞS.ƒu2 ÿMÀ F@$¥æX)%NòOÔÖÙïk îýÿP’¹€‡ý^ ¨Úp‘RÛ—‡ÜX¢ÐÂýÔìnï”=n±ùRXHaÚgŒÆÚ £û‰ ;6„Öµ_÷ 휴ª1šv窜Ê;Œ›Gïrû÷iä„Þ!#9ær;ï€ ŸÕ²íêÑ—£î!ŠCÿsÜÔ*Ô±i4ÑBè°{˜.Ÿ8¯oÂÜ=™Ûúx‡*WàdNaÔ(:§0°ŠQ§ÐœÎ)ä$GœÂ€ÇÎ)4ë¶¾=×%L&à¿‹Kš˜S¥¸Tœ.Í?Ñ#°§{„0îQmçh|ÙæÀc›ü@;HWïëý-#Ç]C¯ÈÉ<ØmôŽ!7Žmý°­wõº-¯ë€A&Eÿ̳]D¢¸ÈI\„‘Äü‡Üæ û#"€°0ÇÅKe Äˆ8ÆÝ5ãl*3ø$þK‚Íð'å´é‰cþKX@º§RâaÊMæÀ¾(íG²à ”xÂs¯Ï©VÊt8áTò'/‚ûΧ ûÒ{«ÞËjݹ­nU Z ¾çQ'§>”áÈ’\Š]<€D*߃m™Çø"ðæ…ðèÛ 200=“Ôºû¾é÷}ø0N n&©$Œªç§.‰à"§XØBàSl¦6Xn.é[ʼn¼Åœr³ÚÜ1ýæ]ÝvÅ )DDšÄpä &ÑÙ¸½Ö4ÚéÎkjéݺ‹!vì‹Ø«n£‚˜%Õ–³Ïs}¬÷}°ÊAÙ`úÄ–9g©Dq‘“,)!¥Î¹ì‚TPx×ì @¨í6”¡Çñ9nýûêjÖÍú6œ{0ù½Ú‡v(8ÈѲ=PŒ0Óioú3Œ L«,ya…Ý’=îTè"¼½„œm³m«÷ÍÊ×sí¥`óqѧlËR‚’Ôt»r3‚#›rÓ¨ówîE¼ï^ÿ7é= $x×XêúµjkRŒ;0ÇÆ·æZÚŸJ@Áq qTh¦˜nÇ|QDp(ºB㜽ŸåÙ +¡–5ÓͶ#8>[a ø}=œ,æÇ'+ö7¨¾BM¿•¿IZר×H†6ã^+(Ç x¯Á–boNRÌIJˆæôWà ުÂò nŽÇKXLác1QÛ’ý•꽯‰6q³ô`pª"ãvºCq°}ŽÉÍÑ Ò°%—UH=é!1AGÌŽ§k0H&N¦~®#Ÿ¾oç?Øiˆü~¸«×¥TLKË4¹£ ±"–²|c¾—qв†H¹¿ˆ}PçskqcÜÖ õ;ÒïâWïÞàºñ¦ÞÖëe¼^­>`ŠX¡ö>îµÐ;¯}üßðT{×€ÑATuó«»&Ž ‰J}OÑ$ðBÚÝ6jºw¥¦ò6¾¡i9¼qÆÇ•=<ܬÑpq\W¹×±Í<¿õu)Wmn :#¨÷N©ä 5J„#_3ʇ!ëªhÇÐQË’Û.5ùµ~ÕŒN´z~ã¿#¸È(ˆO[°Å4êœßž±¢–ÆBºè3àw î¡xp°–ì¸Ë`0G•7îÑÂ’7Ó%äG€c¨‘¹¾‘¤/ÀrÞ÷ûÇáb]ášlx —z*=§ ñÄr%·Òú÷6váâR6Zþf€S® ¡Ãí:ÈÏ_RøÉŽ¿•Õˆ:vÆÀéû‘Ín« …3u-: Þ!Å5ßzVnú/©âÁ:e"uÝ¿ÚÞ5‘­añoŽw®ë6–81´yNoÒ°ûÊÛÅÇp¶iïzVçý<ͪ]4ë~ƒ&NK ”µžÃeýÐz~oX´ÛÒ×c}+!P‡OÉ€ )Û_,õ 0Û9lßC-ÁäŒKKŒœd'] ¸È)yŒ‚Kݰ”¢3”¼à)5a4x0›¼èÃc{¸µ2~Éø„óLOMÔïÆÉ?1Qthů·aë3^CŒf·@8‚æ` ò‘ªÕåªÕ}÷ö!å4ni äŽ!q¼ºtzPŽö¼J‰_Éâ Â¢Z*QÔðîuh¬ŸcAÒ,£¿þ×Ñî+gŠ8å=Ó T@'øz/Q\ä$ E°ÍÀx»QIW,‚ ´r žbP LÎøC\Ôèx [Í–íï3ŒJX ”ðùJ £Ì”JÈHŽ(!:©„É8ì”0Î`§„œÃ\ û°‚‚X‹U[Ž‹oêÝÒ/{d¥•“M‡¨Æ¯7áKš3>´eò—¾ú¸ !²«ä0«Õªœ‚Ï’Öž*KÀ±Y.³l…kÑð'|…Gð…Û6»£ñj—g,F¾ªôñ¸KÚá8mªÉâ$×"ÄÿÏ>ü—Ö~èf» _]?ø›µ¯`CøŸz9p|v/òÉŒËáØ“yL‰Æ2|´ÙåI¿ùìGÊƒØ ǧ77Å6œwꮌª=´TÄ(µëhÈz=æýõm|Ÿÿå!saïQ+ ÍÅüßäñCd:±µ¤Æïj¨ûçvaZIx9¤I ÎÐðÙKiyÕ bT0EŸôc:JÙ¼ÂdÓ¬ÇÚómûï¨á΀±Àj³Z%©¥´á84’æŸm§ä¶ï{ø±E¤€?”rQ±{ŵ tŸÿeµZÕ׉¿¶$BÍÁ@™9i# ɰÀ z(êÇu²øPçV±ÜÁ *mç P€–Îkéä¸pR±nßÚõB"$ºU«Ï è”ŸÈl"õoñOƒø¾TþU¾xQY¢_í°T÷ëp𸋠ÇÍÞê´¬¶*¯°Tllí‚ Aõo«[T ¾{€þ`wço­®cÛ ¦O¥ÓCÏÑ—?Ú‚ ¼oZ¯^8ñ>E›è§î*¯ƒ÷¾UÒ´©Ö€˜j=¢B¿+t$°ñ¡¤™¿jÃ(oAqt¡XŠ›²÷zéá…Ò6D©ƒU?7#N˜³Ú•’ keɉà"£øbÿ¯Ë¥!Ÿ…Ô8 ?ÿs CϾ_“òᣃf(&ážÏ€5®KÖ¥`¢Œ™ø‰/Œ Í·°„äÝÛvþ׃W}q×ä4–‹g *Ñ[däÄ(ƒ¢ WŠâ /§¾dÜy)ÅÒp%kmÄc—í¢xú?I2¬54QRËÓ(âW=÷endstream endobj 3057 0 obj << /Type /Page /Contents 3058 0 R /Resources 3056 0 R /MediaBox [0 0 612 792] /Parent 3039 0 R /Annots [ 3060 0 R 3061 0 R 3062 0 R 3063 0 R 3064 0 R 3065 0 R ] >> endobj 3060 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 387.5675 134.8845 400.6186] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3061 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 387.5675 179.163 400.6186] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3062 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [430.5318 54.4505 457.9845 66.4057] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.6) >> >> endobj 3063 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [486.0958 54.4505 503.0324 66.4057] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.6) >> >> endobj 3064 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [173.3846 42.4954 200.8373 54.4505] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.7) >> >> endobj 3065 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [228.1792 42.4954 245.1158 54.4505] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.7) >> >> endobj 3059 0 obj << /D [3057 0 R /XYZ 64.9134 727.2935 null] >> endobj 782 0 obj << /D [3057 0 R /XYZ 64.9134 232.4023 null] >> endobj 3056 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3068 0 obj << /Length 3069 /Filter /FlateDecode >> stream xÚí[ëoÜÆÿ®¿â€Åb®÷ý( ¤vë´Í‡ÂEÕ/ó–(‰¨îN¹££8}göÁ[Þ-yŠE£1P(r9;3;¿Ùy,__^¼üÆ.qšëÅåÍBK☠#(±–²ÅåõwKC˜[UŒRº|µâvÙm×íÕªB.»f·Æ+±|ØmW7KxÀ–ÍïÛÍ-<¤V»%ß_~{ñæò‚-(ü°Ã\\é´Z\­/~¸øî{º¸¾ ‹o/(1Î,ášá¬Z¬/¤DI!Òû‹^ü£'H—DQËNIùásŽiù;§´ðGÅ8­ðZñ2½1$U%A+m,¡&°÷UÏy¦{÷N-´D3g½îÿ´Ýì»zÓ¡ò†K%aZh˜ǵû° uXWJ/ë][¿_±å}ŸmàŸë@i8³¶@×4Ny ëw2wDÂR•ç{Êõ®këûðÿ} 7¼xÎ“Ž¦\1â”âžÊv†×é­}È>¶¸‹O7áoƒôî᾿Xûß›wËôÒ<Ë+Œo.#}Ùk™}Z92Hî‘VÙE¾NÏ[úžä™µçÎ ‹>\ü6¬}[wívsÌ­Ð+²Wž`ô‚0ayÙ䫞b•“TN ¸/ñ¹‚Ùa€x#ÃOS @f\ý9åÄ¥Xz¾½ „#‚H ,´°CŒúȵ0F¿a?%°žcwoCtìÉÜ6»qï-ålÞaÒ<Þ!·iïFÎè2’SÞ!ç±÷í¦k@©ÑA¼™v³)ø ÙÅ•¥ÄJn¦ƒrš+ÕÿÃ/ͺ½LÜd;LÑðƒŠøÐ%—Ð b‡˜cQûJM—Ë–oìòz<+Î×t./1m'½—Ê®yØ5ûfÓ•Ób0.ä8¼ól‘(V9É‚¿€(Ñ‚/rÛû‹«;ÔywꆞN€­ÌÆqOñ ÇRHʯޝÀ'½Ù|†0¿7º )eú±B¡SiJ”‘Á·¿]¦¶»®~ßÞû­·[ ¶üxŠÊ, Â÷þò÷½Åy{¿½M5Ñæ·o´ºkHôlHJ"(w}­•àpWð’#”‹Î“Éã5b X±³‘òÞžb•“<µ%&€´Ðê03òxWïï^ò‚ØçÉ ޓÑô.WN/›5ÊYÎ}ÔÛ¾   H5V+@{Æêq•€+Ú±3¢Åó«d‰^•,¨ƒa%Úð~Ú¤ t_!Ÿ1pø:Æ q¾†­-¼9ØC&%ÞàsŠ–Qœ’- Ë…û:î«#áŽò]åüv™-⟛ý•l½$ÄCµŒ©ÇjHȸ\€@3¬|"XåOÕcA)”êü¹v^”ó×p‹ C4b#à|ÿá*4Uü&’}@io Šsc˜É†wqŽBP•Ëc §0LjdW¾¬ncâ€K±ñµô¼ß| ÿԡˇ«€z<ò–RÜ£±\¦ù_Å¥›`Ñ—Î6vóDS-Æw·]\zT# èÚ"jä>—^8MÇ…S.úènúyñ/6$¶ëHeþÖáÙd§ýáCHÙü€£ÀÌËÇd. ã„SØ@’ˆ\jñÈŒchâ(–¨XŽ%nÁfEª>ýaŒVš¯Ûb¸êçê@û"©]ÿteID € A!¬™!ÊŠ«œd)Ê2„püý°ÿ'F¤h‚B¾7ƒàï(Su­¨·å&ÄÄh$Û¸î0'ìE4.¡! UG¾ù¡¾8¢7ÅÓ}>Þ 7Ø0A44F…ÀÉŸ%ÇK ?=fKoŒXÒ%®ítŠ'À.­’zê\ö«\€… ÂpwΫåtvMJ‡Ð=m»»A¾˜*'ûÑt'ŠÇž¯±Cº“ÓœHwJ{Z°e¾&`Nr¢ 8`vº 8ŸJ?Kä3@œ¼>Ï`„iðSìÉ™»8ŒýÙ 0©’2L–ÓÀùª‚ʼn¢`Îà ¿£»W1,ÃlÊýRÀ@!ÕÖôLMPPˆ¤Ovôÿ‹‚y.ÊlÀ˜TϹ~¦‘‘FÎŒä6rG æyöSÆÇl:þBðÁ­…Œà <Ð^ŒúÃc¬d|šI(ˆq™´“™ÕN÷YÉJ¢@³FP9Í ” Ôt½]×íiè„IŽa™JŸ“D±ÊIp"¡ÔÙ!—=N°fÌ«¥Ä`­c>^Ås¼ZA¬„,kÀ+ÄÍ'³¤ ˜0z>{Šgx”Ô%Ô‘>»»údÍ¥ „‚83ò˜(žãÖr¹!‹?7»íSÝá|`úœEwn€Ôêé¢;׆8Ë}¿¦¢;£¥ª;–ýd*ÂlšÇRÑü!ÈE51\ÉYŠîžb•“,Ý­æ0s*†¼±#~N?êEéœø%¦&$µ 9ÿ|’&Šç$óÇÃU§‚òQAÙ3$åRa ŸOÒžâI9Ø›bJD-ÖЙeDS>o#¥´öÀÃzSK=?®ì)V9ÉÂÚS‡%?w˜9i丙òÕ0Ƭê, ƒY ŒUúèú¤¤ÌD6§¤É)IÓ°1IŸ-šP„:ˆ”f-#9%Z–‹6ç¤K$‰ÐB=§K$ÆàÁ «ƒ(‡>ߢ#µê@®Ði <Œcr-¼Ý57íOYDP¨%…ârRÙ{ºÐˆxG™LÉp ñàÁÉsý)TóØúò© GW•8$Ûá_FòWwÛ}Õëxj°Í­ïÛ`B¢òOWïϨìckKcŽÎׄƒ8©ƒ%tšX|t*?DÜ)Ñ÷Pé§¼ovËÒ~’$í%‰Ô(ÃÛOíª¼Œ bDßOé´ÉÛa{OûÊÛ½ŸÐÇ0îE˜,u$4~w:öñåå]HaÄ.­àµÿh¦î2¡öáòpny“:ÓìòãÎ4fVËýÇ5®Û{ÿØö>ܼm6Íl'C$_þ­ Âùhò!¬tTdd IŒà‹ç¦ %àÈž³_¦lú¤é:|›áç '£xl(†Ë÷‡Q7SúO†…L{.Ä_Ù×nu\`¹hoÌP¢x€­à…$llš1ü¢†XÇgHKÁ*£XÈJ4'F:ÙÏ{>Ú±èѯ&ƒ8£bËìü›ÄÙ>‡ÎXÁ… nY?<µo®&‰_ .}ǵ¤O >]+sÀRõ=#ßð¢7Þ×%·¨ Cë݈YÁÌŽ {L@´Ýü¾ìgêÛø¯N©Á„‚&[•(Ái2ô—Î#ŠÌ'\Õmç5ËpÚ±ëÂá‹Rì?P‘½ƒûTö’‚.²Gûþ«÷Z>"­ïCHŠš‹lbÉ6†ßçX1fGcå–åu§Ãâ© »'0ìãmÛé²z¥YBöoÎè°D J‰1‡/#CÌ÷Û3ÒõC¨µiÀïžB` YØZñä˜"ÎÎÝ'zUFðõñ÷Æ| ÃCcqÌ“DûãÑHIÍïÎÌSBÎ žpš+ <ã˜ãÄö8&Á¢Å°´»o×í}[]Éc*Èñ„˜ÈëHƱ.6Ø=½IÁ„ÀRŸ ~nïyûxÞ¦Kg°ÓÉïˆÂ­Û¹ôŸ^ù 8m/xâ9u}îê~W?œç.DnÂû›]ÎÄúÇãŸèYìÕü_jNendstream endobj 3067 0 obj << /Type /Page /Contents 3068 0 R /Resources 3066 0 R /MediaBox [0 0 612 792] /Parent 3074 0 R /Annots [ 3070 0 R 3071 0 R 3072 0 R 3073 0 R ] >> endobj 3070 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 382.9517 516.6856 394.9069] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3071 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 370.9966 104.0999 382.9517] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3072 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [341.1034 78.3609 368.5561 90.316] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.9) >> >> endobj 3073 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [395.9558 78.3609 412.8923 90.316] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.9) >> >> endobj 3069 0 obj << /D [3067 0 R /XYZ 64.9134 727.2935 null] >> endobj 786 0 obj << /D [3067 0 R /XYZ 64.9134 521.3343 null] >> endobj 790 0 obj << /D [3067 0 R /XYZ 64.9134 228.6986 null] >> endobj 3066 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3077 0 obj << /Length 2548 /Filter /FlateDecode >> stream xÚÕZ[oÛF~÷¯ÐÃ¥€r2÷ËbÂÙf»)‚6ÛºOm›±‰È’–¢»¿~Ï™áPCiD91½h ¢Éá™s¾s™ïÌðåÅÙ‹Ù™#Ns=»x?Ó’8&äÌJ¬¥lvqõkÁ8—\Kª 3/¥´xûÓœÛâÇ7?~7/…ÅË_^¿™[Q\”0 xýC¸ûö§WsV|ûúŸxó|neqñêçùïߟ½º8c3 ÿØnJ®‰tZÍ.oÏþ{öëïtvuFgߟQbœ™}„kJ„³jv{&• J ï,Ï~>ûO/°ŒËTäK4•óŒ­Úq"¹ÞÖUõq_AË|7ì@?¯CP9ÇAAA˜°<þ½§^'¯Ljg%†Š¡v‹v}û‚¡‚C· I åäã¨z‹ðËb[ßÖËE|Ñ®ÃkƒI@€039°ŽK;ñ½Äæ3'ˆÔó£Šâᆰ\2´0Ó©ÚK<¡*—à*ÊÜPׯç¥âª8*ç|¦‰f\và¼T“ŠÌK)eÑÞTÁ‹×ÕªjmuFxÛýÕ;HJ[T×õjn|Ä4«!ãÚ›Œ¯Ä»‘Bwæ0”ÚNµ›Ã^â!†)Ò€d©ØBÒYÁ’‘¥¤ŠHÁÀ+\@þR釾jÀìfÿo­øS>Ʀ¤Àd¬¢ÆŒ8¥øqYá= ²ºËøÆ±Z¥¥¤¬Íǘša[4”CŒ~ÛTïëûÇVƒE’?æJ‹¦^¼¬–ÕA9F¤Uñ‰>O3±yÂFî ±ó(5¢»]¬ÚzÑÖëÕ¾¶BC·"yå©ÛK,S‘‡Ê íˆæœ •­ŒÁ=%³„*˜q:H1>™Ä*Ú½;]L³)cYD— ñ*%³Á/¶7‡Í%á’ó'Ft¢Íd=já.¢SÑñ• #:9Ñ©²'"z2HŸ1¢'­Ò`¹¢LˆhÎ ä9ûŒ*½‚®vëxÕ±·ExÚ…:<‚h_VáÙj­Šp4  &Ë‚QTvYÂÒ>lRU0G$£ÉÈ'”X¦"3ÁO•tl¨£þH8;BÜ)]>+&ƒøKÉ ªAMsŠ»PGŒò“ëü9Q¯æÜ­s]5ÇÓ#1e²ô…g—)>ãéGN˜‰È±ôHuìÓ£^µ€Úeºvƹq[ +0Ê›ð:K»'¥‰eWxÿ‡€%ЭÅ‘M“Ô¢©Òd¥>M0]­oõ!‰âŽXÃHŸœ(Qb™ŠÌ$Š„Rg‡Zö‰²Z·ºZJ ¶±Óé%žÒÕ b¥5C]—Õö ƒÆž[8£§Ó±—xBGIa)jÏöfqàs T”‚9ê%žÒ|ιªøgÕ¬[§K¦/¤/TrBàD=´ŠPn;ï8ícù$Z†$ ð$áh]K4›¬®Z»«k©¹£Ë?rºå?9²ütì«Ú¾ù^V™-Ï|¼Oòôñ> R*“ΞeΔf„ÞuzsX„×M»xW/=]m炇aK‡›—ßýðKw^‚,v½\_‡?7Mu…{‰Âm•ÛQÂ#!€P”›g,³,5‘ZÆ-çË»¦©V ð¢°3éQÌ=}¢—X¦"3{þŠ£ônâý#áN°2#Ẹy,•~1wº¨n‚ nuÐm3h@ñpTk<“€,°rn€ͤt¨¡{:$A^™ Ì"ðmÒKOA¾Y ΆàhE#6Ô¿­¶—¾QòðÄí§½I÷‚ó ”¦ $yÉ-:$Qb™ŠÌ€ÔŠ«ÞÍœ‚rü¼EÁkÂDj»½»ôiUy®|åÏ  f«¢~¿þü¥©Â­ê¾Þ¶ÝcäÚø8Ãàö•6üq׫ú7ÊdìY»÷>B1`Eî\†3 BÅS¸# %vcðˆ*Ëùr™*ÓÏå›áN÷÷k¯ÒUXÝ£7ÞŸÖÃån‘ô ËÐÖ Ë'5Ô„kk½ê u—ÙÌ8ÔpÍ:¥¿úÛW™~ÃÊXÜCnüÄmÄï¶ëqðFg%ú·;%»À¨n\û1é±l^.ÚN÷º;k¼¸²º÷¿—wmä~Ôºë¡Þ-.ç`êÜihv×`rö4Šq(YÂ~úa”ÀÃ(%à¯ÉЄ„\ÕêCxö¡øç1´gÝåLõŸŠÇcÒó¸(£<®9KEŽð¸Ž¹]Γn:€Ÿ“à %H›q‡¨ùWäpü$‡Ë% mgP{¡‚ÀE‰e*2ÇW4°µ›UÜ4ëMÕ´/x®€B)Ú71‰Ë¢á'€AqüåSP¸N`™JÌ`Â$QÔðÝÄ)(=ëòî›lUC#S Oþ²¥xBuÎ-a°ŠU=Ë<™†¹ž€zæ°°þ@X˜6Ĺ hgX¦3Ÿc9¢),×ý¨}/ž§GDû ( ª¥cDT0‰D4“ý©vã œ à]eÝtõO€$(¬ΰ!J¢æ’CîŸ@ÄÓÃÀÞ|ÁMÑUKlxñ*fŠÍ÷¿q<ð«8®ã;•úý}¯2ci¹'"9À¡òqÕÔèÙC ,ëhÀ'É{M€´‘/ãtëŽáÝõûpÏñ…7<‡]oçö[ùÈUëTÒîÄÖ ëxqqSoY=Æ;ñIS•^â}\8~;„¯dÆBmenØx‚l‹ÃE¦\Y×Òt>Ç¥µÅ)ýl¨œ·îVXü£:Vù\Vñ€îß»s 9hw|q1,9à“ñ¨¿ŠÂ–ÕêºÅÝYú&^eâÓà¯ÜS`Ȉ! û.ˆzì‰¿ï ».Ä«ãûDOÐËþÛÍ›H‚·±_Ù{@’ƒ‡q ² ˤ6Ý·è&l^Ót{/y9TÈSàÄ`ì`KŒ@“àb´¬Ë`øŒÂê!……゙Ü}.髇¯+—±Á EDtEÄuß`bÊ„ïCsÚÍ ª¸mOÅg€ºé? î11bgfÀž$Sz‚M¦N`™HÌ0dÚ¸~^Tóp墰øÐ]ø¼î1»n÷a×{÷_jmš8¦+Ž÷]œo§¬ x«ëòpm‹ƒƒç—áÉU…/÷äÕp+];þ-GRÖe¼óâÎQ½ÊùŽi¢,ê’áG¶Pî(°L$æØ%žÇÝÏû ¾‹_P`Ò!ô©ÓÌÐi(÷›¾³à»9öP©ûª«ý-¤6ÝÆA÷.|=«òÞÃnÞON½õ¶ÍæžßÅ Ÿlww'ndo·ô|IçݶóÚÿÞ!Êÿ×¥*¹endstream endobj 3076 0 obj << /Type /Page /Contents 3077 0 R /Resources 3075 0 R /MediaBox [0 0 612 792] /Parent 3074 0 R /Annots [ 3079 0 R 3080 0 R 3081 0 R 3082 0 R ] >> endobj 3079 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [439.2257 164.5113 471.6597 176.4665] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.11) >> >> endobj 3080 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [498.6421 164.5113 515.5786 176.4665] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.11) >> >> endobj 3081 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.6658 77.6005 373.1185 89.5556] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.9) >> >> endobj 3082 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [400.4605 77.6005 417.397 89.5556] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.9) >> >> endobj 3078 0 obj << /D [3076 0 R /XYZ 64.9134 727.2935 null] >> endobj 794 0 obj << /D [3076 0 R /XYZ 64.9134 521.4929 null] >> endobj 798 0 obj << /D [3076 0 R /XYZ 64.9134 283.0629 null] >> endobj 3075 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F11 2356 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3085 0 obj << /Length 2131 /Filter /FlateDecode >> stream xÚÕYKãÆ¾ëWèHËÞ~w3€ÄÈ8dròúÀ‘¸#b%R+Rï¿wU?ȦDiÖ9@.Ù,V×óëªâ÷‹÷?ØeA ÍõòñÓRKR0!—FPb-eËÇÍÏ™!œ®rF)ÍþUwý*Bd‡ãŠeí*ç6[Ãìêð·«X~^ýòøãR KTQˆ%u\g¸¼xx\0X¢K6îÆ5‘…VËõ~ñeñó/t¹YÐå JLa–/pM‰(¬ZîR ¢¤qe·øÏâßÃÕ;wP÷+Á²™ôNßûÇOÿõ!úÁ¼»ö9Î_ª ö¾×ë«ØKÛ¡Xò¼ -5: rØ s×q˜c4‚8\ðl]u]Ý<Ï %À`Rz×>n}烽¢€×±_qÖ%Î`Éd{×~Ö®ÿò#î`Ç„0ŠeÈ`ÈÛ¯Hýí1Pú^ÎÏ—Ú¾ë%nêŽ'> =ê÷ –ˆkgäÄŰ÷ËÑõ‚¾³l<·:üpÍØÙÅ©—ª ;6­": èhH ­`‡a€o^¼»ôARG‡R}Š8÷P²yÂ}»B!­|÷RÃi™ý³ÅÅì«_W®ƒœ–†±Û:¸Äm˜Zw¢Px?tÓußãL×êðŸÆ09ùžÛW•ͳ§iCy —OHPïúÜ—T£]ØX+&þ „î]Ò';u•½‡?Ž0à†§cÆõ) 7²<…wãðÉ)ÝÆÈô# Bé½ãäòzØÌõéþñíÁ¨K%6s´IJŒPqˆPU³y/æšÿH9M­U¡³jïç% wHïnf'hŽ ªõdvà÷Ãðú+&[ÀÜ‹ëñä>›GLXB­‡<ÿ^uk0N¨¾n›aÎ`k”Q†…½ñš'׌ϗ J+ˆî´ö‘=ø S›Q? £…O\X·M ²ÆMQTGÒž“â$²v‘ÒÏ•'¯Ý@–W¿ù‘ß©OÊ0ŠcB8rlöTºißgÄããx];¼á…4’ç ø|. (‰¡.|E7I´žÌ’€}Ýt}éѶQ`ãºC,\‡ ,})@.¤…²Å¨©W®Ä ô†Ò cëo)¯DÈ£c5T½jl÷£Jþ ™Éyc‰`fš¾ç#È›%ÊOmS]AMO&ÿ—Ð9%®œL[°›‡µ®t™Ã H(¢æ3Í6Ì@ãiü‚±kÝ—N·‹ñŸPð[Íì¥!ð°+“ùµO@¥Z+DÞ°/±Ïj©¨_P5\üý-ަȋ¼¼?°•„Qf¦U›Ãc›}ö` á“®ÿ4òoR¢M¾ûF`žB)7T‘çß c¡ ¤ûáSÌ3©2ôϤ.ÌÛÙóÀ*Ètk¾Áàr0xèHÏ»9 endstream endobj 3084 0 obj << /Type /Page /Contents 3085 0 R /Resources 3083 0 R /MediaBox [0 0 612 792] /Parent 3074 0 R >> endobj 3086 0 obj << /D [3084 0 R /XYZ 64.9134 727.2935 null] >> endobj 802 0 obj << /D [3084 0 R /XYZ 64.9134 506.9261 null] >> endobj 806 0 obj << /D [3084 0 R /XYZ 64.9134 412.8637 null] >> endobj 810 0 obj << /D [3084 0 R /XYZ 64.9134 161.7262 null] >> endobj 3083 0 obj << /Font << /F8 1548 0 R /F14 2010 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3089 0 obj << /Length 1075 /Filter /FlateDecode >> stream xÚÝWMoÛF½óWðHæz¿É=EݨÃqå”ä Sk›)Êå4ÿ¾3»¤DK”¥i…y¹Λ}oft1 ÎÿÌBCŒæ:œÞ…ZÄ SAI–QNçŸ"Æyœp-©ŽÒ8a”Òèæ}̳èÝÕ»7q"„ˆ.>^^Å™ˆ¦ D—×~÷æý$fÑëË?pó÷8“Ñtò!þ2}L¦ )ü±-$×D­Â¼ ƒO_h8hø6 $5iø Ö”“©° ¤DI!ú2øüµq˜ô“¡Ë <*ç#gՆɥpg­luk›üáë9Ç@w²IQR š+<¥ŒVEU”³Æ¹­ýkÏ a´„1÷R¦Eïþv ¹k½×zQ~÷«Õ:Ï1›ÖâçLº(ê¬ýW¤ |' ‚7Šñ0áÎM¥™4ðVS7ÎÏ^@´7ö¹¹®£¾wÌnbÁ£ºig·E‰ñm,Xôý÷>–7×;Ú`8uYßûÇecçE¸Y{(‘© w®RÂ)As1r%”éÒÜØ'Û¬lϓ֛& !¥roLc£#[¡û%„Uva­F 8\<Õ²ŸF"~¦ŠþV«ö,NW‘[Ã& dÔÑk»Ê1U… ¥-€û!ì$y~x¬Ç5ß‚o‰1A˜Êºtä_q7–jC2õŒv ûÜ JíŒÖÈãâ3eþ;à[Ñ>àŠGíƒõ[%š®Ð¦ÏR¢4Màì¸ê%½ð”kzì',s˜°NdͼÿMF…&¨!Jpù\¿Vhò'…&þ5¡É£B›ÛÒ¶ö\Œ8•Œd’÷7u6â*%”²þ–Và)oG=%$ûV§XýKëCßlk›jL¼˜$Æ Ú*>ˆ×½¾ûʤ}±sŒ¡ô'¥­ì¢=¡(E2Äî gUÇ<í$*”\D³²ô‹&†,Êóu³ÑÒ¶A9cPÓXÉ`œ*y_oºèFš%ôb.ÍV¸c®ˆb2{¹ O´ä´oþÒ©OöTxÉ7‰©}¹¸i(ž¬§6H%eF!dI"…ù0¶Ã–¶)ò®ï·›RSùäžáy=+ 7À t£A±-Æ}\ãc³©ÒgÞÆåÿnPºžå æ¡7¥‰òêralX’¤”›íÊ压,%‚ï°—³û®Œ*†^ÇBŽBu–>gîVAûl=¥…áÆRqˆ¹‚k??Ùn äM}®€À›Ê_­QšìEþ2h$æx Ê1´“ø u\Sþƒü•’A=…$<øæë™ fFâ­ ™¼ÜHC(òYÛÝ?9o¾OÜçßýc¾†ž†…Únf[Ç Ü›åxu_Ûf».ðbîO˜LÿïMXmÂKè?\ÔèIïñþ‰?åþßÄvHendstream endobj 3088 0 obj << /Type /Page /Contents 3089 0 R /Resources 3087 0 R /MediaBox [0 0 612 792] /Parent 3074 0 R /Annots [ 3091 0 R 3092 0 R ] >> endobj 3091 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [290.1244 217.8956 312.5958 229.8508] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.2) >> >> endobj 3092 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [339.9377 217.8956 351.8929 229.8508] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.2) >> >> endobj 3090 0 obj << /D [3088 0 R /XYZ 64.9134 727.2935 null] >> endobj 814 0 obj << /D [3088 0 R /XYZ 64.9134 581.2968 null] >> endobj 818 0 obj << /D [3088 0 R /XYZ 64.9134 357.7312 null] >> endobj 822 0 obj << /D [3088 0 R /XYZ 64.9134 74.3896 null] >> endobj 3087 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3095 0 obj << /Length 960 /Filter /FlateDecode >> stream xÚåWËŽÛ6Ýë+´”€ˆ!yù\’Š`Š8«$ GžñØ®%£îß÷^R’å1í´i»ÈF¤ù¸¯sÏ‘üz–½|çrϼ‘&Ÿ-s£˜ r œ9ÇE>»û\X&yY ÎyñkÓveÅvWŠbSVÒ Ü,ê–žm³Æåûòëì}®À1í=äŤn½W›ûíõ%4ðB`™°£j0:nR­‡Ôí{ØÐú²9¼” £J0§ä€ï‹„)Ë8z$Àò’¥ÊQ?¡¤U¨m °±è¬ô¦ˆ=¹%lûüÚ„£ÓcäWƒêûKLBü4fŒö&Ì&úrA^¸eÞzyM^üyÁ©®¿=ž»Å¬VS}!ƒsÜ„¾_¸P8?Äí¤`hÇp&'z‘ μj"&ÈÅ1•ÇÞ'x<°««PƒCŽìqi¶êFQpSQ¨¢ÚH+™Ô NÕ¦ ráP.‹“= â±>†Ù3@t(sâê;49&ëÊ™°#W£Ó$ŽN›Ućvø™Cü‘Ï2ÅG¿LÀóeAo˜Áå%ɛቸÓó0ü<ÑxÕÉc NÁû,8bõ·Oª»¿%ñK‹öpôGŠvïðH0÷[ƒ'Οû'ÆÙküÅN¼Ì_|…úë_QX\å&äU ‰¼4`Äh9ˆÞªçJí©4—gÊ(ùÄwåã7‹4› D&¿çJL«Ã.Êp¤î© G"S9"X|üÊÚúS¢Þö<ý׫žGXøïKÿ¼þƒ¢jùendstream endobj 3094 0 obj << /Type /Page /Contents 3095 0 R /Resources 3093 0 R /MediaBox [0 0 612 792] /Parent 3074 0 R >> endobj 3096 0 obj << /D [3094 0 R /XYZ 64.9134 727.2935 null] >> endobj 826 0 obj << /D [3094 0 R /XYZ 64.9134 526.906 null] >> endobj 830 0 obj << /D [3094 0 R /XYZ 64.9134 242.7984 null] >> endobj 3093 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3099 0 obj << /Length 715 /Filter /FlateDecode >> stream xÚå–ßOÛ0ÇßóWäÑ‘cŸÇ~BctTá‰ñе¦DJ–MûïwζP¯ ‰ñ°©Rä\Ï÷=Ÿïû( >ëÐP£@…Ù]¨$5\È0ŒjÍx˜ÍoÅ $S$bÎ#—hr>>?‰b!9º>GZ,Fr:鬗£ˆ“ãÓOÎø1Ò’d£«è6; FYÀC†?¾‘E¥QI8[߃›[ΞŒ¦& à˜Qat.™šH!K\_Öã!b¼òÈ-¸g­Ê• E»Ö”£.]íòİ5Cb."1¨â\‹éª9€Þm;p<øÅXE!¥jݳÈ(b—.öV¥pƒicWÀ̘RaÌÑ ¬å¾²„ùªùÅ $ä°±õܗų(ÝúŽíjV£|ÞæÑäUéÑg8Y`q˜x¢<Þ »´e³‘Þn"΀*“оN«ÇÙÌ©Yëžs_¹ö$¿óÕØP­´êçö:»‡B y±Áà÷¶»¬»6lu ü«,Ûg!MçYùò0X½t½·ôÝ$°U pÙûPß&¦±GS3TTvËr[PWu[‹°ÏÊ?©Jë‹ýÌí"@ªº™~ËÛÞÊ›HpòsOø.—“ÉuO«K§*ªE÷úPÛyŽ–Yߨ¿IA¤T'ü);æevl¹hîß“žVp‡Ÿ¼lìÂÖ¡µüDãÁèe(EÅ4}†:B’¦ Ì>„ÜL÷Þu„—ep·6ZÊ hAybà¿â„3ßæá™¥äP¬)^Jz·7¥¤ìé±(y÷§Ïc2€òÚƒ‡»&Ò¯`¦Ý9„ žžV>ôô¤óÛ Á†=òÁÅñN¡Õ×´^<¢V»1¶tW§fR‰B0%ìGJRxwÃpF×/¤Š*¼àí=ÃÀ})Dú°é.Ÿ¿°À¤;endstream endobj 3098 0 obj << /Type /Page /Contents 3099 0 R /Resources 3097 0 R /MediaBox [0 0 612 792] /Parent 3074 0 R >> endobj 3100 0 obj << /D [3098 0 R /XYZ 64.9134 727.2935 null] >> endobj 834 0 obj << /D [3098 0 R /XYZ 64.9134 702.3869 null] >> endobj 838 0 obj << /D [3098 0 R /XYZ 64.9134 486.7996 null] >> endobj 842 0 obj << /D [3098 0 R /XYZ 64.9134 259.2018 null] >> endobj 3097 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3103 0 obj << /Length 2194 /Filter /FlateDecode >> stream xÚµYKs㸾ëWèHU, ÞO©Lí&Uû˜lj”\6{ eÚÃIt(ifüïÓ’,½›‚ˆFýüz¿š½û»—¤Ô\ÏW÷s-IÉ„œA‰µ”ÍWw¿†pºX2JiñK³?,–Bˆâ±[°¢],¹-ÖðeQïñï¾ÙÁòÃâÕOs),Qe)æÔIa\áòìÇÕŒÁ³Ói\Yj5_ogÿ›ýþßÍèü§%¦4ó¯ðL‰(­šogR ¢¤qe3û8ûW/p%.S‘ï%g˜ºäDr)z˜A0†ŠÂžl‘ OKÀl«oc0Œ¢K q{8¬,9À„ Ëãç˜^â2éѤª1t–fg®zÇ’¼`ÄéÞºÉ@5„R¦"Rðè©UD mßi”øRk‰6êE@ÙµH÷Çí)A„1üíöŸAÊ!ÞSòJ¨`AF4± BJí^_-J]Ô[ŒéGHË >TÈÔ©%8dÕÁWü¬ï©Fxk’ÐO½Þ÷Qâ2™ñ=- 7º<-ò_ªè_ðáf±T\Ý··uË.‘&©`ç’1Rª.“Â=8áto .y \|íuà2±|Ç,áR²·—ˆ¼.¾v%¸qKI„*©7Òõ~½¨qa~hÚ]&¼)dž€šOŹÀ†üá‚Ï•‘DRûú°ò–©À©i, 2 TÿVj™_N†ùµÙŒ’6l8ÆÝW°µïÅ5þ½£ì±YË¢¹Ïu´’XmãÞ_›ÝT:Ø™2V†Wš í‚?ÕþyïªKµÁòâNü`·fQo%˜Â}Ûù/›œƒÒhi,ÇŽjL4‚]rÛ0Ɉ ¶dC—OÓ=º\Q  àÈ7sy"ð‚Ëã[ç\^}û³]îMòR—o*L·‡KÞ¶E}ÑÓ¸––¯ö4/¡ž`± ž–çj_ô4Be};O'/x:¾uÆÓÛ?ÙÓ½I^œÜ°Íy±½÷ÿ«ÍÆ?ü+Âgõ¦Þºÿ. ûKž‡ÞŒöµ).ÀߥµÃ?#NBÏáq 5ÅÑ!zû… +¿¶é'|×>ÁNWñêC³N,ðe¡4XçX݆BèLYwÛ`UôøÞ½¹vÊí4^†z&ªê!lTÆÅëÁº`4Àþ#æd×vÙÄt˜!Ú]=ê’¿-/ÚîPÝ6Ž:6‡…`ÅÓñ~ß?>üÛ#úÍ͈›ö!ŽŒõ]+ëÀCϨ ±Š±ÑLÆŸÉö ê <(†æåh¢—× ú\?•– ¯^ŽÖXìH²—éÇÞN¿,Õ⌦˜ˆ…ú¾Â ¹ž7á|¡"z:KG<Á^¹ƒ¥¨^|J¿á:U®=þ•Íšç{¨l< ‹ `ñ™ç[J ­Hô3q¶§pIÏôã‹î©xóL¹µp@ß´š ÏÎÚ?»Êë*Õ! €Ê)d«2.¬Û®ó·J®>·;T0\0y©m¶Å ýc)¹`çÔ4᥯Ÿê.h‡g2¡N4Ï4»Xo!O QfÌ0jª.4Jß5º‡úŽ\çÔ¾¥j xBŒzö¾Ù6ÈÊ|kÎEIÜ—)”á’Ê#!¨¿ùÐx<Ä–¿pÖp'z+a hÖÕ!´­ÚOÛ:áòd]$yû3Å’ñ’À@ˇ=+I¬+Cç «¤ºë’žáO žQÎ`ÀuJ $ Ô墺õ_Ü4 åÀ…6w¨…QžQv9rý¡ñ¥Êƒj»47ðtƒ Ž_\ûŒ~;âèªZÉb•|½éùÓˆm1 dRòa¥» žéÙÛºÝíCRï{àÞê}þoƒü7CïÛn›Ëq8¥d<ºççúiù`_õT¨YÔÖ“I­zÐà’pNsð]-¨â&œèÆi¹B-{ÃÃwÏè¡òCò±îÁfz&D¾.•8ÁšZJÇÿ¥uæ©©7>lQæÂ0ÖÖ–Ï”pऊ™“Í$¤ñHšuÓšò$¨ð“ÏvxðÙNÙ ð9IÎúMxÌ ýjüvÜsS#?¦¶hHôZ„û²f40ÙpÕÏË¿eŠƒK›áw §âìÂùÉÍÅ=RÙ.gSM Åé.žöþj§5»¤´†"êBé•8Üô³VŽXJ,µâ"ÈÁ„÷µ‰ÓÛîh º„Ö(¢©’—ÐŽË ÈÖáó(ó= „&.Œš¶Åw¹šóÁ‡9l•#ЃZAa°2QNt#Sy C­²y Sš©‰Fði¡¶j7JaëtÖ²[sй|®c_Üä&›)pñÀùsÀo=Îj÷Ëþú‹«¸®ÝÄ­ûB{ðŸšÝ2ð*Uâ/yr˜:®U¾¡c4‹â®ýâùSvä‰6´d|h;4üC³ƒZœ¤ÐpÆŸeŽ¥.£!bAÃ#@ï©nUøqôa×ßúè÷„½ømÖŽøá®Ýöi¥ã^ÜBQòvüì†g„µ{@„µVVò´}ù_ þ¶È†-=¹óUˆÇ¦Ž÷CI;ÙÕ6|ò´nÛvO^Æþ±ZÇ;•ÌæÔáÆet-ã.M*Ä÷¥ïl¾àeãél|0’ŽãÖÏO¬ðF £ZÊ(Wñš éÓ20UßÙ·ÎNö7ÇVP“§áÐaÀ$œM ‚ãÅÜé2†¥ÃÓ’hÑíNc šE?B¡2B ‘›þêã8] œÇ9-Üu‹.aqZ/`‚4‘Ìn2¢Ý“éEOë;Ç+¾t˜sÉ ¡,z#º/Á`#ÖÃû6O \ü€%½ãÀmªÝy÷‰×ÆT"x¡«ïëÓh4Ô ø…*+ Ï^-Gçêî„DžT@F·zî¼x«Ç CÄäJOŠõqˆÓÿ˜öÁendstream endobj 3102 0 obj << /Type /Page /Contents 3103 0 R /Resources 3101 0 R /MediaBox [0 0 612 792] /Parent 3109 0 R /Annots [ 3105 0 R 3106 0 R 3107 0 R 3108 0 R ] >> endobj 3105 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [319.2377 499.1906 341.709 511.1457] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 3106 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [369.051 499.1906 381.0062 511.1457] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 3107 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [349.4302 20.5342 371.9016 32.4894] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.1) >> >> endobj 3108 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [399.2435 20.5342 411.1987 32.4894] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.1) >> >> endobj 3104 0 obj << /D [3102 0 R /XYZ 64.9134 727.2935 null] >> endobj 846 0 obj << /D [3102 0 R /XYZ 64.9134 702.3869 null] >> endobj 850 0 obj << /D [3102 0 R /XYZ 64.9134 391.1582 null] >> endobj 3101 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3112 0 obj << /Length 3072 /Filter /FlateDecode >> stream xÚÕZK“ÛÆ¾ï¯à¬aÌ/Uå'²².•íØëä`û‘X.,d@P«ý÷î× (ÉÑ’R˜GOwÏ×Oèë»›¯¾)e\f:[ÜÝ/2—ÊØEn’¸(µ¸Ûü)-W:³IåË•J’$úáÇ¥.¢ïß|ÿz¹2ÆD_ÿ|ûfY˜èn ¢Ûïxô‡_-Uô÷Û¿áà_—…î^ý´üíîÛ›Ww7j‘À?5©³Ø–YºXïoþsóËoÉbs“,¾½Iâ¼ÌðœÄ¦,ÒÅþƦ&N­1ndwóÓÍ?=Á•£¸ I~¢j5#kVêØjkHÖWpÜð÷tÓ,/ã$‡ N‰fU•¥³J#cV“ÅJ©¸LSuïK€–<ò}Uê,Ëc¥`¡—ZRç*ÖE™‚ Ø$-Hê7Í©W(î ºŒ-èèã¢æ„·j£Š/÷*ªº¾©vü¾kHgpÓý¥ât©b[ÀY!k_&­'ù qu™ÇE¦Ê±¼M{ê«xï›C{É­É5… ¶|Æ=›X™BÏßòÊS\…$§Ìš¬Œ3 1[wˆÇ &SUİ@?£JªÊZP©ì}>xëç„wjãË8ÁžÍ8>ª¬Á8BmõOÇzb t¥’`åÛ„£¸ IÎØ„Ö€°Ry$›ø5I“\í‹å*Õ)ß2Œ©ë¶òlþ± ¡M©â¶bÓ¸, ëmEÿïÛJ سÙÊG•5ØJ¨­ÛŠ[ùŒ¶ü˜­„<^³ýq[y6 ?¿­Œž(c>‘á^”5¬Ž–Fäúêm³#èöK£¢§)äÁ"µ g†¯¿ûY²ZL»ÃVò ®Þ b×H¬êkBnÌä@}N)LДqaMFóWj¿aG¯‰›Ã[2•<‹Þ/30‰®!²owõ‰IŽDŠ >kS¡¨%šiݶ(l߀¤Ž6gǦK{&3µ,8 œ ÀLþߣÐ×$œÂ ßìÑòwµÌ ‰od+ÔEDÛñ‡|R¿?ïx WøóÄýAÈœNͶ屪%z:êˆ@%oÛh–¼_¦iÏ).e €B„V̬Fç„«y°!‡9:jø {"IÖAÖp:8‘耤¢~©«õRçü–*ûøXÚN¼¢Aµ4œ>ã`!E7©¢s-+d%øU€ÉUÓ“Ø[t·¸5!Á —¡`ârñÕi¢z+—‚ƒ Ö–÷ŸúC'ã†ÿ¼££6ì‡u örÏKò øü½^÷¤†—‚sÀHÕY°MpZ¥NÙx~MT>œ‰á‹ïÃu¡l2Ý8K"àS[í›uµÛ=1Ax7S±Åod¼•‡®æ3É“¸]íN;Bð‡v<%Îü*À]ˆ.£o°‰ÃÕf˜‘rÍìÓ2‹•ô}e=>85µìçèFv}üDÀâq ¨ ¶}eüg‹˜sŽ:¹të<øøp8Ñ# 8z¿/ð®;Î דÃÅ6Áȧ˖)@pô~^]d’ÞØBâl†¬Lœœ»EQ "~nÅw3É%ŒLžf>eòJ/ý‘ÞÚÚãCí%Z~PšV’¹=b³Šî4˜ÙEÞôïÆjºY+ý¢ö¿8g›g…}œ˜gÚt;‰îx³6hmä1sï9¨ _Âæp¿³Ì²¡<™0ØÊl)ήÍ8‹¹C×lIW®Ó6ø~¾YêÏ]žƒ#›¤}ÑõA2‰(.Òúˆ:Í‹8uuµ‰ç“ÒQÞ,y-<¡^Jf9-Ù9íÂ(z@âxËïÈ&ØÀ{ü©9™¥ù¹ôUå6VÚS^‚G³Ö•!$Œ™&EcmÞ_ÃÀÆYОøØžNâŒçd¤ˆ[Ì¡àXw :Íg’3twS9—‹ƒä§Ümt"AC˜WæÊOsâVà7 Žä­·dº8vO î=¿$Tò©Ž„w8z¤Õœïo€á³µK¾1âÿ°KÛ9òœ)b î½b÷LŸ}÷Œ uíº9ú\¶€2OZ÷ráSäÂ¥È%¨nðÿr6¥±,=¬äxDOÄS™»Í0ÒmÏ{oýÒGÊàEÔtk,±h)gÔ'YÄùrNÚ€É=zþ3B°oV›9ARÍ>ˆ^\é~;$ÏWMàÊVrL1j—e ržÂ4ëÒEì5ž]'hÖ×#Äm"÷a“rê@pv-ÌGužxu%»Cà87/$Æxÿ8±–BP¬PU^©Å D+øèÓ‡Xá§$—NTÛ§u8ø™!!`ûä‚áÛÕDç0p\3|ÅŠpÛó4š§%—4ç=þzKųh5Uí0Fš,‰0—$—•–×éÛõN²jê¡.cl™è'îp-Kt˜ôéŒk,(Ž“ÅyV7§6(.T–xɉã_A,Ïš)Ì% ÔFœV㯠O9’ 1ìþÎ~Š=‰I¥Ø¿è§) ŸPËrDY}5ÓÅ~™UÆ2¦pƒ’SŠÔ3³7®0ì7`$,åM6Í~qB¦<ùÃÙ£Áß­³7vÜF }@&sàÒeœƒ[¾Èü)U.ç ’ †Àù:ê0é\>V^WPšÆ©Î]ìåË¿ÌÐÔi ¥Dî æ¯Ó dÓØ–©’E|œÌa®4F&%_5_͈èϧ+ž¯ñW3gž-ê×N)¢|‰³¹Û¶¯±±=%¦ …³,{1£K$ãB5~É2þ“»¯1¦ë¤cz_Ì—û¤vY™ÆªHÝ5K®µŸ-½ƒN¨ÔxŸqs0ñhMœæú¯M…µsÂŽš¶Yœ•Ú-ƒp5ô"N>‡ô—Æ\kÅ:Sv œ«gýyÛh®‘º0f¿÷nšûƒËØ—>4|î¯Ûöå¡”5C«º÷7t&¹K Ž[eذ}àÜú6²ÂÌ&–D‚ž‡¬{œ¼}Bsû¹Úº¡@:|¨äï ômWHÕ]™¼RÑ]`&Â"9åº0ànv±*tœƒAŒ¯’‹ôáÿL{¥Î8Í}…›-…ÿA]\nþÖArØËpý¡ÚéËäµ›aƒG-;WÛ£ï`í¼tñÿõëendstream endobj 3111 0 obj << /Type /Page /Contents 3112 0 R /Resources 3110 0 R /MediaBox [0 0 612 792] /Parent 3109 0 R /Annots [ 3114 0 R 3115 0 R ] >> endobj 3114 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [377.5194 187.3642 409.9534 199.3194] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3115 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [437.2954 187.3642 454.2319 199.3194] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3113 0 obj << /D [3111 0 R /XYZ 64.9134 727.2935 null] >> endobj 854 0 obj << /D [3111 0 R /XYZ 64.9134 582.3552 null] >> endobj 858 0 obj << /D [3111 0 R /XYZ 64.9134 551.9553 null] >> endobj 3110 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F18 1536 0 R /F14 2010 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3118 0 obj << /Length 4430 /Filter /FlateDecode >> stream xÚÝ\YãÆ~Ÿ_¡G 0j÷}ä!€ ¬5‚y±ýÀ‘¸3Ìê˜Hšì®}ªúb“"ÅÙ:pò2âÑ]]Ý]õÕÕœïÞÝ|ó½]8â4׋wïZÇ„\A‰µ”-Þm~^ÂÙíŠQJ—?loÙòp_moWBˆå¿o•^VǦº‡ÇÛútûë»RX¢œ ê{3nðñÍ›w7 ÑkGášH§Õb½»ù×ÍÏ¿ÒÅæ†.~¼¡Ä8³ø×”gÕbw#• J ‘žlo~ºù{&¸JW%ÉïpvœÓ30+ã;I(³ÂóW!wÝU€ 0ª]œÀù&Wã„år ë°<ìo¹[žk¼†K»<‡Õ8¼ï® t«î·±gu:nWÐØ“ðï…Mèô±q<'Ž™aDJj"/ÌÂb+Æãû_¨¢•çés ûGÚoà¼b¬8³„:k+ƈSЇI#%ÖöyÙòð}œM½­w8¹zh}ÊÕñXìÂ*ù+ÕÀM,æ…R‰/€+.4a’Ë4%ÖNéÃK¦Ô 06uû\°îY= ðšvx˜eÎ S"©Ç‡‰mNa´·w—<½…›´Ü8ænd¹ë¸¸ýµþ*þ9“D;Å»K.,è'Õº+EÕŠ­øiµ«éÕ A-b‹÷(E^ÏîîïÖ(Nw|X¨´!ÎI;ÞõvÃÏ'x¿ @p„ëÝÀðZä‰4þýå8+*ÌpK@ò‰T€~Øò/õ1+YÝ\.ë#Žv8ž28%µ3 zªç¯¶úô¤öÕ®NT¬»]ÎÀÆ­Ë·ÙFbOðìXošu„ųš9"©ã—VÃ[†`6˜ƒ³áŸtÍm¥u”VèGV¼L=Æ,¦ö@Ž F¸u æÀ•TûúáÕño°l—;+aZèTÃËß[.îÀrXeC¯›b¦x}ŽÜba“º“lö§sµ?ƒ\5 =^…«mEÑå{+–ïì*S\•$/™ÚÍ9ë2 êq8ö™Th(Œ8Û‚¢t2)aAcß?¦D+bH©¸.Ò L±¶€ê"-Á¹ã¶iîôr_ÈÔÇpS…Ÿ xñ ÝFkp²‚É·ì¸U…8“Yu¡¤yE:Ësþüt¡¯aÑ¢å«u Q\•$tl¤’àwxô:€v..q Lq•·6Ù¼A™o¡3éØqzˆq1´05¡#V€nñE°¿>¯®jö æÙ¶#ÐøwÑ]B/h“|½‡ç®;诟wø÷Þ;Qõ1¸ni´Žç† °ï iBM¼}±éòlóÖ’¢V]‹E}Ý>êzu£Zu-wjsØáâ÷–;b +võÕ ›(®J’ +¡³u¹Ì ûpÁ)Ì™K©çã4QœâÔ"lÑ(›ç>›’){$æc3Sœ`Sn9ÌtøŽwAOg0–ì)ÊËàp6AþáPÌ ‡Ý/n&àPsB9DH“PBev.áó€+œy8t‡ £¸ßäçõ§p7nÜàöóIt[1É0º›aH(‡ƒ"ì& ~!âë6â]Ý‹ñÊ͘B¼ÔvFÄ+H^C¼’Ë— Þlœ¶ˆwÓ„x%£¸ùŸ/àŽÂHÚˆùxÌ'x”x¤ª§€Í䋜¼Ù„õÕ0™d„›@5aˆô×ÅöÏÓ œÙ´YºŽÃ—ò¹Í±ö™šsvÂAëÃ5ßí¯Ï5õ´'ŸyÙ&º˜ J ¹ l‚3Ù‡·à‡žë‡˜Ê¸b g¸«ÛÒ\¹/×#°ÔrƬ y-+yÌðÖìqa_¤›³­óüºY*#Æ”‰$6PŒR”e÷[4£@|> ¤•q*•Jþt»’Ž·Yee/sŒ.Øuð5Rnú°0cc:óôZ IôVÁKù`Œ’¼³ÕéÔ<ì¿ȯKF¬ä&'žrÊ`£$›$Ü Ç™f™ ^Ÿ&é—-âÅ4ï‡æ©(Ñ¢­H Uˆˆ¦9^½tHª‘j¶©f‚×§* Ž6ànv¦ºmö†æ «ç„3E/ õÚçRA´ÍÒmÐ&Že-–OÕCÞÀ )üͺŠíï}ª?êÅó©ÞÄÊÄ?ˆÝZ ÏÕCçcíGqósXHÏÖ,?ßZ¹$ uà|¿{¬?‡NÇ ~ÀìáaßüV‡§¡Ü°‹weýcS&Z>SxóϵïÇøÇ Ê³ˆæµ§uIDÆÃhO~·ç}J“Äl¡¿JU½|ò•Ûýºy‚AqUhw9Þ?û×çÁ¶Js*Fáƒb1ôÄœHÉ^ob2ÅUIrB¨%Šƒ›uÓ®ÀW. ŸôM‚`p;~¡Lî‹b]ôéˆEG™‹’Ø^}J¤N©Š÷›·X¢%é9–%ãx!B×÷‡®ä„'%Å”îou­FŽí˜7€ÒóíX¦8±cRiàL¿lÃ4aе¦Ï7`²ŒX%Ch®W"‚ 3«â¯ÌØš8E´IR†(p/_½"‘Þª$x¹ÎË4o‡Íëˆø`Ëp›ƒ†·nqlÞÛ nXl‰V\iÎMHZÿV¢J[o.Õw ÀèO |_#Ìëv) 0åŒÍdHIú’g%á“J¢§”Q åæS’‚à%I­.”$Fo÷~õ‡U†Q0cTÛ•fÖdnñP“¯Bå+ áù=ˆs¸N[Ç-ïJTޱ[³÷§7P~CÀgA¸¥áÈ‚§8Œß\Jð·Ò¦ÆY ¸P>K²‘R‡HµŠ®8XDY-»ršì%Ccƒ«Ç_2´ksŠëdóQ2ëCmL·…c;¡Ú1Ÿ&ÙÙ$­öÇÄ8}Ÿ²è&mýÎäs1û‡¬MXêÛH_zÞz:«p úíâ鶸Lèg¶?r.ó4¨DFÀZûe/44S:$œ F)9›•Çu(·êèÐ_›Óù…†F*–½Ø!¥ñŽë:%#dR?qœ%áFÛŽ–=^ª§œ2QŽõr[ïJ ÀGõu{à‡L¬?y®ŸÎôù±Šƒ¡õ¸eD;žj#Ux…éòL dùÐW.ßAަÂÙÑì‚`D€ª/1¡œ!»(®J’Ù!‰Ôà_åf£â Bn8DPó1™(N1©%èN”<Ž 4LÈPî¦R m°’@üb©ÔòŸ9ïu.Î)£Ä5%ö7푞ýeɸk¡õ¹,ÀÎ4»äåm«c6kž*HŽÂÆPP+"ñlÃl›’)NlŠÔüwnG$çZš#Ú6‰5dÆX[ñ×ß7ÁcÝú´$=’† ÙÙò$<Þzó‘Þ%‹çÝSÎLR¿êù|ØUgØNL’ ŽÎßZë,ÏŽÓSÕÚNf.§¹"ûºNžx¾\mù.‰Qú>wvÁ¿:†Ç›ÛôæL¥ùP¾ÍɃÀBªdi(G”0ün›de›sêë-<ӯş*GëÌL†W Ó”sšóÖØQ‰Tñ¾ò1äÁO¦:m Ág© Vàrh§‚ Ãtß…'>5†Æ7ûb1Cø>~RpØwWñ¾i;~Ê„;XÎ~žÏy~±‡¤,X¼X?í.‡š«„mé%>Cc¿*ƒßˆ’òÁzù:A R°“ç !‡[¿”õÓG›ð¶pÓ(ónòö!¹i¡òëxj4ìøê¿’>çÆ1íŒéó’ä•ôyn6nऎÍÈd¢8Ť°DJ#{L>'“ÐR q×2ÆÆÅØŒ c®,áZ¨Ùâø’àxŸ[oWD„ÎÇa¦8Á#ãB}azL–M$µ9H„E®Ë‘¤¶&Šf›9؃}’Ìtå?›‘^KjÖ€·x%©M‰Ö޵Ym$²ÚxuÆÖž ™¹H–Á[Üð¦ãa›‡S^¶¾uxuòµGÿf¨ì2nBѼV#ËåuGf7Ä4øÖ§ÞÀ“n,“oBH¬gúTÚÎçl¾a{€ŽîD××£à3e'òà=ößø,úqŒïÍ»¯ünƒ nÄ1™ ?—Ý“úãä/mý)e! ºjòc“¾k‹ÒBNV†¾Ócygëñuôñ(¸}³%/ñ{I«ù %Á+ —Z½ôæâ°½«<¶ ×a²½—)œÃ¸ª…@Eƒû&t™0mºž§^‡È]ˉ¥V)ûè¯ÇäèÄ`P‹–ôõO;A¾0Ñ˦J+áüAM1?hË`jBZ JªsÆòZÅ‚É\÷¹@$Y:úU¨t†!ã§[ªó97Þ¶¾fs%uœ#)|6›ÆêDÛÄ(ðÍ(:lœbŒºÃ©q]ày3ž––xØ%Ç åwú8øó±¬«è‡IäúŠOv&q_‚sx¢Q€4Ln£“̯Â`ùñÄÕlpÇ  àó ( ŽÃ]n5 w³qØÂÝu3Üu™Œpw¥žÔ÷ñ4BÑ)䇲Ÿø|ÐÔ‚Ðö#ø‘JÄ2cC“†Á±ÜbÿÀ‡¦ød¬d9á*ûy£ бÊB’…¤pgu™‚-y‰.R<Á†ÿ®„ªþ‘çNn–›èˆq7ª0Nµ‡}7Ùáá6”Žð×Ã|J=w¾ôqŠ®‡VÓF«GÌeOm zÄc©Æ_Æø‡P‡;ÆÉÿý~^V6²9UùÂMñbÇ8ž_1D¥3A7ÇHmøòˆ§|ó"9ÀÉq̱²41Ì{ûT16*s,ØÄ›vµÄêÈàÉE˜U£‰Aì'Hãš¼xõ¹×DqU’8øJ¡NºväNuýç7 EôŽ]@¼GY±_GΪ(G¬ª¼ÊöÜéÙ‡+{,¬„t1Åúœn?ö0Ï¢Ò|ª@.ë~¾?kü7£ÿ©{D1œ8?Еdt Õ1…T44É^4é_e ˜s×þŒp®H3A³¦öÎSü\‰XÕþû&‚„ù€ H ¦Iw½Wü<‹ïÔ 63\L&þ“ ¦5µº<ðÞ™ñô‰wC(e£U`¦!˜™Î6ÏDpbžø¹…õ¿œçýðD±&+¾zž\p<›#g›g&x}žˆGJiÝ™gyܽ3IïOi‰Q¸Žd, ½»uzYïRyìLø¯c8Éÿ¤“Ÿendstream endobj 3117 0 obj << /Type /Page /Contents 3118 0 R /Resources 3116 0 R /MediaBox [0 0 612 792] /Parent 3109 0 R /Annots [ 3120 0 R 3121 0 R 3122 0 R 3123 0 R ] >> endobj 3120 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [388.0314 497.865 415.4841 509.8202] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.2) >> >> endobj 3121 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [443.3587 497.865 460.2952 509.8202] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.2) >> >> endobj 3122 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [351.8379 99.3594 379.2906 111.3146] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.7) >> >> endobj 3123 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [406.6326 99.3594 423.5691 111.3146] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.7) >> >> endobj 3119 0 obj << /D [3117 0 R /XYZ 64.9134 727.2935 null] >> endobj 862 0 obj << /D [3117 0 R /XYZ 64.9134 86.4149 null] >> endobj 3116 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R /F11 2356 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3126 0 obj << /Length 2421 /Filter /FlateDecode >> stream xÚÕZK“Û6¾Ï¯ÐQªµ¼ ìek½ñºœJ9Þx’K’G¢5¬‘È EeìýõÛ I5öð²å* $›ÍƇy}{óÝ¿ÍÌ«¹žÝ~šiI,r– JŒ¡lv»þmθY,¹–TϳŒQJç~^p3ÿéÇŸÞ.–Bˆùë_Þý¸0b~»ù»÷þß,Øüûwÿ›ÿ\9¿}óqñÇí7onoØŒÂ?Ö’k"­V³ÕîæÏ›ßþ ³õ ýpCIf³ÙŒ)Ö¨ÙîF*A”"ÞÙÞ|¼ùO§p5.S•¯qªœ's5–>Ó–É¥p3ÝœgÑ™é…Îlsß÷Æ1k9' 7\Ÿ˜ô-S…ç–YC Ó'¶åû}¹©~§Šþm•o·ùݶ8µ–ø8·b:{;W,fF®3ulr[4»W‹¥âjþƒñ m`adKıJñqô %R[6ú‰Âô£TþÝø Êêé î4^1™YŽžB5?£ @(ž…¿6D1a§Ã?Q8‚”BÛ¶eõ0~Æ ¼¡§³¶ÓxÅ^–)b¨6Ç_^fÉ˰À´ÙŠÁ]–âûb¿j€;KdÎǶ¬«ðnúa:[rTGåðòe@“3Í%âþr6ˆ —©Æs@20ŠbD©cúzûkÞ¼ÏwE@ç×|{(ztÒlÄ@2€,*PÈÀP 6ÏýϪ~Ä„ô¯è¼þäÛûÂ?Æ|T‹¨ßYrn¤B)i„ÚzHÀ|DâÏUIFŒäñ{d±Ì„žßÞ—É|ܪ]Qá”Z?•2<¯êÖ‡°œP Ü£> 2ëÿ/0ËùÓ=¨qÉø._¡¾‡¶ ƒÅ6^¬†oæ«~ü·›=s81îpÊ`Ã<'s¸Tãe‡ë¤ÆþŽŸ/ƒBC Ný2 ´ˆÁ¾Ü•Û¼ñh .³‚«ŽáÙ3£µrÂéw¯ÌÓ<`hþR¦…¹Ãoôïƒßø—Á‡Á!À­óàª8ìÃçáJ‡@D¾§:;)YÊ¿ ‚k ü Gâ´á"󓃕ɫ ðâCSoA¨Þø\zp#\Ò²òB9"Ж«ƒg¸U9ow=ÎÖ>‚?°|·G€IKÉç1¼\ Üw–øßŽêÐ~I=㣺iÑ‚ñªÈÝ$ö^W1$z Žç~©x âã­Œ1émãEb84{¡Ø—Õªð—>—êKÝh—£̹š4þw[W›¢ñÅçrß( ˆ¾û4àN‚¢•W“p}EBÙø¼òÍÛ:ØT7ÇOJi±é\úÕ a ¤×® fW(ˆ[BE6!õ G(Eþ¢v!‰Tð¡P1Uë¡jÅBOgØÅ<&€¨”4“ͲS8>MˆnhbÄÑ4Ç“8S4Ò齋ŒŽ ¨ lƒ}îƒË_%„Šœã\ø/LNuƒ õØG—ªVÅ`-·Ù%è Xj'ƒ®S8€ðàØö}½‹Ô’ËÎ}îøl™lïoo]©ø®£Â¯“øŒ`9"k#›8 ‰½'nn-Ô$ÒsSJ…uݯG¨+ð[uxÜʦ¯0ŠÏPPøG¾6ÙÕÍíŒxôD–îb¸¯ò„+ Ý 3ÿÑ1_Qíû\ P9§é0š)\“Ñë)V×¥ùït$sZÚ¼ýw„ x •n]™åÈó“)¶…›J[7!À+%‹G{ÏÆ‹D×^î©„ëFg.Ë¡Ëeò*„a{VYʼn5Æ\ðÙNã2Uùút«‘CÛ̘Rý‡Ïz<ð^7—•ItJ¦"d7œÓÒÔÆ]nÖׯðÀÃÀ"¨îŽ[è}¹ÀåUp[èË9åìØmÌKsö«X?‡xpMURïg~»j»óÅ~é@4MÖM?^@1„>Ÿžï$œøØ|µ žsÆ'[‹ðíU½óQ<¹hšÎùàñºhó²c‡Y‰×Çö¡ô˜7¾ªXÓêWZ8ÉÍ ˜3”ù&(gŠ%õÐÆ±dQêY~›lxn‚àE]þ= ºÂ0¾qiM¢qo`8µ3Â… “V×ëö¤q[ÕÞ÷ò²ê—(pæÍæp^WFžL©%ðä¢[PÌœ.âçž)ÏÊK%gðâX²1nbef)d/[…Nå•e€”NŒ††èhÖõ¡=ËñÏ®:Ù—'ù q™ªÊò‚Pjͱ•.D1¢Î«(/¹„je:K£Æk–BÉ*̉¡è‘»¢jOÍ”LX#1™Æ+fJfˆÅó¡#;÷…O¯Â^9r’'Qctˆ˜¨¥ ¬›Î‘‘¸˜Ä:¼ûb²;f(.5ï1b'‚nI3퓡…àÐjµùd$ƒv!°¹–gÞ¾ÿ%œ ºîyëpäú¦X—®MÆâ¦-ö>Ï&9¡ú³Œpl-Ù\ Ôêz+¡ìÅ.VSÑLÌ 4Ö§/ns¢Æeªr ÏaÐDHHXØù:VëÇ'ÒÂD°"_HpD¿]X=/v±æÝvÀÁqÛJëã†Kg=\3øˆšî¬-Uxù¬§“ŠP<ï¬g2kû³žq{»³ž#ƒ¿õ¬G|ÃYÏ•ÍQŽÅµrº­‰Tã彉N*]À¯Ûe*Œ¸]µòwÊd߈l1`ÙnàÒ>¤%2ã±bò}PW¨‡ú2lÿù]oGgØ> endobj 3128 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [310.4376 429.9087 337.8902 441.8639] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.1) >> >> endobj 3129 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.2322 429.9087 382.1687 441.8639] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.1) >> >> endobj 3130 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [310.4376 166.2018 337.8902 178.157] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.1) >> >> endobj 3131 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.2322 166.2018 382.1687 178.157] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.1) >> >> endobj 3127 0 obj << /D [3125 0 R /XYZ 64.9134 727.2935 null] >> endobj 866 0 obj << /D [3125 0 R /XYZ 64.9134 333.588 null] >> endobj 870 0 obj << /D [3125 0 R /XYZ 64.9134 105.9902 null] >> endobj 3124 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3134 0 obj << /Length 2453 /Filter /FlateDecode >> stream xÚÕ[KÛ¶ÞûWx)£1ËÃ77-P´ ÐEn.2í¦íB±•‰?RÙÓ`‡)S¶Dy2œ] Æêð;ßyð<þánöíÏfn‰ULÍï>Ì• ¸˜kN‰1æwëß M,–@)-^oPÞ—ÛÅ’s^ü½ª(ëMù?ÞVÇÅŸw¿Ì7DZËç´y˜uÏ~º›~Dçpž…)"¬’óÕnö×ì÷?é|=£ó_f”h«çŸñ5%Ü9ßÍ„äD ÎÃ'ÛÙ»Ù;Ë q‹üÁiÇ`@=eLðàÕqU#þ êX|:m{‡ŸdÑ“t¾d¦¢yæþR%˜5 d…Ê·×*5°[ÀZ†:qܰðþB£ pKl5ŠqiE­:ÏëЕu]>^"DûeŒÍ±“8('†ièƒÔG1 ðª}ÿ©¼÷€©4C™VZN¦‰B>Ê´AOƒ±qYíseù—ቱ¤ÞN¸ f$ÅaÆÊ¹48ži‘ dA˜`lÀeªÓµ÷šö[¿†¹\R¾ßVíwûCÝw1o¬FÌ}U_òŒ±O„‘f«ò¹í_o‡ö£X¢Zê²=–N–I>LæK¥ÑÜÂc{6^Þ2xMæ_øe7Êç&W£}³*·Û¦@¾\+Æ‹›9ØNâ\и“ÔJöñžªzç+Éïû…exŠËùK4›ñóž&i ®ˆåÏgy SøAO³D&¤‘!RXÏvˆÀ˜a”wHóîBFK›øH`‚ù0*T!iî1S*eT>´Ä ¼ ›ÚÊô§é—Äent{à„2ªóÑ LÐF=Íós\? ÷ìû1^Çþ—f „*)óÑ LÐFùÕïFºsèNÂ=Óã}FÊO§n°$p§…¹Œ 7F7êIÆÈölŒ4ÜÎ=¼OIüéPàZcA&óU?±ÀûaT¨voKüÙОo—ø{€ó%~®°ÔÍÇ}– ¾ò4ŸÏ‚1røq”goï`ÆiþêÆ¢âŠC(ôYþ»FÎpÇ¥„Èw×K¿kìFEKóÅ-Þ¶kÿêMõyä6ÏÖËî"ìÆÛ< ág‹;[Ü¿÷.ó¸Õþo#7W§ùÍ€pwv¿/oÜ“îPuð²L£Gè§Þ–!1X,8 þd¶ó…KF‡mH{©‰²|z>”DSwàz¹on£˜»ñ×gÖ7«hqaü„hÊAº)€íÓínºÝíMWJÕø¢¬½Ù>„qdÕÒ2Léþ!øh˜¸C+aMÆ+ùXâx˜t£ÆÃd48,&$¥/¿-OQD`ûõ˜›*K$®)ã¡ ×dÐùxê$NÅ„%ø]š§«ã>N´»UɆ¶“8–3åZb.ì:eÈÞ¡Ø 33Ë ˆëFoV@¤1*£7GÞFÅÛáë¬?’ë)–4Vó¯ãÐsžÁÕ8UÄ ®p9ÃÄ„¼$kl…¼tîæy‘ÑÈÄ ä\ÂÜëòacºPÊÓ.mpa´òÆ:†qíjD–Ñ¥#‰ —£¬4¬ºÆhù•ܘQ¢òqÓŠ›`†¹\èN·SÔ¼ºn~À:ÈÒœ`ƒÄ ¼œ¢Å™1}¼×q…U ùv§‚põ—è¼5®\æÁOu³8E‹ÃÛú\¡¢ã­ÊÓhÁ, Ḻ_ÙãÎ]H4 å•Îpl$.c‘Û)Æ3Üœgö¿©³¬}N[­ï6ÛÒ÷ê¸&Ôß¶ ­êö^¦j;óBqÚõrù†½øÛÃP×J˜€§v­uƒ§ª\¶¦qеºÛÓôL|ckšø÷·¦DGr7bùzÓ coºº»”éÞ4À-&NHnK#'þ'ZÓbMrµ¦¥ÙéZÓzô$[Óº‘ùZÓb‘‰Ö´Ƒִ¨ÀìLËGqþδéÜ&]¯þDç&0‹» `tÃ)Â?‘&Ù¢#ÉÎ9:bzÒÑFfŒŽHd*:bŒ#Ñm‚‡£#Åÿ–èÀÒFÑáúT¸¿9¼µ°8žuåÃ$jƒÇ`(Lã~aÊæçI=Ï~+šöó02£ŸG"S~cñóëÖ%ªPCùpw'p£n„R,{¸›ßÿ¤C1›¼`(f-ãÜ}±¥Se¸KÓðå¡xÞò·¿Ú mü)V†Š»kù† òaÏöùãfå6'þ\=õ;˜_ 瀈Œl9 Ið9Ä §s@™1D"S9 Æ8’îÒá•à—ü…Bóû=ËÒ?PÀm¯aì«ü<áØ]ø8Rÿ1ÅÓ¤endstream endobj 3133 0 obj << /Type /Page /Contents 3134 0 R /Resources 3132 0 R /MediaBox [0 0 612 792] /Parent 3109 0 R /Annots [ 3136 0 R 3137 0 R 3138 0 R 3139 0 R ] >> endobj 3136 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [310.4376 605.2512 337.8902 617.2063] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.1) >> >> endobj 3137 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.2322 605.2512 382.1687 617.2063] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.1) >> >> endobj 3138 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [310.4376 162.4603 337.8902 174.4155] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.1) >> >> endobj 3139 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.2322 162.4603 382.1687 174.4155] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.1) >> >> endobj 3135 0 obj << /D [3133 0 R /XYZ 64.9134 727.2935 null] >> endobj 874 0 obj << /D [3133 0 R /XYZ 64.9134 521.1292 null] >> endobj 3132 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3142 0 obj << /Length 3669 /Filter /FlateDecode >> stream xÚÕ\ëoÛFÿî¿Â%4ÚîûÑÞ}¸\sEŠ"í5nÑ¢-Ú¦mád)•ä&¾¿þföA-¥%é\E‹5E.‡¿yîÌîlž_œ}ú/{îˆÓ\Ÿ_ÜœkIòÜJ¬¥ìüâúçt¾àZR=3ó£”ξýnÎí웯¿ùr¾BÌžÿòë¹³‹ ˜½|î~ûÝ‹9›}ñòŸxós+g/^ϽøêìÅÅ;§ð;|’k"VçW÷g¿ýü+=¿>£ç_Qbœ9×”gÕùý™T‚()Dº³:{}öïŽà"Q\ä$Ÿ#«œxÕŽÉ¥ð¼ÂA¸qÂ<{C¡|‡ÞsÂ#Šq xЇxaÎqàE&,O¿8é(.r’•c’h©TŸ—]»?zuZ²ŠÅ)ˆBF¹èC¼\î?åQÒ¹n@qL1%ý¬  C(ejP@3¡*ò™(Nñi4á½Çç¶-(ƒSA¨¨¨‹Dp"§ ]òǨ‚KE˜¥²"›‰âŸÒÁ¬îó¹ow§šÐŽXmtEŒ‰âF0+J•ô\n\Öc¢8Ÿâõb.B0"°õøì(Nð) BiƧ­E(ôŸŠ~›NTŽpwì·ÅÐ"¬&ÔØŠñ¯£8¬Š3mžf- 0@"(Lå ˜G„”Ú¿˜;=kïq~ Ä /PEÁšà}G5øƒ¹^+S¶*§ˆ6`S94“-ŒHn‘Ñ;•„³Ä2Í»MÉ ¢™õÀuÇá1f DÖÃzú…*úÉU³Z5—«ö,XuŠÕ›N€uf60“ì¾ÝÞ?›/W³O–ë}{ÛnÜqa”%“…°q ºÀPG5 ÉŽXH541´âõv' 2UÅ*ÇX,: â5F‚S%‡k*ú§,˜cÍe¹¨·£8—Cg8UÇJ3a?ýÁ+O‹rÔ#­ªgÃÁN£¦m¸À̆G!l8ÇXŽÄ &ËME‰âH% “¢®rÒŽ9'Ò¯jpÁ ´œcuÆNÔ>hÅÇ)!Ó o^yJ÷E»»ÚB.¸ôIá~¹Y’A (qŒÊ²JŒìAAu& ÿøô%\äOeEž£N¾;)!Ëá`õð%‚øœoѲ/Ø—?4ÛWÍ}µ÷Üߊ˗$rR¦Âo×¢žö»ù‚ø» YüyŠlÃ5|%\¬çÜÍîq]ñîØY» voÃÏ«å/”Éö:¾‡Ã 6À”…B*‚ðžb…Ôê”4dsƒ$)ÀŠ˜–kDFŠLlÃÓf‡?vËÛuÏf×ñµM ¿:‰# ñÊB2 öT÷Ó”˜tt†‹‘Žiφ¿á¡=”ñ’2³Ðá¸lÖ‡ßl7÷ኆg‰pÒÞó…Vó½ËS äý£‘Ïy2|àá¾Ã¡I0ÒºÙÍ&:Ès¢ayËx#ým+$çŸî=½«="Øzé¡çsÝuûö Us݆¯¡•‚𤔳—7 iM´plÔL¡Œ¥õ^„(„œÝn“@Iº +Ýž—f~„¡b¶ZÞ/÷ÏÒÝ6\xi{‡˜]?éyºï–@®ø1p™>¿oþã½&¦ff¬¦Baò 08[1 fGÂ`5<ÙB2¯­uõ v'0‚Ð ·4¬òCc¡‰ËÙÍt¹j’Á”‚†‚dw5R5Ì¿Às5‘$‚áZÁ$¸z).QÂsÉ**­£8ÑJP.=UZZt²½õL" OÁÿCKt1áÛ}r´!½îÂR”4Wxíç¢l"@·½L®ºß„¿´è¢\:Â…OÌU$“–¬b®’SvÒnÔPÖE€T€ ÀDp ”ÊiÛX\Xà >UQ‚Å „¸´F•8’á“Ìq÷påí«†åçt´ÀåM6Ó$«L™‘·È9N«!A—ý‰£³îhÜÑDYyá¸nŸ8H0#«h¡Å M£&-´Àƒ…Žì,48¸¼'Œfõ v'0âòžbPÎõ@þ)m´ £½2jjp?6·Ñ˜›m7!>aã¨<|ÝFŒWŸ“Ýob×n ÿøºÝ7ËU/Ø Ìi¯pÿ.ÒYúf¿Ýx–Q0W¾Rõ#1ØÅ|¶»iŒ‚I‹Å,ñms‰1®SrQj—ŒªÝ“æØ¬_¢`2YB=H+¼GV¼Lo µ^À‹Â¥ð`F¸uà˜kÆ?4o‚°~Ÿ+ ò¹ÄM¢ÓLj´ÊžG0æãùëH.rš¥=SC¬Ü=—ëݾYï—MZ¾èmÙAA"­È^ùè-»Dq‘“,lÙAÕ¯9xWlp‚#ÊÏlðÅz"Eãd·«â»Rƒ†Ê Ãê¨=ãæ§F¨=wK  ¡PŒEBžF3ÇzØ/ôùgëM´îO íag80RÍÆdÓ¹BO8ûÇ·'þ*@8Ö²‘í‰â"'YðÎÁžëcô€Q;.XžV}eר%࿊g@!±ImÜ5Œ&ÎA0úÐP¿ÅÕñšœåÒÄ2Vxÿo…0œ1SC‡=$c¨š‹Œ éà#¹”®7÷Íòtž€dÌ–Iô£½$Q\ä$K 2Ø«äleç%ëM¡ 2zL·êaM§°ZA¬´¦uÕîvÇ%…„ÙËWÃØQœÀ()¤àBÉsלè\ Hö€ŠÅ)Œ sÎEâÛíæ©Á°š/ýU¢¡f¡ö†v)ŸØÀFG-ººk¿"2‹0ûo1/hpÁüq8 LuóߌæX@ËŸôÓÈŠ“~FrlÒÏ1Lú·§a¦ÍY=ÜŠܾò£TsÜ`Íã¸+V³‚¿Š+JKÌ„*Zÿÿ~—*R¿½/m5ag’’ñõ‹Sú­y|þîny…¹Î]ßk„Íþ4ç?JŠÊ I¢š÷‹öàú¹lÇ]?¬èúÉ1×Ï1¸þŸWÕm}—êûÀ–ëÑc0‚[" ¢øv)÷f»o.—¾ùòuÁÒvûÈ’Ú—¯¾GpZÚ¬6·qYkÛ^/ýÎnêä…¿¥e=Š aTÇÁƒGLÑ(zß„ÎàUhöïøæáÐjòzy`VÍÞ7‹¬oK[m†h<*1t~„! 䀆Zaï Q\ä$KçdX`_+GWŸŠÂºl¯Ùþ³°Û½¿[Ö.ßnë– Æ$ÿ¸ü–fïŒ"¿û]åøÚj6™#ÉÛÕæ²YÝ>+íhƒ½ ²ßÁsÿøæö 0‚‘6z×7«ëxõª}ç=ÍÿøláU+ˆ^{Û›mÛ\ŸÁ—Ÿ•Z^…!HñïÍê¡­HáÏñk±ôM³Ãvþ‡~<|fQDl„‘l‘BÓG±ký¯#[1ûí¡›Nàâ±$btýÎ|ïOí×Ás°"U±`–W°ßHq‘“,Ù/'Ú@LÀœSpE€‰â@КֆõF»¼JZ~vÚØ,‰r–Uœ(N† Õˆ=ÀØ¡—:Þ-Wè³–‡m•‡¯¼iù=xö€‰ÅòæƒF1T:E8µ);ù±üQnºîïJÇ4@¶[œ¡§Dà#‚ÊîØÐB8…iæ<Úê ±6¹í(NpË¡n|·Èíei_b2)ºDñ”UÈN¥Òƒ§2™ †CQWÓŽâ§P‘@9IÙ˜^Ju#lRÙõæÐŠ©-v´ú"Ú…ùp}û/{o»p ôÓvÜíú>Æ,µñ1Y¤ð _mÕÑy¢ËÆóÿÙoãÅ'µÛftaR~ØÆˆ>ñC³iéô# P!™A½aîà°ë‘Q¨î\…-µŽâ"'Y:ŽÅ ã‡/OX¨B("mÿø¬äX{ØbJ*ö,1í7¯™Ï©©u‡Æ5œÃb}Р#˹|Yz^(>ØP&k ï¤æÜ¢}Š <‰à"£XÊc)žssÝwòE†Þ?c¡R=9æJ. ó:V-ÜÁqÜ»]¤i¸Ãù&‹U‡::ß„ã€/e ë²Øþ/%DzíÍÎU8¥ .2Šuh<ä…‡Íâ¨ÐóêÔ÷ÇUêÂr'Gùž@q ªñÑçCHN8ùÓøð~Gî‡AezâHZ'VHà”¬‘(tzÊ(zþzø:=¥Qó+DÿèG·À’‹€’Í>}—Ñÿ}ƒ¨†Z|ô:Êw§×S¾/KŒc>ÀÇøÆdÅã\_ÑŸO:¦„²×Ö˜‰:…gG3z‚c~>镵˜8ho”‰N{Ob"OöC\·ŽœÔ’QQKu< žD˜•‡æ°$½Zàêß©ã)àƒ¯0œí´;™Èüò¶¡†Ç‘Ãÿ.@`Äendstream endobj 3141 0 obj << /Type /Page /Contents 3142 0 R /Resources 3140 0 R /MediaBox [0 0 612 792] /Parent 3109 0 R /Annots [ 3144 0 R 3145 0 R ] >> endobj 3144 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [310.4376 422.4235 337.8902 434.3787] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.1) >> >> endobj 3145 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.2322 422.4235 382.1687 434.3787] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.21.1) >> >> endobj 3143 0 obj << /D [3141 0 R /XYZ 64.9134 727.2935 null] >> endobj 878 0 obj << /D [3141 0 R /XYZ 64.9134 702.3869 null] >> endobj 882 0 obj << /D [3141 0 R /XYZ 64.9134 289.3881 null] >> endobj 3140 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F11 2356 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3148 0 obj << /Length 2167 /Filter /FlateDecode >> stream xÚ­YmoÛ8þî_áöÄòý¥‹ÅÁÞÞ5÷áph>è 9V!ŽÝÚÎ)öÇß IÉ”MÙÞÖ(bQ”4œ>óÌ {u3z÷«;â4×ã›û±–Ä1!ÇFPb-eã›ùç‰!œMKF)ük1e“Õ¬ZLK!Ää©Ò“jÝT3˜^Ô›éíÍõX K”sbLý×L0œýófÄ`ŠŽÙn®‰tZïžG_GŸoéx>¢ãë%Æ™ñ+Œ)ΪñóH*A”¢YŒ>Žþ× ,[‰e*òjÈ:í8‘\ ¯ßÍc ÆH>ùúFÀ˜MÖ0xC¥ßýÊyò½´DZÓ¶­7Ûߨ¢ÿ]ÌáÂÂûérŠi,¯¿6 ôšd“ ®‹ÝáàÎ/YÏó—eîßš%\2:8Aœ•& …µ×eŽP§Y·îö1#‡sbL+&£¼%Z(ŸW˨Þj®³ênÊíäi»Æ™<¶Íò!<|EƒÐŒìÂŒÁ.Õº…,­âsôpCÚ!ÓRj‚ãžUÞ—›æÝõì¹DŶ‰¥Ð†P`Q¹º‡Eõ¼XáXDò"@àPi¥@gˆuv„1mãóGT WX®¶a0›–à¥ÚÛ° S¸¸}Z#~À4ÍÀq§T‚È™’DjÁ<ÎŽRfëTÙ¼Üy(Ö…¨º³¹‹»šA¡‚²î •1ê áÊÊaz¿º ­Cúý•ð=µÀ½ýíƒ1˜€²ä"–,ŃRŒ‚RÊJ`Å(Ÿ[4úy;¸Æå)Ð1)ˆîX $:ÐxÄšM°&8ìgha)–H*¹ä„ jaÃhàÆ_šß(õº^"K)¡P8È«·Sø}ÅŸº^æT§œ0!Ú€xØÏÌpâ@ dI4ú0xš9€9Ç!‰tî÷2@'±LEúÐ×ÌhB%&ö5¬ n×;žq4„¦fa¬¹CÖrdKa§.fm'ñ„µˆË ·gí¢Y>½ËàI`´xzŸ {by¸3Å- úrfvO˜)(lª°öئ¦†J(ŒÖI4WHÙ­•dnØf  ®.hs+ñ”Íl6Ôälže†\hÛÍ0™ªÉÝÚSEµmùlæ+¼èÉÝê rØ[˜‹™Õ"_ìeÖ]F–ëJ©ç0ñúDRmrä …’vÃdœÅ%²œh éâ‡É¢•X¦"3dV Ÿöµ£á£w]xÌW!çG¢c«-ÉU–HàÌA‘ ës9tOx€K¨ ü¸«|©ÃÛŒœ€ÙnÓ•¼ðt» × aöþ¬šøè À¹-&}u‰Âš8˜WÛ*Œ6ÛuWNoq´®£Ç1´cކ €ìrÕ‹’{UüéD4>YB_ÓED9ži3ñÝ^b I5 ¹WB/„ë¼<ÇäË¡TO¼•¿¬ëÝJÕ¶Þí²Äã(pTÉu•îõWaiÅÕä} ¸5|à¡— S6F,To}ó£N¢8ð‹²*®~<êZ‰e*Òc®§“”hÕe÷ÚŽÙ2ް(c&!óY¬¿Ç›Oè ü+2®m‰]v?¤wf ÕÐ_Ì ÄNœÁ÷PSôœ€—oæ´bçyñÅ™õÐJð)|ñs¸0”µ&ó¥Ð³á£A(”T„O"2CÚ|Ú×PAH=óÔ3W±çbh䱿”úÉÆU·ñg¨ÀÀPj­t0¢Ðû ;äœN¾õ¼ÔÙvRÁûB˜½Ó«|+ >6û­¤d.i%ñw&}«ÛÜã©Êð¹†&PN´%ôU®”ÔØ“í¤R]õà?H¥°µF”MÎþã©´•X¦"3©Ô9¡ÛÝ­ÜÕaYcmJi9Þ#ÖHqŒ¹„ÖörvvO؉VTõÍÿã'eI„,Ž…ˆ"L Ý?m à Dp2„ÈÉ£?Óö\8>öÓŽ›4BÏëÏ„†ë3@(u„Ô bHÒ”ó‹4„^`™HÌõƒPˆ ͺu­Ziî諺Xºù2vå‹Q¬Áu°fŒ¥^Ûá¸^?º`x,íz‡.ùe"¬€šr]áIË[¸²™\6P¥–,ž„í¼A}KÒ]#ï§°ûJŠÔ8öÆ®žã]ÌM½W´nÚZáaïk˜|\¡^™k_¿ÅCù¤L»àcè´õK—LhýVk¼û2Råãô5L§ òŸpÁ˜Å뇿‰¿_1χâ:ýr×Y¶'Œ=4ÝWÍ"ö6†íþÕpj®×Ü9»äš0½ÿwùœüÐ碅òù¨:Íw þi0‡µÛ-}FPWüûm†ÑÔ´•d(`&†×A AOé¸>G’Êü™žG=J,xï¾*fÅÝí!c…pûæ¨Ûï °Sîü+ª|þV|»M”i Ùÿ¢Û½endstream endobj 3147 0 obj << /Type /Page /Contents 3148 0 R /Resources 3146 0 R /MediaBox [0 0 612 792] /Parent 3150 0 R >> endobj 3149 0 obj << /D [3147 0 R /XYZ 64.9134 727.2935 null] >> endobj 3146 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3153 0 obj << /Length 703 /Filter /FlateDecode >> stream xÚåWÙjÛ@}×WèQ‚ÑdV-RâÖ-!Iœ¸Æ(¶ãl©Udâ”~|gñ2ò’*ªC E ÆG÷ž{î"¹[GB;‚‘O|;¾·}#L™PÃa;tL‰ëŸ!ß \#„œË+—„ÎÅÙÅG×£”:Ï­37¤Nì €Ó:×»—WM;ï[ï俉2'n^»ÝøÔjƶ‘8ðÚ%ñ!‹|n÷§Öw«ÓEöÀBö©…`ö£X#H£ÛS‹q 9£t¹3±®­O+ƒÞÒ¢gšlÈP 1b #Ûd„QéO×ã„;o=}õòa2ø‚8z”',NèŸÚÆzF€ ¼Ù¤%à­\C©ŽˆÂ#TÄ€˜bÕÖ€7úB–ŒaĹNÑM rW†¹-A~”U E·]"jº˜¥ýd6úZèLJóþð[1ÎÒãÅ}žg¹44ȦÉ8í­îG½$Ï“§Þ8 çÀô¥üiGjCziÄF="Ò|_P !f¢$•aÑ¥Äy•(êr8/†éƒà¢ ˜%Š"’•ŽÔsÇ f¡xœCP^ö°%Vòð0¥’}²Ê· Lnu0Šº«¸6ENÌÒ‚»òS.„½Ö+¥v/ÛžÒJ1â M&µ³Š„•u:õ¿+4«/tGÔ; €ü×åmø¨ÞK³BpѵÅX.úº§„q1Ý]¶ÝVR1œŸm«Š!N*·U±¡_2+25G·3žÙÜ÷Y¶SÜÔ‘aÔj;ÅŒ\î’üÌX5fê–åµË=š“íÎ[MìgSv&C’/kÌqP~¥ì‘Á[«å©¬ŒVlÉ¥¶kç’ôjÙ|ð[¬*‡?•Õˆõàß &—e˜Šèúkáðµ¾Þÿï žþ»¯F0"˜•¿•7àz>–•ÿO~š^$endstream endobj 3152 0 obj << /Type /Page /Contents 3153 0 R /Resources 3151 0 R /MediaBox [0 0 612 792] /Parent 3150 0 R >> endobj 3154 0 obj << /D [3152 0 R /XYZ 64.9134 727.2935 null] >> endobj 3151 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3157 0 obj << /Length 3082 /Filter /FlateDecode >> stream xÚÕ\[oÛ8~ϯð£©UÞ%îb0ÀìL‡Ý.&tÑ)J¬8|ÉJv3YìßsHŠ¢d‰Nö!eš<úÎíã!)õÇ뫷δbjv}7S"Ó”‹YÎIV„ήWŸæyÆØbI !ó÷ :¯ÛÃz±äœÏhž¡­[Rši)™ v#>âˆÌŒXú!ŒƒˆÕìƒí÷}Êt&}Á{½œJxŸOá5Ž~ƒ>œ‘ŸÌ=Tži-ÄP…‘Aož-ÙüAéoßÑbæßÍ–àN aºäà]Á•‹W K³”©ù{Xl0A›«ys,ø½² ‚ ‘Ï…>ò0wó^@ U.µ õ¦:C2ªr=“ ‚NkÎbÝij vª5ƒ`çå§îû Ô½Äe(ò<Ö)“%ŠuwFˆ6s‡(ežQ*‹„([‰—P*’1)ú ï¶åú-qÍRKp Q}]/´šW;ôÑðq4Q3â/“”~D¾Ü ­Äe(rÄ Dg,Wº»sÄm‚f¬²K‡²•x ¥H¡E%ú 3÷;¼p4õݱªw]êöÝ™ëLR*úîø©jnkðãÆ8ô¸9ìGIú\7âÂ4ál&T‘q)ô‹Mãä-C#3ŒÈx |¯ˆ÷¨‚¾Z§ƒè%^I)Ú½ }”­÷ÞuÎû­ÜžªÎya•¤Ë¸Ê=ó™* Á’@˜jྲ×_RÍAÌÉÖ´îláp¼ïÚÞ£ÃÛšBÌ'TbE±ñ<†¨€øswF´çè Ï™€a¶Ïñ0&7*°]Œ¦#rÜÄj;ec1Ì%”ILñ~@¾*$Ô¦\7çÒeš´“Ç_K@†½Ëû|$ïÓ|%yOTF™m<ï ,…(còþ|ÛÅç}Û/]Þ#y⻘÷ÊÉò~hÆñ¼a~uÞ§ƒÝå}v›÷!êÆl–Ûm;×7Çñ a’’©P@LŽB="à7Yr¸öç£kGLQ+(·DÄ)€i0£d,–b”™daç—:‰ËPäØqÍ”Êó>Ì×3¸UzvÖ+ð¦ a:—PJ\)_õPÞö·cËtÏ.¡ƒ^æóްâN‡5QÆE¡ú@‡Ç²>_ •qYðtÖô/˜“ mté¡üoUì†:Í3™óÁ~úêð¸ŸäØ„–ö{fiÎGH¶·ûÕØinüù B<¦ü8~.I5˜?Tûþ¼<3 eí¨ûp7r·<Ïr%¨òÑöèA³BÔkó(A`àÄàíÓ.¢—ëQºu3öH Ü+×}è=2cœ´'I·ç @w˜6°öíÖW€Í >É` ¤oZc®Ýþ¸Ì[½F§¿tÖMg6:ýõ"lzúKðuTÀLi`•_˜þr–i|øîÂÊ×÷KV‡§+ྲޟ¦§“@áTõï™Gëß>ȯ¬Âî¸9 »¥æë7;dÒÓá°õŠÛãml1µµ=¯´;w\zjO½ÂþX½±c‘k ‰Ig‘d¶X$f‹ŽEBcDX$ÀoÇ")Ͻ”v„pzE(Sèü"‹´ýÒ±H 1Â"!>óDÍ$‰ú&#‘¡ ÇI¤‡ñkI$ìŽD¢°[x>$17èá Ä=Q¯}if>íÓMH“”L³€bšu”ªöiJHð•B@ÄêKëjQàS„ÁuKGÀàNûõù¦Ê&メÇù ÀøÕtuGQÔ-ô½þ•l`¶ÝñÈÍ”·v®Ù|A!UûÜ’^é!dú¤Ó¿#ÀÎH‡ï•pg`yi1ÂeV,ú:á HÓ®ïË·âœÄe(rìé}• ž‹>Ê}¹«¦É#Ð:y -Ù'¢%íclÙc´ðñ”‘kGQ¬-eœ™³ÿ(yðÀùØëiOöÌŸÝÝMóA2å>ˆ)×ñA¨]„Ò|%ë |-D°Kë Æ3É õ,Bhû&$„@dŒB”_ªº‰nzŠ'ã„¡1Ç9!„ù> endobj 3159 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.9693 280.7141 409.4407 293.7652] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 3160 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [436.7826 280.7141 448.7378 293.7652] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.1) >> >> endobj 3158 0 obj << /D [3156 0 R /XYZ 64.9134 727.2935 null] >> endobj 886 0 obj << /D [3156 0 R /XYZ 64.9134 616.4938 null] >> endobj 890 0 obj << /D [3156 0 R /XYZ 64.9134 584.046 null] >> endobj 3155 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F18 1536 0 R /F21 1557 0 R /F33 2063 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3163 0 obj << /Length 3756 /Filter /FlateDecode >> stream xÚå\[sÛ6~÷¯Ð£4»Dp'Зv›î¤Ói²·;nh[v8•%G—$þ÷{@$H Á;Éìä!2}88ç;€üîòâÅj¦‘–TÎ.og’#MŸ• #¥0™]Þü>‡ ‹‚JŽå¼\c<óË‚ªùëŸ^ÿcQ0ÆæßýëÕO Åæ— ˜¿úÙ^}óËË™ÿêïæâ· Åç—/ß.þ¸üñâåå™aøGºŸ¤q-ÅìúþâýÅïàÙÍžýxQ©ËÙGøŒÓJÌî/¸`HpÆü•ÕÅÛ‹¶ñ¬  ¬È±¨f¸•E´¦F×ð³Šû+G²AZ:.ËÞ‡A–ûèïè‹*üD ©1ÂŒ5"¿®@IUZ̤fH­šøaUÝ õF1GŠJP` î<„­È4DÊ$*¹Ð}Œ¿šõ¯V°à‡åHˆœP­À4P†)Òð±‡ó{@æx½­ë¾Þ¬‡`¹âH "3ÂmE¦sMÖ„ô¿zûzQŽ0Èk­g…»7‡óP¸é‹uÃR€«Ù‰6+AiÌK…T),^¿«¶Ã¥Ð)¦‚'Ì–!Âϵð‹Pâ1@-.e9¸YXnw£îè"˜v6ºHª’2¸ßXVª…Ø·ÂP©ÀKp3â…Г¥85u6··GÓàŠµ”‰ÐS–ƒ$ÁL£ËÁ)âR20@˜`ÈÇ\Vg2Å\¤¯²zgâ*Ÿ_›àkL‘Ì«kCfûåÖFÜæ/Ð,ÕófÐÒümí¡ù¾ºÞ×BΫýòÆ^úÛ8ýe³”€þ†–Ò§?Á^ lú·qòËð9ÈÏþÉIYÌ‚q=AY,ŒÑhïfyuHäÀldÙ‘Aˆò¹ÉÀh–âË%ƒ¡ÎâdªÌ“ÁXàÝÒ~¾ÏË_™4ìîÎÓ‚c‰®‚÷‹Ó¼?›iÞŸšfçýá4ÞŸàóyÖ„E`$\HKx?=m´·«×w«åþ8 D cÚ ?7mi%¡Ècœ„RD((®ôcµ]Öq¢ 枨’úìˆ*ÄI¬ºq‰’é“H‘àrD•­È"”y\‡qar°äŸE”®<˧dÏkCG˳ž!˜´ŒÁ×Õ¢ å|sØÛ¿×Õ½g®¦Š«×@iΛ«6¹ÙÖ•aÀUÃ…»I¦Ë6í€éRï˜.œùÏãL—àWÂtL!êâu‚é8AŠp›%îöÛúzDs˜!ª5éÆžMs^bŠŒÐ–ˆ³’÷QÖ»Í8Å“ÎFqIEvÔbLQÇ Ó¬ÈLP\ˆðŠË§dOqCG).bª +½2 õ¸êµýÛð”mï*CƒL¶ÙNòW¶9ü•šUÇ_á´ü•àsð—bH*ù”:ÍÞ1Î_Âð:§Su)‘À‚Ù:ms¸‚x5Ê_~lFþ D¦ø+Dùþ°ÙGº»žoÂyŸ§ÊŽÂÒº¤ÀœJÙ‡Yí7÷¤i@JfÔÆ(ßÅkæé¶{v™+ÁÆ Ÿ MÆ'E*dœûœÄ"™T¢úÁ+‚$sÍ`?µ!DªT0ò\+i%¡È„ú{×ÇANt 3"ô§ CiŒô.w×ÕÃÒšp˜±‘¾žA.f0[©Áj¹Ì g'±EÆôÌæDu¿<¦gp•¡—8…P€ÅHÅú{z6~ÌjŽ{œW3È,©9ÕˆL©Ù›Rs6„šÓ[5‡;5GRžŒ¤ìRž#Jަ°‹’Ê|ø€ÀKÌÅ`MNÀäóìê‹fìù\²ËØ“NÙeìašô›·;&’BL¤ñQ?_O3¦ñ¼Ä 5ÑpŒA„mÀ»ª®ÿÛ!nfÛ!%Žï÷Ndðá”seði5v)dóÜ îƒÔº’V*yæ\CdØÀï’çPdbæí°‰ä9Â6yž@è“ç‘l×+\3Tß‚,ƒZéE¡ÌX¥³Ò‚H^™NáÛ¡ùrËPd"·ìLä–ù¶¹åBŸ[öާð䄞—Àœ«œjD¦Ôì‡M©9ÂNÍi„­šC„É>#+»þˆ“c)¼à±R¨0É…g’Ú?í_|ÕœDy®ôœ¾ÓÿÃô|áé;ýòÓ÷|îØ¥ïI‡lÓ÷^Ž4ž©gø™:/!3ÄåÐù;F3uJ %žè·\Œ Öë?×›ãÇ$‰ça òàȶ)ÜC¹Ün7ÛÑŽ4‡Ÿ4ž±#ˆŒa¤f”ã™ÂGG7f †‹+ßVõj,®eS²kÇ¢—`æuËýdnŽ‚o¯7G¨êëj¿t! Z­vvŒ DØXŽ ]Ó™ú¸îß4LrÝŠ9l—c-Âm €—ÄñÖò£†ˆŠc`ò\²²3“sÓ–VbŠ<^|&K$1±ÏXŒn2þ¤ZGëÓOÃýÚ$”JD#ú½gëïª;Gе;ÍqSï̳• ÑÍQW—JìßùCp.q¸m~vÒïM|¨—¾Ý¸zt·“MF€\†€„é¶üßSþøÑ¸|ð¾úg¥{\"Íÿ˜ B¤;÷¸ÞWŸF÷[Û±ùö[C‘‰ýÖÊ8ÿûˆN;WJ«² =Ó(ýP¦5”ªœa*”™ˆSLiD$‘çÆ©ŒŠvêHÍÑHA—D‡¬ø°]Þ˜Jª©@\˜rõHuð…×Ò1n•{´µØ|sÍ>°m˜|¯«&ÙÄ=ˆAý ë¤óyP+qƒ—P­J2b›©*&¡J³´ŒVŒ_r„Êg²]ˆJm£Bõ×(>_’9ƒˆc÷ƃ)]ZÊÚ­¯¢`ã¥ê†ë]^`J<†g:‚ƪBtÁ)˜n¶à”Taq¦QvC p+³§@f*8qŒ4§üìà”OÑ>8 Õ N¦nP‚ªÏNŽý^#sþ…a©©¦¶ñâi:,Aåt?–²9N–ÒžÓ†¥¸U~ua‰œ–²k–RæÚ†¥žúa)Àìa©K°±ùØ”ý(†0µ{ý—ï–Ï¡æ¶ò…úÈzRš§¸e'ïüG…œÄ"{TC–)Bo&î ýàaAmR–n"ÿÁDTw¶ƒc ŸšGEÌQ¢­ëÚxÆïo7+ã‘ãîíã2vb¶ÝÕPÁ§ªy B»=S=<4>ýÕ3Ä´@Ñ`\Í oRÄ«»<^÷ ‡ÔdCAƒ¨rÇÀ€xZÒ¿÷Ï7¾ÝFý‰xûÍ}„Ñ?Ù¼îv‚rg¤™ÇíÓB7æÂf‹"s+ÜG39 Fzêäš]†zµ/êuˆ ù¥6Úmý‚˜Õ84Hü‘ÿÆŠ"-Ani¿ÛqØn—ë#ç¤R!JCLž¶çžÞÄ´òŠP`$‡)M†BÚa⃟ò r¬0‰![à²uPm<»Þ·§"P ù«Sb»$‡ñÄ­%áŠQY"ÊõÀ _º "Š<;R BN|;E÷™ÿÕ£ÞÃBHž.(H)…Ûò/‰‰í‡ÑAFQÅŸ–;J0 âJ¨YæÜ‡fœÄôü¨[€â°?Áz½ÛWë}]Å^Ú¤É,¸åüƸ“X„"cq$¥¤6Zv¢ì¾\6…Ë$æ ÁS’ŒÓ¬9ç}²0E0K›3ˆ‚Ÿ¶ßõkµ:,OÍŸhÏ!œ\žbkѽ9žfÑí-ù,:™°èØ´EçSé×bÒŠ!.¤œ0iU"Ì}2C·9ŸÉxöïÚ79Øo¡›´£Ë£ÖþQÁá‘™¸ø³ù@R'„JÙ?{bÌ9ÁÁȳMßK,B‘Ó§ ²‚ÆÆôMÎb4 鉠¢YL“–Œ{D6?£GäLYý4Ç›ŠEéÏHY\=Ðus%<ܳÞìaî5'¦Î¨]šíjÂQwèÀgó†”>:gr³¹¯êãHAO•$PÞÙîà%¡Èˆ;0uµV}”­;<تvWC˜ÁPYåƒë%NÁ5Û‚L—}¸·`e';m.3øZ¢˜P¨äzÊi%íŽ<)13Ñk]™zl¥)‹ë¶/|ëãÕ¶!Y˜ÞĨ@³9hrò‡†³ŸòP?6£‡"S¢l=ô6òæP¦Ò«Œ`½Ä)°J#\4úÁØSàŸi ,í¥ÙŒáYÜ”2ð®'‘ˆ¿cÔMGœã‰¢×¥ŸQ?Y5­©‡m½h7oxã¤Ç­©Ò´[5wRN ãa°îBñÐ>Je‡Û%5ΈÌM4⪌Å0x²;M8EJO Õ—<ÿ1ùV`HŒlq‰°yáŒeÛÓ±d•”`~¬¤ù z$š¥à=ˆÆ]^ÐXŸ›‰¨¤fÇ 1ÎíðË…–óe»1µr»îmËû¿Ÿµ9~endstream endobj 3162 0 obj << /Type /Page /Contents 3163 0 R /Resources 3161 0 R /MediaBox [0 0 612 792] /Parent 3150 0 R /Annots [ 3165 0 R 3166 0 R ] >> endobj 3165 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [368.3051 249.8803 390.7765 261.8355] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.8.1) >> >> endobj 3166 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [418.1184 249.8803 430.0736 261.8355] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.8.1) >> >> endobj 3164 0 obj << /D [3162 0 R /XYZ 64.9134 727.2935 null] >> endobj 894 0 obj << /D [3162 0 R /XYZ 64.9134 74.3896 null] >> endobj 3161 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F14 2010 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3169 0 obj << /Length 2196 /Filter /FlateDecode >> stream xÚÝZKsÛF¾óWàV‚ɼU[åÚTâTrØuÊÊ^’` ’P‘H…„b{ýv0à€ÄÃ’F[v.$84¾é×ôלo/Vß¼¶™#Ns]\eZDŽ̌ ÄZʲ‹Ë_sC8_ŒRš¿Y³|¿»Ý]¯ !D~€á¼±²©Ö¿_ü”Ia‰rNdÔ?É„ÂáÕ÷+C4cÇ7pM¤Ó*ÛÜ­þ\ýú;Í.W4ûiE‰q&{×”gUv·’J%…#·«·«Ÿ{EXÄ"¿Å•q-Í:by¦'’KáámöûjÛœBdܪSÏz-D戂0Ò»ß';yE,ðøô)ÄûVÛ§5'œ—c¸„R+"¤fC”W·åõoTÑWxñõºP\寚jƒ ÁƒIAg"RpW†0.½”ïªÃfÎT£WÝ7õnÛ= YÁœÎ›rÂ8…V Tñ|õyÅQàˆr¨"Ü1Þ:c@aˆ L$ÃäÍ㓨u§b|Át¯–ûOyûP-ç'¥šwá}xØlÐVU…Ÿ—`:H’¯ð›æÍMµ¯Ú¡êC}hºÛeû%œüeª¼noaN¹)›öÆÃ¶†Ÿp[V€÷ø>lnF\¼’8iC•¯„+B3Ýœr{éóW!A‘ÒqP$cÄ)Åýí÷7»C…)Oæ­•ÎQAm|Ø¢Ãl8á}= ŠQK¬vá…^Ç#¨4¸YŠÀj¥Ì/nêNö=j¬º¬7˜oýHÝ*/÷Uáñ¡òFy@õ”ïn; Lþû]¹Ys“ÿw÷Çëz{MFU€ž8“èû~ïM·÷/ŸHðCÆHõ)¾eøï¦ÁlZVûYÝe0ßÔf¡%œ99)†n!P8¼…Ü=ãG’pÉCDC¡WTG'­ö­òËØ‡|ª;h» “:K•ÍîîT¹]ˆ´Êf1üçi¤¹ î 80s4ï«SŒ‚9a{œøÜäÖ ,"‰ççàDŽ V{pSÌo¨Í.¿½nS;®˜%TŒtÊEÇfR‚r»gÓO m«ÌB0XðÅÅ££¡õhÞz´yç³Spü&ŠÑ¡ Ãbt\¶#ÝÎ0 úd±0«‘c,Ä*¹ÜÝ•õö,8ž†Eê{v<‰E,r$ îÖÎQö1^™E4lg á‰Kp#JÀ9€U”Ëq›ÌÒÇí0ؤ6ü¨6ÂÀ”2À¤L«„7kˆžÝ¶óúÖï*ÍZ°üãyüõÕq[Qÿøößm –íõð,?HÁ©b¤˜:ÒåBXP(Ы:!ÑøÂ&¨pƒÄ"9RãBaǰDí§!ÄwõýDÉÀØ„ƒÄ%ˆR¥Åá¶¼«¾ác%˜qDÃT° ’PPáô‹µÓyuç™ØÖ{Øö0ZGµP­1“Q‹3¸=q†Ê¤©“XÄ"Çh“#Ühw|ó”ÉÀ¶ Â5!Ä q "·àñ !¢Í0“~_•ûºù8Å{5T&œŠÎ{ï4 dM.Àï©!NhþlÝtòŠXàH[Ea`Eý¬)Ûãל=¾^âB - tƃí^?l7ÍnßYïŸCã٠؆±PÛxâ×Ôå-–øÿõÌ Ên,ÖûíÅ,Éáwõ¡Á“ï®Úï~lÆð4Vþø ñ´|„y× p¤nø”" Ê­ÍïËëN„0¯Ÿ1Á=¹MaÓ¦#Äí’Ï—ÜZƒ†°ÒŽÙoGŽOÕêP¶“é7RBån಄뫯Æd blO{#YŒM ûLj‰¡Ú… 4ßÛ#¯ÄdJÅ¢J\BézRÐêëž÷oÊÖÈh…q mÔ?R?žB Y‡Só™²!51Z©yÖ ¼Bqö)z§Ä¡gÈ—,ãVWMP*"0¿Èž VYoM¹…Ürù ÀÖ°ë[=òì;H,b‘#¶†J‚ÃÝXÏ&Kêt*}A*œ²/nG$cnÁ©¡RvøŠOÎ}OuéN2—ž]âÑ¥ã5~¢K‡Gºt$rÎ¥c° .L¥_Hwc~åó. ¥°–û{dž~ñvg¼„da0«–cÄz™íwö3Ó5> endobj 3171 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [393.2992 404.4492 415.7706 416.4044] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 3172 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [442.1106 404.4492 454.0658 416.4044] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 3173 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [125.4919 124.3329 147.9632 136.2881] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 3174 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [175.3052 124.3329 187.2604 136.2881] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 3170 0 obj << /D [3168 0 R /XYZ 64.9134 727.2935 null] >> endobj 898 0 obj << /D [3168 0 R /XYZ 64.9134 518.4121 null] >> endobj 902 0 obj << /D [3168 0 R /XYZ 64.9134 250.2509 null] >> endobj 3167 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3177 0 obj << /Length 3478 /Filter /FlateDecode >> stream xÚÍ[YsãF~÷¯Ð[¤ÚaOßǾíl&©IåÚÄyJò@˲Í]‘èÌο_ ²I‘¦³âVmMÕˆGý  4üîöæíWváˆÓ\/nZÇ„\A‰µ”-nï]2¡W×’ê¥YŒRºüñ§·Ë¾ýáëU!„X¾ûå÷++–· X~ø><ýñ§÷+¶üòÃ?ñá?VV.oßÿ¼úýö››÷·7lAák§äšH§Õb½»ùãæ×ßéâþ†.¾¹¡Ä8³ø×”gÕbw#• J ‘žlo~¾ùWC°H‹œä;d•³^µãDr)<¯†pN®BœðϾ€E(³àÐO§ªÞô¹a‰YÝR½`ÇCü0ç8ð#–§û7 Å"'ØÉÁ1¡ˆÒÚuù9n/JM´RlF„‰âBé`-û?×å€&Êp3#ÈDq ¤ŒöÄøPm7oYT‰\‰#~N?êÍ€ÎB)SqÀiSÞ÷YåÂ-s©\ËjCq‚U.91–é)á`nV;7#ÂDq ¡BñYö áV3fN1&ŠS ­&¾Rc †2.8Y!¥öãoWN/7;t=Gpš[¼6Ï*ÅÁqQ 9œ˜¿à(½s|'LIu½%ŠENrÀŒ›F·3x#Üh8øÔù&ŠS…€kɺ‡½‘ÇïMt6‰âH †âM4‰ºõUôoçÃói}i v1#f\õ†â\²— Ü]W¦Õþ#ÀõÆ€» ‚1 KÄ©¨¾Cž‘Ášð¨fØ"Á"§8¤»’(jx;ñˆîrØqƒ&ŠS¹ë¦‹pXwdbFŒ‘àDe!(È'~•æ‚k”3‚M'Àr;³¬·â¹Þö80ׯ&'¾ørs^ŸÀ{WÞ×Õa?à¾)îÐzR1î¸#°›˜…‚½EhXèk‘9ÅKA8I¬€à§5¢ùT0ËløŠ!2#TÁ¦ÜA8¬ù[¡íŒ Å)ÂgTcRý¯à÷ûr·i5+OÀŒÐÊ<Å8¯ )åt‰»e}Ð(% …x"|“è_Ò†0+›Æ•Û-Ëjûp@½Ý…¨£‚K˜Î¿­ŸÊ:Žƒ§ûß ˜}†‹ ŽÄ×x‘0ÖOá^cSžÎøÚù¨Â6Àx‹[J¾ ”0ˆ±e½9íÂJìì'[{s‚‡’4&ßÀ¥ Ëcù¸ #C‰Bh ¾@0Õ9¼n˜²~J÷áÇÃC~îŠ# à‰®M<ù¡ÞÔudÙ#¨âïþ£íá1â>„ßS’lj~\ý„4"A¡Ä//÷Í ÷è!r¡äÈÃt9¼ "Ä«2޾÷«º ïPñË´jx},OÞÕñ^ús³%ˆY:Ú3GÖ¶‘”—"@„ ò?ÒÌ7~:Àä•ÄS ‹|G'‘§Çç]=ê Z”Ct²A„¡„QÇmÑx‰®YÀ~æ,u0‹Ã±F~PÕ„¡ËOO­²;àʃ,þÄÿq$(öåôÎjUÊ Ûõ弯k*Ó¼ŠŽ“ "‰xƒHlÔtÄÄyÔt¥Äò»Ã)>öK(TÒž|/›56`ë^Q¢= ~?Wó…¿ÈE~Ž›Ý ÷ëX¬Ÿ^ˆ`Je#œ¸œlù÷À9“JqR¸îæ ºc.¥ä¯Lî³p²Ã1iQ0¶²ÿåßÜoPÑ3U^ŽÞê„AÀÞ°“€a4zÂè›pçµÑKÆ3Jƒ˜/áT'{üf€üzøŸ¼,½¥ÔIô‘‘õaßæiýUrÏ8ª.ï¶q2=½|Xà“óÉ_ɧøË|Rø•†u{ö·,ºÿýK5uµõ˜ýE¦0µv Jh4Äæ×g`‘b‘“ÊÀ,QZðvfñ°ÿss:7^ÇŸp"¨/Ô„0ŠhöëûÃ3.áEÍf2à Š†¹fÄJmº ÿñ|hŠö¢þŦ˜Mžð®\ì³*8%šÍÇh¤7Á&,dà–¿’M‰l& Åû’Q†‘)Kþ’‡Çí¦ ’³ J)½Ðó1ÜPœ`YBÖH9 ì°ü©<í›M¬Ã³1Š´ryxA1.cª|Œ;ƒ€¨Õö3úË Íû!,¯³%Kž¨uCBdn¨ƒ»è¼ÄhÅâm©¹\Hu­Õ×Gü‰`‘S¼”¬QQªÛyÇÒ&ÐLkÝ|øŠ!Ù$–ÖE8’6IªgbCq ¤@“”=1¾2o²Dpf²:;l…ÊÛŠ6áø„ß#=ÑWìÝPçˆdξ&¯rÂéÊ|>o?‡7ýðé>À¿ þQ8A”/#çV÷b5A‚s‚éùª 9ÅñjB3j¢š0¾¶šð2À¦šÐAør5a>M5ad¬&t0†ã2Tš2Mi«LÒò‰\ˆ!GN`…3à³WUݲ#ØÞ²v”VøŽ­x™¾;ÍVÃ`g”’a„[§|1ÄfÊfaZ$›­bŽP†])Ĭ§ª¼ iz?6õ—VÙEŽè:&’\rX"«™ë²YíAe÷uU¦Šc'¼Ò°‡Y‘}ru€•(9ÉKöÈA9;`7'TÃHˆ›ÀaÆùDŠÊ$ä×EüöÿT« CŒ—µÚÀÉÊ£Ôû´ûù2ÖÓ&æ—exuw£6•ܧlºŒqä×»q3ÈX˜Í ^Kk™\êÏÇ S ÷pÚ¼Z÷Á"£8”]pP$Ç:½æc<‚Ò„XqµìG5ÃF1›€ÿ'Fû˜Vê/ K_Œ…0„:Û®¾² ®œ’1%+ …¨>Ÿ;u–]0X¦ÅïÛðúùÔV|‘Ö\àÙÓ&·ísªAö ·¾J‰ßŒU)!!Sx<KçËPlÃByq<˜¡ê 9ÅáPÊ©h'îxî^,Âp5'ú¢æ‰áºjfД(ESf=2…o‚2Jò9RÌq?–iÝuŠœù±¾&ø±\—AQëÍî²Lâˆ5,Óûë %‘b‘“pf—Q`¢‹²ñfa¹À?ŒtEù½Ã;»Í¿Û²òÕ_£!ùí²÷B_r´¬­‘¿à$g[½ùdîÙ4¤NνܒQ>¤ÁžV‚ƒwªË»Ê÷UõJ°”Úñc寿ÿ%6av òxÚÜWéÜòœT÷µÍ–h Ð )tlŠÄÁ\ÀÿŒk ˆÄÀ¿–èB^f+vhjqR©·RxJl²·r}ØŸŸ·õ`•„u6‚½¶çî òÅ[>@”ßš*pbe†}ð8œöâ±>¾ ‡¢»Ãés¸Gükòž4çßð­þœjOÃàJeÈ#ì‡5<+5BpM˜jjœØé;vØ—ñ0±…ÐÎXENº\Gf‚‡0…YÑ;Û MMÀ\oèìû þI€ñ½®uØ×ñÂoBx‘mBxíŽUlƒð‡žøÂÇ‘bï_ ‚}ܸÕ!NC-7LœÖsV™Å—-TôçC§öBI‚Ž=¿}ËÏ‚Ú㽋g2‚šò7QºÖâ‘Z¯«#Ä¥RA\jâ¾´lù¡OCK…^}Fr8Ÿ«žÃ+¯ðêÞA¡œ†*Å B'š3ºçóæ4ØŒ tsØSƹË0_ÛÕ¡}5¡ôªÔƒVS⢥ÎxÛI|ÙAƘ/ð…ɸÕ‹‡Óaׂ=,Õ¾DbƒçBØ‘ÀÝ^ëÍÒÆ”k­KßÁ£|;Š?`Ç›r{Ž*îïÂO¦Þ¡eGw;xz2ÁOP+*²Au¾M'Ыƒ z}õ=4Ú±åO›” ¨ãÄ^Høœl t>É, =J§}Ó[Õ~§ò°%58mëð ½R`.¨f”JG5/BFX¦È"æQY¾ì:¤þ‘GÓ–ÐOÒ„·ÐÛÒÍÑt#˜Pçîþ6$ "-êÜóFCñ]Xxƒìâo™ >Ÿ¢áoòG(¨Ú½Àà ׆ê„ =ÉñŠ¿.CØ`¼gþµCÔ<&J¶ŸÝYMŒãx@GÜ ©]"W4ôò:Àåˆ6ŒIÇ Ö Ò81´†ÜKÐ@׉fxèÑ@ÛÚ¦@¾c×¢ÓÑ.*\3O4ªZôÅ|†z/1¨"“<ì'¡ê³Âõ¨Z@  LÓJyw>lŸ‡þЉC"‰©;ÄtžxéÁáh˜£€Ó¨±…e²LŽ©ó\øÁ €¯µì]^4£Mr¡à£G >’5=Èøô•¸endstream endobj 3176 0 obj << /Type /Page /Contents 3177 0 R /Resources 3175 0 R /MediaBox [0 0 612 792] /Parent 3150 0 R /Annots [ 3179 0 R 3180 0 R 3181 0 R 3182 0 R 3183 0 R 3184 0 R 3185 0 R 3186 0 R 3187 0 R 3188 0 R 3189 0 R 3190 0 R 3191 0 R 3192 0 R 3193 0 R 3194 0 R 3195 0 R 3196 0 R 3197 0 R 3198 0 R 3199 0 R 3200 0 R ] >> endobj 3179 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [135.5007 570.9216 155.2046 582.8768] /Subtype /Link /A << /S /GoTo /D (subsection.7.14) >> >> endobj 3180 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [184.2832 570.9216 196.2384 582.8768] /Subtype /Link /A << /S /GoTo /D (subsection.7.14) >> >> endobj 3181 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [280.0951 547.0113 302.5664 558.9664] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 3182 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [330.7241 547.0113 342.6793 558.9664] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 3183 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [228.1903 515.1308 260.6243 527.086] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3184 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [287.9663 515.1308 304.9028 527.086] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3185 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [260.0431 495.2055 292.4771 507.1607] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.12) >> >> endobj 3186 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [319.819 495.2055 336.7556 507.1607] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.12) >> >> endobj 3187 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [125.9623 463.3251 153.415 475.2802] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3188 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [180.757 463.3251 197.6935 475.2802] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3189 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 336.1022 134.8845 349.1533] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3190 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 336.1022 179.163 349.1533] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3191 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [282.9376 101.2289 297.6602 113.184] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj 3192 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [323.7982 101.2289 335.7534 113.184] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj 3193 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 101.2289 516.6856 113.184] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.2) >> >> endobj 3194 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.2843 89.2737 104.2208 101.2289] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.23.2) >> >> endobj 3195 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [266.851 65.3634 289.3224 77.3185] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.3) >> >> endobj 3196 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [316.6643 65.3634 328.6195 77.3185] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.3) >> >> endobj 3197 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 41.453 516.6856 53.4082] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.3) >> >> endobj 3198 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 29.4979 104.0999 41.453] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.3) >> >> endobj 3199 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [270.8117 29.4979 298.2644 41.453] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3200 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [325.6063 29.4979 342.5428 41.453] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3178 0 obj << /D [3176 0 R /XYZ 64.9134 727.2935 null] >> endobj 906 0 obj << /D [3176 0 R /XYZ 64.9134 702.3869 null] >> endobj 910 0 obj << /D [3176 0 R /XYZ 64.9134 277.0418 null] >> endobj 914 0 obj << /D [3176 0 R /XYZ 64.9134 244.3173 null] >> endobj 3175 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F14 2010 0 R /F33 2063 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3203 0 obj << /Length 2509 /Filter /FlateDecode >> stream xÚí[K“Û¸¾Ï¯ÐÍRÅ„ñ~\·2›ÊRNeròúÀÑÐ3¬P¢W¢ìuU~|º‚)Š’3œÊÎn.C›Æ÷u7€žînÞýhŽ8ÍõâîÓBK☠#(±–²ÅÝÇ¥!\¬2F)]¾_±å®~Üå›U&„Xî¡}ÙäM±úx÷ÓB K”sbAý{Ll¾¹½»aÐDì(Ÿk"V‹õææ—›éâá†.~º¡Ä8³ø ¿)ÎªÅæF*A”"¶T7ÿ¸ù{'0‹³Tä8.ÎG¦'’Káü°ÊWË˪¿þ}l؇Ÿq}YA´U²äÛ`ˆ’$tí}– Â¥æmß7äÍÏTQÿ6ù´±‘ÏB©ŽŸ)÷ø¹,~9À”_VJ/sT›-·+î–MxÜÀÃzDíˆb&ê±®·ûCÕ .ט`\?1 &$ÈŒ£gI—L8I8À`‘!£Òw½Ýyáßý9€h¥ƒÑŸàÃc „9Çûñ-}€Ðømq^Vx‚¬ög|ãÖ´`„+×(Ö <´NÁX4ÀY…AƒžX‘;"¹ƒYΨ>ƒ…ò]SæU¸¯Jo2¤\húkŸï[|-›§öѯ|é¡R› 2NqÂŒ!šEœÜžê›q ¸´R/2ƈSŠûž_ŸÊ5Êl?:G@ë®ÌïW¨ÃpιcDZe©YŸ7SÈ SÅ!V3ן«r»oò-ؽ)ëíP[¡ÁÏX‘¼rFaÂòq„fÄ,yª¬kÎY_Ùb‡T(©˜%TÁç3)ÒŒI &mßšrNjRMª9MMaÀjýýÔÜ„=‡‹ÍS‘2PvŒÅKš*ô×)iQBÝí„ØÛ®ƒÇ:(Óc]ÞÔ›ódJ 1™&{$SjÝæÛçÆ Ãa4éùlE‰Y*r„CðTIÇú:za8D:šÇ¹5›…_[s†=4ÑâhY;Â,å,(b@·ÅEÈT6ÅÙÀ£(ÑR¨ó2KÕ¦úS AÙ8’wAw*c"zÁcð#TÇ´*¡ºg$cÊ:J†\yê:A ¡ÃuŠ»‰¡ç¢îpîÆ™Û›½Iæv=çcn*r‚¹=;æ¢=[æÞN²v6Û¾Ò*K‡Ü’µF¬;²–Ù+SF`®PÊL1WRÃRæ‚lˆœã´åL«‹´ÜhË\ -\£úža¾åþЄ¦mÝDòj"¨qƒxÚ¥« Ã7ÿ¡MÄsï¶ùæ|òšÚy6Òçî kÓÙ{¨7yyšµ‚Õ¬aÉL?›·Qb–Šá­°u¶¯eÇÛúd (Œ‚áS6£ªQâ%U…Õ}UaòŸ®ó,³!àE\‹P0&¥¾C»øÆY×.™jqÁµHG”n·’^wBÐ[ÎVàFQÓ¹Œà„à6ú¡‡z•Á¸‹Öc¡[òík4ŠßÙyûì?C?³¬·­×¬[×¶ /¿‚Ž%¦^ÚOFöõa·žðXÉô=‰ÇBâŒÇJAáGQlO5RA/xµëþlO%f©ÈO -1”Ú¢ÑiV2»ãj>u;‰Ô•Lñ¬¯î¾Üþë:Ç5^ÄqEZ]¯]|ã¬ã¢¦×©iÇÅáN—ßm ›ož›ž²ëÃnß>ÇÛ_‹õ!Ò2u¥g¶¥)¿ ë›`g¢ãó†°sjÜGr¦ßû¹TH¡íö¶×yU½Ù&¾È]Û+˜Ïïu ]<—¼üµßjóVÒ„ñ6Ù}l—QÒL£x6ƒÍâ>ôKxÌFN)¤…H$Y˜÷+Á!(4ù}Yµ«QÁ–ßNMMûÛìùÛ?ƒߣÅëª~lmº+<= ó¦ð0¶}9@BOvå#X”¡â,Wuþ±Ð?ˆý26”2ì¾Ü­œ^”ó]uz„q0Õj¡·¡?‡HúÓØššINŒÂ¬ÒÀ:ÄÙgûä(0K%žºd‘ÆZ'ŽöyÊÉN-Sš8côŒ F‰—4Ôð>·ÐÓpÔ†–­¥QÇ(ñ’ŽVKFÄÄìx&Õ`€Ùùs±_# J±¸«?øÖ€>UGt`@IEúàÙ z,Ëp*çó<»ôØ.6õî[¸/òõ bÇS¸û™2Ùîá-æ²xmsY/.Ý óÄÿ¼Ý‚¿VÌtçu™ oóxns¢‰µáѳ`|ø”ãmµ|Ë}ÈbÛýømÀ¹ÄM³/¨r}ØWí˜×uÇpЯÍ9¤ù=L/oýäC,ðPñ[ãåeë4?áÙÒ›Çð7üàò¨lÏ©ƒËƒöþ·[áIð †…‡>Á3A$F ê ÷ádrêQpô•ýÌÖÊ¥¹¸À`FCæ63 FÅÏø¯Wžæ¡}Šªí†SU[ãmÜšÀu¹ÊÙÁÖ¶$qnpò¥ìíEâØH\DÄe©÷Îh\†[<ØÒ Úg¨š_éà ¯yÒ/|[q1…×°ÖÙ|Æóìðàqìœ^ÐD >w #dZ¹Î2F…¥)xœü~_W‡æt…a-${ZA^]Ìp%f©È‘&e˜®›G~Y.+œf>;‰t”˜âGíëˆP{ÇG2=x–L´\ÈÛÔgrø¶*V8ˆƒusH÷Ä’I@é±úWõ)œeoë¤ú!Ó>ñN×ëbùslïŸFü&¨,…¶]yÆ×ûõ›K)l·€h ëóöË¢Ý0ô õ¶㩈Énç\ã¡@6AFk'˜ÉÎôÙxMíš(aÙotCšú47Nh9º1 ?~ÏÅlÆâ‰Ô¬sí?OOU·`ìÍÕuÅÝ+óO¤"'Š'zÊNOÌgÒWrVÄ x æ.0“âæ85¿ãÚ‰ÄsQiÒ´G&¥¶<ízÎwþšŠœ8íéøßUNÌfßWR”„ 4Ê’ÝÛ±ýFfi¸?\埱r"µôlÔÎÞ8w{ó7ÉÝ®ç|ÜMENp·§ã÷×NÌgÝ×î)31M\¥H,)ÿÖN°ç×N¤fžµÃ©;ÃÚdò.”NÄ®óUN$' 'R¯©›˜MÏ®lbZÏX5‘êyuÑÄ|SÿJŠ&@s"…¹àR%NHþÿ¢‰ßZÑD:}sMœ@⌫JAq¹h¢ë>_ÑD*r¢h¢¯è•E³©{,š˜V·+šè©{uÑÄ|@x%EWj/T;I´¡üT2‘h8WÅÄÔ ;b¦£~=õ³Yë%Ë%Ŷ¼P.a(±¬ !/]-A¢=ÿ•Ý Ôendstream endobj 3202 0 obj << /Type /Page /Contents 3203 0 R /Resources 3201 0 R /MediaBox [0 0 612 792] /Parent 3213 0 R /Annots [ 3205 0 R 3206 0 R 3207 0 R 3208 0 R 3209 0 R 3210 0 R 3211 0 R 3212 0 R ] >> endobj 3205 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [413.1792 508.7132 435.6506 522.6609] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 3206 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [462.9925 508.7132 474.9477 522.6609] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 3207 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [300.4815 318.1321 315.2041 330.0873] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj 3208 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [342.009 318.1321 353.9642 330.0873] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj 3209 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 282.2666 516.6856 294.2218] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3210 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 270.3115 104.0999 282.2666] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3211 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [413.1792 90.0873 435.6506 104.035] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 3212 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [462.9925 90.0873 474.9477 104.035] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.3) >> >> endobj 3204 0 obj << /D [3202 0 R /XYZ 64.9134 727.2935 null] >> endobj 918 0 obj << /D [3202 0 R /XYZ 64.9134 449.6528 null] >> endobj 3201 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3216 0 obj << /Length 2780 /Filter /FlateDecode >> stream xÚÕ[[sÛ¶~÷¯Ð#5­Ü‚O“K;éɤ>µÓ—4´¬ØœH¢H%ãþúîâB‚D91Ó©'3E‹ÝÅ~{ÖÏ/Ïžý¬g9ÉW³Ë3%I΄œe‚­)›]^¿O˜ÐóW’ª$›/¥49ÿ}ÎuòÛ›ß~™/„Éów¯ß̵H.0 yýÖ¾=ÿýÕœ%/_¿À—ÿ™k™\¾º˜¸üõìÕå›QøÇº%¹"2Wél¹9ûÿÙûtv}Fg¿žQ’åÙì afHàE¤9¬‚C×eݔۛgÌ iËŒÐL07òÇ-@Y: E#¤¹$šÑt¶€=R*3ãrž«dµANï@Çk|(šUY‰ƒœT©Ù‚Á;žòpÅ?iJ¸Û­®Ë%Ìn Ó’¤¹Ð *NX*#{côo7‡å9‡Íì…ûi).B’voBž™Î@Õ¼[y.·†Íj\¥ƒn2ØCtÉÓˆh0zÓŽ¦Ñq1•GUörU/w ëÒ(½)«mDÙ°PΨòrZö¬ôA—1’â„ÎjÀO*’æve–¸äÖ.öõ ŸÝ€ê£?õÆofKöh™txr‡B¸ ÙxøA&_n«Ú1&¿.]Ù·%Ru{àÞ˜eÕ ( çdBÙåæ”˼Ü$ ’LÓtœˆ$RdžÈ²ØZÃBƒ¡å¢¿åꮿ Éòä #8=¼j7‡"‰*œ„Ë÷¥ŒâgWGJ(˜®SìAä¨4Ë50ËðŒ6‰öƒÏ 5pç÷îËemP¼{x@›˜×¿¼m÷¼`CÐL{ ÛX7.!“ÖpG,$÷Îò®Ú5»âþÀ)ôåi:KS àaí‹<ÅEH2â‹TN”Y·²±´5bñ?Ü™¦„ßT³}i\† Œa’€~ôöû]qãÔ”çÆG˜·Me?«}ƒf´oÜkƒtá½B±÷P_Õ1 -˜Ì!–‹<ê™Ùð(x#`Í›5>/{ËÚwÆ[Åzíø«¶õ~m Îi 00  AbØsáx¶Áù×®Úy#Œ¥RƒYòL=Ä<‚<"b A¸8JËΣ@Ë=úÇR™eDd\ÆM "×y B€k„DcÔíqÉý.•~‹¬¦?ÏS…0.®pÇÂ:Ï‘:Õ³™ÇÉ×’¿mÑ¡:åi¦ñq/0™1LïBèr¢$m£¥±ªo‰ó¹à€‹¦¸*M¹Y6sÁ’ûC4j _Þ¾sLjÉj]Ýxˆök —À6µ@4´ ÐR(Wžã`.áÆUrq_›T³ÈÓE¦%©Ðjû±¬#éõÅtê‹~i³“E¿!¤—u´XW /%\÷Ôx, bŒ’‡÷ØýöÚ_ V•ÅݯˆÒŸÐñ9Óÿ “Á®„ýN%sŸ»¾e¥)Äd)œö®KŸ‚5¦†q±# b3#,ø4¤ÒÖ^Ðþ6ÞlXbRÊ{ûz_·Éx±u©+þ¼w‘ ÁU7>ñeѺuáí¥¯}ÍþwuïôúG±Þ¯âG ¼Šl“ñ=Æ®òOʤnñÚJ@_Ú‘€›“Š7èKÙÜ¢p™¯- ¢ÝïÚtŠÃÜ*M»¨‹4ÍW›óã<Ë‘ù@õ:ù„ûbÝG¸eZs_.V"Zmælôœ@ðVš‰\XÞ‚ºØ ÙóµžïÚÃFƒ¢|ÁÊØ•f«µl³2tµÌPš\–_™Ü$ö¡µ<ü¾DÙÚ°Ú^{cv5a]þ­®ÚĦ¨_4aÆJ$¦1É‹' 6–ê²DÂz;庋Ñ:’T² b#T¶¡ÑôŽ ðüG©lR{ƒ-Éq!b“\rÝgñ¥Ý“å®D_/t·œMÉqKrœc¡?y6àø<Ï75ÿþ0EËQx>;¯ 1’¥ù×%;§Œ“Ã$öo5ó’M}ªx¦ ¦¤ÖýìëÕAõ™s¢…>6Yö!ÅCó”äâ+d°¿w‰À“!q¨Ä8”h¼¥¹–:g)ž¢—6²çdBൄ¡ï/ÊíruÑ»ÆeæÅ›¢n>GëdÌ´~ŒI¼ÚËó“ŠP¦lr]ß×Íê Ô‡Žp³¢ûèÓgOq’Œœ>Se/8z\Ž ¥ž6àµG@6Т½lØXh½aÖ%ÐÇa6‘Èú"X(÷Al"ÆŸ À .¥™'&@;ŠÛ¼by·jOgDQͺq—'¸)Fb”öRÉ>ãÐ ä \CÆáÕã±j wÉòâü¯K7®ÒÀê²»qÁîWUØ:ÌýØØò7vžÕAq2‘0ŽšMÇPæoƒãdÌ?@²ŒdœŸÊ*9#‚æ6•Ø­À–Že•~àtYe@q$« Gd ðdˆ*1ŽÈÇâª®Öæpiå£Üf$¼MÆt€©Ñï0rým˜šŒù§‚)š¡ô©,’j$cs‡uµŒ€Jª´îF>TŽà"¤K!Ešõ9¬›bùé8ªŒÈù¤ êHŽ`ª¯Dsf»ô¡ÎÓ±¤0½7Ÿ‚·˜RöŽË0.+{*·«ÖîLÍÓ}.ÍEÄvœn†'oKt[•K{Ä:§RT䢎à8ÔÔûwõêú¢ükåPüónµÂ¯# žŠï'‚a›²ôDžš+H™M7nÖÕÕ!„۪ͮ (ŽT!‹ã$ž ÂC%F!uîz–usôŠÂ›¬– /%CîÆ1;F‡ú‹b´§¿j[#Nmæê"Â}߉|L‡€¯AñJ¹2'> endobj 3218 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [250.9396 547.0113 278.3923 558.9664] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.8) >> >> endobj 3219 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [305.7343 547.0113 317.6895 558.9664] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.8) >> >> endobj 3217 0 obj << /D [3215 0 R /XYZ 64.9134 727.2935 null] >> endobj 922 0 obj << /D [3215 0 R /XYZ 64.9134 702.3869 null] >> endobj 926 0 obj << /D [3215 0 R /XYZ 64.9134 393.0069 null] >> endobj 930 0 obj << /D [3215 0 R /XYZ 64.9134 360.2824 null] >> endobj 3214 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3222 0 obj << /Length 2071 /Filter /FlateDecode >> stream xÚÕZKÛ6¾ûWø(#Ãá›§MÓ-PlÛm/mÚ]e#Ä­­mþú)R¦lZÞ´E€X+> gæÎŒôõõìÕ·fn‰ULͯßÍ• ¸˜kN‰1æ×w¿š0¹(RZü\­PÜmV‹’sQ¬Ì«ÓÅÍ¢Äÿë­»À‹ûo(œ¬?ØV-nð"³B˸]¼½þ~öæzsŠÿ`ÿd¦ˆ°JÎoW³?g¿¿¥ó»?£D[=ÿˆÇ”pkä|5’)8g–³_f?õ€t^2A$5p åÅ;,°– ±ü™#,b¥d§±ºû(b…ÃxǪŒ -•¥„rî!¿vŽ`,ñ„ÂŒ•se9Q`÷Äõ'g·¡ÏÀ `݉4»èš`ûÚ÷Ñ1Uwõ¯…TEµÅKMu³¬»këM*Ä,ª¥ºëÎ|X0St:¤¾cˆ0ÒÌÓ%]f¥òŒ™˜ÕÄ }†v­šõ¡šœYb4$6}B`pܰ|X”=b™Bk‰¶#”Z3Ô²Þn7Û?¨¤»¶j›]ÛÜîU  gÌL§rxFeÁ( †¨?½\”’I‰¨9ê+Á*ñáÓE‚c& ‡{§`3ãHBÊŸ¡]¼ã$›•$š q†Í”bÞš¿UËÇú˜ÏS³àô|^bŒuâ›wî—­ËÜ©7NG»îÙ}ºóqºô^Õk'ÙîNÓ?±ÁefMè?j×=ýSÞ£”þ äýS-ŸEÿ©TNè?ªrOÿTã¿\À†àƒw<L ÿ— 0hAª3)@*¤–æÏO=‘æ;Çȶ;ѱ™;6Çflö'ŽˆÛÁø.d†utr˘bV¡zÃâ®í”¬´$ÿê½9Ö¿dT®Œ&’IrYиéÔó0÷ˆp2'%N™,':zŸ“RO·Ÿ꣌„¥›šH^œ‘"b™Bf2cÈ CûŒÔ¬Û¨þfœæ“xzš¹IAÃÞi{Ô@wÑzµÀr³m«›f郵]p(2xŸL„¿ï»íBôÊÅðf¹¹ïþ|ØÖw.àoXÕÖžÂ$ð †xCHBß~ âdY†‹û".cñÿ¸;f0¦1|.¥%ÜH}qõˆe yd€M$çØÊõbžͪ~™es þ™^êef­7QÜl;ݧ][¯ŽhOÑHÀéÛ#žY,£Y¯íYìíÃãÑJ¥!Rc‡>ÝJ#⹕* š¦5áJ·56œG…%¨™n©=♥rdž~²OÑ‚XbFÅ JBH/½°ªÀPE?,Ü.él |œ¥Ê•ßxŽI~šÔ¸­r…ŠQKÿs:–)b†ÒàF*˜ {±h·m|ö¸_ø Œ2(Ê¡. OŒ#šÀý5ä©€X¦™E9³;êöbã‹âÒmvXÛd( T9õpEF¬ˆÔå+Šˆe ™Yz‡itg/6¾"W5Hu°¢c˜Í “TLw)âHÜõbc :䥰DZn†´ú¦ÞÝú"Ó³m6ë !“>áÂF‰ ì˜\é%.ÛX¦ˆÇ&1–(JÕþ¹©E®»_8.V¤$ÎcÁàJñæ "–ä¹´„)1ã=;Ó²,SXÌó›ö}hJÞwÈ®²÷æóg_»G]á•_»+n<ÜøY§ Iõ[:4,»f}ÐRä®òMÃAStµÝ¸¾fsO2 +¹¬0š^Îç'‹…2ãØ“ckƒ(/ös,SÄ—)¡ øþÁ_ÚÑì Žæ£ŽF z‡Ôá=ÁëÔÕ®Þ»Z`—šqsìo×É¥ÄÕbïj<µuõvÞÕB¡…ë™´í&œÍ9þJ+àr>wxe ˜¡³ \cöRÏñ2ûBt÷òë«Ðè85»SNÙÇÞ™ì/ÇuÔ¿œ0¥¨v^Ù=Çc›TïÓÃû[èûCŽ;Þcšë!És»[̼\j,[ø„©> endobj 3223 0 obj << /D [3221 0 R /XYZ 64.9134 727.2935 null] >> endobj 934 0 obj << /D [3221 0 R /XYZ 64.9134 581.3589 null] >> endobj 938 0 obj << /D [3221 0 R /XYZ 64.9134 246.1645 null] >> endobj 942 0 obj << /D [3221 0 R /XYZ 64.9134 213.4401 null] >> endobj 3220 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3226 0 obj << /Length 1802 /Filter /FlateDecode >> stream xÚÕZ[oÛ6~÷¯Ð£ŒM,ï`À°¬Y‘bk»Ö}jû $jjÀ±3Yi×ýú’¢LY²äÔ*¢@,Käáwîç“{¶˜=ùC'Ie²ø˜HŽ a k¾,«O>qáÓI¶ÓÊÕ}Y†süÀâר›ùz=ÁÛG÷·öïå<ƒ¿aì¿)ÖE™WaÀß:AÅu_ȈMÅT»¼œÛ£,«í{Ášy¬%ç 1vˆ³†’ »Î‘ÇJ¸bU¦š$‡ÍÓL’-û ®fåt„+9@¸Z¿•pMgã„pqWàã‘ü`0\*ª~ÂUk4ékºXæPšÄf!\ÍÚéW,r€pµPE¸¦ÃÚ®¬pµ°®É0î×0Ɔpµ0®é06„kcM¸ZB¸¦K¦ïI¸,J¡•&\œp>¥¾‘p±®‡p-6ʵJ7îõS™°rR*ã´u!û¸ÚäÕ!žÐ»ùa<ïøâþö2&&±3Ìî\Ȧq/½+"Haj:óxýÀƒ3ê‘›§p¦°îÏ«¥½ãïÞÁô­ÒÍ2žÕýpk`>Wn>WiÝýP~eW4Ó^ïƒü®›$}c©Q¾Ç”÷(Ün”±Â­†ÛÖø`ÃUõøÒK8@ж³äÞ@)t|Éëo”ØÐV#o¢)Jnê¤;.¶bê°©úø‚­#Ž/qblS8Ãú6#NKáA&ЬœŽ Ä"˜@ c3à|v?ñ®ŠºõµËLoó›ÎÌß³ùY”›‘·Äpp4®ùñc›;¢ùɉ›ßOk%uÈ´¿eë½F5ygd{hÎòmˆÞ¿ò{ãx¯‚Û¹H6o™Žî—Âþ$?Ò/"¶n´ú¥&®’iÚê—ðu° j‹®ï]Á“Z”k†=í x¾Ò*ô7k”¾N 5—ŠñN É*F;¥Óu¯SçôøB i— þ͆R6|Cݰ/>z£y3mÀ²=N‚lBtl ÷M ‚#!Šú€wR7ö…%yYxt;F_öE‘€†ˆc¢Hí¢hµŠU¯Orïv'†Øõou˜áÎD$ÄI¿„÷q.ªŠ>­©µñQ1®Ì:ÿa'Âx„[wîeìÆ"©‘;§3A¡öÙ7­±Ó2¤þáÆ¶¨ÿªÌendstream endobj 3225 0 obj << /Type /Page /Contents 3226 0 R /Resources 3224 0 R /MediaBox [0 0 612 792] /Parent 3213 0 R >> endobj 3227 0 obj << /D [3225 0 R /XYZ 64.9134 727.2935 null] >> endobj 946 0 obj << /D [3225 0 R /XYZ 64.9134 605.9849 null] >> endobj 950 0 obj << /D [3225 0 R /XYZ 64.9134 375.6451 null] >> endobj 954 0 obj << /D [3225 0 R /XYZ 64.9134 155.4119 null] >> endobj 3224 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F11 2356 0 R /F21 1557 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3230 0 obj << /Length 3350 /Filter /FlateDecode >> stream xÚÕZK“ÛÆ¾ï¯à!²Žæý8¥ìXNì*;Ž-'Û,‰ÝeIlH¬d]üÛÓ=`@A9„¨T%bA£§û믻gæÓ7w¯>·3Gœæzöæa¦%qLÈ™”XKÙìÍú‡¹!\/–ŒR:ÿ|³`óm½X !ç{¸®vðdo<ÃC³Xr;_ÕG|pÜìágÔΙd‹ŸÞ|y÷úÍ›QøÇúÏqM¤Ój¶ÚÝýûèl}Gg_ÞQbœ™½ƒkJ„³j¶»“J%…Hw¶wßÝý£¸L—¹ÈOqšœæ©'’KáçùúàõÇÿ—4ÕÆjà…3M½6AUæªêï U¥³%cÄ)Å.Ë ïQ/Ãü⬵6„1ØÍšg³6ŒpëL K•õ³þ´:Ö8Û!¸$\rü6ŽÙƒƒ+üó· ¥çÕaSÝ4œØŠ;F¤ñ¹6·M°ye†Üb5sÃ)nöǶڷ›ªÝ4ûSm… X‘½ò®„ ËËŽ]v—¹Èse…vDsÀå@Ùú€:Áàù ?òÓ+R~&rŒòse¯Pþd&ý =iŧŸù8 … 'ó+ý{3~6™ÉbÔ@}@ägü4rBÆÏDŽ1~®c™ñÁ·ã„?™…?ÂgÊEy­$âpáXÈ¥_{ƒž‡ˆ€\Iy)Dš¶3>..Â=Óm2¸Î·‡{>áq¸§‘Â=9÷\Çîo}bÝÖðÁY㘟ÌÌÓc~TAõx ®ÀRè`’o‚Ï›C[Ýo¶ž£Û…`ó÷çÀ…ÀâÐAÿúõ÷®ß u7Ûæ1üù|¨×ˆÙ «ÚšIL“9‚,áˆ%âröKŒk\òXÆ5£æû~Áþz>à üŸðI刋þýcøÖ`Òø)°¨Ï¥•ÿ5Çæ ‘Ð •b³º?6Û—ö ÔLZlõLQA„0úfPw—¹ÈsP3XVÆõ_F=6çìÀ '–j;¡ŽIâ5 ”Yª“ŽàÄú/¸<ÎÌ Ýôfáô¼öŽÇ%®mÓ±à4è2Õ`;`Ç•÷àÀa (ªÍíù·“¸ÌEì"‘ÜêþË}§4qÆè uL¯é¨á} ` #ú9óUÛì"aâe¢ËS:E8årèÏêãÊ×xÞ¥©E8ù~G1WœHä¬0¯Žp`úÛ ”$.s‘1JÜéF]ô! ‚HSÓ©˜$^SQ ù݉ŽÉ‡Ÿƒ®,ú¯yïÄœë&†‰D„Ç—•góÚóíÚ/Ö.¹r¾ž(ñ¨%Bs_÷ß)¬Yø†SY!Ä•…ö 4 (Þw¾~Q»ÙÂ"Áy®Zøó çnTaå;®ƒCZ¯ÃƒwWf ÷ú”ºDÍwRꆺ4…l7o±çÀ­˜ÿH™ÜÆkÿõó©kˆrÉ®ŸzÁ¼‚€ÊMD b ¡Üš+R,5OƒVÕ>(æ]áÅݼ­6¥0S¾»ñÅ?„P[d#9@iaÀ??ùö¬øÄæÛ™ (%¸17£»¸Ì$zpôâØÌ HBi”¯´?ùêuÁ:ÞºƒðýòØ6Xg?z´@ ¹™ÿ멎v”£«ŸÂ_U¼‰C_à%x/x¿Ã‚O71¬ xÚ§º§ÁW|ÏÚÖPý)bLàäÕb¬úK²„¥óúgÌyÕ~0`Ü7ÏapB3^CŸ|ì$ÞiÎGEý@£·È‡f¿«ƒ‚”A·áo¾{jŽuÐi¸ó„ú ¸`upïeàH ~P «ˆàÐCÜŠœNâ2y¤C¥è¿<‚[T]ö¼àMø3Z/@á ´Ú$S3O.¿ŽÁ`ÞûÚDj©º¤%™ë|~ÄÌèïàWðwÝtë'HÖ%¶``ãìÖÁú â,ç ”_mQ‡¸²ò¸‰O€=‘gã°ð“DЧ’FÒ`Å‘Èé—K“Hèûï^ŸajG˜T#Â@%©õí,ÓI\æ"ϱn%¥nÔ*Ãò“­XœÆ«s«¦ ™WJ ™œ›~¶bØ'w¯ñYÈn’ÓÎL’CÕ €é©ÙÅ}áõ¦Kr«¶9¼½™'xÚƒPÞ—¦‡‚“´¿š:;â&N&`è(1¯¨Û“A’¸ÌE²µ„c?Ú  éÜM$˜á‹‡ÒŒ5±B˱ Câ“ÐdN¯Mz0 ¯š¯ÂøK{ok,Ì<öËaÅ)-7èulÕ–ŠA {pWÊ לmfìÃïfÑ¥L4ÛÍ:.TŒ¡– YYªùxý–‚ ^Z“C…@É]È\C;"$(¨ôí;Ià2—xî, ¥ ¥ºÿîh¾¡Ö™Üt`„Ç®öDÓÁ-és͆ԥ  \È«>Rަšû¾Å£grÿaªæÂ®\¦ú¥ÀuÐIMÓ<|kágÒ>ÕåÆ]Y7̹4`íÒç 63sDJu¨VmÌ´^ø¦W’h…ó…<«âƒŽðà:ð¥¿ãiÕÄlï…âèíÆŸOÙ§&{xyÚ$ìúÚ CŠšÒÖÝiDA3§dšÜßþ^D…ö™ÉŒ³@ôá·lRè¥è@pA,tØV$ œª Âm@ |$p\¬kl}ö}b:ÿ´ƒžÏu?˜ËŸó_)rÜ÷i±}ÊJP¤ ¡çßÖÛ¬CCQ]Ö{Èë±aqV‘u¡Ë¢ê„BZ¿¶H{ȰøæI‹î†¡k_Q×«Ô „| 0\‹åšƒJÌ¥¢à)…tÇX,Ú—W k… ì"®‰²Ä,,U‡z «Gô 0QÔ@©ì”î-i aLã­LÝCoÒC½k0¤ƒóÖi>‹.$xCÓ®ßîìÊe€ÄÖʼnðVõüø¬ò7l„S©¸!ÀŕՉ«-:îCðë%7gÝj€/öï¡âîT"ç‚-‡ÿmÃïª >¬MãËmXv•ò¾èFJ¬±êšíØ>x yé ?þÅE“P*ø½ýcŒ'¡ &åö¤¿ )+… ®¢²~†JÅKå*Ü=t‹4y”+ ­ÞÇõÿÐá²t8,¹¯¶øÎû0vóP,Úý:Âu¶ÒZglU etp²Ú˱´ã–•B%(õâ¾ÜMX;Ћ€^~¢Uxõ‚ Ù cgôBb‡‚†ñ®*(Oø–ã9ŠYâ–%|Û ‹Þ…;¡Åñ^G8ž'WU÷øÓË]‚uâ œçéw¥öq‡É'án‡)N¬;*KÇczªèqÓ“}ÉÈFË¿æ5.ºny³*}öú/KF×üGž1-´¯š—öÙ/Q†a~l•6,pgÕA¾WvHfë,”å}k¶xäç£%ÕÒ¥‹9Pord·Vpºq÷UslË[uQ…®#ŒÝ}~(i`{mïuÚù}šÍjÓnc·‰®<ÃÉ's$ÈyƒÜâI.¾ÖÛbN7‡ìµî•ñ[¸]ƒ<óHŠ;{†0m“Ë›çzÿJøšAÅÙ ë³aX¢€k†[r™Ck©”4ÿ§g€8…zÜ9=~Æ{nf5¿Ú r}Û±¶\©Ž5ŒO±;Ö0˜ã‡kë^™îX[.räXÛ@ÙñcmÓ™ô#9¶O¸TnÒÌ)bW¿Ò7l‹$‡;©ƒ ŸÀTA0n”.V=ÛÓœîlO.rälÏ@ÇîlO¶Mí½9z¬g: ,1a±Ž_9êɬÀ[{¥ ýŸÄD6ÉbbÔ(}LäV‰4r˜ÈDŽÅD®ã¥˜àã11™…?’ãÏL¢„½Rú0¸`\ý7¥Oì<®ý{_½'ø·ƒ³Îý†ni‘übXds˜,,FíÒ‡En˜u³‹§†±†eF¼90’Äe.²BŠ;X-»ÀhŽçÛŽ ¦OÙ„ª&‰×T5–hˆß¡ªèüOg“¡à·<¥ŠZ2IÙø1UÜCæ†òßó˜êÙÑQ€¸bÓ£üêÉÑu½jvÏͱp´O¡fVE­™à\Ÿ·Ìä•bG2Ò¨ËgFDÂðéÔK¯(híFÉ‚þÀ¨,Õà >íyÑË(NÍ Õ ë&8Ç.3‰£¢4n¥Q½¦¡€¥ÆM§`xEA­Àüš ,ýóØuNfÿ#íÿendstream endobj 3229 0 obj << /Type /Page /Contents 3230 0 R /Resources 3228 0 R /MediaBox [0 0 612 792] /Parent 3213 0 R >> endobj 3231 0 obj << /D [3229 0 R /XYZ 64.9134 727.2935 null] >> endobj 958 0 obj << /D [3229 0 R /XYZ 64.9134 557.6478 null] >> endobj 962 0 obj << /D [3229 0 R /XYZ 64.9134 524.9234 null] >> endobj 966 0 obj << /D [3229 0 R /XYZ 64.9134 107.4819 null] >> endobj 3228 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F18 1536 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3234 0 obj << /Length 2537 /Filter /FlateDecode >> stream xÚå[KsÛF¾ëWðf°bŽçýØËÖzm§œÊÆÞX9Å9@d¡–"´$¸¶ÿývÏ`À9% öFµI•‰Ç §_ßtO÷èùùÙ³WvæˆÓ\ÏίfZÇ„œA‰µ”ÍÎ//˜äó×’êÂÌŒRZ¼ýuÎmñæç7?ÎBˆâùo¯ž[Qœ/`@ñú—ðôí¯/ç¬xñúïøðos+‹ó—ïæœÿtöòüŒÍ(üÏöSrM¤Ój¶¼9û÷ÙïÐÙåýtF‰qfö®)ΪÙÍ™T‚()D|²:{wöÏžà"R\¤$Ÿ£¨œedÕŽɥ𲾨¶Ë 0]#Ë·mݬ‘_ø’'_ÒÙ‚ ø˜JÿÍeµlnn›mõ¥hŒq¢™µ%Š w(›ç?ǜ㠜 LXï¿­§¸HIÙRSÄ(.ö3#£WõêGaˆ LLÈc¤xŠGI‰N y\—7Õ{ªè+àõé|¡¸*^Ô›jÙ6›ÏÝýÛMuUênÞí®à¾`ÁP©73gˆ³L_½¼]ÁMÑlñº‚¥´E{ V¯Âõméõg ¾cÕWR‡SsE„¥¼S®/‘²)ªO ;[HN åÚ¢I‰S* ­Ý”Ë”G†ç—’XÁ\GºWÎ! ¦0ÊtoKôë6G ÃÝrz¸ö/Ê%j£­6Ýô^GÕU³©ð¼º®Â›U¹msj³sc¢Zžeø!\PѽG‹=E‚ÆS>¤ØUÒDîƒÍi z–_)cy5÷·Âáæ¤Œ`Ï‹hAD‘=Ø4#—ÑÖÜ¿îŒ!AÏŒõŽˆ×GØÐ I-T79dÃeyd³Aù-vë9wE[¯Âm°'LR¡sâ“úª{ãù©·áwL†Ëíî=e:€ÎQFG–9 ‹,‹ÞP›5§4êÀš0ç k² Å üŽZd‚¡…¾£Û¦³&àO[£‡Öìç2ØÕuÂ`s~Ó1~íi}¤YðŠd‘ƒAêCMO/7^Hüw{,*‡k,ÏwXÈ“HšYÊé^Æ£´Âwhu—ñ‹cAYYApÆlL0Œp !AYC(szl…•„ËÞ:ÞKA¯ePõæJå¦./@S‡A;F¤Uv–0ó0ñzŠãòqˆHVÃâ=°^oÛrÝÖeÌ7R^…†$Ɗ䓇èžâ"%yȬЎhî8`¶Ú ÿ}Á¤b–PËt EÏdŒg‹îÛ?©7ƒÇRãN¹³5C+wow^‡óQ7Á½Ëð¶ór\DÊ‹UÞ­›8hÝý¶°(@ÂÿdÕÉ©RÚÏ·(…$‡HF“‘öüHq‘’Ìx>çàHâ xôžq5Ú¥Ÿh̘|æ1™‚ "”%†+}šÁ8¿C+œpßA3),šc°H53‹8rBX$$Ç`‘ò˜ƒEoÑqlL¦åÇ‚ ©‰0ü4$ç#‹£}¹ë¸š¤áú‹Œ›­;߸édõ)Ú6ü^5«Uƒ½éÛ¿‚L¦ˆT° j‡ˆõš\õ®¢꫌pE8¡Ç בÏ.ÿì:)]Ÿ K;ë®_P·ÝoÎϤ"êo·­6§Jбû€­‰LäàD»^Ú{Ùm±Æ¬½´êìñqŸrçXBë{z`Æš‚Á`NG„Rê®æ¬V¡ù;Txh‰ÁJw^Ô]“~ ˆâg­Ã¸!ÌB.xßø!G‡ÁBëâˆ'ävõä™êS½m;Ó€@9c+J8¥ßÆØ"kß¡ ;0PUÖzÜjb%Õÿ?ÖÛ4ONí[‘ù'ÔЀ/›ˆ5}Kö›ˆ–º@† ¡Ù Ž÷p…µBêI…qÃu~]oó{¼ðt·=š‘`óÎí¢\l›Õ®=ÌÔ°Ao„›qتX&'ÈÔ"ÅEJ2“©A–¥!­ÛÏ|,›äàhL36=Űô[ ?Ô^ö´óòC7œI†)/ÉîBØÖÚû=àL¥äŸõè‡Íœrn¼ÖÈ).þJßÿ_yö ã†MY8LiŽ2ÞíôAÿÉt§R’#§ÌŽŸ>˜N¥¤|ÎÀò\*9îÒ¸[ÁïïÑß¼xžò?ÆuÒc UÊhí<œ®tžP©œ§ ;zÀFëæÓi÷±ÀÁ@þè˜9ËÁÙ­¸Žùíñ0F•²ÇCª•q@Ä‘""!9‰”Çc˜à㘘LÃoÕ±E Ô¸üš¤Ç»5níŸ\ìºS»ÞûÛ">7RE¹Bˆ\Æ”tpÖ>н“bL+{L¤j¹lnÊú0AµXÃ>‘â"%™A…„Rg‡\ö¨h²ta°EÙ„¬FЧXÐilàXEÓß=–Måß²ŒL2ü“–Ñ06¡¸îŽÓ~§0³½>º°ƒL¹[Iosüã.ÆuñæÏÍÝ„ïS­‘¼QÅö3ìNèFÃÆYmýusU.«#Ýæ¤—‰"â'c'»ÍåæÃî¦Z·‡MAKF†¸dz‚:E$¸H(fʰ[æÊ¸~^drÙìÖmµy–ïþé ø»¹(ææUžendstream endobj 3233 0 obj << /Type /Page /Contents 3234 0 R /Resources 3232 0 R /MediaBox [0 0 612 792] /Parent 3213 0 R /Annots [ 3236 0 R 3237 0 R ] >> endobj 3236 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.419 249.3276 454.8716 261.2827] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3237 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [482.2136 249.3276 499.1501 261.2827] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3235 0 obj << /D [3233 0 R /XYZ 64.9134 727.2935 null] >> endobj 970 0 obj << /D [3233 0 R /XYZ 64.9134 474.207 null] >> endobj 974 0 obj << /D [3233 0 R /XYZ 64.9134 106.7267 null] >> endobj 978 0 obj << /D [3233 0 R /XYZ 64.9134 74.0022 null] >> endobj 3232 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F14 2010 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3240 0 obj << /Length 2285 /Filter /FlateDecode >> stream xÚÕZYÛÈ~ׯÐ#…˜í¾ À"N6öÁÙ`'Oë} 5‰šPίOUTS¢83Nâ…1êêªê:¾*ñÃÍâý_íÒ§¹^ÞÜ-µ$Ž ¹4‚k)[ÞÜþZÂͪd”Òâï«’›¢n«nÛ¬X±Y•BÈâøíØÕ@Rìñ^ðŽÛ¢«Û; ©Öø^s'•(˜«ßn~Züx³`K ÿØiW®‰tZ-×ûÅ¿¿þF—· ºüiA‰qfù®)Ϊå~œˆ’B¤'»Å/‹ô ËıÌY~@m9ÏÔµŽX¾ÔŽÉ¥ðÊVíæq_7ݹŒLp•'ê !½ AJæ)a6ˆ÷g2öËœå¥L(xkõPÎõá±¢Šþ°…«¿f(6¬gÙúÒP¢˜â°#ØBŠp¨©ëNg‹‡óÐmM\šoM—%`IrÒ6Ôa…YjÅ 5Ô¾Þ6‰c™³± ÝàIOufš?÷—Ñ2¹³[Eœ“vÄUÇÇupTïÈ·`š#¸,:3\ÞGb¥RqyÜéra‰ã,í²õLyÑݯBLÀ>XW=[Ÿc„ºÃþϼé=J¢ë˜SGx}_‡k¯Èa¿¯ԣĻªÑÔdUJÆŠ_ðä›uâÂ3K„¡ ìΈSà*(jQHY|¢LÂ]{ìð^Œ‰ƒ/¸×Ïì¾¢2¾úŸå 1yTûxƒ*àâœ}ó©š>Ñ‹||Ø´ÕþÝȉpƒ©Š?u"’ÊÈN¤—ØöûULæËÀŬ–qÙ'ÊÕ%k°ÓBG†Ö6Â[»ŽI·BÏ<úkx^yAø»pV:‘Ž#ìCµ©CveÂû³Ï¼˜`mx¾?´uxêMvwhÓUqp ýË<¾.P¯ÁS<®º-w~uä4îw¸[ë@¯k·õ|Ç¿ÅEÞùüÃ(`¾À¸;<œ§ Ö–º¥æÌHÕsÒ'ÎZ{%ôËœå‡óª'¥"ZC‰é©Ðà»L«NÆr«°Pœ”ÃDù#Z¾õö?^+vÊZb©eÏQ2«v#jÒSÜ^åÖQà/ÓŠk…SM¬ân<ïF¸u ” D §žHp)Ä àDHÞ¸˜™ºû::IÞ~Y) Þ‡yªú¼‹žß$W¯šÐpEÀ›°unkî‘VÙe®Íë Ô³|ÂBÜAyÐÌ MÔ}{¨Ï…ÌÉhFùÚêÙs,s–—2 Î1Ѱ¡Œu ž‹)*Šw«RqUœ•Ò\õƒ*g>3£Ç3)ÁÌqí«£dèÚRIy2 ÀJ6ùy…•¶íªÏÛwÙnEùÛ¥«Ÿ!¦¿}ügpÔŸ}áÚ6áö¡­oÑí×!;×c¹…b% *o ’ó1,YH(#ì*N“Þ˜ÓKéR2c^ÓÇ2g9‚Ó$ eÜig”óKµ{¬ßó±¼j5ˆ¸ÐžþfåtQûZô°Â¤ŒwƒpŠTë!æ}ÛƒÃ='²?1œÀõ‘¨·ÆÞ†Á÷CÕöoˆïÅó𽤼Ì:¾ÏY^Ç÷=ÕÀH£uþÔnÆ>”)攘Bø‹-âOÎ>¹´“VÄ:–`ÝÇ@!r E¸ i#às‰ 9€1²½ÄÏ ‚‡i'Q¼x€Ï|o£yßë@ûØ`*Aˆ^G…¾n“CkBi©Lz€ÙFä(äX¤@ü*iqs%ÉÚTñXŒµbØ8\Q΄Ê]Áys7]ØÃMh £Þ¥WÉ6¶W?¶ðôÁÃ-l â ÂP®!O…Ç g ÖI&[P¯+OºšØ•íño€ÌiE˃ Ô3àÈ+ÄZŽËýBî« Z|ŸN6<=|îª@•PöqÛlÆê¹€ªüD=àÖ`ÙPУJôNþê¸î9–9Ë1tD‰5ÿ=YÖ¸¿‰d…¢œz¯óþ lê#+Ø»Xbc¿$ &9¦‡QüI,%Å0>¿ ‰ÅY§ð]@qaêÚØ$Áw! ~…‘yZLHtŸü ·WÁ¾ :ÇR\_…Þ¹$sAïiízè=PoÛ»ªé¶Uª… ®¡tZ‘-y5OËœå׎hN9Öcð«0{>“Î³ßÆ›¡Q1ΰ'¼™ë*^âÍÿË.4Wc¶P˜4Í)rÛLv¡=å|]hÎr¢ Èx¥ ý8ÙÎgàßK`>È/Ÿ &I¬lÏNòq\˜~ÉÙÄ9^‹æ%Úd m`\ÿÇÑ™(Õ.Nz=:‚.jÖèÈxNEÇÉ@·‡}µ½¬Ü^a½)_‰_yb8BJÍåëã¢9\à9?ŒÄÑÃ\R&~ÓRZA¬´&—rW/€“¤ 0z.éz~“Òa‹¢„ذ»¯.NX J(¨1›t‰ß´tpœ‹\¸×íáyÉn¶xù$;î@sëžÂ´”m´œhq¡Œ¹78¥¹šßrñçÊoÓ&9å·Ü&ÓÕ?QÎXý3–SÕ?—±ÏrhÑË)Ïh<Ìgß·>ã™h¸œ>ã/™–ÇÉï÷4|¯>sˆ:=ãð9g91|îÉ|‰Ú»÷ìû™=3ƒ?K37ãô9g91îÉ’YüG%ñâÿiVŠÌÈS“fEqÒ|i…÷_ˆà—üÁ§$‰¿ÿ0b§±~Èß~K!ÝiÚOQüp¾´p¾PÅ%Õѯ?øçz >}h¾žŠaxà7ªÖ8COÎG ñ3—& àŠ8ëÜ? =$âáW©âæ¬ÐadWÆo®}¨"Â7ùâ8vñk”3Ö­ÿž!Œû,š>E¹6\¤/*K„¦î;`8Ò¢ÊLã/ Ó¾Ì%Ù snÕvø®Ú…Gþ7ü¬›ì[˜¸Ì»R¤¹†Ë2­æ‚e“†êQYn©IP–çÃdÇ H– Ø#2L&'Dvœ„d³™ö-I©áÓ€Lb‹¦x9/ÇchÏÿº¹ endstream endobj 3239 0 obj << /Type /Page /Contents 3240 0 R /Resources 3238 0 R /MediaBox [0 0 612 792] /Parent 3246 0 R /Annots [ 3242 0 R 3243 0 R 3244 0 R 3245 0 R ] >> endobj 3242 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [501.9629 636.6287 516.6856 648.5839] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 3243 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 624.6736 99.1185 636.6287] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 3244 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [377.41 380.8793 404.8627 392.8345] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.1) >> >> endobj 3245 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [432.2046 380.8793 449.1412 392.8345] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.1) >> >> endobj 3241 0 obj << /D [3239 0 R /XYZ 64.9134 727.2935 null] >> endobj 982 0 obj << /D [3239 0 R /XYZ 64.9134 517.3908 null] >> endobj 986 0 obj << /D [3239 0 R /XYZ 64.9134 238.7827 null] >> endobj 3238 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R /F32 2060 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3249 0 obj << /Length 2196 /Filter /FlateDecode >> stream xÚÕZ[sÛ6~ׯÐ#5 Ü/O;›6í¤ÓI³º/mh‰¶5‘H—¢›øß÷(P‚(;¦;»“™˜&sÿÎ9ð›åìõ÷zn‘TΗ×sÉ‘!ŒÏÃHkLæËõoá|‘SɱÌÔ"'ãìÃ/ ª³Ÿúù‡EÎËÞüúî§…fÙ2‡Ù»÷ÝÛ¿¼]ì»wßÚ—ÿ^hž-ß~\ü±üqöv9#s ÿÈ%•ˆ)æ«ÝìÏÙoàùz†ç?Î0RFÍ?Ã3FÌh1ß͸`HpÆÂ›íìãì?=ÁÙvî‚äí ȱípéÎG›éÊ/w[8Fíï®Cvn?ºw£`GMîH†œÌ{/yok¥äŒªñ{[b«?Iõ?roëRâ.oåÅËÛÏuóÉ:ùdæ²We€y88ù3O0(&’—Ì”èù>âZO9<þVÏ*ú7÷{wSendstream endobj 3248 0 obj << /Type /Page /Contents 3249 0 R /Resources 3247 0 R /MediaBox [0 0 612 792] /Parent 3246 0 R /Annots [ 3251 0 R 3252 0 R 3253 0 R 3254 0 R ] >> endobj 3251 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.8338 249.5311 455.2865 261.4862] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3252 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [482.6285 249.5311 499.565 261.4862] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3253 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 141.8349 134.8845 154.886] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3254 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 141.8349 179.163 154.886] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3250 0 obj << /D [3248 0 R /XYZ 64.9134 727.2935 null] >> endobj 990 0 obj << /D [3248 0 R /XYZ 64.9134 702.3869 null] >> endobj 994 0 obj << /D [3248 0 R /XYZ 64.9134 464.7379 null] >> endobj 998 0 obj << /D [3248 0 R /XYZ 64.9134 82.7745 null] >> endobj 3247 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3257 0 obj << /Length 2266 /Filter /FlateDecode >> stream xÚÕZKsã6¾ëWèHU†ÞSªRI¶*‡ìl÷”ɶéV$Ó+Ò;ñ¿ßÆ‹%²Gœªlù`‰FÝ_£õãÍæû_ôÖ #©ÜÞV}ó¸#ŧ]É/º—®¯aHq°ßYï¨.úúøcª;û^SÃ+»?n~Ýü|³![ d\•JÄÛ»Ãæ?›ßÿÀÛû ÞþºÁHµýŸ1bF‹ía’àŒÅ'û͇Ϳe”X¦"´»¥4Ù®6HÓ­4qÊ™Ûì—öøgóøéTEBÂrz¦¡Ó«HŒ¡ "C„ôðýDÁ ¯LžëG˜}ªâ}s¬ïúöøò üCÕ·ø@¬Æ0$ÓK)Õ\Ãrð ?ý§º»;¹4öXžú¦} SÓ•ñ¶¤ lˆ—­‚)"ì,¹FBku½]¢Ä2™± †­"Ç•Ï,ó¾ê?ÿVêÑ8z"€"i‡eíÌîùλ©sã{0Oç]»yÈX‡ƒßH-ÃܸÐù"\ "Yב=Hÿ\ûÏO ýg‹¥êpbÔ>øÿ}x÷lÏìX{dù—°Ý›A ·ëæÊùe¬t¢¼3öÁL*ùU‡õ-ÜÀ8£7}åßþw'dQ94U·ûpvmôþDO ΋¸z¶@®·Ê ²LežÛ…Â[-‰™¦yªO•d78ÁÉÈkñ=H,S‘ç:2JÁ— ™êXÁ]-¶­EßíJAEq óTA4”YÏÈÖÉ ·15̽©7KȺ41 Éäf¡`”P>â½ß1Z´Ç¾ºmöÎKû#Å˹wã)öÿñÛ¿½o¾·ÎÛîÛOþëÓ±¾·žî‚aÕ×¹p¢xÙ²£U.PBêfÂL áù,€˜€ã¹BvõòÊT`&‡àÚzGf•|höu÷=Í…QÀ—Pöè!-3νOÞìŒ,j»m0ßÃukP8A,eLÇô‚QÀÈ‚bµåpòàâz³D‰e*2c86)´W cÁ÷]‚¾öM×ÏÑ%âB\C?øÈâ„“-§ƒõõ6ŠËTdÆFà3JP6®<±QŒJÁL¿„ç9"B,–À«ˆ„.—²\D# ê‘Ǹ…Ρ¦M’Û¨ÆÎ|r³â÷öH:»fo)¾q ĪöÞ«íçÀ>ŽM$Ø­~„Õ÷1Kvï,χÿÏ·ð¨Œ{ççæ‘â<±!C*ÿOÆoÑBpú°icb ÃNoȧʨ7eÎ8ñåsÛ…O•þhs¾{Ðä I$E tp%¤a…0ôV°Ü‡¨BC½0™È+ªÛ®Ý?÷ç©0' -Œ 3q=•$–©ÈLªå ‚4QãÊÑ“ÏttõV+ê%^ÒQj  6"¥:Ú3‘:=#&ä„‹?X:fÂU¬Žï|”¶˜jƒSU·Ö¥‹öyç `=%ø™sHÆ ä}©¦Ù½xDT ´=ƒPŽ0&úÕ‚…VüÚI'’­D yÒuõ)Ô²,z²ôÊ\"Ÿ–t¯aÿº!þã¿+ûgÜY±Ìþ… òuì¿òf48¾…õ,—OZ‹Ê/îq`ò“M6]_=öM“ëÖô°dÊõËTdÃI ž9QÖQúYÞ¾šA×§íƒG“5=B— Í—]b6úïYϦ[X ‹fQØe±œ׫f‰ ÅlªàWײëø‚bÕ0i‹Ø‚wW¤oŽóγ©÷l÷ä6ð€>A‰KÂóâæ>æá‘dÎ#ÙÆjÀX4ÍŒÔ6÷í¡jÎó…T¯HbÇ«Á%–©È :~dôTËí;aPWrÛœXOÕ(ñ’ª ¸<Ñlªª=ü7x5Gø0ÁP£^Jj„à X.–±n}[Js7ìGGõ²îѤÖu·uÀtÚ¾ñ¥·3‹èq_«zÉT#žS[-gº8rÅT—ˆ\Êu©ŽšíuQîN$”µìûMpi¨é[¸iœ1‡ª8,9ØUçP‚)Ô¿Òø»„ÀÇÚЕµÞzt %Û«s¯º—àÃ"!»Áy$.ߺÊ×];ù6ÓCzK;Vž"Ò8!ÂV©±sµ›½B§ñyx'öÔáô©Ák²Æ•žX¦s7zP§S¨Ž‡a“ú$‰D¬é§—è1Uøœ½m’ ãuÜÌ%a)ÁéôÊaî^€ÎÜ 0–ÃØqFŸ»Î‰ÇvâÅ3Ìù± —(]_æ Iº"%.Ñ‘DÅ!~ùc‚¨L È-ê!é¤ oõ_O{àY‰ö»ëäºãqŸ4û©mGñþg>2®ujß²›eu$œˆånQ¯gÞÜÍbëu³NÚYúb;ëXçø¾m²HC $Bòº»³‹]+°L%æ›6Ê(:.¯qóÍ, ¼Z³¡™%®lf±%“P‚4@t¤ˆò¥ŒþêŸÏ‰e*2c«¥Tf\9å´‘õÝâïh !.®ÿMÞ>F‚Tÿ5¯OxQ^™Ìý„v% –MM rRØÐ™&8fFM,‚c=ŽmƒgèÙ¯îfþÇQ¤*¾ƒmÇ~ëÂcì“Üfìólž¥/™’ääê=³A¡,"»o3ÂJÎ9’ZÉi>,“¹kP+FÆ^—¬øPgI‘€’Ðð M"¢ ÔŸ’nµDœ›ëYý °L$f\E;&‡uç:DéÇŒ¯¦à pYAм…,’*8ÛâHÉÁ)< 6 í!ƱoÇ>÷~´ÿa¼˜¶€L¾g ü©W8"F\¨NÏHòÉĉ¬ÌF`…_É ßÞY—[Jÿ^xpaendstream endobj 3256 0 obj << /Type /Page /Contents 3257 0 R /Resources 3255 0 R /MediaBox [0 0 612 792] /Parent 3246 0 R /Annots [ 3259 0 R 3260 0 R 3261 0 R 3262 0 R 3263 0 R 3264 0 R ] >> endobj 3259 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [190.2211 393.5936 217.6738 405.5487] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3260 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [245.0157 393.5936 261.9522 405.5487] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3261 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 273.5438 134.8845 286.5949] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3262 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 273.5438 179.163 286.5949] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3263 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 71.0075 128.5084 82.9627] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3264 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.8503 71.0075 172.7869 82.9627] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3258 0 obj << /D [3256 0 R /XYZ 64.9134 727.2935 null] >> endobj 1002 0 obj << /D [3256 0 R /XYZ 64.9134 537.0694 null] >> endobj 1006 0 obj << /D [3256 0 R /XYZ 64.9134 214.4834 null] >> endobj 3255 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3267 0 obj << /Length 2605 /Filter /FlateDecode >> stream xÚÕ[ßsÛ6~×_¡Gi.D€ÅïÇË5×I§“æ÷©ímѱædÉ'Éýßß$HP‚HÇ‚3õäÁ4 .wßî~‹uÞ]LÞþÛL-± Ôôâzª±Œ‹©æ”CÙôbñûŒ 5/@ ªfz^0JéìÓ¯s0³_~þåÇyÁ9Ÿ½ûíÃÏsÃg.˜}øXßýôëû9›ýðá_îæ?çFÌ.ÞžÿyñÓäýÅ„M)þcÝ'Aa•œ^ÝNþ7ùýO:]Lèô§ %ÚêéW¼¦„[#§·!9‘‚ópg5ù<ùO+N DRÃŽEùåµ,f-ôeù;G²#VJ8-«~¢¬æ2¼ÑUC e)¡œ{‘ïÜD[ cåTYN³ÆoÁ§ró±¼­˜ó^ˤӄ[ü†[¸Ü9׋YYïÀ_s©fåvY^âF¬ªC߃eDi¦±JçYÙŠ1¬&íëÛ¹\ïöåz¿,÷ËÍúP[®!†G¯¬|ª‰cªjƒ%Ìð¾ªnó¿-„³!ᵄ°b5Œ±6©ˆ”¦ÏÚà¥X[¤R¶h4³‹ÆØÎ'²¶ðJFÖ‰bm±²#¬-›K_ kÔ¥ƒ1Ö&*áy°~yÖ‘-ÓBì™aÖVfdm‘È!Öë8ÄÚ`8ågóòkIù`íŠ1ÖÆ1’Ég¦üïÁÚ";²…Ç oºðˆ3ÆÚÂÚŒ¬-9ÄÚb-ŸÄÚ²©Ú±¶aU[Ö«š`m#!œ /Â\"j¤üí§BXZÀ-¦LM*‚]Bµºæ¡àlîæèºn¹â„äfý¥~´{ܹ»ûPÖšÀEààP¸6øº™]¹çW÷îAð‹˜å­îk)îÑæÚm\œË|Q¹ñ+|>éa‚i¤ å­ÖÉ¥ž*ªÑí ÏkXıÊ(`wï_XÖã]ý=ÀP/k#>y®6£ÿ L–Íõr—p¢Hì¨iÞ>ñ‰‚f-ŠûÛó« ñß¿+Ï[ýW4Á¢‰:°7!½~i6‡qž ­6#ÆH;¼]’=Bï‰$ãÁ¹¯nO'Ù°6c’D%ÙXË6ÉÖÛ…9!zƒÿÙ:}]t®z¸[aùðQè~G"Ù<è¶½CèGÃIƒ‰1ßîåOŒq6cDQ§Ybx#1¯iŽ‘æH.6Û}y¹\y ¾Ÿs6{<Ž76á(€ ÿÞk†8ý¼ÛV Gã}b+÷iÏú¢8BSÔ`HiâVÛÄ!¥Ô\†¶¨VÕþˆÇ0¦p¤øžÖìlèE,1‘Ç„Ÿ=A÷a§ãõrU½e «{°}“°U#Â0^ê÷ëÕrýߤ ÌRÈ×1ƒ¢Ñ6ÑøñbnÕ #=yçΚ H¥E@$P¥Pƨm?á\Ì3ÉTHë¶â|JÓJ,b‘ ÷:-Ö¯vYp¯Ë Ï„¨õä€ \ÞKâµS/:5铪ݕï<½WÃñÅ¢mdð?ZE,p†€æîÁž_lE,1Ul)¡ŠñîÃC^<à? ³Ž µw[ÝnæÈxþr£Ýªa+ ù¨ùsÒƒóVKZJ„•Z¬º¥_o6~MuܤøçÉbÎ,w€ 4ºë-`ŽVÔëHBTÁRÊUëúA×)ˆ²,nÎÀ¨Ù.Zø¨[:Ëmýh¿I|Ö¥q¦Íp6³ˆcfÊÛ9Pç\XÄ"P±HþøíªÃt;„c â,¤³êÁçûênßXž¸)›_–ÍÏö˜§FP㨫ò¾fYOËÔÎvAÜ÷Ÿ 0_Tçs\+qÄqضjP½žçNZO$ZÒA+òëŸë¡t°‰Š¡ÆßCébÓu(»:G Ü6ná I¶§Û°C×á¢iVͽӶêa¹Û§‚›yEBŸ×çêD“¢±ž6w¹Û¬îSUHj%n2šÈlŽ$±ÈT @#»/‡¨8ÒQ`™2À3ê$Žéè¥Ê¾Ž.›¾…däj $סuØ[_ûõ¶ìžòÒƒhsß@ijjßäºÍ~\϶ûò¡éiSàeÒ`er½˜¦WQd¤Ú/u¢ý¬EÞaiçø’Ö†õì{‡v¢Mt¤þèˆS¬²\™¿é$X¼2läp0¯Keà›ÜÿÌ‘S¬Q®£Äa+Û.·gæÓFNí+ùFN±È‘SOÙá‘S>—¾’‘@'™PE€ õ,P¿øÀ)2![ y¥ ‚Ø-ƒã¦ve¾qS,r`ÜÔÓqhÜ4x"“ÍůdØš";|$,4G Pû¼\ÿfM±ÙBcÐ5]lľ™5µkóƒÆ"ŽA{Z>eÖ”OÕvÖ4¢j˜5õTMÌš†ã7^ɨ xS× š@1‚'|ßQ“o׫¸ú5c§Ä¸ 9~Óœ;aÃ$)î멱cîÿ °»‘þÜ!È+"‰‰¡÷½VΜäY3';6sž^Kz™S ¹\3§#ŸH¶1GfNíÚŒÉ69”lc-ÿn3§|»÷’3'àî¿<03wµËú(p™ìQW寻qÚ§Œ†~q²Ï¸ÃH«ó™ °.¬z‚qGxånl:›ê­ÀaÝ#ÒÔöt_!V;ï3a°üSût÷kL\cØýH%CyÙÝ_Õ4Ïý EtWêD¬XûGƒ]>åâ.X7²Åëþàoxv?}ë4ôào~ÐÓ¬ô]é¶É%nPFÝ_~Åhö5y[yÃöþœýÑ;Ã×ì¯î®ûvì;•ÚwžlÖ]»²\‡ﻓErœ¤µºno „S.â)±Úÿ®ÖgHendstream endobj 3266 0 obj << /Type /Page /Contents 3267 0 R /Resources 3265 0 R /MediaBox [0 0 612 792] /Parent 3246 0 R /Annots [ 3269 0 R 3270 0 R 3271 0 R 3272 0 R 3273 0 R 3274 0 R ] >> endobj 3269 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 591.0046 134.8845 604.0557] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3270 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 591.0046 179.163 604.0557] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3271 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.8338 340.7101 455.2865 352.6653] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3272 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [482.6285 340.7101 499.565 352.6653] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3273 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 233.014 134.8845 246.0651] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3274 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 233.014 179.163 246.0651] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3268 0 obj << /D [3266 0 R /XYZ 64.9134 727.2935 null] >> endobj 1010 0 obj << /D [3266 0 R /XYZ 64.9134 531.9503 null] >> endobj 1014 0 obj << /D [3266 0 R /XYZ 64.9134 173.9597 null] >> endobj 3265 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F33 2063 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3277 0 obj << /Length 3301 /Filter /FlateDecode >> stream xÚå[KsãÆ¾ëWðHU–ãyK*®¬Sñ!qÊÊÉöKBj)b BÞÕ¿O÷¼0$µ‚«âJé ôt÷ôיƷw7ß|W¬JRj®Ww÷+-IÉ„\AIQP¶ºÛý´6„›Û £”®ÿõévÃͺ9ܲõÃíF¹>¾û†¬Ÿð·XÃ3^¬ûº»‡1ÕŸÀc^J%ÖLšÛ_ywÃVþØ0+×D–Z­¶O7¿Þüô ]ínèêûJLiVŸášQjõt”ˆ’B„;û›oþ nÅMJò[”–³Œ¸ºäDr)¬¸ß5{`V2½aaŸšã±iGä{¬¯‚VÐ&Å7ÿìpžŒ0Ä(üi’RŠ”T0?r[`rÍÖ@ojTø¯ÍáaËÜ]¾ök‚Z¶äñ¢Ç­'ÑvÉÛl½o޽{±½ww¢ÂËø®åþá5¹Ýûë¿ ¯;‹›‚®ñE¤XYÁV&%)„6pÅH©·BU}ûä ¦z²Sw @êTM˜bf)y„•Çy`RÝ;,fE€åÕ2Õ_êísN* ¨¿f•¶Y¾0rŒÄwY–¥&ʨÀ±¾šãc]uÛÇ ÃŒˆ‚³†wM4ŒTí)ëÞ„„CÎr â<†×¢9­6J^f„‡Üggà&é]MÕ?þ³zÊ([*´îÚÁ{6qáÛÞ±gïi‚;èîv0®æÞÿïÃOcÖ¥àCœGÂ,6–X³D·ö¼«3âqÁ‰PL\çJ5zs7²G­6¯.Uq³­zoB÷ ¹÷Nïtú‚]5¨´Äï1XLÂY!æ6 \°t'á̆,ÏX kút#ƒ ¿'Ñ,ܤ]4KY,À¸)Õüsàî?SEƒEÀ5ËD2€ ŽŽÕÅËr]ÿúÜüv«ôºÚ×.¦ã}ø×fT¤ " ÔžÓ ×`Ì¥ÔË©&R¼ ®K"â‘r>E#JôcžZÿôK^SŒ+1‘{9a´ jÝb¥ôX@ÝŸ·[kiõÎk³ÉÁR­ÄEÔBBˆÁåõ!•Å…BóíÁxë€=pïý#bªzò¹—­kðCÛ€mÀáaêsñZÑM&®Íª(ø*:ÆÆuÇ 2"#rõáØî}LH-•LKRqNJ¼o¶”Hq“’<µÆ ÂAÔaæ9kf²$¦àbAÅK<*xÊ©óxÃù†g‚•ÃáeÀeôݸܘ ·Ý¤ó­·ŠÊEÖöÙûæÕ¬‘¼€(×}õ%šTf…b%•¯DhfGoY‘¨=4Ù;÷ûSõà­œI†Æ|5ùjxɘ‚{t‰ý{4Ý®íl š)Ad±ÃˆkV2)A2kI‡Ôw––{-Þ˜«f¤Sä­Â0ÈJµ’ÆA¥|•öƒ#©œžÓï°ˆŠ§Ž¼dàëU±J9z›‘ä)yiH¡Y9³9ûêÐ7Î'Ü ™’WÞ ÔHq“’<#D&Ú””]ˆÇ¶¼:ø)óØpR¨E±‘Ð<‡D5»ö©jNc/¡¬cƒߌ@p“PÌ@CBiYŒXŒÈhO¨ìAtÊ–ã3¼À§)ˆf…ñ‰«þ*à.f¿ pCÑr=w!­œ.Çœ›é À•”p)ä+74&©š-÷:H}öî÷~Ø­oÖTá¹ÝÿÅí¾ÀbœÛlò¶më½ÛÛ;øÆg¼ewVüÎU¬)NI5ÄV†gýD¢´·­Câ'Î.Äà'Ò•¸2— ¯,˜K&$Ïå’)³rÉÅTú;O, <Š/óKSP6C…úuÀ›Ë&ÓDqØIíB¤D¤0 0tëw>·Á“‚v8‰Ð‹ç¬"च<Ÿ|†‘ &Ÿ ÉsÉgÊc ±¨ÑÃÒmÀ3Ql15ÿAÀ$Œ&´ÜQ‘’‹Ñ\¹¼ î,N"Æé‘¢DK¶ˆÞgö£ 챆Ëþ1©=Âp*_6@(2Øv[ª1vúsMA“9Ý,9ÁþU%d¢í¥@<]À<†GKxÃqärNIžÁðˆÇ\ùþ,t" Æþß@W1bŒb籫 L—Lì^,aÏ 6SØâW¬j“ŽŠ[ÛÕÂÖ1«>f²ÂĉÞCñt-g`œ®æ…b7Ž]®ÚMIž)wG\^Sï.Çj,x/°*Þ«¹ Lž,Æc¤xGIÁª©š@x8Î|矂ÈRè±ñ_™î,gÊ¿‹Ï Ì^½fK!¼1ë3!OTŒ]ð™ ¹¹Ìvâ/°9Ο£_|%î³ ï¡Àð“ô µ ![×ÂÒ%%ôÁû£ôt×»ªçàM‡Gö5þöyŒa˨K00þv£7)ÅÌ¡&“„r°ž8lTßNú  0<1ZmîÛáðZU1¯Ët*PˆP4œˆÎL±a‚£$£gÏS ‘CÙ0£{›'cjÈ3#1eÛÁù4/üÐÃÅ@ñ\´HXŒÁÂ-¸†i?Vè)°‰&…õ—O{ƒøÛžeÛÃ’m–\Ž¤ÏøÇÅVnyÿ8vjŒq}¾–—ŠpÉýÂ-dSm×W𽝄[¿œ"dÒïñ÷þÇYÿŽŸºzׄ¯ª¯G=VlLOb„æ±ï˜àXÆ2K%±)JÊ3ÝF¸˜%ׄ%ÐU©ÙÛ=Y ¸IIf\™€rC«ab»tÿZ4Æ- _˜bÚ6Œ )]‹âÝm©×µM?q—w˜ñê°’TëQ›`V) ÏÐÊ$8¤P¥ZÀ»;‚›”bÞ»+jø0qª„õŸ’jî/§a‰#ÆÄrœGŠXçÌ@ÁOG¬gûÛD 3jAÅK¿N”4êöƒj—)#±©Ï¶ÔÅRÌÕ Ï÷öa¥,bOÿÙ³Y%U™¶@Ògpp-Æ=}þžÍôŒoå6줟¯l ´°Ÿ/lNÙŸ¾¥^Û5W-pðA”å8Ÿìêm úý ŒsŸœr–—\k0-c~æTœ•œª¨¡g”¯ñ¼Æ–d.ð¤ S`7s{¨Ý]«Î|‹<ÁUöÇ}SÓQ‰:¹HÕa¿q’®ï­â-™qÀr-¸ìêS¶ÓÝn§[nÎðjR—jœB~¨¶¸·ò±ïü…û–f&$¦-lîÛQøFæ6|¡Ò[°Ö™/T D ä{Lo¼‚zÀDÀ®îŸmÝ„ ÉKŠa$“‹D]Kp“PÌ](vy¡ã¼³!Pq£—c0¼À ”ŒA‚ž2xpgçW6ïxv*ä™oŒ`vU„Zè;/ñ¤^Äè¢HÛ» !Á ³¶›×Öq´¶¸ìk7&tãõ¨¥oäû?!C–˜%]t{’è’²¹þO^(×ÿ‰Ud¨Î â€?ý¸tò• ~ùEõë¿ùèêj?—5AÒ­±ÄZ,iJžÉ™Â¨ùLòM¥ùrü‚´Ù XrÊàm€llŠŸ±h‰ Ÿl§;%Ã×Yû¤©Ý;i<¡q‘O`óßÓÀ1i¾¢ÙvUï÷-:÷Ïž3×>mw“!@ù&ë}³uOmOÕáãqÖœ9¤5Ê®Èk¿ºÂdêÎýÿJƒ›’îù?!:q0¬4i{ÇFñà`ðµñ·ÊðVVïÊ%äÞƒ‘BÆÄ ƒ8-¡v…IZ¿OŽãpª°mV{Ϊ®Î Zr†ŒEWð𼯺K¬½ËIA¸ŠK°‹àJa51ºHé¾¹oç¾r—ˆÄ$¶Ý~¬û¹¯ÚÎPÙHŽ;åä4eûXA&Ó×Ý©_‚µäÔ¬8'èÇÞî–<½Í@0ã• ñ„”aV»õoͶ¾ô!ß»¬éÓ¢ªý°ÕT}koˆ0 Ié•’Ó‚P‰»WH9ú$¿ó9Ö°+ü|øxh?.> ªø/®£endstream endobj 3276 0 obj << /Type /Page /Contents 3277 0 R /Resources 3275 0 R /MediaBox [0 0 612 792] /Parent 3246 0 R /Annots [ 3279 0 R 3280 0 R 3281 0 R 3282 0 R 3283 0 R 3284 0 R ] >> endobj 3279 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.8338 519.4463 455.2865 531.4015] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3280 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [482.6285 519.4463 499.565 531.4015] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3281 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 314.5148 134.8845 327.5659] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3282 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 314.5148 179.163 327.5659] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3283 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [441.9322 69.8575 469.3849 81.8127] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3284 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [495.8746 69.8575 512.8112 81.8127] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3278 0 obj << /D [3276 0 R /XYZ 64.9134 727.2935 null] >> endobj 1018 0 obj << /D [3276 0 R /XYZ 64.9134 255.5692 null] >> endobj 3275 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F14 2010 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3287 0 obj << /Length 3007 /Filter /FlateDecode >> stream xÚÕ[ëÛ6ÿ¾…?Ú¸ŠáûqÀápi¶EŠ"Í5p@ÛZÛ›ίÚÚËîýõ7$E‰’)y7VrIte‰çñ›jør~õâ=1ÈH*'óÛ‰äÈÆ'Ša¤5&“ùò·)áz–QɱœªYF0ÆÓ·¿Î¨žþòó/?Î2ÆØôåû×?Ï4›Î30}ýÆß}ûëõŒL_½þÞÞüÇLóéüúÝìùOW×ó+2Áð4SR‰¸‘b²Ø\ýyõÛx²¼Â“Ÿ®0RFM>Â5FÌh1Ù\qÁàŒ…;ë«wWÿ¬ fb“|i—Jx´VeŠO¤¡ˆSÎÜZÇDY_ü@i4¶ºÂṉøïêw,ð;ÿ—øñ±E ~ü_"F°j€%tJ„rD9¼äÇG+S>-A¢w+mñW–bë¥~cUóÃÊ••ûѱèžìnœÌ$$,îm^Þ½É7 ~8AšSUC~@K¢e¡ô$#p—ЧËt¿:lŠã±ØmíRÞÆ¿ò%D ,•8'à ¼†^BWI«ý¶˜s/±=¾š:9@¢{QÀÅÑIÖÒë¬ÆÄÊÏËU "Y„]þÑM¸(kú Q…`Z‚¿«øÊ?Tš'\Z%ÕÁC„ù|u¬ócÙuTBbÒL$X·PL:ªsFï©Ä ž ó3MÃ‚YLÑùiÛ@ G+ÚLl9Üì–Åm±ÈËÊd^ÍÓ¦¢Áºµ²‰°ÖAÿ¯æ kcHi"щË)ÆYÈÎYͲIsµ°÷€Q¸ ]æeõj¾…ÛK·,6‘?'¬†‚!ž°ã–O¼_‚l"á&i«þÝj•B…¹Z_~sÜ­ïËÕ‰ú)øœØŒ"É5¿\ÿb“LÕˆÂz›™-Ÿ·Åú”Gn@U”Èc xŽG°MC±hó¸‡AO-Šq¤05•Äow¯Ok!Û[k&‡MÞè=¿qö´»¯l¬ôfÇ< =ngÔLËüaã…Fs1I‡E #$QÒ‚"xIÙÑ{{¼¶ zØ¢öäÂÄ4(è ªŒƒ„2±…d„ åßÃ@«º oôåÆÎ˜´ EÕFL„VâçH¿Šþ3rš °2=5}jâZèIÄÐeK¬)¯‘…´$¦½Èb{,ómYx3îðÊ$äešE¯\ê¦5Å,&yÊ,„ˆö`š-fWkƒ&Ñ ˜q4r‡ÉZ½û•Z4X-VæœI+ޤæ“LÚÆ¼UÈ¥Î*üËýÓÊÒáûºÂºmÉ< b¹Ûô;A´†Ñ¼`P.Ä‚)÷'žÊ "s‚£‘[ ˜Å$ÖO!²IA‹Ggýê­DÔµBCN•vŒÑ„ü­x„QE…<ãª?> ìuSoÝîÎͽõ‘àeä).&ˆi¾¶ž² Ѹ¼³YD5eÚ9ü2Ô¨ÎÑrŽX6ËÝ&/Nƒ…º\‘HŽ»G ˜Å$îÁÂØè6—µ{ìNR¦,“Y ϱª4íPµ´XµÊ–fŸÅ}¦ÈŸÁ]È-{oN¤>ãÀó¡«lí°Û¯åã mþ-ó=Lï÷ ¥ß×qå]˜»9lV‡ˆ-ý2iFN?(ÎÆécyžsú0vD§H9}Ì哜~4V§fµvú˜ÕTÌ1Ì$Çšâ9fˆaÑq¢}åDœªŸÃà4šÁ~pbŒ[ˆgpÞè'n4"‚ž'*äF= œþ–Ú€äMyn× &)^=íÅ*Á,¦˜ØOQ– aíõ&÷| ä²ÓY ÏñhŽèŽN¶>êâëô~$“àÃ4l7~—P ˆÈÚ+¬½…î‡$zµŠ4³ †¤á—»y ˜ÅOWn2JªfÞ^å…„͘Gã°¦x†EB1”8v!æñIÊáÊimÛênˆ\B._ ö; '\"Š9M~顚”!J¨h›G¾]¦èÄÑýëÄö8‚Ð/]žÇPwz6ÉÈ0|6ÉHì«ÃåùXx•çƒxÒ”ç1©òüz0rŽ'Ýo%rJ‚4ü79¹gÐbìÈ™üTÉVD5sŽñÂQÌb’éïÓ^íÉDz¼\Í‹MÏ×ëLcû-ƒ€!O˜@÷ËK®#Lð6.vî;ܾúnbª‘b; –m³†¥–ºai4“j`iؤjXjñXÃÈz"^VÐÔ5­4B&èo¡¨ë28‡Pv1”|Y„ sŽˆPÉ!„ŠWûµ"Tµ%sPüF-ܼ?ݨíG©cy¸_”v{÷ú,Ï)RT‡~›eùBöWd^£× É6ÀkñÌæÎh¶Ölî ÛZ½¹ÓⲆ.×…ÑeVCmñ‘Ù@ñ³Ú:PG¢¶%äYÈ:š%|då`5?gÃ9¼Ñ‡¬L)Äñ¹o2œHÛì76²†NÀÁ €™‘0¥ìs)Ä¥9ǰtLÅxµ~L±¿Ö¯G=® X'³{ø Nוð0L3¦˜vø ‚%²¢6™Òæ‘n.ç<_€f6¸Mµd…Æ_æBÙë²ÙuHk7îÿ¾A'µ™`»rêÝ„‹«óªñ £ªmPÝæ‘šP·lô¦‚Ú‡ªç±/âÄnw™'7gØ•›ˆûòpªFŽ˜*G$‡Rå˜Ç:Þ[+ØÃ“Šøñü¤ÈŒ»ëÙh_'pœËH ZGª–·N—. ÒöCåúÞùk‡ô–‰lß¶kjߥ¹¸÷½hÕ·øãE­žÞ“Ö÷EâN‡ò·¡I¯g(85®ûO¿/b[ï­¼$’šÐÂXÌbŠé6[L1k&nµFu€üAѺŸÐIs½ûP¿yuíº‹{p­†Úž)2ÂÉ„„–|ûziOO"c)7kp,²º±2çKNãXË–ÁPËÕ¦7s®ÇŽ—9Ç$2ç—5’yu>Doä¦õ®éÚW,Ê­ök¨ œGÚß®yÕ=hÔÞ¶CP;ך4=¨ 9šöÆÉÙ0Rœ‘FÒ$qä†QpSˆÜÞ£fŒ>•ùM±v¡¾œ12Md¬¸ÝPûã›÷ÕÑ›¶Kî«eÑ´¢¯R=ºÕÁ4ñÉ“?sà M§qÉ×0ÝýîOÀLØšGá‚@x9šŠYL2g’"HU3s·!»Ý  ^É0è2cÀçÞÞç3#§«ªô·y—^ Ө͎eç¨E¿\˜ÍW!VS¬í©šËÅfÅ„TÀ¥Ð¦ž7þ(ö—è Ãßíu“Í·e¥سíµ¾Zn¯ÖI«¬ÏÚ´æï˜k¿|E<Ô(‡äQ°¢˜Å$Sa' ǯ‡Å"šÃk°€ž.«NÙ¡¾)i‡•7Ÿ‹mÚá6»©¦S·§Tüéó ÷ ´Ùkû°î"< Û¢9éÔßoÈAó2„ìw»cE;nt7nštêƒ;’p ÷CR·ˆe8 íô#a=ñ(Y÷ø®+ŸBR›úèÊñnw¿®¶æ°˜.v¾˜ÉÝÉ8ì7óà~kÁ ËéÇn¸ÇPW=ø¡å!/\{%„¯TÉê$U³ÿ« Š­¢Q ØKðXVï7ôÊ8v†Çpp¬ÅãWzpl6þÿÇþÁÈÿendstream endobj 3286 0 obj << /Type /Page /Contents 3287 0 R /Resources 3285 0 R /MediaBox [0 0 612 792] /Parent 3246 0 R /Annots [ 3289 0 R 3290 0 R 3291 0 R 3292 0 R 3293 0 R 3294 0 R 3295 0 R 3296 0 R 3297 0 R 3298 0 R ] >> endobj 3289 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [429.1293 669.0121 461.5633 680.9672] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.10) >> >> endobj 3290 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [488.9053 669.0121 505.8418 680.9672] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.10) >> >> endobj 3291 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [421.7435 649.0868 454.1776 661.042] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.14) >> >> endobj 3292 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [481.5195 649.0868 498.456 661.042] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.14) >> >> endobj 3293 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.8338 629.1615 455.2865 641.1167] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3294 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [482.6285 629.1615 499.565 641.1167] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3295 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 340.1454 134.8845 353.1965] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3296 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 340.1454 179.163 353.1965] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3297 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.8338 101.7436 455.2865 113.6988] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3298 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [482.6285 101.7436 499.565 113.6988] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3288 0 obj << /D [3286 0 R /XYZ 64.9134 727.2935 null] >> endobj 1022 0 obj << /D [3286 0 R /XYZ 64.9134 281.085 null] >> endobj 3285 0 obj << /Font << /F8 1548 0 R /F14 2010 0 R /F22 1606 0 R /F21 1557 0 R /F33 2063 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3301 0 obj << /Length 2695 /Filter /FlateDecode >> stream xÚå[Ksã6¾ûWè¹6„ñ~œR•ÙGª6;[ã¶’h‰¶U%‰EíŒÿý6‚% rl8eWj¦@°Ñèî¯@Ï÷×WÓ3ƒŒ¤rv};“ÂøL1Œ´Ædv½üy®U—ÁÏÿýpYP5¯š²]m/Éüî²`ŒÏw»¶‚)óýÍæðŽêy[5·0§\Ø7ðš.Øœpsùëõ¯/È Ã?2¬J%âFŠÙbsñÛÅÏ¿âÙòÏ~¸ÀH5ûÏ1£Åls”àŒ…‘õÅç‹ÿôñ¬  ¬É1)7ÝÓ"ÆÐ1-7rD‹d„ §iùï0ÐêÃcREØh! F˜1Gò{«J#-(‚¨6b& C’í´p]mÖ%ˆ„7VˆH&a ;oµó:)½*þw)ä¼lVå ¨b]Šž‚¸zsô²Mö$Ïì’…4lo¼ÍÕv×–ÛvVo¹e D³è“'¨—!Â4VnÑS,b’ÇÌ2i¤”Œ™­š¦n™D#,`Å|"µJ8‘vßæ³j’Óª•BRyƪ5>•ƒ8ÁÑÌ› XÄ$'ÌŸR0&CÆ<:óÿ l%úíe!¨è Ãä42² ù‘‘ÕßKæ 2¤†ùT<Ïß;ë¦ÞºÝÈÍÞb$€ â‚˜—k‹”¥y(Û{ø¹-7‰ m#8’¢ÀËfYoÊÕqt iE"9¾b“œ€cc£Ç\öð¨wG¬*Û‡ü*«â9V•†ø¥Ù˜U«üßàl†ð^,(2ŠžKØ„DBhŸ|™þØ¡ém„¶hÙЛ”Ë€ÞX0éÐff mÉTh‹yœ mA¡iddò« ƒ Pˆ¿ƒ»ðÅId‰Öƒè)`pŽ(ˆÍÉ6kÝ“Öæ­aÛšòο‚‚ÒŽ¶]D­ÀH0ú>×sW].ööE »f?¿¯bü¬÷Ž"(/΀-Sõm÷Í}˜qhË JÎ:лtBlÉ À(ÊàϹb wl»„p„)faÑQM2ÖD2®`Šgÿ““ãºîÄý &¢ìžW»‰ÍK Ð,áÔ.”àtpÀv¶EÑÎiqáj:·ŠB;à|²»NQ„±)€ ^,²·—™päÅmø„óVì·åÎ<6§s07c‘Lå 1—½óêÏ}A[ÖƒÒ¥ÖÍU_!þ¯¶‹öwk!ä^ j[!¨kM:Ji÷˜M{ùÝãØ§1lÔ i2qH&ŒDœuGŸ.!÷®›¶¼Y­]o/™?£ÄžM1 ¨µßýýÇŸ< ùÐTK›8÷éêOƤ˜¦ Ã9²Ó ›ÐfÁ4:%é>ÔMÙ<¹1aV 8Á8Ôhš¿Ü“ŠELr™IðaDªaeËèíj]]±‰Í€J†A—–8益K#çKƒ=ðê¤7åÓ(¨K ÂìŒ\@Ò‚b5ãš#޵|¹\Å"&9!Ž‘Ú +¹X\ÿ%JPâçïìs€â¡è VP 5Úú‡j·pù¥^8~;`æÀzO‹‹P(38™qà^(–!v‹ˆâTD„­ ÊúucY}X5Õ¢­›ÇÐ5Õíêë‰ìnŒZ¢ÀZ4ðY4•·¬ @êA™±Éºý³·¹üê7Ÿl¸ˆ°|Ý=oû¢à€ub#~X"Q>€§$ã/÷õ®#l«8»r÷ CC¦LŽòÍvݹS|›7 ãN=N¹¨W©O/Å+/¿c5CR‹°pIëù?o§ö¬‘RBR>&)˜J&!B²æž}žøàŽ<`{v”÷ÑÁºÀ¡¡8ľo¾™P8ÌÑ…èè©ù¤´´2[–ÍÒZ ¸L´vIlÓ­¼\5Á8üžÜè—ÕzíuC!z€ô Ý0 fäuTìRZ»TªBwh*Cç©iˆÁW-ðtœbØ5áQœž¢@SX’>SœÖ1De ÉSÀƒËéÃÿ½zàyðÉ­737ý„zVvšÔ†pγ·1 6vm×°‹:Uíz6.ìAš[1¼ñ «èªª\¶m ï»á¿z?9lí”È ¢ŒŒK‰[«·íâ„eƦìq`˦=Ô“æ0¹u!se”éàŒ}¨ü\Mº…é•^Þìêõ¾=ª¿ ØÓî¶¼ÜaŠELrÂcCaE!ãV.ûˆG¶Ò”eä1P<Ç£-ê!§óhýø€ÑàŸoC¹j³¹í­«_7åP •2õ¾ hw¸ãÿæ fX~íJÞI'*4d2\<É‹2á².“'ê2Nb1Ê'TÛ/N>ZØÔ¾2?qåË8däLš7zìÇ Fš¨ô±cö@O³'‰Ÿ™—]ÔÆ,å:ÅKo³¯Gû|ÚEmÿI¾‹Ú˜dâ¢vÄlú¢6ŸHßÉi¶=¥TŸ±jJ‘&\>Ϫ_ý4;ÚC6¤Ä2  –Kò,»Ÿ™ï,;&™8Ëñ8u–Ýë3yZ“MÆï¤a‰´âü 0\îIžéíÿ€kÚxÙ°‘ÍŽH6gniÃÔ|¤ÅÄùhÌâS®h³ñÙßЦù ´1ŸÑýì‘›ÍÞIH£†ûÓ´$t©ÑŠK–.mGùû3Ó´˜Ÿ\Lï±Çàh“OKÓúOò¥i1ÉDš6b6¦åé{±iM‘=O›´¶'žL>ä_=G‹6 )™ ˆ…’ÌÑú™ùr´˜d"Gñ8Ùoà”™tóÙüN4 nCÛ§4$CümöàÄȉ¤PLôRIÂMˈ†@/…žµg÷Ýäì;黡Ì.ix²ï†J‚0—ì-öÝм}7ö(BòuÞĽ7ý´?C÷Mlu¹ºoŽ,ù„ÿŠmùL÷M?7_q“LT—#.ßZ÷M>í½f÷å’X{OvßPÂÀÇÁ¬7×}ÃÏvß,ˉ8fžA &C a XÄ$'<“K1,ìr„Õ¦ºšn! "óöÝLJü˜½"¢7*ƒg÷‹˜â´gXÑaá  åïõæ¡Þo—§šk cïf_Ú\3%míˆò™P^ñ—»@¯ˆKDC±Ž±ìWåñ¸¼^ê›Q Ó_äû¾Û 3ôÍLܤŒ á.ПLáAVö—¤ÇÚfëöÏ¢îÌÑ_¯º¦ ÿ¦­š}20Ç_ÿ—®&ü—Vû&ô.¸Yû¦ïåðó=¥KžºIe¼€å&OµWD4Á§Žãtz›´O€l¥‰µÛ$üÙµÍ>ø)›v훩J2ÄÖÁû´Voÿ­Ê¦K°ÿUo‡ãÅ2tGý£Þ÷VÛ}[u?>W µå´º)ؼT=³¶-C±ùÇra[rî½ v{{tV8aÅz·ßÉ'YØ–Í ½B'¤†>î´pŠœð0 i()úí^É N9@›²§ó¡+ä®O’Q@âÿK‹Îendstream endobj 3300 0 obj << /Type /Page /Contents 3301 0 R /Resources 3299 0 R /MediaBox [0 0 612 792] /Parent 3309 0 R /Annots [ 3303 0 R 3304 0 R 3305 0 R 3306 0 R 3307 0 R 3308 0 R ] >> endobj 3303 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 615.712 134.8845 628.7631] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3304 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 615.712 179.163 628.7631] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3305 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [433.0642 377.3102 460.5169 389.2654] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3306 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [487.8588 377.3102 504.7954 389.2654] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.26.1) >> >> endobj 3307 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 232.5531 134.8845 245.6042] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3308 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 232.5531 179.163 245.6042] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3302 0 obj << /D [3300 0 R /XYZ 64.9134 727.2935 null] >> endobj 1026 0 obj << /D [3300 0 R /XYZ 64.9134 556.6516 null] >> endobj 1030 0 obj << /D [3300 0 R /XYZ 64.9134 173.4927 null] >> endobj 3299 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F33 2063 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3312 0 obj << /Length 2283 /Filter /FlateDecode >> stream xÚåZK“ÛF¾ëWèHU…í~?N©x=›u*e{ãÉ^’h‰žQ­DM$NlÿûÝlªIQ”qRÞÚr•GÑh4ø€ÒóÛÙ³Ú¹#Ns=¿}?×’8&äÜJ¬¥l~»ú%cŠ.r®%Õ™YäŒRš½ùiÁmöúÇ×ß/r!Döüç—?.¬ÈnsÈ^¾ Ÿ¾ùéfÁ²/ÿ~·°2»½y»øíö‡ÙÍíŒÍ)ücÇ-¹&Òi5_ng¿Ï~ùÎW3:ÿaF‰qfþ^S"œUóíL*A”"~²™½ý»U˜Gyªò9•³³jljäRø³ÞìÁâýÿ?œ³TG¨'–zk‚©Ì9Þ5ÕÒ5•Îs.@)ÑÖQÐÕ¼Œ+ÎZ+E˜–ÇCóäІn‚3€_©²þÐ/Šº¼]oKã_`è«âØlt ü§EÌ·Ãë_)“±” ‡Àà2¼YõöáèP#÷ TÁµe÷exVâ+•íÞŸ>õNö¯|ÔK,P÷ë†ãªò£7sùˆËÖÕ]£ãþ(±|܇¾Ä À¹¬Ñˆ˜â *3†mT,¨Á})Ò8ëf¿Ò`³epŒï"I´0ÙK´Ý$çAüЈ.€dü.ëCxRì‘?†Ú¬²!lä½1Ú¹ /ÎÏD`Ò£›J¿ ˜%ðA-‘LzÓŠ;/4ÃåàeûÇâhz­Ø&rûxɹTå*lð!Î6› øÎ“¥fÕûGÿă6&EÚ…üŽÏŠM'‚V ï& žY¡WL¸â¢o–ÅÁË}3iŒR2ŽÆ!ŽbÊQXÅùõ¤¿Õ˜§* ÈQB%&]ë#rš B.¬hS=Ë-´e›)&\õc¬e!ÆðBPjý~À7–qròrJ¢K:aÜͧP胋k¨«æzva[9øšU ß­¬šçø’pݰÀhî7›  õy<4ùO=  ­ê¶ðitòU²n°Ì§Ãç …Æq‘“ð¡xÞÏoÙâŠsý•–Å/ÌD„âDkÛ(¨Š¿i²/ªíYªžá:·©Â¸_ZªÐqÌ(Uh%§£ ©ÊªÐ±±¥ èц'ô‹÷ ]˜ÎÉO2) .D©/°.®8›ŒC,ØcØ¡Äð™mªy ÖÝC,eÌ—¿¢=<:| xS¢™­$T9–ußrp ÃÅ*c÷ÒæÏæÑk¨–=°èÂ-t¹2VÝá´ùƯÀ_ H¹›€‹4 óTãpûM9 m+ÖÆïÀ˜rÂðØöU4¯×‡3ƒEcù:³…çPFIÞmá0—Bo±lº'غ'»'O!‹»æº˜CivIJ$ê® äËú‘|ËÒX†@­ËíÙÑl+;Ýh6U92šíXÙ¢Y¸.À‡ðÛ†ÔÄúáÁ®üø°)Ö•ÏH|ïûÿàxí=Nì½Çtã 9Ùí=åL­¤Ö™ñ™ wœpæì_œ©Èéf*ª7SÑg*( )µ†Løå3Æ¢ÆÀoéôOW¨ÜkÚ N•+àÆ\ôÆ+B'ÜÉœïwôp¿c iÁiEØÒË….¥«6R2?s)Ãs¯äcV`ËS{Žy×ÌXœ€º«eï— Ëk×í÷ñGçajçæ×•þ(‡‰x¡ÃžÃ鯔‹˜uá÷&»Ì±Ïˆ á„û»Iar‚©8á¨SÚ6*ñÊ(!l䦣ƒG…#d0±nˆ ž@Í`›3™oÿG¨ -©e‚úXaÄÿTÿðéx`¢p„F©¯Œò§`IÀMEû1|æ«ï$Š/PÀ(:ásŽÇ~›“˜øµñ¿Éîí)韄¸•Ì]`З~‰û¡þ@žâ…endstream endobj 3311 0 obj << /Type /Page /Contents 3312 0 R /Resources 3310 0 R /MediaBox [0 0 612 792] /Parent 3309 0 R /Annots [ 3314 0 R 3315 0 R 3316 0 R 3317 0 R 3318 0 R 3319 0 R ] >> endobj 3314 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [296.3725 418.391 323.8252 430.3462] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.1) >> >> endobj 3315 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [352.6102 418.391 369.5468 430.3462] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.1) >> >> endobj 3316 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 311.4919 134.8845 324.543] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3317 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 311.4919 179.163 324.543] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3318 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 41.3441 134.8845 54.3952] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3319 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 41.3441 179.163 54.3952] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3313 0 obj << /D [3311 0 R /XYZ 64.9134 727.2935 null] >> endobj 1034 0 obj << /D [3311 0 R /XYZ 64.9134 546.8222 null] >> endobj 1038 0 obj << /D [3311 0 R /XYZ 64.9134 252.764 null] >> endobj 3310 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3322 0 obj << /Length 1870 /Filter /FlateDecode >> stream xÚÕYKsÛ6¾ëWèjÂx8eš6i›É´éÄ=%902ms*‰ŽD%ñ¿ï.)A²Ó‡Nf,>ÀÅbñ}ßî"/Ï'g¯ÍÔ«¹žž_Nµ$– 9-%ÆP6=¿ø„³œQJ³¿nf9/²j]¶õjƲ«Y.„Ì6·›¶‚!ÙïEï¸ÉÚj} cÊ9¾×ÜJ%2¦ØìÓù›É«ó ›RøÇv³rM¤Õj:_N¾L>|¢Ó‹ ¾™PRØbú ®)Ö¨ér–ˆ’BÄ'‹ÉûÉßÁ³:«–8É 8·ÎmóqX-Õzš3xÆ•8˜ö#UôEÙ6K¸Hz´ðkµ™c¤jçC[7«ÄÜ. Ø4=ëÏÃû0y«˜0D2ÆC´¶¾ú#eræ Å²ÔŠ!P€¶"|ÓŸäp­3:îÆ·º½ÀJ‘µ0Á5‚WÊ '-—Íð²¹ ƒ®gá™Ì–€w >©Waœóð{5ßv¬ñ_…×R[x±^Wž9è†LBZgÄ*ÅïhãÈéé¶qA9Òþ^¼B+ëÿnŽM¸â☎|ž™ÌZ>d¦{2d&kaÇmùï(Ø —qõÇH.­%ܼ#ùøn¬š*ÊAÓ„¹4¡à‹ÇB½ñ"·ŠPC€½[û°—þí×™Ò€kÜõòó¢òïVM´ ¿À®ý sˈ4ÊLûËx\d:“w„Þ£™Ʀ½½©ö@yÉhoä=  Ж§wó¾ÉCç€'ˆ>Vk€,JFôù,W\e)é¯A1C¨‡Æ 4‚I ߎA¡`S”z€wñ‹£Ñ‚P!x2 F~HK‰!çGÀ6!á#îܘ÷ƒÞ@Òǧm¤ÅÒve)%ÉxIšo½Æ¸QåêˆúºãÐbë,¢Ò¡ò¡Üºo®ãˆ}<¢(äqOÜæ@ÏòPÀ@PÖGƒ8Ìû1̘$”ƒàvÃ: Š^<ªÏžÈCÊSe¸®S9OÃ&*`=5EÎ'…’|_äÓÆíåÜåq7 1œ€ìyH3åUØ.&DŠf;=ë¡îq@îéÙ>’Óz6À²«NdW@œMÁz¸´¢E‹yßdBÑ ­SjÍÐËNÑüv>ô¾`ÄM멉9Ä ^õýfQÖ+ÇH¼w…{±Ûö!aÛ¥1,X:-’£íÞø"ÙW6N´Å.Ò,QàK p×Ò§Žw3ÁAŸÚòsíÊåº –ݲ¤+”äxÁ^_`îì 6×ÕbqÆ6…&šñ8îyÂR0cj`ˆeˆ¦PÍ=Šþ±¥ˆßMˆÌø©—ì_Ô«¶ºªÖÃû¹bøÑÉQÇ[=GÖêÈ¡¿4Ë%d½àþû¶l·›#½§P©¨á¾™þŠšñ/ÖöJXyâϪúæ/\:¾ŽéxáC/púU¹¬.üíç·€ww’‘Ð ]Àöщ÷¿¿zûöÐOP% *2÷²vÜX- ¡—‰4ævµ«£“.ÎDFé›–Ð#ºåjF~¶Bd””Xkâ*.±&‘ÂvÝXìº|®“’bÕò }¿3»4:–~[¡R ?îúî'‰£”P^U›í¢õϱÒÙ_}÷©y‹%¸ Rh•ýq™Ü@‰Rݺg„°Óñ³Æ)—7-îá­ïG¤WÆ´Úõp]>JP–¬tñ³g œCQTt“c¥…G3^tgH%#ýXvh8ëÇlü¯ßѸO¡ê‚ ¬hÏŽøñ¼ñf×3Áƒ éŠ[÷uëñ’M·ÿ}çºd/úp‹ƒn\mëê$0Ôv5²S:â2”QÚ¸ažpLb„ÚëíçåbQ]ÜÝÏŸ8[Ùœ´ÆÒ«Ò{-nõ×U‡:ü,†A-C%ã#žÅðÏbd~ {uò(ÆÕ ¸K'Å b…{[Yzv„óH&˜çª£MHÏŸ±ÎTN.±kAk¬W›¶\µu‹†A'¢¡â3¢÷É£;‘h1ï›Lt"pÍ™g»î!ÙŒÐ'9;y@³‚Ÿ}ž@4‡û#ˆ~òƒÅþF#ÁɰìXÐËɃÅnäx‹}“'>¦÷2iš£Åøÿ ªˆ(îTz ù]‡êæhu,IA¹}ZÔ>Ë;3Ð,gHo1£1äd€v éGè4CâÈÒ3yŠ!};†„<ÙѦ92Z”ŸòH LbMÿð.u¤d´B”ÿà‰ÒÃþ«ÙÕþ$†õ?³ >gendstream endobj 3321 0 obj << /Type /Page /Contents 3322 0 R /Resources 3320 0 R /MediaBox [0 0 612 792] /Parent 3309 0 R /Annots [ 3324 0 R 3325 0 R ] >> endobj 3324 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 462.0369 134.8845 475.088] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3325 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 462.0369 179.163 475.088] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3323 0 obj << /D [3321 0 R /XYZ 64.9134 727.2935 null] >> endobj 1042 0 obj << /D [3321 0 R /XYZ 64.9134 676.5464 null] >> endobj 1046 0 obj << /D [3321 0 R /XYZ 64.9134 402.9765 null] >> endobj 3320 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3328 0 obj << /Length 2388 /Filter /FlateDecode >> stream xÚÕZKsÛ6¾ëWèHMCO8ušÔí¤ÓiÒF95=06ms*‘®D×É¿ï H‚(Ǧ;ñd&¢I`±Xì·|µ^¼üI-5ÒÍ–ëËeÆ‘&Œ/%ÃH)L–ë‹?"è*¥ÇY"W)Á'ïþXQ•¼ýõíÏ«”1–¼úðæ×•bÉ:…É›ßÜÝwœ­Hòã›×ææ+Å“õÙûÕ_ë_gëYbøGú%i†¸ÎÄò|»øgñç_xy±ÀË_I-—wpÓJ,· .œ1g³x¿ø½˜z‰i(ò•Ù*%‘½fš"N9³{•ˆJdÔ%Ú( Sh0…ƒ¼ŒsXÆŒÝÙ7Åö%m†²9AŠSÙ|%ÆD %‘ˆ¤T İʖ) ã<³Ö+%ÅÖ(z&Þ˜‹¼)ö‘…(lg0ŸH¤2ƒ?b¿Ë›zûb• *’ï˪)®ŠÜ·ª€v)!H Ac³ü°±ÆÑ,öç;Pµ´:7e]Et…õ(ƒSÁl´Þëz»Í«‹VÏ÷MÞÜîûåC& +‘µ–-+ã¨ÿšÿê¿Íÿ`£”*œäî§*îÜÅEq™ßS6îïýu±Ù¸Kcá|oôÞƒ8’\E4'‚ ¡à–[¶Õ÷P=¦ÇØ»¬w°„ÔIñ¹0òÏo›Û8ÍjîÚèV•1ápaÇ›`…°6Ȱò¡µH9¥ˆd„ Ï÷®l®¹X&ðkWÏKvÅþÖXÅܯ/Ÿuøp&ÀEáf0ì¼¶GÑìê“QîÝï®hngTÅE+¼v¿ï`h}å®ÍöoŒ%¬qì(o‡ÝÖžJn}j¨%ܾn—oÏÓܾ1«ÕVع³¤=\sùõµU‚ÙÍ®¸0ê/þíCKTØŽÀ5‘R¿oFÚ€<&¡¡ËÔ< ø4yp“ßU/YD(ËPF(¿7w`Ñ(u€¡è‡¡¥Ä<ÔYoÌ|K€»ÐL-SàF4r:‰i(ò9DI$í6ŠoÊ}sŒèH!hB} &Þ)µgÃæÜi rb§~”ßé1r†@PQDu‡*ÎÎxó ³vW·Û¢jö÷!k$Gʳd=uF8J!%9I°(¤ñÃnòý¾¬Öš}ÃáØ_³S£dß‘Ú'Ú”öô†mƒ¬fqb ™tSVýs+º|¸¼v¾D„kªèI(\ ¦±4ˆá}¸[~»¥€Ó³=¨éýc؇ž`ßjwÆŽtü)Ì|V7¶éÌ1 –GŠZfQÞÑX!]Åàh#»–×0ÛØu<ÕíÆTã îÂùìÇ©6 œgØe@ ™©­ìb‡ä΀P$3 íø—Q¼ç¹$¹dˆšŽÀÙú¨ò<¶“ð8絺u>‚¦ðÃï…Ÿ#Ûc©ù“p-÷Côê…˜ǵ˜â^˜€”dø™¯æ^(†@ÉUö–ãD)Èøt9N :•ê`^Buæ*¨§·ØÔÁïÇ»´æc]zœK æ4ã2Ÿ)ŸIgI¤@`Gy•!qš±o’q ·0›ûOš¥wÿÐ.“ýd7r¾~29ÑOt|(ã2ŸŸ>¿Ü_;?ã(.Ì+>†O0.$3oZ¨+? F´Š™_¡Ÿq #P`Såd~Ó̼îÌé­v†<c`d%IïðŽb^`HŒ1ÆÆZ Tìb˜;( Á‚좑¦¢²ñ­ø|³ÉËÊÑümß Ùýœ+å_òMFÆÙÎí)¿yÈ`IAé‰OÒŠ²ÿù‹cÔÿWÀC5endstream endobj 3327 0 obj << /Type /Page /Contents 3328 0 R /Resources 3326 0 R /MediaBox [0 0 612 792] /Parent 3309 0 R /Annots [ 3330 0 R 3331 0 R ] >> endobj 3330 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 65.2545 134.8845 78.3056] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3331 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 65.2545 179.163 78.3056] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3329 0 obj << /D [3327 0 R /XYZ 64.9134 727.2935 null] >> endobj 1050 0 obj << /D [3327 0 R /XYZ 64.9134 702.3869 null] >> endobj 1054 0 obj << /D [3327 0 R /XYZ 64.9134 409.1355 null] >> endobj 3326 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3334 0 obj << /Length 3122 /Filter /FlateDecode >> stream xÚÕ[K“㶾ϯÐ-RÙäâý¸Ú±SvU§<®l8#j–IT(ʳ›_Ÿnüøð¯a9)˯p¶Œf¦«,+|˜n‰"3Š‚B–tÀO à í¡=Ôûw<Ð¥¬‹HX€*¹ÊÑ?®¬ZÖ;ä~Õlñ¡êëcf ²¥…6&Ù8Þ/D’/ª¾Ý}¹*$“Ë/šv®QªEI9GÕ²’J‘Q©S›×)µ–N9t1,¾Ï4:p,R–^¥©ØT£þ(GF¹wíºÒǾ««L‚æÔF)+¹Ô6ÎÛÛä¯õñ¹…5Ns}Óî3#‹‚q0(áS]}ÝîvÕ~Æÿû(Ê3IRO T¤4†öˆþ ÿ´ÿÁ¿`³‚[±¬ð‡/÷õ«X×›ê´Q{ÿ~D‰ß¯œ€Á·¾ÅzZ1»üèß‹€0£WAcåG@ 4ÁïÌÉëÕñØì_ràé55Qú óY RJNX Û´’v-•ÍQZÀWpã?ŸúD‚êe…¯ÃóÑM·uº95Uç~ 4þÇ£ŸA—M?h¨Ã&µì[O?¸.ø½÷ãUÝÚ:…N^áHÕv¡'4½Ïöåm]¿IïM?võ–‰Ò¯:-"ÖRÕ§m–Ï~²nH#R€6¹@bKCT´¢òÜ<¤’:b0&(Fãèt}‰ 4ˆ½®>Ên@(.¢P¯]Óç¤RàØTìŽJ!àWF“ôþ- CžS ›h~äAŽ·DŒýã3z(>Ž‚öËÈNaIÐq–Þ·Ï…ç²$L‰Q¥Žé ™6¿*¢¥×Á€©QZDsûñ .HÆï#¿dð¿Ó ~îó|Ð¥Ðlù˜ŽäÛyÚÝ T:öþëS £nÄmëØ×íéB0©»ÕïXZðÈ9OÜìè¦[¯\b¤KðW[éßÕKíS(ÍÐ p6BÀl0‘ «×h»ç}B~uôªý˜oÙe_ÇXµ©ž[‡- _û÷ŸöÍÿ„)šƒ¿"†ös-pLh×iæƒsäùõV#X¤.³3˜jèé²ý N k;‡ ‰¢$´d¸BV“dŠ™¼†ŒŽ}‘—ïG€WxŒh¸”t cKÎ e3$²[ zÁ®¯ÐSP †÷¶ûm%! vMõ„Éd=W³´–ñT ·Íq`yc’Ìjˆ›ÔNgÙìàË=ÁÁ¥ÒBÖ<éòÖœuàX¤,Ï…åÊ–Š8'ÂÖ]çó¡THIMI$Œx?•"@© ÒÐ÷~ f÷µV¥Õ Ìë 6Q*"¨÷qíÅ«ó ¯ü×€u\nª§m„û6…HˆÛ¢ËnLánnpU-£¤zé?Î|•ÃvGP’P¾ý‘c‘²Ì Ÿ1À’¥Sú1¾'Í`Ïðó~q7ÿYüž#ì†_(S2¢ÌõdŸ ÆÞéiîñ«3!žNñ#}ìrÇHŸ°¼éSaoDú»©ôDô]ÓÉJ¦Ô­ôEÊÒHÎ>Ñ|˜Oä¿›\ÕÉè©R®‡ùHyÇ0Ÿ°¼æSsay=ÆßMÁ– e·rÁKa­üüïPÍ<ª]ËS8’ràÇ㱺˞ýÐ’kBoþ$CîÛ,#]Â’M?çØ§¼ì~‰²îæ~W 0º_ju»«šóµ¸4M¬õfŒ‹”eÆ9/ ±f*åà€ç‡ø\K˜>˜÷~¢FŽ·DÕ¦Tx|<59Ä¿"î‚?Kˆ`º”ÒÞJ9…ÉHsýˆR”š€êΗͶϭ•¸Žºµò¢G&²ÝÍ#¯ÎwôÈtÂ×ÄHyÇ1aymALeüñ7—moówEyÌßMÍæ9,ûJÊÏ.ö¸„yX2Jf刓ƒ<¨G[æÎcþÖ&÷Y˜ëáÅ׋ÿtüèÏ|c–VD° :@ÈÃU‹¿ŽêÂq±[I×á¼3ÜþŒn²=9Ž“sm/”; çÃitæfÁ”’ ·"íÙ±$¥x[ ª4\¿ý®5ð+†™›V*J†lefk7¸„f2Ìà§Êm4þ ¡²zN–Ïç¯àšÄ€taˆ‚rVj)Øô´üÂ18øÈ@ÏŽÁ)ç9âN ¹·¡x eg0¾Ê<ý´\ÅÃîrriï˜\$,¯%©”C0óæ‚àô€ÜÑÄ´Ðgžçê‡-¤MÎñÝ]¸£Ù§0³ chzx)BÞÏz÷iX÷³J_¯áà '?¬ }o»¾zj\MGÓ¯8]~<÷’YÂßþñ“÷€™Kί}r÷'Òš’ÒYÙ »Y¶R¨ŸßÉ Ï (¾ÌðÑ€2*S6"wµcDiqøâùÆâ> 7¯} Õ$ŸòÖìûú¥î"@ç×z¿“û¥:–lùÎ畱ˆ‰\Ó*ŸŽ|·Ÿ¼þóÔOÞ¿éºðþC³Î_Ó1€3ø…½Væ‹'þ¸2|pe.hÄÞ¿ß×XÛ°^%Üz‡[áLÄ1´¾U›‚u¥å˜È¥vÚ¸¦|vð!¦ iU KªRؤ*r†ÆAÎ}ð‰ÆXܱsí&^Â$³Ê6–¯ø² GX,aÙÂ×~p×›¡Tı?æ*1¸Ò%U\LʾÛg.ZUI@9ÉnG ꤒIcs• ‚Œwñ‚ˆsÅãÝòΓT^ôD©kÿ8bî™FŽ=ÚX¹ºÂgu;Ž"Ás›+˜á„þÈ~JM“â,¹…oú0ä1ˆ¾÷ï³êŸD†PdE—9Ëаæ†Oq9¸à¹D’@,°“š#§&r-¡¬Äˆp]M7,ÁÊÀû»Yy´·§~(A²X®Ÿ²¶´TÊ~‚)`6S[„ 3ÈW˜ž%‹ÎBÚz i3 |˜(gkKi9¸ ÄÁŒQ°@¦w8޵Ÿ9Q‚£ÀÓà((Ï™y&{¬ró9“‹Û¯÷7˜â|f¬uƒC Zñ³º¤±ÌÆäí&$$›Ò|‚݈¦|æC\h^¡ýFßS aÙF.ŠYjÊ¢,°BeŠ0-$yvr"0¶¡Ç–€t¡“Š"3´±(?4ë(ž¯›ñNØyn78ã4\Y¼úoi¹Ÿ« Šå~Î6 ¶oDÙYõ¤¯éXٶ߸­ìÎ_Žù6¿‡ ·ß~ô§U(èª7'Ÿ09ÒMøíÃo`»¯ƒ,nªU˜¸JJømŸúÊU…f™Õ°Âõ§D‚M¤ `„¶±ø£VK¦.¬ò¶xTш_«¦ÏMÝm£¦âÂXå2‰ûFð°oÔlI¥Bv!¥YþäKЯ7ì]ùŸRoCcßæ  k†•æ’èXJ¨í¤Š8®Û€ku‚©üº…ÑžJŒLãä%†|Àf4üîÝA(>Ôõ:R.½O¤„°ÚÔÝdæÞâóìÿt¬ó÷"Œ¹DºÝ1g›&:+u›¤ ÂÀªÛ˜Éæï"?øáT˜1ÞO›+Á„¥ÛµeÑ‹»\CTf«wyxßä˜bdÀ‡,̘±ƒHß̵Þã1~Š@‘:EïE¶]H^¥óõdèÿÌèðÉ:+#I@6yŽÅæë$y›þÿ7ÄàÁAºÉÊþOäÛ•endstream endobj 3333 0 obj << /Type /Page /Contents 3334 0 R /Resources 3332 0 R /MediaBox [0 0 612 792] /Parent 3309 0 R /Annots [ 3336 0 R 3337 0 R 3338 0 R 3339 0 R 3340 0 R 3341 0 R ] >> endobj 3336 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [140.989 535.0561 168.4416 547.0113] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.7) >> >> endobj 3337 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [195.7836 535.0561 207.7388 547.0113] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.7) >> >> endobj 3338 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 390.299 134.8845 403.3501] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3339 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 390.299 179.163 403.3501] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3340 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.432 116.0317 133.8661 127.9869] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.25) >> >> endobj 3341 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.0547 116.0317 178.9913 127.9869] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.25) >> >> endobj 3335 0 obj << /D [3333 0 R /XYZ 64.9134 727.2935 null] >> endobj 1058 0 obj << /D [3333 0 R /XYZ 64.9134 702.3869 null] >> endobj 1062 0 obj << /D [3333 0 R /XYZ 64.9134 331.2386 null] >> endobj 3332 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3344 0 obj << /Length 2558 /Filter /FlateDecode >> stream xÚåZKsÛF¾ëWðVãy?ŽëǦ”JÅÚX>%9Àd¡–"µ$Çûë·{À€!Ç„Svmé `==_ÝÓÓà‹ë‹çÿ´ Gœæzq}»Ð’8&äÂJ¬¥lq}ókÁ”\–\Kª ³,¥´¸úeÉmñæ§7?,K!DñâÝåOK+Šë—?‡Ö«_^/Yñêò%6þcieqýúíò÷ë/^__°…?Ö/É5‘N«Åêþâ?¿þN7tñã%Æ™ÅGx¦D8«÷R ¢¤©e}ñöâ_@º(¹$ŠZv,ʲ˜s|(Ë·ÉbŒ8¥øiYaYñ1ÍŠ*ÓFKí(¡Bx‘/Мg&0ŒpëÔB;A4sÖ›àåöþ¾ÚÜ vCƒ x¨½ÖìxYTÿ?–JÕ®©ÞƒÖõ!òÜ1"­²‹\¡óö؉|b“ÜbawÃ]6›}[mÚ¦j›íæP[¡VdS>ú‚0aù¸mËNb™‹·!ʧrÁˆU,ªWÍHþ6£ŒÍÉùL±Ù8?¹Ùžóùn§9ŸFÎÈùLäçsOq,5ÍöÙ0þ*l ì¡Ô_Ð.Í8Åvå8¡”ö°cdG[8Òt Ý>,KnÂeo¬UÛl>„®ý§=¶¶é®{ˆFAöÇÛì¦Ûb…ý«GìHe¸Lû8ý®Î}dýè%‚ñr×G¥¶·qÎ]qHeK•é6¾Ý2€1¬¨ps6“À2—xL_Æ$¡œŠ~áAYfhf0ȇM\y4×Ûúo”©*>7û4…lˆ¦€tb‰’ N (2Ä]iïm¹òe-¿Š!à{ {ÞªÑ\Lˆ17ëâNκóˆÜ‡²#&Ÿe9—¨m}TK€³5,ãýÙÁ,I,s‘#ÁL؃³C-»`Ìñ!›Áˆ_6¸&†|œ«ÿ|XWÍÆ{$¾·èH¾£7û‡`vi-‹’&ƒä|Ö›?Hæ‘M¹ì‘f#ßÄ8#âåøj)8ħ¶z߬}®] V|:ö¬Î @¥Ÿ÷ÃÏïâ·‚¡K>ìê<Ö}«ÚÚGEÑgCyÂàéåÅ_‚C¹±”ÔDB~ u»Ýýû(–-×àf¦ÆÎfIb™‹‰fBªU¿0ªø°CDž³‘}—€>SLÃöA')µŸp½tº·°æß¡7ÖÁŒTÃ|ðÇc°Å¢™Ðn!•#†21C|Ë\âx|WÔð~áté²Ù´õ‡ºËÁ’Ž('lÚ`˜þªÞ¯|‘ØC”¾3¬ÜqTœÅ"•ÀC$óî©Ï% ,s‰Ç XžIu¿î“,I;ø°ÇŒŽú«]˜‘Ò p/I-¦Õøo…÷îÀ‘Yqƒ-Wð)‹wÇàŒqŠO@¹Adá4!µ‰Cn¡u‡áµ_‡ç_¯÷c7¸d›ÃPÐç8ƒõ¶x X #›Mü߯Þ+è¼Äѯ–.|Ûe„ó„š[ôœt÷÷tq^®½í¢.©ÑüOH™òƒSwÇÏî4(³² "&Óâ86ŸÃ…áp¿½Wáó6ßs=lÙnÖINx‹ý¯'ç|ÞžBâ$e_aÓÞJ©®ñ8ʳ)Jð06Þ¨BÓÐlŒKØ?F\̹tÏDœ’îª}ŒÉ44ù¼X³l?p ¿ìVah5|ï;ã:Û äÙÖqT\˜¾çÃÞBÀ»sáUÓ>ç#ßÎ ¬Ãûdä ù„µü!ÉÕ³„3P½;ðè>!Õ®`JaHAÜ/Þ… à!UøNéu8q°¡ÝŽ%JLÁ­}j BÆòÛ¿¡>´l7Q§`uh=4ˆ;<°sŽÆ 3‹MÜl¢LŸÙ¦»×i‰uœ)Ï:2Þü'±ØS€á”†DÓ¹a¼ù/Dàåû&Î…Ôÿx¡x¯kÒ­ÞÝ7›>j‡XTŵ÷â}&,2 ZWUWé~#¯" oÔzw[­â(0`¼ÆO©/Cû;¤gógh»õž¼:qŠâgsE»Ò%ž¢ˆ?  ýÑŒ'v“Ñjà òõλ`¸Ÿøm‰€ÉXi¾Ñº™€ëåNM×Ͱ\#™fcÝ,Wl®ºÙôf»Ëæ`·“u³nä|u³\äDÝl ã—ÖÍæÃø;©›q8pTy²n&…S€Ëo±nÆæ­›qg £FÌW7Ë%NÔͺaÿu³œusÕÍŽ˜|"”.«Ï©›ucç«›å"'êf-¿µºÙ|Öûšu3Ô’i3]6ãš û²™øKe³ÉŠÙaÉL>Y2[íjÌ#™À£œ‚¿ 5À$±ÌEŽ„2P(fú•ýÝ¥y¨ÓÅb˜A•’L‘jfêÌš™˜…3<ÖÍ‚)J¸žúåÏç‚’$–¹ÈPPKm\¿rÅWÍöþÛuLNâÛ©Äoª¦³Khã9 R`‰½ôü0 ,s‰#Q uLô ç¥ßsú•ËAÎ nãºr¼²¦BeMÁyÕìðI†ò ´øQXmÂüfÛÄK6Þ®>„axëäHÔ5¥B8Ï ÙÍMZ˜Œñb7…ó+*;ùCCk ’u7 “•ànVꃃúq«~y9‡[V|쬋 ¼+¥p+â¾qD‰×Ú0  W똧5@™›Ðñ± 2X8V°©Ù ·>¶ámßÜô²ÛÁØ .¿LúÑñAZ¯pJ Àý5št˜gÉìž…R{ƵÕƒÈJ3„ð Áô©^ÄTOÛÇ6³: BY@ØâúÎß¡ï°&3U0ãmµ>åéMWÀ|;”%‚0_!Àÿw½€—¡©/À NôÐøÉžÔ£CBZ —ûäHÉÏ(@ø3Âß • þ]a>endstream endobj 3343 0 obj << /Type /Page /Contents 3344 0 R /Resources 3342 0 R /MediaBox [0 0 612 792] /Parent 3309 0 R /Annots [ 3346 0 R 3347 0 R 3348 0 R 3349 0 R 3350 0 R 3351 0 R ] >> endobj 3346 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 591.0046 134.8845 604.0557] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3347 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 591.0046 179.163 604.0557] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3348 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [484.2515 388.4684 516.6856 400.4236] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.25) >> >> endobj 3349 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.5215 376.5132 104.458 388.4684] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.25) >> >> endobj 3350 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 281.5693 134.8845 294.6204] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3351 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 281.5693 179.163 294.6204] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3345 0 obj << /D [3343 0 R /XYZ 64.9134 727.2935 null] >> endobj 1066 0 obj << /D [3343 0 R /XYZ 64.9134 531.9442 null] >> endobj 1070 0 obj << /D [3343 0 R /XYZ 64.9134 222.5089 null] >> endobj 3342 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F33 2063 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3354 0 obj << /Length 1848 /Filter /FlateDecode >> stream xÚåZKsÛ6¾ëWðHMCo§Î¤M;Í¡q'Ê)É‘h‡3²¤Rtœüûî‚ JUWôÔiÇK$ða±ûíÓ~¹˜]ý’F–XÍu´¸‰´$– AIšR-VïcC¸™'ŒR¿ÙÍnâ¼Ìªb3gñí<BÆûoû*‡%ñ~1¼ãi\åå ¬É–ø^s+•ˆ™Ró‹×³W‹‹(ü°îT®‰´ZE˻ٟ³÷i´šÑèõŒcMôŸ)6UÑÝ ˆ’B4OÖ³·³?Z@%\ESv å–×XÌZÞÇrOް#V)~«ÞGËlvô¡’梉¶”P!äK4ç #<µ*ÒVÍlê¬ð¶*óìî· *¯o4©ÓBø®Ø×6Aól«ÚYýèË\é8+ 4ʧu~hn‘©J£PºË.ÜBž¹1·†¤pÕþ•«o»#!³D2¬ü„‰”Û7i“òXFÁ9ÐIJ¾ŒyYnËTÑ/ XÔê‹y¢¸jͯØáK U ÐtŠF3)AÑ~ït¼gSòÞ¢ÕgxŸÂ­yÀû7÷Õ1ñJ"ì„ÄÄ›Œø£WîˆÞyœøÍÊ ‰@Ž?”qœø`¯qæO¦é'a¾P`¥!]³ã$ó%‚©Žéñu ˹r Î65‡·>çb-‘ÁzoëWwñi5gq—~%š} ôûa{»$¼¼ÇÞO²Íª^€Û?ç¡§¬ï"/L(ÔöÆïùܬ8$t yW ï“Ûý!ÃÊ 4 y1‹À$D<&1c’PNEwpKâãÀÂÁ1 ˜¡¾ÄµÓæzë•þ2•ùÏÅ~@š¥h–N‘0Á‰Q’÷õ‹µw¶\VÅÖ3 0N@ö¢þ¾Ën½¹˜CnÖ´€u—9h‡L>ÐB.»ñî(¤žSÃÞ_ÒÄ$„iBJ!…÷¤lCZm.ˆÁFܱµkVÛ»:Úå_wë¬Ø8Äï:’{Ñ™½ÏC0»LSæ‘ÆƒädÖ›>Hö#e†ušf…æ $05˯ç‚C|ª²OŹ^TsÁâoÇ^‚…¼Z»ë¯¿¿«=àÀ%we¾Âäî‚\VåÄ+žõ¡PSu= ÁÕ\ IB¢¥ô6zÈŠêŠ@&ͺÚ%!¥vËs«c ;€ï@¦µ—i(R@“b©Öà÷!CþPlªü6/}^ýÑms(Ë–pX?çû%ªªpÒ¸ˆr,E«dÑ;ÿºXµ)=«î÷ÝÁ¡… †¬ •Ø÷Á~H1RÑøs”¶IîárÙ ¿ëUýÕTú4åbßÞïø¼Ýû]Å*¯›J´3„`™—þ…Ëhº¥­• n3çÚ:5~Iµõ¶©Öؤê…zM(ÐÛÔz:>RYÔ©(x£@w™6‘å­Õ¦Ÿ-ðÆÍrŸ¶ @8Jàù×Â×¾{' Á;©xáî3¿Ó·‡‚§Ë¬ò›‹¶4Àß<èã³¥_‚J ÷ì§ú×;'é×úý –›å Ê aWðÐÃvÅ YLJi¦8T4ëÉ 3‚Ö¸À ²ùUéÈU6,š;HfÔÒ>Óa¤’@™nÆ›& |×V‹Ól‡À@;l—²Ú^M‹”}˜uºE …™ªE¿`[QônXl€ß›ªÈ†õ ðKðý`ËÅ…Eƒ˜„……¶Ds fOضLóÓ©ô §SZ€å:3VANåú±|Þ4aã6”cåÐ$•›¸w›¦UjZ.Œ{M€”{Ò‚‹Lå £ºi]¡§œÑiA»rºiA92-èÉØ–Öý¢æÚýÓðd þNæc€’)—g\#…B!µã5‡$†òÕ9‚»Læ£úéÜ#Pиwø…:G‡8æ€'\£_t{ÇdþN†hB:+ÈÑ!š0”há ÿö Ëh¦›lˆ"Ž ÑÚeÿ‡!ZȺ©†hGL>ÈB.Ÿ¢µk§¢…#C´ž”Ïmˆ6õžrˆ…1ÂÚñ!æÔ<»š>;BÛ•î¤Ã0¦©Q× : ôò"µELBÈ@âÁLw²“²X] ÎÖRF4ãbÚ9ß pFRðÿˆcH†»\®“1 !t‚Rjc»“½NЙÏM!\S%Uÿ†›>Ê­X ¨´£ „qyÂk“q@'èt4/cÿq<À¢„F€cÓÊ~¿Œÿ‚QÜÎyõÁ(ÕöVÝ´ñpŒê œ¶&ñHu™Sú©ký2Û5t OeÃc:†>d„yü˜ŽA¼ÑŠšg:Õ`Lm•ïÝÀ€ð³ç<Öo2Uç6®¶àé©g´ukWN×»…#Í[OÆ8ؘNÅOY• ”<œË%Ö˜†Ð®JÄã«Tè_§4²endstream endobj 3353 0 obj << /Type /Page /Contents 3354 0 R /Resources 3352 0 R /MediaBox [0 0 612 792] /Parent 3360 0 R /Annots [ 3356 0 R 3357 0 R 3358 0 R 3359 0 R ] >> endobj 3356 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 640.4193 134.8845 653.4704] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3357 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 640.4193 179.163 653.4704] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3358 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 342.1421 134.8845 355.1932] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3359 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 342.1421 179.163 355.1932] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3355 0 obj << /D [3353 0 R /XYZ 64.9134 727.2935 null] >> endobj 1074 0 obj << /D [3353 0 R /XYZ 64.9134 581.3589 null] >> endobj 1078 0 obj << /D [3353 0 R /XYZ 64.9134 283.0817 null] >> endobj 3352 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F33 2063 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3363 0 obj << /Length 2417 /Filter /FlateDecode >> stream xÚåZKsG¾óWð–a­Ùî÷£*Ûñº”Õ:Ž%â(r$±–"µähmí¯_ Ãr8”ÃQUR[®2gzÐh@£õörðúïvèˆÓ\/o†ZÇ„A‰µ” /g¿LéјkIuaFcF)->}q[ürþˇÑXQ¼½:;YQ\Ž 8ûF?}~?bÅOgïpðÍÈÊâòýÅè÷ËŸï/lHáÛ.É5‘N«áô~ðïÁo¿Óál@‡?(1Î ¿Â3%ÂY5¼H%ˆ’B¤‘ÅàbðkÍpœ8Žs–oQUÎZtÕŽÉ¥ðº Aq¹AAa ϦHà§¥„evS.g»Ú0Á‰ãÚn¹î©ãEú0ç8è#–§÷mjŽãœeP'— M(èÚPg3¿]N¯yÔ%WlaŠéáöZH©ý„Ë‘ÓEyx€½[àä*7-Æà`?ªa>ƒ1®øa›0F„v`p+JuºI"ÃqαÅ"LE ß.¼5ɪèßæËª¼-ׯFcÅU‘^áC†cÐP[˜ §ž£¡ð‹5Ì8vi˜Èº5œT«û¤Þ®;HG”6mg`õS¹™®ÁæÞ!ªùjÙâ,%KT4Eàp9Tð ´0'(1ç÷ dÑ”êíºMû|šÏ¢i.ÒX´M…í—f {4Ƭ2k……ó‰ß}ž ¦¸‹TÕ ¬²Eu\K|v~k·ÅÔ¯¸Ù„_ïV›2ÐÏgåq5ÿB™ sa~4żM:&!žZ›Ä@´“ÌT9B°ôÓÉ2¬| ?&‰ºyðb–S\}b 4å,€H é•MÍlfT‹'˜ïh1A /ü"ð>Ê%½À‘qœ«uø¾Áѧ{$ºö¬諞éc³š1â‰PwA‹7 $^@£¯È Dä@gÎʨãrX¬–áC½eðìyN¦Èân¾Lã¼@WKJ[Ò–X¨%Nˆdæ.Î>œ}¼üa;$#Vré^µ°K[l”kYþzuÖÊÓjëà ™År› ÷³óó~8]]|f˜“pMN¼NoÎ?ÿó8',´.ü)âFô* µÎ Ð×AÊ~÷gÞ?!¡†‰ýÒ¿ƒÃ»¢Š(fÅÍdê)¥Á*Uwqö»˜¥¢ÚÙz¿CÑvµD„} ”7èl(Akׂ#tTï_ó…‘¼=&B±¡O!‘´%ÏV§Ü =áûµjøÿæP!¨˜ \÷œ‘U‚-Y‚n!pW˜GW|L3• ²·ü@Â1øÑ©¡¢’X2DÙ–¬•±ävÁd1 öŸ‘ÒÅd=Ÿ\c+wMÁ†H«ì0æ4ýj–Gä΀b wCÃùrSM–Õ|’J„\Z¡!Y#Âê)§fÿšã8g¹/,”PDspˆ°å=pGHÅ,$:X±?“¢s2)Á¤qnÍzthi!÷Àöw;´„c…bÊ|¯C/SâÃp¡k#^øýcÒäzãÚrµ>±8„†\“¾ÐÐm óTO{`ÉhFy2Çqβ¾JР!£øæv6üVtôgâDGŸá^M”Qò:,°Ó¼»ä—ÄP~bÀÏÅéÍÅ;Uܺx¦ãóâ}šÑ_¸Ï8vDû\Òî`ߟ9_ÄÓ±úùÒ¥ÝYqµÖGÜYÞCQüüù%â½̈¹2.ß8åøƒÝAìdºŸfÎ ;öÜb'7hwzH”=¦‡ŒeWzÈe<šm’vHõfå”P°#J}‡tiÆAH18@R¾uÛ†()ˆt.´ “Ÿ¯R%÷ š.oçÍÓ&Öüçû€Ø–«¡»Cø}úÎT!§`“Âaì®Ì¡·xôA´ ÕM:^&Š]g¶Êhñ¾Úì7AñÎ@0Ø){h‚†ãœc{”rpŸš¬÷›ûÁ†«ÔþòÖ\¬¢Ñ¿P¦&·õѼåˆL‰R4…¼KøŽ=䔾1‚)´§>iúU ô ìUìLnãv1!Ú`¶ f™×æÈY0ÛõäÁ,÷epԪ܋¹ìl Ëüþäp–8Žs–-áLÐÁÙ¦”u8 Ûñ!›Áˆ_v›@|¨+¿=,&ó¥G$¾û¶‹ÿ°Ýö v´©?Ô${Û½þƒdÙÑT²îû3á1B/ÿ4âS5¹žû»£y5¬xÚG m6†>|¼Šw†MH>¬Kß*žÆ‹¨¶NFupÍØøÚÞàÙã7x‹²|xÝ~ û½ÃõüÅÌòñþz{Õ´»øÎäîbÒ‚åtµœmÚ›yXS“:˜"*ŸJhÝÞÆç¸G6›xa P{X‡ædÊE¥O]›ð±Z…9›…}ØFÇá›vY5K‚Pº¥òÌ¡éY¸hí³80Þà¿iYbS"¿ôÀ5êK|ñƒ IKsýÑâ¥ÇN ðyÛ(_ íÓ ZÓ>üÞ†ÑP¬Ò݇ŸàŸq[îñŽâ:¯ü÷P¨…ç¯wáHîÂÈtâíQþ¾.A1 ·'1é³Ü9¸?74æÇ–¶f—LÊb\ hU½4›¨Ú:•3yeŠIž}p ðî„¿É/áù]ø¹B#參[9ØéæÜ  —ÓØ]‡:"©úXcG´£¦yÐÚ·åPML>§ÎÀ´ÓæOÚ2dp 7úO‘ÌÀܲ£XsBˆÓÚ"¹@}µEº•¬«¡†–Ïë‹ÔSúkŒä,;:# a»[#Q}õÓgJBZ ÷NN­ q&þ-Éw:õI½‘øî3AvåÝÑÏê FÚ‚"·Rg¿£¦ì¯ß‘³ìèw4d¬¡0KíŽfÕÔŽ“Þ¬üéˆ3É Åz¿'ΜڂGÕ³_¨À.hJmgBµK9A£&S¯7Ôtšl‹šÜf³Õ=?¬kÚþÖ9ËŽƒuCÊ-nVÕž¬–ƒ¼þdMÉ ç+­iʺ(7{—¤ „€³Oo2ÖȈò£„Ú±gu7ÙÛs 58uz”1q<&#ì9ç¢)âËõê{âcoxzÉVƒó‚ùj[«ƒq8Uheÿt­÷Œ?V^”ÓêµzF¯CíuàFÿfi:endstream endobj 3362 0 obj << /Type /Page /Contents 3363 0 R /Resources 3361 0 R /MediaBox [0 0 612 792] /Parent 3360 0 R /Annots [ 3365 0 R 3366 0 R ] >> endobj 3365 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 415.0063 134.8845 428.0574] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3366 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 415.0063 179.163 428.0574] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3364 0 obj << /D [3362 0 R /XYZ 64.9134 727.2935 null] >> endobj 1082 0 obj << /D [3362 0 R /XYZ 64.9134 702.3869 null] >> endobj 1086 0 obj << /D [3362 0 R /XYZ 64.9134 355.9459 null] >> endobj 1090 0 obj << /D [3362 0 R /XYZ 64.9134 81.9775 null] >> endobj 3361 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F33 2063 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3369 0 obj << /Length 3844 /Filter /FlateDecode >> stream xÚí\ÝoãÆ÷_¡Gèýæ(PôšK‘<4iÏAry -Ú&B‘ªHõâþõÙr)®(_Ìb p¢—ËÙÙ™ùÍÌ~¾»½ºùF¯²$SL­nVJ$åb•r’hMèêvûÓ:M˜¾ÞPBÈúÃ5]7צ×÷×,]ÿr OE×^o8벆·û#üÓÝ4ÇnÇ^ÑŒè5•éõÏ·ß]½¿½¢+ÿÓ¡1¦‘)¹ºß]ýçê§ŸÉj{EVß]‘$ÍÒÕ'x& Ï´\í®„ä‰œû’êêÃÕ?{‚Oq’|‡d,è¥ÎÍV*c‰`‚›>¶EUÜw‰$ªÊ¶ûêz#™\ÿ%x>[^wwÅ>¥ØAhŠMm°D”Zm(2i[ûºhï žĺÞweS»OC. |Ì¡?ä”Ãù¶u­ãósXðïCÙ£·£’ÛrW|ìnCí³Œ&š#¦ÁO¨Ü¼´Ú•ë‡æ`՜ۿk|ÊÞ¡%ÜQ¤ëûãª5ö·Å²êÌÛ|çèaO<É„Šª@† Ïމ ¥I&%3¼lA`†v‰&Ö5(àkçÐXðûma¾»?”Á…¡KæDÛoT6çf‰k¥µÚÅZcŽŽ#ô ­)¹7!Ħ PgÚÑÞç®yˆ¿è+M+n½Ä¹îÉ92—ñïÇÀuq­Œ¿7ìp ®Üþm|ßTço•W¹ g7rªt!•¥Ú×{jލ'GåßtöyÄÃr"çV'Åzªˆ´0æ™×ç©ÿtk´ZØ*¹#î- Ëš½­^[(٠ǼW #€ø,ÓÞù4û¢¾Ó^nc U”=ÃT§Ú\w¢P¥Rz•JºN‰~øl¬~+€¾{ìU†!Ê*Mà‹«^%ÝiŠ $RAôS‰†¦9šÉÃl’F³ŒA’ÆÁG@~åþ>IÑzŠ›ä4Gc28ÆõвaÑí)—Z'€¹ —žâ%.!Y‘)MÇ\ÞŠ˜Ç ‹Ä&HošNæçõÍÒ‰Â5³Žhü)i꨺,/‚-‚Y@m €y¡NLÑbE¬è¯ök[d‘טägk‹WÛd;\KHô¸,³CÚ|+”;Wû^ºÏ ôùN1øÚmëlêU¾o­‘Áà.‹ˆ<8$ 4Ù‹œMÚg ‡¢;¢;¯[ —ƒ}‹‚ ¢ûLp$k*F§*É8ÉÆþô#a@1ëõüè#ôT7öÅÖ„‰ûˆ%¥ Îõzí.&ø.—·Q¯¬l›mcsŠîɹSZºúñ„ß ß§1>lÜï$¿î³xògP–“cÆEƒySð§„ܱ°­Ç‡¸zW5ÆbܸՔ•uÄ]°®M2h£çk°KŒ—B@)Ý woF2ÛòÞæX8ìm-5ß’Oؑܘ²«ÙÙѳyôážÿf~4éé¯–ÈƒÑÆý™¡!¤`‰é¥Îâ;‘&$å¾z§ò²6á(t¾G]ÜpëÌð]žñì%N7¿GÜn?âçiÙïÐržÝsS;†©fÔ§¢Q&W"“ Wœ_ÈkEÚg£nüñÅ „­Õ¥Ô–&&üxZÔO ²9ø~}Wæ•ýçì“:s[QŒ+Xîs°Õ&E'ÄÙÞXOÆ21o©Œ§ï§=Ñ D ß“OO¥ÉVŸ¢Ý±ÞâPzoqÇ!š -õ*ÔÙëÌ 'yÁX–&Z ¡¬Û.¯Aü‡!·œ®Ð<øäµYGOq’œ2 c D1ÀïˆÙâp°ö2)©†Z\N¤ˆa\ƒHÝ·KàÞ'/çÎ[óYÜ«†iv÷ð@¤/ǽ7éÚ‡;PŒñ¸7Ó$ŒWg Zû@À8˜": Ž c¯“UŽYa à¥Õ=ï'†0È0‡š¯Æ„§¸ IF0á_ŠŒŽy4˜@OLØ-û8ÇÊbþ‚XaKbEB^H»€©“”ÀÐe6® ¨Ã²ß X‚ž-–Yi ` Å5_sA°$çÀò‹Uó÷SW±•DÁ/.~ñI”a–ÄÏpS§cO‚Ô§“”òüt=ÑmiðuŒCȽËé‹ý`?‘j?‡ó^cPîbó'örÆg„³mvy9ßÀuÜ”Öõj¯á)nB’¯΂`F\ö^#¾Ä3ŽŠÙõ/±›e‰äY:fw:#péåô/ð'(‡TC±7Q•¹ßô~Þå.e¤_Ðãò=.×WSجË}'×vþp¹—ëÜb÷½nuÑùY³Ñ9² tgA=ÅK<‚ÎãcÿWš—ƒÅôE‚—€:ù9S~þ‹³Á2z>l> 6ìV‰ÿ‘`0 Æ3õÉÌÝöŸºqTí†âÖmÝ-s»-·d„»Íà ¿¿ÔîÃmÁ¥sÛûXÁë + §–u&€„¶Uü ¢-êû餉ÄOûê¯öËžâ&$ñËÂ-pO%¼Ì·,&ä72ñÈ2•d$•ó¾…²Dˆìíù–ˆhû-÷©Ýíb·ßNEaXCSªâû©ÌžØÎ‚sçŸæ±Jy©äo¢¹3Ø u·/»²mcûœðEÆ‚ú¯¯§¸ IFÀ FŸqJÇœöà-ëýÑ/|—“ø1²”%0PIgŒ;Þ©Ò[3ÑBQ0³”ó90s%³ÌÔn"x¦—"»H$íˆ8(S¹vëtœª8šÃ“:ÀBjtðvG¯?Øú2L_ Ó§JŒcz¤Æ`º¯¿¦C’3˜qÚcÏ ÿ&P/&ò7² …)@¸°…)•æ…ð 7Ÿn@ùÌ-»?K-Ïvq°ø°/۰۲܆Ýä̆ݳóvè[1h …Ç -Á:Ò4û-=¿7ĺ9zg× x°¶ë7‡àA™þ{çODEDСŠ1+¤¡”fw„ô5—Û’œÙ2âq˜Ô3—)Ä/+ˆÃd1)¿‘)ì+È·æ³9@eâdl²/iÀSâöì.Ã=÷×4Ø¡›Å¨%Ø å#ãaÅ£;ùoçÒÝ ?*B8UG?b;ÒøÌ1]3™G¥¯(`0SÙë§(=ÁMHqjÀ”Š„0Èúj#_súqîFšUã„þ‘P™?†UNOõ÷‡Ï4±¡œ%©ìô”áéÁRh%M}ÀýÊ/ztꢜÇ`68³Àê–šbšXògfmÙÝ‚òÜF–…û…¾îrk!É™5Š—½;³êÿpfV2ïðˆ%úºâ×}•—µA$þmÎÑšƒÚÇvjº?8ï$ÓÞòNrìÙ IÓÈÕDì‡KmãÆ×ïlèò;<³ ¡»»ætý>™ {œø6`²»­­;¥ÛÆ•é㌉õ}sèO0·ö\¼=ªîo‡ÀJïð†¯7¶3Pã¹½ø¶Þ¡ey0wÔÜ{€6ñ$º •f…‚ß?ä÷eUZÂöÃÒ½‰ÊÆ7åƒë‡ ÒgøptÜÁSû‡± Æ,j°àc ˆšÈ}!OfED3Ÿ!µýӌͪÊÜÌ!3ºþ«-Ÿï·b£™OØ«2wåöj%|z÷ákûï×8q‹;¼+[íXnm±Ö’×þz¶¶ƒîÓ;;“½Å¹àêÙ6á®Q:¬ë´þ¬·ænM‰œ®%‘çð†,v馗pOUQlQ~ÎÏÿÁŠ~Êendstream endobj 3368 0 obj << /Type /Page /Contents 3369 0 R /Resources 3367 0 R /MediaBox [0 0 612 792] /Parent 3360 0 R /Annots [ 3371 0 R 3372 0 R 3373 0 R 3374 0 R 3375 0 R 3376 0 R 3377 0 R 3378 0 R ] >> endobj 3371 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [388.8428 597.2811 408.5467 609.2362] /Subtype /Link /A << /S /GoTo /D (subsection.7.28) >> >> endobj 3372 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [435.3257 597.2811 452.2623 609.2362] /Subtype /Link /A << /S /GoTo /D (subsection.7.28) >> >> endobj 3373 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.2318 573.3707 128.6845 585.3259] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 3374 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [156.4228 573.3707 168.378 585.3259] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.6) >> >> endobj 3375 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [388.9209 573.3707 421.3549 585.3259] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.27) >> >> endobj 3376 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [449.0932 573.3707 461.0484 585.3259] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.27) >> >> endobj 3377 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 210.6311 134.8845 223.6822] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3378 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 210.6311 179.163 223.6822] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3370 0 obj << /D [3368 0 R /XYZ 64.9134 727.2935 null] >> endobj 1094 0 obj << /D [3368 0 R /XYZ 64.9134 151.5707 null] >> endobj 1098 0 obj << /D [3368 0 R /XYZ 64.9134 118.182 null] >> endobj 3367 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R /F11 2356 0 R /F33 2063 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3381 0 obj << /Length 3043 /Filter /FlateDecode >> stream xÚåZ[oÛF~÷¯Ð[)¬9™ûå1i’®‹"Í6°@ÓF¢m¢ºx%:‰ÿýž¹‘Ci$9 4(ü`Šœ9sæÌwîóâúâÙk=1ÈH*'×7É‘!ŒOÃHkL&×óß "ô´¤’cY¨iI0ÆÅÛߦT¿þòëOÓ’1V¼xõËT³âº„ÅÕÿöío¯¦¤xyõ£}ù|ªyqýêÝôëŸ/^]_ †?Ò/I%âFŠÉlyñ¿‹ßÿÀ“ùžü|‘2jòž1bF‹Éò‚ †g,¾Y\¼»øOG°ŒË”ä‹C[•†"N9s[½¾«a«Fóõ²jVþ¹ÙÚÿ¦¨›ööSÛÝlü§~û)¦¨ÚõÒnîÙkJ“u` $4À›]á‡ç¯w%@‰@†jÓ³²'·M/b 0D˜¦ñ÷Ž:ŠeJÒ‰`À%a©ÈPWo^]ÿàw’ ŒD(ûXor{%H ~l«J"&™q«‘â©­*ƒ&z¸Õ÷o®þ{r«³õfSoí©ßÃI«b½šÃ±:Hqë¾]8|ØwnBµ ¿ì ©€¥~x½x÷²l­:=zòµå6ÆR„°I R5BPÇËÖ®¤‹Ùþi'Õ­[¹I¦1€5ö»{+0Ê‹jn—{Øúwû/<š-7í]½ñŸÖ7þk‘mnÖ›,²9A`vä¸)EšrºH­Ï?îH±LIfŽ›‚HÖ/ÜûøßëmûÎærZ ÁÛõ¦…×d P}ô"Èa)0©FÆ“BGñ„˜ÂHb¦‡bp ·bx·žýY;Aäw¯5`IÄóE™½+D¤a@”ê>!.V<Žè9„s.‘æ’^9µ`ÞœÂwºã`j5nÝ6«Û0Â^VNîœNÖþÓÊ)).sç%À ¹±‡Ÿ± X Çn©ÊS¿w:`­ñVSjЇ¥åã£WâM˜ayžg¸0°€ê€ÕŸÄ>+B JÕ+§ÅíSÇ·Óÿ΀è`@ìËÖÛÐv…„¤|hG^<‚À¤_᪇E{ißKO·ÝįÕrëÇWÞà„›ªuŸçö#.>[oêžò6ÍØÔÑQ,‘Q$âòã„—·á\Ê8è¸û€ óÞ»ž£i „wøv©{g!çÍÌr™ †SÐ’rÛºÝÕr– üxq JgØù®­£X¦$÷µœƒ­S ,P7̱Ønêj¹Ç¥PHi®Fä2R<ťē°!“nnê hô3º‚%3aläÐ@X˵uÇ8k›µuqSçG0¢Êb’›â¾ºµ'ËU¡©³nnج ブúªõܵþÜ †¥ZyjðéÎyNxZFmRż¶pÒNþ«…®XDµsÓë/­ ç<²cÉÆþy^ßT–«E¿ßæP‰w‚ƒ}Tj‚(£’T"šsO;Ð+S‚ûg­9×Ãúe’ˆß”1ã±ØQ<Á$àWM†\¶÷uŒÅ+Ü…„û[Î[Rqé_ 2^h0o¸à¿—sqXŒÝó $t¯š?ó£su•5¸þMÖà B°ªƒí #ìCtè$Õ9mà TŽ)ˆå‰ÏØ>d§Ñ 9dhLDÉl'‹ÒŽ#Áà"Æ!p)×ÔÈ¢^úðïøoëmÎðCʆ¥5ðŽ –,hä_þqa’!©À§ ¬‘”ÀÒÙ‹Ë”da‚e¿²eا–!ô,›U[ßÖ›>ŠŒ`H©Œ¢Ã=¿¬·3{Ø“šC`Ö8x'Îwäô2eà]|~5âLÇÐv¶ñàj#ˆÈŒ.Ó97î¿¶¨^{ëßtÙŸÙl³Ù…™u×3×KAÕa½Ô½—~a‹° ”¦ BE­Ô`áçþáÁ*d¡ï·¹ÏMâ@?T¼’$ŽËsiLÜK}8 )g`ð|f›Æ²Ø®7þu“ua¶ÍÍ£Óý[ÿ¹³œçÄo}‡²NÉ»,0H6Â)³ da‘ðÕûFf3[êK>XrÑÞ,lgùý«÷+Kÿ‹ÿqc]ØjvŸeÊN‚aJó ä r Fv’’¡ CAì+«0´oÕ 8ņ<é)")Belîqq–Ÿ‡VxŒr8TÏb†€Â*om¸fmÄ„ª*zRmzwÖDwáŧ©°LSYG³¨÷²z`ƒkRÊÏy[ìHžØ#5à•$1ÃM6«m[­ZH0Ò†Ù·Ò,™r~ö(–)ÉLö- ’ 9`¶Þl|!eℬ8žH-> ·•’0wd®‚2äÑ!ßZv+Ï~øÃŒ–>¯c ø{Ñ0/æ`Ý©„ÂHØ,ç„JHõ@%H€5 ¥#ûäª#­^­ÃCåÿyY4sÿs›¯ù>®sÁE³:¬1ÉGS™£Bëu&•Ú¼“Ú@k(vŠ$>[k"Å2%™ÑÆl¹C¹ì´&ŸÝØ ‡`uDv#ÅSìB,˜Q9¡~…v†ïE½mùd|B½…F”Jz2«È{<¯Ã»nκ@çæj¦çm\g–Ð<¦™é†{³8rDo–<æÍR;½üä"åEM¨ó˜MÌ 晀#â+¸‹3bvΔPÙF|yT•]ÈxÝÀlÏÝú,ŸüÚš×£¯zÅoé±çb „pÑ[ÙÜúÁç~>Óñé>ë:ø½š,ÅÐOMsÓu¨¿…¼7S ÒH`Îb·p»_ì´×*¨³ô†(>B­Ó,SйR'G˜B"Ü d"{®h×sÒ\¬ƒÐ?`"ªðœ-ÛHðG›t`‰’0Š”àôTeßUUAýlq¯¨JË©YoÍÔäÄší"ù€5K± @mëåá8#Ž1ÎHH‹3R.;{æ ìC2ƒ ·¬WM6ZSW¹_€wi»j–ûÐûÎ] rì ŠÇäh§7¾‘L-›BF¥’¹cDF‡ÀÛ)£`ŸÚêcãŠÝM;e¶¿§%;·9~zó>\«ªänQ/WÃêùì‰õü=CÔ$Œ¡LBn&οÑ –)ÅŒ!ãî:ív…éÅz[?ËÖÏ@B3ýW´ödB Ò`&DKd[(gË$,Š™X¥2ݺH\SäDƒì5 —3ú Ç„¹„¡ „Ã)¢Ÿïñ"Á2¥˜ †}IÂú…R9Öõ°ñˆì ÌvŠ+}»ûR¦¯yÃs¾ãÿ?ß­·aLWÀßÎb ÓÜûú>ÌÊw>¬ÕLî†d¢ÿÔ(ÛR?§€lXÃÝ„ ì®58Þ¶qÈúa1÷\ø”¾õ]q{%éŠûiÆZd¹ÓŽon²×%ÀÃhujiÌão%ÜZkö©«-„®Ä&ìªë8Ä.Dú®½|éû絿GŠ[×±¹ž» .Ét¬æQL Gè‚ÝÃ`:Åù¹GG±LIæ# ¦¨îWö7W«zÖ>ã™ÛB¶#ØÁ~gÞú»5Ý= §„± vµJz> endobj 3383 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.1835 605.2512 133.6175 617.2063] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.27) >> >> endobj 3384 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [161.2471 605.2512 173.2023 617.2063] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.27) >> >> endobj 3385 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [190.3633 593.296 222.7974 605.2512] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.25) >> >> endobj 3386 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [250.1393 593.296 262.0945 605.2512] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.25) >> >> endobj 3387 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [400.9626 461.3395 420.6666 473.2947] /Subtype /Link /A << /S /GoTo /D (subsection.7.28) >> >> endobj 3388 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [448.1205 461.3395 465.057 473.2947] /Subtype /Link /A << /S /GoTo /D (subsection.7.28) >> >> endobj 3389 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 317.3794 134.8845 330.4305] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3390 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 317.3794 179.163 330.4305] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3391 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [384.1117 126.7983 411.5644 138.7535] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.5) >> >> endobj 3392 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [439.1344 126.7983 456.0709 138.7535] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.28.5) >> >> endobj 3393 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [190.0827 114.8431 217.5354 126.7983] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.7) >> >> endobj 3394 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [244.8774 114.8431 256.8326 126.7983] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.10.7) >> >> endobj 3395 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 19.5007 134.8845 32.5518] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3396 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 19.5007 179.163 32.5518] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3382 0 obj << /D [3380 0 R /XYZ 64.9134 727.2935 null] >> endobj 1102 0 obj << /D [3380 0 R /XYZ 64.9134 580.3515 null] >> endobj 1106 0 obj << /D [3380 0 R /XYZ 64.9134 258.319 null] >> endobj 3379 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3399 0 obj << /Length 3138 /Filter /FlateDecode >> stream xÚÕ[KsãÆ¾ëWðf²¼˜÷ãƒíÈÉú°q²ÚJªl Ò¢,’ ywÿ}ºç H”B¬].U‰xÌôôó›žÁô·7W¯¿·3Gœæzvs7Ó’8&äÌJ¬¥lv³úin·‹‚QJçïl¾]ÜΗ næ¿.àªjö‹B9¯7ðöñ þ5¯·OÍ#\<5ðŠ9jçL¹Å/7?\]ß\±…?Ö Æ5‘N«Ùr}õß«Ÿ~¡³ÕýpE‰qfö®)ΪÙúJ*A”"=y¸zwõÏ–`‘(9ÉoQHΤԎɥðRþ¸|¾Ý5åmýÒÎëf!Øü32Ý×\*}¿¿½}â‹ù;TÎÃö>Ü>îªU O–H¬l*(õR«:=l-cSž5•  ¡tÁ¦ûíòת9T(bÚh°žÖÜ+Ô+-h”9ÇA£‚0ayº?Ðg"Xäƒ>sÞ˜ô¦âÝÀÈãm½Y½æRFs ÂGRjßüfáô¼Z£üè9Qmû]p°Õøƒg\ñ1•pF,7R¥ìr$ŠENr@)È¥6®9)ågªè×õ¦©î«Ý«E¡¸š=Ì=—¨O1ó‰àÞ!&D?ïó^®V»j¿öÙU™±`Vc“YBXýµÚ/10joئÞn Ú†”1¥Ó@XQB¥Œ¼X‰`‘S0$¥„j&ºsC¾ó¼F3~s¨¡7Si$ZÙ¬àÀ§dfÞ|€ë ¯5>Ê€ÖF Å‡Mhðo}³ØeUù»åé>6Û>Vóz(€  ÖÚFVÞµúîs,Q\&Ìi¶a œOt‰pbì3Þwž/ëŸ)“©Õ ‡È—ŽÀÄQÄq*"à-Šùyˆa„ËÀITó1Ã’¦¨ŠÍÐ<ûÀ‚÷»B*åA¬%­ö0SÞ£$JÃüdÐl€¿–±ù›»!&¸#FÓrQß…·ñ·U z·Ý­ÒšPQ|õÍ÷‡¡ Œ„iƒyˆ¦\\ -Å"'y ÂÀŒ`©íFFß¼½¾ù Õý÷í¾y[®«?Â|z*$F%K¯tÞ!Ý’Âà_r˜úi¼#(ÂJÁVcŠ"Í““ÏS¼—6åfÁݼ©a¢Ya ôîj®ê&ô©Ckß}ƒ7èΩùGŸ*`Êó¡íÚ.Ÿ02vÞÿÂ(áùºô©zA½‰m‘¡ÒO}&€oÊaÔjy µ{,8GÅ óÁ_ÅÓE]_Ã^ Ž·Zp´€¼÷ƒ^0ض ?¿¶¨†Hdƒñý´Æÿ·þeµKMb–R®Â㈸W,<Ü>Æ®eã!ô><Þ’UkP¡æl~ãUy~ô¶XÕK8<É*7aˆÚó×T»»rK"µ£ç•Eû¸õÞûŧøÝyý,XÑÁO ´’nç‚0™ðá`yGC:%’…ƒk«û™éµw@¯ÿý©Ü[äI3”{H–|@íüæ$­Ð­x™zœÊã¥p0±`d€¹S3 é £ÆOf’Ê]°f)ƒÍ~[—»º¼ÅÔ³:ÊÃhÉ*;Ëù¹LÄ–ä!Ó$V3ײÞì!„1|£{õf˜?¤Y—‹g‡D±ÈIÌÚÍÁ3{ÌV;tÂ&,S0ât*EÿdR‚Jcßé|šMéÓ8“icÎø4¬ŒŠkÓ—ùô&Ár˜—<Æ‚—ámtuD¦òö¡ ï6ÛÔh~ë0?x2°L9™0“Ĩ‚º€È5Ô|~<ŠZÈ/‰d4kyq$ŠENr 8¯r¬Ï£„ùþÚ/7!ÿpŒL¦å/#“â>¤‡–É3!ê‘”êñlàÅ !.ÄýŽŸÉ¼|LÄÎÉsŸ‰ú©Ë„¨Ÿ‘CýœÙ3¨?•Bÿ,M9‘šžKd(¬ü¤vÿG_„úm4¨yù€VñÅjågŸZïO‡G&Ýdñ1ª±.@r•­¶ë²>Ž X·[Ã2õ^‰b‘“ˆ !¥Îö¹lçá}.á ì`q5!»‰â9va¡„3}vã¶ßð×ppOæ’”N8hHõ™”–šDCä¾$ºÿ2´ÅÕNŸÞW€#ë¼ü;@ X䇾0b$tïIúþí›ÿøÍ¡ëáÕ­TÛ´KaÜ ÙÁr™¥ýÊëc"–€Eùe“|nÅ©PlÜ3Zë)ìyÓüdÆí¦ùqë¶Ó|Ùñi~:•~$H»%Ïç.}¦8‰Zá§0{ ,#Pù÷C‚4àtHQC‚\Ò—!Ap«£=x©ä§%æL)”™Nä–â™98½2™¹ÌíÖøõ«#V!ð¸‘zBVÅs¬j\ÇrÛguØ(s–0~ØÛž§§Ø°(›íú4²gQyY gÈ>é²çÝ¥˜Ì º]Šq/hw)z<¶Ù)j4&}×£éÞtÚý‚ /¦y‰NàÎ`¼2„ j~?ŒON‡ñÅ1ŒÏ%ý³=< rëÏ"…¯[L¢›hÑÿp³Ù6‡+`Àš‡´üõ_ˆ›Ùç¹ÓÓùÄd3æfÀäÚ?³žÌEº𸴠à—-Äl÷Ç_¶a²ÅCÓ±š(žcÕ ×[ÑgõÌÿ<œÊþ d†0KùœÎÜï‚iÀé@0£8‚¹¤mÒwĦÄ(p“éøLÏ1j4±Î°>£‡®}t”€KΟÕnªŒ/`5D 1üà$Âá2¾%4ôí ?ãßûN»Ê]x2Ì ‹´s#Œg…S9J–Ž:J—æ<žøvu'SðE¡ÀJ½€»Ôã(rKáJwÖ·C˜H-"©Œ>»ÍÌí|ÖQoâAât°%…LLnÀ"™ï§³‚xØíi¶ø¤(¦2ØýC•¯¨ž1¡É?yø•÷]ìó!µ8ôcj*`ÏâŒáñq°&n<«  $‚ENqä˜$”ƒû´Íz[Tèñ`x:¦wpzûgÊT¯Pj ¸FîfŽßy_¿GqC ð€ö*æžþh"š‹ 1f-èä^w™#w8väÉ'p,÷epÔ¦ZŸN>SÛ “ÏŒäXò™sÙ"Y0àCÖÖÁ¶ïü:Q®úôøiµH¼÷‡Áü‹Îì}?³KkYwõ4HNg½éA²lŠåg2† *8D…–ÆþñêŠ Ü³V‹é**rŠ#m3äq¹ÝlªeóZ>£¨B]XT!žSTÁ$&ÉÏ;=øÌ¢ŠœäHQEÛ,ÓË ê*”&BÉéøOϰÏÌ9Ž‹>ûý¬Å¾ÙUåºw²æÂI¢Œu_ºæb“KÝt59Å‘š‹¶Ù‡Ê.Òy*¯±7›Þí?žšSkJ¸nK âXÊNýâÅþ¸è-¼8¨Ã€'«¶b™’¹:–c86œK@æ§07Wý4aäÔŸ2Zfe‚³.ÁƒëƒcþÙ>›åþ„5§#x–§=j>¶t·ø}ïDÅ+.]Å2ÔV\ N‘,KFIÜM¤°üÌW—@9v?< ¬|¬ý1}¸*£R<å"Õ¤6Knû[„Mµ[cmäÒû¶,Ç„Y¨.›l˜KãxÕÕyô*#ÃP Òeåø ]/Qk V„×iÝ„kËø®Þ¤"K¼ Â`÷TÉBåü_ž^¹òåðï> vç†GÁštRo"•eÁ}âBy/›o€”Ÿ¦×áM+¼)b4:ÌÕNñžÍ!l²9'lft­«J@߯'` ä&ÜDf;Ѱø.ÄId5ƒD ¾»HH–ë [ñù{ÞÅm Ì䤲}­uåR4¡K°-uÁ¶Ñ+àÖ‹ͼy©í¯ûö…Xè`øüß +绺­†À¶¾X [ÓÝDÀ_W›Õ>´YSæ½’±á) ÂØXdQ….OûØ~{7<Ùä1µ¯0Q-‰½&4öËcÊ}µˆ_ãÍS€tᧇðÈçó±¶¥ ¥¨mìdpmÅh6.®àS:F‹„¥VW3¯Îð4½ ¬åE#Ë8` Ìø=@P1ÿ.> endobj 3401 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [158.6161 521.1154 178.32 533.0705] /Subtype /Link /A << /S /GoTo /D (subsection.7.28) >> >> endobj 3402 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [208.4007 521.1154 225.3373 533.0705] /Subtype /Link /A << /S /GoTo /D (subsection.7.28) >> >> endobj 3403 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 279.9199 134.8845 292.971] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3404 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 279.9199 179.163 292.971] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3405 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [293.7333 89.3388 313.4372 101.294] /Subtype /Link /A << /S /GoTo /D (subsection.7.28) >> >> endobj 3406 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [340.5514 89.3388 357.4879 101.294] /Subtype /Link /A << /S /GoTo /D (subsection.7.28) >> >> endobj 3407 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [205.0327 41.5181 237.4667 53.4733] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.29) >> >> endobj 3408 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [264.243 41.5181 281.1795 53.4733] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.29) >> >> endobj 3400 0 obj << /D [3398 0 R /XYZ 64.9134 727.2935 null] >> endobj 1110 0 obj << /D [3398 0 R /XYZ 64.9134 652.636 null] >> endobj 1114 0 obj << /D [3398 0 R /XYZ 64.9134 220.8595 null] >> endobj 3397 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3411 0 obj << /Length 2826 /Filter /FlateDecode >> stream xÚå[[Û¶~÷¯ð[eœˆáýòЇ¤Ý[IN³ ´}Pl%kÔko×Ú4ù÷gH‰eKÔnÌÍÉ¢°‘ej43üæãp†~~1{ú“žd$•ó‹÷sÉ‘!ŒÏÃHkLæ«ß3"ñ"§’c™©EN0ÆÙë_Tg¯^¼úy‘3ƲçoÏ_,4Ë.r¿¬ï¾þõlA²Ï°7Ÿ-4Ï.ÎÞ,þ¼øevv1#s ÿH÷J*7RÌ—W³¿g¿ÿ‰ç«žÿ2ÃH5ÿ®1bF‹ùÕŒ †gÌßÙÌÞÌþÛ Ì½Ä<ùÜšJÉ€­ÒPÄ)gÎÖ³ÐøfgÿîÇ4•Ê ¬à#M6µªÄÚWÕÝ髊ç9!ÈAÆeÕÏaÕ\ÖOÐQ«¥TˆØZM«ATF€c±ÐÎê7»å_eeííÃqC ¼ÀŽZïí´ò¬¨g÷ãBȬ¸YïÀY›òÐ[ÔÄ5¼ Ôç4[‘6R£–Äô\o÷U±­ÖEµÞmµe ¢YðÈ&—!Â4žÚ¼•˜‡"•eÒ I™=eË Â%ÑЄ.µø$œƒK›gÓaš¦Ä´$J!&0-4b‚’/Àô0\ZšZÃEuYÞÔ/êo¨ÃW€v€ºûn»óƒ¶õÿë킚¬rb>”7ã“, ¢ê"ôPõùú(j1ˆŒ<9¼Ä<9”ª éëèâà,ðz[•àÔ'‹\PÑL.Ü'ã1’ÌË%F8¬c„è‰á£¹óî³Õê¦Üï‚.™Õþ$âJ†ó¨‘ÎC+ïHüþ‘„ĈŒ¨ìñ'sé‚:i2‰¨³<jÆ´Æ|¨Obþ6 DVlì UóÅjeóÈroïÇ#$°.Y„D=ÖEHè²ÕîªX‡5H+¸÷äÐðóPä@hÀ·Ýײ] öíÒÞS×@Üaªë%N©k  v)=u‹‡ÍŠÕ 2¾d%ƒÃƒD7e”˜ßC»ú 6ÝX Å ›ˆn †Éè–v¹¯£ûûz@O=-î¬G|÷ì§Ã‰(ÀÆNðî§"¨•˜‡"M%¾%Löm}ûòü·ï,àϘã6S“°™Mfs+qÂfJ˜Ìïù˳‹Úæ'GªJ(f4¡ª^┪RRNx_ÕáIÑZÀvdNr °gL°. ¼ÃºEcÈ&K#ãÈ– ¶ÄƾÙ$¶˜‡‡q N»÷æøHMÅÚ$ÔÓKœRTIˆ%EúŠ6Ü=~”#Ê©Ÿ—b»š¦ˆßmž Á&zb¢Ðèi̤QjîÒˆ0 î˜h§ŠÞ ÑŽFo—h‡ÊN$ÚÉ\ú€K1K¸ 3ÏñD…E@Fd4¥÷I´O"¬ö…É+”!¬ž¥“ ±@D²øBLa¥á4¶ Ä™PéLn%NØLôBAõlŽ.ÄQÅeBU½Ä)U¥-&QÝWuxRrb4"”±n_:ÅÓúž<¢jXT»«Qf£2³Ç#½eöž‡£¥Âd(èJ…q´¥ÂžŽíöÐzôpå$ùtÞ},$/øŸ¨ ’WIÅø×#yÿÂt$HŒ‘|héýH>%ÔT@k*pwÞÝZB±ƒQÜâDì¶»ê°d³ñ¨kx¾¨.-AW–¡Æ³ÇÉ8& ´ŽcBÿO¡’¤+BÅQÒ¡zZ¶,³;*ë1ë­mš§SÕKœRUYÜkÖWõp7L†€GRwŒ"X6&Z%‚k[È_ý Óñ` 1ƃ¡¥Ó»ótz¶»ó Eýî¼§èÿkw>šõÕt Á¤5}º>ÜÊ·‚†šÈ:³½Nû†ñ&rád¬ ‹ŽµÃIˆg†©€d†Q t™a¨ãHy‚“9ø‘ôňKC&Hâ ÂQŸ±¨nÊâê|;•,…‘ÓË[ÚM’ %·IÅ{­]ÒVY(3†÷Ðä8ÞýÈ„xDÆðêØâý£cœMéOM4ÓÇ}2G?Üc™:[$@ŒÂþl‘sä«ÛãEÂjÂLBàê%~Ôäø¡Íqàû‘ ˆŒ?Ô1|˜¯8ò“yúAÏÌʽ´óOŒ!Ÿ¸µ  ôð¹$‰7§S|–²»^äTeMŽb·šëí‡ú«ýgwè¡òIR³£…© ²<®³¥ý~y[¶mvÂÍþÕ>~Y†‘²¹]4»Ø\½õ}óÌ¥qhHã0÷)úñÆØÎ0€keƒ—ž×6óPâ@ZK€´)$ í°^câ Ÿ…ÀPÔwr_;onvÓÿÀDÍõz?à‰!“Åž–F^û ù8§}ÿº#n.—®±ãÞ¢D è@ž4‡âC3]„±¡0kÙ'DÝi@îíÉÄÖÃ2µ*¯Fë íØtõ†Pd¤ÞÐÓ²¥´zº#Á¹×Ö¡éŠG–íÊO×›b½ui?W6ÜÝ´÷qÓε&¤(I¦›½ô$Ùg6?øÏAB³zéx½`è©*Þ­7noW-É>IP°Ïýüòmóc‡~D^ß”+»¶;Ž+ª5~'}QLYo:IQÙÑr`Š8FÊv¥ë>E@˜„1Là(Q ʵÀ<”8TFp¿Ñ Ý‹­Ž›5„×ö)°;W€Í`æèÄ›]ÚÅÂȬtÅJ[½Ü4Žb3Hv –Ò¶x¡ M8…^ ¼ŒÝÌ'8Rà%æ¡È·X-¥2Ý›;·Ø€þO7ê?vÕŒ¾Ï¤=Æ…·¹^+~,÷K×`r^óm÷E‚V¸Ÿl'…2KÓ)"Ooæxy(qÀKì’„u/î{©>éÝøèE¹ýP]×{±^V~˹*aMäm©ò wŸ"¸k—¦øDþüeÿ”uîpöÏånïÆÒlÕÊYÞ¬¯«&“±RW[¢(Ò5þÂ@QO»Õ®–hU,¬.…¬E­’‹Žâ“ñ«$`6'ºªëNL2Èœíb®ÝïŠÚ6ÇKíï[oJsÁ-ï½0B?©ôÚÕ®´A*å;AZh]¿ZÛ¿Í›îìmé®\›yâSLäµìÆÉ>ähtYTeý±¾M]ê>[iuÁ̧¢ï‹ec•s( &îýPßz»]ª¯ÞÃw·[OÔ•8DàUwVÌô»ÉPéH×H!¬˜÷âÐ*û!½uå.?D£ŒÃj(ä7º±¦vf0o¬)•ˆ(õð¿CkÔIº‘eFòÎÐÆ»’òO¤;#HŒ‘ 5ŸJçÎGR'¢°©£LN4(a4¸o÷7h¡1É‚!ê .BE«JíÈtU¥Pd¤ªÔÓñ˃–ÎË$Fˆd»¥ŠÇ&¶Ä¬â‰E ÎõIó¸ÌC#ïHúþ‘„¬ˆŒÑ~¨lœ÷Ó¹ô±`Z H„ÍDC`ïKˆüHMÚolIš…2#ñ:(Êú~`:Ò$F8?Tp„òûûÏáðHæáGÒD Ü þò|¨‰`p(Iÿ MžÑXÑtM„Pb¤‰Ðû74Ôñ”M„PfŒÈB,O4ڱ隡ÈH¡§å·ÖDH7{ÙD \Ã;¥‰wƒi2§û7Xº&ÂAAØE ‰ ™®‰Œôü(‡Æå²¼®žò«9AšSÕXòd¨| q@DÔTÈ|A5’ÌT//n*¥jÆLeCõA"lì»>Œk—ˆÉv‰5òbïiºendstream endobj 3410 0 obj << /Type /Page /Contents 3411 0 R /Resources 3409 0 R /MediaBox [0 0 612 792] /Parent 3360 0 R /Annots [ 3413 0 R 3414 0 R 3415 0 R 3416 0 R ] >> endobj 3413 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 470.8552 134.8845 483.9063] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3414 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 470.8552 179.163 483.9063] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3415 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 148.2692 134.8845 161.3203] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3416 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 148.2692 179.163 161.3203] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3412 0 obj << /D [3410 0 R /XYZ 64.9134 727.2935 null] >> endobj 1118 0 obj << /D [3410 0 R /XYZ 64.9134 411.7948 null] >> endobj 1122 0 obj << /D [3410 0 R /XYZ 64.9134 89.2088 null] >> endobj 3409 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3419 0 obj << /Length 3080 /Filter /FlateDecode >> stream xÚÕ[K“ÛF¾Ï¯Ð-TÅl÷ûqJ%Ùd×9x³ëIí!É–8cV4ÒDâØñ¿_ d“¢8ã ³µ.WÈ~€h຀¿¹¾zù½]9â4׫뛕–Ä1!WFPb-e«ëíÏ…!Ü®KF)-Þ¬YqX—Ü›57ÅokxªÛÓºBÍzïàOûòðÐÞÃÃC ]ÌQ[0ÍÖ¿^ÿpõÝõ[QøÇúqM¤Ójµ¹»úýêç_éj{EW?\QbœY}€gJ„³juw%• J ‘ZvWo®þÕ,Å2'ù .’ól•ÖËWÚq"¹~§Ãæ·ºsÈ8ƒ‘ÀD7öŒEÏFà‘9ÇGA˜òñ}ÄaG±ÌIž³È8,E7ä²Úlêûöªè—;­oëã‹u©¸*ʪ=Ü¥çS{¬«ÑÌñò_•B&pÉqJñ'-ßR"µcK.?#9·ü4l~ùsKÒ,#]jJ¨’ ˜F®‚dÿVŸ6Gl@/îÛæ°Ss®èªäFç0ã4P€n¡‰B=[f‰`™Sœ…ui&úEöÆsEôí®©÷éå׫ýàõŸm/ÀÜEpî@#xCúõí±Ú Êí»:<üB™DqžPœmhÛöè jlÚx C³)ÚCš:¥r Ù3ÀËÁÂa#ô~xw8ÁL!m±­ý'7Ç}Q{8b³)šÓ„:-ø”SXÉ›N›Ãõ F@7,Ž"À 5Å«›@71í?}¸«ÀÎ|šä&RúâëïÇÐáÆË£r¥þÚØç»›Žb™“<·@fuÿedñÕë﮿˜@€&L±´Ž+ÕP µ ÁJb¥°qTs RÄícß ~V¶A¤¶ª¢«w£»0ïEm<ê0d_ÝEí€D¬"\¸‚:=*V¼Ú#âÚú¸¯q÷R´xµ¡¯Ú¸í1±v:…f¯v3]ñp‡°} 6E}<•8°BäoËí¡3ðýÐVÁ pêÁ#ÊÂ#sÁçÛÐsWyÃ@–›}M&ä/´%ÚÚd¤ÉÀÏu ‚»\ð øƒj¨·Ap’IB9SIpÁ%­p£Š*üß‹L— »Øçu’¬º©Ú¤XndF"i&B' h<eTo‚a ,qº»&Nk‚ÂÑÕ¾oÚç¤O‰ÂÑó¶´tð†ÿ®«­ŸpÆÞ#è¢ç%"‹ŽvÔ(PEqëÉzÕÃB¨j«ðrƒ_=Äq uîmtžÆ”¶Š8‡cO®mðßçêVà„’¹ºõ%“ÓÉÁSä6,Ê#:(«“—ßÁÞ+£ñ–9M)়¢‚iRØ\•µCAzÃP:3QõžŒGw Ççâ mü…“¨GRìîñé·7†]1QügmEáw °µÛøÉCöé@×ôŠÅg¿FoÛ±·Wî`~äû¢R= ×a˜.Nq<¬}ò’[à©Þ(^ª ãFëDÔöÆ „òä™ÂËCXÂðašP˜iëŽÆ…b9Äép0Þ¹{ ¶¸¯n#1¦t²¸\wRƒ®ûcíÍÈÓóö­©7°æýhp½ÈOµIŽFxQâoBÅ·¡é'”óG pó°O_I.á\‚e’ÌhýQ‰OŸ|¤!Ôˆþ$0E8ù„s¢‚óf¹cbFp攘FÍ?í\Èà8Ü ös@Aý;Zxó~&¹‹ö»dºý>u‚pŽé1-Aa q†ºÅDØœ—¡pŒ0êØ#2q+ ~”-ÇmGpž[iìñtÈ틸§SK$ÓfhŸ¨w 'FªíÈ,W®nÌÀ.¾;úÍ/Ü.ÄঠFö¤[T˜Wæ6/Ò ó(ЊI,—â Rbµ–Ó¢7Œpë,‚/š¯’:<‰yàF"D¬çØToAV`Dã{RZeW9;Ï[aGò‘%Â]z„ù›ý©­ömS¥{ôÀj5\»¬èg<ÛjÁ2£8aµàR4çlÀi}Dü8T̪à{ˉ¡É¤qƹËÁ™/ g¥Àíróœ8çþ ž»?h½«ßUè0Çý¢z‹{öíiÐ>ü6aÿðdnëãecȳ˜1Ì ¨7†\BíÇû3‹Ìã¥ÙÈg[A¢Xæ$'Ì€s@l^½øSô ®”›üþ´,&åÏÅF$°©Ü#&"51RéÇ LäÐNÙÚŒ·‹‹ˆïY[ ðs«íñž/wïiä‚xÏHÎá=ç±Ãû{¿«îêA\tðK ù/Äû¢GLQõØÀ,ð0úh¼‰i¡„|ÆÝb˜Ÿ]qú|Éó O#}Frô9—@ŸÔ5ûÅý¹øyX¹Ä0÷<îAÒTÄxù|äM8±¤¯ÏØ[ ø³Kyøiä‚ÀÏHÎ?çqøÙÍvù‹Iú/A¾P ¥>»4ãòA „YÓÃÀNŸÂuÊʰ¦£ùá>Åábï#¡!– ]§]”ÝwßÅðÐÑÇÓã?…G1åñó‡þ¼ß†8ÝGI;KÙ=xŠx8Æ9ïÒˆ³¤QT¦øèá,ÁA€¼ø†;ùüìw$Xæ'bt>ÓBEÿáÁUu”ŒÃ0<%1ôÒܢСLUñy2%©)QŠ&·tá%œ%ù0ðŒuʳ¹øCÀð€ö"¼Çà0¨‹ 1ef÷ÉQ÷< ÷í ÉZŽej[ß¹4³5,Ãý³]Z¢Xæ$'\š„Rg‡\v.-¨ üÃ8cuŠ…!ÁÛÕÜïªfï-ß}VÂwôjâÔ.­MïY'¹œö–w’¹gcÄXÇ{I³‰â'¡å,ÞŒ\ þ©­Þ6;¸hׂÏ­¤+ æú÷×? ™ä8â½âTÐ];àSõ5X‡Ú EIŸÖKVŒÙjŸ÷»3i cN¯1)óüãhG±ÌIN84›övÃ<2·Ûc}:½äScL&H,Òc'<Ð_¯.jŸ¼Ãâ²]' ßº¤Z§">/:Ç* .Á&ñÏ–L¢Xæ$'$F ±î¢–IÆ:e…]_ás_Èw)M­nz/@å0å¿à3’sKLÃFKü*[â—ùǘ0°Y1ÅŸ_¸uQHÔ€çfÅìÀÎ,Pî—(–9É©-Ö-ݨ‘Œþ¿Ž£˜ðõë®w*)£°îG¦Lÿéa’©1'J"-,ª°±ê^eÁU«¯Á޾´¦ S€;_1J;"¹}è{RLÌù:è(»?´áðè :,΃ÕÊq–b IB“ip-lVôpN ÎP®Ë\f¸Ç¢„039`ƒg7žÑÚ?+Ÿœç–õÉy|¹mÞû"(¬¢á–ûJx½Á“ïn÷1¼ýþPíÐ bÉŽo ÕO¬xÚ §lO'Òó©òѼ 8€r¸òŒ´â©ayÂÒ½jJ÷ª]SÅ @¾4~%´áG\ÛTÃÕ××&vàDìù¦¤‰ÁÍ"øç8÷€‚{ß•ql×7òü`ð”¬'ã€mÃþ_C#p'”i1aŒÃýýŒyB‚xÓ›8‰:" {’ÂÆ*™ ´:Ö]Uõ©¥®~ïâm$_âRá•y±u·‘Üž–Jí¦,—KÍIÎ$SÌÎgS—égAtšh”×¼•À‘ü“¬dÉtª¿ ^2ƒl KYÁ¬Tz#ÈÅ2cìF.cÌIÎÄÉJ"è#éS (p1U÷oÿ?7‹~ KYÅœT:£ÈÅ2kiàr&‘Qœ±ˆœÁK1º·LÚÄRòýL6 ãû9NlÅLÞE{ð(„XÒòó“¿)ÄPüèþwÉT²µ-e+³âêŒ%—Wü¯9—bºièr!ÝŒâLD7g±3— µ®°MH¸¢-Çk"ø¯ÎÁ…×™¯10ú)½ þÊè00©”¶óÁaň¶ÚýÉØ°ø¤Ø0Iòü/ðîpéendstream endobj 3418 0 obj << /Type /Page /Contents 3419 0 R /Resources 3417 0 R /MediaBox [0 0 612 792] /Parent 3425 0 R /Annots [ 3421 0 R 3422 0 R 3423 0 R 3424 0 R ] >> endobj 3421 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [205.0327 561.4156 237.4667 573.3707] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.29) >> >> endobj 3422 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [264.243 561.4156 281.1795 573.3707] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.27.29) >> >> endobj 3423 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 381.1914 134.8845 394.2425] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3424 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 381.1914 179.163 394.2425] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3420 0 obj << /D [3418 0 R /XYZ 64.9134 727.2935 null] >> endobj 1126 0 obj << /D [3418 0 R /XYZ 64.9134 322.131 null] >> endobj 3417 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3428 0 obj << /Length 2021 /Filter /FlateDecode >> stream xÚÍZ[ÛD~ϯðŽÀÃÜ/OˆBAEU[ ˆàÁM¼]KÙxIÜ–JüxΙ‹cg'°¦ªVÊNÆã3ß¹Ì9߉ýdµøò;›9â4×Ùê&Ó’8&df%ÖR–­6¿åLóeÁµ¤:7Ë‚QJóW?-¹Í_>ùý²BäO~yö|iE¾*`AþìE˜}õÓÓ%Ë¿}ö N~½´2_=ýyùÇê‡ÅÓÕ‚eþØqK®‰tZeë»ÅŸ‹ßþ ÙfA³”g²÷0¦D8«²»…T‚()DšÙ.~^üØ ,’Ä¢/ò ªÊlÆqJñ¾²Úq"¹^YC,wðɸΟ׻ '6u :ß•»òŸºóŸ»¥ày‹J -I³l(¤Ô^ìê¶B›Èü,Òl· Úï}½ƒooÂ…{î«M½.[/ølXîã ®Ý~ˆ³KnòwK¥ó²ÞÂ|ùz[…+õMøß†ç=Tœ)"™´QmA;ÔìzCöËîË=ìÑÁMÜàû¿D/ï„ÐD=nÎ!Œ_CܘܫSí"¾Ý¡-·xC°+ HÊz ®XÏ‚;…!Új½ÃwQNB¨å"è7U{jŒƒóµq™æ"‡»‡±æã)sŽC° „åéûI¨u‹¾HkhŒ+¨æÇOÌ?€©9¨Þ_üh˜Iâ%˜ÂÃJ9„y¿oîîÛ/Ù˜› eX v‚}ét^Ý¡Ÿ0ª·8€¨>Œ$œAª5rP²³®£4™22“·I’XôEŽØ„:Âvǧ\'5Q¬¿øÑ0“ÄK0¥#Z)6„\÷;Uô«²mî`0êE+‰‘Ì$/pï·Õaç¾ö~lkH@ýiŽ H£Tœóœe„ ž)Áˆ=m(¯è |hÐHÕ­šrbÍèŒ;‰P2ކјG§½J#ö0ECœq)“Þ®×>ÍvYR°4ëÁC¯)™ÒÄ[ÃχaqUåµ kŽ×o÷¾hí°˜µ#ûhÄáRµ‘ŒmTª6(´é²GûŲPL„rA°^B°P‰Û!5÷ÅÖ¯x‡Xª-n’a "ÌB+º²?²A,LcéIB>Ô6!ûìo€ÂUþUñÙˆ¹@ ¿ J)ó'¸G,Ù›Tò”o·q[¬…¡®¶·iÅ>ÌìÓ÷2úÓ—× Z†™2VÖ ½Óq¿S-G«¬ÑÄ*ª†‡ø©÷j³÷›žakÒBÞÇ‚vÅQéѵ‘ÃBÎ9++ÜGAV¦;Î1?pÁd8zê dëT& Ç×Ó§N(å®w Ðæ»äšM{[í-óW1ó¹óHÌvMZý… ùÔ¼Ü1(ÀÊf=g’Nâ´M¸3Äjæ†Fi?ÜW§Ô Eñ¸ò±Ù²“XôE>Ä(8‡8rlˆ±ÚC¨b²D{~è+ Ò)kö±+f Ud6óbl3 „ºˆ÷>ú< ƒ˜:Gk°‘V 6‡$›¢»‘fß–¯kϺ Û Ì@cíIÿÈ÷ȼïO™Ç$fÖ‘Â%z†¢ó‹ý0AÑ…Þ#¨š‘¢÷ENPônÙ5}>˜E¿3QôÌHÑùY×%B- (ŸƒFu½/r‚¢wË®¡èóÁì(ú˜‰¢`ÙÞç…¢ÎRtî`P­Ù(z_àyŠÞ­º†¢Ï†ñHѧQv}óJŠ®àà‰.Ù¡“Z \ y ‚ s¶h©‹4ZXR}†FÇ}›q–«-³—úS‚Ëx¾B5ê¨S0 ŽUþ¾F^‹#ü ÈUµ'Á¸Sÿ-æR†‚øiÒh8ÅÄXj¦y48û7ñxtôT$ÌÀ–1*ª³¬¸g.Z<­cÇ‹Jú1wm]¦”; ÈÐõJ+z·<š '‰E_äAÖP`8Ää¬'Èg™ð|&Ÿ ÿ?1Í)‘üRHCÖ§L|’­aOÙÎÀ”MŽG o”ÉÖ°[9_kØ9Ñ0þ§Öp6óþŸ­!‚¤Ü^h 90¦ì§×Š‹­a¹Ùœm !^ˆÒLÎØöEN´†Ý²kZÃù`v­á˜©5À\CòÚVX¨>âœ1÷¥fÎ:8hrÎî°'q¢9L«®é gÃØµ†ÓSgØÇxtÜÇkGü›9èœåóõ†=yç[ôèšÎp.€ÇÆpb×ö1]ök³ßŒ7†VÓ=ï@›Çáôh B MO`PÜCQ¾ÞÑŽ„  .<Œ‚ÕmùçöðßçkÀ˜6¶¤˜Å›]¸ú;ž&õM›C˜õ‰ ô ”ïQËzw|€ïW¼^r—ŠÉP¬AÚ™+Þ8U“h¾Ð0¯‹ÐBQ„œÆÍ°)ôQ ¨Î>e^BO}ï_Ò€3‘3úµB;‘¿Üᛕ ë>=,ƒ™`›Ø‡£Æ»ô†^í^ZhÛjˆmê7žèE ånð¤'ߢ ÜäïWÖøǭ烥¿Ø"_Äûý{^âÆßÅ¢aFéu\™M —<ý"±iޝgôÈkÓ¦^76êÝ¢u›Þ-©ƒ5­Ï3ëa4Å—PF^nIïÁ”õöØLã¡þ".eendstream endobj 3427 0 obj << /Type /Page /Contents 3428 0 R /Resources 3426 0 R /MediaBox [0 0 612 792] /Parent 3425 0 R /Annots [ 3430 0 R 3431 0 R ] >> endobj 3430 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.2242 30.5402 107.6956 42.4954] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.5) >> >> endobj 3431 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.9011 30.5402 148.8563 42.4954] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.5) >> >> endobj 3429 0 obj << /D [3427 0 R /XYZ 64.9134 727.2935 null] >> endobj 1130 0 obj << /D [3427 0 R /XYZ 64.9134 702.3869 null] >> endobj 1134 0 obj << /D [3427 0 R /XYZ 64.9134 646.3661 null] >> endobj 1138 0 obj << /D [3427 0 R /XYZ 64.9134 408.5036 null] >> endobj 1142 0 obj << /D [3427 0 R /XYZ 64.9134 160.5346 null] >> endobj 3426 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3434 0 obj << /Length 1470 /Filter /FlateDecode >> stream xÚÕYKÛ6¾ûWè(¡Ã÷ãT hZ4‡"Eôæ µåP¯´µµMòï;CJ2µ¶åíZ°)Š~óž¡_./~±‰#Ns,7‰–Ä1!#(±–²d¹~Ÿ"h–3Jiú6ció°[•Y.„LwðC–ë~´Ã7"ÝÀs±Â‰j[Á¸Í¸M¿À;æ¬K™Ù‡åëÅ«å‚%>ìp2×D:­’ÕÝâŸÅû4Y/hòzA‰q&ùcJ„³*¹[H%ˆ’Bô3ÛÅÛÅÁ¼§˜Ç$_"Çœ`Y;N$—³ü 9Û5ø½?‡TG¨ GH=š•9ÇÇPýÌ*MrƈSЧöQ Õ Ã~–k­ a \óˆk÷N Xª¬çúÏf·FnÇ6Á%á’ãÙ¸¦ÚÕAÏÿfJ§Å®*n@TÛò±¬¸cDZ £¹ŽÁä¹3ÄjæÆ,Võ¾-ê¶*Úª©£ ÅŠhËT+–ŸVl>PÌc’Ç`…vDs°ËØr‡&ø¤b–À>£HÑ:™” Ònï|Íç´h%‰ÑJ]°he‰Pœýo‹®ûæãÕDz‹dExÛ:¼[ß–á]Ýô‹êî·mîÎû@„6˜”ÉÁb¡´_îâ2‘ŒF+¯6ýžb“ ž©aPÓRÆ5 ÃbÚ´O7©ï^Öaâ&Ë¡ÿ*o+,rjÿ}vÜdÜõ©d, JAºç ð}Œò”0Šu«Š::Ф嶩o}àÑSN¨{z_‹4Y.™Åz+ ¶Õ¾ £f~½àP}}Öbîðo#V÷8ãÒ»ø¦Úí+¬º íç‰HDNª:ü‘IŽÙÄg\Ï&ÂÞcYy_ôg  –ÛÂ¥÷Åm1‹6éS;—.?¢wP1>c.^A|3á…Ù<ˆ+ŠU¾:Ô¾<úNhûÆË©MW†Þ„î$ów‹Gtc”[}{&ÛÇ¡ã)í¯d†Håô7Úþ‚N!sÈ Í‚õSÇØ%7tpÇg6À1ž¹Šÿi‡âÄäÓàaË| pLr¢n€çéwÒ 0µÓ6-œ†ÒÈgØôWocæò‚i© ^0Ëd <¬œ¯ŽIN´À#Œ§Zà ÎÉ&x>/^aýÝ0»à +Ì·w-ãŸÍ'&erð‰X(Ó>ѯœÑ'"’S>c|ÖµÐ|þš×Bˆvëé{!¡)ôÖ<ó^H<ç^ˆÙAÝŃvJèîfû?ˆ ÍJß6;_™¢+•ú‡²X{·1:ÝHß·±[ÿC>º€ò·jøÊÅð$EÓßjä¾ÝA¿ë‡÷¡9¶§¨õw$V¤M_,ûÞ(<| ÿa¡,Û²&XÒ“Þ°þ³˜øLendstream endobj 3433 0 obj << /Type /Page /Contents 3434 0 R /Resources 3432 0 R /MediaBox [0 0 612 792] /Parent 3425 0 R /Annots [ 3436 0 R 3437 0 R ] >> endobj 3436 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [352.021 463.1882 374.4924 475.1433] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.5) >> >> endobj 3437 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [403.7374 463.1882 415.6926 475.1433] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.2.5) >> >> endobj 3435 0 obj << /D [3433 0 R /XYZ 64.9134 727.2935 null] >> endobj 1146 0 obj << /D [3433 0 R /XYZ 64.9134 594.7088 null] >> endobj 1150 0 obj << /D [3433 0 R /XYZ 64.9134 320.7405 null] >> endobj 1154 0 obj << /D [3433 0 R /XYZ 64.9134 288.016 null] >> endobj 3432 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3440 0 obj << /Length 1389 /Filter /FlateDecode >> stream xÚµ™Moã6†ïþ>Ú@Ms8ïcÓ¦Å.Ýí®{Zì!ˆ•Ô€?RÛÁýõ9¡LÙT,rqŒÑ«gô¾¤†ÉÍb4ÿŽðF™ñâalHx@[”Â9 ãÅòë MgÊ4;”ròéóT¹ÉÇÎqróÇ»S‡“ÅŒ &ï~{ùöÓçÛ)L~~÷SýåSG“Åí—é·ÅûÑíbcÉ?p¾¥2‚¼ÑãûÍè¯Ñ×or¼Éñû‘ÖÛñwþ,z§Ç›išÃ7ëÑ—Ñïà,(ÎbÉ›ºU½¯)ÂS¯Vpç5®ª9ù ]AÌ‚Úó]êÒÃþ²ÃÖœ%¯z9ñ¾4Þ+n Sá÷‹VÅY,ùÒKLà…³Úµ›Ù=UÛ9¾6·>ÓTæGÄÝ"‘i÷Žƒz7JÈÚ²‚½G’©ÞCYMxÿçÝö±º¢ÔÀ¹Öº ePÌQj-¤BÛ¦Ü=W»ía®ºLò|GLÒm“hIu¥*iR$™2)”LZïÕÞЋæõ æ%p›²hB#ÉTó¡¬&ÜWwË+F‚zùº‚ŒA1ÇH$´Á6â±ÚoæÔeõÂðÖÚcb¶ $™’ÙŒ%ö4e§l>ï÷Õöx½ƒX^•qñðäU1‡i¤PšÚ”Ëêp¿_=wûîeä5Û#û|²ƒ|ª+%”\F±dʧPV>Vסáq³åƒb½@T¶x8òZßtoò–Çž7±d°$§¥¤A‘dÊ P–5¨âÙ 4bcPŒ¸Ù-Ÿ×U÷¨taÐÅ òC "'…¾¨œA±d ¦,gP9ÄÆ  b0¨…ø°Z_Ïr¦>£@ÉÇsŒ|t,ÐfÜÞmªžAÎ | éŽÈ® ñÉÅõgHñœo Œ‰øMl\g±dGóJ #ù„Ñ”õeˆ'¯”/ˆsˆÄ³¶ÕF|ÚVõ´Ý½ÌÙI ëú<‚Añ²C…¦¤G‘dÊ£P–õ¨âÙ£4bãQŒ¸ÚÞ¯Ÿ—×KÝ)v".Œs˜N BOmÌõêpì^ꠤЪoÞ5$FèœðÖ—\ê±d"FMY.Få›eCŒZˆ¹•Ãlb”Á 1ja¾Ì…—” ¬à«dÌ0ª:ºÎ^¸ˆºætXô=£+à ¬k' ’.™õH2•õP–Íz1ÄsÖÓˆMÖcÄÃ꟎ÑȲäc Š9Fã…%GmÆûÝóöXíݯ^$öŽG4(GÊ ~²SÔ¦2ôR”MP!¸s~RpMzÎpÕ~¿»~v„#©‹á½4Ÿ³¼u6ÆËĆOpìw›ëY!­tåƒ`Ï‚Júöüû¾:ý¯¦gÍ›–îûí ¡J›¢{Q$™ÊP(« ¿ïWǪ?DÅ Ï)JC61Š!7Õáp÷XÍ]‡KT»ðúÀè°„ $è^Gê Ù8²åšm3Í*…Â6ý¬#J³¤ä«ËAŤFžý$u;bþGø¨"Ë5Û(fšE^K’-ï’có¤+sšßìÚwÒù=åø‰Óy#»<Ô¹A™4”ÇcÉÔFÊÞ°‘ƒ> endobj 3441 0 obj << /D [3439 0 R /XYZ 64.9134 727.2935 null] >> endobj 1158 0 obj << /D [3439 0 R /XYZ 64.9134 702.3869 null] >> endobj 1162 0 obj << /D [3439 0 R /XYZ 64.9134 683.7762 null] >> endobj 1166 0 obj << /D [3439 0 R /XYZ 64.9134 653.4316 null] >> endobj 1170 0 obj << /D [3439 0 R /XYZ 64.9134 624.4709 null] >> endobj 1174 0 obj << /D [3439 0 R /XYZ 64.9134 594.1263 null] >> endobj 1178 0 obj << /D [3439 0 R /XYZ 64.9134 562.3981 null] >> endobj 1182 0 obj << /D [3439 0 R /XYZ 64.9134 532.0536 null] >> endobj 1186 0 obj << /D [3439 0 R /XYZ 64.9134 501.709 null] >> endobj 1190 0 obj << /D [3439 0 R /XYZ 64.9134 471.3645 null] >> endobj 1194 0 obj << /D [3439 0 R /XYZ 64.9134 441.02 null] >> endobj 1198 0 obj << /D [3439 0 R /XYZ 64.9134 410.6755 null] >> endobj 1202 0 obj << /D [3439 0 R /XYZ 64.9134 380.3309 null] >> endobj 1206 0 obj << /D [3439 0 R /XYZ 64.9134 349.9864 null] >> endobj 1210 0 obj << /D [3439 0 R /XYZ 64.9134 319.6419 null] >> endobj 1214 0 obj << /D [3439 0 R /XYZ 64.9134 290.6811 null] >> endobj 1218 0 obj << /D [3439 0 R /XYZ 64.9134 258.9529 null] >> endobj 1222 0 obj << /D [3439 0 R /XYZ 64.9134 228.6083 null] >> endobj 3438 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3444 0 obj << /Length 5357 /Filter /FlateDecode >> stream xÚ­<Û’ë¶‘ïç+T΋fËbp'éÚT­/qbWÖñnÎÚÉ:~àHœ–5äX”<>ùúíx‘ éxj‚@£Ñ躛óÙÛ7¿ÿ²X”YLX¼}Xxe3¯M¾È­ÊŠBéÅÛÍKüÝo¿~óÇ·oôBÁŸ^—•ÚºEnBæÊàëç7?¿ùáGµØ¼Q‹¯ß¨,/óÅ+´UfËÂ/žß8°µ±gûæooþk¸ŠWSŸ!‚ºXh—Y ¢Ç…ÒdÎ8Kw+­_~ ¿Ë¦mðg_ß­lî—›Ÿž+êl¹¯ï¶øôË5Ëz‡}aYµ~yhèí~5ò²«ñiÓ¬«=µz¤ c§³Ò{ÂN-VÖgy(rÆ+ÑZ°ûª½³»v€¬½9¬÷´H×2´éa , •sž`½}‚e Ë*íÚ;Øçž:òåºg›$„y˜W_~ÏÐÐܵ–¥yÜàî§´w¦@¬pæ|¤î°Ïsû×=Œ­™@…žWþö·²íyök³â9Ç+ḸRσ;|8Z,À êå·ß>52ö¡Z7[ÜÛþÎäËw¼F#HT ÈÃ6ÛêFmk¤&p8 `óp·r@B:[.:ôû‚dØíù¡“Qúæ¸c²G||ÂÁ°²sjyäËZÈBÓš¶ßWÛm½=äAØn8| îŽAáð·jåyF¯ª]˼îñÏ;X…éY.ï¿tÍz¾m–Þoñ”»Ç]õL,Bòˆ<],û5’ó©~&Q!ˆ˜?¡‰œuX3ãã¶ Ýïxú×°¢­vü$ò“/ÿRÑzšö/~Ù´ü«Ë"çÖ:ÿ¨äsÚP’){ÛÉl<0ZjÇDEœg+ú¶˜`¢ÅKõXí‘×xTL$Mó3î¹&\>†×!'äW‘OšõaK-žLÈ¿¯Ž¸¾öT·ëw<¥òSÄ÷sËŒ¿ÅAÂ(8Hv_ïj™¾áq»ºÚÔ²ìºjcçCìÛwÜõOPŸ_ÀiþVá†?àöh3#™JËt€_f5jŽÌEJ–8øñ#~‡lKcî ·Ä–nù¶+óçZöÕÊîÝ;~â×H*à—RôôüP Ã8«EBáÛáyÌU ¢Ûóï}ÕGæ ´huCÒD:ט‰Òu:d¥U%©²Þ¾°%$NTôj>¹- Ì…üî}U ú0âOЋŠG|»£}2…W¤ ¹9U8²C¹CØõ®çžj‡ªN€z÷t<Ð}Iá÷ÈÝ®%ÆòNÖtFa¦j©pð]ƒ–(NØÌÇ“bN0ë 0€ðÝ3޼1@ô­u§‹c')k CümëW~ñÎdÀÌ|¸ØÏ"ÚT÷ÃîúOP³z¢1º â-/ºçªÈlSvM´)81žÑG†:Ï ¯µ}=š}FZ„Xœ,¶-d•è\¸Rp¼Ò¶î¯zŸò¹!‰!¤^ùyOªù…mv1\‡CÂ]ñ82;ðr<#Òö9z#õ(“Ͷ17Ç4©¯O )=Rš´Â:2 >tíö·öÕO"8mÃ1B2 $²Ùq×±Kt_a¦)SžÝ¢¦Ú²˜mä0±M¤PblÛ|N1ˆÓ ©tª´/3o•í ²ìasìƒ"ÎŒ± —;pPKwê“û˾±.K¾±Í´-L|>òŒ#ÀÕ"yÆ3ÜŒ'9h3.Œ(>W¿ž ˜«,äeyC #Äk(æ6+t¡ç(6í¾~ÕvÂö –ƒ*~}{˜8GB<’Óó°Þg:Øp»í¯l×ú"³ .×NÄÂû`”»!Šâ5ó<Ë}þ_'²«_vƒ(‹EÄî*ˆØ#_ªá ѳ„„+!ðì\Š£–@]é L¤VÕFçÈ„ߨ P¿ÝoiŽ8G4YôÚÝàgŽŽCNîudvðj—à0`1mÊpžÅ0„Õ ó.¥¹3~~âj 2q~ªÈL(ý¸ò93.óŠÞÍPŒ¯¡h€ÅLps…Å~Ÿpª¼Ê\°v`²ýaG&€ ™ˆî…ø07(Ø3·LÈÏÕÀ5:ÞØ„ý´ÍLªcÆ~›†îÌÑÁªãõ9ùa'v)ò÷)³dÞæ‚}â$@sÓû|á`£^—|ÀÕâé9è@I»aÙë‚.{`Ÿ/À@ ¯†¶WäÂÕë}Ó‰¥ÍÁZe¼D„£;Ó£ØTm­ÜzØø·Q?œ7Óeô‚q¶HºXêíWÚ‹yæ'ú÷Óýx^6HÜÚa7ú²³k/øf=_R^ðÉŽ—`|Ã7´~š¾¹è|óŠ®ÁÑ÷F^t˜¹“—PÖ98ÊœGÙgftÿ2^èSH%<Ÿ\‰`oׇ-îòO`Fy~á Ä=OñMÖ\Ñà‘NÃ8Ð[¡ðs.Ÿˆ)X‰w_?2ýz~QQÛîxΑ-%¶¥ ·[~Ã7ü{¸¿€p[È׉9efT|»Ç_2ÐÊ’ƒ°dê_'‡¸Þ"§H”J%ÆyóRx‘G4ñ7yÿäE;ŽS5Ñí·†C(Ö¨åKÕ÷ÜSqÇ$ ˆÍ@Ûw *LÄ6`A6<¢Š[~Õ†ÍÔ%‡¾>u½4£¸YÍà jíÚÖ{Z˜ƒ%ØÛ‰Ðà„ŠÇ{HÄ OÏ)çLÃÚ £¿…{qˆ0ç!²tAÃÓNãM³!îÆ«v‘2l“î˜e§ô¥;ºGª+kK•åÎÞÆá"ˆ«)È3t\ù’ÃåAiÞÅñŠàp…¢(æ(ž5õÜmœ[ì³FÂïxXÕ`#ºf#}Q½b»­Çè«Y>t;nô/Ò©×Q0^´V‚ö/òb.—G! ¸Å€Ñô-IG…^¡jwK(t‡Ç'á²=Ï`¬ÅG:ékJÝ÷l-ÞMÕ‘}`ëÈÂãý)»Q%ÌBtjùÇ©§¤í EjÐmŒË¢M26 6WUåhÇQýÎ%ïTÀß,òK‚¤½ËTçÜ‚wXXS|¸7!®¦ î¨?Q¹0®|Î_ÎÁ½5ÀÅ·C1B¼†b¢´Ÿ£x^Jð™Ã-ŸÙà«€(3Pˆœß°¤@cà5­–TÃÆ¯ÊШ’ó(Š:ü\²ƒb pÒ݉d©61÷dZñÎ^±“ÐŽá QÕ œSöØýc_¸—_錫ãò‡ž»Áú¦<Ž#{ñœ%æÜN»­PªëÊ·ú`9 @kÒ«Õ ‡¤nöE“œe‡™=)ƒÛuGšdûŽgÜOôSuˆT”E(ˆÁIB¯'Wtj !­áàéFÒ=¥¯Ußµq/K"]ôyzu¶)òÄ))J…ð’Ô8Iš’RõÔý:úkè\€›gQRrT5‚ú—tÞ{5„WðáeWoÎç¶Ä¾¨ò¨]ièF80A¡Õ‰ìƒü÷žnöÇ)ÕW‡!æ÷äýÎñ꬙@ÄÕ•…Œùß«H/èQP{ZÚö*ºCM[S*4èËîi >Ea#*ÿ·üî |¬ËÊBÅ(”Ø„ ÙºF6‡A²nAΠ/39õèƒî'Ä+ %Hq8ºŽíÄÈk°%Ú‚©æ8qP=s*N«dd‚€à”…¼¼r”‘ß>Iò“ËUq6À§K`¸BƒK\£´ùpgn€¸š‚LØ ð“@–†Açbú RÀAùí ^AÐó–y(ç(ÎŒ¤v³kV8“î¦2©5³ÔgÏÃ.+nº[xm³E‘)óçÜ–YgoÈ0Ä+(Z•g®0úÂyœ÷þѵöå&gWÚ\Õ0äØˆÊÌŠÚK."ìÙÕýa+y“—™.´>µ”‡¥¯ägq—™¦¡!Ç:ÅF‡ähúú¨rûø½ä|*Š?‰)‹flVjecÖN€ e(„HÁ™t4ÖÒ0žm¼;XK‰“zȘÀ¨XŽ")nÔèqó1ÍMwŠtRú“„˜æ-*^è2ÞŠ°é<‘¾¦VH@Û®Q«wä#b|ðöÖ Ÿ¾æQÕùâ5 ê„0èÜU®BL ‡ávEóì”ÙÙŒ^ô3«þða.ÝÔÀ3T>êS¨à›kgæAù#ˆ.Íy ChRò(™)Ø%çhãÙ`Q XaóåW±>,b(A)Êì:Ôs3¾?—V«8ÄN̵—ßžÏøÌÈ—ÂŽý¾‹l›ÈÂ3ͤœË'š6 qXŒP^ŽÐø X8N‡‡p!®¦  0¨L!Œ+ŸÍº‚ÕW ·C1B¼†"†™õsß[GŸJ;œUÈLI!áß(ðý W†°VG~óê·IºÂÚ;zW«€ü%5Õf3¹#PaNbßj´(ë}7-Š„!£%Ùð ädüe—ºÛu•C]$ßÏ«&Ó²á†Ôñ¼Å–Ãýn5ìl澎*A%Bý#Á¸NVË}¬0Zpô1Ù%a6|óUË/öO1GÔ5€ã)aâËådV:¬oˆx¾ï#Ýn¶…9*jŠ_obGBÝö@üRÓQûÏ6/Vå ƒÞ‰…KÌûÏâj 2á?c&ÓÃUpvրŠƒRÃÃqaù™«Èð@¾ÍvŸŽ³òqfš(éÖ=¼ˆW(€uAྠêu?M‹âÞG©‚b¤P,µÉ‰D~î,â«9Ga•càì!|‰½»z "D›ãBXþÒT<:ΪەdN…*ÜQ½HCšöy"'(ÉáD<Ùú4—8îæNÛóõv˜¾³FÃaf‡kÓ‡‡"âj 2Š÷Ë—å¸ò}ìŠÌaáÔí°Œ¯a ª$¨¼˜cy† @-XíMªJ“´A±âÛ»±dÉê|VÃÒñ3à`«†äÁAÓw;Š ¯P 6³¹ËO(–°á Ó¼óçÄ ‚b£±3S€Ù¼:€åîD:öÔ¤î"+Us[ª˜¨Žœ \|¬S—||ÍURµ)z§”ºà™ú Œëç‹“)ô£‡:-|RíÎ6÷ÝóEœÐB(–pÝrfüâià¸F½”¯a4©‹ÐR¹¨ý×xÒhY±¹íZ®éñGŽ¡èÈX©#(*ÝÇ,’ñ¡~?†%†ÔHhoN!Œßµ;®G=>Ñ=Áô‘oÔŽP ‚(Øsõyàc€þÐçõGþJˆÆx’W¸Tg`eÊfÇʄآÒ×¥‹¡ð‹ÆS<<-ã/íÑeBs­ð¸¦}x‚@\MA¦êŠ,h4×qØyãSf¾°fZUZÊG3e+%ÃU¥îÒl°·çsPÆ™,àqÝŒÄ+$0Îgy¡m’3á&¬JtÀn†b„x Å€)¾BÏQ|ÿ¬GÐ(´… ÜWò¡1ò/ŸÙžß %Iœ\’<–Š\°ÅÚ³Fýë~W­ÆœÄÄÿHð¸,:nì°ãðÞ˲»ø9ý̦$ÐX;;›‰~ÁϯO?çz*WsC”PªÒxÁOj“θéfµ^À ¯7øR)Â[Si¾d 'ƒ.¹› ¯]£»ùKÃáT¤}C‰‘õçê±iÉ:þÖðÏskƺä•7~ù»?ü»d:씵uFÛ¿äÉöŒ·¢iwLÒZ®t×½IóÌ™¡Êaâ}#×–JU=Ú¦ëKœ."s‘”•gZk·Èaš*nPT®&æD«Ì¸2 ë’èà%3Rà„Lu(ì¥|\/ÞBS 5ÓÆéøÐ)ªâ70ø¿%væ4dmœÈ-»az9UQ?ƒ5NŸ…‹±û©šfˆ³Çÿ±½œBYDø]\G:ŽœHb¸«…Pÿh&/ñÏÔµ­¥+u]àKN,'uæ(çó0ÁM¯H •t†›Ãf,‡Fò¥|Z®x-ùb[j§:ÉY瑱\j,ÖŠÿ$áO‹¬è ú¢”æî¯è~¢ÙH_êMêÂÀÙãÄéO³ˆ\ ö"%a8ü¡£ï:d¥×ÙY°f,зç>¦ÇOŽŠRÇê$=LÔ˜ŠÂÁc¸Û’/í–ßÏÊ‘,—ÀÏ$•_ ør)TÜÏ|Â{R/I'?ç W¬Õ'U7ÀgqóªdM;xPA»èj_íÚ¦}ü&€ÉX~ÇZš”ú¾ë¸Ñ?WXà…Íÿ»›0)øƒ‚R§Ãgߤü˜¼ðåÑŠcÞJ@/æ8Š@éÇÝè‚ÿ –“Ê…®KÜ·ã×P6QíG£„åÿ¼"B)endstream endobj 3443 0 obj << /Type /Page /Contents 3444 0 R /Resources 3442 0 R /MediaBox [0 0 612 792] /Parent 3425 0 R /Annots [ 3446 0 R 3447 0 R 3448 0 R 3449 0 R 3450 0 R 3451 0 R 3452 0 R 3453 0 R 3454 0 R ] >> endobj 3446 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [344.8071 601.4045 351.7809 609.8174] /Subtype /Link /A << /S /GoTo /D (cite.Jaffar-Lassez87) >> >> endobj 3447 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [350.9012 577.4942 357.8751 585.9071] /Subtype /Link /A << /S /GoTo /D (cite.pvh89) >> >> endobj 3448 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [93.9384 565.539 100.9122 573.9519] /Subtype /Link /A << /S /GoTo /D (cite.long-clp-fd) >> >> endobj 3449 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [296.3095 447.0321 323.7622 458.9873] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3450 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [352.8069 447.0321 369.7434 458.9873] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3451 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 191.9885 516.6856 203.9437] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.3) >> >> endobj 3452 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.9126 180.0333 128.8492 191.9885] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.3) >> >> endobj 3453 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 180.0333 516.6856 191.9885] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.1) >> >> endobj 3454 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [112.07 168.0782 129.0065 180.0333] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.1) >> >> endobj 3445 0 obj << /D [3443 0 R /XYZ 64.9134 727.2935 null] >> endobj 1226 0 obj << /D [3443 0 R /XYZ 64.9134 702.3869 null] >> endobj 1230 0 obj << /D [3443 0 R /XYZ 64.9134 679.769 null] >> endobj 1234 0 obj << /D [3443 0 R /XYZ 64.9134 538.7022 null] >> endobj 3442 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R /F32 2060 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3459 0 obj << /Length 3479 /Filter /FlateDecode >> stream xÚÕ[YÛF~Ÿ_!`_( j÷}›]8±½ëÀq²ö8 Î-iÆÂê˜5>òë·ª²)‘” ÑÁ}._þølÊ+~~ ·_à=Y<|þ(<üöÕÓgS+ŠëJH¯üôû>zúÞ|8µd¿œþvýýÕãë+6¡ð5¹&Òi5™o®þ{õëot²¸¢“ï¯(1ÎLÞC›ᬚl®¤DI!ÒõÕË«ÕgIâ,ùmŸf´ãDr)¼fÀåñÞAk½ ãda<¯©¢ÿÁÎ3I4^Ä»åü°Û’)J¤áÙçN†é‡ÆÉœã0NA˜°<]²–8ËEúa¶Ð1€§ÕínÊa$¹J˜#”1òMÇP#T;{0n:„(¢‹=@cìë¾×Fe…ùUp v`™íVu0â”âý²Â{dÅfz£Ïz4´4·ÝÖcáÖ©‰Ö–p¦¯¾Ûm«Ã¾\m§Ü‡`:»m‡µ R餯_NŒE*€ Ê\6¨$qxPLq"8‰Ö¨í68$Ï€ÝMÇh¤s½£áŒÆÀÔ7œZäéxZÈ87DJãÚZ~€I:A©$î¼éz)Ak‰³\dHeˆÐ~º3s°¤Œ$j9¦aÔ"‡-ƒ;J´¤GöþlWE+7Uº(×÷à3—è<«cè ;mF…ïXXfñÝ1ÜÀ±ÿW‡D³VØn3ª=ø{i¨Œdœ)®Š¿|ó×ÐPŒ÷:›LúXÎfpãmrÄ” eæCar åøéæî榟ãalØyŒ±›9Ä-,=HÇ^&Žó 0ñ ðG¢Ðà†ù#a ô“óç5ø&´íeP&, Bn”c¹¯A0‰áY7FÚñh,—†@6Öu³h<„ ‹†Ö4Ê!2n;]Rã~1±1yÄaF«3<½-Xç:9g/‹2éc±hpâqâS¨ ‹FÚ±hl³å`W£ñ06<:ÆØ½åÏ®F#›E¹éKbŒ.(PhP†ý' Ùà[ýª‚ G!)7wëåWÓ™¤¢xÿv™wZ†>ó&—´Kv¤âÚ¦½FWª6HP·I¯x8ðÙ»)謀XÞ‡î ¼i!‚‡önÑœÆ÷þÍrŸ¯áÁοrˆ£ŠcéÀ­€•UÝŸŒIM‰2¸X$]^šŒÕg¹ÈS~IHÍ Ö@Z³˜’±#C[pVió€Ó }á›\å kbìW½G5­@;‡ù”›âírsk$íIUüs‡Óþÿóú~ç[û¯BOœ0“ô½Â×nÃøvÈÇ’õÀ£^âTb™:2 #ݲBÅ‹T!z¿Z¯ã‡Ñ2ö©Hðš2pàvÂwV×nÓ¥¢}×—AzYÁÂàùì«I$è–gйƒ’£ƒå;Þ[‚R0b>ž´#Úý®´ K©,A)à´°Ú}‘TŽ`¤ÕxpPõbÜÕ¥%(A¡«…©o8µÈÓñ´ ¦‰À¸·5 N¯'$¸0)šž—:½$p–Kì€(5Xãmˆ](a@ õ³3š“Èa»Æ¥ôÆÏ(@IÁ ãjLèà8,eŸh|¢3íUÜ)êƒáº‚P!øç–réc9ˆAÀ‡Èw—Þ†2ãý LpUÄ üt³#Po85ƆSÇ»9•Cì ÔþŒóOÂfuÜᇬÇ@ã³ËF¹ü±4¹aPŽy¨lÔðh4¬Á ¡ÁH¹mƒ=­54bC£aˆ5rˆ}u£†Hãý“ R*#?C$j‰àʶˆô·È"®t/2écÑhpC£ñ¿Ëývµ½ýÏU(ZüNxð‡Ý.4ªM¹^Búi6ÚX2𠦡Y>˜!š±¡Ù0Äšf9Äó4èè4ksCHj+KÒJÜÞ±MeÉe•%I[•%¦b9úÌ}1×õP3Øcši&þ¤Æe™Kè«øÁ2ˆÞ„ô *oãÇCQ΋Uu·.Q%}±e Ó‹IT^ÄÙÝaíÂÒ¨g ð—û¯Ç”kº²º¸NªON«Ý6¼ô‹?;¼·^„;X´YÕj€«mý—…9ܧü¦¬ÀÉ}½Zý[ ¿ö£P?ò"¼;‡ËUª7¢\ëM¾o{ ËCS_ÂñÕE½¼ÞáZ¯w+¸Û%GûòY{ÈÏöhå›uW]ÐM)M³ûóãï®|ñÃÃ_zjP²9`D—äÖ—Í$NÈ©`¡ˆä>' ž]czD”Iâ9”FÁªãlå¦ü€–ÆäåÔÓµÍÅš¥€€AZ\?òšå“è0Öñ€$zn¡ˆàÓ³¦ô‹JAoÊt(‰¢{ßø¸­ëž«ä*¢$¼&žŽÀí(~)¼õ®®.g‘à%z¦ôoÖ¾ÚUøLºò.[=g#×ЖiË’Œî –wc44ÑŠòË+þIâ,ÙQñ—œ¦Uóåþó‘ÇG½JYñ2”±½ª¢KÅö}µŒï‘Nmt/r‚p.L¯G±‚pˆM%—€år$y³L੎Ǧ®¿ÚãKfÚ›c¡«Ãc VËš9¾žs¸‚ ÚGƒ˜ž(‘hßD0²ÎCàV•bÙ¾®mëÕfuÀ½¢¸Ð…¿ÉܤòLß®~‰]‡Ç‹åkÊäÖ;xHé èþáqL€ÏªäB~÷$¯‚ä%Ä/oð­{,»âÕÎozóû(ã¿·¼Ùílå6DžŒq¢ª£íθÆ‹‡;ª¼£ò¥Â{;ì®1ÜjüÛ>¼uد–Uxì#7øëƒ¾äò>†nex´I€ÀÊ‹xÓïÝÕQÓ¶õBŒyï#&„Õª‰ß]Ü7qó n— *܉Cx»ÛwEçG‘W·;07.ÀÌ)nlKs±'³\b‡ÃSª™h>üiÞ§[±âÕöµ²÷û‰Ûò°¬WEk™ßRùÞ4Ü—Uš*ßénoýöb¼\¤I;¤Æ<>©wÝ¡½nÒøŽ£…ª7Ò'Êí"<¨÷/uWøàü6Š[MãF¦Ÿ…c8q¬Öµyðr—vr(éבhÅðÌ¢Npƒtíw‰CâRÅ]×ò?Ñöý^pÜCÁê…Ì#Àn”–û2à‡&ïZ“9~»øÞe&¨Œ!þ*ý‚×%2á6uqæÁÒÍ “‡ˆÙBË5±A=xÂl›"ÀFˆ` öçSô/ªx‚øëƒó§q'Ùû6Ÿ}À]]Üe£öú­"ÙX›làŽ…”:~ƒû¯°î<ƒR#{—n\¥(u˜XLuìåkO’8ËEv­’0iDó匔-ˆ0V,í‡0 <PH¤ Jl\mËÛå>-‘­y™iˆ tŒÓÔ멦5ûÿžŒ‡eÕuúw 2或ŽõM¸1øŒ˜pÈ !¦‰g¹È.O* •—ÖÝú& R=¡ãALÏAÄ.TÈ6Ä8m˜ü½iwN¢²D¹4áíGËjŽŒ_ùIôQK瘧P§Óf4ƒ™ ÇSeÒ\¾ü%³\bGÛçšïöÌ™SD*0¾$ð >‡ ×¶/›°çÝ鬂¥š×I\u?÷®yÏ‹Å5N«ž£V×§¤žŸ HG秨ŽÍ}HµO5¥ú\K{ÏߟtéàÀºlý«¶Ž" ˜’dl¼¹HÏ̦ÆþwƒçŒE@†jµq#"LÏA”höšuÚKGâM!DVš«b¤ªž°²[ÂêClu $ È¿ëÃ]ÇNBàÑXh·Ozy“ð±AÕw¸‹YEŒSŸôSËì'¥Ôv39Ês?G`ÆÉãYôOeÏ6Ÿþ˜áÛÔ•9o¼“Ñ<Û¦Zgg*!óbâl·Î;F¤UeøðànyF5ܰ^`tK7‡w§§‹ae‘Œf=/¯¿F‰³\d¹9’›µ1.÷`²È‹H¡¯Â†Jíusì B!ªÈx F#gRÚÏÙÀ&FÛš¥dÙiÖ±ƒ…?F–é—?MÇ\¯|³ò‘$‚…"AÛÆ–û<_îwÖ»xúõn¿\ÔåOûHO)˜_0«uµÝ»•DàÉû?*—Š36bŸIãS¯Ù°Úâ÷h“À3aÝfNÊĸÃq.‚7޶•ßÂãHÿ[›a™endstream endobj 3458 0 obj << /Type /Page /Contents 3459 0 R /Resources 3457 0 R /MediaBox [0 0 612 792] /Parent 3425 0 R /Annots [ 3461 0 R 3462 0 R ] >> endobj 3461 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [422.0817 221.6608 436.8043 233.6159] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3462 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [464.1462 221.6608 481.0828 233.6159] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3460 0 obj << /D [3458 0 R /XYZ 64.9134 727.2935 null] >> endobj 1238 0 obj << /D [3458 0 R /XYZ 64.9134 373.011 null] >> endobj 1242 0 obj << /D [3458 0 R /XYZ 64.9134 340.2866 null] >> endobj 1246 0 obj << /D [3458 0 R /XYZ 64.9134 113.6879 null] >> endobj 3457 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F18 1536 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3465 0 obj << /Length 2664 /Filter /FlateDecode >> stream xÚÍ[[oãÆ~÷¯Ð£ÔT³s¿IŠíb‹8A4´Ìµ…Ð’#Ñ»Ùüúž3ä ‡âÍŽg‹&ÀЦ†‡ßœûeôÕõÕ›oíʧ¹^]¿_iIre%ÖR¶º¾ýym‰Øl¥týÝaÃÖûz_T›­býa£ôº¨žÊæÏ,[qͯê\ûÆÛu w“pÅ´ÙürýýÕ7×WlEáÖ½•k"V«ÝÃÕoW?ÿBW·Wtõý%Æ™ÕG¸¦D8«VWR ¢¤áNuõÃÕ¿"Ám ¸MI~…»å|d»Úq"¹~»ïo/ñM(e¦[6Àç14™s „åáï xà6¥8„gq®ïC¹«§KˆŒ1Â`£ù0FŠ “„[cû(ŠßÿC} ÿ0ÄÚW3!‰¡ÜÁ‹píùiç5§,ñßÛF}„ëýûæÑÞû¤#V[Ý>ûvHÜ¥o¿ß·¤j z_6×»'TÌ“(§ƒ/ýý Íðe»ò8À9¢- àÇÅ!ˆŽr–O‘â‚8„ä„K*â2Š9BYÜŠëìy²«÷`ÄÞ¢-am®Ñ–ïZ¾0­P°¤åKˆn¹ÓDkáJ€uQé©ãY~À‰DC+¢á•AŠK(µ%FqÖG ‘í ‹CŒ b……$ ˜ ¤Ô~ùõÆéuù€J„­jUï<¢Pl€"óÀ…8Ö9¡W”Â: Ò¥–hÍÙë(nS’# ¡’P ¹m\6¥W`ÅBÃòA — ‚PIâ„f)EËÉÇ–àFP'Ý{q’À~Ñzþ.ík™Äã‚’4Žòëò¼óáÚ«™Ï¦†êäRÕ!Á[®U¾ª#¥8]uÄUZå‘ dÃ.àsB9mûø&T L_S-óaŒ@¢K5ètz(ª"x„C´osÃXkcŒüÃHcnJ "ds凢À •Q—"Å>p©ˆ3 ø0RŽ@þ$âöoŠsy»QØQðŸ5pxѵ†ì°l®¦ËCC„≚©[üfxÒ=®äúÑ×=øU¬{¶’ñõ?}9ã¿Ò>š4%ån߬6˜Yd°ÌÂ9µ¡6iJ¨´o>oöusñPì6ܬïQ å¹Á3²_ Õ–Ò³âgV® f– ¤fX†æ@ ¸MIŽ˜ÂóÆ–=³ •ú¦€?6l©ï»òÜ3塨ªP>_VÉ3 œ–©6þ—_QÄÛóÔ¦ð`²ÎG|­—Q+-¸Ë½œÉÔP5€”ñe\ABDn¦»|4-À…Špùò\2ÌÄXÆú›g¬¿%$tr¿ùú[R°2Éå‹êï"mgž ÊÆÔ°œ,¡S$¹JèùÝź·½ýá\!ÅèÕÒZi‘<òêZ:Pܦ$Gjiíˆæ ”=°¾–ž,šó±4ÑüYºI$/(çóÚ,DMøïÿ¶›”n#—)̳&šB7³Ý¤¸2_7)%9ÓMêaüSݤ| þŒ†‘ÓÍ Õ½´jÁ0,pX´m¡g»ùCž›‘TyçÕûÔÆê4ˆ*ˆÕ,æ¢ÉVzqšNÛG²›lö1Ë¡Î>RÝpwi!ÜaV–°óÕ(nS’#Å¥ÎöQF 9妰ذ„l&Ö@q «ÄJkúX«ò¾*ËtÆ~~Jr¦Ÿ—uöÙµdÀk¢ÉXo°37³W# 5à-óí5P\Ú«žY6¶×AУìÛ˜|(#Å”œqlG»>ʛ㱚˜ HC$v‰zÚøçgbi6ÀAec6ãl %93ˆË:¹ù¾öXHzœP“l ¸VÃó ‚Wì_‰”áÂd8ùpFŠ 89cƒG*z8«ýy¬€ÒnDFÁGŠKqäÌìck C:éœÍˆ0P\B(%ÑâBØCuä ™­s²0P\ñÙj©ÇÕ±MV¾èq—s"k:°@p-½vïœ-Jëœ>"!9ç#²¾ørÎGdÛùˆy°ÑG¤`_*C wÊv ™0ÖD™Ê(“”äŒLâ²éxË„†ÔXóŒ(Å%”xÍIÙG‰ñv*¶XF´†”;Ô@q ª•ÄRÑG:Z‚“ͳsÛó0£ÛîáÄÐ’xI‰rìù…A1"¥9µ7!9§½aÙs´7ÊN{çQFíMQíýrN{³Aí´wjÐÞiÐÞ©3 ’Rkþœ‡ Ž%šQ“ïPBJqúPB\ÕU?§sëôÿqüÀéÑ {¡‚Ó07߱Р‡ÕÃdÕôÑqk›ÙžlîTåC8>ŒËÇæx”PË×v(5Êññ$‡=Ç%¸Å!(D@Àa‚Ù Iåº.~E`e³‡¢ù¸Šªõ~L€ÓÒ¸0@÷Ü$Ä3røv͉ђ¥ÓHl¯PbŒr}7u}ï»°Š :x—ûYʹ¼kYÛN1ü¯ªêSóôÓ¹=%îÿò†ÏæfÝÞô½ÎÍ÷µŸsTÍß­#ò×Àqÿy9óÛ¶0mÞt=µn$‚˜àI…ýǰ½ö…aÄ8±$<ÉãY…]xÑÍfÛ ß^…ŸS´[-. §¡0WªŸÊœ÷‡»0Óùöë8ÕTÝÀ§‰£ÝÓÙhÞãž´TäúÇöÒ»¼}3á¢g5íN¬fåó%‘Ü´#i–Ì„§ðó‡<к_SÌ`‹?¥èÀ…¨„ 4îÈ$ZèdÔ!m,ç7ËÓ¾µû²õUþkÐíËuĶ,¬È ¡FÚL,‰äæXÂ!íçL ÄuáôiûÉÆyäð·:cq¸E.˜È¬Î§à]´{¼{Ю*ðdÞCÓ4h‰ÀÊcU¢Åâm0µæˆÒK×wa3ÞÈ&Î:§ÁwìÄÆ‚œ°éendstream endobj 3464 0 obj << /Type /Page /Contents 3465 0 R /Resources 3463 0 R /MediaBox [0 0 612 792] /Parent 3471 0 R /Annots [ 3467 0 R 3468 0 R 3469 0 R 3470 0 R ] >> endobj 3467 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [397.3945 688.9373 412.1171 700.8925] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3468 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [439.4591 688.9373 456.3956 700.8925] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3469 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [387.2994 461.3395 402.022 473.2947] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3470 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.605 461.3395 444.5415 473.2947] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3466 0 obj << /D [3464 0 R /XYZ 64.9134 727.2935 null] >> endobj 1250 0 obj << /D [3464 0 R /XYZ 64.9134 580.905 null] >> endobj 1254 0 obj << /D [3464 0 R /XYZ 64.9134 318.8918 null] >> endobj 1258 0 obj << /D [3464 0 R /XYZ 64.9134 288.4919 null] >> endobj 3463 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R /F11 2356 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3474 0 obj << /Length 2604 /Filter /FlateDecode >> stream xÚí[mo7þ®_¡Z1|ùT$gçà"—ö¥8 í‡µ½±…“%Ÿ$7È¿ïðmÅ]­¸rL÷jÜ¡@$¯ÈÙ‡3ó g†ì›ùèÕ[=6ÈH*ÇóOcÉ‘!ŒÃHkLÆóë_&DêéŒÉäÄ~ÁOÞNÉäâýü5™ŸOgŒ±ÉÙðì¯/Þû??üðnJ™ü|²Ïøäõû3ÿã›連Mæ3+!Nùñ';öìâoöáë©æ ûÃô·ù÷£óùˆŒ1üGö©DÜH1¾ºýgôËox|=ÂãïG)£ÆŸá;FÌh1¾qÁàŒÅ'ËчÑ?x<£ ¬É¡(7ÜË"ÆÐ¶,÷ä@!ÈAËòó0È _㌶¨Y\èLŒ0cNäk0J‹)‚¨6b, C’í,ösµÙZŵ ˤœÚwÛ1‹­7Ê t¾Þy TþÑïS!'Õf¿T—ËÚÿvùù‰Íà{;j³[TKÿxi§m­ w]ÛQC×BÓ%=MKÈ5Q£ý´õ´XmwÕ °ïëU-“àaš%SNð†Ó´ß;fÄY*ò,“IJIl½Ù¬7]‚h„¼±œJ­‹ÎA¥an ZPÞŒÙ#ÐÅGi!R”óZhø"% æªE ìhQ[/^ìàÛm½ñ­ÓSbÞÀ¯ `‰îf®7~PµòŸoÏšI¨Ò;P¹8ä4AÄrR,íVS±s˜n<ÞÉhɷͰ.ÑØÓŒ°.k…=ëR3ì¾Ü×d#q‚“‘O&[”8KEöRp]CÚÙ~Å[~; *œûÀ#rœƒÅüR8ÈÁ 3h4«û(($x³b{o¦ÊSkYß¹Oðlíw‹ŽmF‚‘HÍóCîjÈDÜÑÖŸ¼ìÝmÝ#‹jX'åaìÑP@´daŒ#HÔ“°¥Yïã|Ùù¸#*ÿêŠ;fC&„$Eµ¨½g¯ã8õ‘þî¼;á0(¥~b¨bÔïÿõSóç©G¤~"2GýcCýOׇ)@˜^j”8UjD„’m¨¿C’f3´ ÎóÑ©˜vOJÖRŒYýìù*(¿'Å‘÷¤DdnOJ16{Òbµ«A©!à;Ûæƒ~1%?#CHI†`Ž˜àr€!X!ÉOÃ>Þß?_ÐOàsòì÷Nž®ñÄ § ú‰È\ÐOÁýb*}!A_Š0ÆyŒ0 ­Äã]úÏ úéZJñ!¯Ÿ†-eƒ~3²\ÐOEf‚~ ã‘ ïl› úå”\ž!©[Ûš˜&­#Òs!À¿£^#?N¡H^ovÕåbzsŒL¾:zÓíànÞßß G Ö×Ëõÿó~S_[§¿²Âª]B߀´E1ð áÏB4bȦ=¥V±ÃpX=Ú&X …a’"äÉþÕHœ¥"ý‹f„¢±f^¯ïªÅêíYôŒD™ß @q¶vÂ|j䤾³ë·]ÿeÐÚ¶¯ÛæÃÒö;à ýŽ•` ã4sa O!O/¨‰³TdJ`Á\Šý›÷*±œû¦¬-½ÔàåÀF‰C`%Ì'ëZ`cõl1Dyåp6pRì ¬3i¡~BÙdePR„%AÖ)ÂÍ!äb­S¤ ŒiuïrÞÌR\’’ÞœˆÌysÖöæïrÞ\ ìÞ›ó`oNÁvzYG=Ep¤m¾S v#q6°½R¥Ú°SOéQbàÅ袠÷­³z{åÒ)Gc>ÞyYÒ®ï÷5%!òƒÝ°§ç*Qà,•Ø“nbÌþ½mG³}õæ¸dùPo÷ºÑ-UH*ã÷Ê«5”'›j|³Ÿ•VWöémx²ôûO}ôÌÒ-D%!Aô¿ú f­C ¢nC›^OÑ:’9Gœb•?A­.˜Ý:¯þmáñ•ÿð‰õòaÿÞÅêd,vçX™ŒÕõ!FX<êùpÆFJ‰N8›ßºz@’ƒ¬È?õ¿RÈîý‘M¨¬'WËå?è!žý××þÓ€Œw^„?QõßVÒ"\€×6As&®,†•꬟ݲ{æ]¥yuÊm¿¯;Ûi ~EÖM5¬;,Ð;q3ê ·UT[WTÎ9ÄÂ1»œ§Àœ =òak!Zy•ÿØÞäðŠM}¿‰ÚߦçgÖXMPŸ»0Џ-0!†“¶´³ï»œÎüóܮdV ÛX8®n¢Ü)Ö1Ù áŠGcšÅ9¸Y†³2 Û´ßr©;sï;!#V89’çåÀ¹g[ ÖOŽÜ/bø*ÍÕ_´'À ÖÓÔˆ|OÀÖ•œ„ê¯~)(]R©Ö@^MMk ¥§ÓZeÍ”r­²Td¦UÖ›o••Sé ¹@ GÂîÑyZŒ° =…ÿñKA©ÆJÝ È[aÏºÔ Ù†\3²\C.™iȵ0~Õ¥ r ~)TQ’œI÷] ¢Z %˜üÿ¥ ÿÞ¥ ÔPŨß5~?õ[æÏR¿YŽú©È õ[O¹Tjs)hj¼Ô‚ú¨KAå|à£/¸€*‡å*ÁŸ9×ùÚš#…©é?Î%ÀîAßí|^ìnÛà´°8‹xZѤ7> endobj 3475 0 obj << /D [3473 0 R /XYZ 64.9134 727.2935 null] >> endobj 1262 0 obj << /D [3473 0 R /XYZ 64.9134 531.9442 null] >> endobj 1266 0 obj << /D [3473 0 R /XYZ 64.9134 149.1838 null] >> endobj 1270 0 obj << /D [3473 0 R /XYZ 64.9134 116.4594 null] >> endobj 3472 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3478 0 obj << /Length 2538 /Filter /FlateDecode >> stream xÚÕZKÛ8¾ûWøhc#†o‘§É,0‡Æ,¶g`vJ·:àG¯¬ÎLö×o•(Ê”LINÌ`3h -Ëdé+ÖW–øãýêõOfm‰Õ\¯ïŸÖZË„\ç‚c([ß?þ¶1Dm3F)Ýüôf› !6Ÿ¶JoŠºÚ²Mñ~WâM¹Áo‡'øw„Ñ›.öxQ4pU0ˆ1e6LÛíï÷?¯ÞޯؚÂ;?•k"­Vë‡ýê?«ß~§ëÇ]ÿ¼¢$·ùú¸¦DX£Öû•T‚()„¿³[ýsõ^`æ%f¡ÈQ[Îu%†¯µåDr)ZeŸÇè@sb©çqðZ³–>A˜ÑÝ÷º^bм„Ǩ$TøÂOEýoªèMYïá‚!^) ç04cŒX¥x;ôË~¡FhùZJ¤¶,6Ä,ÓÆžk{~òÄzs€ Aƒt½Ä%„HE6„ÑõfÖª­^‡Ëý¡<”uõ0VH(C KÈ/p>B#6Ư¡9BäÄX¦Ó§—¸`!¡ÜŽè3µä¹!\[“¦—¸Ó0"©aË‚‰,˜áC•?ZF¹Þ”§Œ¥ÆÒç¦r&=”ú9r§rM(eàô‚-¼y9¼À,”x¹¹!h3?*XŒûÁZ„YH! Âѧ—‡Ô½,ñÿ#,Å©Ë7O‘•ѵÑÝ\|Ä¥x¡RÂ,7¦êÄ=¼à2×åaËͦÙ}v™®8¸ÏXæC<ïábW’’ VäÝ4´għ€1\€—Ron§j'/ FrŸPý¨8s¬"RÁã“¡óàA|UV›!¼ë˜#ìwA–BÑÓî½q·"5”Ø vÇççmÆóÍñ„¨ñ÷¦«°Ž1ØÌJ¢!ûÒ JÉ"WòV öL(Áé)S&|1”iL1¯7êS`\•ùÔD`”ƒPHç ¸nxn”:Ä,+uá˜ÓúaßoÜ+«æ#/]ÑûøY}Ü?ô¡Oa1aÝ”–•õ|¨,\ŒDùñ8 ź1b˜Â¦Ã¤ÒP<³\& “¡Àé0Ùš#gDGÒaì%. d`Û\‚èÌeÂ1Â7sŒ“TÇsÕr‰qV30Å<ÝÚØö±¬Ýí?TÈ:¼Û±¨c]y–p¬Ýx¤~"íð3FSœ3Zñ×hhÍ˜É gJËâÅp# Š)ÃM r.Üøa_iÕ¨ÖDaµ=ðÊ·mž;Ö-5.$ÓaT¾;ʘèQ±úËVp0fS¼¯v­Uš­`›Ï‹âÿ~÷k4L=×å#ZöÁ5<fÎ[µV–€ˆ)…î:8»Œ“ð ±Ù¤²)ëù'rpˆÃÓ±½·/šö§¶åqˆb`v)•ó’eË<cj[5#aúË¡,G¸Ÿ»Éu'¹/jàúáx85uQAÙc7M‹íU»›¤C9ç—®2:PËîKÝþ‚M¢—ºË øåc9¬­ÜãƒÜýSSeQ˜¶F MPwŠõ ®–,„‚N.'Ë+šRjqg,ˆà±æÕ—z½—˜…"#^Ï$a2ç'#Â}uxÍ#*ÝþUDÓwtjZQeˆ0Æ$TÔK\RT3ˆEùHÏâÏo£'‡` Å­J§g/qAOu²¥z¤è©úoÕT@6œÝ )®Ec:M½Ä%MÑ¢L›¡¦Ç}TÑŒYM4öå†Átkõ¦l{ÌHw]¼?Eëª5J"öK^n¡ ,‘®ÓŠœéôöÃ:_ƪåo¤ŠWŽ¿©—¸„TJì%š!ÒOm¼Ý•¯ q@ý¡:4凲>÷lR)Ìê[´@¥)…’&¡‘sðú(³hdHϘGÚ[ Dú¥à‹PÒ‹–)-ˆœ³€æÃߤ 4F›ª—¸¶ÛY<€ºl(9…b×›@æ“ñ”&DΙÀëâò¢$Czv‚y¤½„H',p‘ø ögˆ+ì^âl.9‚æö®:5SoXžƒ¢Øñr¹‹ƒ·œBVJ§{+Jœ~+Ð ’Ý»Îvw߸Evw)¶ø¶lØ ÷"×ܽÖÞ…»ÝKÐë¶#~ÛÓîbp Ž©}—Ø×Âý“ÛÅ@s „ÁâסzYÂl‰Ýïñ¦)TMš›¦Ót``(²D::„§éÐ 2ïwM‡âÏj?æAÙ³#A{Gpµõ%DCko³>'JSuµõ•"J¨„Æ? œ±}7(LùK¶WÀj)þOÆoíøÒráùÆõVÊzhüÊ®Üûæ…i%œÆa¢£Ì×ÇØór¡ÄKä,K 6É…צ »OXý„)#”8Ã?*(L> endobj 3479 0 obj << /D [3477 0 R /XYZ 64.9134 727.2935 null] >> endobj 1274 0 obj << /D [3477 0 R /XYZ 64.9134 437.443 null] >> endobj 1278 0 obj << /D [3477 0 R /XYZ 64.9134 355.2997 null] >> endobj 3476 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3482 0 obj << /Length 1966 /Filter /FlateDecode >> stream xÚÍY[oÛ6~÷¯ð£ŒÕ,ï"÷–.é¢K»Ö t}P%1àX™¤¤í¿ß9¤¨‹-Y颇!€#Q䧇߹zµš½|mæ–XÍõ|u=×’X&ä<”CÙ|uõ%b1],™ÒBG.(¥Ñë‹Î/Îá.Z-–Bˆèô´ýqr~áo?¾{»`ŒEAól“ÑÉÅ©øêÓùÛ…Ñj‰aÈûØ÷ôü7lÓ‘ ˆc$A)’SÛ%‰Q÷oªè/=K^e v˜j@£j-¡àÔ]ªI¾I.·)Ðu®€² ~è œXõñjC¤ˆí”âmAoè6*ÞÉ(6â=N±o›¢9Cʈ¡â„`3!Ù€8F6¶DAÁ»Gö@Æ’Xqýta(x?:Ñ„ÂhAFè6ŠaLF±Æqе0ÚŸ(ŒÉÈ6Â8N¶F‡ìž0ö³'ÖóPðýüîè4-Ö¸¿Ù¸üYn²]OÞ¬wFb@[@Ê ôP+j??zÀeñÐ`&¬mÞ;q K&ãGøA ¦¬6]~ý¹’+"bͦ£X#ŽpdH2Ø,wH†\ù¹‘S{¯,àRàvÝu.Ön7œ¦ø{r*üiÂæÚï™Ë[hK{”¥5áŠé §×2\3"ã)¯F± ×à1LLJ–94”–\Âh?‘ìºg®Â8 6û|ˆëoªžo*®Ð=ót·à&*·?¼AÁMÝ\¢ÂY}í|×5#Ø ?kâä&õ7L+\OÒÃnÉ%ÎÖ<ÕÕ¥1$ íÉ\½8ìêu¯WŸŒ_íêÇùWïðkÈ€IˆäÌòc~Ä¥v~Ä¥?J}¨"w.ý@6*}ûUv—lv¾s¿%VaLt¬ƒGB’vâ(ñ EØg%yQqÉÓûúì)Ÿ B‚Z‹ Y vjÂB¶³…ŠN¹Í½ÓµÀ³Ü>]s1?1¶DM2ÅÑÙ)©ð¤ƒJ4y;fž¹€íìS K¥5Ê¢·ÎÆ{–6uÿ –G«º #†ŽÙ%S †Š.{p؈J¨#™õO¥³J$ ¥#W°â‘Mzxl«iˆ´!ò¼©ÕˆÇçÆmLŒf¶;¹Í®(“]¹IB}Ü9?ÓX„‹Ög Äe²çM[¢Aø]²iŽÚÛ#©˜!TÁ'3(ª’I ­ÆþO•L!ß©XŒH™jb¤°?%å]i˜Î 3WÑ+©âÉëÓ~©û±Y§7‰¹ˆ˜Þ8Ä|Ø!Zó™Ì#ŽÚ¨q‰¶‘Ê÷='É–HF[=Ÿ”\!.Û=žÀ9˲.Gç ë‹¡¡ÌÊ ©Ä1ª_íP ›wÈ@Š«¨NÂý><™¦wâ¶çqò2Ç?Õ‚A‰5ÆþÇOµâ§>ÕºÒ¤Êä°Ó©ÏËü[‹Ë¡«/¶ØSÃ좣“¼"¿·w©û¿L«h¹r÷„øŽp’²Câe1ðiØ}½PÕ›´{Ãw)ÿÕ‡TYŸË”·áÃÎwxŒ•wºe»¢×Tí¯%'Xvî¢$ÐÝ¿ ®Ì×øDÂfüÞm<]ÑV¸2 `ôsý¿÷®ÖqÇÛ2ÍïüÕåÒÚ–þu×yVµoüvÅÁÞ¤y•¿í‰’~ïcüwï-<Û“Øì–=Èasˆ±Îÿ›ã7ò×Èp‡u/teÝ›\\†ëìÆÆQQ=ÐÍy¥{\Þ&¥¿ª Û–µª}ï¼°Ðݳ°Ð´&€¶­6HýŸE+'µª ÆžNÖÛ a¿mv7 äuéR Ü]¥e²Ù_ÕꤟÝùÙd»ŠYѵ‡½ ÌëÐiÐéO8m4½#îçðkˆYÿ*cœúendstream endobj 3481 0 obj << /Type /Page /Contents 3482 0 R /Resources 3480 0 R /MediaBox [0 0 612 792] /Parent 3471 0 R /Annots [ 3484 0 R 3485 0 R 3486 0 R 3487 0 R 3488 0 R 3489 0 R ] >> endobj 3484 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [412.2021 509.1602 426.9247 521.1154] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3485 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [454.2667 509.1602 471.2032 521.1154] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3486 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [455.3829 485.2498 470.1055 497.205] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3487 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [495.8746 485.2498 512.8112 497.205] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3488 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [415.1043 461.3395 429.8269 473.2947] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3489 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [457.1688 461.3395 474.1054 473.2947] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3483 0 obj << /D [3481 0 R /XYZ 64.9134 727.2935 null] >> endobj 1282 0 obj << /D [3481 0 R /XYZ 64.9134 652.636 null] >> endobj 1286 0 obj << /D [3481 0 R /XYZ 64.9134 343.2007 null] >> endobj 1290 0 obj << /D [3481 0 R /XYZ 64.9134 312.8008 null] >> endobj 3480 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3492 0 obj << /Length 3356 /Filter /FlateDecode >> stream xÚÕ\ßoÛF~÷_! /R­÷÷CÒC{uQô¡èõòp@ÓÚ¢SlÉ‘ä4ùïofÉ¥–ä’”ëMQ¡@¬J«á·³ß73;\êÛ·—ßÛ™#Ns={{;Ó’8&äÌJ¬¥lövõëܽX2Jéü›Ý‚ÍׇßïËÃúf±BÎo¶›ýaW¬7 nçøxï3ë윶øííWo/ØŒÂìhžk"V³›û‹¿þFg« :ûñ‚ãÌìxM‰pVÍî/¤DI!Â;wÿ¹øwcΖ\E-ë›òÃ+[Ì9¶„Ó„rfÂ;=[Œ§¶U}‚­úeøFÛÔ2Lt©%ToòÛ®· #Ü:5ÓNÍœõÞþþ;t¬˜_}g>ìÊ=8œ¾ÝtÉà"†Y9‹¯ñ<ØÉqܰ²„:)ÛÀ)èþñpº`¥¦D ­3‚NÍÁÒ²þnpøÒß–KF_ª‰sÉXbª”û3êu{·}_QêãB©yá5\\ã2•ÃœŠ®•ScøœŠ'°ÚÞch”—ßs ŠHÎ\‡QBnWݹp!wH¹`ñ”e%LXž^Ôecq›ôSiã›¶=—ûâS¢âÄ(!3B § *E¬cº q½9”ïËݰx³±â‹ˆ·ºË)9͉ÒKNk¢8S­ð ZÓ 5èì®LPXIb95…ÿ;,ÅC6)ŽÍë(Åxbµýä¶·‰ùH‰Z²¡ùI”m>_DYã¶‚™[6Qˆ±Öa¨¦|NEIz¿û·ïñßëÅþ­´ÚYí—TÕ ñÓ0±"\Ùˆ56×#±âÉžã"ä§aNe›Ê¹pJX¹QéèÞJ2b™¬‚ûW‹¥âj~5̇Èf6>tq¦ùãÜ÷Hú²Ú_û3 \^f\ Ó"ÛŒÎ%_qHëF¸ ZpGÀGU\_NÒ"²™]œiZÄ8·òÌ|»_jn$ÓbP5Ño„Ù¦u.!ƒÁNšS>Á Ú¢º ÍW¬"G|˜$‘ñl$éN“$¼‡ä8L ,ß©m«†´¬ b,TÅÕˆb³JXaެða†eóɹ0Œ2Hëz*)Q‰[ÖbØrša‘ñl ëN3,¼¼ÆºlWÜ`’—ؚ®ŠñZVµÈ2F¹[¿c¿Oâ@&Eu‹¼iÚesÔ™$=ea ËøDÒS{;Nµh÷r’v±ñ\´ëNÒ®j~3Ä­äaý€Ö7ÅaœyBÂåNv׸­øœ x‚8àÿtÀËç«3 x |,a&˜g)¬„j§ÔËiæEƳ1¯ 8ͼðÐ^tµþˆÁ¯êNcÐã¢`’»\\”“ñ4DÜwTQ@‚ù\ÁóxQH>~ßø9•«}õáú¶ú{ø½¬^ìJ¿Áý)›¯ÂÔ×ûªÈ `}8ç[¿sQ¼bTM¤¥ ÑŽ·ÓÿËqd=›FõÐÒH²vðæ/#Z6ßœ Ѹ*SN• ‚-X};x½?œÈ´Èx6¦u§™ÖÜä¾bŠÎòUòHI*Æ0ÙæáM¢þ_ª@Œ6Q&ïwP:&ÄLÆ[&ÓÌæµsI¬LBáD§+³„Ón\ž°ƒ‹¬g#aqš„1âX€më²ÞÉ…ÜÚ®H‘©Õ€ò½¯Âš}|ðq½o60éT—§——OÚá¥ÉšÍ»ç0)‡zÉLefªˆã¢ÝmðûØ)¶Fæ³±µ 9ÍÖ2@…íö*ôv]º.š[ƒ-ßhK0…gòõÈNam6/™óo0FÅÐ…o ±V —²V:A”©œ~xÜö:N,îšÏ=) .c‹}€àdÙ¶ 8Ú”!¯~-Dâé?Ï£GUõ\šTUÇ¥çžÚ†–Ì€t)Ç@{jëã—¾5K ¬ý•ÐÝÖgpÌ.„£áØÄ“nìĦ“Üh%€âË4î;†(Þ`7ÇÆÑpÓ%‘ó®8Ú°íÒåQ%!ìƒÂ=®ì¼üôЬò>J{üØUÇfËêõ“ÿήÜvë›j™Wøžñ­>Ôt¹ðð°ízS;²XJææ?D¿ø2ð ­nüu—w¾éì?(êOÂaû†_5¸¦Ã†/Š;ìuãðÏëònU½¼‹§†_ñ;ß߇™ÇSüÀ¸ÞF7yçlŠ÷Å!N«‡ßC¯™bõ¿]ûøõ`Odm’¬O+õȪ4°ùUê.o‡› Ëçxù\—ä”Ð-¸¼œRì$,üz68ìPyÓON÷-` ˆ0´”_¾Löœ…k°; —t YX•ï(“ {Wø–kø.¼ù©¸}¨0‡í.ð„$óŠ$P#,_%ÙQ=aBËI#“óðíx6&踓òG× Þ§§¶-(LU{?üæx#רÔÀ·­{ ¸:©0êo7±aé\áõwµOžÀ ”hãN ½Ñ8UÍ(¤%F[3zbVÀpæ\tîî]/½kÃ34>ò5^®›2uç¯}Çïv»»ïÓ§£Ýñ’Ï>¦,.c“‰cúLç jM¶¹[–¶$\6‡ÊOjIžX™™3PLÁ§­º+qÚ½å@Lj´ÊÎâ…}W“}²´=ˆx5sm®!›Ãº:CÑA Õ˜—»±8±ÜB; gm°ån·í=“ªàŠù\ŠB‡XkŸR—dÎà—ÊÙñà )¡J䧇ÄI4,Ê¥Òd 4Yê’¨¨>­µR?…U‡Í6 ÚT:³°Ö²¶ÌŸ ˆ¾íÿ†§PŠæÍæ´ZýÜæ-:bssè3ë(ÖÈÑÙÄÚ]¼±ÆËwøüЋ(‚˜d4ùl‹ËØdB£œãkcôÅ”ÞMhE(s2#Ô`q ª†ZPÝú±¸{D潪³HjÛw /ÙHðEÂKþ.«`ϳñðâ\pSgÙJlC;Èö¡!¿?´óú@ÈÍÖ0z¨Ò¦Jƒr¬€e˜k$ÇÈæ˜ãéBÄÜ>înú’’ PÇqô³y,.c“ žKA¤$ÓÂÙHò°Ýö°‚˜a,#Ö`q «ƒÌNhc½^¿ï5^îÒl>„Áà@‰Í%­y`?¬I VI•`°8…(ŠáÓÂæ‡ãñ,›Šòdz81b¨‰À},n@ŸÎ„i ?8üÃÿ¼Ò?”¸wi¬œ³lþ/ˆ3ÿH0ÓPç˜øÙ‹7èÆKžØn E8=n¤½uô>;ØœZbw û¡ø„ÅÅ]ªQá ‹Qe⋾ƒi _ÂLž|eß§Ã1凪1†RH Jå„㉽nò‹×~8Ýþòå¾Þ|Úªy–‚À£{®ñr¼Îæ–$Žê•¯#qÍpÈñ8â4¨OÁiŽõû/¾ÎEž÷»²8”» ᯕ(Ãc}F= _!¿«¢KH¬ È%RVõÖÛ…Óóò˜æ}C÷P¦žk„è(þ¾Ô¢Ž×,ôJ¤ÿìG`Ʊ£gœBÈfÚ=;7—±ÉÄÉXŠí£fXª°LAv.µa>ÈÁâd pL§!‡œ\æx=ÕMdJ/„!TÃä hkf2,ƒ··Œ &Aà·ÁH3ìÄEàTB.Ì ¸±8™Sƒ»Z;9^C`÷Ò‰Ç>*G,Õ*£b“#Jh†=U ù 7J‡Ü(! yR o^OÈ@CU¢˜È'ƒÈà˜ Â°'Ë àH£2HB–A•a}v—ÿu—±"÷é2ˆLŽÉ {² ²A>Ê`òQIÈ“2øz*À¦ÔI–OG{c"¨G=Y™ÐFÃ{T@ oð}§n“P¥ã¹º>ªtó]¹¿ñmN_aÒÜè6•¿é¿ºúô°«ǽxSý­ÞLœ’p†Hö)Ǽ«o¯õ‡YjÑp¡žM/…7jÂóAõ¯ºÔý$_„‡KýQò c »m]01‰ö`’ÜYE$¥¦};±í+_Mø‹QØ¿8#žä1qšÇø˜ÇVëw”‰rWV%<ž¬»ÝþŽhê±j‹§ü¹Èà=ìFPáÔÓ^ÿ=™v×ô,}‡ÏX)AºÊê,TÃ;'jÔYo^ÿ]y–öWu¤k‹7ì Å˰/ÅÝŸQ/Æñÿ‚Ò!ëendstream endobj 3491 0 obj << /Type /Page /Contents 3492 0 R /Resources 3490 0 R /MediaBox [0 0 612 792] /Parent 3471 0 R /Annots [ 3494 0 R 3495 0 R ] >> endobj 3494 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 406.4523 133.4897 418.4075] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3495 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [160.8317 406.4523 177.7682 418.4075] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3493 0 obj << /D [3491 0 R /XYZ 64.9134 727.2935 null] >> endobj 1294 0 obj << /D [3491 0 R /XYZ 64.9134 297.7669 null] >> endobj 3490 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F14 2010 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3498 0 obj << /Length 2267 /Filter /FlateDecode >> stream xÚíZÝsÛ6×_¡¿P3Š/‚À훤vnÜ饽Ľ—¦´DÛš‘D‡¤Rû¿¿]|P”KrͶy¸ÉŒ’‹Å?ì.ؼ»|÷^ 1Š«áõíPIb˜ÃLP¢5eÃëé¯ ËøhÌR%T¢¡A)MÞXrõá ž’ëËÑX‘\üïþýöêƒ{üôÓ#ÆXòßKxýßÉäí‡ ÷ñÝ/W?Ž´H®Ç¨!tùù#Ê^\}/ߎ´ÝŸF¿]ÿ0¸¼°!…l+"J‡“ÅàËà×ßèp: Ã”d&þmJ„Ñép1© ©"¼™> þÓ*ã®ÊwÈ çj”áDr),5ï§—Sž&'çî×½äˆ|“]“©2»NÊeÝTùl s®ìÆx2#LKî¥Ã@;:4ÎÍŠ5¥£òf4æ:)ÜÃ]UäM¤VîEscæËÈ šMi¶1hd"BŸôb$¢h,¨ Ædj8æÐ`TÆø:;@£œ(“‰Q&Ž£Œÿ!ÊìCé_Z/ða•ϽXÅ„ 2c¦VSC´1<°*^bùrCgˆÈ˜>nSUå‰Ê«™¥fTÍlâ<ãÃ…kðP5JÔ3XB÷þ3M©]Gì8Á¿Í žKϱ&а7®ýßùáXF¡‹rc áBËMjNÎbVnØù›ˆ.E¨Öa®'ŸÁícjR°Mv´–Ó×9;}5ŠóˆA2ÍÒ#ŒÄ´ZbtBY+ÒÈCUL‹Ï”ItZë0S÷{‰à÷Ñ™Dù>˜%E•7eU;14“çlÜ]Fƒ• ‡:C‘ ìR­¡ ÇŒk¢9€ÛF×÷Î(¡ ‡(ôP­²df‡Ë›ð®öB6J”uãÁüA ¹_X™Æ÷ã\µ± g9‚.MíÞ£Ì}ÞvùáU²È—€~ê>Ü`—'lKÐîZ°åº|¹PeÃʬêÙòÎë @}ÕÌ02¡D^Mìf‹¸fµ‹m¸$všO–& D1bÒÔmûùü®D|àààÝ"Õ.TÂïQ« Rž" '1-¦¡%å­{ÏÜ8èå|=ƒ©“ú:Jҙ߀–¹£œÀöÀtrå5÷³Ú©ª'#°“ûbá‡.q&ó'²ƒÃõr…«0uÑÆÊß/Z•a]ؤpKÊLk¤–sXÁç•3ä)ì!S˜„”Œ ©ôòó"Ÿú¦Û~d˜²km±„¸—73gí²»Éä§4Ÿûá«°cû·\†À: ¦XNž¼;Òà~‰_VaÖÙÜçõ¸‰Å›..Ë ã2GwsHͪqm@f2¹+–àÙs´ß'÷qQV¾¿‚šÔÞ@ÑsP„'·¸ëbcgˆµ]wF•(†¾æ]sæ(B ë4ì±ñè&È,ªoóTR3 QÅ4æ ¶pßÊ¢ñ(Ý‹u'ÝŒJ—¸˜•õ¼z7ÊÒÍíí£þ6ð’4žŽÑx õ“ã3ôiÌm»‡wƒ˜gÊnãDçÞC4¯a³Æ"gö¥ žl³€ÊZtÕÙü#Ô)BÛ»¾ÜÞõÙó|ü<Fiò›ÙÜbhF‡·gxt¤ÿëÃ/þ baÎË»õî5 ÎÞl'ö ‘í-ÃÎ$üa)—ŒJVÖ]áTóA~ÿXú͈„ÄÙï¡HÒÉÙ Ný;SBú XÈÇN97®&n=Öƒ`¬?Á*~<5–"˜”PšfÝamγghÈ:ËŽzY6N0 [ØÅ‰A½*#)Õ‘Æb:í ;~Q{Ö˜ßçËÆà"Ô7g§ýâZÖ©ôö)ãÚ˜ÀÃŽÐvÞmîXT  ïÒŒw);ïÑ–v@lÑ…VîÒ>ž"Y†§Q"¤L]Ú‡ÎXØÝCô¼uíÝ©p8óS¥^bxŽ8úÏÛéöÝÛ¥j($#\›l÷jÂ^?¸» †§¸Å@&4Ï[7^߸«p÷bù†åçëqeñ5Ÿ¯ò›yñƱ#p9•&Ò#àVãÈœâI]ëg ÛTÂ%î,#Bé-³^G§è*N¸À.8œZ„L_¿A㸫2¶)‘\«õÈG¯œ]5ëqPx0‡è&tî¬ç$µ÷ëpzÈpù2#ûó„ŽÂ}žÄ^ì }îxÂ^ÈkOˆB>è g§‡Ý€¢UJÞ§tTîsƒ öR7è ñÚ ö^»AðA78?àÜ"•éÍ :úö8Az©ô…ví{ñ¶Å{ÐÎï`$eÂôè]•{ {¡ô†¸u€ý€[ˆ‹°•¸™„\¦z3?º(ꉽ7²–=ÞífV4~ƒíêg'ÇÕä_^Jq¹x8Â<{ã¯$áTè.üÁÜàüÁؾ2ŠË†R–ÁeÙ_^J™â Š(ªp¡cl·öžc;käEôQ/á”peÌ>k;=ùV«PÝ;A¹§j§ 2¦nú07, GïñÎÓ#mM}#„ý¡šÓ„âyº”†(ɽ•Ðo6âýMÅcضø^+<ÿs"ÞŸJÙß]Wsñ}×<¬å¸Z•«!cçÆ?²«].~OÅB²IžB·Â Q‡úkå>øê±Uè~:åEú¢Ò1”ŽeJm ÄßÝÒ±ýzï¡n,¥+Òâ»¶„¾Q:žº¡‹¿™‡úÌ83–r_yŇz]ûtWÀEGȶ]9ÍkE Ñî g+†RðÈD˜9…9óA\\‰PÆ&R…¿^þ‡€’Ö:«ÒÙ¨¯ [ù°»àÃFÙ_a±Ô×…íÚƒÚ^B§§pUu¤{f7¦¢vïTëPsˆ±°Ã®ý¥}˜ gÛÿe-Mendstream endobj 3497 0 obj << /Type /Page /Contents 3498 0 R /Resources 3496 0 R /MediaBox [0 0 612 792] /Parent 3471 0 R /Annots [ 3500 0 R 3501 0 R 3502 0 R 3503 0 R 3504 0 R 3505 0 R 3506 0 R 3507 0 R 3508 0 R 3509 0 R 3510 0 R 3511 0 R 3512 0 R 3513 0 R 3514 0 R 3515 0 R ] >> endobj 3500 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [334.4855 641.1167 356.9569 653.0718] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 3501 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [384.2988 641.1167 401.2353 653.0718] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 3502 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2186 617.2063 393.6526 629.1615] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3503 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [420.9946 617.2063 437.9311 629.1615] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3504 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 569.3857 516.6856 581.3408] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.3) >> >> endobj 3505 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [88.5535 557.4305 105.4901 569.3857] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.3) >> >> endobj 3506 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 545.4753 115.7783 557.4305] /Subtype /Link /A << /S /GoTo /D (subsection.8.7) >> >> endobj 3507 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [143.1203 545.4753 160.0568 557.4305] /Subtype /Link /A << /S /GoTo /D (subsection.8.7) >> >> endobj 3508 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [398.7177 497.6547 421.1891 509.6098] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 3509 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [448.531 497.6547 465.4676 509.6098] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 3510 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [334.4855 90.7293 356.9569 102.6845] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 3511 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [384.2988 90.7293 401.2353 102.6845] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 3512 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [392.6006 66.819 425.0346 78.7741] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3513 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [452.3766 66.819 469.3131 78.7741] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3514 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [450.0901 18.9983 472.5615 30.9535] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 3515 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [498.6421 18.9983 515.5786 30.9535] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 3499 0 obj << /D [3497 0 R /XYZ 64.9134 727.2935 null] >> endobj 1298 0 obj << /D [3497 0 R /XYZ 64.9134 437.443 null] >> endobj 3496 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3518 0 obj << /Length 2511 /Filter /FlateDecode >> stream xÚ½Én#Çõ®¯à± kj_r <OŒI¬ÀlZTKj€‹ÒÝšåïýÞ«ª^È&)@L ƒJÕ¯^½}+}¸½yÿÉ/ VÚÅíÃÂj„Ò §8óž‹Åíýï…gn¹œóâÃ~¹’¾Øoªr·\)¥Šrw Y4ÀõRp¡«ûøy›û춸êX•õn Hºq  áÔòÏÛŸn~¼½ ?b CZ¦ƒ5‹õöæ¿7¿ÿÉ÷7|ñÓ g.¸ÅWXs¦‚7‹í6Š­TÞÙÜüró¯á*c\Q~8Å¿ ’i©ñ÷TwÀPEÝÆßÄ.2F‹¦ÜÀró=~ÜTÄm%Š]×é Ýþ‰‹%SwOÛª«Ihl $‹âö)âª2Àä–0(nŠy‰ bîAHkÁw¤Æ„³©ê^eðçÜð¶ZGüûtL€‰w¨%æJŒ‘$œçEº5ÂYÁêý')Fb…3RdyèÈl³oˆ^‚ösÀš€ÿM¬>ô’Ž—!‹{\ê‚RÅuû=2]~‹`û‡d¦ Z&Š7ò¬ã‰O#}øûÏMÕ’ë,P‹Š¸g+ö 䵞î®dhߤQ޵Nr„ÓžˆúH4âL2Ô CþJ~^‚Óí›®¼«7DJ·T¢ø~FœñÜ?þO¼ô3Q»Ù?&šê>‰줋Vw‚å˜7"ËT'P9U†qî4AȇûC/`Hœ±0Ú²à¬;vsråèç" ~®˜P^濼¼Ç¸£$7ŸP&„fB;5ÜL¶ÜÔÛ꽘aZYf…Ìœ¼›áÕÁ½ÂœfÕzæu0Wd5c¼ÄªoõÎMYÝí»#½gŠ[uE3ÆK$Á´ÖöµÚX ˆáF ¦DimèÀí2Ø¢Ú¢5>£_ö–|¬- qž[ ˜`OuJkœœW HÌqÞ.’Œq5F9#®×¥z°^$Xþ>C+„ §¼"­ã%Z†bÁè)­_ æ–w$—t)°Iþ8't¯™3Â]Sè#”焞ÁN¹Š,pp=3ÆK$B,7*” ‰gíü_r-®HkÆx‰V§Á9¥šÒzhG¾Í”^>L}ócÕ®©D"濾zìÕ©îXÎb”v ­Á „oEF¸c<–„ €$„áÞ‰Ò~D1NÜÚû.¤”²ÞïÚ®/ê†Êir8¬Ñ.øíe`J›¾wP?iÁ©tXÿhñ2î=“¬·i“îÄ"x»ÈžŠ1ÍC.';ûŠ U*t)Z0«dN”œ±/Õºƒâê@SÊ&­²×SUñ‚®”óLsá§ÊÚBEy$Na˜ "±‚»3P°£äÚ(¸‘Ò¨äGÑö””ëªÍb§©$Š !²}.›6ˆMEª!$í¨(‡óªÐT&?¥s÷¸I©±Ä*o×—Ç3*A )ôi3òÌH¾ñû‰:·¯m±ãëË[kÆå­œø½WÌBsöjæN ·WôáÆ3>œ¡Nä†`˜6@ÀÕèË/Ð@+Áú)}c ÔQCDx]Œ‘@,Då3A&p¥ÆAƆQqœ‚ ìíÐZp6ÒÄh_É _¶HC ,Íìpc¨ññÏj6Ô@½á½»j4¤^§@îWÓXñ‚Ê 72¨ÌõTggBÍ(Öx#!ÖÔ±CE±(/ÆÈÀ|uOªÝõÞÔêU©]-£»¶¹z¾r¢}Œ£Îr†v|uvqN4r¤„@þïΤÐlƒÃ&âÜlbn*æ…±zŒ¦R3–2š¥œÄÏqÀ•–ùÄ©—‚ë¼ó'ÂÔnºF嘇~•Èëd$ý¼+NSª&ãïuß´ºî©ìâêTËQÎØó@Dä#½ ‡9¯Š_Ÿ225T¢ö h5'pŠ‚þm„W|`Ñ ‘2þš£¶g¼ ·c›,‹ –ÁhÒ€†ˆ_ν#FׇèŽVý4¥EÞ Qý³6öž?—Ѩ6ß—„èPœ€ÛÄrf$mcûM…¸ôP¿[ hâwí~ó¥ïa°:‚È{ŸÝA³‚®"“-s ³vÉN2)8“|ZÄ!6TÅK¯C‹¬Y•2„:&ÙWåÕ®+såQÆ`Ð?ºPiÈ" …ºˆ·Ä1,H{ÅîVñÁ-…r2Œ  ìyOGcp¨ôRÍu{†C/ÕwH3½®aRq=tPZËâsղ希dÇá%…EL³\žuB]&¨2Ý}8œyȵ(h3¥Ìø—ä/ÄÈÁŒpøÿ ñ–ªC6û8¸I¤ï“ˆ½…Á†ixì&ý#ˆ(šj›Ÿý«ñÿ˜lŸsîý…ž€ûÿ8èTgòÕ¹ø[nPþä"¡endstream endobj 3517 0 obj << /Type /Page /Contents 3518 0 R /Resources 3516 0 R /MediaBox [0 0 612 792] /Parent 3532 0 R /Annots [ 3520 0 R 3521 0 R 3522 0 R 3523 0 R 3524 0 R 3525 0 R 3526 0 R 3527 0 R 3528 0 R 3529 0 R 3530 0 R 3531 0 R ] >> endobj 3520 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 688.9373 516.6856 700.8925] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 3521 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1633 676.9822 104.0999 688.9373] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 3522 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [398.7177 629.1615 421.1891 641.1167] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 3523 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [448.531 629.1615 465.4676 641.1167] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 3524 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [284.7283 425.474 299.4509 437.4292] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3525 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [326.7929 425.474 343.7294 437.4292] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3526 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [331.027 389.6085 345.7496 401.5637] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3527 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [373.0915 389.6085 390.0281 401.5637] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 3528 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [313.4431 181.4793 335.9145 193.4345] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.2) >> >> endobj 3529 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [362.7775 181.4793 379.714 193.4345] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.2) >> >> endobj 3530 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [102.181 169.5242 124.6523 181.4793] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.3) >> >> endobj 3531 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [154.5262 169.5242 171.4627 181.4793] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.3) >> >> endobj 3519 0 obj << /D [3517 0 R /XYZ 64.9134 727.2935 null] >> endobj 1302 0 obj << /D [3517 0 R /XYZ 64.9134 568.9498 null] >> endobj 1306 0 obj << /D [3517 0 R /XYZ 64.9134 281.5762 null] >> endobj 1310 0 obj << /D [3517 0 R /XYZ 64.9134 251.1763 null] >> endobj 3516 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F18 1536 0 R /F33 2063 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3535 0 obj << /Length 3498 /Filter /FlateDecode >> stream xÚÕ\[o7~÷¯à ˆhÞ/@ÝE²q€]§›zš>(±’`[®,wÓ¿‡Ã!‡3â£5³X£@#8‡ß9üx.œ£yuuröFÏ 2’ÊÙÕç™äÈÆgŠa¤5&³«ë_çDñÅ’Éä\ÃŒñüÍ‚Ìß^¾…¿æW‹%clþú\ûÛË·—îÏŸßý¸ „Ìÿy—ßÛk|þòòµûòÕ?Þþ¸Ðl~µ´ü-?½·c_¿ý«½ør¡9ÈþyñÛÕ'W'd†á?Ò!¤q#ÅìÓíÉï'¿þ†g×'xöà Fʨٿá3FÌh1»=á‚!ÁóWnN~>ù{ˆgKÊ‘ÀšŠj†;YÄ ²6sBý•Y„ #—åîà «ýèïè‹ZzE—Ò`„kD¾.˜"ˆj#fÒ0$‰ÑÍ‚½iÍ|ñìy¿[?ÇV7Mš±N)Õ©šRÏ…HL#J•(‰¤ oóíÚDŠ T#RV­ŽHÇêµ·©ÅcCÕôy.ј Èg˜)pˆ‚Ñ%vQëôܹX *æãĈäV#Æk:ÂÆXï¶ûTxRHÂ[n\Œ³¡šÏÅ£МâRhû, ¿ Ž §ßß’‚޳"’_YÌ- üˆQšÈ–ëß7.ß¼Yƒ?ÔP3ú4(‘vÂv#œŽªšþÏ…P˜@´—¥…9R‚‘>¡¬›™DªhŽj¤ÊâîH5^ •õF ‹,» ¹Š×•ºK›Ix¦¢ÀáÏró5Ñyñ(!‘„ Ì-jpmaÀ„5騮·5>7åümª¡¶fw>W[Îg‚…ÖÈÐBÆþÑß#§ÅÝK¯µ;òˆÃîB.¹Ü¯Ÿ,«ìvx|çÛ•™ïÞ§H…å’7ƒ8r3°É›¡övÎn‹zëøLB‡Pq Pa[h ÀÄ 9Ÿ6bùÕ6Fs·1  <ÛÜÞ[RmÜ v긑5”*çõt~.$‚O‹Bþ!¤BÒÐDþ1‰HÑÕˆ”ÅÝi¼½·‹%Uó–Gk½³1»uR–g¦<-ÔÄŠ˜ ôªf‰çºü”B·ˆ1=ÝgQ!W4C5reQwäÀ.Ë>MÄT[A‹ ¥Q=EŸ‹kbÆÞ\Šoœ"£¹>tMùÍR?YäÐ ü¹Lbãj ªiú\DLÉK±a$Iͳ2y¢ª‘'‹º#Ïv<É hÄ!¡Ÿ@jz>—¸E8ä ¸·ˆ üJRg"}¢YªÑ'‹¼£ÏzÉ÷$ù3=vUS´>ú‹N åiÓùaÜpÛ»ÐõÛó·ÛQŒ çä™§Î`8 òIDQ%A¾"?=M¬#¶‡ýj2–óZ ?A¡ ÈÅðC¥Љ£ðŒˆúoT;K ZªpT±º»N¹[ !Ã"–4"2d°Woµƒz„3¿ßù““kÿá&Ü7!Ø!›;wüÈ¿º¿·÷]Acï^í·»‡ÔÑà@X)ƒK:ÎqÜ a'Yyxëëµû®ƒ `ÏûOv!ÞÞÜ)Óêðµmó¸wý; Õ]²Sëæìkoéà"+Dl-õ ¹_}iÂÆÍ1Qw‚E"l‹Ø–`æ\–±ÛÚÿ?Œ5;BØC6ÐG5;¦.É£Ê?ǘÏâàÛ'ù¦2Î$ÒLsG'g±¦_àÿ¸lVÁ·+6¥oÛ®8 {àÄ™4ñSÁ ½2 öpÿ¯u»¨+÷mÛ²Ôö´­Ýww~åWwŽAš!¢5é3hÓž¶â¿¬#º`'ÝË! %œl[Ïwâ›}ÿ”kÝqgÛ›Fªb›,í½Ž†^B+Í‚Œò‹n·Þ´Än·B3Þ7¹‚!å(l®…žÅ«ú4¢‘‡Lé‡r£à~¨.{\ÙÿyÐcÈÀq‚£‘SB0"Là q‹<ÄÈ(…íeHãz¸éƒ¹>€*ÂÄðŠP½ÄT©!Ð)Ù‡úq»½9À¨ ‚À!+bôK EšCùÙ7ç«›G»_´ékêÐÝfX‚zDµ¾“X4G$vE[¿¦dFBÍq2ëomwŸâ­¿m=ÈúkòÚ¦pë<Úo½·´]„Î9wqkÞ»vÎÆK¹ŒØÓtí\Ʋ#.#VBÈöq÷éÐmp@bŸ¤†ÑOæ¹—¸ŒE&xµW˜÷q·±ßn°‚ˆ‚ü²V/±„Š (WXëÇÍ—!Dð—HR]¡XÈm](%í5¿H™ð‹¥ÎYå§>Öî8‚†ÒÏ`äÀaÛ'Út32YRûÀÀTÄè%–0JN\’>ÆId†ñS5ÈAb2å1&UÙ¬T2¤µ¨¸ôAb £TƒB#f)­```ŸÒ§ÅPˆaO[WU1F"s¡Ð+‡Âj»P˜ÇBaŒq ™¡bX‰zƒÄdJ¡¶àB•ÍJ¹†™xÅ¥K±§¦fĬ™Á ÛOßO1ÎË)<žÚ‰z9F,2“d„aÅ,£Æf0ú<£‡ñ˜D£ä.ÓÈC©FѬ!5¨‡1$Œ>ÛH›uRºq^N7ˆf«˜nÄ"3éFVL7êa éF£O7zI7ªAîÒ<änÍ’ƒzCºQÀèÓ´Y‹éÆY¶úÙ°Y`30H*$¼e,0åŸíÝÖ…ùaãþ¶³íf®‡ÐK,a´¯ÆÑ‚÷1NJ74RLézƒÄd[`i%ËV¥‚A|¶K!6 ÉèˆMã\CÂ"1:È5âÿ|Æ! bBÕL8:‰¹|£UN7jì²,ÀlDÊ5*áRÞ.Ó(´K4jìòŒ,Àf¤ :)Ë8+¸d®ÇD×sÉ‘ÀœKöÃÊ.¹ÂÎ%ç1—c<Ê%ׂ¹ä,äà’KV .¹Âà’óƒKNÚtÜ%ÓAÓrÑ%[É¥¬é“#‘9§ì‡•½r5Œ[Îc ~9Æx”c®9òÌYÈk.™µóÍÕ0vÎ91xç¤Y=©ÍšGÁZcê^¹DûõúáSÓÜ<þÚ§[¡}䮌t«÷æúçâëý.õÎ-ªü³ïAHú§ëÛßáø¦ë¬p xK/=ñ>B6ÿ¼ºy}½|±NÄ)Çæ¼É¨û*õv n@YÌ´M+ þˆhÎ*)Ú(ù»mPšþ–"m_)É‚„nªxÆüפ1]û™!}¦³÷Ÿ¼A…}>ŽõQ¥ÿ3ƒÆ?—O½ñ’"Õ¨e]Ú¼(J—¬{:Å®ö‡±Ø¨oMÔ_¬½Æ~H'¬kœ`› Kµß=Æ/þ-ðÉÚendstream endobj 3534 0 obj << /Type /Page /Contents 3535 0 R /Resources 3533 0 R /MediaBox [0 0 612 792] /Parent 3532 0 R /Annots [ 3537 0 R 3538 0 R 3539 0 R 3540 0 R ] >> endobj 3537 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [169.2169 478.9803 201.6509 490.9355] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3538 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [228.9929 478.9803 245.9294 490.9355] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3539 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [467.3101 384.7338 489.7814 397.5856] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 3540 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [320.1118 371.6827 337.0484 384.7338] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj 3536 0 obj << /D [3534 0 R /XYZ 64.9134 727.2935 null] >> endobj 1314 0 obj << /D [3534 0 R /XYZ 64.9134 358.8116 null] >> endobj 3533 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3543 0 obj << /Length 3184 /Filter /FlateDecode >> stream xÚÍ[[oÛF~÷¯ &s¿IÍm¢Èv»îSÓÅ¢m²èJtâüûž3Þ4"•„ Š~ó͹Ïðøååų·væˆÓ\Ï.¯gZÇ„œA‰µ”Í.×Ì-1‹%£”Î_–‹%·ór[¬v‹¥b¾Ú­ñ‚Ï÷Œ™olþž2Y¬Ãã+¼Yîà=\­6»€TÄbÖÍ™Q‹?/¾xsyÁfþc ®‰tZÍ®î.þºøãO:[_ÐÙÏ”gfŸàšᬚÝ]H%ˆ’B¤;Û‹ÿ]ü·\&Äeò%®ŸóŒ´ãDr)¼Þ®_–åöÍãýž-–Š«ù“/~ WÍ#ŽkèJ“IGŒ¡ ÌU¹;T{\>ŠÃîÌ- aVò8º=é²õ(iâЪ ÒÞÜÝo?ç€)áZ™#à eeˆÂÆ¡$¶JM­-¹aÁòò2zrø0R„Õþhûð‘—pD´ìM ØÛùòû ÏÓÊO$¿ëÕö0 =´áØ9ÞúìÿÈòþó[Y"©ø~†Çˆú,Ã;_|ß'% ˆï;Ù0„jÃN odN¬,2K€X`˜ûò%¬öE{ ©Iê™·pã5^Êyñx?B]s8l@Sáþ{ªè¡ð•MwCù5aOÆýê&ÎÅŒ€ÑÌ h¶d’jYÏß•U€«[¬Žªœ@ÆÕ<)ÎÜsȬGKæŽH¨oâ8$І²,è/´÷ÍÇ…ÒóÕÖ¯ *17¯c²Âñ9¹C9Äa>y’±lAŒeí¹‹G/$”ñæM¦#çå>M ä>èïû"ñ3üÞ•¾Fü|W>’ô,H¯oO—·…ÞWÌÎï÷ÅKP?ïªÂgйù=(ÛÌËP‚†‘­v9‹·GêURÝ®"†7)¼¸‹ÿ»ñb]§I@ºŸ‡ žÞáúíëðüPnƒTöá7Hiw±ã‚¼tªÍj›¦¼ZzqP#NAIqd(»+˜R ƒ’¿)÷oXwx“{exÂz¸*Âuu/Öå.®é¼¼÷P¤^žm"ŠƒIí7«0rTBK# j(€ E¬ÑþüS¯ÿè{A¼+œe{׺Ó%±/6¸³H/Å™…õä¶.1¸z4¯SI­g ©™¯‹*º1nWðÎCR¼È7áf½±íÃ-/Ð" EKzðž‘q­×¥¬Q‡¾Ž:ć?!WázÕ(«ÍU¸=h†ÁupX™¡s޶݆©£23ã¢)ìc0@cÙ†ÀÐ Ãàž‘aÞÕ»:æõ‚í:ï“| £Äq–äÓ\iN,SgC !‹™1 1Ó(‘šš³¹¼˜jA/¦XP(†3»-¢;¥)«O¬L|T†%ÚÐѼOìŸZH'ÐÐÂêòÔ‡hî ì›À/b4Ù¡óãïóxó1ü.CÚðc½yWåþ3kà™ÉØ6¹l~”’&-c ÂIV‰^±.pî]CÓg=¨Ü …¼ÛqÞf1q Á)=cL'H5ÜÊ+PªHÂh¯\‘sFiŒËi™ì´÷¾AûrßT®6789¿y¶×‰v$sQ]û¤*àsÌiY×MåÖËÙ¾d{þõÈÂôA k¶ õ:‰$U!ЇŒ ¤}ZO«ÐÃQWIvÂz0„ ¯Uë Kî×è ÜW«›­çP-D}aO¿÷ïw¿‡IE’å¶¼‰Ž«ž“„ªÜ*VŸë*26-ðDƤ u½îÐ1°GJ!Œp§€¡åÇ'tþ.Ñ1çøìîB&`düÝ; «—mÈã:†¶+hföÐj¿ÞìVÛMõùÏ,]âœT¡ ¶+”©“ æ”.`Àd ®GÌ© B;{zÁâä‚å7,ØÂfBÉ ×Ç– [ åàVg¹a[Ôæ'@,ÚÒ R#Ž0TCZ³¦ËÒᘤ°;!Ç8FQhb„î ±ÜÏXÆVÆ ‹[–âi©™p ql¡¢SnÔZà1§’OÈ0!Ž1t–Ée—á]yl,ŠëØ„.W#Žp”f(wz*sY é×èJíºe(XHtZL™EÄ¡$G…õ†¯'‚«e-¦#˜G K¬€„Õ%˜Wl´±÷! l Þòg# §ç…ßYÞ‡½]¬2ÒjfU&ÜãJœÒd,G-¢vb‚¤Ÿ—mÈŒ8¨Ä2X53÷r Öj?dƒôwS2NˆcŒ­0=ÆÊr{\Y@MÆÚkûöÊ""Žpä°¿uxfÜáX|\mV (îU°QSjBaÖˆcD5#Æ Ý%ºÝª§áÌý_™œD¡Üpñ§b[#ްŒ-xOõýùضð;,¿·ãœƒšøx¬ÝŽƒ„ÒëÄ!§‹£r>·ÙUÅM±?­O n&c_³çA•¡®Ã>)!ÒMì0 »"o­0 cù¤JiAi% ËWfö™ ‹£ÉH&Ä1’ hI¯K2ìÉL‚V×ÿí™$"Ž1µ`ÈÚÚ.Ól&xΘ™På5âGÎáª'ÌÓ‰DcÞÑfBž qŒ§çqÒõLI+ æ+]÷KÂ@`Ò-‡½Êt!  9êa#!`:†ua˜B@‡anÓÃlQàÝé(FÀ1†’Ã5]†CþOa»G§$šǘBÅ)„íi;_IJb­‘Óq¬G8rja©L—ã@%©ˆázBשLjBÅiµÔ]¢½ ¸—<¿.ÃHn WS€äPHÃNî_¹" Ö0!Ç„8Æ‘C%…mq=Ž'L+âL{ü73MˆcLAߌñ.ÑœA½@´†âp:Š qŒ¢°r¬Ëñ´I;g§#Z#ŽåRÂÞÇvy¶Ý«tÁ $b.{g¯‹Ã~äØøÓ ÿõeôsò±IÇ–ÆÇz*´ûf)$ÀeñX°$ÈB®™7³qú¥Ù¼¾*v-ùt?RÌ£é¬Í7tÚ r§9‚‰õKxÇ£#cƒ·«û[?áGþ¥4ºé%0&´a<øönâç·ôýÇúÖ ø7u±¥6l•Á÷SC“ÿ‘ú|üƒÔy‡?69Ýâ¦ÍÙºå ¥5öe=ö IE‰1ª·ƒ»¼Ýø¯ztžþ=Ù ‡–7Úï8â¶Ïšî=ÿ^æË°1ÄÕí{/Ã3Ó–lø>ÎÅìŠ áS)Ëu_íØq3ê‡`:Èøy¿ É¿’Òg´…aÀJÜ{·^Ìéö Z ÙÆò¢eîÇÊ„}Ã| ò¶ØG)‡þ¼+4¬Û Ð™ ö´Iѯ7=n™hÝ®ör“oW“uO|2ŠUø§þ ÿ)Ú”³ ¹cS½®§ðm=Û^ Ãf0‹Í`"u[áèq ’øÑLw-¨£‘Œ mr!J‚»·õñ<5ç¿ÊÀ F0f`;=–DÃö´—qh¨¬K=¯N-D|ùŒAw y•r§Â£Ð¶C|UƒÆ©6lµ€±Çmµu«Å"ßz|vY`9ᚱ骂àé¢ ÊÕå§ú$µUü~ßQöìR¹p­0¦X ™Ýü–ŒCnË|â…•ßx¡¬àJëÉÄVËMÈÒ .SL%9¢LÓ_m=ï†iñ³hÛzý›m”æ­F ©—ò< “¨C˜ÌÂZ€§-, Ê ÁŽƒs˜i*n o˜›Ã-;Üò'Â&æ©øÕ€Ãh”Û.Á¸Yý¥³}éüå²éxß`Ÿ}luó]oÇ»PÅêŠ<ó!EI`(äd’©‡%Õ!’3ÝÍùØv¥c ˜‹d`!Š×»ÿ›«± ´÷—‡§ÝCÖ¶ŠOç~-ÀÓî— »ßTÜj÷ä–ܯÍ-{Ëðï_•œŒ^ 8ÌÏ‹©Â¼-‚繟üNÞ…80d“I¦– W^g¢#™¯ó¾”ÈÎô>\ýßÃñ-endstream endobj 3542 0 obj << /Type /Page /Contents 3543 0 R /Resources 3541 0 R /MediaBox [0 0 612 792] /Parent 3532 0 R /Annots [ 3545 0 R 3546 0 R 3547 0 R 3548 0 R 3549 0 R 3550 0 R 3551 0 R 3552 0 R ] >> endobj 3545 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.231 545.4753 387.7023 557.4305] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 3546 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [415.0443 545.4753 431.9808 557.4305] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 3547 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [169.2169 425.9236 201.6509 437.8788] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3548 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [228.9929 425.9236 245.9294 437.8788] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.10) >> >> endobj 3549 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [387.6205 378.103 410.0918 390.0581] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 3550 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [437.4338 378.103 454.3703 390.0581] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 3551 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [203.5881 102.6845 226.0594 114.6396] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 3552 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [253.4014 102.6845 270.3379 114.6396] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 3544 0 obj << /D [3542 0 R /XYZ 64.9134 727.2935 null] >> endobj 1318 0 obj << /D [3542 0 R /XYZ 64.9134 317.8913 null] >> endobj 3541 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F7 2007 0 R /F10 2084 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3555 0 obj << /Length 2581 /Filter /FlateDecode >> stream xÚÕ[]oÛ8}÷¯ð£Œ©Y~<-ÚiºÈ Û™¦‹fçÁM”ÄXÅJe:ù÷{IŠ2eK”³aŠ 4²L]^ÞsyxI¿=›½~¯çIåüìr.92„ñ¹biÉüìâ÷‚(¹X!™,4\`Œ‹÷ Rœ~<…OÅÙÉbÉ+Þý ÷þñæô£ÿøéç BHñ¯¸ý«½Ç‹7ßù/ß~>ý°Ð¬8[Z á‘_~µmßþho¾Yh¶?-þ8ûivr6#s ÿÈ!•ˆ)æç7³¯³ßÿÀó‹žÿ4ÃH5ÿ×1£ÅüfÆC‚3îT³O³v—Áâ26ùÖz†Ò×HC§œ9×\^ìãSaLÔ®Ù>‡Á$ÆPÈaš†Ï{ð‚Áelñž2`Ę>¼zS=ì„ñCRk“agq"Á iªÈ>ÆòßXàë»þ ·“ÂbÞe›¯ï|,•_ï!XÖ.„,VUiCf³ ¦hü× |Y{[ýQ4HE[c‡ÃGŒÙ¼ÓYœðe ®¹î{ç|µ½XoVÕºy^zµX * 2ì-‚9’X궇¨õ‰š,©RH @ à ¨1wMO¶à³mmÿ¿cÉqJĺ·`‚ŒtÜ–ƒ­ö2<1F`É¢Xë†Dµ‘år„ð¶=t"åˆrJ÷BnåÓÔ-8hµmÖ«Ê®ÖÎc€ÍA4‚¸0¦²§u¶39Ñ[jÒ’˜~w×›»fµìͺÞì£eòŸfÑ#OýÎâ26y–-%¥¤¶ÜÚhÜ)ˆFØÆn>—ÚH%˜·lŸÍÝ$gtÛ9¹%L"º!ÝpNô££{QìÒ¨ çæºÜúè^ùoCÐÛ?•¿UÙüÛÆ½kj-ÔýÇŽâFÔ¯lÜHújÇØYÍÃmy@ b'8jùdJ‹ËØä%(…3¤ÑQÂNÕn"ˆgÎa¦dsð32%ë<=˜ˆ ¦€‡!xûc}¿¢ ÈÂ#©²ñß·*×k“ízõšY‰âž­{­)¤äÕES^9‹ÛqšDÊF“¤£v4‰=•¦Ih™‘&‘ÉMbŒM“abxF¨ÁâT©Jö¡þé¤*[2»8L³9[¼6c 0Õ”ªÃ)Æ[UW+·Ç²y5ÌÖQFp²ñ0ÙÅã>)åÂ#¥\d2%åb°R.›K_HH Ã@ær’iãÎ4Vé´–k#ÝÊ7›yZñVïÍbk¿œvf®Êñy)îK.>¤ýÓñ¡ç ä¼ÔµÌ7/Å&óRc7/­7vÂßgÇ6™ôó9ù…,v„†XàxB S¯­(Yç~¾½}¶¤ÃÉäÉ.î‚<îãqI¿{$_ÒM&’~l:éçséKIúà$¬å„ŽŠ" óæãCú»&ý¨/ÙøôÏŽ±ƒÒI?´Ì˜ô#“©¤cIúnlÓI?›“Ÿ…!¾vÌ.<1ÊΑŠT°⇄ãçÓ¶¥ß¸)ýZz î/0’œ‰–2'‡œ‚E• ¡&V_z»ÍµãÔ¡9j×`œµÍ)³Ù‚M˱0Î-ÜÖ…n)Z­ÝšÕf L˜ºéÕÚù²XRUÔð¿.êªì<`ûÿXºÝ–®Þv70Aìè»sôÓ†.bobìvܼP.éÙ¹íM½ÙÕI±]µEßÂrëÎ9àÜM‹î¦F ASòÊ9÷x»ºj3 Q,ÍÁ\žÊOÁ>o˜2‘’ —R`#~Y0ZÔÛfõe]¹9£Y0R<F1îoýýãçv³ÖN%uU_µ›"Ûò²­Uãc°Ý|"ºËKÞ 3Hsæhd[Ú}eIñÓÃÅ¡`áyd`’)Qœ×nïnáêÍ.ü¦´oî¶¹ì‹À«œ‹öEþUd€Î T V|tWÐRcHì,røôô=Ó`q›Ø3%Ü.ÙîÍŽ:UuÑ~/eF„­Á)€Œ!‰9í¼X_^–ÛrÓ¼&CR#i°îÐÙÂÈ¢¼±cdwª.’Ò/„4¶Ø`b6TŒíÅÛix ›Ã ¼Hòlu;‹ËØäÐV7G˜K±{óذQÀ ù ‹SÖC^èAìÎ&Õ\j(¢òŒxƒÅ)¼F *™êã åÓÃ}|e«Où`ƒ()ÇH+Jû(«Þá†>ˆµîó»òî܉uG‡°ÚÛ{Y$ÂÒ‡Q“ˆa¡òF‰-ŽFéZD? )‡%c>|Áà>òÍ€°îáë…þøqMAˆRÕÎç5¬Èqú„iáú Ý’Ëí™Bˆ¶_¯‡F’­å” T\‡ƒ0MíßÒ¬þcµPé­_¸MÙf½9obÕ}˜‘—ÐqHµp}Ýîß:P;øNH}…Ï÷ÝášNlÙ×Õ^R!‘ÂLîVÊNXy 畚¶V(êÅž²»]þàŽ=Ñb­>øÛû"φ~$ò Å¥[ªÂE¹:_À;®ý'·/½n¿r²þîUuºžKRœ]».õJß’ù¯ÖWaƒ®]e_øF߮ö‡«A C*Ô ^/\k7ï•íÒàʉ«ûÍW^`mýÌX»…BçY»|hîâ~uïñØ;—ÎÌM{"꺕¼õí§»Þ[踆uÓui;X%‹µÝ¾âzì" Ù0AþOk60á ¢ “%k6T¤ßóDQŒ,W&ÝÛn×ëîqÉî‘|ÉØd¢"Ù›®Hæsé ©HRíÑĉE Í@ØÓt¢(îW6n$}µãFì¬du²k™¯:›LT'{ÿ§EùüB*“”J{n˜'K“@p¡»êV˜Þ«ò&œP-O FTª<Éè•'Á¶Òk“ÌP>%%‰–¬_›lAR3È^h±ò¯I vÛ ¡Jêë‹=Y8yèéí‡g©Þ7Ìþh¬rU7Æ„ýq¤ÙZfdd2Åþã1¥òAíJM@ ¥zP÷J¤T¶xκ­EIˆ6éº-ÅfWó]ʶ#ªžA|·‹–PF¥O)£‚CX0Âùʨ±ÉDµkæ¢ßæåMóš Õe¸A”Y¡ùj”4Q:c‰2²˜¨P†V‘ClBøÛTIÅÊäƒ N@…¼Á¸$=¨{éà‡vsõ`Vðjxw6ÌÁ4f»– B÷1GkÀ½Œ`_̵3˜†Ê€بAïŽ-!€`ò9‹–öw_šÒ|5ËÈàxÉ24Ú£Ãi$ÛË߯~€E‘4]ÜôkK!‡òOi~³õÛÄî´«üµ¦¾ð6€ÛÒZ[Ó©CmgH%j‚˜ìç©oÁz  ÿáÐæz §R©ì~˜×õ°;=ÒíÎö Qþ‡k¡ü4€Œ#©éD)"›žú‘›-À;¢“5©ÿTþÙuendstream endobj 3554 0 obj << /Type /Page /Contents 3555 0 R /Resources 3553 0 R /MediaBox [0 0 612 792] /Parent 3532 0 R /Annots [ 3557 0 R 3558 0 R ] >> endobj 3557 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [449.2113 556.8328 471.6826 569.6846] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 3558 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [320.1118 543.7817 337.0484 556.8328] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj 3556 0 obj << /D [3554 0 R /XYZ 64.9134 727.2935 null] >> endobj 1322 0 obj << /D [3554 0 R /XYZ 64.9134 484.7213 null] >> endobj 1326 0 obj << /D [3554 0 R /XYZ 64.9134 451.9968 null] >> endobj 1330 0 obj << /D [3554 0 R /XYZ 64.9134 166.4607 null] >> endobj 3553 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3561 0 obj << /Length 2612 /Filter /FlateDecode >> stream xÚí[mÛ6þ¾¿Âm´bÉáû§Ц‡‡ ‡n‹m?('ëƒ×Nm¥¹üûEQ¢Þ(ï™)²é¡@­µGÇÃyf†æëÛ›¯¾5+K¬µº}½R‚XÆÅJsJŒ¡luûê—µ!fS0Jéú‡ [xØ€^¿Üøÿã~w·)8çkü`ëã?»§ê„Oåî°³®ðJ›5ÓzóÛíw7ÏnoØŠâ¬VÉÕÝÃÍï7¿üFW¯nèê»J´Õ«÷øL ·F®n„äD ÎÃ7û›nþÝ*¤«‘Ô°±ªZÜëbÖB_WýÍXG|”ÏëòïQÔÕ<†7úªŠ0Ñ A¨öð¾vöˆ@3ÆÊ•²œ(fM½ÏÕú eˆ”Ìë~ß9 s±væß:óïð¡ºßžüÚ”þ×?6R­K·0»òå~ë;ƒÐÁ~ûÿl¤Q_ðÒ~€èDµ*$cÄJ _øç "¬;XF„‘f›ã: ·*L Vƒ¶íÛ¸úðv;É™%‚ÑHò—â„qÓU´‹Xå#@¿´¬q{:O¿RI_¿AU’PfEF¨AãTe“Zõ¡þQ»Î~ûå¦ ×Ï5b– —I"€|>àøÌ„@hÞýDc©Ñ^ 1@Y™Á?Î! ²F¶´p"§#@#˜1tSü^Dÿ\8;ö'q¶äp¸ÿsšû~¡àïÃ}@PT,p_ ý)x.ýkw®ÆüÇ2 @é©ùÖÕ_§jWîýßû][šù/Žqdp¿Ÿ+¯àý®ºãxï·õgCëM9wþœgc¼PFŒƒ@ñþkHÔÙ :˜Ç0ÍÆÈªÙbHr¥º/Õîp®ÊÚ½Úc–b‘kxôÊõ4m4±Ê)žZ¢XlP晙ͤ…™Á‡.GÞ˜e&Ó„Q¥˜ ”`báff:5º½ÿjïòtÌÙ^îmd"^Ïr#š×u¦Š¸‘´UÇØXé$3fØHe*ÅÆÛëb“ÀÜ"§sX6?‘&-¸}¹m-k¦ˆB áwïήu.}a.‘”HÎô|.1DXv|íu#§&t¢° ÙYÂ2£x#ÓäBÄÖ‹ƒd/J”~hLS²+¬kѺ2f¸ÎŠJÕOyƒŠB±¼}S0_)ÇvÏ•åFk9Ãäx5ÓL’™©L19ÆØ2ywp†=5d~–dr>çgrŸ~ÜÚ¨0agxR£Y‰è¬ñýÝìxªÊ—»}íÅÕ†³õ‡1Úx!ê÷þùâGïªß;ç>îošúò´}å˜PŸû•Õ–4Ìc}U½G¶§ˆÄ ó ŽrW”èÀÑñöÆÑˆRëŠânÁ\¿¿i5±Ê±o1†¡AhÞ\û–‹`‡QÆe’nbá«aK0¥ÀµÆ8Óƒ‰±¯øÄÂƺR qŽˆ„PµôíÆªõöÁ­‘+FöÍÊž§b*ºU.ªáwÐDµ‰e£å _a‰Û\ŸÜ[E¬rÂT*”ìFN-›p+¾fиS"ƒD&.›‹[ÿ˜0¨Át¢bù«‘KH †òÐx£ÿÅ0`DѲAá\¤‘ŠÃ4Þq~µ„r®2 pr „i6p€¨öœp.,1:§Q[KhÑø”Q=mÕX‡Á &Wëb˜þ­o¶ç»º^ªãMØ-ŒŠ×é£Fq,SèÆøÒµ¦ ‹XãÄfТk»qSáe¸Ž…¯O^Æ” Ž¥ ëÃlÂËóhw3<©ÛFb©è³óÝñp®New¾;• $ºµâ¬yeâðŸÚŸ«ã¦šžâÖýÁ×Ûßß5[a÷S©îCm=} ”VƦaÆ{pJ Ô3‚Ä8Vº&€~»áëÃ×ÓñÁÿÅjsÕ¸c²‚(ÞîRfv˜Ï€XX E×·÷»³ß?,mµ®¹SïØÔ`•¥ý)ƒ6ëóîa·/OþK4ÛÄAuU¦ž/¶Ð¹¥0H*L¢šjy½¿E¬r*ÉQFÙnäˆV¡’1ý}¢áB6Sq«s®wPwu<©MàÊN@ÿæÆ¬ß–nƒÅëN´ò‹çD^:O›<Ò¬“”YÜ;*Áœwõ–G(÷á`æèG ò†5nõêïën ¾0èÍ4àö6VZÖß@º™žJ§¦=FªîCûæ?øõ»pšëjôþæòì&>S®ÇÁö™ƒâΆOuí¹”˜à=¥àœiØÂyš0àò³ï´ÇæÈux6q{xгqòð •Ìwx«Lô0^Òj˵íµ-@ ͶÔGuÚóùÀ9©äTÐ`b:aÍ>øsnµÇæÈ’&îb@lãt ’c@¤2bŒÅ€lP»†ÚÆ€ê£:îù|à‰ôõÀº' é¹…ú÷9:ÆÈruæÒ³m騛îe]ëö•|]ëXe¢kÝ›îZç3éSñnÜ4I%å‚w…qØÓéZÇóÊÆ¤­:nÄÆJ¦ªV2_ªŠU&RUãÿÔµÎgà'R ‚4dtgaªk šíFø×ú±]ë1ÛÇUîÄxÓìÖ*W¡:ZÿöÇfÌÈþHeŠý1ÆK Õ|PÛBuj(T{P…jºŸÏ>f3¤ëqH7ãkbMÓ1ùtšñâšf<ÓŠ(›±«L4ã[±:HWÇs5Ù茡sñåÄdµk÷$檡è½ç4.ÍUã.ÍõnsÝo˹Éâ\4_š«œ+„ BÙæÚj\˜+I$³ƒ¹nÿ[ÞUûÓ7˜¡.Eé¿ì ‰©P³ŒWb•‰+ ­Xçì.ØÑ¿×4Õ|§k–zP¸€`6såbŒ|¶ù.1®òÊ3h\‰ù…‚Ö}œQ L²*Ĭ_éUF)·Á…¬³9Ý&R™r› Å ýß”Œeßj\L%ìü¬ç( ‡Ëˆ3h\©8V&ŽZ1δç`$¸a—{·:§çD*SžÄ¢(üXÏÉ>òœ$øÎsbðËž“ gç9iœ­çÄ8ž3J|Ö¸|§?æmWw³ ÿˆ¬½L)œ¿K„úiîÅøšÊOÓ×TpÿæìéË›·þß§û3¦sh‘7•p¢í·-ôæ)|Ö•Äñ> endobj 3563 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [270.1041 401.2206 292.5755 413.1757] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.8.2) >> >> endobj 3564 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [320.9085 401.2206 337.845 413.1757] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.8.2) >> >> endobj 3562 0 obj << /D [3560 0 R /XYZ 64.9134 727.2935 null] >> endobj 1334 0 obj << /D [3560 0 R /XYZ 64.9134 532.7412 null] >> endobj 1338 0 obj << /D [3560 0 R /XYZ 64.9134 198.2 null] >> endobj 3559 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3567 0 obj << /Length 2957 /Filter /FlateDecode >> stream xÚÕ[moÜ6þî_±wqË÷—|9$sH‘s{‰´MŒƒl+ÉëÝtw—C‘”¨•D­^[À-QÔèápžáp8~rqòÝ3=3ÈH*gïf’#CŸ)†‘Ö˜Ì.nÞ̉ҋ‚ÉäÜ^`ŒçÏdþüü9ÜÍ/ÎclþôGhû÷ãççîöÕ/„ùë3h~iÛøüñùS÷ðÉÏÏ_,4›_VBxå§—¶ïÓçßÛÆÇ ÍAö«ÅåÅ'g'd†á‡´©DÜH1»¾=ùýäÍ%žÝœàÙ')£fŸá#f´˜ÝžpÁàŒ…–ÕÉ«“ÿ4‹ ±ˆE>±š¡t@5ÒPÄ)gµjÞÝâSaLTÛ­‡¯Æàc(dˆ0MÃý¼ °ˆ%öá)BŒé«¾”×ûÕ×·XàóÓE!¨˜¿Xîöþò5´‹¿kS$¬(\Ëø¸(¨šovvRöð›=߀‰ªÜõµ}°YCƒëÛr¹^Pèf{(è]ú«ð·²=6÷ýÎPˆP0Ì=€ó>D JdÚ?ÿ´r^n—å|zUyˆ›w’Á r­&ú¢)GXó0ørëGYý~ÒË•ÿ&ŒÌ?vVwµZúß-˜0`ZFÌ B‚ÖÒ_÷?/e˜ù¯#û|Vø¶‚2°@ìföâCU«»þ>îMÂÖ‚õ“°s]üP°ëáfµž‡ë¥H)wu‹cP…xÀñûöO9†ç $Bëo&@#±ˆEöF„"í‡-Àër{³\—«åþëw´¯nE`¶Yзå‰ÓÀõ~ Ú¬µ èR!vjo(4û¾V%Ï(jÕ­ùÝíÝu ™/-\ãòöã*4ßÖ¿=K@bᦚrƒǦk' ¸È¥›aëLo7õ„ÂUõéf²r‘Ÿ8 w èÌšÈv³­ŽøX‰aÜÖq1…‘“˜DÜhT–{ƒ,Þó×ÂÄ´&#‘ ªqÂhdWã¾DB½,½rK§î×Ò³uC×BÏ<’ ƒkD±Ìc7 iILwxËõn_®÷˲¶˜´LÂò¦YôÊ·2³‘XÄ"û`™4HR°ÆØjkÍï¤ a_̧Rk™„sP©÷ojÍš!̸˜°f-A•„ÜËš×±3‚5k묻tO½‘Ã#°óUåž­7¡Sð<àYÌ|_‹y_mÇ© #’ªi©ëfÿõc¯ŒÀ*LpÔó›$±ÈPˆ©¸!]Œ5좳\ï+PªËÎC\6LŒl ~(ÄPIõ1GT*>Xeqó’l¶]kÛñðŽtóᕌn>™ró1Ø 7ŸM¥Åšl^¨š Z$±ýÕ½¬ùOuóny#žHfŠ ±nÒn>ôÌèæ#‘)7cqó¯Ón>›‚ 1¸€ØMÅ?°AÒ'¦Fwð”ÓW_oß¶{·å…ûÕ²M\ŒÚz„,›­'GÛÚz<Ü#Ý~x%£ÛD¦Ü~ vÂígSéC±nÆLèTâXò{[wÚõ£,h²‰ˆ¥·{·@æûÚQ܈ƕI]µÜˆ••^BÏŒë@$2µÄ›u`Õæ`í$§×l þ¿0%¤”ŽGÞe 6ˆEû(=Ä`Ô-¯uè’™«ª“YHc$Qž?gC¡7"ðkóÎɶ‰Þ¾,jóÐÓùd¢eÈ0Ú™·u“Ƀhkˆ¼Ð£tŸ†¸M´q[H0[EÄBoåÜîA@GçÏž6{œC1Îsüá°§o›ùˆøS?ÂûxòÓ¼=3ò>™â}Œ±á}?[Τ@˜žj8UjD„’]¨Ÿê]ðªòÞé,íšrY@~Ï» W4 ´ÈÀ¡×anÛ@ ?-€7›í¾¼Z®jZîŒÌ¿ö¹Ýø?çßÿuþ³?È´4Û¬6ï}̹­n,µëCšrïnFRô°^hOe4²=Å€ça0ÉXñÑSë0Cä !ÓÕH,b‘}»"W¬ý²E¸­VuÔÎ`:Ã1ÌÂ`N†«ì¨­æ` Xdm85Z­TZ özp¸/¡¤`0ÛŒsáNôFΫ[w8 Yc,ëX-–ÖóCcGÑcè§ÙŒ)P !ß~ÝH,b‘jÁè$EûåX-ÖþÃï…{˜ ÐZ“s8…ÙH¤(ˆé`^ùE½³‚¤J‘|‰a—ëà}ŒÞaÿsà@¶g„ÈŒ`½À)¬Š" º‹5,0ý5›ƒöyF˜Ä œ B\Au_§añƒ!C¤˃îÆZ)ÆÙUXHš“q‘ÈãB·Ž#JSVŠs‚'@Slµ©@RÖY•ȇ±‘8…‘J$¹P}Œ Ê)~v}ùЉShÁ†¹¶4ŠÑŽ“Þ„x5ÎFâNÚdž‘¾VÛš¤î¢IÄ«¶´«³è=­v×õž¦^6C^ìàc•ã5[ Ü+…íz¾š­XâxÍVÓëp•|é¯CƸÜîFj¶(„â®]ˆt½Yïöm–ÛijÑÖmÙk[® RlC½×ÕýÓ°ÂWˆz®a]%!l³Øw¿Š‹P©U—Mi>¿ ÅGö¦þ@[]-¡Ûf}Z¿3·¦'mTĺ¥3«fS~PÅ„¤0WPs?'HCh×Ôcœóùc·sîB‚†ŒÛ†ý¼ã¶¾NËMEuã¶Wöîk7ÛÖfäBÝ(ÃÎ¥[·óÅjª «G”˜ß„¾Å„Ãõziñ5…Cµºók5‚ l\qŸ›åhÊ4›Xõ,곺½F¹ -ž½Ã/~u#‰÷ñvqà¢îwŒ™A(ÍB‡ß ÔQmk„uÝA¹¾±´ùåô×Óß,Q¹²ª0‹ËxwóߘjoÞàSø¹<…¿¤þKü={ryé9ø¦~i¥ûi’7r»ávHè„“¡Ìn\MÆÂÐX⸓izõƒï7«»Ûõî'£‘jscµ¹ƒ íBêê6\¬JŸÂ&dàÀ'¨æðrhõdðXòiª‘8¡* *5€{XWCõƒB ¡šJÕêK½Å¯>îCÖ°ôÙ¾ÆñR±ªfŽ£h?#¸ñ¯¾_~²Î¢ò½Ê]èý•Êîoô€ßë2ÿîcS T½²×w)}[ãÂÛ<ò­Ÿ»vö2âX¶Ý±Å>“ù:Uû$ø|c^¯‰'Ýå‘ûé¤/Ñ£¾äºu&Ömxwâ¯êÖQWrò :–cê6 £HPM3føyÆ ?ÁI¢&Έ͜ #§Vhˆdòþ§½Îzã¯Øî?/Áâý£šfá;yßÝ]ûj{;`SœÚ4˜L3D%Ÿ?,¯­qèrâžõI±bsåäÓ“Õ$å;³uÜAuóJ¾ƒêXdâ º6}PO¥ä ÚHD%Ÿ(O2iØ<ÿ!jþeGÕÑÈrT'•Õp#ÖVò¼*tÌw\ILœVŇ©_¶qòøiP6õ>sjU£gÉsjؤp£H{L [­ü?€¤Ž¨%oö?SKÇA„6xJ-0gÓ{Ý]Û²O\»³ŒˆëŽ£!æÐVRgìå‚ ¡Sg齯¿0~êi=× w8‘Ã$ާ2IâÐ1‰#‰ ÇG*ÓǹÙTûPJ² ÀD¦W: C±ÿ…’Lqe.7¬q©¼ÿKÔˆL˜x<ÖãB¸ðF¾.’˜àb¤SÿF”I™Ĩ¹kœª2ÄH3.ïmÓYäÖ*!Rjj "=¥ëŒ|ÇŒeF­ÄT•Qp(n‹SyƒìÈ¥Ø²Þ 34²1 &Sðwª,%éŸSYH‡+ C¶>Ã}l—(Ac|4S¹Â¼ÃÉæ|<ýI·Žù8ILp>xLaa6œM]ag(+ŒqÞ«ª0ÛÔçsJÿµŸ0endstream endobj 3566 0 obj << /Type /Page /Contents 3567 0 R /Resources 3565 0 R /MediaBox [0 0 612 792] /Parent 3532 0 R /Annots [ 3569 0 R 3570 0 R ] >> endobj 3569 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [350.5646 653.0718 373.036 665.027] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.3) >> >> endobj 3570 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [399.9604 653.0718 416.8969 665.027] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.3) >> >> endobj 3568 0 obj << /D [3566 0 R /XYZ 64.9134 727.2935 null] >> endobj 1342 0 obj << /D [3566 0 R /XYZ 64.9134 449.2543 null] >> endobj 3565 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3573 0 obj << /Length 3253 /Filter /FlateDecode >> stream xÚí[Io䯾ëWô±™.×Î* ƒAâ JÀöê¦$Âìæ„¤f,äÏç½Z¸–º¥ Çð!ØÅâ«·~o!ýÍíÍWß™%Vs½¹½ßhI,r“ JŒ¡ls{üqkˆÝí¥tûçün·çÙ¶€ßÛjǶåùa·Blõ¹íš¼<ï¸ÙvíîçÛï7R¢¬êȰÌâòÍûÛKtÆã¸&Òjµ9œnþ}óãÏts¼¡›ïo(Él¶ù×”kÔæt#• J Wª›¿ßü­'¸÷c’ß ˜œ%äÔ–É¥p þ°|[7]~WV(`ÙíÛ>#ÓS-ÑÍž @¥{îù‡W ¨¤®ê “Mq,aå€Äò®hñ/ñä˜Ù0F¬R<–)tP8îD¥3®¼Ò³¢*qÙi)ïžYM¸ÕÙÔ»owVo‹:ø‡bU Á¥>8`Õ)Ë•xÉ (…}¿H÷cŠKMdP¥ k‡sç€úϼiCÝøW'];¨gå.’ÐÕB¯ŸÆÎïrÆ¡#ê«–ØJû_á9îŒEδ¢òSøå%‚»'ï¶šÿ÷£H®ŠSŒhŸ|ú|ð2@ÌÅ`‰1ðÆ`9Õ©XÐÂh³Ô€¢ù ¯"Åý˜d è5½vE^ü$¡Hà—ʈ ø€%Â/Þ°‰—„HÆ/AW?z±ÕÄï)^@¢¡gŸÊÿZ(¢3¹{òµžÌ2(4 ²Fñ>Tò.»T~×ÌãZ\5.ßM"cØãcCdà¯d¬ãɱÁ¹–Rz³ pùÀÇС›‡ ðª|±ƒ…ɦÝcÞK)Ïö >~v®yÁûÓš-–ˆ±2uz‰Ÿ¼¼&ºøkóî)¯@·Ýkò.ÔS P4@m˜Ý]W-øîzþX¤© í;fØêðî”ñllxjÿ¼S¤k´Ç[Øg4ñÑðÄ©Ž+Îcò³÷(ê¬*Fàöä¾®*ã$¶}Û0Qm§«­^OX3/=ExáÑM& ç{Íüª)êæX4Ø@wÍSñÕ}^µEzBd-ø6µ7¥P4?ôÓ!D®@>¢îñ’õþŽ×© ·§çGø„s¼]?UG?y>>cÍOååÙoëÓ²K“GW_ÏÎöQ¼ŠUwkoËXæÖMR/+ðN]µ˜h@(˜…ÉÑ”Á“¬ÿ#´î.©zõ;;%ÎÑ„)6žf¸@Ûo{uùw UõïLx¨QaÓCqvãPÁ³¿€_¡µ·zèLüTØS¸v˜·œùêSP£ÿ2¼í _=„ ,aÒÌ^µBdtžm¹ävÔùßçm×OnGe˱¸ÏѳªnÜ(¡tOÅÐ¥"•Ù ZM*_abq)L9TŠJñö0ýèŠÊÅéÚÿ¯ŒA+l¤]áƒô@q?&™ú ° ¢f8ù 3æßȹŠ&Çj§i5¼3EÏ É´«‡]‘…:û$o,²Nr­É ×SœyEÙZžCKE´e³¬zi>Þ.å˜f©~ f³“ð|º=î•42Rº=‚èó´Ù¹œ8•Ðþï,”Úÿ±ÔOéì7UÙ‹Š˜©LŒkäØ]PÈÛ{Ÿòx¬ŠëÅo `!¼ZÆß8Jýܸ~B˜?¦ UÉ µìͪ¸¢Çöw¡Š©õ ïݯ«B¬R³ U¸‡ÆeþóÎHŸ«åö}î¡õrvŽ…|¨â]GSÇð‚!U¿›/Z¿ó×ã4‰ ü¿o< Tendstream endobj 3572 0 obj << /Type /Page /Contents 3573 0 R /Resources 3571 0 R /MediaBox [0 0 612 792] /Parent 3575 0 R >> endobj 3574 0 obj << /D [3572 0 R /XYZ 64.9134 727.2935 null] >> endobj 1346 0 obj << /D [3572 0 R /XYZ 64.9134 652.636 null] >> endobj 1350 0 obj << /D [3572 0 R /XYZ 64.9134 619.9116 null] >> endobj 3571 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F18 1536 0 R /F22 1606 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3578 0 obj << /Length 3477 /Filter /FlateDecode >> stream xÚÕ[YÛF~Ÿ_1À¾HX«Ó÷,°ˆ×Nà ëd“I6@’Έž"‰qâ_¿U}MФd ½ˆ1ÀˆGwuuu}UÕÕÅç7WŸ|n¯qšëë›7×ZÇ„¼6‚k)»¾Yþ4c–ÎLi¡g.(¥³Ïçlöêõ+¸›Ý¼œ/„³_óöêu¸ýîë¯æŒ±Ù/áñ·øLÎ>{ý"¼|þý«¯æVÌnH!uùæ[lûâÕ¿ðágs+öwó_n¾¼zysÅ®)ü±†C®‰tZ]ßm®~»úéz½¼¢×_^Qbœ¹~ ×”gÕõæJ*A”"=Y_}wõŸšà"Q\ä$Ÿ£d˜ÌDc±ÊÈkí8‘\ /šŸ)3Èá'ŸsžµWÔ·¹-î~=ìàßþgªèsøÇB—–à qNªØåÓ ã䱂1d¹ïE„M}žŸµD)Æãû·«ÃC ¿lV†%Ùιá~3çfv;_Àÿå¿ m«7á÷šwØæÒ\ïÃÛ埭¶÷§xb0Š›7‘0ô>¬ª-é™Ò&D”£®¡ÆÏû›eW Œ&drDH¥OÕÀ/uÐæ=(.žî;Z.rŠ^ Z ‚0á\3.²·.nË5Ì×÷‡b·ï_bAIeâr¬öQ>¿¡ôW¿Ï•žëFZ‡ðú/«AiG3imOåÃ…&ܱé䓞‘Ðáĸ€žÍŠ«ÙO¿ôKÊI¤fqr½zµ%Zsä ÐKÅ95‘À–PbB5É(ލIj•KáÍ›qE±ÆÐâÿ¤(R£¦QMñŒŒ8¼µ"ê*ÊïÅnUܬ;Ü \ÕdÜ×Ïp/p‰­l³¿)Õ™÷kÌô[sb´ìê7Ëõ[P!MRp雾D㹫ðÿ~È1jÆ 3êAdޱG´× ­Ð­x™z ùXe-áæÕF¸uêZSA,ÕaÒ¨§2ä’pÉy$Ep@ècv‡U±÷ë•—@æÝZtoEz¿0j¼d±Å_غÜ$ÄY q 3ë¥k_ûò”ß§  &‹1â”âÁ+?¬îf´3vTý9òp‚]Lj´Ê^çR}ÚBÕ$Ϭw†XÍ\{©VÛý¡Ø‚ÜÑ¿Ÿ`UCxeEÖåÉXM9ɬ‚ÔÖb¶Ü!’:L*f U0ât"E”1)A¤±ïÈL:t9w©Ç 2‚+6LVO:£ß˜Û‚ƒ‹ÃC™ãOÖxÅŸux´Fg—C)Tín9¬¡ÑLëi‚Ê1&©-Qþ|<õ]áJF³–OÆC¢¸ÈIöàsÐ.æZ%f¸î,|åuQÌ?®No%Û¦ ž…~¬ç ^Có±üf;æjw(nWëh"›ýyjdhû\ì‹×ßÇvÜ7Wë*žÓ>îÊ%zö;$VJïáãq³µëÁpiÍ#–`K†eŒkoì¼±õÿßá®BKlÔì®òýaW¬Bî˜>ì{N=p˜®”*ŽÂh¨ÇÜJJŒPnð\‹1 `ïˆ:RNàòkŠ‹œä©þ2†¦ \ÝÌ ­¶«Íê]ù âDP‘25Ïz¦‹G‚L Ï• 3Ýd#Ássu‚Hjxg®ÅÃs†9,aÛ‹}3wzVnp¹Ñ­k•ìñ´€ ªõ¹F)´{ûEBùÓk‚‹ŒbL¨$TjU›/?:…¿ßëußi&s–XN'ä8禜²mŽånÍí?ûŽÁ(q*Vk‚gX¨gd‹Õ”J^&®9qšµâ¤1aŠPmì”J’‘Ó’Ô,GÎ…j2ÓžŒ2Ý(JÎô¥š2·™ªŒs[ëJÎmWYNÌ“…¸ÓÊd]Bôñ¢Üßùœ³·O)RîŒGÛ‡õÃÕ(Üp$m§«FÉ)W£Ô­º鋪XÇüq $Â\So†våcS)Vz¹þs¾ÌÌPeûL6 ¬BÈåã®ç(ɘT5w¨E¬~ÃÊ2Üá'VÁËp{x(á gå«Ùbä^``#™­ëÒðº'ëwâÛìèêôç§+à¨)SÒÄq¡ßcÖ«}š¦7cRb¨­Ó!§–Eq¢¯{¤ë¯¢àjÿPaµÐzný^/äoŠP4´‚U뛳ESõyй9? ä‹ðãÃÈj³ÁÀ¯¾/ö(ðvm!.Ìö>ñ\†‹cj;íÆ¨ºvÃñž€í¢ÄèŸã¸0OßW%Š‹œdÏ~,¾rZ6#çûªµdˆ•€õ\€{/—;oX¼4 Âf3€í³ ÂqÜ,¸¶?{,ðØLBàÄŒó¸Åð}á ¾¾yðª¯0šÂ8ÿWÜ?IÇwEø¹õ5™Û#_Û%ÜúÊܰfÕ1Ð)Ý}µ ¹‰MèJfðÝ.å.ö‡bwøtöÉFáËEc3ì¼ò-{{S­¥ƒ%™¨~Ó´¨{´„³?Þy,=Ëxž)US*qo²y<RE*>“YìÃÃX$é³mù6‘ˆ[›‘S]ŽÇºŠÕ¨ò–öoÿˆgì=I"I,µ®>¾(w'Çd²O?ô%°´2,Oÿpx‘ÙP¼í…V6lZC õ C4.A›¼Àý+|\Û¦¥.ܱ¦Jiî¨×ÌZ¹&%Ñ–q.•q&k[ ¦•Îþë3lÛ0H~Þàà«õÑ£&<ª|Æ,h“¾ÏQ-;©v| ]°~Çdx#­ƒ_Ë0`ºð™ºp¹ ;  M)CçEð Ww~ÌÅ£çªjô.rõ&œ·t“?Òà‘«…ÍYI>‹Hƒ·}´ñ­‚ºYh[–Ëðæ þ±×Güݦ DU{©æ¸¡Ì»DRÓ-ÃkhæSµÔDM‡ûCµ ñ^d5>_©Ë¾Z{3Œmêrú`,Òöô1WgÚ1:«í]Ì¿®:‰Ý˜cÝk2;ž«df¸Ñ—Õw^;æ‡cǺUw›rA숾Kw‘÷@a]Äõ¡¯tYáa‡)q70gˆê'IMñŒL¸Ä*Í:BédxZ_®d2Q·žÞ*R_sèÆÌmv$‘$‰«QǼï‚bvE©‰±uxÅ1§ñn[/©8ý Ìþ=sÅ3>T±“Î~ðDãnoÀ…ŒU_ZD™™´1§9rŽÒšâeEu—éŠr’#E-fÇ‹¦éGRDÀ©ÚÊ3 ò‘J½·BD=åwe¬è”ú„aŽS£Cýõ×fÙÌ&CǨ´tdâ-!H §« È(Žä Öç‹)Ep¾IêÇÊdþ X Õrú>å ©ÇVÀî€C/×exÎHYpx7eS*Óì›}D‡l~`Öi3ªˆ14Áê›]rÈÃÐëÏxpÂ8ØÛd–U“bÉÀ\RN\ˆU:Áý]µÛ…ƒ¿Ò«ü~MpŸ€ó.Tü±Úò¢/ ¸7ª÷ØÇ]óégH‰Y¨dhÇË,«\{ÐìkÓþzf…³ei³yÜþº­ÞnÏÕEuŽ<¦L÷udÞ³™Ä:µ±wíy:%¼®:u'™&sسxèê“6(&DXkÓ•éîÓÐÐÃ.la¿î%nkºQ*¢°kÝüÉ&1Q\ä${l¢´ÄPX¤6£É(>ryÜ%«ˆµŠ“ ú#ùˆAr"$•ç>õ!Örö^;‘'ŧ…þgŠš¶Á®ENZv%~Vع/wÕM0&+l“oöP#à3ß…†S~TSý:¨að¢ï¦â³ù<`”Ïú뀌ÏÎÇ?Ž Mµô´NÔZ27^&Äñ`Ÿ+B!üjµ=endstream endobj 3577 0 obj << /Type /Page /Contents 3578 0 R /Resources 3576 0 R /MediaBox [0 0 612 792] /Parent 3575 0 R /Annots [ 3580 0 R 3581 0 R 3582 0 R 3583 0 R ] >> endobj 3580 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 256.6367 516.6856 268.5919] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.9.1) >> >> endobj 3581 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [88.7791 244.6816 105.7156 256.6367] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.9.1) >> >> endobj 3582 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [107.4318 65.653 134.8845 78.7041] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3583 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2264 65.653 179.163 78.7041] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3579 0 obj << /D [3577 0 R /XYZ 64.9134 727.2935 null] >> endobj 1354 0 obj << /D [3577 0 R /XYZ 64.9134 430.7564 null] >> endobj 1358 0 obj << /D [3577 0 R /XYZ 64.9134 398.0319 null] >> endobj 3576 0 obj << /Font << /F8 1548 0 R /F14 2010 0 R /F22 1606 0 R /F21 1557 0 R /F18 1536 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3586 0 obj << /Length 215 /Filter /FlateDecode >> stream xÚuOkÃ0 Åïþ:Ú‡h²å8öµ°zØæJ!醡IÚÄ0اŸ·’m—¡ƒ¤‡xO¿M7wgÄWpƒf zOb¿—5©J‘|8+-sÒG›Ó4ªŠ™e7KžÛ4*ãe.Kщ–Úkuˆ;q…*¥ŒC\ Ý .b èÁN6¡÷2rð5 ÂÖŒµe^•“xO?†ÕêXýµÜüGæ‚Ak,“mï_®sy{:Mo×õ<ûT”®`Ë6—¯Ž+Ê'ÿF¡endstream endobj 3585 0 obj << /Type /Page /Contents 3586 0 R /Resources 3584 0 R /MediaBox [0 0 612 792] /Parent 3575 0 R >> endobj 3587 0 obj << /D [3585 0 R /XYZ 64.9134 727.2935 null] >> endobj 3584 0 obj << /Font << /F8 1548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3590 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚEŽ1Â0 …wÿ ÎМ]'i2Z¤ ®ÜÑÀ‚˜ÝÿR!tòòÞgûé­ |l"&›B°übp6‰:ì”mŒ,X®g’ØšF|Ð@± f¦ÊS®ŽÊhU¥a_ÙgŸ§—÷;#"t+>,ÌQ? ¯åê˜w&*•fIx¿|–Û!¯Ø›èjöl.e cA®#ÿ Û`] îð€ó…ñ Œ[`Û¥ŸU³Õ=ÞÁyµÞ©¾É fø†?Zá4½endstream endobj 3589 0 obj << /Type /Page /Contents 3590 0 R /Resources 3588 0 R /MediaBox [0 0 612 792] /Parent 3575 0 R >> endobj 3591 0 obj << /D [3589 0 R /XYZ 64.9134 727.2935 null] >> endobj 3588 0 obj << /Font << /F8 1548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3594 0 obj << /Length 3712 /Filter /FlateDecode >> stream xÚÅZK“㶾ϯÐ!*µâ>°7ï–·bW*ÙÄ““ãGâhKäX¤<;ΟO?¤ ÙÙ²«RS5"h4úñu7ÞßÞ¼ýX­Lj Y¬nïWy¦Ò\ÈrUª,­ªL¬nw?&¢RëŸn¿¿ùööF¬2ø«B§F(½*e‘jSä«íñæ—›ÊV»›lõýM––¦\=Ás–*Så«ãÎan­”k9Üüpó?áÆÍ¸ §|Šj%tªt!‘D7®02ÕR+¢Ð¬7BÈ<ù®[+‘Œð–4'ü¿I½mñ±Û¯7ªÌ“O§_ôß¶ÕÝŽ>àFyI‘š<§%³ÕFåiYT%/–â—Â.ù_êÃZ^£ÀFœížhèÜø háÜïy-)‚À¥€?Zçv)1-–g´?™Œ¸øÝaÆ-ömßñlÕõÉnÚ¾S è\Ë*›³‡Ø…=6²&Ö@÷6Ûjî¥ô‡~Ï­§5}(’<´4O=6Ü9öüÍ–xã'QÄhÇ¥ÏÝl"Íj­“¿Ð¤vv"ëd†þhŸî›z<{nìïíâÐnw«“i“-n®qwÏïìIë€a fFƒŠ"­r˵g¢¼d­}ÊhH{|¨’dˆ ŽnÚ²ü`’çÂ!l Ž®O$Ÿ¹ý;ñµÓøMatò w:1ÈìÀ YZ d øïQ»ZØ(ȃ,Œ—~C)‘e–„ÂÁ-…¸çé¡%§üzàY:&Kf…Ϭa lo£¥BWÉ_?Ô–öOCÃßÍü0íÎR‹‚Ð{ëˆ-]oÉîÜ"ÍŽç¬;+ŠØû3 û΃w‹û&Æ3ÒÃ<ŸyTxì;¼ Î>ÎÛ…«s½$Ê(w*/„¨\#ÂAnDý`9vÚ¼èx´1Eàx0OÕvîq}gébW í$«í¶ÏL\ÍGÛºíðD;8µ<3ÉíºRÈ|œàXw-IÓAé¤0%XðÌ–™ŒO·ýL-HôU)“…Þ#¥£“gPÿ-¬6ŒÄ_ä3óZóëëÈ/tr0yàæìÄ­ý%XÔã.Es´ãÍ*ùHÇÇôÌS´ãüÃú0ôv VÿÁ³÷Ž·ž)ðâWsŸ-’·ÇÊ"žÝówu vI“–y%ç&>‚,¡mF‹¼à¶&ìxÐäiÜ#™†ÉÝû'UjDÆØïãÚi`2Y{”m0ëý#›°è©•Ð̉ã»È©Ui^y¥ºzú $…¬ÂCÓ9(üAwÆOÈü½ï½jµDg&‰N' Œs€IöâO«“ƒ}&§‡½Öéuk¿ÇQ®ñT³öŽýéÙRá´}¬– ¶ØË2ÕÙÂòÝ?ÐdÇÞ­K§ûèm2E.š »ïš xà8œÁ#:H ‡çl—lŠáÓš¬ +œ¼ã|žv)5}mº`vÈóy;.ói"+R¡ªr%+ â_Fj”4㌚0F®Ž7 ?‘î}‘Oó3nÂ))¡67?™sP˜ie$±« ú‡qW0·E1©§-…´>^ÎPavÄ6(+É[¨ ìH93hñR̺:úïCsæž‘t~"ÛÖJCÃ~3< ç~4~(*OÞ?s“÷î”E:F7å•IÊK8’R«¹”Oæ‘pÒÙẺ:t±YÎf_ ¼dᖽġÖφ“=Ö”z3KBÑ;|Îô.(`>‰6ï‹~D¤•–¥wH` 5…]¸¢ŒðeмDò†© )·Ç ÕŒx{ò¼zœ0;ˆÒ¤Y®ÄÜC?µãÃ¥'°G³Ì 6WS4戤Ÿ‡qžfhT‹|V¸‘þìNýyî¡,âÆsÙ9FÈ"»²qøX^KŸ\Úw,§BG‚zw}hêHš¸T©”Ú}ð62#عJ8èÐâ^L"³p½zí$ÿ9ã¦E‚ÙÊ=бù¨z°X„œÜY؃øuMÑðy:➌Cwa顉d¦]ó]€ä¡ Ê|.ƒÿ¡»,-3ãüÿÕ3XTÚµ'lD‡$m—ÐçŠ<Ï=g„6©S%„#î=9J-ÝÁ¢ !3ÑÖt±9ÈgæñÎí?ÿõí—¦t$çíÖ&™ðLßÄœ  Ê‹öÇoþúClv“êÒûÚÞi(üÔèÔD ë Ö“PÅ4@]½òH_R‡ÿïyþÚ·»kÌ—Áyvœï"=ñÙq>a§.s¢Ø9ÎEQë«rùµ\D{ð.ßœ—¦Š0[‘‘Ôk^s—8ì /ešI%^"¯þŒ;LJ¸ñÍ´?€…²Xš,‘õn7AšaNxÍ?Ar_çyjÜz!ìi>³U<Û rp@à/¦U« D¼J—6ÝL¥ßLÕ«K+eTáš0êë \ÔÅ # Á¦W:9§äwíãU@-J@çEõâé`Æà´¢é¿Á¯Í´|sjÇç¸UÄœyH½ÂÒ2•ÚúÐþÖ\®&\ëñ—¹ÉÚØ¬ùDs&­²ÒñéŒh#Ä•3XwˆÌcR!¼ó¦=~ÉÃÞ.(%èß]Û’ ç½ Ÿ‡ýY.Á„cp)óbî•[Ýj‹ðdáêðAPÁŽÑÚBYòw;›”†{¢æÈ/ó2~MfáP>&Á{:9-vO”M!€rj,!(.ajÒ—)¡/OARßð䔓Ä'U²Òƒ«‘Éwc,LA…¤D³…Ùø¶(±ÙBŠ’åʰÐïRZ6#·’X l‰J”PÏjëÕd€”a^W•j!¨Ðpl`Á™NöÉëZ¯Á«ˆ\‚öå¶ ý{ÕÞϸ §¼Ô{õz#Ä´r¨ø®x xIé@ ¢àSb=ú¾FQ?Œ±Ü®*ó´,õ„^ÑÝ亪¼ªôÎëšòÎЕ½—¡l}tEq(ÂøÈ…Ý®vÌ—n”„YfÝhT #ÕE&¾:*8°Ï©Ê¥¸vµáz4µ}èÛmsák$¬)MI ¼Üï—:?ã&œ2âm°H]”fZ©ÀE»y]òfJÞº\°Í³zEèE_c‘‡ÛŒ¸^$Y´¾,_ÃëTúõ)hˆz\ÓˆÔ¯t¤p53 ¹Ç¸‹eŸŠ¼TSö‰SÿÀt£ÌÂ}°C®VãèÚ7'n1+ž‰ŽLN5ÛßÜ•+h jÊdüáÒ÷ ?tö.C„g”2¹¸|C¾Uã¥ëïpD½mƒ™=uèi>ÓÉÔ-Âþ™÷àê›U]òN¼Ý)mBB‘”o¦ì:;'xUὓfûö"ø´WœÂ4öš3îÔ<“­ 1<‰úŽäNZ_Lç[Z1©YÞøÈ¯Ëâjed*UQ†)M ¨ùim-˜®Û„¦ò’–¤‘ä¼¢)ØýøÓ•ZÀÐ ¬ù¢Z$æf´ÄWäP׋•JŽöÊ!bO|ç{'•„:ÅJò&á’ vVyã &§ÕT÷'kâ¬DÝÉÒBy ±Ê—yë=Ø(ÑçGђц䤧øÌ…Õ†+'@¼v…#ø›-nÌk]ØMea¦º‡Äk«•QeEZ Ött‰íB_ÜÓb „÷ Tzílv¡/an¡<Ì…îæ’´r·¡sø™¿a{S,®ãqa9øµ!¦P˺:vâA††w1r׉ôv3¶Ç襒)Y–×–UhVO¾ØŸDÇoVš*-óì¥ .2-• nVâŒ|ÁŸ¶W*©f¸ûÛÚ¼qœØðh¨#Ž_Š*ÍòêÕYÍŽ|2#8'£¿zMœñFvYÂSê|Gw›L2> endobj 3596 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [197.1787 369.8561 224.6314 381.8112] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.14) >> >> endobj 3597 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [255.9463 369.8561 267.9015 381.8112] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.14) >> >> endobj 3598 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [439.2901 161.4259 461.7614 173.381] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 3599 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [488.9791 161.4259 500.9343 173.381] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 3600 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [149.2362 95.2153 171.7076 107.1705] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.7) >> >> endobj 3601 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [199.0495 95.2153 215.986 107.1705] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.7) >> >> endobj 3595 0 obj << /D [3593 0 R /XYZ 64.9134 727.2935 null] >> endobj 1362 0 obj << /D [3593 0 R /XYZ 64.9134 702.3869 null] >> endobj 1366 0 obj << /D [3593 0 R /XYZ 64.9134 679.769 null] >> endobj 1370 0 obj << /D [3593 0 R /XYZ 64.9134 647.8969 null] >> endobj 1374 0 obj << /D [3593 0 R /XYZ 64.9134 427.5979 null] >> endobj 3592 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F21 1557 0 R /F14 2010 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3604 0 obj << /Length 4109 /Filter /FlateDecode >> stream xÚÕ\moÜ6þî_áëk–!ER¢ ©Û)Š4׸¸m?È^ÙÑÝîÊ·«ÍË¿¿¾ˆ”V¢ÒÔ0`i%jôp8ÏÌ"ùÍÍÅó—ê²$ežå—7÷—¹ %ãâ²à”(EÙåÍæ×SâjTf«òjÍ(¥«W¯oàlõÝ[ýüòŠ1¶zq•©Õõ«×xùû«5ç|õïâåŸ~üÉ^zñú[sr}õûÍßÝ\°K Ì¿9ˉ(syy·»øïů¿ÓËͽüá‚’¢,.?À9%¼Tòrw!$'Rpî®l/Þ^ü³¸vסÈo°ÆLU.J¢d!.ó2#"\Wù7Ê Døüe–eíÕe¾2BõI’q*ìý¯¯ÖBˆU³=œ:Sïêðp‚Ÿ»õ´GåtÄÈ€Z3IXÉá×2¹ ª°/]Ï€âCPí©›B… ê/€êŸ‡Ê©êy‹hºGýß#Ü…Ð.×`¢ŒC0o°@{?íðÿ­ï¿D™¬r!£ à VoÓž°;6KÉt0=%cà)¢\¢¤m$hpƒÆ9Î7’îSÃ=ÛNóNV÷§B`ÉINéR¦* ­l—ýiwIT¼¤‰j 2BàâT›/p3cà3Ü /Q3JO͘z=5KÌùEã[² =¾  ”È—ÒV!ˆ¦Õ]uín–n¸Tt#œ¦ÛBϬdfEµè™‚„ö<¯Òaô¼ŠéÑójqÜ0´U[CªÿØN[}šá™jˆžjÉêøT¨–)HðùRnÊ3"ð‹6ÀmÛnëj?˶@b*¶AN³mÒd9Ú³NÂõÔK†7 ^T«žz!â(õÒaôÔ‹)ÕS/„¸ÓL sJw ­ö.–ý}âã £)3¥ìç•ûj{¬Ï?Ád9a’¹o4ÏŒL6)*Æ”û°ÕNSÒ(¼’¹/:ͺ„dº*.åDòr)Û 2¼ê»{WÍ纴Tî` pÚ„1ÅÅPª»n)ËM†8pQz‡`Žúƒt½?ˆiÕûƒáŒ;@ž÷.áum<ÂÆ‡`,Z†v¡ ØRjõÎ4Ó|Bœ¬ú_’,%%©€ŠË¥„ühQd&Mºk7óc¸¸Tœ#œæäá)Ñ„3KÓd•hÕ³§iX(OÓaô(Y]5µ‰8¡t½Š)Ü;¡b‚dßôÑ'}d~líKø¤dZ|*ÉÐScK= ä’E±ä“\±t>)8ï“BtÑþNPÙT>i¬¿iŸ4ÒŸõIŠ—S©¸w<ÉŽ'ÚâÞñ !GO:ŒÞñÄ´êOñ³»=óîE)"•Èÿ¸wÁ¾«B´žF{´{w†NÎ#~'™ŸŠßtY‹¥N—È Î|Am»Cs>K±§v /µÇ§©@Œ~dO‡0àrT‹žËFÝA\ËL®þ6OétP=¥cÚô”ÚåØîÀ7ËÏä {ôœ]ÕìÃ[ý0¾þ(ohÍxƒØWøtµ*ýN¡É—ú%œ“\Vtœåb /ǧ¹8€8;À߆=y»›gk²:lêÙ³u¬èEº¦ÃêéS¸§kõÏóuÐ7;útã¹3[|zºázò&ÓÅS ¤¬€Þ]Jà38)ó¢ï¶Ï“7—мcˆÓä@œ"¯ëÉŸ}ÐÝ6Ç““U(`rTéžÉƒ*}“ÓaõLŽiß39„ú×`r2]<&S Ý™|)%Æ¥¥vå=èxvÚi(-ǧy¯6î‰I““áèÕ¬§kˆ|{3¡\OÔt(=QcêõD @>ÔûúÐÜJá‡Pׇù 7úôÔ ùg²(}«±‰Ý7¸’„*³Póm£“þG½‘SØA·»0œ³Ë3½ÔSòÊœ(VdÁ& ,_U8&™¯ŽV®éÂÃ¥â|º¾j½žV{SB °;*„ûàåÑÆ ø†²zcn7®˜uœZ¬›Z ÿÜ¢C]¦ºÝºçêÚU×ÝÄ GVR¢„t3™LÍOt㬔aë…U†®Åîqë†Ì±¥ôÈ ÷^Ñ ØI˜ýf ¥Wš—Ò© OõtÍÒtдeÃ5Q?‹“»fòz|f¿1'ƒ"&ȸùÚk—=ÔF"êûhNõvxÒX¤÷~Ú:=bÞJ]\«L¤<šñÉ@‹ ]½ Le¢ò‚åšÚglÇ¡—œÚP{×j«3†qІ¤ŸhŸßkO¼³sÐݾ2Á~ y]kJô{ƒxP Âù4 ût¢ÐõKñf·60µ9¡–Œbñ¹vo7P÷àÀq×»hÁäê`йôÄÆ ÄfŒ’LôÛ«³¥’£/Ð× ôŒ¿Ïvõ8.eYƉ^J7·øPßë¬HKoͱ÷‚ò0^ê2Úðñ _0A&¡)ÉÜÙ.ÃéÈ¿a¾vê‹g³ógyn…ûeLRÓ7=çªCKü×;G´;eÍÚ¼@[¯¾XÙ›g;VÀÕÌØ%öê³'ÕÖ 7{#ópëš¡4¾JC8jPûÞö\ȵ9Ü#ÖýÝpC™Ç¹?1ј\€ Ër7%Û‡ÿa{BèbJJ?q›~ÿú#ýÍAO:×ñWƒ0ï(ŽÇÔÐ5Ž)©+õß“YL®‡²½à§®§”“ØKFUº[ËóèÖIÆVoë÷ý²•ƒ[Ì"ó3ž:φ÷Œ§„“Gm¯&ðnR@iÐæ«]µ×›žœ¶U?¿kX*-Ù’ân\äFÞ† DCô“–žÐKû­=lRÁg¶EdI˜bØ"ÕƒöSùŠ•ÔªGHPOÓëÀÞ·N/_¡ÃZ³7ëä ½Õ%Œ[.¶»±RZ{ì?ä#ƒMÊÉû›Û­s®…'W&Ǩ6îyû û8â0Ÿ.dC7µ÷íðN»uÔ(>½Õ|+=ßJºÚÕÐÌn/üÖÞ_)«)(¼}ß…KºŸ‚ˆíÖ<¤ë B¶Æwƒâ&‹hìÇ”;»ºƒ,:D–¹ý™Â>­  £ã ”Ñ,j¬|ãŸÎ6ÃB1¶ÂíÎÝêœüqí‚iaQ‡õOÁ:×vKÌ^¯\DWÙ¥ÐwæQJNhÙ»žÙp¡Î%±.+¨‡nÅî¦Všå×B›`;ñB\éí3â¯fÞ8X3Ç×ä4‡>/ˆŸ£‹ 1­8üc’®nŒ:MV‡û0A«¼ÝŸ¿–ê-͸fî“y7Õ3‡ÑQfÍ Ž©t]Ø ={¬ÌÁÊм€ø}Ó‡?8h>;ÿ†]÷ÛûtÚXQ=çáÜ„v•q ¥_¿´ésWSÐK4UÕ…¶ö ÆÅó–„Ô‚4siÈãî'’wçz¡gasâ×XJŠB–C“¾y×ûeþb[‰¡?³Fh šóïáT×û¼Ûj³Ä¾Ò¶¶ûÆnuô«<¦nå2sæÖho^go˜ØÕµƒLðøl˜%Ù_z©[õÑ$¦ÜÛžÈò³”.ê٣ÛÇ ·.ÙËtç׿0pþx¡WÅ®¿+còˆÄ–q^Xèúx]êÞtÜÐSÍt)—}n P÷“O=üà“÷¨O‡8ÚG›È›ŸØ:&K êSbêÊ|Æ&9U“a6SÜe)T­^Ý›«ÚoKÝá™HÈÁL)u¾(X(:²q ñ¿÷kÝ ÍÑÆ¯Ã»®Ía•¥ílIÛñ“rr?º³‰K‚ä¹p}…oÚ¤ó2w¸Lg^w|Wm·æ4l£áà 'й'o~þå»9é.2تçq¬‡:žîLÂs<Ú¶*Éôö‘A&€'jŠÛƒdÎ\^¾øñí–’ä"sÚh}>4ǃc™Û&§3Ö[ä$£*_2^ATÁ]Ö Vze≂lñÚF&C­ÉØÌë4±¿ßX‘ kQöÄ{ß6›Ï§Žԛâûɾ߾×Ðg¦ê¼öÉÿO»Ç¥…«Ïbñ¡× ôL':kÎÊÞ¶áÔd®Ø@Ø’úR(A‡ÁÍMRÿÖš„2:fÓaô¤:á>Øpˆ»êœ±ÁAg³3¥Ã÷ÔµŽ@²~Ãà.Ť¤¯„1%+Ê8 (aG`ºCkëeT=ÎìŽa.lljàcïgƒD#/Ʊ/éÀƒH×&v°=ŽJÛ ¯]›KÃø6uTµZýù+w~ÔM#ÐåÝ»Î@oê>iª•e?ŒÐ¸ñ¼ÚLyÄ‘¾oêÝã¶ê&È, GŸóè”®»ö†g»y¸£‘žËŠ£㼺²¹Š¾ñQžUúÁ~üw-»2'MÓQÛm‹Šù¾*Œ©6Ë!nŒÿ«oÝeendstream endobj 3603 0 obj << /Type /Page /Contents 3604 0 R /Resources 3602 0 R /MediaBox [0 0 612 792] /Parent 3575 0 R /Annots [ 3606 0 R 3607 0 R 3608 0 R 3609 0 R ] >> endobj 3606 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [501.9629 309.8701 516.6856 321.8252] /Subtype /Link /A << /S /GoTo /D (subsection.9.2) >> >> endobj 3607 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.1883 297.9149 104.1249 309.8701] /Subtype /Link /A << /S /GoTo /D (subsection.9.2) >> >> endobj 3608 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 169.9435 516.6856 181.8986] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3609 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [87.3773 157.9883 104.3138 169.9435] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3605 0 obj << /D [3603 0 R /XYZ 64.9134 727.2935 null] >> endobj 1378 0 obj << /D [3603 0 R /XYZ 64.9134 261.6136 null] >> endobj 3602 0 obj << /Font << /F8 1548 0 R /F14 2010 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3612 0 obj << /Length 2755 /Filter /FlateDecode >> stream xÚíZYoäÆ~ׯ˜GŽ7Ãí›d6/^Á¬ìM"#¶P3‰‡T†)›Àÿ=utóJÚ] HÄ£««ëêêªoøöêâõ»t•Å™Snuµ_9gR›U¢Eœ¦B®®v?FY,×)„ˆ.óª*×2ªoÖ­ut‰íáÕ±9ðÃz¨$Qˆdj×?_}{ñÍÕ…\ ø“Ã2ÊÅ&svµ=\üãâÇŸÅjw!Vß^ˆ8É’ÕÜ‹Xg©].ŒÕ±5Z‡7ÕÅ_.þÔ3ÜŽ›1Ë·¨ž’ ú¹LÅFô‹AÁÈÀ?iEô¾¾;u }ª£üxs:õZ«¨kQ‹©¹Äj†ÒÆ8bôu½Þ§¢²Üà_‡/˜ < \¦^«”€²e‚®h;ÜñûÜqZ½éJœJ„ _·Èä¶€KýÝóÚûk˜"ÍGe½;ÏaÛÔè¯æxh§,;x{뉘‚$BßxŘã„]Žºz©»[0 í"eœYËT’6±ÂEÝåm;(œz!2dÁ7—|ÙŸÿ)Q¾²©ÁU©•ÑU <“)‹š}`S ^Ökˆf”Ê»±—žìˆêžzOeQ½åëMy¿æ•pœ¦^³Ï—¼†“¨Áá0 ßw0 £ª˜šJ‘©~V°a¶( DÆ*#õ;x‰îPød&ì. s0€]¢£wëÔ€ãxZY·]^o ?­ fÑ ? © 6-Ú£QŠ>î)R)앎Je¬uš‚ô÷Ç›ó½!³8I„ö$`~\È» ÛïXȇä:_!‘±¡ýìWwM[vå}q¾ ¨.­ Ëì›#+ÙÇ-ÚÔ×q&`»Ol½+¶U~ÌÙÎZónÄÖž®e×N;Nv¢tÅÈÛ}SU¸Op>О¿áùw”YÕ‚ônÏ’K3¶$#£3 Þ©>dr®%Ý%^IØèçƒ;‘èg"¤ & ºæ¬ËýÚ:ðzB“Çê……\yØôl(ƺ’­8KóÊ:Ê©•.Vivžæ)•sž—Y¦ ÏëXêT…çY–ïnF9ËOÂÓ‰XcúuQÒâx„à8³ŠÊbgÆÌ*Ey2”Œâ÷m”Èbg3¨ÿ+¬Ç±yd‡æ<êýŠ©3¿®|àÖM ªùZr¦#67‡s!¥S°ñm¡ûxWÌ®…Š2jeSk§“_íõžãfÌòÜíZØ8ÂaåÞï˜V˺+@9ȆVY´0æÍ+ãjYï‰ÏŠ­ÒØ ¥?9"ܳa¾`K‡tÆù»¸!¡}ìËq9Û)•&„å±cxñT`€â&»kyyž´•NXj4š_ŸÇ͘åBBÐi¬7,< ŒºéÎD…‰s/(jàøœ¨i+ ùu"kU´íÙF“P&;¾œŒ=ÇgdÔS5±»ÍÏ<©"6P¾œ„žás‚¿mšÍ$üWqlžÛýÖbªù²Íç¹¶N~öæoBe›ôVÁ5ÃË!‹W'Ÿ¿›Ål‘Aˆ'öóÓ•“\¥“RÇô-Þ_ú£baÖb‘4H?êGÕ|_uå“´¥GiËD¸G—ŠPlæ’4¨S5õ‚ÊJ€+dÈK\)û’ªêÌÍRõ_{O,•>0ÅJ²á«¶;–Kk k©ÆfNEÔÞQ7Àµ} aaÈÚÉP˜òô•$<.Y9án ‡Ç3Ù¼¾k@¢°ð˜(Øöˆkä¯Oü;ª¨±O¸ƒš‹Fn£úúÈE-+ÔÔ;?“ìêðÔrÙ´Ì»€„výÚÞ6§jxÄ4L7×ÁP8áÀuôŽ,6Tä~bû„µ½æü§±,´!^çÞ"gøÈ{e]ôžÑÊw¬šûgÞĹóMOOÙxÂЈaA ~èõ|¸ÎÍ‘š™²F!Ñc!Æþ€—Ño LŒŒÞsÓLÛܳ¿îûdàÛ÷JùÎ;OÄVX7s9øu¨i { ÀJPfGï»inÈ+nô©ßµLäéíÁcó:"1P’¸¾À\t‘21”ƒj–ÇÙ`°<õ˜ Ì©ëË^îØñ!˜—«ýxÀA¶SS É~‚#AÒ€\j3<’’8µRN$둤ïOÝgCI¶‡’”KQfÌÈ'}9¼a\¯ïÉqÓJ<Ù‘²ƒ’ˆ¾áë HR¦Ù·]XI&pÍÃI Ñ5·ùÌÁ'•7uÏ*=gr-ìê£n 7!ot¦†”•QWk9Oþ §ÑŽIpÃÓ<Å%?/ON©èjĆ=á+Êœ31|Ÿ‚HtéÇ=‚f)l)ûöóš…¥ƒÎE³(cí´«Hç¾ éWG·œ±«þBµ§tVùð(*Mv, ûª±„jhkâ$¿¿ª1fùªÑ“ý†jüO¢ $TÖ¾ ª1fù8ªÑS}2ªñr¢ö¨Æ3¢Tc"듨ƋÉ8 OËP‰ˆO¡/'a@5ž0  ÿP ©(K9®d¨å·TÅ QÍÏôSót·ÓûGiÀ>FØ1 @ô_-Âþ ‹á~É–EXj¼¥ Å-RôU’ä:.s„‰±l4:‰Þï=‡Ñ´Ió‡ƒÇ¢ÃWǺ],"Ð}ñrõç¾9× ê’$N¤ýÔ5†cÊ3“bÛA}ê….tmþ[œUùh¡Þ˜ÔæCõ þ╨'s?Dj&=…‡j„¯uÃï,êS š4†£2Äâæ‘>‚@õA@êˆl±ÄZTŽP-‘Íð‘FÔ7žÚŽŸ-©C#LðÊiÛñÜœiH*z1Dzã‡n‹a¤ó’=‹ÀÐÔÅ p·Íù”º½[¶.”{B+9F!,ÿ’N@à¬÷;·¸ÁSW‡Ÿ„?TW¤¦¥…ígdœ•N`¹Mb²èëðq,>@ –½ñÏÒR1–,PÌ Z°ñ*!vÁ£ö©†ô\¦œ·ùÉCiøŠ~ù-vå?. ó¦P;Yç¦æ]hø–PÐ… ¸àÆŸ©¼n¾bà¯UÞr~Y« ;?ã+gcư¼!8´øÍiùÚ‹áË bJÖÇøœàºÔ#åž™”³U,4Üã;ýÐ/â¶5®—€ÕÓ#Peác•eQR‡ZáO2ÂØ 2ä¯Ptš, ø–À˜:À¨é“¢ í%O]¶3 0¬›â@Îë5££2du\·áëRm«á´„’$äÚwï¿_LÈT‹j7ìTñÇï~`®PDÿ¥tÉ;DɧРFžŽ\lgƒ·üþ«?¹of|ƒÀóìÇxlåvÅžóPÛ1£”ág‰çÿMC¨¯˜Ÿox”íßîóã›%De :Õåþ㛥à‚þL"t#Ìt„k°ªªEÆÛ[˜÷D_µ‹âíšµÊ(àîÏý Kýr?4y¶“ž®õ ÇÊ›PÿU›endstream endobj 3611 0 obj << /Type /Page /Contents 3612 0 R /Resources 3610 0 R /MediaBox [0 0 612 792] /Parent 3618 0 R /Annots [ 3614 0 R 3615 0 R 3616 0 R 3617 0 R ] >> endobj 3614 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.8141 634.6825 124.2855 646.6377] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3615 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [153.3339 634.6825 170.2704 646.6377] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3616 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [213.8244 383.1743 236.2958 395.1295] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3617 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [264.6225 383.1743 281.559 395.1295] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3613 0 obj << /D [3611 0 R /XYZ 64.9134 727.2935 null] >> endobj 1382 0 obj << /D [3611 0 R /XYZ 64.9134 702.3869 null] >> endobj 1386 0 obj << /D [3611 0 R /XYZ 64.9134 462.3358 null] >> endobj 1390 0 obj << /D [3611 0 R /XYZ 64.9134 243.2615 null] >> endobj 3610 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F14 2010 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3621 0 obj << /Length 4566 /Filter /FlateDecode >> stream xÚ­;ko䯑ßõ+ôqtðÐì7ipXëvƒ œõ^¬ ’ÀàÎP‘© 9+¯ýÕ£»ùê‘ì¬ @ä4›ÕUÕõ®æ÷7ß¾+.ˬ´Ò^ÞÜ^Z•BéK§ò¬(rqy³ÿûFöj+]n䦼ڊ<Ï7ï?ÜÀÝæí•ØüùÝ•bóæJ›ë÷pøW[¥Ôæ#>ÅáøÑ½ùð¿|s}õÏ›?^¼½¹—9ü‰qei3]Zs¹{¸ø÷Åßÿ™_î/òË?^ä™+ÝåÜç™* sùp¡ÊŒV*Œ.~ºø¿p n§ ¿?G±-e¦¥VDñÍ}}µÕy±ùG.t}Ø#²ß¾“ròž†µM®a)|¡é—ôQÂ)FÀ+‚i¦H”¥ŠT&T!Ãï=âv ’ša&¤Ìl™«9IŸ«#S1% :£Ë‘"ºÇ=¬þ1t âÜ:+ü{7þËÛ5l Œ-tdÐ-‚s›!p¶:Þ@>h­¥Ä/ØÀ(!Rn*ù|e,ÌÇÕ§Cx¿MíŠ0"F¿ê»7?ü”@ „[ ]øIÝpkDäøÔôuvµµ¶Ø€ã“À@ÃlªŒœ<;œRµLÙ'Ô«]n•TYas‹»–•°k´ÒPk‡zJ+xÈþÂ÷ •kPºEµ»¡éZ?§ãë>à;ÔLJ¦­yôé¾Ù!À{?ùXWܽS]¤ÀÝvÇ \+ÍÂh ð‡•ìÕ2™v2ðòÔ6·_²Pf´ÐOÚuŒÐ±;ôõã8˜ºiµÑs&Ö€–"²ˆýŠÅg„‡X«îN„6,Tåpy¸‚O,]‚ Ú5~f¿›)Ù{žUyŒßûÉôü”ÿ°»åÉC˜qÍ—[”¿bƒLÖjó¾E¼‡¦:¾¤Ø :œ[!_d«–n¢½¸\_GòáÎß´úŠ¥‚±rND1³tH`†<ÛÙ T}JÝ$x‰²8k‹"+Ja.­±`ºŠâ«m`¸B\›@0|¹wg=g­ü#7y“…ÍGC %[¡|m…TY’{˜˜¯|óÔ ªøq”.|ÂÒÿÈ©ìyÆS´2?­â-IË–Št«2f4+e>#@\åp€ Kx„ð%?³ñ×`ÅhóµÍ\aÅ\å‚i4›‡ŽˆBÔDJìĘY=3ËÆ .c|ííŒÕÏ8YQ¨Ìi¡üö|9­“jàœ Ö¥º#ÚYÄuŠÇÜ|ã)¬U^3` ÁTëûg’Á5ZàÝ¡:24ª_ìu‚ ­7[Î úݵIÂrŒ[ncwú„ÚRN!íéZ Dñ°^ ìz‘)!˹á\†è¥J²4©¨²Èdá¢Am‡„Å2Ý‚R,±…­8tí]B°ò¬„è·ùx¸@#G‰ Lµ§@‘±9F{ !ЬÐç…”õX^Z@Ï–êë#æq;¹vR> Óžó¹U匈¥ÑÊaJY>‚‚j©ƒj"Ò¦'Áj÷¢€Ë«"õéYæØÎÁ >W AmTÅøN°!¬B‡CC:ô¥[„ºO ЦÄ2jÖôêÁÿ"¯ÓQ|6Ú-†‹6«k{žWѵ (Š´ÆÈ¨üiÒ9ÿ:êGD>ŽF” Íô7lÑŸßÕ¼ˆ( ùJ¶}€ÚïYT$¤þ¥ñCdP§4Îc=¿kìÌÂæ£ÅÐi*& ¯Ë˜fR¦E“ÏHdÄNº ‘ëˆ2ïÈxä$CŒ¾R™•<NàíE0·eÞe÷r¢§Ñ%üzf—‘zÚeœG®– »Œcmð(¦Iÿܳ%dtÎÌ-ïjïQÜ{€a¾áŸ´÷Üï}ö 2¸RçI‰¯ Mxa~Ô´ýP‘+¦Ö¦Œ¼Ó@cŽò“@¸öÄx1a:°¡bÒü昶ݹ(ÂW=í-Çd»¦¢ÜR‡­Ix1‰3˜‰ÿyìú0LI¨H=::No¡pÿïZ^dÏ4(@­˜ÉšE™®÷˜¥£sõHU~»T^€XC\7Û¯ÛŽBç¹CalÿãžjÂ#`‘ÆœÐf¼o´pk ü]¬?$Ø I ÷·¥²rZ!AÕÀ‹[¥ëL 2?ïóÄ/Ö8Ð[™Iç^¡Hän§5¢Rg®K§õxs¤Ë.0Ç”ö…lU¡oµÁ/RÜŠ¼«Mð#Ym‚ (•âLµ ì¤5aN}è½: T)À¢|±Pd˘Y íÐ@æÔO ØI †K ôfÊ¿oÈ´(!M92ñY"ÐT ùBZ³„Ž`gÈBDšGsøŸi ÜåN=§$ 1-#¢Am§×wÀâVÞ±îøÄ¶ægm&ykÝp‡ÀÜR–SfJ:†/õRÕT.3+5ˆ<Ü+¾ZÕ"ÀíâZÕ€ÿ™ƒyq]Ðã±;Rµ¡j üˆ‘¹KñǚøVw!°˜ÌnÓ{ iYPÝÚ\ªW”ýû¥wTÒŽ‚ó«ï|é‘S›i³BÄp÷¿  °Ã„ü9¡Â£áØwëß,ë€K*çÀÊ@ì„xuÖ n§ Y‡‚퀸9Κ FÛ +T ›åÎÚWD5@| UНt9Çræ•CSý8«Š×Ã1B|G% `ƒ€e†âp_­vœJÖ ¯‡¡ø‚°ß¦(þZ»—´ß44ÿ™òƒkQ† z¿Oùe ËÅIˆw¹yÐ]>ò(å0ÉWÉSñ–ˬŠ­wïLžäL¥De…‹ªí!ÿµ¨qߤœÔ)x*WórÎ)bècÕߌÅs$)s.hæ>Õƒc‚K›RnÞßz”Áͼ•Çz8á¶©¤¢8°\ÖÌã³m6ðAj¢™MV`@‹]¬=ÓT{5AØn¨‘ËÙç¤Yùáò?,¿î£÷Nõ ,xj9­f$ƒ¸§4Ö5tXæi 2R•,“){•i5-©y5’b¦F ‚RbiO9n0âTÊ%amÿ„É7½‚lÿ e¹(Æ4ív_S§Ž†›~hvøˆKã0cGH¦Ö˜åfdüš±/Uʨy·ׄ Ø‚É+(擯erYž…Ö£Òñõ °õ }Ã!X“IÑ÷@½ïä5_vc7 Ž5c¹ù뤠ÅeU¾\óe¦DOÿ»‘ðõàeY…º5Xå> ]Csë-W¶»&´q·võf‡½Ò§ç’ Å:´eô¥Ê‡†$sŠD5¾S5”"PÆCYO‚±##ЇR‚Ì}£\ÑvÒÍCÇï)x·è–«4âá|C‰Kð*l^ÍÅ®ÊçøxúÕ6·û±êkÒwòýM(˜]ð – ¶,®TéþEå=°ÍÁœ÷¾25}o˜±Rò‘*úx¿sª¸‹’ýMk¹|ôÀÃxüäØº;~ú4#ÄCž8¹‘ö€GÛ͙ƾÓîpb» ‚1¢ Å"¨ƒÓ†R¡Ž__çf=ȧ¯¡WB,{œ)iŸG6dÜ2#h­ƒ¸èOøž/P=Ý׿¶ã+ñ3Tu<:Ñ â]ûᦩ¡’œ£è Ê|. ª(5Èb"] ` lªÄ,HóÀUOø‚]XEÚybÁÆ+¾pšNÖh e ßܯâq ¢zÈCXujÌÜ!×eP{Ϩ䅱Ό#Œ"5úÅc\é•^Åi•ó^ì‚ÂUcpÍ({tHók’CÜÛŸªQ€E =¶ø08>¼óünùEœ!•Ĉ,WE(?ìØ‚/SõÜaS@4cOX~}ª n§ ©:µó\Œ+óÙ_kôLÒ &$HRæ!æggL8õÜ~OU¶eæJ«Çþ@ÝܵßÊDòšg¶v’ÍÍ{2°L‰‘ITB[†ž ì‰(”ï*•/ìáOæù„ãkv@#>Ä~R¡—§[V}² wœ¼M0ê¿}`ssìBçg.Ú؃Å*jýh®Ÿ|îš=—OþP?_“6þ|ÝZp~¸‡øéôx¨¿ƒ@`kóñ4pI—ëðpÓሠ?[bRÒŸbz¶òû†Â-a75,ûH§U•p—s«Þ×7¢Î ³áSÂ8oG¹¼>å†Ñ[.øÙŸ2t«ÔB‚ýˆ‡ßzL®“¾QÊøNú´¥ãâ¾€9Pj÷…W#_(ü:¼Ù7xê&|:ù3b˜ˆr‰Q€~îÖd+EZIÁ./>"AܳÇÃKÒ‰R<©#ò‰1Ä>œ©çÎvúÄp‘gZ ´ä*OôF—` í¾þ‰p;˜:ñЏ©¸,e²Ùî¥f>²ã:²aˆg%9 p:3?Θãjÿ)ÊÉŸË2þ;›ÖˆRñ…%zßì° ŸÊ¾1ŒgoŒrVÉ·Ì”sòÒ@>¥œy…ÜÛÜN &˜šƒUFÇu©±ÛŽÇºe‹øÆ·z¯ýõã3Ç=LîbB>~Ù…ÙëØëÏx3³ÌÉ( ©ª7”Óï–BØøT´ñ·(÷ÝÏɽüϾ{š|CÊ&E±8¼ªf‚yÓË^ÇãX¢•èEÔ<‰­™-Õ±Ú Óó$‹,D‚J‹ 2×/„EM»öÕÐ=¤8½×øâ›„Ì$$˱±Hpct2“t޹©6ÑcôR5ßJMž_”ÀeýéÚwc­crB« žôqòE`åã9.õ%,ÚÆýfÂùÓ"‰_ =·ïì~$Ió7~‡˜<`  ¤jjcÓf ]üNä»`2þé#ïendstream endobj 3620 0 obj << /Type /Page /Contents 3621 0 R /Resources 3619 0 R /MediaBox [0 0 612 792] /Parent 3618 0 R /Annots [ 3623 0 R 3624 0 R 3625 0 R 3626 0 R 3627 0 R 3628 0 R ] >> endobj 3623 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [318.0052 605.2512 340.4766 617.2063] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.4) >> >> endobj 3624 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [366.9853 605.2512 383.9218 617.2063] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.4) >> >> endobj 3625 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 581.3408 123.5271 593.296] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.5) >> >> endobj 3626 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [150.869 581.3408 167.8055 593.296] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.5) >> >> endobj 3627 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [391.2287 286.8253 413.7001 298.7805] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3628 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [441.6894 286.8253 458.6259 298.7805] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3622 0 obj << /D [3620 0 R /XYZ 64.9134 727.2935 null] >> endobj 1394 0 obj << /D [3620 0 R /XYZ 64.9134 437.9945 null] >> endobj 1398 0 obj << /D [3620 0 R /XYZ 64.9134 146.1206 null] >> endobj 3619 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F14 2010 0 R /F11 2356 0 R /F21 1557 0 R /F32 2060 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3631 0 obj << /Length 1633 /Filter /FlateDecode >> stream xÚÕXénÛFþ¯§ Rs½'—LzÀ1 AP¤‚H‚€¡VQ‰d)*v¼{göD‰vÛÄ-P—ÃåÌ7÷,OG§OÒ(#Y“h:I2&d¤%iJY4½g„MbF)ŸçËe9aãêr !Æçx‘ã9ÚzånžÛ›e[8…M,Õ“·Ó§£‹éˆEþØN OˆÌ«Ñ/£×oi4Ñèéˆéè Ö”ˆ,UÑj$• J (ËÑ‹Ñ[†qàï³|Œêq¾§_š‘”GIƉäRXíÆ“Xq5ž×­)/«7TÑyÙ®»CÌLK„`»·@[`5Ë2¨¼ýýæ-ÇxŸå1h¦5ᚉ>îº(6mkªÂ äë®-«Ë§Ëƒb‘·~7õºìʸá?AÍúnãD(Á ¼M•ñ]åÜÜ-À§Æ¹×»ü eˆKã˜õðª„0‚§,s¯š#cJMR ¶Ô‚–}¾)=¿xá€!AyJáí° ñ¤86S$ɘ×àဎ±N0Ax0·;¿(«b¹™gù¯œOÈâdÌÀÌ$Sƒ{ï]66iÈâ^ØÌ„4užx\×Ë!&6RßõC}ï˜Þ> –5æ,®Š#Ê}ˆ Œ!¿["£D&T‡G®,ìÉiõAK»¡qO¿vÀR,Z¸CU ØG}¹Žy9w;pàã}ÿòÙ3 7N%Ô¤ÓûŽ|î.³Ú¬Ýªª;·È›Æ¨eå®gùé~NõÖt›ÖoröìÅÅ£I¬S­¶çy¹ì±‰·|ö}‡æíYÂëoírÈxm<ònáãÞtÍ&¨Ó^nV¦êz¢éÍØ§?¾Dè™T;c­7EaÌìôûœ>T Å–&I?ö§ _!ŠzÕ€aØ8ïÊÚW¦…ûzót<ÛÀ²€†2FGá ¹ßd®¥ã†.¿4ŽliÐx\ bãÙ@:rªI"RyXsúÀ¡5@ з¥5§)äµP}ݾt†ºl–…[Y¤YîÝ–8N)á©L#)SÀF?¿Èm9Æû,Ët]hb'øÆ2ƒ4¢hvàÊ‹kôÞ ÝØ"ïUÏG6këˆ!„†Ë€?œ™¾ v h¹êçËB㯯¶íê°¾ê%ÚòO…þ|‹PWϪú.äœ ÊéÕ\s]˜“硯¶­må,«u—W]i3ë%Ÿ <Èøã]@eîrò)P»_ón{‡½"/:ÓžØä6ÐPl°ØHq-UI †`? êÚ„鵨¥A,Œƒ¿* Ƕf½*«oÖX_pQB6CÑ€Š…³*¬0GI*Ã4,¤ýÓÞ€ø—I:^„šÔZ‚98UŽŒ;rGÇ4jͬ,ònhbb\Íxæ+Sß%!`ÎýõyèÕ# •„rx\-@;Ž-¬©Ué§6ã¬pŒ#á„3¬?–Åóc!0>§, "ÊÎrO\Ÿrzb‰·'–~|fj[þWÎ$Ô5oÜŽ÷Ô•q-HPF «§ý(s£Ø6g *eYàµúÂÓ@qm}ã‚Î:hÈê,…†§C?8?VW !çŸãèÀ•tÊ¢˜¼•Æ_P!ãax<;æª4p%Ž×Ô‡®Œ”Ð$1`,õª„h¸¹W0% ©E!QÔßÔj†ÆÕ!$¬$;8!{œvq‚²2«™)ƒN#’;ÔÙ…C ,‘ýh(±Az·Æ¦öÐÔOíä×÷6 ~îÚÝÚbˆÚ.°¹¬ð([·«0ºÍ~òÎݬðe”´F‘–È@†§ ¨,šºíæ•í.oÊójâ^‚]A’'k x A"ñþø,°Ð¼ lCÍÐ=·‰_ì&±ÒÇvÞ-ü„U™ëέœZ9ª+Ã)ßAmŸAb£…³¡X`Z¡©º9`æ€úìŸwõžh˜ÓCÕBœÉ‡ ¿%mm°‰m°ÙPâl\ê~K:áºYÕ}Àø‹“.™`½“.…G€$V5~ëà™ B1+{ƒØÀ·‰O:ö{ÚëbQ—…9œT1Ë”AÆ)¡*ýüa¼ÏñxNƒ®3âvê¼.³ªÙAáíM,Ìò)eÿù 3x¦ÄÝ}°ØcxË‹°ëÿÁâßþT>ûø‡endstream endobj 3630 0 obj << /Type /Page /Contents 3631 0 R /Resources 3629 0 R /MediaBox [0 0 612 792] /Parent 3618 0 R >> endobj 3632 0 obj << /D [3630 0 R /XYZ 64.9134 727.2935 null] >> endobj 1402 0 obj << /D [3630 0 R /XYZ 64.9134 250.9803 null] >> endobj 3629 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3635 0 obj << /Length 1781 /Filter /FlateDecode >> stream xÚíXÛnÛF}×W) PN¹Þ ¯IÓ"qÀë´‰Hƒ¦(‹¨Äe(Êqšöß;³³¤HŠv ä©@aÀ\îe.gÎÎ õl>9~Mc2˜Î—ÓÀc±PÞ4TœEÓùâ½#¢hæÊûÒ‰g®àœ;gs9§3á¼~>B8Og2rNÎ.púÅÌUJ9¿à*N¿:e§ž^üDƒ“Ù‡ùËÉé|"¦þÄ^³ ˜þ4ÝL>NÞàÓÅ„O_N8 ãpú Æœ©8ò§›‰ç+æ{J53ëɛɯ­@·‘èvE>C¥ì¸ þ0ñpÄ’yÒSÆçt•T3×—¾st”K}Yêíc´d»B°Ø÷åpcÙn Ts’Ôœ¦MOèñ"«/OV:O³Ëg»å2«~ã>ïê„wñ˜^ŽèYe©¾ÉìŽz•ÑàÊ·ÇŽûxdÀ’VQEGï‰Þ5)FeÖ­LlÍц0M¡¦!6 šFû»â×ɶ¦þW)õ§mz'Ÿig¾¥=K+EGÞ¬Êä¶°áË»'ÞH}ÄbBÑ8o=Hg2tÐTèMŒ3nĩ&e&ã‹Êx¿Iò‚@BSrØTK…¤¬{…·…À“γhnˆbxã ò–ÍÍ©³´¶U 8@ºþL#€¿ C=âÃ;’¯ÎgÿŽTÔòq×^ÉžXDó ?f¬ð²ÊL·Æ»ë1 •€ŠÚ=rq}&÷:03hƒÐ9«ûV!¸¡£­¾+SP…Ú^-ܼò£7ø/³«€EAŒ@l„sé\áÆUœN0´7¸®,.œÖk/²uF-¾¸°|ÐyÛ—¸TùŒÙȉÈpvÚ˜˜Ã½<É÷šÞm²€™Cò7g‹V%bye>‹”c,t£*· Yy=Ж¥ œ äÏ´Rë±FÛ1P'£]礲—ÂÌ%­s mÎPƒ'¹ƒæHn]™!© àEG`­«}»f¦à|Ýê2#·éÔš·¤g{`7µÂf•Åc>íõ¢ ŸgöÀÎjn¯&?ôІv¸ëþXG}?Ñ -›Ak3ijlCÕyŠ}ýá]"`J4Wi_ä±:¼vAÈbèåíff[÷ÈcŠGƒ wVŒXd:q(3ôjX™B»¬„êöÔØòXä AN¾¯­Žƒ¢äõÛÌG¶rY~…”w|ÇׇðQ÷ÕV‡øƒÃ'å6¯ó¬›Âν§¯Ía#®@yÄA¹ ·ƒ¯oÄ[‰nWäa#®â€A¨‚½ft{›ÿaª½@Ó?´Õ}PÇ•’Œ+)ûEôäŸ#éC$ÃH ¿Žº( /ñ3¨¯áWƒÔt»G~À÷9‡ãí¶;¿Vzu}”fÀØ(â̾ɋt½[Øêï‰RlõÃØ-ïï}pM[=ûy¦õzLÈ€ÄÆ@·åêZ7_òéÁ þPÑt•CÙ_îþê?ü£ñoØÍIæendstream endobj 3634 0 obj << /Type /Page /Contents 3635 0 R /Resources 3633 0 R /MediaBox [0 0 612 792] /Parent 3618 0 R >> endobj 3636 0 obj << /D [3634 0 R /XYZ 64.9134 727.2935 null] >> endobj 3633 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3639 0 obj << /Length 1658 /Filter /FlateDecode >> stream xÚÝX[oÛ6~÷¯Ðº‡ÚYÅð&RjЭ‘-ºîR+Ð*˱YruI;lûï;¼È-9Y—< CФÎõ;êÙbrú<ô" *¼ÅÊE„qO2ŒÂo±|?™ùc<ÇyžÍÈ´¸œùŒ±é\ |º‚¥ªÜ˜‡_ôC^ª#Ã!F³‹—“óÅ„xþÈž ˆG"ð’ÍäóäýGì-'Ø{9ÁHFÒûsŒXÞf†ÎX·’OÞL~Ýô;Š~Ÿä3¥¥=ý@ DC,=bÄEdÌV3? Áôðis1_—Y’^Ì˶hÒJ­Â˜3™±·tzbÆUVÕ™fÅU™ÄMVæù‰NN•%@ à Bø„ (¨âϱ-#ßÖ²6CÝTÉZK³f-QÒœi Ø%Û×mëªðúí«WF ÁÀ¹s3,Ë´6³¢´ZÅÛmWvÞ­åù­t{]^üTV©µygë³™OEÏ´Uº)¯R««>éoˬhÖšWiÓVÖþÏŸ¾zsD¹ìû+Î\ÙýQáÿ>Ø£  †™Þ;ÉŠUy±-kÇCÛ³É0åQ࣓l”jlu)“¤­ª´HÒá¡£.»“C2"û;Py˜{óÔ©5o³¶œÊ¶Ù¶ß«Ëv“=зÎ1܈ðƒÈÝ`9ä=,¥7±k­7êª£Ø ¤üFlú£àOó:=Îþ(¸|É‚½ŽšˆžµÛeÜØy‘~µÔeÞî3Ñ@ž¾Ãú!³øí­Š˜ˆ÷XÕm’¤éòß[[| 9 a‘†åùW¨1Ôp!Ó\%UFÊ•)1­RŽLzN2ïÓ£’“þe®ènªQ£+“ZnÇwÊ«È0×ÄÞ9–gCaˆ…A/ªóŠÅ´Ð"+Ä) tø(•ZØ©ÕNZ™ÌêZÀ†Ê±j $Ü(C4šÆÒ,֙ƫ:Ûì雉Zt™©A¼z9ΡˆPŒ`ójFCó¶–¡MýF0¾Áªå5Ve#V¥]…¼cãn«îlmÖëu#‰ˆ`åp6”!D«Ôî7¥!(zà¦ÖúIñ×{ͳÌaÑßq‹S€/ô%â:èñÿ)ôˆ=" ‰Áó™„L)ÅvŸH½E0ü'ŒÎØW›1òô!ˆP¨˜P™N»ÅBÖ¨£ÓF£`hBÀ%ô¹Œó@sú}r%!&àG;[vJÀ„«ÞW­óh›me°*]f‰Ê¼CïÂQ(dh½”¬¡:h†)&ˆ1¨ÛZW*!¡ ºaÝñšv˜D…v˜!°ížšáE¿OrØ SÌ!u‡|ÏYÉ×I–)8ÍAXÌór™ŽC" øĘæË:K”·×æÑ„K¡V ª¦6;YaÆO0H=æq™i£ê÷lðÔÆÚÕXÈ©zŽ«8i,.GªŽ NHãsëƒÚÄE"Ñ­bq¡£àÕX˜2%ª‹"ÓðêÀŒäšI&»\2nQŠ¡2’΢€{Îùt±î‚Ì› ?cž€v³::Ô^Û€‡Ü5‚ÎnZ"¤× “n‚pQ±S²Ý;Š~ŸäL„©ä{ÎZF°Û)ZŽq$1ígCÓ8$¦õQ&€\!° `ó]|i­HˆØW+XË/%ðEÑåÔ}òÓ5ÆÞuáÑfˆ|ÌûR€M³ò¥À¶h›õà…œJ{n¬íñ#†°»8}ÔC[šW|³ËB`ÌD„Ð4}"¡m ƒðÖîÜQôû$G®Þ’"ÌÉž±“kž$ûdóDùXùÃ>¿_%Í–˜!0¹;=voЃaVw)â¾ ÜŸÆP¤¾I°;¶£x“°ÒãÂö©²ú}eá;ØöêÐAKM]ÅÀüfìÃÅ”ÈÐÁþ—’‚r'd¤@ààö°´ý>ÅT‚úÃë»c:É d¤á ú`tM`BŒ‡!>°Ù÷Ð@åíÒ^Ëî]šf­ïµÆÏÊ2»ùªè¸ØËó??­.í-,±Qâ,vGɱk¾ÆôoØß%þ㬾¸Š+SÙeØ»ôj˜›oƒ¯Df€÷²øSžþǯCtŸüÇm‘­þpb{;e¤†ërÕÝëÕ+ÈÞHV½&fôƒé3»Šó6E¹Ã.Ù-Ÿ¹ßüvIŽ§Ç®ÖÎ-~äj­âã u&>endstream endobj 3638 0 obj << /Type /Page /Contents 3639 0 R /Resources 3637 0 R /MediaBox [0 0 612 792] /Parent 3618 0 R /Annots [ 3641 0 R 3642 0 R ] >> endobj 3641 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [431.8726 210.8345 459.3253 222.7896] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.4) >> >> endobj 3642 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [486.6672 210.8345 503.6038 222.7896] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.19.4) >> >> endobj 3640 0 obj << /D [3638 0 R /XYZ 64.9134 727.2935 null] >> endobj 1406 0 obj << /D [3638 0 R /XYZ 64.9134 277.0445 null] >> endobj 3637 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3645 0 obj << /Length 2489 /Filter /FlateDecode >> stream xÚ¥YëoÛFÿî¿B_¡ ‹æ¾øh‘Ò\rp‘Ks© Hƒ–h›õ(I%1îú¿ß¼vEJt“ö ZîÎÎÌÎó·ë®Î.^æ³".Rήng© eì,3Iœç‰š]­ÞGªHæ %NGÅ|¡’$‰.__Á(z1WÑÛ—s¥Tôl®óèùåkœþç|aŒ‰Þà*Nÿôê'™zöúÿpõãÙ‹«35KàŸ:HÖil‹ÔÍ–ë³ßÎÞHf«³döãYgE6ûã$6Eîfë3ëLì¬1~¦9ûùìßáÂs\ Yþ€'Özpd¥€µUv–:¶Ú:óï¨ß Û4Éf m€Ybi­¾/œvѯ‰KÊnY׋ïëîúcÙ„š/Rºø†ižoWêŽ˦Ûʈ`c]Þ4BöÍI‚•Š çØošëm{}¹éúrÓ×e_o7¨Êý\”Â~/¸Z×½’_Wm»mG¢¦¹\|ÿ±löUÜ0ñSÑ™Ï+Kßa8¸Ãi»Jd>¿/ÇB’ñIڪ߷¦¸zûË `TØ!£ýrYU«GôdNúà¨q/4x>IS „Iåˆîò– |‘‘ )}˜)%4èE þ­!¶É®ßh[TÖE„V§_!ÜTË s¢ëðÿ²}àå~Ë¿´¶f·à-ñ³âýý<Œ÷HRÿš(»$7òæíÔ™tšÄ©É¼Â€_8TWo–"È«OŠl÷ µ‘ƒÝ` ðúÔ£³³ž*ZÁ f_­âܸ|쬷D¶,*›f|DØO7ÈîÇ+Ïò ö`æÙ4@4£Yv¨e±Ý÷;ì…´DsÞí×b`ÔTöÀ<ú&Íy;ù…SGЪ½¶H½ ÊzkŸƒwüf¦àC ª>ˉ\Øâ¡L ´Hh2:3±$'ô¨0z—0Û»Jæy2ŠXÅ@“ž£¡Ê;á¥r‡Õ!ž/2g1 hjŸÃYî§âG»ü¥þ8)\¬3¥…¦Ü¬¦Aº&IñÇq8æÓŠÖçœÜâɱ2v<û¨¼!ÐåeMõ{À¯§š-tÁÙqtŽ åqRš-@ [²ô´AQ⥊BC‡2±2¹ößGý)p\ YN4(“Æif²ƒdT–ëø©AÓX9•‰AÁíÖÚè gŒ>a”’g8©»åáÐxÒ¿ÛmƒëwLÀ)að³–ߪy)êXˆWC‰^1Íp(S=Š“²9çE1ÊPEÊQLµ¥È ªëq» G\n׻𥮻– ç^íC•ýK!ª>s^Q5á~ŒÓ4‡+Ô¸©HÏ äæV¬^}.×»/¹æÛɸLr€]ÆI粑þÛàÝ®YJoGñ®|‡«N’Xç6Ÿ¹ÊƒÑæÿ×Àq1dy®:1£ÌA0¡‰x9ѧAZ dãFýâ3:o¶ÆJÖx?a™D‡ì9h¦ì7Õ÷ÿËFúû‚—Pή Äz;çÙw‡èJÆqõn„~ŠlLc¾,âˆHÝ„ 3!ãɳ'SŠ|Õ9”~TÈfû—U[gX1ÿS}^V;L´o%±FàÞ Ðy~à~Azþþ§5RÓçü:•ú‡]u¾q¹ì«ö\!¯iå.^ª|¸‘¥)â/ (Ф†ÿÈû „‡5Åð¾A0Eqƒu4KéZÔ¼jè™–âHßIp«ApÃ9áRf¬u"T“X…b9_næFG}‹Õ\ÊœïeãÔ;bv‰5ñWÑÐ(¼f‹­âiºãEê"BH¥•ËÿiI—@Ccn+=ï¡L†É[TrCÕ¿ãBŰBF( Uºk¨u Å*åÍVTÿ­;êr&z9ÏM„w› °^sñgj«úΟ7²Š‚Ñ&bi à¡ï­ËMM@Ó+e‚0iHõÜ÷Wìµ;n‡Âà‘ÆGNŸ3MÀpÔýróhZá-`¡Žp د¼£¸Ó)Ø¡îzY¿§µZ?±"EÙ|€+è*\ÑüY5±®ØÍ ä Gž*Ñ™‰3m=*|Ó\#NãÓÀÅ,÷°¯Õ(i¹eÁ%…#Á÷;^ñ@›Æ•"’L²·m«ŽÛ jGöZ-互¸X%iq Y€4J¡éœ¤ î«rÅ#„¿²&€ô% š¥pîDG@Ì:¥Ø}³‚îî»Þƒ4¡Ÿ2¥Ë:#VzýË«W“=›êáíPxu‡¬õ鎡KT+ÙEZ'¶Nª 8.% b5GP‘!í¶ú S«F¼oTÆÆUx½Q®ìûjß%ÿ`Z10Å¢Rô -Tårž¼çÙΣ·›…XØš"º¢ªÀôæ(†ÎíƒÈõS9æ5dÜø¾ˆlÉ}@Ë rG(²jO4ëü  ÷ž&ЧdX~ê ]6'n„ržx¯°±Ê´Ož÷NýíßH†™cœ!S:3¨ÃðÁiÄÃ2çÞ»€5^Êà+zç€ùpuÇ{L©´Žo÷2¦{õ~ äVÐŽ¥W ™j}¨)¸WµEÃI@#<סß“»ª™ÓRËšwjL:ÅPó2J·\GŸî·˜↘èb£`5sJî;”¾|²ôá=´ùó¥¹ÓÝE²Er3QŒq6hãC;7¡àZîI0‡0䊉=\på¨EÃÌ…í¹ %S¸ù¤©ÛÔÇL}¬WÒ#{A;­)_ÕÖ°ƒSІ¢ xÙã§ ÒsuÔÛ“ˆ‚t³ 9ñ€ävP°PY „=Â*ÙÖ Ç®lÆØÅoô˜&˜Àɨ‘/Ut.z)Ûº¤»1ƒP°Ÿb b¥Â $µã|×V…hÑnâš(/Î {ø ÂNË( —Ö Û6<d&<3ŽtËUœ%©«vT‰Ò\…;ñi–gö> åKÈ!+b—¹ü/dO&·øIð€j§ÁxÐENq}›˜ýZ€Å>˜ÔJS»Æ L]ô3–Q|oåš·ec7 Rk£¦ï“8a¸(¬Ð ¿]ÔžÖ¿ZP[QÙÒÛÈÿ„”úÑQ‘=3Šq˜{:BÀàJ…'ô'ñ“ =ÉŒ I&¿ï±ÛŸjñˆáYÊy%É»®æw˜"È`å9,ñ ;Ûð³³ÙÑFÅN{((Vn(8µªÐÔ8 ×#š(ù‡î¹ñÏÒƒú€óÁæôæÚwA‘Zo¶øo ë Ÿw¡Æ^RàUÒ!õš_éüûÐÿŠ´áoendstream endobj 3644 0 obj << /Type /Page /Contents 3645 0 R /Resources 3643 0 R /MediaBox [0 0 612 792] /Parent 3618 0 R /Annots [ 3647 0 R 3648 0 R 3649 0 R 3650 0 R 3651 0 R 3652 0 R ] >> endobj 3647 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [172.6964 561.4258 195.1678 573.381] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.6) >> >> endobj 3648 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [224.825 561.4258 241.7615 573.381] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.6) >> >> endobj 3649 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [419.8065 549.4707 434.5291 561.4258] /Subtype /Link /A << /S /GoTo /D (subsection.9.3) >> >> endobj 3650 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [461.871 549.4707 478.8076 561.4258] /Subtype /Link /A << /S /GoTo /D (subsection.9.3) >> >> endobj 3651 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [263.9452 162.047 286.4165 174.0022] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3652 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [313.7585 162.047 330.695 174.0022] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3646 0 obj << /D [3644 0 R /XYZ 64.9134 727.2935 null] >> endobj 1410 0 obj << /D [3644 0 R /XYZ 64.9134 261.8671 null] >> endobj 1414 0 obj << /D [3644 0 R /XYZ 64.9134 229.4194 null] >> endobj 3643 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F18 1536 0 R /F21 1557 0 R /F33 2063 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3655 0 obj << /Length 3651 /Filter /FlateDecode >> stream xÚ­ÛrÛ6öÝ_á·Ò;%Š;‰¾¥f7m›¦Þ݇¶ãa$ÊæDŠŽë¿ßs(R¢-§ñx<q988÷s€ï.Ͼy]ž¼öç—«soEPÆžFв”êürù{„¾È•”2ûéBeÕ¶¹…Ÿ»uÕ7𻽾È1ÙÛ®]ÃgKŸ6ëën³»ÈuªÈTP^þxöÃå™:—ð§öi/lðî|±9ûxöûŸò|y&Ï<“¢Åù=´¥0¡tç›3ëŒpÖ˜Ô³>ûíì×`ž æcß=v@´°Ú:àê²è›v @Û*•-.t™ÝÔðSd°KfÍ ~eÈú˜Vó´·Ð„£ã¹qJÕÁ÷õÝF$‚èyM³ã h»Ž!À6½¸È}a³Ë›šgl«Mlµ«”†5Õ’a¶ú€œÊ¸c| šI§£²fñGîs¥DpNQÞâvé`v@7¸ÍÛñŸÌEl €¬y`Õv´€óø¶ç‚²…PÚ[Ø·úO| Ú8aT œ*¥°>¨c !)`Q!h#”)uú>b>I¢õ9mJa÷ûÇïzþN¿â#åÊxá•NB––>{}QšÈ$›Õ3‰ÄIJƒ(ØÕLFdãÝTÝhZ—DÏEÂ[øYïZ˜ˆn¾ä†ùœkrÎOùý ÕÝ'¢b£è b“ÀV¨Ûk²œá§×B:°ó®Zx§âœÇ)©è²ØSÒZ›ý)Y3B _µv»~àZ¤®Þ„s˜Ë V*´LHy>q#©!.úÐ$kvĘð‘Ô×<8”4…p¡,’½¸­¦r`5+R]7dp‡’í%Ë8×·`,( fØXëìóÖxEk°¥³›jÇŠØ|¼ã£aOÃ$©;Âc͈ßüqƒ,OŠð£"º’xÞ‚5/€äK&ˆñ@]“¸E¿ö©ÿ¾Z’_ìûçÏÿáÆÈtún³]½_×@Hgdö¦Ÿ3Q¨ÈÒˆÚŽe÷}UrCm”ìì«f›Ä"¢Sš-2»í6›K¯Þ3Ä»(FUêg¢SÏ2‚Š;,˜Ltˆy[ßsƒùKÍ»$ND§ëoçô\”ô¨¥({¨Å 8–Üi—ýã»"Ë]Q8Ò¤fÛó(î”ÔêˆZ8I9XB þ]o¯{´F…þ ßµàæ!±fDêz¹»úõ®í0,ò9 Ô ~[ ±µÿ›H½Ù]ý·Z7Ë«WQ?þ…¾ïꪯ#B#.ìúî±sCY¯ÛE÷8‡Ø¼n¶é@Ë?Æ«Ë_~ºúþ_¯ÞÍÂXœ> îjÛ¬ŸÞ†f­ÀÕϘ×wwõ36­áôíêjÕ¬ëc#™Ï©Ëe A(\©];£gœ–Ô&:"ïA ¢0ð¶8·²ðk¿8 æcÇ1ˆ²Jx u˜–+òm,ÃSj8}u™ÎÔÕýZðí.‘,G;É,¡ùêØ6 QÝ1é”Ñ¢,¤ŽûT‘vS\´Òz=rødvS¸R›òÚý¦½Ã cÉŸˆAÛsq™9Ú’y^6He“G¿„D1È JHcõT².o¢mfý\ž! Ký”X³•?7 @Za¾\HÄ| rNH‚!”ûG´ë7OK‰‡äÎAÔr,%ä3¡È´F'ßìälŠŸB+&~ô¶³2²|qBf¤ZíÃhb¥È1èà1„‡ìMÚ=+uГXm†¥ð¾(N0PÈuM¡DQªð" $ˆùäK¡=¨ë0´ýà’jSá_Éñ’E 1®+§H¢›>aŠœÐ0’Ѥ£n7è©,`(ÇXaS±(!+h»m’V¢aÂá”GÒ”yÙ²lPOË–¥ö ¡-Q™@b‡¿ôET(~¦¨†lâQÅùK21™2ùƒûqS;óíë쥣xß5}ýñ}Œ¬õÂHkGÆsËœÓÛ"ƒÚ ÿ5Æ'>»­®Ñ@Ú2 ž­`^”eö&Îíoªž[LÙÝ\‚†œö0ç ]1Ú §A F fùÅb8@ÌÇ ÅÐèŠìÂ~çGuÅ ´r¼’ â)$aÔ•ÆM‘|†®xQìsã©®X¸ðDlLÍiÄævMuF`¼5NO£®EËU\'ËlÙ¢pÞoù …‚Œì>”yk@\Zu-e—K^3ÔÁd ‡Í…+,L­fó0îÅ)Ñ\iÒªÀF\xƒßžñØi;cG¤ ÒÛÃôT4@öŽJ0²Øª®Zô±¸B#í*/ULÈ#ƒã™Ð5ê µ·¸ÙUr içT©A8µié–* 9öÝÆØ‹ÊœþòœYL™)° 9eļ,:¤âë;Ê×Üÿ‘´§¥ø)/!4Ì×™z¹¿9RÆÂC”­À` ïöêË££0CÑ–ë#s“çí»Ä©Dp8ÂLq´²â4ª9¹/Ç"»–ŠzÑß.£o+ Ú¡ ž± ž$/. ‡ˆ £,—äÒ•ƒ\– ËNËìÍŠGö(„bÐZƒÔ,xJýW³ë‡mbc/é.D"†l7xeúêï=Êk·­—qóËѦ|ê.ÞÍS×#Ü=F\íßy[ív)z¥¶LG«´(Ð O ÷˜ã„*76âF“RtÌÏqxÈϱwÓÒ×anN× Vôƒ}®kL‘¤ Oj±Á|KÛs ¾AYé¿<Þ‹ó1Ä™pò7覑Çrß–AŠÂh÷‚h&ˆ§ðÙ) Yàù[ãÂÄÍ¿né^ƒˆO(¬b`ÿýp—²M Á°ò×LC‹®aÑn—èö•wˆÕRé' ~ÔÛÝ]GʃWBobm~¸°Ú¤*y¾MÅÚXªÄó¨4z«M³HxÜrÂöxùÂH¹zù¤bF/ðð¡L.lT 4Ö|NÊ!íŽáã2òV+P)táÔ ”1"Ä| r¾¥KpÎô犗-­ž«BÙÑ ´ç㠛û;(Ö€ßñêhΡuÓîb'§+ÉZ.Gìf³– |¯&µÚ'-3¹µ:ØT|Èçî=QGU2tM<È’¯ØÆb ½hzÙ˜ËB_º©Ž‘§©²>–;°MA‡áJJ‡§oúøF©ßÆ…ü³ƒuºê’äRÐÞ»PXEˆE8t†þù¦n:îÛ;SD‹âEÆ6@î/òÈìÀ(¡ˆ/ÐØTt¨Ù²ÿÁ•Þ‹ªDlà«ÖÙ//û'€ùâ±"• ä¬ó0‹\ÞÙœ,”‚µ5øÞÀRÎŒÍpsÝWƒ™+ûx§†ªÏ =T€œ áå2@çq \ogçžó˜øœçø³GŸò€B¤Pô©=~t…Uꘇë’ß…a?¸âö(CÚqÏmWïF/ Qk°û𑤲#&ÈIqpòBï ﲼ˰¼[ß@v `’½ÖKÜDˆù$±|òØ ‹eÞÕ¦=ö†Ð@txA#Àc ®¤xÕ9Áðs_Z0´ !I ¢4̽[Kœ¬;ïX‚šeÓÇÌ&ÊÀ”Þ?V°nòœ>ñ9/¶â‹*è™> endobj 3657 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [163.6171 356.3398 191.0698 368.295] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 3658 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [220.9786 356.3398 232.9338 368.295] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.6) >> >> endobj 3659 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [340.1781 49.2932 362.6495 61.2484] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3660 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [391.1258 49.2932 408.0624 61.2484] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3656 0 obj << /D [3654 0 R /XYZ 64.9134 727.2935 null] >> endobj 1418 0 obj << /D [3654 0 R /XYZ 64.9134 652.8884 null] >> endobj 1422 0 obj << /D [3654 0 R /XYZ 64.9134 154.8557 null] >> endobj 3653 0 obj << /Font << /F8 1548 0 R /F33 2063 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3664 0 obj << /Length 2488 /Filter /FlateDecode >> stream xÚµY[oÛ8~ϯð£\Ô\ÞEõ­ÍN :Ý6}š %–¡²ä•ä¦Ù_¿çð"K–'±b™¢?~$Ïå;仫‹¼7³„$šëÙÕj¦%I˜³XPb e³«å_Kø|Ácªx”ÌŒR}øxOÑos}~?gŒEoçÜD—>bó¿æ !Dô ßbóŸüé›Þ~ü§{¸œÿ}õûÅoWlFáíGæšÈD«ÙÍæâ?ýMgË :ûý‚’8‰gwðL‰HŒšm.¤DI!BKqñåâßà" .úïpÆœ÷¦lbøL'œH.…pQ•k˜1Ì4ú¼üþ©jò6ÿ™}¿¼Ín~ÌŠ«èUôSq•Õ÷½…'hc8+}ÁI”âmYí®‹ NY¼÷E•¶Ìr ÚÇÝæ:«SñSɹ½ÍËHhèXoÛjÓÓÏœæé]UYZv´ì‹Á.oÓú´&&ø¡€H«ZfçY-¤Õ{­‰9¾»oÏG«öìÕº¥ö&ù ྴu^®_l©h¸Í‹½è Vÿå`#cmp®n çµ{tðéUÓÖOÚ[ÇóåàÃ`¿à!©Ö0`Bhlìxo‹"´QÑ ¢÷®¼i󪄧uTgí®†¯eŽkטº\º3@‹òríš§~yaù ‹aÂû±„ÇL#‚´ëi'cqwM6``‡N7¾ñz¾Q&0ZF5™/4lìÕmæç‡¯ýü¦¸IÂ%3~ÌÏËÃ|ï #)5“‰$”3NX6)¹ŒÅ’„CÆ„Ùy¸ïùªC\ô!Ç Kr0!Ì~ddhínDR$ìŒ$â1’Š£˜’ËQÔ†0$g¤QŒÁª¨a‡ëèkÚg$%05åÍ"·+Ž«¢‰‘šãB“oÐòr°³[pµÕ„±IIbªùƒ¶Æ8¨ÃN¨úä5ê}Èñ1.pbl?òƒ¶Æ%¦äIÄc$AÆøö€ä£)Pö™àß6V´n‹Ò›ܶlÛ6¾!|Ökìf75+Q؆_¸´¸×6ê¹­öÍUù¦[xoŸeT»G­»Ââð(-—îÁ†Ùvíï<@‘•k±FǸ!·°Ÿ.ª•Ó×v¤q…ƒw¸(w·ù ÎàÖ5åë™M2×Tž6â·þûq2/öë {Vëý¯r— ìú³⯔*ú‚/698v¹w?^Uõ„[&ˆÔòA· Ý¥V1x25êd‹ë}ȱЍ4É~dkq˜Çy"Ü%øùHvˆGHJΉâ«$§B°0àäPìb@[Cwè}ër}쪥¬ë»ÐæØ8Íâ`&èMºÇK¯íÕ®=¤a¦™]@C10¨áú!qSY]µE±Œ1E„‹ªðÏÆ5LUz¥‚×dþ…ã%¢„@NØk÷u›®½ˆa ídÈxc†u0HªQáíœÿ;:ØÑÒ»ßü 4ãCǃ~0ÆÜÚíóNGÁ0×U»ryô¸Å“¶³µ?^a«êQ{ZçíýSçr™Ez]dÿ§áó}·"&Z›ØrJ'hþA)}µ®-«{ûáŽ'œt­üsk¢2B!ÀÌMвv{žÀ J{ðÀÓÆØbcHáž{§ kÙÖY|Ü6[ºæÛæ|¼CÀ´öcäàoøµ3²2kÁŒ†bõk9ÐP*¿á&&">½bë=D›„èG8PeZ½ÞG\¿C‚PW'äÎÆÏãè e ÔTÇ|@t!!>‚mÜSðvpƒ«Ûc›ß~„=õ›üs±ÞåŸeÞºdv߯QÁÔ»‡§ ýÚ²_ŒÁ×ֺܾ&•‘µÆ|å+0xaélò¶íö WŠÑx‹æUmm™¶~€¬®«Ú§ùÊ}–.g;†«ïçFºªÏ]¥~î¶sÿôÍ6Øzµñ㺗ý3û³‹U'<‡Ÿø:«€7:/†5Ï–SnaçñÃ^åtãáZ¸jðdÙ}ȱ_0 ö¦c¹¹ï‡Ó€T±½JxÀ0$?V-ÅŠ([ôö‹¥/îðj[ØãR‰a&Ë×eˆ’,g _ÂÆÔÀ@p_¾¿AC°0.7ÛŸ¥ý3ˆ&–õ„€×U·÷Ž<8ÇÀŽ ´ƒcª€>VFøÃdw’QûöÜŸ¼àˆÇ°2$_…óŠáÙ1î°ŸìÀ‘ÍÎaý¥ûíµ÷èÁé‰×nY½rŽâ­ÜÝîÏ_l×À¨²GVÛpp…\ÇÊk4çÍèQ?m€É–¸ož*Šð^Ï%ä¯å÷e›­÷wá^ÔÝžâ·òµ¿MyêMÊ~xïzNäÁ l'MÂÍjÀ·÷]OÕ_üƒ;ÙpoöÂ&&0¸¨ ×UVJáíIð··ac»®_{eü¢Õ\çŽÈß<›O™ä~Äü4ôÁï)ÌÙ4óü™™.…G̯O]ó>ü™­åàÖ8øÒð~s¢òzú¦ö/’»`pFüþÝòËð½¶õ‘ÙÝkb†íUÌâ'¯7UBbàò° : á0?]¼ÅpâÜ •ÒaT«~l,ñ‹)1Z‰³ñ xó‹%¡T¨>¿.9•¯m\ 5‚‰_t§(¾Q&çCuxDÊ” bµ> endobj 3666 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [194.3726 406.8457 216.844 418.8009] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.1) >> >> endobj 3667 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [244.1859 406.8457 261.1225 418.8009] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.1) >> >> endobj 3668 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [334.997 236.0684 357.4683 248.0236] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3669 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [384.8129 236.0684 401.7494 248.0236] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3665 0 obj << /D [3663 0 R /XYZ 64.9134 727.2935 null] >> endobj 1426 0 obj << /D [3663 0 R /XYZ 64.9134 339.4169 null] >> endobj 3662 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R /F33 2063 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3672 0 obj << /Length 3118 /Filter /FlateDecode >> stream xÚ½ZÝsã¶÷_¡¾QˆGÓ§ÜMÜ&“&מӗ$ã¡%Úæ%º$u·Óÿ½û@$EYã ÀÅb±ûÛðíÍÕ›k»Èãܤfqs¿0*Î…T‹L&±µ‰XÜl~‰ò8]®D’$Ñ_—"*vÕüì뢯àw÷°\I)£÷mSÃcC*êËvÛ-Wiž‹,¹\þvóýÕ·7Wb‘ÀŸ8,”šXåF/ÖÛ«^ýò[²Ø\%‹ï¯’8˳Ågh'±Ì­^l¯”–±VRúžúêÃÕßÁ•§¸’|{jƒ&Oc•*I|F³¨©vËÔF=l@èˆÚû-þ¿£ádµ<Øô°W×#¢ÏØ@atØ(ãåJÉ<ºqs¤0ÑýEµî«f‡’xs¦¦„k™ÃFŸwSi¥JÃml‰‹DÂòyž‚¼d,¤MýóDZâjH’Ä5b-UHk#}èÛ ~Ê¥Mb•H}A.=Ås\ZT ‘¹|÷X®?þšè¤ëÛ¯–+jRKè|CŰ&¶i¦Ü¬[:Ü¢÷ÇÜñ9öƒ3-úfË­uÓ¶a"*“àœE´©ðÿëLßÌœüJ&:VZg‹•q®uJËÃÇŠ·%O+º9õÌ’ØmO«§Ñ±Ér°*"ˆ]ŒÝ@ñ »Ò$q"§ì~S×Íz†O•¤°9-.Çg x†O–cн3y´óóf/ccµ7{œ; C3L‰•ÐN]‚IÀ4Û§ºüÖÚy¼£2 V /ò_/W&“F”²Ñ}S“ã\‚ùìƒÐËâóM”œm³ëx¬ ¾uùÔãs† ÀÝþæ­È¨“ö[‚%vmîmŒõÁm ¹HB4¡¹g²ë†FÐßÓ>qÌyvâÂÿ"€çu{aYAØXàöždtŠÔAFÚX[)œœÞ×7]GÒ”"&Í¡Iàgu"£¿Ó6î‘·ü‹°‡è¦¹hDÛOßìÙ%{¶ø <œªãW:¢9˜u߸¶M[r‹ ú·ÅaZqÇný~ïéºùEû°÷B/ÃÁàK½ìM`(ÈÑa`ëwFñSz‚xN¦0Ú¼Ç0%Ñ8ðñ©xpè/òdhã8 ÎÄ:a!2¬ÿoˆùÈÀ~ÞÝBøT¶·?T]À­Úõ<¡«þU:ctgKí?‚,fº‡ö ‡=ÃhÑÃj°“iÚð%@oö»_Dh·HØÙýâºÆ¡»h«þùäŽqY!uœ[›ûÕÅPó¹\MçÏq[ÔuqW—ÿnÓ¹[íJ€O±ðÒX}À§`†`Ñ28r¦„a,s š ÆBî5šÌG d'=ö??ùh‡Ñ¦¦ÇÔÛð/­W¡=sGAѷ۲߷#JÒ)nеs?¢SÅ©haõ3O/èÛeÛ’?Îr'ú.dk8³õûÄ`§ãxgÃÓÙ?—èÎÝœ$Ú4!a÷w,šþ™kÚüÄŠ2Ø >:Åž±az0˜àÚO!wÜ US”M÷êQMtßtû5í°,7SЉB´•´w ÿ:Á`sÝìˆ0kMæRé KM§ÇÄ*ÀöŽlÁ? G7ôÃ}Û²u VéÝëŒãþ¤GŒ;‰ÌîÓRC²]W¼ &J°’*BMטD¼9k£r–­Äéé² •Duчðý ÷ËÖªÄ ôâtô±û®¢b˜c^Ý·eÉl̇js­”±ÑOwÈõ§ªÙwSO ‚'Yæ¡Pf–CUPÊ ØÙ8¿´úÆ›Ç7{÷Ë'…s]T›9(…}šu5'Š[¢8±ÂÔ€ï#OŽŠ%É!åÇß3lj¸#×K«"6|û‚æŒÊtë® v¾>âWƒ¶«þ•-öÚÅ#8‚7$ 0ú‰”0@ ,x ÃŽ+«^Îæt&~åÆ14ÙÐ Ÿ¸P{Ù`—_¤à jæ2×dœ±~¨8‡¨ b$:è²zØñC¿”»ˆOÊ™lV$k«ÔÒY™ΉR ¼n?ôÔU[^Ú‡…àáØç¤2d¥|@Cá—òXÄ)„¨) §,Ø+¬ä´5•åá`Ê‘EóÀ™#ìYáÙ4íjš¹HÛïr¤M£èÉ—Ïöã wÞy€’òUê%¹z8w´)º€Chö=UÛjÍø[WÒë^ÐÕ íQ‹¯Ï'vŠ!·—)¨§Dâöºio!½øn×—”áÈ4ÓšO©ÄKôÞ7x¥OåëH¥/‘º®ô­!áùBr?î·w¸Q¤.±SªH®RP¬Kp‡9_‰òúsx‘޻ǢýŸ¸/k‰#x)îšMy9Ù}ç ^H‡ß>÷—åŽ ^Hvî¢æbzŒÛ]ÎÌð$^CnZŽ­P•–n>B]s¦(kâ, ÉÓ×XÅT.ÄC¿ÝÔ5Ah(Ç"²ÎÅn>Ïuà{Ê™ûÚLñÁ,Ýõ_áýù´äÊÎ}\¨ÃñÄYžÛq‰å„ܱlv9¥õ5²Kr¬ ¨ê?ж:GjR¦šU«::“bÙcù›$&õõk®¿MîJ‘ÕÊ.„Ìb‰W,_zW(®†$ïJ„†åò°0Õ šöˆÃLÄRˆì‚zŠç8Ì„\y>fñøªQXk\îrzŠç8´66€ÆˆC´$Ô°ÓZ¥5ªjæ/–g ¢cýªæ®EˆOIÿv?{)j«³0gM¡#Ð;'àá¶‚B0x1üÈ­‚gÖîöCp¶Àx.D`˜±áƒxvàÍMH9 ç}+á§FšIå(ÄÆ¹Ž ^Eég®¢š GQ¼¡‚#ÍŽ’Ü\ùU¨Í‹.LoÚ7XÕö›«ù{§Th°²ç$lU®Ýœ;©4 .Ï4ü*9ë}ÛU\‘ôÌRÖ«ÑÆû¢ªoG£u¨Êô®D`à@œ\Q¡•<¥Ìß²ic^D)™Ä©ÊAÏ…Äo)ô—[˜§¸’œ±0)ci3sXùL©ýwzA=Ås,ê4A©1‹30e é–ivA=Åsš,N²$s8t†§¡ ¢Ć/LÊ]·o1ÚÏ:lø‘ŽÒ©¼žàþ4Œæ‰ñw k¿ˬ½{žàö2‰Ÿy¸{Uäeð[Àð N†ª˜ †v¾rWt‡D/d€¤x³ù–”9òU•3ÏìkÓ£S§ŽS™Èã _øÃÛºçO ~joß-€c};•KX"Mâ<jzûmÛÞÞ> endobj 3674 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [183.0263 629.1615 205.4976 641.1167] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.1) >> >> endobj 3675 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [232.8396 629.1615 249.7761 641.1167] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.1) >> >> endobj 3676 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [326.5642 424.2064 349.0355 436.1616] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3677 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [374.655 424.2064 391.5916 436.1616] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3678 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.4375 97.9824 398.9088 109.9376] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.6) >> >> endobj 3679 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [425.4606 97.9824 442.3971 109.9376] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.6) >> >> endobj 3680 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [184.4653 86.0273 199.1879 97.9824] /Subtype /Link /A << /S /GoTo /D (subsection.9.3) >> >> endobj 3681 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [226.5298 86.0273 243.4663 97.9824] /Subtype /Link /A << /S /GoTo /D (subsection.9.3) >> >> endobj 3673 0 obj << /D [3671 0 R /XYZ 64.9134 727.2935 null] >> endobj 3670 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3684 0 obj << /Length 1959 /Filter /FlateDecode >> stream xÚ­X[oÛ6~÷¯ð£äO;ý²¬Á5baº]ï¯ÑÖ`ˆ)Œ«ýöepþIFž·5|HÈ’¢¨ZÚÊ`ýDˆ‹º.ó¬:(³¹>Q’ËÛ¬™bbu"¯ªqÄÁ©—õ:?‘ñâÉ\|j'9¸>]ñd+¼kŸÝzZõ:ýa×6§jížý4Ðå×AÆY/–P¹µãÀ‡Ú…iHCæ8”,Ìã@Ž“‡I™‘Ü…Äùû¿«>^ Z-Ræ —}_Ú©î ç$Ô}Å„Je÷ý ê÷ˆñ’Êþ3¡f-O7#‡”PCÕ3ÒÖ—iý¤’SÛ*fm‘•˜^?ûò¾›ÐˆV,Õ: §ÚÉz …+1Jšû¢½%•cNÐxT@óMN™Ýo7·% T^.R5!ãVv7ùºÑߣî– §‡,ÑŸ¿¹0µ¯ÍÞãq‰êZ0Biç Øz¬‘¯zнoŸàÄuW½d`訆ËDÔópßÕQê¡ Ÿ1ND¾ tØœ Û±^„¶ÌA7ö˜_J)a?IæÐ™0®¬<Û/{Äxyì—ຌ§Ænöí‹O%¾;x,\­`¨Y’ì¡›NE-©‘ºCêP½ŠÐ̸áí†U }@û~¥¡&5رZwÆÅ#ÐqN(5‘L:ÓuƒÀéD+å˜á¼c3«°‹K6/¹ˆš)!äØE†½¨RÚgœ[,ø~ÎÀЊÃÞA¥)q3t­5ùÐèŇ…±QVæÁ=©—œ”ÊA4B§õ¸¯XÇ ³’rÐ §â|Wéãâ„§€ºSŒuTÈÞsj3ø%û«J Æ…³ßÕðˬ‚%Ô7fµ,ëÕ“ÐpZht¿“àW˜L@íÖêI}†°›=#™âJ÷±gÄÔD+ ÙÏÀa2¡’sYì„,&L˜ÒŽ.H M £ó‡MÀ[C¶ÓFȺôÃ&Ð{_Š6aãÁlé[ÿíe~m•ßµøM˜ßØí¯.öÓÆÖf¿õ‘C±N£V`¯íó2 ¿4 A}C°«šF/ ñrâ^˜F=Ýß:YGñŸ5xC†â}‚X5Ñ'ÆQh7Ò¾p>:ŽB¦L»šˆåƒ«è­ãæPgàŸè/¦,,FûÊCŠ€qSãzfµÀ@ã`=Å#£‰©üèˆdÛºÉé—7¬o³Y†µ‰ «íp}ÖlöÒóÞ0¸Cš™Ç%6b¬È‘1ð×GJ}ùI—CÇ"À?”J&žÑ' ¥H-FÀ(cM5”ÇÀ¦¾Ë›÷¿»vÔtïŠÏyhɆ'~=œØ#äƒZà'¢`¸Ö{¬[}3Ýó-ñª­›ÀæaôkŠöÓɼOtYYf~ý®·>ÌP½ 9N£·0Þ– g¡·mC3 ƒO¦jüŽB{>Žßʶ_z$3‡ACk JHoþíëžž‹4öw;¢ë_†vmXè¤xøÖ‚K”Ÿ0«xÀAáøw¥ BôßwRÿN6¾˜¾Ø1u¼Õ£»ܤ{îQÆ G¼ö}KÙÆEAÿ$˜¯ _D‘zxFôd =GªvÞðIð«±Jµ _&È‹.ÊöýŸ8C¦NÇÓphzèÙcŒ«º"›žŒ#'pèÙ%ÕaÚHÿŠõ ÌL £’49G¤î9*Q†Ÿ©™bõM0S2òžUg)ùÊ΢|þ &ŸëMÖàÌÀ´<›£÷¯›èÓÑ^®)2Î4FXkçÈ÷K^åM±",|%F°§ÿ,jšæendstream endobj 3683 0 obj << /Type /Page /Contents 3684 0 R /Resources 3682 0 R /MediaBox [0 0 612 792] /Parent 3661 0 R /Annots [ 3686 0 R 3687 0 R 3688 0 R 3689 0 R 3690 0 R 3691 0 R ] >> endobj 3686 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [329.361 622.7273 351.8323 634.6825] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3687 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [378.0239 622.7273 394.9604 634.6825] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3688 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [183.0263 343.7734 205.4976 355.7286] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.1) >> >> endobj 3689 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [232.8396 343.7734 249.7761 355.7286] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.1) >> >> endobj 3690 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [179.6777 207.8319 202.149 219.787] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.1.1) >> >> endobj 3691 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [229.491 207.8319 241.4462 219.787] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.1.1) >> >> endobj 3685 0 obj << /D [3683 0 R /XYZ 64.9134 727.2935 null] >> endobj 1430 0 obj << /D [3683 0 R /XYZ 64.9134 702.3869 null] >> endobj 1434 0 obj << /D [3683 0 R /XYZ 64.9134 275.3149 null] >> endobj 3682 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3694 0 obj << /Length 2554 /Filter /FlateDecode >> stream xÚµZYÛ8~ï_á·‘W¤H‘ÊÛ$› fГÉ"Ƽd‚†Ú–ݺ­Ž$'Èþú­b‘ºÌ>’ö @[âQ,ÖñÕ¡¼Z]üëW³ÈYž‰l±Ú.2ÉržÊ…NfL«ÍÇ(gbó$I¢?–<*Õü÷EWÁïa·ŒÓ4Þ7õ^kû*£®lnÛe,òœëˆçjùiõûÅ›Õ_$ð‰ŒÉœŒ<þ¹=á0K˜à°õ|zŠq˜¥,U‰œr¸"Í'c ˜jN)–¥™tRoÊîØ Çµ¤809%vKa¢ow`¬ÚÕÛ€MÆx–GO>=U$`%ÜŸúâô°­õô}g~E£p@EëúÐvÅç:Çè^-(\ù;¶%îÝ8¼¨=nà`ÛYw×ãÀ¯Ì¦nay©Z·a~si]£d;¶Œ¥”àDPEHŠ%\jwÕökÕ­oN’J¦‘»UúJk}µq\£ËXýñè%máÜ'°_§½ÿèüpàÈ=ÑQï/ÿ:冃Q䜻%/=ú"öîkÆ_–JEŽUÅõž4Ç#âN9•êïgî×?•9 &QhUç´Afo‘¥ÂšNÏtLÇh]OæX<™ãßÞ­žÈqEö[îÊæÌB»\=]hªž†X4rÕ$2ä†íóñÿ^Ûçfú—ÕOdºèêÛóž}ùá©ÃxÞ³?¬^?ñl‚ÐKp`Aº$“ S¹Ö¡Ð›¨»©† ’¨`˜¹Ç·ÖW ‡Ki^äèÛ쟾ÞÔmIs˜¼5Uðm2Wìiåë®nè½²$OYä:µ—ÂOì§`ID­Å>‘cN ÀÝy-ý úA oJËf±ßÓþî¦èÜí|HRåíݘξê1Ú%7|H†£‡Mh¡H`(v—ùø) ’„É,ñ×ÅxàâÏÊSk2#{1…M.‡(Å󰶑僿:˜bíÅZ¦‘5A-…ÈÚ¦zšAû`$  ® ËE yt’Ž,Uéh{DÐYߟæºgsÕÓìròòm)9K3uŽìÐQŒÇ$ÃÙ¡ÒB '[m*öuÞœe,< e_ ‘΋f¿z=LB¿õ˜Tè0œÔ¨Œ[«½5†¼D‘dž£½“óÌí$“Údƒ&!ˆaFKO'9%ðb´§±µh—è¯L—<†ö.%#tæ¯xý¶%ƒ2!´ðȇ;PÈuÆŒæYwΰ=²ÞLv{S Ö?6M;‹šBŒ;‘+À†òwùcžìBŠà“”N€cÀj£x_&3dRÃ5Ûë>˹#¤³JÇXn¨\®Ý3y´a‰]Ýž²u!øg*¥ÜR¢[Ú¬ÏeâÒ– §‘DZ±Zß”a÷((â×uÎv='pÃeôCÄz ¶}sr‚; nš²ÁÌa³ìÁÜôÚãÇl¯õ$®‘fµïâꪅïzÖ‘rµ.ºQ¶O¥ÄÈ4K,/h=kç6(NæyjT(Ï2…iw‹¶«7Ÿi TËóô<§E>¿þ»òó3I‹ûH_vgaýúå?%•·ÿ0ëoõ`·efD¿Øô%ËC­› -ê¤O¸Ðp Ñ`°hÜìu1ÔȰ×7ü4»sQ¤ö.ƒ©€‹áÆ)TÂ@SzÄ>6¶B³ð4q(wP‚|Axq,U}Ô²[¡@rã0j8H®!yIƇ€ÐDÎLª|Ë¡j]ò !ÞÈLL5·'¶>‡à±,||ªœš1®¸7:Rˆ†޶ž~é+Ò àGùùèEÇï/Œ‹´¶ÉmRQŽ2³I®ÆÁÉ4^.KÁL–™i%a„hÖ€_[„ÿQ#žF¸ÞŠCÎŒ#ÜÝ2Ñ·37اÁ ÞvÃĬcÙg·Å{©÷ …¿»q–¼(mÖ>™…Á—O _êjC²}]ß}s]_¥õ)fý¼i»«bÓÔòsÛ¬qê>äšòº>tÕîXÛ+ßP|öA|ÞÆFëúPý¯¼ç6÷w0ÃhHù —”ØüK`„üo{ZVh¦°?hÓÁ¯ß]U8‚ñˆb ¨P ¶M» ”?9œªS~>>=ÁGøÌ¡†á\Nø¬ `ΩH1÷P<§=Á‡9€Ø9ìŸs6+¡X"SïƒÏSÊÉ­ããϺwz|C§—<í’û ÎÐ`æJ݆®ÜÐÚ¢ ÔéãU@Œ D˜ì|bì >,FüF&¡ØI1ØS0øµlÔÁë¶]y¼ë](€Õ¬e˜ “ÜbpƒY¾ØÂŠ &çM¡ql×ÇAÛéªP'[¥ @C1àØ x’@f´Ö 5,pü|ûôãÅ€}rÅ æåý¹÷KÖ6ûê1Î4VxùÞê’h(ÃŽX8;™V-Íôº®)gtÇèttò¤¦ X[[yz¥¬]gÈ 9&±ãLyhµi«.Ì_ºÑ‹ëVòL1“§3•·õ±Y—Ô£˜DÆTÏ8QÐO€çÀ6c#HÅJÛ#0. íe14Czº¶iY~©ê£ï—ä½s[ˆ c|ž-)ÀL¤y ¶H™HÃ1¾ {‚ñˆbÀ…Sàɰ_E ú(¦IYŽ ÏÆ¦'ø›0PK=aÓ‡À{’)ã8Ï$Ϡσ½ÃçAì¨ùžZ-ÎÚÏ-YRaÇ22£n˜oi/‚SA £²é[±à/Ú64Lðieù‚öÚ—£íañÌvª²ÿÚËÛ»bíXlo¬9î7'ìk°[øC_´*4ëâzïf¨&|; 9RSx#×¾ÙYη 5“N-y– Óp&RŸr­Ì³íÑ‹GôÿËB2¨ ÓþЧ¡e¨k>OöQ!Ö $nÆ;ôÊ}Ùž&a`};—$z‚Ë‚ç ’0=fÓü2Ø~ž}² ´×Á ›¾Ð |å‚GÓ÷‘]&ÿÈgïCYnJWêÞ¿!{æFŠïøïÌkéÿTôÁendstream endobj 3693 0 obj << /Type /Page /Contents 3694 0 R /Resources 3692 0 R /MediaBox [0 0 612 792] /Parent 3661 0 R /Annots [ 3696 0 R 3697 0 R ] >> endobj 3696 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [144.2549 345.7729 166.7262 357.7281] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.2) >> >> endobj 3697 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [194.0682 345.7729 206.0234 357.7281] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.2) >> >> endobj 3695 0 obj << /D [3693 0 R /XYZ 64.9134 727.2935 null] >> endobj 1438 0 obj << /D [3693 0 R /XYZ 64.9134 415.4698 null] >> endobj 1442 0 obj << /D [3693 0 R /XYZ 64.9134 201.5983 null] >> endobj 3692 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F14 2010 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3700 0 obj << /Length 2681 /Filter /FlateDecode >> stream xÚ½YësÛ6ÿî¿B©›!Ä£s_â\ÒI'us©ïîCÛñ0esN’Jâþõ·»øh;mÔÏXÐX,ûøíêòúâùk;sÌi¡g×ë™VÌq©fF¦ÌڔϮW¿$ÜéùB˜4‰›/xš¦É›«k%¯æ”¥&!ÆmÕŸäÅ+Û0¨=õ€‚¶ž”asÿõî­6U¸ðÁa‹ÿ?P,(|P¤I|¼-j‹Ûá\E2ƒ¢¥€Ë@J™Ë¯)ϪœTHÑ–¢…šÒ3ó´N§7¥å”þ8—Ìh•Aú°iO5(9“V„EßMðYp‘2H-Y´/û§ª\yû1oïnÞVùêæßùæ0i—fù7/Ð3̲ñ…l$,ó0@Y²6\\¡Ú>Ï=‘'«¸L¸äÞÒÜ“ê"“k´ß!w¼’ÏE`PË.ÛÄiÌ·ÇñYðàñ…¹Iå‡Õ´º<¦Î;` )f_ lÚÖ¹u&㳩cVI2=®—˜çA¥ïñK3uãmÊh‚25å4JîU D«+úÿXæÎú° ´#õtŠa!Nv> ‡FJù|J" ?vMoúŘnñ³Î˦í}WWÄ6PÔ59=hE ™¼/ÖxÇžE‹pÜA„gÆEËj·,"ÚÙ oF¤p0ôã©ÄuUû—ÝVuxWФ¶z›÷f•{o®m4…`:$$ôÔj ÔÐEc´ßÀ® ÄO'0ñ€ÁfpBš#8ÁLÁ0›qÌN’áñ0ÌQœüv,ým¬B;CíÕž JžKqòKû¤Éýç.Fp"‹B¶÷êš?Gvyë§ýëÐpì×@(ëe€qÛ'üWý—¢Å*¬iý‚.™¬ã îw£yÑ'âÑ N¹Ý£m–˘å£Á3Á7T¥/­?ïøÝºü sðn Rü„ úwT°Æ¿#DuÀ‚U±Î}<÷sT:Ð …'ìòmyÕj>Ò¨ö†N[ƒqÑZ:°©(Û-KPÛÊOŒ#Õ"Þsl,*=ƒ¬²,^œ" ]( yª8lC¾’†ç‘½°°ÄI¦5Tƒ^õÊýq1-ŒbÖiЊZ 椚¦ŠÙ—ÓÜ9å48Áÿý¨˜î8.†,}5=‚œÆ²T*ןŒ"Ò "OÅ2&þÕ¾wT¸ýc€¦ãXÕ Â]B† neð^|‰7a9#ǧD„Ø“Z~¤ÃhSc+çØÄ8TÃ65ÑLÿ•m™oп~§ˆÐxkk£Ù (‘Þ§e u)™PÎv1–M„o‘&UQŽ ÿ©¼*e– ;¨Ì'*KK9!Ç^HZ˜(TSfxWëSѽž0c©èÜiÀ‹­Ð lÌ„U?=Í0£lœOr0Ümî'N„ÒÞ8ÍŸÔÇvFdéq!Pð)í+Ì·ø`!XÉ£CQnTøNÜ» B¸p±cOt.ABjfÎàÃÅ€ã©H›²ÌÕ;J¤ÕÀ þÙ¤‹ Ÿ’Ît”†ÒMÄ•f€$`ë¹äë>.ŸJ “t¬½D¦#†Ì >9Õµ¶T|S…SDã;ô}p‹IŸ`¾$35öʉˆ“w F9ßó±Ç¹£Ø³dïŽÊ†°>4;а€€±Ô 0ÞäM;…¤W2½¿~Èã@Uš‹¨çœ m[1Ü‹âø-œyädî€>ŒópqltÄ h4“™Õ³÷TZ1ád&SX`î›-,r\ YN˜˜ôá½?ù|®¬dNbº?›ˆ‘ãS"ZÃRƒé~("âó©óãšËqUèe¶~¬J ¾‡' ìôxpOÂe‚±‚—ö•Òãç¡ù˜7žú™lœFµw„ÛxLîÉ/ýG]á&˜ §Q“ >W±<ä@Õ²§‡Ý#ßBÂ:ôp­˜4˸vg0r|JDå˜ÆH3ñ ½)½gµ;-%Gæ»°  '7ÓV,ƒ_£åÞïáa ³õqàÿk¹!lP&Üw}"ôþú);nrªmC'úœ¦ ûÒØ³Yê€ß#†W=e§g“®3ÓÇå‹V:”ïú~Oh²o•´Õö¤7Ç-Æð³IÜ1|\b!8SPí$nAâ‰_—‡Í \ô/ÿw骕endstream endobj 3699 0 obj << /Type /Page /Contents 3700 0 R /Resources 3698 0 R /MediaBox [0 0 612 792] /Parent 3661 0 R /Annots [ 3702 0 R 3703 0 R 3704 0 R 3705 0 R 3706 0 R 3707 0 R 3708 0 R 3709 0 R 3710 0 R 3711 0 R 3712 0 R 3713 0 R 3714 0 R 3715 0 R 3716 0 R 3717 0 R ] >> endobj 3702 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [179.6777 646.6377 202.149 658.5928] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.3) >> >> endobj 3703 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [229.491 646.6377 241.4462 658.5928] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.6.3) >> >> endobj 3704 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [316.4428 495.2055 338.9142 507.1607] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.3) >> >> endobj 3705 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [366.2561 495.2055 383.1927 507.1607] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.3) >> >> endobj 3706 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [377.3534 413.0622 392.076 425.0174] /Subtype /Link /A << /S /GoTo /D (subsection.5.3) >> >> endobj 3707 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [419.418 413.0622 431.3732 425.0174] /Subtype /Link /A << /S /GoTo /D (subsection.5.3) >> >> endobj 3708 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [494.2142 344.8666 516.6856 356.8218] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 3709 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [88.3253 332.9115 100.2805 344.8666] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.1) >> >> endobj 3710 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.2636 309.0011 392.735 320.9563] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3711 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [420.7139 309.0011 437.6504 320.9563] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.1.2) >> >> endobj 3712 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [100.5724 209.3747 128.0251 221.3299] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.3) >> >> endobj 3713 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [154.4971 209.3747 171.4336 221.3299] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.3) >> >> endobj 3714 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [326.5992 129.224 349.0706 141.1792] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.2) >> >> endobj 3715 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.4125 129.224 388.3677 141.1792] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.2) >> >> endobj 3716 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [285.0328 41.1031 307.5041 53.0583] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.3) >> >> endobj 3717 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [334.8461 41.1031 346.8013 53.0583] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.3) >> >> endobj 3701 0 obj << /D [3699 0 R /XYZ 64.9134 727.2935 null] >> endobj 1446 0 obj << /D [3699 0 R /XYZ 64.9134 702.3869 null] >> endobj 1450 0 obj << /D [3699 0 R /XYZ 64.9134 482.2611 null] >> endobj 1454 0 obj << /D [3699 0 R /XYZ 64.9134 400.1178 null] >> endobj 1458 0 obj << /D [3699 0 R /XYZ 64.9134 185.0286 null] >> endobj 1462 0 obj << /D [3699 0 R /XYZ 64.9134 98.0147 null] >> endobj 3698 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F18 1536 0 R /F11 2356 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3720 0 obj << /Length 3100 /Filter /FlateDecode >> stream xÚí[Ër#·Ýë+¸$«¦¼©¬\/¼‰âhçñ‚#r$Ú[!)KÎ×ç^¼h6Ų̀“É"åªQ³}û÷sø»»›?ý`gŽ8ÍõìîËLKâ˜3#(±–²ÙÝêç¹#bÑ0Jéü§åæ°Ù-ØüaÑ!ç·p¹o·­ÿ)ækh6ßû{ûÜâÒ¨9sfñËÝ7ïn،¬û ×D:­f÷O7ÿ¸ùù:[ÝÐÙ7”gf¯pM‰pVÍžn¤DI!ÒíÍßoþ– 6ÉbSšü{Çù@÷´ãDr)|÷–Çö©Ð‚Í‹†'=Š‘9Ç¢ LXž~÷&ƒMiñ uDSªk€Ç?ž×°v—0JÚ€yl³Áñ¶nþ‰*z|\‡à*nçGpHð zn¹ Ï~ÃGë?ÂöË¢1_fáF6á'\ÐÆ¡]4ðâ=^oÐÜÑ›^a;Ý“ðUáè|ýö /™âþ¸^Å&ˆàâY4š±ù +çí>4Z/ïðü±|,?{ãnùÇ⣠ð±Ü±8Bw§CØHi‰`bÖ0FœR< ÷c0ü€bapáï2üño}œûf‡Ð‡v·‚[›ÝChõ쟯֟(“;ßg´€Îð#ªøüpl÷é¸ þÒô‰‡mûÙ{ ný¾Pj¾ÄÏm–Ÿ·qXáõ×Çö/½cŸâ„г+àÙüüþ) Ey’9¸Mñ”b®L EQŽAþZ Ñ #ûެțҤO‹Ê•ŠZb¸Ý—ÏxTÃUìèd#Ô£\íñû—íó~s<5'àR`Ñér ªúÐç\{¿<¼<ù@ˆéækáë#¦G^¸s¿|9ädßÙ/`f½ßû€J Y :¡h¸€òECQøø¶ðÉæOÏÛò ‘ÖÉýσaÀ%*õííÔ‚%J1ÞëûãTðTàttÛu$<ýÒó°ÞÇaÁYFc'…a&ƒÒ©5K=¹ÝöÃRpF¬sPÜ%O¡ß•É`SZ<­Õ‚+B…á݇½_öû€’¡Ô”“Å1ˆðT:ÉjˆwÛ~žÈqsÒNˆ5YÃêÁ(¯ nvÇ5Ä·E£¸š¿ù ê$P•!JÓËû:…¬tdžXÅ2±!zþaPi¿oŸ–›Èð†À¬ôõòô“ ÁHH©Âˆ¦ràëëvÛbð¿–L ¼ìqò8nÚ˜'ø Ua‰)ž¬Ll•ø_è;?¯ƒ1œ’=C"?„kœ–™°8xC DÂQ­¡$Â=®Byù½Ý¬Â Ÿ&ã†GQ 8åæÝí5¥ÁÓø`ß#¹Ù™tcRÅ´›`²8Q}ƒ¢YCôQµC§A4‡1¢œœÃ'Œv¶8› ¨wFרCø}H1p·Öà¯ãd™RFGë`ª  K¬Z Oeät¬º´xžUçV]æ|E¸ä®âÕ6òê8ÏÁï8¿­ NmKNm§¶™S›Ä©MæÔ¶Ç©7ËÈ=‘F’~d¾×aÊ„¿÷ñ6óU¤•XLv‹@¥©)©´­¨tÿ ïH…<ƒ²ÄBb¶Ø”&¤SÀ;¹è¾|ÆÁ×H9q”ãßXÊz#–Ó¬åä·Ø(YµÝ–F ñ6vw¿þ’¶BŽí—(ùÈ¡}Ù'6²T\²Óf‘8 ¹DƒÎsˆÕn‚¹*YlJ“sn¾*Ð3¹Ù¹ÍT|:ˆÙâDÁpóØa ±$g[úw­šu¶8‚Zr Ì Hx…Ce¥‚ØÖzB÷g‹c(¡êh*{î?lv¿½[3H!p»Ç%ÍPI%ÃíBp(OY5ù‚áíè›azÁ3‡C~óßSú¿ ™9ÁFR¥Á ê!7SÓÌêabRÄ[ 5ïÉ+äp|:èÙât®8ž«’5ôöy½_bpÅļ^€ K[N>[¬ (†35øç<î×èî¡\‹ëõ‡Ä±\ØéôOiñ¼þÉ­* ì|ÃüÏ«x—.΀ÁSý7ƒþÁº‚H¨Þf´èHWÞ¯‚»Ëƒ'Ò= ¢KùÃm>ˆkè.¶|Üd?k²W¼^Cüg`^§¶wZ«ØâbHŠÛ\´BfzN 1&¨{Q eψ!ωYîë½e׈!›Î‰…!ˆöP¡à “eZ³ñȘ GÆàQ)ˆàé© ²éÈXX €ƒíö5P¢ÏáÒË#^ÄÜ;ÌZÂqZ¦½ =)„TãÎ ÔJñT¦z!L›Òä@!¤ŽpmL÷å“4«÷-P#Y9!ÐdñhOÃû8oW@¿JÄ1“ÂvpRr’hÁÝ„]LÇ|á 1†±º‹uÔôjž¹Uoò²æñ²æùlàºXðặàã;Fuw<ÓŸR Å®‰³¶d½ý[_Sù’2ÕA©ºd‘`ßÞ,Û¥ª„½ô4°»öº+i`§·î#Õ0 Ùšy.4 gBúÇЗfÕz;XìÀçr¸ØÉ¸x[†Ÿ÷­_ˆïÄÚ¹ïÓ*sf„>¸ê#eJÜ0ƒùÝ:]sª{\ùSÍþ/|êúÌŸ–Å»'uÛÄ£²x*^að ü룜¯mœK”z´¶á¹;᨜1¼—Š xR²Ø”&‡öå QxŒ77;wšWhG¨…>Ædñc}0ÛpÂqùºÂx;XÖ”s ›‚ ›™+V§X}R½œ"¯—ûÜ*¯W§0&:¶âƒS(K,p^øÊ+ú¾½„ÄÙ¯—«¾*ݺ&òÊRûrD–ñ× |¡8æl]E:“ ¨¥¹p‚A.¨¸vÙl`m œ/$èx¢Ÿ £'Øk›ÒäÀœƒ‡È-gÝ—ÏpÄ 5BLÇ :\Qu5ÂZež¯>í©˜v¶8[2ü¿tX÷Yf%5óvzB ÉâPœþ,$rt³{~9~ˆ©ÚÈ:ÕÏ:c†XÈÈ0PÂ,W,õG‹Mir`I‚s²8Š©Ù¹’Ïðp‡`zBŒÉâF<.¢­1ŽP¾žFwseF^ZdBªÀøà)—Zû8¬w¸2xDMÚDQú­zïXfNircÛÿ®—+ãÜŸú6½õ@ñŸ8M€§À˜žî0AgïÒY‚Øjô(ÁT躓ñ僾eÁ{㫆e©š {6x;73 1Ø·›§n¹ Qþ =þ<êendstream endobj 3719 0 obj << /Type /Page /Contents 3720 0 R /Resources 3718 0 R /MediaBox [0 0 612 792] /Parent 3730 0 R /Annots [ 3722 0 R 3723 0 R 3724 0 R 3725 0 R 3726 0 R 3727 0 R 3728 0 R 3729 0 R ] >> endobj 3722 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [298.0396 572.9211 320.5109 584.8762] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.4) >> >> endobj 3723 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [347.8529 572.9211 359.8081 584.8762] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.4) >> >> endobj 3724 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [310.5482 417.0543 333.0196 429.0094] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.5) >> >> endobj 3725 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [360.3615 417.0543 372.3167 429.0094] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.5) >> >> endobj 3726 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [312.2917 261.1874 334.7631 273.1426] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.6) >> >> endobj 3727 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [362.105 261.1874 374.0602 273.1426] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.6) >> >> endobj 3728 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [327.7615 57.4999 350.2328 69.4551] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.7) >> >> endobj 3729 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [377.5748 57.4999 389.53 69.4551] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.7) >> >> endobj 3721 0 obj << /D [3719 0 R /XYZ 64.9134 727.2935 null] >> endobj 1466 0 obj << /D [3719 0 R /XYZ 64.9134 628.4489 null] >> endobj 1470 0 obj << /D [3719 0 R /XYZ 64.9134 472.8589 null] >> endobj 1474 0 obj << /D [3719 0 R /XYZ 64.9134 316.992 null] >> endobj 1478 0 obj << /D [3719 0 R /XYZ 64.9134 113.0278 null] >> endobj 3718 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F33 2063 0 R /F21 1557 0 R /F11 2356 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3733 0 obj << /Length 3189 /Filter /FlateDecode >> stream xÚíZ[oä¶~÷¯쓦ˆ¸¼_ò¶Iw‹A’nܧ$Ú±l ¹íÅùõ=‡]Fk³‚( x$Šúø‘<çð;¿¹¾zùÆnqšëÍõíFKâ˜#(±–²ÍõÍ/sv›sCÏÜ6g”Òì»®á*{½eÙÛ7[ÆXöjËmöíw?`ñß¶¹"û Ÿbñßÿ‹^ýð×pñíö·ë¿_½¾¾b ¬o™k"V›ÝáêßW¿üF77Wtó÷+JŒ3›pM‰pVmWR ¢¤©dõóÕ?:À O#„ äë§‚Ô`"6ÛUE[Þ„*«ö>½-Ķ›²Øm¹ÉbËbí=’:`^´f6{³µ2«›P¥{3¾€#à/ðFáß-ÀMôc’+E¨Ö0ÎŒ§÷cóýtð'ÔÐ4xmǰÿŠ ?œø[àÌvuÓ¤*§ßý™ÜTøÿ.Ô}hú~Æ‹_)“8â8NÎ%"žÚºI¥aŽúöDv·¯ßá,)Ƴ[#ØUñnù}¼¯Oe@ŽÈ€»ô3Š~"ñÁmÝÂPŒŒ.Oƒ1´¦|hÊSyl‹¶‚¾ž9˜:1ZÙÖ–¶{¶‡tˆùÒ»ÈhŠ™’Tö _˜a WqzIì4vÚ è+¸ZÎá‚Ñàj¯?á`âXöåT "­“÷k0I þq q®hÀHÁ2Ãm‹nbÐY„Ù;œ¿»ð$ú6³{ë½ê뙩a ž8üi>\0xÃ!%„¡Ÿ=b>„œ†*.4áT˜¾e?€à'ç'Šs±"Å„¸D¢ÖT)¾6ÆË§M]Rˆv=ú p½odTó1ûCñiB\,ÜŠ âEXƒ”lLýàѯ#Ó5‹ßêe·Î*˜+C¬bA–8"úˆÆõbäÃVËà«û÷0q~aBO´"+Ñ©šº™ € Ã!¥ò¸×Ñ=oá…z¿¯Ñ?¦ ž¼Ç{ï®Þ>¼c Eu +B¨šâ@ [g²B§Ootë/ó%h{a×+U±_…Û‡â.R”Çt.Jp5°êA …2®B(ûPW¸¼À2< æBŸR J,7ÏÝ/N­… |@ºj"“B»v+LˆK%0¥ØÅ~2c´¨Žm×9áÈ=€ãëQï¨cPÙ,ÇÔˬ-ù"Œƒ§²rl)O `Q^Á ´ž"^À]­®³Á„ƒ·0„ ïTIÏá}ÕoãuÒ>vÊW1”¯Ê ¢`b\c¨|«6 ¶¢M’_ 8¼Ü·\}¾n ~9£{•‹uýóNéú’>v`#õ1E0‹°¬Á䩤×Bˆ<‡9E ùAcƒôzF SL˜Ä¬ ".R®OQc©Šyí§Ûö3‹n}fÕ0¬;ܸ±.»0‰U < Tà”6ÑÒ°çǪ„˜!g„0§¢©î[¾0ÃKJXƒàã`ž¯„ÃJåMáC•„m·´½Ûr—Ôñï~¾šú+bÓ"˜»¬ˆ!?  ¥…|B€Ìz~€ùq&þ‚Ršñ¾áKzXSb³+2LˆKµ$”Ù3†£Å­üpÁÎ…v–µëqµ0 ©Óþm眣¹"Ç„¸ÄU«¨1âxNpê—ß3bàå]`ž×Âæ‹>¯…]ÔÂoËSý¾Ù•Iúö+ÅŸ(}ã“°$Ôï1üï"~X½¯» x·óqàK5¯¤”h¦Üjšwø„æíª-iÞõvšwbÒ¼#ŠÉª–¯pØCµñq8—„6câMO<‰^ƒÙ,¬Ÿ­z…@0¯õTïñ²êíj ;2:ÑÖºðVGá[†›‰êÅ zÑýp¶j¬|±F’š¤Ó tvÛÕ‹H]ÃãàyˆVšrT¾Â+_¬ÖïïâÛ3/ÅjÜÙO¦Á]oÍÆòì³´ïÛÿkß?¨}ÙÄG‹+ŽÙ@#0ÎôùI:Ä|9£|aÞïj]˜^¾Ê¹§VXÜHÔi‚ô•_.}ÛàQÏúíøâ8лuøjPÆEÏOY» ¦†û÷§ùí_M@&É'¶±¸Ã)‡ ·Fðˆùrnû×ç¬í[¾¸ý«ˆ`ɯG1!.QT–H¥ô˜âpa»dÚBèœ[r\`,|#Æm=UºÚ`×Öd˜—(BVN²1ÅCq|œªqN˜+RŒ€K "Ü21fX?”Ó}p/+(_b‡¸ÀQ¢ÁÀ3âxj›"Á—ç ZwƦ|a”.0ó…Ÿ[Á³¶øô_1œƒPñd„øÜdÑ?'[À¤ÞHÇVˆ€Od ]µ¥la=‚]¶°@1e #Š`S0…˹Çì t5Úâm.À}Œ³>ß×:Ôÿì<ƒ]YX ׈ˆ—ó„®ÖS»ã”PÎÕ(Ip£Ýq¼ŸÉ\¿;.¬=Ïl’ú¶K$Þ³ BÒ¼#êœûPÓ_ƶq–a~Àhvôl'úÇÈ)Öárá¨6ë)=z Ö†o¦ ÷`ò)îæŒövûƒ=:Í…VºÊæèŒÀS€˜4I/§H–€¯ Ïøø•O!ñˆÁ±¼™ y ’$—¥#Äâ¤àfáBÙä{Ḃ3¾H9¡–©¾åKÒ‘€£”­G±C\¢ÈQømiD±rßÂBÝNd#wЪ¦bE¾ q‰¯„;«Ç|_9#Û/CH»)Ñ\^ 3Ï« ç0½–C•"/ȹÏÎÊx9 ›—éÁ¹Ú»=Tí)T+ð‡Ž¤ÞG¿ÄËb×§Þ7ÃÚüe:xfX–>¢•áu aø‹‘kê(34ÇÐ瓟ä‰T„´ÈQBL+Båó#~˜çNX8xÈm×îÓßbò=Þ«º}}úáQwa>%9¤½ÄÁ‰Þ’Êe†pÝ ¶`ÍŒbKjš1!Ð~ r[.ÁpÿgSO'=~ÅÄ·vE¼èwZb3MÙú½Ÿø<b¬nÇÕñ:œ†Ûc#±¤ž©{ë¯1°§ æ¿™1íNдQð±hޏ™3ß¼«8·z“ "¸M~t[Tû)~¿ã,í>Åñ4 È¿Ãa¸©Và©G©aäÒÞ…“™Ò@ñÞŸ¥Ä­'|p‹ƒxLÓ§{¿§¶¿‰Ï½߇ÿ¹‡ÜÅ6»5ND„‘Ò¨U Ÿ´ß¼úþç™oŽ\¦˜÷ [½¾ß‘ÿ„/8z6Ö€È)F‰9U¿å´ nýª¿O'NÝø,dxÞë¬P:øxTkAâÕE<Ú<7¡Á[Ö·}ñbf7ÔèËX#; ½Kk5¶-GµÔÉô0ÅR¯öÕ1ò/Žþ̬‰{ÞîØk›÷ÜGm4g/% ]Šçï!ó,У£øåxÀú,&tCB`ýç)lsJÜÍ+)æ?ùAOƪþÈo¸ŒÛ§IÕím"x=ÀmÂyæ&> endobj 3735 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [316.0277 572.9211 338.4991 584.8762] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.8) >> >> endobj 3736 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.841 572.9211 377.7962 584.8762] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.8) >> >> endobj 3737 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [301.4711 417.0543 323.9425 429.0094] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.9) >> >> endobj 3738 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [351.2844 417.0543 363.2396 429.0094] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.9) >> >> endobj 3739 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [294.4973 261.1874 321.95 273.1426] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.10) >> >> endobj 3740 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [349.2919 261.1874 361.2471 273.1426] /Subtype /Link /A << /S /GoTo /D (subsubsection.5.3.10) >> >> endobj 3741 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [102.3162 149.6059 129.7688 161.561] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3742 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [159.9468 149.6059 176.8834 161.561] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3743 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.0557 101.7852 128.5084 113.7404] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.4) >> >> endobj 3744 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.8503 101.7852 167.8055 113.7404] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.14.4) >> >> endobj 3734 0 obj << /D [3732 0 R /XYZ 64.9134 727.2935 null] >> endobj 1482 0 obj << /D [3732 0 R /XYZ 64.9134 628.4489 null] >> endobj 1486 0 obj << /D [3732 0 R /XYZ 64.9134 472.8589 null] >> endobj 1490 0 obj << /D [3732 0 R /XYZ 64.9134 316.7153 null] >> endobj 3731 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F33 2063 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3747 0 obj << /Length 3757 /Filter /FlateDecode >> stream xÚ­[[oÛÆ~÷¯ú$ávï»ì[c¸EŠž6màm0•E‡”âøüú3³7-¥••s"ˆÈår8;×of×/o.¾ûÑÎjRk®g7·3-IÍ„œA‰µ”Ín–Îk"/+F)_5«UwÉæë—•bþz€›~Õ»[9¿…»¡¿÷7WðÃ)Lbu}ù÷ÍÏ×7lFáÛ}†k"k­f‹û‹þMgË :ûù‚S›Ù#\S"j«f÷R ¢¤qduñæâ÷D°Š«œäK\g…õéšÉ¥ë8g þgŠÎß<°’ ޵¸+æí0ô.c*/:«@RBJí(Ýܵ;Iô«UÉíü±[Ã]&¢-Þ/ú¦ë×^’(Ȧ[ýÔÆ?œÚ¹'H|ðOÿ¢ŠJàŸ±~à¡ùÐú«oáûÞóÌyÆ4!P­g³á8ÿÔwËËJq5½Ú×ã†P ²DXc•åâµÊæ -`HXï÷tèU9A¯ªœK&ðm ’¦!Ÿ×ÃpÀžÔD1]Ÿ‘ÁHñ‹²&Z)6e¬”…ŠéÖ/Óf^±Ç6ç–aìùØNO°Í#Öè)×ÎÀÑbOÖ~~0 Jë°àošƒKYéZé¯^F$XåWaAöÍ2ÎJ«8tS—ÊyœÓ¡Yî\gãnÀGÁU7퀾٬üà?8æ\ò Àën/+cçNLnÆæ¦·>D4ôË/šÑymY‰E×lÚ¥㱃w±ôm÷…ÁÅΑª)’!r6zŠÈXvÙþE™\û¯³ùÒ“=¯áC†S¦ IÅA— ä X&*)P­# ‘‚MÃ1©ôÎ÷…ƒ¤ïVí¡˜Áž¤­Uó÷—•”ÆB„óþt©4È“È2,'Äusbgâßœô)©×ZŠfLÔD ¸ö_= _\Õ„rafÊZb$µ¯v´H±ÊIMsÂ4ß}øHãÆ‚àÀ–ÏÇa¤xŠCˈfÖNYÜE°«¡ÓÝçW(J¸¤ö|ü&Š'ø€„©Ù”ßÀ~‘Ûoºõ'°­Èœa¹+´­oÐic|›š-ŠÔÖÆø@¼Ó< RI]@d^±ùíazWü ½£Ï®ý Έï»Íèoÿˆ¢vO²Y!„‰ÅHB$Á)áýL2àÙÍfÇTŒ £GŠ—¾±püö8¸Ì׳ AG¥P‡²¡1’ìà}z‹’‘ÔIüݽ°§DG˜¢¸ûñ ¡Cæ—ì>/ɯO)‰b•“,a™V›Ý—ŸO*J2ãN…añU“®õÈn ó9ÄÄm’GÜO€ ´SÈR+08aüv‹a2#±hÖI» é†x¿Áw†õŽ´È¤ŸðÁþœá×–p†vŸg T*·6}ŠÛ:­Ç‘Iüu_ív ý[ðapË ¸ÇfXwPPÈ⺴2Æõ¾D 84JÅ)·M·*¨‰€/"̉’åõüÕ:. 2·»Z4ÎUÚ8ֹȪ|0QŒw=­–áyƒ³Wþ…î$A>„ïî+'.àt­ ·üøÃ/o® ëÓ„)f&ëó Pl *š:k°'H¼S{‚íØ†ÔëM†À4Â!ˆj!;;ï†'G½›{ F£zÁyÖ}Ñy¤IIûÊÓÆïtï])4<%À6‡®y"ub+€Š)‹˜VMñꮪùm‹Ì9k?è 0 •éÙLŸç^æ ÒHΡ HÓL4ÑyÅ$òãÔ^A­þR½/°aÆœun£a"¼ˆF].´ÜqŒâÉeÞ8ߎ!þÀˆäئáÇ;C0¡†°0ãáF~½#Å*'Y2`sªk»ûòqC0œXÀgd2R<ŤÁ¾ˆS&1™R¬r’¥¦'¼×KÓŽ‡ 5¡üîlL&Š'˜ ˜„šgÊ$æü€`ÍôyŒOñOm^–ó˜C’cFÌshñÿs<[õ±‡UTrþѕбª=f”5äN~<^Aõ‚MOá’ƒæçÈZ‘b•“,å- ×@:M;¯¸"F{>&ÅLâþ—UMxy¼„ª ú$µáEÈ…åN±(8ԛƬ®oA`Y,pNŽBœ¡¡VÅR·Û,P5ÇYGµ†û}\){>#ÁêÄÁ„6 ÕΞëP¸2ùÆh-C×)$ï 8ƒØ¼sù¡Yuÿ nü“N&VÎqÿÍÐù ¾÷öpÚ𩺠ÔúìTÊ)µ ÚQýŒÄ~ÁôäIJ1æ%Ìxç‹Løæ3Û¿ðù‚ ‚¸k»7¼-µ %ÑÚ²(®Û híÛ1Àlw÷ˆ«lüZƒ`½õ|ðÍì># žc3ÛÜ õ/$ÂBÖK?Øï7 ?¼¿uï7Gz9aîøÐ,£E¿·÷ cßµ¦Ø°ßëZ¿Gæž°’Þu®±ë¿è†})‡×&t‚qÔù{3†éÍÚ6K·?âã@Ü“ÄÍbÿ PÀoô{»­\‰ÖãÆg=ßxR·M¼\D¡¹%â¾NhNxøÃ*Ý@áxô?¥[®ð®m@œ·{°ó\¨–ŸAÎ\C“1ý럃hA9L°6àX£¾>\DŠUN²/($, ¬¥i®ùEHÁÚqkSó´9pß­Bi´{Fÿìp¿ÆŠyM8îØ(´ÑZÇí˜Íjé‚“7~xÔÜ‚ÎüKa‹ÿDín]í^ÐBÍ z‹ã5¬ ©Ï§†Dñ„ Èáζª¡˜Y¤‚×$?£­$Ч˜Ä§ÀÍ„ÉB-;iIS"Eêªâ›ßL–¨ºSšôL ÜûÚ‡6ôV³tú<Ę•Ûô(—(LÁžëa€†Ùâcü Y;R¬r’%<ˆ›ãFï¾ü dðw}>&ÅLrÈwhØ”É1C–-@¹VÆn?-Ä‚ å òÐÃÁûî‡úÉ*À$‡Ç¤rÍÂtŽî¢h01nå3pÒX¢~‹ŸaŸ"¬2Š¥ón üÈŠôÝgà$ 3‰öq.#Á€alÆaìXLµyöhK†ðz V+ÌÅÊáFTçð;ÚôÍU|þÐŒ®Æs³ èq„Li;Žãn'—qo:ˆöÔ&Õ‹’±ÅÒ¾SJq·Ø2©4ëe|ÃR²„e´ µ†6M K;€ÍàåèåÀÔ®–‡‡[µÉÂ@D¨ ÒLag¾³žQw Þ,'ç§£ÒVQéa¯5€>ßÝ#"æ×÷öñ_Ä#4rò¹íþÝvëé6>ÛëL»yïõ/‡`|’BÔ°SèNóD‚UF±%¡Šß8Ë¢xõËÛ?®‹§M þÌŽ‰Ð&×Ñ:ªl"œw‡±?nãyQ¿QX%–'úE‡8ÂQA‹4œ8 »@·{Ûõw¥pöıJŠíY ¹bǧܞ=Ô¬>­Y<šP³3*vGð½†I®§÷öêêúÍ›"œãŒš=µjv ÖK‹]ÿܹÜN»0RÖ.¸} :GªnwIfºb^· ¾Ç‚nq=SÓ¬úš‡¸|ný)½Ö1<†×_­w•šM¶¸D ÕÓp]jd¸W÷g/˜Kl sî"ÁÜÕj m§ŠGŽ»PhÀ[fâ© ª]Y«÷»©¨à>`- ×jï|aráèŠÉý<À‰Ç1²¬™<8ü…Ó€5uäÒþP›òêænè¿c_’×ДöhJîý•œK“ŽS¢–ÿ LJendstream endobj 3746 0 obj << /Type /Page /Contents 3747 0 R /Resources 3745 0 R /MediaBox [0 0 612 792] /Parent 3730 0 R /Annots [ 3749 0 R 3750 0 R 3751 0 R 3752 0 R 3753 0 R 3754 0 R 3755 0 R 3756 0 R ] >> endobj 3749 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [250.0087 549.4777 277.4614 561.4329] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3750 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [304.9576 549.4777 321.8941 561.4329] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.22.1) >> >> endobj 3751 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [238.4939 159.5806 260.9653 171.5358] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.5) >> >> endobj 3752 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [289.4303 159.5806 306.3668 171.5358] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.5) >> >> endobj 3753 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [251.741 99.8047 274.2123 111.7599] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.1) >> >> endobj 3754 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [301.5543 99.8047 318.4908 111.7599] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.1) >> >> endobj 3755 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [342.9818 18.585 365.4532 30.5402] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.4) >> >> endobj 3756 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [392.7951 18.585 404.7503 30.5402] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.4) >> >> endobj 3748 0 obj << /D [3746 0 R /XYZ 64.9134 727.2935 null] >> endobj 1494 0 obj << /D [3746 0 R /XYZ 64.9134 702.3869 null] >> endobj 1498 0 obj << /D [3746 0 R /XYZ 64.9134 476.0578 null] >> endobj 1502 0 obj << /D [3746 0 R /XYZ 64.9134 443.3333 null] >> endobj 3745 0 obj << /Font << /F8 1548 0 R /F21 1557 0 R /F22 1606 0 R /F18 1536 0 R /F14 2010 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3759 0 obj << /Length 3346 /Filter /FlateDecode >> stream xÚ­ZmoÛ8þž_aì ûPsIŠ¥îÝm.Ùí^ÑfÓì݇ÝE µ•X¨l¹¶Ü$w¸ÿ~3ÃIW£h,SÃáp^žýúæì»Ët”±,‘Éèæn”(–‰HtÄYšr1º™ÿ:–œO¦RóX޳ÉTpÎÇoÞÝÀÓøb"Æ×—!ÄøÕD¦ãó7ïpø‡É4Š¢ñ¾Åá÷oßÛ¡WïþnÎ'¿ßütvqs&Fþ‰ve™0•%ñh¶<ûtöëï|4?㣟Î8Ó™=À3gQ–ƣ噊#«(r#ÕÙ‡³Ÿ=éã8í²|}hÇI&™’*¢ß,ŠÉT‰l|[Ø­àÏ ÷Õ”õ åþîRÊ. ÁD¦A š{UíoMD²v‰ÁÖH|³7 ”°·ˆ‰(•îûÞÎÃi—#í¬'—PÀ9Ò²¿·ŸwÅæi b¨èt2:ŽÇ„ÔœÉX¥}!ßÍ@ÆL°”Gú„2:ŽÇdÌÀIÔž?ÔÕâ7sø/Œct]+·Ó‘ó‹rk\jÞ´Eo*æ8Ž›Ú¼˜ÕK^£Ë5ÖÿrC²*Ì÷-- õŠM¦#±1$ˉÔãÝÖ~û6[&5:põdÞì¶®b×.ïPlÐDš°˜ p)!XÇ’Dn0‘˜ðñ¦ ¡Qú áÀ÷Î|6-ð°ÞŸËÚn'uÄ5(e¾ ‘Ð1“".ŠÞî›_Æ’”3•dâ«Íï9N»,‡æ÷dQœ¶ “ù9?¿øðahõ(a‰Ê}ß,Èüðt×x²ºÚ]Ã0*p³jµèõKÈ—Ö"Q±«yߟ'q2ΫcfYU>•Œ<Ö}£ñK ø$e±ˆ²¯V¼c8írê]gÀqÓQ†/ŠÃB'Ñs<"£àªPõ…<Ï«ê0.DŠiî`ÉLH˜Õ8ÇØÕãç牉b1&N܉ÂU§,U ?¼“³ÀM9Ë„ßÐü1<ê4}&m R9A)–ð(9AÞ²§]–¥F`y‘êvågWÌÒ,=¡Œ–á1°{”Ⱦˆ«9Ú³^‡ ùXèn>@sõòAkÊøù ÍXÒÛ…ÌÍÇ'àO“4B¤‰E2¾1ÄÂó”0Äb™—./ÐWÂÉïr4έ<>Ù‰åêÞæЀÌ{0’WMA –7¥qcd¨%!U¤…O.8ö eDëÚ}Àº?RP¾(Ú0@!^ÀœTtGqGšc2;Ì™Þ,ò­yXÕæó ”W!| G10i×™°1ƒ&‚­}û¢x5é;}™|2«7›Âð¯È¤T&“”ŽÃ úýZ„A)eñHú)Gê»`VLÄÒáA½ú¯ˆ˜NEìø¥!ª›T„–,Ë” ¼b™Œ# sBµO‡r>œ5XÆÓh”ÀƒNÒÀºe8íp ¡ºb\a9l©P¼ë‹ó÷ÿ¼¸>–ñ_z+“ù­Q;p¾éx˜õ ¾bY;?ݺB0Ÿ¹ÌT3¨vKW¾G†OÎ롱!ÎÆ¯î³:RçÍÞ¼m“7E7F%à6uUÛHáP¥{E"L›a|¤G­·â# ñè·ÑP Ê“¶®šNMé4¤OAwõ¦0SÀ©¢]öÜ;>vZxËIÂsmÈ©ôEòfѲ^L$†0|ˆ'tªlø¶È;IºÓF5€ÑÊĮΦÌ+áßà•5:M!}•ˆ;OvÀ©´pùäæú—‹¡oJÀfÓ è3Ä*o•:ÿ‡­?›üª²KÀb•üÿµË>Z` *4ÖY-äQ´ÐÇÑ"†“WADž.º,ŸÁ OFUà/7 !D,Ñkó9sG¬Æè3”s‰p˜·(eïCŠŒÈ>³ÆC¿Y=ò"ÔØÊ}Ô¾!ŸÄï„P%f¦|Ó•YQE‚¢ï+šJT…yød’» ûT{iÊåIFi8chqJè°|ÎJø‹‹«Œ2f1`Ä etÉ(S¦£H÷e¼|=QÅpª7>ˆŽã1U óyÒñêšZˆÃÌ+-ébIb^­ÍçGÅÚ¾±iGê(\øá „Hxã+H|XèÝcPIeðȧ´¤mewGmóöÁà®4•.ÉJJÎTŒBX6·¼ ¼fÖFò¹É¹iÆt »í%–#²Æ^¢¨>¥Libõ~e†ÏÛ·ƒê+‚(¿±¤¤ªàË,7»za „Á†pe_½ýzSÌKÇßÔÈ ÚNN«WsB0“¾iѺ³xÑ—¶SÞÛµH»«™ë¾îgYB±„UH/róÑ9 µU<Ò¶¾<9ŠhŸ[ÑÄ0Æ è'/V½³¾ßX¦¼X9©HZ¬ÍË ²m»Pîæ…AÞ¼45üþ)¢µ# 3¢:šf6±( ¸’>Ô¾«ÉfBºªP8¿î¼`ŸDÕ©ŒÊNŸ _Íì)’x´Ç Wž²ñ,®S®f–"ï¬L5e 1L\)i ˜+I±¢MTðH6MN]±bŽQéñ%f iœ_®üA-÷Anç²±D-Së¸4c[þ1¬ó¨ƒ›&8Uežró1¬!ñõ/|îTˆ>ˆq¼õ¦¥‹jt+Wû¦F\¢®T5 ÎÆ Ñ?\g\RØ«4¶ö6Ó©8Nu[œ§¦N´µT¾ w1c*gà—A·‰`ûQ{0ðgp`9¡Y<ÃçÍ¢ réø¸ã(ÈÚ"IÒÓIè‘0 yüå~• Pfb¯¾°dPhpã@Ýšß0 | ünkú’œŠHoUânTôÅýê Š\nWkï)˜R<þúhu§]–¡+LÅ’Teíʤ÷G8Å®0&£(;¡ŒŽã13ˆ)-E_ÆózIe—»{Ì»”Yõæ†} uKÙ<ùçû° Muzæ»ëªí[m…­©e{¾…ÒФëÎ8•Qž¢ÚmÍ;Ûã¢òꦒ$ _S‚žA›(µ‡ß´7akK3—gѯMK&…ÊÖq¢ÚÕ¸n KŒïöZn ¦KÚv‡¡›7©–)í ΪýXgñEè· NL.(È`Áä(î»×PÆ”ôlîv†””páI £!Ó Xv:©í  šë­Õ‹­VñFižf‡ ¨ºÅþÖ`ËÂL•?:¸FI½\WÅ£…¥~Á´usSÉv/\Í;€|&^˜çµ»ö@ àø‰®n[2½‚Ž¥©­g@e ÙJø#bN¿†yÌÍ%~U¼ h9M˜n;vËÀm–‚h”%úWÜŽá´Ë1t›…u‰è,LW€Øß‰€¢˜Iï S¼ŽÁ6PèJq™¸í~»YE¦5Ç…a¾i Žš@ªŽ@J™÷/Ì+ˆ1PLCÝKOÉx^¸òǾÊ͸9µQGÖ€ðÁíÛce¨+¥F8Î)ÀÜrœvY~À%KˆæÉœ~Ñá¨óêàRbå «‡EI‡¬…ÑJ>k¶FMËåGßÕÞ¯ž9ãZéŽQ¿dQK^<šÄ°nÌ¢þ¼Š_ìie˜×fÌœe̳‚Âb d2®¹ècI»‚A~ÛȤ‚v‚§,Ó¤´ àÓEo’ësDŸA¨™I&›¶1êË û:¯:ýûr¹î\ßÝÁÑ~‹jy*‹Þ¬†÷y”qèÆÅŠMåW4`äÁ¤äY³u¸u,UÞC°4Í"w8oôÚ/§&õÛ^ j01Ä#Ô#©éÇxúëƒÀqœvY†0 ª³TéɺþØ›%*¾ƒä=² ꈬí2ÈùqCÄx…‘ö 1l¨j¼«n!£§'€ ËpÚåPìžs˜îÉHIlvèbâ9/‡öéÿT®fÕn^_ù˶ٔ«{¶ø[¨OÒ§ýæ~Mw‹lñM(:^×ub²|ºuF¾ªnÀ̆Û}€öYý‡þz‹~íÔ²ø3>߇ºj媱¡0¬¿¶$Ý„M±ÝUÍ÷!¡°Ê"š¿šëù-þlïÝnÏÅì#îweWû¶¿ø·´:î8(ÁUuK'ÓÛ×Å}I±{ùê퇋ƒôFО@ž…û5ÓÑÓAPyž=ˆ^½½Å[‘ÛË÷×·¦¯ÿŒPÍn³2KàÔžNÊ··ö§x-›iÐÔÿ ÀÀ^?Tv~Ia {¹6•m{9fš²Â|ç‡Í >­<íUݤ¶U+öéü¡"p4àš%‘¿õh²WÒäÄ¢‡é7ÿ.q¶£endstream endobj 3758 0 obj << /Type /Page /Contents 3759 0 R /Resources 3757 0 R /MediaBox [0 0 612 792] /Parent 3730 0 R /Annots [ 3761 0 R 3762 0 R ] >> endobj 3761 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [268.8989 394.0432 291.3702 405.9984] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.1) >> >> endobj 3762 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [318.7122 394.0432 335.6487 405.9984] /Subtype /Link /A << /S /GoTo /D (subsubsection.9.2.1) >> >> endobj 3760 0 obj << /D [3758 0 R /XYZ 64.9134 727.2935 null] >> endobj 1506 0 obj << /D [3758 0 R /XYZ 64.9134 381.0987 null] >> endobj 3757 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F14 2010 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3765 0 obj << /Length 2066 /Filter /FlateDecode >> stream xÚíYmÛÆþ®_!¸h Çõ¾‘»7)âƒ.mjÔG@ ¤@K<QŠT)*w‡4ÿ½3»KŠ)]lëc`"¹»3ϼÏνž^Þè±!&âÑx~7Ž$1Lȱ”hMÙx¾úibˆœŒR:¹Ž³,²I¾žBˆÉm /EVØW9¹ƒ·²Ø¸—køá6qʦ?Ï¿Íæ#6¦ðØðˆH…ãåfôßÑO?ÓñjDÇß(QFà™at8ÞŒd(H(…¨¿d£Fß7ƒšbÐ&ùÅã¼%Ÿ6Dóqd8‘\ +ÝŸ§AÈÃÉz›-ÝSòo¶d›µÞŽñsJ ×R(õ° ÌÂ0÷ïGøŠA›d_Ð(¬Š®K²D„]SÀ„ÔDðR3¦íÞÙ#)±Éž²dçÌUÜ9“îw ®}évyƒŽiäè±PG–Þÿœšþ¸ßÍÓ±®W„Fãì64Ÿ­)O/hìë‰ <­Å¯Uøï¿iHÊ´Jðá>ɲþ'}H€¤€}À1aÈíI»Ñ®S0–g£âãägŠ„ZËËÉß"xNþz[[þ»¢ÄŸ÷WìJ J/ºB¾wÂ}å~˜¹ïsŒ "th)³'³U&ÎÁªûÄyÜVv¸’”ne[Ö{wîûnÀ ",¡çðªœ>dܯW…#½DzÅf‹<+Ï?Î1yÏÞò,2ø¸¯ÒQ-Ž@ÑNIr@Iü%Y%…ç›9ÔµÆ@&/›¬¼i¾ôDª}÷€;„Ü㦨ùÇY•”y\a)üeʵ;}JDŸ”7BYH*v±¼Ñ&x&o4ÛÚyãÙ4ùkò¸L¶è_úòY–.×TOÛ¤_FC²¡Lc˜¹@õƒ6É¡2ª TyàŒè°(oü!K®¬ÀW}ã°©ÖJ_yCñäò9…ÇpÄûÒbý͇ƒ±ù!A}œËIªYt1—k<ãrͶ¶Ëu\oÈýÚ)8/ú ×¶(Û¶ˆP9ýØ}>Ôéh¢Â0ò9h@QTÂ%‡ÖJ|~ÿ×P Ú$”EÑnνøì«@ Ƽ86µQŸîãÌ6uf¤3¾]¶Áà>Õ'Ê8ݵ·®ö‰[°½Vmçf· f_Ñ ò0‚6ÖA{·êšÔ„)Ã.§é†â3šàjl²«ékŸz8 J+uAœ5ÅçpšˆíDç}²üºÄ ˆHĸôj'Ó@Bû{µìaÊÕ$9”5ï®æ¢_Ô•ÝÆ¢ˆ ™riº¥œ¥ñ_t? ѧ7@äÂÈÓñÆ4Ñwqša`–‰EÛé™Ê¤Ú£]ó#sµ[.  Óuî_°Dè6—Ø~¨ÈI]‚8‰ŒdÝ4Ÿja*MšN´Oî«õ¤´AGD°Yl»QXs(àáÃ4@ÿ¼â/–oéV†ÓL)UÝTºr9!î“Ü‘´Ñ„ëc--¶9V^·Éj…J\mÙ rFÆ-•£c%ÄLY쳕û„ò(›):è%è$\ØVñq»U43”(%t7ü–ñ¶r–®Ïó–E¹tRqÏ1òÌRÛF‹óUÖnŒ­#ñɼNñÐA¤«Æ‚îœx\«ZÖò±ØaOòh¿.÷Ö¨d¨CJ1ÜÔw¤ê¾,^W6Hõ¶xç(:7gŠ|Ê 8gŽÂïã p¥è¥ qZ˜Sþáv¹Ô}¢ŠÌ‘nÓª9+ëÉɨq“±'˜`SŒ?2[Ö“WÉs͘²Ìÿ7—l¿J\÷×]U¦ùšÜ]'Ú@»{_¬á*”°ùÅÐ$ãu÷º"›§Eçn³yRnüÀ¬ˆ³:åޏüø«ýÈ(‘U]jm‰ËõîÕÏ4¯Ü–»}¾¬ŠòʽÅeZ=½âØ(“Ý>«^utÝ!rë\?ß­u=_4åòì¾èrÿ²G™!Üf‹ï÷Iù´x¬ÓIÙt=°ßH‹´¨!q]júâ7ÏëÝIÒ Y¾²v{³øçlv»¸yûnqûîí›·ßž”"½sôñXa ñÍböþzv;ÿÇÛ5æ´ôïtwclÏãÊÏCëñaë/(> ìÅ)nW?W]A³Ídž Þ9¡‡¦¯YjBQ4É@!B}¾CԃŇ•Â-Y7|φ¾$ŠrstÇ©£ÓÖ, ¯èá$UõéÛ¬?ˆ0®ôÅTÐ<¯! „Žb`©é„;fï‹áóôž§$áTмã"xâN‘P6ã­x7Pfv§þ·}êZóN±:ו¢®þG‡endstream endobj 3764 0 obj << /Type /Page /Contents 3765 0 R /Resources 3763 0 R /MediaBox [0 0 612 792] /Parent 3730 0 R >> endobj 3766 0 obj << /D [3764 0 R /XYZ 64.9134 727.2935 null] >> endobj 3763 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3769 0 obj << /Length 1829 /Filter /FlateDecode >> stream xÚ­XkoÔFý¾¿ÂµòB<Ì˶lC¢!MZ‰¢•Ùu ÇÞz½%QÅï½óðÚk'¡J„ÈŽÇ3gî{Îõ‹ùäÉËÄSDE<òæ§^$‰bBz± $I(óæ«>§|ð˜†ÜWÓ€QJýWGsù‡S柼œ2ÆüçSžø³WG8ýË4BøÇø§ß¾yk§žýl³éÇùëÉá|Â< ÿØîd©¢Ð[^Lþž|øH½Õ„z¯'”Ä*ö¾À˜¡’л˜ÈPP áfŠÉï“ßZÀÀ!]Ȩ1ç•EîEŠɥР?ÌËe±]eÓ ä¡ÿàl]WEuFΠÐpÐTêÅ/ªªpóŒ†ÆjW‹eZÑó¬¾0hgUŠs¬¿…ë-ÿêIF‰ŒhÜÕ…x”Ög›gcgæec–œnËeSÕæ)­óæêÙ˜ðˆdÖüh~NV‹H~*²Åì<[~FùQf õ}ù{ úŒÊs\,/³åbV•M^nÓ&¯J¯ŸmFàŒê¬ÙÖ¥Y8?ywh£ûŠïÀÕ¬ãê€CHÐ(ò“0QÆÛŠH‚Q+à ©êËô§ÖEöŽcܯa2[â\5Üÿÿd8™ã\yQ¿9ÏÌ ÀÙ|Ó˜§ê¥ŸêéÂN®áAR°ÄÆHÛMEÐ’PHj)ÿ˜ sð<«íh…b!è_”I—8/•Ÿš×k˜ª³U¾L›ÌÚ£úŒI’Dagé`(Šý¬d*"TÅ¡'!?T"¢aZêÔ3yɔ◂0)eŸ÷²²E ºÃ´„½„‹0ÙŒ"Vk Ÿ7`Y—C}£II•UèËy¾ÄúsnŒ²-Ñ_h©l3b0&I 1aöâC|ÈIeäðóÆBÃ/sÞ)roÐ)y‰î×NûêÁr[kÇ”(\S\™Ù¡/Wv?D ,4‘¢±u؃žD P¡÷é ¬ô¿ vµ-VøÈýO¼Óª23•ø.¼z:b𔈘Õõ4/W¶œýy €ôÍ~´€ö$a1ø,a„òDÞ9ZZÄ  9ŒW AØvÙ.ZRÆ”ðXÆ÷(¥C¼MʇqÕ—ò`( „~LïÓŒñ6¸©Ú3ãÁŸ˜l7d]Lhì‡Øè„ë7Œ’ØÝ7¦Ö¾*Mй|Áh\cLãkmôc+Ž@KæNÊ J¯Éºˆ‘DòØ®‹í@ B£ØKHL•)²O{}Vu–Ÿé«j¬(F‚D1—ž ˜+¹‡¢èƒ.äHQŒ"HíNÞ…yü݃ÿÉÐ$pK‚QTÌÆòZ‡ÌnwDŽˆ“ž#V’XO!”˜"ê|g#YÀ ‹8b#PŸRxÛ.C—d9´ a»)J à€ïÙ¬OØ4u^;üiŒ²|#•×PIî.æ…qr—|ü&&ÉL²Z`”Ë£l«»iÙ1¾®%eIÒ›jm¶E3JJ5þ¶Íê«Å‹ì,×IˆdïZ’©e£{‡ÿúyñh%ÒXÜ-£Ô{Ùöòÿ»—Y&‹Ú÷¶¶ZÏì5ûnÜÅó¦Â¬¦ì• qð@Wc³I| mTØD(sv9£ìù†ø˜)?¨í=ÙÉl äŠÒ3³öÉ£Vd3xÈÍon;M¢u<¥v„ ª÷ )‘n…žŒ÷ ×[÷(»l¿WÅÖõ";³ÝÐH Þ±~¤–+žo'‡³·ïOzÎèw·‡yW.ŽëjÕ ¼[wýVyà´<è§ú³dù:RóÛ~§[¾Žª =0U]ôÓÆ> endobj 3770 0 obj << /D [3768 0 R /XYZ 64.9134 727.2935 null] >> endobj 1510 0 obj << /D [3768 0 R /XYZ 64.9134 546.4082 null] >> endobj 3767 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3773 0 obj << /Length 2620 /Filter /FlateDecode >> stream xÚ­Ym“Ó8þ>¿"U|8‡‹…dI¶ ÇÞÁ-Üî{Å-Ùb«€šò$ÎŒÇÎÙΰ³Ç¿nµä؉TAñb[jµúåé)O—ž›YÊÒ8ŠgËÍ,V,RÍÉ™1\Ì–ë7AÊô<œóàûü-ªš‹ ¨®ç¡”2ÈèQåðEÿœ¿[þôày ¸ .XÂ#1ã–ß6+ª·\sø'ˆz(‚TH›:ÚÍ6«V]QWó0Š•—¸êâÙò9ò™8ˆÅL¥±ž­¶ÿ½xóŽÏÖ|öÓgIšÌ>À;g25z¶½PZ2­¤ô#åÅ«‹ÿô CÏ1²|ŠæifRf¢YœFLEJZ‰?ÎCéàï!=³²¼¬w¨î Ô—¡è°EIØ€+»ä‘>¦Ç›‡áþ¾…í/?|¼¸÷üûÛ½Å?à†ß-¶õÇî-îß_Ü_üþüþ0ÆÞ™Oʳ)ª5È„ý¶Xí›&¯:'àåârñ ¹˜U~{Q<f&KµŽÐšaVçq< %ØUÉØÁÐ lù=~ |µ8L´Å!<‡Iìq.l dÂT,“ˆÉðߎc©”„(Óш;"OÀŠÄ0£O!DTJÛEÿú÷¯ •Iƒ—°WS—õ5}f%|—õ<2ÁdÙÒpwÃ9¼§<@ü·VçÆMÖô\ Ê.INã7­ÀÅĹšɈ',5‰þ²Ô,Ò±™I€sb!‚%J‚bN‡d~˜à b×NÀ}›oö%Mxev@:͸ÔÍ–&Z;v‹zä ˜ ! 0‘,Roaï&«ËÚ÷¸9Oý~›ºq†«I™@RÕ1°Cu³«2o©–€Q)åi ˜òµÈG˜”ÚmZ–>O®:GIU ßc·ãû9¥Œ~;\CfÐ:øýd­58åTØyŸ;úõÒ–>:JS±W{‡R–™— ¸oH—Íc6«Ã0æcÐÓêhœOŽCû lõ½ÑE°Å‡eÁ “&° ©íª?½,0leIc›ýááŒB]¿S;‰Jï+×l¸> ð/Ödvczfëµogw[]qfc;kŒù»ËEv…¶Ë}óÄØAM%ëê­ÝvA%°/ØoñˆØ÷ ¾XÙ-ˆ)Ì¢¥áÅQ@¾ÃÇÞÚ«¯ÈØÜ’Ë ½kiù–&Ö(t“»¢CÝ@kë² ž‰•í®·M¾%NV¿ßoqÒ£^¯ó ú‹Îâ ¸]!ս㲷â-&²:š[ì^ÏtDO~¦¯ÂÌ›—ØÄá 'm|§‡À™Œº®v6„]œ)†ŠxÅpY¹g¹·zY®Žû(r,QØ[·ºÝ¯×[ÒNu'1èÍ#ß>Ö»r"qa’„¼O4¨IëT´ÑÌcÇ ¾piË$LÄ<co—]çäl¥èd&Ê?"tÖ9n)+ >ØÞIm–pØ}–jh6¯V542 f—7-õVä}@8YtD[l­óu\`Ö;·Óí>&ìbp6¶š¸}K‹àz*=J-hê(cýÖa>™Œ¢´ ǧQ˜ÓJ'’åݹ%¾K†1ÛBÓ°MkGÓ ©ƒ›Ë*®s~m¨¢pötRß #59oh£qp“ሞˆ¿«Ã!‚@é3„¥‡ Y©xØùÛÏ“õ-MX5pý¡XàÓ‹ÌÆcíDXÍ!¶}î"&£#|(À¨S!gbÝ÷ PnµæÁTŸØ¯aè$ebl ¹ S#¦*q2I¥]Äi§<ïm˜Ø ÏN_ïµíY? ~H¤@eC ¶sðÙÀs dñOŸøèëŒ-‘¡= °œMZNÃYWê/¶œ‘,6z¸„;5A#Çæ(;`Ÿ¯ñJ 'uÜ8ITëhztFZ®¨ç³fåO“0Q÷ÆÎ'ïe¨ }ºý9S*R}û_ïN»ÿ2»23 § ™ˆô´ÿŽc8d9ÕÿsÆáPßSÛÿé~_iKp)Ô‚B-Ù¡OL&ߺpÂm;Š*·ÈŽï/Ä‘×`•jÓÑàÁy°Mï<˜çÝù·•sM¶éè‡Ûôa!%$‡‹:ŠÑQã ­~“gÝÖå5,Y4<ʇC,9-ÑÚ†æ§@3q¬Ÿn·Æ§Ç”)ô0YÛ|OðÉB¤à½¢HóX}=~<ÇpÈr ?ŠIhØ;!€ôñN¥&?×üûŽm:lâm/q}8W)—‰†·G:_åÎuT-«‘§ [™íCÞ÷'2æ±¢˜6\M8Q™t„؉ÈXÌûƒÿ²¹; |É Èm[ÊðlûõqnÃôÝï‹ò¹+‘b‘Ð~µŒžágd„¶Tª4ɸ²ï0/Ç%x’®ØÐHt´÷ÇgÌÖûàÈÜÑ!;T´”?ryÄ·ÞìpÍÆ&«n7ÍÂgõÿ„¨fendstream endobj 3772 0 obj << /Type /Page /Contents 3773 0 R /Resources 3771 0 R /MediaBox [0 0 612 792] /Parent 3784 0 R /Annots [ 3778 0 R 3779 0 R 3780 0 R 3781 0 R 3782 0 R 3783 0 R ] >> endobj 3778 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [489.2329 399.5711 516.6856 411.5263] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.10) >> >> endobj 3779 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [88.1705 387.616 100.1257 399.5711] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.10) >> >> endobj 3780 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.5078 351.7505 128.9605 363.7056] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.13) >> >> endobj 3781 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [157.3196 351.7505 169.2748 363.7056] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.13) >> >> endobj 3782 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [429.3974 256.1091 451.8688 268.0643] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 3783 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [482.7005 256.1091 494.6557 268.0643] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.4.3) >> >> endobj 3774 0 obj << /D [3772 0 R /XYZ 64.9134 727.2935 null] >> endobj 1514 0 obj << /D [3772 0 R /XYZ 64.9134 605.3688 null] >> endobj 3771 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F18 1536 0 R /F34 3777 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3787 0 obj << /Length 1743 /Filter /FlateDecode >> stream xÚ­kÓFð{~EtRU§ÂÛ}ùÅ©€µ-WQ í9›;SǶsW¨úß;³³vâÄ<úÐIçñxž;ÏÍÝóÙ·ÒyƲXÆóóÕ<Ö,JÏÅYšr1?_¾ $׋P&<’A¶çØÁ:¹¡,Õ2™‡RA€¸vâÛmoMO(8Ó1OÆvüÕ·Ï]TÝ”ÍkS¸³ÃÏtèÍe~‹ÀüÊxs¿ìõË×háÔ±þé¶È#£]ož7f³± êÜS…ò÷üÿ¸[ãZ %$0c ÌORGwVwI)©éÚBUKøg±øDÊ E¸^{âߊh„kÚÎT=Ò¶H«ƒ¢# EK¼•>ƒiÞ{ý5‘9¥ƒ³¨íu”fgí¾%ÈšKªWäü¨,•ÒPÜBB8öCÙGi|T r‹ÄÓUoCáOµ€£î _¡%uÃq­í²)2*N™Ö2‡†|Èâ`å:§²ADnÊÒ.Ž‚ ”ú~‘,fJÅÙ—ù!˜J¥ð´lj%ƒGèÎÒ:kÑÈ*ÅuÐRp³z)YS»bŠÒ6-aQ™ce€¿ô"/]rg„£êšþľÌ¶í¶ì|­Ÿ™µWšB ŠÒa3 Z@ΊDÜ0`÷ëoµÝTÃ9¼:ýËëšøÜum V~:eÉs³~^7ËAûKÁ_ŸNiÙ™Óv P‘ɲoÚºü8Ý`YáÝ­.ÞÁßуOr·îÉÛžNÝŸu¦éÞy1=˜exH#ÕòÍ®^£”HŸ“ï¾?«þ§$==b5yõýDÄ6 œÌÊés?#ܯ:ÛŒ~?©ÌÚÿ2ñµ­–_û_>ü/7«¢*Ú+ÚgâãÖ·¹©HéWíÉ­!Ì=öö¿¢4²endstream endobj 3786 0 obj << /Type /Page /Contents 3787 0 R /Resources 3785 0 R /MediaBox [0 0 612 792] /Parent 3784 0 R >> endobj 3788 0 obj << /D [3786 0 R /XYZ 64.9134 727.2935 null] >> endobj 1518 0 obj << /D [3786 0 R /XYZ 64.9134 480.2605 null] >> endobj 3785 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F21 1557 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3791 0 obj << /Length 1010 /Filter /FlateDecode >> stream xÚ­VMoÛ8½ëW‚Ú›Ë}Píö’¬{(¶Û4ñvŽaÈ2m«•%­,7)Šþ÷EQ–dÙÉ¢9¤ÈáãÌãÌ<_Ž—o¹é#ߥ®9^š®|ÂlÓcqމ9^L>r†Áþw˜ØÉ ¢d5´cƒ@ ‰¸—{p5œŽß½|Ki•`‚> endobj 3792 0 obj << /D [3790 0 R /XYZ 64.9134 727.2935 null] >> endobj 3789 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3795 0 obj << /Length 165 /Filter /FlateDecode >> stream xÚEͽÂ0 FÑÝOá1ì8I“±”µBå/b¢b¢¯O+@ÈËÕù¯3¬ÚˆÉ¤`æ;g‹ÃRÈÄHŒy¼(KA¶$oUÒ‘ê†<—j4«S«™YUÚFUwÃÂ[]ˆˆ:,ëÂûÝþKÕ°ùD­¯¹‡&#ÍÇÿÏ6—‚ÇÛO¸\ G ìL™J|ÍMFRô8ób¼ùÉÎp„7Y+—endstream endobj 3794 0 obj << /Type /Page /Contents 3795 0 R /Resources 3793 0 R /MediaBox [0 0 612 792] /Parent 3784 0 R >> endobj 3796 0 obj << /D [3794 0 R /XYZ 64.9134 727.2935 null] >> endobj 3793 0 obj << /Font << /F8 1548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3799 0 obj << /Length 1480 /Filter /FlateDecode >> stream xÚ­WIwÛ6¾ëWðåRê½$®¹9ò¹^TKI¶0MIt(R¥¨¸î¥½3@‹¥(M“Cdd0`¾ùfÁûQÇ=M¬”¥‘Y£±,å"°bá±$ñ¸5z¼µoNN»Ü>¹9¹êÀbؽ[HX˜¦ÂòHÇ÷bwNF"Ïâk[~Ä‚4 ­lÖù³s{ïYÏ:ïx,NcëÖiZ³N BIÙvþXtŒEgÓä{ô'˜"Ó‹(õYàBy‘ó¦ëp;¯²ÿ.ðÂÛîÃw –#‹ãHyËï»NèyöÖ… au9çö?]‘¤öç{Ië Áßa%3\ ¾ƒ[|î&-›&¯~ëâ¡`#°m#³VY¼„¯üØžÂ~QåoÍ1¤9ÂÏ—mÝh½T{7äGVW`e™µE]ÁæFá!@‡–Ã9KÃÐ''.êI‘)ƒPmêIƒæfhgVà×µ;„%¡Cç)œô….û£ ùbs§)g OßßÔ۾ƴmçï\÷ùù™}•Õ_¬n&®l²iñ5wŸå ÿ±i;+w#ã¬Ý¡¯íÝú:6ŸáJìT¨WÖ]ÇOl5±¿Ð=Ñ™JíÊêQ«1t–)Ÿ.·%,Êb1Õ N€–œÍVv&êûBT*e=ÑX çˆUA +"È'Œ¥á1r²B/Qè^äŸâì­Ðþ ðKãžòî‘.Vå­r@âyÚ³c­y\È¿7˜¸'>\Ä,Šâ@g1àŸe»àC¶ñÇZéZ à„:[”›R<Ô%ÚZ_[óÓáA„ϣmjô+u®Øºäo(Lá~;[aÊmÞT²5!þ;:;ÂnVaª‡>¦z7¤ÀâW¨…/PVãJ  H]Éü…xkΠ_»ˆ¸Y*¸¾™Ž#䪰ë//È»ZËÎ%"$«í$BÖä ¢æ:ƒÂ}äøT¥ \ª*)‘à—USH6nÜþÕMÿÈ4õSžµ ·¬³Ú/Ê"“X!îç£Ë^Ï-²rGÍÇßÏ2ÍÂàW²°‡N׳yA‰¶Á›•3©`Óí*ÍvQñƒ˜y‘ŸjüÁ¥;/ôNá—ïº%"qßü ÛÃ4ÇÆã8Ùfåy½l ½êñ.@Ç0Ieü›¨¶ïaÔ£¢m&}"&•A?Öâ«ZK„a×o—+BÑ^ ­Îøi õ.Îé±ûŠ~ˆB¡¦Ðñºäâ¨aˆC¬ñ‘câ[Û`ѱjMÅdUÕ×Äë¯ SIZ³\ñ‰|P*C8­jìÎ@ûêãÞ6|Q}Ú|N–÷hoÛ=DŸÓnÛK³KMܨH=¤Y³Û$yÚ¥v¾¯`yœ /HÒÌóøk¢EZpµõE‡(£½¿`™£~šmgWÁÍõÅõ™û4.ç`÷G(å"îagáö¸Æ@PøÀ¸nÔžˆ"4*LQ±6C@=yQŽfÅ·'RV“%5t=Xî~·b“‘â²Ñ5Žëžz–Wyc†¼^ÝäFºþð »}<Çòž.ÐZ¹Ã_w•o P±ÎËóu^âRÞy\XÍn~;ZõBª–«¨OÓ¨Jš2‹Ír¾gÅ^[M¯ÿa8ÀÄ•sŒަ˜#×c•NßÉ•u–a!†{<ŠY¦Ávú\RúŠ> endobj 3800 0 obj << /D [3798 0 R /XYZ 64.9134 727.2935 null] >> endobj 3801 0 obj << /D [3798 0 R /XYZ 64.9134 682.5585 null] >> endobj 2042 0 obj << /D [3798 0 R /XYZ 64.9134 674.5884 null] >> endobj 2234 0 obj << /D [3798 0 R /XYZ 64.9134 628.5389 null] >> endobj 2044 0 obj << /D [3798 0 R /XYZ 64.9134 608.3368 null] >> endobj 2045 0 obj << /D [3798 0 R /XYZ 64.9134 564.778 null] >> endobj 2040 0 obj << /D [3798 0 R /XYZ 64.9134 520.9423 null] >> endobj 2043 0 obj << /D [3798 0 R /XYZ 64.9134 477.1067 null] >> endobj 3455 0 obj << /D [3798 0 R /XYZ 64.9134 444.9495 null] >> endobj 3456 0 obj << /D [3798 0 R /XYZ 64.9134 413.6226 null] >> endobj 2041 0 obj << /D [3798 0 R /XYZ 64.9134 381.7421 null] >> endobj 3797 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F22 1606 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3804 0 obj << /Length 134 /Filter /FlateDecode >> stream xÚEŒ»Â0ûûŠ-“æ8ûülAN‘‰Ä]”Šˆ*)¨ø} ¢ÍŽö\é4$dÎÁÔ‚ãlÔ!ªpJbP·¥³’úµŽÐäY<ä+§2ô¦+S¹^JƒùSP©dÚ.0ÿ'Øåàq?èIË*ØH0’p̯ÆÂš“ÇAÎ+{§ú3;Ít£7i;"—endstream endobj 3803 0 obj << /Type /Page /Contents 3804 0 R /Resources 3802 0 R /MediaBox [0 0 612 792] /Parent 3784 0 R >> endobj 3805 0 obj << /D [3803 0 R /XYZ 64.9134 727.2935 null] >> endobj 3802 0 obj << /Font << /F8 1548 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3808 0 obj << /Length 1373 /Filter /FlateDecode >> stream xÚ½ZÛnÛF}×W°Ðƒm4»â^xkE!M# Ú¢E ´@’J\)ly I9r¿¾K‰´j)ïZZ=™†gfÎÌÎe­Ww£É­kxг±mÜ- ›Bj8Ä„®k"ã.üpýËï¯ßü}óéîA‰ -Ï#†¹ý›^ýñèÍÝñLí° ©g[Æ"}}ødáÈ4ÞLèxŽñ•?›x®e$#jhQBÚOâÑûÑŸ€ E]ÈWµáÈ5…„Ú¸kºí8"„w¦§!ÛÔ6Nn1îøiyÐÅ.ÝŠ}71wB].m5®¾¸„kj·Ž4¯„ gY;®àÕ¢sg…œoá±E°­lƒ»‹ÊGÓ2¯^\ñ?H„Olh#Lûæ‹à[ÑoÌ®á˜)Á£]>ÈãÃ#H\,eüNò€š‡ …ÄSÞ÷†ûJà–©¡ë‘ }OŒÿƒ¯o›J1õ}•˜Z¨MŒŸŽnGËTEË€ ™ãäeD+G/˜/Œ0RƒŸª…@…œ—³scwìžù:iOêÀi º·'·–¿}]ËÞ :z*Ò×¾x@ÕXÒ±.Eß|00Ô¦CÐ3³Ów¬·ÿÌ‘4dçVßpU±0$&yFÛŬú—lµÂ©~ûçâh²ž)qö´F¥Òüè©ÌS¥­ÌVÛÊfçß³2óϽÎì ¯üý`õÀ#DTñÕv>¥mlwðuíî}LHmóàfFxßÓˆö0ƒ²dÉ<~xê7ØâÕWX™8öz–Aõ™‡è6†ŽM{WVXxSÕŠö-Dm;Ðó(•‚oD{ð °È’<Šå'Æ·Ô,’ÄQÊdiw¤«%¨íNXZ=U"š-,ý ¥$åJ–s,Áù#+eU€2úOD‹-B Û‘ËOßmB ‰×€³t‘…ì© à(áž_#WÅXeA,™*ˆ(äù2(+ðD—%íHí;=ê—!¨2°J™ 6’}ó£ ·A-%SyÇO”ø¼.³‚E«d©¨˜9bL]7ZÑA«8›ñ@vŠS_ÅüÏ,Î%{éZœ¬¢&@”FÕ@ª ³IœªIô/c9¸Ï¢«)ÈåÒµ¤*D+Ú3?ÎÃA5O¥<·j’(ó(/eË3QèŠ56?mbøÓ©†Ïc­ð[,¯tt€~ <›øŽéÑ‘yÇq!­ ‘)hOAÊ hÇ¢*:P©ÎÙ|½Z ’“㺅¯$¯D›@ÇÑÝjˆAÅ’\Gæpøe=SÍO™úäwlÒyíÙ‘í€óÓâºÏ—ëyÅŠD4é{Ð%ŽTz>ÊRT°-+ЬÐãáâ š±BUÞ¢gE(?’c…‘œ£—QºŠÁ× H5•‡r]æCøÏžP:øU–ƒ˜Ý³XŸ(L@Ùü¶¨dh¬0@gë*_kAæ°¬‚JºŸàã¿nhéy¥ÕRÇjñeÍ4®‹ƒäMÅÀ)úØr•U´(uÔ¾%F¹¬ÙDá‚¥îM Œ —!UDJ“«ÒÀzÏŠyV2Ù+ìüºŒ²TZv;Þº^“z“ó‡Šñ¾îy8¶%ãQ+Úó¨U’ò$½gúàO’7uX榮¡æçsb6vÞÊbbyÌ·²˜Ž¼ï¿jðý7 ¾ÿ¡Á÷÷ìüKæB ³þæÿ¯Äraendstream endobj 3807 0 obj << /Type /Page /Contents 3808 0 R /Resources 3806 0 R /MediaBox [0 0 612 792] /Parent 3928 0 R /Annots [ 3810 0 R 3811 0 R 3812 0 R 3813 0 R 3814 0 R 3815 0 R 3816 0 R 3817 0 R 3818 0 R 3819 0 R 3820 0 R 3821 0 R 3822 0 R 3823 0 R 3824 0 R 3825 0 R 3826 0 R 3827 0 R 3828 0 R 3829 0 R 3830 0 R 3831 0 R 3832 0 R 3833 0 R 3834 0 R 3835 0 R 3836 0 R 3837 0 R 3838 0 R 3839 0 R 3840 0 R 3841 0 R 3842 0 R 3843 0 R 3844 0 R 3845 0 R 3846 0 R 3847 0 R 3848 0 R 3849 0 R 3850 0 R 3851 0 R 3852 0 R 3853 0 R 3854 0 R 3855 0 R 3856 0 R 3857 0 R 3858 0 R 3859 0 R 3860 0 R 3861 0 R 3862 0 R 3863 0 R 3864 0 R 3865 0 R 3866 0 R 3867 0 R 3868 0 R 3869 0 R 3870 0 R 3871 0 R 3872 0 R 3873 0 R 3874 0 R 3875 0 R 3876 0 R 3877 0 R 3878 0 R 3879 0 R 3880 0 R 3881 0 R 3882 0 R 3883 0 R 3884 0 R 3885 0 R 3886 0 R 3887 0 R 3888 0 R 3889 0 R 3890 0 R 3891 0 R 3892 0 R 3893 0 R 3894 0 R 3895 0 R 3896 0 R 3897 0 R 3898 0 R 3899 0 R 3900 0 R 3901 0 R 3902 0 R 3903 0 R 3904 0 R 3905 0 R 3906 0 R 3907 0 R 3908 0 R 3909 0 R 3910 0 R 3911 0 R 3912 0 R 3913 0 R 3914 0 R 3915 0 R 3916 0 R 3917 0 R 3918 0 R 3919 0 R 3920 0 R 3921 0 R 3922 0 R 3923 0 R 3924 0 R 3925 0 R 3926 0 R 3927 0 R ] >> endobj 3810 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [85.6964 654.6493 97.6516 665.4975] /Subtype /Link /A << /S /GoTo /D (page.46) >> >> endobj 3811 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.7474 654.6493 113.7026 665.4975] /Subtype /Link /A << /S /GoTo /D (page.47) >> >> endobj 3812 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [96.1571 642.6942 113.0937 653.5424] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 3813 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 630.739 118.573 641.5872] /Subtype /Link /A << /S /GoTo /D (page.46) >> >> endobj 3814 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 618.7838 123.5543 629.632] /Subtype /Link /A << /S /GoTo /D (page.109) >> >> endobj 3815 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 606.8287 113.3427 617.6769] /Subtype /Link /A << /S /GoTo /D (page.46) >> >> endobj 3816 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [96.1571 594.8735 108.1123 605.7217] /Subtype /Link /A << /S /GoTo /D (page.46) >> >> endobj 3817 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [96.1571 582.9183 108.1123 593.7665] /Subtype /Link /A << /S /GoTo /D (page.50) >> >> endobj 3818 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 570.9632 118.573 581.8114] /Subtype /Link /A << /S /GoTo /D (page.53) >> >> endobj 3819 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 559.008 118.573 569.8562] /Subtype /Link /A << /S /GoTo /D (page.60) >> >> endobj 3820 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 547.0528 113.3427 557.901] /Subtype /Link /A << /S /GoTo /D (page.51) >> >> endobj 3821 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.4384 547.0528 134.375 557.901] /Subtype /Link /A << /S /GoTo /D (page.122) >> >> endobj 3822 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 535.0977 113.3427 545.9459] /Subtype /Link /A << /S /GoTo /D (page.60) >> >> endobj 3823 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 523.1425 118.573 533.9907] /Subtype /Link /A << /S /GoTo /D (page.60) >> >> endobj 3824 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 511.1873 118.573 522.0355] /Subtype /Link /A << /S /GoTo /D (page.51) >> >> endobj 3825 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 499.2322 113.3427 510.0804] /Subtype /Link /A << /S /GoTo /D (page.51) >> >> endobj 3826 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 487.277 113.3427 498.1252] /Subtype /Link /A << /S /GoTo /D (page.51) >> >> endobj 3827 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 475.3218 118.573 486.17] /Subtype /Link /A << /S /GoTo /D (page.51) >> >> endobj 3828 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.7107 462.8132 150.6472 474.7683] /Subtype /Link /A << /S /GoTo /D (page.174) >> >> endobj 3829 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [128.4803 450.858 145.4169 462.8132] /Subtype /Link /A << /S /GoTo /D (page.171) >> >> endobj 3830 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [138.941 438.9028 155.8775 450.858] /Subtype /Link /A << /S /GoTo /D (page.174) >> >> endobj 3831 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.7107 426.9477 150.6472 438.9028] /Subtype /Link /A << /S /GoTo /D (page.172) >> >> endobj 3832 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.7107 414.9925 150.6472 426.9477] /Subtype /Link /A << /S /GoTo /D (page.171) >> >> endobj 3833 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [138.941 403.0373 155.8775 414.9925] /Subtype /Link /A << /S /GoTo /D (page.172) >> >> endobj 3834 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [128.4803 391.0822 145.4169 403.0373] /Subtype /Link /A << /S /GoTo /D (page.174) >> >> endobj 3835 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [128.4803 379.127 145.4169 391.0822] /Subtype /Link /A << /S /GoTo /D (page.171) >> >> endobj 3836 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [138.941 367.1718 155.8775 379.127] /Subtype /Link /A << /S /GoTo /D (page.174) >> >> endobj 3837 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.7107 355.2167 150.6472 367.1718] /Subtype /Link /A << /S /GoTo /D (page.172) >> >> endobj 3838 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [128.4803 343.2615 145.4169 355.2167] /Subtype /Link /A << /S /GoTo /D (page.171) >> >> endobj 3839 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.7107 331.3063 150.6472 343.2615] /Subtype /Link /A << /S /GoTo /D (page.171) >> >> endobj 3840 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [138.941 319.3512 155.8775 331.3063] /Subtype /Link /A << /S /GoTo /D (page.172) >> >> endobj 3841 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.7107 307.396 150.6472 319.3512] /Subtype /Link /A << /S /GoTo /D (page.172) >> >> endobj 3842 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [128.4803 295.4408 145.4169 307.396] /Subtype /Link /A << /S /GoTo /D (page.174) >> >> endobj 3843 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.7107 283.4857 150.6472 295.4408] /Subtype /Link /A << /S /GoTo /D (page.174) >> >> endobj 3844 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [138.941 271.5305 155.8775 283.4857] /Subtype /Link /A << /S /GoTo /D (page.174) >> >> endobj 3845 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.7107 259.5753 150.6472 271.5305] /Subtype /Link /A << /S /GoTo /D (page.171) >> >> endobj 3846 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [144.1713 247.6201 161.1079 259.5753] /Subtype /Link /A << /S /GoTo /D (page.174) >> >> endobj 3847 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [138.941 235.665 155.8775 247.6201] /Subtype /Link /A << /S /GoTo /D (page.172) >> >> endobj 3848 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [144.1713 223.7098 161.1079 235.665] /Subtype /Link /A << /S /GoTo /D (page.174) >> >> endobj 3849 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [138.941 211.7546 155.8775 223.7098] /Subtype /Link /A << /S /GoTo /D (page.174) >> >> endobj 3850 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 200.353 113.3427 211.2012] /Subtype /Link /A << /S /GoTo /D (page.59) >> >> endobj 3851 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [96.1571 188.3978 108.1123 199.246] /Subtype /Link /A << /S /GoTo /D (page.60) >> >> endobj 3852 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [96.1571 176.4426 108.1123 187.2908] /Subtype /Link /A << /S /GoTo /D (page.60) >> >> endobj 3853 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 164.4875 113.3427 175.3357] /Subtype /Link /A << /S /GoTo /D (page.60) >> >> endobj 3854 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 152.5323 118.324 163.3805] /Subtype /Link /A << /S /GoTo /D (page.113) >> >> endobj 3855 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 140.5771 113.3427 151.4253] /Subtype /Link /A << /S /GoTo /D (page.50) >> >> endobj 3856 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 128.6219 118.573 139.4702] /Subtype /Link /A << /S /GoTo /D (page.51) >> >> endobj 3857 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [80.4661 116.6668 92.4213 127.0169] /Subtype /Link /A << /S /GoTo /D (page.13) >> >> endobj 3858 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [122.3088 104.4349 134.264 115.0617] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3859 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [132.7695 92.7564 144.7247 103.1065] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 3860 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [137.9998 80.8013 149.955 91.1513] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 3861 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [132.7695 68.5694 144.7247 79.1962] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3862 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [122.3088 56.8909 134.264 67.241] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 3863 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 44.9358 129.0337 55.2858] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3864 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [137.9998 32.7039 149.955 43.3307] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3865 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [127.5392 21.0254 139.4944 31.3755] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3866 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 654.6493 368.0096 664.9994] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 3867 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.9758 642.4174 388.931 653.0442] /Subtype /Link /A << /S /GoTo /D (page.13) >> >> endobj 3868 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [371.7454 630.739 383.7006 641.0891] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3869 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [387.7964 630.739 399.7516 641.0891] /Subtype /Link /A << /S /GoTo /D (page.59) >> >> endobj 3870 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2848 618.7838 373.24 629.1339] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3871 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [382.2061 606.8287 394.1613 617.1787] /Subtype /Link /A << /S /GoTo /D (page.19) >> >> endobj 3872 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [398.2571 606.8287 410.2123 617.1787] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3873 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [387.4365 594.5968 399.3917 605.2236] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3874 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [382.2061 582.6416 394.1613 593.2684] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3875 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5937 570.6864 357.5489 581.3132] /Subtype /Link /A << /S /GoTo /D (page.13) >> >> endobj 3876 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.6447 570.6864 373.5999 581.3132] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3877 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [377.6956 570.6864 389.6508 581.3132] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 3878 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [371.7454 558.7313 383.7006 569.3581] /Subtype /Link /A << /S /GoTo /D (page.13) >> >> endobj 3879 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [397.8971 546.7761 409.8523 557.4029] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3880 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.9758 535.0977 388.931 545.4477] /Subtype /Link /A << /S /GoTo /D (page.19) >> >> endobj 3881 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [393.0267 535.0977 404.9819 545.4477] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3882 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [366.5151 522.8657 378.4703 533.4926] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3883 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [382.2061 510.9106 394.1613 521.5374] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3884 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [382.2061 498.9554 394.1613 509.5822] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3885 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [382.2061 487.0002 394.1613 497.6271] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3886 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [366.5151 475.3218 378.4703 485.6719] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3887 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [392.6668 463.0899 404.622 473.7167] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3888 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [371.7454 451.4115 383.7006 461.7616] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3889 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [382.2061 439.1796 394.1613 449.8064] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3890 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [397.8971 427.5011 409.8523 437.8512] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3891 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [382.2061 415.2692 394.1613 425.8961] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3892 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [371.7454 403.5908 383.7006 413.9409] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3893 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [371.7454 391.6356 383.7006 401.9857] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3894 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [424.0488 379.4037 436.004 390.0305] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3895 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [397.8971 367.7253 409.8523 378.0754] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3896 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.9758 355.4934 388.931 366.1202] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3897 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.9758 343.815 388.931 354.165] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3898 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [392.6668 331.5831 404.622 342.2099] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3899 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [387.4365 319.6279 399.3917 330.2547] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3900 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [387.4365 307.6727 399.3917 318.2995] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3901 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 295.7176 368.0096 306.3444] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3902 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 283.7624 368.0096 294.3892] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3903 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [366.5151 271.8072 378.4703 282.434] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3904 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [382.566 271.8072 399.5026 282.434] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 3905 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 259.852 368.0096 270.4789] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 3906 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.9758 247.8969 388.931 258.5237] /Subtype /Link /A << /S /GoTo /D (page.13) >> >> endobj 3907 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [350.8241 236.2185 362.7793 246.5685] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 3908 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.9758 224.2633 388.931 234.6134] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3909 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [350.8241 212.0314 362.7793 222.6582] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3910 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [366.5151 200.0762 378.4703 210.703] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3911 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.9758 188.3978 388.931 198.7479] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3912 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2848 176.4426 373.24 186.7927] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3913 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2848 164.4875 373.24 174.8375] /Subtype /Link /A << /S /GoTo /D (page.13) >> >> endobj 3914 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [377.3357 164.4875 389.2909 174.8375] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3915 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [393.3867 164.4875 405.3419 174.8375] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 3916 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [413.5882 152.2555 425.5434 162.8824] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3917 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [397.8971 140.5771 409.8523 150.9272] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3918 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [324.6724 128.6219 336.6276 138.972] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3919 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [324.6724 116.6668 336.6276 127.0169] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3920 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [324.6724 104.7116 336.6276 115.0617] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3921 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [324.6724 92.7564 336.6276 103.1065] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 3922 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [324.6724 80.8013 336.6276 91.1513] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3923 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [324.6724 68.8461 336.6276 79.1962] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3924 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [324.6724 56.8909 336.6276 67.241] /Subtype /Link /A << /S /GoTo /D (page.27) >> >> endobj 3925 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [324.6724 44.9358 336.6276 55.2858] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3926 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [324.6724 32.9806 336.6276 43.3307] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3927 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [324.6724 21.0254 336.6276 31.3755] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3809 0 obj << /D [3807 0 R /XYZ 64.9134 727.2935 null] >> endobj 1525 0 obj << /D [3807 0 R /XYZ 64.9134 667.5454 null] >> endobj 3806 0 obj << /Font << /F8 1548 0 R /F18 1536 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3931 0 obj << /Length 3689 /Filter /FlateDecode >> stream xÚÅ]K“Û6¾Ï¯Ðq\Áx?®Y'[›ÃVm­[•ä ‘83*뉲ËÙ?¿ ’A !³9$¡åæ‡ÝG7ÌÞÿ¬IåâãóBrdã Å0Ò“ÅÇͯ”àw¿üeÁ)F’ºÀÍÏÿøç‡Ÿþcÿâá§~Ä ÒP‰¸‘b±Þ?üñðëïx±yÀ‹_0RF-¾À3FÌh±Ø?pÁàŒ¹_vÿ~ø—\:Äeù£%Ni„¹4qÊYCqùjù »H0â«®?¼[2Æ)mK'º$!h‹y|ÌK.&ËÀl­¶üü<¿”Á¤€I”nÞX=wÛËë{r ÍŠ‘!´ŒªÀ‰èô¹~o™G¦|LT÷À¨û…D»áÞ¨{õt9î®u5+Ä4S a4RJDFDãõí ÆP ¦©ûóh@xÄey;"¨[À/^ÊÒ|Þîn)2 Êæ E‡8G‘ D±q<¬öÕ­Í`ôAœŸý†>½#çãéÝ’ªÇêÝþP¿£úñ+ü Mœ¹ŠÑÀd•;ÌœµDšbVÒˆdˆNjÞˆÅ(öFLSôF 9Z#¾§‘¡GPÓ¤y,Æyó î~!Lú'åž8˜Ô®CKI E‡¶#Ü[ÎÿK¸‰]ƒ´ÀrdõÍf¬MMeÐ#I‘ÁÆ|·.;¼ex«IÍS ?/eÙí¶‡j³­oì s¨$¸ G8æ>¤8@h®ûÓ®ª·ÇCl&I%ùh&'2¾JPŠ„å7œ_§$0ˆq]ÎH`ÂHNʲ»Ôçjµ¿±‘ *FÑ#Î$Ä A4²\í¶«KtPÆÖCéÖCJ´EÉJL#cŒ,g¥0a%'•c¥R+%IöV Yî·çóñ3‡yS=2“N›)ºÎYG˜™›í {´K¬ÓÁzªHtbm_ÙÌVòÖqÅæÛízw:U‡Íœ—Û–÷GhT?nª°œ±ç Šî\K6ŰæG·®ìPw-4Ë…¦$ºc}^¿nëj]_ÏUŒ»bˆR>ò2ØzÅp²£^bć¸W°vIw9TÂùå N°·>Q¬OÔí[—ÆMvÕÚþ§‘ãÙ+BFxâ‚×}u¨'·yÜŠc'ÊmóBÈémž—j—Ôë¡®ÎÓ‘ÑÈD<ºœB<,5‘÷j¦&˜7LI  8©vïs©cÝo"Ûîû‡èL¡$L±øn=À7T—ÔC™Ðƒ“²4?¯v×*{ážÓ„¦0hÇ ÷åRëU~Nò£ðúϲÐÝqc8°2Æ00›Yª¾? r€ËñÖlʬø^ÊÒëV¡Ÿˆ PŒŸœáñµ0RùŸoýÞÀlÚ-ÆÏ#Î$„BPÇØa»c‹¥p¢Ë âQ7H :ùÓ®#€±¢¤ ëˆ ×qRs®SŠ_ï:I~ÞuB~)×)Å/p$ÁÞuB†ë·pã>wUšHCÄvË€z;Áæ]ÂôΘ€ø™q;Àeˆ‰ž@ÖJ/ÕlG^Wçüè‘èfWBôf…Nv2¤±”» &ºî¤Úئú º‚àþ¼`×ÄD×TÛõÃzUç"DDû.aScâܾƒ0Òðz¹¾‡ˆÓ}÷R–àëêòš“Ãl;éÖiîêT+d8!; &:}wux©_§S7FçeŒ®‚Nš‚}}wR–àé|<Á~õk¬÷‚"†Ùx¸Sœo@ï·ëìE)¾zø¨>}ÚVç¯9z‹&5q÷ IvöZÜL¹ú^p§]ÉKµYƒóvõ´‹ï\†&vÙ89™/ÀfÜûÓD¦Ÿ(è¥&åÍBÀéL¿—ºç9îÎÌ=™¨>¸eëñpÚÛ™%¶U ³9uç~t:\å>|ƒƒbgKáà7Š|ÿ®Ù.CÄHŒÈ‘fà"^Ê2ÜTŸ·ë*gH†¹—ðÝÂÃÅ>\F扟çG7Om˜:òŒ %,hþËkuX7­Ûv Ýn­QQó»÷‡Ö8wÕê0·®gøœæÙ™ü§ãõ°©69F×TÆîk*kYJ®ñ3ªø„áû§7/Þézw}~®ÎÛÃËÜ–ï¾C1÷î··•y4Æ3Zï´zÝîê©YC`;Ši¹I#œž3œ¥·Œ Ó­!än­pÖ c)2fñ õ0´¤œzÀiõ8¡V=±q»¬m@Ûsw~k"›ð‰ ©hê:ž_ŽëU½~ÍNÜQãÂ1•¾±hlýº:¼Ü¸3ˆK 5l!ìe}¸G\†;r“¦}ËÍ8³3a}<j»É®kè8Ï.в‡­“£­XÉw?ÚÒ%ß~´J¾7Uþñ˜ô Žüƒ²´JUZHU÷Z‹ª×ÇÃçêl“T9yôX¦;Òà³ÜÃhN6­®RÕͺ’ÕͽºÂêæ^]1ב $9¿ÏQjdQ˜‚9ç%•@¦”äÄ2”»LÁ…¯2Žæ½´B\Œ³–V«u]Ý*DtWybX›!b‡¸ !c‹&< k 'æKa³ 0âyÛ‘h®°í'%5@¦4àÄþïÉô U;Ñe™xPÚ\–CÈIJìÅš²¯íŸ%N~tâHYŒÑnu½TÙÅ2?é¾Þ/ÑÍ\ÜëóóÝ-pöpò)uáõ#tv"¿il*DçœÁ^ZÌ‘…ˆ‰Ý‹µ!úéz›E€H¤(ÈÑ!Α„àöjH2V9à F0M¨‚âGÃ,BfÈq®èr´#Öñëì0Z™—ô¢R÷5z/J^×è½(¼¯1ãEÅ8ö^”&é½hp©ÄVqÞº‘€•äØÎQ4öpƒ²!Å;+w'œ…ì/*uç¥÷¢ä•—Þ‹Â;/3^TŒcïEi’Þ‹B’MAì¤ãè½(MÑ{QHñ/ó¢R7†z/J^ê½(¼1t¼Ö17R‚ Y’¤Cœc©8"¶–À2¾¤u^TŒ¢÷¢4CïE!Ã΋r7wñâoð"KZ0%ËyQˆ˜ð"/–áEåHz/šaé¼hÀ2º¤qŒá5ˆ§‹‘ôˆ3$9’ž$ 9’ !…¼Ç‘4CBS^БÄ”#9±G*F²w¤4KïH!ËèªÖ;R)’#%IöŽ’|KG:îO«s½ì9š´½»=);6ydï*wK¢m_÷ßñOlþæ¶eh+ÑÊžp8ìÃ庫³¯[ËqéuEÄÔ'tãÉÛ¸ÂN_'Ó’Å.AõiÉô-(Ÿ–\ƒª«ó>7á/xvqÑút½é9ˆƒÛ—»åg.A1ª‘P°/Ü‚ª·ûjú zü]fòOUa0×ÓIµb× ú¤Zú”Oª .B¶§ÄIϸû"ç6Pçõ×ó¹»~?WÁz_‘n<ŸÖ·6Ô¶DLUîþ‘Gœ¹€Ä8,–Á ¤û>Ó/©Þ>ší¿ä°vcU²ÿdªÿNìÞûµS—¯RÓIg‹w_Øž Y²ûdªûNlâf…ÖËQôáÿ Eþ(¦?î6š| a"ûCR³¶â¶à ó’¶ S¶rb“‡‰nZŽ£ßÕÎpt»Ú!Çû žHÌ*Ø5q§©`EO£%M@¦LåÄ|^-û0EæÌª™Ó ‘àà˜”ì™ê¿Ëù¬Ø8nÀùes €8† ^tY S pbM zŠ~•ª¹Í3¾M?CÞ£œë=1Ô¾UrQ !½÷b}žûÿÈüyþO4t•ó’Ëj™R€kïuW›í6ÛÓõZc¸ÐTÆ«K2„Ü9¬§”\·BÈ”2œXwÉ}w|¹a© °ÈdéçXjŽ$zÈòy·zÉ.0cñD†)ë;wâTÎxÉ%+„LYɉ}Ë'lXr̆…×›XÐér J$ˆ,YB&² ^l>æ—Všìtæzº¾d|–2~e’ç~ϧifþËU®Æ­‰lŸàá:hÏç–Lv”Û4ü²=Dn÷Ò÷E¼ñÕ°ƒ5Þ¤è"ùhWý¤a»e/”+§ ÕTNjêÚ~ª*FÐÏ}i‚nê 6Ïõ}ÒæaÇs]ë‡*pd~°éWóMʤ­XjŸ_Ϋý~u¾üÐ6ƆÖ‚ý£Õ]Û¼"¬¯Ü^Ö’HãöPþö÷xÊ™!,ô¿ìªºšþ¼Ð¸„:þ?p²èé2òB—]ƒ*òÔm×¾ˆ<¸îúV5ä$G¥®³ö HÞgõ /´Ú˜ŸWå2ûæ¿×lÞ-ë»+&­FÿTyýendstream endobj 3930 0 obj << /Type /Page /Contents 3931 0 R /Resources 3929 0 R /MediaBox [0 0 612 792] /Parent 3928 0 R /Annots [ 3933 0 R 3934 0 R 3935 0 R 3936 0 R 3937 0 R 3938 0 R 3939 0 R 3940 0 R 3941 0 R 3942 0 R 3943 0 R 3944 0 R 3945 0 R 3946 0 R 3947 0 R 3948 0 R 3949 0 R 3950 0 R 3951 0 R 3952 0 R 3953 0 R 3954 0 R 3955 0 R 3956 0 R 3957 0 R 3958 0 R 3959 0 R 3960 0 R 3961 0 R 3962 0 R 3963 0 R 3964 0 R 3965 0 R 3966 0 R 3967 0 R 3968 0 R 3969 0 R 3970 0 R 3971 0 R 3972 0 R 3973 0 R 3974 0 R 3975 0 R 3976 0 R 3977 0 R 3978 0 R 3979 0 R 3980 0 R 3981 0 R 3982 0 R 3983 0 R 3984 0 R 3985 0 R 3986 0 R 3987 0 R 3988 0 R 3989 0 R 3990 0 R 3991 0 R 3992 0 R 3993 0 R 3994 0 R 3995 0 R 3996 0 R 3997 0 R 3998 0 R 3999 0 R 4000 0 R 4001 0 R 4002 0 R 4003 0 R 4004 0 R 4005 0 R 4006 0 R 4007 0 R 4008 0 R 4009 0 R 4010 0 R 4011 0 R 4012 0 R 4013 0 R 4014 0 R 4015 0 R 4016 0 R 4017 0 R 4018 0 R 4019 0 R 4020 0 R 4021 0 R 4022 0 R 4023 0 R 4024 0 R 4025 0 R 4026 0 R 4027 0 R 4028 0 R 4029 0 R 4030 0 R 4031 0 R 4032 0 R 4033 0 R 4034 0 R 4035 0 R 4036 0 R 4037 0 R 4038 0 R 4039 0 R 4040 0 R 4041 0 R 4042 0 R 4043 0 R 4044 0 R 4045 0 R 4046 0 R 4047 0 R 4048 0 R 4049 0 R 4050 0 R 4051 0 R 4052 0 R 4053 0 R 4054 0 R 4055 0 R 4056 0 R 4057 0 R 4058 0 R 4059 0 R 4060 0 R 4061 0 R 4062 0 R 4063 0 R 4064 0 R 4065 0 R 4066 0 R 4067 0 R 4068 0 R 4069 0 R 4070 0 R 4071 0 R 4072 0 R 4073 0 R 4074 0 R 4075 0 R 4076 0 R 4077 0 R 4078 0 R 4079 0 R 4080 0 R 4081 0 R 4082 0 R 4083 0 R 4084 0 R ] >> endobj 3933 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [80.4661 689.4908 92.4213 699.8409] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3934 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [80.4661 677.5357 92.4213 687.8857] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3935 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [80.4661 665.5805 92.4213 675.9306] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 3936 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [80.4661 653.6253 92.4213 663.9754] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3937 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [80.4661 641.6702 92.4213 652.0202] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 3938 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 619.7523 129.0337 630.6005] /Subtype /Link /A << /S /GoTo /D (page.63) >> >> endobj 3939 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 607.7972 118.573 618.6454] /Subtype /Link /A << /S /GoTo /D (page.17) >> >> endobj 3940 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [122.6688 607.7972 134.624 618.6454] /Subtype /Link /A << /S /GoTo /D (page.32) >> >> endobj 3941 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [138.7197 607.7972 155.6562 618.6454] /Subtype /Link /A << /S /GoTo /D (page.112) >> >> endobj 3942 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [211.617 595.2885 228.5535 607.2437] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 3943 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [173.6218 583.8868 185.577 594.735] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 3944 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [191.6114 583.8868 203.5666 594.735] /Subtype /Link /A << /S /GoTo /D (page.70) >> >> endobj 3945 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [209.601 583.8868 226.5375 594.735] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 3946 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [232.5719 583.8868 249.5084 594.735] /Subtype /Link /A << /S /GoTo /D (page.137) >> >> endobj 3947 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [255.5428 583.8868 272.4793 594.735] /Subtype /Link /A << /S /GoTo /D (page.141) >> >> endobj 3948 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [103.7677 571.9317 120.7042 582.2817] /Subtype /Link /A << /S /GoTo /D (page.142) >> >> endobj 3949 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [124.8 571.9317 141.7365 582.2817] /Subtype /Link /A << /S /GoTo /D (page.144) >> >> endobj 3950 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [144.7253 571.9317 161.6619 582.2817] /Subtype /Link /A << /S /GoTo /D (page.149) >> >> endobj 3951 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [192.6046 559.6998 209.5411 570.8247] /Subtype /Link /A << /S /GoTo /D (page.162) >> >> endobj 3952 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [161.2225 548.0213 173.1777 558.8695] /Subtype /Link /A << /S /GoTo /D (page.67) >> >> endobj 3953 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [177.2735 548.0213 189.2287 558.8695] /Subtype /Link /A << /S /GoTo /D (page.79) >> >> endobj 3954 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [166.4529 536.0662 178.4081 546.9144] /Subtype /Link /A << /S /GoTo /D (page.68) >> >> endobj 3955 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [182.5038 536.0662 194.459 546.9144] /Subtype /Link /A << /S /GoTo /D (page.79) >> >> endobj 3956 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.8103 523.5575 148.7655 535.5127] /Subtype /Link /A << /S /GoTo /D (page.71) >> >> endobj 3957 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [146.5516 511.6023 158.5068 523.5575] /Subtype /Link /A << /S /GoTo /D (page.73) >> >> endobj 3958 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [137.8895 499.6472 149.8447 511.6023] /Subtype /Link /A << /S /GoTo /D (page.70) >> >> endobj 3959 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 487.9687 128.7847 499.0937] /Subtype /Link /A << /S /GoTo /D (page.107) >> >> endobj 3960 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 476.0136 128.7847 487.1385] /Subtype /Link /A << /S /GoTo /D (page.121) >> >> endobj 3961 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [143.2302 464.3352 160.1667 475.1834] /Subtype /Link /A << /S /GoTo /D (page.151) >> >> endobj 3962 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [96.1571 452.1032 108.1123 463.2282] /Subtype /Link /A << /S /GoTo /D (page.53) >> >> endobj 3963 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [147.3267 440.4248 164.2632 451.273] /Subtype /Link /A << /S /GoTo /D (page.126) >> >> endobj 3964 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.687 428.1929 179.6236 439.3179] /Subtype /Link /A << /S /GoTo /D (page.142) >> >> endobj 3965 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [146.996 416.2377 158.9512 427.3627] /Subtype /Link /A << /S /GoTo /D (page.14) >> >> endobj 3966 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [163.047 416.2377 179.9835 427.3627] /Subtype /Link /A << /S /GoTo /D (page.143) >> >> endobj 3967 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [152.2264 404.2826 164.1816 415.4075] /Subtype /Link /A << /S /GoTo /D (page.14) >> >> endobj 3968 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [168.2773 404.2826 185.2138 415.4075] /Subtype /Link /A << /S /GoTo /D (page.143) >> >> endobj 3969 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 392.6042 129.0337 403.4524] /Subtype /Link /A << /S /GoTo /D (page.61) >> >> endobj 3970 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 380.649 129.0337 391.4972] /Subtype /Link /A << /S /GoTo /D (page.61) >> >> endobj 3971 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [159.758 368.6938 171.7132 379.542] /Subtype /Link /A << /S /GoTo /D (page.74) >> >> endobj 3972 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [159.758 356.7386 171.7132 367.5869] /Subtype /Link /A << /S /GoTo /D (page.74) >> >> endobj 3973 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 344.7835 113.3427 355.6317] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 3974 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [131.305 332.8283 148.2415 343.6765] /Subtype /Link /A << /S /GoTo /D (page.117) >> >> endobj 3975 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [131.305 320.8731 148.2415 331.7213] /Subtype /Link /A << /S /GoTo /D (page.117) >> >> endobj 3976 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.5353 308.918 153.4719 319.7662] /Subtype /Link /A << /S /GoTo /D (page.115) >> >> endobj 3977 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [126.0747 296.9628 143.0112 307.811] /Subtype /Link /A << /S /GoTo /D (page.119) >> >> endobj 3978 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.5353 284.7309 153.4719 295.8558] /Subtype /Link /A << /S /GoTo /D (page.114) >> >> endobj 3979 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [146.996 272.7757 163.9326 283.9007] /Subtype /Link /A << /S /GoTo /D (page.120) >> >> endobj 3980 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 261.0973 123.8033 271.9455] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 3981 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [154.5512 238.626 166.5064 250.5812] /Subtype /Link /A << /S /GoTo /D (page.14) >> >> endobj 3982 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [170.6022 238.626 182.5574 250.5812] /Subtype /Link /A << /S /GoTo /D (page.91) >> >> endobj 3983 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [186.6531 238.626 203.5897 250.5812] /Subtype /Link /A << /S /GoTo /D (page.134) >> >> endobj 3984 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [207.6854 238.626 224.622 250.5812] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 3985 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.8534 226.6708 174.8086 238.626] /Subtype /Link /A << /S /GoTo /D (page.94) >> >> endobj 3986 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [180.3966 214.7157 197.3332 226.6708] /Subtype /Link /A << /S /GoTo /D (page.180) >> >> endobj 3987 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 203.0372 118.573 214.1622] /Subtype /Link /A << /S /GoTo /D (page.66) >> >> endobj 3988 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [142.0406 190.8053 153.9958 202.7605] /Subtype /Link /A << /S /GoTo /D (page.70) >> >> endobj 3989 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [158.0916 190.8053 170.0468 202.7605] /Subtype /Link /A << /S /GoTo /D (page.81) >> >> endobj 3990 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [152.2264 179.4037 164.1816 190.2519] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 3991 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [151.0368 166.895 167.9733 178.8502] /Subtype /Link /A << /S /GoTo /D (page.183) >> >> endobj 3992 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [172.0691 166.895 189.0056 178.8502] /Subtype /Link /A << /S /GoTo /D (page.196) >> >> endobj 3993 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.8103 154.9398 148.7655 166.895] /Subtype /Link /A << /S /GoTo /D (page.71) >> >> endobj 3994 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [152.8612 154.9398 164.8164 166.895] /Subtype /Link /A << /S /GoTo /D (page.82) >> >> endobj 3995 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [190.6381 142.9847 207.5747 154.9398] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 3996 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [130.2239 131.0295 142.1791 142.9847] /Subtype /Link /A << /S /GoTo /D (page.76) >> >> endobj 3997 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [147.271 119.0743 164.2075 131.0295] /Subtype /Link /A << /S /GoTo /D (page.183) >> >> endobj 3998 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [168.3033 119.0743 185.2398 131.0295] /Subtype /Link /A << /S /GoTo /D (page.184) >> >> endobj 3999 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [135.0944 107.1192 152.0309 119.0743] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4000 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [159.4753 95.164 176.4118 107.1192] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4001 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 83.7623 118.573 94.6105] /Subtype /Link /A << /S /GoTo /D (page.17) >> >> endobj 4002 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [122.6688 83.7623 134.624 94.6105] /Subtype /Link /A << /S /GoTo /D (page.32) >> >> endobj 4003 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [138.7197 83.7623 155.6562 94.6105] /Subtype /Link /A << /S /GoTo /D (page.112) >> >> endobj 4004 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [157.7317 71.2537 169.6869 83.2088] /Subtype /Link /A << /S /GoTo /D (page.71) >> >> endobj 4005 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [167.4729 59.2985 179.4281 71.2537] /Subtype /Link /A << /S /GoTo /D (page.74) >> >> endobj 4006 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [160.7781 47.3433 172.7333 59.2985] /Subtype /Link /A << /S /GoTo /D (page.43) >> >> endobj 4007 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [176.829 47.3433 188.7842 59.2985] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 4008 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [170.9343 35.3882 182.8895 47.3433] /Subtype /Link /A << /S /GoTo /D (page.43) >> >> endobj 4009 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [170.9343 23.433 182.8895 35.3882] /Subtype /Link /A << /S /GoTo /D (page.43) >> >> endobj 4010 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [419.2108 688.9373 431.166 700.8925] /Subtype /Link /A << /S /GoTo /D (page.43) >> >> endobj 4011 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [435.2618 688.9373 447.217 700.8925] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 4012 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [429.3671 676.9822 441.3223 688.9373] /Subtype /Link /A << /S /GoTo /D (page.43) >> >> endobj 4013 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [429.3671 665.027 441.3223 676.9822] /Subtype /Link /A << /S /GoTo /D (page.43) >> >> endobj 4014 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5937 643.6627 357.5489 654.5109] /Subtype /Link /A << /S /GoTo /D (page.47) >> >> endobj 4015 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2848 631.7075 378.2213 642.5557] /Subtype /Link /A << /S /GoTo /D (page.113) >> >> endobj 4016 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 619.7523 381.9871 630.6005] /Subtype /Link /A << /S /GoTo /D (page.113) >> >> endobj 4017 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [410.6591 607.5204 427.5957 618.6454] /Subtype /Link /A << /S /GoTo /D (page.113) >> >> endobj 4018 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [366.5151 595.842 378.4703 606.6902] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 4019 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [350.8241 583.8868 362.7793 594.735] /Subtype /Link /A << /S /GoTo /D (page.29) >> >> endobj 4020 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [366.875 583.8868 378.8302 594.735] /Subtype /Link /A << /S /GoTo /D (page.37) >> >> endobj 4021 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [382.926 583.8868 394.8812 594.735] /Subtype /Link /A << /S /GoTo /D (page.47) >> >> endobj 4022 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [406.8933 571.6549 423.8298 582.7799] /Subtype /Link /A << /S /GoTo /D (page.144) >> >> endobj 4023 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.2809 559.9765 387.2175 570.8247] /Subtype /Link /A << /S /GoTo /D (page.116) >> >> endobj 4024 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [391.3132 559.9765 408.2497 570.8247] /Subtype /Link /A << /S /GoTo /D (page.189) >> >> endobj 4025 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [419.6789 547.4679 431.6341 559.423] /Subtype /Link /A << /S /GoTo /D (page.91) >> >> endobj 4026 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [435.7298 547.4679 452.6663 559.423] /Subtype /Link /A << /S /GoTo /D (page.103) >> >> endobj 4027 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [456.7621 547.4679 473.6986 559.423] /Subtype /Link /A << /S /GoTo /D (page.134) >> >> endobj 4028 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [477.7944 547.4679 494.7309 559.423] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 4029 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [451.7529 535.5127 463.7081 547.4679] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 4030 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [401.663 524.111 413.6182 534.9592] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 4031 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [417.7139 524.111 434.6505 534.9592] /Subtype /Link /A << /S /GoTo /D (page.102) >> >> endobj 4032 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [401.663 512.1558 413.6182 523.004] /Subtype /Link /A << /S /GoTo /D (page.76) >> >> endobj 4033 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [455.7658 499.6472 472.7023 511.6023] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 4034 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [410.9341 487.692 427.8706 499.6472] /Subtype /Link /A << /S /GoTo /D (page.183) >> >> endobj 4035 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [431.9664 487.692 448.9029 499.6472] /Subtype /Link /A << /S /GoTo /D (page.186) >> >> endobj 4036 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 476.2903 368.0096 487.1385] /Subtype /Link /A << /S /GoTo /D (page.63) >> >> endobj 4037 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [350.8241 464.3352 362.7793 475.1834] /Subtype /Link /A << /S /GoTo /D (page.72) >> >> endobj 4038 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [350.8241 452.38 362.7793 463.2282] /Subtype /Link /A << /S /GoTo /D (page.72) >> >> endobj 4039 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [366.875 452.38 383.8116 463.2282] /Subtype /Link /A << /S /GoTo /D (page.153) >> >> endobj 4040 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [387.9073 452.38 404.8439 463.2282] /Subtype /Link /A << /S /GoTo /D (page.158) >> >> endobj 4041 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [440.5767 440.1481 452.5319 451.273] /Subtype /Link /A << /S /GoTo /D (page.83) >> >> endobj 4042 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [445.807 428.1929 457.7622 439.3179] /Subtype /Link /A << /S /GoTo /D (page.83) >> >> endobj 4043 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [445.807 416.2377 457.7622 427.3627] /Subtype /Link /A << /S /GoTo /D (page.83) >> >> endobj 4044 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [445.807 404.2826 457.7622 415.4075] /Subtype /Link /A << /S /GoTo /D (page.84) >> >> endobj 4045 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [451.0374 392.3274 462.9926 403.4524] /Subtype /Link /A << /S /GoTo /D (page.84) >> >> endobj 4046 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [451.0374 380.3722 462.9926 391.4972] /Subtype /Link /A << /S /GoTo /D (page.84) >> >> endobj 4047 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2848 368.4171 373.24 379.542] /Subtype /Link /A << /S /GoTo /D (page.52) >> >> endobj 4048 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.8111 356.7386 373.7663 367.5869] /Subtype /Link /A << /S /GoTo /D (page.18) >> >> endobj 4049 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [377.862 356.7386 394.7986 367.5869] /Subtype /Link /A << /S /GoTo /D (page.162) >> >> endobj 4050 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [398.8943 356.7386 415.8309 367.5869] /Subtype /Link /A << /S /GoTo /D (page.163) >> >> endobj 4051 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [366.5151 344.5067 378.4703 355.6317] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 4052 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2848 332.8283 373.24 343.6765] /Subtype /Link /A << /S /GoTo /D (page.16) >> >> endobj 4053 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [377.3357 332.8283 389.2909 343.6765] /Subtype /Link /A << /S /GoTo /D (page.17) >> >> endobj 4054 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [393.3867 332.8283 405.3419 343.6765] /Subtype /Link /A << /S /GoTo /D (page.20) >> >> endobj 4055 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [409.4376 332.8283 421.3928 343.6765] /Subtype /Link /A << /S /GoTo /D (page.21) >> >> endobj 4056 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [425.4886 332.8283 442.4251 343.6765] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 4057 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.2809 320.5964 382.2361 331.7213] /Subtype /Link /A << /S /GoTo /D (page.54) >> >> endobj 4058 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 308.6412 381.9871 319.7662] /Subtype /Link /A << /S /GoTo /D (page.139) >> >> endobj 4059 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [380.7416 296.6861 397.6781 307.811] /Subtype /Link /A << /S /GoTo /D (page.154) >> >> endobj 4060 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [395.3516 284.4542 407.3068 296.4093] /Subtype /Link /A << /S /GoTo /D (page.76) >> >> endobj 4061 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [391.2023 273.0525 403.1575 283.9007] /Subtype /Link /A << /S /GoTo /D (page.79) >> >> endobj 4062 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [385.9719 261.0973 402.9085 271.9455] /Subtype /Link /A << /S /GoTo /D (page.120) >> >> endobj 4063 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [405.4288 248.8654 417.384 259.9903] /Subtype /Link /A << /S /GoTo /D (page.37) >> >> endobj 4064 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [421.4798 248.8654 438.4163 259.9903] /Subtype /Link /A << /S /GoTo /D (page.135) >> >> endobj 4065 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [442.0412 237.187 458.9777 248.0352] /Subtype /Link /A << /S /GoTo /D (page.103) >> >> endobj 4066 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [391.2023 224.955 403.1575 236.08] /Subtype /Link /A << /S /GoTo /D (page.69) >> >> endobj 4067 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [396.4326 213.2766 408.3878 224.1248] /Subtype /Link /A << /S /GoTo /D (page.80) >> >> endobj 4068 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.5113 201.0447 392.4478 212.1697] /Subtype /Link /A << /S /GoTo /D (page.102) >> >> endobj 4069 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [396.4326 189.0895 408.3878 200.2145] /Subtype /Link /A << /S /GoTo /D (page.69) >> >> endobj 4070 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [412.1236 177.1344 424.0788 188.2593] /Subtype /Link /A << /S /GoTo /D (page.62) >> >> endobj 4071 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [428.1746 177.1344 440.1298 188.2593] /Subtype /Link /A << /S /GoTo /D (page.64) >> >> endobj 4072 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [421.1198 165.1792 438.0564 176.3042] /Subtype /Link /A << /S /GoTo /D (page.134) >> >> endobj 4073 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [396.4326 153.5008 408.3878 164.349] /Subtype /Link /A << /S /GoTo /D (page.73) >> >> endobj 4074 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.2809 131.583 387.2175 142.4312] /Subtype /Link /A << /S /GoTo /D (page.149) >> >> endobj 4075 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [368.84 119.0743 385.7765 131.0295] /Subtype /Link /A << /S /GoTo /D (page.134) >> >> endobj 4076 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [389.8168 107.1192 401.772 119.0743] /Subtype /Link /A << /S /GoTo /D (page.17) >> >> endobj 4077 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [405.8677 107.1192 417.8229 119.0743] /Subtype /Link /A << /S /GoTo /D (page.29) >> >> endobj 4078 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [410.7381 95.164 422.6933 107.1192] /Subtype /Link /A << /S /GoTo /D (page.29) >> >> endobj 4079 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [426.7891 95.164 438.7443 107.1192] /Subtype /Link /A << /S /GoTo /D (page.32) >> >> endobj 4080 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [421.1198 83.4856 438.0564 94.6105] /Subtype /Link /A << /S /GoTo /D (page.141) >> >> endobj 4081 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 59.852 372.9909 70.7002] /Subtype /Link /A << /S /GoTo /D (page.122) >> >> endobj 4082 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [406.8933 47.6201 423.8298 58.745] /Subtype /Link /A << /S /GoTo /D (page.144) >> >> endobj 4083 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [380.7416 35.9416 397.6781 46.7898] /Subtype /Link /A << /S /GoTo /D (page.146) >> >> endobj 4084 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [420.6179 23.433 437.5544 35.3882] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 3932 0 obj << /D [3930 0 R /XYZ 64.9134 727.2935 null] >> endobj 3929 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 4087 0 obj << /Length 4001 /Filter /FlateDecode >> stream xÚÅ]K7¾Ï¯ÐѬh¾× °9,v±>,°ÉA–z&B$µ£‡ï¯ßb·ØÍV³Ù”¦ì0¢—¾þXU¬›¤¿ûðôþG»pÄi®^ZÇ„\A‰µ”->lþûîïÿøþ‡ÿ<ÿòá§…–(çÄ‚6Áó¿~úáÃ_Ñë¸&ÒiµXïŸ~úï/t±y¢‹Ÿž(1Î,þ€Ï”gÕbÿ$• J ~³{ú÷Ó¿:Àe@\Æßyâœ'˜kljäR47Ûcµ>×Ç/·4ãD3ÉzñφKK”9Ǩ LX~¾¡Ù!.cÈ1OÆ1Š‹!Ñ—í®:½çžæÐ B*—W…ÿíy)„xǤj%ÈKkˆTLx.Ä)ů*8­ëÃyûz©/§÷lü+ˆ¶*<ágªè晽óŠ{^²wç-üðù™Ûw•ÿþš]IHžäpE»åði·ú’zº4„Á†ãs:D¯ÐlÍ‹¡ƒ©ê>•ÖŸž—Ü´IôxöùôËó êdˆ hÜ×>;•N'‚Š’yGƒ¦hØ%ÌØ½:lnÄ‚/ ¾PšGÁ«ßêW¼e 8v+a:)Ï®~y¯‚òÆ.ÎÐs¾f†45 w:«Õ¾ÄyËÜÇȤëRˆkÊÝ'c7EALZ<»E€»©»a±ëí–¥×Ù-¦w®Ž «Ag‹'}íÍvÞÖ‡8ä$+fåˆê&þV‡Óå8´aÎ9cÄLüíÄ<ÇÝöð[µ™.êïB"YåqÂ9uwé‡)%¢~"Äœ~‚X£ŸzµÁÕ,ÐO˜ãŸ·ÇúPܱ4v²ªÚ)z3`ŽpÇ­?~­ën0¦k¾5É$¾ŸzR"RI¨Z áe˜p:RuRM ³öó»$„§‚aÉ` Á‘œ¸1洌㠼€fÔ¤îSÃ[2ÙbfýCµÕxЉ3Š R¡:4U˜ðÁ&ÝD*è¤á1Cmõq®£.xà [-–áûC—‚P¬——äKCœ“ò~¿Hîh›ÖƒYáÔ é!œÖCjWW~Í|NŠú÷©Oà´‚ÐU“»R‘Èõ›Rsäº=©¹íá\½VÇ’ý ™—Ë:½÷]Aå¦Yé”–X£³m8m© 4c),r¥²ä‚¥brWK•mÜÛJ#ô\ÇæÚw˜{“Ô ]-´ÝoÿW=˜d’©…N¤Ô ­Á_éuÿíX ‚CõH-Þ¡Ï8sæSpA„Ô|xæsŸ^Ò›©˜ ª³¯¦;@&µcˆ:ˆs:bWÌ8ƒ¹Û®u/Ö„ö­‹pˆšˆsšbͶ’z´<"„#ZKL†qŽ¢äÄB¥6`øé¸Ý'_`¶y&_Š7d—ÎPJ¥vÿô†Šs† bí[ÜÝè袒X§8"Å€8ÇQZB…?49䈺_¡=FdŠ'ÖãÞNÙƽâÆ3îjîw×n§]¡°ÎñöjÈãíÕã=V»•ß…ö`„M¿T½7Âb—í5‘=-Ûk">-4±N©¢dGXZPÚ8ª‹Uut¶WEöèl¯Šøèì©Ê$4†}²ÉS É&fØ®IHBwnÌ]<’qޤßæW‹,}cüPœú.ó–uÎàÐj@»Îk˜1ãVXãV•\É;¿dMÛ´¹ÖkÁ‚1¹A,bÄœ‚˜çw9U““ a7¹f(^'×€áÜ‚/ûj+¾¥ a³†#–1bÎRA,¼ï{lúZ„Liê7ì#Ö1bNA,h•"ð“d@œcéߟ;ÈÄ–V—ûíö¥.Ùâp¼êæXënƒ‡(eüÑB%`ŽRƒ‘Ÿ¯ˆË2a! „h×?¹}ÿ¸=Oóõu7ü;63d‡Ï­:ÌáG¹á±{NžyåÙ/«&uÚ`*'‚Ì)'ˆ5­WuÜoO§‰®cXjçýãfÇbÉô ~×ÂV’HdNA¬í>kÐBzWëp­7ÒíÅv|ø²£+­#Ì"ì"éCfЉ]o‡¨6Ûq›­#•±ðÛ+ø+âM¨ô™Ð\×ûO»ê|—«êäl…&*,§Æ¦Zívó›Ãý;åWß½l§D§ˆ…€*µ"ÜhŒ,Ñ.cÄ”8B…áýƒï9†øã÷íè“gæÚ—¨Ë/þj§Õkê4,gDYeR§aíè0l˜Œÿôy¼ÞÕ¯í³[ôä¹E •‡º]ÙÕ«óü~—p 2ÙòÑ¡©w—Ó¯“¦æŽHF5¢©#Äœ©ƒX³äx9ºœS‡A“õ€áåëJÙÁ3Ÿ!”D|„˜|‹_Z iû€êäÞÄá\ꎳËòZ³>®«‚Ê:yi/½³žRm_¨W–©ü¡Úîβþ—ñè´þÛdÊmf Cf2x'v-a –WøJ–Wøõq‘’B;[|3ÅY#_›º‰¯}Úøm‚Ü è¸áKþNà·¿ º".cÈÔj$\Õ?9}‘e׌ã1ìÚû†¡½0lnƒ…wuL\›lägìC± á©È>dÎ>AlÎ>h {ûävö‰¶wÁŠ·]4šÞ©’·w†8È·ˆŠ!3êÄf,„ǰ³Ð Ã`¡Ãö*دb¡cýð‡é;˜ÒuÈeWÔ*lÂ-8áÃ%¾ÑUÐò{K.‡f¼´+S<Û•Å7¯¼Ž<ÅŸ7F/¸ÃsŠPªÄe ™ðf cÞGƒXkÇöîå¹Íœ¯»ÚëxµkuðùY)ø2ü†ÄÝO߃2·E`F5˜jÅ1UAæTĪIîíÀ#Ùíí˜!öv I^ÎE‹Óo1ôðT«›š5c>h¢9£ Ó|dÎ|A¬À|h${óåIvæ‹I¶×‡•¼#}‹ovVÍÎ? YOI‡iÀ2gÀ V`@4’½ó$;Æ$'_r§jUn‹÷SM[‡9îO)DëÄëtbuN§‰Öy¸0ï™7/5æB ƒº^ø­½ˆc scbýØ?–ß§;1øÔffðÚ¯2:ÌŠ!†Ì >ˆ5Ϋä]óé¥'ž^ÕT„Ic‹Š’BbÖ1dnàA, œÛCh’ÆafÒ27ð .¾íÀ‡Œ%03P ™x»¼.ÿgiÒ#¿³öõ“)mQ£{™ykϦ|óIN-”<5´G¹±0ðo;É”zÊbFõ13ì Fýmg¸•ÄPÒ#Ą̈ƒÔuÔßzzNŒ´˜=BÌ ;H…©áŽactôÚÿC3œGˆ™a©vÃ÷jsǰ-°¡c°Â`Æò13ì Õ;µ½;ô> endobj 4089 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [157.4567 689.2141 174.3932 700.339] /Subtype /Link /A << /S /GoTo /D (page.145) >> >> endobj 4090 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [198.5505 676.9822 210.5057 688.9373] /Subtype /Link /A << /S /GoTo /D (page.42) >> >> endobj 4091 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 665.3037 129.0337 676.4287] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4092 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 653.3486 129.0337 664.4735] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4093 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.1294 653.3486 150.066 664.4735] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4094 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [154.1617 653.3486 171.0983 664.4735] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4095 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.9922 641.3934 172.9287 652.5184] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4096 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [161.2225 629.4382 178.1591 640.5632] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4097 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [161.2225 617.4831 178.1591 628.608] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4098 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [165.0119 605.2512 176.9671 617.2063] /Subtype /Link /A << /S /GoTo /D (page.91) >> >> endobj 4099 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [181.0629 605.2512 197.9994 617.2063] /Subtype /Link /A << /S /GoTo /D (page.134) >> >> endobj 4100 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [202.0952 605.2512 219.0317 617.2063] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 4101 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [157.0122 593.296 168.9674 605.2512] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 4102 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [167.1685 581.3408 179.1237 593.296] /Subtype /Link /A << /S /GoTo /D (page.41) >> >> endobj 4103 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [183.2194 581.3408 195.1746 593.296] /Subtype /Link /A << /S /GoTo /D (page.60) >> >> endobj 4104 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [185.4653 559.423 197.4205 571.3782] /Subtype /Link /A << /S /GoTo /D (page.74) >> >> endobj 4105 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [165.2633 547.4679 177.2185 559.423] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4106 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [197.086 535.5127 209.0412 547.4679] /Subtype /Link /A << /S /GoTo /D (page.43) >> >> endobj 4107 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [197.086 523.5575 209.0412 535.5127] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 4108 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 512.1558 134.015 523.004] /Subtype /Link /A << /S /GoTo /D (page.144) >> >> endobj 4109 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [130.2239 499.6472 142.1791 511.6023] /Subtype /Link /A << /S /GoTo /D (page.76) >> >> endobj 4110 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [161.4975 487.692 173.4527 499.6472] /Subtype /Link /A << /S /GoTo /D (page.71) >> >> endobj 4111 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [171.2387 475.7368 183.1939 487.692] /Subtype /Link /A << /S /GoTo /D (page.74) >> >> endobj 4112 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [151.0368 463.7817 162.992 475.7368] /Subtype /Link /A << /S /GoTo /D (page.71) >> >> endobj 4113 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [167.0878 463.7817 179.043 475.7368] /Subtype /Link /A << /S /GoTo /D (page.81) >> >> endobj 4114 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.8103 451.8265 148.7655 463.7817] /Subtype /Link /A << /S /GoTo /D (page.71) >> >> endobj 4115 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [152.8612 451.8265 164.8164 463.7817] /Subtype /Link /A << /S /GoTo /D (page.81) >> >> endobj 4116 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [168.9122 451.8265 180.8674 463.7817] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4117 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [139.3012 440.4248 151.2564 450.7749] /Subtype /Link /A << /S /GoTo /D (page.14) >> >> endobj 4118 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.3521 440.4248 172.2887 450.7749] /Subtype /Link /A << /S /GoTo /D (page.121) >> >> endobj 4119 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [176.3844 440.4248 193.321 450.7749] /Subtype /Link /A << /S /GoTo /D (page.134) >> >> endobj 4120 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [147.271 427.9162 159.2262 439.8713] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 4121 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 416.5145 118.324 427.3627] /Subtype /Link /A << /S /GoTo /D (page.153) >> >> endobj 4122 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 404.5593 118.324 415.4075] /Subtype /Link /A << /S /GoTo /D (page.153) >> >> endobj 4123 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [165.9509 392.0507 182.8875 404.0058] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 4124 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.5353 380.3722 153.4719 391.4972] /Subtype /Link /A << /S /GoTo /D (page.111) >> >> endobj 4125 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [148.6269 368.1403 160.5821 380.0955] /Subtype /Link /A << /S /GoTo /D (page.94) >> >> endobj 4126 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [147.9372 344.23 164.8737 356.1852] /Subtype /Link /A << /S /GoTo /D (page.165) >> >> endobj 4127 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [168.9695 344.23 185.906 356.1852] /Subtype /Link /A << /S /GoTo /D (page.170) >> >> endobj 4128 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [131.58 322.3122 143.5352 334.2674] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4129 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 310.9105 113.3427 321.7587] /Subtype /Link /A << /S /GoTo /D (page.46) >> >> endobj 4130 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [151.0368 298.4019 167.9733 310.357] /Subtype /Link /A << /S /GoTo /D (page.183) >> >> endobj 4131 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [188.3154 286.4467 205.2519 298.4019] /Subtype /Link /A << /S /GoTo /D (page.176) >> >> endobj 4132 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [181.6205 274.4915 198.5571 286.4467] /Subtype /Link /A << /S /GoTo /D (page.175) >> >> endobj 4133 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [176.3902 262.5363 193.3267 274.4915] /Subtype /Link /A << /S /GoTo /D (page.175) >> >> endobj 4134 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [158.3979 250.5812 175.3344 262.5363] /Subtype /Link /A << /S /GoTo /D (page.177) >> >> endobj 4135 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [153.1675 238.626 170.1041 250.5812] /Subtype /Link /A << /S /GoTo /D (page.177) >> >> endobj 4136 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [179.3192 226.6708 196.2558 238.626] /Subtype /Link /A << /S /GoTo /D (page.175) >> >> endobj 4137 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [200.3515 226.6708 217.288 238.626] /Subtype /Link /A << /S /GoTo /D (page.178) >> >> endobj 4138 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [179.3192 214.7157 196.2558 226.6708] /Subtype /Link /A << /S /GoTo /D (page.175) >> >> endobj 4139 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [137.4765 202.7605 154.413 214.7157] /Subtype /Link /A << /S /GoTo /D (page.169) >> >> endobj 4140 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [153.1675 190.8053 170.1041 202.7605] /Subtype /Link /A << /S /GoTo /D (page.168) >> >> endobj 4141 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [153.1675 178.8502 170.1041 190.8053] /Subtype /Link /A << /S /GoTo /D (page.167) >> >> endobj 4142 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [177.8547 166.895 194.7912 178.8502] /Subtype /Link /A << /S /GoTo /D (page.167) >> >> endobj 4143 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [158.3979 154.9398 175.3344 166.895] /Subtype /Link /A << /S /GoTo /D (page.176) >> >> endobj 4144 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [177.8547 142.9847 194.7912 154.9398] /Subtype /Link /A << /S /GoTo /D (page.177) >> >> endobj 4145 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [158.3979 131.0295 175.3344 142.9847] /Subtype /Link /A << /S /GoTo /D (page.177) >> >> endobj 4146 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [192.0812 119.0743 209.0178 131.0295] /Subtype /Link /A << /S /GoTo /D (page.170) >> >> endobj 4147 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [172.6244 107.1192 189.5609 119.0743] /Subtype /Link /A << /S /GoTo /D (page.170) >> >> endobj 4148 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [163.6282 95.164 180.5647 107.1192] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4149 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [163.6282 83.2088 180.5647 95.164] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4150 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [184.6605 83.2088 201.597 95.164] /Subtype /Link /A << /S /GoTo /D (page.180) >> >> endobj 4151 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [174.0889 71.2537 191.0254 83.2088] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4152 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [137.4765 59.2985 154.413 71.2537] /Subtype /Link /A << /S /GoTo /D (page.169) >> >> endobj 4153 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [167.394 47.3433 184.3306 59.2985] /Subtype /Link /A << /S /GoTo /D (page.165) >> >> endobj 4154 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [188.4263 47.3433 205.3629 59.2985] /Subtype /Link /A << /S /GoTo /D (page.166) >> >> endobj 4155 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [177.8547 35.3882 194.7912 47.3433] /Subtype /Link /A << /S /GoTo /D (page.166) >> >> endobj 4156 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [163.6282 23.433 180.5647 35.3882] /Subtype /Link /A << /S /GoTo /D (page.180) >> >> endobj 4157 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [381.6828 688.9373 398.6193 700.8925] /Subtype /Link /A << /S /GoTo /D (page.169) >> >> endobj 4158 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [407.8345 676.9822 424.771 688.9373] /Subtype /Link /A << /S /GoTo /D (page.180) >> >> endobj 4159 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [411.6003 665.027 428.5368 676.9822] /Subtype /Link /A << /S /GoTo /D (page.173) >> >> endobj 4160 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [406.37 653.0718 423.3065 665.027] /Subtype /Link /A << /S /GoTo /D (page.175) >> >> endobj 4161 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [392.1434 641.1167 409.08 653.0718] /Subtype /Link /A << /S /GoTo /D (page.173) >> >> endobj 4162 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [407.8345 629.1615 424.771 641.1167] /Subtype /Link /A << /S /GoTo /D (page.178) >> >> endobj 4163 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [413.0648 617.2063 430.0013 629.1615] /Subtype /Link /A << /S /GoTo /D (page.178) >> >> endobj 4164 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [436.2875 605.2512 453.224 617.2063] /Subtype /Link /A << /S /GoTo /D (page.165) >> >> endobj 4165 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [457.3198 605.2512 474.2563 617.2063] /Subtype /Link /A << /S /GoTo /D (page.167) >> >> endobj 4166 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.9131 593.296 403.8496 605.2512] /Subtype /Link /A << /S /GoTo /D (page.169) >> >> endobj 4167 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [416.8306 581.3408 433.7672 593.296] /Subtype /Link /A << /S /GoTo /D (page.170) >> >> endobj 4168 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [381.6828 569.3857 398.6193 581.3408] /Subtype /Link /A << /S /GoTo /D (page.168) >> >> endobj 4169 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [416.8306 557.4305 433.7672 569.3857] /Subtype /Link /A << /S /GoTo /D (page.165) >> >> endobj 4170 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [437.8629 557.4305 454.7995 569.3857] /Subtype /Link /A << /S /GoTo /D (page.166) >> >> endobj 4171 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [394.4662 545.4753 411.4027 557.4305] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 4172 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [380.7416 534.0736 397.6781 544.9218] /Subtype /Link /A << /S /GoTo /D (page.146) >> >> endobj 4173 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [410.2147 521.565 422.1699 533.5202] /Subtype /Link /A << /S /GoTo /D (page.73) >> >> endobj 4174 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [401.663 509.8866 418.5995 521.0115] /Subtype /Link /A << /S /GoTo /D (page.146) >> >> endobj 4175 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [391.2023 497.9314 408.1388 509.0563] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 4176 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [442.0412 485.9762 458.9777 497.1012] /Subtype /Link /A << /S /GoTo /D (page.163) >> >> endobj 4177 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2848 474.2978 373.24 485.146] /Subtype /Link /A << /S /GoTo /D (page.66) >> >> endobj 4178 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [423.1384 461.7891 440.0749 473.7443] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4179 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [350.8241 438.4323 362.7793 449.2805] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 4180 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [385.9719 426.2004 397.9271 437.3253] /Subtype /Link /A << /S /GoTo /D (page.72) >> >> endobj 4181 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [385.9719 414.2452 397.9271 425.3702] /Subtype /Link /A << /S /GoTo /D (page.68) >> >> endobj 4182 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [402.0229 414.2452 413.9781 425.3702] /Subtype /Link /A << /S /GoTo /D (page.72) >> >> endobj 4183 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [340.3634 402.5668 357.2999 413.415] /Subtype /Link /A << /S /GoTo /D (page.114) >> >> endobj 4184 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [381.0166 390.0581 392.9718 402.0133] /Subtype /Link /A << /S /GoTo /D (page.72) >> >> endobj 4185 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [411.3747 378.103 423.3299 390.0581] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 4186 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.4257 378.103 444.3622 390.0581] /Subtype /Link /A << /S /GoTo /D (page.183) >> >> endobj 4187 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [411.3747 366.1478 423.3299 378.103] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 4188 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.4257 366.1478 444.3622 378.103] /Subtype /Link /A << /S /GoTo /D (page.183) >> >> endobj 4189 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [380.7416 354.4694 397.6781 365.5943] /Subtype /Link /A << /S /GoTo /D (page.154) >> >> endobj 4190 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 342.7909 368.0096 353.6392] /Subtype /Link /A << /S /GoTo /D (page.98) >> >> endobj 4191 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 330.8358 368.0096 341.684] /Subtype /Link /A << /S /GoTo /D (page.98) >> >> endobj 4192 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [372.1054 330.8358 389.0419 341.684] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4193 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [393.1377 330.8358 410.0742 341.684] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4194 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [394.9681 318.8806 411.9047 329.7288] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4195 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [400.1985 306.9254 417.135 317.7737] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4196 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [400.1985 294.9703 417.135 305.8185] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4197 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.7862 282.4616 387.7414 294.4168] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 4198 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [374.1258 270.5065 386.081 282.4616] /Subtype /Link /A << /S /GoTo /D (page.30) >> >> endobj 4199 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2848 259.1048 373.24 269.953] /Subtype /Link /A << /S /GoTo /D (page.52) >> >> endobj 4200 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [408.0285 236.6335 424.9651 248.5887] /Subtype /Link /A << /S /GoTo /D (page.127) >> >> endobj 4201 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [432.7157 224.6783 449.6523 236.6335] /Subtype /Link /A << /S /GoTo /D (page.127) >> >> endobj 4202 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [443.1764 212.7231 460.113 224.6783] /Subtype /Link /A << /S /GoTo /D (page.127) >> >> endobj 4203 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [384.5074 201.0447 401.444 212.1697] /Subtype /Link /A << /S /GoTo /D (page.128) >> >> endobj 4204 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 189.0895 381.9871 200.2145] /Subtype /Link /A << /S /GoTo /D (page.127) >> >> endobj 4205 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.2809 177.1344 387.2175 188.2593] /Subtype /Link /A << /S /GoTo /D (page.127) >> >> endobj 4206 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [349.3596 165.1792 366.2961 176.3042] /Subtype /Link /A << /S /GoTo /D (page.129) >> >> endobj 4207 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [349.3596 153.224 366.2961 164.349] /Subtype /Link /A << /S /GoTo /D (page.129) >> >> endobj 4208 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [349.3596 141.2689 366.2961 152.3938] /Subtype /Link /A << /S /GoTo /D (page.129) >> >> endobj 4209 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [354.5899 129.3137 371.5264 140.4387] /Subtype /Link /A << /S /GoTo /D (page.129) >> >> endobj 4210 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [349.3596 117.3585 366.2961 128.4835] /Subtype /Link /A << /S /GoTo /D (page.129) >> >> endobj 4211 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [349.3596 105.4034 366.2961 116.5283] /Subtype /Link /A << /S /GoTo /D (page.129) >> >> endobj 4212 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [349.3596 93.4482 366.2961 104.5732] /Subtype /Link /A << /S /GoTo /D (page.129) >> >> endobj 4213 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [354.5899 81.493 371.5264 92.618] /Subtype /Link /A << /S /GoTo /D (page.129) >> >> endobj 4214 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [354.5899 69.5379 371.5264 80.6628] /Subtype /Link /A << /S /GoTo /D (page.127) >> >> endobj 4215 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [354.5899 57.5827 371.5264 68.7076] /Subtype /Link /A << /S /GoTo /D (page.128) >> >> endobj 4216 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [379.2771 45.6275 396.2136 56.7525] /Subtype /Link /A << /S /GoTo /D (page.130) >> >> endobj 4217 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [368.8164 33.6724 385.753 44.7973] /Subtype /Link /A << /S /GoTo /D (page.130) >> >> endobj 4218 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [403.9643 21.7172 420.9008 32.8421] /Subtype /Link /A << /S /GoTo /D (page.130) >> >> endobj 4088 0 obj << /D [4086 0 R /XYZ 64.9134 727.2935 null] >> endobj 4085 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 4221 0 obj << /Length 3179 /Filter /FlateDecode >> stream xÚ½\KÛ8¾÷¯ð1 ¬¾ÇÌ °ì‹Ía™98¶Ò­-yl9“Þ_¿EY”)‰¢èn&9$j§úãWÅb±ªHùÇïÑ+ƒŒ¤rõáÓJrdã+Å0Ò“Õ‡Ýoï(¡|øuÅ)F’ºÂíÇÿçO?ÿÇþÇÃÏ|ˆWä@%âFŠÕöððçÃoàÕî¯~}ÀHµú ž1bF‹Õá †gÌ}²ø÷ÿzÀµC\û?Z┘KC§œµŸÆôŒ¯ˆ'5¡×R¸ò#ÆPàÇašºŸGìàÚGœ²S lä]Sœ›1A#À A¸@Ðh$ŒÔC‚çbÂkg‘Ñ‚=âCB4‚lø±lÞ·Þ9ôcp"ˆê<õokÆØ;ÂðUr€»VQCŒe‚Œôê9EUœÊíD}Lغ™ÆˆKCÞ®¾C\ûõ±°4åmdKóËæôžLÕgÁˆ¤Sÿw,ð/?Áßä‘\mÁß©ƒ¶ HIÌÆ¶hBƒ„mŒƒ¸N¶Ã%ϳOÂíDÇtÇÓ¦ ¢ŒBŒà´“ož´oíN§Lsij—jö¥)R•Ö&¤³€ÐÌ´IVšQ$¹æù”ö#J;©^iš¦´ÔYµ·{–a,Ÿö`D{'eÙmŸc«t4å"‡ÒX#Å4ɧ´QÚIõJÓï¨4l_Hij²)íÎ+ÝKµJ×»â»Î´š*Oi0¢´“ê•Nži÷ sh¯(ÒæÓÞŒhï¤,»ÏÅKòæVš Ø´LVZbÈ—T¾xîF”vRNiú]•æÚþn¾0îF”vRÒÓt¼‡ÍƯG\`H0³+ )Võl¾žaŸ¯/0tùú€a±}®—3Ö¨ëÀäJY²ë0…0Vù6C0â:NjÑurñó\'Êðæ:>Řëdcxs8ÃÞu|†­ëÐïê:T’1¥ð#®ã¤,»}Y»rZ‡S‚$ÔŽù8öˆ , åHq€Ð<žêÃ1X&r‚4§ã2QÒÐü ä©DÂFª|äF&ÈI]5/«@›„ ÂÌǰG\àh×Õ`ÂÉss*6‡ôéÁÁN‰+E&UüÜì`K™dLÏ<ÀÈì8©k «Ø%÷8NOJûm ‚‰>„¥Ô=p÷ ûŽT0L9˜µ]’¦[aÏ›ý§¥”Ëvzvä]ñ¸&ï>ÂÃåɶ}ºÑÂí¯`kkÞãD³1÷ Ü¡©Íšv Ôù¹öüœb¬#ØèT×T]vj©~÷{†#ôË_þÁ$„W:öàü;Ñ¡Jõ´[¬%â9VH!v€k1°Ô dïXÞÆm3ˆÍ!¹ø%"¼Ô$ÂÒЩâ{šA)fjÅŒ@J2‘!ƒê×>d(Æb›Gܶ47»Ý©8ŸC ‡,F±ñH‚!–B±k°ô˧ª>Mô7¢#+¦8Àg³pí#†òG ³DØm`˱>žçâ!ó\mW\SÖ•·¼ŒLð…ëê*«íþf| ËS±µëº)á‡/vm·ËÜóàèÚÀËêSùu2 v¢`e°Ok–7OC¸ö'6¶%lnã^gaj"¬'‘\Q/X¹—UÙ”›}ù¿ÛÐôhmS}÷ôÜ6M×:âîbLò»‘FŽs¼4 ±)Ý4Š¥nDOE°ý{ £º…›ÞN4={DÅàq,3Qù‘#ª^ÌÒ<Õ—jWV“£XJ) .O‡¸ÄVŒÁPé x~ºT[ë¼ áÛ:Éï˜pˆŸ\ ãNÖXë@‡A.ÌÄ­?5.I;µW4×Úó¹v|FG¡M»´å\< ûËÓu.‘2ÆñlÚH»¶°û⺲ö!×’-ÙpÃùïåpLIŸBÑœè>Ô<š6ù#~.^Îõ©I^'„Šä…â°i&ì+ïkó{¿9=uÇø±ºêz{…M…×}2Pg¿97©ývÈ"S#•…Ë/ $|œg8ìïóKq>¿ì¥,ÁC½+?•ÛMx‘J…Œáüþ]Žëh–l"¥×.ÜLä!FLä¤ÚX[lv³­ˆl o­ˆ8ž1àxn6§i¿<KE2’tˆK$9Ä‚ IÚ®Û„£„l_p–‘£C\â(5Ò†Š!Çm½¿ª`T õtL0¨Hç4%£Mj_@ý¼Ü-Zj7¸’ÛŠê©y^*žßœÃ ìëØÉöœ ­#µ†îôšýT¹MštÖ}û@ElÍÎrÆr1¨œÔÕw/Ux uI”k,©`¬–ÒN#ï0¶ëNçŒÕbÄNªí×ç²-–èR-Û[!xc ŠvƒåÔߺCƒó’þƼµçû'–¾€Êsr//\çó’r~Ó…äâ¢Ì7àü4:¡¶à>Íìå"w;׋²ëõ|zGØk¡.ŸÝn³qìwÛ8G·Ùúãn“TÛ†œTw„º3ÔÆ§ýL'”d€Z®0·žŒ¹k´N“z“~ˆáb%í;(}=ÆTò¢«ës‘Ð.¹ó° > Tàb‚òn°¿¦m Æ 11&ß=c¸p͘1ƒ0StxÍør<§äýŠymH‰µcBÉhHw_ê?ôý«€‰ðp"›ÏÅÔ4àíRC Gæ°M‡¸ö!Cƃ¥¹l9îl¯©OÁ‹PB!ÁØ8w 7]5E”b3¶À×”Æò+ªk2XÙÝp{S8ÓöN+G’¿=mè×bÀÚŒ¬¤èÇmNeó’rã;Ô¤êzSI'œQCP[ ÓdÌN¬µESRÒê )Ȩaîs‹;Œ›bú˜žQ<ȘQœX»‹c°‚š8Hð(Feña4RJˆŒ¦ð!#¦èÅFò¥2vfµôoKˆùÂãhjŠYN»x1»8±>ãJ½I5Ó ½ß'GZŠœÑÓ‡ŒéîÄ®-²§SѤt^±£ϯ£F‘Ô¾frŃŒʼnµéMõT4¯ÝT´îV‰Áwm3Ý~[>†S«™®Kz3é ½}þ,±ƒyIÝÉÑËÝn_|#GÕשÊjéÊÑ›2!>V°š÷[l½1k*äCÆüÖ‰å ðéa=b n‚ì>ç*ö!#ÖèÅ^ÖçVeY•îøps>ÛŠÃ#Um·yÔ¼‘°/3qìNÓ¸¬)O§ú”²xÂ-ÑäžTú@o:ù.×zW仃8Øý=nŠõoà˜‘Œ5£©{±k¸:7§íSÎò(R¶ÞySLÓ qAFw½—}S~*÷ÁDÓaoómPû·wäRÏnIò+¯¡ëqýü0- XˆŒî!FæÛIY‚^ŠÓä&1‚¼”æcèJ†å|ÀðËætN̈Ìh©î™Å nsj<ÈØÜ8±öD¶¬žöESO78MÀ` |DâQm;P戶sDRç¨ï¸†ß4þj2-;H `$rç'BF¯6v`£¡›òËÔU ‘!Ô0x0Haóö·þzĵ˜Ûª—vî˜{×3ßž–TUw¯'Åî<×#†ÜüzŽž­Gì#FzĽØ5ÆÕMqÎyvLsúžòÀ{¢æ¬RC2šÇCŒ™Ç‰µQf»©r^É'ÉxUü5›º3‘³œ©»IÝ{1×ÉL>#Ä$—×QÝ1TIð'§îdLw'ÖëN³ê¾<ïTÃo3–³YëCFtïÅzÝÙ7ÑýkóÚ'B&¿íRíCÇ«Á× ´Nî<*ù¨°w}¼σÃï„6©éÏt^p/×Î7(änD¨œ«Ð‡Œy¢k¯?ï¦Û‡¤’ëŒ âCN!MeC‚¹¿êH Ø*ÄÄG"E4¢˜f dl¢œX䛩裉/üöjªC\¢)5«!ÍÜÓ5z÷´Ÿ®â»½™:ØÂ%¾»¯Éž1l°[ÎÓo•Wõùø’ïÊ'M¾Ù¼Ù7’a“þ53lÝWusÚl‹·ïÉoŽUÍsh›…åé>yiOO¾…?´È³õh{ã K’±õ!#õh/öŠÜQ¥TqõFR`“Q{1¢¼“rß°u¾ãN’Jþ¿å5à¡2*ï!F”wR®‘[yI…»@×h¢3µZÀös®a‹z2Œ‰6¢g†aÉÃ$·¹ëj›þ*8aÎÓþVëªendstream endobj 4220 0 obj << /Type /Page /Contents 4221 0 R /Resources 4219 0 R /MediaBox [0 0 612 792] /Parent 3928 0 R /Annots [ 4223 0 R 4224 0 R 4225 0 R 4226 0 R 4227 0 R 4228 0 R 4229 0 R 4230 0 R 4231 0 R 4232 0 R 4233 0 R 4234 0 R 4235 0 R 4236 0 R 4237 0 R 4238 0 R 4239 0 R 4240 0 R 4241 0 R 4242 0 R 4243 0 R 4244 0 R 4245 0 R 4246 0 R 4247 0 R 4248 0 R 4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R 4255 0 R 4256 0 R 4257 0 R 4258 0 R 4259 0 R 4260 0 R 4261 0 R 4262 0 R 4263 0 R 4264 0 R 4265 0 R 4266 0 R 4267 0 R 4268 0 R 4269 0 R 4270 0 R 4271 0 R 4272 0 R 4273 0 R 4274 0 R 4275 0 R 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R 4291 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4296 0 R 4297 0 R 4298 0 R 4299 0 R 4300 0 R 4301 0 R 4302 0 R 4303 0 R 4304 0 R 4305 0 R 4306 0 R 4307 0 R 4308 0 R 4309 0 R 4310 0 R 4311 0 R 4312 0 R 4313 0 R 4314 0 R 4315 0 R 4316 0 R 4317 0 R 4318 0 R 4319 0 R 4320 0 R 4321 0 R 4322 0 R 4323 0 R 4324 0 R 4325 0 R 4326 0 R 4327 0 R 4328 0 R 4329 0 R 4330 0 R 4331 0 R 4332 0 R 4333 0 R 4334 0 R 4335 0 R 4336 0 R 4337 0 R 4338 0 R 4339 0 R 4340 0 R 4341 0 R 4342 0 R 4343 0 R 4344 0 R 4345 0 R 4346 0 R 4347 0 R 4348 0 R 4349 0 R 4350 0 R 4351 0 R 4352 0 R 4353 0 R 4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R ] >> endobj 4223 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [149.2973 689.2141 166.2339 700.339] /Subtype /Link /A << /S /GoTo /D (page.130) >> >> endobj 4224 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [163.6282 676.9822 180.5647 688.9373] /Subtype /Link /A << /S /GoTo /D (page.168) >> >> endobj 4225 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [96.1571 665.3037 113.0937 676.4287] /Subtype /Link /A << /S /GoTo /D (page.108) >> >> endobj 4226 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 653.3486 118.324 664.4735] /Subtype /Link /A << /S /GoTo /D (page.108) >> >> endobj 4227 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [120.8443 641.3934 132.7995 652.5184] /Subtype /Link /A << /S /GoTo /D (page.89) >> >> endobj 4228 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [120.8443 629.4382 132.7995 640.5632] /Subtype /Link /A << /S /GoTo /D (page.68) >> >> endobj 4229 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.8953 629.4382 148.8505 640.5632] /Subtype /Link /A << /S /GoTo /D (page.89) >> >> endobj 4230 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [120.8443 617.4831 132.7995 628.608] /Subtype /Link /A << /S /GoTo /D (page.85) >> >> endobj 4231 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [120.8443 605.5279 132.7995 616.6529] /Subtype /Link /A << /S /GoTo /D (page.85) >> >> endobj 4232 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [120.8443 593.5727 132.7995 604.6977] /Subtype /Link /A << /S /GoTo /D (page.85) >> >> endobj 4233 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [120.8443 581.6176 132.7995 592.7425] /Subtype /Link /A << /S /GoTo /D (page.85) >> >> endobj 4234 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.8953 581.6176 148.8505 592.7425] /Subtype /Link /A << /S /GoTo /D (page.86) >> >> endobj 4235 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [115.614 569.6624 127.5692 580.7873] /Subtype /Link /A << /S /GoTo /D (page.86) >> >> endobj 4236 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [115.614 557.7072 127.5692 568.8322] /Subtype /Link /A << /S /GoTo /D (page.86) >> >> endobj 4237 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [154.5277 545.7521 166.4829 556.877] /Subtype /Link /A << /S /GoTo /D (page.86) >> >> endobj 4238 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [154.5277 533.7969 166.4829 544.9218] /Subtype /Link /A << /S /GoTo /D (page.86) >> >> endobj 4239 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [171.6832 521.8417 188.6197 532.9667] /Subtype /Link /A << /S /GoTo /D (page.162) >> >> endobj 4240 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [161.2225 509.8866 178.1591 521.0115] /Subtype /Link /A << /S /GoTo /D (page.100) >> >> endobj 4241 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [120.8443 497.9314 137.7809 509.0563] /Subtype /Link /A << /S /GoTo /D (page.140) >> >> endobj 4242 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [90.9268 485.9762 102.882 496.603] /Subtype /Link /A << /S /GoTo /D (page.22) >> >> endobj 4243 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.9777 485.9762 118.9329 496.603] /Subtype /Link /A << /S /GoTo /D (page.24) >> >> endobj 4244 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [123.0287 485.9762 134.9839 496.603] /Subtype /Link /A << /S /GoTo /D (page.26) >> >> endobj 4245 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [139.0796 485.9762 156.0162 496.603] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 4246 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [129.9195 464.0076 141.8747 475.9628] /Subtype /Link /A << /S /GoTo /D (page.30) >> >> endobj 4247 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 452.6059 113.3427 463.4541] /Subtype /Link /A << /S /GoTo /D (page.13) >> >> endobj 4248 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.4384 452.6059 129.3936 463.4541] /Subtype /Link /A << /S /GoTo /D (page.17) >> >> endobj 4249 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.4894 452.6059 150.4259 463.4541] /Subtype /Link /A << /S /GoTo /D (page.112) >> >> endobj 4250 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 440.6508 118.324 451.499] /Subtype /Link /A << /S /GoTo /D (page.112) >> >> endobj 4251 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [141.3212 428.1421 158.2577 440.0973] /Subtype /Link /A << /S /GoTo /D (page.120) >> >> endobj 4252 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 416.4637 118.573 427.0905] /Subtype /Link /A << /S /GoTo /D (page.26) >> >> endobj 4253 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [126.0747 404.7852 143.0112 415.6335] /Subtype /Link /A << /S /GoTo /D (page.150) >> >> endobj 4254 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.687 392.8301 179.6236 403.6783] /Subtype /Link /A << /S /GoTo /D (page.161) >> >> endobj 4255 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [161.4975 370.5847 173.4527 382.5399] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4256 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [167.1685 358.6296 179.1237 370.5847] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 4257 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [160.7781 346.6744 177.7146 358.6296] /Subtype /Link /A << /S /GoTo /D (page.120) >> >> endobj 4258 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [203.7809 334.7192 215.736 346.6744] /Subtype /Link /A << /S /GoTo /D (page.24) >> >> endobj 4259 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [219.8318 334.7192 231.787 346.6744] /Subtype /Link /A << /S /GoTo /D (page.25) >> >> endobj 4260 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [235.8828 334.7192 247.838 346.6744] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 4261 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [251.9337 334.7192 268.8702 346.6744] /Subtype /Link /A << /S /GoTo /D (page.203) >> >> endobj 4262 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [146.5516 322.764 158.5068 334.7192] /Subtype /Link /A << /S /GoTo /D (page.73) >> >> endobj 4263 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 311.0856 129.0337 322.2106] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 4264 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [226.3115 298.8537 238.2667 310.8089] /Subtype /Link /A << /S /GoTo /D (page.59) >> >> endobj 4265 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [242.3624 298.8537 259.299 310.8089] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4266 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [131.58 265.2066 148.5165 277.1618] /Subtype /Link /A << /S /GoTo /D (page.183) >> >> endobj 4267 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [152.6122 265.2066 169.5488 277.1618] /Subtype /Link /A << /S /GoTo /D (page.184) >> >> endobj 4268 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 243.7915 134.015 254.9165] /Subtype /Link /A << /S /GoTo /D (page.125) >> >> endobj 4269 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 231.8363 134.015 242.9613] /Subtype /Link /A << /S /GoTo /D (page.125) >> >> endobj 4270 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [164.7056 209.8677 181.6422 221.8229] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4271 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 198.466 118.324 209.3142] /Subtype /Link /A << /S /GoTo /D (page.124) >> >> endobj 4272 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [207.8511 185.9574 224.7877 197.9126] /Subtype /Link /A << /S /GoTo /D (page.148) >> >> endobj 4273 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [215.8273 174.5557 227.7825 185.4039] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4274 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [145.6105 162.047 157.5657 174.0022] /Subtype /Link /A << /S /GoTo /D (page.30) >> >> endobj 4275 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [161.6615 162.047 173.6167 174.0022] /Subtype /Link /A << /S /GoTo /D (page.31) >> >> endobj 4276 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [151.7819 150.0919 168.7184 162.047] /Subtype /Link /A << /S /GoTo /D (page.120) >> >> endobj 4277 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 138.4134 128.7847 149.5384] /Subtype /Link /A << /S /GoTo /D (page.124) >> >> endobj 4278 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [131.58 126.1815 143.5352 138.1367] /Subtype /Link /A << /S /GoTo /D (page.71) >> >> endobj 4279 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [147.6309 126.1815 159.5861 138.1367] /Subtype /Link /A << /S /GoTo /D (page.82) >> >> endobj 4280 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [131.305 114.7799 143.2602 125.6281] /Subtype /Link /A << /S /GoTo /D (page.77) >> >> endobj 4281 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [147.356 114.7799 159.3112 125.6281] /Subtype /Link /A << /S /GoTo /D (page.78) >> >> endobj 4282 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [146.996 102.5479 158.9512 113.6729] /Subtype /Link /A << /S /GoTo /D (page.77) >> >> endobj 4283 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 90.8695 118.573 101.2196] /Subtype /Link /A << /S /GoTo /D (page.18) >> >> endobj 4284 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [122.6688 90.8695 134.624 101.2196] /Subtype /Link /A << /S /GoTo /D (page.86) >> >> endobj 4285 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [138.7197 90.8695 155.6562 101.2196] /Subtype /Link /A << /S /GoTo /D (page.162) >> >> endobj 4286 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [159.752 90.8695 176.6885 101.2196] /Subtype /Link /A << /S /GoTo /D (page.163) >> >> endobj 4287 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 78.9144 113.3427 89.7626] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 4288 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [180.6794 66.6824 192.6346 77.8074] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 4289 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 54.7273 134.015 65.8522] /Subtype /Link /A << /S /GoTo /D (page.138) >> >> endobj 4290 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 42.7721 129.0337 53.8971] /Subtype /Link /A << /S /GoTo /D (page.32) >> >> endobj 4291 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.1294 42.7721 145.0846 53.8971] /Subtype /Link /A << /S /GoTo /D (page.99) >> >> endobj 4292 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [149.1804 42.7721 166.1169 53.8971] /Subtype /Link /A << /S /GoTo /D (page.138) >> >> endobj 4293 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 31.0937 113.3427 41.9419] /Subtype /Link /A << /S /GoTo /D (page.17) >> >> endobj 4294 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.4384 31.0937 129.3936 41.9419] /Subtype /Link /A << /S /GoTo /D (page.21) >> >> endobj 4295 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.4894 31.0937 145.4446 41.9419] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 4296 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [149.5403 31.0937 166.4769 41.9419] /Subtype /Link /A << /S /GoTo /D (page.137) >> >> endobj 4297 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [135.1498 18.585 147.105 30.5402] /Subtype /Link /A << /S /GoTo /D (page.30) >> >> endobj 4298 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [380.7416 689.2141 397.6781 700.339] /Subtype /Link /A << /S /GoTo /D (page.116) >> >> endobj 4299 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [330.8161 667.573 342.7713 678.3105] /Subtype /Link /A << /S /GoTo /D (page.20) >> >> endobj 4300 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [396.4326 655.3411 413.3692 666.4661] /Subtype /Link /A << /S /GoTo /D (page.144) >> >> endobj 4301 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [387.9905 643.1092 404.9271 655.0644] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4302 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [388.2968 631.154 405.2334 643.1092] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4303 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [383.0665 619.1989 400.003 631.154] /Subtype /Link /A << /S /GoTo /D (page.119) >> >> endobj 4304 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [404.0988 619.1989 421.0353 631.154] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4305 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [400.4734 607.2437 412.4286 619.1989] /Subtype /Link /A << /S /GoTo /D (page.97) >> >> endobj 4306 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [398.7575 595.2885 415.694 607.2437] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4307 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [419.7898 595.2885 436.7263 607.2437] /Subtype /Link /A << /S /GoTo /D (page.165) >> >> endobj 4308 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 583.8868 381.9871 594.735] /Subtype /Link /A << /S /GoTo /D (page.125) >> >> endobj 4309 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [423.1384 571.3782 440.0749 583.3334] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4310 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [388.2968 559.423 400.252 571.3782] /Subtype /Link /A << /S /GoTo /D (page.88) >> >> endobj 4311 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [404.3478 559.423 416.303 571.3782] /Subtype /Link /A << /S /GoTo /D (page.90) >> >> endobj 4312 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [420.3987 559.423 437.3353 571.3782] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4313 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 548.0213 372.9909 558.8695] /Subtype /Link /A << /S /GoTo /D (page.121) >> >> endobj 4314 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [371.7454 536.0662 388.682 546.9144] /Subtype /Link /A << /S /GoTo /D (page.121) >> >> endobj 4315 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [403.6816 523.5575 420.6181 535.5127] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4316 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [387.9905 511.6023 404.9271 523.5575] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4317 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [398.7575 499.6472 415.694 511.6023] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4318 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 488.2455 381.9871 499.0937] /Subtype /Link /A << /S /GoTo /D (page.125) >> >> endobj 4319 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [374.9286 476.2903 386.8838 487.1385] /Subtype /Link /A << /S /GoTo /D (page.11) >> >> endobj 4320 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [390.9795 476.2903 402.9347 487.1385] /Subtype /Link /A << /S /GoTo /D (page.20) >> >> endobj 4321 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [407.0305 476.2903 418.9857 487.1385] /Subtype /Link /A << /S /GoTo /D (page.26) >> >> endobj 4322 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.2469 463.7817 398.2021 475.7368] /Subtype /Link /A << /S /GoTo /D (page.71) >> >> endobj 4323 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [395.9882 451.8265 407.9434 463.7817] /Subtype /Link /A << /S /GoTo /D (page.73) >> >> endobj 4324 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [385.5275 439.8713 397.4827 451.8265] /Subtype /Link /A << /S /GoTo /D (page.73) >> >> endobj 4325 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [454.5204 427.9162 471.457 439.8713] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4326 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [421.8354 415.961 433.7906 427.9162] /Subtype /Link /A << /S /GoTo /D (page.42) >> >> endobj 4327 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5937 394.5967 362.5303 405.4449] /Subtype /Link /A << /S /GoTo /D (page.118) >> >> endobj 4328 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [400.1985 382.3648 412.1537 393.4897] /Subtype /Link /A << /S /GoTo /D (page.55) >> >> endobj 4329 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [421.1198 370.4096 433.075 381.5345] /Subtype /Link /A << /S /GoTo /D (page.55) >> >> endobj 4330 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [437.1708 370.4096 449.126 381.5345] /Subtype /Link /A << /S /GoTo /D (page.99) >> >> endobj 4331 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [396.7076 358.1777 408.6628 370.1329] /Subtype /Link /A << /S /GoTo /D (page.16) >> >> endobj 4332 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [412.7585 358.1777 424.7137 370.1329] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 4333 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [428.8095 358.1777 440.7647 370.1329] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4334 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [420.6754 346.2225 432.6305 358.1777] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 4335 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [425.9057 334.2674 442.8422 346.2225] /Subtype /Link /A << /S /GoTo /D (page.121) >> >> endobj 4336 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [415.445 322.3122 432.3815 334.2674] /Subtype /Link /A << /S /GoTo /D (page.121) >> >> endobj 4337 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 310.9105 381.9871 321.7587] /Subtype /Link /A << /S /GoTo /D (page.119) >> >> endobj 4338 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 298.9553 381.9871 309.8035] /Subtype /Link /A << /S /GoTo /D (page.119) >> >> endobj 4339 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 287.0002 381.9871 297.8484] /Subtype /Link /A << /S /GoTo /D (page.119) >> >> endobj 4340 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.7862 274.4915 387.7414 286.4467] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 4341 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [335.1331 263.0898 347.0883 273.938] /Subtype /Link /A << /S /GoTo /D (page.88) >> >> endobj 4342 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [335.1331 251.1347 347.0883 261.9829] /Subtype /Link /A << /S /GoTo /D (page.88) >> >> endobj 4343 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [400.2775 238.626 412.2327 250.5812] /Subtype /Link /A << /S /GoTo /D (page.29) >> >> endobj 4344 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [416.3284 238.626 428.2836 250.5812] /Subtype /Link /A << /S /GoTo /D (page.32) >> >> endobj 4345 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [401.1396 226.6708 418.0762 238.626] /Subtype /Link /A << /S /GoTo /D (page.168) >> >> endobj 4346 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.2913 214.7157 444.2279 226.6708] /Subtype /Link /A << /S /GoTo /D (page.168) >> >> endobj 4347 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [374.1258 202.7605 386.081 214.7157] /Subtype /Link /A << /S /GoTo /D (page.30) >> >> endobj 4348 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.7862 190.8053 387.7414 202.7605] /Subtype /Link /A << /S /GoTo /D (page.71) >> >> endobj 4349 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [391.8372 190.8053 403.7924 202.7605] /Subtype /Link /A << /S /GoTo /D (page.82) >> >> endobj 4350 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [407.8881 190.8053 424.8247 202.7605] /Subtype /Link /A << /S /GoTo /D (page.183) >> >> endobj 4351 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [428.9204 190.8053 445.857 202.7605] /Subtype /Link /A << /S /GoTo /D (page.184) >> >> endobj 4352 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 179.4037 368.0096 190.2519] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 4353 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [389.8168 166.895 401.772 178.8502] /Subtype /Link /A << /S /GoTo /D (page.30) >> >> endobj 4354 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [405.8677 166.895 417.8229 178.8502] /Subtype /Link /A << /S /GoTo /D (page.32) >> >> endobj 4355 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [405.5078 154.9398 417.463 166.895] /Subtype /Link /A << /S /GoTo /D (page.30) >> >> endobj 4356 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [400.2775 142.9847 412.2327 154.9398] /Subtype /Link /A << /S /GoTo /D (page.29) >> >> endobj 4357 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [340.3634 131.583 357.2999 142.4312] /Subtype /Link /A << /S /GoTo /D (page.124) >> >> endobj 4358 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 119.6278 368.0096 130.476] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 4359 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [380.7416 107.6726 397.6781 118.5208] /Subtype /Link /A << /S /GoTo /D (page.117) >> >> endobj 4360 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [385.9719 95.7175 402.9085 106.5657] /Subtype /Link /A << /S /GoTo /D (page.117) >> >> endobj 4361 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [385.9719 83.7623 402.9085 94.6105] /Subtype /Link /A << /S /GoTo /D (page.117) >> >> endobj 4362 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [407.1683 71.2537 419.1235 83.2088] /Subtype /Link /A << /S /GoTo /D (page.16) >> >> endobj 4363 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [423.2192 71.2537 435.1744 83.2088] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 4364 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [439.2702 71.2537 451.2254 83.2088] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4365 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.9758 59.852 388.931 70.7002] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 4366 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [393.0267 59.852 404.9819 70.7002] /Subtype /Link /A << /S /GoTo /D (page.99) >> >> endobj 4367 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.9758 47.8968 388.931 58.745] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 4368 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5937 25.979 362.5303 36.8272] /Subtype /Link /A << /S /GoTo /D (page.113) >> >> endobj 4222 0 obj << /D [4220 0 R /XYZ 64.9134 727.2935 null] >> endobj 4219 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 4371 0 obj << /Length 3456 /Filter /FlateDecode >> stream xÚÍ]Ksã6¾ûWèhWE¼×T’ªÍak·v[•ä ØÌŒj,Ë¡èÙ͟ߦ$€M A»ó8 mµ?|Ýýh¼4_¿¿y÷_¬´«÷¿¬¬fA(½rŠ3ï¹X½øáöoÿæÛßýôþû•Vž™ÔŠ?Bõ¿¾ùöý€_ñ•¤e:X³ºßÝüzóÃO|õpÃWßßpæ‚[ýž9SÁ›ÕîFÅŒV*þæñæ_7ÿL€ëˆ¸Æ_÷Ä¥Ì0·A2-µ:Ü?¿;2; 8ÂwvâGnøÃ¸Ý¶ÍýÝZÜv[øáóô·Mÿ#|,¾º[+¥nµ>aÚ]G´µ,#K s¤Ðç†êùApžÅ?ÿÑ~ó”kA ¦¼7ರgË3ªPuªu þüàcœ¼<>è[aÜ|ÓƒC—Zòo+!¥Z3Ë•½ÖÒQ/'1‰$ˆI1q¤zúùBJp¯¥ä|ÈíÐnOpûôüÒ]2Â2åB £˜g8 ˜^ŒInºýŒ['9FÄ9Žð©äF9º¶ÙìÞÉk™¬×ÒuæUNBB `¨í)ɬöšPD± ¢hU!"*ŠHDEŽƒˆ0Éû›öp­"Ëdp„qLˆs$u`Z7&I¤"ˆ (õ"‚ÎØªèD„ "ŠV"¢¢ˆDTä8ˆ“¼ß?4‘‘DT&™D„IþI"âž9£B,ˆ(Z ¾t9A·j—tâ I!5s G,óãYÇADeŽID˜ãYD¢VDšDD&Xæ¼ t"ˆÓ"JV""ã8ˆ¨L2‰hÄ2?žÁŒtždDœ#i ²‘¤Ö&@½U¯"¯™ï9Ó©!T­jTDÅ©¨HrPf™Ð’ŠÈH**“Œ*ÂO]ùî,ãæ½ÆIæanþf×#à#^{î€@Y’¬zzMÛîÛ©‰«@3ý¹00¿ß|@óz˜HÄ k¹h²õ¶:"¦ìÂiˆ ÄBD¢UOïsÓ¶û§¬ãN‰±„É.XCc¸t=½±á¶ð‚IÂý ±n÷ÏwkéNË)mׯ¬|¹-¬¸laÑÖðÞ‚['‰?oÚn»y¼z¹dÂ(èÑ$8§5Áô$"®1dæEä"$ìÐrOóq{èr¡ 2®eEçs0i¯Ð<7ͧÉÎ\Æ} œœ`ÄBg­z‚?éšiÇÇ~‡¬â ˆÞ†‹å¡¢ß¼÷FÖÓ±àw´J~Ë?Ôoƒ×‚°ĈÓ~'«X\ÕæÛ» ¿çu®¡¿“R-±àw´J~KB¿+òm“Ö.ƒbÄ‚ßÑ*–A¤ù®ðÛ¦ú¥}:¿bÁïh•ü–¿ƒÎÛÝöÐÔ×ÐÆ1£”[<š í³íŸá.âÞî^ºM×W ï ó!è‹ !e¶R8ÛŽñ?¶›CS½Â"„ÈÖ_gÛqèNЊúÌzr{eTà\î„@¹P¬cÆM´]»ùR]ž[Þ%Š4Ñ©‘ÉbIAa¥S„ņ,KÉìøn=n^Mõ´%_£{ 3Ù(OÀÀ»î¤  ‚, š¡È꤉‹_Šæ!ÓÑH¦¸Âeû¾ïiúNu+Áf{•óß^èî°í²}ÚXÛ fºBôÑÑC÷Ëö¿Ó9—Šyn-eÎd)çÑì´,s(¤mX!”mó°½ßtÍõ‚„n ªYæÞŠ]¨3âCæ6 sFª¡åQè„ÛîKî­ 6vÃ&»šÑéZª«(€Dê‡%©ê‡¥#ôetƒeA‚R¥‡QR‹·w8psÚã ¡††ÿ íqæ•¿ì‚ÚíS~VœVÓˆ|ý¨zlA.m¢”žLz²ÍŠ¡Ù«”Ã@ÔÊy{×ñ:åACè¡÷OV=ÃnÝ´BÆ/!Î<0nœ3ì·z¦ ìËÅ*ž}ÙaFZ‘ÑÄdr4ø"¹&LB,$'ZÍ%‡ŠJN‘àÌð¸…Rý^M¼:žC7oõ’ìHÏ„Kºì ÄBv¢Õ\v¨ø¡ì ÙÁ [ÄÙIÛ¾Ýv_j ¹lÍèê˶vûù\–”Fäú‘éTLÌðþÑ‚ñþqÿ¡‘·iWþVz Sèóƒ²çmÎ&œl´ñþüøoAÆçÓ§}¸UOñ«# Àávd!†z^¥§4©4JY“¶)|ü]~2tÑNŒðÑá‰ÊDXmÐt• F,T&Éì$åç/íöÃÇ®f–’ßËÉ–jPýh#Ô¢€@ý¬•–„Aˆ¥€D³žãCö¸>Áº Ù-™XhÍ´ „e+F,Å"šõÙ>VÅbIÿ@%¡ìP08±œh†ƒ“ÝC'£8ì¡ÏpŒ{è#ŽO›]õ"*ê÷tv½Æt)œX”)É™±Þf !–2ÍN{ƒOIs©%8<!–‚Í¢DþüþþµÆŽ…°‰hu$¸}ÈM•Ç‘H ÏT"ððÚrE8æ!À‚ãÑ \¨)ˆÀ¡pU½üü¸½§;ÇóKǦç—ÿÜNI,D}ÑýòtßÍôÇ=ƒnÿéØä¨¶×µw;ž_ºz)óPqÉ&ÆðjæèAòªŸ6ƒüàœáÖ/³_¨™õ¦FƒÈåKÅ”íO¹Z×ßz S+i Zôj¸øôV§âC^û­`jœ5ã+W僢Âõ‰ÅÃ’ë0yÕ– P;æH°þŠþEzø{¥(ëg YPQ2›Wɤ¢’QE#’EÑqL*šáU4âH²RßßU Ç¡²^Gý2ó”3†,é(šU舌䠣2ɤ#L²¬#2ŽƒŽÊ“Ž0G’]…K¥QíqZGÖ2.eÑŒ!K:ŠfS÷ R‰KÇ1Í3cÑ<âX{ˆ¼öûT\õeÓrfÜzÊŠC–2ÍŽ=Áv·`…2,Xúðò¸iënð½ùdMþäS³Û¾–'Ø ÔJBÜ„!ø–Æ„¸Æ¹ulͤufhyøšÆë…l ½’“„,#âK Ÿ3zÌr·í¿S±zƒÄÆ+‰žç;<ÙS½:…_Õ|¾„g’|µ$Ê‚,å+š¥%ýê«ézÉ>Ù¾}hªÞ˜W;œxCž›M—;½7ñ­Iªþl`3ý½/×ße•sĉG—4ö–¯¡¼h>†ñÐÔ\œÈ{™þÃŒú#}]»¹ïj÷ò­œ¾’Þ<>æ°­dÎjQM/¢Ô½´O¯>ÇëÓmèü7ÕæÏÕ6ý¢fz¿_T}›Yº.ƒO šM{ÿ±î¾Ð›¸¬w‡¦Yp•ÆU‰ÜíÓ‡úÓÈÜWw ý©ö?•qÕ‡\õ)׋å×|íAÖCóØÀ{V}tú$ž~ðú?êOÊ?endstream endobj 4370 0 obj << /Type /Page /Contents 4371 0 R /Resources 4369 0 R /MediaBox [0 0 612 792] /Parent 3928 0 R /Annots [ 4373 0 R 4374 0 R 4375 0 R 4376 0 R 4377 0 R 4378 0 R 4379 0 R 4380 0 R 4381 0 R 4382 0 R 4383 0 R 4384 0 R 4385 0 R 4386 0 R 4387 0 R 4388 0 R 4389 0 R 4390 0 R 4391 0 R 4392 0 R 4393 0 R 4394 0 R 4395 0 R 4396 0 R 4397 0 R 4398 0 R 4399 0 R 4400 0 R 4401 0 R 4402 0 R 4403 0 R 4404 0 R 4405 0 R 4406 0 R 4407 0 R 4408 0 R 4409 0 R 4410 0 R 4411 0 R 4412 0 R 4413 0 R 4414 0 R 4415 0 R 4416 0 R 4417 0 R 4418 0 R 4419 0 R 4420 0 R 4421 0 R 4422 0 R 4423 0 R 4424 0 R 4425 0 R 4426 0 R 4427 0 R 4428 0 R 4429 0 R 4430 0 R 4431 0 R 4432 0 R 4433 0 R 4434 0 R 4435 0 R 4436 0 R 4437 0 R 4438 0 R 4439 0 R 4440 0 R 4441 0 R 4442 0 R 4443 0 R 4444 0 R 4445 0 R 4446 0 R 4447 0 R 4448 0 R 4449 0 R 4450 0 R 4451 0 R 4452 0 R 4453 0 R 4454 0 R 4455 0 R 4456 0 R 4457 0 R 4458 0 R 4459 0 R 4460 0 R 4461 0 R 4462 0 R 4463 0 R 4464 0 R 4465 0 R 4466 0 R 4467 0 R 4468 0 R 4469 0 R 4470 0 R 4471 0 R 4472 0 R 4473 0 R 4474 0 R 4475 0 R 4476 0 R 4477 0 R 4478 0 R 4479 0 R 4480 0 R 4481 0 R 4482 0 R 4483 0 R 4484 0 R 4485 0 R 4486 0 R 4487 0 R 4488 0 R 4489 0 R 4490 0 R 4491 0 R 4492 0 R 4493 0 R 4494 0 R 4495 0 R 4496 0 R 4497 0 R 4498 0 R 4499 0 R 4500 0 R 4501 0 R 4502 0 R 4503 0 R 4504 0 R 4505 0 R 4506 0 R 4507 0 R 4508 0 R 4509 0 R 4510 0 R 4511 0 R 4512 0 R 4513 0 R 4514 0 R 4515 0 R 4516 0 R 4517 0 R 4518 0 R 4519 0 R 4520 0 R 4521 0 R 4522 0 R 4523 0 R 4524 0 R 4525 0 R 4526 0 R 4527 0 R 4528 0 R 4529 0 R 4530 0 R 4531 0 R 4532 0 R 4533 0 R 4534 0 R 4535 0 R 4536 0 R 4537 0 R 4538 0 R 4539 0 R ] >> endobj 4373 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [141.0168 688.9373 152.972 700.8925] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 4374 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [90.9268 677.2589 102.882 688.3839] /Subtype /Link /A << /S /GoTo /D (page.44) >> >> endobj 4375 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.9777 677.2589 123.9143 688.3839] /Subtype /Link /A << /S /GoTo /D (page.100) >> >> endobj 4376 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 665.3037 113.3427 676.4287] /Subtype /Link /A << /S /GoTo /D (page.70) >> >> endobj 4377 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 653.3486 113.3427 664.4735] /Subtype /Link /A << /S /GoTo /D (page.67) >> >> endobj 4378 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.4384 653.3486 129.3936 664.4735] /Subtype /Link /A << /S /GoTo /D (page.70) >> >> endobj 4379 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.4894 653.3486 145.4446 664.4735] /Subtype /Link /A << /S /GoTo /D (page.81) >> >> endobj 4380 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [149.5403 653.3486 161.4955 664.4735] /Subtype /Link /A << /S /GoTo /D (page.82) >> >> endobj 4381 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [165.5913 653.3486 182.5278 664.4735] /Subtype /Link /A << /S /GoTo /D (page.157) >> >> endobj 4382 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [191.1401 641.3934 203.0953 652.5184] /Subtype /Link /A << /S /GoTo /D (page.83) >> >> endobj 4383 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [196.3704 629.4382 208.3256 640.5632] /Subtype /Link /A << /S /GoTo /D (page.83) >> >> endobj 4384 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [196.3704 617.4831 208.3256 628.608] /Subtype /Link /A << /S /GoTo /D (page.83) >> >> endobj 4385 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [196.3704 605.5279 208.3256 616.6529] /Subtype /Link /A << /S /GoTo /D (page.84) >> >> endobj 4386 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [201.6007 593.5727 213.5559 604.6977] /Subtype /Link /A << /S /GoTo /D (page.84) >> >> endobj 4387 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [201.6007 581.6176 213.5559 592.7425] /Subtype /Link /A << /S /GoTo /D (page.84) >> >> endobj 4388 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [138.8602 569.3857 155.7967 581.3408] /Subtype /Link /A << /S /GoTo /D (page.134) >> >> endobj 4389 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [159.8925 569.3857 176.829 581.3408] /Subtype /Link /A << /S /GoTo /D (page.199) >> >> endobj 4390 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [131.305 557.984 148.2415 568.8322] /Subtype /Link /A << /S /GoTo /D (page.150) >> >> endobj 4391 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [151.7819 545.4753 163.7371 557.4305] /Subtype /Link /A << /S /GoTo /D (page.73) >> >> endobj 4392 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [141.7657 523.8343 153.7209 534.9592] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 4393 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [126.0747 511.8791 138.0299 523.004] /Subtype /Link /A << /S /GoTo /D (page.90) >> >> endobj 4394 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [126.0747 499.9239 138.0299 511.0489] /Subtype /Link /A << /S /GoTo /D (page.90) >> >> endobj 4395 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [126.0747 487.9687 138.0299 499.0937] /Subtype /Link /A << /S /GoTo /D (page.87) >> >> endobj 4396 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [126.0747 476.0136 138.0299 487.1385] /Subtype /Link /A << /S /GoTo /D (page.87) >> >> endobj 4397 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [126.0747 464.0584 138.0299 475.1834] /Subtype /Link /A << /S /GoTo /D (page.87) >> >> endobj 4398 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [126.0747 452.1032 138.0299 463.2282] /Subtype /Link /A << /S /GoTo /D (page.87) >> >> endobj 4399 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [172.7033 439.8713 189.6398 451.8265] /Subtype /Link /A << /S /GoTo /D (page.148) >> >> endobj 4400 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [137.9998 428.1929 154.9364 439.3179] /Subtype /Link /A << /S /GoTo /D (page.122) >> >> endobj 4401 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 416.2377 128.7847 427.3627] /Subtype /Link /A << /S /GoTo /D (page.111) >> >> endobj 4402 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 404.2826 128.7847 415.4075] /Subtype /Link /A << /S /GoTo /D (page.111) >> >> endobj 4403 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 392.3274 118.573 403.4524] /Subtype /Link /A << /S /GoTo /D (page.67) >> >> endobj 4404 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [122.6688 392.3274 139.6053 403.4524] /Subtype /Link /A << /S /GoTo /D (page.153) >> >> endobj 4405 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [117.0785 380.3722 129.0337 391.4972] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4406 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [133.1294 380.3722 150.066 391.4972] /Subtype /Link /A << /S /GoTo /D (page.100) >> >> endobj 4407 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [152.2264 368.4171 164.1816 379.542] /Subtype /Link /A << /S /GoTo /D (page.99) >> >> endobj 4408 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [152.2264 356.4619 164.1816 367.5869] /Subtype /Link /A << /S /GoTo /D (page.99) >> >> endobj 4409 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [168.2773 356.4619 185.2138 367.5869] /Subtype /Link /A << /S /GoTo /D (page.138) >> >> endobj 4410 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [157.7317 344.23 169.6869 356.1852] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4411 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.2426 332.2748 174.1978 344.23] /Subtype /Link /A << /S /GoTo /D (page.74) >> >> endobj 4412 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [171.2387 320.3197 188.1753 332.2748] /Subtype /Link /A << /S /GoTo /D (page.120) >> >> endobj 4413 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [173.1477 308.6412 185.1029 319.7662] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 4414 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 296.6861 128.7847 307.811] /Subtype /Link /A << /S /GoTo /D (page.123) >> >> endobj 4415 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [166.0084 284.4542 182.9449 296.4093] /Subtype /Link /A << /S /GoTo /D (page.120) >> >> endobj 4416 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 272.7757 118.573 283.9007] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4417 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [122.6688 272.7757 134.624 283.9007] /Subtype /Link /A << /S /GoTo /D (page.98) >> >> endobj 4418 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 260.8206 118.573 271.9455] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4419 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [122.6688 260.8206 139.6053 271.9455] /Subtype /Link /A << /S /GoTo /D (page.100) >> >> endobj 4420 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [143.7011 260.8206 160.6376 271.9455] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4421 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [164.7333 260.8206 181.6699 271.9455] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4422 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [145.5315 248.8654 162.468 259.9903] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4423 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [150.7619 236.9102 167.6984 248.0352] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4424 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [150.7619 224.955 167.6984 236.08] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4425 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [152.5013 212.7231 164.4565 224.6783] /Subtype /Link /A << /S /GoTo /D (page.97) >> >> endobj 4426 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [157.0122 200.768 168.9674 212.7231] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 4427 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [116.1141 189.3663 128.0693 200.2145] /Subtype /Link /A << /S /GoTo /D (page.14) >> >> endobj 4428 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [131.6746 189.3663 143.6298 200.2145] /Subtype /Link /A << /S /GoTo /D (page.36) >> >> endobj 4429 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [147.2352 189.3663 159.1904 200.2145] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 4430 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.7958 189.3663 174.751 200.2145] /Subtype /Link /A << /S /GoTo /D (page.59) >> >> endobj 4431 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [178.3564 189.3663 190.3116 200.2145] /Subtype /Link /A << /S /GoTo /D (page.64) >> >> endobj 4432 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [193.917 189.3663 205.8722 200.2145] /Subtype /Link /A << /S /GoTo /D (page.88) >> >> endobj 4433 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [209.4776 189.3663 221.4328 200.2145] /Subtype /Link /A << /S /GoTo /D (page.90) >> >> endobj 4434 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [224.4216 189.3663 236.3768 200.2145] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4435 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [239.9822 189.3663 251.9374 200.2145] /Subtype /Link /A << /S /GoTo /D (page.94) >> >> endobj 4436 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [255.5428 189.3663 272.4793 200.2145] /Subtype /Link /A << /S /GoTo /D (page.103) >> >> endobj 4437 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [103.7677 177.4111 120.7042 187.7612] /Subtype /Link /A << /S /GoTo /D (page.119) >> >> endobj 4438 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [124.8 177.4111 141.7365 187.7612] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4439 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [145.8323 177.4111 162.7688 187.7612] /Subtype /Link /A << /S /GoTo /D (page.135) >> >> endobj 4440 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [166.8646 177.4111 183.8011 187.7612] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 4441 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [187.8969 177.4111 204.8334 187.7612] /Subtype /Link /A << /S /GoTo /D (page.165) >> >> endobj 4442 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [208.9291 177.4111 225.8657 187.7612] /Subtype /Link /A << /S /GoTo /D (page.198) >> >> endobj 4443 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [229.9614 177.4111 246.898 187.7612] /Subtype /Link /A << /S /GoTo /D (page.199) >> >> endobj 4444 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [180.7029 164.9025 197.6395 176.8576] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4445 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [154.5512 152.9473 171.4878 164.9025] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4446 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [176.4691 140.9921 188.4243 152.9473] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 4447 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [161.2225 129.3137 178.1591 140.4387] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 4448 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [182.2548 129.3137 199.1914 140.4387] /Subtype /Link /A << /S /GoTo /D (page.142) >> >> endobj 4449 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [176.4691 117.0818 188.4243 129.037] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 4450 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [154.5512 105.1266 171.4878 117.0818] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4451 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [131.305 93.4482 148.2415 104.5732] /Subtype /Link /A << /S /GoTo /D (page.155) >> >> endobj 4452 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [170.2423 81.2163 187.1788 93.1715] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4453 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [151.7819 69.2611 163.7371 81.2163] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 4454 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [161.9381 57.306 173.8933 69.2611] /Subtype /Link /A << /S /GoTo /D (page.41) >> >> endobj 4455 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [177.9891 57.306 189.9443 69.2611] /Subtype /Link /A << /S /GoTo /D (page.61) >> >> endobj 4456 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [132.9359 45.3508 144.8911 57.306] /Subtype /Link /A << /S /GoTo /D (page.94) >> >> endobj 4457 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [96.1571 33.6724 113.0937 44.7973] /Subtype /Link /A << /S /GoTo /D (page.109) >> >> endobj 4458 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [120.8443 21.7172 132.7995 32.8421] /Subtype /Link /A << /S /GoTo /D (page.91) >> >> endobj 4459 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 689.2141 377.0058 700.339] /Subtype /Link /A << /S /GoTo /D (page.91) >> >> endobj 4460 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 677.2589 377.0058 688.3839] /Subtype /Link /A << /S /GoTo /D (page.88) >> >> endobj 4461 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 665.3037 377.0058 676.4287] /Subtype /Link /A << /S /GoTo /D (page.88) >> >> endobj 4462 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 653.3486 377.0058 664.4735] /Subtype /Link /A << /S /GoTo /D (page.88) >> >> endobj 4463 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 641.3934 377.0058 652.5184] /Subtype /Link /A << /S /GoTo /D (page.88) >> >> endobj 4464 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.2469 619.1989 398.2021 631.154] /Subtype /Link /A << /S /GoTo /D (page.16) >> >> endobj 4465 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [402.2979 619.1989 414.2531 631.154] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4466 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [403.6816 597.2811 420.6181 609.2362] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4467 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 585.8794 372.9909 596.7276] /Subtype /Link /A << /S /GoTo /D (page.140) >> >> endobj 4468 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 573.9242 372.9909 584.7724] /Subtype /Link /A << /S /GoTo /D (page.140) >> >> endobj 4469 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [371.7454 561.969 388.682 572.8172] /Subtype /Link /A << /S /GoTo /D (page.139) >> >> endobj 4470 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [371.6351 549.4604 383.5903 561.4156] /Subtype /Link /A << /S /GoTo /D (page.70) >> >> endobj 4471 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [394.4662 537.5052 411.4027 549.4604] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 4472 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5937 526.1035 357.5489 536.9517] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4473 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.6447 526.1035 373.5999 536.9517] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4474 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5937 514.1484 357.5489 524.9966] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4475 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.6447 514.1484 373.5999 524.9966] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4476 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [377.6956 514.1484 394.6322 524.9966] /Subtype /Link /A << /S /GoTo /D (page.104) >> >> endobj 4477 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [398.7279 514.1484 415.6645 524.9966] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4478 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.2809 502.1932 382.2361 513.0414] /Subtype /Link /A << /S /GoTo /D (page.93) >> >> endobj 4479 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.3319 502.1932 398.2871 513.0414] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4480 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.2809 490.238 382.2361 501.0862] /Subtype /Link /A << /S /GoTo /D (page.93) >> >> endobj 4481 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.3319 490.238 398.2871 501.0862] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4482 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [402.3828 490.238 419.3194 501.0862] /Subtype /Link /A << /S /GoTo /D (page.103) >> >> endobj 4483 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [394.9681 478.2829 411.9047 489.1311] /Subtype /Link /A << /S /GoTo /D (page.104) >> >> endobj 4484 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [400.1985 466.3277 417.135 477.1759] /Subtype /Link /A << /S /GoTo /D (page.104) >> >> endobj 4485 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [400.1985 454.3725 417.135 465.2207] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4486 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [385.9719 442.1406 397.9271 453.2656] /Subtype /Link /A << /S /GoTo /D (page.93) >> >> endobj 4487 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [402.0229 442.1406 413.9781 453.2656] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4488 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [385.9719 430.1854 397.9271 441.3104] /Subtype /Link /A << /S /GoTo /D (page.93) >> >> endobj 4489 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [402.0229 430.1854 413.9781 441.3104] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4490 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [418.0739 430.1854 435.0104 441.3104] /Subtype /Link /A << /S /GoTo /D (page.103) >> >> endobj 4491 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [380.7416 418.507 392.6968 429.3552] /Subtype /Link /A << /S /GoTo /D (page.93) >> >> endobj 4492 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [396.7926 418.507 408.7478 429.3552] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4493 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [380.7416 406.5518 392.6968 417.4001] /Subtype /Link /A << /S /GoTo /D (page.93) >> >> endobj 4494 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [396.7926 406.5518 408.7478 417.4001] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4495 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [412.8435 406.5518 429.78 417.4001] /Subtype /Link /A << /S /GoTo /D (page.103) >> >> endobj 4496 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [414.425 394.3199 431.3615 405.4449] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 4497 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.2809 382.6415 382.2361 393.4897] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4498 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.3319 382.6415 398.2871 393.4897] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4499 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.2809 370.6863 382.2361 381.5345] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4500 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.3319 370.6863 398.2871 381.5345] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4501 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [402.3828 370.6863 419.3194 381.5345] /Subtype /Link /A << /S /GoTo /D (page.103) >> >> endobj 4502 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [422.3082 370.6863 439.2447 381.5345] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4503 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [419.6553 358.7312 431.6105 369.5794] /Subtype /Link /A << /S /GoTo /D (page.14) >> >> endobj 4504 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [435.7063 358.7312 447.6615 369.5794] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4505 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [451.7572 358.7312 468.6938 369.5794] /Subtype /Link /A << /S /GoTo /D (page.104) >> >> endobj 4506 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [424.8857 346.776 441.8222 357.6242] /Subtype /Link /A << /S /GoTo /D (page.104) >> >> endobj 4507 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [424.8857 334.8208 441.8222 345.669] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4508 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.5113 322.8657 387.4665 333.7139] /Subtype /Link /A << /S /GoTo /D (page.94) >> >> endobj 4509 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [391.5622 322.8657 403.5174 333.7139] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4510 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.5113 310.9105 387.4665 321.7587] /Subtype /Link /A << /S /GoTo /D (page.94) >> >> endobj 4511 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [391.5622 310.9105 403.5174 321.7587] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4512 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [407.6132 310.9105 424.5497 321.7587] /Subtype /Link /A << /S /GoTo /D (page.103) >> >> endobj 4513 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [427.5385 310.9105 444.475 321.7587] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4514 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [424.8857 298.9553 441.8222 309.8035] /Subtype /Link /A << /S /GoTo /D (page.104) >> >> endobj 4515 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [430.116 287.0002 447.0525 297.8484] /Subtype /Link /A << /S /GoTo /D (page.104) >> >> endobj 4516 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [430.116 275.045 447.0525 285.8932] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4517 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [434.9019 262.5363 451.8384 274.4915] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 4518 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.2809 251.1347 387.2175 261.9829] /Subtype /Link /A << /S /GoTo /D (page.139) >> >> endobj 4519 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [410.1572 238.626 427.0937 250.5812] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 4520 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [426.3502 227.2243 438.3054 238.0725] /Subtype /Link /A << /S /GoTo /D (page.68) >> >> endobj 4521 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [442.4011 227.2243 454.3563 238.0725] /Subtype /Link /A << /S /GoTo /D (page.80) >> >> endobj 4522 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [380.7416 215.2692 397.6781 226.1174] /Subtype /Link /A << /S /GoTo /D (page.145) >> >> endobj 4523 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [408.9119 202.7605 425.8484 214.7157] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4524 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 191.0821 372.9909 202.207] /Subtype /Link /A << /S /GoTo /D (page.113) >> >> endobj 4525 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [407.1683 178.8502 419.1235 190.8053] /Subtype /Link /A << /S /GoTo /D (page.71) >> >> endobj 4526 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [416.9095 166.895 428.8647 178.8502] /Subtype /Link /A << /S /GoTo /D (page.73) >> >> endobj 4527 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [381.0166 154.9398 392.9718 166.895] /Subtype /Link /A << /S /GoTo /D (page.71) >> >> endobj 4528 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [397.0675 154.9398 409.0227 166.895] /Subtype /Link /A << /S /GoTo /D (page.81) >> >> endobj 4529 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2848 143.5381 373.24 154.3864] /Subtype /Link /A << /S /GoTo /D (page.62) >> >> endobj 4530 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.9758 131.583 388.931 142.4312] /Subtype /Link /A << /S /GoTo /D (page.62) >> >> endobj 4531 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.2469 119.0743 403.1834 131.0295] /Subtype /Link /A << /S /GoTo /D (page.183) >> >> endobj 4532 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [407.2792 119.0743 424.2157 131.0295] /Subtype /Link /A << /S /GoTo /D (page.184) >> >> endobj 4533 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2848 107.6726 378.2213 118.5208] /Subtype /Link /A << /S /GoTo /D (page.122) >> >> endobj 4534 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [404.9269 85.2014 421.8634 97.1565] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 4535 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [340.3634 73.7997 357.2999 84.6479] /Subtype /Link /A << /S /GoTo /D (page.107) >> >> endobj 4536 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 61.5678 372.9909 72.6927] /Subtype /Link /A << /S /GoTo /D (page.108) >> >> endobj 4537 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5937 49.8893 357.5489 60.7375] /Subtype /Link /A << /S /GoTo /D (page.75) >> >> endobj 4538 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5937 37.9342 362.5303 48.7824] /Subtype /Link /A << /S /GoTo /D (page.108) >> >> endobj 4539 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 25.979 372.9909 36.8272] /Subtype /Link /A << /S /GoTo /D (page.122) >> >> endobj 4372 0 obj << /D [4370 0 R /XYZ 64.9134 727.2935 null] >> endobj 4369 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 4542 0 obj << /Length 3798 /Filter /FlateDecode >> stream xÚ½]K“Û6¾Ï¯ÐÑSµ‚ñ~\SIª6‡­ÚZ¶*ÉA–8c•5’–¢bÏîŸß&%€ ‚§í›l#¾î¯ 4üôááý¯váˆÓ\/><-´$Ž ¹0‚k)[|ØüþŽ3ùøç‡ß’S¢ã Úýõßÿñó/ÿnÿáá— þ’.XÀ5‘N«Åúåá?¿ÿI›ºøíãÌâ ü¦D8«/R ¢¤þovÿzøg\zÄe ùSKœósí8‘\ŠŽâ©ÚUëæ½jY •ŒXÉÍÕ”¿=.…ï´½þ`J‡_ÎÿÒì3èvé–Œ§¿ö»ßÜzÆ{Í ¥ðñ±g:ë/®aÎqp LXîÿ|㸌ǎ±ŽhJußoGpû¼_íÞóBÇ€?R¶kMwîÖöfd:#\ð…Ö–(&ÜÛ-¿à-cÀ„á’CEßmËîãöxËŽQkk¿€8ÃQA,7lHq¿z©RÊFº.ca„ñ 幤V†îTˆS6§•m•µxZE€­|«–Ýv<7ïYÂÆ!ˆüôÇ«]Ê~¦Ú‰âX•>¡ñì3öûV-»Ýv_m¶#†Œ30Ÿ"r ˆ3,ÁçÄH€Ð<Ö‡—cR§ôX¢yJFƒ1¶X Á‰–Vâ fò­Zv‡s3¡ùéÅÐäh DœÓÅhgcÓ&š"ÀŒ|««ô»Ãó(@™†¶0/ Q ˆ3$s0ŽZ6dù´[='ÔÁ0òUtóÈÞmëjý¸dïš-üá¯GnßUíáŸÙU>©Rò9p#3¬X>j‰–áÉfäó­JäâÉ—%Ù˳œ”¯›Ùð“a"¥’UÄY]<Ê(§‰±/e‰§U ­.ìªMrLäC$'?Èæ…-NÔð€¼oò3VûV»¦®V/“±‰F±Í<É›–ÏOOU½Ý'T¢„°“€å!¹Iœ²É©‘ñÖU,ŸáÄÂj O¾0#ŸoU"ÅH¾,É^¾˜euxQ ¾!ð(zÄ9ŠÂgÔájÝlûâ…šeé‚QÊâäWi ‹iƒ—[Å€™ò­J‹b@Y’}Å,Û}Ä”¡Ú0DŽqŽ#¤åœªO®»óËþ½( !“ƒ`‰À„,ÎN•´íŒ—Æ€™ò­JB‹bBY’}Å,‡ÓvêWœ*¦ºF¥R>v[œˆ*a¥/3JùV%JaQŒ”ʒ않Y6¯Çª8µ,?©O%¢«ú¹øSUòŽÉYb"‡=¤ÃSŠrz—&¹9å›)ªv»÷´˜)v'2CEf2ÿœ!ÉÜ«÷㯄CsÉí>ºàaûÒ#.cÈÔW¢ˆQ0Œ…f-Ñ/«z\ç­]nÿA™‚Eöê9Z\Ã$Óý’ð++ÈY¦'¼sšJÃã~ÇÇv}ØGý*¿p [ÿ.¹Oåц²oÿ[;暀ÂqÇm¿5ô¾ä沫P7íÃëã`ÉäˆáᆆÞ‹‡4‰{m:„ÝUÕñŽ/D—!/«Ý®:5‰ø€¡Ö¹ëן/ø)½˜I®t=ÈКÃúsÕ”lÅÒ@Ÿ/ívèÔþ8Ý0¦üëíÜqÞbËÇß`\<*8H8øA@¼jãÞ¾Šñ€Ë1u¤A!Ue¢ïø²ŠYWǦx^c:¹Aj€‚£zJÛ¤ù†(.%¢ùbÎ|ß,2_þxó… Fƒ5xæGˆ9ó}³Ë™Û~Sz Å”+?iÌÛ+ÛÎbx¶Gˆ9Û}³nñµ;œª;Òäwo8“Š»¬§ŽXe¢õbÎzßì²ôÜïÛx95Úß$‡ÑFX>,'¼M8îðwÖE0s£y$FÌx$4»lœšª|?羡 nŠS®æSÖÃrDØž--ÿ0&€Ósm‹ÌQ‘¯®8®Ö£íÇ tfÁ…%Œ„/î ¸ŒÇñå$±ð±õýv3Mý|*IDSUúÞÀåÜüV¼ãêËþŽe/¯C¨È^¼×ٯßv àGøqŽ—&‚ú¼8ʯÇÃv?>çØÀÄ5áÎÉqC¦m¦RÞw|§7—M¨„ç5‡ÙG2 Á „3Ú›¨oÝ㥰Ì@{õvçx¼e8vq€I†oÔyæÓjÿ<ÞâúLBr‹E0æ2& ·Æ(Ž­r§äœ2XR…9%¹¹Óš”FÝ|4ÓÒ@J&œvˆÚDˆq|«oȮ҆§G§ WÅ ¢ábÆpߪ3ü\×UbXñû›h$ûÓ<˰c: ¹©Nëz{luJ¤áÀ’‰1Þ´µÅ*IN¤MÝ?ýf•"ÄŒJ¾Uw¼Xׇz<ô+ât„F1 ÎpdšSeääS}ï¼ J4Õ‘£GœãØ.¥Ô7ŽüÚ. §IRÇìSa©Ð僰V‚IÄ(Š3Qä[µôžkE¤hü<à ?g‰rÚù¥£œ+74ãg82ÞÞ¥•bHr}8>¥œä)Ûä8”¿@sTè˜õd„ ˈ²3»‹!3šuGrÛ—jº¬Œ½Î>0ÎÚW›.{™Íêc wXÊvpÅF4SOŸ$Œ0¥kǶ}Nøé§(R»ÇC½ª_Ç›3šXNE·¡c©ÆØÞ¼".cÈÔæ üVV÷=û[ÌÓgæ7öËò²æ@sV$¦"Èœ|³»ïH§ß8™p@=Úz àÃ!Ö!\ˆË2a»è4w}Ï—»O)Ó“Ÿ«2i™ÿ¬¾6ßZÏkhví˜>Õ‡/ÅuÜÝ>C.C¿sÅ ¥fûü©ycenñ8uØmŠ·Î.ƒTº²·é\¾léìªË3Á»0Ìûöšqrÿ7\õÛrý{Øþij­BÇýN-R8¬˜F¸)Õ/RbÈÌ"%4ë)Õ_Õw‰üNerßÔ«u•êbüÈÔtÔ0â¸8+iêsU?R—–‰·/Ë}ûg^ðu³»º)Ûn7¯§Ò! qZsÞ?§.ó(b»ªUK$×ÇÈWÀeŒ˜Ê¡Âð¾ãצ*Í\æ%÷›ËíyË%$î†iDË#Äœå¾Y°œÿ`Ë…$Šaì„Ë#Äœå¾ÙµÌ¿.ÕÜZ$Ë9'ª} Ïò1g¹o,ç?ØrÖ3DË#Äœå¾ÙåfSýhÍ%Zaì"zÃ#ÀŒÝ¾U0û{¾}z2ÛÂÄï0v½Ù`Ælߪ;ßß6ŸÆÇ†Vòšãñó€3µ¸<<¬×çú4¢è1Bâ1¼âÍ„€±†‹Áõ§jý¹øn¢¢Åõ÷çýçýáËþ /†§owt…ðä…Ývÿ¹|7.E&wãΧªÆËïÒ×)’ËÆ‰Ž§yýžR¿¼ †ÿÝšd!©äþ[ø?-äÓendstream endobj 4541 0 obj << /Type /Page /Contents 4542 0 R /Resources 4540 0 R /MediaBox [0 0 612 792] /Parent 3928 0 R /Annots [ 4544 0 R 4545 0 R 4546 0 R 4547 0 R 4548 0 R 4549 0 R 4550 0 R 4551 0 R 4552 0 R 4553 0 R 4554 0 R 4555 0 R 4556 0 R 4557 0 R 4558 0 R 4559 0 R 4560 0 R 4561 0 R 4562 0 R 4563 0 R 4564 0 R 4565 0 R 4566 0 R 4567 0 R 4568 0 R 4569 0 R 4570 0 R 4571 0 R 4572 0 R 4573 0 R 4574 0 R 4575 0 R 4576 0 R 4577 0 R 4578 0 R 4579 0 R 4580 0 R 4581 0 R 4582 0 R 4583 0 R 4584 0 R 4585 0 R 4586 0 R 4587 0 R 4588 0 R 4589 0 R 4590 0 R 4591 0 R 4592 0 R 4593 0 R 4594 0 R 4595 0 R 4596 0 R 4597 0 R 4598 0 R 4599 0 R 4600 0 R 4601 0 R 4602 0 R 4603 0 R 4604 0 R 4605 0 R 4606 0 R 4607 0 R 4608 0 R 4609 0 R 4610 0 R 4611 0 R 4612 0 R 4613 0 R 4614 0 R 4615 0 R 4616 0 R 4617 0 R 4618 0 R 4619 0 R 4620 0 R 4621 0 R 4622 0 R 4623 0 R 4624 0 R 4625 0 R 4626 0 R 4627 0 R 4628 0 R 4629 0 R 4630 0 R 4631 0 R 4632 0 R 4633 0 R 4634 0 R 4635 0 R 4636 0 R 4637 0 R 4638 0 R 4639 0 R 4640 0 R 4641 0 R 4642 0 R 4643 0 R 4644 0 R 4645 0 R 4646 0 R 4647 0 R 4648 0 R 4649 0 R 4650 0 R 4651 0 R 4652 0 R 4653 0 R 4654 0 R 4655 0 R 4656 0 R 4657 0 R 4658 0 R 4659 0 R 4660 0 R 4661 0 R 4662 0 R 4663 0 R 4664 0 R 4665 0 R 4666 0 R 4667 0 R 4668 0 R 4669 0 R 4670 0 R 4671 0 R 4672 0 R 4673 0 R 4674 0 R 4675 0 R 4676 0 R 4677 0 R 4678 0 R 4679 0 R 4680 0 R 4681 0 R 4682 0 R 4683 0 R 4684 0 R 4685 0 R 4686 0 R 4687 0 R 4688 0 R 4689 0 R 4690 0 R 4691 0 R 4692 0 R 4693 0 R 4694 0 R 4695 0 R 4696 0 R 4697 0 R 4698 0 R 4699 0 R 4700 0 R 4701 0 R ] >> endobj 4544 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 689.4908 123.8033 700.339] /Subtype /Link /A << /S /GoTo /D (page.68) >> >> endobj 4545 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [127.8991 689.4908 144.8356 700.339] /Subtype /Link /A << /S /GoTo /D (page.156) >> >> endobj 4546 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [148.9314 689.4908 165.8679 700.339] /Subtype /Link /A << /S /GoTo /D (page.159) >> >> endobj 4547 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [169.9637 689.4908 186.9002 700.339] /Subtype /Link /A << /S /GoTo /D (page.161) >> >> endobj 4548 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.5353 677.2589 153.4719 688.3839] /Subtype /Link /A << /S /GoTo /D (page.156) >> >> endobj 4549 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [140.3012 665.3037 152.2564 676.4287] /Subtype /Link /A << /S /GoTo /D (page.37) >> >> endobj 4550 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [156.3521 665.3037 173.2887 676.4287] /Subtype /Link /A << /S /GoTo /D (page.135) >> >> endobj 4551 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [177.3844 665.3037 194.3209 676.4287] /Subtype /Link /A << /S /GoTo /D (page.196) >> >> endobj 4552 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [126.0747 653.3486 138.0299 664.4735] /Subtype /Link /A << /S /GoTo /D (page.68) >> >> endobj 4553 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [142.1256 653.3486 154.0808 664.4735] /Subtype /Link /A << /S /GoTo /D (page.69) >> >> endobj 4554 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [171.6832 641.3934 188.6197 652.5184] /Subtype /Link /A << /S /GoTo /D (page.162) >> >> endobj 4555 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [131.305 629.4382 143.2602 640.5632] /Subtype /Link /A << /S /GoTo /D (page.68) >> >> endobj 4556 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [147.356 629.4382 159.3112 640.5632] /Subtype /Link /A << /S /GoTo /D (page.70) >> >> endobj 4557 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [206.0822 617.2063 218.0374 629.1615] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 4558 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.9922 605.5279 167.9474 616.6529] /Subtype /Link /A << /S /GoTo /D (page.45) >> >> endobj 4559 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [172.0431 605.5279 188.9797 616.6529] /Subtype /Link /A << /S /GoTo /D (page.133) >> >> endobj 4560 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [120.8443 593.8495 137.7809 604.6977] /Subtype /Link /A << /S /GoTo /D (page.139) >> >> endobj 4561 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [182.1439 581.6176 194.0991 592.7425] /Subtype /Link /A << /S /GoTo /D (page.68) >> >> endobj 4562 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [198.1948 581.6176 210.15 592.7425] /Subtype /Link /A << /S /GoTo /D (page.82) >> >> endobj 4563 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [214.2458 581.6176 231.1823 592.7425] /Subtype /Link /A << /S /GoTo /D (page.157) >> >> endobj 4564 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [235.2781 581.6176 252.2146 592.7425] /Subtype /Link /A << /S /GoTo /D (page.158) >> >> endobj 4565 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [185.9097 569.9391 197.8649 580.7873] /Subtype /Link /A << /S /GoTo /D (page.81) >> >> endobj 4566 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [191.1401 557.984 203.0953 568.8322] /Subtype /Link /A << /S /GoTo /D (page.78) >> >> endobj 4567 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [176.9136 545.7521 188.8688 556.877] /Subtype /Link /A << /S /GoTo /D (page.68) >> >> endobj 4568 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [192.9645 545.7521 204.9197 556.877] /Subtype /Link /A << /S /GoTo /D (page.75) >> >> endobj 4569 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.9922 533.7969 167.9474 544.9218] /Subtype /Link /A << /S /GoTo /D (page.81) >> >> endobj 4570 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [172.0431 533.7969 188.9797 544.9218] /Subtype /Link /A << /S /GoTo /D (page.158) >> >> endobj 4571 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 521.8417 123.8033 532.9667] /Subtype /Link /A << /S /GoTo /D (page.54) >> >> endobj 4572 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 509.8866 123.8033 521.0115] /Subtype /Link /A << /S /GoTo /D (page.54) >> >> endobj 4573 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 498.2081 118.573 509.0563] /Subtype /Link /A << /S /GoTo /D (page.66) >> >> endobj 4574 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 486.253 123.5543 497.1012] /Subtype /Link /A << /S /GoTo /D (page.151) >> >> endobj 4575 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 474.2978 123.5543 485.146] /Subtype /Link /A << /S /GoTo /D (page.151) >> >> endobj 4576 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 462.3426 123.5543 473.1908] /Subtype /Link /A << /S /GoTo /D (page.151) >> >> endobj 4577 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [185.9333 449.834 202.8698 461.7891] /Subtype /Link /A << /S /GoTo /D (page.134) >> >> endobj 4578 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [206.9656 449.834 223.9021 461.7891] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 4579 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [162.962 437.8788 174.9172 449.834] /Subtype /Link /A << /S /GoTo /D (page.55) >> >> endobj 4580 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [179.013 437.8788 190.9681 449.834] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 4581 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [195.0639 437.8788 207.0191 449.834] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4582 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [141.3212 425.9236 158.2577 437.8788] /Subtype /Link /A << /S /GoTo /D (page.148) >> >> endobj 4583 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 414.2452 118.324 425.3702] /Subtype /Link /A << /S /GoTo /D (page.108) >> >> endobj 4584 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 402.29 123.5543 413.415] /Subtype /Link /A << /S /GoTo /D (page.156) >> >> endobj 4585 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [169.936 390.0581 186.8725 402.0133] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4586 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [160.7206 378.103 177.6571 390.0581] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 4587 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 366.7013 128.7847 377.5495] /Subtype /Link /A << /S /GoTo /D (page.158) >> >> endobj 4588 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [146.996 354.4694 163.9326 365.5943] /Subtype /Link /A << /S /GoTo /D (page.160) >> >> endobj 4589 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [146.996 342.5142 163.9326 353.6392] /Subtype /Link /A << /S /GoTo /D (page.160) >> >> endobj 4590 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.5353 330.8358 153.4719 341.684] /Subtype /Link /A << /S /GoTo /D (page.159) >> >> endobj 4591 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [141.7657 318.8806 158.7022 329.7288] /Subtype /Link /A << /S /GoTo /D (page.158) >> >> endobj 4592 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [152.2264 306.9254 164.1816 317.7737] /Subtype /Link /A << /S /GoTo /D (page.67) >> >> endobj 4593 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [168.2773 306.9254 185.2138 317.7737] /Subtype /Link /A << /S /GoTo /D (page.158) >> >> endobj 4594 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [189.3096 306.9254 206.2461 317.7737] /Subtype /Link /A << /S /GoTo /D (page.159) >> >> endobj 4595 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [146.996 294.9703 163.9326 305.8185] /Subtype /Link /A << /S /GoTo /D (page.160) >> >> endobj 4596 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 283.0151 118.324 293.8633] /Subtype /Link /A << /S /GoTo /D (page.125) >> >> endobj 4597 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 271.0599 118.324 281.9081] /Subtype /Link /A << /S /GoTo /D (page.125) >> >> endobj 4598 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 259.1048 123.5543 269.953] /Subtype /Link /A << /S /GoTo /D (page.125) >> >> endobj 4599 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 247.1496 123.5543 257.9978] /Subtype /Link /A << /S /GoTo /D (page.125) >> >> endobj 4600 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [161.4975 234.641 173.4527 246.5961] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4601 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 222.9625 123.5543 234.0875] /Subtype /Link /A << /S /GoTo /D (page.152) >> >> endobj 4602 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 211.0074 123.5543 222.1323] /Subtype /Link /A << /S /GoTo /D (page.152) >> >> endobj 4603 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [135.1498 198.7755 147.105 210.7306] /Subtype /Link /A << /S /GoTo /D (page.30) >> >> endobj 4604 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [151.2008 198.7755 163.156 210.7306] /Subtype /Link /A << /S /GoTo /D (page.32) >> >> endobj 4605 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [212.1404 186.8203 224.0956 198.7755] /Subtype /Link /A << /S /GoTo /D (page.30) >> >> endobj 4606 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [228.1914 186.8203 240.1466 198.7755] /Subtype /Link /A << /S /GoTo /D (page.32) >> >> endobj 4607 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [166.4529 175.1418 183.3894 186.2668] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4608 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [120.8443 163.4634 137.7809 174.3116] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4609 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [187.3742 151.2315 204.3108 162.3565] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4610 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [196.3704 139.2763 213.3069 150.4013] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4611 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [185.9097 127.3212 202.8463 138.4461] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4612 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [159.758 115.366 176.6946 126.491] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4613 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [175.449 103.4108 192.3856 114.5358] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4614 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [210.5969 91.4557 227.5335 102.5806] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4615 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [145.5315 79.5005 162.468 90.6255] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4616 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.9922 67.5453 172.9287 78.6703] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4617 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [180.6794 55.5902 197.6159 66.7151] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4618 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [145.5315 43.635 162.468 54.76] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4619 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [115.614 31.6798 132.5505 42.8048] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4620 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [140.3012 20.0014 157.2377 30.8496] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4621 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [430.116 689.4908 447.0525 700.339] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4622 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [394.9681 677.5357 411.9047 688.3839] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4623 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [394.9681 665.5805 411.9047 676.4287] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4624 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [394.9681 653.6253 411.9047 664.4735] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4625 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [405.4288 641.3934 422.3653 652.5184] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4626 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [405.4288 629.4382 422.3653 640.5632] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4627 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [405.4288 617.4831 422.3653 628.608] /Subtype /Link /A << /S /GoTo /D (page.164) >> >> endobj 4628 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [414.1422 605.2512 431.0788 617.2063] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4629 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [395.9882 593.296 407.9434 605.2512] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 4630 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.9758 581.8943 393.9123 592.7425] /Subtype /Link /A << /S /GoTo /D (page.138) >> >> endobj 4631 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [376.9758 569.9391 393.9123 580.7873] /Subtype /Link /A << /S /GoTo /D (page.138) >> >> endobj 4632 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5937 557.7072 362.5303 568.8322] /Subtype /Link /A << /S /GoTo /D (page.112) >> >> endobj 4633 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [415.8895 546.0288 427.8447 556.877] /Subtype /Link /A << /S /GoTo /D (page.77) >> >> endobj 4634 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [401.663 533.7969 413.6182 544.9218] /Subtype /Link /A << /S /GoTo /D (page.74) >> >> endobj 4635 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [417.7139 533.7969 429.6691 544.9218] /Subtype /Link /A << /S /GoTo /D (page.75) >> >> endobj 4636 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [401.663 521.8417 413.6182 532.9667] /Subtype /Link /A << /S /GoTo /D (page.73) >> >> endobj 4637 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [416.607 521.8417 428.5622 532.9667] /Subtype /Link /A << /S /GoTo /D (page.75) >> >> endobj 4638 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [432.6579 521.8417 444.6131 532.9667] /Subtype /Link /A << /S /GoTo /D (page.79) >> >> endobj 4639 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [448.7089 521.8417 460.6641 532.9667] /Subtype /Link /A << /S /GoTo /D (page.81) >> >> endobj 4640 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [393.5272 509.6098 405.4824 521.565] /Subtype /Link /A << /S /GoTo /D (page.36) >> >> endobj 4641 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [409.5781 509.6098 421.5333 521.565] /Subtype /Link /A << /S /GoTo /D (page.64) >> >> endobj 4642 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [425.6291 509.6098 442.5656 521.565] /Subtype /Link /A << /S /GoTo /D (page.134) >> >> endobj 4643 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [382.3725 497.6547 394.3277 509.6098] /Subtype /Link /A << /S /GoTo /D (page.94) >> >> endobj 4644 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 486.253 381.9871 497.1012] /Subtype /Link /A << /S /GoTo /D (page.115) >> >> endobj 4645 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2848 474.2978 378.2213 485.146] /Subtype /Link /A << /S /GoTo /D (page.123) >> >> endobj 4646 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 462.3426 372.9909 473.1908] /Subtype /Link /A << /S /GoTo /D (page.123) >> >> endobj 4647 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 450.3875 381.9871 461.2357] /Subtype /Link /A << /S /GoTo /D (page.125) >> >> endobj 4648 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [403.9878 437.8788 415.943 449.834] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4649 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [420.0388 437.8788 436.9753 449.834] /Subtype /Link /A << /S /GoTo /D (page.134) >> >> endobj 4650 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [441.0711 437.8788 458.0076 449.834] /Subtype /Link /A << /S /GoTo /D (page.198) >> >> endobj 4651 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [416.1644 425.9236 428.1196 437.8788] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4652 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [410.6591 414.2452 422.6143 425.3702] /Subtype /Link /A << /S /GoTo /D (page.95) >> >> endobj 4653 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [426.7101 414.2452 443.6466 425.3702] /Subtype /Link /A << /S /GoTo /D (page.198) >> >> endobj 4654 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 402.29 372.9909 413.415] /Subtype /Link /A << /S /GoTo /D (page.152) >> >> endobj 4655 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 390.3349 372.9909 401.4598] /Subtype /Link /A << /S /GoTo /D (page.152) >> >> endobj 4656 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [380.7416 378.3797 397.6781 389.5047] /Subtype /Link /A << /S /GoTo /D (page.139) >> >> endobj 4657 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [340.3634 356.7386 357.2999 367.5869] /Subtype /Link /A << /S /GoTo /D (page.109) >> >> endobj 4658 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5937 344.7835 362.5303 355.6317] /Subtype /Link /A << /S /GoTo /D (page.107) >> >> endobj 4659 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [361.2848 332.5516 378.2213 343.6765] /Subtype /Link /A << /S /GoTo /D (page.108) >> >> endobj 4660 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [396.4326 320.5964 413.3692 331.7213] /Subtype /Link /A << /S /GoTo /D (page.149) >> >> endobj 4661 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [396.4326 308.6412 413.3692 319.7662] /Subtype /Link /A << /S /GoTo /D (page.148) >> >> endobj 4662 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [365.0506 296.9628 377.0058 307.811] /Subtype /Link /A << /S /GoTo /D (page.57) >> >> endobj 4663 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.7862 284.4542 387.7414 296.4093] /Subtype /Link /A << /S /GoTo /D (page.70) >> >> endobj 4664 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [391.8372 284.4542 403.7924 296.4093] /Subtype /Link /A << /S /GoTo /D (page.81) >> >> endobj 4665 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [350.8241 273.0525 362.7793 283.9007] /Subtype /Link /A << /S /GoTo /D (page.29) >> >> endobj 4666 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [366.875 273.0525 378.8302 283.9007] /Subtype /Link /A << /S /GoTo /D (page.37) >> >> endobj 4667 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [382.926 273.0525 394.8812 283.9007] /Subtype /Link /A << /S /GoTo /D (page.47) >> >> endobj 4668 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [398.9769 273.0525 415.9135 283.9007] /Subtype /Link /A << /S /GoTo /D (page.199) >> >> endobj 4669 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [379.3561 260.5438 391.3113 272.499] /Subtype /Link /A << /S /GoTo /D (page.30) >> >> endobj 4670 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5937 249.1421 362.5303 259.9903] /Subtype /Link /A << /S /GoTo /D (page.108) >> >> endobj 4671 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [351.2949 237.187 363.2501 248.0352] /Subtype /Link /A << /S /GoTo /D (page.13) >> >> endobj 4672 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [367.3459 237.187 379.3011 248.0352] /Subtype /Link /A << /S /GoTo /D (page.18) >> >> endobj 4673 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [383.3968 237.187 395.352 248.0352] /Subtype /Link /A << /S /GoTo /D (page.23) >> >> endobj 4674 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [399.4478 237.187 411.403 248.0352] /Subtype /Link /A << /S /GoTo /D (page.25) >> >> endobj 4675 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [415.4987 237.187 432.4353 248.0352] /Subtype /Link /A << /S /GoTo /D (page.112) >> >> endobj 4676 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [436.531 237.187 453.4676 248.0352] /Subtype /Link /A << /S /GoTo /D (page.162) >> >> endobj 4677 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [457.5633 237.187 474.4998 248.0352] /Subtype /Link /A << /S /GoTo /D (page.203) >> >> endobj 4678 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [370.2809 224.955 382.2361 236.08] /Subtype /Link /A << /S /GoTo /D (page.13) >> >> endobj 4679 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [386.3319 224.955 403.2684 236.08] /Subtype /Link /A << /S /GoTo /D (page.112) >> >> endobj 4680 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [389.8168 212.7231 401.772 224.6783] /Subtype /Link /A << /S /GoTo /D (page.17) >> >> endobj 4681 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [405.8677 212.7231 417.8229 224.6783] /Subtype /Link /A << /S /GoTo /D (page.29) >> >> endobj 4682 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [345.5937 201.3215 357.5489 212.1697] /Subtype /Link /A << /S /GoTo /D (page.46) >> >> endobj 4683 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.7862 188.8128 387.7414 200.768] /Subtype /Link /A << /S /GoTo /D (page.70) >> >> endobj 4684 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [385.5275 176.8576 397.4827 188.8128] /Subtype /Link /A << /S /GoTo /D (page.73) >> >> endobj 4685 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [401.5784 176.8576 418.515 188.8128] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 4686 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.5113 155.2166 387.4665 166.3415] /Subtype /Link /A << /S /GoTo /D (page.90) >> >> endobj 4687 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.5113 143.2614 387.4665 154.3864] /Subtype /Link /A << /S /GoTo /D (page.90) >> >> endobj 4688 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.5113 131.3062 387.4665 142.4312] /Subtype /Link /A << /S /GoTo /D (page.88) >> >> endobj 4689 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.5113 119.3511 387.4665 130.476] /Subtype /Link /A << /S /GoTo /D (page.88) >> >> endobj 4690 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.5113 107.3959 387.4665 118.5208] /Subtype /Link /A << /S /GoTo /D (page.88) >> >> endobj 4691 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [375.5113 95.4407 387.4665 106.5657] /Subtype /Link /A << /S /GoTo /D (page.88) >> >> endobj 4692 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [440.5767 83.4856 452.5319 94.6105] /Subtype /Link /A << /S /GoTo /D (page.50) >> >> endobj 4693 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [379.3006 71.2537 396.2372 83.2088] /Subtype /Link /A << /S /GoTo /D (page.134) >> >> endobj 4694 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [410.1572 59.2985 427.0937 71.2537] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 4695 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.0544 47.8968 372.9909 58.745] /Subtype /Link /A << /S /GoTo /D (page.146) >> >> endobj 4696 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [385.5275 35.3882 397.4827 47.3433] /Subtype /Link /A << /S /GoTo /D (page.65) >> >> endobj 4697 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [335.1331 23.9865 352.0696 34.3365] /Subtype /Link /A << /S /GoTo /D (page.107) >> >> endobj 4698 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [356.1653 23.9865 373.1019 34.3365] /Subtype /Link /A << /S /GoTo /D (page.108) >> >> endobj 4699 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [377.1976 23.9865 394.1342 34.3365] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 4700 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [398.2299 23.9865 415.1665 34.3365] /Subtype /Link /A << /S /GoTo /D (page.141) >> >> endobj 4701 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [419.2622 23.9865 436.1987 34.3365] /Subtype /Link /A << /S /GoTo /D (page.142) >> >> endobj 4543 0 obj << /D [4541 0 R /XYZ 64.9134 727.2935 null] >> endobj 4540 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R >> /ProcSet [ /PDF /Text ] >> endobj 4704 0 obj << /Length 1742 /Filter /FlateDecode >> stream xÚÅZMoÛ8½ûWèhÃá7-Ú[  ,6À.ÐíAIÔÖhl§¶ÓìþûÙ&EI4%'\lNŠ=~óøæq8’ýæzvõÞ–XÅTqý¥P‚Xà¢Ðœc(×wŸæ¿üúöÝŸ‹Ï× Á ‘Öò‚Þ` ›—gï®g€/ÑZ¦ˆ°J·«ÙÙ§Ï´¸›ÑâÃŒmuñ„×”pkd±š ɉœ»Wîg¿Ï~ó€¥C,CÈ7 qÆ"Ì•eD0Áwõ¶ÏÐ ŠbAà€áÅ‘"XË"'À sÿ÷:À2D4–(JU—àrýð¸ovË€+ ú$ó«EÉ9Ÿ+sºÐìtTû+sDé¤,%V‘[”ÄJÉÆE1/,d%@Lˆâ¢‚›Ç}Täð¥¢(B±ˆ¢ÐõÀmFQÄ„(.ª!¸_®ê+˜& ~&¹p† mùYÝ?Öý•[ ¨qS)Üïêåvp€eˆ8\¹èWjÛ¼ ÃU½ÿ¶¹‹¬\¨æqéQIß¿=®ó°l³ÆÁi¢£š(LÄlo‡ü¬¶‘=I‰eÀƒtûÍ÷3ó:LcE,‹ûì) ¸,±‚F÷¾ˆ’w¡}òËêæ~PSÜèŽElÂýõÒ¢zÄ2„Vð]‰¯ø¨ÿ¼ª†ÆàB]¤5Dk)3êBž×ÅG54×ÕªÞlóF•˜Rº åìÈbòhE¬Å:Dõ‰$—ŒpÊÅHöx.÷Ùn®úv¿ô[‹´‡BjlJfè:'À2DŒÔRlŒ¸=}ØÁ ÕßSšÀû·¨ÆA1åŠÊDšOîÇOÕrÅ&öyy˜¿ŠòôfGã?0ýÑQÃp8qdôô sµã±ÚÑn¿zªVƒãh`f E¿¿ø|<•^ät„kÊ}Ò†Ú]}óøõŠU@Œ`:¨×êQ/J˜ßàÅã×À¿Ì¦ÄÀGð èmš§j»^®¿NI|~Ë¥‹îЈyµÝÖëcðë›Ý~[Ýîÿ}¬nLÏ¿!èr]¿:2àÝöb‰.OvõB6KP…3¹u»ÛÛ&"`sfÀlÏ›í÷“ݾÊðtÂ/,]C޾zB,CÈØ~–X*PmæƒG–ÛC×ù'vèJM$禷½Dô0·wko³=m—ûzB×^m%Ž wu`McYb[zj–L¢.ߢ?VÍÅ/vÍÅ®w‚ =žÚôÑ´sf;oû3(:…»Ï í~É Xp¥.KvnòÅûQ´§Tù&ßñüä룆·Õz³^ÞV÷“-;"ºÑDÈv¢žMBP™Q‡1¡ƒ‹êêÀ.ÕaÔÏ„b_5’g”$@LHâ¢:’ Ú®`¨GÓürÑôˆ#ºÎ4#@ÏI+/éFÜH"uÆþ&\t šh¢L¥H¶ X¦”‹^k $=ïŸPÄÍ]ý¿ØGsÄG­òù'@LÈE5 †ÖÁÞfÉÆÏ#Ž<¨Ô¢Ëp·¯†â½.F™Œ$âInˆEçt8~YÞO~BÌ„Twª%W—8 o•'æ1á$uØåõvúYnÕôûüäÊ…%šât¾•ˆ‰•»(¿r>uŠqã1‡s³8×dzúÀ}¸Æ¾(2Ì!bBåôl`À©M[›¡G¡Ø<›‘М=ŽÃ3ŠS¢¨:Ä1†x#ªn«ÃìÌ_8+SJÂ_²Ã˜lžQå–Ä„ƒ\Ô¸ƒr1 ”¤Ø:¨Ã1á l [¥z… s2á óŒã 81"׸­…Ä„…\Ô¸…r1 ,”¤ØZ¨Ã1a¡l [ ¥z … ³rf M9Ç(ƒ- &,ä¢Î”ÇÏʹø³r’`;+‡ s> endobj 4706 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [120.8443 689.2141 132.7995 699.8409] /Subtype /Link /A << /S /GoTo /D (page.68) >> >> endobj 4707 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [136.8953 689.2141 148.8505 699.8409] /Subtype /Link /A << /S /GoTo /D (page.72) >> >> endobj 4708 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [152.9462 689.2141 169.8828 699.8409] /Subtype /Link /A << /S /GoTo /D (page.107) >> >> endobj 4709 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [173.9785 689.2141 190.9151 699.8409] /Subtype /Link /A << /S /GoTo /D (page.108) >> >> endobj 4710 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [126.0747 677.2589 138.0299 687.8857] /Subtype /Link /A << /S /GoTo /D (page.68) >> >> endobj 4711 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [142.1256 677.2589 154.0808 687.8857] /Subtype /Link /A << /S /GoTo /D (page.72) >> >> endobj 4712 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [158.1766 677.2589 175.1131 687.8857] /Subtype /Link /A << /S /GoTo /D (page.107) >> >> endobj 4713 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [179.2089 677.2589 196.1454 687.8857] /Subtype /Link /A << /S /GoTo /D (page.108) >> >> endobj 4714 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [126.0747 665.5805 143.0112 676.4287] /Subtype /Link /A << /S /GoTo /D (page.139) >> >> endobj 4715 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [189.3928 643.1092 206.3294 655.0644] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4716 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [122.4752 631.154 134.4304 643.1092] /Subtype /Link /A << /S /GoTo /D (page.94) >> >> endobj 4717 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [96.1571 619.7523 108.1123 630.6005] /Subtype /Link /A << /S /GoTo /D (page.49) >> >> endobj 4718 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [205.0838 607.2437 222.0204 619.1989] /Subtype /Link /A << /S /GoTo /D (page.179) >> >> endobj 4719 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [182.4188 595.2885 194.374 607.2437] /Subtype /Link /A << /S /GoTo /D (page.55) >> >> endobj 4720 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [198.4698 595.2885 210.425 607.2437] /Subtype /Link /A << /S /GoTo /D (page.56) >> >> endobj 4721 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [214.5208 595.2885 226.476 607.2437] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4722 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [157.7317 583.3334 169.6869 595.2885] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4723 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [147.9372 571.3782 164.8737 583.3334] /Subtype /Link /A << /S /GoTo /D (page.165) >> >> endobj 4724 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [168.9695 571.3782 185.906 583.3334] /Subtype /Link /A << /S /GoTo /D (page.167) >> >> endobj 4725 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [190.0018 571.3782 206.9383 583.3334] /Subtype /Link /A << /S /GoTo /D (page.173) >> >> endobj 4726 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [101.3875 550.0139 118.324 560.8621] /Subtype /Link /A << /S /GoTo /D (page.155) >> >> endobj 4727 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [95.7423 538.0587 107.6975 548.7962] /Subtype /Link /A << /S /GoTo /D (page.11) >> >> endobj 4728 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.7932 538.0587 123.7484 548.7962] /Subtype /Link /A << /S /GoTo /D (page.20) >> >> endobj 4729 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [127.8442 538.0587 139.7994 548.7962] /Subtype /Link /A << /S /GoTo /D (page.21) >> >> endobj 4730 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [143.8951 538.0587 155.8503 548.7962] /Subtype /Link /A << /S /GoTo /D (page.32) >> >> endobj 4731 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [165.0674 525.55 177.0226 537.5052] /Subtype /Link /A << /S /GoTo /D (page.29) >> >> endobj 4732 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [181.1183 525.55 193.0735 537.5052] /Subtype /Link /A << /S /GoTo /D (page.32) >> >> endobj 4733 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [147.271 513.5949 159.2262 525.55] /Subtype /Link /A << /S /GoTo /D (page.92) >> >> endobj 4734 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [167.9174 489.9613 184.8539 501.0862] /Subtype /Link /A << /S /GoTo /D (page.144) >> >> endobj 4735 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [132.6592 477.7294 144.6144 489.6845] /Subtype /Link /A << /S /GoTo /D (page.70) >> >> endobj 4736 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.4903 465.7742 172.4268 477.7294] /Subtype /Link /A << /S /GoTo /D (page.147) >> >> endobj 4737 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 454.3725 118.573 465.2207] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4738 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [122.6688 454.3725 134.624 465.2207] /Subtype /Link /A << /S /GoTo /D (page.98) >> >> endobj 4739 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [106.6178 442.4174 118.573 453.2656] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4740 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [122.6688 442.4174 139.6053 453.2656] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4741 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [143.7011 442.4174 160.6376 453.2656] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4742 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [157.4567 430.4622 169.4119 441.3104] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4743 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [173.5077 430.4622 185.4629 441.3104] /Subtype /Link /A << /S /GoTo /D (page.98) >> >> endobj 4744 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [157.4567 418.507 169.4119 429.3552] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4745 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [173.5077 418.507 190.4442 429.3552] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4746 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [194.5399 418.507 211.4765 429.3552] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4747 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [196.3704 406.5518 213.3069 417.4001] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4748 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [201.6007 394.5967 218.5373 405.4449] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4749 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [201.6007 382.6415 218.5373 393.4897] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4750 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [175.449 370.4096 187.4042 381.5345] /Subtype /Link /A << /S /GoTo /D (page.24) >> >> endobj 4751 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [191.5 370.4096 208.4365 381.5345] /Subtype /Link /A << /S /GoTo /D (page.136) >> >> endobj 4752 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [131.305 358.7312 143.2602 369.5794] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4753 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [131.305 346.776 143.2602 357.6242] /Subtype /Link /A << /S /GoTo /D (page.16) >> >> endobj 4754 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [147.356 346.776 159.3112 357.6242] /Subtype /Link /A << /S /GoTo /D (page.31) >> >> endobj 4755 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [163.4069 346.776 175.3621 357.6242] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4756 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [179.4579 346.776 196.3944 357.6242] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4757 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [200.4902 346.776 217.4267 357.6242] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4758 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [170.2187 334.8208 187.1552 345.669] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4759 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [175.449 322.8657 192.3856 333.7139] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4760 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [175.449 310.9105 192.3856 321.7587] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4761 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [145.5315 298.9553 162.468 309.8035] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4762 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [150.7619 287.0002 167.6984 297.8484] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4763 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [150.7619 275.045 167.6984 285.8932] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4764 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 262.8131 123.8033 273.938] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4765 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [127.8991 262.8131 139.8543 273.938] /Subtype /Link /A << /S /GoTo /D (page.98) >> >> endobj 4766 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [111.8481 250.8579 123.8033 261.9829] /Subtype /Link /A << /S /GoTo /D (page.96) >> >> endobj 4767 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [127.8991 250.8579 144.8356 261.9829] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4768 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [148.9314 250.8579 165.8679 261.9829] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4769 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [169.9637 250.8579 186.9002 261.9829] /Subtype /Link /A << /S /GoTo /D (page.191) >> >> endobj 4770 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [150.7619 238.9027 167.6984 250.0277] /Subtype /Link /A << /S /GoTo /D (page.105) >> >> endobj 4771 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.9922 226.9476 172.9287 238.0725] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4772 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [155.9922 214.9924 172.9287 226.1174] /Subtype /Link /A << /S /GoTo /D (page.106) >> >> endobj 4705 0 obj << /D [4703 0 R /XYZ 64.9134 727.2935 null] >> endobj 4702 0 obj << /Font << /F8 1548 0 R /F22 1606 0 R /F32 2060 0 R >> /ProcSet [ /PDF /Text ] >> endobj 3776 0 obj << /Length1 826 /Length2 1841 /Length3 532 /Length 2434 /Filter /FlateDecode >> stream xÚíRk8”ë^¢bX£¦”š%Ÿ29ÅÌ7*Áè’Â83Ÿ1™sÐŒÃt"–"§#Ò¥„HçÈ¡A*9%S+ŠѪµönýÜû×¾ö÷þùîûyÞû¹¯ûyQZN$C<•íÙ±Y ÀbÐÌÂÄÔÂÄ †ì`!‡N 亽¹&€gB:…Ìɼ@ˆ)Ó ‰M¡C<¡€g0—¹\ÀâBœPˆjA€J§ðˆFgÁÐs޶±ØîMåÿ(…B®Ì +3©È,RÙ,† B0ô¶l$sòß0õ³¸ŸÁØAfÎÉϧô·:™Ig¿w°™Á|ÄÙTˆÃú¹Õúf΢ÒùÌŸ«Ûxd‚gÑ€ùFѹvtDu¢ó(ÇæiˆEýÙƒ,·yh¢«7‘ämð}¡óE'2Åsÿ©:×=Á¿°,]ìÂa0 ¬Qv~üùü4Ì–EaSé,Ù‹05ÈY“= 2ÂA€Î¢BÈ £Xlžì Ë$`s`sû4Áè`2b1 Þ\é ~g¿íï-Û šü'1¦šþ/Ð@3ÿ‚ L™5ÿžŽµ5[n†XcÀk˜™›Fþ[…Ï‘çÍ¿;YÂ?p]¶@Ø‹v6Å2joúÕ#Å"Û‚Ös õå¬i×wTÜ~|Cùðó$9Fa£Cˆ~w¹çÔù¬epÉB‰æ¾/Hn\M„³Ønø`HbÆÓYIèIVXÒs4ËQ8¼öÓáAÕëWŸ||o*·³­»©8ÕëLmŽ´n0ßIׯõÍâ—Z¿ÜÙzùNv”ÎÓ.‹á]¾ÞXËeIFHq¬IL×¾%©É ]-‡E{c+ :GØ5|ÄTb^ʬŸéM]}׿U["î}—õY>»'Ï4þiY'Éýëù°n½–øj¥ä§ÅvœžI5îX|öÌj>ò€aþååÆõkɯ÷ 3#'äS|ôÕÃN|:í³üxÅÝ«ç°A°uåž´˜5Ï*Ô~ ºÝÅãÀ³Âw¥J%»%µùz÷—‹Üc öà"BW¤Ž€{'·)£5Q:¦Í¿ž o^´h(-ì¦Jü¨cÓ­Ìâ‚(Úþ­i‚‡Ñ]_жµ.Õi"¼ç ßGì÷÷ûõï?®<`÷² ×€î Q®Þ]ày¾¤`“È»±ý–OíÑž{-JÕúõ4lÏÜñIb¿zOœ©WZ:x’<þØífOCçJÏhb¨E­´ì!¢ík…‘¢ücö`ÇÉ~†«1ä¶¾dÚó›ûÔ¥i¸ÂQb ×¾»Šmu’ÔìÞõQµÙ\]œ\JšN%q\Z)·1)^\kϽ/·¡›Ë,C6ç9,ØrÐÛšôÅÓP¬ê Œ bjE›t;^Ö/‹~·.WÁ÷¸Yp³|gîQ+M:Ñ0VM Ü´@¼>ruàôç›)’ -þá&®kqÆÆÚ*kçX‚ûˉ0óæò:BÇÛ@È9ÒG>¤)&ˆë®ÃÃ,<7dÅ~¸æ±b*Ãi±Ï©U uËH5kOs¾F…=|š7Sø±ÅáZÿÎRWk¯´¼“Ï •rìÞ[»RIëÞæ‘N5ƒs¡Ä§öñÖYæˆ&Ú§^ôîßçÒþ1?žæP#ÖÉ;šg4U·.;{ÍÂ/‹}WKWú‡ê܇¤Šmø Ö¤2X–1EŒº÷(¥‚ßäOTM©?óž>?5®ùV¯]/aŸÅ#‡üÍ™¹³A,³(a&°ÙÑp[.îú¾þÊÍ'qS¡’qúµüYú†þ6ƒÂBæ’…å΢õòhúÑ™UÙ›¹±Ý)…‡µ ô´õ}¯¼óîžËNpÎB:#nà, ×òÄ“¬¦„[½3)èô8›®2ÙW¢÷ºíöÁJ¥ßµ£˜Jƒ;$f’K=ÓÏ'&øð°·R³iÕã£X…¤!•‹‡´}VòU\¿žMàx Û7ý~O;3xîl»Ø\Ý÷µ–÷Û…\ªexgi‡Ú°õ[œ¹}§‹s"A/7ænè䥄Ÿ\ø¢~KbÝþÊ6Ú{)Œ‡ã㮫~î³ßOÄ»%­´29õž›«4ÿzјzfŽÌœäø^S/É šFx8‹5vRÚ¢Ú'4óðú9øîüc¿æµ5à1î'>iûÉ¡¨gµ†=Îè61Z/€Wÿ!õ@8¸XLm#û|6¾»Kû4V2®z‡Úa0©Îß²ôyöÐÁkÈŠ¾ekÛø[Rìø­’‘V2ÆgÊ”[?½MŽ;šñ¨‹uiµê•|ÍÜ’”›¯zSU·IaVA>{žwøïž¡Ï$o}îòÌÏsCgEXÉ}ä‹Þܺr ~ìòsØñ’༭¹ùÚŸUñƒu¯ÜÚŽ:Å>"™#µg¢ŽNrÒª‰¡{Šq©RËWE‹YÒòÌæ†Ð“̦¯"šÂª/5ž«Ææôi\ö­[ aït°`K²3Í•d%­©\1ݯB“¨j5Ý­¬¦Ã¨’÷úŒ÷ ·7FNû™U—ÿÑÙËO× tÞnH‡ìÛÀµ0nõ—F5/•+hŨ×Õ—”!ôSá{+ûÞŽ%—Ž3úݨ•ûub[_\„3°IMõwZn€7Q~æpåΪzyÒaž£tMEL¹7Ô¥öDíÃöä û‘–ˆdbÝòQï éÎãnÝOŠš àb‘`äü[üÎ,½áß,¬*ñnÙ›SÇ:t®k,‰|Åâ;q—újô cZ/DŽè%:¾>P1“¸{QãYcÁƒÿ5A‡Â[›aÄÆ‚¥W6É—[Ž1‘¯ÏS“K[ü²àåšAÐWÊv¬R€‹“zõ¥­U: —ü“+0ÿáû¿Àÿ„…‘9<6“Ì ‚ýAnendstream endobj 3777 0 obj << /Type /Font /Subtype /Type1 /Encoding 4774 0 R /FirstChar 40 /LastChar 110 /Widths 4775 0 R /BaseFont /GTZGSZ+CMTT12 /FontDescriptor 3775 0 R >> endobj 3775 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /GTZGSZ+CMTT12 /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [-1 -234 524 695] /Flags 4 /CharSet (/parenleft/parenright/a/i/m/n) /FontFile 3776 0 R >> endobj 4775 0 obj [515 515 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 515 0 0 0 0 0 0 0 515 0 0 0 515 515 ] endobj 4774 0 obj << /Type /Encoding /Differences [ 0 /.notdef 40/parenleft/parenright 42/.notdef 97/a 98/.notdef 105/i 106/.notdef 109/m/n 111/.notdef] >> endobj 2355 0 obj << /Length1 859 /Length2 2119 /Length3 532 /Length 2721 /Filter /FlateDecode >> stream xÚíR{<”ù&„A‹"jÔ+01—1cøßFa܉iæ&sk i—¤Î a]¢Ù"…$c‰Ø¶qé*•É%¢T”uM®gÒvÚÓþyÎ_çsÞß?¿çù^~Ïû|¿0Í}úx ëhÇbrõQ(`M 8¢€èŽDB`0kHâÒXLÄ(,ÖpŠ hC‰ÁâŒ1`ÍbGsh!¡\@ÇZ÷SÀ3@Lb7dˆzItÀƒE¦ÜhO§îŸ*Âw0äD‚ Phd.p ¡1!ˆOš™T€ùLS"Ø_B‘ '\$ ÐY“© ˆDRXLz4@©„+Kô(Òòßõms»:Ý•ÄøÔ~Í©¿ÅI =úÏ ƒÁ9E9ÌoS½ÁÏâ …Áø6êÈ%Ñid<3„ú(#¤ÑgžnG‹)ûh\r(@%ÑÃÁ5dR¾U"òoMO´qr±†ÿ9Úµà>É%F³Aù5{ £¾b‘IZà4@"Q¢DÑùr üæ1[&™E¡1C´± @âpHÑщ1ƒhL €Q"Å&‹+*DΨ,äÓ\M‚†‡b?hòi÷Dî}á0¦Âõ+ˆ½ÿB(‘,øh(ªÿ •Ò¿BѦ!Xkðï–YY±¢bô Ñ€>ÚXô H#ScŒ<úo‰ädr×ÖRdüL¥‰f‚Q "|Â"›?˜sýDYœméƒr)Ýphî…ãwš¯åšŒ ˜)wsêîÁmSJ‰Ji—³ß9_FP¨Æƒê×ñ±‚Db’@a“î¹<é òXÀþumE·[¿cœna×Á'žiÍ>l’ªtyƒÂ”¨¿K–,{údy:.ìØÝA¡ÜYŠÖËlH`QƒKèõúyFç¸=«”%äµmțݸ"Toíï ëSÈŦ$çîY’EêFQ‡îBPùaÛ…>…X'œ Ô¤Û«8Û²G3×ǼžïLx/3üP;¬™+ßå4ÛÁÛÑsnkù9erÙVú{žº8XÕê×Ì0g¶$T¹Å+‡U=@ï9ƒb×eÁ܃?.ævž–œ \\ø°š¢Þ`„„¦ [º¢2ÆCoÄ*/|Ô¸„3)èZ2{y?ÛSP÷FœÔË„­aiãD½Ó÷MÎÁÑL+jíª»r(ÄX}·œ°KeÎe'Ñ“XÙ¬rlÕ(‰âØ3xþïÔ"NP©ã|lVO÷6,¨£b’«˜±o±$Ø€ãkÑØÜÊä0G®|Œ‰D7î 26 Yé2¿à~ž“~lbò©‘Æ© Nn¨g«Î¶=’·z|®Ç>BNÉ–Ç_È-Ïío¤a‡nœWŠÐÚãsYÛ¼Y½òæ‹yK7}´•ƒ¤û“Ň`”úFÅ&eÓH›)DG¨& lüÍqF)¨g§œ°ãÂ~Y®)ÍöBÄôX^3ÑäºÌ—à˜ÚŽ×ézbëú%ç§³ÕFf9?ŠÄΛÆìŽ ?<“tŠ-ÌŽÌ,c,?Y i}ðªs’"úÏ«ìN·À Š‚*ÃTøSV±µÒ½ÅÝ5á7VF,RŸ(ü8fýlì¢Õ÷ñª^5(þ½¿C«9óš»UÜÜ®xh\ípbãaiÞòïúêƒÆfUö·Î§ž¶VPŠ&^O§ßøµÎ¿áC3§úlXkÿäq·ü†0¥rs^¹ïÖ˜3–½äVû,Qa®Ì6á')ñe‰´úïVõTw›âÊåßt‡ËäJôn³8sïo"ÈŠÊ>s*¸ð·É¬L¹ƒÄO]¯ÿ¼%?Ÿÿþ_o=¤ •j >9ÜþöÅq·êæwñ¬àÞn šõŽÕŒæƒxNuÔ‡B1YÕánäuïĤ5ϹñO·ô<æ׆V6nñtgdååÔ·l˜(&öJœM£:s ©'¡žßÏÅN=Ýô㨪PIƒ#h ‚…*õJ;ïƒ-cêo€‹ë>¨ªt¥ù6¬ò‚•—ýÂඦgèYþƒò³b›Æ7å¹þ˜åf øE³¦¤ež?;•«kˆ•ŠÒè×€¿Šé…x‚šã#4cÙŸ•xXMÕ€{¦1c¢?MˆñZ]p™Îé³"¼—¯J&²Ì^W@ŒbÝ·G:éÙe÷[7ïAz,Ÿ½,þTý–ãÊdg.3›,•àjø¼LSÇÒÒô×í›ñ?ûšõU(êÉJT2äÏ㪉‹q —»xlåí’írb¼R0´¶ÐžàÖf3®ÖDa{Ü…j‡½Î¿°²¹Ž¾\åo>OÚPQfyU¨*›2Z/ïßÖÅŠÛzsfGxÞ¾«F\ V^èæA«æ¼¦%ÏœvÚ.w[B-gx‹„tŽ«ÊC¬—“0wZ×rï}"¨º;"£‰óZu„f=s6tÜÚÒ½ïDÀbu-ÒªêxÜ«“•ª…Y8C )9 ݲcŽ7Ë“[ºŒ†©™ †àY–‰›SÆÉ–*%ck-ý”µ¥¶£23-XÏòL¯'ßÔ“¾¢ì7òxÄÏhå… \Mn{™l5¡=”¡•¤¿Rí¨€ZþCÇ%\ÜÀ¨ÜÂþd¦ÞùàÆ2õ©’—sñº¥‡óí8ëf]Z‰î§înÒ{x ah´ë…ðθ‰3š•;°JôR|}Ñj«Óâ–®@Ƙ<¥VîuÎpRâ7@§} ·8ó’R1©r¤:yâÜ~Çý)&‡«9Sßvlˆ7+ÖwÁxË;»]Ñ)íÙ?(œô~qaj«@ýÎ¥fC·ÙQy—É ]ÿxÎïƒÉ‚É¡EW†n«—v¹zíµFñËáÌ>¶–‚´™ÆÌq>÷²¾ì#¡Uì$D¡¾ DËo§ÛÕ CòºãOø—íxÉ,j ñßËëì…¢#äž$ø±Ç¼U¿˜à3ö§Rå*úJèñöOjZ¾ãõíÜ`mnŸw»ò¾÷ýlÚ±™°W6Ü4äøAþß࢙’8\ƒÄ ƒü††Kendstream endobj 2356 0 obj << /Type /Font /Subtype /Type1 /Encoding 4776 0 R /FirstChar 60 /LastChar 111 /Widths 4777 0 R /BaseFont /ATDJLC+CMMI10 /FontDescriptor 2354 0 R >> endobj 2354 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ATDJLC+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/less/greater/N/O/e/g/l/o) /FontFile 2355 0 R >> endobj 4777 0 obj [778 0 778 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 803 763 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 466 0 477 0 0 0 0 298 0 0 485 ] endobj 4776 0 obj << /Type /Encoding /Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef 78/N/O 80/.notdef 101/e 102/.notdef 103/g 104/.notdef 108/l 109/.notdef 111/o 112/.notdef] >> endobj 2083 0 obj << /Length1 819 /Length2 2136 /Length3 532 /Length 2720 /Filter /FlateDecode >> stream xÚíRk8”ëv¬Œ$gõE#æ€!£h- ó¹Ö˜ù0Ì|3¡™PID*JE#M+gR&Å*‡J"$)åT‘„h*‡=ÕZ×Z»õsï_ûÚßûýxïç¹ßû½¯ûyáë‰nFx #´c@l# ƒlœœìÍñ†Áá6,Ħ2 $6ˆ0f€C 06Ðæ8¬‰ø‡Á“Ë¢‡°}Ä7’9€§ƒ,*™N$vHkI4ÀA¦‚l.ÀÓh€ë·á€+²"A †Á*™ ‚ÁT†úfÉ bæ?Ê”柭H.6è·‰Ä&) ˆÆ(` åÌßнü7lý,nA£9“èßä¿õ6‰N¥qÿ 0èÌ6ÈœýLõxs)ÔúÏ]{6‰F%ã¡`aL‘hÓuj¸•RˆT69"ÑÂÁïu¢üìDßw(OW×M?û½G$Q!¶;— è¿Èß1æ/,ŽˆEå~h$ÅëÏ]ÀOwÙBd… ÆX3€Äb‘¸0´XÊ‹¢0¢€äˆ £ƒ->ˆƒ‰‚,Ø·©Šg (ßj@,€¢þ1â.ô7h  Xƒbrøß €b‡ÿŒcûv' cÅî0æÀ‹Žù79‚Å!ö÷÷&ŽôODO9 Ö-d-„¦—'°Í~R$‹×:ŸäQMüó–ȱ>KåvVE«;¸vJ)^)”Z¼òܸc Š„XUŽnˆrCÅw)5(¨"~ã¹- ùï–zȯ¯U¤g% w¯{ͬØ4ñ\w¦?²Föá-Æüòªñc2…Âùéa[ºå3(ºCç`üJÂYÐs¤?µùË»ŒlFwîC ÞŒÊB÷ªÚÞ§a= ç-’ùNÒ‘ýÊÆ9B]Ü…kTKÿ3ë»çW «;¿—ÀC·€ÎEŸs—»T1 åIå2’µØkÅQ¥œ§òŽÇè¥%Z©ÎTÏÅ ˆ‡»ù_LL-òTý:òüHâ•Ø77›Ž&¾•éhä¸8Ø&Jׯ§‘•~QrJ„z{z òJçs[—HòsÛ-,Ç®C«ZFìż…Á/_ë?øÒÒ2ެ<4#e!uL›žLsÓ¥SÌn GÖ¾=°ÎÞH¯à-ßêÌþêt…%VΡ™n“5mˆÊæ£Gs§Ið;ž{Î*Ýr yhЍ6:zxéýt¦¤®æèþìóQY›}Ÿ”î$þn!?9Y…èÑ©*!¾«Ï®7y’¶ßgÄgHÓ÷óL° óÄ-â§›þ+6uÃ=gTv<^°ÑãÍoQ>£Ÿ”í:µxˆ†•Ù/ëXÊ)ònsZ£ê³Iá™ñ#ª•#×!v;Ÿ6ƒ¬@D?W2 º"JšDßvçŒezu¤®v7Å)Ý·®zˆß7óøè &¿~ÙÓdkÙÄ'Dâ=3UÃáLç QÖC‰o;T1dÚðCIe§Âsô%Ñî TEiå÷õòßë¡ûúBÕÒK/ÀSd7®©7%ðìkq!;æý2ÇœõiT¸»ý®°üx[¿™PmÃtàï¾ÞBß“ôyo«Ïù¼í)º©—nZœã|¼YÅ{š«1`¦aïáP î\ª›±Ø›`µ¨…aèÏ÷'{(Š„ä ›'59:I"¿®IÚ7 ”Ϭ†G,•S·¸™''¦m©³®^Xã°ÁŸW@Ý:èÁhÍôð¶Mî-5U÷ä‚s²DBsÝD%Ü c¡BÞ‘àY=å··yÛG¡l©GR]¿^àÞæ +çx7_ßõ ñúðwÞiŽÂ‚7þ¯Ÿ9eÕy©–=¯vÙ‚ZïcÖ7Æ•+IÄ(,Ì•>eà•7~ø8Zï8QwjLDF†W×ÔW‚¦<§F©¤­Q5”ÓcrŒâÐj÷‘wêC;Û/§¦ÇÌY²0Ë̺EoâôJõ ÛÏo$œ–QªæÅ ›­‡7×Xº~W#–Ý„HMOºY²°SqL±†¼¶KÝÝàõ5zÞŠª²]W ®äª|êl „l?aÖ嬗ÐAÉy­[FIÓÜÐð¢Z"®| ,ËŸ'§=š •[YÝRu²É.É>H¸0áht&>6Æf^i¸÷@§cÝ7¸/¹ä@™_×ËL*Þï*àæSµ¢Pèv¸cQŠrVލFøòÎí«Ôº÷Ò*õâ0qÞ²óËGËÉKÛ&¥Ë›@Mr-%»¯[Ù?üòÚ½²ÙõÖ!jºZx¬gÛÁ;Ìri³ª¯/‰,— ŒGÆÊžn4M»_¶bÒ¡\o²*ݰ~uššUt”®UÓ«×·Wó‹Èc´CÏW´Ú}ØÃ6.$ºh®òZ]‘k¤†{¥…˜ºC’÷´¿É£?’©¹ñ³¦à”âºô_¿Z³ºWVÍgË5Œ ›¯\ßÙåE9MÔê £”?ÜÐ<Ñ[Ú7ò¨yá^؉ò‹{UŒ6mV®tä{o¹1p U™~œý”<)5j_Ç·~9 _?DÉvXâ²{æÒˆÆ¶æYQž"ˆ‘‰jîm±Ø»k´ªÉáâyŽ; vQòÃ`©¯ÇçÅÅÏ%Z%§4^|W| ì­òr­hÚRƒ©Ýskhï¸û©2GÄõö Zu¬Åã: nóNqVÖ¾wÍë0ÖÒ§¥ÇÏáœRœJCµlö_÷®ÌyåœXË=‰¨z7ÂRË¢tR N÷hçÒ‹›.Î÷ŠìöH%Ûu}œ51Ü4%°£G×ípöY0€²b͆0]m2EùBKOŠåÊX•¡< W=èý¥Z’¨®éAtš}m÷Mùß©€´Sߨ?"÷ÝÑö"̇°Vˆ{ÞáÝ-±xÆW·“»«Ÿ~5PaòÉí¢óy„ƒ[ZlØ!±hC¹ª–6•KS`^]Þp''Xé[Öb¶qZ%÷.…k¦¯¾Í_Î>㞯ó õR?œ´G^¨Ÿû+1¸ÇÃÇ—I]|¨øBñ‚?'©3&⣪Ε»Ì% “C±y*ü¨lû¯g<|£LdŠ5®?â5K­}Ș´¿Œ7õà7rÕ¿Ò›éLž²vÇíJ–½w`äd»Ô’©}»†Ó¾ØFGÑ,p²}Í"p X÷Úa LçM ÿÝVÝ@ ײÔpðÕšÔM·»^ƽŸ^<¤±É½èt¨š“ÔnËÛ¦ý“\ÑŒ^q¦@» =5H![™£‹CMdS®cã\û†„õîR°Yg²ô*kœ´èAñ¥|<{0Ÿ<1¿ìq‹ ñû¨>âëX›Ö(Œ$4/ùšœÜ±Bøž“^Zèÿðƒý_àB€LI,6ƒNb…Áþ‘¿‰áendstream endobj 2084 0 obj << /Type /Font /Subtype /Type1 /Encoding 4778 0 R /FirstChar 100 /LastChar 116 /Widths 4779 0 R /BaseFont /CVRQJR+CMMI7 /FontDescriptor 2082 0 R >> endobj 2082 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /CVRQJR+CMMI7 /ItalicAngle -14.04 /StemV 81 /XHeight 431 /FontBBox [0 -250 1171 750] /Flags 4 /CharSet (/d/i/n/r/s/t) /FontFile 2083 0 R >> endobj 4779 0 obj [595 0 0 0 0 404 0 0 0 0 706 0 0 0 530 539 432 ] endobj 4778 0 obj << /Type /Encoding /Differences [ 0 /.notdef 100/d 101/.notdef 105/i 106/.notdef 110/n 111/.notdef 114/r/s/t 117/.notdef] >> endobj 2062 0 obj << /Length1 1383 /Length2 8353 /Length3 532 /Length 9167 /Filter /FlateDecode >> stream xÚí–UT\Q¦!@p÷@ p§(\ƒ»kp/ pw ÁÝ]‚ Ü‚nÁÝÝCp¦º{º“éyœyš5U/õ³ïþ¿µï¹w …Š:‹¨¹ƒ)XÊÁÞ•Ä âˆ+Êjh€Ø V6qg°‰+ÄÁ^ÂÄÌññ¢n–/ÄÃÏÉËÏ-ˆ;8z9C,­\ôâ ÿ(âˆÚ!f&öEW+°´‡™‰-@ÝÁ võbˆÚÚÔþq… @ ìvv›³¢€@sˆ™+Àl ±GþCIÖÞÂÀó¯es7Ço¹ƒ] Rz¨$ªhî`oë0[ • Y`¨Éÿ ©ÿn.åfk«db÷öÿÓÿV`b±õúŸ%vŽn®`g€¢ƒ9ØÙþ¿K߃ÿe§6‡¸Ùý÷®¬«‰-ÄLÔÞÒ `q²²qþkâ"ñ›«@\ͬ®Înà.ƒíÍÿ[:½jeÅ”äu˜þ}_ÿ¹«b±wÕðrØþ”ÿ“A:%gˆ'@• -„~ÿýËà¿Ò$íÍÌ!ö–v.n€‰³³‰ ôA‰ à@ìÍÁž°'ÔÈjïà ½ŒÀÂÁå·•“t°ÿcñŸÌźz8ü‡¹¹@Ñ?Ä Šý!Püñ€ÚWò?Äí*õ‡@ ôbeþtlš.ÿ‡ é 𮸇 éJš®üâ…¦«ü!hžÚ‚æ©ÿ!NPãAÓ5ÿ4]ëAtþCÐ4ùCPÓ?­4ûØ 2æ!t࿪cùB}¬þB¨ä/„Yÿ…P ›¿jaûB5ìþ ô8íÿB¨†Ã_‘ã_Õpþ ¡.!TÃõ/„j¸ý…P ÷?ÈÍõü ¡¹^ÿÄÿýsðôб°sp@OôLqûý/efnÎÎ`{×¾£ Ïá¿Ù}rÁ`O°ʬƒ™@°uZch™¿dáD9ƒ iFIðHgH}†ëѪΌsÓ¸˜ì;ÛR•z"_ 4·àZ'nõðQ†Ìc ã1ägª#ž™é¾ÌëïÁ´Ë‰Ø[ ßvlb:[¤úµæÞ‰P­pâ) >‰„/››}ºò· ]_@M7§ÚIE1ÈkSHkí¯ÅßK;:,êgþÂ}^ îY™²YFÏà‹ÊS„Q4†¡ÆøÜ‘¸lÁ#'m|ËpÅŒ+—ÞæLWÄËÆŒÚ¼tà`êâ õCÄß¿!à7®žxžÿ JãKÓ7Ø`ýŠ”b¬HAnn „ËÞdÞ¸¥aöCÀ !_é“L©ùt°ãë`žŽÜ·4°¤Åh,Å™›ù^$‚ŸdFÝ&ãx Ïlj›ÎÆ"‘‹òVY™ãÕ-µ"7PÊþÃzÃ:ÊÕ»Wo4MQ¼“®:dàQ,»R TX/HÔÌZøHÄE _ޱÞüAºáÓ&þ¢ð-4“+eÚV&ñÊ7/cÖ±C¶û`•uee\7zÝb V}c·ÀÄñ´äG9†‰Ðº ®v~êsiá'×Öã_ô¬¬ß†g³>|·šNF0de+Ùº–ñ²Wj†ÍìYwã ðpúØö4™¼¯YqÏU]¿Tû¡ÇRœ„ÀQÒa^UM;‚” 5îRNZ>âb¬¼ùŽ|èΆ]0nkW¿ùÓ(ˆZ_'õ:œaúäbpr÷¼v/óõ«¨Ž5ëâü5ŽÖ¸ªdZ ðÆZJ¥.å·bÂ\v½ÉÚÓ1YÈtÄ ÉþªþœŒ¦Ó'W§Û ™„ÖZÊo$TsaØ›Ùè—œL.\½˜H5¥Â`Ç l­©Û§IÅžõ†Õöï|öN‰ŽIBUG¸Ž®þ(ã:º6‰õȼ‚#µI4Ž ,“v¡+k“Òµ¬8üƒy©ôÀ2¬ûR_ðÉRÄ×ñ›AÃÐmzÚðL–aIvù$~Ê„<2~"°½S¬Tªw¸1¾”¨|ušÞ¤«úØÎ îòÓˆº¢Í†ÙhÞöµŠÄÅ1ì£ûïͼ‰ràãéÕíQ²D½Q 7¢÷°®Æas.ö†ðUr|K[…˜v?âX;¾l49¼ûøYd«È²T±çRÝk®IŠZ±…Þû±]ÝÚ—&)èWˆ²Ä•£íâz{¿¤R}ù ’)®ôõ™FÒázÔó)þv{]t²ýî@éáÏ3l2Ê- gß<6õùIÚA´eU5]hKÖ÷ë㋌>ïW6‡S G…âIPë³×o¨Ø’ XV­á—]—– Jü6hWMÊŸr³ÛúXïÄå-øÖaQÞ£6S” ü10eIâÃs¶;ßWúÝAWãBþ캅Ɔ‡!/nYúl~Ü«xTô®/Aj$‘{vdbÜ2狉®Ú9,dfzÄ­jL”SÄòëª"=XªU)ɘLÕ"¡‘{æÇÖ¨”wȇâ¡ÌÅŠÚpC_,Þ6~ƒpš\â ÍK‹?"Á”ç. Jw ÷ƒ¢‰GÔˆ¼+`bƒ†µ-:ˆ9Qïómboç ÜÝÜ‹ƒÏŸLCÍïlq n£¾?s´µë .^ñÄíõ–ÚgwO HtèDµ“Qn6ƶ. ˜vnnç,ÀÄ g›ß¸Ô NPêï{hÄ8§‘gÃûܧeF[w,)üK>Þ¿skæ*/K Yj†âÀ÷€€ÉtLV±n0m³¼,ü7U$S×H•²ª!oFHž!{z’ëåm£kµ,þIýÀwQ"Â.UUy¬š[„5ëÛïi˜…Gµ!Ë4È4\î­DÝêâ(ûÆ\ƃ¸Ú’Ÿ¹rüÛèP…ìˆ|(,цmãŤñét¦’åÚ¼ˆ× Íp3DP¼™ÑˆŽLI8鞀 #›É–³Ṟ„ú¤‰w påg~NÔi5v†B Ä›nx§,¿šÚÖ© «ÎPCJNµ )ŽYÌúZë\'&Ó ¡)ï¬àâ 7,?lå+ÁØd hÏ´à8½íá°Ò޲OzïqA)ú‘ø×Všž%ËR“‹ý”9V? æžTh†ÕÎEYýÄžÌ %0¿g{ÂòkÏYgûs0²Ö‚k>Òm5ì]-|¡ SO7«0®œR–Ù=çÇÛ=ÌŠ©jË¥û~¼|Zϯ—îSY>bœxE(wE‰”d8@ü¦HOÂõG<•Ÿ»öê<ª"Õƒ+ò€>¬Ä¨X†#$\Ãs…á«Ô\™CªTBöì?*Ó ×ÐýIJ¾aøýºØLÔ,Ñ;WÒ6OÛ'Zæ3;|s™ìKùõz±zé× d06©ðýæ{í"rˆ»úêJØV[éõ~–}xÀwJ…< s¹ñ¤Õ+’‡úE­3D_!\ñkPc'ÓRUW rõ'Rê7HK‚¯w Û¾<4§;¥šÔ3fˆ­4àíC A ±~¹âç|rG ÷•½á<,+ýôôoD.Ç‹?^ÁÕùÿ‰°ulE|:ñ-¥|ýL¯/¡ù­ÞÇ%ÑÅñ€UšžŒÝã˜*¸Ïßоî¿P^¾„‘J'^õtå›s‹4tÒÁ\ s’ÁŒ ”aHÝ%˜:» :‘bìÞ{ ¡ Iì9Ñ/í×|f’“ŽÝ!DL6&3¶Q©¦ÃŽhúÍsC–iˆ×N‡¸Kw’ÖÅ/~¯Kõnì4壳NÑs.ž<,³T©nüh8bUáŽNneÏ÷¹Þñ.E-àü®J!ïvÁ;a| §;ñÒöÚùhL[J"½LìT#™82Ûü\€h¢ñ”!5òž dJkÐu8£R®'Vú±Œ«ß%ņÑ4¥fAHÔcäyHZØ„\k#,µù+.%§ã(ÖG™dn¶ú$¢0€‘#çÕòmqÞ÷Sïk3©üb–“j–_Çé׬nr¤ñ„i-ªo˜¨“¹žû;¢ŸŸ±üd_ï6ü,ˆ~ÐâðTtyLÆ3C°f9’ÝY'oµL€Í&±û¾¶Ù–átçj4} %Dùò)³?ëà"ß$E_µÿ9÷Ó—€Ù=¥u„ì”ü«Ñ©)J„Á~)?M­ìDdéY? ãÉdÃØqñØËqF¢á…{WGÉ›{’¹¶œñø¸ÝM=‰h‰((í?SÐ’Ä×ü|fÄq®iß0G¬¥ä…cÜ™©æ‹º£xšP S³²›²»ä4J•…‡¿ìn¥~ NmÅjøà]ã9_:§þ´»›1^¿ÛH™Ëòž7 ¶ÛVó´áPûí3Iwœ¨EòÊ×è·Ü¶UÆZ7£e$Ö)<)âøì¾“ø{?æ/Å{ß®eH¦2™ÒËd~@˜#=¯*®H‰am5ÀK­oú™N²éˆv¤ò®‰ +Þ –°Wå'O!E²i1æ€íòUCbH†¼Ë}Yº¼;NÏi%Û«7?Ôu¢·Ê¤ù_OQ:lNÌÌí|i’ú!æD{§>¿_>e+Ïà+RÛß·‹b“¬LÛ Ä/Š¿ Ä-gK´KµëÏÃ\1MMë%÷°wsRMü˜ÑÚ¾oÆ\ GËW”Ì÷P¡‘Žä6BŽNW§¾=ÌEŽa¸qñÐâ y‡ Ô*ÙŠxâ®›¶“Âëöàõ}ÌŒ !þYìůÐ2~ÑXêÞ_¢×Iv«ÝBÓ™p_KHORÒ§6ÿU‹ñósvp¶ñaf-û{µJ}®öƒŠwNÞDîÔ´R E«>¬±á‘E[èLäå~+Õ«¤ …{©æóˆ ÎLº%q#_!ÿÃ¥–‰"Þ‚þMÄpfrÌEWC%I5eÙ÷õ饜K»\™cÇQ©QH°’ìkûΠ²xF?=ÀžÃ—–ä1M^âÎ+Ψ„õUp¦E©tĽ€³Ð¶×ÕB˜XP£×C–´Šéyi½È3@Lìb®uípçvÈ:úÕEÈ/£Éú)–Òz\4o¿:Ó%mürÄs•ýS±,²n¾\‹ÚJ êyÃìBY2G¢Æ¨cý·¢gØ$ˆoôR‹ª¦¯÷ȆÜèšá6ä—ÓÊL¼YAXÞ¾'T‰"9ÌSe%áÓßb6²…ÍÞ:P2Û"XÜùŠl#%Éùä0™£KÌWH"|íg ¿n­Í¯‹cí[+’‡èÜs•O > z’kþflf¬ãí~Â03‘ÆçݗǕȑ?•îQ=ß· š[J #bJ–,õÚx6òVÞ¹¨çœ(¬H}õÔÁ7¦órÝô6Û®Ìv¡)µ›ˆÝO?ë[8škÐ:ü`öÞæâ‡#ʧhX 8B ‘Ñà *wù^eRón³Âùõ.â²Ò¬Û½( ¢&Èõˆ˜áá´ˆxHìB†N‚o”;vÝif%+ÝÙú´`uõ+;µÒKÊ)GÄ6¤šòûªH¬4àÓGÿµ“÷Ñý£{:­«–Ó™\ ©@pÉtΗY9e;Îúï9¯ÌQ]易²VÜÜ1Ea8uâØOzB%¤¯(qí&;£ö‰2^ ¿²l®w¾‘¨|Ò(ÈpÇ ÌW†ãW±rr[uÈt˜;Ž;²¤Þ¨pÖŠæUuø¿äÂ¥l4#÷•´©¾c­“Ï8¸÷[[Kà5\â®,ÒVÞ‘Ó%Á¶ñI¨ÈÛÕ´t’× `À6¤Ç¦Íbó(}¾#‡MãÈÏdݾú騣0seÞ°û«F?Èzõ)ß…Ç gn#J- €XŒÑ3úÑ6Œ¶nGM3 à8Õ,D†þ²„±ŸqƒË/‚M7.æfL»XŒúÙlªÞiZICO¨µ²1Êzy/Ÿ ^n»’O5Ôÿã£ÎnD±uÍ3–)4,ùÜ¢sh4Ä–MÄVioà== €”‡DCd‡¸Lì­´µûä;!ýv=GŠ’I™ªŒÈ¿í.²µ7\íôy½´¾¾¾ù3UàœÀÑ쀖ž íuâ]/^*^BssÝGÊêŒ_¼´eS]p¥Ô| Ï”ç³:8ŽZóåmv²_)óúyáè à…¨¶]•㨫FxÑaËf[‡ÛÚ/ò)7 ­8úçO~{Uœ]>øµì¾ä?à-öâßl–„sxõYW— ¹xÁÝ©€;æìÀÄÅý󻣄g ~íþÖ˜¦è梪û¤û1¸^5&þmúØpw5­^¨’šŸq¾Þ¬çp‘ÔK¤£÷>º»3Ö5e8Ò'åhXìZ;Àê¿îCóÔÞ*âx‘Æ ´)«”p&}RÙ´Ý ?l™þ°ÓÍçz&QÛçÓ‚Xúžú€€å±hDÔ¢i¡_ñxrÅ‘¤ õfL&aS½ð>”ÿ0Œ•/¼8DO»3¾-|[Ô0ë|Î)høm±Îàþ÷,ÏG'G¾ÅÉÑÑöÆo²DµlD‰¯µÎÝL ‰ÁÜ´:Æ™SÅÒ<ÑBntnâmу·¯Ãf½úr°ùK×5$¸!e2¢æ!QxÇØÍç8Ü¿Ñê*ðî=§¨öf…³˜â·äŸ«>ub‡`-âØðÒa!s¦ƒ9\Zœ‹ÓØ4"±¾ VJàÉç<*XÒts#a7¯ç2yd*¦æ¥ç"š[éï}Þã™–QÅÌñû1„;ÔÛk¤ÚBdNÊùpR;dÙsjFˆû¨ ^ÑtÞ2`OYž‚¡m’»U2šUªš‘a¶4$z™ÍO+³…ÎÌù¥·C±…)ÿF³i¸yޝŠûÀQKŽìŽ\ |¢lµ4ÁÝS¸p«á­Àö75Ÿ5áW¦ƒ!¸Np¬ty(n Ëħ™"j¹znŠ(ñ:›*ó¦§U3ü¹Cê¥jÖ”O¶ˆæ>-²*G‡;b)Ü#T󱵞›ŒxV5°Ï7æ¾ãçRp{1÷ ü/­ÎÊL‘›ÈIT„MÈ_1oY#gz-ϧª®2ü¿7ÔÞg†äƤð•- €—öÉn KÜ`táøwÛ7êÒd{¢[YAòwJ†T5)ý ÃÏeÕc7<¸Âj\yÓòf–Ž¨Ý ‰ûÝW*Û¢K±l¥”z“&‰” Ä÷\ÎÔõÇ.$IØ=©€Ú&ž3•’›ØEIF’rZZ!s‰ª+&†ª‚ËõÙ—‹Äåt6!u¿.PÓ[S›‘æ›ÀÀÇõ¥#n {<óþ£`Õëù¥[NÄïÂ8r0Óßܤ1ß§lôcßÖ¼0>ßû™ÛÁ©„âèÌóT­àÜWŒ D'c`üFõ<8v†1êãæ3Ýc~ü€*‘ó1ÖU>Âù’ÏC²o©Ÿ¦3Lvܵoã2\"T ¦ôB4ê|·bÐå8àn‚Ú) óe@^O¸pÙ‘`7BJfÜ^ÅK*Àô2ÝþŠcÒ˜¥6È8Iÿžœ—ï‡À4ŽyeÌéY]’¤þ`Ì€n¶ „ÉkäÊôw'Èʺ0kDììÇÝqœ¸øoƒ]àCâîü~\@ÛvP÷oȬ’ s‡–‡†·ÏYkÞ·Bq³:'éíððX¶ã#á¡ÿ¹‡Êð±ÞWå˜sÉQÔâͰMÂʢdoûx“ÄIY›1vîˆwœ$* ¼I†4Túöõ4Ä’}¨¸*²~Û¨Yp•8š•vW _ð1h`T·MecWiŽÍr©v8¼¿xb…[?¡Ì²†^›œ÷E¼ãí()¿=Šd3ªô/™´:“˜à ®­Åî^yê*q:[æ»t2“²ž©#ˆ8Ì;À›nòý$†c‹¯Î[?^3”‹G ê÷>Œ˜¨WœÍu@Õ€·zýÀ÷WÆÕÓ¯}9œt£r2ÈûÐ5hódÇJ™äÉ}Q® }>.óËé¡êòFZ ê &NÐVÖ+E%)=Qîb c·ì}Àüs”ðy&Bwªô@¡Í7†÷ ï0Ú?é¾}G ÎÜ\ÒêàÈÿ|ñêù |Àôbµ9·ú[ ýWƒvpeCæV1E¼y„Žfd/‘°Û}`_EÇé†SD÷&-‚Ïþ©ÜýÒõÝ‘QgªÕL©KK‹à·«ûS© îNór<Ëôn¶!ŸÊÛDD+t ‚äd®Ë„¥—Ë΢ç¼Ãì$‹ùСÝîÞ¯øWºa,ˆ´Ò"‡X£_Ú5UmîÑ'VöéO¯=D»óe˂ݿ•kÍvY^KÊøAÕ˜B¬˜á¼ìË@†3×ÁÀÎå­ ]¡›«Â=”V²wßS¿BMQÅÇ‚ˆEÈèG3œD—Y¡)ˆ%.ƒÕǽ5ÞÁ‘ÈηW_ƒïgï©á é™ Ÿ ×Õbã¨&,ïŒ~(5Å{ù¹0Ú˜– ãá.H ;Ñ»{žÞxÖbF‡Íð͘/u öÚ6¼\J)‡;æ"i|%‡¢©|ò$-8è»^fñÃYG‚è8W±è¬QîuûÑìœKÅÒ&”¯½¿9?ä>”vÔŒa,Ô̹Y-¿;Œ>ï;è!€%pvW©$œæ¬MòN÷Ǹú#z}ñ±ƒÃ‘¹6óÏÊ·š*Ô~WÂ-ÍøÀuÓ9 ”‰‹|ž,⬈¸£.¹1èž7·6±4®¸Ùã¤÷h¤PTµv´yÊbÂP>ö>(’v/u¹e¤kMåSëÄ•‡ýmŽLÚåç‰sUœÎZ±·¦÷i†³†1«x’ÞÕòY"b®Ée6‰=ç¾#Íy`íkÓ„F'YN$“;²zVmj›ÀÌFÝî¤tŸKYÅ×=±–Wꇞ*±E¥ú£ß&ð£=ßôÔ'yæhϦµè¦Œýðýîù-(ô3×a­{¨il†€ o„©Ž‘‰ÁâTžÝ(ÊÖ˪‹?m~Â`†ýq*–Ô!â$lgÐ]Q‡mN—$ä½xK.3’­«*˜¢ÔXà¬ÊÿåЖyR››é°Z‡–šzz/°Q «CÑa`ì<ÞNUÔ–1T…x¾ÔYqÏ|7nÛLiämB¨î‹ÃŠ<þ­ã~CS”oY:Ÿß­„¤èçõXˆ:¼T[F}SáÓY}гêå   ú5aß,Ã!e®›¶H-ñ]ÎÆ[Œü·yr†aîzâ|ÂDâ"ºu<®ÀÆ´–Cµ‰Ým„NóXyŽ‘¨"¾¾'ž76s1 2L¹a:b*®lê[ñž½Y‹¦t¡†ÑC½z6ûqœkÕVG™W×NgíŸT2@üÞ jü†vÉIxóJìlNX„Ö‚ßÑéâìî\b&6$Ó«‚0é&STrøW=ý´3«„ÃÛÕò[=Þ»°c¸öÆô²Etû–±¾Ù îÇŒ\a&×ö¿ˆtHËÙâ›…YIËmm´P8ë-|B½>ë)ÖÂS.Œ ònõ‹{Ò­Ù÷úñ8Es:~M%W±ƒ=ÜLì=Öò$úxmÑbÄ®½ïFJYRgª¶DtŸË‹?8ÎöøAùÿ þŸh`f 6qvu°3q¶Aù‹NR*endstream endobj 2063 0 obj << /Type /Font /Subtype /Type1 /Encoding 4780 0 R /FirstChar 49 /LastChar 121 /Widths 4781 0 R /BaseFont /IBNLKY+CMITT10 /FontDescriptor 2061 0 R >> endobj 2061 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /IBNLKY+CMITT10 /ItalicAngle -14.04 /StemV 69 /XHeight 431 /FontBBox [11 -233 669 696] /Flags 4 /CharSet (/one/two/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/Y/a/b/c/d/e/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/x/y) /FontFile 2062 0 R >> endobj 4781 0 obj [525 525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 0 525 525 525 525 525 0 0 525 0 0 0 0 0 0 0 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 0 525 525 ] endobj 4780 0 obj << /Type /Encoding /Differences [ 0 /.notdef 49/one/two 51/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 75/K/L/M/N/O/P 81/.notdef 82/R/S/T/U/V 87/.notdef 89/Y 90/.notdef 97/a/b/c/d/e 102/.notdef 103/g/h/i/j/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v 119/.notdef 120/x/y 122/.notdef] >> endobj 2059 0 obj << /Length1 1212 /Length2 7406 /Length3 532 /Length 8170 /Filter /FlateDecode >> stream xÚí•U\\Û¶æ îîA wŠÂ‚»»%ZTáîÜ ®!¸M ¸„ÁÝ%Á%Hiö>÷ž>÷±û©]Uë?ÆXãûæ˜s­b¢ÓÒåza ·„(Àaî\ n(@V]OÄqóðÈ`21ɺBÀîöp˜Ø" ‰ˆð –OO?QAQ &@îìãjokç`•eû«Hð âjo†ÔÁîv§§V`(@neq÷á¼€B:ÝáиA\=!Öܘ ÀÚÞÊ` ±µ‡aÿò¤ ³„þ¶öpþï”'ÄÕíÉ€õo›l€'“ÖpÔ` ±ÁjÀŸÔ O^þoØúÏæ P¨Øé¯öOêäÁNöPŸÿª€;9{¸C\êpkˆ+ì?K !ÿ2§±¶÷púϬ²;joõf …¸@üÜ<üÿŠÛ»)Ø{C¬µìÝ­ì6`¨äï8fýŸNžæ÷· ‰ž‘†¶"ÇmíßI-°=Ì]ÏÇàù§úoýÃOCrµ÷˜òù±ýŸ ÙýO‹·ÿ…@èø¤ëô>í'ö>éÂÿÀ']ç?ðI×å|ÒuýŸtÝþÀ§Á¸ÿO«÷øŸ\yþƒ¼O6¼ÿÀ'>ãÿ<’22po?. €‹÷iŸ\DEþ·J+WWÌýïçþédÿ7ÛØ?= ˆ7Ä sqn%îð¦%²"P¾d¢…Í*«,|´3¢)KŒûpMŒpƵu\BsNAà`_…Ÿq¬Z´¶Ø hyá?ä§ ŒX Â!f+ÊÖE;µ:4³@ü\0؋甽»H»ãÜÊqºÄpµîÙ‰R§¶*¦8ŽA®˜Ÿ»¿t ÛXÄÊ´fø–i^Ю–1Ø[O¹=R„—ÀK?“™e_=,Rô®N9®àd‰Ä¨#ÍfIÜað°yÛlŽa‚riòE”ë›vñ踇=ç´²4p„ÊÊ\úð©¦Pˆ„éŽeÑò6†«ôš¼¸Í¿„NÌT]›R+‘KºTžÏ¡mF‚Ì;sïG(‘ö¦÷xXÆDo±flÊ÷¾àºXë7òÞÎð‡ºÇÏHIÐZØRp„’.<ðÜœ™ž‘^5aª¢eœ ê¥Ë?êwîw-æ!+¨gúöO õ¢ßFbpëõ -Qíå–Ø&Ó_¬û‘¯Œ ÛfAv´Tþ8"Œ”qJS¨/çæ —û÷#ÅpWßn¬\Ñé%*úOöà@Ì¥+=úsö/êcê7w“Q¥6­¿m¨QxäÕqæ0}…=G®¼ì/Øi¥‚zº]?® {¥Íìã"°²“!# ÀLr«0ûùÙuÂvŒÊ˜St.õ¨Ú­uógÕùœ°(Rr'«˜kÂùÜCZÅÖÂD(bæíˆ þJtÍçÃLzûÄXÛ¦\]c™ÁÙ ÃwÉxkù8‘òþÎÕõ‡7xŒêÝ¥í3ú›æ0P0ˆZg\«¾+3Èú¢(”ó¸ƒÛ¯¶YùZ=ŽD(kp#ºyv΂Jƒ‹C{ö–aô½yº™úBÓÙ‘ó½Y¼;'œ-WïVo©ö;îŒWTEÇTBv³gýzˆË=Ö«y1qÃ_zh‡Ã]Ï8xåó²„Á­ýõ‹q2ì_Á5îp¿œD»JBu·mãÝø¬¸ÎìjÏ~Šˆ-½y÷¶/ãúoE0ÆÁ&£_Àž˜ØŽÓytDæ£ô]:ˆE–=#Ps†jõÕÜJ¶Ñ­>ì‚'ٻٟ´Ìj|¸óˆÅ^îÓ“aô©ÍØæìÉrº>Ñ%÷ê¸H­;uï‹k½ù;<‰“Ǻ㾬¡t˜‡°öˆÀë-6Áß¿­JÃØb úÍC…ÍÐ%ÐêˆÄ:Ò(ï/Ô-°‚£NÙÔcZp·jÛÄ\G’X/]kºPÊ<µ‡jB'1N[°©yg¼÷>¯´ÕïÊ„&ˆ­ë Ì…DÓ¶)å®íuЋ˄¬~yPŽ5Û;ç@loQôeCÁ0{Uwj H×;’OqÓ<ø º·j%öîÎ ± ݉ÁX¥:ümdÌm ûïõHb¼DË-]"ºÑ ™TDë*°_AIéq¡xµI?èsê«€ëo}+‘ ˆ¾z–&¤÷ä*ÎË/¿¯:ZËb»ÈfŠ\¹†ÜÊtˆ†£Îï¨ ¡ oAö)÷¸×y~ ñ¬ÌT7jv '4ê[Åïí4¿ æË ÒŠÓ›r6KÑ–‘±½û¦õÕ5çüíp_à é*×7'ÍfU&­Ú=° DRÆI?ÎÉ¡î)ŠUçÓýŸu’'D®„lU€–a’°ðErâÖUõy@mc] ÂABîÜR®? ÃèË5gC”ÊROp#•ò3ëQñ°j»0àÝ}Æþ¹š³“÷×ölr5™ï.m…ñÞ[øÜ»tß…ßb`¦{m´Ž¿64ÞzVË^*:ÒKs‹Ù´÷"?”ú¢Ù#Ëæ,\ôع(žñ“¯œôPuê"''àF€x°êk¸¬úøèåt $”0Ófl÷úQõC.òÑwÔ$®q¢˜\¥A2Êí¥¨‰0 v[X‡ç²¯çµš`Ç](øC¦î© °T <Ó1IBŒséæàæf)'Ïãî{ŽòE¾Ðw–røýa‘›Ü);[¬&̇œ‰Å£jXÜâì~JŽÑ*²ÌV"PZ¯²^ûy'xÐ|öJ>ÆAú&ÙJ7yDjå¢+è”äP'ŠÜ“嘆*¬1º>eqæõYÚhÇîxÜ¡§4ލÝZ™mÒ Wt–m#oì/K–Åt¡ Ö†©Ûv¸SY£q€WÚÃ?b§Ê±»ŽO™a^¬=ûxŽGÝ/ù5g—žKÌC߇Ó: “è†1J¬˜´!IÈF£©«e‡z¬îÇL°ô hÞ2ø[+ááZíž;‰u&¼ûñù[ÒÎ×TŒâ–,aƒÐþœŽ.³ÜäÖ#M’w›v:m ø¡f\ÞÏ{5å§w€æ|G*¶ë»Úݹ V<ìíêrÙÁÛ3,G d¨/ÖqçUÒI‘ˆ™¶†ä»Øåå·,¥E vl›±‡æ„ôܘ,¡u_kq&ï޶>ÔŸy›+U(2ÔªŠ¥µ]*“b3¼»Öòº“~%ÎÄ–Ÿ\‹A¢ å;D¾Í­àY‘Í1sÑXáýa£ûîØÏ×l¦dGÛÌ©—¯HÉf¸3E¼¾ö™ãý[’T€®8ÆÏÄ€ÓTQ—ˆc/½Ž<„SI£Ö«+véÙçw4í]vÇB2l<ÄÅyRŸœõnvhe7}eÏåñ®2.s³aCªìݯõ2_{:È|533–¹ÇйYH[ùuŒ^™*bœQ,{•î@õnÕ¸ãuǿ…;—ëÎ §b&vœºö“Í †½roõ¦HûTmî5–)Bf7™—`‰÷´zÔ-G'Sëròr´s+HËKßnbÅ;:?}!&盼šºOr`™‘9>ÑÚ|`%͘ö^m?:YÄ6OQvng~ÔæUÂKm1¯éâ"ˆ» Á•Z°v H˜“ê¡óœLrP•Ýì®]âœÁ?Ù¢’çšh&É:Rú1ØqÙáõq¦BC’ÂÓçŠk}wèó "×ÛcKnÏ+ål{ïGÞ«…öß¼/-ʼbÚ‘ìt›-0¿ "oÙdó¿0”Õ‰dmš/ã6MÛ-X\=R ³¤³(®ªYç­S™ùꃷaUµj,êAÚIjZa, ]ƒþãLv/š” T @)o„Ýðxñõ%%~¤§Ûe³bY²öG)S·Ü‡º»V,*FóoѯQS–ñ±»eibçäƒ}T(“S¨? ŽHífO’þú@õ¾qÛ­‡®þ„{6¤¹Ÿ>‹ÙFÆrn²öÌ_ÉáxÆŠ¥qõ][  êÜ_ ‰îg°ÜM×3F•Õ2û‹nwò¥3µ}K¢ª$̦(_IS¯ÀAkÊ´Ø1Š 4f«‰Láͳ¨dGyhcúy÷¡%>Ùs •÷wVÏd é{.zÛ×1f‚¬¥ˆ„³ƒ8DŸÛ/Ï_Õyʼ{öiñyW½´àj3ÒZ^kRA•äí,üÍÆ.1ý.óçÄBvßÕ\sð„ûyõ q é{‘¾ÛK֫ꜰÀ¤¸hB‰‘ ÑïU¢CH•Å:^S&ä½mnÞœnUX;Sà†í>ik†. …#NžË¸|‘]å;…ßT›_,õs¹Í ÐÙ_æìÍtµnð;ܨ}y –ÞÎ2ak0§zÏgq¯Ažç€¯ÕªŸ,ŸCDl÷šœXÙTªc¨+s8*5“¯bVoù»ÆJjÍÈ¿¼ ¾¸ö?ÆÍ‘[‹–)[ NÛtf çê{ÆÌÚÎõ§bލ·‹ß¥àð/têÊ4Rš¸&w1`_¯É3ÑäÊ÷ÃãúXKåÇÑÙ²#ÚèÀ: N_ˆ¸‘i|ïÞ/MHú·}+§š9ña³Š4Zµñ­}Ö‰·ØüöYvB‘6)@âÇíÏuvŠšN¢ô¾uëÒ«¨a©ð_9"×B†• ȪQV»Út»\9ÀFy;P«ÛÇÕ!—æ»ã!ÊÇÞÇÏÆSÁbS¦ „‹é=ýÝÝ}ë?· D&·8MĽŸëÐ5G-¹§¥onÖ=ämt4JM4¨|"Ìéc ~0@ÐÈ,V-ΫçÄîÓqÇÆKyãÙ|T‰,Ö–{Ìîj¾†‚#÷õ«b yNö„·¶Afû`J«ºu§úûX•>«tÚ²h¨ïÃŽ!v,f0àëåhȨã ò‡_f•nŸaÜ>íû{ŸÉ“z…´8é!©+ÿ³ibóLUóÁ—|å´½ó¼.¼MÁBc¦ °2 Ûm€q«é­`%CNZ¸S0¸^•¾ã¼YŽÎ‹R‹NóÄÞ´G¹én¸å›,£²ß= æ¤ ³ÝY+ø «‹ØÚ-Þ7ß6ó®NÄÓ´§ûbæ!,êñ<ý¤{JL¬Ì•®Œ˜­0 zÿI»TG¤ƒ °¬Zfñ¥î®…Ѐ`Itðw©~]dó ë]vS6‘+b6òêJñ80î½q)8œ¤Èh>Cÿcpˆþd3ë`ÑuTG×Ö9x«Wý†‘AòÅ¡ôìáÇgZ£{®¥´ŠŽ@—Á(Іú##šr%¥8¥‰öH/°‰‚]îAO û JvŸ¦ÿ­+ùæ6‡ GÖgJ­BûT®bàÆt”µ¢î1Ú´ r–/Ý€cæŸxßU³ç¹R܆ô¾v]îUJDmB“C*¶ô–öµ?™Î¹5Ë_­°!ý"¤r•ÀfqÍ.QÉíqsÛ‹ì-¯¶× †öªpZjîðè– ªÉ—†÷ffšp ß½h;ìÖ¶¢æ»Àõ™Q4•(ŽÁq{/¯Ÿ_">‰÷¡™w=/ÖIkf¡ùåï`ž³×¬xkÈ»ÛÚ„›?ô¿*KÚ+'÷Âù!îÉ’_'êÄ9³÷Û:# $÷‰Ët#fˆØÇ÷a5è =“nT9âòë$ç—ß–®› Û.™ˆyA¤”ŒÞþœv@ðH­†uѹZ ;dZ„úhÌÞrzìÚ9‘ªŸ¬ð’` qòvæ­#ëÐÖσZÁuëÐîŒ3þgÌ›òŒ…zõ ºCv/V6šÎ­3{"Êı­ìúçF¡ûòÂt¨g¢¡_Sê=¿±e-#’¦J¨QÖû¥\Xåb¿b¦ö¥ŽYAæ*„&».ê$£Õê*žÏm~hú½¤¶E O:ø¡ÍàÈêb:–y!`¥]Wôó¦]ý -–ÄJü€6]ÅÞG[‡þM!q_Ãò÷£8¦È)wô³Ô¹r#Ã+¸eL2j÷záy@ì,Éø]Ñ ¥ñGk.]Ù—™äŸ#!7¬±="$¶Ÿ~–—+Z!d3…Ñ´Ñ_§Mä)á5Ø´U\‰ ¤hå®Gâ:œ’l¸Í0øGÛ4/-™gÕB$9ðŒÊê‘,¬zHC˜ˆ¾àÛº½ó:{Ù7‚*iÐZ§péÐù²Õ¯¼É¼}.˜™ŸHjZDú›¸¿Uˆb„§$†Ù2¢÷ yùúô8VŽ(ÿOÿŸuFÚuÌKÈÆH6Fe„ã:¿.?íÄ*sW)¢½ÿmn­U(v+SÓÄg]Ê8g¤tŽÜžÜ1ÊÁp·Ô·¾nd·¼¡?üþ\,سºÒƒÒ©w1Y¬Ðüq¹dêÀ?ýíöîÐÄr]*æa+YbÔâöÛ“òfÁNð*ÍØ±y°÷U!ßFO±äw B™úÕYL“yP¤Ê˜Ì§:IÙÜg6ÜTÔüõNñ>y‡jÎY–¼THÒŸ7Ñ:à·Å°ÑI_“Â:}w¹[›'ôPB÷˜3Mxø0o¥6–’]ö€DqU'Y ‹ÕÙ†’ÙÏŸJ›LGçNÞ¬éÙ«]ÇRcv±ÎáA®0äß^Îxn4¢äé×7$yfî½dZðšÚ÷=íØµ"Z£Õý {ÞÀuºÒÈE܈ÈàÇ ¡yì |/Ÿi¬ÖgIÊÜó¢f]7È'Â_"^!§zæ†ÈṘzdÒ„‰ŠFá}iw¡fühäR2­gè‚:øñp)´%Yo-vxàô[샞áY¶)Òœ -òÞææ¥ðØ»¸ÏM‘¹ó[H¸¤ÀާPŠÇ)A[ äÄ5´$´ŽïÛQ݉¾s»ø³cT麳’K#øêóUÃÆ£L“ž€bævl¡•O:ŠÛêUáLA‹¼_vÄ_¢Ðý_ð0÷'˜’AƒÕ/¥ùð‡eœ\øYe8}V|5§Z¼C4vlǵìº,Qá„oðÞ¿N›mPAΕ°µÙ¡k6šŒoï?£aWƒ#0ÏŒLÏÉÊ»5(l9®k4û:[`j>½Ìwæ¯u¸Âð"®~‡ªà{ü3K Bƒ»«9mõ!@;hÓ¯}Lœ$…ÖÐî'"fvY Å ¹ÇcÑï&ƒ:Uõ§½í_”D…›Ò¦v3ñçƒe´ vÎÉ¥O²¾ðòõ¨×Q¦TàV£‹n¨Ó6Ô0 ý# “y³›CÔ¼¬>uü¨a‡3ÖCj®²8ÓQÊ/ÂÖôƒah2q¹í ~'\ªú1$þˆ.gë97à¥pÉ‘`c» \Ä.–¸ÖWq°ûù6,áΘ¤3ž ¿Ô@bZFÖ»Màîu—‹™Ï'ݱòœ§â9jŠ¹Éž[´ü8Jf^tý¨ÆéBˆV%ðwL2aFÄZ&Jɀʴ‡nw?§QxO]øg_Ð@ºÿnî…äíýÅébƪÂåN$fÈÐ*v%¿D+o}K¨å µ"Çæy˽žâAÏFGµ§_"a#ª~2è| ÿegÖà˜Î½Óè,¨Ã¿½§RjäC~ŸŒ2…H™È¶‡æ®ø¡æ3pÞ*EÀ«i¯3V³ Ÿ:x†·3ŽŸÎÄòFK¼'^«<:¯Ãö¤ENšD§WƒéSÆ8½÷à»Û½½íë%3ŒÑ=>£Ö˵ª¿AøaˆßHJJ‰oˆ¾Yª~05n51²ûÞŒA·êg1ê›W}…d71•”iP½á»Í‡¡jPâØJ"œž¶iû»baœïG¡S³dð¸ ZÏ+Ž>ž“j;ý€íaòż-Ìþ{„@R’Î<Âidÿ[¤ ?$ßã7ÏÌDë5 {uÌ*åÎƒÊØ#š8‹n}¾ÝŒìvª©ô²Á‘1œ^"•ކ,ï‰ Õ's|²M€IulEø'>ï<»>£A ’#•ö£Ÿù$×ݵϞ¯¸–+Æn¡‚½¨knÖó$?Ú¶<ž vÐ)P°HŽ9 ËjÈ\§nô"[£6=m*Œåœ†¸¦¦÷Õ¯=X”OXáÚ¸Wx½ŸbÕø•yL“ˆí¯ÖÄ•®¯'Bx+U8øÉih’tK(³²´r»"êGþ>:5¨¥µ°8O5.;Ñzlm G^×MÌò÷Ýð‚…N!öZ¿¯„ŒÔbXíõ°+üšØ[EçTÇÀàãæÜ<¶N¨‰y 9üh;"_¤Šv‡^uNÔIMr ‘æN³åV\ 76.5j¥ à ºt–$Kì}¤Ì€¸ŒõʹU·5 ÁÀÄŒí€= –-Ï­‘^»7³N$¡°Ê>¾† P"XÆöá(Öƒ„?‰3XêþÄ»ÎêKâ`¸³¸'Å›9‹¯º?µúVñçäK#C²dulŸI/®­Ë•Ì~]Íß—][ß©ºÍ”#ÚÛÁï0Ð?Zyü¹É;,ÄÒ>ýce–ßÐÜ`³s‹ëról¡„†Üè]N:ßxrÚ6 »¿?vò} ç™6vaI®O¯ùW¼K¯„Ãïóßga¾Ý®X²g|µx¯“¤G‚‹ÏHgJ†(>Y`¿\äÔ…:ï ¼’CŠ÷Þ°:=–j›©(áÞrnj`å³­Ûš‚™µhhÖIj§÷œOòýqkx‰ íÒò&8å"¨ëGæ"¸°Z×øE¦ÓsjÐ-ñ¨˜‚÷_æø<¨ÜAå_ v¨_ ê ú&=4?¶J£á0‡Dü¨ÉEÞ ©SA¯’mŠշ΄¿µì>˜M¡Vo¦XþŠ€)æxsm ÜÇûÐ`mö1¬zÊXÏú#‹Ù½sdΑ”|+î‹Æ–y­go Í-ƒC O‚›iA39ÃßÌzâ™¶‡\à¹ó"ÃjñH‚jã¨Öز¯î÷YÑí µ ïš{ª¾hè˜+¡&)'á’«k)í·eÎ1äùf¼¶7¶Ì†¸-ð½2&=ëÒÖ=§)¦EÐ7F€eRŠ9•ïü“¸1µp#.Ù¨A-ÇÏ?„•*^õFȸ$s‹>›‡S+ŠÅå^*(ªòü~0ÿƒÿ'XA!`Ww¸ØÕóôã8endstream endobj 2060 0 obj << /Type /Font /Subtype /Type1 /Encoding 4782 0 R /FirstChar 12 /LastChar 121 /Widths 4783 0 R /BaseFont /ZTXNQG+CMTI10 /FontDescriptor 2058 0 R >> endobj 2058 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ZTXNQG+CMTI10 /ItalicAngle -14.04 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/fi/hyphen/one/two/C/F/I/J/L/O/P/a/c/d/e/f/g/h/i/l/m/n/o/p/q/r/s/t/u/v/x/y) /FontFile 2059 0 R >> endobj 4783 0 obj [562 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 358 0 0 0 511 511 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 716 0 0 653 0 0 386 525 0 627 0 0 767 678 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 511 0 460 511 460 307 460 511 307 0 0 256 818 562 511 511 460 422 409 332 537 460 0 464 486 ] endobj 4782 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 45/hyphen 46/.notdef 49/one/two 51/.notdef 67/C 68/.notdef 70/F 71/.notdef 73/I/J 75/.notdef 76/L 77/.notdef 79/O/P 81/.notdef 97/a 98/.notdef 99/c/d/e/f/g/h/i 106/.notdef 108/l/m/n/o/p/q/r/s/t/u/v 119/.notdef 120/x/y 122/.notdef] >> endobj 2018 0 obj << /Length1 1114 /Length2 4774 /Length3 532 /Length 5489 /Filter /FlateDecode >> stream xÚí“g<\k·ÀIt¢†D¢lbtF‰ÞÞ{ocf0 côˆÑ£…ADˆ‘ Q£&z]ˆèïäœûžãž÷㽟îïîýeÿ׳žõüÏZÄf`, G;"ÔÐ(¬€° °4Ñ51‘„…È@ Å"Ñ((! KI JÞ΀ˆ ,.}[\ZHŒ @Ðþ¤³ à†ðüN’”Ü$ Št¡X„;® ê£aHÖ_PrsŒ~ïðŒ^Œ.H&, À‘0,àˆpF¢ÈÀ¿…4QNh@âÏ0ÜÛãßK>ŒN àÆIò8E8åæÀNd`=4î,ÎäCêŸÅÕ¼ÝÜô î¿Ëÿ¾¤ÿX†º#Ýüÿ+íîáE`]4Aý3Õñ§›.Žôvÿçª&ꆄ)¡œÝ€ÐŸ!¤—Ò7@ba.ãø#Œ@Áÿ逻¶? À溦–ÆZ|¶ó5(…5ñ÷ø«èïä?XøoÆ]éX ãqï¿¿lÿq–* ††#Q¸y  ÔŸ 78…$ Žð~8_° ÅmpW8¡1d¿»y[ »ø{¸ P¿ã†Ä°®Khø_!ñÛŠý q}Cÿ&Iìø7I`Ø_$,$€áP#. vº€¢ØùâNu¹€8UäÄiº^@œÓ ˆ“r»€8+÷¿Qg…º€8+ôÄYy\@œæâ4¼. N{qÞ§áó7âþY°ßÄëÿþçü(+£ýÄQ@ ×&q)© ÿ–óÆ`(ì?&nÿÍNHÜÀ"~Ùøg4L&Â5½á~É=ÕüRB^|eç—õjß·‡%á»vk{òÎÔX•eÒQ..³úžÜôŠi¾kا¶êù0côlÙÇa93àÕM‹ÝL]ÿ¯ìákT¯FöÖÅðõ‡fzJR-Ÿwdow®åp«˜¬O±áµYûÔµ=‰—°PËt3Ьáe3¢Îð,yp;jÚ—:5™`úSø=×(’F¾Ét³7íQ>InÊ™=~”0:|zqa(¸ïgG¿~Zæ赖¤—ɬBRÓbgùQ£Ÿ:W§"Úü~@xRO‚ËQVJy kù×[×TSUi¼ns1M¼“ØÁ'á#¦?IóìuøtëÈ¡§1ÜŠâÉ‘óª”žàš·Ò;÷:j1%¾7[GÁÇŽugøD¹7xo0lÙÄùÜZOáxÖ#£îeí7jý莑ݩcJ_é¿=ïú.†%/à{ŽaÊã—%GA“ÎÔÎú¤ïrÒ¦œÂníY·W·­ •üø¡Ô!Ælù=J |,Ä$ñ@­«U%SSí^P#³ zÃÊÝþ ¬‰Ñ3¢ij7mò~ðÝÍksx _¿hVÁ¥Tk³µ"«ó¹ ©tiÏÜqíó0Ìíòvœ)_ë@žͨ&k8²®©q#ͼ2p*)u¿]4^ºˆ)s·17ÍæôþeÕ÷ôŒC³é_œE=®í=âØµá¥Çif¼$›ãwŸP,Ýk)*ÄÏÅ Óý©D*»¡þ²g­àL#][äce³Ü³’é… 6F‘fË=úky‹UWw«(ȯ!/¶¾t•­J×SÚö÷ KJS‹Ö•,Œœ›û¢Ëuên/û&M–t­F¢àcpYÝ.¼ÒáÕqÃ4Nߨbsàíh¦¦çþÎÝâªGCbη”g3n$>tWÛ‘ uÞ&CÄr“ò̾úfí—ÎUöpÓ¼?3ÙÕuÚR¶aa†¹c¯dVc¸y(¼9šÁì㈟˜àå4‹à 5_:MU  ¼ßùNsXº‡ó!D ƒ Œ _&ïÇnF³¨hkGYØYvÊ¥ODÔ@ÓÉéƒR4+A´;Ú¥WôŸ¸pK=ŠÑ™y{ýE7O+óø+¿ÂúåÀ‘ܸm0‘ù;É\&2¾ÐâE³b³ù¶˜/§­Øý¤÷5æUE&yZf6¬ž‡iñ9?¾çÉÖªÏ|°R5 iÃt”DÌgs‰ÅǼ§Óã¡tÄW £¸ûvoJj{?èÉ™¢gxÞ›«‹—/ù"³…‰}¹dÀm+ 5h¡xÕ]B`´ƒâç»JRï`÷Ë“KÄ:íÆÎF¡¸Öxlnáý+‚¾¹Ö&áÖ¥,rþùšÙ9óôœ¬ÉI6jµìÊÙA½ãØv·`=¹/÷ü’Ž!ù¢®éÁõÌ;ޤ ¾ÖÍ¡ËDŒ—èx¥ÛehÆ -òï1•ñï”Ú 'GñnÉAÏ`ß™)»e1n±ñ‚ŠVäæ Ì£hæØM-፠È}‰9Ä,iþ¶cMS-kþNuð¯¨zîð)ƒÅ’SzÇâݤ¸[T“G¼o ìģ̮þ¨›Ðk*pY}µ7ŒÑá³Ô1O·wq½ÁZ÷þ0þqÛ=Í’rPL;¡¯)Ó {éÕvƒEXƺþ}›€L©±q`Ë™$MGøQöÌpŒðø4‡6 q^~ã;·ÇÉW+ªà"F¹®%‹¬ ™…1üoùhöw¤gÓ×…˜Ú ™ˆ–ÆÖéÂÖIìVÙH|îÿ±ø(öœÉ]3lËÔn–h:ÏàJªÛJè$ySF0£=…kÔeMÓö _n÷¼W\$¤ñT%¦¥mÞM¹ò‹±Øˆ’P^ºª9Û8ÙñäHàͺYý˜LŽ`RX¶+V³ë‹/²ÕРМ4pW®1<¼DgÍJØm})Nr(ïÏÀ\\¿¹×l¬_ª1Y¥aë]!ÌK`ðä)1X®gÓ0±`¥¾ÈXGîz™!f'ñ*^]ófs WrA,I¦ø®I²ðbwIŒü%½Û1¾v¿¸©h“Q~}5ŸÌq%ä­˜ýú\–DñÞõ!ã‰Þe8ˆfl$ÍùƒkÑe¾çy”¡úNϽŠÌ­b&ŸpGÝ:—¼±¹qäÛ:om(–‘ô…• äÏ[%eö8¯¾·^=Ò¿˜jÅBûvÒ-KôIÏoÍ–{θ’:ú œÎD*pzÈQ„ßÅ©«•äæ•÷÷çï¼U°Ï))ȱ×Ñ~xéÛ.—4©âž<>]NôìU#ó ¦˜hôÓÚŠˆ8Z„/¹Ë/.Î)àab޼ü¢Âo œEúѯ ´¤aÐCM9X©|7HS“_‚*ˆ—И,;x9bFä½—0{Ϥ1I-n›ÅrFßBAIyïŸ„çÆ“š¬¼Ë?TbÊRnÏ by0®RÞôk£©&sÁ*:oÐõ%-mÃBïÑ’Bñò©Èþ·‚:üGw†•ß4p)Àk-ü×Þ×ó;:þ”ÇÏ¿?òþ~̵Ùû}~Gc«Ù*¬HEê›T÷xæñû‰y+Íúöjú­ë^󶼡«0æ´ðêx{ó£c×`­Šà;ÕC›¯*Ói„V߈=ÐÏlJÁG51©ŸÒe“ë~ºû‘zp˜V§˜úûØ'\Úq sÈ^γ;‡ÝÑž±Ý-•ff‹üZÛ¥òQ2Ìp° ÀâOù׫ç™Óõ…ïf ì"Å«ÍØýèD¶ä ô’·û{bÌHŸÍ؇v9Êâ*I¾/€ÁV Â.çX]s‚¤%8-!]›©‚¸ íe)A¡yaA“– DùÑésscÚ—ùˆö±„.-ª1"¨}[9ÉK¥1×R*{#á­æ ½Ûe ªy­öHŽÅ1þXµ Ù$O‚`îÃOaìµÓÖÔ6”%ËßøœòII îLò„}'âqö)Ì}gˆˆ‰X)žêT¦ÿupôëùüaàìR>É;#¢–ÇA/ØámžwÇ(_± –U—û’£¡à þy\JRJVecŽß©›r¹Ï®·íg “2ã`HhÀKZõð>0"·öæD§£sûtIFIâQçéaÁ€Žb¸¯E¯S•úPÁ‘³ÞhDФ#VNFY’`©é K𞋺oM0À²ÅË oÆ(Qµ¿Q°‘nAè^/ÙÔ´€ƒ'O=šIé¯ßÿôðcž£Çù³Ñ³C‰m®OÎÈñ¦Å¢ûâÎÒ¤­³|Q*IÁ¤ÏIÅ-¬3g£å]­¡ûüÕÝCùÝÊÑúFˆvý®êŠ=mCrõËÍ=9z¨O È¸–É6î¡Bp˜µB[TüÝž:üMéZ b¡,‘ÁO/žÙ‹î±‹6(Å/ܯh—ŒˆzÛ$Ç[ #OÛTÌ ž3é‚{•wòŒ¼¦ëJä|ÆÜÊèn7¥ÖjzEjÖ’B±âÑ•¨áŸøãÖH-Û-Á]vý;¶23©ÅúuÞ¬ŒìF®­óü`XÊÚ‘³iï’ycß^iy¥ëúYâ}‡¯ä´dò4ØÖÙ#ÖîêÍ›ÖWWO>ÏûtEuX¹63«Ò"ô W9Å@îÔ½)GpL0Â.Y”vñ^õOdŒ{¬X\ ‚³íY\g·±É`”©ç°Û#’7¦Ú·öŸ/¥ûòÐ'«íV ™Œ(Ýo½¦àÌǰ.ÛFú‚¹ÝÏÆ± =ì@èª2ãøcù ëTL)]íý3 l1uÅøÙí§}ZTÍ­‰²Ÿ3è@3á\ZbrªÊ¼…Çåš¶ƫܖ‰›Ñ}äPm†"Un°áû]]­å„¡ ‡«NZ[¨ƒÂ¬ã~'õnÉKßSfçœê Ê«'ø×ûÝËðއ~ž_º<“P'Ë…5à*òWü´$ûÔÓþ—ŽË³‚Е júÇÎÌÓÃÓƒ£ µ~¯êþâÄc.Ð[²ñ¹ 4Å h>Dq+“Ö±½GwßÑtBcÁ7βaâ½ñ‹ZZÛ3¼ŽK‹sºÎ»÷ÖàÙ[óM ËîÐWÖ¡Œ´'â—Ä´sÚ耶’•½ÌÈaÆ«èäS=šŒýÉÄ×S vÑ‘|Vå˜æ‘ˆæÙ§$½W”¸7DÊó_} œ“GÙ 7µÍ?nx[ÅQücweœ>D©îeØ„Àâd-h,Ë/³‚ŽÕËgm‰{cB£_6ž}Í Ý~Ñ— 14iØF׎ä¼ùÐa´#ç"³¼ßåEqOZ¥ÂÆQ$®0ìúz9ó屦^©îî°¼ü¶NÕT-Æä‹ûª{ã4—’TÌízYí—"øzr;[žZSÅç ©¯p´(xÓ7t`¢•_—_\èX-Îëõ‡ŒË)Ñî|«jÃËôe®ô ë7Z6œ½yÙÎÖ³)·?èÔ͉MÌ”´c'šgæŸ3òœ¥gô |—ûڃ릣S"yJžÖOfû]Ï(ŒÉ)çì<ýë¼ ¾ü¥#»¼i°s´!¶»CÌ”wÂyxlûô® LÖjÿɸ1ù;] äûxm@9£š–`³/­…¼"Ùí+ÎYS&’«»b'Ñl¦±í°^ºG‘º'™•5×±ŠGŸÛ°‡Ú|OÛÍTz_'æ—¯?rÿx­ÚãÀÃa27ÔWÿ:n 1‰hî³`š¨$Ú•6)L¡(º¿¶>®\^‚tÆ2ïgÔÒ?­FNp}î½–­rWY0P˜©u^VWeÊPî|~{–‡¥I¸åú«ðcRsð®Æ{û‚ßî¦A\AN5–xnzìÄ‹Wç=´ˆÕÙê<–¤æZÓs2Š·zd#«ÇFãº+BÿÇìÿ üŸ(sC@1X´;s‡ì_É%endstream endobj 2019 0 obj << /Type /Font /Subtype /Type1 /Encoding 4784 0 R /FirstChar 45 /LastChar 121 /Widths 4785 0 R /BaseFont /WMUYSJ+CMTT8 /FontDescriptor 2017 0 R >> endobj 2017 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /WMUYSJ+CMTT8 /ItalicAngle 0 /StemV 76 /XHeight 431 /FontBBox [-5 -232 545 699] /Flags 4 /CharSet (/hyphen/period/at/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/x/y) /FontFile 2018 0 R >> endobj 4785 0 obj [531 531 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 531 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 531 0 531 531 531 531 531 0 531 531 ] endobj 4784 0 obj << /Type /Encoding /Differences [ 0 /.notdef 45/hyphen/period 47/.notdef 64/at 65/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v 119/.notdef 120/x/y 122/.notdef] >> endobj 2015 0 obj << /Length1 855 /Length2 2276 /Length3 532 /Length 2883 /Filter /FlateDecode >> stream xÚíRi8•ë6FKªU†|ˆŒ‹eÊP[ÆH,cư†‹5°ó%»D+ó •h dCÆ ‘cmI†ÌSg©³wû´žóë\ç{ÿ|÷ýÜïýÞ×ó<¢æVò:" 4$(òp\Ð3µTà0Eˆ„„ DR°D‚>’jp 8 Cu”¸š¦²†¦¢DÐ#z°î@JOzWtÐÁƒ$,IL‘Ïð@#q€)0@‡,woK ’|A ‡,š @w,¢°›Ç˜àFN~§1Tï?J¾ ‰ÌH1BJŒˆ"`@7ˆ‚‘ñÈHòßõ³¹!‡3Câwí=ú[‰ÇâþU'⽩˜1 ‰ð³ÔüÍÄ`©øŸ«Æ$‹Ö!¸ã@@ñ;…%býAŒ9–‚öÜ82ø ˜ŸC0Úö-‚‚žŽÙ‹³²ß¦ù­dŽÄ(ÖÞšîj¿aøÌè ë8*Âá !ãüñwñ§§ h"K`¬ƒª€$‘Æ^0*° è€þŒ¼ 0‘¸0Z¸IÝaªh D¸K~ÃªŠ€ÅøÃ؃þE¡(¸©¤„2ƒÀúþE¡(ñÿĪ ú‚„Œ ð½ù»Ìß{§«Kô’g,¸¼#®¡ œTU ù7!šJ"Ê·µdLàì†eÌ ýA4dx€ˆÖŠòL®¸RjÓ]Ä.ìë^yÝìQíëj®È¡f\~›‰ÌèC»{©üÜSìS"~[‚ä_«‚-: ç"|®§ôïLùºN¥>´[L5 ø‡·Øjä Ï󊾥OªÌˆÞÑöÂ$ûÜÆ;óM3YæRúÖtŽw¢Lu޾åuiQj'í Sq6Ñ—J*‹ZHñ)¼ª=âw éÛÈ«ÈPÏhÎ'²oˆUT¾ÎÌħ¥éÞ3އiýj ]ýƒxœ26ÎHVE$.ç·´§Ï¶6îÓ´»•+$¯§úNÓ‘jOÄoô· —ß …]z×w¹=+Dà뺋îñW¡]“N5•-ÍÁb™B*æþ½ñ¿´¯±u¾Ü1—ØØÏÞÑ8WÛ°Ú>Ë?2vMe’mɧi¦§,Lþ=­Ê‡^s5• =çÐ:ròƼ҇@µóÞ Fz«Ep}þn±%u2—.$ôξåî „ùA‹õÎOãÕqÄ‚‚ïËVnÈpç©Àñ‡,˜CÄù…öÎ8ÏX[²xänœB«?Ã-œ?ýáÙâGUi‡¡c”߸ðWWßLËÝzŒÊÙÓh1í öWÚéd¯Ä±rŽÔwÁfódÖuuΑ‹ÁŽÕ›6ì©úí¥Q¼øÎSsvâû­ïá( Ù¶[Þš¯.íÎKÎ[ ¯Ø39—t­&!o¯g8¾Â¬ÕM­02¹W†’«Tñ¤™8O[µŸ /B›lI%Æy›¼‰oèQµèØ‘=õ"vÙ€e¦°´/-@<ˆvÎn^¥8} ¶ŒPL½è™;uun"³èA°ÃÔÉõUVQ¹¡)ÃK¾Zááf›eÞ…ݾ¨Ëƒ{\ö&ëÙÑuwmÁ¾˜,1}ºjÆ);G‡À›™…x6nW&wY§9ˆÇwoŒxÝîU.ÆJÉÏË~Û÷žSƒ-Ø£¿D«Ç¾[plIþ0¯`m´ÉK/Ah¥Ò7yËT»|œøŽ< ð޽33ág%Ø þKõ‰ZswÍ›/ ÄVieŒÅÜ -âJ2ÖJ.ýØÈ:ã‹u s€cœmxàæ™¨j‘!h×FC=ë¸ ´f²ä- _{+w[îA#“ãÒ«ÒøGY¨Ï™j¾#3aõ×è|Ͱ좲à€ò£àå Üv]Lµ“²€Â½Ø{.…ŽïJÎ8tpå\;kêÁíàã>ªea—ÞxÏÆª%ù‚b›çÚt‡™Ÿ»†±ƒˆÃ£‹ êÌþùä¹Ùeñ‘[Úý°ìäê}BKW*‚ŠÇ…™ _k Ä Ý“¾‹tTOõÔ Ië¢:tj›ðèY7ÝcÜòEeŒG‡Ã¹‡œ¡*ùñþûH c=O·“ënàÕ2;þI%š~¬<™lðÈ™óà¥gZ’¥¡àâ¯dy>ûÂ'bîP¯ë*O0Õe‹\¨cŒkÛÏÄ ï´ç+!_B¿øŒÖ{{žŽÞÏsh£¾6þVX”ðDŒioÁSÇÍØ[¯-×8ËjjmFŠ M‡è¡uY›òX”°ñŽ»§)r‡ñõÝuçlJ¼yßšE,8‹bc™¯tì÷H< Ðy~?:Ü+GDs°h)ŠÊ:kòeÚpö2öÍh°lx¶Ê²³Ñ‰¹ë/ÀG;ïíï‘’ÚWº|Îqœå¥‹Ç7b i(sçÛ MSËâ1­²%áÒÍç*¹|£2è ÃD‘½js#Ÿ\ŒØéК®·ê‡¶!2ܢ譛VYxÚÇÖ-k%ÊÝ£’Õþ0‡uHºÉÁÏØ”y%%r†rVx%oïêPöH جKµ]Moms³Ër‰´><ÅE…ª $|ØæŸ¶¥±¼™÷® m;°qfÌC*+­ ö³GèÅ9éK§ÃL,‘Ç oó¦áÑÏû"áø S‘M_EÌ·'ðù«C.܃)-f“°>hñWÅx¹XDL3û¢·È'SXáYû铳Ë#)žjLi7N‹O†¨õ•íùzíxïmM›bžH âøAþoð?a€ÆH…ˆG’¼ ÿ}{ðendstream endobj 2016 0 obj << /Type /Font /Subtype /Type1 /Encoding 4786 0 R /FirstChar 49 /LastChar 56 /Widths 4787 0 R /BaseFont /CANVQG+CMR6 /FontDescriptor 2014 0 R >> endobj 2014 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /CANVQG+CMR6 /ItalicAngle 0 /StemV 83 /XHeight 431 /FontBBox [-20 -250 1193 750] /Flags 4 /CharSet (/one/two/three/four/five/six/seven/eight) /FontFile 2015 0 R >> endobj 4787 0 obj [611 611 611 611 611 611 611 611 ] endobj 4786 0 obj << /Type /Encoding /Differences [ 0 /.notdef 49/one/two/three/four/five/six/seven/eight 57/.notdef] >> endobj 2009 0 obj << /Length1 1077 /Length2 2581 /Length3 532 /Length 3300 /Filter /FlateDecode >> stream xÚí“y(F>É"¾¶ô¹zwq¨WXJÃ-Yã9ƒgù/Öm–á¼xÕ½}¾2òB“)a¦mÀÑ+ÃÂÄ©v’Ì„ý>àÆaûHÁš®“÷z^†l!~–p9]ç:¥ûÇI幸¼Ðq[ôµ ÈtžKÈþæ"«S°|ø¢£!¦iq&Êæ®‚£ü£1ÊŠÜ#MçTi2rHgýíÉJÙLJÆ=JŠQ'W_ È]‹XÊÃûgTœSØ=u8èúÓE™„p¸Cyš÷lîáÞ;›PÍ{žYùtYȹ•?íÄ.[H­¤$¾CÈLLë¶övØäŽEðˆÈf†¹î«€%¸à1_ùîM Å? Ô»‰`zï~~6Ú‰?EԦƿ¨¯{NïÐÎÆ6IÉ~vt0G¾ñÎn¥V„ï'NbÿáøÈz‘z¥åŽCWůô£`ò­á™øû—x£ôôµ NÁ:©e†] íÓµRôí8Ù›î4_!#¡W|‹Ë1ÒÞ¤ç×»x;ÊÞCŸ~Ò ¡hÓ²þÐÀ‘óÆaŒeû-X;ÜyGß[}#“âšËb‡mÝÑ1ëúè[sÈò§wÙý)ª#á¤ÜøÇ˜÷âÖSJ7v<˜þÊ!«ëVĘØ؉hÚ@ÜrRBƛΠ‹Û»ÄöÜù;a~ƒÔ»GŽÑ…ÚÚ‹)ö®’µg¿ ‰V#fºëòdZÃðLµ²ºoR7vwž!Äã–o?®Ç9d§Îq'äW2¦iVsŽ"#Û!«¯ógkµ~\¡‡ÖDmró>#‹øºßFLbÒuÅiËiÕï(œÈ’ÌL¯Q$MhÔz)^ëG›Üï»Ñî|ŠÜ(ec±©OU%åð°ç‰ªÎb›Ï™ÒûÆÅwÌ"_¼¢ï‚]°Õ´ºá“×ÿrR€öŢʶ|gEµ„!áiD’؈nŸuµdy&ÿ ’•È0îåD]â»n9øø“Ú¿“¹å{ê8fÅ‹]8-0Þ¿ªfï;~S¿íE6åCÅ%Àñézˆ:ŸƒÝ¢“9´É™ïœx.üëíÑ´‚ù|ÿ&hR#-5^JÈsÕqñ³i“¦­*«¸zKJ™PÍÕÃJ3È^‘ÇcGO6ƒ<nò‘°…ÙóëÔ•_ Ú 4—dŸÚ{…úfRý ºØI.ñUksÂ'¡ƒëå Ø'4ÃŒ7Šô–ÜÃ&ˤFˆ›+z9–Ô›;¸)sæi|Ï›ÙéjÆý}eGŸ*—;o3cïõ¦4ͪŸ)ð8ço‰jÙ`Ó#vËáK¶]Lq³êæc‡*ÐÑ=¼ønE=)—øëäx˜Úv‘q÷LÞÕkLMÃíůK\fÅ=ͼ³—6ÏîÑÆ;\kŸ ñÐXNŒJ¥e^ÌKPœHqŸ¾všáWy\Žæámñï¹^h#ÌË$nßà%ð`XI;ÇrX[!•´#ÅÊȨ'ù¯àvjs–1—Q¤úÇÌÁQþyµæ¹`ùRçØþjqpn§]Ö8®Â9m`ÀálýlªÞzVÒ|×"ú‘Êð‚™©NŠ]36ªê1$·X`ÓOŸ=x%wPÔ6ݼjÜÔ¶MÀèàŸŒnÓ#;U=¥ ïË74zŸ/¶3Ûo´ÿmSccÕânÈ3ȼúÖH{Pe®YÌ–±SŽï¯ÌñæÊ.-š|½RËÁ¦û­Wù€¨ŒT”pÙöIþ¡“þÇá;JÞÞ¡¶äxtðpáª@Óf÷Ù•¿¤å{yqÌÆóÿ¶˜²)îÉÇ‹˜<)LSoS9f‘Ða¯©p*²Õ$YöÔn¨Wò„¶%¤£»½¨®GJ7ø«/Æíyo3ÎWmxÔ¦¯æè§ö »£ƒ¯Éuü†IÑÕYƒÌù]ÞF¾Í̼§² {9wǸ… ñóc xœ4Ci<¾Þ]é°~[Œ:¬ÿ2ûýpzÈ% 0/Ewóå.%+3¸=ÿóƒ‘#c>)©0£Îm ™³ÿe ;+»&MðÐܱÎÇ;\òËNdú/>}X Ýð™pVHpêHC4áÕ^WõÑð÷ǧI÷NtË 3ÂÏD «‘-C.Gj^µ¥°‰h•£˺ü[s òn&aÓÔ#w Š¿ªÕ„{¤É%{ kÔ†–·G¯V*†Ÿìô«+ÑÊÕ¾8«Íšº0r Ñ)ZíIly8³ë”éGíV¥—VÎDõºÒ.5Ïiϧˆ„=—Ÿ¸¹h‘³êj0iZ–æÀ6©jY¹ç¤Sô¤@ãÁ{°ì“Aź³8O^Á`…Kø§«ýµ™uŸ·Ál®WQîè6_,œn(>8fŽÔj’‹3ô‘;'´]©2Š´Ë<ë¾#kV½¼¦ž÷Ý"Ô\”7¤Ö(Sº\>j¡UbTT£.f²<Êÿ(}¼¼áŠéБÇÇS9gÄ×µ§c‘ÐÖ QÓ†³*q’Š:†m2ÍÏkäí3®ë{G4ïêäLI–ÈŠû|»œ-äî³Íʼn/[½GŠ8ª¼ÅïÑäûŒëÖnKVfN"GKÍ=<Ô/+ŠU…h‰ z¨¼é>‘£~ %Zq-.¬ØDåU•ÊØäKa+ œ¢M†±f²tÛBIËÒ«s]¢„˜»{‚BÛ;êDºm•”‡JƼÞ-7ìUÖ¸ü±š‚;Ê:‡¤÷J·ñ8u¶¼ïùì5Ä ñ ì×1ñrŒìϹ]žÔ£lN¹5‚Þ=ÎS5eTò2ðºÃu¸~±kª æ´™E×5óFažc®}íÐ!äÿðýÿ4Ï„x¦?ì?”ÈYendstream endobj 2010 0 obj << /Type /Font /Subtype /Type1 /Encoding 4788 0 R /FirstChar 0 /LastChar 106 /Widths 4789 0 R /BaseFont /OFWFIA+CMSY10 /FontDescriptor 2008 0 R >> endobj 2008 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /OFWFIA+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/minus/multiply/bullet/lessequal/greaterequal/arrowleft/arrowright/arrowup/arrowdown/arrowboth/arrowdblboth/infinity/negationslash/floorleft/floorright/bar) /FontFile 2009 0 R >> endobj 4789 0 obj [778 0 778 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 778 778 0 0 0 0 0 0 0 0 0 0 1000 1000 500 500 1000 0 0 0 0 0 0 0 1000 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 444 0 0 0 0 0 0 278 ] endobj 4788 0 obj << /Type /Encoding /Differences [ 0 /minus 1/.notdef 2/multiply 3/.notdef 15/bullet 16/.notdef 20/lessequal/greaterequal 22/.notdef 32/arrowleft/arrowright/arrowup/arrowdown/arrowboth 37/.notdef 44/arrowdblboth 45/.notdef 49/infinity 50/.notdef 54/negationslash 55/.notdef 98/floorleft/floorright 100/.notdef 106/bar 107/.notdef] >> endobj 2006 0 obj << /Length1 869 /Length2 2416 /Length3 532 /Length 3031 /Filter /FlateDecode >> stream xÚí’i<”ýÇy¢a²d©¤Å-}™c'[Cbl‰BæÆ0f˜!d—ž†BE‰„²>¨Œ¥Nö=Ú„DÒX+[gÒéé9=/Ïyu>ç¾ßÜ¿ßõû_÷÷s]˜´ícÉ4#©*U„.`бתp( fJ±T<‰xKu„Ž0¦ùH8€ÐÔU×ÑE" 0À”È ã}|©€¼©Â·`’ñ^X"€ÁR}ÁN/,8BòƒT†*`L ößNP{’é NŠ@8¼ð}ðD¨Ú7 ¢7 Ðúnãh?JtLá@òH€ƒˆ# zCÕ¬Iœ’ÿÔ¯ÍÍh‚56à[{ÎŒþVÅà ŒÕI4*H0$H&þu¿£a@žðkÕ‚Š%ཌ‰>€·ð3|ˆ³ÅS½|o,nø ÷+gljއ-ЖJÛÜ(ÙbñDª#ðϦ߲ñSsfCƇ.pU8Á rÞ_'~ùšèEÂቜ렡 `Éd,ʹ¥„!<†`‡WM•H¢rŽœ‘„Þ$2ôÛ2Q:€‰~37´P£“~jGû’Á¿$€š7‰Fþi¨s <ý/  Fáàÿ©58¤ƒÄŸŽ& ö}ø?MzCý}’&&¤0¤ ‚äà!H$ ¥ÿ· L‰ÔKÊÙÇíçlC@/è³Ç$/½X¿‹Õñ7#Ðy½E¼ŠÜ&>5)Ö•X[bžžã&´[)ŽT[.ÎzÃûF*xu%©î¤]—ÙǨ ”Kƒëoèo2Cïì:6—‰a¼Ü÷)fJø^õÀ´·MÿHÇÍ´ãù³ØÍS×lå:¼…¼æjr¡W5]ŽÕÔ:f–I8šW!«.m¿õRÐÍDTÂpðÖ´ó<Ã=1~ |µJC³¤:šèr_Nêºëbmû½ìUƒÙ÷·‘s¨)õðq‹ôò’¯ö&Ì\æÀe<Õuj@HèV`cb(zï.ÉVóÛ#Æç:‡Î`Qî½kðÌÓžŸF›+äÚU.í¹}21ZÛ$zíñVÅw3ë#8s'¿e )¹üèí7ÛŸÀÅñ!ñs2òs·c?JLˆ\1’ ʵ(jZvÐÀCåûª¨ñ[=Z¹ ÇÐbúŸÍs-mbqú“ÜÓ±Eûָܨ±Ü&þ¾)é’á}‹PwdÜØ—c³R-l¡W¤™“^ÌkÈ3m±»ZùÍúï¯F¡<- pÓ+|¹Ý[ÍîÙí{S—âÜ“›YFúÄ‚X½òô³‰iÎ~¯{d¿˜nˆ¦œy¶óÔ°€Å˜VW[ ßÝñóѯüB1¿o»œ>'ÇÊÍ*½ù|j^ÊÖôTŸh®HOö”ˆêýLÃJÖ¨SÙÍ ¨„h·ÊZFË,M©|¿öYó}ÇÅ † ëø?j¹RE¦˜Cé ¤´qçú1Ë]âBTÓå¾±'ÂäØñÎL`Çñ‘=1®õf-GeÌ™t_$m÷Ò3âmÖ-§A=ûE”pIöK´_‚;ÚUáY"Pœ¯ç9õ\‡ár›°~ÑQ×¶hl6=1AgÎÇ#þfÔ^×ÌÃ[æmÀOÃo}Þ2\¢çuxà®ßq²P>õ¼f0£8?ˆ€¾dIÚü¬8âé©)þŒ»fÈhPQ°òì§á}Êþ³YLvOÍ Rsô‘L]ÌR¬åôty‡–¥½jéfüC^]¡mBãmþ^ÅÞ»9Ç+?{Ê`OUb »Ÿª›Ã‚ïv™+Z_k?U½†a¸`ÈlT]Wp«. ­gÞ)b4upÝ]D´L{E¥ºdtX¶Ë»ý*ŸXc+û Ôªf®ÿÑè¥6#y":yn &§Î³ü¤3Áªn B9Õ´}½†[æ#q’Mc–ÐÎñ8ŒõÎþ±…ÿ2še;·rhr¿xt¸ bsš”spµoöØÝÞ¶/¶Ëó B÷äÄ $?z¾Ø×¬òŒ¶RsUþùë6Üb·€¬½ ,s v—™ïS6t>¥%.En^ªÊúý™¨=‹6H_\s·Eow÷ ºS9nÔŸ*{^ÒP@«³/MøÀê™+Úˆ!ƒ5î£2ÜB§"vû 'KE°’Îñ³m]f-£IÎÓ÷ßéob ÏTÁTX"çoçþ4LA·À25 ^®ç&ãœ$mõ%J麔둎AxYó¶%Î.Ï7—U>X"–Ûâœiï[®ñnÒ,Ú˜ïŠåå&+Ú\”gmÔEA=ï$ZáhZ©¶5-ÊÛÑØÕÀõâ'ÿ²û]nA¿‰+méKvwâ?S’0ÒžÿuõƒÇŒå²òå–¾ÂJ‡»âvç¢ï-_‹8Gûæ× Ÿ×Ì©øŒ¦­ ˜ûX^ê—”/9Q¼ë»žl’Í»îÔÖÞÉÚ”ˆóàá#U¾Zž&ÕùñG6†±‘Í©ZªîKŸ'?lƒUYôŠ?”vyšµm¹Ðz 4µÔ‰h㶆¿‡@-$ªö‹]/w ¸5r( •Ò&%·¹Æô 3*£Dò(“ÖËdEmk{™gÔÖhÌFÿþÕ*L½ à"Ͱ’¡. Ï\Ø—üéj4¿&·Úí¾?4Çmn{èÎÏWsÛù‡ÏŽç]p׿‹ˆ'k×LÒ†·ö²ë Ûç N¿÷fäûý‘¡5ŸÁý²„ tèaE~v©JeB{øQl¬à|Qž X;*mlyG§4B9Ò ¥PœeYct~áh)޲b÷Ørs¢UÐã1æ ¡%A­SÓ(øðéN—.Zîâ-°Ïêh‚Š!ù;¹mΤç³mÄ0Ñ©JÖ) ¿ÉäÝ–§èóªjlÍã¯þÔnÒzøñ‰Ì(¼@C\V¢3¦·iðy…_hQô¶ËY@lìØÁ'ã±N¹gnƒ ü?| ÿoð?ÑÀ‹bÉTR–ìý'!Þ*•endstream endobj 2007 0 obj << /Type /Font /Subtype /Type1 /Encoding 4790 0 R /FirstChar 49 /LastChar 69 /Widths 4791 0 R /BaseFont /VJVIEK+CMR7 /FontDescriptor 2005 0 R >> endobj 2005 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /VJVIEK+CMR7 /ItalicAngle 0 /StemV 79 /XHeight 431 /FontBBox [-27 -250 1122 750] /Flags 4 /CharSet (/one/two/three/four/five/six/seven/eight/E) /FontFile 2006 0 R >> endobj 4791 0 obj [569 569 569 569 569 569 569 569 0 0 0 0 0 0 0 0 0 0 0 0 768 ] endobj 4790 0 obj << /Type /Encoding /Differences [ 0 /.notdef 49/one/two/three/four/five/six/seven/eight 57/.notdef 69/E 70/.notdef] >> endobj 1605 0 obj << /Length1 2288 /Length2 15137 /Length3 532 /Length 16380 /Filter /FlateDecode >> stream xÚí¶UXœÍ¶p‹ ®Á¡±àîîî\w÷àîîw×à4¸»»Opøû[{ïEÖþ/Ϲ:Ï.³æ[=jΪz›œXQ…NÈÄÎ(ngëLÇDÏÄ ‘SUeb0Ñ32 Ñ“‹8 -ìlE Ü&..f€½#€™ÀÄÈÍÊ úƒ#ˆØÙ{8Z˜™;(E¨þIâÙ-Œ mr†Îæ@ÐƆÖ;c  ³=@ÈÚ üÏNe ÐÑhBÇÄ0±0vÍ,láþq’²5µpüWØÄÅþ†\ŽN )å¿4© I;[k€ ÐŽAÞôi@ËÿZÿ{rqkkyC›¦ÿW¥þ¯qC kÿΰ³±wq:äìL€Ž¶ÿ;Uø_rr@ ›ÿ=*ålhma,dkf 0þWÈÂIÜÂh¢hállpvtþ+ ´5ùß ÊýË€AXUNQJœæ¿›ú¯AEC [gUûÏúOö¿˜éAåq´ph3‚êËJýþϺÿëÃÄlíL,lÍÌlìCGGC8ÐöÀ‹ `aktÝA ô¶vΠG šøLíáþé( €4lmhóOü¿B¬;g ‰‘õ{ À`ëbcôOçÍlßÃì;kkCÇ÷€Áèh ´u~q m@Q'CPµþåúïú¯]ò?aVFІŽ@[k é_Q¦ÿŽþ¯dfÐÌNÿLádõ-ÊÞÚÅé=Z’±á{´s{sàûZXÙÿ%na÷nÈ Z‹“µ¡“ù{´O £Ý{´;[à¿™ dïìö>Îòv6wþ•R6µsy¯H×ÔÂõ¯ ®¨ÿÿf¬Ðõ/WP¯€ÿQ6ª­Åß"œÿ¬ÙÚ¸þ™ÆÆâ?£ì ak Ó{±ØAÆ@Ã÷泃ŒÍþ¹‰€ïÒì,ÿ4èôÏíô‰¾;±ƒ¼…Þ ä,üN _‘wÉŠ¾HTìßÄ'Ä;Ì$ß ä$õN éw¹È¼ÈEö@.rïr‘'‹Â¿‰䢸N ¥w¹(¿ÈEå@.ªïrQ{'‹ú;\4Þ äòå@.šÿ&.‹Ö;\Œ ­€Îÿqn@o #Pø?·1Ë¿³ÿó©Úí£ÙÇ.DÔòiÆe[Ì"G¸'”™­ÊèÞ<€Ì‘£Øân™]º{‡=ë2,‚Hü¾Ç…‡gRQÔ\Bí®2ÜdV^@!Í”±Õ‡ç1øsľyÓK›z2N1J’Ñ“Kþã“R®X Ûžeê¯ßÝ{Ý¡V¤}žŠìjBìOÙÀ7b>Õ}Ì|cB‹×`Ÿ¨(,ê©$§ ´Ð•ê 'ª¸8²È€ÛýÜ1JB’ƒiÄ’>Âw¸Ìæ$½²â‰aÔ‹:'=Ï_ ­±?Õô /‰ Øc&YyžŸEÂ|hcT(õà¢ßêèÙ.&tnÈ{ææÃ‚À^$ó*GÔÅq&*zµ‹ê6 ‡£“é†Mý)—XdꘪüKFÏc;ÄÀUS/ä2ç1×5øú7„ï°–›rhÀbC^NípŠEW%ßž¦D•ÖšØ 2Žq’réû ZJY# Ëá2I’4§Kà¬I„ô•AAíð Gf!ÍÎá‰Ty›KõùÀúöR·¹$/1š_ÅwÕ1ÿ?fú Çmr8WøáG¨‹=€±¶öWxIZhXþ„Î-ð~jZå¨N4Љ®ËQÄÖ•åÞÜzŸ†ôÎꀊ&ó‹·kž¼! ]ÄM±oÏ­U)è¨Ó¨ÌéqIKÅ•<ø!£ RµÝk‚Õo°~aÇøê‘Ù+Ïã fDv%åãSD=NçëŽ_eÁÄ3“?àe,VfªºüöSä§*.¬šWf‘h w¿î³oMÇMQ^£Ãýý½þ°¾Iè¶ÄqÖp–ØÀµ)&·:½fÕ%˜¶ù!?ãÏ#÷®¨"\…JCââY3XA+¾R mIAƶ¤ì×iº?±jM4r%’ÈÔ%ûö óÖòUì^™NO=%lF*¤ŒÐX‘V½qþ­˜Mi‡v/ž}\04¨Ð¿?râVf2«þìwôšNnœÒ½m³P¢îtáÚ‰NôB}ó(¸—¥:{)]kí¼?ÉñDò^€ïcŒJi8 Jz£|“”·âË:´ìr/>ÏÚòÝÛ:ÂáÁh:ÎÚê¨}¢رšàö—y­£“ÕŸœ|Kú‰Í¯q¦€6ù´KE rGå2øƒÑ.þ* jª£É4«'ט º&/ùAnË-ç Îm?Ž3aáG˘DºïŠxÚT<ÙÒë“ãDDM„rôücTíT…Ä?wk­…À&YŠ–ì’=„Y³®6¼’ù Î=P …±®äˆV¯V^Ë'™ÞÁféúÂÈåÖc²Bíy§ýlñhyy‰-'![NÈ’´ó f vã[hmò©ñÝ¥rCÉWt»Ûúš9ëÅUÆøÂ–´:Z9,àu:)2J$÷LO~4u[¶Ãu6nÖØ<5H¨ñAÜ3­²A7†¯ezZ;:'Ø ì¬ÅèÒ BÁ÷77C§AOÞm….Ì'11r¤‰‹¨:íùK•¢ëGØý»£3EÈ{©ŠaÖ‹“å÷-~äúá›_tÚ5{5}J°Ñû’©gP•E5OfRRGÈš‹†EbÙ¿]-n¦<%›°°›.J`L-¤=¾îyC”eÃej)Hˆ{ Tx€¼µ{{÷4€ExN胢@Xå?{,wÌÐa‰«\“#Õ+q^Òõ%°Ä…×Ö¶|Z}¨>¢ô§îS﹬—[Æ(kó±d-±ç'Õ窲‚îέZ°.]JdÎÅËÙÜ©ØLµ0"ޝÍ!¹m]üå2žcKÚŽŽ22±¤V°á͇²ÚÔ"¯Üè®ÄV£|§oŒ™7HyÁTZ䃑órF.ú¸¯b0yGìjß–QXì÷¿"úKîL‡Ÿ«³iÑœ4զЉw×?S·b®!õ¶s_­Ö?°q~gP”íô¬ÙµÓçžÓ«3v¿²¨s·xõ—mý<*ˆÈ *T˜Ò<§€ù8ûÙ{ÿ€‚y¸Ý›ï‘§&¯œÛu U¦Â¾—U+SB"ðɹ§}ó›åOÖ»îõ8Û%r‹9C‡™¸Š°7u[h áìvÊðÈÅ–j±Éö¨é”êx·-:4[Þ‚d½Ž°zJc“…\¿í©TÇWÊÉÇ-?|g— Sj#ô6豞—ÈþYW\M\t«ÎHöà´ÈÙˆ¸jm3³[IÜøgYç¡ü§;ÎïÙô"f²²€Iè0!¤¸–Ù3,YÝý‘<¤»¾Ñôª‰‹K·éYÅ^41¶û(^S _á«ÄÏÀ*f~膴?í¬cmBÅÇ/^(Ôl;Wz}t ¶r—–2-X¿¾¶ïˆÅ4.¥¬×€Mw8¼âÿ¤G}¸¬Ÿ=Ð)§þZÝÐEhE²åT>%ÿ¯>ý‘˜év ä勎ød¯þ*ÃŽª*S¡Êf‹ºf{ò[ ïº`µ²A•™éŠÿJmñ±ÕQ¶FùsÓ¯öã»1HžzM‚×ê¶á}.½¶T†c³“«+R’`ÎP°÷OJIöŠtÜÇPOÖ°¿_rirôù>º¦bÓ›Å0[ÎÑj‰}Ý1Q8Y 3ÔÍÞÝ ì^fN1Kæ] y˜¹œ»¤«ˆH{9%ÀúY½Ü¼s€ Öûº£õ=öwn[¨Õä^ z‹6“q]Ïœ]‡?Š ²ÆEuê ~í]ìÒÎc . >MÃõÜZ!Žl(sí9;Á°$B½7ã¸Üä%:öÌ©‚2kc!}i¿ÿY!^Œ‚ê¼X$ÇrýmN]®|iJrmâ:cŽdÐWð:Ô˜ ðƒÖdÑS7] VùbÇŠ }þnf°„w’@‰rÒ©¸<— ^0 ` „äàì¶5ï¯ã0Vå É½VõBÿ$zàl»PÛõ£_%ü+'ŠC¿¯í‚޲ÂÛ\À±)¡´ËnhÔ×@6™8q–V±vÜ-§¡8P ìó•"ê'œ%!süýàÛ=ªx©ß?Ë…Üú’HXXî_ ßœ-·1Po¬ûÛù8ýBû—æ† A»@^zw•}1©“_­q_Å™vÝ ¦ísfG]€ÏìˆÔ‘(ä¾uœ‡Þ0R½"¨´i¼4Y¾vÏ7Z"€ôÏÆë*"ÕÝžJ»¡¦)¦%+Ëry•yѬòh„óƒƒ+¡<ñXèítÚk‰ìIè’†Žü#ÍX÷#Ixb9¢o.ùÏOæy“zž;•Æ!÷_™dè±)ÞŒ5_àáßVYàyBÿ¨P“ÝBšÃ/_é¹Dm~8M:âõ5QØÐ>÷>äR·ØÃÛ¬‡ÓŽØ@åàˆ^B¡Fì‘Ê0â°òîVFåÒ²*»•B–€)´#Êè2¡;Aø¦’ÑÁèEè°F½Þ._Í9æRe¸wßfs¹ãMòeÍ UaÙ½ëhykÑ]sªÀ‹õ¸Ü£ë~vV¶NýûÎmQIÖÂ×FY4’]ŽâÅŸâßZ6ŒFˇΆøLñ±á ÙâÛÊM7s’Zâ[¾:YæðboC«ô<žXL¿‚•}:Ê9úÁ ë½I‘ãrúÛûÇ šºçMŽbðɱ­“é6T‘CéAxsy=ÍCv5¯xý„ ÷g,Wâ¹\7Oê›\^êâ3g¸ò­È1âŸ%øã#szŠKÜmRg{äMzçèÞj†qW? ;álÇš¿ *š,y«©˜ú±Ë$‹|,xyÐYÝ×—½›*£NÜØjNá¼r¨ü,;fÛayŽ"óC¾ÀF¼¬/•D«–YòÂjÊÆWp·„ì„P±ðŽÎÛü:ÁbûqYqbªï‹Ñe´Uqée%?©ŠUz åSÉ—Eðæ‚cŽP"j£«Kvæl…¨ŠRŸ>µ±õÕ6ÿc0gÚ7 b‚áÜ µ¡µ ¸”ovy wÏu®Ùm VTògèzšüD%¡&Bö¸Ò’±)Í5(a…±mßS6®¸8/CJŠ%½‘”‚õü£Îž ä³:>_¦FÍÁKNy‰=Ûcšàq€æÝ&X[±áÚ‘Ó]Ú©kD30áÓ ï¬Qœ¯;)Í¡2 S Ò­oS}Ù5^‰ðÊW7å´8Þ¢ÿã´‰K-Tné»]SLܤ¼^†;}à°ÀþÄ?H#G'„vÝk±ÁߢL¤p6 ÿS¯M UÞ¾Su±K*óâPoó²<+÷h±„¼üú@QË,í’±° ‹Ú«o¤Xj;¯·%BÓ±Øy86ô§gÎ š/ÌÈu84{K2µÐˆ µWšpµÛbçuýµº¾$xpæÒàö;w9áWy„‡1ËY•¤•)Œ>ßh;µŽ¢|½´W>bGB!:_™lFõ3VVÆ– €w\TK ¥‰Ç[êûg˜j°ÂfŽÏ}ù‰›ƒÕ}£QF”áaKpQGÌÆ]ŠŒ]Tã=³Ÿsàf׳t^AÜ'‰ª”W·CÊ4¹8Ìåæé1ÏávuÆ{ã¹×ñD.s°“ŸÚ¥R¢1ín­n²æ[¨'»_ØáP*•Ô÷m4Ã9žùŒýzd£~6)këÌ“)E¦ëw()÷4òé‰L"˜†ýB ½”ÆÅÎÝ fÑ<{ÜóìÛnoÁ{Ö^+çtQÈÇCgžKb©®®ßªþ2L-ñAr´a¾xçþÀiºñ•)¾ýŠãCã~ÁúÉ9†i›”Ó>¢Ã°á>óX+Érû¸.“ÚD#’Ì8F¼²üCÌYž(‚äë/µçvöâ*¾«+y‡lÞÙ_Ëh‹½ÖGˆ¦ãPH9RÇw}ÿÌIíêÝÐü´µX ú¢D=\aŒ…k€]™Á"IµŸÔ?xŒUtÕ§z`š+È1Ïž¡X í´u•ƒÜF¨ó“g>ÆË! š†ü~{H™Õm‰£&I¯jüt™ZQㄱ'5øºoû9YÐ3¢Ì$ʰ’æ¦~yÔ«¬Îú˜i{¸#Åu<.J= Ç'®¯]Z?=§9*à“`ŽlEe};ë7m ¯ìéc ‡Â)É8;Ê/ä×…?ŠvM{a¯²™>·B¥¤¿ ™…ãö5(†”Ó£ôríŽ<©èž'¨•šå›ªóìÿ&Jõ›-Þw¼ú=a²‚e]Šâ‘Ý;;SôKø'!¦_ Yß{.Jè1~·.}×¼;Kú§²z–ŠÓO´f­q#¾…°•3N†(%•³}ZáÕeЈ«+Ì€ná“•O¶jåŠxˆŸÄ×Ö+hâ7f¦œ/«ftÎRšüNy ã[=œw 8ZWñ»Vä,ÒøK;ºYä¾â%¬n9’@3ITØ-J‚c ˜9U ûFà·o¸Ý&‚4’w\·Œ1*YŽÈû“ÑUîb‡rŠ4kØÓŽ?òQÉ3ý„oÞ~Ôit‘Ѳa3’ë\þ*ºqhÙ½–óߤ/«Õùœ®÷Q(r/$sõÝÄV®åJ8 _EL<2µÏþ©µÊŒŠþ¤›÷ÔfÁüZúG:J<ÄYéT‚ZT+ K$[¶º$WzÞºã‡3ÜC¤ÙÅ/þÏ<`í‰RU‰²þe×ÁL ëC_ËHë"±fÂúʯ¦jâºÉËZEܳÕò׿l!̃ p»æj³Ê PmέDà1»àЈzÛ_N´‰`Ò&ß^+”Àa®¾!Ä€K³¾p¥Ò—U Ä´§À|ýƒÀˆ»0ú\îÃ6úç^œZεÿ©øfÓªÅhÓ,×B9£ñäÁšÒTT†ÜÁà(€œ¥$ !ð û‡Éo7A/Ù ³hrT'ØÐîçÍ0šFL"Q¯O¬@•’B‰&X˜Óæ£à¦Â¬²Å3é(×_O …+ø9ü8¼›°j,é±( a8Yeå;“1O™ ËoñögB^T6Ë;ŒøK']Ò°¾&1Päeo5Ÿ9d%^zI®¢Ò‚‚8Mn±+ký„ÃíÖ¹”ÉUÈ Jq¤£W—ÈðÍMõƒ¡rØõzRéÅõèÂÌDÓaVL¾_~¾åèœú¬Úʉ׬æj¼UÛÚýf±çf'_QœˆÚ{©ïcÃ-¹O;4‰+ÓîºÔ¸q ²Ðì(,‡SF`9…’ÛgL§ƒ!†Jì2jæðKñŠõgå‰xTš¥¥t¬@§ïA%ûb­w’ñÇG†r©òaB¾8[ºy »t‘í¬·›Ñ$_›¶]²7ôñì¡Ó9ÚZlÝQaI žÕ(,—‘2ìG_˪qìcÍ9L•‘Œ´NÄÂZöç3õu³=ýÈÐîx â­ôñÿ¦ª˜Í¤A³­i ¯Îwݤ±*%²rÎöóó°ˆÀ¹Â ªØÐWàʆ‹Ñ öfÅÐ-ŽôoΠz·¥ þ©®‰õS#±…²šŽù&\ÂzGcwìpïÑ]·£Õyˆn¹•ðsNžržÿ`Äå¾ÐÞ¨&x9üš_ aP„^@‡2ÊãÅK‹H—Ž6¯U**%›Ÿº_žË=ÿp>öâ©&;þ¶èKQ)ÝÔ»‡w:eÚèa½]`r¬£‡p)Éê ErEY¿:}{Ç"1÷™­>T‹TÓ›í[ïà¡”¦?¹ÞH}Ÿ£"ûzŠw’ç$Þóý«¢.ºÜýÀtÑGÿd‹"ß>ùО&Ú)8zrŠ2Í#êK «‹MÅe÷йl, ¸·2Kå…ï<`r?u6¾Hè@ lµ^^Ì9ÏÔ¿%9ÎõŸ#ôûkÈü€ÆÆÊqâ/„“ òÅ(Ñ>tðXÕ†Á†‘¯°»ô~;LšekÈãÿn~;PÞ1Ý7b²Wë÷݉V,àS-å–Ï|bQ‹Y~#æÅáJ2Q;ؾ/ýCç´r‡9fË 1ÖmîVäbæiR¤5óWØj,³Ã RÉ6'“\\âUZõÿއGùRëè7°7±þ+Nëû¾~4dœ‰vã\: :Ø^Wn D™?,ˆÃ"=Å,Lè?¾°:HÚ¾f>C´ Öc„Nåå¹ëý†gMLúq ®—_Õ<¸edظ¢tÀI USê? ÜY¿x¬F½&•~Y6k·èm<¸XÔ`ɃS-‹ññ@¦Ü¸Ú4|"íŽ/·‡Û>ÝpÞÁ\‘ºý%n'ŽGâ ZÚú|£#sîbs¿d£÷CEТý±–NF~·QhǸ@5—ÇâÒûò-&ØóQÚ–,­u¥I×~³]«ÈÜ:ü­ð<` §>uM’,tì8ÍÐN>ÆÖÈVûyÀNvM-74£¯ÓSI²wiŒQàáL‚Eufî ™zj›šF~A+DqkkN>öv•ýG•Ih›Ê°j(Fqîd ¿2Äe’Å¢¨7§:Ž–À×¾¦IsÇÓ¦ÍÉHA´±b+-²@ 9`‹xìè×Q—ï6 †Öf†2)XUüàŠø“éJý$[-‰4ã„v*g'b³Pl›hº‡ ;ºÛÿÖy.‰¼'H2#¬ÐÇœ°8ækÝÃj“247Ä·S%4½LÚAñï‚sv·BúÉÀpº“ÆËȽ^ÄÑ:.©\²A²­ÆÖAf×Ûý´ò÷–COŽ^—$2zñmËYƒÆõƒ¢¥‘XáiØŽ¿ ½¸Y;oÐÁ9ü^ý^Šõžzqa¿Gàî'?ø5¹íÐñ¶¼NÏÛ)ÇUý–X\n{åºNúÂ@ +y<,°šÓ:Üè6Ù ùk¹}$Ñ|Á@Ã<ÿãÇ@¼?=ó§e$¤ûù:‘$xÜ$¦ªØšTwIÛ©9Ó‘²³†ÊN"܃^;2ÙÉ̪OÍ¢ã7ÝHTùCÄèk’¶â3±Ñ‘ÈAîÓWQ¥[ªø|]Ag¿–tÿÔ$™URÅ•³=ýÄëÒŒø¶àÏœƒ h¼[‰‡³ü¡õâÚrùç¶F–Y Ñ(Rð#èš›F/T=\-SùsräŽ-ÊÔ øµ)$ž__6?z|_ÁÚ÷<‡È;‡'„þB@ø#¡×ù£ ’lú9Ö+ni F…_•ýºï O Õ×H‘¯+#°jîIPÒ6 _ Dʆ»§†~m“d·çZÜÍ «™ÊA±À”Æ8Ɉ!¯kÜVêJO·àês°Æg84/'mÑðu8¼]MÅQÎ~ôoU]80äuß &©Âz~—u/‰ `VEFÔÒPÆÿZT¤Ë¥¼ÝŽ5›®¬™úÁÆ´54­&":ö7laXð`NNåÿ³'E%ÙNDä{6ŸÖhd—tƒªH¦ý5„¤Ã´©ùÃÆxÌj(ÍþAe?ôÁínÕ¤×y|a£„TðôvSV(RkË8/óøA¤Ðk÷e À•Ž×­ô {ØÖÉ®ƒT^‹ü>ùQ¨ˆ•õîe†vLu¤¼lÝ„K0mçK;¤¢8Rœ”­ãðµB–š½ sû Þ¯„ý„Ä\?»Òn}D¢âKõ D¥Ùk´Aÿ¨æOÆXPQÔ0Õô̲ˈòü·þ™(c¬Q6mmÒúãÕ¶”±+ÐðãŸD¾Â¬ò\íç5B\Y»?ÃhŸÇÁ çgIk­±‚I¼¡¾=¹é®|¶̧‘×5@»;¤‰^çögÏ€}òìå%–˜âò_X‚¤›iFÉýÙ„ ½t~z‰ï8‡iz^xì*ÎæŒÁ.ØJ½ï]D¸±áRV¤ËôÅã~ãí ×åÄ+¹ÛQç8¨þÒó·¹ÖkC’D å÷Ì-EšëèíeÌ«½Ýz¯Fi²@ËÔÁsn€ßÁ ’ßÊCÚíˆÕ¬ ê€òƒø'Æ\áAå‡ysüø.ÒµÚAV2_§x¶ò >U2W}/ývôÌC ]9q/–]ÜŸ*ÜÌÀ©š"cqS_™a…MÂFƒ›;zÀ©\fè]ò·BÐ \+´8­aíºð€ëëy¹Ðå²üÃJƒR·Å´/ýÞ÷Q¯ƒ‘ÉYÄxkµbVo ‹¬™iÛ®‰I…w&•2@öò½ƒ.‹\ż©føÜ‡er£¹m©›ûwxX”Ïþ÷Ÿ-²_j+; ¶l{uÙÎ$rTÎå ÓÚz9_ç?”J£·›ï> [UG†ÂùÝOšZ°Œ-x^ø˜EõL©ÕýÑö¡ {µ‰Ó{íør¡ü‰(Ú ŽWƒ RKwÞ¶†£­úv„¡ kÇÚ‡f¥ò{ë ßG Q¢Ti—iK4ŒjpÇlô/Eõç½´™˜û3ïÛã|·…о» Æîë¸&1ò€Çç색²3ø æ‹+…Ã[W@ÝJ^ÕO¸Ï÷2âuBP¡Tz á_zýÑà5³‚çlÄ E>&âFÅ_qž*ßy`çÜiÇk,}З ¶Ü„[d{¶+$ò²£Ï&ìL ©i‘sß— 1 Úнž 8¡W²Å¬Ø—$ì00øÙÞ[Zi˜”Ï|Mꊵ’›ãÙr+gl0ódnlÍÔ…‹^¬y Æ.=SÀ’Œ¶±éá4TêBýä8Eº23] ¬^Ï»¯"¸Ä¢wµj´Ö[_À«Å™ üuÁD]¿Z•Y›û]@ñHɲA¥ëƒ :%TSy9Ö'îïÃWMRâµnú3èäÃôòC×ØÖª\VýµßÑ‹rDE§ñ¸"šìæÝ#2 u‹¤2ÛœgBaþBâ¼îYé\¸™J7¨x4”åΊ(¿ŒÝY[´]“(˜€Yt]H>Iø;yЙC"zÚ lÖ¼&…-9†{vG•vï•(ƒ/2~™s,Í·Tl#¢Q}ˆßüÿMÃ0óÆ~í› ¸DB´74å&5¤²/Ï1ùB±Éž ’q'ɼ4dt¢ _SØ–Kkôª²…<ð-™P z;®y)(çœÎ@îrcæÇ½9“üYwùR}iòet›µ¿ë,˜˜RÖ`¿•òå ÁZ•GŒø÷ð,5Šo¨Æ¢Üq—I¬}ÉEË.Ü×&ª0’139n¨ªv¡ŸuÐá]I„÷¸ŒŠ†CæV?åß#ÿ’…Þåóræ/£ÐÖMʾnFvl~uRýY·ÿÐЀ™š‘”À%Ã|=&rîÛfKÅ}E÷µ¿êvåþú6ÂÍ7Á3^wû%ž¼‰NЪ²¶+OêÏŸÅì„)t]sq\P1ˆè]§“|è统¿l5‰h¿`#ûr°Î¯W,YâÓ‹$k±÷tµ Âþëç·-9¡Þ"€Ÿ‰Uo‹Íaw®ÀÉoõØZÇÈ©Ôuž¶Â¶¾íb 8”gÇ P±cõU1÷‹"`*Æš~øÒb‰¨9Ô*—6üÊÊ2"ååçé6#úºÅ¿ø¤×¸PÑ"í@uÍý‡²¼k°ŸfAž˜Ìn5i–w–(÷Ucxd—`p±—Ö²› •p‡$¥p1ב©%¥¢5ߤ4åGuLšáËCP7¼ÚÀwX:Õæ:ó ¶Ô5-1>×d¾Îõ¬´ûb±ê÷榶?Ùúþ¡‚¿ÊS}»¾ý‰QÁT<€9x®Uà'éÈ6ÜÞV^ô#æ«€Œz­eÄN¢~ð3¡[DZ%èz P§ðKýå¼ÁÚÜúÔ QU÷™—šY³æ§×ÇùÙŽö¾•“¬è•2pÆ>éé¼6 ü!ƒ7ÇSŠ^àO¢µ+rëÂ’°òó­pˆ ùZ^ÛMJüüßµÎÚ\Æw“¼#ø~wõúž¦àb|¿ ¬ÏÔ µz×~}áBír j>ªûž¸7oÁÍü5‹2ü&cíw`»üËö=®f{ßA ï-É’[m#éÞÑ ªŽiaW tÁ½ïSÓþ!ïŸg¼C"ÇX úÃÒ ¹RðÓîí“MWLÜ%û·Ì]E‰¦ÌÞ(|ö/•[Í*zÂøå|m<¶#ù²÷ˆOÏWn5?à·DŽN‹Þ<,/¢ŽLþ€·ï—BÊè£Ê™™¬TPI°‹1ø ž÷ék°DK_`¡­,\ B„Išõ¾‡V틳 Û5“:ÙS¶tÌ4?n¤_«£GÌØw7ý4=¦#’HȤLy¶µ»Bü@y• ÞOüçþ¥Q¯e»ŸÅ)f98±ÐnOI/bÁü±Hö-‘^cæO÷âÄ´-ª cQzË{¾öc{ ЭØÜq}o i0>5vˆ©¢A…ôÖýüÆôD¯^àÆE\‹tésV½SúâPAJ¢ˆvõ<ŒÐÙ_{äïŸ>Á0PɪÏÐÔ&bU‡ªéϸáß´IyùÄ Ç,tY¡O»NpÇñv…­íOiòãCÖ.ù–)Š lô13qèJÉKÜÛ&ÝͰMÒÑa‡7>ÊËP ÑFC¥FCØðìc/{•Æ ËÓ:ñnÙN–‡ƒp› ãc;¢^jy»Ô4z‘Ž$g½JE´³È!¦¦Ï&øpº–s»þ©˜P'ÖYM83¡…äöS=EÞ¥Ã3ÛE¼·aáÂûVŒeb~hI-ÓûôŽF§E^Gæ m#! Cñ(w=a›.6“ÔLKµêL)UÐbÂøGLnôÑRÊé·ÁæmRܬª:ï$|ÇjÔMrªL:4¥»´™ú Šg¶©UX`¦n„Ј¦ú Ÿ7« óãÖFt‘r-ò òŸÍßêé1­ÅÖ1?xÜ…+ÏÃ@Ûç›§"¹ÖŠLk¢07j—¾Eå8'#´'Š¡Ï–â£áÛÜܰbI=TQVäøúÉ•+ŸŸÅ mZœÿ Ç~“5WÊÁ™´¸(áÏÀÛ| ä!‰îMvhcm©$>¥¹¯ µš&D‹£©²L íÞ™ªdô:œÐ^/é¥@Ävv]±²sN|²ù®Ä.å¤,çe§tË­ß›`Þ˜rПŽJž-Õp\ Q¼ègHƒÃ]§OlÙÞ4QÁÊX³ÃQ8!’í»°¤NÕ1÷]"8u@½ wnpbt„1ÌR‘Õƒ^$Açxã•ÕlŸáRŠår]S{iÂþ>*U·\ÓvùHP§.½øœÐ<Êp·Â˜yêoÕ½fó¹ Um¿Ê8i9x„Áƒâ -ôñÁ€,€ý{>XcÐOü#¤o´Žr}ªeV7GðmÛãC_#Œº—õÑy ZZân"LÜ~¼ïa¢Ó´ÝÖ‡ Ÿú¾ù‘üúÈû!d¼ØrT ,©ø[60 Sb¥|doU¿ÏeØj?Ìßïzg¤Ò~‚™…)½ýÁZ‚°j?Qíí³ÜbÕ‹ðëØl“ªî«šV¹ O@'…àhTÆ8†Üy™PØtͯG¢A6‡}ЏÃi £×>ÑÐQƒ=èû¹B'`Ý]íV‘õ8~/º˜™8êé“–÷oÖ»©ØsäôŒ[†eµIú1m“v|H” mkK¿Gé ð âíØJUù_“ŒN¬Û}ßFm%#‰WxÖšç+ÀlišŒÙOÂæmÊV^Ö82¡/üŽoLñ­<‹Ý=ס1õù:**¬ ­ã$t©4œE½z`æ…yÒw**›ZQàºK”ïôF$lüž…›K ;B²2²Û%µ¬è6©'T#k†PB¥:}œÞNÃP„×-¨>ܹ›X„)Á5¥“ú vžÝã‹ßA+é^Á ×ZpIð ‘QÒlkç¸\lüÖ×°} fƒûö‹¾¡&òŽ#>*û¬Þæ6®\²×í1h°ÉÆÿ¬lŽ<]G¹Ý˜$¯(¼x Û\ÍI3áèÁ<ùPÀ§UþP)íC92WZþ½UYÉ–X÷ÎP¥ëòœÊq(×&çœ-È“hÌ5‡ÏIÔ›Ý]¬¨{K—{gva&âEQÚ|ù”6Œ8&\€ 1\)pÄfŸ×X!(âܪ/–eË™á ùócÒ¦ÏòÃîF ý×;ë þ@Ë=Mîl’|iæÝã LÀÇaûänz©Ö[áVܸ‡ÈômA}$•ˆ ‹+2?A%Ä“sèD˜§)š‚ꪃ~TÔ#ŽR¸ˆÖÅt·u'á”ä^¾{ÂÙ&£7ÙO[üãdqB$iÞí$öˆ¬íŸö§»VÅ fåOÂ)ìÃàÄlËåÖx§Nºæ”aæ Ôcà ¯ ÒÔÌcŽ;[zw@ã:ÛØÜE”¼©òªxäÕ(A´è@ßñÃh/© «„Óc±Ìû‹0é ¸Ã·/$ áôTȆŸ˜õÔ¬‹ÃÔÀ̼õ/‹s³ƒãm¤b2†9°%JŠ;RýºÅbµ §ƒ8± û|ãPZö§—ÅS8:wESÿ-0šK»£#lÀŸ¤g܆µçÏvâÎõÑ s{|p=b’"?™çœ 2âÒ“?wíè$óžQ>éƒ9Fe˜k¼çÆÚHÿ|P9£÷ióïÜaÁ²£é.ܼ ¡DY’“y¹/]&‹´!¢?Œ<ß4wi8o؉™<´ñÐdægè Úá¢ëН¢ #äâs”Hc/Y«ÙE&@n!nÕå™ ËK>ÞxV¤•dž,}<ñÇ¡^çãµbÛ'®LߎûL¯ª:„‹ßZÍýq.¼ÝBŽ$ê¸G·L9µÅ’Ç¡,C'Êáwí÷nÑT¼„1ÓÔ­V%á¢"sˆ Ã!…°jT¾?†°žüxóÀH !å…¡Óßv{¥üÀ9N ªÒË«œ C\"a,è(bà`£”Øh=JÆ+ŽS¸åŒM™˜¼mØ. ¢ætNÂi) —Y·MB§£(Ÿ ±‡~6Ä=Ï‡Ž‡Sï|µ‚r•¬"òë©_9ðØˆø8 ¨O½¾;‡?s`‚Xá‹•*’’¾¹ÂÄíý¸5U™|0ù^€Ápût4¤óTýv¾íÈ ÉÛ™ÿšÛHÓ™êŒtÙ‹=”¬Ðåÿ²>$;Å^ÐÞ¢w>·]Xdì¬1’Ø$”PÉw š¶?íOžJ€¨DXÓGùì{m{{8+F6‚;óUÄÉQ¥K-—þ{N½©ÈR_¤á}JÔ¹gI†Xè¯ÌÕÒl˜.ÔìÑ5[J„(éš÷ˆEO3ªv8X ÙÀÔy¹gå?Oï6šÐ÷."ƒ©î®Z÷a¿%£ÖýØ 3V2ÎZ~‹¥U°¢¨¸õˆG‘Kþ’êG½›Î¿;¢Öý`8V/ZM>d-»¯ÞZ“†– 5ÖÙn4ps™Ø\¶2ç z¶ôFõWlf:ر_†™Jª~þç %¼Óf6Q÷<ßÑo 0Ô´1Ðt¼ªŠuÞ×ðµN±‹Ö‚#q]’*|pÿ³Šn‡u a4CC ‹0;…Ìb?׋ÝTãúÊæ˜@wOGÎaSÂ(”ãOÿÀ‰™:+”v\{câbÐÜ–´Axjéù7ü 9\=‡Ì:Q¬™ŸÌú Ï¥œ”Á¨&|X²Eˆ#ø Îj1¯ñŠ©Z"g­®Æò¶øµ5! ‡ptûÛ+cáó×ǹ?Ìt;q!Šé帰>Ç&tÍRgùтƄmð\'6öŸ‘ÊVF'ØbÞò­è#oա݃D’#Xr5uwüQŸã°qÿ gø®o§e|vo°ÿ=Õ%ˆmd•1¬d 9dq±9ÚÁú%S3•?>T=¿·Ýµ«k:q£Œ¾Þin¿ç™Ñ–uÙaqÏ–„K…¡2Ã&vý`ò–~#JáÃÁ4û>Ygf*ÓDzff–}T×s“‰ |v‘ßæ«óÅÕ›Í1ZÑýÀ㤌S­–X!t†”sx­ 5Ñ€ØÎo"æ×nýÈFé†'e7õ*¶;ʹ‚Y Í¢Þ@ŽŠÜ‘üO©ˆ^âjFh¾õ€…+R5ì}E|‘â+KVû9ÑrzK÷Þ]œÖŠ?^¹ù¦uv#*…Dá~Τ“9¼'bzK;šÅå&vŽöØs¥¿•'"l¦ÞX&ùÛÜA!Ì&ϳˆŒ°9òÔýIXlll:«œN ŒÜ`èIÎ6Ã¥jq¸HSdÁ§2&Õ}sþÒyçhI »}´ØTº”=ºð]绥!zû{ˆcE¯;+š„ ™tÚBcÃ6þÕ°[ sÿ´ ”âOwk?Õ·MôŸNúj(ø‚ðÞùÜ~Zeú—šhfÞÌUý!kŇ.g¤íöâd³.zu¸t~T.Ä¢ì,lKyõzÜü (Øìã¤ÐE™%g6iËb^‘è 1€ôötÏ"¨q™’°*û¥m4ÎØ†ô9úFåk@ZçZž~*¥q=þ×›•+§¨§ì@Ò×öçò>6~¦æ'¿EükË‚JI>Ùý2ñnVoiM*bv5VøÇSºu„‡Ou¸ ¨£‰<’a-›‡`ÂÜs%;v`<¡ÍäÚÍ0Å\ˆæ Ælëé4Ê1|Ä®+w=&juF¶ÓÊéhÄ/y­Ò‰?2gÙ™]'žäü€_&×]6|¬Õ¢æ™U º+ºÁˆâÆ’ Pÿ0_¡&‡‹îz° ÷Œ?{-Ÿ¯~×ûéõzš=vU àz&G›<Ï»iþþI%ÌÞ(æJ×ñ¸µ”Wb—w~=\YG/6¼”˜ÉµÂe6SÀX-¤¡Qš#:±œúöð‡#vU…zå‰<”ڜà ;^P_aÅK„N„”üJÜÓ;˜;‡’üÞF;7™t_` ):`”2nŽ‹†¶­³„P;0!ÂÈA< Çö‹ÌžºDNæ2ãö.q5 a&ܯî§Ê}½…HGÿù5vmÍýQ_^pºÌL졾¼‡¡#4øÀò’1ª5+] Mü#,$½®7‚Æv_;þ7&Ó/»íZží…©&@LH¼ó’K&üÅͨŸk þ«u û¹ê^jSÅJ`Ã÷'Fré×ik…P¿׆[@>¥ªl/Eµ§Có¸ëœit§É›¿á…@=Òñ«ÉEÿôžéÆ=  ¹ÐÙÂã7e=ÚJþ½"•Æ~o4ŽA8Û…J—Pk~ |jÅS~&]|ÌIŸßÔ¨Õkü—Мz,Y­Î¬ðÂb56ҭȪkØ·íz¦B’kðŸ‚?%W‡¡ijº|^1<Ó\Ù†ìTä2Ð÷͇١ÿ&®îŽ€¹}<õ á~âLN`.B>Ñ7 êAù÷/CSl§Œõ ¿q ²‘ÁÞç\tð¾ë(ÊF¶¼B„D9ëö¢hÚF[Y;•8°o/=JAÑÝࢅ§¡æ'YyÌÕlrLzEþ–Uå[Mô§e£~Ðáë`K˜ÄW/ÙÎpúŒ†ãO[VŠl~|ù,þ¨òb(©aãÐ.븵†&'åÝ}0¬”ÛJ´ÄF»‹“ír±„A±ü±ÜEy*¨¿‡æ€ðµ¤ñOÒ'&ò53zZu Í~´»1©­7mÜÓ-7µ~~,bÏNA Äh ÷–†~Þ ¾¾}›ŸhyEì÷🺳”Eßšãì(¨¶~Wgzßäú›FÖ§ßž¥‘‡S§à°í xæî/‹ pØï´xÚ+Âe/ð0Àð¹,mcz¼yóáMOôghÊ–°Tµ.…–w´â3ïÆ ôׯ¼¡¢ô&Žëêê¯ùù=|Ïʤ*µœ\–¯Ì¢ˆ[(´ÕÒK²³ü®Š¢>FÊÌûq´Hýªö:2ÿd&›òz[¯W"j7‘I4Å^`8ëMý¸° J.7«Û>T—üd¸¦”FÝxeqÌç3t·¦Á=‡Šn=O±@®çO¡m)8sf_¶'÷°^ƒ¾9¯þ’ñ …ߟÅ7E*‹0Â%ñÛ䄊I‡•ü–_(» B‹ÝnW&•|:ˆF ƒ“›o}Œÿàþÿ þ?1±5ÐÐÑÙÎÆÐÑ îÿ.ÑÕÇendstream endobj 1606 0 obj << /Type /Font /Subtype /Type1 /Encoding 4792 0 R /FirstChar 33 /LastChar 126 /Widths 4793 0 R /BaseFont /BTMPIF+CMTT10 /FontDescriptor 1604 0 R >> endobj 1604 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /BTMPIF+CMTT10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-4 -235 731 800] /Flags 4 /CharSet (/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde) /FontFile 1605 0 R >> endobj 4793 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj 4792 0 obj << /Type /Encoding /Differences [ 0 /.notdef 33/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef] >> endobj 1556 0 obj << /Length1 1721 /Length2 12211 /Length3 532 /Length 13177 /Filter /FlateDecode >> stream xÚí´UXÜ–h‹»w(œàîîîÿ‰€Uí­ÿáýgÍ ‡?ƒ¸ÁÓˆý!ðâ<\âÇJþ!ð¥þC<àJÿ!ðòdþxi²¼.¹?Χø‡Àù”þ8ŸòçSùñ‚ó©þ!põ?Πñ‡ÀeÓüCàÕjý!pví?Îþá³ëü‡À—åÏ9á·™þ!°™ÙŸCÆ V3ÿ Áµþ…ÿìó_vµü Á²V!Øö¯ãË Öµù ÁN¶!X ô‚­ìþ øÂ²Øÿ…`+‡¿låø‚­œþB°•ó_øÏÁû ÁV®!ØÊí/[¹ÿ…`+¿î'ØÊó/[yý…` ð{ôß7í?Kââž>Là3±ƒ¯X…ÀÇÉýéÿêiææì ´wý×£ží¿ÙÂüž@3¤åfA6)!¥~RùÓe°ôâ–MqÊuÝsÈ_–â!AE£ Nôµ:åéXh°dÏD.í¾jÒNq© ¯îÆéÞ-D:WéJ^ûŽ÷_NÐÛçoN¹ Uf7ÆJu ²~ žä©ÒIj¯‘Côè»×÷dqóèH§ƒ´Bƒki8ÈÕߥ:•†q†®{¼KL€YŸúâgŠÐ̰zéÐî†ù˜ûõõ#ă\d¤ aØ¢+2êÊ‘Hà§–Íz&>®ÞÝìÊœÆÒ†I%–*¢î}½-†gi O–;ÊÝÖzÒÇ]Éõ‘r"Á±n“À¸%¡!퇅Î×1|¦šÝ´”+óy„x`!š_âÈptPzíOìT>nÅDü›º|¥³éwhµ´ÖéØú ­Ù]ë»#îaF]\¸íý!‘ ‘üÑYçA_P—D£Ã^³å§êó¼„0ñhø×ï7DeVÞ•v«{ìNÊ^™rKyyt×Ì‘t°Tíþb—Ê“¢ý9H§ÖénÍ´Ì9Ivuw±Áþ1áq€dr÷)‹"fþ »øá¨ÐÁƒñM•Fµ4t´WÄKr!+MˆàÍZëünï" ‚t´ë¡ol‘y!HuÊt­ƒGL«Äûþ‘ÍÄXfñîûèÁedÓ¬Ÿ¬Tú11áÐ-ª©ð™Zù~ʺUôÙÜœ9ߺ3¾ßÞH+_ ‰¤²ž ù9tÒXTèñE1]ÑÁÑOåŒjkó!á|ñ•O;å]r™º`¦Š”Å’þZ¨«4mÍ ÔE†Û?qZ”Ð&ùÒyó¿]ãƒþ-Ûὓg¥“^Ÿ€!·WSЈ¨ôÁ„ ÒÚÌ6ÍweŽ©ûÚ@Ã~ÉGSDýî—7|ØŽçQŒ[TÛù//!|GÓTúÒBÀÜKFšá’ó÷ïÜÜ“û.Ù$—޵ål*MJåúŠ)Ë‚Ó`¿^!qMØú¡çV«Mî‘™$(õÙHË¿Ëû®ÈñøÂÌ:"ÐÚÁ/ D¡êÚ¿ËÞù^Vïuÿ˜¯îUYoUDÕI³@Ûu{¶e©Cé‰[Ðþ„¬fÍ_ÓÙöÅ1¥žgg€(ÔÖ¤Ðì›%{/ŒÇc¾a-ýæ;J®…5ùÝ £s Å„S,R’§±[á·8òåùþø+Û£[E\ƒJ¨#kƒójÇÝZóùÞ:y…Ž­µ¥®G©w ¯q—ìù~L£*ÛBß7KNwšxdi«pC8!>‡TæJOÎIFÞhšÇæt§àq¶Y¹HdÖ¬C‘H÷]%áq(=¿ Urêx~fÛY<•xøµŒâpËr„¢qÓ¬hÍG©ÎÜÕfåŽü ã ¹BXÖaæ÷Ý×?’¥ ä‰ÇÖØó:nÔ{m1)6«GsÕÐßeEí?Hâ‰deÅ»òq‡r›¤à=Öÿ²gdOßj#Y Xîã_âÎX\ÙLãñ”eáz¦¹?l#–D@#ê~-í®Ï º\-PèŸ?lb“‚›1¶_éÐŽ!¼¥Ú¸ù§AlÑ쨌e†ãAŒ‡›îŽ:Qu™9âçfùy.Îôx÷§“ßRÆ×ÝK¸úì&³šYŒ;Õ' ÜvÁê©ë‹òíÝ [’¤dž²Î’›ÌÂáFðÒÞiSGýÌèœïÉÛÆM™÷Èî)µˆƒ,rKH1^ “4pPD ƒ“’"d¶¾›ó¿WÞ«¼``hÜ\q´kZUYëàNu²÷·€pÉd,L6ƒž—*çN@O¶ x}…ÒéÄOæÈC7L¨l|í{»!©Ë®R¨õzvšÐV­9ÞÑ]ÉkÓÍÉQ3‰4Êv3HIaÒ½žÍ½­¯ÞÕ‘’ÊI Ãó„Ms5ÛÝGÛºL“7 Š3‡‰/iMbÒÜÒÃà‚·in½—Ðc•xì‰dl7W†­žl—$6˜@àRö/ßjXLk4°0 ž"4@V!† pAcÐ@óVV༲‰Ln; O¨€õizHqôË÷˜ó+zãêj§³(t®ÃŽh†‘²2l52½´8‚ ¿·zNjŠ×é`!š¡pÀ)Rq_N7‹è^{G¶É‡€Q׃߻ì\{¨óÙê3Iíz¥÷'ü7„ ­©¶s¯,7Œ‰Ä©—Vag£µ›‰=V?‚¬øp~nC˜~ ØŽYº\Ï82~SÂú\eU³úψ=Öüt*±¤¥Rojݰs¢N%ø^]}£%-KÁ¹=e‘ÅÒé¹ö‚4eF9SÁ‘ÏK´Œãý—\ü¼åðß(åüZÜ¿eÏ6pâ¾åk6œ+|ÛSDQâyCÛûúºâ­à|.àèýÚ4¢+k{5].=IÃ2¹‘½Íµ.¬B÷vO‹GV;µ%°tõåÉŠ½o÷~¬¹½}Š>ÆD¡]fìMLдѶPðÎ%ü|ÔRÿ‰ÉJ >5§$»ðè þâ®éáL–¯±@©^û–¶ô]¡»×èS‚ABï‹(9¶”&S­üÕG¤ÀÄÜËV-$¯íM³Oß:Qº4wÛãPw?ÎÅã þ@"')tijtK=jN¤ÌXî‘IwOc¹‘-ø•Ù> #d.⵿3g¯X GÊV9b2Šã\DÞÅw_QÚNu¦‘*è@ñeä¥Q ŽÀ¿é<y϶"ˆ· ‹/æ·G?óˆ…ib‚±pÀãnûTgòfELP¨0üuKÄN fµUs„s¯îÑƈ nÂ~ ©ÊÚ¯\¬î„®’„+¿ys¬¢{è1…J?WúšÕˆ‡@ ©¢ÊRŒCÔÆX?F†ÉØŽ-2n7áÿ°ŸVBï|ò¤ ½çÈ÷¿îað\uÑ€üZßž Vr¼†ÄšÄ {Xº™ÒéMúlG܈ô#~W4¹¶EÖB ‚M²JÉx.å²Q§™Ë•X`üF¤Ò{#Z±Ð•b>ÿºz,»½NÆÉ£Då :áÛã­=žñeôr¢Ù}anØ r…Û¾n½A…Ž~ê±w¹ÙO~e¾Ð­¦þ²i‹wkXÛÀ\Ôm„õñ5Û˜§î}=dȱjõô¬o~`ª§Ái£à2œVŠ€•íηR ©V,ÿŒŠ¶—IDóÑe%êÎ8¼nªé¸°BÚŸsòϳÎ÷g.„@úôî¬ì‚/ÈgŠfÁæ:œSKÅ2+P;¿ºt¦,ÕQénSDɺ¬ñ•Þy×Óq1^î·8̆“ßYŠGçZ["ŠÛ{E‹‡œk>_pØ:–Ë´v†´Ž¯–¬šhÃv-Þ¨ûaéo3àçbU¨>|c\øYÁ‰o`5O%¯ô~QèÓ¤Œ:'‰ŽÝ*õ jùlç€'dÒ…qÅ£—å‚—˜Cö=Ì’µ óZ4w!{‘/‚ÂÐM¨Ã3õ‹¯9 ¶ï*@!s@&ï³û²óhxWæïm»6© §QgƱaëé»wŠøõßWC‡?"¨ú0ü­Skƒ1„fˆ<545b…aŸÌ\/ë~þ?JWðôýÜç./q‰ `˜ŸýÄXÀœ33k¸BûŽ,E~ò ¸àn¢xòGûèZ@´6O½óý–-ÖP:uW±9w‰¾UgUV\êk1û<—k…  ö„“¹9F¼«l.†™/i/x-÷À®½|äÓ°ÒWÒ8ICWÄ7%úô—9šEä&ñâSù^8^ZR ÁÎ…–¬®|~@³Ð«Ïg7~Qv û!ÍŽ9Ô$9ζ²h2¦ˆÍÁ T\qZ¼:jx@nóYù›k±ûÍ¥‘{¿|µ3ïÎ^ÑÏS}]ûB«Ï?` Ñ8£Æ"!«¥#H~a÷í@êMÃëh>ODäšàðcÁœÞ1¨ç›yjW:Í‹ÜD¨Ë>F³r«M¸xD}ÀœÄwßI4o’Ú—õƒ!,# ÉÃüMÝÜ sc°ÛÎy0Ð" ÈÉâ&ãÚ“¦$dý¥[wD;ÜË|æßxÝÿÉúºØØQ¼¬%õÖÅÁeÛ÷ùÀÝèYCXP<²óTÌBrƒÄ¿JÛJ…ðÑìh1߆2Šqrh·¼ç÷¡-jOÊü5’¶NÎö%d\mœ,ŸöƨÇÉ+^@j¨åãŒ(Îë Ð90hk¨r‚ËÁš Ó||ëÇQÊ®Îðì’3øJê0}¨à˜’§!v£"ƒüarf¤Î°1_”v¿{TãøÕÿ’–€Ÿ¡Î2L'}®;*í£ÌìNÌp²åË*g ®:Òƒe‰È¼º-ˆé¸T\ü¡»H´uGü=¨Z¤Œ±BÀÒ?fð[wâÇáZ¾ž›o½?n®³¬)»Ð×0b;.a{\ìªsÇè´‰N%v—dcªâC¦ È6w+°zÕ·ÛJR=ì^Ͼ£…ÓÏ´MHEž%^-×G˜rÝÞ,½]‘F¦—?N“¦LÞZP½¨s6*£°¦;‹Dß™´yÌŸ½@å†dtÏ_ŽZó›Àø“¬‹¹™ýÊ;ÁÜ¡”…c§Î•åO`N†6~LÍý}c_ãi¼ñžÿ]»D€ÜÈäöÇ{y›Æäc¯!˜ï[QGÅÃ9ÇÑÆ¢¾»ÏºbŠ^#ï ½ù™žÎíµí/±œ ¨§_.vmš0–¾‚òk ’ß éº`ü˜˜†á ÷ǹ^;$åíï˜Ägo²×éÌråßön¥-¦íº..‹k(¤ á½·Ó¢ÑËŸ¿¿½ÈèÊÃìçnd::®Ê½­ö¤ Ä êIËõÜÀËŠñ‹÷ÓËÆú`ÕœÝRàa´ÛKépTA‘aíÞqùĪ¡9`Žnç]yÆëÃÔ£û`ó1l)²©ÑL½JyågHb*7tPOèpï"• ‰~zºå£”¤]²F8rtÄHhºß™HÜ`×Ãç;BÒùž¡µøÍ<³ðè…D©½$6i­þb€|TT@BæKtc«a„ÃønÊkqWqÝ,‰2ƒ CcFñáZ²½Dµ—É,‡"Yi¦ÍEûÀn½ŒýqNï´ÅÜÇ=:Q"ç¨N8®¸(“çIE#űå–ÅkA YqSÂ!ƒQÒ|ø‘·ÚéCQ†–1šnºföR‹½ îafö±Ïãæ“‚S÷´„l"Ï)™ý‰Ðý«~Ep¬DÚ~ë]#dêÆÖˆÑ«ÔbMgItŤÆLk0*ÜüUy§©£RNºê ZâmeÖ4ÒåÚñ’¢HÊú/Ú(ÔÆœVW¨—{`Ôþ1Ýù7Vߨå0ocÁ‹Â¢;è‹û\¬ºÄ1¼Óþ8ð¬ƒ/Ú­ZZœaŽãiêîÓ©ÃùõÆ݆ìõi½€ƒT¢n;yMº1ŽÐÇú†v½C–‹R¦‚+Ýá¥8Onô™"n/”|KÚ lD:4„Ÿ)õ½n–±E_™ƒâ¦ÌŒ ±£x¤Hp;òÙÖ_$äiÈ£ßÆ7¶¤ñ¹¬â‰ßtºŽ2¹5?­ÕHZÜrÐh¬— /QÂpŸò{bMI1•Æ;ž¬ßL/‡à¨ß’2èÒáâõ©%»ç!½·¿¡.5id‹¡k:N;gqŽhí¾Î¤à\åqzÂ%D0ô*Èt»w{6ÌZ»'4ÂPòHÓ¦v™‰ÚFÐ¨Ü ¼ŸÀƒÊÄ/šJ¯š}zùù#ŒlÈ2ÀÆ6÷%dr@½! ¢´Oè0°W¦v¿3j@÷»R¬õö!ÔK1µX³€7d2'!2ÈBî닊~÷ïeÌ•µÏÑÂHÛ« ï}±o¹Gtè™Pý1&¡T³®2xÙ?aöÞ>ø¡]vèŸ3Ð-@0 ¾©?~Ýv„ìÀ„ÒŽA{¹.•ÜR\Ȱ 4ÿ«eº~8ø¿ê¿RšqhùÑ3,ØÛ£|X&÷Éö ÛÎîÔ”c÷…—òWPÕÒ&ˆp´0?0…™Îï7e•·ê:Œ 6¬ÌâÍ ¦Í—žÔ̾~â÷aêŒt粥ˡDÕ|¢\‹ A “ÁÙ7yÇEÔ§¯Ûç¼V5[%§šüF¾™ù9仕K0¿Æöp9Ì~‡=h_"/=¼xY#O.Y Ž)=ÉÎ7Jâ ÄúíèìÚéâÝ}²Ir„ÖänzSõÂgÃÂäÙϰ2€ù%”ê&y"ƯK3@Ïv˜µõ½ÃAlG׵ܺáD6×6íHe³N˜™Î­U»M_&µjÈ{´ù—U^}¤§‹†§ÞI”ʯ£:Öùq‡ŸNQsdRj4­ä|p†èmm£mOFŠ$ðÎV"ž´^ ÂäDáh$ EãÐ7‹ZÍãI%—Ç4ÉÒxœ¹Wnq{ å³Ñb_-¢C¬nt*˜#ñ; Þ+øIE"èGk0ÒY2<¢Éñ^·ÃŸ4𤇻p l[ø øof Ͼ¬Pb_ôôuüø‚fCÐý°k,”éö=ŸºÐׇøP±×Æ»5ÿ4 B8ͳˆªƒþöÞOlÁmŠ<”~¸»mžÿÉ#0ð«Üg§œbtÑwÆo ¤œ\f*uˆ¶¨ZéÑšú·½eTf)Puë>é>\wž[¯æ2»Åúh”r4e[!ð&3B‹P^Â×"Ñ‘ÎM—Îê8_¾)c “ÊÌyú}BvS8™˜Mñ2~ûèâõ Í7“Þ^^ϽšI¥JÚSE¶…ýi·s¹ó~< vºÝ#ï‡ègø ¼ ¡A¦nJŽcãJ¿Zž¯½Ù±'–-£xh : è(áéhõÀÁók°ŒáLS——Ûª4¿ä]¸E –ª?BøoÝbÉW?Àgä ;ø©öÁ@¦ºEùÔ)ÔŒh.>Û(1ż =¡ÖT~ {ÐÄrG9&im¶Äô½]í7ûUƨ&hz¿½‡1“S¡+Âùä¿jã3ì¢ñžp‘ã=ˆBX;›U÷“Sµý”ñvs]x/ãUêÔ«¤MíïcÚ©Ý%÷w†îÜÞ­&Ô_¡/feãç’ã:D1“úZÄ}FZ¨÷ÞÐ™Ž· & ~ÿÓ~ 3“ÒLÕXl1饸£*Yš¤óØ`@BÕÅ©ŠAÌqö{Ä÷ èiÙA) /u~5™ îºtFíéþ[ƕŌÛÈ}lN쬹žrJ#tT4¹MøF=ÆvÞ'Õ¯j tƒó/VÊ?«ç1Ú·J4–˜‚,C4½Ç\˜™ô}r!'N«eˆ 42¹Õ½æUꋚÃY¾WTó>?™s׈·¿Œ•øÒs1ë8xö ’²â&¢>×^çóFöG“ï¢W­[´¬ m÷ÆíÚÅ:¾i ã Ýðû3Ûb¤MwƒX ¨¦Æ¥ÆIXÜí*¤“šp(ð²í6±´yPÈ n°¼H¯Ø©ÆTø4U ½PÐ&\É}¤Ê/V&~åñç¢KGQØ™Óßæ`hJm£}‰'HÁ¢ν¶Õ8°ìOð”~HÞiNV¾£ ìFÅ ÿ,Òß™PZMÑR³RÛ °©Ÿ’%¨&ĵ%},®¢™*Мa£ÌóN!Ñb`åÀìðÁÀ¿mz´˜ ” bUR}ŽFP{¬ ‚E®ŸbÕŽú/³,F’e¦ðì‘Ì1<®›‡{NÆ4×c”›ÀA3ÂØ|¢Ø“™úŠÊùk'ò;¤=覩ä f³éÁ‡o­ 1Ÿ8OÚZ|ÜÎøaíûO;d•]EY —ËbòQÍÄܘH›¢ ~ͼ;’ªgæ¡“zçew±•r<™¸Õ´5MÔ§h# H×E‡¹‘!_:Ü=T\› 5€Y”ªoRh”ã:žy(Œ`eˆc0[‚ÖËå¶¢§ÊˆŒJ¶ë…ž«â©Ôyu™®9?À Ù™Îÿ¾ÎñÁ8„Ý>&þ,ž¾ÙT7!ä%g-àK”Ìõˆ®øõ¥:ïÐ#‘Zïð}sHÞ7ÚðLP²y4>zOJÛµ4ʨGÖßÌŽ#L¿ÙFC¨ˆT-Ü™èìÞU<âÖÔ)Ukñ—¢›ß7%»ž$EÛë†ö4æ™EùÀQ¼5â“Ãý3UDõ‚azÎûû§27÷>U¿qÞð½ò&ç •bŽ”„êfuƒ¦½ea¦õØûÜUéZËK¶†Z.A»Ÿõe­]qE~x®šMÙžžU¥æ3.ñú-Y$s„K7úÖë$ÊûÎF¬äèj~Ca”ˆ,*áÉ„Zv¿V§ãiZ¦1´NBavçÔì“ljy¦+õ'þåå`ì'¾×€ 4Ê+a¹+ÈO!å /»^ˆ^(¾(º°X×òeŠV¬’¬ãRPü£MÊ,gš:&W¿…©ÜÌqÉ‘&“Ï*k›˜16W^Í/d/~0FÄb!ûõ½6Dö÷à1²Më>m ´;´m[…á,Òld“ó 'ñ'Â*$_‰¶„}—ÉáIPË®I 'ûšä 0Œµ¡BÏúc¤ÙRQFµÙèÕzx¼V©,~ŒŸïî~;/uæ\ˆáÀYXE÷)—e—ÀÌÕ_ÿÚë3Î =ô²ú*j›»½\ý–pb[š5h½–] eT½¤ê{ž×¦Tlϼ8çÝ´[$•TØ ;äô„VÿÍ1x_¯sÁ…Í $–1¡ƒ~•e çâ1qÀ¶bLmeæ¹ÜæcR#E!ÃI’·•A ã&_ë&ôùµ#³8ftŽã¢¿ ý—÷goWì±ñö“iÌ…CÓæ6ß#6!ÖkX’dKN°#©P¤¾æRв;æ¯å—ñcÚÅòMñÔž•vÓ§¥V<1ô†@s”ÂVç*¿íé±ïòpjÚ܇OEºCFUU†oŸq_Š^ ±d> û/¢²4bP5•ç`1a\ÃQažffÈíÝbÌÿàš ÞË' %ñ¨Þœ{9%ŒÒ‹hˆ"HÄ̾•NFsÚ-—^A†hù9ËÑê’^˜<ž¬ÿœØKÃhø)-©ÄÚë‘®S7~ÖAs&¥Éoù²(<Õ~ q>¼ut§ü¼0F«B Ч›üˆWQî=gÙ—îÔî MB< ¸}„ÁÕ–ºøÅÙ!0-}¼ür¾Å2î8­Wù,Ùõý±7Ù¡U7®eÆ}ìÏåÖ¶·°§Í/ù…1E¤Î™£JÕ¾œˆg°›(wsü\ÒˆœCê$ÂÂFeíÄx¥ƒÂ}¦5F(½Ï{¤PYRØV_½"â¾"F¾¦.8þV£\ǹ.^¨ÑŒœ„P˜Âbw5å<g¾[󱍨ä‹i¸4’Ý릨¥¶áÕe‰±¯_×spµ¢oè Û–&Û@Å(jbÙ~fðTc·ÈS º®%8¦ÐY4÷ÖÀõ[xùJ›f³PVºõþ\©6{ù mHóau*{¤£P™Á…¸™“ƒÆ‚ǧ µó-1ƒþ0åÖ©/jÜdü?;9aç’CçÝ¢Ûóó—é/ëÚƒ]4^¯4ö‚³vzQð"Œ$²ÆÇxÑ˯pu˜gªÖ ™úI ³ÚgUBbŽT:ó¬¨8ßZ‡ Ñák¡M?JÞé}I½Íîãþ1ÒLfú…«*îD"þ&#ê[Q+JqƶmN!ÃKd £ž©øÅÕK ¦·5qìwøqͲ€©ôŸS#ܬÇlÝÓö´µo"‡}€dýLbÞ×›c^ç‰cx)ÈJŸD4 ΑðÞl+Ä0õܼ„r¢šµý:^oµ 8éû”›'[Æ­%J1ý Zè[¶Ó£¯9E%‘å "¿Ë5îUý)le…û–YXŽèÊ6r†)kìh_ƒ†neÖñpCoqAg=_~N[xTì©ý¸ý°4YÜ œyþ¸ÄæšÖU€Ýâ¿ÿljl$†!ò@ë;§J¨ÀvÈFÀ¯ßÖ©ƽ?UÖÛvå°á¡<ÏR:¼S©úNX'–èJô‹ùõ½péu^Í—è¶–Ê&LÂa`¡‰f€È¦J…ÕCÞ$‰•›Æ$99ä)ØÛLw×·™èŠæ’d<Ô^úÒ LÆG’"Jæ°#¯äãZD§ÜKqš.[‚x(¹½¯ѤͪP¿º¡P+'ôÍ“·z»ÄV%úÜ¥n¯áoͲ-ˆ“}0¨.&AŽu§»¡(Ù:3¡?ÛQø”÷e\¯ïøS¬,Ñ£±5†7Ò`B¼ª™½™P`­Ð1/ G„µÍAV=½oBɧÝç“èuë$¯ Dt^¼÷Ò=RVúð²©1g˜o)´ÛIîØ¤ <:YOÓri¶VÙ{‘Yg±~ñç6ëdŽá™Nö Jê$:fHÌÖ´=u¸ :"$Ær^_r—…޶>þúLqth?öòˆɯeãÐ`&—žÖXÊøYðꦨ.–ÖÑj¼ë=}×à„ó[—Ÿ ¤"´‹TÒ»±ÉSÁŠ 4–]ûúú±6{\ESÍtàJðþ™¥»¡?«AEt’äRzÄ'‚Fz+±åÜÈ[³ÍkûØ–^tŠá†±Hgë ³”|ÀÆ*ÀsI]"Õ#ñg«Y%‹º¦ÀÑâ3´µû'¯­›ªÝ€ÉOTœïMU"íGõ°H8w!ᤎ²tØ¿¦Ã2›ÖO /s !ž2 5ˆ¬³R®š`“^[*ó ¡ì¸@¡s0€[9åþí |®0dâÐ ,j.5¢ìSOPÙuÄpjŸ_¢ªbÚ“ûájIMXO\Õ~§%™;[. ¾ˆøÕÉ+ʽüÖsÛ[ôæŒ`G™Òze“K3¬a„¦•p€KR¢¼™|ÆÚC'i…dt¶t‘B¸Ö$€ùíe?f±ý1™]±Â`ïcrSÙlÚoç«ú[™˜ ˆÂ³áØ×ûs¨y¨¶êƒÈ®b§Ó¥4j5t^Õ}3|Ù ÎÖŠtI*lû•Ò¶6Qkp)-ƒŠuÈK©ûüÝzÌør^Z¥ÜÆ»fYBiqìº$ ÏWß3n¶ìϬ3»â\ëßrˆ5<ñ(ù=(´wëèSÆ‹„ÅÎy0ÁÀnÓ…ÍTµ õ¶cœÑ?DŒhÂê¸GÄ}ÿÐ:Ĉ\ËŸ8ÇýXUÑPvz4-Ƭ9]iPÿôKÞ¹£»¨Ÿ`RÏÒ‹ß1>$ÜP–Ð ‰¤cüt‘ ½èAÆpÏ\NíÖ ÿÔ¦®’éz»Pïëe"S™fxLp Ú*bߦ쿺dîœx"4±Pvw ØVS;þJC!—e=q¥1rÄPFÈ×ܵ4Y:]æÚ'Ò™Ç2¥€‡Ž·“ÞŸ›ËL±3µ~M$V÷U=÷Ü©©åRe‹{%l›†W8h=‹¢Vlbþ±²å504™ ñæÕpTG'aÕà”á._±Û€šCÃiLìžÝ‚«ü¶§tv8D Ñû¿´Ea>Ê'¤óÒ¼Ó~ä!p~w»äãF¨…T$ 0±+Ê«cå"«nï3 HàJ½-ýpÇâçä­a¯¨4;´²Æäù9 ‚’é8“Ì$žÅméLrïœöÝ|0Zq­úÜœb:x]– ϨÉ[\_WG-n¾õþb*A>ˆbR"ÎÛ•JÐ`w„·‚+²}~[Def ƒB)E¸ÝY’;ÃøÀ›¯˜YÙ‘û»ö‘|¥òÚéxÃG8X{B\Ns —X9Á²’ ]6Ú”h§¿Ñéw‹]Ýì·yVˆ:`Oãà ,’¾ —œ£f_ˆJ¨óýW^—Åè|+&w®÷vW,ÐQŸz%¹Û-³Èï;|Èn¾Xè=Ðó*¿µ` ݧ0©høäôm®bécSs÷6aî¿O‚sÝÃÅBëZjr³œA4 ÂëUtSU32VsT|&0-Â}xUrí Ö¦7@Ì%”Yå?Í£.kÃSEm'Õ@ØJ4ShÖÈ(µ"z oͺæb¶ëñyÍÁ–éÅ­Ž&û%X¨“õð5w·sÊ.t$ Ɇޘ¯‰ñUGu"{Ã0žÏÿYWg™cíj%Ë­ƒz¤;P2Z\Š}ÝSÅȲ}Q×ëK¶¦Ií3…øcfv«¯dãøËТ?ðιò#]Bk¿êžv „&ßËùÓ€‡ëÎäOå'%yw<€v9äõ3U^Q欃ÀÍÆ(|:Þíÿð„fázd_âÈr\À”ŸøŽ­ ¥ÜEÖTJeîGÞñ¦—ø §†È à ®p´ }´'C¿²ûÐì#µg„üN›sæ]6‹†å`÷T/òŒø[vâ†?½©Ìxq˜Ÿ/AýSŸ:„Ìš ¾u,K_šÓ¸—Ì šô¿!“b¦ãê!U*¬b|”mÍ´0b( 3B<Ò©CþxŸø¥ú4’à@D¬ §c?³Šì”Ð` fbo/Ko iɘÁŠrÇß[[0#jùr×Ü“=9â'¿—â­X%‰®”U ƒ uƒ£ð7è@EZ×É@H?_o¨ Õ„êdŽ©ûYîÒbà RÚÈÌ5¿ýiʸ4¦,aÎÔ(üõI‘/sSïqû\&¬M¬žYyBåÎ5¨ ¿[ëÇqrTüR÷$¢r$nˆDת>·â¢kOY€]@¢üNM K©}º+íJñ§IâØ`Ó/©¾¥„pëÊjÆÁ\J}«Ñâ˜,@ûåÛ¯êÎ÷¶ÚšlÔ™bl·ŒôV]è{bS}êÓš¢hÃNsÈš"hºYØ”Seì(_Q?1TCû½ÐHQ$§RGiü¾ý•„oŽDñ‚^ŒWйPD­W6qæ‡*‘l»Š¥PaB¯ ùµ]¼NjCìäJ ‡riÑÜyz†ˆ LkŠGˆ|åN“ùç F â'˜q¸úÁù 5aT”{ªQì&š*×k½bÎQüaØ\ïDnHà›§°îæçs™7+Cu7…аw«[/õ,£VúE}I¾ÅBž–÷Ш¦Èt2z¹ûàQUúýîÛX<ò/uü£Zñ¶ÇÌ3¨U¸LÜEQG£™Õ‚Å¥1°Œ5÷0øÞý³Ò¼D¥x0ˆîهҦ—›W¢Ð°{¦>Ðj÷ hgÈ"òíÞzî¢>5Vµ5" —£÷ÂŽü·cC׉Á4¥‡ÝéÙKCPk-UDÄjµ%’HéÇôS˜4´ãÕ iáJ)rFº>ÂÀîHs2|<ü´ŠY¼ÂëGhʋѓç9¬x)â5â4"(Vh¤Ä$ µÞàˆÖ€]ݰµ›IiÇ=Ñ!òK¿Ó¦írUe(hWn#” ûc{Ñu]úà$Ž—Æ/¬´5ï91H¯%{Ïg7ô;}`I£u›}ŸÌi«ËFØßébIÃ: ƒÖ ÖßQm‘=ƒÄ ($â­U~ù›—˜óê ¢†×ûUR¤ÑŸë„Q E?ÖÌQµËá»jPqo§jçâÄØä\ýFŸ.ÃÖB2Vù~wxD4]òåJ¿;S"‡¡ C_jü²Å·¡·â­ý¬k¬žKŒ2©AîI£Œ—:Ã}:XzÐ×yú ÚYŸdÙ%jÖâÍ´QÿìKŒ!™Ú'+>¶`ËógË¢_ޝsøºÏ‚Y‡TÛøyØFoj4 ê ¨ý„Ê–™µËÇCüÎ=+4£Çú$T¦³<㟙Þ^ŒTI>ÛË1;­>?eÅBßÐAÁu§‰œ‘6I*&£Ð|Øíð×™ónLVÈdŸ[°±ür‰2‘¡å±ø7ç‡ßeì`F=õ¢ÃŒ-òhˆÛ”!áßfhˆ( Åž¯£ÄûÎpËÏ“¢À÷= SÆ*t€š©¥üîiÚùÜÄERm5ÂÚ×FGÎW‚šg/õ³DI„zŠÉhëŠØ*Þüv^†ÂL^a½/,Œú»SÀØ·§7šä§8®Kœaw£úš$¦$C@nålkG«ø1kÜD=ô#hvØÿV–¶‡§ÄõM2¿=œlpTµã&3ã~îž`Ù¦áÚF±ô=Hzä ÒæWÀJ'ÂìE §´DGòÜÏ(¸ 7ÖÄIê´Ñ%FΰþnQ Ü­Tñ=1÷Ùø–á)FÒl߸çà¬5½Iå}" 3³ÛÚµÀׯ•x‰Z­¦×k¥+ECä© ÝòeÛWÎèFD6¡»ØøçaÈ3¾8k4D\‡>^fò‚I»À¦àšs¹£÷×NáÂ:êÛ€o/¬m‹—»ðäcÈ”Â+ ¦ýzqs]È㉌⭜¾ÜÏ ]0–dẠϿe¡œm‚³Q‹¶ÓE¾í[+Dl él”™©ÇòágÈugI7 [ËÏXÅÏÄyªcfð0B&l@kÆ´<ðø×(?¢„Ghä½PðU ŒÖ в$šË¬t|.ܦ”§X£8ޱ¼®=Nêü)¹žd4m¿«J¹ *Ná,Yh*«4”„´ŒA?­v´‘Þº†;¶cÒˆõU6»Þ­›0=° R‘¨Ø®¤d3<9è7Ý ÒYÖ Ãíï™ ÎàϦÞÈìß‚Ïølùæf/ £¼ðžCê©FgÝÆß.q«p’ ©Ã9|fnüF¥j2Æ–-lh? UòÉýêÊ'?&PŸpJl4ÜOÛgÆË<ûýöâ…}³¦'_»Eã­Q€[Ô–õÓ7Ê5^úWÀΨ‡ðnÓµM¶ñô[³ÍCç¸JJHL\ÀBZ`4Ââü-c쯯tOkïÆk‘aëýI"£7–s;×Kd°—#{f”Pû'Ž®8žâ/>¸ñÚ~”¿ùô[ ±qÕÚŸe×íÜ祄Ìvˆ"ß7I†¿ÏnÅç(QÛQöœ”ƒ¤æ!Äë€}ûzk݇°¹™hÄ…Ï&üïê¿vl¾'F¯ŠÀüUItOdN‰øA1ˆÑ¦ÄEmÂwg°®à÷n|X#!}E2ñe²`)ù¨î·K~$U±‰Q@øs¾bìpi¤_Ø4º›_稉Ä&‡ŸŸhepïkßÐõ ½[”ÎùmÇ‚~„Éf#]âî ;3cÚV9n9¯˜¨™PŽzW:]ê ¡~âx’¤6ñýªÉ›3TYú¤¦*0’ekÏn„mÕ½˜½/½ß´ñÃYlZ‚"=깋ÐÚC¥ç|3H2´ƒûê ¼:´ÔÛ`,NÕ2ëÿÃÒÿ?Áÿ'&0Mœ]ìLœm‘þg3¢endstream endobj 1557 0 obj << /Type /Font /Subtype /Type1 /Encoding 4794 0 R /FirstChar 11 /LastChar 123 /Widths 4795 0 R /BaseFont /VJIPEM+CMBX10 /FontDescriptor 1555 0 R >> endobj 1555 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /VJIPEM+CMBX10 /ItalicAngle 0 /StemV 114 /XHeight 444 /FontBBox [-301 -250 1164 946] /Flags 4 /CharSet (/ff/fi/fl/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/V/W/X/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/endash) /FontFile 1556 0 R >> endobj 4795 0 obj [671 639 639 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 319 383 319 575 575 575 575 575 575 575 575 575 575 575 319 0 0 0 0 0 0 869 818 831 882 756 724 904 900 436 0 0 692 1092 900 864 786 0 862 639 800 885 869 1189 869 0 0 0 0 0 0 0 0 559 639 511 639 527 351 575 639 319 351 607 319 958 639 575 639 607 474 454 447 639 607 831 607 607 0 575 ] endobj 4794 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl 14/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W/X 89/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y 122/.notdef 123/endash 124/.notdef] >> endobj 1547 0 obj << /Length1 2171 /Length2 16027 /Length3 532 /Length 17221 /Filter /FlateDecode >> stream xÚ¬·eT\Ͷpw×@ãwwww·ÆÝÝ-¸»;×$¸;wwA‚ýœsïIÎ}ÿ~£çªµ«f­’ÝP(©Ò ›9˜%ì]陘y¢ò*ÌLf&&x Qg ±«•ƒ½˜±+ÀÌÍÍš€>€~yØÙxØYà)¢Ž^ÎV–®jÑOÿ$q„í€ÎV¦ÆöycWK ¨Sc[€ªƒ©ÐÕ‹ lk Pùç € Ðèì4c€gf˜Y™ºL€VöðŒÿ(IÛ›;8ÿ6ssüß&w ³ H @ý/ÍO¤™ƒ½­À hϨà rùÿCëÿv.áfk«`l÷O÷ÿêÿi6¶³²õúŸ;G7W 3@ÞÁ èlÿS5ÿv“šY¹ÙýßViWc[+Sa{ [ €éß!+ +O ™’•«©%ÀÜØÖø¯8ÐÞìÿJ€*÷/F EmEÚ¯é¿Ú”Œ­ì]Õ¼ÿÓë?Éÿbæ? ªŽ³•'@— T^fP"èç?éÿŸ±ÄíM̬ì-,ìcggc/xÐî;À‡`eoô=AÂŒ ö® G šøÌœáÿYPК3šÿ+öod¡Õd¡ídû'ù¯f£™ƒ«-ÐÅå¯ 7€ÑØT÷ÿDXA9¹9¸ÍLlÿ½þÓÂʵsí&cPÿåþŸüÿNfc0:;ímæE™ÿ'ú’A1vù§ ›?AÐtmÝ\þ@f¦vvÆ"ìFK/GK ýŸh– E+‡?†lœF[cË?ÐL¼Î I8Øÿ);ÈÞÕãO;;ÈÛÕÒøWÆ?µwpsþø§úVîe€t]@ûâ? ’uºÿå ÚŒÀÿ*;HÕÞêo®ælëð×CÜÿtcgõßQ ÐÉÍøÏòs°þ³.@—î£?Aƒð/ò‡@c‹þ!ÐÀb4¨øˆT‰?Zòê"õ‡@ÒT™?r‘ýC ¹?r‘ÿC …?rQüq\”þÈEù\TþÈEõ\ÔþÈEý\4þÈEó\´þÈEû?Ä rÑùC gcS ëÐKá?ì¿XÿóÀÐUÌøgÓsƒ LþÈÀôÏqf)˜ý…ÿl‹¿ðŸMû‚´ø A%±ü A5ùë¢`Åú/9Ùü… ©¿®&•Ý]§Œö!ÈÊá/Y9þ…ÿlÜ¿dåüþsŠþB•ë_²rû AVî!ÈÊã¯Ûdåù‚¬¼þB•÷_²½;þ¾E˜Y@£™Y.VÿVú_,""ž>ô, ûô‡éŸõápspûýW¦©›3èJtý×{4Æÿ²¹èmzMáWLyC­Ó[Ã+ýÅ‹gª hÀE,Úšzæ»B–ÁmËÆdh6µž¾da B{¼¸Duú*OJ\9%düx;t7:Ìòn'кɒ÷:p$}9Céh]¸=gWœÛ¯LÑ.̽:+T¢S;‚Y'ëÕuoîÍåàԒȲUk¤d%QAÍpªŒd‹Øð@MIú°1âoû•ví§C§úS1lAò›ÞV<ši'1«Ê. ¦Ê‘àyEI*JÃûÀHP6ÀBÕpµ «2&’‡^—ë/n8{3%)ï~E×Þ©EòJÁ¡¿Y¶oÈJkhY"³\ÊtTìPKõëýv HûÍ]Ô)›@¾xå‹’ìZ«¡÷IŠ©Ýš Gg0+{Ó›ù6G_ØžÔQ0åÝÇM(K_دÌÞjõÉZäÓ‹¿¢ ÊÀŸÒIN^ ‘œì€ Ž3#QœÐÏ‘8/†ºm=¥ù4ù—9y5ßïèhL7…TÊkT[…‹üƒöƒR5o·ÝP%ë–çÅà_k-ÑP28Ó‚~BcJ+oéº}`)bz-nqÓáj9J§ùÒK]€Ÿùò7×éëÚmªÒ·ÓœŸí¾ß‡'Ò¤ã&’£ñqP[~'deÚkš˜>˜ðRÐ.ÔG{ý~¸‘¡ ¢àâˆÛX—§`û1“¦‘¿^x¯–WÀÀu(Œªv” ïðVK,Ã…!v¦zL=6¢T.ŽŸ¾i1µG ‘÷³XÏýR”l‘änޤ¨1Ï|˜Å9•“9únW–¹ùÊbž¦gjæE}cu>âMKScëÙz`\“ÞM;<ÆÒ¬*äv/Mp¢={Ï.!àd‘§ (îà!Kóûí×ò/ctæŠË7±¦i¬2 I¢âáÂIO~fb™©€[¶µœ˜ùî2òÃp¸M ôÁÖ¶¹!˜—àѳ…å†}xwœþÚêqß)0æ\h*»¶m 儸4+®˜X˜×®Û-1?¿DÏØÓLßn(ñ –¸üÍG²]›WŽ\}@¯پ؎{á+j.":ÐHš&õJr-® ÉIö¾œÎÆg ÄjåÃaz²,ŒtÚqa׈ra³ïV謆W¤€â„G— hFY&ƒÖ´=´Î lz 3X=?Ì`Çð“wA9+åθó¿¢Þ[©$ù¾¶hº\çÅëõT¹úÉôUÒ2O9¿ƒÖ#yÊn[Fô­ò{Ji9Ø¡®Žþ¼Q [ôº\q&Ü—­aˆÒøEsth4Cÿû¾ ­ÚT°3„Kþ¨YßL{ów(¡•±¹W~¨ÐZÑV¸îøä¸ñ\þäÄÝà(€mœÏ5ŽWt7vá9q7Ncs·Ö/ x´¤Ï£ás£GqÀ­ÿ‚÷RÝeש2›;6"c l6ªÆÓl`ýt;,%Rù èÀHIqþnn’¬ŠÉI˜Bôu˲û"r ?¼ÍØW79Ts6¿˜c{î ¼(‚T^­WÆi›âH§:2úUÖ Ð+§$C‰,ŽdɰD„‰| C5K)ï¢+± Í*•ë¢ AKöêy©i±ð$MmÅZºkŸ R×^Ñ£tŽSr®ö;çÀíá¼ÁÄ0S*j÷ã,Þí“ %ûGÄ€Pˆz ¬¯‹j~ºÇFÇœY Óõ‰‘‘ì{ξÚàˆ0Z¾‹ª!Sòóbœd»O©=‚ý0’å±P2•×GãÜ¢L~/~@,¹‚\DÍ2ÛÂf††ÉòÂÿÇÂè.wõS¡—µý–ñŠ. †73~¬+RüQw5z‹¹ÚcG. h:› ‚éÌéC.C%sª–ÏV'ª;›%•˜¾þÖYMlâ€J=_ªÜ-‡IÆ(æò 3”½@ü{Y$Å-·…™ jvŠØ“-Vþô&éQÃM”ýµ—‹§¶¿Ň/ÊÙ˜){¯éw€þ>aNDäÑŒB±aàÑú+õå̳óíŸp]NpðQT˜e‘Yî :Êò)z¾“û:äl)P/v4(u¢[ÅÒyH²ö— jÚ@| ’²âœº4Ïmܸ;É´{‡QV†Ñ&E-Ù¦R–)5p«ÇiWE0¼1E¡\ü¨¥ý™­Bô!x´Âýx†*Vja«ôÀooYÈvµ«Ôôƒþí®`̧?Ϊâ<¥@ ײ„ç8Þó`/ÝQssÎá ·ý¹)O2´Ä-Œcûéž‘îN\ì§Ë+v“á+ÄQ>0j¯¦(¾þ«™#. ˜ˆ_’¶nß‚ù<Ó{kê¸}Ä*z,½6>¯$ç—Hàg+¾"×ì6.V0Iœ¯C¨E† Ë™VgeÙ‘Éæ“Ò^'lã¯8hq3-ütNDør:B¬o&P½[z…«¹AýAØ4qis%…"„\°_èì¢$Â6Ó9¶ïe ˜ ¸Îdך璨+¦Œ7œ,S'v!;öÃj5sPèBèr]àýO\ž®ƒe:ŒUT¨ÞFY˜ †˜ñ‘9tî<£e•t-œŒCk-ÝŸQf Úß&z3¡_úŽKóŸ'¤‹}€ جò9v÷Æ eð\ø­}%ä±tí=ðvÇÂàN ;¼a50^[¤A 5AòÖ±ñ¨ØóYý;¹ª)$T¦)Åz£\å7iÙ(HhŒ8ºyâTRu\βíÂÝ"Ö9ê8ƒ£c…¬ÈÊ ÄyÒ*“Ï@•@˜_äŸóGÙï#nh©!—§"©M:#Ð7-PŒ,Il‹eÜÛ.?òìg#7ž\º+ÚJúw`a.Tjëfv­OÖY ”#J„¾Þ+bL•ÐòŒÊž¤‘^74¢ÅÝV½d+g:cù< Wu¶¾rï„)µ³ö膻d’«Þ£ŽÖãýÃúd­ò‹¢Vü×.¬„Ÿ(œ¤¬®µc¿EeØmrŽ<¹rÎèvÒ†$ûâqv'{èÁôC·€ºÅáååôxéç»øóSÊ™{þ”w€HýÅBóáÕW~:¯DR³/dXžòT¬}¨‰IÉ:i‚Ͳ•)#¯Çú8’ýÏúiÖLû´MZÉά» KÕ«€©ìQ–€Þ¾ßûº?CÔøøŸN”2rµ*‡Ü3#†ËÆÅÛÜmÂN?jàXL&Q°(W¢ù'1àb~÷$P¬V·œ¯³A­5?:Œö—©¬ˆñµÿ }V.ÁÒ!XÄú3æÕÖC£"ÇõŽlUõ+UI¿³EEºÈ g>¥1rÚñiw;þHã¯zŠí\òu<ÌÉÓôçïhŒßt1l])ƒ{;Q1±5µ¡QZmÉn9†7]ò–7j‡†~Šw¤®v†A@°¾CŠÑ9²a–<õV÷y£VÓ’óöÓÍQq,R™߉o“C2Í”\M£ôÓž' f F8Ñ<÷î>nÌøåò”»gä]"ÇÇ—2*3âÇk(½›¬-=cGóÃÀ3Á©¯!·éË’üî«d”4Q°ŸÞ¹ò!×&ñ"aI~ Ÿ¯í+3ƒŸÃ*’ÌÈ4“›byí(åÈr®€G£ÜcG&^ýHqþÙ£HéœE(ÝpÕÅ>[ùY ®~._ê5£éÂzá’!¸x–Âm€bÔOxĸ݊&íˆòÆðóNTTÂãÅ‘¥“›Dªu¦Ð@q×oœ]²|pv!û=‚25`c>µH=¡b°ñxÈ€ÝØ0EÝm¶k&ú5šd’oqÐ4‘P²á'“",ѹW™9ÇRKƒCOk8v[Ÿ5äÉbgò•k[¸oZM4ª.+ݼÃŰf4Ñð1÷»t9ÜwÍH¿¡NÑ1çÒ(€Ù_ul´Øã¤[@_6¼‰­Gd÷27 9 eevð’¢:á×óï=’ãôt¡È®o1”åÜŒÑW7B Õ•Ì)íOôÄ¿(…¤5×)]íôJ$”PZ™‡ µì$æ&¿GC™Uoâ|ì;1Íló=GKc~›. ÿÍÜÄj"5D? v+p­IbXö($lOp¥™‰5ÍVê9— ÷i¦•Âp>¨¯^ ΀àÑ899'Ê•Ø>L±T5nRï;»ã þ…f.ÙDEKÊé_€÷Fƒ[ÑÙ»Tµãý>Hi:ð¹ú k.z•€/ Æÿñëçöco~¨¤ýR¥2é[ÞÛâ-kÚWÔJæƒ&ñººê"دËP(tµ”GzÃgôlx®}zGJz÷~˜öÙ¹J@þУº^û%S—šAA‰^•€üíÓû<vÞÖîzQþòí¶ÀÕ0åö.µÑƒçÄ[„c7‘4ôñ§JÅþþ]–ªqáqÕ‚²O®L$™ÑÍ”ÇЊ ³¥;»˜“ï}«˜(k’yG ¿Xhk áÂä縢Š_ü!ǪÇÃUX]ÌTç!èÀ-˜ƒn )'î ×oJÊNZ\çä7IÙóy{6/ÄưtFWçä\ôšx[EÕ>vZ¨vJ ೆSÞdÂðf×ДPsõˆ…±­ºí±Vèéa™rØx¨.êî1#G„¿Î[v·poÃý³øˆ¦ä1-ÈW1GçØ·L…¶––^b…HçÝ‚iO(´Í;éˆÆŒñµCîØkf{4ïS®¨vc˜[šµí%¶Æ‚1N†žÂ}'øeÃ2eX8önÎù [K GÂYu¶%Fû¸YýH¡LŒ9 Òø^š%£ A9ÊM~ôˆôž¢Ô°Æ¿]C¥¼Ýa¤rîmp Íâ.,Lç¥â§@ þJn½äY€…º ¾‡«™WBž•8è;E\’0Tl÷m¯N1©ÚÝ»”‡…Ϻ¨§«Øë™ÈA sþ—Ãô‡ô’'Õ‚­w—Æe RýïjCBpåq[#6á)`ØSÝ{”RÈ(í‰öhK³iÁ²ÌÕº_+©°…a(·šcpž ÁÞƒœ‡ÝgŽ ì}dM)‡YQåmÎ6 à àU:¸G¨¶›ìš5•e 8FÅ|¼‚5ºõçŒÔ`qöë™qª‡C‘oêÂ(5P?g 8ºÁ´.{ cµÅ 4R\XÁMÊ S2·K…öÿ"„¬|Þ{UèbÍ#½„ß:íl\™xm¥¶sïdЗâùðàì†ú=4ºŽý6"¯­Å¸ºkˆ÷×ù¤¥÷áò+QÈØïuvqÊØ=ŽÓ(^äÞ˜ÅK8•× %ù‹N›A°F~Ò½=¿))Ò<^Sýî¼£¹Fž§B¿r!ŠŒ­ ¨ámý$8‡q0ßn™Í·Ò…6kÜÄgLÛ9÷U.'xf_ÃFQ•éùjg‡zO:Q2†qr7if6ùlU ¼‹½Y§$ v–†€_JeZÁîîÕÆ ÉCQ+7 ˜-â–„¨~|COTé‡v± š2…¿à¿Î;;à DÁu½â™‹1CAÑ'µ¦]7Ž}€â`óÝWÇ”–:àƒ·i_&š›ú+¸]óŽò•,—*:ýÌû:±z‘g G2ù±  3Ö;àÛS í±9Ô3ŠÒë9[^LŠŠ\hI Zµ(VçÔí¸l#u•³HŠd´­âÖ§±k4W¤6?˜(Fî¾ÇbT´¥º»OJW;i9–ZH8>ÿoÕ~Ò*„b1¥m¤cŸâgŒm¦;Ô§o¾àä.ª„Fù'•ºû6—O8²“–ßEš¦Òz'¼ZÔvM¦w#äι÷6o8²tß­a€Õ wYJu7ø&Y+[@…Q7ùúôÜ \û2ç\Lõ­6=à‹l{`¿²ç póJµIÝ6®yÍø(žŽûvUO"þ†3)RŸœ`Äp h!«p‘vÝÞ]¬J¡*be@ŒÀ‡Úî-&Âü鯽“PåÍÚÛ¢Öá»5tt+Xc:Ÿ)†5sCæÕTâÈ/ÂHQ9ó¼C†#îÿöû=.[Vùc«2,»f›¾izTÝÞ;…yèÄ'ª}§Í((ƒDŽT—5xdž›áªÝ´¢|0H#bta_pH¿ŽÀn¢µÄ€¤’ßÜÊ4S¡ ø2\^óò'·²ª¡Ÿ›Ùø&7ñ—ÙKÈp1<ð}²Žî!9 Å6¥°±·(ªð»j¹(yòsmïx:ö0 ˜>Š|ÃkhB›¥Fzx…©¸VFtŽA:M÷Ê÷£96@¬6Fpšf§¾YN1=G­¡GªSà¶Õ¾øq``ßApÖÚ¯„ »ï ÑN/ʋǻSIo‰¥1¿léâx¸‹–­\|«lý öÃÇçîÙôe^NÞØ§ 9ìJùX B Uú~¬ëËMjž¬«[ß^ÜL†¢*Í*ôËÁM‹ m%u¯¨Ûh¾¶;‡ÑáùÕ˜ý…ð†a ì€Ê®/‚Y.Œ%¹O±.œÃ‚Çé¥"\0ᳫ5úËJhÇaÐ`Ùè þ3M3‘æ!:ç(õÔÁe(Œ"ÃÿwÖ=¤ .ŸËÇA r:h€yŠwÒӜ릚é>Ê=I«íÏ¥@%µj ÍéRÔ¸™þÙ/ú]uYÂç‹ù_Ô*à¾ñR}Hðïé=¡=2aì ÄÅÏóà,JO¼Jd½Š—0Ô…8ç8n˜ÛÍ:–³×™êˆd3s/„*«™Æž¨úDï¿ÆY½ÀÝ ¡ÐMê„ð›ß§ôsAÛËŠN‹~Îy'œÂ˜@Îv¶æÎ6Ó1(Z™ÍMð"_ò¬¬th]’G÷ºslÁô(…D°;"©TCôÍ—üž(åW¦éK*•Aw¬ðÌìœm_NÜ–yö½üÎ~rò£ÑÄ••išÜ©jш{Œ;á‡à‘ÿ‘oBÐÑD%òÖAÔ¨@î ¢EfÿðŒ&Ø^ÎÑi©¶ÂCgæ‘úþŠÀî¸êJBÿUÅçú„o2nÌYçyÉ!×ÍE(=ñWe­°oÄÜf/º!ÍÁÓÕ4ýýäB8„Æ=³ä"|ñ›”žŸ½jœ±ÙeÔEÆv…Oˆñþí¬,õ×z•5ý@üƒ ÉV¼9ѓܻCî(HxgÜÍŠÔÜ_Zc¹iH÷ ÷*’¨X w¬ÔT%¹’l‡9°pZ_6!\RFß½m¶úí?/¶¦÷îËôí¸o‰hñÔ­Äì»­mÂ55è…’OZ!iÔ>`åÌûW;yöO4pÂÔ ÜI”r,Ñ¡.©n±ûÄd'•´ìHbÿÚ3›_“*‰ 2ÇG¤xÙ›êÓ[ëUÕœ$Ž#½|ÉrøÆe3+šêõi±ü·|â–J $ë‚ȧñ(ˆ…,°d³ï„S"_Î`˜V¤ôÎÌÕ_gû+,ßÕÀ.‡¶;ì¯` ˆÖsðJÊÐOä„}Œq©Núb¸“݃y!:˜>ëÖÖ5=ôâ5jhÀJPGh;–AxÕSq~×½§È¤^g„då#¶9ãΣná‹}æ×Œ—÷­õ«²\®-4’}÷¯çÜEtÂLþ\EÄßåqû°à¦ÍÇÁ’TJGä¤Ñq˜Œaî«+ìXZ)…ßXŽ’3÷9|h^Æ'õxù›š$¯N £ç±ÑŒE§9C÷ÕãDçó¼âVJÌ>YÖ#Ák:6¶I"/îÛæÃçéÍu 0‘Wö7Íߺ̑…é"üHûiVÕÜ\ƒúcÃqj¡Û¦À$#@ñ„a(";”oh¹Xóp 5[Cˆ^gÊsŽãœv³Í‚Fˆ±A¸3^!OŒÌb!u¹¯p¥SSx2é'ÃÊ ¨ÖßFÚ“Mšôn ꊑ1úîK6~BŸŽdÕG¡õâ6U–ÆÉÀV öîË&–Žäúj‘R¹GÑæxnï¥V¨Óƒï{ }v|°$Ÿ‘~ÌRd‹ÛŸ\-ØàbÎÜÑè ÒDÞ)Ї:ì¥îjÀsVŽÔL.^ƒ´¶W؊ʈԜýÐÃKhöo‹¦g}¹0ÖÕÕY–‘Ä®$ßé#ä¹eêýÕÎõ¢ÏTgrJ™&ýd“;²òå—¯ŽdA¬nÊrK?ë£_ÒšSÔ/ÂÙ³ïä*r}+Ïý­úW"õW ó8Ö¯Ðp¿ª§Ç5Hô)œ'“åÁáIähF>¸”ÕYâž\ßXž¼Ç.è\ ™nLjkp _ú]NC‘à ×Ä5’ –·ôë:lÑú} ý¤±IÐ;ä­“:šÊÓ1çKrBª%!’ž&9[x;X¶á#;e] =ÌH Ø¥;‡‰É—ƒ[–ÉQG÷)¬á¿-.Ò:EÓvx :ëŽd.HS­ûÏ ¬#Ä| Jåb»Å€ÁýïÊM(*JK‘|Àž¼¥þ–¤@’´þÌ>múFÙN}Š»Ÿ}Þ^C(•©€Î¾ôóE dr»• ù EÎfW®#¢ ’ Œ®–*B?k0:bʳ:ÉûÜÇBqiõ,ýqö¹ò#¨Ÿž{³ ãÔβ[áIÞ®Ô;Šz§æ>E’¾èXø5ëÙÓ3#ú—ó›ùتÓkû¦¨x…éŽßd&HohõQQ²Ó[ëcÂ+rN§èïõ¥»‘ß\ãNÛÊW, ¾àÁaÎçÃ|ƒ¤é¼å™þ<6_ÌÔBevÍ&~–{=éëX*Ø©›Ç†L½öªí/e˜ì$­q¿BÐgRRÑÛ¦Ü9Ñ»cj=ÆxÍKs±ÙfÑjßòÜ4KÚâ$;¶€[æÂ, «Ú•ð™E¢Ùh—o,3«qô*jSâE¾¼’ø^±SÒCÙÅ‹—Á±Ñç:Åq‚ºî@duäOõÌ¥zÝC–Û'Ÿ$^V¢ŸØkrs%‘^î)iMêýE±«mˆþ£ú0Y©Ñqü’Ó˜p3^G†# ࿲d!¯êM±¨š$ ´ìTîê°EÆ[Úx·¯@‘~˜òú¥©£ÅAÕ°î/µ^`d,<•±¸Á{_€¹ÏÁBn`<ü)Ó#¾9).LT`ÝG]0M@æѥЮ-¦© Y“糫£›­LóË÷ÂJµð‰‡¯¾2Ÿ|AžÇ½îÂBŠg¾q™îÖ’êj“tª&ô¨V*­{é'É&²Ñ:Ç•y ÒImsmV <äxÀ­…Iñ¸|¹ÑÄ ’S)ŸKL{›5Œb‰ÁŠwÓþk›]ý8]£W9s!NÅ5_ü¯Ò*ú™‹½ËŸ“¸#£¤å„  ”5´}GÃ'4ËÞxÄbLvð?Ibšh¡h]Æ‹%1Â,Ÿ¿1¢q\‘›*ån8¶¿_C†o×6[TñŸéBüJf`¿5_Xí]•?‚~_KÂÅônõÙ6Svíe-˜&»úÞX¼ï{˜[Wª÷";z.ÊÄÒØ¬ý©êìZÞ¿tM²¤ú Íd¶¸…ÓovY,örtœ^$Byð\÷ñ‡Ÿ„.­V)Fº8•ûŸ8Ž'w`–é&'_ÔíÂ&m´u´ãÌ;o†îB]/,l‡%Lz¤bçÀç^ ÏŽ©†õùŠó›{@º#uÍ€Í(=âaݲÐR¬=ßR^•ìȃ¯B®L# ¹A»¾uü;7…}îx¿'ŒžͱõëÅ”(|Ž#Æ*^ý-×sÚËkO5ŠñB¨yU…‚’“Ì>É’“Œž«q” %àÒb¸I=ñÃgíDÚnÝYޏ6êm†…YrzÚж’¯Œ¢þá#D!Ô.üçå“aP* 4ÏŽiea!H¯݈8:m-Z(FEF‡9½¥jÅO¯dKzÍ¥~ÂR{/oo­ß\ÑÒr~§=+êü2x|˜ìõIs×ÕÐÙˆú©v;Ó­iù!§P¶ÿ 7lÝy ‚§C¦ÿ‹¿-ôܨÈí\ƒƒä éÈÚ7lþô¶áÄÖ‚ñ s\gc\tΊߩ·ôK±1v„°Ž`Õ€äu Wý›)!ºi¡¤ÉJl¦{š~˧F4’L½fÙÎWI^ðj¡ÖÄÅÝQJY„ Tä¹÷D”²Ev‰ÎQU.r”þ¬ G„¤ö?^ÁÉä"n! ÔdÜnó¤¨0 ²>ÍKÀÒ’ýZÿˆ:Í.–t÷Îo’H1Lf¹¨úåŸR]<.f8EÒl‘â’º‘j¦âUÇ-(æ2$fªÌ¬-mâ“õˆ ȃwè$ti+ â%3Gx{~7‚¸73}áÇSQ$xýÑ;3gâ"nôÔûWé*µíÅÜÍsÓ‘äZL§!jzÐ bz‘é3—·Bà&–pàí’Ç¿“ÉNµ®ÿ K»×Wob›•–Át€Ÿç­™×öá3¸½]a(UÄ8ËË ]ÞXfëׇËx˜¼àÁzkâ@uöÓ¨rÿN7ôJ€Ì©Âí‰T 9Wo£™êG´†°|Î\Cñ‰œï œ†Z¨å[½-ŠÓßɶЌ†‰øõÈ¿,Á×Ë@>âËnº%11{Ý6x’üÙö(,GCê)äBŽl`üüÏÝlïÚWæ†ÍDTf§aüA£÷¼ÄåUY•¨×u·Û©ÅÅÉðêúŒžØÃ{ªµ&c;Èxýþ8güØndSsm]JLz«J'”†A³œ9l§'P³q˜^5¨Ñ·­ºgè¾Ûêa3ôä¼×ÉÝÅX¤JÑÀ«+fj“L5‘ÖÂ5¬jÅtØB—R/ ?scƒXžò]p? |´¡õä‚}¾uCkûŒ"€œ¡þÀDð-®'<ǧú‡è']QÁï'`lÊ>x§+]Iq5#”wj #²ÐWJlÓaë-[&†D¿¤ðVëvìD—k4¹x lMáGr8Ê¢½ ƒòî9ô ‚ìÿÖGè«‰ÜøU(‚³0ä<–hô­ ¡y”øböþKßOzXA2˜wý=ÊE• í1—kȵqß.oN憇z¤Þ>ñÀI” ®°Ô-êåñ]Ú=œ©jOL Cã%‹0*W0§dµ6`]`¦[îÇßÝùe^Þ²ÎõúiJc¢û^Ç¿é1©¦†jné ½¯ØgÃŽjŸWvlùÜhê8MžÃòõ/飨§W2# }ž&NQûåæ¹DNfòÅç…k0Xl¾~ÊÏW"->_úèŵ٥Z†ˆEJum3 ¥n0ÒŠ'EŒÈðC› ¼Ê Bó›ùŠÙ%±d‹Ñç.5%àÄ즻˜+¹–X—á ’>éP„8™ ¼òÇëNRÌàÁ‹‘Úl:f¤[!ô¬Þ²hæ¹ßðvw qØÂÕ8žJÏG%¼E.¡§ñª­\`ð¹kìÃå—jÚëžUSüõ«Ål—_]'Ä×GC0jëæô~D«£E"Ê8qÙìj*séDw鮑k†ðŸ5ÍÂE%È2MÇÚ’¬|”%þ…n“ƒ€@ârWѬéÑ™ÞΈ}âM-ÓZ-âu,acßÅŽ–Jõ»™íþhèVd[ô°…âq„òZ³:äx×"ÛOíEr¡6âús0¯––ÝýäÉ‚kƒÏ©ÄáüAßûd3µÌ—°0rF]_j¥Ý´ð¥Íº;å‘°’ž;lÄ´Ù§ öiYpfÔKD9I»¯,vèax3ý±®¯†ióPða'0}¦¾ÖZãÞ‹pg1p³¿ˆ† =äÇR2॰r†¬:mŠ4&›è»ŠñØò’R&I¬î›¡[0>®@$ÕNn÷Ò ¦^ýà­4¿ áu¹Žd(ÈóEÎ׿ù©˜»µæãuÇ96Fœ$÷£×Šàî%®¾]dàD(I¦LÁ)¿™³U‘pàÂ$Í¥±KR=¦¨…•3Ëv&º@Ù¤*Q’ÔÈrbçß#19fò”[öˆ›+õ¥2yO÷»Ý1dk§#F ~yCsÈ¢¸4Câj¤ f`¯n*ð¥¸&‡QSîM«¦rŒ{J×ï=t="ÖéÃö÷Y/ NÇΨþÂr&Z$|Ñú“Jæ—gÛµ*ŒÛ)YeD*ÐGØö»ÇÝ¡^xñËUáÜ·|2SŸ5ÜäE¢4š.»f^Y¯72>§k¡ã¨ ‹#Õ²÷£µÒò/ýØ$†2Ïí€g¨NuÈ‘0*Âm·Vwî߇|ÿeªKAüßåÊÔÞïç%·Ò‘Dï9m`a _l{~(UÿÀ§\BÿÕQAåvL…3T~®ë!JžƒQñFOcþñ^·²Ñ# 賄>@·^˜œvÎ9 >¯b|¼¡uůÑGg«X¥ª%îW°¾.º .ï´e?‰áΕi9=ßô~YÁÕrëÑ·ËXÔ¨lL‚ΡâzÕ¸Õ©œMqæWqÌyÏêÊ}'o1–"‡Ê„O é»!ö¼]&(û¸—ܤ.)O¥ýžÆí£ÃCêfMŸÅiçOÞ¿“ |»NlDÙ·-‡W¥IUápçç¯oœt‡¦}ÃdDyÁ2œa+5c¦£ÓD ÁÉ™ï Ëƒ?–‚û„Ó7SNЧÛ0 q½_ˆ²~ämQNZÇxyŒ€%·ú¢®ÎbŠô¯5e—@”NèëÍ„‚Õyîmô·'¬å™zÉ}¶zòg£íÎ6ûÛŸ~CCQwJjgEBZvPr?ä͹TÍã=Æ'TW9Çú¸éË—*U£ÂpÄs23Rc†€ Ö}†[ÌCÜ¢"edlyA¤°µ éJͳ>¾þ|¢\™eü¯u¼R[à°q%wÐZWŸ_yR¼©†.Ëìí‘G³QÒ°oCdx÷)›ÀNÒQÜ|b;{£}¼¿Ÿ·}YîNÚ^Ðt Ù%:c¯xcª3v”^øwÓ±jÊC_q›€@Î&"Å §b®åÓf¾õ¬Ü‡Á±‹øýìÏ˵MJ•¿n¨ìjh¬qËjð^‘´Vgm¹xm;d« µ«ãT£¢& js®úWñÕ*³lPn4íòÕòÙ& i³"úZª[d’Nu윟Î=ÙE„g½K`Ô°©;ûüdTÇ}Þ8g ¹MךÌ?¢Vü¸¿ 6Á+#àh'¹ÚevIËHÌ[Ѥ0£¥÷w¦¦ 1°ËÓ¸þ L KWäß´]HÞ#Uÿäœ`•«@M‘0ëü‡ç'†§_O J¯÷“CEY—ÃOÇQ€ø•Xçeª7)ôáZâí‚ ñ­–å“EŠ´«ÔLKã¼´åÏË6#•™ÆÔñ$Å1ÅÑr±sàM.9v·†‚$½ñ¾x{__¶t*±ÇÒñùµí³QÄq¼çñŹÓbÎßèy=ÇYê¡~°ÀM\/˼Æa‘}ƒ *dx`êhW™[ÒV /eŽ-ªŽæR?³©>¹¨ÜH-Úm»\Iz• ʵýEUúëF³7ŽV3@´CȾús ¿‰iÛâ©zÜUî'‰’X®©/ƒIiEŠ,j¹º>Çä°íá’¼Hb¥E3‰5NB/m9_qõ'|)Èäén퉄 ÄÃZß´ãè¥Z¡ö&'­šsL‘ `î¤,(ùkL×­î;ð2eÁ$õ(T%–P#ÌUrUo?ÔJÍÞdD•t”T³©r)þ>ü"9MI¦%,ÆÙñ{ŽP†¹» Ö—<^È€SÎb[Yk`Ê*—vÅ:s§áµ‚»,õósvïÜÒá˜=Ì­¥(ÍýÔ¬3¢ô¯‚»æ„UÔjÿÛÓµñ Á^„þsmOÝé¶Ñ97BsC^³KxA<8› ©îDç»`,+MVC4XoÀn·†AÍGwCì19:šƒáO³J´lÀ¡—!QìÒwÕE8™˜…ý»-:Mè>K+ÇÞp%In¡¨åçß1>2ÇÏ/=b»Š 2'ÅŽ,,b#ÔI \]ä3”ÁD-Iló}yÝÎ%v_”^| ]2¸J¥3„êžGêt¿è‚<$¤µNP³a‹ÌosÍ#µ§ƒ^>ofäÙ'‡Xõˆí¡ˆŒ;q`QB8X«È>vžgdyÌ€òª ]l©/pß>zã!¾8}+ñ¼&!mut4ðÛO%”±H¥é-¾åZÙ]¼<·.ÀÏÕá¨.HœíW8Go¦‘~°äˆç·Ãá µÇ#äÇ7¬ÿ Õ’»OEÐ=Îï+wrg;Ý4n˜KnåwϱVTþ‘ݜʂ$¦|9¦Š^’ÝΦS·ÙX—ŽÁPwxˆ@dtôÍûÆ=e숃vop씆MHUFs%/óG7OÁkécãÚàÇt¢âo é^¦©Ù4Df½†#rtæßº(rdß ¹£¶àÞ•p—Ÿý>· ½—›ØÎíÙé‚‹ÿÒcì¡+Ó–ó®‘,V>cLÿ ®Ã¾”q³ËFN !)ÛÑWÖõ+ç‘Ýs-A "Þ×?À÷¶­²µ& <ÀxV0ìËçý±§R^»Qã/KVue/f´lîg½n„X©$áu%±TÛ ˜9bI’á¿!x0;³È7½=?AwžÇÈ›.õ‹ôdUÕx å '¿ßzšTp$zYÍ]µ‘ Çê ºP3Hß^I³ü\ÿ>®«Äí'?ÕÊ9e3ô99Hñ ÕIƒi·@¾ÐŸrÉLLq!}†²žàÚ5¨&CŽ«œÁ{†³óÇ|h€|ò½àNy ƒ/GÀ¡c€(1þx‰÷…@Åjè[e~0§£´ûÏžFß½3Ü&™;ç­ZÞE™[·rA2C‚¡ëË&«T­ÏbŒEsôv꘹CWòÏÛÁF˜Cðz¿¾ €ç¬Ð©Ø€ƒÓ%ŇL-Ued„ºÎÜ ~d.;æY`Vö²ƒgè*ñiýl½^Wà‚k:ëÀìXýù±ç|ü[`ßj½¼Ãa rÇœCßÀì:©Oämˆ§˜û–Äu"wË(û«?dKF\Y§ ?~„07MFk€œE7@ÜŸûl;Þ¤Ùp>Rz†Þº»kh2~M€¥ñ¹ `t“ðƒH¿tâøg‚mY1¥ýáÑàû‰ÖU“jC]­ð¼?1š ù»û<Ábƒ–šGY+&2!ŽÏS¬*[Ä·µŸ „h‹P¥–ز3ßE3`á+^1‡³N»›ôTÉkë?ÃwXQk¤$Nßà 9»¿âÄÇ-ƒÇÀØ0—hÏ–9?³Vf{ŽÜü`^L¹-À€¹³xC£ÁªGúñ#ûív¨ì­’”¥ð™ Ü¢úbqÏÚIÍÄ{`ëêGL'«Ûe1Q¾'M‰¢EäM¬—¢<1ø‡£Ÿ¬|QjoÑðiɺö³Síö"©3ÝÕºàúLJ0ÑL{ân_#Ç«Äíô²Ú±¦·¼L«5°i¤t žÝ˜¿A§"ŠJwkÑ%Ñ£‹3ªj¤G,'Î:F_Ósg3 º:Ÿâ¨é/t,ê¾%ó"¯õÝþÀ©ÆÄ:Ï&°»²gO8Ó˜”…v¿½ÝtEA ©÷À­0âÛÊB íâÙÜ󿦯AvÔ j#Öü¥! «E¡KO/Ý Im¼:}.ZÕøÄ^æ·ü‰£Ä¥Šÿø€TW­µR>H&«°˜ü¨•×'zfvD@`bÅÝ5V‰K•£·)`þ!ˆ^€¢yÝwäÒàè*“bÕ2Á*‚òæÅ¬säú”€tðÚFöi?v¬Â$µog%Æ”Ò='Oa;è”æAìÖZ! s–Õ¬?y+fc:¿fH’ò]®;R@ǼSc왘:ÃMM·™D¢Ÿ=áê”9”5ª¹f9µ~‹¬(ߑႉHXlòÊÃ%yÿê³ìø©Va–Ú牙G)3 T•6»$Û±Ÿ/xGüI€ âµA³?Š<Ìac„d¯îíYŒGæå#×ç`õD•uå‘ÜŸ ÂËp8œlZ%6ÔîåÇK—x՟ͧe‘^¨Á÷X_v6ß í›7‹Ü’À0åtׯû0d-Xøœä­ž’°Èàš'{"ëSĺ ù–æví€GÅ—lÔÊò”}v¥ˆ’…ê³3¯<ô´êðç÷ªÕEo”I\° J×| pì=…Ž;‰{WM+<7?%øRýÚ€¥»uøý nLSë Í;31VÕæ±3\½C“êq¾lw³æ${‚.7è=¦nÚL•¯ëfªr¶èX0‚J1 fùACa*8W€±1ÿ‚ f óTÞá¹tܦAù|e3Y''\×Þ2à04—Û9Ѱ¤äWÈdÎÑ´æ=FÏxNê¤ÛçâÒK9®ƒJxþgTb}rKÏ^b3«Ò´~×ß…lÀ´ŸZÜW©ˆ:|g°nϼª`{8v ½|”R4|&Õ-“÷‰Y7žßæhÞ±N•ƒ„«ò<ãÎL¹·‹&â[(/?nõ&ø½“4v;ðPøËÂ./¦°'z艠„ÃkB?# ŒÆwŎ¤q›Íú¤„Ž&À¶Þ.?÷öÓ¸8qEÍÒl ãuŠnw© j·sþèG<¥ïqà̦vãÚ TøéhòµcUG ‚:w° œÂÁÚÇÂy/ RÝB,\Ó"ØÀVÒ˜9ŽxÀšú:f'ŠÎVæ±¹¢Ã¡Ñ*)‡þ©-ºüH Šîívϗ׉•œ‘¤ˆÙçHä±qw©Îæõ3 Û¹ò1]H帹ñ£/'÷}þWò0 «çV·|%¥hÂ3hšÍëUR}¼a|‡.÷Ÿ²w ²ðQV©Á)"™;7òÐË䄱鷛ÊRÏ÷Ï%ñÐ0Gÿ Ì-œç'Ñ{¤üj$¦lj«Q×d·‚Ͻr€žê°Š—zª¤›0ÕǪ›^CÄ a°i2DfyªŒ;kÀXÿn¡bzŠ™˜1‚óܱ`Û‰Ô+Ýå9þoÑX|Ú¦]b#H¦©ŸËrÆšås¢Çy([^<‰¾HD:AdiD d“À‰róQ쥹Ä=NÌVíÙd³¯ ²-à0;…ÝëÒ~ø Â{p‡ÛR—Á¼Òg¥÷¦œy§@”r̾L6hwæ ‹¥oÈiÏÁiòˆ†r;êàK6Mr%&¯?ÏŒ-­y/\¿ÒÏl}„NfŒGáöÛD)´<ômϱÚÊÆ3‚ú­ÑÒ {‰wÊÓÀZ•pÁ´©ÅÀ`®È@ ùƒ®“Ú®j¬ÿo¡ç޵ ô&:&(÷ùõ:c3Ì×þI sŠÿ¿ËŽMþþ®—Kï¹­yÍäa9ÿAUI—kòÕy¾—š¦nÜ\ïÀ(<¯ÿÍ9ݰÿžá¢âï%£{#ÝšßXÆ^¼ØàÃú}çxÖ|žvîß›ßoD^¸z-7Yiúìçä/š‡„gIzÝb™|7Úg!ó¬–È çV–[Þ¾+Uw¤m×eëS=ç›ö„8Md’W-ã‰â[¹âdüÒÿ,wÛn~ܵOs“j‡èW_s–™ΛZOxúÞdŸ|Ærù¡_ìqoXFÆŠÉW6‹Ü˜x[ŽE)cÿçg8í|¾ÌÙ±gýïO;§I¥vߨQ¿4gÎ’ÈQSW dTž`ý½#ŸEÚÇ3@«ÝrÏÆýLq£ßþV9+¿½Úçƒô²{Mþ¿ï(–ÅU=Úõ̪és$_)[yú‹Š÷jm'+=?óàt/Cê—ÞNŠïSr·XrèÈ‘¯ûíî –î?³M¶¹ø«Û›°P“ Ò®¶ÀƒÓï»òêŠuÐÍÝ—Å~.=œ°ñ6{Üô5®Q†…É9©‰E%ù¹‰EÙ\ˆ‡Šendstream endobj 1548 0 obj << /Type /Font /Subtype /Type1 /Encoding 4796 0 R /FirstChar 11 /LastChar 127 /Widths 4797 0 R /BaseFont /FOYNOZ+CMR10 /FontDescriptor 1546 0 R >> endobj 1546 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /FOYNOZ+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/ffi/dotlessi/acute/quotedblright/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/dieresis) /FontFile 1547 0 R >> endobj 4797 0 obj [583 556 556 833 0 278 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 778 278 389 389 500 778 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 0 778 0 472 0 750 708 722 764 681 653 785 750 361 514 778 625 917 750 778 681 778 736 556 722 750 750 1028 750 750 611 278 500 278 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 500 0 0 0 500 ] endobj 4796 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl/ffi 15/.notdef 16/dotlessi 17/.notdef 19/acute 20/.notdef 34/quotedblright 35/.notdef 38/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal 62/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright 94/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash 124/.notdef 127/dieresis 128/.notdef] >> endobj 1538 0 obj << /Length1 1316 /Length2 7017 /Length3 532 /Length 7826 /Filter /FlateDecode >> stream xÚí”e\\·öi¥C†F‰aèîP¤¤¤sb躻”FºSRiD:¤A¤C„3÷}¿Ï£ïs>¾ï§ó;3_æ¿ÖÚëºöÚ{+£¦6·,a UBÀ‘Ü`°P^M Ìóð²²Ê;C-0\Á ‚EEÁ@YW /,$Æ/"Æ+HÈ ”G8z:Ãll‘@ùG e Î0+ 8PÍi u@÷°²°j#¬`P¤'PÖÞ¨õ×  Ôêì…ð‚Á@Ì ´„ÚÀà„ ¿ =…[#€Âÿ„!®ŽÿJ¹A]Ц€h“€h‹ÜÞZ‚Ôh-(ÚÉÿSÿÙ\ÉÕÞ^ÝÂá¯ö é¿¥-`öžÿ§áà芄:Õ¨3ü?K_@ÿñ¦…À\þ3ûia³’…ÛØC¼ÿ„`.J0(D†´²Z[Ø»@ÿŽCáÿ4žÛß@š:šzzœÿœçß9M ©ãéøï®ÿÍàߌžŽ3ÌhÄËÃË F¢¿ÿúeòZŠp+G_A! …³³…'!úf Iè Âà¨ê6 â#è%@ôL|Ög¿ŽS@²B88Xüþ'"9¢O ù‚¼ ÎˆßQ ‡þ›y ¤ûï¼ ͶÎÐ?*ø€ k„«óï€ äuƒÂGÐÂÿÉ¿"BèÙß$ Éÿ&´'…ß„6¤øoFÛQúMh3Ê¿ ½a•ß„î¢þoA¯ÓüMü@öoB{Ñý7¡¯2è÷ÈÀ¼è…?­ýÿÚûˆîkó¢ Ùþh؈6hÿ¢÷éðÁh]øˆÖEüh]Ç?-äüþu zúÈ?½A×?mÃíDÛpÿ|h]Ï¿ñ¿¿99„‡77¿›}+DED€Â‚¼¾ÿW•«³3Žüû/ý˜þÅÖ0ôÓƒB= V„sÓ+ñà—© ¡%~Š㥸1ålãÔk»>µß šÇ´ûñ™Óãåý«² â-Ü-÷k:—ˆ6Ÿç#JNqiŸo¶ÜÌ·2¼šéô2Ô<7™Îƒ¾‘´6Lì bjL.•$öeÿèÿöZ“CAg‘£ÛÈ­®;3XHX_)Ã^RÃÆÏ¨EšæT&€Zr'MJÀY ò{‰"hâ\8D´¹’_ä%ÞŸ|”1¢Îú,dýóTÃåŽÃ©ø¢uëEJ=j%EìkfqoŽ 6í)9‚yé ïyûR:®q$YVeV:UDïªæÈ5—õ~·ºá;Kñ£V-•_ó~â›/ÑœÄN.Qå¿uÞ- 5 wƒ[™)övÙVøí؈ÆbTù4«=º½ãkp›n1‘\òd}ÖHH~ãÀˆ2’M‹õ¢~­ï¨Ù3@§.¯Û*|¤;]#<šr¤csNò:‡$ÄÃì$Î6)kØóè¢òÅçóÌæ¾1Ó}“´Í)¾™)#c.Ÿ§ÍÎ ¯Z­]d´¬A œƒ¹.žln*‰Xãu߈ÝBÅN“âÏ_ª¦© ëó;xæ´AI(L¿(h[¬úÙ©(‹–TŒVÀQó×Û½ó8i›I ú{>Ê*qÚ¡ð¬°-S_ ªH(t· 31üB*íNoÀ‹w?‰§†¬Š¨ó´mx²æÖß nØm­ò'~y§UØ—×"ÿ. •Òdî·×KRÜ-¶î‰ÁZ18ÝÿäÁ+†ÏßLì!ØUzÌ™§Ae=K (ΚšP[H–ŽŒ¿{ñ [xjzqÍ&SQñZïl,–§Á‚Äo¥Â6´=B¥k>Ùw ³“nð¼]®Ïlè3<'ð.ŒtýªEVgËѦHQÝàî•^~9©qÒ$-’ò ¢>È]‘i³9 ñPb< íæž“êÿúõ©Çç€JÊê[¥Wp¡¸èÞñŽUëDºüǘaÓ“Bk-ó¢÷ÀÑ3;Q€ögv¹Wf7J—ðÁlBÖ‚¶gI¬SeÔAw¯¶B¯¿ÇûöËk¯  >«ÇÕà/¨˜œ·VÑÕ(¶ßJéç‡Ûß¡þ&/6 M óÏJ&);dM_ꋇF†©:DÙ¢ïhqaEiân&CŽw9öe`·~¡9+cP—Ê%ùvê/’jf}^f8fG>'µ×nöZ_òÛÔ ^\ü¼¡{zÄÑ!åÔ¢$[9<¡6‹g¬Y7gúéç’½N[€3Y M‚^RmO¹ÿÌó¯û…-lH*X×R§JßiÚŒnk¾u¯¨Ò+Áÿ!ú†¨) ÁÍ{A³Ò‡–ìbÞ`oE ÿ¡ÜöÁd_pjSé!4·[æ‚~€orL1„êÒШãÍŽ­À©ï7‘qñ# ák-¹Ëe®š¼SAæ–!½—[@& ”1›¸~< B·fl…w¬-ÅùŠæb~Bļà‡Û|›n‰ÎbRš•¡Íe‘ßHÞ©`B´}ZV£e­„hM¨&Ýzß®áWs x¤T®+Ymq¥û¦´®}ˆ\ Œú‹)µCl[lIüJ6-éyÖÄ˵¶þ xØü’ÏÌ >v–¾¤˜ð5-‘›îž‰ ¹ ñ“r‡ÏU?ÖEœ‡Jüäaø{À«6ªc€ò]%ù„Ò—+/ ®LÒ¼‡è¡’¬7A[|RE;о1†½ – 7å. @Š©áGÏ uVBîö} &Y6?¦|ë[¨WH<š,¼Ï½œ‹Œôõ¢9|2VúµñA”* [,’µ…(¨š :¸#,f=Tú"œ²;5ý€Œ: £¾¼ñÉ÷rOK_Z€C»IÉôÔúÌGl#<7w’ùJ…æH€ÉB’SBÛŒíÀ„Ì(žAW½Þ‰µgS(;¡¸"®4E3kQ—ÿô÷<­}R3üpP ÖÓ:¦XãŽ>WŽrÛiíõæd,r/óâ}ÓÀPÍS*¶ÑCbRQXÕyvPùŽÛý–ëŠw#E+É 81$ýÔ¢ešŸpÇb5Ÿ|Vi#4áŒO‘vÂSŸê˜òV^…ìë8B²¼RÒ„T¤Ðþ4U˜'©‚­zFïº{úqR´½ç XiwÆ=gõlðÓ= +™ô‹}Þ°^Öwâ¹ZA"¶ècšX’;¾Š”þdöbêýT¾'·jÆxò¯Rÿ_›8RyyDI{ <*V`ãŠQKý£Ñ-µñë#ۃꯢꡳ—ýØJJ´[Qûŵå“&ˆ£Z7Ã;nïºh˜Ô[€¾p¥Q:ËTΫº¼³s¡àt1^¿÷B›š«Ó®ý™ ^…bÃ#C)ÝÙôaÃI"ØW$S/r¥OAf0YôöKìÞ§€ï‘büúsDKFØ—h»°Øù¾òÁ†‡*™Ä h¾ò¦./ {l 2Ó°‹Wãn½ªr8’úu¸æmRV@Éàý"~(¢ê‹_&]‚KjþQÓCØ0ÙÅl®¼ãñ:L^~º«[´ï\ëÑQ\J7"¼¾iZ¯›þ ÎëÞhÂÝ+Ä(\Y¶|w®¡]u‚u•šYÚ¹Y¾’ˆù(XÙ?ùjcÈÜP$Ñ}Ó!>¿“c6¥>ud¶ñ0ÐA³uqU½›0jå_L²N©¨x?Ú¬‰j€/ÆâìÏ |N’ˆ;£‡‡¯ñ‰Þ$¹UùëXË0£s8MmŸˆÖÖ]Ô HµÃ7¥ä^Žü\Q”ZlÒû¤’¶1M©L™ÀÂÐ-±áÌ»zvyI3zŽƒ3}³¶XÞœ)T”Ù3ô9>ç{ÁX£{oÍ/ÝÌæ¬ô˜¥P®òåññqÖx¼SHï»e™}õ'D?]µ¥Aú¨À¶, \²È)|è˜Rvê8õ³ 2q#‰³`IêWß¼Kl›u’'°¼LbKŠ}ÀÆ7ƒEmvgÉcú€˜ ³?çøçÀDŠŠ”:â€ó‘œž®äƒ°ìöèÐð ¨qk«rçsÈ–<¶“Ó½¨VÛâ,_èÓKÿÛ^𣇧™ÙÍFOƒ^×z2 ]‹ÅïXÌçç»/çx›·ˆ¸.ŸM[JDË?ùÔØÖsÂãæ´¤«†{È¿Õrfp‘\éq|ÅÑ̓3.k™wÉS¿—*v$q™Ø{ÓBœxÛÙû¸•b7ö5þ™7ýfLIYÔ¼< ú¡µ)W{7'$æÙMÖ¶zŒ¬œi·Ñ©tZ–6MQ֒Ê/·køÒ5!O Ä 3œ6g =m´Ä§c·ÎeULlp9v2ÁXÙmºuð$ŸK ÃFpÙÝßgº0Œ÷žtà—`¹ÎOŠ­«r¬Å8г\‹ðõ¼ˆÏßË$lmù9Þ„uøŠÖ*W¯ìÆ«h6$»äF¯7…>÷0 Y³¾(Ña{êg!1.ÇZRŸŸé?*ü™°Ï™^P¹0¯þÉ%¹¨£fx£’•jê!’˜xhùN îò5{üýÐt•óµá:ðÒ$NÌЗQöûúG#-å.… o™ZWd^ôeÊ>AÀº„®6Ž“îØ´×êx w‡Ãs z* ˜û˜ž7ãù ßöð·)KÛû—¥ÈÚÓñ\y4àŽýŠ=}C/®åáVÃeù —I6:"î”Ú4‡–ßçÅd'öý•¢Á¶ù1sV½ÚMËzž¼• Uq”tàR1×c×Ò­~p³¸0×) ¡™y“d7¤g(Ô2tÇ ³B:ÙM¤’Ù΄g·<±vYo±É—‚i^z[ýÈ—¯Þ)yÛ€³Uá5úЋjý"PgØìâdµ¢­J³¹ª©O€ØEªú00|: (31f}»y¹Hng"·¡g£fävEZ匈§DvLî¡ZKªY^Û÷ùμ®ÆÚBUgº“ä çA/V_«‘Ey¥Éf¾ÅËæðEv{8&”OHãÿZÆ'£}˜~‡j©v”MφÑôCä^F’_ÏË­1‡óÀŠÑ>Ž"uë§4÷v+âPã>©‹|ûÜ—c”L‹¿¼·Óû‘ñƒ³ƒ„R)ºöÀ0ÒgÆ~ÒmŽk*\C<ú˜Ëi¬=J§ Ÿ6Ë\Úñ´¼\•x«CËÉ"Í&ÚtáØ!Þ“gŽÍrì¾æÓÇ)‰ª‰B’ÌX«k†æª¾SHzËOšÇ¡Èoí%®ÜÜÀbñ”e3º²¤èÙ’Çhã÷*žGó²>œdó™ÍJܤ¬Ôf Ꞔ(‹pêþ°·¹™’¦Ë)Ç´£ûm£ä–‘RMÏùñ4½}•\ö2Ëí¡eâ×K°s¬Æªâ™ÙŽ£Ë®yµÍL–í‹m€lÌv» ÞePföÌ—{Ä5„?Ù¼£L;â™üõÉÝ7I›KYí•Óý¦ô4¤§8Å.¨&¾:}¯$ÔÝz±ÖÂM*›ÛŒÍÑ1V´“5þ °¹63»¸e<ÖyñúP3ˆ¾›:–“J–„µ¢å›­îcT`g†2õHåÕ w<‰\åV›;õûÍÍ€Ìs·¬¡Ÿlïã͵E{¸iç‚ÍLè¹q fFaJËõ6÷Ĭ=økî-z.¿%ÒCœvlÀŒ¯ØªÏ£>:›O„2„~̼8é×@‰n|™[—;w¨Gp¼M€Ó剸í/Õ’3Š-ÒÒô|ƒZÈ)‚‹è¾ÒF Å M_/kÊKÚYF.I°&˜!„r£úþdÚí˜aÇhVή®YøŽà«D=™½^«tBž´¸R¹Ê)šøn’J’ñaHµV«ÍÅÒˆ‘=óÞ¤ñÀ´™oûøpáq€aÔ¬}16Ó ×¶]„çŸÜɧˆ·ñákx¨÷k1?F³ŠRBq#ê×´ë¼=q4ðYÞ­?_ýüÚóü#ƒUÛ1Ó §Á÷Ý U'"Á™*Õ‡%¸r‰g^QYC”OŸÛèî4öq¹ J“.]˜u´yœ`X¨âpZY†å^=´ÜŒë—ššÉ 0ÚÊ*Òtp^@KÙjsžV©¯9šÈ¾·6x%Ð¥ÞÊSÉñb×çÜú ?+g6—j9šà@§YÅ?[º.P–ÐrL6Ùáš8‚¦îLÓ€+7ZØ…%ò§Ób×Û§ç­Éïwúw â·y)o¶LÂ(çžzX†0…Yæt‘Y–ºZ$߽ϔJ°éôîê1UBïªæF\"çA%Hʾå i#¿ïkb¤jñŽó­“Yœ²ª{Áj¼N´À;š×MÚãVDa¼±ÁµÖ#ůš ^ñ³Ëà‹ßߦ>¦¯ áÅ £|ÝAÃÀ 4‡òi»rWá®>Îé“i½Ž rÜñÌ­KÚ.Š~¦â§2o£ÇÈÝä¶´`gÕy²Êá«töo»øPÃÏÃ]ßÞ’Qæþ©Ã60þÓ¬iÅTý¸A°15¬(Éôפâ”VçÜ…–FHÃcºø±þi)Æ-îã§qÂaOJß‹­—Fšå n]k±˜âßzŒ¥N¿í![ްázÁÓ€-ë-Y“•VÌõ¯ æßláºÏþRãÄ»ƒàG6ÓÍšÔµ=ÓE9»ú’ÎWDÑÂ@¼5Êþå¡‚ÄþW½Þ»ÒºB+xÿ[’“¡ìÑXÔûpF á¹°ÏZ×vñ« !0!„”._3ßyyìbdåWíY­N)›ÒXýåYe+ëSV¯•Wh_(‹`Z§¼’n¡=xFBVºáà7´”Y]Ä ð YLo²ÓÕ>ˆ ¨ùøcw3ƒe|ŸÕû¢ÆYGB¿I6E`:®Z[ä$§|‹Ô¯Û^…ž‘å l#c¸<Ôx¿m1p/(ìÀ?=9õ´c(íK~`àºã'¶¸ž³ dؽõ>9RBOïH.œÈ»+[Ù¬—Gºæ:Ý€l’Ì¡}Ï[—WŸ¬ÊV³s˜ôð5u1  æp÷k<;×£­wYÔm+f­ø>ɪ?ÎÆó¨ïžÜ¨vàEÁ‚8W £öw¨YA–ÎØxt%l”“!kÜﮓ¯Û¶qâ¢á€¥«žÝǵ›HYÕ‰Œ½ØØ­ÈÅ7>Ǧh?'5îÔ¨ÿ’s¼Þ_12ŽçNc©0hoWöð™ßÓZww=T¡¼âô]Ù"òöw~zdwMDp®Ï«³_Í´Äܺ7?mÒ®¿ðW®6õ]ÊÛ¤ ›v¨EÔÛ^œ«“c.•𬳶³cGùfo"÷KGµ¾Éån|ìvõª<¹îÁÉ‘?§˜é<åZ?Uú=q_³tÆÏ^ª*¹9¬ç“¶Óm¬\¯~0GWñøÚÜIéé˜=Ê÷ö2"»ÅñBÎÊ­~‹ùPOZ—nD<–eM¾¼?‘Ëzða«Âäö#Ô‡&\òÃóÁ·®£ö÷É,‚ÜÂÁ@ŒâHðÏ+ßD YÓGö„EŒä\¶T¾ü˜9 kd.o=½¼ØmðئqƒnÒ²žÐ³5=0jVÄÞ w.|di]ÙTÂ^÷]â«©ƒp ì4ªŒŠ~ù ¦X5«‚_–tޤø˜àÙP«®dW%$õ†Ý€ÔëÛaæc¥)µ £›tðªù†¤ UÇKù©·M•µþˬ.#Íg¢²]q¬ŒæM2NÖ°oi‹S£~íIµîKsÅ<šÛôâ8ÅØcÇåÃ7‘/ÔÛ¢±ØØˆÖaâûµß4°UýíV#8 nS)Á^ðŒ9šÙ‹‘AÞ›SW~³bß•#Gý°Ü…d5:w5›ÈO´™Ä.[nå—JžÍÈ pc=_${µÿf+ª×¿Qs*2¨P5—oŒ»V ûHÌ%yçÊÀƒm'îÞ0"ÛéäM ¿‰>ý2eRF" "áŒçlpn!zDN©ŠsoWrúHØ”?uŸ\Ò3–ãÜ5v? nzóÝÅ‹´A($`k2\¨ÞUu08"po º ~‚"þE%ÃàC#Ù”%µsQ›™K¤!»}š’Ïú}“ægö3jÐß%TüXSœ}ÎYïš)‚»¾ ÞNþ¸Ä‘È k(ÙbÙý¬(öœ:r´"¨ª}V©Æ‡e”B„å&ÆM¬÷q”Èr_÷ñU)‹…çdèb©Cgý‚+Ô½r¡•+„Ø•°ŽVRd¯QÍ^e`^eEîk¬ô¤ËÏzçs ¯~5n´ˆx¶½Ï ÀOѱ¶¢ÒvÖb0ž0ŸÎ†žöòZ†ë)õJ{äæì™2j˜?(¨7ÎÅ E½/Y¬z4b¬yoJ3%€›¿Y©tV¬º×;Èeí1ý—0\&šs¯/‚,¼ÔáË•aˆòh†š)Ž-¼‰ó¢2äBrR”ºœ)]‰6b}ôrÍÚø¥²uåk,î½}µÚÏ/$XÃ\ íã~(l9L'ë)j>“æÍkd´¶`02Šß’t ßln+¹Œ3Yð•v¼vªÉ§RZ§qÀ04wŸ*²(7]Ý#ª ”XüÓ*5 L›918ôŽÅfމ×@L•ÄÑQƒ'–+=Tkáýüþoƒÿ ¬ì¡ÎH„ƒ…³áBý Íendstream endobj 1539 0 obj << /Type /Font /Subtype /Type1 /Encoding 4798 0 R /FirstChar 44 /LastChar 121 /Widths 4799 0 R /BaseFont /OPTPVV+CMR12 /FontDescriptor 1537 0 R >> endobj 1537 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /OPTPVV+CMR12 /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [-34 -251 988 750] /Flags 4 /CharSet (/comma/period/zero/one/two/three/four/seven/eight/A/C/D/E/F/G/J/N/P/S/U/a/d/e/f/g/h/i/l/m/n/o/p/r/s/t/u/v/w/y) /FontFile 1538 0 R >> endobj 4799 0 obj [272 0 272 0 490 490 490 490 490 0 0 490 490 0 0 0 0 0 0 0 0 734 0 707 748 666 639 768 0 0 503 0 0 0 734 0 666 0 0 544 0 734 0 0 0 0 0 0 0 0 0 0 0 490 0 0 544 435 299 490 544 272 0 0 272 816 544 490 544 0 381 386 381 544 517 707 0 517 ] endobj 4798 0 obj << /Type /Encoding /Differences [ 0 /.notdef 44/comma 45/.notdef 46/period 47/.notdef 48/zero/one/two/three/four 53/.notdef 55/seven/eight 57/.notdef 65/A 66/.notdef 67/C/D/E/F/G 72/.notdef 74/J 75/.notdef 78/N 79/.notdef 80/P 81/.notdef 83/S 84/.notdef 85/U 86/.notdef 97/a 98/.notdef 100/d/e/f/g/h/i 106/.notdef 108/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w 120/.notdef 121/y 122/.notdef] >> endobj 1535 0 obj << /Length1 1620 /Length2 9681 /Length3 532 /Length 10609 /Filter /FlateDecode >> stream xÚí–UXœËÖ qw‚[ãî®ÁÝ‚kÐÆi q'¸ îî` î‚»» Lï}þ³“9çræjžé¾éwÕªZo­úººi)Õ5Y%,̲N 7VN6N!€”Ф'€“…–V 4s³uI›¹…œ‚‚œ wk€“Oˆ›Gˆ—… åäì ¶µ¶q0H1þ•Äp‚m-Ì@37 #d 3€¦“…-ÐÍ› áàÐøk†+@è {-ÙP89–¶ns µ-…ý/#•€ÿ_aKwçyÁ®)D’Q´t9x,V(ìªNZ@ˆÉÿ ©ÿ\\ÖÝÁAÕÌñ¯åÿîÒ›9Ú:xÿO†“£³» Pq²‚Aÿ™ª ü—œ¤“ÕQp3s°µY;ÿ ÙºÊÚz-ÕmÝ,lVf®À¿ã@å*@Úö·»†º„¢¬óÿœç߃êf¶ 7-oç–ý+ûoæüÍî€m½†lœDÈûߟŒÿ£˜ ÈÂÉÒy xùf`°™7 äÉ€/À—` ²z€^cv6“d Ò€•å¯ã„h±[ÙþûyxìNŽŽf¿#¼vog èwˆÀî 9G'Ëß!~»«ƒ™«ÍÝvú°;€ÿ0/€ÝÍó÷8/'„mÀÀ?2þrsrÿpÿ%ëñGD×Ò¨"ë ôøÃÒöó?ˆ*Èö>È$‰ß™ ù› ÉR¿ ²'éßÙÌ?ÄÙŽìo‚lFî7A¼~¤‚òo‚TPùM ª¿ RAí€TPÿMæhü&HÍßi‹Öo‚ìOû7Aªëü&HuÝòeÿ}ò‚óßq±ø‡89 2– d¿À?ð¯“û!vÖ DÏæ„øÙþA»?âdÿB¤þ@ˆ•ãoä„Xþ@ˆ•Ó±rþ!à?ð¯gç„h¸ý ÷?¢áñB4<#änf÷ú!Þ DÃçoüïkCRÒÉË—òœ³rA¾œœÜ‚~^ÿÿ-Ñ ‚Üþ¾‘!—Ï¿ÙÊrU^@ ”Åy' áP»´æðŠ™¢ÉJx&hIë–ÕÆž™.Ôï‰Ð¥ÃJ.L« zU™¸»ð»žO$®Ñ~oÆdÏÞ¹$¤Ï=ïz˜îfú´‘è]fªxï8Sý 9Âìhž½>æ…V›^©HÑ/È9<*PgÖÚC\¦„úbèñéKV(¿žl¦ƒvDX7¥VºKE$OÄŠ'VJÜÊDH€]R+óÒ…S§;ÎCR~ò³ ¬å˜ŽéO¥ÓToô-ƒ‡„ÑŸ8õAÆåÑ[îù*úñ5Oæ†ËÙœ†—±Y³ôW,nFµŸÔÎæÜ«!ñTÊE)ò£ÛF·wSjCÕ'ÔÑN´¬vÚ˜¨Þ’Í“Ú(ɽ4EúŸ¬šÁˆo藍QsÒaÔ1d1Ò¼(r+…-¾Ÿ“ùUó)0ƒÜ5¡cßN¶¤.Òª‹Jfn'œUaµéûñȇEÉ>Q›âi¬s‘-SdìhûžÆJ™d,UÈå;«(w‡¼ |éË÷î¶ùªZ!^†ä~¢N›þfkÔ#ÔZIŒŽÑI –‹ÄHÛ˜FO7:j•Óªh`A¼±ªž~BÓñ^7B4_ù|‰¶Œ×­x•MÕX5U Ak"‡˜dIŒÎóKЇjÞ@Øuî’Ô3 fÞÚ"TœújÖBa98£“3×jáI›Î‚TAVò·Ôâm—<Ôg=«óùoÞÓÌ´ žÑÎÊñ[d}«ÇŠ{gtY]óà k±Ïfl-rÝòÞ$8/°®J÷ÜWÌ_Õo c¦åƒwàU\ùâ<Ï«_å[˹r¹b§™ØùZCH&ÅÄSÙ|ëúñœi€À²öÄܸö kfª; © §=Û«¸ÍWf>z¬ÜbÙ.ŒŽÍ½àwcçQlàf\Þ°@rjn?÷=Fgòä¹Ï=h˪ÀÜÇÈ÷;ÃÎ"É¡x鮡¯ÍrÖ ¾É 9’0ï¼b=* k{_0úÖrº¦íÝ®£Khè›B™•ÛJá`ÚƒêxYŽ/\óÞÇôÕ5aƒ‚ª¥?±¨›MO#Ec¬møŽŠ·™Ë¯€RB ˜d}çûÑt¹$ã¶ 9á˜Y»e¡¶·Wô£˜²ú®®ƒ\#ŒP4×SÝõÔñ.­ªv% òÊç+Ñ# Ÿß*àSJpè±tÒRžPg*Ð{cJPî|¾Åàön¶1ÑzOhxph<ôö;ÌàÒ>ú…1ÌÐ&ò•ÛÎÄÎ~¿!á×ÝAYË€—Aµ7²&Ub $n6RÕÒ|NÕ×û\Åݪ"4yøvqK ™?KX"Ã5µ]eÂÇ ™ËÂaÅÒå7á·“‹ÏÇúˆG:ŠÀþŒ®[Ê}Æïx2M^.úêô4F®kµò&  ÍqÓ¼nÊa ë gˆÞ 6ˆííĦNó¤·ú]jâ_ûÕ¶!ÆÅÌ[ým ÔPÀO+fÓJiþ9ëWIWKz„» šjàëúrÃok’S;Xý«åØË[á°š9ì7¤ÔI˜‚;3°º)Óòµsò:a:2+Øs¹Þ¶ü*•Y§iÍMMŽŒ²Ä"{ýª‘Zzœa/•6;TúPNFÿ™Ìï‹?–Ür&Ì%Þì&ÛÏîB÷ÂG(7øËml‹‚رcÌWt&úŒ~kg ­\K˜éc\X¬ÎêÁ·ÖÇ%¹Y&÷n9¤Æ*´Þ®Çú@™ÓkÞB/®Ì4lLßt™¸ÆçÔr³ý)“œýð¡OÞ¼©eî¿ I³ÙbƒÚÏóŸbwi=rœ Í`,óóÎk¥¥#“:³÷1b?β9|Xî$ÁÚ½? ¾†“pi‘¾nn+^ž6\³n¶š¢/ì½ÌZÝ*²Õ¢HŸV w‡ÛŽ óî§-`ÔîpØ¿$ºÐBIÖ}Šß;÷h vz¤Dd‘Šž®¶xÏ(˜Ɖ–úº|!ÿ@ UÑ1¥rÅÅü•xæÛ¯"#º{4múäÏ€àtüøE¦%äCØë~à˜QYDäÄžAxž4±4Òð£ˆN⫘0†¢ÈÎæ‰®èž7Mɯ7æB,>‹>ýá<$ï,ƒÜ¯ ¸—š]kv¼Kz¨¤9XÙ[£³F²Á+uŸÓÕÉß\”üåî~±¯â\¾H¡"©«8s?‡oéÏd_fNŒÂ—†6œ"¤TÈ:+@rDJÚAŽ —É¥_>8ð]óµŽMlAÂÝOgþGžÒ3þúã§´!~P0kbE2æÄ=Éó¤;-ï:Ù¡˜XcÃçòF³'`ÖËâ¬;FÐX]ˆ9(½`Ï+؃Œ¯I=h•8ó-ó“\wÍõBF,VÄf:VÄ'Òå;'ÒšõKŽ2 ’N‰¤VMó>­âN……`NíQÝö—ð<¸Ôµ`])ݨŽcÛç¡ õ0ÈR}–á„ÚžÄ,òzy½7Ž&?ØuBiH“[·,·_LёƲòwU…óU‘Íf©€U5{u]P—îðA¿ø?Ò3EÖüJÊj«é 4õé²ñŸà¯4ãvvåT.S,ˆþéäö,s@Ö»œ,„o9 êGè•ç¿&|HÝB=<ÕœLÚi·*d[bŽéyøZxhÑžÜàÍ+/Û½y­¤˜Úž»hFÏ\àzö‡ØŠ–áăÅi[âÁz´i¡@&(Æ®t·Õd;QèÔ7l§òt&•0œ<ÎFvìÅLÓî“GNƒLRíI²ö‡øFažÕ ñP*£o£ ÊîÇŒSË2QøÝaŠ[Ã9ÕQMzÖQkpçš%ÄÍ "Då峑…¡_•ž"19­—I¢[¸^³T%n—þÞü.úŸ¥ñã­âWS °Lÿ{ ͇ï2‹O¨œÂDÓµ‚­yx è’ˆdÑ ÜÍ3'Ï('ø‰Cî+ëÃ*¬è#GòÈS^Q»ØæÝT~ã-M-þ>tk¯m;öf"r“V@ùÙNqe~%ÎôÊå¨uçÅËSÊ5øàze~¯–¨fÝnK:.Zk“Ç8¼cð€r²ÜÍ¿!ã:O…–|î¸\‡˜%QæúB[NPKA÷…5ÂÉ’­=Cú­ñWj˜O¯;w½°¨~¢=Â*+¥—3œ† ¡¿cC_Ý&ꀮ~ˆ­ ›^ƒ¢6üÑïsƒ·–!¶-AËj6”ÿd¼ ÒKÒŒÕ^ûávAòõK=Ùŧ«o´=[^ røÂ\¸¯è|‹OºGézñ0¬¨€¿y€ib>çýLe ¯[–Ç“Q‰žu¬»bö2LžðåsÄÈ!1=Ýb†Ú%¡/eAIcg)eXè;;÷H#bP|æ$P—Sc¦g»oÚé‹„¼ž89œ÷ò ؽm¾Èß^þ\ÊïàÌÙËÿj?¤ÃÀ#*•âÕ/ö\ÿ¾L]9 ²*º²áWài° ýY”FŽÌ¨MÌÚŸKÍÄ)‘w›ÿ®õ­Ÿ5·ÝÖBlªÐÑ7ÛZ™^r Ûð㵃žš¬² í!iâ ÏÃfK P(«ÏF¹YFEÛÖûÕ˜‚²A7cí¯c¥ûÎl&Þ$ÂöYÙër蜑HÕàÔ ø6‡ ™G4|kßœGš5^?]ÛÓfbŽ ÎÖh1ïŠð8ßNÁþÀ/•. pH2—bØ *Ä"™Þ. Œ )&gÑi°å‹SÌ…q×£Pôîðt/'«šª àÝ—ÐM ·jævèÁ™AïKÔE¯‹c¹«8t¿0ž´¤2z·ŽixãÀOãÉH×÷.ì\¸0µ¦QNKX£M”,[áy¤Ï¢@š¹Ï⨬ìèl"o²Eʱ„ìðãòK-S,óE‡w[HÞ'kU±zôûNËïA"þVߣÈ^ O ±®‚˜É˜àÒDy^L§°KÆñh¨$/±ò[k õd¹ý¿Â,©7ÖúòÛT˜Ô}çHæšýË)²½°/N*UK#ºYÏr±·OeÃ;Ϫxù诟Ø= Ú Sýnߎ¡ VZm‹ÕÓ݈MßË¿j3÷e¹X⊠›ÉÌHc`4Qõݓٮå*»&¸rÚOĬܸ&´S<&º+ŸùÄPÎ$¾N‡Ý‘ ‚ߩ߭ú|.ä®ôXŠ¹Ù¾“좧‹¾¶Mšt¹ƒåç5g›á¦í,GW¬&ÍõT«ÒR ‘ÑûhÒùøÔÖWW–+ÐÈ·~%ýR;ûУ$¡çu»P5kæO" ®êkìž‚=9”ÑX\’„ʹïÇObƒI•¼.YY«4I7ëä:I‚Öäå¸~>ý9׊´T¨t {âH–ŽÞn~Œí§Oƒe*ªÂrQ‚>ïÞ\©5Ý”V…¥;1 ÜîªýuEä3i÷¯ŽÏwåÄŸˆà¿¾ç¡:.²OЃ˶-Øœ …(oÊÈ-¼Ô޶‡xõü¸KÜ»ï«/LsÂhv!8¦{9JîߥJ¼ŽR{E„_Qï<žœv]¤ñ`9kgv—^Ëæº•ÆZ ²¤›ˆŸMóú1¡€f­s”«_]ãÌ]dd¸ÅK¦m ‰KKc´ÿ°ÅxQÁ»]„—¿Ñ«eM™Zø¤6}´D¯3®4°º¡BÄ­Ýð'ë[ÛÕ¦Ï{ Šï—º{ñê÷eÙÆ–Å‚ú]î§Dº·Ýùb5»¼ˆ]¨À(”‹áVç`µAý¸_úxzú6ê9©Ey'~¡{£ýdD}. DšÓèÌ|Á‹½±IH„ÄÐæ ]K’¥$èJ!=KìêfK~|°ônEîrâ€D’àøëÕŒº}E†aèót宨û¶o¼Ý­ I¸`”…¼}N>©¼ÌŒOh7ÕÆáî×;5}DÿÂÑ~ô²GhD&F÷U4<µ·Z°½¦Ï'–„UöVþ äŠÙÙÈÃ2æ“aØÜ?Ú<ê‘òK}ùUp(äVžèìSp…‰›ùCNç}á52Ö*qêU úä€ù”ó=*\]6ŽÃ#e·¸æµÝ Ôü=—' )móø1ÒKiÀ‡Û~oè¶!¸Å©>+d÷g¹_)Ï‘ò1B·c2I—QLu°gO?‚t®Üo7hPµ[B'\¦~Ú-ŠQ‡^Ëc¯ƒÓH~Õ4¢­ðukô@•:íïºäÝ2Š=¸á D¤ß*¼àZ\ ¤s¼¾šW"Ýîþ؃¢¿ZMl©1—`ë¦*j0¡œAÈ“JåqÒŒ—A”ØÖÜiÎaX[‰>9T!9’À(<Ý@ý%upŒ/“ïéëÇq4Eœäé•‹FÕØRØœý²xrÀ¸Ì1Ñ[З¹o?ÇTk.Âf"ºgLeŠèc4®ˆä2:wç¨  /ÈÒ’q5—£©˜²ø0¾r»à Dg~ÑzBå‚ÄÿŽ|)$¹j1µÄÝÒÛÎÞøš-æiŽr(1\çÉ1ˆGò˦dë·#†bÝú%p±ô@Ò”ÌÆ]Лˆ´ñüÁ¡ç%äoÕÅ}F@“W¨qé`Äã­-±útþ)eU,6B7¼âíh8¾ƒÛ\äí°µÁIa‹iv“~t†©í˜¹~q¾·c1 ÔõÇìb Þ‘¸4o3~3Ñ•°¢Tõ oû@š&™Åó Üć%øUxT<#ê=©šI½A1‰Ú¸Fõ¢1EŽC3~'ŽÅ$ðÂOFv瀠`À·ÌÛÁ\–wa 0Õÿ9vœËÖÁý[ã”O®q¾{-JVµ!1Ž“°_2®”éÕVv˜µ`gt÷A¥}LF \°y› òÒô¤ºÊ€-:~ß ·oíx´‘%¤såª~Œ×ú5Fá¯é Â&ÖÓŠ(‹+Ò2Ô-ß?L<¶ñü€ÚÛ9Õ™Ì!J)j ·{Û™PŠk€WjEw%qhü0×4ám)ŒèÛsõ‘6;ä¥ÿð5ª&Ì4PåzyLÇhHÕĵw,Ó·º[Å8¢DR&»ž¶A©ãc£Ã)‚k wxMž³Å×ÅÞåøN`#.…M‘+»¹ˆx™ÞMMñè¦;J_Ì:èlRÑ>ÜÏ[»¬“@›þk+âÞF¡ÈÚà¬ï4ÿ;ÔJ€Ðúe€Ó<@ôñ\À„‘ùÇ®2©c’¹€Ëx„uT4¿¢>W*í} õGÏÍkj+ ÆÑ$}s+Û"•"‘#ućR¤’KXîU;ãÓ~t¬<­hlÉ`˜Ð/÷1ËËÖÆÌ± ~ fô¦4{?ßXbð5\ ìG:Djì7¡ ÂzÊw¯)»Þüê:sÝÇk…Ýäëñ H+.A ±¹oê´(\T:)dùnøã4ñøa{!ÿƒ:zùpµ¯Û³¸Æ¡n^³”A#éo][0)cÅ30#uÃïobÓJ¥u•ÜEÕVu¼^OH¹µ) 8N» ÏÿåŒ?eèö…qGD«Ò©H¡1×YþbÙ,dö&_}íðz¡#)" ÁÄ2¢8©°˜x¾ Sžv¢$ÃU(Á&6–qÛðy_*“ÆF°"ŽU5ö•!#ߨ±…S1Æþͯ§ô~è˜ež+Œ|-žÞ»)ÈÏR‰69u£EY1ܵ¤£2«ñsõÃ:¿X·ØGX|žqN‘Œ›$³4nTú°æ£NmذÏSâXþŸÓ³7uh |§¾qq‘ÄÎ’ÒœTÐ ¦KÑ\o®maŸh„÷{¾qÉÄéþVf|ùõ=‡óôó*Ô)l¤ý™ŒËø³²$šÒâVï7Ê®r¸x¤u_«»VÑ2•ßëÌê‡q(ßµož-ͧÁ]ͳ Ví¨ X%Ç‘àw]ý¡ˆ¢ ¯Zl´XM'†壂GøI<†P’^¤×†‰Nó˜;€æ9^Î,x!² «÷% g§`­Ä1Vg˜æañô— SõꟗP^ëwÂ÷òß1uÆú¯æÅ_¹G¿çÆ~'ØÕ’UdqpsDy¯X’çx=13¡-²JŒ P§?öˆ‡µµÅõÙ¶Þ{#[‡Þq—3‡ÿÒ…Úó®u=ý´Ž#mñýÖªhd!Ù/Gã{w…NÚ#ŽX§•7ƒã´ËÒ•ux süqö_uÂn­•”NÛx¼º`i&¢­§rüIÌTa^±È1%R3ï½ÿó è–P™+Þ*T„e‘Ù¿E¯E0¥Æ¢‘øê&°ôƒ>ÝÍ–ˆüF+šoéÙôÖÈ{©°ê¾<Ðe~`÷Ôà8º£Ùeö$ÙŸb«Ø@F²1±«´Ô*¯IÊ õœº‹i•ø&²VCìï]‡Û¶E%›Ø¹yÀ‚;§Buõf9 :"‚ï)rþm|M›7VP ‡æ~Ÿiþ’†¹°¸.G©¾Íkr‡°´2VÇé*ù-· Pú¡U´{Cµ!;j09· ¿§î·Þ,⃆Q¦Ì~AÆ{f7Îwd¦ .îl]uL¶ˆgý—qZJêÝ'.pù¶Þ²‘s5¤(U¥;•¤ÖctGË–35 ûƒ õy.ÿS*åfÞñE„Ä9QEA+uó×÷Ð[â˜L_Mº¶yü…S=ð9ؽc¯ÀP½)ïèö T÷n³ÓÞçŽ èéÞŽ¾52â~Áj)î¶ËÔ.3ðïbçúÔZC£$?úDd¸¨î$æáÄSê“A¨@Ö­o®.§9xÀˆ\*Ú¦×/?‰a:¸ªFx=`šì¹òùÝ:)Ç{_½­šy‚ßH +³Ôœkš6œ…ü·¿\< 8U*Ê–W?Yx—2ß ¾Uxy÷ûÈî”8` ÞÎ%nË%Ã9š ¦ð‰?lÕ‰vM"Ù½¾ùÐÙ—§ð•Jÿjûˆ¢~½¶š&•÷²®¤ÞÀ3æ ‡œË§± ÔÇæE¬[‰"K™sêW‹£>–ªYeg+ÝOZù;U;’qË­}~Šy˜¡âS9ú°WyÄ8ÁgJXeZ(¯g1¹®¡—YEÑ«â À$ŸÂ*—üÖgäòúAíóŠW™jnÌͦ7›­’¿ÜP§‰×Á~ 4ÞSD¸>¾ŸméáÅÙºõÐ/1·ýdeÎùI´êòìy­Cjt\“¶˜s˜W²“©Ð÷=Рf0ÎØú`sý ¿{EÃQ®øH@ñõß^S·¶£Ù»/Èß¡À>‰Ø@Ç^&»ülæqD`¡“c?3'òP·ð³Û 8|>ªmÓ”!f‹¬ýÅç¬}S;^jêY(È'éòö\=¸O/ÿ"S1w>ÁíJñêRÁІu®JÂaìçOoë´Ô§‹ {ÞÉ(J¥í¦Ïg¦›k1æ5ü`¼§#Í×/%4¸Š^ƒn@8Ä‚x±Á‹*ÄŽÜГ&Òé°Ãˆ‚&¿Î>ƒzY×Ë.Ð9b£s‘б¡ˆ|˜íy6Õz‚­~p×ô`´Ñ£7êr’ñùâq•¾ÛÅì~-Ú!¦Œ"Ûp)œ…’:D¸*¼—OUX—5½¿Ä)WµL-0ö‹j†!ó€b§º¢â„º[‹\“’—Æ•¸d„ryÐpW!Ù=êÇ„I×Ð «™A—µú&¬ í ,"(êŠÛ> Q6ðëÌ®û0$QU‡BÑ-Œ„fu½âª]×N Ý‹¬ÉhQ¸h…·¿Aìs}IÈ&ì˜%Ž’Z‰:è¯Àž•ÉAŒG~EŒ„¯ ¯³üA5;ÆCýÎê‚ßx|æ‚R© ŠsOùŒ¶¸t¥´ÐhÜ„púëê þ¬tR3¨ºA8`Œi8Ï{$Ó××Wìj9ét¸â[ÚUüмä–#Û™ÍL¤ýEyÀ©`ArRÕæ‚ÔÇš‚‹›÷VU[R¿âÂV¶ÆCóìN˜ÆO™è£û“jn+-·õ©çοô(xÝ•ÙÇÑ ~°CcYKOH¿^û5‰®R±œi†;a(šQ„bÊÀ…O}É<…¦ÑnúÈS ÒúœW’¸=kÞåø2ÈÁ׃9¡)ô©® áC¼÷ß]/I15Ù4<èD ªÌÜ3a™•pê ®Áüú°º9ÂZþ1Ù/ÃqÒ=îIöïüTˆªÙT(¯T-gZ ÆœÆ35jXj—WB¦6ˆ›ü}pMÄÞw‹®ÇÐË Àp~:Ë·^÷Û ¹ð[2Ô$ì£ê±uêáóZƹS\L"+QCQê/R2=|EåáSét#íÍOŠÏYËÔÇàœ!¿tfMCóO|MJdP¡Im0‡y[+ëË{³~”Z¸-ß9Âj²³Oݳ-hŠN-Ò>zpÑ×x³‹]9“Gߌ'Æ;íB‡ñÌ5¹t ÿ]µ '=Ó©¯~Îë÷——]9ýúýº8µ·"tøúw‡ël«$ë ¤·Ù˜±¶k\…â¯îprm'P’ tâiËl8ì Æ1ŠC5…×Ûœ[²…F1Õüü½ æñàÖr~¸¢'•jâ?.¿¸æýìFàfÉ =ŒO}ŽáO Ñ„ØAšv“x"þÛx¶žo>†Æ4…¿BU–_µD›:¨¥ñšHVxµÓ>\öà¨|gìÎéÎË=#Bc=}óæ€ÿÚà'Wã×VŸËÛs‹Ü£T#îÎÈ& ]ßøI¸t_b \é+sjù]èx>˜ŽN«Àõ壃A–5tm™[(ÒTµ6þRVô T‡Õ¡çDwciÂ$"-x#=á¾­·%°¾®Èœ†+³é0œõGWßÍ’z”qòÅ/åÓ1?ŠDQ8!"³àòÅÏÞ ¦„J ÄŸåJ½)ôyƒÍºÆwî¸rLŒ¥CÄk~T¦°ØçzSƒX”s¦Ï¥Ê0²|¶:{ÄØÒ¾lo&àzv ÞnIü¶5?óþݘÌÏ¢ûj<‹ëW¾±m#jÍuÖÉSÁ&–±JöÐ5†!UàÖ$bÓ/’(ªàa¶O~švŸß0Xšy¬Á {S> endobj 1534 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /RPAJFA+CMBX12 /ItalicAngle 0 /StemV 109 /XHeight 444 /FontBBox [-53 -251 1139 750] /Flags 4 /CharSet (/fi/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/I/L/M/N/O/P/R/S/T/U/V/W/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 1535 0 R >> endobj 4801 0 obj [625 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 313 375 313 563 563 563 563 563 563 563 563 563 563 563 0 0 0 0 0 0 0 850 800 813 862 738 707 884 0 419 0 0 676 1067 880 845 769 0 839 625 782 865 850 1162 0 0 0 0 0 0 0 0 0 547 625 500 625 513 344 563 625 313 344 594 313 938 625 563 625 0 459 444 438 625 594 813 594 594 500 ] endobj 4800 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine 58/.notdef 65/A/B/C/D/E/F/G 72/.notdef 73/I 74/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W 88/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 1541 0 obj << /Type /Pages /Count 6 /Parent 4802 0 R /Kids [1529 0 R 1543 0 R 1551 0 R 1612 0 R 1671 0 R 1732 0 R] >> endobj 1853 0 obj << /Type /Pages /Count 6 /Parent 4802 0 R /Kids [1793 0 R 1855 0 R 1915 0 R 1975 0 R 1997 0 R 2021 0 R] >> endobj 2039 0 obj << /Type /Pages /Count 6 /Parent 4802 0 R /Kids [2025 0 R 2047 0 R 2051 0 R 2069 0 R 2079 0 R 2086 0 R] >> endobj 2123 0 obj << /Type /Pages /Count 6 /Parent 4802 0 R /Kids [2102 0 R 2125 0 R 2131 0 R 2138 0 R 2150 0 R 2164 0 R] >> endobj 2176 0 obj << /Type /Pages /Count 6 /Parent 4802 0 R /Kids [2171 0 R 2178 0 R 2192 0 R 2204 0 R 2212 0 R 2216 0 R] >> endobj 2229 0 obj << /Type /Pages /Count 6 /Parent 4802 0 R /Kids [2221 0 R 2236 0 R 2246 0 R 2256 0 R 2288 0 R 2294 0 R] >> endobj 2305 0 obj << /Type /Pages /Count 6 /Parent 4803 0 R /Kids [2298 0 R 2307 0 R 2343 0 R 2360 0 R 2368 0 R 2378 0 R] >> endobj 2397 0 obj << /Type /Pages /Count 6 /Parent 4803 0 R /Kids [2390 0 R 2399 0 R 2403 0 R 2413 0 R 2423 0 R 2437 0 R] >> endobj 2454 0 obj << /Type /Pages /Count 6 /Parent 4803 0 R /Kids [2443 0 R 2456 0 R 2468 0 R 2472 0 R 2478 0 R 2488 0 R] >> endobj 2503 0 obj << /Type /Pages /Count 6 /Parent 4803 0 R /Kids [2496 0 R 2505 0 R 2511 0 R 2521 0 R 2533 0 R 2537 0 R] >> endobj 2552 0 obj << /Type /Pages /Count 6 /Parent 4803 0 R /Kids [2541 0 R 2554 0 R 2568 0 R 2578 0 R 2592 0 R 2600 0 R] >> endobj 2615 0 obj << /Type /Pages /Count 6 /Parent 4803 0 R /Kids [2610 0 R 2617 0 R 2625 0 R 2643 0 R 2667 0 R 2671 0 R] >> endobj 2680 0 obj << /Type /Pages /Count 6 /Parent 4804 0 R /Kids [2677 0 R 2682 0 R 2688 0 R 2694 0 R 2700 0 R 2710 0 R] >> endobj 2717 0 obj << /Type /Pages /Count 6 /Parent 4804 0 R /Kids [2714 0 R 2719 0 R 2727 0 R 2735 0 R 2741 0 R 2753 0 R] >> endobj 2766 0 obj << /Type /Pages /Count 6 /Parent 4804 0 R /Kids [2761 0 R 2768 0 R 2774 0 R 2780 0 R 2788 0 R 2792 0 R] >> endobj 2801 0 obj << /Type /Pages /Count 6 /Parent 4804 0 R /Kids [2798 0 R 2803 0 R 2809 0 R 2821 0 R 2829 0 R 2835 0 R] >> endobj 2854 0 obj << /Type /Pages /Count 6 /Parent 4804 0 R /Kids [2843 0 R 2856 0 R 2860 0 R 2864 0 R 2876 0 R 2888 0 R] >> endobj 2897 0 obj << /Type /Pages /Count 6 /Parent 4804 0 R /Kids [2894 0 R 2899 0 R 2903 0 R 2919 0 R 2941 0 R 2961 0 R] >> endobj 2990 0 obj << /Type /Pages /Count 6 /Parent 4805 0 R /Kids [2977 0 R 2992 0 R 2996 0 R 3012 0 R 3016 0 R 3024 0 R] >> endobj 3039 0 obj << /Type /Pages /Count 6 /Parent 4805 0 R /Kids [3030 0 R 3041 0 R 3045 0 R 3049 0 R 3053 0 R 3057 0 R] >> endobj 3074 0 obj << /Type /Pages /Count 6 /Parent 4805 0 R /Kids [3067 0 R 3076 0 R 3084 0 R 3088 0 R 3094 0 R 3098 0 R] >> endobj 3109 0 obj << /Type /Pages /Count 6 /Parent 4805 0 R /Kids [3102 0 R 3111 0 R 3117 0 R 3125 0 R 3133 0 R 3141 0 R] >> endobj 3150 0 obj << /Type /Pages /Count 6 /Parent 4805 0 R /Kids [3147 0 R 3152 0 R 3156 0 R 3162 0 R 3168 0 R 3176 0 R] >> endobj 3213 0 obj << /Type /Pages /Count 6 /Parent 4805 0 R /Kids [3202 0 R 3215 0 R 3221 0 R 3225 0 R 3229 0 R 3233 0 R] >> endobj 3246 0 obj << /Type /Pages /Count 6 /Parent 4806 0 R /Kids [3239 0 R 3248 0 R 3256 0 R 3266 0 R 3276 0 R 3286 0 R] >> endobj 3309 0 obj << /Type /Pages /Count 6 /Parent 4806 0 R /Kids [3300 0 R 3311 0 R 3321 0 R 3327 0 R 3333 0 R 3343 0 R] >> endobj 3360 0 obj << /Type /Pages /Count 6 /Parent 4806 0 R /Kids [3353 0 R 3362 0 R 3368 0 R 3380 0 R 3398 0 R 3410 0 R] >> endobj 3425 0 obj << /Type /Pages /Count 6 /Parent 4806 0 R /Kids [3418 0 R 3427 0 R 3433 0 R 3439 0 R 3443 0 R 3458 0 R] >> endobj 3471 0 obj << /Type /Pages /Count 6 /Parent 4806 0 R /Kids [3464 0 R 3473 0 R 3477 0 R 3481 0 R 3491 0 R 3497 0 R] >> endobj 3532 0 obj << /Type /Pages /Count 6 /Parent 4806 0 R /Kids [3517 0 R 3534 0 R 3542 0 R 3554 0 R 3560 0 R 3566 0 R] >> endobj 3575 0 obj << /Type /Pages /Count 6 /Parent 4807 0 R /Kids [3572 0 R 3577 0 R 3585 0 R 3589 0 R 3593 0 R 3603 0 R] >> endobj 3618 0 obj << /Type /Pages /Count 6 /Parent 4807 0 R /Kids [3611 0 R 3620 0 R 3630 0 R 3634 0 R 3638 0 R 3644 0 R] >> endobj 3661 0 obj << /Type /Pages /Count 6 /Parent 4807 0 R /Kids [3654 0 R 3663 0 R 3671 0 R 3683 0 R 3693 0 R 3699 0 R] >> endobj 3730 0 obj << /Type /Pages /Count 6 /Parent 4807 0 R /Kids [3719 0 R 3732 0 R 3746 0 R 3758 0 R 3764 0 R 3768 0 R] >> endobj 3784 0 obj << /Type /Pages /Count 6 /Parent 4807 0 R /Kids [3772 0 R 3786 0 R 3790 0 R 3794 0 R 3798 0 R 3803 0 R] >> endobj 3928 0 obj << /Type /Pages /Count 6 /Parent 4807 0 R /Kids [3807 0 R 3930 0 R 4086 0 R 4220 0 R 4370 0 R 4541 0 R] >> endobj 4773 0 obj << /Type /Pages /Count 1 /Parent 4808 0 R /Kids [4703 0 R] >> endobj 4802 0 obj << /Type /Pages /Count 36 /Parent 4809 0 R /Kids [1541 0 R 1853 0 R 2039 0 R 2123 0 R 2176 0 R 2229 0 R] >> endobj 4803 0 obj << /Type /Pages /Count 36 /Parent 4809 0 R /Kids [2305 0 R 2397 0 R 2454 0 R 2503 0 R 2552 0 R 2615 0 R] >> endobj 4804 0 obj << /Type /Pages /Count 36 /Parent 4809 0 R /Kids [2680 0 R 2717 0 R 2766 0 R 2801 0 R 2854 0 R 2897 0 R] >> endobj 4805 0 obj << /Type /Pages /Count 36 /Parent 4809 0 R /Kids [2990 0 R 3039 0 R 3074 0 R 3109 0 R 3150 0 R 3213 0 R] >> endobj 4806 0 obj << /Type /Pages /Count 36 /Parent 4809 0 R /Kids [3246 0 R 3309 0 R 3360 0 R 3425 0 R 3471 0 R 3532 0 R] >> endobj 4807 0 obj << /Type /Pages /Count 36 /Parent 4809 0 R /Kids [3575 0 R 3618 0 R 3661 0 R 3730 0 R 3784 0 R 3928 0 R] >> endobj 4808 0 obj << /Type /Pages /Count 1 /Parent 4810 0 R /Kids [4773 0 R] >> endobj 4809 0 obj << /Type /Pages /Count 216 /Parent 4811 0 R /Kids [4802 0 R 4803 0 R 4804 0 R 4805 0 R 4806 0 R 4807 0 R] >> endobj 4810 0 obj << /Type /Pages /Count 1 /Parent 4811 0 R /Kids [4808 0 R] >> endobj 4811 0 obj << /Type /Pages /Count 217 /Kids [4809 0 R 4810 0 R] >> endobj 4812 0 obj << /Type /Outlines /First 7 0 R /Last 1526 0 R /Count 11 >> endobj 1526 0 obj << /Title 1527 0 R /A 1524 0 R /Parent 4812 0 R /Prev 1522 0 R >> endobj 1522 0 obj << /Title 1523 0 R /A 1521 0 R /Parent 4812 0 R /Prev 1363 0 R /Next 1526 0 R >> endobj 1519 0 obj << /Title 1520 0 R /A 1517 0 R /Parent 1515 0 R >> endobj 1515 0 obj << /Title 1516 0 R /A 1513 0 R /Parent 1363 0 R /Prev 1499 0 R /First 1519 0 R /Last 1519 0 R /Count -1 >> endobj 1511 0 obj << /Title 1512 0 R /A 1509 0 R /Parent 1499 0 R /Prev 1507 0 R >> endobj 1507 0 obj << /Title 1508 0 R /A 1505 0 R /Parent 1499 0 R /Prev 1503 0 R /Next 1511 0 R >> endobj 1503 0 obj << /Title 1504 0 R /A 1501 0 R /Parent 1499 0 R /Next 1507 0 R >> endobj 1499 0 obj << /Title 1500 0 R /A 1497 0 R /Parent 1363 0 R /Prev 1451 0 R /Next 1515 0 R /First 1503 0 R /Last 1511 0 R /Count -3 >> endobj 1495 0 obj << /Title 1496 0 R /A 1493 0 R /Parent 1451 0 R /Prev 1491 0 R >> endobj 1491 0 obj << /Title 1492 0 R /A 1489 0 R /Parent 1451 0 R /Prev 1487 0 R /Next 1495 0 R >> endobj 1487 0 obj << /Title 1488 0 R /A 1485 0 R /Parent 1451 0 R /Prev 1483 0 R /Next 1491 0 R >> endobj 1483 0 obj << /Title 1484 0 R /A 1481 0 R /Parent 1451 0 R /Prev 1479 0 R /Next 1487 0 R >> endobj 1479 0 obj << /Title 1480 0 R /A 1477 0 R /Parent 1451 0 R /Prev 1475 0 R /Next 1483 0 R >> endobj 1475 0 obj << /Title 1476 0 R /A 1473 0 R /Parent 1451 0 R /Prev 1471 0 R /Next 1479 0 R >> endobj 1471 0 obj << /Title 1472 0 R /A 1469 0 R /Parent 1451 0 R /Prev 1467 0 R /Next 1475 0 R >> endobj 1467 0 obj << /Title 1468 0 R /A 1465 0 R /Parent 1451 0 R /Prev 1463 0 R /Next 1471 0 R >> endobj 1463 0 obj << /Title 1464 0 R /A 1461 0 R /Parent 1451 0 R /Prev 1459 0 R /Next 1467 0 R >> endobj 1459 0 obj << /Title 1460 0 R /A 1457 0 R /Parent 1451 0 R /Prev 1455 0 R /Next 1463 0 R >> endobj 1455 0 obj << /Title 1456 0 R /A 1453 0 R /Parent 1451 0 R /Next 1459 0 R >> endobj 1451 0 obj << /Title 1452 0 R /A 1449 0 R /Parent 1363 0 R /Prev 1411 0 R /Next 1499 0 R /First 1455 0 R /Last 1495 0 R /Count -11 >> endobj 1447 0 obj << /Title 1448 0 R /A 1445 0 R /Parent 1411 0 R /Prev 1443 0 R >> endobj 1443 0 obj << /Title 1444 0 R /A 1441 0 R /Parent 1411 0 R /Prev 1439 0 R /Next 1447 0 R >> endobj 1439 0 obj << /Title 1440 0 R /A 1437 0 R /Parent 1411 0 R /Prev 1435 0 R /Next 1443 0 R >> endobj 1435 0 obj << /Title 1436 0 R /A 1433 0 R /Parent 1411 0 R /Prev 1431 0 R /Next 1439 0 R >> endobj 1431 0 obj << /Title 1432 0 R /A 1429 0 R /Parent 1411 0 R /Prev 1427 0 R /Next 1435 0 R >> endobj 1427 0 obj << /Title 1428 0 R /A 1425 0 R /Parent 1411 0 R /Prev 1423 0 R /Next 1431 0 R >> endobj 1423 0 obj << /Title 1424 0 R /A 1421 0 R /Parent 1411 0 R /Prev 1419 0 R /Next 1427 0 R >> endobj 1419 0 obj << /Title 1420 0 R /A 1417 0 R /Parent 1411 0 R /Prev 1415 0 R /Next 1423 0 R >> endobj 1415 0 obj << /Title 1416 0 R /A 1413 0 R /Parent 1411 0 R /Next 1419 0 R >> endobj 1411 0 obj << /Title 1412 0 R /A 1409 0 R /Parent 1363 0 R /Prev 1367 0 R /Next 1451 0 R /First 1415 0 R /Last 1447 0 R /Count -9 >> endobj 1407 0 obj << /Title 1408 0 R /A 1405 0 R /Parent 1367 0 R /Prev 1403 0 R >> endobj 1403 0 obj << /Title 1404 0 R /A 1401 0 R /Parent 1367 0 R /Prev 1399 0 R /Next 1407 0 R >> endobj 1399 0 obj << /Title 1400 0 R /A 1397 0 R /Parent 1367 0 R /Prev 1395 0 R /Next 1403 0 R >> endobj 1395 0 obj << /Title 1396 0 R /A 1393 0 R /Parent 1367 0 R /Prev 1391 0 R /Next 1399 0 R >> endobj 1391 0 obj << /Title 1392 0 R /A 1389 0 R /Parent 1367 0 R /Prev 1387 0 R /Next 1395 0 R >> endobj 1387 0 obj << /Title 1388 0 R /A 1385 0 R /Parent 1367 0 R /Prev 1383 0 R /Next 1391 0 R >> endobj 1383 0 obj << /Title 1384 0 R /A 1381 0 R /Parent 1367 0 R /Prev 1379 0 R /Next 1387 0 R >> endobj 1379 0 obj << /Title 1380 0 R /A 1377 0 R /Parent 1367 0 R /Prev 1375 0 R /Next 1383 0 R >> endobj 1375 0 obj << /Title 1376 0 R /A 1373 0 R /Parent 1367 0 R /Prev 1371 0 R /Next 1379 0 R >> endobj 1371 0 obj << /Title 1372 0 R /A 1369 0 R /Parent 1367 0 R /Next 1375 0 R >> endobj 1367 0 obj << /Title 1368 0 R /A 1365 0 R /Parent 1363 0 R /Next 1411 0 R /First 1371 0 R /Last 1407 0 R /Count -10 >> endobj 1363 0 obj << /Title 1364 0 R /A 1361 0 R /Parent 4812 0 R /Prev 1227 0 R /Next 1522 0 R /First 1367 0 R /Last 1515 0 R /Count -5 >> endobj 1359 0 obj << /Title 1360 0 R /A 1357 0 R /Parent 1355 0 R >> endobj 1355 0 obj << /Title 1356 0 R /A 1353 0 R /Parent 1227 0 R /Prev 1347 0 R /First 1359 0 R /Last 1359 0 R /Count -1 >> endobj 1351 0 obj << /Title 1352 0 R /A 1349 0 R /Parent 1347 0 R >> endobj 1347 0 obj << /Title 1348 0 R /A 1345 0 R /Parent 1227 0 R /Prev 1323 0 R /Next 1355 0 R /First 1351 0 R /Last 1351 0 R /Count -1 >> endobj 1343 0 obj << /Title 1344 0 R /A 1341 0 R /Parent 1323 0 R /Prev 1339 0 R >> endobj 1339 0 obj << /Title 1340 0 R /A 1337 0 R /Parent 1323 0 R /Prev 1335 0 R /Next 1343 0 R >> endobj 1335 0 obj << /Title 1336 0 R /A 1333 0 R /Parent 1323 0 R /Prev 1331 0 R /Next 1339 0 R >> endobj 1331 0 obj << /Title 1332 0 R /A 1329 0 R /Parent 1323 0 R /Prev 1327 0 R /Next 1335 0 R >> endobj 1327 0 obj << /Title 1328 0 R /A 1325 0 R /Parent 1323 0 R /Next 1331 0 R >> endobj 1323 0 obj << /Title 1324 0 R /A 1321 0 R /Parent 1227 0 R /Prev 1307 0 R /Next 1347 0 R /First 1327 0 R /Last 1343 0 R /Count -5 >> endobj 1319 0 obj << /Title 1320 0 R /A 1317 0 R /Parent 1307 0 R /Prev 1315 0 R >> endobj 1315 0 obj << /Title 1316 0 R /A 1313 0 R /Parent 1307 0 R /Prev 1311 0 R /Next 1319 0 R >> endobj 1311 0 obj << /Title 1312 0 R /A 1309 0 R /Parent 1307 0 R /Next 1315 0 R >> endobj 1307 0 obj << /Title 1308 0 R /A 1305 0 R /Parent 1227 0 R /Prev 1287 0 R /Next 1323 0 R /First 1311 0 R /Last 1319 0 R /Count -3 >> endobj 1303 0 obj << /Title 1304 0 R /A 1301 0 R /Parent 1287 0 R /Prev 1299 0 R >> endobj 1299 0 obj << /Title 1300 0 R /A 1297 0 R /Parent 1287 0 R /Prev 1295 0 R /Next 1303 0 R >> endobj 1295 0 obj << /Title 1296 0 R /A 1293 0 R /Parent 1287 0 R /Prev 1291 0 R /Next 1299 0 R >> endobj 1291 0 obj << /Title 1292 0 R /A 1289 0 R /Parent 1287 0 R /Next 1295 0 R >> endobj 1287 0 obj << /Title 1288 0 R /A 1285 0 R /Parent 1227 0 R /Prev 1275 0 R /Next 1307 0 R /First 1291 0 R /Last 1303 0 R /Count -4 >> endobj 1283 0 obj << /Title 1284 0 R /A 1281 0 R /Parent 1275 0 R /Prev 1279 0 R >> endobj 1279 0 obj << /Title 1280 0 R /A 1277 0 R /Parent 1275 0 R /Next 1283 0 R >> endobj 1275 0 obj << /Title 1276 0 R /A 1273 0 R /Parent 1227 0 R /Prev 1267 0 R /Next 1287 0 R /First 1279 0 R /Last 1283 0 R /Count -2 >> endobj 1271 0 obj << /Title 1272 0 R /A 1269 0 R /Parent 1267 0 R >> endobj 1267 0 obj << /Title 1268 0 R /A 1265 0 R /Parent 1227 0 R /Prev 1255 0 R /Next 1275 0 R /First 1271 0 R /Last 1271 0 R /Count -1 >> endobj 1263 0 obj << /Title 1264 0 R /A 1261 0 R /Parent 1255 0 R /Prev 1259 0 R >> endobj 1259 0 obj << /Title 1260 0 R /A 1257 0 R /Parent 1255 0 R /Next 1263 0 R >> endobj 1255 0 obj << /Title 1256 0 R /A 1253 0 R /Parent 1227 0 R /Prev 1239 0 R /Next 1267 0 R /First 1259 0 R /Last 1263 0 R /Count -2 >> endobj 1251 0 obj << /Title 1252 0 R /A 1249 0 R /Parent 1239 0 R /Prev 1247 0 R >> endobj 1247 0 obj << /Title 1248 0 R /A 1245 0 R /Parent 1239 0 R /Prev 1243 0 R /Next 1251 0 R >> endobj 1243 0 obj << /Title 1244 0 R /A 1241 0 R /Parent 1239 0 R /Next 1247 0 R >> endobj 1239 0 obj << /Title 1240 0 R /A 1237 0 R /Parent 1227 0 R /Prev 1231 0 R /Next 1255 0 R /First 1243 0 R /Last 1251 0 R /Count -3 >> endobj 1235 0 obj << /Title 1236 0 R /A 1233 0 R /Parent 1231 0 R >> endobj 1231 0 obj << /Title 1232 0 R /A 1229 0 R /Parent 1227 0 R /Next 1239 0 R /First 1235 0 R /Last 1235 0 R /Count -1 >> endobj 1227 0 obj << /Title 1228 0 R /A 1225 0 R /Parent 4812 0 R /Prev 263 0 R /Next 1363 0 R /First 1231 0 R /Last 1355 0 R /Count -10 >> endobj 1223 0 obj << /Title 1224 0 R /A 1221 0 R /Parent 1151 0 R /Prev 1219 0 R >> endobj 1219 0 obj << /Title 1220 0 R /A 1217 0 R /Parent 1151 0 R /Prev 1215 0 R /Next 1223 0 R >> endobj 1215 0 obj << /Title 1216 0 R /A 1213 0 R /Parent 1151 0 R /Prev 1211 0 R /Next 1219 0 R >> endobj 1211 0 obj << /Title 1212 0 R /A 1209 0 R /Parent 1151 0 R /Prev 1207 0 R /Next 1215 0 R >> endobj 1207 0 obj << /Title 1208 0 R /A 1205 0 R /Parent 1151 0 R /Prev 1203 0 R /Next 1211 0 R >> endobj 1203 0 obj << /Title 1204 0 R /A 1201 0 R /Parent 1151 0 R /Prev 1199 0 R /Next 1207 0 R >> endobj 1199 0 obj << /Title 1200 0 R /A 1197 0 R /Parent 1151 0 R /Prev 1195 0 R /Next 1203 0 R >> endobj 1195 0 obj << /Title 1196 0 R /A 1193 0 R /Parent 1151 0 R /Prev 1191 0 R /Next 1199 0 R >> endobj 1191 0 obj << /Title 1192 0 R /A 1189 0 R /Parent 1151 0 R /Prev 1187 0 R /Next 1195 0 R >> endobj 1187 0 obj << /Title 1188 0 R /A 1185 0 R /Parent 1151 0 R /Prev 1183 0 R /Next 1191 0 R >> endobj 1183 0 obj << /Title 1184 0 R /A 1181 0 R /Parent 1151 0 R /Prev 1179 0 R /Next 1187 0 R >> endobj 1179 0 obj << /Title 1180 0 R /A 1177 0 R /Parent 1151 0 R /Prev 1175 0 R /Next 1183 0 R >> endobj 1175 0 obj << /Title 1176 0 R /A 1173 0 R /Parent 1151 0 R /Prev 1171 0 R /Next 1179 0 R >> endobj 1171 0 obj << /Title 1172 0 R /A 1169 0 R /Parent 1151 0 R /Prev 1167 0 R /Next 1175 0 R >> endobj 1167 0 obj << /Title 1168 0 R /A 1165 0 R /Parent 1151 0 R /Prev 1163 0 R /Next 1171 0 R >> endobj 1163 0 obj << /Title 1164 0 R /A 1161 0 R /Parent 1151 0 R /Prev 1159 0 R /Next 1167 0 R >> endobj 1159 0 obj << /Title 1160 0 R /A 1157 0 R /Parent 1151 0 R /Prev 1155 0 R /Next 1163 0 R >> endobj 1155 0 obj << /Title 1156 0 R /A 1153 0 R /Parent 1151 0 R /Next 1159 0 R >> endobj 1151 0 obj << /Title 1152 0 R /A 1149 0 R /Parent 263 0 R /Prev 1131 0 R /First 1155 0 R /Last 1223 0 R /Count -18 >> endobj 1147 0 obj << /Title 1148 0 R /A 1145 0 R /Parent 1131 0 R /Prev 1143 0 R >> endobj 1143 0 obj << /Title 1144 0 R /A 1141 0 R /Parent 1131 0 R /Prev 1139 0 R /Next 1147 0 R >> endobj 1139 0 obj << /Title 1140 0 R /A 1137 0 R /Parent 1131 0 R /Prev 1135 0 R /Next 1143 0 R >> endobj 1135 0 obj << /Title 1136 0 R /A 1133 0 R /Parent 1131 0 R /Next 1139 0 R >> endobj 1131 0 obj << /Title 1132 0 R /A 1129 0 R /Parent 263 0 R /Prev 1095 0 R /Next 1151 0 R /First 1135 0 R /Last 1147 0 R /Count -4 >> endobj 1127 0 obj << /Title 1128 0 R /A 1125 0 R /Parent 1095 0 R /Prev 1123 0 R >> endobj 1123 0 obj << /Title 1124 0 R /A 1121 0 R /Parent 1095 0 R /Prev 1119 0 R /Next 1127 0 R >> endobj 1119 0 obj << /Title 1120 0 R /A 1117 0 R /Parent 1095 0 R /Prev 1115 0 R /Next 1123 0 R >> endobj 1115 0 obj << /Title 1116 0 R /A 1113 0 R /Parent 1095 0 R /Prev 1111 0 R /Next 1119 0 R >> endobj 1111 0 obj << /Title 1112 0 R /A 1109 0 R /Parent 1095 0 R /Prev 1107 0 R /Next 1115 0 R >> endobj 1107 0 obj << /Title 1108 0 R /A 1105 0 R /Parent 1095 0 R /Prev 1103 0 R /Next 1111 0 R >> endobj 1103 0 obj << /Title 1104 0 R /A 1101 0 R /Parent 1095 0 R /Prev 1099 0 R /Next 1107 0 R >> endobj 1099 0 obj << /Title 1100 0 R /A 1097 0 R /Parent 1095 0 R /Next 1103 0 R >> endobj 1095 0 obj << /Title 1096 0 R /A 1093 0 R /Parent 263 0 R /Prev 975 0 R /Next 1131 0 R /First 1099 0 R /Last 1127 0 R /Count -8 >> endobj 1091 0 obj << /Title 1092 0 R /A 1089 0 R /Parent 975 0 R /Prev 1087 0 R >> endobj 1087 0 obj << /Title 1088 0 R /A 1085 0 R /Parent 975 0 R /Prev 1083 0 R /Next 1091 0 R >> endobj 1083 0 obj << /Title 1084 0 R /A 1081 0 R /Parent 975 0 R /Prev 1079 0 R /Next 1087 0 R >> endobj 1079 0 obj << /Title 1080 0 R /A 1077 0 R /Parent 975 0 R /Prev 1075 0 R /Next 1083 0 R >> endobj 1075 0 obj << /Title 1076 0 R /A 1073 0 R /Parent 975 0 R /Prev 1071 0 R /Next 1079 0 R >> endobj 1071 0 obj << /Title 1072 0 R /A 1069 0 R /Parent 975 0 R /Prev 1067 0 R /Next 1075 0 R >> endobj 1067 0 obj << /Title 1068 0 R /A 1065 0 R /Parent 975 0 R /Prev 1063 0 R /Next 1071 0 R >> endobj 1063 0 obj << /Title 1064 0 R /A 1061 0 R /Parent 975 0 R /Prev 1059 0 R /Next 1067 0 R >> endobj 1059 0 obj << /Title 1060 0 R /A 1057 0 R /Parent 975 0 R /Prev 1055 0 R /Next 1063 0 R >> endobj 1055 0 obj << /Title 1056 0 R /A 1053 0 R /Parent 975 0 R /Prev 1051 0 R /Next 1059 0 R >> endobj 1051 0 obj << /Title 1052 0 R /A 1049 0 R /Parent 975 0 R /Prev 1047 0 R /Next 1055 0 R >> endobj 1047 0 obj << /Title 1048 0 R /A 1045 0 R /Parent 975 0 R /Prev 1043 0 R /Next 1051 0 R >> endobj 1043 0 obj << /Title 1044 0 R /A 1041 0 R /Parent 975 0 R /Prev 1039 0 R /Next 1047 0 R >> endobj 1039 0 obj << /Title 1040 0 R /A 1037 0 R /Parent 975 0 R /Prev 1035 0 R /Next 1043 0 R >> endobj 1035 0 obj << /Title 1036 0 R /A 1033 0 R /Parent 975 0 R /Prev 1031 0 R /Next 1039 0 R >> endobj 1031 0 obj << /Title 1032 0 R /A 1029 0 R /Parent 975 0 R /Prev 1027 0 R /Next 1035 0 R >> endobj 1027 0 obj << /Title 1028 0 R /A 1025 0 R /Parent 975 0 R /Prev 1023 0 R /Next 1031 0 R >> endobj 1023 0 obj << /Title 1024 0 R /A 1021 0 R /Parent 975 0 R /Prev 1019 0 R /Next 1027 0 R >> endobj 1019 0 obj << /Title 1020 0 R /A 1017 0 R /Parent 975 0 R /Prev 1015 0 R /Next 1023 0 R >> endobj 1015 0 obj << /Title 1016 0 R /A 1013 0 R /Parent 975 0 R /Prev 1011 0 R /Next 1019 0 R >> endobj 1011 0 obj << /Title 1012 0 R /A 1009 0 R /Parent 975 0 R /Prev 1007 0 R /Next 1015 0 R >> endobj 1007 0 obj << /Title 1008 0 R /A 1005 0 R /Parent 975 0 R /Prev 1003 0 R /Next 1011 0 R >> endobj 1003 0 obj << /Title 1004 0 R /A 1001 0 R /Parent 975 0 R /Prev 999 0 R /Next 1007 0 R >> endobj 999 0 obj << /Title 1000 0 R /A 997 0 R /Parent 975 0 R /Prev 995 0 R /Next 1003 0 R >> endobj 995 0 obj << /Title 996 0 R /A 993 0 R /Parent 975 0 R /Prev 991 0 R /Next 999 0 R >> endobj 991 0 obj << /Title 992 0 R /A 989 0 R /Parent 975 0 R /Prev 987 0 R /Next 995 0 R >> endobj 987 0 obj << /Title 988 0 R /A 985 0 R /Parent 975 0 R /Prev 983 0 R /Next 991 0 R >> endobj 983 0 obj << /Title 984 0 R /A 981 0 R /Parent 975 0 R /Prev 979 0 R /Next 987 0 R >> endobj 979 0 obj << /Title 980 0 R /A 977 0 R /Parent 975 0 R /Next 983 0 R >> endobj 975 0 obj << /Title 976 0 R /A 973 0 R /Parent 263 0 R /Prev 959 0 R /Next 1095 0 R /First 979 0 R /Last 1091 0 R /Count -29 >> endobj 971 0 obj << /Title 972 0 R /A 969 0 R /Parent 959 0 R /Prev 967 0 R >> endobj 967 0 obj << /Title 968 0 R /A 965 0 R /Parent 959 0 R /Prev 963 0 R /Next 971 0 R >> endobj 963 0 obj << /Title 964 0 R /A 961 0 R /Parent 959 0 R /Next 967 0 R >> endobj 959 0 obj << /Title 960 0 R /A 957 0 R /Parent 263 0 R /Prev 939 0 R /Next 975 0 R /First 963 0 R /Last 971 0 R /Count -3 >> endobj 955 0 obj << /Title 956 0 R /A 953 0 R /Parent 939 0 R /Prev 951 0 R >> endobj 951 0 obj << /Title 952 0 R /A 949 0 R /Parent 939 0 R /Prev 947 0 R /Next 955 0 R >> endobj 947 0 obj << /Title 948 0 R /A 945 0 R /Parent 939 0 R /Prev 943 0 R /Next 951 0 R >> endobj 943 0 obj << /Title 944 0 R /A 941 0 R /Parent 939 0 R /Next 947 0 R >> endobj 939 0 obj << /Title 940 0 R /A 937 0 R /Parent 263 0 R /Prev 927 0 R /Next 959 0 R /First 943 0 R /Last 955 0 R /Count -4 >> endobj 935 0 obj << /Title 936 0 R /A 933 0 R /Parent 927 0 R /Prev 931 0 R >> endobj 931 0 obj << /Title 932 0 R /A 929 0 R /Parent 927 0 R /Next 935 0 R >> endobj 927 0 obj << /Title 928 0 R /A 925 0 R /Parent 263 0 R /Prev 911 0 R /Next 939 0 R /First 931 0 R /Last 935 0 R /Count -2 >> endobj 923 0 obj << /Title 924 0 R /A 921 0 R /Parent 911 0 R /Prev 919 0 R >> endobj 919 0 obj << /Title 920 0 R /A 917 0 R /Parent 911 0 R /Prev 915 0 R /Next 923 0 R >> endobj 915 0 obj << /Title 916 0 R /A 913 0 R /Parent 911 0 R /Next 919 0 R >> endobj 911 0 obj << /Title 912 0 R /A 909 0 R /Parent 263 0 R /Prev 887 0 R /Next 927 0 R /First 915 0 R /Last 923 0 R /Count -3 >> endobj 907 0 obj << /Title 908 0 R /A 905 0 R /Parent 887 0 R /Prev 903 0 R >> endobj 903 0 obj << /Title 904 0 R /A 901 0 R /Parent 887 0 R /Prev 899 0 R /Next 907 0 R >> endobj 899 0 obj << /Title 900 0 R /A 897 0 R /Parent 887 0 R /Prev 895 0 R /Next 903 0 R >> endobj 895 0 obj << /Title 896 0 R /A 893 0 R /Parent 887 0 R /Prev 891 0 R /Next 899 0 R >> endobj 891 0 obj << /Title 892 0 R /A 889 0 R /Parent 887 0 R /Next 895 0 R >> endobj 887 0 obj << /Title 888 0 R /A 885 0 R /Parent 263 0 R /Prev 855 0 R /Next 911 0 R /First 891 0 R /Last 907 0 R /Count -5 >> endobj 883 0 obj << /Title 884 0 R /A 881 0 R /Parent 855 0 R /Prev 879 0 R >> endobj 879 0 obj << /Title 880 0 R /A 877 0 R /Parent 855 0 R /Prev 875 0 R /Next 883 0 R >> endobj 875 0 obj << /Title 876 0 R /A 873 0 R /Parent 855 0 R /Prev 871 0 R /Next 879 0 R >> endobj 871 0 obj << /Title 872 0 R /A 869 0 R /Parent 855 0 R /Prev 867 0 R /Next 875 0 R >> endobj 867 0 obj << /Title 868 0 R /A 865 0 R /Parent 855 0 R /Prev 863 0 R /Next 871 0 R >> endobj 863 0 obj << /Title 864 0 R /A 861 0 R /Parent 855 0 R /Prev 859 0 R /Next 867 0 R >> endobj 859 0 obj << /Title 860 0 R /A 857 0 R /Parent 855 0 R /Next 863 0 R >> endobj 855 0 obj << /Title 856 0 R /A 853 0 R /Parent 263 0 R /Prev 803 0 R /Next 887 0 R /First 859 0 R /Last 883 0 R /Count -7 >> endobj 851 0 obj << /Title 852 0 R /A 849 0 R /Parent 803 0 R /Prev 847 0 R >> endobj 847 0 obj << /Title 848 0 R /A 845 0 R /Parent 803 0 R /Prev 843 0 R /Next 851 0 R >> endobj 843 0 obj << /Title 844 0 R /A 841 0 R /Parent 803 0 R /Prev 839 0 R /Next 847 0 R >> endobj 839 0 obj << /Title 840 0 R /A 837 0 R /Parent 803 0 R /Prev 835 0 R /Next 843 0 R >> endobj 835 0 obj << /Title 836 0 R /A 833 0 R /Parent 803 0 R /Prev 831 0 R /Next 839 0 R >> endobj 831 0 obj << /Title 832 0 R /A 829 0 R /Parent 803 0 R /Prev 827 0 R /Next 835 0 R >> endobj 827 0 obj << /Title 828 0 R /A 825 0 R /Parent 803 0 R /Prev 823 0 R /Next 831 0 R >> endobj 823 0 obj << /Title 824 0 R /A 821 0 R /Parent 803 0 R /Prev 819 0 R /Next 827 0 R >> endobj 819 0 obj << /Title 820 0 R /A 817 0 R /Parent 803 0 R /Prev 815 0 R /Next 823 0 R >> endobj 815 0 obj << /Title 816 0 R /A 813 0 R /Parent 803 0 R /Prev 811 0 R /Next 819 0 R >> endobj 811 0 obj << /Title 812 0 R /A 809 0 R /Parent 803 0 R /Prev 807 0 R /Next 815 0 R >> endobj 807 0 obj << /Title 808 0 R /A 805 0 R /Parent 803 0 R /Next 811 0 R >> endobj 803 0 obj << /Title 804 0 R /A 801 0 R /Parent 263 0 R /Prev 751 0 R /Next 855 0 R /First 807 0 R /Last 851 0 R /Count -12 >> endobj 799 0 obj << /Title 800 0 R /A 797 0 R /Parent 751 0 R /Prev 795 0 R >> endobj 795 0 obj << /Title 796 0 R /A 793 0 R /Parent 751 0 R /Prev 791 0 R /Next 799 0 R >> endobj 791 0 obj << /Title 792 0 R /A 789 0 R /Parent 751 0 R /Prev 787 0 R /Next 795 0 R >> endobj 787 0 obj << /Title 788 0 R /A 785 0 R /Parent 751 0 R /Prev 783 0 R /Next 791 0 R >> endobj 783 0 obj << /Title 784 0 R /A 781 0 R /Parent 751 0 R /Prev 779 0 R /Next 787 0 R >> endobj 779 0 obj << /Title 780 0 R /A 777 0 R /Parent 751 0 R /Prev 775 0 R /Next 783 0 R >> endobj 775 0 obj << /Title 776 0 R /A 773 0 R /Parent 751 0 R /Prev 771 0 R /Next 779 0 R >> endobj 771 0 obj << /Title 772 0 R /A 769 0 R /Parent 751 0 R /Prev 767 0 R /Next 775 0 R >> endobj 767 0 obj << /Title 768 0 R /A 765 0 R /Parent 751 0 R /Prev 763 0 R /Next 771 0 R >> endobj 763 0 obj << /Title 764 0 R /A 761 0 R /Parent 751 0 R /Prev 759 0 R /Next 767 0 R >> endobj 759 0 obj << /Title 760 0 R /A 757 0 R /Parent 751 0 R /Prev 755 0 R /Next 763 0 R >> endobj 755 0 obj << /Title 756 0 R /A 753 0 R /Parent 751 0 R /Next 759 0 R >> endobj 751 0 obj << /Title 752 0 R /A 749 0 R /Parent 263 0 R /Prev 731 0 R /Next 803 0 R /First 755 0 R /Last 799 0 R /Count -12 >> endobj 747 0 obj << /Title 748 0 R /A 745 0 R /Parent 731 0 R /Prev 743 0 R >> endobj 743 0 obj << /Title 744 0 R /A 741 0 R /Parent 731 0 R /Prev 739 0 R /Next 747 0 R >> endobj 739 0 obj << /Title 740 0 R /A 737 0 R /Parent 731 0 R /Prev 735 0 R /Next 743 0 R >> endobj 735 0 obj << /Title 736 0 R /A 733 0 R /Parent 731 0 R /Next 739 0 R >> endobj 731 0 obj << /Title 732 0 R /A 729 0 R /Parent 263 0 R /Prev 715 0 R /Next 751 0 R /First 735 0 R /Last 747 0 R /Count -4 >> endobj 727 0 obj << /Title 728 0 R /A 725 0 R /Parent 715 0 R /Prev 723 0 R >> endobj 723 0 obj << /Title 724 0 R /A 721 0 R /Parent 715 0 R /Prev 719 0 R /Next 727 0 R >> endobj 719 0 obj << /Title 720 0 R /A 717 0 R /Parent 715 0 R /Next 723 0 R >> endobj 715 0 obj << /Title 716 0 R /A 713 0 R /Parent 263 0 R /Prev 687 0 R /Next 731 0 R /First 719 0 R /Last 727 0 R /Count -3 >> endobj 711 0 obj << /Title 712 0 R /A 709 0 R /Parent 687 0 R /Prev 707 0 R >> endobj 707 0 obj << /Title 708 0 R /A 705 0 R /Parent 687 0 R /Prev 703 0 R /Next 711 0 R >> endobj 703 0 obj << /Title 704 0 R /A 701 0 R /Parent 687 0 R /Prev 699 0 R /Next 707 0 R >> endobj 699 0 obj << /Title 700 0 R /A 697 0 R /Parent 687 0 R /Prev 695 0 R /Next 703 0 R >> endobj 695 0 obj << /Title 696 0 R /A 693 0 R /Parent 687 0 R /Prev 691 0 R /Next 699 0 R >> endobj 691 0 obj << /Title 692 0 R /A 689 0 R /Parent 687 0 R /Next 695 0 R >> endobj 687 0 obj << /Title 688 0 R /A 685 0 R /Parent 263 0 R /Prev 659 0 R /Next 715 0 R /First 691 0 R /Last 711 0 R /Count -6 >> endobj 683 0 obj << /Title 684 0 R /A 681 0 R /Parent 659 0 R /Prev 679 0 R >> endobj 679 0 obj << /Title 680 0 R /A 677 0 R /Parent 659 0 R /Prev 675 0 R /Next 683 0 R >> endobj 675 0 obj << /Title 676 0 R /A 673 0 R /Parent 659 0 R /Prev 671 0 R /Next 679 0 R >> endobj 671 0 obj << /Title 672 0 R /A 669 0 R /Parent 659 0 R /Prev 667 0 R /Next 675 0 R >> endobj 667 0 obj << /Title 668 0 R /A 665 0 R /Parent 659 0 R /Prev 663 0 R /Next 671 0 R >> endobj 663 0 obj << /Title 664 0 R /A 661 0 R /Parent 659 0 R /Next 667 0 R >> endobj 659 0 obj << /Title 660 0 R /A 657 0 R /Parent 263 0 R /Prev 603 0 R /Next 687 0 R /First 663 0 R /Last 683 0 R /Count -6 >> endobj 655 0 obj << /Title 656 0 R /A 653 0 R /Parent 603 0 R /Prev 651 0 R >> endobj 651 0 obj << /Title 652 0 R /A 649 0 R /Parent 603 0 R /Prev 647 0 R /Next 655 0 R >> endobj 647 0 obj << /Title 648 0 R /A 645 0 R /Parent 603 0 R /Prev 643 0 R /Next 651 0 R >> endobj 643 0 obj << /Title 644 0 R /A 641 0 R /Parent 603 0 R /Prev 639 0 R /Next 647 0 R >> endobj 639 0 obj << /Title 640 0 R /A 637 0 R /Parent 603 0 R /Prev 635 0 R /Next 643 0 R >> endobj 635 0 obj << /Title 636 0 R /A 633 0 R /Parent 603 0 R /Prev 631 0 R /Next 639 0 R >> endobj 631 0 obj << /Title 632 0 R /A 629 0 R /Parent 603 0 R /Prev 627 0 R /Next 635 0 R >> endobj 627 0 obj << /Title 628 0 R /A 625 0 R /Parent 603 0 R /Prev 623 0 R /Next 631 0 R >> endobj 623 0 obj << /Title 624 0 R /A 621 0 R /Parent 603 0 R /Prev 619 0 R /Next 627 0 R >> endobj 619 0 obj << /Title 620 0 R /A 617 0 R /Parent 603 0 R /Prev 615 0 R /Next 623 0 R >> endobj 615 0 obj << /Title 616 0 R /A 613 0 R /Parent 603 0 R /Prev 611 0 R /Next 619 0 R >> endobj 611 0 obj << /Title 612 0 R /A 609 0 R /Parent 603 0 R /Prev 607 0 R /Next 615 0 R >> endobj 607 0 obj << /Title 608 0 R /A 605 0 R /Parent 603 0 R /Next 611 0 R >> endobj 603 0 obj << /Title 604 0 R /A 601 0 R /Parent 263 0 R /Prev 583 0 R /Next 659 0 R /First 607 0 R /Last 655 0 R /Count -13 >> endobj 599 0 obj << /Title 600 0 R /A 597 0 R /Parent 583 0 R /Prev 595 0 R >> endobj 595 0 obj << /Title 596 0 R /A 593 0 R /Parent 583 0 R /Prev 591 0 R /Next 599 0 R >> endobj 591 0 obj << /Title 592 0 R /A 589 0 R /Parent 583 0 R /Prev 587 0 R /Next 595 0 R >> endobj 587 0 obj << /Title 588 0 R /A 585 0 R /Parent 583 0 R /Next 591 0 R >> endobj 583 0 obj << /Title 584 0 R /A 581 0 R /Parent 263 0 R /Prev 559 0 R /Next 603 0 R /First 587 0 R /Last 599 0 R /Count -4 >> endobj 579 0 obj << /Title 580 0 R /A 577 0 R /Parent 559 0 R /Prev 575 0 R >> endobj 575 0 obj << /Title 576 0 R /A 573 0 R /Parent 559 0 R /Prev 571 0 R /Next 579 0 R >> endobj 571 0 obj << /Title 572 0 R /A 569 0 R /Parent 559 0 R /Prev 567 0 R /Next 575 0 R >> endobj 567 0 obj << /Title 568 0 R /A 565 0 R /Parent 559 0 R /Prev 563 0 R /Next 571 0 R >> endobj 563 0 obj << /Title 564 0 R /A 561 0 R /Parent 559 0 R /Next 567 0 R >> endobj 559 0 obj << /Title 560 0 R /A 557 0 R /Parent 263 0 R /Prev 535 0 R /Next 583 0 R /First 563 0 R /Last 579 0 R /Count -5 >> endobj 555 0 obj << /Title 556 0 R /A 553 0 R /Parent 535 0 R /Prev 551 0 R >> endobj 551 0 obj << /Title 552 0 R /A 549 0 R /Parent 535 0 R /Prev 547 0 R /Next 555 0 R >> endobj 547 0 obj << /Title 548 0 R /A 545 0 R /Parent 535 0 R /Prev 543 0 R /Next 551 0 R >> endobj 543 0 obj << /Title 544 0 R /A 541 0 R /Parent 535 0 R /Prev 539 0 R /Next 547 0 R >> endobj 539 0 obj << /Title 540 0 R /A 537 0 R /Parent 535 0 R /Next 543 0 R >> endobj 535 0 obj << /Title 536 0 R /A 533 0 R /Parent 263 0 R /Prev 423 0 R /Next 559 0 R /First 539 0 R /Last 555 0 R /Count -5 >> endobj 531 0 obj << /Title 532 0 R /A 529 0 R /Parent 423 0 R /Prev 527 0 R >> endobj 527 0 obj << /Title 528 0 R /A 525 0 R /Parent 423 0 R /Prev 523 0 R /Next 531 0 R >> endobj 523 0 obj << /Title 524 0 R /A 521 0 R /Parent 423 0 R /Prev 519 0 R /Next 527 0 R >> endobj 519 0 obj << /Title 520 0 R /A 517 0 R /Parent 423 0 R /Prev 515 0 R /Next 523 0 R >> endobj 515 0 obj << /Title 516 0 R /A 513 0 R /Parent 423 0 R /Prev 511 0 R /Next 519 0 R >> endobj 511 0 obj << /Title 512 0 R /A 509 0 R /Parent 423 0 R /Prev 507 0 R /Next 515 0 R >> endobj 507 0 obj << /Title 508 0 R /A 505 0 R /Parent 423 0 R /Prev 503 0 R /Next 511 0 R >> endobj 503 0 obj << /Title 504 0 R /A 501 0 R /Parent 423 0 R /Prev 499 0 R /Next 507 0 R >> endobj 499 0 obj << /Title 500 0 R /A 497 0 R /Parent 423 0 R /Prev 495 0 R /Next 503 0 R >> endobj 495 0 obj << /Title 496 0 R /A 493 0 R /Parent 423 0 R /Prev 491 0 R /Next 499 0 R >> endobj 491 0 obj << /Title 492 0 R /A 489 0 R /Parent 423 0 R /Prev 487 0 R /Next 495 0 R >> endobj 487 0 obj << /Title 488 0 R /A 485 0 R /Parent 423 0 R /Prev 483 0 R /Next 491 0 R >> endobj 483 0 obj << /Title 484 0 R /A 481 0 R /Parent 423 0 R /Prev 479 0 R /Next 487 0 R >> endobj 479 0 obj << /Title 480 0 R /A 477 0 R /Parent 423 0 R /Prev 475 0 R /Next 483 0 R >> endobj 475 0 obj << /Title 476 0 R /A 473 0 R /Parent 423 0 R /Prev 471 0 R /Next 479 0 R >> endobj 471 0 obj << /Title 472 0 R /A 469 0 R /Parent 423 0 R /Prev 467 0 R /Next 475 0 R >> endobj 467 0 obj << /Title 468 0 R /A 465 0 R /Parent 423 0 R /Prev 463 0 R /Next 471 0 R >> endobj 463 0 obj << /Title 464 0 R /A 461 0 R /Parent 423 0 R /Prev 459 0 R /Next 467 0 R >> endobj 459 0 obj << /Title 460 0 R /A 457 0 R /Parent 423 0 R /Prev 455 0 R /Next 463 0 R >> endobj 455 0 obj << /Title 456 0 R /A 453 0 R /Parent 423 0 R /Prev 451 0 R /Next 459 0 R >> endobj 451 0 obj << /Title 452 0 R /A 449 0 R /Parent 423 0 R /Prev 447 0 R /Next 455 0 R >> endobj 447 0 obj << /Title 448 0 R /A 445 0 R /Parent 423 0 R /Prev 443 0 R /Next 451 0 R >> endobj 443 0 obj << /Title 444 0 R /A 441 0 R /Parent 423 0 R /Prev 439 0 R /Next 447 0 R >> endobj 439 0 obj << /Title 440 0 R /A 437 0 R /Parent 423 0 R /Prev 435 0 R /Next 443 0 R >> endobj 435 0 obj << /Title 436 0 R /A 433 0 R /Parent 423 0 R /Prev 431 0 R /Next 439 0 R >> endobj 431 0 obj << /Title 432 0 R /A 429 0 R /Parent 423 0 R /Prev 427 0 R /Next 435 0 R >> endobj 427 0 obj << /Title 428 0 R /A 425 0 R /Parent 423 0 R /Next 431 0 R >> endobj 423 0 obj << /Title 424 0 R /A 421 0 R /Parent 263 0 R /Prev 407 0 R /Next 535 0 R /First 427 0 R /Last 531 0 R /Count -27 >> endobj 419 0 obj << /Title 420 0 R /A 417 0 R /Parent 407 0 R /Prev 415 0 R >> endobj 415 0 obj << /Title 416 0 R /A 413 0 R /Parent 407 0 R /Prev 411 0 R /Next 419 0 R >> endobj 411 0 obj << /Title 412 0 R /A 409 0 R /Parent 407 0 R /Next 415 0 R >> endobj 407 0 obj << /Title 408 0 R /A 405 0 R /Parent 263 0 R /Prev 395 0 R /Next 423 0 R /First 411 0 R /Last 419 0 R /Count -3 >> endobj 403 0 obj << /Title 404 0 R /A 401 0 R /Parent 395 0 R /Prev 399 0 R >> endobj 399 0 obj << /Title 400 0 R /A 397 0 R /Parent 395 0 R /Next 403 0 R >> endobj 395 0 obj << /Title 396 0 R /A 393 0 R /Parent 263 0 R /Prev 367 0 R /Next 407 0 R /First 399 0 R /Last 403 0 R /Count -2 >> endobj 391 0 obj << /Title 392 0 R /A 389 0 R /Parent 367 0 R /Prev 387 0 R >> endobj 387 0 obj << /Title 388 0 R /A 385 0 R /Parent 367 0 R /Prev 383 0 R /Next 391 0 R >> endobj 383 0 obj << /Title 384 0 R /A 381 0 R /Parent 367 0 R /Prev 379 0 R /Next 387 0 R >> endobj 379 0 obj << /Title 380 0 R /A 377 0 R /Parent 367 0 R /Prev 375 0 R /Next 383 0 R >> endobj 375 0 obj << /Title 376 0 R /A 373 0 R /Parent 367 0 R /Prev 371 0 R /Next 379 0 R >> endobj 371 0 obj << /Title 372 0 R /A 369 0 R /Parent 367 0 R /Next 375 0 R >> endobj 367 0 obj << /Title 368 0 R /A 365 0 R /Parent 263 0 R /Prev 351 0 R /Next 395 0 R /First 371 0 R /Last 391 0 R /Count -6 >> endobj 363 0 obj << /Title 364 0 R /A 361 0 R /Parent 351 0 R /Prev 359 0 R >> endobj 359 0 obj << /Title 360 0 R /A 357 0 R /Parent 351 0 R /Prev 355 0 R /Next 363 0 R >> endobj 355 0 obj << /Title 356 0 R /A 353 0 R /Parent 351 0 R /Next 359 0 R >> endobj 351 0 obj << /Title 352 0 R /A 349 0 R /Parent 263 0 R /Prev 331 0 R /Next 367 0 R /First 355 0 R /Last 363 0 R /Count -3 >> endobj 347 0 obj << /Title 348 0 R /A 345 0 R /Parent 331 0 R /Prev 343 0 R >> endobj 343 0 obj << /Title 344 0 R /A 341 0 R /Parent 331 0 R /Prev 339 0 R /Next 347 0 R >> endobj 339 0 obj << /Title 340 0 R /A 337 0 R /Parent 331 0 R /Prev 335 0 R /Next 343 0 R >> endobj 335 0 obj << /Title 336 0 R /A 333 0 R /Parent 331 0 R /Next 339 0 R >> endobj 331 0 obj << /Title 332 0 R /A 329 0 R /Parent 263 0 R /Prev 307 0 R /Next 351 0 R /First 335 0 R /Last 347 0 R /Count -4 >> endobj 327 0 obj << /Title 328 0 R /A 325 0 R /Parent 307 0 R /Prev 323 0 R >> endobj 323 0 obj << /Title 324 0 R /A 321 0 R /Parent 307 0 R /Prev 319 0 R /Next 327 0 R >> endobj 319 0 obj << /Title 320 0 R /A 317 0 R /Parent 307 0 R /Prev 315 0 R /Next 323 0 R >> endobj 315 0 obj << /Title 316 0 R /A 313 0 R /Parent 307 0 R /Prev 311 0 R /Next 319 0 R >> endobj 311 0 obj << /Title 312 0 R /A 309 0 R /Parent 307 0 R /Next 315 0 R >> endobj 307 0 obj << /Title 308 0 R /A 305 0 R /Parent 263 0 R /Prev 291 0 R /Next 331 0 R /First 311 0 R /Last 327 0 R /Count -5 >> endobj 303 0 obj << /Title 304 0 R /A 301 0 R /Parent 291 0 R /Prev 299 0 R >> endobj 299 0 obj << /Title 300 0 R /A 297 0 R /Parent 291 0 R /Prev 295 0 R /Next 303 0 R >> endobj 295 0 obj << /Title 296 0 R /A 293 0 R /Parent 291 0 R /Next 299 0 R >> endobj 291 0 obj << /Title 292 0 R /A 289 0 R /Parent 263 0 R /Prev 275 0 R /Next 307 0 R /First 295 0 R /Last 303 0 R /Count -3 >> endobj 287 0 obj << /Title 288 0 R /A 285 0 R /Parent 275 0 R /Prev 283 0 R >> endobj 283 0 obj << /Title 284 0 R /A 281 0 R /Parent 275 0 R /Prev 279 0 R /Next 287 0 R >> endobj 279 0 obj << /Title 280 0 R /A 277 0 R /Parent 275 0 R /Next 283 0 R >> endobj 275 0 obj << /Title 276 0 R /A 273 0 R /Parent 263 0 R /Prev 267 0 R /Next 291 0 R /First 279 0 R /Last 287 0 R /Count -3 >> endobj 271 0 obj << /Title 272 0 R /A 269 0 R /Parent 267 0 R >> endobj 267 0 obj << /Title 268 0 R /A 265 0 R /Parent 263 0 R /Next 275 0 R /First 271 0 R /Last 271 0 R /Count -1 >> endobj 263 0 obj << /Title 264 0 R /A 261 0 R /Parent 4812 0 R /Prev 179 0 R /Next 1227 0 R /First 267 0 R /Last 1151 0 R /Count -30 >> endobj 259 0 obj << /Title 260 0 R /A 257 0 R /Parent 243 0 R /Prev 255 0 R >> endobj 255 0 obj << /Title 256 0 R /A 253 0 R /Parent 243 0 R /Prev 251 0 R /Next 259 0 R >> endobj 251 0 obj << /Title 252 0 R /A 249 0 R /Parent 243 0 R /Prev 247 0 R /Next 255 0 R >> endobj 247 0 obj << /Title 248 0 R /A 245 0 R /Parent 243 0 R /Next 251 0 R >> endobj 243 0 obj << /Title 244 0 R /A 241 0 R /Parent 179 0 R /Prev 183 0 R /First 247 0 R /Last 259 0 R /Count -4 >> endobj 239 0 obj << /Title 240 0 R /A 237 0 R /Parent 183 0 R /Prev 235 0 R >> endobj 235 0 obj << /Title 236 0 R /A 233 0 R /Parent 183 0 R /Prev 231 0 R /Next 239 0 R >> endobj 231 0 obj << /Title 232 0 R /A 229 0 R /Parent 183 0 R /Prev 227 0 R /Next 235 0 R >> endobj 227 0 obj << /Title 228 0 R /A 225 0 R /Parent 183 0 R /Prev 223 0 R /Next 231 0 R >> endobj 223 0 obj << /Title 224 0 R /A 221 0 R /Parent 183 0 R /Prev 219 0 R /Next 227 0 R >> endobj 219 0 obj << /Title 220 0 R /A 217 0 R /Parent 183 0 R /Prev 215 0 R /Next 223 0 R >> endobj 215 0 obj << /Title 216 0 R /A 213 0 R /Parent 183 0 R /Prev 211 0 R /Next 219 0 R >> endobj 211 0 obj << /Title 212 0 R /A 209 0 R /Parent 183 0 R /Prev 207 0 R /Next 215 0 R >> endobj 207 0 obj << /Title 208 0 R /A 205 0 R /Parent 183 0 R /Prev 203 0 R /Next 211 0 R >> endobj 203 0 obj << /Title 204 0 R /A 201 0 R /Parent 183 0 R /Prev 199 0 R /Next 207 0 R >> endobj 199 0 obj << /Title 200 0 R /A 197 0 R /Parent 183 0 R /Prev 195 0 R /Next 203 0 R >> endobj 195 0 obj << /Title 196 0 R /A 193 0 R /Parent 183 0 R /Prev 191 0 R /Next 199 0 R >> endobj 191 0 obj << /Title 192 0 R /A 189 0 R /Parent 183 0 R /Prev 187 0 R /Next 195 0 R >> endobj 187 0 obj << /Title 188 0 R /A 185 0 R /Parent 183 0 R /Next 191 0 R >> endobj 183 0 obj << /Title 184 0 R /A 181 0 R /Parent 179 0 R /Next 243 0 R /First 187 0 R /Last 239 0 R /Count -14 >> endobj 179 0 obj << /Title 180 0 R /A 177 0 R /Parent 4812 0 R /Prev 119 0 R /Next 263 0 R /First 183 0 R /Last 243 0 R /Count -2 >> endobj 175 0 obj << /Title 176 0 R /A 173 0 R /Parent 131 0 R /Prev 171 0 R >> endobj 171 0 obj << /Title 172 0 R /A 169 0 R /Parent 131 0 R /Prev 167 0 R /Next 175 0 R >> endobj 167 0 obj << /Title 168 0 R /A 165 0 R /Parent 131 0 R /Prev 163 0 R /Next 171 0 R >> endobj 163 0 obj << /Title 164 0 R /A 161 0 R /Parent 131 0 R /Prev 159 0 R /Next 167 0 R >> endobj 159 0 obj << /Title 160 0 R /A 157 0 R /Parent 131 0 R /Prev 155 0 R /Next 163 0 R >> endobj 155 0 obj << /Title 156 0 R /A 153 0 R /Parent 131 0 R /Prev 151 0 R /Next 159 0 R >> endobj 151 0 obj << /Title 152 0 R /A 149 0 R /Parent 131 0 R /Prev 147 0 R /Next 155 0 R >> endobj 147 0 obj << /Title 148 0 R /A 145 0 R /Parent 131 0 R /Prev 143 0 R /Next 151 0 R >> endobj 143 0 obj << /Title 144 0 R /A 141 0 R /Parent 131 0 R /Prev 139 0 R /Next 147 0 R >> endobj 139 0 obj << /Title 140 0 R /A 137 0 R /Parent 131 0 R /Prev 135 0 R /Next 143 0 R >> endobj 135 0 obj << /Title 136 0 R /A 133 0 R /Parent 131 0 R /Next 139 0 R >> endobj 131 0 obj << /Title 132 0 R /A 129 0 R /Parent 119 0 R /Prev 127 0 R /First 135 0 R /Last 175 0 R /Count -11 >> endobj 127 0 obj << /Title 128 0 R /A 125 0 R /Parent 119 0 R /Prev 123 0 R /Next 131 0 R >> endobj 123 0 obj << /Title 124 0 R /A 121 0 R /Parent 119 0 R /Next 127 0 R >> endobj 119 0 obj << /Title 120 0 R /A 117 0 R /Parent 4812 0 R /Prev 79 0 R /Next 179 0 R /First 123 0 R /Last 131 0 R /Count -3 >> endobj 115 0 obj << /Title 116 0 R /A 113 0 R /Parent 79 0 R /Prev 111 0 R >> endobj 111 0 obj << /Title 112 0 R /A 109 0 R /Parent 79 0 R /Prev 107 0 R /Next 115 0 R >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R /Parent 79 0 R /Prev 91 0 R /Next 111 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R /Parent 91 0 R /Prev 99 0 R >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R /Parent 91 0 R /Prev 95 0 R /Next 103 0 R >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R /Parent 91 0 R /Next 99 0 R >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R /Parent 79 0 R /Prev 87 0 R /Next 107 0 R /First 95 0 R /Last 103 0 R /Count -3 >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R /Parent 79 0 R /Prev 83 0 R /Next 91 0 R >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R /Parent 79 0 R /Next 87 0 R >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R /Parent 4812 0 R /Prev 15 0 R /Next 119 0 R /First 83 0 R /Last 115 0 R /Count -6 >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R /Parent 51 0 R /Prev 71 0 R >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R /Parent 51 0 R /Prev 67 0 R /Next 75 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R /Parent 51 0 R /Prev 63 0 R /Next 71 0 R >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R /Parent 51 0 R /Prev 59 0 R /Next 67 0 R >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R /Parent 51 0 R /Prev 55 0 R /Next 63 0 R >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R /Parent 51 0 R /Next 59 0 R >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R /Parent 15 0 R /Prev 47 0 R /First 55 0 R /Last 75 0 R /Count -6 >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R /Parent 15 0 R /Prev 23 0 R /Next 51 0 R >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 23 0 R /Prev 39 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 23 0 R /Prev 35 0 R /Next 43 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 23 0 R /Prev 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 23 0 R /Prev 27 0 R /Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 23 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 15 0 R /Prev 19 0 R /Next 47 0 R /First 27 0 R /Last 43 0 R /Count -5 >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 4812 0 R /Prev 11 0 R /Next 79 0 R /First 19 0 R /Last 51 0 R /Count -4 >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 4812 0 R /Prev 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 4812 0 R /Next 11 0 R >> endobj 4813 0 obj << /Names [(Doc-Start) 1533 0 R (cite.Ait-Kaci91) 2042 0 R (cite.Clock) 2234 0 R (cite.Jaffar-Lassez87) 3455 0 R (cite.Warren83) 2041 0 R (cite.gnu-prolog) 2040 0 R (cite.iso-part1) 2043 0 R (cite.long-clp-fd) 2045 0 R (cite.pvh89) 3456 0 R (cite.wamcc) 2044 0 R (page.1) 1532 0 R (page.10) 2023 0 R (page.100) 2890 0 R (page.101) 2896 0 R (page.102) 2901 0 R (page.103) 2905 0 R (page.104) 2921 0 R (page.105) 2943 0 R (page.106) 2963 0 R (page.107) 2979 0 R (page.108) 2994 0 R (page.109) 2998 0 R (page.11) 2027 0 R (page.110) 3014 0 R (page.111) 3018 0 R (page.112) 3026 0 R (page.113) 3032 0 R (page.114) 3043 0 R (page.115) 3047 0 R (page.116) 3051 0 R (page.117) 3055 0 R (page.118) 3059 0 R (page.119) 3069 0 R (page.12) 2049 0 R (page.120) 3078 0 R (page.121) 3086 0 R (page.122) 3090 0 R (page.123) 3096 0 R (page.124) 3100 0 R (page.125) 3104 0 R (page.126) 3113 0 R (page.127) 3119 0 R (page.128) 3127 0 R (page.129) 3135 0 R (page.13) 2053 0 R (page.130) 3143 0 R (page.131) 3149 0 R (page.132) 3154 0 R (page.133) 3158 0 R (page.134) 3164 0 R (page.135) 3170 0 R (page.136) 3178 0 R (page.137) 3204 0 R (page.138) 3217 0 R (page.139) 3223 0 R (page.14) 2071 0 R (page.140) 3227 0 R (page.141) 3231 0 R (page.142) 3235 0 R (page.143) 3241 0 R (page.144) 3250 0 R (page.145) 3258 0 R (page.146) 3268 0 R (page.147) 3278 0 R (page.148) 3288 0 R (page.149) 3302 0 R (page.15) 2081 0 R (page.150) 3313 0 R (page.151) 3323 0 R (page.152) 3329 0 R (page.153) 3335 0 R (page.154) 3345 0 R (page.155) 3355 0 R (page.156) 3364 0 R (page.157) 3370 0 R (page.158) 3382 0 R (page.159) 3400 0 R (page.16) 2088 0 R (page.160) 3412 0 R (page.161) 3420 0 R (page.162) 3429 0 R (page.163) 3435 0 R (page.164) 3441 0 R (page.165) 3445 0 R (page.166) 3460 0 R (page.167) 3466 0 R (page.168) 3475 0 R (page.169) 3479 0 R (page.17) 2104 0 R (page.170) 3483 0 R (page.171) 3493 0 R (page.172) 3499 0 R (page.173) 3519 0 R (page.174) 3536 0 R (page.175) 3544 0 R (page.176) 3556 0 R (page.177) 3562 0 R (page.178) 3568 0 R (page.179) 3574 0 R (page.18) 2127 0 R (page.180) 3579 0 R (page.181) 3587 0 R (page.182) 3591 0 R (page.183) 3595 0 R (page.184) 3605 0 R (page.185) 3613 0 R (page.186) 3622 0 R (page.187) 3632 0 R (page.188) 3636 0 R (page.189) 3640 0 R (page.19) 2133 0 R (page.190) 3646 0 R (page.191) 3656 0 R (page.192) 3665 0 R (page.193) 3673 0 R (page.194) 3685 0 R (page.195) 3695 0 R (page.196) 3701 0 R (page.197) 3721 0 R (page.198) 3734 0 R (page.199) 3748 0 R (page.2) 1545 0 R (page.20) 2140 0 R (page.200) 3760 0 R (page.201) 3766 0 R (page.202) 3770 0 R (page.203) 3774 0 R (page.204) 3788 0 R (page.205) 3792 0 R (page.206) 3796 0 R (page.207) 3800 0 R (page.208) 3805 0 R (page.209) 3809 0 R (page.21) 2152 0 R (page.210) 3932 0 R (page.211) 4088 0 R (page.212) 4222 0 R (page.213) 4372 0 R (page.214) 4543 0 R (page.215) 4705 0 R (page.22) 2166 0 R (page.23) 2173 0 R (page.24) 2180 0 R (page.25) 2194 0 R (page.26) 2206 0 R (page.27) 2214 0 R (page.28) 2218 0 R (page.29) 2223 0 R (page.3) 1673 0 R (page.30) 2238 0 R (page.31) 2248 0 R (page.32) 2258 0 R (page.33) 2290 0 R (page.34) 2296 0 R (page.35) 2300 0 R (page.36) 2309 0 R (page.37) 2345 0 R (page.38) 2362 0 R (page.39) 2370 0 R (page.4) 1734 0 R (page.40) 2380 0 R (page.41) 2392 0 R (page.42) 2401 0 R (page.43) 2405 0 R (page.44) 2415 0 R (page.45) 2425 0 R (page.46) 2439 0 R (page.47) 2445 0 R (page.48) 2458 0 R (page.49) 2470 0 R (page.5) 1795 0 R (page.50) 2474 0 R (page.51) 2480 0 R (page.52) 2490 0 R (page.53) 2498 0 R (page.54) 2507 0 R (page.55) 2513 0 R (page.56) 2523 0 R (page.57) 2535 0 R (page.58) 2539 0 R (page.59) 2543 0 R (page.6) 1857 0 R (page.60) 2556 0 R (page.61) 2570 0 R (page.62) 2580 0 R (page.63) 2594 0 R (page.64) 2602 0 R (page.65) 2612 0 R (page.66) 2619 0 R (page.67) 2627 0 R (page.68) 2645 0 R (page.69) 2669 0 R (page.7) 1917 0 R (page.70) 2673 0 R (page.71) 2679 0 R (page.72) 2684 0 R (page.73) 2690 0 R (page.74) 2696 0 R (page.75) 2702 0 R (page.76) 2712 0 R (page.77) 2716 0 R (page.78) 2721 0 R (page.79) 2729 0 R (page.8) 1977 0 R (page.80) 2737 0 R (page.81) 2743 0 R (page.82) 2755 0 R (page.83) 2763 0 R (page.84) 2770 0 R (page.85) 2776 0 R (page.86) 2782 0 R (page.87) 2790 0 R (page.88) 2794 0 R (page.89) 2800 0 R (page.9) 1999 0 R (page.90) 2805 0 R (page.91) 2811 0 R (page.92) 2823 0 R (page.93) 2831 0 R (page.94) 2837 0 R (page.95) 2845 0 R (page.96) 2858 0 R (page.97) 2862 0 R (page.98) 2866 0 R (page.99) 2878 0 R (section*.1) 1553 0 R (section*.2) 3801 0 R (section*.3) 1525 0 R (section.1) 6 0 R (section.2) 10 0 R (section.3) 14 0 R (section.4) 78 0 R (section.5) 118 0 R (section.6) 178 0 R (section.7) 262 0 R (section.8) 1226 0 R (section.9) 1362 0 R (subsection.3.1) 18 0 R (subsection.3.2) 22 0 R (subsection.3.3) 46 0 R (subsection.3.4) 50 0 R (subsection.4.1) 82 0 R (subsection.4.2) 86 0 R (subsection.4.3) 90 0 R (subsection.4.4) 106 0 R (subsection.4.5) 110 0 R (subsection.4.6) 114 0 R (subsection.5.1) 122 0 R (subsection.5.2) 126 0 R (subsection.5.3) 130 0 R (subsection.6.1) 182 0 R (subsection.6.2) 242 0 R (subsection.7.1) 266 0 R (subsection.7.10) 422 0 R (subsection.7.11) 534 0 R (subsection.7.12) 558 0 R (subsection.7.13) 582 0 R (subsection.7.14) 602 0 R (subsection.7.15) 658 0 R (subsection.7.16) 686 0 R (subsection.7.17) 714 0 R (subsection.7.18) 730 0 R (subsection.7.19) 750 0 R (subsection.7.2) 274 0 R (subsection.7.20) 802 0 R (subsection.7.21) 854 0 R (subsection.7.22) 886 0 R (subsection.7.23) 910 0 R (subsection.7.24) 926 0 R (subsection.7.25) 938 0 R (subsection.7.26) 958 0 R (subsection.7.27) 974 0 R (subsection.7.28) 1094 0 R (subsection.7.29) 1130 0 R (subsection.7.3) 290 0 R (subsection.7.30) 1150 0 R (subsection.7.4) 306 0 R (subsection.7.5) 330 0 R (subsection.7.6) 350 0 R (subsection.7.7) 366 0 R (subsection.7.8) 394 0 R (subsection.7.9) 406 0 R (subsection.8.1) 1230 0 R (subsection.8.10) 1354 0 R (subsection.8.2) 1238 0 R (subsection.8.3) 1254 0 R (subsection.8.4) 1266 0 R (subsection.8.5) 1274 0 R (subsection.8.6) 1286 0 R (subsection.8.7) 1306 0 R (subsection.8.8) 1322 0 R (subsection.8.9) 1346 0 R (subsection.9.1) 1366 0 R (subsection.9.2) 1410 0 R (subsection.9.3) 1450 0 R (subsection.9.4) 1498 0 R (subsection.9.5) 1514 0 R (subsubsection.3.2.1) 26 0 R (subsubsection.3.2.2) 30 0 R (subsubsection.3.2.3) 34 0 R (subsubsection.3.2.4) 38 0 R (subsubsection.3.2.5) 42 0 R (subsubsection.3.4.1) 54 0 R (subsubsection.3.4.2) 58 0 R (subsubsection.3.4.3) 62 0 R (subsubsection.3.4.4) 66 0 R (subsubsection.3.4.5) 70 0 R (subsubsection.3.4.6) 74 0 R (subsubsection.4.3.1) 94 0 R (subsubsection.4.3.2) 98 0 R (subsubsection.4.3.3) 102 0 R (subsubsection.5.3.1) 134 0 R (subsubsection.5.3.10) 170 0 R (subsubsection.5.3.11) 174 0 R (subsubsection.5.3.2) 138 0 R (subsubsection.5.3.3) 142 0 R (subsubsection.5.3.4) 146 0 R (subsubsection.5.3.5) 150 0 R (subsubsection.5.3.6) 154 0 R (subsubsection.5.3.7) 158 0 R (subsubsection.5.3.8) 162 0 R (subsubsection.5.3.9) 166 0 R (subsubsection.6.1.1) 186 0 R (subsubsection.6.1.10) 222 0 R (subsubsection.6.1.11) 226 0 R (subsubsection.6.1.12) 230 0 R (subsubsection.6.1.13) 234 0 R (subsubsection.6.1.14) 238 0 R (subsubsection.6.1.2) 190 0 R (subsubsection.6.1.3) 194 0 R (subsubsection.6.1.4) 198 0 R (subsubsection.6.1.5) 202 0 R (subsubsection.6.1.6) 206 0 R (subsubsection.6.1.7) 210 0 R (subsubsection.6.1.8) 214 0 R (subsubsection.6.1.9) 218 0 R (subsubsection.6.2.1) 246 0 R (subsubsection.6.2.2) 250 0 R (subsubsection.6.2.3) 254 0 R (subsubsection.6.2.4) 258 0 R (subsubsection.7.1.1) 270 0 R (subsubsection.7.10.1) 426 0 R (subsubsection.7.10.10) 462 0 R (subsubsection.7.10.11) 466 0 R (subsubsection.7.10.12) 470 0 R (subsubsection.7.10.13) 474 0 R (subsubsection.7.10.14) 478 0 R (subsubsection.7.10.15) 482 0 R (subsubsection.7.10.16) 486 0 R (subsubsection.7.10.17) 490 0 R (subsubsection.7.10.18) 494 0 R (subsubsection.7.10.19) 498 0 R (subsubsection.7.10.2) 430 0 R (subsubsection.7.10.20) 502 0 R (subsubsection.7.10.21) 506 0 R (subsubsection.7.10.22) 510 0 R (subsubsection.7.10.23) 514 0 R (subsubsection.7.10.24) 518 0 R (subsubsection.7.10.25) 522 0 R (subsubsection.7.10.26) 526 0 R (subsubsection.7.10.27) 530 0 R (subsubsection.7.10.3) 434 0 R (subsubsection.7.10.4) 438 0 R (subsubsection.7.10.5) 442 0 R (subsubsection.7.10.6) 446 0 R (subsubsection.7.10.7) 450 0 R (subsubsection.7.10.8) 454 0 R (subsubsection.7.10.9) 458 0 R (subsubsection.7.11.1) 538 0 R (subsubsection.7.11.2) 542 0 R (subsubsection.7.11.3) 546 0 R (subsubsection.7.11.4) 550 0 R (subsubsection.7.11.5) 554 0 R (subsubsection.7.12.1) 562 0 R (subsubsection.7.12.2) 566 0 R (subsubsection.7.12.3) 570 0 R (subsubsection.7.12.4) 574 0 R (subsubsection.7.12.5) 578 0 R (subsubsection.7.13.1) 586 0 R (subsubsection.7.13.2) 590 0 R (subsubsection.7.13.3) 594 0 R (subsubsection.7.13.4) 598 0 R (subsubsection.7.14.1) 606 0 R (subsubsection.7.14.10) 642 0 R (subsubsection.7.14.11) 646 0 R (subsubsection.7.14.12) 650 0 R (subsubsection.7.14.13) 654 0 R (subsubsection.7.14.2) 610 0 R (subsubsection.7.14.3) 614 0 R (subsubsection.7.14.4) 618 0 R (subsubsection.7.14.5) 622 0 R (subsubsection.7.14.6) 626 0 R (subsubsection.7.14.7) 630 0 R (subsubsection.7.14.8) 634 0 R (subsubsection.7.14.9) 638 0 R (subsubsection.7.15.1) 662 0 R (subsubsection.7.15.2) 666 0 R (subsubsection.7.15.3) 670 0 R (subsubsection.7.15.4) 674 0 R (subsubsection.7.15.5) 678 0 R (subsubsection.7.15.6) 682 0 R (subsubsection.7.16.1) 690 0 R (subsubsection.7.16.2) 694 0 R (subsubsection.7.16.3) 698 0 R (subsubsection.7.16.4) 702 0 R (subsubsection.7.16.5) 706 0 R (subsubsection.7.16.6) 710 0 R (subsubsection.7.17.1) 718 0 R (subsubsection.7.17.2) 722 0 R (subsubsection.7.17.3) 726 0 R (subsubsection.7.18.1) 734 0 R (subsubsection.7.18.2) 738 0 R (subsubsection.7.18.3) 742 0 R (subsubsection.7.18.4) 746 0 R (subsubsection.7.19.1) 754 0 R (subsubsection.7.19.10) 790 0 R (subsubsection.7.19.11) 794 0 R (subsubsection.7.19.12) 798 0 R (subsubsection.7.19.2) 758 0 R (subsubsection.7.19.3) 762 0 R (subsubsection.7.19.4) 766 0 R (subsubsection.7.19.5) 770 0 R (subsubsection.7.19.6) 774 0 R (subsubsection.7.19.7) 778 0 R (subsubsection.7.19.8) 782 0 R (subsubsection.7.19.9) 786 0 R (subsubsection.7.2.1) 278 0 R (subsubsection.7.2.2) 282 0 R (subsubsection.7.2.3) 286 0 R (subsubsection.7.20.1) 806 0 R (subsubsection.7.20.10) 842 0 R (subsubsection.7.20.11) 846 0 R (subsubsection.7.20.12) 850 0 R (subsubsection.7.20.2) 810 0 R (subsubsection.7.20.3) 814 0 R (subsubsection.7.20.4) 818 0 R (subsubsection.7.20.5) 822 0 R (subsubsection.7.20.6) 826 0 R (subsubsection.7.20.7) 830 0 R (subsubsection.7.20.8) 834 0 R (subsubsection.7.20.9) 838 0 R (subsubsection.7.21.1) 858 0 R (subsubsection.7.21.2) 862 0 R (subsubsection.7.21.3) 866 0 R (subsubsection.7.21.4) 870 0 R (subsubsection.7.21.5) 874 0 R (subsubsection.7.21.6) 878 0 R (subsubsection.7.21.7) 882 0 R (subsubsection.7.22.1) 890 0 R (subsubsection.7.22.2) 894 0 R (subsubsection.7.22.3) 898 0 R (subsubsection.7.22.4) 902 0 R (subsubsection.7.22.5) 906 0 R (subsubsection.7.23.1) 914 0 R (subsubsection.7.23.2) 918 0 R (subsubsection.7.23.3) 922 0 R (subsubsection.7.24.1) 930 0 R (subsubsection.7.24.2) 934 0 R (subsubsection.7.25.1) 942 0 R (subsubsection.7.25.2) 946 0 R (subsubsection.7.25.3) 950 0 R (subsubsection.7.25.4) 954 0 R (subsubsection.7.26.1) 962 0 R (subsubsection.7.26.2) 966 0 R (subsubsection.7.26.3) 970 0 R (subsubsection.7.27.1) 978 0 R (subsubsection.7.27.10) 1014 0 R (subsubsection.7.27.11) 1018 0 R (subsubsection.7.27.12) 1022 0 R (subsubsection.7.27.13) 1026 0 R (subsubsection.7.27.14) 1030 0 R (subsubsection.7.27.15) 1034 0 R (subsubsection.7.27.16) 1038 0 R (subsubsection.7.27.17) 1042 0 R (subsubsection.7.27.18) 1046 0 R (subsubsection.7.27.19) 1050 0 R (subsubsection.7.27.2) 982 0 R (subsubsection.7.27.20) 1054 0 R (subsubsection.7.27.21) 1058 0 R (subsubsection.7.27.22) 1062 0 R (subsubsection.7.27.23) 1066 0 R (subsubsection.7.27.24) 1070 0 R (subsubsection.7.27.25) 1074 0 R (subsubsection.7.27.26) 1078 0 R (subsubsection.7.27.27) 1082 0 R (subsubsection.7.27.28) 1086 0 R (subsubsection.7.27.29) 1090 0 R (subsubsection.7.27.3) 986 0 R (subsubsection.7.27.4) 990 0 R (subsubsection.7.27.5) 994 0 R (subsubsection.7.27.6) 998 0 R (subsubsection.7.27.7) 1002 0 R (subsubsection.7.27.8) 1006 0 R (subsubsection.7.27.9) 1010 0 R (subsubsection.7.28.1) 1098 0 R (subsubsection.7.28.2) 1102 0 R (subsubsection.7.28.3) 1106 0 R (subsubsection.7.28.4) 1110 0 R (subsubsection.7.28.5) 1114 0 R (subsubsection.7.28.6) 1118 0 R (subsubsection.7.28.7) 1122 0 R (subsubsection.7.28.8) 1126 0 R (subsubsection.7.29.1) 1134 0 R (subsubsection.7.29.2) 1138 0 R (subsubsection.7.29.3) 1142 0 R (subsubsection.7.29.4) 1146 0 R (subsubsection.7.3.1) 294 0 R (subsubsection.7.3.2) 298 0 R (subsubsection.7.3.3) 302 0 R (subsubsection.7.30.1) 1154 0 R (subsubsection.7.30.10) 1190 0 R (subsubsection.7.30.11) 1194 0 R (subsubsection.7.30.12) 1198 0 R (subsubsection.7.30.13) 1202 0 R (subsubsection.7.30.14) 1206 0 R (subsubsection.7.30.15) 1210 0 R (subsubsection.7.30.16) 1214 0 R (subsubsection.7.30.17) 1218 0 R (subsubsection.7.30.18) 1222 0 R (subsubsection.7.30.2) 1158 0 R (subsubsection.7.30.3) 1162 0 R (subsubsection.7.30.4) 1166 0 R (subsubsection.7.30.5) 1170 0 R (subsubsection.7.30.6) 1174 0 R (subsubsection.7.30.7) 1178 0 R (subsubsection.7.30.8) 1182 0 R (subsubsection.7.30.9) 1186 0 R (subsubsection.7.4.1) 310 0 R (subsubsection.7.4.2) 314 0 R (subsubsection.7.4.3) 318 0 R (subsubsection.7.4.4) 322 0 R (subsubsection.7.4.5) 326 0 R (subsubsection.7.5.1) 334 0 R (subsubsection.7.5.2) 338 0 R (subsubsection.7.5.3) 342 0 R (subsubsection.7.5.4) 346 0 R (subsubsection.7.6.1) 354 0 R (subsubsection.7.6.2) 358 0 R (subsubsection.7.6.3) 362 0 R (subsubsection.7.7.1) 370 0 R (subsubsection.7.7.2) 374 0 R (subsubsection.7.7.3) 378 0 R (subsubsection.7.7.4) 382 0 R (subsubsection.7.7.5) 386 0 R (subsubsection.7.7.6) 390 0 R (subsubsection.7.8.1) 398 0 R (subsubsection.7.8.2) 402 0 R (subsubsection.7.9.1) 410 0 R (subsubsection.7.9.2) 414 0 R (subsubsection.7.9.3) 418 0 R (subsubsection.8.1.1) 1234 0 R (subsubsection.8.10.1) 1358 0 R (subsubsection.8.2.1) 1242 0 R (subsubsection.8.2.2) 1246 0 R (subsubsection.8.2.3) 1250 0 R (subsubsection.8.3.1) 1258 0 R (subsubsection.8.3.2) 1262 0 R (subsubsection.8.4.1) 1270 0 R (subsubsection.8.5.1) 1278 0 R (subsubsection.8.5.2) 1282 0 R (subsubsection.8.6.1) 1290 0 R (subsubsection.8.6.2) 1294 0 R (subsubsection.8.6.3) 1298 0 R (subsubsection.8.6.4) 1302 0 R (subsubsection.8.7.1) 1310 0 R (subsubsection.8.7.2) 1314 0 R (subsubsection.8.7.3) 1318 0 R (subsubsection.8.8.1) 1326 0 R (subsubsection.8.8.2) 1330 0 R (subsubsection.8.8.3) 1334 0 R (subsubsection.8.8.4) 1338 0 R (subsubsection.8.8.5) 1342 0 R (subsubsection.8.9.1) 1350 0 R (subsubsection.9.1.1) 1370 0 R (subsubsection.9.1.10) 1406 0 R (subsubsection.9.1.2) 1374 0 R (subsubsection.9.1.3) 1378 0 R (subsubsection.9.1.4) 1382 0 R (subsubsection.9.1.5) 1386 0 R (subsubsection.9.1.6) 1390 0 R (subsubsection.9.1.7) 1394 0 R (subsubsection.9.1.8) 1398 0 R (subsubsection.9.1.9) 1402 0 R (subsubsection.9.2.1) 1414 0 R (subsubsection.9.2.2) 1418 0 R (subsubsection.9.2.3) 1422 0 R (subsubsection.9.2.4) 1426 0 R (subsubsection.9.2.5) 1430 0 R (subsubsection.9.2.6) 1434 0 R (subsubsection.9.2.7) 1438 0 R (subsubsection.9.2.8) 1442 0 R (subsubsection.9.2.9) 1446 0 R (subsubsection.9.3.1) 1454 0 R (subsubsection.9.3.10) 1490 0 R (subsubsection.9.3.11) 1494 0 R (subsubsection.9.3.2) 1458 0 R (subsubsection.9.3.3) 1462 0 R (subsubsection.9.3.4) 1466 0 R (subsubsection.9.3.5) 1470 0 R (subsubsection.9.3.6) 1474 0 R (subsubsection.9.3.7) 1478 0 R (subsubsection.9.3.8) 1482 0 R (subsubsection.9.3.9) 1486 0 R (subsubsection.9.4.1) 1502 0 R (subsubsection.9.4.2) 1506 0 R (subsubsection.9.4.3) 1510 0 R (subsubsection.9.5.1) 1518 0 R] /Limits [(Doc-Start) (subsubsection.9.5.1)] >> endobj 4814 0 obj << /Kids [4813 0 R] >> endobj 4815 0 obj << /Dests 4814 0 R >> endobj 4816 0 obj << /Type /Catalog /Pages 4811 0 R /Outlines 4812 0 R /Names 4815 0 R /PageMode /UseOutlines /OpenAction 1528 0 R >> endobj 4817 0 obj << /Author(Daniel Diaz)/Title(GNU-Prolog Manual)/Subject(GNU-Prolog Manual)/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords(GNU-Prolog, Prolog, Finite Domain Constraints) /CreationDate (D:20070104112532+01'00') /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref 0 4818 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000000 00000 f 0000000009 00000 n 0000145854 00000 n 0001295957 00000 n 0000000054 00000 n 0000000088 00000 n 0000152393 00000 n 0001295870 00000 n 0000000133 00000 n 0000000164 00000 n 0000158883 00000 n 0001295744 00000 n 0000000210 00000 n 0000000245 00000 n 0000158946 00000 n 0001295670 00000 n 0000000296 00000 n 0000000327 00000 n 0000159008 00000 n 0001295546 00000 n 0000000378 00000 n 0000000435 00000 n 0000159071 00000 n 0001295472 00000 n 0000000491 00000 n 0000000554 00000 n 0000163899 00000 n 0001295385 00000 n 0000000610 00000 n 0000000680 00000 n 0000172507 00000 n 0001295298 00000 n 0000000736 00000 n 0000000782 00000 n 0000179458 00000 n 0001295211 00000 n 0000000838 00000 n 0000000877 00000 n 0000184904 00000 n 0001295137 00000 n 0000000933 00000 n 0000000967 00000 n 0000189905 00000 n 0001295050 00000 n 0000001018 00000 n 0000001072 00000 n 0000195069 00000 n 0001294939 00000 n 0000001123 00000 n 0000001165 00000 n 0000195132 00000 n 0001294865 00000 n 0000001221 00000 n 0000001264 00000 n 0000195195 00000 n 0001294778 00000 n 0000001320 00000 n 0000001357 00000 n 0000208122 00000 n 0001294691 00000 n 0000001413 00000 n 0000001450 00000 n 0000223724 00000 n 0001294604 00000 n 0000001506 00000 n 0000001546 00000 n 0000223787 00000 n 0001294517 00000 n 0000001602 00000 n 0000001661 00000 n 0000228536 00000 n 0001294443 00000 n 0000001717 00000 n 0000001775 00000 n 0000237665 00000 n 0001294315 00000 n 0000001821 00000 n 0000001849 00000 n 0000237728 00000 n 0001294241 00000 n 0000001900 00000 n 0000001931 00000 n 0000237790 00000 n 0001294154 00000 n 0000001982 00000 n 0000002024 00000 n 0000237853 00000 n 0001294028 00000 n 0000002075 00000 n 0000002114 00000 n 0000237916 00000 n 0001293954 00000 n 0000002170 00000 n 0000002222 00000 n 0000242530 00000 n 0001293865 00000 n 0000002278 00000 n 0000002312 00000 n 0000242592 00000 n 0001293788 00000 n 0000002369 00000 n 0000002399 00000 n 0000246841 00000 n 0001293697 00000 n 0000002451 00000 n 0000002489 00000 n 0000246905 00000 n 0001293605 00000 n 0000002541 00000 n 0000002578 00000 n 0000256854 00000 n 0001293527 00000 n 0000002630 00000 n 0000002666 00000 n 0000263621 00000 n 0001293395 00000 n 0000002713 00000 n 0000002754 00000 n 0000263685 00000 n 0001293316 00000 n 0000002806 00000 n 0000002840 00000 n 0000263749 00000 n 0001293223 00000 n 0000002892 00000 n 0000002927 00000 n 0000279231 00000 n 0001293104 00000 n 0000002979 00000 n 0000003005 00000 n 0000279295 00000 n 0001293025 00000 n 0000003062 00000 n 0000003114 00000 n 0000279359 00000 n 0001292932 00000 n 0000003171 00000 n 0000003210 00000 n 0000283818 00000 n 0001292839 00000 n 0000003267 00000 n 0000003297 00000 n 0000283882 00000 n 0001292746 00000 n 0000003354 00000 n 0000003386 00000 n 0000288214 00000 n 0001292653 00000 n 0000003443 00000 n 0000003478 00000 n 0000288278 00000 n 0001292560 00000 n 0000003535 00000 n 0000003571 00000 n 0000288342 00000 n 0001292467 00000 n 0000003628 00000 n 0000003668 00000 n 0000292828 00000 n 0001292374 00000 n 0000003725 00000 n 0000003761 00000 n 0000292892 00000 n 0001292281 00000 n 0000003818 00000 n 0000003852 00000 n 0000292956 00000 n 0001292188 00000 n 0000003910 00000 n 0000003942 00000 n 0000293020 00000 n 0001292109 00000 n 0000004000 00000 n 0000004032 00000 n 0000296297 00000 n 0001291976 00000 n 0000004079 00000 n 0000004139 00000 n 0000296361 00000 n 0001291857 00000 n 0000004191 00000 n 0000004228 00000 n 0000296424 00000 n 0001291778 00000 n 0000004285 00000 n 0000004317 00000 n 0000296488 00000 n 0001291685 00000 n 0000004374 00000 n 0000004403 00000 n 0000296552 00000 n 0001291592 00000 n 0000004460 00000 n 0000004488 00000 n 0000299471 00000 n 0001291499 00000 n 0000004545 00000 n 0000004576 00000 n 0000299535 00000 n 0001291406 00000 n 0000004633 00000 n 0000004668 00000 n 0000303812 00000 n 0001291313 00000 n 0000004725 00000 n 0000004763 00000 n 0000303876 00000 n 0001291220 00000 n 0000004820 00000 n 0000004910 00000 n 0000307076 00000 n 0001291127 00000 n 0000004967 00000 n 0000004996 00000 n 0000307140 00000 n 0001291034 00000 n 0000005053 00000 n 0000005091 00000 n 0000307204 00000 n 0001290941 00000 n 0000005149 00000 n 0000005173 00000 n 0000307268 00000 n 0001290848 00000 n 0000005231 00000 n 0000005271 00000 n 0000311278 00000 n 0001290755 00000 n 0000005329 00000 n 0000005372 00000 n 0000311341 00000 n 0001290662 00000 n 0000005430 00000 n 0000005466 00000 n 0000311405 00000 n 0001290583 00000 n 0000005524 00000 n 0000005564 00000 n 0000314149 00000 n 0001290465 00000 n 0000005616 00000 n 0000005661 00000 n 0000314212 00000 n 0001290386 00000 n 0000005718 00000 n 0000005757 00000 n 0000314276 00000 n 0001290293 00000 n 0000005814 00000 n 0000005903 00000 n 0000318622 00000 n 0001290200 00000 n 0000005960 00000 n 0000005986 00000 n 0000318686 00000 n 0001290121 00000 n 0000006043 00000 n 0000006079 00000 n 0000325905 00000 n 0001289985 00000 n 0000006126 00000 n 0000006172 00000 n 0000325969 00000 n 0001289867 00000 n 0000006224 00000 n 0000006256 00000 n 0000326032 00000 n 0001289802 00000 n 0000006313 00000 n 0000006484 00000 n 0000328421 00000 n 0001289670 00000 n 0000006536 00000 n 0000006572 00000 n 0000328485 00000 n 0001289591 00000 n 0000006629 00000 n 0000006677 00000 n 0000328549 00000 n 0001289498 00000 n 0000006734 00000 n 0000006788 00000 n 0000328612 00000 n 0001289419 00000 n 0000006845 00000 n 0000006899 00000 n 0000331914 00000 n 0001289287 00000 n 0000006951 00000 n 0000006986 00000 n 0000331978 00000 n 0001289208 00000 n 0000007043 00000 n 0000007095 00000 n 0000332042 00000 n 0001289115 00000 n 0000007152 00000 n 0000007392 00000 n 0000334909 00000 n 0001289036 00000 n 0000007449 00000 n 0000007478 00000 n 0000334973 00000 n 0001288904 00000 n 0000007530 00000 n 0000007565 00000 n 0000335037 00000 n 0001288825 00000 n 0000007622 00000 n 0000007651 00000 n 0000338722 00000 n 0001288732 00000 n 0000007708 00000 n 0000007733 00000 n 0000338786 00000 n 0001288639 00000 n 0000007790 00000 n 0000007826 00000 n 0000342024 00000 n 0001288546 00000 n 0000007883 00000 n 0000007917 00000 n 0000342088 00000 n 0001288467 00000 n 0000007974 00000 n 0000008012 00000 n 0000346305 00000 n 0001288335 00000 n 0000008064 00000 n 0000008109 00000 n 0000346369 00000 n 0001288256 00000 n 0000008166 00000 n 0000008213 00000 n 0000346433 00000 n 0001288163 00000 n 0000008270 00000 n 0000008313 00000 n 0000352027 00000 n 0001288070 00000 n 0000008370 00000 n 0000008437 00000 n 0000355270 00000 n 0001287991 00000 n 0000008494 00000 n 0000008527 00000 n 0000355334 00000 n 0001287859 00000 n 0000008579 00000 n 0000008609 00000 n 0000355398 00000 n 0001287780 00000 n 0000008666 00000 n 0000008724 00000 n 0000366471 00000 n 0001287687 00000 n 0000008781 00000 n 0000008831 00000 n 0000370278 00000 n 0001287608 00000 n 0000008888 00000 n 0000009153 00000 n 0000370342 00000 n 0001287476 00000 n 0000009205 00000 n 0000009250 00000 n 0000370406 00000 n 0001287397 00000 n 0000009307 00000 n 0000009339 00000 n 0000374807 00000 n 0001287304 00000 n 0000009396 00000 n 0000009436 00000 n 0000379600 00000 n 0001287211 00000 n 0000009493 00000 n 0000009522 00000 n 0000379664 00000 n 0001287118 00000 n 0000009579 00000 n 0000009611 00000 n 0000382408 00000 n 0001287025 00000 n 0000009668 00000 n 0000009696 00000 n 0000382471 00000 n 0001286946 00000 n 0000009753 00000 n 0000009782 00000 n 0000386830 00000 n 0001286814 00000 n 0000009834 00000 n 0000009875 00000 n 0000386894 00000 n 0001286735 00000 n 0000009932 00000 n 0000009974 00000 n 0000390446 00000 n 0001286656 00000 n 0000010031 00000 n 0000010074 00000 n 0000394494 00000 n 0001286524 00000 n 0000010126 00000 n 0000010159 00000 n 0000394558 00000 n 0001286445 00000 n 0000010216 00000 n 0000010248 00000 n 0000394622 00000 n 0001286352 00000 n 0000010305 00000 n 0000010334 00000 n 0000394686 00000 n 0001286273 00000 n 0000010391 00000 n 0000010427 00000 n 0000401471 00000 n 0001286140 00000 n 0000010480 00000 n 0000010507 00000 n 0000401535 00000 n 0001286061 00000 n 0000010565 00000 n 0000010597 00000 n 0000412524 00000 n 0001285968 00000 n 0000010655 00000 n 0000010693 00000 n 0000412588 00000 n 0001285875 00000 n 0000010751 00000 n 0000010790 00000 n 0000412652 00000 n 0001285782 00000 n 0000010848 00000 n 0000010882 00000 n 0000416244 00000 n 0001285689 00000 n 0000010940 00000 n 0000010975 00000 n 0000416308 00000 n 0001285596 00000 n 0000011033 00000 n 0000011067 00000 n 0000424748 00000 n 0001285503 00000 n 0000011125 00000 n 0000011161 00000 n 0000424812 00000 n 0001285410 00000 n 0000011219 00000 n 0000011275 00000 n 0000427822 00000 n 0001285317 00000 n 0000011333 00000 n 0000011372 00000 n 0000427885 00000 n 0001285224 00000 n 0000011431 00000 n 0000011471 00000 n 0000431900 00000 n 0001285131 00000 n 0000011530 00000 n 0000011606 00000 n 0000431964 00000 n 0001285038 00000 n 0000011665 00000 n 0000011705 00000 n 0000436007 00000 n 0001284945 00000 n 0000011764 00000 n 0000011811 00000 n 0000436071 00000 n 0001284852 00000 n 0000011870 00000 n 0000011896 00000 n 0000439384 00000 n 0001284759 00000 n 0000011955 00000 n 0000011995 00000 n 0000442016 00000 n 0001284666 00000 n 0000012054 00000 n 0000012089 00000 n 0000442080 00000 n 0001284573 00000 n 0000012148 00000 n 0000012186 00000 n 0000442144 00000 n 0001284480 00000 n 0000012245 00000 n 0000012291 00000 n 0000446492 00000 n 0001284387 00000 n 0000012350 00000 n 0000012403 00000 n 0000449937 00000 n 0001284294 00000 n 0000012462 00000 n 0000012506 00000 n 0000450001 00000 n 0001284201 00000 n 0000012565 00000 n 0000012603 00000 n 0000450065 00000 n 0001284108 00000 n 0000012662 00000 n 0000012707 00000 n 0000453822 00000 n 0001284015 00000 n 0000012766 00000 n 0000012814 00000 n 0000453886 00000 n 0001283922 00000 n 0000012873 00000 n 0000012912 00000 n 0000458455 00000 n 0001283829 00000 n 0000012971 00000 n 0000013014 00000 n 0000458519 00000 n 0001283736 00000 n 0000013073 00000 n 0000013125 00000 n 0000462676 00000 n 0001283657 00000 n 0000013184 00000 n 0000013232 00000 n 0000462740 00000 n 0001283525 00000 n 0000013285 00000 n 0000013326 00000 n 0000462804 00000 n 0001283446 00000 n 0000013384 00000 n 0000013416 00000 n 0000467097 00000 n 0001283353 00000 n 0000013474 00000 n 0000013603 00000 n 0000467161 00000 n 0001283260 00000 n 0000013661 00000 n 0000013793 00000 n 0000471150 00000 n 0001283167 00000 n 0000013851 00000 n 0000013983 00000 n 0000471214 00000 n 0001283088 00000 n 0000014041 00000 n 0000014176 00000 n 0000475175 00000 n 0001282956 00000 n 0000014229 00000 n 0000014271 00000 n 0000475239 00000 n 0001282877 00000 n 0000014329 00000 n 0000014407 00000 n 0000480134 00000 n 0001282784 00000 n 0000014465 00000 n 0000014566 00000 n 0000483775 00000 n 0001282691 00000 n 0000014624 00000 n 0000014706 00000 n 0000487823 00000 n 0001282598 00000 n 0000014764 00000 n 0000014850 00000 n 0000487887 00000 n 0001282519 00000 n 0000014908 00000 n 0000014998 00000 n 0000491309 00000 n 0001282387 00000 n 0000015051 00000 n 0000015088 00000 n 0000491373 00000 n 0001282308 00000 n 0000015146 00000 n 0000015194 00000 n 0000494809 00000 n 0001282215 00000 n 0000015252 00000 n 0000015302 00000 n 0000494873 00000 n 0001282122 00000 n 0000015360 00000 n 0000015412 00000 n 0000499680 00000 n 0001282043 00000 n 0000015470 00000 n 0000015518 00000 n 0000499744 00000 n 0001281910 00000 n 0000015571 00000 n 0000015608 00000 n 0000504042 00000 n 0001281831 00000 n 0000015666 00000 n 0000015732 00000 n 0000508647 00000 n 0001281738 00000 n 0000015790 00000 n 0000015918 00000 n 0000513086 00000 n 0001281645 00000 n 0000015976 00000 n 0000016028 00000 n 0000518252 00000 n 0001281552 00000 n 0000016086 00000 n 0000016131 00000 n 0000518316 00000 n 0001281459 00000 n 0000016189 00000 n 0000016250 00000 n 0000522606 00000 n 0001281366 00000 n 0000016308 00000 n 0000016490 00000 n 0000533396 00000 n 0001281273 00000 n 0000016548 00000 n 0000016586 00000 n 0000538436 00000 n 0001281180 00000 n 0000016644 00000 n 0000016704 00000 n 0000542146 00000 n 0001281087 00000 n 0000016762 00000 n 0000016806 00000 n 0000542210 00000 n 0001280994 00000 n 0000016865 00000 n 0000016889 00000 n 0000548155 00000 n 0001280901 00000 n 0000016948 00000 n 0000016983 00000 n 0000548219 00000 n 0001280808 00000 n 0000017042 00000 n 0000017082 00000 n 0000554335 00000 n 0001280729 00000 n 0000017141 00000 n 0000017192 00000 n 0000560873 00000 n 0001280597 00000 n 0000017245 00000 n 0000017300 00000 n 0000560937 00000 n 0001280518 00000 n 0000017358 00000 n 0000017465 00000 n 0000561001 00000 n 0001280425 00000 n 0000017523 00000 n 0000017633 00000 n 0000567837 00000 n 0001280332 00000 n 0000017691 00000 n 0000017801 00000 n 0000567901 00000 n 0001280239 00000 n 0000017859 00000 n 0000018071 00000 n 0000573738 00000 n 0001280146 00000 n 0000018129 00000 n 0000018348 00000 n 0000573802 00000 n 0001280067 00000 n 0000018406 00000 n 0000018625 00000 n 0000578832 00000 n 0001279935 00000 n 0000018678 00000 n 0000018731 00000 n 0000578896 00000 n 0001279856 00000 n 0000018789 00000 n 0000018821 00000 n 0000578960 00000 n 0001279763 00000 n 0000018879 00000 n 0000018922 00000 n 0000580802 00000 n 0001279670 00000 n 0000018980 00000 n 0000019019 00000 n 0000580865 00000 n 0001279577 00000 n 0000019077 00000 n 0000019111 00000 n 0000580929 00000 n 0001279484 00000 n 0000019169 00000 n 0000019210 00000 n 0000585543 00000 n 0001279405 00000 n 0000019268 00000 n 0000019300 00000 n 0000585607 00000 n 0001279273 00000 n 0000019353 00000 n 0000019387 00000 n 0000585671 00000 n 0001279194 00000 n 0000019445 00000 n 0000019489 00000 n 0000591404 00000 n 0001279101 00000 n 0000019547 00000 n 0000019604 00000 n 0000591468 00000 n 0001279022 00000 n 0000019662 00000 n 0000019700 00000 n 0000594858 00000 n 0001278890 00000 n 0000019753 00000 n 0000019802 00000 n 0000594922 00000 n 0001278811 00000 n 0000019860 00000 n 0000019936 00000 n 0000599605 00000 n 0001278718 00000 n 0000019994 00000 n 0000020101 00000 n 0000599669 00000 n 0001278625 00000 n 0000020159 00000 n 0000020187 00000 n 0000602495 00000 n 0001278546 00000 n 0000020245 00000 n 0000020270 00000 n 0000602559 00000 n 0001278413 00000 n 0000020323 00000 n 0000020365 00000 n 0000602623 00000 n 0001278334 00000 n 0000020423 00000 n 0000020459 00000 n 0000605313 00000 n 0001278241 00000 n 0000020517 00000 n 0000020553 00000 n 0000605377 00000 n 0001278148 00000 n 0000020611 00000 n 0000020644 00000 n 0000608452 00000 n 0001278055 00000 n 0000020702 00000 n 0000020736 00000 n 0000608516 00000 n 0001277962 00000 n 0000020794 00000 n 0000020830 00000 n 0000612069 00000 n 0001277869 00000 n 0000020888 00000 n 0000020940 00000 n 0000612132 00000 n 0001277776 00000 n 0000020998 00000 n 0000021072 00000 n 0000617213 00000 n 0001277683 00000 n 0000021130 00000 n 0000021156 00000 n 0000621436 00000 n 0001277590 00000 n 0000021214 00000 n 0000021248 00000 n 0000621500 00000 n 0001277497 00000 n 0000021307 00000 n 0000021370 00000 n 0000625220 00000 n 0001277404 00000 n 0000021429 00000 n 0000021466 00000 n 0000625284 00000 n 0001277325 00000 n 0000021525 00000 n 0000021563 00000 n 0000627870 00000 n 0001277192 00000 n 0000021616 00000 n 0000021651 00000 n 0000627934 00000 n 0001277113 00000 n 0000021709 00000 n 0000021737 00000 n 0000627998 00000 n 0001277020 00000 n 0000021795 00000 n 0000021836 00000 n 0000629892 00000 n 0001276927 00000 n 0000021894 00000 n 0000021923 00000 n 0000629956 00000 n 0001276834 00000 n 0000021981 00000 n 0000022019 00000 n 0000630020 00000 n 0001276741 00000 n 0000022077 00000 n 0000022110 00000 n 0000631406 00000 n 0001276648 00000 n 0000022168 00000 n 0000022206 00000 n 0000631469 00000 n 0001276555 00000 n 0000022264 00000 n 0000022293 00000 n 0000632611 00000 n 0001276462 00000 n 0000022351 00000 n 0000022377 00000 n 0000632675 00000 n 0001276369 00000 n 0000022435 00000 n 0000022463 00000 n 0000632739 00000 n 0001276276 00000 n 0000022522 00000 n 0000022547 00000 n 0000636084 00000 n 0001276183 00000 n 0000022606 00000 n 0000022669 00000 n 0000636148 00000 n 0001276104 00000 n 0000022728 00000 n 0000022801 00000 n 0000640029 00000 n 0001275972 00000 n 0000022854 00000 n 0000022890 00000 n 0000640093 00000 n 0001275893 00000 n 0000022948 00000 n 0000022980 00000 n 0000645708 00000 n 0001275800 00000 n 0000023038 00000 n 0000023100 00000 n 0000649315 00000 n 0001275707 00000 n 0000023158 00000 n 0000023189 00000 n 0000649378 00000 n 0001275614 00000 n 0000023247 00000 n 0000023287 00000 n 0000652978 00000 n 0001275521 00000 n 0000023345 00000 n 0000023461 00000 n 0000657454 00000 n 0001275428 00000 n 0000023519 00000 n 0000023633 00000 n 0000657518 00000 n 0001275349 00000 n 0000023691 00000 n 0000023719 00000 n 0000665029 00000 n 0001275217 00000 n 0000023772 00000 n 0000023804 00000 n 0000665093 00000 n 0001275138 00000 n 0000023862 00000 n 0000023905 00000 n 0000669681 00000 n 0001275045 00000 n 0000023963 00000 n 0000024010 00000 n 0000673033 00000 n 0001274952 00000 n 0000024068 00000 n 0000024108 00000 n 0000673097 00000 n 0001274859 00000 n 0000024166 00000 n 0000024210 00000 n 0000680871 00000 n 0001274780 00000 n 0000024268 00000 n 0000024349 00000 n 0000680935 00000 n 0001274648 00000 n 0000024402 00000 n 0000024435 00000 n 0000680999 00000 n 0001274569 00000 n 0000024493 00000 n 0000024547 00000 n 0000685383 00000 n 0001274476 00000 n 0000024605 00000 n 0000024631 00000 n 0000688956 00000 n 0001274397 00000 n 0000024689 00000 n 0000024729 00000 n 0000689020 00000 n 0001274265 00000 n 0000024782 00000 n 0000024819 00000 n 0000689084 00000 n 0001274186 00000 n 0000024877 00000 n 0000024923 00000 n 0000691596 00000 n 0001274107 00000 n 0000024981 00000 n 0000025064 00000 n 0000691660 00000 n 0001273975 00000 n 0000025117 00000 n 0000025160 00000 n 0000691724 00000 n 0001273896 00000 n 0000025218 00000 n 0000025264 00000 n 0000693967 00000 n 0001273803 00000 n 0000025322 00000 n 0000025355 00000 n 0000694031 00000 n 0001273710 00000 n 0000025413 00000 n 0000025441 00000 n 0000694095 00000 n 0001273631 00000 n 0000025499 00000 n 0000025527 00000 n 0000697900 00000 n 0001273499 00000 n 0000025580 00000 n 0000025620 00000 n 0000697964 00000 n 0001273420 00000 n 0000025678 00000 n 0000025724 00000 n 0000698028 00000 n 0001273327 00000 n 0000025782 00000 n 0000025829 00000 n 0000701385 00000 n 0001273248 00000 n 0000025887 00000 n 0000025931 00000 n 0000701448 00000 n 0001273113 00000 n 0000025984 00000 n 0000026030 00000 n 0000701512 00000 n 0001273034 00000 n 0000026088 00000 n 0000026129 00000 n 0000704955 00000 n 0001272941 00000 n 0000026187 00000 n 0000026226 00000 n 0000705019 00000 n 0001272848 00000 n 0000026284 00000 n 0000026322 00000 n 0000708400 00000 n 0001272755 00000 n 0000026380 00000 n 0000026409 00000 n 0000708464 00000 n 0001272662 00000 n 0000026467 00000 n 0000026552 00000 n 0000708528 00000 n 0001272567 00000 n 0000026610 00000 n 0000026653 00000 n 0000712303 00000 n 0001272470 00000 n 0000026712 00000 n 0000026753 00000 n 0000712368 00000 n 0001272372 00000 n 0000026812 00000 n 0000026849 00000 n 0000716484 00000 n 0001272274 00000 n 0000026908 00000 n 0000026955 00000 n 0000716549 00000 n 0001272176 00000 n 0000027015 00000 n 0000027074 00000 n 0000721360 00000 n 0001272078 00000 n 0000027134 00000 n 0000027173 00000 n 0000726603 00000 n 0001271980 00000 n 0000027233 00000 n 0000027273 00000 n 0000730837 00000 n 0001271882 00000 n 0000027333 00000 n 0000027373 00000 n 0000730902 00000 n 0001271784 00000 n 0000027433 00000 n 0000027468 00000 n 0000734691 00000 n 0001271686 00000 n 0000027528 00000 n 0000027563 00000 n 0000734756 00000 n 0001271588 00000 n 0000027623 00000 n 0000027659 00000 n 0000737430 00000 n 0001271490 00000 n 0000027719 00000 n 0000027754 00000 n 0000737495 00000 n 0001271392 00000 n 0000027814 00000 n 0000027860 00000 n 0000740686 00000 n 0001271294 00000 n 0000027920 00000 n 0000027959 00000 n 0000740751 00000 n 0001271196 00000 n 0000028019 00000 n 0000028056 00000 n 0000745386 00000 n 0001271098 00000 n 0000028116 00000 n 0000028144 00000 n 0000745451 00000 n 0001271000 00000 n 0000028204 00000 n 0000028239 00000 n 0000749523 00000 n 0001270902 00000 n 0000028299 00000 n 0000028336 00000 n 0000749588 00000 n 0001270804 00000 n 0000028396 00000 n 0000028433 00000 n 0000752596 00000 n 0001270706 00000 n 0000028493 00000 n 0000028520 00000 n 0000752661 00000 n 0001270608 00000 n 0000028580 00000 n 0000028616 00000 n 0000755885 00000 n 0001270510 00000 n 0000028676 00000 n 0000028713 00000 n 0000755950 00000 n 0001270412 00000 n 0000028773 00000 n 0000028801 00000 n 0000756015 00000 n 0001270329 00000 n 0000028861 00000 n 0000028890 00000 n 0000761732 00000 n 0001270191 00000 n 0000028944 00000 n 0000028985 00000 n 0000761797 00000 n 0001270107 00000 n 0000029044 00000 n 0000029077 00000 n 0000767798 00000 n 0001270008 00000 n 0000029136 00000 n 0000029165 00000 n 0000767863 00000 n 0001269909 00000 n 0000029224 00000 n 0000029262 00000 n 0000772838 00000 n 0001269810 00000 n 0000029321 00000 n 0000029358 00000 n 0000772902 00000 n 0001269711 00000 n 0000029417 00000 n 0000029457 00000 n 0000776888 00000 n 0001269612 00000 n 0000029516 00000 n 0000029555 00000 n 0000776953 00000 n 0001269513 00000 n 0000029614 00000 n 0000029673 00000 n 0000781194 00000 n 0001269429 00000 n 0000029732 00000 n 0000029774 00000 n 0000784015 00000 n 0001269290 00000 n 0000029828 00000 n 0000029867 00000 n 0000784080 00000 n 0001269206 00000 n 0000029926 00000 n 0000029973 00000 n 0000784145 00000 n 0001269107 00000 n 0000030032 00000 n 0000030079 00000 n 0000784210 00000 n 0001269008 00000 n 0000030138 00000 n 0000030189 00000 n 0000786485 00000 n 0001268924 00000 n 0000030248 00000 n 0000030300 00000 n 0000786550 00000 n 0001268799 00000 n 0000030354 00000 n 0000030397 00000 n 0000786615 00000 n 0001268715 00000 n 0000030456 00000 n 0000030489 00000 n 0000788445 00000 n 0001268616 00000 n 0000030548 00000 n 0000030581 00000 n 0000788510 00000 n 0001268517 00000 n 0000030640 00000 n 0000030686 00000 n 0000788575 00000 n 0001268418 00000 n 0000030745 00000 n 0000030779 00000 n 0000788640 00000 n 0001268319 00000 n 0000030838 00000 n 0000030879 00000 n 0000788705 00000 n 0001268220 00000 n 0000030938 00000 n 0000030988 00000 n 0000788770 00000 n 0001268121 00000 n 0000031047 00000 n 0000031089 00000 n 0000788835 00000 n 0001268022 00000 n 0000031148 00000 n 0000031190 00000 n 0000788900 00000 n 0001267923 00000 n 0000031249 00000 n 0000031297 00000 n 0000788964 00000 n 0001267824 00000 n 0000031357 00000 n 0000031401 00000 n 0000789029 00000 n 0001267725 00000 n 0000031461 00000 n 0000031512 00000 n 0000789092 00000 n 0001267626 00000 n 0000031572 00000 n 0000031633 00000 n 0000789157 00000 n 0001267527 00000 n 0000031693 00000 n 0000031745 00000 n 0000789222 00000 n 0001267428 00000 n 0000031805 00000 n 0000031858 00000 n 0000789287 00000 n 0001267329 00000 n 0000031918 00000 n 0000031971 00000 n 0000789352 00000 n 0001267230 00000 n 0000032031 00000 n 0000032086 00000 n 0000789417 00000 n 0001267131 00000 n 0000032146 00000 n 0000032243 00000 n 0000789482 00000 n 0001267047 00000 n 0000032303 00000 n 0000032394 00000 n 0000796850 00000 n 0001266907 00000 n 0000032442 00000 n 0000032507 00000 n 0000796915 00000 n 0001266782 00000 n 0000032560 00000 n 0000032593 00000 n 0000796979 00000 n 0001266713 00000 n 0000032651 00000 n 0000032695 00000 n 0000801296 00000 n 0001266573 00000 n 0000032748 00000 n 0000032791 00000 n 0000801360 00000 n 0001266489 00000 n 0000032849 00000 n 0000032892 00000 n 0000801425 00000 n 0001266390 00000 n 0000032950 00000 n 0000032992 00000 n 0000805225 00000 n 0001266306 00000 n 0000033050 00000 n 0000033099 00000 n 0000805289 00000 n 0001266166 00000 n 0000033152 00000 n 0000033198 00000 n 0000805354 00000 n 0001266082 00000 n 0000033256 00000 n 0000033315 00000 n 0000808428 00000 n 0001265998 00000 n 0000033373 00000 n 0000033408 00000 n 0000808493 00000 n 0001265858 00000 n 0000033461 00000 n 0000033494 00000 n 0000808558 00000 n 0001265789 00000 n 0000033552 00000 n 0000033647 00000 n 0000811538 00000 n 0001265649 00000 n 0000033700 00000 n 0000033744 00000 n 0000811602 00000 n 0001265565 00000 n 0000033802 00000 n 0000033874 00000 n 0000815046 00000 n 0001265481 00000 n 0000033932 00000 n 0000034027 00000 n 0000815110 00000 n 0001265341 00000 n 0000034080 00000 n 0000034123 00000 n 0000815175 00000 n 0001265257 00000 n 0000034181 00000 n 0000034227 00000 n 0000819341 00000 n 0001265158 00000 n 0000034285 00000 n 0000034578 00000 n 0000824862 00000 n 0001265059 00000 n 0000034636 00000 n 0000034950 00000 n 0000829897 00000 n 0001264975 00000 n 0000035008 00000 n 0000035064 00000 n 0000829962 00000 n 0001264835 00000 n 0000035117 00000 n 0000035169 00000 n 0000830027 00000 n 0001264751 00000 n 0000035227 00000 n 0000035270 00000 n 0000834715 00000 n 0001264652 00000 n 0000035328 00000 n 0000035748 00000 n 0000839748 00000 n 0001264568 00000 n 0000035806 00000 n 0000035947 00000 n 0000843162 00000 n 0001264428 00000 n 0000036000 00000 n 0000036041 00000 n 0000843227 00000 n 0001264344 00000 n 0000036099 00000 n 0000036144 00000 n 0000843292 00000 n 0001264245 00000 n 0000036202 00000 n 0000036238 00000 n 0000846723 00000 n 0001264146 00000 n 0000036296 00000 n 0000036339 00000 n 0000846788 00000 n 0001264047 00000 n 0000036397 00000 n 0000036466 00000 n 0000850545 00000 n 0001263963 00000 n 0000036524 00000 n 0000036580 00000 n 0000854240 00000 n 0001263823 00000 n 0000036633 00000 n 0000036674 00000 n 0000854304 00000 n 0001263754 00000 n 0000036732 00000 n 0000036807 00000 n 0000858947 00000 n 0001263629 00000 n 0000036861 00000 n 0000036906 00000 n 0000859012 00000 n 0001263560 00000 n 0000036965 00000 n 0000037020 00000 n 0000865321 00000 n 0001263420 00000 n 0000037068 00000 n 0000037113 00000 n 0000865386 00000 n 0001263294 00000 n 0000037166 00000 n 0000037208 00000 n 0000865450 00000 n 0001263210 00000 n 0000037266 00000 n 0000037299 00000 n 0000865515 00000 n 0001263111 00000 n 0000037357 00000 n 0000037397 00000 n 0000870784 00000 n 0001263012 00000 n 0000037455 00000 n 0000037490 00000 n 0000874696 00000 n 0001262913 00000 n 0000037548 00000 n 0000037584 00000 n 0000874761 00000 n 0001262814 00000 n 0000037642 00000 n 0000037679 00000 n 0000874826 00000 n 0001262715 00000 n 0000037737 00000 n 0000037780 00000 n 0000880913 00000 n 0001262616 00000 n 0000037838 00000 n 0000037891 00000 n 0000880978 00000 n 0001262517 00000 n 0000037949 00000 n 0000038005 00000 n 0000883095 00000 n 0001262418 00000 n 0000038063 00000 n 0000038115 00000 n 0000887677 00000 n 0001262334 00000 n 0000038174 00000 n 0000038226 00000 n 0000891645 00000 n 0001262194 00000 n 0000038279 00000 n 0000038325 00000 n 0000891710 00000 n 0001262110 00000 n 0000038383 00000 n 0000038416 00000 n 0000896543 00000 n 0001262011 00000 n 0000038474 00000 n 0000038516 00000 n 0000896608 00000 n 0001261912 00000 n 0000038574 00000 n 0000038615 00000 n 0000900252 00000 n 0001261813 00000 n 0000038673 00000 n 0000038715 00000 n 0000908600 00000 n 0001261714 00000 n 0000038773 00000 n 0000038815 00000 n 0000908665 00000 n 0001261615 00000 n 0000038873 00000 n 0000038926 00000 n 0000912011 00000 n 0001261516 00000 n 0000038984 00000 n 0000039027 00000 n 0000912076 00000 n 0001261417 00000 n 0000039085 00000 n 0000039126 00000 n 0000918007 00000 n 0001261333 00000 n 0000039184 00000 n 0000039252 00000 n 0000918072 00000 n 0001261192 00000 n 0000039305 00000 n 0000039347 00000 n 0000918137 00000 n 0001261108 00000 n 0000039405 00000 n 0000039452 00000 n 0000918202 00000 n 0001261009 00000 n 0000039510 00000 n 0000039550 00000 n 0000918267 00000 n 0001260910 00000 n 0000039608 00000 n 0000039639 00000 n 0000923235 00000 n 0001260811 00000 n 0000039697 00000 n 0000039730 00000 n 0000923300 00000 n 0001260712 00000 n 0000039788 00000 n 0000039824 00000 n 0000923365 00000 n 0001260613 00000 n 0000039882 00000 n 0000039919 00000 n 0000923429 00000 n 0001260514 00000 n 0000039977 00000 n 0000040018 00000 n 0000928861 00000 n 0001260415 00000 n 0000040076 00000 n 0000040113 00000 n 0000928926 00000 n 0001260316 00000 n 0000040171 00000 n 0000040206 00000 n 0000928991 00000 n 0001260217 00000 n 0000040265 00000 n 0000040298 00000 n 0000934603 00000 n 0001260133 00000 n 0000040357 00000 n 0000040390 00000 n 0000934668 00000 n 0001259993 00000 n 0000040443 00000 n 0000040485 00000 n 0000934733 00000 n 0001259909 00000 n 0000040543 00000 n 0000040576 00000 n 0000938899 00000 n 0001259810 00000 n 0000040634 00000 n 0000040693 00000 n 0000943585 00000 n 0001259726 00000 n 0000040751 00000 n 0000040817 00000 n 0000947703 00000 n 0001259601 00000 n 0000040870 00000 n 0000040925 00000 n 0000949888 00000 n 0001259532 00000 n 0000040983 00000 n 0000041033 00000 n 0001259433 00000 n 0000041091 00000 n 0000041122 00000 n 0000975813 00000 n 0001259349 00000 n 0000041171 00000 n 0000041197 00000 n 0000041707 00000 n 0000042157 00000 n 0000041251 00000 n 0000042027 00000 n 0000042092 00000 n 0001252496 00000 n 0001241599 00000 n 0001252330 00000 n 0001240631 00000 n 0001232518 00000 n 0001240466 00000 n 0000041844 00000 n 0001253574 00000 n 0000043520 00000 n 0000043148 00000 n 0000042245 00000 n 0000043455 00000 n 0001230952 00000 n 0001213443 00000 n 0001230787 00000 n 0000043285 00000 n 0000054548 00000 n 0000045565 00000 n 0000043593 00000 n 0000054483 00000 n 0000046152 00000 n 0001212316 00000 n 0001198850 00000 n 0001212150 00000 n 0000046307 00000 n 0000046463 00000 n 0000046619 00000 n 0000046780 00000 n 0000046940 00000 n 0000047107 00000 n 0000047274 00000 n 0000047441 00000 n 0000047608 00000 n 0000047775 00000 n 0000047935 00000 n 0000048095 00000 n 0000048262 00000 n 0000048429 00000 n 0000048596 00000 n 0000048763 00000 n 0000048929 00000 n 0000049095 00000 n 0000049250 00000 n 0000049409 00000 n 0000049569 00000 n 0000049730 00000 n 0000049895 00000 n 0000050062 00000 n 0000050228 00000 n 0000050388 00000 n 0000050549 00000 n 0000050710 00000 n 0000050866 00000 n 0000051027 00000 n 0000051188 00000 n 0000051349 00000 n 0000051516 00000 n 0000051682 00000 n 0000051849 00000 n 0000052014 00000 n 0000052181 00000 n 0000052348 00000 n 0000052513 00000 n 0000052678 00000 n 0000052845 00000 n 0000053012 00000 n 0000053180 00000 n 0000053336 00000 n 0000053496 00000 n 0000053660 00000 n 0001197325 00000 n 0001180656 00000 n 0001197159 00000 n 0000053825 00000 n 0000053989 00000 n 0000054154 00000 n 0000054319 00000 n 0000067566 00000 n 0000057689 00000 n 0000054663 00000 n 0000058321 00000 n 0000058487 00000 n 0000058654 00000 n 0000058820 00000 n 0000058988 00000 n 0000059156 00000 n 0000059324 00000 n 0000059491 00000 n 0000059659 00000 n 0000059820 00000 n 0000059987 00000 n 0000060154 00000 n 0000060320 00000 n 0000060486 00000 n 0000060641 00000 n 0000060802 00000 n 0000060968 00000 n 0000061134 00000 n 0000061295 00000 n 0000061462 00000 n 0000061629 00000 n 0000061795 00000 n 0000061956 00000 n 0000062123 00000 n 0000062289 00000 n 0000062454 00000 n 0000062619 00000 n 0000062785 00000 n 0000062946 00000 n 0000063113 00000 n 0000063280 00000 n 0000063447 00000 n 0000063614 00000 n 0000063779 00000 n 0000063940 00000 n 0000064107 00000 n 0000064274 00000 n 0000064441 00000 n 0000064608 00000 n 0000064766 00000 n 0000064933 00000 n 0000065100 00000 n 0000065266 00000 n 0000065431 00000 n 0000065597 00000 n 0000065757 00000 n 0000065923 00000 n 0000066090 00000 n 0000066257 00000 n 0000066424 00000 n 0000066590 00000 n 0000066754 00000 n 0000066913 00000 n 0000067078 00000 n 0000067243 00000 n 0000067402 00000 n 0000081929 00000 n 0000071711 00000 n 0000067667 00000 n 0000081864 00000 n 0000072352 00000 n 0000072518 00000 n 0000072685 00000 n 0000072846 00000 n 0000073013 00000 n 0000073180 00000 n 0000073348 00000 n 0000073515 00000 n 0000073682 00000 n 0000073850 00000 n 0000074018 00000 n 0000074186 00000 n 0000074353 00000 n 0000074521 00000 n 0000074690 00000 n 0000074859 00000 n 0000075028 00000 n 0000075197 00000 n 0000075364 00000 n 0000075531 00000 n 0000075699 00000 n 0000075868 00000 n 0000076036 00000 n 0000076205 00000 n 0000076372 00000 n 0000076540 00000 n 0000076709 00000 n 0000076878 00000 n 0000077047 00000 n 0000077216 00000 n 0000077385 00000 n 0000077546 00000 n 0000077713 00000 n 0000077880 00000 n 0000078047 00000 n 0000078214 00000 n 0000078381 00000 n 0000078546 00000 n 0000078713 00000 n 0000078880 00000 n 0000079047 00000 n 0000079209 00000 n 0000079377 00000 n 0000079543 00000 n 0000079711 00000 n 0000079879 00000 n 0000080047 00000 n 0000080209 00000 n 0000080377 00000 n 0000080543 00000 n 0000080711 00000 n 0000080878 00000 n 0000081038 00000 n 0000081204 00000 n 0000081369 00000 n 0000081532 00000 n 0000081698 00000 n 0000096341 00000 n 0000086141 00000 n 0000082016 00000 n 0000096276 00000 n 0000086782 00000 n 0000086949 00000 n 0000087116 00000 n 0000087282 00000 n 0000087449 00000 n 0000087617 00000 n 0000087785 00000 n 0000087952 00000 n 0000088121 00000 n 0000088289 00000 n 0000088458 00000 n 0000088627 00000 n 0000088789 00000 n 0000088955 00000 n 0000089122 00000 n 0000089289 00000 n 0000089456 00000 n 0000089622 00000 n 0000089787 00000 n 0000089953 00000 n 0000090119 00000 n 0000090286 00000 n 0000090453 00000 n 0000090619 00000 n 0000090785 00000 n 0000090946 00000 n 0000091113 00000 n 0000091281 00000 n 0000091449 00000 n 0000091617 00000 n 0000091785 00000 n 0000091951 00000 n 0000092113 00000 n 0000092281 00000 n 0000092449 00000 n 0000092617 00000 n 0000092779 00000 n 0000092945 00000 n 0000093113 00000 n 0000093281 00000 n 0000093449 00000 n 0000093610 00000 n 0000093778 00000 n 0000093945 00000 n 0000094113 00000 n 0000094281 00000 n 0000094449 00000 n 0000094617 00000 n 0000094785 00000 n 0000094952 00000 n 0000095120 00000 n 0000095288 00000 n 0000095455 00000 n 0000095621 00000 n 0000095781 00000 n 0000095944 00000 n 0000096110 00000 n 0000110196 00000 n 0000099978 00000 n 0000096428 00000 n 0000110131 00000 n 0000100619 00000 n 0000100786 00000 n 0000100954 00000 n 0000101122 00000 n 0000101290 00000 n 0000101458 00000 n 0000101626 00000 n 0000101794 00000 n 0000101963 00000 n 0000102132 00000 n 0000102294 00000 n 0000102461 00000 n 0000102629 00000 n 0000102796 00000 n 0000102964 00000 n 0000103131 00000 n 0000103299 00000 n 0000103467 00000 n 0000103628 00000 n 0000103795 00000 n 0000103963 00000 n 0000104131 00000 n 0000104299 00000 n 0000104467 00000 n 0000104628 00000 n 0000104795 00000 n 0000104963 00000 n 0000105131 00000 n 0000105293 00000 n 0000105461 00000 n 0000105629 00000 n 0000105790 00000 n 0000105958 00000 n 0000106126 00000 n 0000106294 00000 n 0000106462 00000 n 0000106624 00000 n 0000106791 00000 n 0000106959 00000 n 0000107127 00000 n 0000107289 00000 n 0000107456 00000 n 0000107624 00000 n 0000107789 00000 n 0000107957 00000 n 0000108125 00000 n 0000108293 00000 n 0000108461 00000 n 0000108629 00000 n 0000108796 00000 n 0000108965 00000 n 0000109132 00000 n 0000109299 00000 n 0000109466 00000 n 0000109633 00000 n 0000109798 00000 n 0000109964 00000 n 0001253699 00000 n 0000123657 00000 n 0000113631 00000 n 0000110283 00000 n 0000123592 00000 n 0000114263 00000 n 0000114431 00000 n 0000114600 00000 n 0000114769 00000 n 0000114938 00000 n 0000115107 00000 n 0000115276 00000 n 0000115444 00000 n 0000115613 00000 n 0000115781 00000 n 0000115950 00000 n 0000116119 00000 n 0000116287 00000 n 0000116448 00000 n 0000116615 00000 n 0000116783 00000 n 0000116951 00000 n 0000117119 00000 n 0000117285 00000 n 0000117451 00000 n 0000117619 00000 n 0000117786 00000 n 0000117948 00000 n 0000118116 00000 n 0000118284 00000 n 0000118449 00000 n 0000118617 00000 n 0000118779 00000 n 0000118946 00000 n 0000119114 00000 n 0000119282 00000 n 0000119449 00000 n 0000119617 00000 n 0000119785 00000 n 0000119953 00000 n 0000120121 00000 n 0000120288 00000 n 0000120455 00000 n 0000120623 00000 n 0000120792 00000 n 0000120961 00000 n 0000121130 00000 n 0000121299 00000 n 0000121466 00000 n 0000121635 00000 n 0000121804 00000 n 0000121960 00000 n 0000122121 00000 n 0000122288 00000 n 0000122449 00000 n 0000122615 00000 n 0000122779 00000 n 0000122944 00000 n 0000123103 00000 n 0000123268 00000 n 0000123433 00000 n 0000136975 00000 n 0000127040 00000 n 0000123758 00000 n 0000136910 00000 n 0000127672 00000 n 0000127838 00000 n 0000127999 00000 n 0000128166 00000 n 0000128333 00000 n 0000128491 00000 n 0000128657 00000 n 0000128822 00000 n 0000128987 00000 n 0000129153 00000 n 0000129319 00000 n 0000129484 00000 n 0000129648 00000 n 0000129814 00000 n 0000129975 00000 n 0000130142 00000 n 0000130308 00000 n 0000130473 00000 n 0000130637 00000 n 0000130801 00000 n 0000130967 00000 n 0000131133 00000 n 0000131299 00000 n 0000131460 00000 n 0000131626 00000 n 0000131791 00000 n 0000131958 00000 n 0000132125 00000 n 0000132292 00000 n 0000132452 00000 n 0000132619 00000 n 0000132781 00000 n 0000132949 00000 n 0000133104 00000 n 0000133264 00000 n 0000133430 00000 n 0000133597 00000 n 0000133764 00000 n 0000133931 00000 n 0000134098 00000 n 0000134265 00000 n 0000134432 00000 n 0000134599 00000 n 0000134766 00000 n 0000134934 00000 n 0000135094 00000 n 0000135260 00000 n 0000135427 00000 n 0000135594 00000 n 0000135761 00000 n 0000135927 00000 n 0000136091 00000 n 0000136256 00000 n 0000136421 00000 n 0000136586 00000 n 0000136745 00000 n 0000141368 00000 n 0000138040 00000 n 0000137076 00000 n 0000141303 00000 n 0000138330 00000 n 0000138496 00000 n 0000138663 00000 n 0000138828 00000 n 0000138995 00000 n 0000139162 00000 n 0000139327 00000 n 0000139492 00000 n 0000139659 00000 n 0000139826 00000 n 0000139994 00000 n 0000140154 00000 n 0000140320 00000 n 0000140485 00000 n 0000140652 00000 n 0000140813 00000 n 0000140980 00000 n 0000141146 00000 n 0000145916 00000 n 0000144111 00000 n 0000141469 00000 n 0000145789 00000 n 0000144311 00000 n 0000144503 00000 n 0000144677 00000 n 0000144878 00000 n 0000145059 00000 n 0001180200 00000 n 0001176885 00000 n 0001180037 00000 n 0001175905 00000 n 0001172318 00000 n 0001175740 00000 n 0000145252 00000 n 0000145425 00000 n 0000145618 00000 n 0001171908 00000 n 0001168741 00000 n 0001171745 00000 n 0001168051 00000 n 0001162275 00000 n 0001167886 00000 n 0000146468 00000 n 0000146287 00000 n 0000146058 00000 n 0000146403 00000 n 0000152456 00000 n 0000150177 00000 n 0000146541 00000 n 0000152328 00000 n 0000150404 00000 n 0000150567 00000 n 0000150751 00000 n 0000150934 00000 n 0000151121 00000 n 0000151282 00000 n 0000151444 00000 n 0000151644 00000 n 0000151844 00000 n 0000152006 00000 n 0000152164 00000 n 0001253824 00000 n 0000953979 00000 n 0000954239 00000 n 0000953720 00000 n 0000954044 00000 n 0000953850 00000 n 0000953915 00000 n 0000153824 00000 n 0000153643 00000 n 0000152585 00000 n 0000153759 00000 n 0000159134 00000 n 0000157307 00000 n 0000153939 00000 n 0000158818 00000 n 0000157507 00000 n 0000157664 00000 n 0000157821 00000 n 0000157988 00000 n 0001161378 00000 n 0001152920 00000 n 0001161212 00000 n 0001152073 00000 n 0001142617 00000 n 0001151906 00000 n 0000158153 00000 n 0000158319 00000 n 0000158486 00000 n 0000158652 00000 n 0000163962 00000 n 0000162647 00000 n 0000159291 00000 n 0000163834 00000 n 0000162829 00000 n 0000162997 00000 n 0000163165 00000 n 0000163333 00000 n 0000163500 00000 n 0000163667 00000 n 0000167194 00000 n 0000167013 00000 n 0000164091 00000 n 0000167129 00000 n 0001142195 00000 n 0001139188 00000 n 0001142029 00000 n 0000172570 00000 n 0000170222 00000 n 0000167309 00000 n 0000172442 00000 n 0000170458 00000 n 0000170619 00000 n 0000170781 00000 n 0000170948 00000 n 0000171115 00000 n 0000171283 00000 n 0000171450 00000 n 0000171612 00000 n 0000171774 00000 n 0000171940 00000 n 0000172107 00000 n 0000172274 00000 n 0000179521 00000 n 0000176119 00000 n 0000172685 00000 n 0000179393 00000 n 0000176409 00000 n 0000176577 00000 n 0000176745 00000 n 0000176907 00000 n 0000177069 00000 n 0000177237 00000 n 0000177405 00000 n 0000177572 00000 n 0000177739 00000 n 0000177906 00000 n 0000178073 00000 n 0000178238 00000 n 0000178403 00000 n 0000178569 00000 n 0000178735 00000 n 0000178899 00000 n 0000179063 00000 n 0000179228 00000 n 0001253949 00000 n 0000184967 00000 n 0000184359 00000 n 0000179636 00000 n 0000184839 00000 n 0000184505 00000 n 0000184672 00000 n 0000189968 00000 n 0000189364 00000 n 0000185082 00000 n 0000189840 00000 n 0000189510 00000 n 0000189675 00000 n 0000197950 00000 n 0000195258 00000 n 0000193418 00000 n 0000190097 00000 n 0000195004 00000 n 0000193618 00000 n 0000193785 00000 n 0000193952 00000 n 0000194118 00000 n 0000194284 00000 n 0000194443 00000 n 0000194642 00000 n 0000194841 00000 n 0000204236 00000 n 0000197777 00000 n 0000195373 00000 n 0000204171 00000 n 0000203342 00000 n 0000203508 00000 n 0000203674 00000 n 0000203840 00000 n 0000204006 00000 n 0000201105 00000 n 0000201162 00000 n 0000201243 00000 n 0000202282 00000 n 0000203319 00000 n 0000208185 00000 n 0000207405 00000 n 0000204366 00000 n 0000208057 00000 n 0000207560 00000 n 0000207725 00000 n 0000207891 00000 n 0000211567 00000 n 0000211026 00000 n 0000208300 00000 n 0000211502 00000 n 0000211172 00000 n 0000211338 00000 n 0001254074 00000 n 0000218544 00000 n 0000216613 00000 n 0000211696 00000 n 0000218479 00000 n 0000216831 00000 n 0000216998 00000 n 0000217165 00000 n 0000217331 00000 n 0000217497 00000 n 0000217659 00000 n 0000217821 00000 n 0000217981 00000 n 0000218143 00000 n 0000218311 00000 n 0000223850 00000 n 0000222155 00000 n 0000218659 00000 n 0000223659 00000 n 0000222355 00000 n 0000222523 00000 n 0000222691 00000 n 0000222858 00000 n 0000223025 00000 n 0000223187 00000 n 0000223349 00000 n 0000223504 00000 n 0000228599 00000 n 0000227643 00000 n 0000223965 00000 n 0000228471 00000 n 0000227807 00000 n 0000227974 00000 n 0000228141 00000 n 0000228306 00000 n 0000231683 00000 n 0000231502 00000 n 0000228714 00000 n 0000231618 00000 n 0000232193 00000 n 0000232012 00000 n 0000231784 00000 n 0000232128 00000 n 0000235680 00000 n 0000237979 00000 n 0000235507 00000 n 0000232266 00000 n 0000237600 00000 n 0000236776 00000 n 0000236934 00000 n 0000237101 00000 n 0000237268 00000 n 0000237435 00000 n 0001254199 00000 n 0000236531 00000 n 0000236588 00000 n 0000236669 00000 n 0000236754 00000 n 0000953785 00000 n 0000242656 00000 n 0000241312 00000 n 0000238137 00000 n 0000242465 00000 n 0000241494 00000 n 0000241655 00000 n 0000241817 00000 n 0000241979 00000 n 0000242141 00000 n 0000242303 00000 n 0000246969 00000 n 0000245600 00000 n 0000242771 00000 n 0000246776 00000 n 0000245782 00000 n 0000245950 00000 n 0000246118 00000 n 0000246280 00000 n 0000246442 00000 n 0000246609 00000 n 0000256918 00000 n 0000251760 00000 n 0000247098 00000 n 0000256789 00000 n 0000252140 00000 n 0000252307 00000 n 0000252472 00000 n 0000252640 00000 n 0000252808 00000 n 0000252976 00000 n 0000253142 00000 n 0000253309 00000 n 0000253476 00000 n 0000253643 00000 n 0000253810 00000 n 0000253977 00000 n 0000254144 00000 n 0000254311 00000 n 0000254478 00000 n 0000254645 00000 n 0000254812 00000 n 0000254980 00000 n 0000255148 00000 n 0000255315 00000 n 0000255482 00000 n 0000255650 00000 n 0000255818 00000 n 0000255980 00000 n 0000256142 00000 n 0000256306 00000 n 0000256469 00000 n 0000256629 00000 n 0000260548 00000 n 0000260005 00000 n 0000257019 00000 n 0000260483 00000 n 0000260151 00000 n 0000260317 00000 n 0000261082 00000 n 0000260901 00000 n 0000260677 00000 n 0000261017 00000 n 0000263813 00000 n 0000262746 00000 n 0000261155 00000 n 0000263556 00000 n 0000262910 00000 n 0000263071 00000 n 0000263232 00000 n 0000263394 00000 n 0001254324 00000 n 0000274616 00000 n 0000268782 00000 n 0000263942 00000 n 0000274551 00000 n 0000269198 00000 n 0000269366 00000 n 0000269534 00000 n 0000269702 00000 n 0000269870 00000 n 0000270036 00000 n 0000270201 00000 n 0000270367 00000 n 0000270534 00000 n 0000270701 00000 n 0000270868 00000 n 0000271034 00000 n 0000271200 00000 n 0000271368 00000 n 0000271536 00000 n 0000271705 00000 n 0000271874 00000 n 0000272043 00000 n 0000272212 00000 n 0000272379 00000 n 0000272546 00000 n 0000272712 00000 n 0000272879 00000 n 0000273047 00000 n 0000273215 00000 n 0000273382 00000 n 0000273550 00000 n 0000273719 00000 n 0000273888 00000 n 0000274054 00000 n 0000274220 00000 n 0000274386 00000 n 0000279423 00000 n 0000277282 00000 n 0000274731 00000 n 0000279166 00000 n 0000277500 00000 n 0000277667 00000 n 0000277834 00000 n 0000277999 00000 n 0000278165 00000 n 0000278333 00000 n 0000278501 00000 n 0000278669 00000 n 0001138621 00000 n 0001135613 00000 n 0001138455 00000 n 0000278837 00000 n 0000279001 00000 n 0000283946 00000 n 0000282929 00000 n 0000279566 00000 n 0000283753 00000 n 0000283093 00000 n 0000283259 00000 n 0000283424 00000 n 0000283589 00000 n 0000288406 00000 n 0000286971 00000 n 0000284075 00000 n 0000288149 00000 n 0000287153 00000 n 0000287320 00000 n 0000287486 00000 n 0000287653 00000 n 0000287820 00000 n 0000287985 00000 n 0000293084 00000 n 0000291233 00000 n 0000288535 00000 n 0000292763 00000 n 0000291433 00000 n 0000291599 00000 n 0000291766 00000 n 0000291931 00000 n 0000292097 00000 n 0000292263 00000 n 0000292430 00000 n 0000292596 00000 n 0000296616 00000 n 0000295406 00000 n 0000293213 00000 n 0000296232 00000 n 0000295570 00000 n 0000295737 00000 n 0000295904 00000 n 0000296068 00000 n 0001254449 00000 n 0000299599 00000 n 0000299290 00000 n 0000296745 00000 n 0000299406 00000 n 0000303940 00000 n 0000302573 00000 n 0000299700 00000 n 0000303747 00000 n 0000302755 00000 n 0000302922 00000 n 0000303088 00000 n 0000303255 00000 n 0000303420 00000 n 0000303584 00000 n 0000307331 00000 n 0000305827 00000 n 0000304041 00000 n 0000307011 00000 n 0000306009 00000 n 0000306176 00000 n 0000306343 00000 n 0000306512 00000 n 0000306681 00000 n 0000306846 00000 n 0000311469 00000 n 0000309327 00000 n 0000307432 00000 n 0000311213 00000 n 0000309545 00000 n 0000309713 00000 n 0000309881 00000 n 0000310047 00000 n 0000310214 00000 n 0000310382 00000 n 0000310548 00000 n 0000310713 00000 n 0000310879 00000 n 0000311046 00000 n 0000314340 00000 n 0000313616 00000 n 0000311570 00000 n 0000314084 00000 n 0000313762 00000 n 0000313924 00000 n 0000318750 00000 n 0000317019 00000 n 0000314455 00000 n 0000318557 00000 n 0000317219 00000 n 0000317388 00000 n 0000317557 00000 n 0000317724 00000 n 0000317891 00000 n 0000318057 00000 n 0000318222 00000 n 0000318390 00000 n 0001254574 00000 n 0000323336 00000 n 0000321734 00000 n 0000318851 00000 n 0000323271 00000 n 0000321934 00000 n 0000322101 00000 n 0000322268 00000 n 0000322435 00000 n 0000322602 00000 n 0000322770 00000 n 0000322937 00000 n 0000323104 00000 n 0000326096 00000 n 0000325724 00000 n 0000323451 00000 n 0000325840 00000 n 0000328675 00000 n 0000327872 00000 n 0000326225 00000 n 0000328356 00000 n 0000328018 00000 n 0000328187 00000 n 0000332106 00000 n 0000330666 00000 n 0000328790 00000 n 0000331849 00000 n 0000330848 00000 n 0000331017 00000 n 0000331186 00000 n 0000331352 00000 n 0000331519 00000 n 0000331686 00000 n 0000335101 00000 n 0000334010 00000 n 0000332235 00000 n 0000334844 00000 n 0000334174 00000 n 0000334343 00000 n 0000334512 00000 n 0000334679 00000 n 0000338850 00000 n 0000337831 00000 n 0000335230 00000 n 0000338657 00000 n 0000337995 00000 n 0000338162 00000 n 0000338329 00000 n 0000338493 00000 n 0001254699 00000 n 0000342152 00000 n 0000341479 00000 n 0000338993 00000 n 0000341959 00000 n 0000341625 00000 n 0000341793 00000 n 0000346497 00000 n 0000345058 00000 n 0000342281 00000 n 0000346240 00000 n 0000345240 00000 n 0000345407 00000 n 0000345572 00000 n 0000345740 00000 n 0000345908 00000 n 0000346074 00000 n 0000352091 00000 n 0000350423 00000 n 0000346626 00000 n 0000351962 00000 n 0000350623 00000 n 0000350790 00000 n 0000350957 00000 n 0000351125 00000 n 0000351293 00000 n 0000351461 00000 n 0000351628 00000 n 0000351795 00000 n 0000355461 00000 n 0000355089 00000 n 0000352220 00000 n 0000355205 00000 n 0000360919 00000 n 0000360738 00000 n 0000355590 00000 n 0000360854 00000 n 0000366535 00000 n 0000364870 00000 n 0000361048 00000 n 0000366406 00000 n 0000365070 00000 n 0000365239 00000 n 0000365408 00000 n 0000365575 00000 n 0000365743 00000 n 0000365910 00000 n 0000366077 00000 n 0000366242 00000 n 0001254824 00000 n 0000370469 00000 n 0000368322 00000 n 0000366678 00000 n 0000370213 00000 n 0000368540 00000 n 0000368709 00000 n 0000368878 00000 n 0000369044 00000 n 0000369211 00000 n 0000369377 00000 n 0000369542 00000 n 0000369711 00000 n 0000369880 00000 n 0000370046 00000 n 0000374870 00000 n 0000373560 00000 n 0000370626 00000 n 0000374742 00000 n 0000373742 00000 n 0000373909 00000 n 0000374076 00000 n 0000374243 00000 n 0000374410 00000 n 0000374576 00000 n 0000379728 00000 n 0000377650 00000 n 0000374985 00000 n 0000379535 00000 n 0000377868 00000 n 0000378035 00000 n 0000378201 00000 n 0000378368 00000 n 0000378535 00000 n 0000378702 00000 n 0000378869 00000 n 0000379035 00000 n 0000379202 00000 n 0000379369 00000 n 0000382535 00000 n 0000381513 00000 n 0000379829 00000 n 0000382343 00000 n 0000381677 00000 n 0000381842 00000 n 0000382009 00000 n 0000382176 00000 n 0000386958 00000 n 0000385586 00000 n 0000382636 00000 n 0000386765 00000 n 0000385768 00000 n 0000385935 00000 n 0000386101 00000 n 0000386269 00000 n 0000386437 00000 n 0000386601 00000 n 0000390510 00000 n 0000389904 00000 n 0000387087 00000 n 0000390381 00000 n 0000390050 00000 n 0000390216 00000 n 0001254949 00000 n 0000394750 00000 n 0000393596 00000 n 0000390639 00000 n 0000394429 00000 n 0000393760 00000 n 0000393927 00000 n 0000394094 00000 n 0000394262 00000 n 0000401599 00000 n 0000398818 00000 n 0000394865 00000 n 0000401406 00000 n 0000399072 00000 n 0000399241 00000 n 0000399410 00000 n 0000399578 00000 n 0000399747 00000 n 0000399914 00000 n 0000400080 00000 n 0000400246 00000 n 0000400414 00000 n 0000400576 00000 n 0000400739 00000 n 0000400906 00000 n 0000401072 00000 n 0000401239 00000 n 0000410469 00000 n 0000406748 00000 n 0000401728 00000 n 0000410404 00000 n 0000407056 00000 n 0000407225 00000 n 0000407393 00000 n 0000407561 00000 n 0000407728 00000 n 0000407896 00000 n 0000408064 00000 n 0000408227 00000 n 0000408390 00000 n 0000408559 00000 n 0000408728 00000 n 0000408896 00000 n 0000409064 00000 n 0000409232 00000 n 0000409400 00000 n 0000409569 00000 n 0000409738 00000 n 0000409905 00000 n 0000410072 00000 n 0000410238 00000 n 0000412715 00000 n 0000412343 00000 n 0000410584 00000 n 0000412459 00000 n 0000416372 00000 n 0000415699 00000 n 0000412816 00000 n 0000416179 00000 n 0000415845 00000 n 0000416011 00000 n 0000420711 00000 n 0000420530 00000 n 0000416487 00000 n 0000420646 00000 n 0001255074 00000 n 0000424876 00000 n 0000424213 00000 n 0000420826 00000 n 0000424683 00000 n 0000424359 00000 n 0000424521 00000 n 0000427949 00000 n 0000427277 00000 n 0000424991 00000 n 0000427757 00000 n 0000427423 00000 n 0000427591 00000 n 0000432027 00000 n 0000431351 00000 n 0000428064 00000 n 0000431835 00000 n 0000431497 00000 n 0000431666 00000 n 0000436133 00000 n 0000434752 00000 n 0000432142 00000 n 0000435942 00000 n 0000434934 00000 n 0000435103 00000 n 0000435271 00000 n 0000435439 00000 n 0000435607 00000 n 0000435774 00000 n 0000439447 00000 n 0000439203 00000 n 0000436234 00000 n 0000439319 00000 n 0000442207 00000 n 0000441835 00000 n 0000439562 00000 n 0000441951 00000 n 0001255199 00000 n 0000446556 00000 n 0000445589 00000 n 0000442308 00000 n 0000446427 00000 n 0000445753 00000 n 0000445922 00000 n 0000446091 00000 n 0000446260 00000 n 0000450129 00000 n 0000449034 00000 n 0000446657 00000 n 0000449872 00000 n 0000449198 00000 n 0000449366 00000 n 0000449534 00000 n 0000449703 00000 n 0000453948 00000 n 0000453278 00000 n 0000450230 00000 n 0000453757 00000 n 0000453424 00000 n 0000453590 00000 n 0000458583 00000 n 0000456851 00000 n 0000454049 00000 n 0000458390 00000 n 0000457051 00000 n 0000457217 00000 n 0000457384 00000 n 0000457553 00000 n 0000457722 00000 n 0000457890 00000 n 0000458058 00000 n 0000458224 00000 n 0000462867 00000 n 0000461793 00000 n 0000458684 00000 n 0000462611 00000 n 0000461957 00000 n 0000462123 00000 n 0000462291 00000 n 0000462451 00000 n 0000467225 00000 n 0000466555 00000 n 0000462982 00000 n 0000467032 00000 n 0000466701 00000 n 0000466867 00000 n 0001255324 00000 n 0000471278 00000 n 0000470605 00000 n 0000467326 00000 n 0000471085 00000 n 0000470751 00000 n 0000470918 00000 n 0000475303 00000 n 0000474631 00000 n 0000471379 00000 n 0000475110 00000 n 0000474777 00000 n 0000474944 00000 n 0000480198 00000 n 0000479239 00000 n 0000475418 00000 n 0000480069 00000 n 0000479403 00000 n 0000479569 00000 n 0000479735 00000 n 0000479903 00000 n 0000483839 00000 n 0000483594 00000 n 0000480313 00000 n 0000483710 00000 n 0000487951 00000 n 0000487276 00000 n 0000483940 00000 n 0000487758 00000 n 0000487422 00000 n 0000487590 00000 n 0000491437 00000 n 0000491128 00000 n 0000488052 00000 n 0000491244 00000 n 0001255449 00000 n 0000494937 00000 n 0000494264 00000 n 0000491552 00000 n 0000494744 00000 n 0000494410 00000 n 0000494578 00000 n 0000499808 00000 n 0000498087 00000 n 0000495038 00000 n 0000499615 00000 n 0000498287 00000 n 0000498455 00000 n 0000498623 00000 n 0000498789 00000 n 0000498955 00000 n 0000499118 00000 n 0000499283 00000 n 0000499449 00000 n 0000504106 00000 n 0000503142 00000 n 0000499923 00000 n 0000503977 00000 n 0000503306 00000 n 0000503474 00000 n 0000503642 00000 n 0000503810 00000 n 0000508711 00000 n 0000508101 00000 n 0000504221 00000 n 0000508582 00000 n 0000508247 00000 n 0000508415 00000 n 0000513150 00000 n 0000512200 00000 n 0000508826 00000 n 0000513021 00000 n 0000512364 00000 n 0000512532 00000 n 0000512699 00000 n 0000512861 00000 n 0000518380 00000 n 0000516659 00000 n 0000513279 00000 n 0000518187 00000 n 0000516859 00000 n 0000517027 00000 n 0000517194 00000 n 0000517359 00000 n 0000517524 00000 n 0000517689 00000 n 0000517855 00000 n 0000518021 00000 n 0001255574 00000 n 0000522670 00000 n 0000522425 00000 n 0000518495 00000 n 0000522541 00000 n 0000526864 00000 n 0000526683 00000 n 0000522785 00000 n 0000526799 00000 n 0000533460 00000 n 0000531795 00000 n 0000526993 00000 n 0000533331 00000 n 0000531995 00000 n 0000532163 00000 n 0000532329 00000 n 0000532496 00000 n 0000532663 00000 n 0000532829 00000 n 0000532995 00000 n 0000533163 00000 n 0000538500 00000 n 0000536836 00000 n 0000533589 00000 n 0000538371 00000 n 0000537036 00000 n 0000537203 00000 n 0000537370 00000 n 0000537536 00000 n 0000537703 00000 n 0000537870 00000 n 0000538037 00000 n 0000538204 00000 n 0000542274 00000 n 0000541599 00000 n 0000538601 00000 n 0000542081 00000 n 0000541745 00000 n 0000541913 00000 n 0000544978 00000 n 0000544797 00000 n 0000542389 00000 n 0000544913 00000 n 0001255699 00000 n 0000548283 00000 n 0000547974 00000 n 0000545079 00000 n 0000548090 00000 n 0000554398 00000 n 0000552023 00000 n 0000548398 00000 n 0000554270 00000 n 0000552259 00000 n 0000552425 00000 n 0000552592 00000 n 0000552760 00000 n 0000552928 00000 n 0000553096 00000 n 0000553263 00000 n 0000553431 00000 n 0000553599 00000 n 0000553768 00000 n 0000553936 00000 n 0000554103 00000 n 0000561065 00000 n 0000557518 00000 n 0000554499 00000 n 0000560808 00000 n 0000557808 00000 n 0000557971 00000 n 0000558134 00000 n 0000558302 00000 n 0000558469 00000 n 0000558637 00000 n 0000558805 00000 n 0000558973 00000 n 0000559140 00000 n 0000559308 00000 n 0000559475 00000 n 0000559643 00000 n 0000559810 00000 n 0000559978 00000 n 0000560146 00000 n 0000560312 00000 n 0000560477 00000 n 0000560643 00000 n 0000567965 00000 n 0000564831 00000 n 0000561180 00000 n 0000567772 00000 n 0000565103 00000 n 0000565271 00000 n 0000565438 00000 n 0000565606 00000 n 0000565774 00000 n 0000565942 00000 n 0000566109 00000 n 0000566277 00000 n 0000566444 00000 n 0000566612 00000 n 0000566777 00000 n 0000566945 00000 n 0000567113 00000 n 0000567278 00000 n 0000567442 00000 n 0000567607 00000 n 0000573866 00000 n 0000571436 00000 n 0000568066 00000 n 0000573673 00000 n 0000571672 00000 n 0000571840 00000 n 0000572005 00000 n 0000572173 00000 n 0000572341 00000 n 0000572509 00000 n 0000572676 00000 n 0000572844 00000 n 0000573011 00000 n 0000573178 00000 n 0000573341 00000 n 0000573507 00000 n 0000579024 00000 n 0000576890 00000 n 0000573967 00000 n 0000578767 00000 n 0000577108 00000 n 0000577275 00000 n 0000577441 00000 n 0000577608 00000 n 0000577775 00000 n 0000577943 00000 n 0000578111 00000 n 0000578274 00000 n 0000578435 00000 n 0000578601 00000 n 0001255824 00000 n 0000580992 00000 n 0000580621 00000 n 0000579139 00000 n 0000580737 00000 n 0000585735 00000 n 0000583240 00000 n 0000581093 00000 n 0000585478 00000 n 0000583476 00000 n 0000583643 00000 n 0000583808 00000 n 0000583976 00000 n 0000584143 00000 n 0000584311 00000 n 0000584479 00000 n 0000584647 00000 n 0000584815 00000 n 0000584982 00000 n 0000585148 00000 n 0000585313 00000 n 0000588210 00000 n 0000588029 00000 n 0000585850 00000 n 0000588145 00000 n 0000591532 00000 n 0000590516 00000 n 0000588311 00000 n 0000591339 00000 n 0000590680 00000 n 0000590847 00000 n 0000591015 00000 n 0000591177 00000 n 0000594985 00000 n 0000594312 00000 n 0000591647 00000 n 0000594793 00000 n 0000594458 00000 n 0000594625 00000 n 0000599733 00000 n 0000598350 00000 n 0000595100 00000 n 0000599540 00000 n 0000598532 00000 n 0000598701 00000 n 0000598870 00000 n 0000599038 00000 n 0000599205 00000 n 0000599373 00000 n 0001255949 00000 n 0000602687 00000 n 0000602314 00000 n 0000599862 00000 n 0000602430 00000 n 0000605441 00000 n 0000605132 00000 n 0000602802 00000 n 0000605248 00000 n 0000608579 00000 n 0000608271 00000 n 0000605556 00000 n 0000608387 00000 n 0000612194 00000 n 0000611888 00000 n 0000608694 00000 n 0000612004 00000 n 0000617277 00000 n 0000615967 00000 n 0000612295 00000 n 0000617148 00000 n 0000616149 00000 n 0000616317 00000 n 0000616484 00000 n 0000616650 00000 n 0000616816 00000 n 0000616982 00000 n 0000621564 00000 n 0000620542 00000 n 0000617392 00000 n 0000621371 00000 n 0000620706 00000 n 0000620874 00000 n 0000621041 00000 n 0000621206 00000 n 0001256074 00000 n 0000625348 00000 n 0000624322 00000 n 0000621693 00000 n 0000625155 00000 n 0000624486 00000 n 0000624655 00000 n 0000624824 00000 n 0000624990 00000 n 0000628062 00000 n 0000627689 00000 n 0000625477 00000 n 0000627805 00000 n 0000630083 00000 n 0000629347 00000 n 0000628191 00000 n 0000629827 00000 n 0000629493 00000 n 0000629660 00000 n 0000631533 00000 n 0000631225 00000 n 0000630184 00000 n 0000631341 00000 n 0000632803 00000 n 0000632430 00000 n 0000631634 00000 n 0000632546 00000 n 0000636212 00000 n 0000635193 00000 n 0000632918 00000 n 0000636019 00000 n 0000635357 00000 n 0000635523 00000 n 0000635689 00000 n 0000635854 00000 n 0001256199 00000 n 0000640157 00000 n 0000639480 00000 n 0000636327 00000 n 0000639964 00000 n 0000639626 00000 n 0000639795 00000 n 0000645771 00000 n 0000644811 00000 n 0000640300 00000 n 0000645643 00000 n 0000644975 00000 n 0000645142 00000 n 0000645309 00000 n 0000645476 00000 n 0000649442 00000 n 0000648416 00000 n 0000645914 00000 n 0000649250 00000 n 0000648580 00000 n 0000648748 00000 n 0000648916 00000 n 0000649083 00000 n 0000653042 00000 n 0000652077 00000 n 0000649543 00000 n 0000652913 00000 n 0000652241 00000 n 0000652409 00000 n 0000652577 00000 n 0000652745 00000 n 0000657582 00000 n 0000656907 00000 n 0000653157 00000 n 0000657389 00000 n 0000657053 00000 n 0000657221 00000 n 0000660140 00000 n 0000659959 00000 n 0000657711 00000 n 0000660075 00000 n 0001256324 00000 n 0000661220 00000 n 0000661039 00000 n 0000660255 00000 n 0000661155 00000 n 0000665156 00000 n 0000664484 00000 n 0000661321 00000 n 0000664964 00000 n 0000664630 00000 n 0000664797 00000 n 0000669744 00000 n 0000669136 00000 n 0000665299 00000 n 0000669616 00000 n 0000669282 00000 n 0000669449 00000 n 0000673161 00000 n 0000672136 00000 n 0000669859 00000 n 0000672968 00000 n 0000672300 00000 n 0000672467 00000 n 0000672634 00000 n 0000672801 00000 n 0000681063 00000 n 0000676835 00000 n 0000673276 00000 n 0000680806 00000 n 0000677161 00000 n 0000677324 00000 n 0000677487 00000 n 0000677654 00000 n 0000677821 00000 n 0000677989 00000 n 0000678157 00000 n 0000678326 00000 n 0000678494 00000 n 0000678661 00000 n 0000678828 00000 n 0000678996 00000 n 0000679163 00000 n 0000679324 00000 n 0000679485 00000 n 0000679652 00000 n 0000679818 00000 n 0000679982 00000 n 0000680147 00000 n 0000680312 00000 n 0000680476 00000 n 0000680641 00000 n 0000685447 00000 n 0000683796 00000 n 0000681206 00000 n 0000685318 00000 n 0000683996 00000 n 0000684163 00000 n 0000684330 00000 n 0000684492 00000 n 0000684653 00000 n 0000684821 00000 n 0000684988 00000 n 0000685153 00000 n 0001256449 00000 n 0000689148 00000 n 0000688409 00000 n 0000685548 00000 n 0000688891 00000 n 0000688555 00000 n 0000688723 00000 n 0000691788 00000 n 0000691415 00000 n 0000689263 00000 n 0000691531 00000 n 0000694159 00000 n 0000693786 00000 n 0000691903 00000 n 0000693902 00000 n 0000698092 00000 n 0000697719 00000 n 0000694288 00000 n 0000697835 00000 n 0000701575 00000 n 0000700839 00000 n 0000698221 00000 n 0000701320 00000 n 0000700985 00000 n 0000701152 00000 n 0000705083 00000 n 0000704070 00000 n 0000701704 00000 n 0000704890 00000 n 0000704234 00000 n 0000704396 00000 n 0000704556 00000 n 0000704722 00000 n 0001256574 00000 n 0000708591 00000 n 0000707503 00000 n 0000705226 00000 n 0000708335 00000 n 0000707667 00000 n 0000707835 00000 n 0000708002 00000 n 0000708169 00000 n 0000712433 00000 n 0000711053 00000 n 0000708706 00000 n 0000712238 00000 n 0000711235 00000 n 0000711403 00000 n 0000711571 00000 n 0000711739 00000 n 0000711906 00000 n 0000712072 00000 n 0000716614 00000 n 0000715234 00000 n 0000712548 00000 n 0000716419 00000 n 0000715416 00000 n 0000715584 00000 n 0000715751 00000 n 0000715919 00000 n 0000716086 00000 n 0000716253 00000 n 0000721425 00000 n 0000720111 00000 n 0000716729 00000 n 0000721295 00000 n 0000720293 00000 n 0000720461 00000 n 0000720628 00000 n 0000720796 00000 n 0000720963 00000 n 0000721129 00000 n 0000726667 00000 n 0000724642 00000 n 0000721554 00000 n 0000726538 00000 n 0000724860 00000 n 0000725029 00000 n 0000725198 00000 n 0000725366 00000 n 0000725533 00000 n 0000725701 00000 n 0000725868 00000 n 0000726036 00000 n 0000726203 00000 n 0000726371 00000 n 0000730967 00000 n 0000729586 00000 n 0000726810 00000 n 0000730772 00000 n 0000729768 00000 n 0000729935 00000 n 0000730101 00000 n 0000730269 00000 n 0000730437 00000 n 0000730605 00000 n 0001256699 00000 n 0000734820 00000 n 0000733446 00000 n 0000731082 00000 n 0000734626 00000 n 0000733628 00000 n 0000733795 00000 n 0000733962 00000 n 0000734129 00000 n 0000734295 00000 n 0000734461 00000 n 0000737560 00000 n 0000736886 00000 n 0000734935 00000 n 0000737365 00000 n 0000737032 00000 n 0000737199 00000 n 0000740816 00000 n 0000740144 00000 n 0000737675 00000 n 0000740621 00000 n 0000740290 00000 n 0000740456 00000 n 0000745516 00000 n 0000744134 00000 n 0000740931 00000 n 0000745321 00000 n 0000744316 00000 n 0000744483 00000 n 0000744651 00000 n 0000744818 00000 n 0000744984 00000 n 0000745152 00000 n 0000749653 00000 n 0000748270 00000 n 0000745631 00000 n 0000749458 00000 n 0000748452 00000 n 0000748620 00000 n 0000748787 00000 n 0000748956 00000 n 0000749123 00000 n 0000749291 00000 n 0000752726 00000 n 0000751697 00000 n 0000749768 00000 n 0000752531 00000 n 0000751861 00000 n 0000752029 00000 n 0000752196 00000 n 0000752364 00000 n 0001256824 00000 n 0000756079 00000 n 0000755339 00000 n 0000752841 00000 n 0000755820 00000 n 0000755485 00000 n 0000755653 00000 n 0000761861 00000 n 0000760133 00000 n 0000756208 00000 n 0000761667 00000 n 0000760333 00000 n 0000760496 00000 n 0000760659 00000 n 0000760827 00000 n 0000760994 00000 n 0000761163 00000 n 0000761332 00000 n 0000761500 00000 n 0000767927 00000 n 0000765142 00000 n 0000762018 00000 n 0000767733 00000 n 0000765396 00000 n 0000765565 00000 n 0000765734 00000 n 0000765902 00000 n 0000766070 00000 n 0000766233 00000 n 0000766395 00000 n 0000766563 00000 n 0000766730 00000 n 0000766898 00000 n 0000767066 00000 n 0000767234 00000 n 0000767402 00000 n 0000767568 00000 n 0000772967 00000 n 0000771261 00000 n 0000768042 00000 n 0000772773 00000 n 0000771461 00000 n 0000771622 00000 n 0000771785 00000 n 0000771952 00000 n 0000772118 00000 n 0000772279 00000 n 0000772440 00000 n 0000772607 00000 n 0000777017 00000 n 0000775989 00000 n 0000773082 00000 n 0000776823 00000 n 0000776153 00000 n 0000776321 00000 n 0000776488 00000 n 0000776656 00000 n 0000781258 00000 n 0000780293 00000 n 0000777132 00000 n 0000781129 00000 n 0000780457 00000 n 0000780626 00000 n 0000780794 00000 n 0000780962 00000 n 0001256949 00000 n 0000784275 00000 n 0000783475 00000 n 0000781373 00000 n 0000783950 00000 n 0000783621 00000 n 0000783785 00000 n 0000786679 00000 n 0000785941 00000 n 0000784390 00000 n 0000786420 00000 n 0000786087 00000 n 0000786253 00000 n 0000789547 00000 n 0000788264 00000 n 0000786794 00000 n 0000788380 00000 n 0000797044 00000 n 0000795086 00000 n 0000789648 00000 n 0000796785 00000 n 0000795295 00000 n 0000795463 00000 n 0000795621 00000 n 0000795783 00000 n 0000795951 00000 n 0000796119 00000 n 0000796286 00000 n 0000796453 00000 n 0000796620 00000 n 0000954109 00000 n 0000954174 00000 n 0000801490 00000 n 0000800761 00000 n 0000797201 00000 n 0000801231 00000 n 0000800907 00000 n 0000801069 00000 n 0000805419 00000 n 0000804350 00000 n 0000801605 00000 n 0000805160 00000 n 0000804514 00000 n 0000804676 00000 n 0000804838 00000 n 0000804999 00000 n 0001257074 00000 n 0000808623 00000 n 0000808247 00000 n 0000805562 00000 n 0000808363 00000 n 0000811667 00000 n 0000811357 00000 n 0000808738 00000 n 0000811473 00000 n 0000815240 00000 n 0000813829 00000 n 0000811782 00000 n 0000814981 00000 n 0000814011 00000 n 0000814173 00000 n 0000814335 00000 n 0000814496 00000 n 0000814657 00000 n 0000814819 00000 n 0000819406 00000 n 0000818792 00000 n 0000815355 00000 n 0000819276 00000 n 0000818938 00000 n 0000819107 00000 n 0000824926 00000 n 0000821869 00000 n 0000819521 00000 n 0000824797 00000 n 0000822141 00000 n 0000822308 00000 n 0000822475 00000 n 0000822644 00000 n 0000822813 00000 n 0000822980 00000 n 0000823146 00000 n 0000823308 00000 n 0000823470 00000 n 0000823637 00000 n 0000823803 00000 n 0000823969 00000 n 0000824135 00000 n 0000824301 00000 n 0000824467 00000 n 0000824632 00000 n 0000830092 00000 n 0000827619 00000 n 0000825027 00000 n 0000829832 00000 n 0000827855 00000 n 0000828022 00000 n 0000828188 00000 n 0000828355 00000 n 0000828521 00000 n 0000828682 00000 n 0000828843 00000 n 0000829004 00000 n 0000829166 00000 n 0000829333 00000 n 0000829499 00000 n 0000829665 00000 n 0001257199 00000 n 0000834780 00000 n 0000833814 00000 n 0000830235 00000 n 0000834650 00000 n 0000833978 00000 n 0000834147 00000 n 0000834316 00000 n 0000834483 00000 n 0000839813 00000 n 0000838146 00000 n 0000834881 00000 n 0000839683 00000 n 0000838346 00000 n 0000838512 00000 n 0000838679 00000 n 0000838848 00000 n 0000839017 00000 n 0000839183 00000 n 0000839349 00000 n 0000839516 00000 n 0000843357 00000 n 0000842617 00000 n 0000839955 00000 n 0000843097 00000 n 0000842763 00000 n 0000842930 00000 n 0000846850 00000 n 0000846179 00000 n 0000843486 00000 n 0000846658 00000 n 0000846325 00000 n 0000846492 00000 n 0000850610 00000 n 0000850003 00000 n 0000846965 00000 n 0000850480 00000 n 0000850149 00000 n 0000850314 00000 n 0000854369 00000 n 0000854059 00000 n 0000850725 00000 n 0000854175 00000 n 0001257324 00000 n 0000859077 00000 n 0000858056 00000 n 0000854498 00000 n 0000858882 00000 n 0000858220 00000 n 0000858387 00000 n 0000858553 00000 n 0000858718 00000 n 0000859683 00000 n 0000859502 00000 n 0000859206 00000 n 0000859618 00000 n 0000860209 00000 n 0000860028 00000 n 0000859756 00000 n 0000860144 00000 n 0000865580 00000 n 0000864075 00000 n 0000860282 00000 n 0000865256 00000 n 0000864257 00000 n 0000864425 00000 n 0000864593 00000 n 0000864759 00000 n 0000864925 00000 n 0000865091 00000 n 0000870849 00000 n 0000869899 00000 n 0000865709 00000 n 0000870719 00000 n 0000870063 00000 n 0000870225 00000 n 0000870386 00000 n 0000870553 00000 n 0000874891 00000 n 0000873800 00000 n 0000870964 00000 n 0000874631 00000 n 0000873964 00000 n 0000874131 00000 n 0000874298 00000 n 0000874465 00000 n 0001257449 00000 n 0000881043 00000 n 0000879667 00000 n 0000875020 00000 n 0000880848 00000 n 0000879849 00000 n 0000880016 00000 n 0000880183 00000 n 0000880349 00000 n 0000880514 00000 n 0000880681 00000 n 0000883160 00000 n 0000882914 00000 n 0000881200 00000 n 0000883030 00000 n 0000885304 00000 n 0000885123 00000 n 0000883261 00000 n 0000885239 00000 n 0000887742 00000 n 0000887130 00000 n 0000885391 00000 n 0000887612 00000 n 0000887276 00000 n 0000887444 00000 n 0000891775 00000 n 0000890413 00000 n 0000887843 00000 n 0000891580 00000 n 0000890595 00000 n 0000890761 00000 n 0000890926 00000 n 0000891088 00000 n 0000891249 00000 n 0000891415 00000 n 0000896673 00000 n 0000895650 00000 n 0000891918 00000 n 0000896478 00000 n 0000895814 00000 n 0000895981 00000 n 0000896148 00000 n 0000896313 00000 n 0001257574 00000 n 0000900317 00000 n 0000899357 00000 n 0000896788 00000 n 0000900187 00000 n 0000899521 00000 n 0000899687 00000 n 0000899854 00000 n 0000900020 00000 n 0000905215 00000 n 0000903631 00000 n 0000900432 00000 n 0000905150 00000 n 0000903831 00000 n 0000903998 00000 n 0000904165 00000 n 0000904332 00000 n 0000904498 00000 n 0000904664 00000 n 0000904830 00000 n 0000904990 00000 n 0000908730 00000 n 0000907356 00000 n 0000905316 00000 n 0000908535 00000 n 0000907538 00000 n 0000907704 00000 n 0000907871 00000 n 0000908038 00000 n 0000908205 00000 n 0000908370 00000 n 0000912141 00000 n 0000911466 00000 n 0000908831 00000 n 0000911946 00000 n 0000911612 00000 n 0000911779 00000 n 0000918331 00000 n 0000915018 00000 n 0000912256 00000 n 0000917942 00000 n 0000915290 00000 n 0000915456 00000 n 0000915622 00000 n 0000915789 00000 n 0000915956 00000 n 0000916117 00000 n 0000916278 00000 n 0000916445 00000 n 0000916611 00000 n 0000916777 00000 n 0000916944 00000 n 0000917112 00000 n 0000917280 00000 n 0000917446 00000 n 0000917612 00000 n 0000917777 00000 n 0000923494 00000 n 0000921641 00000 n 0000918460 00000 n 0000923170 00000 n 0000921841 00000 n 0000922008 00000 n 0000922175 00000 n 0000922342 00000 n 0000922509 00000 n 0000922676 00000 n 0000922842 00000 n 0000923007 00000 n 0001257699 00000 n 0000929056 00000 n 0000926907 00000 n 0000923637 00000 n 0000928796 00000 n 0000927125 00000 n 0000927292 00000 n 0000927458 00000 n 0000927625 00000 n 0000927792 00000 n 0000927958 00000 n 0000928126 00000 n 0000928293 00000 n 0000928460 00000 n 0000928628 00000 n 0000934798 00000 n 0000933009 00000 n 0000929171 00000 n 0000934538 00000 n 0000933209 00000 n 0000933377 00000 n 0000933545 00000 n 0000933712 00000 n 0000933879 00000 n 0000934044 00000 n 0000934210 00000 n 0000934374 00000 n 0000938964 00000 n 0000938354 00000 n 0000934927 00000 n 0000938834 00000 n 0000938500 00000 n 0000938667 00000 n 0000941407 00000 n 0000941226 00000 n 0000939079 00000 n 0000941342 00000 n 0000943650 00000 n 0000943404 00000 n 0000941494 00000 n 0000943520 00000 n 0000947768 00000 n 0000946452 00000 n 0000943751 00000 n 0000947638 00000 n 0001135057 00000 n 0001132336 00000 n 0001134891 00000 n 0000946634 00000 n 0000946802 00000 n 0000946968 00000 n 0000947136 00000 n 0000947304 00000 n 0000947471 00000 n 0001257824 00000 n 0000949953 00000 n 0000949707 00000 n 0000947883 00000 n 0000949823 00000 n 0000951326 00000 n 0000951145 00000 n 0000950054 00000 n 0000951261 00000 n 0000951840 00000 n 0000951659 00000 n 0000951413 00000 n 0000951775 00000 n 0000954304 00000 n 0000953474 00000 n 0000951913 00000 n 0000953590 00000 n 0000953655 00000 n 0000954815 00000 n 0000954634 00000 n 0000954419 00000 n 0000954750 00000 n 0000975878 00000 n 0000956342 00000 n 0000954888 00000 n 0000975748 00000 n 0000957532 00000 n 0000957685 00000 n 0000957840 00000 n 0000957995 00000 n 0000958148 00000 n 0000958303 00000 n 0000958458 00000 n 0000958612 00000 n 0000958766 00000 n 0000958920 00000 n 0000959073 00000 n 0000959227 00000 n 0000959381 00000 n 0000959536 00000 n 0000959690 00000 n 0000959844 00000 n 0000959999 00000 n 0000960153 00000 n 0000960305 00000 n 0000960461 00000 n 0000960616 00000 n 0000960770 00000 n 0000960926 00000 n 0000961082 00000 n 0000961237 00000 n 0000961393 00000 n 0000961548 00000 n 0000961702 00000 n 0000961858 00000 n 0000962014 00000 n 0000962170 00000 n 0000962325 00000 n 0000962480 00000 n 0000962635 00000 n 0000962791 00000 n 0000962946 00000 n 0000963102 00000 n 0000963258 00000 n 0000963412 00000 n 0000963567 00000 n 0000963722 00000 n 0000963876 00000 n 0000964029 00000 n 0000964183 00000 n 0000964338 00000 n 0000964493 00000 n 0000964648 00000 n 0000964802 00000 n 0000964955 00000 n 0000965109 00000 n 0000965263 00000 n 0000965415 00000 n 0000965568 00000 n 0000965719 00000 n 0000965872 00000 n 0000966024 00000 n 0000966177 00000 n 0000966332 00000 n 0000966486 00000 n 0000966640 00000 n 0000966794 00000 n 0000966947 00000 n 0000967102 00000 n 0000967257 00000 n 0000967412 00000 n 0000967567 00000 n 0000967722 00000 n 0000967877 00000 n 0000968032 00000 n 0000968187 00000 n 0000968342 00000 n 0000968496 00000 n 0000968651 00000 n 0000968806 00000 n 0000968961 00000 n 0000969116 00000 n 0000969271 00000 n 0000969426 00000 n 0000969580 00000 n 0000969735 00000 n 0000969890 00000 n 0000970045 00000 n 0000970200 00000 n 0000970355 00000 n 0000970510 00000 n 0000970664 00000 n 0000970819 00000 n 0000970973 00000 n 0000971125 00000 n 0000971279 00000 n 0000971434 00000 n 0000971589 00000 n 0000971744 00000 n 0000971899 00000 n 0000972053 00000 n 0000972207 00000 n 0000972361 00000 n 0000972515 00000 n 0000972670 00000 n 0000972824 00000 n 0000972979 00000 n 0000973133 00000 n 0000973287 00000 n 0000973440 00000 n 0000973593 00000 n 0000973748 00000 n 0000973903 00000 n 0000974058 00000 n 0000974213 00000 n 0000974367 00000 n 0000974522 00000 n 0000974677 00000 n 0000974831 00000 n 0000974984 00000 n 0000975137 00000 n 0000975289 00000 n 0000975442 00000 n 0000975595 00000 n 0001257949 00000 n 0001004796 00000 n 0000979749 00000 n 0000975979 00000 n 0001004731 00000 n 0000981245 00000 n 0000981398 00000 n 0000981551 00000 n 0000981704 00000 n 0000981857 00000 n 0000982010 00000 n 0000982165 00000 n 0000982319 00000 n 0000982473 00000 n 0000982629 00000 n 0000982784 00000 n 0000982937 00000 n 0000983091 00000 n 0000983245 00000 n 0000983400 00000 n 0000983555 00000 n 0000983711 00000 n 0000983864 00000 n 0000984020 00000 n 0000984176 00000 n 0000984331 00000 n 0000984486 00000 n 0000984641 00000 n 0000984795 00000 n 0000984950 00000 n 0000985105 00000 n 0000985260 00000 n 0000985416 00000 n 0000985572 00000 n 0000985728 00000 n 0000985882 00000 n 0000986037 00000 n 0000986192 00000 n 0000986346 00000 n 0000986501 00000 n 0000986656 00000 n 0000986812 00000 n 0000986967 00000 n 0000987121 00000 n 0000987274 00000 n 0000987428 00000 n 0000987583 00000 n 0000987738 00000 n 0000987893 00000 n 0000988048 00000 n 0000988203 00000 n 0000988359 00000 n 0000988514 00000 n 0000988669 00000 n 0000988823 00000 n 0000988977 00000 n 0000989132 00000 n 0000989286 00000 n 0000989440 00000 n 0000989596 00000 n 0000989750 00000 n 0000989905 00000 n 0000990060 00000 n 0000990215 00000 n 0000990370 00000 n 0000990525 00000 n 0000990679 00000 n 0000990833 00000 n 0000990989 00000 n 0000991144 00000 n 0000991299 00000 n 0000991455 00000 n 0000991611 00000 n 0000991765 00000 n 0000991917 00000 n 0000992069 00000 n 0000992223 00000 n 0000992376 00000 n 0000992529 00000 n 0000992682 00000 n 0000992834 00000 n 0000992987 00000 n 0000993139 00000 n 0000993293 00000 n 0000993447 00000 n 0000993602 00000 n 0000993756 00000 n 0000993911 00000 n 0000994067 00000 n 0000994223 00000 n 0000994379 00000 n 0000994533 00000 n 0000994687 00000 n 0000994840 00000 n 0000994993 00000 n 0000995149 00000 n 0000995305 00000 n 0000995461 00000 n 0000995615 00000 n 0000995770 00000 n 0000995925 00000 n 0000996080 00000 n 0000996235 00000 n 0000996388 00000 n 0000996543 00000 n 0000996696 00000 n 0000996852 00000 n 0000997007 00000 n 0000997162 00000 n 0000997317 00000 n 0000997472 00000 n 0000997625 00000 n 0000997778 00000 n 0000997932 00000 n 0000998086 00000 n 0000998240 00000 n 0000998394 00000 n 0000998548 00000 n 0000998703 00000 n 0000998858 00000 n 0000999010 00000 n 0000999165 00000 n 0000999320 00000 n 0000999476 00000 n 0000999631 00000 n 0000999784 00000 n 0000999939 00000 n 0001000094 00000 n 0001000249 00000 n 0001000405 00000 n 0001000560 00000 n 0001000716 00000 n 0001000871 00000 n 0001001026 00000 n 0001001181 00000 n 0001001337 00000 n 0001001491 00000 n 0001001647 00000 n 0001001802 00000 n 0001001954 00000 n 0001002109 00000 n 0001002265 00000 n 0001002420 00000 n 0001002575 00000 n 0001002730 00000 n 0001002886 00000 n 0001003040 00000 n 0001003195 00000 n 0001003349 00000 n 0001003503 00000 n 0001003658 00000 n 0001003811 00000 n 0001003964 00000 n 0001004118 00000 n 0001004271 00000 n 0001004424 00000 n 0001004578 00000 n 0001030475 00000 n 0001008979 00000 n 0001004897 00000 n 0001030410 00000 n 0001010277 00000 n 0001010432 00000 n 0001010587 00000 n 0001010742 00000 n 0001010897 00000 n 0001011052 00000 n 0001011208 00000 n 0001011364 00000 n 0001011520 00000 n 0001011675 00000 n 0001011830 00000 n 0001011986 00000 n 0001012142 00000 n 0001012296 00000 n 0001012450 00000 n 0001012604 00000 n 0001012758 00000 n 0001012912 00000 n 0001013066 00000 n 0001013220 00000 n 0001013374 00000 n 0001013529 00000 n 0001013683 00000 n 0001013837 00000 n 0001013991 00000 n 0001014145 00000 n 0001014300 00000 n 0001014455 00000 n 0001014610 00000 n 0001014765 00000 n 0001014921 00000 n 0001015076 00000 n 0001015230 00000 n 0001015385 00000 n 0001015540 00000 n 0001015696 00000 n 0001015852 00000 n 0001016007 00000 n 0001016161 00000 n 0001016314 00000 n 0001016467 00000 n 0001016622 00000 n 0001016777 00000 n 0001016933 00000 n 0001017089 00000 n 0001017245 00000 n 0001017401 00000 n 0001017556 00000 n 0001017711 00000 n 0001017865 00000 n 0001018021 00000 n 0001018176 00000 n 0001018332 00000 n 0001018488 00000 n 0001018643 00000 n 0001018798 00000 n 0001018954 00000 n 0001019110 00000 n 0001019266 00000 n 0001019422 00000 n 0001019576 00000 n 0001019729 00000 n 0001019881 00000 n 0001020035 00000 n 0001020188 00000 n 0001020341 00000 n 0001020495 00000 n 0001020649 00000 n 0001020802 00000 n 0001020958 00000 n 0001021113 00000 n 0001021268 00000 n 0001021421 00000 n 0001021575 00000 n 0001021730 00000 n 0001021886 00000 n 0001022041 00000 n 0001022197 00000 n 0001022352 00000 n 0001022507 00000 n 0001022663 00000 n 0001022819 00000 n 0001022975 00000 n 0001023131 00000 n 0001023287 00000 n 0001023441 00000 n 0001023596 00000 n 0001023752 00000 n 0001023908 00000 n 0001024060 00000 n 0001024216 00000 n 0001024371 00000 n 0001024526 00000 n 0001024681 00000 n 0001024836 00000 n 0001024991 00000 n 0001025146 00000 n 0001025300 00000 n 0001025455 00000 n 0001025609 00000 n 0001025764 00000 n 0001025920 00000 n 0001026075 00000 n 0001026229 00000 n 0001026384 00000 n 0001026539 00000 n 0001026695 00000 n 0001026850 00000 n 0001027005 00000 n 0001027160 00000 n 0001027314 00000 n 0001027466 00000 n 0001027622 00000 n 0001027778 00000 n 0001027933 00000 n 0001028088 00000 n 0001028244 00000 n 0001028400 00000 n 0001028556 00000 n 0001028710 00000 n 0001028866 00000 n 0001029022 00000 n 0001029178 00000 n 0001029334 00000 n 0001029489 00000 n 0001029641 00000 n 0001029795 00000 n 0001029949 00000 n 0001030103 00000 n 0001030256 00000 n 0001057912 00000 n 0001033836 00000 n 0001030576 00000 n 0001057847 00000 n 0001035278 00000 n 0001035433 00000 n 0001035589 00000 n 0001035744 00000 n 0001035899 00000 n 0001036054 00000 n 0001036209 00000 n 0001036364 00000 n 0001036518 00000 n 0001036673 00000 n 0001036828 00000 n 0001036983 00000 n 0001037138 00000 n 0001037292 00000 n 0001037446 00000 n 0001037600 00000 n 0001037755 00000 n 0001037911 00000 n 0001038067 00000 n 0001038223 00000 n 0001038375 00000 n 0001038529 00000 n 0001038683 00000 n 0001038838 00000 n 0001038993 00000 n 0001039148 00000 n 0001039303 00000 n 0001039459 00000 n 0001039613 00000 n 0001039769 00000 n 0001039923 00000 n 0001040079 00000 n 0001040234 00000 n 0001040389 00000 n 0001040544 00000 n 0001040700 00000 n 0001040854 00000 n 0001041008 00000 n 0001041162 00000 n 0001041318 00000 n 0001041472 00000 n 0001041627 00000 n 0001041782 00000 n 0001041937 00000 n 0001042091 00000 n 0001042247 00000 n 0001042402 00000 n 0001042557 00000 n 0001042713 00000 n 0001042867 00000 n 0001043023 00000 n 0001043178 00000 n 0001043332 00000 n 0001043486 00000 n 0001043641 00000 n 0001043797 00000 n 0001043950 00000 n 0001044105 00000 n 0001044259 00000 n 0001044413 00000 n 0001044567 00000 n 0001044720 00000 n 0001044873 00000 n 0001045028 00000 n 0001045182 00000 n 0001045335 00000 n 0001045488 00000 n 0001045641 00000 n 0001045794 00000 n 0001045947 00000 n 0001046101 00000 n 0001046254 00000 n 0001046407 00000 n 0001046560 00000 n 0001046714 00000 n 0001046865 00000 n 0001047020 00000 n 0001047174 00000 n 0001047330 00000 n 0001047486 00000 n 0001047641 00000 n 0001047795 00000 n 0001047950 00000 n 0001048105 00000 n 0001048260 00000 n 0001048416 00000 n 0001048571 00000 n 0001048727 00000 n 0001048880 00000 n 0001049033 00000 n 0001049188 00000 n 0001049344 00000 n 0001049499 00000 n 0001049655 00000 n 0001049811 00000 n 0001049966 00000 n 0001050122 00000 n 0001050277 00000 n 0001050432 00000 n 0001050587 00000 n 0001050742 00000 n 0001050897 00000 n 0001051052 00000 n 0001051207 00000 n 0001051361 00000 n 0001051517 00000 n 0001051672 00000 n 0001051826 00000 n 0001051980 00000 n 0001052135 00000 n 0001052290 00000 n 0001052445 00000 n 0001052600 00000 n 0001052756 00000 n 0001052911 00000 n 0001053067 00000 n 0001053223 00000 n 0001053379 00000 n 0001053534 00000 n 0001053688 00000 n 0001053843 00000 n 0001053997 00000 n 0001054151 00000 n 0001054306 00000 n 0001054462 00000 n 0001054616 00000 n 0001054771 00000 n 0001054926 00000 n 0001055082 00000 n 0001055237 00000 n 0001055392 00000 n 0001055545 00000 n 0001055699 00000 n 0001055852 00000 n 0001056007 00000 n 0001056162 00000 n 0001056316 00000 n 0001056472 00000 n 0001056627 00000 n 0001056781 00000 n 0001056934 00000 n 0001057087 00000 n 0001057240 00000 n 0001057391 00000 n 0001057543 00000 n 0001057694 00000 n 0001089112 00000 n 0001061550 00000 n 0001058013 00000 n 0001089047 00000 n 0001063181 00000 n 0001063335 00000 n 0001063488 00000 n 0001063644 00000 n 0001063799 00000 n 0001063954 00000 n 0001064109 00000 n 0001064264 00000 n 0001064419 00000 n 0001064575 00000 n 0001064730 00000 n 0001064885 00000 n 0001065039 00000 n 0001065194 00000 n 0001065349 00000 n 0001065504 00000 n 0001065660 00000 n 0001065815 00000 n 0001065969 00000 n 0001066124 00000 n 0001066279 00000 n 0001066433 00000 n 0001066588 00000 n 0001066743 00000 n 0001066898 00000 n 0001067053 00000 n 0001067208 00000 n 0001067364 00000 n 0001067520 00000 n 0001067676 00000 n 0001067832 00000 n 0001067986 00000 n 0001068142 00000 n 0001068297 00000 n 0001068452 00000 n 0001068606 00000 n 0001068761 00000 n 0001068917 00000 n 0001069070 00000 n 0001069223 00000 n 0001069379 00000 n 0001069534 00000 n 0001069689 00000 n 0001069845 00000 n 0001069999 00000 n 0001070153 00000 n 0001070307 00000 n 0001070463 00000 n 0001070619 00000 n 0001070775 00000 n 0001070930 00000 n 0001071086 00000 n 0001071239 00000 n 0001071394 00000 n 0001071548 00000 n 0001071703 00000 n 0001071858 00000 n 0001072013 00000 n 0001072167 00000 n 0001072322 00000 n 0001072476 00000 n 0001072631 00000 n 0001072786 00000 n 0001072941 00000 n 0001073097 00000 n 0001073253 00000 n 0001073406 00000 n 0001073562 00000 n 0001073718 00000 n 0001073874 00000 n 0001074030 00000 n 0001074185 00000 n 0001074341 00000 n 0001074497 00000 n 0001074652 00000 n 0001074808 00000 n 0001074964 00000 n 0001075118 00000 n 0001075274 00000 n 0001075428 00000 n 0001075582 00000 n 0001075735 00000 n 0001075887 00000 n 0001076039 00000 n 0001076191 00000 n 0001076344 00000 n 0001076497 00000 n 0001076651 00000 n 0001076806 00000 n 0001076961 00000 n 0001077116 00000 n 0001077271 00000 n 0001077425 00000 n 0001077579 00000 n 0001077735 00000 n 0001077891 00000 n 0001078047 00000 n 0001078201 00000 n 0001078356 00000 n 0001078512 00000 n 0001078667 00000 n 0001078822 00000 n 0001078977 00000 n 0001079132 00000 n 0001079288 00000 n 0001079444 00000 n 0001079599 00000 n 0001079754 00000 n 0001079908 00000 n 0001080062 00000 n 0001080217 00000 n 0001080373 00000 n 0001080528 00000 n 0001080683 00000 n 0001080838 00000 n 0001080993 00000 n 0001081148 00000 n 0001081303 00000 n 0001081459 00000 n 0001081613 00000 n 0001081767 00000 n 0001081922 00000 n 0001082077 00000 n 0001082231 00000 n 0001082386 00000 n 0001082541 00000 n 0001082696 00000 n 0001082851 00000 n 0001083006 00000 n 0001083162 00000 n 0001083318 00000 n 0001083473 00000 n 0001083628 00000 n 0001083784 00000 n 0001083939 00000 n 0001084094 00000 n 0001084249 00000 n 0001084404 00000 n 0001084559 00000 n 0001084714 00000 n 0001084870 00000 n 0001085025 00000 n 0001085181 00000 n 0001085336 00000 n 0001085490 00000 n 0001085646 00000 n 0001085802 00000 n 0001085957 00000 n 0001086112 00000 n 0001086267 00000 n 0001086423 00000 n 0001086579 00000 n 0001086734 00000 n 0001086889 00000 n 0001087043 00000 n 0001087197 00000 n 0001087351 00000 n 0001087504 00000 n 0001087657 00000 n 0001087813 00000 n 0001087969 00000 n 0001088125 00000 n 0001088279 00000 n 0001088433 00000 n 0001088587 00000 n 0001088740 00000 n 0001088894 00000 n 0001119149 00000 n 0001093078 00000 n 0001089199 00000 n 0001119084 00000 n 0001094628 00000 n 0001094782 00000 n 0001094937 00000 n 0001095092 00000 n 0001095247 00000 n 0001095403 00000 n 0001095558 00000 n 0001095714 00000 n 0001095870 00000 n 0001096025 00000 n 0001096180 00000 n 0001096336 00000 n 0001096490 00000 n 0001096644 00000 n 0001096799 00000 n 0001096954 00000 n 0001097110 00000 n 0001097266 00000 n 0001097421 00000 n 0001097574 00000 n 0001097730 00000 n 0001097886 00000 n 0001098041 00000 n 0001098195 00000 n 0001098349 00000 n 0001098503 00000 n 0001098658 00000 n 0001098814 00000 n 0001098969 00000 n 0001099124 00000 n 0001099278 00000 n 0001099433 00000 n 0001099588 00000 n 0001099744 00000 n 0001099899 00000 n 0001100054 00000 n 0001100207 00000 n 0001100360 00000 n 0001100514 00000 n 0001100670 00000 n 0001100825 00000 n 0001100978 00000 n 0001101133 00000 n 0001101288 00000 n 0001101444 00000 n 0001101599 00000 n 0001101754 00000 n 0001101909 00000 n 0001102065 00000 n 0001102220 00000 n 0001102376 00000 n 0001102532 00000 n 0001102687 00000 n 0001102842 00000 n 0001102997 00000 n 0001103152 00000 n 0001103308 00000 n 0001103462 00000 n 0001103618 00000 n 0001103774 00000 n 0001103928 00000 n 0001104082 00000 n 0001104237 00000 n 0001104392 00000 n 0001104548 00000 n 0001104704 00000 n 0001104860 00000 n 0001105016 00000 n 0001105172 00000 n 0001105325 00000 n 0001105480 00000 n 0001105635 00000 n 0001105788 00000 n 0001105942 00000 n 0001106096 00000 n 0001106246 00000 n 0001106399 00000 n 0001106553 00000 n 0001106707 00000 n 0001106863 00000 n 0001107019 00000 n 0001107175 00000 n 0001107331 00000 n 0001107487 00000 n 0001107642 00000 n 0001107798 00000 n 0001107952 00000 n 0001108108 00000 n 0001108264 00000 n 0001108420 00000 n 0001108574 00000 n 0001108728 00000 n 0001108883 00000 n 0001109037 00000 n 0001109191 00000 n 0001109346 00000 n 0001109501 00000 n 0001109655 00000 n 0001109809 00000 n 0001109964 00000 n 0001110119 00000 n 0001110274 00000 n 0001110429 00000 n 0001110585 00000 n 0001110741 00000 n 0001110894 00000 n 0001111049 00000 n 0001111204 00000 n 0001111359 00000 n 0001111514 00000 n 0001111670 00000 n 0001111823 00000 n 0001111979 00000 n 0001112135 00000 n 0001112291 00000 n 0001112447 00000 n 0001112603 00000 n 0001112759 00000 n 0001112915 00000 n 0001113069 00000 n 0001113224 00000 n 0001113379 00000 n 0001113534 00000 n 0001113688 00000 n 0001113842 00000 n 0001113998 00000 n 0001114152 00000 n 0001114308 00000 n 0001114462 00000 n 0001114616 00000 n 0001114769 00000 n 0001114922 00000 n 0001115077 00000 n 0001115231 00000 n 0001115386 00000 n 0001115538 00000 n 0001115691 00000 n 0001115845 00000 n 0001116000 00000 n 0001116155 00000 n 0001116309 00000 n 0001116464 00000 n 0001116619 00000 n 0001116774 00000 n 0001116929 00000 n 0001117084 00000 n 0001117238 00000 n 0001117393 00000 n 0001117547 00000 n 0001117700 00000 n 0001117854 00000 n 0001118008 00000 n 0001118161 00000 n 0001118314 00000 n 0001118468 00000 n 0001118622 00000 n 0001118776 00000 n 0001118930 00000 n 0001132235 00000 n 0001121059 00000 n 0001119236 00000 n 0001132170 00000 n 0001121790 00000 n 0001121945 00000 n 0001122100 00000 n 0001122256 00000 n 0001122412 00000 n 0001122567 00000 n 0001122722 00000 n 0001122878 00000 n 0001123034 00000 n 0001123190 00000 n 0001123346 00000 n 0001123500 00000 n 0001123654 00000 n 0001123810 00000 n 0001123964 00000 n 0001124118 00000 n 0001124272 00000 n 0001124427 00000 n 0001124583 00000 n 0001124738 00000 n 0001124894 00000 n 0001125049 00000 n 0001125203 00000 n 0001125358 00000 n 0001125513 00000 n 0001125668 00000 n 0001125821 00000 n 0001125974 00000 n 0001126126 00000 n 0001126282 00000 n 0001126437 00000 n 0001126593 00000 n 0001126747 00000 n 0001126901 00000 n 0001127055 00000 n 0001127211 00000 n 0001127367 00000 n 0001127522 00000 n 0001127677 00000 n 0001127831 00000 n 0001127986 00000 n 0001128141 00000 n 0001128297 00000 n 0001128453 00000 n 0001128609 00000 n 0001128763 00000 n 0001128916 00000 n 0001129070 00000 n 0001129223 00000 n 0001129376 00000 n 0001129530 00000 n 0001129685 00000 n 0001129840 00000 n 0001129995 00000 n 0001130150 00000 n 0001130305 00000 n 0001130460 00000 n 0001130616 00000 n 0001130771 00000 n 0001130925 00000 n 0001131079 00000 n 0001131234 00000 n 0001131390 00000 n 0001131546 00000 n 0001131702 00000 n 0001131858 00000 n 0001132014 00000 n 0001258074 00000 n 0001135457 00000 n 0001135282 00000 n 0001138990 00000 n 0001138849 00000 n 0001142474 00000 n 0001142407 00000 n 0001152626 00000 n 0001152369 00000 n 0001161961 00000 n 0001161656 00000 n 0001168536 00000 n 0001168309 00000 n 0001172197 00000 n 0001172144 00000 n 0001176534 00000 n 0001176264 00000 n 0001180519 00000 n 0001180438 00000 n 0001198335 00000 n 0001197940 00000 n 0001213085 00000 n 0001212706 00000 n 0001231945 00000 n 0001231513 00000 n 0001241191 00000 n 0001240936 00000 n 0001253225 00000 n 0001252862 00000 n 0001258154 00000 n 0001258280 00000 n 0001258406 00000 n 0001258532 00000 n 0001258658 00000 n 0001258784 00000 n 0001258910 00000 n 0001258990 00000 n 0001259117 00000 n 0001259197 00000 n 0001259271 00000 n 0001296030 00000 n 0001311972 00000 n 0001312013 00000 n 0001312053 00000 n 0001312188 00000 n trailer << /Size 4818 /Root 4816 0 R /Info 4817 0 R /ID [<2611FBC3175EE40222764B8AF7B434A1> <2611FBC3175EE40222764B8AF7B434A1>] >> startxref 1312542 %%EOF ./gprolog-1.3.0/doc/fd-cstr.tex0000644004425400513100000013056110547152502014631 0ustar diazloco\newpage \section{Finite domain solver and built-in predicates} %HEVEA\cutdef[1]{subsection} \subsection{Introduction} \label{Intro-FD} The finite domain (FD) constraint solver extends Prolog with constraints over FD. This facility is available if the FD part of GNU Prolog has been installed. The solver is an instance of the Constraint Logic Programming scheme introduced by Jaffar and Lassez in 1987 \cite{Jaffar-Lassez87}. Constraints on FD are solved using propagation techniques, in particular arc-consistency (AC). The interested reader can refer to ``Constraint Satisfaction in Logic Programming'' of P. Van Hentenryck (1989) \cite{pvh89}. The solver is based on the \texttt{clp(FD)} solver \cite{long-clp-fd}. The GNU Prolog FD solver offers arithmetic constraints, boolean constraints, reified constraints and symbolic constraints on an new kind of variables: Finite Domain variables. \subsubsection{Finite Domain variables} \label{Finite-Domain-variables} A new type of data is introduced: FD variables which can only take values in their domains. The initial domain of an FD variable is \texttt{0..fd\_max\_integer} where \IdxFKD{fd\_max\_integer} represents the greatest value that any FD variable can take. The predicate \texttt{fd\_max\_integer/1} returns this value which may be different from the \IdxPF{max\_integer} \Idx{Prolog flag} \RefSP{set-prolog-flag/2}. The domain of an FD variable \texttt{X} is reduced step by step by constraints in a monotonic way: when a value has been removed from the domain of \texttt{X} it will never reappear in the domain of \texttt{X}. An FD variable is fully compatible with both Prolog integers and Prolog variables. Namely, when an FD variable is expected by an FD constraint it is possible to pass a Prolog integer (considered as an FD variable whose domain is a singleton) or a Prolog variable (immediately bound to an initial range \texttt{0..fd\_max\_integer}). This avoids the need for specific type declaration. Although it is not necessary to declare the initial domain of an FD variable (since it will be bound \texttt{0..fd\_max\_integer} when appearing for the fist time in a constraint) it is advantageous to do so and thus reduce as soon as possible the size of its domain: particularly because GNU Prolog, for efficiency reasons, does not check for overflows. For instance, without any preliminary domain definitions for \texttt{X}, \texttt{Y} and \texttt{Z}, the non-linear constraint \texttt{X*Y\#=Z} will fail due to an overflow when computing the upper bound of the domain of \texttt{Z}: \texttt{fd\_max\_integer $\times$ fd\_max\_integer}. This overflow causes a negative result for the upper bound and the constraint then fails. There are two internal representations for an FD variable: \begin{itemize} \item \SPart{interval representation}: only the \emph{min} and the \emph{max} of the variable are maintained. In this representation it is possible to store values included in \texttt{0..fd\_max\_integer}. \item \SPart{sparse representation}: an additional bit-vector is used to store the set of possible values for the variable (i.e. the domain). In this representation it is possible to store values included in \texttt{0..vector\_max}. By default \IdxFKD{vector\_max} is set to 127. This value can be redefined via an environment variable \texttt{VECTORMAX} or via the built-in predicate \IdxFB{fd\_set\_vector\_max/1} \RefSP{fd-set-vector-max/1}. The predicate \IdxFB{fd\_vector\_max/1} returns the current value of \texttt{vector\_max} \RefSP{fd-max-integer/1}. \end{itemize} \index{extra-constrained|see {\texttt{extra\_cstr}}} The initial representation for an FD variable \texttt{X} is always an interval representation and is switched to a sparse representation when a ``hole'' appears in the domain (e.g. due to an inequality constraint). Once a variable uses a sparse representation it will not switch back to an interval representation even if there are no longer holes in its domain. When this switching occurs some values in the domain of \texttt{X} can be lost since \texttt{vector\_max} is less than \texttt{fd\_max\_integer}. We say that ``\texttt{X} is extra-constrained'' since \texttt{X} is constrained by the solver to the domain \texttt{0..vector\_max} (via an imaginary constraint \texttt{X \#={\lt} \Param{vector\_max}}). An \IdxFKD{extra\_cstr} is associated with each FD variable to indicate that values have been lost due to the switch to a sparse representation. This flag is updated on every operations. The domain of an extra-constrained FD variable is output followed by the \texttt{@} symbol. When a constraint fails on a extra-constrained variable a message \texttt{Warning: Vector too small - maybe lost solutions (FD Var:\Param{N})} is displayed (\Param{N} is the address of the involved variable). Example 1 (\texttt{vector\_max} = \texttt{127}): \begin{tabular}{|l|l|c|l|} \hline Constraint on \texttt{X} & Domain of \texttt{X} & \texttt{extra\_cstr} & Lost values \\ \hline\hline \texttt{X \#={\lt} 512} & \texttt{0..512} & \texttt{off} & none \\ \hline \texttt{X \#{\bs}= 10} & \texttt{0..9:11..127} & \texttt{on} & \texttt{128..512} \\ \hline \texttt{X \#={\lt} 100} & \texttt{0..9:11..100} & \texttt{off} & none \\ \hline \end{tabular} In this example, when the constraint \texttt{X \#{\bs}= 10} is posted some values are lost, the \texttt{extra\_cstr} is then switched on. However, posting the constraint \texttt{X \#={\lt} 100} will turn off the flag (no values are lost). Example 2: \begin{tabular}{|l|l|c|l|} \hline Constraint on \texttt{X} & Domain of \texttt{X} & \texttt{extra\_cstr} & Lost values \\ \hline \texttt{X \#={\lt} 512} & \texttt{0..512} & \texttt{off} & none \\ \hline \texttt{X \#{\bs}= 10} & \texttt{0..9:11..127} & \texttt{on} & \texttt{128..512} \\ \hline \texttt{X \#{\gt}= 256} & \texttt{Warning: Vector too small\ldots} & \texttt{on} & \texttt{128..512} \\ \hline \end{tabular} In this example, the constraint \texttt{X \#{\gt}= 256} fails due to the lost of \texttt{128..512} so a message is displayed onto the terminal. The solution would consist in increasing the size of the vector either by setting the environment variable \texttt{VECTORMAX} (e.g. to \texttt{512}) or using \texttt{fd\_set\_vector\_max(512)}. Finally, bit-vectors are not dynamic, i.e. all vectors have the same size (\texttt{0..vector\_max}). So the use of \texttt{fd\_set\_vector\_max/1} is limited to the initial definition of vector sizes and must occur before any constraint. As seen before, the solver tries to display a message when a failure occurs due to a too short \texttt{vector\_max}. Unfortunately, in some cases it cannot detect the lost of values and no message is emitted. So the user should always take care to this parameter to be sure that it is large to encode any vector. \subsection{FD variable parameters} \subsubsection{\texttt{fd\_max\_integer/1}} \label{fd-max-integer/1} \AddFBD{fd\_max\_integer/1} \begin{TemplatesOneCol} fd\_max\_integer(?integer) \end{TemplatesOneCol} \Description \texttt{fd\_max\_integer(N)} succeeds if \texttt{N} is the current value of \IdxFK{fd\_max\_integer} \RefSP{Intro-FD}. \begin{PlErrors} \ErrCond{\texttt{N} is neither a variable nor an integer} \ErrTerm{type\_error(integer, N)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{fd\_vector\_max/1}} \AddFBD{fd\_vector\_max/1} \begin{TemplatesOneCol} fd\_vector\_max(?integer) \end{TemplatesOneCol} \Description \texttt{fd\_vector\_max(N)} succeeds if \texttt{N} is the current value of \IdxFK{vector\_max} \RefSP{Intro-FD}. \begin{PlErrors} \ErrCond{\texttt{N} is neither a variable nor an integer} \ErrTerm{type\_error(integer, N)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{fd\_set\_vector\_max/1}} \label{fd-set-vector-max/1} \AddFBD{fd\_set\_vector\_max/1} \begin{TemplatesOneCol} fd\_set\_vector\_max(+integer) \end{TemplatesOneCol} \Description \texttt{fd\_set\_vector\_max(N)} initializes \IdxFK{vector\_max} based on the value \texttt{N} \RefSP{Intro-FD}. More precisely, on 32 bit machines, \texttt{vector\_max} is set to the smallest value of \texttt{(32*k)-}1 which is $\geq$ \texttt{N}. \begin{PlErrors} \ErrCond{\texttt{N} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{N} is neither a variable nor an integer} \ErrTerm{type\_error(integer, N)} \ErrCond{\texttt{N} is an integer $<$ 0} \ErrTerm{domain\_error(not\_less\_than\_zero, N)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{Initial value constraints} \subsubsection{\texttt{fd\_domain/3}, \texttt{fd\_domain\_bool/1}} \AddFBD{fd\_domain/3} \AddFBD{fd\_domain\_bool/1} \begin{TemplatesOneCol} fd\_domain(+fd\_variable\_list\_or\_fd\_variable, +integer, +integer)\\ fd\_domain(?fd\_variable, +integer, +integer)\\ fd\_domain\_bool(+fd\_variable\_list)\\ fd\_domain\_bool(?fd\_variable) \end{TemplatesOneCol} \Description \texttt{fd\_domain(Vars, Lower, Upper)} constraints each element \texttt{X} of \texttt{Vars} to take a value in \texttt{Lower..Upper}. This predicate is generally used to set the initial domain of variables to an interval. \texttt{Vars} can be also a single FD variable (or a single Prolog variable). \texttt{fd\_domain\_bool(Vars)} is equivalent to \texttt{fd\_domain(Vars, 0, 1)} and is used to declare boolean FD variables. \begin{PlErrors} \ErrCond{\texttt{Vars} is not a variable but is a partial list} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Vars} is neither a variable nor an FD variable nor an integer nor a list} \ErrTerm{type\_error(list, Vars)} \ErrCond{an element \texttt{E} of the \texttt{Vars} list is neither a variable nor an FD variable nor an integer} \ErrTerm{type\_error(fd\_variable, E)} \ErrCond{\texttt{Lower} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Lower} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Lower)} \ErrCond{\texttt{Upper} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Upper} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Upper)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{fd\_domain/2}} \AddFBD{fd\_domain/2} \begin{TemplatesOneCol} fd\_domain(+fd\_variable\_list, +integer\_list)\\ fd\_domain(?fd\_variable, +integer\_list) \end{TemplatesOneCol} \Description \texttt{fd\_domain(Vars, Values)} constraints each element \texttt{X} of the list \texttt{Vars} to take a value in the list \texttt{Values}. This predicate is generally used to set the initial domain of variables to a set of values. The domain of each variable of \texttt{Vars} uses a sparse representation. \texttt{Vars} can be also a single FD variable (or a single Prolog variable). \begin{PlErrors} \ErrCond{\texttt{Vars} is not a variable but is a partial list} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Vars} is neither a variable nor an FD variable nor an integer nor a list} \ErrTerm{type\_error(list, Vars)} \ErrCond{an element \texttt{E} of the \texttt{Vars} list is neither a variable nor an FD variable nor an integer} \ErrTerm{type\_error(fd\_variable, E)} \ErrCond{\texttt{Values} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Values} is neither a partial list nor a list} \ErrTerm{type\_error(list, Values)} \ErrCond{an element \texttt{E} of the \texttt{Values} list is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \end{PlErrors} \Portability GNU Prolog predicate. \subsection{Type testing} \subsubsection{\texttt{fd\_var/1}, \texttt{non\_fd\_var/1}, \texttt{generic\_var/1}, \texttt{non\_generic\_var/1}} \AddFBD{fd\_var/1} \AddFBD{non\_fd\_var/1} \AddFBD{generic\_var/1} \AddFBD{non\_generic\_var/1} \begin{TemplatesTwoCols} fd\_var(?term)\\ non\_fd\_var(?term)\\ generic\_var(?term)\\ non\_generic\_var(?term) \end{TemplatesTwoCols} \Description \texttt{fd\_var(Term)} succeeds if \texttt{Term} is currently an FD variable. \texttt{non\_fd\_var(Term)} succeeds if \texttt{Term} is currently not an FD variable (opposite of \texttt{fd\_var/1}). \texttt{generic\_var(Term)} succeeds if \texttt{Term} is either a Prolog variable or an FD variable. \texttt{non\_generic\_var(Term)} succeeds if \texttt{Term} is neither a Prolog variable nor an FD variable (opposite of \texttt{generic\_var/1}). \PlErrorsNone \Portability GNU Prolog predicate. \subsection{FD variable information} These predicate allow the user to get some information about FD variables. They are not constraints, they only return the current state of a variable. \subsubsection{\texttt{fd\_min/2}, \texttt{fd\_max/2}, \texttt{fd\_size/2}, \texttt{fd\_dom/2}} \AddFBD{fd\_min/2} \AddFBD{fd\_max/2} \AddFBD{fd\_size/2} \AddFBD{fd\_dom/2} \begin{TemplatesOneCol} fd\_min(+fd\_variable, ?integer)\\ fd\_max(+fd\_variable, ?integer)\\ fd\_size(+fd\_variable, ?integer)\\ fd\_dom(+fd\_variable, ?integer\_list) \end{TemplatesOneCol} \Description \texttt{fd\_min(X, N)} succeeds if \texttt{N} is the minimal value of the current domain of \texttt{X}. \texttt{fd\_max(X, N)} succeeds if \texttt{N} is the maximal value of the current domain of \texttt{X}. \texttt{fd\_size(X, N)} succeeds if \texttt{N} is the number of elements of the current domain of \texttt{X}. \texttt{fd\_dom(X, Values)} succeeds if \texttt{Values} is the list of values of the current domain of \texttt{X}. \begin{PlErrors} \ErrCond{\texttt{X} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{X} is neither an FD variable nor an integer} \ErrTerm{type\_error(fd\_variable, X)} \ErrCond{\texttt{N} is neither a variable nor an integer} \ErrTerm{type\_error(integer, N)} \ErrCond{an element \texttt{E} of the \texttt{Vars} list is neither a variable nor an FD variable nor an integer} \ErrTerm{type\_error(fd\_variable, E)} \ErrCond{\texttt{Values} is neither a partial list nor a list} \ErrTerm{type\_error(list, Values)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{fd\_has\_extra\_cstr/1}, \texttt{fd\_has\_vector/1}, \texttt{fd\_use\_vector/1}} \AddFBD{fd\_has\_extra\_cstr/1} \AddFBD{fd\_has\_vector/1} \AddFBD{fd\_use\_vector/1} \begin{TemplatesOneCol} fd\_has\_extra\_cstr(+fd\_variable)\\ fd\_has\_vector(+fd\_variable)\\ fd\_use\_vector(+fd\_variable) \end{TemplatesOneCol} \Description \texttt{fd\_has\_extra\_cstr(X)} succeeds if the \IdxFK{extra\_cstr} of \texttt{X} is currently on \RefSP{Intro-FD}. \texttt{fd\_has\_vector(X)} succeeds if the current domain of \texttt{X} uses a sparse representation \RefSP{Intro-FD}. \texttt{fd\_use\_vector(X)} enforces a sparse representation for the domain of \texttt{X} \RefSP{Intro-FD}. \begin{PlErrors} \ErrCond{\texttt{X} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{X} is neither an FD variable nor an integer} \ErrTerm{type\_error(fd\_variable, X)} \end{PlErrors} \Portability GNU Prolog predicates. \subsection{Arithmetic constraints} \subsubsection{FD arithmetic expressions} \label{FD-arithmetic-expressions} An FD arithmetic expression is a Prolog term built from integers, variables (Prolog or FD variables), and functors (or operators) that represent arithmetic functions. The following table details the components of an FD arithmetic expression: \begin{tabular}{|l|L{10cm}|} \hline FD Expression & Result \\ \hline\hline Prolog variable & domain \texttt{0..fd\_max\_integer} \\ \hline FD variable \texttt{X} & domain of \texttt{X} \\ \hline integer number \texttt{N} & domain \texttt{N..N} \\ \hline \texttt{+ E} & same as \texttt{E} \\ \hline \texttt{- E} & opposite of \texttt{E} \\ \hline \texttt{E1 + E2} & sum of \texttt{E1} and \texttt{E2} \\ \hline \texttt{E1 - E2} & subtraction of \texttt{E2} from \texttt{E1} \\ \hline \texttt{E1 * E2} & multiplication of \texttt{E1} by \texttt{E2} \\ \hline \texttt{E1 / E2} & integer division of \texttt{E1} by \texttt{E2} (only succeeds if the remainder is 0) \\ \hline \texttt{E1 ** E2} & \texttt{E1} raised to the power of \texttt{E2 }(\texttt{E1} or \texttt{E2} must be an integer) \\ \hline \texttt{min(E1,E2)} & minimum of \texttt{E1} and \texttt{E2} \\ \hline \texttt{max(E1,E2)} & maximum of \texttt{E1} and \texttt{E2} \\ \hline \texttt{dist(E1,E2)} & distance, i.e. $|$\texttt{E1 - E2$|$} \\ \hline \texttt{E1 // E2} & quotient of the integer division of \texttt{E1} by \texttt{E2} \\ \hline \texttt{E1 rem E2} & remainder of the integer division of \texttt{E1} by \texttt{E2} \\ \hline \texttt{quot\_rem(E1,E2,R)} & quotient of the integer division of \texttt{E1} by \texttt{E2} \linebreak (\texttt{R} is the remainder of the integer division of \texttt{E1} by \texttt{E2}) \\ \hline \end{tabular} FD expressions are not restricted to be linear. However non-linear constraints usually yield less constraint propagation than linear constraints. \texttt{+}, \texttt{-}, \texttt{*}, \texttt{/}, \texttt{//}, \texttt{rem} and \texttt{**} are predefined infix operators. \texttt{+} and \texttt{-} are predefined prefix operators \RefSP{op/3:(Term-input/output)}. \begin{PlErrors} \ErrCond{a sub-expression is of the form \texttt{\_ ** E} and \texttt{E} is a variable} \ErrTerm{instantiation\_error} \ErrCond{a sub-expression \texttt{E} is neither a variable nor an integer nor an FD arithmetic functor} \ErrTerm{type\_error(fd\_evaluable, E)} \ErrCond{an expression is too complex} \ErrTerm{resource\_error(too\_big\_fd\_constraint)} \end{PlErrors} \subsubsection{Partial AC: \texttt{(\#=)/2} - constraint equal, \texttt{(\#{\bs}=)/2} - constraint not equal, \\ \texttt{(\#{\lt})/2} - constraint less than, \texttt{(\#={\lt})/2} - constraint less than or equal, \\ \texttt{(\#{\gt})/2} - constraint greater than, \texttt{(\#{\gt}=)/2} - constraint greater than or equal} \label{Partial-AC:-(:=)/2} \AddFBD{(\#=)/2} \AddFBD{(\#{\bs}=)/2} \AddFBD{(\#{\lt})/2} \AddFBD{(\#={\lt})/2} \AddFBD{(\#{\gt})/2} \AddFBD{(\#{\gt}=)/2} \begin{TemplatesOneCol} \#=(?fd\_evaluable, ?fd\_evaluable)\\ \#{\bs}=(?fd\_evaluable, ?fd\_evaluable)\\ \#{\lt}(?fd\_evaluable, ?fd\_evaluable)\\ \#={\lt}(?fd\_evaluable, ?fd\_evaluable)\\ \#{\gt}(?fd\_evaluable, ?fd\_evaluable)\\ \#{\gt}=(?fd\_evaluable, ?fd\_evaluable) \end{TemplatesOneCol} \Description \texttt{FdExpr1 \#= FdExpr2} constrains \texttt{FdExpr1} to be equal to \texttt{FdExpr2}. \texttt{FdExpr1 \#{\bs}= FdExpr2} constrains \texttt{FdExpr1} to be different from \texttt{FdExpr2}. \texttt{FdExpr1 \#{\lt} FdExpr2} constrains \texttt{FdExpr1} to be less than \texttt{FdExpr2}. \texttt{FdExpr1 \#={\lt} FdExpr2} constrains \texttt{FdExpr1} to be less than or equal to \texttt{FdExpr2}. \texttt{FdExpr1 \#{\gt} FdExpr2} constrains \texttt{FdExpr1} to be greater than \texttt{FdExpr2}. \texttt{FdExpr1 \#{\gt}= FdExpr2} constrains \texttt{FdExpr1} to be greater than or equal to \texttt{FdExpr2}. \texttt{FdExpr1} and \texttt{FdExpr2} are arithmetic FD expressions \RefSP{FD-arithmetic-expressions}. \texttt{\#=}, \texttt{\#{\bs}=}, \texttt{\#{\lt}}, \texttt{\#={\lt}}, \texttt{\#{\gt}} and \texttt{\#{\gt}=} are predefined infix operators \RefSP{op/3:(Term-input/output)}. These predicates post arithmetic constraints that are managed by the solver using a partial arc-consistency algorithm to reduce the domain of involved variables. In this scheme only the bounds of the domain of variables are updated. This leads to less propagation than full arc-consistency techniques \RefSP{Full-AC:-(:=:)/2} but is generally more efficient for arithmetic. These arithmetic constraints can be reified \RefSP{Boolean-and-reified-constraints}. \Errors Refer to the syntax of arithmetic FD expressions for possible errors \RefSP{FD-arithmetic-expressions}. \Portability GNU Prolog predicates. \subsubsection{Full AC: \texttt{(\#=\#)/2} - constraint equal, \texttt{(\#{\bs}=\#)/2} - constraint not equal, \\ \texttt{(\#{\lt}\#)/2} - constraint less than, \texttt{(\#={\lt}\#)/2} - constraint less than or equal, \\ \texttt{(\#{\gt}\#)/2} - constraint greater than, \texttt{(\#{\gt}=\#)/2} - constraint greater than or equal} \label{Full-AC:-(:=:)/2} \AddFBD{(\#=\#)/2} \AddFBD{(\#{\bs}=\#)/2} \AddFBD{(\#{\lt}\#)/2} \AddFBD{(\#={\lt}\#)/2} \AddFBD{(\#{\gt}\#)/2} \AddFBD{(\#{\gt}=\#)/2} \begin{TemplatesOneCol} \#=\#(?fd\_evaluable, ?fd\_evaluable)\\ \#{\bs}=\#(?fd\_evaluable, ?fd\_evaluable)\\ \#{\lt}\#(?fd\_evaluable, ?fd\_evaluable)\\ \#={\lt}\#(?fd\_evaluable, ?fd\_evaluable)\\ \#{\gt}\#(?fd\_evaluable, ?fd\_evaluable)\\ \#{\gt}=\#(?fd\_evaluable, ?fd\_evaluable) \end{TemplatesOneCol} \Description \texttt{FdExpr1 \#=\# FdExpr2} constrains \texttt{FdExpr1} to be equal to \texttt{FdExpr2}. \texttt{FdExpr1 \#{\bs}=\# FdExpr2} constrains \texttt{FdExpr1} to be different from \texttt{FdExpr2}. \texttt{FdExpr1 \#{\lt}\# FdExpr2} constrains \texttt{FdExpr1} to be less than \texttt{FdExpr2}. \texttt{FdExpr1 \#={\lt}\# FdExpr2} constrains \texttt{FdExpr1} to be less than or equal to \texttt{FdExpr2}. \texttt{FdExpr1 \#{\gt}\# FdExpr2} constrains \texttt{FdExpr1} to be greater than \texttt{FdExpr2}. \texttt{FdExpr1 \#{\gt}=\# FdExpr2} constrains \texttt{FdExpr1} to be greater than or equal to \texttt{FdExpr2}. \texttt{FdExpr1} and \texttt{FdExpr2} are arithmetic FD expressions \RefSP{FD-arithmetic-expressions}. \texttt{\#=\#}, \texttt{\#{\bs}=\#}, \texttt{\#{\lt}\#}, \texttt{\#={\lt}\#}, \texttt{\#{\gt}\#} and \texttt{\#{\gt}=\#} are predefined infix operators \RefSP{op/3:(Term-input/output)}. These predicates post arithmetic constraints that are managed by the solver using a full arc-consistency algorithm to reduce the domain of involved variables. In this scheme the full domain of variables is updated. This leads to more propagation than partial arc-consistency techniques \RefSP{FD-arithmetic-expressions} but is generally less efficient for arithmetic. These arithmetic constraints can be reified \RefSP{Boolean-FD-expressions}. \Errors Refer to the syntax of arithmetic FD expressions for possible errors \RefSP{FD-arithmetic-expressions}. \Portability GNU Prolog predicates. \subsubsection{\texttt{fd\_prime/1}, \texttt{fd\_not\_prime/1}} \AddFBD{fd\_prime/1} \AddFBD{fd\_not\_prime/1} \begin{TemplatesOneCol} fd\_prime(?fd\_variable)\\ fd\_not\_prime(?fd\_variable) \end{TemplatesOneCol} \Description \texttt{fd\_prime(X)} constraints \texttt{X} to be a prime number between \texttt{0..\IdxFK{vector\_max}}. This constraint enforces a sparse representation for the domain of \texttt{X} \RefSP{Intro-FD}. \texttt{fd\_not\_prime(X)} constraints \texttt{X} to be a non prime number between \texttt{0..vector\_max}. This constraint enforces a sparse representation for the domain of \texttt{X} \RefSP{Intro-FD}. \begin{PlErrors} \ErrCond{\texttt{X} is neither an FD variable nor an integer} \ErrTerm{type\_error(fd\_variable, X)} \end{PlErrors} \Portability GNU Prolog predicates. \subsection{Boolean and reified constraints} \label{Boolean-and-reified-constraints} \subsubsection{Boolean FD expressions} \label{Boolean-FD-expressions} An boolean FD expression is a Prolog term built from integers (0 for false, 1 for true), variables (Prolog or FD variables), partial AC arithmetic constraints \RefSP{Partial-AC:-(:=)/2}, full AC arithmetic constraints \RefSP{Full-AC:-(:=:)/2} and functors (or operators) that represent boolean functions. When a sub-expression of a boolean expression is an arithmetic constraint \Param{c}, it is reified. Namely, as soon as the solver detects that \Param{c} is true (i.e. \emph{entailed}) the sub-expression has the value \texttt{1}. Similarly when the solver detects that \Param{c} is false (i.e. \emph{disentailed}) the sub-expression evaluates as \texttt{0}. While neither the entailment nor the disentailment can be detected the sub-expression is evaluated as a domain \texttt{0..1}. The following table details the components of an FD boolean expression: \begin{tabular}{|l|l|} \hline FD Expression & Result \\ \hline\hline Prolog variable & domain \texttt{0..1} \\ \hline FD variable \texttt{X} & domain of \texttt{X}, \texttt{X} is constrained to be in \texttt{0..1} \\ \hline \texttt{0} (integer) & \texttt{0} (false) \\ \hline \texttt{1} (integer) & \texttt{1} (true) \\ \hline \texttt{\#{\bs} E} & not \texttt{E} \\ \hline \texttt{E1 \#{\lt}={\gt} E2} & \texttt{E1} equivalent to \texttt{E2} \\ \hline \texttt{E1 \#{\bs}{\lt}={\gt} E2} & \texttt{E1} not equivalent to \texttt{E2} (i.e. \texttt{E1} different from \texttt{E2)} \\ \hline \texttt{E1 \#\# E2} & \texttt{E1} exclusive OR \texttt{E2} (i.e. \texttt{E1} not equivalent to \texttt{E2)} \\ \hline \texttt{E1 \#=={\gt} E2} & \texttt{E1} implies \texttt{E2} \\ \hline \texttt{E1 \#{\bs}=={\gt} E2} & \texttt{E1} does not imply \texttt{E2} \\ \hline \texttt{E1 \#/{\bs} E2} & \texttt{E1} AND \texttt{E2} \\ \hline \texttt{E1 \#{\bs}/{\bs} E2} & \texttt{E1} NAND \texttt{E2} \\ \hline \texttt{E1 \#{\bs}/ E2} & \texttt{E1} OR \texttt{E2} \\ \hline \texttt{E1 \#{\bs}{\bs}/ E2} & \texttt{E1} NOR \texttt{E2} \\ \hline \end{tabular} \texttt{\#{\lt}={\gt}}, \texttt{\#{\bs}{\lt}={\gt}}, \texttt{\#\#}, \texttt{\#=={\gt}}, \texttt{\#{\bs}=={\gt}}, \texttt{\#/{\bs}}, \texttt{\#{\bs}/{\bs}}, \texttt{\#{\bs}/} and \texttt{\#{\bs}{\bs}/} are predefined infix operators. \texttt{\#{\bs}} is a predefined prefix operator \RefSP{op/3:(Term-input/output)}. \begin{PlErrors} \ErrCond{a sub-expression \texttt{E} is neither a variable nor an integer (0 or 1) nor an FD boolean functor nor reified constraint} \ErrTerm{type\_error(fd\_bool\_evaluable, E)} \ErrCond{an expression is too complex} \ErrTerm{resource\_error(too\_big\_fd\_constraint)} \ErrCond{a sub-expression is an invalid reified constraint} \ErrTermRm{an arithmetic constraint error \RefSP{FD-arithmetic-expressions}} \end{PlErrors} \subsubsection{\texttt{(\#{\bs})/1} - constraint NOT, \texttt{(\#{\lt}={\gt})/2} - constraint equivalent, \\ \texttt{(\#{\bs}{\lt}={\gt})/2} - constraint different, \texttt{(\#\#)/2} - constraint XOR, \\ \texttt{(\#=={\gt})/2} - constraint imply, \texttt{(\#{\bs}=={\gt})/2} - constraint not imply, \\ \texttt{(\#/{\bs})/2} - constraint AND, \texttt{(\#{\bs}/{\bs})/2} - constraint NAND, \\ \texttt{(\#{\bs}/)/2} - constraint OR, \texttt{(\#{\bs}{\bs}/)/2} - constraint NOR} \AddFBD{(\#{\bs})/1} \AddFBD{(\#{\lt}={\gt})/2} \AddFBD{(\#{\bs}{\lt}={\gt})/2} \AddFBD{(\#\#)/2} \AddFBD{(\#=={\gt})/2} \AddFBD{(\#{\bs}=={\gt})/2} \AddFBD{(\#/{\bs})/2} \AddFBD{(\#{\bs}/{\bs})/2} \AddFBD{(\#{\bs}/)/2} \AddFBD{(\#{\bs}{\bs}/)/2} \begin{TemplatesOneCol} \#{\bs}(?fd\_bool\_evaluable)\\ \#{\lt}={\gt}(?fd\_bool\_evaluable, ?fd\_bool\_evaluable)\\ \#{\bs}{\lt}={\gt}(?fd\_bool\_evaluable, ?fd\_bool\_evaluable)\\ \#\#(?fd\_bool\_evaluable, ?fd\_bool\_evaluable)\\ \#=={\gt}(?fd\_bool\_evaluable, ?fd\_bool\_evaluable)\\ \#{\bs}=={\gt}(?fd\_bool\_evaluable, ?fd\_bool\_evaluable)\\ \#/{\bs}(?fd\_bool\_evaluable, ?fd\_bool\_evaluable)\\ \#{\bs}/{\bs}(?fd\_bool\_evaluable, ?fd\_bool\_evaluable)\\ \#{\bs}/(?fd\_bool\_evaluable, ?fd\_bool\_evaluable)\\ \#{\bs}{\bs}/(?fd\_bool\_evaluable, ?fd\_bool\_evaluable) \end{TemplatesOneCol} \Description \texttt{\#{\bs}= FdBoolExpr1} constraints \texttt{FdBoolExpr1} to be false. \texttt{FdBoolExpr1 \#{\lt}={\gt} FdBoolExpr2} constrains \texttt{FdBoolExpr1} to be equivalent to \texttt{FdBoolExpr2}. \texttt{FdBoolExpr1 \#{\bs}{\lt}={\gt} FdBoolExpr2} constrains \texttt{FdBoolExpr1} to be equivalent to not \texttt{FdBoolExpr2}. \texttt{FdBoolExpr1 \#\# FdBoolExpr2} constrains \texttt{FdBoolExpr1} XOR \texttt{FdBoolExpr2} to be true \texttt{FdBoolExpr1 \#=={\gt} FdBoolExpr2} constrains \texttt{FdBoolExpr1} to imply \texttt{FdBoolExpr2}. \texttt{FdBoolExpr1 \#{\bs}=={\gt} FdBoolExpr2} constrains \texttt{FdBoolExpr1} to not imply \texttt{FdBoolExpr2}. \texttt{FdBoolExpr1 \#/{\bs} FdBoolExpr2} constrains \texttt{FdBoolExpr1} AND \texttt{FdBoolExpr2} to be true. \texttt{FdBoolExpr1 \#{\bs}/{\bs} FdBoolExpr2} constrains \texttt{FdBoolExpr1} AND \texttt{FdBoolExpr2} to be false. \texttt{FdBoolExpr1 \#{\bs}/ FdBoolExpr2} constrains \texttt{FdBoolExpr1} OR \texttt{FdBoolExpr2} to be true. \texttt{FdBoolExpr1 \#{\bs}{\bs}/ FdBoolExpr2} constrains \texttt{FdBoolExpr1} OR \texttt{FdBoolExpr2} to be false. \texttt{FdBoolExpr1} and \texttt{FdBoolExpr2} are boolean FD expressions \RefSP{Boolean-FD-expressions}. Note that \texttt{\#{\bs}{\lt}={\gt}} (not equivalent) and \texttt{\#\#} (exclusive or) are synonymous. These predicates post boolean constraints that are managed by the FD solver using a partial arc-consistency algorithm to reduce the domain of involved variables. The (dis)entailment of reified constraints is detected using either the bounds (for partial AC arithmetic constraints) or the full domain (for full AC arithmetic constraints). \texttt{\#{\lt}={\gt}}, \texttt{\#{\bs}{\lt}={\gt}}, \texttt{\#\#}, \texttt{\#=={\gt}}, \texttt{\#{\bs}=={\gt}}, \texttt{\#/{\bs}}, \texttt{\#{\bs}/{\bs}}, \texttt{\#{\bs}/} and \texttt{\#{\bs}{\bs}/} are predefined infix operators. \texttt{\#{\bs}} is a predefined prefix operator \RefSP{op/3:(Term-input/output)}. \Errors Refer to the syntax of boolean FD expressions for possible errors \RefSP{Boolean-FD-expressions}. \Portability GNU Prolog predicates. \subsubsection{\texttt{fd\_cardinality/2}, \texttt{fd\_cardinality/3}, \texttt{fd\_at\_least\_one/1}, \texttt{fd\_at\_most\_one/1}, \\ \texttt{fd\_only\_one/1}} \label{fd-cardinality/2} \AddFBD{fd\_cardinality/2} \AddFBD{fd\_cardinality/3} \AddFBD{fd\_at\_least\_one/1} \AddFBD{fd\_at\_most\_one/1} \AddFBD{fd\_only\_one/1} \begin{TemplatesOneCol} fd\_cardinality(+fd\_bool\_evaluable\_list, ?fd\_variable)\\ fd\_cardinality(+integer, ?fd\_variable, +integer)\\ fd\_at\_least\_one(+fd\_bool\_evaluable\_list)\\ fd\_at\_most\_one(+fd\_bool\_evaluable\_list)\\ fd\_only\_one(+fd\_bool\_evaluable\_list) \end{TemplatesOneCol} \Description \texttt{fd\_cardinality(List, Count)} unifies \texttt{Count} with the number of constraints that are true in \texttt{List}. This is equivalent to post the constraint \texttt{B$_{1}$ + B$_{2}$ + \ldots + B$_{n}$ \#= Count} where each variable \texttt{Bi} is a new variable defined by the constraint \texttt{B$_{i}$ \#{\lt}={\gt} C$_{i}$} where \texttt{C$_{i}$} is the \texttt{i}\emph{th} constraint of \texttt{List}. Each \texttt{C$_{i}$} must be a boolean FD expression \RefSP{Boolean-FD-expressions}. \texttt{fd\_cardinality(Lower, List, Upper)} is equivalent to \texttt{fd\_cardinality(List, Count), Lower \#={\lt} Count, Count \#={\lt} Upper} \texttt{fd\_at\_least\_one(List)} is equivalent to \texttt{fd\_cardinality(List, Count), Count \#{\gt}= 1}. \texttt{fd\_at\_most\_one(List)} is equivalent to \texttt{fd\_cardinality(List, Count), Count \#={\lt} 1}. \texttt{fd\_only\_one(List)} is equivalent to \texttt{fd\_cardinality(List, 1)}. \begin{PlErrors} \ErrCond{\texttt{List} is a partial list} \ErrTerm{instantiation\_error} \ErrCond{\texttt{List} is neither a partial list nor a list} \ErrTerm{type\_error(list, List)} \ErrCond{\texttt{Count} is neither an FD variable nor an integer} \ErrTerm{type\_error(fd\_variable, Count)} \ErrCond{\texttt{Lower} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Lower} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Lower)} \ErrCond{\texttt{Upper} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Upper} is neither a variable nor an integer} \ErrTerm{type\_error(integer, Upper)} \ErrCond{an element \texttt{E} of the \texttt{List} list is an invalid boolean expression} \ErrTermRm{an FD boolean constraint \RefSP{Boolean-FD-expressions}} \end{PlErrors} \Portability GNU Prolog predicates. \subsection{Symbolic constraints} \subsubsection{\texttt{fd\_all\_different/1}} \AddFBD{fd\_all\_different/1} \begin{TemplatesOneCol} fd\_all\_different(+fd\_variable\_list) \end{TemplatesOneCol} \Description \texttt{fd\_all\_different(List)} constrains all variables in \texttt{List} to take distinct values. This is equivalent to posting an inequality constraint for each pair of variables. This constraint is triggered when a variable becomes ground, removing its value from the domain of the other variables. \begin{PlErrors} \ErrCond{\texttt{List} is a partial list} \ErrTerm{instantiation\_error} \ErrCond{\texttt{List} is neither a partial list nor a list} \ErrTerm{type\_error(list, List)} \ErrCond{an element \texttt{E} of the \texttt{List} list is neither a variable nor an integer nor an FD variable} \ErrTerm{type\_error(fd\_variable, E)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{fd\_element/3}} \label{fd-element/3} \AddFBD{fd\_element/3} \begin{TemplatesOneCol} fd\_element(?fd\_variable, +integer\_list, ?fd\_variable) \end{TemplatesOneCol} \Description \texttt{fd\_element(I, List, X)} constraints \texttt{X} to be equal to the \texttt{I}\emph{th} integer (from 1) of \texttt{List}. \begin{PlErrors} \ErrCond{\texttt{I} is neither a variable nor an FD variable nor an integer} \ErrTerm{type\_error(fd\_variable, I)} \ErrCond{\texttt{X} is neither a variable nor an FD variable nor an integer} \ErrTerm{type\_error(fd\_variable, X)} \ErrCond{\texttt{List} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{List} is neither a partial list nor a list} \ErrTerm{type\_error(list, List)} \ErrCond{an element \texttt{E} of the \texttt{List} list is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{fd\_element\_var/3}} \AddFBD{fd\_element\_var/3} \begin{TemplatesOneCol} fd\_element\_var(?fd\_variable, +fd\_variable\_list, ?fd\_variable) \end{TemplatesOneCol} \Description \texttt{fd\_element\_var(I, List, X)} constraints \texttt{X} to be equal to the \texttt{I}\emph{th} variable (from 1) of \texttt{List}. This constraint is similar to \texttt{fd\_element/3} \RefSP{fd-element/3} but \texttt{List} can also contain FD variables (rather than just integers). \begin{PlErrors} \ErrCond{\texttt{I} is neither a variable nor an FD variable nor an integer} \ErrTerm{type\_error(fd\_variable, I)} \ErrCond{\texttt{X} is neither a variable nor an FD variable nor an integer} \ErrTerm{type\_error(fd\_variable, X)} \ErrCond{\texttt{List} is a partial list} \ErrTerm{instantiation\_error} \ErrCond{\texttt{List} is neither a partial list nor a list} \ErrTerm{type\_error(list, List)} \ErrCond{an element \texttt{E} of the \texttt{List} list is neither a variable nor an integer nor an FD variable} \ErrTerm{type\_error(fd\_variable, E)} \end{PlErrors} \Portability GNU Prolog predicate. \subsubsection{\texttt{fd\_atmost/3}, \texttt{fd\_atleast/3}, \texttt{fd\_exactly/3}} \AddFBD{fd\_atmost/3} \AddFBD{fd\_atleast/3} \AddFBD{fd\_exactly/3} \begin{TemplatesOneCol} fd\_atmost(+integer, +fd\_variable\_list, +integer)\\ fd\_atleast(+integer, +fd\_variable\_list, +integer)\\ fd\_exactly(+integer, +fd\_variable\_list, +integer) \end{TemplatesOneCol} \Description \texttt{fd\_atmost(N, List, V)} posts the constraint that at most \texttt{N} variables of \texttt{List} are equal to the value \texttt{V}. \texttt{fd\_atleast(N, List, V)} posts the constraint that at least \texttt{N} variables of \texttt{List} are equal to the value \texttt{V}. \texttt{fd\_exactly(N, List, V)} posts the constraint that at exactly \texttt{N} variables of \texttt{List} are equal to the value \texttt{V}. These constraints are special cases of \IdxFB{fd\_cardinality/2} \RefSP{fd-cardinality/2} but their implementation is more efficient. \begin{PlErrors} \ErrCond{\texttt{N} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{N} is neither a variable nor an integer} \ErrTerm{type\_error(integer, N)} \ErrCond{\texttt{V} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{V} is neither a variable nor an integer} \ErrTerm{type\_error(integer, V)} \ErrCond{\texttt{List} is a partial list} \ErrTerm{instantiation\_error} \ErrCond{\texttt{List} is neither a partial list nor a list} \ErrTerm{type\_error(list, List)} \ErrCond{an element \texttt{E} of the \texttt{List} list is neither a variable nor an FD variable nor an integer} \ErrTerm{type\_error(fd\_variable, E)} \end{PlErrors} \Portability GNU Prolog predicates. \subsubsection{\texttt{fd\_relation/2}, \texttt{fd\_relationc/2}} \AddFBD{fd\_relation/2} \AddFBD{fd\_relationc/2} \begin{TemplatesOneCol} fd\_relation(+integer\_list\_list, ?fd\_variable\_list)\\ fd\_relationc(+integer\_list\_list, ?fd\_variable\_list) \end{TemplatesOneCol} \Description \texttt{fd\_relation(Relation, Vars)} constraints the tuple of variables \texttt{Vars} to be equal to one tuple of the list \texttt{Relation}. A tuple is represented by a list. Example: definition of the boolean AND relation so that X AND Y $\Leftrightarrow$ Z: \begin{Indentation} \begin{verbatim} and(X,Y,Z):- fd_relation([[0,0,0],[0,1,0],[1,0,0],[1,1,1]], [X,Y,Z]). \end{verbatim} \end{Indentation} \texttt{fd\_relationc(Columns, Vars)} is similar to \texttt{fd\_relation/2} except that the relation is not given as the list of tuples but as the list of the columns of the relation. A column is represented by a list. Example: \begin{Indentation} \begin{verbatim} and(X,Y,Z):- fd_relationc([[0,0,1,1],[0,1,0,1],[0,0,0,1]], [X,Y,Z]). \end{verbatim} \end{Indentation} \begin{PlErrors} \ErrCond{\texttt{Relation} is a partial list or a list with a sub-term \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Relation} is neither a partial list nor a list} \ErrTerm{type\_error(list, Relation)} \ErrCond{an element \texttt{E} of the \texttt{Relation} list is neither a variable nor an integer} \ErrTerm{type\_error(integer, E)} \ErrCond{\texttt{Vars} is a partial list} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Vars} is neither a partial list nor a list} \ErrTerm{type\_error(list, Vars)} \ErrCond{an element \texttt{E} of the \texttt{Vars} list is neither a variable nor an integer nor an FD variable} \ErrTerm{type\_error(fd\_variable, E)} \end{PlErrors} \Portability GNU Prolog predicates. \subsection{Labeling constraints} \subsubsection{\texttt{fd\_labeling/2}, \texttt{fd\_labeling/1}, \texttt{fd\_labelingff/1}} \label{fd-labeling/2} \AddFBD{fd\_labeling/2} \AddFBD{fd\_labeling/1} \AddFBD{fd\_labelingff/1} \begin{TemplatesOneCol} fd\_labeling(+fd\_variable\_list, +fd\_labeling\_option\_list)\\ fd\_labeling(+fd\_variable, +fd\_labeling\_option\_list)\\ fd\_labeling(+fd\_variable\_list)\\ fd\_labeling(+fd\_variable)\\ fd\_labelingff(+fd\_variable\_list)\\ fd\_labelingff(+fd\_variable) \end{TemplatesOneCol} \Description \texttt{fd\_labeling(Vars, Options)} assigns a value to each variable \texttt{X} of the list \texttt{Vars} according to the list of labeling options given by \texttt{Options}. \texttt{Vars} can be also a single FD variable. This predicate is re-executable on backtracking. \SPart{FD labeling options}: \texttt{Options} is a list of labeling options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are: \begin{itemize} \item \IdxFOD[variable\_method]{variable\_method(V)}: specifies the heuristics to select the variable to enumerate: \begin{itemize} \item \IdxFOD{standard}: no heuristics, the leftmost variable is selected. \item \IdxFOD{first\_fail} (or \texttt{ff}): selects the variable with the smallest number of elements in its domain. If several variables have the same number of elements the leftmost variable is selected. \item \IdxFOD{most\_constrained}: like \texttt{first\_fail} but when several variables have the same number of elements selects the variable that appears in most constraints. \item \IdxFOD{smallest}: selects the variable that has the smallest value in its domain. If there is more than one such variable selects the variable that appears in most constraints. \item \IdxFOD{largest}: selects the variable that has the greatest value in its domain. If there is more than one such variable selects the variable that appears in most constraints. \item \IdxFOD{max\_regret}: selects the variable that has the greatest difference between the smallest value and the next value of its domain. If there is more than one such variable selects the variable that appears in most constraints. \item \IdxFOD{random}: selects randomly a variable. Each variable is only chosen once. \end{itemize} The default value is \texttt{standard}. \item \IdxFOD[reorder]{reorder(true/false)}: specifies if the variable heuristics should dynamically reorder the list of variable (\texttt{true}) or not (\texttt{false}). Dynamic reordering is generally more efficient but in some cases a static ordering is faster. The default value is \texttt{true}. \item \IdxFOD[value\_method]{value\_method(V)}: specifies the heuristics to select the value to assign to the chosen variable: \begin{itemize} \item \IdxFOD{min}: enumerates the values from the smallest to the greatest (default). \item \IdxFOD{max}: enumerates the values from the greatest to the smallest. \item \IdxFOD{middle}: enumerates the values from the middle to the bounds. \item \IdxFOD{bounds}: enumerates the values from the bounds to the middle. \item \IdxFOD{random}: enumerates the values randomly. Each value is only tried once. \end{itemize} The default value is \texttt{min}. \item \IdxFOD[backtracks]{backtracks(B)}: unifies \texttt{B} with the number of backtracks during the enumeration. \end{itemize} \texttt{fd\_labeling(Vars)} is equivalent to \texttt{fd\_labeling(Vars, [])}. \texttt{fd\_labelingff(Vars)} is equivalent to \texttt{fd\_labeling(Vars, [variable\_method(ff)])}. \begin{PlErrors} \ErrCond{\texttt{Vars} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Vars} is neither a partial list nor a list} \ErrTerm{type\_error(list, Vars)} \ErrCond{an element \texttt{E} of the \texttt{Vars} list is neither a variable nor an integer nor an FD variable} \ErrTerm{type\_error(fd\_variable, E)} \ErrCond{\texttt{Options} is a partial list or a list with an element \texttt{E} which is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Options} is neither a partial list nor a list} \ErrTerm{type\_error(list, Options)} \ErrCond{an element \texttt{E} of the \texttt{Options} list is neither a variable nor a labeling option} \ErrTerm{domain\_error(fd\_labeling\_option, E)} \end{PlErrors} \Portability GNU Prolog predicates. \subsection{Optimization constraints} \subsubsection{\texttt{fd\_minimize/2}, \texttt{fd\_maximize/2}} \AddFBD{fd\_minimize/2} \AddFBD{fd\_maximize/2} \begin{TemplatesOneCol} fd\_minimize(+callable\_term, ?fd\_variable)\\ fd\_maximize(+callable\_term, ?fd\_variable) \end{TemplatesOneCol} \Description \texttt{fd\_minimize(Goal, X)} repeatedly calls \texttt{Goal} to find a value that minimizes the variable \texttt{X}. \texttt{Goal} is a Prolog goal that should instantiate \texttt{X}, a common case being the use of \IdxFB{fd\_labeling/2} \RefSP{fd-labeling/2}. This predicate uses a branch-and-bound algorithm with restart: each time \texttt{call(Goal)} succeeds the computation restarts with a new constraint \texttt{X \#{\lt} V} where \texttt{V} is the value of \texttt{X} at the end of the last call of \texttt{Goal}. When a failure occurs (either because there are no remaining choice-points for \texttt{Goal} or because the added constraint is inconsistent with the rest of the store) the last solution is recomputed since it is optimal. \texttt{fd\_maximize(Goal, X)} is similar to \texttt{fd\_minimize/2} but \texttt{X} is maximized\texttt{.} \begin{PlErrors} \ErrCond{\texttt{Goal} is a variable} \ErrTerm{instantiation\_error} \ErrCond{\texttt{Goal} is neither a variable nor a callable term} \ErrTerm{type\_error(callable, Goal)} \ErrCond{The predicate indicator \texttt{Pred} of \texttt{Goal} does not correspond to an existing procedure and the value of the \texttt{unknown} Prolog flag is \texttt{error} \RefSP{set-prolog-flag/2}} \ErrTerm{existence\_error(procedure, Pred)} \ErrCond{\texttt{X} is neither a variable nor an FD variable nor an integer } \ErrTerm{type\_error(fd\_variable, X)} \end{PlErrors} \Portability GNU Prolog predicates. %HEVEA\cutend ./gprolog-1.3.0/doc/debug-box.gif0000644004425400513100000000151510542447571015114 0ustar diazlocoGIF89aFs€ÿÿÿ!þMade with GIMP!ù ,FsþŒ©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇòL×öçúÎ÷þ ‡Ä¢ñˆL*—̦ó ÒÔªõŠÍj·Ü®÷ ¤äiy5>«[鵩펗àò½ŽïÜóœ}ÑïC ȇaxˆfhÓ¨8ñ($éÈD ù€C88fåÙ9×™¶ùæwš¹ ª'izði9ˆK{k[ƒ…ÐºÊ ³ÛK|[™P5{'ÆÜœÜëËè< Æj­\‹Œm<:<|å@k -r¾"ú þâN^þ9<ÏIj?þþêï @HJ)x¡Á' ó4\Èäa‰“PŒs±¢‘þŒk8jâQàGx!Ë”¥&•¾NdùOG¹B03¹Œp3^Í„;6åä¶ÏÅ{ž¤ñTJŸ´z‹‚òÉxN®uT·¡øé”ÓU«D§ õÍÛ ¬Yåmõ T*©_Ç–z6×LµUÛÌ<ûãÕzv“†2¥ðRdó6}£¦°áP/v3ŸÅ¿¥\™f$›3ÛÉÛÙó‡ÐD“!Mµi ª'­ŽÒúÒk(±iÎNUÔvÙÚ$›Y©;+ïÞ<ñÞ9¹ž~sÝϹ¾¾7ìVííÛíeVÙYÜ¥ÛÖl¬ïôø¹PÞs¼ù}É£e_Œ-2jô¹@¯?‹¶ouþyÍÅÝzÞA·”X2PG x¿¥v9¡'S€º$E`žA˜†³1 auNFà‡Kt蟈…h"g(¦¸ÑŠ,¦–_Œ2ÎXÍ‹¦‘hãn9îx >ž÷c„ I¤eEÙ’Jz€ã’5é¤APFI•VR0å•1iÉ¥0]~©@–`:4f™b–)Ç™hB¶æ—j¶)œZ¾)çKuf@g†wZ™çG}¦7g…õWÍÙóØŸ #Ëý=úJw*ŠuG¹g©‚Xå•{XZL|a=&¦žZ_ Ø¨eW¤nšÌž 1Å”zƒ©Wë3Ä*kMŠöª"°Hò*l±Æ‹l²Ê.Ël³Î> m´ÒNKmµÖâP;./gprolog-1.3.0/doc/macros.tex0000644004425400513100000002725410547152502014557 0ustar diazloco% general page/margin sizes \setlength{\oddsidemargin}{-.25cm} \setlength{\evensidemargin}{-.25cm} \setlength{\topmargin}{-50pt} \setlength{\headheight}{1.5cm} \setlength{\textwidth}{16cm} \setlength{\textheight}{24cm} % spacing lengths (note that we should define our own itemize environment % customizing the sizes with the second argument {decls} % cf. p112 of the LaTeX book or p59-62 of the Companion book \setlength{\parindent}{0cm} \setlength{\parskip}{\baselineskip} \setlength{\partopsep}{-\baselineskip} \setlength{\topsep}{0pt} % save parskip for destroy+restore (cf. cover, tbl-contents) \newlength{\saveparskip} \setlength{\saveparskip}{\parskip} % To avoid underfull vbox errors due to [twosides] \raggedbottom % Fancy headings \pagestyle{fancy} %\setlength{\headrulewidth}{0.8pt} \renewcommand{\headrulewidth}{0.8pt} \lhead[\thepage]{\rightmark} \chead{} \rhead[\leftmark]{\thepage} \lfoot{} \cfoot{} \rfoot{} % New space for subsubsection numbers in the table of contents %BEGIN LATEX \makeatletter \renewcommand{\l@subsubsection}{\@dottedtocline{3}{3.8em}{3.6em}} \makeatother %END LATEX % Vertical space commands \newcommand{\BL}{\vspace{\baselineskip}} \newcommand{\SkipUp}{\vspace{-\multicolsep}} % Some characters in tt font \def\bs{\char'134} \def\lt{\char'074} \def\gt{\char'076} \def\lb{\char'173} \def\rb{\char'175} \def\us{\char'137} % Style of a parameter \def\Param#1{\texttt{\textit{#1}}} % A reference to a section/page \newcommand{\RefSP}[1]{(section~\ref{#1}, page~\pageref{#1})} % Url in LaTeX output \ifpdf \newcommand{\Tilde}[1]{~#1} \newcommand{\MyUrl}[2]{\href{#1}{#2}} \newcommand{\MyUrlHtml}[2]{\href{#1}{#2}} \else \newcommand{\Tilde}[1]{\~{}#1} \newcommand{\MyUrl}[2]{\footahref{#1}{#2}} \newcommand{\MyUrlHtml}[2]{#2} \fi \newcommand{\MyEMail}[2]{#2\footnote{\texttt{#1}}} % General environments \newenvironment{CmdOptions}% {\begin{tabular}{p{4.5cm}l}}% {\end{tabular}} \newenvironment{ItemizeThreeCols}% {\begin{multicols}{3}\raggedcolumns\begin{itemize}}% {\end{itemize}\end{multicols}\SkipUp} \newenvironment{Indentation}% {\begin{list}{}{}% \item }% {\end{list}} \newenvironment{Code}% {\begin{Indentation}\begin{tt}}% {\end{tt}\end{Indentation}} \newenvironment{CodeTwoCols}[1][4cm]% {\begin{Indentation}\begin{tabular}{@{}p{#1}@{}l@{}}}% {\end{tabular}\end{Indentation}} \def\One#1{\multicolumn{2}{@{}l}{\texttt{#1}} \\} \def\Two#1#2{\texttt{#1} & #2\\} \def\SkipLine{\multicolumn{2}{@{}l}{} \\} \def\OneLine#1{\begin{Code}#1\end{Code}} \newcommand{\OneLineTwoCols}[3][4cm]% {\begin{CodeTwoCols}[#1]\Two{#2}{#3}\end{CodeTwoCols}} % fix for HeVeA info mode (\\ on a single line causes HeVeA to loop) % %\renewcommand{\OneLineTwoCols}[3][4cm]% % {\begin{CodeTwoCols}[#1]\texttt{#2} & {#3}\end{CodeTwoCols}} \newlength{\tmplg} \newcounter{colnbround} \newenvironment{TabularC}[1]% {\setcounter{colnbround}{#1} \addtocounter{colnbround}{1} \setlength{\tmplg}{\linewidth/#1 - \tabcolsep*2 % - \arrayrulewidth*\value{colnbround}/#1}% \par\begin{tabular*}{\linewidth}% {|*{#1}{>{\raggedright\arraybackslash\hspace{0pt}}% p{\the\tmplg}|}}}% {\end{tabular*}\par} % For use in tabular (parameter is column width) \newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}} \newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}} \newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1}} % Image inclusion \newcommand{\InsertImage}[2][0.83]% {\BL\begin{center}\fbox{\includegraphics[scale=#1]{#2}}\end{center}\BL} % Bips description \def\SPart#1{\textbf{#1}} \def\Templates{\SPart{Templates}} \def\Description{\SPart{Description}} \def\Errors{\SPart{Errors}} \def\Portability{\SPart{Portability}} \newenvironment{TemplatesOneCol}% {\Templates\par\begin{Code}}% {\end{Code}} \newenvironment{TemplatesTwoCols}% {\Templates\par\begin{multicols}{2}\raggedcolumns\begin{Code}}% {\end{Code}\end{multicols}\SkipUp} \def\PlErrorsNone{\Errors\par None.} \newenvironment{PlErrorsNoTitle}% {\par\begin{TabularC}{2}\hline}% {\end{TabularC}} \newenvironment{PlErrors}% {\Errors\begin{PlErrorsNoTitle}}% {\end{PlErrorsNoTitle}} \def\ErrCond#1{#1 &} \def\ErrTerm#1{\texttt{#1} \\ \hline} \def\ErrTermRm#1{#1 \\ \hline} % Index % new environnement to use \pagestyle{fancy} and \section{} % copied from article.cls with the following changes: % remove \thispagestyle{plain} % add \addcontentsline{toc}{section}{\numberline{}\indexname}} %BEGIN LATEX \makeatletter \renewenvironment{theindex} {\if@twocolumn \@restonecolfalse \else \@restonecoltrue \fi \columnseprule \z@ \columnsep 35\p@ \twocolumn[\section*{\indexname}]% \@mkboth{\MakeUppercase\indexname}% {\MakeUppercase\indexname}% \parindent\z@ \parskip\z@ \@plus .3\p@\relax \addcontentsline{toc}{section}{\numberline{}\indexname} \let\item\@idxitem} {\if@restonecol\onecolumn\else\clearpage\fi} \makeatother %END LATEX \def\OneUrl#1{\ahrefurl{\texttt{#1}}} % Define a section without no and include it in the TOC % 1= a label (name) for HeVeA (useless for LaTeX) % 2= The text of the section \newcommand{\SectionWithoutNo}[2] {\section*{#2}% \addcontentsline{toc}{section}{\numberline{}#2}} % Index management: % in the following, suffix T/TD/D/void means: % T: texttt, D: definition, TD: both, void: simple % |textbf does not seem to work with hyperref (pdflatex)... remove it \ifpdf \newcommand{\IndexBold}[1]{\index{#1}} \else \newcommand{\IndexBold}[1]{\index{#1|textbf}} \fi % Add an index entry % 1=alphabetic position 2=index term \newcommand{\IndT} [2]{\index{#1@\texttt{#2}}} \newcommand{\IndTD}[2]{\IndexBold{#1@\texttt{#2}}} \newcommand{\IndD} [2]{\IndexBold{#1@#2}} \newcommand{\Ind} [2]{\index{#1@#2}} % Add an index entry % 1=index term % 2=text to add at the end of the index term (suffix) \newcommand{\AddIndT} [2]{\IndT {#1}{#1#2}} \newcommand{\AddIndTD}[2]{\IndTD{#1}{#1#2}} \newcommand{\AddIndD} [2]{\IndD {#1}{#1#2}} \newcommand{\AddInd} [2]{\Ind {#1}{#1#2}} % Add text and an index entry % 1=text term 2=alphabetic position 3=complete index term \newcommand{\TxtIndZT} [3]{\texttt{#1}\IndT{#2}{#3}} \newcommand{\TxtIndZTD}[3]{\texttt{#1}\IndTD{#2}{#3}} \newcommand{\TxtIndZD} [3]{#1\IndD{#2}{#3}} \newcommand{\TxtIndZ} [3]{#1\Ind{#2}{#3}} % Add text and an index entry % 1=text term 2=index term (default = #1) % 3=text to add at the end of the index term (suffix) \newcommand{\TxtIndT}[3]% {\ifthenelse{\equal{#2}{!*!}}% {\TxtIndZT{#1}{#1}{#1#3}}% {\TxtIndZT{#1}{#2}{#2#3}}} \newcommand{\TxtIndTD}[3]% {\ifthenelse{\equal{#2}{!*!}}% {\TxtIndZTD{#1}{#1}{#1#3}}% {\TxtIndZTD{#1}{#2}{#2#3}}} \newcommand{\TxtIndD}[3]% {\ifthenelse{\equal{#2}{!*!}}% {\TxtIndZD{#1}{#1}{#1#3}}% {\TxtIndZD{#1}{#2}{#2#3}}}% \newcommand{\TxtInd}[3]% {\ifthenelse{\equal{#2}{!*!}} {\TxtIndZ{#1}{#1}{#1#3}}% {\TxtIndZ{#1}{#2}{#2#3}}} % Add... macros insert something in the index ONLY % Idx... macros insert something in the index AND in the text % Any word (roman font) \newcommand{\AddD} [1] {\AddIndD {#1}{}} \newcommand{\Add} [1] {\AddInd {#1}{}} \newcommand{\IdxD} [2][!*!] {\TxtIndD {#2}{#1}{}} \newcommand{\Idx} [2][!*!] {\TxtInd {#2}{#1}{}} % Keyword (tt font) \newcommand{\AddKD} [1] {\AddIndTD {#1}{}} \newcommand{\AddK} [1] {\AddIndT {#1}{}} \newcommand{\IdxKD} [2][!*!] {\TxtIndTD{#2}{#1}{}} \newcommand{\IdxK} [2][!*!] {\TxtIndT {#2}{#1}{}} % Directive \newcommand{\AddDiD}[1] {\AddIndTD {#1}{ \textrm{(directive)}}} \newcommand{\AddDi} [1] {\AddIndT {#1}{ \textrm{(directive)}}} \newcommand{\IdxDiD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(directive)}}} \newcommand{\IdxDi} [2][!*!] {\TxtIndT {#2}{#1}{ \textrm{(directive)}}} % Control Construct \newcommand{\AddCCD}[1] {\AddIndTD {#1}{}} \newcommand{\AddCC} [1] {\AddIndT {#1}{}} \newcommand{\IdxCCD}[2][!*!] {\TxtIndTD{#2}{#1}{}} \newcommand{\IdxCC} [2][!*!] {\TxtIndT {#2}{#1}{}} % Prolog Keyword \newcommand{\AddPKD}[1] {\AddIndTD {#1}{}} \newcommand{\AddPK} [1] {\AddIndT {#1}{}} \newcommand{\IdxPKD}[2][!*!] {\TxtIndTD{#2}{#1}{}} \newcommand{\IdxPK} [2][!*!] {\TxtIndT {#2}{#1}{}} % Prolog Built-in \newcommand{\AddPBD}[1] {\AddIndTD {#1}{}} \newcommand{\AddPB} [1] {\AddIndT {#1}{}} \newcommand{\IdxPBD}[2][!*!] {\TxtIndTD{#2}{#1}{}} \newcommand{\IdxPB} [2][!*!] {\TxtIndT {#2}{#1}{}} % Prolog Property \newcommand{\AddPPD}[1] {\AddIndTD {#1}{ \textrm{(property)}}} \newcommand{\AddPP} [1] {\AddIndT {#1}{ \textrm{(property)}}} \newcommand{\IdxPPD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(property)}}} \newcommand{\IdxPP} [2][!*!] {\TxtIndT {#2}{#1}{ \textrm{(property)}}} % Prolog Global Variable \newcommand{\AddPGD}[1] {\AddIndTD {#1}{ \textrm{(global var.)}}} \newcommand{\IdxPGD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(global var.)}}} % Prolog Option \newcommand{\AddPOD}[1] {\AddIndTD {#1}{ \textrm{(option)}}} \newcommand{\AddPO} [1] {\AddIndT {#1}{ \textrm{(option)}}} \newcommand{\IdxPOD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(option)}}} \newcommand{\IdxPO} [2][!*!] {\TxtIndT {#2}{#1}{ \textrm{(option)}}} % Prolog Mode \newcommand{\AddPMD}[1] {\AddIndTD {#1}{ \textrm{(mode)}}} \newcommand{\IdxPMD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(mode)}}} % Prolog Whence \newcommand{\AddPWD}[1] {\AddIndTD {#1}{ \textrm{(whence)}}} \newcommand{\IdxPWD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(whence)}}} % Prolog File Permission \newcommand{\AddPXD}[1] {\AddIndTD {#1}{ \textrm{(permission)}}} \newcommand{\IdxPXD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(permission)}}} % Prolog Token \newcommand{\AddPTD}[1] {\AddIndTD {#1}{ \textrm{(token)}}} \newcommand{\IdxPTD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(token)}}} % Prolog Flag \newcommand{\AddPFD}[1] {\AddIndTD {#1}{ \textrm{(flag)}}} \newcommand{\AddPF} [1] {\AddIndT {#1}{ \textrm{(flag)}}} \newcommand{\IdxPFD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(flag)}}} \newcommand{\IdxPF} [2][!*!] {\TxtIndT {#2}{#1}{ \textrm{(flag)}}} % Debugger Keyword \newcommand{\AddDKD}[1] {\AddIndTD {#1}{ \textrm{(debug)}}} \newcommand{\AddDK} [1] {\AddIndT {#1}{ \textrm{(debug)}}} \newcommand{\IdxDKD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(debug)}}} \newcommand{\IdxDK} [2][!*!] {\TxtIndT {#2}{#1}{ \textrm{(debug)}}} % Debugger Built-in \newcommand{\AddDBD}[1] {\AddIndTD {#1}{ \textrm{(debug)}}} \newcommand{\AddDB} [1] {\AddIndT {#1}{ \textrm{(debug)}}} \newcommand{\IdxDBD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(debug)}}} \newcommand{\IdxDB} [2][!*!] {\TxtIndT {#2}{#1}{ \textrm{(debug)}}} % FD Built-in \newcommand{\AddFBD}[1] {\AddIndTD {#1}{ \textrm{(FD)}}} \newcommand{\AddFB} [1] {\AddIndT {#1}{ \textrm{(FD)}}} \newcommand{\IdxFBD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(FD)}}} \newcommand{\IdxFB} [2][!*!] {\TxtIndT {#2}{#1}{ \textrm{(FD)}}} % FD Option \newcommand{\AddFOD}[1] {\AddIndTD {#1}{ \textrm{(FD option)}}} \newcommand{\IdxFOD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(FD option)}}} % FD Keyword \newcommand{\AddFKD}[1] {\AddIndTD {#1}{ \textrm{(FD)}}} \newcommand{\AddFK} [1] {\AddIndT {#1}{ \textrm{(FD)}}} \newcommand{\IdxFKD}[2][!*!] {\TxtIndTD{#2}{#1}{ \textrm{(FD)}}} \newcommand{\IdxFK} [2][!*!] {\TxtIndT {#2}{#1}{ \textrm{(FD)}}} ./gprolog-1.3.0/doc/compil-scheme.pdf0000644004425400513100000001325507614714327015777 0ustar diazloco%PDF-1.3 %Çì¢ 6 0 obj <> stream xœ­šKs¹ €ïó+æè¤J³ Èæã˜ç-UqÖU{–ey­FÞ•¼µÉ¿@€$È™4²Ëe«Ñ 6ø¡¦ ·þ£?oŽ»_vßý+ì|Úý²wUÕ~Ü÷~GÊB7yÿîãNlÜ>à¡@ÜûRö7?üéx÷Ó.J‰!쯜?lûwvo>ÞÝß>±êŠf@²pÐTÿ|ü|ÿùGÖ©êœUØ~#]ܱ*wwW×OO·Ç÷÷ÿåAcÌ©=:²ºJQÖLTglÒ!•´‘.»C©ºÏﺽùÂÊ®;µÃDë(yïè/+þþ×ýÍ燧/×wՌՇÛô_î>?ìíÃî¯0…)>ßÑ4÷wï¯ïd”åúáÃþ×§ÛÇyÄßÞíßîÞÒ®þ°ãÍ:Ò¿¡Øßï| ó5_|Ú¹åöÎþqÜ9OÑt¬%£kÈ’§¨Ñ#¢ãÝ`ÙÓÞ‘e†ªÿ´{ Dîvü ¿í0#±²EXæü¾®ŽÇ]à9ÀÆžÐEZÀýby¿ûøGuúí¦ü¤ }q&2 1$öë(‰Â–6žŠkš*!ib  ÃÜ®çà‘y¦e…´%y3Ÿ àK}šq6X¯2çÀÄŒ»€´¹…bëݶ¼}eÀ܆Ý;d0ÞYÓÉõ€Éõù€aD0™ï4`Ïú4ãÎì2ó0ï¿AÀ|Ûå£Ý®ªÑ€ù8Óë³óÙ¦óìyŸfÜiÀ.4eêyÛâÝ–ªiqƒ$½>oIÒùNó¬O3îL`.3e`0ðc²á¯ ¦AŒ^Ÿ KŒÎw˜ç}šq§¹Ð|¤†obèǶ Úm©š0$éõù€K’Îw°g}šqgv™ù+Irel‹Ëv[ªFãò I¯Ï,I:ßI`ž÷iÆæBóARm]¾–$ƶ8o·¥jZÀü I¯ÏŒ–dHÒùNö¬O3îLÀ.3%IÅu'9|_£’}Š\ž  ‰‰Ìu’g¼A§á¸À´²ã±³!wÈ_ߪl[æF™÷£ÊûßM´ mç›Èÿïl :×½ØôRZ0ûÜŠPPTµÐ;Û럯«¦¾kØfHëG‰ãö¾×°yΔ—úm£LP.7å  Oð•ÅK¦”:ÐK%Çòæo±’‚Õbu®|µXµò5ϹÆêy¿mÔI¬.1}@ZÔƒVêAßú-V”³¥«f€NŠ×Ký¶QkP.2í}eÍ ô=Ï/öšÎ~Ë,ĚЪɞʉ ë˜BÅ;ÉöËdöàeǰéSÿrcÔïs9wrÎUÂ!"¸}ð…Ï\Ž»7?ßão×G9Ò:Ð\Q ù,†nâñºÞ‡ —Þþ*ç½¢ë©Õ5^?ÛN¡â §Y÷wÿ¾}¬§`)JrØäéã¼a…=#æâþ*€ýeœMË—¯«Pú¸›ÏÇŸiè£,"Y‚(¥ël>ÊxL ú$C¸e±Ïâ C­g¹Vz–}”Ùd4FÑ:•]¬³aÖÑûJy»ë3fñLÄÖ±ÚZ$W%ØÄ¯ÛJ uÑçrR.â‰ÂÂ’ÓÑXKpJ^Gëm~–å€I¤\c’6µÚOÖõ ²SI; Þ‹äÛL^ÖåQeÌÕ³×ݪü!a‘çØX’'.ŋРK*Õ‡Ç:²Ä(Nª°Õ=J^ç ‡<ÙÀ‚Ž…"3‚eãA.¾®d9ó2c¨sb×Qv%G^bÑÄ7Ù¿‰o†Vnø<â“äË ¼ÞQàI2À“d€'ÉïË <Éx’&à}™'yžä x’'àIž€¯ú|Í_½ài5ø¶RžŸÊï‹Þ—xŸgà}¶À“4O3ïó ¼Ïx’&à}ž÷yïó <Éð$à}¶Àûl€¯ª|§_ àIÀÓbð$XàéAð$ à)xðª< xå{e¾V)г'ÀÃ1¥É'F0>E2>UÝ|6ëæSç¿©ÉiîÉwi³òôQåü¾OJ‰j|Št³ëK’}Åj==S4>ƒéÊÚôxÎ>\¥ÑÍwŽ,cm´&xNå0Ú ’½È¹Jamv4Ú\x>ùΣ "mk¤*hÑÛ ê¶ÑißЛ ª”(ÖR¨¦JË¥5A+soƒ´¨÷6‹+Ò²eÚ¤ÕÙrÉ£ œ£´Er¼—¤IÒª€ü‚Š£ Â\›­ Èßݦ Bú–®M…V*}Rϵ*P¥i|ª”r’îA­Sªµ¬µA˜¢´Iµ*`Ú¤½Ðº€)ÈÊ´./NPëºQ½¢²+’ÖŒ%6}µR[C„1–æOäm-F/Z-1ˆ\tvþÝŸôE¸µæO=my«cµTà–d%Z-H–•kÁ Æ%ÊZ3æ°YsVhg¤Ô/’[³¢÷Iš½SҬ轒f…vK5+z¯¤€k¢YÑ{%ÍŠÞ+)V½WªYÑ;%ŨwJš½SÒ¬è’nNï•tk{¯¤YÑ{%Í ]kÍŠÞ+iVh¯¤YÑ{¥–0e,YKVÀ’°dLYKVÀ’0e,YKVÀ’°d,YKVÀ’0e,YKVÀ”0e,YKVÀ’°d,Y1Z)ä¢Bõqlô¤Œ[/Ø¥Q°q£ ö¦`“S<¸Q°‘¥XFÁ®á*sÁnnGÁînµ`7·\—Õ¥ìæ®*š+)ØÍ“-Øã^+ØÍ¨ÕÞ6!×eõ$»-¡*tyݨ?@/ØÈ;Êu[±–áZ¯U°%ûíîÚ7|õendstream endobj 7 0 obj 2712 endobj 12 0 obj <> endobj 13 0 obj <> endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 11 0 obj <> endobj 9 0 obj <> endobj 8 0 obj <> endobj 10 0 obj <> endobj 2 0 obj <>endobj xref 0 14 0000000000 65535 f 0000003107 00000 n 0000005395 00000 n 0000003048 00000 n 0000003155 00000 n 0000002888 00000 n 0000000015 00000 n 0000002797 00000 n 0000005271 00000 n 0000004249 00000 n 0000005332 00000 n 0000003224 00000 n 0000002817 00000 n 0000002847 00000 n trailer << /Size 14 /Root 1 0 R /Info 2 0 R >> startxref 5447 %%EOF ./gprolog-1.3.0/doc/format-defs.tex0000644004425400513100000003726410547152502015504 0ustar diazloco\newpage \section{Format of definitions} %HEVEA\cutdef[1]{subsection} \subsection{General format} The definition of control constructs, directives and built-in predicates is presented as follows: \Templates Specifies the types of the arguments and which of them shall be instantiated (mode). Types and modes are described later \RefSP{Types-and-modes}. \Description Describes the behavior (in the absence of any error conditions). It is explicitly mentioned when a built-in predicate is re-executable on backtracking. Predefined operators involved in the definition are also mentioned. \Errors Details the error conditions. Possible errors are detailed later \RefSP{Errors}. For directives, this part is omitted. \Portability Specifies whether the definition conforms to the ISO standard or is a GNU Prolog extension. \subsection{Types and modes} \label{Types-and-modes} The templates part defines, for each argument of the concerned built-in predicate, its mode and type. The mode specifies whether or not the argument must be instantiated when the built-in predicate is called. The mode is encoded with a symbol just before the type. Possible modes are: \begin{itemize} \item \texttt{+}: the argument must be instantiated. \item \texttt{-}: the argument must be a variable (will be instantiated if the built-in predicate succeeds). \item \texttt{?}: the argument can be instantiated or a variable. \end{itemize} The type of an argument is defined by the following table: \begin{tabular}{|l|p{11.5cm}|} \hline Type & Description \\ \hline\hline \texttt{\Param{TYPE}\_list} & a list whose the type of each element is \Param{TYPE} \\ \hline \texttt{\Param{TYPE1}\_or\_\Param{TYPE2}} & a term whose type is either \Param{TYPE1} or \Param{TYPE2} \\ \hline \texttt{atom} & an atom \\ \hline \texttt{atom\_property} & an atom property \RefSP{atom-property/2} \\ \hline \texttt{boolean} & the atom \texttt{true} or \texttt{false} \\ \hline \texttt{byte} & an integer $\geq$ 0 and $\leq$ 255 \\ \hline \texttt{callable\_term} & an atom or a compound term \\ \hline \texttt{character} & a single character atom \\ \hline \texttt{character\_code} & an integer $\geq$ 1 and $\leq$ 255 \\ \hline \texttt{clause} & a clause (fact or rule) \\ \hline \texttt{close\_option} & a close option \RefSP{close/2} \\ \hline \texttt{compound\_term} & a compound term \\ \hline \texttt{evaluable} & an arithmetic expression \RefSP{Evaluation-of-an-arithmetic-expression} \\ \hline \texttt{fd\_bool\_evaluable} & a boolean FD expression \RefSP{Boolean-FD-expressions} \\ \hline \texttt{fd\_labeling\_option} & an FD labeling option \RefSP{fd-labeling/2} \\ \hline \texttt{fd\_evaluable} & an arithmetic FD expression \RefSP{FD-arithmetic-expressions} \\ \hline \texttt{fd\_variable} & an FD variable \\ \hline \texttt{flag} & a \Idx{Prolog flag} \RefSP{set-prolog-flag/2} \\ \hline \texttt{float} & a floating point number \\ \hline \texttt{head} & a head of a clause (atom or compound term) \\ \hline \texttt{integer} & an integer \\ \hline \texttt{in\_byte} & an integer $\geq$ 0 and $\leq$ 255 or \texttt{-1} (for the end-of-file) \\ \hline \texttt{in\_character} & a single character atom or the atom \texttt{end\_of\_file} (for the end-of-file) \\ \hline \texttt{in\_character\_code} & an integer $\geq$ 1 and $\leq$ 255 or \texttt{-1} (for the end-of-file) \\ \hline \texttt{io\_mode} & an atom in: \texttt{read}, \texttt{write} or \texttt{append} \\ \hline \texttt{list} & the empty list \texttt{[]} or a non-empty list \texttt{[\_|\_]} \\ \hline \texttt{nonvar} & any term that is not a variable \\ \hline \texttt{number} & an integer or a floating point number \\ \hline \texttt{operator\_specifier} & an operator specifier \RefSP{op/3:(Term-input/output)} \\ \hline \texttt{os\_file\_property} & an operating system file property \RefSP{file-property/2} \\ \hline \texttt{predicate\_indicator} & a term \texttt{Name/Arity} where \texttt{Name} is an atom and \texttt{Arity} an integer $\geq$ 0. A callable term can be given if the \IdxPF{strict\_iso} \Idx{Prolog flag} is switched off \RefSP{set-prolog-flag/2} \\ \hline \texttt{predicate\_property} & a predicate property \RefSP{predicate-property/2} \\ \hline \texttt{read\_option} & a read option \RefSP{read-term/3} \\ \hline \texttt{socket\_address} & a term of the form \texttt{'AF\_UNIX'(A)} or \texttt{'AF\_INET'(A,N)} where \texttt{A} is an atom and \texttt{N} an integer \\ \hline \texttt{socket\_domain} & an atom in: \texttt{'AF\_UNIX'} or \texttt{'AF\_INET'} \\ \hline \texttt{source\_sink} & an atom identifying a source or a sink \\ \hline \texttt{stream} & a stream-term: a term of the form \texttt{'\$stream'(N)} where \texttt{N} is an integer $\geq$ 0 \\ \hline \texttt{stream\_option} & a stream option \RefSP{open/4} \\ \hline \texttt{stream\_or\_alias} & a stream-term or an alias (atom) \\ \hline \texttt{stream\_position} & a stream position: a term \texttt{'\$stream\_position'(I1, I2, I3, I4)} where \texttt{I1}, \texttt{I2}, \texttt{I3} and \texttt{I4} are integers \\ \hline \texttt{stream\_property} & a stream property \RefSP{stream-property/2} \\ \hline \texttt{stream\_seek\_method} & an atom in: \texttt{bof}, \texttt{current} or \texttt{eof} \\ \hline \texttt{term} & any term \\ \hline \texttt{var\_binding\_option} & a variable binding option \RefSP{bind-variables/2} \\ \hline \texttt{write\_option} & a write option \RefSP{write-term/3} \\ \hline \end{tabular} \subsection{Errors} \label{Errors} \subsubsection{General format and error context} \label{General-format-and-error-context} When an error occurs an exception of the form: \texttt{error(\Param{ErrorTerm}, \Param{Caller})} is raised. \Param{ErrorTerm} is a term specifying the error (detailed in next sections) and \Param{Caller} is a term specifying the context of the error. The context is either the predicate indicator of the last invoked built-in predicate or an atom giving general context information. Using exceptions allows the user both to recover an error using \IdxPB{catch/3} \RefSP{catch/3} and to raise an error using \IdxPB{throw/1} \RefSP{catch/3}. To illustrate how to write error cases, let us write a predicate \texttt{my\_pred(X)} where \texttt{X} must be an integer: \begin{Indentation} \begin{verbatim} my_pred(X) :- ( nonvar(X) -> true ; throw(error(instantiation_error), my_pred/1)), ), ( integer(X) -> true ; throw(error(type_error(integer, X), my_pred/1)) ), ... \end{verbatim} \end{Indentation} To help the user to write these error cases, a set of system predicates is provided to raise errors. These predicates are of the form \texttt{'\$pl\_err\_...'} and they all refer to the implicit error context. The predicates \IdxPB{set\_bip\_name/2} \RefSP{set-bip-name/2} and \IdxPB{current\_bip\_name/2} \RefSP{current-bip-name/2} are provided to set and recover the name and the arity associated with this context (an arity $<$ 0 means that only the atom corresponding to the functor is significant). Using these system predicates the user could define the above predicate as follow: \begin{Indentation} \begin{verbatim} my_pred(X) :- set_bip_name(my_pred,1), ( nonvar(X) -> true ; '$pl_err_instantiation' ), ( integer(X) -> true ; '$pl_err_type'(integer, X) ), ... \end{verbatim} \end{Indentation} The following sections detail each kind of errors (and associated system predicates). \subsubsection{Instantiation error} \label{Instantiation-error} An instantiation error occurs when an argument or one of its components is variable while an instantiated argument was expected. \Param{ErrorTerm} has the following form: \texttt{instantiation\_error}. The system predicate \texttt{'\$pl\_err\_instantiation'} raises this error in the current error context \RefSP{General-format-and-error-context}. \subsubsection{Type error} \label{Type-error} A type error occurs when the type of an argument or one of its components is not the expected type (but not a variable). \Param{ErrorTerm} has the following form: \texttt{type\_error(\Param{Type}, Culprit)} where \Param{Type} is the expected type and \Param{Culprit} the argument which caused the error. \Param{Type} is one of: \begin{ItemizeThreeCols} \item \texttt{atom} \item \texttt{atomic} \item \texttt{boolean} \item \texttt{byte} \item \texttt{callable} \item \texttt{character} \item \texttt{compound} \item \texttt{evaluable} \item \texttt{fd\_bool\_evaluable} \item \texttt{fd\_evaluable} \item \texttt{fd\_variable} \item \texttt{float} \item \texttt{in\_byte} \item \texttt{in\_character} \item \texttt{integer} \item \texttt{list} \item \texttt{number} \item \texttt{predicate\_indicator} \item \texttt{variable} \end{ItemizeThreeCols} The system predicate \texttt{'\$pl\_err\_type'(Type, Culprit)} raises this error in the current error context \RefSP{General-format-and-error-context}. \subsubsection{Domain error} \label{Domain-error} A domain error occurs when the type of an argument is correct but its value is outside the expected domain. \Param{ErrorTerm} has the following form: \texttt{domain\_error(\Param{Domain}, \Param{Culprit})} where \Param{Domain} is the expected domain and \Param{Culprit} the argument which caused the error. \Param{Domain} is one of: \begin{ItemizeThreeCols} \item \texttt{atom\_property} \item \texttt{buffering\_mode} \item \texttt{character\_code\_list} \item \texttt{close\_option} \item \texttt{date\_time} \item \texttt{eof\_action} \item \texttt{fd\_labeling\_option} \item \texttt{flag\_value} \item \texttt{format\_control\_sequence} \item \texttt{g\_array\_index} \item \texttt{io\_mode} \item \texttt{non\_empty\_list} \item \texttt{not\_less\_than\_zero} \item \texttt{operator\_priority} \item \texttt{operator\_specifier} \item \texttt{os\_file\_permission} \item \texttt{os\_file\_property} \item \texttt{os\_path} \item \texttt{predicate\_property} \item \texttt{prolog\_flag} \item \texttt{read\_option} \item \texttt{selectable\_item} \item \texttt{socket\_address} \item \texttt{socket\_domain} \item \texttt{source\_sink} \item \texttt{statistics\_key} \item \texttt{statistics\_value} \item \texttt{stream} \item \texttt{stream\_option} \item \texttt{stream\_or\_alias} \item \texttt{stream\_position} \item \texttt{stream\_property} \item \texttt{stream\_seek\_method} \item \texttt{stream\_type} \item \texttt{term\_stream\_or\_alias} \item \texttt{var\_binding\_option} \item \texttt{write\_option} \end{ItemizeThreeCols} The system predicate \texttt{'\$pl\_err\_domain'(Domain, Culprit)} raises this error in the current error context \RefSP{General-format-and-error-context}. \subsubsection{Existence error} \label{Existence-error} an existence error occurs when an object on which an operation is to be performed does not exist. \Param{ErrorTerm} has the following form: \texttt{existence\_error(\Param{Object}, \Param{Culprit})} where \Param{Object} is the type of the object and \Param{Culprit} the argument which caused the error. \Param{Object} is one of: \begin{ItemizeThreeCols} \item \texttt{procedure} \item \texttt{source\_sink} \item \texttt{stream} \end{ItemizeThreeCols} The system predicate \texttt{'\$pl\_err\_existence'(Object, Culprit)} raises this error in the current error context \RefSP{General-format-and-error-context}. \subsubsection{Permission error} \label{Permission-error} A permission error occurs when an attempt to perform a prohibited operation is made. \Param{ErrorTerm} has the following form: \texttt{permission\_error(\Param{Operation}, \Param{Permission}, \Param{Culprit})} where \Param{Operation} is the operation which caused the error, \Param{Permission} the type of the tried permission and \Param{Culprit} the argument which caused the error. \Param{Operation} is one of: \begin{ItemizeThreeCols} \item \texttt{access} \item \texttt{add\_alias} \item \texttt{close} \item \texttt{create} \item \texttt{input} \item \texttt{modify} \item \texttt{open} \item \texttt{output} \item \texttt{reposition} \end{ItemizeThreeCols} and \Param{Permission} is one of: \begin{ItemizeThreeCols} \item \texttt{binary\_stream} \item \texttt{flag} \item \texttt{operator} \item \texttt{past\_end\_of\_stream} \item \texttt{private\_procedure} \item \texttt{source\_sink} \item \texttt{static\_procedure} \item \texttt{stream} \item \texttt{text\_stream} \end{ItemizeThreeCols} The system predicate \texttt{'\$pl\_err\_permission'(Operation, Permission, Culprit)} raises this error in the current error context \RefSP{General-format-and-error-context}. \subsubsection{Representation error} \label{Representation-error} A representation error occurs when an implementation limit has been breached. \Param{ErrorTerm} has the following form: \texttt{representation\_error(\Param{Limit})} where \Param{Limit} is the name of the reached limit. \Param{Limit} is one of: \begin{ItemizeThreeCols} \item \texttt{character} \item \texttt{character\_code} \item \texttt{in\_character\_code} \item \texttt{max\_arity} \item \texttt{max\_integer} \item \texttt{min\_integer} \item \texttt{too\_many\_variables} \end{ItemizeThreeCols} The errors \texttt{max\_integer} and \texttt{min\_integer} are not currently implemented. The system predicate \texttt{'\$pl\_err\_representation'(Limit)} raises this error in the current error context \RefSP{General-format-and-error-context}. \subsubsection{Evaluation error} \label{Evaluation-error} An evaluation error occurs when an arithmetic expression gives rise to an exceptional value. \Param{ErrorTerm} has the following form: \texttt{evaluation\_error(\Param{Error})} where \Param{Error} is the name of the error. \Param{Error} is one of: \begin{ItemizeThreeCols} \item \texttt{float\_overflow} \item \texttt{int\_overflow} \item \texttt{undefined} \item \texttt{underflow} \item \texttt{zero\_divisor} \end{ItemizeThreeCols} The errors \texttt{float\_overflow}, \texttt{int\_overflow}, \texttt{undefined} and \texttt{underflow} are not currently implemented. The system predicate \texttt{'\$pl\_err\_evaluation'(Error)} raises this error in the current error context \RefSP{General-format-and-error-context}. \subsubsection{Resource error} \label{Resource-error} A resource error occurs when GNU Prolog does not have enough resources. \Param{ErrorTerm} has the following form: \texttt{resource\_error(\Param{Resource})} where \Param{Resource} is the name of the resource. \Param{Resource} is one of: \begin{ItemizeThreeCols} \item \texttt{print\_object\_not\_linked} \item \texttt{too\_big\_fd\_constraint} \item \texttt{too\_many\_open\_streams} \end{ItemizeThreeCols} The system predicate \texttt{'\$pl\_err\_resource'(Resource)} raises this error in the current error context \RefSP{General-format-and-error-context}. \subsubsection{Syntax error} \label{Syntax-error} A syntax error occurs when a sequence of character does not conform to the syntax of terms. \Param{ErrorTerm} has the following form: \texttt{syntax\_error(\Param{Error})} where \Param{Error} is an atom explaining the error. The system predicate \texttt{'\$pl\_err\_syntax'(Error)} raises this error in the current error context \RefSP{General-format-and-error-context}. \subsubsection{System error} A system error can occur at any stage. A system error is generally associated with an external component (e.g. operating system). \Param{ErrorTerm} has the following form: \texttt{system\_error(\Param{Error})} where \Param{Error} is an atom explaining the error. This is an extension to ISO which only defines \texttt{system\_error} without arguments. The system predicate \texttt{'\$pl\_err\_system'(Error)} raises this error in the current error context \RefSP{General-format-and-error-context}. %HEVEA\cutend ./gprolog-1.3.0/doc/custom.hva0000644004425400513100000000470710547441545014571 0ustar diazloco% To have a title on the first page \input{article.hva} \title{GNU-Prolog Manual} % To have colored headings \def\@color{194} \input{fancysection.hva} % comment this to switch off colors % Define a section without no and include it in the TOC % 1= a label (name) for HeVeA (useless for LaTeX) % 2= The text of the section \newcommand{\SectionWithoutNo}[2] {\section*{\aname{#1}{#2}}% \addcontentsline{toc}{section}{\ahrefloc{#1}{#2}}} % Redefine default HeVeA behavior to add References and Index in the TOC \renewcommand{\@indexsection}[1]{\SectionWithoutNo{@index}{#1}} \renewcommand{\@bibliosection}[1]{\SectionWithoutNo{@biblio}{#1}} % To have a copyright footer \htmlfoot{ \rule{\linewidth}{1mm} \input{copyright.tex} Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved. \ahref{index.html\#copyright}{More about the copyright} } % To set foreground and background colors \renewcommand{\@bodyargs}{TEXT=black BGCOLOR=white} % To only have a reference to a section (without referencing the page) \newcommand{\RefSP}[1]{(section~\ref{#1})} % Url in HTML output \newcommand{\MyUrl}[2]{\ahref{#1}{#2}} \newcommand{\MyUrlHtml}[2]{\ahref{#1}{#2}} \newcommand{\MyEMail}[2]{\@aelement{HREF="mailto:#1"}{#2}} % Ignore vspace{xxx} of the original definition: \newcommand{\BL}{} \newcommand{\SkipUp}{} % To replace @{} in original definition by @{\quad}: \newenvironment{CodeTwoCols}[1][4cm]% {\begin{Indentation}\begin{tabular}{l@{\quad}l}}% {\end{tabular}\end{Indentation}} % To avoid the use of TabularC (\the\tmplg is not ok for HeVeA) % and to avoid vertical lines \newenvironment{PlErrorsNoTitle}% {\par\begin{tabular}{p{}@{\quad}p{}}\hline}% {\end{tabular}} % To use a gif image instead of an eps as in the original definition: \newcommand{\InsertImage}[1]{\begin{center}\imgsrc{#1.gif}\end{center}} % To define unknown macros: \newenvironment{multicols}[1]{}{} \def\arraybackslash{} \def\raggedcolumns{} % To give a name to the HTML file containing the index \let\@isection=\@indexsection \renewcommand{\@indexsection}[1]{\@isection{#1}\cutname{gprolog-idx.html}} \setcounter{tocdepth}{3} % to get index citations that point to section titles % this comes from /usr/lib/hevea/makeidx.hva \usepackage{makeidx} \renewcommand{\index}[1] {\if@refs\@saveclosed% \@@indexwrite[default]{#1}{\@currentlabel}{htoc\thetocanchor}%force evaluation \@restoreclosed\fi} ./gprolog-1.3.0/doc/debug-box.pdf0000644004425400513100000000262607614714327015126 0ustar diazloco%PDF-1.3 %Çì¢ 6 0 obj <> stream xœTÁNÃ0 ½ç+|¤…Äi–äŠÄ•8O¥cEí`c|>v’Š´hÒêØ~/yql%5(þåo3ˆƒ¸¼­àñUhèD%-¼ ­”chåØJÁ±wâ@ëˆÊŸf€«šÐÒC½‰Tƒ6(=‚uÒ@=ˆ³—cûÐ5›S{^?‰ënÄ í{/8{ OÛô½™˜lìD@.xÊ‹Çr1k$‹œabR*Ãö…«lÄM(îâ8éÆp/¶™p6b—·™'­2™­³™7y#1Z_MÌÄ"×,©-H>ÕÎØ$'‚—€–i¶ÎA¥ò¸J²7ú sUa]Z ¿É`XIð©öwú1Z( ø‡J”tÖ‘y­Ò*q:?®Xçt5â¾)çÆä.’Y0Nø¿\ƬS”™_/ç Û@[Ì5ˆ9!ycP9=1¸øLÓ»(HŠ6øs“1¡lƒ Ý¢‰‰ÔE&äqIÓò™'%•w õƒ8kß»;Vh´´ÁÂJÉ#ͦï9¢¥ÞÃÊXšìØnº>A!L ÐÈÕ´/§îy_Ìâµ8lendstream endobj 7 0 obj 427 endobj 10 0 obj <> endobj 11 0 obj <> endobj 5 0 obj <> /Contents 6 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 9 0 obj <> endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000000809 00000 n 0000001060 00000 n 0000000750 00000 n 0000000857 00000 n 0000000591 00000 n 0000000015 00000 n 0000000512 00000 n 0000000999 00000 n 0000000926 00000 n 0000000531 00000 n 0000000561 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R >> startxref 1112 %%EOF ./gprolog-1.3.0/doc/gprolog.html0000644004425400513100000364127010547441640015117 0ustar diazloco GNU-Prolog Manual

    GNU PROLOG


    A Native Prolog Compiler with Constraint Solving over Finite Domains

    Edition 1.8, for GNU Prolog version 1.3.0
    5th January, 2007
    by Daniel Diaz






    Copyright (C) 1999-2007 Daniel Diaz

    Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

    Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

    Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Free Software Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.




    Contents

    1  Acknowledgements

    I would like to thank the department of computing science at the university of Paris 1 for allowing me the time and freedom necessary to achieve this project.

    I am grateful to the members of the Loco project at INRIA Rocquencourt for their encouragement. Their involvement in this work led to useful feedback and exchange.

    I would particularly like to thank Jonathan Hodgson for the time and effort he put into the proofreading of this manual. His suggestions, both regarding ISO technical aspects as well as the language in which it was expressed, proved invaluable.

    The on-line HTML version of this document was created using HEVEA developed by Luc Maranget who kindly devoted so much of his time extending the capabilities of HEVEA in order to handle such a sizeable manual.

    Jean-Christophe Aude kindly improved the visual aspect of both the illustrations and the GNU Prolog web pages.

    Thanks to Richard A. O'Keefe for his advice regarding the implementation of some Prolog built-in predicates and for suggesting me the in-place installation feature.

    Many thanks to the following contributors: Many thanks to all those people at GNU who helped me to finalize the GNU Prolog project.

    Finally, I would like to thank everybody who tested preliminary releases and helped me to put the finishing touches to this system.

    2  Introduction

    GNU Prolog [5] is a free Prolog compiler with constraint solving over finite domains developed by Daniel Diaz. For recent information about GNU Prolog please consult the GNU Prolog page.

    GNU Prolog is a Prolog compiler based on the Warren Abstract Machine (WAM) [9, 1]. It first compiles a Prolog program to a WAM file which is then translated to a low-level machine independent language called mini-assembly specifically designed for GNU Prolog. The resulting file is then translated to the assembly language of the target machine (from which an object is obtained). This allows GNU Prolog to produce a native stand alone executable from a Prolog source (similarly to what does a C compiler from a C program). The main advantage of this compilation scheme is to produce native code and to be fast. Another interesting feature is that executables are small. Indeed, the code of most unused built-in predicates is not included in the executables at link-time.

    A lot of work has been devoted to the ISO compatibility. Indeed, GNU Prolog is very close to the ISO standard for Prolog [6].

    GNU Prolog also offers various extensions very useful in practice (global variables, OS interface, sockets,...). In particular, GNU Prolog contains an efficient constraint solver over Finite Domains (FD). This opens contraint logic pogramming to the user combining the power of constraint programming to the declarativity of logic programming. The key feature of the GNU Prolog solver is the use of a single (low-level) primitive to define all (high-level) FD constraints. There are many advantages of this approach: constraints can be compiled, the user can define his own constraints (in terms of the primitive), the solver is open and extensible (as opposed to black-box solvers like CHIP),...Moreover, the GNU Prolog solver is rather efficient, often more than commercial solvers.

    GNU Prolog is inspired from two systems developed by the same author:
    • wamcc: a Prolog to C compiler [3]. the key point of wamcc was its ability to produce stand alone executables using an original compilation scheme: the translation of Prolog to C via the WAM. Its drawback was the time needed by gcc to compile the produced sources. GNU Prolog can also produce stand alone executables but using a faster compilation scheme.

    • clp(FD): a constraint programming language over FD [4]. Its key feature was the use of a single primitive to define FD constraints. GNU Prolog is based on the same idea but offers an extended constraint definition language. In comparison to clp(FD), GNU Prolog offers new predefined constraints, new predefined heuristics, reified constraints,...
    Here are some features of GNU Prolog:
    • Prolog system:
      • conforms to the ISO standard for Prolog (floating point numbers, streams, dynamic code,...).

      • a lot of extensions: global variables, definite clause grammars (DCG), sockets interface, operating system interface,...

      • more than 300 Prolog built-in predicates.

      • Prolog debugger and a low-level WAM debugger.

      • line editing facility under the interactive interpreter with completion on atoms.

      • powerful bidirectional interface between Prolog and C.


    • Compiler:
      • native-code compiler producing stand alone executables.

      • simple command-line compiler accepting a wide variety of files: Prolog files, C files, WAM files,...

      • direct generation of assembly code 15 times faster than wamcc + gcc.

      • most of unused built-in predicates are not linked (to reduce the size of the executables).

      • compiled predicates (native-code) as fast as wamcmcc on average.

      • consulted predicates (byte-code) 5 times faster than wamcc.


    • Constraint solver:
      • FD variables well integrated into the Prolog environment (full compatibility with Prolog variables and integers). No need for explicit FD declarations.

      • very efficient FD solver (comparable to commercial solvers).

      • high-level constraints can be described in terms of simple primitives.

      • a lot of predefined constraints: arithmetic constraints, boolean constraints, symbolic constraints, reified constraints,...

      • several predefined enumeration heuristics.

      • the user can define his own new constraints.

      • more than 50 FD built-in constraints/predicates.

    3  Using GNU Prolog

    3.1  Introduction

    GNU Prolog offers two ways to execute a Prolog program:
    • interpreting it using the GNU Prolog interactive interpreter.

    • compiling it to a (machine-dependent) executable using the GNU Prolog native-code compiler.
    Running a program under the interactive interpreter allows the user to list it and to make full use of the debugger on it (section 4). Compiling a program to native code makes it possible to obtain a stand alone executable, with a reduced size and optimized for speed. Running a Prolog program compiled to native-code is around 3-5 times faster than running it under the interpreter. However, it is not possible to make full use of the debugger on a program compiled to native-code. Nor is it possible to list the program. In general, it is preferable to run a program under the interpreter for debugging and then use the native-code compiler to produce an autonomous executable. It is also possible to combine these two modes by producing an executable that contains some parts of the program (e.g. already debugged predicates whose execution-time speed is crucial) and interpreting the other parts under this executable. In that case, the executable has the same facilities as the GNU Prolog interpreter but also integrates the native-code predicates. This way to define a new enriched interpreter is detailed later (section 3.4.5).

    3.2  The GNU Prolog interactive interpreter

    3.2.1  Starting/exiting the interactive interpreter

    GNU Prolog offers a classical Prolog interactive interpreter also called top-level. It allows the user to execute queries, to consult Prolog programs, to list them, to execute them and to debug them. The top-level can be invoked using the following command:
    % gprolog [OPTION]...    (the % symbol is the operating system shell prompt)
    Options:
    –init-goal GOAL execute GOAL before top_level/0
    –entry-goal GOAL execute GOAL inside top_level/0
    –query-goal GOAL execute GOAL as a query for top_level/0
    –help print a help and exit
    –version print version number and exit
    do not parse the rest of the command-line

    The main role of the gprolog command is to execute the top-level itself, i.e. to execute the built-in predicate top_level/0 (section 7.18.1) which will produce something like:
    
    GNU Prolog 1.2.9
    By Daniel Diaz
    Copyright (C) 1999-2007 Daniel Diaz
    | ?-
    
    The top-level is ready to execute your queries as explained in the next section.

    To quit the top-level type the end-of-file key sequence (Ctl-D) or its term representation: end_of_file. It is also possible to use the built-in predicate halt/0 (section 7.18.1).

    However, before entering the top-level itself, the command-line is processed to treat all known options (those listed above). All unrecognized arguments are collected together to form the argument list which will be available using argument_value/2 (section 7.27.2) or argument_list/1 (section 7.27.3). The option stops the parsing of the command-line, all remainding options are collected into the argument list.

    Several options are provided to execute a goal before entering the interaction with the user:
    • The –init-goal option executes the GOAL as soon as it is encountered (while the commnad-line is processed). GOAL is thus executed before entering top_level/0.

    • The –entry-goal option executes the GOAL at the entry of top_level/0 just after the banner is displayed.

    • The –query-goal option executes the GOAL as if the user has typed in.
    The above order is thus the order in which each kind of goal (init, entry, query) is executed. If there are several goals of a same kind they are executed in the oder of appearance. Thus, all init goals are executed (in the order of appearance) before all entry goals and all entry goals are executed before all query goals.

    Each GOAL is passed as a shell argument (i.e. one shell string) and should not contain a terminal dot. Example: –init-goal 'write(hello), nl' under a sh-like. To be executed, a GOAL is transformed into a term using read_term_from_atom(Goal, Term, [end_of_term(eof)]). Respecting both the syntax of shell strings and of Prolog can be heavy. For instance, passing a backslash character \ can be difficult since it introduces an escape sequence both in sh and inside Prolog quoted atoms. The use of back quotes can then be useful since, by default, no escape sequence is processed inside back quotes (this behavior can be controlled using the back_quotes Prolog flag (section 7.22.1)).

    Since the Prolog argument list is created when the whole command-line is parsed, if a –init-goal option uses argument_value/2 or argument_list/1 it will obtained the original command-line arguments (i.e. including all recognized arguments).

    Here is an example of using execution goal options:
    % gprolog –init-goal 'write(before), nl' –entry-goal 'write(inside), nl'
    –query-goal 'append([a,b],[c,d],X)'
    will produce the following:
    
    before
    GNU Prolog 1.2.9
    By Daniel Diaz
    Copyright (C) 1999-2007 Daniel Diaz
    inside
    | ?- append([a,b],[c,d],X).
    
    X = [a,b,c,d]
    
    yes
    | ?-
    

    3.2.2  The interactive interpreter read-execute-write loop

    The GNU Prolog top-level is built on a classical read-execute-write loop that also allows for re-executions (when the query is not deterministic) as follows:
    • display the prompt, i.e. '| ?-'.

    • read a query (i.e. a goal).

    • execute the query.

    • in case of success display the values of the variables of the query.

    • if there are remaining alternatives (i.e. the query is not deterministic), display a ? and ask the user who can use one of the following commands: RETURN to stop the execution, ; to compute the next solution or a to compute all remaining solution.
    Here is an example of execution of a query (“find the lists X and Y such that the concatenation of X and Y is [a,b]”):
    | ?- append(X,Y,[a,b,c]).
     
    X = []
    Y = [a,b,c] ? ;    (here the user presses ; to compute another solution)
     
    X = [a]
    Y = [b,c] ? a    (here the user presses a to compute all remaining solutions)
     
    X = [a,b]
    Y = [c]    (here the user is not asked and the next solution is computed)
     
    X = [a,b,c]
    Y = []    (here the user is not asked and the next solution is computed)
     
    no    (no more solution)
    In some cases the top-level can detect that the current solution is the last one (no more alternatives remaining). In such a case it does not display the ? symbol (and does not ask the user). Example:
    | ?- (X=1 ; X=2).
     
    X = 1 ? ;    (here the user presses ; to compute another solution)
     
    X = 2    (here the user is not prompted since there are no more alternatives)
     
    yes
    The user can stop the execution even if there are more alternatives by typing RETURN.
    | ?- (X=1 ; X=2).
     
    X = 1 ?    (here the user presses RETURN to stop the execution)
     
    yes
    The top-level tries to display the values of the variables of the query in a readable manner. For instance, when a variable is bound to a query variable, the name of this variable appears. When a variable is a singleton an underscore symbol _ is displayed (_ is a generic name for a singleton variable, it is also called an anonymous variable). Other variables are bound to new brand variable names. When a query variable name X appears as the value of another query variable Y it is because X is itself not instantiated otherwise the value of X is displayed. In such a case, nothing is output for X itself (since it is a variable). Example:
    | ?- X=f(A,B,_,A), A=k.
     
    A = k    (the value of A is displayed also in f/3 for X)
    X = f(k,B,_,k)    (since B is a variable which is also a part of X, B is not displayed)
    | ?- functor(T,f,3), arg(1,T,X), arg(3,T,X).
     
    T = f(X,_,X)    (the 1st and 3rd args are equal to X, the 2nd is an anonymous variable)
    | ?- read_from_atom('k(X,Y,X).',T).
     
    T = k(A,_,A)    (the 1st and 3rd args are unified, a new variable name A is introduced)
    The top-level uses variable binding predicates (section 7.5). To display the value of a variable, the top-level calls write_term/3 with the following option list: [quoted(true),numbervars(false), namevars(true)] (section 7.14.6). A term of the form '$VARNAME'(Name) where Name is an atom is displayed as a variable name while a term of the form '$VAR'(N) where N is an integer is displayed as a normal compound term (such a term could be output as a variable name by write_term/3). Example:
    | ?- X='$VARNAME'('Y'), Y='$VAR'(1).
     
    X = Y    (the term '$VARNAME'('Y') is displayed as Y)
    Y = '$VAR'(1)    (the term '$VAR'(1) is displayed as is)
    | ?- X=Y, Y='$VAR'(1).
     
    X = '$VAR'(1)
    Y = '$VAR'(1)
    In the first example, X is explicitly bound to '$VARNAME'('Y') by the query so the top-level displays Y as the value of X. Y is unified with '$VAR'(1) so the top-level displays it as a normal compound term. It should be clear that X is not bound to Y (whereas it is in the second query). This behavior should be kept in mind when doing variable binding operations.

    Finally, the top-level computes the user-time (section 7.24.2) taken by a query and displays it when it is significant. Example:
    | ?- retractall(p(_)), assertz(p(0)),
         repeat,
            retract(p(X)),
            Y is X + 1,
            assertz(p(Y)),
            X = 1000, !.
     
    X = 1000
    Y = 1001
     
    (180 ms) yes    (the query took 180ms of user time)

    3.2.3  Consulting a Prolog program

    The top-level allows the user to consult Prolog source files. Consulted predicates can be listed, executed and debugged (while predicates compiled to native-code cannot). For more information about the difference between a native-code predicate and a consulted predicate refer to the introduction of this section (section 3.1) and to the part devoted to the compiler (section 3.4.1).

    To consult a program use the built-in predicate consult/1 (section 7.23.1). The argument of this predicate is a Prolog file name or user to specify the terminal. This allows the user to directly input the predicates from the terminal. In that case the input shall be terminated by the end-of-file key sequence (Ctl-D) or its term representation: end_of_file. A shorthand for consult(FILE) is [FILE]. Example:
    | ?- [user].
    {compiling user for byte code...}
    even(0).
    even(s(s(X))):-
            even(X).
         (here the user presses Ctl-D to end the input)
    {user compiled, 3 lines read - 350 bytes written, 1180 ms}
     
    | ?- even(X).
     
    X = 0 ? ;    (here the user presses ; to compute another solution)
     
    X = s(s(0)) ? ;    (here the user presses ; to compute another solution)
     
    X = s(s(s(s(0)))) ?    (here the user presses RETURN to stop the execution)
     
    yes
    | ?- listing.
     
    even(0).
    even(s(s(A))) :-
            even(A).
    When consult/1 (section 7.23.1) is invoked on a Prolog file it first runs the GNU Prolog compiler (section 3.4) as a child process to generate a temporary WAM file for byte-code. If the compilation fails a message is displayed and nothing is loaded. If the compilation succeeds, the produced file is loaded into memory using load/1 (section 7.23.2). Namely, the byte-code of each predicate is loaded. When a predicate P is loaded if there is a previous definition for P it is removed (i.e. all clauses defining P are erased). We say that P is redefined. Note that only consulted predicates can be redefined. If P is a native-code predicate, trying to redefine it will produce an error at load-time: the predicate redefinition will be ignored and the following message displayed:
    native code procedure P cannot be redefined
    Finally, an existing predicate will not be removed if it is not re-loaded. This means that if a predicate P is loaded when consulting the file F, and if later the definition of P is removed from the file F, consulting F again will not remove the previously loaded definition of P from the memory.

    Consulted predicates can be debugged using the Prolog debugger. Use the debugger predicate trace/0 or debug/0 (section 4.3.1) to activate the debugger.

    3.2.4  Interrupting a query

    Under the top-level it is possible to interrupt the execution of a query by typing the interruption key (Ctl-C). This can be used to abort a query, to stop an infinite loop, to activate the debugger,...When an interruption occurs the top-level displays the following message: Prolog interruption (h for help) ? The user can then type one of the following commands:
    Command Name Description
    a abort abort the current execution. Same as abort/0 (section 7.18.1)
    e exit quit the current Prolog process. Same as halt/0 (section 7.18.1)
    b break invoke a recursive top-level. Same as break/0 (section 7.18.1)
    c continue resume the execution
    t trace start the debugger using trace/0 (section 4.3.1)
    d debug start the debugger using debug/0 (section 4.3.1)
    h or ? help display a summary of available commands

    3.2.5  The line editor

    The line editor (linedit) allows the user to build/update the current input line using a variety of commands. This facility is available if the linedit part of GNU Prolog has been installed. linedit is implicitly called by any built-in predicate reading from a terminal (e.g. get_char/1, read/1,...). This is the case when the top-level reads a query.

    Bindings: each command of linedit is activated using a key. For some commands another key is also available to invoke the command (on some terminals this other key may not work properly while the primary key always works). Here is the list of available commands:
    Key Alternate key Description
    Ctl-B go to the previous character
    Ctl-F go to the next character
    Esc-B Ctl-← go to the previous word
    Esc-F Ctl-→ go to the next word
    Ctl-A Home go to the beginning of the line
    Ctl-E End go to the end of the line
    Ctl-H Backspace delete the previous character
    Ctl-D Delete delete the current character
    Ctl-U Ctl-Home delete from beginning of the line to the current character
    Ctl-K Ctl-End delete from the current character to the end of the line
    Esc-L   lower case the next word
    Esc-U   upper case the next word
    Esc-C   capitalize the next word
    Ctl-T   exchange last two characters
    Ctl-V Insert switch on/off the insert/replace mode
    Ctl-I Tab complete word (twice displays all possible completions)
    Esc-Ctl-I Esc-Tab insert spaces to emulate a tabulation
    Ctl-space   mark beginning of the selection
    Esc-W   copy (from the begin selection mark to the current character)
    Ctl-W   cut (from the begin selection mark to the current character)
    Ctl-Y   paste
    Ctl-P recall previous history line
    Ctl-N recall next history line
    Esc-P   recall previous history line beginning with the current prefix
    Esc-N   recall next history line beginning with the current prefix
    Esc-< Page Up recall first history line
    Esc-> Page Down recall last history line
    Ctl-C   generate an interrupt signal (section 3.2.4)
    Ctl-D   generate an end-of-file character (at the begin of the line)
    RETURN   validate a line
    Esc-?   display a summary of available commands

    History: when a line is entered (i.e. terminated by RETURN), linedit records it in an internal list called history. It is later possible to recall history lines using appropriate commands (e.g. Ctl-P recall the last entered line) and to modify them as needed. It is also possible to recall a history line beginning with a given prefix. For instance to recall the previous line beginning with write simply type write followed by Esc-P. Another Esc-P will recall an earlier line beginning with write,...

    Completion: another important feature of linedit is its completion facility. Indeed, linedit maintains a list of known words and uses it to complete the prefix of a word. Initially this list contains all predefined atoms and the atoms corresponding to available predicates. This list is dynamically updated when a new atom appears in the system (whether read at the top-level, created with a built-in predicate, associated with a new consulted predicate,...). When the completion key (Tab) is pressed linedit acts as follows:
    • use the current word as a prefix.

    • collect all words of the list that begin with this prefix.

    • complete the current word with the longest common part of all matching words.

    • if more than one word matches emit a beep (a second Tab will display all possibilities).
    Example:
    | ?- argu    (here the user presses Tab to complete the word)
    | ?- argument_    (linedit completes argu with argument_ and emits a beep)
         (the user presses again Tab to see all possible completions)
    argument_counter    (linedit shows 3 possible completions)
    argument_list
    argument_value
    | ?- argument_    (linedit redisplays the input line)
     
    | ?- argument_c    (to select argument_counter the user presses c and Tab)
    | ?- argument_counter    (linedit completes with argument_counter)
    Finally, linedit allows the user to check that (square/curly) brackets are well balanced. For this, when a close bracket symbol, i.e. ), ] or }, is typed, linedit determines the associated open bracket, i.e. (, [ or {, and temporarily repositions the cursor on it to show the match.

    3.3  Adjusting the size of Prolog stacks

    GNU Prolog uses several stacks to execute a Prolog program. Each stack has a static size and cannot be dynamically increased during the execution. For each stack there is a default size but the user can define a new size by setting an environment variable. When a GNU Prolog program is run it first consults these variables and if they are not defined uses the default sizes. The following table presents each stack of GNU Prolog with its default size and the name of its associated environment variable:
    Stack Default Environment Description
    name size (Kb) variable  
    local 4096 LOCALSZ control stack (environments and choice-points)
    global 8192 GLOBALSZ heap (compound terms)
    trail 3072 TRAILSZ conditional bindings (bindings to undo at backtracking)
    cstr 3072 CSTRSZ finite domain constraint stack (FD variables and constraints)

    If the size of a stack is too small an overflow will occur during the execution. In that case GNU Prolog emits the following error message before stopping:
    S stack overflow (size: N Kb, environment variable used: E)
    where S is the name of the stack, N is the current stack size in Kb and E the name of the associated environment variable. When such a message occurs it is possible to (re)define the variable E with the new size. For instance to allocate 8192 Kb to the local stack under a Unix shell use:
    LOCALSZ=8192; export LOCALS    (under sh or bash)
    setenv LOCALSZ 8192    (under csh or tcsh)
    This method allows the user to adjust the size of Prolog stacks. However, in some cases it is preferable not to allow the user to modify these sizes. For instance, when providing a stand alone executable whose behavior should be independent of the environment in which it is run. In that case the program should not consult environment variables and the programmer should be able to define new default stack sizes. The GNU Prolog compiler offers this facilities via several command-line options such as –local-size or –fixed-sizes (section 3.4.3).

    Finally note that GNU Prolog stacks are virtually allocated (i.e. use virtual memory). This means that a physical memory page is allocated only when needed (i.e. when an attempt to read/write it occurs). Thus it is possible to define very large stacks. At the execution, only the needed amount of space will be physically allocated.

    3.4  The GNU Prolog compiler

    3.4.1  Different kinds of codes

    One of the main advantages of GNU Prolog is its ability to produce stand alone executables. A Prolog program can be compiled to native code to give rise to a machine-dependent executable using the GNU Prolog compiler. However native-code predicates cannot be listed nor fully debugged. So there is an alternative to native-code compilation: byte-code compilation. By default the GNU Prolog compiler produces native-code but via a command-line option it can produce a file ready for byte-code loading. This is exactly what consult/1 does as was explained above (section 3.2.3). GNU Prolog also manages interpreted code using a Prolog interpreter written in Prolog. Obviously interpreted code is slower than byte-code but does not require the invocation of the GNU Prolog compiler. This interpreter is used each time a meta-call is needed as by call/1 (section 6.2.3). This also the case of dynamically asserted clauses. The following table summarizes these three kinds of codes:
    Type Speed Debug ? For what
    interpreted-code slow yes meta-call and dynamically asserted clauses
    byte-code medium yes consulted predicates
    native-code fast no compiled predicates

    3.4.2  Compilation scheme

    Native-code compilation: a Prolog source is compiled in several stages to produce an object file that is linked to the GNU Prolog libraries to produce an executable. The Prolog source is first compiled to obtain a WAM [9] file. For a detailed study of the WAM the interested reader can refer to “Warren's Abstract Machine: A Tutorial Reconstruction” [1]. The WAM file is translated to a machine-independent language specifically designed for GNU Prolog. This language is close to a (universal) assembly language and is based on a very reduced instruction set. For this reason this language is called mini-assembly (MA). The mini-assembly file is then mapped to the assembly language of the target machine. This assembly file is assembled to give rise to an object file which is then linked with the GNU Prolog libraries to provide an executable. The compiler also takes into account Finite Domain constraint definition files. It translates them to C and invoke the C compiler to obtain object files. The following figure presents this compilation scheme:



    Obviously all intermediate stages are hidden to the user who simply invokes the compiler on his Prolog file(s) (plus other files: C,...) and obtains an executable. However, it is also possible to stop the compiler at any given stage. This can be useful, for instance, to see the WAM code produced (perhaps when learning the WAM). Finally it is possible to give any kind of file to the compiler which will insert it in the compilation chain at the stage corresponding to its type. The type of a file is determined using the suffix of its file name. The following table presents all recognized types/suffixes:
    Suffix of the file Type of the file Handled by:
    .pl, .pro Prolog source file pl2wam
    .wam WAM source file wam2ma
    .ma Mini-assembly source file ma2asm
    .s Assembly source file the assembler
    .c, .C, .CC, .cc, .cxx, .c++, .cpp C or C++ source file the C compiler
    .fd Finite Domain constraint source file fd2c
    any other suffix (.o, .a,...) any other type (object, library,...) the linker (C linker)

    Byte-code compilation: the same compiler can be used to compile a source Prolog file for byte-code. In that case the Prolog to WAM compiler is invoked using a specific option and produces a WAM for byte-code source file (suffixed .wbc) that can be later loaded using load/1 (section 7.23.2). Note that this is exactly what consult/1 (section 7.23.1) does as explained above (section 3.2.3).

    3.4.3  Using the compiler

    The GNU Prolog compiler is a command-line compiler similar in spirit to a Unix C compiler like gcc. To invoke the compiler use the gplc command as follows:
    % gplc [OPTION]... FILE...    (the % symbol is the operating system shell prompt)
    The arguments of gplc are file names that are dispatched in the compilation scheme depending on the type determined from their suffix as was explained previously (section 3.4.2). All object files are then linked to produce an executable. Note however that GNU Prolog has no module facility (since there is not yet an ISO reference for Prolog modules) thus a predicate defined in a Prolog file is visible from any other predicate defined in any other file. GNU Prolog allows the user to split a big Prolog source into several files but does not offer any way to hide a predicate from others.

    The simplest way to obtain an executable from a Prolog source file prog.pl is to use:
    % gplc prog.pl
    This will produce an native executable called prog which can be executed as follows:
    % prog
    However, there are several options that can be used to control the compilation:

    General options:
    -o FILE, –output FILE use FILE as the name of the output file
    -W, –wam-for-native stop after producing WAM files(s)
    -w, –wam-for-byte-code stop after producing WAM for byte-code file(s) (force –no-call-c)
    -M, –mini-assembly stop after producing mini-assembly files(s)
    -S, –assembly stop after producing assembly files (s)
    -F, –fd-to-c stop after producing C files(s) from FD constraint definition file(s)
    -c, –object stop after producing object files(s)
    –temp-dir PATH use PATH as directory for temporary files
    –no-del-temp do not delete temporary files
    –no-decode-hexa do not decode hexadecimal predicate names
    -v, –verbose print executed commands
    -h, –help print a help and exit
    –version print version number and exit

    Prolog to WAM compiler options:
    –pl-state FILE read FILE to set the initial Prolog state
    –no-susp-warn do not show warnings for suspicious predicates
    –no-singl-warn do not show warnings for named singleton variables
    –no-redef-error no not show errors for built-in predicate redefinitions
    –foreign-only only compile foreign/1-2 directives
    –no-call-c do not allow the use of fd_tell, '$call_c',...
    –no-inline do not inline predicates
    –no-reorder do not reorder predicate arguments
    –no-reg-opt do not optimize registers
    –min-reg-opt minimally optimize registers
    –no-opt-last-subterm do not optimize last subterm compilation
    –fast-math use fast mathematical mode (assume integer arithmetics)
    –keep-void-inst keep void WAM instructions in the output file
    –compile-msg print a compile message
    –statistics print statistics information

    WAM to mini-assembly translator options:
    –comment include comments in the output file

    Mini-assembly to assembly translator options:
    –comment include comments in the output file

    C compiler options:
    –c-compiler FILE use FILE as C compiler
    -C OPTION pass OPTION to the C compiler

    Assembler options:
    -A OPTION pass OPTION to the assembler

    Linker options:
    –local-size N set default local stack size to N Kb
    –global-size N set default global stack size to N Kb
    –trail-size N set default trail stack size to N Kb
    –cstr-size N set default constraint stack size to N Kb
    –fixed-sizes do not consult environment variables at run-time (use default sizes)
    –no-top-level do not link the top-level (force –no-debugger)
    –no-debugger do not link the Prolog/WAM debugger
    –min-pl-bips link only used Prolog built-in predicates
    –min-fd-bips link only used FD solver built-in predicates
    –min-bips shorthand for: –no-top-level –min-pl-bips –min-fd-bips
    –min-size shorthand² for: –min-bips –strip
    –no-fd-lib do not look for the FD library (maintenance only)
    -s, –strip strip the executable
    -L OPTION Pass OPTION to the linker

    It is possible to only give the prefix of an option if there is no ambiguity.

    The name of the output file is controlled via the -o FILE option. If present the output file produced will be named FILE. If not specified, the output file name depends on the last stage reached by the compiler. If the link is not done the output file name(s) is the input file name(s) with the suffix associated with the last stage. If the link is done, the name of the executable is the name (without suffix) of the first file name encountered in the command-line. Note that if the link is not done -o has no sense in the presence of multiple input file names. For this reason, several meta characters are available for substitution in FILE:
    • %f is substitued by the whole input file name.
    • %F is similar to %f but the directory part is omitted.
    • %p is substitued by the whole prefix file name (omitting the suffix).
    • %P is similar to %p but the directory part is omitted.
    • %s is substitued by the file suffix (including the dot).
    • %d is substitued by the directory part (empty if no directory is specified).
    • %c is substitued by the value of an internal counter starting from 1 and auto-incremented.
    By default the compiler runs in the native-code compilation scheme. To generate a WAM file for byte-code use the –wam-for-byte-code option. The resulting file can then be loaded using load/1 (section 7.23.2).

    To execute the Prolog to WAM compiler in a given read environment (operator definitions, character conversion table,...) use –pl-state FILE. The state file should be produced by write_pl_state_file/1 (section 7.22.5).

    By default the Prolog to WAM compiler inlines calls to some deterministic built-in predicates (e.g. arg/3 and functor/3). Namely a call to such a predicate will not yield a classical predicate call but a simple C function call (which is obviously faster). It is possible to avoid this using –no-inline.

    Another optimization performed by the Prolog to WAM compiler is unification reordering. The arguments of a predicate are reordered to optimize unification. This can be deactivated using –no-reorder. The compiler also optimizes the unification/loading of nested compound terms. More precisely, the compiler emits optimized instructions when the last subterm of a compound term is itself a compound term (e.g. lists). This can be deactivated using –no-opt-last-subterm.

    By default the Prolog to WAM compiler fully optimizes the allocation of registers to decrease both the number of instruction produced and the number of used registers. A good allocation will generate many void instructions that are removed from the produced file except if –keep-void-inst is specified. To prevent any optimization use –no-reg-opt while –min-reg-opt forces the compiler to only perform simple register optimizations.

    The Prolog to WAM compiler emits an error when a control construct or a built-in predicate is redefined. This can be avoided using –no-redef-error. The compiler also emits warnings for suspicious predicate definitions like -/2 since this often corresponds to an earlier syntax error (e.g. - instead of _. This can be deactivated by specifying –no-susp-warn. Finally, the compiler warns when a singleton variable has a name (i.e. not the generic anonymous name _). This can be deactivated specifying –no-singl-warn.

    Predicate names are encoded with an hexadecimal representation. This is explained in more detail later (section 3.4.6). By default the error messages from the linker (e.g. multiple definitions for a given predicate, reference to an undefined predicate,...) are filtered to replace any hexadecimal representation by the real predicate name. Specifying the –no-decode-hexa prevents gplc from filtering linker output messages and hexadecimal representations are then shown.

    When producing an executable it is possible to specify default stack sizes (using STACK_NAME-size) and to prevent it from consulting environment variables (using –fixed-sizes) as was explained above (section 3.3). By default the produced executable will include the top-level, the Prolog/WAM debugger and all Prolog and FD built-in predicates. It is possible to avoid linking the top-level (section 3.2) by specifying –no-top-level. In this case, at least one initialization/1 directive (section 6.1.13) should be defined. The option –no-debugger does not link the debugger. To include only used built-in predicates that are actually used the options –no-pl-bips and/or –no-fd-bips can be specified. For the smallest executable all these options should be specified. This can be abbreviated by using the shorthand option –min-bips. By default, executables are not stripped, i.e. their symbol table is not removed. This table is only useful for the C debugger (e.g. when interfacing Prolog and C). To remove the symbol table (and then to reduce the size of the final executable) use –strip. Finally –min-size is a shortcut for –min-bips and –strip, i.e. the produced executable is as small as possible.

    Example: compile and link two Prolog sources prog1.pl and prog2.pl. The resulting executable will be named prog1 (since -o is not specified):
    % gplc prog1.pl prog2.pl
    Example: compile the Prolog file prog.pl to study basic WAM code. The resulting file will be named prog.wam:
    % gplc -W –no-inline –no-reorder –keep-void-inst prog.pl
    Example: compile the Prolog file prog.pl and its C interface file utils.c to provide an autonomous executable called mycommand. The executable is not stripped to allow the use of the C debugger:
    % gplc -o mycommand prog.pl utils.c
    Example: detail all steps to compile the Prolog file prog.pl (the resulting executable is stripped). All intermediate files are produced (prog.wam, prog.ma, prog.s, prog.o and the executable prog):
    % gplc -W prog.pl
    % gplc -M --comment prog.wam
    % gplc -S --comment prog.ma
    % gplc -c prog.s
    % gplc -o prog -s prog.o
    

    3.4.4  Running an executable

    In this section we explain what happens when running an executable produced by the GNU Prolog native-code compiler. The default main function first starts the Prolog engine. This function collects all linked objects (issued from the compilation of Prolog files) and initializes them. The initialization of a Prolog object file consists in adding to appropriate tables new atoms, new predicates and executing its system directives. A system directive is generated by the Prolog to WAM compiler to reflect a (user) directive executed at compile-time such as op/3 (section 6.1.10). Indeed, when the compiler encounters such a directive it immediately executes it and also generates a system directive to execute it at the start of the executable. When all system directives have been executed the Prolog engine executes all initialization directives defined with initialization/1 (section 6.1.13). If several initialization directives appear in the same file they are executed in the order of appearance. If several initialization directives appear in different files the order in which they are executed is machine-dependant. However, on most machines the order will be the reverse order in which the associated files have been linked (this is not true under native win32). When all initialization directives have been executed the default main function looks for the GNU Prolog top-level. If present (i.e. it has been linked) it is called otherwise the program simply ends. Note that if the top-level is not linked and if there is no initialization directive the program is useless since it simply ends without doing any work. The default main function detects such a behavior and emits a warning message.

    Example: compile an empty file prog.pl without linking the top-level and execute it:
    % gplc --no-top-level prog.pl
    % prog
    Warning: no initial goal executed
       use a directive :- initialization(Goal)
       or remove the link option --no-top-level (or --min-bips or --min-size)
    

    3.4.5  Generating a new interactive interpreter

    In this section we show how to define a new top-level extending the GNU Prolog interactive interpreter with new predicate definitions. The obtained top-level can then be considered as an enriched version of the basic GNU Prolog top-level (section 3.2). Indeed, each added predicate can be viewed as a predefined predicate just like any other built-in predicate. This can be achieved by compiling these predicates and including the top-level at link-time.

    The real question is: why would we include some predicates in a new top-level instead of simply consulting them under the GNU Prolog top-level ? There are two reasons for this:
    • the predicate cannot be consulted. This is the case of a predicate calling foreign code, like a predicate interfacing with C (section 9) or a predicate defining a new FD constraint.

    • the performance of the predicate is crucial. Since it is compiled to native-code such a predicate will be executed very quickly. Consulting will load it as byte-code. The gain is much more noticeable if the program is run under the debugger. The included version will not be affected by the debugger while the consulted version will be several times slower. Obviously, a predicate should be included in a new top-level only when it is itself debugged since it is difficult to debug native-code.
    To define a new top-level simply compile the set of desired predicates and linking them with the GNU Prolog top-level (this is the default) using gplc (section 3.4.3).

    Example: let us define a new top-level called my_top_level including all predicates defined in prog.pl:
    % gplc -o my_top_level prog.pl
    By the way, note that if prog.pl is an empty Prolog file the previous command will simply create a new interactive interpreter similar to the GNU Prolog top-level.

    Example: as before where some predicates of prog.pl call C functions defined in utils.c:
    % gplc -o my_top_level prog.pl utils.c
    In conclusion, defining a particular top-level is nothing else but a particular case of the native-code compilation. It is simple to do and very useful in practice.

    3.4.6  The hexadecimal predicate name encoding

    When the GNU Prolog compiler compiles a Prolog source to an object file it has to associate a symbol to each predicate name. However, the syntax of symbols is restricted to identifiers: string containing only letters, digits or underscore characters. On the other hand, predicate names (i.e. atoms) can contain any character with quotes if necessary (e.g. 'x+y=z' is a valid predicate name). The compiler has then to encode predicate names respecting the syntax of identifiers. To achieve this, GNU Prolog uses an hexadecimal representation where each predicate name is translated to a symbol beginning with an X followed by the hexadecimal notation of the code of each character of the name.

    Example: 'x+y=z' will be encoded as X782B793D7A since 78 is the hexadecimal representation of the code of x, 2B of the code of +, etc.

    Since Prolog allows the user to define several predicates with the same name but with a different arity GNU Prolog encodes predicate indicators (predicate name followed by the arity). The symbol associated with the predicate name is then followed by an underscore and by the decimal notation of the arity.

    Example: 'x+y=z'/3 will be encoded as X782B793D7A_3.

    So, from the mini-assembly stage, each predicate indicator is replaced by its hexadecimal encoding. The knowledge of this encoding is normally not of interest for the user, i.e. the Prolog programmer. For this reason the GNU Prolog compiler hides this encoding. When an error occurs on a predicate (undefined predicate, predicate with multiple definitions,...) the compiler has to decode the symbol associated with the predicate indicator. For this gplc filters each message emitted by the linker to locate and decode eventual predicate indicators. This filtering can be deactivated specifying –no-decode-hexa when invoking gplc (section 3.4.3).

    This filter is provided as an utility that can be invoked using the hexgplc command as follows:
    % hexgplc [OPTION]... FILE...    (the % symbol is the operating system shell prompt)
    Options:
    –encode encoding mode (default mode is decoding)
    –relax decode also predicate names (not only predicate indicators)
    –printf FORMAT pass encoded/decoded string to C printf(3) with FORMAT
    –aux-father decode an auxiliary predicate as its father
    –aux-father2 decode an auxiliary predicate as its father + auxiliary number
    –cmd-line encode/decode each argument of the command-line
    -H same as: –cmd-line –encode
    -P same as: –cmd-line –relax
    –help print a help and exit
    –version print version number and exit

    It is possible to give a prefix of an option if there is no ambiguity.

    Without arguments hexgplc runs in decoding mode reading its standard input and decoding each symbol corresponding to a predicate indicator. To use hexgplc in the encoding mode the –encode option must be specified. By default hexgplc only decodes predicate indicators, this can be relaxed using –relax to also take into account simple predicate names (the arity can be omitted). It is possible to format the output of an encoded/decoded string using –printf FORMAT in that case each string S is passed to the C printf(3) function as printf(FORMAT,S).

    Auxiliary predicates are generated by the Prolog to WAM compiler when simplifying some control constructs like ';'/2 present in the body of a clause. They are of the form '$NAME/ARITY_$auxN' where NAME/ARITY is the predicate indicator of the simplified (i.e. father) predicate and N is a sequential number (a predicate can give rise to several auxiliary predicates). It is possible to force hexgplc to decode an auxiliary predicate as its father predicate indicator using –aux-father or as its father predicate indicator followed by the sequential number using –aux-father2.

    If no file is specified, hexgplc processes its standard input otherwise each file is treated sequentially. Specifying the –cmd-line option informs hexgplc that each argument is not a file name but a string that must be encoded (or decoded). This is useful to encode/decode a particular string. For this reason the option -H (encode to hexadecimal) and -P (decode to Prolog) are provided as shorthand. Then, to obtain the hexadecimal representation of a predicate P use:
    % hexgplc -H P
    Example:
    % hexgplc -H 'x+y=z'
    X782B793D7A
    

    4  Debugging

    4.1  Introduction

    The GNU Prolog debugger provides information concerning the control flow of the program. The debugger can be fully used on consulted predicates (i.e. byte-code). For native compiled code only the calls/exits are traced, no internal behavior is shown. Under the debugger it is possible to exhaustively trace the execution or to set spy-points to only debug a specific part of the program. Spy-points allow the user to indicate on which predicates the debugger has to stop to allow the user to interact with it. The debugger uses the “procedure box control flow model”, also called the Byrd Box model since it is due to Lawrence Byrd.

    4.2  The procedure box model

    The procedure box model of Prolog execution provides a simple way to show the control flow. This model is very popular and has been adopted in many Prolog systems (e.g. SICStus Prolog, Quintus Prolog,...). A good introduction is the chapter 8 of “Programming in Prolog” of Clocksin & Mellish [2]. The debugger executes a program step by step tracing an invocation to a predicate (call) and the return from this predicate due to either a success (exit) or a failure (fail). When a failure occurs the execution backtracks to the last predicate with an alternative clause. The predicate is then re-invoked (redo). Another source of change of the control flow is due to exceptions. When an exception is raised from a predicate (exception) by throw/1 (section 6.2.4) the control is given back to the most recent predicate that has defined a handler to recover this exception using catch/3 (section 6.2.4). The procedure box model shows these different changes in the control flow, as illustrated here:



    Each arrow corresponds to a port. An arrow to the box indicates that the control is given to this predicate while an arrow from the box indicates that the control is given back from the procedure. This model visualizes the control flow through these five ports and the connections between the boxes associated with subgoals. Finally, it should be clear that a box is associated with one invocation of a given predicate. In particular, a recursive predicate will give raise to a box for each invocation of the predicate with different entries/exits in the control flow. Since this might get confusing for the user, the debugger associates with each box a unique identifier (i.e. the invocation number).

    4.3  Debugging predicates

    4.3.1  Running and stopping the debugger

    trace/0 activates the debugger. The next invocation of a predicate will be traced.

    debug/0 activates the debugger. The next invocation of a predicate on which a spy-point has been set will be traced.

    It is important to understand that the information associated with the control flow is only available when the debugger is on. For efficiency reasons, when the debugger is off the information concerning the control flow (i.e. the boxes) is not retained. So, if the debugger is activated in the middle of a computation (by a call to debug/0 or trace/0 in the program or after the interrupt key sequence (Ctl-C) by choosing trace or debug), information prior to this point is not available.

    debugging/0: prints onto the terminal information about the current debugging state (whether the debugger is switched on, what are the leashed ports, spy-points defined,...).

    notrace/0 or nodebug/0 switches the debugger off.

    wam_debug/0 invokes the sub-debugger devoted to the WAM data structures (section 4.6). It can be also invoked using the W debugger command (section 4.5).

    4.3.2  Leashing ports

    leash(Ports) requests the debugger to prompt the user, as he creeps through the program, for every port defined in the Ports list. Each element of Ports is an atom in call, exit, redo, fail, exception. Ports can also be an atom defining a shorthand:
    • full: equivalent to [call, exit, redo, fail, exception]

    • half: equivalent to [call, redo]

    • loose: equivalent to [call]

    • none: equivalent to []

    • tight: equivalent to [call, redo, fail, exception]
    When an unleashed port is encountered the debugger continues to show the associated goal but does not stop the execution to prompt the user.

    4.3.3  Spy-points

    When dealing with big sources it is not very practical to creep through the entire program. It is preferable to define a set of spy-points on interesting predicates to be prompted when the debugger reaches one of these predicates. Spy-points can be added either using spy/1 (or spypoint_condition/3) or dynamically when prompted by the debugger using the + (or *) debugger command (section 4.5). The current mode of leashing does not affect spy-points in the sense that user interaction is requested on every port.

    spy(PredSpec) sets a spy-point on all the predicates given by PredSpec. PredSpec defines one or several predicates and has one of the following forms:
    • [PredSpec1, PredSpec2,...]: set a spy-point for each element of the list.

    • Name: set a spy-point for any predicate whose name is Name (whatever the arity).

    • Name/Arity: set a spy-point for the predicate whose name is Name and arity is Arity.

    • Name/A1-A2: set a spy-point for the each predicate whose name is Name and arity is between A1 and A2.
    It is not possible to set a spy-point on an undefined predicate.

    The following predicate is used to remove one or several spy-points:

    nospy(PredSpec) removes the spy-points from the specified predicates.

    nospyall/0 removes all spy-points:

    It is also possible to define conditional spy-points.

    spypoint_condition(Goal, Port, Test) sets a conditional spy-point on the predicate for Goal. When the debugger reaches a conditional spy-point it only shows the associated goal if the following conditions are verified:
    • the actual goal unifies with Goal.

    • the actual port unifies with Port.

    • the Prolog goal Test succeeds.

    4.4  Debugging messages

    We here described which information is displayed by the debugger when it shows a goal. The basic format is as follows:
    S N M PortGoal ?
    S is a spy-point indicator: if there is a spy-point on the current goal the + symbol is displayed else a space is displayed. N is the invocation number. This unique number can be used to correlate the trace messages for the various ports, since it is unique for every invocation. M is an index number which represents the number of direct ancestors of the goal (i.e. the current depth of the goal). Port specifies the particular port (call, exit, fail, redo, exception). Goal is the current goal (it is then possible to inspect its current instantiation) which is displayed using write_term/3 with quoted(true) and max_depth(D) options (section 7.14.6). Initially D (the print depth) is set to 10 but can be redefined using the < debugger command (section 4.5). The ? symbol is displayed when the debugger is waiting a command from the user. (i.e. Port is a leashed port). If the port is unleashed, this symbol is not displayed and the debugger continues the execution displaying the next goal.

    4.5  Debugger commands

    When the debugger reaches a leashed port it shows the current goal followed by the ? symbol. At this point there are many commands available. Typing RETURN will creep into the program. Continuing to creep will show all the control flow. The debugger shows every port for every predicate encountered during the execution. It is possible to select the ports at which the debugger will prompt the user using the built-in predicate leash/1 (section 4.3.2). Each command is only one character long:
    Command Name Description
    RET or c creep single-step to the next port
    l leap continue the execution only stopping when a goal with a spy-point is reached
    s skip skip over the entire execution of the current goal. No message will be shown until control returns
    G go to ask for an invocation number and continue the execution until a port is reached for that invocation number
    r retry try to restart the invocation of the current goal by failing until reaching the invocation of the goal. The state of execution is the same as when the goal was initially invoked (except when using side-effect predicates)
    f fail force the current goal to fail immediately
    w write show the current goal using write/2 (section 7.14.6)
    d display show the current goal using display/2 (section 7.14.6)
    p print show the current goal using print/2 (section 7.14.6)
    e exception show the pending exception. Only applicable to an exception port
    g ancestors show the list of ancestors of the current goal
    A alternatives show the list of ancestors of the current goal combined with choice-points
    u unify ask for a term and unify the current goal with this term. This is convenient for getting a specific solution. Only available at a call port
    . father file show the Prolog file name and the line number where the current predicate is defined
    n no debug switch the debugger off. Same as nodebug/0 (section 4.3.1)
    = debugging show debugger information. Same as debugging/0 (section 4.3.1)
    + spy this set a spy-point on the current goal. Uses spy/1 (section 4.3.3)
    - nospy this remove a spy-point on the current goal. Uses nospy/1 (section 4.3.3)
    * spy conditionally ask for a term Goal, Port, Test (terminated by a dot) and set a conditional spy-point on the current predicate. Goal and the current goal must have the same predicate indicator. Uses spypoint_condition/3 (section 4.3.3)
    L listing list all the clauses associated with the current predicate. Uses listing/1 (section 7.23.3)
    a abort abort the current execution. Same as abort/0 (section 7.18.1)
    b break invoke a recursive top-level. Same as break/0 (section 7.18.1)
    @ execute goal ask for a goal and execute it
    < set print depth ask for an integer and set the print depth to this value (-1 for no depth limit)
    h or ? help display a summary of available commands
    W WAM debugger invoke the low-level WAM debugger (section 4.6)

    4.6  The WAM debugger

    In some cases it is interesting to have access to the WAM data structures. This sub-debugger allows the user to inspect/modify the contents of any stack or register of the WAM. The WAM debugger is invoked using the built-in predicate wam_debug/0 (section 4.3.1) or the W debugger command (section 4.5). The following table presents the specific commands of the WAM debugger:
    Command Description
    write A [N] write N terms starting at the address A using write/1 (section 7.14.6)
    data A [N] display N words starting at the address A
    modify A [N] display and modify N words starting at the address A
    where A display the real address corresponding to A
    what RA display what corresponds to the real address RA
    deref A display the dereferenced word starting at the address A
    envir [SA] display the contents of the environment located at SA (or the current one)
    backtrack [SA] display the contents of the choice-point located at SA (or the current one)
    backtrack all display all choice-points
    quit quit the WAM debugger
    help display a summary of available commands

    In the above table the following conventions apply:
    • elements between [ and ] are optional.

    • N is an optional integer (defaults to 1).

    • A is a WAM address, its syntax is: BANK_NAME [ [ N ] ], i.e. a bank name possibly followed by an index (defaults to 0). BANK_NAME is either:
      • reg: WAM general register (stack pointers, continuation, ...).

      • x: WAM X register (temporary variables, i.e. arguments).

      • y: WAM Y register (permanent variables).

      • ab: WAM X register saved in the current choice-point.

      • STACK_NAME: WAM stack (STACK_NAME in local, global, trail, cstr).


    • SA is a WAM stack address, i.e. STACK_NAME [ [ N ] ] (special case of WAM addresses).

    • RA is a real address, its syntax is the syntax of C integers (in particular the notation 0x... is recognized).
    It is possible to only use the first letters of a commands and bank names when there is no ambiguity. Also the square brackets [ ] enclosing the index of a bank name can be omitted. For instance the following command (showing the contents of 25 consecutive words of the global stack from the index 3): data global[3] 25 can be abbreviated as: d g 3 25.

    5  Format of definitions

    5.1  General format

    The definition of control constructs, directives and built-in predicates is presented as follows:

    Templates

    Specifies the types of the arguments and which of them shall be instantiated (mode). Types and modes are described later (section 5.2).

    Description

    Describes the behavior (in the absence of any error conditions). It is explicitly mentioned when a built-in predicate is re-executable on backtracking. Predefined operators involved in the definition are also mentioned.

    Errors

    Details the error conditions. Possible errors are detailed later (section 5.3). For directives, this part is omitted.

    Portability

    Specifies whether the definition conforms to the ISO standard or is a GNU Prolog extension.

    5.2  Types and modes

    The templates part defines, for each argument of the concerned built-in predicate, its mode and type. The mode specifies whether or not the argument must be instantiated when the built-in predicate is called. The mode is encoded with a symbol just before the type. Possible modes are:
    • +: the argument must be instantiated.

    • -: the argument must be a variable (will be instantiated if the built-in predicate succeeds).

    • ?: the argument can be instantiated or a variable.
    The type of an argument is defined by the following table:
    Type Description
    TYPE_list a list whose the type of each element is TYPE
    TYPE1_or_TYPE2 a term whose type is either TYPE1 or TYPE2
    atom an atom
    atom_property an atom property (section 7.19.12)
    boolean the atom true or false
    byte an integer ≥ 0 and ≤ 255
    callable_term an atom or a compound term
    character a single character atom
    character_code an integer ≥ 1 and ≤ 255
    clause a clause (fact or rule)
    close_option a close option (section 7.10.7)
    compound_term a compound term
    evaluable an arithmetic expression (section 7.6.1)
    fd_bool_evaluable a boolean FD expression (section 8.7.1)
    fd_labeling_option an FD labeling option (section 8.9.1)
    fd_evaluable an arithmetic FD expression (section 8.6.1)
    fd_variable an FD variable
    flag a Prolog flag (section 7.22.1)
    float a floating point number
    head a head of a clause (atom or compound term)
    integer an integer
    in_byte an integer ≥ 0 and ≤ 255 or -1 (for the end-of-file)
    in_character a single character atom or the atom end_of_file (for the end-of-file)
    in_character_code an integer ≥ 1 and ≤ 255 or -1 (for the end-of-file)
    io_mode an atom in: read, write or append
    list the empty list [] or a non-empty list [_|_]
    nonvar any term that is not a variable
    number an integer or a floating point number
    operator_specifier an operator specifier (section 7.14.10)
    os_file_property an operating system file property (section 7.27.11)
    predicate_indicator a term Name/Arity where Name is an atom and Arity an integer ≥ 0. A callable term can be given if the strict_iso Prolog flag is switched off (section 7.22.1)
    predicate_property a predicate property (section 7.8.2)
    read_option a read option (section 7.14.1)
    socket_address a term of the form 'AF_UNIX'(A) or 'AF_INET'(A,N) where A is an atom and N an integer
    socket_domain an atom in: 'AF_UNIX' or 'AF_INET'
    source_sink an atom identifying a source or a sink
    stream a stream-term: a term of the form '$stream'(N) where N is an integer ≥ 0
    stream_option a stream option (section 7.10.6)
    stream_or_alias a stream-term or an alias (atom)
    stream_position a stream position: a term '$stream_position'(I1, I2, I3, I4) where I1, I2, I3 and I4 are integers
    stream_property a stream property (section 7.10.10)
    stream_seek_method an atom in: bof, current or eof
    term any term
    var_binding_option a variable binding option (section 7.5.3)
    write_option a write option (section 7.14.6)

    5.3  Errors

    5.3.1  General format and error context

    When an error occurs an exception of the form: error(ErrorTerm, Caller) is raised. ErrorTerm is a term specifying the error (detailed in next sections) and Caller is a term specifying the context of the error. The context is either the predicate indicator of the last invoked built-in predicate or an atom giving general context information.

    Using exceptions allows the user both to recover an error using catch/3 (section 6.2.4) and to raise an error using throw/1 (section 6.2.4).

    To illustrate how to write error cases, let us write a predicate my_pred(X) where X must be an integer:
    my_pred(X) :-
            (   nonvar(X) ->
                true
            ;   throw(error(instantiation_error), my_pred/1)),
            ),
            (   integer(X) ->
                true
            ;   throw(error(type_error(integer, X), my_pred/1))
            ),
            ...
    
    To help the user to write these error cases, a set of system predicates is provided to raise errors. These predicates are of the form '$pl_err_...' and they all refer to the implicit error context. The predicates set_bip_name/2 (section 7.22.3) and current_bip_name/2 (section 7.22.4) are provided to set and recover the name and the arity associated with this context (an arity < 0 means that only the atom corresponding to the functor is significant). Using these system predicates the user could define the above predicate as follow:
    my_pred(X) :-
            set_bip_name(my_pred,1),
            (   nonvar(X) ->
                true
            ;   '$pl_err_instantiation'
            ),
            (   integer(X) ->
                true
            ;   '$pl_err_type'(integer, X)
            ),
            ...
    
    The following sections detail each kind of errors (and associated system predicates).

    5.3.2  Instantiation error

    An instantiation error occurs when an argument or one of its components is variable while an instantiated argument was expected. ErrorTerm has the following form: instantiation_error.

    The system predicate '$pl_err_instantiation' raises this error in the current error context (section 5.3.1).

    5.3.3  Type error

    A type error occurs when the type of an argument or one of its components is not the expected type (but not a variable). ErrorTerm has the following form: type_error(Type, Culprit) where Type is the expected type and Culprit the argument which caused the error. Type is one of:
    • atom

    • atomic

    • boolean

    • byte

    • callable

    • character

    • compound

    • evaluable

    • fd_bool_evaluable

    • fd_evaluable

    • fd_variable

    • float

    • in_byte

    • in_character

    • integer

    • list

    • number

    • predicate_indicator

    • variable
    The system predicate '$pl_err_type'(Type, Culprit) raises this error in the current error context (section 5.3.1).

    5.3.4  Domain error

    A domain error occurs when the type of an argument is correct but its value is outside the expected domain. ErrorTerm has the following form: domain_error(Domain, Culprit) where Domain is the expected domain and Culprit the argument which caused the error. Domain is one of:
    • atom_property

    • buffering_mode

    • character_code_list

    • close_option

    • date_time

    • eof_action

    • fd_labeling_option

    • flag_value

    • format_control_sequence

    • g_array_index

    • io_mode

    • non_empty_list

    • not_less_than_zero

    • operator_priority

    • operator_specifier

    • os_file_permission

    • os_file_property

    • os_path

    • predicate_property

    • prolog_flag

    • read_option

    • selectable_item

    • socket_address

    • socket_domain

    • source_sink

    • statistics_key

    • statistics_value

    • stream

    • stream_option

    • stream_or_alias

    • stream_position

    • stream_property

    • stream_seek_method

    • stream_type

    • term_stream_or_alias

    • var_binding_option

    • write_option
    The system predicate '$pl_err_domain'(Domain, Culprit) raises this error in the current error context (section 5.3.1).

    5.3.5  Existence error

    an existence error occurs when an object on which an operation is to be performed does not exist. ErrorTerm has the following form: existence_error(Object, Culprit) where Object is the type of the object and Culprit the argument which caused the error. Object is one of:
    • procedure

    • source_sink

    • stream
    The system predicate '$pl_err_existence'(Object, Culprit) raises this error in the current error context (section 5.3.1).

    5.3.6  Permission error

    A permission error occurs when an attempt to perform a prohibited operation is made. ErrorTerm has the following form: permission_error(Operation, Permission, Culprit) where Operation is the operation which caused the error, Permission the type of the tried permission and Culprit the argument which caused the error. Operation is one of:
    • access

    • add_alias

    • close

    • create

    • input

    • modify

    • open

    • output

    • reposition
    and Permission is one of:
    • binary_stream

    • flag

    • operator

    • past_end_of_stream

    • private_procedure

    • source_sink

    • static_procedure

    • stream

    • text_stream
    The system predicate '$pl_err_permission'(Operation, Permission, Culprit) raises this error in the current error context (section 5.3.1).

    5.3.7  Representation error

    A representation error occurs when an implementation limit has been breached. ErrorTerm has the following form: representation_error(Limit) where Limit is the name of the reached limit. Limit is one of:
    • character

    • character_code

    • in_character_code

    • max_arity

    • max_integer

    • min_integer

    • too_many_variables
    The errors max_integer and min_integer are not currently implemented.

    The system predicate '$pl_err_representation'(Limit) raises this error in the current error context (section 5.3.1).

    5.3.8  Evaluation error

    An evaluation error occurs when an arithmetic expression gives rise to an exceptional value. ErrorTerm has the following form: evaluation_error(Error) where Error is the name of the error. Error is one of:
    • float_overflow

    • int_overflow

    • undefined

    • underflow

    • zero_divisor
    The errors float_overflow, int_overflow, undefined and underflow are not currently implemented.

    The system predicate '$pl_err_evaluation'(Error) raises this error in the current error context (section 5.3.1).

    5.3.9  Resource error

    A resource error occurs when GNU Prolog does not have enough resources. ErrorTerm has the following form: resource_error(Resource) where Resource is the name of the resource. Resource is one of:
    • print_object_not_linked

    • too_big_fd_constraint

    • too_many_open_streams
    The system predicate '$pl_err_resource'(Resource) raises this error in the current error context (section 5.3.1).

    5.3.10  Syntax error

    A syntax error occurs when a sequence of character does not conform to the syntax of terms. ErrorTerm has the following form: syntax_error(Error) where Error is an atom explaining the error.

    The system predicate '$pl_err_syntax'(Error) raises this error in the current error context (section 5.3.1).

    5.3.11  System error

    A system error can occur at any stage. A system error is generally associated with an external component (e.g. operating system). ErrorTerm has the following form: system_error(Error) where Error is an atom explaining the error. This is an extension to ISO which only defines system_error without arguments.

    The system predicate '$pl_err_system'(Error) raises this error in the current error context (section 5.3.1).

    6  Prolog directives and control constructs

    6.1  Prolog directives

    6.1.1  Introduction

    Prolog directives are annotations inserted in Prolog source files for the compiler. A Prolog directive is used to specify:
    • the properties of some procedures defined in the source file.

    • the format and the syntax for read-terms in the source file (using changeable Prolog flags).

    • included source files.

    • a goal to be executed at run-time.

    6.1.2  dynamic/1

    Templates
    dynamic(+predicate_indicator)
    dynamic(+predicate_indicator_list)
    dynamic(+predicate_indicator_sequence)
    Description

    dynamic(Pred) specifies that the procedure whose predicate indicator is Pred is a dynamic procedure. This directive makes it possible to alter the definition of Pred by adding or removing clauses. For more information refer to the section about dynamic clause management (section 7.7.1).

    This directive shall precede the definition of Pred in the source file.

    If there is no clause for Pred in the source file, Pred exists however as an empty predicate (this means that current_predicate(Pred) succeeds).

    In order to allow multiple definitions, Pred can also be a list of predicate indicators or a sequence of predicate indicators using ','/2 as separator.

    Portability

    ISO directive.

    6.1.3  public/1

    Templates
    public(+predicate_indicator)
    public(+predicate_indicator_list)
    public(+predicate_indicator_sequence)
    Description

    public(Pred) specifies that the procedure whose predicate indicator is Pred is a public procedure. This directive makes it possible to inspect the clauses of Pred. For more information refer to the section about dynamic clause management (section 7.7.1).

    This directive shall precede the definition of Pred in the source file. Since a dynamic procedure is also public. It is useless (but correct) to define a public directive for a predicate already declared as dynamic.

    In order to allow multiple definitions, Pred can also be a list of predicate indicators or a sequence of predicate indicators using ','/2 as separator.

    Portability

    GNU Prolog directive. The ISO reference does not define any directive to declare a predicate public but it does distinguish public predicates. It is worth noting that in most Prolog systems the public/1 directive is as a visibility declaration. Indeed, declaring a predicate as public makes it visible from any predicate defined in any other file (otherwise the predicate is only visible from predicates defined in the same source file as itself). When a module system is incorporated in GNU Prolog a more general visibility declaration shall be provided conforming to the ISO reference.

    6.1.4  multifile/1

    Templates
    multifile(+predicate_indicator)
    multifile(+predicate_indicator_list)
    multifile(+predicate_indicator_sequence)
    Description

    multifile(Pred) is not supported by GNU Prolog. When such a directive is encountered it is simply ignored. All clauses for a given predicate must reside in a single file.

    Portability

    ISO directive. Not supported.

    6.1.5  discontiguous/1

    Templates
    discontiguous(+predicate_indicator)
    discontiguous(+predicate_indicator_list)
    discontiguous(+predicate_indicator_sequence)
    Description

    discontiguous(Pred) specifies that the procedure whose predicate indicator is Pred is a discontiguous procedure. Namely, the clauses defining Pred are not restricted to be consecutive but can appear anywhere in the source file.

    This directive shall precede the definition of Pred in the source file.

    In order to allow multiple definitions, Pred can also be a list of predicate indicators or a sequence of predicate indicators using ','/2 as separator.

    Portability

    ISO directive. The ISO reference document states that if there is no clause for Pred in the source file, Pred exists however as an empty predicate (i.e. current_predicate(Pred) will succeed). This is not the case for GNU Prolog.

    6.1.6  ensure_linked/1

    Templates
    ensure_linked(+predicate_indicator)
    ensure_linked(+predicate_indicator_list)
    ensure_linked(+predicate_indicator_sequence)
    Description

    ensure_linked(Pred) specifies that the procedure whose predicate indicator is Pred must be included by the linker. This directive is useful when compiling to native code to force the linker to include the code of a given predicate. Indeed, if the gplc is invoked with an option to reduce the size of the executable (section 3.4.3), the linker only includes the code of predicates that are statically referenced. However, the linker cannot detect dynamically referenced predicates (used as data passed to a meta-call predicate). The use of this directive prevents it to exclude the code of such predicates.

    In order to allow multiple definitions, Pred can also be a list of predicate indicators or a sequence of predicate indicators using ','/2 as separator.

    Portability

    GNU Prolog directive.

    6.1.7  built_in/0, built_in/1, built_in_fd/0, built_in_fd/1

    Templates
    built_in
    built_in(+predicate_indicator)
    built_in(+predicate_indicator_list)
    built_in(+predicate_indicator_sequence)
    built_in_fd
    built_in_fd(+predicate_indicator)
    built_in_fd(+predicate_indicator_list)
    built_in_fd(+predicate_indicator_sequence)
    Description

    built_in specifies that the procedures defined from now have the built_in property (section 7.8.2).

    built_in(Pred) is similar to built_in/0 but only affects the procedure whose predicate indicator is Pred.

    This directive shall precede the definition of Pred in the source file.

    In order to allow multiple definitions, Pred can also be a list of predicate indicators or a sequence of predicate indicators using ','/2 as separator.

    built_in_fd (resp. built_in_fd(Pred)) is similar to built_in (resp. built_in(Pred)) but sets the built_in_fd predicate property (section 7.8.2).

    Portability

    GNU Prolog directives.

    6.1.8  include/1

    Templates
    include(+atom)
    Description

    include(File) specifies that the content of the Prolog source File shall be inserted. The resulting Prolog text is identical to the Prolog text obtained by replacing the directive by the content of the Prolog source File.

    See absolute_file_name/2 for information about the syntax of File (section 7.26.1).

    Portability

    ISO directive.

    6.1.9  ensure_loaded/1

    Templates
    ensure_loaded(+atom)
    Description

    ensure_loaded(File) is not supported by GNU Prolog. When such a directive is encountered it is simply ignored.

    Portability

    ISO directive. Not supported.

    6.1.10  op/3

    Templates
    op(+integer, +operator_specifier, +atom_or_atom_list)
    Description

    op(Priority, OpSpecifier, Operator) alters the operator table. This directive is executed as soon as it is encountered by calling the built-in predicate op/3 (section 7.14.10). A system directive is also generated to reflect the effect of this directive at run-time (section 3.4.4).

    Portability

    ISO directive.

    6.1.11  char_conversion/2

    Templates
    char_conversion(+character, +character)
    Description

    char_conversion(InChar, OutChar) alters the character-conversion mapping. This directive is executed as soon as it is encountered by a call to the built-in predicate char_conversion/2 (section 7.14.12). A system directive is also generated to reflect the effect of this directive at run-time (section 3.4.4).

    Portability

    ISO directive.

    6.1.12  set_prolog_flag/2

    Templates
    set_prolog_flag(+flag, +term)
    Description

    set_prolog_flag(Flag, Value) sets the value of the Prolog flag Flag to Value. This directive is executed as soon as it is encountered by a call to the built-in predicate set_prolog_flag/2 (section 7.22.1). A system directive is also generated to reflect the effect of this directive at run-time (section 3.4.4).

    Portability

    ISO directive.

    6.1.13  initialization/1

    Templates
    initialization(+callable_term)
    Description

    initialization(Goal) adds Goal to the set of goal which shall be executed at run-time. A user directive is generated to execute Goal at run-time. If several initialization directives appear in the same file they are executed in the order of appearance (section 3.4.4).

    Portability

    ISO directive.

    6.1.14  foreign/2, foreign/1

    Templates
    foreign(+callable_term, +foreign_option_list)
    foreign(+callable_term)
    Description

    foreign(Template, Options) defines an interface predicate whose prototype is Template according to the options given by Options. Refer to the foreign code interface for more information (section 9.1).

    foreign(Template) is equivalent to foreign(Template, []).

    Portability

    GNU Prolog directive.

    6.2  Prolog control constructs

    6.2.1  true/0, fail/0, !/0

    Templates
    true
    fail
    !
    Description

    true always succeeds.

    fail always fails (enforces backtracking).

    ! always succeeds and the for side-effect of removing all choice-points created since the invocation of the predicate activating it.

    Errors

    None.

    Portability

    ISO control constructs.

    6.2.2  (',')/2 - conjunction, (;)/2 - disjunction, (->)/2 - if-then

    Templates
    ','(+callable_term, +callable_term)
    ;(+callable_term, +callable_term)
    ->(+callable_term, +callable_term)
    Description

    Goal1 , Goal2 executes Goal1 and, in case of success, executes Goal2.

    Goal1 ; Goal2 first creates a choice-point and executes Goal1. On backtracking Goal2 is executed.

    Goal1 -> Goal2 first executes Goal1 and, in case of success, removes all choice-points created by Goal1 and executes Goal2. This control construct acts like an if-then (Goal1 is the test part and Goal2 the then part). Note that if Goal1 fails ->/2 fails also. ->/2 is often combined with ;/2 to define an if-then-else as follows: Goal1 -> Goal2 ; Goal3. Note that Goal1 -> Goal2 is the first argument of the (;)/2 and Goal3 (the else part) is the second argument. Such an if-then-else control construct first creates a choice-point for the else-part (intuitively associated with ;/2) and then executes Goal1. In case of success, all choice-points created by Goal1 together with the choice-point for the else-part are removed and Goal2 is executed. If Goal1 fails then Goal3 is executed.

    ',', ; and -> are predefined infix operators (section 7.14.10).

    Errors
    Goal1 or Goal2 is a variable    instantiation_error
    Goal1 is neither a variable nor a callable term    type_error(callable, Goal1)
    Goal2 is neither a variable nor a callable term    type_error(callable, Goal2)
    The predicate indicator Pred of Goal1 or Goal2 does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)

    Portability

    ISO control constructs.

    6.2.3  call/1

    Templates
    call(+callable_term)
    Description

    call(Goal) executes Goal. call/1 succeeds if Goal represents a goal which is true. When Goal contains a cut symbol ! (section 6.2.1) as a subgoal, the effect of ! does not extend outside Goal.

    Errors
    Goal is a variable    instantiation_error
    Goal is neither a variable nor a callable term    type_error(callable, Goal)
    The predicate indicator Pred of Goal does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)

    Portability

    ISO control construct.

    6.2.4  catch/3, throw/1

    Templates
    catch(?callable_term, ?term, ?term)
    throw(+nonvar)
    Description

    catch(Goal, Catcher, Recovery) is similar to call(Goal) (section 6.2.3). If this succeeds or fails, so does the call to catch/3. If however, during the execution of Goal, there is a call to throw(Ball), the current flow of control is interrupted, and control returns to a call of catch/3 that is being executed. This can happen in one of two ways:
    • implicitly, when an error condition for a built-in predicate is satisfied.

    • explicitly, when the program executes a call of throw/1 because the program wishes to abandon the current processing, and instead to take an alternative action.
    throw(Ball) causes the normal flow of control to be transferred back to an existing call of catch/3. When a call to throw(Ball) happens, Ball is copied and the stack is unwound back to the call to catch/3, whereupon the copy of Ball is unified with Catcher. If this unification succeeds, then catch/3 executes the goal Recovery using call/1 (section 6.2.3) in order to determine the success or failure of catch/3. Otherwise, in case the unification fails, the stack keeps unwinding, looking for an earlier invocation of catch/3. Ball may be any non-variable term.

    Errors
    Goal is a variable    instantiation_error
    Goal is neither a variable nor a callable term    type_error(callable, Goal)
    The predicate indicator Pred of Goal does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)
    Ball is a variable    instantiation_error

    If Ball does not unify with the Catcher argument of any call of catch/3, a system error message is displayed and throw/1 fails.

    When catch/3 calls Recovery it uses call/1 (section 6.2.3), an instantiation_error, a type_error or an existence_error can then occur depending on Recovery.

    Portability

    ISO control constructs.



    7  Prolog built-in predicates

    7.1  Type testing

    7.1.1  var/1, nonvar/1, atom/1, integer/1, float/1, number/1, atomic/1,
    compound/1, callable/1, list/1, partial_list/1, list_or_partial_list/1

    Templates
    var(?term)
    nonvar(?term)
    atom(?term)
    integer(?term)
    float(?term)
    number(?term)
    atomic(?term)
    compound(?term)
    callable(?term)
    list(?term)
    partial_list(?term)
    list_or_partial_list(?term)
    Description

    var(Term) succeeds if Term is currently uninstantiated (which therefore has not been bound to anything, except possibly another uninstantiated variable).

    nonvar(Term) succeeds if Term is currently instantiated (opposite of var/1).

    atom(Term) succeeds if Term is currently instantiated to an atom.

    integer(Term) succeeds if Term is currently instantiated to an integer.

    float(Term) succeeds if Term is currently instantiated to a floating point number.

    number(Term) succeeds if Term is currently instantiated to an integer or a floating point number.

    atomic(Term) succeeds if Term is currently instantiated to an atom, an integer or a floating point number.

    compound(Term) succeeds if Term is currently instantiated to a compound term, i.e. a term of arity > 0 (a list or a structure).

    callable(Term) succeeds if Term is currently instantiated to a callable term, i.e. an atom or a compound term.

    list(Term) succeeds if Term is currently instantiated to a list, i.e. the atom [] (empty list) or a term with principal functor '.'/2 and with second argument (the tail) a list.

    partial_list(Term) succeeds if Term is currently instantiated to a partial list, i.e. a variable or a term whose the main functor is '.'/2 and the second argument (the tail) is a partial list.

    list_or_partial_list(Term) succeeds if Term is currently instantiated to a list or a partial list.

    Errors

    None.

    Portability

    var/1, nonvar/1, atom/1, integer/1, float/1, number/1, atomic/1, compound/1 and callable/1 are ISO predicates.

    list/1, partial_list/1 and list_or_partial_list/1 are GNU Prolog predicates.

    7.2  Term unification

    7.2.1  (=)/2 - Prolog unification

    Templates
    =(?term, ?term)
    Description

    Term1 = Term2 unifies Term1 and Term2. No occurs check is done, i.e. this predicate does not check if a variable is unified with a compound term containing this variable (this can lead to an infinite loop).

    = is a predefined infix operator (section 7.14.10).

    Errors

    None.

    Portability

    ISO predicate.

    7.2.2  unify_with_occurs_check/2

    Templates
    unify_with_occurs_check(?term, ?term)
    Description

    unify_with_occurs_check(Term1, Term2) unifies Term1 and Term2. The occurs check test is done (i.e. the unification fails if a variable is unified with a compound term containing this variable).

    Errors

    None.

    Portability

    ISO predicate.

    7.2.3  (\=)/2 - not Prolog unifiable

    Templates
    \=(?term, ?term)
    Description

    Term1 \= Term2 succeeds if Term1 and Term2 are not unifiable (no occurs check is done).

    \=
    is a predefined infix operator (section 7.14.10).

    Errors

    None.

    Portability

    ISO predicate.

    7.3  Term comparison

    7.3.1  Standard total ordering of terms

    The built-in predicates described in this section allows the user to compare Prolog terms. Prolog terms are totally ordered according to the standard total ordering of terms which is as follows (from the smallest term to the greatest):
    • variables, oldest first.

    • finite domain variables (section 8.1.1), oldest first.

    • floating point numbers, in numeric order.

    • integers, in numeric order.

    • atoms, in alphabetical (i.e. character code) order.

    • compound terms, ordered first by arity, then by the name of the principal functor and by the arguments in left-to-right order.
    A list is treated as a compound term (whose principal functor is '.'/2).

    The portability of the order of variables is not guaranteed (in the ISO reference the oder of variables is system dependent).

    7.3.2  (==)/2 - term identical, (\==)/2 - term not identical,
    (@<)/2 - term less than, (@=<)/2 - term less than or equal to,
    (@>)/2 - term greater than, (@>=)/2 - term greater than or equal to

    Templates
    ==(?term, ?term)
    \==(?term, ?term)
    @<(?term, ?term)
    @=<(?term, ?term)
    @>(?term, ?term)
    @>=(?term, ?term)
    Description

    These predicates compare two terms according to the standard total ordering of terms (section 7.3.1).

    Term1 == Term2 succeeds if Term1 and Term2 are equal.

    Term1 \== Term2 succeeds if Term1 and Term2 are different.

    Term1 @< Term2 succeeds if Term1 is less than Term2.

    Term1 @=< Term2 succeeds if Term1 is less than or equal to Term2.

    Term1 @> Term2 succeeds if Term1 is greater than Term2.

    Term1 @>= Term2 succeeds if Term1 is greater than or equal to Term2.

    ==, \==, @<, @=<, @> and @>= are predefined infix operators (section 7.14.10).

    Errors

    None.

    Portability

    ISO predicates.

    7.3.3  compare/3

    Templates
    compare(?atom, +term, +term)
    Description

    compare(Result, Term1, Term2) compares Term1 and Term2 according to the standard (section 7.3.1) and unifies Result with:
    • the atom < if Term1 is less than Term2.

    • the atom = if Term1 and Term2 are equal.

    • the atom > if Term1 is greater than Term2.
    Errors
    Result is neither a variable nor an atom    type_error(atom, Result)

    Portability

    GNU Prolog predicate.

    7.4  Term processing

    7.4.1  functor/3

    Templates
    functor(+nonvar, ?atomic, ?integer)
    functor(-nonvar, +atomic, +integer)
    Description

    functor(Term, Name, Arity) succeeds if the principal functor of Term is Name and its arity is Arity. This predicate can be used in two ways:
    • Term is not a variable: extract the name (an atom or a number if Term is a number) and the arity of Term (if Term is atomic Arity = 0).

    • Term is a variable: unify Term with a general term whose principal functor is given by Name and arity is given by Arity.
    Errors
    Term and Name are both variables    instantiation_error
    Term and Arity are both variables    instantiation_error
    Term is a variable and Name is neither a variable nor an atomic term    type_error(atomic, Name)
    Term is a variable and Arity is neither a variable nor an integer    type_error(integer, Arity)
    Term is a variable, Name is a constant but not an atom and Arity is an integer > 0    type_error(atom, Name)
    Term is a variable and Arity is an integer > max_arity flag (section 7.22.1)    representation_error(max_arity)
    Term is a variable and Arity is an integer < 0    domain_error(not_less_than_zero, Arity)

    Portability

    ISO predicate.

    7.4.2  arg/3

    Templates
    arg(+integer, +compound_term, ?term)
    Description

    arg(N, Term, Arg) succeeds if the Nth argument of Term is Arg.

    Errors
    N is a variable    instantiation_error
    Term is a variable    instantiation_error
    N is neither a variable nor an integer    type_error(integer, N)
    Term is neither a variable nor a compound term    type_error(compound, Term)
    N is an integer < 0    domain_error(not_less_than_zero, N)

    Portability

    ISO predicate.

    7.4.3  (=..)/2 - univ

    Templates
    =..(+nonvar, ?list)
    =..(-nonvar, +list)
    Description

    Term =.. List succeeds if 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.

    =.. is a predefined infix operator (section 7.14.10).

    Errors
    Term is a variable and List is a partial list    instantiation_error
    List is neither a partial list nor a list    type_error(list, List)
    Term is a variable and List is a list whose head is a variable    instantiation_error
    List is a list whose head H is neither an atom nor a variable and whose tail is not the empty list    type_error(atom, H)
    List is a list whose head H is a compound term and whose tail is the empty list    type_error(atomic, H)
    Term is a variable and List is the empty list    domain_error(non_empty_list, [])
    Term is a variable and the tail of List has a length > max_arity flag (section 7.22.1)    representation_error(max_arity)

    Portability

    ISO predicate.

    7.4.4  copy_term/2

    Templates
    copy_term(?term, ?term)
    Description

    copy_term(Term1, Term2) succeeds if Term2 unifies with a term T which is a renamed copy of Term1.

    Errors

    None.

    Portability

    ISO predicate.

    7.4.5  setarg/4, setarg/3

    Templates
    setarg(+integer, +compound_term, +term, +boolean)
    setarg(+integer, +compound_term, +term)
    Description

    setarg(N, Term, NewValue, Undo) replaces destructively the Nth argument of Term with NewValue. This assignment is undone on backtracking if Undo = true. This should only used if there is no further use of the old value of the replaced argument. If Undo = false then NewValue must be either an atom or an integer.

    setarg(N, Term, NewValue) is equivalent to setarg(N, Term, NewValue, true).

    Errors
    N is a variable    instantiation_error
    N is neither a variable nor an integer    type_error(integer, N)
    N is an integer < 0    domain_error(not_less_than_zero, N)
    Term is a variable    instantiation_error
    Term is neither a variable nor a compound term    type_error(compound, Term)
    NewValue is neither an atom nor an integer and Undo = false    type_error(atomic, NewValue)
    Undo is a variable    instantiation_error
    Undo is neither a variable nor a boolean    type_error(boolean, Undo)

    Portability

    GNU Prolog predicate.

    7.5  Variable naming/numbering

    7.5.1  name_singleton_vars/1

    Templates
    name_singleton_vars(?term)
    Description

    name_singleton_vars(Term) binds each singleton variable appearing in Term with a term of the form '$VARNAME'('_'). Such a term can be output by write_term/3 as a variable name (section 7.14.6).

    Errors

    None.

    Portability

    GNU Prolog predicates.

    7.5.2  name_query_vars/2

    Templates
    name_query_vars(+list, ?list)
    Description

    name_query_vars(List, Rest) for each element of List of the form Name = Var where Name is an atom and Var a variable, binds Var with the term '$VARNAME'(Name). Such a term can be output by write_term/3 as a variable name (section 7.14.6). Rest is unified with the list of elements of List that have not given rise to a binding. This predicate is provided as a way to name the variable lists obtained returned by read_term/3 with variable_names(List) or singletons(List) options (section 7.14.1).

    Errors
    List is a partial list    instantiation_error
    List is neither a partial list nor a list    type_error(list, List)
    Rest is neither a partial list nor a list    type_error(list, Rest)

    Portability

    GNU Prolog predicate.

    7.5.3  bind_variables/2, numbervars/3, numbervars/1

    Templates
    bind_variables(?term, +var_binding_option_list)
    numbervars(?term, +integer, ?integer)
    numbervars(?term)
    Description

    bind_variables(Term, Options) binds each variable appearing in Term according to the options given by Options.

    Variable binding options: Options is a list of variable binding options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are:
    • numbervars: specifies that each variable appearing in Term should be bound to a term of the form '$VAR'(N) where N is an integer. Such a term can be output by write_term/3 as a variable name (section 7.14.6). This is the default.

    • namevars: specifies that each variables appearing in Term shall be bound to a term of the form '$VARNAME'(Name) where Name is the atom that would be output by write_term/3 seeing a term of the '$VAR'(N) where N is an integer. Such a term can be output by write_term/3 as a variable name (section 7.14.6). This is the alternative to numbervars.

    • from(From): the first integer N to use for number/name variables of Term is From. The default value is 0.

    • next(Next): when bind_variables/2 succeeds, Next is unified with the (last integer N)+1 used to bind the variables of Term.

    • exclude(List): collects all variable names appearing in List to avoid a clash when binding a variable of Term. Precisely a number NFrom will not be used to bind a variable of Term if:
      • there is a sub-term of List of the form '$VAR'(N) or '$VARNAME'(Name) where Name is the constant that would be output by write_term/3 seeing a term of the '$VAR'(N).

      • an element of List is of the form Name = Var where Name is an atom that would be output by write_term/3 on seeing a term of the from '$VAR'(N). This case allows for lists returned by read_term/3 (with variable_names(List) or singletons(List) options) (section 7.14.1) and by name_query_vars/2 (section 7.5.2).
    numbervars(Term, From, Next) is equivalent to bind_variables(Term, [from(From), next(Next)], i.e. each variable of Term is bound to '$VAR'(N) where From ≤ N < Next.

    numbervars(Term) is equivalent to numbervars(Term, 0, _).

    Errors
    Options is a partial list or a list with an element E which is a variable    instantiation_error
    Options is neither a partial list nor a list    type_error(list, Options)
    an element E of the Options list is neither a variable nor a variable binding option    domain_error(var_binding_option, E)
    From is a variable    instantiation_error
    From is neither a variable nor an integer    type_error(integer, From)
    Next is neither a variable nor an integer    type_error(integer, Next)
    List is a partial list    instantiation_error
    List is neither a partial list nor a list    type_error(list, List)

    Portability

    GNU Prolog predicates.

    7.5.4  term_ref/2

    Templates
    term_ref(+term, ?integer)
    term_ref(?term, +integer)
    Description

    term_ref(Term, Ref) succeeds if the internal reference of Term is Ref. This predicate can be used either to obtain the internal reference of a term or to obtain the term associated with a given reference. Note that two identical terms can have different internal references. A good way to use this predicate is to first record the internal reference of a given term and to later re-obtain the term via this reference.

    Errors
    Term and Ref are both variables    instantiation_error
    Ref is neither a variable nor an integer    type_error(integer, Ref)
    Ref is an integer < 0    domain_error(not_less_than_zero, Ref)

    Portability

    GNU Prolog predicate.

    7.6  Arithmetic

    7.6.1  Evaluation of an arithmetic expression

    An arithmetic expression is a Prolog term built from numbers, variables, and functors (or operators) that represent arithmetic functions. When an expression is evaluated each variable must be bound to a non-variable expression. An expression evaluates to a number, which may be an integer or a floating point number. The following table details the components of an arithmetic expression, how they are evaluated, the types expected/returned and if they are ISO or an extension:
    Expression
    Result = eval(Expression)
    Signature ISO
    Variable
    must be bound to a non-variable expression E.
    The result is eval(E)
    IF → IF Y
    integer number
    this number
    I → I Y
    floating point number
    this number
    F → F Y
    + E
    eval(E)
    IF → IF N
    - E
    - eval(E)
    IF → IF Y
    inc(E)
    eval(E) + 1
    IF → IF N
    dec(E)
    eval(E) - 1
    IF → IF N
    E1 + E2
    eval(E1) + eval(E2)
    IF, IF → IF Y
    E1 - E2
    eval(E1) - eval(E2)
    IF, IF → IF Y
    E1 * E2
    eval(E1) * eval(E2)
    IF, IF → IF Y
    E1 / E2
    eval(E1) / eval(E2)
    IF, IF → F Y
    E1 // E2
    rnd(eval(E1) / eval(E2))
    I, I → I Y
    E1 rem E2
    eval(E1) - (rnd(eval(E1) / eval(E2))*eval(E2))
    I, I → I Y
    E1 mod E2
    eval(E1) - ( ⌊eval(E1) / eval(E2)⌋ *eval(E2))
    I, I → I Y
    E1 /\ E2
    eval(E1) bitwise_and eval(E2)
    I, I → I Y
    E1 \/ E2
    eval(E1) bitwise_or eval(E2)
    I, I → I Y
    E1 ^ E2
    eval(E1) bitwise_xor eval(E2)
    I, I → I N
    \ E
    bitwise_not eval(E)
    I → I Y
    E1 << E2
    eval(E1) integer_shift_left eval(E2)
    I, I → I Y
    E1 >> E2
    eval(E1) integer_shift_right eval(E2)
    I, I → I Y
    abs(E)
    absolute value of eval(E)
    IF → IF Y
    sign(E)
    sign of eval(E) (-1 if < 0, 0 if = 0, +1 if > 0)
    IF → IF Y
    min(E1,E2)
    minimal value between eval(E1) and eval(E2)
    IF, IF → ? N
    max(E1,E2)
    maximal value between eval(E1) and eval(E2)
    IF, IF → ? N
    E1 ** E2
    eval(E1) raised to the power of eval(E2)
    IF, IF → F Y
    sqrt(E)
    square root of eval(E)
    IF → F Y
    atan(E)
    arc tangent of eval(E)
    IF → F Y
    cos(E)
    cosine of eval(E)
    IF → F Y
    acos(E)
    arc cosine of eval(E)
    IF → F N
    sin(E)
    sine of eval(E)
    IF → F Y
    asin(E)
    arc sine of eval(E)
    IF → F N
    exp(E)
    e raised to the power of eval(E)
    IF → F Y
    log(E)
    natural logarithms of eval(E)
    IF → F Y
    float(E)
    the floating point number equal to eval(E)
    IF → F Y
    ceiling(E)
    rounds eval(E) upward to the nearest integer
    F → I Y
    floor(E)
    rounds eval(E) downward to the nearest integer
    F → I Y
    round(E)
    rounds eval(E) to the nearest integer
    F → I Y
    truncate(E)
    the integer value of eval(E)
    F → I Y
    float_fractional_part(E)
    the float equal to the fractional part of eval(E)
    F → F Y
    float_integer_part(E)
    the float equal to the integer part of eval(E)
    F → F Y

    The meaning of the signature field is as follows:
    • I → I: unary function, the operand must be an integer and the result is an integer.

    • F → F: unary function, the operand must be a floating point number and the result is a floating point number.

    • F → I: unary function, the operand must be a floating point number and the result is an integer.

    • IF → F: unary function, the operand can be an integer or a floating point number and the result is a floating point number.

    • IF → IF: unary function, the operand can be an integer or a floating point number and the result has the same type as the operand.

    • I, I → I: binary function: each operand must be an integer and the result is an integer.

    • IF, IF → IF: binary function: each operand can be an integer or a floating point number and the result is a floating point number if at least one operand is a floating point number, an integer otherwise.

    • IF, IF → ?: binary function: each operand can be an integer or a floating point number and the result has the same type as the selected operand. This is used for min and max. Note that in case of equality between an integer and a floating point number the result is an integer.
    is, +, -, *, //, /, rem, and mod are predefined infix operators. + and - are predefined prefix operators (section 7.14.10).

    Integer division rounding function: the integer division rounding function rnd(X) rounds the floating point number X to an integer. There are two possible definitions (depending on the target machine) for this function which differ on negative numbers:
    • rnd(X) = integer part of X, e.g. rnd(-1.5) = -1 (round toward 0)

    • rnd(X) = ⌊X⌋, e.g. rnd(-1.5) = -2 (round toward −∞)
    The definition of this function determines the precise definition of the integer division (//)/2 and of the integer remainder (rem)/2. Rounding toward zero is the most common case. In any case it is possible to test the value (toward_zero or down) of the integer_rounding_function Prolog flag to determine which function being used (section 7.22.1).

    Fast mathematical mode: in order to speed-up integer computations, the GNU Prolog compiler can generate faster code when invoked with the –fast-math option (section 3.4.3). In this mode only integer operations are allowed and a variable in an expression must be bound at evaluation time to an integer. No type checking is done.

    Errors
    a sub-expression E is a variable    instantiation_error
    a sub-expression E is neither a number nor an evaluable functor    type_error(evaluable, E)
    a sub-expression E is a floating point number while an integer is expected    type_error(integer, E)
    a sub-expression E is an integer while a floating point number is expected    type_error(float, E)
    a division by zero occurs    evaluation_error(zero_divisor)

    Portability

    Refer to the above table to determine which evaluable functors are ISO and which are GNU Prolog extensions. For efficiency reasons, GNU Prolog does not detect the following ISO arithmetic errors: float_overflow, int_overflow, int_underflow, and undefined.

    7.6.2  (is)/2 - evaluate expression

    Templates
    is(?term, +evaluable)
    Description

    Result is Expression succeeds if Result can be unified with eval(Expression). Refer to the evaluation of an arithmetic expression for the definition of the eval function (section 7.6.1).

    is is a predefined infix operator (section 7.14.10).

    Errors

    Refer to the evaluation of an arithmetic expression for possible errors (section 7.6.1).

    Portability

    ISO predicate.

    7.6.3  (=:=)/2 - arithmetic equal, (=\=)/2 - arithmetic not equal,
    (<)/2 - arithmetic less than, (=<)/2 - arithmetic less than or equal to,
    (>)/2 - arithmetic greater than, (>=)/2 - arithmetic greater than or equal to

    Templates
    =:=(+evaluable, +evaluable)
    =\=(+evaluable, +evaluable)
    <(+evaluable, +evaluable)
    =<(+evaluable, +evaluable)
    >(+evaluable, +evaluable)
    >=(+evaluable, +evaluable)
    Description

    Expr1 =:= Expr2 succeeds if eval(Expr1) = eval(Expr2).

    Expr1 =\= Expr2 succeeds if eval(Expr1) ≠ eval(Expr2).

    Expr1 < Expr2 succeeds if eval(Expr1) < eval(Expr2).

    Expr1 =< Expr2 succeeds if eval(Expr1) ≤ eval(Expr2).

    Expr1 > Expr2 succeeds if eval(Expr1) > eval(Expr2).

    Expr1 >= Expr2 succeeds if eval(Expr1) ≥ eval(Expr2).

    Refer to the evaluation of an arithmetic expression for the definition of the eval function (section 7.6.1).

    =:=, =\=, <, =<, > and >= are predefined infix operators (section 7.14.10).

    Errors

    Refer to the evaluation of an arithmetic expression for possible errors (section 7.6.1).

    Portability

    ISO predicates.

    7.7  Dynamic clause management

    7.7.1  Introduction

    Static and dynamic procedures: a procedure is either dynamic or static. All built-in predicates are static. A user-defined procedure is static by default unless a dynamic/1 directive precedes its definition (section 6.1.2). Adding a clause to a non-existent procedure creates a dynamic procedure. The clauses of a dynamic procedure can be altered (e.g. using asserta/1), the clauses of a static procedure cannot be altered.

    Private and public procedures: each procedure is either public or private. A dynamic procedure is always public. Each built-in predicate is private, and a static user-defined procedure is private by default unless a public/1 directive precedes its definition (section 6.1.3). If a dynamic declaration exists it is unnecessary to add a public declaration since a dynamic procedure is also public. A clause of a public procedure can be inspected (e.g. using clause/2), a clause of a private procedure cannot be inspected.

    A logical database update view: any change in the database that occurs as the result of executing a goal (e.g. when a sub-goal is a call of assertz/1 or retract/1) only affects subsequent activations. The change does not affect any activation that is currently being executed. Thus the database is frozen during the execution of a goal, and the list of clauses defining a predication is fixed at the moment of its execution.

    7.7.2  asserta/1, assertz/1

    Templates
    asserta(+clause)
    assertz(+clause)
    Description

    asserta(Clause) first converts the term Clause to a clause and then adds it to the current internal database. The predicate concerned must be dynamic (section 7.7.1) or undefined and the clause is inserted before the first clause of the predicate. If the predicated is undefined it is created as a dynamic procedure.

    assertz(Clause) acts like asserta/1 except that the clause is added at the end of all existing clauses of the concerned predicate.

    Converting a term Clause to a clause Clause1:
    • extract the head and the body of Clause: either Clause = (Head :- Body) or Clause = Head and Body = true.

    • Head must be a callable term (or else the conversion fails).

    • convert Body to a body clause (i.e. a goal) Body1.

    • the converted clause Clause1 = (Head :- Body1).
    Converting a term T to a goal:
    • if T is a variable it is replaced by the term call(T).

    • if T is a control construct (',')/2, (;)/2 or (->)/2 each argument of the control construct is recursively converted to a goal.

    • if T is a callable term it remains unchanged.

    • otherwise the conversion fails (T is neither a variable nor a callable term).
    Errors
    Head is a variable    instantiation_error
    Head is neither a variable nor a callable term    type_error(callable, Head)
    Body cannot be converted to a goal    type_error(callable, Body)
    The predicate indicator Pred of Head is that of a static procedure    permission_error(modify, static_procedure, Pred)

    Portability

    ISO predicates.

    7.7.3  retract/1

    Templates
    retract(+clause)
    Description

    retract(Clause) erases the first clause of the database that unifies with Clause. The concerned predicate must be a dynamic procedure (section 7.7.1). Removing all clauses of a procedure does not erase the procedure definition. To achieve this use abolish/1 (section 7.7.6). retract/1 is re-executable on backtracking.

    Errors
    Head is a variable    instantiation_error
    Head is neither a variable nor a callable term    type_error(callable, Head)
    The predicate indicator Pred of Head is that of a static procedure    permission_error(modify, static_procedure, Pred)

    Portability

    ISO predicate. In the ISO reference, the operation associated with the permission_error is access while it is modify in GNU Prolog. This seems to be an error of the ISO reference since for asserta/1 (which is similar in spirit to retract/1) the operation is also modify.

    7.7.4  retractall/1

    Templates
    retractall(+head)
    Description

    retractall(Head) erases all clauses whose head unifies with Head. The concerned predicate must be a dynamic procedure (section 7.7.1). The procedure definition is not removed so that it is found by current_predicate/1 (section 7.8.1). abolish/1 should be used to remove the procedure (section 7.7.6).

    Errors
    Head is a variable    instantiation_error
    Head is not a callable term    type_error(callable, Head)
    The predicate indicator Pred of Head is that of a static procedure    permission_error(modify, static_procedure, Pred)

    Portability

    GNU Prolog predicate.

    7.7.5  clause/2

    Templates
    clause(+head, ?callable_term)
    Description

    clause(Head, Body) succeeds if there exists a clause in the database that unifies with Head :- Body. The predicate in question must be a public procedure (section 7.7.1). Clauses are delivered from the first to the last. This predicate is re-executable on backtracking.

    Errors
    Head is a variable    instantiation_error
    Head is neither a variable nor a callable term    type_error(callable, Head)
    The predicate indicator Pred of Head is that of a private procedure    permission_error(access, private_procedure, Pred)
    Body is neither a variable nor a callable term    type_error(callable, Body)

    Portability

    ISO predicate.

    7.7.6  abolish/1

    Templates
    abolish(+predicate_indicator)
    Description

    abolish(Pred) removes from the database the procedure whose predicate indicator is Pred. The concerned predicate must be a dynamic procedure (section 7.7.1).

    Errors
    Pred is a variable    instantiation_error
    Pred is a term Name/Arity and either Name or Arity is a variable    instantiation_error
    Pred is neither a variable nor a predicate indicator    type_error(predicate_indicator, Pred)
    Pred is a term Name/Arity and Arity is neither a variable nor an integer    type_error(integer, Arity)
    Pred is a term Name/Arity and Name is neither a variable nor an atom    type_error(atom, Name)
    Pred is a term Name/Arity and Arity is an integer < 0    domain_error(not_less_than_zero, Arity)
    Pred is a term Name/Arity and Arity is an integer > max_arity flag (section 7.22.1)    representation_error(max_arity)
    The predicate indicator Pred is that of a static procedure    permission_error(modify, static_procedure, Pred)

    Portability

    ISO predicate.

    7.8  Predicate information

    7.8.1  current_predicate/1

    Templates
    current_predicate(?predicate_indicator)
    Description

    current_predicate(Pred) succeeds if there exists a predicate indicator of a defined procedure that unifies with Pred. All user defined procedures are found, whether static or dynamic. Internal system procedures whose name begins with '$' are not found. A user-defined procedure is found even when it has no clauses. A user-defined procedure is not found if it has been abolished. To conform to the ISO reference, built-in predicates are not found except if the strict_iso Prolog flag is switched off (section 7.22.1). This predicate is re-executable on backtracking.

    Errors
    Pred is neither a variable nor a predicate indicator    type_error(predicate_indicator, Pred)
    Pred is a term Name/Arity and Arity is neither a variable nor an integer    type_error(integer, Arity)
    Pred is a term Name/Arity and Name is neither a variable nor an atom    type_error(atom, Name)
    Pred is a term Name/Arity and Arity is an integer < 0    domain_error(not_less_than_zero, Arity)
    Pred is a term Name/Arity and Arity is an integer > max_arity flag (section 7.22.1)    representation_error(max_arity)

    Portability

    ISO predicate.

    7.8.2  predicate_property/2

    Templates
    predicate_property(?predicate_indicator, ?predicate_property)
    Description

    predicate_property(Pred, Property) succeeds if there exists a predicate indicator of a defined procedure that unifies with Pred and if Property unifies with one of the properties of the procedure. All user defined procedures and built-in predicates are found. Internal system procedures whose name begins with '$' are not found. This predicate is re-executable on backtracking.

    Predicate properties:
    • static: if the procedure is static.

    • dynamic: if the procedure is dynamic.

    • private: if the procedure is private.

    • public: if the procedure is public.

    • user: if the procedure is a user-defined procedure.

    • built_in: if the procedure is a Prolog built-in predicate.

    • built_in_fd: if the procedure is an FD built-in predicate.

    • native_code: if the procedure is compiled in native code.

    • prolog_file(File): source file from which the predicate has been read.

    • prolog_line(Line): line number of the source file.
    Errors
    Pred is neither a variable nor a predicate indicator    type_error(predicate_indicator, Pred)
    Pred is a term Name/Arity and Arity is neither a variable nor an integer    type_error(integer, Arity)
    Pred is a term Name/Arity and Name is neither a variable nor an atom    type_error(atom, Name)
    Pred is a term Name/Arity and Arity is an integer < 0    domain_error(not_less_than_zero, Arity)
    Pred is a term Name/Arity and Arity is an integer > max_arity flag (section 7.22.1)    representation_error(max_arity)
    Property is neither a variable nor a predicate property term    domain_error(predicate_property, Property)
    Property = prolog_file(File) and File is neither a variable nor an atom    type_error(atom, File)
    Property = prolog_line(Line) and Line is neither a variable nor an integer    type_error(integer, Line)

    Portability

    GNU Prolog predicate.

    7.9  All solutions

    7.9.1  Introduction

    It is sometimes useful to collect all solutions for a goal. This can be done by repeatedly backtracking and gradually building the list of solutions. The following built-in predicates are provided to automate this process.

    The built-in predicates described in this section invoke call/1 (section 6.2.3) on the argument Goal. When efficiency is crucial and Goal is complex it is better to define an auxiliary predicate which can then be compiled, and have Goal call this predicate.

    7.9.2  findall/3

    Templates
    findall(?term, +callable_term, ?list)
    Description

    findall(Template, Goal, Instances) succeeds if Instances unifies with the list of values to which a variable X not occurring in Template or Goal would be instantiated by successive re-executions of call(Goal), X = Template after systematic replacement of all variables in X by new variables. Thus, the order of the list Instances corresponds to the order in which the proofs are found.

    Errors
    Goal is a variable    instantiation_error
    Goal is neither a variable nor a callable term    type_error(callable, Goal)
    The predicate indicator Pred of Goal does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)
    Instances is neither a partial list nor a list    type_error(list, Instances)

    Portability

    ISO predicate.

    7.9.3  bagof/3, setof/3

    Templates
    bagof(?term, +callable_term, ?list)
    setof(?term, +callable_term, ?list)
    Description

    bagof(Template, Goal, Instances) assembles as a list the set of solutions of Goal for each different instantiation of the free variables in Goal. The elements of each list are in order of solution, but the order in which each list is found is undefined. This predicate is re-executable on backtracking.

    Free variable set: bagof/3 groups the solutions of Goal according to the free variables in Goal. This set corresponds to all variables occurring in Goal but not in Template. It is sometimes useful to exclude some additional variables of Goal. For that, bagof/3 recognizes a goal of the form T^Goal and exclude all variables occuring in T from the free variable set. (^)/2 can be viewed as an existential quantifier (the logical reading of X^Goal being “there exists an X such that Goal is true”). The use of this existential qualifier is superfluous outside bagof/3 (and setof/3) and then is not recognized.

    (^)/2 is a predefined infix operator (section 7.14.10).

    setof(Template, Goal, Instances) is equivalent to bagof(Template,Goal,I), sort(I,Instances). Each list is then a sorted list (duplicate elements are removed).

    From the implementation point of view setof/3 is as fast as bagof/3. Both predicates use an in-place (i.e. destructive) sort (section 7.20.12) and require the same amount of memory.

    Errors
    Goal is a variable    instantiation_error
    Goal is neither a variable nor a callable term    type_error(callable, Goal)
    The predicate indicator Pred of Goal does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)
    Instances is neither a partial list nor a list    type_error(list, Instances)

    Portability

    ISO predicates.

    7.10  Streams

    7.10.1  Introduction

    A stream provides a logical view of a source/sink.

    Sources and sinks: a program can output results to a sink or input data from a source. A source/sink may be a file (regular file, terminal, device,...), a constant term, a pipe, a socket,...

    Associating a stream to a source/sink: to manipulate a source/sink it must be associated with a stream. This provides a logical and uniform view of the source/sink whatever its type. Once this association has been established, i.e. a stream has been created, all subsequent references to the source/sink are made by referring the stream. A stream is unidirectional: it is either an input stream or an output stream. For a classical file, the association is done by opening the file (whose name is specified as an atom) with the open/4 (section 7.10.6). GNU Prolog makes it possible to treat a Prolog constant term as a source/sink and provides built-in predicates to associate a stream to such a term (section 7.11). GNU Prolog provides operating system interface predicates defining pipes between GNU Prolog and child processes with streams associated with these pipes, e.g. popen/3 (section 7.27.21). Similarly, socket interface predicates associate streams to a socket to allow the communication, e.g. socket_connect/4 (section 7.28.5).

    Stream-term: a stream-term identifies a stream during a call of an input/output built-in predicate. It is created as a result of associating a stream to a source/sink (section above). A stream-term is a compound term of the form '$stream'(I) where I is an integer.

    Stream aliases: any stream may be associated with a stream alias which is an atom which may be used to refer to that stream. The association can be done at open time or using add_stream_alias/2 (section 7.10.20). Such an association automatically ends when the stream is closed. A particular alias only refers to at most one stream at any one time. However, more than one alias can be associated with a stream. Most built-in predicates which have a stream-term as an input argument also accept a stream alias as that argument. However, built-in predicates which return a stream-term do not accept a stream alias.

    Standard streams: two streams are predefined and open during the execution of every goal: the standard input stream which has the alias user_input and the standard output stream which has the alias user_output. A goal which attempts to close either standard stream succeeds, but does not close the stream.

    Current streams: during execution there is a current input stream and a current output stream. By default, the current input and output streams are the standard input and output streams, but the built-in predicates set_input/1 (section 7.10.4) and set_output/1 (section 7.10.5) can be used to change them. When the current input stream is closed, the standard input stream becomes the current input stream. When the current output stream is closed, the standard output stream becomes the current output stream.

    Text streams and binary streams: a text stream is a sequence of characters. A text stream is also regarded as a sequence of lines where each line is a possibly empty sequence of characters followed by a new line character. GNU Prolog may add or remove space characters at the ends of lines in order to conform to the conventions for representing text streams in the operating system. A binary stream is a sequence of bytes. Only a few built-in predicates can deal with binary streams, e.g. get_byte/2 (section 7.13).

    Stream positions: the stream position of a stream identifies an absolute position of the source/sink to which the stream is connected and defines where in the source/sink the next input or output will take place. A stream position is a ground term of the form '$stream_position'(I1, I2, I3, I4) where I1, I2, I3 and I4 are integers. Stream positions are used to reposition a stream (when possible) using for instance set_stream_position/2 (section 7.10.13).

    The position end of stream: when all data of a stream S has been input S has a stream position end-of-stream. At this stream position a goal to input more data will return a specific value to indicate that end of stream has been reached (e.g. -1 for get_code/2 or end_of_file for get_char/2,...). When this terminating value has been input, the stream has a stream position past-end-of-stream.

    Buffering mode: input/output on a stream can be buffered (line-buffered or block-buffered) or not buffered at all. The buffering mode can be specified at open time or using set_stream_buffering/2 (section 7.10.27). Line buffering is used on output streams, output data are only written to the sink when a new-line character is output (or at the close time). Block buffering is used on input or output. On input streams, when an input is requested on the source, if the buffer is empty, all available characters are read (within the limits of the size of the buffer), subsequent reads will first use the characters in the buffer. On output streams, output data are stored in the buffer and only when the buffer is full is it physically written on the sink. Thus, an output to a buffered stream may not be sent immediately to the sink connected to that stream. When it is necessary to be certain that output has been delivered, the built-in predicate flush_output/1 (section 7.10.8) should be used. Finally, it is also possible to use non-buffered streams, in that case input/output are directly done on the connected source/sink. This can be useful for communication purposes (e.g. sockets) or when a precise control is needed, e.g. select/5 (section 7.27.25).

    Stream mirrors: any stream may be associated with mirror streams specified at open time or using add_stream_mirror/2 (section 7.10.22). Then, all characters/bytes read from/written to the stream are also written on each mirror stream. The association automatically ends when either the stream or the mirror stream is closed. It is also possible to explicitely remove a mirror stream using remove_stream_mirror/2 (section 7.10.23).

    7.10.2  current_input/1

    Templates
    current_input(?stream)
    Description

    current_input(Stream) unifies Stream with the stream-term identifying the current input stream.

    Errors
    Stream is neither a variable nor a stream    domain_error(stream, Stream)

    Portability

    ISO predicate.

    7.10.3  current_output/1

    Templates
    current_output(?stream)
    Description

    current_output(Stream) unifies Stream with the stream-term identifying the current output stream.

    Errors
    Stream is neither a variable nor a stream    domain_error(stream, Stream)

    Portability

    ISO predicate.

    7.10.4  set_input/1

    Templates
    set_input(+stream_or_alias)
    Description

    set_input(SorA) sets the current input stream to be the stream associated with the stream-term or alias SorA.

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)

    Portability

    ISO predicate.

    7.10.5  set_output/1

    Templates
    set_output(+stream_or_alias)
    Description

    set_output(SorA) sets the current output stream to be the stream associated with the stream-term or alias SorA.

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an input stream    permission_error(output, stream, SorA)

    Portability

    ISO predicate.

    7.10.6  open/4, open/3

    Templates
    open(+source_sink, +io_mode, -stream, +stream_option_list)
    open(+source_sink, +io_mode, -stream)
    Description

    open(SourceSink, Mode, Stream, Options) opens the source/sink SourceSink for input or output as indicated by Mode and the list of stream-options Options and unifies Stream with the stream-term which is associated with this stream. See absolute_file_name/2 for information about the syntax of SourceSink (section 7.26.1).

    Input/output modes: Mode is an atom which defines the input/output operations that may be performed the stream. Possible modes are:
    • read: the source/sink is a source and must already exist. Input starts at the beginning of the source.

    • write: the source/sink is a sink. If the sink already exists then it is emptied else an empty sink is created. Output starts at the beginning of that sink.

    • append: the source/sink is a sink. If the sink does not exist it is created. Output starts at the end of that sink.
    Stream options: Options is a list of stream options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are:
    • type(text/binary): specifies whether the stream is a text stream or a binary stream. The default value is text.

    • reposition(true/false): specifies whether it is possible to reposition the stream. The default value is true except if the stream cannot be repositioned (e.g. a terminal).

    • eof_action(error/eof_code/reset): specifies the effect of attempting to input from a stream whose stream position is past-end-of-stream:
      • error: a permission_error is raised signifying that no more input exists in this stream.

      • eof_code: the result of input is as if the stream position is end-of-stream.

      • reset: the stream position is reset so that it is not past-end-of-stream, and another attempt is made to input from it (this is useful when inputting from a terminal).

      The default value is eof_code.

    • alias(Alias): specifies that the atom Alias is to be an alias for the stream. By default no alias is attached to the stream. Several aliases can be defined for a same stream.

    • mirror(Mirror): specifies the stream associated with the stream-term or alias Mirror is a mirror for the stream. By default no mirro is attached to the stream. Several mirrors can be defined for a same stream.

    • buffering(none/line/block): specifies which type of buffering is used by input/output operations on this stream:
      • none: no buffering.

      • line: output operations buffer data emitted until a new-line occurs

      • block: input/output operations buffer data until a given number (implementation dependant) of characters/bytes have been treated.

      The default value is line for a terminal (TTY), block otherwise.
    open(SourceSink, Mode, Stream, Options) is equivalent to open(SourceSink, Mode, Stream, []).

    Errors
    SourceSink is a variable    instantiation_error
    Mode is a variable    instantiation_error
    Options is a partial list or a list with an element E which is a variable    instantiation_error
    Mode is neither a variable nor an atom    type_error(atom, Mode)
    Options is neither a partial list nor a list    type_error(list, Options)
    Stream is not a variable    type_error(variable, Stream)
    SourceSink is neither a variable nor a source/sink    domain_error(source_sink, SourceSink)
    Mode is an atom but not an input/output mode    domain_error(io_mode, Mode)
    an element E of the Options list is neither a variable nor a stream-option    domain_error(stream_option, E)
    the source/sink specified by SourceSink does not exist    existence_error(source_sink, SourceSink)
    the source/sink specified by SourceSink cannot be opened    permission_error(open, source_sink, SourceSink)
    an element E of the Options list is alias(A) and A is already associated with an open stream    permission_error(open, source_sink, alias(A))
    an element E of the Options list is mirror(M) and M is not associated with an open stream    existence_error(stream, M)
    an element E of the Options list is mirror(M) and M iis an input stream    permission_error(output, stream, M)
    an element E of the Options list is reposition(true) and it is not possible to reposition this stream    permission_error(open, source_sink, reposition(true))

    Portability

    ISO predicates. The mirror/1 and buffering/1 stream options are GNU Prolog extensions.

    7.10.7  close/2, close/1

    Templates
    close(+stream_or_alias, +close_option_list)
    close(+stream_or_alias)
    Description

    close(SorA, Options) closes the stream associated with the stream-term or alias SorA. If SorA is the standard input stream or the standard output stream close/2 simply succeeds else the associated source/sink is physically closed. If SorA is the current input stream the current input stream becomes the standard input stream user_input. If SorA is the current output stream the current output stream becomes the standard output stream user_output.

    Close options: Options is a list of close options. For the moment only one option is available:
    • force(true/false): with false, if an error occurs when trying to close the source/sink, the stream is not closed and an error (system_error or resource_error) is raised (but close/2 succeeds). With true, if an error occurs it is ignored and the stream is closed. The purpose of force/1 option is to allow an error handling routine to do its best to reclaim resources. The default value is false.
    close(SorA) is equivalent to close(SorA, []).

    Errors
    SorA is a variable    instantiation_error
    Options is a partial list or a list with an element E which is a variable    instantiation_error
    Options is neither a partial list nor a list    type_error(list, Options)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    an element E of the Options list is neither a variable nor a close-option    domain_error(close_option, E)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA needs a special close (section 7.11)    system_error(needs_special_close)

    Portability

    ISO predicates. The system_error(needs_special_close) is a GNU Prolog extension.

    7.10.8  flush_output/1, flush_output/0

    Templates
    flush_output(+stream_or_alias)
    flush_output
    Description

    flush_output(SorA) sends any buffered output characters/bytes to the stream.

    flush_output/0 applies to the current output stream.

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an input stream    permission_error(output, stream, SorA)

    Portability

    ISO predicates.

    7.10.9  current_stream/1

    Templates
    current_stream(?stream)
    Description

    current_stream(Stream) succeeds if there exists a stream-term that unifies with Stream. This predicate is re-executable on backtracking.

    Errors
    Stream is neither a variable nor a stream-term    domain_error(stream, Stream)

    Portability

    GNU Prolog predicate.

    7.10.10  stream_property/2

    Templates
    stream_property(?stream, ?stream_property)
    Description

    stream_property(Stream, Property) succeeds if current_stream(Stream) succeeds (section 7.10.9) and if Property unifies with one of the properties of the stream. This predicate is re-executable on backtracking.

    Stream properties:
    • file_name(F): the name of the connected source/sink.

    • mode(M): M is the open mode (read, write, append).

    • input: if it is an input stream.

    • output: if it is an output stream.

    • alias(A): A is an alias of the stream.

    • mirror(M): M is a mirror stream of the stream.

    • type(T): T is the type of the stream (text, binary).

    • reposition(R): R is the reposition boolean (true, false).

    • eof_action(A): A is the end-of-file action (error, eof_code, reset).

    • buffering(B): B is the buffering mode (none, line, block).

    • end_of_stream(E): E is the current end-of-stream status (not, at, past). If the stream position is end-of-stream then E is unified with at else if the stream position is past-end-of-stream then E is unified with past else E is unified with not.

    • position(P): P is the stream-position term associated with the current position.
    Errors
    Stream is a variable    instantiation_error
    Stream is neither a variable nor a stream-term    domain_error(stream, Stream)
    Property is neither a variable nor a stream property    domain_error(stream_property, Property)
    Property = file_name(E), mode(E), alias(E), end_of_stream(E), eof_action(E), reposition(E), type(E) or buffering(E) and E is neither a variable nor an atom    type_error(atom, E)

    Portability

    ISO predicate. The buffering/1 property is a GNU Prolog extension.

    7.10.11  at_end_of_stream/1, at_end_of_stream/0

    Templates
    at_end_of_stream(+stream_or_alias)
    at_end_of_stream
    Description

    at_end_of_stream(SorA) succeeds if the stream associated with stream-term or alias SorA has a stream position end-of-stream or past-end-of-stream. This predicate can be defined using stream_property/2 (section 7.10.10).

    at_end_of_stream/0 applies to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)

    Portability

    ISO predicates. The permission_error(input, stream, SorA) is a GNU Prolog extension.

    7.10.12  stream_position/2

    Templates
    stream_position(+stream_or_alias, ?stream_position)
    Description

    stream_position(SorA, Position) succeeds unifying Position with the stream-position term associated with the current position of the stream-term or alias SorA. This predicate can be defined using stream_property/2 (section 7.10.10).

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    Position is neither a variable nor a stream-position term    domain_error(stream_position, Position)
    SorA is not associated with an open stream    existence_error(stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.13  set_stream_position/2

    Templates
    set_stream_position(+stream_or_alias, +stream_position)
    Description

    set_stream_position(SorA, Position) sets the position of the stream associated with the stream-term or alias SorA to Position. Position should have previously been returned by stream_property/2 (section 7.10.10) or by stream_position/2 (section 7.10.12).

    Errors
    SorA is a variable    instantiation_error
    Position is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    Position is neither a variable nor a stream-position term    domain_error(stream_position, Position)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA has stream property reposition(false)    permission_error(reposition, stream, SorA)

    Portability

    ISO predicate.

    7.10.14  seek/4

    Templates
    seek(+stream_or_alias, +stream_seek_method, +integer, ?integer)
    Description

    seek(SorA, Whence, Offset, NewOffset) sets the position of the stream associated with the stream-term or alias SorA to Offset according to Whence and unifies NewOffset with the new offset from the beginning of the file. seek/4 can only be used on binary streams. Whence is an atom from:
    • bof: the position is set relatively to the begin of the file (Offset should be ≥ 0).

    • current: the position is set relatively to the current position (Offset can be ≥ 0 or ≤ 0).

    • eof: the position is set relatively to the end of the file (Offset should be ≤ 0).
    This predicate is an interface to the C Unix function lseek(2).

    Errors
    SorA is a variable    instantiation_error
    Whence is a variable    instantiation_error
    Offset is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    Whence is neither a variable nor an atom    type_error(atom, Whence)
    Whence is an atom but not a valid stream seek method    domain_error(stream_seek_method, Whence)
    Offset is neither a variable nor an integer    type_error(integer, Offset)
    NewOffset is neither a variable nor an integer    type_error(integer, NewOffset)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA has stream property reposition(false)    permission_error(reposition, stream, SorA)
    SorA is associated with a text stream    permission_error(reposition, text_stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.15  character_count/2

    Templates
    character_count(+stream_or_alias, ?integer)
    Description

    character_count(SorA, Count) unifies Count with the number of characters/bytes read/written on the stream associated with stream-term or alias SorA.

    Errors
    SorA is a variable    instantiation_error
    Count is neither a variable nor an integer    type_error(integer, Count)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.16  line_count/2

    Templates
    line_count(+stream_or_alias, ?integer)
    Description

    line_count(SorA, Count) unifies Count with the number of lines read/written on the stream associated with the stream-term or alias SorA. This predicate can only be used on text streams.

    Errors
    SorA is a variable    instantiation_error
    Count is neither a variable nor an integer    type_error(integer, Count)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is associated with a binary stream    permission_error(access, binary_stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.17  line_position/2

    Templates
    line_position(+stream_or_alias, ?integer)
    Description

    line_position(SorA, Count) unifies Count with the number of characters read/written on the current line of the stream associated with the stream-term or alias SorA. This predicate can only be used on text streams.

    Errors
    SorA is a variable    instantiation_error
    Count is neither a variable nor an integer    type_error(integer, Count)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is associated with a binary stream    permission_error(access, binary_stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.18  stream_line_column/3

    Templates
    stream_line_column(+stream_or_alias, ?integer, ?integer)
    Description

    stream_line_column(SorA, Line, Column) unifies Line (resp. Column) with the current line number (resp. column number) of the stream associated with the stream-term or alias SorA. This predicate can only be used on text streams. Note that Line corresponds to the value returned by line_count/2 + 1 (section 7.10.16) and Column to the value returned by line_position/2 + 1 (section 7.10.17).

    Errors
    SorA is a variable    instantiation_error
    Line is neither a variable nor an integer    type_error(integer, Line)
    Column is neither a variable nor an integer    type_error(integer, Column)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is associated with a binary stream    permission_error(access, binary_stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.19  set_stream_line_column/3

    Templates
    set_stream_line_column(+stream_or_alias, +integer, +integer)
    Description

    set_stream_line_column(SorA, Line, Column) sets the stream position of the stream associated with the stream-term or alias SorA according to the line number Line and the column number Column. This predicate can only be used on text streams. It first repositions the stream to the beginning of the file and then reads character by character until the required position is reached.

    Errors
    SorA is a variable    instantiation_error
    Line is a variable    instantiation_error
    Column is a variable    instantiation_error
    Line is neither a variable nor an integer    type_error(integer, Line)
    Column is neither a variable nor an integer    type_error(integer, Column)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is associated with a binary stream    permission_error(reposition, binary_stream, SorA)
    SorA has stream property reposition(false)    permission_error(reposition, stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.20  add_stream_alias/2

    Templates
    add_stream_alias(+stream_or_alias, +atom)
    Description

    add_stream_alias(SorA, Alias) adds Alias as a new alias to the stream associated with the stream-term or alias SorA.

    Errors
    SorA is a variable    instantiation_error
    Alias is a variable    instantiation_error
    Alias is neither a variable nor an atom    type_error(atom, Alias)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    Alias is already associated with an open stream    permission_error(add_alias, source_sink, alias(Alias))

    Portability

    GNU Prolog predicate.

    7.10.21  current_alias/2

    Templates
    current_alias(?stream, ?atom)
    Description

    current_alias(Stream, Alias) succeeds if current_stream(Stream) succeeds (section 7.10.9) and if Alias unifies with one of the aliases of the stream. It can be defined using stream_property/2 (section 7.10.10). This predicate is re-executable on backtracking.

    Errors
    Stream is neither a variable nor a stream-term    domain_error(stream, Stream)
    Alias is neither a variable nor an atom    type_error(atom, Alias)

    Portability

    GNU Prolog predicate.

    7.10.22  add_stream_mirror/2

    Templates
    add_stream_mirror(+stream_or_alias, +stream_or_alias)
    Description

    add_stream_mirror(SorA, Mirror) adds the stream associated with the stream-term or alias Mirror as a new mirror to the stream associated with the stream-term or alias SorA. After this, all characters (or bytes) read from (or written to) SorA are also written to Mirror. This mirroring occurs until Mirror is explicitely removed using remove_stream_mirror/2 (section 7.10.23) or implicitely when Mirror is closed. Several mirror streams can be associated with a same stream. If Mirror represents the same stream as SorA or if Mirror is already a mirror for SorA, no mirror is added.

    Errors
    SorA is a variable    instantiation_error
    Mirror is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    Mirror is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, Mirror)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    Mirror is not associated with an open stream    existence_error(stream, Mirror)
    Mirror is an input stream    permission_error(output, stream, Mirror)

    Portability

    GNU Prolog predicate.

    7.10.23  remove_stream_mirror/2

    Templates
    remove_stream_mirror(+stream_or_alias, +stream_or_alias)
    Description

    remove_stream_mirror(SorA, Mirror) removes the stream associated with the stream-term or alias Mirror from the list of mirrors of the stream associated with the stream-term or alias SorA. This predicate fails if Mirror is not a mirror stream for SorA.

    Errors
    SorA is a variable    instantiation_error
    Mirror is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    Mirror is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, Mirror)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    Mirror is not associated with an open stream    existence_error(stream, Mirror)

    Portability

    GNU Prolog predicate.

    7.10.24  current_mirror/2

    Templates
    current_mirror(?stream, ?stream)
    Description

    current_mirror(Stream, M) succeeds if current_stream(Stream) succeeds (section 7.10.9) and if M unifies with one of the mirrors of the stream. It can be defined using stream_property/2 (section 7.10.10). This predicate is re-executable on backtracking.

    Errors
    Stream is neither a variable nor a stream-term    domain_error(stream, Stream)
    M is neither a variable nor a stream-term    domain_error(stream, M)

    Portability

    GNU Prolog predicate.

    7.10.25  set_stream_type/2

    Templates
    set_stream_type(+stream_or_alias, +atom)
    Description

    set_stream_type(SorA, Type) updates the type associated with stream-term or alias SorA. The value of Type is an atom in text or binary as for open/4 (section 7.10.6). The type of a stream can only be changed before any input/output operation is executed.

    Errors
    SorA is a variable    instantiation_error
    Type is a variable    instantiation_error
    Type is neither a variable nor a valid type    domain_error(stream_type, Type)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    An I/O operation has already been executed on SorA    permission_error(modify, stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.26  set_stream_eof_action/2

    Templates
    set_stream_eof_action(+stream_or_alias, +atom)
    Description

    set_stream_eof_action(SorA, Action) updates the eof_action option associated with the stream-term or alias SorA. The value of Action is one of the atoms error, eof_code, reset as for open/4 (section 7.10.6).

    Errors
    SorA is a variable    instantiation_error
    Action is a variable    instantiation_error
    Action is neither a variable nor a valid eof action    domain_error(eof_action, Action)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(modify, stream, SorA)

    Portability

    GNU Prolog predicate.

    7.10.27  set_stream_buffering/2

    Templates
    set_stream_buffering(+stream_or_alias, +atom)
    Description

    set_stream_buffering(SorA, Buffering) updates the buffering mode associated with the stream-term or alias SorA. The value of Buffering is one of the atoms none, line or block as for open/4 (section 7.10.6). This predicate may only be used after opening a stream and before any other operations have been performed on it.

    Errors
    SorA is a variable    instantiation_error
    Buffering is a variable    instantiation_error
    Buffering is neither a variable nor a valid buffering mode    domain_error(buffering_mode, Buffering)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)

    Portability

    GNU Prolog predicate.

    7.11  Constant term streams

    7.11.1  Introduction

    Constant term streams allow the user to consider a constant term (atom, character list or character code list) as a source/sink by associating to them a stream. Reading from a constant term stream will deliver the characters of the constant term as if they had been read from a standard file. Characters written on a constant term stream are stored to form the final constant term when the stream is closed. The built-in predicates described in this section allow the user to open and close a constant term stream for input or output. However, very often, a constant term stream is created to be only read or written once and then closed. To avoid the creation and the destruction of such a stream, GNU Prolog offers several built-in predicates to perform single input/output from/to constant terms (section 7.15).

    7.11.2  open_input_atom_stream/2, open_input_chars_stream/2,
    open_input_codes_stream/2

    Templates
    open_input_atom_stream(+atom, -stream)
    open_input_chars_stream(+character_list, -stream)
    open_input_codes_stream(+character_code_list, -stream)
    Description

    open_input_atom_stream(Atom, Stream) unifies Stream with the stream-term which is associated with a new input text-stream whose data are the characters of Atom.

    open_input_chars_stream(Chars, Stream) is similar to open_input_atom_stream/2 except that data are the content of the character list Chars.

    open_input_codes_stream(Codes, Stream) is similar to open_input_atom_stream/2 except that data are the content of the character code list Codes.

    Errors
    Stream is not a variable    type_error(variable, Stream)
    Atom is a variable    instantiation_error
    Chars is a partial list or a list with an element E which is a variable    instantiation_error
    Codes is a partial list or a list with an element E which is a variable    instantiation_error
    Atom is neither a variable nor a an atom    type_error(atom, Atom)
    Chars is neither a partial list nor a list    type_error(list, Chars)
    Codes is neither a partial list nor a list    type_error(list, Codes)
    an element E of the Chars list is neither a variable nor a character    type_error(character, E)
    an element E of the Codes list is neither a variable nor an integer    type_error(integer, E)
    an element E of the Codes list is an integer but not a character code    representation_error(character_code)

    Portability

    GNU Prolog predicates.

    7.11.3  close_input_atom_stream/1, close_input_chars_stream/1,
    close_input_codes_stream/1

    Templates
    close_input_atom_stream(+stream_or_alias)
    close_input_chars_stream(+stream_or_alias)
    close_input_codes_stream(+stream_or_alias)
    Description

    close_input_atom_stream(SorA) closes the constant term stream associated with the stream-term or alias SorA. SorA must a stream open with open_input_atom_stream/2 (section 7.11.1).

    close_input_chars_stream(SorA) acts similarly for a character list stream.

    close_input_codes_stream(SorA) acts similarly for a character code list stream.

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(close, stream, SorA)
    SorA is a stream-term or alias but does not refer to a constant term stream.    domain_error(term_stream_or_alias, SorA)

    Portability

    GNU Prolog predicates.

    7.11.4  open_output_atom_stream/1, open_output_chars_stream/1,
    open_output_codes_stream/1

    Templates
    open_output_atom_stream(-stream)
    open_output_chars_stream(-stream)
    open_output_codes_stream(-stream)
    Description

    open_output_atom_stream(Stream) unifies Stream with the stream-term which is associated with a new output text-stream. All characters written to this stream are collected and will be returned as an atom when the stream is closed by close_ouput_atom_stream/2 (section 7.11.5).

    open_output_chars_stream(Stream) is similar to open_output_atom_stream/1 except that the result will be a character list.

    open_output_codes_stream(Stream) is similar to open_output_atom_stream/1 except that the result will be a character code list.

    Errors
    Stream is not a variable    type_error(variable, Stream)

    Portability

    GNU Prolog predicates.

    7.11.5  close_output_atom_stream/2, close_output_chars_stream/2,
    close_output_codes_stream/2

    Templates
    close_output_atom_stream(+stream_or_alias, ?atom)
    close_output_chars_stream(+stream_or_alias, ?character_list)
    close_output_codes_stream(+stream_or_alias, ?character_code_list)
    Description

    close_output_atom_stream(SorA, Atom) closes the constant term stream associated with the stream-term or alias SorA. SorA must be associated with a stream open with open_output_atom_stream/1 (section 7.11.4). Atom is unified with an atom formed with all characters written on the stream.

    close_output_chars_stream(SorA, Chars) acts similarly for a character list stream.

    close_output_codes_stream(SorA, Codes) acts similarly for a character code list stream.

    Errors
    SorA is a variable    instantiation_error
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    Chars is neither a partial list nor a list    type_error(list, Chars)
    Codes is neither a partial list nor a list    type_error(list, Codes)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an input stream    permission_error(close, stream, SorA)
    SorA is a stream-term or alias but does not refer to a constant term stream    domain_error(term_stream_or_alias, SorA)

    Portability

    GNU Prolog predicates.

    7.12  Character input/output

    These built-in predicates enable a single character or character code to be input from and output to a text stream. The atom end_of_file is returned as character to indicate the end-of-file. -1 is returned as character code to indicate the end-of-file.

    7.12.1  get_char/2, get_char/1, get_code/1, get_code/2

    Templates
    get_char(+stream_or_alias, ?in_character)
    get_char(?in_character)
    get_code(+stream_or_alias, ?in_character_code)
    get_code(?in_character_code)
    Description

    get_char(SorA, Char) succeeds if Char unifies with the next character read from the stream associated with the stream-term or alias SorA.

    get_code/2 is similar to get_char/2 but deals with character codes.

    get_char/1 and get_code/1 apply to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Char is neither a variable nor an in-character    type_error(in_character, Char)
    Code is neither a variable nor an integer    type_error(integer, Code)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)
    The entity input from the stream is not a character    representation_error(character)
    Code is an integer but not an in-character code    representation_error(in_character_code)

    Portability

    ISO predicates.

    7.12.2  get_key/2, get_key/1 get_key_no_echo/2, get_key_no_echo/1

    Templates
    get_key(+stream_or_alias, ?integer)
    get_key(?integer)
    get_key_no_echo(+stream_or_alias, ?integer)
    get_key_no_echo(?integer)
    Description

    get_key(Code, SorA) succeeds if Code unifies with the character code of the next key read from the stream associated with the stream-term or alias SorA. It is intended to read a single key from the keyboard (thus SorA should refer to current input stream). No buffering is performed (a character is read as soon as available) and function keys can also be read (in that case, Code is an integer > 255). The read character is echoed if it is printable.

    This facility is only possible if the linedit facility has been installed (section 3.2.5) otherwise get_key/2 behaves similarly to get_code/2 (section 7.12.1) (the code of the first character is returned) but also pumps remaining characters until a character < space (0x20) is read (in particular RETURN). The same behavior occurs if SorA does not refer to the current input stream or if this stream is not attached to a terminal.

    get_key_no_echo/2 behaves similarly to get_key/2 except that the read character is not echoed.

    get_key/1 and get_key_no_echo/1 apply to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Code is neither a variable nor an integer    type_error(integer, Code)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)

    Portability

    GNU Prolog predicates.

    7.12.3  peek_char/2, peek_char/1, peek_code/1, peek_code/2

    Templates
    peek_char(+stream_or_alias, ?in_character)
    peek_char(?in_character)
    peek_code(+stream_or_alias, ?in_character_code)
    peek_code(?in_character_code)
    Description

    peek_char(SorA, Char) succeeds if Char unifies with the next character that will be read from the stream associated with the stream-term or alias SorA. The character is not read.

    peek_code/2 is similar to peek_char/2 but deals with character codes.

    peek_char/1 and peek_code/1 apply to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Char is neither a variable nor an in-character    type_error(in_character, Char)
    Code is neither a variable nor an integer    type_error(integer, Code)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)
    The entity input from the stream is not a character    representation_error(character)
    Code is an integer but not an in-character code    representation_error(in_character_code)

    Portability

    ISO predicates.

    7.12.4  unget_char/2, unget_char/1, unget_code/2, unget_code/1

    Templates
    unget_char(+stream_or_alias, +character)
    unget_char(+character)
    unget_code(+stream_or_alias, +character_code)
    unget_code(+character_code)
    Description

    unget_char(SorA, Char) pushes back Char onto the stream associated with the stream-term or alias SorA. Char will be the next character read by get_char/2. The maximum number of characters that can be cumulatively pushed back is given by the max_unget Prolog flag (section 7.22.1).

    unget_code/2 is similar to unget_char/2 but deals with character codes.

    unget_char/1 and unget_code/1 apply to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Char is a variable    instantiation_error
    Code is a variable    instantiation_error
    Char is neither a variable nor a character    type_error(character, Char)
    Code is neither a variable nor an integer    type_error(integer, Code)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
    Code is an integer but not a character code    representation_error(character_code)

    Portability

    GNU Prolog predicates.

    7.12.5  put_char/2, put_char/1, put_code/1, put_code/2, nl/1, nl/0

    Templates
    put_char(+stream_or_alias, +character)
    put_char(+character)
    put_code(+stream_or_alias, +character_code)
    put_code(+character_code)
    nl(+stream_or_alias)
    nl
    Description

    put_char(SorA, Char) writes Char onto the stream associated with the stream-term or alias SorA.

    put_code/2 is similar to put_char/2 but deals with character codes.

    nl(SorA) writes a new-line character onto the stream associated with the stream-term or alias SorA. This is equivalent to put_char(SorA, '\n').

    put_char/1, put_code/1 and nl/0 apply to the current output stream.

    Errors
    SorA is a variable    instantiation_error
    Char is a variable    instantiation_error
    Code is a variable    instantiation_error
    Char is neither a variable nor a character    type_error(character, Char)
    Code is neither a variable nor an integer    type_error(integer, Code)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an input stream    permission_error(output, stream, SorA)
    SorA is associated with a binary stream    permission_error(output, binary_stream, SorA)
    Code is an integer but not a character code    representation_error(character_code)

    Portability

    ISO predicates.

    7.13  Byte input/output

    These built-in predicates enable a single byte to be input from and output to a binary stream. -1 is returned to indicate the end-of-file.

    7.13.1  get_byte/2, get_byte/1

    Templates
    get_byte(+stream_or_alias, ?in_byte)
    get_byte(?in_byte)
    Description

    get_byte(SorA, Byte) succeeds if Byte unifies with the next byte read from the stream associated with the stream-term or alias SorA.

    get_byte/1 applies to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Byte is neither a variable nor an in-byte    type_error(in_byte, Byte)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a text stream    permission_error(input, text_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)

    Portability

    ISO predicates.

    7.13.2  peek_byte/2, peek_byte/1

    Templates
    peek_byte(+stream_or_alias, ?in_byte)
    peek_byte(?in_byte)
    Description

    peek_byte(SorA, Byte) succeeds if Byte unifies with the next byte that will be read from the stream associated with the stream-term or alias SorA. The byte is not read.

    peek_byte/1 applies to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Byte is neither a variable nor an in-byte    type_error(in_byte, Byte)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a text stream    permission_error(input, text_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)

    Portability

    ISO predicates.

    7.13.3  unget_byte/2, unget_byte/1

    Templates
    unget_byte(+stream_or_alias, +byte)
    unget_byte(+byte)
    Description

    unget_byte(SorA, Byte) pushes back Byte onto the stream associated with the stream-term or alias SorA. Byte will be the next byte read by get_byte/2. The maximum number of bytes that can be successively pushed back is given by the max_unget Prolog flag (section 7.22.1).

    unget_byte/1 applies to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Byte is a variable    instantiation_error
    Byte is neither a variable nor a byte    type_error(byte, Byte)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a text stream    permission_error(input, text_stream, SorA)

    Portability

    GNU Prolog predicates.

    7.13.4  put_byte/2, put_byte/1

    Templates
    put_byte(+stream_or_alias, +byte)
    put_byte(+byte)
    Description

    put_byte(SorA, Byte) writes Byte onto the stream associated with the stream-term or alias SorA.

    put_byte/1 applies to the current output stream.

    Errors
    SorA is a variable    instantiation_error
    Byte is a variable    instantiation_error
    Byte is neither a variable nor a byte    type_error(byte, Byte)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(output, stream, SorA)
    SorA is associated with a text stream    permission_error(output, text_stream, SorA)

    Portability

    GNU Prolog predicates.

    7.14  Term input/output

    These built-in predicates enable a Prolog term to be input from or output to a text stream. The atom end_of_file is returned as term to indicate the end-of-file. The syntax of such terms can also be altered by changing the operators (section 7.14.10), and making some characters equivalent to others (section 7.14.12) if the char_conversion Prolog flag is on (section 7.22.1). Double quoted tokens will be returned as an atom or a character list or a character code list depending on the value of the double_quotes Prolog flag (section 7.22.1). Similarly, back quoted tokens are returned depending on the value of the back_quotes Prolog flag.

    7.14.1  read_term/3, read_term/2, read/2, read/1

    Templates
    read_term(+stream_or_alias, ?term, +read_option_list)
    read_term(?term, +read_option_list)
    read(+stream_or_alias, ?term)
    read(?term)
    Description

    read_term(SorA, Term, Options) is true if Term unifies with the next term read from the stream associated with the stream-term or alias SorA according to the options given by Options.

    Read options: Options is a list of read options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are:
    • variables(VL): VL is unified with the list of all variables of the input term, in left-to-right traversal order. Anonymous variables are included in the list VL.

    • variable_names(VNL): VNL is unified with the list of pairs Name = Var where Var is a named variable of the term and Name is the atom associated with the name of Var. Anonymous variables are not included in the list VNL.

    • singletons(SL): SL is unified with the list of pairs Name = Var where Var is a named variable which occurs only once in the term and Name is the atom associated to the name of Var. Anonymous variables are not included in the list SL.

    • syntax_error(error/warning/fail): specifies the effect of a syntax error:
      • error: a syntax_error is raised.

      • warning: a warning message is displayed and the predicate fails.

      • fail: the predicate quietly fails.

      The default value is the value of the syntax_error Prolog flag (section 7.22.1).

    • end_of_term(dot/eof): specifies the end-of-term delimiter: dot is the classical full-stop delimiter (a dot followed with a layout character), eof is the end-of-file delimiter. This option is useful for predicates like read_term_from_atom/3 (section 7.15.1) to avoid to add a terminal dot at the end of the atom. The default value is dot.
    read(SorA, Term) is equivalent to read_term(SorA, Term, []).

    read_term/2 and read/1 apply to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Options is a partial list or a list with an element E which is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    Options is neither a partial list nor a list    type_error(list, Options)
    an element E of the Options list is neither a variable nor a valid read option    domain_error(read_option, E)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)
    a syntax error occurs and the value of the syntax_error Prolog flag is error (section 7.22.1)    syntax_error(atom explaining the error)

    Portability

    ISO predicates. The ISO reference raises a representation_error(Flag) where Flag is max_arity, max_integer, or min_integer when the read term breaches an implementation defined limit specified by Flag. GNU Prolog detects neither min_integer nor max_integer violation and treats a max_arity violation as a syntax error. The read options syntax_error/1 and end_of_term/1 are GNU Prolog extensions.

    7.14.2  read_atom/2, read_atom/1, read_integer/2, read_integer/1,
    read_number/2, read_number/1

    Templates
    read_atom(+stream_or_alias, ?atom)
    read_atom(?atom)
    read_integer(+stream_or_alias, ?integer)
    read_integer(?integer)
    read_number(+stream_or_alias, ?number)
    read_number(?number)
    Description

    read_atom(SorA, Atom) succeeds if Atom unifies with the next atom read from the stream associated with the stream-term or alias SorA.

    read_integer(SorA, Integer) succeeds if Integer unifies with the next integer read from the stream associated with the stream-term or alias SorA.

    read_number(SorA, Number) succeeds if Number unifies with the next number (integer or floating point number) read from the stream associated with the stream-term or alias SorA.

    read_atom/1, read_integer/1 and read_number/1 apply to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    Integer is neither a variable nor an integer    type_error(integer, Integer)
    Number is neither a variable nor a number    type_error(number, Number)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)
    a syntax error occurs and the value of the syntax_error Prolog flag is error (section 7.22.1)    syntax_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.14.3  read_token/2, read_token/1

    Templates
    read_token(+stream_or_alias, ?nonvar)
    read_token(?nonvar)
    Description

    read_token(SorA, Token) succeeds if Token unifies with the encoding of the next Prolog token read from the stream associated with stream-term or alias SorA.

    Token encoding:
    • var(A): a variable is read whose name is the atom A.

    • an atom A: an atom A is read.

    • integer N: an integer N is read.

    • floating point number N: a floating point number N is read.

    • string(A): a string (double quoted item) is read whose characters forms the atom A.

    • punct(P): a punctuation character P is read (P is a one-character atom in ()[]{|}, the atom full_stop or the atom end_of_file).

    • back_quotes(A): a back quoted item is read whose characters forms the atom A.

    • extended(A): an extended character A (an atom) is read.
    As for read_term/3, the behavior of read_token/2 can be affected by some Prolog flags (section 7.14).

    read_token/1 applies to the current input stream.

    Errors
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an output stream    permission_error(input, stream, SorA)
    SorA is associated with a binary stream    permission_error(input, binary_stream, SorA)
    SorA has stream properties end_of_stream(past) and eof_action(error)    permission_error(input, past_end_of_stream, SorA)
    a syntax error occurs and the value of the syntax_error Prolog flag is error (section 7.22.1)    syntax_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.14.4  syntax_error_info/4

    Templates
    syntax_error_info(?atom, ?integer, ?integer, ?atom)
    Description

    syntax_error_info(FileName, Line, Column, Error) returns the information associated with the last syntax error. Line is the line number of the error, Column is the column number of the error and Error is an atom explaining the error.

    Errors
    FileName is neither a variable nor an atom    type_error(atom, FileName)
    Line is neither a variable nor an integer    type_error(integer, Line)
    Column is neither a variable nor an integer    type_error(integer, Column)
    Error is neither a variable nor an atom    type_error(atom, Error)

    Portability

    GNU Prolog predicate.

    7.14.5  last_read_start_line_column/2

    Templates
    last_read_start_line_column(?integer, ?integer)
    Description

    last_read_start_line_column(Line, Column) unifies Line and Column with the line number and the column number associated with the start of the last read predicate. This predicate can be used after calling one of the following predicates: read_term/3, read_term/2, read/2, read/1 (section 7.14.1), read_atom/2, read_atom/1, read_integer/2, read_integer/1, read_number/2, read_number/1 (section 7.14.2) or read_token/2, read_token/1 (section 7.14.3).

    Errors
    Line is neither a variable nor an integer    type_error(integer, Line)
    Column is neither a variable nor an integer    type_error(integer, Column)

    Portability

    GNU Prolog predicate.

    7.14.6  write_term/3, write_term/2, write/2, write/1, writeq/2, writeq/1,
    write_canonical/2, write_canonical/1, display/2, display/1, print/2,
    print/1

    Templates
    write_term(+stream_or_alias, ?term, +write_option_list)
    write_term(?term, +write_option_list)
    write(+stream_or_alias, ?term)
    write(?term)
    writeq(+stream_or_alias, ?term)
    writeq(?term)
    write_canonical(+stream_or_alias, ?term)
    write_canonical(?term)
    display(+stream_or_alias, ?term)
    display(?term)
    print(+stream_or_alias, ?term)
    print(?term)
    Description

    write_term(SorA, Term, Options) writes Term to the stream associated with the stream-term or alias SorA according to the options given by Options.

    Write options: Options is a list of write options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are:
    • quoted(true/false): if true each atom and functor is quoted if this would be necessary for the term to be input by read_term/3. If false no extra quotes are written. The default value is false.

    • ignore_ops(true/false): if true each compound term is output in functional notation (neither operator notation nor list notation is used). If false operator and list notations are used. The default value is false.

    • numbervars(true/false): if true a term of the form '$VAR'(N), where N is an integer, is output as a variable name (see below). If false such a term is output normally (according to the other options). The default value is true.

    • namevars(true/false): if true a term of the form '$VARNAME'(Name), where Name is an atom, is output as a variable name (see below). If false such a term is output normally (according to the other options). The default value is true.

    • space_args(true/false): if true an extra space character is emitted after each comma separating the arguments of a compound term in functional notation or of a list. If false no extra space is emitted. The default value is false.

    • portrayed(true/false): if true and if there exists a predicate portray/1, write_term/3 acts as follows: if Term is a variable it is simply written. If Term is non-variable then it is passed to portray/1. If this succeeds then it is assumed that Term has been output. Otherwise write_term/3 outputs the principal functor of Term (Term itself if it is atomic) according to other options and recursively calls portray/1 on the components of Term (if it is a compound term). With ignore_ops(false) a list is first passed to portray/1 and only if this call fails each element of the list is passed to portray/1 (thus every sub-list is not passed). The default value is false.

    • max_depth(N): controls the depth of output for compound terms. N is an integer specifying the depth. The output of a term whose depth is greater than N gives rise to the output of ... (3 dots). By default there is no depth limit.

    • priority(N): specifies the starting priority to output the term. This option controls if Term should be enclosed in brackets. N is a positive integer ≤ 1200. By default N = 1200.
    Variable numbering: when the numbervars(true) option is passed to write_term/3 any term of the form '$VAR'(N) where N is an integer is output as a variable name consisting of a capital letter possibly followed by an integer. The capital letter is the (I+1)th letter of the alphabet and the integer is J, where I = N mod 26 and J = N // 26. The integer J is omitted if it is zero. For example:
    '$VAR'(0)    is written as A
    '$VAR'(1)    is written as B
    ...
    '$VAR'(25)    is written as Z
    '$VAR'(26)    is written as A1
    '$VAR'(27)    is written as B1
    Variable naming: when the namevars(true) option is passed to write_term/3 any term of the form '$VARNAME'(Name) where Name is an atom is output as a variable name consisting of the characters Name. For example: '$VARNAME'('A') is written as A (even in the presence of the quoted(true) option).

    write(SorA, Term) is equivalent to write_term(SorA, Term, []).

    writeq(SorA, Term) is equivalent to write_term(SorA, Term, [quoted(true)]).

    write_canonical(SorA, Term) is equivalent to write_term(SorA, Term, [quoted(true),
    ignore_ops(true), numbervars(false)])
    .

    display(SorA, Term) is equivalent to write_term(SorA, Term, [ignore_ops(true),
    numbervars(false)])
    .

    print(SorA, Term) is equivalent to write_term(SorA, Term, [numbervars(false),
    portrayed(true)])
    .

    write_term/2, write/1, writeq/1, write_canonical/1, display/1 and print/1 apply to the current output stream.

    Errors
    SorA is a variable    instantiation_error
    Options is a partial list or a list with an element E which is a variable    instantiation_error
    Options is neither a partial list nor a list    type_error(list, Options)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    an element E of the Options list is neither a variable nor a valid write-option    domain_error(write_option, E)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an input stream    permission_error(output, stream, SorA)
    SorA is associated with a binary stream    permission_error(output, binary_stream, SorA)

    Portability

    ISO predicates except display/1-2 and print/1-2 that are GNU Prolog predicates. namevars/1, space_args/1, portrayed/1, max_depth/1 and priority/1 options are GNU Prolog extensions.

    7.14.7  format/3, format/2

    Templates
    format(+stream_or_alias, +character_code_list_or_atom, +list)
    format(+character_code_list_or_atom, +list)
    Description

    format(SorA, Format, Arguments) writes the Format string replacing each format control sequence F by the corresponding element of Arguments (formatted according to F) to the stream associated with the stream-term or alias SorA.

    Format control sequences: the general format of a control sequence is '~NC'. The character C determines the type of the control sequence. N is an optional numeric argument. An alternative form of N is '*'. '*' implies that the next argument Arg in Arguments should be used as a numeric argument in the control sequence. The use of C printf() formatting sequence (beginning by the character %) is also allowed. The following control sequences are available:
    Format sequence
    type of the argument
    Description
    ~Na
    atom
    print the atom without quoting. N is minimal number of characters to print using spaces on the rigth if needed (default: the length of the atom)
    ~Nc
    character code
    print the character associated with the code. N is the number of times to print the character (default: 1)
    ~Nf
    ~Ne ~NE ~Ng ~NG
    float expression
    pass the argument Arg and N to the C printf() function as:
    if N is not specified printf("%f",Arg) else printf("%.Nf",Arg).
    Similarly for ~Ne, ~NE, ~Ng and ~NG
    ~Nd
    integer expression
    print the argument. N is the number of digits after the decimal point. If N is 0 no decimal point is printed (default: 0)
    ~ND
    integer expression
    identical to ~Nd except that ',' separates groups of three digits to the left of the decimal point
    ~Nr
    integer expression
    print the argument according to the radix N. 2 ≤ N ≤ 36 (default: 8). The letters a-z denote digits > 9
    ~NR
    integer expression
    identical to ~Nr except that the letters A-Z denote digits > 9
    ~Ns
    character code list
    print exactly N characters (default: the length of the list)
    ~NS
    character list
    print exactly N characters (default: the length of the list)
    ~i
    term
    ignore the current argument
    ~k
    term
    pass the argument to write_canonical/1 (section 7.14.6)
    ~p
    term
    pass the argument to print/1 (section 7.14.6)
    ~q
    term
    pass the argument to writeq/1 (section 7.14.6)
    ~w
    term
    pass the argument to write/1 (section 7.14.6)
    ~~
    none
    print the character '~'
    ~Nn
    none
    print N new-line characters (default: 1)
    ~N
    none
    print a new-line character if not at the beginning of a line
    ~?
    atom
    use the argument as a nested format string
    %F
    atom, integer or float expression
    interface to the C function printf(3) for outputting atoms (C string), integers and floating point numbers. * are also allowed.

    format/2 applies to the current output stream.

    Errors
    SorA is a variable    instantiation_error
    Format is a partial list or a list with an element E which is a variable    instantiation_error
    Arguments is a partial list    instantiation_error
    Format is neither a partial list nor a list or an atom    type_error(list, Format)
    Arguments is neither a partial list nor a list    type_error(list, Arguments)
    an element E of the Format list is neither a variable nor a character code    representation_error(character_code, E)
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    an element E of Format is not a valid format control sequence    domain_error(format_control_sequence, E)
    the Arguments list does not contain sufficient elements    domain_error(non_empty_list, [])
    an element E of the Arguments list is a variable while a non-variable term was expected    instantiation_error
    an element E of the Arguments list is neither variable nor an atom while an atom was expected    type_error(atom, E)
    an element E of the Arguments cannot be evaluated as an arithmetic expression while an integer or a floating point number was expected    an arithmetic error (section 7.6.1)
    an element E of the Arguments list is neither variable nor character code while a character code was expected    representation_error(character_code, E)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an input stream    permission_error(output, stream, SorA)
    SorA is associated with a binary stream    permission_error(output, binary_stream, SorA)

    Portability

    GNU Prolog predicates.

    7.14.8  portray_clause/2, portray_clause/1

    Templates
    portray_clause(+stream_or_alias, +clause)
    portray_clause(+clause)
    Description

    portray_clause(SorA, Clause) pretty prints Clause to the stream associated with the stream-term or alias SorA. portray_clause/2 uses the variable binding predicates name_singleton_vars/1 (section 7.5.1) and numbervars/1 (section 7.5.3). This predicate is used by listing/1 (section 7.23.3).

    portray_clause/1 applies to the current output stream.

    Errors
    Clause is a variable    instantiation_error
    Clause is neither a variable nor a callable term    type_error(callable, Clause)
    SorA is a variable    instantiation_error
    SorA is neither a variable nor a stream-term or alias    domain_error(stream_or_alias, SorA)
    SorA is not associated with an open stream    existence_error(stream, SorA)
    SorA is an input stream    permission_error(output, stream, SorA)
    SorA is associated with a binary stream    permission_error(output, binary_stream, SorA)

    Portability

    GNU Prolog predicates.

    7.14.9  get_print_stream/1

    Templates
    get_print_stream(?stream)
    Description

    get_print_stream(Stream) unifies Stream with the stream-term associated with the output stream used by print/2 (section 7.14.6). The purpose of this predicate is to allow a user-defined portray/1 predicate to identify the output stream in use.

    Errors
    Stream is neither a variable nor a stream-term    domain_error(stream, Stream)

    Portability

    GNU Prolog predicate.

    7.14.10  op/3

    Templates
    op(+integer, +operator_specifier, +atom_or_atom_list)
    Description

    op(Priority, OpSpecifier, Operator) alters the operator table. Operator is declared as an operator with properties defined by specifier OpSpecifier and Priority. Priority must be an integer ≥ 0 and ≤ 1200. If Priority is 0 then the operator properties of Operator (if any) are canceled. Operator may also be a list of atoms in which case all of them are declared to be operators. In general, operators can be removed from the operator table and their priority or specifier can be changed. However, it is an error to attempt to change the ',' operator from its initial status. An atom can have multiple operator definitions (e.g. prefix and infix like +) however an atom cannot have both an infix and a postfix operator definitions.

    Operator specifiers: the following specifiers are available:
    Specifier Type Associativity
    fx prefix no
    fy prefix yes
    xf postfix no
    yf postfix yes
    xfx infix no
    yfx infix left
    xfy infix right

    Prolog predefined operators:
    Priority Specifier
    Operators
    1200 xfx
    :-  –>
    1200 fx
    :-
    1100 xfy
    ;
    1050 xfy
    ->
    1000 xfy
    ,
    900 fy
    \+
    700 xfx
    =  \=  =..  ==  \==  @<  @=<  @>  @>=  is  =:=  =\=  <  =<  >  >=
    600 xfy
    :
    500 yfx
    +  -  /\  \/
    400 yfx
    *  /  //  rem  mod  <<  >>
    200 xfy
    **  ^
    200 fy
    +  -  \

    FD predefined operators:
    Priority Specifier
    Operators
    750 xfy
    #<=>  #\<=>
    740 xfy
    #==>  #\==>
    730 xfy
    ##  #\/  #\\/
    720 yfx
    #/\  #\/\
    710 fy
    #\
    700 xfx
    #=  #\=  #<  #=<  #>  #>=  #=#  #\=#  #<#  #=<#  #>#  #>=#
    500 yfx
    +  -
    400 yfx
    *  /  //  rem
    200 xfy
    **
    200 fy
    +  -

    Errors
    Priority is a variable    instantiation_error
    OpSpecifier is a variable    instantiation_error
    Operator is a partial list or a list with an element E which is a variable    instantiation_error
    Priority is neither a variable nor an integer    type_error(integer, Priority)
    OpSpecifier is neither a variable nor an atom    type_error(atom, OpSpecifier)
    Operator is neither a partial list nor a list nor an atom    type_error(list, Operator)
    an element E of the Operator list is neither a variable nor an atom    type_error(atom, E)
    Priority is an integer not ≥ 0 and ≤ 1200    domain_error(operator_priority, Priority)
    OpSpecifier is not a valid operator specifier    domain_error(operator_specifier, OpSpecifier)
    Operator is ',' or an element of the Operator list is ','    permission_error(modify, operator, ',')
    OpSpecifier is a specifier such that Operator would have a postfix and an infix definition.    permission_error(create, operator, Operator)

    Portability

    ISO predicate.

    The ISO reference implies that if a program calls current_op/3, then modifies an operator definition by calling op/3 and backtracks into the call to current_op/3, then the changes are guaranteed not to affect that current_op/3 goal. This is not guaranteed by GNU Prolog.

    7.14.11  current_op/3

    Templates
    current_op(?integer, ?operator_specifier, ?atom)
    Description

    current_op(Priority, OpSpecifier, Operator) succeeds if Operator is an operator with properties defined by specifier OpSpecifier and Priority. This predicate is re-executable on backtracking.

    Errors
    Priority is neither a variable nor an operator priority    domain_error(operator_priority, Priority)
    OpSpecifier is neither a variable nor an operator specifier    domain_error(operator_specifier, OpSpecifier)
    Operator is neither a variable nor an atom    type_error(atom, Operator)

    Portability

    ISO predicate.

    7.14.12  char_conversion/2

    Templates
    char_conversion(+character, +character)
    Description

    char_conversion(InChar, OutChar) alters the character-conversion mapping. This mapping is used by the following read predicates: read_term/3 (section 7.14.1), read_atom/2, read_integer/2, read_number/2 (section 7.14.2) and read_token/2 (section 7.14.3) to replace any occurrence of a character InChar by OutChar. However the conversion mechanism should have been previously activated by switching on the char_conversion Prolog flag (section 7.22.1). When InChar and OutChar are the same, the effect is to remove any conversion of a character InChar.

    Note that the single character read predicates (e.g. get_char/2) never do character conversion. If such behavior is required, it must be explicitly done using current_char_conversion/2 (section 7.14.13).

    Errors
    InChar is a variable    instantiation_error
    OutChar is a variable    instantiation_error
    InChar is neither a variable nor a character    type_error(character, InChar)
    OutChar is neither a variable nor a character    type_error(character, OutChar)

    Portability

    ISO predicate. The type_error(character,...) is a GNU Prolog behavior, the ISO reference instead defines a representation_error(character) in this case. This seems to be an error of the ISO reference since, for many other built-in predicates accepting a character (e.g. char_code/2, put_char/2), a type_error is raised.

    The ISO reference implies that if a program calls current_char_conversion/2, then modifies the character mapping by calling char_conversion/2, and backtracks into the call to current_char_conversion/2 then the changes are guaranteed not to affect that current_char_conversion/2 goal. This is not guaranteed by GNU Prolog.

    7.14.13  current_char_conversion/2

    Templates
    current_char_conversion(?character, ?character)
    Description

    current_char_conversion(InChar, OutChar) succeeds if the conversion of InChar is OutChar according to the character-conversion mapping. In that case, InChar and OutChar are different. This predicate is re-executable on backtracking.

    Errors
    InChar is neither a variable nor a character    type_error(character, InChar)
    OutChar is neither a variable nor a character    type_error(character, OutChar)

    Portability

    ISO predicate. Same remark as for char_conversion/2 (section 7.14.12).

    7.15  Input/output from/to constant terms

    These built-in predicates enable a Prolog term to be input from or output to a Prolog constant term (atom, character list or character code list). All these predicates can be defined using constant term streams (section 7.11). They are however simpler to use.

    7.15.1  read_term_from_atom/3, read_from_atom/2, read_token_from_atom/2

    Templates
    read_term_from_atom(+atom ?term, +read_option_list)
    read_from_atom(+atom, ?term)
    read_token_from_atom(+atom, ?nonvar)
    Description

    Like read_term/3, read/2 (section 7.14.1) and read_token/2 (section 7.14.3) except that characters are not read from a text-stream but from Atom; the atom given as first argument.

    Errors
    Atom is a variable    instantiation_error
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    see associated predicate errors    (section 7.14.1) and (section 7.14.3)

    Portability

    GNU Prolog predicates.

    7.15.2  read_term_from_chars/3, read_from_chars/2, read_token_from_chars/2

    Templates
    read_term_from_chars(+character_list ?term, +read_option_list)
    read_from_chars(+character_list, ?term)
    read_token_from_chars(+character_list, ?nonvar)
    Description

    Like read_term/3, read/2 (section 7.14.1) and read_token/2 (section 7.14.3) except that characters are not read from a text-stream but from Chars; the character list given as first argument.

    Errors
    Chars is a partial list or a list with an element E which is a variable    instantiation_error
    Chars is neither a partial list nor a list    type_error(list, Chars)
    an element E of the Chars list is neither a variable nor a character    type_error(character, E)
    see associated predicate errors    (section 7.14.1) and (section 7.14.3)

    Portability

    GNU Prolog predicates.

    7.15.3  read_term_from_codes/3, read_from_codes/2, read_token_from_codes/2

    Templates
    read_term_from_codes(+character_code_list ?term, +read_option_list)
    read_from_codes(+character_code_list, ?term)
    read_token_from_codes(+character_code_list, ?nonvar)
    Description

    Like read_term/3, read/2 (section 7.14.1) and read_token/2 (section 7.14.3) except that characters are not read from a text-stream but from Codes; the character code list given as first argument.

    Errors
    Codes is a partial list or a list with an element E which is a variable    instantiation_error
    Codes is neither a partial list nor a list    type_error(list, Codes)
    an element E of the Codes list is neither a variable nor an integer    type_error(integer, E)
    an element E of the Codes list is an integer but not a character code    representation_error(character_code, E)
    see associated predicate errors    (section 7.14.1) and (section 7.14.3)

    Portability

    GNU Prolog predicates.

    7.15.4  write_term_to_atom/3, write_to_atom/2, writeq_to_atom/2,
    write_canonical_to_atom/2, display_to_atom/2, print_to_atom/2,
    format_to_atom/3

    Templates
    write_term_to_atom(?atom, ?term, +write_option_list)
    write_to_atom(?atom, ?term)
    writeq_to_atom(?atom, ?term)
    write_canonical_to_atom(?atom, ?term)
    display_to_atom(?atom, ?term)
    print_to_atom(?atom, ?term)
    format_to_atom(?atom, +character_code_list_or_atom, +list)
    Description

    Similar to write_term/3, write/2, writeq/2, write_canonical/2, display/2, print/2 (section 7.14.6) and format/3 (section 7.14.7) except that characters are not written onto a text-stream but are collected as an atom which is then unified with the first argument Atom.

    Errors
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    see associated predicate errors    (section 7.14.6) and (section 7.14.7)

    Portability

    GNU Prolog predicates.

    7.15.5  write_term_to_chars/3, write_to_chars/2, writeq_to_chars/2,
    write_canonical_to_chars/2, display_to_chars/2, print_to_chars/2,
    format_to_chars/3

    Templates
    write_term_to_chars(?character_list, ?term, +write_option_list)
    write_to_chars(?character_list, ?term)
    writeq_to_chars(?character_list, ?term)
    write_canonical_to_chars(?character_list, ?term)
    display_to_chars(?character_list, ?term)
    print_to_chars(?character_list, ?term)
    format_to_chars(?character_list, +character_code_list_or_atom, +list)
    Description

    Similar to write_term/3, write/2, writeq/2, write_canonical/2, display/2, print/2 (section 7.14.6) and format/3 (section 7.14.7) except that characters are not written onto a text-stream but are collected as a character list which is then unified with the first argument Chars.

    Errors
    Chars is neither a partial list nor a list    type_error(list, Chars)
    see associated predicate errors    (section 7.14.6) and (section 7.14.7)

    Portability

    GNU Prolog predicates.

    7.15.6  write_term_to_codes/3, write_to_codes/2, writeq_to_codes/2,
    write_canonical_to_codes/2, display_to_codes/2, print_to_codes/2,
    format_to_codes/3

    Templates
    write_term_to_codes(?character_code_list, ?term, +write_option_list)
    write_to_codes(?character_code_list, ?term)
    writeq_to_codes(?character_code_list, ?term)
    write_canonical_to_codes(?character_code_list, ?term)
    display_to_codes(?character_code_list, ?term)
    print_to_codes(?character_code_list, ?term)
    format_to_codes(?character_code_list, +character_code_list_or_atom, +list)
    Description

    Similar to write_term/3, write/2, writeq/2, write_canonical/2, display/2, print/2 (section 7.14.6) and format/3 (section 7.14.7) except that characters are not written onto a text-stream but are collected as a character code list which is then unified with the first argument Codes.

    Errors
    Codes is neither a partial list nor a list    type_error(list, Codes)
    see associated predicate errors    (section 7.14.6) and (section 7.14.7)

    Portability

    GNU Prolog predicates.

    7.16  DEC-10 compatibility input/output

    7.16.1  Introduction

    The DEC-10 Prolog I/O predicates manipulate streams implicitly since they only refer to current input/output streams (section 7.10.1). The current input and output streams are initially set to user_input and user_output respectively. The predicate see/1 (resp. tell/1, append/1) can be used for setting the current input (resp. output) stream to newly opened streams for particular files. The predicate seen/0 (resp. told/0) close the current input (resp. output) stream, and resets it to the standard input (resp. output). The predicate seeing/1 (resp. telling/1) is used for retrieving the file name associated with the current input (resp. output) stream. The file name user stands for the standard input or output, depending on context (user_input and user_output can also be used). The DEC-10 Prolog I/O predicates are only provided for compatibility, they are now obsolete and their use is discouraged. The predicates for explicit stream manipulation should be used instead (section 7.10).

    7.16.2  see/1, tell/1, append/1

    Templates
    see(+source_sink)
    see(+stream)
    tell(+source_sink)
    tell(+stream)
    append(+source_sink)
    append(+stream)
    Description

    see(FileName) sets the current input stream to FileName. If there is a stream opened by see/1 associated with the same FileName already, then it becomes the current input stream. Otherwise, FileName is opened for reading and becomes the current input stream.

    tell(FileName) sets the current output stream to FileName. If there is a stream opened by tell/1 associated with the same FileName already, then it becomes the current output stream. Otherwise, FileName is opened for writing and becomes the current output stream.

    append(FileName) like tell/1 but FileName is opened for writing + append.

    A stream-term (obtained with any other built-in predicate) can also be provided as FileName to these predicates.

    Errors

    See errors associated with open/4 (section 7.10.6).

    Portability

    GNU Prolog predicates.

    7.16.3  seeing/1, telling/1

    Templates
    seeing(?source_sink)
    telling(?source_sink)
    Description

    seeing(FileName) succeeds if FileName unifies with the name of the current input file, if it was opened by see/1; else with the current input stream-term, if this is not user_input, otherwise with user.

    telling(FileName) succeeds if FileName unifies with the name of the current output file, if it was opened by tell/1 or append/1; else with the current output stream-term, if this is not user_output, otherwise with user.

    Errors

    None.

    Portability

    GNU Prolog predicates.

    7.16.4  seen/0, told/0

    Templates
    seen
    told
    Description

    seen closes the current input, and resets it to user_input.

    told closes the current output, and resets it to user_output.

    Errors

    None.

    Portability

    GNU Prolog predicates.

    7.16.5  get0/1, get/1, skip/1

    Templates
    get0(?in_character_code)
    get(?in_character_code)
    skip(+character_code)
    Description

    get0(Code) succeeds if Code unifies with the next character code read from the current input stream. Thus it is equivalent to get_code(Code) (section 7.12.1).

    get(Code) succeeds if Code unifies with the next character code read from the current input stream that is not a layout character.

    skip(Code) skips just past the next character code Code from the current input stream.

    Errors

    See errors for get_code/2 (section 7.12.1).

    Portability

    GNU Prolog predicates.

    7.16.6  put/1, tab/1

    Templates
    put(+character_code)
    tab(+evaluable)
    Description

    put(Code) writes the character whose code is Code onto the current output stream. It is equivalent to put_code(Code) (section 7.12.5).

    tab(N) writes N spaces onto the current output stream. N may be an arithmetic expression.

    Errors

    See errors for put_code/2 (section 7.12.5) and for arithmetic expressions (section 7.6.1).

    Portability

    GNU Prolog predicates.

    7.17  Term expansion

    7.17.1  Definite clause grammars

    Definite clause grammars are a useful notation to express grammar rules. However the ISO reference does not include them, so they should be considered as a system dependent feature. Definite clause grammars are an extension of context-free grammars. A grammar rule is of the form:
    head –> body.
    –> is a predefined infix operator (section 7.14.10).

    Here are some features of definite clause grammars:
    • a non-terminal symbol may be any callable term.

    • a terminal symbol may be any Prolog term and is written as a list. The empty list represents an empty sequence of terminals.

    • a sequence is expressed using the Prolog conjunction operator ((',')/2).

    • the head of a grammar rule consists of a non-terminal optionally followed by a sequence of terminals (i.e. a Prolog list).

    • the body of a grammar rule consists of a sequence of non-terminals, terminals, predicate call, disjunction (using ;/2), if-then (using (->)/2) or cut (using !).

    • a predicate call must be enclosed in curly brackets (using {}/1). This makes it possible to express an extra condition.
    A grammar rule is nothing but a “syntactic sugar” for a Prolog clause. Each grammar rule accepts as input a list of terminals (tokens), parses a prefix of this list and gives as output the rest of this list (possibly enlarged). This rest is generally parsed later. So, each a grammar rule is translated into a Prolog clause that explicitly the manages the list. Two arguments are then added: the input list (Start) and the output list (Stop). For instance:
    p –> q.
    is translated into:
    p(Start, End) :- q(Start, End).
    Extra arguments can be provided and the body of the rule can contain several non-terminals. Example:
    p(X, Y) -->
            q(X),
            r(X, Y),
            s(Y).
    
    is translated into:
    p(X, Y, Start, End) :-
            q(X, Start, A),
            r(X, Y, A, B),
            s(Y, B, End).
    
    Terminals are translated using unification:
    assign(X,Y) –> left(X), [:=], right(Y), [;].
    is translated into:
    assign(X,Y,Start,End) :-
            left(X, Start, A),
            A=[:=|B],
            right(Y, B, C),
            C=[;|End].
    
    Terminals appearing on the left-hand side of a rule are connected to the output argument of the head.

    It is possible to include a call to a prolog predicate enclosing it in curly brackets (to distinguish them from non-terminals):
    assign(X,Y) –> left(X), [:=], right(Y0), {Y is Y0 }, [;].
    is translated into:
    assign(X,Y,Start,End) :-
            left(X, Start, A),
            A=[:=|B],
            right(Y0, B, C),
            Y is Y0,
            C=[;|End].
    
    Cut, disjunction and if-then(-else) are translated literally (and do not need to be enclosed in curly brackets).

    7.17.2  expand_term/2, term_expansion/2

    Templates
    expand_term(?term, ?term)
    term_expansion(?term, ?term)
    Description

    expand_term(Term1, Term2) succeeds if Term2 is a transformation of Term1. The transformation steps are as follows:
    • if Term1 is a variable, it is unified with Term2

    • if term_expansion(Term1, Term2) succeeds Term2 is assumed to be the transformation of Term1.

    • if Term1 is a DCG then Term2 is its translation (section 7.17.1).

    • otherwise Term2 is unified with Term1.
    term_expansion(Term1, Term2) is a hook predicate allowing the user to define a specific transformation.

    The GNU Prolog compiler (section 3.4) automatically calls expand_term/2 on each Term1 read in. However, in the current release, only DCG transformation are done by the compiler (i.e. term_expansion/2 cannot be used). To use term_expansion/2, it is necessary to call expand_term/2 explicitly.

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.17.3  phrase/3, phrase/2

    Templates
    phrase(?term, ?list, ?list)
    phrase(?term, ?list)
    Description

    phrase(Phrase, List, Remainder) succeeds if the list List is in the language defined by the grammar rule body Phrase. Remainder is what remains of the list after a phrase has been found.

    phrase(Phrase, List) is equivalent to phrase(Phrase, List, []).

    Errors
    List is neither a list nor a partial list    type_error(list, List)
    Remainder is neither a list nor a partial list    type_error(list, Remainder)

    Portability

    GNU Prolog predicates.

    7.18  Logic, control and exceptions

    7.18.1  abort/0, stop/0, top_level/0, break/0, halt/1, halt/0

    Templates
    abort
    stop
    top_level
    break
    halt(+integer)
    halt
    Description

    abort aborts the current execution. If this execution was initiated under a top-level the control is given back to the top-level and the message {execution aborted} is displayed. Otherwise, e.g. execution started by a initialization/1 directive (section 6.1.13), abort/0 is equivalent to halt(1) (see below).

    stop stops the current execution. If this execution was initiated under a top-level the control is given back to the top-level. Otherwise, stop/0 is equivalent to halt(0) (see below).

    top_level starts a new recursive top-level (including the banner display). To end this new top-level simply type the end-of-file key sequence (Ctl-D) or its term representation: end_of_file.

    break invokes a recursive top-level (no banner is displayed). To end this new level simply type the end-of-file key sequence (Ctl-D) or its term representation: end_of_file.

    halt(Status) causes the GNU Prolog process to immediately exit back to the shell with the return code Status.

    halt is equivalent to halt(0).

    Errors
    Status is a variable    instantiation_error
    Status is neither a variable nor an integer    type_error(integer, Status)

    Portability

    halt/1 and halt/0 are ISO predicates. abort/0, stop/0, top_level/0 and break/0 are GNU Prolog predicates.

    7.18.2  once/1, (\+)/1 - not provable, call/2-11, call_with_args/1-11, call_det/2

    Templates
    once(+callable_term)
    \+(+callable_term)
    call(+callable_term, +term,..., +term)
    call_with_args(+atom, +term,..., +term)
    call_det(+callable_term, ?boolean)
    Description

    once(Goal) succeeds if call(Goal) succeeds. However once/1 is not re-executable on backtracking since all alternatives of Goal are cut. once(Goal) is equivalent to call(Goal), !.

    \+ Goal
    succeeds if call(Goal) fails and fails otherwise. This built-in predicate gives negation by failure.

    call(Closure, Arg1,..., ArgN) calls the goal call(Goal) where Goal is constructed by appending Arg1,..., ArgN (1 ≤ N ≤ 10) additional arguments to the arguments (if any) of Closure.

    call_with_args(Functor, Arg1,..., ArgN) calls the goal whose functor is Functor and whose arguments are Arg1,..., ArgN (0 ≤ N ≤ 10).

    call_det(Goal, Deterministic) succeeds if call(Goal) succeeds and unifies Deterministic with true if Goal has not created any choice-points, with false otherwise.

    \+
    is a predefined prefix operator (section 7.14.10).

    Errors
    Goal is a variable    instantiation_error
    Goal is neither a variable nor a callable term    type_error(callable, Goal)
    The predicate indicator Pred of Goal does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)
    Functor is a variable    instantiation_error
    Functor is neither a variable nor an atom    type_error(atom, Functor)
    Deterministic is neither a variable nor a boolean    type_error(boolean, Deterministic)
    for call/2-11 the resulting arity of Goal (arity of Closure + N) is an integer > max_arity flag (section 7.22.1)    representation_error(max_arity)

    Portability

    once/1 and (\+)/1 are ISO predicates, call/2-11, call_with_args/1-11 and call_det/2 are GNU Prolog predicates.

    7.18.3  repeat/0

    Templates
    repeat
    Description

    repeat generates an infinite sequence of backtracking choices. The purpose is to repeatedly perform some action on elements which are somehow generated, e.g. by reading them from a stream, until some test becomes true. Repeat loops cannot contribute to the logic of the program. They are only meaningful if the action involves side-effects. The only reason for using repeat loops instead of a more natural tail-recursive formulation is efficiency: when the test fails back, the Prolog engine immediately reclaims any working storage consumed since the call to repeat/0.

    Errors

    None.

    Portability

    ISO predicate.

    7.18.4  for/3

    Templates
    for(?integer, +integer, +integer)
    Description

    for(Counter, Lower, Upper) generates an sequence of backtracking choices instantiating Counter to the values Lower, Lower+1,..., Upper.

    Errors
    Counter is neither a variable nor an integer    type_error(integer, Counter)
    Lower is a variable    instantiation_error
    Lower is neither a variable nor an integer    type_error(integer, Lower)
    Upper is a variable    instantiation_error
    Upper is neither a variable nor an integer    type_error(integer, Upper)

    Portability

    GNU Prolog predicate.

    7.19  Atomic term processing

    These built-in predicates enable atomic terms to be processed as a sequence of characters and character codes. Facilities exist to split and join atoms, to convert a single character to and from the corresponding character code, and to convert a number to and from a list of characters and character codes.

    7.19.1  atom_length/2

    Templates
    atom_length(+atom, ?integer)
    Description

    atom_length(Atom, Length) succeeds if Length unifies with the number of characters of the name of Atom.

    Errors
    Atom is a variable    instantiation_error
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    Length is neither a variable nor an integer    type_error(integer, Length)
    Length is an integer < 0    domain_error(not_less_than_zero, Length)

    Portability

    ISO predicate.

    7.19.2  atom_concat/3

    Templates
    atom_concat(+atom, +atom, ?atom)
    atom_concat(?atom, ?atom, +atom)
    Description

    atom_concat(Atom1, Atom2, Atom12) succeeds if the name of Atom12 is the concatenation of the name of Atom1 with the name of Atom1. This predicate is re-executable on backtracking (e.g. if Atom12 is instantiated and both Atom1 and Atom2 are variables).

    Errors
    Atom1 and Atom12 are variables    instantiation_error
    Atom2 and Atom12 are variables    instantiation_error
    Atom1 is neither a variable nor an atom    type_error(atom, Atom1)
    Atom2 is neither a variable nor an atom    type_error(atom, Atom2)
    Atom12 is neither a variable nor an atom    type_error(atom, Atom12)

    Portability

    ISO predicate.

    7.19.3  sub_atom/5

    Templates
    sub_atom(+atom, ?integer, ?integer, ?integer, ?atom)
    Description

    sub_atom(Atom, Before, Length, After, SubAtom) succeeds if atom Atom can be split into three atoms, AtomL, SubAtom and AtomR such that Before is the number of characters of the name of AtomL, Length is the number of characters of the name of SubAtom and After is the number of characters of the name of AtomR. This predicate is re-executable on backtracking.

    Errors
    Atom is a variable    instantiation_error
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    SubAtom is neither a variable nor an atom    type_error(atom, SubAtom)
    Before is neither a variable nor an integer    type_error(integer, Before)
    Length is neither a variable nor an integer    type_error(integer, Length)
    After is neither a variable nor an integer    type_error(integer, After)
    Before is an integer < 0    domain_error(not_less_than_zero, Before)
    Length is an integer < 0    domain_error(not_less_than_zero, Length)
    After is an integer < 0    domain_error(not_less_than_zero, After)

    Portability

    ISO predicate.

    7.19.4  char_code/2

    Templates
    char_code(+character, ?character_code)
    char_code(-character, +character_code)
    Description

    char_code(Char, Code) succeeds if the character code for the one-char atom Char is Code.

    Errors
    Char and Code are variables    instantiation_error
    Char is neither a variable nor a one-char atom    type_error(character, Char)
    Code is neither a variable nor an integer    type_error(integer, Code)
    Code is an integer but not a character code    representation_error(character_code)

    Portability

    ISO predicate.

    7.19.5  lower_upper/2

    Templates
    lower_upper(+character, ?character)
    lower_upper(-character, +character)
    Description

    lower_upper(Char1, Char2) succeeds if Char1 and Char2 are one-char atoms and if Char2 is the upper conversion of Char1. If Char1 (resp. Char2) is a character that is not a lower (resp. upper) letter then Char2 is equal to Char1.

    Errors
    Char1 and Char2 are variables    instantiation_error
    Char1 is neither a variable nor a one-char atom    type_error(character, Char1)
    Char2 is neither a variable nor a one-char atom    type_error(character, Char2)

    Portability

    GNU Prolog predicate.

    7.19.6  atom_chars/2, atom_codes/2

    Templates
    atom_chars(+atom, ?character_list)
    atom_chars(-atom, +character_list)
    atom_codes(+atom, ?character_code_list)
    atom_codes(-atom, +character_code_list)
    Description

    atom_chars(Atom, Chars) succeeds if Chars is the list of one-char atoms whose names are the successive characters of the name of Atom.

    atom_codes(Atom, Codes) is similar to atom_chars/2 but deals with a list of character codes.

    Errors
    Atom is a variable and Chars (or Codes) is a partial list or a list with an element which is a variable    instantiation_error
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    Chars is neither a list nor a partial list    type_error(list, Chars)
    Codes is neither a list nor a partial list    type_error(list, Codes)
    Atom is a variable and an element E of the list Chars is neither a variable nor a one-char atom    type_error(character, E)
    Atom is a variable and an element E of the list Codes is neither a variable nor an integer    type_error(integer, E)
    Atom is a variable and an element E of the list Codes is an integer but not a character code    representation_error(character_code)

    Portability

    ISO predicates. The ISO reference only causes a type_error(list, Chars) if Atom is a variable and Chars is neither a list nor a partial list. GNU Prolog always checks if Chars is a list. Similarly for Codes. The type_error(integer, E) when an element E of the Codes is not an integer is a GNU Prolog extension. This seems to be an omission in the ISO reference since this error is detected for many other built-in predicates accepting a character code (e.g. char_code/2, put_code/2).

    7.19.7  number_atom/2, number_chars/2, number_codes/2

    Templates
    number_atom(+number, ?atom)
    number_atom(-number, +atom)
    number_chars(+number, ?character_list)
    number_chars(-number, +character_list)
    number_codes(+number, ?character_code_list)
    number_codes(-number, +character_code_list)
    Description

    number_atom(Number, Atom) succeeds if Atom is an atom whose name corresponds to the characters of Number.

    number_chars(Number, Chars) is similar to number_atom/2 but deals with a list of character codes.

    number_codes(Number, Codes) is similar to number_atom/2 but deals with a list of characters.

    Errors
    Number and Atom are variables    instantiation_error
    Number is a variable and Chars (or Codes) is a partial list or a list with an element which is a variable    instantiation_error
    Number is neither a variable nor an number    type_error(number, Number)
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    Number is a variable and Chars is neither a list nor a partial list    type_error(list, Chars)
    Number is a variable and Codes is neither a list nor a partial list    type_error(list, Codes)
    Number is a variable and an element E of the list Chars is neither a variable nor a one-char atom    type_error(character, E)
    Number is a variable and an element E of the list Codes is neither a variable nor an integer    type_error(integer, E)
    Number is a variable and an element E of the list Codes is an integer but not a character code    representation_error(character_code)
    Number is a variable, Atom (or Chars or Codes) cannot be parsed as a number and the value of the syntax_error Prolog flag is error (section 7.22.1)    syntax_error(atom explaining the error)

    Portability

    number_atom/2 is a GNU Prolog predicate. number_chars/2 and number_codes/2 are ISO predicates.

    GNU Prolog only raises an error about an element E of the Chars (or Codes) list when Number is a variable while the ISO reference always check this. This seems an error since the list itself is only checked if Number is a variable.

    The type_error(integer, E) when an element E of the Codes is not an integer is a GNU Prolog extension. This seems to be an omission in the ISO reference since this error is detected for many other built-in predicates accepting a character code (e.g. char_code/2, put_code/2).

    7.19.8  name/2

    Templates
    name(+atomic, ?character_code_list)
    name(-atomic, +character_code_list)
    Description

    name(Constant, Codes) succeeds if Codes is a list whose elements are the character codes corresponding to the successive characters of Constant (a number or an atom). However, there atoms are for which name(Constant, Codes) is true, but which will not be constructed if name/2 is called with Constant uninstantiated, e.g. the atom '1024'. For this reason the use of name/2 is discouraged and should be limited to compatibility purposes. It is preferable to use atom_codes/2 (section 7.19.6) or number_chars/2 (section 7.19.7).

    Errors
    Constant is a variable and Codes is a partial list or a list with an element which is a variable    instantiation_error
    Constant is neither a variable nor an atomic term    type_error(atomic, Constant)
    Constant is a variable and Codes is neither a list nor a partial list    type_error(list, Codes)
    Constant is a variable and an element E of the list Codes is neither a variable nor an integer    type_error(integer, E)
    Constant is a variable and an element E of the list Codes is an integer but not a character code    representation_error(character_code)

    Portability

    GNU Prolog predicate.

    7.19.9  atom_hash/2

    Templates
    atom_hash(+atom, ?integer)
    atom_hash(?atom, +integer)
    Description

    atom_hash(Atom, Hash) succeeds if Hash is the internal key associated with Atom (an existing atom). The internal key of an atom is a unique integer ≥ 0 and < to the max_atom Prolog flag (section 7.22.1).

    Errors
    Atom and Hash are both variables    instantiation_error
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    Hash is neither a variable nor an integer    type_error(integer, Hash)
    Hash is an integer < 0    domain_error(not_less_than_zero, Hash)

    Portability

    GNU Prolog predicate.

    7.19.10  new_atom/3, new_atom/2, new_atom/1

    Templates
    new_atom(+atom, +integer, -atom)
    new_atom(+atom, -atom)
    new_atom(-atom)
    Description

    new_atom(Prefix, Hash, Atom) unifies Atom with a new atom whose name begins with the characters of the name of Prefix and whose internal key is Hash (section 7.19.9). This predicate is then a symbol generator. It is guaranteed that Atom does not exist before the invocation of new_atom/3. The characters appended to Prefix to form Atom are in: A-Z (capital letter), a-z (small letter), 0-9 (digit), #, $, &, _, @.

    new_atom/2 is similar to new_atom/3, but the atom generated can have any (free) internal key.

    new_atom/1 is similar to new_atom(atom_, Atom), i.e. the generated atom begins with atom_.

    Errors
    Prefix is a variable    instantiation_error
    Hash is a variable    instantiation_error
    Prefix is neither a variable nor an atom    type_error(atom, Prefix)
    Hash is neither a variable nor an integer    type_error(integer, Hash)
    Hash is an integer < 0    domain_error(not_less_than_zero, Hash)
    Atom is not a variable    type_error(variable, Atom)

    Portability

    GNU Prolog predicate.

    7.19.11  current_atom/1

    Templates
    current_atom(?atom)
    Description

    current_atom(Atom) succeeds if there exists an atom that unifies with Atom. All atoms are found except those beginning with a '$' (system atoms). This predicate is re-executable on backtracking.

    Errors
    Atom is neither a variable nor an atom    type_error(atom, Atom)

    Portability

    GNU Prolog predicate.

    7.19.12  atom_property/2

    Templates
    atom_property(?atom, ?atom_property)
    Description

    atom_property(Atom, Property) succeeds if current_atom(Atom) succeeds (section 7.19.11) and if Property unifies with one of the properties of the atom. This predicate is re-executable on backtracking.

    Atom properties:
    • length(Length): Length is the length of the name of the atom.

    • hash(Hash): Hash is the internal key of the atom (section 7.19.9).

    • prefix_op: if there is a prefix operator currently defined with this name.

    • infix_op: if there is an infix operator currently defined with this name.

    • postfix_op: if there is a postfix operator currently defined with this name.

    • needs_quotes: if the atom must be quoted to be read later.

    • needs_scan: if the atom must be scanned when output to be read later (e.g. contains special characters that must be output with a \ escape sequence).
    Errors
    Atom is neither a variable nor an atom    type_error(atom, Atom)
    Property is neither a variable nor a n atom property term    domain_error(atom_property, Property)
    Property = length(E) or hash(E) and E is neither a variable nor an integer    type_error(integer, E)

    Portability

    GNU Prolog predicate.

    7.20  List processing

    These predicates manipulate lists. They are bootstrapped predicates (i.e. written in Prolog) and no error cases are tested (for the moment). However, since they are written in Prolog using other built-in predicates, some errors can occur due to those built-in predicates.

    7.20.1  append/3

    Templates
    append(?list, ?list, ?list)
    Description

    append(List1, List2, List12) succeeds if the concatenation of the list List1 and the list List2 is the list List12. This predicate is re-executable on backtracking (e.g. if List12 is instantiated and both List1 and List2 are variable).

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.20.2  member/2, memberchk/2

    Templates
    member(?term, ?list)
    memberchk(?term, ?list)
    Description

    member(Element, List) succeeds if Element belongs to the List. This predicate is re-executable on backtracking and can be thus used to enumerate the elements of List.

    memberchk/2 is similar to member/2 but only succeeds once.

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.20.3  reverse/2

    Templates
    reverse(?list, ?list)
    Description

    reverse(List1, List2) succeeds if List2 unifies with the list List1 in reverse order.

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.20.4  delete/3, select/3

    Templates
    delete(?list, ?term, ?list)
    select(?term, ?list, ?list)
    Description

    delete(List1, Element, List2) removes all occurrences of Element in List1 to provide List2. A strict term equality is required, cf. (==)/2 (section 7.3.2).

    select(Element, List1, List2) removes one occurrence of Element in List1 to provide List2. This predicate is re-executable on backtracking.

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.20.5  permutation/2

    Templates
    permutation(?list, ?list)
    Description

    permutation(List1, List2) succeeds if List2 is a permutation of the elements of List1. This predicate is re-executable on backtracking.

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.20.6  prefix/2, suffix/2

    Templates
    prefix(?list, ?list)
    suffix(?list, ?list)
    Description

    prefix(Prefix, List) succeeds if Prefix is a prefix of List. This predicate is re-executable on backtracking.

    suffix(Suffix, List) succeeds if Suffix is a suffix of List. This predicate is re-executable on backtracking.

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.20.7  sublist/2

    Templates
    sublist(?list, ?list)
    Description

    sublist(List1, List2) succeeds if List1 is a sub-list of List2. This predicate is re-executable on backtracking.

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.20.8  last/2

    Templates
    last(?list, ?term)
    Description

    last(List, Element) succeeds if Element is the last element of List.

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.20.9  length/2

    Templates
    length(?list, ?integer)
    Description

    length(List, Length) succeeds if Length is the length of List.

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.20.10  nth/3

    Templates
    nth(?integer, ?list, ?term)
    Description

    nth(N, List, Element) succeeds if the Nth argument of List is Element.

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.20.11  max_list/2, min_list/2, sum_list/2

    Templates
    min_list(+list, ?number)
    max_list(+list, ?number)
    sum_list(+list, ?number)
    Description

    min_list(List, Min) succeeds if Min is the smallest number in List.

    max_list(List, Max) succeeds if Max is the largest number in List.

    sum_list(List, Sum) succeeds if Sum is the sum of all the elements in List.

    List must be a list of arithmetic evaluable terms (section 7.6.1).

    Errors

    None.

    Portability

    GNU Prolog predicate.

    7.20.12  sort/2, sort0/2, keysort/2 sort/1, sort0/1, keysort/1

    Templates
    sort(+list, ?list)
    sort0(+list, ?list)
    keysort(+list, ?list)
    sort(+list)
    sort0(+list)
    keysort(+list)
    Description

    sort(List1, List2) succeeds if List2 is the sorted list corresponding to List1 where duplicate elements are merged.

    sort0/2 is similar to sort/2 except that duplicate elements are not merged.

    keysort(List1, List2) succeeds if List2 is the sorted list of List1 according to the keys. The list List1 consists of items of the form Key-Value. These items are sorted according to the value of Key yielding the List2. Duplicate keys are not merged. This predicate is stable, i.e. if K-A occurs before K-B in the input, then K-A will occur before K-B in the output.

    sort/1, sort0/1 and keysort/1 are similar to sort/2, sort0/2 and keysort/2 but achieve a sort in-place destructing the original List1 (this in-place assignment is not undone at backtracking). The sorted list occupies the same memory space as the original list (saving thus memory consumption).

    The time complexity of these sorts is O(N log N), N being the length of the list to sort.

    These predicates refer to the standard ordering of terms (section 7.3.1).

    Errors
    List1 is a partial list    instantiation_error
    List1 is neither a partial list nor a list    type_error(list, List1)
    List2 is neither a partial list nor a list    type_error(list, List2)

    Portability

    GNU Prolog predicates.

    7.21  Global variables

    7.21.1  Introduction

    GNU Prolog provides a simple and powerful way to assign and read global variables. A global variable is associated with each atom, its initial value is the integer 0. A global variable can store 3 kinds of objects:
    • a copy of a term (the assignment can be made backtrackable or not).

    • a link to a term (the assignment is always backtrackable).

    • an array of objects (recursively).
    The space necessary for copies and arrays is dynamically allocated and recovered as soon as possible. For instance, when an atom is associated with a global variable whose current value is an array, the space for this array is recovered (unless the assignment is to be undone when backtracking occurs).

    When a link to a term is associated with a global variable, the reference to this term is stored and thus the original term is returned when the content of the variable is read.

    Global variable naming convention: a global variable is referenced by an atom.

    If the variable contains an array, an index (ranging from 0) can be provided using a compound term whose principal functor is the correponding atom and the argument is the index. In case of a multi-dimensional array, each index is given as the arguments of the compound term.

    If the variable contains a term (link or copy), it is possible to only reference a sub-term by giving its argument number (also called argument selector). Such a sub-term is specified using a compound term whose principal functor is -/2 and whose first argument is a global variable name and the second argument is the argument number (from 1). This can be applied recursively to specify a sub-term of any depth. In case of a list, a argument number I represents the Ith element of the list. In the rest of this section we use the operator notation since - is a predefined infix operator (section 7.14.10).

    In the following, GVarName represents a reference to a global variable and its syntax is as follows:
    GVarName ::= atom whole content of a variable
        atom(Integer,...,Integer) element of an array
        GVarName-Integer sub-term selection
    Integer ::= integer immediate value
        GVarName indirect value
    When a GVarName is used as an index or an argument number (i.e. indirection), the value of this variable must be an integer.

    Here are some examples of the naming convention:
    a the content of variable associated with a (any kind)
    t(1) the 2nd element of the array associated with t
    t(k) if the value associated with k is I, the Ith element of the array associated with t
    a-1-2 if the value associated with a is f(g(a,b,c),2), the sub-term b

    Here are the errors associated with global variable names and common to all predicates.
    GVarName is a variable    instantiation_error
    GVarName is neither a variable nor a callable term    type_error(callable, GVarName)
    GVarName contains an invalid argument number (or GVarName is an array)    domain_error(g_argument_selector, GVarName)
    GVarName contains an invalid index (or GVarName is not an array)    domain_error(g_array_index, GVarName)
    GVarName is used as an indirect index or argument selector and is not an integer    type_error(integer, GVarName)

    Arrays: the predicates g_assign/2, g_assignb/2 and g_link/2 (section 7.21.2) can be used to create an array. They recognize some terms as values. For instance, a compound term with principal functor g_array is used to define an array of fixed size. There are 3 forms for the term g_array:
    • g_array(Size): if Size is an integer > 0 then defines an array of Size elements which are all initialized with the integer 0.

    • g_array(Size, Initial): as above but the elements are initialized with the term Initial instead of 0. Initial can contain other array definitions allowing thus for multi-dimensional arrays.

    • g_array(List): as above if List is a list of length Size except that the elements of the array are initialized according to the elements of List (which can contain other array definitions).
    An array can be extended explicitely using a compound term with principal functor g_array_extend which accept the same 3 forms detailed above. In that case, the existing elements of the array are not initialized. If g_array_extend is used with an object which is not an array it is similar to g_array.

    Finally, an array can be automatically expanded when needed. The programmer does not need to explicitely control the expansion of an automatic array. An array is expanded as soon as an index is outside the current size of this array. Such an array is defined using a compound term with principal functor g_array_auto:
    • g_array_auto(Size): if Size is an integer > 0 then defines an automatic array whose initial size is Size. All elements are initialized with the integer 0. Elements created during implicit expansions will be initialized with 0.

    • g_array_auto(Size, Initial): as above but the elements are initialized with the term Initial instead of 0. Initial can contain other array definitions allowing thus for multi-dimensional arrays. Elements created during implicit expansions will be initialized with Initial.

    • g_array_auto(List): as above if List is a list of length Size except that the elements of the array are initialized according to the elements of List (which can contain other array definitions). Elements created during implicit expansions will be initialized with 0.
    In any case, when an array is read, a term of the form g_array([Elem0,..., ElemSize-1]) is returned.

    Some examples using global variables are presented later (section 7.21.7).

    7.21.2  g_assign/2, g_assignb/2, g_link/2

    Templates
    g_assign(+callable_term, ?term)
    g_assignb(+callable_term, ?term)
    g_link(+callable_term, ?term)
    Description

    g_assign(GVarName, Value) assigns a copy of the term Value to GVarName. This assignment is not undone when backtracking occurs.

    g_assignb/2 is similar to g_assign/2 but the assignment is undone at backtracking.

    g_link(GVarName, Value) makes a link between GVarName to the term Value. This allows the user to give a name to any Prolog term (in particular non-ground terms). Such an assignment is always undone when backtracking occurs (since the term may no longer exist). If Value is an atom or an integer, g_link/2 and g_assignb/2 have the same behavior. Since g_link/2 only handles links to existing terms it does not require extra memory space and is not expensive in terms of execution time.

    NB: argument selectors can only be used with g_assign/2 (i.e. when using an argument selector inside an assignment, this one must not be backtrackable).

    Errors

    See common errors detailed in the introduction (section 7.21.1)
    GVarName contains an argument selector and the assignment is backtrackable    domain_error(g_argument_selector, GVarName)

    Portability

    GNU Prolog predicates.

    7.21.3  g_read/2

    Templates
    g_read(+callable_term, ?term)
    Description

    g_read(GVarName, Value) unifies Value with the term assigned to GVarName.

    Errors

    See common errors detailed in the introduction (section 7.21.1)

    Portability

    GNU Prolog predicate.

    7.21.4  g_array_size/2

    Templates
    g_array_size(+callable_term, ?integer)
    Description

    g_array_size(GVarName, Value) unifies Size with the dimension (an integer > 0) of the array assigned to GVarName. Fails if GVarName is not an array.

    Errors

    See common errors detailed in the introduction (section 7.21.1)
    Size is neither a variable nor an integer    type_error(integer, Size)

    Portability

    GNU Prolog predicate.

    7.21.5  g_inc/3, g_inc/2, g_inco/2, g_inc/1, g_dec/3, g_dec/2, g_deco/2, g_dec/1

    Templates
    g_inc(+callable_term, ?integer, ?integer)
    g_inc(+callable_term, ?integer)
    g_inco(+callable_term, ?integer)
    g_inc(+callable_term)
    g_dec(+callable_term, ?integer, ?integer)
    g_dec(+callable_term, ?integer)
    g_deco(+callable_term, ?integer)
    g_dec(+callable_term)
    Description

    g_inc(GVarName, Old, New) unifies Old with the integer assigned to GVarName, increments GVarName and then unifies New with the incremented value.

    g_inc(GVarName, New) is equivalent to g_inc(GVarName, _, New).

    g_inco(GVarName, Old) is equivalent to g_inc(GVarName, Old, _).

    g_inc(GVarName) is equivalent to g_inc(GVarName, _, _).

    Predicates g_dec are similar but decrement the content of GVarName instead.

    Errors

    See common errors detailed in the introduction (section 7.21.1)
    Old is neither a variable nor an integer    type_error(integer, Old)
    New is neither a variable nor an integer    type_error(integer, New)
    GVarName stores an array    type_error(integer, g_array)
    GVarName stores a term T which is not an integer    type_error(integer, T)

    Portability

    GNU Prolog predicates.

    7.21.6  g_set_bit/2, g_reset_bit/2, g_test_set_bit/2, g_test_reset_bit/2

    Templates
    g_set_bit(+callable_term, +integer)
    g_reset_bit(+callable_term, +integer)
    g_test_set_bit(+callable_term, +integer)
    g_test_reset_bit(+callable_term, +integer)
    Description

    g_set_bit(GVarName, Bit) sets to 1 the bit number specified by Bit of the integer assigned to GVarName to 1. Bit numbers range from 0 to the maximum number allowed for integers (this is architecture dependent). If Bit is greater than this limit, the modulo with this limit is taken.

    g_reset_bit(GVarName, Bit) is similar to g_set_bit/2 but sets the specified bit to 0.

    g_test_set_bit/2 succeeds if the specified bit is set to 1.

    g_test_reset_bit/2 succeeds if the specified bit is set to 0.

    Errors

    See common errors detailed in the introduction (section 7.21.1)
    Bit is a variable    instantiation_error
    Bit is neither a variable nor an integer    type_error(integer, Bit)
    Bit is an integer < 0    domain_error(not_less_than_zero, Bit)
    GVarName stores an array    type_error(integer, g_array)
    GVarName stores a term T which is not an integer    type_error(integer, T)

    Portability

    GNU Prolog predicates.

    7.21.7  Examples

    Simulating g_inc/3: this predicate behaves like: global variable:
    my_g_inc(Var, Old, New) :-
            g_read(Var, Old),
            N is Value + 1,
            g_assign(Var, X),
     New = N.
    
    The query: my_g_inc(c, X, _) will succeed unifying X with 0, another call to my_g_inc(a, Y, _) will then unify Y with 1, and so on.

    Difference between g_assign/2 and g_assignb/2: g_assign/2 does not undo its assignment when backtracking occurs whereas g_assignb/2 undoes it.
    test(Old) :-    testb(Old) :-
            g_assign(x,1),            g_assign(x,1),
            (   g_read(x, Old),            (   g_read(x, Old),
                g_assign(x, 2)                g_assignb(x, 2)
            ;   g_read(x, Old),            ;   g_read(x, Old),
                g_assign(x, 3)                g_assign(x, 3)
            ).            ).
    The query test(Old) will succeed unifying Old with 1 and on backtracking with 2 (i.e. the assignment of the value 2 has not been undone). The query testb(Old) will succeed unifying Old with 1 and on backtracking with 1 (i.e. the assignment of the value 2 has been undone).

    Difference between g_assign/2 and g_link/2: g_assign/2 (and g_assignb/2) creates a copy of the term whereas g_link/2 does not. g_link/2 can be used to avoid passing big data structures (e.g. dictionaries,...) as arguments to predicates.
    test(B) :-    test(B) :-
            g_assign(b, f(X)),            g_link(b, f(X)),
            X = 12,            X = 12,
            g_read(b, B).            g_read(b, B).
    The query test(B) will succeed unifying B with f(_) (g_assign/2 assigns a copy of the value). The query testl(B) will succeed unifying B with f(12) (g_link/2 assigns a pointer to the term).

    Simple array definition: here are some queries to show how arrays can be handled:
    | ?- g_assign(w, g_array(3)), g_read(w, X).
    
    X = g_array([0,0,0])
    
    | ?- g_assign(w(0), 16), g_assign(w(1), 32), g_assign(w(2), 64), g_read(w, X).
    
    X = g_array([16,32,64])
    
    this is equivalent to:
    | ?- g_assign(k, g_array([16,32,64])), g_read(k, X).
    
    X = g_array([16,32,64])
    
    | ?- g_assign(k, g_array(3,null)), g_read(k, X), g_array_size(k, S).
    
    S = 3
    X = g_array([null,null,null])
    
    2-D array definition:
    | ?- g_assign(w, g_array(2, g_array(3))), g_read(w, X).
    
    X = g_array([g_array([0,0,0]),g_array([0,0,0])])
    
    | ?- (   for(I,0,1), for(J,0,2), K is I*3+J, g_assign(w(I,J), K),
             fail
         ;   g_read(w, X)
         ).
    
    X = g_array([g_array([0,1,2]),g_array([3,4,5])])
    
    | ?- g_read(w(1),X).
    
    X = g_array([3,4,5])
    
    Hybrid array:
    | ?- g_assign(w,g_array([1,2,g_array([a,b,c]), g_array(2,z),5])), g_read(w, X).
    
    X = g_array([1,2,g_array([a,b,c]), g_array([z,z]),5])
    
    | ?- g_read(w(1), X), g_read(w(2,1), Y), g_read(w(3,1), Z).
    
    X = 2
    Y = b
    Z = z
    
    | ?- g_read(w(1,2),X).
    uncaught exception: error(domain_error(g_array_index,w(1,2)),g_read/2)
    
    Array extension:
    | ?- g_assign(a, g_array([10,20,30])), g_read(a, X).
    
    X = g_array([10,20,30])
    
    | ?- g_assign(a, g_array_extend(5,null)), g_read(a, X).
    
    X = g_array([10,20,30,null,null])
    
    | ?- g_assign(a, g_array([10,20,30])), g_read(a, X).
    
    X = g_array([10,20,30])
    
    | ?- g_assign(a, g_array_extend([1,2,3,4,5,6])), g_read(a, X).
    
    X = g_array([10,20,30,4,5,6])
    
    Automatic array:
    | ?- g_assign(t, g_array_auto(3)), g_assign(t(1), foo), g_read(t,X).
    
    X = g_array([0,foo,0])
    
    | ?- g_assign(t(5), bar), g_read(t,X).                              
    
    X = g_array([0,foo,0,0,0,bar,0,0])
    
    | ?- g_assign(t, g_array_auto(2, g_array(2))), g_assign(t(1,1), foo), 
         g_read(t,X).
    
    X = g_array([g_array([0,0]),g_array([0,foo])])
    
    | ?- g_assign(t(3,0), bar), g_read(t,X).
    
    X = g_array([g_array([0,0]),g_array([0,foo]),g_array([0,0]),g_array([bar,0])])
    
    | ?- g_assign(t(3,4), bar), g_read(t,X).
    uncaught exception: error(domain_error(g_array_index,t(3,4)),g_assign/2)
    
    | ?- g_assign(t, g_array_auto(2, g_array_auto(2))), g_assign(t(1,1), foo), 
         g_read(t,X).
    
    X = g_array([g_array([0,0]),g_array([0,foo])])
    
    | ?- g_assign(t(3,3), bar), g_read(t,X).
    
    X = g_array([g_array([0,0]),g_array([0,foo]),g_array([0,0]),
        g_array([0,0,0,bar])])
    
    | ?- g_assign(t, g_array_auto(2, g_array_auto(2, null))), g_read(t(2,3), U),
         g_read(t, X).
    
    U = null
    X = g_array([g_array([null,null]),g_array([null,null]),
                 g_array([null,null,null,null]),g_array([null,null])])
    

    7.22  Prolog state

    7.22.1  set_prolog_flag/2

    Templates
    set_prolog_flag(+flag, +term)
    Description

    set_prolog_flag(Flag, Value) sets the value of the Prolog flag Flag to Value.

    Prolog flags: a Prolog flag is an atom which is associated with a value that is either implementation defined or defined by the user. Each flag has a permitted range of values; any other value is a domain_error. The following two tables present available flags, the possible values, a description and if they are ISO or an extension. The first table presents unchangeable flags while the second one the changeable flags. For flags whose default values is machine independent, this value is underlined.

    Unchangeable flags:
    Flag
    Values
    Description
    ISO
    bounded
    true / false
    are integers bounded ?
    Y
    max_integer
    an integer
    greatest integer
    Y
    min_integer
    an integer
    smallest integer
    Y
    integer_rounding_function
    toward_zero
    down
    rnd(X) = integer part of X
    rnd(X) = ⌊X⌋ (section 7.6.1)
    Y
    max_arity
    an integer
    maximum arity for compound terms (255)
    Y
    max_atom
    an integer
    maximum number of atoms
    N
    max_unget
    an integer
    maximum number of successive ungets
    N
    prolog_name
    an atom
    name of the Prolog system
    N
    prolog_version
    an atom
    version number of the Prolog system
    N
    prolog_date
    an atom
    date of the Prolog system
    N
    prolog_copyright
    an atom
    copyright message of the Prolog system
    N

    Changeable flags:
    Flag
    Values
    Description
    ISO
    char_conversion
    on / off
    is character conversion activated ?
    Y
    debug
    on / off
    is the debugger activated ?
    Y
    singleton_warning
    on / off
    warn about named singleton variables ?
    N
    strict_iso
    on / off
    strict ISO behavior ?
    N
     
    double_quotes
     
    atom
    chars
    codes
    atom_no_escape
    chars_no_escape
    codes_no_escape
    a double quoted constant is returned as:
    an atom
    a list of characters
    a list of character codes
    as atom but ignore escape sequences
    as chars but ignore escape sequences
    as code but ignore escape sequences
     
    Y
     
     
    N
     
    back_quotes
     
    atom
    chars
    codes
    atom_no_escape
    chars_no_escape
    codes_no_escape
    a back quoted constant is returned as:
    an atom
    a list of characters
    a list of character codes
    as atom but ignore escape sequences
    as chars but ignore escape sequences
    as code but ignore escape sequences
     
    N
     
    unknown
     
    error
    warning
    fail
    a predicate calls an unknown procedure:
    an existence_error is raised
    a message is displayed then fails
    quietly fails
     
    Y
     
    syntax_error
     
    error
    warning
    fail
    a predicate causes a syntax error:
    a syntax_error is raised
    a message is displayed then fails
    quietly fails
     
    N
     
    os_error
     
    error
    warning
    fail
    a predicate causes an O.S. error:
    a system_error is raised
    a message is displayed then fails
    quietly fails
     
    N

    The strict_iso flag is introduced to allow a compatibility with other Prolog systems. When turned off the following relaxations apply:
    • a callable term can be given as a predicate indicator.

    • built-in predicates are found by current_predicate/1 (section 7.8.1).
    Errors
    Flag is a variable    instantiation_error
    Value is a variable    instantiation_error
    Flag is neither a variable nor an atom    type_error(atom, Flag)
    Flag is an atom but not a valid flag    domain_error(prolog_flag, Flag)
    Value is inappropriate for Flag    domain_error(flag_value, Flag+Value)
    Value is appropriate for Flag but flag Flag is not modifiable    permission_error(modify, flag, Flag)

    Portability

    ISO predicate. All ISO flags are implemented.

    7.22.2  current_prolog_flag/2

    Templates
    current_prolog_flag(?flag, ?term)
    Description

    current_prolog_flag(Flag, Value) succeeds if there exists a Prolog flag that unifies with Flag and whose value unifies with Value. This predicate is re-executable on backtracking.

    Errors
    Flag is neither a variable nor an atom    type_error(atom, Flag)
    Flag is an atom but not a valid flag    domain_error(prolog_flag, Flag)

    Portability

    ISO predicate.

    7.22.3  set_bip_name/2

    Templates
    set_bip_name(+atom, +arity)
    Description

    set_bip_name(Functor, Arity) initializes the context of the error (section 5.3.1) with Functor and Arity (if Arity < 0 only Functor is significant).

    Errors
    Functor is a variable    instantiation_error
    Arity is a variable    instantiation_error
    Functor is neither a variable nor an atom    type_error(atom, Functor)
    Arity is neither a variable nor an integer    type_error(integer, Arity)

    Portability

    GNU Prolog predicate.

    7.22.4  current_bip_name/2

    Templates
    current_bip_name(?atom, ?arity)
    Description

    current_bip_name(Functor, Arity) succeeds if Functor and Arity correspond to the context of the error (section 5.3.1) (if Arity < 0 only Functor is significant).

    Errors
    Functor is neither a variable nor an atom    type_error(atom, Functor)
    Arity is neither a variable nor an integer    type_error(integer, Arity)

    Portability

    GNU Prolog predicate.

    7.22.5  write_pl_state_file/1, read_pl_state_file/1

    Templates
    write_pl_state_file(+source_sink)
    read_pl_state_file(+source_sink)
    Description

    write_pl_state_file(FileName) writes onto FileName all information that influences the parsing of a term (section 7.14). This allows a sub-process written in Prolog to read this file and then process any Prolog term as done by the parent process. This file can also be passed as argument of the –pl-state option when invoking gplc (section 3.4.3). More precisely the following elements are saved:
    • all operator definitions (section 7.14.10).

    • the character conversion table (section 7.14.12).

    • the value of char_conversion, double_quotes, back_quotes and singleton_warning Prolog flags (section 7.22.1).
    read_pl_state_file(FileName) reads (restores) from FileName all information previously saved by write_pl_state_file/1.

    Errors
    FileName is a variable    instantiation_error
    FileName is neither a variable nor an atom    type_error(atom, FileName)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.23  Program state

    7.23.1  consult/1, '.'/2 - program consult

    Templates
    consult(+atom_or_atom_list)
    '.'(+atom, +atom_list)
    Description

    consult(Files) compiles and loads into memory each file of the list Files. Each file is compiled for byte-code using the GNU Prolog compiler (section 3.4) then loaded using load/1 (section 7.23.2). It is possible to specify user as a file name to directly enter the program from the terminal. Files can be also a single file name (i.e. an atom). Refer to the section concerning the consult of a Prolog program for more information (section 3.2.3).

    The final file name of a file is computed using the predicates prolog_file_name/2 (section 7.26.3) and absolute_file_name/2 (section 7.26.1).

    [ File | Files ], i.e. '.'(File, Files) is equivalent to consult([ File | Files ]).

    Errors
    Files is a partial list or a list with an element E which is a variable    instantiation_error
    Files is neither a partial list nor a list nor an atom    type_error(list, Files)
    an element E of the Files list is neither a variable nor an atom    type_error(atom, E)
    an element E of the Files list is an atom but not a valid pathname    domain_error(os_path, E)
    an element E of the Files list is a valid pathname but does not correspond to an existing source    existence_error(source_sink, E)
    an error occurs executing a directive    see call/1 errors (section 6.2.3)

    Portability

    GNU Prolog predicates.

    7.23.2  load/1

    Templates
    load(+atom_or_atom_list)
    Description

    load(Files) loads into memory each file of the list Files. Each file must have been previously compiled for byte-code using the GNU Prolog compiler (section 3.4). Files can be also a single file name (i.e. an atom).

    The final file name of a file is computed using the predicates absolute_file_name/2 (section 7.26.1). If no suffix is given '.wbc' is appended to the file name.

    Errors
    Files is a partial list or a list with an element E which is a variable    instantiation_error
    Files is neither a partial list nor a list nor an atom    type_error(list, Files)
    an element E of the Files list is neither a variable nor an atom    type_error(atom, E)
    an element E of the Files list is an atom but not a valid pathname    domain_error(os_path, E)
    an element E of the Files list is a valid pathname but does not correspond to an existing source    existence_error(source_sink, E)
    an error occurs executing a directive    see call/1 errors (section 6.2.3)

    Portability

    GNU Prolog predicate.

    7.23.3  listing/1, listing/0

    Templates
    listing(+predicate_indicator)
    listing(+atom)
    listing
    Description

    listing(Pred) lists the clauses of the consulted predicate whose predicate indicator is Pred. Pred can also be a single atom in which case all predicates whose name is Pred are listed (of any arity). This predicate uses portray_clause/2 (section 7.14.8) to output the clauses.

    listing lists all clauses of all consulted predicates.

    Errors
    Pred is a variable    instantiation_error
    Pred is neither a variable nor predicate indicator or an atom    type_error(predicate_indicator, Pred)

    Portability

    GNU Prolog predicate.

    7.24  System statistics

    7.24.1  statistics/0, statistics/2

    Templates
    statistics
    statistics(?atom, ?list)
    Description

    statistics displays statistics about memory usage and run times.

    statistics(Key, Value) unifies Value with the current value of the statistics key Key. Value a list of two elements. Times are in milliseconds, sizes of areas in bytes.
    Key Description Value
    user_time user CPU time [SinceStart, SinceLast]
    system_time system CPU time [SinceStart, SinceLast]
    cpu_time total CPU time (user + system) [SinceStart, SinceLast]
    real_time absolute time [SinceStart, SinceLast]
    local_stack local stack sizes (control, environments, choices) [UsedSize, FreeSize]
    global_stack global stack sizes (compound terms) [UsedSize, FreeSize]
    trail_stack trail stack sizes (variable bindings to undo) [UsedSize, FreeSize]
    cstr_stack constraint trail sizes (finite domain constraints) [UsedSize, FreeSize]

    Note that the key runtime is recognized as user_time for compatibility purpose.

    Errors
    Key is neither a variable nor a valid key    domain_error(statistics_key, Key)
    Value is neither a variable nor a list of two elements    domain_error(statistics_value, Value)
    Value is a list of two elements and an element E is neither a variable nor an integer    type_error(integer, E)

    Portability

    GNU Prolog predicates.

    7.24.2  user_time/1, system_time/1, cpu_time/1, real_time/1

    Templates
    user_time(?integer)
    system_time(?integer)
    cpu_time(?integer)
    real_time(?integer)
    Description

    user_time(Time) unifies Time with the user CPU time elapsed since the start of Prolog.

    system_time(Time) unifies Time with the system CPU time elapsed since the start of Prolog.

    cpu_time(Time) unifies Time with the CPU time (user + system) elapsed since the start of Prolog.

    real_time(Time) unifies Time with the absolute time elapsed since the start of Prolog.

    Errors
    Time is neither a variable nor an integer    type_error(integer, Time)

    Portability

    GNU Prolog predicates.

    7.25  Random number generator

    7.25.1  set_seed/1, randomize/0

    Templates
    set_seed(+integer)
    randomize
    Description

    set_seed(Seed) reinitializes the random number generator seed with Seed.

    randomize reinitializes the random number generator. This predicates calls set_seed/1 with a random value depending on the absolute time.

    Errors
    Seed is a variable    instantiation_error
    Seed is neither a variable nor an integer    type_error(integer, Seed)
    Seed is an integer < 0    domain_error(not_less_than_zero, Seed)

    Portability

    GNU Prolog predicates.

    7.25.2  get_seed/1

    Templates
    get_seed(?integer)
    Description

    get_seed(Seed) unifies Seed with the current random number generator seed.

    Errors
    Seed is neither a variable nor an integer    type_error(integer, Seed)
    Seed is an integer < 0    domain_error(not_less_than_zero, Seed)

    Portability

    GNU Prolog predicate.

    7.25.3  random/1

    Templates
    random(-float)
    Description

    random(Number) unifies Number with a random floating point number such that 0.0 ≤ Number < 1.0.

    Errors
    Number is not a variable    type_error(variable, Number)

    Portability

    GNU Prolog predicate.

    7.25.4  random/3

    Templates
    random(+number, +number, -number)
    Description

    random(Base, Max, Number) unifies Number with a random number such that BaseNumber < Max. If both Base and Max are integers Number will be an integer, otherwise Number will be a floating point number.

    Errors
    Base is a variable    instantiation_error
    Base is neither a variable nor a number    type_error(number, Base)
    Max is a variable    instantiation_error
    Max is neither a variable nor a number    type_error(number, Max)
    Number is not a variable    type_error(variable, Number)

    Portability

    GNU Prolog predicate.

    7.26  File name processing

    7.26.1  absolute_file_name/2

    Templates
    absolute_file_name(+atom, atom)
    Description

    absolute_file_name(File1, File2) succeeds if File2 is the absolute pathname associated with the relative file name File1. File1 can contain $VAR_NAME sub-strings. When such a sub-string is encountered, it is expanded with the value of the environment variable whose name is VAR_NAME if exists (otherwise no expansion is done). File1 can also begin with a sub-string ~USER_NAME/, this is expanded as the home directory of the user USER_NAME. If USER_NAME does not exist File1 is an invalid pathname. If no USER_NAME is given (i.e. File1 begins with ~/) the ~ character is expanded as the value of the environment variable HOME. If the HOME variable is not defined File1 is an invalid pathname. Relative references to the current directory (/./ sub-string) and to the parent directory (/../ sub-strings) are removed and no longer appear in File2. File1 is also invalid if it contains too many /../ consecutive sub-strings (i.e. parent directory relative references). Finally if File1 is user then File2 is also unified with user to allow this predicate to be called on Prolog file names (since user in DEC-10 input/output predicates denotes the current input/output stream).

    Most predicates using a file name implicitly call this predicate to obtain the desired file, e.g. open/4.

    Errors
    File1 is a variable    instantiation_error
    File1 is neither a variable nor an atom    type_error(atom, File1)
    File2 is neither a variable nor an atom    type_error(atom, File2)
    File1 is an atom but not a valid pathname    domain_error(os_path, File1)

    Portability

    GNU Prolog predicate.

    7.26.2  decompose_file_name/4

    Templates
    decompose_file_name(+atom, ?atom, ?atom, ?atom)
    Description

    decompose_file_name(File, Directory, Prefix, Suffix) decomposes the pathname File and extracts the Directory part (characters before the last /), the Prefix part (characters after the last / and before the last . or until the end if there is no suffix) and the Suffix part (characters from the last . to the end of the string).

    Errors
    File is a variable    instantiation_error
    File is neither a variable nor an atom    type_error(atom, File)
    Directory is neither a variable nor an atom    type_error(atom, Directory)
    Prefix is neither a variable nor an atom    type_error(atom, Prefix)
    Suffix is neither a variable nor an atom    type_error(atom, Suffix)

    Portability

    GNU Prolog predicate.

    7.26.3  prolog_file_name/2

    Templates
    prolog_file_name(+atom, ?atom)
    Description

    prolog_file_name(File1, File2) unifies File2 with the Prolog file name associated with File1. More precisely File2 is computed as follows:
    • if File1 has a suffix or if it is user then File2 is unified with File1.

    • else if the file whose name is File1 + '.pl' exists then File2 is unified with this name.

    • else if the file whose name is File1 + '.pro' exists then File2 is unified with this name.

    • else File2 is unified with the name File1 + '.pl'.
    This predicate uses absolute_file_name/2 to check the existence of a file (section 7.26.1).

    Errors
    File1 is a variable    instantiation_error
    File1 is neither a variable nor an atom    type_error(atom, File1)
    File2 is neither a variable nor an atom    type_error(atom, File2)
    File1 is an atom but not a valid pathname    domain_error(os_path, File1)

    Portability

    GNU Prolog predicate.

    7.27  Operating system interface

    7.27.1  argument_counter/1

    Templates
    argument_counter(?integer)
    Description

    argument_counter(Counter) succeeds if Counter is the number of arguments of the command-line. Since the first argument is always the name of the running program, Counter is always ≥ 1. See (section 3.2) for more information about command-line arguments retrieved under the top_level.

    Errors
    Counter is neither a variable nor an integer    type_error(integer, Counter)

    Portability

    GNU Prolog predicate.

    7.27.2  argument_value/2

    Templates
    argument_value(+integer, ?atom)
    Description

    argument_value(N, Arg) succeeds if the Nth argument on the command-line unifies with Arg. The first argument is always the name of the running program and its number is 0. The number of arguments on the command-line can be obtained using argument_counter/1 (section 7.27.1).

    Errors
    N is a variable    instantiation_error
    N is neither a variable nor an integer    type_error(integer, N)
    N is an integer < 0    domain_error(not_less_than_zero, N)
    Arg is neither a variable nor an atom    type_error(atom, Arg)

    Portability

    GNU Prolog predicate.

    7.27.3  argument_list/1

    Templates
    argument_list(?list)
    Description

    argument_list(Args) succeeds if Args unifies with the list of atoms associated with each argument on the command-line other than the first argument (the name of the running program).

    Errors
    Args is neither a partial list nor a list    type_error(list, Args)

    Portability

    GNU Prolog predicate.

    7.27.4  environ/2

    Templates
    environ(?atom, ?atom)
    Description

    environ(Name, Value) succeeds if Name is the name of an environment variable whose value is Value. This predicate is re-executable on backtracking.

    Errors
    Name is neither a variable nor an atom    type_error(atom, Name)
    Value is neither a variable nor an atom    type_error(atom, Value)

    Portability

    GNU Prolog predicate.

    7.27.5  make_directory/1, delete_directory/1, change_directory/1

    Templates
    make_directory(+atom)
    delete_directory(+atom)
    change_directory(+atom)
    Description

    make_directory(PathName) creates the directory whose pathname is PathName.

    delete_directory(PathName) removes the directory whose pathname is PathName.

    change_directory(PathName) sets the current directory to the directory whose pathname is PathName.

    See absolute_file_name/2 for information about the syntax of PathName (section 7.26.1).

    Errors
    PathName is a variable    instantiation_error
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    PathName is an atom but not a valid pathname    domain_error(os_path, PathName)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.27.6  working_directory/1

    Templates
    working_directory(?atom)
    Description

    working_directory(PathName) succeeds if PathName is the pathname of the current directory.

    Errors
    PathName is neither a variable nor an atom    type_error(atom, PathName)

    Portability

    GNU Prolog predicate.

    7.27.7  directory_files/2

    Templates
    directory_files(+atom, ?list)
    Description

    directory_files(PathName, Files) succeeds if Files is the list of all entries (files, sub-directories,...) in the directory whose pathname is PathName. See absolute_file_name/2 for information about the syntax of PathName (section 7.26.1).

    Errors
    PathName is a variable    instantiation_error
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    PathName is an atom but not a valid pathname    domain_error(os_path, PathName)
    Files is neither a partial list nor a list    type_error(list, Files)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.8  rename_file/2

    Templates
    rename_file(+atom, +atom)
    Description

    rename_file(PathName1, PathName2) renames the file or directory whose pathname is PathName1 to PathName2. See absolute_file_name/2 for information about the syntax of PathName1 and PathName2 (section 7.26.1).

    Errors
    PathName1 is a variable    instantiation_error
    PathName1 is neither a variable nor an atom    type_error(atom, PathName1)
    PathName1 is an atom but not a valid pathname    domain_error(os_path, PathName1)
    PathName2 is a variable    instantiation_error
    PathName2 is neither a variable nor an atom    type_error(atom, PathName2)
    PathName2 is an atom but not a valid pathname    domain_error(os_path, PathName2)
    an operating system error occurs and value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.9  delete_file/1, unlink/1

    Templates
    delete_file(PathName)
    unlink(PathName)
    Description

    delete_file(PathName) removes the existing file whose pathname is PathName.

    unlink/1 is similar to delete_file/1 except that it never causes a system_error (e.g. if PathName does not refer to an existing file).

    See absolute_file_name/2 for information about the syntax of PathName (section 7.26.1).

    Errors
    PathName is a variable    instantiation_error
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    PathName is an atom but not a valid pathname    domain_error(os_path, PathName)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.27.10  file_permission/2, file_exists/1

    Templates
    file_permission(+atom, +atom)
    file_permission(+atom, +atom_list)
    file_exists(+atom)
    Description

    file_permission(PathName, Permission) succeeds if PathName is the pathname of an existing file (or directory) whose permissions include Permission.

    File permissions: Permission can be a single permission or a list of permissions. A permission is an atom among:
    • read: the file or directory can be read.

    • write: the file or directory can be written.

    • execute: the file can be executed.

    • search: the directory can be searched.
    If PathName does not exists or if it its permissions do not include Permission this predicate fails.

    file_exists(PathName) is equivalent to file_permission(PathName, []), i.e. it succeeds if PathName is the pathname of an existing file (or directory).

    See absolute_file_name/2 for information about the syntax of PathName (section 7.26.1).

    Errors
    PathName is a variable    instantiation_error
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    PathName is an atom but not a valid pathname    domain_error(os_path, PathName)
    Permission is a partial list or a list with an element which is a variable    instantiation_error
    Permission is neither an atom nor partial list or a list    type_error(list, Permission)
    an element E of the Permission list is neither a variable nor an atom    type_error(atom, E)
    an element E of the Permission is an atom but not a valid permission    domain_error(os_file_permission, Permission)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.27.11  file_property/2

    Templates
    file_property(+atom, ?os_file_property)
    Description

    file_property(PathName, Property) succeeds if PathName is the pathname of an existing file (or directory) and if Property unifies with one of the properties of the file. This predicate is re-executable on backtracking.

    File properties:
    • absolute_file_name(File): File is the absolute file name of PathName (section 7.26.1).

    • real_file_name(File): File is the real file name of PathName (follows symbolic links).

    • type(Type): Type is the type of PathName. Possible values are: regular, directory, fifo, socket, character_device, block_device or unknown.

    • size(Size): Size is the size (in bytes) of PathName.

    • permission(Permission): Permission is a permission of PathName (section 7.27.10).

    • last_modification(DT): DT is the last modification date and time (section 7.27.14).
    See absolute_file_name/2 for information about the syntax of PathName (section 7.26.1).

    Errors
    PathName is a variable    instantiation_error
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    PathName is an atom but not a valid pathname    domain_error(os_path, PathName)
    Property is neither a variable nor a file property term    domain_error(os_file_property, Property)
    Property = absolute_file_name(E), real_file_name(E), type(E) or permission(E) and E is neither a variable nor an atom    type_error(atom, E)
    Property = last_modification(DateTime) and DateTime is neither a variable nor a compound term    type_error(compound, DateTime)
    Property = last_modification(DateTime) and DateTime is a compound term but not a structure dt/6    domain_error(date_time, DateTime)
    Property = size(E) or last_modification(DateTime) and DateTime is a structure dt/6 but an element E is neither a variable nor an integer    type_error(integer, E)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.12  temporary_name/2

    Templates
    temporary_name(+atom, ?atom)
    Description

    temporary_name(Template, PathName) creates a unique file name PathName whose pathname begins by Template. Template should contain a pathname with six trailing Xs. PathName is Template with the six Xs replaced with a letter and the process identifier. This predicate is an interface to the C Unix function mktemp(3).

    See absolute_file_name/2 for information about the syntax of Template (section 7.26.1).

    Errors
    Template is a variable    instantiation_error
    Template is neither a variable nor an atom    type_error(atom, Template)
    Template is an atom but not a valid pathname    domain_error(os_path, Template)
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.13  temporary_file/3

    Templates
    temporary_file(+atom, +atom, ?atom)
    Description

    temporary_file(Directory, Prefix, PathName) creates a unique file name PathName whose pathname begins by Directory/Prefix. If Directory is the empty atom a standard temporary directory will be used (e.g. /tmp). Prefix can be the empty atom . This predicate is an interface to the C Unix function tempnam(3).

    See absolute_file_name/2 for information about the syntax of Directory (section 7.26.1).

    Errors
    Directory is a variable    instantiation_error
    Directory is neither a variable nor an atom    type_error(atom, Directory)
    Directory is an atom but not a valid pathname    domain_error(os_path, Directory)
    Prefix is a variable    instantiation_error
    Prefix is neither a variable nor an atom    type_error(atom, Prefix)
    PathName is neither a variable nor an atom    type_error(atom, PathName)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.14  date_time/1

    Templates
    date_time(?compound)
    Description

    date_time(DateTime) unifies DateTime with a compound term containing the current date and time. DateTime is a structure dt(Year, Month, Day, Hour, Minute, Second). Each sub-argument of the term dt/6 is an integer.

    Errors
    DateTime is neither a variable nor a compound term    type_error(compound, DateTime)
    DateTime is a compound term but not a structure dt/6    domain_error(date_time, DateTime)
    DateTime is a structure dt/6 and an element E is neither a variable nor an integer    type_error(integer, E)

    Portability

    GNU Prolog predicate.

    7.27.15  host_name/1

    Templates
    host_name(?atom)
    Description

    host_name(HostName) unifies HostName with the name of the host machine executing the current GNU Prolog process. If the sockets are available (section 7.28.1), the name returned will be fully qualified. In that case, host_name/1 will also succeed if HostName is instantiated to the unqualified name (or an alias) of the machine.

    Errors
    Hostname is neither a variable nor an atom    type_error(atom, HostName)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.16  os_version/1

    Templates
    os_version(?atom)
    Description

    os_version(OSVersion) unifies OSVersion with the operating system version of the machine executing the current GNU Prolog process.

    Errors
    OSVersion is neither a variable nor an atom    type_error(atom, OSVersion)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.17  architecture/1

    Templates
    architecture(?atom)
    Description

    architecture(Architecture) unifies Architecture with the name of the machine executing the current GNU Prolog process.

    Errors
    Architecture is neither a variable nor an atom    type_error(atom, Architecture)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.18  shell/2, shell/1, shell/0

    Templates
    shell(+atom, ?integer)
    shell(+atom)
    shell
    Description

    shell(Command, Status) invokes a new shell (named by the SHELL environment variable) passing Command for execution and unifies Status with the result of the execution. If Command is the empty atom a new interactive shell is executed. The control is returned to Prolog upon termination of the called process.

    shell(Command) is equivalent to shell(Command, 0).

    shell is equivalent to shell(”, 0).

    Errors
    Command is a variable    instantiation_error
    Command is neither a variable nor an atom    type_error(atom, Command)
    Status is neither a variable nor an integer    type_error(integer, Status)

    Portability

    GNU Prolog predicates.

    7.27.19  system/2, system/1

    Templates
    system(+atom, ?integer)
    system(+atom)
    Description

    system(Command, Status) invokes a new default shell passing Command for execution and unifies Status with the result of the execution. The control is returned to Prolog upon termination of the shell process. This predicate is an interface to the C Unix function system(3).

    system(Command) is equivalent to system(Command, 0).

    Errors
    Command is a variable    instantiation_error
    Command is neither a variable nor an atom    type_error(atom, Command)
    Status is neither a variable nor an integer    type_error(integer, Status)

    Portability

    GNU Prolog predicates.

    7.27.20  spawn/3, spawn/2

    Templates
    spawn(+atom, +atom_list, ?integer)
    spawn(+atom, +atom_list)
    Description

    spawn(Command, Arguments, Status) executes Command passing as arguments of the command-line each element of the list Arguments and unifies Status with the result of the execution. The control is returned to Prolog upon termination of the command.

    spawn(Command, Arguments) is equivalent to spawn(Command, Arguments, 0).

    Errors
    Command is a variable    instantiation_error
    Command is neither a variable nor an atom    type_error(atom, Command)
    Arguments is a partial list or a list with an element which is a variable    instantiation_error
    Arguments is neither a partial list nor a list    type_error(list, Arguments)
    an element E of the Arguments list is neither a variable nor an atom    type_error(atom, E)
    Status is neither a variable nor an integer    type_error(integer, Status)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.27.21  popen/3

    Templates
    popen(+atom, +io_mode, -stream)
    Description

    popen(Command, Mode, Stream) invokes a new default shell (by creating a pipe) passing Command for execution and associates a stream either to the standard input or the standard output of the created process. if Mode is read (resp. write) an input (resp. output) stream is created and Stream is unified with the stream-term associated. Writing to the stream writes to the standard input of the command while reading from the stream reads the command's standard output. The stream must be closed using close/2 (section 7.10.7). This predicate is an interface to the C Unix function popen(3).

    Errors
    Command is a variable    instantiation_error
    Command is neither a variable nor an atom    type_error(atom, Command)
    Mode is a variable    instantiation_error
    Mode is neither a variable nor an atom    type_error(atom, Mode)
    Mode is an atom but neither read nor write.    domain_error(io_mode, Mode)
    Stream is not a variable    type_error(variable, Stream)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.22  exec/5, exec/4

    Templates
    exec(+atom, -stream, -stream, -stream, -integer)
    exec(+atom, -stream, -stream, -stream)
    Description

    exec(Command, StreamIn, StreamOut, StreamErr, Pid) invokes a new default shell passing Command for execution and associates streams to standard streams of the created process. StreamIn is unified with the stream-term associated with the standard input stream of Command (it is an output stream). StreamOut is unified with the stream-term associated with the standard output stream of Command (it is an input stream). StreamErr is unified with the stream-term associated with the standard error stream of Command (it is an input stream). Pid is unified with the process identifier of the new process. This information is only useful if it is necessary to obtain the status of the execution using wait/2 (section 7.27.25). Until a call to wait/2 is done the process remains in the system processes table (as a zombie process if terminated). For this reason, if the status is not needed it is preferable to use exec/4.

    exec/4 is similar to exec/5 but the process is removed from system processes as soon as it is terminated.

    Errors
    Command is a variable    instantiation_error
    Command is neither a variable nor an atom    type_error(atom, Command)
    StreamIn is not a variable    type_error(variable, StreamIn)
    StreamOut is not a variable    type_error(variable, StreamOut)
    StreamErr is not a variable    type_error(variable, StreamErr)
    Pid is not a variable    type_error(variable, Pid)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.27.23  fork_prolog/1

    Templates
    fork_prolog(-integer)
    Description

    fork_prolog(Pid) creates a child process that differs from the parent process only in its PID. In the parent process Pid is unified with the PID of the child while in the child process Pid is unified with 0. In the parent process, the status of the child process can be ontained using wait/2 (section 7.27.25). Until a call to wait/2 is done the child process remains in the system processes table (as a zombie process if terminated). This predicate is an interface to the C Unix function fork(2).

    Errors
    Pid is not a variable    type_error(variable, Pid)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.24  create_pipe/2

    Templates
    create_pipe(-stream, -stream)
    Description

    create_pipe(StreamIn, StreamOut) creates a pair of streams pointing to a pipe inode. StreamIn is unified with the stream-term associated with the input side of the pipe and StreamOut is unified with the stream-term associated with output side. This predicate is an interface to the C Unix function pipe(2).

    Errors
    StreamIn is not a variable    type_error(variable, StreamIn)
    StreamOut is not a variable    type_error(variable, StreamOut)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.25  wait/2

    Templates
    wait(+integer, ?integer)
    Description

    wait(Pid, Status) waits for the child process whose identifier is Pid to terminate. Status is then unified with the exit status. This predicate is an interface to the C Unix function waitpid(2).

    Errors
    Pid is a variable    instantiation_error
    Pid is neither a variable nor an integer    type_error(integer, Pid)
    Status is neither a variable nor an integer    type_error(integer, Status)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.26  prolog_pid/1

    Templates
    prolog_pid(?integer)
    Description

    prolog_pid(Pid) unifies Pid with the process identifier of the current GNU Prolog process.

    Errors
    Pid is neither a variable nor an integer    type_error(integer, Pid)

    Portability

    GNU Prolog predicate.

    7.27.27  send_signal/2

    Templates
    send_signal(+integer, +integer)
    send_signal(+integer, +atom)
    Description

    send_signal(Pid, Signal) sends Signal to the process whose identifier is Pid. Signal can be specified directly as an integer or symbolically as an atom. Allowed atoms depend on the machine (e.g. 'SIGINT', 'SIGQUIT', 'SIGKILL', 'SIGUSR1', 'SIGUSR2', 'SIGALRM',...). This predicate is an interface to the C Unix function kill(2).

    Errors
    Pid is a variable    instantiation_error
    Pid is neither a variable nor an integer    type_error(integer, Pid)
    Signal is a variable    instantiation_error
    Signal is neither a variable nor an integer or an atom    type_error(integer, Signal)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.27.28  sleep/1

    Templates
    sleep(+number)
    Description

    sleep(Seconds) puts the GNU Prolog process to sleep for Seconds seconds. Seconds can be an integer or a floating point number (in which case it can be < 1). This predicate is an interface to the C Unix function usleep(3).

    Errors
    Seconds is a variable    instantiation_error
    Seconds is neither a variable nor a number    type_error(number, Seconds)
    Seconds is a number < 0    domain_error(not_less_than_zero, Seconds)

    Portability

    GNU Prolog predicate.

    7.27.29  select/5

    Templates
    select(+list, ?list, +list, ?list, +number)
    Description

    select(Reads, ReadyReads, Writes, ReadyWrites, TimeOut) waits for a number of streams (or file descriptors) to change status. ReadyReads is unified with the list of elements listed in Reads that have characters available for reading. Similarly ReadyWrites is unified with the list of elements of Writes that are ok for immediate writing. The elements of Reads and Writes are either stream-terms or aliases or integers considered as file descriptors, e.g. for sockets (section 7.28). Streams that must be tested with select/5 should not be buffered. This can be done at the opening using open/4 (section 7.10.6) or later using set_stream_buffering/2 (section 7.10.27). TimeOut is an upper bound on the amount of time (in milliseconds) elapsed before select/5 returns. If TimeOut ≤ 0 (no timeout) select/5 waits until something is available (either or reading or for writing) and thus can block indefinitely. This predicate is an interface to the C Unix function select(2).

    Errors
    Reads (or Writes) is a partial list or a list with an element E which is a variable    instantiation_error
    Reads is neither a partial list nor a list    type_error(list, Reads)
    Writes is neither a partial list nor a list    type_error(list, Writes)
    ReadyReads is neither a partial list nor a list    type_error(list, ReadyReads)
    ReadyWrites is neither a partial list nor a list    type_error(list, ReadyWrites)
    an element E of the Reads (or Writes) list is neither a stream-term or alias nor an integer    domain_error(stream_or_alias, E)
    an element E of the Reads (or Writes) list is not a selectable item    domain_error(selectable_item, E)
    an element E of the Reads (or Writes) list is an integer < 0    domain_error(not_less_than_zero, E)
    an element E of the Reads (or Writes) list is a stream-tern or alias not associated with an open stream    existence_error(stream, E)
    an element E of the Reads list is associated with an output stream    permission_error(input, stream, E)
    an element E of the Writes list is associated with an input stream    permission_error(output, stream, E)
    TimeOut is a variable    instantiation_error
    TimeOut is neither a variable nor a number    type_error(number, TimeOut)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.28  Sockets input/output

    7.28.1  Introduction

    This set of predicates provides a way to manipulate sockets. The predicates are straightforward interfaces to the corresponding BSD-type socket functions. This facility is available if the sockets part of GNU Prolog has been installed. A reader familiar with BSD sockets will understand them immediately otherwise a study of sockets is needed.

    The domain is either the atom 'AF_INET' or 'AF_UNIX' corresponding to the same domains in BSD-type sockets.

    An address is either of the form 'AF_INET'(HostName, Port) or 'AF_UNIX'(SocketName). HostName is an atom denoting a machine name, Port is a port number and SocketName is an atom denoting a socket.

    By default, streams associated with sockets are block buffered. The predicate set_stream_buffering/2 (section 7.10.27) can be used to change this mode. They are also text streams by default. Use set_stream_type/2 (section 7.10.25) to change the type if binary streams are needed.

    7.28.2  socket/2

    Templates
    socket(+socket_domain, -integer)
    Description

    socket(Domain, Socket) creates a socket whose domain is Domain (section 7.28) and unifies Socket with the descriptor identifying the socket. This predicate is an interface to the C Unix function socket(2).

    Errors
    Domain is a variable    instantiation_error
    Domain is neither a variable nor an atom    type_error(atom, Domain)
    Domain is an atom but not a valid socket domain    domain_error(socket_domain, Domain)
    Socket is not a variable    type_error(variable, Socket)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.28.3  socket_close/1

    Templates
    socket_close(+integer)
    Description

    socket_close(Socket) closes the socket whose descriptor is Socket. This predicate should not be used if Socket has given rise to a stream, e.g. by socket_connect/4 (section 7.28.5). In that case simply use close/2 (section 7.10.7) on the associated stream.

    Errors
    Socket is a variable    instantiation_error
    Socket is neither a variable nor an integer    type_error(integer, Socket)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.28.4  socket_bind/2

    Templates
    socket_bind(+integer, +socket_address)
    Description

    socket_bind(Socket, Address) binds the socket whose descriptor is Socket to the address specified by Address (section 7.28). If Address if of the form 'AF_INET'(HostName, Port) and if HostName is uninstantiated then it is unified with the current machine name. If Port is uninstantiated, it is unified to a port number picked by the operating system. This predicate is an interface to the C Unix function bind(2).

    Errors
    Socket is a variable    instantiation_error
    Socket is neither a variable nor an integer    type_error(integer, Socket)
    Address is a variable    instantiation_error
    Address is neither a variable nor a valid address    domain_error(socket_address, Address)
    Address = 'AF_UNIX'(E) and E is a variable    instantiation_error
    Address = 'AF_UNIX'(E) or 'AF_INET'(E, _) and E is neither a variable nor an atom    type_error(atom, E)
    Address = 'AF_UNIX'(E) and E is an atom but not a valid pathname    domain_error(os_path, E)
    Address = 'AF_INET'(_, E) and E is neither a variable nor an integer    type_error(integer, E)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.28.5  socket_connect/4

    Templates
    socket_connect(+integer, +socket_address, -stream, -stream)
    Description

    socket_connect(Socket, Address, StreamIn, StreamOut) connects the socket whose descriptor is Socket to the address specified by Address (section 7.28). StreamIn is unified with a stream-term associated with the input of the connection (it is an input stream). Reading from this stream gets data from the socket. StreamOut is unified with a stream-term associated with the output of the connection (it is an output stream). Writing to this stream sends data to the socket. The use of select/5 can be useful (section 7.27.29). This predicate is an interface to the C Unix function connect(2).

    Errors
    Socket is a variable    instantiation_error
    Socket is neither a variable nor an integer    type_error(integer, Socket)
    Address is a variable    instantiation_error
    Address is neither a variable nor a valid address    domain_error(socket_address, Address)
    Address = 'AF_UNIX'(E) or 'AF_INET'(E, _) or Address = 'AF_INET'(_, E) and E is a variable    instantiation_error
    Address = 'AF_UNIX'(E) or 'AF_INET'(E, _) and E is neither a variable nor an atom    type_error(atom, E)
    Address = 'AF_UNIX'(E) and E is an atom but not a valid pathname    domain_error(os_path, E)
    Address = 'AF_INET'(_, E) and E is neither a variable nor an integer    type_error(integer, E)
    StreamIn is not a variable    type_error(variable, StreamIn)
    StreamOut is not a variable    type_error(variable, StreamOut)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.28.6  socket_listen/2

    Templates
    socket_listen(+integer, +integer)
    Description

    socket_listen(Socket, Length) defines the socket whose descriptor is Socket to have a maximum backlog queue of Length pending connections. This predicate is an interface to the C Unix function listen(2).

    Errors
    Socket is a variable    instantiation_error
    Socket is neither a variable nor an integer    type_error(integer, Socket)
    Length is a variable    instantiation_error
    Length is neither a variable nor an integer    type_error(integer, Length)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicate.

    7.28.7  socket_accept/4, socket_accept/3

    Templates
    socket_accept(+integer, -atom, -stream, -stream)
    socket_accept(+integer, -stream, -stream)
    Description

    socket_accept(Socket, Client, StreamIn, StreamOut) extracts the first connection to the socket whose descriptor is Socket. If the domain is 'AF_INET', Client is unified with an atom whose name is the Internet host address in numbers-and-dots notation of the connecting machine. StreamIn is unified with a stream-term associated with the input of the connection (it is an input stream). Reading from this stream gets data from the socket. StreamOut is unified with a stream-term associated with the output of the connection (it is an output stream). Writing to this stream sends data to the socket. The use of select/5 can be useful (section 7.27.29). This predicate is an interface to the C Unix function accept(2).

    socket_accept(Socket, StreamIn, StreamOut) is equivalent to socket_accept(Socket, _,
    StreamIn, StreamOut)
    .

    Errors
    Socket is a variable    instantiation_error
    Socket is neither a variable nor an integer    type_error(integer, Socket)
    Client is not a variable    type_error(variable, Client)
    StreamIn is not a variable    type_error(variable, StreamIn)
    StreamOut is not a variable    type_error(variable, StreamOut)
    an operating system error occurs and the value of the os_error Prolog flag is error (section 7.22.1)    system_error(atom explaining the error)

    Portability

    GNU Prolog predicates.

    7.28.8  hostname_address/2

    Templates
    hostname_address(+atom, ?atom)
    hostname_address(?atom, +atom)
    Description

    hostname_address(HostName, HostAddress) succeeds if the Internet host address in numbers-and-dots notation of HostName is HostAddress. Hostname can be given as a fully qualified name, or an unqualified name or an alias of the machine. The predicate will fail if the machine name or address cannot be resolved.

    Errors
    HostName and HostAddress are variables    instantiation_error
    HostName is neither a variable nor an atom    type_error(atom, HostName)
    HostAddress is neither a variable nor an atom    type_error(atom, HostAddress)
    Address is neither a variable nor a valid address    domain_error(socket_address, Address)

    Portability

    GNU Prolog predicate.

    7.29  Linedit management

    The following predicates are only available if the linedit part of GNU Prolog has been installed.

    7.29.1  get_linedit_prompt/1

    Templates
    get_linedit_prompt(?atom)
    Description

    get_linedit_prompt(Prompt) succeeds if Prompt is the current linedit prompt, e.g. the top-level prompt is '| ?-'. By default all other reads have an empty prompt.

    Errors
    Prompt is neither a variable nor an atom    type_error(atom, Pred)

    Portability

    GNU Prolog predicate.

    7.29.2  set_linedit_prompt/1

    Templates
    set_linedit_prompt(+atom)
    Description

    set_linedit_prompt(Prompt) sets the current linedit prompt to Prompt. This prompt will be displayed for reads from a terminal (except for top-level reads).

    Errors
    Prompt is a variable    instantiation_error
    Prompt is neither a variable nor an atom    type_error(atom, Pred)

    Portability

    GNU Prolog predicate.

    7.29.3  add_linedit_completion/1

    Templates
    add_linedit_completion(+atom)
    Description

    add_linedit_completion(Word) adds Word in the list of completion words maintained by linedit (section 3.2.5). Only words containing letters, digits and the underscore character are added (if Word does not respect this restriction the predicate fails).

    Errors
    Word is a variable    instantiation_error
    Word is neither a variable nor an atom    type_error(atom, Word)

    Portability

    GNU Prolog predicate.

    7.29.4  find_linedit_completion/2

    Templates
    find_linedit_completion(+atom, ?atom)
    Description

    find_linedit_completion(Prefix, Word) succeeds if Word is a word beginning by Prefix and belongs to the list of completion words maintained by linedit (section 3.2.5). This predicate is re-executable on backtracking.

    Errors
    Prefix is a variable    instantiation_error
    Prefix is neither a variable nor an atom    type_error(atom, Prefix)
    Word is neither a variable nor an atom    type_error(atom, Word)

    Portability

    GNU Prolog predicate.

    7.30  Source reader facility

    7.30.1  Introduction

    To be written...

    7.30.2  sr_open/3

    7.30.3  sr_change_options/2

    7.30.4  sr_close/1

    7.30.5  sr_read_term/4

    7.30.6  sr_current_descriptor/1

    7.30.7  sr_get_stream/2

    7.30.8  sr_get_module/3

    7.30.9  sr_get_file_name/2

    7.30.10  sr_get_position/3

    7.30.11  sr_get_include_list/2

    7.30.12  sr_get_include_stream_list/2

    7.30.13  sr_get_size_counters/3

    7.30.14  sr_get_error_counters/3

    7.30.15  sr_set_error_counters/3

    7.30.16  sr_error_from_exception/2

    7.30.17  sr_write_message/8, sr_write_message/6, sr_write_message/4

    7.30.18  sr_write_error/6, sr_write_error/4, sr_write_error/2

    8  Finite domain solver and built-in predicates

    8.1  Introduction

    The finite domain (FD) constraint solver extends Prolog with constraints over FD. This facility is available if the FD part of GNU Prolog has been installed. The solver is an instance of the Constraint Logic Programming scheme introduced by Jaffar and Lassez in 1987 [7]. Constraints on FD are solved using propagation techniques, in particular arc-consistency (AC). The interested reader can refer to “Constraint Satisfaction in Logic Programming” of P. Van Hentenryck (1989) [8]. The solver is based on the clp(FD) solver [4]. The GNU Prolog FD solver offers arithmetic constraints, boolean constraints, reified constraints and symbolic constraints on an new kind of variables: Finite Domain variables.

    8.1.1  Finite Domain variables

    A new type of data is introduced: FD variables which can only take values in their domains. The initial domain of an FD variable is 0..fd_max_integer where fd_max_integer represents the greatest value that any FD variable can take. The predicate fd_max_integer/1 returns this value which may be different from the max_integer Prolog flag (section 7.22.1). The domain of an FD variable X is reduced step by step by constraints in a monotonic way: when a value has been removed from the domain of X it will never reappear in the domain of X. An FD variable is fully compatible with both Prolog integers and Prolog variables. Namely, when an FD variable is expected by an FD constraint it is possible to pass a Prolog integer (considered as an FD variable whose domain is a singleton) or a Prolog variable (immediately bound to an initial range 0..fd_max_integer). This avoids the need for specific type declaration. Although it is not necessary to declare the initial domain of an FD variable (since it will be bound 0..fd_max_integer when appearing for the fist time in a constraint) it is advantageous to do so and thus reduce as soon as possible the size of its domain: particularly because GNU Prolog, for efficiency reasons, does not check for overflows. For instance, without any preliminary domain definitions for X, Y and Z, the non-linear constraint X*Y#=Z will fail due to an overflow when computing the upper bound of the domain of Z: fd_max_integer × fd_max_integer. This overflow causes a negative result for the upper bound and the constraint then fails.

    There are two internal representations for an FD variable:
    • interval representation: only the min and the max of the variable are maintained. In this representation it is possible to store values included in 0..fd_max_integer.

    • sparse representation: an additional bit-vector is used to store the set of possible values for the variable (i.e. the domain). In this representation it is possible to store values included in 0..vector_max. By default vector_max is set to 127. This value can be redefined via an environment variable VECTORMAX or via the built-in predicate fd_set_vector_max/1 (section 8.2.3). The predicate fd_vector_max/1 returns the current value of vector_max (section 8.2.1).
    The initial representation for an FD variable X is always an interval representation and is switched to a sparse representation when a “hole” appears in the domain (e.g. due to an inequality constraint). Once a variable uses a sparse representation it will not switch back to an interval representation even if there are no longer holes in its domain. When this switching occurs some values in the domain of X can be lost since vector_max is less than fd_max_integer. We say that “X is extra-constrained” since X is constrained by the solver to the domain 0..vector_max (via an imaginary constraint X #=< vector_max). An extra_cstr is associated with each FD variable to indicate that values have been lost due to the switch to a sparse representation. This flag is updated on every operations. The domain of an extra-constrained FD variable is output followed by the @ symbol. When a constraint fails on a extra-constrained variable a message Warning: Vector too small - maybe lost solutions (FD Var:N) is displayed (N is the address of the involved variable).

    Example 1 (vector_max = 127):
    Constraint on X Domain of X extra_cstr Lost values
    X #=< 512 0..512 off none
    X #\= 10 0..9:11..127 on 128..512
    X #=< 100 0..9:11..100 off none

    In this example, when the constraint X #\= 10 is posted some values are lost, the extra_cstr is then switched on. However, posting the constraint X #=< 100 will turn off the flag (no values are lost).

    Example 2:
    Constraint on X Domain of X extra_cstr Lost values
    X #=< 512 0..512 off none
    X #\= 10 0..9:11..127 on 128..512
    X #>= 256 Warning: Vector too small... on 128..512

    In this example, the constraint X #>= 256 fails due to the lost of 128..512 so a message is displayed onto the terminal. The solution would consist in increasing the size of the vector either by setting the environment variable VECTORMAX (e.g. to 512) or using fd_set_vector_max(512).

    Finally, bit-vectors are not dynamic, i.e. all vectors have the same size (0..vector_max). So the use of fd_set_vector_max/1 is limited to the initial definition of vector sizes and must occur before any constraint. As seen before, the solver tries to display a message when a failure occurs due to a too short vector_max. Unfortunately, in some cases it cannot detect the lost of values and no message is emitted. So the user should always take care to this parameter to be sure that it is large to encode any vector.

    8.2  FD variable parameters

    8.2.1  fd_max_integer/1

    Templates
    fd_max_integer(?integer)
    Description

    fd_max_integer(N) succeeds if N is the current value of fd_max_integer (section 8.1).

    Errors
    N is neither a variable nor an integer    type_error(integer, N)

    Portability

    GNU Prolog predicate.

    8.2.2  fd_vector_max/1

    Templates
    fd_vector_max(?integer)
    Description

    fd_vector_max(N) succeeds if N is the current value of vector_max (section 8.1).

    Errors
    N is neither a variable nor an integer    type_error(integer, N)

    Portability

    GNU Prolog predicate.

    8.2.3  fd_set_vector_max/1

    Templates
    fd_set_vector_max(+integer)
    Description

    fd_set_vector_max(N) initializes vector_max based on the value N (section 8.1). More precisely, on 32 bit machines, vector_max is set to the smallest value of (32*k)-1 which is ≥ N.

    Errors
    N is a variable    instantiation_error
    N is neither a variable nor an integer    type_error(integer, N)
    N is an integer < 0    domain_error(not_less_than_zero, N)

    Portability

    GNU Prolog predicate.

    8.3  Initial value constraints

    8.3.1  fd_domain/3, fd_domain_bool/1

    Templates
    fd_domain(+fd_variable_list_or_fd_variable, +integer, +integer)
    fd_domain(?fd_variable, +integer, +integer)
    fd_domain_bool(+fd_variable_list)
    fd_domain_bool(?fd_variable)
    Description

    fd_domain(Vars, Lower, Upper) constraints each element X of Vars to take a value in Lower..Upper. This predicate is generally used to set the initial domain of variables to an interval. Vars can be also a single FD variable (or a single Prolog variable).

    fd_domain_bool(Vars) is equivalent to fd_domain(Vars, 0, 1) and is used to declare boolean FD variables.

    Errors
    Vars is not a variable but is a partial list    instantiation_error
    Vars is neither a variable nor an FD variable nor an integer nor a list    type_error(list, Vars)
    an element E of the Vars list is neither a variable nor an FD variable nor an integer    type_error(fd_variable, E)
    Lower is a variable    instantiation_error
    Lower is neither a variable nor an integer    type_error(integer, Lower)
    Upper is a variable    instantiation_error
    Upper is neither a variable nor an integer    type_error(integer, Upper)

    Portability

    GNU Prolog predicate.

    8.3.2  fd_domain/2

    Templates
    fd_domain(+fd_variable_list, +integer_list)
    fd_domain(?fd_variable, +integer_list)
    Description

    fd_domain(Vars, Values) constraints each element X of the list Vars to take a value in the list Values. This predicate is generally used to set the initial domain of variables to a set of values. The domain of each variable of Vars uses a sparse representation. Vars can be also a single FD variable (or a single Prolog variable).

    Errors
    Vars is not a variable but is a partial list    instantiation_error
    Vars is neither a variable nor an FD variable nor an integer nor a list    type_error(list, Vars)
    an element E of the Vars list is neither a variable nor an FD variable nor an integer    type_error(fd_variable, E)
    Values is a partial list or a list with an element E which is a variable    instantiation_error
    Values is neither a partial list nor a list    type_error(list, Values)
    an element E of the Values list is neither a variable nor an integer    type_error(integer, E)

    Portability

    GNU Prolog predicate.

    8.4  Type testing

    8.4.1  fd_var/1, non_fd_var/1, generic_var/1, non_generic_var/1

    Templates
    fd_var(?term)
    non_fd_var(?term)
    generic_var(?term)
    non_generic_var(?term)
    Description

    fd_var(Term) succeeds if Term is currently an FD variable.

    non_fd_var(Term) succeeds if Term is currently not an FD variable (opposite of fd_var/1).

    generic_var(Term) succeeds if Term is either a Prolog variable or an FD variable.

    non_generic_var(Term) succeeds if Term is neither a Prolog variable nor an FD variable (opposite of generic_var/1).

    Errors

    None.

    Portability

    GNU Prolog predicate.

    8.5  FD variable information

    These predicate allow the user to get some information about FD variables. They are not constraints, they only return the current state of a variable.

    8.5.1  fd_min/2, fd_max/2, fd_size/2, fd_dom/2

    Templates
    fd_min(+fd_variable, ?integer)
    fd_max(+fd_variable, ?integer)
    fd_size(+fd_variable, ?integer)
    fd_dom(+fd_variable, ?integer_list)
    Description

    fd_min(X, N) succeeds if N is the minimal value of the current domain of X.

    fd_max(X, N) succeeds if N is the maximal value of the current domain of X.

    fd_size(X, N) succeeds if N is the number of elements of the current domain of X.

    fd_dom(X, Values) succeeds if Values is the list of values of the current domain of X.

    Errors
    X is a variable    instantiation_error
    X is neither an FD variable nor an integer    type_error(fd_variable, X)
    N is neither a variable nor an integer    type_error(integer, N)
    an element E of the Vars list is neither a variable nor an FD variable nor an integer    type_error(fd_variable, E)
    Values is neither a partial list nor a list    type_error(list, Values)

    Portability

    GNU Prolog predicate.

    8.5.2  fd_has_extra_cstr/1, fd_has_vector/1, fd_use_vector/1

    Templates
    fd_has_extra_cstr(+fd_variable)
    fd_has_vector(+fd_variable)
    fd_use_vector(+fd_variable)
    Description

    fd_has_extra_cstr(X) succeeds if the extra_cstr of X is currently on (section 8.1).

    fd_has_vector(X) succeeds if the current domain of X uses a sparse representation (section 8.1).

    fd_use_vector(X) enforces a sparse representation for the domain of X (section 8.1).

    Errors
    X is a variable    instantiation_error
    X is neither an FD variable nor an integer    type_error(fd_variable, X)

    Portability

    GNU Prolog predicates.

    8.6  Arithmetic constraints

    8.6.1  FD arithmetic expressions

    An FD arithmetic expression is a Prolog term built from integers, variables (Prolog or FD variables), and functors (or operators) that represent arithmetic functions. The following table details the components of an FD arithmetic expression:
    FD Expression
    Result
    Prolog variable
    domain 0..fd_max_integer
    FD variable X
    domain of X
    integer number N
    domain N..N
    + E
    same as E
    - E
    opposite of E
    E1 + E2
    sum of E1 and E2
    E1 - E2
    subtraction of E2 from E1
    E1 * E2
    multiplication of E1 by E2
    E1 / E2
    integer division of E1 by E2 (only succeeds if the remainder is 0)
    E1 ** E2
    E1 raised to the power of E2 (E1 or E2 must be an integer)
    min(E1,E2)
    minimum of E1 and E2
    max(E1,E2)
    maximum of E1 and E2
    dist(E1,E2)
    distance, i.e. |E1 - E2|
    E1 // E2
    quotient of the integer division of E1 by E2
    E1 rem E2
    remainder of the integer division of E1 by E2
    quot_rem(E1,E2,R)
    quotient of the integer division of E1 by E2
    (R is the remainder of the integer division of E1 by E2)

    FD expressions are not restricted to be linear. However non-linear constraints usually yield less constraint propagation than linear constraints.

    +, -, *, /, //, rem and ** are predefined infix operators. + and - are predefined prefix operators (section 7.14.10).

    Errors
    a sub-expression is of the form _ ** E and E is a variable    instantiation_error
    a sub-expression E is neither a variable nor an integer nor an FD arithmetic functor    type_error(fd_evaluable, E)
    an expression is too complex    resource_error(too_big_fd_constraint)

    8.6.2  Partial AC: (#=)/2 - constraint equal, (#\=)/2 - constraint not equal,
    (#<)/2 - constraint less than, (#=<)/2 - constraint less than or equal,
    (#>)/2 - constraint greater than, (#>=)/2 - constraint greater than or equal

    Templates
    #=(?fd_evaluable, ?fd_evaluable)
    #\=(?fd_evaluable, ?fd_evaluable)
    #<(?fd_evaluable, ?fd_evaluable)
    #=<(?fd_evaluable, ?fd_evaluable)
    #>(?fd_evaluable, ?fd_evaluable)
    #>=(?fd_evaluable, ?fd_evaluable)
    Description

    FdExpr1 #= FdExpr2 constrains FdExpr1 to be equal to FdExpr2.

    FdExpr1 #\= FdExpr2 constrains FdExpr1 to be different from FdExpr2.

    FdExpr1 #< FdExpr2 constrains FdExpr1 to be less than FdExpr2.

    FdExpr1 #=< FdExpr2 constrains FdExpr1 to be less than or equal to FdExpr2.

    FdExpr1 #> FdExpr2 constrains FdExpr1 to be greater than FdExpr2.

    FdExpr1 #>= FdExpr2 constrains FdExpr1 to be greater than or equal to FdExpr2.

    FdExpr1 and FdExpr2 are arithmetic FD expressions (section 8.6.1).

    #=, #\=, #<, #=<, #> and #>= are predefined infix operators (section 7.14.10).

    These predicates post arithmetic constraints that are managed by the solver using a partial arc-consistency algorithm to reduce the domain of involved variables. In this scheme only the bounds of the domain of variables are updated. This leads to less propagation than full arc-consistency techniques (section 8.6.3) but is generally more efficient for arithmetic. These arithmetic constraints can be reified (section 8.7).

    Errors

    Refer to the syntax of arithmetic FD expressions for possible errors (section 8.6.1).

    Portability

    GNU Prolog predicates.

    8.6.3  Full AC: (#=#)/2 - constraint equal, (#\=#)/2 - constraint not equal,
    (#<#)/2 - constraint less than, (#=<#)/2 - constraint less than or equal,
    (#>#)/2 - constraint greater than, (#>=#)/2 - constraint greater than or equal

    Templates
    #=#(?fd_evaluable, ?fd_evaluable)
    #\=#(?fd_evaluable, ?fd_evaluable)
    #<#(?fd_evaluable, ?fd_evaluable)
    #=<#(?fd_evaluable, ?fd_evaluable)
    #>#(?fd_evaluable, ?fd_evaluable)
    #>=#(?fd_evaluable, ?fd_evaluable)
    Description

    FdExpr1 #=# FdExpr2 constrains FdExpr1 to be equal to FdExpr2.

    FdExpr1 #\=# FdExpr2 constrains FdExpr1 to be different from FdExpr2.

    FdExpr1 #<# FdExpr2 constrains FdExpr1 to be less than FdExpr2.

    FdExpr1 #=<# FdExpr2 constrains FdExpr1 to be less than or equal to FdExpr2.

    FdExpr1 #># FdExpr2 constrains FdExpr1 to be greater than FdExpr2.

    FdExpr1 #>=# FdExpr2 constrains FdExpr1 to be greater than or equal to FdExpr2.

    FdExpr1 and FdExpr2 are arithmetic FD expressions (section 8.6.1).

    #=#, #\=#, #<#, #=<#, #># and #>=# are predefined infix operators (section 7.14.10).

    These predicates post arithmetic constraints that are managed by the solver using a full arc-consistency algorithm to reduce the domain of involved variables. In this scheme the full domain of variables is updated. This leads to more propagation than partial arc-consistency techniques (section 8.6.1) but is generally less efficient for arithmetic. These arithmetic constraints can be reified (section 8.7.1).

    Errors

    Refer to the syntax of arithmetic FD expressions for possible errors (section 8.6.1).

    Portability

    GNU Prolog predicates.

    8.6.4  fd_prime/1, fd_not_prime/1

    Templates
    fd_prime(?fd_variable)
    fd_not_prime(?fd_variable)
    Description

    fd_prime(X) constraints X to be a prime number between 0..vector_max. This constraint enforces a sparse representation for the domain of X (section 8.1).

    fd_not_prime(X) constraints X to be a non prime number between 0..vector_max. This constraint enforces a sparse representation for the domain of X (section 8.1).

    Errors
    X is neither an FD variable nor an integer    type_error(fd_variable, X)

    Portability

    GNU Prolog predicates.

    8.7  Boolean and reified constraints

    8.7.1  Boolean FD expressions

    An boolean FD expression is a Prolog term built from integers (0 for false, 1 for true), variables (Prolog or FD variables), partial AC arithmetic constraints (section 8.6.2), full AC arithmetic constraints (section 8.6.3) and functors (or operators) that represent boolean functions. When a sub-expression of a boolean expression is an arithmetic constraint c, it is reified. Namely, as soon as the solver detects that c is true (i.e. entailed) the sub-expression has the value 1. Similarly when the solver detects that c is false (i.e. disentailed) the sub-expression evaluates as 0. While neither the entailment nor the disentailment can be detected the sub-expression is evaluated as a domain 0..1. The following table details the components of an FD boolean expression:
    FD Expression Result
    Prolog variable domain 0..1
    FD variable X domain of X, X is constrained to be in 0..1
    0 (integer) 0 (false)
    1 (integer) 1 (true)
    #\ E not E
    E1 #<=> E2 E1 equivalent to E2
    E1 #\<=> E2 E1 not equivalent to E2 (i.e. E1 different from E2)
    E1 ## E2 E1 exclusive OR E2 (i.e. E1 not equivalent to E2)
    E1 #==> E2 E1 implies E2
    E1 #\==> E2 E1 does not imply E2
    E1 #/\ E2 E1 AND E2
    E1 #\/\ E2 E1 NAND E2
    E1 #\/ E2 E1 OR E2
    E1 #\\/ E2 E1 NOR E2

    #<=>, #\<=>, ##, #==>, #\==>, #/\, #\/\, #\/ and #\\/ are predefined infix operators. #\ is a predefined prefix operator (section 7.14.10).

    Errors
    a sub-expression E is neither a variable nor an integer (0 or 1) nor an FD boolean functor nor reified constraint    type_error(fd_bool_evaluable, E)
    an expression is too complex    resource_error(too_big_fd_constraint)
    a sub-expression is an invalid reified constraint    an arithmetic constraint error (section 8.6.1)

    8.7.2  (#\)/1 - constraint NOT, (#<=>)/2 - constraint equivalent,
    (#\<=>)/2 - constraint different, (##)/2 - constraint XOR,
    (#==>)/2 - constraint imply, (#\==>)/2 - constraint not imply,
    (#/\)/2 - constraint AND, (#\/\)/2 - constraint NAND,
    (#\/)/2 - constraint OR, (#\\/)/2 - constraint NOR

    Templates
    #\(?fd_bool_evaluable)
    #<=>(?fd_bool_evaluable, ?fd_bool_evaluable)
    #\<=>(?fd_bool_evaluable, ?fd_bool_evaluable)
    ##(?fd_bool_evaluable, ?fd_bool_evaluable)
    #==>(?fd_bool_evaluable, ?fd_bool_evaluable)
    #\==>(?fd_bool_evaluable, ?fd_bool_evaluable)
    #/\(?fd_bool_evaluable, ?fd_bool_evaluable)
    #\/\(?fd_bool_evaluable, ?fd_bool_evaluable)
    #\/(?fd_bool_evaluable, ?fd_bool_evaluable)
    #\\/(?fd_bool_evaluable, ?fd_bool_evaluable)
    Description

    #\= FdBoolExpr1 constraints FdBoolExpr1 to be false.

    FdBoolExpr1 #<=> FdBoolExpr2 constrains FdBoolExpr1 to be equivalent to FdBoolExpr2.

    FdBoolExpr1 #\<=> FdBoolExpr2 constrains FdBoolExpr1 to be equivalent to not FdBoolExpr2.

    FdBoolExpr1 ## FdBoolExpr2 constrains FdBoolExpr1 XOR FdBoolExpr2 to be true

    FdBoolExpr1 #==> FdBoolExpr2 constrains FdBoolExpr1 to imply FdBoolExpr2.

    FdBoolExpr1 #\==> FdBoolExpr2 constrains FdBoolExpr1 to not imply FdBoolExpr2.

    FdBoolExpr1 #/\ FdBoolExpr2 constrains FdBoolExpr1 AND FdBoolExpr2 to be true.

    FdBoolExpr1 #\/\ FdBoolExpr2 constrains FdBoolExpr1 AND FdBoolExpr2 to be false.

    FdBoolExpr1 #\/ FdBoolExpr2 constrains FdBoolExpr1 OR FdBoolExpr2 to be true.

    FdBoolExpr1 #\\/ FdBoolExpr2 constrains FdBoolExpr1 OR FdBoolExpr2 to be false.

    FdBoolExpr1 and FdBoolExpr2 are boolean FD expressions (section 8.7.1).

    Note that #\<=> (not equivalent) and ## (exclusive or) are synonymous.

    These predicates post boolean constraints that are managed by the FD solver using a partial arc-consistency algorithm to reduce the domain of involved variables. The (dis)entailment of reified constraints is detected using either the bounds (for partial AC arithmetic constraints) or the full domain (for full AC arithmetic constraints).

    #<=>, #\<=>, ##, #==>, #\==>, #/\, #\/\, #\/ and #\\/ are predefined infix operators. #\ is a predefined prefix operator (section 7.14.10).

    Errors

    Refer to the syntax of boolean FD expressions for possible errors (section 8.7.1).

    Portability

    GNU Prolog predicates.

    8.7.3  fd_cardinality/2, fd_cardinality/3, fd_at_least_one/1, fd_at_most_one/1,
    fd_only_one/1

    Templates
    fd_cardinality(+fd_bool_evaluable_list, ?fd_variable)
    fd_cardinality(+integer, ?fd_variable, +integer)
    fd_at_least_one(+fd_bool_evaluable_list)
    fd_at_most_one(+fd_bool_evaluable_list)
    fd_only_one(+fd_bool_evaluable_list)
    Description

    fd_cardinality(List, Count) unifies Count with the number of constraints that are true in List. This is equivalent to post the constraint B1 + B2 + ...+ Bn #= Count where each variable Bi is a new variable defined by the constraint Bi #<=> Ci where Ci is the ith constraint of List. Each Ci must be a boolean FD expression (section 8.7.1).

    fd_cardinality(Lower, List, Upper) is equivalent to fd_cardinality(List, Count), Lower #=< Count, Count #=< Upper

    fd_at_least_one(List) is equivalent to fd_cardinality(List, Count), Count #>= 1.

    fd_at_most_one(List) is equivalent to fd_cardinality(List, Count), Count #=< 1.

    fd_only_one(List) is equivalent to fd_cardinality(List, 1).

    Errors
    List is a partial list    instantiation_error
    List is neither a partial list nor a list    type_error(list, List)
    Count is neither an FD variable nor an integer    type_error(fd_variable, Count)
    Lower is a variable    instantiation_error
    Lower is neither a variable nor an integer    type_error(integer, Lower)
    Upper is a variable    instantiation_error
    Upper is neither a variable nor an integer    type_error(integer, Upper)
    an element E of the List list is an invalid boolean expression    an FD boolean constraint (section 8.7.1)

    Portability

    GNU Prolog predicates.

    8.8  Symbolic constraints

    8.8.1  fd_all_different/1

    Templates
    fd_all_different(+fd_variable_list)
    Description

    fd_all_different(List) constrains all variables in List to take distinct values. This is equivalent to posting an inequality constraint for each pair of variables. This constraint is triggered when a variable becomes ground, removing its value from the domain of the other variables.

    Errors
    List is a partial list    instantiation_error
    List is neither a partial list nor a list    type_error(list, List)
    an element E of the List list is neither a variable nor an integer nor an FD variable    type_error(fd_variable, E)

    Portability

    GNU Prolog predicate.

    8.8.2  fd_element/3

    Templates
    fd_element(?fd_variable, +integer_list, ?fd_variable)
    Description

    fd_element(I, List, X) constraints X to be equal to the Ith integer (from 1) of List.

    Errors
    I is neither a variable nor an FD variable nor an integer    type_error(fd_variable, I)
    X is neither a variable nor an FD variable nor an integer    type_error(fd_variable, X)
    List is a partial list or a list with an element E which is a variable    instantiation_error
    List is neither a partial list nor a list    type_error(list, List)
    an element E of the List list is neither a variable nor an integer    type_error(integer, E)

    Portability

    GNU Prolog predicate.

    8.8.3  fd_element_var/3

    Templates
    fd_element_var(?fd_variable, +fd_variable_list, ?fd_variable)
    Description

    fd_element_var(I, List, X) constraints X to be equal to the Ith variable (from 1) of List. This constraint is similar to fd_element/3 (section 8.8.2) but List can also contain FD variables (rather than just integers).

    Errors
    I is neither a variable nor an FD variable nor an integer    type_error(fd_variable, I)
    X is neither a variable nor an FD variable nor an integer    type_error(fd_variable, X)
    List is a partial list    instantiation_error
    List is neither a partial list nor a list    type_error(list, List)
    an element E of the List list is neither a variable nor an integer nor an FD variable    type_error(fd_variable, E)

    Portability

    GNU Prolog predicate.

    8.8.4  fd_atmost/3, fd_atleast/3, fd_exactly/3

    Templates
    fd_atmost(+integer, +fd_variable_list, +integer)
    fd_atleast(+integer, +fd_variable_list, +integer)
    fd_exactly(+integer, +fd_variable_list, +integer)
    Description

    fd_atmost(N, List, V) posts the constraint that at most N variables of List are equal to the value V.

    fd_atleast(N, List, V) posts the constraint that at least N variables of List are equal to the value V.

    fd_exactly(N, List, V) posts the constraint that at exactly N variables of List are equal to the value V.

    These constraints are special cases of fd_cardinality/2 (section 8.7.3) but their implementation is more efficient.

    Errors
    N is a variable    instantiation_error
    N is neither a variable nor an integer    type_error(integer, N)
    V is a variable    instantiation_error
    V is neither a variable nor an integer    type_error(integer, V)
    List is a partial list    instantiation_error
    List is neither a partial list nor a list    type_error(list, List)
    an element E of the List list is neither a variable nor an FD variable nor an integer    type_error(fd_variable, E)

    Portability

    GNU Prolog predicates.

    8.8.5  fd_relation/2, fd_relationc/2

    Templates
    fd_relation(+integer_list_list, ?fd_variable_list)
    fd_relationc(+integer_list_list, ?fd_variable_list)
    Description

    fd_relation(Relation, Vars) constraints the tuple of variables Vars to be equal to one tuple of the list Relation. A tuple is represented by a list.

    Example: definition of the boolean AND relation so that X AND Y ⇔ Z:
    and(X,Y,Z):-
            fd_relation([[0,0,0],[0,1,0],[1,0,0],[1,1,1]], [X,Y,Z]).
    
    fd_relationc(Columns, Vars) is similar to fd_relation/2 except that the relation is not given as the list of tuples but as the list of the columns of the relation. A column is represented by a list.

    Example:
    and(X,Y,Z):-
            fd_relationc([[0,0,1,1],[0,1,0,1],[0,0,0,1]], [X,Y,Z]).
    
    Errors
    Relation is a partial list or a list with a sub-term E which is a variable    instantiation_error
    Relation is neither a partial list nor a list    type_error(list, Relation)
    an element E of the Relation list is neither a variable nor an integer    type_error(integer, E)
    Vars is a partial list    instantiation_error
    Vars is neither a partial list nor a list    type_error(list, Vars)
    an element E of the Vars list is neither a variable nor an integer nor an FD variable    type_error(fd_variable, E)

    Portability

    GNU Prolog predicates.

    8.9  Labeling constraints

    8.9.1  fd_labeling/2, fd_labeling/1, fd_labelingff/1

    Templates
    fd_labeling(+fd_variable_list, +fd_labeling_option_list)
    fd_labeling(+fd_variable, +fd_labeling_option_list)
    fd_labeling(+fd_variable_list)
    fd_labeling(+fd_variable)
    fd_labelingff(+fd_variable_list)
    fd_labelingff(+fd_variable)
    Description

    fd_labeling(Vars, Options) assigns a value to each variable X of the list Vars according to the list of labeling options given by Options. Vars can be also a single FD variable. This predicate is re-executable on backtracking.

    FD labeling options: Options is a list of labeling options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are:
    • variable_method(V): specifies the heuristics to select the variable to enumerate:
      • standard: no heuristics, the leftmost variable is selected.

      • first_fail (or ff): selects the variable with the smallest number of elements in its domain. If several variables have the same number of elements the leftmost variable is selected.

      • most_constrained: like first_fail but when several variables have the same number of elements selects the variable that appears in most constraints.

      • smallest: selects the variable that has the smallest value in its domain. If there is more than one such variable selects the variable that appears in most constraints.

      • largest: selects the variable that has the greatest value in its domain. If there is more than one such variable selects the variable that appears in most constraints.

      • max_regret: selects the variable that has the greatest difference between the smallest value and the next value of its domain. If there is more than one such variable selects the variable that appears in most constraints.

      • random: selects randomly a variable. Each variable is only chosen once.

      The default value is standard.

    • reorder(true/false): specifies if the variable heuristics should dynamically reorder the list of variable (true) or not (false). Dynamic reordering is generally more efficient but in some cases a static ordering is faster. The default value is true.

    • value_method(V): specifies the heuristics to select the value to assign to the chosen variable:
      • min: enumerates the values from the smallest to the greatest (default).

      • max: enumerates the values from the greatest to the smallest.

      • middle: enumerates the values from the middle to the bounds.

      • bounds: enumerates the values from the bounds to the middle.

      • random: enumerates the values randomly. Each value is only tried once.

      The default value is min.

    • backtracks(B): unifies B with the number of backtracks during the enumeration.
    fd_labeling(Vars) is equivalent to fd_labeling(Vars, []).

    fd_labelingff(Vars) is equivalent to fd_labeling(Vars, [variable_method(ff)]).

    Errors
    Vars is a partial list or a list with an element E which is a variable    instantiation_error
    Vars is neither a partial list nor a list    type_error(list, Vars)
    an element E of the Vars list is neither a variable nor an integer nor an FD variable    type_error(fd_variable, E)
    Options is a partial list or a list with an element E which is a variable    instantiation_error
    Options is neither a partial list nor a list    type_error(list, Options)
    an element E of the Options list is neither a variable nor a labeling option    domain_error(fd_labeling_option, E)

    Portability

    GNU Prolog predicates.

    8.10  Optimization constraints

    8.10.1  fd_minimize/2, fd_maximize/2

    Templates
    fd_minimize(+callable_term, ?fd_variable)
    fd_maximize(+callable_term, ?fd_variable)
    Description

    fd_minimize(Goal, X) repeatedly calls Goal to find a value that minimizes the variable X. Goal is a Prolog goal that should instantiate X, a common case being the use of fd_labeling/2 (section 8.9.1). This predicate uses a branch-and-bound algorithm with restart: each time call(Goal) succeeds the computation restarts with a new constraint X #< V where V is the value of X at the end of the last call of Goal. When a failure occurs (either because there are no remaining choice-points for Goal or because the added constraint is inconsistent with the rest of the store) the last solution is recomputed since it is optimal.

    fd_maximize(Goal, X) is similar to fd_minimize/2 but X is maximized.

    Errors
    Goal is a variable    instantiation_error
    Goal is neither a variable nor a callable term    type_error(callable, Goal)
    The predicate indicator Pred of Goal does not correspond to an existing procedure and the value of the unknown Prolog flag is error (section 7.22.1)    existence_error(procedure, Pred)
    X is neither a variable nor an FD variable nor an integer    type_error(fd_variable, X)

    Portability

    GNU Prolog predicates.

    9  Interfacing Prolog and C

    9.1  Calling C from Prolog

    9.1.1  Introduction

    This interface allows a Prolog predicate to call a C function. Here are some features of this facility:
    • implicit Prolog ↔ C data conversions for simple types.

    • functions to handle complex types.

    • error detection depending on the type of the argument.

    • different kinds of arguments: input, output or input/output.

    • possibility to write non-deterministic code.
    This interface can then be used to write both simple and complex C routines. A simple routine uses either input or output arguments which type is simple. In that case the user does not need any knowledge of Prolog data structures since all Prolog ↔ C data conversions are implicitly achieved. To manipulate complex terms (lists, structures) a set of functions is provided. Finally it is also possible to write non-deterministic C code.

    9.1.2  foreign/2 directive

    foreign/2 directive (section 6.1.14) declares a C function interface. The general form is foreign(Template, Options) which defines an interface predicate whose prototype is Template according to the options given by Options. Template is a callable term specifying the type/mode of each argument of the associated Prolog predicate.

    Foreign options: Options is a list of foreign options. If this list contains contradictory options, the rightmost option is the one which applies. Possible options are:
    • fct_name(F): F is an atom representing the name of the C function to call. By default the name of the C function is the same as the principal functor of Template. In any case, the atom associated with the name of the function must conforms to the syntax of C identifiers.

    • return(boolean/none/jump): specifies the value returned by the C function:
      • boolean: the type of the function is Bool (returns TRUE on success, FALSE otherwise).

      • none: the type of the function is void (no returned value).

      • jump: the type of the function is void(*)() (returns the address of a Prolog code to execute).

      The default value is boolean.

    • bip_name(Name, Arity): initializes the error context with Name and Arity. If an error occurs this information is used to indicate from which predicate the error occurred (section 5.3.1). It is also possible to prevent the initialization of the error context using bip_name(none). By default Name and Arity are set to the functor and arity of Template.

    • choice_size(N): this option specifies that the function implements a non-deterministic code. N is an integer specifying the size needed by the non-deterministic C function. This facility is explained later (section 9.1.7). By default a foreign function is deterministic.
    foreign(Template) is equivalent to foreign(Template, []).

    Foreign modes and types: each argument of Template specifies the foreign mode and type of the corresponding argument. This information is used to check the type of effective arguments at run-time and to perform Prolog ↔ C data conversions. Each argument of Template is formed with a mode symbol followed by a type name. Possible foreign modes are:
    • +: input argument.

    • -: output argument.

    • ?: input/output argument.
    Possible foreign types are:
    Foreign type Prolog type C type Description of the C type
    integer integer long value of the integer
    positive positive integer long value of the integer
    float floating point number double value of the floating point number
    number number double value of the number
    atom atom int internal key of the atom
    boolean boolean int value of the boolean (0=false, 1=true)
    char character int value of (the code of) the character
    code character code int value of the character-code
    byte byte int value of the byte
    in_char in-character int value of the character or -1 for end-of-file
    in_code in-character code int value of the character-code or -1 for end-of-file
    in_byte in-byte int value of the byte or -1 for the end-of-file
    string atom char * C string containing the name of the atom
    chars character list char * C string containing the characters of the list
    codes character-code list char * C string containing the characters of the list
    term Prolog term PlTerm generic Prolog term

    Simple foreign type: a simple type is any foreign type listed in the above tabled except term. A simple foreign type is an atomic term (character and character-code lists are in fact lists of constants). Each simple foreign type is converted to/from a C type to simplify the writing of the C function.

    Complex foreign type: type foreign type term refers to any Prolog term (e.g. lists, structures...). When such an type is specified the argument is passed to the C function as a PlTerm (GNU Prolog C type equivalent to a long). Several functions are provided to manipulate PlTerm variables (section 9.2). Since the original term is passed to the function it is possible to read its value or to unify it. So the meaning of the mode symbol is less significant. For this reason it is possible to omit the mode symbol. In that case term is equivalent to +term.

    9.1.3  The C function

    The C code is written in a C file which must first include the GNU Prolog header file called gprolog.h. This file contains all GNU Prolog C definitions (constants, types, prototypes,...).

    The type returned by a C function depends on the value of the return foreign option (section 9.1.2). If it is boolean then the C function is of type Bool and shall return TRUE in case of success and FALSE otherwise. If the return option is none the C function is of type void. Finally if it is jump, the function shall return the address of a Prolog predicate and, at the exit of the function, the control is given to that predicate.

    The type of the arguments of the C function depends on the mode and type declaration specified in Template for the corresponding argument as explained in the following sections.

    9.1.4  Input arguments

    An input argument is tested at run-time to check if its type conforms to the foreign type and then it is passed to the C function. The type of the associated C argument is given by the above table (section 9.1.2). For instance, the effective argument Arg associated with +positive foreign declaration is submitted to the following process:
    • if Arg is a variable an instantiation_error is raised.

    • if Arg is neither a variable nor an integer a type_error(integer, Arg) is raised.

    • if Arg is an integer < 0 a domain_error(not_less_than_zero, Arg) is raised.

    • otherwise the value of Arg is passed to the C is passed to the C function as an integer (long).
    When +string is specified the string passed to the function is the internal string of the corresponding atom and should not be modified.

    When +term is specified the term passed to the function is the original Prolog term. It can be read and/or unified. It is also the case when term is specified without any mode symbol.

    9.1.5  Output arguments

    An output argument is tested at run-time to check if its type conforms to the foreign type and it is unified with the value set by the C function. The type of the associated C argument is a pointer to the type given by the above table (section 9.1.2). For instance, the effective argument Arg associated with -positive foreign declaration is handled as follows:
    • if Arg is neither a variable nor an integer a type_error(integer, Arg) is raised.

    • if Arg is an integer < 0 a domain_error(not_less_than_zero, Arg) is raised.

    • otherwise a pointer to an integer (long *) is passed to the C function. If the function returns TRUE the integer stored at this location is unified with Arg.
    When -term is specified, the function must construct a term into the its corresponding argument (which is of type PlTerm *). At the exit of the function this term will be unified with the actual predicate argument.

    9.1.6  Input/output arguments

    Basically an input/output argument is treated as in input argument if it is not a variable, as an output argument otherwise. The type of the associated C argument is a pointer to a FIOArg (GNU Prolog C type) defined as follows:
    typedef struct
        {
         Bool is_var;
         Bool unify;
         union
            {
             long   l;
             char  *s;
             double d;
            }value;
        }FIOArg;
    
    The field is_var is set to TRUE if the argument is a variable and FALSE otherwise. This value can be tested by the C function to determine which treatment to perform. The field unify controls whether the effective argument must be unified at the exit of the C function. Initially unify is set to the same value as is_var (i.e. a variable argument will be unified while a non-variable argument will not) but it can be modified by the C function. The field value stores the value of the argument. It is declared as a C union since there are several kinds of value types. The field s is used for C strings, d for C doubles and l otherwise (int, long, PlTerm). if is_var is FALSE then value contains the input value of the argument with the same conventions as for input arguments (section 9.1.4). At the exit of the function, if unify is TRUE value must contain the value to unify with the same conventions as for output arguments (section 9.1.5).

    For instance, the effective argument Arg associated with ?positive foreign declaration is handled as follows:
    • if Arg is a variable is_var and unify are set to TRUE else to FALSE and its value is copied in value.l.

    • if Arg is neither a variable nor an integer a type_error(integer, Arg) is raised.

    • if Arg is an integer < 0 a domain_error(not_less_than_zero, Arg) is raised.

    • otherwise a pointer to the FIOArg (FIOArg *) is passed to the C function. If the function returns TRUE and if unify is TRUE the value stored in value.l is unified with Arg.

    9.1.7  Writing non-deterministic C code

    The interface allows the user to write non-deterministic C code. When a C function is non-deterministic, a choice-point is created for this function. When a failure occurs, if all more recent non-deterministic code are finished, the function is re-invoked. It is then important to inform Prolog when there is no more solution (i.e. no more choice) for a non-deterministic code. So, when no more choices remains the function must remove the choice-point. The interface increments a counter each time the function is re-invoked. At the first call this counter is equal to 0. This information allows the function to detect its first call. When writing non-deterministic code, it is often useful to record data between consecutive re-invocations of the function. The interface maintains a buffer to record such an information. The size of this buffer is given by choice_size(N) when using foreign/2 (section 9.1.2). This size is the number of (consecutive) longs needed by the C function. Inside the function it is possible to call the following functions/macros:
    void Get_Choice_Counter(void)
    TYPE Get_Choice_Buffer (TYPE)
    void No_More_Choice    (void)
    
    The function Get_Choice_Counter() returns the value of the invocation counter (0 at the first call).

    The macro Get_Choice_Buffer(TYPE) returns a pointer to the buffer (casted to TYPE).

    The function No_More_Choice() deletes the choice point associated with the function.

    9.1.8  Example: input and output arguments

    All examples presented here can be found in the ExamplesC sub-directory of the distribution, in the files examp.pl (Prolog part) and examp_c.c (C part).

    Let us define a predicate first_occurrence(A, C, P) which unifies P with the position (from 0) of the first occurrence of the character C in the atom A. The predicate must fail if C does not appear in A.

    In the prolog file examp.pl:
    :- foreign(first_occurrence(+string, +char, -positive)).
    In the C file examp_c.c:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    first_occurrence(char *str, long c, long *pos)
    {
      char *p;
    
      p = strchr(str, c);
      if (p == NULL)                /* C does not appear in A */
        return FALSE;               /* fail */
    
      *pos = p - str;               /* set the output argument */
      return TRUE;                  /* succeed */
    }
    
    The compilation produces an executable called examp:
    % gplc examp.pl examp_c.c
    Examples of use:
    | ?- first_occurrence(prolog, p, X).
    
    X = 0
    
    | ?- first_occurrence(prolog, k, X).
    
    no
    
    | ?- first_occurrence(prolog, A, X).
    {exception: error(instantiation_error,first_occurrence/3)}
    
    | ?- first_occurrence(prolog, 1 ,X).
    {exception: error(type_error(character,1),first_occurrence/3)}
    

    9.1.9  Example: non-deterministic code

    We here define a predicate occurrence(A, C, P) which unifies P with the position (from 0) of one occurrence of the character C in the atom A. The predicate will fail if C does not appear in A. The predicate is re-executable on backtracking. The information that must be recorded between two invocations of the function is the next starting position in A to search for C.

    In the prolog file examp.pl:
    :- foreign(occurrence(+string, +char, -positive), [choice_size(1)]).
    In the C file examp_c.c:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    occurrence(char *str, long c, long *pos)
    {
      char **info_pos;
      char *p;
    
      info_pos = Get_Choice_Buffer(char **); /* recover the buffer */
    
      if (Get_Choice_Counter() == 0)        /* first invocation ? */
        *info_pos = str;
    
      p = strchr(*info_pos, c);
      if (p == NULL)                /* C does not appear */
        {
          No_More_Choice();         /* remove choice-point */
          return FALSE;             /* fail */
        }
    
      *pos = p - str;               /* set the output argument */
      *info_pos = p + 1;            /* update next starting pos */
      return TRUE;                  /* succeed */
    }
    
    The compilation produces an executable called examp:
    % gplc examp.pl examp_c.c
    Examples of use:
    | ?- occurrence(prolog, o, X).
     
    X = 2 ?    (here the user presses ; to compute another solution)
     
    X = 4 ?    (here the user presses ; to compute another solution)
     
    no    (no more solution)
     
    | ?- occurrence(prolog, k, X).
     
    no
    In the first example when the second (the last) occurrence is found (X=4) the choice-point remains and the failure is detected only when another solution is requested (by pressing ;). It is possible to improve this behavior by deleting the choice-point when there is no more occurrence. To do this it is necessary to do one search ahead. The information stored is the position of the next occurrence. Let us define such a behavior for the predicate occurrence2/3.

    In the prolog file examp.pl:
    :- foreign(occurrence2(+string, +char, -positive), [choice_size(1)]).
    In the C file examp_c.c:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    occurrence2(char *str, long c, long *pos)
    {
      char **info_pos;
      char *p;
    
      info_pos = Get_Choice_Buffer(char **); /* recover the buffer */
    
      if (Get_Choice_Counter() == 0) /* first invocation ? */
        {
          p = strchr(str, c);
          if (p == NULL)            /* C does not appear at all */
            {
              No_More_Choice();     /* remove choice-point */
              return FALSE;         /* fail */
            }
    
          *info_pos = p;
        }
                                    /* info_pos = an occurrence */
      *pos = *info_pos - str;       /* set the output argument */
    
      p = strchr(*info_pos + 1, c);
      if (p == NULL)                /* no more occurrence */
        No_More_Choice();           /* remove choice-point */
      else
        *info_pos = p;              /* else update next solution */
    
      return TRUE;                  /* succeed */
    }
    
    Examples of use:
    | ?- occurrence2(prolog, l, X).
     
    X = 3    (here the user is not prompted since there is no more alternative)
     
    | ?- occurrence2(prolog, o, X).
     
    X = 2 ?    (here the user presses ; to compute another solution)
     
    X = 4    (here the user is not prompted since there is no more alternative)

    9.1.10  Example: input/output arguments

    We here define a predicate char_ascii(Char, Code) which converts in both directions the character Char and its character-code Code. This predicate is then similar to char_code/2 (section 7.19.4).

    In the prolog file examp.pl:
    :- foreign(char_ascii(?char, ?code), [fct_name('Char_Ascii')]).
    In the C file examp_c.c:
    #include "gprolog.h"
    
    Bool
    char_ascii(FIOArg *c, FIOArg *ascii)
    {
      if (!c->is_var)               /* Char is not a variable */
        {
          ascii->unify = TRUE;      /* enforce unif. of Code */
          ascii->value.l = c->value.l; /* set Code */
          return TRUE;              /* succeed */
        }
    
      if (ascii->is_var)            /* Code is also a variable */
        Pl_Err_Instantiation();     /* emit instantiation_error */
    
      c->value.l = ascii->value.l;  /* set Char */
      return TRUE;                  /* succeed */
    }
    
    If Char is instantiated it is necessary to enforce the unification of Code since it could be instantiated. Recall that by default if an input/output argument is instantiated it will not be unified at the exit of the function (section 9.1.6). If both Char and Code are variables the function raises an instantiation_error. The way to raise Prolog errors is described later (section 9.3).

    The compilation produces an executable called examp:
    % gplc examp.pl examp_c.c
    Examples of use:
    | ?- char_ascii(a, X).
    
    X = 97
    
    | ?- char_ascii(X, 65).
    
    X = 'A'
    
    | ?- char_ascii(a, 12).
    
    no
    
    | ?- char_ascii(X, X).
    {exception: error(instantiation_error,char_ascii/2)}
    
    | ?- char_ascii(1, 12).
    {exception: error(type_error(character,1),char_ascii/2)}
    

    9.2  Manipulating Prolog terms

    9.2.1  Introduction

    In the following we presents a set of functions to manipulate Prolog terms. For simple foreign terms the functions manipulate simple C types (section 9.1.2).

    Functions managing lists handle an array of 2 elements (of type PlTerm) containing the terms corresponding to the head and the tail of the list. For the empty list NULL is passed as the array. These functions require to flatten a list in each sub-list. To simplify the management of proper lists (i.e. lists terminated by []) a set of functions is provided that handle the number of elements of the list (an integer) and an array whose elements (of type PlTerm) are the elements of the list. The caller of these functions must provide the array.

    Functions managing compound terms handle a functor (the principal functor of the term), an arity N ≥ 0 and an array of N elements (of type PlTerm) containing the sub-terms of the compound term. Since a list is a special case of compound term (functor = '.' and arity=2) it is possible to use any function managing compound terms to deal with a list but the error detection is not the same. Indeed many functions check if the Prolog argument is correct. The name of a read or unify function checking the Prolog arguments is of the form Name_Check(). For each of these functions there is a also check-free version called Name(). We then only present the name of checking functions.

    9.2.2  Managing Prolog atoms

    Each atom has a unique internal key which corresponds to its index in the GNU Prolog atom table. It is possible to obtain the information about an atom and to create new atoms using:
    char *Atom_Name           (int atom)
    int   Atom_Length         (int atom)
    Bool  Atom_Needs_Quote    (int atom)
    Bool  Atom_Needs_Scan     (int atom)
    Bool  Is_Valid_Atom       (int atom)
    int   Create_Atom         (char *str)
    int   Create_Allocate_Atom(char *str)
    int   Find_Atom           (char *str)
    int   ATOM_CHAR           (char c)
    int   atom_nil
    int   atom_false
    int   atom_true
    int   atom_end_of_file
    
    The macro Atom_Name(atom) returns the internal string of atom (this string should not be modified). The function Atom_Lengh(atom) returns the length (of the name) of atom.

    The function Atom_Needs_Scan(atom) indicates if the canonical form of atom needs to be quoted as done by writeq/2 (section 7.14.6). In that case Atom_Needs_Scan(atom) indicates if this simply comes down to write quotes around the name of atom or if it necessary to scan each character of the name because there are some non-printable characters (or included quote characters). The function Is_Valid_Atom(atom) is true only if atom is the internal key of an existing atom.

    The function Create_Atom(str) adds a new atom whose name is the content of str to the system and returns its internal key. If the atom already exists its key is simply returned. The string str passed to the function should not be modified later. The function Create_Allocate_Atom(str) is provided when this condition cannot be ensured. It simply makes a dynamic copy of str.

    The function Find_Atom(str) returns the internal key of the atom whose name is str or -1 if does not exist.

    All atoms corresponding to a single character already exist and their key can be obtained via the macro ATOM_CHAR. For instance ATOM_CHAR('.') is the atom associated with '.' (this atom is the functor of lists). The other variables correspond to the internal key of frequently used atoms: [], false, true and end_of_file.

    9.2.3  Reading Prolog terms

    The name of all functions presented here are of the form Rd_Name_Check(). They all check the validity of the Prolog term to read emitting appropriate errors if necessary. Each function has a check-free version called Rd_Name().

    Simple foreign types: for each simple foreign type (section 9.1.2) there is a read function (used by the interface when an input argument is provided):
    long    Rd_Integer_Check  (PlTerm term)
    long    Rd_Positive_Check (PlTerm term)
    double  Rd_Float_Check    (PlTerm term)
    double  Rd_Number_Check   (PlTerm term)
    int     Rd_Atom_Check     (PlTerm term)
    int     Rd_Boolean_Check  (PlTerm term)
    int     Rd_Char_Check     (PlTerm term)
    int     Rd_In_Char_Check  (PlTerm term)
    int     Rd_Code_Check     (PlTerm term)
    int     Rd_In_Code_Check  (PlTerm term)
    int     Rd_Byte_Check     (PlTerm term)
    int     Rd_In_Byte_Check  (PlTerm term)
    char   *Rd_String_Check   (PlTerm term)
    char   *Rd_Chars_Check    (PlTerm term)
    char   *Rd_Codes_Check    (PlTerm term)
    int     Rd_Chars_Str_Check(PlTerm term, char *str)
    int     Rd_Codes_Str_Check(PlTerm term, char *str)
    
    All functions returning a C string (char *) use a same buffer. The function Rd_Chars_Str_Check() is similar to Rd_Chars_Check() but accepts as argument a string to store the result and returns the length of that string (which is also the length of the Prolog list). Similarly for Rd_Codes_Str_Check().

    Complex terms: the following functions return the sub-arguments (terms) of complex terms as an array of PlTerm except Rd_Proper_List_Check() which returns the size of the list read (and initializes the array element). Refer to the introduction of this section for more information about the arguments of complex functions (section 9.2.1).
    int     Rd_Proper_List_Check(PlTerm term, PlTerm *arg)
    PlTerm *Rd_List_Check       (PlTerm term)
    PlTerm *Rd_Compound_Check   (PlTerm term, int *functor, int *arity)
    PlTerm *Rd_Callable_Check   (PlTerm term, int *functor, int *arity)
    

    9.2.4  Unifying Prolog terms

    The name of all functions presented here are of the form Un_Name_Check(). They all check the validity of the Prolog term to unify emitting appropriate errors if necessary. Each function has a check-free version called Un_Name().

    Simple foreign types: for each simple foreign type (section 9.1.2) there is an unify function (used by the interface when an output argument is provided):
    Bool Un_Integer_Check (long n,    PlTerm term)
    Bool Un_Positive_Check(long n,    PlTerm term)
    Bool Un_Float_Check   (double n,  PlTerm term)
    Bool Un_Number_Check  (double n,  PlTerm term)
    Bool Un_Atom_Check    (int atom,  PlTerm term)
    Bool Un_Boolean_Check (int b,     PlTerm term)
    Bool Un_Char_Check    (int c,     PlTerm term)
    Bool Un_In_Char_Check (int c,     PlTerm term)
    Bool Un_Code_Check    (int c,     PlTerm term)
    Bool Un_In_Code_Check (int c,     PlTerm term)
    Bool Un_Byte_Check    (int b,     PlTerm term)
    Bool Un_In_Byte_Check (int b,     PlTerm term)
    Bool Un_String_Check  (char *str, PlTerm term)
    Bool Un_Chars_Check   (char *str, PlTerm term)
    Bool Un_Codes_Check   (char *str, PlTerm term)
    
    The function Un_Number_Check(n, term) unifies term with an integer if n is an integer, with a floating point number otherwise. The function Un_String_Check(str, term) creates the atom corresponding to str and then unifies term with it (same as Un_Atom_Check(Create_Allocate_Atom(str), term)).

    Complex terms: the following functions accept the sub-arguments (terms) of complex terms as an array of PlTerm. Refer to the introduction of this section for more information about the arguments of complex functions (section 9.2.1).
    Bool Un_Proper_List_Check(int size, PlTerm *arg, PlTerm term)
    Bool Un_List_Check       (PlTerm *arg, PlTerm term)
    Bool Un_Compound_Check   (int functor, int arity, PlTerm *arg,
                              PlTerm term)
    Bool Un_Callable_Check   (int functor, int arity, PlTerm *arg,
                              PlTerm term)
    
    All these functions check the type of the term to unify and return the result of the unification. Generally if an unification fails the C function returns FALSE to enforce a failure. However if there are several arguments to unify and if an unification fails then the C function returns FALSE and the type of other arguments has not been checked. Normally all error cases are tested before doing any work to be sure that the predicate fails/succeeds only if no error condition is satisfied. So a good method is to check if the validity of all arguments to unify and later to do the unification (using check-free functions). Obviously if there is only one to unify it is more efficient to use a unify function checking the argument. For the other cases the interface provides a set of functions to check the type of a term.

    Simple foreign types: for each simple foreign type (section 9.1.2) there is check-for-unification function (used by the interface when an output argument is provided):
    void Check_For_Un_Integer (PlTerm term)
    void Check_For_Un_Positive(PlTerm term)
    void Check_For_Un_Float   (PlTerm term)
    void Check_For_Un_Number  (PlTerm term)
    void Check_For_Un_Atom    (PlTerm term)
    void Check_For_Un_Boolean (PlTerm term)
    void Check_For_Un_Char    (PlTerm term)
    void Check_For_Un_In_Char (PlTerm term)
    void Check_For_Un_Code    (PlTerm term)
    void Check_For_Un_In_Code (PlTerm term)
    void Check_For_Un_Byte    (PlTerm term)
    void Check_For_Un_In_Byte (PlTerm term)
    void Check_For_Un_String  (PlTerm term)
    void Check_For_Un_Chars   (PlTerm term)
    void Check_For_Un_Codes   (PlTerm term)
    
    Complex terms: the following functions check the validity of complex terms:
    void Check_For_Un_List    (PlTerm term)
    void Check_For_Un_Compound(PlTerm term)
    void Check_For_Un_Callable(PlTerm term)
    void Check_For_Un_Variable(PlTerm term)
    
    The function Check_For_Un_List(term) checks if term can be unified with a list. This test is done for the entire list (not only for the functor/arity of term but also recursively on the tail of the list). The function Check_For_Un_Variable(term) ensures that term is not currently instantiated. These functions can be defined using functions to test the type of a Prolog term (section 9.2.6) and functions to raise Prolog errors (section 9.3). For instance Check_For_Un_List(term) is defined as follows:
    void Check_For_Un_List(PlTerm term)
    {
     if (!Blt_List_Or_Partial_List(term))
         Pl_Err_Type(type_list, term);
    }
    

    9.2.5  Creating Prolog terms

    These functions are provided to creates Prolog terms. Each function returns a PlTerm containing the created term.

    Simple foreign types: for each simple foreign type (section 9.1.2) there is a creation function:
    PlTerm Mk_Integer (long n)
    PlTerm Mk_Positive(long n)
    PlTerm Mk_Float   (double n)
    PlTerm Mk_Number  (double n)
    PlTerm Mk_Atom    (int atom)
    PlTerm Mk_Boolean (int b)
    PlTerm Mk_Char    (int c)
    PlTerm Mk_In_Char (int c)
    PlTerm Mk_Code    (int c)
    PlTerm Mk_In_Code (int c)
    PlTerm Mk_Byte    (int b)
    PlTerm Mk_In_Byte (int b)
    PlTerm Mk_String  (char *str)
    PlTerm Mk_Chars   (char *str)
    PlTerm Mk_Codes   (char *str)
    
    The function Mk_Number(n, term) initializes term with an integer if n is an integer, with a floating point number otherwise. The function Mk_String(str) first creates an atom corresponding to str and then returns that Prolog atom (i.e. equivalent to Mk_Atom(Create_Allocate_Atom(str))).

    Complex terms: the following functions accept the sub-arguments (terms) of complex terms as an array of PlTerm. Refer to the introduction of this section for more information about the arguments of complex functions (section 9.2.1).
    PlTerm Mk_Proper_List(int size, PlTerm *arg)
    PlTerm Mk_List       (PlTerm *arg)
    PlTerm Mk_Compound   (int functor, int arity, PlTerm *arg)
    PlTerm Mk_Callable   (int functor, int arity, PlTerm *arg)
    

    9.2.6  Testing the type of Prolog terms

    The following functions test the type of a Prolog term. Each function corresponds to a type testing built-in predicate (section 7.1.1).
    Bool Blt_Var                 (PlTerm term)
    Bool Blt_Non_Var             (PlTerm term)
    Bool Blt_Atom                (PlTerm term)
    Bool Blt_Integer             (PlTerm term)
    Bool Blt_Float               (PlTerm term)
    Bool Blt_Number              (PlTerm term)
    Bool Blt_Atomic              (PlTerm term)
    Bool Blt_Compound            (PlTerm term)
    Bool Blt_Callable            (PlTerm term)
    Bool Blt_List                (PlTerm term)
    Bool Blt_Partial_List        (PlTerm term)
    Bool Blt_List_Or_Partial_List(PlTerm term)
    Bool Blt_Fd_Var              (PlTerm term)
    Bool Blt_Non_Fd_Var          (PlTerm term)
    Bool Blt_Generic_Var         (PlTerm term)
    Bool Blt_Non_Generic_Var     (PlTerm term)
    int  Type_Of_Term            (PlTerm term)
    int  List_Length             (PlTerm list)
    
    The function Type_Of_Term(term) returns the type of term, the following constants can be used to test this type (e.g. in a switch instruction):
    • PLV: Prolog variable.

    • FDV: finite domain variable.

    • INT: integer.

    • FLT: floating point number.

    • ATM: atom.

    • LST: list.

    • STC: structure
    The tag LST means a term whose principal functor is '.' and whose arity is 2 (recall that the empty list is the atom []). The tag STC means any other compound term.

    The function List_Length(list) returns the number of elements of the list (0 for the empty list). If list is not a list this function returns -1.

    9.2.7  Comparing Prolog terms

    The following functions compares Prolog terms. Each function corresponds to a comparison built-in predicate (section 7.3.2).
    Bool Blt_Term_Eq (PlTerm term1, PlTerm term2)
    Bool Blt_Term_Neq(PlTerm term1, PlTerm term2)
    Bool Blt_Term_Lt (PlTerm term1, PlTerm term2)
    Bool Blt_Term_Lte(PlTerm term1, PlTerm term2)
    Bool Blt_Term_Gt (PlTerm term1, PlTerm term2)
    Bool Blt_Term_Gte(PlTerm term1, PlTerm term2)
    
    All these functions are based on a general comparison function returning a negative integer if term1 is less than term2, 0 if they are equal and a positive integer otherwise:
    int Term_Compare(PlTerm term1, PlTerm term2)
    

    9.2.8  Copying Prolog terms

    The following functions make a copy of a Prolog term:
    void Copy_Term           (PlTerm *dst_adr, PlTerm *src_adr)
    void Copy_Contiguous_Term(PlTerm *dst_adr, PlTerm *src_adr)
    int  Term_Size           (PlTerm term)
    
    The function Copy_Term(dst_adr, src_adr) makes a copy of the term located at src_adr and stores it from the address given by dst_adr. The result is a contiguous term. If it can be ensured that the source term is a contiguous term (i.e. result of a previous copy) the function Copy_Contiguous_Term() can be used instead (it is faster). In any case, sufficient space should be available for the copy (i.e. from dst_adr). The function Term_Size(term) returns the number of PlTerm needed by term.

    9.2.9  Comparing and evaluating arithmetic expressions

    The following functions compare arithmetic expressions. Each function corresponds to a comparison built-in predicate (section 7.6.3).
    Bool Blt_Eq (PlTerm expr1, PlTerm expr2)
    Bool Blt_Neq(PlTerm expr1, PlTerm expr2)
    Bool Blt_Lt (PlTerm expr1, PlTerm expr2)
    Bool Blt_Lte(PlTerm expr1, PlTerm expr2)
    Bool Blt_Gt (PlTerm expr1, PlTerm expr2)
    Bool Blt_Gte(PlTerm expr1, PlTerm expr2)
    
    The following function evaluates the expression expr and stores its result as a Prolog number (integer or floating point number) in result:
    void Math_Load_Value(PlTerm expr, PlTerm *result)
    
    This function can be followed by a read function (section 9.2.3) to obtain the result.

    9.3  Raising Prolog errors

    The following functions allows a C function to raise a Prolog error. Refer to the section concerning Prolog errors for more information about the effect of raising an error (section 5.3).

    9.3.1  Managing the error context

    When one of the following error function is invoked it refers to the implicit error context (section 5.3.1). This context indicates the name and the arity of the concerned predicate. When using a foreign/2 declaration this context is set by default to the name and arity of the associated Prolog predicate. This can be controlled using the bip_name option (section 9.1.2). In any case, the following functions can also be used to modify this context:
    void Set_C_Bip_Name  (char *functor, int arity)
    void Unset_C_Bip_Name(void)
    
    The function Set_C_Bip_Name(functor, arity) initializes the context of the error with functor and arity (if arity<0 only functor is significant). The function Unset_C_Bip_Name() removes such an initialization (the context is then reset to the last Functor/Arity set by a call to set_bip_name/2 (section 7.22.3). This is useful when writing a C routine to define a context for errors occurring in this routine and, before exiting to restore the previous context.

    9.3.2  Instantiation error

    The following function raises an instantiation error (section 5.3.2):
    void Pl_Err_Instantiation(void)

    9.3.3  Type error

    The following function raises a type error (section 5.3.3):
    void Pl_Err_Type(int atom_type, PlTerm culprit)
    atom_type is (the internal key of) the atom associated with the expected type. For each type name T there is a corresponding predefined atom stored in a global variable whose name is of the form type_T. culprit is the argument which caused the error.

    Example: x is an atom while an integer was expected: Pl_Err_Type(type_integer, x).

    9.3.4  Domain error

    The following function raises a domain error (section 5.3.4):
    void Pl_Err_Domain(int atom_domain, PlTerm culprit)
    atom_domain is (the internal key of) the atom associated with the expected domain. For each domain name D there is a corresponding predefined atom stored in a global variable whose name is of the form domain_D. culprit is the argument which caused the error.

    Example: x is < 0 but should be ≥ 0: Pl_Err_Domain(domain_not_less_than_zero, x).

    9.3.5  Existence error

    The following function raises an existence error (section 5.3.5):
    void Pl_Err_Existence(int atom_object, PlTerm culprit)
    atom_object is (the internal key of) the atom associated with the type of the object. For each object name O there is a corresponding predefined atom stored in a global variable whose name is of the form existence_O. culprit is the argument which caused the error.

    Example: x does not refer to an existing source: Pl_Err_Existence(existence_source_sink, x).

    9.3.6  Permission error

    The following function raises a permission error (section 5.3.6):
    void Pl_Err_Permission(int atom_operation, int atom_permission, PlTerm culprit)
    atom_operation is (the internal key of) the atom associated with the operation which caused the error. For each operation name O there is a corresponding predefined atom stored in a global variable whose name is of the form permission_operation_O. atom_permission is (the internal key of) the atom associated with the tried permission. For each permission name P there is a corresponding predefined atom stored in a global variable whose name is of the form permission_type_P. culprit is the argument which caused the error.

    Example: reading from an output stream x: Pl_Err_Permission(permission_operation_input,
    permission_type_stream, x)
    .

    9.3.7  Representation error

    The following function raises a representation error (section 5.3.7):
    void Pl_Err_Representation(int atom_limit)
    atom_limit is (the internal key of) the atom associated with the reached limit. For each limit name L there is a corresponding predefined atom stored in a global variable whose name is of the form representation_L.

    Example: an arity too big occurs: Pl_Err_Representation(representation_max_arity).

    9.3.8  Evaluation error

    The following function raises an evaluation error (section 5.3.8):
    void Pl_Err_Evaluation(int atom_error)
    atom_error is (the internal key of) the atom associated with the error. For each evaluation error name E there is a corresponding predefined atom stored in a global variable whose name is of the form evaluation_E.

    Example: a division by zero occurs: Pl_Err_Evaluation(evluation_zero_divisor).

    9.3.9  Resource error

    The following function raises a resource error (section 5.3.9):
    void Pl_Err_Resource(int atom_resource)
    atom_resource is (the internal key of) the atom associated with the resource. For each resource error name R there is a corresponding predefined atom stored in a global variable whose name is of the form resource_R.

    Example: too many open streams: Pl_Err_Resource(resource_too_many_open_streams).

    9.3.10  Syntax error

    The following function raises a syntax error (section 5.3.10):
    void Pl_Err_Syntax(int atom_error)
    atom_error is (the internal key of) the atom associated with the error. There is no predefined syntax error atoms.

    Example: a / is expected: Pl_Err_Syntax(Create_Atom("/ expected")).

    The following function emits a syntax error according to the value of the syntax_error Prolog flag (section 7.22.1). This function can then return (if the value of the flag is either warning or fail). In that case the calling function should fail (e.g. returning FALSE). This function accepts a file name (the empty string C "" can be passed), a line and column number and an error message string. Using this function makes it possible to further call the built-in predicate syntax_error_info/4 (section 7.14.4):
    void Emit_Syntax_Error(char *file_name, int line, int column, char *message)
    Example: a / is expected: Emit_Syntax_Error("data", 10, 30, "/ expected").

    9.3.11  System error

    The following function raises a system error (4.3.11, page *):
    void Pl_Err_System(int atom_error)
    atom_error is (the internal key of) the atom associated with the error. There is no predefined system error atoms.

    Example: an invalid pathname is given: Pl_Err_System(Create_Atom("invalid path name")).

    The following function emits a system error associated with an operating system error according to the value of the os_error Prolog flag (section 7.22.1). This function can then return (if the value of the flag is either warning or fail). In that case the calling function should fail (e.g. returning FALSE). This function uses the value of the errno C library variable:
    void Os_Error(void)
    Example: a call to the C Unix function chdir(3) returns -1: Os_Error().

    9.4  Calling Prolog from C

    9.4.1  Introduction

    The following functions allows a C function to call a Prolog predicate:
    void   Pl_Query_Begin        (Bool recoverable)
    int    Pl_Query_Call         (int functor, int arity, PlTerm *arg)
    int    Pl_Query_Next_Solution(void)
    void   Pl_Query_End          (int op)
    PlTerm Pl_Get_Exception      (void)
    void   Pl_Exec_Continuation  (int functor, int arity, PlTerm *arg)
    
    The invocation of a Prolog predicate should be done as follows:
    • open a query using Pl_Query_Begin()

    • compute the first solution using Pl_Query_Call()

    • eventually compute next solutions using Pl_Query_Next_Solution()

    • close the query using Pl_Query_End()
    The function Pl_Query_Begin(recoverable) is used to initialize a query. The argument recoverable shall be set to TRUE if the user wants to recover, at the end of the query, the memory space consumed by the query (in that case an additional choice-point is created). All terms created in the heap, e.g. using Mk_... family functions (section 9.2.5), after the invocation of Pl_Query_Begin() can be recovered when calling Pl_Query_End(TRUE) (see below).

    The function Pl_Query_Call(functor, arity, arg) calls a predicate passing arguments. It is then used to compute the first solution. The arguments functor, arity and arg are similar to those of the functions handling complex terms (section 9.2.1). This function returns:
    • PL_FAILURE (a constant equal to FALSE, i.e. 0) if the query fails.

    • PL_SUCCESS (a constant equal to TRUE, i.e. 1) in case of success. In that case the argument array arg can be used to obtain the unification performed by the query.

    • PL_EXCEPTION (a constant equal to 2). In that case function Pl_Get_Exception() can be used to obtained the exceptional term raised by throw/1 (section 6.2.4).
    The function Pl_Query_Next_Solution() is used to compute a new solution. It must be only used if the result of the previous solution was PL_SUCCESS. This functions returns the same kind of values as Pl_Query_Call() (see above).

    The function Pl_Query_End(op) is used to finish a query. This function mainly manages the remaining alternatives of the query. However, even if the query has no alternatives this function must be used to correctly finish the query. The value of op is:
    • PL_RECOVER: to recover the memory space consumed by the query. After that the state of Prolog stacks is exactly the same as before opening the query. To use this option the query must have been initialized specifying TRUE for recoverable (see above).

    • PL_CUT: to cut remaining alternatives. The effect of this option is similar to a cut after the query.

    • PL_KEEP_FOR_PROLOG: to keep the alternatives for Prolog. This is useful when the query was invoked in a foreign C function. In that case, when the predicate corresponding to the C foreign function is invoked a query is executed and the remaining alternatives are then available as alternatives of that predicate.
    Note that several queries can be nested since a stack of queries is maintained. For instance, it is possible to call a query and before terminating it to call another query. In that case the first execution of Pl_Query_End() will finish the second query (i.e. the inner) and the next execution of Pl_Query_End() will finish the first query.

    Finally, the function Pl_Exec_Continuation(functor, arity, arg) replaces the current calculus by the execution of the specified predicate. The arguments functor, arity and arg are similar to those of the functions handling complex terms (section 9.2.1).

    9.4.2  Example: my_call/1 - a call/1 clone

    We here define a predicate my_call(Goal) which acts like call(Goal) except that we do not handle exceptions (if an exception occurs the goal simply fails):

    In the prolog file examp.pl:
    :- foreign(my_call(term)).
    In the C file examp_c.c:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    my_call(PlTerm goal)
    
    {
      PlTerm *arg;
      int functor, arity;
      int result;
    
      arg = Rd_Callable_Check(goal, &functor, &arity);
      Pl_Query_Begin(FALSE);
      result = Pl_Query_Call(functor, arity, arg);
      Pl_Query_End(PL_KEEP_FOR_PROLOG);
      return (result == PL_SUCCESS);
    }
    
    The compilation produces an executable called examp:
    % gplc examp.pl examp_c.c
    Examples of use:
    | ?- my_call(write(hello)).
    hello
     
    | ?- my_call(for(X,1,3)).
     
    X = 1 ?    (here the user presses ; to compute another solution)
     
    X = 2 ?    (here the user presses ; to compute another solution)
     
    X = 3    (here the user is not prompted since there is no more alternative)
     
    | ?- my_call(1).
    {exception: error(type_error(callable,1),my_call/1)}
     
    | ?- my_call(call(1)).
     
    no
    When my_call(1) is called an error is raised due to the use of Rd_Callable_Check(). However the error raised by my_call(call(1)) is ignored and FALSE (i.e. a failure) is returned by the foreign function.

    To really simulate the behavior of call/1 when an exception is recovered it should be re-raised to be captured by an earlier handler. The idea is then to execute a throw/1 as the continuation. This is what it is done by the following code:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    my_call(PlTerm goal)
    {
      PlTerm *args;
      int functor, arity;
      int result;
    
      args = Rd_Callable_Check(goal, &functor, &arity);
      Pl_Query_Begin(FALSE);
      result = Pl_Query_Call(functor, arity, args);
      Pl_Query_End(PL_KEEP_FOR_PROLOG);
      if (result == PL_EXCEPTION)
        {
          PlTerm except = Pl_Get_Exception();
          Pl_Exec_Continuation(Find_Atom("throw"), 1, &except);
        }
    
      return result;
    }
    
    The following code propagates the error raised by call/1.
    | ?- my_call(call(1)).
    {exception: error(type_error(callable,1),my_call/1)}
    Finally note that a simpler way to define my_call/1 is to use Pl_Exec_Continuation() as follows:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    my_call(PlTerm goal)
    {
      PlTerm *args;
      int functor, arity;
    
      args = Rd_Callable_Check(goal, &functor, &arity);
      Pl_Exec_Continuation(functor, arity, args);
      return TRUE;
    }
    

    9.4.3  Example: recovering the list of all operators

    We here define a predicate all_op(List) which unifies List with the list of all currently defined operators as would be done by: findall(X,current_op(_,_,X),List).

    In the prolog file examp.pl:
    :- foreign(all_op(term)).
    In the C file examp_c.c:
    #include <string.h>
    #include "gprolog.h"
    
    Bool
    all_op(PlTerm list)
    {
      PlTerm op[1024];
      PlTerm args[3];
      int n = 0;
      int result;
    
      Pl_Query_Begin(TRUE);
      args[0] = Mk_Variable();
      args[1] = Mk_Variable();
      args[2] = Mk_Variable();
      result = Pl_Query_Call(Find_Atom("current_op"), 3, args);
      while (result)
        {
          op[n++] = Mk_Atom(Rd_Atom(args[2])); /* arg #2 is the name of the op */
          result = Pl_Query_Next_Solution();
        }
      Pl_Query_End(PL_RECOVER);
    
      return Un_Proper_List_Check(n, op, list);
    }
    
    Note that we know here that there is no source for exception. In that case the result of Pl_Query_Call and Pl_Query_Next_Solution can be considered as a boolean.

    The compilation produces an executable called examp:
    % gplc examp.pl examp_c.c
    Example of use:
    | ?- all_op(L).
    
    L = [:-,:-,\=,=:=,#>=,#<#,@>=,-->,mod,#>=#,**,*,+,+,',',...]
    
    | ?- findall(X,current_op(_,_,X),L).
    
    L = [:-,:-,\=,=:=,#>=,#<#,@>=,-->,mod,#>=#,**,*,+,+,',',...]
    

    9.5  Defining a new C main() function

    GNU Prolog allows the user to define his own main() function. This can be useful to perform several tasks before starting the Prolog engine. To do this simply define a classical main(argc, argv) function. The following functions can then be used:
    int  Start_Prolog         (int argc, char *argv[])
    void Stop_Prolog          (void)
    void Reset_Prolog         (void)
    Bool Try_Execute_Top_Level(void)
    
    The function Start_Prolog(argc, argv) initializes the Prolog engine (argc and argv are the command-line variables). This function collects all linked objects (issued from the compilation of Prolog files) and initializes them. The initialization of a Prolog object file consists in adding to appropriate tables new atoms, new predicates and executing its system directives. A system directive is generated by the Prolog to WAM compiler to reflect a (user) directive executed at compile-time such as op/3 (section 6.1.10). Indeed, when the compiler encounters such a directive it immediately executes it and also generates a system directive to execute it at the start of the executable. When all system directives have been executed the Prolog engine executes all initialization directives defined with initialization/1 (section 6.1.13). The function returns the number of user directives (i.e. initialization/1) executed. This function must be called only once.

    The function Stop_Prolog() stops the Prolog engine. This function must be called only once after all Prolog treatment have been done.

    The function Reset_Prolog() reinitializes the Prolog engine (i.e. reset all Prolog stacks).

    The function Try_Execute_Top_Level() executes the top-level if linked (section 3.4.3) and returns TRUE. If the top-level is not present the functions returns FALSE.

    Here is the definition of the default GNU Prolog main() function:
    int
    Main_Wrapper(int argc, char *argv[])
    {
      int nb_user_directive;
      Bool top_level;
    
      nb_user_directive = Start_Prolog(argc, argv);
    
      top_level = Try_Execute_Top_Level();
    
      Stop_Prolog();
    
      if (top_level || nb_user_directive)
        return 0;
    
      fprintf(stderr,
              "Warning: no initial goal executed\n"
              "   use a directive :- initialization(Goal)\n"
              "   or remove the link option --no-top-level"
              " (or --min-bips or --min-size)\n");
    
      return 1;
    }
    
    int
    main(int argc, char *argv[])
    {
      return Main_Wrapper(argc, argv);
    }
    
    Note that under some circumstances it is necessary to encapsulate the code of main() inside an intermediate function called by main(). Indeed, some C compilers (e.g. gcc) treats main() particularly, producing an uncompatible code w.r.t GNU Prolog. So it is a good idea to always use a wrapper function as shown above.

    9.5.1  Example: asking for ancestors

    In this example we use the following Prolog code (in a file called new_main.pl):
    parent(bob,   mary).
    parent(jane,  mary).
    parent(mary,  peter).
    parent(paul,  peter).
    parent(peter, john).
    
    anc(X, Y):-
            parent(X, Y).
    
    anc(X, Z) :-
            parent(X, Y),
            anc(Y, Z).
    
    The following file (called new_main_c.c) defines a main() function readinf the name of a person and displaying all successors of that person. This is equivalent to the Prolog query: anc(Result, Name).
    static int
    Main_Wrapper(int argc, char *argv[])
    {
      int func;
      WamWord arg[10];
      char str[100];
      char *sol[100];
      int i, nb_sol = 0;
      Bool res;
    
      Start_Prolog(argc, argv);
    
      func = Find_Atom("anc");
      for (;;)
        {
          printf("\nEnter a name (or 'end' to finish): ");
          scanf("%s", str);
    
          if (strcmp(str, "end") == 0)
            break;
    
          Pl_Query_Begin(TRUE);
    
          arg[0] = Mk_Variable();
          arg[1] = Mk_String(str);
          nb_sol = 0;
          res = Pl_Query_Call(func, 2, arg);
          while (res)
            {
              sol[nb_sol++] = Rd_String(arg[0]);
              res = Pl_Query_Next_Solution();
            }
          Pl_Query_End(PL_RECOVER);
    
          for (i = 0; i < nb_sol; i++)
            printf("  solution: %s\n", sol[i]);
          printf("%d solution(s)\n", nb_sol);
        }
    
      Stop_Prolog();
      return 0;
    }
    
    int
    main(int argc, char *argv[])
    {
      return Main_Wrapper(argc, argv);
    }
    
    The compilation produces an executable called new_main:
    % gplc new_main.pl new_main_c.c
    Examples of use:
    Enter a name (or 'end' to finish): john
      solution: peter
      solution: bob
      solution: jane
      solution: mary
      solution: paul
    5 solution(s)
    
    Enter a name (or 'end' to finish): mary
      solution: bob
      solution: jane
    2 solution(s)
    
    Enter a name (or 'end' to finish): end
    


    References

    [1]
    H. Aït-Kaci. “Warren's Abstract Machine, A Tutorial Reconstruction”.
    Logic Programming Series, MIT Press, 1991.
    http://www.vanx.org/archive/wam/wam.html

    [2]
    W.F. Clocksin and C.S. Mellish. Programming in Prolog, Springer-Verlag, 1981.

    [3]
    P. Codognet and D. Diaz. “wamcc: Compiling Prolog to C”.
    In 12th International Conference on Logic Programming, Tokyo, Japan, MIT Press, 1995.
    ftp://ftp.inria.fr/INRIA/Projects/loco/publications/WAMCC/iclp95.pdf

    [4]
    P. Codognet and D. Diaz. “Compiling Constraint in clp(FD)”.
    Journal of Logic Programming, Vol. 27, No. 3, June 1996.
    ftp://ftp.inria.fr/INRIA/Projects/loco/publications/CLP-FD/jlp96.pdf

    [5]
    D. Diaz and P. Codognet. “Design and Implementation of the GNU Prolog System”.
    Journal of Functional and Logic Programming, Vol. 2001, No. 6, October 2001.
    ftp://ftp.inria.fr/INRIA/Projects/loco/publications/GNU-PROLOG/jflp01.pdf

    [6]
    Information technology - Programming languages - Prolog - Part 1: General Core.
    ISO/IEC 13211-1, 1995.

    [7]
    J. Jaffar and J-L. Lassez. “Constraint Logic Programming”.
    In Principles Of Programming Languages, Munich, Germany, January 1987.

    [8]
    P. Van Hentenryck. “Constraint Satisfaction in Logic Programming”.
    Logic Programming Series, The MIT Press, 1989.

    [9]
    D. H. D. Warren. “An Abstract Prolog Instruction Set”.
    Technical Report 309, SRI International, Oct. 1983.

    Index



    Copyright (C) 1999-2007 Daniel Diaz

    Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

    More about the copyright
    This document was translated from LATEX by HEVEA.
    ./gprolog-1.3.0/doc/contents_motif.gif0000644004425400513100000000047410542447571016276 0ustar diazlocoGIF89añp€ÿÿ!þ" Imported from XPM image: toc.xpm!ù,@çÜ6313Æc „BÃ0 Ã0‚ A0 Ã0 Ã0 €Á0 ƒÁ`0€@`0 ƒÁ`  ƒÁ`0€@`0 ƒÁ`0€@`0000000000 0000000000 00000000 000000 0000 000000000 00000000000 00000000000000`À€ ;./gprolog-1.3.0/doc/compil-scheme.eps0000644004425400513100000004016106670772216016013 0ustar diazloco%!PS-Adobe-2.0 EPSF-2.0 %%Title: rfig3.eps %%Creator: fig2dev Version 3.2 Patchlevel 1 %%CreationDate: Mon Mar 8 16:52:59 1999 %%For: aude@borba.inria.fr (Jean-Christophe Aude) %%Orientation: Portrait %%BoundingBox: 0 0 394 499 %%Pages: 0 %%BeginSetup %%EndSetup %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save -69.0 516.0 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /reencdict 12 dict def /ReEncode { reencdict begin /newcodesandnames exch def /newfontname exch def /basefontname exch def /basefontdict basefontname findfont def /newfont basefontdict maxlength dict def basefontdict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName newfontname put newcodesandnames aload pop 128 1 255 { newfont /Encoding get exch /.notdef put } for newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat newfontname newfont definefont pop end } def /isovec [ 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde 8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis 8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron 8#220 /dotlessi 8#230 /oe 8#231 /OE 8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling 8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis 8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot 8#255 /endash 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus 8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph 8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine 8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf 8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute 8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring 8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute 8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute 8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve 8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply 8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex 8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave 8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring 8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute 8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute 8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve 8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide 8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex 8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def /Courier-Bold /Courier-Bold-iso isovec ReEncode /Times-Roman /Times-Roman-iso isovec ReEncode /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def %%EndProlog $F2psBegin 10 setmiterlimit n -1000 9594 m -1000 -1000 l 8707 -1000 l 8707 9594 l cp clip 0.06000 0.06000 sc /Times-Roman-iso ff 180.00 scf sf 2325 1950 m gs 1 -1 sc (WAM) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 2175 m gs 1 -1 sc (files) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 450 m gs 1 -1 sc (Prolog) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 675 m gs 1 -1 sc (files) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 3435 m gs 1 -1 sc (mini-assembly) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 3660 m gs 1 -1 sc (files) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 4935 m gs 1 -1 sc (assembly) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 5160 m gs 1 -1 sc (files) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 6525 m gs 1 -1 sc (object) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 6750 m gs 1 -1 sc (files) dup sw pop neg 0 rm col0 sh gr /Times-Roman-iso ff 180.00 scf sf 6600 3450 m gs 1 -1 sc (FD constraint) col0 sh gr /Times-Roman-iso ff 180.00 scf sf 6600 3675 m gs 1 -1 sc (definition files) col0 sh gr /Times-Roman-iso ff 180.00 scf sf 5850 8250 m gs 1 -1 sc (Prolog/FD libraries) col0 sh gr /Times-Roman-iso ff 180.00 scf sf 5850 8475 m gs 1 -1 sc (and user libraries) col0 sh gr % Polyline 7.500 slw gs clippath 3499 6601 m 3375 6600 l 3485 6543 l 3353 6574 l 3367 6633 l cp clip n 5850 6000 m 3375 6600 l gs col0 s gr gr % arrowhead n 3499 6601 m 3375 6600 l 3485 6543 l 3492 6572 l 3499 6601 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3029 855 m 3000 975 l 2969 855 l 2970 990 l 3030 990 l cp clip n 2998 671 m 3000 975 l gs col0 s gr gr % arrowhead n 3029 855 m 3000 975 l 2969 855 l 2999 855 l 3029 855 l cp gs 0.00 setgray ef gr col0 s % Polyline n 2287 975 m 3787 975 l 3787 1500 l 2287 1500 l cp gs col0 s gr % Polyline gs clippath 3029 1680 m 3000 1800 l 2969 1680 l 2970 1815 l 3030 1815 l cp clip n 2998 1496 m 3000 1800 l gs col0 s gr gr % arrowhead n 3029 1680 m 3000 1800 l 2969 1680 l 2999 1680 l 3029 1680 l cp gs 0.00 setgray ef gr col0 s % Polyline n 2287 2475 m 3787 2475 l 3787 3000 l 2287 3000 l cp gs col0 s gr % Polyline gs clippath 3029 2355 m 3000 2475 l 2969 2355 l 2970 2490 l 3030 2490 l cp clip n 2998 2171 m 3000 2475 l gs col0 s gr gr % arrowhead n 3029 2355 m 3000 2475 l 2969 2355 l 2999 2355 l 3029 2355 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3029 3180 m 3000 3300 l 2969 3180 l 2970 3315 l 3030 3315 l cp clip n 2998 2996 m 3000 3300 l gs col0 s gr gr % arrowhead n 3029 3180 m 3000 3300 l 2969 3180 l 2999 3180 l 3029 3180 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3029 3855 m 3000 3975 l 2969 3855 l 2970 3990 l 3030 3990 l cp clip n 2998 3671 m 3000 3975 l gs col0 s gr gr % arrowhead n 3029 3855 m 3000 3975 l 2969 3855 l 2999 3855 l 3029 3855 l cp gs 0.00 setgray ef gr col0 s % Polyline n 2287 3975 m 3787 3975 l 3787 4500 l 2287 4500 l cp gs col0 s gr % Polyline gs clippath 3029 4680 m 3000 4800 l 2969 4680 l 2970 4815 l 3030 4815 l cp clip n 2998 4496 m 3000 4800 l gs col0 s gr gr % arrowhead n 3029 4680 m 3000 4800 l 2969 4680 l 2999 4680 l 3029 4680 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3029 5355 m 3000 5475 l 2969 5355 l 2970 5490 l 3030 5490 l cp clip n 2998 5171 m 3000 5475 l gs col0 s gr gr % arrowhead n 3029 5355 m 3000 5475 l 2969 5355 l 2999 5355 l 3029 5355 l cp gs 0.00 setgray ef gr col0 s % Polyline n 2287 5475 m 3787 5475 l 3787 6000 l 2287 6000 l cp gs col0 s gr % Polyline gs clippath 3029 6180 m 3000 6300 l 2969 6180 l 2970 6315 l 3030 6315 l cp clip n 2998 5996 m 3000 6300 l gs col0 s gr gr % arrowhead n 3029 6180 m 3000 6300 l 2969 6180 l 2999 6180 l 3029 6180 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 3029 7080 m 3000 7200 l 2969 7080 l 2970 7215 l 3030 7215 l cp clip n 2998 6896 m 3000 7200 l gs col0 s gr gr % arrowhead n 3029 7080 m 3000 7200 l 2969 7080 l 2999 7080 l 3029 7080 l cp gs 0.00 setgray ef gr col0 s % Polyline n 2212 7199 m 3712 7199 l 3712 7724 l 2212 7724 l cp gs col0 s gr % Polyline gs clippath 3029 7905 m 3000 8025 l 2969 7905 l 2970 8040 l 3030 8040 l cp clip n 2998 7721 m 3000 8025 l gs col0 s gr gr % arrowhead n 3029 7905 m 3000 8025 l 2969 7905 l 2999 7905 l 3029 7905 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 5880 3855 m 5851 3975 l 5820 3855 l 5821 3990 l 5881 3990 l cp clip n 5849 3671 m 5851 3975 l gs col0 s gr gr % arrowhead n 5880 3855 m 5851 3975 l 5820 3855 l 5850 3855 l 5880 3855 l cp gs 0.00 setgray ef gr col0 s % Polyline n 5100 3975 m 6600 3975 l 6600 4500 l 5100 4500 l cp gs col0 s gr % Polyline gs clippath 5880 4680 m 5851 4800 l 5820 4680 l 5821 4815 l 5881 4815 l cp clip n 5849 4496 m 5851 4800 l gs col0 s gr gr % arrowhead n 5880 4680 m 5851 4800 l 5820 4680 l 5850 4680 l 5880 4680 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 5880 5355 m 5851 5475 l 5820 5355 l 5821 5490 l 5881 5490 l cp clip n 5849 5171 m 5851 5475 l gs col0 s gr gr % arrowhead n 5880 5355 m 5851 5475 l 5820 5355 l 5850 5355 l 5880 5355 l cp gs 0.00 setgray ef gr col0 s % Polyline n 5100 5475 m 6600 5475 l 6600 6000 l 5100 6000 l cp gs col0 s gr % Polyline gs clippath 3534 8355 m 3414 8325 l 3534 8295 l 3399 8295 l 3399 8355 l cp clip n 4950 8325 m 3414 8325 l gs col0 s gr gr % arrowhead n 3534 8355 m 3414 8325 l 3534 8295 l 3534 8325 l 3534 8355 l cp gs 0.00 setgray ef gr col0 s /Courier-Bold-iso ff 180.00 scf sf 3375 1275 m gs 1 -1 sc (pl2wam) dup sw pop neg 0 rm col0 sh gr /Courier-Bold-iso ff 180.00 scf sf 3352 2775 m gs 1 -1 sc (wam2ma) dup sw pop neg 0 rm col0 sh gr /Courier-Bold-iso ff 180.00 scf sf 2700 4257 m gs 1 -1 sc (ma2asm) col0 sh gr /Courier-Bold-iso ff 180.00 scf sf 2700 7518 m gs 1 -1 sc (linker) col0 sh gr /Courier-Bold-iso ff 180.00 scf sf 5640 4275 m gs 1 -1 sc (fd2c) col0 sh gr /Times-Roman-iso ff 180.00 scf sf 6600 4950 m gs 1 -1 sc (C files) col0 sh gr /Courier-Bold-iso ff 180.00 scf sf 5325 5775 m gs 1 -1 sc (C compiler) col0 sh gr /Courier-Bold-iso ff 180.00 scf sf 2564 5775 m gs 1 -1 sc (assembler) col0 sh gr /Times-Roman-iso ff 180.00 scf sf 2325 8400 m gs 1 -1 sc (executable) dup sw pop neg 0 rm col0 sh gr % Polyline n 2587 646 m 2587 300 l 3418 300 l 3418 577 l gs col-1 s gr % Polyline n 3418 577 m 3415 576 l 3410 574 l 3400 570 l 3386 566 l 3368 560 l 3349 554 l 3328 548 l 3307 543 l 3286 539 l 3267 537 l 3248 536 l 3229 538 l 3210 542 l 3194 547 l 3177 553 l 3160 560 l 3141 569 l 3122 580 l 3102 591 l 3082 604 l 3061 617 l 3040 631 l 3019 644 l 2998 657 l 2978 670 l 2957 681 l 2938 691 l 2918 700 l 2900 707 l 2882 712 l 2864 716 l 2845 718 l 2825 719 l 2805 717 l 2783 713 l 2760 708 l 2736 701 l 2710 693 l 2685 684 l 2661 675 l 2639 667 l 2620 659 l 2605 653 l 2595 649 l 2590 647 l 2587 646 l gs col-1 s gr % Polyline n 2587 2146 m 2587 1800 l 3418 1800 l 3418 2077 l gs col-1 s gr % Polyline n 3418 2077 m 3415 2076 l 3410 2074 l 3400 2070 l 3386 2066 l 3368 2060 l 3349 2054 l 3328 2048 l 3307 2043 l 3286 2039 l 3267 2037 l 3248 2036 l 3229 2038 l 3210 2042 l 3194 2047 l 3177 2053 l 3160 2060 l 3141 2069 l 3122 2080 l 3102 2091 l 3082 2104 l 3061 2117 l 3040 2131 l 3019 2144 l 2998 2157 l 2978 2170 l 2957 2181 l 2938 2191 l 2918 2200 l 2900 2207 l 2882 2212 l 2864 2216 l 2845 2218 l 2825 2219 l 2805 2217 l 2783 2213 l 2760 2208 l 2736 2201 l 2710 2193 l 2685 2184 l 2661 2175 l 2639 2167 l 2620 2159 l 2605 2153 l 2595 2149 l 2590 2147 l 2587 2146 l gs col-1 s gr % Polyline n 2587 3646 m 2587 3300 l 3418 3300 l 3418 3577 l gs col-1 s gr % Polyline n 3418 3577 m 3415 3576 l 3410 3574 l 3400 3570 l 3386 3566 l 3368 3560 l 3349 3554 l 3328 3548 l 3307 3543 l 3286 3539 l 3267 3537 l 3248 3536 l 3229 3538 l 3210 3542 l 3194 3547 l 3177 3553 l 3160 3560 l 3141 3569 l 3122 3580 l 3102 3591 l 3082 3604 l 3061 3617 l 3040 3631 l 3019 3644 l 2998 3657 l 2978 3670 l 2957 3681 l 2938 3691 l 2918 3700 l 2900 3707 l 2882 3712 l 2864 3716 l 2845 3718 l 2825 3719 l 2805 3717 l 2783 3713 l 2760 3708 l 2736 3701 l 2710 3693 l 2685 3684 l 2661 3675 l 2639 3667 l 2620 3659 l 2605 3653 l 2595 3649 l 2590 3647 l 2587 3646 l gs col-1 s gr % Polyline n 2587 5146 m 2587 4800 l 3418 4800 l 3418 5077 l gs col-1 s gr % Polyline n 3418 5077 m 3415 5076 l 3410 5074 l 3400 5070 l 3386 5066 l 3368 5060 l 3349 5054 l 3328 5048 l 3307 5043 l 3286 5039 l 3267 5037 l 3248 5036 l 3229 5038 l 3210 5042 l 3194 5047 l 3177 5053 l 3160 5060 l 3141 5069 l 3122 5080 l 3102 5091 l 3082 5104 l 3061 5117 l 3040 5131 l 3019 5144 l 2998 5157 l 2978 5170 l 2957 5181 l 2938 5191 l 2918 5200 l 2900 5207 l 2882 5212 l 2864 5216 l 2845 5218 l 2825 5219 l 2805 5217 l 2783 5213 l 2760 5208 l 2736 5201 l 2710 5193 l 2685 5184 l 2661 5175 l 2639 5167 l 2620 5159 l 2605 5153 l 2595 5149 l 2590 5147 l 2587 5146 l gs col-1 s gr % Arc gs n 3019.5 6181.0 678.0 118.1 61.9 arcn gs col-1 s gr gr % Arc gs n 3019.5 5821.0 678.0 118.1 61.9 arcn gs col-1 s gr gr % Arc gs n 3019.5 7017.0 678.0 -61.9 -118.1 arcn gs col-1 s gr gr % Polyline n 3339 6779 m 3339 6419 l gs col-1 s gr % Polyline n 2700 6419 m 2700 6779 l gs col-1 s gr % Arc gs n 3019.5 7907.0 678.0 118.1 61.9 arcn gs col-1 s gr gr % Arc gs n 3019.5 7547.0 678.0 118.1 61.9 arcn gs col-1 s gr gr % Arc gs n 3019.5 8743.0 678.0 -61.9 -118.1 arcn gs col-1 s gr gr % Polyline n 3339 8505 m 3339 8145 l gs col-1 s gr % Polyline n 2700 8145 m 2700 8505 l gs col-1 s gr % Polyline n 5426 3646 m 5426 3300 l 6257 3300 l 6257 3577 l gs col-1 s gr % Polyline n 6257 3577 m 6254 3576 l 6249 3574 l 6239 3570 l 6225 3566 l 6207 3560 l 6188 3554 l 6167 3548 l 6146 3543 l 6125 3539 l 6106 3537 l 6087 3536 l 6068 3538 l 6049 3542 l 6033 3547 l 6016 3553 l 5999 3560 l 5980 3569 l 5961 3580 l 5941 3591 l 5921 3604 l 5900 3617 l 5879 3631 l 5858 3644 l 5837 3657 l 5817 3670 l 5796 3681 l 5777 3691 l 5757 3700 l 5739 3707 l 5721 3712 l 5703 3716 l 5684 3718 l 5664 3719 l 5644 3717 l 5622 3713 l 5599 3708 l 5575 3701 l 5549 3693 l 5524 3684 l 5500 3675 l 5478 3667 l 5459 3659 l 5444 3653 l 5434 3649 l 5429 3647 l 5426 3646 l gs col-1 s gr % Polyline n 5426 5146 m 5426 4800 l 6257 4800 l 6257 5077 l gs col-1 s gr % Polyline n 6257 5077 m 6254 5076 l 6249 5074 l 6239 5070 l 6225 5066 l 6207 5060 l 6188 5054 l 6167 5048 l 6146 5043 l 6125 5039 l 6106 5037 l 6087 5036 l 6068 5038 l 6049 5042 l 6033 5047 l 6016 5053 l 5999 5060 l 5980 5069 l 5961 5080 l 5941 5091 l 5921 5104 l 5900 5117 l 5879 5131 l 5858 5144 l 5837 5157 l 5817 5170 l 5796 5181 l 5777 5191 l 5757 5200 l 5739 5207 l 5721 5212 l 5703 5216 l 5684 5218 l 5664 5219 l 5644 5217 l 5622 5213 l 5599 5208 l 5575 5201 l 5549 5193 l 5524 5184 l 5500 5175 l 5478 5167 l 5459 5159 l 5444 5153 l 5434 5149 l 5429 5147 l 5426 5146 l gs col-1 s gr % Arc gs n 5325.5 7907.0 678.0 118.1 61.9 arcn gs col-1 s gr gr % Arc gs n 5325.5 7547.0 678.0 118.1 61.9 arcn gs col-1 s gr gr % Arc gs n 5325.5 8743.0 678.0 -61.9 -118.1 arcn gs col-1 s gr gr % Polyline n 5645 8505 m 5645 8145 l gs col-1 s gr % Polyline n 5006 8145 m 5006 8505 l gs col-1 s gr $F2psEnd rs ./gprolog-1.3.0/doc/copyright.tex0000644004425400513100000000004410547152502015267 0ustar diazlocoCopyright (C) 1999-2007 Daniel Diaz ./gprolog-1.3.0/doc/references.tex0000644004425400513100000000400210547152502015376 0ustar diazloco\newpage %BEGIN LATEX \addcontentsline{toc}{section}{\numberline{}References} %END LATEX \begin{thebibliography}{99} \bibitem{Ait-Kaci91} H. A\"{\i}t-Kaci. \newblock ``Warren's Abstract Machine, A Tutorial Reconstruction''. \\ \newblock Logic Programming Series, MIT Press, 1991. \\ \newblock \OneUrl{http://www.vanx.org/archive/wam/wam.html} \bibitem{Clock} W.F. Clocksin and C.S. Mellish. \newblock Programming in Prolog, Springer-Verlag, 1981. \bibitem{wamcc} P. Codognet and D. Diaz. \newblock ``{\tt wamcc}: Compiling Prolog to C''.\\ \newblock In {\em 12th International Conference on Logic Programming}, Tokyo, Japan, MIT Press, 1995. \\ \newblock \OneUrl{ftp://ftp.inria.fr/INRIA/Projects/loco/publications/WAMCC/iclp95.pdf} \bibitem{long-clp-fd} P. Codognet and D. Diaz. \newblock ``Compiling Constraint in {\tt clp(FD)}''. \\ \newblock {\em Journal of Logic Programming}, Vol. 27, No. 3, June 1996. \\ \newblock \OneUrl{ftp://ftp.inria.fr/INRIA/Projects/loco/publications/CLP-FD/jlp96.pdf} \bibitem{gnu-prolog} D. Diaz and P. Codognet. \newblock ``Design and Implementation of the GNU Prolog System''. \\ \newblock {\em Journal of Functional and Logic Programming}, Vol. 2001, No. 6, October 2001. \\ \newblock \OneUrl{ftp://ftp.inria.fr/INRIA/Projects/loco/publications/GNU-PROLOG/jflp01.pdf} \bibitem{iso-part1} \newblock Information technology - Programming languages - Prolog - Part 1: General Core. \\ \newblock ISO/IEC 13211-1, 1995. %\newblock \OneUrl{http://www.logic-programming.org/prolog\_std.html} \bibitem{Jaffar-Lassez87} J. Jaffar and J-L. Lassez. \newblock ``Constraint Logic Programming''. \\ \newblock In {\em Principles Of Programming Languages}, Munich, Germany, January 1987. \bibitem{pvh89} P. Van Hentenryck. \newblock ``Constraint Satisfaction in Logic Programming''. \\ \newblock Logic Programming Series, The MIT Press, 1989. \bibitem{Warren83} D. H. D. Warren. \newblock ``An Abstract Prolog Instruction Set''. \\ \newblock Technical Report 309, SRI International, Oct. 1983. \end{thebibliography} ./gprolog-1.3.0/doc/README0000644004425400513100000001274610542255754013441 0ustar diazloco GNU-Prolog Documentation 1- Contents of this directory ----------------------------- This directory contains the source of the manual written in LaTeX and several target versions: - gprolog.dvi (DVI version) - gprolog.pdf (PDF version) - gprolog.ps (PostScript version) - gprolog.html (HTML version entirely in one page) - gprolog.chm (Compressed HTML used by MS HTMLHelp under Win32) The html_node directory contains the HTML version in several pages (on per node) (files index.html, gprolog*.html) This manual is also available at http://www.gprolog.org/manual By default, the installation procedure copies each version in a directory INSTALL_DIR/doc (see file ../INSTALL for more details). 2- Rebuilding the manual ------------------------ Each version can be reconstructed using the Makefile (type 'make help' for a brief summary of available targets). Be sure to have the following environment before trying to rebuild the manual: - LaTeX2e (with standard packages) is needed to rebuild the DVI version. - dvips is needed to rebuild the PostScript version from the DVI. - pdflatex is needed to rebuild the PDF version. - HeVeA (version >= 1.06) is required to rebuild the HTML version. HeVeA can be obtained at http://pauillac.inria.fr/~maranget/hevea/ - The HTML Help compiler is needed to rebuild the HTML Help version (see below). 3- The HTML Help Version ------------------------ Microsoft HTML Help (HH for short) is the standard help system for the Win32 platforms (replacing old WinHelp). It is mainly based on HTML files + add-ons (table of contents, index, search facilities,...). A SDK is freely available as a "HTML Help Workshop". To obtain more information and/or the workshop consult: http://msdn.microsoft.com/library/en-us/htmlhelp/html/vsconHH1Start.asp To install the workshop consult the file src/WINDOWS. The HH version of the manual is constructed from the HTML files (html_node/index.html and html_node/gprolog*.html) using a HH project (.hhp) which includes a HH table of contents (.hhc) and a HH index (.hhk). The .hhc and .hhk files are constructed wih HeVeA with a script hh_do_hhc_hhk and 2 .tex files. The result is a compressed (or compiled) HTML file (.chm). The user does not need the entire HTML Help Workshop to view a .chm, only a runtime called "Help Viewer" is necessary. It is provided with recent versions of windows (e.g Windows XP). Else a viewer can be downloaded (file: HHUPD.EXE) from the same URL (also available in C:\Program Files\HTML Help Workshop\REDIST). The .chm version is used by the Win32 GUI Console of GNU Prolog. HTML Help File Formats ---------------------- This information is get from: http://parthe.lpthe.jussieu.fr/~zeitlin/wxWindows/docs/wxwin495.htm#helpformat wxHTML library uses a reduced version of MS HTML Workshop format. Tex2RTF can produce these files when generating HTML, if you set htmlWorkshopFiles to true in your tex2rtf.ini file. (See wxHtmlHelpController for help controller description.) A book consists of three files: header file, contents file and index file. You can make a regular zip archive of these files, plus the HTML and any image files, for wxHTML (or helpview) to read; and the .zip file can optionally be renamed to .htb. Header file (.hhp) Header file must contain these lines (and may contain additional lines which are ignored) : Contents file= Index file= Title= Default topic=<default page to be displayed.htm> All filenames (including the Default topic) are relative to the location of .hhp file. Localization note: In addition, .hhp file may contain line Charset=<rfc_charset> which specifies what charset (e.g. "iso8859_1") was used in contents and index files. Please note that this line is incompatible with MS HTML Help Workshop and it would either silently remove it or complain with some error. See also Writing non-English applications. Contents file (.hhc) Contents file has HTML syntax and it can be parsed by regular HTML parser. It contains exactly one list (<ul>....</ul> statement): <ul> <li> <object type="text/sitemap"> <param name="Name" value="@topic name@"> <param name="ID" value=@numeric_id@> <param name="Local" value="@filename.htm@"> </object> <li> <object type="text/sitemap"> <param name="Name" value="@topic name@"> <param name="ID" value=@numeric_id@> <param name="Local" value="@filename.htm@"> </object> ... </ul> You can modify value attributes of param tags. topic name is name of chapter/topic as is displayed in contents, filename.htm is HTML page name (relative to .hhp file) and numeric_id is optional - it is used only when you use wxHtmlHelpController::Display(int) Items in the list may be nested - one <li> statement may contain a <ul> sub-statement: <ul> <li> <object type="text/sitemap"> <param name="Name" value="Top node"> <param name="Local" value="top.htm"> </object> <ul> <li> <object type="text/sitemap"> <param name="Name" value="subnode in topnode"> <param name="Local" value="subnode1.htm"> </object> ... </ul> <li> <object type="text/sitemap"> <param name="Name" value="Another Top"> <param name="Local" value="top2.htm"> </object> ... </ul> Index file (.hhk) Index files have same format as contents file except that ID params are ignored. ��������������������������./gprolog-1.3.0/doc/compil-scheme.fig���������������������������������������������������������������0000644�0044254�0051310�00000013461�06670772204�015771� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#FIG 3.2 Portrait Center Inches A4 100.00 Single -2 1200 2 6 2587 300 3418 750 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 4 2587 646 2587 300 3418 300 3418 577 3 2 0 1 -1 -1 0 0 -1 0.000 0 0 0 4 3418 577 3210 542 2864 716 2587 646 0.000 -1.000 -1.000 0.000 -6 6 2587 1800 3418 2250 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 4 2587 2146 2587 1800 3418 1800 3418 2077 3 2 0 1 -1 -1 0 0 -1 0.000 0 0 0 4 3418 2077 3210 2042 2864 2216 2587 2146 0.000 -1.000 -1.000 0.000 -6 6 1800 1800 2325 2175 4 2 0 100 0 0 12 0.0000 4 135 480 2325 1950 WAM\001 4 2 0 100 0 0 12 0.0000 4 135 330 2325 2175 files\001 -6 6 1800 300 2325 675 4 2 0 100 0 0 12 0.0000 4 180 480 2325 450 Prolog\001 4 2 0 100 0 0 12 0.0000 4 135 330 2325 675 files\001 -6 6 2587 3300 3418 3750 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 4 2587 3646 2587 3300 3418 3300 3418 3577 3 2 0 1 -1 -1 0 0 -1 0.000 0 0 0 4 3418 3577 3210 3542 2864 3716 2587 3646 0.000 -1.000 -1.000 0.000 -6 6 1185 3300 2325 3660 4 2 0 100 0 0 12 0.0000 4 180 1140 2325 3435 mini-assembly\001 4 2 0 100 0 0 12 0.0000 4 135 330 2325 3660 files\001 -6 6 1605 4800 2325 5160 4 2 0 100 0 0 12 0.0000 4 180 720 2325 4935 assembly\001 4 2 0 100 0 0 12 0.0000 4 135 330 2325 5160 files\001 -6 6 2587 4800 3418 5250 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 4 2587 5146 2587 4800 3418 4800 3418 5077 3 2 0 1 -1 -1 0 0 -1 0.000 0 0 0 4 3418 5077 3210 5042 2864 5216 2587 5146 0.000 -1.000 -1.000 0.000 -6 6 2700 6299 3339 6899 5 1 0 1 -1 -1 0 0 -1 0.000 0 1 0 0 3019.500 6181.000 2700 6779 3019 6859 3339 6779 5 1 0 1 -1 -1 0 0 -1 0.000 0 1 0 0 3019.500 5821.000 2700 6419 3019 6499 3339 6419 5 1 0 1 -1 -1 0 0 -1 0.000 0 1 0 0 3019.500 7017.000 3339 6419 3019 6339 2700 6419 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 2 3339 6779 3339 6419 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 2 2700 6419 2700 6779 -6 6 1800 6375 2325 6750 4 2 0 100 0 0 12 0.0000 4 180 465 2325 6525 object\001 4 2 0 100 0 0 12 0.0000 4 135 330 2325 6750 files\001 -6 6 2700 8025 3339 8625 5 1 0 1 -1 -1 0 0 -1 0.000 0 1 0 0 3019.500 7907.000 2700 8505 3019 8585 3339 8505 5 1 0 1 -1 -1 0 0 -1 0.000 0 1 0 0 3019.500 7547.000 2700 8145 3019 8225 3339 8145 5 1 0 1 -1 -1 0 0 -1 0.000 0 1 0 0 3019.500 8743.000 3339 8145 3019 8065 2700 8145 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 2 3339 8505 3339 8145 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 2 2700 8145 2700 8505 -6 6 5426 3300 6257 3750 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 4 5426 3646 5426 3300 6257 3300 6257 3577 3 2 0 1 -1 -1 0 0 -1 0.000 0 0 0 4 6257 3577 6049 3542 5703 3716 5426 3646 0.000 -1.000 -1.000 0.000 -6 6 6600 3300 7725 3675 4 0 0 100 0 0 12 0.0000 4 135 1050 6600 3450 FD constraint\001 4 0 0 100 0 0 12 0.0000 4 135 1080 6600 3675 definition files\001 -6 6 5426 4800 6257 5250 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 4 5426 5146 5426 4800 6257 4800 6257 5077 3 2 0 1 -1 -1 0 0 -1 0.000 0 0 0 4 6257 5077 6049 5042 5703 5216 5426 5146 0.000 -1.000 -1.000 0.000 -6 6 5006 8025 5645 8625 5 1 0 1 -1 -1 0 0 -1 0.000 0 1 0 0 5325.500 7907.000 5006 8505 5325 8585 5645 8505 5 1 0 1 -1 -1 0 0 -1 0.000 0 1 0 0 5325.500 7547.000 5006 8145 5325 8225 5645 8145 5 1 0 1 -1 -1 0 0 -1 0.000 0 1 0 0 5325.500 8743.000 5645 8145 5325 8065 5006 8145 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 2 5645 8505 5645 8145 2 1 0 1 -1 -1 0 0 -1 0.000 0 0 -1 0 0 2 5006 8145 5006 8505 -6 6 5850 8100 7275 8475 4 0 0 100 0 0 12 0.0000 4 180 1425 5850 8250 Prolog/FD libraries\001 4 0 0 100 0 0 12 0.0000 4 135 1305 5850 8475 and user libraries\001 -6 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 5850 6000 3375 6600 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 2998 671 3000 975 2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 2287 975 3787 975 3787 1500 2287 1500 2287 975 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 2998 1496 3000 1800 2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 2287 2475 3787 2475 3787 3000 2287 3000 2287 2475 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 2998 2171 3000 2475 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 2998 2996 3000 3300 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 2998 3671 3000 3975 2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 2287 3975 3787 3975 3787 4500 2287 4500 2287 3975 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 2998 4496 3000 4800 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 2998 5171 3000 5475 2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 2287 5475 3787 5475 3787 6000 2287 6000 2287 5475 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 2998 5996 3000 6300 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 2998 6896 3000 7200 2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 2212 7199 3712 7199 3712 7724 2212 7724 2212 7199 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 2998 7721 3000 8025 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 5849 3671 5851 3975 2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 5100 3975 6600 3975 6600 4500 5100 4500 5100 3975 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 5849 4496 5851 4800 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 5849 5171 5851 5475 2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 5100 5475 6600 5475 6600 6000 5100 6000 5100 5475 2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 4950 8325 3414 8325 4 2 0 100 0 14 12 0.0000 4 180 630 3375 1275 pl2wam\001 4 2 0 100 0 14 12 0.0000 4 135 630 3352 2775 wam2ma\001 4 0 0 100 0 14 12 0.0000 4 135 630 2700 4257 ma2asm\001 4 0 0 100 0 14 12 0.0000 4 135 630 2700 7518 linker\001 4 2 0 100 0 0 12 0.0000 4 135 825 2325 8400 executable\001 4 0 0 100 0 14 12 0.0000 4 135 420 5640 4275 fd2c\001 4 0 0 100 0 0 12 0.0000 4 135 495 6600 4950 C files\001 4 0 0 100 0 14 12 0.0000 4 180 1050 5325 5775 C compiler\001 4 0 0 100 0 14 12 0.0000 4 135 945 2564 5775 assembler\001 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/�������������������������������������������������������������������������0000777�0044254�0051310�00000000000�10547442376�014001� 5����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/langford.pl��������������������������������������������������������������0000644�0044254�0051310�00000004332�10547152503�016116� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : langford.pl */ /* Title : Langford's problem */ /* Original Source: Daniel Diaz */ /* Date : February 2003 */ /* */ /* The problem L(K,N) is to arrange K sets of numbers 1 to N, so that each */ /* appearance of the number M is M numbers on from the last. We here solve */ /* LL(2,N). The problem admits a solution if N is of the form 4k or 4k-1. */ /* */ /* Solution: */ /* N=4 [4,1,3,1,2,4,3,2] */ /* N=8 [6,1,5,1,8,4,7,6,5,2,4,3,2,8,7,3] */ /* N=11 [11,5,8,1,3,1,10,5,3,9,7,8,11,2,6,4,2,10,7,9,4,6] */ /*-------------------------------------------------------------------------*/ q:- write('N ?'), read_integer(N), statistics(runtime,_), langford(N, L), statistics(runtime, [_, Y]), write(L), nl, write('time : '), write(Y), nl. langford(N, L) :- (N mod 4 =:= 0 ; N mod 4 =:= 3), !, length(U, N), length(V, N), append(U, V, UV), N2 is N * 2, fd_set_vector_max(N2), fd_domain(UV, 1, N2), fd_all_different(UV), set_cstr(U, V, 1), symetric(N, N2, UV), % fd_labelingff(U), fd_labeling(U,[value_method(random), variable_method(random)]), decode(1, N, UV, L). set_cstr([], [], _). set_cstr([X|U], [Y|V], I) :- I1 is I + 1, Y - X #= I1, % also avoid some symetries since enforces X < Y set_cstr(U, V, I1). symetric(N, N2, UV) :- fd_element_var(I1, UV, 1), fd_element_var(I2, UV, N2), I1 #=< I2 - N. decode(I, N, _, []) :- I > N * 2, !. decode(I, N, UV, [Z1|L]) :- I1 is I + 1, nth(Z, UV, I), ( Z > N -> Z1 is Z - N ; Z1 = Z ), decode(I1, N, UV, L). :- initialization(q). ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/Makefile�����������������������������������������������������������������0000644�0044254�0051310�00000004156�10547152503�015431� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GPLC = gplc GPLCFLAGS= --min-size BENCH_FD=alpha bridge cars crypta digit8 donald eq10 eq20 five gardner magic\ multipl partit queens send square send srq magsq qg5 langford BENCH_BOOL=bdiag bdonald bpigeon bqueens bramsey bschur bsend .SUFFIXES: .SUFFIXES: .pl $(SUFFIXES) all: fd bool clean: rm-fd rm-bool rm -f *.exe fd: $(BENCH_FD) rm-fd: rm -f $(BENCH_FD) alpha: alpha.pl $(GPLC) $(GPLCFLAGS) -o alpha alpha.pl bridge: bridge.pl $(GPLC) $(GPLCFLAGS) -o bridge bridge.pl cars: cars.pl $(GPLC) $(GPLCFLAGS) -o cars cars.pl crypta: crypta.pl $(GPLC) $(GPLCFLAGS) -o crypta crypta.pl digit8: digit8.pl $(GPLC) $(GPLCFLAGS) -o digit8 digit8.pl donald: donald.pl $(GPLC) $(GPLCFLAGS) -o donald donald.pl eq10: eq10.pl $(GPLC) $(GPLCFLAGS) -o eq10 eq10.pl eq20: eq20.pl $(GPLC) $(GPLCFLAGS) -o eq20 eq20.pl five: five.pl $(GPLC) $(GPLCFLAGS) -o five five.pl gardner: gardner.pl $(GPLC) $(GPLCFLAGS) -o gardner gardner.pl partit: partit.pl $(GPLC) $(GPLCFLAGS) -o partit partit.pl magic: magic.pl $(GPLC) $(GPLCFLAGS) -o magic magic.pl multipl: multipl.pl $(GPLC) $(GPLCFLAGS) -o multipl multipl.pl queens: queens.pl queens_fd.fd $(GPLC) $(GPLCFLAGS) -o queens queens.pl queens_fd.fd send: send.pl $(GPLC) $(GPLCFLAGS) -o send send.pl square: square.pl $(GPLC) $(GPLCFLAGS) -o square square.pl srq: srq.pl $(GPLC) $(GPLCFLAGS) -o srq srq.pl magsq: magsq.pl $(GPLC) $(GPLCFLAGS) -o magsq magsq.pl qg5: qg5.pl $(GPLC) $(GPLCFLAGS) -o qg5 qg5.pl langford: langford.pl $(GPLC) $(GPLCFLAGS) -o langford langford.pl bool: $(BENCH_BOOL) rm-bool: rm -f $(BENCH_BOOL) bdiag: bdiag.pl array.pl $(GPLC) $(GPLCFLAGS) -o bdiag bdiag.pl bdonald: bdonald.pl array.pl $(GPLC) $(GPLCFLAGS) -o bdonald bdonald.pl bpigeon: bpigeon.pl array.pl $(GPLC) $(GPLCFLAGS) -o bpigeon bpigeon.pl bqueens: bqueens.pl array.pl $(GPLC) $(GPLCFLAGS) -o bqueens bqueens.pl bramsey: bramsey.pl array.pl $(GPLC) $(GPLCFLAGS) -o bramsey bramsey.pl bschur: bschur.pl array.pl $(GPLC) $(GPLCFLAGS) -o bschur bschur.pl bsend: bsend.pl array.pl $(GPLC) $(GPLCFLAGS) -o bsend bsend.pl ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/bridge1.pl���������������������������������������������������������������0000644�0044254�0051310�00000015237�10547152503�015645� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : bridge.pl */ /* Title : bridge scheduling problem */ /* Original Source: P. Van Hentenryck's book and */ /* COSYTEC (version used in "Overview of a CHIP Compiler")*/ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : October 1994 */ /* */ /* Find a scheduling that minimizes the time to build a 5-segment bridge. */ /* */ /* Solution: */ /* */ /* Optimal (End=104) */ /* */ /* [[start,0,0],[a1,4,3],[a2,2,13],[a3,2,7],[a4,2,15],[a5,2,1],[a6,5,38], */ /* [p1,20,9],[p2,13,29],[ue,10,0],[s1,8,10],[s2,4,18],[s3,4,29],[s4,4,42],*/ /* [s5,4,6],[s6,10,46],[b1,1,18],[b2,1,22],[b3,1,33],[b4,1,46],[b5,1,10], */ /* [b6,1,56],[ab1,1,19],[ab2,1,23],[ab3,1,34],[ab4,1,47],[ab5,1,11], */ /* [ab6,1,57],[m1,16,20],[m2,8,36],[m3,8,44],[m4,8,52],[m5,8,12], */ /* [m6,20,60],[l1,2,30],[t1,12,44],[t2,12,56],[t3,12,68],[t4,12,92], */ /* [t5,12,80],[ua,10,78],[v1,15,56],[v2,10,92],[k1,0,42],[k2,0,80], */ /* [stop,0,104]] */ /*-------------------------------------------------------------------------*/ /* constraint definitions */ smallereqc(X,Y,C):- % X #=< Y+C. fd_tell(x_plus_c_gte_y(Y,C,X)). greatereqc(X,Y,C):- % X #>= Y+C. fd_tell(x_plus_c_lte_y(Y,C,X)). q:- statistics(runtime,_), bridge(Ld,End), statistics(runtime,[_,Y]), write(Ld), nl, write(End), nl, write('time : '), write(Y), nl. bridge(K,Ende):- setup(K,Ende,Disj), fd_minimize(choice(Disj,K),Ende). setup(K,Ende,Disj):- jobs(L), make_vars(L,K), member([stop,_,Ende],K), precedence(M), make_precedence(M,K), max_nf(M1), make_max_nf(M1,K), max_ef(M2), make_max_ef(M2,K), min_af(M3), make_min_af(M3,K), min_sf(M4), make_min_sf(M4,K), min_nf(M5), make_min_nf(M5,K), resources(R), make_disj(R,K,[],Disj1), reverse(Disj1,Disj). choice(Disj,K):- disjunct(Disj), label(K). make_vars([],[]). make_vars([H|T],[[H,D,A]|R]):- duration(H,D), fd_domain(A,0,200), make_vars(T,R). make_precedence([],_). make_precedence([[A,B]|R],L):- member([A,Ad,Aa],L), member([B,_Bd,Ba],L), greatereqc(Ba,Aa,Ad), % Ba #>= Aa+Ad, make_precedence(R,L). make_max_nf([],_). make_max_nf([[A,B,C]|R],L):- member([A,Ad,Aa],L), member([B,_Bd,Ba],L), C1 is C + Ad, smallereqc(Ba,Aa,C1), % Ba #=< Aa+C1, make_max_nf(R,L). make_max_ef([],_). make_max_ef([[A,B,C]|R],L):- member([A,Ad,Aa],L), member([B,Bd,Ba],L), C1 is Ad + C - Bd, smallereqc(Ba,Aa,C1), % Ba #=< Aa+C1, make_max_ef(R,L). make_min_af([],_). make_min_af([[A,B,C]|R],L):- member([A,_Ad,Aa],L), member([B,_Bd,Ba],L), greatereqc(Ba,Aa,C), % Ba #>= Aa+C, make_min_af(R,L). make_min_sf([],_). make_min_sf([[A,B,C]|R],L):- member([A,_Ad,Aa],L), member([B,Bd,Ba],L), C1 is C - Bd, smallereqc(Ba,Aa,C1), % Ba #=< Aa+C1, make_min_sf(R,L). make_min_nf([],_). make_min_nf([[A,B,C]|R],L):- member([A,Ad,_Aa],L), member([B,_Bd,Ba],L), C1 is C + Ad, greatereqc(Ba,Ad,C1), % Ba #>= Ad+C1, make_min_nf(R,L). make_disj([],_R,D,D). make_disj([[_H,R]|T],K,Din,Dout):- el_list(R,K,R1), make_disj1(R1,Din,D1), make_disj(T,K,D1,Dout). make_disj1([],D,D). make_disj1([H|T],Din,Dout):- make_disj2(H,T,Din,D1), make_disj1(T,D1,Dout). make_disj2(_H,[],D,D). make_disj2([A,B],[[C,D]|S],Din,Dout):- make_disj2([A,B],S,[[A,B,C,D]|Din],Dout). el_list([],_,[]). el_list([H|T],L,[[A,D]|S]):- member([H,D,A],L), el_list(T,L,S). disjunct([]). disjunct([[A,B,C,D]|R]):- disj(A,B,C,D), disjunct(R). disj(Aa,Ad,Ba,_Bd):- greatereqc(Ba,Aa,Ad). % Ba #>= Aa+Ad. disj(Aa,_Ad,Ba,Bd):- greatereqc(Aa,Ba,Bd). % Aa #>= Ba+Bd. label([]). label([[_A,_Ad,Aa]|R]):- fd_labeling(Aa), label(R). /* DATA */ jobs([start,a1,a2,a3,a4,a5,a6,p1,p2,ue,s1,s2,s3,s4,s5,s6, b1,b2,b3,b4,b5,b6,ab1,ab2,ab3,ab4,ab5,ab6,m1,m2,m3,m4,m5,m6, l1,t1,t2,t3,t4,t5,ua,v1,v2,k1,k2,stop]). duration(start,0). duration(a1,4). duration(a2,2). duration(a3,2). duration(a4,2). duration(a5,2). duration(a6,5). duration(p1,20). duration(p2,13). duration(ue,10). duration(s1,8). duration(s2,4). duration(s3,4). duration(s4,4). duration(s5,4). duration(s6,10). duration(b1,1). duration(b2,1). duration(b3,1). duration(b4,1). duration(b5,1). duration(b6,1). duration(ab1,1). duration(ab2,1). duration(ab3,1). duration(ab4,1). duration(ab5,1). duration(ab6,1). duration(m1,16). duration(m2,8). duration(m3,8). duration(m4,8). duration(m5,8). duration(m6,20). duration(l1,2). duration(t1,12). duration(t2,12). duration(t3,12). duration(t4,12). duration(t5,12). duration(ua,10). duration(v1,15). duration(v2,10). duration(k1,0). duration(k2,0). duration(stop,0). precedence([[start,a1],[start,a2],[start,a3],[start,a4],[start,a5], [start,a6],[start,ue],[a1,s1],[a2,s2],[a5,s5], [a6,s6],[a3,p1],[a4,p2],[p1,s3],[p2,s4], [p1,k1],[p2,k1],[s1,b1],[s2,b2], [s3,b3],[s4,b4],[s5,b5],[s6,b6],[b1,ab1], [b2,ab2],[b3,ab3],[b4,ab4],[b5,ab5],[b6,ab6], [ab1,m1],[ab2,m2],[ab3,m3],[ab4,m4],[ab5,m5], [ab6,m6],[m1,t1],[m2,t1],[m2,t2],[m3,t2], [m3,t3],[m4,t3],[m4,t4],[m5,t4],[m5,t5], [m6,t5],[m1,k2],[m2,k2],[m3,k2],[m4,k2], [m5,k2],[m6,k2],[l1,t1],[l1,t2],[l1,t3], [l1,t4],[l1,t5],[t1,v1],[t5,v2],[t2,stop], [t3,stop],[t4,stop],[v1,stop],[v2,stop],[ua,stop], [k2,stop]]). max_nf([[start,l1,30],[a1,s1,3],[a2,s2,3],[a5,s5,3], [a6,s6,3],[p1,s3,3],[p2,s4,3]]). min_sf([[ua,m1,2],[ua,m2,2],[ua,m3,2],[ua,m4,2], [ua,m5,2],[ua,m6,2]]). max_ef([[s1,b1,4],[s2,b2,4],[s3,b3,4],[s4,b4,4],[s5,b5,4],[s6,b6,4]]). min_nf([[start,l1,30]]). min_af([[ue,s1,6],[ue,s2,6],[ue,s3,6],[ue,s4,6],[ue,s5,6],[ue,s6,6]]). resources([[crane,[l1,t1,t2,t3,t4,t5]], [bricklaying,[m1,m2,m3,m4,m5,m6]], [schal,[s1,s2,s3,s4,s5,s6]], [excavator,[a1,a2,a3,a4,a5,a6]], [ram,[p1,p2]], [pump,[b1,b2,b3,b4,b5,b6]], [caterpillar,[v1,v2]]]). :- initialization(q). �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/donald.pl����������������������������������������������������������������0000644�0044254�0051310�00000004526�10547152503�015570� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : donald.pl */ /* Title : crypt-arithmetic */ /* Original Source: Daniel Diaz - INRIA France */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : September 1992 */ /* */ /* Solve the operation: */ /* */ /* D O N A L D */ /* + G E R A L D */ /* -------------- */ /* = R O B E R T */ /* */ /* (resolution by line) */ /* */ /* Solution: */ /* [D,O,N,A,L,G,E,R,B,T] */ /* [5,2,6,4,8,1,9,7,3,0] */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), statistics(runtime,_), donald(LD,Lab), statistics(runtime,[_,Y]), write(LD), nl, write('time : '), write(Y), nl. donald(LD,Lab):- fd_set_vector_max(9), LD=[D,O,N,A,L,G,E,R,B,T], fd_all_different(LD), fd_domain(LD,0,9), fd_domain([D,G],1,9), 100000*D+10000*O+1000*N+100*A+10*L+D + 100000*G+10000*E+1000*R+100*A+10*L+D #= 100000*R+10000*O+1000*B+100*E+10*R+T, lab(Lab,LD). lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/bdiag.pl�����������������������������������������������������������������0000644�0044254�0051310�00000007703�10547152503�015375� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Boolean) */ /* */ /* Name : bdiag.pl */ /* Title : N adder diagnostic */ /* Original Source: Greg Sidebottom - University of Vancouver Canada */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : September 1993 */ /* */ /* The circuit diagnosis problem is as follows: */ /* */ /*Given: */ /* 1. a description of a digital circuit with a set of components C */ /* 2. a function f computed by the circuit */ /* 3. a symptom consisting of an input output pair (i,o) such that */ /* f(i) <> o */ /* Find: */ /* a diagnosis D. D is a subset of C which, if not working correctly, */ /* could result in the circuit computing o given i. */ /* */ /* The specific circuit used for this benchmark is an N bit adder with */ /* forward carry propagation. However, any combinatorial circuit diagnosis*/ /* problem could easily formulated from it's network description. */ /* This example was constructed based on an example from an article about */ /* Prolog III in CACM July 1990. */ /* The problem consists in finding the minimum number of broken components */ /* in a N bit adder that thinks 0+0=2^N-1 (the answer is always N). */ /* Each adder consists of 5 gates (2 'and', 2 'xor' and 1 'or'). */ /* A boolean (Di) is associated to each gate and it is true (1) if the */ /* gate is broken. The solution is a list of Di. F is the number of broken */ /* components. To minimize F we label it (indomain) first (since there is */ /* no choice point it is correct). */ /* */ /* Solution: */ /* N=1 [0,0,0,0,1] */ /* N=2 [0,0,0,0,1,0,0,0,0,1] */ /* N=3 [0,0,0,0,1,0,0,0,0,1,0,0,0,0,1] */ /*-------------------------------------------------------------------------*/ q:- statistics(runtime,_), write('N ?'), read_integer(N), Z is 1<<N-1, bdiag(N,0,0,Z,0,0,Ds,F), statistics(runtime,[_,Y]), write(s(F,Ds)), nl, write('time : '), write(Y), nl. bdiag(N,X,Y,Z,C1,C,Ds,F):- N5 is N*5, F #=< N5, nadder(N,X,Y,Z,C1,C,Ds), TN is 1<<N, X+Y+C1 #\= Z+TN*C, sum(Ds,F), fd_minimize(fd_labeling(Ds),F). % fd_labeling([F|Ds]). sum([],0). sum([X|Xs],S):- S #= X + S1, sum(Xs,S1). nadder(N,X,Y,Z,C1,C,Ds):- bits(N,X,Xs), bits(N,Y,Ys), bits(N,Z,Zs), adder(Xs,Ys,Zs,C1,C,Ds). bits(N,X,Xs):- length(Xs,N), bits1(Xs,0,N,X). bits1([],N,N,0). bits1([Xi|Xs1],I,N,X):- I < N, X #= Xi * 2**I + X1, I1 is I + 1, bits1(Xs1,I1,N,X1). adder([],[],[],C,C,[]). adder([X|Xs],[Y|Ys],[Z|Zs],C1,C,[D0,D1,D2,D3,D4|Ds]):- fullAdder(X,Y,C1,Z,C2,D0,D1,D2,D3,D4), adder(Xs,Ys,Zs,C2,C,Ds). fullAdder(X,Y,C1,Z,C,D0,D1,D2,D3,D4):- #\ D0 #==> (U1 #<=> X #/\ Y), #\ D1 #==> (U2 #<=> U3 #/\ C1), #\ D2 #==> (C #<=> U1 #\/ U2), #\ D3 #==> (U3 #<=> X ## Y), #\ D4 #==> (Z #<=> U3 ## C1). :- initialization(q). �������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/bramsey.pl���������������������������������������������������������������0000644�0044254�0051310�00000010475�10547152503�015771� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Boolean) */ /* */ /* Name : bramsey.pl */ /* Title : ramsey problem */ /* Original Source: Daniel Diaz - INRIA France */ /* Greg Sidebottom - University of Vancouver Canada */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : September 1993 */ /* */ /* Find a 3-colouring of a complete graph with N vertices such that there */ /* is no monochrome triangles. */ /* */ /* The graph is a half-matrix of edges. Example N=5: */ /* Graph=m(v(e12), */ /* v(e13, e23), */ /* v(e14, e24, e34), */ /* v(e15, e25, e35, e45)) an edge eij is 3 colors [C3,C2,C1] */ /* (resolution by line) */ /* */ /* There is a solution up to N=16, none for N>=17. */ /* Solution: */ /* N=5 */ /* m(v([0,0,1]), */ /* v([0,1,0],[0,0,1]), */ /* v([0,1,0],[0,0,1],[1,0,0]), */ /* v([1,0,0],[0,0,1],[0,1,0],[0,1,0])) */ /*-------------------------------------------------------------------------*/ q:- write('N ?'), read_integer(N), statistics(runtime,_), ramsey(N,Graph), statistics(runtime,[_,Y]), write(Graph), nl, write('time : '), write(Y), nl. ramsey(N,Mat):- adj(N,Mat), triangles(N,Mat,Tris), label(Tris). triangles(N,Mat,Ts):- trianglesI(0,N,Mat,Ts,[]). trianglesI(I1,N,Mat,Ts1,Ts):- I1 < N, !, I is I1 + 1, trianglesJI(I,I,N,Mat,Ts1,Ts2), trianglesI(I,N,Mat,Ts2,Ts). trianglesI(N,N,_Mat,Ts,Ts). trianglesJI(J1,I,N,Mat,Ts1,Ts):- J1 < N, !, J is J1 + 1, trianglesKJI(J,J,I,N,Mat,Ts1,Ts2), trianglesJI(J,I,N,Mat,Ts2,Ts). trianglesJI(N,_I,N,_Mat,Ts,Ts). trianglesKJI(K1,J,I,N,Mat,[EIJ,EJK,EKI|Ts1],Ts):- K1 < N, !, K is K1 + 1, edge(I,J,Mat,EIJ), edge(J,K,Mat,EJK), edge(I,K,Mat,EKI), polychrom(EIJ,EJK,EKI), trianglesKJI(K,J,I,N,Mat,Ts1,Ts). trianglesKJI(N,_J,_I,N,_Mat,Ts,Ts). polychrom([C13,C12,C11],[C23,C22,C21],[C33,C32,C31]):- #\ (C13 #/\ C23 #/\ C33), #\ (C12 #/\ C22 #/\ C32), #\ (C11 #/\ C21 #/\ C31). % these interface to the tmat routines, the essentially map the matrix % so the diagonal can be used adj(N,Mat):- N1 is N - 1, tmat(N1,Mat). % edge must be called with I < J % could make more general so it swaps arguments if I > J edge(I,J,Mat,EIJ):- J1 is J - 1, tmatRef(J1,I,Mat,EIJ), (var(EIJ) -> cstr_edge(EIJ) ; true). tmat(N,Mat):- functor(Mat,m,N), tvecs(N,Mat). tvecs(0,_Mat):- !. tvecs(J,Mat):- arg(J,Mat,Vec), functor(Vec,v,J), J1 is J - 1, tvecs(J1,Mat). % tmatRef must be called with I > J % could make more general so it swaps arguments if I < J tmatRef(I,J,Mat,MatIJ):- arg(I,Mat,MatI), arg(J,MatI,MatIJ). label([]). label([A,B,C|L]):- labeltri(A,B,C), label(L). labeltri(A,B,C):- same_edge(A,B), fd_labeling(A), fd_labeling(C). labeltri(A,B,C):- same_edge(A,C), fd_labeling(A), fd_labeling(B). labeltri(A,B,C):- same_edge(B,C), fd_labeling(B), fd_labeling(A). labeltri(A,B,C):- fd_labeling(C), diff_edge(A,C), diff_edge(B,C), fd_labeling(B), diff_edge(A,B). same_edge(Edge,Edge). diff_edge([C13,C12,C11],[C23,C22,C21]):- #\ (C13 #/\ C23), #\ (C12 #/\ C22), #\ (C11 #/\ C21). cstr_edge(E):- E=[_,_,_], fd_only_one(E). :- initialization(q). ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/bsend.pl�����������������������������������������������������������������0000644�0044254�0051310�00000007134�10547152503�015420� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Boolean) */ /* */ /* Name : bsend.pl */ /* Title : crypt-arithmetic */ /* Original Source: Daniel Diaz - INRIA France */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : January 1993 */ /* */ /* Solve the operation: */ /* */ /* S E N D */ /* + M O R E */ /* ----------- */ /* = M O N E Y */ /* */ /* (resolution by column) */ /* The digit of each letter is coded in binary on 4 bits (dcb). The order */ /* for labeling is very relevant for efficiency. */ /* */ /* Solution: */ /* [S,E,N,D,M,O,R,Y] */ /* [[1,0,0,1],[0,1,0,1],[0,1,1,0],[0,1,1,1],[0,0,0,1],[0,0,0,0],[1,0,0,0],*/ /* [0,0,1,0]] */ /* ie: */ /* [9,5,6,7,1,0,8,2] */ /*-------------------------------------------------------------------------*/ q:- statistics(runtime,_), (bsend(A), write(A), nl %, % fail ; write('No more solutions'), nl), statistics(runtime,[_,Y]), write('time : '), write(Y), nl. bsend(A):- A=[S,E,N,D,M,O,R,Y], dcb_digit(S), dcb_digit(E), dcb_digit(N), dcb_digit(D), dcb_digit(M), dcb_digit(O), dcb_digit(R), dcb_digit(Y), diff0(S), diff0(M), all_dcb_digit_diff(A), LC=[C1,C2,C3,C4], Z=[0,0,0,0], dcb_add(0, D,E,Y,C1), dcb_add(C1,N,R,E,C2), dcb_add(C2,E,O,N,C3), dcb_add(C3,S,M,O,C4), dcb_add(C4,Z,Z,M,0), !, array_labeling(A), fd_labeling(LC). dcb_digit(D):- D=[B3,B2,B1,_], B3 #==> #\ B2 #/\ #\ B1. diff0([B3,B2,B1,B0]):- B3 #\/ B2 #\/ B1 #\/ B0. all_dcb_digit_diff([]). all_dcb_digit_diff([X|L]):- diff_of(L,X), all_dcb_digit_diff(L). diff_of([],_). diff_of([Y|L],X):- dcb_digit_diff(X,Y), diff_of(L,X). dcb_digit_diff([X3,X2,X1,X0],[Y3,Y2,Y1,Y0]):- #\ ((X3 #<=> Y3) #/\ (X2 #<=> Y2) #/\ (X1 #<=> Y1) #/\ (X0 #<=> Y0)). dcb_add(CI,[X3,X2,X1,X0],[Y3,Y2,Y1,Y0],[Z3,Z2,Z1,Z0],CO):- full_add(CI,X0,Y0,Z0,C1), full_add(C1,X1,Y1,I1,C2), full_add(C2,X2,Y2,I2,C3), full_add(C3,X3,Y3,I3,C4), I2 #\/ I1 #<=> I12, I3 #/\ I12 #<=> I123, C4 #\/ I123 #<=> Hex, half_add(I1,Hex,Z1,D2), full_add(D2,I2,Hex,Z2,D3), half_add(D3,I3,Z3,D4), C4 #\/ D4 #<=> CO. full_add(CI,X,Y,Z,CO):- half_add(X,Y,Z1,C1), half_add(CI,Z1,Z,C2), C1 #\/ C2 #<=> CO. half_add(X,Y,Z,CO):- X #/\ Y #<=> CO, X ## Y #<=> Z. :- include(array). % interface with for_each_... procedures array_prog(_,_). :- initialization(q). ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/cars.pl������������������������������������������������������������������0000644�0044254�0051310�00000011677�10547152503�015264� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : cars.pl */ /* Title : car sequencing problem */ /* Original Source: Dincbas, Simonis and Van Hentenryck */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : September 1992 */ /* */ /* Car sequencing problem with 10 cars */ /* Solution: */ /* [1,2,6,3,5,4,4,5,3,6] */ /* [1,3,6,2,5,4,3,5,4,6] */ /* [1,3,6,2,6,4,5,3,4,5] */ /* [5,4,3,5,4,6,2,6,3,1] */ /* [6,3,5,4,4,5,3,6,2,1] */ /* [6,4,5,3,4,5,2,6,3,1] */ /* */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), statistics(runtime,_), (cars(L,Lab), write(L), nl, fail ; true), statistics(runtime,[_,Y]), write('time : '), write(Y), nl. cars(X,Lab):- fd_set_vector_max(6), X=[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10], Y=[O11,O12,O13,O14,O15, O21,O22,O23,O24,O25, O31,O32,O33,O34,O35, O41,O42,O43,O44,O45, O51,O52,O53,O54,O55, O61,O62,O63,O64,O65, O71,O72,O73,O74,O75, O81,O82,O83,O84,O85, O91,O92,O93,O94,O95, O101,O102,O103,O104,O105], L1=[1,0,0,0,1,1], L2=[0,0,1,1,0,1], L3=[1,0,0,0,1,0], L4=[1,1,0,1,0,0], L5=[0,0,1,0,0,0], fd_domain(Y,0,1), fd_domain(X,1,6), fd_atmost(1,X,1), fd_atmost(1,X,2), fd_atmost(2,X,3), fd_atmost(2,X,4), fd_atmost(2,X,5), fd_atmost(2,X,6), fd_element(X1,L1,O11), fd_element(X1,L2,O12), fd_element(X1,L3,O13), fd_element(X1,L4,O14), fd_element(X1,L5,O15), fd_element(X2,L1,O21), fd_element(X2,L2,O22), fd_element(X2,L3,O23), fd_element(X2,L4,O24), fd_element(X2,L5,O25), fd_element(X3,L1,O31), fd_element(X3,L2,O32), fd_element(X3,L3,O33), fd_element(X3,L4,O34), fd_element(X3,L5,O35), fd_element(X4,L1,O41), fd_element(X4,L2,O42), fd_element(X4,L3,O43), fd_element(X4,L4,O44), fd_element(X4,L5,O45), fd_element(X5,L1,O51), fd_element(X5,L2,O52), fd_element(X5,L3,O53), fd_element(X5,L4,O54), fd_element(X5,L5,O55), fd_element(X6,L1,O61), fd_element(X6,L2,O62), fd_element(X6,L3,O63), fd_element(X6,L4,O64), fd_element(X6,L5,O65), fd_element(X7,L1,O71), fd_element(X7,L2,O72), fd_element(X7,L3,O73), fd_element(X7,L4,O74), fd_element(X7,L5,O75), fd_element(X8,L1,O81), fd_element(X8,L2,O82), fd_element(X8,L3,O83), fd_element(X8,L4,O84), fd_element(X8,L5,O85), fd_element(X9,L1,O91), fd_element(X9,L2,O92), fd_element(X9,L3,O93), fd_element(X9,L4,O94), fd_element(X9,L5,O95), fd_element(X10,L1,O101), fd_element(X10,L2,O102), fd_element(X10,L3,O103), fd_element(X10,L4,O104), fd_element(X10,L5,O105), 1 #>= O11+O21, 1 #>= O21+O31, 1 #>= O31+O41, 1 #>= O41+O51, 1 #>= O51+O61, 1 #>= O61+O71, 1 #>= O71+O81, 1 #>= O81+O91, 1 #>= O91+O101, 2 #>= O12+O22+O32, 2 #>= O22+O32+O42, 2 #>= O32+O42+O52, 2 #>= O42+O52+O62, 2 #>= O52+O62+O72, 2 #>= O62+O72+O82, 2 #>= O72+O82+O92, 2 #>= O82+O92+O102, 1 #>= O13+O23+O33, 1 #>= O23+O33+O43, 1 #>= O33+O43+O53, 1 #>= O43+O53+O63, 1 #>= O53+O63+O73, 1 #>= O63+O73+O83, 1 #>= O73+O83+O93, 1 #>= O83+O93+O103, 2 #>= O14+O24+O34+O44+O54, 2 #>= O24+O34+O44+O54+O64, 2 #>= O34+O44+O54+O64+O74, 2 #>= O44+O54+O64+O74+O84, 2 #>= O54+O64+O74+O84+O94, 2 #>= O64+O74+O84+O94+O104, 1 #>= O15+O25+O35+O45+O55, 1 #>= O25+O35+O45+O55+O65, 1 #>= O35+O45+O55+O65+O75, 1 #>= O45+O55+O65+O75+O85, 1 #>= O55+O65+O75+O85+O95, 1 #>= O65+O75+O85+O95+O105, % redundant constraints O11+O21+O31+O41+O51+O61+O71+O81 #>= 4, O11+O21+O31+O41+O51+O61 #>= 3, O11+O21+O31+O41 #>= 2, O11+O21 #>= 1, O12+O22+O32+O42+O52+O62+O72 #>= 4, O12+O22+O32+O42 #>= 2, O12 #>= 0, O13+O23+O33+O43+O53+O63+O73 #>= 2, O13+O23+O33+O43 #>= 1, O13 #>= 0, O14+O24+O34+O44+O54 #>= 2, O15+O25+O35+O45+O55 #>= 1, lab(Lab,X). lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). �����������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/digit8.pl����������������������������������������������������������������0000644�0044254�0051310�00000004256�10547152503�015517� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : digit8.pl */ /* Title : particular 8 digit number */ /* Original Source: Daniel Diaz - INRIA France */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : October 1993 */ /* */ /* Find the 8 digit number N such that: */ /* */ /* - N is a square */ /* - if we put a 1 in front of the decimal notation of N then it is */ /* still a square */ /* */ /* Solution: */ /* [N,X,M,Y] */ /* [23765625,4875,123765625,11125] */ /* [56250000,7500,156250000,12500] */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), statistics(runtime,_), (digit8(L,Lab), write(L), nl, fail ; write('No more solutions'), nl), statistics(runtime,[_,Y]), write('time : '), write(Y), nl. digit8(L,Lab):- L=[N,X,M,Y], N #>= 10000000, N#=<99999999, X**2 #= N, 100000000+N #= M, Y**2 #= M, lab(Lab,L). lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/crypta.pl����������������������������������������������������������������0000644�0044254�0051310�00000005101�10547152503�015617� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : crypta.pl */ /* Title : crypt-arithmetic */ /* Original Source: P. Van Hentenryck's book */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : September 1992 */ /* */ /* Solve the operation: */ /* */ /* B A I J J A J I I A H F C F E B B J E A */ /* + D H F G A B C D I D B I F F A G F E J E */ /* ----------------------------------------- */ /* = G J E G A C D D H F A F J B F I H E E F */ /* */ /* Solution: */ /* [A,B,C,D,E,F,G,H,I,J] */ /* [1,2,3,4,5,6,7,8,9,0] */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), statistics(runtime,_), crypta(Lab,LD), statistics(runtime,[_,Y]), write(LD), nl, write('time : '), write(Y), nl. crypta(Lab,LD):- fd_set_vector_max(9), LD=[A,B,C,D,E,F,G,H,I,J], fd_domain(LD,0,9), fd_domain([Sr1,Sr2],0,1), fd_domain([B,D,G],1,9), fd_all_different(LD), A+10*E+100*J+1000*B+10000*B+100000*E+1000000*F+ E+10*J+100*E+1000*F+10000*G+100000*A+1000000*F #= F+10*E+100*E+1000*H+10000*I+100000*F+1000000*B+10000000*Sr1, C+10*F+100*H+1000*A+10000*I+100000*I+1000000*J+ F+10*I+100*B+1000*D+10000*I+100000*D+1000000*C+Sr1 #= J+10*F+100*A+1000*F+10000*H+100000*D+1000000*D+10000000*Sr2, A+10*J+100*J+1000*I+10000*A+100000*B+ B+10*A+100*G+1000*F+10000*H+100000*D+Sr2 #= C+10*A+100*G+1000*E+10000*J+100000*G, lab(Lab,LD). lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/bridge.pl����������������������������������������������������������������0000644�0044254�0051310�00000014266�10547152503�015565� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : bridge.pl */ /* Title : bridge scheduling problem */ /* Original Source: P. Van Hentenryck's book and */ /* COSYTEC (version used in "Overview of a CHIP Compiler")*/ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : October 1994 */ /* */ /* Find a scheduling that minimizes the time to build a 5-segment bridge. */ /* */ /* Solution: */ /* */ /* Optimal (End=104) */ /* */ /* [[start,0,0],[a1,4,3],[a2,2,13],[a3,2,7],[a4,2,15],[a5,2,1],[a6,5,38], */ /* [p1,20,9],[p2,13,29],[ue,10,0],[s1,8,10],[s2,4,18],[s3,4,29],[s4,4,42],*/ /* [s5,4,6],[s6,10,46],[b1,1,18],[b2,1,22],[b3,1,33],[b4,1,46],[b5,1,10], */ /* [b6,1,56],[ab1,1,19],[ab2,1,23],[ab3,1,34],[ab4,1,47],[ab5,1,11], */ /* [ab6,1,57],[m1,16,20],[m2,8,36],[m3,8,44],[m4,8,52],[m5,8,12], */ /* [m6,20,60],[l1,2,30],[t1,12,44],[t2,12,56],[t3,12,68],[t4,12,92], */ /* [t5,12,80],[ua,10,78],[v1,15,56],[v2,10,92],[k1,0,42],[k2,0,80], */ /* [stop,0,104]] */ /*-------------------------------------------------------------------------*/ q:- statistics(runtime,_), bridge(Ld,End), statistics(runtime,[_,Y]), write(Ld), nl, write(End), nl, write('time : '), write(Y), nl. bridge(K,Ende):- setup(K,Ende,Disj), fd_minimize(choice(Disj,K),Ende). setup(K,Ende,Disj):- jobs(L), make_vars(L,K), member([stop,_,Ende],K), precedence(M), make_precedence(M,K), max_nf(M1), make_max_nf(M1,K), max_ef(M2), make_max_ef(M2,K), min_af(M3), make_min_af(M3,K), min_sf(M4), make_min_sf(M4,K), min_nf(M5), make_min_nf(M5,K), resources(R), make_disj(R,K,[],Disj1), reverse(Disj1,Disj). choice(Disj,K):- disjunct(Disj), label(K). make_vars([],[]). make_vars([H|T],[[H,D,A]|R]):- duration(H,D), fd_domain(A,0,200), make_vars(T,R). make_precedence([],_). make_precedence([[A,B]|R],L):- member([A,Ad,Aa],L), member([B,_Bd,Ba],L), Ba #>= Aa+Ad, make_precedence(R,L). make_max_nf([],_). make_max_nf([[A,B,C]|R],L):- member([A,Ad,Aa],L), member([B,_Bd,Ba],L), C1 is C + Ad, Ba #=< Aa+C1, make_max_nf(R,L). make_max_ef([],_). make_max_ef([[A,B,C]|R],L):- member([A,Ad,Aa],L), member([B,Bd,Ba],L), C1 is Ad + C - Bd, Ba #=< Aa+C1, make_max_ef(R,L). make_min_af([],_). make_min_af([[A,B,C]|R],L):- member([A,_Ad,Aa],L), member([B,_Bd,Ba],L), Ba #>= Aa+C, make_min_af(R,L). make_min_sf([],_). make_min_sf([[A,B,C]|R],L):- member([A,_Ad,Aa],L), member([B,Bd,Ba],L), C1 is C - Bd, Ba #=< Aa+C1, make_min_sf(R,L). make_min_nf([],_). make_min_nf([[A,B,C]|R],L):- member([A,Ad,_Aa],L), member([B,_Bd,Ba],L), C1 is C + Ad, Ba #>= Ad+C1, make_min_nf(R,L). make_disj([],_R,D,D). make_disj([[_H,R]|T],K,Din,Dout):- el_list(R,K,R1), make_disj1(R1,Din,D1), make_disj(T,K,D1,Dout). make_disj1([],D,D). make_disj1([H|T],Din,Dout):- make_disj2(H,T,Din,D1), make_disj1(T,D1,Dout). make_disj2(_H,[],D,D). make_disj2([A,B],[[C,D]|S],Din,Dout):- make_disj2([A,B],S,[[A,B,C,D]|Din],Dout). el_list([],_,[]). el_list([H|T],L,[[A,D]|S]):- member([H,D,A],L), el_list(T,L,S). disjunct([]). disjunct([[A,B,C,D]|R]):- disj(A,B,C,D), disjunct(R). disj(Aa,Ad,Ba,_Bd):- Ba #>= Aa+Ad. disj(Aa,_Ad,Ba,Bd):- Aa #>= Ba+Bd. label([]). label([[_A,_Ad,Aa]|R]):- fd_labeling(Aa), label(R). /* DATA */ jobs([start,a1,a2,a3,a4,a5,a6,p1,p2,ue,s1,s2,s3,s4,s5,s6, b1,b2,b3,b4,b5,b6,ab1,ab2,ab3,ab4,ab5,ab6,m1,m2,m3,m4,m5,m6, l1,t1,t2,t3,t4,t5,ua,v1,v2,k1,k2,stop]). duration(start,0). duration(a1,4). duration(a2,2). duration(a3,2). duration(a4,2). duration(a5,2). duration(a6,5). duration(p1,20). duration(p2,13). duration(ue,10). duration(s1,8). duration(s2,4). duration(s3,4). duration(s4,4). duration(s5,4). duration(s6,10). duration(b1,1). duration(b2,1). duration(b3,1). duration(b4,1). duration(b5,1). duration(b6,1). duration(ab1,1). duration(ab2,1). duration(ab3,1). duration(ab4,1). duration(ab5,1). duration(ab6,1). duration(m1,16). duration(m2,8). duration(m3,8). duration(m4,8). duration(m5,8). duration(m6,20). duration(l1,2). duration(t1,12). duration(t2,12). duration(t3,12). duration(t4,12). duration(t5,12). duration(ua,10). duration(v1,15). duration(v2,10). duration(k1,0). duration(k2,0). duration(stop,0). precedence([[start,a1],[start,a2],[start,a3],[start,a4],[start,a5], [start,a6],[start,ue],[a1,s1],[a2,s2],[a5,s5], [a6,s6],[a3,p1],[a4,p2],[p1,s3],[p2,s4], [p1,k1],[p2,k1],[s1,b1],[s2,b2], [s3,b3],[s4,b4],[s5,b5],[s6,b6],[b1,ab1], [b2,ab2],[b3,ab3],[b4,ab4],[b5,ab5],[b6,ab6], [ab1,m1],[ab2,m2],[ab3,m3],[ab4,m4],[ab5,m5], [ab6,m6],[m1,t1],[m2,t1],[m2,t2],[m3,t2], [m3,t3],[m4,t3],[m4,t4],[m5,t4],[m5,t5], [m6,t5],[m1,k2],[m2,k2],[m3,k2],[m4,k2], [m5,k2],[m6,k2],[l1,t1],[l1,t2],[l1,t3], [l1,t4],[l1,t5],[t1,v1],[t5,v2],[t2,stop], [t3,stop],[t4,stop],[v1,stop],[v2,stop],[ua,stop], [k1,stop],[k2,stop]]). max_nf([[start,l1,30],[a1,s1,3],[a2,s2,3],[a5,s5,3], [a6,s6,3],[p1,s3,3],[p2,s4,3]]). min_sf([[ua,m1,2],[ua,m2,2],[ua,m3,2],[ua,m4,2], [ua,m5,2],[ua,m6,2]]). max_ef([[s1,b1,4],[s2,b2,4],[s3,b3,4],[s4,b4,4],[s5,b5,4],[s6,b6,4]]). min_nf([[start,l1,30]]). min_af([[ue,s1,6],[ue,s2,6],[ue,s3,6],[ue,s4,6],[ue,s5,6],[ue,s6,6]]). resources([[crane,[l1,t1,t2,t3,t4,t5]], [bricklaying,[m1,m2,m3,m4,m5,m6]], [schal,[s1,s2,s3,s4,s5,s6]], [excavator,[a1,a2,a3,a4,a5,a6]], [ram,[p1,p2]], [pump,[b1,b2,b3,b4,b5,b6]], [caterpillar,[v1,v2]]]). :- initialization(q). ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/eq10.pl������������������������������������������������������������������0000644�0044254�0051310�00000004653�10547152503�015076� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : eq10.pl */ /* Title : linear equations */ /* Original Source: Thomson LCR */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : September 1992 */ /* */ /* A system involving 7 variables and 10 equations */ /* */ /* Solution: */ /* [X1,X2,X3,X4,X5,X6,X7] */ /* [ 6, 0, 8, 4, 9, 3, 9] */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), statistics(runtime,_), eq10(LD,Lab), statistics(runtime,[_,Y]), write(LD), nl, write('time : '), write(Y), nl. eq10(LD,Lab):- LD = [X1,X2,X3,X4,X5,X6,X7], fd_domain(LD,0,10), 0+98527*X1+34588*X2+5872*X3+59422*X5+65159*X7 #= 1547604+30704*X4+29649*X6, 0+98957*X2+83634*X3+69966*X4+62038*X5+37164*X6+85413*X7 #= 1823553+93989*X1, 900032+10949*X1+77761*X2+67052*X5 #= 0+80197*X3+61944*X4+92964*X6+44550*X7, 0+73947*X1+84391*X3+81310*X5 #= 1164380+96253*X2+44247*X4+70582*X6+33054*X7, 0+13057*X3+42253*X4+77527*X5+96552*X7 #= 1185471+60152*X1+21103*X2+97932*X6, 1394152+66920*X1+55679*X4 #= 0+64234*X2+65337*X3+45581*X5+67707*X6+98038*X7, 0+68550*X1+27886*X2+31716*X3+73597*X4+38835*X7 #= 279091+88963*X5+76391*X6, 0+76132*X2+71860*X3+22770*X4+68211*X5+78587*X6 #= 480923+48224*X1+82817*X7, 519878+94198*X2+87234*X3+37498*X4 #= 0+71583*X1+25728*X5+25495*X6+70023*X7, 361921+78693*X1+38592*X5+38478*X6 #= 0+94129*X2+43188*X3+82528*X4+69025*X7, lab(Lab,LD). lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). �������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/eq20.pl������������������������������������������������������������������0000644�0044254�0051310�00000006305�10547152503�015073� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : eq20.pl */ /* Title : linear equations */ /* Original Source: Thomson LCR */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : September 1992 */ /* */ /* A system involving 7 variables and 20 equations */ /* */ /* Solution: */ /* [X1,X2,X3,X4,X5,X6,X7] */ /* [ 1, 4, 6, 6, 6, 3, 1] */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), statistics(runtime,_), eq20(LD,Lab), statistics(runtime,[_,Y]), write(LD), nl, write('time : '), write(Y), nl. eq20(LD,Lab):- LD = [X1,X2,X3,X4,X5,X6,X7], fd_domain(LD,0,10), 876370+16105*X1+6704*X3+68610*X6 #= 0+62397*X2+43340*X4+95100*X5+58301*X7, 533909+96722*X5 #= 0+51637*X1+67761*X2+95951*X3+3834*X4+59190*X6+15280*X7, 915683+34121*X2+33488*X7 #= 0+1671*X1+10763*X3+80609*X4+42532*X5+93520*X6, 129768+11119*X2+38875*X4+14413*X5+29234*X6 #= 0+71202*X1+73017*X3+72370*X7, 752447+58412*X2 #= 0+8874*X1+73947*X3+17147*X4+62335*X5+16005*X6+8632*X7, 90614+18810*X3+48219*X4+79785*X7 #= 0+85268*X1+54180*X2+6013*X5+78169*X6, 1198280+45086*X1+4578*X3 #= 0+51830*X2+96120*X4+21231*X5+97919*X6+65651*X7, 18465+64919*X1+59624*X4+75542*X5+47935*X7 #= 0+80460*X2+90840*X3+25145*X6, 0+43525*X2+92298*X3+58630*X4+92590*X5 #= 1503588+43277*X1+9372*X6+60227*X7, 0+47385*X2+97715*X3+69028*X5+76212*X6 #= 1244857+16835*X1+12640*X4+81102*X7, 0+31227*X2+93951*X3+73889*X4+81526*X5+68026*X7 #= 1410723+60301*X1+72702*X6, 0+94016*X1+35961*X3+66597*X4 #= 25334+82071*X2+30705*X5+44404*X6+38304*X7, 0+84750*X2+21239*X4+81675*X5 #= 277271+67456*X1+51553*X3+99395*X6+4254*X7, 0+29958*X2+57308*X3+48789*X4+4657*X6+34539*X7 #= 249912+85698*X1+78219*X5, 0+85176*X1+57898*X4+15883*X5+50547*X6+83287*X7 #= 373854+95332*X2+1268*X3, 0+87758*X2+19346*X4+70072*X5+44529*X7 #= 740061+10343*X1+11782*X3+36991*X6, 0+49149*X1+52871*X2+56728*X4 #= 146074+7132*X3+33576*X5+49530*X6+62089*X7, 0+29475*X2+34421*X3+62646*X5+29278*X6 #= 251591+60113*X1+76870*X4+15212*X7, 22167+29101*X2+5513*X3+21219*X4 #= 0+87059*X1+22128*X5+7276*X6+57308*X7, 821228+76706*X1+48614*X6+41906*X7 #= 0+98205*X2+23445*X3+67921*X4+24111*X5, lab(Lab,LD). lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/bpigeon.pl���������������������������������������������������������������0000644�0044254�0051310�00000004174�10547152503�015751� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Boolean) */ /* */ /* Name : bpigeon.pl */ /* Title : pigeon-hole problem */ /* Originated from: */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : January 1993 */ /* */ /* Put N pigeons in M pigeon-holes. Solution iff N<=M. */ /* The solution is a list [ [Pig11,...,Pig1m], ... ,[Pign1,...,Pignm] ] */ /* where Pigij = 1 if the pigeon i is in the pigeon-hole j */ /* */ /* Solution: */ /* N=2 M=3 [[0,0,1],[0,1,0]] */ /* [[0,0,1],[1,0,0]] */ /* [[0,1,0],[0,0,1]] */ /* [[0,1,0],[1,0,0]] */ /* [[1,0,0],[0,0,1]] */ /* [[1,0,0],[0,1,0]] */ /*-------------------------------------------------------------------------*/ q:- write('N ?'), read_integer(N), write('M ?'), read_integer(M), statistics(runtime,_), (bpigeon(N,M,A), % write(A), nl, fail ; write('No more solutions'), nl), statistics(runtime,[_,Y]), write('time : '), write(Y), nl. bpigeon(N,M,A):- create_array(N,M,A), for_each_line(A,only1), for_each_column(A,atmost1), !, array_labeling(A). :- include(array). % interface with for_each_... procedures array_prog(only1,L):- fd_only_one(L). array_prog(atmost1,L):- fd_at_most_one(L). :- initialization(q). ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/magic.pl�����������������������������������������������������������������0000644�0044254�0051310�00000006460�10547152503�015406� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : magic.pl */ /* Title : magic series */ /* Original Source: W.J. Older and F. Benhamou - Programming in CLP(BNR) */ /* (in Position Papers of PPCP'93) */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : May 1993 */ /* */ /* A magic serie is a sequence x0, x1, ..., xN-1 such that each xi is the */ /* number of occurences of i in the serie. */ /* N-1 */ /* ie xi = Sum (xj=i) where (xj=i) is 1 if x=y and 0 if x<>y */ /* i=0 */ /* */ /* two redundant constraints are used: */ /* N-1 N-1 */ /* Sum i = N and Sum i*xi = N */ /* i=0 i=0 */ /* */ /* Note: in the Pascal's original version the length of a magic serie is */ /* N+1 (x0, x1, ..., XN) instead of N (x0, x1, ..., xN-1). Finding such a */ /* serie (for N) only corresponds to find a serie for N+1 in this version. */ /* Also the original version only used one redundant constraint. */ /* */ /* Solution: */ /* N=1,2,3 and 6 none */ /* N=4 [1,2,1,0] and [2,0,2,0] */ /* N=5 [2,1,2,0,0] */ /* N=7 [3,2,1,1,0,0,0] (for N>=7 [N-4,2,1,<N-7 0's>,1,0,0,0]) */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), write('N ?'), read_integer(N), statistics(runtime,_), magic(N,L,Lab), statistics(runtime,[_,Y]), write(L), nl, write('time : '), write(Y), nl. magic(N,L,Lab):- fd_set_vector_max(N), length(L,N), fd_domain(L,0,N), constraints(L,L,0,N,N), lab(Lab,L). constraints([],_,_,0,0). constraints([X|Xs],L,I,S,S2):- sum(L,I,X), I1 is I+1, S1+X#=S, % redundant constraint 1 (I=0 -> S3=S2 ; I*X+S3#=S2), % redundant constraint 2 constraints(Xs,L,I1,S1,S3). sum([],_,0). sum([X|Xs],I,S):- sum(Xs,I,S1), X#=I #<=> B, S #= B+S1. lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/multipl.pl���������������������������������������������������������������0000644�0044254�0051310�00000006411�10547152503�016010� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : multipl.pl */ /* Title : unknown multiplication */ /* Original Source: Daniel Diaz - INRIA France */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : June 1995 */ /* */ /* Find the value of each digit verifying the following multiplication and */ /* such that each digit (0,1,...,9) appears excatly twice: */ /* */ /* X1 X2 X3 */ /* * X4 X5 X6 */ /* ----------- */ /* X7 X8 X9 */ /* + X10 X11 X12 */ /* + X13 X14 X15 */ /* = ------------------- */ /* X16 X17 X18 X19 X20 */ /* */ /* Solution: */ /* [X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20]*/ /* [ 1, 7, 9, 2, 2, 4, 7, 1, 6, 3, 5, 8, 3, 5, 8, 4, 0, 0, 9, 6]*/ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), statistics(runtime,_), mult(Lab,LD), statistics(runtime,[_,Y]), write(LD), nl, write('time : '), write(Y), nl. mult(Lab,LD):- fd_set_vector_max(9), LD=[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10, X11,X12,X13,X14,X15,X16,X17,X18,X19,X20], fd_domain(LD,0,9), fd_atmost(2,LD,0), fd_atmost(2,LD,1), fd_atmost(2,LD,2), fd_atmost(2,LD,3), fd_atmost(2,LD,4), fd_atmost(2,LD,5), fd_atmost(2,LD,6), fd_atmost(2,LD,7), fd_atmost(2,LD,8), fd_atmost(2,LD,9), /* This is much slower... fd_exactly(2,LD,0), fd_exactly(2,LD,1), fd_exactly(2,LD,2), fd_exactly(2,LD,3), fd_exactly(2,LD,4), fd_exactly(2,LD,5), fd_exactly(2,LD,6), fd_exactly(2,LD,7), fd_exactly(2,LD,8), fd_exactly(2,LD,9), */ Y#=100*X1+10*X2+X3, Z1#=100*X7 +10*X8 +X9, Z2#=100*X10+10*X11+X12, Z3#=100*X13+10*X14+X15, X6*Y #= Z1, X5*Y #= Z2, X4*Y #= Z3, 100*X7 +10*X8 +X9 + 1000*X10+100*X11+10*X12 + 10000*X13+1000*X14+100*X15 #= 10000*X16+1000*X17+100*X18+10*X19+X20, lab(Lab,LD). lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/qg5.pl�������������������������������������������������������������������0000644�0044254�0051310�00000005127�10547152503�015021� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : qg5.pl */ /* Title : Quasi-group problem */ /* Original Source: Daniel Diaz - INRIA France */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : July 1998 */ /* */ /* Find a semigroup table so that: ((ba)b)b=a under idempotency hypothesis.*/ /* */ /* Solution: */ /* N=5 [[1,5,4,2,3],[3,2,5,1,4],[2,4,3,5,1],[5,3,1,4,2],[4,1,2,3,5]] */ /*-------------------------------------------------------------------------*/ q:- write('N ?'), read_integer(N), statistics(runtime,_), (qg5(N,A), write(A), nl, write_array(A,'%3d',0), fail ; write('No more solutions'), nl), statistics(runtime,[_,Y]), write('time : '), write(Y), nl. qg5(N,A):- N2 is N*N, fd_set_vector_max(N2), create_array(N,N,A), array_to_list(A,L), fd_domain(L,1,N), diag_cstr(L,1,1,N), for_each_line(A,alldiff), for_each_column(A,alldiff), last(A,LastLine), isomorphic_cstr(LastLine,0), axioms_cstr(1,N,L), fd_labelingff(L). array_to_list([],[]). array_to_list([Line|A],L1):- array_to_list(A,L), append(Line,L,L1). diag_cstr([],_,_,_). diag_cstr([X|L],K,I,N):- (K=1 -> X=I, K1 is K+N, I1 is I+1 ; K1 is K-1, I1=I), diag_cstr(L,K1,I1,N). isomorphic_cstr([],_). isomorphic_cstr([X|L],K):- X #>= K, K1 is K+1, isomorphic_cstr(L,K1). axioms_cstr(I,N,L):- (I=<N -> axioms_cstr1(I,1,N,L), I1 is I+1, axioms_cstr(I1,N,L) ; true). axioms_cstr1(I,J,N,L):- (J=<N -> (I=\=J -> table(L,N,J,I,JI), table(L,N,JI,J,JI_J), table(L,N,JI_J,J,I) ; true), J1 is J+1, axioms_cstr1(I,J1,N,L) ; true). table(L,N,A,B,X):- N*(B-1)+A#=Z, fd_element_var(Z,L,X). array_prog(alldiff,L):- fd_all_different(L). array_prog(writeline,L):- write(L), nl. :- include(array). :- initialization(q). �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/square.pl����������������������������������������������������������������0000644�0044254�0051310�00000010657�10547152503�015631� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : square.pl */ /* Title : perfect square */ /* Original Source: Pascal Van Hentenryck ([VHSD93]) */ /* Adapted by : Gregory Sidebottom (Nicolog) and Daniel Diaz (clp(FD)) */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : June 1994 */ /* */ /* This program solves the perfect square packing problem (SPP): find a way*/ /* to pack all the given squares (i.e. known sizes) into a master rectangle*/ /* so that none overlap and there is no wasted space. */ /* There are 4 instances of the problem (P=3 corresponds to [VSHD93]). */ /* */ /* Solution: */ /* 1 x([ 0, 0,18,22,23,15,15,18,22]) 2 x([ 0,41,42, 0,22,25,25,36,36,22]) */ /* y([ 0,18, 0,14,24,25,18,14,24]) y([ 0,23, 0,25,28, 0,17,17,23,25]) */ /* s([18,15,14,10, 9, 8, 7, 4, 1]) s([25,24,23,22,19,17,11, 6, 5, 3]) */ /* */ /* 3 x([ 0,70,75, 0,79,50 ,0,50,46,27,52,35,59,35,35,50,27,52,46,75,50]) */ /* y([ 0,70,33,50, 0, 0,85,29,88,93,70,65,54,50,82,54,85,63,82,29,63]) */ /* s([50,42,37,35,33,29,27,25,24,19,18,17,16,15,11, 9, 8, 7, 6, 4, 2]) */ /* */ /* 4 x([ 0,111, 0, 56, 81,132, 72, 0,140,142,111,81,111, 38, 38, 56, 58,*/ /* 63,132, 58, 59, 56,140, 58]) */ /* y([ 0,111, 81, 81, 0, 0,136,137, 43, 78, 80,51, 51,155,137,136,161,*/ /* 152, 43,156,152,152, 78,155]) */ /* s([ 81, 64, 56, 55, 51, 43, 39, 38, 35, 33, 31,30, 29, 20, 18, 16, 14,*/ /* 9, 8, 5, 4, 3, 2, 1]) */ /*-------------------------------------------------------------------------*/ q:- write('N ?'), read_integer(N), statistics(runtime,_), square(N,Xs,Ys,Ss), statistics(runtime,[_,Y]), write(x(Xs)), nl, write(y(Ys)), nl, write(s(Ss)), nl, write('time : '), write(Y), nl. problem(1,32,33,[18,15,14,10,9,8,7,4,1]). problem(2,65,47,[25,24,23,22,19,17,11,6,5,3]). problem(3,112,112, [50,42,37,35,33,29,27,25,24,19,18,17,16,15,11,9,8,7,6,4,2]). problem(4,175,175, [81,64,56,55,51,43,39,38,35,33,31,30,29,20,18,16,14,9,8,5,4,3,2,1]). square(P,Xs,Ys,Ss):- gen(P,Xs,Ys,Ss,SX,SY), (SX>=SY -> MaxS=SX ; MaxS=SY), fd_set_vector_max(MaxS), no_overlap(Xs,Ys,Ss), cap(Xs,Ss,SX,SY), cap(Ys,Ss,SY,SX), label(Xs), label(Ys). gen(P,Xs,Ys,Ss,SX,SY):- problem(P,SX,SY,Ss), gen_coords(Ss,Xs,Ys,SX,SY). gen_coords([],[],[],_,_). gen_coords([S|Ss],[X|Xs],[Y|Ys],SX,SY):- X #=< SX-S, Y #=< SY-S, gen_coords(Ss,Xs,Ys,SX,SY). no_overlap([],[],[]). no_overlap([X|Xs],[Y|Ys],[S|Ss]):- no_overlap1(Xs,Ys,Ss,X,Y,S), no_overlap(Xs,Ys,Ss). no_overlap1([],[],[],_,_,_). no_overlap1([X2|Xs],[Y2|Ys],[S2|Ss],X1,Y1,S1):- X1+S1 #=< X2 #\/ X1 #>= X2+S2 #\/ Y1+S1 #=< Y2 #\/ Y1 #>= Y2+S2, no_overlap1(Xs,Ys,Ss,X1,Y1,S1). cap(Xs,Ss,SX,SY):- cap1(0,SX,SY,Xs,Ss). cap1(P,SX,SY,Xs,Ss):- (P < SX -> sum_of_squares_with(Xs,Ss,P,SY), P1 is P+1, cap1(P1,SX,SY,Xs,Ss) ; true). sum_of_squares_with([],[],_,0). sum_of_squares_with([X|Xs],[S|Ss],P,Sum):- point_used_by_square_iff_b(P,X,S,B), Sum #= S*B+Sum1, sum_of_squares_with(Xs,Ss,P,Sum1). % X<=P<X+S <=> B P and S are ground point_used_by_square_iff_b(P,X,S,B):- B #<=> X #=< P #/\ P #< X+S. label([]). label([X|Xs]):- list_min([X|Xs],Min), select_square([X|Xs],Min,Rest), label(Rest). list_min([X|Xs],Min):- fd_min(X,Min1), list_min1(Xs,Min1,Min). list_min1([],M,M). list_min1([X|Xs],M1,M):- fd_min(X,M2), (M1=<M2 -> M3=M1 ; M3=M2), list_min1(Xs,M3,M). select_square([X|Xs],X,Xs). select_square([X|Xs],Min,[X|Rest]):- X#>Min, select_square(Xs,Min,Rest). :- initialization(q). ���������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/bqueens.pl���������������������������������������������������������������0000644�0044254�0051310�00000005364�10547152503�015772� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Boolean) */ /* */ /* Name : bqueens.pl */ /* Title : N-queens problem */ /* Original Source: Daniel Diaz - INRIA France */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : January 1993 */ /* */ /* Put N queens on an NxN chessboard so that there is no couple of queens */ /* threatening each other. */ /* The solution is a list [ [Que11,...,Que1N], ... ,[QueN1,...,QueNN] ] */ /* where Queij is 1 if the the is a queen on the ith line an jth row. */ /* */ /* Solution: */ /* N=4 [[0,0,1,0], [[0,1,0,0], */ /* [1,0,0,0], [0,0,0,1], */ /* [0,0,0,1], and [1,0,0,0], */ /* [0,1,0,0]] [0,0,1,0]] */ /* */ /* N=8 [[0,0,0,0,0,0,0,1], (first solution) */ /* [0,0,0,1,0,0,0,0], */ /* [1,0,0,0,0,0,0,0], */ /* [0,0,1,0,0,0,0,0], */ /* [0,0,0,0,0,1,0,0], */ /* [0,1,0,0,0,0,0,0], */ /* [0,0,0,0,0,0,1,0], */ /* [0,0,0,0,1,0,0,0]] */ /*-------------------------------------------------------------------------*/ q:- write('N ?'), read_integer(N), statistics(runtime,_), (bqueens(N,A), write(A), nl %, % fail ; write('No more solutions'), nl), statistics(runtime,[_,Y]), write('time : '), write(Y), nl. bqueens(N,A):- create_array(N,N,A), for_each_line(A,only1), for_each_column(A,only1), for_each_diagonal(A,N,N,atmost1), !, array_labeling(A). :- include(array). % interface with for_each_... procedures array_prog(only1,L):- fd_only_one(L). array_prog(atmost1,L):- fd_at_most_one(L). :- initialization(q). ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/send.pl������������������������������������������������������������������0000644�0044254�0051310�00000004402�10547152503�015251� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : send.pl */ /* Title : crypt-arithmetic */ /* Original Source: P. Van Hentenryck's book */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : September 1992 */ /* */ /* Solve the operation: */ /* */ /* S E N D */ /* + M O R E */ /* ----------- */ /* = M O N E Y */ /* */ /* (resolution by line) */ /* */ /* Solution: */ /* [S,E,N,D,M,O,R,Y] */ /* [9,5,6,7,1,0,8,2] */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), statistics(runtime,_), send(LD,Lab), statistics(runtime,[_,Y]), write(LD), nl, write('time : '), write(Y), nl. send(LD,Lab):- LD=[S,E,N,D,M,O,R,Y], fd_all_different(LD), fd_domain(LD,0,9), fd_domain([S,M],1,9), 1000*S+100*E+10*N+D + 1000*M+100*O+10*R+E #= 10000*M+1000*O+100*N+10*E+Y, lab(Lab,LD). lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/five.pl������������������������������������������������������������������0000644�0044254�0051310�00000005102�10547152503�015247� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : five.pl */ /* Title : five house puzzle */ /* Original Source: P. Van Hentenryck's book */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : September 1992 */ /* */ /* A logic puzzle */ /* */ /* Solution: */ /* [N1,N2,N3,N4,N5, [3,4,5,2,1, */ /* C1,C2,C3,C4,C5, 5,3,1,2,4, */ /* P1,P2,P3,P4,P5, 5,1,4,2,3, */ /* A1,A2,A3,A4,A5, 4,5,1,3,2, */ /* D1,D2,D3,D4,D5] 4,1,2,5,3] */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), statistics(runtime,_), five_house(L,Lab), statistics(runtime,[_,Y]), write(L), nl, write('time : '), write(Y), nl. five_house(L,Lab):- fd_set_vector_max(5), L=[N1,N2,N3,N4,N5, C1,C2,C3,C4,C5, P1,P2,P3,P4,P5, A1,A2,A3,A4,A5, D1,D2,D3,D4,D5], fd_domain(L,1,5), N5 #= 1, D5 #= 3, fd_all_different([C1,C2,C3,C4,C5]), fd_all_different([P1,P2,P3,P4,P5]), fd_all_different([N1,N2,N3,N4,N5]), fd_all_different([A1,A2,A3,A4,A5]), fd_all_different([D1,D2,D3,D4,D5]), N1 #= C2, N2 #= A1, N3 #= P1, N4 #= D3, P3 #= D1, C1 #= D4, P5 #= A4, P2 #= C3, C1 #= C5+1, plus_or_minus(A3,P4,1), plus_or_minus(A5,P2,1), plus_or_minus(N5,C4,1), % lab(Lab,L). % faster than lab(Lab,[C1,...,D5]) lab(Lab,[C1,C2,C3,C4,C5, P1,P2,P3,P4,P5, N1,N2,N3,N4,N5, A1,A2,A3,A4,A5, D1,D2,D3,D4,D5]). % partial lookahead plus_or_minus(X,Y,C):- X #= Y+C. plus_or_minus(X,Y,C):- X+C #= Y. lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/queens.pl����������������������������������������������������������������0000644�0044254�0051310�00000004224�10547152503�015622� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : queens.pl */ /* Title : N-queens problem */ /* Original Source: P. Van Hentenryck's book */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : January 1993 */ /* */ /* Put N queens on an NxN chessboard so that there is no couple of queens */ /* threatening each other. */ /* */ /* Solution: */ /* N=4 [2,4,1,3] */ /* N=8 [1,5,8,6,3,7,2,4] */ /* N=16 [1,3,5,2,13,9,14,12,15,6,16,7,4,11,8,10] */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), write('N ?'), read_integer(N), statistics(runtime,_), queens(N,L,Lab), statistics(runtime,[_,Y]), write(L), nl, write('time : '), write(Y), nl. queens(N,L,Lab):- fd_set_vector_max(N), length(L,N), fd_domain(L,1,N), safe(L), lab(Lab,L). safe([]). safe([X|L]):- noattack(L,X,1), safe(L). noattack([],_,_). /* % faster than the original PVH's version noattack([Y|L],X,I):- I1 is I+1, noattack(L,X,I1), diff(X,Y,I). */ noattack([Y|L],X,I):- diff(X,Y,I), I1 is I+1, noattack(L,X,I1). diff(X,Y,I):- fd_tell(diff(X,Y,I)). /* diff(X,Y,I):- X#\=Y, X#\=Y+I, X+I#\=Y. */ lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/bdonald.pl���������������������������������������������������������������0000644�0044254�0051310�00000007365�10547152503�015736� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Boolean) */ /* */ /* Name : bdonald.pl */ /* Title : crypt-arithmetic */ /* Original Source: Daniel Diaz - INRIA France */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : January 1993 */ /* */ /* Solve the operation: */ /* */ /* D O N A L D */ /* + G E R A L D */ /* -------------- */ /* = R O B E R T */ /* */ /* (resolution by column) */ /* The digit of each letter is coded in binary on 4 bits (dcb). The order */ /* for labeling is very relevant for efficiency. */ /* */ /* Solution: */ /* [D,O,N,A,L,G,E,R,B,T] */ /* [5,2,6,4,8,1,9,7,3,0] */ /* [[0,1,0,1],[0,0,1,0],[0,1,1,0],[0,1,0,0],[1,0,0,0],[0,0,0,1],[1,0,0,1],*/ /* [0,1,1,1],[0,0,1,1],[0,0,0,0]] */ /* ie: */ /* [5,2,6,4,8,1,9,7,3,0] */ /*-------------------------------------------------------------------------*/ q:- statistics(runtime,_), (bdonald(A), write(A), nl, fail ; write('No more solutions'), nl), statistics(runtime,[_,Y]), write('time : '), write(Y), nl. bdonald(Ar):- Ar=[D,O,N,A,L,G,E,R,B,T], dcb_digit(D), dcb_digit(O), dcb_digit(N), dcb_digit(A), dcb_digit(L), dcb_digit(G), dcb_digit(E), dcb_digit(R), dcb_digit(B), dcb_digit(T), diff0(D), diff0(G), all_dcb_digit_diff(Ar), LC=[C1,C2,C3,C4,C5], dcb_add(0, D,D,T,C1), dcb_add(C1,L,L,R,C2), dcb_add(C2,A,A,E,C3), dcb_add(C3,N,R,B,C4), dcb_add(C4,O,E,O,C5), dcb_add(C5,D,G,R,0), !, array_labeling([D,A,L,O,N,E,G,R,B,T]), fd_labeling(LC). dcb_digit(D):- D=[B3,B2,B1,_], B3 #==> #\ B2 #/\ #\ B1. diff0([B3,B2,B1,B0]):- B3 #\/ B2 #\/ B1 #\/ B0. all_dcb_digit_diff([]). all_dcb_digit_diff([X|L]):- diff_of(L,X), all_dcb_digit_diff(L). diff_of([],_). diff_of([Y|L],X):- dcb_digit_diff(X,Y), diff_of(L,X). dcb_digit_diff([X3,X2,X1,X0],[Y3,Y2,Y1,Y0]):- #\ ((X3 #<=> Y3) #/\ (X2 #<=> Y2) #/\ (X1 #<=> Y1) #/\ (X0 #<=> Y0)). dcb_add(CI,[X3,X2,X1,X0],[Y3,Y2,Y1,Y0],[Z3,Z2,Z1,Z0],CO):- full_add(CI,X0,Y0,Z0,C1), full_add(C1,X1,Y1,I1,C2), full_add(C2,X2,Y2,I2,C3), full_add(C3,X3,Y3,I3,C4), I2 #\/ I1 #<=> I12, I3 #/\ I12 #<=> I123, C4 #\/ I123 #<=> Hex, half_add(I1,Hex,Z1,D2), full_add(D2,I2,Hex,Z2,D3), half_add(D3,I3,Z3,D4), C4 #\/ D4 #<=> CO. full_add(CI,X,Y,Z,CO):- half_add(X,Y,Z1,C1), half_add(CI,Z1,Z,C2), C1 #\/ C2 #<=> CO. half_add(X,Y,Z,CO):- X #/\ Y #<=> CO, X ## Y #<=> Z. :- include(array). % interface with for_each_... procedures array_prog(_,_). :- initialization(q). ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/srq.pl�������������������������������������������������������������������0000644�0044254�0051310�00000013760�10547152503�015134� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) INRIA Rocquencourt - ChLoE Project */ /* */ /* Name : srq.pl */ /* Title : Self-Referential Quiz puzzle */ /* Original Source: M. Henz */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : February 1997 */ /* */ /* */ /* Q1 : the first question whose answer is A is */ /* (A) 4 (B) 3 (C) 2 (D) 1 (E) none of the above */ /* Q2 : the only two consecutive questions with identical answers are */ /* (A) 3 and 4 (B) 4 and 5 (C) 5 and 6 (D) 6 and 7 (E) 7 and 8*/ /* Q3 : the next question with answer A is */ /* (A) 4 (B) 5 (C) 6 (D) 7 (E) 8 */ /* Q4 : the first even numbered question with answer B is */ /* (A) 2 (B) 4 (C) 6 (D) 8 (E) 10 */ /* Q5 : the only odd numbered question with answer C is */ /* (A) 1 (B) 3 (C) 5 (D) 7 (E) 9 */ /* Q6 : a question with answer D */ /* (A) comes before this one but not after this one */ /* (B) comes after this one but not before this one */ /* (C) comes before and after this one */ /* (D) does not occur at all */ /* (E) none of the above */ /* Q7 : the last question whose answer is E is */ /* (A) 5 (B) 6 (C) 7 (D) 8 (E) 9 */ /* Q8 : the number of questions whose answers are conconants is */ /* (A) 7 (B) 6 (C) 5 (D) 4 (E) 3 */ /* Q9 : the number of questions whose answers are vowels is */ /* (A) 0 (B) 1 (C) 2 (D) 3 (E) 4 */ /* Q10: the answer of this question is */ /* (A) A (B) B (C) C (D) D (E) E */ /* */ /* Solution: */ /* [3,1,2,2,1,2,5,2,5,4] */ /* C,A,B,B,A,B,E,B,E,D */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), statistics(runtime,_), srq(L,Lab), statistics(runtime,[_,Y]), write(L), nl, write('time : '), write(Y), nl. srq(L,Lab):- L=[Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9,Q10], fd_domain(L,1,5), Q1#=1 #<=> Q4#=1 #/\ Q1#\=1 #/\ Q2#\=1 #/\ Q3#\=1, Q1#=2 #<=> Q3#=1 #/\ Q1#\=1 #/\ Q2#\=1, Q1#=3 #<=> Q2#=1 #/\ Q1#\=1, Q1#=4 #<=> Q1#=1, % Q1#=5 #<=> Q1#\=1 #/\ Q2#\=1 #/\ Q3#\=1 #/\ Q4#\=1, Q2#=1 #<=> Q3#=Q4, Q2#=2 #<=> Q4#=Q5, Q2#=3 #<=> Q5#=Q6, Q2#=4 #<=> Q6#=Q7, Q2#=5 #<=> Q7#=Q8, Q3#=1 #<=> Q4#=1, Q3#=2 #<=> Q5#=1 #/\ Q4#\=1, Q3#=3 #<=> Q6#=1 #/\ Q4#\=1 #/\ Q5#\=1, Q3#=4 #<=> Q7#=1 #/\ Q4#\=1 #/\ Q5#\=1 #/\ Q6#\=1, Q3#=5 #<=> Q8#=1 #/\ Q4#\=1 #/\ Q5#\=1 #/\ Q6#\=1 #/\ Q7#\=1, Q4#=1 #<=> Q2#=2, Q4#=2 #<=> Q4#=2 #/\ Q2#\=2, Q4#=3 #<=> Q6#=2 #/\ Q2#\=2 #/\ Q4#\=2, Q4#=4 #<=> Q8#=2 #/\ Q2#\=2 #/\ Q4#\=2 #/\ Q6#\=2, Q4#=5 #<=>Q10#=2 #/\ Q2#\=2 #/\ Q4#\=2 #/\ Q6#\=2 #/\ Q8#\=2, Q5#=1 #<=> Q1#=3 #/\ Q3#\=3 #/\ Q5#\=3 #/\ Q7#\=3 #/\ Q9#\=3, Q5#=2 #<=> Q3#=3 #/\ Q1#\=3 #/\ Q5#\=3 #/\ Q7#\=3 #/\ Q9#\=3, Q5#=3 #<=> Q5#=3 #/\ Q1#\=3 #/\ Q3#\=3 #/\ Q7#\=3 #/\ Q9#\=3, Q5#=4 #<=> Q7#=3 #/\ Q1#\=3 #/\ Q2#\=3 #/\ Q5#\=3 #/\ Q9#\=3, Q5#=5 #<=> Q9#=3 #/\ Q1#\=3 #/\ Q3#\=3 #/\ Q5#\=3 #/\ Q7#\=3, BeforeQ4 #<=> Q1#=4 #\/ Q2#=4 #\/ Q3#=4 #\/ Q4#=4 #\/ Q5#=4, AfterQ4 #<=> Q7#=4 #\/ Q8#=4 #\/ Q9#=4 #\/ Q10#=4, Q6#=1 #<=> BeforeQ4 #/\ #\ AfterQ4, Q6#=2 #<=> #\ BeforeQ4 #/\ AfterQ4, Q6#=3 #<=> BeforeQ4 #/\ AfterQ4, Q6#=4 #<=> Q1#\=4 #/\ Q2#\=4 #/\ Q3#\=4 #/\ Q4#\=4 #/\ Q5#\=4 #/\ Q6#\=4 #/\ Q7#\=4 #/\ Q8#\=4 #/\ Q9#\=4 #/\ Q10#\=4, % Q6#=5 #<=> Q6#=4, Q7#=1 #<=> Q5#=5 #/\ Q6#\=5 #/\ Q7#\=5 #/\ Q8#\=5 #/\ Q9#\=5 #/\ Q10#\=5, Q7#=2 #<=> Q6#=5 #/\ Q7#\=5 #/\ Q8#\=5 #/\ Q9#\=5 #/\ Q10#\=5, Q7#=3 #<=> Q7#=5 #/\ Q8#\=5 #/\ Q9#\=5 #/\ Q10#\=5, Q7#=4 #<=> Q8#=5 #/\ Q9#\=5 #/\ Q10#\=5, Q7#=5 #<=> Q9#=5 #/\ Q10#\=5, BCD1 #<=> Q1 #>= 2 #/\ Q1 #=< 4, AE1 #<=> #\ BCD1, BCD2 #<=> Q2 #>= 2 #/\ Q2 #=< 4, AE2 #<=> #\ BCD2, BCD3 #<=> Q3 #>= 2 #/\ Q3 #=< 4, AE3 #<=> #\ BCD3, BCD4 #<=> Q4 #>= 2 #/\ Q4 #=< 4, AE4 #<=> #\ BCD4, BCD5 #<=> Q5 #>= 2 #/\ Q5 #=< 4, AE5 #<=> #\ BCD5, BCD6 #<=> Q6 #>= 2 #/\ Q6 #=< 4, AE6 #<=> #\ BCD6, BCD7 #<=> Q7 #>= 2 #/\ Q7 #=< 4, AE7 #<=> #\ BCD7, BCD8 #<=> Q8 #>= 2 #/\ Q8 #=< 4, AE8 #<=> #\ BCD8, BCD9 #<=> Q9 #>= 2 #/\ Q9 #=< 4, AE9 #<=> #\ BCD9, BCD10#<=> Q10 #>= 2 #/\ Q10 #=< 4, AE10 #<=> #\ BCD10, BCD#=BCD1+BCD2+BCD3+BCD4+BCD5+BCD6+BCD7+BCD8+BCD9+BCD10, AE#=AE1+AE2+AE3+AE4+AE5+AE6+AE7+AE8+AE9+AE10, Q8#=1 #<=> BCD#=7, Q8#=2 #<=> BCD#=6, Q8#=3 #<=> BCD#=5, Q8#=4 #<=> BCD#=4, Q8#=5 #<=> BCD#=3, Q9#=1 #<=> AE#=0, Q9#=2 #<=> AE#=1, Q9#=3 #<=> AE#=2, Q9#=4 #<=> AE#=3, Q9#=5 #<=> AE#=4, lab(Lab,L). lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). ����������������./gprolog-1.3.0/ExamplesFD/array.pl�����������������������������������������������������������������0000644�0044254�0051310�00000007023�10547152503�015440� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� /* Array procedures */ /*---------------------------------------------------------*/ /* */ /* An array NL x NC elements is represented as follows : */ /* A = [L_1, ..., L_NL] with L_i = [X_i_1, ..., X_i_NC] */ /* Hence : */ /* A = [ [X_1_1,..., X_1_NC], ..., [X_NL_1,..., X_NL_NC] ] */ /*---------------------------------------------------------*/ % create_array(NL,NC,A) % NL: nb of lines NC:nb of columns A:array % creates an array (with unbound variables) create_array(NL,NC,A):- create_array1(0,NL,NC,A), !. create_array1(NL,NL,_,[]). create_array1(I,NL,NC,[L|A]):- create_one_line(0,NC,L), I1 is I+1, create_array1(I1,NL,NC,A). create_one_line(NC,NC,[]). create_one_line(J,NC,[_|L]):- J1 is J+1, create_one_line(J1,NC,L). array_elem(A,I,J,X):- nth(I,A,L), nth(J,L,X). array_values([],[]). array_values([L|A],Values):- array_values(A,V), append(L,V,Values). % for_each_line(A,P) % A:array P: program atom % calls: array_prog(P,L) for each line L (L is a list) for_each_line([],_). for_each_line([L|A],P):- array_prog(P,L), for_each_line(A,P). % for_each_column(A,P) % A:array P: program atom % calls: array_prog(P,L) for each column L (L is a list) for_each_column([[]|_],_):- !. for_each_column(A,P):- create_column(A,C,A1), array_prog(P,C), for_each_column(A1,P). create_column([],[],[]). create_column([[X|L]|A],[X|C],[L|A1]):- create_column(A,C,A1). % for_each_diagonal(A,NL,NC,P) % A:array NL: nb of lines % NC:nb of columns P: program atom % calls: array_prog(P,D) for each diagonal D (D is a list) for_each_diagonal(A,NL,NC,P):- NbDiag is 2*(NL+NC-1), % numbered from 0 to NbDiag-1 create_lst_diagonal(0,NbDiag,LD), fill_lst_diagonal(A,0,NL,NC,LD,LD1), !, for_each_line(LD1,P). create_lst_diagonal(NbDiag,NbDiag,[]). create_lst_diagonal(I,NbDiag,[[]|LD]):- I1 is I+1, create_lst_diagonal(I1,NbDiag,LD). fill_lst_diagonal([],_,_,_,LD,LD). fill_lst_diagonal([L|A],I,NL,NC,LD,LD2):- I1 is I+1, fill_lst_diagonal(A,I1,NL,NC,LD,LD1), one_list(L,I,NL,0,NC,LD1,LD2). one_list([],_,_,_,_,LD,LD). one_list([X|L],I,NL,J,NC,LD,LD3):- J1 is J+1, one_list(L,I,NL,J1,NC,LD,LD1), NoDiag1 is I+J, NoDiag2 is I+NC-J+NL+NC-2, add_in_lst_diagonal(0,NoDiag1,X,LD1,LD2), add_in_lst_diagonal(0,NoDiag2,X,LD2,LD3). add_in_lst_diagonal(NoDiag,NoDiag,X,[D|LD],[[X|D]|LD]). add_in_lst_diagonal(K,NoDiag,X,[D|LD],[D|LD1]):- K1 is K+1, add_in_lst_diagonal(K1,NoDiag,X,LD,LD1). % for_each_big_diagonal(A,N,P) % A:array N: nb of lines/columns (must be a square) % P: program atom % calls: array_prog(P,D) for each diagonal D (D is a list) for_each_big_diagonal(A,N,P):- big_diags(A,0,N,D1,D2), array_prog(P,D1), array_prog(P,D2). big_diags([],_,_,[],[]). big_diags([L|A],I,J,[X|D1],[Y|D2]):- I1 is I+1, J1 is J-1, nth(I1,L,X), nth(J,L,Y), big_diags(A,I1,J1,D1,D2). % write_array(A,Format,Sep) % A:array Format: format for element writing % Sep: nb of spaces between 2 elements of a line write_array([],_,_). write_array([L|A],Format,Sep):- write_array_line(L,Format,Sep), nl, write_array(A,Format,Sep). write_array_line([],_,_). write_array_line([X|L],Format,Sep):- format(Format,[X]), tab(Sep), write_array_line(L,Format,Sep). % array_labeling(A) % A:array array_labeling([]). array_labeling([L|A]):- fd_labeling(L), array_labeling(A). �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/partit.pl����������������������������������������������������������������0000644�0044254�0051310�00000012454�10547152503�015631� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : partit.pl */ /* Title : integer partitionning */ /* Original Source: Daniel Diaz - INRIA France */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : September 1993 (modified March 1997) */ /* */ /* Partition numbers 1,2,...,N into two groups A and B such that: */ /* a) A and B have the same length, */ /* b) sum of numbers in A = sum of numbers in B, */ /* c) sum of squares of numbers in A = sum of squares of numbers in B. */ /* */ /* This problem admits a solution if N is a multiple of 8. */ /* */ /* Note: finding a partition of 1,2...,N into 2 groups A and B such that: */ /* */ /* Sum (k^p) = Sum l^p */ /* k in A l in B */ /* */ /* admits a solution if N mod 2^(p+1) = 0 (N is a multiple of 2^(p+1)). */ /* Condition a) is a special case where p=0, b) where p=1 and c) where p=2.*/ /* */ /* Two redundant constraints are used: */ /* */ /* - in order to avoid duplicate solutions (permutations) we impose */ /* A1<A2<....<AN/2, B1<B2<...<BN/2 and A1<B1. This achieves much more */ /* pruning than only fd_all_differents(A) and fd_all_differents(B). */ /* */ /* - the half sums are known */ /* N */ /* Sum k^1 = Sum l^1 = (Sum i) / 2 = N*(N+1) / 4 */ /* k in A l in B i=1 */ /* N */ /* Sum k^2 = Sum l^2 = (Sum i^2)/2 = N*(N+1)*(2*N+1) / 12 */ /* k in A l in B i=1 */ /* */ /* Solution: */ /* N=8 A=[1,4,6,7] */ /* B=[2,3,5,8] */ /* */ /* N=16 A=[1,3,6,8,10,12,13,15] */ /* B=[2,4,5,7,9,11,14,16] */ /* */ /* N=24 A=[1,2,6,8,10,12,15,16,17,19,21,23] */ /* B=[3,4,5,7,9, 11,13,14,18,20,22,24] */ /* */ /* N=32 A=[1,2,3,7,13,14,15,16,18,19,21,23,25,27,29,31] */ /* B=[4,5,6,8, 9,10,11,12,17,20,22,24,26,28,30,32] */ /* */ /* N=40 A=[1,2,3,4,12,15,16,18,19,20,21,23,25,27,29,31,33,35,37,39] */ /* B=[5,6,7,8, 9,10,11,13,14,17,22,24,26,28,30,32,34,36,38,40] */ /*-------------------------------------------------------------------------*/ q:- write('N ?'), read_integer(N), statistics(runtime,_), partit(N,A,B), statistics(runtime,[_,Y]), write(sol(A,B)), nl, write('time : '), write(Y), nl. partit(N,A,B):- fd_set_vector_max(N), N2 is N//2, length(A,N2), fd_domain(A,1,N), length(B,N2), fd_domain(B,1,N), merge_and_reverse(A,B,[],L), % best order for label fd_all_different(L), no_duplicate(A,B), % redundant constraint 1 half_sums(N,HS1,HS2), % redundant constraint 2 sums(A,HS1,HS2), sums(B,HS1,HS2), fd_labeling(L,[value_method(max)]). % best value heuristics merge_and_reverse([],_,Acc,Acc). merge_and_reverse([X1|L1],[X2|L2],Acc,L):- merge_and_reverse(L1,L2,[X2,X1|Acc],L). sums([],0,0). sums([X|L],S1,S2):- sums(L,T1,T2), X**2#=X2, S1#=X+T1, S2#=X2+T2. no_duplicate(A,B):- ascending_order(A), ascending_order(B), A=[X1|_], B=[X2|_], X2 #> X1. ascending_order([X|L]):- ascending_order(L,X). ascending_order([],_). ascending_order([Y|L],X):- Y #> X, ascending_order(L,Y). half_sums(N,HS1,HS2):- S1 is N*(N+1)//2, S2 is S1*(2*N+1)//3, HS1 is S1//2, HS2 is S2//2. :- initialization(q). ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/alpha.pl�����������������������������������������������������������������0000644�0044254�0051310�00000006037�10547152503�015413� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : alpha.pl */ /* Title : alphacipher */ /* Original Source: Daniel Diaz - INRIA France */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : January 1993 */ /* */ /* This problem comes from the news group rec.puzzle. */ /* The numbers 1 - 26 have been randomly assigned to the letters of the */ /* alphabet. The numbers beside each word are the total of the values */ /* assigned to the letters in the word. e.g for LYRE L,Y,R,E might equal */ /* 5,9,20 and 13 respectively or any other combination that add up to 47. */ /* Find the value of each letter under the equations: */ /* */ /* BALLET 45 GLEE 66 POLKA 59 SONG 61 */ /* CELLO 43 JAZZ 58 QUARTET 50 SOPRANO 82 */ /* CONCERT 74 LYRE 47 SAXOPHONE 134 THEME 72 */ /* FLUTE 30 OBOE 53 SCALE 51 VIOLIN 100 */ /* FUGUE 50 OPERA 65 SOLO 37 WALTZ 34 */ /* */ /* Solution: */ /* [A, B,C, D, E,F, G, H, I, J, K,L,M, N, O, P,Q, R, S,T,U, V,W, X, Y, Z] */ /* [5,13,9,16,20,4,24,21,25,17,23,2,8,12,10,19,7,11,15,3,1,26,6,22,14,18] */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), statistics(runtime,_), alpha(LD,Lab), statistics(runtime,[_,Y]), write(LD), nl, write('time : '), write(Y), nl. alpha(LD,Lab):- fd_set_vector_max(26), LD=[A,B,C,_D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z], fd_all_different(LD), fd_domain(LD,1,26), B+A+L+L+E+T #= 45, C+E+L+L+O #= 43, C+O+N+C+E+R+T #= 74, F+L+U+T+E #= 30, F+U+G+U+E #= 50, G+L+E+E #= 66, J+A+Z+Z #= 58, L+Y+R+E #= 47, O+B+O+E #= 53, O+P+E+R+A #= 65, P+O+L+K+A #= 59, Q+U+A+R+T+E+T #= 50, S+A+X+O+P+H+O+N+E #= 134, S+C+A+L+E #= 51, S+O+L+O #= 37, S+O+N+G #= 61, S+O+P+R+A+N+O #= 82, T+H+E+M+E #= 72, V+I+O+L+I+N #= 100, W+A+L+T+Z #= 34, lab(Lab,LD). lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/bschur.pl����������������������������������������������������������������0000644�0044254�0051310�00000004740�10547152503�015613� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Boolean) */ /* */ /* Name : bschur.pl */ /* Title : Schur's lemma */ /* Original Source: Giovanna Dore - Italy */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : January 1993 */ /* */ /* Color the integers 1,2...,N with 3 colors so that there is no monochrome*/ /* triplets (x,y,z) where x+y=z. Solution iff N<=13. */ /* The solution is a list [ [Int11,Int12,Int13],..., [IntN1,IntN2,IntN3] ] */ /* where Intij is 1 if the integer i is colored with the color j. */ /* */ /* Solution: */ /* N=4 [[0,0,1],[0,1,0],[0,0,1],[1,0,0]] */ /* [[0,0,1],[0,1,0],[0,1,0],[0,0,1]] */ /* ... */ /* N=13 [[0,0,1],[0,1,0],[0,1,0],[0,0,1],[1,0,0],[1,0,0],[0,0,1],[1,0,0], */ /* [1,0,0],[0,0,1],[0,1,0],[0,1,0],[0,0,1]] (first solution) */ /*-------------------------------------------------------------------------*/ q:- write('N ?'), read_integer(N), statistics(runtime,_), (schur(N,A), write(A), nl, fail ; write('No more solutions'), nl), statistics(runtime,[_,Y]), write('time : '), write(Y), nl. schur(N,A):- create_array(N,3,A), for_each_line(A,only1), pair_constraints(A,A), !, array_labeling(A). pair_constraints([],_):- !. pair_constraints([_],_):- !. pair_constraints([_,[K1,K2,K3]|A2],[[I1,I2,I3]|A1]):- #\ (I1 #/\ K1), #\ (I2 #/\ K2), #\ (I3 #/\ K3), triplet_constraints(A2,A1,[I1,I2,I3]), pair_constraints(A2,A1). triplet_constraints([],_,_). triplet_constraints([[K1,K2,K3]|A2],[[J1,J2,J3]|A1],[I1,I2,I3]):- #\ (I1 #/\ J1 #/\ K1), #\ (I2 #/\ J2 #/\ K2), #\ (I3 #/\ J3 #/\ K3), triplet_constraints(A2,A1,[I1,I2,I3]). :- include(array). % interface with for_each_... procedures array_prog(only1,L):- fd_only_one(L). :- initialization(q). ��������������������������������./gprolog-1.3.0/ExamplesFD/magsq.pl�����������������������������������������������������������������0000644�0044254�0051310�00000004613�10547152503�015434� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : magsq.pl */ /* Title : Magic square problem */ /* Original Source: Daniel Diaz - INRIA France */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : July 1998 */ /* */ /* Fill square NxN with integers 1,2...N*N so that each line, each column */ /* and each diagonal has the same sum. */ /* threatening each other. */ /* */ /* Solution: */ /* N=3 [[4,9,2],[3,5,7],[8,1,6]] */ /*-------------------------------------------------------------------------*/ q:- write('N ?'), read_integer(N), statistics(runtime,_), magsq(N,A), statistics(runtime,[_,Y]), write(A), nl, write_array(A,'%5d',0), write('time : '), write(Y), nl. magsq(N,A):- create_array(N,N,A), N2 is N*N, fd_set_vector_max(N2), S is N*(N2+1) // 2, g_assign(s,S), g_assign(n,N), g_assign(n2,N2), array_values(A,Values), fd_all_different(Values), for_each_line(A,dom), for_each_line(A,sum), for_each_column(A,sum), for_each_big_diagonal(A,N,sum), array_elem(A,1,1,X11), array_elem(A,1,N,X1N), array_elem(A,N,1,XN1), array_elem(A,N,N,XNN), X11 #< X1N, X11 #< XN1, X11 #< XNN, XN1 #> X1N, for_each_big_diagonal(A,N,lab), % for_each_line(A,lab). fd_labeling(Values,[variable_method(ff),value_method(max)]). array_prog(dom,L):- g_read(n2,N2), fd_domain(L,1,N2). array_prog(sum,L):- g_read(s,S), sum(L,S). array_prog(lab,L):- fd_labeling(L,[value_method(middle)]). /* reorder(L,L1):- g_read(n,N), fd_domain(X,1,N), findall(V,(fd_labeling(X,[value_method(middle)]),nth(X,L,V)),L1). */ sum([],0). sum([X|Xs],S):- S #= X+S1, sum(Xs,S1). :- include(array). :- initialization(q). ���������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/gardner.pl���������������������������������������������������������������0000644�0044254�0051310�00000011432�10547152503�015743� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*-------------------------------------------------------------------------*/ /* Benchmark (Finite Domain) */ /* */ /* Name : gardner.pl */ /* Title : Gardner's prime puzzle problem */ /* Original Source: Daniel Diaz - INRIA France */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : February 1997 */ /* */ /* Solve the operation: */ /* */ /* mP where tP is a string of t prime digits (2,3,5 or 7) */ /* x nP */ /* -------- */ /* = (m+n)P */ /* */ /* Solution: */ /* */ /* M=1 N=1 */ /* [5,5,25] */ /* [5,7,35] */ /* [7,5,35] */ /* */ /* M=4 N=3 */ /* [3235,735,2377725] */ /* [3323,775,2575325] */ /* [3535,773,2732555] */ /* [3553,775,2753575] */ /* [3555,725,2577375] */ /* [3575,777,2777775] */ /* [3735,733,2737755] */ /* [3755,725,2722375] */ /* [5225,527,2753575] */ /* [7225,727,5252575] */ /* [7253,325,2357225] */ /* [7255,355,2575525] */ /* [7273,375,2727375] */ /* [7275,733,5332575] */ /* [7325,373,2732225] */ /* [7325,727,5325275] */ /* [7335,753,5523255] */ /* [7353,375,2757375] */ /* [7355,725,5332375] */ /* [7375,753,5553375] */ /* [7533,335,2523555] */ /* [7575,337,2552775] */ /* [7735,333,2575755] */ /* [7757,355,2753735] */ /* [7777,325,2527525] */ /*-------------------------------------------------------------------------*/ q:- get_fd_labeling(Lab), write('M ?'), read_integer(M), write('N ?'), read_integer(N), statistics(runtime,_), (gardner(M,N,L,Lab), write(L), nl, fail ; true), statistics(runtime,[_,Y]), write('time : '), write(Y), nl. gardner(M,N,L,Lab):- MN is M+N, length(LX,M), length(LY,N), length(LZ,MN), prim(LX), prim(LY), prim(LZ), nb(LX,X), nb(LY,Y), nb(LZ,Z), X*Y #= Z, L=[X,Y,Z], append(LX,LY,LXY), append(LXY,LZ,LXYZ), lab(Lab,LXYZ). prim([]). prim([X|L]):- fd_domain(X,[2,3,5,7]), prim(L). nb(LX,X):- nb(LX,1,_,X). nb([],I,I,0). nb([X|L],I,I2,N):- nb(L,I,I1,N1), I2 is I1*10, I1*X+N1 #= N. lab(normal,L):- fd_labeling(L). lab(ff,L):- fd_labelingff(L). get_fd_labeling(Lab):- argument_counter(C), get_labeling1(C,Lab). get_labeling1(1,normal). get_labeling1(2,Lab):- argument_value(1,Lab). :- initialization(q). ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/ExamplesFD/queens_fd.fd�������������������������������������������������������������0000644�0044254�0051310�00000000155�10547152503�016250� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������diff(fdv X,fdv Y,int I) { start X in ~{val(Y),val(Y)+I,val(Y)-I} start Y in ~{val(X),val(X)+I,val(X)-I} } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/COPYING�����������������������������������������������������������������������������0000644�0044254�0051310�00000043133�10253321054�013023� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. <signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������./gprolog-1.3.0/README������������������������������������������������������������������������������0000644�0044254�0051310�00000012665�10542206113�012655� 0����������������������������������������������������������������������������������������������������ustar �diaz����������������������������loco������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� GNU PROLOG ========== by Daniel Diaz Daniel.Diaz@inria.fr INTRODUCTION ************ GNU Prolog is a native Prolog compiler with constraint solving over finite domains (FD) developed by Daniel Diaz (http://loco.inria.fr/~diaz). Last information can be found at http://www.gnu.org/software/prolog or better at http://www.gprolog.org. A lot of work has been devoted to the ISO compatibility. GNU Prolog is very close to the ISO standard (http://www.logic-programming.org/prolog_std.html). Here are some features of GNU Prolog: Prolog system: - conforms to the ISO standard for Prolog (integer/floating arithmetic, streams, dynamic code, exceptions). - clause indexing. - a lot of extensions: global variables, definite clause grammars (DCG), sockets interface, operating system interface,... - more than 300 Prolog built-in predicates. - Prolog debugger and a low-level WAM debugger. - line editing facility under the interactive interpreter with completion on atoms. - powerful bidirectional interface between Prolog and C. Compiler: - native-code compiler producing stand alone executables. - simple command-line compiler accepting a wide variety of files: Prolog files, C files, WAM files,... - direct generation of assembly code 15 times faster than wamcc + gcc. - most of unused built-in predicates are not linked (to reduce the size of the executables). - compiled predicates (native-code) as fast as wamcc on average. - consulted predicates (byte-code) 5 times faster than wamcc. Constraint solver: - FD variables well integrated into the Prolog environment (full compatibility with Prolog variables and - integers). No need for explicit FD declarations. - very efficient FD solver (comparable to commercial solvers). - high-level constraints can be described in terms of simple primitives. - a lot of predefined constraints: arithmetic constraints, boolean constraints, symbolic constraints, reified constraints,... - several predefined enumeration heuristics. - the user can define his own new constraints. - more than 50 FD built-in constraints/predicates. PORTS ***** GNU Prolog is currently ported to the following architectures: - ix86 / GNU/Linux - ix86 / Win32 using Cygwin (see file src/WINDOWS) - ix86 / Win32 using MinGW (see file src/WINDOWS) - ix86 / Win32 using MSVC++ (see file src/WINDOWS) - ix86 / SCO - ix86 / Solaris - ix86 / FreeBSD - ix86 / OpenBSD - ix86 / NetBSD - ix86 / Darwin (Mac OS X) - x86_64 / GNU/Linux - PowerPC / GNU/Linux - PowerPC / Darwin (Mac OS X) - PowerPC / NetBSD - sparc / SunOS (4.1.3 or higher) - sparc / Solaris - sparc / NetBSD - alpha / GNU/Linux - alpha / OSF1 - mips / irix INSTALLATION ************ Please refer to the INSTALL file (in the same directory) USING GNU PROLOG **************** Be sure that adequate environment variables are set (see INSTALL) You can then invoke the top-level using: gprolog and the compiler using: gplc FILE The simpliest way to compile a Prolog file 'prog.pl' is then: gplc prog.pl which will produce the executable called prog (use gplc --help to have a brief overview of available options). Refer to the documentation for more information (see below). WINDOWS ******* In Microsoft Windows if you intend to use the gplc compiler as described in the documentation you need to ascertain the following conditions are met: - for the port compiled with MS Visual C++ (tested with version 6.0 and Visual C++ 2005 Express Edition) you'll need to have MinGW as.exe (renamed as mingw-as.exe) installed and the cl.exe compiler (used mainly as linker by GNU Prolog) available in your session path (alternatively link.exe is used). - for the ports compiled either with MinGW or Cygwin, the gcc toolchain must be installed and available in your session path. Observing these needs you'll also will be able to do the mixed language programming, as the examples included in the ExamplesC directory. However you'll need to write your own Makefile as the one provided is for gplc calling 'gcc' and the options passed by GNU Prolog will not work (see file ExamplesC/README). DOCUMENTATION ************* The directory doc contains various versions of the manual. Refer to the file doc/README for more information. An in-line HTML version can be accessed from the GNU Prolog web page. WEB *** The GNU Prolog web site is: http://www.gnu.org/software/prolog/ or also (primary web site): http://www.gprolog.org/ MAILING LIST ************ To communicate with other GNU Prolog users and/or implementors send a mail to users-prolog@gnu.org. To (un)subscribe to this mailing list send a mail to users-prolog-request@gnu.org with (un)subscribe in the subject line. BUGS **** Please report bugs to bug-prolog@gnu.org. To (un)subscribe to this mailing list send a mail to bug-prolog-request@gnu.org with (un)subscribe in the subject line. COPYING ******* Because the basic GNU Prolog libraries are released under the GNU General Public License (GNU GPL), any program recommended for use with them must be free software and released under a GPL-compatible free software license, so that the combination can be (as a whole) under the GNU GPL as well. For a list of some GPL-compatible free software licenses, see http://www.gnu.org/philosophy/license-list.html. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������